913 lines
31 KiB
Plaintext
913 lines
31 KiB
Plaintext
%include macros/gigatron.i
|
|
|
|
; ===========================================
|
|
; BRICKS (BREAKOUT CLONE)
|
|
; ===========================================
|
|
|
|
; --- mem layout ---
|
|
vars EQU 0x00B0
|
|
consts EQU 0x0082 ; skip 0x80 - reserved!!
|
|
data EQU 0x10c0 ; (unused vram)
|
|
|
|
entry_point EQU 0x0200
|
|
subroutines0 EQU 0x0300
|
|
subroutines1 EQU 0x0400
|
|
subroutines2 EQU 0x0500
|
|
subroutines3 EQU 0x0600
|
|
subroutines4 EQU 0x20c0 ; (unused vram)
|
|
|
|
; 0x700 --> reserved (sound)
|
|
; 5 last bytes of 0x200 x300 x400 --> reserved (sound)
|
|
|
|
; --- vars ---
|
|
scratch EQU vars + 0x00
|
|
x0 EQU vars + 0x02
|
|
y0 EQU vars + 0x03
|
|
xy0 EQU x0
|
|
x1 EQU vars + 0x04
|
|
y1 EQU vars + 0x05
|
|
xy1 EQU x1
|
|
|
|
padx EQU vars + 0x06
|
|
speedpad EQU vars + 0x08
|
|
|
|
ballx EQU vars + 0x0A
|
|
bally EQU vars + 0x0C
|
|
speedx EQU vars + 0x0E
|
|
speedy EQU vars + 0x10
|
|
nextballx EQU vars + 0x12
|
|
nextbally EQU vars + 0x14
|
|
brokencount EQU vars + 0x16
|
|
brokenseq EQU vars + 0x18
|
|
|
|
vb_PrevFrame EQU vars + 0x1E
|
|
|
|
; --- subroutines args & locals ---
|
|
PrintText_Str EQU vars + 0x20
|
|
PrintText_Pos EQU vars + 0x22
|
|
_pt_tt EQU vars + 0x24
|
|
_pt_ii EQU vars + 0x25
|
|
_pt_Char EQU vars + 0x26
|
|
|
|
DrawBrick_xy EQU vars + 0x20
|
|
DrawBrick_col EQU vars + 0x22
|
|
_db_i EQU vars + 0x24
|
|
_db_j EQU vars + 0x26
|
|
|
|
BreakBrick_xy EQU vars + 0x28 ; also used as local var in mainloop.
|
|
_bb_i EQU vars + 0x22
|
|
_bb_j EQU vars + 0x24
|
|
|
|
_pt_key EQU vars + 0x22
|
|
|
|
; --- constants ---
|
|
giga_vram_y EQU 0x08
|
|
speedupy EQU 10 ; 0.04
|
|
initspeedy EQU 154 ; 0.6
|
|
|
|
buttonRight EQU 1
|
|
buttonLeft EQU 2
|
|
buttonDown EQU 4
|
|
buttonUp EQU 8
|
|
buttonStart EQU 16
|
|
buttonSelect EQU 32
|
|
buttonB EQU 64
|
|
buttonA EQU 128
|
|
|
|
; 16-bit constants in RAM (no wordimmediate opcodes)
|
|
cst_FF00 EQU consts
|
|
cst_FF00 DW $FF00 ; for byte to word sign extension
|
|
cst_00FF DW $00FF
|
|
|
|
maxspeedpad DW $0200 ; 2.0
|
|
maxpadx DW $7F00 ; 127.0
|
|
minpadx DW $2300 ; 35.0
|
|
|
|
speedxmin DW $FE80 ; -1.5 (ball speed)
|
|
speedxrange DW $0100 ; (-0.5+1.5) speed in [-1.5;-.5] [.5;1.5]
|
|
speedxmax DW $0180 ; 1.5
|
|
speedymax DW $0200 ; 2.0
|
|
|
|
twopix_white DW $3F3F ; board lines
|
|
twopix_black DW $0000 ; board background
|
|
twopix_blue DW $3030 ; pad color
|
|
twopix_darkblue DW $2020 ; pad color dark
|
|
ball_line1 DW $2A3F ; white corner on grey ball (lighting effect , and highlight the active pixel)
|
|
ball_line2 DW $2A2A
|
|
|
|
_soundChan1val EQU giga_soundChan1+2 ; (DW do not support expressions)
|
|
_soundChan2val EQU giga_soundChan2+2
|
|
_soundChan3val EQU giga_soundChan3+2
|
|
_soundChan4val EQU giga_soundChan4+2
|
|
soundChan1 DW _soundChan1val
|
|
soundChan2 DW _soundChan2val
|
|
soundChan3 DW _soundChan3val
|
|
soundChan4 DW _soundChan4val
|
|
|
|
; --- data ------------
|
|
string_lives EQU data + 0x00
|
|
string_lives DB 10 '3 '
|
|
string_score DB 3 '000'
|
|
string_gameover DB 10 'Game Over!'
|
|
string_victory DB 10 'Break Out!'
|
|
|
|
; 14x8 bricks grid
|
|
bricksx EQU data + 0x0100
|
|
bricksx DB 32 39 46 53 60 67 74 81 88 95 102 109 116 123
|
|
bricksy DW 0x2000 0x2300 0x2600 0x2900 0x2C00 0x2F00 0x3200 0x3500
|
|
brickscol DB 0x03 0x03 0x0B 0x0B 0x0C 0x0C 0x0F 0x0F
|
|
|
|
BounceTable0 EQU data + 0x0200
|
|
BounceTable EQU BounceTable0 + 0x0E ; offset 0 is the center of the the table.
|
|
BounceTable0 DW 0xFF80 0xFFB0 0xFFB0 0 0 0 0 0 0 0 0X0050 0X0050 0x0080
|
|
;BounceTable0 DW 0xFF60 0xFF80 0xFF80 0XFFC0 0 0 0 0 0 0X0040 0X0080 0X0080 0x00A0
|
|
|
|
############################################################################################################
|
|
################################## PAGE BREAK ##############################################################
|
|
############################################################################################################
|
|
entry_point CALL DrawBoard
|
|
CALL InitAudio
|
|
|
|
restart LDWI 80*256 ; init pad
|
|
STW padx
|
|
LDI 0
|
|
STW speedpad
|
|
STW brokencount
|
|
|
|
CALL ResetScore
|
|
CALL DrawBricks
|
|
CALL InitRound
|
|
|
|
mainloop LDI 1
|
|
CALL WaitVBlanks
|
|
|
|
; -- move pad --
|
|
LD giga_buttonState
|
|
XORI $FF ; NOT
|
|
ANDI buttonRight + buttonLeft
|
|
BEQ noinput
|
|
LDW speedpad
|
|
BNE skipinit
|
|
LDI 240 ; initial speed as soon a button pressed
|
|
skipinit ADDI 16 ; 256/16==16 frames to reach fullspeed
|
|
STW speedpad
|
|
SUBW maxspeedpad
|
|
BLE dobuttons
|
|
LDW maxspeedpad
|
|
STW speedpad
|
|
dobuttons LD giga_buttonState
|
|
ANDI buttonRight
|
|
BNE rightdone
|
|
LDW padx
|
|
ADDW speedpad
|
|
STW padx
|
|
SUBW maxpadx
|
|
BLE rightdone
|
|
LDW maxpadx
|
|
STW padx
|
|
rightdone LD giga_buttonState
|
|
ANDI buttonLeft
|
|
BNE inputdone
|
|
LDW padx
|
|
SUBW speedpad
|
|
STW padx
|
|
SUBW minpadx
|
|
BGE inputdone
|
|
LDW minpadx
|
|
STW padx
|
|
BRA inputdone
|
|
noinput LDI 0
|
|
STW speedpad
|
|
|
|
inputdone CALL DrawBall ; Erase cur ball
|
|
CALL DrawPad
|
|
|
|
; -- update ball --
|
|
LDW ballx
|
|
ADDW speedx
|
|
STW nextballx
|
|
LD nextballx+1
|
|
ST BreakBrick_xy
|
|
LD bally+1
|
|
ST BreakBrick_xy+1
|
|
LDW BreakBrick_xy
|
|
PEEK
|
|
BEQ xbounceskip
|
|
ANDI 0x30 ; bricks are not blue..
|
|
BNE notbrickx
|
|
CALL BreakBrick
|
|
notbrickx LDI 0
|
|
SUBW speedx
|
|
STW speedx
|
|
LDW ballx
|
|
STW nextballx
|
|
xbounceskip LDW bally
|
|
ADDW speedy
|
|
STW nextbally
|
|
LD nextballx+1
|
|
ST BreakBrick_xy
|
|
LD nextbally+1
|
|
ST BreakBrick_xy+1
|
|
LDW BreakBrick_xy
|
|
PEEK
|
|
BEQ ybounceskip
|
|
ANDI 0x30 ; bricks are not blue..
|
|
BNE notbricky
|
|
CALL BreakBrick
|
|
notbricky LD nextbally+1
|
|
SUBI giga_vram_y+100
|
|
BLT notpadbounce
|
|
LDI 30
|
|
CALL PlayTone
|
|
CALL BouncePad
|
|
notpadbounce LDI 0
|
|
SUBW speedy
|
|
STW speedy
|
|
LDW bally
|
|
STW nextbally
|
|
ybounceskip LDW nextballx
|
|
STW ballx
|
|
LDW nextbally
|
|
STW bally
|
|
CALL DrawBall
|
|
|
|
LD bally+1
|
|
SUBI giga_vram_y+114
|
|
BLT mainloop
|
|
|
|
; ball dropped..
|
|
balllost LDW brokenseq
|
|
BEQ balllost2
|
|
SUBI 1
|
|
STW brokenseq
|
|
ADDI 35
|
|
CALL PlayTone
|
|
CALL WaitVBlanks
|
|
BRA balllost
|
|
; add a screen shake?
|
|
balllost2 CALL DecrementLives
|
|
BLE gameover
|
|
CALL InitRound
|
|
LDI 42
|
|
CALL WaitVBlanks
|
|
BRA mainloop
|
|
|
|
gameover CALL GameOver
|
|
BRA restart
|
|
|
|
############################################################################################################
|
|
################################## PAGE BREAK ##############################################################
|
|
############################################################################################################
|
|
subroutines0 RET
|
|
|
|
; ===== DrawBricks ============================================================================
|
|
DrawOneBrick LDW DrawBrick_col
|
|
DOKE DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
DOKE DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
DOKE DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
ANDI $15 ; darken color 2A: little darker 15: very dark,
|
|
POKE DrawBrick_xy ; fill in borders so that the ball doesn't squeeze in between bricks
|
|
LDWI 0x0100-6 ; next line
|
|
ADDW DrawBrick_xy
|
|
STW DrawBrick_xy
|
|
LDW DrawBrick_col
|
|
DOKE DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
DOKE DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
DOKE DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
INC DrawBrick_xy
|
|
ANDI $2A ; darken color
|
|
POKE DrawBrick_xy ; fill in borders so that the ball doesn't squeeze in between bricks
|
|
RET
|
|
|
|
DrawBricks PUSH
|
|
LDI 7
|
|
STW _db_j
|
|
_db_loopj LDI 13
|
|
STW _db_i
|
|
_db_loopi LDWI bricksy
|
|
ADDW _db_j
|
|
ADDW _db_j
|
|
DEEK
|
|
STW DrawBrick_xy
|
|
LDWI bricksx
|
|
ADDW _db_i
|
|
PEEK
|
|
ADDW DrawBrick_xy
|
|
STW DrawBrick_xy
|
|
LDWI brickscol
|
|
ADDW _db_j
|
|
PEEK
|
|
ST DrawBrick_col
|
|
ST DrawBrick_col+1
|
|
CALL DrawOneBrick
|
|
LD _db_i
|
|
SUBI 1
|
|
ST _db_i
|
|
BGE _db_loopi
|
|
LD _db_j
|
|
SUBI 1
|
|
ST _db_j
|
|
BGE _db_loopj
|
|
POP
|
|
RET
|
|
|
|
|
|
; ===== DrawPad =============================================================================
|
|
DrawPad LDI giga_vram_y+110
|
|
ST y0
|
|
ADDI 1
|
|
ST y1
|
|
LD padx+1
|
|
SUBI 2+6
|
|
ST x0
|
|
ST x1
|
|
LDW twopix_black
|
|
DOKE xy0
|
|
DOKE xy1
|
|
INC x0
|
|
INC x0
|
|
INC x1
|
|
INC x1
|
|
LDW twopix_darkblue
|
|
DOKE xy0
|
|
DOKE xy1
|
|
INC x0
|
|
INC x0
|
|
INC x1
|
|
INC x1
|
|
LDW twopix_blue
|
|
DOKE xy0
|
|
DOKE xy1
|
|
INC x0
|
|
INC x0
|
|
INC x1
|
|
INC x1
|
|
DOKE xy0
|
|
DOKE xy1
|
|
INC x0
|
|
INC x0
|
|
INC x1
|
|
INC x1
|
|
DOKE xy0
|
|
DOKE xy1
|
|
INC x0
|
|
INC x0
|
|
INC x1
|
|
INC x1
|
|
DOKE xy0
|
|
DOKE xy1
|
|
INC x0
|
|
INC x0
|
|
INC x1
|
|
INC x1
|
|
LDW twopix_darkblue
|
|
DOKE xy0
|
|
DOKE xy1
|
|
INC x0
|
|
INC x0
|
|
INC x1
|
|
INC x1
|
|
LDW twopix_black
|
|
DOKE xy0
|
|
DOKE xy1
|
|
RET
|
|
|
|
|
|
############################################################################################################
|
|
################################## PAGE BREAK ##############################################################
|
|
############################################################################################################
|
|
subroutines1 RET
|
|
|
|
; Find the brick containing the position BreakBrick_xy, clears it, and increment score
|
|
BreakBrick PUSH
|
|
LD BreakBrick_xy
|
|
STW scratch
|
|
LDI 13
|
|
STW _bb_i
|
|
_bb_loopi LDWI bricksx
|
|
ADDW _bb_i
|
|
PEEK
|
|
SUBW scratch
|
|
BGT _bb_nexti
|
|
ADDI 7
|
|
BLE _bb_nexti
|
|
|
|
LDI 7
|
|
STW _bb_j
|
|
_bb_loopj LDWI bricksy
|
|
ADDW _bb_j
|
|
ADDW _bb_j
|
|
DEEK
|
|
STW DrawBrick_xy
|
|
SUBW BreakBrick_xy
|
|
BGT _bb_nextj
|
|
ADDI $FF ; +0x200
|
|
ADDI $FF
|
|
ADDI 2
|
|
BLE _bb_nextj
|
|
|
|
; found the brick!
|
|
LDWI bricksx
|
|
ADDW _bb_i
|
|
PEEK
|
|
ADDW DrawBrick_xy
|
|
STW DrawBrick_xy
|
|
LDW twopix_black
|
|
STW DrawBrick_col
|
|
CALL DrawOneBrick
|
|
CALL IncrementScore
|
|
|
|
INC brokencount
|
|
|
|
INC brokenseq
|
|
LDW brokenseq
|
|
SUBI 5+28
|
|
BLT _bb_playtone
|
|
LDI 5+28
|
|
STW brokenseq
|
|
_bb_playtone LDI 35
|
|
ADDW brokenseq
|
|
CALL PlayTone
|
|
POP
|
|
RET
|
|
|
|
_bb_nextj LD _bb_j
|
|
SUBI 1
|
|
ST _bb_j
|
|
BGE _bb_loopj
|
|
POP
|
|
RET
|
|
|
|
_bb_nexti LD _bb_i
|
|
SUBI 1
|
|
ST _bb_i
|
|
BGE _bb_loopi
|
|
POP
|
|
RET
|
|
|
|
|
|
; ===== ClearBottom =============================================================================
|
|
ClearBottom LDI 20
|
|
ST x0
|
|
_cb_loopx LDI giga_vram_y+110
|
|
ST y0
|
|
LDW twopix_black
|
|
DOKE xy0
|
|
INC y0
|
|
DOKE xy0
|
|
INC y0
|
|
DOKE xy0
|
|
INC y0
|
|
DOKE xy0
|
|
INC y0
|
|
DOKE xy0
|
|
INC y0
|
|
DOKE xy0
|
|
INC y0
|
|
DOKE xy0
|
|
INC y0
|
|
DOKE xy0
|
|
INC y0
|
|
DOKE xy0
|
|
INC y0
|
|
DOKE xy0
|
|
LD x0
|
|
ADDI 2
|
|
ST x0
|
|
SUBI 172
|
|
BNE _cb_loopx
|
|
RET
|
|
|
|
; ===== Init =============================================================================
|
|
InitRound PUSH
|
|
CALL ClearBottom
|
|
CALL DrawPad
|
|
|
|
LDWI 80*256+127 ; 80.5
|
|
STW ballx
|
|
LDWI giga_vram + (50*256+127) ; 50.5
|
|
STW bally
|
|
|
|
LDI initspeedy
|
|
STW speedy
|
|
|
|
LDWI SYS_Random_34 ; Get random number and update entropy
|
|
STW giga_sysFn
|
|
SYS 0xFD ; 270 - 34/2 = 0xFD
|
|
BGT _ib_positive ; get the random number in the range -2.0 .. 2.0
|
|
ORW cst_FF00
|
|
BRA _ib_clamp
|
|
_ib_positive ANDW cst_00FF
|
|
_ib_clamp STW speedx
|
|
CALL ClampBallSpeed
|
|
CALL DrawBall
|
|
LDI 5
|
|
STW brokenseq
|
|
POP
|
|
RET
|
|
|
|
############################################################################################################
|
|
################################## PAGE BREAK ##############################################################
|
|
############################################################################################################
|
|
subroutines2 RET
|
|
|
|
; ===== DrawBall =============================================================================
|
|
DrawBall LD ballx+1
|
|
ST scratch
|
|
LD bally+1
|
|
ST scratch+1
|
|
LDW scratch
|
|
DEEK
|
|
XORW ball_line1
|
|
DOKE scratch
|
|
INC scratch+1
|
|
LDW scratch
|
|
DEEK
|
|
XORW ball_line2
|
|
DOKE scratch
|
|
RET
|
|
|
|
; ===== DrawBoard =============================================================================
|
|
DrawBoard LDI giga_vram_y-1
|
|
ST y0
|
|
_db_nextline INC y0
|
|
LD y0
|
|
ST y1
|
|
SUBI giga_vram_y+120
|
|
BEQ _db_done
|
|
LDI 80 ; screen center
|
|
ST x0
|
|
|
|
; compute center section color
|
|
LD y0
|
|
SUBI giga_vram_y+0
|
|
ANDI 0xFE ; lines 0 + 1
|
|
BEQ _db_whitemid
|
|
LD y0
|
|
SUBI giga_vram_y+16
|
|
ANDI 0xFE ; lines 16+17
|
|
BEQ _db_whitemid
|
|
_db_blackmid LDW twopix_black
|
|
STW scratch
|
|
BRA _db_center
|
|
_db_whitemid LDW twopix_white
|
|
STW scratch
|
|
BRA _db_center
|
|
|
|
_db_center LDI 160
|
|
SUBW x0
|
|
ST x1 ; (=> xy1 xy0 symetric from center line.)
|
|
LDW scratch ; center color (white on separator lines and black otherwise)
|
|
DOKE xy0
|
|
DOKE xy1
|
|
INC x0
|
|
INC x0
|
|
LD x0
|
|
SUBI 80+50
|
|
BNE _db_center
|
|
_db_edge LDI 160
|
|
SUBW x0
|
|
ST x1
|
|
LDW twopix_white
|
|
DOKE xy0
|
|
DOKE xy1
|
|
INC x0
|
|
INC x0
|
|
_db_border LDI 160
|
|
SUBW x0
|
|
ST x1
|
|
LDW twopix_black
|
|
DOKE xy0
|
|
DOKE xy1
|
|
INC x0
|
|
INC x0
|
|
LD x0
|
|
SUBI 162
|
|
BNE _db_border
|
|
BRA _db_nextline
|
|
|
|
_db_done RET
|
|
|
|
|
|
; ===== BouncePad =============================================================================
|
|
ClampBallSpeed LDW speedx
|
|
; gprintf("clamp x,y before = %04x,%04x", *speedx, *speedy)
|
|
BGE _cbs_speedx_pos
|
|
_cbs_speedx_neg SUBW speedxmin
|
|
BGT _cbs_xn1
|
|
LDW speedxmin
|
|
STW speedx
|
|
BRA _cbs_speedy
|
|
_cbs_xn1 SUBW speedxrange
|
|
BLE _cbs_speedy
|
|
LDW speedxmin
|
|
ADDW speedxrange
|
|
STW speedx
|
|
BRA _cbs_speedy
|
|
_cbs_speedx_pos SUBW speedxmax
|
|
BLT _cbs_xn2
|
|
LDW speedxmax
|
|
STW speedx
|
|
BRA _cbs_speedy
|
|
_cbs_xn2 ADDW speedxrange
|
|
BGE _cbs_speedy
|
|
LDW speedxmax
|
|
SUBW speedxrange
|
|
STW speedx
|
|
|
|
_cbs_speedy LDW speedy ; assert speedy>0
|
|
SUBW speedymax
|
|
BLE _cbs_ret
|
|
LDW speedymax
|
|
STW speedy
|
|
; gprintf("clamp x,y after = %04x,%04x", *speedx, *speedy)
|
|
_cbs_ret RET
|
|
|
|
|
|
BouncePad LDWI giga_vram+$6B00
|
|
STW bally ; force ball above the pad => little impulsion effect.
|
|
; (and workaround a bug when you move the pad on the ball after the collision detextion)
|
|
|
|
LDW nextballx ; x direction control
|
|
SUBW padx
|
|
STW scratch
|
|
BLT _bp_div256neg
|
|
LD scratch+1
|
|
BRA _bp_div256done
|
|
_bp_div256neg LD scratch+1
|
|
ORW cst_FF00 ; sign extend
|
|
_bp_div256done LSLW ; x2
|
|
STW scratch ; tointeger(nextballx-padx) * 2 --> offset in BounceTable
|
|
LDWI BounceTable
|
|
ADDW scratch
|
|
DEEK
|
|
ADDW speedx
|
|
STW speedx
|
|
|
|
; speed ball up slightly
|
|
LDW speedy
|
|
ADDI speedupy
|
|
STW speedy
|
|
|
|
BRA ClampBallSpeed
|
|
;RET ; tail call
|
|
|
|
############################################################################################################
|
|
################################## PAGE BREAK ##############################################################
|
|
############################################################################################################
|
|
subroutines3 RET
|
|
|
|
; ===== WaitVBlanks =============================================================================
|
|
WaitVBlanks ST scratch
|
|
_wvb_wait LD giga_frameCount
|
|
SUBW vb_PrevFrame
|
|
BEQ _wvb_wait
|
|
LD giga_frameCount
|
|
STW vb_PrevFrame
|
|
LD scratch
|
|
SUBI 1
|
|
BNE WaitVBlanks
|
|
RET
|
|
|
|
|
|
; ===== DrawScore =============================================================================
|
|
DrawScore PUSH
|
|
LDWI string_lives
|
|
STW PrintText_Str
|
|
LDWI giga_vram + (0x0300 + 34)
|
|
STW PrintText_Pos
|
|
CALL PrintText
|
|
|
|
LDWI string_score
|
|
STW PrintText_Str
|
|
LDWI giga_vram + (0x0800 + 100)
|
|
STW PrintText_Pos
|
|
CALL PrintText
|
|
POP
|
|
RET
|
|
|
|
; ===== ResetScore =============================================================================
|
|
ResetScore LDWI string_lives+1
|
|
STW scratch
|
|
LDI 48+3 ; 48 = '0'
|
|
POKE scratch
|
|
LDWI string_score+1
|
|
STW scratch
|
|
LDI 48+0 ; 48 = '0'
|
|
POKE scratch
|
|
INC scratch
|
|
POKE scratch
|
|
INC scratch
|
|
POKE scratch
|
|
INC scratch
|
|
BRA DrawScore
|
|
|
|
; ===== IncrementScore and draw ================================================================
|
|
IncrementScore LDWI string_score+3
|
|
STW scratch
|
|
PEEK
|
|
ADDI 1
|
|
POKE scratch
|
|
SUBI 48+9 ; '9'
|
|
BLE DrawScore
|
|
LDI 48+0 ; '0'
|
|
POKE scratch
|
|
LDWI string_score+2
|
|
STW scratch
|
|
PEEK
|
|
ADDI 1
|
|
POKE scratch
|
|
SUBI 48+9 ; '9'
|
|
BLE DrawScore
|
|
LDI 48+0 ; '0'
|
|
POKE scratch
|
|
LDWI string_score+1
|
|
STW scratch
|
|
PEEK
|
|
ADDI 1
|
|
POKE scratch
|
|
BRA DrawScore
|
|
|
|
; ===== Decrement lives and draw and return gameover ================================================================
|
|
DecrementLives PUSH
|
|
LDWI string_lives+1
|
|
STW scratch
|
|
PEEK
|
|
SUBI 1
|
|
POKE scratch
|
|
CALL DrawScore
|
|
LDWI string_lives+1
|
|
STW scratch
|
|
PEEK
|
|
SUBI 48+0 ; '0'
|
|
POP
|
|
RET
|
|
|
|
; ===== PrintText =============================================================================
|
|
%MACRO LoopCounter _counter _label
|
|
LD _counter
|
|
SUBI 0x01
|
|
ST _counter
|
|
BNE _label
|
|
%ENDM
|
|
|
|
; prints text using the inbuilt font and SYS routine
|
|
PrintText LDWI SYS_VDrawBits_134 ; setup 8 vertical pixel SYS routine
|
|
STW giga_sysFn
|
|
|
|
LDI 0x00 ; background colour
|
|
ST giga_sysArg0
|
|
LDI 0x3F ; foreground colour
|
|
ST giga_sysArg1
|
|
|
|
LDW PrintText_Str ; first byte is length
|
|
PEEK
|
|
ST _pt_tt
|
|
INC PrintText_Str
|
|
|
|
_pt_chr LDW PrintText_Str
|
|
PEEK
|
|
SUBI 32 ; (char - 32)*5 + 0x0700
|
|
STW _pt_Char
|
|
LSLW
|
|
LSLW
|
|
ADDW _pt_Char
|
|
STW scratch
|
|
LDWI giga_text32
|
|
ADDW scratch
|
|
STW scratch ; text font slice base address for chars 32-81
|
|
|
|
LDW _pt_Char
|
|
SUBI 50
|
|
BLT _pt_draw
|
|
LDW scratch
|
|
ADDI 0x06
|
|
STW scratch ; text font slice base address for chars 82+
|
|
|
|
_pt_draw LDI 0x05
|
|
ST _pt_ii
|
|
_pt_slice LDW PrintText_Pos
|
|
STW giga_sysArg4 ; xy
|
|
LDW scratch ; text font slice base address
|
|
LUP 0x00 ; get ROM slice
|
|
ST giga_sysArg2
|
|
SYS 0xCB ; draw vertical slice, SYS_VDrawBits_134, 270 - 134/2 = 0xCB
|
|
INC scratch ; next vertical slice
|
|
INC PrintText_Pos ; next x
|
|
LoopCounter _pt_ii _pt_slice
|
|
|
|
INC PrintText_Str ; next char
|
|
INC PrintText_Pos ; 1 pixel space between chars
|
|
LoopCounter _pt_tt _pt_chr
|
|
RET
|
|
|
|
|
|
############################################################################################################
|
|
################################## PAGE BREAK ##############################################################
|
|
############################################################################################################
|
|
|
|
InitAudio EQU subroutines4+0x0000
|
|
InitAudio2 EQU subroutines4+0x0100
|
|
PlayTone EQU subroutines4+0x0200
|
|
GameOver EQU subroutines4+0x0300
|
|
|
|
; ===== InitAudio =============================================================================
|
|
InitAudio PUSH
|
|
LDWI giga_soundChan1+4
|
|
STW scratch
|
|
LDI 0
|
|
DOKE scratch
|
|
LDWI giga_soundChan2+4
|
|
STW scratch
|
|
LDI 0
|
|
DOKE scratch
|
|
LDWI giga_soundChan3+4
|
|
STW scratch
|
|
LDI 0
|
|
DOKE scratch
|
|
LDWI giga_soundChan4+4
|
|
STW scratch
|
|
LDI 0
|
|
DOKE scratch
|
|
CALL InitAudio2
|
|
POP
|
|
RET
|
|
|
|
InitAudio2 LDWI giga_soundChan1
|
|
STW scratch
|
|
LDWI 0x0100 ; 0 "Noise", 1 Triangle, 2 Pulse, 3 Sawtooth
|
|
DOKE scratch
|
|
LDWI giga_soundChan2
|
|
STW scratch
|
|
LDWI 0x0200 ; 0 "Noise", 1 Triangle, 2 Pulse, 3 Sawtooth
|
|
DOKE scratch
|
|
LDWI giga_soundChan3
|
|
STW scratch
|
|
LDWI 0x0000 ; 0 "Noise", 1 Triangle, 2 Pulse, 3 Sawtooth
|
|
DOKE scratch
|
|
LDWI giga_soundChan4
|
|
STW scratch
|
|
LDWI 0x0000 ; 0 "Noise", 1 Triangle, 2 Pulse, 3 Sawtooth
|
|
DOKE scratch
|
|
RET
|
|
|
|
; ===== PlayTone =============================================================================
|
|
PlayTone LSLW
|
|
STW scratch
|
|
LDWI giga_notesTable
|
|
ADDW scratch
|
|
STW scratch
|
|
LUP 0x00 ; get ROM midi note low byte
|
|
ST _pt_key
|
|
LDW scratch
|
|
LUP 0x01 ; get ROM midi note high byte
|
|
ST _pt_key + 1
|
|
LDW _pt_key
|
|
DOKE soundChan1
|
|
DOKE soundChan2
|
|
LDI 0
|
|
DOKE soundChan3
|
|
DOKE soundChan4
|
|
LDI 3
|
|
ST giga_soundTimer
|
|
RET
|
|
|
|
; ===== GameOver =============================================================================
|
|
GameOver PUSH
|
|
LD brokencount
|
|
SUBI 14*8
|
|
BGE _go_victory
|
|
_go_defeat LDWI string_gameover
|
|
BRA _go_printtext
|
|
_go_victory LDWI string_victory
|
|
_go_printtext STW PrintText_Str
|
|
LDWI giga_vram + (0x0300+34)
|
|
STW PrintText_Pos
|
|
CALL PrintText
|
|
|
|
_go_wait LDI 1
|
|
CALL WaitVBlanks
|
|
LD giga_buttonState
|
|
ANDI buttonA
|
|
BNE _go_wait
|
|
POP
|
|
RET
|
|
|
|
_startAddress_ EQU entry_point
|
|
_callTable_ EQU 0x007E
|
|
_singleStepWatch_ EQU giga_frameCount
|
|
_cpuUsageAddressA_ EQU subroutines3
|
|
_cpuUsageAddressB_ EQU subroutines3+0x10 ; WaitVBlank
|
|
|