Add SNES hardware registers and patches documentation

This commit is contained in:
scawful
2025-10-01 12:41:57 -04:00
parent 3066aae151
commit ed1a30adce
3 changed files with 480 additions and 0 deletions

47
Core/ZS ROM MAP.txt Normal file
View File

@@ -0,0 +1,47 @@
Expanded space used by ZScream as of 02/28/2025
Addresses are PC unless stated otherwise.
ZS reserves everything up to 1.5MB or up to 0x150000
And an additional 3 banks at the end of the 2.0MB 0x1E8000 to 0x1FFFFF
0x100000 - 0x107FFF: 1 Bank
Nothing?
0x108000 - 0x10FFFF: 1 Bank
Title screen data
Dungeon map data
0x110000 - 0x117FFF: 1 Bank
Default room header location
Seems to have been some old dungeon object data expansion but that has since been moved.
0x118000 - 0x11FFFF: 1 Bank
Seems to have been some old dungeon object data expansion but that has since been moved.
0x120000 - 0x127FFF: 1 Bank
Expanded overlay data
0x128000 - 0x12FFFF: 1 Bank
Custom collision data
0x130000 - 0x137FFF: 1 Bank
Overworld map data overflow
0x138000 - 0x13FFFF: 1 Bank
Expanded Dungeon object data
0x140000 - 0x147FFF: 1 Bank
Custom overworld data
0x148000 - 0x14FFFF: 1 Bank
Expanded Dungeon object data
0x1E0000 - 0x1E7FFF: 1 Bank
Custom ASM Patches
0x1E8000 - 0x1EFFFF: 1 Bank
Expanded Tile16 space
0x1F0000 - 0x1FFFFF: 2 Banks
Edpanded Tile32 space

159
Core/patches.asm Normal file
View File

