377 lines
6.7 KiB
NASM
377 lines
6.7 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(?)
|
|
OffsetBegin dd 0
|
|
NbPix dd 0
|
|
|
|
save_esi dd ?
|
|
|
|
extrn NoLanguage Screen:DWORD
|
|
|
|
;----------------------------------------------------------------------------
|
|
.code
|
|
|
|
public NoLanguage CopyMask
|
|
|
|
;----------------------------------------------------------------------------
|
|
CopyMask proc uses esi edi ebx ebp,\
|
|
nummask:DWORD, xmask:DWORD, ymask:DWORD, \
|
|
bankmask:DWORD, ptsrc:DWORD
|
|
|
|
mov esi, ptsrc
|
|
|
|
mov eax, nummask
|
|
mov ebx, xmask
|
|
mov ecx, ymask
|
|
mov ebp, bankmask
|
|
|
|
add ebp, [ebp+eax*4] ; EBP = Begin Data
|
|
|
|
xor eax, eax
|
|
mov al, [ebp+2] ; Hot X
|
|
add ebx, eax
|
|
mov al, [ebp+3] ; Hot Y
|
|
add ecx, eax
|
|
|
|
;-----------------------------------------------
|
|
|
|
xor edx, edx
|
|
mov dl, [ebp] ; Delta X
|
|
mov al, [ebp+1] ; Nb Line ( Delta Y )
|
|
add ebp, 4 ; Jump Hot X & Hot Y
|
|
|
|
;----------------------------------------------- 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
|
|
add ebx, TabOffLine[ecx*4]
|
|
|
|
mov edi, Log
|
|
|
|
add esi, ebx
|
|
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
|
|
;----------------------------------------------- Init NbBlock for this line
|
|
NextLine: mov bl, [ebp] ; BL = Nb Block for this line
|
|
inc ebp
|
|
;----------------------------------------------- Manage One Line
|
|
SameLine: mov cl, [ebp] ; Nb Zero to Jump
|
|
add edi, ecx ; Incrust on Log
|
|
add esi, ecx ; And on PtSrc
|
|
|
|
dec bl
|
|
je EndBlock
|
|
|
|
mov cl, [ebp+1] ; Nb Zero to Write
|
|
add ebp, 2
|
|
|
|
mov al, cl
|
|
shr cl, 2
|
|
and al, 11b
|
|
rep movsd ; Write Datas From PtSrc
|
|
mov cl, al
|
|
rep movsb
|
|
|
|
dec bl ; Nb Block--
|
|
jne SameLine ; Continue Same Line
|
|
add edi, edx ; EDI += Offset Screen
|
|
add esi, edx
|
|
dec bh ; NbLine--
|
|
jne NextLine ; Next Line
|
|
ret
|
|
EndBlock:
|
|
inc ebp
|
|
add edi, edx ; EDI += Offset Screen
|
|
add esi, edx
|
|
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 esi, eax
|
|
|
|
xor eax, eax
|
|
NextH: mov al, [ebp]
|
|
lea ebp, [ebp+1+eax]
|
|
dec ecx
|
|
jnz NextH
|
|
|
|
mov eax, esi
|
|
|
|
mov ecx, ClipYMin
|
|
|
|
;---------------------- Clipping Bas
|
|
PasHaut: cmp eax, ClipYmax
|
|
jle PasBas
|
|
mov eax, ClipYmax
|
|
;---------------------- Clipping Gauche
|
|
Pasbas: mov OffsetBegin, 0
|
|
cmp ebx, ClipXmin
|
|
jge PasGauche
|
|
|
|
mov esi, ClipXmin
|
|
sub esi, ebx
|
|
mov OffsetBegin, esi
|
|
|
|
;---------------------- Clipping Droit
|
|
PasGauche:
|
|
mov esi, edx
|
|
sub esi, ebx
|
|
sub esi, OffsetBegin
|
|
inc esi
|
|
mov NbPix, esi
|
|
|
|
cmp edx, ClipXmax
|
|
jle PasDroit
|
|
|
|
sub edx, ClipXmax
|
|
sub NbPix, edx
|
|
mov edx, ClipXmax
|
|
;----------------------
|
|
|
|
|
|
PasDroit: ; ESI debut data Y ok pas X
|
|
; EBX not clipped X0
|
|
; ECX good Y0
|
|
; EAX clipped Y1
|
|
; NbPix real X nb pix
|
|
; OffsetBegin start X ( !!!!! < 128 )
|
|
|
|
mov edx, TabOffLine[ecx*4]
|
|
add edx, ebx
|
|
add edx, [OffsetBegin]
|
|
|
|
lea ebx, [eax+1]
|
|
|
|
mov eax, edx ; good Y offset screen
|
|
add edx, Log
|
|
add eax, Screen ; Screen
|
|
|
|
sub ebx, ecx
|
|
|
|
xor ecx, ecx
|
|
|
|
jmp start
|
|
|
|
|
|
|
|
aplus: mov cl, bl
|
|
add ebp, ecx
|
|
|
|
aplus2: shr ebx, 16
|
|
dec bl
|
|
jz EndMask
|
|
|
|
l1: inc ebp
|
|
|
|
add eax, 640
|
|
add edx, 640
|
|
start:
|
|
shl ebx, 16
|
|
|
|
mov cl, byte ptr[OffsetBegin]; start x
|
|
; cl = nb pix count
|
|
|
|
mov bh, byte ptr[NbPix] ; nb point à copier
|
|
|
|
mov esi, eax
|
|
mov edi, edx ; new pos screen
|
|
|
|
mov bl, [ebp] ; nb blocs
|
|
|
|
l0: inc ebp
|
|
dec bl
|
|
jz aplus2
|
|
sub cl, [ebp] ; nb pix to jump
|
|
jc rptj ; reste pix to jump
|
|
jz okdraw ; tombe pile
|
|
|
|
inc ebp
|
|
dec bl
|
|
sub cl, [ebp] ; nb copy point
|
|
jc rgtc ; reste graph to copy
|
|
jz okjump2
|
|
|
|
or bl, bl
|
|
jnz l0
|
|
|
|
shr ebx, 16
|
|
dec bl ; nb lig--
|
|
jnz l1
|
|
ret
|
|
rptj:
|
|
; cl = - nb pix to jump
|
|
add bh, cl ; reste à ecrire
|
|
jle aplus
|
|
neg cl
|
|
jmp okdraw2
|
|
|
|
rgtc:
|
|
neg cl ; cl nb pix to copy
|
|
sub bh, cl ; reste à ecrire
|
|
jc cpt ; copy pas tout
|
|
rep movsb ; copy
|
|
jz aplus
|
|
|
|
okjump2: or bl, bl
|
|
jz aplus2
|
|
|
|
okjump: inc ebp
|
|
dec bl
|
|
jz aplus2
|
|
mov cl, [ebp] ; nb pix to jump
|
|
sub bh, cl ; reste à ecrire
|
|
jle aplus ; fini
|
|
okdraw2:
|
|
add edi, ecx
|
|
add esi, ecx
|
|
|
|
okdraw: inc ebp
|
|
dec bl ; nb bloc--
|
|
mov cl, [ebp] ; nb pix to copy
|
|
sub bh, cl ; reste à ecrire
|
|
jc cpt ; copy pas tout
|
|
rep movsb ; copy
|
|
jz aplus ; tombe pile
|
|
or bl, bl
|
|
jnz okjump
|
|
|
|
shr ebx, 16
|
|
dec bl ; nb lig--
|
|
jnz l1
|
|
ret
|
|
|
|
cpt: add cl, bh
|
|
rep movsb
|
|
|
|
; ligne finie
|
|
|
|
mov cl, bl
|
|
add ebp, ecx
|
|
|
|
shr ebx, 16
|
|
dec bl ; nb lig--
|
|
jnz l1
|
|
EndMask: ret
|
|
|
|
comment #
|
|
add ebx, TabOffLine[ecx*4]
|
|
mov edi, Log
|
|
add edi, ebx
|
|
|
|
sub eax, ecx
|
|
inc al
|
|
mov bh, al ; BH NbLine
|
|
xor ecx, ecx
|
|
mov ebp, edi
|
|
;----------------------------------------------
|
|
; ESI = DATAS LINE
|
|
NextL: lea edi, BufferClip ; EDI = BUFFERCLIP
|
|
lodsb ; NbBlock
|
|
mov bl, al
|
|
SameL: lodsb
|
|
mov cl, al
|
|
mov al, 1
|
|
rep stosb
|
|
dec bl
|
|
je EndLine
|
|
lodsb
|
|
mov cl, al
|
|
xor al, al
|
|
rep stosb
|
|
dec bl
|
|
jne SameL
|
|
;----------------------
|
|
EndLine: push esi ; SAVE ESI
|
|
lea esi, BufferClip ; ESI = BUFFERCLIP
|
|
mov edi, ebp ; EDI = SCREEN
|
|
mov ecx, OffsetBegin
|
|
add esi, ecx
|
|
add edi, ecx
|
|
mov ecx, NbPix
|
|
;----------------------
|
|
Again:
|
|
lodsb
|
|
or al, al
|
|
jne Incrust
|
|
mov [edi], al
|
|
Incrust: inc edi
|
|
loop Again
|
|
|
|
add ebp, 640
|
|
pop esi
|
|
dec bh
|
|
jne NextL
|
|
;----------------------
|
|
#
|
|
|
|
CopyMask endp
|
|
|
|
;----------------------------------------------------------------------------
|
|
; The
|
|
End
|