home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
graph
/
copper.asm
< prev
next >
Wrap
Assembly Source File
|
1994-10-07
|
4KB
|
125 lines
extrn waitretrace:far
data segment public
maxrow dw (?)
data ends
code segment public
public makecopper
assume cs:code,ds:data
MakeCopper proc pascal y_pos1,y_pos2,overlay_masque:word
; dessine 2 barres de Copper en ordonnée y_pos1 (rouge) et y_pos2 (vert)
; overlay_masque: 0ff00h : copper 2 au premier plan
; 000ffh : copper 1 au premier plan
; 00000h : mélange des deux coppers
hauteur equ 88 ;hauteur par copper
mov ax,y_pos1 ;détermine l'ordonnée maximale
cmp ax,y_pos2
ja ax_high
mov ax,y_pos2
ax_high:
add ax,hauteur ;ajoute la hauteur
mov maxrow,ax ;dernière ligne à prendre en compte
xor cx,cx ;initialise le compteur à 0
call waitretrace ;attend le retour de balayage pour synchronisation
next_line:
inc cx ;incrémente le compteur
mov bx,cx ;calcule couleur 1
sub bx,y_pos1 ;position relative au départ du copper
cmp bx,hauteur/2 -1 ;déjà la deuxième moitié ?
jle copper1_up
sub bx,hauteur -1 ;alors bx:=127-bx
neg bx
copper1_up:
or bx,bx
jns copper1_ok ;positif, alors couleur
xor bl,bl
copper1_ok:
mov ax,cx ;calcule la couleur 2
sub ax,y_pos2 ;position relative
cmp ax,hauteur/2 -1 ;2ème moitié
jle copper2_up
sub ax,hauteur -1 ;alors ax:=127-ax
neg ax
copper2_up:
or ax,ax ;positif alors couleur
jns copper2_ok
xor al,al
copper2_ok:
mov bh,al ;bl contient couleur copper 1 / copper 2
mov ax,bx ;calcule le recouvrement
and ax,overlay_masque ;masque copper 1 ou 2
or al,al ;copper 1 prioritaire
je Copper1_derriere
xor bh,bh ;efface copper 2
copper1_derriere:
or ah,ah ;copper 2 prioritaire
je Copper2_derriere
xor bl,bl ;efface copper 1
copper2_derriere:
xor al,al ;sélectionne la couleur 0 dans le DAC
mov dx,3c8h
out dx,al
or bl,bl ;si copper 1 noir -> laisser je bl_0
add bl,(128-hauteur) / 2 ;sinon couleur la plus claire possible
bl_0:
or bh,bh ;idem pour copper 2
je bh_0
add bh,(128-hauteur) / 2
bh_0:
;attend le retour de balayage horizontal et active les coppers
cli ;pas d'interruption, durée TRES critique
mov dx,3dah ;registre 1 de l'Input Status
in_retrace:
in al,dx ;attend l'affichage
test al,1
jne in_retrace
in_display:
in al,dx ;attend le retour horizontal
test al,1
je in_display
mov al,bl ;charge la couleur 1
mov dx,3c9h ;et l'applique
out dx,al ;fixe la part de rouge pour copper 1
mov al,bh
out dx,al ;fixe la part de vert pour copper 2
xor al,al
out dx,al
cmp cx,maxrow ;dernière ligne ?
jne next_line
mov dx,3dah ;oui -> on termine
wait_hret: ;attend le retour avant décrochage
in al,dx ;sinon la dernière ligne scintille
test al,1
je wait_hret
xor al,al ;sélectionne la couleur 0 dans le DAC
mov dx,3c8h
out dx,al
inc dx ;tous à 0 : noir
out dx,al
out dx,al
out dx,al
sti
ret
makecopper endp
code ends
end