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

406 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
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 eax, nummask
mov ebx, xmask
mov ecx, ymask
mov esi, bankmask
add esi, [esi+eax*4]; ESI = Begin Data
movzx eax, byte ptr[esi+2] ; Hot X
add ebx, eax
movzx eax, byte ptr[esi+3] ; Hot Y
add ecx, eax
;-----------------------------------------------
lodsb ; Delta X
movzx edx, al ;
lodsb ; Nb Line ( Delta Y )
movzx eax, al
add esi, 2 ; 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
sub edx, ebx
sub eax, ecx
inc edx
inc eax
;----------------------------------------------- Calcul Offset Ecran
add ebx, TabOffLine[ecx*4]
mov edi, Log
add edi, ebx
mov ebp, ptsrc
add ebp, 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 eax, ecx
;----------------------------------------------- Init NbBlock for this line
NextLine: lodsb ; Nb Block for this line
mov bl, al ; BL = NbBlock
;----------------------------------------------- Manage One Line
SameLine: lodsb ; Nb Zero to Jump
add edi, eax ; Incrust on Log
add ebp, eax ; And on PtSrc
dec bl
je EndBlock
lodsb ; Nb Zero to Write
mov cl, al
; xor al, al
; rep stosb
xchg esi, ebp
mov al, cl
shr cl, 2
rep movsd ; Write Datas From PtSrc
mov cl, al
and cl, 11b
rep movsb
xchg esi, ebp
dec bl ; Nb Block--
jne SameLine ; Continue Same Line
EndBlock:
add edi, edx ; EDI += Offset Screen
add ebp, edx
dec bh ; NbLine--
jne NextLine ; Next Line
;----------------------------------------------- Incrust
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: lodsb
add esi, eax
loop NextH
mov ecx, ClipYMin
mov eax, ebp
;---------------------- Clipping Bas
PasHaut: cmp eax, ClipYmax
jle PasBas
mov eax, ClipYmax
;---------------------- Clipping Gauche
Pasbas: mov OffsetBegin, 0
cmp ebx, ClipXmin
jge PasGauche
mov ebp, ClipXmin
sub ebp, ebx
mov OffsetBegin, ebp
;---------------------- 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: ; 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 ebp, esi
mov edi, TabOffLine[ecx*4]
add edi, ebx
mov esi, edi ; good Y offset screen
add edi, Log
add esi, Screen ; Screen
mov edx, eax
sub edx, ecx
inc edx
xor ecx, ecx
l1: push esi
push edi
mov bl, byte ptr[ebp] ; nb blocs
inc ebp
mov bh, byte ptr[NbPix] ; nb point … copier
mov ecx, [OffsetBegin] ; start x
mov ah, cl ; nb pix count
add edi, ecx ; new pos screen
add esi, ecx
l0: mov al, byte ptr[ebp] ; nb pix to jump
inc ebp
dec bl
sub ah, al
jz okdraw ; tombe pile
jc rptj ; reste pix to jump
or bl, bl
jz aplus
mov al, byte ptr[ebp] ; nb copy point
inc ebp
dec bl
sub ah, al
jz okjump
jc rgtc ; reste graph to copy
or bl, bl ; jmp l0
jnz l0
jmp aplus
rptj: neg ah ; ah nb pix to jump
mov cl, ah
sub bh, ah ; reste … ecrire
jle aplus
add edi, ecx
add esi, ecx
jmp okdraw
rgtc: neg ah ; al nb pix to copy
mov cl, ah
sub bh, ah ; reste … ecrire
jc cpt ; copy pas tout
rep movsb ; copy
jz aplus ; tombe pile
jmp okjump
cpt: add cl, bh
rep movsb
jmp aplus
EVEN
okjump: mov cl, byte ptr[ebp] ; al nb pix to jump
inc ebp
dec bl
jz aplus
sub bh, cl ; reste … ecrire
jle aplus ; fini
add edi, ecx
add esi, ecx
okdraw: mov cl, byte ptr[ebp] ; nb pix to copy
inc ebp
dec bl
sub bh, cl ; reste … ecrire
jc cpt ; copy pas tout
rep movsb ; copy
jz aplus ; tombe pile
or bl,bl ; nb bloc--
jz aplus
jmp short okjump
aplus: ; ligne finie
movzx eax, bl
add ebp, eax
pop edi
pop esi
add edi, 640
add esi, 640
dec dl ; nb lig--
jnz l1
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
;----------------------
#
EndMask: ret
CopyMask endp
;----------------------------------------------------------------------------
; The
End