318 lines
6.4 KiB
NASM
318 lines
6.4 KiB
NASM
;----------------------------------------------------------------------------
|
|
; Graph_A.ASM 386
|
|
; (c) Adeline 1993
|
|
;----------------------------------------------------------------------------
|
|
.386P
|
|
.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:
|
|
- 00xxxxxxb xxxxxx zeros to jump
|
|
- 01xxxxxxb xxxxxx Copy Pix
|
|
- 10xxxxxxb xxxxxx Repeat Pix
|
|
- BYTE datas[]
|
|
@
|
|
|
|
BufferClip db 512 dup(?)
|
|
OffsetBegin dd 0
|
|
NbPix dd 0
|
|
;----------------------------------------------------------------------------
|
|
.code
|
|
|
|
public NoLanguage AffGraph
|
|
public NoLanguage GetDxDyGraph
|
|
|
|
;----------------------------------------------------------------------------
|
|
AffGraph proc uses esi edi ebx ebp,\
|
|
numbrick:DWORD, xbrick:DWORD, ybrick:DWORD, \
|
|
bankbrick:DWORD
|
|
|
|
mov eax, numbrick
|
|
mov ebx, xbrick
|
|
mov ecx, ybrick
|
|
mov esi, bankbrick
|
|
|
|
add esi, [esi+eax*4]; ESI = Begin Data
|
|
|
|
|
|
;-----------------------------------------------
|
|
lodsb ; Delta X
|
|
movzx edx, al ;
|
|
lodsb ; Nb Line ( Delta Y )
|
|
movzx eax, al
|
|
;----------------------------------------------- Test Clipping
|
|
add edx, ebx
|
|
add eax, ecx
|
|
dec edx
|
|
dec eax
|
|
cmp ebx, ClipXmin
|
|
jl ClippingGraph
|
|
cmp ecx, ClipYmin
|
|
jl ClippingGraph
|
|
cmp edx, ClipXmax
|
|
jg ClippingGraph
|
|
cmp eax, ClipYmax
|
|
jg ClippingGraph
|
|
sub edx, ebx
|
|
sub eax, ecx
|
|
inc edx
|
|
inc eax
|
|
;----------------------------------------------- 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
|
|
;----------------------------------------------- Init NbBlock for this line
|
|
NextLine: lodsb ; Nb Block for this line
|
|
mov bl, al ; BL = NbBlock
|
|
;----------------------------------------------- Manage One Line
|
|
SameLine: lodsb ; OpCode
|
|
mov cl, al ; Sauve AL
|
|
and cl, 00111111b ; AH = Bit 0-5
|
|
inc cl ; One More Please...
|
|
test al, 11000000b ; AL = Bit 6-7
|
|
je JumpZero ; Incrust
|
|
test al, 01000000b ; AL = 01b
|
|
jne WriteDiffPix ; Pix Differents
|
|
;----------------------------------------------- Repeat Same Color
|
|
lodsb ; Color to Repeat
|
|
rep stosb ; Fill
|
|
dec bl ; Nb Block--
|
|
jne SameLine ; Continue Same Line
|
|
add edi, edx ; EDI += Offset Screen
|
|
dec bh ; NbLine--
|
|
jne NextLine ; Next Line
|
|
ret
|
|
;----------------------------------------------- Incrust
|
|
JumpZero: add edi, ecx ; Jump Zero (incrust)
|
|
dec bl ; Nb Block--
|
|
jne SameLine ; Continue Same Line
|
|
add edi, edx ; EDI += Offset Screen
|
|
dec bh ; NbLine--
|
|
jne NextLine ; Next Line
|
|
ret
|
|
;----------------------------------------------- Copy Diff Pix
|
|
WriteDiffPix: rep movsb ; Copy Pix
|
|
dec bl ; Nb Block--
|
|
jne SameLine ; Continue Same Line
|
|
;----------------------------------------------- End of this Line ?
|
|
add edi, edx ; EDI += Offset Screen
|
|
dec bh ; NbLine--
|
|
jne NextLine ; Next Line
|
|
ret
|
|
;-------------------------------------------------------------------- Clipping
|
|
; Graph : ( EBX, ECX ) ( EDX, EAX )
|
|
ClippingGraph:
|
|
cmp ebx, ClipXmax
|
|
jg EndGraph
|
|
cmp ecx, ClipYmax
|
|
jg EndGraph
|
|
cmp edx, ClipXmin
|
|
jl EndGraph
|
|
cmp eax, ClipYmin
|
|
jl EndGraph
|
|
|
|
cmp ecx, ClipYmin
|
|
jge PasHaut
|
|
|
|
;---------------------- Clipping Haut, Saute ClipYmin-ECX Line(s)
|
|
|
|
push eax
|
|
push ebx
|
|
|
|
|
|
mov ebx, ClipYmin
|
|
sub ebx, ecx
|
|
|
|
mov bh, bl
|
|
|
|
NextH: lodsb
|
|
mov bl, al
|
|
SameH: lodsb
|
|
test al, 11000000b
|
|
je JumpzH
|
|
mov ecx, 1
|
|
test al, 01000000b
|
|
je AquiH
|
|
mov ecx, eax
|
|
and ecx, 00111111b
|
|
inc ecx
|
|
AquiH: add esi, ecx
|
|
JumpzH: dec bl
|
|
jne SameH
|
|
dec bh
|
|
jne NextH
|
|
|
|
mov ecx, ClipYmin ; New Y Haut
|
|
|
|
pop ebx
|
|
pop eax
|
|
;---------------------- 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: push eax
|
|
mov eax, edx
|
|
sub eax, ebx
|
|
sub eax, OffsetBegin
|
|
inc eax
|
|
mov NbPix, eax
|
|
pop eax
|
|
|
|
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
|
|
;----------------------------------------------
|
|
; ESI = DATAS LINE
|
|
NextL: lea edi, BufferClip ; EDI = BUFFERCLIP
|
|
lodsb
|
|
mov bl, al
|
|
SameL: lodsb
|
|
mov cl, al
|
|
and cl, 00111111b
|
|
inc cl
|
|
test al, 11000000b
|
|
je JumpL
|
|
test al, 01000000b
|
|
jne WriteDiffL
|
|
;----------------------
|
|
lodsb
|
|
rep stosb
|
|
jmp nextBlock
|
|
;----------------------
|
|
JumpL: xor al, al
|
|
rep stosb
|
|
jmp NextBlock
|
|
;----------------------
|
|
WriteDiffL: rep movsb
|
|
;----------------------
|
|
NextBlock: dec bl
|
|
jne SameL
|
|
;----------------------
|
|
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
|
|
je Incrust
|
|
mov [edi], al
|
|
Incrust: inc edi
|
|
loop Again
|
|
add ebp, 640
|
|
pop esi
|
|
dec bh
|
|
jne NextL
|
|
;----------------------
|
|
EndGraph: ret
|
|
AffGraph endp
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
GetDxDyGraph proc uses esi edi ,\
|
|
num:DWORD, ptdx:DWORD, ptdy:DWORD, bankgraph:DWORD
|
|
|
|
mov esi, bankgraph
|
|
mov eax, num
|
|
add esi, [esi+eax*4]
|
|
mov edi, ptdx
|
|
lodsb
|
|
movzx eax, al
|
|
stosd
|
|
mov edi, ptdy
|
|
lodsb
|
|
movzx eax, al
|
|
stosd
|
|
ret
|
|
GetDxDyGraph endp
|
|
|
|
;----------------------------------------------------------------------------
|
|
;----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
;----------------------------------------------------------------------------
|
|
; The
|
|
End
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|