home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / graph / copper.asm < prev    next >
Assembly Source File  |  1994-10-07  |  4KB  |  125 lines

  1. extrn waitretrace:far
  2. data segment public
  3.   maxrow dw (?)
  4. data ends
  5.  
  6. code segment public
  7. public makecopper
  8.  
  9. assume cs:code,ds:data
  10.  
  11. MakeCopper proc pascal y_pos1,y_pos2,overlay_masque:word
  12. ; dessine 2 barres de Copper en ordonnée y_pos1 (rouge) et y_pos2 (vert)
  13. ; overlay_masque: 0ff00h : copper 2 au premier plan
  14. ;                 000ffh : copper 1 au premier plan
  15. ;                 00000h : mélange des deux coppers
  16.  
  17. hauteur equ 88                  ;hauteur par copper
  18.  
  19.  
  20.   mov ax,y_pos1                 ;détermine l'ordonnée maximale
  21.   cmp ax,y_pos2
  22.   ja ax_high
  23.   mov ax,y_pos2
  24. ax_high:
  25.   add ax,hauteur                ;ajoute la hauteur
  26.   mov maxrow,ax                 ;dernière ligne à prendre en compte
  27.  
  28.   xor cx,cx                     ;initialise le compteur à 0
  29.   call waitretrace         ;attend le retour de balayage pour synchronisation
  30.  
  31. next_line:
  32.   inc cx                        ;incrémente le compteur
  33.  
  34.   mov bx,cx                     ;calcule couleur 1
  35.   sub bx,y_pos1                 ;position relative au départ du copper
  36.   cmp bx,hauteur/2 -1           ;déjà la deuxième moitié ?
  37.   jle copper1_up
  38.   sub bx,hauteur -1             ;alors bx:=127-bx
  39.   neg bx
  40. copper1_up:
  41.   or bx,bx
  42.   jns copper1_ok                ;positif, alors couleur
  43.   xor bl,bl
  44. copper1_ok:
  45.   mov ax,cx                     ;calcule la couleur 2
  46.   sub ax,y_pos2                 ;position relative
  47.   cmp ax,hauteur/2 -1           ;2ème moitié
  48.   jle copper2_up
  49.   sub ax,hauteur -1             ;alors ax:=127-ax
  50.   neg ax
  51. copper2_up:
  52.   or ax,ax                      ;positif alors couleur
  53.   jns copper2_ok
  54.   xor al,al
  55. copper2_ok:
  56.   mov bh,al                     ;bl contient couleur copper 1 / copper 2
  57.  
  58.   mov ax,bx                     ;calcule le recouvrement
  59.   and ax,overlay_masque         ;masque copper 1 ou 2 
  60.   or al,al                      ;copper 1 prioritaire
  61.   je Copper1_derriere
  62.   xor bh,bh                     ;efface copper 2
  63. copper1_derriere:
  64.   or ah,ah                      ;copper 2 prioritaire
  65.   je Copper2_derriere
  66.   xor bl,bl                     ;efface copper 1
  67. copper2_derriere:
  68.  
  69.   xor al,al                     ;sélectionne la couleur 0 dans le DAC
  70.   mov dx,3c8h
  71.   out dx,al
  72.  
  73.   or bl,bl                      ;si copper 1 noir -> laisser  je bl_0
  74.   add bl,(128-hauteur) / 2      ;sinon couleur la plus claire possible
  75. bl_0:
  76.   or bh,bh                      ;idem pour copper 2
  77.   je bh_0
  78.   add bh,(128-hauteur) / 2
  79. bh_0:
  80.  
  81. ;attend le retour de balayage horizontal et active les coppers 
  82.  
  83.   cli                           ;pas d'interruption, durée TRES critique
  84.   mov dx,3dah                   ;registre 1 de l'Input Status
  85. in_retrace:
  86.   in al,dx                      ;attend l'affichage
  87.   test al,1
  88.   jne in_retrace
  89.  
  90. in_display:
  91.   in al,dx                      ;attend le retour horizontal
  92.   test al,1
  93.   je in_display
  94.  
  95.   mov al,bl                     ;charge la couleur 1
  96.   mov dx,3c9h                   ;et l'applique
  97.   out dx,al                     ;fixe la part de rouge pour copper 1
  98.   mov al,bh
  99.   out dx,al                     ;fixe la part de vert pour  copper 2 
  100.   xor al,al
  101.   out dx,al
  102.  
  103.   cmp cx,maxrow                 ;dernière ligne  ?
  104.   jne next_line
  105.  
  106.   mov dx,3dah                   ;oui -> on termine
  107. wait_hret:                      ;attend le retour avant décrochage
  108.   in al,dx                      ;sinon la dernière ligne scintille
  109.   test al,1
  110.   je wait_hret
  111.  
  112.   xor al,al                     ;sélectionne la couleur 0 dans le DAC
  113.   mov dx,3c8h
  114.   out dx,al
  115.   inc dx                        ;tous à 0 : noir 
  116.   out dx,al
  117.   out dx,al
  118.   out dx,al
  119.  
  120.   sti
  121.   ret
  122. makecopper endp
  123. code ends
  124. end
  125.