Skip to content

Commit

Permalink
handicap: Reduce PRG with Type B playfield init
Browse files Browse the repository at this point in the history
Reusing the type b playfield initialization logic, the code shrunk so it
fits in the leftover space of height_menu_nametablepalette_patch.
  • Loading branch information
ejona86 committed Mar 17, 2020
1 parent c1246b3 commit 72e3543
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 48 deletions.
20 changes: 12 additions & 8 deletions handicap.ips.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,18 @@ MEMORY {
ENABLE_HEIGHT_IN_TYPE_A: start = $8540, size = $0002;
ENABLE_HEIGHT_IN_TYPE_A2HDR:start = $0000, size = $0005;
ENABLE_HEIGHT_IN_TYPE_A2: start = $8581, size = $0002;
JMP_INIT_GAME_STATEHDR:start = $0000, size = $0005;
JMP_INIT_GAME_STATE: start = $873F, size = $0003;
JMP_INIT_PLAYFIELDHDR:start = $0000, size = $0005;
JMP_INIT_PLAYFIELD: start = $87DE, size = $0003;
INIT_PLAYFIELD_IF_TYPE_B_CLEAR1HDR:start = $0000, size = $0005;
INIT_PLAYFIELD_IF_TYPE_B_CLEAR1: start = $885D, size = $0006;
INIT_PLAYFIELD_IF_TYPE_B_CLEAR2HDR:start = $0000, size = $0005;
INIT_PLAYFIELD_IF_TYPE_B_CLEAR2: start = $886D, size = $0006;
IS_POSITION_VALID_MODHDR:start = $0000, size = $0005;
IS_POSITION_VALID_MOD: start = $94B2, size = $0002;
JMP_CHECK_FOR_COMPLETED_ROWSHDR:start = $0000, size = $0005;
JMP_CHECK_FOR_COMPLETED_ROWS: start = $9A8C, size = $0003;
TYPE_A_MENU_PATCHHDR:start = $0000, size = $0005;
TYPE_A_MENU_PATCH :start = $C95D, size = $0049;
UNREFERENCED_DATA3HDR:start = $0000, size = $0005;
UNREFERENCED_DATA3: start = $E0C8, size = $003B;
IPSEOF: start = $0000, size = $0003;
}

Expand All @@ -24,14 +26,16 @@ SEGMENTS {
ENABLE_HEIGHT_IN_TYPE_A: load = ENABLE_HEIGHT_IN_TYPE_A, define = yes;
ENABLE_HEIGHT_IN_TYPE_A2HDR:load = ENABLE_HEIGHT_IN_TYPE_A2HDR;
ENABLE_HEIGHT_IN_TYPE_A2: load = ENABLE_HEIGHT_IN_TYPE_A2, define = yes;
INIT_PLAYFIELD_IF_TYPE_B_CLEAR1HDR:load = INIT_PLAYFIELD_IF_TYPE_B_CLEAR1HDR;
INIT_PLAYFIELD_IF_TYPE_B_CLEAR1: load = INIT_PLAYFIELD_IF_TYPE_B_CLEAR1, define = yes;
INIT_PLAYFIELD_IF_TYPE_B_CLEAR2HDR:load = INIT_PLAYFIELD_IF_TYPE_B_CLEAR2HDR;
INIT_PLAYFIELD_IF_TYPE_B_CLEAR2: load = INIT_PLAYFIELD_IF_TYPE_B_CLEAR2, define = yes;
IS_POSITION_VALID_MODHDR:load = IS_POSITION_VALID_MODHDR;
IS_POSITION_VALID_MOD: load = IS_POSITION_VALID_MOD, define = yes;
JMP_INIT_GAME_STATEHDR: load = JMP_INIT_GAME_STATEHDR;
JMP_INIT_GAME_STATE: load = JMP_INIT_GAME_STATE, define = yes;
JMP_INIT_PLAYFIELDHDR: load = JMP_INIT_PLAYFIELDHDR;
JMP_INIT_PLAYFIELD: load = JMP_INIT_PLAYFIELD, define = yes;
JMP_CHECK_FOR_COMPLETED_ROWSHDR: load = JMP_CHECK_FOR_COMPLETED_ROWSHDR;
JMP_CHECK_FOR_COMPLETED_ROWS: load = JMP_CHECK_FOR_COMPLETED_ROWS, define = yes;
TYPE_A_MENU_PATCHHDR: load = TYPE_A_MENU_PATCHHDR;
TYPE_A_MENU_PATCH: load = TYPE_A_MENU_PATCH, define = yes;
UNREFERENCED_DATA3HDR: load = UNREFERENCED_DATA3HDR;
UNREFERENCED_DATA3: load = UNREFERENCED_DATA3, define = yes;
}
88 changes: 49 additions & 39 deletions handicap.s
Original file line number Diff line number Diff line change
Expand Up @@ -19,51 +19,36 @@ playfieldSize := $0043
player1_playfieldSize := $0063
player2_playfieldSize := $0084

initGameState_mod:
jsr chooseNextTetrimino ; replaced code

jsr makePlayer1Active
jsr initPlayfieldSize
jsr savePlayer1State

jsr makePlayer2Active
jsr initPlayfieldSize
jmp savePlayer2State

