home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 266.img / PBM-CMN2.ZIP / AFFICGA.INC < prev    next >
Text File  |  1990-06-07  |  39KB  |  1,010 lines

  1. ;************************************************
  2. ;* PINBALL 1990 (C) JOUBERT ALAIN pour LORICIEL *
  3. ;* fichier d'inclusion des routines d'affichage *
  4. ;* en mode CGA pour GEREAFFI.ASM                *
  5. ;************************************************
  6.  
  7. AFFICHE_BALLE_CGA  MACRO                         ; affiche la balle en mode CGA
  8. local Balle_Mobile,LignDest_Impair,LignDest_Pair ; ----------------------------
  9. local Suite,Ligne_Suivante,Mot_Suivant,Fin
  10.  
  11.          SAUVE_FOND_CGA
  12.  
  13.          mov       ax,SEG DONNEES
  14.          mov       ds,ax                         ; on initialise le segment de données
  15.  
  16.          mov       si,OFFSET Struct_Balle        ; ds:si pointe sur l'adresse de Struct_Balle
  17.  
  18.          cmp       [si].BallImmo,OUI             ; la balle est-elle immobile ?
  19.          jne       Balle_Mobile                  ; non
  20.  
  21.          add       sp,2                          ; adresse mémoire graphique empilée dans SAUVE_FOND_CGA non dépilée
  22.  
  23.          jmp       Fin
  24.  
  25. Balle_Mobile:
  26.  
  27.          mov       di,[si].AdAfBall              ; es:di pointe sur l'adresse d'affichage
  28.  
  29.          mov       si,[si].AdSpBall              ; adresse du sprite de la balle dans si
  30.  
  31.          lds       ax,__Balle_Buffer             ; ds:ax pointe sur l'adresse de __Balle_Buffer
  32.  
  33.          add       si,ax                         ; ds:si pointe sur l'adresse du 1er octet à afficher
  34.  
  35.          xor       dh,dh                         ; on initialise le compteur de lignes
  36.  
  37.          pop       bp                            ; on récupère l'adresse mémoire graphique sauvegardée dans SAUVE_BALLE_CGA
  38.  
  39. Ligne_Suivante:
  40.  
  41.          cmp       dh,ch                         ; y a t-il une ligne à afficher ?
  42.          je        Fin                           ; non
  43.  
  44.          inc       dh                            ; oui, ligne suivante
  45.  
  46.          xor       bp,bx
  47.          mov       es,bp                         ; es pointe alternativement la mémoire graphique paire et impaire
  48.  
  49. Mot_Suivant:
  50.  
  51.          mov       ax,[si+192]                   ; mot masque
  52.          and       es:[di],ax                    ; et logique entre le mot masque et l'emplacement à l'écran
  53.          mov       ax,[si]                       ; mot sprite
  54.          or        es:[di],ax                    ; ou logique entre le mot sprite et l'emplacement à l'écran
  55.  
  56.          mov       ax,[si+194]                   ; mot masque
  57.          and       es:[di+2],ax                  ; et logique entre le mot masque et l'emplacement à l'écran
  58.          mov       ax,[si+2]                     ; mot sprite
  59.          or        es:[di+2],ax                  ; ou logique entre le mot sprite et l'emplacement à l'écran
  60.  
  61.          add       si,16                         ; ligne source suivante
  62.  
  63.          test      dh,1
  64.          jnz       Ligne_Suivante                ; ligne suivante si balayage impair
  65.  
  66.          add       di,80                         ; on pointe sur le début de la ligne suivante de l'écran
  67.  
  68.          jmp       short Ligne_Suivante
  69.  
  70. Fin:
  71.  
  72. ENDM
  73.  
  74. ;----------------------------
  75.  
  76. AFFICHE_BISEAU_CGA MACRO                         ; affiche la porte métallique de sortie de rampe de lancement en mode CGA
  77. local Ligne_Suivante,Fin                         ; -----------------------------------------------------------------------
  78.  
  79.          mov       ax,SEG DONNEES
  80.          mov       ds,ax                         ; on initialise le segment de données
  81.  
  82.          mov       si,OFFSET Struct_Balle        ; ds:si pointe sur l'adresse de Struct_Balle
  83.  
  84.          cmp       [si].DansRamp,OUI             ; la balle est-elle dans la rampe de lancement ?
  85.          jne       Fin                           ; non
  86.  
  87.          mov       di,OFFSET TabPorMe            ; ds:di pointe sur l'adresse de TabPorMe
  88.  
  89.          mov       bx,__NoFlipper
  90.          shl       bx,1                          ; table de mots
  91.  
  92.          mov       ax,[di+bx]                    ; ordonnée inférieure du biseau
  93.  
  94.          cmp       [si].CYB,ax                   ; la balle heurte t-elle la porte métallique ?
  95.          jg        Fin                           ; non
  96.  
  97.          lds       si,__FlipTrav_Buffer          ; ds:si pointe sur l'adresse de __Fliptrav_Buffer
  98.  
  99.          sub       ax,15                         ; ordonnée supérieure du biseau
  100.  
  101.          shl       ax,1                          ;┐
  102.          shl       ax,1                          ;│
  103.          shl       ax,1                          ;│
  104.                                                  ;│
  105.          mov       bx,ax                         ;│
  106.                                                  ;│
  107.          shl       bx,1                          ;│
  108.          shl       bx,1                          ;│
  109.                                                  ;│
  110.          add       ax,bx                         ;┘ ordonnée (en octets) supérieure du biseau * 40
  111.  
  112.          mov       di,ax
  113.          add       di,54                         ; es:di pointe sur l'adresse d'affichage
  114.  
  115.          shl       ax,1                          ; ordonnée (en octets) supérieure du biseau * 80
  116.  
  117.          add       si,ax
  118.          add       si,54                         ; ds:si pointe sur le 1er mot à afficher
  119.  
  120.          mov       bp,GRAPH_IMPAIR               ; adresse mémoire graphique lignes impaires
  121.  
  122.          mov       cx,4                          ; on initialise le compteur de mots
  123.  
  124.          xor       dh,dh                         ; on initialise le compteur de lignes
  125.  
  126.          xor       bx,bx                         ; mise à zéro de l'index de recherche dans la table de masque
  127.  
  128. Ligne_Suivante:
  129.  
  130.          cmp       dh,16                         ; y a t-il une ligne à afficher ?
  131.          je        Fin                           ; non
  132.  
  133.          inc       dh                            ; oui, ligne suivante
  134.  
  135.          xor       bp,0200h
  136.          mov       es,bp                         ; es pointe alternativement la mémoire graphique paire et impaire
  137.  
  138. Octet_Suivant:
  139.  
  140.          mov       bl,[si]                       ; octet sprite
  141.          mov       dl,cs:[MasqCGA+bx]            ; octet masque
  142.          and       es:[di],dl                    ; et logique  entre l'octet masque et l'emplacement à l'écran
  143.          or        es:[di],bl                    ; ou inclusif entre l'octet sprite et l'emplacement à l'écran
  144.  
  145.          inc       si                            ; octet source      suivant
  146.          inc       di                            ; octet destination suivant
  147.  
  148.          loop      Octet_Suivant
  149.  
  150.          mov       cx,4                          ; nombre de mots par ligne
  151.  
  152.          add       si,76                         ; ligne source suivante
  153.          sub       di,4                          ; on récupère le pointeur de ligne d'écran
  154.  
  155.          test      dh,1
  156.          jnz       Ligne_Suivante                ; ligne suivante si balayage impair
  157.  
  158.          add       di,80                         ; on pointe sur le début de la ligne suivante de l'écran
  159.  
  160.          jmp       short Ligne_Suivante
  161.  
  162. Fin:
  163.  
  164. ENDM
  165.  
  166. ;----------------------------
  167.  
  168. AFFICHE_CHAMP_CGA  MACRO                         ; affiche un champignon en mode CGA
  169. local LignDest_Impair,LignDest_Pair,Suite        ; ---------------------------------
  170. local Ligne_Suivante,Octet_Suivant,Fin
  171.  
  172.          mov       ax,SEG DONNEES
  173.          mov       ds,ax                         ; on initialise le segment de données
  174.  
  175.          mov       si,OFFSET Struct_Balle        ; ds:si pointe sur l'adresse de Struct_Balle
  176.  
  177.          cmp       [si].AffiCham,AFFICHE         ; y a t-il une autorisation d'affichage d'un champignon ?
  178.          je        @F                            ; oui
  179.          jmp       Fin                           ; non
  180.  
  181. @@:      mov       [si].AffiCham,NO_AFFICHE      ; on évite un 2ème affichage
  182.  
  183.          test      [si].AdEcCham,8000h           ; l'affichage débute t-il sur une ligne impaire ?
  184.          jz        LignDest_Pair                 ; non
  185.  
  186. LignDest_Impair:                                 ; ligne maitresse impaire
  187.  
  188.          mov       bp,GRAPH_PAIR + 0005h         ; adresse mémoire graphique lignes paires dans bx
  189.          mov       ax,0205h                      ; masque de permutation lignes paires/impaires dans ax
  190.  
  191.          and       [si].AdEcCham,7FFFh           ; mise à zéro du bit de poids fort
  192.  
  193.          jmp       short Suite
  194.  
  195. LignDest_Pair:                                   ; ligne maitresse paire
  196.  
  197.          mov       bp,GRAPH_IMPAIR               ; début adresse mémoire graphique lignes impaires dans bx
  198.          mov       ax,0200h                      ; masque de permutation lignes paires/impaires dans ax
  199. Suite:
  200.  
  201.          mov       bl,[si].NbOcCham
  202.          mov       cs:el,bl                      ; sauvegarde du nombre d'octets à afficher
  203.  
  204.          mov       bl,[si].NbLiCham
  205.          mov       cs:eh,bl                      ; sauvegarde du nombre de lignes à afficher
  206.  
  207.          mov       di,[si].AdEcCham              ; es:di pointe sur l'adresse d'affichage
  208.  
  209.          mov       si,[si].AdBuCham              ; adresse dans __FlipTrav_Buffer
  210.  
  211.          lds       bx,__FlipTrav_Buffer          ; ds:bx pointe sur l'adresse de __FlipTrav_Buffer
  212.  
  213.          add       si,bx                         ; ds:si pointe sur l'adresse du 1er mot à afficher
  214.  
  215.          xor       cx,cx
  216.          mov       cl,cs:el                      ; on initialise le compteur d'octets
  217.  
  218.          xor       dh,dh                         ; on initialise le compteur de lignes
  219.  
  220.          xor       bx,bx                         ; mise à zéro de l'index de recherche dans la table de masque
  221.  
  222. Ligne_Suivante:
  223.  
  224.          cmp       dh,cs:eh                      ; y a t-il une ligne à afficher ?
  225.          je        Fin                           ; non
  226.  
  227.          inc       dh                            ; oui, ligne suivante
  228.  
  229.          xor       bp,ax
  230.          mov       es,bp                         ; es pointe alternativement la mémoire graphique paire et impaire
  231.  
  232. Octet_Suivant:
  233.  
  234.          mov       bl,[si]                       ; octet sprite
  235.          mov       dl,cs:[MasqCGA+bx]            ; octet masque
  236.          and       es:[di],dl                    ; et logique  entre l'octet masque et l'emplacement à l'écran
  237.          or        es:[di],bl                    ; ou inclusif entre l'octet sprite et l'emplacement à l'écran
  238.  
  239.          inc       si                            ; octet source      suivant
  240.          inc       di                            ; octet destination suivant
  241.  
  242.          loop      Octet_Suivant
  243.  
  244.          mov       cl,cs:el                      ; nombre d'octets par ligne
  245.  
  246.          add       si,80
  247.          sub       si,cx                         ; ligne source suivante
  248.  
  249.          sub       di,cx                         ; on récupère le pointeur de ligne d'écran
  250.  
  251.          test      dh,1
  252.          jnz       Ligne_Suivante                ; ligne suivante si balayage impair
  253.  
  254.          add       di,80                         ; on pointe sur le début de la ligne suivante de l'écran
  255.  
  256.          jmp       short Ligne_Suivante
  257.  
  258. Fin:
  259.  
  260. ENDM
  261.  
  262. ;----------------------------
  263.  
  264. AFFICHE_FLIP_CGA   MACRO                         ; affichage des flips en mode CGA
  265. local LignDest_Pair,LignDest_Impair,Suite        ; -------------------------------
  266. local Ligne_Suivante,Fin
  267.  
  268. ; en entrée: ax contient l'adresse du sprite du flip dans __Flips_Buffer
  269. ;            di contient l'adresse du sprite du flip à l'écran
  270.  
  271.          lds       si,__Flips_Buffer             ; ds:si pointe sur l'adresse de __Flips_Buffer
  272.          add       si,ax                         ; ds:si pointe sur le 1er mot à afficher
  273.  
  274.          test      di,8000h                      ; l'affichage débute t-il sur une ligne impaire ?
  275.          jz        LignDest_Pair                 ; non
  276.  
  277. LignDest_Impair:                                 ; ligne maitresse impaire
  278.  
  279.          mov       bp,GRAPH_PAIR + 0005h         ; adresse mémoire graphique lignes paires dans bx
  280.          mov       ax,0205h                      ; masque de permutation lignes paires/impaires dans ax
  281.  
  282.          and       di,7FFFh                      ; mise à zéro du bit de poids fort
  283.  
  284.          jmp       short Suite
  285.  
  286. LignDest_Pair:                                   ; ligne maitresse paire
  287.  
  288.          mov       bp,GRAPH_IMPAIR               ; début adresse mémoire graphique lignes impaires dans bx
  289.          mov       ax,0200h                      ; masque de permutation lignes paires/impaires dans ax
  290.  
  291. Suite:
  292.  
  293.          mov       cx,5                          ; on initialise le compteur de mots
  294.  
  295.          xor       dh,dh                         ; on initialise le compteur de lignes
  296.  
  297. Ligne_Suivante:
  298.  
  299.          cmp       dh,28                         ; y a t-il une ligne à afficher ?
  300.          je        Fin                           ; non
  301.  
  302.          inc       dh                            ; oui, ligne suivante
  303.  
  304.          xor       bp,ax
  305.          mov       es,bp                         ; es pointe alternativement la mémoire graphique paire et impaire
  306.  
  307.          rep       movsw                         ; transfert __Flips_Buffer/écran
  308.  
  309.          mov       cx,5                          ; nombre de mots par ligne
  310.  
  311.          sub       di,10                         ; on récupère le pointeur de ligne d'écran
  312.  
  313.          test      dh,1
  314.          jnz       Ligne_Suivante                ; ligne suivante si balayage impair
  315.  
  316.          add       di,80                         ; on pointe sur le début de la ligne suivante de l'écran
  317.  
  318.          jmp       short Ligne_Suivante
  319.  
  320. Fin:
  321.  
  322.          ret
  323.  
  324. ENDM
  325.  
  326. ;----------------------------
  327.  
  328. AFFICHE_PORTE_CGA   MACRO                        ; affiche la porte de sortie en mode CGA
  329. local Ligne_Suivante,Mot_Suivant,Fin             ; --------------------------------------
  330.  
  331.          mov       ax,SEG DONNEES
  332.          mov       ds,ax                         ; on initialise le segment de données
  333.  
  334.          mov       si,OFFSET Struct_Porte        ; ds:si pointe sur l'adresse de Struct_Porte
  335.  
  336.          cmp       [si].AffiPort,AFFICHE         ; y a t-il une autorisation d'affiuchage de la porte ?
  337.          jne       Fin                           ; non
  338.  
  339.          mov       [si].AffiPort,NO_AFFICHE      ; on évite un 2ème affichage
  340.  
  341.          mov       di,[si].XPorte                ; abcisse de la porte en pixels
  342.  
  343.          shr       di,1
  344.          shr       di,1                          ; abcisse en octets
  345.  
  346.          add       di,2*40                       ; es:di pointe sur l'adresse d'affichage
  347.  
  348.          lds       si,__Sprites_Buffer           ; ds:si pointe sur l'adresse de __Sprites_Buffer
  349.  
  350.          add       si,16*80+26                   ; ds:si pointe sur le premier octet à afficher
  351.  
  352.          mov       bp,GRAPH_IMPAIR               ; l'affichage débute sur une ligne paire
  353.  
  354.          mov       cx,3                          ; on initialise le compteur de mots
  355.  
  356.          xor       dh,dh                         ; on initialise le compteur de lignes
  357.  
  358. Ligne_Suivante:
  359.  
  360.          cmp       dh,9                          ; y a t-il une ligne à afficher ?
  361.          je        Fin                           ; non
  362.  
  363.          inc       dh                            ; oui, ligne suivante
  364.  
  365.          xor       bp,0200h
  366.          mov       es,bp                         ; es pointe alternativement la mémoire graphique paire et impaire
  367.  
  368. Mot_Suivant:
  369.  
  370.          mov       ax,[si]
  371.          xor       es:[di],ax                    ; transfert __Sprites_Buffer/écran
  372.  
  373.          add       si,2
  374.          add       di,2
  375.  
  376.          loop      Mot_Suivant
  377.  
  378.          mov       cx,3                          ; nombre de mots par ligne
  379.  
  380.          sub       di,6                          ; on récupère le pointeur de ligne d'écran
  381.  
  382.          add       si,74
  383.  
  384.          test      dh,1
  385.          jnz       Ligne_Suivante                ; ligne suivante si balayage impair
  386.  
  387.          add       di,80                         ; on pointe sur le début de la ligne suivante de l'écran
  388.  
  389.          jmp       short Ligne_Suivante
  390.  
  391. Fin:
  392.  
  393. ENDM
  394.  
  395. ;----------------------------
  396.  
  397. AFFICHE_SCORE_CGA  MACRO                         ; affiche le score en mode CGA
  398. local Ligne_Suivante,Fin                         ; ----------------------------
  399.  
  400.          mov       ax,SEG DONNEES
  401.          mov       ds,ax                         ; on initialise le segment de données
  402.  
  403.          mov       si,OFFSET Struct_Score        ; ds:si pointe sur l'adresse de Struct_Score
  404.  
  405. Affiche_Dizaines:
  406.  
  407.          cmp       [si].AffiDiza,OUI             ; y a t-il une autorisation d'affichage des dizaines ?
  408.          jne       Affiche_Centaines             ; non
  409.  
  410.          cmp       [si].NombPass,1               ; est-ce le 1ier passage ?
  411.          je        OK_Dizaines                   ; oui
  412.  
  413.          cmp       [si].NombPass,10              ; est-ce le 10iéme passage ?
  414.          je        Plus_Dizaines                 ; oui
  415.  
  416.          jmp       Fin
  417.  
  418. Plus_Dizaines:
  419.  
  420.          mov       [si].AffiDiza,NON             ; oui, on interdis l'affichage des dizaines
  421.  
  422. OK_Dizaines:
  423.  
  424.          mov       di,66*40+71                   ; es:di pointe sur l'adresse d'affichage des dizaines
  425.  
  426.          mov       ax,[si].AdSpDiza              ; adresse dans __Sprites_Buffert du sprite à afficher
  427.          call      Affiche_Score
  428.  
  429. Affiche_Centaines:
  430.  
  431.          cmp       [si].AffiCent,OUI             ; y a t-il une autorisation d'affichage des centaines ?
  432.          jne       Affiche_Milliers              ; non
  433.  
  434.          cmp       [si].NombPass,1               ; est-ce le 1ier passage ?
  435.          je        OK_Centaines                  ; oui
  436.  
  437.          cmp       [si].NombPass,10              ; est-ce le 10iéme passage ?
  438.          je        Plus_Centaines                ; oui
  439.  
  440.          jmp       Fin
  441.  
  442. Plus_Centaines:
  443.  
  444.          mov       [si].AffiCent,NON             ; oui, on interdis l'affichage des centaines
  445.  
  446. OK_Centaines:
  447.  
  448.          mov       di,66*40+67                   ; es:di pointe sur l'adresse d'affichage à l'écran des milliers
  449.  
  450.          mov       ax,[si].AdSpCent              ; adresse dans __Sprites_Buffer du sprite des centaines
  451.          call      Affiche_Score
  452.  
  453. Affiche_Milliers:
  454.  
  455.          cmp       [si].AffiMill,OUI             ; y a t-il une autorisation d'affichage des milliers ?
  456.          jne       Affiche_Dix_Milliers          ; non
  457.  
  458.          cmp       [si].NombPass,1               ; est-ce le 1ier passage ?
  459.          je        OK_Milliers                   ; oui
  460.  
  461.          cmp       [si].NombPass,10              ; est-ce le 10iéme passage ?
  462.          je        Plus_Milliers                 ; oui
  463.  
  464.          jmp       Fin
  465.  
  466. Plus_Milliers:
  467.  
  468.          mov       [si].AffiMill,NON             ; oui, on interdis l'affichage des milliers
  469.  
  470. OK_Milliers:
  471.  
  472.          mov       di,66*40+63                   ; es:di pointe sur l'adresse d'affichage à l'écran des milliers
  473.  
  474.          mov       ax,[si].AdSpMill              ; adresse dans __Sprites_Buffer du sprites des milliers
  475.          call      Affiche_Score
  476.  
  477. Affiche_Dix_Milliers:
  478.  
  479.          cmp       [si].AffiDimi,OUI             ; y a t-il une autorisation d'affichage des millions ?
  480.          jne       Fin                           ; non
  481.  
  482.          cmp       [si].NombPass,1               ; est-ce le 1ier passage ?
  483.          je        OK_Dix_Milliers               ; oui
  484.  
  485.          cmp       [si].NombPass,10              ; est-ce le 10iéme passage ?
  486.          je        Plus_Dix_Milliers             ; oui
  487.  
  488.          jmp       short Fin
  489.  
  490. Plus_Dix_Milliers:
  491.  
  492.          mov       [si].AffiDimi,NON             ; oui, on interdis l'affichage des dizaines de milliers
  493.  
  494. OK_Dix_Milliers:
  495.  
  496.          mov       di,66*40+59                   ; es:di pointe sur l'adresse d'affichage à l'écran des millions
  497.  
  498.          mov       ax,[si].AdSpDimi              ; adresse dans __Sprites_buffer du sprite des dizaines de milliers
  499.          call      Affiche_Score
  500.  
  501. Affiche_Cent_Milliers:
  502.  
  503.          jmp       Fin
  504.  
  505. Affiche_Score:
  506.  
  507.          push      si
  508.          push      ds
  509.  
  510.          cmp       [si].NombPass,1               ; est-ce le premier passage ?
  511.          jne       @F                            ; non
  512.  
  513.          add       ax,12                         ; on pointe sur l'adresse dans __Sprites_Buffer des sprites intermédiaires
  514.  
  515. @@:      lds       si,__Sprites_Buffer           ; ds:si pointe sur l'adresse de __Sprites_Buffer
  516.          add       si,ax                         ; ds:si pointe sur l'adresse du sprite à afficher
  517.  
  518.          mov       bp,GRAPH_PAIR + 0005h         ; adresse mémoire graphique lignes impaires
  519.  
  520.          mov       cx,2                          ; on initialise le compteur de mots
  521.  
  522.          xor       dh,dh                         ; on initialise le compteur de lignes
  523.  
  524. Ligne_Suivante:
  525.  
  526.          cmp       dh,16                         ; y a t-il une ligne à afficher ?
  527.          je        retour                        ; non
  528.  
  529.          inc       dh                            ; oui, ligne suivante
  530.  
  531.          xor       bp,0205h
  532.          mov       es,bp                         ; es pointe alternativement la mémoire graphique paire et impaire
  533.  
  534.          rep       movsw                         ; affichage des mots sources
  535.  
  536.          mov       cx,2                          ; nombre de mots par ligne
  537.  
  538.          add       si,76                         ; ligne source suivante
  539.          sub       di,4                          ; on récupère le pointeur de ligne d'écran
  540.  
  541.          test      dh,1
  542.          jnz       Ligne_Suivante                ; ligne suivante si balayage impair
  543.  
  544.          add       di,80                         ; on pointe sur le début de la ligne suivante de l'écran
  545.  
  546.          jmp       short Ligne_Suivante
  547.  
  548. retour:
  549.  
  550.          pop       ds
  551.          pop       si
  552.  
  553.          ret
  554.  
  555. Fin:
  556.  
  557. ENDM
  558.  
  559. ;----------------------------
  560.  
  561. AFFICHE_RESSOR_CGA MACRO                         ; affiche le ressort de la rampe de lancement de la balle en mode CGA
  562. local Ligne_Suivante,Fin                         ; -------------------------------------------------------------------
  563.  
  564.          mov       ax,SEG DONNEES
  565.          mov       ds,ax                         ; on initialise le segment de données
  566.  
  567.          mov       si,OFFSET Struct_Balle        ; ds:si pointe sur l'adresse de Struct_Balle
  568.  
  569.          cmp       [si].DansRamp,OUI             ; la balle est-elle dans la rampe de lancement ?
  570.          jne       Fin                           ; non
  571.  
  572.          mov       ax,[si].ForcImpu
  573.  
  574.          cmp       [si].CYB,154                  ; la balle est-elle en fond de rampe de lancement ?
  575.          je        Balle_Immobile                ; oui
  576.  
  577.          xor       ax,ax                         ; non, le ressort se détend
  578.  
  579. Balle_Immobile:
  580.  
  581.          shr       ax,1
  582.          neg       ax
  583.          add       ax,32                         ; 32 - ForcImpu / 2
  584.  
  585.          shl       ax,1
  586.          shl       ax,1
  587.          shl       ax,1
  588.          shl       ax,1                          ; (32 - ForcImpu / 2) * 16
  589.  
  590.          mov       bx,ax
  591.  
  592.          shl       bx,1
  593.          shl       bx,1                          ; (32 - ForcImpu / 2) * 64
  594.  
  595.          add       ax,bx                         ; (32 - ForcImpu / 2) * 80
  596.          add       ax,22                         ; (32 - ForcImpu / 2) * 80 + 22
  597.  
  598.          lds       si,__Sprites_Buffer           ; ds:si pointe sur l'adresse de __Fliptrav_Buffer
  599.  
  600.          add       si,ax                         ; ds:si pointe sur le 1er mot à afficher
  601.  
  602.          mov       di,184*40+55                  ; es:di pointe sur l'adresse d'affichage
  603.  
  604.          mov       bp,GRAPH_PAIR + 0005h         ; l'afficha<ge débute sur une ligne impaire
  605.  
  606.          xor       dh,dh                         ; on initialise le compteur de lignes
  607.  
  608. Ligne_Suivante:
  609.  
  610.          cmp       dh,15                         ; y a t-il une ligne à afficher ?
  611.          je        Fin                           ; non
  612.  
  613.          inc       dh                            ; oui, ligne suivante
  614.  
  615.          xor       bp,0205h
  616.          mov       es,bp                         ; es pointe alternativement la mémoire graphique paire et impaire
  617.  
  618.          mov       ax,[si]
  619.          mov       es:[di],ax                    ; affiche le mot
  620.  
  621.          add       si,80                         ; ligne source suivante
  622.  
  623.          test      dh,1
  624.          jnz       Ligne_Suivante                ; ligne suivante si balayage impair
  625.  
  626.          add       di,80                         ; on pointe sur le début de la ligne suivante de l'écran
  627.  
  628.          jmp       short Ligne_Suivante
  629.  
  630. Fin:
  631.  
  632. ENDM
  633.  
  634. ;----------------------------
  635.  
  636. AFFICHE_SPRITE_CGA MACRO                         ; affiche un sprite en mode CGA
  637. local LignDest_Pair,LignDest_Impair,Suite,Fin    ; -----------------------------
  638.  
  639.          mov       si,OFFSET Struct_Sprite
  640.  
  641.          mov       al,[si].NbOctSpr              ; nombre d'octets par ligne
  642.          mov       ah,[si].NbLigSpr              ; nombre de lignes du sprite
  643.  
  644.          mov       bx,[si].PosX                  ; abscise (en pixels) du sprite à l'écran
  645.  
  646.          mov       dx,bx
  647.          and       dx,3
  648.          shl       dx,1                          ; nombre de décalages à l'octet
  649.  
  650.          shr       bx,1
  651.          shr       bx,1                          ; abscise (en octets) du sprite à l'écran
  652.  
  653.          mov       bp,[si].PosY                  ; ordonnée            du sprite à l'écran
  654.  
  655.          mov       cx,ds
  656.          mov       es,cx
  657.          mov       di,OFFSET Buffer_Sprite       ; es:di pointe sur l'adresse du buffer de travail Buffer_Sprite
  658.  
  659.          mov       cs:fx,di                      ; on sauvegarde l'offset de l'adresse de Buffer_Sprite
  660.  
  661.          mov       cx,[si].AdrSprit              ; offset du sprite dans __Sprites_Buffer
  662.  
  663.          lds       si,__Sprites_Buffer
  664.          add       si,cx                         ; ds:si pointe sur le premier octet à recopier dans Buffer_Sprite
  665.  
  666.          xor       dh,dh                         ; on initialise le compteur de ligne
  667.  
  668.          xor       cx,cx
  669.          mov       cl,al                         ; on initialise le compteur d'octets
  670.  
  671. Recopie_Ligne:
  672.  
  673.          cmp       dh,ah                         ; y a t-il une ligne à recopier ?
  674.          je        Decale_Buffer                 ; non
  675.  
  676.          inc       dh                            ; oui, ligne suivante
  677.  
  678.          rep       movsb                         ; on recopie les octets du sprite dans le buffer de travail, pour chaque ligne
  679.  
  680.          mov       cl,al                         ; nombre d'octets par ligne
  681.  
  682.          sub       si,cx
  683.          add       si,80                         ; on pointe sur le début de la ligne suivante de __Sprite_Buffer
  684.  
  685.          jmp       short Recopie_Ligne
  686.  
  687. Decale_Buffer:
  688.  
  689.          cmp       dl,0                          ; y a t-il un décalage du sprite à effectuer ?
  690.          je        Fin_Decalage                  ; non
  691.  
  692.          dec       dl                            ; oui, décalage suivant
  693.  
  694.          xor       dh,dh                         ; on initialise le compteur de ligne
  695.  
  696.          mov       di,cs:fx                      ; ds:di pointe sur l'adresse de Buffer_Sprite
  697.  
  698. Decale_Ligne:
  699.  
  700.          cmp       dh,ah                         ; y a t-il une ligne à décaler ?
  701.          je        Decale_Buffer                 ; non
  702.  
  703.          inc       dh                            ; ligne suivante
  704.  
  705.          clc
  706.  
  707. Decale_Octet:
  708.  
  709.          mov       bh,es:[di]
  710.          rcr       bh,1                          ; on décale à droite l'octet de Buffer_Sprite
  711.          mov       es:[di],bh
  712.  
  713.          inc       di                            ; octet suivant
  714.  
  715.          loop      Decale_Octet
  716.  
  717.          mov       cl,al                         ; nombre d'octets par ligne
  718.  
  719.          jmp       short Decale_Ligne
  720.  
  721. Fin_Decalage:
  722.  
  723.          mov       di,bp                         ; ordonnée du sprite à l'écran
  724.  
  725.          test      di,1
  726.          jz        LignDest_Pair                 ; test de parité de la ligne destination
  727.  
  728. LignDest_Impair:                                 ; ligne maitresse impaire
  729.  
  730.          mov       bp,GRAPH_PAIR + 0005h         ; adresse mémoire graphique lignes paires
  731.  
  732.          dec       di                            ; ligne destination - 1
  733.  
  734.          mov       dx,0205h                      ; masque de permutation lignes paires/impaires
  735.  
  736.          jmp       short Suite
  737.  
  738. LignDest_Pair:                                   ; ligne maitresse paire
  739.  
  740.          mov       bp,GRAPH_IMPAIR               ; début adresse mémoire graphique lignes impaires
  741.  
  742.          mov       dx,0200h                      ; masque de permutation lignes paires/impaires
  743.  
  744. Suite:
  745.  
  746.          mov       cx,es
  747.          mov       ds,cx                         ; ds = es
  748.  
  749.          mov       si,cs:fx                      ; ds:si pointe sur l'adresse de Buffer_Sprite
  750.  
  751.          xor       bh,bh                         ; bh a été utilisé dans Decale_Buffer
  752.  
  753.          shl       di,1
  754.          shl       di,1
  755.          shl       di,1                          ; ordonnée destination * 8
  756.  
  757.          mov       cx,di
  758.  
  759.          shl       cx,1
  760.          shl       cx,1                          ; ordonnée destination * 32
  761.  
  762.          add       di,cx                         ; ordonnée destination * 40
  763.  
  764.          add       di,bx                         ; ordonnée destination * 40 + abcisse destination
  765.  
  766.          xor       cx,cx
  767.          mov       cl,al                         ; on initialise le compteur d'octets
  768.  
  769.          mov       cs:eh,ah
  770.          xor       ah,ah                         ; on initialise le compteur de ligne
  771.  
  772.          call     _syncro                        ; syncro trame
  773.  
  774. Affiche_Ligne:
  775.  
  776.          cmp       ah,cs:eh                      ; y a t-il une ligne à afficher ?
  777.          je        Fin                           ; non
  778.  
  779.          inc       ah                            ; oui, ligne suivante
  780.  
  781.          xor       bp,dx
  782.          mov       es,bp                         ; es pointe alternativement la mémoire graphique paire et impaire
  783.  
  784. Affiche_Octet:
  785.  
  786.          xor       bx,bx                         ; mise à zéro de l'index de recherche dans la table de masque
  787.  
  788.          cmp       EffaSpri,OUI                  ; efface t-on le sprite ?
  789.          je        Efface                        ; oui
  790.  
  791.          mov       bl,[si]                       ; octet sprite
  792.          mov       bh,cs:[MasqCGA+bx]            ; octet masque
  793.          and       es:[di],bh                    ; et logique  entre l'octet masque et l'emplacement à l'écran
  794.          or        es:[di],bl                    ; ou inclusif entre l'octet        et l'emplacement à l'écran
  795.  
  796.          jmp       short @F
  797.  
  798. Efface:
  799.  
  800.          mov       bl,[si]
  801.          xor       es:[di],bl                    ; on efface le sprite
  802.  
  803. @@:
  804.  
  805.          inc       si                            ; octet source      suivant
  806.          inc       di                            ; octet destination suivant
  807.  
  808.          loop      Affiche_Octet
  809.  
  810.          mov       cl,al                         ; nombre d'octets par ligne
  811.  
  812.          sub       di,cx                         ; on récupère le pointeur de ligne d'écran
  813.  
  814.          test      ah,1
  815.          jnz       Affiche_Ligne                 ; ligne suivante si balayage impair
  816.  
  817.          add       di,80                         ; on pointe sur le début de la ligne suivante de l'écran
  818.  
  819.          jmp       short Affiche_Ligne
  820.  
  821. Fin:
  822.  
  823.          ret
  824.  
  825. ENDM
  826.  
  827. ;----------------------------
  828.  
  829. CALCUL_ADRESSE_CGA MACRO                         ; calcule l'adresse d'affichage ou d'effacement en mode CGA
  830.                                                  ; ---------------------------------------------------------
  831. ; en entrée: ax contient l'abcisse  d'affichage ou d'effacement en pixels
  832. ;            bx contient l'ordonnée d'affichage ou d'effacement
  833. ; en sortie: cx contient l'adresse  d'affichage ou d'effacement
  834.  
  835.          xor       cx,cx
  836.  
  837.          test      bx,00000001b                  ; l'ordonnée est-elle impaire ?
  838.          jz        Paire                         ; non
  839.  
  840.          dec       bx                            ; oui
  841.  
  842.          mov       ch,10000000b                  ; bit de poids fort à 1
  843.  
  844. Paire:
  845.  
  846.          shl       bx,1
  847.          shl       bx,1
  848.          shl       bx,1                          ; ordonnée * 8
  849.  
  850.          mov       dx,bx
  851.  
  852.          shl       dx,1
  853.          shl       dx,1                          ; ordonnée * 32
  854.  
  855.          add       bx,dx                         ; ordonnée * 40
  856.  
  857.          shr       ax,1
  858.          shr       ax,1                          ; abcisse en octets (4 pixels / octet)
  859.  
  860.          add       ax,bx                         ; ordonnée * 40 + abcisse / 4
  861.  
  862.          or        cx,ax                         ; ordonnée * 40 + abcisse / 4 et bit de poids fort à jour
  863.  
  864.          ret
  865.  
  866. ENDM
  867.  
  868. ;----------------------------
  869.  
  870. EFFACE_BALLE_CGA  MACRO                          ; restitue le fond à l'ancien emplacement de la balle en mode CGA
  871. local LignDest_Impair,LignDest_Pair,Suite        ; ---------------------------------------------------------------
  872. local Ligne_Suivante,Fin
  873.  
  874.          mov       ax,SEG DONNEES
  875.          mov       ds,ax                         ; on initialise le segment de données
  876.  
  877.          mov       si,OFFSET Struct_Balle        ; ds:si pointe sur l'adresse de Struct_Balle
  878.  
  879.          test      [si].AdEfBall,8000h           ; l'effacement débute t-il sur une ligne impaire ?
  880.          jz        LignDest_Pair                 ; non
  881.  
  882. LignDest_Impair:                                 ; ligne maitresse impaire
  883.  
  884.          mov       bp,GRAPH_PAIR + 0005h         ; adresse mémoire graphique lignes paires
  885.          mov       bx,0205h                      ; masque de permutation lignes paires/impaires
  886.  
  887.          and       [si].AdEfBall,7FFFh           ; mise à zéro du bit de poids fort
  888.  
  889.          jmp       short Suite
  890.  
  891. LignDest_Pair:                                   ; ligne maitresse paire
  892.  
  893.          mov       bp,GRAPH_IMPAIR               ; début adresse mémoire graphique lignes impaires
  894.          mov       bx,0200h                      ; masque de permutation lignes paires/impaires
  895.  
  896. Suite:
  897.  
  898.          mov       ch,[si].NbLiEffa              ; nombre de lignes à effacer
  899.  
  900.          mov       al,[si].NbLiAffi
  901.          mov       [si].NbLiEffa,al              ; le nombre de lignes à afficher à chaque tour
  902.                                                  ; est le nombre de lignes à effacer au tour suivant
  903.  
  904.          mov       di,[si].AdEfBall              ; es:di pointe sur l'adresse d'effacement
  905.  
  906.          mov       si,OFFSET Buffer_Fond         ; ds:si pointe sur l'adresse de Buffer_Sauve (qui contient le fond de sauvegarde)
  907.  
  908.          xor       dh,dh                         ; on initialise le compteur de lignes
  909.  
  910.          call     _syncro                        ; syncro trame
  911.  
  912. Ligne_Suivante:
  913.  
  914.          cmp       dh,ch                         ; y a t-il une ligne à afficher ?
  915.          je        Fin                           ; non
  916.  
  917.          inc       dh                            ; oui, ligne suivante
  918.  
  919.          xor       bp,bx
  920.          mov       es,bp                         ; es pointe alternativement la mémoire graphique paire et impaire
  921.  
  922.          mov       ax,[si]
  923.          mov       es:[di],ax                    ; transfert buffer/écran
  924.  
  925.          mov       ax,[si+2]
  926.          mov       es:[di+2],ax                  ; transfert buffer/écran
  927.  
  928.          add       si,4                          ; ligne source suivante
  929.  
  930.          test      dh,1
  931.          jnz       Ligne_Suivante                ; ligne suivante si balayage impair
  932.  
  933.          add       di,80                         ; on pointe sur le début de la ligne suivante de l'écran
  934.  
  935.          jmp       short Ligne_Suivante
  936.  
  937. Fin:
  938.  
  939. ENDM
  940.  
  941. ;----------------------------
  942.  
  943. SAUVE_FOND_CGA     MACRO                         ; sauvegarde le fond au nouvel emplacement de la balle, en mode CGA
  944. local Balle_Mobile,Ligne_Suivante                ; -----------------------------------------------------------------
  945. local LignDest_Pair,LignDest_Impair,Suite,Fin
  946.  
  947.          mov       ax,SEG DONNEES
  948.          mov       ds,ax                         ; on initialise le segment de données
  949.  
  950.          mov       si,OFFSET Struct_Balle        ; ds:si pointe sur l'adresse de Struct_Balle
  951.  
  952.          test      [si].AdAfBall,8000h           ; l'affichage débute t-il sur une ligne impaire ?
  953.          jz        LignDest_Pair                 ; non
  954.  
  955. LignDest_Impair:                                 ; ligne maitresse impaire
  956.  
  957.          mov       bp,GRAPH_PAIR + 0005h         ; adresse mémoire graphique lignes paires
  958.          mov       bx,0205h                      ; masque de permutation lignes paires/impaires
  959.  
  960.          and       [si].AdAfBall,7FFFh           ; mise à zéro du bit de poids fort
  961.  
  962.          jmp       short Suite
  963.  
  964. LignDest_Pair:                                   ; ligne maitresse paire
  965.  
  966.          mov       bp,GRAPH_IMPAIR               ; début adresse mémoire graphique lignes impaires
  967.          mov       bx,0200h                      ; masque de permutation lignes paires/impaires
  968.  
  969. Suite:
  970.  
  971.          push      bp                            ; on sauvegarde l'adresse mémoire graphique utilisée dans AFFICHE_BALLE_CGA
  972.  
  973.          mov       ch,[si].NbLiAffi              ; nombre de lignes à sauvegarder
  974.  
  975.          mov       si,[si].AdAfBall              ; ds:si pointe sur l'adresse de sauvegarde
  976.  
  977.          mov       ax,ds
  978.          mov       es,ax
  979.          mov       di,OFFSET Buffer_Fond         ; es:di pointe sur l'adresse de Buffer_Sauve
  980.  
  981.          xor       dh,dh                         ; on initialise le compteur de lignes
  982.  
  983. Ligne_Suivante:
  984.  
  985.          cmp       dh,ch                         ; y a t-il une ligne à afficher ?
  986.          je        Fin                           ; non
  987.  
  988.          inc       dh                            ; oui, ligne suivante
  989.  
  990.          xor       bp,bx
  991.          mov       ds,bp                         ; es pointe alternativement la mémoire graphique paire et impaire
  992.  
  993.          mov       ax,[si]
  994.          mov       es:[di],ax                    ; transfert écran/buffer
  995.  
  996.          mov       ax,[si+2]                     ; transfert écran/buffer
  997.          mov       es:[di+2],ax
  998.  
  999.          add       di,4                          ; ligne destination suivante
  1000.  
  1001.          test      dh,1
  1002.          jnz       Ligne_Suivante                ; ligne suivante si balayage impair
  1003.  
  1004.          add       si,80                         ; on pointe sur le début de la ligne suivante de l'écran
  1005.  
  1006.          jmp       short Ligne_Suivante
  1007.  
  1008. Fin:
  1009.  
  1010. ENDM