Initial commit
This commit is contained in:
565
SOURCES/GRILLE_A.ASM
Normal file
565
SOURCES/GRILLE_A.ASM
Normal file
@@ -0,0 +1,565 @@
|
||||
;----------------------------------------------------------------------------
|
||||
; Grille_A.ASM 386
|
||||
; (c) Adeline 1993
|
||||
;----------------------------------------------------------------------------
|
||||
.386P
|
||||
.model SMALL, SYSCALL
|
||||
;----------------------------------------------------------------------------
|
||||
.data
|
||||
;----------------------------------------------------------------------------
|
||||
extrn NoLanguage XMap :DWORD
|
||||
extrn NoLanguage YMap :DWORD
|
||||
extrn NoLanguage ZMap :DWORD
|
||||
extrn NoLanguage XScreen :DWORD
|
||||
extrn NoLanguage YScreen :DWORD
|
||||
|
||||
include \projet\lib386\lib_svga\svga.ash
|
||||
|
||||
public NoLanguage CodeJeu
|
||||
|
||||
CodeJeu db 0
|
||||
|
||||
comment @
|
||||
UBYTE *BufCube ;
|
||||
UBYTE *BufMap ;
|
||||
UBYTE *TabBlock ;
|
||||
UBYTE *BufferBrick ;
|
||||
@
|
||||
|
||||
extrn NoLanguage BufCube:DWORD
|
||||
extrn NoLanguage BufMap:DWORD
|
||||
extrn NoLanguage TabBlock:DWORD
|
||||
extrn NoLanguage BufferBrick:DWORD
|
||||
|
||||
HEADER_BLOCK equ 3
|
||||
|
||||
SIZE_CUBE_X equ 64
|
||||
SIZE_CUBE_Y equ 25
|
||||
SIZE_CUBE_Z equ 64
|
||||
|
||||
SIZE_BRICK_XZ equ 512
|
||||
SIZE_BRICK_Y equ 256
|
||||
DEMI_BRICK_XZ equ 256
|
||||
DEMI_BRICK_Y equ 128
|
||||
|
||||
;----------------------------------------------------------------------------
|
||||
.code
|
||||
|
||||
public NoLanguage DecompColonne
|
||||
public NoLanguage Map2Screen
|
||||
public NoLanguage MixteColonne
|
||||
public NoLanguage GetAdrBlock
|
||||
; public NoLanguage GetColBrick
|
||||
public NoLanguage WorldColBrick
|
||||
public NoLanguage WorldColBrickFull
|
||||
public NoLanguage WorldCodeBrick
|
||||
|
||||
;----------------------------------------------------------------------------
|
||||
;*--------------------------------------------------------------------------*
|
||||
|
||||
GetAdrBlock proc ,\
|
||||
numblock:DWORD
|
||||
|
||||
mov ecx, numblock
|
||||
|
||||
mov eax, [TabBlock] ; pto = (ULONG*)TabBlock
|
||||
add eax, [ eax + ecx*4 ] ; TabBlock + pto[numbloc]
|
||||
|
||||
ret
|
||||
|
||||
GetAdrBlock endp
|
||||
|
||||
;*--------------------------------------------------------------------------*
|
||||
|
||||
WorldColBrickFull proc xw:DWORD, yw:DWORD, zw:DWORD, ymax:DWORD
|
||||
|
||||
;' ptc = BufCube
|
||||
|
||||
mov ecx, [BufCube]
|
||||
|
||||
;' + (xm*SIZE_CUBE_Y*2)
|
||||
|
||||
mov eax, xw
|
||||
|
||||
;' xm = (xw+DEMI_BRICK_XZ)/SIZE_BRICK_XZ
|
||||
|
||||
add eax, DEMI_BRICK_XZ ; +256
|
||||
shr eax, 9 ; /512
|
||||
|
||||
mov [XMap], eax
|
||||
|
||||
;' + ym*2
|
||||
|
||||
mov eax, yw
|
||||
|
||||
;' ym = yw/SIZE_BRICK_Y
|
||||
|
||||
sar eax, 8 ; /256
|
||||
mov [YMap], eax
|
||||
|
||||
;' + zm*3200 (SIZE_CUBE_X*SIZE_CUBE_Y*2)
|
||||
|
||||
mov eax, zw
|
||||
|
||||
;' zm = (zw+DEMI_BRICK_XZ)/SIZE_BRICK_XZ
|
||||
|
||||
add eax, DEMI_BRICK_XZ ; +256
|
||||
shr eax, 9 ; /512
|
||||
|
||||
mov [ZMap], eax
|
||||
|
||||
mov eax, [XMap]
|
||||
or eax, eax ; bound
|
||||
jl ovfw
|
||||
cmp eax, 64
|
||||
jge ovfw
|
||||
|
||||
lea eax, [eax*2] ; *2
|
||||
mov edx, eax ; =
|
||||
lea eax, [eax*8] ; *16
|
||||
add edx, eax ; 2 + 16 = 18
|
||||
lea edx, [edx+eax*2] ; 18 + 32 = 50
|
||||
|
||||
add ecx, edx
|
||||
|
||||
mov eax, [YMap]
|
||||
|
||||
cmp eax, -1
|
||||
jle col_1
|
||||
|
||||
lea ecx, [ecx+eax*2]
|
||||
|
||||
mov eax, [ZMap]
|
||||
|
||||
or eax, eax ; check bound
|
||||
jl ovfw
|
||||
cmp eax, 64
|
||||
jge ovfw
|
||||
|
||||
shl eax, 7 ; *128
|
||||
mov edx, eax ; = 128
|
||||
lea eax, [eax*8] ; *1024
|
||||
add edx, eax ; 128 + 1024 = 1152
|
||||
lea edx, [edx+eax*2] ; 1152 + 2048 = 3200
|
||||
|
||||
add ecx, edx
|
||||
|
||||
xor eax, eax
|
||||
mov al, [ecx]
|
||||
|
||||
or al, al
|
||||
jz nocol
|
||||
|
||||
;' if( *ptc != 0 )
|
||||
;' {
|
||||
;' block = (*ptc++) - 1 ;
|
||||
;' adr = GetAdrBlock( block ) ;
|
||||
;' adr += HEADER_BLOCK ;
|
||||
;' adr += (*ptc)<<2 ;/* 4 Bytes to Jump */
|
||||
;' return *adr ;
|
||||
;' }
|
||||
|
||||
mov edx, [TabBlock] ; pto = (ULONG*)TabBlock
|
||||
add edx, [ edx + eax*4 - 4] ; TabBlock + pto[numblock]
|
||||
|
||||
add edx, HEADER_BLOCK
|
||||
|
||||
mov al, byte ptr[ecx+1]
|
||||
lea edx, [edx + eax*4 ]
|
||||
|
||||
mov al, [edx]
|
||||
|
||||
; check full height
|
||||
mov edx, ymax
|
||||
add edx, 255
|
||||
shr edx, 8 ; / 256 hauteur brick
|
||||
|
||||
push ebx
|
||||
mov ebx, [YMap]
|
||||
|
||||
th0: cmp ebx, 24
|
||||
jae notesth
|
||||
|
||||
add ecx, 2
|
||||
inc ebx
|
||||
|
||||
cmp word ptr[ecx], 0
|
||||
jnz hcol
|
||||
dec edx
|
||||
jnz th0
|
||||
|
||||
notesth: pop ebx
|
||||
|
||||
ret
|
||||
|
||||
nocol: ;' return *(ptc+1)
|
||||
|
||||
mov al, byte ptr[ecx+1] ; eventuelle col transparente
|
||||
|
||||
; check full height
|
||||
mov edx, ymax
|
||||
add edx, 255
|
||||
shr edx, 8 ; / 256 hauteur brick
|
||||
|
||||
push ebx
|
||||
mov ebx, [YMap]
|
||||
|
||||
th1: cmp ebx, 24
|
||||
jae notsth
|
||||
|
||||
add ecx, 2
|
||||
inc ebx
|
||||
cmp word ptr[ecx], 0
|
||||
jnz hcol
|
||||
dec edx
|
||||
jnz th1
|
||||
|
||||
notsth: pop ebx
|
||||
|
||||
ret
|
||||
|
||||
col_1: ; mov [YMap], 0 ; test y-1
|
||||
hcol: mov al, 1
|
||||
ret
|
||||
|
||||
ovfw: mov al, 0
|
||||
ret
|
||||
|
||||
WorldColBrickFull endp
|
||||
|
||||
;*--------------------------------------------------------------------------*
|
||||
|
||||
WorldColBrick proc xw:DWORD, yw:DWORD, zw:DWORD
|
||||
|
||||
;' ptc = BufCube
|
||||
mov ecx, [BufCube]
|
||||
|
||||
;' + (xm*SIZE_CUBE_Y*2)
|
||||
mov eax, xw
|
||||
|
||||
;' xm = (xw+DEMI_BRICK_XZ)/SIZE_BRICK_XZ
|
||||
|
||||
add eax, DEMI_BRICK_XZ ; +256
|
||||
shr eax, 9 ; /512
|
||||
mov [XMap], eax
|
||||
|
||||
;' + ym*2
|
||||
mov eax, yw
|
||||
;' ym = yw/SIZE_BRICK_Y
|
||||
|
||||
sar eax, 8 ; /256
|
||||
mov [YMap], eax
|
||||
|
||||
;' + zm*3200 (SIZE_CUBE_X*SIZE_CUBE_Y*2)
|
||||
|
||||
mov eax, zw
|
||||
|
||||
;' zm = (zw+DEMI_BRICK_XZ)/SIZE_BRICK_XZ
|
||||
|
||||
add eax, DEMI_BRICK_XZ ; +256
|
||||
shr eax, 9 ; /512
|
||||
mov [ZMap], eax
|
||||
|
||||
|
||||
|
||||
mov eax, [XMap]
|
||||
|
||||
or eax, eax ; bound
|
||||
jl ovfw
|
||||
cmp eax, 64
|
||||
jge ovfw
|
||||
|
||||
lea eax, [eax*2] ; *2
|
||||
mov edx, eax ; =
|
||||
lea eax, [eax*8] ; *16
|
||||
add edx, eax ; 2 + 16 = 18
|
||||
lea edx, [edx+eax*2] ; 18 + 32 = 50
|
||||
|
||||
add ecx, edx
|
||||
|
||||
mov eax, [YMap]
|
||||
|
||||
cmp eax, -1
|
||||
jle col_1
|
||||
|
||||
or eax, eax ; check bound
|
||||
jl ovfw
|
||||
cmp eax, 24
|
||||
jg ovfw
|
||||
|
||||
lea ecx, [ecx+eax*2]
|
||||
|
||||
mov eax, [ZMap]
|
||||
|
||||
or eax, eax ; check bound
|
||||
jl ovfw
|
||||
cmp eax, 64
|
||||
jge ovfw
|
||||
|
||||
shl eax, 7 ; *128
|
||||
mov edx, eax ; = 128
|
||||
lea eax, [eax*8] ; *1024
|
||||
add edx, eax ; 128 + 1024 = 1152
|
||||
lea edx, [edx+eax*2] ; 1152 + 2048 = 3200
|
||||
|
||||
add ecx, edx
|
||||
|
||||
xor eax, eax
|
||||
mov al, [ecx]
|
||||
|
||||
or al, al
|
||||
jz nocol
|
||||
|
||||
;' if( *ptc != 0 )
|
||||
;' {
|
||||
;' block = (*ptc++) - 1 ;
|
||||
;' adr = GetAdrBlock( block ) ;
|
||||
;' adr += HEADER_BLOCK ;
|
||||
;' adr += (*ptc)<<2 ;/* 4 Bytes to Jump */
|
||||
;' return *adr ;
|
||||
;' }
|
||||
|
||||
mov edx, [TabBlock] ; pto = (ULONG*)TabBlock
|
||||
add edx, [ edx + eax*4 - 4] ; TabBlock + pto[numblock]
|
||||
|
||||
add edx, HEADER_BLOCK
|
||||
|
||||
|
||||
; essai mov al, byte ptr[edx+1] ; code jeu
|
||||
; mov [CodeJeu], al
|
||||
|
||||
|
||||
mov al, byte ptr[ecx+1]
|
||||
lea edx, [edx + eax*4 ]
|
||||
|
||||
mov al, [edx]
|
||||
|
||||
ret
|
||||
|
||||
nocol: ;' return *(ptc+1)
|
||||
|
||||
mov al, byte ptr[ecx+1] ; eventuelle col transparente
|
||||
ret
|
||||
|
||||
col_1: ; mov [YMap], 0 ; test col-1
|
||||
mov al, 1
|
||||
ret
|
||||
|
||||
ovfw: mov al, 0
|
||||
ret
|
||||
|
||||
WorldColBrick endp
|
||||
|
||||
;*--------------------------------------------------------------------------*
|
||||
|
||||
WorldCodeBrick proc xw:DWORD, yw:DWORD, zw:DWORD
|
||||
|
||||
;' ptc = BufCube
|
||||
|
||||
mov ecx, [BufCube]
|
||||
|
||||
;' + (xm*SIZE_CUBE_Y*2)
|
||||
|
||||
mov eax, xw
|
||||
|
||||
;' xm = (xw+DEMI_BRICK_XZ)/SIZE_BRICK_XZ
|
||||
|
||||
add eax, DEMI_BRICK_XZ ; +256
|
||||
shr eax, 9 ; /512
|
||||
|
||||
mov [XMap], eax
|
||||
|
||||
lea eax, [eax*2] ; *2
|
||||
mov edx, eax ; =
|
||||
lea eax, [eax*8] ; *16
|
||||
add edx, eax ; 2 + 16 = 18
|
||||
lea edx, [edx+eax*2] ; 18 + 32 = 50
|
||||
|
||||
add ecx, edx
|
||||
|
||||
;' + ym*2
|
||||
|
||||
mov eax, yw
|
||||
|
||||
cmp eax, -1
|
||||
jle nocode
|
||||
|
||||
;' ym = yw/SIZE_BRICK_Y
|
||||
|
||||
shr eax, 8 ; /256
|
||||
|
||||
mov [YMap], eax
|
||||
lea ecx, [ecx+eax*2]
|
||||
|
||||
;' + zm*3200 (SIZE_CUBE_X*SIZE_CUBE_Y*2)
|
||||
|
||||
mov eax, zw
|
||||
|
||||
;' zm = (zw+DEMI_BRICK_XZ)/SIZE_BRICK_XZ
|
||||
|
||||
add eax, DEMI_BRICK_XZ ; +256
|
||||
shr eax, 9 ; /512
|
||||
|
||||
mov [ZMap], eax
|
||||
|
||||
shl eax, 7 ; *128
|
||||
mov edx, eax ; = 128
|
||||
lea eax, [eax*8] ; *1024
|
||||
add edx, eax ; 128 + 1024 = 1152
|
||||
lea edx, [edx+eax*2] ; 1152 + 2048 = 3200
|
||||
|
||||
add ecx, edx
|
||||
|
||||
xor eax, eax
|
||||
mov al, [ecx]
|
||||
|
||||
or al, al
|
||||
jz nocode
|
||||
|
||||
;' if( *ptc != 0 )
|
||||
;' {
|
||||
;' block = (*ptc++) - 1 ;
|
||||
;' adr = GetAdrBlock( block ) ;
|
||||
;' adr += HEADER_BLOCK ;
|
||||
;' adr += (*ptc)<<2 ;/* 4 Bytes to Jump */
|
||||
;' return *adr ;
|
||||
;' }
|
||||
|
||||
mov edx, [TabBlock] ; pto = (ULONG*)TabBlock
|
||||
add edx, [ edx + eax*4 - 4] ; TabBlock + pto[numblock]
|
||||
|
||||
add edx, HEADER_BLOCK
|
||||
|
||||
mov al, byte ptr[edx+1]
|
||||
ret
|
||||
|
||||
nocode: ;' return *(ptc+1)
|
||||
|
||||
mov al, 0F0h
|
||||
ret
|
||||
|
||||
WorldCodeBrick endp
|
||||
|
||||
;----------------------------------------------------------------------------
|
||||
;----------------------------------------------------------------------------
|
||||
|
||||
Map2Screen proc ,\
|
||||
xm:DWORD, ym:DWORD, zm:DWORD
|
||||
|
||||
mov eax, xm
|
||||
sub eax, zm
|
||||
mov edx, eax
|
||||
sal eax, 4 ; *16
|
||||
lea eax, [eax + edx*8 + 320-8 -23-1]; *24 + XCentre proj
|
||||
mov XScreen, eax
|
||||
|
||||
mov eax, xm
|
||||
add eax, zm
|
||||
mov edx, eax
|
||||
lea eax, [eax*8] ; *8
|
||||
lea eax, [eax+edx*4]; *12
|
||||
mov edx, ym
|
||||
shl edx, 4 ; *16
|
||||
sub edx, ym ; *15
|
||||
sub eax, edx
|
||||
add eax, 240 -25 ; YCentre proj
|
||||
mov YScreen, eax
|
||||
ret
|
||||
Map2Screen endp
|
||||
;----------------------------------------------------------------------------
|
||||
|
||||
DecompColonne proc uses esi edi ebx,\
|
||||
pts:DWORD, ptd:DWORD
|
||||
|
||||
mov esi, pts
|
||||
mov edi, ptd
|
||||
xor ecx, ecx
|
||||
;----------------------------------------------- Get Nb Entity
|
||||
mov bl, [esi] ; BL = NbEntity
|
||||
inc esi
|
||||
;----------------------------------------------- For Every Entity
|
||||
NewEntity: lodsb ; OpCode
|
||||
mov cl, al ; CL = AL
|
||||
and cl, 00111111b ; CL = Repeat
|
||||
inc cl ; One More ( 1 -> 64 )
|
||||
test al, 11000000b ; Incrust ?
|
||||
je JumpZero ; Yes, go...
|
||||
test al, 01000000b ; Diff Brick ?
|
||||
jne WriteDiffBrick ; Yes, go...
|
||||
;----------------------------------------------- Write Same Brick
|
||||
lodsw ; Get NumBlock & PosBlock
|
||||
rep stosw ; Fill Brick
|
||||
dec bl ; Entity--
|
||||
jne NewEntity ; Again
|
||||
ret ; End
|
||||
;----------------------------------------------- Incrust ( Full off Nothing )
|
||||
JumpZero: xor ax, ax ; NumBlock & PosBlock = 0
|
||||
rep stosw ; Fill
|
||||
dec bl ; Entity--
|
||||
jne NewEntity ; Again
|
||||
ret ; End
|
||||
;----------------------------------------------- Write Diff Brick
|
||||
WriteDiffBrick: rep movsw ; Copy NumBlock & PosBlock
|
||||
dec bl ; Entity--
|
||||
jne NewEntity ; Again
|
||||
ret ; end
|
||||
DecompColonne endp
|
||||
;----------------------------------------------------------------------------
|
||||
MixteColonne proc uses esi edi ebx,\
|
||||
pts:DWORD, ptd:DWORD
|
||||
|
||||
mov esi, pts
|
||||
mov edi, ptd
|
||||
xor ecx, ecx
|
||||
;----------------------------------------------- Get Nb Entity
|
||||
mov bl, [esi] ; BL = NbEntity
|
||||
inc esi
|
||||
;----------------------------------------------- For Every Entity
|
||||
NewEntity: lodsb ; OpCode
|
||||
mov cl, al ; CL = AL
|
||||
and cl, 00111111b ; CL = Repeat
|
||||
inc cl ; One More ( 1 -> 64 )
|
||||
test al, 11000000b ; Incrust ?
|
||||
je JumpZero ; Yes, go...
|
||||
test al, 01000000b ; Diff Brick ?
|
||||
jne WriteDiffBrick ; Yes, go...
|
||||
;----------------------------------------------- Write Same Brick
|
||||
lodsw ; Get NumBlock & PosBlock
|
||||
rep stosw ; Fill Brick
|
||||
dec bl ; Entity--
|
||||
jne NewEntity ; Again
|
||||
ret ; End
|
||||
;----------------------------------------------- Incrust ( Full off Nothing )
|
||||
JumpZero: lea edi, [edi+ecx*2]; must add ecx WORD!
|
||||
dec bl ; Entity--
|
||||
jne NewEntity ; Again
|
||||
ret ; End
|
||||
;----------------------------------------------- Write Diff Brick
|
||||
WriteDiffBrick: rep movsw ; Copy NumBlock & PosBlock
|
||||
dec bl ; Entity--
|
||||
jne NewEntity ; Again
|
||||
ret ; end
|
||||
MixteColonne endp
|
||||
;----------------------------------------------------------------------------
|
||||
; The
|
||||
End
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user