gigatron/rom/Contrib/delpozzo/FishTank/FishTank.gasm
2025-01-28 19:17:01 +03:00

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