Skip to content

replace switch_s_plus_2a with branch macro #130

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions src/gamemode/branch.asm
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
; 2nd and 3rd instances of playAndEndingHighScore_jmp used to be demo and startDemo respectively
branchOnGameMode:
lda gameMode
jsr switch_s_plus_2a
.addr gameMode_bootScreen
.addr gameMode_waitScreen
.addr gameMode_gameTypeMenu
.addr gameMode_levelMenu
.addr gameMode_playAndEndingHighScore_jmp
.addr gameMode_playAndEndingHighScore_jmp ; use to be demo
.addr gameMode_playAndEndingHighScore_jmp ; used to be startDemo
.addr gameMode_speedTest
branchTo gameMode, \
gameMode_bootScreen, \
gameMode_waitScreen, \
gameMode_gameTypeMenu, \
gameMode_levelMenu, \
gameMode_playAndEndingHighScore_jmp, \
gameMode_playAndEndingHighScore_jmp, \
gameMode_playAndEndingHighScore_jmp, \
gameMode_speedTest

.include "bootscreen.asm"
.include "waitscreen.asm"
Expand Down
9 changes: 4 additions & 5 deletions src/gamemode/gametypemenu/linecap.asm
Original file line number Diff line number Diff line change
Expand Up @@ -104,11 +104,10 @@ linecapMenuControls:
rts

linecapMenuControlsLR:
lda linecapCursorIndex
jsr switch_s_plus_2a
.addr linecapMenuControlsWhen
.addr linecapMenuControlsLinesLevel
.addr linecapMenuControlsHow
branchTo linecapCursorIndex, \
linecapMenuControlsWhen, \
linecapMenuControlsLinesLevel, \
linecapMenuControlsHow
linecapMenuControlsWhen:
lda newlyPressedButtons_player1
and #BUTTON_LEFT|BUTTON_RIGHT
Expand Down
13 changes: 6 additions & 7 deletions src/gamemode/levelmenu.asm
Original file line number Diff line number Diff line change
Expand Up @@ -186,13 +186,12 @@ makeNotReady:
rts

levelControl:
lda levelControlMode
jsr switch_s_plus_2a
.addr levelControlNormal
.addr levelControlCustomLevel
.addr levelControlHearts
.addr levelControlClearHighScores
.addr levelControlClearHighScoresConfirm
branchTo levelControlMode, \
levelControlNormal, \
levelControlCustomLevel, \
levelControlHearts, \
levelControlClearHighScores, \
levelControlClearHighScoresConfirm

levelControlClearHighScores:
lda #$20
Expand Down
30 changes: 19 additions & 11 deletions src/gamemodestate/branch.asm
Original file line number Diff line number Diff line change
@@ -1,17 +1,25 @@
; the return value of this routine dictates if we should wait for nmi or not right after
; initGameBackground gms: 1 acc: 0 - ne
; initGameState gms: 2 acc: 4/0 - ne
; updateCountersAndNonPlayerState gms: 3 acc: 0/1 - ne
; handleGameOver gms: 4 acc: eq (set to $9) if gameOver, $1 otherwise (ne)
; updatePlayer1 gms: 5 acc: $FF - ne
; next gms: 6 acc: $1 ne
; checkForResetKeyCombo gms: 7 acc: 0 or heldButtons - eq if holding down, left and right
; handlePause gms: 8 acc: 0/3 - ne
; vblankThenRunState2 gms: 2 acc eq (set to $2)

branchOnGameModeState:
lda gameModeState
jsr switch_s_plus_2a
.addr gameModeState_initGameBackground ; gms: 1 acc: 0 - ne
.addr gameModeState_initGameState ; gms: 2 acc: 4/0 - ne
.addr gameModeState_updateCountersAndNonPlayerState ; gms: 3 acc: 0/1 - ne
.addr gameModeState_handleGameOver ; gms: 4 acc: eq (set to $9) if gameOver, $1 otherwise (ne)
.addr gameModeState_updatePlayer1 ; gms: 5 acc: $FF - ne
.addr gameModeState_next ; gms: 6 acc: $1 ne
.addr gameModeState_checkForResetKeyCombo ; gms: 7 acc: 0 or heldButtons - eq if holding down, left and right
.addr gameModeState_handlePause ; gms: 8 acc: 0/3 - ne
.addr gameModeState_vblankThenRunState2 ; gms: 2 acc eq (set to $2)
branchTo gameModeState, \
gameModeState_initGameBackground, \
gameModeState_initGameState, \
gameModeState_updateCountersAndNonPlayerState, \
gameModeState_handleGameOver, \
gameModeState_updatePlayer1, \
gameModeState_next, \
gameModeState_checkForResetKeyCombo, \
gameModeState_handlePause, \
gameModeState_vblankThenRunState2

gameModeState_next: ; used to be updatePlayer2
inc gameModeState
Expand Down
58 changes: 58 additions & 0 deletions src/macros.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
.macro _makeRtsTable byte, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15
.if .strat (byte, 0) = '>'
.byte >(a0-1)
.elseif .strat (byte, 0) = '<'
.byte <(a0-1)
.endif
.ifnblank a1 ; recurse until end of argument list
_makeRtsTable byte, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15
.endif
.endmacro

