110 lines
3.1 KiB
OpenEdge ABL
110 lines
3.1 KiB
OpenEdge ABL
; checks the tetris playfield for lines
|
|
checkLines LDI maxLines - 1
|
|
ST ii
|
|
LDWI 0x00
|
|
STW numLines
|
|
|
|
ii_loop LDI yTetris - 1
|
|
ST ll
|
|
|
|
ll_loop LDI xTetris - 1
|
|
ST kk
|
|
|
|
; check for solid line
|
|
kk_loop0 LDW kk
|
|
STW xx
|
|
PUSH ; save return address, (this is needed if you nest CALL's)
|
|
CALL getTetrisBlock ; check for occupied block
|
|
POP ; restore return address
|
|
|
|
LDW result
|
|
BEQ skip_kk
|
|
LoopCounter1 kk kk_loop0
|
|
|
|
; found a line
|
|
INC numLines
|
|
PUSH
|
|
CALL moveLines
|
|
POP
|
|
|
|
skip_kk LoopCounter1 ll ll_loop
|
|
LoopCounter1 ii ii_loop
|
|
|
|
LDI 0x00
|
|
POKE xScroll
|
|
RET
|
|
|
|
|
|
; copy previous line to current line
|
|
moveLines LD ll
|
|
ST nn
|
|
nn_loop LDI xTetris - 1
|
|
ST mm
|
|
mm_loop LD nn ; get block colour
|
|
SUBI 0x01
|
|
ST yy
|
|
LD mm
|
|
ST xx
|
|
PUSH
|
|
CALL getTetrisBlock
|
|
POP
|
|
|
|
LD result ; set block colour
|
|
ST colour
|
|
ST colour + 1
|
|
|
|
LDW mm
|
|
STW xx
|
|
PUSH ; save return address, (this is needed if you nest CALL's)
|
|
CALL setTetrisBlock
|
|
POP ; restore return address
|
|
|
|
LoopCounter1 mm mm_loop
|
|
|
|
PUSH
|
|
CALL shakeScreen
|
|
POP
|
|
|
|
LD nn
|
|
SUBI 0x01
|
|
ST nn
|
|
;XORI 0x01
|
|
BNE nn_loop
|
|
|
|
; erase top line
|
|
LDI xTetris - 1
|
|
ST kk
|
|
kk_loop1 LDI 0x00
|
|
ST yy
|
|
LD kk
|
|
ST xx
|
|
|
|
LDWI 0x0000
|
|
STW colour
|
|
|
|
PUSH ; save return address, (this is needed if you nest CALL's)
|
|
CALL setTetrisBlock
|
|
POP ; restore return address
|
|
|
|
LoopCounter1 kk kk_loop1
|
|
RET
|
|
|
|
|
|
shakeScreen LD giga_rand0
|
|
ANDI 0x03
|
|
BEQ shake_left
|
|
XORI 0x01
|
|
BEQ shake_right
|
|
|
|
LDI 0x00
|
|
POKE xScroll
|
|
RET
|
|
|
|
shake_right LDI 0x01
|
|
POKE xScroll
|
|
RET
|
|
|
|
shake_left LDI 0xFF
|
|
POKE xScroll
|
|
RET
|