275 lines
7.6 KiB
OpenEdge ABL
275 lines
7.6 KiB
OpenEdge ABL
; draw one tetromino block
|
|
setTetrisBlock LDWI SYS_Draw4_30 ; setup 4 pixel SYS routine
|
|
STW giga_sysFn
|
|
LDW colour
|
|
STW giga_sysArg0
|
|
STW giga_sysArg2
|
|
|
|
LDI 0x04 ; 4 lines of 4 pixels per block
|
|
ST jj
|
|
|
|
LD xx ; x*4
|
|
LSLW
|
|
LSLW
|
|
ADDI xOffset ; add origin
|
|
ST xx
|
|
|
|
LD yy ; y * 4
|
|
LSLW
|
|
LSLW
|
|
ADDI yOffset ; add origin
|
|
ST yy
|
|
|
|
setT_loop LDW vbase ; vram address
|
|
ADDW xx
|
|
STW giga_sysArg4
|
|
SYS 30
|
|
|
|
PUSH
|
|
CALL playMidi
|
|
POP
|
|
|
|
LD yy ; yy++
|
|
ADDI 0x01
|
|
ST yy
|
|
|
|
LoopCounter jj setT_loop
|
|
RET
|
|
|
|
|
|
; draw complete tetromino
|
|
drawTetromino GetTetrominoBase index rotation
|
|
DEEK ; get first 2 bytes, (colour)
|
|
STW colour
|
|
|
|
LDW tetrominoBase ; skip w, h, xo, yo
|
|
ADDI 0x05
|
|
STW tetrominoBase
|
|
|
|
LDI 0x04 ; 4 blocks per tetromino
|
|
ST ii
|
|
|
|
drawT_loop LDW tetrominoBase ; x position
|
|
ADDI 0x01
|
|
STW tetrominoBase
|
|
PEEK
|
|
ADDW tx
|
|
ST xx
|
|
BLT drawT_skip ; < 0 skip
|
|
SUBI xTetris
|
|
BGE drawT_skip ; >= xTetris skip
|
|
|
|
LDW tetrominoBase ; y position
|
|
ADDI 0x01
|
|
STW tetrominoBase
|
|
PEEK
|
|
ADDW ty
|
|
SUBW tv ; yy = ty - tv, (offset within tetromino)
|
|
ST yy
|
|
BLT drawT_skip ; < 0 skip
|
|
SUBI yTetris
|
|
BGE drawT_skip ; >= yTetris skip
|
|
|
|
PUSH ; save return address, (this is needed if you nest CALL's)
|
|
CALL setTetrisBlock
|
|
POP ; restore return address
|
|
|
|
drawT_skip LoopCounter ii drawT_loop
|
|
RET
|
|
|
|
|
|
; draw next tetromino
|
|
drawNextTet GetTetrominoBase indexNext rotationNext
|
|
DEEK ; get first 2 bytes, (colour)
|
|
STW colour
|
|
|
|
LDW tetrominoBase ; get w, h
|
|
ADDI 0x02
|
|
DEEK
|
|
STW kk
|
|
|
|
LDW tetrominoBase ; get ox, oy
|
|
ADDI 0x04
|
|
DEEK
|
|
STW mm
|
|
|
|
LDW tetrominoBase ; skip to tetromino offsets
|
|
ADDI 0x05
|
|
STW tetrominoBase
|
|
|
|
LDI 0x04 ; 4 pixels per tetromino
|
|
ST ii
|
|
|
|
drawN_loop LDWI giga_vram + xOffset + xPixels-3 + (yOffset-5)*256
|
|
STW xx
|
|
|
|
PUSH
|
|
CALL drawNextAdjust
|
|
POP
|
|
|
|
drawN_skip LD xx
|
|
STW scratch
|
|
LDW tetrominoBase ; x position
|
|
ADDI 0x01
|
|
STW tetrominoBase
|
|
PEEK
|
|
ADDW scratch
|
|
ST xx
|
|
|
|
LD yy
|
|
STW scratch
|
|
LDW tetrominoBase ; y position
|
|
ADDI 0x01
|
|
STW tetrominoBase
|
|
PEEK
|
|
ADDW scratch
|
|
ST yy
|
|
|
|
LDW colour
|
|
POKE xx
|
|
|
|
PUSH
|
|
CALL playMidi
|
|
POP
|
|
|
|
LoopCounter ii drawN_loop
|
|
RET
|
|
|
|
|
|
drawTetrisField LDWI bgColourW
|
|
STW colour
|
|
|
|
; top horizontal
|
|
PUSH
|
|
CALL drawTFtopH
|
|
POP
|
|
LDWI 0xFF
|
|
STW ty
|
|
LDWI 0xFF
|
|
STW tx
|
|
LDI xTetris + 2
|
|
ST ii
|
|
PUSH
|
|
CALL drawTFhoriz
|
|
POP
|
|
|
|
; bottom horizontal
|
|
LDWI 0x14
|
|
STW ty
|
|
LDWI 0xFF
|
|
STW tx
|
|
LDI xTetris + 2
|
|
ST ii
|
|
PUSH
|
|
CALL drawTFhoriz
|
|
POP
|
|
|
|
PUSH
|
|
CALL drawTFbotH
|
|
POP
|
|
|
|
; left vertical
|
|
LDWI 0xFF
|
|
STW ty
|
|
LDWI 0xFF
|
|
STW tx
|
|
LDI yTetris + 1
|
|
ST ii
|
|
PUSH
|
|
CALL drawTFvert
|
|
POP
|
|
|
|
; right vertical
|
|
LDWI 0xFF
|
|
STW ty
|
|
LDWI xTetris
|
|
STW tx
|
|
LDI yTetris + 1
|
|
ST ii
|
|
PUSH
|
|
CALL drawTFvert
|
|
POP
|
|
RET
|
|
|
|
|
|
drawTFtopH LDWI giga_vram + xOffset - 4 + (yOffset-7)*256
|
|
STW xx
|
|
LDWI giga_vram + xOffset - 4 + (yOffset-6)*256
|
|
STW kk
|
|
LDWI giga_vram + xOffset - 4 + (yOffset-5)*256
|
|
STW mm
|
|
|
|
LDI xPixels + 8
|
|
ST ii
|
|
|
|
drawTF_tl LDI bgColourB
|
|
POKE xx
|
|
POKE kk
|
|
POKE mm
|
|
INC xx
|
|
INC kk
|
|
INC mm
|
|
LoopCounter ii drawTF_tl
|
|
RET
|
|
|
|
|
|
drawTFhoriz LDW ty
|
|
ST yy
|
|
LDW tx
|
|
ST xx
|
|
PUSH
|
|
CALL setTetrisBlock
|
|
POP
|
|
INC tx
|
|
LoopCounter ii drawTFhoriz
|
|
RET
|
|
|
|
|
|
drawTFvert LDW ty
|
|
ST yy
|
|
LDW tx
|
|
ST xx
|
|
PUSH
|
|
CALL setTetrisBlock
|
|
POP
|
|
INC ty
|
|
LoopCounter ii drawTFvert
|
|
RET
|
|
|
|
|
|
drawTFbotH LDWI giga_vram + xOffset - 4 + (yOffset+yPixels + 4)*256
|
|
STW xx
|
|
LDWI giga_vram + xOffset - 4 + (yOffset+yPixels + 5)*256
|
|
STW kk
|
|
LDWI giga_vram + xOffset - 4 + (yOffset+yPixels + 6)*256
|
|
STW mm
|
|
|
|
LDI xPixels + 8
|
|
ST ii
|
|
|
|
drawTF_bl LDI bgColourB
|
|
POKE xx
|
|
POKE kk
|
|
POKE mm
|
|
INC xx
|
|
INC kk
|
|
INC mm
|
|
LoopCounter ii drawTF_bl
|
|
RET
|
|
|
|
|
|
drawNextAdjust LDW kk ; widthheight - oxoy
|
|
SUBW mm
|
|
STW scratch
|
|
|
|
LD scratch ; if width == 2 xx++
|
|
XORI 0x02
|
|
BNE drawNA_height
|
|
INC xx
|
|
|
|
drawNA_height LD scratch + 1 ; if height == 2 yy++
|
|
XORI 0x02
|
|
BNE drawNA_skip
|
|
INC yy
|
|
|
|
drawNA_skip RET |