.macro branchTo dest, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15
.scope
; add additional arguments as needed, max a255

.if .blank(a1)
; single destination. 3 cycles.
.warning "branchTo defined with single destination, converting to jmp"
jmp a0

.elseif .blank(a4)
; 2-4 destinations use branching. 8-19 cycles
ldx dest
beq addr0
.ifnblank a2
dex
beq addr1
.ifnblank a3
dex
beq addr2
addr3:
jmp a3
.endif
addr2:
jmp a2
.endif
addr1:
jmp a1
addr0:
jmp a0

.else
; 5+ destinations, use rts branch. 23-26 cycles
; uses each destination-1 and rts to branch
ldx dest
lda hiBytes,x
pha
lda loBytes,x
pha
rts

hiBytes:
_makeRtsTable ">", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15
loBytes:
_makeRtsTable "<", a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15
.endif
.endscope
.endmacro
2 changes: 2 additions & 0 deletions src/main.asm
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
;
; TetrisGYM - A Tetris Practise ROM

.include "macros.asm"
.include "charmap.asm"
.include "constants.asm"
.include "io.asm"
Expand All @@ -13,6 +14,7 @@

.setcpu "6502"
.feature force_range
.linecont

.segment "PRG_chunk1": absolute

Expand Down
14 changes: 7 additions & 7 deletions src/modes/garbage.asm
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
prepareNextGarbage:
lda garbageModifier
jsr switch_s_plus_2a
.addr garbageAlwaysTetrisReady
.addr garbageNormal
.addr garbageSmart
.addr garbageHard
.addr garbageTypeC ; infinite dig
branchTo garbageModifier, \
garbageAlwaysTetrisReady, \
garbageNormal, \
garbageSmart, \
garbageHard, \
garbageTypeC
; garbageTypeC = infinite dig

garbageTypeC:
jsr findTopBulky
Expand Down
21 changes: 10 additions & 11 deletions src/nmi/render.asm
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
render: lda renderMode
jsr switch_s_plus_2a
.addr render_mode_static
.addr render_mode_scroll
.addr render_mode_congratulations_screen
.addr render_mode_play_and_demo
.addr render_mode_pause
.addr render_mode_rocket
.addr render_mode_speed_test
.addr render_mode_level_menu
.addr render_mode_linecap_menu
render: branchTo renderMode, \
render_mode_static, \
render_mode_scroll, \
render_mode_congratulations_screen, \
render_mode_play_and_demo, \
render_mode_pause, \
render_mode_rocket, \
render_mode_speed_test, \
render_mode_level_menu, \
render_mode_linecap_menu

.include "render_mode_level_menu.asm" ; no rts / jmp

Expand Down
28 changes: 14 additions & 14 deletions src/playstate/branch.asm
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
; prepareNext used to be bTypeGoalCheck
branchOnPlayStatePlayer1:
lda playState
jsr switch_s_plus_2a
.addr playState_unassignOrientationId
.addr playState_playerControlsActiveTetrimino
.addr playState_lockTetrimino
.addr playState_checkForCompletedRows
.addr playState_noop
.addr playState_updateLinesAndStatistics
.addr playState_prepareNext ; used to be bTypeGoalCheck
.addr playState_receiveGarbage
.addr playState_spawnNextTetrimino
.addr playState_noop
.addr playState_checkStartGameOver
.addr playState_incrementPlayState
branchTo playState, \
playState_unassignOrientationId, \
playState_playerControlsActiveTetrimino, \
playState_lockTetrimino, \
playState_checkForCompletedRows, \
playState_noop, \
playState_updateLinesAndStatistics, \
playState_prepareNext , \
playState_receiveGarbage, \
playState_spawnNextTetrimino, \
playState_noop, \
playState_checkStartGameOver, \
playState_incrementPlayState

playState_unassignOrientationId:
lda #$13
Expand Down
2 changes: 0 additions & 2 deletions src/ram.asm
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ tmp3: .res 1
tmpX: .res 1 ; $0003
tmpY: .res 1 ; $0004
tmpZ: .res 1 ; $0005
switchTmp1 := tmpX ; for switch_s_plus_2a
switchTmp2 := tmpY

tmpBulkCopyToPpuReturnAddr: .res 2 ; $0006 ; 2 bytes
binScore: .res 4 ; $8 ; 4 bytes binary
Expand Down
16 changes: 0 additions & 16 deletions src/util/core.asm
Original file line number Diff line number Diff line change
Expand Up @@ -285,19 +285,3 @@ memset_page:
inx
bne @setByte
rts

switch_s_plus_2a:
asl a
tay
iny
pla
sta switchTmp1
pla
sta switchTmp2
lda (switchTmp1),y
tax
iny
lda (switchTmp1),y
sta switchTmp2
stx switchTmp1
jmp (switchTmp1)