initPlayfieldSize:
lda gameType
bne @typeB
initPlayfield_mod:
beq @typeA
lda #20+2
sta player1_playfieldSize
sta player2_playfieldSize
jmp $87E3 ; @initPlayfieldForTypeB

@typeA:
ldx player1_startHeight
lda heightToSizeTable,x
sta player1_playfieldSize
ldx player2_startHeight
lda heightToSizeTable,x
sta player2_playfieldSize

ldx startHeight
ldy typeBBlankInitCountByHeightTable,x
lda #$4F
@setRows:
cpy #200
beq @ret
sta (playfieldAddr),y
iny
bne @setRows

@typeB:
ldx #$00
@ret:
lda heightToSizeTable,x
sta playfieldSize
rts
ldx #$04
ldy #$05
jsr memset_page
; right after "bne @copyPlayfieldToPlayer2" in initPlayfieldIfTypeB
jmp $8855


heightToSizeTable:
.byte 20+2, 17+2, 15+2, 12+2, 10+2, 8+2

.segment "UNREFERENCED_DATA3HDR"
ips_hunkhdr "UNREFERENCED_DATA3"

.segment "UNREFERENCED_DATA3"

checkForCompletedRows_mod:
tay ; replaced code
lda generalCounter2
; clc performed recently
adc #$02
cmp playfieldSize
bmi @noskip
Expand All @@ -72,13 +57,14 @@ checkForCompletedRows_mod:
ldx #$0A ; replaced code
rts

.segment "JMP_INIT_GAME_STATEHDR"
ips_hunkhdr "JMP_INIT_GAME_STATE"
.segment "JMP_INIT_PLAYFIELDHDR"
ips_hunkhdr "JMP_INIT_PLAYFIELD"

.segment "JMP_INIT_GAME_STATE"
.segment "JMP_INIT_PLAYFIELD"

; within initGameState, replaces "jsr chooseNextTetrimino" after "sta player2_autorepeatY"
jsr initGameState_mod
; within initPlayfieldIfTypeB, replaces "bne @initPlayfieldForTypeB" and a byte
; of the next jmp instruction
jmp initPlayfield_mod

.segment "JMP_CHECK_FOR_COMPLETED_ROWSHDR"
ips_hunkhdr "JMP_CHECK_FOR_COMPLETED_ROWS"
Expand Down Expand Up @@ -111,3 +97,27 @@ checkForCompletedRows_mod:

; at @checkSquare in isPositionValid, replaces "cmp #$16"
cmp playfieldSize

.segment "INIT_PLAYFIELD_IF_TYPE_B_CLEAR1HDR"
ips_hunkhdr "INIT_PLAYFIELD_IF_TYPE_B_CLEAR1"

.segment "INIT_PLAYFIELD_IF_TYPE_B_CLEAR1"

; at @emptyAboveHeight_player1 in initPlayfieldIfTypeB, replaces "sta playfield,y; dey; cpy #$FF".
; Reorder dey to avoid off-by-one bug in
; typeBBlankInitCountByHeightTable
dey
sta playfield,y
; This causes the emptying loop to underflow and clear the unused
; memory at the top of the page, which is necessary for isPositionValid
cpy #$C8+1

.segment "INIT_PLAYFIELD_IF_TYPE_B_CLEAR2HDR"
ips_hunkhdr "INIT_PLAYFIELD_IF_TYPE_B_CLEAR2"

.segment "INIT_PLAYFIELD_IF_TYPE_B_CLEAR2"

; at @emptyAboveHeight_player2 in initPlayfieldIfTypeB, replaces "sta playfieldForSecondPlayer,y; dey; cpy #$FF".
dey
sta playfieldForSecondPlayer,y
cpy #$C8+1
10 changes: 9 additions & 1 deletion tetris-PRG.info
Original file line number Diff line number Diff line change
Expand Up @@ -595,7 +595,15 @@ LABEL { ADDR $87C7; NAME "@ret"; };
LABEL { ADDR $87C8; NAME "savePlayer2State"; COMMENT "Copies $40 to $80"; };
LABEL { ADDR $87CA; NAME "@whileXNotNeg1"; };
LABEL { ADDR $87DC; NAME "initPlayfieldIfTypeB"; };
LABEL { ADDR $87E3; NAME "initPlayfieldForTypeB"; };
LABEL { ADDR $87E3; NAME "@initPlayfieldForTypeB"; };
LABEL { ADDR $87E7; NAME "@randomizeRow"; };
LABEL { ADDR $87FC; NAME "@setRandomBlock"; };
LABEL { ADDR $8824; NAME "@emptyRandomBlock"; };
LABEL { ADDR $884A; NAME "@randomDone"; };
LABEL { ADDR $884C; NAME "@copyPlayfieldToPlayer2"; };
LABEL { ADDR $885D; NAME "@emptyAboveHeight_player1"; };
LABEL { ADDR $886D; NAME "@emptyAboveHeight_player2"; };
LABEL { ADDR $8875; NAME "@ret"; };
LABEL { ADDR $8884; NAME "gameModeState_updateCountersAndNonPlayerState"; };
LABEL { ADDR $889C; NAME "@checkSelectButtonPressed"; };
LABEL { ADDR $88A8; NAME "@ret"; };
Expand Down

0 comments on commit 72e3543

Please sign in to comment.