@@ -0,0 +1,159 @@
; This file contains all direct patches to the original ROM.
; It is included from Oracle_main.asm.
; UnderworldTransition_ScrollRoom
org $02BE5E : JSL Graphics_Transfer
; Whirlpool
org $1EEEE4 : JSL DontTeleportWithoutFlippers
; SpriteDraw_Roller
org $058EE6 : JSL PutRollerBeneathLink
; =========================================================
; Sprite Recoil and Death
; TODO: Sprite_AttemptKillingOfKin
; Kydreeok Head die like Sidenexx
org $06F003 : CMP.b #$CF
; Remove sidenexx death from booki
org $06EFFF : NOP #4
; Make Dark Link die like sidenexx
org $06F003 : CMP.b #$C1
; Make Helmet ChuChu recoil link
org $06F37D : CMP.b #$05
; Make Kydreeok head recoil Link
org $06F381 : CMP.b #$CF
; =========================================================
InCutScene = $7EF303
; Player2JoypadReturn
org $0083F8
LDA InCutScene : BEQ .notInCutscene
STZ $F0
STZ $F2
STZ $F4
STZ $F6
STZ $F8
STZ $FA ; kill all input
.notInCutscene
RTS
assert pc() <= $00841E
; =========================================================
org $1EF27D
ShopItem_Banana:
{
JSR $F4CE ; SpriteDraw_ShopItem
JSR $FE78 ; Sprite_CheckIfActive_Bank1E
JSL $1EF4F3 ; Sprite_BehaveAsBarrier
JSR $F391 ; ShopItem_CheckForAPress
BCC .exit
LDA.l Bananas : CMP.b #$0A : BCS .error
LDA.b #$1E : LDY.b #$00
JSR $F39E ; ShopItem_HandleCost
BCC $F1A1 ; ShopItem_GiveFailureMessage
STZ.w SprState,X
INC.b Bananas
LDY.b #$42 : JSR $F366 ; ShopItem_HandleReceipt
.exit
RTS
.error
JSR $F38A ; ShopItem_PlayBeep
}
assert pc() <= $1EF2AB
; =========================================================
; Shop item heart OAM
; SpriteDraw_ShopItem
org $1EF42E
dw -4, 16 : db $03, $02, $00, $00 ; 3
dw -4, 16 : db $03, $02, $00, $00 ; 3
dw 4, 16 : db $30, $02, $00, $00 ; 0
dw 0, 0 : db $E5, $03, $00, $02 ; item
dw 4, 11 : db $38, $03, $00, $00 ; shadow
; =========================================================
; Octoballoon_FormBabby
; Reduce by half the number of babies spawned
org $06D814 : LDA.b #$02
; SpritePrep_HauntedGroveOstritch
org $068BB2 : NOP #11
; HauntedGroveRabbit_Idle
org $1E9A8F : NOP #5
; MedallionTablet (Goron)
org $05F274 : LDA.l $7EF378 ; Unused SRAM
org $08C2E3 : dw $006F ; BUTTER SWORD DIALOGUE
; Fix the capital 'B' debug item cheat.
org $0CDC26 : db $80 ; replace a $F0 (BEQ) with a $80 (BRA).
; Update Catfish Item Get to Bottle
org $1DE184 : LDA.b #$16 : STA.w $0D90, X
; Follower_Disable
; Don't disable Kiki so we can switch maps with him.
org $09ACF3 : LDA.l $7EF3CC : CMP.b #$0E
; Kiki, don't care if we're not in dark world
org $099FEB : LDA.b $8A : AND.b #$FF
org $1EE48E : NOP #6
; Kiki activate cutscene 3 (tail palace)
org $1EE630 : LDA.b #$03 : STA.w $04C6
; Kid at ranch checks for flute
org $05FF7D : LDA.l $7EF34C : CMP.b #$01
; Raven Damage (LW/DW)
org $068963 : db $81, $84
; Running Man draw palette
org $05E9CD
SpriteDraw_RunningBoy:
#_05E9CD: dw 0, -8 : db $2C, $00, $00, $02
#_05E9D5: dw 0, 0 : db $EE, $0E, $00, $02
#_05E9DD: dw 0, -7 : db $2C, $00, $00, $02
#_05E9E5: dw 0, 1 : db $EE, $4E, $00, $02
#_05E9ED: dw 0, -8 : db $2A, $00, $00, $02
#_05E9F5: dw 0, 0 : db $CA, $0E, $00, $02
#_05E9FD: dw 0, -7 : db $2A, $00, $00, $02
#_05EA05: dw 0, 1 : db $CA, $4E, $00, $02
#_05EA0D: dw 0, -8 : db $2E, $00, $00, $02
#_05EA15: dw 0, 0 : db $CC, $0E, $00, $02
#_05EA1D: dw 0, -7 : db $2E, $00, $00, $02
#_05EA25: dw 0, 1 : db $CE, $0E, $00, $02
#_05EA2D: dw 0, -8 : db $2E, $40, $00, $02
#_05EA35: dw 0, 0 : db $CC, $4E, $00, $02
#_05EA3D: dw 0, -7 : db $2E, $40, $00, $02
#_05EA45: dw 0, 1 : db $CE, $4E, $00, $02
; Sword Barrier Sprite Prep
; Skip overworld flag check, sprite is indoors now
org $06891B : NOP #12

View File

