1502 lines
86 KiB
Plaintext
1502 lines
86 KiB
Plaintext
_startAddress_ EQU 0x0200
|
|
|
|
; Internal Variables
|
|
serialRawPrev EQU 0x0081
|
|
register0 EQU 0x0082
|
|
register1 EQU register0 + 0x02
|
|
register2 EQU register0 + 0x04
|
|
register3 EQU register0 + 0x06
|
|
register4 EQU register0 + 0x08
|
|
register5 EQU register0 + 0x0A
|
|
register6 EQU register0 + 0x0C
|
|
register7 EQU register0 + 0x0E
|
|
register8 EQU register0 + 0x10
|
|
register9 EQU register0 + 0x12
|
|
register10 EQU register0 + 0x14
|
|
register11 EQU register0 + 0x16
|
|
register12 EQU register0 + 0x18
|
|
register13 EQU register0 + 0x1A
|
|
register14 EQU register0 + 0x1C
|
|
register15 EQU register0 + 0x1E
|
|
fgbgColour EQU register0 + 0x20
|
|
cursorXY EQU register0 + 0x22
|
|
midiStream EQU register0 + 0x24
|
|
midiDelay EQU register0 + 0x26
|
|
miscFlags EQU register0 + 0x28
|
|
timerTick EQU register0 + 0x2A
|
|
timerPrev EQU register0 + 0x2C
|
|
|
|
; Internal Constants
|
|
ENABLE_SCROLL_BIT EQU 0x0001
|
|
ON_BOTTOM_ROW_BIT EQU 0x0002
|
|
DISABLE_CLIP_BIT EQU 0x0004
|
|
ENABLE_SCROLL_MSK EQU 0xfffe
|
|
ON_BOTTOM_ROW_MSK EQU 0xfffd
|
|
DISABLE_CLIP_MSK EQU 0xfffb
|
|
|
|
; Internal Buffers
|
|
regsWorkArea EQU 0x0000
|
|
textWorkArea EQU 0x7fa0
|
|
|
|
; Includes
|
|
%includePath "../../at67/gbas/runtime"
|
|
%include util.i
|
|
%include gigatron.i
|
|
%include macros.i
|
|
|
|
; Labels
|
|
_entryPoint_ EQU 0x0200
|
|
_loop EQU 0x025f
|
|
_updateFish EQU 0x0270
|
|
_drawFish EQU 0x04ae
|
|
_randomFish EQU 0x0523
|
|
_setGravelMix EQU 0x054e
|
|
_drawGravel EQU 0x05c8
|
|
_drawTank EQU 0x0620
|
|
_checkInput EQU 0x0640
|
|
_initFish EQU 0x0694
|
|
_next_0x026e EQU 0x0275
|
|
_elseif_0x02f9 EQU 0x02d0
|
|
_else_0x0323 EQU 0x02ee
|
|
_page_0x0300 EQU 0x0300
|
|
_endif_0x0336 EQU 0x0308
|
|
_else_0x03b5 EQU 0x0359
|
|
_endif_0x03d8 EQU 0x036e
|
|
_elseif_0x03dd EQU 0x0373
|
|
_else_0x045e EQU 0x03c6
|
|
_endif_0x0481 EQU 0x03db
|
|
_page_0x0400 EQU 0x0400
|
|
_else_0x04dd EQU 0x0428
|
|
_endif_0x0500 EQU 0x043d
|
|
_elseif_0x0505 EQU 0x0442
|
|
_else_0x0563 EQU 0x0480
|
|
_endif_0x0586 EQU 0x0495
|
|
_next_0x05a4 EQU 0x04b3
|
|
_else_0x05fa EQU 0x04e5
|
|
_page_0x0500 EQU 0x0500
|
|
_endif_0x0631 EQU 0x0513
|
|
_next_0x0646 EQU 0x0528
|
|
_next_0x0677 EQU 0x0553
|
|
_elseif_0x06a7 EQU 0x0575
|
|
_elseif_0x06d9 EQU 0x0599
|
|
_endif_0x0706 EQU 0x05b8
|
|
_next_0x0720 EQU 0x05d2
|
|
_next_0x0724 EQU 0x05d6
|
|
_page_0x0600 EQU 0x0600
|
|
_elseif_0x07b9 EQU 0x0667
|
|
_endif_0x07e9 EQU 0x068d
|
|
_endif_0x07ee EQU 0x0692
|
|
_next_0x07f5 EQU 0x0699
|
|
_page_0x08a0 EQU 0x08a0
|
|
_page_0x09a0 EQU 0x09a0
|
|
_elseif_0x0906 EQU 0x09a4
|
|
_page_0x0aa0 EQU 0x0aa0
|
|
_elseif_0x09fd EQU 0x0af1
|
|
_page_0x0ba0 EQU 0x0ba0
|
|
_page_0x0ca0 EQU 0x0ca0
|
|
_endif_0x0aef EQU 0x0ce5
|
|
|
|
; Constants
|
|
_MAXFISH EQU 0x0008
|
|
_TETRA EQU 0x0000
|
|
_RASBORA EQU 0x0001
|
|
_MOLLY EQU 0x0002
|
|
_SWIMRIGHT EQU 0x0000
|
|
_SWIMLEFT EQU 0x0001
|
|
_SWIMUP EQU 0x0000
|
|
_SWIMDOWN EQU 0x0001
|
|
_SWIMFWD EQU 0x0002
|
|
_MIX1 EQU 0x0000
|
|
_MIX2 EQU 0x0001
|
|
_MIX3 EQU 0x0002
|
|
_TETRA1 EQU 0x0000
|
|
_TETRA2 EQU 0x0001
|
|
_RASBORA1 EQU 0x0002
|
|
_RASBORA2 EQU 0x0003
|
|
_MOLLY1 EQU 0x0004
|
|
_MOLLY2 EQU 0x0005
|
|
|
|
; Global Variables
|
|
_gravelType EQU 0x0030
|
|
_inputDevice EQU 0x0032
|
|
_i EQU 0x0034
|
|
_fishRandom EQU 0x0036
|
|
_x EQU 0x0038
|
|
_y EQU 0x003a
|
|
|
|
; Local Variables
|
|
|
|
; Arrays
|
|
_fishType_array EQU 0x7dc6
|
|
_fishType_array DB 0x00 0x00 0x00 0x00 0x00 0x01 0x01 0x02 0x02
|
|
_fishSprite_array EQU 0x7dbd
|
|
_fishX_array EQU 0x7db4
|
|
_fishY_array EQU 0x7dab
|
|
_fishXmax_array EQU 0x7da2
|
|
_fishXmin_array EQU 0x7cc6
|
|
_fishYmax_array EQU 0x7cbd
|
|
_fishYmin_array EQU 0x7cb4
|
|
_fishThink1_array EQU 0x7cab
|
|
_fishThink2_array EQU 0x7ca2
|
|
_fishTimer_array EQU 0x7bc6
|
|
_gravelMix1_array EQU 0x7bbe
|
|
_gravelMix1_array DB 0x00 0x06 0x16 0x0a 0x2f 0x2a 0x2f 0x2f
|
|
_gravelMix2_array EQU 0x7bb6
|
|
_gravelMix2_array DB 0x00 0x06 0x16 0x0a 0x2f 0x2a 0x03 0x03
|
|
_gravelMix3_array EQU 0x7bae
|
|
_gravelMix3_array DB 0x00 0x06 0x16 0x0a 0x2f 0x31 0x21 0x21
|
|
_tankGravel_array EQU 0x7ba6
|
|
|
|
; Strings
|
|
|
|
; Constant Strings
|
|
|
|
; Data
|
|
|
|
; Time
|
|
|
|
; Define Bytes
|
|
|
|
; Define Words
|
|
|
|
; Define Images
|
|
|
|
; Define Loader Image Chunks
|
|
|
|
; Define Midis
|
|
|
|
; Define Sprites
|
|
def_sprites_0x7dcf EQU 0x7dcf
|
|
def_sprites_0x7dcf DB 32 32 32 32 32 32 32 32 32 32 32 32 32 32 21 32 32 32 32 21 16 1 18 21 32 21 16 1 17 18 32 32 21 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 248
|
|
def_sprites_0x7ccf EQU 0x7ccf
|
|
def_sprites_0x7ccf DB 32 32 32 32 32 32 32 32 32 16 32 32 32 21 37 21 21 32 41 41 41 40 41 37 2 2 2 6 41 41 17 2 2 2 2 2 16 37 37 22 26 26 32 32 32 32 32 32 248
|
|
def_sprites_0x7bcf EQU 0x7bcf
|
|
def_sprites_0x7bcf DB 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 21 21 37 32 32 32 40 40 0 36 36 32 6 6 6 22 21 32 26 22 22 37 32 32 32 32 32 32 32 32 248
|
|
def_sprites_0x7ac3 EQU 0x7ac3
|
|
def_sprites_0x7ac3 DB 32 32 32 32 32 32 32 41 41 36 32 32 32 42 42 42 37 32 32 37 42 42 26 26 32 32 36 42 42 26 32 32 32 42 46 26 32 32 42 46 26 26 32 41 42 26 37 32 32 37 37 36 32 32 32 32 32 32 32 32 246
|
|
def_sprites_0x79c3 EQU 0x79c3
|
|
def_sprites_0x79c3 DB 32 32 32 32 32 32 32 32 32 21 21 21 32 32 32 32 42 26 37 32 32 32 42 26 10 26 26 26 22 21 10 26 26 26 26 22 37 37 42 46 42 26 32 32 42 47 46 42 32 32 32 42 37 37 32 32 32 32 32 32 246
|
|
def_sprites_0x78c3 EQU 0x78c3
|
|
def_sprites_0x78c3 DB 32 32 32 32 32 32 21 21 21 32 32 32 26 26 42 42 42 37 26 26 26 26 26 26 21 0 26 26 26 21 0 0 27 27 26 26 26 1 26 26 26 21 42 21 21 42 21 21 42 42 37 37 37 37 32 32 32 32 32 32 246
|
|
def_sprites_0x77c3 EQU 0x77c3
|
|
def_sprites_0x77c3 DB 32 32 32 32 32 32 32 32 32 32 32 32 37 32 32 32 32 32 26 37 37 32 32 32 47 47 47 42 37 32 47 0 47 26 42 32 47 47 47 26 37 32 42 37 37 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 246
|
|
def_sprites_0x76bd EQU 0x76bd
|
|
def_sprites_0x76bd DB 32 32 32 32 32 32 32 37 41 37 32 32 32 32 37 21 22 37 32 32 17 21 22 6 32 32 37 22 22 22 32 32 37 22 23 6 32 32 17 21 22 6 32 32 37 37 37 37 32 37 41 37 32 32 32 32 32 32 32 32 32 32 32 32 32 32 245
|
|
def_sprites_0x75bd EQU 0x75bd
|
|
def_sprites_0x75bd DB 32 32 32 32 32 32 32 32 32 17 21 21 37 17 21 21 22 22 7 7 6 6 7 7 7 6 6 7 7 11 6 7 23 7 7 7 6 22 6 22 6 7 37 37 37 42 22 22 32 32 32 37 37 21 32 32 32 32 32 37 32 32 32 32 32 32 245
|
|
def_sprites_0x74bd EQU 0x74bd
|
|
def_sprites_0x74bd DB 32 32 32 32 32 32 21 21 32 32 32 32 22 6 6 22 37 32 7 11 11 6 22 22 7 7 7 7 6 11 7 7 7 7 6 6 7 7 7 7 7 7 6 6 7 6 42 23 22 22 22 42 58 42 21 42 42 42 42 42 32 32 32 32 32 32 245
|
|
def_sprites_0x73bd EQU 0x73bd
|
|
def_sprites_0x73bd DB 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 22 38 32 32 32 32 7 7 23 38 32 32 7 0 42 7 22 32 7 27 42 22 38 32 22 22 42 37 32 32 37 37 32 32 32 32 32 32 32 32 32 32 245
|
|
|
|
; Define Fonts
|
|
|
|
; Lookup Tables
|
|
_spriteLut_0x7ab5 EQU 0x7ab5
|
|
_spriteLut_0x7ab5 DW 0x7dcf 0x0000 0x7ccf 0x0006 0x7bcf 0x000c 0x0000
|
|
_spriteLut_0x7aa7 EQU 0x7aa7
|
|
_spriteLut_0x7aa7 DW 0x7dcf 0x000c 0x7ccf 0x0006 0x7bcf 0x0000 0x0000
|
|
_spriteLut_0x79b1 EQU 0x79b1
|
|
_spriteLut_0x79b1 DW 0x7ac3 0x0000 0x79c3 0x0006 0x78c3 0x000c 0x77c3 0x0012 0x0000
|
|
_spriteLut_0x78b1 EQU 0x78b1
|
|
_spriteLut_0x78b1 DW 0x7ac3 0x0012 0x79c3 0x000c 0x78c3 0x0006 0x77c3 0x0000 0x0000
|
|
_spriteLut_0x77b1 EQU 0x77b1
|
|
_spriteLut_0x77b1 DW 0x76bd 0x0000 0x75bd 0x0006 0x74bd 0x000c 0x73bd 0x0012 0x0000
|
|
_spriteLut_0x76ab EQU 0x76ab
|
|
_spriteLut_0x76ab DW 0x76bd 0x0012 0x75bd 0x000c 0x74bd 0x0006 0x73bd 0x0000 0x0000
|
|
_spritesLut_ EQU 0x79a5
|
|
_spritesLut_ DW 0x7ab5 0x7aa7 0x79b1 0x78b1 0x77b1 0x76ab
|
|
|
|
; Code
|
|
_entryPoint_ LDI 0x28
|
|
STW romType
|
|
RomCheck
|
|
Initialise
|
|
InitEqOp
|
|
InitLtOp
|
|
InitGtOp ; INIT
|
|
|
|
ClearVertBlinds
|
|
LDI 2
|
|
STW graphicsMode
|
|
ScanlineMode ; cls : mode 2
|
|
|
|
LD 0x21
|
|
ORI 0x0003
|
|
ST 33 ; poke &h21, peek(&h21) OR 3
|
|
|
|
SoundAllOff ; sound off
|
|
|
|
ClearVertBlinds ; cls
|
|
|
|
LDI 0
|
|
STW _gravelType ; gravelType = MIX1
|
|
|
|
LDI 255
|
|
STW _inputDevice ; inputDevice = 255
|
|
|
|
LDWI _drawTank
|
|
CALL giga_vAC ; gosub drawTank
|
|
|
|
LDWI _drawGravel
|
|
CALL giga_vAC ; gosub drawGravel
|
|
|
|
LDWI _initFish
|
|
CALL giga_vAC ; gosub initFish
|
|
|
|
_loop LDWI _updateFish
|
|
CALL giga_vAC ; gosub updateFish
|
|
|
|
LDWI _drawFish
|
|
CALL giga_vAC ; gosub drawFish
|
|
|
|
LDWI _checkInput
|
|
CALL giga_vAC ; gosub checkInput
|
|
|
|
BRA _loop ; goto &loop
|
|
|
|
_updateFish PUSH
|
|
LDI 0
|
|
STW _i ; for i = 0 to (MAXFISH -1)
|
|
|
|
_next_0x026e LDWI 0x7bc6
|
|
ADDW _i
|
|
PEEK
|
|
ADDI 1
|
|
STW memValue
|
|
LDWI 0x7bc6
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishTimer(i) = fishTimer(i) + 1
|
|
|
|
LDWI 0x7bc6
|
|
ADDW _i
|
|
PEEK
|
|
SUBI 100
|
|
CALL convertGtOpAddr
|
|
JumpFalse _endif_0x0336 3 ; if fishTimer(i) > 100
|
|
|
|
LDWI 0x7bc6
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 0
|
|
POKE memAddr ; fishTimer(i) = 0
|
|
|
|
LDI 0x64
|
|
RandMod
|
|
STW _fishRandom ; fishRandom = rnd(100)
|
|
|
|
LDW _fishRandom
|
|
SUBI 10
|
|
CALL convertLtOpAddr
|
|
JumpFalse _elseif_0x02f9 0 ; if fishRandom < 10
|
|
|
|
LDWI 0x7ca2
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 1
|
|
POKE memAddr
|
|
LDWI _endif_0x0336
|
|
CALL giga_vAC ; fishThink2(i) = SWIMDOWN
|
|
|
|
_elseif_0x02f9 LDW _fishRandom
|
|
SUBI 20
|
|
CALL convertLtOpAddr
|
|
JumpFalse _else_0x0323 1 ; elseif fishRandom < 20
|
|
|
|
LDWI 0x7ca2
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 0
|
|
POKE memAddr
|
|
LDWI _endif_0x0336
|
|
CALL giga_vAC ; fishThink2(i) = SWIMUP
|
|
|
|
_else_0x0323 LDWI 0x7ca2
|
|
ADDW _i
|
|
STLW 0xFE
|
|
LDWI _page_0x0300
|
|
CALL giga_vAC
|
|
_page_0x0300 LDLW 0xFE
|
|
STW memAddr
|
|
LDI 2
|
|
POKE memAddr ; fishThink2(i) = SWIMFWD
|
|
|
|
_endif_0x0336 LDWI 0x7cab
|
|
ADDW _i
|
|
PEEK
|
|
JumpEQ _elseif_0x03dd 6 ; if fishThink1(i) &= SWIMRIGHT
|
|
|
|
LDWI 0x7db4
|
|
ADDW _i
|
|
PEEK
|
|
STW 0xe8
|
|
LDWI 0x7da2
|
|
ADDW _i
|
|
PEEK
|
|
STW 0xea
|
|
LDW 0xe8
|
|
SUBW 0xea
|
|
CALL convertGtOpAddr
|
|
JumpFalse _else_0x03b5 4 ; if fishX(i) > fishXmax(i)
|
|
|
|
LDWI 0x7dbd
|
|
ADDW _i
|
|
PEEK
|
|
ADDI 1
|
|
STW memValue
|
|
LDWI 0x7dbd
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishSprite(i) = fishSprite(i) + 1
|
|
|
|
LDWI 0x7cab
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 1
|
|
POKE memAddr
|
|
LDWI _endif_0x03d8
|
|
CALL giga_vAC ; fishThink1(i) = SWIMLEFT
|
|
|
|
_else_0x03b5 LDWI 0x7db4
|
|
ADDW _i
|
|
PEEK
|
|
ADDI 1
|
|
STW memValue
|
|
LDWI 0x7db4
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishX(i) = fishX(i) + 1
|
|
|
|
_endif_0x03d8 LDWI _endif_0x0481
|
|
CALL giga_vAC ; endif
|
|
|
|
_elseif_0x03dd LDWI 0x7cab
|
|
ADDW _i
|
|
PEEK
|
|
XORI 1
|
|
JumpEQ _endif_0x0481 9 ; elseif fishThink1(i) &= SWIMLEFT
|
|
|
|
LDWI 0x7db4
|
|
ADDW _i
|
|
PEEK
|
|
STW 0xe8
|
|
LDWI 0x7cc6
|
|
ADDW _i
|
|
PEEK
|
|
STW 0xea
|
|
LDW 0xe8
|
|
SUBW 0xea
|
|
CALL convertLtOpAddr
|
|
JumpFalse _else_0x045e 7 ; if fishX(i) < fishXmin(i)
|
|
|
|
LDWI 0x7dbd
|
|
ADDW _i
|
|
PEEK
|
|
SUBI 1
|
|
STW memValue
|
|
LDWI 0x7dbd
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishSprite(i) = fishSprite(i) - 1
|
|
|
|
LDWI 0x7cab
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 0
|
|
POKE memAddr
|
|
LDWI _endif_0x0481
|
|
CALL giga_vAC ; fishThink1(i) = SWIMRIGHT
|
|
|
|
_else_0x045e LDWI 0x7db4
|
|
ADDW _i
|
|
PEEK
|
|
SUBI 1
|
|
STW memValue
|
|
LDWI 0x7db4
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishX(i) = fishX(i) - 1
|
|
|
|
_endif_0x0481 LDWI 0x7ca2
|
|
ADDW _i
|
|
PEEK
|
|
JumpEQ _elseif_0x0505 12 ; if fishThink2(i) &= SWIMUP
|
|
|
|
LDWI 0x7dab
|
|
ADDW _i
|
|
PEEK
|
|
STW 0xe8
|
|
STLW 0xFE
|
|
LDWI _page_0x0400
|
|
CALL giga_vAC
|
|
_page_0x0400 LDLW 0xFE
|
|
LDWI 0x7cb4
|
|
ADDW _i
|
|
PEEK
|
|
STW 0xea
|
|
LDW 0xe8
|
|
SUBW 0xea
|
|
CALL convertLtOpAddr
|
|
JumpFalse _else_0x04dd 10 ; if fishY(i) < fishYmin(i)
|
|
|
|
LDWI 0x7ca2
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 1
|
|
POKE memAddr
|
|
LDWI _endif_0x0500
|
|
CALL giga_vAC ; fishThink2(i) = SWIMDOWN
|
|
|
|
_else_0x04dd LDWI 0x7dab
|
|
ADDW _i
|
|
PEEK
|
|
SUBI 1
|
|
STW memValue
|
|
LDWI 0x7dab
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishY(i) = fishY(i) - 1
|
|
|
|
_endif_0x0500 LDWI _endif_0x0586
|
|
CALL giga_vAC ; endif
|
|
|
|
_elseif_0x0505 LDWI 0x7ca2
|
|
ADDW _i
|
|
PEEK
|
|
XORI 1
|
|
JumpEQ _endif_0x0586 15 ; elseif fishThink2(i) &= SWIMDOWN
|
|
|
|
LDWI 0x7dab
|
|
ADDW _i
|
|
PEEK
|
|
STW 0xe8
|
|
LDWI 0x7cbd
|
|
ADDW _i
|
|
PEEK
|
|
STW 0xea
|
|
LDW 0xe8
|
|
SUBW 0xea
|
|
CALL convertGtOpAddr
|
|
JumpFalse _else_0x0563 13 ; if fishY(i) > fishYmax(i)
|
|
|
|
LDWI 0x7ca2
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 0
|
|
POKE memAddr
|
|
LDWI _endif_0x0586
|
|
CALL giga_vAC ; fishThink2(i) = SWIMUP
|
|
|
|
_else_0x0563 LDWI 0x7dab
|
|
ADDW _i
|
|
PEEK
|
|
ADDI 1
|
|
STW memValue
|
|
LDWI 0x7dab
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishY(i) = fishY(i) + 1
|
|
|
|
_endif_0x0586 ForNextFarInc _i _next_0x026e 7 ; next i
|
|
|
|
LDI 2
|
|
STW waitVBlankNum
|
|
WaitVBlanks ; wait 2
|
|
|
|
Return ; return
|
|
|
|
_drawFish PUSH
|
|
LDI 0
|
|
STW _i ; for i = 0 to (MAXFISH -1)
|
|
|
|
_next_0x05a4 LDWI 0x7cab
|
|
ADDW _i
|
|
PEEK
|
|
JumpEQ _else_0x05fa 16 ; if fishThink1(i) &= SWIMRIGHT
|
|
|
|
LDWI 0x7dbd
|
|
ADDW _i
|
|
PEEK
|
|
STW spriteId
|
|
LDWI 0x7db4
|
|
ADDW _i
|
|
PEEK
|
|
ST spriteXY
|
|
LDWI 0x7dab
|
|
ADDW _i
|
|
PEEK
|
|
ADDI 8
|
|
ST spriteXY + 1
|
|
DrawSprite
|
|
LDWI _endif_0x0631
|
|
CALL giga_vAC ; sprite noFlip, fishSprite(i), fishX(i), fishY(i)
|
|
|
|
_else_0x05fa LDWI 0x7dbd
|
|
ADDW _i
|
|
PEEK
|
|
STW spriteId
|
|
LDWI 0x7db4
|
|
ADDW _i
|
|
PEEK
|
|
STLW 0xFE
|
|
LDWI _page_0x0500
|
|
CALL giga_vAC
|
|
_page_0x0500 LDLW 0xFE
|
|
ST spriteXY
|
|
LDWI 0x7dab
|
|
ADDW _i
|
|
PEEK
|
|
ADDI 8
|
|
ST spriteXY + 1
|
|
DrawSpriteX ; sprite FlipX, fishSprite(i), fishX(i), fishY(i)
|
|
|
|
_endif_0x0631 ForNextFarInc _i _next_0x05a4 7 ; next i
|
|
|
|
Return ; return
|
|
|
|
_randomFish PUSH
|
|
LDI 0
|
|
STW _i ; for i = 0 to (MAXFISH -1)
|
|
|
|
_next_0x0646 LDI 0x03
|
|
RandMod
|
|
STW memValue
|
|
LDWI 0x7dc6
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishType(i) = rnd(3)
|
|
|
|
ForNextFarInc _i _next_0x0646 7 ; next i
|
|
|
|
Return ; return
|
|
|
|
_setGravelMix PUSH
|
|
LDI 0
|
|
STW _i ; for i = 0 to 7
|
|
|
|
_next_0x0677 LDW _gravelType
|
|
JumpEQ _elseif_0x06a7 18 ; if gravelType &= MIX1
|
|
|
|
LDWI 0x7bbe
|
|
ADDW _i
|
|
PEEK
|
|
STW memValue
|
|
LDWI 0x7ba6
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr
|
|
LDWI _endif_0x0706
|
|
CALL giga_vAC ; tankGravel(i) = gravelMix1(i)
|
|
|
|
_elseif_0x06a7 LDW _gravelType
|
|
XORI 1
|
|
JumpEQ _elseif_0x06d9 19 ; elseif gravelType &= MIX2
|
|
|
|
LDWI 0x7bb6
|
|
ADDW _i
|
|
PEEK
|
|
STW memValue
|
|
LDWI 0x7ba6
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr
|
|
LDWI _endif_0x0706
|
|
CALL giga_vAC ; tankGravel(i) = gravelMix2(i)
|
|
|
|
_elseif_0x06d9 LDW _gravelType
|
|
XORI 2
|
|
JumpEQ _endif_0x0706 20 ; elseif gravelType &= MIX3
|
|
|
|
LDWI 0x7bae
|
|
ADDW _i
|
|
PEEK
|
|
STW memValue
|
|
LDWI 0x7ba6
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; tankGravel(i) = gravelMix3(i)
|
|
|
|
_endif_0x0706 ForNextFarInc _i _next_0x0677 7 ; next i
|
|
|
|
Return ; return
|
|
|
|
_drawGravel PUSH
|
|
LDWI _setGravelMix
|
|
CALL giga_vAC ; gosub setGravelMix
|
|
|
|
LDI 0
|
|
STW _x ; for x = 0 to 159
|
|
|
|
_next_0x0720 LDI 110
|
|
STW _y ; for y = 110 to 119
|
|
|
|
_next_0x0724 LDW _x
|
|
ST drawPixel_xy
|
|
LDW _y
|
|
ST drawPixel_xy + 1
|
|
Rand
|
|
ANDI 0x0007
|
|
STW memIndex0
|
|
LDWI 0x7ba6
|
|
ADDW memIndex0
|
|
PEEK
|
|
ST fgbgColour + 1
|
|
DrawPixel ; pset x, y, tankGravel(rnd(0) AND 7)
|
|
|
|
STLW 0xFE
|
|
LDWI _page_0x0600
|
|
CALL giga_vAC
|
|
_page_0x0600 LDLW 0xFE
|
|
ForNextFarInc _y _next_0x0724 119 ; next y
|
|
|
|
ForNextFarInc _x _next_0x0720 159 ; next x
|
|
|
|
Return ; return
|
|
|
|
_drawTank PUSH
|
|
LDI 32
|
|
ST fgbgColour ; set BG_COLOUR, 32
|
|
|
|
LDI 32
|
|
ST fgbgColour + 1 ; set FG_COLOUR, 32
|
|
|
|
LDI 0
|
|
STW drawRectF_x1
|
|
LDI 0
|
|
STW drawRectF_y1
|
|
LDI 159
|
|
STW drawRectF_x2
|
|
LDI 109
|
|
STW drawRectF_y2
|
|
DrawRectF ; rectf 0, 0, 159, 109
|
|
|
|
Return ; return
|
|
|
|
_checkInput PUSH
|
|
LD giga_buttonState
|
|
STW _inputDevice ; inputDevice = get("BUTTON_STATE")
|
|
|
|
LDW _inputDevice
|
|
XORI 127
|
|
CALL convertEqOpAddr
|
|
JumpFalse _elseif_0x07b9 21 ; if inputDevice = 127
|
|
|
|
LDWI _drawTank
|
|
CALL giga_vAC ; gosub drawTank
|
|
|
|
LDWI _randomFish
|
|
CALL giga_vAC ; gosub randomFish
|
|
|
|
LDWI _initFish
|
|
CALL giga_vAC
|
|
LDWI _endif_0x07ee
|
|
CALL giga_vAC ; gosub initFish
|
|
|
|
_elseif_0x07b9 LDW _inputDevice
|
|
XORI 191
|
|
CALL convertEqOpAddr
|
|
JumpFalse _endif_0x07ee 23 ; elseif inputDevice = 191
|
|
|
|
LDW _gravelType
|
|
ADDI 1
|
|
STW _gravelType ; gravelType = gravelType + 1
|
|
|
|
LDW _gravelType
|
|
SUBI 2
|
|
CALL convertGtOpAddr
|
|
JumpFalse _endif_0x07e9 22 ; if gravelType > 2
|
|
|
|
LDI 0
|
|
STW _gravelType ; gravelType = 0
|
|
|
|
_endif_0x07e9 LDWI _drawGravel
|
|
CALL giga_vAC ; gosub drawGravel
|
|
|
|
_endif_0x07ee Return ; return
|
|
|
|
_initFish PUSH
|
|
LDI 0
|
|
STW _i ; for i = 0 to (MAXFISH -1)
|
|
|
|
_next_0x07f5 LDI 0x64
|
|
RandMod
|
|
STW memValue
|
|
LDWI 0x7bc6
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishTimer(i) = rnd(100)
|
|
|
|
LDWI 0x7dc6
|
|
ADDW _i
|
|
PEEK
|
|
JumpEQ _elseif_0x0906 24 ; if fishType(i) &= TETRA
|
|
|
|
LDWI 0x7da2
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 140
|
|
POKE memAddr ; fishXmax(i) = 140
|
|
|
|
LDWI 0x7cc6
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 3
|
|
POKE memAddr ; fishXmin(i) = 3
|
|
|
|
LDWI 0x7cbd
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 95
|
|
POKE memAddr ; fishYmax(i) = 95
|
|
|
|
LDWI 0x7cb4
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 5
|
|
POKE memAddr ; fishYmin(i) = 5
|
|
|
|
LDI 0x87
|
|
RandMod
|
|
STW memValue
|
|
LDWI 0x7db4
|
|
STLW 0xFE
|
|
LDWI _page_0x08a0
|
|
CALL giga_vAC
|
|
_page_0x08a0 LDLW 0xFE
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishX(i) = rnd(135)
|
|
|
|
LDI 0x5a
|
|
RandMod
|
|
STW memValue
|
|
LDWI 0x7dab
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishY(i) = rnd(90)
|
|
|
|
LDI 0x02
|
|
RandMod
|
|
STW memValue
|
|
LDWI 0x7cab
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishThink1(i) = rnd(2)
|
|
|
|
LDWI 0x7ca2
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 2
|
|
POKE memAddr ; fishThink2(i) = SWIMFWD
|
|
|
|
LDWI 0x7cab
|
|
ADDW _i
|
|
PEEK
|
|
STW memValue
|
|
LDWI 0x7dbd
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr
|
|
LDWI _endif_0x0aef
|
|
STLW 0xFE
|
|
LDWI _page_0x09a0
|
|
CALL giga_vAC
|
|
_page_0x09a0 LDLW 0xFE
|
|
CALL giga_vAC ; fishSprite(i) = TETRA1 + fishThink1(i)
|
|
|
|
_elseif_0x0906 LDWI 0x7dc6
|
|
ADDW _i
|
|
PEEK
|
|
XORI 1
|
|
JumpEQ _elseif_0x09fd 25 ; elseif fishType(i) &= RASBORA
|
|
|
|
LDWI 0x7da2
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 135
|
|
POKE memAddr ; fishXmax(i) = 135
|
|
|
|
LDWI 0x7cc6
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 3
|
|
POKE memAddr ; fishXmin(i) = 3
|
|
|
|
LDWI 0x7cbd
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 95
|
|
POKE memAddr ; fishYmax(i) = 95
|
|
|
|
LDWI 0x7cb4
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 5
|
|
POKE memAddr ; fishYmin(i) = 5
|
|
|
|
LDI 0x82
|
|
RandMod
|
|
STW memValue
|
|
LDWI 0x7db4
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishX(i) = rnd(130)
|
|
|
|
LDI 0x5a
|
|
STLW 0xFE
|
|
LDWI _page_0x0aa0
|
|
CALL giga_vAC
|
|
_page_0x0aa0 LDLW 0xFE
|
|
RandMod
|
|
STW memValue
|
|
LDWI 0x7dab
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishY(i) = rnd(90)
|
|
|
|
LDI 0x02
|
|
RandMod
|
|
STW memValue
|
|
LDWI 0x7cab
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishThink1(i) = rnd(2)
|
|
|
|
LDWI 0x7ca2
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 2
|
|
POKE memAddr ; fishThink2(i) = SWIMFWD
|
|
|
|
LDWI 0x7cab
|
|
ADDW _i
|
|
PEEK
|
|
ADDI 2
|
|
STW memValue
|
|
LDWI 0x7dbd
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr
|
|
LDWI _endif_0x0aef
|
|
CALL giga_vAC ; fishSprite(i) = RASBORA1 + fishThink1(i)
|
|
|
|
_elseif_0x09fd LDWI 0x7dc6
|
|
ADDW _i
|
|
PEEK
|
|
STLW 0xFE
|
|
LDWI _page_0x0ba0
|
|
CALL giga_vAC
|
|
_page_0x0ba0 LDLW 0xFE
|
|
XORI 2
|
|
JumpEQ _endif_0x0aef 26 ; elseif fishType(i) &= MOLLY
|
|
|
|
LDWI 0x7da2
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 135
|
|
POKE memAddr ; fishXmax(i) = 135
|
|
|
|
LDWI 0x7cc6
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 3
|
|
POKE memAddr ; fishXmin(i) = 3
|
|
|
|
LDWI 0x7cbd
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 95
|
|
POKE memAddr ; fishYmax(i) = 95
|
|
|
|
LDWI 0x7cb4
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 5
|
|
POKE memAddr ; fishYmin(i) = 5
|
|
|
|
LDI 0x82
|
|
RandMod
|
|
STW memValue
|
|
LDWI 0x7db4
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishX(i) = rnd(130)
|
|
|
|
LDI 0x5a
|
|
RandMod
|
|
STLW 0xFE
|
|
LDWI _page_0x0ca0
|
|
CALL giga_vAC
|
|
_page_0x0ca0 LDLW 0xFE
|
|
STW memValue
|
|
LDWI 0x7dab
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishY(i) = rnd(90)
|
|
|
|
LDI 0x02
|
|
RandMod
|
|
STW memValue
|
|
LDWI 0x7cab
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishThink1(i) = rnd(2)
|
|
|
|
LDWI 0x7ca2
|
|
ADDW _i
|
|
STW memAddr
|
|
LDI 2
|
|
POKE memAddr ; fishThink2(i) = SWIMFWD
|
|
|
|
LDWI 0x7cab
|
|
ADDW _i
|
|
PEEK
|
|
ADDI 4
|
|
STW memValue
|
|
LDWI 0x7dbd
|
|
ADDW _i
|
|
STW memAddr
|
|
LDW memValue
|
|
POKE memAddr ; fishSprite(i) = MOLLY1 + fishThink1(i)
|
|
|
|
_endif_0x0aef ForNextFarInc _i _next_0x07f5 7 ; next i
|
|
|
|
Return ; return
|
|
|
|
HALT ; END
|
|
|
|
|
|
|
|
;****************************************************************************************************************************************
|
|
;****************************************************************************************************************************************
|
|
;* Internal runtime, DO NOT MODIFY PAST THIS POINT, modifications must be made in the original include files *
|
|
;****************************************************************************************************************************************
|
|
;****************************************************************************************************************************************
|
|
|
|
romCheck EQU 0x75a6
|
|
convertEqOp EQU 0x73a1
|
|
convertLtOp EQU 0x70a1
|
|
convertGtOp EQU 0x6fb1
|
|
divide16bit EQU 0x72a8
|
|
rand16bit EQU 0x72a0
|
|
randMod16bit EQU 0x73aa
|
|
scanlineMode EQU 0x76a1
|
|
waitVBlank EQU 0x6fc6
|
|
waitVBlanks EQU 0x6fec
|
|
resetVideoFlags EQU 0x6fba
|
|
initClearFuncs EQU 0x78a0
|
|
clearVertBlinds EQU 0x71c9
|
|
drawPixel EQU 0x77a4
|
|
drawHLine EQU 0x70d2
|
|
drawRectF EQU 0x71a1
|
|
drawSprite_ EQU 0x70aa
|
|
drawSprite EQU 0x6fdf
|
|
drawSpriteX EQU 0x6fd2
|
|
soundAllOff EQU 0x74a7
|
|
convertEqOpAddr EQU 0x00c0
|
|
convertNeOpAddr EQU 0x00c2
|
|
convertLeOpAddr EQU 0x00c4
|
|
convertGeOpAddr EQU 0x00c6
|
|
convertLtOpAddr EQU 0x00c8
|
|
convertGtOpAddr EQU 0x00ca
|
|
convert8Arr2dAddr EQU 0x00cc
|
|
convert8Arr3dAddr EQU 0x00ce
|
|
convert16Arr2dAddr EQU 0x00d0
|
|
convert16Arr3dAddr EQU 0x00d2
|
|
realTimeStubAddr EQU 0x00d4
|
|
|
|
|
|
; do *NOT* use register4 to register7 during time slicing
|
|
realTimeAddr EQU register0
|
|
realTimeProc0 EQU register1
|
|
realTimeProc1 EQU register2
|
|
realTimeProc2 EQU register3
|
|
numericLabel EQU register0
|
|
defaultLabel EQU register1
|
|
lutLabs EQU register2
|
|
lutAddrs EQU register3
|
|
lutIndex EQU register8
|
|
romType EQU register0
|
|
romErrAddr EQU register1
|
|
romErrPixel EQU register2
|
|
romExec_vLR EQU register0
|
|
romReadAddr EQU register0
|
|
|
|
|
|
romCheck LD giga_romType
|
|
ANDI 0xFC
|
|
SUBW romType
|
|
BGE romC_return
|
|
LDWI giga_vram + giga_yres/2*256 + giga_xres/2
|
|
STW romErrAddr
|
|
|
|
romC_loop LD romErrPixel
|
|
POKE romErrAddr
|
|
INC romErrPixel
|
|
BRA romC_loop ; flash center pixel indicating rom error
|
|
|
|
romC_return RET
|
|
|
|
|
|
; convert equal to into a boolean
|
|
convertEqOp BEQ convertEq_1
|
|
LDI 0
|
|
RET
|
|
convertEq_1 LDI 1
|
|
RET
|
|
|
|
|
|
; convert less than into a boolean
|
|
convertLtOp BLT convertLt_1
|
|
LDI 0
|
|
RET
|
|
convertLt_1 LDI 1
|
|
RET
|
|
|
|
|
|
; convert greater than into boolean
|
|
convertGtOp BGT convertGt_1
|
|
LDI 0
|
|
RET
|
|
convertGt_1 LDI 1
|
|
RET
|
|
|
|
|
|
; do *NOT* use register4 to register7 during time slicing
|
|
mathX EQU register8
|
|
mathY EQU register9
|
|
mathSum EQU register12
|
|
mathRem EQU register12
|
|
mathMask EQU register13
|
|
mathSign EQU register14
|
|
mathQuot EQU register15
|
|
mathShift EQU register15
|
|
mathBase EQU register10
|
|
mathPow EQU register11
|
|
mathResult EQU register14
|
|
|
|
|
|
rand16bit LDWI SYS_Random_34
|
|
STW giga_sysFn
|
|
SYS 34
|
|
RET
|
|
|
|
|
|
|
|
; accumulator:mathRem = mathX / mathY, (results 16bit)
|
|
divide16bit LDW mathX
|
|
XORW mathY
|
|
STW mathSign
|
|
LDW mathX
|
|
BGE divide16_pos0
|
|
LDI 0
|
|
SUBW mathX
|
|
STW mathX
|
|
|
|
divide16_pos0 LDW mathY
|
|
BGE divide16_pos1
|
|
LDI 0
|
|
SUBW mathY
|
|
STW mathY
|
|
|
|
divide16_pos1 LDI 0
|
|
STW mathRem
|
|
LDI 1
|
|
|
|
divide16_loop STW mathMask
|
|
LDW mathRem
|
|
LSLW
|
|
STW mathRem
|
|
LDW mathX
|
|
BGE divide16_incr
|
|
INC mathRem
|
|
|
|
divide16_incr LDW mathX
|
|
LSLW
|
|
STW mathX
|
|
LDW mathRem
|
|
SUBW mathY
|
|
BLT divide16_incx
|
|
STW mathRem
|
|
INC mathX
|
|
|
|
divide16_incx LDW mathMask
|
|
LSLW
|
|
BNE divide16_loop
|
|
%if TIME_SLICING
|
|
PUSH
|
|
CALL realTimeStubAddr
|
|
POP
|
|
%endif
|
|
LDW mathSign
|
|
BGE divide16_exit
|
|
LDI 0
|
|
SUBW mathX
|
|
RET
|
|
|
|
divide16_exit LDW mathX
|
|
RET
|
|
|
|
|
|
randMod16bit PUSH
|
|
LDWI SYS_Random_34
|
|
STW giga_sysFn
|
|
SYS 34
|
|
STW mathX
|
|
LDWI divide16bit
|
|
CALL giga_vAC
|
|
LDW mathRem
|
|
POP
|
|
RET
|
|
|
|
|
|
; do *NOT* use register4 to register7 during time slicing
|
|
graphicsMode EQU register0
|
|
waitVBlankNum EQU register0
|
|
|
|
drawHLine_x1 EQU register0
|
|
drawHLine_y1 EQU register1
|
|
drawHLine_x2 EQU register2
|
|
drawHLine_x4 EQU register3
|
|
|
|
drawVLine_x1 EQU register0
|
|
drawVLine_y1 EQU register1
|
|
drawVLine_y2 EQU register2
|
|
drawVLine_y8 EQU register3
|
|
|
|
drawLine_x1 EQU register0
|
|
drawLine_y1 EQU register1
|
|
drawLine_x2 EQU register2
|
|
drawLine_y2 EQU register3
|
|
drawLine_xy1 EQU register0
|
|
drawLine_xy2 EQU register1
|
|
drawLine_dxy1 EQU register2
|
|
drawLine_dxy2 EQU register3
|
|
drawLine_dx1 EQU register4 ; register4 to register7 used for temp values, state will be invalidated during time slicing
|
|
drawLine_dy1 EQU register5
|
|
drawLine_dx2 EQU register6
|
|
drawLine_dy2 EQU register7
|
|
drawLine_sx EQU register8
|
|
drawLine_sy EQU register9
|
|
drawLine_h EQU register10
|
|
drawLine_num EQU register11
|
|
drawLine_count EQU register12
|
|
drawLine_tmp EQU register13
|
|
drawLine_dx EQU register2
|
|
drawLine_dy EQU register3
|
|
drawLine_u EQU register8
|
|
drawLine_v EQU register9
|
|
drawLine_addr EQU register10
|
|
|
|
drawPixel_xy EQU register15
|
|
readPixel_xy EQU register15
|
|
|
|
drawCircle_cx EQU register0
|
|
drawCircle_cy EQU register1
|
|
drawCircle_r EQU register2
|
|
drawCircle_a EQU register3
|
|
drawCircle_d EQU register8
|
|
drawCircle_x EQU register9
|
|
drawCircle_y EQU register10
|
|
drawCircle_ch0 EQU register11
|
|
drawCircle_ch1 EQU register12
|
|
drawCircle_ch2 EQU register13
|
|
drawCircle_ch3 EQU register14
|
|
|
|
drawCircleF_x1 EQU register0
|
|
drawCircleF_y1 EQU register1
|
|
drawCircleF_x2 EQU register2
|
|
drawCircleF_cx EQU register15
|
|
drawCircleF_cy EQU register10
|
|
drawCircleF_r EQU register11
|
|
drawCircleF_v EQU register8
|
|
drawCircleF_w EQU register9
|
|
|
|
drawRect_x1 EQU register7
|
|
drawRect_y1 EQU register10
|
|
drawRect_x2 EQU register11
|
|
drawRect_y2 EQU register15
|
|
|
|
drawRectF_x1 EQU register0
|
|
drawRectF_y1 EQU register1
|
|
drawRectF_x2 EQU register2
|
|
drawRectF_y2 EQU register7
|
|
|
|
drawPoly_mode EQU register14
|
|
drawPoly_addr EQU register15
|
|
|
|
|
|
scanlineMode LDWI SYS_SetMode_v2_80
|
|
STW giga_sysFn
|
|
LDW graphicsMode
|
|
SYS 80
|
|
RET
|
|
|
|
|
|
|
|
waitVBlank LD giga_videoY
|
|
XORI 179
|
|
BNE waitVBlank
|
|
%if TIME_SLICING
|
|
PUSH
|
|
CALL realTimeStubAddr
|
|
POP
|
|
%endif
|
|
RET
|
|
|
|
|
|
waitVBlanks PUSH
|
|
|
|
waitVB_loop LDW waitVBlankNum
|
|
SUBI 0x01
|
|
STW waitVBlankNum
|
|
BGE waitVB_vblank
|
|
POP
|
|
RET
|
|
|
|
waitVB_vblank LDWI waitVBlank
|
|
CALL giga_vAC
|
|
BRA waitVB_loop
|
|
|
|
|
|
; do *NOT* use register4 to register7 during time slicing
|
|
xreset EQU register0
|
|
xcount EQU register1
|
|
ycount EQU register2
|
|
treset EQU register3
|
|
breset EQU register8
|
|
top EQU register9
|
|
bot EQU register10
|
|
vramAddr EQU register11
|
|
evenAddr EQU register12
|
|
clsAddress EQU register13
|
|
clsLines EQU register14
|
|
varAddress EQU register13
|
|
clrAddress EQU register13
|
|
clrLines EQU register14
|
|
clrWidth EQU register15
|
|
|
|
|
|
resetVideoFlags LDI giga_CursorX ; cursor x start
|
|
STW cursorXY
|
|
LDWI ON_BOTTOM_ROW_MSK
|
|
ANDW miscFlags
|
|
STW miscFlags ; reset on bottom row flag
|
|
RET
|
|
|
|
|
|
|
|
initClearFuncs PUSH
|
|
LDWI resetVideoFlags
|
|
CALL giga_vAC
|
|
LDWI SYS_SetMemory_v2_54 ; setup fill memory SYS routine
|
|
STW giga_sysFn
|
|
LD fgbgColour
|
|
ST giga_sysArg1 ; fill value
|
|
POP
|
|
RET
|
|
|
|
|
|
; clears the viewable screen using a vertical blinds effect
|
|
clearVertBlinds PUSH
|
|
LDWI initClearFuncs
|
|
CALL giga_vAC
|
|
LDI giga_vram >> 8
|
|
STW top
|
|
|
|
clearVB_loopy LDI giga_xres
|
|
ST giga_sysArg0
|
|
LDI 0
|
|
ST giga_sysArg2 ; low start address
|
|
LD top
|
|
ST giga_sysArg3 ; top line
|
|
SYS 54 ; fill memory
|
|
|
|
LDI giga_xres
|
|
ST giga_sysArg0
|
|
LDI 0
|
|
ST giga_sysArg2 ; low start address
|
|
LDWI giga_yres - 1 + 16
|
|
SUBW top
|
|
ST giga_sysArg3 ; bottom line
|
|
SYS 54 ; fill memory
|
|
INC top ; next top line
|
|
%if TIME_SLICING
|
|
CALL realTimeStubAddr
|
|
%endif
|
|
LD top
|
|
SUBI giga_yres / 2 + 8
|
|
BLT clearVB_loopy
|
|
POP
|
|
RET
|
|
|
|
|
|
drawPixel LD drawPixel_xy + 1 ; poke peek(256 + 2*y)*256 + x, fg_colour
|
|
LSLW
|
|
INC giga_vAC + 1
|
|
PEEK
|
|
ST drawPixel_xy + 1
|
|
LD fgbgColour + 1
|
|
POKE drawPixel_xy
|
|
RET
|
|
|
|
|
|
|
|
drawHLine PUSH
|
|
LD drawHLine_x1
|
|
ST giga_sysArg2 ; low start address
|
|
LD drawHLine_x2
|
|
SUBW drawHLine_x1
|
|
BGE drawHL_cont
|
|
LD drawHLine_x2
|
|
ST giga_sysArg2 ; low start address
|
|
LD drawHLine_x1
|
|
SUBW drawHLine_x2
|
|
|
|
drawHL_cont ADDI 1
|
|
ST giga_sysArg0 ; count
|
|
LD fgbgColour + 1
|
|
ST giga_sysArg1 ; fill value
|
|
LD drawHLine_y1
|
|
ADDI 8
|
|
ST giga_sysArg3 ; high start address
|
|
LDWI SYS_SetMemory_v2_54
|
|
STW giga_sysFn
|
|
SYS 54 ; fill memory
|
|
%if TIME_SLICING
|
|
CALL realTimeStubAddr
|
|
%endif
|
|
POP
|
|
RET
|
|
|
|
|
|
drawRectF PUSH
|
|
LDW drawRectF_y2
|
|
SUBW drawRectF_y1
|
|
BGE drawRF_loop
|
|
LDW drawRectF_y2
|
|
STW drawLine_tmp
|
|
LDW drawRectF_y1
|
|
STW drawRectF_y2
|
|
LDW drawLine_tmp
|
|
STW drawRectF_y1 ;if y2 < y1 then swap y2 with y1
|
|
|
|
drawRF_loop LDW drawRectF_y1
|
|
STW drawHLine_y1
|
|
LDWI drawHLine
|
|
CALL giga_vAC
|
|
INC drawRectF_y1
|
|
LDW drawRectF_y1
|
|
SUBW drawRectF_y2
|
|
BLE drawRF_loop
|
|
|
|
POP
|
|
RET
|
|
|
|
|
|
|
|
; do *NOT* use register4 to register7 during time slicing
|
|
spriteId EQU register0
|
|
spriteXY EQU register1
|
|
spriteAddrs EQU register2
|
|
|
|
|
|
drawSprite_ PUSH
|
|
LDWI _spritesLut_
|
|
ADDW spriteId
|
|
ADDW spriteId
|
|
DEEK
|
|
STW spriteAddrs ; get sprite address table
|
|
|
|
drawS_loop LDW spriteAddrs
|
|
DEEK ; get source address
|
|
BEQ drawS_exit
|
|
STW giga_sysArg0
|
|
INC spriteAddrs
|
|
INC spriteAddrs
|
|
LDW spriteAddrs
|
|
DEEK ; get stripe destination offset
|
|
ADDW spriteXY
|
|
SYS 64
|
|
INC spriteAddrs
|
|
INC spriteAddrs
|
|
%if TIME_SLICING
|
|
CALL realTimeStubAddr
|
|
%endif
|
|
BRA drawS_loop
|
|
|
|
drawS_exit POP
|
|
RET
|
|
|
|
|
|
drawSprite PUSH
|
|
LDWI SYS_Sprite6_v3_64
|
|
STW giga_sysFn
|
|
LDWI drawSprite_
|
|
CALL giga_vAC
|
|
POP
|
|
RET
|
|
|
|
|
|
drawSpriteX PUSH
|
|
LDWI SYS_Sprite6x_v3_64
|
|
STW giga_sysFn
|
|
LDWI drawSprite_
|
|
CALL giga_vAC
|
|
POP
|
|
RET
|
|
|
|
|
|
midiId EQU register0
|
|
audioAddr EQU register1
|
|
waveType EQU register2
|
|
midiNote EQU register4 ; register4 to register7 are the only free registers during time slicing
|
|
midiCommand EQU register5
|
|
midiPtr EQU register6
|
|
sndChannel EQU register8
|
|
sndFrequency EQU register9
|
|
sndVolume EQU register10
|
|
sndWaveType EQU register11
|
|
musicStream EQU register8
|
|
musicNote EQU register9
|
|
musicCommand EQU register10
|
|
musicPtr EQU register11
|
|
|
|
|
|
soundAllOff LDWI 0x01FC
|
|
STW sndChannel
|
|
LDI 0
|
|
DOKE sndChannel ; turn off channel 0
|
|
INC sndChannel + 1
|
|
DOKE sndChannel ; turn off channel 1
|
|
INC sndChannel + 1
|
|
DOKE sndChannel ; turn off channel 2
|
|
INC sndChannel + 1
|
|
DOKE sndChannel ; turn off channel 3
|
|
RET
|
|
|