Files
alttpr-baserom/inverted.asm
cassidoxa 3e2362b7ca Implement initial SRAM table
Data in initialsramtable.asm gets copied to SRAM on save file init
Frontend will be responsible for setting this, requires frontend changes
Changed some label names to disambiguate WRAM and SRAM labels
Deleted open mode
2022-02-03 20:25:32 -05:00

265 lines
7.5 KiB
NASM

; Does tile modification for... the pyramid of power hole
; after Ganon slams into it in bat form?
Overworld_CreatePyramidHoleModified:
LDA.l InvertedMode : BNE +
JMP .originalBehaviour
+
.invertedBehavior
REP #$30
LDX.w #$0440
LDA.w #$0E39
JSL Overworld_DrawPersistentMap16
LDX.w #$04BC
LDA.w #$0E3A
JSL C9DE_LONG
JSL C9DE_LONG
JSL C9DE_LONG
JSL C9DE_LONG
LDX.w #$053C
JSL C9DE_LONG
JSL C9DE_LONG
JSL C9DE_LONG
JSL C9DE_LONG
LDX.w #$05BE
LDA.w #$0490
JSL C9DE_LONG
JSL C9DE_LONG
LDA.w #$FFFF : STA $1012, Y
JMP .ending
.originalBehaviour
REP #$30
LDX.w #$03BC
LDA.w #$0E39
JSL Overworld_DrawPersistentMap16
LDX.w #$03BE
LDA.w #$0E3A
JSL C9DE_LONG
JSL C9DE_LONG
LDX.w #$043C
JSL C9DE_LONG
JSL C9DE_LONG
JSL C9DE_LONG
LDX.w #$04BC
JSL C9DE_LONG
JSL C9DE_LONG
JSL C9DE_LONG
LDA.w #$FFFF : STA $1012, Y
.ending
LDA.w #$3515 : STA $012D
SEP #$30
LDA OverworldEventDataWRAM+$5B : ORA.b #$20 : STA OverworldEventDataWRAM+$5B
LDA.b #$03 : STA $012F
LDA.b #$01 : STA $14
RTL
;------------------------------------------------------------------------------
Draw_PyramidOverlay:
LDA.l InvertedMode : AND.w #$00FF : BNE .done
.normal
LDA.w #$0E39 : STA $23BC
INC A : STA $23BE
INC A : STA $23C0
INC A : STA $243C
INC A : STA $243E
INC A : STA $2440
INC A : STA $24BC
INC A : STA $24BE
INC A : STA $24C0
.done
RTL
;------------------------------------------------------------------------------
Inverted_TR_TileAttributes:
db $27, $27, $27, $27, $27, $27, $02, $02, $01, $01, $01, $00, $00, $00, $00, $00
db $27, $01, $01, $01, $01, $01, $02, $02, $27, $27, $27, $00, $00, $00, $00, $00
db $27, $01, $01, $01, $20, $01, $02, $02, $27, $27, $27, $00, $00, $00, $00, $00
db $27, $01, $01, $01, $01, $20, $02, $02, $02, $02, $02, $00, $00, $00, $00, $00
db $01, $01, $01, $01, $1A, $01, $12, $01, $01, $02, $01, $01, $28, $2E, $2A, $2B
db $01, $01, $18, $18, $1A, $01, $12, $01, $01, $2C, $02, $2D, $29, $2F, $02, $02
db $01, $01, $01, $01, $01, $01, $02, $01, $02, $2E, $00, $00, $2C, $00, $4E, $4F
db $01, $01, $01, $01, $01, $01, $02, $01, $02, $00, $2E, $00, $00, $00, $02, $22
db $01, $01, $02, $00, $00, $00, $18, $12, $02, $02, $00, $48, $00, $00, $00, $00
db $01, $01, $02, $00, $01, $01, $10, $1A, $02, $00, $00, $48, $00, $00, $00, $00
db $10, $10, $02, $00, $01, $01, $01, $01, $00, $00, $48, $00, $00, $09, $00, $00
db $02, $02, $02, $00, $01, $01, $2B, $00, $00, $09, $00, $00, $00, $00, $00, $00
db $01, $01, $01, $01, $01, $01, $02, $02, $02, $02, $02, $02, $02, $00, $00, $00
db $01, $01, $01, $01, $01, $01, $02, $02, $02, $02, $02, $02, $02, $00, $00, $00
db $01, $01, $01, $46, $01, $01, $02, $02, $02, $02, $02, $02, $02, $00, $00, $00
db $01, $01, $01, $01, $01, $01, $02, $02, $02, $02, $02, $02, $02, $00, $00, $00
db $02, $02, $42, $02, $02, $02, $02, $02, $02, $02, $29, $22, $00, $00, $00, $00
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $29, $22, $00, $00, $00, $00
db $00, $02, $02, $02, $00, $00, $02, $02, $02, $02, $00, $00, $00, $00, $00, $00
db $00, $02, $02, $02, $02, $29, $02, $02, $02, $02, $00, $00, $00, $00, $00, $00
db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $02, $44
db $01, $01, $01, $01, $01, $01, $01, $01, $02, $02, $02, $00, $00, $00, $02, $44
db $01, $01, $01, $01, $01, $01, $01, $01, $02, $02, $02, $00, $00, $00, $00, $00
db $01, $01, $43, $01, $01, $01, $01, $01, $02, $02, $02, $00, $00, $00, $00, $00
db $50, $02, $54, $51, $57, $57, $56, $56, $27, $27, $27, $00, $40, $40, $48, $48
db $50, $02, $54, $51, $57, $2A, $56, $56, $27, $27, $27, $00, $40, $40, $57, $48
db $27, $02, $52, $53, $02, $01, $12, $18, $55, $55, $00, $00, $48, $02, $02, $00
db $27, $02, $52, $53, $09, $01, $1A, $10, $55, $55, $00, $00, $48, $02, $02, $00
db $02, $02, $18, $08, $08, $08, $09, $09, $08, $08, $29, $02, $02, $02, $1A, $02
db $08, $08, $10, $08, $12, $00, $09, $09, $09, $09, $09, $48, $09, $29, $00, $4B
db $02, $02, $02, $00, $08, $02, $02, $00, $00, $00, $00, $01, $00, $00, $20, $00
db $02, $02, $02, $02, $02, $02, $02, $00, $00, $01, $01, $01, $02, $00, $08, $00
Electric_Barrier:
LDA InvertedMode : BEQ .done
LDA OverworldEventDataWRAM, X : ORA #$40 : STA OverworldEventDataWRAM, X ;set barrier dead
.done
LDA OverworldEventDataWRAM, X ; what we wrote over
RTL
GanonTowerAnimation:
LDA InvertedMode : BEQ .done
LDA.b #$1B : STA $012F
STZ $04C6
STZ $B0
STZ $0710
STZ $02E4
STZ $0FC1
STZ $011A
STZ $011B
STZ $011C
STZ $011D
LDA.b #$02 : STA $012C
LDA.b #$09 : STA $012D
RTL
.done
LDA.b #$05 : STA $04C6 ;what we wrote over
STZ $B0 ; (continued)
STZ $C8 ; (continued)
RTL
GanonTowerInvertedCheck:
{
LDA InvertedMode : BEQ .done
LDA #$01 ; Load a random value so it doesn't BEQ
RTL
.done
LDA $8A : CMP.b #$43 ;what we wrote over
RTL
}
;Hard coded rock removed in LW for Inverted mode
HardcodedRocks:
LDA InvertedMode : AND.w #$00FF : BEQ .normalrocks
BRA .noRock2
.normalrocks
LDA.w #$020F : LDX $8A : CPX.w #$0033 : BNE .noRock
STA $7E22A8
.noRock
CPX.w #$002F : BNE .noRock2
STA $7E2BB2
.noRock2
RTL
TurtleRockPegSolved:
LDA.l InvertedMode : AND.w #$00FF : BNE +
LDA.l OverworldEventDataWRAM+07 ; What we wrote over (reading flags for this screen)
RTL
+
LDA.w #$0020 ; We always treat puzzle as pre solved (overlay flag set) for inverted mode.
RTL
MirrorBonk:
; must preserve X/Y, and must preserve $00-$0F
LDA.l InvertedMode : BEQ .normal
; Goal: use $20 and $22 to decide to force a bonk
; if we want to bonk branch to .forceBonk
; otherwise fall through to .normal
PHX : PHP
PHB : PHK : PLB
LDA $8A : AND.b #$40 : BEQ .endLoop ;World we're in? branch if we are in LW we don't want bonks
REP #$30
LDX #$0000
.loop
LDA.l .bonkRectanglesTable, X ;Load X1
CMP $22 : !BGE ++
;IF X > X1
LDA.l .bonkRectanglesTable+2, X ; Load X2
CMP $22 : !BLT ++
;IF X < X2
LDA.l .bonkRectanglesTable+4, X ;Load Y1
CMP $20 : !BGE ++
;IF Y > Y1
LDA.l .bonkRectanglesTable+6, X ; Load Y2
CMP $20 : !BLT ++
;IF Y < Y2
;Bonk Here
PLB : PLP : PLX
BRA .forceBonk
++
TXA : !ADD #$0008 : CMP #.tableEnd-.bonkRectanglesTable : BEQ .endLoop
TAX
BRA .loop
.endbonkRectanglesTable
.endLoop
PLB : PLP : PLX
.normal
;Not forcing a bonk, so the vanilla bonk detection run.
LDA $0C : ORA $0E
JML.l MirrorBonk_NormalReturn
.forceBonk
JML.l MirrorBonk_BranchGamma
.bonkRectanglesTable
;X1 X2 Y1 Y2
dw #$0290, #$02C8, #$0CA8, #$0CF8 ;Desert checkerboard cave2
dw #$05F8, #$0A00, #$0600, #$0660 ;Castle Top
dw #$05B0, #$06A0, #$0660, #$0830 ;Castle Top
dw #$06A0, #$0770, #$0660, #$0680 ;Castle Top
dw #$0880, #$0950, #$0660, #$0688 ;Castle Top
dw #$0950, #$0A00, #$0660, #$0830 ;Castle Top
dw #$07B8, #$0848, #$08E0, #$0970 ;Castle Bridge
dw #$02EF, #$0321, #$0C16, #$0CA2 ;Desert (Mazeblock cave)
dw #$0048, #$008F, #$0B10, #$0B48
dw #$0358, #$0440, #$0E08, #$0ED0
dw #$03B8, #$0420, #$0ED0, #$0FE8
dw #$0360, #$03C8, #$0EC0, #$0F20
dw #$0C68, #$0D00, #$0D78, #$0DC8
dw #$0F40, #$0F70, #$0618, #$0640 ;Pod/eastern entrance
dw #$0E28, #$0E78, #$0298, #$02E8
dw #$0F10, #$0F80, #$01F8, #$0238
dw #$0AA8, #$0B90, #$02C8, #$0320
dw #$0D18, #$0D80, #$0040, #$0070
dw #$0EF0, #$0F30, #$0120, #$0160
dw #$0AD0, #$0B00, #$0B50, #$0B70 ;Bridge Left
dw #$0B30, #$0B60, #$0B50, #$0B70 ;Bridge Right
dw #$0678, #$06F0, #$0010, #$0040 ;Ether Island
dw #$02A8, #$02E8, #$0C90, #$0CC0 ;Desert Checkerboard Cave3
.tableEnd