Files
lba1-classic/LIB386/LIB_SVGA/MASK_A.ASM
Gwen Gourevich c5f4f6ba25 Initial commit
2021-10-27 10:34:18 +02:00

319 lines
5.9 KiB
NASM

;----------------------------------------------------------------------------
; Mask_A.ASM 386
; (c) Adeline 1993
;----------------------------------------------------------------------------
.386P
jumps
.model SMALL, SYSCALL
;----------------------------------------------------------------------------
.data
;----------------------------------------------------------------------------
include \projet\lib386\lib_svga\svga.ash
comment @
DWORD TabOffset[]
Brick:
- BYTE Delta X
- BYTE Delta Y
Line(Delta Y):
- BYTE NbBlock
Block 0: Nb Zero to Jump
Block 1: Nb Zero to Write
Block 2: Nb Zero to Jump
etc...
@
BufferClip db 512 dup(?)
ColMask db 0 ; Noir par Defaut
ALIGN 4
OffsetBegin dd 0
NbPix dd 0
;----------------------------------------------------------------------------
.code
public NoLanguage CoulMask
public NoLanguage AffMask
public NoLanguage AffMask_Asm
public NoLanguage GetDxDyMask
;----------------------------------------------------------------------------
CoulMask proc ,\
coul:DWORD
mov eax, coul
mov byte ptr [ColMask], al
ret
CoulMask endp
;----------------------------------------------------------------------------
AffMask proc uses esi edi ebx ebp,\
nummask:DWORD, xmask:DWORD, ymask:DWORD, \
bankmask:DWORD
mov eax, nummask
mov ebx, xmask
mov ecx, ymask
mov esi, bankmask
Call AffMask_Asm
ret
AffMask endp
;----------------------------------------------------------------------------
AffMask_Asm proc
add esi, [esi+eax*4] ; ESI = Begin Data
xor eax, eax
mov al, [esi+2]
add ebx, eax ; Hot X
mov al, [esi+3]
add ecx, eax ; Hot Y
;-----------------------------------------------
xor edx, edx
mov dl, [esi] ; Delta X
mov al, [esi+1] ; Nb Line ( Delta Y )
add esi, 4 ; Jump HotX & HotY
;----------------------------------------------- Test Clipping
add edx, ebx
add eax, ecx
dec edx
dec eax
cmp ebx, ClipXmin
jl ClippingMask
cmp ecx, ClipYmin
jl ClippingMask
cmp edx, ClipXmax
jg ClippingMask
cmp eax, ClipYmax
jg ClippingMask
inc edx
inc eax
sub edx, ebx
sub eax, ecx
;----------------------------------------------- Calcul Offset Ecran
mov edi, Log
add edi, TabOffLine[ecx*4]
add edi, ebx
mov bh, al ; BH = NbLine
sub edx, Screen_X ; EDX = Offset Screen
neg edx ; EDX = Screen_X-edx
xor ecx, ecx ; Maz Compteur
mov ebp, edx ; EBP Offset Next Line
mov al, byte ptr [ColMask]; Couleur du Masque
mov ah, al
;----------------------------------------------- Init NbBlock for this line
NextLine: mov bl, [esi] ; BL = Nb Block for this line
inc esi
;----------------------------------------------- Manage One Line
SameLine: mov cl, [esi] ; Nb Zero to Jump
add edi, ecx ; Incrust
dec bl
je EndBlock
mov cl, [esi+1] ; Nb Zero to Write
add esi, 2
shr ecx, 1
rep stosw ; Write Zero
jnc nobyte
stosb
nobyte: dec bl ; Nb Block--
jne SameLine ; Continue Same Line
add edi, ebp ; EDI += Offset Next Line
dec bh ; NbLine--
jne NextLine ; Next Line
ret
EndBlock:
inc esi
add edi, ebp ; EDI += Offset Next Line
dec bh ; NbLine--
jne NextLine ; Next Line
ret
;-------------------------------------------------------------------- Clipping
; Graph : ( EBX, ECX ) ( EDX, EAX )
ClippingMask:
cmp ebx, ClipXmax
jg EndMask
cmp ecx, ClipYmax
jg EndMask
cmp edx, ClipXmin
jl EndMask
cmp eax, ClipYmin
jl EndMask
cmp ecx, ClipYmin
jge PasHaut
;---------------------- Clipping Haut, Saute ClipYmin-ECX Line(s)
sub ecx, ClipYmin
neg ecx
mov ebp, eax
;----------------------
xor eax, eax
NextH: mov al, [esi] ; NbBlock
lea esi, [esi+1+eax] ; Jump Data
dec ecx
jnz NextH
mov eax, ebp
mov ecx, ClipYmin ; New Y Haut
;---------------------- Clipping Bas
PasHaut: cmp eax, ClipYmax
jle PasBas
mov eax, ClipYmax
;---------------------- Clipping Gauche
Pasbas: mov OffsetBegin, 0
cmp ebx, ClipXmin
jge PasGauche
push eax
mov eax, ClipXmin
sub eax, ebx
mov OffsetBegin, eax
pop eax
;---------------------- Clipping Droit
PasGauche: mov ebp, edx
sub ebp, ebx
sub ebp, OffsetBegin
inc ebp
mov NbPix, ebp
cmp edx, ClipXmax
jle PasDroit
sub edx, ClipXmax
sub NbPix, edx
mov edx, ClipXmax
;----------------------
PasDroit:
mov edi, Log
add edi, TabOffLine[ecx*4]
add edi, ebx
sub eax, ecx
inc al
mov bh, al ; BH NbLine
xor ecx, ecx
mov ebp, edi
;----------------------------------------------
mov dl, byte ptr [ColMask]
mov dh, dl
; ESI = DATAS LINE
NextL: lea edi, BufferClip ; EDI = BUFFERCLIP
mov bl, [esi] ; NbBlock
inc esi
SameL: mov cl, [esi]
xor ax, ax
shr ecx, 1
rep stosw
jnc nobyte1
stosb
nobyte1: dec bl
je EndLine
mov cl, [esi+1]
add esi, 2
mov ax, dx ; ColMask
shr ecx, 1
rep stosw
jnc nobyte2
stosb
nobyte2: dec bl
jne SameL
dec esi
;----------------------
EndLine: inc esi
push esi ; SAVE ESI
mov ecx, OffsetBegin
lea edi, [ebp+ecx] ; EDI = SCREEN
lea esi, [BufferClip+ecx] ; ESI = BUFFERCLIP
mov ecx, NbPix
Again: lodsb
or al, al
je Incrust
mov [edi], al
Incrust: inc edi
dec ecx
jnz Again
add ebp, 640
pop esi
dec bh
jne NextL
;----------------------
EndMask: ret
AffMask_Asm endp
;----------------------------------------------------------------------------
GetDxDyMask proc uses esi edi ebx,\
num:DWORD, ptdx:DWORD, ptdy:DWORD, bankmask:DWORD
mov esi, bankmask
mov eax, num
add esi, [esi+eax*4]
mov edi, ptdx
xor eax, eax
mov al, [esi]
mov [edi], eax
mov edi, ptdy
mov al, [esi+1]
mov [edi], eax
ret
GetDxDyMask endp
;----------------------------------------------------------------------------
; The
End