@@ -0,0 +1,274 @@
; ==============================================================================
; SNES Hardware Registers
; ==============================================================================
; Shorthand legend:
; Addr = Address
; APU = Audio Processing Unit
; BG = BackGround
; CGRAM = Color Generator RAM
; Des = Designation
; H = Horizontal
; HDMA = Horizontal Direct Memory Access
; HV = H/V or Horizontal/Vertical
; Init = Initial
; IO = I/O or Input/Output
; IRQ = Interupt ReQuest
; NMI = Non-Maskable Interupt
; Num = Number
; MULT = Multiply/Multiplication
; OAM = Object Attribute Memory
; OBJ = Object
; Pos = Position
; PPU = Picture Processing Unit
; V = Vertical
; Val = Value
; VRAM = Video RAM
; Names taken from:
; https://en.wikibooks.org/wiki/Super_NES_Programming/SNES_Hardware_Registers
; Further details on each register can be found here:
; https://github.com/gilligan/snesdev/blob/master/docs/snes_registers.txt
; https://www.youtube.com/watch?v=-4OOuRvTXrM&t=167s
org $7E2100 ; Remove for asar 2.0.
struct SNES $7E2100
{
.ScreenDisplay: skip $01 ; $2100
.OAMSizeAndDataDes: skip $01 ; $2101
.OAMAccessAddr: skip $02 ; $2102
.OMADataWrite: skip $01 ; $2104
.BGModeAndTileSize: skip $01 ; $2105
.MosaicAndBGEnable: skip $01 ; $2106
.BG1AddrAndSize: skip $01 ; $2107
.BG2AddrAndSize: skip $01 ; $2108
.BG3AddrAndSize: skip $01 ; $2109
.BG4AddrAndSize: skip $01 ; $210A
.BG1And2TileDataDes: skip $01 ; $210B
.BG3And4TileDataDes: skip $01 ; $210C
.BG1HScrollOffset: skip $01 ; $210D
.BG1VScrollOffset: skip $01 ; $210E
.BG2HScrollOffset: skip $01 ; $210F
.BG2VScrollOffset: skip $01 ; $2110
.BG3HScrollOffset: skip $01 ; $2111
.BG3VScrollOffset: skip $01 ; $2112
.BG4HScrollOffset: skip $01 ; $2113
.BG4VScrollOffset: skip $01 ; $2114
.VRAMAddrIncrementVal: skip $01 ; $2115
.VRAMAddrReadWriteLow: skip $01 ; $2116
.VRAMAddrReadWriteHigh: skip $01 ; $2117
.VRAMDataWriteLow: skip $01 ; $2118
.VRAMDataWriteHigh: skip $01 ; $2119
.Mode7Init skip $01 ; $211A
.Mode7MatrixA skip $01 ; $211B
.Mode7MatrixB skip $01 ; $211C
.Mode7MatrixC skip $01 ; $211D
.Mode7MatrixD skip $01 ; $211E
.Mode7CenterPosX skip $01 ; $211F
.Mode7CenterPosY skip $01 ; $2120
.CGRAMWriteAddr skip $01 ; $2121
.CGRAMWriteData skip $01 ; $2122
.BG1And2WindowMask skip $01 ; $2123
.BG3And4WindowMask skip $01 ; $2124
.OBJAndColorWindow skip $01 ; $2125
.Window1LeftPosDes skip $01 ; $2126
.Window1RightPosDes skip $01 ; $2127
.Window2LeftPosDes skip $01 ; $2128
.Window2RightPosDes skip $01 ; $2129
.BG123And4WindowLogic skip $01 ; $212A
.ColorAndOBJWindowLogic skip $01 ; $212B
.BGAndOBJEnableMainScreen skip $01 ; $212C
.BGAndOBJEnableSubScreen skip $01 ; $212D
.WindowMaskDesMainScreen skip $01 ; $212E
.WindowMaskDesSubScreen skip $01 ; $212F
.InitColorAddition skip $01 ; $2130
.AddSubtractSelectAndEnable skip $01 ; $2131
.FixedColorData skip $01 ; $2132
.ScreenInit skip $01 ; $2133
.MultResultLow skip $01 ; $2134
.MultResultMid skip $01 ; $2135
.MultResultHigh skip $01 ; $2136
.HVCounterSoftwareLatch skip $01 ; $2137
.OAMReadDataLowHigh skip $01 ; $2138
.VRAMReadDataLow skip $01 ; $2139
.VRAMReadDataHigh skip $01 ; $213A
.CGRAMReadDataLowHigh skip $01 ; $213B
.HCounterData skip $01 ; $213C
.VCounterData skip $01 ; $213D
.PPUStatusFlag1 skip $01 ; $213E
.PPUStatusFlag2 skip $01 ; $213F
.APUIOPort0 skip $01 ; $2140
.APUIOPort1 skip $01 ; $2141
.APUIOPort2 skip $01 ; $2142
.APUIOPort3 skip $01 ; $2143
base $2180
.IndirectWorkRAMPort: skip $01 ; $2180
.IndirectWorkRAMAddrLow: skip $01 ; $2181
.IndirectWorkRAMAddrMid: skip $01 ; $2182
.IndirectWorkRAMAddrHigh: skip $01 ; $2183
base $4200
.NMIVHCountJoypadEnable: skip $01 ; $4200
.ProgrammableIOPortOut: skip $01 ; $4201
.MultiplicandA: skip $01 ; $4202
.MultiplierB: skip $01 ; $4203
.DividendLow: skip $01 ; $4204
.DividendHigh: skip $01 ; $4205
.DivisorB: skip $01 ; $4206
.HCountTimer: skip $01 ; $4207
.HCountTimerHigh: skip $01 ; $4208
.VCountTImer: skip $01 ; $4209
.VCountTimerHigh: skip $01 ; $420A
.DMAChannelEnable: skip $01 ; $420B
.HDMAChannelEnable: skip $01 ; $420C
.CycleSpeedDes: skip $01 ; $420D
base $4210
.NMIFlagAndCPUVersionNum: skip $01 ; $4210
.IRQFlagByHVCountTimer: skip $01 ; $4211
.HVBlankFlagsAndJoyStatus: skip $01 ; $4212
.ProgrammableIOPortIn: skip $01 ; $4213
.DivideResultQuotientLow: skip $01 ; $4214
.DivideResultQuotientHigh: skip $01 ; $4215
.RemainderResultLow: skip $01 ; $4216
.RemainderResultHigh: skip $01 ; $4217
.JoyPad1DataLow: skip $01 ; $4218
.JoyPad1DataHigh: skip $01 ; $4219
.JoyPad2DataLow: skip $01 ; $421A
.JoyPad2DataHigh: skip $01 ; $421B
.JoyPad3DataLow: skip $01 ; $421C
.JoyPad3DataHigh: skip $01 ; $421D
.JoyPad4DataLow: skip $01 ; $421E
.JoyPad4DataHigh: skip $01 ; $421F
}
endstruct
struct DMA $7E4300
{
; Channel 0
.0_TransferParameters: skip $01 ; $4300
.0_DestinationAddr: skip $01 ; $4301
.0_SourceAddrOffsetLow: skip $01 ; $4302
.0_SourceAddrOffsetHigh: skip $01 ; $4303
.0_SourceAddrBank: skip $01 ; $4304
.0_TransferSizeLow: skip $01 ; $4305
.0_TransferSizeHigh: skip $01 ; $4306
.0_DataBank: skip $01 ; $4307
.0_TableAddrLow: skip $01 ; $4308
.0_TableAddrHigh: skip $01 ; $4309
.0_TransferLineNum: skip $01 ; $430A
base $4310 ; Channel 1
.1_TransferParameters: skip $01 ; $4310
.1_DestinationAddr: skip $01 ; $4311
.1_SourceAddrOffsetLow: skip $01 ; $4312
.1_SourceAddrOffsetHigh: skip $01 ; $4313
.1_SourceAddrBank: skip $01 ; $4314
.1_TransferSizeLow: skip $01 ; $4315
.1_TransferSizeHigh: skip $01 ; $4316
.1_DataBank: skip $01 ; $4317
.1_TableAddrLow: skip $01 ; $4318
.1_TableAddrHigh: skip $01 ; $4319
.1_TransferLineNum: skip $01 ; $431A
base $4320 ; Channel 2
.2_TransferParameters: skip $01 ; $4320
.2_DestinationAddr: skip $01 ; $4321
.2_SourceAddrOffsetLow: skip $01 ; $4322
.2_SourceAddrOffsetHigh: skip $01 ; $4323
.2_SourceAddrBank: skip $01 ; $4324
.2_TransferSizeLow: skip $01 ; $4325
.2_TransferSizeHigh: skip $01 ; $4326
.2_DataBank: skip $01 ; $4327
.2_TableAddrLow: skip $01 ; $4328
.2_TableAddrHigh: skip $01 ; $4329
.2_TransferLineNum: skip $01 ; $432A
base $4330 ; Channel 3
.3_TransferParameters: skip $01 ; $4330
.3_DestinationAddr: skip $01 ; $4331
.3_SourceAddrOffsetLow: skip $01 ; $4332
.3_SourceAddrOffsetHigh: skip $01 ; $4333
.3_SourceAddrBank: skip $01 ; $4334
.3_TransferSizeLow: skip $01 ; $4335
.3_TransferSizeHigh: skip $01 ; $4336
.3_DataBank: skip $01 ; $4337
.3_TableAddrLow: skip $01 ; $4338
.3_TableAddrHigh: skip $01 ; $4339
.3_TransferLineNum: skip $01 ; $433A
base $4340 ; Channel 4
.4_TransferParameters: skip $01 ; $4340
.4_DestinationAddr: skip $01 ; $4341
.4_SourceAddrOffsetLow: skip $01 ; $4342
.4_SourceAddrOffsetHigh: skip $01 ; $4343
.4_SourceAddrBank: skip $01 ; $4344
.4_TransferSizeLow: skip $01 ; $4345
.4_TransferSizeHigh: skip $01 ; $4346
.4_DataBank: skip $01 ; $4347
.4_TableAddrLow: skip $01 ; $4348
.4_TableAddrHigh: skip $01 ; $4349
.4_TransferLineNum: skip $01 ; $434A
base $4350 ; Channel 5
.5_TransferParameters: skip $01 ; $4350
.5_DestinationAddr: skip $01 ; $4351
.5_SourceAddrOffsetLow: skip $01 ; $4352
.5_SourceAddrOffsetHigh: skip $01 ; $4353
.5_SourceAddrBank: skip $01 ; $4354
.5_TransferSizeLow: skip $01 ; $4355
.5_TransferSizeHigh: skip $01 ; $4356
.5_DataBank: skip $01 ; $4357
.5_TableAddrLow: skip $01 ; $4358
.5_TableAddrHigh: skip $01 ; $4359
.5_TransferLineNum: skip $01 ; $435A
base $4360 ; Channel 6
.6_TransferParameters: skip $01 ; $4360
.6_DestinationAddr: skip $01 ; $4361
.6_SourceAddrOffsetLow: skip $01 ; $4362
.6_SourceAddrOffsetHigh: skip $01 ; $4363
.6_SourceAddrBank: skip $01 ; $4364
.6_TransferSizeLow: skip $01 ; $4365
.6_TransferSizeHigh: skip $01 ; $4366
.6_DataBank: skip $01 ; $4367
.6_TableAddrLow: skip $01 ; $4368
.6_TableAddrHigh: skip $01 ; $4369
.6_TransferLineNum: skip $01 ; $436A
base $4370 ; Channel 7
.7_TransferParameters: skip $01 ; $4370
.7_DestinationAddr: skip $01 ; $4371
.7_SourceAddrOffsetLow: skip $01 ; $4372
.7_SourceAddrOffsetHigh: skip $01 ; $4373
.7_SourceAddrBank: skip $01 ; $4374
.7_TransferSizeLow: skip $01 ; $4375
.7_TransferSizeHigh: skip $01 ; $4376
.7_DataBank: skip $01 ; $4377
.7_TableAddrLow: skip $01 ; $4378
.7_TableAddrHigh: skip $01 ; $4379
.7_TransferLineNum: skip $01 ; $437A
}
endstruct
; ==============================================================================