Compare commits
61 Commits
kara_dr_tr
...
bombos_onl
| Author | SHA1 | Date | |
|---|---|---|---|
| a5b068b15f | |||
| bfc361ad3e | |||
| f7070dd30f | |||
| 9d485e86cd | |||
| ba660409bf | |||
| 3d93b0160f | |||
| bb35409bc8 | |||
| ffdb5e837a | |||
| 4d4ae6b894 | |||
| 4f4f46352d | |||
| 103c41ae94 | |||
| 90a4c50a01 | |||
| 3acc2a3f45 | |||
| 5fd285c767 | |||
| 7f551ad1a4 | |||
|
|
96e3427868 | ||
| f629bcb15a | |||
| 02ea894a40 | |||
| ac81fcbf0f | |||
| 265089cedb | |||
| 6279f32fe3 | |||
| 843f1cad6f | |||
| c23b4ad5b2 | |||
| 22b9c17f09 | |||
| e210c85710 | |||
| e50641db11 | |||
| 1ec9f22cea | |||
| 18a2214b23 | |||
| f2a0cfc098 | |||
| 6565fbfd65 | |||
| ae0a5c685a | |||
| c323a71340 | |||
| f3e0def5a2 | |||
| 1fcde00d09 | |||
| 123dcddc94 | |||
| 7c8ef3afce | |||
| 74e2f96e0a | |||
| dafef001be | |||
| 3f4db583f5 | |||
| 44f3f10bc1 | |||
| 2bb5ec87b0 | |||
| 86a1f82d23 | |||
| 1071b834cd | |||
| 2693e73a21 | |||
| 6d52427696 | |||
| 374abe7e88 | |||
| 1b698808c3 | |||
| 62c81f2cf3 | |||
| 08166fe669 | |||
| 70ec318204 | |||
| 081411a448 | |||
| 55fd818f55 | |||
| 37b90894e3 | |||
| f6983cee35 | |||
| 642205bc68 | |||
| a8bc95bd1f | |||
| 0dcef701df | |||
| 1dafb620b0 | |||
| 828a9df7d9 | |||
| ea72d70b1b | |||
| bf953e7953 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,5 +1,3 @@
|
|||||||
tournament.asm
|
tournament.asm
|
||||||
/build
|
/build
|
||||||
/.idea
|
/.idea
|
||||||
/__pycache__
|
|
||||||
build.sh
|
|
||||||
0
data/99ff1_bombos.gfx → 99ff1_bombos.gfx
Normal file → Executable file
0
data/99ff1_bombos.gfx → 99ff1_bombos.gfx
Normal file → Executable file
0
data/99ff1_quake.gfx → 99ff1_quake.gfx
Normal file → Executable file
0
data/99ff1_quake.gfx → 99ff1_quake.gfx
Normal file → Executable file
@@ -3,84 +3,92 @@
|
|||||||
;================================================================================
|
;================================================================================
|
||||||
lorom
|
lorom
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
; THIS NEEDS TO BE THE FIRST INCLUDE BECAUSE IT CHANGES THINGS EVERYWHERE
|
|
||||||
; If this were to be included later, it would almost certainly overwrite other changes
|
|
||||||
incsrc "fastrom.asm"
|
|
||||||
|
|
||||||
;================================================================================
|
;================================================================================
|
||||||
|
|
||||||
;org $80FFC0 ; <- 7FC0 - Bank00.asm : 9173 (db "THE LEGEND OF ZELDA " ; 21 bytes)
|
;org $00FFC0 ; <- 7FC0 - Bank00.asm : 9173 (db "THE LEGEND OF ZELDA " ; 21 bytes)
|
||||||
;db $23, $4E
|
;db #$23, $4E
|
||||||
|
|
||||||
org $80FFD5 ; <- 7FD5 - Bank00.asm : 9175 (db $20 ; rom layout)
|
org $00FFD5 ; <- 7FD5 - Bank00.asm : 9175 (db $20 ; rom layout)
|
||||||
db $30 ; set fast lorom
|
db #$30 ; set fast lorom
|
||||||
|
|
||||||
;org $80FFD6 ; <- 7FD6 - Bank00.asm : 9176 (db $02 ; cartridge type)
|
;org $00FFD6 ; <- 7FD6 - Bank00.asm : 9176 (db $02 ; cartridge type)
|
||||||
;db $55 ; enable S-RTC
|
;db #$55 ; enable S-RTC
|
||||||
|
|
||||||
org $80FFD7 ; <- 7FD7 - Bank00.asm : 9177 (db $0A ; rom size)
|
org $00FFD7 ; <- 7FD7 - Bank00.asm : 9177 (db $0A ; rom size)
|
||||||
db $0B ; mark rom as 16mbit
|
db #$0B ; mark rom as 16mbit
|
||||||
|
|
||||||
org $80FFD8 ; <- 7FD8 - Bank00.asm : 9178 (db $03 ; ram size (sram size))
|
org $00FFD8 ; <- 7FD8 - Bank00.asm : 9178 (db $03 ; ram size (sram size))
|
||||||
db $05 ; mark sram as 32k
|
db #$05 ; mark sram as 32k
|
||||||
|
|
||||||
org $BFFFFF ; <- 1FFFFF
|
org $3FFFFF ; <- 1FFFFF
|
||||||
db $00 ; expand file to 2mb
|
db #$00 ; expand file to 2mb
|
||||||
|
|
||||||
org $9FFFF8 ; <- FFFF8 timestamp rom
|
org $1FFFF8 ; <- FFFF8 timestamp rom
|
||||||
db $20, $19, $08, $31 ; year/month/day
|
db #$20, #$19, #$08, #$31 ; year/month/day
|
||||||
|
|
||||||
;================================================================================
|
;================================================================================
|
||||||
!ROM_VERSION_LOW ?= 1 ; ROM version (two 16-bit integers)
|
!ROM_VERSION_LOW ?= 1 ; ROM version (two 16-bit integers)
|
||||||
!ROM_VERSION_HIGH ?= 5 ;
|
!ROM_VERSION_HIGH ?= 2 ;
|
||||||
|
|
||||||
org $80FFE0 ; Unused hardware vector
|
org $00FFE0 ; Unused hardware vector
|
||||||
RomVersion:
|
RomVersion:
|
||||||
dw !ROM_VERSION_LOW
|
dw !ROM_VERSION_LOW
|
||||||
dw !ROM_VERSION_HIGH
|
dw !ROM_VERSION_HIGH
|
||||||
|
|
||||||
;================================================================================
|
;================================================================================
|
||||||
|
|
||||||
!ADD = "CLC : ADC"
|
!ADD = "CLC : ADC"
|
||||||
!SUB = "SEC : SBC"
|
!SUB = "SEC : SBC"
|
||||||
!BLT = "BCC"
|
!BLT = "BCC"
|
||||||
!BGE = "BCS"
|
!BGE = "BCS"
|
||||||
|
|
||||||
|
!MS_GOT = "$7F5031"
|
||||||
|
|
||||||
|
!REDRAW = "$7F5000"
|
||||||
|
!GANON_WARP_CHAIN = "$7F5032";
|
||||||
|
|
||||||
|
!TILE_UPLOAD_BUFFER = "$7EA180";
|
||||||
|
|
||||||
|
!FORCE_HEART_SPAWN = "$7F5033";
|
||||||
|
!SKIP_HEART_SAVE = "$7F5034";
|
||||||
|
|
||||||
|
; MSU-1
|
||||||
|
!REG_MSU_FALLBACK_TABLE = $7F50A0 ; 8 bytes
|
||||||
|
!REG_MSU_DELAYED_COMMAND = $7F50A9
|
||||||
|
!REG_MSU_PACK_COUNT = $7F50AA
|
||||||
|
!REG_MSU_PACK_CURRENT = $7F50AB
|
||||||
|
!REG_MSU_PACK_REQUEST = $7F50AC
|
||||||
|
!REG_MSU_LOADED_TRACK = $7F50AD ; 2 bytes
|
||||||
|
!REG_SPC_LOADING = $7F50AF
|
||||||
|
!MSU_LOADED_TRACK = $7F5400
|
||||||
|
!MSU_RESUME_TRACK = $7F5401
|
||||||
|
!MSU_RESUME_TIME = $7F5402 ; 4 bytes
|
||||||
|
!MSU_RESUME_CONTROL = $7F5406
|
||||||
|
!REG_MUSIC_CONTROL = $012B
|
||||||
|
;!REG_MUSIC_CONTROL = $012C
|
||||||
|
!REG_MUSIC_CONTROL_REQUEST = $012C
|
||||||
|
|
||||||
|
!ONEMIND_ID = $7F5072
|
||||||
|
!ONEMIND_TIMER = $7F5073
|
||||||
|
|
||||||
function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<0))
|
function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<0))
|
||||||
|
|
||||||
; Feature flags, run asar with -DFEATURE_X=1 to enable
|
; Feature flags, run asar with -DFEATURE_X=1 to enable
|
||||||
|
!FEATURE_NEW_TEXT ?= 0
|
||||||
|
|
||||||
;================================================================================
|
;================================================================================
|
||||||
|
|
||||||
!MULTIWORLD_ITEM = "$7EF4D2"
|
|
||||||
!MULTIWORLD_ITEM_FROM = "$7EF4D3"
|
|
||||||
!MULTIWORLD_ROOMID = "$7EF4D4"
|
|
||||||
!MULTIWORLD_ROOMDATA = "$7EF4D6"
|
|
||||||
!MULTIWORLD_SCOUT_LOCATION = "$7EF4D7"
|
|
||||||
!MULTIWORLD_SCOUTREPLY_LOCATION = "$7EF4D8"
|
|
||||||
!MULTIWORLD_SCOUTREPLY_ITEM = "$7EF4D9"
|
|
||||||
!MULTIWORLD_SCOUTREPLY_PLAYER = "$7EF4DA"
|
|
||||||
!MULTIWORLD_RECEIVING_ITEM = "$7EC057" ; 0 = default | 1 = receiving
|
|
||||||
!MULTIWORLD_HUD_CHARACTER_DATA = "$7EC058" ; 0x40 bytes
|
|
||||||
!MULTIWORLD_ITEM_PLAYER_ID = "$7EC098" ; 0 = disabled
|
|
||||||
!MULTIWORLD_SPRITEITEM_PLAYER_ID = "$7EC099"
|
|
||||||
!MULTIWORLD_HUD_TIMER = "$7EC09A"
|
|
||||||
!MULTIWORLD_HUD_DELAY = "#120"
|
|
||||||
!MULTIWORLD_ITEM_ID = "$7EC09B" ; for lua scripts?
|
|
||||||
!Dungeon_ChestData = "$01E96C"
|
|
||||||
|
|
||||||
incsrc hooks.asm
|
incsrc hooks.asm
|
||||||
|
incsrc treekid.asm
|
||||||
incsrc spriteswap.asm
|
incsrc spriteswap.asm
|
||||||
incsrc hashalphabethooks.asm
|
incsrc hashalphabethooks.asm
|
||||||
incsrc sharedplayerpalettefix.asm
|
incsrc sharedplayerpalettefix.asm
|
||||||
incsrc ram.asm
|
incsrc ram.asm
|
||||||
incsrc sram.asm
|
incsrc sram.asm
|
||||||
incsrc registers.asm
|
|
||||||
incsrc vanillalabels.asm
|
|
||||||
incsrc menu/overworldmap.asm ; Overwrites some code in bank $8A
|
|
||||||
|
|
||||||
org $A08000 ; bank $20
|
;org $208000 ; bank #$20
|
||||||
|
org $A08000 ; bank #$A0
|
||||||
|
incsrc newitems.asm ; LEAVE THIS AS FIRST
|
||||||
incsrc itemdowngrade.asm
|
incsrc itemdowngrade.asm
|
||||||
incsrc bugfixes.asm
|
incsrc bugfixes.asm
|
||||||
incsrc darkworldspawn.asm
|
incsrc darkworldspawn.asm
|
||||||
@@ -88,6 +96,7 @@ incsrc lampmantlecone.asm
|
|||||||
incsrc floodgatesoftlock.asm
|
incsrc floodgatesoftlock.asm
|
||||||
incsrc heartpieces.asm
|
incsrc heartpieces.asm
|
||||||
incsrc npcitems.asm
|
incsrc npcitems.asm
|
||||||
|
incsrc utilities.asm
|
||||||
incsrc flipperkill.asm
|
incsrc flipperkill.asm
|
||||||
incsrc pendantcrystalhud.asm
|
incsrc pendantcrystalhud.asm
|
||||||
incsrc potions.asm
|
incsrc potions.asm
|
||||||
@@ -98,15 +107,23 @@ incsrc tablets.asm
|
|||||||
incsrc fairyfixes.asm
|
incsrc fairyfixes.asm
|
||||||
incsrc rngfixes.asm
|
incsrc rngfixes.asm
|
||||||
incsrc medallions.asm
|
incsrc medallions.asm
|
||||||
|
incsrc inventory.asm
|
||||||
|
incsrc ganonfixes.asm
|
||||||
incsrc zelda.asm
|
incsrc zelda.asm
|
||||||
incsrc maidencrystals.asm
|
incsrc maidencrystals.asm
|
||||||
|
incsrc zoraking.asm
|
||||||
|
incsrc catfish.asm
|
||||||
incsrc flute.asm
|
incsrc flute.asm
|
||||||
incsrc dungeondrops.asm
|
incsrc dungeondrops.asm
|
||||||
incsrc halfmagicbat.asm
|
incsrc halfmagicbat.asm
|
||||||
|
incsrc mantle.asm
|
||||||
incsrc swordswap.asm
|
incsrc swordswap.asm
|
||||||
incsrc stats.asm
|
incsrc stats.asm
|
||||||
|
incsrc scratchpad.asm
|
||||||
|
incsrc map.asm
|
||||||
incsrc dialog.asm
|
incsrc dialog.asm
|
||||||
incsrc entrances.asm
|
incsrc entrances.asm
|
||||||
|
incsrc clock.asm
|
||||||
incsrc accessibility.asm
|
incsrc accessibility.asm
|
||||||
incsrc heartbeep.asm
|
incsrc heartbeep.asm
|
||||||
incsrc capacityupgrades.asm
|
incsrc capacityupgrades.asm
|
||||||
@@ -115,11 +132,12 @@ incsrc doorframefixes.asm
|
|||||||
incsrc music.asm
|
incsrc music.asm
|
||||||
incsrc roomloading.asm
|
incsrc roomloading.asm
|
||||||
incsrc icepalacegraphics.asm
|
incsrc icepalacegraphics.asm
|
||||||
|
incsrc firebarlayer.asm
|
||||||
warnpc $A18000
|
warnpc $A18000
|
||||||
|
|
||||||
org $9C8000 ; text tables for translation
|
org $1C8000 ; text tables for translation
|
||||||
incbin "data/i18n_en.bin"
|
incbin i18n_en.bin
|
||||||
warnpc $9CF356
|
warnpc $1CF356
|
||||||
|
|
||||||
org $A18000 ; static mapping area
|
org $A18000 ; static mapping area
|
||||||
incsrc framehook.asm
|
incsrc framehook.asm
|
||||||
@@ -130,7 +148,7 @@ incsrc hud.asm
|
|||||||
warnpc $A18800
|
warnpc $A18800
|
||||||
|
|
||||||
org $A18800 ; static mapping area
|
org $A18800 ; static mapping area
|
||||||
|
incsrc zsnes.asm
|
||||||
warnpc $A19000
|
warnpc $A19000
|
||||||
|
|
||||||
org $A1A000 ; static mapping area. Referenced by front end. Do not move.
|
org $A1A000 ; static mapping area. Referenced by front end. Do not move.
|
||||||
@@ -150,7 +168,9 @@ incsrc glitched.asm
|
|||||||
incsrc hardmode.asm
|
incsrc hardmode.asm
|
||||||
incsrc goalitem.asm
|
incsrc goalitem.asm
|
||||||
incsrc quickswap.asm
|
incsrc quickswap.asm
|
||||||
|
incsrc endingsequence.asm
|
||||||
incsrc cuccostorm.asm
|
incsrc cuccostorm.asm
|
||||||
|
incsrc compression.asm
|
||||||
incsrc retro.asm
|
incsrc retro.asm
|
||||||
incsrc controllerjank.asm
|
incsrc controllerjank.asm
|
||||||
incsrc boots.asm
|
incsrc boots.asm
|
||||||
@@ -162,156 +182,142 @@ incsrc hashalphabet.asm
|
|||||||
incsrc inverted.asm
|
incsrc inverted.asm
|
||||||
incsrc invertedmaps.asm
|
incsrc invertedmaps.asm
|
||||||
incsrc newhud.asm
|
incsrc newhud.asm
|
||||||
|
incsrc compasses.asm
|
||||||
incsrc save.asm
|
incsrc save.asm
|
||||||
incsrc password.asm
|
incsrc password.asm
|
||||||
incsrc enemy_adjustments.asm
|
incsrc enemy_adjustments.asm
|
||||||
;incsrc hudtext.asm
|
incsrc hudtext.asm
|
||||||
incsrc servicerequest.asm
|
incsrc servicerequest.asm
|
||||||
incsrc elder.asm
|
incsrc elder.asm
|
||||||
incsrc toast.asm
|
incsrc toast.asm
|
||||||
|
incsrc darkroomitems.asm
|
||||||
incsrc fastcredits.asm
|
incsrc fastcredits.asm
|
||||||
incsrc msu.asm
|
incsrc msu.asm
|
||||||
incsrc dungeonmap.asm
|
incsrc dungeonmap.asm
|
||||||
incsrc hextodec.asm
|
incsrc special_weapons.asm
|
||||||
incsrc multiworld.asm
|
incsrc variable_ganon_vulnerability.asm
|
||||||
incsrc textrenderer.asm
|
if !FEATURE_NEW_TEXT
|
||||||
|
incsrc textrenderer.asm
|
||||||
|
endif
|
||||||
warnpc $A58000
|
warnpc $A58000
|
||||||
|
|
||||||
org $A28000
|
;org $228000 ; contrib area
|
||||||
ItemReceiptGraphicsROM:
|
org $A28000 ; contrib area
|
||||||
; we need some empty space here so that 0000 can mean nothing
|
incsrc contrib.asm
|
||||||
fillbyte $00 : fill 32
|
|
||||||
incbin "data/customitems.4bpp"
|
|
||||||
warnpc $A2B000
|
|
||||||
org $A2B000
|
|
||||||
incsrc itemdatatables.asm ; Statically mapped
|
|
||||||
incsrc decompresseditemgraphics.asm
|
|
||||||
incsrc newitems.asm
|
|
||||||
incsrc utilities.asm
|
|
||||||
incsrc inventory.asm
|
|
||||||
incsrc menu/hudalpha.asm
|
|
||||||
warnpc $A38000
|
|
||||||
|
|
||||||
org $A38000
|
org $A38000
|
||||||
incsrc stats/credits.asm ; Statically mapped
|
|
||||||
incsrc stats/main.asm
|
incsrc stats/main.asm
|
||||||
incsrc stats/statConfig.asm
|
|
||||||
FontTable:
|
|
||||||
incsrc stats/fonttable.asm
|
|
||||||
|
|
||||||
incsrc doorrando/doorrando.asm ; bank 27/A7
|
org $308000 ; bank #$30
|
||||||
;bank 28/A8 for keydropshuffle / standing items
|
|
||||||
incsrc keydrop/standing_items.asm ; bank 28/A8
|
|
||||||
incsrc enemizer/main.asm ; bank 36/B6
|
|
||||||
|
|
||||||
org $B08000 ; bank #$30
|
|
||||||
incsrc tables.asm
|
incsrc tables.asm
|
||||||
warnpc $B18000
|
|
||||||
|
|
||||||
org $B48000
|
org $348000
|
||||||
incsrc spc.asm
|
incsrc spc.asm
|
||||||
|
|
||||||
org $B18000 ; bank $31
|
; uncomment for inverted adjustments
|
||||||
|
;incsrc sandbox.asm
|
||||||
|
|
||||||
|
org $318000 ; bank #$31
|
||||||
GFX_Mire_Bombos:
|
GFX_Mire_Bombos:
|
||||||
incbin "data/99ff1_bombos.gfx"
|
incbin 99ff1_bombos.gfx
|
||||||
warnpc $B18800
|
warnpc $318800
|
||||||
|
|
||||||
org $B18800
|
org $318800
|
||||||
GFX_Mire_Quake:
|
GFX_Mire_Quake:
|
||||||
incbin "data/99ff1_quake.gfx"
|
incbin 99ff1_quake.gfx
|
||||||
warnpc $B19000
|
warnpc $319000
|
||||||
|
|
||||||
org $B19000
|
org $319000
|
||||||
GFX_TRock_Bombos:
|
GFX_TRock_Bombos:
|
||||||
incbin "data/a6fc4_bombos.gfx"
|
incbin a6fc4_bombos.gfx
|
||||||
warnpc $B19800
|
warnpc $319800
|
||||||
|
|
||||||
org $B19800
|
org $319800
|
||||||
GFX_TRock_Ether:
|
GFX_TRock_Ether:
|
||||||
incbin "data/a6fc4_ether.gfx"
|
incbin a6fc4_ether.gfx
|
||||||
warnpc $B1A000
|
warnpc $31A000
|
||||||
|
|
||||||
org $B1A000
|
org $31A000
|
||||||
GFX_HUD_Items:
|
GFX_HUD_Items:
|
||||||
incbin "menu/drsheetdc.2bppc"
|
incbin c2807_v4.gfx
|
||||||
warnpc $B1A800
|
warnpc $31A800
|
||||||
|
|
||||||
org $B1A800
|
org $31A800
|
||||||
|
GFX_New_Items:
|
||||||
|
incbin newitems.gfx
|
||||||
|
;incbin eventitems.gfx ; *EVENT*
|
||||||
|
warnpc $31B000
|
||||||
|
|
||||||
warnpc $B1B000
|
org $31B000
|
||||||
|
|
||||||
org $B1B000
|
|
||||||
GFX_HUD_Main:
|
GFX_HUD_Main:
|
||||||
incbin "data/c2e3e.gfx"
|
incbin c2e3e.gfx
|
||||||
warnpc $B1B800
|
warnpc $31B800
|
||||||
|
|
||||||
org $B1C000
|
org $31C000
|
||||||
IcePalaceFloorGfx:
|
IcePalaceFloorGfx:
|
||||||
incbin "data/ice_palace_floor.bin"
|
incbin ice_palace_floor.bin
|
||||||
warnpc $B1C801
|
warnpc $31C801
|
||||||
|
|
||||||
org $B1C800
|
org $31C800
|
||||||
Damage_Table:
|
Damage_Table_Bombos:
|
||||||
incbin "data/damage_table.bin"
|
incbin damage_table_bombos.bin
|
||||||
warnpc $B1D001
|
warnpc $31D001
|
||||||
|
|
||||||
org $B1D000
|
org $31D000
|
||||||
FileSelectNewGraphics:
|
FileSelectNewGraphics:
|
||||||
incbin "data/fileselectgfx.2bpp"
|
incbin fileselect.chr.gfx
|
||||||
warnpc $B1E001
|
warnpc $31E001
|
||||||
|
|
||||||
org $B1E000
|
org $31E000
|
||||||
InvertedCastleHole: ;address used by front end. DO NOT MOVE!
|
InvertedCastleHole: ;address used by front end. DO NOT MOVE!
|
||||||
incbin "data/sheet73.gfx"
|
incbin sheet73.gfx
|
||||||
warnpc $B1E501
|
warnpc $31E501
|
||||||
|
|
||||||
org $B38000
|
org $31E800
|
||||||
|
Damage_Table_Bombs:
|
||||||
|
incbin damage_table_sword_bombs.bin
|
||||||
|
warnpc $31F000
|
||||||
|
|
||||||
|
org $31F000
|
||||||
|
Damage_Table_Pseudo:
|
||||||
|
incbin damage_table_pseudo_sword.bin
|
||||||
|
warnpc $31F800
|
||||||
|
|
||||||
|
org $338000
|
||||||
GFX_HUD_Palette:
|
GFX_HUD_Palette:
|
||||||
incbin "data/hudpalette.pal"
|
incbin hudpalette.pal
|
||||||
warnpc $B38041
|
warnpc $338041
|
||||||
|
|
||||||
org $B39000
|
org $339000
|
||||||
ExpandedTrinexx:
|
incbin sheet178.gfx
|
||||||
incbin "data/sheet178.gfx"
|
warnpc $339600
|
||||||
warnpc $B39600
|
|
||||||
|
|
||||||
org $B39600
|
org $339600
|
||||||
BossMapIconGFX:
|
BossMapIconGFX:
|
||||||
incbin "data/bossicons.4bpp"
|
incbin bossicons.4bpp
|
||||||
|
|
||||||
org $B39C00
|
if !FEATURE_NEW_TEXT
|
||||||
NewFont:
|
org $339C00
|
||||||
incbin "data/newfont.bin"
|
NewFont:
|
||||||
NewFontInverted:
|
incbin newfont.bin
|
||||||
incbin "data/newfont_inverted.bin"
|
NewFontInverted:
|
||||||
SmallCharacters:
|
incbin newfont_inverted.bin
|
||||||
incbin "data/smallchars.2bpp"
|
|
||||||
org $8CD7DF
|
|
||||||
incsrc data/playernamecharmap.asm
|
|
||||||
org $8CE73D
|
|
||||||
incbin data/playernamestripes_1.bin
|
|
||||||
org $8CE911
|
|
||||||
incbin data/playernamestripes_2.bin
|
|
||||||
incsrc data/kanjireplacements.asm ; Overwrites text gfx data and masks in bank $8E
|
|
||||||
|
|
||||||
org $B28000
|
org $0CD7DF
|
||||||
|
incbin text_unscramble1.bin
|
||||||
|
org $0CE4D5
|
||||||
|
incbin text_unscramble2.bin
|
||||||
|
endif
|
||||||
|
|
||||||
|
org $328000
|
||||||
Extra_Text_Table:
|
Extra_Text_Table:
|
||||||
incsrc itemtext.asm
|
incsrc itemtext.asm
|
||||||
warnpc $B2E000
|
|
||||||
|
|
||||||
org $B2DFD0 ; PC 0x195FD0
|
|
||||||
incsrc multiworldplayernames.asm
|
|
||||||
warnpc $B30000
|
|
||||||
|
|
||||||
incsrc externalhooks.asm
|
incsrc externalhooks.asm
|
||||||
;================================================================================
|
;================================================================================
|
||||||
org $919100 ; PC 0x89100
|
org $119100 ; PC 0x89100
|
||||||
incbin "data/map_icons.gfx"
|
incbin map_icons.gfx
|
||||||
warnpc $919401
|
warnpc $119401
|
||||||
;================================================================================
|
|
||||||
org $9BB1E0
|
|
||||||
incsrc custompalettes.asm
|
|
||||||
warnpc $9BB880
|
|
||||||
;================================================================================
|
;================================================================================
|
||||||
org $AF8000 ; PC 0x178000
|
org $AF8000 ; PC 0x178000
|
||||||
Static_RNG: ; each line below is 512 bytes of rng
|
Static_RNG: ; each line below is 512 bytes of rng
|
||||||
@@ -326,15 +332,10 @@ warnpc $B08000
|
|||||||
;Bank Map
|
;Bank Map
|
||||||
;$20 Code Bank
|
;$20 Code Bank
|
||||||
;$21 Reserved (Frame Hook & Init)
|
;$21 Reserved (Frame Hook & Init)
|
||||||
;$22 Unused
|
;$22 Contrib Code
|
||||||
;$23 Stats & Credits
|
;$23 Stats & Credits
|
||||||
;$24 Code Bank
|
;$24 Code Bank
|
||||||
;$26 Multiworld data
|
|
||||||
;$27 DR Code Bank
|
|
||||||
;$28 Keydrop / Standing Items Code bank
|
|
||||||
;$29 External hooks (rest of bank not used)
|
;$29 External hooks (rest of bank not used)
|
||||||
;$2A Reserved for OWR
|
|
||||||
;$2B Reserved for "outlet data" ~5.8k
|
|
||||||
;$2E Reserved for Tournament Use
|
;$2E Reserved for Tournament Use
|
||||||
;$2F Static RNG (rest is reserved for tournament use)
|
;$2F Static RNG (rest is reserved for tournament use)
|
||||||
;$30 Main Configuration Table
|
;$30 Main Configuration Table
|
||||||
@@ -342,24 +343,23 @@ warnpc $B08000
|
|||||||
;$32 Text Bank
|
;$32 Text Bank
|
||||||
;$33 Graphics Bank
|
;$33 Graphics Bank
|
||||||
;$36 reserved for Enemizer
|
;$36 reserved for Enemizer
|
||||||
;$37 Room data if needed for DR/Pottery/Enemizer
|
|
||||||
;$3A reserved for downstream use
|
;$3A reserved for downstream use
|
||||||
;$3B reserved for downstream use
|
;$3B reserved for downstream use
|
||||||
;$3F reserved for internal debugging
|
;$3F reserved for internal debugging
|
||||||
;================================================================================
|
;================================================================================
|
||||||
;RAM
|
;RAM
|
||||||
;See ram.asm for label assignments
|
;$7E021B[0x1]: Used by race game instead of $0ABF to avoid witch item conflict
|
||||||
;$7EC900[0x1F00]: BigRAM buffer
|
;$7EC900[0x1F00]: BIGRAM buffer
|
||||||
;$7EF000[0x500]: SRAM mirror First 0x500 bytes of SRAM
|
;$7EF000[0x500]: SRAM mirror First 0x500 bytes of SRAM
|
||||||
; See sram.asm for labels and assignments
|
; See sram.asm for labels and assignments
|
||||||
;$7F5000[0x800]: Rando's main free ram region
|
;$7F5000[0x800]: Rando's main free ram region
|
||||||
; See ram.asm for specific assignments
|
; See tables.asm for specific assignments
|
||||||
;$7F6000[0x1000]: SRAM buffer mapped to vanilla save slots 1 and 2
|
;$7F6000[0x1000]: SRAM buffer mapped to vanilla save slots 1 and 2
|
||||||
; See sram.asm for labels and assignments
|
; See sram.asm for labels and assignments
|
||||||
;$7F7667[0x6719] - free ram
|
;$7F7667[0x6719] - free ram
|
||||||
;================================================================================
|
;================================================================================
|
||||||
;SRAM Map
|
;SRAM Map
|
||||||
;See sram.asm for label assignments and documentation
|
;See sram.asm for rando-specific assignments
|
||||||
;$70:0000 (5K) Game state
|
;$70:0000 (5K) Game state
|
||||||
; 0000-04FF Vanilla Slot 1 (mirrored at $7EF000)
|
; 0000-04FF Vanilla Slot 1 (mirrored at $7EF000)
|
||||||
; 0500-14FF Ext Slot 1 (mirrored at $7F6000)
|
; 0500-14FF Ext Slot 1 (mirrored at $7F6000)
|
||||||
@@ -367,19 +367,371 @@ warnpc $B08000
|
|||||||
;$70:3000 (0x16) Password
|
;$70:3000 (0x16) Password
|
||||||
;$70:6000 (8K) Scratch buffers
|
;$70:6000 (8K) Scratch buffers
|
||||||
;================================================================================
|
;================================================================================
|
||||||
|
;org $0080DC ; <- 0xDC - Bank00.asm:179 - Kill Music
|
||||||
|
;db #$A9, #$00, #$EA
|
||||||
|
;LDA.b #$00 : NOP
|
||||||
|
;================================================================================
|
||||||
|
;org $0AC53E ; <- 5453E - Bank0A.asm:1103 - (LDA $0AC51F, X) - i have no idea what this is for anymore
|
||||||
|
;LDA.b #$7F
|
||||||
|
;NOP #2
|
||||||
|
;================================================================================
|
||||||
|
;org $05DF8B ; <- 2DF8B - Bank05.asm : 2483
|
||||||
|
;AND.w #$0100 ; allow Sprite_DrawMultiple to access lower half of sprite tiles
|
||||||
|
;================================================================================
|
||||||
|
;org $0DF8F1 ; this is required for the X-indicator in the HUD except not anymore obviously
|
||||||
|
;
|
||||||
|
;;red pendant
|
||||||
|
;db $2B, $31, $2C, $31, $3D, $31, $2E, $31
|
||||||
|
;db $2B, $25, $2C, $25, $2D, $25, $2E, $25
|
||||||
|
;
|
||||||
|
;;blue pendant
|
||||||
|
;db $2B, $31, $2C, $31, $3D, $31, $2E, $31
|
||||||
|
;db $2B, $2D, $2C, $2D, $2D, $2D, $2E, $2D
|
||||||
|
;
|
||||||
|
;;green pendant
|
||||||
|
;db $2B, $31, $2C, $31, $3D, $31, $2E, $31
|
||||||
|
;db $2B, $3D, $2C, $3D, $2D, $3D, $2E, $3D
|
||||||
|
;================================================================================
|
||||||
|
;org $00CFF2 ; 0x4FF2 - Mire H
|
||||||
|
;db GFX_Mire_Bombos>>16
|
||||||
|
;org $00D0D1 ; 0x50D1 - Mire M
|
||||||
|
;db GFX_Mire_Bombos>>8
|
||||||
|
;org $00D1B0 ; 0x51B0 - Mire L
|
||||||
|
;db GFX_Mire_Bombos
|
||||||
|
|
||||||
org $80D09C ; 0x509C - HUD Items H
|
;org $00D020 ; 0x5020 - Trock H
|
||||||
|
;db GFX_TRock_Bombos>>16
|
||||||
|
;org $00D0FF ; 0x50FF - Trock M
|
||||||
|
;db GFX_TRock_Bombos>>8
|
||||||
|
;org $00D1DE ; 0x51DE - Trock L
|
||||||
|
;db GFX_TRock_Bombos
|
||||||
|
|
||||||
|
org $00D09C ; 0x509C - HUD Items H
|
||||||
db GFX_HUD_Items>>16
|
db GFX_HUD_Items>>16
|
||||||
org $80D17B ; 0x517B - HUD Items M
|
org $00D17B ; 0x517B - HUD Items M
|
||||||
db GFX_HUD_Items>>8
|
db GFX_HUD_Items>>8
|
||||||
org $80D25A ; 0x525A - HUD Items L
|
org $00D25A ; 0x525A - HUD Items L
|
||||||
db GFX_HUD_Items
|
db GFX_HUD_Items
|
||||||
|
|
||||||
org $80D09D ; 0x509D - HUD Main H
|
; this used to be a pointer to a dummy file
|
||||||
db GFX_HUD_Main>>16
|
org $00D065 ; 005065 - New Items H
|
||||||
org $80D17C ; 0x517C - HUD Main M
|
db GFX_New_Items>>16
|
||||||
db GFX_HUD_Main>>8
|
org $00D144 ; 005114 - New Items M
|
||||||
org $80D25B ; 0x525B - HUD Main L
|
db GFX_New_Items>>8
|
||||||
db GFX_HUD_Main
|
org $00D223 ; 005223 - New Items L
|
||||||
|
db GFX_New_Items
|
||||||
|
|
||||||
|
org $00D09D ; 0x509D - HUD Main H
|
||||||
|
db GFX_HUD_Main>>16
|
||||||
|
org $00D17C ; 0x517C - HUD Main M
|
||||||
|
db GFX_HUD_Main>>8
|
||||||
|
org $00D25B ; 0x525B - HUD Main L
|
||||||
|
db GFX_HUD_Main
|
||||||
;================================================================================
|
;================================================================================
|
||||||
|
org $008781
|
||||||
|
UseImplicitRegIndexedLocalJumpTable:
|
||||||
|
|
||||||
|
org $00879c
|
||||||
|
UseImplicitRegIndexedLongJumpTable:
|
||||||
|
|
||||||
|
org $008333
|
||||||
|
Vram_EraseTilemaps_triforce:
|
||||||
|
|
||||||
|
org $008913
|
||||||
|
Sound_LoadLightWorldSongBank:
|
||||||
|
org $00891D
|
||||||
|
.do_load
|
||||||
|
|
||||||
|
org $00893D
|
||||||
|
EnableForceBlank:
|
||||||
|
|
||||||
|
DungeonMask = $0098C0
|
||||||
|
|
||||||
|
org $00D308
|
||||||
|
DecompSwordGfx:
|
||||||
|
|
||||||
|
org $00D348
|
||||||
|
DecompShieldGfx:
|
||||||
|
|
||||||
|
org $00D463
|
||||||
|
Tagalong_LoadGfx:
|
||||||
|
|
||||||
|
org $00D51B
|
||||||
|
GetAnimatedSpriteTile:
|
||||||
|
|
||||||
|
org $00D52D
|
||||||
|
GetAnimatedSpriteTile_variable:
|
||||||
|
|
||||||
|
org $00D84E
|
||||||
|
Attract_DecompressStoryGfx:
|
||||||
|
|
||||||
|
org $00E529
|
||||||
|
LoadSelectScreenGfx:
|
||||||
|
|
||||||
|
org $00F945
|
||||||
|
PrepDungeonExit:
|
||||||
|
|
||||||
|
org $00FDEE
|
||||||
|
Mirror_InitHdmaSettings:
|
||||||
|
|
||||||
|
org $01873A
|
||||||
|
Dungeon_LoadRoom:
|
||||||
|
|
||||||
|
org $02821E
|
||||||
|
Module_PreDungeon:
|
||||||
|
org $028296
|
||||||
|
.setAmbientSfx
|
||||||
|
|
||||||
|
org $02A0A8
|
||||||
|
Dungeon_SaveRoomData:
|
||||||
|
|
||||||
|
org $02A0BE
|
||||||
|
Dungeon_SaveRoomData_justKeys:
|
||||||
|
|
||||||
|
org $02B861
|
||||||
|
Dungeon_SaveRoomQuadrantData:
|
||||||
|
|
||||||
|
org $02FD8A ; 17D8A - Bank0E.asm: 3732 Note: Different bank
|
||||||
|
LoadGearPalettes_bunny:
|
||||||
|
|
||||||
|
org $02FD95 ; 17D95 - Bank0E.asm: 3742 Note: Different bank
|
||||||
|
LoadGearPalettes_variable:
|
||||||
|
|
||||||
|
org $02FEAB
|
||||||
|
Filter_Majorly_Whiten_Color:
|
||||||
|
|
||||||
|
org $05A51D
|
||||||
|
Sprite_SpawnFallingItem:
|
||||||
|
|
||||||
|
org $05DF6C ; 02DF6C - Bank05.asm : 2445
|
||||||
|
Sprite_DrawMultiple:
|
||||||
|
|
||||||
|
org $05DF70 ; 02DF70 - Bank05.asm : 2454
|
||||||
|
Sprite_DrawMultiple_quantity_preset:
|
||||||
|
|
||||||
|
org $05DF75 ; 02DF75 - Bank05.asm : 2461
|
||||||
|
Sprite_DrawMultiple_player_deferred:
|
||||||
|
|
||||||
|
org $05E1A7 ; 02E1A7 - Bank05.asm : 2592
|
||||||
|
Sprite_ShowSolicitedMessageIfPlayerFacing:
|
||||||
|
|
||||||
|
org $05E1F0
|
||||||
|
Sprite_ShowMessageFromPlayerContact:
|
||||||
|
|
||||||
|
org $05E219
|
||||||
|
Sprite_ShowMessageUnconditional:
|
||||||
|
|
||||||
|
org $05EC96
|
||||||
|
Sprite_ZeldaLong:
|
||||||
|
|
||||||
|
org $0680FA
|
||||||
|
Player_ApplyRumbleToSprites:
|
||||||
|
|
||||||
|
org $0683E6
|
||||||
|
Utility_CheckIfHitBoxesOverlapLong:
|
||||||
|
|
||||||
|
org $06A7DB
|
||||||
|
Chicken_SpawnAvengerChicken: ; returns short
|
||||||
|
|
||||||
|
org $06DC5C
|
||||||
|
Sprite_DrawShadowLong:
|
||||||
|
|
||||||
|
org $06DD40
|
||||||
|
DashKey_Draw:
|
||||||
|
|
||||||
|
org $06DBF8
|
||||||
|
Sprite_PrepAndDrawSingleLargeLong:
|
||||||
|
|
||||||
|
org $06DC00
|
||||||
|
Sprite_PrepAndDrawSingleSmallLong:
|
||||||
|
|
||||||
|
org $06EA18
|
||||||
|
Sprite_ApplySpeedTowardsPlayerLong:
|
||||||
|
|
||||||
|
org $06EAA6
|
||||||
|
Sprite_DirectionToFacePlayerLong:
|
||||||
|
|
||||||
|
org $06F12F
|
||||||
|
Sprite_CheckDamageToPlayerSameLayerLong:
|
||||||
|
|
||||||
|
org $06F86A
|
||||||
|
OAM_AllocateDeferToPlayerLong:
|
||||||
|
|
||||||
|
org $0791B3
|
||||||
|
Player_HaltDashAttackLong:
|
||||||
|
|
||||||
|
org $07999D
|
||||||
|
Link_ReceiveItem:
|
||||||
|
|
||||||
|
org $07E68F
|
||||||
|
Unknown_Method_0: ; In US version disassembly simply called "$3E6A6 IN ROM"
|
||||||
|
|
||||||
|
org $07F4AA
|
||||||
|
Sprite_CheckIfPlayerPreoccupied:
|
||||||
|
|
||||||
|
org $08C3AE
|
||||||
|
Ancilla_ReceiveItem:
|
||||||
|
|
||||||
|
org $08CE93
|
||||||
|
Ancilla_BreakTowerSeal_draw_single_crystal:
|
||||||
|
|
||||||
|
org $08CEC3
|
||||||
|
Ancilla_BreakTowerSeal_stop_spawning_sparkles:
|
||||||
|
|
||||||
|
org $08CF59
|
||||||
|
BreakTowerSeal_ExecuteSparkles:
|
||||||
|
|
||||||
|
org $08F710
|
||||||
|
Ancilla_SetOam_XY_Long:
|
||||||
|
|
||||||
|
org $0985E2 ; (break on $0985E4)
|
||||||
|
AddReceivedItem:
|
||||||
|
|
||||||
|
org $098BAD
|
||||||
|
AddPendantOrCrystal:
|
||||||
|
|
||||||
|
org $098CFD
|
||||||
|
AddWeathervaneExplosion:
|
||||||
|
|
||||||
|
org $0993DF
|
||||||
|
AddDashTremor:
|
||||||
|
|
||||||
|
org $099D04
|
||||||
|
AddAncillaLong:
|
||||||
|
|
||||||
|
org $099D1A
|
||||||
|
Ancilla_CheckIfAlreadyExistsLong:
|
||||||
|
|
||||||
|
org $09AE64
|
||||||
|
Sprite_SetSpawnedCoords:
|
||||||
|
|
||||||
|
org $09AD58
|
||||||
|
GiveRupeeGift:
|
||||||
|
|
||||||
|
org $0ABA4F
|
||||||
|
OverworldMap_InitGfx:
|
||||||
|
|
||||||
|
org $0ABA99
|
||||||
|
OverworldMap_DarkWorldTilemap:
|
||||||
|
|
||||||
|
org $0ABAB9
|
||||||
|
OverworldMap_LoadSprGfx:
|
||||||
|
|
||||||
|
org $0CD7D1
|
||||||
|
NameFile_MakeScreenVisible:
|
||||||
|
org $0CDB3E
|
||||||
|
InitializeSaveFile:
|
||||||
|
org $0CDBC0
|
||||||
|
InitializeSaveFile_build_checksum:
|
||||||
|
|
||||||
|
org $0DBA71
|
||||||
|
GetRandomInt:
|
||||||
|
|
||||||
|
org $0DBA80
|
||||||
|
OAM_AllocateFromRegionA:
|
||||||
|
org $0DBA84
|
||||||
|
OAM_AllocateFromRegionB:
|
||||||
|
org $0DBA88
|
||||||
|
OAM_AllocateFromRegionC:
|
||||||
|
org $0DBA8C
|
||||||
|
OAM_AllocateFromRegionD:
|
||||||
|
org $0DBA90
|
||||||
|
OAM_AllocateFromRegionE:
|
||||||
|
org $0DBA94
|
||||||
|
OAM_AllocateFromRegionF:
|
||||||
|
|
||||||
|
org $0DBB67
|
||||||
|
Sound_SetSfxPanWithPlayerCoords:
|
||||||
|
|
||||||
|
org $0DBB6E
|
||||||
|
Sound_SetSfx1PanLong:
|
||||||
|
|
||||||
|
org $0DBB7C
|
||||||
|
Sound_SetSfx2PanLong:
|
||||||
|
|
||||||
|
org $0DBB8A
|
||||||
|
Sound_SetSfx3PanLong:
|
||||||
|
|
||||||
|
org $0DDB7F
|
||||||
|
HUD_RefreshIconLong:
|
||||||
|
|
||||||
|
org $0DDD32
|
||||||
|
Equipment_UpdateEquippedItemLong:
|
||||||
|
|
||||||
|
org $0DE01E ; 6E10E - equipment.asm : 787
|
||||||
|
BottleMenu_movingOn:
|
||||||
|
|
||||||
|
org $0DE346
|
||||||
|
RestoreNormalMenu:
|
||||||
|
|
||||||
|
org $0DE395
|
||||||
|
Equipment_SearchForEquippedItemLong:
|
||||||
|
|
||||||
|
org $0DE9C8
|
||||||
|
DrawProgressIcons: ; this returns short
|
||||||
|
|
||||||
|
org $0DED29
|
||||||
|
DrawEquipment: ; this returns short
|
||||||
|
|
||||||
|
org $0DFA78
|
||||||
|
HUD_RebuildLong:
|
||||||
|
|
||||||
|
org $0DFA88
|
||||||
|
HUD_RebuildIndoor_Palace:
|
||||||
|
|
||||||
|
org $0DFA88
|
||||||
|
HUD_RebuildLong2:
|
||||||
|
|
||||||
|
org $0EEE10
|
||||||
|
Messaging_Text:
|
||||||
|
|
||||||
|
org $0FFD94
|
||||||
|
Overworld_TileAttr:
|
||||||
|
|
||||||
|
org $1BC97C
|
||||||
|
Overworld_DrawPersistentMap16:
|
||||||
|
|
||||||
|
org $1BED03
|
||||||
|
Palette_Sword:
|
||||||
|
|
||||||
|
org $1BED29
|
||||||
|
Palette_Shield:
|
||||||
|
|
||||||
|
org $1BEDF9
|
||||||
|
Palette_ArmorAndGloves:
|
||||||
|
|
||||||
|
org $1BEE52
|
||||||
|
Palette_Hud:
|
||||||
|
|
||||||
|
org $1BEF96
|
||||||
|
Palette_SelectScreen:
|
||||||
|
|
||||||
|
org $1CFAAA
|
||||||
|
ShopKeeper_RapidTerminateReceiveItem:
|
||||||
|
|
||||||
|
org $1CF500
|
||||||
|
Sprite_NullifyHookshotDrag:
|
||||||
|
|
||||||
|
org $1CF537
|
||||||
|
Ancilla_CheckForAvailableSlot:
|
||||||
|
|
||||||
|
org $1DE9B6
|
||||||
|
Filter_MajorWhitenMain:
|
||||||
|
|
||||||
|
org $1DF65D
|
||||||
|
Sprite_SpawnDynamically:
|
||||||
|
|
||||||
|
org $1DF65F
|
||||||
|
Sprite_SpawnDynamically_arbitrary:
|
||||||
|
|
||||||
|
org $1DFD4B
|
||||||
|
DiggingGameGuy_AttemptPrizeSpawn:
|
||||||
|
|
||||||
|
org $1EDE28
|
||||||
|
Sprite_GetEmptyBottleIndex: ; this is totally in sprite_bees.asm
|
||||||
|
|
||||||
|
org $1EF4E7
|
||||||
|
Sprite_PlayerCantPassThrough:
|
||||||
|
;================================================================================
|
||||||
|
|
||||||
|
incsrc bombos_only.asm
|
||||||
|
|||||||
15
README.md
15
README.md
@@ -1,15 +0,0 @@
|
|||||||
# z3randomizer
|
|
||||||
Zelda 3 Randomizer Template ASM
|
|
||||||
|
|
||||||
How to create the bps patch:
|
|
||||||
|
|
||||||
* Assemble the ROM with asar (recommend to use a copy of original rom)
|
|
||||||
|
|
||||||
`asar LTTP_RND_GeneralBugfixes.asm copy_original_rom.sfc`
|
|
||||||
(copy_orignal_rom.sfc is now assembled_rom.sfc)
|
|
||||||
|
|
||||||
* Use flips to create a bps file
|
|
||||||
|
|
||||||
`flips original_rom.sfc assembled_rom.sfc base2current.bps`
|
|
||||||
|
|
||||||
* Update RANDOMIZERBASEHASH in DR with the md5 sum of assembled_rom.sfc. And put base2current.bps in the data directory.
|
|
||||||
0
data/a6fc4_bombos.gfx → a6fc4_bombos.gfx
Normal file → Executable file
0
data/a6fc4_bombos.gfx → a6fc4_bombos.gfx
Normal file → Executable file
0
data/a6fc4_ether.gfx → a6fc4_ether.gfx
Normal file → Executable file
0
data/a6fc4_ether.gfx → a6fc4_ether.gfx
Normal file → Executable file
@@ -1,118 +1,127 @@
|
|||||||
;================================================================================
|
;================================================================================
|
||||||
; Accessibility Fixes
|
; Accessibility Fixes
|
||||||
;================================================================================
|
;================================================================================
|
||||||
|
FlipGreenPendant:
|
||||||
|
LDA $0C : CMP #$38 : BNE + ; check if we have green pendant
|
||||||
|
ORA #$40 : STA $0C ; flip it
|
||||||
|
+
|
||||||
|
|
||||||
|
LDA $0D : STA $0802, X ; stuff we wrote over "Set CHR, palette, and priority of the sprite"
|
||||||
|
LDA $0C : STA $0803, X
|
||||||
|
RTL
|
||||||
|
;================================================================================
|
||||||
ConditionalLightning:
|
ConditionalLightning:
|
||||||
CMP.b #$05 : BEQ ++
|
CMP.b #$05 : BEQ ++
|
||||||
CMP.b #$2C : BEQ ++
|
CMP.b #$2C : BEQ ++
|
||||||
CMP.b #$5A : BEQ ++
|
CMP.b #$5A : BEQ ++
|
||||||
LDA.l DisableFlashing : BNE ++
|
LDA.l DisableFlashing : BNE ++
|
||||||
LDA.b #$32 : STA.w CGADSUBQ
|
LDA.b #$32 : STA.w $9A
|
||||||
RTL
|
RTL
|
||||||
++
|
++
|
||||||
LDA.b #$72
|
LDA.b #$72
|
||||||
STA.b CGADSUBQ
|
STA $9A
|
||||||
RTL
|
RTL
|
||||||
;================================================================================
|
;================================================================================
|
||||||
ConditionalWhitenBg:
|
ConditionalWhitenBg:
|
||||||
LDX.b #$00
|
LDX.b #$00
|
||||||
LDA.l DisableFlashing : REP #$20 : BNE +
|
LDA.l DisableFlashing : REP #$20 : BNE +
|
||||||
LDA.b Scrap00,X
|
LDA $00,X
|
||||||
JSR WhitenLoopReal
|
JSR WhitenLoopReal
|
||||||
RTL
|
RTL
|
||||||
+
|
+
|
||||||
LDA.b Scrap00
|
LDA $00
|
||||||
JSR WhitenLoopDummy
|
JSR WhitenLoopDummy
|
||||||
RTL
|
RTL
|
||||||
;================================================================================
|
;================================================================================
|
||||||
WhitenLoopReal:
|
WhitenLoopReal:
|
||||||
-
|
-
|
||||||
LDA.l PaletteBufferAux+$40, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$40, X
|
LDA $7EC340, X : JSL Filter_Majorly_Whiten_Color : STA $7EC540, X
|
||||||
LDA.l PaletteBufferAux+$50, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$50, X
|
LDA $7EC350, X : JSL Filter_Majorly_Whiten_Color : STA $7EC550, X
|
||||||
LDA.l PaletteBufferAux+$60, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$60, X
|
LDA $7EC360, X : JSL Filter_Majorly_Whiten_Color : STA $7EC560, X
|
||||||
LDA.l PaletteBufferAux+$70, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$70, X
|
LDA $7EC370, X : JSL Filter_Majorly_Whiten_Color : STA $7EC570, X
|
||||||
LDA.l PaletteBufferAux+$80, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$80, X
|
LDA $7EC380, X : JSL Filter_Majorly_Whiten_Color : STA $7EC580, X
|
||||||
LDA.l PaletteBufferAux+$90, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$90, X
|
LDA $7EC390, X : JSL Filter_Majorly_Whiten_Color : STA $7EC590, X
|
||||||
LDA.l PaletteBufferAux+$A0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$A0, X
|
LDA $7EC3A0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5A0, X
|
||||||
LDA.l PaletteBufferAux+$B0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$B0, X
|
LDA $7EC3B0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5B0, X
|
||||||
LDA.l PaletteBufferAux+$C0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$C0, X
|
LDA $7EC3C0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5C0, X
|
||||||
LDA.l PaletteBufferAux+$D0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$D0, X
|
LDA $7EC3D0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5D0, X
|
||||||
LDA.l PaletteBufferAux+$E0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$E0, X
|
LDA $7EC3E0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5E0, X
|
||||||
INX #2 : CPX.b #$10 : BEQ +
|
INX #2 : CPX.b #$10 : BEQ +
|
||||||
JMP -
|
JMP -
|
||||||
+
|
+
|
||||||
LDA.l PaletteBufferAux+$F0 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F0
|
LDA $7EC3F0 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F0
|
||||||
LDA.l PaletteBufferAux+$F2 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F2
|
LDA $7EC3F2 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F2
|
||||||
LDA.l PaletteBufferAux+$F4 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F4
|
LDA $7EC3F4 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F4
|
||||||
LDA.b GameMode : CMP.w #$0007 : BNE +
|
LDA $10 : CMP.w #$07 : BNE +
|
||||||
LDA.b RoomIndex
|
LDA $048E
|
||||||
CMP.w #$003C : BEQ ++
|
CMP.w #$3C : BEQ ++
|
||||||
CMP.w #$009D : BEQ ++
|
CMP.w #$9D : BEQ ++
|
||||||
CMP.w #$009C : BEQ ++
|
CMP.w #$9C : BEQ ++
|
||||||
CMP.w #$00A5 : BEQ ++
|
CMP.w #$A5 : BEQ ++
|
||||||
+
|
+
|
||||||
LDA.l PaletteBufferAux+$F6 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F6
|
LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F6
|
||||||
LDA.l PaletteBufferAux+$F8 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F8
|
LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F8
|
||||||
BRA +++
|
BRA +++
|
||||||
++
|
++
|
||||||
LDA.l PaletteBuffer+$F6 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F6
|
LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F6
|
||||||
LDA.l PaletteBuffer+$F8 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F8
|
LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F8
|
||||||
BRA +++
|
BRA +++
|
||||||
+++
|
+++
|
||||||
LDA.l PaletteBufferAux+$FA : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$FA
|
LDA $7EC3FA : JSL Filter_Majorly_Whiten_Color : STA $7EC5FA
|
||||||
LDA.l PaletteBufferAux+$FC : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$FC
|
LDA $7EC3FC : JSL Filter_Majorly_Whiten_Color : STA $7EC5FC
|
||||||
LDA.l PaletteBufferAux+$FE : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$FE
|
LDA $7EC3FE : JSL Filter_Majorly_Whiten_Color : STA $7EC5FE
|
||||||
REP #$10
|
REP #$10
|
||||||
LDA.l PaletteBuffer+$40 : TAY
|
LDA $7EC540 : TAY
|
||||||
LDA.l PaletteBufferAux : BNE +
|
LDA $7EC300 : BNE +
|
||||||
TAY
|
TAY
|
||||||
+
|
+
|
||||||
TYA : STA.l PaletteBuffer
|
TYA : STA $7EC500
|
||||||
SEP #$30
|
SEP #$30
|
||||||
RTS
|
RTS
|
||||||
;================================================================================
|
;================================================================================
|
||||||
WhitenLoopDummy:
|
WhitenLoopDummy:
|
||||||
-
|
-
|
||||||
LDA.l PaletteBufferAux+$40, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$40, X
|
LDA $7EC340, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC540, X
|
||||||
LDA.l PaletteBufferAux+$50, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$50, X
|
LDA $7EC350, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC550, X
|
||||||
LDA.l PaletteBufferAux+$60, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$60, X
|
LDA $7EC360, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC560, X
|
||||||
LDA.l PaletteBufferAux+$70, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$70, X
|
LDA $7EC370, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC570, X
|
||||||
LDA.l PaletteBufferAux+$80, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$80, X
|
LDA $7EC380, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC580, X
|
||||||
LDA.l PaletteBufferAux+$90, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$90, X
|
LDA $7EC390, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC590, X
|
||||||
LDA.l PaletteBufferAux+$A0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$A0, X
|
LDA $7EC3A0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5A0, X
|
||||||
LDA.l PaletteBufferAux+$B0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$B0, X
|
LDA $7EC3B0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5B0, X
|
||||||
LDA.l PaletteBufferAux+$C0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$C0, X
|
LDA $7EC3C0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5C0, X
|
||||||
LDA.l PaletteBufferAux+$D0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$D0, X
|
LDA $7EC3D0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5D0, X
|
||||||
LDA.l PaletteBufferAux+$E0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$E0, X
|
LDA $7EC3E0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5E0, X
|
||||||
INX #2 : CPX.b #$10 : BEQ +
|
INX #2 : CPX.b #$10 : BEQ +
|
||||||
JMP -
|
JMP -
|
||||||
+
|
+
|
||||||
LDA.l PaletteBufferAux+$F0 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F0
|
LDA $7EC3F0 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F0
|
||||||
LDA.l PaletteBufferAux+$F2 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F2
|
LDA $7EC3F2 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F2
|
||||||
LDA.l PaletteBufferAux+$F4 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F4
|
LDA $7EC3F4 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F4
|
||||||
LDA.b GameMode : CMP.w #$0007 : BNE + ; only light invisifloor if we're in dungeon submodule
|
LDA $10 : CMP.w #$07 : BNE + ; only light invisifloor if we're in dungeon submodule
|
||||||
LDA.b RoomIndex
|
LDA $048E
|
||||||
CMP.w #$003C : BEQ ++ ; hookshot cave
|
CMP.w #$3C : BEQ ++ ; hookshot cave
|
||||||
CMP.w #$009D : BEQ ++ ; gt right
|
CMP.w #$9D : BEQ ++ ; gt right
|
||||||
CMP.w #$009C : BEQ ++ ; gt big room
|
CMP.w #$9C : BEQ ++ ; gt big room
|
||||||
CMP.w #$00A5 : BEQ ++ ; wizzrobes 1
|
CMP.w #$A5 : BEQ ++ ; wizzrobes 1
|
||||||
+
|
+
|
||||||
LDA.l PaletteBufferAux+$F6 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F6
|
LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F6
|
||||||
LDA.l PaletteBufferAux+$F8 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F8
|
LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F8
|
||||||
BRA +++
|
BRA +++
|
||||||
++
|
++
|
||||||
LDA.l PaletteBufferAux+$F6 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F6
|
LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F6
|
||||||
LDA.l PaletteBufferAux+$F8 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F8
|
LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F8
|
||||||
BRA +++
|
BRA +++
|
||||||
+++
|
+++
|
||||||
LDA.l PaletteBufferAux+$FA : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$FA
|
LDA $7EC3FA : JSL Filter_Majorly_Whiten_Color : LDA $7EC5FA
|
||||||
LDA.l PaletteBufferAux+$FC : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$FC
|
LDA $7EC3FC : JSL Filter_Majorly_Whiten_Color : LDA $7EC5FC
|
||||||
LDA.l PaletteBufferAux+$FE : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$FE
|
LDA $7EC3FE : JSL Filter_Majorly_Whiten_Color : LDA $7EC5FE
|
||||||
REP #$10
|
REP #$10
|
||||||
LDA.l PaletteBuffer+$40 : TAY
|
LDA $7EC540 : TAY
|
||||||
LDA.l PaletteBufferAux : BNE +
|
LDA $7EC300 : BNE +
|
||||||
TAY
|
TAY
|
||||||
+
|
+
|
||||||
TYA : STA.l PaletteBuffer
|
TYA : STA $7EC500
|
||||||
SEP #$30
|
SEP #$30
|
||||||
RTS
|
RTS
|
||||||
;================================================================================
|
;================================================================================
|
||||||
@@ -120,144 +129,144 @@ RestoreBgEther:
|
|||||||
LDX.b #$00
|
LDX.b #$00
|
||||||
LDA.l DisableFlashing : REP #$20 : BNE +
|
LDA.l DisableFlashing : REP #$20 : BNE +
|
||||||
-
|
-
|
||||||
LDA.b Scrap00,X
|
LDA $00,X
|
||||||
LDA.l PaletteBufferAux+$40, X : STA.l PaletteBuffer+$40, X
|
LDA $7EC340, X : STA $7EC540, X
|
||||||
LDA.l PaletteBufferAux+$50, X : STA.l PaletteBuffer+$50, X
|
LDA $7EC350, X : STA $7EC550, X
|
||||||
LDA.l PaletteBufferAux+$60, X : STA.l PaletteBuffer+$60, X
|
LDA $7EC360, X : STA $7EC560, X
|
||||||
LDA.l PaletteBufferAux+$70, X : STA.l PaletteBuffer+$70, X
|
LDA $7EC370, X : STA $7EC570, X
|
||||||
LDA.l PaletteBufferAux+$80, X : STA.l PaletteBuffer+$80, X
|
LDA $7EC380, X : STA $7EC580, X
|
||||||
LDA.l PaletteBufferAux+$90, X : STA.l PaletteBuffer+$90, X
|
LDA $7EC390, X : STA $7EC590, X
|
||||||
LDA.l PaletteBufferAux+$A0, X : STA.l PaletteBuffer+$A0, X
|
LDA $7EC3A0, X : STA $7EC5A0, X
|
||||||
LDA.l PaletteBufferAux+$B0, X : STA.l PaletteBuffer+$B0, X
|
LDA $7EC3B0, X : STA $7EC5B0, X
|
||||||
LDA.l PaletteBufferAux+$C0, X : STA.l PaletteBuffer+$C0, X
|
LDA $7EC3C0, X : STA $7EC5C0, X
|
||||||
LDA.l PaletteBufferAux+$D0, X : STA.l PaletteBuffer+$D0, X
|
LDA $7EC3D0, X : STA $7EC5D0, X
|
||||||
LDA.l PaletteBufferAux+$E0, X : STA.l PaletteBuffer+$E0, X
|
LDA $7EC3E0, X : STA $7EC5E0, X
|
||||||
LDA.l PaletteBufferAux+$F0, X : STA.l PaletteBuffer+$F0, X
|
LDA $7EC3F0, X : STA $7EC5F0, X
|
||||||
INX #2 : CPX.b #$10 : BNE -
|
INX #2 : CPX.b #$10 : BNE -
|
||||||
BRA ++
|
BRA ++
|
||||||
+
|
+
|
||||||
-
|
-
|
||||||
LDA.b Scrap00
|
LDA $00
|
||||||
LDA.l PaletteBufferAux+$40, X : LDA.l PaletteBuffer+$40, X
|
LDA $7EC340, X : LDA $7EC540, X
|
||||||
LDA.l PaletteBufferAux+$50, X : LDA.l PaletteBuffer+$50, X
|
LDA $7EC350, X : LDA $7EC550, X
|
||||||
LDA.l PaletteBufferAux+$60, X : LDA.l PaletteBuffer+$60, X
|
LDA $7EC360, X : LDA $7EC560, X
|
||||||
LDA.l PaletteBufferAux+$70, X : LDA.l PaletteBuffer+$70, X
|
LDA $7EC370, X : LDA $7EC570, X
|
||||||
LDA.l PaletteBufferAux+$80, X : LDA.l PaletteBuffer+$80, X
|
LDA $7EC380, X : LDA $7EC580, X
|
||||||
LDA.l PaletteBufferAux+$90, X : LDA.l PaletteBuffer+$90, X
|
LDA $7EC390, X : LDA $7EC590, X
|
||||||
LDA.l PaletteBufferAux+$A0, X : LDA.l PaletteBuffer+$A0, X
|
LDA $7EC3A0, X : LDA $7EC5A0, X
|
||||||
LDA.l PaletteBufferAux+$B0, X : LDA.l PaletteBuffer+$B0, X
|
LDA $7EC3B0, X : LDA $7EC5B0, X
|
||||||
LDA.l PaletteBufferAux+$C0, X : LDA.l PaletteBuffer+$C0, X
|
LDA $7EC3C0, X : LDA $7EC5C0, X
|
||||||
LDA.l PaletteBufferAux+$D0, X : LDA.l PaletteBuffer+$D0, X
|
LDA $7EC3D0, X : LDA $7EC5D0, X
|
||||||
LDA.l PaletteBufferAux+$E0, X : LDA.l PaletteBuffer+$E0, X
|
LDA $7EC3E0, X : LDA $7EC5E0, X
|
||||||
LDA.l PaletteBufferAux+$F0, X : LDA.l PaletteBuffer+$F0, X
|
LDA $7EC3F0, X : LDA $7EC5F0, X
|
||||||
INX #2 : CPX.b #$10 : BNE -
|
INX #2 : CPX.b #$10 : BNE -
|
||||||
BRA ++
|
BRA ++
|
||||||
++
|
++
|
||||||
JML Palette_RestoreFixedColor-7 ; Bank0E.asm : 3936 vanilla restore routine after loop which RTLs
|
JML $02FF51 ; Bank0E.asm : 3936 vanilla restore routine after loop which RTLs
|
||||||
;================================================================================
|
;================================================================================
|
||||||
DDMConditionalLightning:
|
DDMConditionalLightning:
|
||||||
LDA.l DisableFlashing
|
LDA.l DisableFlashing
|
||||||
REP #$20
|
REP #$20
|
||||||
BNE +
|
BNE +
|
||||||
LDA.w Scrap
|
LDA.w $0000
|
||||||
LDX.b #$02
|
LDX.b #$02
|
||||||
JML FlashGanonTowerPalette_next_thunder-2 ; Bank0E.asm : 4738 vanilla loop equivalent to below beginning at LDY #$00
|
JML $07FA7F ; Bank0E.asm : 4738 vanilla loop equivalent to below beginning at LDY #$00
|
||||||
+
|
+
|
||||||
LDA.b Scrap00 : LDX.b #$02 : LDY.b #$00
|
LDA.b $00 : LDX.b #$02 : LDY #$00
|
||||||
-
|
-
|
||||||
LDA.w $F4EB, Y : LDA.l PaletteBuffer+$60, X
|
LDA $F4EB, Y : LDA $7EC560, X
|
||||||
LDA.w $F4F9, Y : LDA.l PaletteBuffer+$70, X
|
LDA $F4F9, Y : LDA $7EC570, X
|
||||||
LDA.w $F507, Y : LDA.l PaletteBuffer+$90, X
|
LDA $F507, Y : LDA $7EC590, X
|
||||||
LDA.w $F515, Y : LDA.l PaletteBuffer+$E0, X
|
LDA $F515, Y : LDA $7EC5E0, X
|
||||||
LDA.w $F523, Y : LDA.l PaletteBuffer+$F0, X
|
LDA $F523, Y : LDA $7EC5F0, X
|
||||||
INY #2
|
INY #2
|
||||||
INX #2 : CPX.b #$10 : BNE -
|
INX #2 : CPX.b #$10 : BNE -
|
||||||
JML FlashGanonTowerPalette_bright_white ; Bank0E.asm : 4754 both branches converge here
|
JML $07FAAC ; Bank0E.asm : 4754 both branches converge here
|
||||||
;================================================================================
|
;================================================================================
|
||||||
ConditionalGTFlash:
|
ConditionalGTFlash:
|
||||||
LDA.l DisableFlashing : REP #$20 : BNE +
|
LDA.l DisableFlashing : REP #$20 : BNE +
|
||||||
LDA.w Scrap
|
LDA $0000
|
||||||
-
|
-
|
||||||
LDA.w $F9C1, Y : STA.l PaletteBuffer+$D0, X
|
LDA $F9C1, Y : STA $7EC5D0, X
|
||||||
INY #2
|
INY #2
|
||||||
INX #2 : CPX.b #$10 : BNE -
|
INX #2 : CPX.b #$10 : BNE -
|
||||||
RTL
|
RTL
|
||||||
+
|
+
|
||||||
LDA.b Scrap00
|
LDA $00
|
||||||
-
|
-
|
||||||
LDA.w $F9C1, Y : LDA.l PaletteBuffer+$D0, X
|
LDA $F9C1, Y : LDA $7EC5D0, X
|
||||||
INY #2
|
INY #2
|
||||||
INX #2 : CPX.b #$10 : BNE -
|
INX #2 : CPX.b #$10 : BNE -
|
||||||
RTL
|
RTL
|
||||||
;================================================================================
|
;================================================================================
|
||||||
ConditionalRedFlash:
|
ConditionalRedFlash:
|
||||||
LDA.l DisableFlashing : REP #$20 : BNE +
|
LDA.l DisableFlashing : REP #$20 : BNE +
|
||||||
LDA.b Scrap,X
|
LDA $00,X
|
||||||
LDA.w #$1D59 : STA.l PaletteBuffer+$DA
|
LDA.w #$1D59 : STA $7EC5DA
|
||||||
LDA.w #$25FF : STA.l PaletteBuffer+$DC
|
LDA.w #$25FF : STA $7EC5DC
|
||||||
LDA.w #$001A
|
LDA.w #$001A
|
||||||
RTL
|
RTL
|
||||||
+
|
+
|
||||||
LDA.b Scrap00
|
LDA $00
|
||||||
LDA.w #$1D59 : LDA.l PaletteBuffer+$DA
|
LDA.w #$1D59 : LDA $7EC5DA
|
||||||
LDA.w #$25FF : LDA.l PaletteBuffer+$DC
|
LDA.w #$25FF : LDA $7EC5DC
|
||||||
LDA.w #$0000
|
LDA.w #$0000
|
||||||
RTL
|
RTL
|
||||||
;================================================================================
|
;================================================================================
|
||||||
ConditionalPedAncilla:
|
ConditionalPedAncilla:
|
||||||
LDA.l DisableFlashing : REP #$20 : BNE +
|
LDA.l DisableFlashing : REP #$20 : BNE +
|
||||||
LDA.b Scrap,X
|
LDA $00,X
|
||||||
LDA.b Scrap00 : STA.b Scrap04
|
LDA $00 : STA $04
|
||||||
LDA.b Scrap02 : STA.b Scrap06
|
LDA $02 : STA $06
|
||||||
RTL
|
RTL
|
||||||
+
|
+
|
||||||
LDA.b Scrap
|
LDA $00
|
||||||
LDA.b Scrap00 : LDA.b Scrap04
|
LDA $00 : LDA $04
|
||||||
LDA.b Scrap02 : LDA.b Scrap06
|
LDA $02 : LDA $06
|
||||||
RTL
|
RTL
|
||||||
;================================================================================
|
;================================================================================
|
||||||
LoadElectroPalette:
|
LoadElectroPalette:
|
||||||
REP #$20
|
REP #$20
|
||||||
LDA.w #$0202 : STA.b Scrap0C
|
LDA.w #$0202 : STA $0C
|
||||||
LDA.w #$0404 : STA.b Scrap0E
|
LDA.w #$0404 : STA $0E
|
||||||
LDA.w #$001B : STA.b Scrap02
|
LDA.w #$001B : STA $02
|
||||||
SEP #$10
|
SEP #$10
|
||||||
LDX.b Scrap0C : LDA.l SwordPaletteOffsets, X : AND.w #$00FF : ADC.w #$D630
|
LDX $0C : LDA $1BEBB4, X : AND.w #$00FF : ADC #$D630
|
||||||
REP #$10 : LDX.w #$01B2 : LDY.w #$0002
|
REP #$10 : LDX.w #$01B2 : LDY.w #$0002
|
||||||
JSR ConditionalLoadGearPalette
|
JSR ConditionalLoadGearPalette
|
||||||
SEP #$10
|
SEP #$10
|
||||||
LDX.b Scrap0D
|
LDX $0D
|
||||||
LDA.l ShieldPaletteOffsets, X : AND.w #$00FF : ADC.w #$D648
|
LDA $1BEBC1, X : AND.w #$00FF : ADC #$D648
|
||||||
REP #$10 : LDX.w #$01B8 : LDY.w #$0003
|
REP #$10 : LDX.w #$01B8 : LDY.w #$0003
|
||||||
JSR ConditionalLoadGearPalette
|
JSR ConditionalLoadGearPalette
|
||||||
SEP #$10
|
SEP #$10
|
||||||
LDX.b Scrap0E
|
LDX $0E
|
||||||
LDA.l LinkMailPalettesOffsets, X : AND.w #$00FF : ASL A : ADC.w #$D308
|
LDA $1BEC06, X : AND.w #$00FF : ASL A : ADC #$D308
|
||||||
REP #$10 : LDX.w #$01E2 : LDY.w #$000E
|
REP #$10 : LDX.w #$01E2 : LDY.w #$000E
|
||||||
JSR ConditionalLoadGearPalette
|
JSR ConditionalLoadGearPalette
|
||||||
SEP #$30
|
SEP #$30
|
||||||
INC.b NMICGRAM
|
INC $15
|
||||||
RTL
|
RTL
|
||||||
;================================================================================
|
;================================================================================
|
||||||
ConditionalLoadGearPalette:
|
ConditionalLoadGearPalette:
|
||||||
STA.b Scrap00
|
STA $00
|
||||||
SEP #$20
|
SEP #$20
|
||||||
LDA.l DisableFlashing : REP #$20 : BNE +
|
LDA.l DisableFlashing : REP #$20 : BNE +
|
||||||
LDA.b Scrap,X
|
LDA $00,X
|
||||||
-
|
-
|
||||||
LDA.b [Scrap00]
|
LDA [$00]
|
||||||
STA.l PaletteBuffer, X
|
STA $7EC500, X
|
||||||
INC.b Scrap00 : INC.b Scrap00
|
INC $00 : INC $00
|
||||||
INX #2
|
INX #2
|
||||||
DEY
|
DEY
|
||||||
BPL -
|
BPL -
|
||||||
RTS
|
RTS
|
||||||
+
|
+
|
||||||
LDA.b Scrap
|
LDA $00
|
||||||
-
|
-
|
||||||
LDA.b [Scrap00]
|
LDA [$00]
|
||||||
LDA.l PaletteBuffer, X
|
LDA $7EC500, X
|
||||||
INC.b Scrap00 : INC.b Scrap00
|
INC $00 : INC $00
|
||||||
INX #2
|
INX #2
|
||||||
DEY
|
DEY
|
||||||
BPL -
|
BPL -
|
||||||
@@ -272,13 +281,13 @@ RestoreElectroPalette:
|
|||||||
LDX.w #$01E2 : LDY.w #$000E
|
LDX.w #$01E2 : LDY.w #$000E
|
||||||
JSR FillPaletteBufferFromAux
|
JSR FillPaletteBufferFromAux
|
||||||
SEP #$30
|
SEP #$30
|
||||||
INC.b NMICGRAM
|
INC $15
|
||||||
RTL
|
RTL
|
||||||
;================================================================================
|
;================================================================================
|
||||||
FillPaletteBufferFromAux:
|
FillPaletteBufferFromAux:
|
||||||
-
|
-
|
||||||
LDA.l PaletteBufferAux, X
|
LDA $7EC300, X
|
||||||
STA.l PaletteBuffer, X
|
STA $7EC500, X
|
||||||
INX #2
|
INX #2
|
||||||
DEY
|
DEY
|
||||||
BPL -
|
BPL -
|
||||||
|
|||||||
BIN
asar-x64.dll
BIN
asar-x64.dll
Binary file not shown.
421
asar.py
421
asar.py
@@ -1,421 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
python interface for asar.dll
|
|
||||||
by randomdude999
|
|
||||||
|
|
||||||
Usage: import asar, call asar.init, call asar.patch, then use the various
|
|
||||||
functions to get info about the patch
|
|
||||||
"""
|
|
||||||
|
|
||||||
import ctypes
|
|
||||||
import enum
|
|
||||||
import sys
|
|
||||||
from ctypes import c_int, c_char_p, POINTER
|
|
||||||
c_int_ptr = POINTER(c_int)
|
|
||||||
|
|
||||||
__all__ = ["errordata", "writtenblockdata", "mappertype", "version",
|
|
||||||
"apiversion", "init", "reset", "patch", "maxromsize", "close",
|
|
||||||
"geterrors", "getwarnings", "getprints", "getalllabels",
|
|
||||||
"getlabelval", "getdefine", "getalldefines", "resolvedefines",
|
|
||||||
"math", "getwrittenblocks", "getmapper", "getsymbolsfile"]
|
|
||||||
_target_api_ver = 303
|
|
||||||
_asar = None
|
|
||||||
|
|
||||||
|
|
||||||
class AsarArithmeticError(ArithmeticError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class errordata(ctypes.Structure):
|
|
||||||
_fields_ = [("fullerrdata", c_char_p),
|
|
||||||
("rawerrdata", c_char_p),
|
|
||||||
("block", c_char_p),
|
|
||||||
("filename", c_char_p),
|
|
||||||
("line", c_int),
|
|
||||||
("callerfilename", c_char_p),
|
|
||||||
("callerline", c_int),
|
|
||||||
("errid", c_int)]
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<asar error: {!r}>".format(self.fullerrdata.decode())
|
|
||||||
|
|
||||||
|
|
||||||
# for internal use only. getalllabels() returns a dict.
|
|
||||||
class _labeldata(ctypes.Structure):
|
|
||||||
_fields_ = [("name", c_char_p),
|
|
||||||
("location", c_int)]
|
|
||||||
|
|
||||||
|
|
||||||
# for internal use only. getalldefines() returns a dict.
|
|
||||||
class _definedata(ctypes.Structure):
|
|
||||||
_fields_ = [("name", c_char_p),
|
|
||||||
("contents", c_char_p)]
|
|
||||||
|
|
||||||
|
|
||||||
class writtenblockdata(ctypes.Structure):
|
|
||||||
_fields_ = [("pcoffset", c_int),
|
|
||||||
("snesoffset", c_int),
|
|
||||||
("numbytes", c_int)]
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<written block ${:06x} 0x{:x} size:{}>".format(
|
|
||||||
self.snesoffset, self.pcoffset, self.numbytes)
|
|
||||||
|
|
||||||
|
|
||||||
# internal use only. patch() accepts a dict.
|
|
||||||
class _memoryfile(ctypes.Structure):
|
|
||||||
_fields_ = [("path", c_char_p),
|
|
||||||
("buffer", c_char_p),
|
|
||||||
("length", ctypes.c_size_t)]
|
|
||||||
|
|
||||||
|
|
||||||
# internal use only. patch() accepts a dict.
|
|
||||||
class _warnsetting(ctypes.Structure):
|
|
||||||
_fields_ = [("warnid", c_char_p),
|
|
||||||
("enabled", ctypes.c_bool)]
|
|
||||||
|
|
||||||
|
|
||||||
# For internal use only.
|
|
||||||
class _patchparams(ctypes.Structure):
|
|
||||||
_fields_ = [("structsize", c_int),
|
|
||||||
("patchloc", c_char_p),
|
|
||||||
("romdata", c_char_p),
|
|
||||||
("buflen", c_int),
|
|
||||||
("romlen", c_int_ptr),
|
|
||||||
("includepaths", POINTER(c_char_p)),
|
|
||||||
("numincludepaths", c_int),
|
|
||||||
("should_reset", ctypes.c_bool),
|
|
||||||
("additional_defines", POINTER(_definedata)),
|
|
||||||
("additional_define_count", c_int),
|
|
||||||
("stdincludesfile", c_char_p),
|
|
||||||
("stddefinesfile", c_char_p),
|
|
||||||
("warning_settings", POINTER(_warnsetting)),
|
|
||||||
("warning_setting_count", c_int),
|
|
||||||
("memory_files", POINTER(_memoryfile)),
|
|
||||||
("memory_file_count", c_int),
|
|
||||||
("override_checksum_gen", ctypes.c_bool),
|
|
||||||
("generate_checksum", ctypes.c_bool)]
|
|
||||||
|
|
||||||
|
|
||||||
class mappertype(enum.Enum):
|
|
||||||
invalid_mapper = 0
|
|
||||||
lorom = 1
|
|
||||||
hirom = 2
|
|
||||||
sa1rom = 3
|
|
||||||
bigsa1rom = 4
|
|
||||||
sfxrom = 5
|
|
||||||
exlorom = 6
|
|
||||||
exhirom = 7
|
|
||||||
norom = 8
|
|
||||||
|
|
||||||
|
|
||||||
def _getall(func):
|
|
||||||
"""Helper that does the work common to all the getall* functions."""
|
|
||||||
count = c_int()
|
|
||||||
raw_errs = func(ctypes.byref(count))
|
|
||||||
errs = []
|
|
||||||
for i in range(count.value):
|
|
||||||
errs.append(raw_errs[i])
|
|
||||||
return errs
|
|
||||||
|
|
||||||
|
|
||||||
class _AsarDLL:
|
|
||||||
def __init__(self, dllname):
|
|
||||||
dll = ctypes.CDLL(dllname)
|
|
||||||
self.dll = dll
|
|
||||||
self.funcs = {}
|
|
||||||
try:
|
|
||||||
# argument/return type setup
|
|
||||||
# (also verifies that those functions are exported from the DLL)
|
|
||||||
# this is directly from asardll.h
|
|
||||||
# setup_func(name, argtypes, returntype)
|
|
||||||
self.setup_func("version", (), c_int)
|
|
||||||
self.setup_func("apiversion", (), c_int)
|
|
||||||
self.setup_func("init", (), ctypes.c_bool)
|
|
||||||
self.setup_func("reset", (), ctypes.c_bool)
|
|
||||||
self.setup_func("patch", (c_char_p, c_char_p, c_int, c_int_ptr),
|
|
||||||
ctypes.c_bool)
|
|
||||||
self.setup_func("patch_ex", (POINTER(_patchparams),), ctypes.c_bool)
|
|
||||||
self.setup_func("maxromsize", (), c_int)
|
|
||||||
self.setup_func("close", (), None)
|
|
||||||
self.setup_func("geterrors", (c_int_ptr,), POINTER(errordata))
|
|
||||||
self.setup_func("getwarnings", (c_int_ptr,), POINTER(errordata))
|
|
||||||
self.setup_func("getprints", (c_int_ptr,), POINTER(c_char_p))
|
|
||||||
self.setup_func("getalllabels", (c_int_ptr,), POINTER(_labeldata))
|
|
||||||
self.setup_func("getlabelval", (c_char_p,), c_int)
|
|
||||||
self.setup_func("getdefine", (c_char_p,), c_char_p)
|
|
||||||
self.setup_func("getalldefines", (c_int_ptr,), POINTER(_definedata))
|
|
||||||
self.setup_func("resolvedefines", (c_char_p, ctypes.c_bool),
|
|
||||||
c_char_p)
|
|
||||||
self.setup_func("math", (c_char_p, POINTER(c_char_p)),
|
|
||||||
ctypes.c_double)
|
|
||||||
self.setup_func("getwrittenblocks", (c_int_ptr,),
|
|
||||||
POINTER(writtenblockdata))
|
|
||||||
self.setup_func("getmapper", (), c_int)
|
|
||||||
self.setup_func("getsymbolsfile", (c_char_p,), c_char_p)
|
|
||||||
|
|
||||||
except AttributeError:
|
|
||||||
raise OSError("Asar DLL is missing some functions")
|
|
||||||
api_ver = dll.asar_apiversion()
|
|
||||||
if api_ver < _target_api_ver or \
|
|
||||||
(api_ver // 100) > (_target_api_ver // 100):
|
|
||||||
raise OSError("Asar DLL version "+str(api_ver)+" unsupported")
|
|
||||||
|
|
||||||
def setup_func(self, name, argtypes, restype):
|
|
||||||
"""Setup argument and return types for a function.
|
|
||||||
|
|
||||||
name: name of the function in the DLL. "asar_" is added automatically
|
|
||||||
argtypes and restype: see ctypes documentation
|
|
||||||
"""
|
|
||||||
func = getattr(self.dll, "asar_" + name)
|
|
||||||
func.argtypes = argtypes
|
|
||||||
func.restype = restype
|
|
||||||
|
|
||||||
|
|
||||||
def init(dll_path=None):
|
|
||||||
"""Load the Asar DLL.
|
|
||||||
|
|
||||||
You must call this before calling any other Asar functions. Raises OSError
|
|
||||||
if there was something wrong with the DLL (not found, wrong version,
|
|
||||||
doesn't have all necessary functions).
|
|
||||||
You can pass a custom DLL path if you want. If you don't, some common names
|
|
||||||
for the asar dll are tried.
|
|
||||||
"""
|
|
||||||
global _asar
|
|
||||||
if _asar is not None:
|
|
||||||
return
|
|
||||||
|
|
||||||
if dll_path is not None:
|
|
||||||
_asar = _AsarDLL(dll_path)
|
|
||||||
else:
|
|
||||||
if sys.platform == "win32":
|
|
||||||
libnames = ["./asar.dll", "asar", "./asar-x64.dll", "asar-x64"]
|
|
||||||
elif sys.platform == "darwin":
|
|
||||||
libnames = ["./libasar.dylib", "libasar"]
|
|
||||||
else:
|
|
||||||
libnames = ["./libasar.so", "libasar"]
|
|
||||||
|
|
||||||
for x in libnames:
|
|
||||||
try:
|
|
||||||
_asar = _AsarDLL(x)
|
|
||||||
except OSError:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if _asar is None:
|
|
||||||
# Nothing in the search path is valid
|
|
||||||
raise OSError("Could not find asar DLL")
|
|
||||||
|
|
||||||
if not _asar.dll.asar_init():
|
|
||||||
_asar = None
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def close():
|
|
||||||
"""Free all of Asar's structures and unload the module.
|
|
||||||
|
|
||||||
Only asar.init() may be called after calling this.
|
|
||||||
"""
|
|
||||||
global _asar
|
|
||||||
if _asar is None:
|
|
||||||
return
|
|
||||||
_asar.dll.asar_close()
|
|
||||||
_asar = None
|
|
||||||
|
|
||||||
|
|
||||||
def version():
|
|
||||||
"""Return the version, in the format major*10000+minor*100+bugfix*1.
|
|
||||||
|
|
||||||
This means that 1.2.34 would be returned as 10234.
|
|
||||||
"""
|
|
||||||
return _asar.dll.asar_version()
|
|
||||||
|
|
||||||
|
|
||||||
def apiversion():
|
|
||||||
"""Return the API version, in the format major*100+minor.
|
|
||||||
|
|
||||||
Minor is incremented on backwards compatible changes; major is incremented
|
|
||||||
on incompatible changes. Does not have any correlation with the Asar
|
|
||||||
version. It's not very useful directly, since asar.init() verifies this
|
|
||||||
automatically.
|
|
||||||
"""
|
|
||||||
return _asar.dll.asar_apiversion()
|
|
||||||
|
|
||||||
|
|
||||||
def reset():
|
|
||||||
"""Clear out errors, warnings, printed statements and the file cache.
|
|
||||||
|
|
||||||
Not really useful, since asar.patch() already does this.
|
|
||||||
"""
|
|
||||||
return _asar.dll.asar_reset()
|
|
||||||
|
|
||||||
|
|
||||||
def patch(patch_name, rom_data, includepaths=[], should_reset=True,
|
|
||||||
additional_defines={}, std_include_file=None, std_define_file=None,
|
|
||||||
warning_overrides={}, memory_files={}, override_checksum=None):
|
|
||||||
"""Applies a patch.
|
|
||||||
|
|
||||||
Returns (success, new_rom_data). If success is False you should call
|
|
||||||
geterrors() to see what went wrong. rom_data is assumed to be headerless.
|
|
||||||
|
|
||||||
If includepaths is specified, it lists additional include paths for asar
|
|
||||||
to search.
|
|
||||||
|
|
||||||
should_reset specifies whether asar should clear out all defines, labels,
|
|
||||||
etc from the last inserted file. Setting it to False will make Asar act
|
|
||||||
like the currently patched file was directly appended to the previous one.
|
|
||||||
|
|
||||||
additional_defines specifies extra defines to give to the patch
|
|
||||||
(similar to the -D option).
|
|
||||||
|
|
||||||
std_include_file and std_define_file specify files where to look for extra
|
|
||||||
include paths and defines, respectively.
|
|
||||||
|
|
||||||
warning_overrides is a dict of str (warning ID) -> bool. It overrides
|
|
||||||
enabling/disabling specific warnings.
|
|
||||||
|
|
||||||
memory_files is a dict of str (file name) -> bytes (file contents). It
|
|
||||||
specifies memory files to use.
|
|
||||||
|
|
||||||
override_checksum specifies whether to override checksum generation. True
|
|
||||||
forces Asar to update the ROM's checksum, False forces Asar to not update
|
|
||||||
it.
|
|
||||||
"""
|
|
||||||
romlen = c_int(len(rom_data))
|
|
||||||
rom_ptr = ctypes.create_string_buffer(bytes(rom_data), maxromsize())
|
|
||||||
pp = _patchparams()
|
|
||||||
pp.structsize = ctypes.sizeof(_patchparams)
|
|
||||||
pp.patchloc = patch_name.encode()
|
|
||||||
pp.romdata = ctypes.cast(rom_ptr, c_char_p)
|
|
||||||
pp.buflen = maxromsize()
|
|
||||||
pp.romlen = ctypes.pointer(romlen)
|
|
||||||
|
|
||||||
# construct an array type of len(includepaths) elements and initialize
|
|
||||||
# it with elements from includepaths
|
|
||||||
pp.includepaths = (c_char_p*len(includepaths))(*includepaths)
|
|
||||||
pp.numincludepaths = len(includepaths)
|
|
||||||
|
|
||||||
defines = (_definedata * len(additional_defines))()
|
|
||||||
for i, (k, v) in enumerate(additional_defines.items()):
|
|
||||||
defines[i].name = k.encode()
|
|
||||||
defines[i].contents = v.encode()
|
|
||||||
pp.additional_defines = defines
|
|
||||||
pp.additional_define_count = len(additional_defines)
|
|
||||||
|
|
||||||
pp.should_reset = should_reset
|
|
||||||
|
|
||||||
pp.stdincludesfile = std_include_file.encode() if std_include_file else None
|
|
||||||
pp.stddefinesfile = std_define_file.encode() if std_define_file else None
|
|
||||||
|
|
||||||
warnsettings = (_warnsetting * len(warning_overrides))()
|
|
||||||
for i, (k, v) in enumerate(warning_overrides.items()):
|
|
||||||
warnsettings[i].warnid = k.encode()
|
|
||||||
warnsettings[i].enabled = v
|
|
||||||
pp.warning_settings = warnsettings
|
|
||||||
pp.warning_setting_count = len(warnsettings)
|
|
||||||
|
|
||||||
memoryfiles = (_memoryfile * len(memory_files))()
|
|
||||||
for i, (k, v) in enumerate(memory_files.items()):
|
|
||||||
memoryfiles[i].path = k.encode()
|
|
||||||
memoryfiles[i].buffer = v
|
|
||||||
memoryfiles[i].length = len(v)
|
|
||||||
pp.memory_files = memoryfiles
|
|
||||||
pp.memory_file_count = len(memory_files)
|
|
||||||
|
|
||||||
if override_checksum is not None:
|
|
||||||
pp.override_checksum_gen = True
|
|
||||||
pp.generate_checksum = override_checksum
|
|
||||||
else:
|
|
||||||
pp.override_checksum_gen = False
|
|
||||||
pp.generate_checksum = False
|
|
||||||
|
|
||||||
result = _asar.dll.asar_patch_ex(ctypes.byref(pp))
|
|
||||||
return result, rom_ptr.raw[:romlen.value]
|
|
||||||
|
|
||||||
|
|
||||||
def maxromsize():
|
|
||||||
"""Return the maximum possible size of the output ROM."""
|
|
||||||
return _asar.dll.asar_maxromsize()
|
|
||||||
|
|
||||||
|
|
||||||
def geterrors():
|
|
||||||
"""Get a list of all errors."""
|
|
||||||
return _getall(_asar.dll.asar_geterrors)
|
|
||||||
|
|
||||||
|
|
||||||
def getwarnings():
|
|
||||||
"""Get a list of all warnings."""
|
|
||||||
return _getall(_asar.dll.asar_getwarnings)
|
|
||||||
|
|
||||||
|
|
||||||
def getprints():
|
|
||||||
"""Get a list of all printed data."""
|
|
||||||
return [x.decode() for x in _getall(_asar.dll.asar_getprints)]
|
|
||||||
|
|
||||||
|
|
||||||
def getalllabels():
|
|
||||||
"""Get a dictionary of label name -> SNES address."""
|
|
||||||
labeldatas = _getall(_asar.dll.asar_getalllabels)
|
|
||||||
return {x.name.decode(): x.location for x in labeldatas}
|
|
||||||
|
|
||||||
|
|
||||||
def getlabelval(name):
|
|
||||||
"""Get the ROM location of one label. None means "not found"."""
|
|
||||||
val = _asar.dll.asar_getlabelval(name.encode())
|
|
||||||
return None if (val == -1) else val
|
|
||||||
|
|
||||||
|
|
||||||
def getdefine(name):
|
|
||||||
"""Get the value of a define."""
|
|
||||||
return _asar.dll.asar_getdefine(name.encode()).decode()
|
|
||||||
|
|
||||||
|
|
||||||
def getalldefines():
|
|
||||||
"""Get the names and values of all defines."""
|
|
||||||
definedatas = _getall(_asar.dll.asar_getalldefines)
|
|
||||||
return {x.name.decode(): x.contents.decode() for x in definedatas}
|
|
||||||
|
|
||||||
|
|
||||||
def resolvedefines(data, learnnew):
|
|
||||||
"""Parse all defines in the given data.
|
|
||||||
|
|
||||||
Returns the data with all defines evaluated.
|
|
||||||
learnnew controls whether it'll learn new defines in this string if it
|
|
||||||
finds any. Note that it may emit errors.
|
|
||||||
"""
|
|
||||||
return _asar.dll.asar_resolvedefines(data, learnnew)
|
|
||||||
|
|
||||||
|
|
||||||
def math(to_calculate):
|
|
||||||
"""Parse a string containing math.
|
|
||||||
|
|
||||||
It automatically assumes global scope (no namespaces), and has access to
|
|
||||||
all functions and labels from the last call to asar.patch(). If there was
|
|
||||||
an error, ArithmeticError is raised with the message returned by Asar.
|
|
||||||
"""
|
|
||||||
error = ctypes.c_char_p()
|
|
||||||
result = _asar.dll.asar_math(to_calculate.encode(), ctypes.byref(error))
|
|
||||||
if not bool(error):
|
|
||||||
# Null pointer, means no error
|
|
||||||
return result
|
|
||||||
else:
|
|
||||||
raise AsarArithmeticError(error.value.decode())
|
|
||||||
|
|
||||||
|
|
||||||
def getwrittenblocks():
|
|
||||||
"""Get a list of all the blocks written to the ROM."""
|
|
||||||
return _getall(_asar.dll.asar_getwrittenblocks)
|
|
||||||
|
|
||||||
|
|
||||||
def getmapper():
|
|
||||||
"""Get the ROM mapper currently used by Asar."""
|
|
||||||
return mappertype(_asar.dll.asar_getmapper())
|
|
||||||
|
|
||||||
def getsymbolsfile(fmt="wla"):
|
|
||||||
"""Generates the contents of a symbols file for in a specific format.
|
|
||||||
|
|
||||||
Returns the textual contents of the symbols file.
|
|
||||||
format specified the format of the symbols file that gets generated.
|
|
||||||
"""
|
|
||||||
return _asar.dll.asar_getsymbolsfile(fmt.encode()).decode()
|
|
||||||
BIN
bin/linux/asar
BIN
bin/linux/asar
Binary file not shown.
BIN
bin/macos/asar
BIN
bin/macos/asar
Binary file not shown.
Binary file not shown.
203
bombos_only.asm
Normal file
203
bombos_only.asm
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
!ITEMCOUNT = $F0
|
||||||
|
|
||||||
|
; ============== Replace all picked up item icons with bombos =================
|
||||||
|
org AddReceivedItemExpanded_y_offsets
|
||||||
|
fillbyte -4
|
||||||
|
fill !ITEMCOUNT
|
||||||
|
|
||||||
|
org AddReceivedItemExpanded_x_offsets
|
||||||
|
fillbyte 0
|
||||||
|
fill !ITEMCOUNT
|
||||||
|
|
||||||
|
org AddReceivedItemExpanded_item_graphics_indices
|
||||||
|
fillbyte $1B
|
||||||
|
fill !ITEMCOUNT
|
||||||
|
|
||||||
|
org AddReceivedItemExpanded_wide_item_flag
|
||||||
|
fillbyte $02
|
||||||
|
fill !ITEMCOUNT
|
||||||
|
|
||||||
|
org AddReceivedItemExpanded_properties
|
||||||
|
fillbyte 4
|
||||||
|
fill !ITEMCOUNT
|
||||||
|
|
||||||
|
org GetSpriteID_gfxSlots
|
||||||
|
fillbyte $1B
|
||||||
|
fill !ITEMCOUNT
|
||||||
|
|
||||||
|
org GetSpritePalette_gfxPalettes
|
||||||
|
fillbyte $08
|
||||||
|
fill !ITEMCOUNT
|
||||||
|
|
||||||
|
org IsNarrowSprite_smallSprites
|
||||||
|
padbyte $FF
|
||||||
|
pad PrepDynamicTile
|
||||||
|
; =============================================================================
|
||||||
|
|
||||||
|
; ===================== Remove attempt to animate rupees ======================
|
||||||
|
org $08C672
|
||||||
|
LDA.b #$0F : NOP
|
||||||
|
; =============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
; ===================== Replace all menu icons with bombos ====================
|
||||||
|
macro bombos_icon()
|
||||||
|
dw $287D, $287E, $E87E, $E87D ; Bombos
|
||||||
|
endmacro
|
||||||
|
|
||||||
|
macro empty_icon()
|
||||||
|
dw $20F5, $20F5, $20F5, $20F5 ; No bombos
|
||||||
|
endmacro
|
||||||
|
|
||||||
|
org $0DF649
|
||||||
|
%empty_icon() ; No bow
|
||||||
|
%bombos_icon() ; Empty bow
|
||||||
|
%bombos_icon() ; Bow and arrows
|
||||||
|
%bombos_icon() ; Empty silvers bow
|
||||||
|
%bombos_icon() ; Silver bow and arrows
|
||||||
|
|
||||||
|
%empty_icon() ; No boomerang
|
||||||
|
%bombos_icon() ; Blue boomerang
|
||||||
|
%bombos_icon() ; Red boomerang
|
||||||
|
|
||||||
|
%empty_icon() ; No hookshot
|
||||||
|
%bombos_icon() ; Hookshot
|
||||||
|
|
||||||
|
%empty_icon() ; No bombs
|
||||||
|
%bombos_icon() ; Bombs
|
||||||
|
|
||||||
|
%empty_icon() ; No powder
|
||||||
|
%bombos_icon() ; Mushroom
|
||||||
|
%bombos_icon() ; Powder
|
||||||
|
|
||||||
|
%empty_icon() ; No fire rod
|
||||||
|
%bombos_icon() ; Fire rod
|
||||||
|
|
||||||
|
%empty_icon() ; No ice rod
|
||||||
|
%bombos_icon() ; Ice rod
|
||||||
|
|
||||||
|
%empty_icon() ; No bombos
|
||||||
|
%bombos_icon() ; Bombos
|
||||||
|
|
||||||
|
%empty_icon() ; No ether
|
||||||
|
%bombos_icon() ; Ether
|
||||||
|
|
||||||
|
%empty_icon() ; No quake
|
||||||
|
%bombos_icon() ; Quake
|
||||||
|
|
||||||
|
%empty_icon() ; No lamp
|
||||||
|
%bombos_icon() ; Lamp
|
||||||
|
|
||||||
|
%empty_icon() ; No hammer
|
||||||
|
%bombos_icon() ; Hammer
|
||||||
|
|
||||||
|
%empty_icon() ; No flute
|
||||||
|
%bombos_icon() ; Shovel
|
||||||
|
%bombos_icon() ; Flute (inactive)
|
||||||
|
%bombos_icon() ; Flute (active)
|
||||||
|
|
||||||
|
%empty_icon() ; No net
|
||||||
|
%bombos_icon() ; Net
|
||||||
|
|
||||||
|
%empty_icon() ; No book
|
||||||
|
%bombos_icon() ; Book of Mudora
|
||||||
|
|
||||||
|
%empty_icon() ; No bottle
|
||||||
|
%bombos_icon() ; Mushroom
|
||||||
|
%bombos_icon() ; Empty bottle
|
||||||
|
%bombos_icon() ; Red potion
|
||||||
|
%bombos_icon() ; Green potion
|
||||||
|
%bombos_icon() ; Blue potion
|
||||||
|
%bombos_icon() ; Fairy
|
||||||
|
%bombos_icon() ; Bee
|
||||||
|
%bombos_icon() ; Good bee
|
||||||
|
|
||||||
|
%empty_icon() ; No somaria
|
||||||
|
%bombos_icon() ; Cane of Somaria
|
||||||
|
|
||||||
|
%empty_icon() ; No byrna
|
||||||
|
%bombos_icon() ; Cane of Byrna
|
||||||
|
|
||||||
|
%empty_icon() ; No cape
|
||||||
|
%bombos_icon() ; Cape
|
||||||
|
|
||||||
|
%empty_icon() ; No mirror
|
||||||
|
%bombos_icon() ; Map
|
||||||
|
%bombos_icon() ; Mirror
|
||||||
|
%bombos_icon() ; Triforce (displays as arrows and bombs)
|
||||||
|
|
||||||
|
%empty_icon() ; No glove
|
||||||
|
%bombos_icon() ; Power glove
|
||||||
|
%bombos_icon() ; Titan's mitt
|
||||||
|
|
||||||
|
%empty_icon() ; No boots
|
||||||
|
%bombos_icon() ; Pegasus boots
|
||||||
|
|
||||||
|
%empty_icon() ; No flippers
|
||||||
|
%bombos_icon() ; Flippers
|
||||||
|
|
||||||
|
%empty_icon() ; No pearl
|
||||||
|
%bombos_icon() ; Moon pearl
|
||||||
|
|
||||||
|
%empty_icon() ; Nothing
|
||||||
|
|
||||||
|
%empty_icon() ; No sword
|
||||||
|
%bombos_icon() ; Fighter sword
|
||||||
|
%bombos_icon() ; Master sword
|
||||||
|
%bombos_icon() ; Tempered sword
|
||||||
|
%bombos_icon() ; Gold sword
|
||||||
|
|
||||||
|
%empty_icon() ; No shield
|
||||||
|
%bombos_icon() ; Fighter shield
|
||||||
|
%bombos_icon() ; Fire shield
|
||||||
|
%bombos_icon() ; Mirror shield
|
||||||
|
|
||||||
|
%bombos_icon() ; Green mail
|
||||||
|
%bombos_icon() ; Blue mail
|
||||||
|
%bombos_icon() ; Red mail
|
||||||
|
|
||||||
|
%empty_icon() ; No compass
|
||||||
|
%bombos_icon() ; Compass
|
||||||
|
|
||||||
|
%empty_icon() ; No big key
|
||||||
|
%bombos_icon() ; Big key
|
||||||
|
%bombos_icon() ; Big key and chest
|
||||||
|
|
||||||
|
%empty_icon() ; No map
|
||||||
|
%bombos_icon() ; Map
|
||||||
|
|
||||||
|
%empty_icon() ; No red pendant
|
||||||
|
%bombos_icon() ; Red pendant
|
||||||
|
|
||||||
|
%empty_icon() ; No blue pendant
|
||||||
|
%bombos_icon() ; Blue pendant
|
||||||
|
|
||||||
|
%empty_icon() ; No green pendant
|
||||||
|
%bombos_icon() ; Green pendant
|
||||||
|
|
||||||
|
%empty_icon() ; No white glove?
|
||||||
|
%bombos_icon() ; White glove?
|
||||||
|
|
||||||
|
%empty_icon() ; 0 heart pieces
|
||||||
|
dw $287D, $20F5, $20F5, $20F5 ; 1 heart piece
|
||||||
|
dw $287D, $20F5, $E87E, $20F5 ; 2 heart pieces
|
||||||
|
dw $287D, $287E, $E87E, $20F5 ; 3 heart pieces
|
||||||
|
; =============================================================================
|
||||||
|
|
||||||
|
; ===================== Replace menu pendants with bombos =====================
|
||||||
|
org DrawPendantCrystalDiagram_row0
|
||||||
|
dw $28FB, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $68FB
|
||||||
|
dw $28FC, $24F5, $24F5, $24F5, $307D, $307E, $24F5, $24F5, $24F5, $68FC
|
||||||
|
dw $28FC, $24F5, $24F5, $24F5, $F07E, $F07D, $24F5, $24F5, $24F5, $68FC
|
||||||
|
dw $28FC, $24F5, $307D, $307E, $24F5, $24F5, $307D, $307E, $24F5, $68FC
|
||||||
|
dw $28FC, $24F5, $F07E, $F07D, $24F5, $24F5, $F07E, $F07D, $24F5, $68FC
|
||||||
|
dw $28FC, $24F5, $24F5, $24F5, $307D, $307E, $24F5, $24F5, $24F5, $68FC
|
||||||
|
dw $28FC, $24F5, $307D, $307E, $307D, $307E, $307D, $307E, $24F5, $68FC
|
||||||
|
dw $28FC, $24F5, $F07E, $F07D, $F07E, $F07D, $F07E, $F07D, $24F5, $68FC
|
||||||
|
dw $A8FB, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $E8FB
|
||||||
|
; =============================================================================
|
||||||
|
|
||||||
|
; ===================== Replace menu pendants with bombos =====================
|
||||||
|
org $308022
|
||||||
|
db $00
|
||||||
|
; =============================================================================
|
||||||
129
bookofmudora.asm
129
bookofmudora.asm
@@ -2,24 +2,21 @@
|
|||||||
; Randomize Book of Mudora
|
; Randomize Book of Mudora
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
LoadLibraryItemGFX:
|
LoadLibraryItemGFX:
|
||||||
LDA.l LibraryItem_Player : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
%GetPossiblyEncryptedItem(LibraryItem, SpriteItemValues)
|
||||||
%GetPossiblyEncryptedItem(LibraryItem, SpriteItemValues)
|
STA $0E80, X ; Store item type
|
||||||
JSL AttemptItemSubstitution
|
JSL.l PrepDynamicTile
|
||||||
JSL ResolveLootIDLong
|
|
||||||
STA.w SpriteID, X
|
|
||||||
JSL PrepDynamicTile_loot_resolved
|
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DrawLibraryItemGFX:
|
DrawLibraryItemGFX:
|
||||||
PHA
|
PHA
|
||||||
LDA.w SpriteID, X
|
LDA $0E80, X ; Retrieve stored item type
|
||||||
JSL DrawDynamicTile
|
JSL.l DrawDynamicTile
|
||||||
PLA
|
PLA
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
SetLibraryItem:
|
SetLibraryItem:
|
||||||
LDY.w SpriteID, X
|
LDY $0E80, X ; Retrieve stored item type
|
||||||
JSL ItemSet_Library ; contains thing we wrote over
|
JSL.l ItemSet_Library ; contains thing we wrote over
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -27,90 +24,54 @@ RTL
|
|||||||
;================================================================================
|
;================================================================================
|
||||||
; Randomize Bonk Keys
|
; Randomize Bonk Keys
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
!REDRAW = "$7F5000"
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
LoadBonkItemGFX:
|
LoadBonkItemGFX:
|
||||||
LDA.b #$08 : STA.w SpriteOAMProp, X ; thing we wrote over
|
LDA.b #$08 : STA $0F50, X ; thing we wrote over
|
||||||
LoadBonkItemGFX_inner:
|
LoadBonkItemGFX_inner:
|
||||||
LDA.b #$00 : STA.l RedrawFlag
|
LDA.b #$00 : STA !REDRAW
|
||||||
JSR LoadBonkItem_Player : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
JSR LoadBonkItem
|
||||||
JSR LoadBonkItem
|
JSL.l PrepDynamicTile
|
||||||
JSL AttemptItemSubstitution
|
|
||||||
JSL ResolveLootIDLong
|
|
||||||
STA.w $0E80, X
|
|
||||||
STA.w SpriteID, X
|
|
||||||
JSL PrepDynamicTile
|
|
||||||
PHA : PHX
|
|
||||||
LDA.w SpriteID,X : TAX
|
|
||||||
LDA.l SpriteProperties_standing_width,X : BNE +
|
|
||||||
LDA.b #$00 : STA.l SpriteOAM : STA.l SpriteOAM+8
|
|
||||||
+
|
|
||||||
PLX : PLA
|
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DrawBonkItemGFX:
|
DrawBonkItemGFX:
|
||||||
PHA
|
PHA
|
||||||
LDA.l RedrawFlag : BEQ .skipInit
|
LDA !REDRAW : BEQ .skipInit ; skip init if already ready
|
||||||
JSL LoadBonkItemGFX_inner
|
JSL.l LoadBonkItemGFX_inner
|
||||||
BRA .done ; don't draw on the init frame
|
BRA .done ; don't draw on the init frame
|
||||||
|
|
||||||
.skipInit
|
.skipInit
|
||||||
LDA.w SpriteID,X
|
|
||||||
JSL DrawDynamicTileNoShadow
|
|
||||||
|
|
||||||
.done
|
JSR LoadBonkItem
|
||||||
PLA
|
JSL.l DrawDynamicTileNoShadow
|
||||||
|
|
||||||
|
.done
|
||||||
|
PLA
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
GiveBonkItem:
|
GiveBonkItem:
|
||||||
JSR LoadBonkItem_Player : STA.l !MULTIWORLD_ITEM_PLAYER_ID
|
JSR LoadBonkItem
|
||||||
JSR LoadBonkItem
|
CMP #$24 : BNE .notKey
|
||||||
JSR AbsorbKeyCheck : BCC .notKey
|
.key
|
||||||
PHY : LDY.b #$24 : JSL AddInventory : PLY ; do inventory processing for a small key
|
PHY : LDY.b #$24 : JSL.l AddInventory : PLY ; do inventory processing for a small key
|
||||||
LDA.l CurrentSmallKeys : INC A : STA.l CurrentSmallKeys
|
LDA CurrentSmallKeys : INC A : STA CurrentSmallKeys
|
||||||
LDA.b #$2F : JSL Sound_SetSfx3PanLong
|
LDA.b #$2F : JSL.l Sound_SetSfx3PanLong
|
||||||
LDA.b #$01 : STA.l UpdateHUDFlag
|
JSL CountBonkItem
|
||||||
RTL
|
RTL
|
||||||
.notKey
|
.notKey
|
||||||
PHY : TAY : JSL Link_ReceiveItem : PLY
|
PHY : TAY : JSL.l Link_ReceiveItem : PLY
|
||||||
|
JSL CountBonkItem
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
LoadBonkItem:
|
LoadBonkItem:
|
||||||
LDA.b RoomIndex ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte
|
LDA $A0 ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte
|
||||||
CMP.b #$73 : BNE + ; Desert Bonk Key
|
CMP #115 : BNE + ; Desert Bonk Key
|
||||||
LDA.l BonkKey_Desert
|
LDA.l BonkKey_Desert
|
||||||
BRA ++
|
BRA ++
|
||||||
+ : CMP.b #$8C : BNE + ; GTower Bonk Key
|
+ : CMP #140 : BNE + ; GTower Bonk Key
|
||||||
LDA.l BonkKey_GTower
|
LDA.l BonkKey_GTower
|
||||||
BRA ++
|
BRA ++
|
||||||
+
|
+
|
||||||
LDA.b #$24 ; default to small key
|
LDA.b #$24 ; default to small key
|
||||||
++
|
++
|
||||||
RTS
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
LoadBonkItem_Player:
|
|
||||||
LDA.b RoomIndex ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte
|
|
||||||
CMP.b #$73 : BNE + ; Desert Bonk Key
|
|
||||||
LDA.l BonkKey_Desert_Player
|
|
||||||
BRA ++
|
|
||||||
+ : CMP.b #$8C : BNE + ; GTower Bonk Key
|
|
||||||
LDA.l BonkKey_GTower_Player
|
|
||||||
BRA ++
|
|
||||||
+
|
|
||||||
LDA.b #$00
|
|
||||||
++
|
|
||||||
RTS
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
AbsorbKeyCheck:
|
|
||||||
PHA
|
|
||||||
CMP.b #$24 : BEQ .key
|
|
||||||
CMP.b #$A0 : BCC .not_key
|
|
||||||
CMP.b #$B0 : BCS .not_key
|
|
||||||
AND.b #$0F : ASL
|
|
||||||
CMP.w DungeonID : BNE .not_key
|
|
||||||
.key
|
|
||||||
PLA
|
|
||||||
SEC
|
|
||||||
RTS
|
|
||||||
.not_key
|
|
||||||
PLA
|
|
||||||
CLC
|
|
||||||
RTS
|
RTS
|
||||||
|
|||||||
64
boots.asm
64
boots.asm
@@ -3,74 +3,74 @@
|
|||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
ModifyBoots:
|
ModifyBoots:
|
||||||
PHA
|
PHA
|
||||||
LDA.l BootsModifier : CMP.b #$01 : BNE +
|
LDA BootsModifier : CMP.b #$01 : BNE +
|
||||||
PLA : AND.l AbilityFlags : ORA.b #$04 : RTL ; yes boots
|
PLA : AND AbilityFlags : ORA.b #$04 : RTL ; yes boots
|
||||||
+ : CMP.b #$02 : BNE +
|
+ : CMP.b #$02 : BNE +
|
||||||
PLA : AND.l AbilityFlags : AND.b #$FB : RTL ; no boots
|
PLA : AND AbilityFlags : AND.b #$FB : RTL ; no boots
|
||||||
+ : LDA.l FakeBoots : CMP.b #$01 : BNE +
|
+ : LDA FakeBoots : CMP.b #$01 : BNE +
|
||||||
LDA.b LinkSlipping : BEQ ++ : LDA.b PitTileActField : BNE + ; hover check
|
LDA $5B : BEQ ++ : LDA $59 : BNE + ; hover check
|
||||||
++ : PLA : AND.l AbilityFlags : ORA.b #$04 : RTL ; yes boots, not hovering
|
++ : PLA : AND AbilityFlags : ORA.b #$04 : RTL ; yes boots, not hovering
|
||||||
+
|
+
|
||||||
PLA
|
PLA
|
||||||
AND.l AbilityFlags ; regular boots
|
AND AbilityFlags ; regular boots
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
AddBonkTremors:
|
AddBonkTremors:
|
||||||
PHA
|
PHA
|
||||||
LDA.b LinkIncapacitatedTimer : BNE + ; Check for incapacitated Link
|
LDA $46 : BNE + ; Check for incapacitated Link
|
||||||
JSL IncrementBonkCounter
|
JSL.l IncrementBonkCounter
|
||||||
+
|
+
|
||||||
LDA.l BootsModifier : CMP.b #$01 : BEQ +
|
LDA BootsModifier : CMP.b #$01 : BEQ +
|
||||||
LDA.l BootsEquipment : BNE + ; Check for Boots
|
LDA BootsEquipment : BNE + ; Check for Boots
|
||||||
PLA : RTL
|
PLA : RTL
|
||||||
+
|
+
|
||||||
PLA
|
PLA
|
||||||
JSL AddDashTremor : JSL Player_ApplyRumbleToSprites ; things we wrote over
|
JSL.l AddDashTremor : JSL.l Player_ApplyRumbleToSprites ; things we wrote over
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
BonkBreakableWall:
|
BonkBreakableWall:
|
||||||
PHX : PHP
|
PHX : PHP
|
||||||
SEP #$30 ; set 8-bit accumulator and index registers
|
SEP #$30 ; set 8-bit accumulator and index registers
|
||||||
LDA.l BootsModifier : CMP.b #$01 : BEQ +
|
LDA BootsModifier : CMP.b #$01 : BEQ +
|
||||||
LDA.l BootsEquipment : BNE + ; Check for Boots
|
LDA BootsEquipment : BNE + ; Check for Boots
|
||||||
PLP : PLX : LDA.w #$0000 : RTL
|
PLP : PLX : LDA.w #$0000 : RTL
|
||||||
+
|
+
|
||||||
PLP : PLX
|
PLP : PLX
|
||||||
LDA.w LinkDashing : AND.w #$00FF ; things we wrote over
|
LDA $0372 : AND.w #$00FF ; things we wrote over
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
BonkRockPile:
|
BonkRockPile:
|
||||||
LDA.l BootsModifier : CMP.b #$01 : BEQ +
|
LDA BootsModifier : CMP.b #$01 : BEQ +
|
||||||
LDA.l BootsEquipment : BNE + ; Check for Boots
|
LDA BootsEquipment : BNE + ; Check for Boots
|
||||||
LDA.b #$00 : RTL
|
LDA.b #$00 : RTL
|
||||||
+
|
+
|
||||||
LDA.w TileActBE : AND.b #$70 ; things we wrote over
|
LDA $02EF : AND.b #$70 ; things we wrote over
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
GravestoneHook:
|
GravestoneHook:
|
||||||
LDA.l BootsModifier : CMP.b #$01 : BEQ +
|
LDA BootsModifier : CMP.b #$01 : BEQ +
|
||||||
LDA.l BootsEquipment : BEQ .done ; Check for Boots
|
LDA BootsEquipment : BEQ .done ; Check for Boots
|
||||||
+
|
+
|
||||||
LDA.w LinkDashing : BEQ .done ; things we wrote over
|
LDA $0372 : BEQ .done ; things we wrote over
|
||||||
JML moveGravestone
|
JML.l moveGravestone
|
||||||
.done
|
.done
|
||||||
JML GravestoneHook_continue
|
JML.l GravestoneHook_continue
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
JumpDownLedge:
|
JumpDownLedge:
|
||||||
LDA.l BootsModifier : CMP.b #$01 : BEQ +
|
LDA BootsModifier : CMP.b #$01 : BEQ +
|
||||||
LDA.l BootsEquipment : BNE + ; Check for Boots
|
LDA BootsEquipment : BNE + ; Check for Boots
|
||||||
; Disarm Waterwalk
|
; Disarm Waterwalk
|
||||||
LDA.b LinkSlipping : CMP.b #$01 : BNE +
|
LDA $5B : CMP.b #$01 : BNE +
|
||||||
STZ.b LinkSlipping
|
STZ $5B
|
||||||
+
|
+
|
||||||
LDA.b IndoorsFlag : BNE .done : LDA.b #$02 : STA.b LinkLayer ; things we wrote over
|
LDA $1B : BNE .done : LDA.b #$02 : STA $EE ; things we wrote over
|
||||||
.done
|
.done
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
BonkRecoil:
|
BonkRecoil:
|
||||||
LDA.l BootsModifier : CMP.b #$01 : BEQ +
|
LDA BootsModifier : CMP.b #$01 : BEQ +
|
||||||
LDA.l BootsEquipment : BNE + ; Check for Boots
|
LDA BootsEquipment : BNE + ; Check for Boots
|
||||||
LDA.b #$16 : STA.b LinkRecoilZ : RTL
|
LDA.b #$16 : STA $29 : RTL
|
||||||
+
|
+
|
||||||
LDA.b #$24 : STA.b LinkRecoilZ ; things we wrote over
|
LDA.b #$24 : STA $29 ; things we wrote over
|
||||||
RTL
|
RTL
|
||||||
|
|||||||
148
bugfixes.asm
148
bugfixes.asm
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
AssignKiki:
|
AssignKiki:
|
||||||
LDA.b #$00 : STA.l FollowerDropped ; defuse bomb
|
LDA.b #$00 : STA FollowerDropped ; defuse bomb
|
||||||
LDA.b #$0A : STA.l FollowerIndicator ; assign kiki as follower
|
LDA.b #$0A : STA FollowerIndicator ; assign kiki as follower
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -11,9 +11,10 @@ RTL
|
|||||||
; Name: AllowSQ
|
; Name: AllowSQ
|
||||||
; Returns: Accumulator = 0 if S&Q is disallowed, 1 if allowed
|
; Returns: Accumulator = 0 if S&Q is disallowed, 1 if allowed
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
!ITEM_BUSY = "$7F5091"
|
||||||
AllowSQ:
|
AllowSQ:
|
||||||
LDA.l ProgressIndicator : BEQ .done ; thing we overwrote - check if link is in his bed
|
LDA ProgressIndicator : BEQ .done ; thing we overwrote - check if link is in his bed
|
||||||
LDA.l BusyItem : EOR.b #$01
|
LDA !ITEM_BUSY : EOR #$01
|
||||||
.done
|
.done
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
@@ -22,8 +23,8 @@ RTL
|
|||||||
;0 = Reset Music
|
;0 = Reset Music
|
||||||
;1 = Don't Reset Music
|
;1 = Don't Reset Music
|
||||||
MSMusicReset:
|
MSMusicReset:
|
||||||
LDA.b OverworldIndex : CMP.b #$80 : BNE +
|
LDA $8A : CMP.b #$80 : BNE +
|
||||||
LDA.b LinkPosX+1
|
LDA $23
|
||||||
+
|
+
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
@@ -31,11 +32,11 @@ RTL
|
|||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
;0 = Become (Perma)bunny
|
;0 = Become (Perma)bunny
|
||||||
DecideIfBunny:
|
DecideIfBunny:
|
||||||
LDA.l MoonPearlEquipment : BNE .done
|
LDA MoonPearlEquipment : BNE .done
|
||||||
LDA.l CurrentWorld : AND.b #$40
|
LDA CurrentWorld : AND.b #$40
|
||||||
PHA : LDA.l InvertedMode : BNE .inverted
|
PHA : LDA.l InvertedMode : BNE .inverted
|
||||||
.normal
|
.normal
|
||||||
PLA : EOR.b #$40
|
PLA : EOR #$40
|
||||||
BRA .done
|
BRA .done
|
||||||
.inverted
|
.inverted
|
||||||
PLA
|
PLA
|
||||||
@@ -46,25 +47,34 @@ RTL
|
|||||||
DecideIfBunnyByScreenIndex:
|
DecideIfBunnyByScreenIndex:
|
||||||
; If indoors we don't have a screen index. Return non-bunny to make mirror-based
|
; If indoors we don't have a screen index. Return non-bunny to make mirror-based
|
||||||
; superbunny work
|
; superbunny work
|
||||||
LDA.b IndoorsFlag : BNE .done
|
LDA $1B : BNE .done
|
||||||
LDA.l MoonPearlEquipment : BNE .done
|
LDA MoonPearlEquipment : BNE .done
|
||||||
LDA.b OverworldIndex : AND.b #$40 : PHA
|
LDA $8A : AND.b #$40 : PHA
|
||||||
LDA.l InvertedMode : BNE .inverted
|
LDA.l InvertedMode : BNE .inverted
|
||||||
.normal
|
.normal
|
||||||
PLA : EOR.b #$40
|
PLA : EOR #$40
|
||||||
BRA .done
|
BRA .done
|
||||||
.inverted
|
.inverted
|
||||||
PLA
|
PLA
|
||||||
.done
|
.done
|
||||||
RTL
|
RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
;ReadInventoryPond:
|
||||||
|
; CPX.b #$1B : BNE + : LDA.b #$01 : RTL : +
|
||||||
|
; LDA EquipmentWRAM, X
|
||||||
|
;RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
FixBunnyOnExitToLightWorld:
|
FixBunnyOnExitToLightWorld:
|
||||||
LDA.w BunnyFlag : BEQ +
|
LDA.w $02E0 : BEQ +
|
||||||
JSL DecideIfBunny : BEQ +
|
JSL.l DecideIfBunny : BEQ +
|
||||||
STZ.b LinkState ; set player mode to Normal
|
STZ $5D ; set player mode to Normal
|
||||||
STZ.w BunnyFlag : STZ.b BunnyFlagDP ; return player graphics to normal
|
STZ $02E0 : STZ $56 ; return player graphics to normal
|
||||||
+
|
+
|
||||||
RTL
|
RTS
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
@@ -73,17 +83,17 @@ RTL
|
|||||||
FixAga2Bunny:
|
FixAga2Bunny:
|
||||||
LDA.l FixFakeWorld : BEQ + ; Only use this fix is fakeworld fix is in use
|
LDA.l FixFakeWorld : BEQ + ; Only use this fix is fakeworld fix is in use
|
||||||
LDA.l InvertedMode : BEQ +++
|
LDA.l InvertedMode : BEQ +++
|
||||||
LDA.b #$00 : STA.l CurrentWorld ; Switch to light world
|
LDA.b #$00 : STA CurrentWorld ; Switch to light world
|
||||||
BRA ++
|
BRA ++
|
||||||
+++
|
+++
|
||||||
LDA.b #$40 : STA.l CurrentWorld ; Switch to dark world
|
LDA.b #$40 : STA CurrentWorld ; Switch to dark world
|
||||||
++
|
++
|
||||||
JSL DecideIfBunny : BNE +
|
JSL DecideIfBunny : BNE +
|
||||||
JSR MakeBunny
|
JSR MakeBunny
|
||||||
LDA.b #$04 : STA.w MusicControlRequest ; play bunny music
|
LDA.b #$04 : STA.w $012C ; play bunny music
|
||||||
BRA .done
|
BRA .done
|
||||||
+
|
+
|
||||||
LDA.b #$09 : STA.w MusicControlRequest ; what we wrote over
|
LDA.b #$09 : STA.w $012C ; what we wrote over
|
||||||
.done
|
.done
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
@@ -91,8 +101,8 @@ RTL
|
|||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
MakeBunny:
|
MakeBunny:
|
||||||
PHX : PHY
|
PHX : PHY
|
||||||
LDA.b #$17 : STA.b LinkState ; set player mode to permabunny
|
LDA.b #$17 : STA $5D ; set player mode to permabunny
|
||||||
LDA.b #$01 : STA.w BunnyFlag : STA.b BunnyFlagDP ; make player look like bunny
|
LDA.b #$01 : STA $02E0 : STA $56 ; make player look like bunny
|
||||||
JSL LoadGearPalettes_bunny
|
JSL LoadGearPalettes_bunny
|
||||||
PLY : PLX
|
PLY : PLX
|
||||||
RTS
|
RTS
|
||||||
@@ -113,34 +123,34 @@ FixFrogSmith:
|
|||||||
STA.l FollowerIndicator
|
STA.l FollowerIndicator
|
||||||
JSL Tagalong_LoadGfx
|
JSL Tagalong_LoadGfx
|
||||||
.done
|
.done
|
||||||
RTL
|
RTS
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
; Fix for SQ jumping causing accidental Exploration Glitch
|
; Fix for SQ jumping causing accidental Exploration Glitch
|
||||||
SQEGFix:
|
SQEGFix:
|
||||||
LDA.l Bugfix_PodEG : BEQ ++
|
LDA.l Bugfix_PodEG : BEQ ++
|
||||||
STZ.w LayerAdjustment ; disarm exploration glitch
|
STZ.w $047A ; disarm exploration glitch
|
||||||
++ RTL
|
++ RTL
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
; Fix crystal not spawning when using somaria vs boss
|
; Fix crystal not spawning when using somaria vs boss
|
||||||
TryToSpawnCrystalUntilSuccess:
|
TryToSpawnCrystalUntilSuccess:
|
||||||
STX.w ItemReceiptID ; what we overwrote
|
STX $02D8 ; what we overwrote
|
||||||
JSL AddAncillaLong : BCS .failed ; a clear carry flag indicates success
|
JSL AddAncillaLong : BCS .failed ; a clear carry flag indicates success
|
||||||
.spawned
|
.spawned
|
||||||
STZ.b RoomTag ; the "trying to spawn crystal" flag
|
STZ $AE ; the "trying to spawn crystal" flag
|
||||||
STZ.b RoomTag+1 ; the "trying to spawn pendant" flag
|
STZ $AF ; the "trying to spawn pendant" flag
|
||||||
.failed
|
.failed
|
||||||
RTL
|
RTL
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
; Fix crystal not spawning when using somaria vs boss
|
; Fix crystal not spawning when using somaria vs boss
|
||||||
WallmasterCameraFix:
|
WallmasterCameraFix:
|
||||||
STZ.b CameraBoundV ; disable vertical camera scrolling for current room
|
STZ $A7 ; disable vertical camera scrolling for current room
|
||||||
REP #$20
|
REP #$20
|
||||||
STZ.w CameraScrollN ; something about scrolling, setting these to 0 tricks the game
|
STZ $0618 ; something about scrolling, setting these to 0 tricks the game
|
||||||
STZ.w CameraScrollS ; into thinking we're at the edge of the room so it doesn't scroll.
|
STZ $061A ; into thinking we're at the edge of the room so it doesn't scroll.
|
||||||
SEP #$20
|
SEP #$20
|
||||||
JML Sound_SetSfx3PanLong ; what we wrote over, also this will RTL
|
JML Sound_SetSfx3PanLong ; what we wrote over, also this will RTL
|
||||||
|
|
||||||
@@ -148,8 +158,8 @@ WallmasterCameraFix:
|
|||||||
; Fix losing glove colors
|
; Fix losing glove colors
|
||||||
LoadActualGearPalettesWithGloves:
|
LoadActualGearPalettesWithGloves:
|
||||||
REP #$20
|
REP #$20
|
||||||
LDA.l SwordEquipment : STA.b Scrap0C
|
LDA SwordEquipment : STA $0C
|
||||||
LDA.l ArmorEquipment : AND.w #$00FF
|
LDA ArmorEquipment : AND.w #$00FF
|
||||||
JSL LoadGearPalettes_variable
|
JSL LoadGearPalettes_variable
|
||||||
JSL SpriteSwap_Palette_ArmorAndGloves_part_two
|
JSL SpriteSwap_Palette_ArmorAndGloves_part_two
|
||||||
RTL
|
RTL
|
||||||
@@ -157,24 +167,24 @@ RTL
|
|||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
; Fix Bunny Palette Map Bug
|
; Fix Bunny Palette Map Bug
|
||||||
LoadGearPalette_safe_for_bunny:
|
LoadGearPalette_safe_for_bunny:
|
||||||
LDA.b GameMode
|
LDA $10
|
||||||
CMP.w #$030E : BEQ .new ; opening dungeon map
|
CMP.w #$030E : BEQ .new ; opening dungeon map
|
||||||
CMP.w #$070E : BEQ .new ; opening overworld map
|
CMP.w #$070E : BEQ .new ; opening overworld map
|
||||||
.original
|
.original
|
||||||
-
|
-
|
||||||
LDA.b [Scrap00]
|
LDA [$00]
|
||||||
STA.l PaletteBufferAux, X
|
STA $7EC300, X
|
||||||
STA.l PaletteBuffer, X
|
STA $7EC500, X
|
||||||
INC.b Scrap00 : INC.b Scrap00
|
INC $00 : INC $00
|
||||||
INX #2
|
INX #2
|
||||||
DEY
|
DEY
|
||||||
BPL -
|
BPL -
|
||||||
RTL
|
RTL
|
||||||
.new
|
.new
|
||||||
-
|
-
|
||||||
LDA.b [Scrap00]
|
LDA [$00]
|
||||||
STA.l PaletteBuffer, X
|
STA $7EC500, X
|
||||||
INC.b Scrap00 : INC.b Scrap00
|
INC $00 : INC $00
|
||||||
INX #2
|
INX #2
|
||||||
DEY
|
DEY
|
||||||
BPL -
|
BPL -
|
||||||
@@ -183,16 +193,16 @@ RTL
|
|||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
; Fix pedestal pull overlay
|
; Fix pedestal pull overlay
|
||||||
PedestalPullOverlayFix:
|
PedestalPullOverlayFix:
|
||||||
LDA.b #$09 : STA.w AncillaGeneralF, X ; the thing we wrote over
|
LDA.b #$09 : STA $039F, X ; the thing we wrote over
|
||||||
LDA.b IndoorsFlag : BNE +
|
LDA $1B : BNE +
|
||||||
LDA.b OverworldIndex : CMP.b #$80 : BNE +
|
LDA $8A : CMP.b #$80 : BNE +
|
||||||
LDA.b OverlayID : CMP.b #$97
|
LDA $8C : CMP.b #$97
|
||||||
+
|
+
|
||||||
RTL
|
RTL
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
FixJingleGlitch:
|
FixJingleGlitch:
|
||||||
LDA.b GameSubMode
|
LDA.b $11
|
||||||
BEQ .set_doors
|
BEQ .set_doors
|
||||||
|
|
||||||
LDA.l AllowAccidentalMajorGlitch
|
LDA.l AllowAccidentalMajorGlitch
|
||||||
@@ -200,7 +210,7 @@ FixJingleGlitch:
|
|||||||
|
|
||||||
.set_doors
|
.set_doors
|
||||||
LDA.b #$05
|
LDA.b #$05
|
||||||
STA.b GameSubMode
|
STA.b $11
|
||||||
|
|
||||||
.exit
|
.exit
|
||||||
RTL
|
RTL
|
||||||
@@ -212,43 +222,7 @@ pushpc
|
|||||||
pullpc
|
pullpc
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
SetOverworldTransitionFlags:
|
SetOverworldTransitionFlags:
|
||||||
LDA.b #$01
|
LDA #$01
|
||||||
STA.w OWTransitionFlag
|
STA $0ABF ; used by witch
|
||||||
STA.w RaceGameFlag
|
STA $021B ; used by race game
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
ParadoxCaveGfxFix:
|
|
||||||
; Always upload line unless you're moving into paradox cave (0x0FF) from above (0x0EF)
|
|
||||||
LDA.b IndoorsFlag : BEQ .uploadLine
|
|
||||||
LDX.b RoomIndex : CPX.w #$00FF : BNE .uploadLine
|
|
||||||
LDX.b PreviousRoom : CPX.w #$00EF : BNE .uploadLine
|
|
||||||
|
|
||||||
;Ignore uploading four specific lines of tiles to VRAM
|
|
||||||
LDX.w VRAMUploadAddress
|
|
||||||
; Line 1
|
|
||||||
CPX.w #$1800 : BEQ .skipMostOfLine
|
|
||||||
; Line 2
|
|
||||||
CPX.w #$1A00 : BEQ .skipMostOfLine
|
|
||||||
; Line 3
|
|
||||||
CPX.w #$1C00 : BEQ .uploadLine
|
|
||||||
; Line 4
|
|
||||||
CPX.w #$1E00 : BEQ .uploadLine
|
|
||||||
|
|
||||||
.uploadLine
|
|
||||||
LDA.b #$01 : STA.w DMAENABLE
|
|
||||||
|
|
||||||
.skipLine
|
|
||||||
RTL
|
|
||||||
|
|
||||||
.skipMostOfLine
|
|
||||||
; Set line length to 192 bytes (the first 6 8x8 tiles in the line)
|
|
||||||
LDX.w #$00C0 : STX.w DAS0L
|
|
||||||
BRA .uploadLine
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
SetItemRiseTimer:
|
|
||||||
LDA.w ItemReceiptMethod : CMP.b #$01 : BNE .not_from_chest
|
|
||||||
LDA.b #$38 : STA.w AncillaTimer, X
|
|
||||||
RTL
|
|
||||||
.not_from_chest
|
|
||||||
TYA : STA.w AncillaTimer, X ; What we wrote over
|
|
||||||
RTL
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
del ..\working.sfc
|
del ..\working.sfc
|
||||||
copy ..\alttp.sfc ..\working.sfc
|
copy ..\alttp.sfc ..\working.sfc
|
||||||
%~dp0bin\windows\asar.exe LTTP_RND_GeneralBugfixes.asm ..\working.sfc
|
xkas.exe LTTP_RND_GeneralBugfixes.asm ..\working.sfc
|
||||||
cmd /k
|
cmd /k
|
||||||
115
build.py
115
build.py
@@ -1,115 +0,0 @@
|
|||||||
import os
|
|
||||||
import sys
|
|
||||||
import hashlib
|
|
||||||
|
|
||||||
from asar import init as asar_init, close as asar_close, patch as asar_patch, geterrors as asar_errors, getprints as asar_prints, getwarnings as asar_warnings
|
|
||||||
|
|
||||||
JAP10HASH = '03a63945398191337e896e5771f77173'
|
|
||||||
|
|
||||||
try:
|
|
||||||
from yaml import CLoader as Loader
|
|
||||||
except ImportError:
|
|
||||||
from yaml import Loader
|
|
||||||
|
|
||||||
|
|
||||||
def int16_as_bytes(value):
|
|
||||||
value = value & 0xFFFF
|
|
||||||
return [value & 0xFF, (value >> 8) & 0xFF]
|
|
||||||
|
|
||||||
|
|
||||||
def int32_as_bytes(value):
|
|
||||||
value = value & 0xFFFFFFFF
|
|
||||||
return [value & 0xFF, (value >> 8) & 0xFF, (value >> 16) & 0xFF, (value >> 24) & 0xFF]
|
|
||||||
|
|
||||||
|
|
||||||
def is_bundled():
|
|
||||||
return getattr(sys, 'frozen', False)
|
|
||||||
|
|
||||||
|
|
||||||
def local_path(path):
|
|
||||||
if local_path.cached_path:
|
|
||||||
return os.path.join(local_path.cached_path, path)
|
|
||||||
|
|
||||||
elif is_bundled():
|
|
||||||
if hasattr(sys, "_MEIPASS"):
|
|
||||||
# we are running in a PyInstaller bundle
|
|
||||||
local_path.cached_path = sys._MEIPASS # pylint: disable=protected-access,no-member
|
|
||||||
else:
|
|
||||||
# cx_Freeze
|
|
||||||
local_path.cached_path = os.path.dirname(os.path.abspath(sys.argv[0]))
|
|
||||||
else:
|
|
||||||
# we are running in a normal Python environment
|
|
||||||
import __main__
|
|
||||||
local_path.cached_path = os.path.dirname(os.path.abspath(__main__.__file__))
|
|
||||||
|
|
||||||
return os.path.join(local_path.cached_path, path)
|
|
||||||
|
|
||||||
|
|
||||||
local_path.cached_path = None
|
|
||||||
|
|
||||||
|
|
||||||
def make_new_base2current(old_rom_data, new_rom_data):
|
|
||||||
from collections import OrderedDict
|
|
||||||
import json
|
|
||||||
# extend to 2 mb
|
|
||||||
old_rom_data.extend(bytearray([0x00]) * (2097152 - len(old_rom_data)))
|
|
||||||
|
|
||||||
out_data = OrderedDict()
|
|
||||||
for idx, old in enumerate(old_rom_data):
|
|
||||||
new = new_rom_data[idx]
|
|
||||||
if old != new:
|
|
||||||
out_data[idx] = [int(new)]
|
|
||||||
for offset in reversed(list(out_data.keys())):
|
|
||||||
if offset - 1 in out_data:
|
|
||||||
out_data[offset-1].extend(out_data.pop(offset))
|
|
||||||
with open('../base2current.json', 'wt') as outfile:
|
|
||||||
json.dump([{key: value} for key, value in out_data.items()], outfile, separators=(",", ":"))
|
|
||||||
|
|
||||||
basemd5 = hashlib.md5()
|
|
||||||
basemd5.update(new_rom_data)
|
|
||||||
return "New Rom Hash: " + basemd5.hexdigest()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
try:
|
|
||||||
asar_init()
|
|
||||||
print("Asar DLL initialized")
|
|
||||||
|
|
||||||
print("Opening Base rom")
|
|
||||||
with open('../alttp.sfc', 'rb') as stream:
|
|
||||||
old_rom_data = bytearray(stream.read())
|
|
||||||
|
|
||||||
if len(old_rom_data) % 0x400 == 0x200:
|
|
||||||
old_rom_data = old_rom_data[0x200:]
|
|
||||||
|
|
||||||
basemd5 = hashlib.md5()
|
|
||||||
basemd5.update(old_rom_data)
|
|
||||||
if JAP10HASH != basemd5.hexdigest():
|
|
||||||
raise Exception("Base rom is not 'Zelda no Densetsu - Kamigami no Triforce (J) (V1.0)'")
|
|
||||||
|
|
||||||
print("Patching Base Rom")
|
|
||||||
result, new_rom_data = asar_patch(os.path.abspath('LTTP_RND_GeneralBugfixes.asm'), old_rom_data)
|
|
||||||
|
|
||||||
if result:
|
|
||||||
with open('../working.sfc', 'wb') as stream:
|
|
||||||
stream.write(new_rom_data)
|
|
||||||
print("Success\n")
|
|
||||||
print(make_new_base2current(old_rom_data, new_rom_data))
|
|
||||||
prints = asar_prints()
|
|
||||||
for p in prints:
|
|
||||||
print(p)
|
|
||||||
else:
|
|
||||||
errors = asar_errors()
|
|
||||||
print("\nErrors: " + str(len(errors)))
|
|
||||||
for error in errors:
|
|
||||||
print (error)
|
|
||||||
warnings = asar_warnings()
|
|
||||||
print("\nWarnings: " + str(len(warnings)))
|
|
||||||
for w in warnings:
|
|
||||||
print(w)
|
|
||||||
|
|
||||||
asar_close()
|
|
||||||
except:
|
|
||||||
import traceback
|
|
||||||
traceback.print_exc()
|
|
||||||
|
|
||||||
9
build.sh
9
build.sh
@@ -1,8 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
rm ../alttp.sfc
|
rm ../working.sfc
|
||||||
cp ~/dev/kwyn/orig/z3.sfc ../alttp.sfc
|
cp ../alttp.sfc ../working.sfc
|
||||||
asar --symbols=wla LTTP_RND_GeneralBugfixes.asm ../alttp.sfc
|
./asar LTTP_RND_GeneralBugfixes.asm ../working.sfc
|
||||||
flips ~/dev/kwyn/orig/z3.sfc ../alttp.sfc ../base2current.bps
|
|
||||||
md5sum ../alttp.sfc | tee /dev/tty | cut -d ' ' -f 1 | xargs -I '{}' sed -i "s/RANDOMIZERBASEHASH = '.\+'/RANDOMIZERBASEHASH = '{}'/g" ~/dev/kwyn/doors/Rom.py
|
|
||||||
cp ../base2current.bps ~/dev/kwyn/doors/data
|
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
rm ../working.sfc
|
rm ../working.sfc
|
||||||
cp ../alttp.sfc ../working.sfc
|
cp ../alttp.sfc ../working.sfc
|
||||||
./bin/linux/asar -DFEATURE_PATREON_SUPPORTERS=1 LTTP_RND_GeneralBugfixes.asm ../working.sfc
|
asar LTTP_RND_GeneralBugfixes.asm ../working.sfc
|
||||||
|
|||||||
0
data/c2807_v3.gfx → c2807_v3.gfx
Normal file → Executable file
0
data/c2807_v3.gfx → c2807_v3.gfx
Normal file → Executable file
@@ -2,26 +2,36 @@
|
|||||||
; Capacity Logic
|
; Capacity Logic
|
||||||
;================================================================================
|
;================================================================================
|
||||||
IncrementBombs:
|
IncrementBombs:
|
||||||
LDA.l BombCapacity : BEQ + ; Skip if we can't have bombs
|
LDA BombCapacityUpgrades ; get bomb upgrades
|
||||||
DEC
|
!ADD.l StartingMaxBombs : BEQ + ; Skip if we can't have bombs
|
||||||
CMP.l BombsEquipment : !BLT +
|
DEC
|
||||||
LDA.l BombsEquipment
|
|
||||||
CMP.b #99 : !BGE +
|
CMP BombsEquipment
|
||||||
INC : STA.l BombsEquipment
|
|
||||||
+
|
!BLT +
|
||||||
|
LDA BombsEquipment
|
||||||
|
CMP.b #99 : !BGE +
|
||||||
|
INC : STA BombsEquipment
|
||||||
|
+
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
IncrementArrows:
|
IncrementArrows:
|
||||||
LDA.l ArrowCapacity : DEC
|
LDA ArrowCapacityUpgrades ; get arrow upgrades
|
||||||
CMP.l CurrentArrows : !BLT +
|
!ADD.l StartingMaxArrows : DEC
|
||||||
LDA.l CurrentArrows
|
|
||||||
CMP.b #99 : !BGE +
|
CMP CurrentArrows
|
||||||
INC : STA.l CurrentArrows
|
|
||||||
+
|
!BLT +
|
||||||
|
LDA CurrentArrows
|
||||||
|
CMP.b #99 : !BGE +
|
||||||
|
INC : STA CurrentArrows
|
||||||
|
+
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
CompareBombsToMax:
|
CompareBombsToMax:
|
||||||
LDA.l BombCapacity
|
LDA BombCapacityUpgrades ; get bomb upgrades
|
||||||
CMP.l BombsEquipment
|
!ADD.l StartingMaxBombs
|
||||||
|
|
||||||
|
CMP BombsEquipment
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
|||||||
34
catfish.asm
Normal file
34
catfish.asm
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
;================================================================================
|
||||||
|
; Randomize Catfish
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
!HEART_REDRAW = "$7F5000"
|
||||||
|
LoadCatfishItemGFX:
|
||||||
|
LDA.l $1DE185 ; location randomizer writes catfish item to
|
||||||
|
JML PrepDynamicTile
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
DrawThrownItem:
|
||||||
|
LDA $8A : CMP.b #$81 : BNE .catfish
|
||||||
|
|
||||||
|
.zora
|
||||||
|
LDA.b #$01 : STA !HEART_REDRAW
|
||||||
|
LDA.l $1DE1C3 ; location randomizer writes zora item to
|
||||||
|
BRA .draw
|
||||||
|
|
||||||
|
.catfish
|
||||||
|
LDA.l $1DE185 ; location randomizer writes catfish item to
|
||||||
|
|
||||||
|
.draw
|
||||||
|
JML DrawDynamicTile
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
MarkThrownItem:
|
||||||
|
JSL Link_ReceiveItem ; thing we wrote over
|
||||||
|
|
||||||
|
LDA $8A : CMP.b #$81 : BNE .catfish
|
||||||
|
|
||||||
|
.zora
|
||||||
|
JML ItemSet_ZoraKing
|
||||||
|
|
||||||
|
.catfish
|
||||||
|
JML ItemSet_Catfish
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
248
clock.asm
Normal file
248
clock.asm
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; http://problemkaputt.de/fullsnes.htm
|
||||||
|
; 2800h-2801h S-RTC Real Time Clock I/O Ports
|
||||||
|
; cartridge type change from #$02 to #$55 to enable S-RTC
|
||||||
|
; SNES Cart S-RTC (Realtime Clock) (1 game)
|
||||||
|
;
|
||||||
|
; PCB "SHVC-LJ3R-01" with 24pin "Sharp S-RTC" chip. Used only by one japanese game:
|
||||||
|
; Dai Kaiju Monogatari 2 (1996) Birthday/Hudson Soft (JP)
|
||||||
|
;
|
||||||
|
; S-RTC I/O Ports
|
||||||
|
; 002800h S-RTC Read (R)
|
||||||
|
; 002801h S-RTC Write (W)
|
||||||
|
; Both registers are 4bits wide. When writing: Upper 4bit should be zero. When reading: Upper 4bit should be masked-off (they do possibly contain garbage, eg. open-bus).
|
||||||
|
;
|
||||||
|
; S-RTC Communication
|
||||||
|
; The sequence for setting, and then reading the time is:
|
||||||
|
; Send <0Eh,04h,0Dh,0Eh,00h,Timestamp(12 digits),0Dh> to [002801h]
|
||||||
|
; If ([002800h] AND 0F)=0Fh then read <Timestamp(13 digits)>
|
||||||
|
; If ([002800h] AND 0F)=0Fh then read <Timestamp(13 digits)>
|
||||||
|
; If ([002800h] AND 0F)=0Fh then read <Timestamp(13 digits)>
|
||||||
|
; If ([002800h] AND 0F)=0Fh then read <Timestamp(13 digits)>
|
||||||
|
; etc.
|
||||||
|
; The exact meaning of the bytes is unknown. 0Eh/0Dh seems to invoke/terminate commands, 04h might be some configuration stuff (like setting 24-hour mode). 00h is apparently the set-time command. There might be further commands (such like setting interrupts, alarm, 12-hour mode, reading battery low & error flags, etc.). When reading, 0Fh seems to indicate sth like "time available".
|
||||||
|
; The 12/13-digit "SSMMHHDDMYYY(D)" Timestamps are having the following format:
|
||||||
|
; Seconds.lo (BCD, 0..9)
|
||||||
|
; Seconds.hi (BCD, 0..5)
|
||||||
|
; Minutes.lo (BCD, 0..9)
|
||||||
|
; Minutes.hi (BCD, 0..5)
|
||||||
|
; Hours.lo (BCD, 0..9)
|
||||||
|
; Hours.hi (BCD, 0..2)
|
||||||
|
; Day.lo (BCD, 0..9)
|
||||||
|
; Day.hi (BCD, 0..3)
|
||||||
|
; Month (HEX, 01h..0Ch)
|
||||||
|
; Year.lo (BCD, 0..9)
|
||||||
|
; Year.hi (BCD, 0..9)
|
||||||
|
; Century (HEX, 09h..0Ah for 19xx..20xx)
|
||||||
|
; When READING the time, there is one final extra digit (the existing software doesn't transmit that extra digit on WRITING, though maybe it's possible to do writing, too):
|
||||||
|
; Day of Week? (0..6) (unknown if RTC assigns sth like 0=Sunday or 0=Monday)
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
macro A_x10()
|
||||||
|
ASL #1 : PHA
|
||||||
|
ASL #2 : !ADD 1,s
|
||||||
|
STA 1,s : PLA
|
||||||
|
endmacro
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
macro A_x24()
|
||||||
|
ASL #3 : PHA
|
||||||
|
ASL #1 : !ADD 1,s
|
||||||
|
STA 1,s : PLA
|
||||||
|
endmacro
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
macro A_x60()
|
||||||
|
ASL #2 : PHA
|
||||||
|
ASL #4 : !SUB 1,s
|
||||||
|
STA 1,s : PLA
|
||||||
|
endmacro
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
macro Clock_ReadBCD()
|
||||||
|
LDA $002800 : PHA
|
||||||
|
LDA $002800 : %A_x10() : !ADD 1,s
|
||||||
|
STA 1,s : PLA
|
||||||
|
endmacro
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Clock_Test:
|
||||||
|
JSL.l Clock_Init
|
||||||
|
JML.l Clock_IsSupported
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Clock_Init
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
Clock_Init:
|
||||||
|
LDA.b #$0E : STA $002801
|
||||||
|
LDA.b #$04 : STA $002801
|
||||||
|
LDA.b #$0D : STA $002801
|
||||||
|
LDA.b #$0E : STA $002801
|
||||||
|
LDA.b #$00 : STA $002801
|
||||||
|
|
||||||
|
LDA.b #$00 : STA $002801
|
||||||
|
LDA.b #$00 : STA $002801
|
||||||
|
LDA.b #$00 : STA $002801
|
||||||
|
LDA.b #$00 : STA $002801
|
||||||
|
LDA.b #$00 : STA $002801
|
||||||
|
LDA.b #$00 : STA $002801
|
||||||
|
LDA.b #$01 : STA $002801
|
||||||
|
LDA.b #$00 : STA $002801
|
||||||
|
LDA.b #$01 : STA $002801
|
||||||
|
LDA.b #$00 : STA $002801
|
||||||
|
LDA.b #$00 : STA $002801
|
||||||
|
LDA.b #$0A : STA $002801
|
||||||
|
|
||||||
|
LDA.b #$0D : STA $002801
|
||||||
|
RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Clock_IsSupported
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Input: None (8-bit accumulator)
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Output:
|
||||||
|
; Carry - unset if unsupported, set if supported
|
||||||
|
; Zero - Undefined
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Side Effects:
|
||||||
|
; S-RTC is ready for reading upon exit if supported
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
Clock_IsSupported:
|
||||||
|
PHA : PHX
|
||||||
|
LDX #$00;
|
||||||
|
-
|
||||||
|
LDA $002800 : AND.b #$0F : CMP #$0F : BEQ .done ; check for clock chip ready signal
|
||||||
|
CPX.b #$0E : BCC ++ : CLC : BRA .done ; if we've read 14 bytes with no success, unset carry and exit
|
||||||
|
++ INX
|
||||||
|
BRA -
|
||||||
|
.done
|
||||||
|
PLX : PLA
|
||||||
|
RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Clock_QuickStamp
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Input: None
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Output:
|
||||||
|
; $00.b - 24-bit timestamp (low)
|
||||||
|
; $01.b - 24-bit timestamp (mid)
|
||||||
|
; $02.b - 24-bit timestamp (high)
|
||||||
|
; $03.b - zero
|
||||||
|
; Carry - Unset if error, Set if success
|
||||||
|
; Zero - Undefined
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Side Effects:
|
||||||
|
; Requires Mode-7 Matrix Registers
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
Clock_QuickStamp:
|
||||||
|
PHA : PHX : PHP
|
||||||
|
SEP #$30 ; set 8-bit accumulator and index registers
|
||||||
|
LDX #$00;
|
||||||
|
-
|
||||||
|
LDA $002800 : AND.b #$0F : CMP #$0F : BEQ .ready ; check for clock chip ready signal
|
||||||
|
CPX.b #$0E : !BLT ++ : CLC : JMP .done : ++ ; if we've read 14 bytes with no success, unset carry and exit
|
||||||
|
INX
|
||||||
|
BRA -
|
||||||
|
SEC ; indicate success
|
||||||
|
|
||||||
|
.ready
|
||||||
|
%Clock_ReadBCD() : STA $00 ; seconds
|
||||||
|
%Clock_ReadBCD() : STA $01 ; minutes
|
||||||
|
%Clock_ReadBCD() : STA $02 ; hours
|
||||||
|
%Clock_ReadBCD() : STA $03 ; days
|
||||||
|
|
||||||
|
REP $20 ; set 16-bit accumulator
|
||||||
|
LDA $01 : AND #$00FF : %A_x60() ; convert minutes to seconds
|
||||||
|
STZ $01 : !ADD $00 : STA $00 ; store running total seconds to $00
|
||||||
|
|
||||||
|
LDA $03 : AND #$00FF : %A_x24() ; convert days to hours
|
||||||
|
STZ $03 : !ADD $02 ; get total hours
|
||||||
|
%A_x60() ; get total minutes
|
||||||
|
|
||||||
|
LDY #$60
|
||||||
|
JSL.l Multiply_A16Y8
|
||||||
|
STY $02 : STZ $03
|
||||||
|
!ADD $00 : BCC + : INC $02 : +
|
||||||
|
|
||||||
|
.done
|
||||||
|
PLP : PLX : PLA
|
||||||
|
RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Multiply_A16Y8:
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Expects:
|
||||||
|
; Accumulator - 16-bit
|
||||||
|
; Index Registers - 8-bit
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Notes:
|
||||||
|
; Found a (wrong) version of this on wikibooks. This is cleaned up and fixed.
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
Multiply_A16Y8:
|
||||||
|
SEP #$20 ; set 8-bit accumulator
|
||||||
|
STY $4202
|
||||||
|
STA $4203
|
||||||
|
NOP #4
|
||||||
|
LDA $4216
|
||||||
|
LDY $4217
|
||||||
|
XBA
|
||||||
|
STA $4203
|
||||||
|
NOP #2
|
||||||
|
TYA
|
||||||
|
CLC
|
||||||
|
ADC $4216
|
||||||
|
LDY $4217
|
||||||
|
BCC .carry_bit
|
||||||
|
INY
|
||||||
|
.carry_bit:
|
||||||
|
XBA
|
||||||
|
REP #$20 ; set 16-bit accumulator
|
||||||
|
RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Clock_GetTime
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Input: None
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; Output:
|
||||||
|
; $00.b - Seconds
|
||||||
|
; $01.b - Minutes
|
||||||
|
; $02.b - Hours
|
||||||
|
; $03.b - Days
|
||||||
|
; $04.b - Months
|
||||||
|
; $05.w - Years
|
||||||
|
; Carry - Unset if error, Set if success
|
||||||
|
; Zero - Undefined
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
Clock_GetTime:
|
||||||
|
PHA : PHX : PHY : PHP
|
||||||
|
SEP #$30 ; set 8-bit accumulator and index registers
|
||||||
|
LDX #$00;
|
||||||
|
-
|
||||||
|
LDA $002800 : AND.b #$0F : CMP #$0F : BEQ .ready ; check for clock chip ready signal
|
||||||
|
CPX.b #$0E : !BLT ++ : CLC : JMP .done : ++ ; if we've read 14 bytes with no success, unset carry and exit
|
||||||
|
INX
|
||||||
|
BRA -
|
||||||
|
SEC ; indicate success
|
||||||
|
|
||||||
|
.ready
|
||||||
|
%Clock_ReadBCD() : STA $00 ; seconds
|
||||||
|
%Clock_ReadBCD() : STA $01 ; minutes
|
||||||
|
%Clock_ReadBCD() : STA $02 ; hours
|
||||||
|
%Clock_ReadBCD() : STA $03 ; days
|
||||||
|
LDA $002800 : STA $04 ; months
|
||||||
|
%Clock_ReadBCD() : STA $05 ; years
|
||||||
|
LDA $002800 : STA $06 ; century
|
||||||
|
|
||||||
|
REP $20 ; set 16-bit accumulator
|
||||||
|
STA $06 : AND #$00FF : %A_x10() : %A_x10() : !ADD #1000 ; multiply century digit by 100 and add 1000
|
||||||
|
STZ $06 : !ADD $05 : STA $05 ; add lower 2 digits of the year and store
|
||||||
|
|
||||||
|
.done
|
||||||
|
PLP : PLY : PLX : PLA
|
||||||
|
RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
56
compasses.asm
Normal file
56
compasses.asm
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; $7F5010 - Scratch Space
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
DrawDungeonCompassCounts:
|
||||||
|
LDX $1B : BNE + : RTL : + ; Skip if outdoors
|
||||||
|
|
||||||
|
; extra hard safeties for getting dungeon ID to prevent crashes
|
||||||
|
PHA
|
||||||
|
LDA.w $040C : AND.w #$00FE : TAX ; force dungeon ID to be multiple of 2
|
||||||
|
PLA
|
||||||
|
|
||||||
|
CPX.b #$1B : BCS .done ; Skip if not in a valid dungeon ID
|
||||||
|
|
||||||
|
BIT.w #$0002 : BNE ++ ; if CompassMode==2, we don't check for the compass
|
||||||
|
LDA CompassField : AND.l DungeonItemMasks, X ; Load compass values to A, mask with dungeon item masks
|
||||||
|
BEQ .done ; skip if we don't have compass
|
||||||
|
++
|
||||||
|
|
||||||
|
TXA : LSR : TAX
|
||||||
|
BNE +
|
||||||
|
INC
|
||||||
|
+
|
||||||
|
LDA.l CompassTotalsWRAM, X : AND #$00FF
|
||||||
|
SEP #$20
|
||||||
|
JSR HudHexToDec2Digit
|
||||||
|
REP #$20
|
||||||
|
PHX
|
||||||
|
LDX.b $06 : TXA : ORA #$2400 : STA $7EC79A
|
||||||
|
LDX.b $07 : TXA : ORA #$2400 : STA $7EC79C
|
||||||
|
PLX
|
||||||
|
|
||||||
|
LDA DungeonLocationsChecked, X : AND #$00FF
|
||||||
|
SEP #$20
|
||||||
|
JSR HudHexToDec2Digit
|
||||||
|
REP #$20
|
||||||
|
LDX.b $06 : TXA : ORA #$2400 : STA $7EC794 ; Draw the item count
|
||||||
|
LDX.b $07 : TXA : ORA #$2400 : STA $7EC796
|
||||||
|
|
||||||
|
LDA.w #$2830 : STA $7EC798 ; draw the slash
|
||||||
|
|
||||||
|
.done
|
||||||
|
RTL
|
||||||
|
|
||||||
|
DungeonItemMasks: ; these are dungeon correlations to $7EF364 - $7EF369 so it knows where to store compasses, etc
|
||||||
|
dw $8000, $4000, $2000, $1000, $0800, $0400, $0200, $0100
|
||||||
|
dw $0080, $0040, $0020, $0010, $0008, $0004
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
InitCompassTotalsRAM:
|
||||||
|
LDX #$00
|
||||||
|
-
|
||||||
|
LDA CompassTotalsROM, X : STA CompassTotalsWRAM, X
|
||||||
|
INX
|
||||||
|
CPX #$0F : !BLT -
|
||||||
|
RTL
|
||||||
|
|
||||||
29
compression.asm
Normal file
29
compression.asm
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
ParadoxCaveGfxFix:
|
||||||
|
; Always upload line unless you're moving into paradox cave (0x0FF) from above (0x0EF)
|
||||||
|
LDA $1B : BEQ .uploadLine
|
||||||
|
LDX $A0 : CPX #$00FF : BNE .uploadLine
|
||||||
|
LDX $A2 : CPX #$00EF : BNE .uploadLine
|
||||||
|
|
||||||
|
;Ignore uploading four specific lines of tiles to VRAM
|
||||||
|
LDX $0118
|
||||||
|
; Line 1
|
||||||
|
CPX #$1800 : BEQ .skipMostOfLine
|
||||||
|
; Line 2
|
||||||
|
CPX #$1A00 : BEQ .skipMostOfLine
|
||||||
|
; Line 3
|
||||||
|
CPX #$1C00 : BEQ .uploadLine
|
||||||
|
; Line 4
|
||||||
|
CPX #$1E00 : BEQ .uploadLine
|
||||||
|
|
||||||
|
.uploadLine
|
||||||
|
LDA.b #$01 : STA $420B
|
||||||
|
|
||||||
|
.skipLine
|
||||||
|
RTL
|
||||||
|
|
||||||
|
.skipMostOfLine
|
||||||
|
; Set line length to 192 bytes (the first 6 8x8 tiles in the line)
|
||||||
|
LDX.w #$00C0 : STX $4305
|
||||||
|
BRA .uploadLine
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
182
contrib.asm
Normal file
182
contrib.asm
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
;================================================================
|
||||||
|
; Contributor: Myramong
|
||||||
|
;================================================================
|
||||||
|
;Sprite_ShowMessageFromPlayerContact_Edit:
|
||||||
|
;{
|
||||||
|
; STZ $1CE8
|
||||||
|
; JSL.l Sprite_CheckDamageToPlayerSameLayerLong : BCC .dont_show
|
||||||
|
;
|
||||||
|
; LDA $4D : CMP.b #$02 : BEQ .dont_show
|
||||||
|
;
|
||||||
|
; JSL.l Sprite_DirectionToFacePlayerLong : TYA : EOR.b #$03
|
||||||
|
; SEC
|
||||||
|
;RTL
|
||||||
|
;.dont_show
|
||||||
|
; LDA $0DE0, X
|
||||||
|
; CLC
|
||||||
|
;RTL
|
||||||
|
;}
|
||||||
|
;================================================================
|
||||||
|
;Sprite_ShowSolicitedMessageIfPlayerFacing_Edit:
|
||||||
|
;{
|
||||||
|
; JSL.l Sprite_CheckDamageToPlayerSameLayerLong : BCC .alpha
|
||||||
|
; JSL.l Sprite_CheckIfPlayerPreoccupied : BCS .alpha
|
||||||
|
; LDA $F6 : BPL .alpha
|
||||||
|
; LDA $0F10, X : BNE .alpha
|
||||||
|
;
|
||||||
|
; LDA $4D : CMP.b #$02 : BEQ .alpha
|
||||||
|
;
|
||||||
|
; STZ $1CE8 ; set text choice to 1st option (usually yes/confirm/etc)
|
||||||
|
; JSL.l Sprite_DirectionToFacePlayerLong : PHX : TYX
|
||||||
|
;
|
||||||
|
; ; Make sure that the sprite is facing towards the player, otherwise
|
||||||
|
; ; talking can't happen. (What sprites actually use this???)
|
||||||
|
; LDA $05E1A3, X : PLX : CMP $2F : BNE .not_facing_each_other
|
||||||
|
; PHY
|
||||||
|
; LDA.b #$40 : STA $0F10, X
|
||||||
|
; PLA : EOR.b #$03
|
||||||
|
; SEC
|
||||||
|
;RTL
|
||||||
|
;.not_facing_each_other
|
||||||
|
;.alpha
|
||||||
|
; LDA $0DE0, X
|
||||||
|
; CLC
|
||||||
|
;RTL
|
||||||
|
;}
|
||||||
|
;================================================================
|
||||||
|
;OldMountainMan_TransitionFromTagalong_Edit:
|
||||||
|
;{
|
||||||
|
; PHA
|
||||||
|
;
|
||||||
|
; LDA.b #$AD : JSL Sprite_SpawnDynamically
|
||||||
|
;
|
||||||
|
; PLA : PHX : TAX
|
||||||
|
;
|
||||||
|
; LDA $1A64, X : AND.b #$03 : STA $0EB0, Y
|
||||||
|
; STA $0DE0, Y
|
||||||
|
;
|
||||||
|
; LDA $1A00, X : CLC : ADC.b #$02 : STA $0D00, Y
|
||||||
|
; LDA $1A14, X : ADC.b #$00 : STA $0D20, Y
|
||||||
|
;
|
||||||
|
; LDA $1A28, X : CLC : ADC.b #$02 : STA $0D10, Y
|
||||||
|
; LDA $1A3C, X : ADC.b #$00 : STA $0D30, Y
|
||||||
|
;
|
||||||
|
; LDA $EE : STA $0F20, Y
|
||||||
|
;
|
||||||
|
; LDA.b #$01 : STA $0BA0, Y
|
||||||
|
; STA $0E80, Y
|
||||||
|
;
|
||||||
|
; LDA.b #$01 : STA $02E4 ; OldMountainMan_FreezePlayer
|
||||||
|
; STA $037B ; ^
|
||||||
|
;
|
||||||
|
; PLX
|
||||||
|
;
|
||||||
|
; LDA.b #$00 : STA FollowerIndicator
|
||||||
|
;
|
||||||
|
; STZ $5E
|
||||||
|
;
|
||||||
|
; JML $09A6B6 ; <- 4A6B6 tagalong.asm:1194 (SEP #$30 : RTS)
|
||||||
|
;}
|
||||||
|
;================================================================
|
||||||
|
Sprite_ShowSolicitedMessageIfPlayerFacing_Alt:
|
||||||
|
{
|
||||||
|
STA $1CF0
|
||||||
|
STY $1CF1
|
||||||
|
|
||||||
|
JSL Sprite_CheckDamageToPlayerSameLayerLong : BCC .alpha
|
||||||
|
JSL Sprite_CheckIfPlayerPreoccupied : BCS .alpha
|
||||||
|
|
||||||
|
LDA $F6 : BPL .alpha
|
||||||
|
LDA $0F10, X : BNE .alpha
|
||||||
|
LDA $4D : CMP.b #$02 : BEQ .alpha
|
||||||
|
|
||||||
|
JSL Sprite_DirectionToFacePlayerLong : PHX : TYX
|
||||||
|
|
||||||
|
; Make sure that the sprite is facing towards the player, otherwise
|
||||||
|
; talking can't happen. (What sprites actually use this???)
|
||||||
|
LDA $05E1A3, X : PLX : CMP $2F : BNE .not_facing_each_other
|
||||||
|
|
||||||
|
PHY
|
||||||
|
|
||||||
|
LDA $1CF0
|
||||||
|
LDY $1CF1
|
||||||
|
|
||||||
|
; Check what room we're in so we know which npc we're talking to
|
||||||
|
LDA.b $A0 : CMP #$05 : BEQ .SahasrahlaDialogs
|
||||||
|
CMP #$1C : BEQ .BombShopGuyDialog
|
||||||
|
BRA .SayNothing
|
||||||
|
|
||||||
|
.SahasrahlaDialogs
|
||||||
|
REP #$20 : LDA.l MapReveal_Sahasrahla : ORA MapOverlay : STA MapOverlay : SEP #$20
|
||||||
|
JSL DialogSahasrahla : BRA .SayNothing
|
||||||
|
|
||||||
|
.BombShopGuyDialog
|
||||||
|
REP #$20 : LDA.l MapReveal_BombShop : ORA MapOverlay : STA MapOverlay : SEP #$20
|
||||||
|
JSL DialogBombShopGuy
|
||||||
|
|
||||||
|
.SayNothing
|
||||||
|
|
||||||
|
LDA.b #$40 : STA $0F10, X
|
||||||
|
|
||||||
|
PLA : EOR.b #$03
|
||||||
|
|
||||||
|
SEC
|
||||||
|
|
||||||
|
RTL
|
||||||
|
|
||||||
|
.not_facing_each_other
|
||||||
|
.alpha
|
||||||
|
|
||||||
|
LDA $0DE0, X
|
||||||
|
|
||||||
|
CLC
|
||||||
|
|
||||||
|
RTL
|
||||||
|
}
|
||||||
|
;================================================================
|
||||||
|
Sprite_ShowSolicitedMessageIfPlayerFacing_PreserveMessage:
|
||||||
|
{
|
||||||
|
PHY
|
||||||
|
PHA
|
||||||
|
|
||||||
|
JSL Sprite_CheckDamageToPlayerSameLayerLong : BCC .alpha
|
||||||
|
JSL Sprite_CheckIfPlayerPreoccupied : BCS .alpha
|
||||||
|
|
||||||
|
LDA $F6 : BPL .alpha
|
||||||
|
LDA $0F10, X : BNE .alpha
|
||||||
|
LDA $4D : CMP.b #$02 : BEQ .alpha
|
||||||
|
|
||||||
|
JSL Sprite_DirectionToFacePlayerLong : PHX : TYX
|
||||||
|
|
||||||
|
; Make sure that the sprite is facing towards the player, otherwise
|
||||||
|
; talking can't happen. (What sprites actually use this???)
|
||||||
|
LDA $05E1A3, X : PLX : CMP $2F : BNE .not_facing_each_other
|
||||||
|
|
||||||
|
PLA : XBA : PLA
|
||||||
|
|
||||||
|
PHY
|
||||||
|
|
||||||
|
TAY : XBA
|
||||||
|
|
||||||
|
JSL Sprite_ShowMessageUnconditional
|
||||||
|
|
||||||
|
LDA.b #$40 : STA $0F10, X
|
||||||
|
|
||||||
|
PLA : EOR.b #$03
|
||||||
|
|
||||||
|
SEC
|
||||||
|
|
||||||
|
RTL
|
||||||
|
|
||||||
|
.not_facing_each_other
|
||||||
|
.alpha
|
||||||
|
PLY
|
||||||
|
PLA
|
||||||
|
|
||||||
|
LDA $0DE0, X
|
||||||
|
|
||||||
|
CLC
|
||||||
|
|
||||||
|
RTL
|
||||||
|
}
|
||||||
|
;================================================================
|
||||||
@@ -8,72 +8,74 @@
|
|||||||
InvertDPad:
|
InvertDPad:
|
||||||
LDA.l OneMindPlayerCount : BEQ .crowd_control
|
LDA.l OneMindPlayerCount : BEQ .crowd_control
|
||||||
|
|
||||||
LDA.l OneMindId
|
LDA.l !ONEMIND_ID
|
||||||
AND.b #$03
|
AND.b #$03
|
||||||
TAX
|
TAX
|
||||||
LDA.l .onemind_controller_offset, X
|
LDA.l .onemind_controller_offset, X
|
||||||
TAX
|
TAX
|
||||||
|
|
||||||
LDA.w JOY1L,X : STA.w Scrap00
|
LDA.w $4218,X : STA.w $00
|
||||||
LDA.w JOY1H,X : STA.w Scrap01
|
LDA.w $4219,X : STA.w $01
|
||||||
|
|
||||||
LDA.b #$80 : STA.w WRIO ; reset this so latch can read it, otherwise RNG breaks
|
LDA #$80 : STA $4201 ; reset this so latch can read it, otherwise RNG breaks
|
||||||
|
|
||||||
JML InvertDPadReturn
|
JML.l InvertDPadReturn
|
||||||
|
|
||||||
.crowd_control
|
.crowd_control
|
||||||
LDA.l ControllerInverter : BNE +
|
LDA InvertDPadModifier : BNE +
|
||||||
|
|
||||||
LDA.w JOY1L : STA.b Scrap00
|
LDA $4218 : STA $00
|
||||||
LDA.w JOY1H : STA.b Scrap01
|
LDA $4219 : STA $01
|
||||||
JML InvertDPadReturn
|
JML.l InvertDPadReturn
|
||||||
|
|
||||||
+ DEC : BEQ .dpadOnly
|
+ DEC : BEQ .dpadOnly
|
||||||
DEC : BEQ .buttonsOnly
|
DEC : BEQ .buttonsOnly
|
||||||
DEC : BEQ .invertBoth
|
DEC : BEQ .invertBoth
|
||||||
.swapSides
|
.swapSides
|
||||||
REP #$20 ; set 16-bit accumulator
|
REP #$20 ; set 16-bit accumulator
|
||||||
LDA.w JOY1L
|
LDA $4218
|
||||||
BIT.w #$0840 : BEQ + : EOR.w #$0840 : + ; swap X/up
|
BIT.w #$0840 : BEQ + : EOR.w #$0840 : + ; swap X/up
|
||||||
BIT.w #$0180 : BEQ + : EOR.w #$0180 : + ; swap A/right
|
BIT.w #$0180 : BEQ + : EOR.w #$0180 : + ; swap A/right
|
||||||
BIT.w #$4200 : BEQ + : EOR.w #$4200 : + ; swap Y/left
|
BIT.w #$4200 : BEQ + : EOR.w #$4200 : + ; swap Y/left
|
||||||
BIT.w #$8400 : BEQ + : EOR.w #$8400 : + ; swap B/down
|
BIT.w #$8400 : BEQ + : EOR.w #$8400 : + ; swap B/down
|
||||||
STA.b Scrap00
|
STA $00
|
||||||
SEP #$20 ; set 8-bit accumulator
|
SEP #$20 ; set 8-bit accumulator
|
||||||
JML InvertDPadReturn
|
JML.l InvertDPadReturn
|
||||||
.invertBoth
|
.invertBoth
|
||||||
REP #$20 ; set 16-bit accumulator
|
REP #$20 ; set 16-bit accumulator
|
||||||
LDA.w JOY1L
|
LDA $4218
|
||||||
BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B
|
BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B
|
||||||
BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A
|
BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A
|
||||||
BIT.w #$0C00 : BEQ + : EOR.w #$0C00 : + ; swap up/down
|
BIT.w #$0C00 : BEQ + : EOR.w #$0C00 : + ; swap up/down
|
||||||
BIT.w #$0300 : BEQ + : EOR.w #$0300 : + ; swap left/right
|
BIT.w #$0300 : BEQ + : EOR.w #$0300 : + ; swap left/right
|
||||||
STA.b Scrap00
|
STA $00
|
||||||
SEP #$20 ; set 8-bit accumulator
|
SEP #$20 ; set 8-bit accumulator
|
||||||
JML InvertDPadReturn
|
JML.l InvertDPadReturn
|
||||||
.buttonsOnly
|
.buttonsOnly
|
||||||
REP #$20 ; set 16-bit accumulator
|
REP #$20 ; set 16-bit accumulator
|
||||||
LDA.w JOY1L
|
LDA $4218
|
||||||
BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B
|
BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B
|
||||||
BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A
|
BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A
|
||||||
STA.b Scrap00
|
STA $00
|
||||||
SEP #$20 ; set 8-bit accumulator
|
SEP #$20 ; set 8-bit accumulator
|
||||||
JML InvertDPadReturn
|
JML.l InvertDPadReturn
|
||||||
.dpadOnly
|
.dpadOnly
|
||||||
LDA.w JOY1L : STA.b Scrap00
|
LDA $4218 : STA $00
|
||||||
LDA.w JOY1H
|
LDA $4219
|
||||||
BIT.b #$0C : BEQ + : EOR.b #$0C : + ; swap up/down
|
BIT.b #$0C : BEQ + : EOR.b #$0C : + ; swap up/down
|
||||||
BIT.b #$03 : BEQ + : EOR.b #$03 : + ; swap left/right
|
BIT.b #$03 : BEQ + : EOR.b #$03 : + ; swap left/right
|
||||||
STA.b Scrap01
|
STA $01
|
||||||
JML InvertDPadReturn
|
JML.l InvertDPadReturn
|
||||||
|
|
||||||
.onemind_controller_offset
|
.onemind_controller_offset
|
||||||
db 0 ; player 0 - JOY1L - joy1d1
|
db 0 ; player 0 - $4218 - joy1d1
|
||||||
db 0 ; player 1 - JOY1L - joy1d1
|
db 0 ; player 1 - $4218 - joy1d1
|
||||||
db 2 ; player 2 - JOY2L - joy2d1
|
db 2 ; player 2 - $421A - joy2d1
|
||||||
db 6 ; player 3 - JOY4L - joy2d2
|
db 6 ; player 3 - $421E - joy2d2
|
||||||
db 2 ; player 4 - JOY2L - joy2d1
|
db 2 ; player 4 - $421A - joy2d1
|
||||||
db 6 ; player 5 - JOY4L - joy2d2
|
db 6 ; player 5 - $421E - joy2d2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -83,12 +85,12 @@ HandleOneMindController:
|
|||||||
|
|
||||||
REP #$20
|
REP #$20
|
||||||
|
|
||||||
LDA.l OneMindTimerRAM
|
LDA.l !ONEMIND_TIMER
|
||||||
DEC
|
DEC
|
||||||
BPL .no_switch
|
BPL .no_switch
|
||||||
|
|
||||||
SEP #$20
|
SEP #$20
|
||||||
LDA.l OneMindId
|
LDA.l !ONEMIND_ID
|
||||||
INC
|
INC
|
||||||
CMP.l OneMindPlayerCount
|
CMP.l OneMindPlayerCount
|
||||||
BCC .no_wrap
|
BCC .no_wrap
|
||||||
@@ -96,26 +98,29 @@ HandleOneMindController:
|
|||||||
LDA.b #$01 ; reset to player 1
|
LDA.b #$01 ; reset to player 1
|
||||||
|
|
||||||
.no_wrap
|
.no_wrap
|
||||||
STA.l OneMindId
|
STA.l !ONEMIND_ID
|
||||||
|
|
||||||
REP #$20
|
REP #$20
|
||||||
LDA.l OneMindTimerInit
|
LDA.l OneMindTimer
|
||||||
|
|
||||||
.no_switch
|
.no_switch
|
||||||
STA.l OneMindTimerRAM
|
STA.l !ONEMIND_TIMER
|
||||||
|
|
||||||
SEP #$20
|
SEP #$20
|
||||||
LDA.l OneMindId
|
LDA.l !ONEMIND_ID
|
||||||
|
|
||||||
CMP.b #$04 ; is it player 4 or 5?
|
CMP.b #$04 ; is it player 4 or 5?
|
||||||
BCC .no_multitap_switch
|
BCC .no_multitap_switch
|
||||||
|
|
||||||
STZ.w WRIO
|
STZ.w $4201
|
||||||
|
|
||||||
.no_multitap_switch
|
.no_multitap_switch
|
||||||
|
|
||||||
.no_onemind
|
.no_onemind
|
||||||
STZ.b NMIDoneFlag
|
STZ.b $12
|
||||||
|
|
||||||
|
JML $008034 ; reset frame loop
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
JML MainGameLoop ; reset frame loop
|
|
||||||
|
|
||||||
|
|||||||
42
creditscharmapbighi.txt
Normal file
42
creditscharmapbighi.txt
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
=9F
|
||||||
|
0=53
|
||||||
|
1=54
|
||||||
|
2=55
|
||||||
|
3=56
|
||||||
|
4=57
|
||||||
|
5=58
|
||||||
|
6=59
|
||||||
|
7=5A
|
||||||
|
8=5B
|
||||||
|
9=5C
|
||||||
|
A=5D
|
||||||
|
B=5E
|
||||||
|
C=5F
|
||||||
|
D=60
|
||||||
|
E=61
|
||||||
|
F=62
|
||||||
|
G=63
|
||||||
|
H=64
|
||||||
|
I=65
|
||||||
|
J=66
|
||||||
|
K=67
|
||||||
|
L=68
|
||||||
|
M=69
|
||||||
|
N=6A
|
||||||
|
O=6B
|
||||||
|
P=6C
|
||||||
|
Q=6D
|
||||||
|
R=6E
|
||||||
|
S=6F
|
||||||
|
T=70
|
||||||
|
U=71
|
||||||
|
V=72
|
||||||
|
W=73
|
||||||
|
X=74
|
||||||
|
Y=75
|
||||||
|
Z=76
|
||||||
|
'=77
|
||||||
|
.=A0
|
||||||
|
/=A2
|
||||||
|
:=A3
|
||||||
|
_=A6
|
||||||
42
creditscharmapbiglo.txt
Normal file
42
creditscharmapbiglo.txt
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
=9F
|
||||||
|
0=79
|
||||||
|
1=7A
|
||||||
|
2=7B
|
||||||
|
3=7C
|
||||||
|
4=7D
|
||||||
|
5=7E
|
||||||
|
6=7F
|
||||||
|
7=80
|
||||||
|
8=81
|
||||||
|
9=82
|
||||||
|
A=83
|
||||||
|
B=84
|
||||||
|
C=85
|
||||||
|
D=86
|
||||||
|
E=87
|
||||||
|
F=88
|
||||||
|
G=89
|
||||||
|
H=8A
|
||||||
|
I=8B
|
||||||
|
J=8C
|
||||||
|
K=8D
|
||||||
|
L=8E
|
||||||
|
M=8F
|
||||||
|
N=90
|
||||||
|
O=91
|
||||||
|
P=92
|
||||||
|
Q=93
|
||||||
|
R=94
|
||||||
|
S=95
|
||||||
|
T=96
|
||||||
|
U=97
|
||||||
|
V=98
|
||||||
|
W=99
|
||||||
|
X=9A
|
||||||
|
Y=9B
|
||||||
|
Z=9C
|
||||||
|
'=9d
|
||||||
|
.=C0
|
||||||
|
/=C2
|
||||||
|
:=C3
|
||||||
|
_=C6
|
||||||
@@ -25,4 +25,3 @@ W=4E
|
|||||||
X=4F
|
X=4F
|
||||||
Y=50
|
Y=50
|
||||||
Z=51
|
Z=51
|
||||||
.=52
|
|
||||||
@@ -25,7 +25,3 @@ W=30
|
|||||||
X=31
|
X=31
|
||||||
Y=32
|
Y=32
|
||||||
Z=33
|
Z=33
|
||||||
,=34
|
|
||||||
'=35
|
|
||||||
-=36
|
|
||||||
.=37
|
|
||||||
235
crypto.asm
235
crypto.asm
@@ -1,6 +1,21 @@
|
|||||||
; Scrap04 used for n
|
; $7F50D0 - $7F50FF - Block Cypher Parameters
|
||||||
; Scrap06 used for rounds
|
; $7F5100 - $7F51FF - Block Cypher Buffer
|
||||||
; Scrap08 use for dpScratch/MXResult (lower 32 of dpScratch)
|
!v = "$7F5100"
|
||||||
|
!n = "$04"
|
||||||
|
!MXResult = "$08" ; an alternate name for the lower 32 bits of dpScratch
|
||||||
|
!dpScratch = "$08"
|
||||||
|
!keyBase = "$7F50D0"
|
||||||
|
|
||||||
|
|
||||||
|
!y = "$7F50E0"
|
||||||
|
!z = "$7F50E4"
|
||||||
|
!sum = "$7F50E8"
|
||||||
|
|
||||||
|
!p = "$7F50EC"
|
||||||
|
!rounds = "$06"
|
||||||
|
!e = "$7F50F0"
|
||||||
|
|
||||||
|
!upperScratch = "$7F50F2"
|
||||||
|
|
||||||
CryptoDelta:
|
CryptoDelta:
|
||||||
dd #$9e3779b9
|
dd #$9e3779b9
|
||||||
@@ -20,144 +35,164 @@ macro ASL32Single(value)
|
|||||||
; ROL handles the carry from the lower byte for us
|
; ROL handles the carry from the lower byte for us
|
||||||
endmacro
|
endmacro
|
||||||
|
|
||||||
|
;macro LSR32(value,k)
|
||||||
|
; LDX.b <k>
|
||||||
|
; ?loop:
|
||||||
|
; %LSR32Single(<value>,<k>)
|
||||||
|
; DEX : CPX.b #$00 : BNE ?loop
|
||||||
|
;endmacro
|
||||||
|
|
||||||
|
;macro ASL32(value,k)
|
||||||
|
; LDX.b <k>
|
||||||
|
; ?loop:
|
||||||
|
; %LSR32Single(<value>,<k>)
|
||||||
|
; DEX : CPX.b #$00 : BNE ?loop
|
||||||
|
;endmacro
|
||||||
|
|
||||||
CryptoMX:
|
CryptoMX:
|
||||||
PHX
|
PHX
|
||||||
|
|
||||||
; upperScratch = (z>>5 ^ y <<2)
|
; upperScratch = (z>>5 ^ y <<2)
|
||||||
LDA.w z : STA.b Scrap08
|
LDA.w !z : STA.b !dpScratch
|
||||||
LDA.w z+2 : STA.b Scrap08+2
|
LDA.w !z+2 : STA.b !dpScratch+2
|
||||||
%LSR32Single(Scrap08)
|
%LSR32Single(!dpScratch)
|
||||||
%LSR32Single(Scrap08)
|
%LSR32Single(!dpScratch)
|
||||||
%LSR32Single(Scrap08)
|
%LSR32Single(!dpScratch)
|
||||||
%LSR32Single(Scrap08)
|
%LSR32Single(!dpScratch)
|
||||||
%LSR32Single(Scrap08)
|
%LSR32Single(!dpScratch)
|
||||||
;%LSR32(Scrap08,#$05)
|
;%LSR32(!dpScratch,#$05)
|
||||||
|
|
||||||
LDA.w y : STA.b Scrap08+4
|
LDA.w !y : STA.b !dpScratch+4
|
||||||
LDA.w y+2 : STA.b Scrap08+6
|
LDA.w !y+2 : STA.b !dpScratch+6
|
||||||
%ASL32Single(Scrap08+4)
|
%ASL32Single(!dpScratch+4)
|
||||||
%ASL32Single(Scrap08+4)
|
%ASL32Single(!dpScratch+4)
|
||||||
;%ASL32(Scrap08+4,#$02)
|
;%ASL32(!dpScratch+4,#$02)
|
||||||
|
|
||||||
LDA.b Scrap08 : EOR.b Scrap08+4 : STA.w CryptoScratch
|
LDA.b !dpScratch : EOR.b !dpScratch+4 : STA.w !upperScratch
|
||||||
LDA.b Scrap08+2 : EOR.b Scrap08+6 : STA.w CryptoScratch+2
|
LDA.b !dpScratch+2 : EOR.b !dpScratch+6 : STA.w !upperScratch+2
|
||||||
|
|
||||||
;================================
|
;================================
|
||||||
; upperscratch2 = (y>>3^z<<4)
|
; upperscratch2 = (y>>3^z<<4)
|
||||||
|
|
||||||
LDA.w z : STA.b Scrap08
|
LDA.w !z : STA.b !dpScratch
|
||||||
LDA.w z+2 : STA.b Scrap08+2
|
LDA.w !z+2 : STA.b !dpScratch+2
|
||||||
%ASL32Single(Scrap08)
|
%ASL32Single(!dpScratch)
|
||||||
%ASL32Single(Scrap08)
|
%ASL32Single(!dpScratch)
|
||||||
%ASL32Single(Scrap08)
|
%ASL32Single(!dpScratch)
|
||||||
%ASL32Single(Scrap08)
|
%ASL32Single(!dpScratch)
|
||||||
;%ASL32(Scrap08,#$04)
|
;%ASL32(!dpScratch,#$04)
|
||||||
|
|
||||||
LDA.w y : STA.b Scrap08+4
|
LDA.w !y : STA.b !dpScratch+4
|
||||||
LDA.w y+2 : STA.b Scrap08+6
|
LDA.w !y+2 : STA.b !dpScratch+6
|
||||||
%LSR32Single(Scrap08+4)
|
%LSR32Single(!dpScratch+4)
|
||||||
%LSR32Single(Scrap08+4)
|
%LSR32Single(!dpScratch+4)
|
||||||
%LSR32Single(Scrap08+4)
|
%LSR32Single(!dpScratch+4)
|
||||||
;%LSR32(Scrap08+4,#$03)
|
;%LSR32(!dpScratch+4,#$03)
|
||||||
|
|
||||||
LDA.b Scrap08 : EOR.b Scrap08+4 : STA.w CryptoScratch+4
|
LDA.b !dpScratch : EOR.b !dpScratch+4 : STA.w !upperScratch+4
|
||||||
LDA.b Scrap08+2 : EOR.b Scrap08+6 : STA.w CryptoScratch+6
|
LDA.b !dpScratch+2 : EOR.b !dpScratch+6 : STA.w !upperScratch+6
|
||||||
|
|
||||||
;================================
|
;================================
|
||||||
; upperscratch = upperscratch + upperscratch2 ( == (z>>5^y<<2) + (y>>3^z<<4) )
|
; upperscratch = upperscratch + upperscratch2 ( == (z>>5^y<<2) + (y>>3^z<<4) )
|
||||||
|
|
||||||
LDA.w CryptoScratch : !ADD.w CryptoScratch+4 : STA.w CryptoScratch
|
LDA.w !upperScratch : !ADD.w !upperScratch+4 : STA.w !upperScratch
|
||||||
LDA.w CryptoScratch+2 : ADC.w CryptoScratch+6 : STA.w CryptoScratch+2
|
LDA.w !upperScratch+2 : ADC.w !upperScratch+6 : STA.w !upperScratch+2
|
||||||
|
|
||||||
;================================
|
;================================
|
||||||
; dpscratch = sum^y
|
; dpscratch = sum^y
|
||||||
|
|
||||||
LDA.w Sum : EOR.w y : STA.b Scrap08
|
LDA.w !sum : EOR.w !y : STA.b !dpScratch
|
||||||
LDA.w Sum+2 : EOR.w y+2 : STA.b Scrap08+2
|
LDA.w !sum+2 : EOR.w !y+2 : STA.b !dpScratch+2
|
||||||
|
|
||||||
;================================
|
;================================
|
||||||
; dpscratch2 = (k[p&3^e]^z)
|
; dpscratch2 = (k[p&3^e]^z)
|
||||||
|
|
||||||
LDA.w p : AND.w #$0003 : EOR.w e : ASL #2 : TAX ; put (p&3)^e into X
|
LDA.w !p : AND.w #$0003 : EOR.w !e : ASL #2 : TAX ; put (p&3)^e into X
|
||||||
LDA.w KeyBase, X : EOR.w z : STA.b Scrap08+4
|
LDA.w !keyBase, X : EOR.w !z : STA.b !dpScratch+4
|
||||||
LDA.w KeyBase+2, X : EOR.w z+2 : STA.b Scrap08+6
|
LDA.w !keyBase+2, X : EOR.w !z+2 : STA.b !dpScratch+6
|
||||||
|
|
||||||
;================================
|
;================================
|
||||||
; upperscratch2 = dpscratch + dpscratch2 (== (sum^y) + (k[p&3^e]^z))
|
; upperscratch2 = dpscratch + dpscratch2 (== (sum^y) + (k[p&3^e]^z))
|
||||||
LDA.b Scrap08 : !ADD.b Scrap08+4 : STA.w CryptoScratch+4
|
LDA.b !dpScratch : !ADD.b !dpScratch+4 : STA.w !upperScratch+4
|
||||||
LDA.b Scrap08+2 : ADC.b Scrap08+6 : STA.w CryptoScratch+6
|
LDA.b !dpScratch+2 : ADC.b !dpScratch+6 : STA.w !upperScratch+6
|
||||||
|
|
||||||
;================================
|
;================================
|
||||||
; MXResult = uppserscratch ^ upperscratch2
|
; MXResult = uppserscratch ^ upperscratch2
|
||||||
|
|
||||||
LDA.w CryptoScratch : EOR.w CryptoScratch+4 : STA.b Scrap08
|
LDA.w !upperScratch : EOR.w !upperScratch+4 : STA.b !MXResult
|
||||||
LDA.w CryptoScratch+2 : EOR.w CryptoScratch+6 : STA.b Scrap08+2
|
LDA.w !upperScratch+2 : EOR.w !upperScratch+6 : STA.b !MXResult+2
|
||||||
PLX
|
PLX
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
|
;!DIVIDEND_LOW = $4204
|
||||||
|
;!DIVIDEND_HIGH = $4205
|
||||||
|
;!DIVISOR = $4206
|
||||||
|
;!QUOTIENT_LOW = $4214
|
||||||
|
;!QUOTIENT_HIGH = $4215
|
||||||
|
|
||||||
XXTEA_Decode:
|
XXTEA_Decode:
|
||||||
PHP : PHB
|
PHP : PHB
|
||||||
SEP #$30 ; set 8-bit accumulator and index
|
SEP #$30 ; set 8-bit accumulator and index
|
||||||
|
|
||||||
LDA.b #$7F : PHA : PLB
|
LDA.b #$7F : PHA : PLB
|
||||||
|
|
||||||
STZ.b Scrap04+1 ; set upper byte of n to be zero, so it can safely be accessed in 16-bit mode
|
STZ.b !n+1 ; set upper byte of n to be zero, so it can safely be accessed in 16-bit mode
|
||||||
|
|
||||||
; search for lookup table index to avoid division and multiplication
|
; search for lookup table index to avoid division and multiplication
|
||||||
LDX.b #0
|
LDX.b #0
|
||||||
-
|
-
|
||||||
LDA.l .n_lookup, X
|
LDA.l .n_lookup, X
|
||||||
CMP.b Scrap04 : !BLT +
|
CMP.b !n : !BLT +
|
||||||
INX
|
INX
|
||||||
BRA -
|
BRA -
|
||||||
+
|
+
|
||||||
; rounds = 6 + 52/n;
|
; rounds = 6 + 52/n;
|
||||||
LDA.l .round_counts, X : STA.b Scrap06 : STZ.b Scrap06+1
|
LDA.l .round_counts, X : STA.b !rounds : STZ.b !rounds+1
|
||||||
|
|
||||||
REP #$20 ; set 16-bit accumulator
|
REP #$20 ; set 16-bit accumulator
|
||||||
|
|
||||||
; sum = rounds*DELTA;
|
; sum = rounds*DELTA;
|
||||||
TXA : ASL #2 : TAX
|
TXA : ASL #2 : TAX
|
||||||
LDA.l .initial_sums, X : STA.w Sum
|
LDA.l .initial_sums, X : STA.w !sum
|
||||||
LDA.l .initial_sums+2, X : STA.w Sum+2
|
LDA.l .initial_sums+2, X : STA.w !sum+2
|
||||||
|
|
||||||
; y = v[0];
|
; y = v[0];
|
||||||
LDA.w v : STA.w y
|
LDA.w !v : STA.w !y
|
||||||
LDA.w v+2 : STA.w y+2
|
LDA.w !v+2 : STA.w !y+2
|
||||||
---
|
---
|
||||||
LDA.w Sum : LSR #2 : AND.w #$0003 : STA.w e ; e = (sum >> 2) & 3;
|
LDA.w !sum : LSR #2 : AND.w #$0003 : STA.w !e ; e = (sum >> 2) & 3;
|
||||||
|
|
||||||
LDA.b Scrap04 : DEC : STA.w p
|
LDA.b !n : DEC : STA.w !p
|
||||||
-- BEQ + ; for (p=n-1; p>0; p--) {
|
-- BEQ + ; for (p=n-1; p>0; p--) {
|
||||||
; z = v[p-1];
|
; z = v[p-1];
|
||||||
ASL #2 : TAX
|
ASL #2 : TAX
|
||||||
LDA.w v-4, X : STA.w z
|
LDA.w !v-4, X : STA.w !z
|
||||||
LDA.w v-4+2, X : STA.w z+2
|
LDA.w !v-4+2, X : STA.w !z+2
|
||||||
|
|
||||||
; y = v[p] -= MX;
|
; y = v[p] -= MX;
|
||||||
JSR CryptoMX
|
JSR CryptoMX
|
||||||
LDA.w p : ASL #2 : TAX
|
LDA.w !p : ASL #2 : TAX
|
||||||
LDA.w v, X : !SUB.b Scrap08 : STA.w v, X : STA.w y
|
LDA.w !v, X : !SUB.b !MXResult : STA.w !v, X : STA.w !y
|
||||||
LDA.w v+2, X : SBC.b Scrap08+2 : STA.w v+2, X : STA.w y+2
|
LDA.w !v+2, X : SBC.b !MXResult+2 : STA.w !v+2, X : STA.w !y+2
|
||||||
|
|
||||||
LDA.w p : DEC : STA.w p : BRA -- ; }
|
LDA.w !p : DEC : STA.w !p : BRA -- ; }
|
||||||
+
|
+
|
||||||
|
|
||||||
; z = v[n-1];
|
; z = v[n-1];
|
||||||
LDA.b Scrap04 : DEC : ASL #2 : TAX
|
LDA.b !n : DEC : ASL #2 : TAX
|
||||||
LDA.w v, X : STA.w z
|
LDA.w !v, X : STA.w !z
|
||||||
LDA.w v+2, X : STA.w z+2
|
LDA.w !v+2, X : STA.w !z+2
|
||||||
|
|
||||||
; y = v[0] -= MX;
|
; y = v[0] -= MX;
|
||||||
JSR CryptoMX
|
JSR CryptoMX
|
||||||
LDA.w v : !SUB.b Scrap08 : STA.w v : STA.w y
|
LDA.w !v : !SUB.b !MXResult : STA.w !v : STA.w !y
|
||||||
LDA.w v+2 : SBC.b Scrap08+2 : STA.w v+2 : STA.w y+2
|
LDA.w !v+2 : SBC.b !MXResult+2 : STA.w !v+2 : STA.w !y+2
|
||||||
|
|
||||||
; sum -= DELTA;
|
; sum -= DELTA;
|
||||||
LDA.w Sum : !SUB.l CryptoDelta : STA.w Sum
|
LDA.w !sum : !SUB.l CryptoDelta : STA.w !sum
|
||||||
LDA.w Sum+2 : SBC.l CryptoDelta+2 : STA.w Sum+2
|
LDA.w !sum+2 : SBC.l CryptoDelta+2 : STA.w !sum+2
|
||||||
|
|
||||||
DEC.b Scrap06 : BEQ + : JMP --- : + ; } while (--rounds);
|
DEC !rounds : BEQ + : JMP --- : + ; } while (--rounds);
|
||||||
PLB : PLP
|
PLB : PLP
|
||||||
RTL
|
RTL
|
||||||
|
|
||||||
@@ -208,3 +243,69 @@ db 32 ; n is 2
|
|||||||
;dd (23*$9e3779b9)&$ffffffff ; n is 3
|
;dd (23*$9e3779b9)&$ffffffff ; n is 3
|
||||||
dd (32*$9e3779b9)&$ffffffff ; n is 2
|
dd (32*$9e3779b9)&$ffffffff ; n is 2
|
||||||
|
|
||||||
|
;void btea(uint32_t *v, int n, uint32_t const key[4]) {
|
||||||
|
; uint32_t y, z, sum;
|
||||||
|
; unsigned p, rounds, e;
|
||||||
|
|
||||||
|
; } else if (n < -1) { /* Decoding Part */
|
||||||
|
; n = -n;
|
||||||
|
; rounds = 6 + 52/n;
|
||||||
|
; sum = rounds*DELTA;
|
||||||
|
; y = v[0];
|
||||||
|
; do {
|
||||||
|
; e = (sum >> 2) & 3;
|
||||||
|
; for (p=n-1; p>0; p--) {
|
||||||
|
; z = v[p-1];
|
||||||
|
; y = v[p] -= MX;
|
||||||
|
; }
|
||||||
|
; z = v[n-1];
|
||||||
|
; y = v[0] -= MX;
|
||||||
|
; sum -= DELTA;
|
||||||
|
; } while (--rounds);
|
||||||
|
; }
|
||||||
|
|
||||||
|
;BTEA will encode or decode n words as a single block where n > 1
|
||||||
|
;
|
||||||
|
;v is the n word data vector
|
||||||
|
;k is the 4 word key
|
||||||
|
;n is negative for decoding
|
||||||
|
;if n is zero result is 1 and no coding or decoding takes place, otherwise the result is zero
|
||||||
|
;assumes 32 bit 'long' and same endian coding and decoding
|
||||||
|
;#include <stdint.h>
|
||||||
|
;#define DELTA 0x9e3779b9
|
||||||
|
;#define MX ((((z>>5)^(y<<2)) + ((y>>3)^(z<<4))) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
|
||||||
|
;
|
||||||
|
;void btea(uint32_t *v, int n, uint32_t const key[4]) {
|
||||||
|
; uint32_t y, z, sum;
|
||||||
|
; unsigned p, rounds, e;
|
||||||
|
; if (n > 1) { /* Coding Part */
|
||||||
|
; rounds = 6 + 52/n;
|
||||||
|
; sum = 0;
|
||||||
|
; z = v[n-1];
|
||||||
|
; do {
|
||||||
|
; sum += DELTA;
|
||||||
|
; e = (sum >> 2) & 3;
|
||||||
|
; for (p=0; p<n-1; p++) {
|
||||||
|
; y = v[p+1];
|
||||||
|
; z = v[p] += MX;
|
||||||
|
; }
|
||||||
|
; y = v[0];
|
||||||
|
; z = v[n-1] += MX;
|
||||||
|
; } while (--rounds);
|
||||||
|
; } else if (n < -1) { /* Decoding Part */
|
||||||
|
; n = -n;
|
||||||
|
; rounds = 6 + 52/n;
|
||||||
|
; sum = rounds*DELTA;
|
||||||
|
; y = v[0];
|
||||||
|
; do {
|
||||||
|
; e = (sum >> 2) & 3;
|
||||||
|
; for (p=n-1; p>0; p--) {
|
||||||
|
; z = v[p-1];
|
||||||
|
; y = v[p] -= MX;
|
||||||
|
; }
|
||||||
|
; z = v[n-1];
|
||||||
|
; y = v[0] -= MX;
|
||||||
|
; sum -= DELTA;
|
||||||
|
; } while (--rounds);
|
||||||
|
; }
|
||||||
|
;}
|
||||||
|
|||||||
@@ -1,15 +1,28 @@
|
|||||||
;================================================================================
|
;================================================================================
|
||||||
!CUCCO = $0B
|
!IS_INDOORS = "$7E001B"
|
||||||
!INERT = $00
|
!ENEMY_STATE_TABLE = "$7E0DD0"
|
||||||
!INIT = $08
|
!ENEMY_TYPE_TABLE = "$7E0E20"
|
||||||
!ALIVE = $09
|
!ENEMY_AUX1_TABLE = "$7E0DA0"
|
||||||
!CUCCO_ENRAGED = $23
|
!ENEMY_AUX2_TABLE = "$7E0DB0"
|
||||||
|
!ENEMY_DIRECTION_TABLE = "$7E0EB0"
|
||||||
|
!CUCCO = "#$0B"
|
||||||
|
!INERT = "#$00"
|
||||||
|
!INIT = "#$08"
|
||||||
|
!ALIVE = "#$09"
|
||||||
|
!CUCCO_ENRAGED = "#$23"
|
||||||
|
!LINK_POS_Y_LOW = "$20"
|
||||||
|
!LINK_POS_Y_HIGH = "$21"
|
||||||
|
!LINK_POS_X_LOW = "$22"
|
||||||
|
!LINK_POS_X_HIGH = "$23"
|
||||||
|
!ENEMY_POS_Y_LOW = "$7E0D00"
|
||||||
|
!ENEMY_POS_X_LOW = "$7E0D10"
|
||||||
|
!ENEMY_POS_Y_HIGH = "$7E0D20"
|
||||||
|
!ENEMY_POS_X_HIGH = "$7E0D30"
|
||||||
CuccoStorm:
|
CuccoStorm:
|
||||||
|
|
||||||
SEP #$30 ; set 8-bit accumulator index registers
|
SEP #$30 ; set 8-bit accumulator index registers
|
||||||
LDA.l CuccoStormer : BEQ + ; only if storm is on
|
LDA.l CuccoStormModifier : BEQ + ; only if storm is on
|
||||||
LDA.b GameMode : CMP.b #$09 : BNE + ; only if outdoors
|
LDA.b $10 : CMP.b #$09 : BNE + ; only if outdoors
|
||||||
LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames
|
LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames
|
||||||
|
|
||||||
-
|
-
|
||||||
@@ -18,18 +31,18 @@ CuccoStorm:
|
|||||||
LDY.b #$FF : PHY ; push "cucco not found"
|
LDY.b #$FF : PHY ; push "cucco not found"
|
||||||
|
|
||||||
LDX.b #$00 : -- : CPX.b #$10 : !BGE .ldone
|
LDX.b #$00 : -- : CPX.b #$10 : !BGE .ldone
|
||||||
LDA.w SpriteAITable, X : CMP.b #!ALIVE : BEQ +++
|
LDA.w !ENEMY_STATE_TABLE, X : CMP.b !ALIVE : BEQ +++
|
||||||
; enemy not found
|
; enemy not found
|
||||||
CMP.b #!INERT : BNE ++
|
CMP.b !INERT : BNE ++
|
||||||
; log inert enemy slot
|
; log inert enemy slot
|
||||||
PLA : PHX
|
PLA : PHX
|
||||||
BRA ++
|
BRA ++
|
||||||
+++
|
+++
|
||||||
; found an enemy
|
; found an enemy
|
||||||
LDA.l SpriteTypeTable, X : CMP.b #!CUCCO : BNE ++
|
LDA.l !ENEMY_TYPE_TABLE, X : CMP.b !CUCCO : BNE ++
|
||||||
; it's a cucco
|
; it's a cucco
|
||||||
TXY ; record where we found the living cucco in case we don't find any angry ones
|
TXY ; record where we found the living cucco in case we don't find any angry ones
|
||||||
LDA.w SpriteAuxTable, X : CMP.b #!CUCCO_ENRAGED : !BLT ++
|
LDA.w !ENEMY_AUX1_TABLE, X : CMP.b !CUCCO_ENRAGED : !BLT ++
|
||||||
PLA : BRA + ; we found an angry cucco, done
|
PLA : BRA + ; we found an angry cucco, done
|
||||||
++ : INX : BRA -- : .ldone
|
++ : INX : BRA -- : .ldone
|
||||||
|
|
||||||
@@ -39,12 +52,12 @@ CuccoStorm:
|
|||||||
; we didn't find a cucco, so try to create one
|
; we didn't find a cucco, so try to create one
|
||||||
PLY
|
PLY
|
||||||
CPY.b #$FF : BEQ + ; fail if no slots found
|
CPY.b #$FF : BEQ + ; fail if no slots found
|
||||||
LDA.b #!CUCCO : STA.w SpriteTypeTable, Y
|
LDA.b !CUCCO : STA.w !ENEMY_TYPE_TABLE, Y
|
||||||
LDA.b #!INIT : STA.w SpriteAITable, Y
|
LDA.b !INIT : STA.w !ENEMY_STATE_TABLE, Y
|
||||||
LDA.b LinkPosY : STA.w SpritePosYLow, Y
|
LDA.b !LINK_POS_Y_LOW : STA.w !ENEMY_POS_Y_LOW, Y
|
||||||
LDA.b LinkPosY+1 : STA.w SpritePosYHigh, Y
|
LDA.b !LINK_POS_Y_HIGH : STA.w !ENEMY_POS_Y_HIGH, Y
|
||||||
LDA.b LinkPosX : STA.w SpritePosXLow, Y
|
LDA.b !LINK_POS_X_LOW : STA.w !ENEMY_POS_X_LOW, Y
|
||||||
LDA.b LinkPosX+1 : STA.w SpritePosXHigh, Y
|
LDA.b !LINK_POS_X_HIGH : STA.w !ENEMY_POS_X_HIGH, Y
|
||||||
BRA +++
|
BRA +++
|
||||||
++
|
++
|
||||||
PLA
|
PLA
|
||||||
@@ -52,8 +65,8 @@ CuccoStorm:
|
|||||||
|
|
||||||
;==== Enrage a Cucco
|
;==== Enrage a Cucco
|
||||||
|
|
||||||
LDA.b #!CUCCO_ENRAGED : STA.w SpriteAuxTable, Y ; enrage the cucco
|
LDA.b !CUCCO_ENRAGED : STA.w !ENEMY_AUX1_TABLE, Y ; enrage the cucco
|
||||||
LDA.b #$00 : STA.w SpriteAuxTable+$10, Y : STA.w SpriteDirectionTable, Y
|
LDA.b #$00 : STA.w !ENEMY_AUX2_TABLE, Y : STA.w !ENEMY_DIRECTION_TABLE, Y
|
||||||
|
|
||||||
;====
|
;====
|
||||||
+
|
+
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
PalettesCustom:
|
|
||||||
.master_sword
|
|
||||||
dw $0000, $7E4E, $6FF4, $1CF5, $7FFF, $1CE7, $7A10, $64A5
|
|
||||||
.tempered_sword
|
|
||||||
dw $7FFF, $093B, $169F, $7E8D, $7FFF, $1CE7, $7A10, $64A5
|
|
||||||
.golden_sword
|
|
||||||
dw $0000, $033F, $7FFF, $2640, $7FFF, $1CE7, $7A10, $64A5
|
|
||||||
.fighter_shield
|
|
||||||
dw $0000, $7FFF, $27FF, $5E2D, $7FFF, $1CE7, $7A10, $64A5
|
|
||||||
.red_shield
|
|
||||||
dw $0000, $7FFF, $27FF, $5E2D, $4F5F, $1CE7, $2E9C, $14B6
|
|
||||||
.mirror_shield
|
|
||||||
dw $0000, $7E4E, $6F44, $1CF5, $7399, $1CE7, $02F9, $0233
|
|
||||||
.crystal
|
|
||||||
dw $7FFF, $7FFF, $0000, $5907, $6E0E, $0000, $7FBB, $7672
|
|
||||||
.off_black
|
|
||||||
dw $0000, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5, $14A5
|
|
||||||
BIN
damage_table_bombos.bin
Normal file
BIN
damage_table_bombos.bin
Normal file
Binary file not shown.
BIN
damage_table_pseudo_sword.bin
Normal file
BIN
damage_table_pseudo_sword.bin
Normal file
Binary file not shown.
BIN
damage_table_sword_bombs.bin
Normal file
BIN
damage_table_sword_bombs.bin
Normal file
Binary file not shown.
27
darkroomitems.asm
Normal file
27
darkroomitems.asm
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
CheckReceivedItemPropertiesBeforeLoad:
|
||||||
|
LDA $A0 : BEQ .normalCode
|
||||||
|
LDA $7EC005 : BNE .lightOff
|
||||||
|
.normalCode
|
||||||
|
JSL LoadReceivedItemExpandedProperties ; get palette
|
||||||
|
RTL
|
||||||
|
|
||||||
|
.lightOff
|
||||||
|
PHX : PHY : PHB
|
||||||
|
JSL LoadReceivedItemExpandedProperties ; get palette
|
||||||
|
|
||||||
|
REP #$30
|
||||||
|
AND #$0007 ; mask out palette
|
||||||
|
ASL #5 ; multiply by 32
|
||||||
|
ADC #$C610 ; offset to latter half
|
||||||
|
|
||||||
|
TAX ; give to destination
|
||||||
|
LDY #$C610 ; target palette SP0 colors 8-F
|
||||||
|
|
||||||
|
LDA #$000F ; 16 bytes
|
||||||
|
MVN $7E, $7E ; move palette
|
||||||
|
|
||||||
|
SEP #$30
|
||||||
|
PLB : PLY : PLX
|
||||||
|
INC $15
|
||||||
|
LDA #$00
|
||||||
|
RTL
|
||||||
@@ -3,85 +3,80 @@
|
|||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DarkWorldSaveFix:
|
DarkWorldSaveFix:
|
||||||
LDA.b #$70 : PHA : PLB ; thing we wrote over - data bank change
|
LDA.b #$70 : PHA : PLB ; thing we wrote over - data bank change
|
||||||
JSL MasterSwordFollowerClear
|
JSL.l MasterSwordFollowerClear
|
||||||
JML StatSaveCounter
|
JML.l StatSaveCounter
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DoWorldFix:
|
DoWorldFix:
|
||||||
LDA.l InvertedMode : BEQ +
|
LDA InvertedMode : BEQ +
|
||||||
JMP DoWorldFix_Inverted
|
JMP DoWorldFix_Inverted
|
||||||
+
|
+
|
||||||
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
|
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
|
||||||
LDA.l FollowerIndicator : CMP.b #$04 : BEQ .setLightWorld ; check if old man is following
|
LDA MirrorEquipment : BEQ .noMirror ; check if we have the mirror
|
||||||
LDA.l MirrorEquipment : AND.b #$02 : BEQ .noMirror ; check if we have the mirror
|
|
||||||
.skip_mirror_check ; alt entrance point
|
.skip_mirror_check ; alt entrance point
|
||||||
LDA.l ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive
|
LDA ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive
|
||||||
.setLightWorld
|
.aga1Alive
|
||||||
LDA.b #$00
|
LDA #$00
|
||||||
.noMirror
|
.noMirror
|
||||||
STA.l CurrentWorld ; set flag to light world
|
STA CurrentWorld ; set flag to light world
|
||||||
LDA.l FollowerIndicator : CMP.b #$07 : BNE .done : INC : STA.l FollowerIndicator ; convert frog to dwarf
|
LDA FollowerIndicator : CMP #$07 : BNE .done : INC : STA FollowerIndicator ; convert frog to dwarf
|
||||||
.done
|
.done
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
SetDeathWorldChecked:
|
SetDeathWorldChecked:
|
||||||
LDA.l InvertedMode : BEQ +
|
LDA InvertedMode : BEQ +
|
||||||
JMP SetDeathWorldChecked_Inverted
|
JMP SetDeathWorldChecked_Inverted
|
||||||
+
|
+
|
||||||
LDA.b IndoorsFlag : BEQ .outdoors
|
LDA $1B : BEQ .outdoors
|
||||||
LDA.w DungeonID : CMP.b #$FF : BNE .dungeon
|
LDA $040C : CMP #$FF : BNE .dungeon
|
||||||
LDA.b RoomIndex : ORA.b RoomIndex+1 : BNE ++
|
LDA $A0 : ORA $A1 : BNE ++
|
||||||
LDA.l GanonPyramidRespawn : BNE .pyramid ; if flag is set, force respawn at pyramid on death to ganon
|
LDA GanonPyramidRespawn : BNE .pyramid ; if flag is set, force respawn at pyramid on death to ganon
|
||||||
++
|
++
|
||||||
.outdoors
|
.outdoors
|
||||||
JMP DoWorldFix
|
JMP DoWorldFix
|
||||||
|
|
||||||
.dungeon
|
.dungeon
|
||||||
LDA.l MosaicLevel : BNE .dontfix ; this is a sanc & quit
|
LDA Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon
|
||||||
LDA.l Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon
|
JMP DoWorldFix_skip_mirror_check
|
||||||
.dontfix
|
|
||||||
JMP DoWorldFix_skip_mirror_check
|
|
||||||
|
|
||||||
.pyramid
|
.pyramid
|
||||||
LDA.b #$40 : STA.l CurrentWorld ; set flag to dark world
|
LDA #$40 : STA CurrentWorld ; set flag to dark world
|
||||||
LDA.l FollowerIndicator : CMP.b #$08 : BNE .done : DEC : STA.l FollowerIndicator : + ; convert dwarf to frog
|
LDA FollowerIndicator : CMP #$08 : BNE .done : DEC : STA FollowerIndicator : + ; convert dwarf to frog
|
||||||
.done
|
.done
|
||||||
RTL
|
RTL
|
||||||
;================================================================================
|
;================================================================================
|
||||||
DoWorldFix_Inverted:
|
DoWorldFix_Inverted:
|
||||||
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
|
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
|
||||||
LDA.l FollowerIndicator : CMP.b #$04 : BEQ .setDarkWorld ; check if old man is following
|
LDA MirrorEquipment : BEQ .noMirror ; check if we have the mirror
|
||||||
LDA.l MirrorEquipment : AND.b #$02 : BEQ .setDarkWorld ; check if we have the mirror
|
|
||||||
.skip_mirror_check ; alt entrance point
|
.skip_mirror_check ; alt entrance point
|
||||||
LDA.l ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive
|
LDA ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive
|
||||||
.setDarkWorld
|
.noMirror
|
||||||
LDA.b #$40 : STA.l CurrentWorld ; set flag to dark world
|
.aga1Alive
|
||||||
LDA.l FollowerIndicator
|
LDA #$40 : STA CurrentWorld ; set flag to dark world
|
||||||
CMP.b #$07 : BEQ .clear ; clear frog
|
LDA FollowerIndicator
|
||||||
CMP.b #$08 : BEQ .clear ; clear dwarf - consider flute implications
|
CMP #$07 : BEQ .clear ; clear frog
|
||||||
|
CMP #$08 : BEQ .clear ; clear dwarf - consider flute implications
|
||||||
BRA .done
|
BRA .done
|
||||||
.clear
|
.clear
|
||||||
LDA.b #$00 : STA.l FollowerIndicator ; clear follower
|
LDA.b #$00 : STA FollowerIndicator ; clear follower
|
||||||
.done
|
.done
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
SetDeathWorldChecked_Inverted:
|
SetDeathWorldChecked_Inverted:
|
||||||
LDA.b IndoorsFlag : BEQ .outdoors
|
LDA $1B : BEQ .outdoors
|
||||||
LDA.w DungeonID : CMP.b #$FF : BNE .dungeon
|
LDA $040C : CMP #$FF : BNE .dungeon
|
||||||
LDA.b RoomIndex : ORA.b RoomIndex+1 : BNE ++
|
LDA $A0 : ORA $A1 : BNE ++
|
||||||
LDA.l GanonPyramidRespawn : BNE .castle ; if flag is set, force respawn at pyramid on death to ganon
|
LDA GanonPyramidRespawn : BNE .castle ; if flag is set, force respawn at pyramid on death to ganon
|
||||||
++
|
++
|
||||||
.outdoors
|
.outdoors
|
||||||
JMP DoWorldFix
|
JMP DoWorldFix
|
||||||
|
|
||||||
.dungeon
|
.dungeon
|
||||||
LDA.l MosaicLevel : BNE .dontfix ; this is a sanc & quit
|
LDA Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon
|
||||||
LDA.l Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon
|
JMP DoWorldFix_Inverted_skip_mirror_check
|
||||||
.dontfix
|
|
||||||
JMP DoWorldFix_Inverted_skip_mirror_check
|
|
||||||
|
|
||||||
.castle
|
.castle
|
||||||
LDA.b #$00 : STA.l CurrentWorld ; set flag to dark world
|
LDA #$00 : STA CurrentWorld ; set flag to dark world
|
||||||
LDA.l FollowerIndicator : CMP.b #$07 : BNE + : LDA.b #$08 : STA.l FollowerIndicator : + ; convert frog to dwarf
|
LDA FollowerIndicator : CMP #$07 : BNE + : LDA.b #$08 : STA FollowerIndicator : + ; convert frog to dwarf
|
||||||
.done
|
.done
|
||||||
RTL
|
RTL
|
||||||
;================================================================================
|
;================================================================================
|
||||||
@@ -89,20 +84,20 @@ RTL
|
|||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
FakeWorldFix:
|
FakeWorldFix:
|
||||||
LDA.l FixFakeWorld : BEQ +
|
LDA FixFakeWorld : BEQ +
|
||||||
LDA.b OverworldIndex : AND.b #$40 : STA.l CurrentWorld
|
LDA $8A : AND.b #$40 : STA CurrentWorld
|
||||||
+
|
+
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
MasterSwordFollowerClear:
|
MasterSwordFollowerClear:
|
||||||
LDA.l FollowerIndicator
|
LDA FollowerIndicator
|
||||||
CMP.b #$0E : BNE .exit ; clear master sword follower
|
CMP #$0E : BNE .exit ; clear master sword follower
|
||||||
LDA.b #$00 : STA.l FollowerIndicator ; clear follower
|
LDA.b #$00 : STA FollowerIndicator ; clear follower
|
||||||
.exit
|
.exit
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
FixAgahnimFollowers:
|
FixAgahnimFollowers:
|
||||||
LDA.b #$00 : STA.l FollowerIndicator ; clear follower
|
LDA.b #$00 : STA FollowerIndicator ; clear follower
|
||||||
JML PrepDungeonExit ; thing we wrote over
|
JML PrepDungeonExit ; thing we wrote over
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
@@ -112,53 +107,53 @@ macro SetMinimum(base,filler,compare)
|
|||||||
?done:
|
?done:
|
||||||
endmacro
|
endmacro
|
||||||
RefreshRainAmmo:
|
RefreshRainAmmo:
|
||||||
LDA.l ProgressIndicator : CMP.b #$01 : BEQ .rain ; check if we're in rain state
|
LDA ProgressIndicator : CMP.b #$01 : BEQ .rain ; check if we're in rain state
|
||||||
RTL
|
RTL
|
||||||
.rain
|
.rain
|
||||||
LDA.l StartingEntrance
|
LDA StartingEntrance
|
||||||
+ CMP.b #$03 : BNE + ; Uncle
|
+ CMP.b #$03 : BNE + ; Uncle
|
||||||
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Uncle)
|
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Uncle)
|
||||||
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Uncle)
|
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Uncle)
|
||||||
LDA.l ArrowMode : BEQ ++
|
%SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Uncle)
|
||||||
LDA.l BowEquipment : BEQ +++
|
BRA .done
|
||||||
++ %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Uncle)
|
|
||||||
+++ BRA .done
|
|
||||||
+ CMP.b #$02 : BNE + ; Cell
|
+ CMP.b #$02 : BNE + ; Cell
|
||||||
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Cell)
|
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Cell)
|
||||||
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Cell)
|
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Cell)
|
||||||
LDA.l ArrowMode : BEQ ++
|
%SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Cell)
|
||||||
LDA.l BowEquipment : BEQ .done
|
|
||||||
++ %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Cell)
|
|
||||||
BRA .done
|
BRA .done
|
||||||
+ CMP.b #$04 : BNE + ; Mantle
|
+ CMP.b #$04 : BNE + ; Mantle
|
||||||
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Mantle)
|
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Mantle)
|
||||||
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Mantle)
|
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Mantle)
|
||||||
LDA.l ArrowMode : BEQ ++
|
%SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Mantle)
|
||||||
LDA.l BowEquipment : BEQ .done
|
|
||||||
++ %SetMinimum(CurrentArrows,ArrowsFiller,RainDeathRefillArrows_Mantle)
|
|
||||||
+
|
+
|
||||||
.done
|
.done
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
SetEscapeAssist:
|
SetEscapeAssist:
|
||||||
LDA.l ProgressIndicator : CMP.b #$01 : BNE .no_train ; check if we're in rain state
|
LDA ProgressIndicator : CMP.b #$01 : BNE .no_train ; check if we're in rain state
|
||||||
.rain
|
.rain
|
||||||
LDA.l EscapeAssist
|
LDA.l EscapeAssist
|
||||||
BIT.b #$04 : BEQ + : STA.l InfiniteArrows : +
|
BIT.b #$04 : BEQ + : STA InfiniteMagicModifier : +
|
||||||
BIT.b #$02 : BEQ + : STA.l InfiniteBombs : +
|
BIT.b #$02 : BEQ + : STA InfiniteBombsModifier : +
|
||||||
BIT.b #$01 : BEQ + : STA.l InfiniteArrows : +
|
BIT.b #$01 : BEQ + : STA InfiniteArrowsModifier : +
|
||||||
BRA ++
|
BRA ++
|
||||||
.no_train ; choo choo
|
.no_train ; choo choo
|
||||||
LDA.l EscapeAssist : BIT.b #$04 : BEQ + : LDA.b #$00 : STA.l InfiniteMagic : +
|
LDA.l EscapeAssist
|
||||||
LDA.l EscapeAssist : BIT.b #$02 : BEQ + : LDA.b #$00 : STA.l InfiniteBombs : +
|
BIT.b #$40 : BEQ + : STA InfiniteMagicModifier : +
|
||||||
LDA.l EscapeAssist : BIT.b #$01 : BEQ + : LDA.b #$00 : STA.l InfiniteArrows : +
|
BIT.b #$20 : BEQ + : STA InfiniteBombsModifier : +
|
||||||
|
BIT.b #$10 : BEQ + : STA InfiniteArrowsModifier : +
|
||||||
++
|
++
|
||||||
|
|
||||||
|
LDA.l SpecialWeapons : CMP #$01 : BNE +
|
||||||
|
LDA.l SpecialWeaponLevel : BEQ +
|
||||||
|
LDA #$01 : STA InfiniteBombsModifier
|
||||||
|
+
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
SetSilverBowMode:
|
SetSilverBowMode:
|
||||||
LDA.l SilverArrowsUseRestriction : BEQ + ; fix bow type for restricted arrow mode
|
LDA SilverArrowsUseRestriction : BEQ + ; fix bow type for restricted arrow mode
|
||||||
LDA.l BowEquipment : CMP.b #$3 : BCC +
|
LDA BowEquipment : CMP.b #$3 : BCC +
|
||||||
SBC.b #$02 : STA.l BowEquipment
|
SBC.b #$02 : STA BowEquipment
|
||||||
+
|
+
|
||||||
RTL
|
RTL
|
||||||
;================================================================================
|
;================================================================================
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
=9F
|
|
||||||
0=53
|
|
||||||
1=54
|
|
||||||
2=55
|
|
||||||
3=56
|
|
||||||
4=57
|
|
||||||
5=58
|
|
||||||
6=59
|
|
||||||
7=5A
|
|
||||||
8=5B
|
|
||||||
9=5C
|
|
||||||
A=5D
|
|
||||||
B=5E
|
|
||||||
C=5F
|
|
||||||
D=60
|
|
||||||
E=61
|
|
||||||
F=62
|
|
||||||
G=63
|
|
||||||
H=64
|
|
||||||
I=65
|
|
||||||
J=66
|
|
||||||
K=67
|
|
||||||
L=68
|
|
||||||
M=69
|
|
||||||
N=6A
|
|
||||||
O=6B
|
|
||||||
P=6C
|
|
||||||
Q=6D
|
|
||||||
R=6E
|
|
||||||
S=6F
|
|
||||||
T=70
|
|
||||||
U=71
|
|
||||||
V=72
|
|
||||||
W=73
|
|
||||||
X=74
|
|
||||||
Y=75
|
|
||||||
Z=76
|
|
||||||
a=A0
|
|
||||||
b=A1
|
|
||||||
c=A2
|
|
||||||
d=A3
|
|
||||||
e=A4
|
|
||||||
f=A5
|
|
||||||
g=A6
|
|
||||||
h=A7
|
|
||||||
i=A8
|
|
||||||
j=A9
|
|
||||||
k=AA
|
|
||||||
l=AB
|
|
||||||
m=AC
|
|
||||||
n=AD
|
|
||||||
o=AE
|
|
||||||
p=AF
|
|
||||||
q=B0
|
|
||||||
r=B1
|
|
||||||
s=B2
|
|
||||||
t=B3
|
|
||||||
u=B4
|
|
||||||
v=B5
|
|
||||||
w=B6
|
|
||||||
x=B7
|
|
||||||
y=B8
|
|
||||||
z=B9
|
|
||||||
'=D9
|
|
||||||
"=DA
|
|
||||||
/=DB
|
|
||||||
.=DC
|
|
||||||
:=DD
|
|
||||||
_=DE
|
|
||||||
^=DF
|
|
||||||
&=E0
|
|
||||||
#=E1
|
|
||||||
@=E2
|
|
||||||
>=E3
|
|
||||||
?=E4
|
|
||||||
!=E5
|
|
||||||
~=E6
|
|
||||||
,=E7
|
|
||||||
-=E8
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
=9F
|
|
||||||
0=79
|
|
||||||
1=7A
|
|
||||||
2=7B
|
|
||||||
3=7C
|
|
||||||
4=7D
|
|
||||||
5=7E
|
|
||||||
6=7F
|
|
||||||
7=80
|
|
||||||
8=81
|
|
||||||
9=82
|
|
||||||
A=83
|
|
||||||
B=84
|
|
||||||
C=85
|
|
||||||
D=86
|
|
||||||
E=87
|
|
||||||
F=88
|
|
||||||
G=89
|
|
||||||
H=8A
|
|
||||||
I=8B
|
|
||||||
J=8C
|
|
||||||
K=8D
|
|
||||||
L=8E
|
|
||||||
M=8F
|
|
||||||
N=90
|
|
||||||
O=91
|
|
||||||
P=92
|
|
||||||
Q=93
|
|
||||||
R=94
|
|
||||||
S=95
|
|
||||||
T=96
|
|
||||||
U=97
|
|
||||||
V=98
|
|
||||||
W=99
|
|
||||||
X=9A
|
|
||||||
Y=9B
|
|
||||||
Z=9C
|
|
||||||
a=BB
|
|
||||||
b=BC
|
|
||||||
c=BD
|
|
||||||
d=BE
|
|
||||||
e=BF
|
|
||||||
f=C0
|
|
||||||
g=C1
|
|
||||||
h=C2
|
|
||||||
i=C3
|
|
||||||
j=C4
|
|
||||||
k=C5
|
|
||||||
l=C6
|
|
||||||
m=C7
|
|
||||||
n=C8
|
|
||||||
o=C9
|
|
||||||
p=CA
|
|
||||||
q=CB
|
|
||||||
r=CC
|
|
||||||
s=CD
|
|
||||||
t=CE
|
|
||||||
u=CF
|
|
||||||
v=D0
|
|
||||||
w=D1
|
|
||||||
x=D2
|
|
||||||
y=D3
|
|
||||||
z=D4
|
|
||||||
'=EC
|
|
||||||
"=ED
|
|
||||||
/=EE
|
|
||||||
.=EF
|
|
||||||
:=F0
|
|
||||||
_=F1
|
|
||||||
^=F2
|
|
||||||
&=F3
|
|
||||||
#=F4
|
|
||||||
@=F5
|
|
||||||
>=F6
|
|
||||||
?=F7
|
|
||||||
!=F8
|
|
||||||
~=F9
|
|
||||||
,=FA
|
|
||||||
-=FB
|
|
||||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 4.1 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.1 KiB |
@@ -1,55 +0,0 @@
|
|||||||
; Kanji replacement characters
|
|
||||||
|
|
||||||
org $8E9AC9
|
|
||||||
;.charDD ; 𓄿
|
|
||||||
db $FB, $8C, $73, $CB, $30, $4B, $30, $54
|
|
||||||
db $2B, $5B, $24, $2D, $12, $13, $61, $1E
|
|
||||||
db $36, $09, $1B, $04, $14, $0B, $15, $0A
|
|
||||||
db $15, $0A, $21, $1E, $1E, $48, $30, $38
|
|
||||||
;.charDE ; ☥
|
|
||||||
db $1E, $33, $0C, $2D, $12, $2D, $12, $2D
|
|
||||||
db $12, $F3, $0C, $01, $01, $BF, $40, $C0
|
|
||||||
db $3F, $BF, $40, $F2, $0C, $12, $0C, $12
|
|
||||||
db $0C, $12, $0C, $1E, $50, $A0, $F0
|
|
||||||
;.charDF ; ≈
|
|
||||||
db $01, $3B, $6E, $11, $C4, $3B, $91, $6E
|
|
||||||
db $BB, $44, $26, $18, $3C, $E7, $3B, $6E
|
|
||||||
db $11, $C4, $3B, $91, $6E, $BB, $44, $EE
|
|
||||||
db $98, $60, $F0
|
|
||||||
;.charE0 ; 🡅
|
|
||||||
db $0C, $12, $0C, $21, $1E, $40, $3F, $80
|
|
||||||
db $7F, $02, $01, $01, $E1, $1E, $21, $1E
|
|
||||||
db $21, $1E, $21, $1E, $21, $1E, $21, $1E
|
|
||||||
db $21, $1E, $3F, $80, $80
|
|
||||||
;.charE1 ; 🡇
|
|
||||||
db $3F, $21, $1E, $21, $1E, $21, $1E, $21
|
|
||||||
db $1E, $21, $1E, $21, $1E, $E1, $1E, $80
|
|
||||||
db $7F, $40, $3F, $21, $1E, $12, $0C, $0C
|
|
||||||
db $28, $10, $30
|
|
||||||
;.charE2 ; 🡆
|
|
||||||
db $18, $14, $08, $12, $0C, $F1, $0E, $80
|
|
||||||
db $7F, $01, $80, $7F, $80, $7F, $80, $7F
|
|
||||||
db $F1, $0E, $12, $0C, $14, $08, $18, $20
|
|
||||||
db $C0, $C0
|
|
||||||
;.charE3 ; 🡄
|
|
||||||
db $06, $0A, $04, $12, $0C, $23, $1C, $40
|
|
||||||
db $3F, $02, $01, $03, $80, $7F, $80, $7F
|
|
||||||
db $40, $3F, $23, $1C, $12, $0C, $0A, $04
|
|
||||||
db $06, $10, $E0, $F0
|
|
||||||
|
|
||||||
|
|
||||||
org $8EBD94
|
|
||||||
;.charDD ; 𓄿
|
|
||||||
db $BF, $FE, $3F, $FF, $B8 ; 10111111 11111110 00111111 11111111 10111000
|
|
||||||
;.charDE ; ☥
|
|
||||||
db $BF, $FA, $3F, $FF, $B8 ; 10111111 11111010 00111111 11111111 10111000
|
|
||||||
;.charDF ; ≈
|
|
||||||
db $AF, $FE, $2B, $FE, $38 ; 10101111 11111110 00101011 11111110 00111000
|
|
||||||
;.charE0 ; 🡅
|
|
||||||
db $2F, $FE, $3F, $FF, $A8 ; 00101111 11111110 00111111 11111111 10101000
|
|
||||||
;.charE1 ; 🡇
|
|
||||||
db $2F, $F0, $3F, $FF, $B8 ; 00101111 11110000 00111111 11111111 10111000
|
|
||||||
;.charE2 ; 🡆
|
|
||||||
db $2F, $F8, $3F, $FE, $38 ; 00101111 11111000 00111111 11111110 00111000
|
|
||||||
;.charE3 ; 🡄
|
|
||||||
db $2F, $FE, $3F, $FE, $38 ; 00101111 11111110 00111111 11111110 00111000
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
db $00, $01, $02, $03, $04, $CC, $CC ; あ い う え お ⎵ ⎵
|
|
||||||
db $15, $16, $17, $1D, $1E, $CC ; が ぎ ぐ げ ご ⎵
|
|
||||||
db $50, $51, $52, $53, $54, $CC, $CC ; ア イ ウ エ オ ⎵ ⎵
|
|
||||||
db $D0, $D1, $D2, $D3, $D4, $CC ; a b c d e ⎵
|
|
||||||
db $AA, $AB, $AC, $AD, $CC, $CC ; A B C D ⎵ ⎵
|
|
||||||
|
|
||||||
db $08, $09, $0A, $0B, $0C, $CC, $CC ; か き く け こ ⎵ ⎵
|
|
||||||
db $1F, $25, $26, $27, $2D, $CC ; ざ じ ず ぜ ぞ ⎵
|
|
||||||
db $58, $59, $5A, $5B, $5C, $CC, $CC ; カ キ ク ケ コ ⎵ ⎵
|
|
||||||
db $D5, $D6, $D7, $D8, $D9, $CC ; ザ ジ ズ ゼ ゾ ⎵
|
|
||||||
db $AE, $AF, $B0, $B1, $CC, $CC ; E F G H ⎵ ⎵
|
|
||||||
|
|
||||||
db $10, $11, $12, $13, $14, $CC, $CC ; さ し す せ そ ⎵ ⎵
|
|
||||||
db $2E, $2F, $35, $36, $37, $CC ; だ ぢ づ で ど ⎵
|
|
||||||
db $60, $61, $62, $63, $64, $CC, $CC ; サ シ ス セ ソ ⎵ ⎵
|
|
||||||
db $DA, $DB, $DC, $DD, $DE, $CC ; ダ ヂ ヅ デ ド ⎵
|
|
||||||
db $B2, $B3, $B4, $B5, $CC, $CC ; I J K L ⎵ ⎵
|
|
||||||
|
|
||||||
db $18, $19, $1A, $1B, $1C, $CC, $CC ; た ち つ て と ⎵ ⎵
|
|
||||||
db $3D, $3E, $3F, $40, $41, $CC ; ば び ぶ べ ぼ ⎵
|
|
||||||
db $68, $69, $6A, $6B, $6C, $CC, $CC ; タ チ ツ テ ト ⎵ ⎵
|
|
||||||
db $DF, $E0, $E1, $E2, $E3, $CC ; バ ビ ブ ベ ボ ⎵
|
|
||||||
db $B6, $B7, $B8, $B9, $CC, $CC ; M N O P ⎵ ⎵
|
|
||||||
|
|
||||||
db $20, $21, $22, $23, $24, $CC, $CC ; な に ぬ ね の ⎵ ⎵
|
|
||||||
db $42, $43, $44, $45, $46, $CC ; ぱ ぴ ぷ ぺ ぽ ⎵
|
|
||||||
db $70, $71, $72, $73, $74, $CC, $CC ; ナ ニ ヌ ネ ノ ⎵ ⎵
|
|
||||||
db $E4, $E5, $E6, $E7, $E8, $CC ; パ ピ プ ペ ポ ⎵
|
|
||||||
db $BA, $BB, $BC, $BD, $CC, $CC ; Q R S T ⎵ ⎵
|
|
||||||
|
|
||||||
db $28, $29, $2A, $2B, $2C, $CC, $CC ; は ひ ふ へ ほ ⎵ ⎵
|
|
||||||
db $65, $66, $67, $6D, $6E, $CC
|
|
||||||
db $78, $79, $7A, $7B, $7C, $CC, $CC ; ハ ヒ フ ヘ ホ ⎵ ⎵
|
|
||||||
db $E9, $EA, $EB, $EC, $C6, $CC ; ァ ィ ゥ ェ ォ ⎵
|
|
||||||
db $BE, $BF, $C0, $C1, $CC, $CC ; U V W X ⎵ ⎵
|
|
||||||
|
|
||||||
db $30, $31, $32, $33, $34, $CC, $CC ; ま み む め も ⎵ ⎵
|
|
||||||
db $6F, $75, $76, $77, $7D, $CC ; ザ ジ ズ ゼ ゾ ⎵
|
|
||||||
db $80, $81, $82, $83, $84, $CC, $CC ; マ ミ ム メ モ ⎵ ⎵
|
|
||||||
db $CC, $CC, $CC, $CC, $9A, $CC ; ャ ュ ョ ⎵ ッ ⎵
|
|
||||||
db $C2, $C3, $C9, $CE, $CC, $CC ; Y Z - 〜 ⎵ ⎵
|
|
||||||
|
|
||||||
db $05, $CC, $06, $CC, $07, $CC, $CC ; や ⎵ ゆ ⎵ よ ⎵ ⎵
|
|
||||||
db $7E, $7F, $85, $86, $87, $CC ; ダ ヂ ヅ デ ド ⎵
|
|
||||||
db $55, $CC, $56, $CC, $57, $CC, $CC ; ヤ ⎵ ユ ⎵ ヨ ⎵ ⎵
|
|
||||||
db $A0, $A1, $A2, $A3, $A4, $CC ; ⎵ ⎵ ⎵ ⎵ ⎵ ⎵
|
|
||||||
db $CC, $CC, $CC, $CC, $CC, $CC ; ⎵ ⎵ ⎵ ⎵ ⎵ ⎵
|
|
||||||
|
|
||||||
db $38, $39, $3A, $3B, $3C, $CC, $CC ; ら り る れ ろ ⎵ ⎵
|
|
||||||
db $8D, $8E, $8F, $90, $91, $CC ; バ ビ ブ ベ ボ ⎵
|
|
||||||
db $88, $89, $8A, $8B, $8C, $CC, $CC ; ラ リ ル レ ロ ⎵ ⎵
|
|
||||||
db $A5, $A6, $A7, $A8, $A9, $CC ; ⎵ ⎵ ⎵ ⎵ ⎵ ⎵
|
|
||||||
db $CA, $CB, $CD, $CD, $CC, $CC ; 🡄 🡆 END ⎵ ⎵
|
|
||||||
|
|
||||||
db $0D, $0E, $0F, $CC, $C9, $CC, $CC ; わ を ん ⎵ - ⎵ ⎵
|
|
||||||
db $92, $93, $94, $95, $96, $CC ; パ ピ プ ペ ポ ⎵
|
|
||||||
db $5D, $5E, $5F, $CC, $C9, $CC, $CC ; ワ ヲ ン ⎵ - ⎵ ⎵
|
|
||||||
db $CC, $CC, $CC, $CC, $CC, $CC ; ⎵ ⎵ ⎵ ⎵ ⎵ ⎵
|
|
||||||
db $CC, $CC, $CC, $CC, $CC, $CC ; ⎵ ⎵ ⎵ ⎵ ⎵ ⎵
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1,72 +0,0 @@
|
|||||||
dw $E164, $3900 ; VRAM $C9C2 | 58 bytes | Horizontal
|
|
||||||
dw $1CA2, $0188, $1CA3, $0188, $1CA4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DA0, $0188, $1DA1, $0188, $1DA2, $0188
|
|
||||||
dw $1DA3, $0188, $1DA4, $0188, $0188, $0188, $1D4A, $0188
|
|
||||||
dw $1D4B, $0188, $1D4C, $0188, $1D4D
|
|
||||||
|
|
||||||
dw $0165, $3900 ; VRAM $CA02 | 58 bytes | Horizontal
|
|
||||||
dw $1CB2, $0188, $1CB3, $0188, $1CB4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DB0, $0188, $1DB1, $0188, $1DB2, $0188
|
|
||||||
dw $1DB3, $0188, $1DB4, $0188, $0188, $0188, $1D5A, $0188
|
|
||||||
dw $1D5B, $0188, $1D5C, $0188, $1D5D
|
|
||||||
|
|
||||||
dw $2165, $3900 ; VRAM $CA42 | 58 bytes | Horizontal
|
|
||||||
dw $1CAA, $0188, $1CAB, $0188, $1CAC, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DA5, $0188, $1DA6, $0188, $1DA7, $0188
|
|
||||||
dw $1DA8, $0188, $1DA9, $0188, $0188, $0188, $1D4E, $0188
|
|
||||||
dw $1D4F, $0188, $1D60, $0188, $1D61
|
|
||||||
|
|
||||||
dw $4165, $3900 ; VRAM $CA82 | 58 bytes | Horizontal
|
|
||||||
dw $1CBA, $0188, $1CBB, $0188, $1CBC, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DB5, $0188, $1DB6, $0188, $1DB7, $0188
|
|
||||||
dw $1DB8, $0188, $1DB9, $0188, $0188, $0188, $1D5E, $0188
|
|
||||||
dw $1D5F, $0188, $1D70, $0188, $1D71
|
|
||||||
|
|
||||||
dw $6165, $3900 ; VRAM $CAC2 | 58 bytes | Horizontal
|
|
||||||
dw $1CC2, $0188, $1CC3, $0188, $1CC4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DAA, $0188, $1DAB, $0188, $1DAC, $0188
|
|
||||||
dw $1DAD, $0188, $1DAE, $0188, $0188, $0188, $1D62, $0188
|
|
||||||
dw $1D63, $0188, $1D64, $0188, $1D65
|
|
||||||
|
|
||||||
dw $8165, $3900 ; VRAM $CB02 | 58 bytes | Horizontal
|
|
||||||
dw $1CD2, $0188, $1CD3, $0188, $1CD4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DBA, $0188, $1DBB, $0188, $1DBC, $0188
|
|
||||||
dw $1DBD, $0188, $1DBE, $0188, $0188, $0188, $1D72, $0188
|
|
||||||
dw $1D73, $0188, $1D74, $0188, $1D75
|
|
||||||
|
|
||||||
dw $A165, $3900 ; VRAM $CB42 | 58 bytes | Horizontal
|
|
||||||
dw $1CCA, $0188, $1CCB, $0188, $1CCC, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DAF, $0188, $1DC0, $0188, $1DC1, $0188
|
|
||||||
dw $1DC2, $0188, $1DC3, $0188, $0188, $0188, $1D66, $0188
|
|
||||||
dw $1D67, $0188, $1D68, $0188, $1D69
|
|
||||||
|
|
||||||
dw $C165, $3900 ; VRAM $CB82 | 58 bytes | Horizontal
|
|
||||||
dw $1CDA, $0188, $1CDB, $0188, $1CDC, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DBF, $0188, $1DD0, $0188, $1DD1, $0188
|
|
||||||
dw $1DD2, $0188, $1DD3, $0188, $0188, $0188, $1D76, $0188
|
|
||||||
dw $1D77, $0188, $1D78, $0188, $1D79
|
|
||||||
|
|
||||||
dw $E165, $3900 ; VRAM $CBC2 | 58 bytes | Horizontal
|
|
||||||
dw $1CE2, $0188, $1CE3, $0188, $1CE4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DC4, $0188, $1DC5, $0188, $1DC6, $0188
|
|
||||||
dw $1DC7, $0188, $1DC8, $0188, $0188, $0188, $1D6A, $0188
|
|
||||||
dw $1D6B, $0188, $1D6C, $0188, $1D6D
|
|
||||||
|
|
||||||
dw $0166, $3900 ; VRAM $CC02 | 58 bytes | Horizontal
|
|
||||||
dw $1CF2, $0188, $1CF3, $0188, $1CF4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DD4, $0188, $1DD5, $0188, $1DD6, $0188
|
|
||||||
dw $1DD7, $0188, $1DD8, $0188, $0188, $0188, $1D7A, $0188
|
|
||||||
dw $1D7B, $0188, $1D7C, $0188, $1D7D
|
|
||||||
|
|
||||||
; dw $2166, $3900 ; VRAM $CC42 | 58 bytes | Horizontal
|
|
||||||
; dw $1CEA, $0188, $1CEB, $0188, $1CEC, $0188, $0188, $0188
|
|
||||||
; dw $0188, $0188, $1DC9, $0188, $1DCA, $0188, $1DCB, $0188
|
|
||||||
; dw $1DCC, $0188, $1D86, $0188, $0188, $0188, $1D6E, $0188
|
|
||||||
; dw $1D6F, $0188, $1D80, $0188, $1D81
|
|
||||||
;
|
|
||||||
; dw $4166, $3900 ; VRAM $CC82 | 58 bytes | Horizontal
|
|
||||||
; dw $1CFA, $0188, $1CFB, $0188, $1CFC, $0188, $0188, $0188
|
|
||||||
; dw $0188, $0188, $1DD9, $0188, $1DDA, $0188, $1DDB, $0188
|
|
||||||
; dw $1DDC, $0188, $1D96, $0188, $0188, $0188, $1D7E, $0188
|
|
||||||
; dw $1D7F, $0188, $1D90, $0188, $1D91
|
|
||||||
|
|
||||||
Binary file not shown.
@@ -1,72 +0,0 @@
|
|||||||
dw $E164, $3900 ; VRAM $C9C2 | 58 bytes | Horizontal
|
|
||||||
dw $1CA2, $0188, $1CA3, $0188, $1CA4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DA0, $0188, $1DA1, $0188, $1DA2, $0188
|
|
||||||
dw $1DA3, $0188, $1DA4, $0188, $0188, $0188, $1D4A, $0188
|
|
||||||
dw $1D4B, $0188, $1D4C, $0188, $1D4D
|
|
||||||
|
|
||||||
dw $0165, $3900 ; VRAM $CA02 | 58 bytes | Horizontal
|
|
||||||
dw $1CB2, $0188, $1CB3, $0188, $1CB4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DB0, $0188, $1DB1, $0188, $1DB2, $0188
|
|
||||||
dw $1DB3, $0188, $1DB4, $0188, $0188, $0188, $1D5A, $0188
|
|
||||||
dw $1D5B, $0188, $1D5C, $0188, $1D5D
|
|
||||||
|
|
||||||
dw $2165, $3900 ; VRAM $CA42 | 58 bytes | Horizontal
|
|
||||||
dw $1CAA, $0188, $1CAB, $0188, $1CAC, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DA5, $0188, $1DA6, $0188, $1DA7, $0188
|
|
||||||
dw $1DA8, $0188, $1DA9, $0188, $0188, $0188, $1D4E, $0188
|
|
||||||
dw $1D4F, $0188, $1D60, $0188, $1D61
|
|
||||||
|
|
||||||
dw $4165, $3900 ; VRAM $CA82 | 58 bytes | Horizontal
|
|
||||||
dw $1CBA, $0188, $1CBB, $0188, $1CBC, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DB5, $0188, $1DB6, $0188, $1DB7, $0188
|
|
||||||
dw $1DB8, $0188, $1DB9, $0188, $0188, $0188, $1D5E, $0188
|
|
||||||
dw $1D5F, $0188, $1D70, $0188, $1D71
|
|
||||||
|
|
||||||
dw $6165, $3900 ; VRAM $CAC2 | 58 bytes | Horizontal
|
|
||||||
dw $1CC2, $0188, $1CC3, $0188, $1CC4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DAA, $0188, $1DAB, $0188, $1DAC, $0188
|
|
||||||
dw $1DAD, $0188, $1DAE, $0188, $0188, $0188, $1D62, $0188
|
|
||||||
dw $1D63, $0188, $1D64, $0188, $1D65
|
|
||||||
|
|
||||||
dw $8165, $3900 ; VRAM $CB02 | 58 bytes | Horizontal
|
|
||||||
dw $1CD2, $0188, $1CD3, $0188, $1CD4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DBA, $0188, $1DBB, $0188, $1DBC, $0188
|
|
||||||
dw $1DBD, $0188, $1DBE, $0188, $0188, $0188, $1D72, $0188
|
|
||||||
dw $1D73, $0188, $1D74, $0188, $1D75
|
|
||||||
|
|
||||||
dw $A165, $3900 ; VRAM $CB42 | 58 bytes | Horizontal
|
|
||||||
dw $1CCA, $0188, $1CCB, $0188, $1CCC, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DAF, $0188, $1DC0, $0188, $1DC1, $0188
|
|
||||||
dw $1DC2, $0188, $1DC3, $0188, $0188, $0188, $1D66, $0188
|
|
||||||
dw $1D67, $0188, $1D68, $0188, $1D69
|
|
||||||
|
|
||||||
dw $C165, $3900 ; VRAM $CB82 | 58 bytes | Horizontal
|
|
||||||
dw $1CDA, $0188, $1CDB, $0188, $1CDC, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DBF, $0188, $1DD0, $0188, $1DD1, $0188
|
|
||||||
dw $1DD2, $0188, $1DD3, $0188, $0188, $0188, $1D76, $0188
|
|
||||||
dw $1D77, $0188, $1D78, $0188, $1D79
|
|
||||||
|
|
||||||
dw $E165, $3900 ; VRAM $CBC2 | 58 bytes | Horizontal
|
|
||||||
dw $1CE2, $0188, $1CE3, $0188, $1CE4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DC4, $0188, $1DC5, $0188, $1DC6, $0188
|
|
||||||
dw $1DC7, $0188, $1DC8, $0188, $0188, $0188, $1D6A, $0188
|
|
||||||
dw $1D6B, $0188, $1D6C, $0188, $1D6D
|
|
||||||
|
|
||||||
dw $0166, $3900 ; VRAM $CC02 | 58 bytes | Horizontal
|
|
||||||
dw $1CF2, $0188, $1CF3, $0188, $1CF4, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DD4, $0188, $1DD5, $0188, $1DD6, $0188
|
|
||||||
dw $1DD7, $0188, $1DD8, $0188, $0188, $0188, $1D7A, $0188
|
|
||||||
dw $1D7B, $0188, $1D7C, $0188, $1D7D
|
|
||||||
|
|
||||||
dw $2166, $3900 ; VRAM $CC42 | 58 bytes | Horizontal
|
|
||||||
dw $1CEA, $0188, $1CEB, $0188, $1CEC, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DC9, $0188, $1DCA, $0188, $1DCB, $0188
|
|
||||||
dw $1DCC, $0188, $1D86, $0188, $0188, $0188, $1D6E, $0188
|
|
||||||
dw $1D6F, $0188, $1D80, $0188, $1D81
|
|
||||||
|
|
||||||
dw $4166, $3900 ; VRAM $CC82 | 58 bytes | Horizontal
|
|
||||||
dw $1CFA, $0188, $1CFB, $0188, $1CFC, $0188, $0188, $0188
|
|
||||||
dw $0188, $0188, $1DD9, $0188, $1DDA, $0188, $1DDB, $0188
|
|
||||||
dw $1DDC, $0188, $1D96, $0188, $0188, $0188, $1D7E, $0188
|
|
||||||
dw $1D7F, $0188, $1D90, $0188, $1D91
|
|
||||||
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
dw $2362, $3900 ; VRAM $C446 | 58 bytes | Horizontal
|
|
||||||
dw $1C48, $0188, $1C49, $0188, $1C4A, $0188, $1C4B, $0188
|
|
||||||
dw $1C4C, $0188, $0188, $0188, $0188, $0188, $1CC5, $0188
|
|
||||||
dw $1CC6, $0188, $1CC7, $0188, $1CCD, $0188, $1CCE, $0188
|
|
||||||
dw $0188, $0188, $1CE8, $0188, $1CE9
|
|
||||||
|
|
||||||
dw $4362, $3900 ; VRAM $C486 | 58 bytes | Horizontal
|
|
||||||
dw $1C58, $0188, $1C59, $0188, $1C5A, $0188, $1C5B, $0188
|
|
||||||
dw $1C5C, $0188, $0188, $0188, $0188, $0188, $1CD5, $0188
|
|
||||||
dw $1CD6, $0188, $1CD7, $0188, $1CDD, $0188, $1CDE, $0188
|
|
||||||
dw $0188, $0188, $1CF8, $0188, $1CF9
|
|
||||||
|
|
||||||
dw $6362, $3900 ; VRAM $C4C6 | 58 bytes | Horizontal
|
|
||||||
dw $1C60, $0188, $1C61, $0188, $1C62, $0188, $1C63, $0188
|
|
||||||
dw $1C64, $0188, $0188, $0188, $0188, $0188, $1CCF, $0188
|
|
||||||
dw $1CE5, $0188, $1CE6, $0188, $1CE7, $0188, $1CED, $0188
|
|
||||||
dw $0188, $0188, $1D00, $0188, $1D01
|
|
||||||
|
|
||||||
|
|
||||||
dw $8362, $3900 ; VRAM $C506 | 58 bytes | Horizontal
|
|
||||||
dw $1C70, $0188, $1C71, $0188, $1C72, $0188, $1C73, $0188
|
|
||||||
dw $1C74, $0188, $0188, $0188, $0188, $0188, $1CDF, $0188
|
|
||||||
dw $1CF5, $0188, $1CF6, $0188, $1CF7, $0188, $1CFD, $0188
|
|
||||||
dw $0188, $0188, $1D10, $0188, $1D11
|
|
||||||
|
|
||||||
Binary file not shown.
@@ -1,61 +0,0 @@
|
|||||||
'=9D
|
|
||||||
A=AA
|
|
||||||
B=AB
|
|
||||||
C=AC
|
|
||||||
D=AD
|
|
||||||
E=AE
|
|
||||||
F=AF
|
|
||||||
G=B0
|
|
||||||
H=B1
|
|
||||||
I=B2
|
|
||||||
J=B3
|
|
||||||
K=B4
|
|
||||||
L=B5
|
|
||||||
M=B6
|
|
||||||
N=B7
|
|
||||||
O=B8
|
|
||||||
P=B9
|
|
||||||
Q=BA
|
|
||||||
R=BB
|
|
||||||
S=BC
|
|
||||||
T=BD
|
|
||||||
U=BE
|
|
||||||
V=BF
|
|
||||||
W=C0
|
|
||||||
X=C1
|
|
||||||
Y=C2
|
|
||||||
Z=C3
|
|
||||||
?=C6
|
|
||||||
!=C7
|
|
||||||
,=C8
|
|
||||||
-=C9
|
|
||||||
.=CD
|
|
||||||
~=CE
|
|
||||||
a=D0
|
|
||||||
b=D1
|
|
||||||
c=D2
|
|
||||||
d=D3
|
|
||||||
e=D4
|
|
||||||
f=D5
|
|
||||||
g=D6
|
|
||||||
h=D7
|
|
||||||
i=D8
|
|
||||||
j=D9
|
|
||||||
k=DA
|
|
||||||
l=DB
|
|
||||||
m=DC
|
|
||||||
n=DD
|
|
||||||
o=DE
|
|
||||||
p=DF
|
|
||||||
q=E0
|
|
||||||
r=E1
|
|
||||||
s=E2
|
|
||||||
t=E3
|
|
||||||
u=E4
|
|
||||||
v=E5
|
|
||||||
w=E6
|
|
||||||
x=E7
|
|
||||||
y=E8
|
|
||||||
z=E9
|
|
||||||
:=EA
|
|
||||||
=FF
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
'=9D00
|
|
||||||
A=AA00
|
|
||||||
B=AB00
|
|
||||||
C=AC00
|
|
||||||
D=AD00
|
|
||||||
E=AE00
|
|
||||||
F=AF00
|
|
||||||
G=B000
|
|
||||||
H=B100
|
|
||||||
I=B200
|
|
||||||
J=B300
|
|
||||||
K=B400
|
|
||||||
L=B500
|
|
||||||
M=B600
|
|
||||||
N=B700
|
|
||||||
O=B800
|
|
||||||
P=B900
|
|
||||||
Q=BA00
|
|
||||||
R=BB00
|
|
||||||
S=BC00
|
|
||||||
T=BD00
|
|
||||||
U=BE00
|
|
||||||
V=BF00
|
|
||||||
W=C000
|
|
||||||
X=C100
|
|
||||||
Y=C200
|
|
||||||
Z=C300
|
|
||||||
?=C600
|
|
||||||
!=C700
|
|
||||||
,=C800
|
|
||||||
-=C900
|
|
||||||
.=CD00
|
|
||||||
~=CE00
|
|
||||||
a=D000
|
|
||||||
b=D100
|
|
||||||
c=D200
|
|
||||||
d=D300
|
|
||||||
e=D400
|
|
||||||
f=D500
|
|
||||||
g=D600
|
|
||||||
h=D700
|
|
||||||
i=D800
|
|
||||||
j=D900
|
|
||||||
k=DA00
|
|
||||||
l=DB00
|
|
||||||
m=DC00
|
|
||||||
n=DD00
|
|
||||||
o=DE00
|
|
||||||
p=DF00
|
|
||||||
q=E000
|
|
||||||
r=E100
|
|
||||||
s=E200
|
|
||||||
t=E300
|
|
||||||
u=E400
|
|
||||||
v=E500
|
|
||||||
w=E600
|
|
||||||
x=E700
|
|
||||||
y=E800
|
|
||||||
z=E900
|
|
||||||
:=EA00
|
|
||||||
=FF00
|
|
||||||
@@ -1,539 +0,0 @@
|
|||||||
;===================================================================================================
|
|
||||||
; Get the item's graphic from WRAM/ROM
|
|
||||||
; Bit 7 set indicates an explicit WRAM address
|
|
||||||
; Bit 7 reset indicates an offset into the ROM buffer
|
|
||||||
;===================================================================================================
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
; Enters with A for parameter
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
TransferItemReceiptToBuffer_using_GraphicsID:
|
|
||||||
PHP
|
|
||||||
PHB
|
|
||||||
|
|
||||||
REP #$30
|
|
||||||
PHX
|
|
||||||
PHY
|
|
||||||
|
|
||||||
SEP #$30
|
|
||||||
LDX.b #$00
|
|
||||||
|
|
||||||
.find_reverse
|
|
||||||
CMP.l ItemReceipts_graphics,X
|
|
||||||
BEQ .found
|
|
||||||
|
|
||||||
INX
|
|
||||||
BNE .find_reverse
|
|
||||||
|
|
||||||
.found
|
|
||||||
TXA
|
|
||||||
REP #$30
|
|
||||||
BRA ++
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
TransferRupeesProperly:
|
|
||||||
PHP
|
|
||||||
PHB
|
|
||||||
|
|
||||||
REP #$31
|
|
||||||
PHX
|
|
||||||
PHY
|
|
||||||
|
|
||||||
AND.w #$00FF
|
|
||||||
SBC.w #$0023
|
|
||||||
|
|
||||||
XBA
|
|
||||||
LSR
|
|
||||||
LSR
|
|
||||||
LSR
|
|
||||||
ADC.w #BigDecompressionBuffer+$800
|
|
||||||
|
|
||||||
BRA TransferItemReceiptToBuffer_using_ExplicitBufferAddress
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
TransferItemReceiptToBuffer_using_ReceiptID:
|
|
||||||
PHP : PHB
|
|
||||||
|
|
||||||
REP #$30
|
|
||||||
PHX : PHY
|
|
||||||
|
|
||||||
++ AND.w #$00FF
|
|
||||||
ASL : TAX
|
|
||||||
|
|
||||||
LDA.l BusyItem : BNE +
|
|
||||||
LDA.l StandingItemGraphicsOffsets,X
|
|
||||||
BRA .have_address
|
|
||||||
+
|
|
||||||
LDA.l ItemReceiptGraphicsOffsets,X
|
|
||||||
.have_address
|
|
||||||
BMI TransferItemReceiptToBuffer_using_ExplicitBufferAddress
|
|
||||||
|
|
||||||
.rom_address
|
|
||||||
ADC.w #ItemReceiptGraphicsROM
|
|
||||||
PHK
|
|
||||||
BRA .continue
|
|
||||||
|
|
||||||
#TransferItemReceiptToBuffer_using_ExplicitBufferAddress:
|
|
||||||
PEA.w $7F7F
|
|
||||||
PLB
|
|
||||||
|
|
||||||
.continue
|
|
||||||
PLB
|
|
||||||
TAY
|
|
||||||
LDX.w #62
|
|
||||||
|
|
||||||
.next_write
|
|
||||||
LDA.w $003E,Y
|
|
||||||
STA.l ItemGetGFX+$00,X
|
|
||||||
|
|
||||||
LDA.w $023E,Y
|
|
||||||
STA.l ItemGetGFX+$40,X
|
|
||||||
|
|
||||||
DEY
|
|
||||||
DEY
|
|
||||||
DEX
|
|
||||||
DEX
|
|
||||||
BPL .next_write
|
|
||||||
|
|
||||||
|
|
||||||
REP #$30
|
|
||||||
PLY
|
|
||||||
PLX
|
|
||||||
PLB
|
|
||||||
PLP
|
|
||||||
RTL
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
TransferItemToVRAM:
|
|
||||||
REP #$21
|
|
||||||
SEP #$10
|
|
||||||
|
|
||||||
LDA.w ItemGFXPtr
|
|
||||||
BEQ .exit
|
|
||||||
BMI .wram_address
|
|
||||||
|
|
||||||
.rom_address
|
|
||||||
ADC.w #ItemReceiptGraphicsROM
|
|
||||||
|
|
||||||
LDX.b #ItemReceiptGraphicsROM>>16
|
|
||||||
|
|
||||||
.set_address
|
|
||||||
STA.w $4302
|
|
||||||
ADC.w #$0200
|
|
||||||
STA.w $4312
|
|
||||||
|
|
||||||
STX.w $4304
|
|
||||||
STX.w $4314
|
|
||||||
|
|
||||||
LDX.b #$80
|
|
||||||
STX.w $2115
|
|
||||||
|
|
||||||
LDA.w #$1801
|
|
||||||
STA.w $4300
|
|
||||||
STA.w $4310
|
|
||||||
|
|
||||||
LDA.w #$0040
|
|
||||||
STA.w $4305
|
|
||||||
STA.w $4315
|
|
||||||
|
|
||||||
LDA.w ItemGFXTarget
|
|
||||||
STA.w $2116
|
|
||||||
|
|
||||||
LDX.b #$01
|
|
||||||
STX.w DMAENABLE
|
|
||||||
|
|
||||||
ADC.w #$0100
|
|
||||||
STA.w $2116
|
|
||||||
|
|
||||||
INX
|
|
||||||
STX.w DMAENABLE
|
|
||||||
|
|
||||||
STZ.w ItemGFXPtr
|
|
||||||
STZ.w ItemGFXTarget
|
|
||||||
|
|
||||||
.exit
|
|
||||||
RTL
|
|
||||||
|
|
||||||
.wram_address
|
|
||||||
LDX.b #$7F
|
|
||||||
BRA .set_address
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
; Decompress everything at the start of the game
|
|
||||||
;===================================================================================================
|
|
||||||
DecompBufferOffset = $18
|
|
||||||
DecompTestByte = $04
|
|
||||||
DecompCommand = $02
|
|
||||||
DecompSize = $00
|
|
||||||
DecompTileCount = $1A
|
|
||||||
DecompSaveY = $1A
|
|
||||||
Decomp3BPPScratch = $20
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
DecompressAllItemGraphics:
|
|
||||||
PHP
|
|
||||||
PHB
|
|
||||||
PHD
|
|
||||||
|
|
||||||
REP #$38
|
|
||||||
|
|
||||||
; Stack change for safety
|
|
||||||
TSX
|
|
||||||
|
|
||||||
LDA.w #$1400
|
|
||||||
TCS
|
|
||||||
|
|
||||||
PHX
|
|
||||||
|
|
||||||
; direct page change for speed
|
|
||||||
LDA.w #$1200
|
|
||||||
TCD
|
|
||||||
|
|
||||||
STZ.b DecompBufferOffset
|
|
||||||
|
|
||||||
SEP #$34
|
|
||||||
|
|
||||||
STA.l $4200 ; already 0 from the LDA above
|
|
||||||
|
|
||||||
LDX.b #$5D+$73 : JSR FastSpriteDecomp
|
|
||||||
LDX.b #$5C+$73 : JSR FastSpriteDecomp
|
|
||||||
LDX.b #$5B+$73 : JSR FastSpriteDecomp
|
|
||||||
LDX.b #$5A+$73 : JSR FastSpriteDecomp
|
|
||||||
|
|
||||||
REP #$30
|
|
||||||
PLX
|
|
||||||
TXS
|
|
||||||
|
|
||||||
SEP #$20
|
|
||||||
|
|
||||||
LDA.b #$81
|
|
||||||
STA.l $4200
|
|
||||||
|
|
||||||
|
|
||||||
PLD
|
|
||||||
PLB
|
|
||||||
PLP
|
|
||||||
|
|
||||||
RTL
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
; I normally hate macros like this... but I don't feel like constantly rewriting this
|
|
||||||
;===================================================================================================
|
|
||||||
macro GetNextByte()
|
|
||||||
LDA.w $0000,Y
|
|
||||||
INY
|
|
||||||
BNE ?++
|
|
||||||
|
|
||||||
; Y pulls more than it needs, but that's fine
|
|
||||||
; the high byte should only be affected if we somehow have FF as our bank
|
|
||||||
; and if that happens, we have other problems
|
|
||||||
PHB
|
|
||||||
PLY
|
|
||||||
INY
|
|
||||||
PHY
|
|
||||||
PLB
|
|
||||||
|
|
||||||
LDY.w #$8000
|
|
||||||
|
|
||||||
?++
|
|
||||||
endmacro
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
; There's no long vanilla routine, and we're going to make heavy use of this
|
|
||||||
; so might as well rewrite it to be fast
|
|
||||||
;===================================================================================================
|
|
||||||
FastSpriteDecomp:
|
|
||||||
SEP #$30
|
|
||||||
|
|
||||||
LDA.l GFXSheetPointers_background_bank,X : PHA : PLB
|
|
||||||
LDA.l GFXSheetPointers_background_high,X : XBA
|
|
||||||
LDA.l GFXSheetPointers_background_low,X
|
|
||||||
|
|
||||||
REP #$10
|
|
||||||
|
|
||||||
TAY
|
|
||||||
|
|
||||||
LDX.w #$0000
|
|
||||||
|
|
||||||
.next_command
|
|
||||||
%GetNextByte()
|
|
||||||
|
|
||||||
CMP.b #$FF
|
|
||||||
BNE .continue
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
JMP Unrolled3BPPConvert
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
.continue
|
|
||||||
CMP.b #$E0
|
|
||||||
BCS .expanded
|
|
||||||
|
|
||||||
STA.b DecompTestByte
|
|
||||||
|
|
||||||
REP #$20
|
|
||||||
|
|
||||||
AND.w #$001F
|
|
||||||
|
|
||||||
BRA .normal
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
; Putting some commands up here for branch distance
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
.nonrepeating
|
|
||||||
REP #$21
|
|
||||||
TYA
|
|
||||||
ADC.b DecompSize
|
|
||||||
ORA.w #$8000
|
|
||||||
STA.b DecompSize
|
|
||||||
|
|
||||||
SEP #$20
|
|
||||||
|
|
||||||
.next_nonrepeating
|
|
||||||
%GetNextByte()
|
|
||||||
|
|
||||||
STA.l DecompBuffer2,X
|
|
||||||
|
|
||||||
INX
|
|
||||||
|
|
||||||
CPY.b DecompSize
|
|
||||||
BNE .next_nonrepeating
|
|
||||||
|
|
||||||
BRA .next_command
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
.repeating
|
|
||||||
%GetNextByte()
|
|
||||||
|
|
||||||
STY.b DecompSaveY
|
|
||||||
|
|
||||||
LDY.b DecompSize
|
|
||||||
|
|
||||||
.next_repeating
|
|
||||||
STA.l DecompBuffer2,X
|
|
||||||
|
|
||||||
INX
|
|
||||||
DEY
|
|
||||||
BNE .next_repeating
|
|
||||||
|
|
||||||
LDY.b DecompSaveY
|
|
||||||
BRA .next_command
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
; Rest of command handling
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
.expanded
|
|
||||||
STA.b DecompCommand
|
|
||||||
|
|
||||||
ASL
|
|
||||||
ASL
|
|
||||||
ASL
|
|
||||||
STA.b DecompTestByte
|
|
||||||
|
|
||||||
LDA.b DecompCommand
|
|
||||||
AND.b #$03
|
|
||||||
XBA
|
|
||||||
|
|
||||||
%GetNextByte()
|
|
||||||
|
|
||||||
REP #$20
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
.normal
|
|
||||||
INC
|
|
||||||
STA.b DecompSize
|
|
||||||
|
|
||||||
SEP #$20
|
|
||||||
|
|
||||||
LDA.b DecompTestByte
|
|
||||||
|
|
||||||
AND.b #$E0
|
|
||||||
BEQ .nonrepeating
|
|
||||||
BMI .copy
|
|
||||||
|
|
||||||
ASL
|
|
||||||
BPL .repeating
|
|
||||||
|
|
||||||
ASL
|
|
||||||
BPL .repeating_word
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
.incremental
|
|
||||||
%GetNextByte()
|
|
||||||
|
|
||||||
STY.b DecompSaveY
|
|
||||||
|
|
||||||
LDY.b DecompSize
|
|
||||||
|
|
||||||
.next_incremental
|
|
||||||
STA.l DecompBuffer2,X
|
|
||||||
|
|
||||||
INC
|
|
||||||
INX
|
|
||||||
|
|
||||||
DEY
|
|
||||||
BNE .next_incremental
|
|
||||||
|
|
||||||
LDY.b DecompSaveY
|
|
||||||
JMP .next_command
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
.repeating_word
|
|
||||||
JSR .get_next_word
|
|
||||||
REP #$20
|
|
||||||
|
|
||||||
STY.b DecompSaveY
|
|
||||||
|
|
||||||
LDY.b DecompSize
|
|
||||||
DEY
|
|
||||||
|
|
||||||
.next_word
|
|
||||||
STA.l DecompBuffer2,X
|
|
||||||
|
|
||||||
INX
|
|
||||||
INX
|
|
||||||
|
|
||||||
DEY
|
|
||||||
DEY
|
|
||||||
BPL .next_word
|
|
||||||
|
|
||||||
INY
|
|
||||||
BEQ .not_too_far
|
|
||||||
|
|
||||||
DEX
|
|
||||||
|
|
||||||
.not_too_far
|
|
||||||
SEP #$20
|
|
||||||
|
|
||||||
LDY.b DecompSaveY
|
|
||||||
|
|
||||||
JMP .next_command
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
.copy
|
|
||||||
JSR .get_next_word
|
|
||||||
|
|
||||||
STY.b DecompSaveY
|
|
||||||
|
|
||||||
TAY
|
|
||||||
|
|
||||||
LDA.b DecompSize
|
|
||||||
BNE ++
|
|
||||||
|
|
||||||
DEC.b DecompSize+1
|
|
||||||
|
|
||||||
++ PHB
|
|
||||||
LDA.b #$7F
|
|
||||||
PHA
|
|
||||||
PLB
|
|
||||||
|
|
||||||
.next_copy
|
|
||||||
LDA.w DecompBuffer2,Y
|
|
||||||
STA.w DecompBuffer2,X
|
|
||||||
|
|
||||||
INX
|
|
||||||
INY
|
|
||||||
|
|
||||||
DEC.b DecompSize+0
|
|
||||||
BNE .next_copy
|
|
||||||
|
|
||||||
DEC.b DecompSize+1
|
|
||||||
BPL .next_copy
|
|
||||||
|
|
||||||
PLB
|
|
||||||
|
|
||||||
LDY.b DecompSaveY
|
|
||||||
|
|
||||||
JMP .next_command
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
; These are only used once per command, so I'm fine with letting them be a JSR I guess
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
.get_next_word
|
|
||||||
%GetNextByte()
|
|
||||||
XBA
|
|
||||||
|
|
||||||
%GetNextByte()
|
|
||||||
XBA
|
|
||||||
|
|
||||||
RTS
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
; More macros, because lazy
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
macro DoPlanesA(offset)
|
|
||||||
LDA.w DecompBuffer2+<offset>+<offset>,Y
|
|
||||||
STA.w BigDecompressionBuffer+<offset>+<offset>,X
|
|
||||||
|
|
||||||
ORA.w DecompBuffer2+<offset>+<offset>-1,Y
|
|
||||||
AND.w #$FF00
|
|
||||||
STA.b Decomp3BPPScratch
|
|
||||||
|
|
||||||
LDA.w DecompBuffer2+$10+<offset>,Y
|
|
||||||
AND.w #$00FF
|
|
||||||
TSB.b Decomp3BPPScratch
|
|
||||||
|
|
||||||
XBA
|
|
||||||
ORA.b Decomp3BPPScratch
|
|
||||||
STA.w BigDecompressionBuffer+$10+<offset>+<offset>,X
|
|
||||||
|
|
||||||
endmacro
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
Unrolled3BPPConvert:
|
|
||||||
LDA.b #$7F
|
|
||||||
PHA
|
|
||||||
PLB
|
|
||||||
|
|
||||||
REP #$21
|
|
||||||
|
|
||||||
LDY.w #$0000
|
|
||||||
LDX.b DecompBufferOffset
|
|
||||||
|
|
||||||
.next_3bpp_tile
|
|
||||||
%DoPlanesA(0) ; 8 times
|
|
||||||
%DoPlanesA(1)
|
|
||||||
%DoPlanesA(2)
|
|
||||||
%DoPlanesA(3)
|
|
||||||
%DoPlanesA(4)
|
|
||||||
%DoPlanesA(5)
|
|
||||||
%DoPlanesA(6)
|
|
||||||
%DoPlanesA(7)
|
|
||||||
|
|
||||||
; carry will always be clear
|
|
||||||
; don't worry
|
|
||||||
TXA
|
|
||||||
ADC.w #32
|
|
||||||
TAX
|
|
||||||
|
|
||||||
; just trust me
|
|
||||||
TYA
|
|
||||||
ADC.w #24
|
|
||||||
TAY
|
|
||||||
|
|
||||||
CMP.w #24*64
|
|
||||||
BCS .done
|
|
||||||
|
|
||||||
JMP .next_3bpp_tile
|
|
||||||
|
|
||||||
.done
|
|
||||||
STX.b DecompBufferOffset
|
|
||||||
SEP #$30
|
|
||||||
|
|
||||||
RTS
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,10 +1,13 @@
|
|||||||
|
|
||||||
|
!CryptoBuffer = "$7F5100"
|
||||||
|
;!keyBase = "$7F50D0"
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
LoadStaticDecryptionKey:
|
LoadStaticDecryptionKey:
|
||||||
PHB : PHA : PHX : PHY : PHP
|
PHB : PHA : PHX : PHY : PHP
|
||||||
REP #$30 ; set 16-bit accumulator & index registers
|
REP #$30 ; set 16-bit accumulator & index registers
|
||||||
LDX.w #StaticDecryptionKey ; Source
|
LDX.w #StaticDecryptionKey ; Source
|
||||||
LDY.w #KeyBase ; Target
|
LDY.w #!keyBase ; Target
|
||||||
LDA.w #$000F ; Length
|
LDA.w #$000F ; Length
|
||||||
MVN $307F
|
MVN $307F
|
||||||
|
|
||||||
@@ -20,68 +23,70 @@ RetrieveValueFromEncryptedTable:
|
|||||||
;Returns result in A
|
;Returns result in A
|
||||||
PHX : PHY
|
PHX : PHY
|
||||||
PHA
|
PHA
|
||||||
LDY.b Scrap04 : PHY : LDY.b Scrap06 : PHY : LDY.b Scrap08 : PHY
|
LDY $04 : PHY : LDY $06 : PHY : LDY $08 : PHY
|
||||||
LDY.b Scrap0A : PHY : LDY.b Scrap0C : PHY : LDY.b Scrap0E : PHY
|
LDY $0A : PHY : LDY $0C : PHY : LDY $0E : PHY
|
||||||
|
|
||||||
AND.w #$FFF8 : TAY
|
AND.w #$FFF8 : TAY
|
||||||
LDA.b [Scrap00], Y : STA.l CryptoBuffer : INY #2
|
LDA [$00], Y : STA.l !CryptoBuffer : INY #2
|
||||||
LDA.b [Scrap00], Y : STA.l CryptoBuffer+2 : INY #2
|
LDA [$00], Y : STA.l !CryptoBuffer+2 : INY #2
|
||||||
LDA.b [Scrap00], Y : STA.l CryptoBuffer+4 : INY #2
|
LDA [$00], Y : STA.l !CryptoBuffer+4 : INY #2
|
||||||
LDA.b [Scrap00], Y : STA.l CryptoBuffer+6
|
LDA [$00], Y : STA.l !CryptoBuffer+6
|
||||||
|
|
||||||
LDA.w #$0002 : STA.b Scrap04 ;set block size
|
LDA.w #$0002 : STA $04 ;set block size
|
||||||
|
|
||||||
JSL XXTEA_Decode
|
JSL.l XXTEA_Decode
|
||||||
|
|
||||||
PLA : STA.b Scrap0E : PLA : STA.b Scrap0C : PLA : STA.b Scrap0A
|
PLA : STA $0E : PLA : STA $0C : PLA : STA $0A
|
||||||
PLA : STA.b Scrap08 : PLA : STA.b Scrap06 : PLA : STA.b Scrap04
|
PLA : STA $08 : PLA : STA $06 : PLA : STA $04
|
||||||
PLA : AND.w #$0007 : TAX
|
PLA : AND.w #$0007 : TAX
|
||||||
LDA.l CryptoBuffer, X
|
LDA.l !CryptoBuffer, X
|
||||||
PHA
|
PHA
|
||||||
LDA.w #$0000
|
LDA.w #$0000
|
||||||
STA.l CryptoBuffer
|
STA.l !CryptoBuffer
|
||||||
STA.l CryptoBuffer+2
|
STA.l !CryptoBuffer+2
|
||||||
STA.l CryptoBuffer+4
|
STA.l !CryptoBuffer+4
|
||||||
STA.l CryptoBuffer+6
|
STA.l !CryptoBuffer+6
|
||||||
PLA
|
PLA
|
||||||
PLY : PLX
|
PLY : PLX
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
ChestData = $01E96C
|
|
||||||
ChestDataPayload = $01EABC ; ChestData+$0150
|
!ChestData = "$01E96C"
|
||||||
|
!ChestData_Payload = "$1EABC" ; !ChestData+$0150
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
GetChestData:
|
GetChestData:
|
||||||
LDA.l IsEncrypted : BNE .encrypted
|
LDA.l IsEncrypted : BNE .encrypted
|
||||||
INC.b Scrap0E : LDX.w #$FFFD ; what we wrote over
|
INC $0E : LDX.w #$FFFD ; what we wrote over
|
||||||
JML Dungeon_OpenKeyedObject_nextChest
|
JML.l Dungeon_OpenKeyedObject_nextChest
|
||||||
|
|
||||||
.encrypted
|
.encrypted
|
||||||
INC.b Scrap0E : LDX.w #$FFFE
|
INC $0E : LDX.w #$FFFE
|
||||||
|
|
||||||
.nextChest
|
.nextChest
|
||||||
|
|
||||||
INX #2 : CPX.w #$0150 : BEQ .couldntFindChest
|
INX #2 : CPX.w #$0150 : BEQ .couldntFindChest
|
||||||
LDA.l ChestData, X : AND.w #$7FFF : CMP.b RoomIndex : BNE .nextChest
|
LDA !ChestData, X : AND.w #$7FFF : CMP $A0 : BNE .nextChest
|
||||||
|
|
||||||
DEC.b Scrap0E : BNE .nextChest
|
DEC $0E : BNE .nextChest
|
||||||
|
|
||||||
LDA.b Scrap00 : PHA : LDA.b Scrap02 : PHA
|
LDA $00 : PHA : LDA $02 : PHA
|
||||||
|
|
||||||
LDA.w #ChestDataPayload : STA.b Scrap00
|
LDA.w #!ChestData_Payload : STA $00
|
||||||
LDA.w #ChestDataPayload>>16 : STA.b Scrap02
|
LDA.w #!ChestData_Payload>>16 : STA $02
|
||||||
|
|
||||||
TXA : LSR
|
TXA : LSR
|
||||||
JSL RetrieveValueFromEncryptedTable
|
JSL RetrieveValueFromEncryptedTable
|
||||||
STA.b Scrap0C
|
STA $0C
|
||||||
|
|
||||||
PLA : STA.b Scrap02 : PLA : STA.b Scrap00
|
PLA : STA $02 : PLA : STA $00
|
||||||
|
|
||||||
LDA.l ChestData, X : ASL A : BCC .smallChest
|
LDA !ChestData, X : ASL A : BCC .smallChest
|
||||||
|
|
||||||
JML Dungeon_OpenKeyedObject_bigChest ;(bank01.asm line #13783)
|
JML.l Dungeon_OpenKeyedObject_bigChest ;(bank01.asm line #13783)
|
||||||
|
|
||||||
.smallChest
|
.smallChest
|
||||||
JML Dungeon_OpenKeyedObject_smallChest
|
JML.l Dungeon_OpenKeyedObject_smallChest
|
||||||
.couldntFindChest
|
.couldntFindChest
|
||||||
JML Dungeon_OpenKeyedObject_couldntFindChest
|
JML.l Dungeon_OpenKeyedObject_couldntFindChest
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
|||||||
541
dialog.asm
541
dialog.asm
@@ -2,157 +2,200 @@
|
|||||||
; Dialog Pointer Override
|
; Dialog Pointer Override
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DialogOverride:
|
DialogOverride:
|
||||||
LDA.l AltTextFlag : BEQ .skip
|
LDA $7F5035 : BEQ .skip
|
||||||
LDA.l DialogBuffer, X ; use alternate buffer
|
LDA $7F5700, X ; use alternate buffer
|
||||||
RTL
|
RTL
|
||||||
.skip
|
.skip
|
||||||
LDA.l DecompressionBuffer+$1200, X
|
LDA $7F1200, X
|
||||||
RTL
|
RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
; $7F5035 - Alternate Text Pointer Flag ; 0=Disable
|
||||||
|
; $7F5036 - Padding Byte (Must be Zero)
|
||||||
|
; $7F5700 - $7F57FF - Dialog Buffer
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
ResetDialogPointer:
|
ResetDialogPointer:
|
||||||
STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer
|
STZ $1CF0 : STZ $1CF1 ; reset decompression buffer
|
||||||
LDA.b #$00 : STA.l AltTextFlag ; zero out the alternate flag
|
LDA.b #$00 : STA $7F5035 ; zero out the alternate flag
|
||||||
LDA.b #$1C : STA.w DelayTimer ; thing we wrote over
|
LDA.b #$1C : STA $1CE9 ; thing we wrote over
|
||||||
RTL
|
RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
;macro LoadDialog(index,table)
|
||||||
|
; PHA : PHX : PHY
|
||||||
|
; PHB : PHK : PLB
|
||||||
|
; LDA $00 : PHA
|
||||||
|
; LDA $01 : PHA
|
||||||
|
; LDA $02 : PHA
|
||||||
|
; LDA.b #$01 : STA $7F5035 ; set flag
|
||||||
|
;
|
||||||
|
; LDA <index> : ASL : !ADD.l <index> : TAX ; get quote offset *3, move to X
|
||||||
|
; LDA <table>, X : STA $00 ; write pointer to direct page
|
||||||
|
; LDA <table>+1, X : STA $01
|
||||||
|
; LDA <table>+2, X : STA $02
|
||||||
|
;
|
||||||
|
; LDX.b #$00 : LDY.b #$00
|
||||||
|
; -
|
||||||
|
; LDA [$00], Y ; load the next character from the pointer
|
||||||
|
; STA $7F5700, X ; write to the buffer
|
||||||
|
; INX : INY
|
||||||
|
; CMP.b #$7F : BNE -
|
||||||
|
; PLA : STA $02
|
||||||
|
; PLA : STA $01
|
||||||
|
; PLA : STA $00
|
||||||
|
; PLB
|
||||||
|
; PLY : PLX : PLA
|
||||||
|
;endmacro
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
;macro LoadDialogAddress(address)
|
||||||
|
; PHA : PHX : PHY
|
||||||
|
; PHP
|
||||||
|
; PHB : PHK : PLB
|
||||||
|
; SEP #$30 ; set 8-bit accumulator and index registers
|
||||||
|
; LDA $00 : PHA
|
||||||
|
; LDA $01 : PHA
|
||||||
|
; LDA $02 : PHA
|
||||||
|
; LDA.b #$01 : STA $7F5035 ; set flag
|
||||||
|
;
|
||||||
|
; LDA.b #<address> : STA $00 ; write pointer to direct page
|
||||||
|
; LDA.b #<address>>>8 : STA $01
|
||||||
|
; LDA.b #<address>>>16 : STA $02
|
||||||
|
;
|
||||||
|
; LDX.b #$00 : LDY.b #$00
|
||||||
|
; -
|
||||||
|
; LDA [$00], Y ; load the next character from the pointer
|
||||||
|
; STA $7F5700, X ; write to the buffer
|
||||||
|
; INX : INY
|
||||||
|
; CMP.b #$7F : BNE -
|
||||||
|
; PLA : STA $02
|
||||||
|
; PLA : STA $01
|
||||||
|
; PLA : STA $00
|
||||||
|
; PLB
|
||||||
|
; PLP
|
||||||
|
; PLY : PLX : PLA
|
||||||
|
;endmacro
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
!OFFSET_POINTER = "$7F5094"
|
||||||
|
!OFFSET_RETURN = "$7F5096"
|
||||||
|
!DIALOG_BUFFER = "$7F5700"
|
||||||
macro LoadDialogAddress(address)
|
macro LoadDialogAddress(address)
|
||||||
PHA : PHX : PHY
|
PHA : PHX : PHY
|
||||||
PHP
|
PHP
|
||||||
PHB : PHK : PLB
|
PHB : PHK : PLB
|
||||||
SEP #$20 ; set 8-bit accumulator
|
SEP #$20 ; set 8-bit accumulator
|
||||||
REP #$10 ; set 16-bit index registers
|
REP #$10 ; set 16-bit index registers
|
||||||
PEI.b (Scrap00)
|
PEI ($00)
|
||||||
LDA.b Scrap02 : PHA
|
LDA $02 : PHA
|
||||||
STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer
|
STZ $1CF0 : STZ $1CF1 ; reset decompression buffer
|
||||||
LDA.b #$01 : STA.l AltTextFlag ; set flag
|
LDA.b #$01 : STA $7F5035 ; set flag
|
||||||
%CopyDialog(<address>)
|
%CopyDialog(<address>)
|
||||||
PLA : STA.b Scrap02
|
PLA : STA $02
|
||||||
REP #$20
|
REP #$20
|
||||||
PLA : STA.b Scrap00
|
PLA : STA $00
|
||||||
PLB
|
PLB
|
||||||
PLP
|
PLP
|
||||||
PLY : PLX : PLA
|
PLY : PLX : PLA
|
||||||
endmacro
|
endmacro
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
macro CopyDialog(address)
|
macro CopyDialog(address)
|
||||||
LDA.b #<address> : STA.b Scrap00 ; write pointer to direct page
|
LDA.b #<address> : STA $00 ; write pointer to direct page
|
||||||
LDA.b #<address>>>8 : STA.b Scrap01
|
LDA.b #<address>>>8 : STA $01
|
||||||
LDA.b #<address>>>16 : STA.b Scrap02
|
LDA.b #<address>>>16 : STA $02
|
||||||
%CopyDialogIndirect()
|
%CopyDialogIndirect()
|
||||||
endmacro
|
endmacro
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
macro CopyDialogIndirect()
|
macro CopyDialogIndirect()
|
||||||
REP #$20 : LDA.l DialogOffsetPointer : TAX : LDY.w #$0000 : SEP #$20 ; copy 2-byte offset pointer to X and set Y to 0
|
REP #$20 : LDA !OFFSET_POINTER : TAX : LDY.w #$0000 : SEP #$20 ; copy 2-byte offset pointer to X and set Y to 0
|
||||||
?loop:
|
?loop:
|
||||||
LDA.b [Scrap00], Y ; load the next character from the pointer
|
LDA [$00], Y ; load the next character from the pointer
|
||||||
STA.l DialogBuffer, X ; write to the buffer
|
STA !DIALOG_BUFFER, X ; write to the buffer
|
||||||
INX : INY
|
INX : INY
|
||||||
CMP.b #$7F : BNE ?loop
|
CMP.b #$7F : BNE ?loop
|
||||||
REP #$20 ; set 16-bit accumulator
|
REP #$20 ; set 16-bit accumulator
|
||||||
TXA : INC : STA.l DialogReturnPointer ; copy out X into
|
TXA : INC : STA !OFFSET_RETURN ; copy out X into
|
||||||
LDA.w #$0000 : STA.l DialogOffsetPointer
|
LDA.w #$0000 : STA !OFFSET_POINTER
|
||||||
SEP #$20 ; set 8-bit accumulator
|
SEP #$20 ; set 8-bit accumulator
|
||||||
endmacro
|
endmacro
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
LoadDialogAddressIndirect:
|
LoadDialogAddressIndirect:
|
||||||
STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer
|
STZ $1CF0 : STZ $1CF1 ; reset decompression buffer
|
||||||
LDA.b #$01 : STA.l AltTextFlag ; set flag
|
LDA.b #$01 : STA $7F5035 ; set flag
|
||||||
%CopyDialogIndirect()
|
%CopyDialogIndirect()
|
||||||
|
;%LoadDialogAddress(UncleText)
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
!ITEM_TEMPORARY = "$7F5040"
|
||||||
FreeDungeonItemNotice:
|
FreeDungeonItemNotice:
|
||||||
STA.l ScratchBufferV
|
STA !ITEM_TEMPORARY
|
||||||
|
|
||||||
PHA : PHX : PHY
|
PHA : PHX : PHY
|
||||||
PHP
|
PHP
|
||||||
PHB : PHK : PLB
|
PHB : PHK : PLB
|
||||||
SEP #$20 ; set 8-bit accumulator
|
SEP #$20 ; set 8-bit accumulator
|
||||||
REP #$10 ; set 16-bit index registers
|
REP #$10 ; set 16-bit index registers
|
||||||
PEI.b (Scrap00)
|
PEI ($00)
|
||||||
LDA.b Scrap02 : PHA
|
LDA $02 : PHA
|
||||||
LDA.l ScratchBufferNV : PHA
|
|
||||||
LDA.l ScratchBufferNV+1 : PHA
|
|
||||||
;--------------------------------
|
;--------------------------------
|
||||||
|
|
||||||
LDA.l FreeItemText : BNE + : JMP .skip : +
|
LDA.l FreeItemText : BNE + : JMP .skip : +
|
||||||
|
|
||||||
LDA.b #$00 : STA.l ScratchBufferNV ; initialize scratch
|
LDA #$00 : STA $7F5010 ; initialize scratch
|
||||||
LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for general small key
|
LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for general small key
|
||||||
LDA.l ScratchBufferV : CMP.b #$24 : BNE + ; general small key
|
LDA !ITEM_TEMPORARY : CMP.b #$24 : BNE + ; general small key
|
||||||
%CopyDialog(Notice_SmallKeyOf)
|
%CopyDialog(Notice_SmallKeyOf)
|
||||||
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
|
LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER
|
||||||
%CopyDialog(Notice_Self)
|
%CopyDialog(Notice_Self)
|
||||||
JMP .done
|
JMP .done
|
||||||
+ : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for general compass
|
+ : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for general compass
|
||||||
LDA.l ScratchBufferV : CMP.b #$25 : BNE + ; general compass
|
LDA !ITEM_TEMPORARY : CMP.b #$25 : BNE + ; general compass
|
||||||
%CopyDialog(Notice_CompassOf)
|
%CopyDialog(Notice_CompassOf)
|
||||||
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
|
LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER
|
||||||
%CopyDialog(Notice_Self)
|
%CopyDialog(Notice_Self)
|
||||||
JMP .done
|
JMP .done
|
||||||
+ : LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for general map
|
+ : LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for general map
|
||||||
LDA.l ScratchBufferV : CMP.b #$33 : BNE + ; general map
|
LDA !ITEM_TEMPORARY : CMP.b #$33 : BNE + ; general map
|
||||||
%CopyDialog(Notice_MapOf)
|
%CopyDialog(Notice_MapOf)
|
||||||
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
|
LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER
|
||||||
%CopyDialog(Notice_Self)
|
%CopyDialog(Notice_Self)
|
||||||
JMP .done
|
JMP .done
|
||||||
+ : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for general big key
|
+ : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for general big key
|
||||||
LDA.l ScratchBufferV : CMP.b #$32 : BNE + ; general big key
|
LDA !ITEM_TEMPORARY : CMP.b #$32 : BNE + ; general big key
|
||||||
%CopyDialog(Notice_BigKeyOf)
|
%CopyDialog(Notice_BigKeyOf)
|
||||||
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
|
LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER
|
||||||
%CopyDialog(Notice_Self)
|
%CopyDialog(Notice_Self)
|
||||||
JMP .done
|
JMP .done
|
||||||
+
|
+
|
||||||
LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for dungeon map
|
LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for dungeon map
|
||||||
LDA.l ScratchBufferV : AND.b #$F0 ; looking at high bits only
|
LDA !ITEM_TEMPORARY : AND.b #$F0 ; looking at high bits only
|
||||||
CMP.b #$70 : BNE + ; map of...
|
CMP.b #$70 : BNE + ; map of...
|
||||||
%CopyDialog(Notice_MapOf)
|
%CopyDialog(Notice_MapOf)
|
||||||
JMP .dungeon
|
JMP .dungeon
|
||||||
+ : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for dungeon compass
|
+ : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for dungeon compass
|
||||||
LDA.l ScratchBufferV : AND.b #$F0 : CMP.b #$80 : BNE + ; compass of...
|
LDA !ITEM_TEMPORARY : AND.b #$F0 : CMP.b #$80 : BNE + ; compass of...
|
||||||
%CopyDialog(Notice_CompassOf)
|
%CopyDialog(Notice_CompassOf)
|
||||||
JMP .dungeon
|
JMP .dungeon
|
||||||
+ : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for dungeon big key
|
+ : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for dungeon big key
|
||||||
LDA.l ScratchBufferV : AND.b #$F0 : CMP.b #$90 : BNE + ; big key of...
|
LDA !ITEM_TEMPORARY : AND.b #$F0 : CMP.b #$90 : BNE + ; big key of...
|
||||||
%CopyDialog(Notice_BigKeyOf)
|
%CopyDialog(Notice_BigKeyOf)
|
||||||
JMP .dungeon
|
|
||||||
+ : LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for dungeon small key
|
|
||||||
LDA.l ScratchBufferV : AND.b #$F0 : CMP.b #$A0 : BNE + ; small key of...
|
|
||||||
LDA.l ScratchBufferV : CMP.b #$AF : BNE ++ : JMP .skip : ++
|
|
||||||
%CopyDialog(Notice_SmallKeyOf)
|
|
||||||
LDA.b #$01 : STA.l ScratchBufferNV ; set up a flip for small keys
|
|
||||||
BRA .dungeon
|
BRA .dungeon
|
||||||
+ : LDA.l FreeItemText : AND.b #$20 : BEQ + ; show message for crystal
|
+ : LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for dungeon small key
|
||||||
LDA.l ScratchBufferV : CMP.b #$B0 : !BLT + ; crystal #
|
LDA !ITEM_TEMPORARY : AND.b #$F0 : CMP.b #$A0 : BNE + ; small key of...
|
||||||
CMP.b #$B7 : !BGE +
|
LDA !ITEM_TEMPORARY : CMP.b #$AF : BNE ++ : JMP .skip : ++
|
||||||
%CopyDialog(Notice_Crystal)
|
%CopyDialog(Notice_SmallKeyOf)
|
||||||
JMP .crystal
|
PLA : AND.b #$0F : STA $7F5020 : LDA.b #$0F : !SUB $7F5020 : PHA
|
||||||
+
|
LDA #$01 : STA $7F5010 ; set up a flip for small keys
|
||||||
|
BRA .dungeon
|
||||||
|
+
|
||||||
JMP .skip ; it's not something we are going to give a notice for
|
JMP .skip ; it's not something we are going to give a notice for
|
||||||
|
|
||||||
.dungeon
|
.dungeon
|
||||||
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
|
LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER
|
||||||
LDA.l ScratchBufferV
|
LDA !ITEM_TEMPORARY
|
||||||
AND.b #$0F
|
AND.b #$0F ; looking at low bits only
|
||||||
STA.l ScratchBufferNV+1
|
STA $7F5011
|
||||||
LDA.l ScratchBufferNV : BEQ +
|
LDA $7F5010 : BEQ +
|
||||||
LDA.l ScratchBufferNV
|
LDA $7F5010
|
||||||
LDA.b #$0F : !SUB.l ScratchBufferNV+1 : STA.l ScratchBufferNV+1 ; flip the values for small keys
|
LDA #$0F : !SUB $7F5011 : STA $7F5011 ; flip the values for small keys
|
||||||
+
|
+
|
||||||
LDA.l ScratchBufferNV+1
|
LDA $7F5011
|
||||||
ASL : TAX
|
|
||||||
REP #$20
|
|
||||||
LDA.l DungeonItemIDMap,X : CMP.w #$0003 : BCC .hc_sewers
|
|
||||||
CMP.w DungeonID : BNE +
|
|
||||||
BRA .self_notice
|
|
||||||
.hc_sewers
|
|
||||||
LDA.w DungeonID : CMP.w #$0003 : BCS +
|
|
||||||
.self_notice
|
|
||||||
SEP #$20
|
|
||||||
%CopyDialog(Notice_Self)
|
|
||||||
JMP .done
|
|
||||||
+
|
|
||||||
SEP #$20
|
|
||||||
LDA.l ScratchBufferNV+1
|
|
||||||
CMP.b #$00 : BNE + ; ...light world
|
CMP.b #$00 : BNE + ; ...light world
|
||||||
%CopyDialog(Notice_LightWorld) : JMP .done
|
%CopyDialog(Notice_LightWorld) : JMP .done
|
||||||
+ : CMP.b #$01 : BNE + ; ...dark world
|
+ : CMP.b #$01 : BNE + ; ...dark world
|
||||||
@@ -180,61 +223,38 @@ FreeDungeonItemNotice:
|
|||||||
+ : CMP.b #$0C : BNE + ; ...desert palace
|
+ : CMP.b #$0C : BNE + ; ...desert palace
|
||||||
%CopyDialog(Notice_Desert) : JMP .done
|
%CopyDialog(Notice_Desert) : JMP .done
|
||||||
+ : CMP.b #$0D : BNE + ; ...eastern palace
|
+ : CMP.b #$0D : BNE + ; ...eastern palace
|
||||||
%CopyDialog(Notice_Eastern) : JMP .done
|
%CopyDialog(Notice_Eastern) : BRA .done
|
||||||
+ : CMP.b #$0E : BNE + ; ...hyrule castle
|
+ : CMP.b #$0E : BNE + ; ...hyrule castle
|
||||||
%CopyDialog(Notice_Castle) : JMP .done
|
%CopyDialog(Notice_Castle) : BRA .done
|
||||||
+ : CMP.b #$0F : BNE + ; ...sewers
|
+ : CMP.b #$0F : BNE + ; ...sewers
|
||||||
%CopyDialog(Notice_Sewers)
|
%CopyDialog(Notice_Sewers)
|
||||||
+
|
+
|
||||||
JMP .done
|
|
||||||
|
|
||||||
.crystal
|
|
||||||
LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
|
|
||||||
LDA.l ScratchBufferV
|
|
||||||
AND.b #$0F ; looking at low bits only
|
|
||||||
CMP.b #$00 : BNE +
|
|
||||||
%CopyDialog(Notice_Six) : JMP .done
|
|
||||||
+ : CMP.b #$01 : BNE +
|
|
||||||
%CopyDialog(Notice_One) : JMP .done
|
|
||||||
+ : CMP.b #$02 : BNE +
|
|
||||||
%CopyDialog(Notice_Five) : JMP .done
|
|
||||||
+ : CMP.b #$03 : BNE +
|
|
||||||
%CopyDialog(Notice_Seven) : JMP .done
|
|
||||||
+ : CMP.b #$04 : BNE +
|
|
||||||
%CopyDialog(Notice_Two) : JMP .done
|
|
||||||
+ : CMP.b #$05 : BNE +
|
|
||||||
%CopyDialog(Notice_Four) : JMP .done
|
|
||||||
+ : CMP.b #$06 : BNE +
|
|
||||||
%CopyDialog(Notice_Three) : JMP .done
|
|
||||||
+
|
|
||||||
|
|
||||||
.done
|
.done
|
||||||
|
|
||||||
STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer
|
STZ $1CF0 : STZ $1CF1 ; reset decompression buffer
|
||||||
LDA.b #$01 : STA.l AltTextFlag ; set alternate dialog flag
|
LDA.b #$01 : STA $7F5035 ; set alternate dialog flag
|
||||||
STA.l TextBoxDefer
|
STA $7F509F
|
||||||
|
|
||||||
;--------------------------------
|
;--------------------------------
|
||||||
.skip
|
.skip
|
||||||
PLA : STA.l ScratchBufferNV+1
|
PLA : STA $02
|
||||||
PLA : STA.l ScratchBufferNV
|
REP #$20
|
||||||
PLA : STA.b Scrap02
|
PLA : STA $00
|
||||||
REP #$20
|
PLB
|
||||||
PLA : STA.b Scrap00
|
PLP
|
||||||
PLB
|
PLY : PLX : PLA
|
||||||
PLP
|
;JSL.l Main_ShowTextMessage_Alt ; .skip can be here so long as this line remains commented out
|
||||||
PLY : PLX : PLA
|
|
||||||
RTL
|
RTL
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DialogResetSelectionIndex:
|
DialogResetSelectionIndex:
|
||||||
JSL Attract_DecompressStoryGfx ; what we wrote over
|
JSL.l Attract_DecompressStoryGfx ; what we wrote over
|
||||||
STZ.w MessageCursor
|
STZ $1CE8
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DialogItemReceive:
|
DialogItemReceive:
|
||||||
BCS .nomessage ; if doubling the item value overflowed it must be a rando item
|
BCS .nomessage ; if doubling the item value overflowed it must be a rando item
|
||||||
CPY.b #$98 : BCC ++ ;if the item is $4C or greater it must be a rando item
|
CPY #$98 : BCC ++ ;if the item is $4C or greater it must be a rando item
|
||||||
.nomessage
|
.nomessage
|
||||||
LDA.w #$FFFF
|
LDA.w #$FFFF
|
||||||
|
|
||||||
@@ -247,11 +267,11 @@ RTL
|
|||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DialogFairyThrow:
|
DialogFairyThrow:
|
||||||
LDA.l Restrict_Ponds : BEQ .normal
|
LDA.l Restrict_Ponds : BEQ .normal
|
||||||
LDA.l BottleContentsOne
|
LDA BottleContentsOne
|
||||||
ORA.l BottleContentsTwo : ORA.l BottleContentsThree : ORA.l BottleContentsFour : BNE .normal
|
ORA BottleContentsTwo : ORA BottleContentsThree : ORA BottleContentsFour : BNE .normal
|
||||||
|
|
||||||
.noInventory
|
.noInventory
|
||||||
LDA.w SpriteActivity, X : !ADD.b #$08 : STA.w SpriteActivity, X
|
LDA $0D80, X : !ADD #$08 : STA $0D80, X
|
||||||
LDA.b #$51
|
LDA.b #$51
|
||||||
LDY.b #$01
|
LDY.b #$01
|
||||||
RTL
|
RTL
|
||||||
@@ -261,14 +281,14 @@ RTL
|
|||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DialogGanon1:
|
DialogGanon1:
|
||||||
JSL CheckGanonVulnerability
|
JSL.l CheckGanonVulnerability
|
||||||
REP #$20
|
REP #$20
|
||||||
LDA.w #$018C
|
LDA.w #$018C
|
||||||
BCC +
|
BCC +
|
||||||
LDA.w #$016D
|
LDA.w #$016D
|
||||||
+ STA.w TextID
|
+ STA $1CF0
|
||||||
SEP #$20
|
SEP #$20
|
||||||
JSL Sprite_ShowMessageMinimal_Alt
|
JSL.l Sprite_ShowMessageMinimal_Alt
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
; #$0192 - no bow
|
; #$0192 - no bow
|
||||||
@@ -280,45 +300,75 @@ RTL
|
|||||||
; s = silver arrow bow
|
; s = silver arrow bow
|
||||||
; p = 2nd progressive bow
|
; p = 2nd progressive bow
|
||||||
DialogGanon2:
|
DialogGanon2:
|
||||||
JSL CheckGanonVulnerability
|
JSL.l CheckGanonVulnerability
|
||||||
|
|
||||||
REP #$20
|
REP #$20
|
||||||
BCS +
|
BCS +
|
||||||
LDA.w #$018D : BRA ++
|
LDA.w #$018D : JMP .done
|
||||||
+
|
+
|
||||||
LDA.l BowTracking
|
LDA.l GanonVulnerabilityItem : AND #$00FF : BNE .special_item
|
||||||
|
LDA.l SpecialWeapons : AND.w #$00FF
|
||||||
|
CMP.w #$0001 : BEQ .bombs ; bombs if special bomb mode
|
||||||
|
.silver_arrows
|
||||||
|
LDA.l BowTracking
|
||||||
|
|
||||||
BIT.w #$0080 : BNE + ; branch if bow
|
BIT.w #$0080 : BNE + ; branch if bow
|
||||||
LDA.w #$0192 : BRA ++
|
LDA.w #$0192 : JMP .done
|
||||||
+
|
+
|
||||||
BIT.w #$0040 : BEQ + ; branch if no silvers
|
BIT.w #$0040 : BEQ + ; branch if no silvers
|
||||||
LDA.w #$0195 : BRA ++
|
LDA.w #$0195 : JMP .done
|
||||||
+
|
+
|
||||||
BIT.w #$0020 : BNE + ; branch if p bow
|
BIT.w #$0020 : BNE + ; branch if p bow
|
||||||
LDA.w #$0194 : BRA ++
|
LDA.w #$0194 : JMP .done
|
||||||
+
|
+
|
||||||
BIT.w #$0080 : BEQ + ; branch if no bow
|
BIT.w #$0080 : BEQ + ; branch if no bow
|
||||||
LDA.w #$0193 : BRA ++
|
LDA.w #$0193 : JMP .done
|
||||||
+
|
+
|
||||||
LDA.w #$016E
|
LDA.w #$016E : JMP .done
|
||||||
++
|
.special_item
|
||||||
STA.w TextID
|
CMP.w #$0001 : BEQ .silver_arrows
|
||||||
SEP #$20
|
CMP.w #$0004 : BEQ .bombs
|
||||||
JSL Sprite_ShowMessageMinimal_Alt
|
CMP.w #$0005 : BEQ .powder
|
||||||
|
CMP.w #$0010 : BEQ .bee
|
||||||
|
PHX : TAX
|
||||||
|
LDA.l EquipmentWRAM-1, X : PLX : AND #$00FF : BNE +
|
||||||
|
LDA.w #$0192 : JMP .done
|
||||||
|
+
|
||||||
|
LDA.w #$0195 : BRA .done
|
||||||
|
.bombs
|
||||||
|
LDA.l BombsEquipment : AND #$00FF : BNE +
|
||||||
|
LDA.l InfiniteBombsModifier : AND #$00FF : BNE + ; check for infinite bombs
|
||||||
|
LDA.w #$0192 : BRA .done
|
||||||
|
+
|
||||||
|
LDA.w #$0195 : BRA .done
|
||||||
|
.powder
|
||||||
|
LDA.l InventoryTracking : AND #$0010 : BNE + ; check for powder
|
||||||
|
LDA.w #$0192 : BRA .done
|
||||||
|
+
|
||||||
|
LDA.w #$0195 : BRA .done
|
||||||
|
.bee
|
||||||
|
LDA.l BottleContentsOne : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
|
||||||
|
LDA.l BottleContentsTwo : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
|
||||||
|
LDA.l BottleContentsThree : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
|
||||||
|
LDA.l BottleContentsFour : AND #$00FF : CMP.w #$0007 : BEQ + : CMP.w #$0008 : BEQ +
|
||||||
|
LDA.w #$0192 : BRA .done
|
||||||
|
+
|
||||||
|
LDA.w #$0195 : BRA .done
|
||||||
|
.done
|
||||||
|
STA $1CF0
|
||||||
|
SEP #$20
|
||||||
|
JSL.l Sprite_ShowMessageMinimal_Alt
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DialogEtherTablet:
|
DialogEtherTablet:
|
||||||
PHA
|
PHA
|
||||||
LDA.w ItemCursor : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped
|
LDA $0202 : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped
|
||||||
-
|
-
|
||||||
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
|
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
|
||||||
+
|
+
|
||||||
BIT.b Joy1A_New : BVC - ; Show normal text if Y is not pressed
|
BIT $F4 : BVC - ; Show normal text if Y is not pressed
|
||||||
LDA.l AllowHammerTablets : BEQ ++
|
JSL CheckTabletSword : BMI .yesText
|
||||||
LDA.l HammerEquipment : BEQ .yesText : BRA .noText
|
CMP.b #$02 : !BGE .noText
|
||||||
++
|
|
||||||
LDA.l SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : BCS .noText
|
|
||||||
;++
|
|
||||||
.yesText
|
.yesText
|
||||||
PLA
|
PLA
|
||||||
LDA.b #$0C
|
LDA.b #$0C
|
||||||
@@ -331,16 +381,13 @@ RTL
|
|||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DialogBombosTablet:
|
DialogBombosTablet:
|
||||||
PHA
|
PHA
|
||||||
LDA.w ItemCursor : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped
|
LDA $0202 : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped
|
||||||
-
|
-
|
||||||
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
|
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
|
||||||
+
|
+
|
||||||
BIT.b Joy1A_New : BVC - ; Show normal text if Y is not pressed
|
BIT $F4 : BVC - ; Show normal text if Y is not pressed
|
||||||
LDA.l AllowHammerTablets : BEQ ++
|
JSL CheckTabletSword : BMI .yesText
|
||||||
LDA.l HammerEquipment : BEQ .yesText : BRA .noText
|
CMP.b #$02 : !BGE .noText
|
||||||
++
|
|
||||||
LDA.l SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : !BGE .noText
|
|
||||||
;++
|
|
||||||
.yesText
|
.yesText
|
||||||
PLA
|
PLA
|
||||||
LDA.b #$0D
|
LDA.b #$0D
|
||||||
@@ -352,26 +399,26 @@ DialogBombosTablet:
|
|||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DialogSahasrahla:
|
DialogSahasrahla:
|
||||||
LDA.l PendantsField : AND.b #$04 : BEQ + ;Check if player has green pendant
|
LDA.l PendantsField : AND #$04 : BEQ + ;Check if player has green pendant
|
||||||
LDA.b #$2F
|
LDA.b #$2F
|
||||||
LDY.b #$00
|
LDY.b #$00
|
||||||
JML Sprite_ShowMessageUnconditional
|
JML Sprite_ShowMessageUnconditional
|
||||||
+
|
+
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
DialogBombShopGuy:
|
DialogBombShopGuy:
|
||||||
LDY.b #$15
|
LDY.b #$15
|
||||||
LDA.l CrystalsField : AND.b #$05 : CMP.b #$05 : BNE + ;Check if player has crystals 5 & 6
|
LDA.l CrystalsField : AND #$05 : CMP #$05 : BNE + ;Check if player has crystals 5 & 6
|
||||||
INY ; from 15 to 16
|
INY ; from 15 to 16
|
||||||
+
|
+
|
||||||
TYA
|
TYA
|
||||||
LDY.b #$01
|
LDY.b #$01
|
||||||
JSL Sprite_ShowMessageUnconditional
|
JSL.l Sprite_ShowMessageUnconditional
|
||||||
RTL
|
RTL
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
;---------------------------------------------------------------------------------------------------
|
||||||
AgahnimAsksAboutPed:
|
AgahnimAsksAboutPed:
|
||||||
LDA.l GanonVulnerableMode
|
LDA.l InvincibleGanon
|
||||||
CMP.b #$06 : BNE .vanilla
|
CMP.b #$06 : BNE .vanilla
|
||||||
|
|
||||||
LDA.l OverworldEventDataWRAM+$80 ; check ped flag
|
LDA.l OverworldEventDataWRAM+$80 ; check ped flag
|
||||||
@@ -379,54 +426,54 @@ AgahnimAsksAboutPed:
|
|||||||
BNE .vanilla
|
BNE .vanilla
|
||||||
|
|
||||||
LDA.b #$8C ; message 018C for no ped
|
LDA.b #$8C ; message 018C for no ped
|
||||||
STA.w TextID
|
STA.w $1CF0
|
||||||
|
|
||||||
.vanilla
|
.vanilla
|
||||||
JML Sprite_ShowMessageMinimal
|
JML $05FA8E ; Sprite_ShowMessageMinimal
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
Main_ShowTextMessage_Alt:
|
Main_ShowTextMessage_Alt:
|
||||||
; Are we in text mode? If so then end the routine.
|
; Are we in text mode? If so then end the routine.
|
||||||
LDA.b GameMode : CMP.b #$0E : BEQ .already_in_text_mode
|
LDA $10 : CMP.b #$0E : BEQ .already_in_text_mode
|
||||||
Sprite_ShowMessageMinimal_Alt:
|
Sprite_ShowMessageMinimal_Alt:
|
||||||
STZ.b GameSubMode
|
STZ $11
|
||||||
|
|
||||||
PHX : PHY
|
PHX : PHY
|
||||||
PEI.b (Scrap00)
|
PEI ($00)
|
||||||
LDA.b Scrap02 : PHA
|
LDA.b $02 : PHA
|
||||||
|
|
||||||
LDA.b #$1C : STA.b Scrap02
|
LDA.b #$1C : STA.b $02
|
||||||
REP #$30
|
REP #$30
|
||||||
LDA.w TextID : ASL : TAX
|
LDA.w $1CF0 : ASL : TAX
|
||||||
LDA.l $7F71C0, X
|
LDA.l $7F71C0, X
|
||||||
STA.b Scrap00
|
STA.b $00
|
||||||
SEP #$30
|
SEP #$30
|
||||||
|
|
||||||
LDY.b #$00
|
LDY.b #$00
|
||||||
LDA.b [Scrap00], Y : CMP.b #$FE : BNE +
|
LDA [$00], Y : CMP.b #$FE : BNE +
|
||||||
INY : LDA.b [Scrap00], Y : CMP.b #$6E : BNE +
|
INY : LDA [$00], Y : CMP.b #$6E : BNE +
|
||||||
INY : LDA.b [Scrap00], Y : : BNE +
|
INY : LDA [$00], Y : : BNE +
|
||||||
INY : LDA.b [Scrap00], Y : CMP.b #$FE : BNE +
|
INY : LDA [$00], Y : CMP.b #$FE : BNE +
|
||||||
INY : LDA.b [Scrap00], Y : CMP.b #$6B : BNE +
|
INY : LDA [$00], Y : CMP.b #$6B : BNE +
|
||||||
INY : LDA.b [Scrap00], Y : CMP.b #$04 : BNE +
|
INY : LDA [$00], Y : CMP.b #$04 : BNE +
|
||||||
STZ.w MessageCursor
|
STZ $1CE8
|
||||||
JMP .end
|
JMP .end
|
||||||
+
|
+
|
||||||
|
|
||||||
STZ.w MessageJunk ; Otherwise set it so we are in text mode.
|
STZ $0223 ; Otherwise set it so we are in text mode.
|
||||||
STZ.w MessageSubModule
|
STZ $1CD8 ; Initialize the step in the submodule
|
||||||
|
|
||||||
; Go to text display mode (as opposed to maps, etc)
|
; Go to text display mode (as opposed to maps, etc)
|
||||||
LDA.b #$02 : STA.b GameSubMode
|
LDA.b #$02 : STA $11
|
||||||
|
|
||||||
; Store the current module in the temporary location.
|
; Store the current module in the temporary location.
|
||||||
LDA.b GameMode : STA.w GameModeCache
|
LDA $10 : STA $010C
|
||||||
|
|
||||||
; Switch the main module ($10) to text mode.
|
; Switch the main module ($10) to text mode.
|
||||||
LDA.b #$0E : STA.b GameMode
|
LDA.b #$0E : STA $10
|
||||||
.end
|
.end
|
||||||
PLA : STA.b Scrap02
|
PLA : STA.b $02
|
||||||
PLA : STA.b Scrap01
|
PLA : STA.b $01
|
||||||
PLA : STA.b Scrap00
|
PLA : STA.b $00
|
||||||
PLY : PLX
|
PLY : PLX
|
||||||
|
|
||||||
Main_ShowTextMessage_Alt_already_in_text_mode:
|
Main_ShowTextMessage_Alt_already_in_text_mode:
|
||||||
@@ -438,15 +485,15 @@ CalculateSignIndex:
|
|||||||
; And we do this in a way that will likely give the right value even
|
; And we do this in a way that will likely give the right value even
|
||||||
; with major glitches.
|
; with major glitches.
|
||||||
|
|
||||||
LDA.b OverworldIndex : ASL A : TAY ;what we wrote over
|
LDA $8A : ASL A : TAY ;what we wrote over
|
||||||
|
|
||||||
LDA.w OWScreenSize : BEQ .done ; If a small map, we can skip these calculations.
|
LDA $0712 : BEQ .done ; If a small map, we can skip these calculations.
|
||||||
|
|
||||||
LDA.b LinkPosY+1 : AND.w #$0002 : ASL #2 : EOR.b OverworldIndex : AND.w #$0008 : BEQ +
|
LDA $21 : AND.w #$0002 : ASL #2 : EOR $8A : AND.w #$0008 : BEQ +
|
||||||
TYA : !ADD.w #$0010 : TAY ;add 16 if we are in lower half of big screen.
|
TYA : !ADD.w #$0010 : TAY ;add 16 if we are in lower half of big screen.
|
||||||
+
|
+
|
||||||
|
|
||||||
LDA.b LinkPosX+1 : AND.w #$0002 : LSR : EOR.b OverworldIndex : AND.w #$0001 : BEQ +
|
LDA $23 : AND.w #$0002 : LSR : EOR $8A : AND.w #$0001 : BEQ +
|
||||||
TYA : INC #2 : TAY ;add 16 if we are in lower half of big screen.
|
TYA : INC #2 : TAY ;add 16 if we are in lower half of big screen.
|
||||||
+
|
+
|
||||||
; ensure even if things go horribly wrong, we don't read the sign out of bounds and crash:
|
; ensure even if things go horribly wrong, we don't read the sign out of bounds and crash:
|
||||||
@@ -455,112 +502,6 @@ CalculateSignIndex:
|
|||||||
.done
|
.done
|
||||||
RTL
|
RTL
|
||||||
|
|
||||||
;================================================================
|
|
||||||
; Contributor: Myramong
|
|
||||||
;================================================================
|
|
||||||
Sprite_ShowSolicitedMessageIfPlayerFacing_Alt:
|
|
||||||
{
|
|
||||||
STA.w TextID
|
|
||||||
STY.w TextID+1
|
|
||||||
|
|
||||||
JSL Sprite_CheckDamageToPlayerSameLayerLong : BCC .alpha
|
|
||||||
JSL Sprite_CheckIfPlayerPreoccupied : BCS .alpha
|
|
||||||
|
|
||||||
LDA.b Joy1B_New : BPL .alpha
|
|
||||||
LDA.w SpriteTimerE, X : BNE .alpha
|
|
||||||
LDA.b LinkJumping : CMP.b #$02 : BEQ .alpha
|
|
||||||
|
|
||||||
JSL Sprite_DirectionToFacePlayerLong : PHX : TYX
|
|
||||||
|
|
||||||
; Make sure that the sprite is facing towards the player, otherwise
|
|
||||||
; talking can't happen. (What sprites actually use this???)
|
|
||||||
LDA.l Sprite_ShowSolicitedMessage_Direction, X : PLX : CMP.b LinkDirection : BNE .not_facing_each_other
|
|
||||||
|
|
||||||
PHY
|
|
||||||
|
|
||||||
LDA.w TextID
|
|
||||||
LDY.w TextID+1
|
|
||||||
|
|
||||||
; Check what room we're in so we know which npc we're talking to
|
|
||||||
LDA.b RoomIndex
|
|
||||||
CMP.b #$05 : BEQ .SahasrahlaDialogs
|
|
||||||
CMP.b #$1C : BEQ .BombShopGuyDialog
|
|
||||||
BRA .SayNothing
|
|
||||||
|
|
||||||
.SahasrahlaDialogs
|
|
||||||
REP #$20 : LDA.l MapReveal_Sahasrahla : ORA.l MapOverlay : STA.l MapOverlay : SEP #$20
|
|
||||||
JSL DialogSahasrahla : BRA .SayNothing
|
|
||||||
|
|
||||||
.BombShopGuyDialog
|
|
||||||
REP #$20 : LDA.l MapReveal_BombShop : ORA.l MapOverlay : STA.l MapOverlay : SEP #$20
|
|
||||||
JSL DialogBombShopGuy
|
|
||||||
|
|
||||||
.SayNothing
|
|
||||||
|
|
||||||
LDA.b #$40 : STA.w SpriteTimerE, X
|
|
||||||
|
|
||||||
PLA : EOR.b #$03
|
|
||||||
|
|
||||||
SEC
|
|
||||||
|
|
||||||
RTL
|
|
||||||
|
|
||||||
.not_facing_each_other
|
|
||||||
.alpha
|
|
||||||
|
|
||||||
LDA.w SpriteMoveDirection, X
|
|
||||||
|
|
||||||
CLC
|
|
||||||
|
|
||||||
RTL
|
|
||||||
}
|
|
||||||
;================================================================
|
|
||||||
Sprite_ShowSolicitedMessageIfPlayerFacing_PreserveMessage:
|
|
||||||
{
|
|
||||||
PHY
|
|
||||||
PHA
|
|
||||||
|
|
||||||
JSL Sprite_CheckDamageToPlayerSameLayerLong : BCC .alpha
|
|
||||||
JSL Sprite_CheckIfPlayerPreoccupied : BCS .alpha
|
|
||||||
|
|
||||||
LDA.b Joy1B_New : BPL .alpha
|
|
||||||
LDA.w SpriteTimerE, X : BNE .alpha
|
|
||||||
LDA.b LinkJumping : CMP.b #$02 : BEQ .alpha
|
|
||||||
|
|
||||||
JSL Sprite_DirectionToFacePlayerLong : PHX : TYX
|
|
||||||
|
|
||||||
; Make sure that the sprite is facing towards the player, otherwise
|
|
||||||
; talking can't happen. (What sprites actually use this???)
|
|
||||||
LDA.l Sprite_ShowSolicitedMessage_Direction, X : PLX : CMP.b LinkDirection : BNE .not_facing_each_other
|
|
||||||
|
|
||||||
PLA : XBA : PLA
|
|
||||||
|
|
||||||
PHY
|
|
||||||
|
|
||||||
TAY : XBA
|
|
||||||
|
|
||||||
JSL Sprite_ShowMessageUnconditional
|
|
||||||
|
|
||||||
LDA.b #$40 : STA.w SpriteTimerE, X
|
|
||||||
|
|
||||||
PLA : EOR.b #$03
|
|
||||||
|
|
||||||
SEC
|
|
||||||
|
|
||||||
RTL
|
|
||||||
|
|
||||||
.not_facing_each_other
|
|
||||||
.alpha
|
|
||||||
PLY
|
|
||||||
PLA
|
|
||||||
|
|
||||||
LDA.w SpriteMoveDirection, X
|
|
||||||
|
|
||||||
CLC
|
|
||||||
|
|
||||||
RTL
|
|
||||||
}
|
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
; A0 - A9 - 0 - 9
|
; A0 - A9 - 0 - 9
|
||||||
; AA - C3 - A - Z
|
; AA - C3 - A - Z
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
StoreLastOverworldDoorID:
|
StoreLastOverworldDoorID:
|
||||||
TXA : INC
|
TXA : INC
|
||||||
STA.l PreviousOverworldDoor
|
STA $7F5099
|
||||||
LDA.l Overworld_Entrance_ID, X : STA.w EntranceIndex
|
LDA $1BBB73, X : STA $010E
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -16,14 +16,14 @@ RTL
|
|||||||
; CacheDoorFrameData
|
; CacheDoorFrameData
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
CacheDoorFrameData:
|
CacheDoorFrameData:
|
||||||
LDA.l PreviousOverworldDoor : BEQ .originalBehaviour
|
LDA $7F5099 : BEQ .originalBehaviour
|
||||||
DEC : ASL : TAX
|
DEC : ASL : TAX
|
||||||
LDA.l EntranceDoorFrameTable, X : STA.w TileMapEntranceDoors
|
LDA EntranceDoorFrameTable, X : STA $0696
|
||||||
LDA.l EntranceAltDoorFrameTable, X : STA.w TileMapTile32
|
LDA EntranceAltDoorFrameTable, X : STA $0698
|
||||||
BRA .done
|
BRA .done
|
||||||
.originalBehaviour
|
.originalBehaviour
|
||||||
LDA.w $D724, X : STA.w TileMapEntranceDoors
|
LDA $D724, X : STA $0696
|
||||||
STZ.w TileMapTile32
|
STZ $0698
|
||||||
.done
|
.done
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
@@ -32,59 +32,8 @@ RTL
|
|||||||
; WalkDownIntoTavern
|
; WalkDownIntoTavern
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
WalkDownIntoTavern:
|
WalkDownIntoTavern:
|
||||||
LDA.l PreviousOverworldDoor
|
LDA $7F5099
|
||||||
; tavern door has index 0x42 (saved off value is incremented by one)
|
; tavern door has index 0x42 (saved off value is incremented by one)
|
||||||
CMP.b #$43
|
CMP #$43
|
||||||
RTL
|
RTL
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
; TurnAroundOnUnderworld
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
TurnAroundOnUnderworld:
|
|
||||||
LDA.b LinkPushDirection : BEQ .done
|
|
||||||
; turn around if ($010E == #$43) != ($7F5099 == #$43)
|
|
||||||
LDX.b #$00
|
|
||||||
LDA.b #$43 : CMP.w EntranceIndex : BEQ +
|
|
||||||
INX
|
|
||||||
+
|
|
||||||
CMP.l PreviousOverworldDoor : BEQ +
|
|
||||||
DEX
|
|
||||||
+
|
|
||||||
CPX.b #$00 : BEQ .done
|
|
||||||
LDA.b LinkPushDirection : EOR.b #$0C : STA.b LinkPushDirection
|
|
||||||
.done
|
|
||||||
JML Underworld_LoadCustomTileAttributes ; what we overwrote
|
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
; TurnUpOnOverworld
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
TurnUpOnOverworld:
|
|
||||||
LDA.l EntranceTavernBack : CMP.b #$43 : BEQ .done
|
|
||||||
LDA.b #$08 : STA.b LinkPushDirection ; only fix this glitch if exit not vanilla
|
|
||||||
.done
|
|
||||||
JML Link_HandleMovingAnimation_FullLongEntry ; what we overwrote
|
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
; WalkUpOnOverworld
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
WalkUpOnOverworld:
|
|
||||||
LDA.b LinkPosY : CMP.w #$091B : BNE .normal ; hardcoded Y coordinate
|
|
||||||
STZ.b LinkDirection
|
|
||||||
RTL
|
|
||||||
.normal
|
|
||||||
LDA.w #$0002 : STA.b LinkDirection ; what we overwrote
|
|
||||||
RTL
|
|
||||||
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
; CheckStairsAdjustment
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
CheckStairsAdjustment:
|
|
||||||
LDA.b RoomIndex
|
|
||||||
CMP.w #$0124 ; vanilla check, rooms $0124 to $0127 have a lower exit position (currently ER ignores the entrance location)
|
|
||||||
BCC .done
|
|
||||||
LDA.w #$FFFF-1
|
|
||||||
CMP.w TileMapEntranceDoors ; tavern back ($0696 == #$FFFF) should always have carry cleared
|
|
||||||
.done
|
|
||||||
RTL
|
|
||||||
; if carry cleared, shift position up
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
pushpc
|
|
||||||
|
|
||||||
org $9E9463
|
|
||||||
JSL CheckKholdShellCoordinates
|
|
||||||
BCC Sprite_A3_KholdstareShell_link_not_close
|
|
||||||
BRA Sprite_A3_KholdstareShell_link_close
|
|
||||||
NOP #13
|
|
||||||
|
|
||||||
Sprite_A3_KholdstareShell_link_close = $9E9478
|
|
||||||
Sprite_A3_KholdstareShell_link_not_close = $9E9480
|
|
||||||
|
|
||||||
pullpc
|
|
||||||
|
|
||||||
CheckKholdShellCoordinates:
|
|
||||||
|
|
||||||
LDA.w SpritePosXHigh, X
|
|
||||||
XBA
|
|
||||||
LDA.w SpritePosXLow, X ; full 16 bit X coordinate of sprite
|
|
||||||
|
|
||||||
REP #$21 ; carry is guaranteed clear
|
|
||||||
SBC.w #$0020
|
|
||||||
CMP.b LinkPosX
|
|
||||||
BCS .not_colliding
|
|
||||||
|
|
||||||
ADC.w #$0040 ; carry is guaranteed clear
|
|
||||||
CMP.b LinkPosX
|
|
||||||
BCC .not_colliding
|
|
||||||
|
|
||||||
SEP #$20
|
|
||||||
LDA.w SpritePosYHigh, X
|
|
||||||
XBA
|
|
||||||
LDA.w SpritePosYLow, X ; full 16 bit Y coordinate of sprite
|
|
||||||
|
|
||||||
REP #$21 ; carry is guaranteed clear
|
|
||||||
SBC.w #$001F ; could go to 27 and still let link squeeze in
|
|
||||||
CMP.b LinkPosY
|
|
||||||
BCS .not_colliding
|
|
||||||
|
|
||||||
ADC.w #$0037 ; carry is guaranteed clear
|
|
||||||
CMP.b LinkPosY
|
|
||||||
BCC .not_colliding
|
|
||||||
|
|
||||||
SEP #$20 ; collision detected
|
|
||||||
SEC
|
|
||||||
RTL
|
|
||||||
|
|
||||||
.not_colliding
|
|
||||||
SEP #$30
|
|
||||||
CLC
|
|
||||||
RTL
|
|
||||||
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
; Free RAM notes
|
|
||||||
; Normal doors use $AB-AC for scrolling indicator
|
|
||||||
; Normal doors use $FE to store the trap door indicator
|
|
||||||
; Normal doors use $045e to store Y coordinate when transitioning to in-room stairs
|
|
||||||
; Normal doors use $045f to determine the order in which supertile quadrants are drawn
|
|
||||||
; Straight stairs use $046d to store X coordinate on animation start
|
|
||||||
; Spiral doors use $045e to store stair type
|
|
||||||
; Gfx uses $b1 to for sub-sub-sub-module thing
|
|
||||||
|
|
||||||
; Hooks into various routines
|
|
||||||
incsrc drhooks.asm
|
|
||||||
|
|
||||||
;Main Code
|
|
||||||
org $A78000 ;138000
|
|
||||||
db $44, $52 ;DR
|
|
||||||
DRMode:
|
|
||||||
dw 0
|
|
||||||
; xxpg rmse
|
|
||||||
; xxxx xBDM
|
|
||||||
; x - unused
|
|
||||||
|
|
||||||
; p - use the original palette for the dungeon rooms instead of the DR table
|
|
||||||
; g - fix the EG glitch in more places (should be off for no logic)
|
|
||||||
; r - The collection rate flag
|
|
||||||
; m - Whether to display keys Map Info
|
|
||||||
; s - Start with Mirror Scroll
|
|
||||||
; e - GT minibosses marked as defeated instead of spawning heart container in all dungeons
|
|
||||||
|
|
||||||
; B - Big Key doors can displayed and be opened on the "south" side in addition
|
|
||||||
; D - Enabled spawning as a bunny in the Dark World underworld
|
|
||||||
; M - hides the total number in the collection rate
|
|
||||||
DRFlags:
|
|
||||||
dw 0
|
|
||||||
DRScroll:
|
|
||||||
db 0
|
|
||||||
OffsetTable:
|
|
||||||
dw -8, 8
|
|
||||||
org $A78010
|
|
||||||
DRVersionInfo:
|
|
||||||
dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000
|
|
||||||
|
|
||||||
org $A78020
|
|
||||||
|
|
||||||
incsrc normal.asm
|
|
||||||
incsrc scroll.asm
|
|
||||||
incsrc spiral.asm
|
|
||||||
incsrc gfx.asm
|
|
||||||
incsrc keydoors.asm
|
|
||||||
incsrc overrides.asm
|
|
||||||
incsrc edges.asm
|
|
||||||
incsrc math.asm
|
|
||||||
incsrc hudadditions.asm
|
|
||||||
incsrc dr_lobby.asm
|
|
||||||
incsrc entrance_fixes.asm
|
|
||||||
incsrc bugfix/kholdstare_shell_collision.asm
|
|
||||||
warnpc $A79C00
|
|
||||||
|
|
||||||
incsrc doortables.asm
|
|
||||||
warnpc $A88000
|
|
||||||
@@ -1,697 +0,0 @@
|
|||||||
org $A79C00
|
|
||||||
KeyDoorOffset:
|
|
||||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
|
|
||||||
dw $0000,$0001,$0003,$0000,$0006,$0000,$000b,$0000,$0000,$0000,$000c,$000d,$0010,$0011,$0012,$0000
|
|
||||||
dw $0000,$0015,$0018,$001c,$001e,$0025,$0027,$0000,$0000,$002b,$002d,$0033,$0035,$0038,$0039,$003d
|
|
||||||
dw $003f,$0040,$0043,$0045,$0047,$0000,$004f,$0000,$0053,$0000,$0055,$005b,$0000,$0000,$005f,$0000
|
|
||||||
dw $0060,$0062,$0064,$0065,$0066,$0068,$006e,$0074,$007a,$007c,$007e,$0081,$0000,$0082,$0086,$0088
|
|
||||||
dw $0089,$008a,$0000,$008b,$008e,$0092,$0096,$0000,$0000,$0099,$009d,$00a2,$00a5,$00a6,$00a8,$00aa
|
|
||||||
dw $00ab,$00ad,$00af,$00b2,$0000,$0000,$00b5,$00b9,$00bf,$00c5,$00c9,$00ca,$00cc,$00ce,$00d1,$00d5
|
|
||||||
dw $00d6,$00dc,$00e3,$00e9,$00ec,$00ed,$00ee,$00f2,$00f5,$0000,$00f7,$00f8,$00fc,$00ff,$0102,$0000
|
|
||||||
dw $0000,$0103,$0106,$0107,$010a,$010c,$010e,$0112,$0000,$0000,$0000,$0114,$0117,$011b,$011e,$0121
|
|
||||||
dw $0000,$0123,$0000,$0124,$0127,$0128,$0000,$012c,$0000,$0000,$0000,$012e,$0133,$0139,$013e,$0000
|
|
||||||
dw $013f,$0140,$0141,$0146,$0000,$0149,$014b,$014d,$014f,$0150,$0000,$0153,$0156,$015a,$015d,$0161
|
|
||||||
dw $0163,$0164,$0166,$016a,$016c,$016d,$0000,$0000,$0170,$0176,$017c,$0182,$0184,$0000,$0185,$0186
|
|
||||||
dw $0188,$018b,$018f,$0197,$019c,$019d,$019e,$01a3,$01a4,$01a6,$01aa,$01ad,$01b3,$0000,$01bb,$01be
|
|
||||||
dw $01bf,$01c2,$01ca,$01d2,$01d9,$01da,$01dd,$01e3,$01e6,$01e7,$0000,$01ec,$01ed,$0000,$01f0,$0000
|
|
||||||
dw $01f1,$01f3,$01f7,$0000,$0000,$01f8,$01fa,$0000,$01fd,$0200,$0203,$0204,$0206,$0000,$0000,$0000
|
|
||||||
dw $0207
|
|
||||||
|
|
||||||
|
|
||||||
org $A79E00
|
|
||||||
SpiralOffset:
|
|
||||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
|
|
||||||
db $00,$01,$02,$00,$03,$00,$00,$04,$00,$05,$07,$00,$08,$00,$0b,$00
|
|
||||||
db $00,$0c,$00,$00,$00,$0d,$0e,$0f,$00,$00,$11,$00,$13,$14,$15,$00
|
|
||||||
db $00,$00,$00,$00,$00,$00,$16,$19,$1b,$00,$00,$00,$00,$00,$00,$00
|
|
||||||
db $00,$1c,$00,$00,$1f,$00,$00,$00,$20,$00,$21,$00,$00,$00,$00,$22
|
|
||||||
db $23,$24,$25,$00,$00,$26,$00,$00,$00,$00,$27,$00,$29,$2a,$2b,$00
|
|
||||||
db $00,$00,$00,$2c,$2d,$00,$00,$00,$00,$00,$00,$00,$2e,$2f,$00,$30
|
|
||||||
db $00,$00,$00,$35,$36,$00,$37,$00,$00,$00,$38,$3a,$3b,$00,$3c,$00
|
|
||||||
db $3d,$40,$41,$00,$00,$00,$42,$45,$00,$00,$00,$00,$00,$00,$00,$49
|
|
||||||
db $4a,$00,$00,$00,$00,$00,$00,$4b,$00,$00,$00,$00,$4f,$00,$53,$00
|
|
||||||
db $00,$54,$00,$55,$00,$00,$00,$56,$57,$58,$00,$00,$00,$00,$59,$00
|
|
||||||
db $5a,$00,$5b,$00,$00,$5c,$5d,$00,$00,$00,$00,$5e,$00,$00,$5f,$00
|
|
||||||
db $60,$00,$00,$00,$00,$63,$64,$00,$00,$00,$00,$00,$65,$00,$66,$00
|
|
||||||
db $67,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
||||||
db $6a,$6d,$6e,$00,$00,$00,$00,$00,$00,$00,$6f,$00,$00,$00,$00,$00
|
|
||||||
db $70
|
|
||||||
|
|
||||||
org $A79F00
|
|
||||||
DoorOffset:
|
|
||||||
db $00,$01,$02,$00,$03,$00,$04,$00,$00,$00,$00,$00,$9A,$05,$99,$00
|
|
||||||
db $00,$06,$07,$08,$09,$0A,$0B,$00,$00,$0C,$0D,$0E,$00,$0F,$10,$11
|
|
||||||
db $12,$13,$14,$15,$16,$00,$17,$00,$98,$00,$18,$19,$00,$00,$1A,$00
|
|
||||||
db $1B,$00,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$25,$00,$26,$27,$00
|
|
||||||
db $96,$28,$97,$29,$2A,$2B,$2C,$00,$00,$2D,$2E,$2F,$30,$31,$32,$00
|
|
||||||
db $33,$34,$35,$36,$00,$00,$37,$38,$39,$3A,$3B,$3C,$3D,$3E,$3F,$40
|
|
||||||
db $41,$42,$43,$A0,$00,$00,$44,$45,$46,$00,$47,$48,$49,$4A,$4B,$00
|
|
||||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
|
|
||||||
db $00,$4C,$00,$00,$00,$4D,$4E,$9E,$00,$00,$00,$4F,$50,$51,$52,$53
|
|
||||||
db $00,$54,$00,$9C,$9D,$55,$00,$00,$00,$00,$00,$56,$57,$58,$59,$00
|
|
||||||
db $5A,$5B,$5C,$5D,$00,$5E,$5F,$00,$9B,$60,$00,$61,$62,$63,$64,$65
|
|
||||||
db $66,$67,$68,$69,$6A,$6B,$00,$00,$6C,$6D,$6E,$6F,$70,$00,$71,$72
|
|
||||||
db $00,$73,$74,$75,$76,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$00,$7F,$80
|
|
||||||
db $00,$81,$82,$83,$84,$85,$86,$87,$88,$89,$00,$8A,$8B,$00,$8C,$00
|
|
||||||
db $00,$8D,$8E,$00,$00,$8F,$90,$00,$91,$92,$93,$94,$95,$00,$00,$00
|
|
||||||
db $9f
|
|
||||||
|
|
||||||
org $A7A000
|
|
||||||
DoorTable:
|
|
||||||
;; NW 00 N 01 NE 02 WN 00 W 01 WS 02 SW 00 S 01 SE 02 EN 00 E 01 ES 02 - Door ruler
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Default/Garbage row
|
|
||||||
dw $0003, $0003, $0003, $0450, $0003, $0003, $0003, $0003, $0003, $0452, $0003, $0003 ; HC Back Hall (x01)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Switches (x02)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Crystaroller
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Arghus
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Aga 2
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Secret Room
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sanc
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Pokey
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Lava Pipe
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Pipes n Ledge
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swap Canal
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod dark Maze
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Bridge
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Eye Statue
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Pre Aga
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Cross
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice BK
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x20 Aga1
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Key Rat
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewer Waters
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Eye Entrance
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Chest Entrance
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Statue
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; PoD Arena (x2a)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; PoD Statue (x2b)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Compass
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x30 Aga's Altar
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Dark Cross
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Lanmolas
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp West Wing
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Flooded Key
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Main Hub (x36)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Hammer Time
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp First Basement
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Drop to the Moth
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod 3 Catwalks
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Conveyor
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Minihelma
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Conveyor
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewers
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Torches
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Big Chest
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Cellblock
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Compass Loop
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull3 Torches
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Entrance
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Pod Mimics 1
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Conveyor Ice
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Moldorm
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; IPBJ
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0401, $0003, $0003 ; HC West Hall (x50)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Throne Room (x51)
|
|
||||||
dw $0003, $0003, $0003, $0401, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC East Hall (x52)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Tiles 1
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 2 Left Entrance
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 2 Right Entrance
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 1 Entrance
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Skull 3 Entrance
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Helmasaur
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Spike Switch
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Cannonball
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Gauntlet 1
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Choice Cross
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Iced U
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC West Lobby (x60)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Main Lobby (x61)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC East Lobby (x62)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x66 Swamp Waterfall
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x67 Skull 1 Left Drop
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x68 Skull 1 Pinball
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6a Pod Rupees
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6b GT Mimics
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6c GT Lanmolas
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6d Gauntlet 2
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; x6e Ice Gators
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Armory
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert BK Chest
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Flooded Chests
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT DM's Tile
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Randoroom
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Warp Maze
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Freezors
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Hookpit
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; HC Catawalk
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Right Entrance
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Left
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Hopeful Torch
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Right
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Lonely Freezor
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Vitreous (x90)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Rain
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Dark Crystals
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Blockswitch
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Fallbridge
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Torch Cross
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Darkness
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Warp Maze 2
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Invis Bridge
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Compass Room
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Big Chests
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Icy Pots
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Pre-Vitreous (xa0)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Fishbone
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Bridges
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Corner
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Trinexx (xa4)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Wizzrobes
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Compass (xa8)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Courtyard (xa9)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Map (xaa)
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Switch
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Blind
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Iced T
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Slipway
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Warpzone
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire ????
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Spikes
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Refill
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Dark Maze
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Chainchomp
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Rollers
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Big Key
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Easter Cannonball
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Dark Circle
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Hellway
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Bossway
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Blockswitch
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Backtracker
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Tiles
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Main Hub
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Big Chest
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Switch Maze
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Narrow
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Early Hub
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Floating Torches
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Armos
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Entrance
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT NW Quad
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT NE Quad
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Boss Drop
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire BK
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire 2
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Laser Bridge
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TR Main Entrance
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Eyegores
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Attic Switches
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Eastern Attic Start
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT Entrance Quad
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; TT SE Quad
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Aga 6F
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Sewers Rope
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Swamp Lobby
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Ice Lobby
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; GT Lobby
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Mire Lobby
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert West Lobby
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Main Lobby
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Hera Lobby
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Tower Lobby
|
|
||||||
dw $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003, $0003 ; Desert Back Lobby
|
|
||||||
; this should end at 27AF18 about (160 * 24 bytes = 3840 or F18)
|
|
||||||
; some values you can hardcode for spirals
|
|
||||||
;dw $0070, $36a0 ; ->HC Stairwell
|
|
||||||
;dw $0072, $4ff8 ; ->HC Map Room
|
|
||||||
;dw $0080, $1f50 ; ->zelda's cellblock
|
|
||||||
|
|
||||||
org $A7B000
|
|
||||||
SpiralTable: ;113 4 byte entries - should end at 27B1C4
|
|
||||||
dw $0203, $8080 ;null row
|
|
||||||
dw $0203, $8080 ;HC Backhallway
|
|
||||||
dw $0203, $8080 ;Sewer Pull
|
|
||||||
dw $0203, $8080 ;Crystaroller
|
|
||||||
dw $0203, $8080 ;Moldorm
|
|
||||||
dw $0203, $8080, $0203, $8080 ;Pod Basement
|
|
||||||
dw $0203, $8080 ;Pod Stalfos
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;GT Entrance
|
|
||||||
dw $0203, $8080 ;Ice Entrance
|
|
||||||
dw $0203, $8080 ;Escape
|
|
||||||
dw $0203, $8080 ;TR Pipe Ledge
|
|
||||||
dw $0203, $8080 ;Swamp Way
|
|
||||||
dw $0203, $8080, $0203, $8080 ;Hera Fallplace
|
|
||||||
dw $0203, $8080, $0203, $8080 ;PoD Bridge
|
|
||||||
dw $0203, $8080 ;GT Ice
|
|
||||||
dw $0203, $8080 ;GT F8
|
|
||||||
dw $0203, $8080 ;Ice Cross
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Swamp Statue
|
|
||||||
dw $0203, $8080, $0203, $8080 ;Hera Big
|
|
||||||
dw $0203, $8080 ;Swamp Ent
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Hera Startiles (middle value unused)
|
|
||||||
dw $0203, $8080 ;West Swamp
|
|
||||||
dw $0203, $8080 ;Swamp Basement
|
|
||||||
dw $0203, $8080 ;Pod Drops
|
|
||||||
dw $0203, $8080 ;Ice Hammer
|
|
||||||
dw $0203, $8080 ;Aga Guards
|
|
||||||
dw $0203, $8080 ;Sewer Begin
|
|
||||||
dw $0203, $8080 ;Sewer Rope
|
|
||||||
dw $0203, $8080 ;TT Cellblock
|
|
||||||
dw $0203, $8080, $0203, $8080 ;Pod Entrance
|
|
||||||
dw $0203, $8080 ;GT Icespike
|
|
||||||
dw $0203, $8080 ;GT Moldorm
|
|
||||||
dw $0203, $8080 ;IPBJ
|
|
||||||
dw $0203, $8080 ;Desert Prep
|
|
||||||
dw $0203, $8080 ;Swamp Attic
|
|
||||||
dw $0203, $8080 ;GT Cannonball
|
|
||||||
dw $0203, $8080 ;GT Gauntlet1
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;Ice U (1st three values unused)
|
|
||||||
dw $0203, $8080 ;Desert Back
|
|
||||||
dw $0203, $8080 ;TT Attic L
|
|
||||||
dw $0203, $8080 ;Swamp Waterf
|
|
||||||
dw $0203, $8080 ;Pod Rupees
|
|
||||||
dw $0203, $8080 ;Pod Rupees
|
|
||||||
dw $0203, $8080 ;GT Mimics
|
|
||||||
dw $0203, $8080 ;GT Lanmo
|
|
||||||
dw $0203, $8080 ;Ice Gators
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;HC Tiny (first value placeholder)
|
|
||||||
dw $0203, $8080 ;HC Boomer
|
|
||||||
dw $0203, $8080 ;HC Pits1
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Swamp Sunken
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;Hera Entrance (first value unused)
|
|
||||||
dw $0203, $8080 ;Ice Hookshot
|
|
||||||
dw $0203, $8080 ;HC Cellblock
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;Hera Basement (first and third values unused)
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080, $0203, $8080 ;GT Circle (third value unused)
|
|
||||||
dw $0203, $8080 ;Ice Last Freeze
|
|
||||||
dw $0203, $8080 ;Mire Drops
|
|
||||||
dw $0203, $8080 ;Mire Block
|
|
||||||
dw $0203, $8080 ;Mire Attic
|
|
||||||
dw $0203, $8080 ;Mire Entrance
|
|
||||||
dw $0203, $8080 ;East Dark
|
|
||||||
dw $0203, $8080 ;Ice Big
|
|
||||||
dw $0203, $8080 ;Mire Previtreous
|
|
||||||
dw $0203, $8080 ;Mire Bridges
|
|
||||||
dw $0203, $8080 ;GT Wizzrobes
|
|
||||||
dw $0203, $8080 ;GT Spikepit
|
|
||||||
dw $0203, $8080 ;TT Switch
|
|
||||||
dw $0203, $8080 ;Ice T
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Tower Usains (2nd value unused)
|
|
||||||
dw $0203, $8080 ;TR PlatMaze
|
|
||||||
dw $0203, $8080 ;TR Chainchomp
|
|
||||||
dw $0203, $8080 ;TT Bossway
|
|
||||||
dw $0203, $8080 ;Ice FallZone
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Tower Dark2 (2nd value unused)
|
|
||||||
dw $0203, $8080, $0203, $8080, $0203, $8080 ;Tower Dark1 (2nd value unused)
|
|
||||||
dw $0203, $8080 ;Mire BK Thang
|
|
||||||
dw $0203, $8080 ;Mire2
|
|
||||||
dw $0203, $8080 ;East Attic Start
|
|
||||||
dw $0203, $8080 ;Tower Entrance
|
|
||||||
|
|
||||||
|
|
||||||
org $A7C000 ;ends around 27C418
|
|
||||||
PairedDoorTable:
|
|
||||||
dw $0000 ; the bad template
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
|
|
||||||
dw $0000,$0000,$8021
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $4014,$0000
|
|
||||||
dw $8024,$8013,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $201a,$401a
|
|
||||||
dw $0000,$4019,$8019,$402a,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
|
|
||||||
dw $0000
|
|
||||||
dw $2011,$0000,$0000
|
|
||||||
dw $8032,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $8014,$0000,$0000,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $4036,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$101a,$402b,$0000,$0000,$0000
|
|
||||||
dw $0000,$202a,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $8022
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $2036,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $8037,$8026,$8035,$0000,$0000,$0000
|
|
||||||
dw $8036,$8038,$0000,$4038,$0000,$0000
|
|
||||||
dw $4037,$1037
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $204a,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$804d,$0000
|
|
||||||
dw $0000,$404e
|
|
||||||
dw $0000
|
|
||||||
|
|
||||||
dw $0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$2053
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$8059,$0000
|
|
||||||
dw $0000,$0000,$803a,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $203d,$0000
|
|
||||||
dw $0000,$403e
|
|
||||||
dw $0000 ; this is the odd extra room - shouldn't be used
|
|
||||||
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$2043
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$4058,$0000,$0000,$0000
|
|
||||||
dw $0000,$2057,$4068,$0000,$0000,$0000
|
|
||||||
dw $2049,$0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $806b,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $805f,$0000,$0000,$0000
|
|
||||||
dw $805e
|
|
||||||
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$2058
|
|
||||||
dw $0000
|
|
||||||
dw $805b,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$207c,$0000
|
|
||||||
dw $0000,$407d,$407b,$0000
|
|
||||||
dw $0000,$407c,$0000
|
|
||||||
dw $808e,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $807e
|
|
||||||
|
|
||||||
dw $0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$20a9,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
|
|
||||||
dw $0000
|
|
||||||
dw $40b1,$0000
|
|
||||||
dw $80b2,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$80b8,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$4099,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000
|
|
||||||
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$80a1,$0000,$0000
|
|
||||||
dw $80a2,$0000,$0000,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$80c6,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $20a8,$0000
|
|
||||||
dw $80ba,$0000,$0000,$0000
|
|
||||||
dw $80b9,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$80cc,$0000,$40cc,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$80bf,$0000
|
|
||||||
dw $40be
|
|
||||||
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$40c2,$0000,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $80c3,$40c1,$0000,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $80c2,$0000,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $80c5
|
|
||||||
dw $80c4,$0000,$0000
|
|
||||||
dw $20b6,$0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$0000,$0000,$0000
|
|
||||||
dw $20cc
|
|
||||||
dw $40bc,$10bc,$80cb
|
|
||||||
dw $0000
|
|
||||||
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000,$0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000
|
|
||||||
dw $0000
|
|
||||||
dw $0000,$0000,$0000,$0000
|
|
||||||
dw $ffff ; indicates the end - we can drop this
|
|
||||||
|
|
||||||
; Edge Transition Table (Target Room, Flags, MultiDiv ratio for edges)
|
|
||||||
org $A7C500 ;ends around 27C5F(9) 4 bytes would be 27C649
|
|
||||||
;I kind of want to split the 3rd byte into two
|
|
||||||
NorthOpenEdge:
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
SouthOpenEdge:
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
WestOpenEdge:
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
EastOpenEdge:
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
db $00,$80,$11, $00,$80,$11, $00,$80,$11
|
|
||||||
; Edge Info Table (Midpoint, Width, Min Coord)
|
|
||||||
; I kind of want to add a fourth byte to help indicate quadrant info on min coord
|
|
||||||
NorthEdgeInfo:
|
|
||||||
db $a8,$10,$a0, $2c,$08,$28 ;HC
|
|
||||||
db $b8,$20,$a8 ; DP West Wing
|
|
||||||
db $38,$20,$28, $f8,$a0,$a8, $b8,$20,$a8 ; DP Main
|
|
||||||
db $78,$20,$68 ; DP East Wing
|
|
||||||
db $f8,$10,$f0, $7c,$18,$70 ; TT Lobby
|
|
||||||
db $74,$18,$68, $f8,$10,$f0 ; TT Compass
|
|
||||||
SouthEdgeInfo:
|
|
||||||
db $a8,$10,$a0, $2c,$08,$28 ; HC
|
|
||||||
db $b8,$20,$a8 ; DP Sandworm
|
|
||||||
db $38,$20,$28, $f8,$a0,$a8, $b8,$20,$a8 ; DP North Hall & Dead End
|
|
||||||
db $78,$20,$68 ; DP Arrow Pot
|
|
||||||
db $f8,$10,$f0, $7c,$18,$70 ; TT Ambush
|
|
||||||
db $74,$18,$68, $f8,$10,$f0 ; TT BK Corner
|
|
||||||
WestEdgeInfo:
|
|
||||||
db $78,$30,$60 ; TT Attic
|
|
||||||
db $40,$20,$30 ; DP North Hall
|
|
||||||
db $40,$20,$30 ; DP Arrow Pot
|
|
||||||
db $84,$18,$78, $68,$10,$60 ; HC South
|
|
||||||
db $a0,$a0,$50 ; DP East Wing
|
|
||||||
db $58,$50,$30, $98,$50,$70 ; TT BK Corner
|
|
||||||
db $58,$50,$30 ; TT Compass
|
|
||||||
EastEdgeInfo:
|
|
||||||
db $78,$30,$60 ; TT Attic
|
|
||||||
db $40,$20,$30 ; DP Sandworm
|
|
||||||
db $40,$20,$30 ; DP North Hall
|
|
||||||
db $68,$10,$60, $84,$18,$78 ; HC Guards
|
|
||||||
db $a0,$a0,$50 ; DP Main Lobby
|
|
||||||
db $58,$50,$30, $98,$50,$70 ; TT Ambush
|
|
||||||
db $58,$50,$30 ; TT Nook
|
|
||||||
MultDivInfo: ; (1, 2, 3, 4, 5, 6, 10, 20)
|
|
||||||
db $01, $02, $03, $04, $05, $06, $0a, $14
|
|
||||||
; indices: 0-7
|
|
||||||
|
|
||||||
; In-room stairs in North/South pairs. From left to right:
|
|
||||||
; PoD, IP right side, IP Freezor chest and GT
|
|
||||||
org $A7C700
|
|
||||||
InroomStairsTable:
|
|
||||||
dw $0003,$0003, $0003,$0003, $0003,$0003, $0003,$0003
|
|
||||||
|
|
||||||
org $A7C720
|
|
||||||
InroomStairsRoom:
|
|
||||||
db $0B,$1B, $3F,$1F, $7E,$5E, $96,$3D
|
|
||||||
InroomStairsX:
|
|
||||||
dw $0190, $0160, $0040, $0178
|
|
||||||
InroomStairsY:
|
|
||||||
dw $0058, $0148, $0198, $0190
|
|
||||||
|
|
||||||
|
|
||||||
org $A7E000
|
|
||||||
CutoffRooms:
|
|
||||||
; TT Alcove, Mire Bridge Left & Right, Mire Bent Bridge, Mire Hub
|
|
||||||
; Pod Falling & Harmless, SW Star Pits, TR Lava Escape & TR Dual Pipes, Bob's Room & GT Big Chest
|
|
||||||
dw $00bc, $00a2, $00a3, $00c2, $001a, $0049, $0014, $008c
|
|
||||||
; Ice Many Pots, Swamp Waterfall, GT Gauntlet 3, Eastern Push Block, Eastern Courtyard, Eastern Map Valley
|
|
||||||
; Eastern Cannonball, HC East Hall
|
|
||||||
dw $009f, $0066, $005d, $00a8, $00a9, $00aa, $00b9, $0052
|
|
||||||
; HC West Hall, TR Dash Bridge, TR Hub, Pod Arena, GT Petting Zoo, Ice Spike Cross
|
|
||||||
dw $0050, $00c5, $00c6, $0009, $0003, $002a, $007d, $005e
|
|
||||||
; Sewer Drop, Mire Cross, GT Crystal Circles
|
|
||||||
dw $0011, $00b2, $003d
|
|
||||||
dw $ffff
|
|
||||||
|
|
||||||
; dungeon tables
|
|
||||||
; HC HC EP DP AT SP PD MM SW IP TH TT TR GT
|
|
||||||
org $A7f000
|
|
||||||
CompassBossIndicator:
|
|
||||||
dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000
|
|
||||||
TotalKeys: ;27f020
|
|
||||||
db $04, $04, $02, $04, $04, $06, $06, $06, $05, $06, $01, $03, $06, $08, $00, $00
|
|
||||||
skip $10
|
|
||||||
;ChestKeys: ;27f030 - moved to B0F010
|
|
||||||
;db $01, $01, $00, $01, $02, $01, $06, $03, $03, $02, $01, $01, $04, $04, $00, $00
|
|
||||||
BigKeyStatus: ;27f040 (status 2 indicate BnC guard)
|
|
||||||
dw $0002, $0002, $0001, $0001, $0000, $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0001, $0000, $0000
|
|
||||||
DungeonReminderTable: ;27f060
|
|
||||||
dw $2D50, $2D50, $2D51, $2D52, $2D54, $2D56, $2D55, $2D5A, $2D57, $2D59, $2D53, $2D58, $2D5B, $2D5C, $0000, $0000
|
|
||||||
TotalLocationsLow: ;27f080
|
|
||||||
db $08, $08, $06, $06, $02, $00, $04, $08, $08, $08, $06, $08, $02, $07, $00, $00
|
|
||||||
TotalLocationsHigh: ;27f090
|
|
||||||
db $00, $00, $00, $00, $00, $01, $01, $00, $00, $00, $00, $00, $01, $02, $00, $00
|
|
||||||
org $A7f0a0
|
|
||||||
TotalLocations:
|
|
||||||
db $08, $08, $06, $06, $02, $0a, $0e, $08, $08, $08, $06, $08, $0c, $1b, $00, $00
|
|
||||||
; no more room here
|
|
||||||
|
|
||||||
; Vert 0,6,0 Horz 2,0,8
|
|
||||||
org $A7f0b0
|
|
||||||
CoordIndex: ; Horizontal 1st
|
|
||||||
db 2, 0 ; Coordinate Index $20-$23
|
|
||||||
OppCoordIndex:
|
|
||||||
db 0, 2 ; Swapped coordinate Index $20-$23 (minor optimization)
|
|
||||||
CameraIndex: ; Horizontal 1st
|
|
||||||
db 0, 6 ; Camera Index $e2-$ea
|
|
||||||
CamQuadIndex: ; Horizontal 1st
|
|
||||||
db 8, 0 ; Camera quadrants $600-$60f
|
|
||||||
ShiftQuadIndex:
|
|
||||||
db 2, 1 ; see ShiftQuad func (relates to $a9,$aa)
|
|
||||||
CamBoundIndex: ; Horizontal 1st
|
|
||||||
db 0, 4 ; Camera Bounds $0618-$61f
|
|
||||||
OppCamBoundIndex: ; Horizontal 1st
|
|
||||||
db 4, 0 ; Camera Bounds $0618-$61f
|
|
||||||
CamBoundBaseLine: ; X camera stuff is 1st column todo Y camera needs more testing
|
|
||||||
dw $007f, $0077 ; Left/Top camera bounds when at edge or layout frozen
|
|
||||||
dw $0007, $000b ; Left/Top camera bounds when not frozen + appropriate low byte $22/$20 (preadj. by #$78/#$6c)
|
|
||||||
dw $00ff, $010b ; Right/Bot camera bounds when not frozen + appropriate low byte $20/$22
|
|
||||||
dw $017f, $0187 ; Right/Bot camera bound when at edge or layout frozen
|
|
||||||
;27f0ce next free byte
|
|
||||||
|
|
||||||
org $A7f0f0
|
|
||||||
RemoveRainDoorsRoom:
|
|
||||||
dw $0060, $0062, $ffff ; ffff indicates end of list
|
|
||||||
RainDoorMatch: ; org $A7f0f6 and f8 for now
|
|
||||||
dw $0081, $0061 ; not xba'd
|
|
||||||
BlockSanctuaryDoorInRain: ;27f0fa
|
|
||||||
dw $0000
|
|
||||||
|
|
||||||
|
|
||||||
org $A7f100
|
|
||||||
TilesetTable:
|
|
||||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
|
|
||||||
db $13,$04,$04,$06,$0d,$ff,$08,$05,$06,$07,$07,$07,$0e,$0e,$0b,$ff
|
|
||||||
db $13,$04,$04,$0d,$0d,$0d,$08,$05,$06,$07,$07,$07,$0e,$0e,$0b,$0b
|
|
||||||
db $04,$04,$04,$0d,$0d,$ff,$08,$05,$08,$09,$07,$07,$06,$ff,$0b,$06
|
|
||||||
db $04,$05,$04,$12,$08,$08,$08,$08,$08,$09,$07,$07,$06,$0e,$0b,$0b
|
|
||||||
db $04,$04,$04,$12,$0a,$0a,$08,$ff,$ff,$09,$07,$07,$0e,$0e,$0b,$0b
|
|
||||||
db $04,$04,$04,$12,$08,$01,$09,$09,$09,$09,$07,$0e,$0e,$0e,$0b,$0b
|
|
||||||
db $04,$04,$04,$12,$0a,$0a,$08,$09,$09,$ff,$07,$0e,$0e,$0e,$0b,$ff
|
|
||||||
db $04,$04,$04,$12,$12,$12,$08,$05,$ff,$ff,$ff,$0e,$0e,$0e,$0b,$0b
|
|
||||||
db $04,$04,$04,$12,$12,$12,$ff,$05,$ff,$05,$ff,$0e,$0e,$0e,$0b,$ff
|
|
||||||
db $0c,$0c,$0c,$0c,$ff,$0e,$0e,$0c,$0c,$05,$ff,$0e,$0e,$0e,$0b,$0b
|
|
||||||
db $0c,$0c,$0c,$0c,$0d,$0e,$0e,$05,$05,$05,$05,$0a,$0a,$ff,$0b,$0b
|
|
||||||
db $04,$0c,$0c,$0c,$0d,$0d,$0d,$0d,$05,$05,$05,$0a,$0a,$ff,$0b,$0b
|
|
||||||
db $04,$0c,$0c,$0c,$0d,$0d,$0d,$0d,$05,$05,$ff,$0a,$0a,$ff,$0b,$ff
|
|
||||||
db $04,$0c,$0c,$ff,$ff,$0d,$0d,$ff,$05,$05,$05,$0a,$0a,$ff,$0b,$06
|
|
||||||
db $04,$06,$06,$06,$06,$06,$06,$06,$06,$ff,$06,$06,$ff,$06,$06,$06
|
|
||||||
db $06,$06,$03,$03,$03,$03,$ff,$ff,$06,$06,$06,$06,$ff,$06,$06,$06
|
|
||||||
|
|
||||||
;27f200
|
|
||||||
PaletteTable:
|
|
||||||
db $21,$00,$00,$07,$00,$08,$00,$00,$07,$00,$00,$00,$00,$00,$00,$21
|
|
||||||
db $21,$00,$00,$00,$00,$00,$00,$00,$07,$00,$00,$00,$00,$00,$00,$00
|
|
||||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$0e,$00,$00,$07,$00,$00,$07
|
|
||||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$00,$00,$00
|
|
||||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$13
|
|
||||||
db $00,$00,$00,$00,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
||||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
||||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
||||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
||||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
||||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f --Offset Ruler
|
|
||||||
db $00,$00,$00,$00,$00,$00,$00,$06,$00,$00,$00,$00,$00,$00,$00,$00
|
|
||||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
||||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
|
||||||
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$14,$20
|
|
||||||
db $00,$07,$20,$20,$07,$07,$07,$07,$07,$20,$20,$07,$20,$20,$20,$20
|
|
||||||
db $07,$07,$02,$02,$02,$02,$07,$07,$07,$20,$20,$07,$20,$20,$20,$07
|
|
||||||
|
|
||||||
;A7f300
|
|
||||||
DungeonTilesets:
|
|
||||||
db $04,$04,$05,$12,$04,$08,$07,$0C,$09,$0B,$05,$0A,$0D,$0E,$06,$06
|
|
||||||
|
|
||||||
;
|
|
||||||
;org $A7ff00
|
|
||||||
|
|
||||||
org $A7fff0
|
|
||||||
LinksHouseDarkWorld:
|
|
||||||
dw $ffff
|
|
||||||
SanctuaryDarkWorld:
|
|
||||||
dw $ffff
|
|
||||||
OldManDarkWorld:
|
|
||||||
dw $ffff
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
CheckDarkWorldSpawn:
|
|
||||||
STA.b RoomIndex : STA.w RoomIndexMirror ; what we wrote over
|
|
||||||
LDA.l DRFlags : AND.w #$0200 : BEQ + ; skip if the flag isn't set
|
|
||||||
LDA.l MoonPearlEquipment : AND.w #$00FF : BNE + ; moon pearl?
|
|
||||||
LDA.l LinksHouseDarkWorld : CMP.b RoomIndex : BEQ ++
|
|
||||||
LDA.l SanctuaryDarkWorld : CMP.b RoomIndex : BEQ ++
|
|
||||||
LDA.l OldManDarkWorld : CMP.b RoomIndex : BNE +
|
|
||||||
++ SEP #$30 : LDA.b #$17 : STA.b LinkState
|
|
||||||
INC.w BunnyFlag : LDA.b #$40 : STA.l CurrentWorld : REP #$30
|
|
||||||
+ RTL
|
|
||||||
@@ -1,224 +0,0 @@
|
|||||||
org $82b5c4 ; -- moving right routine 135c4
|
|
||||||
jsl WarpRight
|
|
||||||
org $82b665 ; -- moving left routine
|
|
||||||
jsl WarpLeft
|
|
||||||
org $82b713 ; -- moving down routine
|
|
||||||
jsl WarpDown
|
|
||||||
org $82b7b4 ; -- moving up routine
|
|
||||||
jsl WarpUp
|
|
||||||
org $82bd80
|
|
||||||
jsl AdjustTransition
|
|
||||||
nop
|
|
||||||
|
|
||||||
;turn off linking doors -- see .notRoomLinkDoor label in Bank02.asm
|
|
||||||
org $82b5a8 ; <- 135a8 - Bank02.asm : 8368 (LDA $7EC004 : STA $A0)
|
|
||||||
jsl CheckLinkDoorR
|
|
||||||
bcc NotLinkDoor1
|
|
||||||
org $82b5b6
|
|
||||||
NotLinkDoor1:
|
|
||||||
org $82b649 ; <- 135a8 - Bank02.asm : 8482 (LDA $7EC004 : STA $A0)
|
|
||||||
jsl CheckLinkDoorL
|
|
||||||
bcc NotLinkDoor2
|
|
||||||
org $82b657
|
|
||||||
NotLinkDoor2:
|
|
||||||
|
|
||||||
|
|
||||||
; Staircase routine
|
|
||||||
org $81c3d4 ; <- c3d4 - Bank01.asm : 9762-4 (Dungeon_DetectStaircase-> STA $A0 : LDA $063D, X)
|
|
||||||
jsl RecordStairType : nop
|
|
||||||
org $82a1e7 ;(PC: 121e7)
|
|
||||||
jsl SpiralWarp
|
|
||||||
|
|
||||||
org $8291b3 ; <- Bank02.asm : 3303 (LDA $0462 : AND.b #$04)
|
|
||||||
jsl SpiralPriorityHack : nop
|
|
||||||
org $8290f9 ; <- Bank02.asm : 3188 (LDA $0462 : AND.b #$04)
|
|
||||||
jsl SpiralPriorityHack : nop
|
|
||||||
|
|
||||||
org $829369 ; <- 11369 - Bank02.asm : 3610 (STX $0464 : STY $012E)
|
|
||||||
jsl StraightStairsAdj : nop #2
|
|
||||||
org $829383 ; <- 11384 - Bank02.asm : 3629 (.walkingDownStaircase-> ADD $20 : STA $20)
|
|
||||||
jsl StraightStairsFix : nop
|
|
||||||
org $8293aa ; <- 113aa - Bank02.asm : 3653 (ADD $20 : STA $20)
|
|
||||||
jsl StraightStairsFix : nop
|
|
||||||
org $8293d1 ; <- 113d1 - Bank02.asm : 3683 (ADD $20 : STA $20 BRANCH_IOTA)
|
|
||||||
jsl StraightStairsFix : nop
|
|
||||||
org $829396 ; <- 11396 - Bank02.asm : 3641 (LDA $01C322, X)
|
|
||||||
jsl StraightStairLayerFix
|
|
||||||
org $82c06d ; <- Bank02.asm : 9874 (LDX $0418, CMP.b #$02)
|
|
||||||
jsl DoorToStraight : nop
|
|
||||||
org $82c092 ; STA $0020, Y : LDX #$00
|
|
||||||
jsl DoorToInroom : nop
|
|
||||||
org $82c0f8 ; CMP $02C034, X
|
|
||||||
jsl DoorToInroomEnd
|
|
||||||
org $82941a ; <- Bank02.asm : 3748 module 7.12.11 (LDA $0464 : BNE BRANCH_$11513 : INC $B0 : RTS)
|
|
||||||
jsl StraightStairsTrapDoor : rts
|
|
||||||
org $828b54 ; <- Bank02.asm : 2200 (JSL UseImplicitRegIndexedLocalJumpTable)
|
|
||||||
jsl InroomStairsTrapDoor
|
|
||||||
org $82c146
|
|
||||||
jsl HandleSpecialDoorLanding
|
|
||||||
|
|
||||||
org $8289a0 ; JSL $0091C4
|
|
||||||
jsl QuadrantLoadOrderBeforeScroll
|
|
||||||
org $82bd9c ; JSL $0091C4
|
|
||||||
jsl QuadrantLoadOrderAfterScroll
|
|
||||||
|
|
||||||
|
|
||||||
; Graphics fix
|
|
||||||
org $82895d ; Bank 02 line 1812 (JSL Dungeon_LoadRoom : JSL Dungeon_InitStarTileChr : JSL $00D6F9 : INC $B0)
|
|
||||||
Splicer:
|
|
||||||
jsl GfxFixer
|
|
||||||
lda.b $b1 : beq .done
|
|
||||||
rts
|
|
||||||
nop #5
|
|
||||||
.done
|
|
||||||
|
|
||||||
org $81b618 ; Bank01.asm : 7963 Dungeon_LoadHeader (REP #$20 : INY : LDA [$0D], Y)
|
|
||||||
nop : jsl OverridePaletteHeader
|
|
||||||
|
|
||||||
org $82817e ; Bank02.asm : 414 (LDA $02811E, X)
|
|
||||||
jsl FixAnimatedTiles
|
|
||||||
|
|
||||||
org $8aef43 ; UnderworldMap_RecoverGFX
|
|
||||||
jsl FixCloseDungeonMap
|
|
||||||
|
|
||||||
org $828a06 ; Bank02.asm : 1941 Dungeon_ResetTorchBackgroundAndPlayer
|
|
||||||
JSL FixWallmasterLamp
|
|
||||||
|
|
||||||
org $80d377 ;Bank 00 line 3185
|
|
||||||
DecompDungAnimatedTiles:
|
|
||||||
org $80fda4 ;Bank 00 line 8882
|
|
||||||
Dungeon_InitStarTileCh:
|
|
||||||
org $80d6ae ;(PC: 56ae)
|
|
||||||
LoadTransAuxGfx:
|
|
||||||
org $80d739 ;
|
|
||||||
LoadTransAuxGfx_Alt:
|
|
||||||
org $80df5a ;(PC: 5f5a)
|
|
||||||
PrepTransAuxGfx:
|
|
||||||
org $8ffd65 ;(PC: 07fd65)
|
|
||||||
Dungeon_LoadCustomTileAttr:
|
|
||||||
org $81feb0
|
|
||||||
Dungeon_ApproachFixedColor:
|
|
||||||
;org $81fec1
|
|
||||||
;Dungeon_ApproachFixedColor_variable:
|
|
||||||
;org $a0f972 ; Rando version
|
|
||||||
;LoadRoomHook:
|
|
||||||
org $9bee74 ;(PC: 0dee74)
|
|
||||||
Palette_DungBgMain:
|
|
||||||
org $9bec77
|
|
||||||
Palette_SpriteAux3:
|
|
||||||
org $9becc5
|
|
||||||
Palette_SpriteAux2:
|
|
||||||
org $9bece4
|
|
||||||
Palette_SpriteAux1:
|
|
||||||
|
|
||||||
|
|
||||||
org $828046 ; <- 10046 - Bank02.asm : 217 (JSL EnableForceBlank) (Start of Module_LoadFile)
|
|
||||||
jsl OnFileLoadOverride
|
|
||||||
org $87A93F ; < 3A93F - Bank07.asm 6548 (LDA $8A : AND.b #$40 - Mirror checks)
|
|
||||||
jsl MirrorCheckOverride
|
|
||||||
|
|
||||||
org $85ef47
|
|
||||||
Sprite_HeartContainer_Override: ;sprite_heart_upgrades.asm : 96-100 (LDA $040C : CMP.b #$1A : BNE .not_in_ganons_tower)
|
|
||||||
jsl GtBossHeartCheckOverride : bcs .not_in_ganons_tower
|
|
||||||
nop : stz.w SpriteAITable, X : rts
|
|
||||||
.not_in_ganons_tower
|
|
||||||
|
|
||||||
|
|
||||||
org $87a955 ; <- Bank07.asm : around 6564 (JP is a bit different) (STZ $05FC : STZ $05FD)
|
|
||||||
jsl BlockEraseFix
|
|
||||||
nop #2
|
|
||||||
|
|
||||||
org $82A0A8
|
|
||||||
Mirror_SaveRoomData:
|
|
||||||
org $87A95B ; < bank_07.asm ; #_07A95B: JSL Mirror_SaveRoomData
|
|
||||||
jsl EGFixOnMirror
|
|
||||||
|
|
||||||
org $82b82a
|
|
||||||
jsl FixShopCode
|
|
||||||
|
|
||||||
org $9ddeea ; <- Bank1D.asm : 286 (JSL SpritePrep_LoadProperties)
|
|
||||||
jsl VitreousKeyReset
|
|
||||||
|
|
||||||
org $9ed024 ; f5024 sprite_guruguru_bar.asm : 27 (LDA $040C : CMP.b #$12 : INY #2
|
|
||||||
jsl GuruguruFix : bra .next
|
|
||||||
nop #3
|
|
||||||
.next
|
|
||||||
|
|
||||||
org $828fc9
|
|
||||||
nop #2 : jsl BlindAtticFix
|
|
||||||
|
|
||||||
org $828409
|
|
||||||
jsl SuctionOverworldFix
|
|
||||||
|
|
||||||
org $8ded04 ; <- rando's hooks.asm line 2192 - 6ED04 - equipment.asm : 1963 (REP #$30)
|
|
||||||
jsl DrHudDungeonItemsAdditions
|
|
||||||
;org $098638 ; rando's hooks.asm line 2192
|
|
||||||
;jsl CountChestKeys
|
|
||||||
org $86D192 ; rando's hooks.asm line 457
|
|
||||||
jsl CountAbsorbedKeys
|
|
||||||
; rando's hooks.asm line 1020
|
|
||||||
;org $05FC7E ; <- 2FC7E - sprite_dash_item.asm : 118 (LDA $7EF36F : INC A : STA $7EF36F)
|
|
||||||
;jsl CountBonkItem
|
|
||||||
|
|
||||||
org $819dbd ; <- Bank01.asm : 4465 of Object_Draw8xN (LDA $9B52, Y : STA $7E2000, X)
|
|
||||||
jsl CutoffEntranceRug : bra .nextTile : nop
|
|
||||||
.nextTile
|
|
||||||
|
|
||||||
;maybe set 02e2 to 0
|
|
||||||
|
|
||||||
org $8799de ; <- Bank07.asm : 4088 (LDA.b #$15 : STA $5D)
|
|
||||||
JSL StoreTempBunnyState
|
|
||||||
;
|
|
||||||
org $88C450 ; <- ancilla_receive_item.asm : 146-148 (STY $5D : STZ $02D8)
|
|
||||||
JSL RetrieveBunnyState : JMP.w + : NOP : +
|
|
||||||
|
|
||||||
org $82d9ce ; <- Bank02.asm : Dungeon_LoadEntrance 10829 (STA $A0 : STA $048E)
|
|
||||||
JSL CheckDarkWorldSpawn : NOP
|
|
||||||
|
|
||||||
org $9edabf ; <- sprite_energy_ball.asm : 86-7 Sprite_EnergyBall (LDA.b #$10 : LDX.b #$00)
|
|
||||||
JSL StandardAgaDmg
|
|
||||||
|
|
||||||
org $89F7B2 ; 09F7B2 Module17_01 S&Q
|
|
||||||
JSL StandardSaveAndQuit
|
|
||||||
|
|
||||||
org $89a681 ; < - similar to talalong.asm : 1157 (JSL Main_ShowTextMessage)
|
|
||||||
JSL BlindsAtticHint : NOP #2
|
|
||||||
org $9cfd69
|
|
||||||
Main_ShowTextMessage:
|
|
||||||
|
|
||||||
; Conditionally disable UW music changes in Door Rando
|
|
||||||
org $828ADB ; <- Bank02.asm:2088-2095 (LDX.b #$14 : LDA $A0 ...)
|
|
||||||
JSL Underworld_DoorDown_Entry : CPX.b #$FF
|
|
||||||
BEQ + : db $80, $1C ; BRA $028B04
|
|
||||||
NOP #6 : +
|
|
||||||
|
|
||||||
org $82FD00 ; unreachable code
|
|
||||||
Underworld_SetBossOrSancMusicUponEntry_long:
|
|
||||||
JSR Underworld_SetBossOrSancMusicUponEntry : RTL
|
|
||||||
|
|
||||||
org $81AA90
|
|
||||||
JSL BigKeyDoorCheck : NOP
|
|
||||||
|
|
||||||
org $81AAA2
|
|
||||||
RoomDraw_OneSidedShutters_South_onesided_shutter_or_big_key_door:
|
|
||||||
|
|
||||||
;Enable south facing bk graphic
|
|
||||||
org $80CE24
|
|
||||||
dw $2ac8
|
|
||||||
|
|
||||||
org $81b714 ; PC: b714
|
|
||||||
OpenableDoors:
|
|
||||||
jsl CheckIfDoorsOpen
|
|
||||||
bcs .normal
|
|
||||||
rts
|
|
||||||
.normal
|
|
||||||
|
|
||||||
org $82C157
|
|
||||||
JSL AlwaysPushThroughFDoors
|
|
||||||
|
|
||||||
; Modified from OWR - will need to remove once merged
|
|
||||||
org $85AF75
|
|
||||||
Sprite_6C_MirrorPortal:
|
|
||||||
JSL FixOvalFadeOutMirror : NOP #2 ; LDA $7EF3CA : BNE $05AFDF
|
|
||||||
org $85AFDF
|
|
||||||
Sprite_6C_MirrorPortal_missing_mirror:
|
|
||||||
@@ -1,305 +0,0 @@
|
|||||||
; defines
|
|
||||||
; Ram usage
|
|
||||||
|
|
||||||
HorzEdge:
|
|
||||||
cpy.b #$ff : beq +
|
|
||||||
jsr DetectWestEdge : ldy.b #$02 : bra ++
|
|
||||||
+ jsr DetectEastEdge
|
|
||||||
++ cmp.b #$ff : beq +
|
|
||||||
sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
|
|
||||||
cpy.b #$ff : beq ++
|
|
||||||
jsr LoadWestData : bra .main
|
|
||||||
++ jsr LoadEastData
|
|
||||||
.main
|
|
||||||
jsr LoadEdgeRoomHorz
|
|
||||||
sec : rts
|
|
||||||
+ clc : rts
|
|
||||||
|
|
||||||
VertEdge:
|
|
||||||
cpy.b #$ff : beq +
|
|
||||||
jsr DetectNorthEdge : bra ++
|
|
||||||
+ jsr DetectSouthEdge
|
|
||||||
++ cmp.b #$ff : beq +
|
|
||||||
sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
|
|
||||||
cpy.b #$ff : beq ++
|
|
||||||
jsr LoadNorthData : bra .main
|
|
||||||
++ jsr LoadSouthData
|
|
||||||
.main
|
|
||||||
jsr LoadEdgeRoomVert
|
|
||||||
sec : rts
|
|
||||||
+ clc : rts
|
|
||||||
|
|
||||||
LoadEdgeRoomHorz:
|
|
||||||
lda.b Scrap03 : sta.b RoomIndex
|
|
||||||
sty.b Scrap06
|
|
||||||
and.b #$0f : asl a : !SUB.b LinkPosX+1 : !ADD.b Scrap06 : sta.b Scrap02
|
|
||||||
ldy.b #$00 : jsr ShiftVariablesMainDir
|
|
||||||
|
|
||||||
lda.b Scrap04 : and.b #$80 : bne .edge
|
|
||||||
lda.b Scrap04 : sta.b Scrap01 ; load up flags in $01
|
|
||||||
jsr PrepScrollToNormal
|
|
||||||
bra .scroll
|
|
||||||
|
|
||||||
.edge
|
|
||||||
lda.b Scrap04 : and.b #$10 : beq +
|
|
||||||
lda.b #$01
|
|
||||||
+ sta.b LinkLayer ; layer stuff
|
|
||||||
|
|
||||||
jsr MathHorz
|
|
||||||
|
|
||||||
.scroll
|
|
||||||
jsr ScrollY
|
|
||||||
rts
|
|
||||||
|
|
||||||
LoadEdgeRoomVert:
|
|
||||||
lda.b Scrap03 : sta.b RoomIndex
|
|
||||||
sty.b Scrap06
|
|
||||||
and.b #$f0 : lsr #3 : !SUB.b LinkPosY+1 : !ADD.b Scrap06 : sta.b Scrap02
|
|
||||||
|
|
||||||
lda.b Scrap04 : and.b #$80 : bne .edge
|
|
||||||
lda.b Scrap04 : sta.b Scrap01 ; load up flags in $01
|
|
||||||
and.b #$03 : cmp.b #$03 : beq .inroom
|
|
||||||
ldy.b #$01 : jsr ShiftVariablesMainDir
|
|
||||||
jsr PrepScrollToNormal
|
|
||||||
bra .scroll
|
|
||||||
|
|
||||||
.inroom
|
|
||||||
jsr ScrollToInroomStairs
|
|
||||||
rts
|
|
||||||
|
|
||||||
.edge
|
|
||||||
ldy.b #$01 : jsr ShiftVariablesMainDir
|
|
||||||
lda.b Scrap04 : and.b #$10 : beq +
|
|
||||||
lda.b #$01
|
|
||||||
+ sta.b LinkLayer ; layer stuff
|
|
||||||
|
|
||||||
jsr MathVert
|
|
||||||
lda.b Scrap03
|
|
||||||
|
|
||||||
.scroll
|
|
||||||
jsr ScrollX
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
MathHorz:
|
|
||||||
jsr MathStart : lda.b LinkPosY
|
|
||||||
jsr MathMid : and.w #$0040
|
|
||||||
jsr MathEnd
|
|
||||||
rts
|
|
||||||
|
|
||||||
MathVert:
|
|
||||||
jsr MathStart : lda.b LinkPosX
|
|
||||||
jsr MathMid : and.w #$0020
|
|
||||||
jsr MathEnd
|
|
||||||
rts
|
|
||||||
|
|
||||||
MathStart:
|
|
||||||
rep #$30
|
|
||||||
lda.b Scrap08 : and.w #$00ff : sta.b Scrap00
|
|
||||||
rts
|
|
||||||
|
|
||||||
MathMid:
|
|
||||||
and.w #$01ff : !SUB.b Scrap00 : and.w #$00ff : sta.b Scrap00
|
|
||||||
; nothing should be bigger than $a0 at this point
|
|
||||||
|
|
||||||
lda.b Scrap05 : and.w #$00f0 : lsr #4 : tax
|
|
||||||
lda.w MultDivInfo, x : and.w #$00ff : tay
|
|
||||||
lda.b Scrap00 : jsr MultiplyByY : sta.b Scrap02
|
|
||||||
|
|
||||||
lda.b Scrap07 : and.w #$00ff : jsr MultiplyByY : tax
|
|
||||||
|
|
||||||
lda.b Scrap05 : and.w #$000f : tay
|
|
||||||
lda.w MultDivInfo, y : and.w #$00ff : tay
|
|
||||||
lda.b Scrap02 : jsr DivideByY : sta.b Scrap00
|
|
||||||
lda.b Scrap0C : and.w #$00ff : sta.b Scrap02
|
|
||||||
lda.b Scrap04
|
|
||||||
rts
|
|
||||||
|
|
||||||
MathEnd:
|
|
||||||
beq +
|
|
||||||
lda.w #$0100
|
|
||||||
+ !ADD.b Scrap02 : !ADD.b Scrap00
|
|
||||||
sta.b Scrap04
|
|
||||||
sep #$30
|
|
||||||
rts
|
|
||||||
|
|
||||||
; don't need midpoint of edge Link is leaving (formerly in $06 - used by dir indicator)
|
|
||||||
; don't need width of edge Link is going to (currently in $0b)
|
|
||||||
LoadNorthData:
|
|
||||||
lda.w NorthOpenEdge, x : sta.b Scrap03 : inx ; target room
|
|
||||||
lda.w NorthEdgeInfo, x : sta.b Scrap07 ; needed for maths - (divide by 2 anyway)
|
|
||||||
lda.w NorthOpenEdge, x : sta.b Scrap04 : inx ; bit field
|
|
||||||
lda.w NorthEdgeInfo, x : sta.b Scrap08 ; needed for maths
|
|
||||||
lda.w NorthOpenEdge, x : sta.b Scrap05 ; ratio
|
|
||||||
lda.b Scrap04 : jsr LoadSouthMidpoint : inx ; needed now, and for nrml transition
|
|
||||||
lda.w SouthEdgeInfo, x : sta.b Scrap0B : inx ; probably not needed todo: remove
|
|
||||||
lda.w SouthEdgeInfo, x : sta.b Scrap0C ; needed for maths
|
|
||||||
rts
|
|
||||||
|
|
||||||
LoadSouthMidpoint:
|
|
||||||
and.b #$0f : sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
|
|
||||||
lda.w SouthEdgeInfo, x : sta.b Scrap0A ; needed now, and for nrml transition
|
|
||||||
rts
|
|
||||||
|
|
||||||
LoadSouthData:
|
|
||||||
lda.w SouthOpenEdge, x : sta.b Scrap03 : inx
|
|
||||||
lda.w SouthEdgeInfo, x : sta.b Scrap07
|
|
||||||
lda.w SouthOpenEdge, x : sta.b Scrap04 : inx
|
|
||||||
lda.w SouthEdgeInfo, x : sta.b Scrap08
|
|
||||||
lda.w SouthOpenEdge, x : sta.b Scrap05
|
|
||||||
lda.b Scrap04 : jsr LoadNorthMidpoint : inx
|
|
||||||
lda.w NorthEdgeInfo, x : sta.b Scrap0B : inx
|
|
||||||
lda.w NorthEdgeInfo, x : sta.b Scrap0C
|
|
||||||
rts
|
|
||||||
|
|
||||||
LoadNorthMidpoint:
|
|
||||||
and.b #$0f : sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
|
|
||||||
lda.w NorthEdgeInfo, x : sta.b Scrap0A ; needed now, and for nrml transition
|
|
||||||
rts
|
|
||||||
|
|
||||||
LoadWestData:
|
|
||||||
lda.w WestOpenEdge, x : sta.b Scrap03 : inx
|
|
||||||
lda.w WestEdgeInfo, x : sta.b Scrap07
|
|
||||||
lda.w WestOpenEdge, x : sta.b Scrap04 : inx
|
|
||||||
lda.w WestEdgeInfo, x : sta.b Scrap08
|
|
||||||
lda.w WestOpenEdge, x : sta.b Scrap05
|
|
||||||
lda.b Scrap04 : jsr LoadEastMidpoint : inx
|
|
||||||
lda.w EastEdgeInfo, x : sta.b Scrap0B : inx
|
|
||||||
lda.w EastEdgeInfo, x : sta.b Scrap0C
|
|
||||||
rts
|
|
||||||
|
|
||||||
LoadEastMidpoint:
|
|
||||||
and.b #$0f : sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
|
|
||||||
lda.w EastEdgeInfo, x : sta.b Scrap0A ; needed now, and for nrml transition
|
|
||||||
rts
|
|
||||||
|
|
||||||
LoadEastData:
|
|
||||||
lda.w EastOpenEdge, x : sta.b Scrap03 : inx
|
|
||||||
lda.w EastEdgeInfo, x : sta.b Scrap07
|
|
||||||
lda.w EastOpenEdge, x : sta.b Scrap04 : inx
|
|
||||||
lda.w EastEdgeInfo, x : sta.b Scrap08
|
|
||||||
lda.w EastOpenEdge, x : sta.b Scrap05
|
|
||||||
lda.b Scrap04 : jsr LoadWestMidpoint : inx
|
|
||||||
lda.w WestEdgeInfo, x : sta.b Scrap0B : inx
|
|
||||||
lda.w WestEdgeInfo, x : sta.b Scrap0C
|
|
||||||
|
|
||||||
|
|
||||||
LoadWestMidpoint:
|
|
||||||
and.b #$0f : sta.b Scrap00 : asl : !ADD.b Scrap00 : tax
|
|
||||||
lda.w WestEdgeInfo, x : sta.b Scrap0A ; needed now, and for nrml transition
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
DetectNorthEdge:
|
|
||||||
ldx.b #$ff
|
|
||||||
lda.b PreviousRoom
|
|
||||||
cmp.b #$82 : bne +
|
|
||||||
lda.b LinkPosX : cmp.b #$50 : bcs ++
|
|
||||||
ldx.b #$01 : bra .end
|
|
||||||
++ ldx.b #$00 : bra .end
|
|
||||||
+ cmp.b #$83 : bne +
|
|
||||||
ldx.b #$02 : bra .end
|
|
||||||
+ cmp.b #$84 : bne +
|
|
||||||
lda.b $a9 : beq ++
|
|
||||||
lda.b LinkPosX : cmp.b #$78 : bcs +++
|
|
||||||
ldx.b #$04 : bra .end
|
|
||||||
+++ ldx.b #$05 : bra .end
|
|
||||||
++ lda.b LinkPosX : cmp.b #$78 : bcs ++
|
|
||||||
ldx.b #$03 : bra .end
|
|
||||||
++ ldx.b #$04 : bra .end
|
|
||||||
+ cmp.b #$85 : bne +
|
|
||||||
ldx.b #$06 : bra .end
|
|
||||||
+ cmp.b #$db : bne +
|
|
||||||
lda.b $a9 : beq ++
|
|
||||||
lda.b LinkPosX : beq ++
|
|
||||||
ldx.b #$08 : bra .end
|
|
||||||
++ ldx.b #$07 : bra .end
|
|
||||||
+ cmp.b #$dc : bne .end
|
|
||||||
lda.b $a9 : bne ++
|
|
||||||
lda.b LinkPosX : cmp.b #$b0 : bcs ++
|
|
||||||
ldx.b #$09 : bra .end
|
|
||||||
++ ldx.b #$0a
|
|
||||||
.end txa : rts
|
|
||||||
|
|
||||||
DetectSouthEdge:
|
|
||||||
ldx.b #$ff
|
|
||||||
lda.b PreviousRoom
|
|
||||||
cmp.b #$72 : bne +
|
|
||||||
lda.b LinkPosX : cmp.b #$50 : bcs ++
|
|
||||||
ldx.b #$01 : bra .end
|
|
||||||
++ ldx.b #$00 : bra .end
|
|
||||||
+ cmp.b #$73 : bne +
|
|
||||||
ldx.b #$02 : bra .end
|
|
||||||
+ cmp.b #$74 : bne +
|
|
||||||
lda.b $a9 : beq ++
|
|
||||||
lda.b LinkPosX : cmp.b #$78 : bcs +++
|
|
||||||
ldx.b #$04 : bra .end
|
|
||||||
+++ ldx.b #$05 : bra .end
|
|
||||||
++ lda.b LinkPosX : cmp.b #$78 : bcs ++
|
|
||||||
ldx.b #$03 : bra .end
|
|
||||||
++ ldx.b #$04 : bra .end
|
|
||||||
+ cmp.b #$75 : bne +
|
|
||||||
ldx.b #$06 : bra .end
|
|
||||||
+ cmp.b #$cb : bne +
|
|
||||||
lda.b $a9 : beq ++
|
|
||||||
lda.b LinkPosX : beq ++
|
|
||||||
ldx.b #$08 : bra .end
|
|
||||||
++ ldx.b #$07 : bra .end
|
|
||||||
+ cmp.b #$cc : bne .end
|
|
||||||
lda.b $a9 : bne ++
|
|
||||||
lda.b LinkPosX : cmp.b #$b0 : bcs ++
|
|
||||||
ldx.b #$09 : bra .end
|
|
||||||
++ ldx.b #$0a
|
|
||||||
.end txa : rts
|
|
||||||
|
|
||||||
DetectWestEdge:
|
|
||||||
ldx.b #$ff
|
|
||||||
lda.b PreviousRoom
|
|
||||||
cmp.b #$65 : bne +
|
|
||||||
ldx.b #$00 : bra .end
|
|
||||||
+ cmp.b #$74 : bne +
|
|
||||||
ldx.b #$01 : bra .end
|
|
||||||
+ cmp.b #$75 : bne +
|
|
||||||
ldx.b #$02 : bra .end
|
|
||||||
+ cmp.b #$82 : bne +
|
|
||||||
lda.b LinkQuadrantV : beq ++
|
|
||||||
ldx.b #$03 : bra .end
|
|
||||||
++ ldx.b #$04 : bra .end
|
|
||||||
+ cmp.b #$85 : bne +
|
|
||||||
ldx.b #$05 : bra .end
|
|
||||||
+ cmp.b #$cc : bne +
|
|
||||||
lda.b LinkQuadrantV : beq ++
|
|
||||||
ldx.b #$06 : bra .end
|
|
||||||
++ ldx.b #$07 : bra .end
|
|
||||||
+ cmp.b #$dc : bne .end
|
|
||||||
ldx.b #$08
|
|
||||||
.end txa : rts
|
|
||||||
|
|
||||||
DetectEastEdge:
|
|
||||||
ldx.b #$ff
|
|
||||||
lda.b PreviousRoom
|
|
||||||
cmp.b #$64 : bne +
|
|
||||||
ldx.b #$00 : bra .end
|
|
||||||
+ cmp.b #$73 : bne +
|
|
||||||
ldx.b #$01 : bra .end
|
|
||||||
+ cmp.b #$74 : bne +
|
|
||||||
ldx.b #$02 : bra .end
|
|
||||||
+ cmp.b #$81 : bne +
|
|
||||||
lda.b LinkQuadrantV : beq ++
|
|
||||||
ldx.b #$04 : bra .end
|
|
||||||
++ ldx.b #$03 : bra .end
|
|
||||||
+ cmp.b #$84 : bne +
|
|
||||||
ldx.b #$05 : bra .end
|
|
||||||
+ cmp.b #$cb : bne +
|
|
||||||
lda.b LinkQuadrantV : beq ++
|
|
||||||
ldx.b #$06 : bra .end
|
|
||||||
++ ldx.b #$07 : bra .end
|
|
||||||
+ cmp.b #$db : bne .end
|
|
||||||
ldx.b #$08
|
|
||||||
.end txa : rts
|
|
||||||
|
|
||||||
AlwaysPushThroughFDoors:
|
|
||||||
PHA : AND.b #$F0 : CMP.b #$F0 : BNE +
|
|
||||||
PLA : RTL
|
|
||||||
+ PLA : AND.b #$8E : CMP.b #$80
|
|
||||||
RTL
|
|
||||||
@@ -1,300 +0,0 @@
|
|||||||
;===================================================================================================
|
|
||||||
; The only specific concern to keep in mind with this code is that your databank will be $00
|
|
||||||
; Actually, it should be $80, if you're using my fastrom changes.
|
|
||||||
;
|
|
||||||
; Leave all your door data vanilla
|
|
||||||
; Do not try to adjust doors as I previously suggested (not worth the effort)
|
|
||||||
; We need a few hooks and some light hardcoding either way
|
|
||||||
; Might as well just do it in a brute, but reliable, way
|
|
||||||
;
|
|
||||||
; In brief, this is the hack we're making:
|
|
||||||
; 1) Let vanilla routines draw the door normally
|
|
||||||
; 2) Draw over what vanilla just drew
|
|
||||||
; 3) Hijack the door tile type routine
|
|
||||||
; and replace the vanilla value with that of solid collision
|
|
||||||
|
|
||||||
; For door dection free RAM at $19EE-$19FF has been co-opted to door each drawn doors position and type bytes
|
|
||||||
; 19EE is for the "current" door for the IdentifyBlockedEntrance routine
|
|
||||||
; The array at 19F0 is for the collision routine to retrieve that information as it is no longer
|
|
||||||
; available by that point
|
|
||||||
;===================================================================================================
|
|
||||||
pushpc
|
|
||||||
|
|
||||||
org $81B0E6
|
|
||||||
JSL StoreDoorInfo
|
|
||||||
|
|
||||||
org $81892F
|
|
||||||
DoorDrawJankMove:
|
|
||||||
JML PrepDoorDraw
|
|
||||||
|
|
||||||
.return
|
|
||||||
JSL AdjustEscapeDoorGraphics
|
|
||||||
RTS
|
|
||||||
|
|
||||||
; we don't want to overwrite the JMP ($000E) that's already there
|
|
||||||
; Well, we could, but we don't need to
|
|
||||||
warnpc $818939
|
|
||||||
|
|
||||||
org $81BF43
|
|
||||||
JSL AdjustEscapeDoorCollision
|
|
||||||
|
|
||||||
org $81C132 ; ADC.w #$0040 : TAX : LDA.b $00
|
|
||||||
JSL AdjustEscapeDoorCollision_LowEntrance : NOP #2
|
|
||||||
|
|
||||||
pullpc
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
StoreDoorInfo:
|
|
||||||
STA.w $1980,X
|
|
||||||
LDA.b Scrap00 : STA.w $19F0,X
|
|
||||||
TXA
|
|
||||||
RTL
|
|
||||||
|
|
||||||
PrepDoorDraw:
|
|
||||||
; first off, we need this routine to return to our jank hook
|
|
||||||
; otherwise, finding a reliable place to put the graphics change check will be a pin
|
|
||||||
; so push the address to return to the routine
|
|
||||||
|
|
||||||
; It's a lot to explain why this is necessary
|
|
||||||
; Much easier to just tell you to look at $01890D in the disassembly
|
|
||||||
; and you should understand the vanilla program flow we need to reject
|
|
||||||
PEA.w DoorDrawJankMove_return-1
|
|
||||||
LDA.b Scrap00
|
|
||||||
STA.w $19EE ; for current routine
|
|
||||||
|
|
||||||
; copy vanilla code (but fast rom)
|
|
||||||
LDA.l $8186F0,X
|
|
||||||
STA.b Scrap0E
|
|
||||||
|
|
||||||
LDX.b Scrap02
|
|
||||||
LDA.b Scrap04
|
|
||||||
|
|
||||||
; and to execute the jump, we'll use the JMP ($000E) we carefully avoided overwriting
|
|
||||||
JML $818939
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
; Adjustment stage 1: graphics
|
|
||||||
AdjustEscapeDoorGraphics:
|
|
||||||
JSR IdentifyBlockedEntrance
|
|
||||||
BCS .replace_graphics
|
|
||||||
JSR IdentifySancEntrance
|
|
||||||
BCS .fix_sanctuary_entrance
|
|
||||||
JSR IdentifySwampEntrance
|
|
||||||
BCS .fix_swamp_entrance
|
|
||||||
; Do nothing
|
|
||||||
RTL
|
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
.replace_graphics ; for blocked doors
|
|
||||||
; using the value in $19A0 should be fine for finding the graphics
|
|
||||||
; the only caveat is that this appears to locate the tile just above the north-west corner
|
|
||||||
; so below, I've indicated that offset with a +$xxx after the base tilemap buffer
|
|
||||||
; The only odd thing I notice with this position is that some bad hardcoded adjust for
|
|
||||||
; exploding walls that shouldn't affect how we use this value at all!
|
|
||||||
LDY.w $0460 ; get door index
|
|
||||||
|
|
||||||
LDX.w $19A0-2,Y ; get tilemap index
|
|
||||||
|
|
||||||
; hardcoded shutter door graphics tile replacement
|
|
||||||
|
|
||||||
; the horizontal flips could easily be explicit LDAs
|
|
||||||
; but it's probably best the door is symmetrical
|
|
||||||
; using ORA makes your intent more clear
|
|
||||||
; and gives you fewer values to change if you experiment with other graphics
|
|
||||||
|
|
||||||
; row 1
|
|
||||||
LDA.w #$8838
|
|
||||||
STA.l TileMapA+$080,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$086,X
|
|
||||||
|
|
||||||
; row 2
|
|
||||||
LDA.w #$8828
|
|
||||||
STA.l TileMapA+$100,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$106,X
|
|
||||||
|
|
||||||
LDA.w #$8829
|
|
||||||
STA.l TileMapA+$102,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$104,X
|
|
||||||
|
|
||||||
JSR IdentifySwampEntrance
|
|
||||||
BCS .fix_swamp_entrance_alternate
|
|
||||||
|
|
||||||
; the state of the A, X, and Y registers is irrelevant when we exit
|
|
||||||
; they're all subsequently loaded with new values
|
|
||||||
RTL
|
|
||||||
|
|
||||||
.fix_sanctuary_entrance
|
|
||||||
LDY.w $0460 ; get door index
|
|
||||||
LDX.w $19A0-2,Y ; get tilemap index
|
|
||||||
|
|
||||||
; row 0
|
|
||||||
LDA.w #$14C4
|
|
||||||
STA.l TileMapA+$000,X ; sanity check = should calculate to 7e3bbc
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$006,X
|
|
||||||
|
|
||||||
LDA.w #$14C5
|
|
||||||
STA.l TileMapA+$002,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$004,X
|
|
||||||
|
|
||||||
; row 1
|
|
||||||
LDA.w #$14E8
|
|
||||||
STA.l TileMapA+$082,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$084,X
|
|
||||||
|
|
||||||
; row 2
|
|
||||||
LDA.w #$14F8
|
|
||||||
STA.l TileMapA+$102,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$104,X
|
|
||||||
RTL
|
|
||||||
|
|
||||||
.fix_swamp_entrance
|
|
||||||
LDY.w $0460 ; get door index
|
|
||||||
LDX.w $19A0-2,Y ; get tilemap index
|
|
||||||
|
|
||||||
; row 1 - outer section
|
|
||||||
LDA.w #$0908
|
|
||||||
STA.l TileMapA+$080,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$086,X
|
|
||||||
|
|
||||||
; row 2
|
|
||||||
LDA.w #$0918
|
|
||||||
STA.l TileMapA+$100,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$106,X
|
|
||||||
|
|
||||||
LDA.w #$14F8
|
|
||||||
STA.l TileMapA+$102,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$104,X
|
|
||||||
|
|
||||||
.fix_swamp_entrance_alternate
|
|
||||||
; row 0
|
|
||||||
LDA.w #$9DFC
|
|
||||||
STA.l TileMapA+$000,X
|
|
||||||
STA.l TileMapA+$002,X
|
|
||||||
STA.l TileMapA+$004,X
|
|
||||||
STA.l TileMapA+$006,X
|
|
||||||
|
|
||||||
; row 1 - mid section
|
|
||||||
LDA.w #$14E8
|
|
||||||
STA.l TileMapA+$082,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$084,X
|
|
||||||
|
|
||||||
; row 3
|
|
||||||
LDA.w #$A82C
|
|
||||||
STA.l TileMapA+$180,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$186,X
|
|
||||||
|
|
||||||
LDA.w #$A82D
|
|
||||||
STA.l TileMapA+$182,X
|
|
||||||
ORA.w #$4000 ; horizontally flip
|
|
||||||
STA.l TileMapA+$184,X
|
|
||||||
RTL
|
|
||||||
|
|
||||||
IdentifySancEntrance:
|
|
||||||
LDA.b RoomIndex : CMP.w #$0012 : BNE +
|
|
||||||
LDA.b Scrap0A : CMP.w #$0010 : BNE +
|
|
||||||
SEC : RTS
|
|
||||||
+ CLC : RTS
|
|
||||||
|
|
||||||
IdentifySwampEntrance:
|
|
||||||
LDA.b RoomIndex : CMP.w #$0036 : BNE +
|
|
||||||
LDA.b Scrap0A : CMP.w #$0010 : BNE +
|
|
||||||
SEC : RTS
|
|
||||||
+ CLC : RTS
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
; Leaving this here in case you desire a fully custom door later
|
|
||||||
; For now, we'll just hardcode the tiles, as I did above
|
|
||||||
; I put these in column order because that's how they're expected for the vanilla draw routines
|
|
||||||
; but I changed my mind on redefining things
|
|
||||||
; and am too lazy to change it to a row-wise listing
|
|
||||||
BlockedEntrance:
|
|
||||||
dw $8838, $8828, $A888 ; column 0
|
|
||||||
dw $14E8, $8829, $C888 ; column 1
|
|
||||||
dw $14E8, $8829, $A888 ; column 2
|
|
||||||
dw $C838, $C828, $C888 ; column 3
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
; Adjustment stage 2: collision
|
|
||||||
AdjustEscapeDoorCollision:
|
|
||||||
LSR ; vanilla shift
|
|
||||||
|
|
||||||
AdjustEscapeDoorCollisionShared:
|
|
||||||
; save our parameters
|
|
||||||
; but one or both of these may not be necessary depending on how you detect these doors
|
|
||||||
; all that matters is that after identifying blockage, we have:
|
|
||||||
; Y is the same as what we entered with
|
|
||||||
; X has A>>1, for whatever A entered with
|
|
||||||
PHA
|
|
||||||
LDA.w $19F0, Y ; grab door info (type, position)
|
|
||||||
STA.w $19EE ; store in temporary variable
|
|
||||||
JSR IdentifyBlockedEntrance
|
|
||||||
|
|
||||||
PLX ; this is a TAX in vanilla, just have X pull A instead
|
|
||||||
|
|
||||||
BCS .block_entrance
|
|
||||||
|
|
||||||
; vanilla value
|
|
||||||
LDA.b Scrap00
|
|
||||||
|
|
||||||
RTL
|
|
||||||
|
|
||||||
.block_entrance
|
|
||||||
LDA.w #$0101 ; load tile type for solid collision
|
|
||||||
|
|
||||||
RTL
|
|
||||||
|
|
||||||
AdjustEscapeDoorCollision_LowEntrance:
|
|
||||||
ADC.w #$0040 ; vanilla add
|
|
||||||
JMP AdjustEscapeDoorCollisionShared
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
; Enter with:
|
|
||||||
; $19EE containing the door information: position and type bytes
|
|
||||||
; Exit with:
|
|
||||||
; carry clear - leave door alone
|
|
||||||
; carry set - block door
|
|
||||||
IdentifyBlockedEntrance:
|
|
||||||
LDA.l ProgressIndicator : AND.w #$00FF : CMP.w #$0002 : BCS .leave_alone ; only in rain states (0 or 1)
|
|
||||||
LDA.l ProgressFlags : AND.w #$0004 : BNE .leave_alone ; zelda's been rescued
|
|
||||||
LDA.l BlockSanctuaryDoorInRain : BEQ + ;flagged
|
|
||||||
LDA.b RoomIndex : CMP.w #$0012 : BNE +
|
|
||||||
; we're in the sanctuary
|
|
||||||
; this code could be removed because you can't reach sanc without zelda currently
|
|
||||||
; but that's enforced in the logic, so this is to catch that case in case some mode allows it
|
|
||||||
LDA.l FollowerIndicator : AND.w #$00FF : CMP.w #$0001 : BEQ .leave_alone ; zelda is following
|
|
||||||
LDA.b Scrap0A
|
|
||||||
CMP.w #$000A : BCC .leave_alone
|
|
||||||
CMP.w #$0014 : BCS .leave_alone
|
|
||||||
.block_door
|
|
||||||
SEC : RTS
|
|
||||||
+ LDA.l BlockCastleDoorsInRain : AND.w #$00FF : BEQ .leave_alone
|
|
||||||
LDX.w #$FFFE
|
|
||||||
- INX #2
|
|
||||||
LDA.l RemoveRainDoorsRoom, X : CMP.w #$FFFF : BEQ .leave_alone
|
|
||||||
CMP.b RoomIndex : BNE -
|
|
||||||
LDA.l RainDoorMatch, X
|
|
||||||
CMP.w $19EE : BNE .leave_alone
|
|
||||||
BRA .block_door
|
|
||||||
.continue
|
|
||||||
BRA -
|
|
||||||
.leave_alone
|
|
||||||
CLC : RTS
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
GfxFixer:
|
|
||||||
{
|
|
||||||
lda.l DRMode : bne +
|
|
||||||
jsl LoadRoomHook ;this is the code we overwrote
|
|
||||||
jsl Dungeon_InitStarTileCh
|
|
||||||
jsl LoadTransAuxGfx_Alt
|
|
||||||
inc.b SubSubModule
|
|
||||||
rtl
|
|
||||||
+ lda.b $b1 : bne .stage2
|
|
||||||
jsl LoadRoomHook ; this is the rando version - let's only call this guy once - may fix star tiles and slower loads
|
|
||||||
jsl Dungeon_InitStarTileCh
|
|
||||||
jsl LoadTransAuxGfx
|
|
||||||
jsl Dungeon_LoadCustomTileAttr
|
|
||||||
jsl PrepTransAuxGfx
|
|
||||||
lda.l DRMode : cmp.b #$02 : bne + ; only do this in crossed mode
|
|
||||||
ldx.b RoomIndex : lda.l TilesetTable, x
|
|
||||||
cmp.w $0aa1 : beq + ; already eq no need to decomp
|
|
||||||
sta.w $0aa1
|
|
||||||
tax : lda.l AnimatedTileSheets, x : tay
|
|
||||||
jsl DecompDungAnimatedTiles
|
|
||||||
+
|
|
||||||
lda.b #$09 : sta.b NMIINCR : sta.w SkipOAM
|
|
||||||
jsl Palette_SpriteAux3
|
|
||||||
jsl Palette_SpriteAux2
|
|
||||||
jsl Palette_SpriteAux1
|
|
||||||
jsl Palette_DungBgMain
|
|
||||||
jsr CgramAuxToMain
|
|
||||||
inc.b $b1
|
|
||||||
rtl
|
|
||||||
.stage2
|
|
||||||
lda.b #$0a : sta.b NMIINCR : sta.w SkipOAM
|
|
||||||
stz.b $b1 : inc.b SubSubModule
|
|
||||||
rtl
|
|
||||||
}
|
|
||||||
|
|
||||||
FixAnimatedTiles:
|
|
||||||
LDA.l DRMode : CMP.b #$02 : BNE +
|
|
||||||
LDA.w DungeonID : CMP.b #$FF : BEQ +
|
|
||||||
PHX
|
|
||||||
LDX.b RoomIndex : LDA.l TilesetTable, x
|
|
||||||
CMP.w $0AA1 : beq ++
|
|
||||||
TAX : PLA : BRA +
|
|
||||||
++
|
|
||||||
PLX
|
|
||||||
+ LDA.l AnimatedTileSheets, X ; what we wrote over
|
|
||||||
RTL
|
|
||||||
|
|
||||||
FixCloseDungeonMap:
|
|
||||||
LDA.l DRMode : CMP.b #$02 : BNE .vanilla
|
|
||||||
LDA.w DungeonID : BMI .vanilla
|
|
||||||
LSR : TAX
|
|
||||||
LDA.l DungeonTilesets,x
|
|
||||||
RTL
|
|
||||||
.vanilla
|
|
||||||
LDA.l $7EC20E
|
|
||||||
RTL
|
|
||||||
|
|
||||||
FixWallmasterLamp:
|
|
||||||
ORA.w $0458
|
|
||||||
STY.b MAINDESQ : STA.b SUBDESQ : RTL ; what we wrote over
|
|
||||||
|
|
||||||
|
|
||||||
CgramAuxToMain: ; ripped this from bank02 because it ended with rts
|
|
||||||
{
|
|
||||||
rep #$20
|
|
||||||
ldx.b #$00
|
|
||||||
|
|
||||||
.loop
|
|
||||||
lda.l $7EC300, X : sta.l $7EC500, x
|
|
||||||
lda.l $7EC340, x : sta.l $7EC540, x
|
|
||||||
lda.l $7EC380, x : sta.l $7EC580, x
|
|
||||||
lda.l $7EC3C0, x : sta.l $7EC5C0, x
|
|
||||||
lda.l $7EC400, x : sta.l $7EC600, x
|
|
||||||
lda.l $7EC440, x : sta.l $7EC640, x
|
|
||||||
lda.l $7EC480, x : sta.l $7EC680, x
|
|
||||||
lda.l $7EC4C0, x : sta.l $7EC6C0, x
|
|
||||||
|
|
||||||
inx #2 : cpx.b #$40 : bne .loop
|
|
||||||
sep #$20
|
|
||||||
|
|
||||||
; tell NMI to upload new CGRAM data
|
|
||||||
inc.b NMICGRAM
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
OverridePaletteHeader:
|
|
||||||
lda.l DRMode : cmp.b #$02 : bne +
|
|
||||||
lda.l DRFlags : and.b #$20 : bne +
|
|
||||||
cpx.w #$01c2 : !BGE +
|
|
||||||
rep #$20
|
|
||||||
txa : lsr : tax
|
|
||||||
lda.l PaletteTable, x
|
|
||||||
iny : rtl
|
|
||||||
+ rep #$20 : iny : lda.b [Scrap0D], Y ; what we wrote over
|
|
||||||
rtl
|
|
||||||
@@ -1,268 +0,0 @@
|
|||||||
!BlankTile = $207F
|
|
||||||
!SlashTile = $2830
|
|
||||||
!HyphenTile = $2405
|
|
||||||
!PTile = $296C
|
|
||||||
!CTile = $295F
|
|
||||||
!RedSquare = $345E
|
|
||||||
!BlueSquare = $2C5E
|
|
||||||
|
|
||||||
DrHudOverride:
|
|
||||||
PHB
|
|
||||||
SEP #$30
|
|
||||||
LDA.b #$7E
|
|
||||||
PHA
|
|
||||||
PLB
|
|
||||||
|
|
||||||
DRHUD_DrawItemCounter:
|
|
||||||
; hides total for mystery seeds
|
|
||||||
LDA.l ItemCounterHUD : BEQ DRHUD_DrawIndicators
|
|
||||||
LDA.l DRFlags+1 : LSR : BCC DRHUD_DrawIndicators
|
|
||||||
REP #$30
|
|
||||||
LDY.w #!HyphenTile : STY.w HUDGoalIndicator+$0A : STY.w HUDGoalIndicator+$0C
|
|
||||||
STY.w HUDGoalIndicator+$0E : STY.w HUDGoalIndicator+$10
|
|
||||||
SEP #$30
|
|
||||||
|
|
||||||
DRHUD_DrawIndicators:
|
|
||||||
LDA.b IndoorsFlag : BNE .continue
|
|
||||||
JMP DRHUD_Finished
|
|
||||||
.continue
|
|
||||||
LDA.b FrameCounter : AND.b #$10 : BEQ DRHUD_EnemyDropIndicator
|
|
||||||
|
|
||||||
DRHUD_BossIndicator:
|
|
||||||
LDA.l DRMode : BNE .continue
|
|
||||||
.early_exit
|
|
||||||
REP #$10
|
|
||||||
LDY.w #!BlankTile : STY.w HUDMultiIndicator
|
|
||||||
JMP DRHUD_Finished
|
|
||||||
.continue
|
|
||||||
LDA.w DungeonID : CMP.b #$1B : BCS .early_exit
|
|
||||||
|
|
||||||
SEP #$10 ; clears the high byte of X and prevents it from getting B register
|
|
||||||
TAX
|
|
||||||
|
|
||||||
REP #$30
|
|
||||||
LDY.w #!BlankTile
|
|
||||||
LDA.w CompassField : AND.l DungeonMask, x
|
|
||||||
SEP #$20
|
|
||||||
BEQ .draw_indicator
|
|
||||||
LDA.l CompassBossIndicator, x : CMP.b RoomIndex : BNE .draw_indicator
|
|
||||||
LDY.w #!RedSquare
|
|
||||||
.draw_indicator
|
|
||||||
STY.w HUDMultiIndicator
|
|
||||||
BRA DRHUD_DrawCurrentDungeonIndicator
|
|
||||||
|
|
||||||
DRHUD_EnemyDropIndicator:
|
|
||||||
REP #$30
|
|
||||||
LDA.w EnemyDropIndicator : STA.w HUDMultiIndicator
|
|
||||||
SEP #$20
|
|
||||||
LDA.w DungeonID : CMP.b #$1B : BCS DRHUD_Finished
|
|
||||||
SEP #$10 : TAX : REP #$10
|
|
||||||
|
|
||||||
DRHUD_DrawCurrentDungeonIndicator: ; mX
|
|
||||||
LDA.l DRMode : BIT.b #$02 : BEQ DRHUD_Finished
|
|
||||||
LDY.w #!BlankTile
|
|
||||||
LDA.w CurrentHealth : BEQ .draw_indicator
|
|
||||||
|
|
||||||
REP #$20 : LDA.l DungeonReminderTable,X : TAY
|
|
||||||
SEP #$20
|
|
||||||
.draw_indicator
|
|
||||||
STY.w HUDCurrentDungeonWorld
|
|
||||||
|
|
||||||
DRHUD_DrawKeyCounter:
|
|
||||||
LDA.l DRFlags : AND.b #$04 : BEQ DRHUD_Finished
|
|
||||||
REP #$20
|
|
||||||
LDA.w MapField : AND.l DungeonMask, X : BEQ DRHUD_Finished
|
|
||||||
TXA : LSR : TAX
|
|
||||||
LDA.l GenericKeys : AND.w #$00FF : BNE .total_only
|
|
||||||
LDA.w DungeonCollectedKeys, X : JSR ConvertToDisplay : STA.w HUDKeysObtained
|
|
||||||
LDA.w #!SlashTile : STA.w HUDKeysSlash
|
|
||||||
.total_only
|
|
||||||
LDA.l ChestKeys, x : JSR ConvertToDisplay : STA.w HUDKeysTotal
|
|
||||||
|
|
||||||
DRHUD_Finished:
|
|
||||||
PLB : RTL
|
|
||||||
|
|
||||||
;===================================================================================================
|
|
||||||
|
|
||||||
;column distance for BK/Smalls
|
|
||||||
HudOffsets:
|
|
||||||
; none hc east desert aga swamp pod mire skull ice hera tt tr gt
|
|
||||||
dw $fffe, $0000, $0006, $0008, $0002, $0010, $000e, $0018, $0012, $0016, $000a, $0014, $001a, $001e
|
|
||||||
|
|
||||||
; offset from 1644
|
|
||||||
RowOffsets:
|
|
||||||
dw $0000, $0000, $0040, $0080, $0000, $0080, $0040, $0080, $00c0, $0040, $00c0, $0000, $00c0, $0000
|
|
||||||
|
|
||||||
ColumnOffsets:
|
|
||||||
dw $0000, $0000, $0000, $0000, $000a, $000a, $000a, $0014, $000a, $0014, $0000, $0014, $0014, $001e
|
|
||||||
|
|
||||||
|
|
||||||
DrHudDungeonItemsAdditions:
|
|
||||||
{
|
|
||||||
jsl DrawHUDDungeonItems
|
|
||||||
lda.l HUDDungeonItems : and.b #$ff : bne + : rtl : +
|
|
||||||
lda.l DRMode : cmp.b #$02 : beq + : rtl : +
|
|
||||||
|
|
||||||
phx : phy : php
|
|
||||||
rep #$30
|
|
||||||
|
|
||||||
lda.w #$24f5 : sta.w $1606 : sta.w $1610 : sta.w $161a : sta.w $1624
|
|
||||||
sta.w $1644 : sta.w $164a : sta.w $1652 : sta.w $1662 : sta.w $1684 : sta.w $16c4
|
|
||||||
ldx.w #$0000
|
|
||||||
- sta.w $1704, x : sta.w $170e, x : sta.w $1718, x
|
|
||||||
inx #2 : cpx.w #$0008 : !BLT -
|
|
||||||
|
|
||||||
lda.l HudFlag : and.w #$0020 : beq + : JMP ++ : +
|
|
||||||
lda.l HUDDungeonItems : and.w #$0007 : bne + : JMP ++ : +
|
|
||||||
; bk symbols
|
|
||||||
lda.w #$2811 : sta.w $1606 : sta.w $1610 : sta.w $161a : sta.w $1624
|
|
||||||
; sm symbols
|
|
||||||
lda.w #$2810 : sta.w $160a : sta.w $1614 : sta.w $161e : sta.w $16e4
|
|
||||||
; blank out stuff
|
|
||||||
lda.w #$24f5 : sta.w $1724
|
|
||||||
|
|
||||||
ldx.w #$0002
|
|
||||||
- lda.w #$0000 : !ADD.l RowOffsets,x : !ADD.l ColumnOffsets, x : tay
|
|
||||||
lda.l DungeonReminderTable, x : sta.w $1644, y : iny #2
|
|
||||||
lda.w #$24f5 : sta.w $1644, y
|
|
||||||
lda.l MapField : and.l DungeonMask, x : beq + ; must have map
|
|
||||||
jsr BkStatus : sta.w $1644, y : bra .smallKey ; big key status
|
|
||||||
+ lda.l BigKeyField : and.l DungeonMask, x : beq .smallKey
|
|
||||||
lda.w #$2826 : sta.w $1644, y
|
|
||||||
.smallKey
|
|
||||||
+ iny #2
|
|
||||||
cpx.w #$001a : bne +
|
|
||||||
tya : !ADD.w #$003c : tay
|
|
||||||
+ stx.b Scrap00
|
|
||||||
txa : lsr : tax
|
|
||||||
lda.w #$24f5 : sta.w $1644, y
|
|
||||||
lda.l GenericKeys : and.w #$00FF : bne +
|
|
||||||
lda.l DungeonKeys, x : and.w #$00FF : beq +
|
|
||||||
jsr ConvertToDisplay2 : sta.w $1644, y
|
|
||||||
+ iny #2 : lda.w #$24f5 : sta.w $1644, y
|
|
||||||
phx : ldx.b Scrap00
|
|
||||||
lda.l MapField : and.l DungeonMask, x : beq + ; must have map
|
|
||||||
plx : sep #$30 : lda.l ChestKeys, x : sta.b Scrap02
|
|
||||||
lda.l GenericKeys : bne +++
|
|
||||||
lda.b Scrap02 : !SUB.l DungeonCollectedKeys, x : sta.b Scrap02
|
|
||||||
+++ lda.b Scrap02
|
|
||||||
rep #$30
|
|
||||||
jsr ConvertToDisplay2 : sta.w $1644, y ; small key totals
|
|
||||||
bra .skipStack
|
|
||||||
+ plx
|
|
||||||
.skipStack iny #2
|
|
||||||
cpx.w #$000d : beq +
|
|
||||||
lda.w #$24f5 : sta.w $1644, y
|
|
||||||
+
|
|
||||||
ldx.b Scrap00
|
|
||||||
+ inx #2 : cpx.w #$001b : bcs ++ : JMP -
|
|
||||||
++
|
|
||||||
lda.l HudFlag : and.w #$0020 : bne + : JMP ++ : +
|
|
||||||
lda.l HUDDungeonItems : and.w #$000c : bne + : JMP ++ : +
|
|
||||||
; map symbols (do I want these) ; note compass symbol is 2c20
|
|
||||||
lda.w #$2821 : sta.w $1606 : sta.w $1610 : sta.w $161a : sta.w $1624
|
|
||||||
; blank out a couple thing from old hud
|
|
||||||
lda.w #$24f5 : sta.w $16e4 : sta.w $1724
|
|
||||||
sta.w $160a : sta.w $1614 : sta.w $161e ; blank out sm key indicators
|
|
||||||
ldx.w #$0002
|
|
||||||
- lda.w #$0000 ; start of hud area
|
|
||||||
!ADD.l RowOffsets, x : !ADD.l ColumnOffsets, x : tay
|
|
||||||
lda.l DungeonReminderTable, x : sta.w $1644, y
|
|
||||||
iny #2
|
|
||||||
lda.w #$24f5 : sta.w $1644, y ; blank out map spot
|
|
||||||
lda.l MapField : and.l DungeonMask, x : beq + ; must have map
|
|
||||||
JSR MapIndicatorShort : STA.w $1644, Y
|
|
||||||
+ iny #2
|
|
||||||
cpx.w #$001a : bne +
|
|
||||||
tya : !ADD.w #$003c : tay
|
|
||||||
+ lda.l CompassField : and.l DungeonMask, x : beq + ; must have compass
|
|
||||||
phx ; total chest counts
|
|
||||||
LDA.l CompassTotalsWRAM, x : !SUB.l DungeonLocationsChecked, x
|
|
||||||
SEP #$30 : JSR HudHexToDec2DigitCopy : REP #$30
|
|
||||||
lda.b Scrap06 : jsr ConvertToDisplay2 : sta.w $1644, y : iny #2
|
|
||||||
lda.b Scrap07 : jsr ConvertToDisplay2 : sta.w $1644, y
|
|
||||||
plx
|
|
||||||
bra .skipBlanks
|
|
||||||
+ lda.w #$24f5 : sta.w $1644, y : iny #2 : sta.w $1644, y
|
|
||||||
.skipBlanks iny #2
|
|
||||||
cpx.w #$001a : beq +
|
|
||||||
lda.w #$24f5 : sta.w $1644, y ; blank out spot
|
|
||||||
+ inx #2 : cpx.w #$001b : !BGE ++ : JMP -
|
|
||||||
++
|
|
||||||
plp : ply : plx : rtl
|
|
||||||
}
|
|
||||||
|
|
||||||
MapIndicatorLong:
|
|
||||||
PHX
|
|
||||||
LDA.l OldHudToNewHudTable, X : TAX
|
|
||||||
JSR MapIndicator
|
|
||||||
PLX
|
|
||||||
RTL
|
|
||||||
|
|
||||||
MapIndicatorShort:
|
|
||||||
PHX
|
|
||||||
TXA : LSR : TAX
|
|
||||||
JSR MapIndicator
|
|
||||||
PLX
|
|
||||||
RTS
|
|
||||||
|
|
||||||
OldHudToNewHudTable:
|
|
||||||
dw 1, 2, 3, 10, 4, 6, 5, 8, 11, 9, 7, 12, 13
|
|
||||||
|
|
||||||
IndicatorCharacters:
|
|
||||||
; check 1 2 3 4 5 6 7 G B R
|
|
||||||
dw $2426, $2817, $2818, $2819, $281A, $281B, $281C, $281D, $2590, $258B, $259B
|
|
||||||
|
|
||||||
MapIndicator:
|
|
||||||
LDA.l CrystalPendantFlags_3, X : AND.w #$00FF
|
|
||||||
PHX
|
|
||||||
ASL : TAX : LDA.l IndicatorCharacters, X
|
|
||||||
PLX
|
|
||||||
RTS
|
|
||||||
|
|
||||||
BkStatus:
|
|
||||||
lda.l BigKeyField : and.l DungeonMask, x : bne +++ ; has the bk already
|
|
||||||
lda.l BigKeyStatus, x : bne ++
|
|
||||||
lda.w #$2827 : rts ; 0/O for no BK
|
|
||||||
++ cmp.w #$0002 : bne +
|
|
||||||
lda.w #$2420 : rts ; symbol for BnC
|
|
||||||
+ lda.w #$24f5 : rts ; black otherwise
|
|
||||||
+++ lda.w #$2826 : rts ; check mark
|
|
||||||
|
|
||||||
ConvertToDisplay:
|
|
||||||
and.w #$00ff : cmp.w #$000a : !BLT +
|
|
||||||
!ADD.w #$2553 : rts
|
|
||||||
+ !ADD.w #$2490 : rts
|
|
||||||
|
|
||||||
ConvertToDisplay2:
|
|
||||||
and.w #$00ff : beq ++
|
|
||||||
cmp.w #$000a : !BLT +
|
|
||||||
!ADD.w #$2553 : rts ; 2580 with 258A as "A" for non transparent digits
|
|
||||||
+ !ADD.w #$2816 : rts
|
|
||||||
++ lda.w #$2827 : rts ; 0/O for 0 or placeholder digit ;2483
|
|
||||||
|
|
||||||
CountAbsorbedKeys:
|
|
||||||
JML IncrementSmallKeysNoPrimary
|
|
||||||
|
|
||||||
;================================================================================
|
|
||||||
; 8-bit registers
|
|
||||||
; in: A(b) - Byte to Convert
|
|
||||||
; out: $06 - $07 (high - low)
|
|
||||||
;================================================================================
|
|
||||||
HudHexToDec2DigitCopy: ; modified
|
|
||||||
PHY
|
|
||||||
LDY.b #$00
|
|
||||||
-
|
|
||||||
CMP.b #10 : !BLT +
|
|
||||||
INY
|
|
||||||
SBC.b #10 : BRA -
|
|
||||||
+
|
|
||||||
STY.b Scrap06 : LDY.b #$00 ; Store 10s digit and reset Y
|
|
||||||
CMP.b #1 : !BLT +
|
|
||||||
-
|
|
||||||
INY
|
|
||||||
DEC : BNE -
|
|
||||||
+
|
|
||||||
STY.b Scrap07 ; Store 1s digit
|
|
||||||
PLY
|
|
||||||
RTS
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
; code to un-pair or re-pair doors
|
|
||||||
|
|
||||||
; doorlist is loaded into 19A0 but no terminator
|
|
||||||
; new room is in A0
|
|
||||||
; for "each" door do the following: (each could mean the first four doors?)
|
|
||||||
; in lookup table, grab room and corresponding position
|
|
||||||
; find the info at 7ef000, x where x is twice the paired room
|
|
||||||
; check the corresponding bit (there are only 4)
|
|
||||||
; set the bit in 068C
|
|
||||||
|
|
||||||
; Note the carry bit is used to indicate if we should aborted (set) or not
|
|
||||||
CheckIfDoorsOpen: {
|
|
||||||
jsr TrapDoorFixer ; see normal.asm
|
|
||||||
; note we are 16bit mode right now
|
|
||||||
lda.l DRMode : beq +
|
|
||||||
lda.w DungeonID : cmp.w #$00ff : bne .gtg
|
|
||||||
+ lda.b RoomIndex : dec : tax : and.w #$000f ; hijacked code
|
|
||||||
sec : rtl ; set carry to indicate normal behavior
|
|
||||||
|
|
||||||
.gtg
|
|
||||||
phb : phk : plb
|
|
||||||
stx.b Scrap00 : ldy.w #$0000
|
|
||||||
.nextDoor
|
|
||||||
lda.b RoomIndex : asl : tax
|
|
||||||
lda.w KeyDoorOffset, x : beq .skipDoor
|
|
||||||
asl : sty.b Scrap05 : !ADD.b Scrap05 : tax
|
|
||||||
lda.w PairedDoorTable, x : beq .skipDoor
|
|
||||||
sta.b Scrap02 : and.w #$00ff : asl a : tax
|
|
||||||
lda.b Scrap02 : and.w #$ff00 : sta.b Scrap03
|
|
||||||
lda.l RoomDataWRAM.l, X : and.w #$f000 : and.b Scrap03 : beq .skipDoor
|
|
||||||
tyx : lda.w $068c : ora.l DungeonMask,x : sta.w $068c
|
|
||||||
.skipDoor
|
|
||||||
iny #2 : cpy.b Scrap00 : bne .nextDoor
|
|
||||||
plb : clc : rtl
|
|
||||||
}
|
|
||||||
|
|
||||||
; outstanding issues
|
|
||||||
; how to indicate opening for other (non-first four doors?)
|
|
||||||
; Bank01 Door Register stores the 4 bits in 068c to 400 (depending on type)
|
|
||||||
; Key collision and others depend on F0-F3 attribute not sure if extendable to other numbers
|
|
||||||
; Dungeon_ProcessTorchAndDoorInteractives.isOpenableDoor is the likely culprit for collision problems
|
|
||||||
; Saving open status to other unused rooms is tricky -- Bank 2 13947 (line 8888)
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
;divide by 2 example
|
|
||||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f 10--Offset Ruler
|
|
||||||
;v 00 01 01 02 02 03 03 04 04 04 05 05 06 06 07 07 08
|
|
||||||
|
|
||||||
;divide by 3 example
|
|
||||||
; 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 14 15 16 17 18
|
|
||||||
;00 00 01 01 01 02 02 02 03 03 03 04 04 04 05 05 05 06 06 06 07 07 07 08 08
|
|
||||||
|
|
||||||
MultiplyByY:
|
|
||||||
.loop cpy.w #$0001 : beq .done
|
|
||||||
cpy.w #$0003 : bne ++
|
|
||||||
jsr MultiBy3 : bra .done
|
|
||||||
++ cpy.w #$0005 : bne ++
|
|
||||||
jsr MultiBy5 : bra .done
|
|
||||||
++ asl : sta.b Scrap00 : tya : lsr : tay : lda.b Scrap00 : bra .loop
|
|
||||||
.done rts
|
|
||||||
|
|
||||||
;Divisor in Y. Width of division is in X for rounding toward middle
|
|
||||||
DivideByY:
|
|
||||||
.loop
|
|
||||||
cpy.w #$0000 : beq .done
|
|
||||||
cpy.w #$0001 : beq .done
|
|
||||||
cpy.w #$0003 : bne ++
|
|
||||||
jsr DivideBy3 : bra .done
|
|
||||||
++ cpy.w #$0005 : bne ++
|
|
||||||
jsr DivideBy5 : bra .done
|
|
||||||
++ jsr DivideBy2 : sta.b Scrap00
|
|
||||||
tya : lsr : tay
|
|
||||||
txa : lsr : tax
|
|
||||||
lda.b Scrap00 : bra .loop
|
|
||||||
.done rts
|
|
||||||
|
|
||||||
MultiBy3:
|
|
||||||
sta.b Scrap00 : asl : !ADD.b Scrap00
|
|
||||||
rts
|
|
||||||
|
|
||||||
MultiBy5:
|
|
||||||
sta.b Scrap00 : asl #2 : !ADD.b Scrap00
|
|
||||||
rts
|
|
||||||
|
|
||||||
;width of divison in x: rounds toward X/2
|
|
||||||
DivideBy2:
|
|
||||||
sta.b Scrap00
|
|
||||||
lsr : bcc .done
|
|
||||||
sta.b Scrap02 : txa : lsr : cmp.b Scrap00 : !BLT +
|
|
||||||
lda.b Scrap02 : inc : bra .done
|
|
||||||
+ lda.b Scrap02
|
|
||||||
.done rts
|
|
||||||
|
|
||||||
DivideBy3:
|
|
||||||
sta.b Scrap00
|
|
||||||
ldx.w #$0000
|
|
||||||
lda.w #$0002
|
|
||||||
.loop cmp.b Scrap00 : !BGE .store
|
|
||||||
inx : !ADD.w #$0003 : bra .loop
|
|
||||||
.store txa
|
|
||||||
rts
|
|
||||||
|
|
||||||
DivideBy5:
|
|
||||||
sta.b Scrap00
|
|
||||||
ldx.w #$0000
|
|
||||||
lda.w #$0003
|
|
||||||
.loop cmp.b Scrap00 : !BGE .store
|
|
||||||
inx : !ADD.w #$0005 : bra .loop
|
|
||||||
.store txa
|
|
||||||
rts
|
|
||||||
@@ -1,448 +0,0 @@
|
|||||||
WarpLeft:
|
|
||||||
lda.l DRMode : beq .end
|
|
||||||
JSR CheckIfCave : BCS .end
|
|
||||||
lda.b LinkPosY : ldx.b LinkQuadrantV
|
|
||||||
jsr CalcIndex
|
|
||||||
!ADD.b #$06 : ldy.b #$01 ; offsets in A, Y
|
|
||||||
jsr LoadRoomHorz
|
|
||||||
.end
|
|
||||||
jsr Cleanup
|
|
||||||
rtl
|
|
||||||
|
|
||||||
WarpRight:
|
|
||||||
lda.l DRMode : beq .end
|
|
||||||
JSR CheckIfCave : BCS .end
|
|
||||||
lda.b LinkPosY : ldx.b LinkQuadrantV
|
|
||||||
jsr CalcIndex
|
|
||||||
!ADD.b #$12 : ldy.b #$ff ; offsets in A, Y
|
|
||||||
jsr LoadRoomHorz
|
|
||||||
.end
|
|
||||||
jsr Cleanup
|
|
||||||
rtl
|
|
||||||
|
|
||||||
WarpUp:
|
|
||||||
lda.l DRMode : beq .end
|
|
||||||
JSR CheckIfCave : BCS .end
|
|
||||||
lda.b LinkPosX : ldx.b LinkQuadrantH
|
|
||||||
jsr CalcIndex
|
|
||||||
ldy.b #$02 ; offsets in A, Y
|
|
||||||
jsr LoadRoomVert
|
|
||||||
.end
|
|
||||||
jsr Cleanup
|
|
||||||
rtl
|
|
||||||
|
|
||||||
; Checks if $a0 is equal to <Room>. If it is, opens its stonewall if it's there
|
|
||||||
macro StonewallCheck(Room)
|
|
||||||
lda.b RoomIndex : cmp.b #<Room> : bne ?end
|
|
||||||
lda.l <Room>*2+$7ef000 : ora.b #$80 : sta.l <Room>*2+$7ef000
|
|
||||||
?end
|
|
||||||
endmacro
|
|
||||||
|
|
||||||
WarpDown:
|
|
||||||
lda.l DRMode : beq .end
|
|
||||||
JSR CheckIfCave : BCS .end
|
|
||||||
lda.b LinkPosX : ldx.b LinkQuadrantH
|
|
||||||
jsr CalcIndex
|
|
||||||
!ADD.b #$0c : ldy.b #$ff ; offsets in A, Y
|
|
||||||
jsr LoadRoomVert
|
|
||||||
%StonewallCheck($43)
|
|
||||||
.end
|
|
||||||
jsr Cleanup
|
|
||||||
rtl
|
|
||||||
|
|
||||||
; carry set = use link door like normal
|
|
||||||
; carry clear = we are in dr mode, never use linking doors
|
|
||||||
CheckLinkDoorR:
|
|
||||||
lda.l DRMode : bne +
|
|
||||||
lda.l $7ec004 : sta.b RoomIndex ; what we wrote over
|
|
||||||
sec : rtl
|
|
||||||
+ clc : rtl
|
|
||||||
|
|
||||||
CheckLinkDoorL:
|
|
||||||
lda.l DRMode : bne +
|
|
||||||
lda.l $7ec003 : sta.b RoomIndex ; what we wrote over
|
|
||||||
sec : rtl
|
|
||||||
+ clc : rtl
|
|
||||||
|
|
||||||
TrapDoorFixer:
|
|
||||||
lda.b $fe : and.w #$0038 : beq .end
|
|
||||||
xba : asl #2 : sta.b Scrap00
|
|
||||||
stz.w TrapDoorFlag : lda.w $068c : ora.b Scrap00 : sta.w $068c
|
|
||||||
.end
|
|
||||||
stz.b $fe ; clear our fe here because we don't need it anymore
|
|
||||||
rts
|
|
||||||
|
|
||||||
Cleanup:
|
|
||||||
lda.l DRFlags : and.b #$10 : beq +
|
|
||||||
stz.w LayerAdjustment
|
|
||||||
+ inc.b GameSubMode
|
|
||||||
lda.b $ef
|
|
||||||
rts
|
|
||||||
|
|
||||||
; carry set if cave, clear otherwise
|
|
||||||
CheckIfCave:
|
|
||||||
REP #$30
|
|
||||||
LDA.b PreviousRoom : CMP.w #$00E1 : BCS .invalid
|
|
||||||
SEP #$30 : CLC : RTS
|
|
||||||
.invalid
|
|
||||||
SEP #$30 : SEC : RTS
|
|
||||||
|
|
||||||
;A needs be to the low coordinate, x needs to be either 0 for left,upper or non-zero for right,down
|
|
||||||
; This sets A (00,02,04) and stores half that at $04 for later use, (src door)
|
|
||||||
CalcIndex: ; A->low byte of Link's Coord, X-> Link's quadrant, DoorOffset x 2 -> A, DoorOffset -> $04 (vert/horz agnostic)
|
|
||||||
cpx.b #00 : bne .largeDoor
|
|
||||||
cmp.b #$d0 : bcc .smallDoor
|
|
||||||
lda.b #$01 : bra .done ; Middle Door
|
|
||||||
.smallDoor lda.b #$00 : bra .done
|
|
||||||
.largeDoor lda.b #$02
|
|
||||||
.done
|
|
||||||
sta.b Scrap04
|
|
||||||
asl
|
|
||||||
rts
|
|
||||||
|
|
||||||
; Y is an adjustment for main direction of travel
|
|
||||||
; A is a door table row offset
|
|
||||||
LoadRoomHorz:
|
|
||||||
{
|
|
||||||
phb : phk : plb
|
|
||||||
sty.b Scrap06 : sta.b Scrap07 : lda.b RoomIndex : pha ; Store normal room on stack
|
|
||||||
lda.b Scrap07 : jsr LookupNewRoom ; New room is in A, Room Data is in $00-$01
|
|
||||||
lda.b Scrap00 : cmp.b #$03 : bne .gtg
|
|
||||||
jsr HorzEdge : pla : bcs .end
|
|
||||||
sta.b RoomIndex : bra .end ; Restore normal room, abort (straight staircases and open edges can get in this routine)
|
|
||||||
|
|
||||||
.gtg ;Good to Go!
|
|
||||||
pla ; Throw away normal room (don't fill up the stack)
|
|
||||||
lda.b RoomIndex : and.b #$0F : asl a : !SUB.b LinkPosX+1 : !ADD.b Scrap06 : sta.b Scrap02
|
|
||||||
ldy.b #$00 : jsr ShiftVariablesMainDir
|
|
||||||
|
|
||||||
lda.b Scrap01 : and.b #$80 : beq .normal
|
|
||||||
ldy.b Scrap06 : cpy.b #$ff : beq +
|
|
||||||
lda.b Scrap01 : jsr LoadEastMidpoint : bra ++
|
|
||||||
+ lda.b Scrap01 : jsr LoadWestMidpoint
|
|
||||||
++ jsr PrepScrollToEdge : bra .scroll
|
|
||||||
|
|
||||||
.normal
|
|
||||||
jsr PrepScrollToNormal
|
|
||||||
.scroll
|
|
||||||
lda.b Scrap01 : and.b #$40 : pha
|
|
||||||
jsr ScrollY
|
|
||||||
pla : beq .end
|
|
||||||
ldy.b #$06 : jsr ApplyScroll
|
|
||||||
.end
|
|
||||||
plb ; restore db register
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
; Y is an adjustment for main direction of travel (stored at $06)
|
|
||||||
; A is a door table row offset (stored a $07)
|
|
||||||
LoadRoomVert:
|
|
||||||
{
|
|
||||||
phb : phk : plb
|
|
||||||
sty.b Scrap06 : sta.b Scrap07 : lda.b RoomIndex : pha ; Store normal room on stack
|
|
||||||
lda.b Scrap07 : jsr LookupNewRoom ; New room is in A, Room Data is in $00-$01
|
|
||||||
lda.b Scrap00 : cmp.b #$03 : bne .gtg
|
|
||||||
jsr VertEdge : pla : bcs .end
|
|
||||||
sta.b RoomIndex : bra .end ; Restore normal room, abort (straight staircases and open edges can get in this routine)
|
|
||||||
.gtg ;Good to Go!
|
|
||||||
pla ; Throw away normal room (don't fill up the stack)
|
|
||||||
lda.b RoomIndex : and.b #$F0 : lsr #3 : !SUB.b LinkPosY+1 : !ADD.b Scrap06 : sta.b Scrap02
|
|
||||||
|
|
||||||
lda.b Scrap01 : and.b #$80 : beq .notEdge
|
|
||||||
ldy.b #$01 : jsr ShiftVariablesMainDir
|
|
||||||
ldy.b Scrap06 : cpy.b #$ff : beq +
|
|
||||||
lda.b Scrap01 : jsr LoadSouthMidpoint : bra ++
|
|
||||||
+ lda.b Scrap01 : jsr LoadNorthMidpoint
|
|
||||||
++ jsr PrepScrollToEdge : bra .scroll
|
|
||||||
|
|
||||||
.notEdge
|
|
||||||
lda.b Scrap01 : and.b #$03 : cmp.b #$03 : bne .normal
|
|
||||||
jsr ScrollToInroomStairs
|
|
||||||
stz.w $046d
|
|
||||||
bra .end
|
|
||||||
.normal
|
|
||||||
ldy.b #$01 : jsr ShiftVariablesMainDir
|
|
||||||
jsr PrepScrollToNormal
|
|
||||||
.scroll
|
|
||||||
lda.b Scrap01 : and.b #$40 : sta.w $046d
|
|
||||||
jsr ScrollX
|
|
||||||
.end
|
|
||||||
plb ; restore db register
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
LookupNewRoom: ; expects data offset to be in A
|
|
||||||
{
|
|
||||||
rep #$30 : and.w #$00FF ;sanitize A reg (who knows what is in the high byte)
|
|
||||||
sta.b Scrap00 ; offset in 00
|
|
||||||
lda.b PreviousRoom : tax ; probably okay loading $a3 in the high byte
|
|
||||||
lda.w DoorOffset,x : and.w #$00FF ;we only want the low byte
|
|
||||||
asl #3 : sta.b Scrap02 : !ADD.b Scrap02 : !ADD.b Scrap02 ;multiply by 24 (data size)
|
|
||||||
!ADD.b Scrap00 ; should now have the offset of the address I want to load
|
|
||||||
tax : lda.w DoorTable,x : sta.b Scrap00
|
|
||||||
and.w #$00FF : sta.b RoomIndex ; assign new room
|
|
||||||
sep #$30
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
; INPUTS-- Y: Direction Index , $02: Shift Value
|
|
||||||
; Sets high bytes of various registers
|
|
||||||
ShiftVariablesMainDir:
|
|
||||||
{
|
|
||||||
lda.w CoordIndex,y : tax
|
|
||||||
lda.b LinkPosY+1,x : !ADD.b Scrap02 : sta.b LinkPosY+1,x ; coordinate update
|
|
||||||
lda.w CameraIndex,y : tax
|
|
||||||
lda.b $e3,x : !ADD.b Scrap02 : sta.b $e3,x ; scroll register high byte
|
|
||||||
lda.w CamQuadIndex,y : tax
|
|
||||||
lda.w $0605,x : !ADD.b Scrap02 : sta.w $0605,x ; high bytes of these guys
|
|
||||||
lda.w $0607,x : !ADD.b Scrap02 : sta.w $0607,x
|
|
||||||
lda.w $0601,x : !ADD.b Scrap02 : sta.w $0601,x
|
|
||||||
lda.w $0603,x : !ADD.b Scrap02 : sta.w $0603,x
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
; Normal Flags should be in $01
|
|
||||||
ScrollToInroomStairs:
|
|
||||||
{
|
|
||||||
jsr PrepScrollToInroomStairs
|
|
||||||
ldy.b #$01 : jsr ShiftVariablesMainDir
|
|
||||||
jsr ScrollX
|
|
||||||
ldy.b #$00 : jsr ApplyScroll
|
|
||||||
lda.b RoomIndex : and.b #$0f : cmp.b #$0f : bne +
|
|
||||||
stz.b BG1H : stz.b BG2H ; special case camera fix
|
|
||||||
lda.b #$1f : sta.b BG1H+1 : sta.b BG2H+1
|
|
||||||
+
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
; Direction should be in $06, Shift Value (see above) in $02 and other info in $01
|
|
||||||
; Sets $02, $04, $05, $ee, $045e, $045f and things related to Y coordinate
|
|
||||||
PrepScrollToInroomStairs:
|
|
||||||
{
|
|
||||||
lda.b Scrap01 : and.b #$30 : lsr #3 : tay
|
|
||||||
lda.w InroomStairsX,y : sta.b Scrap04
|
|
||||||
lda.w InroomStairsX+1,y : sta.b Scrap05
|
|
||||||
lda.b Scrap06 : cmp.b #$ff : beq .south
|
|
||||||
lda.w InroomStairsY+1,y : bne +
|
|
||||||
inc.w $045f ; flag indicating special screen transition
|
|
||||||
dec.b Scrap02 ; shift variables further
|
|
||||||
stz.b LinkQuadrantV
|
|
||||||
lda.b $a8 : and.b #%11111101 : sta.b $a8
|
|
||||||
stz.w CameraTargetS+1 ; North scroll target
|
|
||||||
inc.w $0603 : inc.w $0607
|
|
||||||
dec.w CameraScrollN+1 : dec.w CameraScrollS+1
|
|
||||||
+
|
|
||||||
lda.w InroomStairsY,y : !ADD.b #$20 : sta.b LinkPosY
|
|
||||||
!SUB.b #$38 : sta.w $045e
|
|
||||||
lda.b Scrap01 : and.b #$40 : beq +
|
|
||||||
lda.b LinkPosY : !ADD.b #$20 : sta.b LinkPosY
|
|
||||||
stz.w $045f
|
|
||||||
+
|
|
||||||
dec.b LinkPosY+1
|
|
||||||
%StonewallCheck($1b)
|
|
||||||
bra ++
|
|
||||||
.south
|
|
||||||
lda.w InroomStairsY+1,y : beq +
|
|
||||||
inc.w $045f ; flag indicating special screen transition
|
|
||||||
inc.b Scrap02 ; shift variables further
|
|
||||||
lda.b #$02 : sta.b LinkQuadrantV
|
|
||||||
lda.b $a8 : ora.b #%00000010 : sta.b $a8
|
|
||||||
inc.w CameraTargetN+1 ; South scroll target
|
|
||||||
dec.w $0603 : dec.w $0607
|
|
||||||
inc.w CameraScrollN+1 : inc.w CameraScrollS+1
|
|
||||||
+
|
|
||||||
lda.w InroomStairsY,y : !SUB.b #$20 : sta.b LinkPosY
|
|
||||||
!ADD.b #$38 : sta.w $045e
|
|
||||||
lda.b Scrap01 : and.b #$40 : beq +
|
|
||||||
lda.b LinkPosY : !SUB.b #$20 : sta.b LinkPosY
|
|
||||||
stz.w $045f
|
|
||||||
+
|
|
||||||
inc.b LinkPosY+1
|
|
||||||
++
|
|
||||||
lda.b Scrap01 : and.b #$04 : lsr #2 : sta.b LinkLayer : bne +
|
|
||||||
stz.w $0476
|
|
||||||
+ rts
|
|
||||||
}
|
|
||||||
|
|
||||||
; Target pixel should be in A, other info in $01
|
|
||||||
; Sets $04 $05 and $ee
|
|
||||||
PrepScrollToEdge:
|
|
||||||
{
|
|
||||||
sta.b Scrap04 : lda.b Scrap01 : and.b #$20 : beq +
|
|
||||||
lda.b #01
|
|
||||||
+ sta.b Scrap05
|
|
||||||
lda.b Scrap01 : and.b #$10 : beq +
|
|
||||||
lda.b #01
|
|
||||||
+ sta.b LinkLayer : bne +
|
|
||||||
stz.w $0476
|
|
||||||
+ rts
|
|
||||||
}
|
|
||||||
|
|
||||||
; Normal Flags should be in $01
|
|
||||||
; Sets $04 $05 and $ee, and $fe
|
|
||||||
PrepScrollToNormal:
|
|
||||||
{
|
|
||||||
lda.b Scrap01 : sta.b $fe : and.b #$04 : lsr #2 : sta.b LinkLayer ; trap door and layer
|
|
||||||
bne +
|
|
||||||
stz.w $0476
|
|
||||||
+ stz.b Scrap05 : lda.b #$78 : sta.b Scrap04
|
|
||||||
lda.b Scrap01 : and.b #$03 : beq .end
|
|
||||||
cmp.b #$02 : !BGE +
|
|
||||||
lda.b #$f8 : sta.b Scrap04 : bra .end
|
|
||||||
+ inc.b Scrap05
|
|
||||||
.end rts
|
|
||||||
}
|
|
||||||
|
|
||||||
StraightStairsAdj:
|
|
||||||
{
|
|
||||||
stx.w $0464 : sty.w SFX2 ; what we wrote over
|
|
||||||
lda.l DRMode : beq +
|
|
||||||
lda.w $045e : bne .toInroom
|
|
||||||
lda.w $046d : beq .noScroll
|
|
||||||
sta.b LinkPosX
|
|
||||||
ldy.b #$00 : jsr ApplyScroll
|
|
||||||
stz.w $046d
|
|
||||||
.noScroll
|
|
||||||
jsr GetTileAttribute : tax
|
|
||||||
lda.b GameSubMode : cmp.b #$12 : beq .goingNorth
|
|
||||||
lda.b PreviousRoom : cmp.b #$51 : bne ++
|
|
||||||
rep #$20 : lda.w #$0018 : !ADD.b LinkPosY : sta.b LinkPosY : sep #$20 ; special fix for throne room
|
|
||||||
jsr GetTileAttribute : tax
|
|
||||||
++ lda.l StepAdjustmentDown, X : bra .end
|
|
||||||
; lda.b LinkLayer : beq .end
|
|
||||||
; rep #$20 : lda.w #$ffe0 : !ADD.b LinkPosY : sta.b LinkPosY : sep #$20
|
|
||||||
.goingNorth
|
|
||||||
cpx.b #$00 : bne ++
|
|
||||||
lda.b RoomIndex : cmp.b #$51 : bne ++
|
|
||||||
lda.b #$36 : bra .end ; special fix for throne room
|
|
||||||
++ ldy.b LinkLayer : cpy.b #$00 : beq ++
|
|
||||||
inx
|
|
||||||
++ lda.l StepAdjustmentUp, X
|
|
||||||
.end
|
|
||||||
pha : lda.w $0462 : and.b #$04 : bne ++
|
|
||||||
pla : !ADD.b #$f6 : pha
|
|
||||||
++ pla : !ADD.w $0464 : sta.w $0464
|
|
||||||
+ rtl
|
|
||||||
.toInroom
|
|
||||||
lda.b #$32 : sta.w $0464 : stz.w $045e
|
|
||||||
rtl
|
|
||||||
}
|
|
||||||
|
|
||||||
GetTileAttribute:
|
|
||||||
{
|
|
||||||
phk : pea.w .jslrtsreturn-1
|
|
||||||
pea.w $82802c
|
|
||||||
jml CalculateTransitionLanding ; mucks with x/y sets a to Tile Attribute, I think
|
|
||||||
.jslrtsreturn
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
; 0 open edge
|
|
||||||
; 1 nrm door high
|
|
||||||
; 2 straight str
|
|
||||||
; 3 nrm door low
|
|
||||||
; 4 trap door high
|
|
||||||
; 5 trap door low (none of these exist on North direction)
|
|
||||||
StepAdjustmentUp: ; really North Stairs
|
|
||||||
db $00, $f6, $1a, $18, $16, $38
|
|
||||||
StepAdjustmentDown: ; really South Stairs
|
|
||||||
db $d0, $f6, $10, $1a, $f0, $00
|
|
||||||
|
|
||||||
StraightStairsFix:
|
|
||||||
{
|
|
||||||
pha
|
|
||||||
lda.l DRMode : bne +
|
|
||||||
pla : !ADD.b LinkPosY : sta.b LinkPosY : rtl ;what we wrote over
|
|
||||||
+ pla : rtl
|
|
||||||
}
|
|
||||||
|
|
||||||
StraightStairLayerFix:
|
|
||||||
{
|
|
||||||
lda.l DRMode : beq +
|
|
||||||
lda.b LinkLayer : rtl
|
|
||||||
+ lda.l LayerOfDestination+3, x : rtl ; what we wrote over
|
|
||||||
}
|
|
||||||
|
|
||||||
DoorToStraight:
|
|
||||||
{
|
|
||||||
pha
|
|
||||||
lda.l DRMode : beq .skip
|
|
||||||
pla : bne .end
|
|
||||||
pha
|
|
||||||
lda.b RoomIndex : cmp.b #$51 : bne .skip
|
|
||||||
lda.b #$04 : sta.b $4e
|
|
||||||
.skip pla
|
|
||||||
.end LDX.w TransitionDirection : CMP.b #$02 ; what we wrote over
|
|
||||||
rtl
|
|
||||||
}
|
|
||||||
|
|
||||||
DoorToInroom:
|
|
||||||
{
|
|
||||||
ldx.w $045e : bne .end
|
|
||||||
sta.w $0020, y ; what we wrote over
|
|
||||||
.end
|
|
||||||
ldx.b #$00 ; what we wrote over
|
|
||||||
rtl
|
|
||||||
}
|
|
||||||
|
|
||||||
DoorToInroomEnd:
|
|
||||||
{
|
|
||||||
ldy.w $045e : beq .vanilla
|
|
||||||
cmp.w $045e : bne .return
|
|
||||||
stz.w $045e ; clear
|
|
||||||
.return
|
|
||||||
rtl
|
|
||||||
.vanilla
|
|
||||||
cmp.l UnderworldTransitionLandingCoordinate, x ; what we wrote over
|
|
||||||
rtl
|
|
||||||
}
|
|
||||||
|
|
||||||
StraightStairsTrapDoor:
|
|
||||||
{
|
|
||||||
lda.w $0464 : bne +
|
|
||||||
; reset function
|
|
||||||
.reset phk : pea.w .jslrtsreturn-1
|
|
||||||
pea.w $82802c
|
|
||||||
jml ResetThenCacheRoomEntryProperties ; $10D71 .reset label of Bank02
|
|
||||||
.jslrtsreturn
|
|
||||||
lda.w TrapDoorFlag : bne ++
|
|
||||||
lda.b RoomIndex : cmp.b #$ac : bne .animateTraps
|
|
||||||
lda.w $0403 : and.b #$20 : bne .animateTraps
|
|
||||||
lda.w $0403 : and.b #$10 : beq ++
|
|
||||||
.animateTraps
|
|
||||||
lda.b #$05 : sta.b GameSubMode
|
|
||||||
inc.w TrapDoorFlag : stz.w TileMapDoorPos : stz.w DoorTimer
|
|
||||||
++ JML Underworld_SetBossOrSancMusicUponEntry_long
|
|
||||||
+ JML Dungeon_ApproachFixedColor ; what we wrote over
|
|
||||||
}
|
|
||||||
|
|
||||||
InroomStairsTrapDoor:
|
|
||||||
{
|
|
||||||
lda.w SubModuleInterface : cmp.b #$05 : beq .reset
|
|
||||||
lda.b SubSubModule : jml JumpTableLocal ; what we wrote over (essentially)
|
|
||||||
.reset
|
|
||||||
pla : pla : pla
|
|
||||||
jsl StraightStairsTrapDoor_reset
|
|
||||||
jml $828b15 ; just some RTS in bank 02
|
|
||||||
}
|
|
||||||
|
|
||||||
HandleSpecialDoorLanding: {
|
|
||||||
LDA.l $7F2000,X ; what we wrote over
|
|
||||||
SEP #$30
|
|
||||||
; A = tiletype
|
|
||||||
HandleIncomingDoorState:
|
|
||||||
PHA
|
|
||||||
LDA.l DRMode : BEQ .noDoor
|
|
||||||
LDA.b 1,S : AND.b #$FA : CMP.b #$80 : bne .noDoor
|
|
||||||
|
|
||||||
.setDoorState
|
|
||||||
LDA.w TransitionDirection : AND.b #$02 : BNE + : INC
|
|
||||||
+ STA.b $6C
|
|
||||||
|
|
||||||
.noDoor
|
|
||||||
PLA
|
|
||||||
CMP.b #$34 : BNE + ; inroom stairs
|
|
||||||
PHA : LDA.b #$26 : STA.w $045E : PLA
|
|
||||||
+
|
|
||||||
RTL
|
|
||||||
}
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
GtBossHeartCheckOverride:
|
|
||||||
lda.b RoomIndex : cmp.b #$1c : beq ++
|
|
||||||
cmp.b #$6c : beq ++
|
|
||||||
cmp.b #$4d : bne +
|
|
||||||
++ lda.l DRFlags : and.b #$01 : bne ++ ;skip if flag on
|
|
||||||
lda.w RoomItemsTaken : ora.b #$80 : sta.w RoomItemsTaken
|
|
||||||
++ clc
|
|
||||||
rtl
|
|
||||||
+ sec
|
|
||||||
rtl
|
|
||||||
|
|
||||||
OnFileLoadOverride:
|
|
||||||
jsl OnFileLoad ; what I wrote over
|
|
||||||
+ lda.l DRFlags : and.b #$02 : beq + ; Mirror Scroll
|
|
||||||
lda.l MirrorEquipment : bne +
|
|
||||||
lda.b #$01 : sta.l MirrorEquipment
|
|
||||||
+ rtl
|
|
||||||
|
|
||||||
MirrorCheckOverride:
|
|
||||||
lda.l DRFlags : and.b #$02 : beq ++
|
|
||||||
lda.l MirrorEquipment : cmp.b #$01 : beq +
|
|
||||||
++ lda.b OverworldIndex : and.b #$40 ; what I wrote over
|
|
||||||
rtl
|
|
||||||
+ lda.l DRScroll : rtl
|
|
||||||
|
|
||||||
EGFixOnMirror:
|
|
||||||
lda.l DRFlags : and.b #$10 : beq +
|
|
||||||
stz.w LayerAdjustment
|
|
||||||
+ jsl Mirror_SaveRoomData
|
|
||||||
rtl
|
|
||||||
|
|
||||||
BlockEraseFix:
|
|
||||||
lda.l MirrorEquipment : and.b #$02 : beq +
|
|
||||||
stz.w $05fc : stz.w $05fd
|
|
||||||
+ rtl
|
|
||||||
|
|
||||||
FixShopCode:
|
|
||||||
cpx.w #$0300 : !BGE +
|
|
||||||
sta.l RoomDataWRAM[$00].l, x
|
|
||||||
+ rtl
|
|
||||||
|
|
||||||
VitreousKeyReset:
|
|
||||||
LDA.l FixPrizeOnTheEyes : BEQ +
|
|
||||||
STZ.w SpriteForceDrop, X
|
|
||||||
+ JML SpritePrep_LoadProperties ; what we wrote over
|
|
||||||
|
|
||||||
GuruguruFix:
|
|
||||||
lda.b RoomIndex : cmp.b #$df : !BGE +
|
|
||||||
and.b #$0f : cmp.b #$0e : !BLT +
|
|
||||||
iny #2
|
|
||||||
+ rtl
|
|
||||||
|
|
||||||
BlindAtticFix:
|
|
||||||
lda.l DRMode : beq +
|
|
||||||
lda.b #$01 : rtl
|
|
||||||
+ lda.l FollowerIndicator : cmp.b #$06
|
|
||||||
rtl
|
|
||||||
|
|
||||||
SuctionOverworldFix:
|
|
||||||
stz.b LinkStrafe : stz.b LinkSpeed
|
|
||||||
lda.l DRMode : beq +
|
|
||||||
stz.b ForceMove
|
|
||||||
+ rtl
|
|
||||||
|
|
||||||
CutoffEntranceRug:
|
|
||||||
PHA : PHX
|
|
||||||
LDA.l DRMode : BEQ .norm
|
|
||||||
LDA.b Scrap04 : CMP.w #$000A : BEQ + ; only affect A & C objects
|
|
||||||
CMP.w #$000C : BNE .norm
|
|
||||||
+ LDX.w #$0000 : LDA.l CutoffRooms, x
|
|
||||||
- CMP.b RoomIndex : BEQ .check
|
|
||||||
INX #2 : LDA.l CutoffRooms, x : CMP.w #$FFFF : BNE -
|
|
||||||
.norm
|
|
||||||
PLX : PLA : LDA.w $9B52, Y : STA.l TileMapA, X ; what we wrote over
|
|
||||||
RTL
|
|
||||||
.check
|
|
||||||
LDA.b Scrap0C : CMP.w #$0004 : !BGE .skip
|
|
||||||
LDA.b Scrap0E : CMP.w #$0008 : !BGE .skip
|
|
||||||
CMP.w #$0004 : !BLT .skip
|
|
||||||
BRA .norm
|
|
||||||
.skip
|
|
||||||
PLX : PLA : RTL
|
|
||||||
|
|
||||||
StoreTempBunnyState:
|
|
||||||
LDA.b LinkState : CMP.b #$1C : BNE +
|
|
||||||
STA.b ManipTileField
|
|
||||||
+ LDA.b #$15 : STA.b LinkState ; what we wrote over
|
|
||||||
RTL
|
|
||||||
|
|
||||||
RetrieveBunnyState:
|
|
||||||
STY.b LinkState : STZ.w ItemReceiptID ; what we wrote over
|
|
||||||
LDA.b ManipTileField : BEQ +
|
|
||||||
STA.b LinkState
|
|
||||||
+ JML MaybeKeepLootID
|
|
||||||
|
|
||||||
; A should be how much dmg to do to Aga when leaving this function, 0 if prevented
|
|
||||||
StandardAgaDmg:
|
|
||||||
LDX.b #$00 ; part of what we wrote over
|
|
||||||
LDA.l ProgressFlags : AND.b #$04 : BNE .enableDamage ; zelda's been rescued, no further checks needed
|
|
||||||
; zelda's not been rescued
|
|
||||||
LDA.l AllowAgaDamageBeforeZeldaRescued : BEQ + ; zelda needs to be rescued if not allowed
|
|
||||||
.enableDamage
|
|
||||||
LDA.b #$10 ; hurt him!
|
|
||||||
+ RTL
|
|
||||||
|
|
||||||
StandardSaveAndQuit:
|
|
||||||
LDA.b #$0F : STA.b MOSAICQ ; what we wrote over
|
|
||||||
LDA.l ProgressFlags : AND.b #$04 : BNE +
|
|
||||||
LDA.l DRMode : BEQ +
|
|
||||||
LDA.l StartingEntrance : CMP.b #$02 : BCC +
|
|
||||||
LDA.b #$03 : STA.l StartingEntrance ; set spawn to uncle if >=
|
|
||||||
+ RTL
|
|
||||||
|
|
||||||
; note: this skips both maiden dialog triggers if the hole is open
|
|
||||||
BlindsAtticHint:
|
|
||||||
REP #$20
|
|
||||||
CMP.w #$0122 : BNE +
|
|
||||||
LDA.l RoomDataWRAM[$65].low : AND.w #$0100 : BEQ +
|
|
||||||
SEP #$20 : RTL ; skip the dialog box if the hole is already open
|
|
||||||
+ SEP #$20 : JML Main_ShowTextMessage
|
|
||||||
|
|
||||||
BlindZeldaDespawnFix:
|
|
||||||
CMP.b #06 : BEQ +
|
|
||||||
LDA.w SpritePosYLow,X : BEQ + ; don't despawn follower if maiden isn't "present"
|
|
||||||
PLA : PLA : PEA.w SpritePrep_BlindMaiden_despawn_follower-1 : RTL
|
|
||||||
+ PLA : PLA : PEA.w SpritePrep_BlindMaiden_kill_the_girl-1 : RTL
|
|
||||||
|
|
||||||
BigKeyDoorCheck:
|
|
||||||
CPY.w #$001E : BNE + ; skip if it isn't a BK door
|
|
||||||
LDA.l DRFlags : AND.w #$0400 : BNE + ; skip if the flag is set - bk doors can be double-sided
|
|
||||||
PLA : PEA.w RoomDraw_OneSidedShutters_South_onesided_shutter_or_big_key_door-1
|
|
||||||
+ LDA.w #$0000 : RTL
|
|
||||||
|
|
||||||
FixOvalFadeOutMirror:
|
|
||||||
LDA.b $10 : CMP.b #$0F : BEQ .skip_activation
|
|
||||||
LDA.l InvertedMode : BNE +
|
|
||||||
LDA.l CurrentWorld : BNE .skip_activation
|
|
||||||
RTL
|
|
||||||
+ LDA.l CurrentWorld : BEQ .skip_activation
|
|
||||||
RTL
|
|
||||||
.skip_activation
|
|
||||||
PLA : PLA : PLA : JML Sprite_6C_MirrorPortal_missing_mirror
|
|
||||||
@@ -1,222 +0,0 @@
|
|||||||
AdjustTransition:
|
|
||||||
{
|
|
||||||
lda.b $ab : and.w #$01ff : beq .reset
|
|
||||||
phy : ldy.b #$06 ; operating on vertical registers during horizontal trans
|
|
||||||
cpx.b #$02 : bcs .horizontalScrolling
|
|
||||||
ldy.b #$00 ; operate on horizontal regs during vert trans
|
|
||||||
.horizontalScrolling
|
|
||||||
cmp.w #$0008 : bcs +
|
|
||||||
pha : lda.b $ab : and.w #$0200 : beq ++
|
|
||||||
pla : bra .add
|
|
||||||
++ pla : eor.w #$ffff : inc ; convert to negative
|
|
||||||
.add jsr AdjustCamAdd : ply : bra .reset
|
|
||||||
+ lda.b $ab : and.w #$0200 : xba : tax
|
|
||||||
lda.l OffsetTable,x : jsr AdjustCamAdd
|
|
||||||
lda.b $ab : !SUB.w #$0008 : sta.b $ab
|
|
||||||
ply : bra .done
|
|
||||||
.reset ; clear the $ab variable so to not disturb intra-tile doors
|
|
||||||
stz.b $ab
|
|
||||||
.done
|
|
||||||
lda.b Scrap00 : and.w #$01fc
|
|
||||||
rtl
|
|
||||||
}
|
|
||||||
|
|
||||||
AdjustCamAdd:
|
|
||||||
!ADD.w $00E2,y : pha
|
|
||||||
and.w #$01ff : cmp.w #$0111 : !BLT +
|
|
||||||
cmp.w #$01f8 : !BGE ++
|
|
||||||
pla : and.w #$ff10 : pha : bra +
|
|
||||||
++ pla : and.w #$ff00 : !ADD.w #$0100 : pha
|
|
||||||
+ pla : sta.w $00E2,y : sta.w $00E0,y : rts
|
|
||||||
|
|
||||||
; expects target quad in $05 (either 0 or 1) and target pixel in $04, target room should be in $a0
|
|
||||||
; $06 is either $ff or $01/02
|
|
||||||
; uses $00-$03 and $0e for calculation
|
|
||||||
; also set up $ac
|
|
||||||
ScrollY: ;change the Y offset variables
|
|
||||||
lda.b RoomIndex : and.b #$f0 : lsr #3 : sta.w $0603 : inc : sta.w $0607
|
|
||||||
|
|
||||||
lda.b Scrap05 : bne +
|
|
||||||
lda.w $0603 : sta.b Scrap00 : stz.b Scrap01 : bra ++
|
|
||||||
+ lda.w $0607 : sta.b Scrap00 : lda.b #$02 : sta.b Scrap01
|
|
||||||
++ ; $01 now contains 0 or 2 and $00 contains the correct lat
|
|
||||||
|
|
||||||
stz.b Scrap0E
|
|
||||||
rep #$30
|
|
||||||
lda.b Scrap00 : pha
|
|
||||||
|
|
||||||
lda.b BG2V : and.w #$01ff : sta.b Scrap02
|
|
||||||
lda.b Scrap04 : jsr LimitYCamera : sta.b Scrap00
|
|
||||||
jsr CheckRoomLayoutY : bcc +
|
|
||||||
lda.b Scrap00 : cmp.w #$0080 : !BGE ++
|
|
||||||
cmp.w #$0010 : !BLT .cmpSrll
|
|
||||||
lda.w #$0010 : bra .cmpSrll
|
|
||||||
++ cmp.w #$0100 : !BGE .cmpSrll
|
|
||||||
lda.w #$0100
|
|
||||||
.cmpSrll sta.b Scrap00
|
|
||||||
|
|
||||||
; figures out scroll amt
|
|
||||||
+ lda.b Scrap00 : cmp.b Scrap02 : bne +
|
|
||||||
lda.w #$0000 : bra .next
|
|
||||||
+ !BLT +
|
|
||||||
!SUB.b Scrap02 : inc.b Scrap0E : bra .next
|
|
||||||
+ lda.b Scrap02 : !SUB.b Scrap00
|
|
||||||
|
|
||||||
.next
|
|
||||||
sta.b $ab
|
|
||||||
jsr AdjustCameraBoundsY
|
|
||||||
|
|
||||||
pla : sta.b Scrap00
|
|
||||||
sep #$30
|
|
||||||
lda.b Scrap04 : sta.b $20
|
|
||||||
lda.b Scrap00 : sta.b $21 : sta.w $0601 : sta.w $0605
|
|
||||||
lda.b Scrap01 : sta.b $aa
|
|
||||||
lda.b Scrap0E : asl : ora.b $ac : sta.b $ac
|
|
||||||
lda.b BG2V+1 : and.b #$01 : asl #2 : tax : lda.w $0603, x : sta.b BG2V+1
|
|
||||||
rts
|
|
||||||
|
|
||||||
LimitYCamera:
|
|
||||||
cmp.w #$006c : !BGE +
|
|
||||||
lda.w #$0000 : bra .end
|
|
||||||
+ cmp.w #$017d : !BLT +
|
|
||||||
lda.w #$0110 : bra .end
|
|
||||||
+ !SUB.w #$006c
|
|
||||||
.end rts
|
|
||||||
|
|
||||||
CheckRoomLayoutY:
|
|
||||||
jsr LoadRoomLayout ;switches to 8-bit
|
|
||||||
cmp.b #$00 : beq .lock
|
|
||||||
cmp.b #$07 : beq .free
|
|
||||||
cmp.b #$01 : beq .free
|
|
||||||
cmp.b #$04 : !BGE .lock
|
|
||||||
cmp.b #$02 : bne +
|
|
||||||
lda.b Scrap06 : cmp.b #$ff : beq .lock
|
|
||||||
+ cmp.b #$03 : bne .free
|
|
||||||
lda.b Scrap06 : cmp.b #$ff : bne .lock
|
|
||||||
.free rep #$30 : clc : rts
|
|
||||||
.lock rep #$30 : sec : rts
|
|
||||||
|
|
||||||
AdjustCameraBoundsY:
|
|
||||||
jsr CheckRoomLayoutY : bcc .free
|
|
||||||
|
|
||||||
; layouts that are camera locked (quads only)
|
|
||||||
lda.b Scrap04 : and.w #$00ff : cmp.w #$007d : !BLT +
|
|
||||||
lda.w #$0088 : bra ++
|
|
||||||
+ cmp.w #$006d : !BGE +
|
|
||||||
lda.w #$0078 : bra ++
|
|
||||||
+ !ADD.w #$000b
|
|
||||||
|
|
||||||
; I think we no longer need the $02 variable
|
|
||||||
++ sta.b Scrap02 : lda.b Scrap04 : and.w #$0100 : !ADD.b Scrap02 : bra .setBounds
|
|
||||||
|
|
||||||
; layouts where the camera is free
|
|
||||||
.free lda.b Scrap04 : cmp.w #$006c : !BGE +
|
|
||||||
lda.w #$0077 : bra .setBounds
|
|
||||||
+ cmp.w #$017c : !BLT +
|
|
||||||
lda.w #$0187 : bra .setBounds
|
|
||||||
+ !ADD.w #$000b
|
|
||||||
.setBounds sta.w $0618 : inc #2 : sta.w $061a
|
|
||||||
rts
|
|
||||||
|
|
||||||
LoadRoomLayout:
|
|
||||||
lda.b RoomIndex : asl : !ADD.b RoomIndex : tax
|
|
||||||
lda.l RoomData_ObjectDataPointers+1, x : sta.b $b8
|
|
||||||
lda.l RoomData_ObjectDataPointers, x : sta.b $b7
|
|
||||||
sep #$30
|
|
||||||
ldy.b #$01 : lda.b [$b7], y : and.b #$1c : lsr #2
|
|
||||||
rts
|
|
||||||
|
|
||||||
; expects target quad in $05 (either 0 or 1) and target pixel in $04, target room should be in $a0
|
|
||||||
; uses $00-$03 and $0e for calculation
|
|
||||||
; also set up $ac
|
|
||||||
ScrollX: ;change the X offset variables
|
|
||||||
lda.b RoomIndex : and.b #$0f : asl : sta.w $060b : inc : sta.w $060f
|
|
||||||
|
|
||||||
lda.b Scrap05 : bne +
|
|
||||||
lda.w $060b : sta.b Scrap00 : stz.b Scrap01 : bra ++
|
|
||||||
+ lda.w $060f : sta.b Scrap00 : lda.b #$01 : sta.b Scrap01
|
|
||||||
++ ; $01 now contains 0 or 1 and $00 contains the correct long
|
|
||||||
|
|
||||||
stz.b Scrap0E ; pos/neg indicator
|
|
||||||
rep #$30
|
|
||||||
lda.b Scrap00 : pha
|
|
||||||
|
|
||||||
lda.b BG2H : and.w #$01ff : sta.b Scrap02
|
|
||||||
lda.b Scrap04 : jsr LimitXCamera : sta.b Scrap00
|
|
||||||
jsr CheckRoomLayoutX : bcc +
|
|
||||||
lda.b Scrap00 : cmp.w #$0080 : !BGE ++
|
|
||||||
lda.w #$0000 : bra .cmpSrll
|
|
||||||
++ lda.w #$0100
|
|
||||||
.cmpSrll sta.b Scrap00
|
|
||||||
|
|
||||||
;figures out scroll amt
|
|
||||||
+ lda.b Scrap00 : cmp.b Scrap02 : bne +
|
|
||||||
lda.w #$0000 : bra .next
|
|
||||||
+ !BLT +
|
|
||||||
!SUB.b Scrap02 : inc.b Scrap0E : bra .next
|
|
||||||
+ lda.b Scrap02 : !SUB.b Scrap00
|
|
||||||
|
|
||||||
.next
|
|
||||||
sta.b $ab : lda.b Scrap04
|
|
||||||
|
|
||||||
cmp.w #$0078 : !BGE +
|
|
||||||
lda.w #$007f : bra ++
|
|
||||||
+ cmp.w #$0178 : !BLT +
|
|
||||||
lda.w #$017f : bra ++
|
|
||||||
+ !ADD.w #$0007
|
|
||||||
++ sta.w $061c : inc #2 : sta.w $061e
|
|
||||||
|
|
||||||
pla : sta.b Scrap00
|
|
||||||
sep #$30
|
|
||||||
lda.b Scrap04 : ldx.w $046d : bne .straight
|
|
||||||
sta.b LinkPosX : bra +
|
|
||||||
.straight
|
|
||||||
sta.w $046d ; set X position later
|
|
||||||
+
|
|
||||||
lda.b Scrap00 : sta.b LinkPosX+1 : sta.w $0609 : sta.w $060d
|
|
||||||
lda.b Scrap01 : sta.b LinkQuadrantH
|
|
||||||
lda.b Scrap0E : asl : ora.b $ac : sta.b $ac
|
|
||||||
lda.b BG2H+1 : and.b #$01 : asl #2 : tax : lda.w $060b, x : sta.b BG2H+1
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
LimitXCamera:
|
|
||||||
cmp.w #$0079 : !BGE +
|
|
||||||
lda.w #$0000 : bra .end
|
|
||||||
+ cmp.w #$0178 : !BLT +
|
|
||||||
lda.w #$0178
|
|
||||||
+ !SUB.w #$0078
|
|
||||||
.end rts
|
|
||||||
|
|
||||||
CheckRoomLayoutX:
|
|
||||||
jsr LoadRoomLayout ;switches to 8-bit
|
|
||||||
cmp.b #$04 : !BLT .lock
|
|
||||||
cmp.b #$05 : bne +
|
|
||||||
lda.b Scrap06 : cmp.b #$ff : beq .lock
|
|
||||||
+ cmp.b #$06 : bne .free
|
|
||||||
lda.b Scrap06 : cmp.b #$ff : bne .lock
|
|
||||||
.free rep #$30 : clc : rts
|
|
||||||
.lock rep #$30 : sec : rts
|
|
||||||
|
|
||||||
ApplyScroll:
|
|
||||||
rep #$30
|
|
||||||
lda.b $ab : and.w #$01ff : sta.b Scrap00
|
|
||||||
lda.b $ab : and.w #$0200 : beq +
|
|
||||||
lda.w $00e2, y : !ADD.b Scrap00 : bra .end
|
|
||||||
+ lda.w $00e2, y : !SUB.b Scrap00
|
|
||||||
.end
|
|
||||||
sta.w $00e2, y
|
|
||||||
sta.w $00e0, y
|
|
||||||
stz.b $ab : sep #$30 : rts
|
|
||||||
|
|
||||||
QuadrantLoadOrderBeforeScroll:
|
|
||||||
lda.w $045f : beq .end
|
|
||||||
lda.b #$08 : sta.w $045c ; start with opposite quadrant row
|
|
||||||
.end
|
|
||||||
JML WaterFlood_BuildOneQuadrantForVRAM ; what we overwrote
|
|
||||||
|
|
||||||
QuadrantLoadOrderAfterScroll:
|
|
||||||
lda.w $045f : beq .end
|
|
||||||
stz.w $045c : stz.w $045f ; draw other row and clear flag
|
|
||||||
.end
|
|
||||||
JML WaterFlood_BuildOneQuadrantForVRAM ; what we overwrote
|
|
||||||
@@ -1,338 +0,0 @@
|
|||||||
RecordStairType: {
|
|
||||||
pha
|
|
||||||
lda.l DRMode : beq .norm
|
|
||||||
REP #$30 : LDA.b PreviousRoom : CMP.w #$00E1 : BCS .norm
|
|
||||||
CMP.w #$00DF : BEQ .norm
|
|
||||||
SEP #$30
|
|
||||||
lda.b Scrap0E
|
|
||||||
cmp.b #$25 : bcc ++ ; don't record straight staircases
|
|
||||||
sta.w $045e
|
|
||||||
++ pla : bra +
|
|
||||||
.norm SEP #$30 : pla : sta.b RoomIndex
|
|
||||||
+ lda.w $063d, x
|
|
||||||
rtl
|
|
||||||
}
|
|
||||||
|
|
||||||
SpiralWarp: {
|
|
||||||
lda.l DRMode : beq .abort ; abort if not DR
|
|
||||||
REP #$30 : LDA.b PreviousRoom : CMP.w #$00E1 : BCS .abort
|
|
||||||
CMP.w #$00DF : BEQ .abort
|
|
||||||
SEP #$30
|
|
||||||
lda.w $045e : cmp.b #$5e : beq .gtg ; abort if not spiral - intended room is in A!
|
|
||||||
cmp.b #$5f : beq .gtg
|
|
||||||
cmp.b #$26 : beq .inroom
|
|
||||||
.abort
|
|
||||||
SEP #$30 : stz.w $045e : lda.b PreviousRoom : and.b #$0f : rtl ; clear,run hijacked code and get out
|
|
||||||
.inroom
|
|
||||||
jsr InroomStairsWarp
|
|
||||||
lda.b PreviousRoom : and.b #$0f ; this is the code we are hijacking
|
|
||||||
rtl
|
|
||||||
|
|
||||||
.gtg
|
|
||||||
phb : phk : plb : phx : phy ; push stuff
|
|
||||||
jsr LookupSpiralOffset
|
|
||||||
rep #$30 : and.w #$00FF : asl #2 : tax
|
|
||||||
lda.w SpiralTable, x : sta.b Scrap00
|
|
||||||
lda.w SpiralTable+2, x : sta.b Scrap02
|
|
||||||
sep #$30
|
|
||||||
lda.b Scrap00 : sta.b RoomIndex
|
|
||||||
; shift quadrant if necessary
|
|
||||||
stz.b Scrap07 ; this is a x quad adjuster for those blasted staircase on the edges
|
|
||||||
lda.b Scrap01 : and.b #$01 : !SUB.b LinkQuadrantH
|
|
||||||
bne .xQuad
|
|
||||||
lda.w $0462 : and.b #$04 : bne .xqCont
|
|
||||||
inc.b Scrap07
|
|
||||||
.xqCont lda.b LinkPosX : bne .skipXQuad ; this is an edge case
|
|
||||||
dec.b LinkPosX+1 : bra .skipXQuad ; need to -1 if $22 is 0
|
|
||||||
.xQuad sta.b Scrap06 : !ADD.b LinkQuadrantH : sta.b LinkQuadrantH
|
|
||||||
lda.w $0462 : and.b #$04 : bne .xCont
|
|
||||||
inc.b Scrap07 ; up stairs are going to -1 the quad anyway during transition, need to add this back
|
|
||||||
.xCont ldy.b #$00 : jsr ShiftQuadSimple
|
|
||||||
|
|
||||||
.skipXQuad
|
|
||||||
lda.b LinkQuadrantV : lsr : sta.b Scrap06 : lda.b Scrap01 : and.b #$02 : lsr : !SUB.b Scrap06
|
|
||||||
beq .skipYQuad
|
|
||||||
sta.b Scrap06 : asl : !ADD.b LinkQuadrantV : sta.b LinkQuadrantV
|
|
||||||
ldy.b #$01 : jsr ShiftQuadSimple
|
|
||||||
|
|
||||||
.skipYQuad
|
|
||||||
lda.b Scrap01 : and.b #$04 : lsr : sta.w $048a ;fix layer calc 0->0 2->1
|
|
||||||
lda.b Scrap01 : and.b #$08 : lsr #2 : sta.w $0492 ;fix from layer calc 0->0 2->1
|
|
||||||
; shift lower coordinates
|
|
||||||
lda.b Scrap02 : sta.b LinkPosX : bne .adjY : lda.b LinkPosX+1 : !ADD.b Scrap07 : sta.b LinkPosX+1
|
|
||||||
.adjY lda.b Scrap03 : sta.b LinkPosY : bne .upDownAdj : inc.b LinkPosY+1
|
|
||||||
.upDownAdj ldx.b #$08
|
|
||||||
lda.w $0462 : and.b #$04 : beq .upStairs
|
|
||||||
ldx.b #$fd
|
|
||||||
lda.b Scrap01 : and.b #$80 : bne .set53
|
|
||||||
; if target is also down adjust by (6,-15)
|
|
||||||
lda.b #$06 : !ADD.b LinkPosY : sta.b LinkPosY : lda.b #$eb : !ADD.b LinkPosX : sta.b LinkPosX : bra .set53
|
|
||||||
.upStairs
|
|
||||||
lda.b Scrap01 : and.b #$80 : beq .set53
|
|
||||||
; if target is also up adjust by (-6, 14)
|
|
||||||
lda.b #$fa : !ADD.b LinkPosY : sta.b LinkPosY : lda.b #$14 : !ADD.b LinkPosX : sta.b LinkPosX
|
|
||||||
bne .set53 : inc.b LinkPosX+1
|
|
||||||
.set53
|
|
||||||
txa : !ADD.b LinkPosX : sta.b $53
|
|
||||||
|
|
||||||
lda.b Scrap01 : and.b #$10 : sta.b Scrap07 ; zeroHzCam check
|
|
||||||
ldy.b #$00 : jsr SetCamera
|
|
||||||
lda.b Scrap01 : and.b #$20 : sta.b Scrap07 ; zeroVtCam check
|
|
||||||
ldy.b #$01 : jsr SetCamera
|
|
||||||
|
|
||||||
jsr StairCleanup
|
|
||||||
ply : plx : plb ; pull the stuff we pushed
|
|
||||||
lda.b PreviousRoom : and.b #$0f ; this is the code we are hijacking
|
|
||||||
rtl
|
|
||||||
}
|
|
||||||
|
|
||||||
StairCleanup: {
|
|
||||||
stz.w $045e ; clear the staircase flag
|
|
||||||
|
|
||||||
; animated tiles fix
|
|
||||||
lda.l DRMode : cmp.b #$02 : bne + ; only do this in crossed mode
|
|
||||||
ldx.b RoomIndex : lda.l TilesetTable, x
|
|
||||||
cmp.w $0aa1 : beq + ; already eq no need to decomp
|
|
||||||
sta.w $0aa1
|
|
||||||
tax : lda.l AnimatedTileSheets, x : tay
|
|
||||||
jsl DecompDungAnimatedTiles
|
|
||||||
+
|
|
||||||
stz.w LayerAdjustment
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
LookupSpiralOffset_long:
|
|
||||||
PHB : PHK : PLB
|
|
||||||
JSR LookupSpiralOffset
|
|
||||||
PLB : RTL
|
|
||||||
|
|
||||||
;Sets the offset in A
|
|
||||||
LookupSpiralOffset: {
|
|
||||||
;where link currently is in $a2: quad in a8 & #$03
|
|
||||||
;count doors
|
|
||||||
stz.b Scrap00 : ldx.b #$00 : stz.b Scrap01
|
|
||||||
|
|
||||||
.loop
|
|
||||||
lda.w $047e, x : cmp.b Scrap00 : bcc .continue
|
|
||||||
sta.b Scrap00
|
|
||||||
.continue inx #2
|
|
||||||
cpx.b #$08 : bcc .loop
|
|
||||||
|
|
||||||
lda.b Scrap00 : lsr
|
|
||||||
cmp.b #$01 : beq .done
|
|
||||||
|
|
||||||
; look up the quad
|
|
||||||
lda.b LinkQuadrantH : ora.b LinkQuadrantV : and.b #$03 : beq .quad0
|
|
||||||
cmp.b #$01 : beq .quad1
|
|
||||||
cmp.b #$02 : beq .quad2
|
|
||||||
bra .quad3
|
|
||||||
.quad0
|
|
||||||
inc.b Scrap01 : lda.b PreviousRoom
|
|
||||||
cmp.b #$0c : beq .q0diff ;gt ent
|
|
||||||
cmp.b #$70 : bne .done ;hc stairwell
|
|
||||||
.q0diff lda.b LinkPosX : cmp.b #$00 : beq .secondDoor
|
|
||||||
cmp.b #$98 : bcc .done ;gt ent and hc stairwell
|
|
||||||
.secondDoor inc.b Scrap01 : bra .done
|
|
||||||
.quad1
|
|
||||||
lda.b PreviousRoom
|
|
||||||
cmp.b #$1a : beq .q1diff ;pod compass
|
|
||||||
cmp.b #$26 : beq .q1diff ;swamp elbows
|
|
||||||
cmp.b #$6a : beq .q1diff ;pod dark basement
|
|
||||||
cmp.b #$76 : bne .done ;swamp drain
|
|
||||||
.q1diff lda.b LinkPosX : cmp.b #$98 : bcc .done
|
|
||||||
inc.b Scrap01 : bra .done
|
|
||||||
.quad2
|
|
||||||
lda.b #$03 : sta.b Scrap01 : lda.b PreviousRoom
|
|
||||||
cmp.b #$5f : beq .iceu ;ice u room
|
|
||||||
cmp.b #$3f : bne .done ;hammer ice exception
|
|
||||||
stz.b Scrap01 : bra .done
|
|
||||||
.iceu lda.b LinkPosX : cmp.b #$78 : bcc .done
|
|
||||||
inc.b Scrap01 : bra .done
|
|
||||||
.quad3
|
|
||||||
lda.b PreviousRoom : cmp.b #$40 : beq .done ; top of aga exception
|
|
||||||
lda.b #$02 : sta.b Scrap01 ; always 2
|
|
||||||
|
|
||||||
.done
|
|
||||||
lda.b PreviousRoom : tax : lda.w SpiralOffset,x
|
|
||||||
!ADD.b Scrap01 ;add a thing (0 in easy case)
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
InroomStairsWarp: {
|
|
||||||
phb : phk : plb : phx : phy ; push stuff
|
|
||||||
; find stairs by room and store index in X
|
|
||||||
lda.b RoomIndex : ldx.b #$07
|
|
||||||
.loop
|
|
||||||
cmp.w InroomStairsRoom,x
|
|
||||||
beq .found
|
|
||||||
dex
|
|
||||||
bne .loop
|
|
||||||
.found
|
|
||||||
rep #$30
|
|
||||||
txa : and.w #$00ff : asl : tay
|
|
||||||
lda.w InroomStairsTable,y : sta.b Scrap00
|
|
||||||
sep #$30
|
|
||||||
sta.b RoomIndex
|
|
||||||
|
|
||||||
; set position and everything else based on target door type
|
|
||||||
txa : and.b #$01 : eor.b #$01 : sta.b Scrap07
|
|
||||||
; should be the same as lda $0462 : and #$04 : lsr #2 : eor #$01 : sta $07
|
|
||||||
lda.b Scrap01 : and.b #$80 : beq .notEdge
|
|
||||||
lda.b Scrap07 : sta.b Scrap03 : beq +
|
|
||||||
lda.b Scrap01 : jsr LoadSouthMidpoint : sta.b LinkPosX : lda.b #$f4
|
|
||||||
bra ++
|
|
||||||
+
|
|
||||||
lda.b Scrap01 : jsr LoadNorthMidpoint : sta.b LinkPosX : dec.b LinkPosY+1 : lda.b #$f7
|
|
||||||
++
|
|
||||||
sta.b LinkPosY
|
|
||||||
lda.b Scrap01 : and.b #$20 : beq +
|
|
||||||
lda.b #$01
|
|
||||||
+
|
|
||||||
sta.b Scrap02
|
|
||||||
stz.b Scrap07
|
|
||||||
lda.b Scrap01 : and.b #$10 : lsr #4
|
|
||||||
JMP .layer
|
|
||||||
.notEdge
|
|
||||||
lda.b Scrap01 : and.b #$03 : cmp.b #$03 : bne .normal
|
|
||||||
txa : and.b #$06 : sta.b Scrap07
|
|
||||||
lda.b Scrap01 : and.b #$30 : lsr #3 : tay
|
|
||||||
lda.w InroomStairsX+1,y : sta.b Scrap02
|
|
||||||
lda.w InroomStairsY+1,y : sta.b Scrap03
|
|
||||||
cpy.b Scrap07 : beq .vanillaTransition
|
|
||||||
lda.w InroomStairsX,y : sta.b LinkPosX
|
|
||||||
lda.w InroomStairsY,y
|
|
||||||
ldy.b Scrap07 : beq +
|
|
||||||
!ADD.b #$07
|
|
||||||
+
|
|
||||||
sta.b LinkPosY
|
|
||||||
inc.b Scrap07
|
|
||||||
bra ++
|
|
||||||
.vanillaTransition
|
|
||||||
lda.b #$c0 : sta.b Scrap07 ; leave camera
|
|
||||||
++
|
|
||||||
%StonewallCheck($1b)
|
|
||||||
lda.b Scrap01 : and.b #$04 : lsr #2
|
|
||||||
bra .layer
|
|
||||||
.normal
|
|
||||||
lda.b Scrap01 : sta.b $fe ; trap door
|
|
||||||
lda.b Scrap07 : sta.b Scrap03 : beq +
|
|
||||||
lda.b Scrap01 : and.b #$04 : bne .specialFix
|
|
||||||
lda.b #$e0 : bra ++
|
|
||||||
.specialFix
|
|
||||||
lda.b #$c8 : bra ++
|
|
||||||
+
|
|
||||||
%StonewallCheck($43)
|
|
||||||
lda.b Scrap01 : and.b #$04 : bne +
|
|
||||||
lda.b #$1b : bra ++
|
|
||||||
+ lda.b #$33
|
|
||||||
++ sta.b LinkPosY
|
|
||||||
inc.b Scrap07 : stz.b Scrap02 : lda.b #$78 : sta.b LinkPosX
|
|
||||||
lda.b Scrap01 : and.b #$03 : beq ++
|
|
||||||
cmp.b #$02 : !BGE +
|
|
||||||
lda.b #$f8 : sta.b LinkPosX : stz.b Scrap07 : bra ++
|
|
||||||
+ inc.b Scrap02
|
|
||||||
++
|
|
||||||
lda.b Scrap01 : and.b #$04 : lsr #2
|
|
||||||
|
|
||||||
.layer
|
|
||||||
sta.b LinkLayer
|
|
||||||
bne +
|
|
||||||
stz.w $0476
|
|
||||||
+
|
|
||||||
|
|
||||||
lda.b Scrap02 : !SUB.b LinkQuadrantH
|
|
||||||
beq .skipXQuad
|
|
||||||
sta.b Scrap06 : !ADD.b LinkQuadrantH : sta.b LinkQuadrantH
|
|
||||||
ldy.b #$00 : jsr ShiftQuadSimple
|
|
||||||
.skipXQuad
|
|
||||||
lda.b LinkQuadrantV : lsr : sta.b Scrap06 : lda.b Scrap03 : !SUB.b Scrap06
|
|
||||||
beq .skipYQuad
|
|
||||||
sta.b Scrap06 : asl : !ADD.b LinkQuadrantV : sta.b LinkQuadrantV
|
|
||||||
ldy.b #$01 : jsr ShiftQuadSimple
|
|
||||||
.skipYQuad
|
|
||||||
|
|
||||||
lda.b Scrap07 : bmi .skipCamera
|
|
||||||
ldy.b #$00 : jsr SetCamera ; horizontal camera
|
|
||||||
ldy.b #$01 : sty.b Scrap07 : jsr SetCamera ; vertical camera
|
|
||||||
lda.b LinkPosY : cmp.b #$e0 : bcc +
|
|
||||||
lda.b BG2V : bne +
|
|
||||||
lda.b #$10 : sta.b BG2V ; adjust vertical camera at bottom
|
|
||||||
+
|
|
||||||
.skipCamera
|
|
||||||
|
|
||||||
jsr StairCleanup
|
|
||||||
ply : plx : plb ; pull the stuff we pushed
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
ShiftQuadSimple: {
|
|
||||||
lda.w CoordIndex,y : tax
|
|
||||||
lda.b LinkPosY,x : beq .skip
|
|
||||||
lda.b LinkPosY+1,x : !ADD.b Scrap06 : sta.b LinkPosY+1,x ; coordinate update
|
|
||||||
.skip
|
|
||||||
lda.w CamQuadIndex,y : tax
|
|
||||||
lda.w $0601,x : !ADD.b Scrap06 : sta.w $0601,x
|
|
||||||
lda.w $0605,x : !ADD.b Scrap06 : sta.w $0605,x ; high bytes of these guys
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
SetCamera: {
|
|
||||||
stz.b Scrap04
|
|
||||||
tyx : lda.b LinkQuadrantH,x : bne .nonZeroHalf
|
|
||||||
lda.w CamQuadIndex,y : tax : lda.w $0607,x : pha
|
|
||||||
lda.w CameraIndex,y : tax : pla : cmp.b BG2H+1, x : bne .noQuadAdj
|
|
||||||
dec.b BG2H+1,x
|
|
||||||
|
|
||||||
.noQuadAdj
|
|
||||||
lda.b Scrap07 : bne .adj0
|
|
||||||
lda.w CoordIndex,y : tax
|
|
||||||
lda.b LinkPosY,x : beq .oddQuad
|
|
||||||
cmp.b #$79 : bcc .adj0
|
|
||||||
!SUB.b #$78 : sta.b Scrap04
|
|
||||||
tya : asl : !ADD.b #$04 : tax : jsr AdjCamBounds : bra .done
|
|
||||||
.oddQuad
|
|
||||||
lda.b #$80 : sta.b Scrap04 : bra .adj1 ; this is such a weird case - quad cross boundary
|
|
||||||
.adj0
|
|
||||||
tya : asl : tax : jsr AdjCamBounds : bra .done
|
|
||||||
|
|
||||||
.nonZeroHalf ;meaning either right half or bottom half
|
|
||||||
lda.b Scrap07 : bne .setQuad
|
|
||||||
lda.w CoordIndex,y : tax
|
|
||||||
lda.b LinkPosY,x : cmp.b #$78 : bcs .setQuad
|
|
||||||
!ADD.b #$78 : sta.b Scrap04
|
|
||||||
lda.w CamQuadIndex,y : tax : lda.w $0603, x : pha
|
|
||||||
lda.w CameraIndex,y : tax : pla : sta.b BG2H+1, x
|
|
||||||
.adj1
|
|
||||||
tya : asl : !ADD.b #$08 : tax : jsr AdjCamBounds : bra .done
|
|
||||||
|
|
||||||
.setQuad
|
|
||||||
lda.w CamQuadIndex,y : tax : lda.w $0607, x : pha
|
|
||||||
lda.w CameraIndex,y : tax : pla : sta.b BG2H+1, x
|
|
||||||
tya : asl : !ADD.b #$0c : tax : jsr AdjCamBounds : bra .done
|
|
||||||
|
|
||||||
.done
|
|
||||||
lda.w CameraIndex,y : tax
|
|
||||||
lda.b Scrap04 : sta.b BG2H, x
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
; input, expects X to be an appropriate offset into the CamBoundBaseLine table
|
|
||||||
; when $04 is 0 no coordinate are added
|
|
||||||
AdjCamBounds: {
|
|
||||||
rep #$20 : lda.w CamBoundBaseLine, x : sta.b Scrap05
|
|
||||||
lda.b Scrap04 : and.w #$00ff : beq .common
|
|
||||||
lda.w CoordIndex,y : tax
|
|
||||||
lda.b LinkPosY, x : and.w #$00ff : !ADD.b Scrap05 : sta.b Scrap05
|
|
||||||
.common
|
|
||||||
lda.w OppCamBoundIndex,y : tax
|
|
||||||
lda.b Scrap05 : sta.w CameraScrollN, x
|
|
||||||
inc #2 : sta.w CameraScrollS, x : sep #$20
|
|
||||||
rts
|
|
||||||
}
|
|
||||||
|
|
||||||
SpiralPriorityHack: {
|
|
||||||
lda.l DRMode : beq +
|
|
||||||
lda.b #$01 : rtl ; always skip the priority code - until I figure out how to fix it
|
|
||||||
+ lda.w $0462 : and.b #$04 ; what we wrote over
|
|
||||||
rtl
|
|
||||||
}
|
|
||||||
332
dungeondrops.asm
332
dungeondrops.asm
@@ -1,331 +1,9 @@
|
|||||||
;================================================================================
|
;================================================================================
|
||||||
; Dungeon & Boss Drop Fixes
|
; Dungeon & Boss Drop Fixes
|
||||||
;--------------------------------------------------------------------------------
|
;--------------------------------------------------------------------------------
|
||||||
SpawnDungeonPrize:
|
DropSafeDungeon:
|
||||||
PHX : PHB
|
LDA $040C : CMP #$08 : BEQ +
|
||||||
TAX
|
LDA $01C6FC, X : JML Sprite_SpawnFallingItem
|
||||||
LDA.b $06,S : STA.b ScrapBuffer72 ; Store current RoomTag index
|
+
|
||||||
TXA
|
|
||||||
JSL.l AttemptItemSubstitution
|
|
||||||
JSL.l ResolveLootIDLong
|
|
||||||
JSL AttemptItemSubstitution
|
|
||||||
JSL ResolveLootIDLong
|
|
||||||
STA.w ItemReceiptID
|
|
||||||
TAX
|
|
||||||
LDA.b #$29 : LDY.b #$06
|
|
||||||
|
|
||||||
JSL AddAncillaLong
|
|
||||||
BCS .failed_spawn
|
|
||||||
LDA.w ItemReceiptID
|
|
||||||
STA.w AncillaGet,X : STA.w SpriteID,X
|
|
||||||
JSR AddDungeonPrizeAncilla
|
|
||||||
LDX.b ScrapBuffer72 : STZ.b RoomTag,X
|
|
||||||
.failed_spawn
|
|
||||||
PLB : PLX
|
|
||||||
RTL
|
RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
AddDungeonPrizeAncilla:
|
|
||||||
LDY.w ItemReceiptID
|
|
||||||
STZ.w AncillaVelocityY,X
|
|
||||||
STZ.w AncillaVelocityX,X
|
|
||||||
STZ.w AncillaGeneralF,X
|
|
||||||
STZ.w AncillaGeneralA,X
|
|
||||||
STZ.w AncillaGeneralN,X
|
|
||||||
|
|
||||||
LDA.b #$D0 : STA.w AncillaVelocityZ,X
|
|
||||||
LDA.b #$80 : STA.w AncillaZCoord,X
|
|
||||||
LDA.b #$09 : STA.w AncillaTimer,X
|
|
||||||
LDA.b #$00 : STA.w AncillaGeneralD,X
|
|
||||||
LDA.w AncillaGet,X : STA.w ItemReceiptID
|
|
||||||
LDA.w DungeonID : CMP.b #$14 : BNE .not_hera
|
|
||||||
LDA.b LinkPosY+1 : AND.b #$FE
|
|
||||||
INC A
|
|
||||||
STA.b Scrap01
|
|
||||||
STZ.b Scrap00
|
|
||||||
LDA.b LinkPosX+1 : AND.b #$FE
|
|
||||||
INC A
|
|
||||||
STA.b Scrap03
|
|
||||||
STZ.b Scrap02
|
|
||||||
BRA .set_coords_exit
|
|
||||||
.not_hera
|
|
||||||
TYA : ASL : TAY
|
|
||||||
REP #$20
|
|
||||||
LDA.w #$0078
|
|
||||||
CLC : ADC.b BG2V
|
|
||||||
STA.b Scrap00
|
|
||||||
LDA.w #$0078
|
|
||||||
CLC : ADC.b BG2H
|
|
||||||
STA.b Scrap02
|
|
||||||
SEP #$20
|
|
||||||
|
|
||||||
.set_coords_exit
|
|
||||||
LDA.b Scrap00 : STA.w AncillaCoordYLow,X
|
|
||||||
LDA.b Scrap01 : STA.w AncillaCoordYHigh,X
|
|
||||||
LDA.b Scrap02 : STA.w AncillaCoordXLow,X
|
|
||||||
LDA.b Scrap03 : STA.w AncillaCoordXHigh,X
|
|
||||||
RTS
|
|
||||||
|
|
||||||
PrepPrizeTile:
|
|
||||||
PHA : PHX : PHY
|
|
||||||
LDA.w AncillaGet, X
|
|
||||||
JSL AttemptItemSubstitution
|
|
||||||
JSL ResolveLootIDLong
|
|
||||||
STA.w SpriteID,X
|
|
||||||
JSL TransferItemReceiptToBuffer_using_ReceiptID
|
|
||||||
PLY : PLX : PLA
|
|
||||||
RTL
|
|
||||||
|
|
||||||
SetItemPose:
|
|
||||||
PHA
|
|
||||||
LDA.w DungeonID : BMI .one_handed
|
|
||||||
LDA.w RoomItemsTaken : BIT.b #$80 : BNE +
|
|
||||||
.one_handed
|
|
||||||
PLA
|
|
||||||
JML Link_ReceiveItem_not_cool_pose
|
|
||||||
+
|
|
||||||
JSR CrystalOrPendantBehavior : BCC .one_handed
|
|
||||||
.two_handed
|
|
||||||
PLA
|
|
||||||
JML Link_ReceiveItem_cool_pose
|
|
||||||
|
|
||||||
SetPrizeCoords:
|
|
||||||
PHX : PHY
|
|
||||||
STZ.b Scrap03
|
|
||||||
LDA.w ItemReceiptMethod : CMP.b #$03 : BEQ +
|
|
||||||
.regular_coords
|
|
||||||
PLY : PLX
|
|
||||||
LDY.w AncillaGet,X
|
|
||||||
RTL
|
|
||||||
+
|
|
||||||
JSR CrystalOrPendantBehavior : BCC .regular_coords
|
|
||||||
PLY : PLX
|
|
||||||
LDY.b #$20 ; Treat as crystal
|
|
||||||
RTL
|
|
||||||
|
|
||||||
SetCutsceneFlag:
|
|
||||||
; Out: c - Cutscene flag $02 if set, $01 if unset.
|
|
||||||
PHX
|
|
||||||
LDY.b #$01 ; wrote over
|
|
||||||
LDA.w DungeonID : BMI .no_cutscene
|
|
||||||
LDA.w RoomItemsTaken : BIT.b #$80 : BNE .dungeon_prize
|
|
||||||
.no_cutscene
|
|
||||||
SEP #$30
|
|
||||||
PLX
|
|
||||||
CLC
|
|
||||||
RTL
|
|
||||||
.dungeon_prize
|
|
||||||
LDA.w ItemReceiptMethod : CMP.b #$03 : BCC .no_cutscene
|
|
||||||
JSR SetDungeonCompleted
|
|
||||||
LDA.w ItemReceiptID
|
|
||||||
REP #$30
|
|
||||||
AND.w #$00FF : ASL : TAX
|
|
||||||
LDA.l InventoryTable_properties,X : BIT.w #$0080 : BEQ .no_cutscene
|
|
||||||
SEP #$31
|
|
||||||
PLX
|
|
||||||
RTL
|
|
||||||
|
|
||||||
AnimatePrizeCutscene:
|
|
||||||
LDA.w ItemReceiptMethod : CMP.b #$03 : BNE +
|
|
||||||
JSR CrystalOrPendantBehavior : BCC +
|
|
||||||
LDA.w DungeonID : BMI +
|
|
||||||
LDA.w RoomItemsTaken : BIT.b #$80 : BEQ +
|
|
||||||
SEC
|
|
||||||
RTL
|
|
||||||
+
|
|
||||||
CLC
|
|
||||||
RTL
|
|
||||||
|
|
||||||
PrizeDropSparkle:
|
|
||||||
LDA.w AncillaID,X : CMP.b #$29 : BNE .no_sparkle
|
|
||||||
JSR CrystalOrPendantBehavior : BCC .no_sparkle
|
|
||||||
SEC
|
|
||||||
RTL
|
|
||||||
.no_sparkle
|
|
||||||
CLC
|
|
||||||
RTL
|
|
||||||
|
|
||||||
HandleDropSFX:
|
|
||||||
LDA.w RoomItemsTaken : BIT.b #$80 : BEQ .no_sound
|
|
||||||
JSR CrystalOrPendantBehavior : BCC .no_sound
|
|
||||||
SEC
|
|
||||||
RTL
|
|
||||||
.no_sound
|
|
||||||
CLC
|
|
||||||
RTL
|
|
||||||
|
|
||||||
HandleCrystalsField:
|
|
||||||
TAX
|
|
||||||
LDA.w ItemReceiptID : CMP.b #$20 : BNE .not_crystal
|
|
||||||
TXA
|
|
||||||
STA.l CrystalsField
|
|
||||||
RTL
|
|
||||||
.not_crystal
|
|
||||||
RTL
|
|
||||||
|
|
||||||
MaybeKeepLootID:
|
|
||||||
PHA
|
|
||||||
LDA.w DungeonID : BMI .no_prize
|
|
||||||
LDA.w RoomItemsTaken : BIT.b #$80 : BNE .prize
|
|
||||||
.no_prize
|
|
||||||
STZ.w ItemReceiptID
|
|
||||||
STZ.w ItemReceiptPose
|
|
||||||
PLA
|
|
||||||
RTL
|
|
||||||
.prize
|
|
||||||
STZ.w ItemReceiptPose
|
|
||||||
PLA
|
|
||||||
RTL
|
|
||||||
|
|
||||||
CheckSpawnPrize:
|
|
||||||
; In: A - DungeonID
|
|
||||||
; Out: c - Spawn prize if set
|
|
||||||
REP #$20
|
|
||||||
LDX.w DungeonID
|
|
||||||
LDA.l DungeonItemMasks,X : AND.l DungeonsCompleted : BEQ .spawn
|
|
||||||
SEP #$20
|
|
||||||
CLC
|
|
||||||
RTL
|
|
||||||
.spawn
|
|
||||||
SEP #$21
|
|
||||||
RTL
|
|
||||||
|
|
||||||
CheckDungeonCompletion:
|
|
||||||
LDX.w DungeonID
|
|
||||||
REP #$20
|
|
||||||
LDA.l DungeonItemMasks,X : AND.l DungeonsCompleted
|
|
||||||
SEP #$20
|
|
||||||
RTL
|
|
||||||
|
|
||||||
PendantMusicCheck:
|
|
||||||
; In: A - Item receipt ID
|
|
||||||
PHX
|
|
||||||
TAY
|
|
||||||
LDA.w ItemReceiptMethod : CMP.b #$03 : BNE .dont_wait
|
|
||||||
TYA
|
|
||||||
REP #$30
|
|
||||||
AND.w #$00FF : ASL : TAX
|
|
||||||
LDA.l InventoryTable_properties,X : BIT.w #$0080 : BNE .dont_wait
|
|
||||||
SEP #$31
|
|
||||||
PLX
|
|
||||||
RTL
|
|
||||||
.dont_wait
|
|
||||||
SEP #$30
|
|
||||||
PLX
|
|
||||||
CLC
|
|
||||||
RTL
|
|
||||||
|
|
||||||
PrepPrizeOAMCoordinates:
|
|
||||||
PHX : PHY
|
|
||||||
LDY.w AncillaLayer,X
|
|
||||||
|
|
||||||
LDA.w $F67F,Y : STA.b $65
|
|
||||||
STZ.b $64
|
|
||||||
|
|
||||||
LDA.w AncillaCoordYLow,X : STA.b Scrap00
|
|
||||||
LDA.w AncillaCoordYHigh,X : STA.b Scrap01
|
|
||||||
LDA.w AncillaCoordXLow,X : STA.b Scrap02
|
|
||||||
LDA.w AncillaCoordXHigh,X : STA.b Scrap03
|
|
||||||
|
|
||||||
REP #$20
|
|
||||||
LDA.b Scrap00
|
|
||||||
SEC : SBC.w $0122
|
|
||||||
STA.b Scrap00
|
|
||||||
|
|
||||||
LDA.b Scrap02
|
|
||||||
SEC : SBC.w $011E
|
|
||||||
STA.b Scrap02
|
|
||||||
STA.b Scrap04
|
|
||||||
|
|
||||||
REP #$20
|
|
||||||
LDA.w AncillaZCoord,X
|
|
||||||
AND.w #$00FF
|
|
||||||
STA.b ScrapBuffer72
|
|
||||||
|
|
||||||
LDA.b Scrap00
|
|
||||||
STA.b Scrap06
|
|
||||||
SEC
|
|
||||||
SBC.b ScrapBuffer72
|
|
||||||
STA.b Scrap00
|
|
||||||
|
|
||||||
SEP #$20
|
|
||||||
TXY
|
|
||||||
LDA.w AncillaGet,X : TAX
|
|
||||||
LDA.l SpriteProperties_chest_width,X : BNE .wide
|
|
||||||
TYX
|
|
||||||
LDA.w AncillaID,X : CMP.b #$3E : BEQ .rising_crystal
|
|
||||||
REP #$20
|
|
||||||
LDA.b Scrap00
|
|
||||||
CLC : ADC.w #$0008
|
|
||||||
STA.b Scrap08
|
|
||||||
LDA.b Scrap02
|
|
||||||
CLC : ADC.w #$0004
|
|
||||||
STA.b Scrap02 : STA.b Scrap0A
|
|
||||||
BRA .wide
|
|
||||||
.rising_crystal
|
|
||||||
REP #$20
|
|
||||||
LDA.b Scrap00
|
|
||||||
CLC : ADC.w #$0008 : STA.b Scrap08
|
|
||||||
LDA.b Scrap02 : STA.b Scrap0A
|
|
||||||
.wide
|
|
||||||
SEP #$20
|
|
||||||
PLY : PLX
|
|
||||||
RTL
|
|
||||||
|
|
||||||
PrepPrizeShadow:
|
|
||||||
PHX
|
|
||||||
LDA.w ItemReceiptID : TAX
|
|
||||||
LDA.l SpriteProperties_standing_width,X : BNE .wide
|
|
||||||
LDA.b Scrap02
|
|
||||||
SEC : SBC.b #$04
|
|
||||||
STA.b Scrap02
|
|
||||||
.wide
|
|
||||||
LDA.b #$20 : STA.b Scrap04 ; What we wrote over
|
|
||||||
PLX
|
|
||||||
RTL
|
|
||||||
|
|
||||||
CheckPoseItemCoordinates:
|
|
||||||
PHX
|
|
||||||
LDA.w ItemReceiptPose : BEQ .done
|
|
||||||
BIT.b #$02 : BEQ .done
|
|
||||||
LDA.w AncillaGet,X : TAX
|
|
||||||
LDA.l SpriteProperties_chest_width,X : BNE .done
|
|
||||||
LDA.b Scrap02
|
|
||||||
CLC : ADC.b #$04
|
|
||||||
STA.b Scrap02
|
|
||||||
.done
|
|
||||||
PLX
|
|
||||||
LDA.w AncillaGet,X
|
|
||||||
TAX
|
|
||||||
RTL
|
|
||||||
|
|
||||||
CrystalOrPendantBehavior:
|
|
||||||
; Out: c - Crystal Behavior if set, pendant if unset
|
|
||||||
PHA : PHX
|
|
||||||
LDA.w AncillaGet,X
|
|
||||||
REP #$31
|
|
||||||
AND.w #$00FF : ASL : TAX
|
|
||||||
LDA.l InventoryTable_properties,X : BIT.w #$0080 : BNE .crystal_behavior
|
|
||||||
SEP #$30
|
|
||||||
PLX : PLA
|
|
||||||
RTS
|
|
||||||
.crystal_behavior
|
|
||||||
SEP #$31
|
|
||||||
PLX : PLA
|
|
||||||
RTS
|
|
||||||
|
|
||||||
CheckDungeonWorld:
|
|
||||||
; Maintain vanilla door opening behavior with dungeon prizes
|
|
||||||
TXA : CMP.b #$05 : BCS .dark_world
|
|
||||||
REP #$02
|
|
||||||
RTL
|
|
||||||
.dark_world
|
|
||||||
SEP #$02
|
|
||||||
RTL
|
|
||||||
|
|
||||||
SetDungeonCompleted:
|
|
||||||
LDX.w DungeonID : BMI +
|
|
||||||
REP #$20
|
|
||||||
LDA.l DungeonItemMasks, X : ORA.l DungeonsCompleted : STA.l DungeonsCompleted
|
|
||||||
SEP #$20
|
|
||||||
+
|
|
||||||
RTS
|
|
||||||
@@ -1,31 +1,38 @@
|
|||||||
DoDungeonMapBossIcon:
|
DoDungeonMapBossIcon:
|
||||||
LDA.b NMISTRIPES
|
LDA.b $14
|
||||||
CMP.b #$09
|
CMP.b #$09
|
||||||
BEQ .dungeonmap
|
BEQ .dungeonmap
|
||||||
|
|
||||||
.cave
|
.cave
|
||||||
|
CMP.b #$01
|
||||||
RTL
|
RTL
|
||||||
|
|
||||||
.dungeonmap
|
.dungeonmap
|
||||||
|
|
||||||
LDX.w DungeonID
|
LDX.w $040C
|
||||||
BMI .cave
|
BMI .cave
|
||||||
|
|
||||||
|
; LDA.l DungeonMapIcons
|
||||||
|
; AND.b #$01
|
||||||
|
; BNE ++
|
||||||
|
;
|
||||||
|
; INC ; so it's not equal to $01
|
||||||
|
; BRA .cave
|
||||||
|
|
||||||
; get dungeon boss room
|
; get dungeon boss room
|
||||||
++ REP #$30
|
++ REP #$30
|
||||||
LDA.l DungeonMapBossRooms, X
|
LDA.l $8AE817,X
|
||||||
ASL
|
ASL
|
||||||
TAX
|
TAX
|
||||||
|
|
||||||
; get sprite pointer for room
|
; get sprite pointer for room
|
||||||
LDA.l UWSpritesPointers,X
|
LDA.l $89D62E,X
|
||||||
STA.b Scrap00 ; pointer in $00
|
INC ; to skip the "sort"
|
||||||
LDA.w #$0028 : STA.b Scrap02 ; set the bank to 28 for now
|
TAX
|
||||||
LDY.w #$0001 ; to skip the "sort"
|
|
||||||
|
|
||||||
; get first byte to make sure it isn't an empty room
|
; get first byte to make sure it isn't an empty room
|
||||||
SEP #$20
|
SEP #$20
|
||||||
LDA.b [Scrap00], Y
|
LDA.l $890000,X
|
||||||
CMP.b #$FF
|
CMP.b #$FF
|
||||||
BNE ++
|
BNE ++
|
||||||
|
|
||||||
@@ -33,8 +40,7 @@ DoDungeonMapBossIcon:
|
|||||||
BRA .cave
|
BRA .cave
|
||||||
|
|
||||||
; check first sprite
|
; check first sprite
|
||||||
++ INY #2
|
++ LDA.l $890002,X
|
||||||
LDA.b [Scrap00], Y
|
|
||||||
SEP #$10
|
SEP #$10
|
||||||
|
|
||||||
; match boss id
|
; match boss id
|
||||||
@@ -51,7 +57,7 @@ DoDungeonMapBossIcon:
|
|||||||
|
|
||||||
.match
|
.match
|
||||||
LDA.b #$80
|
LDA.b #$80
|
||||||
STA.w CGADD
|
STA.w $2121
|
||||||
|
|
||||||
REP #$30
|
REP #$30
|
||||||
|
|
||||||
@@ -68,14 +74,14 @@ DoDungeonMapBossIcon:
|
|||||||
ASL ; x128 for graphics
|
ASL ; x128 for graphics
|
||||||
ASL
|
ASL
|
||||||
ADC.w #BossMapIconGFX
|
ADC.w #BossMapIconGFX
|
||||||
STA.w A1T1L
|
STA.w $4312
|
||||||
|
|
||||||
PHY
|
PHY
|
||||||
LDY.w #32
|
LDY.w #32
|
||||||
|
|
||||||
SEP #$20
|
SEP #$20
|
||||||
-- LDA.l .boss_palettes,X
|
-- LDA.l .boss_palettes,X
|
||||||
STA.w CGDATA
|
STA.w $2122
|
||||||
INX
|
INX
|
||||||
DEY
|
DEY
|
||||||
BNE --
|
BNE --
|
||||||
@@ -88,24 +94,24 @@ DoDungeonMapBossIcon:
|
|||||||
SEP #$10
|
SEP #$10
|
||||||
|
|
||||||
LDA.w #$1801
|
LDA.w #$1801
|
||||||
STA.w DMAP1
|
STA.w $4310
|
||||||
|
|
||||||
LDX.b #BossMapIconGFX>>16
|
LDX.b #BossMapIconGFX>>16
|
||||||
STX.w A1B1
|
STX.w $4314
|
||||||
|
|
||||||
LDA.w #$A060>>1
|
LDA.w #$A060>>1
|
||||||
STA.w VMADDL
|
STA.w $2116
|
||||||
LDA.w #$0040
|
LDA.w #$0040
|
||||||
STA.w DAS1L
|
STA.w $4315
|
||||||
|
|
||||||
LDX.b #$02
|
LDX.b #$02
|
||||||
STX.w DMAENABLE
|
STX.w $420B
|
||||||
|
|
||||||
STA.w DAS1L
|
STA.w $4315
|
||||||
LDA.w #$A260>>1
|
LDA.w #$A260>>1
|
||||||
STA.w VMADDL
|
STA.w $2116
|
||||||
|
|
||||||
STX.w DMAENABLE
|
STX.w $420B
|
||||||
|
|
||||||
; done
|
; done
|
||||||
SEP #$30
|
SEP #$30
|
||||||
|
|||||||
27
elder.asm
27
elder.asm
@@ -1,27 +1,28 @@
|
|||||||
NewElderCode:
|
NewElderCode:
|
||||||
{
|
{
|
||||||
LDA.b OverworldIndex : CMP.b #$1B : BEQ .newCodeContinue
|
LDA $8A : CMP #$1B : BEQ .newCodeContinue
|
||||||
;Restore Jump we can keep the RTL so JML
|
;Restore Jump we can keep the RTL so JML
|
||||||
JML Sprite_16_Elder
|
JML $05F0CD
|
||||||
.newCodeContinue
|
.newCodeContinue
|
||||||
PHB : PHK : PLB
|
PHB : PHK : PLB
|
||||||
LDA.b #$07 : STA.w SpriteOAMProp, X ; Palette
|
LDA.b #$07 : STA $0F50, X ;Palette
|
||||||
JSR Elder_Draw
|
JSR Elder_Draw
|
||||||
JSL Sprite_PlayerCantPassThrough
|
JSL Sprite_PlayerCantPassThrough
|
||||||
JSR Elder_Code
|
JSR Elder_Code
|
||||||
|
|
||||||
PLB
|
PLB
|
||||||
RTL
|
RTL
|
||||||
}
|
|
||||||
|
|
||||||
Elder_Draw:
|
Elder_Draw:
|
||||||
{
|
{
|
||||||
LDA.b #$02 : STA.b Scrap06 : STZ.b Scrap07 ;Number of Tiles
|
|
||||||
|
|
||||||
LDA.w SpriteGFXControl, X : ASL #04
|
LDA.b #$02 : STA $06 : STZ $07 ;Number of Tiles
|
||||||
|
|
||||||
ADC.b #.animation_states : STA.b Scrap08
|
LDA $0DC0, X : ASL #04
|
||||||
LDA.b #.animation_states>>8 : ADC.b #$00 : STA.b Scrap09
|
|
||||||
|
ADC.b #.animation_states : STA $08
|
||||||
|
LDA.b #.animation_states>>8 : ADC.b #$00 : STA $09
|
||||||
|
|
||||||
JSL Sprite_DrawMultiple_player_deferred
|
JSL Sprite_DrawMultiple_player_deferred
|
||||||
JSL Sprite_DrawShadowLong
|
JSL Sprite_DrawShadowLong
|
||||||
@@ -41,15 +42,15 @@ RTL
|
|||||||
{
|
{
|
||||||
REP #$20
|
REP #$20
|
||||||
LDA.l GoalItemRequirement : BEQ .despawn
|
LDA.l GoalItemRequirement : BEQ .despawn
|
||||||
LDA.l GanonVulnerableMode : AND.w #$00FF : CMP.w #$0005 : BEQ .despawn
|
LDA.l InvincibleGanon : AND.w #$00FF : CMP.w #$0005 : BEQ .despawn
|
||||||
LDA.l TurnInGoalItems : AND.w #$00FF : BNE +
|
LDA.l TurnInGoalItems : AND.w #$00FF : BNE +
|
||||||
.despawn
|
.despawn
|
||||||
SEP #$20
|
SEP #$20
|
||||||
STZ.w SpriteAITable, X ; despawn self
|
STZ $0DD0, X ; despawn self
|
||||||
RTS
|
RTS
|
||||||
+
|
+
|
||||||
SEP #$20
|
SEP #$20
|
||||||
LDA.b GameSubMode
|
LDA.b $11
|
||||||
BNE .done
|
BNE .done
|
||||||
LDA.b #$96
|
LDA.b #$96
|
||||||
LDY.b #$01
|
LDY.b #$01
|
||||||
@@ -59,12 +60,12 @@ RTL
|
|||||||
LDA.l GoalCounter
|
LDA.l GoalCounter
|
||||||
CMP.l GoalItemRequirement : !BLT +
|
CMP.l GoalItemRequirement : !BLT +
|
||||||
SEP #$20
|
SEP #$20
|
||||||
JSL ActivateGoal
|
JSL.l ActivateGoal
|
||||||
+
|
+
|
||||||
.dont_show
|
.dont_show
|
||||||
|
|
||||||
.done
|
.done
|
||||||
SEP #$20
|
SEP #$20
|
||||||
LDA.b FrameCounter : LSR #5 : AND.b #$01 : STA.w SpriteGFXControl, X
|
LDA.b $1A : LSR #5 : AND.b #$01 : STA.w $0DC0, X
|
||||||
RTS
|
RTS
|
||||||
}
|
}
|
||||||
|
|||||||
22
endingsequence.asm
Normal file
22
endingsequence.asm
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
;================================================================================
|
||||||
|
; Dialog Pointer Override
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
EndingSequenceTableOverride:
|
||||||
|
PHY
|
||||||
|
PHX
|
||||||
|
TYX
|
||||||
|
LDA.l EndingSequenceText, X
|
||||||
|
PLX
|
||||||
|
STA $1008, X
|
||||||
|
PLY
|
||||||
|
RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
|
EndingSequenceTableLookupOverride:
|
||||||
|
PHY
|
||||||
|
PHX
|
||||||
|
TYX
|
||||||
|
LDA.l EndingSequenceText, X : AND #$00FF
|
||||||
|
PLX
|
||||||
|
PLY
|
||||||
|
RTL
|
||||||
|
;--------------------------------------------------------------------------------
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
!DISP_REG = $2100 ; Screen Display Register
|
|
||||||
!VMAIN_REG = $2115 ; Video Port Control Register
|
|
||||||
!VRAM_LOW_REG = $2116 ; VRAM Address Registers (Low)
|
|
||||||
!VRAM_HIGH_REG = $2117 ; VRAM Address Registers (High)
|
|
||||||
!VRAM_WRITE_REG = #$18 ; VRAM Data Write Registers (Low) (you always store it to the dest register so no need for the actual address)
|
|
||||||
|
|
||||||
!DMA0_REG = $4300 ; DMA Control Register - channel 0
|
|
||||||
!DMA0_DEST_REG = $4301 ; DMA Destination Register
|
|
||||||
!DMA0_SRC_LOW_REG = $4302 ; DMA Source Address Register (Low)
|
|
||||||
!DMA0_SRC_HIGH_REG = $4303 ; DMA Source Address Register (High)
|
|
||||||
!DMA0_SRC_BANK_REG = $4304 ; DMA Source Address Register (Bank)
|
|
||||||
!DMA0_SIZE_LOW_REG = $4305 ; DMA Size Registers (Low)
|
|
||||||
!DMA0_SIZE_HIGH_REG = $4306 ; DMA Size Registers (Low)
|
|
||||||
|
|
||||||
!DMA_ENABLE_REG = $420B ; DMA Enable Register
|
|
||||||
|
|
||||||
macro DMA_VRAM(VRAM_HIGH,VRAM_LOW,SRC_BANK,SRC_HIGH,SRC_LOW,LENGTH_HIGH,LENGTH_LOW)
|
|
||||||
PHA
|
|
||||||
; --- preserve DMA registers ----------------------------------------------------
|
|
||||||
LDA.w !DMA0_REG : PHA
|
|
||||||
LDA.w !DMA0_DEST_REG : PHA
|
|
||||||
LDA.w !DMA0_SRC_LOW_REG : PHA
|
|
||||||
LDA.w !DMA0_SRC_HIGH_REG : PHA
|
|
||||||
LDA.w !DMA0_SRC_BANK_REG : PHA
|
|
||||||
LDA.w !DMA0_SIZE_LOW_REG : PHA
|
|
||||||
LDA.w !DMA0_SIZE_HIGH_REG : PHA
|
|
||||||
; -------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
;LDA.b #$80 : STA.w !DISP_REG ; force vblank
|
|
||||||
LDA.b #$80 : STA.w !VMAIN_REG
|
|
||||||
|
|
||||||
; write to vram at $<VRAM_HIGH><VRAM_LOW>
|
|
||||||
LDA.b <VRAM_LOW> : STA.w !VRAM_LOW_REG ; Set VRAM destination address low byte
|
|
||||||
LDA.b <VRAM_HIGH> : STA.w !VRAM_HIGH_REG ; Set VRAM destination address high byte
|
|
||||||
|
|
||||||
; Set DMA0 to write a word at a time.
|
|
||||||
LDA.b #$01
|
|
||||||
STA.w !DMA0_REG
|
|
||||||
|
|
||||||
; Write to $2118 & $2119 - VRAM Data Write Registers (Low) & VRAM Data Write Registers (High)
|
|
||||||
; setting word write mode on DMA0_REG causes a write to $2118 and then $2119
|
|
||||||
; $21xx is assumed
|
|
||||||
LDA.b !VRAM_WRITE_REG
|
|
||||||
STA.w !DMA0_DEST_REG
|
|
||||||
|
|
||||||
; Read from $<SRC_BANK>:<SRC_HIGH><SRC_LOW>.
|
|
||||||
LDA.b <SRC_LOW>
|
|
||||||
STA.w !DMA0_SRC_LOW_REG ; set src address low byte
|
|
||||||
LDA.b <SRC_HIGH>
|
|
||||||
STA.w !DMA0_SRC_HIGH_REG ; set src address high byte
|
|
||||||
LDA.b <SRC_BANK>
|
|
||||||
STA.w !DMA0_SRC_BANK_REG ; set src address bank byte
|
|
||||||
|
|
||||||
; total bytes to copy: #$1000 bytes.
|
|
||||||
LDA.b <LENGTH_LOW> : STA.w !DMA0_SIZE_LOW_REG ; length low byte
|
|
||||||
LDA.b <LENGTH_HIGH> : STA.w !DMA0_SIZE_HIGH_REG ; length high byte
|
|
||||||
|
|
||||||
; start DMA on channel 0
|
|
||||||
LDA.b #$01 ; channel select bitmask
|
|
||||||
STA.w !DMA_ENABLE_REG
|
|
||||||
|
|
||||||
; --- restore DMA registers -----------------------------------------------------
|
|
||||||
PLA : STA.w !DMA0_SIZE_HIGH_REG
|
|
||||||
PLA : STA.w !DMA0_SIZE_LOW_REG
|
|
||||||
PLA : STA.w !DMA0_SRC_BANK_REG
|
|
||||||
PLA : STA.w !DMA0_SRC_HIGH_REG
|
|
||||||
PLA : STA.w !DMA0_SRC_LOW_REG
|
|
||||||
PLA : STA.w !DMA0_DEST_REG
|
|
||||||
PLA : STA.w !DMA0_REG
|
|
||||||
; -------------------------------------------------------------------------------
|
|
||||||
PLA
|
|
||||||
endmacro
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
;-------------
|
|
||||||
NMIHookActionEnemizer:
|
|
||||||
{
|
|
||||||
;-----------------------------------------
|
|
||||||
; do our shell stuff
|
|
||||||
PHA
|
|
||||||
PHP
|
|
||||||
|
|
||||||
SEP #$20 ; get into 8-bit mode
|
|
||||||
|
|
||||||
LDA.l !SHELL_DMA_FLAG : BEQ .return ; check our draw flag
|
|
||||||
AND.b #$01 : BNE .loadKholdstare
|
|
||||||
LDA.l !SHELL_DMA_FLAG : AND.b #$02 : BNE .loadTrinexx
|
|
||||||
BRA .return ; just in case
|
|
||||||
;BIT.b #$01 : BEQ .loadKholdstare
|
|
||||||
;BIT.b #$02 : BEQ .loadTrinexx
|
|
||||||
|
|
||||||
.loadKholdstare
|
|
||||||
JSL DMAKholdstare
|
|
||||||
LDA.b #$00 : STA.l !SHELL_DMA_FLAG ; clear our draw flag
|
|
||||||
BRA .return
|
|
||||||
|
|
||||||
.loadTrinexx
|
|
||||||
JSL DMATrinexx
|
|
||||||
LDA.b #$00 : STA.l !SHELL_DMA_FLAG ; clear our draw flag
|
|
||||||
|
|
||||||
.return
|
|
||||||
PLP
|
|
||||||
PLA
|
|
||||||
;-----------------------------------------
|
|
||||||
; restore code Bank00.asm (164-167)
|
|
||||||
PHB
|
|
||||||
; Sets DP to $0000
|
|
||||||
LDA.w #$0000 : TCD
|
|
||||||
|
|
||||||
JML NMIHookReturnEnemizer
|
|
||||||
}
|
|
||||||
|
|
||||||
DMAKholdstare:
|
|
||||||
{
|
|
||||||
;#GFX_Kholdstare_Shell>>16
|
|
||||||
%DMA_VRAM(#$34,#$00,#GFX_Kholdstare_Shell>>16&$FF,#GFX_Kholdstare_Shell>>8&$FF,#GFX_Kholdstare_Shell&$FF,#$10,#$00)
|
|
||||||
RTL
|
|
||||||
}
|
|
||||||
|
|
||||||
DMATrinexx:
|
|
||||||
{
|
|
||||||
; TODO: change this to trinexx gfx
|
|
||||||
%DMA_VRAM(#$34,#$00,#GFX_Trinexx_Shell>>16,#GFX_Trinexx_Shell>>8&$FF,#GFX_Trinexx_Shell&$FF,#$08,#$00)
|
|
||||||
%DMA_VRAM(#$3A,#$A0,#GFX_Trinexx_Shell2>>16,#GFX_Trinexx_Shell2>>8&$FF,#GFX_Trinexx_Shell2&$FF,#$00,#$C0)
|
|
||||||
|
|
||||||
RTL
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
;================================================================================
|
|
||||||
; Blind Boss fight
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
pushpc
|
|
||||||
|
|
||||||
org $9DA081 ; Original Code
|
|
||||||
JML check_blind_boss_room
|
|
||||||
Check_for_Blind_Fight:
|
|
||||||
|
|
||||||
org $9DA090
|
|
||||||
Initialize_Blind_Fight:
|
|
||||||
|
|
||||||
pullpc
|
|
||||||
|
|
||||||
check_blind_boss_room:
|
|
||||||
LDA.b RoomIndex ; load room index (low byte)
|
|
||||||
CMP.b #$AC : BNE + ; Is is Thieves Town Boss Room
|
|
||||||
LDA.l !BLIND_DOOR_FLAG : BNE + ; Blind maiden does not need rescuing
|
|
||||||
|
|
||||||
LDA.l FollowerIndicator : JML Check_for_Blind_Fight
|
|
||||||
+
|
|
||||||
JML Initialize_Blind_Fight
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
;================================================================================
|
|
||||||
; Fix boss item drop position to 'center' of screen
|
|
||||||
;================================================================================
|
|
||||||
change_heartcontainer_position:
|
|
||||||
{
|
|
||||||
PHA
|
|
||||||
LDA.l !CENTER_BOSS_DROP_FLAG : BEQ .not_moldorm_room
|
|
||||||
LDA.b #$78 : STA.w SpritePosXLow, X
|
|
||||||
STA.w SpritePosYLow, X
|
|
||||||
|
|
||||||
LDA.b LinkPosX+1 : STA.w SpritePosXHigh, X
|
|
||||||
LDA.b LinkPosY+1 : STA.w SpritePosYHigh, X
|
|
||||||
|
|
||||||
LDA.b RoomIndex : CMP.b #$07 : BNE .not_moldorm_room ; not moldorm room
|
|
||||||
LDA.b LinkPosX : STA.w SpritePosXLow, X
|
|
||||||
LDA.b LinkPosY : STA.w SpritePosYLow, X
|
|
||||||
|
|
||||||
.not_moldorm_room
|
|
||||||
|
|
||||||
PLA
|
|
||||||
JSL Sprite_Get16BitCoords_long
|
|
||||||
RTL
|
|
||||||
}
|
|
||||||
@@ -1,289 +0,0 @@
|
|||||||
;================================================================================
|
|
||||||
; Move the bosses to the right screen location depending on the room
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
boss_move:
|
|
||||||
{
|
|
||||||
; TODO: should probably double check that we don't need to preserve registers (A,X)...
|
|
||||||
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
LDA.b RoomIndex ; load room index (low byte)
|
|
||||||
LDX.b RoomIndex+1 ; (high byte)
|
|
||||||
|
|
||||||
CMP.b #7 : BNE + ; Is it Hera Tower Boss Room
|
|
||||||
CPX.b #$00 : BNE +
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
BRL .move_to_middle
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #200 : BNE + ; Is it Eastern Palace Boss Room
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
BRL .move_to_bottom_right
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #41 : BNE + ; Is it Skull Woods Boss Room
|
|
||||||
; TODO: Add moving floor sprite
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
LDA.b #$07 : STA.w $0B00 ;Spawn the moving floor sprite
|
|
||||||
STZ.w $0B28
|
|
||||||
INC.w OverlordXLow
|
|
||||||
BRL .move_to_bottom_right
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #51 : BNE + ; Is it Desert Palace Boss Room
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
BRL .move_to_bottom_left
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #90 : BNE + ; Is it Palace of darkness Boss Room
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
BRL .move_to_bottom_right
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #144 : BNE + ; Is it Misery Mire Boss Room
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
BRL .move_to_bottom_left
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #172 : BNE + ; Is it Thieve Town Boss Room
|
|
||||||
; IF MAIDEN IS NOT RESCUED -> DO NOTHING
|
|
||||||
; IF MAIDEN IS ALREADY RESCUED -> spawn sprites normally
|
|
||||||
JSL Sprite_ResetAll ; removes sprites in thieve town boss room
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
;Close the door if !BLIND_DOOR_FLAG == 1
|
|
||||||
LDA.l !BLIND_DOOR_FLAG : BEQ .no_blind_door
|
|
||||||
INC.w TrapDoorFlag
|
|
||||||
STZ.w TileMapDoorPos
|
|
||||||
STZ.w DoorTimer
|
|
||||||
INC.w BossSpecialAction
|
|
||||||
; ;That must be called after the room load!
|
|
||||||
.no_blind_door
|
|
||||||
BRL .move_to_bottom_right
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #6 : BNE + ; Is it Swamp Palace Boss Room
|
|
||||||
CPX.b #$00 : BNE +
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
BRL .move_to_bottom_left
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #222 : BNE + ; Is it Ice Palace Boss Room
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
BRL .move_to_top_right
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #164 : BNE + ; Is it Turtle Rock Boss Room
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
BRL .move_to_bottom_left
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #28 : BNE + ; Is it Gtower (Armos2) Boss Room
|
|
||||||
CPX.b #$00 : BNE +
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
BRL .move_to_bottom_right
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #108 : BNE + ; Is it Gtower (Lanmo2) Boss Room
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
BRL .move_to_bottom_left
|
|
||||||
+
|
|
||||||
|
|
||||||
CMP.b #77 : BNE + ; Is it Gtower (Moldorm2) Boss Room
|
|
||||||
JSL Sprite_ResetAll ; reset sprites twice in that room for some reasons (fix bug with kholdstare)
|
|
||||||
JSL Dungeon_ResetSprites ; Restore the dungeon_resetsprites
|
|
||||||
BRL .move_to_middle
|
|
||||||
+
|
|
||||||
|
|
||||||
BRL .return
|
|
||||||
|
|
||||||
; $0D00[0x10] - The lower byte of a sprite's Y - coordinate.
|
|
||||||
; $0D10[0x10] - The lower byte of a sprite's X - coordinate.
|
|
||||||
|
|
||||||
; $0D20[0x10] - The high byte of a sprite's Y - coordinate.
|
|
||||||
; $0D30[0x10] - The high byte of a sprite's X - coordinate.
|
|
||||||
|
|
||||||
; $0B08[0x08] - (Overlord) X coordinate low byte.
|
|
||||||
; $0B18[0x08] - (Overlord) Y coordinate low byte.
|
|
||||||
|
|
||||||
; $0B10[0x08] - (Overlord) X coordinate high byte.
|
|
||||||
; $0B20[0x08] - (Overlord) Y coordinate high byte.
|
|
||||||
|
|
||||||
.move_to_middle
|
|
||||||
;load all sprite of that room and overlord
|
|
||||||
LDX.b #$00
|
|
||||||
|
|
||||||
.loop_middle ; move sprites
|
|
||||||
LDA.w SpriteTypeTable, X
|
|
||||||
JSR ShouldMoveSprite : BCC .no_change
|
|
||||||
LDA.w SpritePosXLow, X : !ADD.b #$68 : STA.w SpritePosXLow, X
|
|
||||||
LDA.w SpritePosYLow, X : !ADD.b #$68 : STA.w SpritePosYLow, X
|
|
||||||
|
|
||||||
.no_change
|
|
||||||
INX : CPX.b #$10 : BNE .loop_middle
|
|
||||||
LDX.b #$00
|
|
||||||
|
|
||||||
.loop_middle2 ; move overlords
|
|
||||||
LDA.w $0B00, X
|
|
||||||
CMP.b #$E3 : BNE + ;is it moving floor?
|
|
||||||
BRA .no_change_ov
|
|
||||||
+
|
|
||||||
LDA.w OverlordXLow, X : !ADD.b #$68 : STA.w OverlordXLow, X
|
|
||||||
LDA.w OverlordYLow, X : !ADD.b #$68 : STA.w OverlordYLow, X
|
|
||||||
|
|
||||||
.no_change_ov
|
|
||||||
INX : CPX.b #$08 : BNE .loop_middle2
|
|
||||||
BRL .return
|
|
||||||
|
|
||||||
|
|
||||||
.move_to_top_right
|
|
||||||
LDX.b #$00
|
|
||||||
|
|
||||||
.loop_top_right ; move sprites
|
|
||||||
LDA.w SpriteTypeTable, X
|
|
||||||
JSR ShouldMoveSprite : BCC .no_change2
|
|
||||||
LDA.w SpritePosYHigh, X : !ADD.b #$00 : STA.w SpritePosYHigh, X
|
|
||||||
LDA.w SpritePosXHigh, X : !ADD.b #$01 : STA.w SpritePosXHigh, X
|
|
||||||
|
|
||||||
.no_change2
|
|
||||||
INX : CPX.b #$10 : BNE .loop_top_right
|
|
||||||
LDX.b #$00
|
|
||||||
|
|
||||||
.loop_top_right2 ; move overlords
|
|
||||||
LDA.w $0B00, X
|
|
||||||
CMP.b #$E3 : BNE + ;is it moving floor?
|
|
||||||
BRA .no_change_ov2
|
|
||||||
+
|
|
||||||
LDA.w OverlordXHigh, X : !ADD.b #$01 : STA.w OverlordXHigh, X
|
|
||||||
LDA.w OverlordYHigh, X : !ADD.b #$00 : STA.w OverlordYHigh, X
|
|
||||||
|
|
||||||
.no_change_ov2
|
|
||||||
INX : CPX.b #$08 : BNE .loop_top_right2
|
|
||||||
BRL .return
|
|
||||||
|
|
||||||
|
|
||||||
.move_to_bottom_right
|
|
||||||
LDX.b #$00
|
|
||||||
|
|
||||||
.loop_bottom_right ; move sprites
|
|
||||||
LDA.w SpriteTypeTable, X
|
|
||||||
JSR ShouldMoveSprite : BCC .no_change3
|
|
||||||
LDA.w SpritePosYHigh, X : !ADD.b #$01 : STA.w SpritePosYHigh, X
|
|
||||||
LDA.w SpritePosXHigh, X : !ADD.b #$01 : STA.w SpritePosXHigh, X
|
|
||||||
|
|
||||||
.no_change3
|
|
||||||
INX : CPX.b #$10 : BNE .loop_bottom_right
|
|
||||||
LDX.b #$00
|
|
||||||
|
|
||||||
.loop_bottom_right2 ; move overlords
|
|
||||||
LDA.w $0B00, X
|
|
||||||
CMP.b #$E3 : BNE + ;is it moving floor?
|
|
||||||
BRA .no_change_ov3
|
|
||||||
+
|
|
||||||
LDA.w OverlordXHigh, X : !ADD.b #$01 : STA.w OverlordXHigh, X
|
|
||||||
LDA.w OverlordYHigh, X : !ADD.b #$01 : STA.w OverlordYHigh, X
|
|
||||||
|
|
||||||
.no_change_ov3
|
|
||||||
INX : CPX.b #$08 : BNE .loop_bottom_right2
|
|
||||||
BRL .return
|
|
||||||
|
|
||||||
|
|
||||||
.move_to_bottom_left
|
|
||||||
LDX.b #$00
|
|
||||||
|
|
||||||
.loop_bottom_left ; move sprites
|
|
||||||
LDA.w SpriteTypeTable, X
|
|
||||||
JSR ShouldMoveSprite : BCC .no_change4
|
|
||||||
LDA.w SpritePosYHigh, X : !ADD.b #$01 : STA.w SpritePosYHigh, X
|
|
||||||
LDA.w SpritePosXHigh, X : !ADD.b #$00 : STA.w SpritePosXHigh, X
|
|
||||||
|
|
||||||
.no_change4
|
|
||||||
INX : CPX.b #$10 : BNE .loop_bottom_left
|
|
||||||
LDX.b #$00
|
|
||||||
|
|
||||||
.loop_bottom_left2 ; move overlords
|
|
||||||
LDA.w $0B00, X
|
|
||||||
CMP.b #$E3 : BNE + ;is it moving floor?
|
|
||||||
BRA .no_change_ov4
|
|
||||||
+
|
|
||||||
LDA.w OverlordXHigh, X : !ADD.b #$00 : STA.w OverlordXHigh, X
|
|
||||||
LDA.w OverlordYHigh, X : !ADD.b #$01 : STA.w OverlordYHigh, X
|
|
||||||
|
|
||||||
.no_change_ov4
|
|
||||||
INX : CPX.b #$08 : BNE .loop_bottom_left2
|
|
||||||
BRL .return
|
|
||||||
|
|
||||||
|
|
||||||
.return
|
|
||||||
RTL
|
|
||||||
}
|
|
||||||
|
|
||||||
; A - sprite id from E20, X
|
|
||||||
; X - sprite index - should be preserved
|
|
||||||
; sets or clears carry flag, set if sprite should be moved
|
|
||||||
ShouldMoveSprite:
|
|
||||||
PHX
|
|
||||||
LDX.b #$FF
|
|
||||||
- INX : CPX.b #$0F : BCS .done
|
|
||||||
CMP.l BossIds, X : BNE -
|
|
||||||
; match found, move it
|
|
||||||
PLX : SEC : RTS
|
|
||||||
.done ; don't move it
|
|
||||||
PLX : CLC : RTS
|
|
||||||
|
|
||||||
BossIds:
|
|
||||||
db $53, $54, $09, $92, $8c, $8d, $88, $ce
|
|
||||||
db $a2, $a3, $a4, $bd, $cb, $cc, $cd, $ff
|
|
||||||
|
|
||||||
;================================================================================
|
|
||||||
; Fix the gibdo key drop in skull woods before the boss room - USELESS CODE
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
;gibdo_drop_key:
|
|
||||||
; LDA.b RoomIndex : CMP.b #$39 : BNE .no_key_drop ; Check if the room id is skullwoods before boss
|
|
||||||
; LDA.w SpriteAITable, X : CMP.b #$09 : BNE .no_key_drop ; Check if the sprite is alive
|
|
||||||
; LDA.b #$01 : STA.w SpriteForceDrop, X;set key
|
|
||||||
;
|
|
||||||
;.no_key_drop
|
|
||||||
; JSL $86DC5C ;Restore draw shadow
|
|
||||||
; RTL
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
;================================================================================
|
|
||||||
; Set a flag to draw kholdstare shell on next NMI
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
new_kholdstare_code:
|
|
||||||
LDA.w SpriteForceDrop : BNE .already_iced
|
|
||||||
LDA.b #$01 : STA.w SpriteForceDrop
|
|
||||||
|
|
||||||
LDA.b #$01 : STA.l !SHELL_DMA_FLAG ; tell our NMI to draw the shell
|
|
||||||
|
|
||||||
.already_iced
|
|
||||||
; restore code
|
|
||||||
JSL Kholdstare_Draw ; sprite_kholdstare.asm (154) : JSL Kholdstare_Draw
|
|
||||||
RTL
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
;================================================================================
|
|
||||||
; Set a flag to draw trinexx shell on next NMI
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
new_trinexx_code:
|
|
||||||
LDA.w SpriteForceDrop : BNE .already_rocked
|
|
||||||
LDA.b #$01 : STA.w SpriteForceDrop
|
|
||||||
|
|
||||||
LDA.b #$02 : STA.l !SHELL_DMA_FLAG ; tell our NMI to draw the shell
|
|
||||||
|
|
||||||
.already_rocked
|
|
||||||
; restore code
|
|
||||||
LDA.b #$03 : STA.w SpriteGFXControl, X ; sprite_trinexx.asm (62) : LDA.b #$03 : STA $0DC0, X
|
|
||||||
|
|
||||||
RTL
|
|
||||||
;--------------------------------------------------------------------------------
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
sprite_bush_spawn:
|
|
||||||
{
|
|
||||||
STY.b Scrap0D ; restored code
|
|
||||||
LDA.l !BUSHES_FLAG ; That byte is the flag to activate random enemies under bush
|
|
||||||
BNE .continue
|
|
||||||
CPY.b #$04 : BNE .not_random_old
|
|
||||||
JSL GetRandomInt : AND.b #$03 : !ADD.b #$13 : TAY
|
|
||||||
|
|
||||||
.not_random_old
|
|
||||||
LDA.w $81F3, Y;restored code
|
|
||||||
RTL
|
|
||||||
|
|
||||||
.continue
|
|
||||||
PHX : PHY ; save x,y just to be safe
|
|
||||||
PHB : PHK : PLB ; setbank to 40
|
|
||||||
|
|
||||||
CPY.b #$04 : BNE .not_random
|
|
||||||
JSL GetRandomInt : AND.b #$03 : TAY
|
|
||||||
LDA.w sprite_bush_spawn_table_random_sprites, Y
|
|
||||||
BRL .return
|
|
||||||
|
|
||||||
.not_random
|
|
||||||
|
|
||||||
CPY.b #$0F : BEQ .newSpriteSpawn
|
|
||||||
CPY.b #$11 : BEQ .newSpriteSpawn
|
|
||||||
CPY.b #$10 : BEQ .newSpriteSpawn
|
|
||||||
;CPY.b #$0E : BEQ .newSpriteSpawn
|
|
||||||
|
|
||||||
LDA.w item_drop_table_override, Y
|
|
||||||
BRA .return
|
|
||||||
|
|
||||||
.newSpriteSpawn
|
|
||||||
LDA.l OverworldIndexMirror : TAY ; load the area ID
|
|
||||||
LDA.l ProgressIndicator : CMP.b #$03 : !BLT .dontGoPhase2 ; check if agahnim 1 is alive
|
|
||||||
; aga1 is dead
|
|
||||||
LDA.l OverworldIndexMirror : CMP.b #$40 : !BGE .dontGoPhase2 ; check if we are in DW, if so we can skip shifting table index
|
|
||||||
!ADD.b #$90 : TAY ; agahnim 1 is dead, so we need to go to the 2nd phase table for LW
|
|
||||||
.dontGoPhase2
|
|
||||||
LDA.w sprite_bush_spawn_table_overworld, Y ;LDA 408000 + area id
|
|
||||||
|
|
||||||
.return
|
|
||||||
PLB ; restore bank to where it was
|
|
||||||
PLY : PLX ; restore x,y
|
|
||||||
RTL
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user