diff --git a/.gitignore b/.gitignore index 8927718..2d2766c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ tournament.asm /build /.idea /__pycache__ -/.vscode \ No newline at end of file +/.vscode +build.sh diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 6f1a630..66f2fc0 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -3,81 +3,53 @@ ;================================================================================ 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 $00FFC0 ; <- 7FC0 - Bank00.asm : 9173 (db "THE LEGEND OF ZELDA " ; 21 bytes) -;db #$23, $4E +;org $80FFC0 ; <- 7FC0 - Bank00.asm : 9173 (db "THE LEGEND OF ZELDA " ; 21 bytes) +;db $23, $4E -org $00FFD5 ; <- 7FD5 - Bank00.asm : 9175 (db $20 ; rom layout) -db #$30 ; set fast lorom +org $80FFD5 ; <- 7FD5 - Bank00.asm : 9175 (db $20 ; rom layout) +db $30 ; set fast lorom -;org $00FFD6 ; <- 7FD6 - Bank00.asm : 9176 (db $02 ; cartridge type) -;db #$55 ; enable S-RTC +;org $80FFD6 ; <- 7FD6 - Bank00.asm : 9176 (db $02 ; cartridge type) +;db $55 ; enable S-RTC -org $00FFD7 ; <- 7FD7 - Bank00.asm : 9177 (db $0A ; rom size) -db #$0B ; mark rom as 16mbit +org $80FFD7 ; <- 7FD7 - Bank00.asm : 9177 (db $0A ; rom size) +db $0B ; mark rom as 16mbit -org $00FFD8 ; <- 7FD8 - Bank00.asm : 9178 (db $03 ; ram size (sram size)) -db #$05 ; mark sram as 32k +org $80FFD8 ; <- 7FD8 - Bank00.asm : 9178 (db $03 ; ram size (sram size)) +db $05 ; mark sram as 32k -org $3FFFFF ; <- 1FFFFF -db #$00 ; expand file to 2mb +org $BFFFFF ; <- 1FFFFF +db $00 ; expand file to 2mb -org $1FFFF8 ; <- FFFF8 timestamp rom -db #$20, #$19, #$08, #$31 ; year/month/day +org $9FFFF8 ; <- FFFF8 timestamp rom +db $20, $19, $08, $31 ; year/month/day ;================================================================================ !ROM_VERSION_LOW ?= 1 ; ROM version (two 16-bit integers) -!ROM_VERSION_HIGH ?= 2 ; +!ROM_VERSION_HIGH ?= 5 ; -org $00FFE0 ; Unused hardware vector +org $80FFE0 ; Unused hardware vector RomVersion: dw !ROM_VERSION_LOW dw !ROM_VERSION_HIGH ;================================================================================ - !ADD = "CLC : ADC" !SUB = "SEC : SBC" !BLT = "BCC" !BGE = "BCS" -!MS_GOT = "$7F5031" - -;!REDRAW = "$7F5000" -!SPRITE_REDRAW = "$7E0790" ; 16 bytes -!SPRITE_OAM = "$7EC025" ; 16 bytes -!SPRITE_DYNAMIC_OAM = "$7EC035" ; 16 bytes -!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)) ; Feature flags, run asar with -DFEATURE_X=1 to enable -!FEATURE_NEW_TEXT ?= 0 ;================================================================================ @@ -103,16 +75,16 @@ function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<< !FLAG_OW_BONKDROP = $02 incsrc hooks.asm -incsrc treekid.asm incsrc spriteswap.asm incsrc hashalphabethooks.asm incsrc sharedplayerpalettefix.asm incsrc ram.asm incsrc sram.asm +incsrc registers.asm +incsrc vanillalabels.asm +incsrc menu/overworldmap.asm ; Overwrites some code in bank $8A -;org $208000 ; bank #$20 -org $A08000 ; bank #$A0 -incsrc newitems.asm ; LEAVE THIS AS FIRST +org $A08000 ; bank $20 incsrc itemdowngrade.asm incsrc bugfixes.asm incsrc darkworldspawn.asm @@ -120,7 +92,6 @@ incsrc lampmantlecone.asm incsrc floodgatesoftlock.asm incsrc heartpieces.asm incsrc npcitems.asm -incsrc utilities.asm incsrc flipperkill.asm incsrc pendantcrystalhud.asm incsrc potions.asm @@ -131,30 +102,28 @@ incsrc tablets.asm incsrc fairyfixes.asm incsrc rngfixes.asm incsrc medallions.asm -incsrc inventory.asm -incsrc ganonfixes.asm incsrc zelda.asm incsrc maidencrystals.asm -incsrc zoraking.asm -incsrc catfish.asm incsrc flute.asm incsrc dungeondrops.asm incsrc halfmagicbat.asm -incsrc mantle.asm incsrc swordswap.asm -incsrc scratchpad.asm -incsrc map.asm +incsrc stats.asm incsrc dialog.asm incsrc entrances.asm -incsrc clock.asm incsrc accessibility.asm incsrc heartbeep.asm incsrc capacityupgrades.asm +incsrc timer.asm +incsrc doorframefixes.asm +incsrc music.asm +incsrc roomloading.asm +incsrc icepalacegraphics.asm warnpc $A18000 -org $1C8000 ; text tables for translation -incbin i18n_en.bin -warnpc $1CF356 +org $9C8000 ; text tables for translation +incbin "data/i18n_en.bin" +warnpc $9CF356 org $A18000 ; static mapping area incsrc framehook.asm @@ -165,7 +134,7 @@ incsrc hud.asm warnpc $A18800 org $A18800 ; static mapping area -incsrc zsnes.asm + warnpc $A19000 org $A1A000 ; static mapping area. Referenced by front end. Do not move. @@ -181,19 +150,11 @@ org $A1FF00 ; static mapping area incsrc init.asm org $A48000 ; code bank - PUT NEW CODE HERE -incsrc timer.asm -incsrc doorframefixes.asm -incsrc music.asm -incsrc roomloading.asm -incsrc icepalacegraphics.asm -incsrc firebarlayer.asm incsrc glitched.asm incsrc hardmode.asm incsrc goalitem.asm incsrc quickswap.asm -incsrc endingsequence.asm incsrc cuccostorm.asm -incsrc compression.asm incsrc retro.asm incsrc controllerjank.asm incsrc boots.asm @@ -204,152 +165,160 @@ incsrc decryption.asm incsrc hashalphabet.asm incsrc inverted.asm incsrc invertedmaps.asm +incsrc invertedmaps2.asm incsrc bonktreemaps.asm incsrc newhud.asm -incsrc compasses.asm incsrc save.asm incsrc password.asm incsrc enemy_adjustments.asm -incsrc stats.asm ;incsrc hudtext.asm incsrc servicerequest.asm incsrc elder.asm incsrc toast.asm -incsrc darkroomitems.asm incsrc fastcredits.asm incsrc msu.asm incsrc dungeonmap.asm +incsrc hextodec.asm incsrc multiworld.asm -incsrc terrorpin.asm -if !FEATURE_NEW_TEXT - incsrc textrenderer.asm -endif +incsrc textrenderer.asm warnpc $A58000 -;org $228000 ; contrib area -org $A28000 ; contrib area -incsrc contrib.asm +org $A28000 +ItemReceiptGraphicsROM: +; we need some empty space here so that 0000 can mean nothing +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 +incsrc stats/credits.asm ; Statically mapped incsrc stats/main.asm +incsrc stats/statConfig.asm +FontTable: +incsrc stats/fonttable.asm -incsrc menu/overworldmap.asm ; overwrites some code in bank 0A -incsrc doorrando/doorrando.asm ; bank 27 likely A7 in the future +incsrc doorrando/doorrando.asm ; bank 27/A7 ;bank 28/A8 for keydropshuffle / standing items -incsrc keydrop/standing_items.asm -incsrc owrando.asm ; bank AA -incsrc enemizer/main.asm ; this is originally in bank 36, but is currently in migratory status in bank 37 +incsrc keydrop/standing_items.asm ; bank 28/A8 +incsrc owrando.asm ; bank 2A/AA +incsrc enemizer/main.asm ; bank 36/B6 -org $308000 ; bank #$30 +org $B08000 ; bank #$30 incsrc tables.asm -warnpc $318000 +warnpc $B18000 -org $348000 +org $B48000 incsrc spc.asm -; uncomment for inverted adjustments -;incsrc sandbox.asm - -org $318000 ; bank #$31 +org $B18000 ; bank $31 GFX_Mire_Bombos: -incbin 99ff1_bombos.gfx -warnpc $318800 +incbin "data/99ff1_bombos.gfx" +warnpc $B18800 -org $318800 +org $B18800 GFX_Mire_Quake: -incbin 99ff1_quake.gfx -warnpc $319000 +incbin "data/99ff1_quake.gfx" +warnpc $B19000 -org $319000 +org $B19000 GFX_TRock_Bombos: -incbin a6fc4_bombos.gfx -warnpc $319800 +incbin "data/a6fc4_bombos.gfx" +warnpc $B19800 -org $319800 +org $B19800 GFX_TRock_Ether: -incbin a6fc4_ether.gfx -warnpc $31A000 +incbin "data/a6fc4_ether.gfx" +warnpc $B1A000 -org $31A000 +org $B1A000 GFX_HUD_Items: -incbin c2807_v4.gfx -warnpc $31A800 +incbin "data/c2807_v4.gfx" +warnpc $B1A800 -org $31A800 -GFX_New_Items: -incbin newitems.gfx -;incbin eventitems.gfx ; *EVENT* -warnpc $31B000 +org $B1A800 -org $31B000 +warnpc $B1B000 + +org $B1B000 GFX_HUD_Main: -incbin c2e3e.gfx -warnpc $31B800 +incbin "data/c2e3e.gfx" +warnpc $B1B800 -org $31C000 +org $B1C000 IcePalaceFloorGfx: -incbin ice_palace_floor.bin -warnpc $31C801 +incbin "data/ice_palace_floor.bin" +warnpc $B1C801 -org $31C800 +org $B1C800 Damage_Table: -incbin damage_table.bin -warnpc $31D001 +incbin "data/damage_table.bin" +warnpc $B1D001 -org $31D000 +org $B1D000 FileSelectNewGraphics: -incbin fileselect.chr.gfx -warnpc $31E001 +incbin "data/fileselectgfx.2bpp" +warnpc $B1E001 -org $31E000 +org $B1E000 InvertedCastleHole: ;address used by front end. DO NOT MOVE! -incbin sheet73.gfx -warnpc $31E501 +incbin "data/sheet73.gfx" +warnpc $B1E501 -org $338000 +org $B38000 GFX_HUD_Palette: -incbin hudpalette.pal -warnpc $338041 +incbin "data/hudpalette.pal" +warnpc $B38041 -org $339000 -incbin sheet178.gfx -warnpc $339600 +org $B39000 +ExpandedTrinexx: +incbin "data/sheet178.gfx" +warnpc $B39600 -org $339600 +org $B39600 BossMapIconGFX: -incbin bossicons.4bpp +incbin "data/bossicons.4bpp" -if !FEATURE_NEW_TEXT - org $339C00 - NewFont: - incbin newfont.bin - NewFontInverted: - incbin newfont_inverted.bin - org $0CD7DF - incbin text_unscramble1.bin - org $0CE4D5 - incbin text_unscramble2.bin -endif +org $B39C00 +NewFont: +incbin "data/newfont.bin" +NewFontInverted: +incbin "data/newfont_inverted.bin" +SmallCharacters: +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 $328000 +org $B28000 Extra_Text_Table: -if !FEATURE_NEW_TEXT - incsrc itemtext_lower.asm -else - incsrc itemtext.asm -endif -warnpc $32E000 +incsrc itemtext.asm +warnpc $B2E000 -org $32DFD0 ; PC 0x195FD0 +org $B2DFD0 ; PC 0x195FD0 incsrc multiworldplayernames.asm -warnpc $330000 +warnpc $B30000 incsrc externalhooks.asm ;================================================================================ -org $119100 ; PC 0x89100 -incbin map_icons.gfx -warnpc $119401 +org $919100 ; PC 0x89100 +incbin "data/map_icons.gfx" +warnpc $919401 +;================================================================================ +org $9BB1E0 +incsrc custompalettes.asm +warnpc $9BB880 ;================================================================================ org $AF8000 ; PC 0x178000 Static_RNG: ; each line below is 512 bytes of rng @@ -364,14 +333,15 @@ warnpc $B08000 ;Bank Map ;$20 Code Bank ;$21 Reserved (Frame Hook & Init) -;$22 Contrib Code +;$22 Unused ;$23 Stats & Credits ;$24 Code Bank +;$26 Multiworld data ;$27 DR Code Bank ;$28 Keydrop / Standing Items Code bank ;$29 External hooks (rest of bank not used) ;$2A Reserved for OWR -;$2B Room Data migration +;$2B Reserved for "outlet data" ~5.8k ;$2E Reserved for Tournament Use ;$2F Static RNG (rest is reserved for tournament use) ;$30 Main Configuration Table @@ -379,23 +349,24 @@ warnpc $B08000 ;$32 Text Bank ;$33 Graphics Bank ;$36 reserved for Enemizer +;$37 Room data if needed for DR/Pottery/Enemizer ;$3A reserved for downstream use ;$3B reserved for downstream use ;$3F reserved for internal debugging ;================================================================================ ;RAM -;$7E021B[0x1]: Used by race game instead of $0ABF to avoid witch item conflict -;$7EC900[0x1F00]: BIGRAM buffer +;See ram.asm for label assignments +;$7EC900[0x1F00]: BigRAM buffer ;$7EF000[0x500]: SRAM mirror First 0x500 bytes of SRAM ; See sram.asm for labels and assignments ;$7F5000[0x800]: Rando's main free ram region -; See tables.asm for specific assignments +; See ram.asm for specific assignments ;$7F6000[0x1000]: SRAM buffer mapped to vanilla save slots 1 and 2 ; See sram.asm for labels and assignments ;$7F7667[0x6719] - free ram ;================================================================================ ;SRAM Map -;See sram.asm for rando-specific assignments +;See sram.asm for label assignments and documentation ;$70:0000 (5K) Game state ; 0000-04FF Vanilla Slot 1 (mirrored at $7EF000) ; 0500-14FF Ext Slot 1 (mirrored at $7F6000) @@ -403,447 +374,19 @@ warnpc $B08000 ;$70:3000 (0x16) Password ;$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 $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 +org $80D09C ; 0x509C - HUD Items H db GFX_HUD_Items>>16 -org $00D17B ; 0x517B - HUD Items M +org $80D17B ; 0x517B - HUD Items M db GFX_HUD_Items>>8 -org $00D25A ; 0x525A - HUD Items L +org $80D25A ; 0x525A - HUD Items L db GFX_HUD_Items -; this used to be a pointer to a dummy file -org $00D065 ; 005065 - New Items H -db GFX_New_Items>>16 -org $00D144 ; 005114 - New Items M -db GFX_New_Items>>8 -org $00D223 ; 005223 - New Items L -db GFX_New_Items - -org $00D09D ; 0x509D - HUD Main H +org $80D09D ; 0x509D - HUD Main H db GFX_HUD_Main>>16 -org $00D17C ; 0x517C - HUD Main M +org $80D17C ; 0x517C - HUD Main M db GFX_HUD_Main>>8 -org $00D25B ; 0x525B - HUD Main L +org $80D25B ; 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 $00E784 -LoadCommonSprites_in_file_select: - -org $00F945 -PrepDungeonExit: - -org $00FDEE -Mirror_InitHdmaSettings: - -org $01873A -Dungeon_LoadRoom: - -org $02821E -Module_PreDungeon: -org $028296 - .setAmbientSfx - -org $828AD9 -Underworld_SetBossOrSancMusicUponEntry: - -org $02A0A8 -Dungeon_SaveRoomData: - -org $02A0BE -Dungeon_SaveRoomData_justKeys: - -org $02A4E3 -Overworld_ActualScreenID: - -org $02A9F3 -OverworldHandleTransitions_change_palettes: - -org $02B861 -Dungeon_SaveRoomQuadrantData: - -org $02C11D -CalculateTransitionLanding: - -org $02C176 -Overworld_FinalizeEntryOntoScreen_Data: - -org $82C3F2 -OverworldLoadScreensPaletteSet_long: - -org $02D9B9 -Underworld_LoadSpawnEntrance: - -org $02E99D -FluteMenu_LoadTransport: - -org $02FD6D -LoadGearPalettes_link: - -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 $04E780 -Overworld_MemorizeMap16Change: - -org $04E879 -Overworld_CheckForSpecialOverworldTrigger_Direction: - -org $058008 -Sprite_SpawnSparkleGarnish: - -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 $06AD58 -Sprite_TransmuteToBomb: - -org $06DC5C -Sprite_DrawShadowLong: - -org $06DD40 -DashKey_Draw: - -org $06DBF8 -Sprite_PrepAndDrawSingleLargeLong: - -org $06DC00 -Sprite_PrepAndDrawSingleSmallLong: - -org $06E41C -Sprite_PrepOAMCoordLong: - -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 $07A985 -SetGameModeLikeMirror: - -org $07E68F -Unknown_Method_0: ; In US version disassembly simply called "$3E6A6 IN ROM" - -org $07F413 -Link_CheckForEdgeScreenTransition: - -org $07F4AA -Sprite_CheckIfPlayerPreoccupied: - -org $08C3AE -Ancilla_ReceiveItem: - -org $08C505 -Ancilla_ReceiveItem_objectFinished: - -org $08CE2E -GTCutscene_AnimateCrystals_NoRotate: - -org $08CEB6 -GTCutscene_DrawSingleCrystal_SkipCrystal: - -org $08CEC3 -GTCutscene_DrawSingleCrystal_SkipSparkle: - -org $08CF59 -GTCutscene_SparkleALot: - -org $08F710 -Ancilla_SetOam_XY_Long: - -org $0985E2 ; (break on $0985E4) -AddReceivedItem: - -org $098605 -AddReceivedItem_notCrystal: - -org $098766 -AddReceivedItem_gfxHandling: - -org $098BAD -AddPendantOrCrystal: - -org $098CFD -AddWeathervaneExplosion: - -org $0993DF -AddDashTremor: - -org $099D04 -AddAncillaLong: - -org $099D1A -Ancilla_CheckIfAlreadyExistsLong: - -org $09AC57 -Ancilla_TerminateSelectInteractives: - -org $09AE64 -Sprite_SetSpawnedCoords: - -org $09AD58 -GiveRupeeGift: - -org $0AB7BD -FluteMenu_HandleSelection_NoSelection: - -org $0ABA4F -OverworldMap_InitGfx: - -org $0ABA99 -OverworldMap_DarkWorldTilemap: - -org $0ABAB9 -OverworldMap_LoadSprGfx: - -org $8AE817 -DungeonMapBossRooms: - -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 $1EDE89 -GoldBee_Dormant_exit: - -org $1EDE8A -GoldBee_SpawnSelf: - -org $1EF4E7 -Sprite_PlayerCantPassThrough: + ;================================================================================ diff --git a/accessibility.asm b/accessibility.asm index 6e88345..1e6d8db 100644 --- a/accessibility.asm +++ b/accessibility.asm @@ -1,127 +1,118 @@ ;================================================================================ ; 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: CMP.b #$05 : BEQ ++ CMP.b #$2C : BEQ ++ CMP.b #$5A : BEQ ++ LDA.l DisableFlashing : BNE ++ - LDA.b #$32 : STA.w $9A + LDA.b #$32 : STA.w CGADSUBQ RTL ++ LDA.b #$72 - STA $9A + STA.b CGADSUBQ RTL ;================================================================================ ConditionalWhitenBg: LDX.b #$00 LDA.l DisableFlashing : REP #$20 : BNE + - LDA $00,X + LDA.b Scrap00,X JSR WhitenLoopReal RTL + - LDA $00 + LDA.b Scrap00 JSR WhitenLoopDummy RTL ;================================================================================ WhitenLoopReal: - - LDA $7EC340, X : JSL Filter_Majorly_Whiten_Color : STA $7EC540, X - LDA $7EC350, X : JSL Filter_Majorly_Whiten_Color : STA $7EC550, X - LDA $7EC360, X : JSL Filter_Majorly_Whiten_Color : STA $7EC560, X - LDA $7EC370, X : JSL Filter_Majorly_Whiten_Color : STA $7EC570, X - LDA $7EC380, X : JSL Filter_Majorly_Whiten_Color : STA $7EC580, X - LDA $7EC390, X : JSL Filter_Majorly_Whiten_Color : STA $7EC590, X - LDA $7EC3A0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5A0, X - LDA $7EC3B0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5B0, X - LDA $7EC3C0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5C0, X - LDA $7EC3D0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5D0, X - LDA $7EC3E0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5E0, X + LDA.l PaletteBufferAux+$40, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$40, X + LDA.l PaletteBufferAux+$50, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$50, X + LDA.l PaletteBufferAux+$60, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$60, X + LDA.l PaletteBufferAux+$70, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$70, X + LDA.l PaletteBufferAux+$80, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$80, X + LDA.l PaletteBufferAux+$90, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$90, X + LDA.l PaletteBufferAux+$A0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$A0, X + LDA.l PaletteBufferAux+$B0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$B0, X + LDA.l PaletteBufferAux+$C0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$C0, X + LDA.l PaletteBufferAux+$D0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$D0, X + LDA.l PaletteBufferAux+$E0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$E0, X INX #2 : CPX.b #$10 : BEQ + JMP - + - LDA $7EC3F0 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F0 - LDA $7EC3F2 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F2 - LDA $7EC3F4 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F4 - LDA $10 : CMP.w #$07 : BNE + - LDA $048E - CMP.w #$3C : BEQ ++ - CMP.w #$9D : BEQ ++ - CMP.w #$9C : BEQ ++ - CMP.w #$A5 : BEQ ++ + LDA.l PaletteBufferAux+$F0 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F0 + LDA.l PaletteBufferAux+$F2 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F2 + LDA.l PaletteBufferAux+$F4 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F4 + LDA.b GameMode : CMP.w #$0007 : BNE + + LDA.b RoomIndex + CMP.w #$003C : BEQ ++ + CMP.w #$009D : BEQ ++ + CMP.w #$009C : BEQ ++ + CMP.w #$00A5 : BEQ ++ + - LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F6 - LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F8 + LDA.l PaletteBufferAux+$F6 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F6 + LDA.l PaletteBufferAux+$F8 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F8 BRA +++ ++ - LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F6 - LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F8 + LDA.l PaletteBuffer+$F6 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F6 + LDA.l PaletteBuffer+$F8 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F8 BRA +++ +++ - LDA $7EC3FA : JSL Filter_Majorly_Whiten_Color : STA $7EC5FA - LDA $7EC3FC : JSL Filter_Majorly_Whiten_Color : STA $7EC5FC - LDA $7EC3FE : JSL Filter_Majorly_Whiten_Color : STA $7EC5FE + LDA.l PaletteBufferAux+$FA : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$FA + LDA.l PaletteBufferAux+$FC : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$FC + LDA.l PaletteBufferAux+$FE : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$FE REP #$10 - LDA $7EC540 : TAY - LDA $7EC300 : BNE + + LDA.l PaletteBuffer+$40 : TAY + LDA.l PaletteBufferAux : BNE + TAY + - TYA : STA $7EC500 + TYA : STA.l PaletteBuffer SEP #$30 RTS ;================================================================================ WhitenLoopDummy: - - LDA $7EC340, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC540, X - LDA $7EC350, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC550, X - LDA $7EC360, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC560, X - LDA $7EC370, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC570, X - LDA $7EC380, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC580, X - LDA $7EC390, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC590, X - LDA $7EC3A0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5A0, X - LDA $7EC3B0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5B0, X - LDA $7EC3C0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5C0, X - LDA $7EC3D0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5D0, X - LDA $7EC3E0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5E0, X + LDA.l PaletteBufferAux+$40, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$40, X + LDA.l PaletteBufferAux+$50, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$50, X + LDA.l PaletteBufferAux+$60, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$60, X + LDA.l PaletteBufferAux+$70, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$70, X + LDA.l PaletteBufferAux+$80, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$80, X + LDA.l PaletteBufferAux+$90, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$90, X + LDA.l PaletteBufferAux+$A0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$A0, X + LDA.l PaletteBufferAux+$B0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$B0, X + LDA.l PaletteBufferAux+$C0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$C0, X + LDA.l PaletteBufferAux+$D0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$D0, X + LDA.l PaletteBufferAux+$E0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$E0, X INX #2 : CPX.b #$10 : BEQ + JMP - + - LDA $7EC3F0 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F0 - LDA $7EC3F2 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F2 - LDA $7EC3F4 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F4 - LDA $10 : CMP.w #$07 : BNE + ; only light invisifloor if we're in dungeon submodule - LDA $048E - CMP.w #$3C : BEQ ++ ; hookshot cave - CMP.w #$9D : BEQ ++ ; gt right - CMP.w #$9C : BEQ ++ ; gt big room - CMP.w #$A5 : BEQ ++ ; wizzrobes 1 + LDA.l PaletteBufferAux+$F0 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F0 + LDA.l PaletteBufferAux+$F2 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F2 + LDA.l PaletteBufferAux+$F4 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F4 + LDA.b GameMode : CMP.w #$0007 : BNE + ; only light invisifloor if we're in dungeon submodule + LDA.b RoomIndex + CMP.w #$003C : BEQ ++ ; hookshot cave + CMP.w #$009D : BEQ ++ ; gt right + CMP.w #$009C : BEQ ++ ; gt big room + CMP.w #$00A5 : BEQ ++ ; wizzrobes 1 + - LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F6 - LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F8 + LDA.l PaletteBufferAux+$F6 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F6 + LDA.l PaletteBufferAux+$F8 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F8 BRA +++ ++ - LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F6 - LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F8 + LDA.l PaletteBufferAux+$F6 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F6 + LDA.l PaletteBufferAux+$F8 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F8 BRA +++ +++ - LDA $7EC3FA : JSL Filter_Majorly_Whiten_Color : LDA $7EC5FA - LDA $7EC3FC : JSL Filter_Majorly_Whiten_Color : LDA $7EC5FC - LDA $7EC3FE : JSL Filter_Majorly_Whiten_Color : LDA $7EC5FE + LDA.l PaletteBufferAux+$FA : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$FA + LDA.l PaletteBufferAux+$FC : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$FC + LDA.l PaletteBufferAux+$FE : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$FE REP #$10 - LDA $7EC540 : TAY - LDA $7EC300 : BNE + + LDA.l PaletteBuffer+$40 : TAY + LDA.l PaletteBufferAux : BNE + TAY + - TYA : STA $7EC500 + TYA : STA.l PaletteBuffer SEP #$30 RTS ;================================================================================ @@ -129,144 +120,144 @@ RestoreBgEther: LDX.b #$00 LDA.l DisableFlashing : REP #$20 : BNE + - - LDA $00,X - LDA $7EC340, X : STA $7EC540, X - LDA $7EC350, X : STA $7EC550, X - LDA $7EC360, X : STA $7EC560, X - LDA $7EC370, X : STA $7EC570, X - LDA $7EC380, X : STA $7EC580, X - LDA $7EC390, X : STA $7EC590, X - LDA $7EC3A0, X : STA $7EC5A0, X - LDA $7EC3B0, X : STA $7EC5B0, X - LDA $7EC3C0, X : STA $7EC5C0, X - LDA $7EC3D0, X : STA $7EC5D0, X - LDA $7EC3E0, X : STA $7EC5E0, X - LDA $7EC3F0, X : STA $7EC5F0, X + LDA.b Scrap00,X + LDA.l PaletteBufferAux+$40, X : STA.l PaletteBuffer+$40, X + LDA.l PaletteBufferAux+$50, X : STA.l PaletteBuffer+$50, X + LDA.l PaletteBufferAux+$60, X : STA.l PaletteBuffer+$60, X + LDA.l PaletteBufferAux+$70, X : STA.l PaletteBuffer+$70, X + LDA.l PaletteBufferAux+$80, X : STA.l PaletteBuffer+$80, X + LDA.l PaletteBufferAux+$90, X : STA.l PaletteBuffer+$90, X + LDA.l PaletteBufferAux+$A0, X : STA.l PaletteBuffer+$A0, X + LDA.l PaletteBufferAux+$B0, X : STA.l PaletteBuffer+$B0, X + LDA.l PaletteBufferAux+$C0, X : STA.l PaletteBuffer+$C0, X + LDA.l PaletteBufferAux+$D0, X : STA.l PaletteBuffer+$D0, X + LDA.l PaletteBufferAux+$E0, X : STA.l PaletteBuffer+$E0, X + LDA.l PaletteBufferAux+$F0, X : STA.l PaletteBuffer+$F0, X INX #2 : CPX.b #$10 : BNE - BRA ++ + - - LDA $00 - LDA $7EC340, X : LDA $7EC540, X - LDA $7EC350, X : LDA $7EC550, X - LDA $7EC360, X : LDA $7EC560, X - LDA $7EC370, X : LDA $7EC570, X - LDA $7EC380, X : LDA $7EC580, X - LDA $7EC390, X : LDA $7EC590, X - LDA $7EC3A0, X : LDA $7EC5A0, X - LDA $7EC3B0, X : LDA $7EC5B0, X - LDA $7EC3C0, X : LDA $7EC5C0, X - LDA $7EC3D0, X : LDA $7EC5D0, X - LDA $7EC3E0, X : LDA $7EC5E0, X - LDA $7EC3F0, X : LDA $7EC5F0, X + LDA.b Scrap00 + LDA.l PaletteBufferAux+$40, X : LDA.l PaletteBuffer+$40, X + LDA.l PaletteBufferAux+$50, X : LDA.l PaletteBuffer+$50, X + LDA.l PaletteBufferAux+$60, X : LDA.l PaletteBuffer+$60, X + LDA.l PaletteBufferAux+$70, X : LDA.l PaletteBuffer+$70, X + LDA.l PaletteBufferAux+$80, X : LDA.l PaletteBuffer+$80, X + LDA.l PaletteBufferAux+$90, X : LDA.l PaletteBuffer+$90, X + LDA.l PaletteBufferAux+$A0, X : LDA.l PaletteBuffer+$A0, X + LDA.l PaletteBufferAux+$B0, X : LDA.l PaletteBuffer+$B0, X + LDA.l PaletteBufferAux+$C0, X : LDA.l PaletteBuffer+$C0, X + LDA.l PaletteBufferAux+$D0, X : LDA.l PaletteBuffer+$D0, X + LDA.l PaletteBufferAux+$E0, X : LDA.l PaletteBuffer+$E0, X + LDA.l PaletteBufferAux+$F0, X : LDA.l PaletteBuffer+$F0, X INX #2 : CPX.b #$10 : BNE - BRA ++ ++ -JML $02FF51 ; Bank0E.asm : 3936 vanilla restore routine after loop which RTLs +JML Palette_RestoreFixedColor-7 ; Bank0E.asm : 3936 vanilla restore routine after loop which RTLs ;================================================================================ DDMConditionalLightning: LDA.l DisableFlashing REP #$20 BNE + - LDA.w $0000 + LDA.w Scrap LDX.b #$02 - JML $07FA7F ; Bank0E.asm : 4738 vanilla loop equivalent to below beginning at LDY #$00 + JML FlashGanonTowerPalette_next_thunder-2 ; Bank0E.asm : 4738 vanilla loop equivalent to below beginning at LDY #$00 + - LDA.b $00 : LDX.b #$02 : LDY #$00 + LDA.b Scrap00 : LDX.b #$02 : LDY.b #$00 - - LDA $F4EB, Y : LDA $7EC560, X - LDA $F4F9, Y : LDA $7EC570, X - LDA $F507, Y : LDA $7EC590, X - LDA $F515, Y : LDA $7EC5E0, X - LDA $F523, Y : LDA $7EC5F0, X + LDA.w $F4EB, Y : LDA.l PaletteBuffer+$60, X + LDA.w $F4F9, Y : LDA.l PaletteBuffer+$70, X + LDA.w $F507, Y : LDA.l PaletteBuffer+$90, X + LDA.w $F515, Y : LDA.l PaletteBuffer+$E0, X + LDA.w $F523, Y : LDA.l PaletteBuffer+$F0, X INY #2 INX #2 : CPX.b #$10 : BNE - - JML $07FAAC ; Bank0E.asm : 4754 both branches converge here + JML FlashGanonTowerPalette_bright_white ; Bank0E.asm : 4754 both branches converge here ;================================================================================ ConditionalGTFlash: LDA.l DisableFlashing : REP #$20 : BNE + - LDA $0000 + LDA.w Scrap - - LDA $F9C1, Y : STA $7EC5D0, X + LDA.w $F9C1, Y : STA.l PaletteBuffer+$D0, X INY #2 INX #2 : CPX.b #$10 : BNE - RTL + - LDA $00 + LDA.b Scrap00 - - LDA $F9C1, Y : LDA $7EC5D0, X + LDA.w $F9C1, Y : LDA.l PaletteBuffer+$D0, X INY #2 INX #2 : CPX.b #$10 : BNE - RTL ;================================================================================ ConditionalRedFlash: LDA.l DisableFlashing : REP #$20 : BNE + - LDA $00,X - LDA.w #$1D59 : STA $7EC5DA - LDA.w #$25FF : STA $7EC5DC + LDA.b Scrap,X + LDA.w #$1D59 : STA.l PaletteBuffer+$DA + LDA.w #$25FF : STA.l PaletteBuffer+$DC LDA.w #$001A RTL + - LDA $00 - LDA.w #$1D59 : LDA $7EC5DA - LDA.w #$25FF : LDA $7EC5DC + LDA.b Scrap00 + LDA.w #$1D59 : LDA.l PaletteBuffer+$DA + LDA.w #$25FF : LDA.l PaletteBuffer+$DC LDA.w #$0000 RTL ;================================================================================ ConditionalPedAncilla: LDA.l DisableFlashing : REP #$20 : BNE + - LDA $00,X - LDA $00 : STA $04 - LDA $02 : STA $06 + LDA.b Scrap,X + LDA.b Scrap00 : STA.b Scrap04 + LDA.b Scrap02 : STA.b Scrap06 RTL + - LDA $00 - LDA $00 : LDA $04 - LDA $02 : LDA $06 + LDA.b Scrap + LDA.b Scrap00 : LDA.b Scrap04 + LDA.b Scrap02 : LDA.b Scrap06 RTL ;================================================================================ LoadElectroPalette: REP #$20 - LDA.w #$0202 : STA $0C - LDA.w #$0404 : STA $0E - LDA.w #$001B : STA $02 + LDA.w #$0202 : STA.b Scrap0C + LDA.w #$0404 : STA.b Scrap0E + LDA.w #$001B : STA.b Scrap02 SEP #$10 - LDX $0C : LDA $1BEBB4, X : AND.w #$00FF : ADC #$D630 + LDX.b Scrap0C : LDA.l SwordPaletteOffsets, X : AND.w #$00FF : ADC.w #$D630 REP #$10 : LDX.w #$01B2 : LDY.w #$0002 JSR ConditionalLoadGearPalette SEP #$10 - LDX $0D - LDA $1BEBC1, X : AND.w #$00FF : ADC #$D648 + LDX.b Scrap0D + LDA.l ShieldPaletteOffsets, X : AND.w #$00FF : ADC.w #$D648 REP #$10 : LDX.w #$01B8 : LDY.w #$0003 JSR ConditionalLoadGearPalette SEP #$10 - LDX $0E - LDA $1BEC06, X : AND.w #$00FF : ASL A : ADC #$D308 + LDX.b Scrap0E + LDA.l LinkMailPalettesOffsets, X : AND.w #$00FF : ASL A : ADC.w #$D308 REP #$10 : LDX.w #$01E2 : LDY.w #$000E JSR ConditionalLoadGearPalette SEP #$30 - INC $15 + INC.b NMICGRAM RTL ;================================================================================ ConditionalLoadGearPalette: - STA $00 + STA.b Scrap00 SEP #$20 LDA.l DisableFlashing : REP #$20 : BNE + - LDA $00,X + LDA.b Scrap,X - - LDA [$00] - STA $7EC500, X - INC $00 : INC $00 + LDA.b [Scrap00] + STA.l PaletteBuffer, X + INC.b Scrap00 : INC.b Scrap00 INX #2 DEY BPL - RTS + - LDA $00 + LDA.b Scrap - - LDA [$00] - LDA $7EC500, X - INC $00 : INC $00 + LDA.b [Scrap00] + LDA.l PaletteBuffer, X + INC.b Scrap00 : INC.b Scrap00 INX #2 DEY BPL - @@ -281,13 +272,13 @@ RestoreElectroPalette: LDX.w #$01E2 : LDY.w #$000E JSR FillPaletteBufferFromAux SEP #$30 - INC $15 + INC.b NMICGRAM RTL ;================================================================================ FillPaletteBufferFromAux: - - LDA $7EC300, X - STA $7EC500, X + LDA.l PaletteBufferAux, X + STA.l PaletteBuffer, X INX #2 DEY BPL - diff --git a/asar b/asar deleted file mode 100755 index 57d6409..0000000 Binary files a/asar and /dev/null differ diff --git a/bin/linux/asar b/bin/linux/asar new file mode 100644 index 0000000..a74f495 Binary files /dev/null and b/bin/linux/asar differ diff --git a/bin/macos/asar b/bin/macos/asar new file mode 100644 index 0000000..a5499b2 Binary files /dev/null and b/bin/macos/asar differ diff --git a/bin/windows/asar.exe b/bin/windows/asar.exe new file mode 100644 index 0000000..32f53cb Binary files /dev/null and b/bin/windows/asar.exe differ diff --git a/bonktreemaps.asm b/bonktreemaps.asm index c61b98b..3c51021 100644 --- a/bonktreemaps.asm +++ b/bonktreemaps.asm @@ -8,7 +8,7 @@ Overworld_LoadBonkTiles: LDA.b #$7E : PHA : PLB REP #$30 ; Use it as an index into a jump table. - LDA.b $8A : CMP #$0080 : !BGE .noData + LDA.b OverworldIndex : CMP.w #$0080 : !BGE .noData ASL A : TAX : JSR (Overworld_BonkTilesTable, X) .noData @@ -56,7 +56,10 @@ dw return, return, return, return, return, return, map6e, return dw return, return, return, return, return, return, return, return ;120 121 122 123 124 125 126 127 dw return, return, return, return, return, return, return, return +} +return: +RTS map00: ; Map00/Map01/Map08/Map09 { diff --git a/bookofmudora.asm b/bookofmudora.asm index b120b56..c84e029 100644 --- a/bookofmudora.asm +++ b/bookofmudora.asm @@ -2,21 +2,23 @@ ; Randomize Book of Mudora ;-------------------------------------------------------------------------------- LoadLibraryItemGFX: - LDA.l LibraryItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID + LDA.l LibraryItem_Player : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID %GetPossiblyEncryptedItem(LibraryItem, SpriteItemValues) - STA $0E80, X ; Store item type - JML RequestSlottedTile + JSL AttemptItemSubstitution + JSL ResolveLootIDLong + STA.w SpriteID, X + JML RequestStandingItemVRAMSlot ;-------------------------------------------------------------------------------- DrawLibraryItemGFX: - PHA - LDA $0E80, X ; Retrieve stored item type - JSL.l DrawSlottedTile - PLA + PHA + LDA.w SpriteID, X + JSL DrawPotItem + PLA RTL ;-------------------------------------------------------------------------------- SetLibraryItem: - LDY $0E80, X ; Retrieve stored item type - JSL.l ItemSet_Library ; contains thing we wrote over + LDY.w SpriteID, X + JSL ItemSet_Library ; contains thing we wrote over RTL ;-------------------------------------------------------------------------------- @@ -25,49 +27,59 @@ RTL ; Randomize Bonk Keys ;-------------------------------------------------------------------------------- LoadBonkItemGFX: - LDA.b #$08 : STA $0F50, X ; thing we wrote over + LDA.b #$08 : STA.w SpriteOAMProp, X ; thing we wrote over LoadBonkItemGFX_inner: - JSR LoadBonkItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID - JSR LoadBonkItem - JML RequestSlottedTile + JSR LoadBonkItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID + JSR LoadBonkItem + JSL AttemptItemSubstitution + JSL ResolveLootIDLong + STA.w SpriteItemType, X + STA.w SpriteID, X + JSL RequestStandingItemVRAMSlot + 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 ;-------------------------------------------------------------------------------- DrawBonkItemGFX: - PHA - LDA.w !SPRITE_REDRAW, X : BEQ .skipInit ; skip init if already ready - JSL.l LoadBonkItemGFX_inner - LDA.w !SPRITE_REDRAW, X : CMP.b #$02 : BEQ .skipInit - BRA .done ; don't draw on the init frame - - .skipInit - JSR LoadBonkItem - JSL DrawSlottedTile - - .done - PLA + PHA + LDA.w SprRedrawFlag, X : BEQ .skipInit + JSL LoadBonkItemGFX_inner + LDA.w SprRedrawFlag, X : CMP.b #$02 : BEQ .skipInit + BRA .done ; don't draw on the init frame + + .skipInit + LDA.w SpriteID,X + JSL DrawPotItem + + .done + PLA RTL ;-------------------------------------------------------------------------------- GiveBonkItem: - JSR LoadBonkItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID - JSR LoadBonkItem - CMP #$24 : BNE .notKey - .key - PHY : LDY.b #$24 : JSL.l AddInventory : PLY ; do inventory processing for a small key - LDA CurrentSmallKeys : INC A : STA CurrentSmallKeys - LDA.b #$2F : JSL.l Sound_SetSfx3PanLong - JSL CountBonkItem + JSR LoadBonkItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID + JSR LoadBonkItem + JSR AbsorbKeyCheck : BCC .notKey + .key + PHY : LDY.b #$24 : JSL AddInventory : PLY ; do inventory processing for a small key + LDA.l CurrentSmallKeys : INC A : STA.l CurrentSmallKeys + LDA.b #$2F : JSL Sound_SetSfx3PanLong + INC.w UpdateHUDFlag RTL - .notKey - PHY : TAY : JSL.l Link_ReceiveItem : PLY - JSL CountBonkItem + .notKey + PHY : TAY : JSL Link_ReceiveItem : PLY RTL ;-------------------------------------------------------------------------------- LoadBonkItem: - LDA $A0 ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte - CMP #115 : BNE + ; Desert Bonk Key - LDA.l BonkKey_Desert + 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 BRA ++ - + : CMP #140 : BNE + ; GTower Bonk Key - LDA.l BonkKey_GTower + + : CMP.b #$8C : BNE + ; GTower Bonk Key + LDA.l BonkKey_GTower BRA ++ + LDA.b #$24 ; default to small key @@ -75,14 +87,30 @@ LoadBonkItem: RTS ;-------------------------------------------------------------------------------- LoadBonkItem_Player: - LDA $A0 ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte - CMP #115 : BNE + ; Desert Bonk Key - LDA.l BonkKey_Desert_Player - BRA ++ - + : CMP #140 : BNE + ; GTower Bonk Key - LDA.l BonkKey_GTower_Player - BRA ++ - + - LDA.b #$00 - ++ + 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 diff --git a/boots.asm b/boots.asm index 219c445..4e8c771 100644 --- a/boots.asm +++ b/boots.asm @@ -1,77 +1,76 @@ ;================================================================================ ; Boots State Modifier ;-------------------------------------------------------------------------------- -!BOOTS_MODIFIER = "$7F50CE" ModifyBoots: PHA - LDA !BOOTS_MODIFIER : CMP.b #$01 : BNE + - PLA : AND AbilityFlags : ORA.b #$04 : RTL ; yes boots + LDA.l BootsModifier : CMP.b #$01 : BNE + + PLA : AND.l AbilityFlags : ORA.b #$04 : RTL ; yes boots + : CMP.b #$02 : BNE + - PLA : AND AbilityFlags : AND.b #$FB : RTL ; no boots - + : LDA FakeBoots : CMP.b #$01 : BNE + - LDA $5B : BEQ ++ : LDA $59 : BNE + ; hover check - ++ : PLA : AND AbilityFlags : ORA.b #$04 : RTL ; yes boots, not hovering + PLA : AND.l AbilityFlags : AND.b #$FB : RTL ; no boots + + : LDA.l FakeBoots : CMP.b #$01 : BNE + + LDA.b LinkSlipping : BEQ ++ : LDA.b PitTileActField : BNE + ; hover check + ++ : PLA : AND.l AbilityFlags : ORA.b #$04 : RTL ; yes boots, not hovering + PLA - AND AbilityFlags ; regular boots + AND.l AbilityFlags ; regular boots RTL ;-------------------------------------------------------------------------------- AddBonkTremors: PHA - LDA $46 : BNE + ; Check for incapacitated Link - JSL.l IncrementBonkCounter + LDA.b LinkIncapacitatedTimer : BNE + ; Check for incapacitated Link + JSL IncrementBonkCounter + - LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + - LDA BootsEquipment : BNE + ; Check for Boots + LDA.l BootsModifier : CMP.b #$01 : BEQ + + LDA.l BootsEquipment : BNE + ; Check for Boots PLA : RTL + PLA - JSL.l AddDashTremor : JSL.l Player_ApplyRumbleToSprites ; things we wrote over + JSL AddDashTremor : JSL Player_ApplyRumbleToSprites ; things we wrote over RTL ;-------------------------------------------------------------------------------- BonkBreakableWall: PHX : PHP SEP #$30 ; set 8-bit accumulator and index registers - LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + - LDA BootsEquipment : BNE + ; Check for Boots + LDA.l BootsModifier : CMP.b #$01 : BEQ + + LDA.l BootsEquipment : BNE + ; Check for Boots PLP : PLX : LDA.w #$0000 : RTL + PLP : PLX - LDA $0372 : AND.w #$00FF ; things we wrote over + LDA.w LinkDashing : AND.w #$00FF ; things we wrote over RTL ;-------------------------------------------------------------------------------- BonkRockPile: - LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + - LDA BootsEquipment : BNE + ; Check for Boots + LDA.l BootsModifier : CMP.b #$01 : BEQ + + LDA.l BootsEquipment : BNE + ; Check for Boots LDA.b #$00 : RTL + - LDA $02EF : AND.b #$70 ; things we wrote over + LDA.w TileActBE : AND.b #$70 ; things we wrote over RTL ;-------------------------------------------------------------------------------- GravestoneHook: - LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + - LDA BootsEquipment : BEQ .done ; Check for Boots + LDA.l BootsModifier : CMP.b #$01 : BEQ + + LDA.l BootsEquipment : BEQ .done ; Check for Boots + - LDA $0372 : BEQ .done ; things we wrote over - JML.l moveGravestone + LDA.w LinkDashing : BEQ .done ; things we wrote over + JML moveGravestone .done - JML.l GravestoneHook_continue + JML GravestoneHook_continue ;-------------------------------------------------------------------------------- JumpDownLedge: - LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + - LDA BootsEquipment : BNE + ; Check for Boots + LDA.l BootsModifier : CMP.b #$01 : BEQ + + LDA.l BootsEquipment : BNE + ; Check for Boots ; Disarm Waterwalk - LDA $5B : CMP.b #$01 : BNE + - STZ $5B + LDA.b LinkSlipping : CMP.b #$01 : BNE + + STZ.b LinkSlipping + - LDA $1B : BNE .done : LDA.b #$02 : STA $EE ; things we wrote over + LDA.b IndoorsFlag : BNE .done : LDA.b #$02 : STA.b LinkLayer ; things we wrote over .done RTL ;-------------------------------------------------------------------------------- BonkRecoil: - LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + - LDA BootsEquipment : BNE + ; Check for Boots - LDA.b #$16 : STA $29 : RTL + LDA.l BootsModifier : CMP.b #$01 : BEQ + + LDA.l BootsEquipment : BNE + ; Check for Boots + LDA.b #$16 : STA.b LinkRecoilZ : RTL + - LDA.b #$24 : STA $29 ; things we wrote over + LDA.b #$24 : STA.b LinkRecoilZ ; things we wrote over RTL diff --git a/bugfixes.asm b/bugfixes.asm index c8adb66..005d45d 100644 --- a/bugfixes.asm +++ b/bugfixes.asm @@ -2,8 +2,8 @@ ;-------------------------------------------------------------------------------- AssignKiki: - LDA.b #$00 : STA FollowerDropped ; defuse bomb - LDA.b #$0A : STA FollowerIndicator ; assign kiki as follower + LDA.b #$00 : STA.l FollowerDropped ; defuse bomb + LDA.b #$0A : STA.l FollowerIndicator ; assign kiki as follower RTL ;-------------------------------------------------------------------------------- @@ -11,10 +11,9 @@ RTL ; Name: AllowSQ ; Returns: Accumulator = 0 if S&Q is disallowed, 1 if allowed ;-------------------------------------------------------------------------------- -!ITEM_BUSY = "$7F5091" AllowSQ: - LDA ProgressIndicator : BEQ .done ; thing we overwrote - check if link is in his bed - LDA !ITEM_BUSY : EOR #$01 + LDA.l ProgressIndicator : BEQ .done ; thing we overwrote - check if link is in his bed + LDA.l BusyItem : EOR.b #$01 .done RTL ;-------------------------------------------------------------------------------- @@ -23,8 +22,8 @@ RTL ;0 = Reset Music ;1 = Don't Reset Music MSMusicReset: - LDA $8A : CMP.b #$80 : BNE + - LDA $23 + LDA.b OverworldIndex : CMP.b #$80 : BNE + + LDA.b LinkPosX+1 + RTL ;-------------------------------------------------------------------------------- @@ -32,11 +31,11 @@ RTL ;-------------------------------------------------------------------------------- ;0 = Become (Perma)bunny DecideIfBunny: - LDA MoonPearlEquipment : BNE .done - LDA CurrentWorld : AND.b #$40 + LDA.l MoonPearlEquipment : BNE .done + LDA.l CurrentWorld : AND.b #$40 PHA : LDA.l InvertedMode : BNE .inverted .normal - PLA : EOR #$40 + PLA : EOR.b #$40 BRA .done .inverted PLA @@ -47,34 +46,25 @@ RTL DecideIfBunnyByScreenIndex: ; If indoors we don't have a screen index. Return non-bunny to make mirror-based ; superbunny work - LDA $1B : BNE .done - LDA MoonPearlEquipment : BNE .done - PHX : LDX $8A : LDA.l OWTileWorldAssoc, X : PLX : PHA + LDA.b IndoorsFlag : BNE .done + LDA.l MoonPearlEquipment : BNE .done + PHX : LDX.b OverworldIndex : LDA.l OWTileWorldAssoc, X : PLX : PHA LDA.l InvertedMode : BNE .inverted .normal - PLA : EOR #$40 + PLA : EOR.b #$40 BRA .done .inverted PLA .done RTL -;-------------------------------------------------------------------------------- - -;-------------------------------------------------------------------------------- -;ReadInventoryPond: -; CPX.b #$1B : BNE + : LDA.b #$01 : RTL : + -; LDA EquipmentWRAM, X -;RTL -;-------------------------------------------------------------------------------- - ;-------------------------------------------------------------------------------- FixBunnyOnExitToLightWorld: - LDA.w $02E0 : BEQ + - JSL.l DecideIfBunny : BEQ + - STZ $5D ; set player mode to Normal - STZ $02E0 : STZ $56 ; return player graphics to normal + LDA.w BunnyFlag : BEQ + + JSL DecideIfBunny : BEQ + + STZ.b LinkState ; set player mode to Normal + STZ.w BunnyFlag : STZ.b BunnyFlagDP ; return player graphics to normal + -RTS +RTL ;-------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------- @@ -83,17 +73,17 @@ RTS FixAga2Bunny: LDA.l FixFakeWorld : BEQ + ; Only use this fix is fakeworld fix is in use LDA.l InvertedMode : BEQ +++ - LDA.b #$00 : STA CurrentWorld ; Switch to light world + LDA.b #$00 : STA.l CurrentWorld ; Switch to light world BRA ++ +++ - LDA.b #$40 : STA CurrentWorld ; Switch to dark world + LDA.b #$40 : STA.l CurrentWorld ; Switch to dark world ++ JSL DecideIfBunny : BNE + JSR MakeBunny + .done PHX - JSL Overworld_DetermineMusic : STX !REG_MUSIC_CONTROL_REQUEST + JSL Overworld_DetermineMusic : STX.w MusicControlRequest PLX RTL ;-------------------------------------------------------------------------------- @@ -101,8 +91,8 @@ RTL ;-------------------------------------------------------------------------------- MakeBunny: PHX : PHY - LDA.b #$17 : STA $5D ; set player mode to permabunny - LDA.b #$01 : STA $02E0 : STA $56 ; make player look like bunny + LDA.b #$17 : STA.b LinkState ; set player mode to permabunny + LDA.b #$01 : STA.w BunnyFlag : STA.b BunnyFlagDP ; make player look like bunny JSL LoadGearPalettes_bunny PLY : PLX RTS @@ -130,27 +120,27 @@ RTL ; Fix for SQ jumping causing accidental Exploration Glitch SQEGFix: LDA.l Bugfix_PodEG : BEQ ++ - STZ.w $047A ; disarm exploration glitch + STZ.w LayerAdjustment ; disarm exploration glitch ++ RTL ;-------------------------------------------------------------------------------- ; Fix crystal not spawning when using somaria vs boss TryToSpawnCrystalUntilSuccess: - STX $02D8 ; what we overwrote + STX.w ItemReceiptID ; what we overwrote JSL AddAncillaLong : BCS .failed ; a clear carry flag indicates success .spawned - STZ $AE ; the "trying to spawn crystal" flag - STZ $AF ; the "trying to spawn pendant" flag + STZ.b RoomTag ; the "trying to spawn crystal" flag + STZ.b RoomTag+1 ; the "trying to spawn pendant" flag .failed RTL ;-------------------------------------------------------------------------------- ; Fix crystal not spawning when using somaria vs boss WallmasterCameraFix: - STZ $A7 ; disable vertical camera scrolling for current room + STZ.b CameraBoundV ; disable vertical camera scrolling for current room REP #$20 - STZ $0618 ; something about scrolling, setting these to 0 tricks the game - STZ $061A ; into thinking we're at the edge of the room so it doesn't scroll. + STZ.w CameraScrollN ; 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. SEP #$20 JML Sound_SetSfx3PanLong ; what we wrote over, also this will RTL @@ -158,8 +148,8 @@ WallmasterCameraFix: ; Fix losing glove colors LoadActualGearPalettesWithGloves: REP #$20 -LDA SwordEquipment : STA $0C -LDA ArmorEquipment : AND.w #$00FF +LDA.l SwordEquipment : STA.b Scrap0C +LDA.l ArmorEquipment : AND.w #$00FF JSL LoadGearPalettes_variable JSL SpriteSwap_Palette_ArmorAndGloves_part_two RTL @@ -167,24 +157,24 @@ RTL ;-------------------------------------------------------------------------------- ; Fix Bunny Palette Map Bug LoadGearPalette_safe_for_bunny: -LDA $10 +LDA.b GameMode CMP.w #$030E : BEQ .new ; opening dungeon map CMP.w #$070E : BEQ .new ; opening overworld map .original - - LDA [$00] - STA $7EC300, X - STA $7EC500, X - INC $00 : INC $00 + LDA.b [Scrap00] + STA.l PaletteBufferAux, X + STA.l PaletteBuffer, X + INC.b Scrap00 : INC.b Scrap00 INX #2 DEY BPL - RTL .new - - LDA [$00] - STA $7EC500, X - INC $00 : INC $00 + LDA.b [Scrap00] + STA.l PaletteBuffer, X + INC.b Scrap00 : INC.b Scrap00 INX #2 DEY BPL - @@ -193,19 +183,19 @@ RTL ;-------------------------------------------------------------------------------- ; Fix pedestal pull overlay PedestalPullOverlayFix: -LDA.b #$09 : STA $039F, X ; the thing we wrote over -LDA $1B : BNE + - LDA $8A : CMP.b #$80 : BNE + - LDA $8C : CMP.b #$97 +LDA.b #$09 : STA.w AncillaGeneralF, X ; the thing we wrote over +LDA.b IndoorsFlag : BNE + + LDA.b OverworldIndex : CMP.b #$80 : BNE + + LDA.b OverlayID : CMP.b #$97 + RTL ;-------------------------------------------------------------------------------- ; Fix losing VRAM gfx when using quake PostNMIUpdateBGCharHalf: - STA.w $420B : SEP #$10 ; what we wrote over - LDA.w $0116 : CMP.b #$46 : BNE .return ; checks to see if this is the last VRAM write - LDA.b $5D : CMP.b #$08 : BCC + : CMP.b #$0A+1 : BCS + ; skip if we're mid-medallion + STA.w MDMAEN : SEP #$10 ; what we wrote over + LDA.w VRAMTileMapIndex : CMP.b #$46 : BNE .return ; checks to see if this is the last VRAM write + LDA.b LinkState : CMP.b #$08 : BCC + : CMP.b #$0A+1 : BCS + ; skip if we're mid-medallion RTL + JSL HeartPieceSetRedraw ; set redraw flag for items .return @@ -213,7 +203,7 @@ RTL ; Force redraws of items following map checks PostOverworldGfxLoad: - INC.b $11 : STZ.b $13 ; what we wrote over + INC.b GameSubMode : STZ.b INIDISPQ ; what we wrote over JSL HeartPieceSetRedraw RTL PostUnderworldMap: @@ -223,7 +213,7 @@ RTL ;-------------------------------------------------------------------------------- FixJingleGlitch: - LDA.b $11 + LDA.b GameSubMode BEQ .set_doors LDA.l AllowAccidentalMajorGlitch @@ -231,7 +221,7 @@ FixJingleGlitch: .set_doors LDA.b #$05 - STA.b $11 + STA.b GameSubMode .exit RTL @@ -243,7 +233,43 @@ pushpc pullpc ;-------------------------------------------------------------------------------- SetOverworldTransitionFlags: - LDA #$01 - STA $0ABF ; used by witch - STA $021B ; used by race game + LDA.b #$01 + STA.w OWTransitionFlag + STA.w RaceGameFlag 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 MDMAEN + +.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 #$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 diff --git a/build.bat b/build.bat index 678823d..198e21e 100644 --- a/build.bat +++ b/build.bat @@ -1,2 +1,4 @@ -py -3 build.py -@echo %cmdcmdline%|find /i """%~f0""">nul && cmd /k +del ..\working.sfc +copy ..\alttp.sfc ..\working.sfc +%~dp0bin\windows\asar.exe LTTP_RND_GeneralBugfixes.asm ..\working.sfc +cmd /k diff --git a/build.sh b/build.sh index b45d9bb..309b257 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,8 @@ #!/bin/bash -rm ../working.sfc -cp ../alttp.sfc ../working.sfc -./asar LTTP_RND_GeneralBugfixes.asm ../working.sfc +rm ../alttp.sfc +cp ~/dev/kwyn/orig/z3.sfc ../alttp.sfc +asar --symbols=wla LTTP_RND_GeneralBugfixes.asm ../alttp.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 diff --git a/build_linux.sh b/build_linux.sh index 1b6c338..7c3af51 100755 --- a/build_linux.sh +++ b/build_linux.sh @@ -2,4 +2,4 @@ rm ../working.sfc cp ../alttp.sfc ../working.sfc -asar LTTP_RND_GeneralBugfixes.asm ../working.sfc +./bin/linux/asar LTTP_RND_GeneralBugfixes.asm ../working.sfc diff --git a/capacityupgrades.asm b/capacityupgrades.asm index 73b3c26..f763b7a 100644 --- a/capacityupgrades.asm +++ b/capacityupgrades.asm @@ -2,36 +2,26 @@ ; Capacity Logic ;================================================================================ IncrementBombs: - LDA BombCapacityUpgrades ; get bomb upgrades - !ADD.l StartingMaxBombs : BEQ + ; Skip if we can't have bombs - DEC - - CMP BombsEquipment - - !BLT + - LDA BombsEquipment - CMP.b #99 : !BGE + - INC : STA BombsEquipment - + + LDA.l BombCapacity : BEQ + ; Skip if we can't have bombs + DEC + CMP.l BombsEquipment : !BLT + + LDA.l BombsEquipment + CMP.b #99 : !BGE + + INC : STA.l BombsEquipment + + RTL ;-------------------------------------------------------------------------------- IncrementArrows: - LDA ArrowCapacityUpgrades ; get arrow upgrades - !ADD.l StartingMaxArrows : DEC - - CMP CurrentArrows - - !BLT + - LDA CurrentArrows - CMP.b #99 : !BGE + - INC : STA CurrentArrows - + + LDA.l ArrowCapacity : DEC + CMP.l CurrentArrows : !BLT + + LDA.l CurrentArrows + CMP.b #99 : !BGE + + INC : STA.l CurrentArrows + + RTL ;-------------------------------------------------------------------------------- CompareBombsToMax: - LDA BombCapacityUpgrades ; get bomb upgrades - !ADD.l StartingMaxBombs - - CMP BombsEquipment + LDA.l BombCapacity + CMP.l BombsEquipment RTL ;-------------------------------------------------------------------------------- diff --git a/catfish.asm b/catfish.asm deleted file mode 100644 index 7429cb7..0000000 --- a/catfish.asm +++ /dev/null @@ -1,40 +0,0 @@ -;================================================================================ -; Randomize Catfish -;-------------------------------------------------------------------------------- -LoadCatfishItemGFX: - LDA.l CatfishItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID - LDA.l $1DE185 ; location randomizer writes catfish item to - JML RequestSlottedTile -;-------------------------------------------------------------------------------- -DrawThrownItem: - LDA $8A : CMP.b #$81 : BNE .catfish - - .zora - LDA.l $1DE1C3 ; location randomizer writes zora item to - BRA .draw - - .catfish - LDA.l $1DE185 ; location randomizer writes catfish item to - - .draw - JML DrawSlottedTile -;-------------------------------------------------------------------------------- -MarkThrownItem: - PHA - - LDA $8A : CMP.b #$81 : BNE .catfish - - .zora - JSL.l ItemSet_ZoraKing - LDA ZoraItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID - BRA .done - - .catfish - JSL.l ItemSet_Catfish - LDA CatfishItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID - - .done - PLA - JSL Link_ReceiveItem ; thing we wrote over -RTL -;-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/clock.asm b/clock.asm deleted file mode 100644 index 4e853d1..0000000 --- a/clock.asm +++ /dev/null @@ -1,248 +0,0 @@ -;-------------------------------------------------------------------------------- -; 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 -; If ([002800h] AND 0F)=0Fh then read -; If ([002800h] AND 0F)=0Fh then read -; If ([002800h] AND 0F)=0Fh then read -; 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 -;-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/compasses.asm b/compasses.asm deleted file mode 100644 index d8493a7..0000000 --- a/compasses.asm +++ /dev/null @@ -1,72 +0,0 @@ -;-------------------------------------------------------------------------------- -; $7F5010 - Scratch Space -;-------------------------------------------------------------------------------- - -DrawDungeonCompassCounts: - SEP #$10 - 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 : BCC + ; Skip if not in a valid dungeon ID - JMP .done - + - BIT.w #$0002 : BNE ++ ; if CompassMode==2, we don't check for the compass - TXY : TXA : LSR : TAX : LDA.l ExistsTransfer, X : TAX : LDA CompassExists, X : BEQ ++ - TYX : LDA CompassField : AND.l DungeonItemMasks, X ; Load compass values to A, mask with dungeon item masks - BNE ++ - JMP .done ; skip if we don't have compass - ++ - - LDA $040C : LSR - BNE + - INC - + TAX : LDA.l CompassTotalsWRAM, X : AND #$00FF - PHX - PHA - JSL HexToDec_fast - PLA : CMP.w #100 : !BLT .two_digit - LDX.b $05 : TXA : ORA #$2490 : STA $7EC79A - LDX.b $06 : TXA : ORA #$2490 : STA $7EC79C - LDX.b $07 : TXA : ORA #$2490 : STA $7EC79E - BRA .end_total - .two_digit - LDX.b $06 : TXA : ORA #$2490 : STA $7EC79A - LDX.b $07 : TXA : ORA #$2490 : STA $7EC79C - .end_total - PLX - - LDA DungeonLocationsChecked, X : AND #$00FF - PHA - JSL HexToDec_fast - PLA : CMP.w #100 : !BLT + - LDX.b $05 : TXA : ORA #$2490 : STA $7EC792 ; Draw the 100's digit - + - LDX.b $06 : TXA : ORA #$2490 : STA $7EC794 ; Draw the item count - LDX.b $07 : TXA : ORA #$2490 : 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 - -; maps from $040C to the odd order used in overworld map -ExistsTransfer: -db $0C, $0C, $00, $02, $0B, $09, $03, $07, $04, $08, $01, $06, $05, $0A - -;-------------------------------------------------------------------------------- -; $7EF4C0-7EF4CF - item locations checked indexed by $040C >> 1 -;-------------------------------------------------------------------------------- -InitCompassTotalsRAM: - LDX #$00 - - - LDA CompassTotalsROM, X : STA CompassTotalsWRAM, X - INX - CPX #$0F : !BLT - -RTL diff --git a/compression.asm b/compression.asm deleted file mode 100644 index 454e96a..0000000 --- a/compression.asm +++ /dev/null @@ -1,29 +0,0 @@ -;-------------------------------------------------------------------------------- -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 -;-------------------------------------------------------------------------------- diff --git a/contrib.asm b/contrib.asm deleted file mode 100644 index 72f8981..0000000 --- a/contrib.asm +++ /dev/null @@ -1,185 +0,0 @@ -;================================================================ -; 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 -} -;================================================================ - -incsrc menu/hudalpha.asm -incsrc util/utils.asm diff --git a/controllerjank.asm b/controllerjank.asm index 5fc65ba..2a13aea 100644 --- a/controllerjank.asm +++ b/controllerjank.asm @@ -4,85 +4,83 @@ ;-------------------------------------------------------------------------------- ; Filtered Joypad 1 Register: [AXLR | ????] ; Filtered Joypad 1 Register: [BYST | udlr] [AXLR | ????] -!INVERT_DPAD = "$7F50CB" InvertDPad_DPadOnly: - LDA $4218 : STA $00 - LDA $4219 + LDA.w JOY1L : STA.b Scrap00 + LDA.w JOY1H BIT.b #$0C : BEQ + : EOR.b #$0C : + ; swap up/down BIT.b #$03 : BEQ + : EOR.b #$03 : + ; swap left/right - STA $01 -JML.l InvertDPadReturn + STA.b Scrap01 +JML InvertDPadReturn InvertDPad_ButtonsOnly: REP #$20 ; set 16-bit accumulator - LDA $4218 + LDA.w JOY1L BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A - STA $00 + STA.b Scrap00 SEP #$20 ; set 8-bit accumulator -JML.l InvertDPadReturn +JML InvertDPadReturn InvertDPad_Both: REP #$20 ; set 16-bit accumulator - LDA $4218 + LDA.w JOY1L BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A BIT.w #$0C00 : BEQ + : EOR.w #$0C00 : + ; swap up/down BIT.w #$0300 : BEQ + : EOR.w #$0300 : + ; swap left/right - STA $00 + STA.b Scrap00 SEP #$20 ; set 8-bit accumulator -JML.l InvertDPadReturn +JML InvertDPadReturn InvertDPad_SwapSides: REP #$20 ; set 16-bit accumulator - LDA $4218 + LDA.w JOY1L BIT.w #$0840 : BEQ + : EOR.w #$0840 : + ; swap X/up BIT.w #$0180 : BEQ + : EOR.w #$0180 : + ; swap A/right BIT.w #$4200 : BEQ + : EOR.w #$4200 : + ; swap Y/left BIT.w #$8400 : BEQ + : EOR.w #$8400 : + ; swap B/down - STA $00 + STA.b Scrap00 SEP #$20 ; set 8-bit accumulator -JML.l InvertDPadReturn +JML InvertDPadReturn InvertDPad_DPadLROnly: - LDA $4218 : STA $00 - LDA $4219 + LDA.w JOY1L : STA.b Scrap00 + LDA.w JOY1H BIT.b #$03 : BEQ + : EOR.b #$03 : + ; swap left/right - STA $01 -JML.l InvertDPadReturn + STA.b Scrap00 +JML InvertDPadReturn InvertDPad_DPadUDOnly: - LDA $4218 : STA $00 - LDA $4219 + LDA.w JOY1L : STA.b Scrap00 + LDA.w JOY1H BIT.b #$0C : BEQ + : EOR.b #$0C : + ; swap up/down - STA $01 -JML.l InvertDPadReturn - + STA.b Scrap00 +JML InvertDPadReturn InvertDPad: LDA.l OneMindPlayerCount : BEQ .crowd_control - LDA.l !ONEMIND_ID + LDA.l OneMindId AND.b #$03 TAX LDA.l .onemind_controller_offset, X TAX - LDA.w $4218,X : STA.w $00 - LDA.w $4219,X : STA.w $01 + LDA.w JOY1L,X : STA.w Scrap00 + LDA.w JOY1H,X : STA.w Scrap01 - LDA #$80 : STA $4201 ; reset this so latch can read it, otherwise RNG breaks + LDA.b #$80 : STA.w WRIO ; reset this so latch can read it, otherwise RNG breaks - JML.l InvertDPadReturn + JML InvertDPadReturn .crowd_control - LDA !INVERT_DPAD : BNE + + LDA.l ControllerInverter : BNE + - LDA $4218 : STA $00 - LDA $4219 : STA $01 - JML.l InvertDPadReturn + LDA.w JOY1L : STA.b Scrap00 + LDA.w JOY1H : STA.b Scrap01 + JML InvertDPadReturn + DEC : BNE + JMP.w InvertDPad_DPadOnly @@ -98,12 +96,12 @@ InvertDPad: .onemind_controller_offset - db 0 ; player 0 - $4218 - joy1d1 - db 0 ; player 1 - $4218 - joy1d1 - db 2 ; player 2 - $421A - joy2d1 - db 6 ; player 3 - $421E - joy2d2 - db 2 ; player 4 - $421A - joy2d1 - db 6 ; player 5 - $421E - joy2d2 + db 0 ; player 0 - JOY1L - joy1d1 + db 0 ; player 1 - JOY1L - joy1d1 + db 2 ; player 2 - JOY2L - joy2d1 + db 6 ; player 3 - JOY4L - joy2d2 + db 2 ; player 4 - JOY2L - joy2d1 + db 6 ; player 5 - JOY4L - joy2d2 ;-------------------------------------------------------------------------------- @@ -113,12 +111,12 @@ HandleOneMindController: REP #$20 - LDA.l !ONEMIND_TIMER + LDA.l OneMindTimerRAM DEC BPL .no_switch SEP #$20 - LDA.l !ONEMIND_ID + LDA.l OneMindId INC CMP.l OneMindPlayerCount BCC .no_wrap @@ -126,29 +124,26 @@ HandleOneMindController: LDA.b #$01 ; reset to player 1 .no_wrap - STA.l !ONEMIND_ID + STA.l OneMindId REP #$20 - LDA.l OneMindTimer + LDA.l OneMindTimerInit .no_switch - STA.l !ONEMIND_TIMER + STA.l OneMindTimerRAM SEP #$20 - LDA.l !ONEMIND_ID + LDA.l OneMindId CMP.b #$04 ; is it player 4 or 5? BCC .no_multitap_switch - STZ.w $4201 + STZ.w WRIO .no_multitap_switch .no_onemind - STZ.b $12 - - JML $008034 ; reset frame loop - - + STZ.b NMIDoneFlag + JML MainGameLoop ; reset frame loop diff --git a/crypto.asm b/crypto.asm index 120344f..4f0d5f0 100644 --- a/crypto.asm +++ b/crypto.asm @@ -1,21 +1,6 @@ -; $7F50D0 - $7F50FF - Block Cypher Parameters -; $7F5100 - $7F51FF - Block Cypher Buffer -!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" +; Scrap04 used for n +; Scrap06 used for rounds +; Scrap08 use for dpScratch/MXResult (lower 32 of dpScratch) CryptoDelta: dd #$9e3779b9 @@ -35,164 +20,144 @@ macro ASL32Single(value) ; ROL handles the carry from the lower byte for us endmacro -;macro LSR32(value,k) -; LDX.b -; ?loop: -; %LSR32Single(,) -; DEX : CPX.b #$00 : BNE ?loop -;endmacro - -;macro ASL32(value,k) -; LDX.b -; ?loop: -; %LSR32Single(,) -; DEX : CPX.b #$00 : BNE ?loop -;endmacro - CryptoMX: PHX ; upperScratch = (z>>5 ^ y <<2) - LDA.w !z : STA.b !dpScratch - LDA.w !z+2 : STA.b !dpScratch+2 - %LSR32Single(!dpScratch) - %LSR32Single(!dpScratch) - %LSR32Single(!dpScratch) - %LSR32Single(!dpScratch) - %LSR32Single(!dpScratch) - ;%LSR32(!dpScratch,#$05) + LDA.w z : STA.b Scrap08 + LDA.w z+2 : STA.b Scrap08+2 + %LSR32Single(Scrap08) + %LSR32Single(Scrap08) + %LSR32Single(Scrap08) + %LSR32Single(Scrap08) + %LSR32Single(Scrap08) + ;%LSR32(Scrap08,#$05) - LDA.w !y : STA.b !dpScratch+4 - LDA.w !y+2 : STA.b !dpScratch+6 - %ASL32Single(!dpScratch+4) - %ASL32Single(!dpScratch+4) - ;%ASL32(!dpScratch+4,#$02) + LDA.w y : STA.b Scrap08+4 + LDA.w y+2 : STA.b Scrap08+6 + %ASL32Single(Scrap08+4) + %ASL32Single(Scrap08+4) + ;%ASL32(Scrap08+4,#$02) - LDA.b !dpScratch : EOR.b !dpScratch+4 : STA.w !upperScratch - LDA.b !dpScratch+2 : EOR.b !dpScratch+6 : STA.w !upperScratch+2 + LDA.b Scrap08 : EOR.b Scrap08+4 : STA.w CryptoScratch + LDA.b Scrap08+2 : EOR.b Scrap08+6 : STA.w CryptoScratch+2 ;================================ ; upperscratch2 = (y>>3^z<<4) - LDA.w !z : STA.b !dpScratch - LDA.w !z+2 : STA.b !dpScratch+2 - %ASL32Single(!dpScratch) - %ASL32Single(!dpScratch) - %ASL32Single(!dpScratch) - %ASL32Single(!dpScratch) - ;%ASL32(!dpScratch,#$04) + LDA.w z : STA.b Scrap08 + LDA.w z+2 : STA.b Scrap08+2 + %ASL32Single(Scrap08) + %ASL32Single(Scrap08) + %ASL32Single(Scrap08) + %ASL32Single(Scrap08) + ;%ASL32(Scrap08,#$04) - LDA.w !y : STA.b !dpScratch+4 - LDA.w !y+2 : STA.b !dpScratch+6 - %LSR32Single(!dpScratch+4) - %LSR32Single(!dpScratch+4) - %LSR32Single(!dpScratch+4) - ;%LSR32(!dpScratch+4,#$03) + LDA.w y : STA.b Scrap08+4 + LDA.w y+2 : STA.b Scrap08+6 + %LSR32Single(Scrap08+4) + %LSR32Single(Scrap08+4) + %LSR32Single(Scrap08+4) + ;%LSR32(Scrap08+4,#$03) - LDA.b !dpScratch : EOR.b !dpScratch+4 : STA.w !upperScratch+4 - LDA.b !dpScratch+2 : EOR.b !dpScratch+6 : STA.w !upperScratch+6 + LDA.b Scrap08 : EOR.b Scrap08+4 : STA.w CryptoScratch+4 + LDA.b Scrap08+2 : EOR.b Scrap08+6 : STA.w CryptoScratch+6 ;================================ ; upperscratch = upperscratch + upperscratch2 ( == (z>>5^y<<2) + (y>>3^z<<4) ) - LDA.w !upperScratch : !ADD.w !upperScratch+4 : STA.w !upperScratch - LDA.w !upperScratch+2 : ADC.w !upperScratch+6 : STA.w !upperScratch+2 + LDA.w CryptoScratch : !ADD.w CryptoScratch+4 : STA.w CryptoScratch + LDA.w CryptoScratch+2 : ADC.w CryptoScratch+6 : STA.w CryptoScratch+2 ;================================ ; dpscratch = sum^y - LDA.w !sum : EOR.w !y : STA.b !dpScratch - LDA.w !sum+2 : EOR.w !y+2 : STA.b !dpScratch+2 + LDA.w Sum : EOR.w y : STA.b Scrap08 + LDA.w Sum+2 : EOR.w y+2 : STA.b Scrap08+2 ;================================ ; 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 !keyBase, X : EOR.w !z : STA.b !dpScratch+4 - LDA.w !keyBase+2, X : EOR.w !z+2 : STA.b !dpScratch+6 + 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+2, X : EOR.w z+2 : STA.b Scrap08+6 ;================================ ; upperscratch2 = dpscratch + dpscratch2 (== (sum^y) + (k[p&3^e]^z)) - LDA.b !dpScratch : !ADD.b !dpScratch+4 : STA.w !upperScratch+4 - LDA.b !dpScratch+2 : ADC.b !dpScratch+6 : STA.w !upperScratch+6 + LDA.b Scrap08 : !ADD.b Scrap08+4 : STA.w CryptoScratch+4 + LDA.b Scrap08+2 : ADC.b Scrap08+6 : STA.w CryptoScratch+6 ;================================ ; MXResult = uppserscratch ^ upperscratch2 - LDA.w !upperScratch : EOR.w !upperScratch+4 : STA.b !MXResult - LDA.w !upperScratch+2 : EOR.w !upperScratch+6 : STA.b !MXResult+2 + LDA.w CryptoScratch : EOR.w CryptoScratch+4 : STA.b Scrap08 + LDA.w CryptoScratch+2 : EOR.w CryptoScratch+6 : STA.b Scrap08+2 PLX RTS -;!DIVIDEND_LOW = $4204 -;!DIVIDEND_HIGH = $4205 -;!DIVISOR = $4206 -;!QUOTIENT_LOW = $4214 -;!QUOTIENT_HIGH = $4215 - XXTEA_Decode: PHP : PHB SEP #$30 ; set 8-bit accumulator and index LDA.b #$7F : PHA : PLB - STZ.b !n+1 ; set upper byte of n to be zero, so it can safely be accessed in 16-bit mode + STZ.b Scrap04+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 LDX.b #0 - LDA.l .n_lookup, X - CMP.b !n : !BLT + + CMP.b Scrap04 : !BLT + INX BRA - + ; rounds = 6 + 52/n; - LDA.l .round_counts, X : STA.b !rounds : STZ.b !rounds+1 + LDA.l .round_counts, X : STA.b Scrap06 : STZ.b Scrap06+1 REP #$20 ; set 16-bit accumulator ; sum = rounds*DELTA; TXA : ASL #2 : TAX - LDA.l .initial_sums, X : STA.w !sum - LDA.l .initial_sums+2, X : STA.w !sum+2 + LDA.l .initial_sums, X : STA.w Sum + LDA.l .initial_sums+2, X : STA.w Sum+2 ; y = v[0]; - LDA.w !v : STA.w !y - LDA.w !v+2 : STA.w !y+2 + LDA.w v : STA.w y + 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 !n : DEC : STA.w !p + LDA.b Scrap04 : DEC : STA.w p -- BEQ + ; for (p=n-1; p>0; p--) { ; z = v[p-1]; ASL #2 : TAX - LDA.w !v-4, X : STA.w !z - LDA.w !v-4+2, X : STA.w !z+2 + LDA.w v-4, X : STA.w z + LDA.w v-4+2, X : STA.w z+2 ; y = v[p] -= MX; JSR CryptoMX - LDA.w !p : ASL #2 : TAX - LDA.w !v, X : !SUB.b !MXResult : STA.w !v, X : STA.w !y - LDA.w !v+2, X : SBC.b !MXResult+2 : STA.w !v+2, X : STA.w !y+2 + LDA.w p : ASL #2 : TAX + LDA.w v, X : !SUB.b Scrap08 : 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 !p : DEC : STA.w !p : BRA -- ; } + LDA.w p : DEC : STA.w p : BRA -- ; } + ; z = v[n-1]; - LDA.b !n : DEC : ASL #2 : TAX - LDA.w !v, X : STA.w !z - LDA.w !v+2, X : STA.w !z+2 + LDA.b Scrap04 : DEC : ASL #2 : TAX + LDA.w v, X : STA.w z + LDA.w v+2, X : STA.w z+2 ; y = v[0] -= MX; JSR CryptoMX - LDA.w !v : !SUB.b !MXResult : STA.w !v : STA.w !y - LDA.w !v+2 : SBC.b !MXResult+2 : STA.w !v+2 : STA.w !y+2 + LDA.w v : !SUB.b Scrap08 : STA.w v : STA.w y + LDA.w v+2 : SBC.b Scrap08+2 : STA.w v+2 : STA.w y+2 ; sum -= DELTA; - LDA.w !sum : !SUB.l CryptoDelta : STA.w !sum - LDA.w !sum+2 : SBC.l CryptoDelta+2 : STA.w !sum+2 + LDA.w Sum : !SUB.l CryptoDelta : STA.w Sum + LDA.w Sum+2 : SBC.l CryptoDelta+2 : STA.w Sum+2 - DEC !rounds : BEQ + : JMP --- : + ; } while (--rounds); + DEC.b Scrap06 : BEQ + : JMP --- : + ; } while (--rounds); PLB : PLP RTL @@ -243,69 +208,3 @@ db 32 ; n is 2 ;dd (23*$9e3779b9)&$ffffffff ; n is 3 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 -;#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> 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); -; } -;} diff --git a/cuccostorm.asm b/cuccostorm.asm index 2d40f39..d01f282 100644 --- a/cuccostorm.asm +++ b/cuccostorm.asm @@ -1,49 +1,35 @@ ;================================================================================ -!CUCCO_STORM = "$7F50C5" -!IS_INDOORS = "$7E001B" -!ENEMY_STATE_TABLE = "$7E0DD0" -!ENEMY_TYPE_TABLE = "$7E0E20" -!ENEMY_AUX1_TABLE = "$7E0DA0" -!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" +!CUCCO = $0B +!INERT = $00 +!INIT = $08 +!ALIVE = $09 +!CUCCO_ENRAGED = $23 + CuccoStorm: - + SEP #$30 ; set 8-bit accumulator index registers - LDA.l !CUCCO_STORM : BEQ + ; only if storm is on - LDA.b $10 : CMP.b #$09 : BNE + ; only if outdoors + LDA.l CuccoStormer : BEQ + ; only if storm is on + LDA.b GameMode : CMP.b #$09 : BNE + ; only if outdoors LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames - + - ;==== Find a Cucco - + LDY.b #$FF : PHY ; push "cucco not found" - + LDX.b #$00 : -- : CPX.b #$10 : !BGE .ldone - LDA.w !ENEMY_STATE_TABLE, X : CMP.b !ALIVE : BEQ +++ + LDA.w SpriteAITable, X : CMP.b #!ALIVE : BEQ +++ ; enemy not found - CMP.b !INERT : BNE ++ + CMP.b #!INERT : BNE ++ ; log inert enemy slot PLA : PHX BRA ++ +++ ; found an enemy - LDA.l !ENEMY_TYPE_TABLE, X : CMP.b !CUCCO : BNE ++ + LDA.l SpriteTypeTable, X : CMP.b #!CUCCO : BNE ++ ; it's a cucco TXY ; record where we found the living cucco in case we don't find any angry ones - LDA.w !ENEMY_AUX1_TABLE, X : CMP.b !CUCCO_ENRAGED : !BLT ++ + LDA.w SpriteAuxTable, X : CMP.b #!CUCCO_ENRAGED : !BLT ++ PLA : BRA + ; we found an angry cucco, done ++ : INX : BRA -- : .ldone @@ -53,22 +39,22 @@ CuccoStorm: ; we didn't find a cucco, so try to create one PLY CPY.b #$FF : BEQ + ; fail if no slots found - LDA.b !CUCCO : STA.w !ENEMY_TYPE_TABLE, Y - LDA.b !INIT : STA.w !ENEMY_STATE_TABLE, Y - LDA.b !LINK_POS_Y_LOW : STA.w !ENEMY_POS_Y_LOW, Y - LDA.b !LINK_POS_Y_HIGH : STA.w !ENEMY_POS_Y_HIGH, Y - LDA.b !LINK_POS_X_LOW : STA.w !ENEMY_POS_X_LOW, Y - LDA.b !LINK_POS_X_HIGH : STA.w !ENEMY_POS_X_HIGH, Y + LDA.b #!CUCCO : STA.w SpriteTypeTable, Y + LDA.b #!INIT : STA.w SpriteAITable, Y + LDA.b LinkPosY : STA.w SpritePosYLow, Y + LDA.b LinkPosY+1 : STA.w SpritePosYHigh, Y + LDA.b LinkPosX : STA.w SpritePosXLow, Y + LDA.b LinkPosX+1 : STA.w SpritePosXHigh, Y BRA +++ ++ PLA +++ - + ;==== Enrage a Cucco - - LDA.b !CUCCO_ENRAGED : STA.w !ENEMY_AUX1_TABLE, Y ; enrage the cucco - LDA.b #$00 : STA.w !ENEMY_AUX2_TABLE, Y : STA.w !ENEMY_DIRECTION_TABLE, Y - + + LDA.b #!CUCCO_ENRAGED : STA.w SpriteAuxTable, Y ; enrage the cucco + LDA.b #$00 : STA.w SpriteAuxTable+$10, Y : STA.w SpriteDirectionTable, Y + ;==== + RTL diff --git a/custompalettes.asm b/custompalettes.asm new file mode 100644 index 0000000..d19f52b --- /dev/null +++ b/custompalettes.asm @@ -0,0 +1,17 @@ +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 diff --git a/darkroomitems.asm b/darkroomitems.asm deleted file mode 100644 index a2d1474..0000000 --- a/darkroomitems.asm +++ /dev/null @@ -1,27 +0,0 @@ -CheckReceivedItemPropertiesBeforeLoad: - LDA $A0 : BEQ .normalCode - LDA $7EC005 : BNE .lightOff - .normalCode - LDA.l AddReceivedItemExpanded_properties, X ;Restore Rando Code - RTL - -.lightOff - PHX : PHY : PHB - LDA.l AddReceivedItemExpanded_properties, X ; 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 diff --git a/darkworldspawn.asm b/darkworldspawn.asm index 0316a21..1423350 100644 --- a/darkworldspawn.asm +++ b/darkworldspawn.asm @@ -3,99 +3,99 @@ ;-------------------------------------------------------------------------------- DarkWorldSaveFix: LDA.b #$70 : PHA : PLB ; thing we wrote over - data bank change - JSL.l MasterSwordFollowerClear - JML.l StatSaveCounter + JSL MasterSwordFollowerClear + JML StatSaveCounter ;-------------------------------------------------------------------------------- DoWorldFix: - LDA InvertedMode : BEQ + + LDA.l InvertedMode : BEQ + JMP DoWorldFix_Inverted + LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check - LDA FollowerIndicator : CMP #$04 : BNE + ; if old man following, skip mirror/aga check + LDA.l FollowerIndicator : CMP.b #$04 : BNE + ; if old man following, skip mirror/aga check LDA.l OldManRetrievalWorld BRA .noMirror - + LDA MirrorEquipment : AND #$02 : 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 - LDA ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive + LDA.l ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive .setLightWorld - LDA #$00 + LDA.b #$00 .noMirror - STA CurrentWorld ; set flag to light world + STA.l CurrentWorld ; set flag to light world LDA.l SmithDeleteOnSave : BEQ .transform - LDA FollowerIndicator - CMP #$07 : BEQ .clear ; clear frog - CMP #$08 : BEQ .clear ; clear dwarf - consider flute implications + LDA.l FollowerIndicator + CMP.b #$07 : BEQ .clear ; clear frog + CMP.b #$08 : BEQ .clear ; clear dwarf - consider flute implications BRA .done .clear - LDA.b #$00 : STA FollowerIndicator : BRA .done ; clear follower + LDA.b #$00 : STA.l FollowerIndicator : BRA .done ; clear follower .transform - LDA FollowerIndicator : CMP #$07 : BNE .done : INC : STA FollowerIndicator ; convert frog to dwarf + LDA.l FollowerIndicator : CMP.b #$07 : BNE .done : INC : STA.l FollowerIndicator ; convert frog to dwarf .done RTL ;-------------------------------------------------------------------------------- SetDeathWorldChecked: - LDA InvertedMode : BEQ + + LDA.l InvertedMode : BEQ + JMP SetDeathWorldChecked_Inverted + - LDA $1B : BEQ .outdoors - LDA $040C : CMP #$FF : BNE .dungeon - LDA $A0 : ORA $A1 : BNE ++ - LDA GanonPyramidRespawn : BNE .pyramid ; if flag is set, force respawn at pyramid on death to ganon + LDA.b IndoorsFlag : BEQ .outdoors + LDA.w DungeonID : CMP.b #$FF : BNE .dungeon + LDA.b RoomIndex : ORA.b RoomIndex+1 : BNE ++ + LDA.l GanonPyramidRespawn : BNE .pyramid ; if flag is set, force respawn at pyramid on death to ganon ++ .outdoors JMP DoWorldFix .dungeon - 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 .pyramid - LDA #$40 : STA CurrentWorld ; set flag to dark world - LDA FollowerIndicator : CMP #$08 : BNE .done : DEC : STA FollowerIndicator : + ; convert dwarf to frog + LDA.b #$40 : STA.l CurrentWorld ; set flag to dark world + LDA.l FollowerIndicator : CMP.b #$08 : BNE .done : DEC : STA.l FollowerIndicator : + ; convert dwarf to frog .done RTL ;================================================================================ DoWorldFix_Inverted: LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check - LDA FollowerIndicator : CMP #$04 : BNE + ; if old man following, skip mirror/aga check + LDA.l FollowerIndicator : CMP.b #$04 : BNE + ; if old man following, skip mirror/aga check LDA.l OldManRetrievalWorld BRA .setWorld - + LDA.l MirrorEquipment : AND #$02 : 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 - LDA ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive + LDA.l ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive .noMirror .setDarkWorld - LDA #$40 + LDA.b #$40 .setWorld - STA CurrentWorld ; set flag to dark world + STA.l CurrentWorld ; set flag to dark world LDA.l SmithDeleteOnSave : BEQ .transform - LDA FollowerIndicator - CMP #$07 : BEQ .clear ; clear frog - CMP #$08 : BEQ .clear ; clear dwarf - consider flute implications + LDA.l FollowerIndicator + CMP.b #$07 : BEQ .clear ; clear frog + CMP.b #$08 : BEQ .clear ; clear dwarf - consider flute implications BRA .done .clear - LDA.b #$00 : STA FollowerIndicator : BRA .done ; clear follower + LDA.b #$00 : STA.l FollowerIndicator : BRA .done ; clear follower .transform - LDA FollowerIndicator : CMP #$07 : BNE .done : INC : STA FollowerIndicator ; convert frog to dwarf + LDA.l FollowerIndicator : CMP.b #$07 : BNE .done : INC : STA.l FollowerIndicator ; convert frog to dwarf .done RTL ;-------------------------------------------------------------------------------- SetDeathWorldChecked_Inverted: - LDA $1B : BEQ .outdoors - LDA $040C : CMP #$FF : BNE .dungeon - LDA $A0 : ORA $A1 : BNE ++ - LDA GanonPyramidRespawn : BNE .castle ; if flag is set, force respawn at pyramid on death to ganon + LDA.b IndoorsFlag : BEQ .outdoors + LDA.w DungeonID : CMP.b #$FF : BNE .dungeon + LDA.b RoomIndex : ORA.b RoomIndex+1 : BNE ++ + LDA.l GanonPyramidRespawn : BNE .castle ; if flag is set, force respawn at pyramid on death to ganon ++ .outdoors JMP DoWorldFix_Inverted .dungeon - 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 .castle - LDA #$00 : STA CurrentWorld ; set flag to dark world - LDA FollowerIndicator : CMP #$07 : BNE + : LDA.b #$08 : STA FollowerIndicator : + ; convert frog to dwarf + LDA.b #$00 : STA.l CurrentWorld ; set flag to dark world + LDA.l FollowerIndicator : CMP.b #$07 : BNE + : LDA.b #$08 : STA.l FollowerIndicator : + ; convert frog to dwarf .done RTL ;================================================================================ @@ -103,9 +103,9 @@ RTL ;-------------------------------------------------------------------------------- FakeWorldFix: - LDA FixFakeWorld : BEQ + + LDA.l FixFakeWorld : BEQ + PHX - LDX $8A : LDA.l OWTileWorldAssoc, X : STA CurrentWorld + LDX.b OverworldIndex : LDA.l OWTileWorldAssoc, X : STA.l CurrentWorld PLX + RTL @@ -120,14 +120,14 @@ LDA CurrentWorld RTL ;-------------------------------------------------------------------------------- MasterSwordFollowerClear: - LDA FollowerIndicator - CMP #$0E : BNE .exit ; clear master sword follower - LDA.b #$00 : STA FollowerIndicator ; clear follower + LDA.l FollowerIndicator + CMP.b #$0E : BNE .exit ; clear master sword follower + LDA.b #$00 : STA.l FollowerIndicator ; clear follower .exit RTL ;-------------------------------------------------------------------------------- FixAgahnimFollowers: - LDA.b #$00 : STA FollowerIndicator ; clear follower + LDA.b #$00 : STA.l FollowerIndicator ; clear follower JML PrepDungeonExit ; thing we wrote over ;-------------------------------------------------------------------------------- @@ -137,10 +137,10 @@ macro SetMinimum(base,filler,compare) ?done: endmacro RefreshRainAmmo: - LDA ProgressIndicator : CMP.b #$01 : BEQ .rain ; check if we're in rain state + LDA.l ProgressIndicator : CMP.b #$01 : BEQ .rain ; check if we're in rain state RTL .rain - LDA StartingEntrance + LDA.l StartingEntrance + CMP.b #$03 : BNE + ; Uncle %SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Uncle) %SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Uncle) @@ -165,28 +165,25 @@ RefreshRainAmmo: .done RTL ;-------------------------------------------------------------------------------- -!INFINITE_ARROWS = "$7F50C8" -!INFINITE_BOMBS = "$7F50C9" -!INFINITE_MAGIC = "$7F50CA" SetEscapeAssist: - LDA ProgressIndicator : CMP.b #$01 : BNE .no_train ; check if we're in rain state + LDA.l ProgressIndicator : CMP.b #$01 : BNE .no_train ; check if we're in rain state .rain LDA.l EscapeAssist - BIT.b #$04 : BEQ + : STA !INFINITE_MAGIC : + - BIT.b #$02 : BEQ + : STA !INFINITE_BOMBS : + - BIT.b #$01 : BEQ + : STA !INFINITE_ARROWS : + + BIT.b #$04 : BEQ + : STA.l InfiniteArrows : + + BIT.b #$02 : BEQ + : STA.l InfiniteBombs : + + BIT.b #$01 : BEQ + : STA.l InfiniteArrows : + BRA ++ .no_train ; choo choo - LDA.l EscapeAssist : BIT.b #$04 : BEQ + : LDA.b #$00 : STA !INFINITE_MAGIC : + - LDA.l EscapeAssist : BIT.b #$02 : BEQ + : LDA.b #$00 : STA !INFINITE_BOMBS : + - LDA.l EscapeAssist : BIT.b #$01 : BEQ + : LDA.b #$00 : STA !INFINITE_ARROWS : + + LDA.l EscapeAssist : BIT.b #$04 : BEQ + : LDA.b #$00 : STA.l InfiniteMagic : + + LDA.l EscapeAssist : BIT.b #$02 : BEQ + : LDA.b #$00 : STA.l InfiniteBombs : + + LDA.l EscapeAssist : BIT.b #$01 : BEQ + : LDA.b #$00 : STA.l InfiniteArrows : + ++ RTL ;-------------------------------------------------------------------------------- SetSilverBowMode: - LDA SilverArrowsUseRestriction : BEQ + ; fix bow type for restricted arrow mode - LDA BowEquipment : CMP.b #$3 : BCC + - SBC.b #$02 : STA BowEquipment + LDA.l SilverArrowsUseRestriction : BEQ + ; fix bow type for restricted arrow mode + LDA.l BowEquipment : CMP.b #$3 : BCC + + SBC.b #$02 : STA.l BowEquipment + RTL ;================================================================================ diff --git a/99ff1_bombos.gfx b/data/99ff1_bombos.gfx old mode 100755 new mode 100644 similarity index 100% rename from 99ff1_bombos.gfx rename to data/99ff1_bombos.gfx diff --git a/99ff1_quake.gfx b/data/99ff1_quake.gfx old mode 100755 new mode 100644 similarity index 100% rename from 99ff1_quake.gfx rename to data/99ff1_quake.gfx diff --git a/a6fc4_bombos.gfx b/data/a6fc4_bombos.gfx old mode 100755 new mode 100644 similarity index 100% rename from a6fc4_bombos.gfx rename to data/a6fc4_bombos.gfx diff --git a/a6fc4_ether.gfx b/data/a6fc4_ether.gfx old mode 100755 new mode 100644 similarity index 100% rename from a6fc4_ether.gfx rename to data/a6fc4_ether.gfx diff --git a/bossicons.4bpp b/data/bossicons.4bpp similarity index 100% rename from bossicons.4bpp rename to data/bossicons.4bpp diff --git a/bsodencode.txt b/data/bsodencode.txt similarity index 100% rename from bsodencode.txt rename to data/bsodencode.txt diff --git a/bsodfont.1bpp b/data/bsodfont.1bpp similarity index 100% rename from bsodfont.1bpp rename to data/bsodfont.1bpp diff --git a/bsodhex.2bpp b/data/bsodhex.2bpp similarity index 100% rename from bsodhex.2bpp rename to data/bsodhex.2bpp diff --git a/c2807_v3.bin b/data/c2807_v3.bin similarity index 100% rename from c2807_v3.bin rename to data/c2807_v3.bin diff --git a/c2807_v3.gfx b/data/c2807_v3.gfx old mode 100755 new mode 100644 similarity index 100% rename from c2807_v3.gfx rename to data/c2807_v3.gfx diff --git a/c2807_v4.bin b/data/c2807_v4.bin similarity index 100% rename from c2807_v4.bin rename to data/c2807_v4.bin diff --git a/c2807_v4.gfx b/data/c2807_v4.gfx similarity index 100% rename from c2807_v4.gfx rename to data/c2807_v4.gfx diff --git a/c2e3e.bin b/data/c2e3e.bin similarity index 100% rename from c2e3e.bin rename to data/c2e3e.bin diff --git a/c2e3e.gfx b/data/c2e3e.gfx similarity index 100% rename from c2e3e.gfx rename to data/c2e3e.gfx diff --git a/credits.txt b/data/credits.txt similarity index 100% rename from credits.txt rename to data/credits.txt diff --git a/data/creditscharmapbighi.txt b/data/creditscharmapbighi.txt index e7f81bc..4ace488 100644 --- a/data/creditscharmapbighi.txt +++ b/data/creditscharmapbighi.txt @@ -35,8 +35,45 @@ W=73 X=74 Y=75 Z=76 -'=77 -.=A0 -/=A2 -:=A3 -_=A6 \ No newline at end of file +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 diff --git a/data/creditscharmapbiglo.txt b/data/creditscharmapbiglo.txt index 6e70494..1d9fc90 100644 --- a/data/creditscharmapbiglo.txt +++ b/data/creditscharmapbiglo.txt @@ -35,8 +35,45 @@ W=99 X=9A Y=9B Z=9C -'=9d -.=C0 -/=C2 -:=C3 -_=C6 \ No newline at end of file +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 diff --git a/creditscharmapsmall_green.txt b/data/creditscharmapsmall_green.txt similarity index 92% rename from creditscharmapsmall_green.txt rename to data/creditscharmapsmall_green.txt index e86db3d..34d1d8e 100644 --- a/creditscharmapsmall_green.txt +++ b/data/creditscharmapsmall_green.txt @@ -24,4 +24,5 @@ V=4D W=4E X=4F Y=50 -Z=51 \ No newline at end of file +Z=51 +.=52 diff --git a/creditscharmapsmall_red.txt b/data/creditscharmapsmall_red.txt similarity index 100% rename from creditscharmapsmall_red.txt rename to data/creditscharmapsmall_red.txt diff --git a/creditscharmapsmall_yellow.txt b/data/creditscharmapsmall_yellow.txt similarity index 83% rename from creditscharmapsmall_yellow.txt rename to data/creditscharmapsmall_yellow.txt index ee3714d..c1c047c 100644 --- a/creditscharmapsmall_yellow.txt +++ b/data/creditscharmapsmall_yellow.txt @@ -24,4 +24,8 @@ V=2F W=30 X=31 Y=32 -Z=33 \ No newline at end of file +Z=33 +,=34 +'=35 +-=36 +.=37 diff --git a/data/customitems.4bpp b/data/customitems.4bpp new file mode 100644 index 0000000..f7584f1 Binary files /dev/null and b/data/customitems.4bpp differ diff --git a/data/customitems.png b/data/customitems.png new file mode 100644 index 0000000..93adf4c Binary files /dev/null and b/data/customitems.png differ diff --git a/damage_table.bin b/data/damage_table.bin similarity index 100% rename from damage_table.bin rename to data/damage_table.bin diff --git a/eventitems.bin b/data/eventitems.bin similarity index 100% rename from eventitems.bin rename to data/eventitems.bin diff --git a/eventitems.gfx b/data/eventitems.gfx similarity index 100% rename from eventitems.gfx rename to data/eventitems.gfx diff --git a/fileselect.chr.gfx b/data/fileselectgfx.2bpp old mode 100755 new mode 100644 similarity index 98% rename from fileselect.chr.gfx rename to data/fileselectgfx.2bpp index 858c3f2..942d55e Binary files a/fileselect.chr.gfx and b/data/fileselectgfx.2bpp differ diff --git a/data/fileselectgfx.png b/data/fileselectgfx.png new file mode 100644 index 0000000..c762d70 Binary files /dev/null and b/data/fileselectgfx.png differ diff --git a/hudpalette.pal b/data/hudpalette.pal similarity index 100% rename from hudpalette.pal rename to data/hudpalette.pal diff --git a/i18n_en.bin b/data/i18n_en.bin similarity index 86% rename from i18n_en.bin rename to data/i18n_en.bin index fbd7ded..e134789 100644 Binary files a/i18n_en.bin and b/data/i18n_en.bin differ diff --git a/ice_bombos.bin b/data/ice_bombos.bin similarity index 100% rename from ice_bombos.bin rename to data/ice_bombos.bin diff --git a/ice_palace_floor.bin b/data/ice_palace_floor.bin similarity index 100% rename from ice_palace_floor.bin rename to data/ice_palace_floor.bin diff --git a/data/kanjireplacements.asm b/data/kanjireplacements.asm new file mode 100644 index 0000000..feeccf4 --- /dev/null +++ b/data/kanjireplacements.asm @@ -0,0 +1,55 @@ +; 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 diff --git a/map_icons.gfx b/data/map_icons.gfx similarity index 100% rename from map_icons.gfx rename to data/map_icons.gfx diff --git a/newfont.bin b/data/newfont.bin similarity index 72% rename from newfont.bin rename to data/newfont.bin index ee9a452..8d6cba4 100644 Binary files a/newfont.bin and b/data/newfont.bin differ diff --git a/newfont_inverted.bin b/data/newfont_inverted.bin similarity index 75% rename from newfont_inverted.bin rename to data/newfont_inverted.bin index 13323ee..0b78c5c 100644 Binary files a/newfont_inverted.bin and b/data/newfont_inverted.bin differ diff --git a/newitems.bin b/data/newitems.bin similarity index 100% rename from newitems.bin rename to data/newitems.bin diff --git a/newitems.gfx b/data/newitems.gfx old mode 100755 new mode 100644 similarity index 100% rename from newitems.gfx rename to data/newitems.gfx diff --git a/newitems.pal b/data/newitems.pal similarity index 100% rename from newitems.pal rename to data/newitems.pal diff --git a/newitems2.bin b/data/newitems2.bin similarity index 100% rename from newitems2.bin rename to data/newitems2.bin diff --git a/newitems2.gfx b/data/newitems2.gfx similarity index 100% rename from newitems2.gfx rename to data/newitems2.gfx diff --git a/data/playernamecharmap.asm b/data/playernamecharmap.asm new file mode 100644 index 0000000..f26c390 --- /dev/null +++ b/data/playernamecharmap.asm @@ -0,0 +1,59 @@ +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 ; ⎵ ⎵ ⎵ ⎵ ⎵ ⎵ diff --git a/data/playernamecharmap.bin b/data/playernamecharmap.bin new file mode 100644 index 0000000..dc8fdfd Binary files /dev/null and b/data/playernamecharmap.bin differ diff --git a/data/playernamestripes_1.bin b/data/playernamestripes_1.bin new file mode 100644 index 0000000..c151bcd Binary files /dev/null and b/data/playernamestripes_1.bin differ diff --git a/data/playernamestripes_2.asm b/data/playernamestripes_2.asm new file mode 100644 index 0000000..8ba38bf --- /dev/null +++ b/data/playernamestripes_2.asm @@ -0,0 +1,72 @@ +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 + diff --git a/data/playernamestripes_2.bin b/data/playernamestripes_2.bin new file mode 100644 index 0000000..0443104 Binary files /dev/null and b/data/playernamestripes_2.bin differ diff --git a/data/playernamestripes_3.asm b/data/playernamestripes_3.asm new file mode 100644 index 0000000..00436f0 --- /dev/null +++ b/data/playernamestripes_3.asm @@ -0,0 +1,72 @@ +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 + diff --git a/data/playernamestripes_4.asm b/data/playernamestripes_4.asm new file mode 100644 index 0000000..a53fbde --- /dev/null +++ b/data/playernamestripes_4.asm @@ -0,0 +1,25 @@ +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 + diff --git a/sheet178.gfx b/data/sheet178.gfx similarity index 100% rename from sheet178.gfx rename to data/sheet178.gfx diff --git a/sheet73.bin b/data/sheet73.bin similarity index 100% rename from sheet73.bin rename to data/sheet73.bin diff --git a/sheet73.gfx b/data/sheet73.gfx similarity index 100% rename from sheet73.gfx rename to data/sheet73.gfx diff --git a/data/smallchars.2bpp b/data/smallchars.2bpp new file mode 100644 index 0000000..8cda2ee Binary files /dev/null and b/data/smallchars.2bpp differ diff --git a/zsnes_pal.bin b/data/zsnes_pal.bin similarity index 100% rename from zsnes_pal.bin rename to data/zsnes_pal.bin diff --git a/zsnes_tilemap.bin b/data/zsnes_tilemap.bin similarity index 100% rename from zsnes_tilemap.bin rename to data/zsnes_tilemap.bin diff --git a/zsnes_tiles.bin b/data/zsnes_tiles.bin similarity index 100% rename from zsnes_tiles.bin rename to data/zsnes_tiles.bin diff --git a/decompresseditemgraphics.asm b/decompresseditemgraphics.asm new file mode 100644 index 0000000..7adfb2a --- /dev/null +++ b/decompresseditemgraphics.asm @@ -0,0 +1,539 @@ +;=================================================================================================== +; 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 $420B + + ADC.w #$0100 + STA.w $2116 + + INX + STX.w $420B + + 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++,Y + STA.w BigDecompressionBuffer++,X + + ORA.w DecompBuffer2++-1,Y + AND.w #$FF00 + STA.b Decomp3BPPScratch + + LDA.w DecompBuffer2+$10+,Y + AND.w #$00FF + TSB.b Decomp3BPPScratch + + XBA + ORA.b Decomp3BPPScratch + STA.w BigDecompressionBuffer+$10++,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 + +;=================================================================================================== + + diff --git a/decryption.asm b/decryption.asm index 71d1a92..5bb3632 100644 --- a/decryption.asm +++ b/decryption.asm @@ -1,13 +1,10 @@ -!CryptoBuffer = "$7F5100" -;!keyBase = "$7F50D0" - ;-------------------------------------------------------------------------------- LoadStaticDecryptionKey: PHB : PHA : PHX : PHY : PHP REP #$30 ; set 16-bit accumulator & index registers LDX.w #StaticDecryptionKey ; Source - LDY.w #!keyBase ; Target + LDY.w #KeyBase ; Target LDA.w #$000F ; Length MVN $307F @@ -23,70 +20,68 @@ RetrieveValueFromEncryptedTable: ;Returns result in A PHX : PHY PHA - LDY $04 : PHY : LDY $06 : PHY : LDY $08 : PHY - LDY $0A : PHY : LDY $0C : PHY : LDY $0E : PHY + LDY.b Scrap04 : PHY : LDY.b Scrap06 : PHY : LDY.b Scrap08 : PHY + LDY.b Scrap0A : PHY : LDY.b Scrap0C : PHY : LDY.b Scrap0E : PHY AND.w #$FFF8 : TAY - LDA [$00], Y : STA.l !CryptoBuffer : INY #2 - LDA [$00], Y : STA.l !CryptoBuffer+2 : INY #2 - LDA [$00], Y : STA.l !CryptoBuffer+4 : INY #2 - LDA [$00], Y : STA.l !CryptoBuffer+6 + LDA.b [$00], Y : STA.l CryptoBuffer : INY #2 + LDA.b [$00], Y : STA.l CryptoBuffer+2 : INY #2 + LDA.b [$00], Y : STA.l CryptoBuffer+4 : INY #2 + LDA.b [$00], Y : STA.l CryptoBuffer+6 - LDA.w #$0002 : STA $04 ;set block size + LDA.w #$0002 : STA.b Scrap04 ;set block size - JSL.l XXTEA_Decode + JSL XXTEA_Decode - PLA : STA $0E : PLA : STA $0C : PLA : STA $0A - PLA : STA $08 : PLA : STA $06 : PLA : STA $04 + PLA : STA.b Scrap0E : PLA : STA.b Scrap0C : PLA : STA.b Scrap0A + PLA : STA.b Scrap08 : PLA : STA.b Scrap06 : PLA : STA.b Scrap04 PLA : AND.w #$0007 : TAX - LDA.l !CryptoBuffer, X + LDA.l CryptoBuffer, X PHA LDA.w #$0000 - STA.l !CryptoBuffer - STA.l !CryptoBuffer+2 - STA.l !CryptoBuffer+4 - STA.l !CryptoBuffer+6 + STA.l CryptoBuffer + STA.l CryptoBuffer+2 + STA.l CryptoBuffer+4 + STA.l CryptoBuffer+6 PLA PLY : PLX RTL ;-------------------------------------------------------------------------------- - -!ChestData = "$01E96C" -!ChestData_Payload = "$1EABC" ; !ChestData+$0150 - +ChestData = $01E96C +ChestDataPayload = $01EABC ; ChestData+$0150 ;-------------------------------------------------------------------------------- GetChestData: LDA.l IsEncrypted : BNE .encrypted - INC $0E : LDX.w #$FFFD ; what we wrote over -JML.l Dungeon_OpenKeyedObject_nextChest + INC.b Scrap0E : LDX.w #$FFFD ; what we wrote over +JML Dungeon_OpenKeyedObject_nextChest .encrypted - INC $0E : LDX.w #$FFFE + INC.b Scrap0E : LDX.w #$FFFE .nextChest INX #2 : CPX.w #$0150 : BEQ .couldntFindChest - LDA !ChestData, X : AND.w #$7FFF : CMP $A0 : BNE .nextChest + LDA.l ChestData, X : AND.w #$7FFF : CMP.b RoomIndex : BNE .nextChest - DEC $0E : BNE .nextChest + DEC.b Scrap0E : BNE .nextChest - LDA $00 : PHA : LDA $02 : PHA + LDA.b Scrap00 : PHA : LDA.b Scrap02 : PHA - LDA.w #!ChestData_Payload : STA $00 - LDA.w #!ChestData_Payload>>16 : STA $02 + LDA.w #ChestDataPayload : STA.b Scrap00 + LDA.w #ChestDataPayload>>16 : STA.b Scrap02 TXA : LSR JSL RetrieveValueFromEncryptedTable - STA $0C + STA.b Scrap0C - PLA : STA $02 : PLA : STA $00 + PLA : STA.b Scrap02 : PLA : STA.b Scrap00 - LDA !ChestData, X : ASL A : BCC .smallChest + LDA.l ChestData, X : ASL A : BCC .smallChest -JML.l Dungeon_OpenKeyedObject_bigChest ;(bank01.asm line #13783) +JML Dungeon_OpenKeyedObject_bigChest ;(bank01.asm line #13783) .smallChest -JML.l Dungeon_OpenKeyedObject_smallChest +JML Dungeon_OpenKeyedObject_smallChest .couldntFindChest -JML.l Dungeon_OpenKeyedObject_couldntFindChest +JML Dungeon_OpenKeyedObject_couldntFindChest ;-------------------------------------------------------------------------------- diff --git a/dialog.asm b/dialog.asm index 67954aa..62c09fa 100644 --- a/dialog.asm +++ b/dialog.asm @@ -2,200 +2,157 @@ ; Dialog Pointer Override ;-------------------------------------------------------------------------------- DialogOverride: - LDA $7F5035 : BEQ .skip - LDA $7F5700, X ; use alternate buffer + LDA.l AltTextFlag : BEQ .skip + LDA.l DialogBuffer, X ; use alternate buffer RTL .skip - LDA $7F1200, X + LDA.l DecompressionBuffer+$1200, X RTL -;-------------------------------------------------------------------------------- -; $7F5035 - Alternate Text Pointer Flag ; 0=Disable -; $7F5036 - Padding Byte (Must be Zero) -; $7F5700 - $7F57FF - Dialog Buffer -;-------------------------------------------------------------------------------- + ResetDialogPointer: - STZ $1CF0 : STZ $1CF1 ; reset decompression buffer - LDA.b #$00 : STA $7F5035 ; zero out the alternate flag - LDA.b #$1C : STA $1CE9 ; thing we wrote over + STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer + LDA.b #$00 : STA.l AltTextFlag ; zero out the alternate flag + LDA.b #$1C : STA.w DelayTimer ; thing we wrote over 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 : ASL : !ADD.l : TAX ; get quote offset *3, move to X -; LDA , X : STA $00 ; write pointer to direct page -; LDA
+1, X : STA $01 -; LDA
+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 #
: STA $00 ; write pointer to direct page -; LDA.b #
>>8 : STA $01 -; LDA.b #
>>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) PHA : PHX : PHY PHP PHB : PHK : PLB SEP #$20 ; set 8-bit accumulator REP #$10 ; set 16-bit index registers - PEI ($00) - LDA $02 : PHA - STZ $1CF0 : STZ $1CF1 ; reset decompression buffer - LDA.b #$01 : STA $7F5035 ; set flag + PEI.b ($00) + LDA.b Scrap02 : PHA + STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer + LDA.b #$01 : STA.l AltTextFlag ; set flag %CopyDialog(
) - PLA : STA $02 + PLA : STA.b Scrap02 REP #$20 - PLA : STA $00 + PLA : STA.b Scrap00 PLB PLP PLY : PLX : PLA endmacro ;-------------------------------------------------------------------------------- macro CopyDialog(address) - LDA.b #
: STA $00 ; write pointer to direct page - LDA.b #
>>8 : STA $01 - LDA.b #
>>16 : STA $02 + LDA.b #
: STA.b Scrap00 ; write pointer to direct page + LDA.b #
>>8 : STA.b Scrap01 + LDA.b #
>>16 : STA.b Scrap02 %CopyDialogIndirect() endmacro ;-------------------------------------------------------------------------------- macro CopyDialogIndirect() - REP #$20 : LDA !OFFSET_POINTER : TAX : LDY.w #$0000 : SEP #$20 ; copy 2-byte offset pointer to X and set Y to 0 + REP #$20 : LDA.l DialogOffsetPointer : TAX : LDY.w #$0000 : SEP #$20 ; copy 2-byte offset pointer to X and set Y to 0 ?loop: - LDA [$00], Y ; load the next character from the pointer - STA !DIALOG_BUFFER, X ; write to the buffer + LDA.b [$00], Y ; load the next character from the pointer + STA.l DialogBuffer, X ; write to the buffer INX : INY CMP.b #$7F : BNE ?loop REP #$20 ; set 16-bit accumulator - TXA : INC : STA !OFFSET_RETURN ; copy out X into - LDA.w #$0000 : STA !OFFSET_POINTER + TXA : INC : STA.l DialogReturnPointer ; copy out X into + LDA.w #$0000 : STA.l DialogOffsetPointer SEP #$20 ; set 8-bit accumulator endmacro ;-------------------------------------------------------------------------------- LoadDialogAddressIndirect: - STZ $1CF0 : STZ $1CF1 ; reset decompression buffer - LDA.b #$01 : STA $7F5035 ; set flag + STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer + LDA.b #$01 : STA.l AltTextFlag ; set flag %CopyDialogIndirect() - ;%LoadDialogAddress(UncleText) RTL ;-------------------------------------------------------------------------------- -!ITEM_TEMPORARY = "$7F5040" FreeDungeonItemNotice: - STA !ITEM_TEMPORARY + STA.w ScratchBufferV - PHA : PHX : PHY - PHP - PHB : PHK : PLB - SEP #$20 ; set 8-bit accumulator - REP #$10 ; set 16-bit index registers - PEI ($00) - LDA $02 : PHA + PHA : PHX : PHY + PHP + PHB : PHK : PLB + SEP #$20 ; set 8-bit accumulator + REP #$10 ; set 16-bit index registers + PEI.b (Scrap00) + LDA.b Scrap02 : PHA + LDA.w ScratchBufferNV : PHA + LDA.w ScratchBufferNV+1 : PHA ;-------------------------------- LDA.l FreeItemText : BNE + : JMP .skip : + - LDA #$00 : STA $7F5010 ; initialize scratch + LDA.b #$00 : STA.w ScratchBufferNV ; initialize scratch LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for general small key - LDA !ITEM_TEMPORARY : CMP.b #$24 : BNE + ; general small key + LDA.w ScratchBufferV : CMP.b #$24 : BNE + ; general small key %CopyDialog(Notice_SmallKeyOf) - LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER + LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer %CopyDialog(Notice_Self) JMP .done + : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for general compass - LDA !ITEM_TEMPORARY : CMP.b #$25 : BNE + ; general compass + LDA.w ScratchBufferV : CMP.b #$25 : BNE + ; general compass %CopyDialog(Notice_CompassOf) - LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER + LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer %CopyDialog(Notice_Self) JMP .done + : LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for general map - LDA !ITEM_TEMPORARY : CMP.b #$33 : BNE + ; general map + LDA.w ScratchBufferV : CMP.b #$33 : BNE + ; general map %CopyDialog(Notice_MapOf) - LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER + LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer %CopyDialog(Notice_Self) JMP .done + : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for general big key - LDA !ITEM_TEMPORARY : CMP.b #$32 : BNE + ; general big key + LDA.w ScratchBufferV : CMP.b #$32 : BNE + ; general big key %CopyDialog(Notice_BigKeyOf) - LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER + LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer %CopyDialog(Notice_Self) JMP .done + LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for dungeon map - LDA !ITEM_TEMPORARY : AND.b #$F0 ; looking at high bits only + LDA.w ScratchBufferV : AND.b #$F0 ; looking at high bits only CMP.b #$70 : BNE + ; map of... %CopyDialog(Notice_MapOf) JMP .dungeon + : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for dungeon compass - LDA !ITEM_TEMPORARY : AND.b #$F0 : CMP.b #$80 : BNE + ; compass of... + LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$80 : BNE + ; compass of... %CopyDialog(Notice_CompassOf) JMP .dungeon + : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for dungeon big key - LDA !ITEM_TEMPORARY : AND.b #$F0 : CMP.b #$90 : BNE + ; big key of... + LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$90 : BNE + ; big key of... %CopyDialog(Notice_BigKeyOf) - BRA .dungeon + JMP .dungeon + : LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for dungeon small key - LDA !ITEM_TEMPORARY : AND.b #$F0 : CMP.b #$A0 : BNE + ; small key of... - LDA !ITEM_TEMPORARY : CMP.b #$AF : BNE ++ : JMP .skip : ++ + LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$A0 : BNE + ; small key of... + LDA.w ScratchBufferV : CMP.b #$AF : BNE ++ : JMP .skip : ++ %CopyDialog(Notice_SmallKeyOf) - PLA : AND.b #$0F : STA $7F5020 : LDA.b #$0F : !SUB $7F5020 : PHA - LDA #$01 : STA $7F5010 ; set up a flip for small keys + LDA.b #$01 : STA.w ScratchBufferNV ; set up a flip for small keys BRA .dungeon - + + + : LDA.l FreeItemText : AND.b #$20 : BEQ + ; show message for crystal + LDA.w ScratchBufferV : CMP.b #$B0 : !BLT + ; crystal # + CMP.b #$B7 : !BGE + + %CopyDialog(Notice_Crystal) + JMP .crystal + + JMP .skip ; it's not something we are going to give a notice for .dungeon - LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER - LDA !ITEM_TEMPORARY - AND.b #$0F ; looking at low bits only - STA $7F5011 - LDA $7F5010 : BEQ + - LDA $7F5010 - LDA #$0F : !SUB $7F5011 : STA $7F5011 ; flip the values for small keys + LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer + LDA.w ScratchBufferV + AND.b #$0F + STA.w ScratchBufferNV+1 + LDA.w ScratchBufferNV : BEQ + + LDA.w ScratchBufferNV + LDA.b #$0F : !SUB.w ScratchBufferNV+1 : STA.w ScratchBufferNV+1 ; flip the values for small keys + - LDA $7F5011 + LDA.w ScratchBufferNV+1 + 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.w .done + + + SEP #$20 + LDA.w ScratchBufferNV+1 CMP.b #$00 : BNE + ; ...light world %CopyDialog(Notice_LightWorld) : JMP .done + : CMP.b #$01 : BNE + ; ...dark world @@ -223,38 +180,61 @@ FreeDungeonItemNotice: + : CMP.b #$0C : BNE + ; ...desert palace %CopyDialog(Notice_Desert) : JMP .done + : CMP.b #$0D : BNE + ; ...eastern palace - %CopyDialog(Notice_Eastern) : BRA .done + %CopyDialog(Notice_Eastern) : JMP .done + : CMP.b #$0E : BNE + ; ...hyrule castle - %CopyDialog(Notice_Castle) : BRA .done + %CopyDialog(Notice_Castle) : JMP .done + : CMP.b #$0F : BNE + ; ...sewers %CopyDialog(Notice_Sewers) + + JMP .done + + .crystal + LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer + LDA.w 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 - STZ $1CF0 : STZ $1CF1 ; reset decompression buffer - LDA.b #$01 : STA $7F5035 ; set alternate dialog flag - STA $7F509F + STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer + LDA.b #$01 : STA.l AltTextFlag ; set alternate dialog flag + STA.l TextBoxDefer ;-------------------------------- .skip - PLA : STA $02 - REP #$20 - PLA : STA $00 - PLB - PLP - PLY : PLX : PLA - ;JSL.l Main_ShowTextMessage_Alt ; .skip can be here so long as this line remains commented out + PLA : STA.w ScratchBufferNV+1 + PLA : STA.w ScratchBufferNV + PLA : STA.b Scrap02 + REP #$20 + PLA : STA.b Scrap00 + PLB + PLP + PLY : PLX : PLA RTL ;-------------------------------------------------------------------------------- DialogResetSelectionIndex: - JSL.l Attract_DecompressStoryGfx ; what we wrote over - STZ $1CE8 + JSL Attract_DecompressStoryGfx ; what we wrote over + STZ.w MessageCursor RTL ;-------------------------------------------------------------------------------- DialogItemReceive: BCS .nomessage ; if doubling the item value overflowed it must be a rando item - CPY #$98 : BCC ++ ;if the item is $4C or greater it must be a rando item + CPY.b #$98 : BCC ++ ;if the item is $4C or greater it must be a rando item .nomessage LDA.w #$FFFF @@ -267,11 +247,11 @@ RTL ;-------------------------------------------------------------------------------- DialogFairyThrow: LDA.l Restrict_Ponds : BEQ .normal - LDA BottleContentsOne - ORA BottleContentsTwo : ORA BottleContentsThree : ORA BottleContentsFour : BNE .normal + LDA.l BottleContentsOne + ORA.l BottleContentsTwo : ORA.l BottleContentsThree : ORA.l BottleContentsFour : BNE .normal .noInventory - LDA $0D80, X : !ADD #$08 : STA $0D80, X + LDA.w SpriteActivity, X : !ADD #$08 : STA.w SpriteActivity, X LDA.b #$51 LDY.b #$01 RTL @@ -281,14 +261,14 @@ RTL RTL ;-------------------------------------------------------------------------------- DialogGanon1: - JSL.l CheckGanonVulnerability + JSL CheckGanonVulnerability REP #$20 LDA.w #$018C BCC + LDA.w #$016D -+ STA $1CF0 ++ STA.w TextID SEP #$20 - JSL.l Sprite_ShowMessageMinimal_Alt + JSL Sprite_ShowMessageMinimal_Alt RTL ;-------------------------------------------------------------------------------- ; #$0192 - no bow @@ -300,44 +280,44 @@ RTL ; s = silver arrow bow ; p = 2nd progressive bow DialogGanon2: - JSL.l CheckGanonVulnerability - - REP #$20 - BCS + + JSL CheckGanonVulnerability + + REP #$20 + BCS + LDA.w #$018D : BRA ++ - + - LDA.l BowTracking + + + LDA.l BowTracking BIT.w #$0080 : BNE + ; branch if bow LDA.w #$0192 : BRA ++ - + + + BIT.w #$0040 : BEQ + ; branch if no silvers LDA.w #$0195 : BRA ++ - + + + BIT.w #$0020 : BNE + ; branch if p bow LDA.w #$0194 : BRA ++ - + + + BIT.w #$0080 : BEQ + ; branch if no bow LDA.w #$0193 : BRA ++ - + + + LDA.w #$016E - ++ - STA $1CF0 - SEP #$20 - JSL.l Sprite_ShowMessageMinimal_Alt + ++ + STA.w TextID + SEP #$20 + JSL Sprite_ShowMessageMinimal_Alt RTL ;-------------------------------------------------------------------------------- DialogEtherTablet: PHA - LDA $0202 : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped + LDA.w ItemCursor : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped - PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text + - BIT $F4 : BVC - ; Show normal text if Y is not pressed + BIT.b Joy1A_New : BVC - ; Show normal text if Y is not pressed LDA.l AllowHammerTablets : BEQ ++ - LDA HammerEquipment : BEQ .yesText : BRA .noText + LDA.l HammerEquipment : BEQ .yesText : BRA .noText ++ - LDA SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : BCS .noText + LDA.l SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : BCS .noText ;++ .yesText PLA @@ -351,15 +331,15 @@ RTL ;-------------------------------------------------------------------------------- DialogBombosTablet: PHA - LDA $0202 : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped + LDA.w ItemCursor : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped - PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text + - BIT $F4 : BVC - ; Show normal text if Y is not pressed + BIT.b Joy1A_New : BVC - ; Show normal text if Y is not pressed LDA.l AllowHammerTablets : BEQ ++ - LDA HammerEquipment : BEQ .yesText : BRA .noText + LDA.l HammerEquipment : BEQ .yesText : BRA .noText ++ - LDA SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : !BGE .noText + LDA.l SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : !BGE .noText ;++ .yesText PLA @@ -372,7 +352,7 @@ DialogBombosTablet: RTL ;-------------------------------------------------------------------------------- DialogSahasrahla: - LDA.l PendantsField : AND #$04 : BEQ + ;Check if player has green pendant + LDA.l PendantsField : AND.b #$04 : BEQ + ;Check if player has green pendant LDA.b #$2F LDY.b #$00 JML Sprite_ShowMessageUnconditional @@ -381,17 +361,17 @@ RTL ;-------------------------------------------------------------------------------- DialogBombShopGuy: LDY.b #$15 - LDA.l CrystalsField : AND #$05 : CMP #$05 : BNE + ;Check if player has crystals 5 & 6 + LDA.l CrystalsField : AND.b #$05 : CMP.b #$05 : BNE + ;Check if player has crystals 5 & 6 INY ; from 15 to 16 + TYA LDY.b #$01 - JSL.l Sprite_ShowMessageUnconditional + JSL Sprite_ShowMessageUnconditional RTL ;--------------------------------------------------------------------------------------------------- AgahnimAsksAboutPed: - LDA.l InvincibleGanon + LDA.l GanonVulnerableMode CMP.b #$06 : BNE .vanilla LDA.l OverworldEventDataWRAM+$80 ; check ped flag @@ -399,54 +379,54 @@ AgahnimAsksAboutPed: BNE .vanilla LDA.b #$8C ; message 018C for no ped - STA.w $1CF0 + STA.w TextID .vanilla - JML $05FA8E ; Sprite_ShowMessageMinimal + JML Sprite_ShowMessageMinimal ;-------------------------------------------------------------------------------- Main_ShowTextMessage_Alt: ; Are we in text mode? If so then end the routine. - LDA $10 : CMP.b #$0E : BEQ .already_in_text_mode + LDA.b GameMode : CMP.b #$0E : BEQ .already_in_text_mode Sprite_ShowMessageMinimal_Alt: - STZ $11 + STZ.b GameSubMode PHX : PHY - PEI ($00) - LDA.b $02 : PHA + PEI.b (Scrap00) + LDA.b Scrap02 : PHA - LDA.b #$1C : STA.b $02 + LDA.b #$1C : STA.b Scrap02 REP #$30 - LDA.w $1CF0 : ASL : TAX + LDA.w TextID : ASL : TAX LDA.l $7F71C0, X - STA.b $00 + STA.b Scrap00 SEP #$30 LDY.b #$00 - LDA [$00], Y : CMP.b #$FE : BNE + - INY : LDA [$00], Y : CMP.b #$6E : BNE + - INY : LDA [$00], Y : : BNE + - INY : LDA [$00], Y : CMP.b #$FE : BNE + - INY : LDA [$00], Y : CMP.b #$6B : BNE + - INY : LDA [$00], Y : CMP.b #$04 : BNE + - STZ $1CE8 + LDA.b [Scrap00], Y : CMP.b #$FE : BNE + + INY : LDA.b [Scrap00], Y : CMP.b #$6E : BNE + + INY : LDA.b [Scrap00], Y : : BNE + + INY : LDA.b [Scrap00], Y : CMP.b #$FE : BNE + + INY : LDA.b [Scrap00], Y : CMP.b #$6B : BNE + + INY : LDA.b [Scrap00], Y : CMP.b #$04 : BNE + + STZ.w MessageCursor JMP .end + - STZ $0223 ; Otherwise set it so we are in text mode. - STZ $1CD8 ; Initialize the step in the submodule + STZ.w MessageJunk ; Otherwise set it so we are in text mode. + STZ.w MessageSubModule ; Go to text display mode (as opposed to maps, etc) - LDA.b #$02 : STA $11 + LDA.b #$02 : STA.b GameSubMode ; Store the current module in the temporary location. - LDA $10 : STA $010C + LDA.b GameMode : STA.w GameModeCache ; Switch the main module ($10) to text mode. - LDA.b #$0E : STA $10 + LDA.b #$0E : STA.b GameMode .end - PLA : STA.b $02 - PLA : STA.b $01 - PLA : STA.b $00 + PLA : STA.b Scrap02 + PLA : STA.b Scrap01 + PLA : STA.b Scrap00 PLY : PLX Main_ShowTextMessage_Alt_already_in_text_mode: @@ -458,15 +438,15 @@ CalculateSignIndex: ; And we do this in a way that will likely give the right value even ; with major glitches. - LDA $8A : ASL A : TAY ;what we wrote over + LDA.b OverworldIndex : ASL A : TAY ;what we wrote over - LDA $0712 : BEQ .done ; If a small map, we can skip these calculations. + LDA.w OWScreenSize : BEQ .done ; If a small map, we can skip these calculations. - LDA $21 : AND.w #$0002 : ASL #2 : EOR $8A : AND.w #$0008 : BEQ + + LDA.b LinkPosY+1 : AND.w #$0002 : ASL #2 : EOR.b OverworldIndex : AND.w #$0008 : BEQ + TYA : !ADD.w #$0010 : TAY ;add 16 if we are in lower half of big screen. + - LDA $23 : AND.w #$0002 : LSR : EOR $8A : AND.w #$0001 : BEQ + + LDA.b LinkPosX+1 : AND.w #$0002 : LSR : EOR.b OverworldIndex : AND.w #$0001 : BEQ + 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: @@ -475,6 +455,112 @@ CalculateSignIndex: .done 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 ; AA - C3 - A - Z diff --git a/doorframefixes.asm b/doorframefixes.asm index a5ecb3d..0012cf3 100644 --- a/doorframefixes.asm +++ b/doorframefixes.asm @@ -7,8 +7,8 @@ ;-------------------------------------------------------------------------------- StoreLastOverworldDoorID: TXA : INC - STA $7F5099 - LDA $1BBB73, X : STA $010E + STA.l PreviousOverworldDoor + LDA.l Overworld_Entrance_ID, X : STA.w EntranceIndex RTL ;-------------------------------------------------------------------------------- @@ -16,14 +16,14 @@ RTL ; CacheDoorFrameData ;-------------------------------------------------------------------------------- CacheDoorFrameData: - LDA $7F5099 : BEQ .originalBehaviour + LDA.l PreviousOverworldDoor : BEQ .originalBehaviour DEC : ASL : TAX - LDA EntranceDoorFrameTable, X : STA $0696 - LDA EntranceAltDoorFrameTable, X : STA $0698 + LDA.l EntranceDoorFrameTable, X : STA.w TileMapEntranceDoors + LDA.l EntranceAltDoorFrameTable, X : STA.w TileMapTile32 BRA .done .originalBehaviour - LDA $D724, X : STA $0696 - STZ $0698 + LDA.w $D724, X : STA.w TileMapEntranceDoors + STZ.w TileMapTile32 .done RTL ;-------------------------------------------------------------------------------- @@ -32,9 +32,9 @@ RTL ; WalkDownIntoTavern ;-------------------------------------------------------------------------------- WalkDownIntoTavern: - LDA $7F5099 + LDA.l PreviousOverworldDoor ; tavern door has index 0x42 (saved off value is incremented by one) - CMP #$43 + CMP.b #$43 RTL ;-------------------------------------------------------------------------------- @@ -42,49 +42,49 @@ RTL ; TurnAroundOnUnderworld ;-------------------------------------------------------------------------------- TurnAroundOnUnderworld: - LDA $26 : BEQ .done + LDA.b LinkPushDirection : BEQ .done ; turn around if ($010E == #$43) != ($7F5099 == #$43) - LDX #$00 - LDA #$43 : CMP $010E : BEQ + + LDX.b #$00 + LDA.b #$43 : CMP.w EntranceIndex : BEQ + INX + - CMP $7F5099 : BEQ + + CMP.l PreviousOverworldDoor : BEQ + DEX + - CPX #$00 : BEQ .done - LDA $26 : EOR #$0C : STA $26 + CPX.b #$00 : BEQ .done + LDA.b LinkPushDirection : EOR.b #$0C : STA.b LinkPushDirection .done -JML $0FFD65 ; what we overwrote +JML Underworld_LoadCustomTileAttributes ; what we overwrote ;-------------------------------------------------------------------------------- ; TurnUpOnOverworld ;-------------------------------------------------------------------------------- TurnUpOnOverworld: - LDA.l EntranceTavernBack : CMP #$43 : BEQ .done - LDA #$08 : STA $26 ; only fix this glitch if exit not vanilla + LDA.l EntranceTavernBack : CMP.b #$43 : BEQ .done + LDA.b #$08 : STA.b LinkPushDirection ; only fix this glitch if exit not vanilla .done -JML $07E68F ; what we overwrote +JML Link_HandleMovingAnimation_FullLongEntry ; what we overwrote ;-------------------------------------------------------------------------------- ; WalkUpOnOverworld ;-------------------------------------------------------------------------------- WalkUpOnOverworld: - LDA $20 : CMP #$091B : BNE .normal ; hardcoded Y coordinate - STZ $2F + LDA.b LinkPosY : CMP.w #$091B : BNE .normal ; hardcoded Y coordinate + STZ.b LinkDirection RTL .normal - LDA #$0002 : STA $2F ; what we overwrote + LDA.w #$0002 : STA.b LinkDirection ; what we overwrote RTL ;-------------------------------------------------------------------------------- ; CheckStairsAdjustment ;-------------------------------------------------------------------------------- CheckStairsAdjustment: - LDA.b $A0 + 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 $0696 ; tavern back ($0696 == #$FFFF) should always have carry cleared + CMP.w TileMapEntranceDoors ; tavern back ($0696 == #$FFFF) should always have carry cleared .done RTL ; if carry cleared, shift position up \ No newline at end of file diff --git a/doorrando/bugfix/kholdstare_shell_collision.asm b/doorrando/bugfix/kholdstare_shell_collision.asm index cfbf7a4..6fb4f9c 100644 --- a/doorrando/bugfix/kholdstare_shell_collision.asm +++ b/doorrando/bugfix/kholdstare_shell_collision.asm @@ -13,31 +13,31 @@ pullpc CheckKholdShellCoordinates: -LDA.w $0D30, X +LDA.w SpritePosXHigh, X XBA -LDA.w $0D10, X ; full 16 bit X coordinate of sprite +LDA.w SpritePosXLow, X ; full 16 bit X coordinate of sprite -REP #$21 +REP #$21 ; carry is guaranteed clear SBC.w #$0020 -CMP.b $22 +CMP.b LinkPosX BCS .not_colliding -ADC.w #$0040 -CMP.b $22 +ADC.w #$0040 ; carry is guaranteed clear +CMP.b LinkPosX BCC .not_colliding SEP #$20 -LDA.w $0D20, X +LDA.w SpritePosYHigh, X XBA -LDA.w $0D00, X ; full 16 bit Y coordinate of sprite +LDA.w SpritePosYLow, X ; full 16 bit Y coordinate of sprite -REP #$21 -SBC.w #$001F ; could go to 27 and let link squeeze in at Lanmo 2 (please adjust the following one) -CMP.b $20 +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 -CMP.b $20 +ADC.w #$0037 ; carry is guaranteed clear +CMP.b LinkPosY BCC .not_colliding SEP #$20 ; collision detected diff --git a/doorrando/doortables.asm b/doorrando/doortables.asm index 1ae843a..63005e9 100644 --- a/doorrando/doortables.asm +++ b/doorrando/doortables.asm @@ -593,8 +593,9 @@ 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 -ChestKeys: ;27f030 -db $01, $01, $00, $01, $02, $01, $06, $03, $03, $02, $01, $01, $04, $04, $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 diff --git a/doorrando/dr_lobby.asm b/doorrando/dr_lobby.asm index 69411e1..ca67410 100644 --- a/doorrando/dr_lobby.asm +++ b/doorrando/dr_lobby.asm @@ -1,14 +1,14 @@ CheckDarkWorldSpawn: PHP - STA $A0 : STA $048E ; what we wrote over + STA.b RoomIndex : STA.w RoomIndexMirror ; what we wrote over JSL SetDefaultWorld - LDA.l LinksHouseDarkWorld : CMP.b $A0 : BEQ ++ - LDA.l SanctuaryDarkWorld : CMP.b $A0 : BEQ ++ - LDA.l OldManDarkWorld : CMP.b $A0 : BNE + - ++ SEP #$20 : LDA CurrentWorld : EOR.b #$40 : STA CurrentWorld - LDA.l DRFlags+1 : AND #$02 : BEQ + ; skip if the flag isn't set + LDA.l LinksHouseDarkWorld : CMP.b RoomIndex : BEQ ++ + LDA.l SanctuaryDarkWorld : CMP.b RoomIndex : BEQ ++ + LDA.l OldManDarkWorld : CMP.b RoomIndex : BNE + + ++ SEP #$20 : LDA.l CurrentWorld : EOR.b #$40 : STA.l CurrentWorld + LDA.l DRFlags+1 : AND.b #$02 : BEQ + ; skip if the flag isn't set LDA.l MoonPearlEquipment : BNE + ; moon pearl? - LDA #$17 : STA $5D : INC $02E0 + LDA #$17 : STA.b LinkState : INC.w BunnyFlag + PLP : RTL SetDefaultWorld: diff --git a/doorrando/drhooks.asm b/doorrando/drhooks.asm index ac189a5..5466607 100644 --- a/doorrando/drhooks.asm +++ b/doorrando/drhooks.asm @@ -67,7 +67,7 @@ jsl QuadrantLoadOrderAfterScroll org $82895d ; Bank 02 line 1812 (JSL Dungeon_LoadRoom : JSL Dungeon_InitStarTileChr : JSL $00D6F9 : INC $B0) Splicer: jsl GfxFixer -lda $b1 : beq .done +lda.b $b1 : beq .done rts nop #5 .done @@ -98,7 +98,7 @@ org $8ffd65 ;(PC: 07fd65) Dungeon_LoadCustomTileAttr: org $81feb0 Dungeon_ApproachFixedColor: -;org $01fec1 +;org $81fec1 ;Dungeon_ApproachFixedColor_variable: ;org $a0f972 ; Rando version ;LoadRoomHook: @@ -120,7 +120,7 @@ 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 $0dd0, X : rts +nop : stz.w SpriteAITable, X : rts .not_in_ganons_tower @@ -136,7 +136,7 @@ jsl EGFixOnMirror org $82b82a jsl FixShopCode -org $9ddeea ; <- Bank1D.asm : 286 (JSL Sprite_LoadProperties) +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 @@ -169,8 +169,8 @@ jsl CutoffEntranceRug : bra .nextTile : nop 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 : NOP +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 @@ -188,7 +188,7 @@ Main_ShowTextMessage: ; Conditionally disable UW music changes in Door Rando org $828ADB ; <- Bank02.asm:2088-2095 (LDX.b #$14 : LDA $A0 ...) -JSL.l Underworld_DoorDown_Entry : CPX #$FF +JSL Underworld_DoorDown_Entry : CPX #$FF BEQ + : db $80, $1C ; BRA $028B04 NOP #6 : + @@ -219,7 +219,7 @@ JSL AlwaysPushThroughFDoors ; Modified from OWR - will need to remove once merged ; org $85AF75 ; Sprite_6C_MirrorPortal: -; JSL FixOvalFadeOutMirror : NOP #2 ; LDA $7EF3CA : BNE $05AFDF +; JSL FixOvalFadeOutMirror : NOP #2 ; LDA $7EF3CA : BNE $85AFDF ; org $85AFDF ; Sprite_6C_MirrorPortal_missing_mirror: diff --git a/doorrando/edges.asm b/doorrando/edges.asm index 62290ac..6016b93 100644 --- a/doorrando/edges.asm +++ b/doorrando/edges.asm @@ -2,12 +2,12 @@ ; Ram usage HorzEdge: - cpy #$ff : beq + - jsr DetectWestEdge : ldy #$02 : bra ++ + cpy.b #$ff : beq + + jsr DetectWestEdge : ldy.b #$02 : bra ++ + jsr DetectEastEdge ++ cmp #$ff : beq + - sta $00 : asl : !add $00 : tax - cpy #$ff : beq ++ + sta.b Scrap00 : asl : !add.b Scrap00 : tax + cpy.b #$ff : beq ++ jsr LoadWestData : bra .main ++ jsr LoadEastData .main @@ -16,12 +16,12 @@ HorzEdge: + clc : rts VertEdge: - cpy #$ff : beq + + cpy.b #$ff : beq + jsr DetectNorthEdge : bra ++ + jsr DetectSouthEdge - ++ cmp #$ff : beq + - sta $00 : asl : !add $00 : tax - cpy #$ff : beq ++ + ++ cmp.b #$ff : beq + + sta.b Scrap00 : asl : !add.b Scrap00 : tax + cpy.b #$ff : beq ++ jsr LoadNorthData : bra .main ++ jsr LoadSouthData .main @@ -30,20 +30,20 @@ VertEdge: + clc : rts LoadEdgeRoomHorz: - lda $03 : sta $a0 - sty $06 - and.b #$0f : asl a : !sub $23 : !add $06 : sta $02 + 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 #$00 : jsr ShiftVariablesMainDir - lda $04 : and #$80 : bne .edge - lda $04 : sta $01 ; load up flags in $01 + 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 $04 : and #$10 : beq + - lda #$01 - + sta $ee ; layer stuff + lda.b Scrap04 : and.b #$10 : beq + + lda.b #$01 + + sta.b LinkLayer ; layer stuff jsr MathHorz @@ -52,14 +52,14 @@ LoadEdgeRoomHorz: rts LoadEdgeRoomVert: - lda $03 : sta $a0 - sty $06 - and.b #$f0 : lsr #3 : !sub $21 : !add $06 : sta $02 + 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 $04 : and #$80 : bne .edge - lda $04 : sta $01 ; load up flags in $01 - and #$03 : cmp #$03 : beq .inroom - ldy #$01 : jsr ShiftVariablesMainDir + 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 @@ -68,13 +68,13 @@ LoadEdgeRoomVert: rts .edge - ldy #$01 : jsr ShiftVariablesMainDir - lda $04 : and #$10 : beq + - lda #$01 - + sta $ee ; layer stuff + ldy.b #$01 : jsr ShiftVariablesMainDir + lda.b Scrap04 : and.b #$10 : beq + + lda.b #$01 + + sta.b LinkLayer ; layer stuff jsr MathVert - lda $03 + lda.b Scrap03 .scroll jsr ScrollX @@ -82,220 +82,220 @@ LoadEdgeRoomVert: MathHorz: - jsr MathStart : lda $20 - jsr MathMid : and #$0040 + jsr MathStart : lda.b LinkPosY + jsr MathMid : and.w #$0040 jsr MathEnd rts MathVert: - jsr MathStart : lda $22 - jsr MathMid : and #$0020 + jsr MathStart : lda.b LinkPosX + jsr MathMid : and.w #$0020 jsr MathEnd rts MathStart: rep #$30 - lda $08 : and #$00ff : sta $00 + lda.b Scrap08 : and.w #$00ff : sta.b Scrap00 rts MathMid: - and #$01ff : !sub $00 : and #$00ff : sta $00 + and.w #$01ff : !sub.b Scrap00 : and.w #$00ff : sta.b Scrap00 ; nothing should be bigger than $a0 at this point - lda $05 : and #$00f0 : lsr #4 : tax - lda MultDivInfo, x : and #$00ff : tay - lda $00 : jsr MultiplyByY : sta $02 + 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 $07 : and #$00ff : jsr MultiplyByY : tax + lda.b Scrap07 : and.w #$00ff : jsr MultiplyByY : tax - lda $05 : and #$000f : tay - lda MultDivInfo, y : and #$00ff : tay - lda $02 : jsr DivideByY : sta $00 - lda $0c : and #$00ff : sta $02 - lda $04 + 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 #$0100 - + !add $02 : !add $00 - sta $04 + 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 NorthOpenEdge, x : sta $03 : inx ; target room - lda NorthEdgeInfo, x : sta $07 ; needed for maths - (divide by 2 anyway) - lda NorthOpenEdge, x : sta $04 : inx ; bit field - lda NorthEdgeInfo, x : sta $08 ; needed for maths - lda NorthOpenEdge, x : sta $05 ; ratio - lda $04 : jsr LoadSouthMidpoint : inx ; needed now, and for nrml transition - lda SouthEdgeInfo, x : sta $0b : inx ; probably not needed todo: remove - lda SouthEdgeInfo, x : sta $0c ; needed for maths + 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 #$0f : sta $00 : asl : !add $00 : tax - lda SouthEdgeInfo, x : sta $0a ; needed now, and for nrml transition + 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 SouthOpenEdge, x : sta $03 : inx - lda SouthEdgeInfo, x : sta $07 - lda SouthOpenEdge, x : sta $04 : inx - lda SouthEdgeInfo, x : sta $08 - lda SouthOpenEdge, x : sta $05 - lda $04 : jsr LoadNorthMidpoint : inx - lda NorthEdgeInfo, x : sta $0b : inx - lda NorthEdgeInfo, x : sta $0c + 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 #$0f : sta $00 : asl : !add $00 : tax - lda NorthEdgeInfo, x : sta $0a ; needed now, and for nrml transition + 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 WestOpenEdge, x : sta $03 : inx - lda WestEdgeInfo, x : sta $07 - lda WestOpenEdge, x : sta $04 : inx - lda WestEdgeInfo, x : sta $08 - lda WestOpenEdge, x : sta $05 - lda $04 : jsr LoadEastMidpoint : inx - lda EastEdgeInfo, x : sta $0b : inx - lda EastEdgeInfo, x : sta $0c + 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 #$0f : sta $00 : asl : !add $00 : tax - lda EastEdgeInfo, x : sta $0a ; needed now, and for nrml transition + 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 EastOpenEdge, x : sta $03 : inx - lda EastEdgeInfo, x : sta $07 - lda EastOpenEdge, x : sta $04 : inx - lda EastEdgeInfo, x : sta $08 - lda EastOpenEdge, x : sta $05 - lda $04 : jsr LoadWestMidpoint : inx - lda WestEdgeInfo, x : sta $0b : inx - lda WestEdgeInfo, x : sta $0c + 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 #$0f : sta $00 : asl : !add $00 : tax - lda WestEdgeInfo, x : sta $0a ; needed now, and for nrml transition + 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 #$ff - lda $a2 - cmp #$82 : bne + - lda $22 : cmp #$50 : bcs ++ - ldx #$01 : bra .end - ++ ldx #$00 : bra .end - + cmp #$83 : bne + - ldx #$02 : bra .end - + cmp #$84 : bne + - lda $a9 : beq ++ - lda $22 : cmp #$78 : bcs +++ - ldx #$04 : bra .end - +++ ldx #$05 : bra .end - ++ lda $22 : cmp #$78 : bcs ++ - ldx #$03 : bra .end - ++ ldx #$04 : bra .end - + cmp #$85 : bne + - ldx #$06 : bra .end - + cmp #$db : bne + - lda $a9 : beq ++ - lda $22 : beq ++ - ldx #$08 : bra .end - ++ ldx #$07 : bra .end - + cmp #$dc : bne .end - lda $a9 : bne ++ - lda $22 : cmp #$b0 : bcs ++ - ldx #$09 : bra .end - ++ ldx #$0a + 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 #$ff - lda $a2 - cmp #$72 : bne + - lda $22 : cmp #$50 : bcs ++ - ldx #$01 : bra .end - ++ ldx #$00 : bra .end - + cmp #$73 : bne + - ldx #$02 : bra .end - + cmp #$74 : bne + - lda $a9 : beq ++ - lda $22 : cmp #$78 : bcs +++ - ldx #$04 : bra .end - +++ ldx #$05 : bra .end - ++ lda $22 : cmp #$78 : bcs ++ - ldx #$03 : bra .end - ++ ldx #$04 : bra .end - + cmp #$75 : bne + - ldx #$06 : bra .end - + cmp #$cb : bne + - lda $a9 : beq ++ - lda $22 : beq ++ - ldx #$08 : bra .end - ++ ldx #$07 : bra .end - + cmp #$cc : bne .end - lda $a9 : bne ++ - lda $22 : cmp #$b0 : bcs ++ - ldx #$09 : bra .end - ++ ldx #$0a + 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 #$ff - lda $a2 - cmp #$65 : bne + - ldx #$00 : bra .end - + cmp #$74 : bne + - ldx #$01 : bra .end - + cmp #$75 : bne + - ldx #$02 : bra .end - + cmp #$82 : bne + - lda $aa : beq ++ - ldx #$03 : bra .end - ++ ldx #$04 : bra .end - + cmp #$85 : bne + - ldx #$05 : bra .end - + cmp #$cc : bne + - lda $aa : beq ++ - ldx #$06 : bra .end - ++ ldx #$07 : bra .end - + cmp #$dc : bne .end - ldx #$08 + 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 #$ff - lda $a2 - cmp #$64 : bne + - ldx #$00 : bra .end - + cmp #$73 : bne + - ldx #$01 : bra .end - + cmp #$74 : bne + - ldx #$02 : bra .end - + cmp #$81 : bne + - lda $aa : beq ++ - ldx #$04 : bra .end - ++ ldx #$03 : bra .end - + cmp #$84 : bne + + 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 #$05 : bra .end - + cmp #$cb : bne + - lda $aa : beq ++ - ldx #$06 : bra .end - ++ ldx #$07 : bra .end - + cmp #$db : bne .end - ldx #$08 + + 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: diff --git a/doorrando/entrance_fixes.asm b/doorrando/entrance_fixes.asm index 1f540e9..8bab17c 100644 --- a/doorrando/entrance_fixes.asm +++ b/doorrando/entrance_fixes.asm @@ -20,10 +20,10 @@ ;=================================================================================================== pushpc -org $01B0E6 +org $81B0E6 JSL StoreDoorInfo -org $01892F +org $81892F DoorDrawJankMove: JML PrepDoorDraw @@ -33,12 +33,12 @@ DoorDrawJankMove: ; we don't want to overwrite the JMP ($000E) that's already there ; Well, we could, but we don't need to -warnpc $018939 +warnpc $818939 -org $01BF43 +org $81BF43 JSL AdjustEscapeDoorCollision -org $01C132 ; ADC.w #$0040 : TAX : LDA.b $00 +org $81C132 ; ADC.w #$0040 : TAX : LDA.b $00 JSL AdjustEscapeDoorCollision_LowEntrance : NOP #2 pullpc @@ -59,18 +59,18 @@ PrepDoorDraw: ; 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 $00 + LDA.b Scrap00 STA.w $19EE ; for current routine ; copy vanilla code (but fast rom) LDA.l $8186F0,X - STA.b $0E + STA.b Scrap0E - LDX.b $02 - LDA.b $04 + LDX.b Scrap02 + LDA.b Scrap04 ; and to execute the jump, we'll use the JMP ($000E) we carefully avoided overwriting - JML.l $818939 + JML $818939 ;=================================================================================================== @@ -106,20 +106,20 @@ AdjustEscapeDoorGraphics: ; row 1 LDA.w #$8838 - STA.l $7E2000+$080,X + STA.l TileMapA+$080,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$086,X + STA.l TileMapA+$086,X ; row 2 LDA.w #$8828 - STA.l $7E2000+$100,X + STA.l TileMapA+$100,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$106,X + STA.l TileMapA+$106,X LDA.w #$8829 - STA.l $7E2000+$102,X + STA.l TileMapA+$102,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$104,X + STA.l TileMapA+$104,X JSR IdentifySwampEntrance BCS .fix_swamp_entrance_alternate @@ -134,26 +134,26 @@ AdjustEscapeDoorGraphics: ; row 0 LDA.w #$14C4 - STA.l $7E2000+$000,X ; sanity check = should calculate to 7e3bbc + STA.l TileMapA+$000,X ; sanity check = should calculate to 7e3bbc ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$006,X + STA.l TileMapA+$006,X LDA.w #$14C5 - STA.l $7E2000+$002,X + STA.l TileMapA+$002,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$004,X + STA.l TileMapA+$004,X ; row 1 LDA.w #$14E8 - STA.l $7E2000+$082,X + STA.l TileMapA+$082,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$084,X + STA.l TileMapA+$084,X ; row 2 LDA.w #$14F8 - STA.l $7E2000+$102,X + STA.l TileMapA+$102,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$104,X + STA.l TileMapA+$104,X RTL .fix_swamp_entrance @@ -162,56 +162,56 @@ AdjustEscapeDoorGraphics: ; row 1 - outer section LDA.w #$0908 - STA.l $7E2000+$080,X + STA.l TileMapA+$080,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$086,X + STA.l TileMapA+$086,X ; row 2 LDA.w #$0918 - STA.l $7E2000+$100,X + STA.l TileMapA+$100,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$106,X + STA.l TileMapA+$106,X LDA.w #$14F8 - STA.l $7E2000+$102,X + STA.l TileMapA+$102,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$104,X + STA.l TileMapA+$104,X .fix_swamp_entrance_alternate ; row 0 LDA.w #$9DFC - STA.l $7E2000+$000,X - STA.l $7E2000+$002,X - STA.l $7E2000+$004,X - STA.l $7E2000+$006,X + 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 $7E2000+$082,X + STA.l TileMapA+$082,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$084,X + STA.l TileMapA+$084,X ; row 3 LDA.w #$A82C - STA.l $7E2000+$180,X + STA.l TileMapA+$180,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$186,X + STA.l TileMapA+$186,X LDA.w #$A82D - STA.l $7E2000+$182,X + STA.l TileMapA+$182,X ORA.w #$4000 ; horizontally flip - STA.l $7E2000+$184,X + STA.l TileMapA+$184,X RTL IdentifySancEntrance: - LDA.b $A0 : CMP.w #$0012 : BNE + - LDA.b $0A : CMP.w #$0010 : BNE + + LDA.b RoomIndex : CMP.w #$0012 : BNE + + LDA.b Scrap0A : CMP.w #$0010 : BNE + SEC : RTS + CLC : RTS IdentifySwampEntrance: - LDA.b $A0 : CMP.w #$0036 : BNE + - LDA.b $0A : CMP.w #$0010 : BNE + + LDA.b RoomIndex : CMP.w #$0036 : BNE + + LDA.b Scrap0A : CMP.w #$0010 : BNE + SEC : RTS + CLC : RTS @@ -250,7 +250,7 @@ AdjustEscapeDoorCollisionShared: BCS .block_entrance ; vanilla value - LDA.b $00 + LDA.b Scrap00 RTL @@ -274,21 +274,21 @@ 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 $A0 : CMP.w #$0012 : BNE + + 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 $0A + 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 #$FFFE + LDX.w #$FFFE - INX #2 LDA.l RemoveRainDoorsRoom, X : CMP.w #$FFFF : BEQ .leave_alone - CMP $A0 : BNE - + CMP.b RoomIndex : BNE - LDA.l RainDoorMatch, X CMP.w $19EE : BNE .leave_alone BRA .block_door diff --git a/doorrando/gfx.asm b/doorrando/gfx.asm index 08ae228..483da5c 100644 --- a/doorrando/gfx.asm +++ b/doorrando/gfx.asm @@ -4,60 +4,60 @@ GfxFixer: jsl LoadRoomHook ;this is the code we overwrote jsl Dungeon_InitStarTileCh jsl LoadTransAuxGfx_Alt - inc $b0 + inc.b SubSubModule rtl - + lda $b1 : bne .stage2 + + 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 #$02 : bne + ; only do this in crossed mode - ldx $a0 : lda.l TilesetTable, x - cmp $0aa1 : beq + ; already eq no need to decomp - sta $0aa1 - tax : lda $02802e, x : tay + 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 #$09 : sta $17 : sta $0710 + lda.b #$09 : sta.b NMIINCR : sta.w SkipOAM jsl Palette_SpriteAux3 jsl Palette_SpriteAux2 jsl Palette_SpriteAux1 jsl Palette_DungBgMain jsr CgramAuxToMain - inc $b1 + inc.b $b1 rtl .stage2 - lda #$0a : sta $17 : sta $0710 - stz $b1 : inc $b0 + lda.b #$0a : sta.b NMIINCR : sta.w SkipOAM + stz.b $b1 : inc.b SubSubModule rtl } FixAnimatedTiles: - LDA.L DRMode : CMP #$02 : BNE + - LDA $040C : CMP.b #$FF : BEQ + + LDA.l DRMode : CMP.b #$02 : BNE + + LDA.w DungeonID : CMP.b #$FF : BEQ + PHX - LDX $A0 : LDA.l TilesetTable, x - CMP $0AA1 : beq ++ + LDX.b RoomIndex : LDA.l TilesetTable, x + CMP.w $0AA1 : beq ++ TAX : PLA : BRA + ++ PLX - + LDA $02802E, X ; what we wrote over + + LDA.l AnimatedTileSheets, X ; what we wrote over RTL FixCloseDungeonMap: - LDA.l DRMode : CMP #$02 : BNE .vanilla - LDA $040C : BMI .vanilla + LDA.l DRMode : CMP.b #$02 : BNE .vanilla + LDA.w DungeonID : BMI .vanilla LSR : TAX LDA.l DungeonTilesets,x RTL .vanilla - LDA $7EC20E + LDA.l $7EC20E RTL FixWallmasterLamp: -ORA $0458 -STY $1C : STA $1D : RTL ; what we wrote over +ORA.w $0458 +STY.b MAINDESQ : STA.b SUBDESQ : RTL ; what we wrote over CgramAuxToMain: ; ripped this from bank02 because it ended with rts @@ -66,36 +66,36 @@ CgramAuxToMain: ; ripped this from bank02 because it ended with rts ldx.b #$00 .loop - lda $7EC300, X : sta $7EC500, x - lda $7EC340, x : sta $7EC540, x - lda $7EC380, x : sta $7EC580, x - lda $7EC3C0, x : sta $7EC5C0, x - lda $7EC400, x : sta $7EC600, x - lda $7EC440, x : sta $7EC640, x - lda $7EC480, x : sta $7EC680, x - lda $7EC4C0, x : sta $7EC6C0, x + 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 $15 + inc.b NMICGRAM rts } OverridePaletteHeader: - lda.l DRMode : cmp #$02 : bne + - lda.l DRFlags : and #$20 : bne + - cpx #$01c2 : !bge + + 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 [$0D], Y ; what we wrote over + + rep #$20 : iny : lda.b [Scrap0D], Y ; what we wrote over rtl Sprite_ConditionalPrepOAMCoord: - LDA.w $0E20,X : CMP.b #$62 : BNE .notMasterSword + LDA.w SpriteTypeTable,X : CMP.b #$62 : BNE .notMasterSword LDA.w $0D90,X : BNE .specialCutscene .notMasterSword JML Sprite_PrepOAMCoordLong ; what we wrote over diff --git a/doorrando/hudadditions.asm b/doorrando/hudadditions.asm index 362b389..1d88ff6 100644 --- a/doorrando/hudadditions.asm +++ b/doorrando/hudadditions.asm @@ -1,80 +1,103 @@ +!BlankTile = $207F +!SlashTile = $2830 +!HyphenTile = $2405 +!PTile = $296C +!CTile = $295F +!LTile = $2D68 +!DTile = $2D60 +!RedSquare = $345E +!BlueSquare = $2C5E + DrHudOverride: -{ - jsl.l NewDrawHud - jsr HudAdditions - rtl -} + PHB + SEP #$30 + LDA.b #$7E + PHA + PLB -HudAdditions: -{ - SEP #$10 - LDA.l DRFlags : AND #$0008 : BNE + : JMP .end_item_count : + - LDA.l TotalItemCounter : PHA : CMP #1000 : !BLT + - JSL HexToDec4Digit_fast - LDX.b $04 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS ; draw 1000's digit - BRA .skip - + JSL HexToDec_fast - .skip - LDA #$207F : STA !GOAL_DRAW_ADDRESS+2 : STA !GOAL_DRAW_ADDRESS+4 - LDA.b 1,S : CMP.w #100 : !BLT + - LDX.b $05 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+2 ; draw 100's digit - + PLA : CMP.w #10 : !BLT + - LDX.b $06 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+4 ; draw 10's digit - + LDX.b $07 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+6 ; draw 1's digit - LDA.w #$2830 : STA !GOAL_DRAW_ADDRESS+8 ; draw slash - LDA.l DRFlags : AND #$0100 : BNE + - LDA.l MultiClientFlagsWRAM+1 : CMP #1000 : !BLT .three_digit_goal - JSL HexToDec4Digit_fast - LDX.b $04 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+10 ; draw 1000's digit - LDX.b $05 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+12 ; draw 100's digit - LDX.b $06 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+14 ; draw 10's digit - LDX.b $07 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+16 ; draw 1's digit - BRA .end_item_count - .three_digit_goal - JSL HexToDec_fast - LDX.b $05 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+10 ; draw 100's digit - LDX.b $06 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+12 ; draw 10's digit - LDX.b $07 : TXA : ORA.w #$2490 : STA !GOAL_DRAW_ADDRESS+14 ; draw 1's digit - BRA .end_item_count - + LDA.w #$2405 : STA !GOAL_DRAW_ADDRESS+10 : STA !GOAL_DRAW_ADDRESS+12 - STA !GOAL_DRAW_ADDRESS+14 : STA !GOAL_DRAW_ADDRESS+16 - .end_item_count +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 - LDX $1B : BNE + ; if outdoors - lda.l OWMode : and.w #((!FLAG_OW_CROSSED+!FLAG_OW_MIXED)<<8)+$ff : bne ++ : rts ; Skip if vanilla ow rando - ++ lda CurrentHealth : and #$00ff : beq ++ - lda CurrentWorld : and #$00ff : beq +++ - lda #$2d60 : bra .owdisplay - +++ lda #$2d68 : bra .owdisplay - ++ lda #$207f - .owdisplay sta $7ec702 : rts - + ldx $040c : cpx #$ff : bne + : rts : + ; Skip if not in dungeon - lda.l DRMode : bne + : rts : + ; Skip if not door rando - phb : phk : plb - lda CompassField : and.l $0098c0, x : beq + - lda.w CompassBossIndicator, x : and #$00ff : cmp $a0 : bne + - lda $1a : and #$0010 : beq + - lda #$345e : sta $7ec790 : bra .next - + lda #$207f : sta $7ec790 - .next lda.w DRMode : and #$0002 : bne + : plb : rts : + - lda CurrentHealth : and #$00ff : beq + - lda.w DungeonReminderTable, x : bra .reminder - + lda #$207f - .reminder sta $7ec702 - + lda.w DRFlags : and #$0004 : beq .restore - lda MapField : and.l $0098c0, x : beq .restore - txa : lsr : tax +DRHUD_DrawIndicators: + LDA.b IndoorsFlag : BNE .continue + JMP OWRHUD_DrawWorldIndicator +.continue + LDA.b FrameCounter : AND.b #$10 : BEQ DRHUD_EnemyDropIndicator - lda.l GenericKeys : and #$00ff : bne + - lda DungeonCollectedKeys, x : jsr ConvertToDisplay : sta $7ec7a2 - lda #$2830 : sta $7ec7a4 - + - lda.w ChestKeys, x : jsr ConvertToDisplay : sta $7ec7a6 - ; todo 4b0 no longer in use +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 - .restore - plb : rts -} + 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.l DRFlags : BIT.w #$0800 : BEQ + + 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 + JMP DRHUD_Finished + +OWRHUD_DrawWorldIndicator: + LDA.l OWMode+1 : AND.b #(!FLAG_OW_CROSSED+!FLAG_OW_MIXED) : BEQ DRHUD_Finished + REP #$10 + LDY.w #!BlankTile + LDA.w CurrentHealth : BEQ .draw_indicator + LDA.w CurrentWorld : BEQ + + LDY.w #!DTile : BRA .draw_indicator + + LDY.w #!LTile +.draw_indicator + STY.w HUDCurrentDungeonWorld ; uses same slot as DR Dungeon Indicator + +DRHUD_Finished: + PLB : RTL + +;=================================================================================================== ;column distance for BK/Smalls HudOffsets: @@ -92,96 +115,94 @@ dw $0000, $0000, $0000, $0000, $000a, $000a, $000a, $0014, $000a, $0014, $0000, DrHudDungeonItemsAdditions: { jsl DrawHUDDungeonItems - lda.l HUDDungeonItems : and #$ff : bne + : rtl : + - lda.l DRMode : cmp #$02 : beq + : rtl : + + 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 $1606 : sta $1610 : sta $161a : sta $1624 - sta $1644 : sta $164a : sta $1652 : sta $1662 : sta $1684 : sta $16c4 - ldx #$0000 - - sta $1704, x : sta $170e, x : sta $1718, x - inx #2 : cpx #$0008 : !blt - + 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 HudFlag : and.w #$0020 : beq + : JMP ++ : + - lda HUDDungeonItems : and.w #$0007 : bne + : JMP ++ : + + lda.l HudFlag : and.w #$0020 : beq + : JMP ++ : + + lda.l HUDDungeonItems : and.w #$0007 : bne + : JMP ++ : + ; bk symbols - lda.w #$2811 : sta $1606 : sta $1610 : sta $161a : sta $1624 + lda.w #$2811 : sta.w $1606 : sta.w $1610 : sta.w $161a : sta.w $1624 ; sm symbols - lda.w #$2810 : sta $160a : sta $1614 : sta $161e : sta $16e4 + lda.w #$2810 : sta.w $160a : sta.w $1614 : sta.w $161e : sta.w $16e4 ; blank out stuff - lda.w #$24f5 : sta $1724 + lda.w #$24f5 : sta.w $1724 - ldx #$0002 - - lda #$0000 : !addl RowOffsets,x : !addl ColumnOffsets, x : tay - lda.l DungeonReminderTable, x : sta $1644, y : iny #2 - lda.w #$24f5 : sta $1644, y - lda MapField : and.l $0098c0, x : beq + ; must have map - jsr BkStatus : sta $1644, y : bra .smallKey ; big key status - + lda BigKeyField : and.l $0098c0, x : beq .smallKey - lda.w #$2826 : sta $1644, y + ldx.w #$0002 + - lda.w #$0000 : !addl RowOffsets,x : !addl 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 #$001a : bne + - tya : !add #$003c : tay - + stx $00 + cpx.w #$001a : bne + + tya : !add.w #$003c : tay + + stx.b Scrap00 txa : lsr : tax - lda.w #$24f5 : sta $1644, y - lda.l GenericKeys : and #$00FF : bne + - lda.l DungeonKeys, x : and #$00FF : beq + - jsr ConvertToDisplay2 : sta $1644, y - + iny #2 : lda.w #$24f5 : sta $1644, y - phx : ldx $00 - lda MapField : and.l $0098c0, x : beq + ; must have map - plx : sep #$30 : lda.l ChestKeys, x : sta $02 + 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 $02 : !sub DungeonCollectedKeys, x : sta $02 - +++ lda $02 + lda.b Scrap02 : !sub.l DungeonCollectedKeys, x : sta.b Scrap02 + +++ lda.b Scrap02 rep #$30 - jsr ConvertToDisplay2 : sta $1644, y ; small key totals + jsr ConvertToDisplay2 : sta.w $1644, y ; small key totals bra .skipStack + plx .skipStack iny #2 - cpx #$000d : beq + - lda.w #$24f5 : sta $1644, y + cpx.w #$000d : beq + + lda.w #$24f5 : sta.w $1644, y + - ldx $00 - + inx #2 : cpx #$001b : bcs ++ : JMP - + ldx.b Scrap00 + + inx #2 : cpx.w #$001b : bcs ++ : JMP - ++ - lda HudFlag : and.w #$0020 : bne + : JMP ++ : + - lda HUDDungeonItems : and.w #$000c : bne + : 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 $1606 : sta $1610 : sta $161a : sta $1624 + 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 $16e4 : sta $1724 - sta $160a : sta $1614 : sta $161e ; blank out sm key indicators - ldx #$0002 - - lda #$0000 ; start of hud area + 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 !addl RowOffsets, x : !addl ColumnOffsets, x : tay - lda.l DungeonReminderTable, x : sta $1644, y + lda.l DungeonReminderTable, x : sta.w $1644, y iny #2 - lda.w #$24f5 : sta $1644, y ; blank out map spot - lda MapField : and.l $0098c0, x : beq + ; must have map - JSR MapIndicatorShort : STA $1644, Y + 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 #$001a : bne + - tya : !add #$003c : tay - + lda CompassField : and.l $0098c0, x : beq + ; must have compass + cpx.w #$001a : bne + + tya : !add.w #$003c : tay + + lda.l CompassField : and.l DungeonMask, x : beq + ; must have compass phx ; total chest counts - txa : lsr : tax - sep #$30 - lda.l TotalLocations, x : !sub DungeonLocationsChecked, x : JSR HudHexToDec2DigitCopy - rep #$30 - lda $06 : jsr ConvertToDisplay2 : sta $1644, y : iny #2 - lda $07 : jsr ConvertToDisplay2 : sta $1644, y + 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 $1644, y : iny #2 : sta $1644, y + + lda.w #$24f5 : sta.w $1644, y : iny #2 : sta.w $1644, y .skipBlanks iny #2 - cpx #$001a : beq + - lda.w #$24f5 : sta $1644, y ; blank out spot - + inx #2 : cpx #$001b : !bge ++ : JMP - + 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 } @@ -208,72 +229,35 @@ IndicatorCharacters: dw $2426, $2817, $2818, $2819, $281A, $281B, $281C, $281D, $2590, $258B, $259B MapIndicator: - LDA.l CrystalPendantFlags_3, X : AND #$00FF + LDA.l CrystalPendantFlags_3, X : AND.w #$00FF PHX ASL : TAX : LDA.l IndicatorCharacters, X PLX RTS BkStatus: - lda BigKeyField : and.l $0098c0, x : bne +++ ; has the bk already + lda.l BigKeyField : and.l DungeonMask, x : bne +++ ; has the bk already lda.l BigKeyStatus, x : bne ++ - lda #$2827 : rts ; 0/O for no BK - ++ cmp #$0002 : bne + - lda #$2420 : rts ; symbol for BnC - + lda #$24f5 : rts ; black otherwise - +++ lda #$2826 : rts ; check mark + 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 #$000a : !blt + - !add #$2553 : rts - + !add #$2490 : rts + and.w #$00ff : cmp.w #$000a : !blt + + !add.w #$2553 : rts + + !add.w #$2490 : rts ConvertToDisplay2: and.w #$00ff : beq ++ - cmp #$000a : !blt + - !add #$2553 : rts ; 2580 with 258A as "A" for non transparent digits - + !add #$2816 : rts - ++ lda #$2827 : rts ; 0/O for 0 or placeholder digit ;2483 + 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: - jsl IncrementSmallKeysNoPrimary : phx - lda $040c : cmp #$ff : beq + - lsr : tax - lda DungeonAbsorbedKeys, x : inc : sta DungeonAbsorbedKeys, x - + plx : rtl - -;================================================================================ -; 16-bit A, 8-bit X -; in: A(b) - Byte to Convert -; out: $04 - $07 (high - low) -;================================================================================ -HudHexToDec4DigitCopy: - LDY.b #$90 - - - CMP.w #1000 : !BLT + - INY - SBC.w #1000 : BRA - - + - STY $04 : LDY #$90 ; Store 1000s digit & reset Y - - - CMP.w #100 : !BLT + - INY - SBC.w #100 : BRA - - + - STY $05 : LDY #$90 ; Store 100s digit & reset Y - - - CMP.w #10 : !BLT + - INY - SBC.w #10 : BRA - - + - STY $06 : LDY #$90 ; Store 10s digit & reset Y - CMP.w #1 : !BLT + - - - INY - DEC : BNE - - + - STY $07 ; Store 1s digit -RTS + JML IncrementSmallKeysNoPrimary ;================================================================================ ; 8-bit registers @@ -288,12 +272,12 @@ HudHexToDec2DigitCopy: ; modified INY SBC.b #10 : BRA - + - STY $06 : LDY #$00 ; Store 10s digit and reset Y + STY.b Scrap06 : LDY.b #$00 ; Store 10s digit and reset Y CMP.b #1 : !BLT + - INY DEC : BNE - + - STY $07 ; Store 1s digit + STY.b Scrap07 ; Store 1s digit PLY RTS diff --git a/doorrando/keydoors.asm b/doorrando/keydoors.asm index 3f6c051..8be4b06 100644 --- a/doorrando/keydoors.asm +++ b/doorrando/keydoors.asm @@ -13,24 +13,24 @@ CheckIfDoorsOpen: { jsr TrapDoorFixer ; see normal.asm ; note we are 16bit mode right now lda.l DRMode : beq + - lda $040c : cmp #$00ff : bne .gtg - + lda $a0 : dec : tax : and #$000f ; hijacked code + 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 $00 : ldy #$0000 + stx.b Scrap00 : ldy.w #$0000 .nextDoor - lda $a0 : asl : tax + lda.b RoomIndex : asl : tax lda.w KeyDoorOffset, x : beq .skipDoor - asl : sty $05 : !add $05 : tax + asl : sty.b Scrap05 : !add.b Scrap05 : tax lda.w PairedDoorTable, x : beq .skipDoor - sta $02 : and #$00ff : asl a : tax - lda $02 : and #$ff00 : sta $03 - lda RoomDataWRAM.l, X : and #$f000 : and $03 : beq .skipDoor - tyx : lda $068c : ora $0098c0,x : sta $068c + sta.b Scrap02 : and.w #$00ff : asl a : tax + lda.b Scrap02 : and.w #$ff00 : sta.b Scrap03 + lda 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 $00 : bne .nextDoor + iny #2 : cpy.b Scrap00 : bne .nextDoor plb : clc : rtl } diff --git a/doorrando/math.asm b/doorrando/math.asm index 03cd46a..a2ba83f 100644 --- a/doorrando/math.asm +++ b/doorrando/math.asm @@ -7,60 +7,60 @@ ;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 #$0001 : beq .done -cpy #$0003 : bne ++ +.loop cpy.w #$0001 : beq .done +cpy.w #$0003 : bne ++ jsr MultiBy3 : bra .done -++ cpy #$0005 : bne ++ +++ cpy.w #$0005 : bne ++ jsr MultiBy5 : bra .done -++ asl : sta $00 : tya : lsr : tay : lda $00 : bra .loop +++ 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 #$0000 : beq .done -cpy #$0001 : beq .done -cpy #$0003 : bne ++ +cpy.w #$0000 : beq .done +cpy.w #$0001 : beq .done +cpy.w #$0003 : bne ++ jsr DivideBy3 : bra .done -++ cpy #$0005 : bne ++ +++ cpy.w #$0005 : bne ++ jsr DivideBy5 : bra .done -++ jsr DivideBy2 : sta $00 +++ jsr DivideBy2 : sta.b Scrap00 tya : lsr : tay txa : lsr : tax -lda $00 : bra .loop +lda.b Scrap00 : bra .loop .done rts MultiBy3: -sta $00 : asl : !add $00 +sta.b Scrap00 : asl : !add.b Scrap00 rts MultiBy5: -sta $00 : asl #2 : !add $00 +sta.b Scrap00 : asl #2 : !add.b Scrap00 rts ;width of divison in x: rounds toward X/2 DivideBy2: -sta $00 +sta.b Scrap00 lsr : bcc .done -sta $02 : txa : lsr : cmp $00 : !blt + - lda $02 : inc : bra .done -+ lda $02 +sta.b Scrap02 : txa : lsr : cmp.b Scrap00 : !blt + + lda.b Scrap02 : inc : bra .done ++ lda.b Scrap02 .done rts DivideBy3: -sta $00 -ldx #$0000 -lda #$0002 -.loop cmp $00 : !bge .store - inx : !add #$0003 : bra .loop +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 $00 -ldx #$0000 -lda #$0003 -.loop cmp $00 : !bge .store - inx : !add #$0005 : bra .loop +sta.b Scrap00 +ldx.w #$0000 +lda.w #$0003 +.loop cmp.b Scrap00 : !bge .store + inx : !add.w #$0005 : bra .loop .store txa rts \ No newline at end of file diff --git a/doorrando/normal.asm b/doorrando/normal.asm index 6fcb7e5..3523f7a 100644 --- a/doorrando/normal.asm +++ b/doorrando/normal.asm @@ -1,9 +1,9 @@ WarpLeft: lda.l DRMode : beq .end JSR CheckIfCave : BCS .end - lda $20 : ldx $aa + lda.b LinkPosY : ldx.b LinkQuadrantV jsr CalcIndex - !add #$06 : ldy #$01 ; offsets in A, Y + !add.b #$06 : ldy.b #$01 ; offsets in A, Y jsr LoadRoomHorz .end jsr Cleanup @@ -12,9 +12,9 @@ WarpLeft: WarpRight: lda.l DRMode : beq .end JSR CheckIfCave : BCS .end - lda $20 : ldx $aa + lda.b LinkPosY : ldx.b LinkQuadrantV jsr CalcIndex - !add #$12 : ldy #$ff ; offsets in A, Y + !add.b #$12 : ldy.b #$ff ; offsets in A, Y jsr LoadRoomHorz .end jsr Cleanup @@ -23,9 +23,9 @@ WarpRight: WarpUp: lda.l DRMode : beq .end JSR CheckIfCave : BCS .end - lda $22 : ldx $a9 + lda.b LinkPosX : ldx.b LinkQuadrantH jsr CalcIndex - ldy #$02 ; offsets in A, Y + ldy.b #$02 ; offsets in A, Y jsr LoadRoomVert .end jsr Cleanup @@ -33,17 +33,17 @@ WarpUp: ; Checks if $a0 is equal to . If it is, opens its stonewall if it's there macro StonewallCheck(Room) - lda $a0 : cmp.b # : bne ?end - lda.l *2+$7ef000 : ora #$80 : sta.l *2+$7ef000 + lda.b RoomIndex : cmp.b # : bne ?end + lda.l *2+$7ef000 : ora.b #$80 : sta.l *2+$7ef000 ?end endmacro WarpDown: lda.l DRMode : beq .end JSR CheckIfCave : BCS .end - lda $22 : ldx $a9 + lda.b LinkPosX : ldx.b LinkQuadrantH jsr CalcIndex - !add #$0c : ldy #$ff ; offsets in A, Y + !add.b #$0c : ldy.b #$ff ; offsets in A, Y jsr LoadRoomVert %StonewallCheck($43) .end @@ -54,35 +54,35 @@ WarpDown: ; carry clear = we are in dr mode, never use linking doors CheckLinkDoorR: lda.l DRMode : bne + - lda $7ec004 : sta $a0 ; what we wrote over + lda.l $7ec004 : sta.b RoomIndex ; what we wrote over sec : rtl + clc : rtl CheckLinkDoorL: lda.l DRMode : bne + - lda $7ec003 : sta $a0 ; what we wrote over + lda.l $7ec003 : sta.b RoomIndex ; what we wrote over sec : rtl + clc : rtl TrapDoorFixer: - lda $fe : and #$0038 : beq .end - xba : asl #2 : sta $00 - stz $0468 : lda $068c : ora $00 : sta $068c + lda.b $fe : and #$0038 : beq .end + xba : asl #2 : sta.b Scrap00 + stz.w $0468 : lda.w $068c : ora.b Scrap00 : sta.w $068c .end - stz $fe ; clear our fe here because we don't need it anymore + stz.b $fe ; clear our fe here because we don't need it anymore rts Cleanup: - lda.l DRFlags : and #$10 : beq + - stz $047a - + inc $11 - lda $ef + 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 $A2 : CMP.w #$00E1 : BCS .invalid + LDA.b PreviousRoom : CMP.w #$00E1 : BCS .invalid SEP #$30 : CLC : RTS .invalid SEP #$30 : SEC : RTS @@ -92,11 +92,11 @@ CheckIfCave: 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 #$01 : bra .done ; Middle Door - .smallDoor lda #$00 : bra .done - .largeDoor lda #$02 + lda.b #$01 : bra .done ; Middle Door + .smallDoor lda.b #$00 : bra .done + .largeDoor lda.b #$02 .done - sta $04 + sta.b Scrap04 asl rts @@ -105,30 +105,30 @@ CalcIndex: ; A->low byte of Link's Coord, X-> Link's quadrant, DoorOffset x 2 -> LoadRoomHorz: { phb : phk : plb - sty $06 : sta $07 : lda $a0 : pha ; Store normal room on stack - lda $07 : jsr LookupNewRoom ; New room is in A, Room Data is in $00-$01 - lda $00 : cmp #$03 : bne .gtg + 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 $a0 : bra .end ; Restore normal room, abort (straight staircases and open edges can get in this routine) + 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 $a0 : and.b #$0F : asl a : !sub $23 : !add $06 : sta $02 - ldy #$00 : jsr ShiftVariablesMainDir + lda.b RoomIndex : and.b #$0F : asl a : !sub.b LinkPosX+1 : !add.b Scrap06 : sta.b Scrap02 + ldy.b #$00 : jsr ShiftVariablesMainDir - lda $01 : and #$80 : beq .normal - ldy $06 : cpy #$ff : beq + - lda $01 : jsr LoadEastMidpoint : bra ++ - + lda $01 : jsr LoadWestMidpoint + 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 $01 : and #$40 : pha + lda.b Scrap01 : and.b #$40 : pha jsr ScrollY pla : beq .end - ldy #$06 : jsr ApplyScroll + ldy.b #$06 : jsr ApplyScroll .end plb ; restore db register rts @@ -139,32 +139,32 @@ LoadRoomHorz: LoadRoomVert: { phb : phk : plb - sty $06 : sta $07 : lda $a0 : pha ; Store normal room on stack - lda $07 : jsr LookupNewRoom ; New room is in A, Room Data is in $00-$01 - lda $00 : cmp #$03 : bne .gtg + 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 $a0 : bra .end ; Restore normal room, abort (straight staircases and open edges can get in this routine) + 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 $a0 : and.b #$F0 : lsr #3 : !sub $21 : !add $06 : sta $02 + lda.b RoomIndex : and.b #$F0 : lsr #3 : !sub.b LinkPosY+1 : !add.b Scrap06 : sta.b Scrap02 - lda $01 : and #$80 : beq .notEdge - ldy #$01 : jsr ShiftVariablesMainDir - ldy $06 : cpy #$ff : beq + - lda $01 : jsr LoadSouthMidpoint : bra ++ - + lda $01 : jsr LoadNorthMidpoint + 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 $01 : and #$03 : cmp #$03 : bne .normal + lda.b Scrap01 : and.b #$03 : cmp.b #$03 : bne .normal jsr ScrollToInroomStairs - stz $046d + stz.w $046d bra .end .normal - ldy #$01 : jsr ShiftVariablesMainDir + ldy.b #$01 : jsr ShiftVariablesMainDir jsr PrepScrollToNormal .scroll - lda $01 : and #$40 : sta $046d + lda.b Scrap01 : and.b #$40 : sta.w $046d jsr ScrollX .end plb ; restore db register @@ -174,13 +174,13 @@ LoadRoomVert: LookupNewRoom: ; expects data offset to be in A { rep #$30 : and #$00FF ;sanitize A reg (who knows what is in the high byte) - sta $00 ; offset in 00 - lda $a2 : tax ; probably okay loading $a3 in the high byte - lda.w DoorOffset,x : and #$00FF ;we only want the low byte - asl #3 : sta $02 : !add $02 : !add $02 ;multiply by 24 (data size) - !add $00 ; should now have the offset of the address I want to load - tax : lda.w DoorTable,x : sta $00 - and #$00FF : sta $a0 ; assign new room + 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 } @@ -190,14 +190,14 @@ LookupNewRoom: ; expects data offset to be in A ShiftVariablesMainDir: { lda.w CoordIndex,y : tax - lda $21,x : !add $02 : sta $21,x ; coordinate update + lda.b LinkPosY+1,x : !add.b Scrap02 : sta.b LinkPosY+1,x ; coordinate update lda.w CameraIndex,y : tax - lda $e3,x : !add $02 : sta $e3,x ; scroll register high byte + lda.b $e3,x : !add.b Scrap02 : sta.b $e3,x ; scroll register high byte lda.w CamQuadIndex,y : tax - lda $0605,x : !add $02 : sta $0605,x ; high bytes of these guys - lda $0607,x : !add $02 : sta $0607,x - lda $0601,x : !add $02 : sta $0601,x - lda $0603,x : !add $02 : sta $0603,x + 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 } @@ -205,12 +205,12 @@ ShiftVariablesMainDir: ScrollToInroomStairs: { jsr PrepScrollToInroomStairs - ldy #$01 : jsr ShiftVariablesMainDir + ldy.b #$01 : jsr ShiftVariablesMainDir jsr ScrollX - ldy #$00 : jsr ApplyScroll - lda $a0 : and #$0f : cmp #$0f : bne + - stz $e0 : stz $e2 ; special case camera fix - lda #$1f : sta $e1 : sta $e3 + 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 } @@ -219,48 +219,48 @@ ScrollToInroomStairs: ; Sets $02, $04, $05, $ee, $045e, $045f and things related to Y coordinate PrepScrollToInroomStairs: { - lda $01 : and #$30 : lsr #3 : tay - lda.w InroomStairsX,y : sta $04 - lda.w InroomStairsX+1,y : sta $05 - lda $06 : cmp #$ff : beq .south + 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 $045f ; flag indicating special screen transition - dec $02 ; shift variables further - stz $aa - lda $a8 : and #%11111101 : sta $a8 - stz $0613 ; North scroll target - inc $0603 : inc $0607 - dec $0619 : dec $061b + 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 #$20 : sta $20 - !sub #$38 : sta $045e - lda $01 : and #$40 : beq + - lda $20 : !add #$20 : sta $20 - stz $045f + 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 $21 + dec.b LinkPosY+1 %StonewallCheck($1b) bra ++ .south lda.w InroomStairsY+1,y : beq + - inc $045f ; flag indicating special screen transition - inc $02 ; shift variables further - lda #$02 : sta $aa - lda $a8 : ora #%00000010 : sta $a8 - inc $0611 ; South scroll target - dec $0603 : dec $0607 - inc $0619 : inc $061b + 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 #$20 : sta $20 - !add #$38 : sta $045e - lda $01 : and #$40 : beq + - lda $20 : !sub #$20 : sta $20 - stz $045f + 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 $21 + inc.b LinkPosY+1 ++ - lda $01 : and #$04 : lsr #2 : sta $ee : bne + - stz $0476 + lda.b Scrap01 : and.b #$04 : lsr #2 : sta.b LinkLayer : bne + + stz.w $0476 + rts } @@ -268,13 +268,13 @@ PrepScrollToInroomStairs: ; Sets $04 $05 and $ee PrepScrollToEdge: { - sta $04 : lda $01 : and #$20 : beq + - lda #01 - + sta $05 - lda $01 : and #$10 : beq + - lda #01 - + sta $ee : bne + - stz $0476 + 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 } @@ -282,56 +282,56 @@ PrepScrollToEdge: ; Sets $04 $05 and $ee, and $fe PrepScrollToNormal: { - lda $01 : sta $fe : and #$04 : lsr #2 : sta $ee ; trap door and layer + lda.b Scrap01 : sta.b $fe : and.b #$04 : lsr #2 : sta.b LinkLayer ; trap door and layer bne + - stz $0476 - + stz $05 : lda #$78 : sta $04 - lda $01 : and #$03 : beq .end - cmp #$02 : !bge + - lda #$f8 : sta $04 : bra .end - + inc $05 + 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 $0464 : sty $012e ; what we wrote over + stx.w $0464 : sty.w SFX2 ; what we wrote over lda.l DRMode : beq + - lda $045e : bne .toInroom - lda $046d : beq .noScroll - sta $22 - ldy #$00 : jsr ApplyScroll - stz $046d + 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 $11 : cmp #$12 : beq .goingNorth - lda $a2 : cmp #$51 : bne ++ - rep #$20 : lda #$0018 : !add $20 : sta $20 : sep #$20 ; special fix for throne room + 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 $ee : beq .end -; rep #$20 : lda #$ffe0 : !add $20 : sta $20 : sep #$20 +; lda.b LinkLayer : beq .end +; rep #$20 : lda.w #$ffe0 : !add.b LinkPosY : sta.b LinkPosY : sep #$20 .goingNorth - cpx #$00 : bne ++ - lda $a0 : cmp #$51 : bne ++ - lda #$36 : bra .end ; special fix for throne room - ++ ldy $ee : cpy #$00 : beq ++ + 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 $0462 : and #$04 : bne ++ - pla : !add #$f6 : pha - ++ pla : !add $0464 : sta $0464 + pha : lda.w $0462 : and.b #$04 : bne ++ + pla : !add.b #$f6 : pha + ++ pla : !add.w $0464 : sta.w $0464 + rtl .toInroom - lda #$32 : sta $0464 : stz $045e + lda.b #$32 : sta.w $0464 : stz.w $045e rtl } GetTileAttribute: { phk : pea.w .jslrtsreturn-1 - pea.w $02802c + pea.w $82802c jml CalculateTransitionLanding ; mucks with x/y sets a to Tile Attribute, I think .jslrtsreturn rts @@ -352,15 +352,15 @@ StraightStairsFix: { pha lda.l DRMode : bne + - pla : !add $20 : sta $20 : rtl ;what we wrote over + pla : !add.b LinkPosY : sta.b LinkPosY : rtl ;what we wrote over + pla : rtl } StraightStairLayerFix: { lda.l DRMode : beq + - lda $ee : rtl - + lda $01c322, x : rtl ; what we wrote over + lda.b LinkLayer : rtl + + lda.l LayerOfDestination+3, x : rtl ; what we wrote over } DoorToStraight: @@ -369,61 +369,61 @@ DoorToStraight: lda.l DRMode : beq .skip pla : bne .end pha - lda $a0 : cmp #$51 : bne .skip - lda #$04 : sta $4e + lda.b RoomIndex : cmp.b #$51 : bne .skip + lda.b #$04 : sta.b $4e .skip pla - .end LDX.w $0418 : CMP.b #$02 ; what we wrote over + .end LDX.w TransitionDirection : CMP.b #$02 ; what we wrote over rtl } DoorToInroom: { - ldx $045e : bne .end - sta $0020, y ; what we wrote over + ldx.w $045e : bne .end + sta.w $0020, y ; what we wrote over .end - ldx #$00 ; what we wrote over + ldx.b #$00 ; what we wrote over rtl } DoorToInroomEnd: { - ldy $045e : beq .vanilla - cmp $045e : bne .return - stz $045e ; clear + ldy.w $045e : beq .vanilla + cmp.w $045e : bne .return + stz.w $045e ; clear .return rtl .vanilla - cmp $02c034, x ; what we wrote over + cmp.l UnderworldTransitionLandingCoordinate, x ; what we wrote over rtl } StraightStairsTrapDoor: { - lda $0464 : bne + + lda.w $0464 : bne + ; reset function .reset phk : pea.w .jslrtsreturn-1 - pea.w $02802c - jml $028c73 ; $10D71 .reset label of Bank02 + pea.w $82802c + jml ResetThenCacheRoomEntryProperties ; $10D71 .reset label of Bank02 .jslrtsreturn - lda $0468 : bne ++ - lda $a0 : cmp.b #$ac : bne .animateTraps - lda $0403 : and.b #$20 : bne .animateTraps - lda $0403 : and.b #$10 : beq ++ + lda.w $0468 : 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 #$05 : sta $11 - inc $0468 : stz $068e : stz $0690 + lda.b #$05 : sta.b GameSubMode + inc.w $0468 : stz.w $068e : stz.w $0690 ++ JML Underworld_SetBossOrSancMusicUponEntry_long + JML Dungeon_ApproachFixedColor ; what we wrote over } InroomStairsTrapDoor: { - lda $0200 : cmp #$05 : beq .reset - lda $b0 : jml $008781 ; what we wrote over (essentially) + 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 $028b15 ; just some RTS in bank 02 + jml $828b15 ; just some RTS in bank 02 } HandleSpecialDoorLanding: { @@ -436,7 +436,7 @@ HandleSpecialDoorLanding: { LDA.b 1,S : AND.b #$FA : CMP.b #$80 : bne .noDoor .setDoorState - LDA.w $0418 : AND.b #$02 : BNE + : INC + LDA.w TransitionDirection : AND.b #$02 : BNE + : INC + STA.b $6C .noDoor diff --git a/doorrando/overrides.asm b/doorrando/overrides.asm index d955e0a..9284ba6 100644 --- a/doorrando/overrides.asm +++ b/doorrando/overrides.asm @@ -1,9 +1,9 @@ GtBossHeartCheckOverride: - lda $a0 : cmp #$1c : beq ++ - cmp #$6c : beq ++ - cmp #$4d : bne + - ++ lda.l DRFlags : and #$01 : bne ++ ;skip if flag on - lda $403 : ora #$80 : sta $403 + 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 @@ -11,99 +11,102 @@ rtl OnFileLoadOverride: jsl OnFileLoad ; what I wrote over - + lda.l DRFlags : and #$02 : beq + ; Mirror Scroll - lda MirrorEquipment : bne + - lda #$01 : sta MirrorEquipment + + 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 #$02 : beq ++ - lda MirrorEquipment : cmp #$01 : beq + - ;++ lda $8A : and #$40 ; what I wrote over - ++ phx : ldx $8A : lda.l OWTileWorldAssoc,x : plx : and.b #$ff + lda.l DRFlags : and.b #$02 : beq ++ + lda.l MirrorEquipment : cmp.b #$01 : beq + + ;++ lda.b OverworldIndex : and.b #$40 ; what I wrote over + ++ phx : ldx.b OverworldIndex : lda.l OWTileWorldAssoc,x : plx : and.b #$ff rtl + lda.l DRScroll : rtl EGFixOnMirror: - lda.l DRFlags : and #$10 : beq + - stz $047a + lda.l DRFlags : and.b #$10 : beq + + stz.w LayerAdjustment + jsl Mirror_SaveRoomData rtl BlockEraseFix: - lda MirrorEquipment : and #$02 : beq + - stz $05fc : stz $05fd + lda.l MirrorEquipment : and.b #$02 : beq + + stz.w $05fc : stz.w $05fd + rtl FixShopCode: - cpx #$300 : !bge + - sta RoomDataWRAM[$00].l, x + cpx.w #$0300 : !bge + + sta.l RoomDataWRAM[$00].l, x + rtl VitreousKeyReset: - lda.l DRMode : beq + - stz $0cba, x - + JML $0db818 ;restore old code + LDA.l FixPrizeOnTheEyes : BEQ + + STZ.w SpriteForceDrop, X + + JML SpritePrep_LoadProperties ; what we wrote over GuruguruFix: - lda $a0 : cmp #$df : !bge + - and #$0f : cmp #$0e : !blt + + lda.b RoomIndex : cmp.b #$df : !bge + + and.b #$0f : cmp.b #$0e : !blt + iny #2 + rtl BlindAtticFix: lda.l DRMode : beq + - lda #$01 : rtl - + lda FollowerIndicator : cmp.b #$06 + lda.b #$01 : rtl + + lda.l FollowerIndicator : cmp.b #$06 rtl SuctionOverworldFix: - stz $50 : stz $5e + stz.b LinkStrafe : stz.b LinkSpeed lda.l DRMode : beq + - stz $49 + stz.b ForceMove + rtl -!CutoffTable = "$27E000" - CutoffEntranceRug: PHA : PHX LDA.l DRMode : BEQ .norm - LDA $04 : cmp #$000A : BEQ + ; only affect A & C objects - cmp #$000C : BNE .norm - + LDX #$0000 : LDA !CutoffTable, x - - CMP.W $A0 : BEQ .check - INX #2 : LDA !CutoffTable, x : CMP.w #$FFFF : BNE - - .norm PLX : PLA : LDA $9B52, y : STA $7E2000, x ; what we wrote over -RTL - .check - LDA $0c : CMP #$0004 : !BGE .skip - LDA $0e : CMP #$0008 : !BGE .skip - CMP.l #$0004 : !BLT .skip - BRA .norm -.skip PLX : PLA : RTL + 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 $5D : CMP #$1C : BNE + - STA $5F - + LDA #$15 : STA $5D ; what we wrote over + LDA.b LinkState : CMP.b #$1C : BNE + + STA.b ManipTileField + + LDA.b #$15 : STA.b LinkState ; what we wrote over RTL RetrieveBunnyState: - STY $5D : STZ $02D8 ; what we wrote over - LDA $5F : BEQ + - STA $5D -+ RTL + 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 +; 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 #$04 : BEQ + ; zelda's not been rescued + 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 ; A is zero if the AND results in zero and then Agahnim's invincible! + + RTL StandardSaveAndQuit: - LDA.b #$0F : STA.b $95 ; what we wrote over - LDA.l ProgressFlags : AND #$04 : BNE + + 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 >= @@ -113,24 +116,24 @@ StandardSaveAndQuit: BlindsAtticHint: REP #$20 CMP.w #$0122 : BNE + - LDA RoomDataWRAM[$65].low : AND.w #$0100 : BEQ + + 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 $0D00,X : BEQ + ; don't despawn follower if maiden isn't "present" + 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 #$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.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.b GameMode : CMP.b #$0F : BEQ .skip_activation ; LDA.l InvertedMode : BNE + ; LDA.l CurrentWorld : BNE .skip_activation ; RTL diff --git a/doorrando/scroll.asm b/doorrando/scroll.asm index 435b5c9..0c09d3f 100644 --- a/doorrando/scroll.asm +++ b/doorrando/scroll.asm @@ -1,98 +1,98 @@ AdjustTransition: { - lda $ab : and #$01ff : beq .reset - phy : ldy #$06 ; operating on vertical registers during horizontal trans + 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 #$00 ; operate on horizontal regs during vert trans + ldy.b #$00 ; operate on horizontal regs during vert trans .horizontalScrolling - cmp #$0008 : bcs + - pha : lda $ab : and #$0200 : beq ++ + cmp.w #$0008 : bcs + + pha : lda.b $ab : and.w #$0200 : beq ++ pla : bra .add - ++ pla : eor #$ffff : inc ; convert to negative + ++ pla : eor.w #$ffff : inc ; convert to negative .add jsr AdjustCamAdd : ply : bra .reset - + lda $ab : and #$0200 : xba : tax + + lda.b $ab : and.w #$0200 : xba : tax lda.l OffsetTable,x : jsr AdjustCamAdd - lda $ab : !sub #$0008 : sta $ab + 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 $ab + stz.b $ab .done - lda $00 : and #$01fc + lda.b Scrap00 : and.w #$01fc rtl } AdjustCamAdd: - !add $00E2,y : pha - and #$01ff : cmp #$0111 : !blt + - cmp #$01f8 : !bge ++ - pla : and #$ff10 : pha : bra + - ++ pla : and #$ff00 : !add #$0100 : pha - + pla : sta $00E2,y : sta $00E0,y : rts + !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 $a0 : and.b #$f0 : lsr #3 : sta $0603 : inc : sta $0607 + lda.b RoomIndex : and.b #$f0 : lsr #3 : sta.w $0603 : inc : sta.w $0607 - lda $05 : bne + - lda $603 : sta $00 : stz $01 : bra ++ - + lda $607 : sta $00 : lda #$02 : sta $01 + 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 $0e + stz.b Scrap0E rep #$30 - lda $00 : pha + lda.b Scrap00 : pha - lda $e8 : and #$01ff : sta $02 - lda $04 : jsr LimitYCamera : sta $00 + lda.b BG2V : and #$01ff : sta.b Scrap02 + lda.b Scrap04 : jsr LimitYCamera : sta.b Scrap00 jsr CheckRoomLayoutY : bcc + - lda $00 : cmp #$0080 : !bge ++ - cmp #$0010 : !blt .cmpSrll - lda #$0010 : bra .cmpSrll - ++ cmp #$0100 : !bge .cmpSrll - lda #$0100 - .cmpSrll sta $00 + 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 $00 : cmp $02 : bne + - lda #$0000 : bra .next + + lda.b Scrap00 : cmp.b Scrap02 : bne + + lda.w #$0000 : bra .next + !blt + - !sub $02 : inc $0e : bra .next - + lda $02 : !sub $00 + !sub.b Scrap02 : inc.b Scrap0E : bra .next + + lda.b Scrap02 : !sub.b Scrap00 .next - sta $ab + sta.b $ab jsr AdjustCameraBoundsY - pla : sta $00 + pla : sta.b Scrap00 sep #$30 - lda $04 : sta $20 - lda $00 : sta $21 : sta $0601 : sta $0605 - lda $01 : sta $aa - lda $0e : asl : ora $ac : sta $ac - lda $e9 : and #$01 : asl #2 : tax : lda $0603, x : sta $e9 + 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 #$006c : !bge + - lda #$0000 : bra .end - + cmp #$017d : !blt + - lda #$0110 : bra .end - + !sub #$006c + 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 #$00 : beq .lock - cmp #$07 : beq .free - cmp #$01 : beq .free - cmp #$04 : !bge .lock - cmp #$02 : bne + - lda $06 : cmp #$ff : beq .lock - + cmp #$03 : bne .free - lda $06 : cmp #$ff : bne .lock + 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 @@ -100,123 +100,123 @@ AdjustCameraBoundsY: jsr CheckRoomLayoutY : bcc .free ; layouts that are camera locked (quads only) - lda $04 : and #$00ff : cmp #$007d : !blt + - lda #$0088 : bra ++ - + cmp #$006d : !bge + - lda #$0078 : bra ++ - + !add #$000b + 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 $02 : lda $04 : and #$0100 : !add $02 : bra .setBounds + ++ sta.b Scrap02 : lda.b Scrap04 : and.w #$0100 : !add.b Scrap02 : bra .setBounds ; layouts where the camera is free - .free lda $04 : cmp #$006c : !bge + - lda #$0077 : bra .setBounds - + cmp #$017c : !blt + - lda #$0187 : bra .setBounds - + !add #$000b - .setBounds sta $0618 : inc #2 : sta $061a + .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 $a0 : asl : !add $a0 : tax - lda $1f8001, x : sta $b8 - lda $1f8000, x : sta $b7 + 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 #$01 : lda [$b7], y : and #$1c : lsr #2 + 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 $a0 : and.b #$0f : asl : sta $060b : inc : sta $060f + lda.b RoomIndex : and.b #$0f : asl : sta.w $060b : inc : sta.w $060f - lda $05 : bne + - lda $60b : sta $00 : stz $01 : bra ++ - + lda $60f : sta $00 : lda #$01 : sta $01 + 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 $0e ; pos/neg indicator + stz.b Scrap0E ; pos/neg indicator rep #$30 - lda $00 : pha + lda.b Scrap00 : pha - lda $e2 : and #$01ff : sta $02 - lda $04 : jsr LimitXCamera : sta $00 + lda.b BG2H : and.w #$01ff : sta.b Scrap02 + lda.b Scrap04 : jsr LimitXCamera : sta.b Scrap00 jsr CheckRoomLayoutX : bcc + - lda $00 : cmp #$0080 : !bge ++ - lda #$0000 : bra .cmpSrll - ++ lda #$0100 - .cmpSrll sta $00 + lda.b Scrap00 : cmp.w #$0080 : !bge ++ + lda.w #$0000 : bra .cmpSrll + ++ lda.w #$0100 + .cmpSrll sta.b Scrap00 ;figures out scroll amt - + lda $00 : cmp $02 : bne + - lda #$0000 : bra .next + + lda.b Scrap00 : cmp.b Scrap02 : bne + + lda.w #$0000 : bra .next + !blt + - !sub $02 : inc $0e : bra .next - + lda $02 : !sub $00 + !sub.b Scrap02 : inc.b Scrap0E : bra .next + + lda.b Scrap02 : !sub.b Scrap00 .next - sta $ab : lda $04 + sta.b $ab : lda.b Scrap04 - cmp #$0078 : !bge + - lda #$007f : bra ++ - + cmp #$0178 : !blt + - lda #$017f : bra ++ - + !add #$0007 - ++ sta $061c : inc #2 : sta $061e + 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 $00 + pla : sta.b Scrap00 sep #$30 - lda $04 : ldx $046d : bne .straight - sta $22 : bra + + lda.b Scrap04 : ldx.w $046d : bne .straight + sta.b LinkPosX : bra + .straight - sta $046d ; set X position later + sta.w $046d ; set X position later + - lda $00 : sta $23 : sta $0609 : sta $060d - lda $01 : sta $a9 - lda $0e : asl : ora $ac : sta $ac - lda $e3 : and #$01 : asl #2 : tax : lda $060b, x : sta $e3 + 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 #$0079 : !bge + - lda #$0000 : bra .end - + cmp #$0178 : !blt + - lda #$0178 - + !sub #$0078 + 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 #$04 : !blt .lock - cmp #$05 : bne + - lda $06 : cmp #$ff : beq .lock + cmp.b #$04 : !blt .lock + cmp.b #$05 : bne + + lda.b Scrap06 : cmp.b #$ff : beq .lock + cmp #$06 : bne .free - lda $06 : cmp #$ff : bne .lock + lda.b Scrap06 : cmp.b #$ff : bne .lock .free rep #$30 : clc : rts .lock rep #$30 : sec : rts ApplyScroll: rep #$30 - lda $ab : and #$01ff : sta $00 - lda $ab : and #$0200 : beq + - lda $00e2, y : !add $00 : bra .end - + lda $00e2, y : !sub $00 + 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 $00e2, y - sta $00e0, y - stz $ab : sep #$30 : rts + sta.w $00e2, y + sta.w $00e0, y + stz.b $ab : sep #$30 : rts QuadrantLoadOrderBeforeScroll: - lda $045f : beq .end - lda #$08 : sta $045c ; start with opposite quadrant row + lda.w $045f : beq .end + lda.b #$08 : sta.w $045c ; start with opposite quadrant row .end - JML $0091c4 ; what we overwrote + JML WaterFlood_BuildOneQuadrantForVRAM ; what we overwrote QuadrantLoadOrderAfterScroll: - lda $045f : beq .end - stz $045c : stz $045f ; draw other row and clear flag + lda.w $045f : beq .end + stz.w $045c : stz.w $045f ; draw other row and clear flag .end - JML $0091c4 ; what we overwrote \ No newline at end of file + JML WaterFlood_BuildOneQuadrantForVRAM ; what we overwrote \ No newline at end of file diff --git a/doorrando/spiral.asm b/doorrando/spiral.asm index a0c0ae7..01c63e5 100644 --- a/doorrando/spiral.asm +++ b/doorrando/spiral.asm @@ -1,103 +1,103 @@ RecordStairType: { pha lda.l DRMode : beq .norm - REP #$30 : LDA.b $A2 : CMP.w #$00E1 : BCS .norm + REP #$30 : LDA.b PreviousRoom : CMP.w #$00E1 : BCS .norm CMP #$00DF : BEQ .norm SEP #$30 - lda $0e - cmp #$25 : bcc ++ ; don't record straight staircases - sta $045e + lda.b Scrap0E + cmp.b #$25 : bcc ++ ; don't record straight staircases + sta.w $045e ++ pla : bra + - .norm SEP #$30 : pla : sta $a0 - + lda $063d, x + .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 $A2 : CMP.w #$00E1 : BCS .abort - CMP #$00DF : BEQ .abort + REP #$30 : LDA.b PreviousRoom : CMP.w #$00E1 : BCS .abort + CMP.w #$00DF : BEQ .abort SEP #$30 - lda $045e : cmp #$5e : beq .gtg ; abort if not spiral - intended room is in A! - cmp #$5f : beq .gtg - cmp #$26 : beq .inroom + 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 $045e : lda $a2 : and.b #$0f : rtl ; clear,run hijacked code and get out + SEP #$30 : stz.w $045e : lda.b PreviousRoom : and.b #$0f : rtl ; clear,run hijacked code and get out .inroom jsr InroomStairsWarp - lda $a2 : and #$0f ; this is the code we are hijacking + 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 #$00FF : asl #2 : tax - lda.w SpiralTable, x : sta $00 - lda.w SpiralTable+2, x : sta $02 + 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 $00 : sta $a0 + lda.b Scrap00 : sta.b RoomIndex ; shift quadrant if necessary - stz $07 ; this is a x quad adjuster for those blasted staircase on the edges - lda $01 : and #$01 : !sub $a9 + 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 $0462 : and #$04 : bne .xqCont - inc $07 - .xqCont lda $22 : bne .skipXQuad ; this is an edge case - dec $23 : bra .skipXQuad ; need to -1 if $22 is 0 - .xQuad sta $06 : !add $a9 : sta $a9 - lda $0462 : and #$04 : bne .xCont - inc $07 ; up stairs are going to -1 the quad anyway during transition, need to add this back - .xCont ldy #$00 : jsr ShiftQuadSimple + 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 $aa : lsr : sta $06 : lda $01 : and #$02 : lsr : !sub $06 + lda.b LinkQuadrantV : lsr : sta.b Scrap06 : lda.b Scrap01 : and.b #$02 : lsr : !sub.b Scrap06 beq .skipYQuad - sta $06 : asl : !add $aa : sta $aa - ldy #$01 : jsr ShiftQuadSimple + sta.b Scrap06 : asl : !add.b LinkQuadrantV : sta.b LinkQuadrantV + ldy.b #$01 : jsr ShiftQuadSimple .skipYQuad - lda $01 : and #$04 : lsr : sta $048a ;fix layer calc 0->0 2->1 - lda $01 : and #$08 : lsr #2 : sta $0492 ;fix from layer calc 0->0 2->1 + 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 $02 : sta $22 : bne .adjY : lda $23 : !add $07 : sta $23 - .adjY lda $03 : sta $20 : bne .upDownAdj : inc $21 - .upDownAdj ldx #$08 - lda $0462 : and #$04 : beq .upStairs - ldx #$fd - lda $01 : and #$80 : bne .set53 + 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 #$06 : !add $20 : sta $20 : lda #$eb : !add $22 : sta $22 : bra .set53 + lda.b #$06 : !add.b LinkPosY : sta.b LinkPosY : lda.b #$eb : !add.b LinkPosX : sta.b LinkPosX : bra .set53 .upStairs - lda $01 : and #$80 : beq .set53 + lda.b Scrap01 : and.b #$80 : beq .set53 ; if target is also up adjust by (-6, 14) - lda #$fa : !add $20 : sta $20 : lda #$14 : !add $22 : sta $22 - bne .set53 : inc $23 + 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 $22 : sta $53 + txa : !add.b LinkPosX : sta.b $53 - lda $01 : and #$10 : sta $07 ; zeroHzCam check - ldy #$00 : jsr SetCamera - lda $01 : and #$20 : sta $07 ; zeroVtCam check - ldy #$01 : jsr SetCamera + 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 $a2 : and #$0f ; this is the code we are hijacking + lda.b PreviousRoom : and.b #$0f ; this is the code we are hijacking rtl } StairCleanup: { - stz $045e ; clear the staircase flag + stz.w $045e ; clear the staircase flag ; animated tiles fix lda.l DRMode : cmp #$02 : bne + ; only do this in crossed mode - ldx $a0 : lda.l TilesetTable, x - cmp $0aa1 : beq + ; already eq no need to decomp - sta $0aa1 - tax : lda $02802e, x : tay + 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 $047a + stz.w LayerAdjustment rts } @@ -110,58 +110,58 @@ LookupSpiralOffset_long: LookupSpiralOffset: { ;where link currently is in $a2: quad in a8 & #$03 ;count doors - stz $00 : ldx #$00 : stz $01 + stz.b Scrap00 : ldx.b #$00 : stz.b Scrap01 .loop - lda $047e, x : cmp $00 : bcc .continue - sta $00 + lda.w $047e, x : cmp.b Scrap00 : bcc .continue + sta.b Scrap00 .continue inx #2 - cpx #$08 : bcc .loop + cpx.b #$08 : bcc .loop - lda $00 : lsr - cmp #$01 : beq .done + lda.b Scrap00 : lsr + cmp.b #$01 : beq .done ; look up the quad - lda $a9 : ora $aa : and #$03 : beq .quad0 - cmp #$01 : beq .quad1 - cmp #$02 : beq .quad2 + 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 $01 : lda $a2 - cmp #$0c : beq .q0diff ;gt ent - cmp #$70 : bne .done ;hc stairwell - .q0diff lda $22 : cmp #$00 : beq .secondDoor - cmp #$98 : bcc .done ;gt ent and hc stairwell - .secondDoor inc $01 : bra .done + 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 $a2 - cmp #$1a : beq .q1diff ;pod compass - cmp #$26 : beq .q1diff ;swamp elbows - cmp #$6a : beq .q1diff ;pod dark basement - cmp #$76 : bne .done ;swamp drain - .q1diff lda $22 : cmp #$98 : bcc .done - inc $01 : bra .done + 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 #$03 : sta $01 : lda $a2 - cmp #$5f : beq .iceu ;ice u room - cmp #$3f : bne .done ;hammer ice exception - stz $01 : bra .done - .iceu lda $22 : cmp #$78 : bcc .done - inc $01 : bra .done + 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 $a2 : cmp #$40 : beq .done ; top of aga exception - lda #$02 : sta $01 ; always 2 + lda.b PreviousRoom : cmp.b #$40 : beq .done ; top of aga exception + lda.b #$02 : sta.b Scrap01 ; always 2 .done - lda $a2 : tax : lda.w SpiralOffset,x - !add $01 ;add a thing (0 in easy case) + 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 $a0 : ldx #$07 + lda.b RoomIndex : ldx.b #$07 .loop cmp.w InroomStairsRoom,x beq .found @@ -169,94 +169,94 @@ InroomStairsWarp: { bne .loop .found rep #$30 - txa : and #$00ff : asl : tay - lda.w InroomStairsTable,y : sta $00 + txa : and.w #$00ff : asl : tay + lda.w InroomStairsTable,y : sta.b Scrap00 sep #$30 - sta $a0 + sta.b RoomIndex ; set position and everything else based on target door type - txa : and #$01 : eor #$01 : sta $07 + 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 $01 : and #$80 : beq .notEdge - lda $07 : sta $03 : beq + - lda $01 : jsr LoadSouthMidpoint : sta $22 : lda #$f4 + 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 $01 : jsr LoadNorthMidpoint : sta $22 : dec $21 : lda #$f7 + lda.b Scrap01 : jsr LoadNorthMidpoint : sta.b LinkPosX : dec.b LinkPosY+1 : lda.b #$f7 ++ - sta $20 - lda $01 : and #$20 : beq + - lda #$01 + sta.b LinkPosY + lda.b Scrap01 : and.b #$20 : beq + + lda.b #$01 + - sta $02 - stz $07 - lda $01 : and #$10 : lsr #4 + sta.b Scrap02 + stz.b Scrap07 + lda.b Scrap01 : and.b #$10 : lsr #4 JMP .layer .notEdge - lda $01 : and #$03 : cmp #$03 : bne .normal - txa : and #$06 : sta $07 - lda $01 : and #$30 : lsr #3 : tay - lda.w InroomStairsX+1,y : sta $02 - lda.w InroomStairsY+1,y : sta $03 - cpy $07 : beq .vanillaTransition - lda.w InroomStairsX,y : sta $22 + 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 $07 : beq + + ldy.b Scrap07 : beq + !add #$07 + - sta $20 - inc $07 + sta.b LinkPosY + inc.b Scrap07 bra ++ .vanillaTransition - lda #$c0 : sta $07 ; leave camera + lda.b #$c0 : sta.b Scrap07 ; leave camera ++ %StonewallCheck($1b) - lda $01 : and #$04 : lsr #2 + lda.b Scrap01 : and.b #$04 : lsr #2 bra .layer .normal - lda $01 : sta $fe ; trap door - lda $07 : sta $03 : beq + - lda $01 : and #$04 : bne .specialFix - lda #$e0 : bra ++ + 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 #$c8 : bra ++ + lda.b #$c8 : bra ++ + %StonewallCheck($43) - lda $01 : and #$04 : bne + - lda #$1b : bra ++ - + lda #$33 - ++ sta $20 - inc $07 : stz $02 : lda #$78 : sta $22 - lda $01 : and #$03 : beq ++ - cmp #$02 : !bge + - lda #$f8 : sta $22 : stz $07 : bra ++ - + inc $02 + 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 $01 : and #$04 : lsr #2 + lda.b Scrap01 : and.b #$04 : lsr #2 .layer - sta $ee + sta.b LinkLayer bne + - stz $0476 + stz.w $0476 + - lda $02 : !sub $a9 + lda.b Scrap02 : !sub.b LinkQuadrantH beq .skipXQuad - sta $06 : !add $a9 : sta $a9 - ldy #$00 : jsr ShiftQuadSimple + sta.b Scrap06 : !add.b LinkQuadrantH : sta.b LinkQuadrantH + ldy.b #$00 : jsr ShiftQuadSimple .skipXQuad - lda $aa : lsr : sta $06 : lda $03 : !sub $06 + lda.b LinkQuadrantV : lsr : sta.b Scrap06 : lda.b Scrap03 : !sub.b Scrap06 beq .skipYQuad - sta $06 : asl : !add $aa : sta $aa - ldy #$01 : jsr ShiftQuadSimple + sta.b Scrap06 : asl : !add.b LinkQuadrantV : sta.b LinkQuadrantV + ldy.b #$01 : jsr ShiftQuadSimple .skipYQuad - lda $07 : bmi .skipCamera - ldy #$00 : jsr SetCamera ; horizontal camera - ldy #$01 : sty $07 : jsr SetCamera ; vertical camera - lda $20 : cmp #$e0 : bcc + - lda $e8 : bne + - lda #$10 : sta $e8 ; adjust vertical camera at bottom + 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 @@ -267,72 +267,72 @@ InroomStairsWarp: { ShiftQuadSimple: { lda.w CoordIndex,y : tax - lda $20,x : beq .skip - lda $21,x : !add $06 : sta $21,x ; coordinate update + 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 $0601,x : !add $06 : sta $0601,x - lda $0605,x : !add $06 : sta $0605,x ; high bytes of these guys + 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 $04 - tyx : lda $a9,x : bne .nonZeroHalf - lda.w CamQuadIndex,y : tax : lda $607,x : pha - lda.w CameraIndex,y : tax : pla : cmp $e3, x : bne .noQuadAdj - dec $e3,x + 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 $07 : bne .adj0 + lda.b Scrap07 : bne .adj0 lda.w CoordIndex,y : tax - lda $20,x : beq .oddQuad - cmp #$79 : bcc .adj0 - !sub #$78 : sta $04 - tya : asl : !add #$04 : tax : jsr AdjCamBounds : bra .done + 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 #$80 : sta $04 : bra .adj1 ; this is such a weird case - quad cross boundary + 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 $07 : bne .setQuad + lda.b Scrap07 : bne .setQuad lda.w CoordIndex,y : tax - lda $20,x : cmp #$78 : bcs .setQuad - !add #$78 : sta $04 - lda.w CamQuadIndex,y : tax : lda $0603, x : pha - lda.w CameraIndex,y : tax : pla : sta $e3, x + 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 #$08 : tax : jsr AdjCamBounds : bra .done + tya : asl : !add.b #$08 : tax : jsr AdjCamBounds : bra .done .setQuad - lda.w CamQuadIndex,y : tax : lda $0607, x : pha - lda.w CameraIndex,y : tax : pla : sta $e3, x - tya : asl : !add #$0c : tax : jsr AdjCamBounds : bra .done + 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 $04 : sta $e2, x + 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 $05 - lda $04 : and #$00ff : beq .common + rep #$20 : lda.w CamBoundBaseLine, x : sta.b Scrap05 + lda.b Scrap04 : and.w #$00ff : beq .common lda.w CoordIndex,y : tax - lda $20, x : and #$00ff : !add $05 : sta $05 + lda.b LinkPosY, x : and.w #$00ff : !add.b Scrap05 : sta.b Scrap05 .common lda.w OppCamBoundIndex,y : tax - lda $05 : sta $0618, x - inc #2 : sta $061A, x : sep #$20 + lda.b Scrap05 : sta.w CameraScrollN, x + inc #2 : sta.w CameraScrollS, x : sep #$20 rts } SpiralPriorityHack: { lda.l DRMode : beq + - lda #$01 : rtl ; always skip the priority code - until I figure out how to fix it - + lda $0462 : and #$04 ; what we wrote over + 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 } \ No newline at end of file diff --git a/dungeondrops.asm b/dungeondrops.asm index c33e1cc..6308649 100644 --- a/dungeondrops.asm +++ b/dungeondrops.asm @@ -1,9 +1,325 @@ ;================================================================================ ; Dungeon & Boss Drop Fixes ;-------------------------------------------------------------------------------- -DropSafeDungeon: - LDA $040C : CMP #$08 : BEQ + - LDA $01C6FC, X : JML Sprite_SpawnFallingItem - + +SpawnDungeonPrize: + PHX : PHB + 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 + .failed_spawn + PLB : PLX RTL -;-------------------------------------------------------------------------------- \ No newline at end of file + +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 #$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 #$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 #$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 #$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 diff --git a/dungeonmap.asm b/dungeonmap.asm index 5ad5ea0..8e53bbd 100644 --- a/dungeonmap.asm +++ b/dungeonmap.asm @@ -1,24 +1,16 @@ DoDungeonMapBossIcon: - LDA.b $14 + LDA.b NMISTRIPES CMP.b #$09 BEQ .dungeonmap .cave - CMP.b #$01 RTL .dungeonmap - LDX.w $040C + LDX.w DungeonID BMI .cave -; LDA.l DungeonMapIcons -; AND.b #$01 -; BNE ++ -; -; INC ; so it's not equal to $01 -; BRA .cave - ; get dungeon boss room ++ REP #$30 LDA.l DungeonMapBossRooms, X @@ -26,13 +18,14 @@ DoDungeonMapBossIcon: TAX ; get sprite pointer for room - LDA.l $89D62E,X - INC ; to skip the "sort" - TAX + LDA.l RoomData_SpritePointers,X + STA.b Scrap00 ; pointer in $00 + LDA.w #$0028 : STA.b Scrap02 ; set the bank to 28 for now + LDY.w #$0001 ; to skip the "sort" ; get first byte to make sure it isn't an empty room SEP #$20 - LDA.l $890000,X + LDA.b [$00], Y CMP.b #$FF BNE ++ @@ -40,7 +33,8 @@ DoDungeonMapBossIcon: BRA .cave ; check first sprite -++ LDA.l $890002,X +++ INY #2 + LDA.b [$00], Y SEP #$10 ; match boss id @@ -57,7 +51,7 @@ DoDungeonMapBossIcon: .match LDA.b #$80 - STA.w $2121 + STA.w CGADD REP #$30 @@ -74,14 +68,14 @@ DoDungeonMapBossIcon: ASL ; x128 for graphics ASL ADC.w #BossMapIconGFX - STA.w $4312 + STA.w A1T1L PHY LDY.w #32 SEP #$20 -- LDA.l .boss_palettes,X - STA.w $2122 + STA.w CGDATA INX DEY BNE -- @@ -94,24 +88,24 @@ DoDungeonMapBossIcon: SEP #$10 LDA.w #$1801 - STA.w $4310 + STA.w DMAP1 LDX.b #BossMapIconGFX>>16 - STX.w $4314 + STX.w A1B1 LDA.w #$A060>>1 - STA.w $2116 + STA.w VMADDL LDA.w #$0040 - STA.w $4315 + STA.w DAS1L LDX.b #$02 - STX.w $420B + STX.w MDMAEN - STA.w $4315 + STA.w DAS1L LDA.w #$A260>>1 - STA.w $2116 + STA.w VMADDL - STX.w $420B + STX.w MDMAEN ; done SEP #$30 diff --git a/elder.asm b/elder.asm index 43b6a1e..d464ece 100644 --- a/elder.asm +++ b/elder.asm @@ -1,11 +1,11 @@ NewElderCode: { -LDA $8A : AND.b #$3F : CMP #$1B : BEQ .newCodeContinue +LDA.b OverworldIndex : AND.b #$3F : CMP.b #$1B : BEQ .newCodeContinue ;Restore Jump we can keep the RTL so JML -JML $05F0CD +JML Sprite_16_Elder .newCodeContinue PHB : PHK : PLB -LDA.b #$07 : STA $0F50, X ;Palette +LDA.b #$07 : STA.w SpriteOAMProp, X ; Palette JSR Elder_Draw JSL Sprite_PlayerCantPassThrough JSR Elder_Code @@ -16,13 +16,12 @@ RTL Elder_Draw: { - - LDA.b #$02 : STA $06 : STZ $07 ;Number of Tiles + LDA.b #$02 : STA.b Scrap06 : STZ.b Scrap07 ;Number of Tiles - LDA $0DC0, X : ASL #04 + LDA.w SpriteGFXControl, X : ASL #04 - ADC.b #.animation_states : STA $08 - LDA.b #.animation_states>>8 : ADC.b #$00 : STA $09 + ADC.b #.animation_states : STA.b Scrap08 + LDA.b #.animation_states>>8 : ADC.b #$00 : STA.b Scrap09 JSL Sprite_DrawMultiple_player_deferred JSL Sprite_DrawShadowLong @@ -42,15 +41,15 @@ RTL { REP #$20 LDA.l GoalItemRequirement : BEQ .despawn - LDA.l InvincibleGanon : AND.w #$00FF : CMP.w #$0005 : BEQ .despawn + LDA.l GanonVulnerableMode : AND.w #$00FF : CMP.w #$0005 : BEQ .despawn LDA.l TurnInGoalItems : AND.w #$00FF : BNE + .despawn SEP #$20 - STZ $0DD0, X ; despawn self + STZ.w SpriteAITable, X ; despawn self RTS + SEP #$20 - LDA.b $11 + LDA.b GameSubMode BNE .done LDA.b #$96 LDY.b #$01 @@ -66,7 +65,7 @@ RTL .done SEP #$20 - LDA.b $1A : LSR #5 : AND.b #$01 : STA.w $0DC0, X + LDA.b FrameCounter : LSR #5 : AND.b #$01 : STA.w SpriteGFXControl, X RTS } @@ -76,21 +75,21 @@ RTL ActivateTriforceCutscene: ; despawn other sprites LDY.b #$0F - - LDA.w $0E20,Y : CMP.b #$16 : BNE + + - LDA.w SpriteTypeTable,Y : CMP.b #$16 : BNE + CPY.b #$00 : BEQ .next ; move Murahdahla to slot 0 for draw priority reasons - LDA.w $0E20,Y : STA.w $0E20 - LDA.w $0D00,Y : STA.w $0D00 - LDA.w $0D10,Y : STA.w $0D10 - LDA.w $0D20,Y : STA.w $0D20 - LDA.w $0D30,Y : STA.w $0D30 - LDA.w $0D40,Y : STA.w $0D40 - LDA.w $0F50,Y : STA.w $0F50 - LDA.w $0E40,Y : STA.w $0E40 - LDA.w $0E60,Y : STA.w $0E60 - LDA.w $0DD0,Y : STA.w $0DD0 - LDA.b #$02 : STA.w $0F20 - + LDA.b #$00 : STA.w $0DD0,Y + LDA.w SpriteTypeTable,Y : STA.w SpriteTypeTable + LDA.w SpritePosYLow,Y : STA.w SpritePosYLow + LDA.w SpritePosXLow,Y : STA.w SpritePosXLow + LDA.w SpritePosYHigh,Y : STA.w SpritePosYHigh + LDA.w SpritePosXHigh,Y : STA.w SpritePosXHigh + LDA.w SpriteVelocityY,Y : STA.w SpriteVelocityY + LDA.w SpriteOAMProp,Y : STA.w SpriteOAMProp + LDA.w SpriteOAMProperties,Y : STA.w SpriteOAMProperties + LDA.w SpriteControl,Y : STA.w SpriteControl + LDA.w SpriteAITable,Y : STA.w SpriteAITable + LDA.b #$02 : STA.w SpriteLayer + + LDA.b #$00 : STA.w SpriteAITable,Y .next DEY : BPL - @@ -98,63 +97,71 @@ ActivateTriforceCutscene: JSL Sprite_SpawnDynamically ; set up coords - LDA.b $22 : STA.w $0D10,Y - LDA.b $23 : STA.w $0D30,Y - LDA.b $20 : CLC : ADC.b #$08 : STA.w $0D00,Y - LDA.b $21 : ADC.b #$00 : STA.w $0D20,Y + LDA.b LinkPosX : STA.w SpritePosXLow,Y + LDA.b LinkPosX+1 : STA.w SpritePosXHigh,Y + LDA.b LinkPosY : CLC : ADC.b #$08 : STA.w SpritePosYLow,Y + LDA.b LinkPosY+1 : ADC.b #$00 : STA.w SpritePosYHigh,Y - LDA.b #$01 : STA.w $0D90,Y ; our indicator this is a special cutscene sprite - INC : STA.b $2F ; makes Link face downward + LDA.b #$01 : STA.w SpriteMovement,Y ; our indicator this is a special cutscene sprite + INC : STA.b LinkDirection ; makes Link face downward ; reset modules - LDA.b $1B : BEQ + + LDA.b IndoorsFlag : BEQ + LDA.b #$07 BRA ++ + LDA.b #$09 - ++ STA.b $10 - STZ.b $11 : STZ.b $B0 + ++ STA.b GameMode + STZ.b GameSubMode : STZ.b SubSubModule RTL pushpc - org $058928 + org $858928 MasterSword_InPedestal_DoCutscene: - org $0589B1 + org $8589B1 MasterSword_ConditionalHandleReceipt_DoReceipt: - org $0588DF + org $8588DF JSL MasterSword_CheckIfPulled : PLX : NOP #2 db $90 ; BCC instead of BEQ - org $05890E + org $85890E JSL MasterSword_ConditionalActivateCutscene - org $05895F + org $85895F JSL MasterSword_ConditionalGrabPose : NOP - org $058994 + org $858994 JSL MasterSword_ConditionalGrabPose : NOP - org $058D1C + org $858D1C JML MasterSword_SpawnPendantProp_ChangePalette MasterSword_SpawnPendantProp_ChangePalette_return: - org $0589A3 + org $8589A3 JSL MasterSword_ConditionalHandleReceipt : NOP #2 pullpc MasterSword_CheckIfPulled: CPX.b #$80 : BEQ + - CLC : RTL ; not on pedestal screen, continue with cutscene - + LDA.l $7EF280,X : AND.b #$40 ; what we wrote over + + LDA.l OverworldEventDataWRAM,X : AND.b #$40 ; what we wrote over BEQ - : SEC : RTL MasterSword_ConditionalActivateCutscene: - LDA.w $0D90,X : BNE .specialCutscene + LDA.w SpriteMovement,X : BNE .specialCutscene JML Sprite_CheckDamageToPlayerSameLayerLong ; what we wrote over .specialCutscene - LDA.b #$02 : STA.w $02DA ; Link's 2-hands-up pose - STA.b $EE ; draw Link on top - LDA.b #$6A : JSL RequestSlottedTile ; draw Triforce piece in VRAM + LDA.b #$02 : STA.w ItemReceiptPose ; Link's 2-hands-up pose + STA.b LinkLayer ; draw Link on top + ; draw Triforce piece in VRAM + PHX + REP #$30 + LDX.w #$006A<<1 + LDA.l StandingItemGraphicsOffsets,X : LDX.w ItemStackPtr : STA.l ItemGFXStack,X + LDA.w #$9CE0>>1 : STA.l ItemTargetStack,X + TXA : INC #2 : STA.w ItemStackPtr + SEP #$30 + PLX PLA : PLA : PLA : JML MasterSword_InPedestal_DoCutscene ; do cutscene MasterSword_ConditionalGrabPose: PHA - LDA.w $0D90,X : BNE .specialCutscene + LDA.w SpriteMovement,X : BNE .specialCutscene PLA STA.w $0377 : LDA.b #$01 ; what we wrote over RTL @@ -164,18 +171,18 @@ MasterSword_ConditionalGrabPose: RTL MasterSword_SpawnPendantProp_ChangePalette: - STA.w $0D40,Y : PLX ; what we wrote over - LDA.w $0D90,X : BNE .specialCutscene + STA.w SpriteVelocityY,Y : PLX ; what we wrote over + LDA.w SpriteMovement,X : BNE .specialCutscene BRA .done .specialCutscene - LDA.b #$08 : STA.w $0F50,Y ; change palette - LDA.b #$02 : STA.w $0F20,Y ; change layer + LDA.b #$08 : STA.w SpriteOAMProp,Y ; change palette + LDA.b #$02 : STA.w SpriteLayer,Y ; change layer .done JML MasterSword_SpawnPendantProp_ChangePalette_return MasterSword_ConditionalHandleReceipt: - LDA.w $0D90,X : BNE .specialCutscene - LDX.b $8A : LDA.l $7EF280,X ; what we wrote over + LDA.w SpriteMovement,X : BNE .specialCutscene + LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X ; what we wrote over RTL .specialCutscene PLA : PLA : PEA.w MasterSword_ConditionalHandleReceipt_DoReceipt-1 @@ -184,41 +191,41 @@ MasterSword_ConditionalHandleReceipt: RTL pushpc - org $058AB6 + org $858AB6 MasterSword_SpawnLightWell: - org $058AD0 + org $858AD0 MasterSword_SpawnLightFountain: - org $058B62 + org $858B62 MasterSword_SpawnLightBeam: - org $058941 + org $858941 JSL MasterSword_ConditionalSpawnLightWell : NOP #2 MasterSword_SpawnLightWell_return: - org $058952 + org $858952 JSL MasterSword_ConditionalSpawnLightFountain : NOP #2 MasterSword_SpawnLightFountain_return: - org $058B64 + org $858B64 JSL MasterSword_ConditionalSpawnLightBeam : NOP #2 pullpc MasterSword_ConditionalSpawnLightWell: - INC.w $0D80,X ; part of what we wrote over - LDA.w $0D90,X : BNE .specialCutscene + INC.w SpriteActivity,X ; part of what we wrote over + LDA.w SpriteMovement,X : BNE .specialCutscene PLA : PLA : PLA : PEA.w MasterSword_SpawnLightWell_return-1 JML MasterSword_SpawnLightWell ; part of what we wrote over .specialCutscene RTL MasterSword_ConditionalSpawnLightFountain: - INC.w $0D80,X ; part of what we wrote over - LDA.w $0D90,X : BNE .specialCutscene + INC.w SpriteActivity,X ; part of what we wrote over + LDA.w SpriteMovement,X : BNE .specialCutscene PLA : PLA : PLA : PEA.w MasterSword_SpawnLightFountain_return-1 JML MasterSword_SpawnLightFountain ; part of what we wrote over .specialCutscene RTL MasterSword_ConditionalSpawnLightBeam: - LDA.w $0D90,X : BNE .specialCutscene + LDA.w SpriteMovement,X : BNE .specialCutscene LDA.b #$62 : JSL Sprite_SpawnDynamically ; what we wrote over RTL .specialCutscene diff --git a/endingsequence.asm b/endingsequence.asm deleted file mode 100644 index 1603305..0000000 --- a/endingsequence.asm +++ /dev/null @@ -1,22 +0,0 @@ -;================================================================================ -; 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 -;-------------------------------------------------------------------------------- diff --git a/enemizer/DMA.asm b/enemizer/DMA.asm new file mode 100644 index 0000000..2df1eff --- /dev/null +++ b/enemizer/DMA.asm @@ -0,0 +1,72 @@ +!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 $ + LDA.b : STA.w !VRAM_LOW_REG ; Set VRAM destination address low byte + LDA.b : 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 $:. + LDA.b + STA.w !DMA0_SRC_LOW_REG ; set src address low byte + LDA.b + STA.w !DMA0_SRC_HIGH_REG ; set src address high byte + LDA.b + STA.w !DMA0_SRC_BANK_REG ; set src address bank byte + + ; total bytes to copy: #$1000 bytes. + LDA.b : STA.w !DMA0_SIZE_LOW_REG ; length low byte + LDA.b : 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 diff --git a/enemizer/NMI.asm b/enemizer/NMI.asm new file mode 100644 index 0000000..4bf6912 --- /dev/null +++ b/enemizer/NMI.asm @@ -0,0 +1,53 @@ +;------------- +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 #$02 : BNE .loadTrinexx + BRA .return ; just in case + ;BIT #$01 : BEQ .loadKholdstare + ;BIT #$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 +} diff --git a/enemizer/blindboss.asm b/enemizer/blindboss.asm index 7e860b5..6978536 100644 --- a/enemizer/blindboss.asm +++ b/enemizer/blindboss.asm @@ -4,10 +4,10 @@ print "Blind Spawn Code Check: ", pc check_blind_boss_room: - LDA $A0 ; load room index (low byte) - CMP #172 : BNE + ; Is is Thieve Town Boss Room - LDA $09DE81 : BEQ + ; Blind maiden does not need rescuing + LDA.b RoomIndex ; load room index (low byte) + CMP.b #172 : BNE + ; Is is Thieves Town Boss Room + LDA.l !BLIND_DOOR_FLAG : BNE + ; Blind maiden does not need rescuing - LDA FollowerIndicator : JML Check_for_Blind_Fight + LDA.l FollowerIndicator : JML Check_for_Blind_Fight + JML Initialize_Blind_Fight diff --git a/enemizer/bossdrop.asm b/enemizer/bossdrop.asm new file mode 100644 index 0000000..5a76831 --- /dev/null +++ b/enemizer/bossdrop.asm @@ -0,0 +1,23 @@ +;================================================================================ +; 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 +} \ No newline at end of file diff --git a/enemizer/bosses_moved.asm b/enemizer/bosses_moved.asm new file mode 100644 index 0000000..0c7f92a --- /dev/null +++ b/enemizer/bosses_moved.asm @@ -0,0 +1,289 @@ +;================================================================================ +; 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 $0468 ; $0468[0x02] - Flag that is set when trap doors are down. + STZ.w $068E ; $068E[0x02] - (Dungeon) ???? related to trap doors and if they are open ; possibly bomb doors too? Update: module 0x07.0x4 probably uses this to know whether it's a key door or big key door to open. + STZ.w $0690 ; $0690[0x02] - (Overworld) Generally is used as an animation step indicator, only for doors that animate when they open, such as the Santuary and Hyrule Castle doors. This variable is incremented up to a value of 3, at which point a logic check kicks in and stops animating the opening of a door. + INC.w $0CF3 ; $0CF3[0x01] - free ram + ; ;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 +;-------------------------------------------------------------------------------- diff --git a/enemizer/bushes.asm b/enemizer/bushes.asm new file mode 100644 index 0000000..0d83575 --- /dev/null +++ b/enemizer/bushes.asm @@ -0,0 +1,45 @@ +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 +} \ No newline at end of file diff --git a/enemizer/bushes_table.asm b/enemizer/bushes_table.asm new file mode 100644 index 0000000..41f75e5 --- /dev/null +++ b/enemizer/bushes_table.asm @@ -0,0 +1,21 @@ +sprite_bush_spawn_table: +{ + ; SPRITE DATA TABLE GENERATED BY ENEMIZER + .overworld + ; Skip 0x128(overworld [way overkill]) + 0x128 (dungeons) + skip $128 + .dungeons + skip $128 + + ;Old sprite table - Could be changed as well (for the item id 04) + .random_sprites ; if item == 04 + db #$00, #$D8, #$E3, #$D8 +} + +warnpc $B68374 +; the drop table has $E1 at B6837D which needs to be #$DA with retro bow +item_drop_table_override: +db #$00, #$D9, #$3E, #$79, #$D9, #$DC, #$D8, #$DA, #$E4, #$E1, #$DC +db #$D8, #$DF, #$E0, #$0B, #$42, #$D3, #$41, #$D4, #$D9, #$E3, #$D8 + + diff --git a/enemizer/damage.asm b/enemizer/damage.asm new file mode 100644 index 0000000..db83803 --- /dev/null +++ b/enemizer/damage.asm @@ -0,0 +1,11 @@ +CheckIfLinkShouldDie: + ; before this we should have: + ; LDA $7EF36D - this gets hooked, but we should have LDA at the end of it + + CMP.b Scrap00 : BCC .dead + SEC : SBC.b Scrap00 + BRA .done + .dead + LDA.b #$00 +.done +RTL diff --git a/enemizer/enemizer_info_table.asm b/enemizer/enemizer_info_table.asm new file mode 100644 index 0000000..c74d285 --- /dev/null +++ b/enemizer/enemizer_info_table.asm @@ -0,0 +1,3 @@ +enemizer_info_table: +skip $100 +; contains information about settings and enemizer version used to generate rom \ No newline at end of file diff --git a/enemizer/enemizerflags.asm b/enemizer/enemizerflags.asm new file mode 100644 index 0000000..e406db7 --- /dev/null +++ b/enemizer/enemizerflags.asm @@ -0,0 +1,45 @@ +; ;Enemizer Flags +EnemizerFlags: +.randomize_bushes +db #$00 ;368100 ; Enable random enemy under bushes +.close_blind_door +db #$00 ;408101 : 200101 ; Enable blind's door closing for other bosses +.moldorm_eye_count +db #$01 ;408102 : 200102 ; Moldorm eye count, default to 2 eyes (1) +.randomize_sprites +db #$00 ;408103 : 200103 ; Randomize Sprites. +.agahnim_fun_balls +db #$00 ;408104 : 200104 ; make Agahnim balls deflect back +.enable_mimic_override +db #$00 ;408105 : 200105 ; toggle mimic code between new and old +; free byte ;408106 : 200106 +db #$00 +.center_boss_drops +db #$00 ;368107 +.killable_theives_id ; must be set to C4 to make thieves killable... +db #$B8 ;368108 +.enemies_live_upon_falling +db #$00 ; 368109 ; when set to 1 enemies don't die when falling into a hole + +db #$00 ;40810A : 20010A +db #$00 ;40810B : 20010B +db #$00 ;40810C : 20010C +db #$00 ;40810D : 20010D +db #$00 ;40810E : 20010E +db #$00 ;40810F : 20010F +db #$00 ;408110 : 200110 +db #$00 ;408111 : 200111 +db #$00 ;408112 : 200112 +db #$00 ;408113 : 200113 +db #$00 ;408114 : 200114 +db #$00 ;408115 : 200115 +db #$00 ;408116 : 200116 +db #$00 ;408117 : 200117 +db #$00 ;408118 : 200118 +db #$00 ;408119 : 200119 +db #$00 ;40811A : 20011A +db #$00 ;40811B : 20011B +db #$00 ;40811C : 20011C +db #$00 ;40811D : 20011D +db #$00 ;40811E : 20011E +db #$00 ;40811F : 20011F diff --git a/enemizer/falling_death.asm b/enemizer/falling_death.asm new file mode 100644 index 0000000..bb8f757 --- /dev/null +++ b/enemizer/falling_death.asm @@ -0,0 +1,16 @@ +pushpc + +org $868536 +JSL CheckFallingDeathFlag + +org $86FBF8 +JSL CheckFallingDeathFlag + +pullpc + +CheckFallingDeathFlag: + LDA.l !ENEMY_FALLING_STAY_ALIVE + BEQ + + RTL + + JML Sprite_ManuallySetDeathFlagUW ; original code + diff --git a/enemizer/gfx/rocks.gfx b/enemizer/gfx/rocks.gfx new file mode 100644 index 0000000..dfb0454 Binary files /dev/null and b/enemizer/gfx/rocks.gfx differ diff --git a/enemizer/gfx/rocks2.gfx b/enemizer/gfx/rocks2.gfx new file mode 100644 index 0000000..9ce92b6 Binary files /dev/null and b/enemizer/gfx/rocks2.gfx differ diff --git a/enemizer/gfx/shell.gfx b/enemizer/gfx/shell.gfx new file mode 100644 index 0000000..c017147 Binary files /dev/null and b/enemizer/gfx/shell.gfx differ diff --git a/enemizer/hooks.asm b/enemizer/hooks.asm index 4cb43b4..31ec286 100644 --- a/enemizer/hooks.asm +++ b/enemizer/hooks.asm @@ -1 +1,19 @@ -incsrc blindboss_hooks.asm \ No newline at end of file +incsrc hooks/NMI_hook.asm + +incsrc hooks/bushes_hooks.asm + +incsrc hooks/bossdrop_hooks.asm + +incsrc hooks/blinddoor_hooks.asm + +incsrc hooks/bosses_hooks.asm + +incsrc hooks/moldorm_hooks.asm + +incsrc hooks/damage_hooks.asm + +incsrc hooks/overworld_sprite_hooks.asm + +incsrc hooks/underworld_sprite_hooks.asm + +incsrc hooks/blindboss_hooks.asm \ No newline at end of file diff --git a/enemizer/hooks/NMI_hook.asm b/enemizer/hooks/NMI_hook.asm new file mode 100644 index 0000000..d33d143 --- /dev/null +++ b/enemizer/hooks/NMI_hook.asm @@ -0,0 +1,9 @@ +;================================================================================ +; NMI Hook +;-------------------------------------------------------------------------------- +; rando already hooks the Bank00.asm : 164 (PHA : PHX : PHY : PHD : PHB) so we have to hook after that +org $8080D0 ; <- D0 - Bank00.asm : 164-167 (PHB, LDA.w #$0000) +JML NMIHookActionEnemizer +org $8080D5 ; <- D5 - Bank00.asm : 164-167 (PHB, LDA.w #$0000) +NMIHookReturnEnemizer: +;-------------------------------------------------------------------------------- diff --git a/enemizer/blindboss_hooks.asm b/enemizer/hooks/blindboss_hooks.asm similarity index 91% rename from enemizer/blindboss_hooks.asm rename to enemizer/hooks/blindboss_hooks.asm index 31985f8..2d67736 100644 --- a/enemizer/blindboss_hooks.asm +++ b/enemizer/hooks/blindboss_hooks.asm @@ -7,7 +7,5 @@ org $9DA081 ; Original Code JML check_blind_boss_room Check_for_Blind_Fight: - - org $9DA090 Initialize_Blind_Fight: \ No newline at end of file diff --git a/enemizer/hooks/blinddoor_hooks.asm b/enemizer/hooks/blinddoor_hooks.asm new file mode 100644 index 0000000..391c63c --- /dev/null +++ b/enemizer/hooks/blinddoor_hooks.asm @@ -0,0 +1,11 @@ +;================================================================================ +; Blind door close +;-------------------------------------------------------------------------------- +; +org $828849 ; Bank02.asm(1588) - original code : JSL $078000 //Hook on player main when transition are over execute player code +JSL check_special_action ;using the variable 7E0CF3 if it not 00 then trap the player in that room +;could be changed easily to support more than only 1 function +;-------------------------------------------------------------------------------- + +org $878000 +Player_Main: diff --git a/enemizer/hooks/bossdrop_hooks.asm b/enemizer/hooks/bossdrop_hooks.asm new file mode 100644 index 0000000..8c275c5 --- /dev/null +++ b/enemizer/hooks/bossdrop_hooks.asm @@ -0,0 +1,6 @@ +;================================================================================ +; Change heart container drop location +;-------------------------------------------------------------------------------- +org $85EF62 +JSL change_heartcontainer_position +;-------------------------------------------------------------------------------- diff --git a/enemizer/hooks/bosses_hooks.asm b/enemizer/hooks/bosses_hooks.asm new file mode 100644 index 0000000..f64c68f --- /dev/null +++ b/enemizer/hooks/bosses_hooks.asm @@ -0,0 +1,41 @@ +; *$4C114-$4C174 LONG +org $89C114 +Dungeon_ResetSprites: ; Bank09.asm(822) + +; *$4C44E-$4C498 LONG +org $89C44E +Sprite_ResetAll: ; Bank09.asm(1344) + +;-------------------------------------------------------------------------------- + +;================================================================================ +; On Room Transition -> Move Sprite depending on the room loaded +;-------------------------------------------------------------------------------- +org $828979 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114 +JSL boss_move +org $828C16 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114 +JSL boss_move +org $829338 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114 +JSL boss_move +org $828256 ; JSL Dungeon_ResetSprites ; REPLACE THAT (Sprite initialization) original jsl : $09C114 +JSL boss_move +;-------------------------------------------------------------------------------- + +;-------------------------------------------------------------------------------- + +;================================================================================ +; Draw kholdstare shell +;-------------------------------------------------------------------------------- +org $8DD97F ; jump point +Kholdstare_Draw: + +org $9E9518 ; sprite_kholdstare.asm (154) : JSL Kholdstare_Draw +JSL new_kholdstare_code ; Write new gfx in the vram +;-------------------------------------------------------------------------------- + +;================================================================================ +; Draw trinexx shell +;-------------------------------------------------------------------------------- +org $1DAD67 ; sprite_trinexx.asm (62) : LDA.b #$03 : STA $0DC0, X +JSL new_trinexx_code : NOP +;-------------------------------------------------------------------------------- diff --git a/enemizer/hooks/bushes_hooks.asm b/enemizer/hooks/bushes_hooks.asm new file mode 100644 index 0000000..e610bbb --- /dev/null +++ b/enemizer/hooks/bushes_hooks.asm @@ -0,0 +1,8 @@ +;================================================================================ +; New bush mob randomization +;-------------------------------------------------------------------------------- +org $868279 +NOP #$0A +JSL sprite_bush_spawn +NOP ; we keep the branch +;-------------------------------------------------------------------------------- diff --git a/enemizer/hooks/damage_hooks.asm b/enemizer/hooks/damage_hooks.asm new file mode 100644 index 0000000..2756622 --- /dev/null +++ b/enemizer/hooks/damage_hooks.asm @@ -0,0 +1,12 @@ +org $8780CA ; Bank07.asm(179) +JSL CheckIfLinkShouldDie : NOP : NOP : NOP +;SEC : SBC.b $00 : CMP #$00 : BEQ .linkIsDead ; Bank07.asm(179) - + +org $8780D1 +BNE linkNotDead : NOP : NOP ; Bank07.asm(183) - CMP.b #$A8 : BCC .linkNotDead + +org $8780D5 +linkIsDead: + +org $8780F7 +linkNotDead: diff --git a/enemizer/hooks/moldorm_hooks.asm b/enemizer/hooks/moldorm_hooks.asm new file mode 100644 index 0000000..ee98cec --- /dev/null +++ b/enemizer/hooks/moldorm_hooks.asm @@ -0,0 +1,20 @@ +; adjust oam position after drawing eyes +;ED88E +org $9DD88E +{ + ; original: GiantMoldorm_Draw+5lines (sprite_giant_moldorm.asm) + ; lda.b $90 : add.w #$0008 : sta.b $90 + ; INC.b $92 : INC.b $92 + + JSL Moldorm_UpdateOamPosition + NOP #08 +} + +; set number of eyes +;org $9DDBB2 ;$0EDBB2 +;{ + ; LDX.b #$01 + ; number of eyes (-1) + ;0EDBB2 0EDBB3 +; LDX.b #$01 +;} diff --git a/enemizer/hooks/overworld_sprite_hooks.asm b/enemizer/hooks/overworld_sprite_hooks.asm new file mode 100644 index 0000000..2af7c8c --- /dev/null +++ b/enemizer/hooks/overworld_sprite_hooks.asm @@ -0,0 +1,54 @@ +org $89C50B ; 0x4C50B +{ + ; .loadData + ; ; $4C50B- + ; STA.b Scrap01 ; 85 01 + ; ; $4C50D- + ; LDY.w #$0000 ; A0 00 00 + JSL LoadOverworldSprites + NOP +} + +org $89C510 ; 0x4C510 +LDA.b [$00], Y ; replace LDA ($00), Y +; CMP.b #$FF : BEQ .stopLoading +; INY #2 +org $89C518 ; 0x4C518 +LDA.b [$00], Y ; replace LDA ($00), Y +; DEY #2 : CMP.b #$F4 : BNE .notFallingRocks +; INC.w $0FFD +; INY #3 +; BRA .nextSprite +; .notFallingRocks ; Anything other than falling rocks. +org $89C528 ; 0x4C528 +LDA.b [$00], Y ; replace LDA ($00), Y +; PHA : LSR #4 : ASL #2 : +org $89C531 ; 0x4C531 +STA.b Scrap0A ; STA.b $02 +; INY +org $89C534 ; 0x4C534 +LDA.b [$00], Y ; replace LDA ($00), Y +; LSR #4 : CLC +org $89C53B ; 0x4C53B +ADC.b Scrap0A ; ADC.b $02 +; STA.b $06 +; PLA : ASL #4 : STA.b $07 +org $89C546 ; 0x4C546 +LDA.b [$00], Y ; replace LDA ($00), Y +; AND.b #$0F : ORA.b $07 : STA.b $05 +; INY +org $89C54F ; 0x4C54F +LDA.b [$00], Y ; replace LDA ($00), Y +; LDX.b $05 : INC A : STA.l $7FDF80, X + + ; ; $4C558- + ; ; Move on to the next sprite / overlord. + ; INY ; C8 + ; ; $4C559- + ; BRA .nextSprite ; 80 B5 + + ; .stopLoading + ; ; $4C55B- + ; SEP #$10 ; E2 10 + ; ; $4C55D- + ; RTS ; 60 diff --git a/enemizer/hooks/underworld_sprite_hooks.asm b/enemizer/hooks/underworld_sprite_hooks.asm new file mode 100644 index 0000000..84b5e3d --- /dev/null +++ b/enemizer/hooks/underworld_sprite_hooks.asm @@ -0,0 +1,67 @@ +org $89C29A +JSL LoadUnderworldSprites : NOP + +; these hooks change the LDA.b ($00) commands to use LDA.b [$00] commands +; so we can store the sprites in a different bank +; also needs to change the use of $02 to $03 for slot index to make that possible + +org $89C2B2 +LDA.b [$00] + +org $89C2C1 +LDA.b [$00],Y + +org $89C2CA +INC.b Scrap03 ; change slot variable to $03 + +;org $09C329 standing items overwrote this one +;LDA.b [$00],Y + +org $89C332 +LDA.b [$00],Y + +org $89C345 +DEC.b Scrap03 : LDX.b Scrap03 + +org $89C350 +LDA.b [$00],Y + +org $89C35A +DEC.b Scrap03 + +org $89C36E +JSL GetSpriteSlot16Bit ; depended on high bit being zero, which it isn't anymore + +org $89C383 +LDX.b Scrap03 + +org $89C38C +LDA.b [$00],Y + +org $89C398 +LDA.b [$00],Y + +org $89C3AA +LDA.b [$00],Y + +org $89C3BF +LDA.b [$00],Y + +org $89C3DF +LDA.b Scrap03 + +org $89C3F3 +LDA.b [$00],Y + +org $89C3FB +LDA.b [$00],Y + +org $89C404 +LDA.b [$00],Y + +org $89C416 +LDA.b [$00],Y + + + + diff --git a/enemizer/kodongo_fixes.asm b/enemizer/kodongo_fixes.asm new file mode 100644 index 0000000..4e983f7 --- /dev/null +++ b/enemizer/kodongo_fixes.asm @@ -0,0 +1,19 @@ +pushpc + +org $9EC147 +JSL NewKodongoCollision +JMP.w .continue : NOP #2 +.continue + +org $9EC152 +Kodongo_SetDirection: + +pullpc + +NewKodongoCollision: + LDA.w SpriteMoveDirection, X : INC A : AND.b #$03 : STA.w SpriteMoveDirection, X + ;If they collide more than 4 times just set direction + LDA.w SpriteAuxTable, X : INC A : STA.w SpriteAuxTable, X : CMP.b #$04 : BCC .continue + PLA : PLA : PEA.w Kodongo_SetDirection-1 +.continue +RTL \ No newline at end of file diff --git a/enemizer/main.asm b/enemizer/main.asm index b24bef1..c49e179 100644 --- a/enemizer/main.asm +++ b/enemizer/main.asm @@ -17,7 +17,10 @@ lorom !RANDOM_SPRITE_FLAG = "$368103" !AGAHNIM_FUN_BALLS = "$368104" !ENABLE_MIMIC_OVERRIDE = "$368105" -!ENABLE_TERRORPIN_AI_FIX = "$368106" +; free byte +!CENTER_BOSS_DROP_FLAG = "$368107" +!KILLABLE_THIEVES_ID = "$368108" +!ENEMY_FALLING_STAY_ALIVE = "$368109" ; Enemizer reserved memory ; $7F50B0 - $7F50BF - Downstream Reserved (Enemizer) @@ -26,10 +29,37 @@ lorom ;================================================================================ incsrc hooks.asm +incsrc DMA.asm -org $B78000 ; the original org is 368000, but I'm putting this here for migration purposes, and I think B6 is the same bank but fastrom +org $B68000 ; the original org is 368000 and B6 is the same bank but fastrom EnemizerTablesStart: -;none migrated yet +incsrc enemizer_info_table.asm ; B68000-B680FF +incsrc enemizerflags.asm ; B68100-B6811F +incsrc bushes_table.asm ; B68120-B6373 EnemizerCodeStart: -incsrc blindboss.asm \ No newline at end of file +incsrc bushes.asm +incsrc NMI.asm +incsrc special_action.asm +incsrc bosses_moved.asm +incsrc damage.asm +incsrc bossdrop.asm +incsrc moldorm.asm +incsrc kodongo_fixes.asm +incsrc mimic_fixes.asm +; vitreous key fix for boss shuffle - uses FixPrizeOnTheEyes flag + +incsrc overworld_sprites.asm +incsrc underworld_sprites.asm + +incsrc blindboss.asm +incsrc falling_death.asm + +incsrc shell_gfx.asm +warnpc $B6FFFF ;if we hit this we need to split stuff by bank + +org $8684BD +Sprite_Get16BitCoords_long: + +org $9EC6FA ;F46FA +SpritePrep_Eyegore: \ No newline at end of file diff --git a/enemizer/mimic_fixes.asm b/enemizer/mimic_fixes.asm new file mode 100644 index 0000000..861ee81 --- /dev/null +++ b/enemizer/mimic_fixes.asm @@ -0,0 +1,110 @@ +pushpc + +org $8691B6 +JSL SpritePrep_EyegoreNew + +org $868839 ; 0xEF +dw SpritePrep_EyegoreNew +dw SpritePrep_EyegoreNew + +;org $869468 ; These need to go else where +;dw #$BFF7 ; SpriteModule_Active_Bank1E_bounce +;dw #$BFF7 ; SpriteModule_Active_Bank1E_bounce + +;org $9E8B21 +;JSL FixVectorForMimics + +;org $9E8BBB ; New vectors for mimics +;dw #$C795 +;dw #$C795 + +org $9EC70D +SpritePrep_Eyegore_become_mimic: + +;org $86EC08 ; Sprite_AttemptZapDamage +;JSL resetSprite_Mimic : NOP + +org $86ED9E ; Sprite_ApplyCalculatedDamage, skip high sprite id early exit +JSL IsItReallyAMimic : NOP + +org $86EDA6 ; Sprite_ApplyCalculatedDamage .not_absorbable +JSL notItemSprite_Mimic + +pullpc + + +;FixVectorForMimics: +; CMP.w $#00EF : BCC .end +; SBC.w #$0032 ; this puts the vector at the unused bytes at UNREACHABLE_1E8BBB +; .end +; AND.w #$00FF ; what we wrote over +; ASL A +;RTL + +; replace SpritePrep_Eyegore if flag is on +SpritePrep_EyegoreNew: +{ + LDA.l !ENABLE_MIMIC_OVERRIDE : BNE .new + ; old + JSL SpritePrep_Eyegore + RTL + + .new + LDA.w SpriteTypeTable, X : CMP.b #$EF : BCS .mimic ;If sprite id >= EF (unused somaria platform) + ; seems unnecessary it's just an rtl? +; JSL $9EC71A ; 0xF471A set eyegore to be only eyegore (.not_goriya?) + RTL + .mimic + SBC.b #$6C : STA.w SpriteTypeTable, X : JSL SpritePrep_LoadProperties ; pretending to be $83 or $84 + JSL SpritePrep_Eyegore_become_mimic +; LDA.w SpriteTypeTable, X : ADC #$6C : STA.w SpriteTypeTable, X ; set the sprite back to special mimic + ; todo? unsure about this code - seems unnecessary +; LDA.w $0CAA, X : AND.b #$FB : ORA.b #$80 : STA.w $0CAA, X ; STZ.w $0CAA, X +RTL +} + +;resetSprite_Mimic: +; LDA.l !ENABLE_MIMIC_OVERRIDE : BEQ .notMimic ; skip to what it would have done normally +; +; LDA.w SpriteTypeTable, X +; CMP.b #$EF : BCC .notMimic +; LDA.w SpriteTypeTable, X : SBC.b #$6C : STA.w SpriteTypeTable, X ; overwrite the sprite id with eyegore id +; +;.notMimic +; restore code +; LDA.w SpriteTypeTable, X : CMP.b #$7A +;RTL + +IsItReallyAMimic: + LDA.l !ENABLE_MIMIC_OVERRIDE : BEQ .continue + LDA.w SpriteTypeTable,X : CMP.b #$EF : BEQ .is_mimic + CMP.b #$F0 : BNE .continue + + .is_mimic + CLC : RTL + + .continue ; code we hijacked + LDA.w SpriteTypeTable,X + CMP.b #$D8 +RTL + +; this is just for killable thieves now +notItemSprite_Mimic: +; if we set killable thief we want to update the sprite id so it can be killed + LDA.w SpriteTypeTable, X + CMP.l !KILLABLE_THIEVES_ID : BNE .continue ; thief #$C4 (default is B8/dialog tester) + + ; if we don't have mimic code turned on we want to skip, but we also need to reload the sprite id because we just smoked it with this LDA +; LDA.l !ENABLE_MIMIC_OVERRIDE : BEQ .reloadSpriteIdAndSkipMimic ; skip to what it would have done normally + +; LDA.w SpriteTypeTable, X ; I hate assembly +; CMP.b #$EF : BCC .continue +; SBC.b #$6C : BRA .continue + +.changeSpriteId + LDA.b #$83 ; load green eyegore sprite id so we can kill the thing + +.continue + ; restore code + REP #$20 : ASL #2 +RTL \ No newline at end of file diff --git a/enemizer/moldorm.asm b/enemizer/moldorm.asm new file mode 100644 index 0000000..6334a65 --- /dev/null +++ b/enemizer/moldorm.asm @@ -0,0 +1,14 @@ +Moldorm_UpdateOamPosition: +{ + PHX + + LDA.l !MOLDORM_EYES_FLAG : TAX + .more_eyes + LDA.b $90 : CLC : ADC.w #$0004 : STA.b $90 + LDA.b $92 : CLC : ADC.w #$0001 : STA.b $92 + DEX : BPL .more_eyes ; X >= 0 + + PLX + + RTL +} diff --git a/enemizer/overworld_sprites.asm b/enemizer/overworld_sprites.asm new file mode 100644 index 0000000..b8d3793 --- /dev/null +++ b/enemizer/overworld_sprites.asm @@ -0,0 +1,8 @@ +LoadOverworldSprites: + ; restore code + STA.b Scrap01 ; 85 01 + LDY.w #$0000 ; A0 00 00 + + ; set bank + LDA.b #$09 : STA.b Scrap02 ; default is bank 9 +RTL \ No newline at end of file diff --git a/enemizer/shell_gfx.asm b/enemizer/shell_gfx.asm new file mode 100644 index 0000000..5ee0ad9 --- /dev/null +++ b/enemizer/shell_gfx.asm @@ -0,0 +1,12 @@ +;================================================================================ +; insert kholdstare & trinexx shell gfx file +;-------------------------------------------------------------------------------- +GFX_Kholdstare_Shell: +incbin gfx/shell.gfx + +GFX_Trinexx_Shell: +incbin gfx/rocks.gfx + +GFX_Trinexx_Shell2: +incbin gfx/rocks2.gfx +;-------------------------------------------------------------------------------- diff --git a/enemizer/special_action.asm b/enemizer/special_action.asm new file mode 100644 index 0000000..2e9b998 --- /dev/null +++ b/enemizer/special_action.asm @@ -0,0 +1,12 @@ +;================================================================================ +; Special action +;================================================================================ +check_special_action: +{ + LDA.w $0CF3 : BEQ .no_special_action + LDA.b #$05 : STA.b GameSubMode ; $11[0x01] - (Main) Submodule Index (See $B0) + STZ.w $0CF3 ; $0CF3[0x01] - free ram + .no_special_action + JSL Player_Main +RTL +} \ No newline at end of file diff --git a/enemizer/underworld_sprites.asm b/enemizer/underworld_sprites.asm new file mode 100644 index 0000000..e802b78 --- /dev/null +++ b/enemizer/underworld_sprites.asm @@ -0,0 +1,11 @@ +LoadUnderworldSprites: + STA.b Scrap00 ; part one of what we replaced + LDA.w #$0028 : STA.b Scrap02 ; set the bank to 28 for now + LDA.w $048E +RTL + +GetSpriteSlot16Bit: + LDA.b Scrap03 : AND.w #$00FF + ASL A + TAY +RTL \ No newline at end of file diff --git a/enemy_adjustments.asm b/enemy_adjustments.asm index ec0411f..f126791 100644 --- a/enemy_adjustments.asm +++ b/enemy_adjustments.asm @@ -3,21 +3,25 @@ ; make sure bats always load LW stats ;-------------------------------------------------------------------------------- NewBatInit: - CPY #$00 : BEQ .light_world + CPY.b #$00 : BEQ .light_world ;check if map id == 240 or 241 - LDA $A0 : CMP #$F0 : BEQ .light_world ;oldman cave1 - CMP #$F1 : BEQ .light_world ;oldman cave2 - CMP #$B0 : BEQ .light_world ;agahnim statue keese - CMP #$D0 : BEQ .light_world ;agahnim darkmaze + LDA.b RoomIndex : CMP.b #$F0 : BEQ .light_world ;oldman cave1 + CMP.b #$F1 : BEQ .light_world ;oldman cave2 + CMP.b #$B0 : BEQ .light_world ;agahnim statue keese + CMP.b #$D0 : BEQ .light_world ;agahnim darkmaze - LDA.b #$85 : STA $0CD2, X - LDA.b #$04 : STA $0E50, X + LDA.b #$85 : STA.w SpriteBump, X + LDA.b #$04 : STA.w SpriteHitPoints, X RTL - .light_world - LDA.b #$80 : STA $0CD2, X - LDA.b #$01 : STA $0E50, X + LDA.b #$80 : STA.w SpriteBump, X + LDA.b #$01 : STA.w SpriteHitPoints, X RTL ;-------------------------------------------------------------------------------- - +NewFireBarDamage: + LDA.b LinkLayer : CMP.w SpriteLayer, X : BNE .NotSameLayer + JSL Sprite_AttemptDamageToPlayerPlusRecoilLong + RTL +.NotSameLayer +RTL diff --git a/entrances.asm b/entrances.asm index 5f67e2c..bdaf1e9 100644 --- a/entrances.asm +++ b/entrances.asm @@ -8,30 +8,30 @@ LockAgahnimDoors: ;#$0 = Never Locked LDA.w #$0000 : RTL + : CMP.w #$0001 : BNE + - LDA ProgressIndicator : AND.w #$000F : CMP.w #$0002 : !BGE .unlock ; if we rescued zelda, skip - JSR.w LockAgahnimDoorsCore : RTL + LDA.l ProgressIndicator : AND.w #$000F : CMP.w #$0002 : !BGE .unlock ; if we rescued zelda, skip + JSR LockAgahnimDoorsCore : RTL + : CMP.w #$0002 : BNE + - JSR.w LockAgahnimDoorsCore : BEQ .unlock + JSR LockAgahnimDoorsCore : BEQ .unlock PHX : PHY SEP #$30 - JSL.l CheckEnoughCrystalsForTower + JSL CheckTowerOpen REP #$30 PLY : PLX !BGE .crystalOrUnlock - LDA #$0001 : RTL + LDA.w #$0001 : RTL .crystalOrUnlock - LDA SwapAgaGanonsTower : AND.w #$00FF : BEQ .unlock + LDA.l SwapAgaGanonsTower : AND.w #$00FF : BEQ .unlock - LDA OverworldEventDataWRAM+$43 : AND.w #$0020 : BNE .unlock ; Check if GT overlay is already on or not - LDA $0308 : AND.w #$0080 : BEQ ++ ;If we are holding an item + LDA.l OverworldEventDataWRAM+$43 : AND.w #$0020 : BNE .unlock ; Check if GT overlay is already on or not + LDA.w AButtonAct : AND.w #$0080 : BEQ ++ ;If we are holding an item .locked - LDA #$0001 : RTL ;Keep the door locked + LDA.w #$0001 : RTL ;Keep the door locked ++ SEP #$30 - JSL $099B6F ;Add tower break seal + JSL AncillaAdd_GTCutscene ;Add tower break seal REP #$30 - LDA #$0001 ;Prevent door from opening that frame otherwise it glitchy + LDA.w #$0001 ;Prevent door from opening that frame otherwise it glitchy RTL + @@ -44,18 +44,18 @@ RTL FlagAgahnimDoor: LDA.l SwapAgaGanonsTower : BEQ .vanilla - LDA OverworldEventDataWRAM+$43 : ORA #$20 : STA OverworldEventDataWRAM+$43 ; activate GT overlay + LDA.l OverworldEventDataWRAM+$43 : ORA.b #$20 : STA.l OverworldEventDataWRAM+$43 ; activate GT overlay .vanilla - LDA.b #$28 : STA.b $72 + LDA.b #$28 : STA.b ScrapBuffer72 RTL ;-------------------------------------------------------------------------------- LockAgahnimDoorsCore: - LDA $22 : CMP.w #1992 : !BLT + ; door too far left, skip + LDA.b LinkPosX : CMP.w #1992 : !BLT + ; door too far left, skip CMP.w #2088 : !BGE + ; door too rat right, skip - LDA $20 : CMP.w #1720 : !BGE + ; door too low, skip + LDA.b LinkPosY : CMP.w #1720 : !BGE + ; door too low, skip LDA.w #$0001 RTS + @@ -65,19 +65,19 @@ RTS SmithDoorCheck: LDA.l SmithTravelsFreely : AND.w #$00FF : BEQ .orig ;If SmithTravelsFreely is set Frog/Smith can enter multi-entrance overworld doors - JML.l Overworld_Entrance_BRANCH_RHO + JML Overworld_Entrance_BRANCH_RHO .orig ; The rest is equivlent to what we overwrote CPX.w #$0076 : !BGE + - JML.l Overworld_Entrance_BRANCH_LAMBDA + JML Overworld_Entrance_BRANCH_LAMBDA + -JML.l Overworld_Entrance_BRANCH_RHO +JML Overworld_Entrance_BRANCH_RHO ;-------------------------------------------------------------------------------- AllowStartFromSingleEntranceCave: ; 16 Bit A, 16 bit XY ; do not need to preserve A or X or Y - LDA StartingEntrance : AND.w #$00FF ; What we wrote over + LDA.l StartingEntrance : AND.w #$00FF ; What we wrote over PHA TAX LDA.l StartingAreaExitOffset, X : AND.w #$00FF @@ -85,49 +85,47 @@ AllowStartFromSingleEntranceCave: BNE + JMP .done + - DEC - STA $00 - ASL #2 : !ADD $00 : ASL #2 ; mult by 20 + STA.b Scrap00 + ASL #2 : !ADD Scrap00 : ASL #2 ; mult by 20 TAX - LDA #$0016 : STA $7EC142 ; Cache the main screen designation - LDA.l StartingAreaExitTable+$05, X : STA $7EC144 ; Cache BG1 V scroll - LDA.l StartingAreaExitTable+$07, X : STA $7EC146 ; Cache BG1 H scroll - LDA.l StartingAreaExitTable+$09, X : !ADD.w #$0010 : STA $7EC148 ; Cache Link's Y coordinate - LDA.l StartingAreaExitTable+$0B, X : STA $7EC14A ; Cache Link's X coordinate - LDA.l StartingAreaExitTable+$0D, X : STA $7EC150 ; Cache Camera Y coord lower bound. - LDA.l StartingAreaExitTable+$0F, X : STA $7EC152 ; Cache Camera X coord lower bound. - LDA.l StartingAreaExitTable+$03, X : STA $7EC14E ; Cache Link VRAM Location + LDA.w #$0016 : STA.l EN_MAINDESQ ; Cache the main screen designation + LDA.l StartingAreaExitTable+$05, X : STA.l EN_BG2VERT ; Cache BG1 V scroll + LDA.l StartingAreaExitTable+$07, X : STA.l EN_BG2HORZ ; Cache BG1 H scroll + LDA.l StartingAreaExitTable+$09, X : !ADD.w #$0010 : STA.l EN_POSY ; Cache Link's Y coordinate + LDA.l StartingAreaExitTable+$0B, X : STA.l EN_POSX ; Cache Link's X coordinate + LDA.l StartingAreaExitTable+$0D, X : STA.l EN_SCROLLATN ; Cache Camera Y coord lower bound. + LDA.l StartingAreaExitTable+$0F, X : STA.l EN_SCROLLATW ; Cache Camera X coord lower bound. + LDA.l StartingAreaExitTable+$03, X : STA.l EN_OWTMAPI ; Cache Link VRAM Location ; Handle the 2 "unknown" bytes, which control what area of the backgound ; relative to the camera? gets loaded with new tile data as the player moves around ; (because some overworld areas like Kak are too big for a single VRAM tilemap) LDA.l StartingAreaExitTable+$11, X : AND.w #$00FF - BIT.w #$0080 : BEQ + : ORA #$FF00 : + ; Sign extend - STA.l $7EC16A + BIT.w #$0080 : BEQ + : ORA.w #$FF00 : + ; Sign extend + STA.l EN_SCRMODYA LDA.l StartingAreaExitTable+$12, X : AND.w #$00FF - BIT.w #$0080 : BEQ + : ORA #$FF00 : + ; Sign extend - STA.l $7EC16E + BIT.w #$0080 : BEQ + : ORA.w #$FF00 : + ; Sign extend + STA.l EN_SCRMODXA - LDA.w #$0000 : !SUB.l $7EC16A : STA $7EC16C - LDA.w #$0000 : !SUB.l $7EC16E : STA $7EC170 + LDA.w #$0000 : !SUB.l EN_SCRMODYA : STA.l EN_SCRMODYB + LDA.w #$0000 : !SUB.l EN_SCRMODXA : STA.l EN_SCRMODXB LDA.l StartingAreaExitTable+$02, X : AND.w #$00FF - STA $7EC14C ; Cache the overworld area number - STA $7EC140 ; Cache the aux overworld area number + STA.l EN_OWSCR ; Cache the overworld area number + STA.l EN_OWSCR2 ; Cache the aux overworld area number - STZ $0698 ;zero out door overlays in case starting overworld door is not set - STZ $0699 ;zero out door overlays in case starting overworld door is not set + STZ.w TileMapTile32 ;zero out door overlays in case starting overworld door is not set + STZ.w TileMapTile32+1 ;zero out door overlays in case starting overworld door is not set SEP #$20 ; set 8-bit accumulator - LDA StartingEntrance : TAX - LDA.l StartingAreaOverworldDoor, X : STA.l $7F5099 ;Load overworld door - + LDA.l StartingEntrance : TAX + LDA.l StartingAreaOverworldDoor, X : STA.l PreviousOverworldDoor ;Load overworld door REP #$20 ; reset 16-bit accumulator - JSL.l CacheDoorFrameData + JSL CacheDoorFrameData .done PLA @@ -135,50 +133,50 @@ RTL ;-------------------------------------------------------------------------------- AllowStartFromExit: - LDX $1CE8 + LDX.w MessageCursor LDA.l ShouldStartatExit, X : BNE .doStart LDA.l StartingEntrance ; what we wrote over -JML.l AllowStartFromExitReturn +JML AllowStartFromExitReturn .doStart - LDA.l $028481, X ;Module_LocationMenu_starting_points + LDA.l Module1B_SpawnSelect_spawns, X ASL : TAX - LDA.l $02D8D2, X : STA $A0 - LDA.l $02D8D3, X : STA $A1 + LDA.l SpawnPointData_room_id, X : STA.b RoomIndex + LDA.l SpawnPointData_room_id+1, X : STA.b RoomIndex+1 ; Go to pre-overworld mode - LDA.b #$08 : STA $10 + LDA.b #$08 : STA.b GameMode - STZ $11 - STZ $B0 + STZ.b GameSubMode + STZ.b SubSubModule + STZ.w DeathReloadFlag + STZ.w RespawnFlag + INC.w UpdateHUDFlag - STZ $010A - - STZ $04AA JSL Equipment_SearchForEquippedItemLong - JSL HUD_RebuildLong2 - JSL $0DDD32 ; Equipment_UpdateEquippedItemLong + JSL HUD_RebuildIndoor_Palace + JSL Equipment_UpdateEquippedItemLong RTL ;-------------------------------------------------------------------------------- CheckHole: LDX.w #$0024 .nextHoleClassic - LDA.b $00 : CMP.l $1BB800, X + LDA.b Scrap00 : CMP.l Overworld_GetPitDestination_map16, X BNE .wrongMap16Classic - LDA.w $040A : CMP.l $1BB826, X + LDA.b OverworldIndex : CMP.l Overworld_GetPitDestination_screen, X BEQ .matchedHoleClassic .wrongMap16Classic DEX #2 : BPL .nextHoleClassic LDX.w #$001E .nextHoleExtra - LDA.b $00 : CMP.l ExtraHole_Map16, X + LDA.b Scrap00 : CMP.l ExtraHole_Map16, X BNE .wrongMap16Extra - LDA.w $040A : CMP.l ExtraHole_Area, X + LDA.b OverworldIndex : CMP.l ExtraHole_Area, X BEQ .matchedHoleExtra .wrongMap16Extra DEX #2 : BPL .nextHoleExtra @@ -189,42 +187,42 @@ CheckHole: .matchedHoleExtra SEP #$30 TXA : LSR A : TAX - LDA.l ExtraHole_Entrance, X : STA.w $010E : STZ.w $010F + LDA.l ExtraHole_Entrance, X : STA.w EntranceIndex : STZ.w EntranceIndex+1 JML Overworld_Hole_End ;-------------------------------------------------------------------------------- PreventEnterOnBonk: - STA $00 ; part of what we wrote over - LDA.b $8A : TAX : LDA.l OWTileMapAlt, X : AND.w #$0001 : BEQ .done - LDA.l $5D : AND.w #$00FF : CMP.w #$0014 : BNE .done ;in mirror mode? - LDA.b $8A : TAX : LDA.l OWTileWorldAssoc, X : AND.w #$00FF : CMP $7B : BEQ .done ; Are we bonking, or doing the superbunny glitch? + STA.b Scrap00 ; part of what we wrote over + LDA.b OverworldIndex : TAX : LDA.l OWTileMapAlt, X : AND.w #$0001 : BEQ .done + LDA.b LinkState : AND.w #$00FF : CMP.w #$0014 : BNE .done ;in mirror mode? + LDA.b OverworldIndex : TAX : LDA.l OWTileWorldAssoc, X : AND.w #$00FF : CMP.b WorldCache : BEQ .done ; Are we bonking, or doing the superbunny glitch? ; If in inverted, are in mirror mode, and are bonking then do not enter - JML.l PreventEnterOnBonk_BRANCH_IX + JML PreventEnterOnBonk_BRANCH_IX .done LDX.w #$0102 ; rest of what we wrote over -JML.l PreventEnterOnBonk_return +JML PreventEnterOnBonk_return ;-------------------------------------------------------------------------------- TurtleRockEntranceFix: - LDA TurtleRockAutoOpenFix : BEQ .done - LDA $8A : CMP.b #$47 : BNE .done + LDA.l TurtleRockAutoOpenFix : BEQ .done + LDA.b OverworldIndex : CMP.b #$47 : BNE .done ;If exiting to turtle rock ensure the entrance is open LDA.l OverworldEventDataWRAM+$47 : ORA.b #$20 : STA.l OverworldEventDataWRAM+$47 .done RTL ;-------------------------------------------------------------------------------- AnimatedEntranceFix: ;when an entrance animation tries to start - PHA : PHX + PHA LDA.l InvertedMode : BEQ + ;If we are in inverted mode - LDA.l OWMode+1 : AND.b #!FLAG_OW_MIXED : BNE + ;If we are in Mixed OW shuffle mode - LDA $8A : AND #$40 : BNE + ;and in the light world - PLX : PLA - STZ $04C6 ; skip it. - LDA #$00 - RTL + LDA.l OWMode+1 : AND.b #!FLAG_OW_MIXED : BNE + ;If we are in Mixed OW shuffle mode + LDA.b OverworldIndex : AND.b #$40 : BNE + ;and in the light world + PLA + STZ.w OWEntranceCutscene ; skip it. + LDA.b #$00 + RTL + - PLX : PLA - STA $02E4 ;what we wrote over - STA $0FC1 ;what we wrote over - STA $0710 ;what we wrote over + PLA + STA.w CutsceneFlag ;what we wrote over + STA.w FreezeSprites ;what we wrote over + STA.w SkipOAM ;what we wrote over RTL diff --git a/events.asm b/events.asm index b9814d9..a1df980 100644 --- a/events.asm +++ b/events.asm @@ -1,71 +1,76 @@ -;-------------------------------------------------------------------------------- -; OnLoadOW -;-------------------------------------------------------------------------------- -;OnLoadMap: -; LDA OverworldEventDataWRAM+$5B ; thing we wrote over -;RTL -;-------------------------------------------------------------------------------- OnPrepFileSelect: - LDA $11 : CMP.b #$03 : BNE + - LDA.b #$06 : STA $14 ; thing we wrote over - RTL - + - JSL.l LoadAlphabetTilemap - JML.l LoadFullItemTiles + LDA.b GameSubMode : CMP.b #$03 : BNE + + LDA.b #$06 : STA.b NMISTRIPES ; thing we wrote over + RTL + + + PHA : PHX + REP #$10 + JSL LoadAlphabetTilemap + JSL LoadFullItemTiles + SEP #$10 + PLX : PLA +RTL ;-------------------------------------------------------------------------------- OnDrawHud: - JSL.l DrawChallengeTimer ; this has to come before NewDrawHud because the timer overwrites the compass counter - JSL.l DrHudOverride - JSL.l NewDrawHud - JSL.l SwapSpriteIfNecessary - JSL.l CuccoStorm - JSL.l PollService -JML.l ReturnFromOnDrawHud + JSL DrawChallengeTimer ; this has to come before NewDrawHud because the timer overwrites the compass counter + JSL NewDrawHud + JSL DrHudOverride + JSL SwapSpriteIfNecessary + JSL CuccoStorm + JSL PollService +JML ReturnFromOnDrawHud ;-------------------------------------------------------------------------------- OnDungeonEntrance: - STA $7EC172 ; thing we wrote over - JSL MaybeFlagCompassTotalEntrance + STA.l PegColor ; thing we wrote over + JSL MaybeFlagDungeonTotalsEntrance + INC.w UpdateHUDFlag +RTL +;-------------------------------------------------------------------------------- +OnDungeonBossExit: + JSL StatTransitionCounter RTL ;-------------------------------------------------------------------------------- OnPlayerDead: PHA - JSL.l SetDeathWorldChecked - JSL.l SetSilverBowMode - JSL.l RefreshRainAmmo + JSL SetDeathWorldChecked + JSL SetSilverBowMode + JSL RefreshRainAmmo PLA RTL ;-------------------------------------------------------------------------------- OnDungeonExit: - PHA : PHP - SEP #$20 ; set 8-bit accumulator - JSL.l SQEGFix - PLP : PLA + PHA : PHP + SEP #$20 ; set 8-bit accumulator + JSL SQEGFix + PLP : PLA - STA $040C : STZ $04AC ; thing we wrote over + STA.w DungeonID : STZ.w Map16ChangeIndex ; thing we wrote over - PHA : PHP - JSL.l HUD_RebuildLong - JSL.l FloodGateResetInner - JSL.l SetSilverBowMode - PLP : PLA + PHA : PHP + INC.w UpdateHUDFlag + JSL HUD_RebuildLong + JSL FloodGateResetInner + JSL SetSilverBowMode + PLP : PLA RTL ;-------------------------------------------------------------------------------- OnQuit: - JSL.l SQEGFix - LDA.b #$00 : STA $7F5035 ; bandaid patch bug with mirroring away from text - LDA.b #$10 : STA $1C ; thing we wrote over + JSL SQEGFix + LDA.b #$00 : STA.l AltTextFlag ; bandaid patch bug with mirroring away from text + LDA.b #$10 : STA.b MAINDESQ ; thing we wrote over RTL ;-------------------------------------------------------------------------------- OnUncleItemGet: PHA - LDA.l EscapeAssist - BIT.b #$04 : BEQ + : STA !INFINITE_MAGIC : + - BIT.b #$02 : BEQ + : STA !INFINITE_BOMBS : + - BIT.b #$01 : BEQ + : STA !INFINITE_ARROWS : + - LDA UncleItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID + LDA.l EscapeAssist + BIT.b #$04 : BEQ + : STA.l InfiniteMagic : + + BIT.b #$02 : BEQ + : STA.l InfiniteBombs : + + BIT.b #$01 : BEQ + : STA.l InfiniteArrows : + + + LDA.l UncleItem_Player : STA.l !MULTIWORLD_ITEM_PLAYER_ID PLA - JSL.l Link_ReceiveItem + JSL Link_ReceiveItem LDA.l UncleRefill : BIT.b #$04 : BEQ + : LDA.b #$80 : STA.l MagicFiller : + ; refill magic LDA.l UncleRefill : BIT.b #$02 : BEQ + : LDA.b #50 : STA.l BombsFiller : + ; refill bombs @@ -83,26 +88,44 @@ OnUncleItemGet: + RTL ;-------------------------------------------------------------------------------- +OnAga1Defeated: + STA.l ProgressIndicator ; vanilla game state stuff we overwrote + LDA.l GanonVulnerableMode + CMP.b #$06 : BNE + + .light_speed + REP #$20 + LDA.w #$0019 : STA.b GameMode + SEP #$20 + + + LDA.b #$08 : CMP.w DungeonID : BNE + + ORA.l DungeonsCompleted+1 : STA.l DungeonsCompleted+1 + + +.exit +RTL +;-------------------------------------------------------------------------------- OnAga2Defeated: - JSL.l Dungeon_SaveRoomData_justKeys ; thing we wrote over, make sure this is first + JSL Dungeon_SaveRoomData_justKeys ; thing we wrote over, make sure this is first LDA.b #$01 : STA.l Aga2Duck - JML.l IncrementAgahnim2Sword + LDA.w DungeonID : CMP.b #$1A : BNE + + LDA.l DungeonsCompleted : ORA.b #$04 : STA.l DungeonsCompleted + + + LDA.b #$FF : STA.w DungeonID + JML IncrementAgahnim2Sword ;-------------------------------------------------------------------------------- OnFileCreation: - ; Copy initial SRAM state from ROM to cart SRAM PHB - LDA.w #$03D7 ; \ - LDX.w #$B000 ; | Copies from beginning of inital sram table up to file name - LDY.w #$0000 ; | (exclusively) - MVN $70, $30 ; / - ; Skip file name and validity value - LDA.w #$010C ; \ - LDX.w #$B3E3 ; | Rando-Specific Assignments & Game Stats block - LDY.w #$03E3 ; | - MVN $70, $30 ; / + LDA.w #$03D7 + LDX.w #$B000 + LDY.w #$0000 + MVN CartridgeSRAM>>16, InitSRAMTable>>16 + ; Skip file name and validity value + LDA.w #$010C + LDX.w #$B3E3 + LDY.w #$03E3 + MVN CartridgeSRAM>>16, InitSRAMTable>>16 PLB - ; resolve instant post-aga if standard + ; Resolve instant post-aga if standard SEP #$20 LDA.l InitProgressIndicator : BIT #$80 : BEQ + LDA.b #$00 : STA.l ProgressIndicatorSRAM ; set post-aga after zelda rescue @@ -110,43 +133,39 @@ OnFileCreation: + REP #$20 - ; Set validity value and do some cleanup. Jump to checksum. - LDA.w #$55AA : STA.l $7003E1 - STZ $00 - STZ $01 - LDX.b $00 - LDY.w #$0000 - TYA + ; Set validity value and do some cleanup. Jump to checksum done. + LDA.w #$55AA : STA.l FileValiditySRAM + JSL WriteSaveChecksumAndBackup + STZ.b Scrap00 + STZ.b Scrap01 -JML.l InitializeSaveFile_build_checksum +JML InitializeSaveFile_checksum_done ;-------------------------------------------------------------------------------- -!RNG_ITEM_LOCK_IN = "$7F5090" OnFileLoad: REP #$10 ; set 16 bit index registers - JSL.l EnableForceBlank ; what we wrote over - REP #$20 : LDA.l $30F010 : STA.l MultiClientFlagsWRAM+1 : SEP #$20 - LDA MultiClientFlagsROM : STA.l MultiClientFlagsWRAM + JSL EnableForceBlank ; what we wrote over + REP #$20 : LDA.l TotalItemCount : STA.l MultiClientFlagsWRAM+1 : SEP #$20 + LDA.l MultiClientFlagsROM : STA.l MultiClientFlagsWRAM - LDA.b #$07 : STA $210C ; Restore screen 3 to normal tile area + LDA.b #$07 : STA.w BG34NBA ; Restore screen 3 to normal tile area LDA.l FileMarker : BNE + - JSL.l OnNewFile + JSL OnNewFile LDA.b #$FF : STA.l FileMarker + - LDA.w $010A : BNE + ; don't adjust the worlds for "continue" or "save-continue" - LDA.l $7EC011 : BNE + ; don't adjust worlds if mosiac is enabled (Read: mirroring in dungeon) - JSL.l DoWorldFix + LDA.w DeathReloadFlag : BNE + ; don't adjust the worlds for "continue" or "save-continue" + LDA.l MosaicLevel : BNE + ; don't adjust worlds if mosiac is enabled (Read: mirroring in dungeon) + JSL DoWorldFix + - JSL.l MasterSwordFollowerClear - LDA.b #$FF : STA !RNG_ITEM_LOCK_IN ; reset rng item lock-in - LDA.b #$00 : STA $7F5001 ; mark fake flipper softlock as impossible + JSL MasterSwordFollowerClear + LDA.b #$FF : STA.l RNGLockIn ; reset rng item lock-in LDA.l GenericKeys : BEQ + LDA.l CurrentGenericKeys : STA.l CurrentSmallKeys ; copy generic keys to key counter + - JSL.l SetSilverBowMode - JSL.l RefreshRainAmmo - JSL.l SetEscapeAssist + JSL SetSilverBowMode + JSL RefreshRainAmmo + JSL SetEscapeAssist LDA.l IsEncrypted : CMP.b #01 : BNE + JSL LoadStaticDecryptionKey @@ -154,117 +173,141 @@ OnFileLoad: SEP #$10 ; restore 8 bit index registers RTL ;-------------------------------------------------------------------------------- -!RNG_ITEM_LOCK_IN = "$7F5090" OnNewFile: PHX : PHP ; reset some values on new file that are otherwise only reset on hard reset SEP #$20 ; set 8-bit accumulator - STZ $03C4 ; ancilla slot index - STZ $047A ; EG - STZ $0B08 : STZ $0B09 ; arc variable - STZ $0CFB ; enemies killed (pull trees) - STZ $0CFC ; times taken damage (pull trees) - STZ $0FC7 : STZ $0FC8 : STZ $0FC9 : STZ $0FCA : STZ $0FCB : STZ $0FCC : STZ $0FCD ; prize packs - LDA #$00 : STA $7EC011 ; mosaic - JSL InitRNGPointerTable ; boss RNG + STZ.w AncillaSearch + STZ.w LayerAdjustment ; EG + STZ.w ArcVariable : STZ.w ArcVariable+1 + STZ.w TreePullKills + STZ.w TreePullHits + STZ.w PrizePackIndexes + STZ.w PrizePackIndexes+1 + STZ.w PrizePackIndexes+2 + STZ.w PrizePackIndexes+3 + STZ.w PrizePackIndexes+4 + STZ.w PrizePackIndexes+5 + STZ.w PrizePackIndexes+6 + LDA.b #$00 : STA.l MosaicLevel + JSL InitRNGPointerTable PLP : PLX RTL ;-------------------------------------------------------------------------------- OnInitFileSelect: - ; LDA.b #$10 : STA $BC ; init sprite pointer - does nothing unless spriteswap.asm is included - ; JSL.l SpriteSwap_SetSprite - LDA.b #$51 : STA $0AA2 ;<-- Line missing from JP1.0, needed to ensure "extra" copy of naming screen graphics are loaded. - JSL.l EnableForceBlank + LDA.b #$51 : STA.w $0AA2 ;<-- Line missing from JP1.0, needed to ensure "extra" copy of naming screen graphics are loaded. + JSL EnableForceBlank RTL ;-------------------------------------------------------------------------------- OnLinkDamaged: - JSL.l IncrementDamageTakenCounter_Arb - ;JSL.l FlipperKill - JML.l OHKOTimer - + JSL IncrementDamageTakenCounter_Arb + JML OHKOTimer ;-------------------------------------------------------------------------------- -OnEnterWater: - JSL.l RegisterWaterEntryScreen - - JSL.l MysteryWaterFunction - LDX.b #$04 -RTL +;OnEnterWater: +; JSL UnequipCapeQuiet ; what we wrote over +;RTL ;-------------------------------------------------------------------------------- OnLinkDamagedFromPit: - JSL.l OHKOTimer + JSL OHKOTimer LDA.l AllowAccidentalMajorGlitch BEQ ++ --- LDA.b #$14 : STA $11 ; thing we wrote over +-- LDA.b #$14 : STA.b GameSubMode ; thing we wrote over RTL -++ LDA.b $10 : CMP.b #$12 : BNE -- +++ LDA.b GameMode : CMP.b #$12 : BNE -- - STZ.b $11 + STZ.b GameSubMode RTL ;-------------------------------------------------------------------------------- OnLinkDamagedFromPitOutdoors: - JML.l OHKOTimer ; make sure this is last - + JML OHKOTimer ; make sure this is last ;-------------------------------------------------------------------------------- -!RNG_ITEM_LOCK_IN = "$7F5090" OnOWTransition: - JSL.l FloodGateReset - JSL.l FlipperFlag - JSL.l StatTransitionCounter - PHP - SEP #$20 ; set 8-bit accumulator - LDA.b #$FF : STA !RNG_ITEM_LOCK_IN ; clear lock-in - PLP + JSL FloodGateReset + JSL StatTransitionCounter + PHP + SEP #$20 ; set 8-bit accumulator + LDA.b #$FF : STA.l RNGLockIn ; clear lock-in + INC.w UpdateHUDFlag + PLP RTL ;-------------------------------------------------------------------------------- -!DARK_DUCK_TEMP = "$7F509C" OnLoadDuckMap: - LDA !DARK_DUCK_TEMP + LDA.l DuckMapFlag BNE + - INC : STA !DARK_DUCK_TEMP - JSL OverworldMap_InitGfx : DEC $0200 - + INC : STA.l DuckMapFlag + JSL OverworldMap_InitGfx : DEC.w SubModuleInterface RTL + - LDA.b #$00 : STA !DARK_DUCK_TEMP + LDA.b #$00 : STA.l DuckMapFlag JML OverworldMap_DarkWorldTilemap - ;-------------------------------------------------------------------------------- PreItemGet: - LDA.b #$01 : STA !ITEM_BUSY ; mark item as busy + LDA.b #$01 : STA.l BusyItem ; mark item as busy RTL ;-------------------------------------------------------------------------------- PostItemGet: - + STZ.w ProgressiveFlag + LDA.w ItemReceiptMethod : CMP.b #$01 : BEQ + + LDX.w CurrentSpriteSlot + STZ.w SpriteMetaData,X + + RTL ;-------------------------------------------------------------------------------- PostItemAnimation: - LDA.b #$00 : STA !ITEM_BUSY ; mark item as finished + PHB + LDA.b #$00 : STA.l BusyItem ; mark item as finished + LDA.l TextBoxDefer : BEQ + + STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer + JSL Main_ShowTextMessage_Alt + LDA.b #$00 : STA.l TextBoxDefer + + - LDA $7F509F : BEQ + - STZ $1CF0 : STZ $1CF1 ; reset decompression buffer - JSL.l Main_ShowTextMessage_Alt - LDA.b #$00 : STA $7F509F - + + LDA.b IndoorsFlag : BEQ + + REP #$20 : LDA.b RoomIndex : STA.l !MULTIWORLD_ROOMID : SEP #$20 + LDA.w RoomItemsTaken : STA.l !MULTIWORLD_ROOMDATA + + - LDA $1B : BEQ + - REP #$20 : LDA $A0 : STA !MULTIWORLD_ROOMID : SEP #$20 - LDA $0403 : STA !MULTIWORLD_ROOMDATA - + + LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BEQ + + STZ.w ItemReceiptMethod + LDA.b #$00 : STA.l !MULTIWORLD_ITEM_PLAYER_ID + PLB + JML Ancilla_ReceiveItem_objectFinished + + - LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ + - STZ $02E9 - LDA #$00 : STA !MULTIWORLD_ITEM_PLAYER_ID - JML.l Ancilla_ReceiveItem_objectFinished - + + LDA.w ItemReceiptMethod : CMP.b #$01 : BNE + + LDA.b LinkDirection : BEQ + + JSL IncrementChestTurnCounter + + + REP #$20 + PEA.w $7E00 + PLB : PLB + LDA.w TransparencyFlag : BNE .SP05 + LDA.l PalettesCustom_off_black+$00 : STA.w PaletteBuffer+$0170 : STA.w PaletteBufferAux+$0170 + LDA.l PalettesCustom_off_black+$02 : STA.w PaletteBuffer+$0172 : STA.w PaletteBufferAux+$0172 + STA.w PaletteBuffer+$0174 : STA.w PaletteBufferAux+$0174 + STA.w PaletteBuffer+$0176 : STA.w PaletteBufferAux+$0176 + STA.w PaletteBuffer+$0178 : STA.w PaletteBufferAux+$0178 + STA.w PaletteBuffer+$017A : STA.w PaletteBufferAux+$017A + STA.w PaletteBuffer+$017C : STA.w PaletteBufferAux+$017C + STA.w PaletteBuffer+$017E : STA.w PaletteBufferAux+$017E + BRA .done + .SP05 + LDA.l PalettesCustom_off_black+$00 : STA.w PaletteBuffer+$01B0 : STA.w PaletteBufferAux+$01B0 + LDA.l PalettesCustom_off_black+$02 : STA.w PaletteBuffer+$01B2 : STA.w PaletteBufferAux+$01B2 + STA.w PaletteBuffer+$01B4 : STA.w PaletteBufferAux+$01B4 + STA.w PaletteBuffer+$01B6 : STA.w PaletteBufferAux+$01B6 + STA.w PaletteBuffer+$01B8 : STA.w PaletteBufferAux+$01B8 + STA.w PaletteBuffer+$01BA : STA.w PaletteBufferAux+$01BA + STA.w PaletteBuffer+$01BC : STA.w PaletteBufferAux+$01BC + STA.w PaletteBuffer+$01BE : STA.w PaletteBufferAux+$01BE + .done + INC.b NMICGRAM + SEP #$20 - LDA.w $02E9 : CMP.b #$01 : BNE + - LDA.b $2F : BEQ + - JSL.l IncrementChestTurnCounter - + - - STZ $02E9 : LDA $0C5E, X ; thing we wrote over to get here - JML.l Ancilla_ReceiveItem_optimus+6 + STZ.w ItemReceiptMethod : LDA.w AncillaGet, X ; thing we wrote over to get here + PLB +JML Ancilla_ReceiveItem_optimus+6 ;-------------------------------------------------------------------------------- diff --git a/externalhooks.asm b/externalhooks.asm index c3f751e..aec6a49 100644 --- a/externalhooks.asm +++ b/externalhooks.asm @@ -1,4 +1,4 @@ -org $298000 ; 0x148000 +org $A98000 ; 0x148000 Ext_OnFileCreate: ;x RTL : RTL : RTL : RTL : RTL Ext_OnFileLoad: ;x immediately after load diff --git a/failure.asm b/failure.asm index 863c557..763ef79 100644 --- a/failure.asm +++ b/failure.asm @@ -1,9 +1,24 @@ +CheckZSNES: + SEP #$28 + LDA.b #$FF + CLC + ADC.b #$FF + CMP.b #$64 + REP #$28 + BEQ .zsnes + LDA.w #$01FF : TCS ; thing we wrote over - initialize stack + JML ReturnCheckZSNES +.zsnes + JML DontUseZSNES + +;=================================================================================================== + pushtable -table "bsodencode.txt" +table "data/bsodencode.txt" ; Uncomment this to force a crash to test message -;pushpc : org $008132 : db 0 : pullpc +; pushpc : org $008132 : db 0 : pullpc ;=================================================================================================== @@ -11,29 +26,29 @@ DontUseZSNES: SEP #$35 ; sets carry and I flag too LDA.b #$00 - STA.l $4200 ; disable NMI and IRQ - STA.l $420C ; disable HDMA + STA.l NMITIMEN ; disable NMI and IRQ + STA.l HDMAEN ; disable HDMA ROR ; A = 0x80 from carry - STA.l $2100 - STA.l $2115 + STA.l INIDISP + STA.l VMAIN ; Empty VRAM - LDA.b #AllZeros>>16 : STA.l $4304 + LDA.b #AllZeros>>16 : STA.l A1B0 REP #$20 LDA.w #AllZeros - STA.l $4302 + STA.l A1T0L LDA.w #$1809 - STA.l $4300 + STA.l DMAP0 LDA.w #$0000 - STA.l $4305 + STA.l DAS0L LDA.w #$0001 - STA.l $420B + STA.l MDMAEN JSR ConfigurePPUForFailureReport JSR ConfigureBSODVWF @@ -43,7 +58,7 @@ DontUseZSNES: JSR DrawVWFMessage LDA.w #$0F0F - STA.w $2100 + STA.w INIDISP -- BRA -- @@ -77,29 +92,29 @@ Crashed: SEP #$35 ; sets carry and I flag too LDA.b #$00 - STA.l $4200 ; disable NMI and IRQ - STA.l $420C ; disable HDMA + STA.l NMITIMEN ; disable NMI and IRQ + STA.l HDMAEN ; disable HDMA ROR ; A = 0x80 from carry - STA.l $2100 - STA.l $2115 + STA.l INIDISP + STA.l VMAIN ; Empty VRAM - LDA.b #AllZeros>>16 : STA.l $4304 + LDA.b #AllZeros>>16 : STA.l A1B0 REP #$38 LDA.w #AllZeros - STA.l $4302 + STA.l A1T0L LDA.w #$1809 - STA.l $4300 + STA.l DMAP0 LDA.w #$0000 - STA.l $4305 + STA.l DAS0L LDA.w #$0001 - STA.l $420B + STA.l MDMAEN ;=================================================================================================== @@ -113,32 +128,32 @@ Crashed: ; stack pointer LDA.w #$0C38>>1 - STA.b $2116 + STA.b VMADDL TSC XBA AND.w #$00FF ORA.w #$0100 - STA.b $2118 + STA.b VMDATAL TSC AND.w #$00FF ORA.w #$0100 - STA.l $2118 + STA.l VMDATAL ; game module LDA.w #$0C78>>1 - STA.b $2116 + STA.b VMADDL - LDA.l $10 + LDA.l GameMode AND.w #$00FF ORA.w #$0100 - STA.b $2118 + STA.b VMDATAL - LDA.l $11 + LDA.l GameSubMode AND.w #$00FF ORA.w #$0100 - STA.b $2118 + STA.b VMDATAL ;--------------------------------------------------------------------------------------------------- @@ -176,7 +191,7 @@ Crashed: .next_row STA.l $7F0004 - STA.b $2116 + STA.b VMADDL LDY.w #20 @@ -194,7 +209,7 @@ Crashed: AND.w #$01FF .in_stack - STA.b $2118 + STA.b VMDATAL DEX TXA @@ -235,16 +250,10 @@ Crashed: JSR DrawVWFMessage LDA.w #$0F0F - STA.w $2100 + STA.w INIDISP -- BRA -- -; LDA.w #$0000 -; TCD -; -; TSC - - BSODMessage: db "A fatal error has occurred and resulted in an", $80 db "unrecoverable crash. ?", $80 @@ -260,11 +269,11 @@ BSODMessage: ;=================================================================================================== DrawVWFMessage: - STA.b $06 + STA.b Scrap06 .next - LDA.b ($06) - INC.b $06 + LDA.b (Scrap06) + INC.b Scrap06 AND.w #$00FF CMP.w #$0080 BEQ .done_row @@ -284,26 +293,26 @@ DrawVWFMessage: ASL TAX LDA.w .row_offset,X - STA.w $2116 + STA.w VMADDL INC.b VWFR LDA.w #$1800 - STA.w $4300 + STA.w DMAP0 LDA.w #20*16 - STA.w $4305 + STA.w DAS0L LDA.w #$1000 - STA.w $4302 + STA.w A1T0L SEP #$20 - STZ.w $2115 - STZ.w $4304 + STZ.w VMAIN + STZ.w A1B0 LDA.b #$01 - STA.w $420B + STA.w MDMAEN REP #$20 @@ -347,7 +356,7 @@ DrawFailureVWFChar: ASL ASL ADC.w #BSODFontGFX - STA.b $08 + STA.b Scrap08 LDA.b VWFP AND.w #$FFF8 @@ -402,23 +411,23 @@ LoadBSODHexFont: REP #$20 LDA.w #BSODHex - STA.w $4302 + STA.w A1T0L LDA.w #$1801 - STA.w $4300 + STA.w DMAP0 LDA.w #$1000 - STA.w $4305 + STA.w DAS0L LDA.w #$2800 - STA.w $2116 + STA.w VMADDL SEP #$20 LDA.b #BSODHex>>16 - STA.w $4304 + STA.w A1B0 LDA.b #$01 - STA.w $420B + STA.w MDMAEN REP #$30 @@ -437,28 +446,28 @@ ConfigureBSODVWF: LDX.b #$FF LDY.b #$7F - STZ.b $2121 - STZ.b $2122 : STZ.b $2122 + STZ.b CGADD + STZ.b CGDATA : STZ.b CGDATA - STX.b $2122 : STY.b $2122 + STX.b CGDATA : STY.b CGDATA LDA.b #$05 - STA.b $2121 + STA.b CGADD - LDA.b #$11 : STA.b $2122 : STY.b $2122 + LDA.b #$11 : STA.b CGDATA : STY.b CGDATA - LDA.b #$21 : STA.b $2121 - STX.b $2122 : STY.b $2122 + LDA.b #$21 : STA.b CGADD + STX.b CGDATA : STY.b CGDATA - LDA.b #$25 : STA.b $2121 - LDA.b #$11 : STA.b $2122 : STY.b $2122 + LDA.b #$25 : STA.b CGADD + LDA.b #$11 : STA.b CGDATA : STY.b CGDATA REP #$30 PEA.w $0001 LDA.w #15 - STA.w $28 + STA.w LinkRecoilX LDA.w #$0042>>1 BRA .start @@ -466,26 +475,26 @@ ConfigureBSODVWF: .next_row PHA - LDA.w $20 + LDA.w LinkPosY CLC - LDA.w $20 + LDA.w LinkPosY ADC.w #32 .start - STA.w $20 - STA.b $2116 + STA.w LinkPosY + STA.b VMADDL PLA LDY.w #30 .next_char - STA.b $2118 + STA.b VMDATAL INC DEY BNE .next_char - DEC.w $28 + DEC.w LinkRecoilX BNE .next_row LDA.w #$0000 @@ -516,39 +525,39 @@ ConfigurePPUForFailureReport: PHK PLB - STZ.w $2105 ; BG mode 0 - STZ.w $2106 ; no mosaic - STZ.w $2107 ; BG1 tilemap to $0000 - STZ.w $212D + STZ.w BGMODE ; BG mode 0 + STZ.w MOSAIC ; no mosaic + STZ.w BG1SC ; BG1 tilemap to $0000 + STZ.w TS - STZ.w $210D : STZ.w $210D - STZ.w $210E : STZ.w $210E - STZ.w $210F : STZ.w $210F - STZ.w $2110 : STZ.w $2110 + STZ.w BG1HOFS : STZ.w BG1HOFS + STZ.w BG1VOFS : STZ.w BG1VOFS + STZ.w BG2HOFS : STZ.w BG2HOFS + STZ.w BG2VOFS : STZ.w BG2VOFS - STZ.w $2123 - STZ.w $2131 - STZ.w $2133 + STZ.w W12SEL + STZ.w CGADSUB + STZ.w SETINI LDA.b #$04 - STA.w $2108 ; BG1 tilemap to $0800 + STA.w BG2SC ; BG1 tilemap to $0800 LDA.b #$21 - STA.w $210B + STA.w BG12NBA LDA.b #$03 - STA.w $212C + STA.w TM RTS ;=================================================================================================== BSODHex: -incbin "bsodhex.2bpp" +incbin "data/bsodhex.2bpp" BSODFontGFX: -incbin "bsodfont.1bpp" +incbin "data/bsodfont.1bpp" BSODCharWidths: ; [space] diff --git a/fairyfixes.asm b/fairyfixes.asm index 2305cd7..aaa484d 100644 --- a/fairyfixes.asm +++ b/fairyfixes.asm @@ -2,20 +2,20 @@ ; Fairy Changes & Fixes ;-------------------------------------------------------------------------------- RefillHealthPlusMagic: - LDA BigFairyHealth : STA HeartsFiller + LDA.l BigFairyHealth : STA.l HeartsFiller RTL ;-------------------------------------------------------------------------------- RefillHealthPlusMagic8bit: - LDA BigFairyHealth : STA HeartsFiller - LDA BigFairyMagic : STA MagicFiller + LDA.l BigFairyHealth : STA.l HeartsFiller + LDA.l BigFairyMagic : STA.l MagicFiller RTL ;-------------------------------------------------------------------------------- CheckFullHealth: - LDA BigFairyHealth : BEQ + - LDA CurrentHealth : CMP MaximumHealth : BNE .player_hp_not_full_yet + LDA.l BigFairyHealth : BEQ + + LDA.l CurrentHealth : CMP.l MaximumHealth : BNE .player_hp_not_full_yet + - LDA BigFairyMagic : BEQ + - LDA CurrentMagic : CMP.b #$80 : BNE .player_mp_not_full_yet + LDA.l BigFairyMagic : BEQ + + LDA.l CurrentMagic : CMP.b #$80 : BNE .player_mp_not_full_yet + LDA.b #$00 RTL @@ -27,60 +27,59 @@ RTL FairyPond_Init: LDA.l Restrict_Ponds : BNE + LDA.b #$48 - JML.l Sprite_ShowMessageFromPlayerContact + JML Sprite_ShowMessageFromPlayerContact + - PHY : JSL.l Sprite_CheckDamageToPlayerSameLayerLong : BCC + - LDA BottleContentsOne : CMP.b #$02 : BNE ++ : LDA.b #$1C : PHA : BRA .emptyBottle : ++ - LDA BottleContentsTwo : CMP.b #$02 : BNE ++ : LDA.b #$1D : PHA : BRA .emptyBottle : ++ - LDA BottleContentsThree : CMP.b #$02 : BNE ++ : LDA.b #$1E : PHA : BRA .emptyBottle : ++ - LDA BottleContentsFour : CMP.b #$02 : BNE ++ : LDA.b #$1F : PHA : BRA .emptyBottle : ++ + PHY : JSL Sprite_CheckDamageToPlayerSameLayerLong : BCC + + LDA.l BottleContentsOne : CMP.b #$02 : BNE ++ : LDA.b #$1C : PHA : BRA .emptyBottle : ++ + LDA.l BottleContentsTwo : CMP.b #$02 : BNE ++ : LDA.b #$1D : PHA : BRA .emptyBottle : ++ + LDA.l BottleContentsThree : CMP.b #$02 : BNE ++ : LDA.b #$1E : PHA : BRA .emptyBottle : ++ + LDA.l BottleContentsFour : CMP.b #$02 : BNE ++ : LDA.b #$1F : PHA : BRA .emptyBottle : ++ .noInventory - LDA.b #$0A : STA $0D80, X + LDA.b #$0A : STA.w SpriteActivity, X LDA.b #$51 LDY.b #$01 - JSL.l Sprite_ShowMessageFromPlayerContact + JSL Sprite_ShowMessageFromPlayerContact JMP .cleanup .emptyBottle - LDA.b #$02 : STA $0D80, X - ;JSL Player_ResetState ; If we continue to have issues, add this in too. (After determining the address for it) - STZ $2F - LDA.b #$01 : STA $02E4 - PLA : STA $1CE8 + LDA.b #$02 : STA.w SpriteActivity, X + STZ.b LinkDirection + LDA.b #$01 : STA.w CutsceneFlag + PLA : STA.w MessageCursor .cleanup - STZ $0EB0, X ; Clear the sprite's item-given variable + STZ.w SpriteDirectionTable, X ; Clear the sprite's item-given variable CLC ; skip rest of original function + : PLY RTL ;-------------------------------------------------------------------------------- HappinessPond_Check: - LDA $A0 : CMP.b #$15 ;what we wrote over + LDA.b RoomIndex : CMP.b #$15 ;what we wrote over BNE .done PHP LDA.b #$72 JSL Sprite_SpawnDynamically - LDA $0FD8 : STA $0D10, Y - LDA $0FD9 : STA $0D30, Y + LDA.w SpriteCoordCacheX : STA.w SpritePosXLow, Y + LDA.w SpriteCoordCacheX+1 : STA.w SpritePosXHigh, Y - LDA $0FDA : !SUB.b #$40 : STA $0D00, Y - LDA $0FDB : SBC.b #$00 : STA $0D20, Y + LDA.w SpriteCoordCacheY : !SUB.b #$40 : STA.w SpritePosYLow, Y + LDA.w SpriteCoordCacheY+1 : SBC.b #$00 : STA.w SpritePosYHigh, Y - LDA.b #$01 : STA $0DA0, Y + LDA.b #$01 : STA.w SpriteAuxTable, Y LDA.b #$BB JSL Sprite_SpawnDynamically - LDA.b #$08 : STA $0DD0, Y ; ensure we run prep for the shopkeeper + LDA.b #$08 : STA.w SpriteAITable, Y ; ensure we run prep for the shopkeeper - LDA $0FD8 : STA $0D10, Y - LDA $0FD9 : STA $0D30, Y + LDA.w SpriteCoordCacheX : STA.w SpritePosXLow, Y + LDA.w SpriteCoordCacheX+1 : STA.w SpritePosXHigh, Y - LDA $0FDA : !SUB.b #$20 : STA $0D00, Y - LDA $0FDB : SBC.b #$00 : STA $0D20, Y + LDA.w SpriteCoordCacheY : !SUB.b #$20 : STA.w SpritePosYLow, Y + LDA.w SpriteCoordCacheY+1 : SBC.b #$00 : STA.w SpritePosYHigh, Y - STZ $0DD0, X ; self terminate + STZ.w SpriteAITable, X ; self terminate PLP .done diff --git a/fastcredits.asm b/fastcredits.asm index 82702f3..3dd2710 100644 --- a/fastcredits.asm +++ b/fastcredits.asm @@ -1,21 +1,51 @@ +FastCreditsActive = $50 + +;=================================================================================================== + + +FlagFastCredits: + LDA.b #$40 + TRB.b FastCreditsActive + + AND.b Joy1B_All + TSB.b FastCreditsActive + + LDA.b #$20 + AND.b Joy1A_New + EOR.b FastCreditsActive + STA.b FastCreditsActive + + LDA.b FastCreditsActive + AND.b #$60 + BEQ .slow + + LDA.b #$01 + TSB.b FastCreditsActive + +.slow + LDA.b GameSubMode + ASL + TAX + + RTL + ;=================================================================================================== FastCreditsCutsceneTimer: - BIT.b $F2-1 : BVC .slow + LDA.b ScrapBufferBD+$0B + INC - LDA.w #$0001 : STA.b $50 + JSR IsFastCredits + BCC .slow + + INC + INC + INC - LDA.b $C8 - CLC - ADC.w #$0004 AND.w #$FFFE - STA.b $C8 - SEP #$20 - RTL - .slow - INC.b $C8 + STA.b ScrapBufferBD+$0B SEP #$20 RTL @@ -49,18 +79,20 @@ FastCreditsCutsceneScrollY: FastCreditsCutsceneScroll: LDA.w $00E2,Y - CMP.l $0EC308,X ; compare to target + CMP.l Credits_ScrollScene_target_y,X ; compare to target - ROL.b $00 ; put carry in here - LDA.l $0EC348,X ; get movement + ROL.b Scrap00 ; put carry in here + LDA.l Credits_ScrollScene_movement_y,X ; get movement BPL ++ ; if positive, leave saved carry alone - INC.b $00 ; otherwise, flip it -++ ROR.b $00 ; recover carry + INC.b Scrap00 ; otherwise, flip it +++ ROR.b Scrap00 ; recover carry BCC ++ ; scroll if carry not set + LDA.w #$0000 -++ BIT.b $F2-1 : BVC .slow ; check for X held +++ JSR IsFastCredits + BCC .slow AND.w #$FFFF ; get sign of A BPL .positive @@ -77,21 +109,14 @@ FastCreditsCutsceneScroll: ASL ASL - - .slow RTS - - - - - FastCreditsCutsceneUnderworldX: JSR FastCreditsCutsceneScrollX CLC - ADC.b $E2 - STA.b $E2 + ADC.b BG2H + STA.b BG2H RTL @@ -99,26 +124,34 @@ FastCreditsCutsceneUnderworldX: FastCreditsCutsceneUnderworldY: JSR FastCreditsCutsceneScrollY CLC - ADC.b $E8 - STA.b $E8 + ADC.b BG2V + STA.b BG2V RTL FastTextScroll: - LDA.b $1A - BIT.b $F2-1 : BVC .slow + LDA.b FrameCounter + SEP #$10 + JSR IsFastCredits + BCC .slow AND.w #$0000 + REP #$10 RTL .slow AND.w #$0003 + REP #$10 RTL DumbFlagForMSU: STA.l CurrentWorld - STZ.b $50 + STZ.b FastCreditsActive RTL +IsFastCredits: + LDY.b FastCreditsActive + CPY.b #$20 + RTS diff --git a/fastrom.asm b/fastrom.asm new file mode 100644 index 0000000..3fbc714 --- /dev/null +++ b/fastrom.asm @@ -0,0 +1,5533 @@ +;=================================================================================================== + +; this guy here is removed to make space for a small rewrite +; org $0CC2A8 : db $8C +; because fast rom is just too fast! and the title card relies on lag for timing + +org $8CC2A5 +TitleCardFix: + ; thankfully, the title screen song ends instead of loops + ; so we'll just wait for it to end + LDA.w $2140 + BNE .exit + + LDA.b #$14 + STA.b GameMode + + STZ.b GameSubMode + STZ.b LinkPosX + +.exit + JML $8CC3D2 + +warnpc $8CC2B6 + +;=================================================================================================== +; THESE MOTHERFUCKERS +; This routine relies on a PLB followed by a BMI to clear the N flag +; which means it doesn't work properly in fastrom. +; There is no way to fix this in vanilla space without affecting other stuff +; so it stays in slow rom. +; That is its punishment. +;=================================================================================================== +; These are the vanilla values, but they're explicitly set for reference +org $01DB3A : db $06 +org $07C1CB : db $06 +org $1BBF13 : db $06 +org $1BC1CB : db $06 + +;=================================================================================================== + +; Similar problem, except in vanilla the PLB causes the branch to always fail +; so I'll just make it always fail here too +org $1D875C + BRA ++ : ++ + +;=================================================================================================== +; MVNs (annoying to parse from the disassembly) +;=================================================================================================== +org $06BB6A : db $86 +org $09F809 : db $89 +org $09F861 : db $89 +org $09F862 : db $89 +org $0DFA9E : db $8D + +;=================================================================================================== + +org $008059 : db $80 +org $008099 : db $8C +org $00809A : db $8C +org $00809B : db $8C +org $00809C : db $8C +org $00809D : db $8C +org $00809E : db $82 +org $00809F : db $82 +org $0080A0 : db $82 +org $0080A1 : db $82 +org $0080A2 : db $82 +org $0080A3 : db $82 +org $0080A4 : db $82 +org $0080A5 : db $82 +org $0080A6 : db $82 +org $0080A7 : db $80 +org $0080A8 : db $82 +org $0080A9 : db $82 +org $0080AA : db $82 +org $0080AB : db $89 +org $0080AC : db $82 +org $0080AD : db $8C +org $0080AE : db $82 +org $0080AF : db $82 +org $0080B0 : db $89 +org $0080B1 : db $82 +org $0080B2 : db $82 +org $0080B3 : db $8E +org $0080B4 : db $82 +org $008867 : db $8F +org $008871 : db $8F +org $00890A : db $99 +org $00891C : db $9A +org $00892E : db $9B +org $00893A : db $9A +org $008957 : db $80 +org $008A02 : db $90 +org $008E58 : db $8A +org $00938F : db $8C +org $009391 : db $8C +org $009392 : db $8C +org $009393 : db $8C +org $009394 : db $8C +org $009395 : db $98 +org $00CFC0 : db $91 +org $00CFC1 : db $91 +org $00CFC2 : db $91 +org $00CFC3 : db $91 +org $00CFC4 : db $91 +org $00CFC5 : db $91 +org $00CFC6 : db $91 +org $00CFC7 : db $91 +org $00CFC8 : db $91 +org $00CFC9 : db $91 +org $00CFCA : db $91 +org $00CFCB : db $91 +org $00CFCC : db $91 +org $00CFCD : db $91 +org $00CFCE : db $91 +org $00CFCF : db $91 +org $00CFD0 : db $91 +org $00CFD1 : db $92 +org $00CFD2 : db $92 +org $00CFD3 : db $92 +org $00CFD4 : db $92 +org $00CFD5 : db $92 +org $00CFD6 : db $92 +org $00CFD7 : db $92 +org $00CFD8 : db $92 +org $00CFD9 : db $92 +org $00CFDA : db $92 +org $00CFDB : db $92 +org $00CFDC : db $92 +org $00CFDD : db $92 +org $00CFDE : db $92 +org $00CFDF : db $92 +org $00CFE0 : db $92 +org $00CFE1 : db $92 +org $00CFE2 : db $92 +org $00CFE3 : db $92 +org $00CFE4 : db $92 +org $00CFE5 : db $92 +org $00CFE6 : db $92 +org $00CFE7 : db $92 +org $00CFE8 : db $92 +org $00CFE9 : db $92 +org $00CFEA : db $92 +org $00CFEB : db $92 +org $00CFEC : db $93 +org $00CFED : db $93 +org $00CFEE : db $93 +org $00CFEF : db $93 +org $00CFF0 : db $93 +org $00CFF1 : db $93 +org $00CFF2 : db $93 +org $00CFF3 : db $93 +org $00CFF4 : db $93 +org $00CFF5 : db $93 +org $00CFF6 : db $93 +org $00CFF7 : db $93 +org $00CFF8 : db $93 +org $00CFF9 : db $93 +org $00CFFA : db $93 +org $00CFFB : db $93 +org $00CFFC : db $93 +org $00CFFD : db $93 +org $00CFFE : db $93 +org $00CFFF : db $93 +org $00D000 : db $93 +org $00D001 : db $93 +org $00D002 : db $93 +org $00D003 : db $93 +org $00D004 : db $93 +org $00D005 : db $93 +org $00D006 : db $93 +org $00D007 : db $93 +org $00D008 : db $94 +org $00D009 : db $94 +org $00D00A : db $94 +org $00D00B : db $94 +org $00D00C : db $94 +org $00D00D : db $94 +org $00D00E : db $94 +org $00D00F : db $94 +org $00D010 : db $94 +org $00D011 : db $94 +org $00D012 : db $94 +org $00D013 : db $94 +org $00D014 : db $94 +org $00D015 : db $94 +org $00D016 : db $94 +org $00D017 : db $94 +org $00D018 : db $94 +org $00D019 : db $94 +org $00D01A : db $94 +org $00D01B : db $94 +org $00D01C : db $94 +org $00D01D : db $94 +org $00D01E : db $94 +org $00D01F : db $94 +org $00D020 : db $94 +org $00D021 : db $94 +org $00D022 : db $94 +org $00D023 : db $94 +org $00D024 : db $94 +org $00D025 : db $94 +org $00D026 : db $94 +org $00D027 : db $94 +org $00D028 : db $94 +org $00D029 : db $94 +org $00D02A : db $94 +org $00D02B : db $94 +org $00D02C : db $94 +org $00D02D : db $94 +org $00D02E : db $94 +org $00D02F : db $94 +org $00D030 : db $94 +org $00D031 : db $98 +org $00D032 : db $98 +org $00D033 : db $90 +org $00D034 : db $90 +org $00D035 : db $90 +org $00D036 : db $91 +org $00D037 : db $91 +org $00D038 : db $91 +org $00D039 : db $91 +org $00D03A : db $91 +org $00D03B : db $91 +org $00D03C : db $91 +org $00D03D : db $91 +org $00D03E : db $91 +org $00D03F : db $94 +org $00D040 : db $94 +org $00D041 : db $95 +org $00D042 : db $95 +org $00D043 : db $95 +org $00D044 : db $95 +org $00D045 : db $95 +org $00D046 : db $95 +org $00D047 : db $95 +org $00D048 : db $95 +org $00D049 : db $95 +org $00D04A : db $95 +org $00D04B : db $95 +org $00D04C : db $95 +org $00D04D : db $95 +org $00D04E : db $95 +org $00D04F : db $95 +org $00D050 : db $95 +org $00D051 : db $95 +org $00D052 : db $95 +org $00D053 : db $95 +org $00D054 : db $95 +org $00D055 : db $95 +org $00D056 : db $95 +org $00D057 : db $95 +org $00D058 : db $95 +org $00D059 : db $95 +org $00D05A : db $96 +org $00D05B : db $96 +org $00D05C : db $96 +org $00D05D : db $96 +org $00D05E : db $96 +org $00D05F : db $96 +org $00D060 : db $96 +org $00D061 : db $96 +org $00D062 : db $96 +org $00D063 : db $96 +org $00D064 : db $96 +org $00D065 : db $96 +org $00D066 : db $96 +org $00D067 : db $96 +org $00D068 : db $96 +org $00D069 : db $96 +org $00D06A : db $96 +org $00D06B : db $96 +org $00D06C : db $96 +org $00D06D : db $96 +org $00D06E : db $96 +org $00D06F : db $96 +org $00D070 : db $96 +org $00D071 : db $96 +org $00D072 : db $96 +org $00D073 : db $96 +org $00D074 : db $96 +org $00D075 : db $96 +org $00D076 : db $97 +org $00D077 : db $97 +org $00D078 : db $97 +org $00D079 : db $97 +org $00D07A : db $97 +org $00D07B : db $97 +org $00D07C : db $97 +org $00D07D : db $97 +org $00D07E : db $97 +org $00D07F : db $97 +org $00D080 : db $97 +org $00D081 : db $97 +org $00D082 : db $97 +org $00D083 : db $97 +org $00D084 : db $97 +org $00D085 : db $97 +org $00D086 : db $97 +org $00D087 : db $97 +org $00D088 : db $97 +org $00D089 : db $97 +org $00D08A : db $97 +org $00D08B : db $97 +org $00D08C : db $97 +org $00D08D : db $97 +org $00D08E : db $97 +org $00D08F : db $97 +org $00D090 : db $97 +org $00D091 : db $98 +org $00D092 : db $98 +org $00D093 : db $98 +org $00D094 : db $98 +org $00D095 : db $98 +org $00D096 : db $98 +org $00D097 : db $98 +org $00D098 : db $98 +org $00D099 : db $98 +org $00D09A : db $98 +org $00D09B : db $98 +org $00D09C : db $98 +org $00D09D : db $98 +org $00D09E : db $98 +org $00D49B : db $80 +org $00D8B0 : db $80 +org $00D8B9 : db $80 +org $00D8BF : db $80 +org $00D8E3 : db $82 +org $00D8E8 : db $82 +org $00D8F6 : db $82 +org $00D8FE : db $82 +org $00D92C : db $80 +org $00D9C0 : db $80 +org $00D9C6 : db $80 +org $00D9FF : db $80 +org $00DA05 : db $80 +org $00DA72 : db $80 +org $00DA78 : db $80 +org $00DAD7 : db $80 +org $00DB95 : db $87 +org $00DF49 : db $80 +org $00DF52 : db $80 +org $00E3DA : db $98 +org $00E45B : db $9B +org $00E468 : db $9B +org $00EBA8 : db $80 +org $00EC40 : db $80 +org $00EC61 : db $80 +org $00ECB0 : db $80 +org $00ECD1 : db $80 +org $00ED13 : db $80 +org $00ED61 : db $80 +org $00EEDE : db $80 +org $00EF81 : db $80 +org $00F2B4 : db $80 +org $00F2EC : db $80 +org $00F3E5 : db $80 +org $00F423 : db $89 +org $00F5C9 : db $80 +org $00F5DD : db $80 +org $00F5E2 : db $80 +org $00F5E7 : db $80 +org $00F5F0 : db $80 +org $00F5F6 : db $80 +org $00F5FB : db $80 +org $00F612 : db $80 +org $00F626 : db $80 +org $00F62B : db $80 +org $00F630 : db $80 +org $00F639 : db $80 +org $00F63F : db $80 +org $00F644 : db $80 +org $00F818 : db $81 +org $00F82D : db $86 +org $00F831 : db $8D +org $00F839 : db $82 +org $00F83D : db $8D +org $00F847 : db $80 +org $00F84D : db $80 +org $00F88E : db $80 +org $00F88F : db $8D +org $00F890 : db $8E +org $00F891 : db $8A +org $00F892 : db $80 +org $00F893 : db $80 +org $00F894 : db $80 +org $00F895 : db $8A +org $00F896 : db $80 +org $00F897 : db $80 +org $00F898 : db $8A +org $00F899 : db $80 +org $00F89F : db $80 +org $00F8A5 : db $80 +org $00F8AB : db $80 +org $00F8B6 : db $80 +org $00F8B9 : db $82 +org $00F8BC : db $80 +org $00F8BF : db $80 +org $00F8C2 : db $80 +org $00F8C5 : db $80 +org $00F8C9 : db $87 +org $00F8E3 : db $80 +org $00F8E7 : db $87 +org $00F8EE : db $80 +org $00F8F1 : db $82 +org $00F8F4 : db $80 +org $00F8F7 : db $82 +org $00F8FA : db $82 +org $00F8FE : db $8D +org $00F914 : db $8D +org $00F91B : db $8D +org $00F925 : db $8D +org $00F948 : db $80 +org $00F94C : db $82 +org $00F958 : db $82 +org $00F961 : db $80 +org $00F967 : db $80 +org $00F98B : db $80 +org $00F98F : db $89 +org $00FA01 : db $87 +org $00FA05 : db $8E +org $00FE67 : db $80 +org $00FF32 : db $80 +org $00FF95 : db $8B +org $018748 : db $9F +org $01874E : db $9F +org $018829 : db $84 +org $01882F : db $84 +org $018841 : db $9F +org $018847 : db $9F +org $018857 : db $81 +org $01886C : db $81 +org $018932 : db $81 +org $018976 : db $81 +org $01897C : db $81 +org $0189AB : db $81 +org $0189B1 : db $81 +org $0189CF : db $81 +org $0189D5 : db $81 +org $0189E2 : db $81 +org $0189E8 : db $81 +org $018A09 : db $81 +org $019C25 : db $84 +org $01B5AC : db $81 +org $01B5D1 : db $81 +org $01B5DF : db $84 +org $01B5E7 : db $84 +org $01B628 : db $8C +org $01B62F : db $8C +org $01B636 : db $8C +org $01B63D : db $8C +org $01B6C8 : db $9F +org $01B6CE : db $9F +org $01B7FA : db $9F +org $01B800 : db $9F +org $01B853 : db $84 +org $01B859 : db $84 +org $01B8DE : db $81 +org $01C228 : db $81 +org $01C3AA : db $82 +org $01C3C3 : db $82 +org $01C3C9 : db $82 +org $01C414 : db $87 +org $01C41F : db $87 +org $01C470 : db $89 +org $01C49B : db $89 +org $01C4CA : db $89 +org $01C4D6 : db $89 +org $01C4DE : db $89 +org $01C625 : db $81 +org $01C6BA : db $81 +org $01C6C6 : db $81 +org $01C6F8 : db $89 +org $01C741 : db $81 +org $01C745 : db $85 +org $01C75F : db $82 +org $01C765 : db $80 +org $01C7B2 : db $89 +org $01C973 : db $81 +org $01C97A : db $81 +org $01CAB1 : db $80 +org $01CAD2 : db $80 +org $01CB3E : db $80 +org $01CB67 : db $80 +org $01CBAD : db $84 +org $01CC57 : db $80 +org $01CE91 : db $81 +org $01CF3E : db $9C +org $01CF87 : db $81 +org $01CFA8 : db $89 +org $01CFE8 : db $87 +org $01D00A : db $81 +org $01D157 : db $81 +org $01D1DB : db $8D +org $01D1FB : db $9B +org $01D2DD : db $81 +org $01D738 : db $82 +org $01D754 : db $81 +org $01D763 : db $81 +org $01D7AE : db $81 +org $01D7DD : db $81 +org $01D7ED : db $87 +org $01D80A : db $87 +org $01D9F8 : db $81 +org $01DA0B : db $81 +org $01DA58 : db $81 +org $01DB3E : db $89 +org $01E6C2 : db $81 +org $01E6C6 : db $81 +org $01E751 : db $80 +org $01E758 : db $80 +org $01E75F : db $80 +org $01E766 : db $80 +org $01E7AE : db $80 +org $01E7FA : db $81 +org $01E8BD : db $80 +org $01EB66 : db $80 +org $01EB9F : db $9C +org $01EBFB : db $81 +org $01EC0A : db $81 +org $01EC10 : db $81 +org $01EC34 : db $9C +org $01ECE9 : db $82 +org $01ED78 : db $82 +org $01ED9D : db $9C +org $01EE97 : db $8D +org $01EEC2 : db $81 +org $01EEF8 : db $8D +org $01EF00 : db $8D +org $01EF0A : db $81 +org $01EF6E : db $81 +org $01EF79 : db $81 +org $01EF85 : db $80 +org $01EF8F : db $80 +org $01F047 : db $80 +org $01F1A6 : db $81 +org $01F1B1 : db $81 +org $01F1DD : db $80 +org $01F1FB : db $81 +org $01F206 : db $81 +org $01F228 : db $81 +org $01F233 : db $80 +org $01F2FF : db $80 +org $01F34A : db $81 +org $01F3AE : db $80 +org $01F3D7 : db $80 +org $01F402 : db $80 +org $01F453 : db $8D +org $01F476 : db $82 +org $01F497 : db $82 +org $01F4AD : db $80 +org $01F50D : db $82 +org $01F60D : db $81 +org $01F8F5 : db $81 +org $01FF27 : db $82 +org $02801A : db $80 +org $028025 : db $8E +org $028029 : db $9C +org $028049 : db $80 +org $028062 : db $80 +org $02806B : db $80 +org $02806F : db $80 +org $028073 : db $8F +org $028077 : db $80 +org $02807B : db $80 +org $02807F : db $87 +org $028083 : db $80 +org $0280AF : db $8D +org $0280B3 : db $8D +org $0280B7 : db $8D +org $028105 : db $9C +org $028125 : db $8D +org $028129 : db $8D +org $02812D : db $8D +org $02816D : db $8D +org $02817A : db $8F +org $028181 : db $82 +org $028186 : db $80 +org $02818A : db $81 +org $028193 : db $80 +org $0281A6 : db $82 +org $0281DB : db $82 +org $028207 : db $82 +org $02820F : db $81 +org $028231 : db $9C +org $028249 : db $8A +org $028251 : db $89 +org $028255 : db $89 +org $028259 : db $89 +org $028287 : db $87 +org $0282DB : db $82 +org $0282F3 : db $8D +org $02838F : db $80 +org $028393 : db $80 +org $0283A2 : db $80 +org $0283A6 : db $8C +org $0283AA : db $8C +org $0283BC : db $8B +org $0283C6 : db $89 +org $0283D2 : db $80 +org $0283DB : db $89 +org $0283E5 : db $89 +org $02842D : db $82 +org $028461 : db $80 +org $028487 : db $8E +org $028491 : db $80 +org $028495 : db $80 +org $0284A1 : db $82 +org $0284AB : db $82 +org $028505 : db $80 +org $028509 : db $80 +org $028515 : db $82 +org $028547 : db $80 +org $02854F : db $82 +org $028556 : db $82 +org $02855B : db $80 +org $028567 : db $80 +org $02856B : db $8C +org $028574 : db $9B +org $02857C : db $8E +org $028580 : db $80 +org $028587 : db $8B +org $028591 : db $8C +org $0285AD : db $8E +org $0285B8 : db $8E +org $0285D4 : db $80 +org $0285E0 : db $80 +org $0285E4 : db $8C +org $0285ED : db $9B +org $028602 : db $80 +org $028606 : db $80 +org $02860E : db $82 +org $028626 : db $82 +org $02862B : db $80 +org $028633 : db $82 +org $02863A : db $82 +org $028641 : db $8C +org $028648 : db $8C +org $028654 : db $80 +org $02866C : db $8E +org $0286A9 : db $8A +org $0286B7 : db $81 +org $0286BF : db $80 +org $0286CA : db $81 +org $0286D2 : db $81 +org $0286DB : db $81 +org $0286E6 : db $80 +org $02873F : db $87 +org $028743 : db $86 +org $028757 : db $8D +org $02875B : db $8D +org $02875F : db $8A +org $0287A9 : db $87 +org $0287B5 : db $82 +org $0287D3 : db $80 +org $0287D6 : db $82 +org $0287D9 : db $82 +org $0287DC : db $82 +org $0287DF : db $82 +org $02883F : db $9C +org $02884C : db $87 +org $02888F : db $87 +org $0288A5 : db $81 +org $0288E3 : db $80 +org $0288ED : db $80 +org $028941 : db $80 +org $028945 : db $81 +org $028949 : db $87 +org $028960 : db $81 +org $028964 : db $80 +org $028968 : db $80 +org $02897C : db $89 +org $028998 : db $82 +org $02899C : db $80 +org $0289A3 : db $80 +org $0289B4 : db $80 +org $0289B8 : db $80 +org $0289C9 : db $80 +org $0289CD : db $80 +org $0289EE : db $80 +org $0289F9 : db $82 +org $028A0D : db $8D +org $028A11 : db $89 +org $028A4F : db $82 +org $028A81 : db $82 +org $028A89 : db $81 +org $028AA1 : db $80 +org $028AAB : db $80 +org $028AF4 : db $82 +org $028AFC : db $89 +org $028B0A : db $81 +org $028B0F : db $81 +org $028B14 : db $81 +org $028B1F : db $81 +org $028B29 : db $80 +org $028B4A : db $87 +org $028B51 : db $87 +org $028B57 : db $80 +org $028BEA : db $81 +org $028BEE : db $80 +org $028BF2 : db $80 +org $028BF6 : db $8F +org $028BFF : db $89 +org $028C06 : db $80 +org $028C10 : db $80 +org $028C15 : db $80 +org $028C19 : db $89 +org $028C23 : db $82 +org $028C2C : db $82 +org $028D14 : db $80 +org $028D32 : db $80 +org $028D36 : db $81 +org $028D3A : db $81 +org $028D40 : db $80 +org $028D88 : db $82 +org $028D91 : db $82 +org $028D9F : db $80 +org $028DA6 : db $80 +org $028DD8 : db $82 +org $028DE5 : db $87 +org $028DFA : db $80 +org $028E0C : db $80 +org $028E21 : db $87 +org $028E25 : db $87 +org $028E2C : db $87 +org $028E32 : db $80 +org $028E88 : db $82 +org $028E9D : db $87 +org $028EA1 : db $87 +org $028EA8 : db $87 +org $028EAE : db $80 +org $028F0F : db $82 +org $028F14 : db $81 +org $028F19 : db $80 +org $028F1D : db $81 +org $028F32 : db $82 +org $028F39 : db $80 +org $028F3C : db $81 +org $028F3F : db $81 +org $028F42 : db $81 +org $028F45 : db $81 +org $028F48 : db $81 +org $028F4B : db $81 +org $028F4F : db $81 +org $028F54 : db $81 +org $028F5F : db $80 +org $028F63 : db $81 +org $028F67 : db $87 +org $028F6D : db $80 +org $028F99 : db $80 +org $028F9D : db $80 +org $028FA1 : db $81 +org $028FAD : db $80 +org $028FB7 : db $80 +org $028FFF : db $81 +org $029027 : db $82 +org $029030 : db $82 +org $029059 : db $8D +org $0290A0 : db $87 +org $0290BA : db $87 +org $0290C9 : db $81 +org $0290E5 : db $81 +org $0290EC : db $81 +org $029103 : db $81 +org $029145 : db $82 +org $02914E : db $82 +org $029184 : db $89 +org $0291AF : db $89 +org $029229 : db $87 +org $02922D : db $8D +org $029232 : db $80 +org $029239 : db $86 +org $02923D : db $80 +org $029262 : db $81 +org $02926C : db $80 +org $02928C : db $87 +org $029290 : db $87 +org $029296 : db $80 +org $0292F9 : db $80 +org $029308 : db $80 +org $02930C : db $81 +org $029310 : db $80 +org $029314 : db $80 +org $029318 : db $8F +org $02931C : db $82 +org $029320 : db $89 +org $029327 : db $80 +org $02932F : db $80 +org $02933B : db $89 +org $029345 : db $82 +org $029392 : db $81 +org $029399 : db $81 +org $0293DE : db $8D +org $0293E5 : db $80 +org $0293EB : db $80 +org $029418 : db $81 +org $029427 : db $80 +org $029537 : db $87 +org $02953E : db $89 +org $02957E : db $80 +org $029582 : db $81 +org $029588 : db $80 +org $0295B8 : db $81 +org $0295CC : db $82 +org $0295D5 : db $82 +org $0295E3 : db $80 +org $029614 : db $82 +org $0296A7 : db $81 +org $0296EE : db $81 +org $02970A : db $80 +org $029724 : db $80 +org $029786 : db $80 +org $02979B : db $82 +org $0297A1 : db $82 +org $0297E8 : db $89 +org $0297EC : db $9E +org $02980F : db $82 +org $029814 : db $81 +org $029822 : db $80 +org $029851 : db $80 +org $029880 : db $86 +org $02989E : db $87 +org $0298B8 : db $82 +org $0298C0 : db $87 +org $0298C4 : db $8D +org $0298D2 : db $9C +org $0298E3 : db $82 +org $02990A : db $8A +org $029910 : db $80 +org $029917 : db $80 +org $02993B : db $80 +org $02993F : db $87 +org $0299D5 : db $86 +org $0299E0 : db $8D +org $0299E4 : db $80 +org $029A02 : db $82 +org $029A1A : db $80 +org $029A38 : db $8D +org $029A83 : db $8F +org $029A8A : db $82 +org $029A8F : db $80 +org $029A93 : db $81 +org $029AA5 : db $80 +org $029AB1 : db $8D +org $029AC1 : db $82 +org $029AC9 : db $8D +org $029ACD : db $82 +org $029B00 : db $80 +org $029B1A : db $87 +org $029B4F : db $86 +org $029B53 : db $8D +org $029B57 : db $8D +org $029B60 : db $8D +org $029B8C : db $8D +org $029B9C : db $87 +org $029BA0 : db $89 +org $029BA4 : db $89 +org $029BAB : db $87 +org $029C0B : db $86 +org $029C0F : db $8D +org $029C28 : db $80 +org $029C2F : db $80 +org $029C56 : db $8B +org $029C97 : db $9C +org $029C9B : db $80 +org $029C9F : db $8D +org $029CC0 : db $8E +org $029CE2 : db $9C +org $029CF3 : db $8E +org $029D04 : db $80 +org $029D0D : db $80 +org $029D13 : db $80 +org $029D24 : db $82 +org $029D64 : db $80 +org $029D68 : db $89 +org $029D8B : db $86 +org $029D8F : db $8D +org $029DA7 : db $82 +org $029E09 : db $86 +org $029E25 : db $8D +org $029E29 : db $8A +org $029E2D : db $87 +org $029E31 : db $82 +org $029E3C : db $8A +org $029E58 : db $8A +org $029E60 : db $80 +org $029E67 : db $8D +org $029E78 : db $8A +org $029E85 : db $8A +org $029E9F : db $9A +org $029EC3 : db $8A +org $029F0F : db $87 +org $029F13 : db $87 +org $029F17 : db $8D +org $029F1B : db $87 +org $029F2F : db $80 +org $029F3C : db $80 +org $029F4D : db $80 +org $029F51 : db $82 +org $029F6E : db $80 +org $029F79 : db $8C +org $029FF5 : db $80 +org $029FFA : db $8C +org $02A008 : db $9C +org $02A00C : db $8E +org $02A01B : db $8C +org $02A01F : db $8E +org $02A031 : db $8C +org $02A04B : db $8C +org $02A04F : db $87 +org $02A05E : db $8C +org $02A066 : db $87 +org $02A06D : db $8C +org $02A071 : db $80 +org $02A0BD : db $82 +org $02A0E8 : db $82 +org $02A119 : db $82 +org $02A143 : db $9B +org $02A14B : db $82 +org $02A168 : db $9B +org $02A16C : db $9B +org $02A170 : db $9B +org $02A174 : db $9B +org $02A17B : db $80 +org $02A195 : db $80 +org $02A19A : db $80 +org $02A3AB : db $86 +org $02A3BF : db $8D +org $02A3C3 : db $8D +org $02A417 : db $82 +org $02A420 : db $82 +org $02A484 : db $9C +org $02A496 : db $9B +org $02A49C : db $87 +org $02A4A7 : db $8A +org $02A4C6 : db $80 +org $02A4D3 : db $9B +org $02A4D7 : db $87 +org $02A8DC : db $82 +org $02A90F : db $82 +org $02A928 : db $84 +org $02A92F : db $87 +org $02A94C : db $82 +org $02A960 : db $82 +org $02A99C : db $82 +org $02A9FE : db $80 +org $02AA02 : db $8C +org $02AA16 : db $80 +org $02AA27 : db $82 +org $02AA2E : db $82 +org $02AA45 : db $80 +org $02AA55 : db $82 +org $02AA5C : db $82 +org $02AA85 : db $84 +org $02AAB2 : db $80 +org $02AAB6 : db $80 +org $02AAD7 : db $80 +org $02AADC : db $87 +org $02AAE0 : db $80 +org $02AB0A : db $89 +org $02AB25 : db $8B +org $02AB3E : db $82 +org $02AB6E : db $82 +org $02AB8C : db $89 +org $02AB91 : db $87 +org $02ABC4 : db $87 +org $02ACAE : db $9B +org $02ACD8 : db $9B +org $02AD04 : db $9B +org $02AD30 : db $9B +org $02AD65 : db $80 +org $02ADB9 : db $80 +org $02ADEC : db $80 +org $02ADF8 : db $80 +org $02AE14 : db $80 +org $02AE30 : db $89 +org $02AE34 : db $89 +org $02B008 : db $80 +org $02B01A : db $80 +org $02B01E : db $8C +org $02B090 : db $80 +org $02B09A : db $80 +org $02B0BE : db $80 +org $02B0C2 : db $80 +org $02B123 : db $82 +org $02B12D : db $80 +org $02B130 : db $82 +org $02B133 : db $80 +org $02B136 : db $80 +org $02B139 : db $80 +org $02B13C : db $82 +org $02B15B : db $80 +org $02B17F : db $80 +org $02B1BC : db $80 +org $02B240 : db $82 +org $02B29C : db $82 +org $02B2DE : db $80 +org $02B2E2 : db $8C +org $02B2E6 : db $8C +org $02B2EA : db $8B +org $02B339 : db $89 +org $02B33D : db $89 +org $02B341 : db $87 +org $02B352 : db $89 +org $02B357 : db $87 +org $02B361 : db $80 +org $02B394 : db $80 +org $02B399 : db $80 +org $02B39E : db $80 +org $02B3A2 : db $80 +org $02B3A7 : db $80 +org $02B3B1 : db $80 +org $02B3C0 : db $82 +org $02B3C6 : db $82 +org $02B3D8 : db $8A +org $02B3F9 : db $9B +org $02B3FD : db $9B +org $02B401 : db $9B +org $02B405 : db $9B +org $02B409 : db $9B +org $02B415 : db $80 +org $02B419 : db $8C +org $02B41D : db $8C +org $02B421 : db $8B +org $02B425 : db $80 +org $02B43C : db $80 +org $02B45C : db $9B +org $02B465 : db $80 +org $02B6E9 : db $82 +org $02B6ED : db $82 +org $02B796 : db $82 +org $02B816 : db $82 +org $02B874 : db $82 +org $02BD8F : db $82 +org $02BD9F : db $80 +org $02BFF7 : db $89 +org $02C080 : db $82 +org $02C087 : db $82 +org $02C0A7 : db $80 +org $02C0AB : db $87 +org $02C0D2 : db $82 +org $02C0FB : db $82 +org $02C118 : db $82 +org $02C17D : db $87 +org $02C1AC : db $82 +org $02C1DE : db $87 +org $02C2C2 : db $80 +org $02C2CD : db $8C +org $02C2D1 : db $9B +org $02C2D5 : db $9B +org $02C2D9 : db $9B +org $02C2DD : db $9B +org $02C2E1 : db $9B +org $02C2E5 : db $9B +org $02C2E9 : db $9B +org $02C2F6 : db $81 +org $02C303 : db $80 +org $02C307 : db $80 +org $02C30B : db $80 +org $02C30F : db $80 +org $02C362 : db $8C +org $02C366 : db $9B +org $02C36A : db $9B +org $02C36E : db $9B +org $02C372 : db $9B +org $02C376 : db $9B +org $02C37A : db $9B +org $02C37E : db $9B +org $02C39A : db $8C +org $02C39E : db $9B +org $02C3A2 : db $9B +org $02C3A6 : db $9B +org $02C3AA : db $9B +org $02C3AE : db $9B +org $02C3B2 : db $9B +org $02C3B6 : db $9B +org $02C3BA : db $9B +org $02C3BE : db $9B +org $02C3C2 : db $9B +org $02C41A : db $9B +org $02C41E : db $9B +org $02C422 : db $9B +org $02C426 : db $9B +org $02C42A : db $9B +org $02C42E : db $9B +org $02C432 : db $9B +org $02C445 : db $9B +org $02C449 : db $9B +org $02C44D : db $9B +org $02C56F : db $82 +org $02D860 : db $84 +org $02D867 : db $84 +org $02D86E : db $84 +org $02D875 : db $84 +org $02D87C : db $84 +org $02D883 : db $84 +org $02D88A : db $84 +org $02E68F : db $82 +org $02E698 : db $82 +org $02E69F : db $82 +org $02E6A7 : db $82 +org $02E6AD : db $82 +org $02E6B1 : db $8C +org $02E6C4 : db $82 +org $02E6CB : db $82 +org $02E71E : db $8C +org $02E812 : db $80 +org $02E816 : db $8C +org $02E81A : db $8C +org $02E83C : db $87 +org $02EA36 : db $89 +org $02EA3A : db $89 +org $02EA4F : db $80 +org $02EA53 : db $8C +org $02EA57 : db $8C +org $02EA7A : db $82 +org $02EA99 : db $82 +org $02EACD : db $82 +org $02EC65 : db $84 +org $02EC76 : db $84 +org $02EC87 : db $84 +org $02ECB7 : db $87 +org $02ECCB : db $82 +org $02ED9C : db $82 +org $02F04F : db $82 +org $02F083 : db $82 +org $02F0C1 : db $82 +org $02F0FB : db $82 +org $02F12A : db $82 +org $02F18D : db $82 +org $02F198 : db $82 +org $02F1BD : db $8F +org $02F1C4 : db $8F +org $02F1CD : db $8F +org $02F1D4 : db $8F +org $02F1F4 : db $82 +org $02F25D : db $82 +org $02F26D : db $82 +org $02F285 : db $8F +org $02F28C : db $8F +org $02F295 : db $8F +org $02F29C : db $8F +org $02F304 : db $82 +org $02F30A : db $82 +org $02F32F : db $82 +org $02F335 : db $82 +org $02F412 : db $83 +org $02F419 : db $83 +org $02F420 : db $83 +org $02F427 : db $83 +org $02F42E : db $83 +org $02F440 : db $83 +org $02F452 : db $83 +org $02F459 : db $83 +org $02F460 : db $83 +org $02F467 : db $83 +org $02F46E : db $83 +org $02F480 : db $83 +org $02F492 : db $84 +org $02F499 : db $84 +org $02F4A0 : db $84 +org $02F4A7 : db $84 +org $02F4AE : db $84 +org $02F4C0 : db $84 +org $02F4D2 : db $84 +org $02F4D9 : db $84 +org $02F4E0 : db $84 +org $02F4E7 : db $84 +org $02F4EE : db $84 +org $02F500 : db $84 +org $02F54A : db $82 +org $02F550 : db $82 +org $02F575 : db $82 +org $02F57B : db $82 +org $02F6B3 : db $8B +org $02F6B6 : db $8B +org $02F6B9 : db $8B +org $02F6BC : db $8B +org $02F6BF : db $8B +org $02F6C2 : db $8B +org $02F6C5 : db $8B +org $02F6C8 : db $8B +org $02F6CB : db $8B +org $02F6CE : db $8B +org $02F6D1 : db $8B +org $02F6D4 : db $8B +org $02F6D7 : db $8B +org $02F6DA : db $8B +org $02F6DD : db $8B +org $02F6E0 : db $8B +org $02F6E3 : db $8B +org $02F6E6 : db $8B +org $02F6E9 : db $8B +org $02F6EC : db $8B +org $02F6EF : db $8B +org $02F6F2 : db $8B +org $02F6F5 : db $8B +org $02F6F8 : db $8B +org $02F6FB : db $8B +org $02F6FE : db $8B +org $02F701 : db $8B +org $02F704 : db $8B +org $02F707 : db $8B +org $02F70A : db $8B +org $02F70D : db $8B +org $02F710 : db $8B +org $02F713 : db $8B +org $02F716 : db $8B +org $02F719 : db $8B +org $02F71C : db $8B +org $02F71F : db $8B +org $02F722 : db $8C +org $02F725 : db $8B +org $02F728 : db $8B +org $02F72B : db $8B +org $02F72E : db $8B +org $02F731 : db $8C +org $02F734 : db $8C +org $02F737 : db $8C +org $02F73A : db $8B +org $02F73D : db $8C +org $02F740 : db $8C +org $02F743 : db $8B +org $02F746 : db $8B +org $02F749 : db $8B +org $02F74C : db $8C +org $02F74F : db $8C +org $02F752 : db $8B +org $02F755 : db $8B +org $02F758 : db $8C +org $02F75B : db $8B +org $02F75E : db $8B +org $02F761 : db $8B +org $02F764 : db $8C +org $02F767 : db $8C +org $02F76A : db $8B +org $02F76D : db $8B +org $02F770 : db $8C +org $02F773 : db $8B +org $02F776 : db $8B +org $02F779 : db $8B +org $02F77C : db $8B +org $02F77F : db $8B +org $02F782 : db $8B +org $02F785 : db $8B +org $02F788 : db $8B +org $02F78B : db $8B +org $02F78E : db $8B +org $02F791 : db $8B +org $02F794 : db $8B +org $02F797 : db $8B +org $02F79A : db $8B +org $02F79D : db $8B +org $02F7A0 : db $8B +org $02F7A3 : db $8B +org $02F7A6 : db $8B +org $02F7A9 : db $8B +org $02F7AC : db $8B +org $02F7AF : db $8B +org $02F7B2 : db $8B +org $02F7B5 : db $8B +org $02F7B8 : db $8B +org $02F7BB : db $8B +org $02F7BE : db $8B +org $02F7C1 : db $8B +org $02F7C4 : db $8B +org $02F7C7 : db $8B +org $02F7CA : db $8B +org $02F7CD : db $8B +org $02F7D0 : db $8B +org $02F7D3 : db $8B +org $02F7D6 : db $8B +org $02F7D9 : db $8C +org $02F7DC : db $8C +org $02F7DF : db $8C +org $02F7E2 : db $8C +org $02F7E5 : db $8C +org $02F7E8 : db $8C +org $02F7EB : db $8C +org $02F7EE : db $8C +org $02F7F1 : db $8C +org $02F7F4 : db $8C +org $02F7F7 : db $8C +org $02F7FA : db $8C +org $02F7FD : db $8C +org $02F800 : db $8C +org $02F803 : db $8C +org $02F806 : db $8C +org $02F809 : db $8C +org $02F80C : db $8C +org $02F80F : db $8C +org $02F812 : db $8C +org $02F815 : db $8C +org $02F818 : db $8C +org $02F81B : db $8C +org $02F81E : db $8C +org $02F821 : db $8C +org $02F824 : db $8C +org $02F827 : db $8C +org $02F82A : db $8C +org $02F82D : db $8C +org $02F830 : db $8C +org $02F833 : db $8C +org $02F836 : db $8C +org $02F839 : db $8C +org $02F83C : db $8B +org $02F83F : db $8B +org $02F842 : db $8B +org $02F845 : db $8B +org $02F848 : db $8B +org $02F84B : db $8C +org $02F84E : db $8C +org $02F851 : db $8C +org $02F854 : db $8B +org $02F857 : db $8B +org $02F85A : db $8B +org $02F85D : db $8B +org $02F860 : db $8B +org $02F863 : db $8B +org $02F866 : db $8B +org $02F869 : db $8B +org $02F86C : db $8C +org $02F86F : db $8C +org $02F872 : db $8C +org $02F875 : db $8C +org $02F878 : db $8C +org $02F87B : db $8B +org $02F87E : db $8B +org $02F881 : db $8B +org $02F884 : db $8B +org $02F887 : db $8C +org $02F88A : db $8C +org $02F88D : db $8C +org $02F890 : db $8C +org $02F893 : db $8B +org $02F896 : db $8B +org $02F899 : db $8B +org $02F89C : db $8B +org $02F89F : db $8B +org $02F8A2 : db $8B +org $02F8A5 : db $8B +org $02F8A8 : db $8B +org $02F8AB : db $8B +org $02F8AE : db $8B +org $02F8B1 : db $8B +org $02F8B4 : db $8B +org $02F8B7 : db $8B +org $02F8BA : db $8B +org $02F8BD : db $8B +org $02F8C0 : db $8B +org $02F8C3 : db $8B +org $02F8C6 : db $8B +org $02F8C9 : db $8B +org $02F8CC : db $8B +org $02F8CF : db $8B +org $02F8D2 : db $8B +org $02F8D5 : db $8B +org $02F8D8 : db $8B +org $02F8DB : db $8B +org $02F8DE : db $8B +org $02F8E1 : db $8B +org $02F8E4 : db $8B +org $02F8E7 : db $8B +org $02F8EA : db $8B +org $02F8ED : db $8B +org $02F8F0 : db $8B +org $02F8F3 : db $8B +org $02F8F6 : db $8B +org $02F8F9 : db $8B +org $02F8FC : db $8B +org $02F8FF : db $8B +org $02F902 : db $8C +org $02F905 : db $8B +org $02F908 : db $8B +org $02F90B : db $8B +org $02F90E : db $8B +org $02F911 : db $8C +org $02F914 : db $8C +org $02F917 : db $8C +org $02F91A : db $8B +org $02F91D : db $8C +org $02F920 : db $8C +org $02F923 : db $8B +org $02F926 : db $8B +org $02F929 : db $8B +org $02F92C : db $8C +org $02F92F : db $8C +org $02F932 : db $8B +org $02F935 : db $8B +org $02F938 : db $8C +org $02F93B : db $8B +org $02F93E : db $8B +org $02F941 : db $8B +org $02F944 : db $8C +org $02F947 : db $8C +org $02F94A : db $8B +org $02F94D : db $8B +org $02F950 : db $8C +org $02F953 : db $8B +org $02F956 : db $8B +org $02F959 : db $8B +org $02F95C : db $8B +org $02F95F : db $8B +org $02F962 : db $8B +org $02F965 : db $8B +org $02F968 : db $8B +org $02F96B : db $8B +org $02F96E : db $8B +org $02F971 : db $8B +org $02F974 : db $8B +org $02F977 : db $8B +org $02F97A : db $8B +org $02F97D : db $8B +org $02F980 : db $8B +org $02F983 : db $8B +org $02F986 : db $8B +org $02F989 : db $8B +org $02F98C : db $8B +org $02F98F : db $8B +org $02F992 : db $8B +org $02F995 : db $8B +org $02F998 : db $8B +org $02F99B : db $8B +org $02F99E : db $8B +org $02F9A1 : db $8B +org $02F9A4 : db $8B +org $02F9A7 : db $8B +org $02F9AA : db $8B +org $02F9AD : db $8B +org $02F9B0 : db $8B +org $02F9B3 : db $8B +org $02F9B6 : db $8B +org $02F9B9 : db $8C +org $02F9BC : db $8C +org $02F9BF : db $8C +org $02F9C2 : db $8C +org $02F9C5 : db $8C +org $02F9C8 : db $8C +org $02F9CB : db $8C +org $02F9CE : db $8C +org $02F9D1 : db $8C +org $02F9D4 : db $8C +org $02F9D7 : db $8C +org $02F9DA : db $8C +org $02F9DD : db $8C +org $02F9E0 : db $8C +org $02F9E3 : db $8C +org $02F9E6 : db $8C +org $02F9E9 : db $8C +org $02F9EC : db $8C +org $02F9EF : db $8C +org $02F9F2 : db $8C +org $02F9F5 : db $8C +org $02F9F8 : db $8C +org $02F9FB : db $8C +org $02F9FE : db $8C +org $02FA01 : db $8C +org $02FA04 : db $8C +org $02FA07 : db $8C +org $02FA0A : db $8C +org $02FA0D : db $8C +org $02FA10 : db $8C +org $02FA13 : db $8C +org $02FA16 : db $8C +org $02FA19 : db $8C +org $02FA1C : db $8B +org $02FA1F : db $8B +org $02FA22 : db $8B +org $02FA25 : db $8B +org $02FA28 : db $8B +org $02FA2B : db $8C +org $02FA2E : db $8C +org $02FA31 : db $8C +org $02FA34 : db $8B +org $02FA37 : db $8B +org $02FA3A : db $8B +org $02FA3D : db $8B +org $02FA40 : db $8B +org $02FA43 : db $8B +org $02FA46 : db $8B +org $02FA49 : db $8B +org $02FA4C : db $8C +org $02FA4F : db $8C +org $02FA52 : db $8C +org $02FA55 : db $8C +org $02FA58 : db $8C +org $02FA5B : db $8B +org $02FA5E : db $8B +org $02FA61 : db $8B +org $02FA64 : db $8B +org $02FA67 : db $8C +org $02FA6A : db $8C +org $02FA6D : db $8C +org $02FA70 : db $8C +org $02FA8C : db $8F +org $02FA9D : db $8F +org $02FB4B : db $82 +org $02FB5A : db $82 +org $02FBEA : db $84 +org $02FD98 : db $9B +org $02FDA1 : db $9B +org $02FDBB : db $9B +org $02FDD5 : db $9B +org $03E9FE : db $85 +org $03EA11 : db $86 +org $03EA15 : db $86 +org $03EA19 : db $86 +org $03EA57 : db $83 +org $03EB0B : db $86 +org $03EB23 : db $86 +org $03EB79 : db $8D +org $03EB88 : db $85 +org $04E7C4 : db $84 +org $04E837 : db $82 +org $04E848 : db $87 +org $04E84C : db $80 +org $04E868 : db $87 +org $04E891 : db $8F +org $04E8A3 : db $84 +org $04E8AB : db $84 +org $04E8B1 : db $84 +org $04E8B9 : db $84 +org $04E92B : db $8F +org $04E93D : db $84 +org $04E945 : db $84 +org $04E94D : db $84 +org $04E9A2 : db $84 +org $04E9A5 : db $84 +org $04E9A8 : db $84 +org $04E9AB : db $84 +org $04E9AE : db $84 +org $04E9B1 : db $84 +org $04E9B4 : db $84 +org $04E9B7 : db $84 +org $04E9BA : db $84 +org $04E9BD : db $84 +org $04E9C0 : db $84 +org $04E9C3 : db $84 +org $04E9C6 : db $84 +org $04E9C9 : db $84 +org $04E9CC : db $84 +org $04E9CF : db $84 +org $04E9D2 : db $84 +org $04E9D5 : db $84 +org $04E9D8 : db $84 +org $04EC11 : db $84 +org $04EC14 : db $84 +org $04EC17 : db $84 +org $04EC1A : db $84 +org $04EC1D : db $84 +org $04EC20 : db $84 +org $04EC23 : db $84 +org $04EC26 : db $84 +org $058013 : db $8D +org $05801A : db $85 +org $058020 : db $85 +org $058026 : db $8D +org $05802D : db $85 +org $058033 : db $85 +org $058082 : db $9D +org $0580AE : db $86 +org $0580F9 : db $9D +org $058101 : db $8D +org $0581B0 : db $8D +org $0581EB : db $8D +org $05820C : db $80 +org $058222 : db $8D +org $05822E : db $86 +org $058234 : db $9C +org $05823A : db $87 +org $058249 : db $8D +org $05828B : db $86 +org $0582C8 : db $85 +org $0582E3 : db $9C +org $058301 : db $8D +org $058371 : db $86 +org $058416 : db $86 +org $058462 : db $86 +org $05852B : db $86 +org $05854B : db $8D +org $058579 : db $86 +org $05857F : db $87 +org $058590 : db $86 +org $0585D5 : db $80 +org $058759 : db $80 +org $0587B5 : db $8D +org $0588CB : db $80 +org $0588FB : db $80 +org $05890B : db $87 +org $058911 : db $86 +org $0589B7 : db $87 +org $058A99 : db $8D +org $058AB4 : db $85 +org $058ABB : db $9D +org $058ABF : db $89 +org $058AD5 : db $9D +org $058AD9 : db $89 +org $058AED : db $86 +org $058B25 : db $9D +org $058B69 : db $9D +org $058BC6 : db $9D +org $058C23 : db $9D +org $058C80 : db $9D +org $058CD9 : db $9D +org $058D2E : db $8D +org $058D32 : db $86 +org $058D39 : db $80 +org $058DD6 : db $86 +org $058F6F : db $86 +org $058F89 : db $8D +org $058FCE : db $9D +org $058FD6 : db $8D +org $059006 : db $86 +org $059079 : db $8D +org $059083 : db $8D +org $0591AF : db $86 +org $05921B : db $86 +org $059228 : db $8D +org $059236 : db $9D +org $05923C : db $89 +org $059342 : db $86 +org $0593B4 : db $86 +org $059425 : db $86 +org $059435 : db $80 +org $05947F : db $86 +org $0594D1 : db $8D +org $05956B : db $86 +org $059576 : db $86 +org $05957D : db $9C +org $059581 : db $87 +org $0595B1 : db $86 +org $05965B : db $8D +org $059690 : db $8D +org $059694 : db $86 +org $05969B : db $89 +org $05969F : db $86 +org $0596DD : db $86 +org $059714 : db $86 +org $05971A : db $86 +org $059723 : db $8D +org $05972D : db $86 +org $059765 : db $8D +org $05977F : db $8D +org $059799 : db $86 +org $05980A : db $8D +org $059967 : db $80 +org $05999F : db $87 +org $0599CC : db $89 +org $059A80 : db $85 +org $059ACD : db $9D +org $059AEC : db $89 +org $059B45 : db $8D +org $059B50 : db $9D +org $059B97 : db $8D +org $059CFB : db $86 +org $059D0E : db $8D +org $059D76 : db $80 +org $059D82 : db $86 +org $059DB7 : db $8D +org $059E2F : db $86 +org $059E49 : db $89 +org $059E4F : db $8D +org $059E69 : db $86 +org $059EC4 : db $86 +org $059EDA : db $86 +org $059FAA : db $86 +org $059FE8 : db $85 +org $05A075 : db $89 +org $05A07D : db $9D +org $05A081 : db $89 +org $05A0C8 : db $8D +org $05A123 : db $86 +org $05A127 : db $86 +org $05A12D : db $9C +org $05A131 : db $87 +org $05A148 : db $86 +org $05A18D : db $9D +org $05A1A8 : db $86 +org $05A285 : db $86 +org $05A37D : db $85 +org $05A38C : db $85 +org $05A3A5 : db $86 +org $05A3B2 : db $80 +org $05A3D4 : db $8D +org $05A3EE : db $9A +org $05A3F7 : db $8D +org $05A404 : db $8D +org $05A4BC : db $86 +org $05A4FD : db $8D +org $05A50A : db $8D +org $05A526 : db $89 +org $05A534 : db $89 +org $05A53C : db $9D +org $05A540 : db $89 +org $05A58B : db $9D +org $05A5CD : db $8D +org $05A66C : db $9D +org $05A7C1 : db $8D +org $05A7C9 : db $8D +org $05A825 : db $8D +org $05A8C7 : db $86 +org $05A8E7 : db $8D +org $05A926 : db $8D +org $05A98A : db $86 +org $05A9EE : db $8D +org $05AA96 : db $86 +org $05AACC : db $8D +org $05AB2F : db $8D +org $05AB57 : db $86 +org $05AB69 : db $85 +org $05AB8C : db $86 +org $05AB92 : db $8D +org $05AB96 : db $86 +org $05AB9A : db $86 +org $05AC88 : db $9D +org $05AC90 : db $8D +org $05AF92 : db $86 +org $05AFAB : db $87 +org $05AFB1 : db $86 +org $05B030 : db $86 +org $05B054 : db $86 +org $05B0AA : db $86 +org $05B12C : db $8D +org $05B4C0 : db $83 +org $05B4CD : db $83 +org $05B5B8 : db $86 +org $05B650 : db $86 +org $05B79A : db $8D +org $05B7A0 : db $86 +org $05B7A6 : db $9C +org $05B7AA : db $87 +org $05B7DD : db $86 +org $05B808 : db $86 +org $05B849 : db $8D +org $05B857 : db $8D +org $05B890 : db $86 +org $05B8B1 : db $86 +org $05B8BD : db $86 +org $05B951 : db $86 +org $05BAD6 : db $8D +org $05BB70 : db $9D +org $05BB8B : db $86 +org $05BCD1 : db $8D +org $05BD35 : db $8D +org $05BE08 : db $86 +org $05BE3C : db $86 +org $05BE72 : db $86 +org $05BE77 : db $86 +org $05BE89 : db $86 +org $05BEC6 : db $86 +org $05BEE3 : db $86 +org $05BF09 : db $8D +org $05BF41 : db $86 +org $05BF4F : db $86 +org $05BFC6 : db $9D +org $05BFF6 : db $86 +org $05C038 : db $8D +org $05C067 : db $86 +org $05C153 : db $86 +org $05C1C2 : db $8D +org $05C262 : db $86 +org $05C266 : db $86 +org $05C309 : db $8D +org $05C318 : db $8D +org $05C511 : db $8D +org $05C526 : db $86 +org $05C534 : db $85 +org $05C619 : db $9D +org $05C69C : db $86 +org $05CBEC : db $86 +org $05CBF9 : db $86 +org $05CC15 : db $86 +org $05CC4F : db $8D +org $05CC71 : db $86 +org $05CC7E : db $86 +org $05CC9A : db $86 +org $05CE82 : db $8D +org $05CE91 : db $8D +org $05CFDD : db $86 +org $05D0CA : db $9D +org $05D0D2 : db $8D +org $05D165 : db $86 +org $05D226 : db $86 +org $05D257 : db $9D +org $05D25D : db $89 +org $05D546 : db $9D +org $05D578 : db $86 +org $05D594 : db $85 +org $05D5A3 : db $85 +org $05D6BA : db $86 +org $05D746 : db $86 +org $05D750 : db $87 +org $05D7A9 : db $8D +org $05D7FF : db $86 +org $05D854 : db $86 +org $05D85E : db $86 +org $05D959 : db $86 +org $05D997 : db $86 +org $05D99C : db $86 +org $05D9A6 : db $87 +org $05DA18 : db $8D +org $05DB2F : db $9D +org $05DB94 : db $80 +org $05DBA9 : db $86 +org $05DBAF : db $9C +org $05DBB5 : db $87 +org $05DBCC : db $80 +org $05DBDE : db $80 +org $05DBEE : db $80 +org $05DC3E : db $8D +org $05DC9C : db $8D +org $05DCEE : db $8D +org $05DCF5 : db $9E +org $05DCF9 : db $85 +org $05DD03 : db $80 +org $05DD18 : db $80 +org $05DD26 : db $85 +org $05DD5D : db $8D +org $05DD69 : db $80 +org $05DD86 : db $85 +org $05DDAE : db $85 +org $05DDD5 : db $85 +org $05DE14 : db $85 +org $05DE2F : db $8D +org $05DE39 : db $80 +org $05DE47 : db $80 +org $05DE6D : db $85 +org $05DEA1 : db $85 +org $05DF1F : db $80 +org $05DF29 : db $86 +org $05DF2F : db $87 +org $05DF37 : db $85 +org $05DF4C : db $87 +org $05DFE8 : db $86 +org $05E01C : db $85 +org $05E033 : db $85 +org $05E042 : db $85 +org $05E04C : db $85 +org $05E050 : db $9E +org $05E05E : db $80 +org $05E073 : db $8D +org $05E0BE : db $8D +org $05E19D : db $85 +org $05E1A1 : db $86 +org $05E1B0 : db $86 +org $05E1B6 : db $87 +org $05E1D0 : db $85 +org $05E1E0 : db $85 +org $05E1F9 : db $86 +org $05E20B : db $85 +org $05E236 : db $9C +org $05E23C : db $87 +org $05E258 : db $86 +org $05E25F : db $87 +org $05E265 : db $86 +org $05E286 : db $9D +org $05E28A : db $85 +org $05E297 : db $86 +org $05E29E : db $87 +org $05E2A4 : db $86 +org $05E2C4 : db $8D +org $05E2C9 : db $9B +org $05E39D : db $85 +org $05E3A1 : db $86 +org $05E3B8 : db $9E +org $05E3CA : db $85 +org $05E3ED : db $85 +org $05E3F1 : db $86 +org $05E40D : db $86 +org $05E414 : db $9C +org $05E41A : db $87 +org $05E427 : db $8D +org $05E444 : db $87 +org $05E44E : db $80 +org $05E45E : db $87 +org $05E471 : db $80 +org $05E48B : db $85 +org $05E4A5 : db $85 +org $05E4B0 : db $86 +org $05E4CD : db $85 +org $05E4F5 : db $8D +org $05E4FE : db $85 +org $05E504 : db $8D +org $05E563 : db $86 +org $05E629 : db $86 +org $05E63B : db $86 +org $05E6B2 : db $9A +org $05E6BE : db $9A +org $05E6D0 : db $85 +org $05E6E1 : db $85 +org $05E6EB : db $86 +org $05E6F1 : db $85 +org $05E6FD : db $80 +org $05E779 : db $85 +org $05E788 : db $89 +org $05E7EE : db $9B +org $05E814 : db $86 +org $05E87E : db $9B +org $05E8BB : db $85 +org $05E8BF : db $9E +org $05E8D4 : db $86 +org $05E8EC : db $80 +org $05E8FA : db $85 +org $05E907 : db $86 +org $05E90D : db $87 +org $05E99F : db $85 +org $05E9AF : db $9A +org $05EA6B : db $85 +org $05EA6F : db $86 +org $05EA89 : db $86 +org $05EA8D : db $9E +org $05EA91 : db $87 +org $05EA98 : db $8D +org $05EAB3 : db $80 +org $05EAC5 : db $85 +org $05EAE6 : db $85 +org $05EB06 : db $85 +org $05EB12 : db $85 +org $05EB20 : db $87 +org $05EB4C : db $85 +org $05EB58 : db $85 +org $05EB6B : db $9A +org $05EB7F : db $86 +org $05EBC1 : db $85 +org $05EBC5 : db $86 +org $05EBF5 : db $80 +org $05EC51 : db $9D +org $05ECA1 : db $8D +org $05ECA8 : db $9E +org $05ECAC : db $85 +org $05ECB8 : db $80 +org $05ECCE : db $80 +org $05ECDC : db $86 +org $05ED09 : db $85 +org $05ED2A : db $85 +org $05ED38 : db $85 +org $05ED4F : db $80 +org $05ED5A : db $82 +org $05ED5E : db $89 +org $05ED6F : db $80 +org $05EDCB : db $85 +org $05EDDE : db $80 +org $05EDE9 : db $80 +org $05EDFC : db $85 +org $05EE3B : db $85 +org $05EE7B : db $86 +org $05EE7F : db $87 +org $05EE85 : db $86 +org $05EE94 : db $87 +org $05EECC : db $85 +org $05EED4 : db $86 +org $05EEF7 : db $85 +org $05EF60 : db $80 +org $05EF65 : db $86 +org $05EF78 : db $85 +org $05EF7C : db $86 +org $05EFB7 : db $9D +org $05EFBB : db $87 +org $05EFC2 : db $86 +org $05EFD1 : db $87 +org $05EFE8 : db $87 +org $05EFF1 : db $87 +org $05F033 : db $86 +org $05F03A : db $87 +org $05F086 : db $86 +org $05F09B : db $87 +org $05F0A4 : db $87 +org $05F0AD : db $8D +org $05F0BF : db $85 +org $05F0DE : db $9E +org $05F0E5 : db $80 +org $05F101 : db $85 +org $05F115 : db $85 +org $05F125 : db $85 +org $05F135 : db $85 +org $05F13F : db $85 +org $05F153 : db $80 +org $05F16F : db $85 +org $05F193 : db $85 +org $05F1AB : db $85 +org $05F1BF : db $85 +org $05F1D1 : db $85 +org $05F1DB : db $85 +org $05F1F0 : db $85 +org $05F203 : db $87 +org $05F215 : db $85 +org $05F254 : db $85 +org $05F258 : db $86 +org $05F2A4 : db $80 +org $05F2B5 : db $8D +org $05F2DB : db $9D +org $05F2E1 : db $8D +org $05F2E7 : db $8D +org $05F305 : db $89 +org $05F30F : db $8D +org $05F321 : db $86 +org $05F327 : db $9C +org $05F32D : db $87 +org $05F334 : db $87 +org $05F33E : db $80 +org $05F3B0 : db $87 +org $05F3C2 : db $85 +org $05F41A : db $87 +org $05F42C : db $85 +org $05F47A : db $9E +org $05F481 : db $80 +org $05F499 : db $85 +org $05F4B2 : db $85 +org $05F4BC : db $85 +org $05F4D0 : db $85 +org $05F4D9 : db $85 +org $05F4E2 : db $85 +org $05F51F : db $85 +org $05F562 : db $9D +org $05F593 : db $9D +org $05F5C4 : db $9D +org $05F5F5 : db $9D +org $05F639 : db $80 +org $05F64D : db $9E +org $05F651 : db $86 +org $05F65C : db $87 +org $05F665 : db $87 +org $05F68C : db $85 +org $05F697 : db $9E +org $05F6A9 : db $85 +org $05F6B3 : db $86 +org $05F6CA : db $9E +org $05F6D2 : db $8D +org $05F6F0 : db $87 +org $05F6F9 : db $85 +org $05F729 : db $85 +org $05F734 : db $9E +org $05F746 : db $85 +org $05F750 : db $86 +org $05F767 : db $9E +org $05F76F : db $8D +org $05F78D : db $87 +org $05F796 : db $85 +org $05F7CE : db $85 +org $05F7D9 : db $9E +org $05F7EB : db $85 +org $05F7F5 : db $86 +org $05F80C : db $9E +org $05F814 : db $8D +org $05F832 : db $87 +org $05F83B : db $85 +org $05F845 : db $85 +org $05F84B : db $8D +org $05F87E : db $85 +org $05F896 : db $85 +org $05F89D : db $9E +org $05F8A1 : db $87 +org $05F8EA : db $85 +org $05F8F8 : db $85 +org $05F938 : db $85 +org $05F93C : db $86 +org $05F942 : db $86 +org $05F947 : db $86 +org $05F94C : db $86 +org $05FA53 : db $86 +org $05FA74 : db $86 +org $05FA83 : db $9C +org $05FAC6 : db $9B +org $05FADA : db $9E +org $05FAE4 : db $86 +org $05FAF4 : db $80 +org $05FB0A : db $86 +org $05FB1D : db $89 +org $05FB23 : db $8D +org $05FB73 : db $85 +org $05FBB7 : db $89 +org $05FBC5 : db $85 +org $05FBCA : db $82 +org $05FBDA : db $8D +org $05FBE7 : db $89 +org $05FBFD : db $80 +org $05FC07 : db $86 +org $05FC0E : db $86 +org $05FC3E : db $8D +org $05FC45 : db $80 +org $05FC9C : db $8D +org $05FCA1 : db $86 +org $05FCA8 : db $86 +org $05FCD8 : db $8D +org $05FCDF : db $80 +org $05FD3E : db $87 +org $05FD47 : db $87 +org $05FD60 : db $86 +org $05FD67 : db $9C +org $05FD6D : db $87 +org $05FD91 : db $80 +org $05FEF5 : db $86 +org $05FF37 : db $86 +org $05FF3E : db $9D +org $05FF5C : db $89 +org $05FF6F : db $9E +org $05FF73 : db $85 +org $05FF8C : db $85 +org $05FF9D : db $85 +org $05FFF9 : db $85 +org $05FFFD : db $86 +org $06805C : db $8D +org $06806B : db $9D +org $068071 : db $89 +org $06813B : db $86 +org $06814F : db $8D +org $068183 : db $8D +org $0681E1 : db $9A +org $06826B : db $8D +org $06827C : db $8D +org $06828D : db $9D +org $06833E : db $89 +org $068364 : db $89 +org $068368 : db $89 +org $068397 : db $88 +org $06839B : db $89 +org $0683AD : db $89 +org $0683B8 : db $9D +org $0683C5 : db $83 +org $06840A : db $8D +org $068410 : db $8D +org $068416 : db $8D +org $068478 : db $85 +org $0684F3 : db $80 +org $068539 : db $89 +org $068541 : db $9D +org $068546 : db $9D +org $06854B : db $89 +org $0685AD : db $8D +org $06864B : db $85 +org $068650 : db $8D +org $06865A : db $80 +org $068857 : db $85 +org $068871 : db $85 +org $0688C3 : db $9D +org $0688CD : db $9D +org $0688D5 : db $9D +org $0688EC : db $8D +org $068949 : db $9D +org $06895F : db $9D +org $0689BC : db $80 +org $0689C0 : db $89 +org $0689D0 : db $9D +org $0689E1 : db $9D +org $068A21 : db $9D +org $068A4E : db $9E +org $068A97 : db $8D +org $068ACE : db $8D +org $068B00 : db $9E +org $068B40 : db $8D +org $068B59 : db $9D +org $068B5F : db $89 +org $068B7E : db $8D +org $068B9F : db $85 +org $068BBC : db $9A +org $068C16 : db $80 +org $068C38 : db $9E +org $068C40 : db $9E +org $068C48 : db $9E +org $068C51 : db $9E +org $068C59 : db $9E +org $068C61 : db $9E +org $068C80 : db $9E +org $068C88 : db $9E +org $068C90 : db $9E +org $068D1E : db $80 +org $068DCB : db $9D +org $068ECB : db $8D +org $068F37 : db $8D +org $068F8A : db $8D +org $068F9A : db $9D +org $068FA2 : db $85 +org $069063 : db $9D +org $069069 : db $9D +org $069166 : db $8D +org $0691B9 : db $9E +org $0691C7 : db $9D +org $0691D2 : db $9E +org $069207 : db $8D +org $06921B : db $9E +org $069252 : db $9E +org $069264 : db $80 +org $069473 : db $9D +org $069478 : db $9D +org $06947D : db $9D +org $0694D3 : db $8D +org $0694DC : db $9C +org $0694E0 : db $87 +org $069500 : db $80 +org $06952E : db $8D +org $06954C : db $8D +org $069617 : db $80 +org $06962D : db $8D +org $06964F : db $8D +org $069681 : db $9D +org $069687 : db $89 +org $06968B : db $86 +org $069717 : db $80 +org $069731 : db $8D +org $06973F : db $8D +org $069773 : db $8D +org $069812 : db $9D +org $069844 : db $8D +org $069860 : db $80 +org $069881 : db $8D +org $06988B : db $8D +org $06989C : db $8D +org $0698C8 : db $9D +org $069903 : db $80 +org $069916 : db $8D +org $069975 : db $8D +org $0699F7 : db $9D +org $069BE4 : db $85 +org $069C4D : db $80 +org $069C71 : db $8D +org $069CA1 : db $8D +org $069E22 : db $85 +org $069E46 : db $80 +org $069E58 : db $8D +org $069F08 : db $85 +org $069F30 : db $80 +org $069F68 : db $9D +org $069F6E : db $86 +org $069FCB : db $8D +org $06A001 : db $8D +org $06A011 : db $8D +org $06A216 : db $85 +org $06A2D7 : db $8D +org $06A33B : db $8D +org $06A34C : db $8D +org $06A35F : db $9D +org $06A365 : db $89 +org $06A3FC : db $85 +org $06A50F : db $85 +org $06A516 : db $9D +org $06A545 : db $9D +org $06A5EE : db $8D +org $06A68E : db $8D +org $06A697 : db $85 +org $06A69E : db $85 +org $06A6A6 : db $8D +org $06A735 : db $86 +org $06A740 : db $8D +org $06A759 : db $86 +org $06A767 : db $86 +org $06A7C9 : db $86 +org $06A7EB : db $9D +org $06A7F5 : db $8D +org $06A800 : db $8D +org $06A859 : db $8D +org $06A85E : db $9A +org $06A8E0 : db $86 +org $06A908 : db $9D +org $06A90E : db $89 +org $06A961 : db $8D +org $06A9CC : db $9D +org $06A9D5 : db $89 +org $06AA0A : db $8D +org $06ABDC : db $8D +org $06AC5B : db $9D +org $06AD53 : db $86 +org $06AD80 : db $9E +org $06AD97 : db $80 +org $06ADA8 : db $80 +org $06ADB6 : db $85 +org $06ADD8 : db $85 +org $06ADE4 : db $85 +org $06ADEF : db $80 +org $06AE0D : db $85 +org $06AE18 : db $80 +org $06AE37 : db $85 +org $06AE52 : db $8D +org $06AE61 : db $85 +org $06AE8F : db $80 +org $06AEAE : db $85 +org $06AF3F : db $85 +org $06AF49 : db $80 +org $06AF54 : db $80 +org $06AF63 : db $8D +org $06AF92 : db $80 +org $06AFE9 : db $82 +org $06AFF8 : db $8D +org $06B004 : db $80 +org $06B014 : db $80 +org $06B018 : db $82 +org $06B04B : db $8D +org $06B055 : db $80 +org $06B06B : db $80 +org $06B07B : db $85 +org $06B089 : db $85 +org $06B097 : db $85 +org $06B0B2 : db $85 +org $06B0BE : db $85 +org $06B0CC : db $87 +org $06B102 : db $8D +org $06B1B2 : db $9D +org $06B1FC : db $80 +org $06B211 : db $80 +org $06B260 : db $9E +org $06B268 : db $85 +org $06B285 : db $9E +org $06B2AD : db $85 +org $06B2BE : db $80 +org $06B2C2 : db $89 +org $06B335 : db $85 +org $06B352 : db $85 +org $06B3CB : db $8D +org $06B3D2 : db $80 +org $06B402 : db $85 +org $06B41B : db $85 +org $06B42C : db $85 +org $06B43B : db $85 +org $06B473 : db $85 +org $06B47F : db $85 +org $06B498 : db $85 +org $06B4A4 : db $85 +org $06B4B0 : db $85 +org $06B4C1 : db $85 +org $06B4DA : db $85 +org $06B4F6 : db $85 +org $06B525 : db $85 +org $06B53B : db $85 +org $06B54E : db $85 +org $06B564 : db $87 +org $06B577 : db $9D +org $06B5AC : db $85 +org $06B5B3 : db $9D +org $06B699 : db $85 +org $06B6DA : db $9D +org $06B739 : db $8D +org $06B750 : db $85 +org $06B7AE : db $86 +org $06B7BF : db $8D +org $06B7C7 : db $86 +org $06B901 : db $9C +org $06B907 : db $87 +org $06B918 : db $8D +org $06B922 : db $9E +org $06B952 : db $8D +org $06B957 : db $8D +org $06B961 : db $80 +org $06B96D : db $87 +org $06B997 : db $85 +org $06B9C9 : db $85 +org $06B9D7 : db $87 +org $06B9EC : db $85 +org $06BA12 : db $80 +org $06BA33 : db $8D +org $06BA55 : db $8D +org $06BA68 : db $8D +org $06BCAC : db $9C +org $06BCB2 : db $87 +org $06BCBD : db $9E +org $06BCC4 : db $80 +org $06BCD8 : db $85 +org $06BCF1 : db $86 +org $06BD16 : db $80 +org $06BD1A : db $89 +org $06BD2B : db $87 +org $06BD3B : db $85 +org $06BD47 : db $85 +org $06BD60 : db $85 +org $06BD6F : db $87 +org $06BD8B : db $85 +org $06BD99 : db $85 +org $06BDA2 : db $85 +org $06BDC5 : db $85 +org $06BDCF : db $80 +org $06BDDB : db $83 +org $06BDEC : db $9C +org $06BDF2 : db $87 +org $06BDF9 : db $80 +org $06BE62 : db $85 +org $06BE84 : db $87 +org $06BEAA : db $9D +org $06BEB0 : db $89 +org $06BEC1 : db $8D +org $06BEFA : db $9D +org $06BF00 : db $89 +org $06BF58 : db $9D +org $06BFBC : db $9D +org $06BFC2 : db $89 +org $06BFEB : db $85 +org $06BFF0 : db $85 +org $06BFF5 : db $85 +org $06BFFA : db $9E +org $06BFFF : db $9D +org $06C004 : db $9E +org $06C009 : db $85 +org $06C00E : db $85 +org $06C013 : db $9E +org $06C018 : db $85 +org $06C01D : db $85 +org $06C022 : db $85 +org $06C027 : db $85 +org $06C02C : db $85 +org $06C031 : db $85 +org $06C036 : db $85 +org $06C03B : db $85 +org $06C040 : db $85 +org $06C045 : db $9A +org $06C04A : db $85 +org $06C04F : db $85 +org $06C054 : db $85 +org $06C059 : db $85 +org $06C05E : db $85 +org $06C063 : db $85 +org $06C068 : db $85 +org $06C06D : db $85 +org $06C072 : db $85 +org $06C077 : db $85 +org $06C07C : db $85 +org $06C081 : db $85 +org $06C086 : db $85 +org $06C08B : db $85 +org $06C090 : db $85 +org $06C095 : db $85 +org $06C09A : db $85 +org $06C09F : db $85 +org $06C0A4 : db $85 +org $06C0A9 : db $85 +org $06C0AE : db $85 +org $06C0B3 : db $85 +org $06C0B8 : db $86 +org $06C0BD : db $8D +org $06C0C2 : db $8D +org $06C0C7 : db $8D +org $06C0CC : db $8D +org $06C0D1 : db $8D +org $06C0D6 : db $8D +org $06C0DB : db $8D +org $06C0E0 : db $9D +org $06C13D : db $87 +org $06C15C : db $9C +org $06C16E : db $8D +org $06C178 : db $9C +org $06C234 : db $86 +org $06C27D : db $85 +org $06C34A : db $9D +org $06C351 : db $8D +org $06C368 : db $8D +org $06C3AE : db $8D +org $06C437 : db $80 +org $06C45A : db $80 +org $06C4E1 : db $89 +org $06C4F1 : db $89 +org $06C503 : db $85 +org $06C510 : db $87 +org $06C51A : db $85 +org $06C523 : db $87 +org $06C527 : db $89 +org $06C55B : db $85 +org $06C56E : db $85 +org $06C5D4 : db $89 +org $06C617 : db $85 +org $06C628 : db $9D +org $06C662 : db $82 +org $06C666 : db $80 +org $06C677 : db $80 +org $06C689 : db $85 +org $06C68E : db $82 +org $06C6BD : db $8D +org $06C6CD : db $85 +org $06C6D6 : db $85 +org $06C6E1 : db $82 +org $06C6F9 : db $80 +org $06C71A : db $80 +org $06C71E : db $82 +org $06C740 : db $8D +org $06C750 : db $85 +org $06C759 : db $85 +org $06C772 : db $85 +org $06C786 : db $8D +org $06C79F : db $85 +org $06C7B4 : db $87 +org $06C7BE : db $85 +org $06C7C7 : db $87 +org $06C7DA : db $85 +org $06C7EB : db $85 +org $06C82D : db $89 +org $06C831 : db $8D +org $06C84E : db $9D +org $06C888 : db $82 +org $06C88C : db $80 +org $06C89D : db $80 +org $06C8AF : db $85 +org $06C8B4 : db $82 +org $06C924 : db $85 +org $06C94F : db $85 +org $06C958 : db $85 +org $06C974 : db $82 +org $06C98C : db $80 +org $06C9B0 : db $80 +org $06C9B4 : db $82 +org $06C9C3 : db $87 +org $06C9E3 : db $85 +org $06C9F7 : db $85 +org $06CA0F : db $85 +org $06CBA8 : db $85 +org $06CC29 : db $8D +org $06CCA0 : db $8D +org $06CF09 : db $80 +org $06CF99 : db $86 +org $06CFBE : db $80 +org $06CFD0 : db $86 +org $06CFE2 : db $85 +org $06CFEA : db $9E +org $06CFF4 : db $9E +org $06D002 : db $8D +org $06D00F : db $85 +org $06D04C : db $9E +org $06D055 : db $9E +org $06D0B1 : db $9E +org $06D0ED : db $8D +org $06D12B : db $86 +org $06D154 : db $8D +org $06D159 : db $80 +org $06D189 : db $87 +org $06D1AB : db $89 +org $06D1B2 : db $8D +org $06D259 : db $8D +org $06D420 : db $8D +org $06D4DA : db $8D +org $06D4E0 : db $9D +org $06D5DA : db $8D +org $06D81B : db $8D +org $06D825 : db $9D +org $06D82B : db $89 +org $06D8B9 : db $9A +org $06D911 : db $8D +org $06DDCE : db $8D +org $06DFAE : db $8D +org $06DFCC : db $8D +org $06E046 : db $8D +org $06E054 : db $8D +org $06E0C3 : db $8D +org $06E0D8 : db $9D +org $06E0DE : db $89 +org $06E0F5 : db $8D +org $06E0FF : db $8D +org $06E115 : db $8D +org $06E1F6 : db $86 +org $06E219 : db $86 +org $06E25F : db $8D +org $06E291 : db $9D +org $06E297 : db $89 +org $06E2BF : db $9E +org $06E2F3 : db $8D +org $06E304 : db $8D +org $06E315 : db $9E +org $06E496 : db $89 +org $06E5AC : db $9D +org $06E7B6 : db $8D +org $06E81D : db $9D +org $06E848 : db $86 +org $06E8D3 : db $80 +org $06EBB4 : db $8D +org $06EBC1 : db $8D +org $06EC07 : db $86 +org $06EC60 : db $86 +org $06EC7F : db $86 +org $06ECC8 : db $86 +org $06ECFB : db $86 +org $06ED29 : db $8D +org $06ED73 : db $86 +org $06EDC9 : db $8D +org $06EDD7 : db $8D +org $06EDDB : db $85 +org $06EDE4 : db $8D +org $06EDF1 : db $86 +org $06EE60 : db $8D +org $06EE6B : db $8D +org $06EE72 : db $86 +org $06EE9F : db $8D +org $06EEE7 : db $8D +org $06EF2F : db $8D +org $06EFA6 : db $8D +org $06EFF5 : db $89 +org $06F067 : db $89 +org $06F098 : db $8D +org $06F0D7 : db $89 +org $06F1B2 : db $8D +org $06F1B6 : db $86 +org $06F1C3 : db $8D +org $06F289 : db $8D +org $06F317 : db $8D +org $06F365 : db $8D +org $06F45D : db $8D +org $06F6C9 : db $8D +org $06F6DA : db $8D +org $06F8A0 : db $8D +org $06F8A6 : db $8D +org $06F9BB : db $8D +org $06F9F6 : db $8D +org $06FA35 : db $89 +org $06FA3D : db $85 +org $06FA41 : db $89 +org $06FBFB : db $89 +org $06FC20 : db $8D +org $06FC3F : db $86 +org $06FC4B : db $8D +org $06FD39 : db $85 +org $06FF76 : db $89 +org $06FFD0 : db $86 +org $07803C : db $8D +org $07815B : db $87 +org $0782BB : db $87 +org $0782C2 : db $87 +org $0782FE : db $87 +org $078320 : db $89 +org $07834A : db $82 +org $07836E : db $89 +org $078380 : db $87 +org $07838C : db $82 +org $0783DE : db $87 +org $0783F0 : db $82 +org $07846C : db $87 +org $078473 : db $87 +org $07854C : db $87 +org $0785A2 : db $89 +org $0785D1 : db $89 +org $07862D : db $89 +org $078659 : db $88 +org $078698 : db $88 +org $0786A8 : db $88 +org $0786EC : db $89 +org $078797 : db $89 +org $0787D4 : db $89 +org $0787E5 : db $81 +org $07883E : db $87 +org $0788FF : db $87 +org $07898D : db $87 +org $078A19 : db $87 +org $078A5A : db $89 +org $078B1E : db $87 +org $078C4C : db $87 +org $078DCD : db $87 +org $078EDD : db $87 +org $078F2A : db $89 +org $078F50 : db $89 +org $07905F : db $89 +org $079090 : db $87 +org $0790B7 : db $87 +org $0790ED : db $89 +org $079149 : db $87 +org $079150 : db $87 +org $07918D : db $87 +org $0791FD : db $87 +org $079205 : db $89 +org $079209 : db $86 +org $079411 : db $87 +org $079418 : db $87 +org $07941F : db $87 +org $079496 : db $82 +org $0794A4 : db $80 +org $0794D9 : db $81 +org $0794DE : db $9B +org $0794EE : db $81 +org $0794F5 : db $81 +org $07951D : db $8D +org $07954D : db $87 +org $0795AC : db $89 +org $0795F7 : db $87 +org $079603 : db $89 +org $07973A : db $87 +org $079766 : db $87 +org $07976D : db $87 +org $079841 : db $87 +org $079962 : db $81 +org $079979 : db $82 +org $07997F : db $82 +org $07999B : db $81 +org $0799FA : db $89 +org $079A11 : db $8D +org $079A41 : db $89 +org $079A5F : db $89 +org $079C8F : db $9C +org $079C93 : db $8D +org $079D2F : db $89 +org $079DD1 : db $89 +org $079E35 : db $9C +org $079E4C : db $89 +org $079E83 : db $8D +org $079E92 : db $8D +org $079E9C : db $8D +org $079EA2 : db $8D +org $079EC4 : db $8D +org $079ECF : db $8D +org $079ED5 : db $8D +org $079F5D : db $89 +org $079F66 : db $88 +org $079FC5 : db $89 +org $079FD4 : db $9A +org $07A052 : db $89 +org $07A07C : db $8D +org $07A0D7 : db $89 +org $07A146 : db $89 +org $07A1A7 : db $8D +org $07A1D2 : db $8D +org $07A208 : db $8D +org $07A211 : db $9E +org $07A220 : db $8D +org $07A229 : db $9E +org $07A238 : db $8D +org $07A25A : db $89 +org $07A25E : db $81 +org $07A266 : db $89 +org $07A2E6 : db $89 +org $07A37C : db $89 +org $07A390 : db $89 +org $07A3A1 : db $89 +org $07A3AA : db $9D +org $07A43E : db $89 +org $07A44A : db $89 +org $07A45E : db $89 +org $07A552 : db $89 +org $07A634 : db $88 +org $07A6F0 : db $87 +org $07A763 : db $89 +org $07A772 : db $89 +org $07A86E : db $87 +org $07A8E5 : db $89 +org $07A928 : db $9C +org $07A95E : db $82 +org $07A99D : db $87 +org $07A9F8 : db $81 +org $07AA08 : db $87 +org $07AAE3 : db $80 +org $07AAEB : db $89 +org $07AAF9 : db $89 +org $07AB53 : db $89 +org $07ACB7 : db $82 +org $07ACD4 : db $87 +org $07ACDC : db $89 +org $07AD35 : db $87 +org $07ADF1 : db $89 +org $07AE37 : db $89 +org $07AEDA : db $88 +org $07AF47 : db $89 +org $07B0CF : db $9C +org $07B137 : db $81 +org $07B13D : db $9B +org $07B154 : db $86 +org $07B230 : db $81 +org $07B236 : db $9B +org $07B248 : db $86 +org $07B3D5 : db $87 +org $07B491 : db $89 +org $07B4D3 : db $87 +org $07B50D : db $9C +org $07B571 : db $81 +org $07B58C : db $89 +org $07B592 : db $89 +org $07B5A2 : db $87 +org $07BB0B : db $81 +org $07BB91 : db $81 +org $07BC0B : db $81 +org $07BC26 : db $87 +org $07BC5E : db $89 +org $07BF14 : db $87 +org $07BF8A : db $89 +org $07C110 : db $89 +org $07C1A0 : db $9B +org $07C1A9 : db $9B +org $07C39F : db $87 +org $07C565 : db $87 +org $07C61E : db $81 +org $07C6A4 : db $81 +org $07C6BF : db $87 +org $07C6FD : db $89 +org $07C946 : db $87 +org $07C9C6 : db $89 +org $07D11F : db $82 +org $07D282 : db $87 +org $07D299 : db $87 +org $07D3D5 : db $81 +org $07DC16 : db $80 +org $07DC36 : db $9B +org $07E8E4 : db $87 +org $07E8E8 : db $87 +org $07E981 : db $82 +org $07E992 : db $82 +org $07E9A9 : db $82 +org $07E9BA : db $82 +org $07E9D6 : db $82 +org $07E9DC : db $82 +org $07E9E6 : db $82 +org $07E9EC : db $82 +org $07E9F2 : db $82 +org $07EA06 : db $87 +org $07EBAA : db $80 +org $07F0C8 : db $8D +org $07F15A : db $87 +org $07F199 : db $87 +org $07F2ED : db $87 +org $07F2F1 : db $87 +org $07F31D : db $82 +org $07F329 : db $89 +org $07F3B9 : db $87 +org $07F3BD : db $87 +org $07F402 : db $87 +org $07F406 : db $87 +org $07F4F5 : db $81 +org $07F8EF : db $80 +org $08801B : db $8D +org $08803B : db $8D +org $0880BA : db $9C +org $0880C8 : db $87 +org $088109 : db $89 +org $0881DC : db $9C +org $088223 : db $9C +org $088275 : db $83 +org $0882D9 : db $86 +org $0882DE : db $86 +org $08830C : db $86 +org $088351 : db $8D +org $088357 : db $8D +org $08835D : db $8D +org $08846E : db $8D +org $088474 : db $8D +org $08847A : db $8D +org $088753 : db $81 +org $0887E6 : db $89 +org $088A52 : db $80 +org $088A5C : db $86 +org $088A8A : db $86 +org $088C94 : db $80 +org $088C9E : db $86 +org $088CB8 : db $86 +org $088DB7 : db $86 +org $088DBD : db $86 +org $088DDB : db $9D +org $088E63 : db $86 +org $088FAF : db $8D +org $088FB5 : db $8D +org $088FBB : db $8D +org $088FFC : db $88 +org $089043 : db $88 +org $089178 : db $89 +org $0891A0 : db $86 +org $0891EC : db $89 +org $089796 : db $81 +org $08989E : db $86 +org $0898CA : db $83 +org $08A188 : db $89 +org $08A4FD : db $88 +org $08A663 : db $89 +org $08A7AE : db $8D +org $08A7B4 : db $8D +org $08A870 : db $81 +org $08AA8C : db $8D +org $08AA92 : db $8D +org $08AAEC : db $82 +org $08AAF0 : db $82 +org $08AAF8 : db $82 +org $08AAFC : db $82 +org $08AC0C : db $86 +org $08AD08 : db $82 +org $08AD0C : db $82 +org $08B233 : db $89 +org $08B2A5 : db $86 +org $08B4A3 : db $9C +org $08B4AB : db $9C +org $08B4D4 : db $89 +org $08B6BC : db $86 +org $08B6C0 : db $86 +org $08BB9C : db $86 +org $08BBA2 : db $86 +org $08BBCC : db $85 +org $08BBD9 : db $86 +org $08BBFC : db $9C +org $08BCBE : db $89 +org $08BE24 : db $87 +org $08BED6 : db $89 +org $08C053 : db $8D +org $08C05B : db $8D +org $08C45E : db $89 +org $08C475 : db $87 +org $08C503 : db $9B +org $08C52E : db $80 +org $08C556 : db $89 +org $08C601 : db $9C +org $08C6A3 : db $80 +org $08C6CB : db $89 +org $08C6E1 : db $89 +org $08C6FC : db $89 +org $08CAEC : db $80 +org $08CB1F : db $9B +org $08CB6D : db $87 +org $08CC6B : db $82 +org $08CCC1 : db $89 +org $08CD3D : db $9C +org $08CDFD : db $9B +org $08CF0A : db $8D +org $08D01E : db $87 +org $08D0B8 : db $9B +org $08D0C0 : db $89 +org $08D419 : db $82 +org $08D41F : db $82 +org $08D55A : db $8D +org $08D804 : db $9C +org $08D9A1 : db $88 +org $08DA0A : db $88 +org $08DD94 : db $88 +org $08DDEC : db $9C +org $08DDFA : db $9C +org $08DEF1 : db $87 +org $08DF62 : db $89 +org $08E0B5 : db $89 +org $08E115 : db $89 +org $08E170 : db $87 +org $08E209 : db $89 +org $08E258 : db $86 +org $08E25E : db $86 +org $08E2BB : db $86 +org $08E2D4 : db $86 +org $08E448 : db $89 +org $08E880 : db $87 +org $08E902 : db $9C +org $08EABD : db $9D +org $08EBB9 : db $9C +org $08EBC2 : db $9C +org $08EBCE : db $9C +org $08EBD5 : db $9C +org $08EE05 : db $82 +org $08EE24 : db $8D +org $08F285 : db $81 +org $08F363 : db $8D +org $08F402 : db $8D +org $08F408 : db $8D +org $08F640 : db $89 +org $08F647 : db $9C +org $08F924 : db $8D +org $08F92A : db $8D +org $08FA6C : db $82 +org $08FA82 : db $82 +org $08FAF4 : db $9C +org $08FB00 : db $9C +org $08FB15 : db $9C +org $08FB21 : db $9C +org $08FB45 : db $8D +org $08FB4F : db $8D +org $08FB54 : db $8D +org $09809E : db $88 +org $09813D : db $8D +org $098151 : db $88 +org $09816E : db $89 +org $0981A2 : db $8D +org $0982FF : db $89 +org $09834F : db $8D +org $09835A : db $8D +org $098363 : db $89 +org $098661 : db $9B +org $0986FD : db $89 +org $098701 : db $8D +org $09874C : db $8D +org $09875D : db $8D +org $098781 : db $80 +org $098785 : db $9B +org $09878F : db $80 +org $0987A2 : db $80 +org $0987A6 : db $9B +org $0987DA : db $89 +org $098877 : db $8D +org $09889D : db $8D +org $0988A8 : db $8D +org $098A2C : db $8D +org $098A46 : db $80 +org $098A50 : db $80 +org $098A5A : db $80 +org $098AE1 : db $8D +org $098AF1 : db $80 +org $098BD5 : db $80 +org $098C70 : db $88 +org $098C88 : db $80 +org $098DE1 : db $87 +org $098DFF : db $88 +org $098E9E : db $88 +org $098EA6 : db $88 +org $098F3D : db $8D +org $0990A8 : db $8D +org $099105 : db $8D +org $099110 : db $8D +org $09915E : db $8D +org $099169 : db $8D +org $0991CD : db $8D +org $099222 : db $8D +org $099303 : db $88 +org $099308 : db $88 +org $09933A : db $88 +org $099366 : db $8D +org $09976A : db $8D +org $0997F1 : db $8D +org $09985C : db $87 +org $099862 : db $8D +org $09989A : db $89 +org $0998D9 : db $88 +org $0998F3 : db $8D +org $099A83 : db $8D +org $099A9A : db $82 +org $099AC6 : db $8D +org $099B90 : db $89 +org $099BC1 : db $80 +org $099BCF : db $9B +org $099C64 : db $88 +org $099CD2 : db $9C +org $099CF7 : db $88 +org $099D82 : db $88 +org $099DFE : db $88 +org $099E6A : db $88 +org $099F79 : db $88 +org $099FE9 : db $87 +org $09A00E : db $9C +org $09A1C8 : db $9E +org $09A1EF : db $89 +org $09A212 : db $9D +org $09A2B3 : db $89 +org $09A2EB : db $89 +org $09A42E : db $89 +org $09A680 : db $9E +org $09A686 : db $9C +org $09A6A0 : db $9E +org $09A6B5 : db $9E +org $09AD29 : db $88 +org $09AD4B : db $8D +org $09AE07 : db $8D +org $09AE0B : db $88 +org $09AE16 : db $88 +org $09AE45 : db $9D +org $09AE63 : db $8D +org $09AE83 : db $9D +org $09AE89 : db $89 +org $09AE99 : db $8D +org $09AEAB : db $89 +org $09AEAF : db $89 +org $09AEB3 : db $89 +org $09AEB9 : db $9D +org $09AEC1 : db $8D +org $09AEC5 : db $89 +org $09AF1D : db $89 +org $09AF24 : db $89 +org $09AFA5 : db $9D +org $09B071 : db $9D +org $09B0F3 : db $8D +org $09B101 : db $8D +org $09B10F : db $8D +org $09B204 : db $8D +org $09B381 : db $81 +org $09B65A : db $81 +org $09B73F : db $9D +org $09B745 : db $8D +org $09B7DF : db $9D +org $09B838 : db $9D +org $09B8F8 : db $86 +org $09B90F : db $9D +org $09B916 : db $8D +org $09B963 : db $8D +org $09B9A7 : db $9D +org $09BA5B : db $9D +org $09BAC7 : db $8D +org $09BAF2 : db $9D +org $09BC4B : db $8D +org $09BC98 : db $9D +org $09BCBB : db $8D +org $09BCF3 : db $9D +org $09BD36 : db $8D +org $09BD60 : db $8D +org $09BD71 : db $8D +org $09BDC7 : db $9D +org $09BE04 : db $8D +org $09BE47 : db $9D +org $09BE90 : db $9D +org $09BED2 : db $86 +org $09BF2F : db $8D +org $09BF9D : db $8D +org $09BFB4 : db $9D +org $09C013 : db $8D +org $09C039 : db $9D +org $09C123 : db $89 +org $09C360 : db $8D +org $09C451 : db $89 +org $09C49C : db $89 +org $09C4A0 : db $89 +org $09EDC8 : db $89 +org $09EDED : db $85 +org $09EE2D : db $89 +org $09EE3F : db $80 +org $09EE56 : db $9D +org $09EE5A : db $89 +org $09EEBC : db $86 +org $09EEDE : db $8D +org $09EEE9 : db $9D +org $09EF04 : db $8D +org $09EF26 : db $8D +org $09F2A0 : db $8D +org $09F330 : db $8A +org $09F342 : db $8E +org $09F346 : db $80 +org $09F353 : db $80 +org $09F36A : db $80 +org $09F3A4 : db $80 +org $09F3DC : db $9C +org $09F3E5 : db $80 +org $09F433 : db $8E +org $09F453 : db $80 +org $09F468 : db $80 +org $09F479 : db $9B +org $09F481 : db $9C +org $09F486 : db $88 +org $09F48B : db $88 +org $09F49A : db $8E +org $09F4CC : db $88 +org $09F51B : db $82 +org $09F51F : db $82 +org $09F537 : db $82 +org $09F543 : db $8B +org $09F569 : db $89 +org $09F58B : db $89 +org $09F5DE : db $80 +org $09F5F4 : db $80 +org $09F5FF : db $8C +org $09F60A : db $80 +org $09F614 : db $8C +org $09F66B : db $80 +org $09F6A4 : db $89 +org $09F6B4 : db $88 +org $09F714 : db $88 +org $09F718 : db $8D +org $09F727 : db $80 +org $09F72F : db $81 +org $09F735 : db $80 +org $09F742 : db $80 +org $09F762 : db $8B +org $09F7A6 : db $86 +org $09F7AA : db $8D +org $09F81C : db $89 +org $09F828 : db $89 +org $09FA90 : db $89 +org $09FAC6 : db $89 +org $09FAD5 : db $89 +org $09FAE6 : db $89 +org $09FB22 : db $89 +org $09FCB9 : db $89 +org $09FCBF : db $89 +org $09FDEF : db $89 +org $09FE2C : db $89 +org $09FE74 : db $89 +org $09FEE9 : db $80 +org $09FEEF : db $80 +org $09FEF8 : db $80 +org $09FF0F : db $80 +org $09FF16 : db $80 +org $09FF57 : db $80 +org $09FF5D : db $80 +org $09FF66 : db $80 +org $09FF7D : db $80 +org $09FF84 : db $80 +org $0AB756 : db $80 +org $0AB771 : db $8A +org $0AB83B : db $8A +org $0AB846 : db $8A +org $0AB851 : db $8A +org $0AB85C : db $8A +org $0AB86E : db $8A +org $0AB887 : db $8A +org $0AB892 : db $8A +org $0AB89D : db $8A +org $0AB8A8 : db $8A +org $0AB8BA : db $8A +org $0AB910 : db $82 +org $0AB914 : db $82 +org $0AB92C : db $80 +org $0AB930 : db $8B +org $0AB93A : db $80 +org $0AB943 : db $82 +org $0AB97A : db $82 +org $0AB9A9 : db $89 +org $0AB9AD : db $86 +org $0AB9B5 : db $80 +org $0AB9D4 : db $80 +org $0ABA5B : db $80 +org $0ABA61 : db $8A +org $0ABA89 : db $82 +org $0ABAA7 : db $8A +org $0ABAC1 : db $80 +org $0ABB13 : db $8A +org $0ABB4F : db $8A +org $0ABBC3 : db $8A +org $0ABBCA : db $8A +org $0ABBE5 : db $8A +org $0ABBEC : db $8A +org $0ABBFC : db $80 +org $0ABC59 : db $8A +org $0ABC7C : db $80 +org $0ABD25 : db $8A +org $0ABD66 : db $8A +org $0ABD6E : db $8A +org $0ABD7D : db $8A +org $0ABDA1 : db $8A +org $0ABDA9 : db $8A +org $0AC006 : db $8A +org $0AC040 : db $8A +org $0AC04A : db $8A +org $0AC052 : db $8A +org $0AC05A : db $8A +org $0AC062 : db $8A +org $0AC082 : db $8A +org $0AC08A : db $8A +org $0AC09C : db $8A +org $0AC0C1 : db $8A +org $0AC0CB : db $8A +org $0AC0D3 : db $8A +org $0AC0DB : db $8A +org $0AC0E3 : db $8A +org $0AC101 : db $8A +org $0AC109 : db $8A +org $0AC11B : db $8A +org $0AC140 : db $8A +org $0AC14A : db $8A +org $0AC152 : db $8A +org $0AC15A : db $8A +org $0AC162 : db $8A +org $0AC182 : db $8A +org $0AC18A : db $8A +org $0AC19C : db $8A +org $0AC1BC : db $8A +org $0AC1C6 : db $8A +org $0AC1CE : db $8A +org $0AC1D6 : db $8A +org $0AC1DE : db $8A +org $0AC1FE : db $8A +org $0AC206 : db $8A +org $0AC218 : db $8A +org $0AC238 : db $8A +org $0AC242 : db $8A +org $0AC24A : db $8A +org $0AC252 : db $8A +org $0AC25A : db $8A +org $0AC27A : db $8A +org $0AC282 : db $8A +org $0AC294 : db $8A +org $0AC2B4 : db $8A +org $0AC2BE : db $8A +org $0AC2C6 : db $8A +org $0AC2CE : db $8A +org $0AC2D6 : db $8A +org $0AC2F6 : db $8A +org $0AC2FE : db $8A +org $0AC310 : db $8A +org $0AC330 : db $8A +org $0AC33A : db $8A +org $0AC342 : db $8A +org $0AC34A : db $8A +org $0AC352 : db $8A +org $0AC372 : db $8A +org $0AC37A : db $8A +org $0AC38C : db $8A +org $0AC3D1 : db $8A +org $0AC46A : db $8A +org $0AC541 : db $8A +org $0AE0C6 : db $80 +org $0AE0C9 : db $98 +org $0AE0CC : db $8A +org $0AE0CF : db $98 +org $0AE0D2 : db $8A +org $0AE0D5 : db $8A +org $0AE0D8 : db $98 +org $0AE0DB : db $8A +org $0AE0DE : db $8A +org $0AE0E1 : db $98 +org $0AE13B : db $80 +org $0AE13F : db $80 +org $0AE148 : db $9B +org $0AE14C : db $9B +org $0AE155 : db $9B +org $0AE159 : db $82 +org $0AE967 : db $8A +org $0AE977 : db $8A +org $0AE98C : db $8A +org $0AEF34 : db $80 +org $0AEF5B : db $80 +org $0AEF65 : db $8D +org $0AEF6F : db $80 +org $0AEF73 : db $80 +org $0AEF77 : db $80 +org $0AEF7B : db $80 +org $0AEFCD : db $82 +org $0AEFDC : db $80 +org $0BFFAB : db $82 +org $0BFFAF : db $82 +org $0BFFB3 : db $89 +org $0BFFF1 : db $89 +org $0BFFF5 : db $87 +org $0CC118 : db $80 +org $0CC11B : db $8C +org $0CC11E : db $8C +org $0CC121 : db $8C +org $0CC124 : db $8C +org $0CC127 : db $8C +org $0CC12A : db $8C +org $0CC12D : db $8C +org $0CC130 : db $8C +org $0CC133 : db $8C +org $0CC136 : db $8C +org $0CC13F : db $80 +org $0CC143 : db $82 +org $0CC18A : db $80 +org $0CC18D : db $8C +org $0CC190 : db $8C +org $0CC193 : db $8C +org $0CC196 : db $8C +org $0CC199 : db $8C +org $0CC19C : db $8C +org $0CC19F : db $8C +org $0CC1A2 : db $8C +org $0CC1A5 : db $82 +org $0CC1A8 : db $8E +org $0CC1AB : db $80 +org $0CC1AE : db $80 +org $0CC20B : db $80 +org $0CC20F : db $80 +org $0CC22C : db $80 +org $0CC230 : db $80 +org $0CC236 : db $80 +org $0CC26E : db $8C +org $0CC277 : db $80 +org $0CC293 : db $8C +org $0CC2CB : db $8C +org $0CC30A : db $80 +org $0CC338 : db $89 +org $0CC390 : db $8C +org $0CC398 : db $8C +org $0CC3A0 : db $8C +org $0CC3A8 : db $8C +org $0CC3B0 : db $8C +org $0CC3B8 : db $8C +org $0CC3C0 : db $8C +org $0CC3C8 : db $8C +org $0CC41C : db $80 +org $0CC50A : db $80 +org $0CC518 : db $80 +org $0CC52F : db $80 +org $0CC58B : db $80 +org $0CC94B : db $80 +org $0CC978 : db $80 +org $0CC9CD : db $80 +org $0CCA7E : db $8C +org $0CCA86 : db $8C +org $0CCB11 : db $80 +org $0CCC79 : db $80 +org $0CCC7C : db $8C +org $0CCC7F : db $8C +org $0CCC82 : db $8C +org $0CCC85 : db $8C +org $0CCC88 : db $8C +org $0CCC8C : db $80 +org $0CCCA5 : db $9B +org $0CCCA9 : db $9B +org $0CCCB2 : db $9B +org $0CCCC3 : db $80 +org $0CCCC7 : db $80 +org $0CCCCB : db $80 +org $0CCCD5 : db $80 +org $0CCD5A : db $82 +org $0CCDA0 : db $80 +org $0CCDA4 : db $80 +org $0CCDA8 : db $9B +org $0CCDCC : db $8C +org $0CCDF8 : db $80 +org $0CCE7D : db $80 +org $0CCF52 : db $80 +org $0CCF55 : db $8C +org $0CCF58 : db $8C +org $0CCF5B : db $8C +org $0CCF5E : db $8C +org $0CCF61 : db $8C +org $0CD050 : db $80 +org $0CD1C2 : db $80 +org $0CD2B3 : db $80 +org $0CD2BA : db $80 +org $0CD364 : db $80 +org $0CD367 : db $8C +org $0CD36A : db $8C +org $0CD36D : db $8C +org $0CD370 : db $8C +org $0CD3B0 : db $80 +org $0CD4CD : db $80 +org $0CD5A6 : db $80 +org $0CD75A : db $80 +org $0CD75D : db $8C +org $0CD760 : db $8C +org $0CD763 : db $8C +org $0CD767 : db $8C +org $0CD792 : db $80 +org $0CD9E5 : db $8C +org $0CDA0E : db $8C +org $0CDA2C : db $8C +org $0CDA7C : db $8C +org $0CDAC2 : db $8C +org $0CDAD0 : db $8C +org $0CDB42 : db $84 +org $0CDB54 : db $80 +org $0CDB81 : db $80 +org $0CDC0E : db $8C +org $0CDC12 : db $8C +org $0CDC18 : db $8C +org $0CDC4B : db $8C +org $0CDC4F : db $8C +org $0CDC55 : db $8C +org $0CDC61 : db $8C +org $0CDC6A : db $8C +org $0CED64 : db $80 +org $0CED7D : db $80 +org $0CED81 : db $80 +org $0CED8D : db $9B +org $0CED96 : db $9B +org $0CED9A : db $9B +org $0CEE3B : db $80 +org $0CEE3F : db $80 +org $0CEE7E : db $8A +org $0CEEC1 : db $80 +org $0CEED1 : db $82 +org $0CEEF7 : db $82 +org $0CEF53 : db $82 +org $0CEF79 : db $82 +org $0CEFC1 : db $82 +org $0CEFE6 : db $82 +org $0CEFEE : db $82 +org $0CF03A : db $8A +org $0CF041 : db $8C +org $0CF045 : db $82 +org $0CF049 : db $8E +org $0CF0A5 : db $8E +org $0CF0F2 : db $80 +org $0CF0FD : db $80 +org $0CF166 : db $8C +org $0CF16C : db $8C +org $0CF172 : db $8C +org $0CF178 : db $8C +org $0CF17E : db $8C +org $0CF18A : db $8C +org $0CF19E : db $8C +org $0CF1A8 : db $8C +org $0CF1FE : db $8C +org $0CF216 : db $8C +org $0CF21C : db $8C +org $0CF222 : db $8C +org $0CF235 : db $8C +org $0CF240 : db $8D +org $0CF244 : db $9D +org $0CF337 : db $8C +org $0CF33D : db $8C +org $0CF37E : db $9D +org $0CF3AE : db $8C +org $0CF3B4 : db $8C +org $0CF3BA : db $8C +org $0CF3C0 : db $8C +org $0CF3C7 : db $8D +org $0CF3CB : db $9D +org $0CF410 : db $8C +org $0CF440 : db $8C +org $0CF45D : db $8C +org $0CF486 : db $8C +org $0CF4FB : db $8C +org $0CF501 : db $8C +org $0CF517 : db $8C +org $0CF602 : db $8C +org $0CF608 : db $8C +org $0CF60E : db $8C +org $0CF614 : db $8C +org $0CF61F : db $8C +org $0CF629 : db $8C +org $0CF652 : db $80 +org $0CF662 : db $8A +org $0CF678 : db $8E +org $0CF694 : db $8C +org $0CF69A : db $8C +org $0CF69E : db $8C +org $0CF6C6 : db $8E +org $0CF6DC : db $8A +org $0CF6EC : db $8A +org $0CF954 : db $8C +org $0CF95B : db $8C +org $0CF962 : db $8C +org $0CF969 : db $8C +org $0CF9ED : db $8C +org $0CF9F3 : db $8C +org $0CFF21 : db $8C +org $0CFF2A : db $8C +org $0CFF33 : db $8C +org $0CFF40 : db $8C +org $0CFF49 : db $8C +org $0CFF52 : db $9B +org $0CFF56 : db $9B +org $0CFF5A : db $9B +org $0CFF5E : db $9B +org $0CFF62 : db $9B +org $0DA32A : db $87 +org $0DB81B : db $8D +org $0DBB9D : db $8D +org $0DBBC5 : db $8D +org $0DBBDD : db $8D +org $0DBD3D : db $85 +org $0DBD43 : db $86 +org $0DBE25 : db $85 +org $0DBE83 : db $85 +org $0DBFC6 : db $85 +org $0DC0C5 : db $85 +org $0DC0F0 : db $86 +org $0DC21A : db $86 +org $0DC240 : db $85 +org $0DC267 : db $86 +org $0DC2BD : db $85 +org $0DC2CC : db $8D +org $0DC2DF : db $80 +org $0DC2EF : db $9E +org $0DC2F3 : db $85 +org $0DC2FE : db $85 +org $0DC316 : db $86 +org $0DC329 : db $86 +org $0DC32D : db $9D +org $0DC334 : db $9E +org $0DC33C : db $85 +org $0DC34C : db $9E +org $0DC372 : db $85 +org $0DC37D : db $85 +org $0DC38F : db $86 +org $0DC399 : db $85 +org $0DC3AA : db $85 +org $0DC3FB : db $85 +org $0DC3FF : db $86 +org $0DC49F : db $85 +org $0DC4A3 : db $86 +org $0DC4BA : db $85 +org $0DC4BE : db $9E +org $0DC505 : db $85 +org $0DC509 : db $86 +org $0DC52C : db $9C +org $0DC532 : db $87 +org $0DC537 : db $87 +org $0DC571 : db $85 +org $0DC6DC : db $85 +org $0DC6F3 : db $85 +org $0DC6F7 : db $9E +org $0DC754 : db $85 +org $0DC758 : db $86 +org $0DC768 : db $80 +org $0DC773 : db $86 +org $0DC77A : db $9C +org $0DC780 : db $87 +org $0DC795 : db $80 +org $0DC7A0 : db $80 +org $0DC7BF : db $8D +org $0DC7E5 : db $85 +org $0DC7EE : db $85 +org $0DC949 : db $85 +org $0DC994 : db $80 +org $0DC9AB : db $8D +org $0DC9D1 : db $85 +org $0DC9DA : db $85 +org $0DCA6C : db $85 +org $0DCB18 : db $85 +org $0DCB1F : db $9D +org $0DCB4F : db $9A +org $0DCB56 : db $85 +org $0DCB5A : db $86 +org $0DCB67 : db $80 +org $0DCB7C : db $85 +org $0DCBA8 : db $85 +org $0DCBD5 : db $8D +org $0DCBE5 : db $8D +org $0DCBEC : db $85 +org $0DCBF3 : db $9E +org $0DCC09 : db $80 +org $0DCC1B : db $85 +org $0DCC8A : db $85 +org $0DCCB3 : db $85 +org $0DCCCD : db $85 +org $0DCCDC : db $85 +org $0DCCEB : db $85 +org $0DCCFC : db $85 +org $0DCD0D : db $85 +org $0DCDB8 : db $85 +org $0DCDBC : db $86 +org $0DCE7E : db $85 +org $0DCF42 : db $85 +org $0DCF46 : db $86 +org $0DCFD1 : db $8D +org $0DCFED : db $85 +org $0DD04D : db $85 +org $0DD12F : db $85 +org $0DD1F0 : db $85 +org $0DD389 : db $8D +org $0DD3CB : db $85 +org $0DD3D8 : db $86 +org $0DD48C : db $85 +org $0DD577 : db $85 +org $0DD57B : db $86 +org $0DD61E : db $85 +org $0DD67A : db $86 +org $0DD711 : db $85 +org $0DD71F : db $86 +org $0DD7FD : db $86 +org $0DD85F : db $8D +org $0DD89D : db $86 +org $0DD985 : db $86 +org $0DD9F3 : db $85 +org $0DD9FE : db $8D +org $0DDA06 : db $9D +org $0DDA51 : db $86 +org $0DDABA : db $86 +org $0DDABE : db $86 +org $0DDB04 : db $86 +org $0DDC74 : db $8D +org $0DDD3F : db $80 +org $0DDFB5 : db $8D +org $0DDFDC : db $8D +org $0DEEBF : db $80 +org $0DF18A : db $8D +org $0DF194 : db $8D +org $0DF19B : db $8D +org $0DFBBF : db $8D +org $0DFBEB : db $8D +org $0EC2BC : db $82 +org $0EC2C4 : db $82 +org $0EC2F1 : db $8D +org $0EC3CD : db $82 +org $0EC9EA : db $9D +org $0ECDC0 : db $9D +org $0ECDD0 : db $8D +org $0ECDD9 : db $86 +org $0ECDF4 : db $86 +org $0ECDFD : db $86 +org $0ECE06 : db $8D +org $0ECE0D : db $86 +org $0ECE16 : db $8D +org $0ECE1D : db $86 +org $0ECFB2 : db $9D +org $0ED037 : db $8D +org $0ED03B : db $86 +org $0ED0CA : db $8D +org $0ED0CE : db $86 +org $0ED0DC : db $86 +org $0ED0E6 : db $8D +org $0ED0ED : db $86 +org $0ED0F1 : db $86 +org $0ED13B : db $8D +org $0ED13F : db $86 +org $0ED16B : db $85 +org $0ED193 : db $8D +org $0ED1C0 : db $86 +org $0ED1C4 : db $86 +org $0ED415 : db $8D +org $0ED41E : db $86 +org $0ED430 : db $86 +org $0ED44B : db $9D +org $0ED457 : db $8D +org $0ED460 : db $86 +org $0ED480 : db $86 +org $0ED4F5 : db $9D +org $0ED6AA : db $9D +org $0ED85B : db $9D +org $0ED88B : db $9D +org $0ED8CC : db $9D +org $0EE648 : db $80 +org $0EE64C : db $80 +org $0EE650 : db $8E +org $0EE654 : db $80 +org $0EE658 : db $82 +org $0EE65C : db $8C +org $0EE66A : db $9B +org $0EE6A6 : db $89 +org $0EE6B4 : db $80 +org $0EE715 : db $8E +org $0EE72A : db $8E +org $0EE770 : db $8C +org $0EED6E : db $8C +org $0EEDA0 : db $80 +org $0EEDB2 : db $80 +org $0EEDBD : db $80 +org $0EEDE0 : db $8E +org $0EEE1E : db $80 +org $0EEE5C : db $80 +org $0EEE60 : db $80 +org $0EEE94 : db $9C +org $0EEF84 : db $80 +org $0EEFF3 : db $80 +org $0EF0FE : db $80 +org $0EF14E : db $80 +org $0EF21F : db $80 +org $0EF297 : db $80 +org $0EF52F : db $8E +org $0EF536 : db $8E +org $0EF53D : db $8E +org $0EF6F1 : db $80 +org $0EF802 : db $8D +org $0EF808 : db $8D +org $0EFA7D : db $80 +org $0EFCC3 : db $8E +org $0EFCCA : db $8E +org $0EFCD1 : db $8E +org $0FFD31 : db $8F +org $0FFD39 : db $8F +org $0FFD41 : db $8F +org $0FFD49 : db $8F +org $0FFD51 : db $8F +org $0FFD59 : db $8F +org $18BC1D : db $80 +org $18BCFE : db $80 +org $18BD3C : db $80 +org $1AF5B3 : db $80 +org $1AF5BE : db $86 +org $1AF5CB : db $89 +org $1AF5D2 : db $89 +org $1AF5E2 : db $9D +org $1AF624 : db $8D +org $1AF634 : db $80 +org $1AF691 : db $8D +org $1AF6E6 : db $9B +org $1AF6FA : db $9D +org $1AF7FF : db $89 +org $1AF85A : db $85 +org $1AF94D : db $85 +org $1AF951 : db $86 +org $1AF99B : db $9D +org $1AF9A1 : db $89 +org $1AF9CB : db $9A +org $1AF9D2 : db $9A +org $1AF9D9 : db $8D +org $1AFA02 : db $9A +org $1AFA0A : db $86 +org $1AFA5B : db $85 +org $1AFA7A : db $8D +org $1AFB2A : db $85 +org $1AFBE1 : db $8D +org $1AFC42 : db $86 +org $1AFC48 : db $9C +org $1AFC4C : db $87 +org $1AFC99 : db $9D +org $1AFCB8 : db $8D +org $1AFCBC : db $86 +org $1AFCEB : db $86 +org $1AFDD9 : db $85 +org $1AFE90 : db $8D +org $1AFE9B : db $9D +org $1AFEA1 : db $89 +org $1AFEDB : db $9A +org $1AFEF3 : db $85 +org $1AFF52 : db $9A +org $1AFF5B : db $9A +org $1AFFA8 : db $85 +org $1AFFB8 : db $9E +org $1AFFC3 : db $9A +org $1AFFD3 : db $9A +org $1AFFDD : db $9A +org $1AFFED : db $9A +org $1BBC2F : db $8F +org $1BBC4E : db $8F +org $1BBC6A : db $9B +org $1BBC78 : db $9B +org $1BBCC4 : db $8F +org $1BBCCD : db $8F +org $1BBCDB : db $9B +org $1BBCE3 : db $9B +org $1BBD03 : db $9C +org $1BBD13 : db $9B +org $1BBD1C : db $9B +org $1BBD62 : db $9B +org $1BBD81 : db $81 +org $1BBDE2 : db $84 +org $1BBECA : db $84 +org $1BBECE : db $9B +org $1BBEF8 : db $8F +org $1BBF00 : db $8F +org $1BBF17 : db $89 +org $1BBF25 : db $8F +org $1BBF2D : db $8F +org $1BBF70 : db $87 +org $1BBF88 : db $87 +org $1BC019 : db $84 +org $1BC01D : db $9B +org $1BC043 : db $8F +org $1BC051 : db $8F +org $1BC0AB : db $9B +org $1BC0E5 : db $9B +org $1BC0EE : db $9B +org $1BC0F4 : db $82 +org $1BC1AB : db $84 +org $1BC1B2 : db $9B +org $1BC1EB : db $84 +org $1BC1F2 : db $9B +org $1BC1FD : db $84 +org $1BC204 : db $9B +org $1BC22E : db $82 +org $1BC241 : db $9B +org $1BC252 : db $9B +org $1BC26F : db $9B +org $1BC2B2 : db $9B +org $1BC8BB : db $9B +org $1BC8BF : db $9B +org $1BC930 : db $9B +org $1BC95A : db $9B +org $1BC966 : db $9B +org $1BC974 : db $9B +org $1BC9B5 : db $8F +org $1BC9BC : db $8F +org $1BC9C3 : db $8F +org $1BC9CA : db $8F +org $1BCA42 : db $8F +org $1BCA49 : db $8F +org $1BCA50 : db $8F +org $1BCA57 : db $8F +org $1BCAAE : db $84 +org $1BCAB2 : db $9B +org $1BCB05 : db $9B +org $1BCB41 : db $9B +org $1BCB5D : db $9B +org $1BCB82 : db $9B +org $1BCBC4 : db $9B +org $1BCC05 : db $9B +org $1BCC3E : db $9B +org $1BCC64 : db $9B +org $1BCCA3 : db $9B +org $1BCCE6 : db $81 +org $1BCCED : db $81 +org $1BCD6E : db $9B +org $1BCDBF : db $9B +org $1BCDED : db $9B +org $1BCE34 : db $81 +org $1BCE3B : db $81 +org $1BCE59 : db $81 +org $1BCF06 : db $80 +org $1BCF6B : db $9B +org $1BCFEF : db $84 +org $1BCFF4 : db $84 +org $1BD033 : db $9B +org $1BD078 : db $9B +org $1BD0A9 : db $9B +org $1BD0F4 : db $9B +org $1BD11D : db $9B +org $1BD13D : db $9B +org $1BD163 : db $9B +org $1BD183 : db $9B +org $1BD1BA : db $9B +org $1BEC7F : db $9B +org $1BECAE : db $9B +org $1BECD2 : db $9B +org $1BECF1 : db $9B +org $1BED10 : db $9B +org $1BED36 : db $9B +org $1BED57 : db $9B +org $1BED7A : db $9B +org $1BEDA2 : db $9B +org $1BEDC5 : db $9B +org $1BEE06 : db $9B +org $1BEE2C : db $9B +org $1BEE5A : db $9B +org $1BEE7C : db $9B +org $1BEEB0 : db $9B +org $1BEED1 : db $9B +org $1BEEF5 : db $9B +org $1BEF19 : db $9B +org $1BEF37 : db $9B +org $1BEF52 : db $9B +org $1BEF7E : db $9B +org $1BEF98 : db $9B +org $1BF0C7 : db $9B +org $1BF0F3 : db $9B +org $1CF38F : db $9C +org $1CF3AF : db $9C +org $1CF533 : db $87 +org $1CF643 : db $89 +org $1CF6C1 : db $89 +org $1CF6F6 : db $8D +org $1CF77B : db $8D +org $1CF787 : db $88 +org $1CF78D : db $88 +org $1CF804 : db $88 +org $1CF808 : db $88 +org $1CF80D : db $88 +org $1CF86F : db $88 +org $1CF873 : db $88 +org $1CF878 : db $88 +org $1CF90F : db $88 +org $1CF994 : db $8D +org $1CFA53 : db $87 +org $1CFA82 : db $8D +org $1CFD4C : db $87 +org $1CFD8A : db $89 +org $1D804C : db $9D +org $1D8087 : db $86 +org $1D8097 : db $86 +org $1D80A2 : db $83 +org $1D80B2 : db $86 +org $1D80EA : db $8D +org $1D8111 : db $8D +org $1D8127 : db $85 +org $1D813A : db $8D +org $1D814A : db $80 +org $1D8157 : db $86 +org $1D815D : db $9C +org $1D8161 : db $87 +org $1D8171 : db $8D +org $1D81BE : db $86 +org $1D822A : db $85 +org $1D8233 : db $86 +org $1D8261 : db $80 +org $1D827C : db $86 +org $1D828E : db $9E +org $1D82D0 : db $9D +org $1D82D6 : db $89 +org $1D82FA : db $86 +org $1D8339 : db $86 +org $1D8362 : db $8D +org $1D836D : db $8D +org $1D8481 : db $86 +org $1D84A8 : db $85 +org $1D84EB : db $85 +org $1D84EF : db $86 +org $1D854C : db $85 +org $1D85AE : db $9D +org $1D85B4 : db $89 +org $1D85E8 : db $86 +org $1D8603 : db $9D +org $1D8637 : db $86 +org $1D8653 : db $86 +org $1D8662 : db $85 +org $1D8668 : db $8D +org $1D8683 : db $80 +org $1D8716 : db $86 +org $1D8748 : db $8D +org $1D875B : db $9E +org $1D889F : db $86 +org $1D88A6 : db $9D +org $1D88AA : db $89 +org $1D896A : db $8D +org $1D8989 : db $86 +org $1D8AB4 : db $8D +org $1D8AE3 : db $86 +org $1D8B45 : db $86 +org $1D8B60 : db $86 +org $1D8B70 : db $86 +org $1D8BE0 : db $86 +org $1D8BE7 : db $80 +org $1D8C84 : db $86 +org $1D8C8A : db $8D +org $1D8DDF : db $83 +org $1D8DF2 : db $83 +org $1D8E83 : db $9D +org $1D8E89 : db $89 +org $1D8F1A : db $81 +org $1D8F22 : db $81 +org $1D8F61 : db $80 +org $1D9085 : db $85 +org $1D90B9 : db $8D +org $1D916C : db $9D +org $1D9174 : db $8D +org $1D9178 : db $89 +org $1D91B2 : db $86 +org $1D91E6 : db $8D +org $1D92EF : db $85 +org $1D9371 : db $9D +org $1D93A1 : db $86 +org $1D93A5 : db $9D +org $1D948B : db $8D +org $1D94B8 : db $8D +org $1D9564 : db $86 +org $1D958C : db $9D +org $1D9592 : db $89 +org $1D9BA4 : db $86 +org $1D9C1A : db $86 +org $1D9C78 : db $86 +org $1D9CC0 : db $86 +org $1D9CE2 : db $80 +org $1D9D21 : db $8D +org $1D9E30 : db $86 +org $1D9E6A : db $8D +org $1D9EAF : db $9D +org $1D9EB5 : db $89 +org $1D9F22 : db $8D +org $1D9F75 : db $9D +org $1D9F8B : db $86 +org $1DA030 : db $86 +org $1DA062 : db $8D +org $1DA123 : db $86 +org $1DA186 : db $86 +org $1DA1F2 : db $9D +org $1DA1F8 : db $89 +org $1DA27C : db $86 +org $1DA290 : db $86 +org $1DA334 : db $89 +org $1DA348 : db $8D +org $1DA3C3 : db $80 +org $1DA3F2 : db $8D +org $1DA4A7 : db $8D +org $1DA4AF : db $8D +org $1DA4EF : db $85 +org $1DA503 : db $9D +org $1DA600 : db $85 +org $1DA76A : db $9D +org $1DA770 : db $8D +org $1DA779 : db $89 +org $1DAD1F : db $80 +org $1DADC2 : db $9D +org $1DAE06 : db $9D +org $1DAE13 : db $8D +org $1DAE60 : db $80 +org $1DAE84 : db $86 +org $1DAEB5 : db $86 +org $1DAF00 : db $86 +org $1DB05F : db $86 +org $1DB0AC : db $86 +org $1DB0F4 : db $9D +org $1DB166 : db $8D +org $1DB16F : db $8D +org $1DB189 : db $8D +org $1DB1AA : db $9D +org $1DB240 : db $80 +org $1DB261 : db $8D +org $1DB290 : db $8D +org $1DB2DA : db $86 +org $1DB367 : db $8D +org $1DB37C : db $86 +org $1DB434 : db $86 +org $1DB771 : db $86 +org $1DB920 : db $80 +org $1DB967 : db $80 +org $1DB96E : db $80 +org $1DB97C : db $80 +org $1DB983 : db $80 +org $1DB9B3 : db $8D +org $1DB9CF : db $8D +org $1DBA60 : db $8D +org $1DBAB4 : db $8D +org $1DBAC6 : db $8D +org $1DBAD3 : db $9E +org $1DBAFD : db $9D +org $1DBB03 : db $89 +org $1DBB14 : db $8D +org $1DBB1A : db $9D +org $1DBB20 : db $89 +org $1DBB26 : db $8D +org $1DBB6B : db $9D +org $1DBB8B : db $86 +org $1DBBC9 : db $83 +org $1DBBDC : db $83 +org $1DBC8A : db $86 +org $1DBD2B : db $86 +org $1DBD74 : db $8D +org $1DBDC9 : db $86 +org $1DBDE5 : db $8D +org $1DBE4A : db $9D +org $1DBEA1 : db $9D +org $1DBEBE : db $86 +org $1DBF03 : db $80 +org $1DBF46 : db $8D +org $1DBF5D : db $8D +org $1DBF67 : db $86 +org $1DBF6D : db $8D +org $1DBF72 : db $8D +org $1DBF7D : db $8D +org $1DBFD1 : db $86 +org $1DC1A9 : db $86 +org $1DC214 : db $86 +org $1DC218 : db $86 +org $1DC288 : db $80 +org $1DC2C7 : db $80 +org $1DC30E : db $86 +org $1DC343 : db $8D +org $1DC362 : db $8D +org $1DC36D : db $8D +org $1DC393 : db $8D +org $1DC410 : db $86 +org $1DC41F : db $86 +org $1DC435 : db $8D +org $1DC43C : db $80 +org $1DC44D : db $86 +org $1DC454 : db $86 +org $1DC4F4 : db $80 +org $1DC519 : db $87 +org $1DC52A : db $85 +org $1DC535 : db $9D +org $1DC539 : db $89 +org $1DC5EC : db $86 +org $1DC623 : db $8D +org $1DC638 : db $8D +org $1DC64D : db $9E +org $1DC657 : db $86 +org $1DC67E : db $8D +org $1DC698 : db $8D +org $1DC6E8 : db $9D +org $1DC6EE : db $89 +org $1DC714 : db $80 +org $1DC7E9 : db $86 +org $1DC7EE : db $86 +org $1DC80B : db $8D +org $1DC824 : db $8D +org $1DC842 : db $8D +org $1DC86C : db $86 +org $1DC87C : db $8D +org $1DC8DB : db $9D +org $1DC8E5 : db $86 +org $1DC905 : db $80 +org $1DC98A : db $86 +org $1DC9CA : db $86 +org $1DCA1E : db $86 +org $1DCA6C : db $86 +org $1DCAE4 : db $86 +org $1DCAE8 : db $8D +org $1DCAF5 : db $86 +org $1DCAFD : db $86 +org $1DCB1E : db $8D +org $1DCB38 : db $8D +org $1DCB65 : db $9D +org $1DCCD8 : db $86 +org $1DCCE9 : db $86 +org $1DCD54 : db $86 +org $1DCD5B : db $80 +org $1DCD87 : db $9D +org $1DCD8D : db $89 +org $1DCDC8 : db $8D +org $1DCE3F : db $8D +org $1DCE4F : db $86 +org $1DCF8F : db $86 +org $1DCFD9 : db $86 +org $1DD017 : db $86 +org $1DD06D : db $8D +org $1DD086 : db $8D +org $1DD1A6 : db $9D +org $1DD1FA : db $86 +org $1DD214 : db $9D +org $1DD220 : db $89 +org $1DD23A : db $80 +org $1DD276 : db $80 +org $1DD29C : db $85 +org $1DD361 : db $85 +org $1DD390 : db $9D +org $1DD39F : db $9D +org $1DD3A5 : db $89 +org $1DD3C7 : db $89 +org $1DD48B : db $86 +org $1DD51B : db $8D +org $1DD5BC : db $8D +org $1DD5EE : db $8D +org $1DD6B6 : db $8D +org $1DD761 : db $86 +org $1DD77C : db $8D +org $1DD798 : db $86 +org $1DD79E : db $87 +org $1DD7A4 : db $86 +org $1DD7BB : db $8D +org $1DD7F0 : db $8D +org $1DD7F7 : db $80 +org $1DD81A : db $8D +org $1DD824 : db $8D +org $1DD835 : db $8D +org $1DD85E : db $86 +org $1DD862 : db $9D +org $1DD8F0 : db $86 +org $1DD911 : db $9D +org $1DDAB4 : db $86 +org $1DDAF8 : db $86 +org $1DDC2F : db $8D +org $1DDC35 : db $9D +org $1DDC97 : db $80 +org $1DDCAE : db $8D +org $1DDCDE : db $86 +org $1DDD79 : db $86 +org $1DDD90 : db $86 +org $1DDDA3 : db $80 +org $1DDDE1 : db $8D +org $1DDDFB : db $86 +org $1DDE26 : db $86 +org $1DDE71 : db $86 +org $1DDEDA : db $9D +org $1DDEED : db $8D +org $1DDF3B : db $8D +org $1DDF5C : db $85 +org $1DDF64 : db $86 +org $1DDF74 : db $87 +org $1DDF80 : db $8D +org $1DDF84 : db $86 +org $1DDFDD : db $80 +org $1DE115 : db $85 +org $1DE125 : db $8D +org $1DE132 : db $8D +org $1DE149 : db $9D +org $1DE14F : db $89 +org $1DE153 : db $86 +org $1DE171 : db $9D +org $1DE177 : db $89 +org $1DE18E : db $8D +org $1DE1A6 : db $80 +org $1DE1AF : db $9D +org $1DE1B5 : db $89 +org $1DE1CC : db $8D +org $1DE1E9 : db $80 +org $1DE1F2 : db $9D +org $1DE1F8 : db $89 +org $1DE212 : db $8D +org $1DE221 : db $9D +org $1DE227 : db $89 +org $1DE417 : db $86 +org $1DE449 : db $8D +org $1DE4E4 : db $80 +org $1DE572 : db $9D +org $1DE5C2 : db $86 +org $1DE5C8 : db $8D +org $1DE5E7 : db $8D +org $1DE61A : db $9D +org $1DE625 : db $89 +org $1DE629 : db $8D +org $1DE761 : db $9D +org $1DE797 : db $86 +org $1DE7A7 : db $86 +org $1DE7AB : db $86 +org $1DE7FC : db $86 +org $1DE84D : db $86 +org $1DE896 : db $86 +org $1DE89B : db $86 +org $1DE8A0 : db $86 +org $1DE9B0 : db $86 +org $1DE9C7 : db $82 +org $1DE9D0 : db $82 +org $1DE9D6 : db $82 +org $1DEAFD : db $86 +org $1DEB9E : db $86 +org $1DEBE8 : db $85 +org $1DEC01 : db $80 +org $1DED13 : db $83 +org $1DED26 : db $83 +org $1DEE5C : db $86 +org $1DEED8 : db $8D +org $1DEEE4 : db $8D +org $1DEEED : db $9D +org $1DEEF3 : db $89 +org $1DEF42 : db $8D +org $1DEF50 : db $9D +org $1DEF56 : db $89 +org $1DEFA3 : db $80 +org $1DEFBC : db $86 +org $1DEFDE : db $8D +org $1DEFF1 : db $86 +org $1DF05C : db $8D +org $1DF083 : db $86 +org $1DF094 : db $86 +org $1DF275 : db $86 +org $1DF27C : db $9D +org $1DF3EC : db $86 +org $1DF3FF : db $85 +org $1DF423 : db $8D +org $1DF429 : db $9D +org $1DF42F : db $89 +org $1DF437 : db $86 +org $1DF5CE : db $86 +org $1DF6A6 : db $8D +org $1DF825 : db $86 +org $1DF951 : db $80 +org $1DF965 : db $80 +org $1DF974 : db $86 +org $1DF97A : db $87 +org $1DF984 : db $86 +org $1DF992 : db $8D +org $1DFA24 : db $85 +org $1DFA49 : db $85 +org $1DFA53 : db $9D +org $1DFA59 : db $86 +org $1DFA5D : db $89 +org $1DFAF9 : db $85 +org $1DFB0D : db $86 +org $1DFB38 : db $86 +org $1DFB91 : db $9D +org $1DFB9D : db $9D +org $1DFBA9 : db $9D +org $1DFBFD : db $9D +org $1DFC05 : db $8D +org $1DFC09 : db $89 +org $1DFC41 : db $9E +org $1DFC4E : db $80 +org $1DFC79 : db $85 +org $1DFC87 : db $85 +org $1DFCA9 : db $85 +org $1DFCCB : db $9C +org $1DFCDB : db $85 +org $1DFD49 : db $85 +org $1DFD6A : db $8D +org $1DFD71 : db $80 +org $1DFDA1 : db $8D +org $1DFDAF : db $9D +org $1DFE01 : db $8D +org $1DFE68 : db $85 +org $1DFE6C : db $86 +org $1DFF44 : db $85 +org $1DFF58 : db $85 +org $1DFF6A : db $86 +org $1DFF79 : db $9E +org $1DFF8A : db $9E +org $1DFFB6 : db $86 +org $1DFFF5 : db $86 +org $1E804C : db $86 +org $1E8108 : db $9D +org $1E8148 : db $86 +org $1E8183 : db $80 +org $1E81AC : db $8D +org $1E8265 : db $8D +org $1E8274 : db $8D +org $1E82A6 : db $9E +org $1E82F3 : db $8D +org $1E8320 : db $8D +org $1E839C : db $86 +org $1E83AA : db $86 +org $1E83B2 : db $86 +org $1E83C2 : db $86 +org $1E83E9 : db $8D +org $1E8416 : db $86 +org $1E84A8 : db $8D +org $1E84AF : db $9D +org $1E851C : db $9D +org $1E8522 : db $89 +org $1E85C4 : db $86 +org $1E86E8 : db $86 +org $1E8713 : db $86 +org $1E87F3 : db $85 +org $1E8897 : db $86 +org $1E88CE : db $8D +org $1E8988 : db $83 +org $1E899B : db $83 +org $1E8A78 : db $86 +org $1E8A80 : db $86 +org $1E8AA2 : db $8D +org $1E8AA6 : db $86 +org $1E8B31 : db $86 +org $1E8BD1 : db $80 +org $1E8BFB : db $8D +org $1E8C0E : db $8D +org $1E8C59 : db $86 +org $1E8C5D : db $9D +org $1E8D69 : db $8D +org $1E8D72 : db $8D +org $1E8DD0 : db $8D +org $1E8DE2 : db $80 +org $1E8DEA : db $86 +org $1E8E12 : db $8D +org $1E8E17 : db $8D +org $1E8E27 : db $86 +org $1E8E4A : db $8D +org $1E8EAA : db $86 +org $1E8ECB : db $80 +org $1E8F1D : db $8D +org $1E8F86 : db $9D +org $1E8F8E : db $8D +org $1E8FFE : db $86 +org $1E9097 : db $8D +org $1E909B : db $85 +org $1E90AF : db $86 +org $1E911C : db $86 +org $1E9137 : db $8D +org $1E914E : db $8D +org $1E9190 : db $8D +org $1E91C3 : db $86 +org $1E9205 : db $8D +org $1E920E : db $8D +org $1E9224 : db $80 +org $1E9233 : db $8D +org $1E9294 : db $8D +org $1E92E2 : db $9E +org $1E92EC : db $9D +org $1E92F4 : db $8D +org $1E92F8 : db $89 +org $1E937E : db $9D +org $1E9389 : db $89 +org $1E9391 : db $86 +org $1E93C1 : db $8D +org $1E947B : db $9C +org $1E947F : db $87 +org $1E9483 : db $86 +org $1E94CC : db $80 +org $1E94EF : db $9D +org $1E9515 : db $8D +org $1E951B : db $8D +org $1E9555 : db $86 +org $1E9559 : db $9D +org $1E9566 : db $80 +org $1E957D : db $8D +org $1E95F3 : db $8D +org $1E95FE : db $8D +org $1E9619 : db $86 +org $1E9668 : db $9D +org $1E966E : db $89 +org $1E96CC : db $8D +org $1E96E8 : db $8D +org $1E9740 : db $86 +org $1E97B8 : db $8D +org $1E97D4 : db $8D +org $1E97D8 : db $8D +org $1E97E7 : db $9D +org $1E97ED : db $89 +org $1E9820 : db $8D +org $1E9850 : db $80 +org $1E989A : db $81 +org $1E98D8 : db $86 +org $1E98ED : db $8D +org $1E9906 : db $9E +org $1E994B : db $89 +org $1E9967 : db $80 +org $1E9A69 : db $86 +org $1E9A7E : db $86 +org $1E9A85 : db $80 +org $1E9B18 : db $86 +org $1E9B25 : db $80 +org $1E9BC6 : db $86 +org $1E9BE6 : db $86 +org $1E9C6E : db $8D +org $1E9C78 : db $80 +org $1E9D23 : db $8D +org $1E9D59 : db $86 +org $1E9D5F : db $8D +org $1E9D71 : db $80 +org $1E9E06 : db $8D +org $1E9E1A : db $9D +org $1E9E22 : db $8D +org $1E9E83 : db $86 +org $1E9E9A : db $80 +org $1E9EB0 : db $8D +org $1E9FA2 : db $8D +org $1E9FBF : db $8D +org $1E9FD0 : db $8D +org $1E9FE1 : db $9E +org $1EA171 : db $86 +org $1EA1E1 : db $80 +org $1EA283 : db $8D +org $1EA29B : db $8D +org $1EA2B3 : db $9E +org $1EA460 : db $86 +org $1EA465 : db $86 +org $1EA472 : db $86 +org $1EA485 : db $8D +org $1EA555 : db $80 +org $1EA5DD : db $9D +org $1EA646 : db $8D +org $1EA75B : db $80 +org $1EA801 : db $9E +org $1EA827 : db $9D +org $1EA82D : db $89 +org $1EA836 : db $8D +org $1EA876 : db $8D +org $1EA8A1 : db $8D +org $1EA8AD : db $8D +org $1EA978 : db $86 +org $1EA97D : db $86 +org $1EA992 : db $86 +org $1EA998 : db $87 +org $1EA9A3 : db $86 +org $1EA9C8 : db $87 +org $1EA9CF : db $8D +org $1EAA2E : db $86 +org $1EAA44 : db $8D +org $1EAAAF : db $86 +org $1EAAE3 : db $80 +org $1EAB25 : db $8D +org $1EAB72 : db $8D +org $1EAC0B : db $86 +org $1EAC18 : db $8D +org $1EAC9E : db $8D +org $1EACBF : db $8D +org $1EAE44 : db $86 +org $1EAF09 : db $8B +org $1EAF0D : db $87 +org $1EAF13 : db $86 +org $1EAF1A : db $80 +org $1EAF7A : db $8D +org $1EAFFA : db $9D +org $1EB021 : db $8D +org $1EB03C : db $86 +org $1EB046 : db $80 +org $1EB0BB : db $86 +org $1EB0C1 : db $8D +org $1EB102 : db $86 +org $1EB14B : db $86 +org $1EB14F : db $8D +org $1EB18D : db $8D +org $1EB198 : db $8D +org $1EB1D6 : db $8D +org $1EB1FF : db $86 +org $1EB20C : db $86 +org $1EB26C : db $86 +org $1EB27E : db $86 +org $1EB28B : db $80 +org $1EB2A9 : db $8D +org $1EB3BD : db $86 +org $1EB3C4 : db $86 +org $1EB4B7 : db $80 +org $1EB50B : db $85 +org $1EB519 : db $8D +org $1EB52A : db $8D +org $1EB53A : db $86 +org $1EB546 : db $8D +org $1EB5CD : db $89 +org $1EB5F2 : db $8D +org $1EB5FA : db $8D +org $1EB609 : db $86 +org $1EB660 : db $8D +org $1EB770 : db $83 +org $1EB783 : db $83 +org $1EB8A3 : db $9D +org $1EB8AC : db $83 +org $1EB8C9 : db $86 +org $1EB947 : db $86 +org $1EB968 : db $86 +org $1EB9B5 : db $80 +org $1EB9EE : db $8D +org $1EBB3A : db $86 +org $1EBB3F : db $86 +org $1EBBCE : db $80 +org $1EBBF1 : db $81 +org $1EBC2E : db $8D +org $1EBC5B : db $86 +org $1EBC82 : db $8D +org $1EBCE0 : db $86 +org $1EBCEA : db $86 +org $1EBD1B : db $8D +org $1EBD22 : db $8D +org $1EBD26 : db $86 +org $1EBDB3 : db $86 +org $1EBE11 : db $81 +org $1EBE85 : db $9A +org $1EBEC9 : db $80 +org $1EBF50 : db $8D +org $1EBF63 : db $8D +org $1EBF72 : db $86 +org $1EBFAB : db $8D +org $1EBFC1 : db $8D +org $1EBFDE : db $8D +org $1EBFE9 : db $9D +org $1EBFEF : db $89 +org $1EC091 : db $9D +org $1EC098 : db $8D +org $1EC0D9 : db $86 +org $1EC100 : db $86 +org $1EC113 : db $80 +org $1EC128 : db $8D +org $1EC19A : db $8D +org $1EC224 : db $9D +org $1EC264 : db $86 +org $1EC268 : db $86 +org $1EC276 : db $86 +org $1EC2AC : db $8D +org $1EC2D1 : db $86 +org $1EC2F2 : db $9E +org $1EC3A4 : db $8D +org $1EC3E8 : db $80 +org $1EC55F : db $86 +org $1EC57F : db $9D +org $1EC585 : db $89 +org $1EC592 : db $86 +org $1EC68A : db $86 +org $1EC7A0 : db $9D +org $1EC7B3 : db $9E +org $1EC855 : db $80 +org $1EC89F : db $8D +org $1ECAEC : db $86 +org $1ECB35 : db $9D +org $1ECB42 : db $9E +org $1ECB4B : db $9E +org $1ECB55 : db $9E +org $1ECB5E : db $9E +org $1ECB65 : db $9E +org $1ECB6C : db $9E +org $1ECB73 : db $9E +org $1ECB7A : db $9E +org $1ECB94 : db $9D +org $1ECBD8 : db $89 +org $1ECC07 : db $86 +org $1ECC38 : db $80 +org $1ECC67 : db $8D +org $1ECCEF : db $82 +org $1ECCF3 : db $80 +org $1ECCFA : db $9E +org $1ECD02 : db $9E +org $1ECD0A : db $9E +org $1ECD12 : db $9E +org $1ECD1A : db $9E +org $1ECD22 : db $9E +org $1ECD2A : db $9E +org $1ECD32 : db $9E +org $1ECD51 : db $9D +org $1ECD7C : db $89 +org $1ECD9F : db $80 +org $1ECE1F : db $8D +org $1ECE4A : db $80 +org $1ECE8A : db $9C +org $1ECE9B : db $80 +org $1ECEFD : db $85 +org $1ECF19 : db $85 +org $1ECF30 : db $85 +org $1ECF3B : db $80 +org $1ED00A : db $85 +org $1ED088 : db $83 +org $1ED095 : db $83 +org $1ED176 : db $86 +org $1ED1B9 : db $86 +org $1ED1CE : db $86 +org $1ED216 : db $8D +org $1ED2AA : db $86 +org $1ED2DD : db $86 +org $1ED2FE : db $86 +org $1ED352 : db $80 +org $1ED37C : db $80 +org $1ED395 : db $80 +org $1ED3C9 : db $8D +org $1ED3F3 : db $9D +org $1ED445 : db $86 +org $1ED456 : db $9D +org $1ED46A : db $85 +org $1ED498 : db $9D +org $1ED4C0 : db $9D +org $1ED4C4 : db $89 +org $1ED502 : db $85 +org $1ED56D : db $8D +org $1ED582 : db $80 +org $1ED5A7 : db $86 +org $1ED5C6 : db $86 +org $1ED641 : db $8D +org $1ED697 : db $8D +org $1ED69E : db $9D +org $1ED6A2 : db $9D +org $1ED6A9 : db $9D +org $1ED6B1 : db $8D +org $1ED6F2 : db $8D +org $1ED760 : db $86 +org $1ED9CA : db $86 +org $1ED9D6 : db $86 +org $1ED9E4 : db $8D +org $1ED9EA : db $8D +org $1EDA4B : db $86 +org $1EDA71 : db $86 +org $1EDAB2 : db $86 +org $1EDAB7 : db $86 +org $1EDAC6 : db $86 +org $1EDADF : db $86 +org $1EDAEF : db $8D +org $1EDAF9 : db $8D +org $1EDAFF : db $8D +org $1EDB05 : db $86 +org $1EDB28 : db $9D +org $1EDB2E : db $89 +org $1EDB58 : db $86 +org $1EDB5E : db $86 +org $1EDB95 : db $8D +org $1EDBA8 : db $9D +org $1EDC5B : db $80 +org $1EDC8E : db $9D +org $1EDC94 : db $89 +org $1EDCB0 : db $8D +org $1EDCBD : db $8D +org $1EDCD1 : db $9D +org $1EDD13 : db $8D +org $1EDD20 : db $8D +org $1EDD45 : db $86 +org $1EDD57 : db $85 +org $1EDD72 : db $86 +org $1EDD7C : db $85 +org $1EDD9A : db $8D +org $1EDDAF : db $8D +org $1EDDC6 : db $86 +org $1EDDF9 : db $9E +org $1EDE0F : db $8D +org $1EDE1C : db $85 +org $1EDE63 : db $80 +org $1EDE8F : db $9D +org $1EDE95 : db $89 +org $1EDEB1 : db $8D +org $1EDEBE : db $8D +org $1EDED7 : db $86 +org $1EDEF5 : db $85 +org $1EDF0F : db $86 +org $1EDF19 : db $85 +org $1EDF34 : db $8D +org $1EDF49 : db $8D +org $1EDF67 : db $86 +org $1EDFF5 : db $8D +org $1EDFFA : db $8D +org $1EE011 : db $8D +org $1EE034 : db $8D +org $1EE041 : db $86 +org $1EE04D : db $87 +org $1EE066 : db $86 +org $1EE097 : db $85 +org $1EE0A0 : db $86 +org $1EE0C8 : db $87 +org $1EE0D5 : db $85 +org $1EE0DA : db $86 +org $1EE0EA : db $85 +org $1EE104 : db $80 +org $1EE109 : db $89 +org $1EE111 : db $80 +org $1EE156 : db $8D +org $1EE161 : db $8D +org $1EE184 : db $85 +org $1EE188 : db $9E +org $1EE193 : db $9E +org $1EE1A2 : db $8D +org $1EE1C3 : db $85 +org $1EE1D1 : db $85 +org $1EE1E2 : db $9E +org $1EE1FB : db $80 +org $1EE200 : db $89 +org $1EE20B : db $85 +org $1EE219 : db $8D +org $1EE21D : db $86 +org $1EE255 : db $9D +org $1EE2DD : db $85 +org $1EE2E1 : db $86 +org $1EE2EF : db $80 +org $1EE341 : db $8D +org $1EE35E : db $86 +org $1EE3D7 : db $80 +org $1EE3E9 : db $85 +org $1EE403 : db $85 +org $1EE417 : db $85 +org $1EE445 : db $86 +org $1EE484 : db $86 +org $1EE4AC : db $86 +org $1EE4BC : db $80 +org $1EE4C0 : db $89 +org $1EE4E0 : db $80 +org $1EE4FE : db $85 +org $1EE50F : db $85 +org $1EE526 : db $85 +org $1EE54D : db $8D +org $1EE5BC : db $8D +org $1EE5D7 : db $86 +org $1EE645 : db $8D +org $1EE663 : db $8D +org $1EE67A : db $9D +org $1EE88A : db $86 +org $1EE8AE : db $86 +org $1EE8B3 : db $8D +org $1EE8BA : db $85 +org $1EE8D0 : db $85 +org $1EE8E4 : db $80 +org $1EE8E9 : db $89 +org $1EE91F : db $80 +org $1EE92F : db $80 +org $1EE938 : db $9D +org $1EE98F : db $9D +org $1EE999 : db $80 +org $1EE9A6 : db $80 +org $1EE9AE : db $85 +org $1EE9BF : db $85 +org $1EE9D5 : db $89 +org $1EE9E2 : db $82 +org $1EE9ED : db $80 +org $1EEA01 : db $87 +org $1EEA83 : db $86 +org $1EEAB0 : db $9E +org $1EEADA : db $85 +org $1EEAE4 : db $8D +org $1EEAF6 : db $80 +org $1EEB0F : db $85 +org $1EEB33 : db $80 +org $1EEB3D : db $86 +org $1EEB41 : db $86 +org $1EEBC7 : db $8D +org $1EEBD1 : db $8D +org $1EEBDD : db $86 +org $1EEC74 : db $86 +org $1EECA5 : db $80 +org $1EECDA : db $86 +org $1EED3B : db $8D +org $1EEDB6 : db $85 +org $1EEDBA : db $86 +org $1EEDC1 : db $8D +org $1EEDC8 : db $9D +org $1EEDCE : db $89 +org $1EEDFA : db $85 +org $1EEE37 : db $85 +org $1EEE5D : db $86 +org $1EEEB7 : db $8D +org $1EEEC9 : db $86 +org $1EEED0 : db $86 +org $1EEEE9 : db $80 +org $1EEF0E : db $86 +org $1EEF12 : db $86 +org $1EEF2C : db $9E +org $1EEF3C : db $85 +org $1EEF4C : db $85 +org $1EEF7F : db $85 +org $1EEF87 : db $86 +org $1EEF8B : db $86 +org $1EEF92 : db $9E +org $1EEFAC : db $80 +org $1EEFC2 : db $85 +org $1EEFE3 : db $85 +org $1EEFEF : db $85 +org $1EF000 : db $85 +org $1EF009 : db $85 +org $1EF026 : db $86 +org $1EF02A : db $9D +org $1EF035 : db $9E +org $1EF03C : db $80 +org $1EF04A : db $85 +org $1EF07B : db $8D +org $1EF082 : db $9E +org $1EF089 : db $80 +org $1EF09F : db $85 +org $1EF0C0 : db $85 +org $1EF0CC : db $85 +org $1EF0E5 : db $85 +org $1EF0F0 : db $9E +org $1EF0F7 : db $80 +org $1EF10D : db $85 +org $1EF12E : db $85 +org $1EF13A : db $85 +org $1EF14C : db $9E +org $1EF160 : db $85 +org $1EF16B : db $9E +org $1EF174 : db $9E +org $1EF190 : db $85 +org $1EF19C : db $85 +org $1EF1B0 : db $9D +org $1EF1C2 : db $9E +org $1EF1CB : db $9E +org $1EF1EF : db $9E +org $1EF21C : db $85 +org $1EF22D : db $9E +org $1EF26A : db $86 +org $1EF27A : db $9E +org $1EF2AC : db $9E +org $1EF2BB : db $8D +org $1EF2DC : db $85 +org $1EF2ED : db $9E +org $1EF2FC : db $8D +org $1EF31F : db $9E +org $1EF328 : db $9E +org $1EF344 : db $85 +org $1EF361 : db $87 +org $1EF378 : db $85 +org $1EF37C : db $9C +org $1EF383 : db $8D +org $1EF38C : db $86 +org $1EF4E5 : db $85 +org $1EF4F1 : db $86 +org $1EF500 : db $9C +org $1EF506 : db $87 +org $1EF519 : db $8D +org $1EF52E : db $9D +org $1EF534 : db $89 +org $1EF54C : db $8D +org $1EF556 : db $8D +org $1EF562 : db $86 +org $1EF580 : db $86 +org $1EF596 : db $8D +org $1EF5FA : db $9A +org $1EF601 : db $9E +org $1EF605 : db $8D +org $1EF61F : db $85 +org $1EF6CE : db $80 +org $1EF6D9 : db $89 +org $1EF71D : db $86 +org $1EF728 : db $87 +org $1EF7CF : db $86 +org $1EF859 : db $8D +org $1EF882 : db $80 +org $1EFB7B : db $80 +org $1EFBBC : db $86 +org $1EFBC3 : db $87 +org $1EFBD2 : db $87 +org $1EFC37 : db $8D +org $1EFCBC : db $87 +org $1EFCC0 : db $87 +org $1EFCC4 : db $87 +org $1EFCFB : db $87 +org $1EFCFF : db $87 +org $1EFD03 : db $87 +org $1EFD81 : db $8D +org $1EFD8B : db $8D +org $1EFD97 : db $86 +org $1EFDF6 : db $8D +org $1EFE2C : db $9D +org $1EFE60 : db $86 +org $1EFE65 : db $86 +org $1EFE6A : db $86 +org $1EFF7B : db $86 +org $1EFFC0 : db $85 +org $1EFFC4 : db $86 +org $1EFFD0 : db $8D +org $1F8002 : db $8A +org $1F8005 : db $8A +org $1F8008 : db $8A +org $1F800B : db $8A +org $1F800E : db $9F +org $1F8011 : db $9F +org $1F8014 : db $9F +org $1F8017 : db $9F +org $1F801A : db $8A +org $1F801D : db $9F +org $1F8020 : db $9F +org $1F8023 : db $9F +org $1F8026 : db $9F +org $1F8029 : db $9F +org $1F802C : db $9F +org $1F802F : db $9F +org $1F8032 : db $8A +org $1F8035 : db $8A +org $1F8038 : db $8A +org $1F803B : db $9F +org $1F803E : db $9F +org $1F8041 : db $9F +org $1F8044 : db $9F +org $1F8047 : db $9F +org $1F804A : db $8A +org $1F804D : db $9F +org $1F8050 : db $9F +org $1F8053 : db $9F +org $1F8056 : db $9F +org $1F8059 : db $9F +org $1F805C : db $9F +org $1F805F : db $9F +org $1F8062 : db $9F +org $1F8065 : db $8A +org $1F8068 : db $8A +org $1F806B : db $9F +org $1F806E : db $9F +org $1F8071 : db $9F +org $1F8074 : db $9F +org $1F8077 : db $9F +org $1F807A : db $9F +org $1F807D : db $9F +org $1F8080 : db $9F +org $1F8083 : db $9F +org $1F8086 : db $8A +org $1F8089 : db $9F +org $1F808C : db $9F +org $1F808F : db $8A +org $1F8092 : db $9F +org $1F8095 : db $9F +org $1F8098 : db $8A +org $1F809B : db $9F +org $1F809E : db $9F +org $1F80A1 : db $9F +org $1F80A4 : db $9F +org $1F80A7 : db $9F +org $1F80AA : db $9F +org $1F80AD : db $9F +org $1F80B0 : db $9F +org $1F80B3 : db $9F +org $1F80B6 : db $8A +org $1F80B9 : db $9F +org $1F80BC : db $9F +org $1F80BF : db $9F +org $1F80C2 : db $9F +org $1F80C5 : db $8A +org $1F80C8 : db $8A +org $1F80CB : db $9F +org $1F80CE : db $9F +org $1F80D1 : db $9F +org $1F80D4 : db $9F +org $1F80D7 : db $9F +org $1F80DA : db $9F +org $1F80DD : db $9F +org $1F80E0 : db $9F +org $1F80E3 : db $9F +org $1F80E6 : db $9F +org $1F80E9 : db $9F +org $1F80EC : db $9F +org $1F80EF : db $9F +org $1F80F2 : db $8A +org $1F80F5 : db $8A +org $1F80F8 : db $8A +org $1F80FB : db $9F +org $1F80FE : db $9F +org $1F8101 : db $8A +org $1F8104 : db $9F +org $1F8107 : db $9F +org $1F810A : db $9F +org $1F810D : db $9F +org $1F8110 : db $9F +org $1F8113 : db $9F +org $1F8116 : db $9F +org $1F8119 : db $9F +org $1F811C : db $9F +org $1F811F : db $9F +org $1F8122 : db $8A +org $1F8125 : db $8A +org $1F8128 : db $8A +org $1F812B : db $9F +org $1F812E : db $9F +org $1F8131 : db $9F +org $1F8134 : db $9F +org $1F8137 : db $9F +org $1F813A : db $9F +org $1F813D : db $9F +org $1F8140 : db $9F +org $1F8143 : db $9F +org $1F8146 : db $9F +org $1F8149 : db $9F +org $1F814C : db $9F +org $1F814F : db $9F +org $1F8152 : db $8A +org $1F8155 : db $8A +org $1F8158 : db $8A +org $1F815B : db $9F +org $1F815E : db $9F +org $1F8161 : db $9F +org $1F8164 : db $9F +org $1F8167 : db $9F +org $1F816A : db $9F +org $1F816D : db $9F +org $1F8170 : db $9F +org $1F8173 : db $9F +org $1F8176 : db $9F +org $1F8179 : db $9F +org $1F817C : db $9F +org $1F817F : db $9F +org $1F8182 : db $8A +org $1F8185 : db $8A +org $1F8188 : db $8A +org $1F818B : db $9F +org $1F818E : db $9F +org $1F8191 : db $9F +org $1F8194 : db $9F +org $1F8197 : db $9F +org $1F819A : db $9F +org $1F819D : db $8A +org $1F81A0 : db $9F +org $1F81A3 : db $9F +org $1F81A6 : db $9F +org $1F81A9 : db $9F +org $1F81AC : db $9F +org $1F81AF : db $9F +org $1F81B2 : db $9F +org $1F81B5 : db $9F +org $1F81B8 : db $9F +org $1F81BB : db $9F +org $1F81BE : db $9F +org $1F81C1 : db $9F +org $1F81C4 : db $9F +org $1F81C7 : db $9F +org $1F81CA : db $9F +org $1F81CD : db $8A +org $1F81D0 : db $9F +org $1F81D3 : db $9F +org $1F81D6 : db $9F +org $1F81D9 : db $9F +org $1F81DC : db $9F +org $1F81DF : db $9F +org $1F81E2 : db $9F +org $1F81E5 : db $9F +org $1F81E8 : db $9F +org $1F81EB : db $9F +org $1F81EE : db $9F +org $1F81F1 : db $9F +org $1F81F4 : db $9F +org $1F81F7 : db $9F +org $1F81FA : db $8A +org $1F81FD : db $8A +org $1F8200 : db $8A +org $1F8203 : db $9F +org $1F8206 : db $9F +org $1F8209 : db $9F +org $1F820C : db $9F +org $1F820F : db $9F +org $1F8212 : db $9F +org $1F8215 : db $9F +org $1F8218 : db $9F +org $1F821B : db $9F +org $1F821E : db $9F +org $1F8221 : db $9F +org $1F8224 : db $9F +org $1F8227 : db $9F +org $1F822A : db $8A +org $1F822D : db $8A +org $1F8230 : db $8A +org $1F8233 : db $9F +org $1F8236 : db $9F +org $1F8239 : db $9F +org $1F823C : db $9F +org $1F823F : db $9F +org $1F8242 : db $9F +org $1F8245 : db $9F +org $1F8248 : db $9F +org $1F824B : db $9F +org $1F824E : db $9F +org $1F8251 : db $9F +org $1F8254 : db $9F +org $1F8257 : db $9F +org $1F825A : db $8A +org $1F825D : db $8A +org $1F8260 : db $9F +org $1F8263 : db $9F +org $1F8266 : db $9F +org $1F8269 : db $9F +org $1F826C : db $9F +org $1F826F : db $9F +org $1F8272 : db $9F +org $1F8275 : db $9F +org $1F8278 : db $9F +org $1F827B : db $9F +org $1F827E : db $9F +org $1F8281 : db $9F +org $1F8284 : db $9F +org $1F8287 : db $9F +org $1F828A : db $8A +org $1F828D : db $8A +org $1F8290 : db $8A +org $1F8293 : db $9F +org $1F8296 : db $9F +org $1F8299 : db $9F +org $1F829C : db $9F +org $1F829F : db $8A +org $1F82A2 : db $9F +org $1F82A5 : db $8A +org $1F82A8 : db $8A +org $1F82AB : db $8A +org $1F82AE : db $8A +org $1F82B1 : db $8A +org $1F82B4 : db $8A +org $1F82B7 : db $8A +org $1F82BA : db $8A +org $1F82BD : db $9F +org $1F82C0 : db $8A +org $1F82C3 : db $8A +org $1F82C6 : db $9F +org $1F82C9 : db $8A +org $1F82CC : db $8A +org $1F82CF : db $8A +org $1F82D2 : db $8A +org $1F82D5 : db $8A +org $1F82D8 : db $8A +org $1F82DB : db $8A +org $1F82DE : db $8A +org $1F82E1 : db $8A +org $1F82E4 : db $9F +org $1F82E7 : db $9F +org $1F82EA : db $8A +org $1F82ED : db $8A +org $1F82F0 : db $8A +org $1F82F3 : db $8A +org $1F82F6 : db $9F +org $1F82F9 : db $8A +org $1F82FC : db $8A +org $1F82FF : db $8A +org $1F8302 : db $83 +org $1F8305 : db $83 +org $1F8308 : db $83 +org $1F830B : db $83 +org $1F830E : db $8A +org $1F8311 : db $83 +org $1F8314 : db $83 +org $1F8317 : db $83 +org $1F831A : db $83 +org $1F831D : db $83 +org $1F8320 : db $83 +org $1F8323 : db $83 +org $1F8326 : db $83 +org $1F8329 : db $83 +org $1F832C : db $83 +org $1F832F : db $83 +org $1F8332 : db $83 +org $1F8335 : db $83 +org $1F8338 : db $83 +org $1F833B : db $83 +org $1F833E : db $83 +org $1F8341 : db $83 +org $1F8344 : db $83 +org $1F8347 : db $83 +org $1F834A : db $83 +org $1F834D : db $83 +org $1F8350 : db $83 +org $1F8353 : db $83 +org $1F8356 : db $83 +org $1F8359 : db $83 +org $1F835C : db $83 +org $1F835F : db $83 +org $1F8362 : db $83 +org $1F8365 : db $83 +org $1F8368 : db $83 +org $1F836B : db $8A +org $1F836E : db $8A +org $1F8371 : db $8A +org $1F8374 : db $8A +org $1F8377 : db $8A +org $1F837A : db $9F +org $1F837D : db $9F +org $1F8380 : db $9F +org $1F8383 : db $9F +org $1F8386 : db $9F +org $1F8389 : db $9F +org $1F838C : db $9F +org $1F838F : db $9F +org $1F8392 : db $9F +org $1F8395 : db $9F +org $1F8398 : db $9F +org $1F839B : db $9F +org $1F839E : db $9F +org $1F83A1 : db $9F +org $1F83A4 : db $9F +org $1F83A7 : db $9F +org $1F83AA : db $9F +org $1F83AD : db $9F +org $1F83B0 : db $9F +org $1F83B3 : db $9F +org $1F83B6 : db $9F +org $1F83B9 : db $9F +org $1F83BC : db $9F +org $1F83BF : db $9F +org $1F83C2 : db $8A +org $1F83C5 : db $8A +org $1F83C8 : db $8A +org $1F83CB : db $8A +org $1F83CE : db $9F +org $1F83D1 : db $9F +org $1F83D4 : db $9F +org $1F83D7 : db $9F +org $1F83DA : db $8A +org $1F83DD : db $9F +org $1F83E0 : db $9F +org $1F83E3 : db $9F +org $1F83E6 : db $9F +org $1F83E9 : db $9F +org $1F83EC : db $9F +org $1F83EF : db $9F +org $1F83F2 : db $8A +org $1F83F5 : db $8A +org $1F83F8 : db $8A +org $1F83FB : db $9F +org $1F83FE : db $9F +org $1F8401 : db $9F +org $1F8404 : db $9F +org $1F8407 : db $9F +org $1F840A : db $8A +org $1F840D : db $9F +org $1F8410 : db $9F +org $1F8413 : db $9F +org $1F8416 : db $9F +org $1F8419 : db $9F +org $1F841C : db $9F +org $1F841F : db $9F +org $1F8422 : db $9F +org $1F8425 : db $8A +org $1F8428 : db $8A +org $1F842B : db $9F +org $1F842E : db $9F +org $1F8431 : db $9F +org $1F8434 : db $9F +org $1F8437 : db $9F +org $1F843A : db $9F +org $1F843D : db $9F +org $1F8440 : db $9F +org $1F8443 : db $9F +org $1F8446 : db $8A +org $1F8449 : db $9F +org $1F844C : db $9F +org $1F844F : db $8A +org $1F8452 : db $9F +org $1F8455 : db $9F +org $1F8458 : db $8A +org $1F845B : db $9F +org $1F845E : db $9F +org $1F8461 : db $9F +org $1F8464 : db $9F +org $1F8467 : db $9F +org $1F846A : db $9F +org $1F846D : db $9F +org $1F8470 : db $9F +org $1F8473 : db $9F +org $1F8476 : db $8A +org $1F8479 : db $9F +org $1F847C : db $9F +org $1F847F : db $9F +org $1F8482 : db $9F +org $1F8485 : db $8A +org $1F8488 : db $8A +org $1F848B : db $9F +org $1F848E : db $9F +org $1F8491 : db $9F +org $1F8494 : db $9F +org $1F8497 : db $9F +org $1F849A : db $9F +org $1F849D : db $9F +org $1F84A0 : db $9F +org $1F84A3 : db $9F +org $1F84A6 : db $9F +org $1F84A9 : db $9F +org $1F84AC : db $9F +org $1F84AF : db $9F +org $1F84B2 : db $8A +org $1F84B5 : db $8A +org $1F84B8 : db $8A +org $1F84BB : db $9F +org $1F84BE : db $9F +org $1F84C1 : db $8A +org $1F84C4 : db $9F +org $1F84C7 : db $9F +org $1F84CA : db $9F +org $1F84CD : db $9F +org $1F84D0 : db $9F +org $1F84D3 : db $9F +org $1F84D6 : db $9F +org $1F84D9 : db $9F +org $1F84DC : db $9F +org $1F84DF : db $9F +org $1F84E2 : db $8A +org $1F84E5 : db $8A +org $1F84E8 : db $8A +org $1F84EB : db $9F +org $1F84EE : db $9F +org $1F84F1 : db $9F +org $1F84F4 : db $9F +org $1F84F7 : db $9F +org $1F84FA : db $9F +org $1F84FD : db $9F +org $1F8500 : db $9F +org $1F8503 : db $9F +org $1F8506 : db $9F +org $1F8509 : db $9F +org $1F850C : db $9F +org $1F850F : db $9F +org $1F8512 : db $8A +org $1F8515 : db $8A +org $1F8518 : db $8A +org $1F851B : db $9F +org $1F851E : db $9F +org $1F8521 : db $9F +org $1F8524 : db $9F +org $1F8527 : db $9F +org $1F852A : db $9F +org $1F852D : db $9F +org $1F8530 : db $9F +org $1F8533 : db $9F +org $1F8536 : db $9F +org $1F8539 : db $9F +org $1F853C : db $9F +org $1F853F : db $9F +org $1F8542 : db $8A +org $1F8545 : db $8A +org $1F8548 : db $8A +org $1F854B : db $9F +org $1F854E : db $9F +org $1F8551 : db $9F +org $1F8554 : db $9F +org $1F8557 : db $9F +org $1F855A : db $9F +org $1F855D : db $8A +org $1F8560 : db $9F +org $1F8563 : db $9F +org $1F8566 : db $9F +org $1F8569 : db $9F +org $1F856C : db $9F +org $1F856F : db $9F +org $1F8572 : db $9F +org $1F8575 : db $9F +org $1F8578 : db $9F +org $1F857B : db $9F +org $1F857E : db $9F +org $1F8581 : db $9F +org $1F8584 : db $9F +org $1F8587 : db $9F +org $1F858A : db $9F +org $1F858D : db $8A +org $1F8590 : db $9F +org $1F8593 : db $9F +org $1F8596 : db $9F +org $1F8599 : db $9F +org $1F859C : db $9F +org $1F859F : db $9F +org $1F85A2 : db $9F +org $1F85A5 : db $9F +org $1F85A8 : db $9F +org $1F85AB : db $9F +org $1F85AE : db $9F +org $1F85B1 : db $9F +org $1F85B4 : db $9F +org $1F85B7 : db $9F +org $1F85BA : db $8A +org $1F85BD : db $8A +org $1F85C0 : db $8A +org $1F85C3 : db $9F +org $1F85C6 : db $9F +org $1F85C9 : db $9F +org $1F85CC : db $9F +org $1F85CF : db $9F +org $1F85D2 : db $9F +org $1F85D5 : db $9F +org $1F85D8 : db $9F +org $1F85DB : db $9F +org $1F85DE : db $9F +org $1F85E1 : db $9F +org $1F85E4 : db $9F +org $1F85E7 : db $9F +org $1F85EA : db $8A +org $1F85ED : db $8A +org $1F85F0 : db $8A +org $1F85F3 : db $9F +org $1F85F6 : db $9F +org $1F85F9 : db $9F +org $1F85FC : db $9F +org $1F85FF : db $9F +org $1F8602 : db $9F +org $1F8605 : db $9F +org $1F8608 : db $9F +org $1F860B : db $9F +org $1F860E : db $9F +org $1F8611 : db $9F +org $1F8614 : db $9F +org $1F8617 : db $9F +org $1F861A : db $8A +org $1F861D : db $8A +org $1F8620 : db $9F +org $1F8623 : db $9F +org $1F8626 : db $9F +org $1F8629 : db $9F +org $1F862C : db $9F +org $1F862F : db $9F +org $1F8632 : db $9F +org $1F8635 : db $9F +org $1F8638 : db $9F +org $1F863B : db $9F +org $1F863E : db $9F +org $1F8641 : db $9F +org $1F8644 : db $9F +org $1F8647 : db $9F +org $1F864A : db $8A +org $1F864D : db $8A +org $1F8650 : db $8A +org $1F8653 : db $9F +org $1F8656 : db $9F +org $1F8659 : db $9F +org $1F865C : db $9F +org $1F865F : db $8A +org $1F8662 : db $9F +org $1F8665 : db $8A +org $1F8668 : db $8A +org $1F866B : db $8A +org $1F866E : db $8A +org $1F8671 : db $8A +org $1F8674 : db $8A +org $1F8677 : db $8A +org $1F867A : db $8A +org $1F867D : db $9F +org $1F8680 : db $8A +org $1F8683 : db $8A +org $1F8686 : db $9F +org $1F8689 : db $8A +org $1F868C : db $8A +org $1F868F : db $8A +org $1F8692 : db $8A +org $1F8695 : db $8A +org $1F8698 : db $8A +org $1F869B : db $8A +org $1F869E : db $8A +org $1F86A1 : db $8A +org $1F86A4 : db $9F +org $1F86A7 : db $9F +org $1F86AA : db $8A +org $1F86AD : db $8A +org $1F86B0 : db $8A +org $1F86B3 : db $8A +org $1F86B6 : db $9F +org $1F86B9 : db $8A +org $1F86BC : db $8A +org $1F86BF : db $8A +org $1F86C2 : db $83 +org $1F86C5 : db $83 +org $1F86C8 : db $83 +org $1F86CB : db $83 +org $1F86CE : db $8A +org $1F86D1 : db $83 +org $1F86D4 : db $83 +org $1F86D7 : db $83 +org $1F86DA : db $83 +org $1F86DD : db $83 +org $1F86E0 : db $83 +org $1F86E3 : db $83 +org $1F86E6 : db $83 +org $1F86E9 : db $83 +org $1F86EC : db $83 +org $1F86EF : db $83 +org $1F86F2 : db $83 +org $1F86F5 : db $83 +org $1F86F8 : db $83 +org $1F86FB : db $83 +org $1F86FE : db $83 +org $1F8701 : db $83 +org $1F8704 : db $83 +org $1F8707 : db $83 +org $1F870A : db $83 +org $1F870D : db $83 +org $1F8710 : db $83 +org $1F8713 : db $83 +org $1F8716 : db $83 +org $1F8719 : db $83 +org $1F871C : db $83 +org $1F871F : db $83 +org $1F8722 : db $83 +org $1F8725 : db $83 +org $1F8728 : db $83 +org $1F872B : db $8A +org $1F872E : db $8A +org $1F8731 : db $8A +org $1F8734 : db $8A +org $1F8737 : db $8A +org $1F873A : db $9F +org $1F873D : db $9F +org $1F8740 : db $9F +org $1F8743 : db $9F +org $1F8746 : db $9F +org $1F8749 : db $9F +org $1F874C : db $9F +org $1F874F : db $9F +org $1F8752 : db $9F +org $1F8755 : db $9F +org $1F8758 : db $9F +org $1F875B : db $9F +org $1F875E : db $9F +org $1F8761 : db $9F +org $1F8764 : db $9F +org $1F8767 : db $9F +org $1F876A : db $9F +org $1F876D : db $9F +org $1F8770 : db $9F +org $1F8773 : db $9F +org $1F8776 : db $9F +org $1F8779 : db $9F +org $1F877C : db $9F +org $1F877F : db $9F + +;=================================================================================================== +; Super secret text performance - skip decompress routine +org $0EEE58 : db $08 + +;=================================================================================================== diff --git a/fileselect.asm b/fileselect.asm index 4494ffc..849bce8 100644 --- a/fileselect.asm +++ b/fileselect.asm @@ -1,18 +1,15 @@ -!ValidKeyLoaded = "$7F509E" - ;FS prefix means file_select, since these defines and macros are specific to this screen +!FS_COLOR_BROWN = $0000 ;(only used for: Shovel, hammer, powder) +!FS_COLOR_RED = $0400 +!FS_COLOR_YELLOW = $0800 +!FS_COLOR_BLUE = $0C00 +!FS_COLOR_GRAY = $1000 ;(Used to gray out items) +!FS_COLOR_BOOTS = $1400 +!FS_COLOR_GREEN = $1800 +!FS_COLOR_BW = $1C00 -!FS_COLOR_BROWN = "$0000" ;(only used for: Shovel, hammer, powder) -!FS_COLOR_RED = "$0400" -!FS_COLOR_YELLOW = "$0800" -!FS_COLOR_BLUE = "$0C00" -!FS_COLOR_GRAY = "$1000" ;(Used to gray out items) -!FS_COLOR_BOOTS = "$1400" -!FS_COLOR_GREEN = "$1800" -!FS_COLOR_BW = "$1C00" - -!FS_HFLIP = "$4000" -!FS_VFLIP = "$8000" +!FS_HFLIP = $4000 +!FS_VFLIP = $8000 macro fs_draw8x8(screenrow,screencol) ;Note due to XKAS's screwy math this formula is misleading. @@ -83,45 +80,88 @@ JMP DrawItemGray DrawBottle: AND.w #$00FF : BNE + - LDX #FileSelectItems_empty_bottle + LDX.w #FileSelectItems_empty_bottle JMP DrawItemGray + : DEC #2 : BNE + - LDX #FileSelectItems_empty_bottle + LDX.w #FileSelectItems_empty_bottle JMP DrawItem + : DEC : BNE + - LDX #FileSelectItems_red_potion + LDX.w #FileSelectItems_red_potion JMP DrawItem + : DEC : BNE + - LDX #FileSelectItems_green_potion + LDX.w #FileSelectItems_green_potion JMP DrawItem + : DEC : BNE + - LDX #FileSelectItems_blue_potion + LDX.w #FileSelectItems_blue_potion JMP DrawItem + : DEC : BNE + - LDX #FileSelectItems_fairy_bottle + LDX.w #FileSelectItems_fairy_bottle JMP DrawItem + : DEC : BNE + - LDX #FileSelectItems_bee_bottle + LDX.w #FileSelectItems_bee_bottle JMP DrawItem + - LDX #FileSelectItems_good_bee_bottle + LDX.w #FileSelectItems_good_bee_bottle JMP DrawItem DrawPlayerFile: - LDA $1A : AND.w #$0001 : BNE .normal + LDA.b FrameCounter : AND.w #$0001 : BNE .normal JSR DrawPlayerFileShared - INC $0710 ; Suppress animated tile updates for this frame + + INC.w SkipOAM ; Suppress animated tile updates for this frame ; re-enable Stripe Image format upload on this frame ; Value loaded must match what gets set by AltBufferTable - LDA.w #$0161 : STA $1002 + LDA.w #$0161 : STA.w GFXStripes+2 + + LDA.w #$C000>>1 + XBA + STA.w GFXStripes+$0402 + + LDA.w #$C03E>>1 + XBA + STA.w GFXStripes+$0408 + + LDA.w #$C000|57 + XBA + STA.w GFXStripes+$0404 + STA.w GFXStripes+$040A + + LDA.w #$0188 ; change back to 12BF to restore the border + STA.w GFXStripes+$0406 + ORA.w #$4000 + STA.w GFXStripes+$040C + + LDA.w #$C0C6>>1 + XBA + STA.w GFXStripes+$040E + + LDA.w #$4001 + XBA + STA.w GFXStripes+$0410 + + LDA.l DisableFlashing + AND.w #$00FF + BEQ .flashing + + LDA.w #$26FE + BRA .draw_access_icon + +.flashing + LDA.w #$0188 + NOP ; 2 cycles wasted to be equal + +.draw_access_icon + STA.w GFXStripes+$0412 + LDA.w #$FFFF + STA.w GFXStripes+$0414 BRA .done .normal - STZ $0710 ; ensure core animated tile updates are not suppressed - LDA #$FFFF : STA.w $1002 ; Suppress Stripe Image format upload on this frame + STZ.w SkipOAM ; ensure core animated tile updates are not suppressed + LDA.w #$FFFF : STA.w GFXStripes+2 ; Suppress Stripe Image format upload on this frame .done - LDA.w #$0004 : STA $02 ; thing we wrote over + LDA.w #$0004 : STA.b Scrap02 ; thing we wrote over RTL @@ -132,29 +172,29 @@ DrawPlayerFileShared: LDA.b #FileSelectItems>>16 : PHA : PLB REP #$20 ; restore 16 bit accumulator - LDA ExtendedFileNameSRAM+$08 : ORA.w #!FS_COLOR_BW + LDA.l ExtendedFileNameSRAM+$08 : ORA.w #!FS_COLOR_BW %fs_draw8x16(6,5) - LDA ExtendedFileNameSRAM+$0A : ORA.w #!FS_COLOR_BW + LDA.l ExtendedFileNameSRAM+$0A : ORA.w #!FS_COLOR_BW %fs_draw8x16(6,6) - LDA ExtendedFileNameSRAM+$0C : ORA.w #!FS_COLOR_BW + LDA.l ExtendedFileNameSRAM+$0C : ORA.w #!FS_COLOR_BW %fs_draw8x16(6,7) - LDA ExtendedFileNameSRAM+$0E : ORA.w #!FS_COLOR_BW + LDA.l ExtendedFileNameSRAM+$0E : ORA.w #!FS_COLOR_BW %fs_draw8x16(6,8) - LDA ExtendedFileNameSRAM+$10 : ORA.w #!FS_COLOR_BW + LDA.l ExtendedFileNameSRAM+$10 : ORA.w #!FS_COLOR_BW %fs_draw8x16(9,5) - LDA ExtendedFileNameSRAM+$12 : ORA.w #!FS_COLOR_BW + LDA.l ExtendedFileNameSRAM+$12 : ORA.w #!FS_COLOR_BW %fs_draw8x16(9,6) - LDA ExtendedFileNameSRAM+$14 : ORA.w #!FS_COLOR_BW + LDA.l ExtendedFileNameSRAM+$14 : ORA.w #!FS_COLOR_BW %fs_draw8x16(9,7) - LDA ExtendedFileNameSRAM+$16 : ORA.w #!FS_COLOR_BW + LDA.l ExtendedFileNameSRAM+$16 : ORA.w #!FS_COLOR_BW %fs_draw8x16(9,8) JSR FileSelectDrawHudBar ; Bow LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ + - LDA EquipmentSRAM+$00 : AND.w #$00FF : BEQ ++ + LDA.l EquipmentSRAM+$00 : AND.w #$00FF : BEQ ++ %fs_drawItem(3,12,FileSelectItems_silver_bow) BRA .bow_end ++ @@ -199,7 +239,7 @@ DrawPlayerFileShared: ++ ; Mushroom - LDA.l InventoryTrackingSRAM : AND.w #$0008 : BEQ + + LDA.l InventoryTrackingSRAM : AND.w #$0028 : BEQ + %fs_drawItem(3,18,FileSelectItems_mushroom) BRA ++ + @@ -314,23 +354,40 @@ DrawPlayerFileShared: ++ ; Heart Pieces + LDA.l HUDHeartColors_index : ASL : TAX LDA.l EquipmentSRAM+$2B : AND.w #$00FF : BNE + - %fs_drawItem(9,26,FileSelectItems_heart_piece_0_of_4) - BRA ++ + LDY.w #9*$20+26*2+$1004 + LDA.w #$02C0 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0000, Y + LDA.w #$42C0 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0002, Y + LDA.w #$02D0 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0040, Y + LDA.w #$42D0 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0042, Y + JMP ++ + : DEC : BNE + - %fs_drawItem(9,26,FileSelectItems_heart_piece_1_of_4) - BRA ++ + LDY.w #9*$20+26*2+$1004 + LDA.w #$02C1 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0000, Y + LDA.w #$42C0 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0002, Y + LDA.w #$02D0 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0040, Y + LDA.w #$42D0 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0042, Y + JMP ++ + : DEC : BNE + - %fs_drawItem(9,26,FileSelectItems_heart_piece_2_of_4) - BRA ++ + LDY.w #9*$20+26*2+$1004 + LDA.w #$02C1 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0000, Y + LDA.w #$42C0 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0002, Y + LDA.w #$02D1 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0040, Y + LDA.w #$42D0 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0042, Y + JMP ++ + - %fs_drawItem(9,26,FileSelectItems_heart_piece_3_of_4) + LDY.w #9*$20+26*2+$1004 + LDA.w #$02C1 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0000, Y + LDA.w #$42C1 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0002, Y + LDA.w #$02D1 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0040, Y + LDA.w #$42D0 : ORA.l HUDHeartColors_masks_file_select,X : STA.w $0042, Y ++ - LDA EquipmentSRAM+$0108 : AND.w #$00FF - JSL.l HexToDec - LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(11,26) - LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(11,27) + LDA.l EquipmentSRAM+$0130 : AND.w #$00FF + JSL HexToDec + LDA.l HexToDecDigit4 : AND.w #$00FF : ORA.w #!FS_COLOR_BW|$02E0 : %fs_draw8x8(11,26) + LDA.l HexToDecDigit5 : AND.w #$00FF : ORA.w #!FS_COLOR_BW|$02E0 : %fs_draw8x8(11,27) ; Boots %fs_drawItemBasic(EquipmentSRAM+$15,3,28,FileSelectItems_boots) @@ -353,21 +410,21 @@ DrawPlayerFileShared: %fs_drawItemBasic(EquipmentSRAM+$17,9,28,FileSelectItems_pearl) ; Pendants - LDA EquipmentSRAM+$34 : AND.w #$0004 : BEQ + + LDA.l EquipmentSRAM+$34 : AND.w #$0004 : BEQ + %fs_drawItem(12,12,FileSelectItems_green_pendant) BRA ++ + %fs_drawItem(12,12,FileSelectItems_no_pendant) ++ - LDA EquipmentSRAM+$34 : AND.w #$0002 : BEQ + + LDA.l EquipmentSRAM+$34 : AND.w #$0002 : BEQ + %fs_drawItem(12,14,FileSelectItems_blue_pendant) BRA ++ + %fs_drawItem(12,14,FileSelectItems_no_pendant) ++ - LDA EquipmentSRAM+$34 : AND.w #$0001 : BEQ + + LDA.l EquipmentSRAM+$34 : AND.w #$0001 : BEQ + %fs_drawItem(12,16,FileSelectItems_red_pendant) BRA ++ + @@ -375,53 +432,53 @@ DrawPlayerFileShared: ++ ; Crystals - LDA EquipmentSRAM+$3A : AND.w #$0002 : BEQ + - LDA.w #$0297|!FS_COLOR_BLUE + LDA.l EquipmentSRAM+$3A : AND.w #$0002 : BEQ + + LDA.w #$02D7|!FS_COLOR_BLUE BRA ++ + - LDA.w #$0287|!FS_COLOR_GRAY + LDA.w #$02C7|!FS_COLOR_GRAY ++ : %fs_draw16x8(13,18) - LDA EquipmentSRAM+$3A : AND.w #$0010 : BEQ + - LDA.w #$0297|!FS_COLOR_BLUE + LDA.l EquipmentSRAM+$3A : AND.w #$0010 : BEQ + + LDA.w #$02D7|!FS_COLOR_BLUE BRA ++ + - LDA.w #$0287|!FS_COLOR_GRAY + LDA.w #$02C7|!FS_COLOR_GRAY ++ : %fs_draw16x8(12,19) - LDA EquipmentSRAM+$3A : AND.w #$0040 : BEQ + - LDA.w #$0297|!FS_COLOR_BLUE + LDA.l EquipmentSRAM+$3A : AND.w #$0040 : BEQ + + LDA.w #$02D7|!FS_COLOR_BLUE BRA ++ + - LDA.w #$0287|!FS_COLOR_GRAY + LDA.w #$02C7|!FS_COLOR_GRAY ++ : %fs_draw16x8(13,20) - LDA EquipmentSRAM+$3A : AND.w #$0020 : BEQ + - LDA.w #$0297|!FS_COLOR_BLUE + LDA.l EquipmentSRAM+$3A : AND.w #$0020 : BEQ + + LDA.w #$02D7|!FS_COLOR_BLUE BRA ++ + - LDA.w #$0287|!FS_COLOR_GRAY + LDA.w #$02C7|!FS_COLOR_GRAY ++ : %fs_draw16x8(12,21) - LDA EquipmentSRAM+$3A : AND.w #$0004 : BEQ + - LDA.w #$0297|!FS_COLOR_RED + LDA.l EquipmentSRAM+$3A : AND.w #$0004 : BEQ + + LDA.w #$02D7|!FS_COLOR_RED BRA ++ + - LDA.w #$0287|!FS_COLOR_GRAY + LDA.w #$02C7|!FS_COLOR_GRAY ++ : %fs_draw16x8(13,22) - LDA EquipmentSRAM+$3A : AND.w #$0001 : BEQ + - LDA.w #$0297|!FS_COLOR_RED + LDA.l EquipmentSRAM+$3A : AND.w #$0001 : BEQ + + LDA.w #$02D7|!FS_COLOR_RED BRA ++ + - LDA.w #$0287|!FS_COLOR_GRAY + LDA.w #$02C7|!FS_COLOR_GRAY ++ : %fs_draw16x8(12,23) - LDA EquipmentSRAM+$3A : AND.w #$0008 : BEQ + - LDA.w #$0297|!FS_COLOR_BLUE + LDA.l EquipmentSRAM+$3A : AND.w #$0008 : BEQ + + LDA.w #$02D7|!FS_COLOR_BLUE BRA ++ + - LDA.w #$0287|!FS_COLOR_GRAY + LDA.w #$02C7|!FS_COLOR_GRAY ++ : %fs_draw16x8(13,24) @@ -431,231 +488,221 @@ RTS FileSelectItems: .empty_bow ;for an eventual update for retro mode - dw #$0201|!FS_COLOR_YELLOW, #$02B8|!FS_COLOR_YELLOW, #$02B7|!FS_COLOR_YELLOW, #$0212|!FS_COLOR_YELLOW + dw #$0241|!FS_COLOR_YELLOW, #$02F8|!FS_COLOR_YELLOW, #$02F7|!FS_COLOR_YELLOW, #$0252|!FS_COLOR_YELLOW .bow - dw #$0201|!FS_COLOR_YELLOW, #$0202|!FS_COLOR_YELLOW, #$0211|!FS_COLOR_YELLOW, #$0212|!FS_COLOR_YELLOW + dw #$0241|!FS_COLOR_YELLOW, #$0242|!FS_COLOR_YELLOW, #$0251|!FS_COLOR_YELLOW, #$0252|!FS_COLOR_YELLOW .silver_bow - dw #$0201|!FS_COLOR_YELLOW, #$0204|!FS_COLOR_YELLOW, #$0203|!FS_COLOR_RED, #$0212|!FS_COLOR_YELLOW + dw #$0241|!FS_COLOR_YELLOW, #$0244|!FS_COLOR_YELLOW, #$0243|!FS_COLOR_RED, #$0252|!FS_COLOR_YELLOW .regular_arrow ;for an eventual update for retro mode - dw #$0200|!FS_COLOR_YELLOW, #$02BA|!FS_COLOR_YELLOW, #$02B9|!FS_COLOR_RED, #$0200|!FS_COLOR_YELLOW + dw #$0240|!FS_COLOR_YELLOW, #$02FA|!FS_COLOR_YELLOW, #$02F9|!FS_COLOR_RED, #$0240|!FS_COLOR_YELLOW .silver_arrow - dw #$0200|!FS_COLOR_YELLOW, #$0214|!FS_COLOR_YELLOW, #$0213|!FS_COLOR_RED, #$0200|!FS_COLOR_YELLOW + dw #$0240|!FS_COLOR_YELLOW, #$0254|!FS_COLOR_YELLOW, #$0253|!FS_COLOR_RED, #$0240|!FS_COLOR_YELLOW .blue_boomerang - dw #$0205|!FS_COLOR_BLUE, #$0206|!FS_COLOR_BLUE, #$0200|!FS_COLOR_BW, #$0216|!FS_COLOR_BLUE + dw #$0245|!FS_COLOR_BLUE, #$0246|!FS_COLOR_BLUE, #$0240|!FS_COLOR_BW, #$0256|!FS_COLOR_BLUE .red_boomerang - dw #$0205|!FS_COLOR_RED, #$0206|!FS_COLOR_RED, #$0200|!FS_COLOR_BW, #$0216|!FS_COLOR_RED + dw #$0245|!FS_COLOR_RED, #$0246|!FS_COLOR_RED, #$0240|!FS_COLOR_BW, #$0256|!FS_COLOR_RED .both_boomerang - dw #$02B6|!FS_COLOR_BLUE, #$02B6|!FS_COLOR_RED, #$02B6|!FS_COLOR_BLUE|!FS_VFLIP, #$02B6|!FS_COLOR_RED|!FS_VFLIP + dw #$02F6|!FS_COLOR_BLUE, #$02F6|!FS_COLOR_RED, #$02F6|!FS_COLOR_BLUE|!FS_VFLIP, #$02F6|!FS_COLOR_RED|!FS_VFLIP .hookshot - dw #$0200|!FS_COLOR_RED, #$0215|!FS_COLOR_RED, #$0230|!FS_COLOR_RED, #$0200|!FS_COLOR_BW + dw #$0240|!FS_COLOR_RED, #$0255|!FS_COLOR_RED, #$0270|!FS_COLOR_RED, #$0240|!FS_COLOR_BW .bombs - dw #$020C|!FS_COLOR_BLUE, #$020D|!FS_COLOR_BLUE, #$021C|!FS_COLOR_BLUE, #$021C|!FS_COLOR_BLUE|!FS_HFLIP + dw #$024C|!FS_COLOR_BLUE, #$024D|!FS_COLOR_BLUE, #$025C|!FS_COLOR_BLUE, #$025C|!FS_COLOR_BLUE|!FS_HFLIP .fire_rod - dw #$0220|!FS_COLOR_RED, #$0210|!FS_COLOR_RED, #$0230|!FS_COLOR_RED, #$0231|!FS_COLOR_RED + dw #$0260|!FS_COLOR_RED, #$0250|!FS_COLOR_RED, #$0270|!FS_COLOR_RED, #$0271|!FS_COLOR_RED .ice_rod - dw #$0220|!FS_COLOR_BLUE, #$0221|!FS_COLOR_BLUE, #$0230|!FS_COLOR_BLUE, #$0231|!FS_COLOR_BLUE + dw #$0260|!FS_COLOR_BLUE, #$0261|!FS_COLOR_BLUE, #$0270|!FS_COLOR_BLUE, #$0271|!FS_COLOR_BLUE .bombos - dw #$0207|!FS_COLOR_YELLOW, #$0217|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0217|!FS_COLOR_YELLOW, #$0207|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP + dw #$0247|!FS_COLOR_YELLOW, #$0257|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0257|!FS_COLOR_YELLOW, #$0247|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP .ether - dw #$0208|!FS_COLOR_YELLOW, #$0218|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0218|!FS_COLOR_YELLOW, #$0208|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP + dw #$0248|!FS_COLOR_YELLOW, #$0258|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0258|!FS_COLOR_YELLOW, #$0248|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP .quake - dw #$0209|!FS_COLOR_YELLOW, #$0219|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0219|!FS_COLOR_YELLOW, #$0209|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP + dw #$0249|!FS_COLOR_YELLOW, #$0259|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0259|!FS_COLOR_YELLOW, #$0249|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP .lamp - dw #$022C|!FS_COLOR_RED, #$022C|!FS_COLOR_RED|!FS_HFLIP, #$023C|!FS_COLOR_RED, #$023D|!FS_COLOR_RED + dw #$026C|!FS_COLOR_RED, #$026C|!FS_COLOR_RED|!FS_HFLIP, #$027C|!FS_COLOR_RED, #$027D|!FS_COLOR_RED .hammer - dw #$0222|!FS_COLOR_BROWN, #$0223|!FS_COLOR_BROWN, #$0232|!FS_COLOR_BROWN, #$0233|!FS_COLOR_BROWN + dw #$0262|!FS_COLOR_BROWN, #$0263|!FS_COLOR_BROWN, #$0272|!FS_COLOR_BROWN, #$0273|!FS_COLOR_BROWN .bugnet - dw #$0228|!FS_COLOR_YELLOW, #$0229|!FS_COLOR_YELLOW, #$0238|!FS_COLOR_YELLOW, #$0239|!FS_COLOR_YELLOW + dw #$0268|!FS_COLOR_YELLOW, #$0269|!FS_COLOR_YELLOW, #$0278|!FS_COLOR_YELLOW, #$0279|!FS_COLOR_YELLOW .shovel - dw #$0224|!FS_COLOR_BROWN, #$0225|!FS_COLOR_BROWN, #$0234|!FS_COLOR_BROWN, #$0235|!FS_COLOR_BROWN + dw #$0264|!FS_COLOR_BROWN, #$0265|!FS_COLOR_BROWN, #$0274|!FS_COLOR_BROWN, #$0275|!FS_COLOR_BROWN .flute - dw #$0226|!FS_COLOR_BLUE, #$0227|!FS_COLOR_BLUE, #$0236|!FS_COLOR_BLUE, #$0237|!FS_COLOR_BLUE + dw #$0266|!FS_COLOR_BLUE, #$0267|!FS_COLOR_BLUE, #$0276|!FS_COLOR_BLUE, #$0277|!FS_COLOR_BLUE .book - dw #$022A|!FS_COLOR_GREEN, #$022B|!FS_COLOR_GREEN, #$023A|!FS_COLOR_GREEN, #$023B|!FS_COLOR_GREEN + dw #$026A|!FS_COLOR_GREEN, #$026B|!FS_COLOR_GREEN, #$027A|!FS_COLOR_GREEN, #$027B|!FS_COLOR_GREEN .redcane - dw #$021D|!FS_COLOR_RED, #$021E|!FS_COLOR_RED, #$022D|!FS_COLOR_RED, #$022E|!FS_COLOR_RED + dw #$025D|!FS_COLOR_RED, #$025E|!FS_COLOR_RED, #$026D|!FS_COLOR_RED, #$026E|!FS_COLOR_RED .bluecane - dw #$021D|!FS_COLOR_BLUE, #$021E|!FS_COLOR_BLUE, #$022D|!FS_COLOR_BLUE, #$022E|!FS_COLOR_BLUE + dw #$025D|!FS_COLOR_BLUE, #$025E|!FS_COLOR_BLUE, #$026D|!FS_COLOR_BLUE, #$026E|!FS_COLOR_BLUE .cape - dw #$0248|!FS_COLOR_RED, #$0249|!FS_COLOR_RED, #$0258|!FS_COLOR_RED, #$0259|!FS_COLOR_RED + dw #$0288|!FS_COLOR_RED, #$0289|!FS_COLOR_RED, #$0298|!FS_COLOR_RED, #$0299|!FS_COLOR_RED .mirror - dw #$024A|!FS_COLOR_BLUE, #$024B|!FS_COLOR_BLUE, #$025A|!FS_COLOR_BLUE, #$025B|!FS_COLOR_BLUE + dw #$028A|!FS_COLOR_BLUE, #$028B|!FS_COLOR_BLUE, #$029A|!FS_COLOR_BLUE, #$029B|!FS_COLOR_BLUE .flippers - dw #$020E|!FS_COLOR_BLUE, #$020F|!FS_COLOR_BLUE, #$021F|!FS_COLOR_BLUE|!FS_HFLIP, #$021F|!FS_COLOR_BLUE + dw #$024E|!FS_COLOR_BLUE, #$024F|!FS_COLOR_BLUE, #$025F|!FS_COLOR_BLUE|!FS_HFLIP, #$025F|!FS_COLOR_BLUE .boots - dw #$024C|!FS_COLOR_BOOTS, #$024D|!FS_COLOR_BOOTS, #$025C|!FS_COLOR_BOOTS, #$025D|!FS_COLOR_BOOTS + dw #$028C|!FS_COLOR_BOOTS, #$028D|!FS_COLOR_BOOTS, #$029C|!FS_COLOR_BOOTS, #$029D|!FS_COLOR_BOOTS .pearl - dw #$0264|!FS_COLOR_RED, #$0265|!FS_COLOR_RED, #$0274|!FS_COLOR_RED, #$0275|!FS_COLOR_RED + dw #$02A4|!FS_COLOR_RED, #$02A5|!FS_COLOR_RED, #$02B4|!FS_COLOR_RED, #$02B5|!FS_COLOR_RED .no_pendant - dw #$0285|!FS_COLOR_GRAY, #$0286|!FS_COLOR_GRAY, #$02B2|!FS_COLOR_GRAY, #$0296|!FS_COLOR_GRAY + dw #$02C5|!FS_COLOR_GRAY, #$02C6|!FS_COLOR_GRAY, #$02F2|!FS_COLOR_GRAY, #$02D6|!FS_COLOR_GRAY .green_pendant - dw #$0285|!FS_COLOR_GREEN, #$0286|!FS_COLOR_GREEN, #$0295|!FS_COLOR_GREEN, #$0296|!FS_COLOR_GREEN + dw #$02C5|!FS_COLOR_GREEN, #$02C6|!FS_COLOR_GREEN, #$02D5|!FS_COLOR_GREEN, #$02D6|!FS_COLOR_GREEN .blue_pendant - dw #$0285|!FS_COLOR_BLUE, #$0286|!FS_COLOR_BLUE, #$0295|!FS_COLOR_BLUE, #$0296|!FS_COLOR_BLUE + dw #$02C5|!FS_COLOR_BLUE, #$02C6|!FS_COLOR_BLUE, #$02D5|!FS_COLOR_BLUE, #$02D6|!FS_COLOR_BLUE .red_pendant - dw #$0285|!FS_COLOR_RED, #$0286|!FS_COLOR_RED, #$0295|!FS_COLOR_RED, #$0296|!FS_COLOR_RED + dw #$02C5|!FS_COLOR_RED, #$02C6|!FS_COLOR_RED, #$02D5|!FS_COLOR_RED, #$02D6|!FS_COLOR_RED .gloves - dw #$024E|!FS_COLOR_BROWN, #$024F|!FS_COLOR_BROWN, #$025E|!FS_COLOR_BROWN, #$025F|!FS_COLOR_BROWN + dw #$028E|!FS_COLOR_BROWN, #$028F|!FS_COLOR_BROWN, #$029E|!FS_COLOR_BROWN, #$029F|!FS_COLOR_BROWN .mitts - dw #$0260|!FS_COLOR_YELLOW, #$0261|!FS_COLOR_YELLOW, #$0270|!FS_COLOR_YELLOW, #$0271|!FS_COLOR_YELLOW + dw #$02A0|!FS_COLOR_YELLOW, #$02A1|!FS_COLOR_YELLOW, #$02B0|!FS_COLOR_YELLOW, #$02B1|!FS_COLOR_YELLOW .mushroom - dw #$0262|!FS_COLOR_RED, #$0263|!FS_COLOR_RED, #$0272|!FS_COLOR_RED, #$0273|!FS_COLOR_RED + dw #$02A2|!FS_COLOR_RED, #$02A3|!FS_COLOR_RED, #$02B2|!FS_COLOR_RED, #$02B3|!FS_COLOR_RED .powder - dw #$020A|!FS_COLOR_BROWN, #$020B|!FS_COLOR_BROWN, #$021A|!FS_COLOR_BROWN, #$021B|!FS_COLOR_BROWN + dw #$024A|!FS_COLOR_BROWN, #$024B|!FS_COLOR_BROWN, #$025A|!FS_COLOR_BROWN, #$025B|!FS_COLOR_BROWN .fighters_sword - dw #$0266|!FS_COLOR_BLUE, #$0267|!FS_COLOR_BLUE, #$0276|!FS_COLOR_BLUE, #$0277|!FS_COLOR_BLUE + dw #$02A6|!FS_COLOR_BLUE, #$02A7|!FS_COLOR_BLUE, #$02B6|!FS_COLOR_BLUE, #$02B7|!FS_COLOR_BLUE .master_sword - dw #$0268|!FS_COLOR_BLUE, #$0269|!FS_COLOR_BLUE, #$0278|!FS_COLOR_RED, #$0279|!FS_COLOR_BLUE + dw #$02A8|!FS_COLOR_BLUE, #$02A9|!FS_COLOR_BLUE, #$02B8|!FS_COLOR_RED, #$02B9|!FS_COLOR_BLUE .tempered_sword - dw #$0268|!FS_COLOR_RED, #$0269|!FS_COLOR_RED, #$0278|!FS_COLOR_GREEN, #$026A|!FS_COLOR_RED + dw #$02A8|!FS_COLOR_RED, #$02A9|!FS_COLOR_RED, #$02B8|!FS_COLOR_GREEN, #$02AA|!FS_COLOR_RED .gold_sword - dw #$0268|!FS_COLOR_YELLOW, #$0269|!FS_COLOR_YELLOW, #$0278|!FS_COLOR_BLUE, #$027A|!FS_COLOR_YELLOW + dw #$02A8|!FS_COLOR_YELLOW, #$02A9|!FS_COLOR_YELLOW, #$02B8|!FS_COLOR_BLUE, #$02BA|!FS_COLOR_YELLOW .fighters_shield - dw #$026B|!FS_COLOR_BLUE, #$026B|!FS_COLOR_BLUE|!FS_HFLIP, #$027B|!FS_COLOR_BLUE, #$027B|!FS_COLOR_BLUE|!FS_HFLIP + dw #$02AB|!FS_COLOR_BLUE, #$02AB|!FS_COLOR_BLUE|!FS_HFLIP, #$02BB|!FS_COLOR_BLUE, #$02BB|!FS_COLOR_BLUE|!FS_HFLIP .fire_shield - dw #$026C|!FS_COLOR_BOOTS, #$026C|!FS_COLOR_BOOTS|!FS_HFLIP, #$027C|!FS_COLOR_BOOTS, #$027C|!FS_COLOR_BOOTS|!FS_HFLIP + dw #$02AC|!FS_COLOR_BOOTS, #$02AC|!FS_COLOR_BOOTS|!FS_HFLIP, #$02BC|!FS_COLOR_BOOTS, #$02BC|!FS_COLOR_BOOTS|!FS_HFLIP .mirror_shield - dw #$026D|!FS_COLOR_YELLOW, #$026E|!FS_COLOR_YELLOW, #$027D|!FS_COLOR_YELLOW, #$027E|!FS_COLOR_YELLOW + dw #$02AD|!FS_COLOR_YELLOW, #$02AE|!FS_COLOR_YELLOW, #$02BD|!FS_COLOR_YELLOW, #$02BE|!FS_COLOR_YELLOW .green_mail - dw #$026F|!FS_COLOR_GREEN, #$026F|!FS_COLOR_GREEN|!FS_HFLIP, #$027F|!FS_COLOR_GREEN, #$02B3|!FS_COLOR_GREEN + dw #$02AF|!FS_COLOR_GREEN, #$02AF|!FS_COLOR_GREEN|!FS_HFLIP, #$02BF|!FS_COLOR_GREEN, #$02F3|!FS_COLOR_GREEN .blue_mail - dw #$026F|!FS_COLOR_BLUE, #$026F|!FS_COLOR_BLUE|!FS_HFLIP, #$027F|!FS_COLOR_BLUE, #$02B4|!FS_COLOR_BLUE + dw #$02AF|!FS_COLOR_BLUE, #$02AF|!FS_COLOR_BLUE|!FS_HFLIP, #$02BF|!FS_COLOR_BLUE, #$02F4|!FS_COLOR_BLUE .red_mail - dw #$026F|!FS_COLOR_RED, #$026F|!FS_COLOR_RED|!FS_HFLIP, #$027F|!FS_COLOR_RED, #$02B5|!FS_COLOR_RED - - .heart_piece_0_of_4 - dw #$0280|!FS_COLOR_RED, #$0280|!FS_COLOR_RED|!FS_HFLIP, #$0290|!FS_COLOR_RED, #$0290|!FS_COLOR_RED|!FS_HFLIP - .heart_piece_1_of_4 - dw #$0281|!FS_COLOR_RED, #$0280|!FS_COLOR_RED|!FS_HFLIP, #$0290|!FS_COLOR_RED, #$0290|!FS_COLOR_RED|!FS_HFLIP - .heart_piece_2_of_4 - dw #$0281|!FS_COLOR_RED, #$0280|!FS_COLOR_RED|!FS_HFLIP, #$0291|!FS_COLOR_RED, #$0290|!FS_COLOR_RED|!FS_HFLIP - .heart_piece_3_of_4 - dw #$0281|!FS_COLOR_RED, #$0281|!FS_COLOR_RED|!FS_HFLIP, #$0291|!FS_COLOR_RED, #$0290|!FS_COLOR_RED|!FS_HFLIP + dw #$02AF|!FS_COLOR_RED, #$02AF|!FS_COLOR_RED|!FS_HFLIP, #$02BF|!FS_COLOR_RED, #$02F5|!FS_COLOR_RED .empty_bottle - dw #$0240|!FS_COLOR_BW, #$0241|!FS_COLOR_BW, #$0250|!FS_COLOR_BW, #$0251|!FS_COLOR_BW + dw #$0280|!FS_COLOR_BW, #$0281|!FS_COLOR_BW, #$0290|!FS_COLOR_BW, #$0291|!FS_COLOR_BW .red_potion - dw #$0242|!FS_COLOR_RED, #$0242|!FS_COLOR_RED|!FS_HFLIP, #$0252|!FS_COLOR_RED, #$0243|!FS_COLOR_RED + dw #$0282|!FS_COLOR_RED, #$0282|!FS_COLOR_RED|!FS_HFLIP, #$0292|!FS_COLOR_RED, #$0283|!FS_COLOR_RED .green_potion - dw #$0242|!FS_COLOR_GREEN, #$0242|!FS_COLOR_GREEN|!FS_HFLIP, #$0252|!FS_COLOR_GREEN, #$0244|!FS_COLOR_GREEN + dw #$0282|!FS_COLOR_GREEN, #$0282|!FS_COLOR_GREEN|!FS_HFLIP, #$0292|!FS_COLOR_GREEN, #$0284|!FS_COLOR_GREEN .blue_potion - dw #$0242|!FS_COLOR_BLUE, #$0242|!FS_COLOR_BLUE|!FS_HFLIP, #$0252|!FS_COLOR_BLUE, #$0245|!FS_COLOR_BLUE + dw #$0282|!FS_COLOR_BLUE, #$0282|!FS_COLOR_BLUE|!FS_HFLIP, #$0292|!FS_COLOR_BLUE, #$0285|!FS_COLOR_BLUE .fairy_bottle - dw #$0247|!FS_COLOR_YELLOW|!FS_HFLIP, #$0247|!FS_COLOR_YELLOW, #$0256|!FS_COLOR_BLUE, #$0257|!FS_COLOR_BLUE + dw #$0287|!FS_COLOR_YELLOW|!FS_HFLIP, #$0287|!FS_COLOR_YELLOW, #$0296|!FS_COLOR_BLUE, #$0297|!FS_COLOR_BLUE .bee_bottle - dw #$0240|!FS_COLOR_BW, #$0241|!FS_COLOR_BW, #$0254|!FS_COLOR_YELLOW, #$0255|!FS_COLOR_YELLOW + dw #$0280|!FS_COLOR_BW, #$0281|!FS_COLOR_BW, #$0294|!FS_COLOR_YELLOW, #$0295|!FS_COLOR_YELLOW .good_bee_bottle - dw #$0240|!FS_COLOR_BW, #$0241|!FS_COLOR_BW, #$0254|!FS_COLOR_YELLOW, #$0246|!FS_COLOR_YELLOW + dw #$0280|!FS_COLOR_BW, #$0281|!FS_COLOR_BW, #$0294|!FS_COLOR_YELLOW, #$0286|!FS_COLOR_YELLOW ;-------------------------------------------------------------------------------- FileSelectDrawHudBar: - LDA #$029B|!FS_COLOR_GREEN : %fs_draw16x8(0,10) - LDA EquipmentSRAM+$22 - JSL.l HexToDec - LDA $7F5004 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,9) - LDA $7F5005 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,10) - LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,11) - LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,12) + LDA.w #$02DB|!FS_COLOR_GREEN : %fs_draw16x8(0,10) + LDA.l DisplayRupeesSRAM + JSL HUDHex4Digit_Long + LDA.b Scrap04 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,9) + LDA.b Scrap05 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,10) + LDA.b Scrap06 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,11) + LDA.b Scrap07 : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,12) - LDA #$028B|!FS_COLOR_BLUE : %fs_draw16x8(0,14) - LDA EquipmentSRAM+$03 : AND.w #$00FF - JSL.l HexToDec - LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,14) - LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,15) + LDA.w #$02CB|!FS_COLOR_BLUE : %fs_draw16x8(0,14) + LDA.l BombsEquipmentSRAM : AND.w #$00FF + JSL HUDHex2Digit_Long + TYA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,14) + TXA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,15) - LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ + - LDA #$0299|!FS_COLOR_RED : %fs_draw16x8(0,17) - BRA ++ - + - LDA #$0289|!FS_COLOR_BROWN : %fs_draw16x8(0,17) - ++ - LDA EquipmentSRAM+$37 : AND.w #$00FF - JSL.l HexToDec - LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,17) - LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,18) + LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ + + LDA.w #$02D9|!FS_COLOR_RED : %fs_draw16x8(0,17) + BRA ++ + + + LDA.w #$02C9|!FS_COLOR_BROWN : %fs_draw16x8(0,17) + ++ + LDA.l CurrentArrowsSRAM : AND.w #$00FF + JSL HUDHex2Digit_Long + TYA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,17) + TXA : AND.w #$00FF : !ADD.w #$0250+!FS_COLOR_BW : %fs_draw8x8(1,18) RTS ;-------------------------------------------------------------------------------- AltBufferTable: - LDA.b #$02 : STA $210c ; Have Screen 3 use same tile area as screens 1 + LDA.b #$02 : STA.w BG34NBA ; Have Screen 3 use same tile area as screens 1 .noScreen3Change REP #$20 LDX.w #$0400 ; 14 rows with 64 bytes (30 tiles * 2 + 4 byte header) ;fill with the blank character LDA.w #$0188 - - STA $1000, X + STA.w GFXStripes, X DEX : DEX : BNE - ; set vram offsets - LDA.w #$0161 : STA $1002 ;file 1 top row - LDA.w #$2161 : STA $1042 ;file 1 bottom row + LDA.w #$0161 : STA.w GFXStripes+$02 ;file 1 top row + LDA.w #$2161 : STA.w GFXStripes+$42 ;file 1 bottom row - LDA.w #$4161 : STA $1082 ;gap row top - LDA.w #$6161 : STA $10C2 ;gap row bottom + LDA.w #$4161 : STA.w GFXStripes+$82 ;gap row top + LDA.w #$6161 : STA.w GFXStripes+$C2 ;gap row bottom - LDA.w #$8161 : STA $1102 ;file 2 top row - LDA.w #$A161 : STA $1142 ;file 2 bottom row + LDA.w #$8161 : STA.w GFXStripes+$0102 ;file 2 top row + LDA.w #$A161 : STA.w GFXStripes+$0142 ;file 2 bottom row - LDA.w #$C161 : STA $1182 ;gap row top - LDA.w #$E161 : STA $11c2 ;gap row bottom + LDA.w #$C161 : STA.w GFXStripes+$0182 ;gap row top + LDA.w #$E161 : STA.w GFXStripes+$01C2 ;gap row bottom - LDA.w #$0162 : STA $1202 ;file 3 top row - LDA.w #$2162 : STA $1242 ;file 3 bottom row + LDA.w #$0162 : STA.w GFXStripes+$0202 ;file 3 top row + LDA.w #$2162 : STA.w GFXStripes+$0242 ;file 3 bottom row - LDA.w #$4162 : STA $1282 ;extra gap row top - LDA.w #$6162 : STA $12c2 ;extra gap row bottom + LDA.w #$4162 : STA.w GFXStripes+$0282 ;extra gap row top + LDA.w #$6162 : STA.w GFXStripes+$02C2 ;extra gap row bottom - LDA.w #$8162 : STA $1302 ;extra gap row top - LDA.w #$A162 : STA $1342 ;extra gap row bottom + LDA.w #$8162 : STA.w GFXStripes+$0302 ;extra gap row top + LDA.w #$A162 : STA.w GFXStripes+$0342 ;extra gap row bottom - LDA.w #$C162 : STA $1382 ;extra gap row top - LDA.w #$E162 : STA $13C2 ;extra gap row bottom + LDA.w #$C162 : STA.w GFXStripes+$0382 ;extra gap row top + LDA.w #$E162 : STA.w GFXStripes+$03C2 ;extra gap row bottom ; set lengths LDA.w #$3B00 - STA $1004 ;file 1 top row - STA $1044 ;file 1 bottom row - STA $1084 ;gap row top - STA $10C4 ;gap row bottom - STA $1104 ;file 2 top row - STA $1144 ;file 2 bottom row - STA $1184 ;gap row top - STA $11C4 ;gap row bottom - STA $1204 ;file 3 top row - STA $1244 ;file 3 bottom row - STA $1284 ;extra gap row top - STA $12C4 ;extra gap row bottom - STA $1304 ;extra gap row top - STA $1344 ;extra gap row bottom - STA $1384 ;extra gap row top - STA $13C4 ;extra gap row bottom + STA.w GFXStripes+$04 ;file 1 top row + STA.w GFXStripes+$44 ;file 1 bottom row + STA.w GFXStripes+$84 ;gap row top + STA.w GFXStripes+$C4 ;gap row bottom + STA.w GFXStripes+$0104 ;file 2 top row + STA.w GFXStripes+$0144 ;file 2 bottom row + STA.w GFXStripes+$0184 ;gap row top + STA.w GFXStripes+$01C4 ;gap row bottom + STA.w GFXStripes+$0204 ;file 3 top row + STA.w GFXStripes+$0244 ;file 3 bottom row + STA.w GFXStripes+$0284 ;extra gap row top + STA.w GFXStripes+$02C4 ;extra gap row bottom + STA.w GFXStripes+$0304 ;extra gap row top + STA.w GFXStripes+$0344 ;extra gap row bottom + STA.w GFXStripes+$0384 ;extra gap row top + STA.w GFXStripes+$03C4 ;extra gap row bottom ; Set last packet marker - LDA.w #$00FF : STA $1402 + LDA.w #$00FF : STA.w GFXStripes+$0402 ; Draw Unlock option if applicable - LDA $10 : AND.w #$00FF : CMP.w #$0001 : BNE + - LDA.l IsEncrypted : AND.w #$00FF : CMP.w #$0002 : BNE + - PHP : SEP #$30 : PHX : PHY : JSL ValidatePassword : PLY : PLX : PLP - AND.w #$00FF : BNE + - LDA.w #!FSTILE_U_TOP : %fs_draw8x16(14,5) - LDA.w #!FSTILE_N_TOP : %fs_draw8x16(14,6) - LDA.w #!FSTILE_L_TOP : %fs_draw8x16(14,7) - LDA.w #!FSTILE_O_TOP : %fs_draw8x16(14,8) - LDA.w #!FSTILE_C_TOP : %fs_draw8x16(14,9) - LDA.w #!FSTILE_K_TOP : %fs_draw8x16(14,10) - + - - SEP #$20 + LDA.b GameMode : AND.w #$00FF : CMP.w #$0001 : BNE + + LDA.l IsEncrypted : AND.w #$00FF : CMP.w #$0002 : BNE + + PHP : SEP #$30 : PHX : PHY : JSL ValidatePassword : PLY : PLX : PLP + AND.w #$00FF : BNE + + LDA.w #!FSTILE_U_TOP : %fs_draw8x16(14,5) + LDA.w #!FSTILE_N_TOP : %fs_draw8x16(14,6) + LDA.w #!FSTILE_L_TOP : %fs_draw8x16(14,7) + LDA.w #!FSTILE_O_TOP : %fs_draw8x16(14,8) + LDA.w #!FSTILE_C_TOP : %fs_draw8x16(14,9) + LDA.w #!FSTILE_K_TOP : %fs_draw8x16(14,10) + + + SEP #$20 RTL ;-------------------------------------------------------------------------------- @@ -663,36 +710,36 @@ AltBufferTable_credits: JSL AltBufferTable_noScreen3Change REP #$20 - LDA.w #$6168 : STA $1002 ;file 1 top row - LDA.w #$8168 : STA $1042 ;file 1 bottom row + LDA.w #$6168 : STA.w GFXStripes+$02 ;file 1 top row + LDA.w #$8168 : STA.w GFXStripes+$42 ;file 1 bottom row - LDA.w #$A168 : STA $1082 ;gap row top - LDA.w #$C168 : STA $10C2 ;gap row bottom + LDA.w #$A168 : STA.w GFXStripes+$82 ;gap row top + LDA.w #$C168 : STA.w GFXStripes+$C2 ;gap row bottom - LDA.w #$E168 : STA $1102 ;file 2 top row - LDA.w #$0169 : STA $1142 ;file 2 bottom row + LDA.w #$E168 : STA.w GFXStripes+$0102 ;file 2 top row + LDA.w #$0169 : STA.w GFXStripes+$0142 ;file 2 bottom row - LDA.w #$2169 : STA $1182 ;gap row top - LDA.w #$4169 : STA $11c2 ;gap row bottom + LDA.w #$2169 : STA.w GFXStripes+$0182 ;gap row top + LDA.w #$4169 : STA.w GFXStripes+$01c2 ;gap row bottom - LDA.w #$6169 : STA $1202 ;file 3 top row - LDA.w #$8169 : STA $1242 ;file 3 bottom row + LDA.w #$6169 : STA.w GFXStripes+$0202 ;file 3 top row + LDA.w #$8169 : STA.w GFXStripes+$0242 ;file 3 bottom row - LDA.w #$A169 : STA $1282 ;extra gap row top - LDA.w #$C169 : STA $12c2 ;extra gap row bottom + LDA.w #$A169 : STA.w GFXStripes+$0282 ;extra gap row top + LDA.w #$C169 : STA.w GFXStripes+$02C2 ;extra gap row bottom - LDA.w #$E169 : STA $1302 ;extra gap row top - LDA.w #$016A : STA $1342 ;extra gap row bottom + LDA.w #$E169 : STA.w GFXStripes+$0302 ;extra gap row top + LDA.w #$016A : STA.w GFXStripes+$0342 ;extra gap row bottom - LDA.w #$216A : STA $1382 ;extra gap row top - LDA.w #$416A : STA $13C2 ;extra gap row bottom + LDA.w #$216A : STA.w GFXStripes+$0382 ;extra gap row top + LDA.w #$416A : STA.w GFXStripes+$03C2 ;extra gap row bottom SEP #$20 RTL ;-------------------------------------------------------------------------------- macro LayoutPriority(address) LDX.w #$003C -- : LDA.w
, X : ORA #$2000 : STA.w
, X +- : LDA.w
, X : ORA.w #$2000 : STA.w
, X DEX : DEX : BNE - endmacro @@ -717,52 +764,69 @@ RTL ;-------------------------------------------------------------------------------- LoadFullItemTiles: - PHA : PHX - LDA $4300 : PHA ; preserve DMA parameters - LDA $4301 : PHA ; preserve DMA parameters - LDA $4302 : PHA ; preserve DMA parameters - LDA $4303 : PHA ; preserve DMA parameters - LDA $4304 : PHA ; preserve DMA parameters - LDA $4305 : PHA ; preserve DMA parameters - LDA $4306 : PHA ; preserve DMA parameters - ;-------------------------------------------------------------------------------- - LDA.b #$80 : STA $2115 ; write read increment on $2119 - LDA.b #$01 : STA $4300 ; set DMA transfer direction A -> B, bus A auto increment, double-byte mode - LDA.b #$18 : STA $4301 ; set bus B destination to VRAM register - - LDA.b #$00 : STA $2116 ; write VRAM destination address - LDA.b #$30 : STA $2117 ; write VRAM destination address - - LDA.b #$31 : STA $4304 ; set bus A source bank - LDA.b #FileSelectNewGraphics : STA $4302 ; set bus A source address to ROM - LDA.b #FileSelectNewGraphics>>8 : STA $4303 ; set bus A source address to ROM - - LDA $2100 : PHA : LDA.b #$80 : STA $2100 ; save screen state & turn screen off - - STZ $4305 : LDA.b #$10 : STA $4306 ; set transfer size to 0x1000 - LDA #$01 : STA $420B ; begin DMA transfer - - PLA : STA $2100 ; put screen back however it was before - ;-------------------------------------------------------------------------------- - PLA : STA $4306 ; restore DMA parameters - PLA : STA $4305 ; restore DMA parameters - PLA : STA $4304 ; restore DMA parameters - PLA : STA $4303 ; restore DMA parameters - PLA : STA $4302 ; restore DMA parameters - PLA : STA $4301 ; restore DMA parameters - PLA : STA $4300 ; restore DMA parameters - PLX : PLA + LDA.b #$80 : STA.w VMAIN + LDA.b #$01 : STA.w DMAP0 + LDA.b #$18 : STA.w BBAD0 + LDX.w #$3200 : STX.w VMADDL + LDA.b #FileSelectNewGraphics>>16 : STA.w A1B0 + LDX.w #FileSelectNewGraphics : STX.w A1T0L + LDX.w #$0C00 : STX.w DAS0L + LDA.b #$01 : STA.w MDMAEN RTL ;-------------------------------------------------------------------------------- +; z colon @ +; length $340 +; target vram $6C00 +; NewFont+$400 +LoadLowerCaseLettersSymbols: + LDA.b #$80 : STA.w VMAIN + LDA.b #$01 : STA.w DMAP0 + LDA.b #$18 : STA.w BBAD0 + ; Lower case letters + LDA.b #NewFont>>16 : STA.w A1B0 + LDX.w #NewFont+$400 : STX.w A1T0L + LDX.w #$0400 : STX.w DAS0L + LDX.w #$2D00 : STX.w VMADDL + LDA.b #$01 : STA.w MDMAEN + + ; : @ # + LDA.b #NewFont>>16 : STA.w A1B0 + LDX.w #NewFont+$A80 : STX.w A1T0L + LDA.b #NewFont>>16 : STA.w A1B1 + LDX.w #NewFont+$B80 : STX.w A1T1L + LDX.w #$0030 : STX.w DAS0L : STX.w DAS1L + + LDX.w #$2E50 : STX.w VMADDL + LDA.b #$01 : STA.w MDMAEN + LDX.w #$2ED0 : STX.w VMADDL + LDA.b #$02 : STA.w MDMAEN +RTL +;-------------------------------------------------------------------------------- +LoadFileSelectVanillaItems: + REP #$10 + LDA.b #$80 : STA.w VMAIN + LDA.b #$01 : STA.w DMAP0 + LDA.b #$18 : STA.w BBAD0 + + ; Lower case letters + LDA.b #DecompBuffer2>>16 : STA.w A1B0 + LDX.w #DecompBuffer2 : STX.w A1T0L + LDX.w #$0600 : STX.w DAS0L + LDX.w #$2F00 : STX.w VMADDL + LDA.b #$01 : STA.w MDMAEN + + SEP #$10 +RTL +;-------------------------------------------------------------------------------- SetFileSelectPalette: - LDA $10 : CMP.b #$04 : BNE + + LDA.b GameMode : CMP.b #$04 : BNE + ; load the vanilla file select screen BG3 palette for naming screen - LDA.b #$01 : STA $0AB2 - JSL.l Palette_Hud + LDA.b #$01 : STA.w $0AB2 + JSL Palette_Hud BRA .done + - JSL.l LoadCustomHudPalette + JSL LoadCustomHudPalette .done JML Palette_SelectScreen ; Jump to the subroutine whose call we wrote over @@ -774,12 +838,12 @@ LoadCustomHudPalette: LDX.b #$40 - LDA.l GFX_HUD_Palette, X - STA.l $7EC500, X + STA.l PaletteBuffer, X DEX : DEX BPL - SEP #$20 - INC $15 ; ensure CGRAM gets updated + INC.b NMICGRAM ; ensure CGRAM gets updated PLX : PLA RTL ;-------------------------------------------------------------------------------- @@ -787,83 +851,84 @@ DrawPlayerFile_credits: ; see $6563C for drawing first file name and hearts REP #$20 ; set 16 bit accumulator - LDA EquipmentSRAM+$99 : ORA.w #!FS_COLOR_BW + LDA.l EquipmentSRAM+$99 : ORA.w #!FS_COLOR_BW %fs_draw8x16(3,5) - LDA EquipmentSRAM+$9B : ORA.w #!FS_COLOR_BW + LDA.l EquipmentSRAM+$9B : ORA.w #!FS_COLOR_BW %fs_draw8x16(3,6) - LDA EquipmentSRAM+$9D : ORA.w #!FS_COLOR_BW + LDA.l EquipmentSRAM+$9D : ORA.w #!FS_COLOR_BW %fs_draw8x16(3,7) - LDA EquipmentSRAM+$9F : ORA.w #!FS_COLOR_BW + LDA.l EquipmentSRAM+$9F : ORA.w #!FS_COLOR_BW %fs_draw8x16(3,8) - LDA EquipmentSRAM+$2C : AND.w #$00FF : LSR #3 : STA $02 + LDA.l EquipmentSRAM+$2C : AND.w #$00FF : LSR #3 : STA.b Scrap02 %fs_LDY_screenpos(0,20) - LDA.w #$028F|!FS_COLOR_RED + LDA.l HUDHeartColors_index : ASL : TAX + LDA.l HUDHeartColors_masks_file_select,X + ORA.w #$02CF LDX.w #$000A .nextHeart - STA.w $0000, Y - INY #2 : DEX : BNE + PHA TYA : !ADD.w #$40-$14 : TAY PLA + - DEC $02 : BNE .nextHeart + DEC.b Scrap02 : BNE .nextHeart JSR DrawPlayerFileShared RTL ;-------------------------------------------------------------------------------- FSCursorUp: - LDA $C8 : BNE + - LDA #$04 ; up from file becomes delete + LDA.b FileSelectPosition : BNE + + LDA.b #$04 ; up from file becomes delete BRA .done - + : CMP #$03 : BNE + - LDA #$00 ; up from unlock is the file + + : CMP.b #$03 : BNE + + LDA.b #$00 ; up from unlock is the file BRA .done + LDA.l IsEncrypted : CMP.b #$02 : BNE + - LDA.l !ValidKeyLoaded : BNE + - LDA #$03 ; up from delete is unlock for password protected seeds + LDA.l ValidKeyLoaded : BNE + + LDA.b #$03 ; up from delete is unlock for password protected seeds BRA .done + - LDA #$00 ;otherwise up from delete is file + LDA.b #$00 ;otherwise up from delete is file .done - STA $C8 + STA.b FileSelectPosition RTL + FSCursorDown: - LDA $C8 : BNE + + LDA.b FileSelectPosition : BNE + LDA.l IsEncrypted : CMP.b #$02 : BNE ++ - LDA.l !ValidKeyLoaded : BNE ++ - LDA #$03 ; down from file is unlock for password protected seeds + LDA.l ValidKeyLoaded : BNE ++ + LDA.b #$03 ; down from file is unlock for password protected seeds BRA .done ++ - LDA #$04 ;otherwise down from file is delete + LDA.b #$04 ;otherwise down from file is delete BRA .done - + : CMP #$03 : BNE + - LDA #$04 ; down from unlock is delete + + : CMP.b #$03 : BNE + + LDA.b #$04 ; down from unlock is delete BRA .done + - LDA #$00 ; down from delete is file + LDA.b #$00 ; down from delete is file .done - STA $C8 + STA.b FileSelectPosition RTL ;-------------------------------------------------------------------------------- FSSelectFile: LDA.l IsEncrypted : CMP.b #$02 : BNE .normal - STZ $012E ; temporarily cancel file screen selection sound + STZ.w SFX2 ; temporarily cancel file screen selection sound PHX : PHY JSL ValidatePassword : BEQ .must_unlock PLY : PLX - LDA.b #$2C : STA $012E ;file screen selection sound + LDA.b #$2C : STA.w SFX2 ;file screen selection sound .normal - LDA.b #$F1 : STA $012C + LDA.b #$F1 : STA.w MusicControlRequest JML FSSelectFile_continue .must_unlock PLY : PLX - LDA #$03 : STA $C8 ;set cursor to unlock - LDA.b #$3C : STA $012E ; play error sound + LDA.b #$03 : STA.b FileSelectPosition ;set cursor to unlock + LDA.b #$3C : STA.w SFX2 ; play error sound JML FSSelectFile_return ;-------------------------------------------------------------------------------- MaybeForceFileName: @@ -873,14 +938,14 @@ MaybeForceFileName: - INX : INX LDA.l StaticFileName, X : STA.l ExtendedFileNameSRAM, X - CPX #$16 : BEQ .done - CPX #$08 : BCS - + CPX.b #$16 : BEQ .done + CPX.b #$08 : BCS - STA.l FileNameVanillaSRAM, X BRA - .done SEP #$20 - JML.l InitializeSaveFile + JML InitializeSaveFile + -JML.l NameFile_MakeScreenVisible +JML NameFile_MakeScreenVisible ;-------------------------------------------------------------------------------- diff --git a/firebarlayer.asm b/firebarlayer.asm deleted file mode 100644 index f7118b2..0000000 --- a/firebarlayer.asm +++ /dev/null @@ -1,8 +0,0 @@ -NewFireBarDamage: -{ - LDA $00EE : CMP $0F20, X : BNE .NotSameLayer - JSL Sprite_AttemptDamageToPlayerPlusRecoilLong - RTL - .NotSameLayer - RTL -} \ No newline at end of file diff --git a/flipperkill.asm b/flipperkill.asm index 61f0e38..60af253 100644 --- a/flipperkill.asm +++ b/flipperkill.asm @@ -1,78 +1,14 @@ ;================================================================================ ; Fake Flippers Softlock Fix ;-------------------------------------------------------------------------------- -FlipperKill: - PHP - LDA $5D : CMP #$04 : BNE .done ; skip if we're not swimming - LDA FlippersEquipment : BNE .done ; skip if we have the flippers - LDA $7F5001 : BEQ .done ; skip if we're not marked in danger for softlock - LDA $8A : CMP $7F5098 : BEQ .done ; skip if we're on the same screen we entered the water on - ;JSL.l KillFairies ; take away fairies - LDA IgnoreFaeries : ORA.b #$04 : STA IgnoreFaeries - LDA.b #$00 : STA CurrentHealth ; kill link - LDA.b #$00 : STA $7F5001 ; mark fake flipper softlock as impossible - .done - PLP - LDA CurrentHealth ; thing we wrote over -RTL -;-------------------------------------------------------------------------------- -IgnoreFairyCheck: - LDX.b #$00 ; thing we wrote over - LDA IgnoreFaeries : BIT.b #$04 : BEQ .normal - - AND.b #$FB : STA IgnoreFaeries ; clear ignore fairy flag - LDA.b #$F0 ; set check to invalid entry -RTL - .normal - LDA.b #$06 ; set check to fairy -RTL -;-------------------------------------------------------------------------------- -;KillFairies: -; LDA BottleContentsOne : CMP #$06 : BNE + -; LDA #$02 : STA BottleContentsOne -; + LDA BottleContentsTwo : CMP #$06 : BNE + -; LDA #$02 : STA BottleContentsTwo -; + LDA BottleContentsThree : CMP #$06 : BNE + -; LDA #$02 : STA BottleContentsThree -; + LDA BottleContentsFour : CMP #$06 : BNE + -; LDA #$02 : STA BottleContentsFour -; + -;RTL -;-------------------------------------------------------------------------------- -FlipperReset: - JSL $0998E8 ; AddTransitionSplash - LDA #$00 : STA $7F5001 ; mark fake flipper softlock as impossible - .done -RTL -;-------------------------------------------------------------------------------- -FlipperFlag: - LDA $5D : CMP #$04 : BNE .done ; skip if we're not swimming - LDA FlippersEquipment : BNE .safe ; skip if we have the flippers - LDA #$01 : STA $7F5001 ; mark fake flipper softlock as possible - BRA .done - .safe - LDA #$00 : STA $7F5001 ; mark fake flipper softlock as impossible - .done -RTL -;-------------------------------------------------------------------------------- -RegisterWaterEntryScreen: - PHA - LDA $8A : STA $7F5098 ; store ow index - PLA -RTL -;-------------------------------------------------------------------------------- -MysteryWaterFunction: ; *$3AE54 ALTERNATE ENTRY POINT - LDA.b #$20 : STA $02E2 - STZ $037B - STZ $55 - STZ $0360 -RTL -;-------------------------------------------------------------------------------- - -;=================================================================================================== -; More elegant solution -;=================================================================================================== +; Written over and used by OnEnterWater hook. +; UnequipCapeQuiet: +; LDA.b #$20 : STA.w PoofTimer +; STZ.w NoDamage +; STZ.b CapeOn +; STZ.w LinkZap +; RTL protectff: LDA.l AllowAccidentalMajorGlitch @@ -83,16 +19,16 @@ protectff: .yes_protect REP #$30 - LDA.b $20 + LDA.b LinkPosY AND.w #$1E00 ASL ASL ASL - STA.b $06 + STA.b Scrap06 - LDA.b $22 + LDA.b LinkPosX AND.w #$1E00 - ORA.b $06 + ORA.b Scrap06 XBA LSR @@ -103,26 +39,26 @@ protectff: ; Remove dark world bit ; in game table that converts coordinates to actual screen ID ; special case for other areas - LDA.b $8A + LDA.b OverworldIndex BMI .special_overworld AND.b #$3F - CMP.l $02A4E3,X + CMP.l Overworld_ActualScreenID,X BEQ ++ .protect LDA.b #$15 - STA.b $5D + STA.b LinkState - STZ.b $2E - STZ.b $67 + STZ.b LinkAnimationStep + STZ.b LinkWalkDirection LDA.b #$02 - STA.b $2F + STA.b LinkDirection - STZ.w $0112 - STZ.w $02E4 - STZ.w $0FFC + STZ.w MedallionFlag + STZ.w CutsceneFlag + STZ.w NoMenu ++ RTL @@ -137,18 +73,18 @@ protectff: db $FF, $81, $81, $FF, $FF, $FF, $FF, $FF FlipperScrollWarp: - STZ $00 : STZ $02 ; what we wrote over - LDA $308358 : BEQ .checkX : RTL + STZ.b Scrap00 : STZ.b Scrap02 ; what we wrote over + LDA.l AllowAccidentalMajorGlitch : BEQ .checkX : RTL .checkX - LDA $22 : CMP.w $0604 : BCC + - CMP.w $0616 : BCS + + LDA.b LinkPosX : CMP.w $0604 : BCC + + CMP.w CameraTargetE : BCS + BRA .checkY - + LDA $7EC186 - STA $22 + + LDA.l $7EC186 + STA.b LinkPosX .checkY - LDA $20 : CMP.w $0600 : BCC + - CMP.w $0612 : BCS + + LDA.b LinkPosY : CMP.w $0600 : BCC + + CMP.w CameraTargetS : BCS + RTL - + LDA $7EC184 - STA $20 + + LDA.l $7EC184 + STA.b LinkPosY RTL diff --git a/floodgatesoftlock.asm b/floodgatesoftlock.asm index 82807e1..fff1f72 100644 --- a/floodgatesoftlock.asm +++ b/floodgatesoftlock.asm @@ -2,28 +2,31 @@ ; Floodgate Softlock Fix ;-------------------------------------------------------------------------------- FloodGateAndMasterSwordFollowerReset: - JSL.l MasterSwordFollowerClear + JSL MasterSwordFollowerClear FloodGateReset: LDA.l PersistentFloodgate : BNE + - LDA OverworldEventDataWRAM+$3B : AND.b #$DF : STA OverworldEventDataWRAM+$3B ; reset water outside floodgate - LDA OverworldEventDataWRAM+$7B : AND.b #$DF : STA OverworldEventDataWRAM+$7B ; reset water outside swamp palace - LDA RoomDataWRAM[$010B].low : AND.b #$7F : STA RoomDataWRAM[$010B].low ; clear water inside floodgate - LDA RoomDataWRAM[$28].high : AND.b #$FE : STA RoomDataWRAM[$28].high ; clear water front room (room 40) + LDA.l OverworldEventDataWRAM+$3B : AND.b #$DF : STA.l OverworldEventDataWRAM+$3B ; reset water outside floodgate + LDA.l OverworldEventDataWRAM+$7B : AND.b #$DF : STA.l OverworldEventDataWRAM+$7B ; reset water outside swamp palace + LDA.l RoomDataWRAM[$010B].low : AND.b #$7F : STA.l RoomDataWRAM[$010B].low ; clear water inside floodgate + LDA.l RoomDataWRAM[$28].high : AND.b #$FE : STA.l RoomDataWRAM[$28].high ; clear water front room (room 40) + + +; note - official sram for getting keys under pots has changed for DR, see RoomPotData FloodGateResetInner: - LDA.l Bugfix_SwampWaterLevel : BEQ .done - LDA DRMode : BEQ .check_room_35; Only do the check for room 37 if on door rando - LDA.l SwampDrain1HasItem : BEQ .flipper_check - LDA $7F666F : AND.b #$80 : BEQ .drain_room_37 ; Check if key in room 37 has been collected. - .flipper_check - LDA FlippersEquipment : AND.b #$01 : BNE .check_room_35 ; Check for flippers. This can otherwise softlock doors if flooded without flippers and no way to reset. - .drain_room_37 - LDA RoomDataWRAM[$37].low : AND.b #$7F : STA RoomDataWRAM[$37].low ; clear water room 37 - outer room you shouldn't be able to softlock except in major glitches - .check_room_35 - LDA.l SwampDrain2HasItem : BEQ .done - LDA $7F666B : AND.b #$80 : BNE .done ; Check if key in room 35 has been collected. - ; no need to check for flippers on the inner room, as you can't get to the west door no matter what, without flippers. - LDA RoomDataWRAM[$35].low : AND.b #$7F : STA RoomDataWRAM[$35].low ; clear water room 35 - inner room with the easy key flood softlock - .done + LDA.l Bugfix_SwampWaterLevel : BEQ .done + + LDA.l DRMode : BEQ .check_room_35; Only do the check for room 37 if on door rando + LDA.l SwampDrain1HasItem : BEQ .flipper_check + LDA.l $7F666F : AND.b #$80 : BEQ .drain_room_37 ; Check if key in room 37 has been collected. +.flipper_check + LDA.l FlippersEquipment : AND.b #$01 : BNE .check_room_35 ; Check for flippers. This can otherwise softlock doors if flooded without flippers and no way to reset. +.drain_room_37 + LDA.l RoomDataWRAM[$37].low : AND.b #$7F : STA.l RoomDataWRAM[$37].low ; clear water room 37 - outer room you shouldn't be able to softlock except in major glitches +.check_room_35 + LDA.l SwampDrain2HasItem : BEQ .done + LDA.l $7F666B : AND.b #$80 : BNE .done ; Check if key in room 35 has been collected. + ; no need to check for flippers on the inner room, as you can't get to the west door no matter what, without flippers. + LDA.l RoomDataWRAM[$35].low : AND.b #$7F : STA.l RoomDataWRAM[$35].low ; clear water room 35 - inner room with the easy key flood softlock +.done RTL ;================================================================================ diff --git a/flute.asm b/flute.asm index 33f9985..bc5097f 100644 --- a/flute.asm +++ b/flute.asm @@ -2,40 +2,40 @@ ; Randomize Flute Dig Item ;-------------------------------------------------------------------------------- SpawnHauntedGroveItem: - LDA $8A : CMP.b #$2A : BEQ + : RTL : + ; Skip if not the haunted grove - LDA $1B : BEQ + : RTL : + ; Skip if indoors + LDA.b OverworldIndex : CMP.b #$2A : BEQ + : RTL : + ; Skip if not the haunted grove + LDA.b IndoorsFlag : BEQ + : RTL : + ; Skip if indoors - LDA.l HauntedGroveItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID - %GetPossiblyEncryptedItem(HauntedGroveItem, HeartPieceOutdoorValues) + ; todo - how does this work now? + LDA.l HauntedGroveItem_Player : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID LDA.b #$EB - STA $7FFE00 + STA.l MiniGameTime JSL Sprite_SpawnDynamically - LDA.b #$01 : STA.w !SPRITE_REDRAW, Y + LDA.b #$01 : STA.w SprRedrawFlag, Y LDX.b #$00 - LDA $2F : CMP.b #$04 : BEQ + : INX : + + LDA.b LinkDirection : CMP.b #$04 : BEQ + : INX : + - LDA.l .x_speeds, X : STA $0D50, Y + LDA.l .x_speeds, X : STA.w SpriteVelocityX, Y - LDA.b #$00 : STA $0D40, Y - LDA.b #$18 : STA $0F80, Y - LDA.b #$FF : STA $0B58, Y - LDA.b #$30 : STA $0F10, Y + LDA.b #$00 : STA.w SpriteVelocityY, Y + LDA.b #$18 : STA.w SpriteVelocityZ, Y + LDA.b #$FF : STA.w EnemyStunTimer, Y + LDA.b #$30 : STA.w SpriteTimerE, Y - LDA $22 : !ADD.l .x_offsets, X - AND.b #$F0 : STA $0D10, Y - LDA $23 : ADC.b #$00 : STA $0D30, Y + LDA.b LinkPosX : !ADD.l .x_offsets, X + AND.b #$F0 : STA.w SpritePosXLow, Y + LDA.b LinkPosX+1 : ADC.b #$00 : STA.w SpritePosXHigh, Y - LDA $20 : !ADD.b #$16 : AND.b #$F0 : STA $0D00, Y - LDA $21 : ADC.b #$00 : STA $0D20, Y + LDA.b LinkPosY : !ADD.b #$16 : AND.b #$F0 : STA.w SpritePosYLow, Y + LDA.b LinkPosY+1 : ADC.b #$00 : STA.w SpritePosYHigh, Y - LDA.b #$00 : STA $0F20, Y + LDA.b #$00 : STA.w SpriteLayer, Y TYX - LDX $8A ; haunted grove (208D0A) - LDA OverworldEventDataWRAM, X : AND.b #$40 : BNE + + LDX.b OverworldIndex ; haunted grove (208D0A) + LDA.l OverworldEventDataWRAM, X : AND.b #$40 : BNE + LDA.b #$1B : JSL Sound_SetSfx3PanLong + RTL @@ -54,33 +54,32 @@ RTL } ;-------------------------------------------------------------------------------- FluteBoy: - LDA $10 : CMP.b #$1A : BEQ + - LDA.b #$01 : STA $0FDD - JML.l FluteBoy_Abort + LDA.b GameMode : CMP.b #$1A : BEQ + + LDA.b #$01 : STA.w $0FDD + JML FluteBoy_Abort + - LDA $0D80, X : CMP.b #$03 ; thing we wrote over -JML.l FluteBoy_Continue + LDA.w SpriteActivity, X : CMP.b #$03 ; thing we wrote over +JML FluteBoy_Continue ;-------------------------------------------------------------------------------- FreeDuckCheck: LDA.l OWMode+1 : AND.b #!FLAG_OW_MIXED : BNE .skipInvertedCheck LDA.l InvertedMode : BEQ .done .skipInvertedCheck - - LDA FluteEquipment : CMP.b #$03 : BEQ .done ; flute is already active + LDA.l FluteEquipment : CMP.b #$03 : BEQ .done ; flute is already active ; check the area, is it #$18 = 30? - LDA $8A : CMP.b #$18 : BNE .done + LDA.b OverworldIndex : CMP.b #$18 : BNE .done REP #$20 ; Y coordinate boundaries for setting it off. - LDA $20 + LDA.b LinkPosY CMP.w #$0760 : BCC .done CMP.w #$07E0 : BCS .done ; do if( (Ycoord >= 0x0760) && (Ycoord < 0x07e0 - LDA $22 + LDA.b LinkPosX CMP.w #$01CF : BCC .done CMP.w #$0230 : BCS .done @@ -89,7 +88,7 @@ FreeDuckCheck: SEP #$20 ; Apparently a special Overworld mode for doing this? - LDA.b #$2D : STA $11 + LDA.b #$2D : STA.b GameSubMode ; Trigger the sequence to start the weathervane explosion. LDY.b #$00 @@ -99,12 +98,12 @@ FreeDuckCheck: BRA .skipSong .done SEP #$20 - LDA.b #$80 : STA $03F0 ; thing we wrote over, load flute timer + LDA.b #$80 : STA.w FluteTimer ; thing we wrote over LDA.b #$13 RTL .skipSong SEP #$20 - LDA.b #$80 : STA $03F0 ; thing we wrote over, load flute timer + LDA.b #$80 : STA.w FluteTimer ; thing we wrote over LDA.b #$00 RTL ;-------------------------------------------------------------------------------- diff --git a/framehook.asm b/framehook.asm index a97da8d..0e555a5 100644 --- a/framehook.asm +++ b/framehook.asm @@ -2,23 +2,21 @@ ; Frame Hook ;-------------------------------------------------------------------------------- FrameHookAction: - JSL $0080B5 ; Module_MainRouting - JSL CheckMusicLoadRequest - PHP : REP #$30 : PHA - - SEP #$20 - - LDA StatsLocked : BNE ++ - REP #$20 ; set 16-bit accumulator - LDA LoopFrames : INC : STA LoopFrames : BNE + - LDA LoopFrames+2 : INC : STA LoopFrames+2 - + - LDA $10 : CMP.w #$010E : BNE + ; move this to nmi hook? - LDA MenuFrames : INC : STA MenuFrames : BNE + - LDA MenuFrames+2 : INC : STA MenuFrames+2 - + - ++ - REP #$30 : PLA : PLP + JSL Module_MainRouting + JSL CheckMusicLoadRequest + PHP : REP #$30 : PHA + SEP #$20 + LDA.l StatsLocked : BNE ++ + REP #$20 ; set 16-bit accumulator + LDA.l LoopFrames : INC : STA.l LoopFrames : BNE + + LDA.l LoopFrames+2 : INC : STA.l LoopFrames+2 + + + LDA.l GameMode : CMP.w #$010E : BNE ++ ; move this to nmi hook? + LDA.l MenuFrames : INC : STA.l MenuFrames : BNE ++ + LDA.l MenuFrames+2 : INC : STA.l MenuFrames+2 + ++ + REP #$30 : PLA : PLP + RTL !NMI_MW = "$7F5047" @@ -35,41 +33,51 @@ NMIHookAction: ; Multiworld text LDA !NMI_MW+1 : BEQ + LDA #$00 : STA !NMI_MW+1 - JSL.l WriteText + JSL WriteText + PLP ++ - - LDA StatsLocked : AND.w #$00FF : BNE ++ - LDA NMIFrames : INC : STA NMIFrames : BNE + - LDA NMIFrames+2 : INC : STA NMIFrames+2 - + - ++ - -JML.l NMIHookReturn -;-------------------------------------------------------------------------------- -!NMI_AUX = "$7F5044" + LDA.l StatsLocked : AND.w #$00FF : BNE + + LDA.l NMIFrames : INC : STA.l NMIFrames : BNE + + LDA.l NMIFrames+2 : INC : STA.l NMIFrames+2 + + + +JML NMIHookReturn + +;-------------------------------------------------------------------------------- PostNMIHookAction: - LDA.l !NMI_AUX+2 : BEQ .return - - PHK - PEA .return-1 - - PHA - - LDA.b #$00 : STA.l !NMI_AUX+2 - - REP #$20 - LDA.l !NMI_AUX+0 : DEC : PHA - SEP #$20 - - RTL - -.return - LDA.b $13 : STA.w $2100 - - JML.l PostNMIHookReturn - + LDA.w NMIAux : BEQ + + PHK : PEA .return-1 ; push stack for RTL return + JMP.w [NMIAux] + .return + STZ.w NMIAux ; zero bank byte of NMI hook pointer + + + JSR TransferItemGFX + LDA.b INIDISPQ : STA.w INIDISP ; thing we wrote over, turn screen back on +JML PostNMIHookReturn ;-------------------------------------------------------------------------------- +TransferItemGFX: +; Only used for shops now but could be used for anything. We should look at how door rando does this +; and try to unify one approach. + REP #$30 + LDX.w ItemStackPtr : BEQ .done + TXA : BIT.w #$0040 : BNE .fail ; Crash if we have more than 16 queued (should never happen.) + DEX #2 + - + LDA.l ItemGFXStack,X : STA.w ItemGFXPtr + LDA.l ItemTargetStack,X : STA.w ItemGFXTarget + PHX + JSL TransferItemToVRAM + REP #$10 + PLX + DEX #2 + BPL - + + STZ.w ItemStackPtr + .done + SEP #$30 +RTS + .fail + BRK #$00 diff --git a/ganonfixes.asm b/ganonfixes.asm deleted file mode 100644 index 976cbad..0000000 --- a/ganonfixes.asm +++ /dev/null @@ -1,16 +0,0 @@ -;================================================================================ -; Ganon Fixes -;================================================================================ - -;-------------------------------------------------------------------------------- -; GanonWarpRNG -; out: Accumulator - #$00 or #01 randomly, with no repeated #$01s -;-------------------------------------------------------------------------------- -;GanonWarpRNG: -; JSL GetRandomInt : AND.b #$01 : BEQ .zero -; LDA !GANON_WARP_CHAIN : EOR #$01 : STA !GANON_WARP_CHAIN -;RTL -; .zero -; STA !GANON_WARP_CHAIN -;RTL -;-------------------------------------------------------------------------------- \ No newline at end of file diff --git a/glitched.asm b/glitched.asm index 76901b2..1081fa6 100644 --- a/glitched.asm +++ b/glitched.asm @@ -2,7 +2,7 @@ ; Glitched Mode Fixes ;================================================================================ GetAgahnimPalette: - LDA $A0 ; get room id + LDA.b RoomIndex ; get room id CMP.b #13 : BNE + ; Agahnim 2 room LDA.b #$07 ; Use Agahnim 2 RTL @@ -11,25 +11,25 @@ GetAgahnimPalette: RTL ;-------------------------------------------------------------------------------- GetAgahnimDeath: - STA $0BA0, X ; thing we wrote over - LDA $A0 ; get room id + STA.w SpriteAncillaInteract, X ; thing we wrote over + LDA.b RoomIndex ; get room id CMP.b #13 : BNE + ; Agahnim 2 room LDA.l Bugfix_SetWorldOnAgahnimDeath : BEQ ++ LDA.l InvertedMode : BEQ +++ - LDA.b #$00 : STA CurrentWorld ; Switch to light world + LDA.b #$00 : STA.l CurrentWorld ; Switch to light world BRA ++ +++ - LDA.b #$40 : STA CurrentWorld ; Switch to dark world + LDA.b #$40 : STA.l CurrentWorld ; Switch to dark world ++ LDA.b #$01 ; Use Agahnim 2 RTL + ; Elsewhere LDA.l Bugfix_SetWorldOnAgahnimDeath : BEQ ++ LDA.l InvertedMode : BEQ +++ - LDA.b #$40 : STA CurrentWorld ; Switch to dark world + LDA.b #$40 : STA.l CurrentWorld ; Switch to dark world BRA ++ +++ - LDA.b #$00 : STA CurrentWorld ; Switch to light world + LDA.b #$00 : STA.l CurrentWorld ; Switch to light world ; (This will later get flipped to DW when Agahnim 1 ; warps us to the pyramid) ++ @@ -37,7 +37,7 @@ GetAgahnimDeath: RTL ;-------------------------------------------------------------------------------- GetAgahnimType: - LDA $A0 ; get room id + LDA.b RoomIndex ; get room id CMP.b #13 : BNE + ; Agahnim 2 room LDA.b #$0006 ; Use Agahnim 2 BRA .done @@ -48,17 +48,17 @@ RTL ;-------------------------------------------------------------------------------- GetAgahnimSlot: PHX ; thing we wrote over - LDA $A0 ; get room id + LDA.b RoomIndex ; get room id CMP.b #13 : BNE + ; Agahnim 2 room LDA.b #$01 ; Use Agahnim 2 - JML.l GetAgahnimSlotReturn + JML GetAgahnimSlotReturn + ; Elsewhere LDA.b #$00 ; Use Agahnim 1 - JML.l GetAgahnimSlotReturn + JML GetAgahnimSlotReturn ;-------------------------------------------------------------------------------- GetAgahnimLightning: - INC $0E30, X ; thing we wrote over - LDA $A0 ; get room id + INC.w SpriteAux, X ; thing we wrote over + LDA.b RoomIndex ; get room id CMP.b #13 : BNE + ; Agahnim 2 room LDA.b #$01 ; Use Agahnim 2 RTL @@ -69,11 +69,11 @@ GetAgahnimLightning: ;0 = Allow ;1 = Forbid AllowJoypadInput: - LDA PermitSQFromBosses : BEQ .fullCheck - LDA $0403 : AND.b #$80 : BEQ .fullCheck - LDA $0112 : ORA $02E4 ; we have heart container, do short check + LDA.l PermitSQFromBosses : BEQ .fullCheck + LDA.w RoomItemsTaken : AND.b #$80 : BEQ .fullCheck + LDA.w MedallionFlag : ORA.w CutsceneFlag ; we have heart container, do short check RTL .fullCheck - LDA $0112 : ORA $02E4 : ORA $0FFC + LDA.w MedallionFlag : ORA.w CutsceneFlag : ORA.w NoMenu RTL ;-------------------------------------------------------------------------------- diff --git a/goalitem.asm b/goalitem.asm index f047ed2..ac4f40f 100644 --- a/goalitem.asm +++ b/goalitem.asm @@ -1,28 +1,21 @@ -;-------------------------------------------------------------------------------- -; $7F5010 - Scratch Space (Callee Preserved) -;-------------------------------------------------------------------------------- -!GOAL_DRAW_ADDRESS = "$7EC72A" -;-------------------------------------------------------------------------------- -; DrawGoalIndicator moved to newhud.asm -;-------------------------------------------------------------------------------- GoalItemGanonCheck: - LDA $0E20, X : CMP.b #$D6 : BNE .success ; skip if not ganon - JSL.l CheckGanonVulnerability + LDA.w SpriteTypeTable, X : CMP.b #$D6 : BNE .success ; skip if not ganon + JSL CheckGanonVulnerability BCS .success .fail - LDA $0D80, X : CMP.b #17 : !BLT .success ; decmial 17 because Acmlm's chart is decimal + LDA.w SpriteActivity, X : CMP.b #17 : !BLT .success ; decmial 17 because Acmlm's chart is decimal LDA.b #$00 RTL .success - LDA $44 : CMP.b #$80 ; thing we wrote over + LDA.b OAMOffsetY : CMP.b #$80 ; thing we wrote over RTL ;-------------------------------------------------------------------------------- ;Carry clear = ganon invincible ;Carry set = ganon vulnerable CheckGanonVulnerability: PHX - LDA.l InvincibleGanon + LDA.l GanonVulnerableMode ASL TAX @@ -46,6 +39,7 @@ CheckGanonVulnerability: dw .crystals_and_bosses dw .bosses_only dw .all_dungeons_no_agahnim + dw .all_items dw .completionist ; 00 = always vulnerable @@ -100,14 +94,20 @@ CheckGanonVulnerability: .bosses_only JMP CheckForCrystalBossesDefeated -; 0a = Check Item counter -.completionist - REP #$20 - LDA.l TotalItemCounter : CMP.l MaxItemCounter - SEP #$20 - BCC .fail -BRA .all_dungeons +; 09 = 100% item collection rate +.all_items + REP #$20 + LDA.l TotalItemCounter : CMP.l TotalItemCount + SEP #$20 + RTS +; 0A = 100% item collection rate and all dungeons +.completionist + REP #$20 + LDA.l TotalItemCounter : CMP.l TotalItemCount + SEP #$20 + BCC .fail + BRA .all_dungeons ;-------------------------------------------------------------------------------- GTCutscene_CrystalMasks: @@ -122,103 +122,117 @@ db %10111111 ; 7 crystals ;-------------------------------------------------------------------------------- GTCutscene_ConditionalAnimateCrystals: PHX : PHX - LDA.l NumberOfCrystalsRequiredForTower : TAX : LDA.l GTCutscene_CrystalMasks,X + JSR GTCutscene_NumberOfCrystals : TAX : LDA.l GTCutscene_CrystalMasks,X PLX - LSR : DEX : BPL - PLX : BCC .skip_crystal .draw_crystal - LDA.b $11 : BEQ + : JML.l GTCutscene_AnimateCrystals_NoRotate ; what we wrote over - + JML.l GTCutscene_AnimateCrystals_NextCrystal+4 + LDA.b GameSubMode : BEQ + : JML GTCutscene_AnimateCrystals_NoRotate ; what we wrote over + + JML GTCutscene_AnimateCrystals_NextCrystal+4 .skip_crystal - JML.l GTCutscene_DrawSingleCrystal-3 + JML GTCutscene_DrawSingleCrystal-3 ;-------------------------------------------------------------------------------- GTCutscene_ConditionalDrawSingleCrystal: - LDA.w $06FA : BEQ .draw_crystal : STZ.w $06FA - LDA.l NumberOfCrystalsRequiredForTower : TAX + LDA.w RandoOverworldTargetEdge : BEQ .draw_crystal : STZ.w RandoOverworldTargetEdge + JSR GTCutscene_NumberOfCrystals : TAX LDA.l GTCutscene_CrystalMasks,X : AND.b #$80 : BEQ .skip_crystal .draw_crystal - LDX.w $0FA0 : PHY ; what we wrote over - JML.l GTCutscene_DrawSingleCrystal+4 + LDX.w CurrentSpriteSlot : PHY ; what we wrote over + JML GTCutscene_DrawSingleCrystal+4 .skip_crystal - JML.l GTCutscene_DrawSingleCrystal_SkipCrystal + JML GTCutscene_DrawSingleCrystal_SkipCrystal ;-------------------------------------------------------------------------------- GTCutscene_AnimateCrystals_Prep: - BEQ + : JSL.l GTCutscene_SparkleALot : + ; thing we wrote over - LDA.l NumberOfCrystalsRequiredForTower : BNE + - JML.l GTCutscene_DrawSingleCrystal_SkipSparkle + BEQ + : JSL GTCutscene_SparkleALot : + ; thing we wrote over + JSR GTCutscene_NumberOfCrystals : BNE + + JML GTCutscene_DrawSingleCrystal_SkipSparkle + CMP.b #$01 : BNE + - JML.l GTCutscene_DrawSingleCrystal - + INC.w $06FA ; some free ram OWR also uses - JML.l GTCutscene_AnimateCrystals_NextCrystal-2 + JML GTCutscene_DrawSingleCrystal + + INC.w RandoOverworldTargetEdge ; some free ram OWR also uses + JML GTCutscene_AnimateCrystals_NextCrystal-2 ;-------------------------------------------------------------------------------- GTCutscene_ActivateSparkle_SelectCrystal: - LDA.l NumberOfCrystalsRequiredForTower : BNE + + JSR GTCutscene_NumberOfCrystals : BNE + TAX : RTL - + TXA + + STA.b Scrap00 + TXA - - CMP.l NumberOfCrystalsRequiredForTower : BCC + - SBC.l NumberOfCrystalsRequiredForTower : BRA - ; carry guaranteed set + - CMP.l Scrap00 : BCC + + SBC.l Scrap00 : BRA - ; carry guaranteed set + PHY : TAY - LDA.l NumberOfCrystalsRequiredForTower : TAX : LDA.l GTCutscene_CrystalMasks,X + LDA.b Scrap00 : TAX : LDA.l GTCutscene_CrystalMasks,X LDX.b #$FF - - LSR : INX : BCC + + - LSR : INX : BCC + DEY + BPL - PLY RTL ;-------------------------------------------------------------------------------- +GTCutscene_NumberOfCrystals: + REP #$20 + LDA.l GanonsTowerOpenAddress : CMP.w #CrystalCounter : BEQ + + LDA.w #$0001 : BRA .done + + LDA.l GanonsTowerOpenTarget + .done + SEP #$20 + RTS +;-------------------------------------------------------------------------------- CheckEnoughCrystalsForGanon: - LDA CrystalCounter - CMP.l NumberOfCrystalsRequiredForGanon + REP #$20 + LDA.l CrystalCounter + CMP.l GanonVulnerableTarget + SEP #$20 RTL ;-------------------------------------------------------------------------------- -CheckEnoughCrystalsForTower: - LDA CrystalCounter - CMP.l NumberOfCrystalsRequiredForTower +CheckTowerOpen: + LDA.l GanonsTowerOpenMode : ASL : TAX + JSR (.tower_open_modes,X) RTL + .tower_open_modes + dw .vanilla + dw .arbitrary_cmp + + .vanilla + LDA.l CrystalsField + AND.b #$7F : CMP.b #$7F + RTS + + .arbitrary_cmp + REP #$30 + LDA.l GanonsTowerOpenAddress : TAX + LDA.l $7E0000,X + CMP.l GanonsTowerOpenTarget + SEP #$30 + RTS ;--------------------------------------------------------------------------------------------------- CheckAgaForPed: - LDA.l InvincibleGanon - CMP.b #$06 : BNE .vanilla + REP #$20 + LDA.l GanonVulnerableMode + CMP.w #$0006 : BNE .vanilla .light_speed - LDA.l OverworldEventDataWRAM+$80 ; check ped flag - AND.b #$40 - BEQ .force_blue_ball + SEP #$20 + LDA.l OverworldEventDataWRAM+$80 ; check ped flag + AND.b #$40 + BEQ .force_blue_ball .vanilla ; run vanilla check for phase - LDA.w $0E30, X - CMP.b #$02 - RTL + SEP #$20 + LDA.w SpriteAux, X + CMP.b #$02 + RTL .force_blue_ball - LDA.b #$01 : STA.w $0DA0, Y - LDA.b #$20 : STA.w $0DF0, Y - CLC ; skip the RNG check - RTL + LDA.b #$01 : STA.w SpriteAuxTable, Y + LDA.b #$20 : STA.w SpriteTimer, Y + CLC ; skip the RNG check + RTL ;--------------------------------------------------------------------------------------------------- - -KillGanon: - STA.l ProgressIndicator ; vanilla game state stuff we overwrote - - LDA.l InvincibleGanon - CMP.b #$06 : BNE .exit - -.light_speed - LDA.l OverworldEventDataWRAM+$5B : ORA.b #$20 : STA.l OverworldEventDataWRAM+$5B ; pyramid hole - LDA.b #$08 : STA.l RoomDataWRAM[$00].high ; kill ganon - LDA.b #$02 : STA.l MoonPearlEquipment ; pearl but invisible in menu - -.exit - RTL - -;--------------------------------------------------------------------------------------------------- - CheckForCrystalBossesDefeated: PHB : PHX : PHY @@ -228,7 +242,7 @@ CheckForCrystalBossesDefeated: REP #$30 ; count of number of bosses killed - STZ.b $00 + STZ.b Scrap00 LDY.w #10 @@ -248,7 +262,7 @@ CheckForCrystalBossesDefeated: AND.w #$0800 BEQ ++ - INC.b $00 + INC.b Scrap00 ++ DEY BPL .next_check @@ -256,8 +270,36 @@ CheckForCrystalBossesDefeated: SEP #$30 PLY : PLX : PLB - LDA.b $00 : CMP.l NumberOfCrystalsRequiredForGanon + LDA.b Scrap00 : CMP.l GanonVulnerableTarget RTS +;--------------------------------------------------------------------------------------------------- +CheckPedestalPull: +; Out: c - Successful ped pull if set, do nothing if unset. + PHX + LDA.l PedCheckMode : ASL : TAX + JSR (.pedestal_modes,X) + PLX +RTL + .pedestal_modes + dw .vanilla + dw .arbitrary_cmp + + .vanilla + LDA.l PendantsField + AND.b #$07 : CMP.b #$07 : BNE ..nopull + SEC + RTS + ..nopull + CLC + RTS + + .arbitrary_cmp + REP #$30 + LDA.l PedPullAddress : TAX + LDA.l $7E0000,X + CMP.l PedPullTarget + SEP #$30 + RTS diff --git a/halfmagicbat.asm b/halfmagicbat.asm index a81d63f..dd41d03 100644 --- a/halfmagicbat.asm +++ b/halfmagicbat.asm @@ -2,15 +2,15 @@ ; Randomize Half Magic Bat ;-------------------------------------------------------------------------------- GetMagicBatItem: - JSL.l ItemSet_MagicBat + JSL ItemSet_MagicBat %GetPossiblyEncryptedItem(MagicBatItem, SpriteItemValues) CMP.b #$FF : BEQ .normalLogic TAY - PHA : LDA MagicBatItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID : PLA - STZ $02E9 ; 0 = Receiving item from an NPC or message - JML.l Link_ReceiveItem + PHA : LDA.l MagicBatItem_Player : STA.l !MULTIWORLD_ITEM_PLAYER_ID : PLA + STZ.b ItemReceiptMethod ; 0 = Receiving item from an NPC or message + JML Link_ReceiveItem .normalLogic - LDA HalfMagic - STA MagicConsumption + LDA.l HalfMagic + STA.l MagicConsumption RTL ;-------------------------------------------------------------------------------- diff --git a/hardmode.asm b/hardmode.asm index 65c934a..b163566 100644 --- a/hardmode.asm +++ b/hardmode.asm @@ -3,22 +3,22 @@ ;================================================================================ CalculateSpikeFloorDamage: REP #$20 ; set 16-bit accumulator - LDA $A0 ; these are all decimal because i got them that way + LDA.b RoomIndex ; these are all decimal because i got them that way CMP.w #279 SEP #$20 ; set 8-bit accumulator BNE + LDA.l ByrnaCaveSpikeDamage - STA $0373 + STA.w DamageReceived RTL + - LDA $D055, Y - STA $0373 + LDA.w $D055, Y + STA.w DamageReceived RTL ;-------------------------------------------------------------------------------- CalculateByrnaUsage: - LDA $1B : BEQ ++ + LDA.b IndoorsFlag : BEQ ++ REP #$20 ; set 16-bit accumulator - LDA $A0 ; these are all decimal because i got them that way + LDA.b RoomIndex ; these are all decimal because i got them that way CMP.w #95 : BEQ + ; Ice Palace Spike Room CMP.w #172 : BEQ + ; Blind Boss Room CMP.w #179 : BEQ + ; Room in Misery Mire @@ -29,16 +29,16 @@ CalculateByrnaUsage: + SEP #$20 ; set 8-bit accumulator PHX : TYX - LDA.l HardModeExclusionCaneOfByrnaUsage, X : STA $00 + LDA.l HardModeExclusionCaneOfByrnaUsage, X : STA.b Scrap00 PLX ++ - LDA CurrentMagic ; thing we wrote over + LDA.l CurrentMagic ; thing we wrote over JML IncrementMagicUseCounterByrna ;-------------------------------------------------------------------------------- CalculateCapeUsage: - LDA $1B : BEQ ++ + LDA.b IndoorsFlag : BEQ ++ REP #$20 ; set 16-bit accumulator - LDA $A0 ; these are all decimal because i got them that way + LDA.b RoomIndex ; these are all decimal because i got them that way CMP.w #95 : BEQ + ; Ice Palace Spike Room CMP.w #179 : BEQ + ; Room in Misery Mire CMP.w #213 : BEQ + ; Laser Bridge @@ -48,15 +48,15 @@ CalculateCapeUsage: + SEP #$20 ; set 8-bit accumulator PHX : TYX - LDA.l HardModeExclusionCapeUsage, X : STA $4C ; set cape decrement timer + LDA.l HardModeExclusionCapeUsage, X : STA.b CapeTimer ; set cape decrement timer PLX ++ JML IncrementMagicUseCounterOne ;-------------------------------------------------------------------------------- ActivateInvulnerabilityOrDont: - LDA $1B : BEQ .nowhere_special + LDA.b IndoorsFlag : BEQ .nowhere_special REP #$20 ; set 16-bit accumulator - LDA $A0 ; these are all decimal because i got them that way + LDA.b RoomIndex ; these are all decimal because i got them that way CMP.w #95 : BEQ .somewhere_cool ; Ice Palace Spike Room CMP.w #179 : BEQ .somewhere_cool ; Room in Misery Mire CMP.w #213 : BEQ .somewhere_cool ; Laser Bridge @@ -66,9 +66,9 @@ ActivateInvulnerabilityOrDont: BRA .nowhere_special .somewhere_cool SEP #$20 ; set 8-bit accumulator - LDA.b #$01 : STA $037B : RTL + LDA.b #$01 : STA.w NoDamage : RTL .nowhere_special - LDA.l ByrnaInvulnerability : STA $037B + LDA.l ByrnaInvulnerability : STA.w NoDamage RTL ;-------------------------------------------------------------------------------- GetItemDamageValue: @@ -81,13 +81,13 @@ GetItemDamageValue: CPX.b #$3d : BEQ .hookshot .normal - lda $0db8f1,x ;what we wrote over + LDA.l DamageSubclassValue,x ;what we wrote over RTL .boomerang - LDA.l StunItemAction : AND #$01 : BNE .normal + LDA.l StunItemAction : AND.b #$01 : BNE .normal BRA .noDamage .hookshot - LDA.l StunItemAction : AND #$02 : BNE .normal + LDA.l StunItemAction : AND.b #$02 : BNE .normal .noDamage LDA.b #$00 RTL @@ -95,17 +95,17 @@ RTL ;Argument : A = id we want to find return 00 if none found, 01 if found SearchAncilla: { - STA $05 + STA.b Scrap05 PHX - LDX #$00 + LDX.b #$00 .loop - LDA $0C4A, X + LDA.w AncillaID, X INX : CPX #$0A : BEQ .notFound - CMP $05 : BNE .loop - LDA #$01 + CMP.b Scrap05 : BNE .loop + LDA.b #$01 BRA .return .notFound - LDA #$00 + LDA.b #$00 .return PLX RTS diff --git a/hashalphabet.asm b/hashalphabet.asm index 3bf5f05..dd22373 100644 --- a/hashalphabet.asm +++ b/hashalphabet.asm @@ -1,41 +1,39 @@ ;-------------------------------------------------------------------------------- -;Hash Alphabet -!ALPHA_BOW = "#$0000" -!ALPHA_BOOM = "#$0001" -!ALPHA_HOOK = "#$0002" -!ALPHA_BOMB = "#$0003" -!ALPHA_SHROOM = "#$0004" -!ALPHA_POWDER = "#$0005" -!ALPHA_ROD = "#$0006" -!ALPHA_PENDANT = "#$0007" -!ALPHA_BOMBOS = "#$0008" -!ALPHA_ETHER = "#$0009" -!ALPHA_QUAKE = "#$000A" -!ALPHA_LAMP = "#$000B" -!ALPHA_HAMMER = "#$000C" -!ALPHA_SHOVEL = "#$000D" -!ALPHA_FLUTE = "#$000E" -!ALPHA_NET = "#$000F" -!ALPHA_BOOK = "#$0010" -!ALPHA_BOTTLE = "#$0011" -!ALPHA_POTION = "#$0012" -!ALPHA_CANE = "#$0013" -!ALPHA_CAPE = "#$0014" -!ALPHA_MIRROR = "#$0015" -!ALPHA_BOOTS = "#$0016" -!ALPHA_GLOVES = "#$0017" -!ALPHA_FLIPPERS = "#$0018" -!ALPHA_PEARL = "#$0019" -!ALPHA_SHIELD = "#$001A" -!ALPHA_TUNIC = "#$001B" -!ALPHA_HEART = "#$001C" -!ALPHA_MAP = "#$001D" -!ALPHA_COMPASS = "#$001E" -!ALPHA_KEY = "#$001F" +; Hash Alphabet +; ALPHA_BOW = $0000 +; ALPHA_BOOM = $0001 +; ALPHA_HOOK = $0002 +; ALPHA_BOMB = $0003 +; ALPHA_SHROOM = $0004 +; ALPHA_POWDER = $0005 +; ALPHA_ROD = $0006 +; ALPHA_PENDANT = $0007 +; ALPHA_BOMBOS = $0008 +; ALPHA_ETHER = $0009 +; ALPHA_QUAKE = $000A +; ALPHA_LAMP = $000B +; ALPHA_HAMMER = $000C +; ALPHA_SHOVEL = $000D +; ALPHA_FLUTE = $000E +; ALPHA_NET = $000F +; ALPHA_BOOK = $0010 +; ALPHA_BOTTLE = $0011 +; ALPHA_POTION = $0012 +; ALPHA_CANE = $0013 +; ALPHA_CAPE = $0014 +; ALPHA_MIRROR = $0015 +; ALPHA_BOOTS = $0016 +; ALPHA_GLOVES = $0017 +; ALPHA_FLIPPERS = $0018 +; ALPHA_PEARL = $0019 +; ALPHA_SHIELD = $001A +; ALPHA_TUNIC = $001B +; ALPHA_HEART = $001C +; ALPHA_MAP = $001D +; ALPHA_COMPASS = $001E +; ALPHA_KEY = $001F ;-------------------------------------------------------------------------------- -;-------------------------------------------------------------------------------- -!BIGRAM = "$7EC900"; ;-------------------------------------------------------------------------------- LoadAlphabetTilemap: PHB : PHA : PHX : PHY : PHP @@ -45,9 +43,9 @@ LoadAlphabetTilemap: LDX.b #$00 : - LDA.w FileSelect_PlayerSelectText_Top, X - STA !BIGRAM, X + STA.l BigRAM, X INX #2 - CPX #128 : !BLT - + CPX.b #128 : !BLT - LDY.b #00 LDX.b #$00 : - @@ -55,12 +53,12 @@ LoadAlphabetTilemap: AND.w #$001F ; mask to alphabet of 32 ASL #3 : PHY : TAY - LDA.w HashAlphabetTiles,Y : STA !BIGRAM+24, X - LDA.w HashAlphabetTiles+2,Y : STA !BIGRAM+24+2, X - LDA.w HashAlphabetTiles+4,Y : STA !BIGRAM+24+64, X - LDA.w HashAlphabetTiles+6,Y : STA !BIGRAM+24+64+2, X + LDA.w HashAlphabetTiles,Y : STA.l BigRAM+24, X + LDA.w HashAlphabetTiles+2,Y : STA.l BigRAM+24+2, X + LDA.w HashAlphabetTiles+4,Y : STA.l BigRAM+24+64, X + LDA.w HashAlphabetTiles+6,Y : STA.l BigRAM+24+64+2, X PLY : INX #6 : INY - CPX #25 : !BLT - + CPX.b #25 : !BLT - SEP #$20 ; 8-bit accumulator @@ -71,110 +69,88 @@ RTL ; DMAAlphabetTilemap: ;-------------------------------------------------------------------------------- DMAAlphabetTilemap: - PHA : PHX - LDA $4300 : PHA ; preserve DMA parameters - LDA $4301 : PHA ; preserve DMA parameters - LDA $4302 : PHA ; preserve DMA parameters - LDA $4303 : PHA ; preserve DMA parameters - LDA $4304 : PHA ; preserve DMA parameters - LDA $4305 : PHA ; preserve DMA parameters - LDA $4306 : PHA ; preserve DMA parameters - ;-------------------------------------------------------------------------------- - LDA.b #$01 : STA $4300 ; set DMA transfer direction A -> B, bus A auto increment, double-byte mode - LDA.b #$80 : STA $2115 ; write read increment on $2119 - LDA.b #$18 : STA $4301 ; set bus B destination to VRAM register - - LDA.b #$60 : STA $2116 ; write VRAM destination address - STA $2117 ; write VRAM destination address - - LDA.b #!BIGRAM : STA $4302 ; set bus A source address to WRAM - LDA.b #!BIGRAM>>8 : STA $4303 ; set bus A source address to WRAM - LDA.b #!BIGRAM>>16 : STA $4304 ; set bus A source bank - - LDA.b #$80 : STA $4305 : STZ $4306 ; set transfer size to 0x40 - - LDA $2100 : PHA : LDA.b #$80 : STA $2100 ; save screen state & turn screen off - LDA #$01 : STA $420B ; begin DMA transfer - PLA : STA $2100 ; put screen back however it was before - ;-------------------------------------------------------------------------------- - PLA : STA $4306 ; restore DMA parameters - PLA : STA $4305 ; restore DMA parameters - PLA : STA $4304 ; restore DMA parameters - PLA : STA $4303 ; restore DMA parameters - PLA : STA $4302 ; restore DMA parameters - PLA : STA $4301 ; restore DMA parameters - PLA : STA $4300 ; restore DMA parameters - PLX : PLA + PHA : PHX + REP #$10 + LDA.b #$01 : STA.w DMAP0 + LDA.b #$80 : STA.w VMAIN + LDA.b #$18 : STA.w BBAD0 + LDX.w #$6060 : STX.w VMADDL + LDA.b #BigRAM>>16 : STA.w A1B0 + LDX.w #BigRAM : STX.w A1T0L + LDX.w #$0080 : STX.w DAS0L + LDA.b #$01 : STA.w MDMAEN + SEP #$10 + PLX : PLA RTS ;-------------------------------------------------------------------------------- HashAlphabetTilesWithBlank: ;BLANK -dw #$0186|!FS_COLOR_BW, #$0186|!FS_COLOR_BW, #$0196|!FS_COLOR_BW, #$0196|!FS_COLOR_BW +dw #$0188, #$0188, #$0188, #$0188 HashAlphabetTiles: ;BOW -dw #$0201|!FS_COLOR_YELLOW, #$0202|!FS_COLOR_YELLOW, #$0211|!FS_COLOR_YELLOW, #$0212|!FS_COLOR_YELLOW +dw #$0241|!FS_COLOR_YELLOW, #$0242|!FS_COLOR_YELLOW, #$0251|!FS_COLOR_YELLOW, #$0252|!FS_COLOR_YELLOW ;BOOM -dw #$0205|!FS_COLOR_BLUE, #$0206|!FS_COLOR_BLUE, #$0200|!FS_COLOR_BW, #$0216|!FS_COLOR_BLUE +dw #$0245|!FS_COLOR_BLUE, #$0246|!FS_COLOR_BLUE, #$0240|!FS_COLOR_BW, #$0256|!FS_COLOR_BLUE ;HOOK -dw #$0200|!FS_COLOR_RED, #$0215|!FS_COLOR_RED, #$0230|!FS_COLOR_RED, #$0200|!FS_COLOR_BW +dw #$0240|!FS_COLOR_RED, #$0255|!FS_COLOR_RED, #$0270|!FS_COLOR_RED, #$0240|!FS_COLOR_BW ;BOMB -dw #$020C|!FS_COLOR_BLUE, #$020D|!FS_COLOR_BLUE, #$021C|!FS_COLOR_BLUE, #$021C|!FS_COLOR_BLUE|!FS_HFLIP +dw #$024C|!FS_COLOR_BLUE, #$024D|!FS_COLOR_BLUE, #$025C|!FS_COLOR_BLUE, #$025C|!FS_COLOR_BLUE|!FS_HFLIP ;SHROOM -dw #$0262|!FS_COLOR_RED, #$0263|!FS_COLOR_RED, #$0272|!FS_COLOR_RED, #$0273|!FS_COLOR_RED +dw #$02A2|!FS_COLOR_RED, #$02A3|!FS_COLOR_RED, #$02B2|!FS_COLOR_RED, #$02B3|!FS_COLOR_RED ;POWDER -dw #$020A|!FS_COLOR_BROWN, #$020B|!FS_COLOR_BROWN, #$021A|!FS_COLOR_BROWN, #$021B|!FS_COLOR_BROWN +dw #$024A|!FS_COLOR_BROWN, #$024B|!FS_COLOR_BROWN, #$025A|!FS_COLOR_BROWN, #$025B|!FS_COLOR_BROWN ;ROD -dw #$0220|!FS_COLOR_BLUE, #$0221|!FS_COLOR_BLUE, #$0230|!FS_COLOR_BLUE, #$0231|!FS_COLOR_BLUE +dw #$0260|!FS_COLOR_BLUE, #$0261|!FS_COLOR_BLUE, #$0270|!FS_COLOR_BLUE, #$0271|!FS_COLOR_BLUE ;PENDANT -dw #$0285|!FS_COLOR_GREEN, #$0286|!FS_COLOR_GREEN, #$0295|!FS_COLOR_GREEN, #$0296|!FS_COLOR_GREEN +dw #$02C5|!FS_COLOR_GREEN, #$02C6|!FS_COLOR_GREEN, #$02D5|!FS_COLOR_GREEN, #$02D6|!FS_COLOR_GREEN ;BOMBOS -dw #$0207|!FS_COLOR_YELLOW, #$0217|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0217|!FS_COLOR_YELLOW, #$0207|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP +dw #$0247|!FS_COLOR_YELLOW, #$0257|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0257|!FS_COLOR_YELLOW, #$0247|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP ;ETHER -dw #$0208|!FS_COLOR_YELLOW, #$0218|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0218|!FS_COLOR_YELLOW, #$0208|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP +dw #$0248|!FS_COLOR_YELLOW, #$0258|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0258|!FS_COLOR_YELLOW, #$0248|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP ;QUAKE -dw #$0209|!FS_COLOR_YELLOW, #$0219|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0219|!FS_COLOR_YELLOW, #$0209|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP +dw #$0249|!FS_COLOR_YELLOW, #$0259|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP, #$0259|!FS_COLOR_YELLOW, #$0249|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP ;LAMP -dw #$022C|!FS_COLOR_RED, #$022C|!FS_COLOR_RED|!FS_HFLIP, #$023C|!FS_COLOR_RED, #$023D|!FS_COLOR_RED +dw #$026C|!FS_COLOR_RED, #$026C|!FS_COLOR_RED|!FS_HFLIP, #$027C|!FS_COLOR_RED, #$027D|!FS_COLOR_RED ;HAMMER -dw #$0222|!FS_COLOR_BROWN, #$0223|!FS_COLOR_BROWN, #$0232|!FS_COLOR_BROWN, #$0233|!FS_COLOR_BROWN +dw #$0262|!FS_COLOR_BROWN, #$0263|!FS_COLOR_BROWN, #$0272|!FS_COLOR_BROWN, #$0273|!FS_COLOR_BROWN ;SHOVEL -dw #$0224|!FS_COLOR_BROWN, #$0225|!FS_COLOR_BROWN, #$0234|!FS_COLOR_BROWN, #$0235|!FS_COLOR_BROWN +dw #$0264|!FS_COLOR_BROWN, #$0265|!FS_COLOR_BROWN, #$0274|!FS_COLOR_BROWN, #$0275|!FS_COLOR_BROWN ;FLUTE -dw #$0226|!FS_COLOR_BLUE, #$0227|!FS_COLOR_BLUE, #$0236|!FS_COLOR_BLUE, #$0237|!FS_COLOR_BLUE +dw #$0266|!FS_COLOR_BLUE, #$0267|!FS_COLOR_BLUE, #$0276|!FS_COLOR_BLUE, #$0277|!FS_COLOR_BLUE ;NET -dw #$0228|!FS_COLOR_YELLOW, #$0229|!FS_COLOR_YELLOW, #$0238|!FS_COLOR_YELLOW, #$0239|!FS_COLOR_YELLOW +dw #$0268|!FS_COLOR_YELLOW, #$0269|!FS_COLOR_YELLOW, #$0278|!FS_COLOR_YELLOW, #$0279|!FS_COLOR_YELLOW ;BOOK -dw #$022A|!FS_COLOR_GREEN, #$022B|!FS_COLOR_GREEN, #$023A|!FS_COLOR_GREEN, #$023B|!FS_COLOR_GREEN +dw #$026A|!FS_COLOR_GREEN, #$026B|!FS_COLOR_GREEN, #$027A|!FS_COLOR_GREEN, #$027B|!FS_COLOR_GREEN ;BOTTLE -dw #$0240|!FS_COLOR_BW, #$0241|!FS_COLOR_BW, #$0250|!FS_COLOR_BW, #$0251|!FS_COLOR_BW +dw #$0280|!FS_COLOR_BW, #$0281|!FS_COLOR_BW, #$0290|!FS_COLOR_BW, #$0291|!FS_COLOR_BW ;POTION -dw #$0242|!FS_COLOR_GREEN, #$0242|!FS_COLOR_GREEN|!FS_HFLIP, #$0252|!FS_COLOR_GREEN, #$0253|!FS_COLOR_GREEN +dw #$0282|!FS_COLOR_GREEN, #$0282|!FS_COLOR_GREEN|!FS_HFLIP, #$0292|!FS_COLOR_GREEN, #$0293|!FS_COLOR_GREEN ;CANE -dw #$021D|!FS_COLOR_RED, #$021E|!FS_COLOR_RED, #$022D|!FS_COLOR_RED, #$022E|!FS_COLOR_RED +dw #$025D|!FS_COLOR_RED, #$025E|!FS_COLOR_RED, #$026D|!FS_COLOR_RED, #$026E|!FS_COLOR_RED ;CAPE -dw #$0248|!FS_COLOR_RED, #$0249|!FS_COLOR_RED, #$0258|!FS_COLOR_RED, #$0259|!FS_COLOR_RED +dw #$0288|!FS_COLOR_RED, #$0289|!FS_COLOR_RED, #$0298|!FS_COLOR_RED, #$0299|!FS_COLOR_RED ;MIRROR -dw #$024A|!FS_COLOR_BLUE, #$024B|!FS_COLOR_BLUE, #$025A|!FS_COLOR_BLUE, #$025B|!FS_COLOR_BLUE +dw #$028A|!FS_COLOR_BLUE, #$028B|!FS_COLOR_BLUE, #$029A|!FS_COLOR_BLUE, #$029B|!FS_COLOR_BLUE ;BOOTS -dw #$024C|!FS_COLOR_BOOTS, #$024D|!FS_COLOR_BOOTS, #$025C|!FS_COLOR_BOOTS, #$025D|!FS_COLOR_BOOTS +dw #$028C|!FS_COLOR_BOOTS, #$028D|!FS_COLOR_BOOTS, #$029C|!FS_COLOR_BOOTS, #$029D|!FS_COLOR_BOOTS ;GLOVES -dw #$024E|!FS_COLOR_BROWN, #$024F|!FS_COLOR_BROWN, #$025E|!FS_COLOR_BROWN, #$025F|!FS_COLOR_BROWN +dw #$028E|!FS_COLOR_BROWN, #$028F|!FS_COLOR_BROWN, #$029E|!FS_COLOR_BROWN, #$029F|!FS_COLOR_BROWN ;FLIPPERS -dw #$020E|!FS_COLOR_BLUE, #$020F|!FS_COLOR_BLUE, #$021F|!FS_COLOR_BLUE|!FS_HFLIP, #$021F|!FS_COLOR_BLUE +dw #$024E|!FS_COLOR_BLUE, #$024F|!FS_COLOR_BLUE, #$025F|!FS_COLOR_BLUE|!FS_HFLIP, #$025F|!FS_COLOR_BLUE ;PEARL -dw #$0264|!FS_COLOR_RED, #$0265|!FS_COLOR_RED, #$0274|!FS_COLOR_RED, #$0275|!FS_COLOR_RED +dw #$02A4|!FS_COLOR_RED, #$02A5|!FS_COLOR_RED, #$02B4|!FS_COLOR_RED, #$02B5|!FS_COLOR_RED ;SHIELD -dw #$026D|!FS_COLOR_YELLOW, #$026E|!FS_COLOR_YELLOW, #$027D|!FS_COLOR_YELLOW, #$027E|!FS_COLOR_YELLOW +dw #$02AD|!FS_COLOR_YELLOW, #$02AE|!FS_COLOR_YELLOW, #$02BD|!FS_COLOR_YELLOW, #$02BE|!FS_COLOR_YELLOW ;TUNIC -dw #$026F|!FS_COLOR_GREEN, #$026F|!FS_COLOR_GREEN|!FS_HFLIP, #$027F|!FS_COLOR_GREEN, #$027F|!FS_COLOR_GREEN|!FS_HFLIP +dw #$02AF|!FS_COLOR_GREEN, #$02AF|!FS_COLOR_GREEN|!FS_HFLIP, #$02BF|!FS_COLOR_GREEN, #$02BF|!FS_COLOR_GREEN|!FS_HFLIP ;HEART -dw #$0281|!FS_COLOR_RED, #$0281|!FS_COLOR_RED|!FS_HFLIP, #$0291|!FS_COLOR_RED, #$0291|!FS_COLOR_RED|!FS_HFLIP +dw #$02C1|!FS_COLOR_RED, #$02C1|!FS_COLOR_RED|!FS_HFLIP, #$02D1|!FS_COLOR_RED, #$02D1|!FS_COLOR_RED|!FS_HFLIP ;MAP -dw #$0282|!FS_COLOR_YELLOW, #$0283|!FS_COLOR_YELLOW, #$0292|!FS_COLOR_YELLOW, #$0293|!FS_COLOR_YELLOW +dw #$02C2|!FS_COLOR_YELLOW, #$02C3|!FS_COLOR_YELLOW, #$02D2|!FS_COLOR_YELLOW, #$02D3|!FS_COLOR_YELLOW ;COMPASS -dw #$0284|!FS_COLOR_RED, #$0284|!FS_COLOR_RED|!FS_HFLIP, #$0294|!FS_COLOR_RED, #$0294|!FS_COLOR_RED|!FS_HFLIP +dw #$02C4|!FS_COLOR_RED, #$02C4|!FS_COLOR_RED|!FS_HFLIP, #$02D4|!FS_COLOR_RED, #$02D4|!FS_COLOR_RED|!FS_HFLIP ;KEY -dw #$022F|!FS_COLOR_YELLOW|!FS_HFLIP, #$022F|!FS_COLOR_YELLOW, #$023E|!FS_COLOR_YELLOW, #$023F|!FS_COLOR_YELLOW +dw #$026F|!FS_COLOR_YELLOW|!FS_HFLIP, #$026F|!FS_COLOR_YELLOW, #$027E|!FS_COLOR_YELLOW, #$027F|!FS_COLOR_YELLOW ;-------------------------------------------------------------------------------- FileSelect_PlayerSelectText_Top: ;db $60, $62, $00, $37 diff --git a/hashalphabethooks.asm b/hashalphabethooks.asm index 3bc9879..3838653 100644 --- a/hashalphabethooks.asm +++ b/hashalphabethooks.asm @@ -1,158 +1,130 @@ ;-------------------------------------------------------------------------------- -!FSTILE_SPACE = "$0188" +!FSTILE_SPACE = $0188 -!FSTILE_BRACKET_OPEN_TOP = "$1D8A" -!FSTILE_BRACKET_OPEN_BOTTOM = "$1D9A" +!FSTILE_BRACKET_OPEN_TOP = $1D8A +!FSTILE_BRACKET_OPEN_BOTTOM = $1D9A -!FSTILE_BRACKET_CLOSE_TOP = "$1D8B" -!FSTILE_BRACKET_CLOSE_BOTTOM = "$1D9B" +!FSTILE_BRACKET_CLOSE_TOP = $1D8B +!FSTILE_BRACKET_CLOSE_BOTTOM = $1D9B -!FSTILE_A_TOP = "$1D4A" -!FSTILE_A_BOTTOM = "$1D5A" +!FSTILE_A_TOP = $1D4A +!FSTILE_A_BOTTOM = $1D5A -!FSTILE_C_TOP = "$1D4C" -!FSTILE_C_BOTTOM = "$1D5C" +!FSTILE_C_TOP = $1D4C +!FSTILE_C_BOTTOM = $1D5C -!FSTILE_D_TOP = "$1D4D" -!FSTILE_D_BOTTOM = "$1D5D" +!FSTILE_D_TOP = $1D4D +!FSTILE_D_BOTTOM = $1D5D -!FSTILE_E_TOP = "$1D4E" -!FSTILE_E_BOTTOM = "$1D5E" +!FSTILE_E_TOP = $1D4E +!FSTILE_E_BOTTOM = $1D5E -!FSTILE_F_TOP = "$1D4F" -!FSTILE_F_BOTTOM = "$1D5F" +!FSTILE_F_TOP = $1D4F +!FSTILE_F_BOTTOM = $1D5F -!FSTILE_H_TOP = "$1D61" -!FSTILE_H_BOTTOM = "$1D71" +!FSTILE_H_TOP = $1D61 +!FSTILE_H_BOTTOM = $1D71 -!FSTILE_I_TOP = "$1D62" -!FSTILE_I_BOTTOM = "$1D72" +!FSTILE_I_TOP = $1D62 +!FSTILE_I_BOTTOM = $1D72 -!FSTILE_K_TOP = "$1D64" -!FSTILE_K_BOTTOM = "$1D74" +!FSTILE_K_TOP = $1D64 +!FSTILE_K_BOTTOM = $1D74 -!FSTILE_L_TOP = "$1D65" -!FSTILE_L_BOTTOM = "$1D75" +!FSTILE_L_TOP = $1D65 +!FSTILE_L_BOTTOM = $1D75 -!FSTILE_N_TOP = "$1D67" -!FSTILE_N_BOTTOM = "$1D77" +!FSTILE_N_TOP = $1D67 +!FSTILE_N_BOTTOM = $1D77 -!FSTILE_O_TOP = "$1D68" -!FSTILE_O_BOTTOM = "$1D78" +!FSTILE_O_TOP = $1D68 +!FSTILE_O_BOTTOM = $1D78 -!FSTILE_P_TOP = "$1D69" -!FSTILE_P_BOTTOM = "$1D79" +!FSTILE_P_TOP = $1D69 +!FSTILE_P_BOTTOM = $1D79 -!FSTILE_S_TOP = "$1D6C" -!FSTILE_S_BOTTOM = "$1D7C" +!FSTILE_S_TOP = $1D6C +!FSTILE_S_BOTTOM = $1D7C -!FSTILE_T_TOP = "$1D6D" -!FSTILE_T_BOTTOM = "$1D7D" +!FSTILE_T_TOP = $1D6D +!FSTILE_T_BOTTOM = $1D7D -!FSTILE_U_TOP = "$1D6E" -!FSTILE_U_BOTTOM = "$1D7E" +!FSTILE_U_TOP = $1D6E +!FSTILE_U_BOTTOM = $1D7E -!FSTILE_Y_TOP = "$1D82" -!FSTILE_Y_BOTTOM = "$1D92" +!FSTILE_Y_TOP = $1D82 +!FSTILE_Y_BOTTOM = $1D92 ;-------------------------------------------------------------------------------- -org $0CDE60 ; <- 65E60 +org $8CDE60 ; <- 65E60 FileSelect_CopyFile_Top: db $62, $A5, $00, $15 dw !FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE -;dw !FSTILE_C_TOP, !FSTILE_SPACE, !FSTILE_O_TOP, !FSTILE_SPACE, !FSTILE_P_TOP, !FSTILE_SPACE, !FSTILE_Y_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE -;dw $1CAC, !FSTILE_SPACE, $1D23, !FSTILE_SPACE, $1D89, !FSTILE_SPACE, $1D04, !FSTILE_SPACE, $1D89, !FSTILE_SPACE, $1D07 ;-------------------------------------------------------------------------------- -org $0CDE7A ; <- 65E7A +org $8CDE7A ; <- 65E7A FileSelect_CopyFile_Bottom: db $62, $C5, $00, $15 dw !FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE -;dw !FSTILE_C_BOTTOM, !FSTILE_SPACE, !FSTILE_O_BOTTOM, !FSTILE_SPACE, !FSTILE_P_BOTTOM, !FSTILE_SPACE, !FSTILE_Y_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE -;dw $1CBC, !FSTILE_SPACE, $1D33, !FSTILE_SPACE, $1D99, !FSTILE_SPACE, $1D14, !FSTILE_SPACE, $1D99, !FSTILE_SPACE, $1D17 ;-------------------------------------------------------------------------------- -org $0CDE94 ; <- 65E94 +org $8CDE94 ; <- 65E94 FileSelect_KillFile_Top: db $63, $25, $00, $19 dw !FSTILE_D_TOP, !FSTILE_E_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_T_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_F_TOP, !FSTILE_I_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE -;dw !FSTILE_D_TOP, !FSTILE_SPACE, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_T_TOP, !FSTILE_SPACE, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE -;dw !FSTILE_K_TOP, !FSTILE_SPACE, !FSTILE_I_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE -;dw !FSTILE_K_TOP, !FSTILE_SPACE, !FSTILE_I_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, $1D04, !FSTILE_SPACE, $1D89, !FSTILE_SPACE, $1D07 -;-------------------------------------------------------------------------------- -org $0CDEB2 ; <- 65EB2 + +org $8CDEB2 ; <- 65EB2 FileSelect_KillFile_Bottom: db $63, $45, $00, $19 dw !FSTILE_D_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_T_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_F_BOTTOM, !FSTILE_I_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE -;dw !FSTILE_D_BOTTOM, !FSTILE_SPACE, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_T_BOTTOM, !FSTILE_SPACE, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE -;dw !FSTILE_K_BOTTOM, !FSTILE_SPACE, !FSTILE_I_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE -;dw !FSTILE_K_BOTTOM, !FSTILE_SPACE, !FSTILE_I_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, $1D14, !FSTILE_SPACE, $1D99, !FSTILE_SPACE, $1D17 -;-------------------------------------------------------------------------------- -;org $0CDDE8 ; <- 65DE8 -;FileSelect_PlayerSelectText_Top: -;db $60, $62, $00, $37 -;db $8A, $1D, $88, $01, $69, $1D, $88, $01, $65, $1D, $88, $01, $4A, $1D, $88, $01 -;db $82, $1D, $88, $01, $4E, $1D, $88, $01, $6B, $1D, $88, $01, $88, $01, $6C, $1D -;db $88, $01, $4E, $1D, $88, $01, $65, $1D, $88, $01, $4E, $1D, $88, $01, $4C, $1D -;db $88, $01, $6D, $1D, $88, $01, $8B, $1D -;-------------------------------------------------------------------------------- -;org $0CDE24 ; <- 65E24 -;FileSelect_PlayerSelectText_Bottom: -;db $60, $82, $00, $37 -;db $9A, $1D, $88, $01, $79, $1D, $88, $01, $75, $1D, $88, $01, $5A, $1D, $88, $01 -;db $92, $1D, $88, $01, $5E, $1D, $88, $01, $7B, $1D, $88, $01, $88, $01, $7C, $1D -;db $88, $01, $5E, $1D, $88, $01, $75, $1D, $88, $01, $5E, $1D, $88, $01, $5C, $1D -;db $88, $01, $7D, $1D, $88, $01, $9B, $1D -;-------------------------------------------------------------------------------- + ;CopyFile_Header: -org $0CE228 ; <- 66228 +org $8CE228 ; <- 66228 dw !FSTILE_BRACKET_OPEN_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_C_TOP, !FSTILE_O_TOP, !FSTILE_P_TOP, !FSTILE_Y_TOP, !FSTILE_SPACE, !FSTILE_F_TOP, !FSTILE_I_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_BRACKET_CLOSE_TOP -org $0CE24A ; <- 6624A +org $8CE24A ; <- 6624A dw !FSTILE_BRACKET_OPEN_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_C_BOTTOM, !FSTILE_O_BOTTOM, !FSTILE_P_BOTTOM, !FSTILE_Y_BOTTOM, !FSTILE_SPACE, !FSTILE_F_BOTTOM, !FSTILE_I_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_BRACKET_CLOSE_BOTTOM ;CopyFile_Which: -org $0CE2DB ; <- 662DB +org $8CE2DB ; <- 662DB dw $0D80, $0D61, $0D62, $0D4C, $0D61, $0D86, !FSTILE_SPACE -org $0CE2ED ; <- 662ED +org $8CE2ED ; <- 662ED dw $0D90, $0D71, $0D72, $0D5C, $0D71, $0D96, !FSTILE_SPACE ;CopyFile_Where: -org $0CE39C ; <- 6639C +org $8CE39C ; <- 6639C dw $0D80, $0D61, $0D4E, $0D6B, $0D4E, $0D86, !FSTILE_SPACE -org $0CE3AE ; <- 663AE +org $8CE3AE ; <- 663AE dw $0D90, $0D71, $0D5E, $0D7B, $0D5E, $0D96, !FSTILE_SPACE ;CopyFile_Execute: -org $0CD13A ; <- 6513A +org $8CD13A ; <- 6513A dw !FSTILE_C_TOP, !FSTILE_SPACE, !FSTILE_O_TOP, !FSTILE_SPACE, !FSTILE_P_TOP, !FSTILE_SPACE, !FSTILE_Y_TOP, !FSTILE_SPACE, !FSTILE_SPACE -org $0CD150 ; <- 65150 +org $8CD150 ; <- 65150 dw !FSTILE_C_BOTTOM, !FSTILE_SPACE, !FSTILE_O_BOTTOM, !FSTILE_SPACE, !FSTILE_P_BOTTOM, !FSTILE_SPACE, !FSTILE_Y_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE ;CopyFile_Cancel: -org $0CE29A ; <- 6629A +org $8CE29A ; <- 6629A dw !FSTILE_C_TOP, !FSTILE_SPACE, !FSTILE_A_TOP, !FSTILE_SPACE, !FSTILE_N_TOP, !FSTILE_SPACE, !FSTILE_C_TOP, !FSTILE_SPACE, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE -org $0CE2BA ; <- 662BA +org $8CE2BA ; <- 662BA dw !FSTILE_C_BOTTOM, !FSTILE_SPACE, !FSTILE_A_BOTTOM, !FSTILE_SPACE, !FSTILE_N_BOTTOM, !FSTILE_SPACE, !FSTILE_C_BOTTOM, !FSTILE_SPACE, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE ;KillFile_Header: -org $0CE002 ; <- 66002 +org $8CE002 ; <- 66002 dw !FSTILE_BRACKET_OPEN_TOP, !FSTILE_SPACE, !FSTILE_D_TOP, !FSTILE_E_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_T_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_F_TOP, !FSTILE_I_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_BRACKET_CLOSE_TOP, !FSTILE_SPACE, !FSTILE_SPACE -org $0CE028 ; <- 66028 +org $8CE028 ; <- 66028 dw !FSTILE_BRACKET_OPEN_BOTTOM, !FSTILE_SPACE, !FSTILE_D_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_T_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_F_BOTTOM, !FSTILE_I_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_BRACKET_CLOSE_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE ;KillFile_Which: -org $0CE04E ; <- 6604E +org $8CE04E ; <- 6604E dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE -;dw $0D4D, $0D4E, $0D65, $0D4E, $0D6D, $0D4E, !FSTILE_SPACE, $0D80, $0D61, $0D62, $0D4C, $0D61, !FSTILE_SPACE, $0D4F, $0D62, $0D65, $0D4E, $0D86, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE -org $0CE084 ; <- 66084 +org $8CE084 ; <- 66084 dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE -;dw $0D5D, $0D5E, $0D75, $0D5E, $0D7D, $0D5E, !FSTILE_SPACE, $0D90, $0D71, $0D72, $0D5C, $0D71, !FSTILE_SPACE, $0D5F, $0D72, $0D75, $0D5E, $0D96, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE ;KillFile_Execute: -org $0CD328 ; <- 65328 +org $8CD328 ; <- 65328 dw !FSTILE_D_TOP, !FSTILE_E_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_T_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE -org $0CD344 ; <- 65344 +org $8CD344 ; <- 65344 dw !FSTILE_D_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_T_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE ;KillFile_Cancel: -org $0CE0BA ; <- 660BA +org $8CE0BA ; <- 660BA dw !FSTILE_C_TOP, !FSTILE_A_TOP, !FSTILE_N_TOP, !FSTILE_C_TOP, !FSTILE_E_TOP, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE -org $0CE0DA ; <- 660DA +org $8CE0DA ; <- 660DA dw !FSTILE_C_BOTTOM, !FSTILE_A_BOTTOM, !FSTILE_N_BOTTOM, !FSTILE_C_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE diff --git a/heartbeep.asm b/heartbeep.asm index e8f9bd1..64a8925 100644 --- a/heartbeep.asm +++ b/heartbeep.asm @@ -3,10 +3,10 @@ ;================================================================================ BeepLogic: LDA.l HeartBeep : BEQ + - STA $04CA - LDA.b #$2B : STA $012E + STA.w HeartBeepTimer + LDA.b #$2B : STA.w SFX2 RTL + - LDA.b #$FF : STA $04CA + LDA.b #$FF : STA.w HeartBeepTimer RTL -;================================================================================ \ No newline at end of file +;================================================================================ diff --git a/heartpieces.asm b/heartpieces.asm index d714d77..434ccd0 100644 --- a/heartpieces.asm +++ b/heartpieces.asm @@ -2,194 +2,147 @@ ; Randomize Heart Pieces ;-------------------------------------------------------------------------------- HeartPieceGet: - PHX : PHY - LDY $0E80, X ; load item value into Y register - BNE + - ; if for any reason the item value is 0 reload it, just in case - JSL.l LoadHeartPieceRoomValue : TAY - + - JSL.l MaybeMarkDigSpotCollected - - .skipLoad - - JSL.l HeartPieceGetPlayer : STA !MULTIWORLD_ITEM_PLAYER_ID - - STZ $02E9 ; 0 = Receiving item from an NPC or message - - CPY.b #$26 : BNE .notHeart ; don't add a 1/4 heart if it's not a heart piece - LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE .notHeart - LDA HeartPieceQuarter : INC A : AND.b #$03 : STA HeartPieceQuarter : BNE .unfinished_heart ; add up heart quarters - BRA .giveItem - - .notHeart - - .giveItem - JSL.l $0791B3 ; Player_HaltDashAttackLong - JSL.l Link_ReceiveItem - CLC ; return false - JMP .done ; finished - - .unfinished_heart - SEC ; return true - .done - + PHX : PHY + JSL LoadHeartPieceRoomValue + JSL AttemptItemSubstitution + JSL ResolveLootIDLong + TAY + JSL MaybeMarkDigSpotCollected + .skipLoad + JSL HeartPieceGetPlayer : STA.l !MULTIWORLD_ITEM_PLAYER_ID + CPY.b #$26 : BNE .not_heart ; don't add a 1/4 heart if it's not a heart piece + LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .not_heart + LDA.l HeartPieceQuarter : INC A : AND.b #$03 : STA.l HeartPieceQuarter + .not_heart + JSL Player_HaltDashAttackLong + STZ.w ItemReceiptMethod ; 0 = Receiving item from an NPC or message + JSL Link_ReceiveItem JSL MaybeUnlockTabletAnimation - - PLY : PLX + + PLY : PLX RTL ;-------------------------------------------------------------------------------- HeartContainerGet: - PHX : PHY - JSL.l AddInventory_incrementBossSwordLong - LDY $0E80, X ; load item value into Y register - BNE + - ; if for any reason the item value is 0 reload it, just in case - JSL.l LoadHeartContainerRoomValue : TAY - + - - BRA HeartPieceGet_skipLoad + PHX : PHY + JSL IncrementBossSword + LDY.w SpriteID, X : BNE + + JSL LoadHeartContainerRoomValue : TAY + + + BRA HeartPieceGet_skipLoad ;-------------------------------------------------------------------------------- DrawHeartPieceGFX: - PHP - JSL.l Sprite_IsOnscreen : BCC .offscreen - - PHA : PHY - LDA.w !SPRITE_REDRAW, X : BEQ .skipInit ; skip init if already ready - JSL.l HeartPieceSpritePrep - LDA.w !SPRITE_REDRAW, X : CMP.b #$02 : BEQ .skipInit - BRA .done ; don't draw on the init frame - - .skipInit - LDA $0E80, X ; Retrieve stored item type - - .skipLoad - JSL DrawSlottedTile : BCS .done - ; draw shadow - CMP #$03 : BNE + - INC.b $00 : INC.b $00 : INC.b $00 : INC.b $00 ; move narrow sprite shadow over 4 pixels - PHA : LDA $0E60, X : ORA.b #$20 : STA $0E60, X : PLA - + - JSL.l Sprite_DrawShadowLong - - .done - PLY : PLA - .offscreen - PLP + PHP + JSL Sprite_IsOnscreen : BCC .offscreen + PHA : PHY + LDA.w SprRedrawFlag, X : BEQ .skipInit ; skip init if already ready + JSL HeartPieceSpritePrep + LDA.w SprRedrawFlag, X : CMP.b #$02 : BEQ .skipInit + BRA .done ; don't draw on the init frame + .skipInit + LDA.w SpriteID, X ; Retrieve stored item type + .skipLoad + PHA : PHX + TAX + LDA.l SpriteProperties_standing_width,X : BNE + + PLX + LDA.w SpriteControl, X : ORA.b #$20 : STA.w SpriteControl, X + PLA + JSL DrawPotItem + LDA.b Scrap00 : CLC : ADC.b #$04 : STA.b Scrap00 + JSL Sprite_DrawShadowLong + BRA .done + + + PLX + PLA + JSL DrawPotItem + JSL Sprite_DrawShadowLong + .done + PLY : PLA + .offscreen + PLP RTL ;-------------------------------------------------------------------------------- DrawHeartContainerGFX: PHP - JSL.l Sprite_IsOnscreen : BCC DrawHeartPieceGFX_offscreen + JSL Sprite_IsOnscreen : BCC DrawHeartPieceGFX_offscreen PHA : PHY - LDA.w !SPRITE_REDRAW, X : BEQ .skipInit ; skip init if already ready - JSL.l HeartContainerSpritePrep + LDA.w SprRedrawFlag, X : BEQ .skipInit ; skip init if already ready + JSL HeartContainerSpritePrep + LDA.w SprRedrawFlag, X : CMP.b #$02 : BEQ .skipInit BRA DrawHeartPieceGFX_done ; don't draw on the init frame .skipInit - BRA DrawHeartPieceGFX_skipInit + LDA.w SpriteID, X ; Retrieve stored item type + + BRA DrawHeartPieceGFX_skipLoad ;-------------------------------------------------------------------------------- HeartContainerSound: - LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE + - CPY.b #$20 : BEQ + ; Skip for Crystal - CPY.b #$37 : BEQ + ; Skip for Pendants - CPY.b #$38 : BEQ + - CPY.b #$39 : BEQ + - JSL.l CheckIfBossRoom : BCC + ; Skip if not in a boss room - LDA.b #$2E - SEC - RTL + LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE + + LDA.w ItemReceiptMethod : CMP.b #$03 : BEQ + + JSL CheckIfBossRoom : BCC + ; Skip if not in a boss room + LDA.b #$2E + SEC + RTL + CLC RTL ;-------------------------------------------------------------------------------- NormalItemSkipSound: - LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ + - SEC - RTL - + - - LDA $0C5E, X ; thing we wrote over - - CPY.b #$20 : BEQ + ; Skip for Crystal - CPY.b #$37 : BEQ + ; Skip for Pendants - CPY.b #$38 : BEQ + - CPY.b #$39 : BEQ + - - PHA - JSL.l CheckIfBossRoom - PLA +; Out: c - skip sounds if set + LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .skip + JSL CheckIfBossRoom : BCS .boss_room + TDC + CPY.b #$17 : BEQ .skip + CLC RTL - + - CLC -RTL -;-------------------------------------------------------------------------------- -HeartUpgradeSpawnDecision: ; this should return #$00 to make the hp spawn - LDA.l !FORCE_HEART_SPAWN : BEQ .bonk_prize_check - - LDA.b #$00 : STA.l !FORCE_HEART_SPAWN -RTL - .bonk_prize_check - PHX - LDA.b 5,S : TAX : LDA.w $0ED0, X : BEQ .normal_behavior-1 - PLX - LDA.b #$00 -RTL - PLX - .normal_behavior - LDA.l OverworldEventDataWRAM, X -RTL -;-------------------------------------------------------------------------------- -SaveHeartCollectedStatus: - LDA !SKIP_HEART_SAVE : BEQ .save_flag - - LDA #$00 : STA !SKIP_HEART_SAVE -RTL - - .save_flag - LDA 4,S : TAY : LDA $0ED0,Y : BEQ .normal_behavior - PHA - LDA OverworldEventDataWRAM, X : ORA 1,S : STA OverworldEventDataWRAM, X - PLA -RTL - - .normal_behavior - LDA OverworldEventDataWRAM, X : ORA.b #$40 : STA OverworldEventDataWRAM, X + .boss_room + LDA.w ItemReceiptMethod : CMP.b #$03 : BEQ + + .skip + SEC + RTL + + + LDA.b #$20 + .dont_skip + CLC RTL ;-------------------------------------------------------------------------------- HeartPieceSpritePrep: - PHA - - LDA ServerRequestMode : BEQ + : : + - - LDA.b #$01 : STA.w !SPRITE_REDRAW, X - JSL.l HeartPieceGetPlayer : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID - JSL.l LoadHeartPieceRoomValue ; load item type - STA $0E80, X ; Store item type - JSL.l RequestSlottedTile - - .skip - PLA + PHA + + LDA.l ServerRequestMode : BEQ + : : + + + JSL HeartPieceGetPlayer : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID + JSL LoadHeartPieceRoomValue + JSL AttemptItemSubstitution + JSL ResolveLootIDLong + STA.w SpriteID, X + JSL RequestStandingItemVRAMSlot + + .skip + PLA RTL ;-------------------------------------------------------------------------------- HeartContainerSpritePrep: - PHA - - JSL.l HeartPieceGetPlayer : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID - JSL.l LoadHeartContainerRoomValue ; load item type - STA $0E80, X ; Store item type - JSL.l RequestSlottedTile - - PLA + PHA + + JSL HeartPieceGetPlayer : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID + JSL LoadHeartContainerRoomValue ; load item type + JSL AttemptItemSubstitution + JSL ResolveLootIDLong + STA.w SpriteID, X + JSL RequestStandingItemVRAMSlot + + PLA RTL ;-------------------------------------------------------------------------------- LoadHeartPieceRoomValue: - LDA $1B : BEQ .outdoors ; check if we're indoors or outdoors + LDA.b IndoorsFlag : BEQ .outdoors ; check if we're indoors or outdoors .indoors - JSL.l LoadIndoorValue + JSL LoadIndoorValue JMP .done .outdoors - JSL.l LoadOutdoorValue + JSL LoadOutdoorValue .done RTL ;-------------------------------------------------------------------------------- @@ -197,30 +150,30 @@ RTL !DynamicDropGFXSlotCount_OW = (FreeOWGraphics_end-FreeOWGraphics)>>1 HPItemReset: PHA - LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE .skip + LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .skip PLA - JSL $09AD58 ; GiveRupeeGift - thing we wrote over + JSL GiveRupeeGift ; thing we wrote over BRA .done .skip PLA .done PHA : PHY LDY.b #$0F - - LDA.w $0DD0,Y : BEQ + - LDA.w !SPRITE_REDRAW, Y : CMP.b #$02 : BNE + + - LDA.w SpriteAITable,Y : BEQ + + LDA.w SprRedrawFlag, Y : CMP.b #$02 : BNE + ; attempt redraw of any sprite using the overflow slot - LDA.b #$01 : STA.w !SPRITE_REDRAW, Y + LDA.b #$01 : STA.w SprRedrawFlag, Y + DEY : BPL - PLY : PLA RTL ;-------------------------------------------------------------------------------- MaybeMarkDigSpotCollected: PHA : PHP - LDA $1B : BNE + + LDA.b IndoorsFlag : BNE + REP #$20 ; set 16-bit accumulator - LDA $8A + LDA.b OverworldIndex CMP.w #$2A : BNE + - LDA HasGroveItem : ORA.w #$0001 : STA HasGroveItem + LDA.l HasGroveItem : ORA.w #$0001 : STA.l HasGroveItem + PLP : PLA RTL @@ -228,25 +181,25 @@ RTL HeartPieceSpawnDelayFix: JSL Sprite_DrawRippleIfInWater ; Fix the delay when spawning a HeartPiece sprite - JSL.l Sprite_CheckIfPlayerPreoccupied : BCS + ; what we moved from $05F037 - JSL.l Sprite_CheckDamageToPlayerSameLayerLong : RTL ; what we wrote over + JSL Sprite_CheckIfPlayerPreoccupied : BCS + ; what we moved from $05F037 + JSL Sprite_CheckDamageToPlayerSameLayerLong : RTL ; what we wrote over + CLC : RTL ;-------------------------------------------------------------------------------- macro GetPossiblyEncryptedItem(ItemLabel,TableLabel) - LDA IsEncrypted : BNE ?encrypted + LDA.l IsEncrypted : BNE ?encrypted LDA.l BRA ?done ?encrypted: PHX : PHP REP #$30 ; set 16-bit accumulator & index registers - LDA $00 : PHA : LDA $02 : PHA + LDA.b Scrap00 : PHA : LDA.b Scrap02 : PHA - LDA.w # : STA $00 - LDA.w #>>16 : STA $02 + LDA.w # : STA.b Scrap00 + LDA.w #>>16 : STA.b Scrap02 LDA.w #- JSL RetrieveValueFromEncryptedTable - PLX : STX $02 : PLX : STX $00 + PLX : STX.b Scrap02 : PLX : STX.b Scrap01 PLP : PLX ?done: endmacro @@ -254,7 +207,7 @@ endmacro LoadIndoorValue: PHP REP #$20 ; set 16-bit accumulator - LDA $A0 ; these are all decimal because i got them that way + LDA.b RoomIndex ; these are all decimal because i got them that way CMP.w #225 : BNE + %GetPossiblyEncryptedItem(HeartPiece_Forest_Thieves, HeartPieceIndoorValues) JMP .done @@ -265,7 +218,7 @@ LoadIndoorValue: %GetPossiblyEncryptedItem(HeartPiece_Spectacle_Cave, HeartPieceIndoorValues) JMP .done + CMP.w #283 : BNE + - LDA $22 : XBA : AND.w #$0001 ; figure out where link is + LDA.b LinkPosX : XBA : AND.w #$0001 ; figure out where link is BNE ++ %GetPossiblyEncryptedItem(HeartPiece_Circle_Bushes, HeartPieceIndoorValues) JMP .done @@ -282,10 +235,13 @@ LoadIndoorValue: %GetPossiblyEncryptedItem(HeartPiece_Smith_Pegs, HeartPieceIndoorValues) JMP .done + CMP.w #135 : BNE + - LDA StandingKey_Hera + LDA.l StandingKey_Hera JMP .done + - LDA.w #$0017 ; default to a normal hp + PHX + LDX.w CurrentSpriteSlot ; If we're on a different screen ID via glitches load the sprite + LDA.w SpriteID,X ; we can see and are interacting with + PLX .done AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before PLP @@ -302,33 +258,33 @@ RTL LoadOutdoorValue: PHP REP #$20 ; set 16-bit accumulator - LDA $8A + LDA.b OverworldIndex CMP.w #$00 : BNE + LDA.l OWBonkPrizeTable[$00].loot JMP .done + CMP.w #$03 : BNE + - LDA $22 : CMP.w #1890 : !BLT ++ + LDA.b LinkPosX : CMP.w #1890 : !BLT ++ %GetPossiblyEncryptedItem(HeartPiece_Spectacle, HeartPieceOutdoorValues) JMP .done ++ %GetPossiblyEncryptedItem(EtherItem, SpriteItemValues) JMP .done + CMP.w #$05 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$01].loot JMP .done ++ %GetPossiblyEncryptedItem(HeartPiece_Mountain_Warp, HeartPieceOutdoorValues) JMP .done + CMP.w #$0A : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$02].loot JMP .done ++ LDA.l OWBonkPrizeTable[$03].loot JMP .done + CMP.w #$10 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$04].loot JMP .done ++ @@ -341,28 +297,28 @@ LoadOutdoorValue: LDA.l OWBonkPrizeTable[$07].loot JMP .done + CMP.w #$13 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$08].loot JMP .done ++ LDA.l OWBonkPrizeTable[$09].loot JMP .done + CMP.w #$15 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$0A].loot JMP .done ++ LDA.l OWBonkPrizeTable[$0B].loot JMP .done + CMP.w #$18 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$0C].loot JMP .done ++ LDA.l OWBonkPrizeTable[$0D].loot JMP .done + CMP.w #$1A : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$0E].loot JMP .done ++ @@ -381,7 +337,7 @@ LoadOutdoorValue: %GetPossiblyEncryptedItem(HeartPiece_Maze, HeartPieceOutdoorValues) JMP .done + CMP.w #$2A : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$13].loot JMP .done ++ CMP.w #$0008 : BNE ++ @@ -394,21 +350,21 @@ LoadOutdoorValue: LDA.l OWBonkPrizeTable[$15].loot JMP .done + CMP.w #$2E : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$16].loot JMP .done ++ LDA.l OWBonkPrizeTable[$17].loot JMP .done + CMP.w #$30 : BNE + - LDA $22 : CMP.w #512 : !BGE ++ + LDA.b LinkPosX : CMP.w #512 : !BGE ++ %GetPossiblyEncryptedItem(HeartPiece_Desert, HeartPieceOutdoorValues) JMP .done ++ %GetPossiblyEncryptedItem(BombosItem, SpriteItemValues) JMP .done + CMP.w #$32 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$18].loot JMP .done ++ @@ -421,7 +377,7 @@ LoadOutdoorValue: %GetPossiblyEncryptedItem(HeartPiece_Swamp, HeartPieceOutdoorValues) JMP .done + CMP.w #$42 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$1A].loot JMP .done ++ @@ -431,14 +387,14 @@ LoadOutdoorValue: %GetPossiblyEncryptedItem(HeartPiece_Cliffside, HeartPieceOutdoorValues) JMP .done + CMP.w #$51 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$1B].loot JMP .done ++ LDA.l OWBonkPrizeTable[$1C].loot JMP .done + CMP.w #$54 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$1D].loot JMP .done ++ CMP.w #$0008 : BNE ++ @@ -448,7 +404,7 @@ LoadOutdoorValue: LDA.l OWBonkPrizeTable[$1F].loot JMP .done + CMP.w #$55 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$20].loot JMP .done ++ @@ -458,7 +414,7 @@ LoadOutdoorValue: LDA.l OWBonkPrizeTable[$22].loot JMP .done + CMP.w #$5B : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$23].loot JMP .done ++ @@ -471,7 +427,7 @@ LoadOutdoorValue: %GetPossiblyEncryptedItem(HeartPiece_Digging, HeartPieceOutdoorValues) JMP .done + CMP.w #$6E : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$25].loot JMP .done ++ CMP.w #$0008 : BNE ++ @@ -487,7 +443,10 @@ LoadOutdoorValue: %GetPossiblyEncryptedItem(HeartPiece_Zora, HeartPieceOutdoorValues) JMP .done + - LDA.w #$0017 ; default to a normal hp + PHX + LDX.w CurrentSpriteSlot ; If we're on a different screen ID via glitches load the sprite + LDA.w SpriteID,X ; we can see and are interacting with. + PLX .done AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before PLP @@ -509,7 +468,7 @@ LoadHeartContainerRoomValue: LoadBossValue: PHP REP #$20 ; set 16-bit accumulator - LDA $A0 ; these are all decimal because i got them that way + LDA.b RoomIndex ; these are all decimal because i got them that way CMP.w #200 : BNE + %GetPossiblyEncryptedItem(HeartContainer_ArmosKnights, HeartContainerBossValues) JMP .done @@ -552,7 +511,7 @@ CheckIfBossRoom: ; Carry set if we're in a boss room, unset otherwise. ;-------------------------------------------------------------------------------- REP #$20 ; set 16-bit accumulator - LDA $A0 ; these are all decimal because i got them that way + LDA.b RoomIndex ; these are all decimal because i got them that way CMP.w #200 : BEQ .done CMP.w #51 : BEQ .done CMP.w #7 : BEQ .done @@ -582,22 +541,22 @@ RTL ;#13 - Ganon's Tower - Agahnim II ;#0 - Pyramid of Power - Ganon ;-------------------------------------------------------------------------------- -;JSL $06DD40 ; DashKey_Draw -;JSL $06DBF8 ; Sprite_PrepAndDrawSingleLargeLong -;JSL $06DC00 ; Sprite_PrepAndDrawSingleSmallLong ; draw first cell correctly -;JSL $00D51B ; GetAnimatedSpriteTile -;JSL $00D52D ; GetAnimatedSpriteTile.variable +;JSL $86DD40 ; DashKey_Draw +;JSL $86DBF8 ; Sprite_PrepAndDrawSingleLargeLong +;JSL $86DC00 ; Sprite_PrepAndDrawSingleSmallLong ; draw first cell correctly +;JSL $80D51B ; GetAnimatedSpriteTile +;JSL $80D52D ; GetAnimatedSpriteTile.variable ;================================================================================ HeartPieceGetPlayer: { PHY - LDA $1B : BNE + + LDA.b IndoorsFlag : BNE + BRL .outdoors + PHP REP #$20 ; set 16-bit accumulator - LDA $A0 ; these are all decimal because i got them that way + LDA.b RoomIndex ; these are all decimal because i got them that way CMP.w #135 : BNE + LDA StandingKey_Hera_Player BRL .done @@ -641,7 +600,7 @@ HeartPieceGetPlayer: LDA HeartPiece_Spectacle_Cave_Player BRL .done + CMP.w #283 : BNE + - LDA $22 : XBA : AND.w #$0001 ; figure out where link is + LDA.b LinkPosX : XBA : AND.w #$0001 ; figure out where link is BNE ++ LDA HeartPiece_Circle_Bushes_Player BRL .done @@ -663,33 +622,33 @@ HeartPieceGetPlayer: .outdoors PHP REP #$20 ; set 16-bit accumulator - LDA $8A + LDA.b OverworldIndex CMP.w #$00 : BNE + LDA.l OWBonkPrizeTable[$00].mw_player BRL .done + CMP.w #$03 : BNE + - LDA $22 : CMP.w #1890 : !BLT ++ + LDA.b LinkPosX : CMP.w #1890 : !BLT ++ LDA HeartPiece_Spectacle_Player BRL .done ++ LDA EtherItem_Player BRL .done + CMP.w #$05 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$01].mw_player BRL .done ++ LDA HeartPiece_Mountain_Warp_Player BRL .done + CMP.w #$0A : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$02].mw_player BRL .done ++ LDA.l OWBonkPrizeTable[$03].mw_player BRL .done + CMP.w #$10 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$04].mw_player BRL .done ++ @@ -702,28 +661,28 @@ HeartPieceGetPlayer: LDA.l OWBonkPrizeTable[$07].mw_player BRL .done + CMP.w #$13 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$08].mw_player BRL .done ++ LDA.l OWBonkPrizeTable[$09].mw_player BRL .done + CMP.w #$15 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$0A].mw_player BRL .done ++ LDA.l OWBonkPrizeTable[$0B].mw_player BRL .done + CMP.w #$18 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$0C].mw_player BRL .done ++ LDA.l OWBonkPrizeTable[$0D].mw_player BRL .done + CMP.w #$1A : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$0E].mw_player BRL .done ++ @@ -742,7 +701,7 @@ HeartPieceGetPlayer: LDA HeartPiece_Maze_Player BRL .done + CMP.w #$2A : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$14].mw_player BRL .done ++ CMP.w #$0008 : BNE ++ @@ -755,21 +714,21 @@ HeartPieceGetPlayer: LDA.l OWBonkPrizeTable[$16].mw_player BRL .done + CMP.w #$2E : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$17].mw_player BRL .done ++ LDA.l OWBonkPrizeTable[$18].mw_player BRL .done + CMP.w #$30 : BNE + - LDA $22 : CMP.w #512 : !BGE ++ + LDA.b LinkPosX : CMP.w #512 : !BGE ++ LDA HeartPiece_Desert_Player BRL .done ++ LDA BombosItem_Player BRL .done + CMP.w #$32 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$19].mw_player BRL .done ++ @@ -782,7 +741,7 @@ HeartPieceGetPlayer: LDA HeartPiece_Swamp_Player BRL .done + CMP.w #$42 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$1B].mw_player BRL .done ++ @@ -792,14 +751,14 @@ HeartPieceGetPlayer: LDA HeartPiece_Cliffside_Player BRL .done + CMP.w #$51 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$1C].mw_player BRL .done ++ LDA.l OWBonkPrizeTable[$1D].mw_player BRL .done + CMP.w #$54 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$1E].mw_player BRL .done ++ CMP.w #$0008 : BNE ++ @@ -809,7 +768,7 @@ HeartPieceGetPlayer: LDA.l OWBonkPrizeTable[$20].mw_player BRL .done + CMP.w #$55 : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$21].mw_player BRL .done ++ @@ -819,7 +778,7 @@ HeartPieceGetPlayer: LDA.l OWBonkPrizeTable[$23].mw_player BRL .done + CMP.w #$5B : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$24].mw_player BRL .done ++ @@ -832,7 +791,7 @@ HeartPieceGetPlayer: LDA HeartPiece_Digging_Player BRL .done + CMP.w #$6E : BNE + - LDA.w $0ED0,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ + LDA.w SpriteSpawnStep,X : AND.w #$00FF : CMP.w #$0010 : BNE ++ LDA.l OWBonkPrizeTable[$26].mw_player BRL .done ++ CMP.w #$0008 : BNE ++ @@ -861,15 +820,15 @@ HeartPieceSetRedraw: PHY LDY.b #$0F .next - LDA.w $0DD0,Y : BEQ ++ - LDA.w $0E20,Y : CMP.b #$EB : BEQ + ; heart piece + LDA.w SpriteAITable,Y : BEQ ++ + LDA.w SpriteTypeTable,Y : CMP.b #$EB : BEQ + ; heart piece CMP.b #$E4 : BEQ + ; enemy key drop CMP.b #$3B : BEQ + ; bonk item (book/key) CMP.b #$E5 : BEQ + ; enemy big key drop CMP.b #$E7 : BEQ + ; mushroom item CMP.b #$E9 : BEQ + ; powder item BRA ++ - + LDA.b #$01 : STA.w !SPRITE_REDRAW,Y + + LDA.b #$01 : STA.w SprRedrawFlag,Y ++ DEY : BPL .next PLY RTL @@ -877,15 +836,15 @@ HeartPieceGetRedraw: PHY LDY.b #$0F .next - LDA.w $0DD0,Y : BEQ ++ - LDA.w $0E20,Y : CMP.b #$EB : BEQ + ; heart piece + LDA.w SpriteAITable,Y : BEQ ++ + LDA.w SpriteTypeTable,Y : CMP.b #$EB : BEQ + ; heart piece CMP.b #$E4 : BEQ + ; enemy key drop CMP.b #$3B : BEQ + ; bonk item (book/key) CMP.b #$E5 : BEQ + ; enemy big key drop CMP.b #$E7 : BEQ + ; mushroom item CMP.b #$E9 : BEQ + ; powder item BRA ++ - + LDA.w !SPRITE_REDRAW,Y : BEQ ++ + + LDA.w SprRedrawFlag,Y : BEQ ++ PLY : SEC : RTL ++ DEY : BPL .next PLY diff --git a/util/utils.asm b/hextodec.asm similarity index 78% rename from util/utils.asm rename to hextodec.asm index 32ae59f..a45a540 100644 --- a/util/utils.asm +++ b/hextodec.asm @@ -1,31 +1,116 @@ -HexToDec4Digit_fast: - LDY.b #$00 - - - CMP.w #1000 : !BLT + - INY - SBC.w #1000 : BRA - - + - STY $04 - JSR hex_to_dec_fast -RTL - -HexToDec_fast: - JSR hex_to_dec_fast -RTL - -hex_to_dec_fast: +;=================================================================================================== +; New file because of the enormous table +;=================================================================================================== +;-------------------------------------------------------------------------------- +; HexToDec +; in: A(w) - Word to Convert +; out: HexToDecDigit1 - HexToDecDigit5 (high - low) +;-------------------------------------------------------------------------------- +HexToDec: PHP - REP #$30 - ASL : TAX - LDA.l hex_to_dec_fast_table,X - TAY : XBA : AND.w #$000F : STA.b $05 - TYA : AND.w #$00F0 : LSR #4 : STA.b $06 - TYA : AND.w #$000F : STA.b $07 + REP #$30 + PHX + PHA + + CMP.w #1000 + BCS .over_1000 + + ASL + TAX + + LDA.l FastHexTable,X + + SEP #$20 + + AND.b #$0F + STA.l HexToDecDigit5 + + LDA.l FastHexTable,X + LSR + LSR + LSR + LSR + STA.l HexToDecDigit4 + + XBA + AND.b #$0F + STA.l HexToDecDigit3 + + REP #$20 + + LDA.l #$0000 + STA.l HexToDecDigit1 + + PLA + PLX PLP -RTS + RTL +;--------------------------------------------------------------------------------------------------- -hex_to_dec_fast_table: +.over_1000 + ; get remainder mod100 + STA.l $4204 + + SEP #$20 + LDA.b #100 + STA.l $4206 + + PHD + PLD + REP #$20 + XBA + LDA.l $4216 + AND.w #$7F + ASL + TAX + + SEP #$20 + LDA.l FastHexTable,X + AND.b #$0F + STA.l HexToDecDigit5 + + LDA.l FastHexTable,X + AND.b #$F0 + LSR + LSR + LSR + LSR + STA.l HexToDecDigit4 + + REP #$20 + + LDA.l $4214 + ASL + TAX + + LDA.l FastHexTable,X + + SEP #$20 + + AND.b #$0F + STA.l HexToDecDigit3 + + LDA.l FastHexTable,X + LSR + LSR + LSR + LSR + STA.l HexToDecDigit2 + + XBA + AND.b #$0F + STA.l HexToDecDigit1 + + REP #$20 + PLA + PLX + PLP + RTL + +;=================================================================================================== + +FastHexTable: dw $000, $001, $002, $003, $004, $005, $006, $007, $008, $009 dw $010, $011, $012, $013, $014, $015, $016, $017, $018, $019 dw $020, $021, $022, $023, $024, $025, $026, $027, $028, $029 @@ -125,4 +210,6 @@ hex_to_dec_fast_table: dw $960, $961, $962, $963, $964, $965, $966, $967, $968, $969 dw $970, $971, $972, $973, $974, $975, $976, $977, $978, $979 dw $980, $981, $982, $983, $984, $985, $986, $987, $988, $989 - dw $990, $991, $992, $993, $994, $995, $996, $997, $998, $999 \ No newline at end of file + dw $990, $991, $992, $993, $994, $995, $996, $997, $998, $999 + +;=================================================================================================== \ No newline at end of file diff --git a/hooks.asm b/hooks.asm index 8279aca..31e1031 100755 --- a/hooks.asm +++ b/hooks.asm @@ -1,50 +1,53 @@ -org $078102 ; no idea where that is, ask zarby +org $878102 ; no idea where that is, ask zarby JSL GetMultiworldItem -org $01EC07 ; Dungeon_OpenKeyedObject .nextChest : LDA Dungeon_ChestData+2, X -JSL.l Multiworld_OpenKeyedObject +org $81EC07 ; Dungeon_OpenKeyedObject .nextChest : LDA Dungeon_ChestData+2, X +JSL Multiworld_OpenKeyedObject ;================================================================================ ; Init Hook +; this needs to be a JML, otherwise we're not using fast ROM when we return ;-------------------------------------------------------------------------------- -org $00802F ; <- 2F - Bank00.asm : 45 -JSL.l Init_Primary +org $80802F +JML Init_Primary NOP -org $0CC1AC ; <- 63 D4 00 - Bank0C.asm:8 (dl Tagalong_LoadGfx) +ReturnFromInit: + +org $8CC1AC ; <- 63 D4 00 - Bank0C.asm:8 (dl Tagalong_LoadGfx) dl Init_PostRAMClear ;-------------------------------------------------------------------------------- ;================================================================================ ; Frame Hook ;-------------------------------------------------------------------------------- -org $008056 ; <- 56 - Bank00.asm : 77 -JSL.l FrameHookAction +org $808056 ; <- 56 - Bank00.asm : 77 +JSL FrameHookAction ;-------------------------------------------------------------------------------- -org $00805D +org $80805D JML HandleOneMindController ;================================================================================ ; NMI Hook ;-------------------------------------------------------------------------------- -org $0080CC ; <- CC - Bank00.asm : 164 (PHA : PHX : PHY : PHD : PHB) -JML.l NMIHookAction -org $0080D0 ; <- D0 - Bank00.asm : 164 (PHA : PHX : PHY : PHD : PHB) -NMIHookReturn: +org $8080CC ; <- CC - Bank00.asm : 164 (PHA : PHX : PHY : PHD : PHB) +JML NMIHookAction + +NMIHookReturn = $8080D0 ;-------------------------------------------------------------------------------- -org $00821B ; <- 21B - Bank00.asm : 329 (LDA $13 : STA $2100) -JML.l PostNMIHookAction : NOP +org $80821B ; <- 21B - Bank00.asm : 329 (LDA $13 : STA $2100) +JML PostNMIHookAction : NOP PostNMIHookReturn: ;-------------------------------------------------------------------------------- -org $008F6C +org $808F6C JSL PostNMIUpdateBGCharHalf : NOP ;-------------------------------------------------------------------------------- ;================================================================================ ; Anti-ZSNES Hook ;-------------------------------------------------------------------------------- -org $008023 ;<- 23 - Bank00.asm : 36 (LDA.w #$01FF : TCS) -JML.l CheckZSNES +org $808023 ;<- 23 - Bank00.asm : 36 (LDA.w #$01FF : TCS) +JML CheckZSNES ReturnCheckZSNES: ;-------------------------------------------------------------------------------- @@ -54,222 +57,236 @@ ReturnCheckZSNES: ; For maximum security of vanilla behavior, I am reserving this space ; that could otherwise be considered free ROM. ;-------------------------------------------------------------------------------- -org $0089C2 +org $8089C2 dw $FFFF, $FFFF, $FFFF, $FFFF dw $FFFF, $FFFF, $FFFF, $FFFF dw $FFFF, $FFFF, $FFFF, $FFFF +;=================================================================================================== +; fastrom interrupts +;=================================================================================================== +org $00FFEA : dw NMIBounce +org $00FFEE : dw IRQBounce + +org $8098AB +NMIBounce: JML Interrupt_NMI +IRQBounce: JML Interrupt_IRQ +warnpc $8098C0 + ;================================================================================ ; BSOD for BRK and COP opcodes ;-------------------------------------------------------------------------------- -org $00FFB7 +org $80FFB7 SoftwareInterrupt: JML Crashed -org $00FFE4 : dw SoftwareInterrupt -org $00FFE6 : dw SoftwareInterrupt -org $00FFF4 : dw SoftwareInterrupt +org $80FFE4 +dw SoftwareInterrupt +org $80FFE6 +dw SoftwareInterrupt +org $80FFF4 +dw SoftwareInterrupt ;================================================================================ ; Dungeon Entrance Hook (works, but not needed at the moment) ;-------------------------------------------------------------------------------- -org $02D8C7 ; <- 158C7 - Bank02.asm : 10981 (STA $7EC172) -JSL.l OnDungeonEntrance +org $82D8C7 ; <- 158C7 - Bank02.asm : 10981 (STA $7EC172) +JSL OnDungeonEntrance ;-------------------------------------------------------------------------------- ;================================================================================ ; D-Pad Invert ;-------------------------------------------------------------------------------- -;org $0083D9 ; <- 3D9 - Bank00.asm : 611 (LDA $4219 : STA $01) -;JSL.l InvertDPad : NOP -org $0083D1 ; <- 3D1 - Bank00.asm (STZ.w JOYPAD - useless instruction here) -JML.l InvertDPad : SKIP 9 +org $8083D1 ; <- 3D1 - Bank00.asm (STZ.w JOYPAD - useless instruction here) +JML InvertDPad : SKIP 9 InvertDPadReturn: ;-------------------------------------------------------------------------------- ;================================================================================ ; Enable/Disable Boots ;-------------------------------------------------------------------------------- -org $079C22 ; <- 39222 - Bank07.asm : 4494 (AND $7EF379 : BEQ .cantDoAction) -JSL.l ModifyBoots +org $879C22 ; <- 39222 - Bank07.asm : 4494 (AND $7EF379 : BEQ .cantDoAction) +JSL ModifyBoots ;-------------------------------------------------------------------------------- ;================================================================================ ; Enable/Disable Bonk Tremors ;-------------------------------------------------------------------------------- -org $079202 ; 39202 <- Bank07.asm : 2859 (JSL AddDashTremor : JSL Player_ApplyRumbleToSprites) -JSL.l AddBonkTremors : NOP #4 +org $879202 ; 39202 <- Bank07.asm : 2859 (JSL AddDashTremor : JSL Player_ApplyRumbleToSprites) +JSL AddBonkTremors : NOP #4 ;-------------------------------------------------------------------------------- ;================================================================================ ; Bonk Breakable Walls ;-------------------------------------------------------------------------------- -org $01CF8E ; CF8E <- Bank01.asm : 11641 (LDA $0372 : AND.w #$00FF) -JSL.l BonkBreakableWall : NOP #2 +org $81CF8E ; CF8E <- Bank01.asm : 11641 (LDA $0372 : AND.w #$00FF) +JSL BonkBreakableWall : NOP #2 ;-------------------------------------------------------------------------------- ;================================================================================ ; Bonk Rock Pile ;-------------------------------------------------------------------------------- -org $07C196 ; 3C196 <- Bank07.asm : 10310 (LDA $02EF : AND.b #$70) -JSL.l BonkRockPile : NOP +org $87C196 ; 3C196 <- Bank07.asm : 10310 (LDA $02EF : AND.b #$70) +JSL BonkRockPile : NOP ;-------------------------------------------------------------------------------- ;================================================================================ ; Move Gravestone ;-------------------------------------------------------------------------------- -org $07C0FD ; 3C0FD <- Bank07.asm : 10197 (LDA $0372 : BNE .moveGravestone) -JML.l GravestoneHook : NOP +org $87C0FD ; 3C0FD <- Bank07.asm : 10197 (LDA $0372 : BNE .moveGravestone) +JML GravestoneHook : NOP GravestoneHook_continue: -org $07C106 +org $87C106 moveGravestone: ;-------------------------------------------------------------------------------- ;================================================================================ ; Jump Down Ledge ;-------------------------------------------------------------------------------- -org $078966 ; 38966 <- Bank07.asm : 1618 (LDA $1B : BNE .indoors : LDA.b #$02 : STA $EE) -JSL.l JumpDownLedge : NOP #4 +org $878966 ; 38966 <- Bank07.asm : 1618 (LDA $1B : BNE .indoors : LDA.b #$02 : STA $EE) +JSL JumpDownLedge : NOP #4 ;-------------------------------------------------------------------------------- ;================================================================================ ; Bonk Recoil ;-------------------------------------------------------------------------------- -org $07922C ; 3922C <- Bank07.asm : 2869 (LDA.b #$24 : STA $29) -JSL.l BonkRecoil +org $87922C ; 3922C <- Bank07.asm : 2869 (LDA.b #$24 : STA $29) +JSL BonkRecoil ;-------------------------------------------------------------------------------- ;================================================================================ ; Dungeon Exit Hook ;-------------------------------------------------------------------------------- -org $02E21B ; <- 1621B - Bank02.asm : 11211 (STA $040C) -JSL.l OnDungeonExit : NOP #2 +org $82E21B ; <- 1621B - Bank02.asm : 11211 (STA $040C) +JSL OnDungeonExit : NOP #2 ;-------------------------------------------------------------------------------- ;================================================================================ ; Quit Hook (for both types of save and quit) ;-------------------------------------------------------------------------------- -org $09F60B ; <- 4F60B - module_death.asm : 530 (LDA.b #$10 : STA $1C) -JSL.l OnQuit +org $89F60B ; <- 4F60B - module_death.asm : 530 (LDA.b #$10 : STA $1C) +JSL OnQuit ;-------------------------------------------------------------------------------- ;================================================================================ ; Title Screen ;-------------------------------------------------------------------------------- -org $0CCDA5 ; <- Bank0C.asm : 1650 (JSL Palette_SelectScreen) -JSL.l SetFileSelectPalette +org $8CCDA5 ; <- Bank0C.asm : 1650 (JSL Palette_SelectScreen) +JSL SetFileSelectPalette ;-------------------------------------------------------------------------------- -org $0CCE41 ; <- 64E41 - Bank0C.asm : 1907 (DEC $C8 : BPL .done) +org $8CCE41 ; <- 64E41 - Bank0C.asm : 1907 (DEC $C8 : BPL .done) JSL FSCursorUp : NOP #4 ; set cursor to only select first file and erase -org $0CCE50 ; <- 64E50 - Bank0C.asm : 1918 (INC $C8) +org $8CCE50 ; <- 64E50 - Bank0C.asm : 1918 (INC $C8) JSL FSCursorDown : NOP #6 ; set cursor to only select first file and erase -org $0CCE0F ; < 64E0F - Bank0C.asm : 1880 (LDX $00 : INX #2 : CPX.w #$0006 : BCC .nextFile) +org $8CCE0F ; < 64E0F - Bank0C.asm : 1880 (LDX $00 : INX #2 : CPX.w #$0006 : BCC .nextFile) NOP #9 ; don't draw the other two save files ;-------------------------------------------------------------------------------- -org $0CCE71 ; <- Bank0C.asm : 1941 (LDA.b #$F1 : STA $012C) -JML.l FSSelectFile : NOP +org $8CCE71 ; <- Bank0C.asm : 1941 (LDA.b #$F1 : STA $012C) +JML FSSelectFile : NOP FSSelectFile_continue: -org $0CCEB1 ; <- Bank0C.asm : 2001 (.return) -FSSelectFile_return: +FSSelectFile_return = $8CCEB1 ;-------------------------------------------------------------------------------- ; Replace copy file module with a fully custom module -org $008061+$02 ; <- Bank00.asm : 103 (dl Module_CopyFile) +org $808061+$02 ; <- Bank00.asm : 103 (dl Module_CopyFile) db Module_Password -org $00807D+$02 ; <- Bank00.asm : 103 (dl Module_CopyFile) +org $80807D+$02 ; <- Bank00.asm : 103 (dl Module_CopyFile) db Module_Password>>8 -org $008099+$02 ; <- Bank00.asm : 103 (dl Module_CopyFile) +org $808099+$02 ; <- Bank00.asm : 103 (dl Module_CopyFile) db Module_Password>>16 ; Hook up password screen tilemap -org $00937a+$07 +org $80937A+$07 db Password_Tilemap -org $009383+$07 +org $809383+$07 db Password_Tilemap>>8 -org $00938c+$07 +org $80938C+$07 db Password_Tilemap>>16 ;-------------------------------------------------------------------------------- -org $0CD527 ; <- 65527 : Bank0C.asm : 2913 (LDA.w #$0004 : STA $02) [LDA.w #$0006 : STA $02] -JSL.l DrawPlayerFile : NOP ; hijack hearts draw routine to draw a full inventory +org $8CD527 ; <- 65527 : Bank0C.asm : 2913 (LDA.w #$0004 : STA $02) [LDA.w #$0006 : STA $02] +JSL DrawPlayerFile : NOP ; hijack hearts draw routine to draw a full inventory ; Random incredible patch that I should add right now - File Select Fairy org $1BF029+1 : db $10 -org $0ccdd5 ; Bank0C.asm:1881 (LDX.w #$00FD) -JSL.l AltBufferTable : NOP #8 ; Selection screen -org $0cd393 ; Bank0c.asm:2674 (LDX.w #$00FD) -JSL.l AltBufferTable : NOP #8 ; Delete screen +org $8CCDD5 ; Bank0C.asm:1881 (LDX.w #$00FD) +JSL AltBufferTable : NOP #8 ; Selection screen +org $8CD393 ; Bank0c.asm:2674 (LDX.w #$00FD) +JSL AltBufferTable : NOP #8 ; Delete screen ;-------------------------------------------------------------------------------- -org $0CCCCC ;<- 64CCC - Bank0C.asm : 1628 (JSL Intro_ValidateSram) / Bank02.asm : 75 (REP #$30) +org $8CCCCC ;<- 64CCC - Bank0C.asm : 1628 (JSL Intro_ValidateSram) / Bank02.asm : 75 (REP #$30) ; Explanation: In JP 1.0 the code for Intro_ValidateSram was inline in Bank 0C -JML.l Validate_SRAM ;(Return via RTL. Original code JML'd to Intro_LoadSpriteStats which returns with RTL, but we want to skip that) -org $0CCD57 ;<- 64D57 - Bank0C.asm : +JML ValidateSRAM ;(Return via RTL. Original code JML'd to Intro_LoadSpriteStats which returns with RTL, but we want to skip that) +org $8CCD57 ;<- 64D57 - Bank0C.asm : RTL ;Just in case anybody ever removes the previous hook ;-------------------------------------------------------------------------------- -org $00E55D ; <- 0655D - Bank00.asm : 5473 (LDA.w #$7000 : STA $2116) +org $80E55D ; <- 0655D - Bank00.asm : 5473 (LDA.w #$7000 : STA $2116) LDA.w #$2000 ; Load file select screen graphics to VRAM word addres 0x2000 instead of 0x7000 ;-------------------------------------------------------------------------------- -org $00833A ; <- 0033A - Bank00.asm : 481 (LDA.w #$007F) +org $80E568 : LDX.w #$0EFF ; Load full decompressed character set into VRAM +;-------------------------------------------------------------------------------- +org $80E581 : JSL LoadFileSelectVanillaItems : BRA + : NOP #13 : + +;-------------------------------------------------------------------------------- +org $80833A ; <- 0033A - Bank00.asm : 481 (LDA.w #$007F) LDA.w #$0180 ; change which character is used as the blank character for the select screen ;-------------------------------------------------------------------------------- -org $0CD50C ; <- 6550C (Not in disassembly, would be in bank0c.asm if it were) Position table for Name and Hearts -;dw $0012, $0112, $0212 ; vanilla-ish positions of file names -;dw $0026, $0126, $0226 ; vanilla-ish positions of hearts names +org $8CD50C ; <- 6550C (Not in disassembly, would be in bank0c.asm if it were) Position table for Name and Hearts dw $00CC, $014A, $01CA ; repositioned, only the first value matters dw $002A, $0192, $0112 -org $0CD53B ; <- 6553B : Bank0c.asm : 2919 (ADD.w #$0010 : STA $102C, Y) [... : STA $1034, Y] +org $8CD53B ; <- 6553B : Bank0c.asm : 2919 (ADD.w #$0010 : STA $102C, Y) [... : STA $1034, Y] STA.w $1042, Y ; Make 2nd half of names line up properly -org $0CD540 ; <- 65540 : Bank0c.asm : 2923 (INY #2) [INY #4] +org $8CD540 ; <- 65540 : Bank0c.asm : 2923 (INY #2) [INY #4] NOP #2 ; Remove space between name characters -org $0CD571 ; <- 65571 : Bank0c.asm : 2943 (LDA $04 : ADD.w #$002A : TAY) [... : ADD.w #$0032 : ...] +org $8CD571 ; <- 65571 : Bank0c.asm : 2943 (LDA $04 : ADD.w #$002A : TAY) [... : ADD.w #$0032 : ...] ADC.w #$0040 ;make Hearts line up properly ;-------------------------------------------------------------------------------- -org $0CCC67 ; <- (Not in disassembly, would be in bank0c.asm if it were) Y position table for File select fairy +org $8CCC67 ; <- Y position table for File select fairy db $42, $00, $00, $AF, $C7 -org $0CD308 ; <- (Not in disassembly, would be in bank0c.asm if it were) Y position table for File Delete fairy +org $8CD308 ; <- Y position table for File Delete fairy db $42, $00, $00, $C7 -org $0CD57E ; <- Y position table for File select link sprite -db $3d -org $0CD6BD ; <- Y position table for Death Counts +org $8CD57E ; <- Y position table for File select link sprite +db $3D +org $8CD6BD ; <- Y position table for Death Counts db $51 ;-------------------------------------------------------------------------------- +org $8CD55F : JSL CheckHeartPaletteFileSelect : NOP #2 ;================================================================================ ; Name Entry Screen ;-------------------------------------------------------------------------------- -org $0CD7BE ; <- 657BE : Bank0C.asm : 3353 (STA $7003D9, X) -JSL.l WriteBlanksToPlayerName -org $0CDB11 ; <- 65B11 : Bank0C.asm : 3605 (LDA $00 : AND.w #$FFF0 : ASL A : ORA $02 : STA $7003D9, X) -JSL.l WriteCharacterToPlayerName -org $0CDCA9 ; <- 65CA9 : Bank0C.asm : 3853 (LDA $7003D9, X) -JSL.l ReadCharacterFromPlayerName -org $0CDC90 ; <- 65C90 : Bank0C.asm : 3847 (ORA $DD24, Y) [ORA $DC82, Y] -JSL.l GetCharacterPosition -org $0CDA79 ; <- 65A79 : Bank0C.asm : 3518 (LDA $0CDA13, X : STA $0800, Y) [LDA $0CD98f, X : ...] +org $8CD7BE ; <- 657BE : Bank0C.asm : 3353 (STA $7003D9, X) +JSL WriteBlanksToPlayerName +org $8CDB11 ; <- 65B11 : Bank0C.asm : 3605 (LDA $00 : AND.w #$FFF0 : ASL A : ORA $02 : STA $7003D9, X) +JSL WriteCharacterToPlayerName +org $8CDCA9 ; <- 65CA9 : Bank0C.asm : 3853 (LDA $7003D9, X) +JSL ReadCharacterFromPlayerName +org $8CDC90 ; <- 65C90 : Bank0C.asm : 3847 (ORA $DD24, Y) [ORA $DC82, Y] +JSL GetCharacterPosition +org $8CDA79 ; <- 65A79 : Bank0C.asm : 3518 (LDA $0CDA13, X : STA $0800, Y) [LDA $0CD98F, X : ...] LDA.l HeartCursorPositions, X -org $0CDAEB ; <- 65AEB : Bank0C.asm : 3571-3575,3581-3587 (...) [LDA $0B12 : AND #$03] +org $8CDAEB ; <- 65AEB : Bank0C.asm : 3571-3575,3581-3587 (...) [LDA $0B12 : AND #$03] ; JP here is different. Indicated line number implement the US version of the same functionality -JSL.l WrapCharacterPosition : NOP -org $0CD75E ; bank_0C.asm (dl NameFile_MakeScreenVisible) +JSL WrapCharacterPosition : NOP +org $8CD75E ; bank_0C.asm (dl NameFile_MakeScreenVisible) dl MaybeForceFileName ;-------------------------------------------------------------------------------- -org $0CE43A ; No assembly source. Makes name entry box wider +org $8CE43A ; No assembly source. Makes name entry box wider db $2C -org $0CE448 +org $8CE448 db $2D, $40, $1E -org $0CE45C +org $8CE45C db $4D, $40, $1E -org $0CE462 +org $8CE462 db $6D, $40, $1E -org $0CE468 +org $8CE468 db $8D, $40, $1E -org $0CE46E +org $8CE46E db $AD, $40, $1E ;-------------------------------------------------------------------------------- -org $0CE41A ; No assembly source. +org $8CE41A ; Fix name screen background to use the not-overwritten copy of its graphics db $09 : SKIP 5 : db $09 : SKIP 5 : db $09 : SKIP 5 : db $09 : SKIP 5 : db $09 : SKIP 5 db $09 : SKIP 5 : db $49 : SKIP 1 : db $49 : SKIP 1 : db $49 : SKIP 1 : db $49 : SKIP 1 -db $c9 : SKIP 5 : db $09 : SKIP 5 : db $09 : SKIP 1 : db $09 : SKIP 1 : db $09 : SKIP 1 +db $C9 : SKIP 5 : db $09 : SKIP 5 : db $09 : SKIP 1 : db $09 : SKIP 1 : db $09 : SKIP 1 db $09 : SKIP 1 : db $89 : SKIP 4 : db $80, $09 : SKIP 4 : db $80, $09 : SKIP 4 db $80, $09 : SKIP 5 : db $89 : SKIP 5 db $49 : SKIP 5 : db $09 : SKIP 5 : db $09 : SKIP 5 : db $49 : SKIP 5 : db $09 : SKIP 5 @@ -279,14 +296,15 @@ db $09 : SKIP 5 : db $09 : SKIP 1 : db $09 : SKIP 1 : db $09 : SKIP 1 : db $09 : db $09 : SKIP 1 : db $09 : SKIP 1 : db $09 : SKIP 1 : db $09 : SKIP 5 : db $05 ;-------------------------------------------------------------------------------- + ;================================================================================ ; Delete file Screen ;-------------------------------------------------------------------------------- ; Remove code that tries to hide non-selected player files -org $0CD435 ; <- 65435 - Bank0C.asm : 2772 (LDX.b #$64) [LDX.b #$50] +org $8CD435 ; <- 65435 - Bank0C.asm : 2772 (LDX.b #$64) [LDX.b #$50] LDX.b #$44 -LDA $D324, X -org $0CD446 ; <- 65446 - Bank0C.asm : 2782 (LDX $C8 : CPX.b #$02 : BEQ BRANCH_11) +LDA.w $D324, X +org $8CD446 ; <- 65446 - Bank0C.asm : 2782 (LDX $C8 : CPX.b #$02 : BEQ BRANCH_11) db $80 ; BRA ;-------------------------------------------------------------------------------- @@ -294,7 +312,7 @@ db $80 ; BRA ; Remove Mirrored copy of save file ;-------------------------------------------------------------------------------- ; Saving to mirrored copy -org $00895D ; <- 0095D - Bank00.asm : 1286 (LDA $7EF000, X : STA $0000, Y : STA $0F00, Y) +org $80895D ; <- 0095D - Bank00.asm : 1286 (LDA $7EF000, X : STA $0000, Y : STA $0F00, Y) SKIP 7 : NOP #3 SKIP 7 : NOP #3 SKIP 7 : NOP #3 @@ -302,185 +320,179 @@ SKIP 7 : NOP #3 SKIP 7 : NOP #3 ;-------------------------------------------------------------------------------- ; remove Clearing mirrored copy on file erase, instead clearing the extended save file too -org $0CD4E3 ; <- Bank0C.asm : 2282 (STA $700400, X : STA $700F00, X : STA $701000, X : STA $701100, X) -JSL.l ClearExtendedSaveFile -BRA + - NOP #18 -+ +org $8CD4E3 ; <- Bank0C.asm : 2282 (STA $700400, X : STA $700F00, X : STA $701000, X : STA $701100, X) +JSL ClearExtendedSaveFile +BRA + : NOP #18 : + ;-------------------------------------------------------------------------------- ;================================================================================ ; Extended SRAM Save file ;-------------------------------------------------------------------------------- -org $0ccf08 ; <- Bank0C.asm : 2036 (LDA.w #$0007 : STA $7EC00D : STA $7EC013) +org $8CCF08 ; <- Bank0C.asm : 2036 (LDA.w #$0007 : STA $7EC00D : STA $7EC013) JSL CopyExtendedSaveFileToWRAM ;-------------------------------------------------------------------------------- -org $008998 ; <- Bank00.asm : 1296 (LDX.w #$0000) +org $808998 ; <- Bank00.asm : 1296 (LDX.w #$0000) JSL CopyExtendedWRAMSaveFileToSRAM ;-------------------------------------------------------------------------------- -org $0CD7AB ; <- Bank0C.asm : 3342 (STA $700400, X) -JSL.l ClearExtendedSaveFile +org $80899C ; <- bank_00.asm : #_00899C (CLC) +JSL WriteSaveChecksumAndBackup +PLA : SEP #$30 : PLB : RTL +padbyte $FF : pad $0089C2 ; Fill adjacent free rom forward. See bank_00.asm: #_0089C2 ;-------------------------------------------------------------------------------- -org $0CC2EB ; <- Bank0C.asm : 348 (STA $7EF000, X : STA $7EF100, X : STA $7EF200, X : STA $7EF300, X : STA $7EF400, X) -JSL.l ClearExtendedWRAMSaveFile +org $8CD7AB ; <- Bank0C.asm : 3342 (STA $700400, X) +JSL ClearExtendedSaveFile ;-------------------------------------------------------------------------------- -org $09F653 ; <- module_death.asm : 556 (STA $7EF400, X) -JSL.l ClearExtendedWRAMSaveFile +org $8CC2EB ; <- Bank0C.asm : 348 (STA $7EF000, X : STA $7EF100, X : STA $7EF200, X : STA $7EF300, X : STA $7EF400, X) +JSL ClearExtendedWRAMSaveFile +;-------------------------------------------------------------------------------- +org $89F653 ; <- module_death.asm : 556 (STA $7EF400, X) +JSL ClearExtendedWRAMSaveFile ;-------------------------------------------------------------------------------- ;================================================================================ ; Remove storage of selected file index from end of vanilla SRAM ;-------------------------------------------------------------------------------- -org $0087EB ; <- Bank00.asm : 986 (STA $7EC500 : STA $701FFE) +org $8087EB ; <- Bank00.asm : 986 (STA $7EC500 : STA $701FFE) BRA AfterFileWrittenChecks ;Also skip totally redundant checking and clearing the "file written" marker, ;since it is not even useful in the original code, much less with only one save slot -org $00881f ; <- Bank00.asm : 1011 (STY $01FE) +org $80881F ; <- Bank00.asm : 1011 (STY $01FE) AfterFileWrittenChecks: ;-------------------------------------------------------------------------------- -org $008951 ; <- Bank00.asm : 1278 (LDX $1FFE : LDA $00848A, X : TAY : PHY) -LDX #$0002 +org $808951 ; <- Bank00.asm : 1278 (LDX $1FFE : LDA $00848A, X : TAY : PHY) +LDX.w #$0002 ;-------------------------------------------------------------------------------- -org $0CCE85 ; <- Bank0C.asm : 1953 (LDA $C8 : ASL A : INC #2 : STA $701FFE) +org $8CCE85 ; <- Bank0C.asm : 1953 (LDA $C8 : ASL A : INC #2 : STA $701FFE) NOP #4 ;-------------------------------------------------------------------------------- -org $0CDB4C ; <- Bank0C.asm : 3655 (LDA $C8 : ASL A : INC #2 : STA $701FFE : TAX) -JML OnFileCreation -NOP +org $8CDB4C ; <- Bank0C.asm : 3655 (LDA $C8 : ASL A : INC #2 : STA $701FFE : TAX) +JML OnFileCreation : NOP ;-------------------------------------------------------------------------------- -org $09F5EA ; <- module_death.asm : 510 (LDA $701FFE : TAX : DEX #2) +org $89F5EA ; <- module_death.asm : 510 (LDA $701FFE : TAX : DEX #2) LDA.w #$0002 : NOP ;-------------------------------------------------------------------------------- -org $0EEFEB ; <- vwf.asm : 310 (LDA $701FFE : TAX) +org $8EEFEB ; <- vwf.asm : 310 (LDA $701FFE : TAX) LDA.w #$0002 : NOP ;-------------------------------------------------------------------------------- ;================================================================================ ; Cross World Damage fixes ;-------------------------------------------------------------------------------- -org $068891 ; Sprite_Prep.asm : 378 //LDA .damage_class, Y : STA $0CD2, X -nop #$08 -JSL.l NewBatInit -;-------------------------------------------------------------------------------- +org $868891 ; Sprite_Prep.asm : 378 //LDA .damage_class, Y : STA $0CD2, X +NOP #8 +JSL NewBatInit ;================================================================================ ; Damage table Relocation from WRAM ;-------------------------------------------------------------------------------- -org $06EDB5 ;<- 36DBE - Bank06.asm : 4882 (LDA $7F6000, X : STA $02) -JSL.l LookupDamageLevel +org $86EDB5 ;<- 36DBE - Bank06.asm : 4882 (LDA $7F6000, X : STA $02) +JSL LookupDamageLevel ;-------------------------------------------------------------------------------- -!StalfosBombDamage = "$7F509D" -org $1eab5e ;<- F2B5E - sprite_stalfos_knight.asm : 135 (LDA.b #$00 : STA $7F6918) -STA.l !StalfosBombDamage -org $1eaad6 ;<- F2AB6 - sprite_stalfos_knight.asm : 32 (LDA.b #$02 : STA $7F6918) -STA.l !StalfosBombDamage +org $9EAB5E ;<- F2B5E - sprite_stalfos_knight.asm : 135 (LDA.b #$00 : STA $7F6918) +STA.l StalfosBombDamage +org $9EAAD6 ;<- F2AB6 - sprite_stalfos_knight.asm : 32 (LDA.b #$02 : STA $7F6918) +STA.l StalfosBombDamage ;-------------------------------------------------------------------------------- ;================================================================================ ; Duck Map Load Hook ;-------------------------------------------------------------------------------- -org $0AB76E ; <- 5376E - Bank0A.asm : 30 (JSL OverworldMap_InitGfx) -JSL.l OnLoadDuckMap -;-------------------------------------------------------------------------------- +org $8AB76E ; <- 5376E - Bank0A.asm : 30 (JSL OverworldMap_InitGfx) +JSL OnLoadDuckMap ;================================================================================ ; Infinite Bombs / Arrows / Magic ;-------------------------------------------------------------------------------- -org $08A17A ; <- 4217A - ancilla_arrow.asm : 42 (AND.b #$04 : BEQ .dont_spawn_sparkle) -CMP.b #$03 : db #$90 ; !BLT -org $08A40E ; <- 4240E - ancilla_arrow.asm : 331 (AND.b #$04 : BNE .use_silver_palette) -CMP.b #$03 : db #$B0 ; !BGE +org $88A17A ; <- 4217A - ancilla_arrow.asm : 42 (AND.b #$04 : BEQ .dont_spawn_sparkle) +CMP.b #$03 : db $90 ; !BLT +org $88A40E ; <- 4240E - ancilla_arrow.asm : 331 (AND.b #$04 : BNE .use_silver_palette) +CMP.b #$03 : db $B0 ; !BGE ;-------------------------------------------------------------------------------- -org $098127 ; <- 48127 - ancilla_init.asm : 202 (LDA $7EF343 : BNE .player_has_bombs) -JSL.l LoadBombCount -org $098133 ; <- 48133 - ancilla_init.asm : 211 (STA $7EF343 : BNE .bombs_left_over) -JSL.l StoreBombCount +org $898127 ; <- 48127 - ancilla_init.asm : 202 (LDA $7EF343 : BNE .player_has_bombs) +JSL LoadBombCount +org $898133 ; <- 48133 - ancilla_init.asm : 211 (STA $7EF343 : BNE .bombs_left_over) +JSL StoreBombCount ;-------------------------------------------------------------------------------- -org $0DE4BF ; <- 6E4BF - equipment.asm : 1249 (LDA $7EF343 : AND.w #$00FF : BEQ .gotNoBombs) -JSL.l LoadBombCount16 +org $8DE4BF ; <- 6E4BF - equipment.asm : 1249 (LDA $7EF343 : AND.w #$00FF : BEQ .gotNoBombs) +JSL LoadBombCount16 ;-------------------------------------------------------------------------------- -org $0DDEB3 ; <- 6DEB3 - equipment.asm : 328 (LDA $7EF33F, X) -JSL.l IsItemAvailable +org $8DDEB3 ; <- 6DEB3 - equipment.asm : 328 (LDA $7EF33F, X) +JSL IsItemAvailable ;-------------------------------------------------------------------------------- -org $0DDDE8 ; <- 6DDE8 - equipment.asm : 148 (LDA $7EF340) -JSL.l SearchForEquippedItem +org $8DDDE8 ; <- 6DDE8 - equipment.asm : 148 (LDA $7EF340) +JSL SearchForEquippedItem ;-------------------------------------------------------------------------------- -org $0DDE70 ; <- 6DE70 - equipment.asm : 273 (LDA $7EF340) -JSL.l SearchForEquippedItem +org $8DDE70 ; <- 6DE70 - equipment.asm : 273 (LDA $7EF340) +JSL SearchForEquippedItem ;-------------------------------------------------------------------------------- -org $0DE39D ; <- 6E39D - equipment.asm : 1109 (LDA $7EF340) -JSL.l SearchForEquippedItem +org $8DE39D ; <- 6E39D - equipment.asm : 1109 (LDA $7EF340) +JSL SearchForEquippedItem ;-------------------------------------------------------------------------------- ;================================================================================ ; Inverted Mode ;-------------------------------------------------------------------------------- -org $028413 ; <- 10413 - Bank02.asm : 853 (LDA $7EF357 : BNE .notBunny) +org $828413 ; <- 10413 - Bank02.asm : 853 (LDA $7EF357 : BNE .notBunny) NOP #6 -JSL.l DecideIfBunny : db #$D0 ; BNE +JSL DecideIfBunny : db $D0 ; BNE ;-------------------------------------------------------------------------------- -org $07AA44 ; <- 3AA44 - Bank07.asm : 853 (LDA $7EF357 : BNE .playerHasMoonPearl) +org $87AA44 ; <- 3AA44 - Bank07.asm : 853 (LDA $7EF357 : BNE .playerHasMoonPearl) NOP #6 -JSL.l DecideIfBunnyByScreenIndex : db #$D0 ; BNE +JSL DecideIfBunnyByScreenIndex : db $D0 ; BNE ;-------------------------------------------------------------------------------- -org $02D9B9 ; <- 159B9 - Bank02.asm : 11089 (LDA $7EF3C8) +org $82D9B9 ; <- 159B9 - Bank02.asm : 11089 (LDA $7EF3C8) JSL AllowStartFromSingleEntranceCave ;-------------------------------------------------------------------------------- -org $028496 ; <- 15496 - Bank02.asm : 959 (LDA $7EF3C8 : PHA) -JML.l AllowStartFromExit +org $828496 ; <- 15496 - Bank02.asm : 959 (LDA $7EF3C8 : PHA) +JML AllowStartFromExit AllowStartFromExitReturn: ;-------------------------------------------------------------------------------- -org $1bc2a7 ; <- DC2A7 - Bank1B.asm : 1143 (Overworld_CreatePyramidHole:) -JSL.l Overworld_CreatePyramidHoleModified -RTL +org $9BC2A7 ; <- DC2A7 - Bank1B.asm : 1143 (Overworld_CreatePyramidHole:) +JSL Overworld_CreatePyramidHoleModified : RTL C9DE_LONG: -JSR $C9DE ; surprisingly same address as US -RTL +JSR Overworld_AlterTileHardcore : RTL ; surprisingly same address as US ;-------------------------------------------------------------------------------- -org $07ff5f ; <- 3ff5f - Bank0E.asm : 5252 (LDA.w #$0E3F : STA $23BC) -JSL.l Draw_PyramidOverlay -RTS +org $87FF5F ; <- 3ff5f - Bank0E.asm : 5252 (LDA.w #$0E3F : STA $23BC) +JSL Draw_PyramidOverlay : RTS ;-------------------------------------------------------------------------------- ;Remove Electric Barrier Hook -org $06891E ; <- sprite_prep.asm : 537 (LDA $7EF280, X : PLX : AND.b #$40 : BEQ .not_dead) +org $86891E ; <- sprite_prep.asm : 537 (LDA $7EF280, X : PLX : AND.b #$40 : BEQ .not_dead) JSL Electric_Barrier ;-------------------------------------------------------------------------------- -org $08CDAC ; <- ancilla_break_tower_seal.asm : 117 (LDA.b #$05 : STA $04C6) -JSL GanonTowerAnimation -NOP #05 +org $88CDAC ; <- ancilla_break_tower_seal.asm : 117 (LDA.b #$05 : STA $04C6) +JSL GanonTowerAnimation : NOP #05 ;-------------------------------------------------------------------------------- -org $1AF5C1 ; <- sprite_waterfall.asm : 40 (LDA $8A : CMP.b #$43) +org $9AF5C1 ; <- sprite_waterfall.asm : 40 (LDA $8A : CMP.b #$43) JSL GanonTowerInvertedCheck ;-------------------------------------------------------------------------------- -org $02EC8D ; <- bank02.asm : 11981 (LDA.w #$020F : LDX $8A : CPX.w #$0033 : BNE .noRock) -JSL HardcodedRocks -NOP #19 ;23 bytes removed with the JSL +org $82EC8D ; <- bank02.asm : 11981 (LDA.w #$020F : LDX $8A : CPX.w #$0033 : BNE .noRock) +JSL HardcodedRocks : NOP #19 ;23 bytes removed with the JSL ;-------------------------------------------------------------------------------- -;org $04E7AE ; <- bank0E.asm : 4230 (LDA $7EF287 : AND.w #$0020) -;JSL.l TurtleRockPegSolved +;org $84E7AE ; <- bank0E.asm : 4230 (LDA $7EF287 : AND.w #$0020) +;JSL TurtleRockPegSolved ;-------------------------------------------------------------------------------- -org $1BCAA1 ; <- bank_1B.asm (LDA.w #$0212 : LDX.w #$0720 : STA.l $7E2000,X : JSL : JSL) -JSL.l Overworld_InvertedTRPuzzle +org $9BCAA1 ; <- bank_1B.asm (LDA.w #$0212 : LDX.w #$0720 : STA.l $7E2000,X : JSL : JSL) +JSL Overworld_InvertedTRPuzzle BRA + : NOP #12 : + -org $04E7B9 ; <- bank0E.asm : 4237 (LDX $04C8) +org $84E7B9 ; <- bank0E.asm : 4237 (LDX $04C8) JMP.w TurtleRockTrollPegs TurtleRockPegCheck: -org $04E7C9 +org $84E7C9 TurtleRockPegSuccess: -org $04E7F5 +org $84E7F5 TurtleRockPegFail: -org $04E96F +org $84E96F PegProbability: db $00 ; Probability out of 255. 0 = Vanilla behavior TurtleRockTrollPegs: SEP #$20 - LDX.w $04C8 : CPX.w #$FFFF : BEQ .vanilla - JSL.l GetRandomInt - LDA.l PegProbability : BEQ .vanilla : CMP.l $7E0FA1 +LDX.w $04C8 : CPX.w #$FFFF : BEQ .vanilla +JSL GetRandomInt +LDA.l PegProbability : BEQ .vanilla : CMP.l $7E0FA1 REP #$20 : !BGE .succeed .fail JMP.w TurtleRockPegFail @@ -489,220 +501,176 @@ JMP.w TurtleRockPegSuccess .vanilla REP #$20 : JMP.w TurtleRockPegCheck ;-------------------------------------------------------------------------------- -org $1BBD05 ; <- bank1B.asm : 261 (TYA : STA $00) ; hook starts at the STA -JML.l PreventEnterOnBonk -NOP +org $9BBD05 ; <- bank1B.asm : 261 (TYA : STA $00) ; hook starts at the STA +JML PreventEnterOnBonk : NOP PreventEnterOnBonk_return: -org $1BBD77 ; <- bank1B.asm : 308 (SEP #$30) +org $9BBD77 ; <- bank1B.asm : 308 (SEP #$30) PreventEnterOnBonk_BRANCH_IX: ;-------------------------------------------------------------------------------- ;================================================================================ ; Crystals Mode ;-------------------------------------------------------------------------------- -org $099B7B ; <- ancilla_init.asm : 4136 (LDA $7EF37A : AND.b #$7F : CMP.b #$7F) -JSL.l CheckEnoughCrystalsForTower -NOP #4 -db #$90 ; BCC +org $899B7F ; <- ancilla_init.asm : 4136 (LDA $7EF37A : AND.b #$7F : CMP.b #$7F) +JSL CheckTowerOpen : BCC AncillaAdd_GTCutscene-2 ;-------------------------------------------------------------------------------- -org $08CE0C ; <- 44E0C - ancilla_break_tower_seal.asm : 168 (BEQ #$03 : JSR GTCutscene_SparkleALot : LDX.b #$06) -JML.l GTCutscene_AnimateCrystals_Prep : NOP +org $88CE0C ; <- 44E0C - ancilla_break_tower_seal.asm : 168 (BEQ #$03 : JSR GTCutscene_SparkleALot : LDX.b #$06) +JML GTCutscene_AnimateCrystals_Prep : NOP LDX.b #$05 GTCutscene_AnimateCrystals_NextCrystal: -JML.l GTCutscene_ConditionalAnimateCrystals +JML GTCutscene_ConditionalAnimateCrystals ;-------------------------------------------------------------------------------- -org $08CE93 +org $88CE93 GTCutscene_DrawSingleCrystal: -JML.l GTCutscene_ConditionalDrawSingleCrystal +JML GTCutscene_ConditionalDrawSingleCrystal ;-------------------------------------------------------------------------------- -org $08CF19 ; <- 44F19 - ancilla_break_tower_seal.asm : 336 (TXA : AND.b #$07 : TAX) -JSL.l GTCutscene_ActivateSparkle_SelectCrystal +org $88CF19 ; <- 44F19 - ancilla_break_tower_seal.asm : 336 (TXA : AND.b #$07 : TAX) +JSL GTCutscene_ActivateSparkle_SelectCrystal ;-------------------------------------------------------------------------------- -org $08CFC9 ; <- 44FC9 - ancilla_break_tower_seal.asm : 414 (RTS) +org $88CFC9 ; <- 44FC9 - ancilla_break_tower_seal.asm : 414 (RTS) RTL ;-------------------------------------------------------------------------------- ;================================================================================ ; Hash Key Display ;-------------------------------------------------------------------------------- -org $0CCDB5 ; <- 64DB5 - Bank0C.asm : 1776 (LDA.b #$06 : STA $14) -JSL.l OnPrepFileSelect -;-------------------------------------------------------------------------------- +org $8CCDB5 ; <- 64DB5 - Bank0C.asm : 1776 (LDA.b #$06 : STA $14) +JSL OnPrepFileSelect ;================================================================================ ; Light speed ;-------------------------------------------------------------------------------- - ; Message -org $1ED4FF +org $9ED4FF JSL AgahnimAsksAboutPed ; Spam blue balls if ped not pulled -org $1ED6E8 +org $9ED6E8 JSL CheckAgaForPed : NOP - -; kill ganon when aga dies in light speed -org $00F970 -JSL KillGanon - - - -;-------------------------------------------------------------------------------- - ;================================================================================ ; Zelda Sprite Fixes ;-------------------------------------------------------------------------------- -org $05EBCF ; <- 2EBCF - sprite_zelda.asm : 23 (LDA $7EF359 : CMP.b #$02 : BCS .hasMasterSword) -JSL.l SpawnZelda : NOP #2 -;NOP #8 -;-------------------------------------------------------------------------------- -;org $06C06F ; <- 3406F - Bank06.asm : 1794 (JSL Sprite_ZeldaLong) -;JSL.l SpawnZelda -;-------------------------------------------------------------------------------- +org $85EBCF ; <- 2EBCF - sprite_zelda.asm : 23 (LDA $7EF359 : CMP.b #$02 : BCS .hasMasterSword) +JSL SpawnZelda : NOP #2 ;================================================================================ ; Alternate Goal ;-------------------------------------------------------------------------------- ;Invincible Ganon -org $06F2C8 ; <- 372C8 - Bank06.asm : 5776 (LDA $44 : CMP.b #$80 : BEQ .no_collision) -JSL.l GoalItemGanonCheck +org $86F2C8 ; <- 372C8 - Bank06.asm : 5776 (LDA $44 : CMP.b #$80 : BEQ .no_collision) +JSL GoalItemGanonCheck ;-------------------------------------------------------------------------------- ;Hammerable Ganon -org $06F2EA ; <- 372EA - Bank06.asm : 5791 (LDA $0E20, X : CMP.b #$D6 : BCS .no_collision) -JSL.l CheckGanonHammerDamage : NOP +org $86F2EA ; <- 372EA - Bank06.asm : 5791 (LDA $0E20, X : CMP.b #$D6 : BCS .no_collision) +JSL CheckGanonHammerDamage : NOP ;-------------------------------------------------------------------------------- +org $858922 +JSL CheckPedestalPull : BCC MasterSword_InPedestal_exit ;================================================================================ ; Stat Hooks ;-------------------------------------------------------------------------------- -org $02B797 ; <- 13797 - Bank02.asm : 8712 (LDA.b #$19 : STA $10) -JSL.l StatsFinalPrep +org $82B797 ; <- 13797 - Bank02.asm : 8712 (LDA.b #$19 : STA $10) +JSL StatsFinalPrep ;-------------------------------------------------------------------------------- -org $07A95B ; <- 3A95B - Bank07.asm : 6565 (JSL Dungeon_SaveRoomDataWRAM) -JSL.l IncrementUWMirror +org $87A95B ; <- 3A95B - Bank07.asm : 6565 (JSL Dungeon_SaveRoomDataWRAM) +JSL IncrementUWMirror ;-------------------------------------------------------------------------------- -org $0288D1 ; <- 108D1 - Bank02.asm : 1690 (STZ $0646) -JSL.l IndoorSubtileTransitionCounter -NOP #2 +org $8288D1 ; <- 108D1 - Bank02.asm : 1690 (STZ $0646) +JSL IndoorSubtileTransitionCounter : NOP #2 +org $86D192 ; <- 35192 - sprite_absorbable.asm : 274 (STA $7EF36F) +JSL IncrementSmallKeysNoPrimary ;-------------------------------------------------------------------------------- -;org $05FC7E ; <- 2FC7E - sprite_dash_item.asm : 118 (LDA $7EF36F : INC A : STA $7EF36F) -;JSL.l IncrementSmallKeys +org $80F945 ; <- 7945 - Bank00.asm : 8557 (JSL SavePalaceDeaths) +JSL OnDungeonBossExit ;-------------------------------------------------------------------------------- -;org $06D18D ; <- 3518D - sprite_absorbable.asm : 274 (LDA $7EF36F : INC A : STA $7EF36F) -org $06D192 ; <- 35192 - sprite_absorbable.asm : 274 (STA $7EF36F) -JSL.l IncrementSmallKeysNoPrimary +org $89F443 ; <- 4F443 - module_death.asm : 257 (STA $7EF35C, X) +JSL IncrementFairyRevivalCounter ;-------------------------------------------------------------------------------- -org $00F945 ; <- 7945 - Bank00.asm : 8557 (JSL SavePalaceDeaths) -JSL.l StatTransitionCounter ; we're not bothering to restore the instruction we wrote over +org $82B6F3 ; <- 136F3 - Bank02.asm : 8600 (LDA.b #$0F : STA $10) +JSL DungeonExitTransition ;-------------------------------------------------------------------------------- -org $09F443 ; <- 4F443 - module_death.asm : 257 (STA $7EF35C, X) -JSL.l IncrementFairyRevivalCounter +org $9BBD6A ; <- DBD6A - Bank1B.asm : 301 (LDA.b #$0F : STA $10) +JSL DungeonExitTransition ;-------------------------------------------------------------------------------- -org $02B6F3 ; <- 136F3 - Bank02.asm : 8600 (LDA.b #$0F : STA $10) -JSL.l DungeonExitTransition +org $81C3A7 ; <- C3A7 - Bank01.asm : 9733 (JSL Dungeon_SaveRoomQuadrantData) +JSL DungeonStairsTransition ;-------------------------------------------------------------------------------- -org $1BBD6A ; <- DBD6A - Bank1B.asm : 301 (LDA.b #$0F : STA $10) -JSL.l DungeonExitTransition +org $8BFFAC ; <- 5FFAC - Bank0B.asm : 170 (JSL Dungeon_SaveRoomQuadrantData) +JSL DungeonStairsTransition ;-------------------------------------------------------------------------------- -org $01C3A7 ; <- C3A7 - Bank01.asm : 9733 (JSL Dungeon_SaveRoomQuadrantData) -JSL.l DungeonStairsTransition +org $829A17 ; <- 11A17 - Bank02.asm : 4770 (JSL EnableForceBlank) +JSL DungeonHoleEntranceTransition ;-------------------------------------------------------------------------------- -org $0BFFAC ; <- 5FFAC - Bank0B.asm : 170 (JSL Dungeon_SaveRoomQuadrantData) -JSL.l DungeonStairsTransition +org $8794EB ; <- 394EB - Bank07.asm : 3325 (LDA $01C31F, X : STA $0476) +JSL DungeonHoleWarpTransition ;-------------------------------------------------------------------------------- -org $029A17 ; <- 11A17 - Bank02.asm : 4770 (JSL EnableForceBlank) -JSL.l DungeonHoleEntranceTransition -;-------------------------------------------------------------------------------- -org $0794EB ; <- 394EB - Bank07.asm : 3325 (LDA $01C31F, X : STA $0476) -JSL.l DungeonHoleWarpTransition -;-------------------------------------------------------------------------------- -org $0CC999 ; <- 64999 - Bank0C.asm : 1087 (LDA.b #$0F : STA $13) +org $8CC999 ; <- 64999 - Bank0C.asm : 1087 (LDA.b #$0F : STA $13) NOP #4 ;-------------------------------------------------------------------------------- -org $01ED75 ; <- ED75 - Bank01.asm : 13963 (JSL Dungeon_SaveRoomQuadrantData) -JSL.l IncrementBigChestCounter +org $81ED75 ; <- ED75 - Bank01.asm : 13963 (JSL Dungeon_SaveRoomQuadrantData) +JSL IncrementBigChestCounter ;-------------------------------------------------------------------------------- +org $8EE67A : STA.l PostGameCounter : BRA + : NOP #18 : + ;================================================================================ -; Dialog Override +; DialogOverride ;-------------------------------------------------------------------------------- -;org $0EEE8D ; 0x76E8D <- vwf.asm : 152 (LDA $7F71C0, X : STA $04) -;JSL.l DialogOverride -;NOP #7 +org $8EF1FF : JSL DialogOverride ; DialogOverride +org $8EF2DC : JSL DialogOverride ; DialogOverride +org $8EF315 : JSL DialogOverride ; DialogOverride +org $8EF332 : JSL DialogOverride ; DialogOverride +org $8EF375 : JSL DialogOverride ; DialogOverride +org $8EF394 : JSL DialogOverride ; DialogOverride +org $8EF511 : JSL DialogOverride ; DialogOverride +org $8EF858 : JSL DialogOverride ; DialogOverride +org $8EFA26 : JSL DialogOverride ; DialogOverride +org $8EFA4C : JSL DialogOverride ; DialogOverride +org $8EFAB4 : JSL DialogOverride ; DialogOverride +org $8EFAC8 : JSL DialogOverride ; DialogOverride +org $8EFAE1 : JSL DialogOverride ; DialogOverride +org $8EFB11 : JSL DialogOverride ; DialogOverride ;-------------------------------------------------------------------------------- -org $0EF1FF ; 0x771FF <- vwf.asm : 1212 (LDA $7F1200, X : AND.w #$007F : SUB.w #$0066 : BPL .commandByte) -JSL.l DialogOverride -org $0EF2DC ; every other LDA $7F1200, X in vwf.asm -JSL.l DialogOverride -org $0EF315 -JSL.l DialogOverride -org $0EF332 -JSL.l DialogOverride -org $0EF375 -JSL.l DialogOverride -org $0EF394 -JSL.l DialogOverride -org $0EF511 -JSL.l DialogOverride -org $0EF858 -JSL.l DialogOverride -org $0EFA26 -JSL.l DialogOverride -org $0EFA4C -JSL.l DialogOverride -org $0EFAB4 -JSL.l DialogOverride -org $0EFAC8 -JSL.l DialogOverride -org $0EFAE1 -JSL.l DialogOverride -org $0EFB11 -JSL.l DialogOverride +org $8EFBC6 ; <- 77BC6 - vwf.asm : 2717 (LDA.b #$1C : STA $1CE9) +JSL ResetDialogPointer : RTS ;-------------------------------------------------------------------------------- -org $0EFBC6 ; <- 77BC6 - vwf.asm : 2717 (LDA.b #$1C : STA $1CE9) -JSL.l ResetDialogPointer -RTS +org $8EED0B ; <- PC 0x76D0B - Bank0E.asm : 3276 (LDA $E924, Y : STA $1008, X) +JSL EndingSequenceTableOverride : NOP #2 ;-------------------------------------------------------------------------------- -org $0EED0B ; <- PC 0x76D0B - Bank0E.asm : 3276 (LDA $E924, Y : STA $1008, X) -JSL.l EndingSequenceTableOverride -NOP #2 +org $8EED15 ; <- PC 0x76D15 - Bank0E.asm : 3282 (LDA $E924, Y : STA $1008, X) +JSL EndingSequenceTableOverride : NOP #2 ;-------------------------------------------------------------------------------- -org $0EED15 ; <- PC 0x76D15 - Bank0E.asm : 3282 (LDA $E924, Y : STA $1008, X) -JSL.l EndingSequenceTableOverride -NOP #2 -;-------------------------------------------------------------------------------- -org $0EED2A ; <- PC 0x76D2A - Bank0E.asm : 3295 (LDA $E924, Y : AND.w #$00FF) -JSL.l EndingSequenceTableLookupOverride -NOP #2 +org $8EED2A ; <- PC 0x76D2A - Bank0E.asm : 3295 (LDA $E924, Y : AND.w #$00FF) +JSL EndingSequenceTableLookupOverride : NOP #7 ;-------------------------------------------------------------------------------- ;================================================================================ ; Master Sword Overlay Fix ;-------------------------------------------------------------------------------- -org $0987b2 ; <- ancilla_init.asm : 1051 (LDA.b #$09) -JSL.l PedestalPullOverlayFix +org $8987B2 ; <- ancilla_init.asm : 1051 (LDA.b #$09) +JSL PedestalPullOverlayFix -org $0987b8 ; <- ancilla_init.asm : 1055 (STA $039F, X) +org $8987B8 ; <- ancilla_init.asm : 1055 (STA $039F, X) NOP #3 -org $0987df ; <- ancilla_init.asm : 1077 (STA $039F, X) +org $8987DF ; <- ancilla_init.asm : 1077 (STA $039F, X) NOP #3 ;-------------------------------------------------------------------------------- ;================================================================================ ; File Select Init Event ;-------------------------------------------------------------------------------- -org $0CCC89 ; <- 0x64C89 Bank0C.asm : 1598 (JSL EnableForceBlank) -JSL.l OnInitFileSelect -;-------------------------------------------------------------------------------- +org $8CCC89 ; <- 0x64C89 Bank0C.asm : 1598 (JSL EnableForceBlank) +JSL OnInitFileSelect ;================================================================================ ; Hyrule Castle Rain Sequence Guards (allowing Gloves in Link's house) ;-------------------------------------------------------------------------------- -org $09C8B7 ; <- 4C8B7 -dw #CastleRainSpriteData -org $09F7BD ; <- 4F7BD +org $89C8B7 ; <- 4C8B7 +dw CastleRainSpriteData + +org $89F7BD ; <- 4F7BD CastleRainSpriteData: db $06, $1F, $40, $12, $01, $3F, $14, $01, $3F, $13, $1F, $42, $1A, $1F, $4B, $1A, $20, $4B, $25, $2D, $3F, $29, $20, $3F, $2A, $3C, $3F, $FF ;-------------------------------------------------------------------------------- @@ -710,1398 +678,1192 @@ db $06, $1F, $40, $12, $01, $3F, $14, $01, $3F, $13, $1F, $42, $1A, $1F, $4B, $1 ;================================================================================ ; Sprite_DrawMultiple ;-------------------------------------------------------------------------------- -org $05DFB1 ; <- 2DFB1 - Bank05.asm : 2499 -JSL.l SkipDrawEOR -;-------------------------------------------------------------------------------- +org $85DFB1 ; <- 2DFB1 - Bank05.asm : 2499 +JSL SkipDrawEOR ;================================================================================ ; Kiki Big Bomb Fix ;-------------------------------------------------------------------------------- -org $1EE4AF ; <- f64af sprite_kiki.asm : 285 (LDA.b #$0A : STA $7EF3CC) -JSL.l AssignKiki -NOP #2 -;-------------------------------------------------------------------------------- +org $9EE4AF ; <- f64af sprite_kiki.asm : 285 (LDA.b #$0A : STA $7EF3CC) +JSL AssignKiki : NOP #2 ;================================================================================ ; Wallmaster camera fix ;-------------------------------------------------------------------------------- -org $1EAF77 ; <- F2F77 sprite_wallmaster.asm : 141 (LDA.b #$2A : JSL Sound_SetSfx3PanLong) -JSL.l WallmasterCameraFix +org $9EAF77 ; <- F2F77 sprite_wallmaster.asm : 141 (LDA.b #$2A : JSL Sound_SetSfx3PanLong) +JSL WallmasterCameraFix ;================================================================================ ; Hard & Masochist Mode Fixes ;-------------------------------------------------------------------------------- -org $07D22B ; <- 3D22B - Bank05.asm : 12752 (LDA $D055, Y : STA $0373) -JSL.l CalculateSpikeFloorDamage : NOP #2 +org $87D22B ; <- 3D22B - Bank05.asm : 12752 (LDA $D055, Y : STA $0373) +JSL CalculateSpikeFloorDamage : NOP #2 ;-------------------------------------------------------------------------------- -org $08DCC3 ; <- 45CC3 - ancilla_cane_spark.asm : 272 (LDA $7EF36E) -JSL.l CalculateByrnaUsage +org $88DCC3 ; <- 45CC3 - ancilla_cane_spark.asm : 272 (LDA $7EF36E) +JSL CalculateByrnaUsage ;-------------------------------------------------------------------------------- -org $07AE17 ; <- 3AE17 - Bank07.asm : 7285 (LDA $7EF36E) -JSL.l CalculateCapeUsage +org $87AE17 ; <- 3AE17 - Bank07.asm : 7285 (LDA $7EF36E) +JSL CalculateCapeUsage ;-------------------------------------------------------------------------------- -org $07AE98 ; <- 3AE98 - Bank07.asm : 7380 (LDA $7EF36E) -JSL.l CalculateCapeUsage +org $87AE98 ; <- 3AE98 - Bank07.asm : 7380 (LDA $7EF36E) +JSL CalculateCapeUsage ;-------------------------------------------------------------------------------- -org $08DCA7 ; <- 45CA7 - ancilla_cane_spark.asm : 256 (LDA.b #$01 : STA $037B) -JSL.l ActivateInvulnerabilityOrDont : NOP +org $88DCA7 ; <- 45CA7 - ancilla_cane_spark.asm : 256 (LDA.b #$01 : STA $037B) +JSL ActivateInvulnerabilityOrDont : NOP ;-------------------------------------------------------------------------------- -ORG $06EDC6 ; <- 36DC6 - Bank06.asm : 4890 (LDA $0DB8F1, X) -JSL.l GetItemDamageValue +org $86EDC6 ; <- 36DC6 - Bank06.asm : 4890 (LDA $0DB8F1, X) +JSL GetItemDamageValue ;-------------------------------------------------------------------------------- ;================================================================================ ; Misc Stats ;-------------------------------------------------------------------------------- -org $029E2E ; <- 11E2E - module_ganon_emerges.asm : 59 (JSL Dungeon_SaveRoomDataWRAM.justKeys) -JSL.l OnAga2Defeated -;-------------------------------------------------------------------------------- -org $0DDBDE ; <- 6DBDE - headsup_display.asm : 105 (DEC A : BPL .subtractRupees) -JSL.l IncrementSpentRupees -NOP #6 -;org $0DDBF7 ; <- 6DBF7 - headsup_display.asm : 121 (STA $7EF362) -;RefillLogic_subtractRupees: +org $80F970 +JSL OnAga1Defeated +org $829E2E ; <- 11E2E - module_ganon_emerges.asm : 59 (JSL Dungeon_SaveRoomDataWRAM.justKeys) +JSL OnAga2Defeated ;-------------------------------------------------------------------------------- +org $8DDBDE ; <- 6DBDE - headsup_display.asm : 105 (DEC A : BPL .subtractRupees) +JSL IncrementSpentRupees : NOP #6 ;================================================================================ ; Remove Item Menu Text ;-------------------------------------------------------------------------------- -org $0DEBB0 ; <- 6EBB0 - equipment.asm : 1810 (LDA $0202) +org $8DEBB0 ; <- 6EBB0 - equipment.asm : 1810 (LDA $0202) JMP DrawItem_finished -org $0DECE6 ; <- 6ECE6 - equipment.asm : 1934 (SEP #$30) +org $8DECE6 ; <- 6ECE6 - equipment.asm : 1934 (SEP #$30) DrawItem_finished: -org $0DEB48 ; <- 6EB48 - equipment.asm : 1784 (LDA $0000) -LDA $0000, Y : STA $11F2 -LDA $0002, Y : STA $11F4 -LDA $0040, Y : STA $1232 -LDA $0042, Y : STA $1234 +org $8DEB48 ; <- 6EB48 - equipment.asm : 1784 (LDA $0000) +LDA.w $0000, Y : STA.w GFXStripes+$01F2 +LDA.w $0002, Y : STA.w GFXStripes+$01F4 +LDA.w $0040, Y : STA.w GFXStripes+$0232 +LDA.w $0042, Y : STA.w GFXStripes+$0234 ;--------------------------- -org $0DE24B ; <- 6E24B - equipment.asm : 951 (LDA $0000) -LDA $0000, Y : STA $11F2 -LDA $0002, Y : STA $11F4 -LDA $0040, Y : STA $1232 -LDA $0042, Y : STA $1234 +org $8DE24B ; <- 6E24B - equipment.asm : 951 (LDA $0000) +LDA.w $0000, Y : STA.w GFXStripes+$01F2 +LDA.w $0002, Y : STA.w GFXStripes+$01F4 +LDA.w $0040, Y : STA.w GFXStripes+$0232 +LDA.w $0042, Y : STA.w GFXStripes+$0234 ;-------------------------------------------------------------------------------- -org $0DE2DC ; <- 6E2DC - equipment.asm : 989 (LDA $F449, X : STA $122C, Y) +org $8DE2DC ; <- 6E2DC - equipment.asm : 989 (LDA $F449, X : STA $122C, Y) JMP UpdateBottleMenu_return -org $0DE2F1 ; <- 6E2F1 - equipment.asm : 1000 (SEP #$30) -UpdateBottleMenu_return: +UpdateBottleMenu_return = $8DE2F1 ; <- 6E2F1 - equipment.asm : 1000 (SEP #$30) ;-------------------------------------------------------------------------------- -;org $0DDDC3 ; <- 6DDC3 - equipment.asm : 131 (JSR DrawAbilityText) -;NOP #3 -org $0DE6F4 ; <- 6E6F4 - equipment.asm : 1474 (BCC .lacksAbility) -db #$80 ; BRA -org $0DE81A ; <- 6E81A - equipment.asm : 1597 (STA $00) +org $8DE6F4 ; <- 6E6F4 - equipment.asm : 1474 (BCC .lacksAbility) +db $80 ; BRA +org $8DE81A ; <- 6E81A - equipment.asm : 1597 (STA $00) RTS -org $0DE7B9 ; <- 6E7B9 - equipment.asm : 1548 (LDA.w #$16D0 : STA $00) -JSL.l DrawGlovesInMenuLocation : NOP -org $0DE7CF ; <- 6E7CF - equipment.asm : 1554 (LDA.w #$16C8 : STA $00) -JSL.l DrawBootsInMenuLocation : NOP -org $0DE7E5 ; <- 6E7E5 - equipment.asm : 1560 (LDA.w #$16D8 : STA $00) -JSL.l DrawFlippersInMenuLocation : NOP -org $0DECEB ; <- 6ECEB - equipment.asm : 1946 (LDA.w #$16E0 : STA $00) -JSL.l DrawMoonPearlInMenuLocation : NOP -;-------------------------------------------------------------------------------- -;org $0DE9D8 ; <- 6E9D8 - equipment.asm : 1635 (LDA $E860, X : STA $12EA, X) -;BRA DrawProgressIcons_initPendantDiagram_notext -;org $0DEA0E ; <- 6EA0E - equipment.asm : 1645 (INX #2) -;DrawProgressIcons_initPendantDiagram_notext: -;-------------------------------------------------------------------------------- - -;================================================================================ -; Map Always Zoomed -;-------------------------------------------------------------------------------- -;org $0ABA49 ; <- 53A49 - Bank0A.asm : 447 (LDA.b #$80 : STA $211A) -;JSL.l PrepMapZoom : RTL -;org $0ABB32 ; <- 53B32 - Bank0A.asm : 626 (LDA $F6 : AND.b #$70) -;JSL.l ForceMapZoom -;-------------------------------------------------------------------------------- +org $8DE7B9 ; <- 6E7B9 - equipment.asm : 1548 (LDA.w #$16D0 : STA $00) +JSL DrawGlovesInMenuLocation : NOP +org $8DE7CF ; <- 6E7CF - equipment.asm : 1554 (LDA.w #$16C8 : STA $00) +JSL DrawBootsInMenuLocation : NOP +org $8DE7E5 ; <- 6E7E5 - equipment.asm : 1560 (LDA.w #$16D8 : STA $00) +JSL DrawFlippersInMenuLocation : NOP +org $8DECEB ; <- 6ECEB - equipment.asm : 1946 (LDA.w #$16E0 : STA $00) +JSL DrawMoonPearlInMenuLocation : NOP ;================================================================================ ; Zelda S&Q Mirror Fix ;-------------------------------------------------------------------------------- -org $02D9A4 ; <- 159A4 - Bank02.asm : 11077 (dw $0000, $0002, $0002, $0032, $0004, $0006, $0030) +org $82D9A4 ; <- 159A4 - Bank02.asm : 11077 (dw $0000, $0002, $0002, $0032, $0004, $0006, $0030) dw $0000, $0002, $0004, $0032, $0004, $0006, $0030 -;-------------------------------------------------------------------------------- ;================================================================================ ; Accessibility ;-------------------------------------------------------------------------------- -;org $0AC574 ; <- 54574 - Bank0A.asm : 1797 (LDA $0D : STA $0802, X) -;JSL FlipGreenPendant -;NOP #6 -;-------------------------------------------------------------------------------- -org $02A3F4 ; <- 123F4 - Bank02.asm : 6222 (LDA.b #$72 : BRA .setBrightness) +org $82A3F4 ; <- 123F4 - Bank02.asm : 6222 (LDA.b #$72 : BRA .setBrightness) BRA + : NOP #2 : + -org $02A3FD ; <- 123FD - Bank02.asm : 6233 (LDA.b #$32 : STA $9a) -JSL.l ConditionalLightning +org $82A3FD ; <- 123FD - Bank02.asm : 6233 (LDA.b #$32 : STA $9A) +JSL ConditionalLightning ;-------------------------------------------------------------------------------- -org $1DE9CD ; <- EE9CD - Bank1D.asm : 568 (JSL Filter_Majorly_Whiten_Bg) -JSL.l ConditionalWhitenBg +org $9DE9CD ; <- EE9CD - Bank1D.asm : 568 (JSL Filter_Majorly_Whiten_Bg) +JSL ConditionalWhitenBg ;-------------------------------------------------------------------------------- -org $08AAE9 ; <- 042AE9 - ancilla_ether_spell.asm : 34 (JSL Palette_ElectroThemedGear) -JSL.l LoadElectroPalette +org $88AAE9 ; <- 042AE9 - ancilla_ether_spell.asm : 34 (JSL Palette_ElectroThemedGear) +JSL LoadElectroPalette ;-------------------------------------------------------------------------------- -org $08AAF5 ; <- 042AF5 - ancilla_ether_spell.asm : 45 (JSL LoadActualGearPalettes) -JSL.l RestoreElectroPalette +org $88AAF5 ; <- 042AF5 - ancilla_ether_spell.asm : 45 (JSL LoadActualGearPalettes) +JSL RestoreElectroPalette ;-------------------------------------------------------------------------------- -org $08AAF9 ; -< 42AF9 - ancilla_ether_spell.asm : 46 (JSL Palette_Restore_BG_From_Flash) -JSL.l RestoreBgEther +org $88AAF9 ; -< 42AF9 - ancilla_ether_spell.asm : 46 (JSL Palette_Restore_BG_From_Flash) +JSL RestoreBgEther ;-------------------------------------------------------------------------------- -org $08AAED ; <- 42AED - ancilla_ether_spell.asm : 35 (JSL Filter_Majorly_Whiten_Bg) -JSL.l ConditionalWhitenBg +org $88AAED ; <- 42AED - ancilla_ether_spell.asm : 35 (JSL Filter_Majorly_Whiten_Bg) +JSL ConditionalWhitenBg ;-------------------------------------------------------------------------------- -org $02FEE6 ; <- 17EE6 - Bank0E.asm : 3907 (RTS) -RTL ; the whiten color routine is only JSL-ed to +org $82FEE6 ; <- 17EE6 - Bank0E.asm : 3907 (RTS) +RTL ; the whiten color routine is only JSL-ed to ;-------------------------------------------------------------------------------- -org $07FA7B ; <- 3FA7B - Bank0E.asm : 4735 (REP #$20 : LDX.b #$02) +org $87FA7B ; <- 3FA7B - Bank0E.asm : 4735 (REP #$20 : LDX.b #$02) JML DDMConditionalLightning ;-------------------------------------------------------------------------------- -org $07FACB ; <- 3FACB - Bank0E.asm : 4773 (REP #$20 : LDA #$F531, Y) -JSL.l ConditionalGTFlash : BRA + : NOP #11 : + +org $87FACB ; <- 3FACB - Bank0E.asm : 4773 (REP #$20 : LDA #$F531, Y) +JSL ConditionalGTFlash : BRA + : NOP #11 : + ;-------------------------------------------------------------------------------- -org $0AFF48 ; <- 57F48 - Bank0A.asm : 4935 (REP #$20 : LDA $7EC3DA) -JSL.l ConditionalRedFlash : BRA + : NOP #13 : + +org $8AFF48 ; <- 57F48 - Bank0A.asm : 4935 (REP #$20 : LDA $7EC3DA) +JSL ConditionalRedFlash : BRA + : NOP #13 : + ;-------------------------------------------------------------------------------- -org $08C2A1 ; <- 442A3 - ancilla_sword_ceremony.asm : 54 (REP #$20) -JSL.l ConditionalPedAncilla : BRA + : NOP #4 : + +org $88C2A1 ; <- 442A3 - ancilla_sword_ceremony.asm : 54 (REP #$20) +JSL ConditionalPedAncilla : BRA + : NOP #4 : + ;-------------------------------------------------------------------------------- -org $079976 ; <- 039976 - Bank07.asm : 4009 (JSL Palette_ElectroThemedGear) -JSL.l LoadElectroPalette -;-------------------------------------------------------------------------------- -org $07997C ; <- 03997C - Bank07.asm : 4015 (JSL LoadActualGearPalettes) -JSL.l RestoreElectroPalette +org $879976 ; <- 039976 - Bank07.asm : 4009 (JSL Palette_ElectroThemedGear) +JSL LoadElectroPalette ;-------------------------------------------------------------------------------- +org $87997C ; <- 03997C - Bank07.asm : 4015 (JSL LoadActualGearPalettes) +JSL RestoreElectroPalette ;================================================================================ ; Ice Floor Toggle ;-------------------------------------------------------------------------------- -org $07D234 ; <- 3D234 - Bank07.asm : 12758 (LDA $0348 : AND.b #$11 : BEQ .notWalkingOnIce) -JSL.l LoadModifiedIceFloorValue_a11 : NOP -;-------------------------------------------------------------------------------- -org $07D26E ; <- 3D26E - Bank07.asm : 12786 (LDA $0348 : AND.b #$01 : BNE BRANCH_RESH) -JSL.l LoadModifiedIceFloorValue_a01 : NOP +org $87D234 ; <- 3D234 - Bank07.asm : 12758 (LDA $0348 : AND.b #$11 : BEQ .notWalkingOnIce) +JSL LoadModifiedIceFloorValue_a11 : NOP ;-------------------------------------------------------------------------------- +org $87D26E ; <- 3D26E - Bank07.asm : 12786 (LDA $0348 : AND.b #$01 : BNE BRANCH_RESH) +JSL LoadModifiedIceFloorValue_a01 : NOP ;================================================================================ ; Sword Upgrade Randomization ;-------------------------------------------------------------------------------- -org $03FC16 ; <- 1FC16 ($A8, $B8, $3D, $D0, $B8, $3D) +org $83FC16 ; <- 1FC16 ($A8, $B8, $3D, $D0, $B8, $3D) db $B1, $C6, $F9, $C9, $C6, $F9 ; data insert - 2 chests, fat fairy room -org $01E97E ; <- E97E ($280016, $250016) -dl $080116, $070116; <- E97E + +; unused item receipts +org $81E97E +dw $0116 : db $08 +dw $0116 : db $25 + ;-------------------------------------------------------------------------------- -;org $06C9BC ; <- 349BC - sprite_ponds.asm : 1066 -;org $06C9C0 ; <- 349C0 - sprite_ponds.asm : 1068 -;org $06C926 ; <- 34926 - sprite_ponds.asm : 945 -;JML.l GetFairySword -;NOP #12 -org $06C936 ; <- 34936 - sprite_ponds.asm : 952 -PyramidFairy_BRANCH_IOTA: -org $06C948 ; <- 34948 - sprite_ponds.asm : 961 -PyramidFairy_BRANCH_GAMMA: ;-------------------------------------------------------------------------------- -;org $0EF7BD ; <- 777BD - sprite_ponds.asm : 1890 (LDA $7EF340, X : BMI .invalidValue : BNE VWF_ChangeItemTiles) -;JSL.l ReadInventoryPond -;org $0EF7E4 ; <- 777E4 - sprite_ponds.asm : 1922 (LDA $7EF340, X : BMI .invalidValue : BNE VWF_ChangeItemTiles) -;JSL.l ReadInventoryPond -;-------------------------------------------------------------------------------- -org $1EE16E ; <- F616E - sprite_bomb_shop_entity.asm : 73 +org $9EE16E ; <- F616E - sprite_bomb_shop_entity.asm : 73 NOP #8 ; fix bomb shop dialog for dwarfless big bomb -org $068A14 ; <- 30A14 - sprite_prep.asm : 716 +org $868A14 ; <- 30A14 - sprite_prep.asm : 716 NOP #8 ; fix bomb shop spawn for dwarfless big bomb ;-------------------------------------------------------------------------------- -org $06B489 ; <- 33489 - sprite_smithy_bros.asm : 473 (LDA $7EF359 : CMP.b #$03 : BCS .tempered_sword_or_better) -JML.l GetSmithSword -NOP #4 +org $86B489 ; <- 33489 - sprite_smithy_bros.asm : 473 (LDA $7EF359 : CMP.b #$03 : BCS .tempered_sword_or_better) +JML GetSmithSword : NOP #4 Smithy_DoesntHaveSword: -org $06B49D ; <- 3349D - sprite_smithy_bros.asm : 485 (.tempered_sword_or_better) +org $86B49D ; <- 3349D - sprite_smithy_bros.asm : 485 (.tempered_sword_or_better) Smithy_AlreadyGotSword: ;-------------------------------------------------------------------------------- -org $06ED55 ; <- 36D55 - Bank06.asm : 4817 -JSL.l LoadSwordForDamage ; moth gold sword fix +org $86ED55 ; <- 36D55 - Bank06.asm : 4817 +JSL LoadSwordForDamage ; moth gold sword fix ;-------------------------------------------------------------------------------- -org $08C5F7 ; <- 445F7 - ancilla_receive_item.asm : 400 (LDA.b #$09 : STA $012D) +org $88C5F7 ; <- 445F7 - ancilla_receive_item.asm : 400 (LDA.b #$09 : STA $012D) NOP #5 ; remove spooky telepathy sound ;-------------------------------------------------------------------------------- -org $08C431 ; <- 44431 - ancilla_receive_item.asm : 125 (LDA $0C5E, X : CMP.b #$01 : BNE .notMasterSword2) -JSL.l MSMusicReset : NOP -;LDA $8A : CMP.b #$80 : NOP -; $22 = $0000 - $00FF - MS Pedestal -; $22 = $0100 - $00FF - Hobo -;-------------------------------------------------------------------------------- +org $88C431 ; <- 44431 - ancilla_receive_item.asm : 125 (LDA $0C5E, X : CMP.b #$01 : BNE .notMasterSword2) +JSL MSMusicReset : NOP ;================================================================================ ; Temporary Nerfs and Buffs ;-------------------------------------------------------------------------------- -org $06F400 ; <- 37F400 - Bank06.asm : 5963 (CLC : ADC $7EF35B) -JSL.l LoadModifiedArmorLevel : NOP +org $86F400 ; <- 37F400 - Bank06.asm : 5963 (CLC : ADC $7EF35B) +JSL LoadModifiedArmorLevel : NOP ;-------------------------------------------------------------------------------- -org $07ADDB ; <- 3ADDB - Bank07.asm : 7251 (LDA $7EF37B : TAY) -JSL.l LoadModifiedMagicLevel +org $87ADDB ; <- 3ADDB - Bank07.asm : 7251 (LDA $7EF37B : TAY) +JSL LoadModifiedMagicLevel ;-------------------------------------------------------------------------------- -org $07AE0D ; <- 3AE0D - Bank07.asm : 7279 (LDA $7EF37B : TAY) -JSL.l LoadModifiedMagicLevel +org $87AE0D ; <- 3AE0D - Bank07.asm : 7279 (LDA $7EF37B : TAY) +JSL LoadModifiedMagicLevel ;-------------------------------------------------------------------------------- -org $07AE8E ; <- 3AE8E - Bank07.asm : 7376 (LDA $7EF37B : TAY) -JSL.l LoadModifiedMagicLevel +org $87AE8E ; <- 3AE8E - Bank07.asm : 7376 (LDA $7EF37B : TAY) +JSL LoadModifiedMagicLevel ;-------------------------------------------------------------------------------- -org $08DCB9 ; <- 45CB9 - ancilla_cane_spark.asm : 256 (LDA $7EF37B : TAY) -JSL.l LoadModifiedMagicLevel +org $88DCB9 ; <- 45CB9 - ancilla_cane_spark.asm : 256 (LDA $7EF37B : TAY) +JSL LoadModifiedMagicLevel ;-------------------------------------------------------------------------------- -org $07B08B +org $87B08B LinkItem_MagicCostBaseIndices: ;-------------------------------------------------------------------------------- -org $07B096 ; <- 3B096 - Bank07.asm : 7731 (LDA LinkItem_MagicCostBaseIndices, X : CLC : ADC $7EF37B : TAX) -JSL.l LoadModifiedMagicLevel : !ADD.w LinkItem_MagicCostBaseIndices, X -;-------------------------------------------------------------------------------- -org $07B0D5 ; <- 3B0D5 - Bank07.asm : 7783 (LDA LinkItem_MagicCostBaseIndices, X : CLC : ADC $7EF37B : TAX) -JSL.l LoadModifiedMagicLevel : !ADD.w LinkItem_MagicCostBaseIndices, X +org $87B096 ; <- 3B096 - Bank07.asm : 7731 (LDA LinkItem_MagicCostBaseIndices, X : CLC : ADC $7EF37B : TAX) +JSL LoadModifiedMagicLevel : !ADD.w LinkItem_MagicCostBaseIndices, X ;-------------------------------------------------------------------------------- +org $87B0D5 ; <- 3B0D5 - Bank07.asm : 7783 (LDA LinkItem_MagicCostBaseIndices, X : CLC : ADC $7EF37B : TAX) +JSL LoadModifiedMagicLevel : !ADD.w LinkItem_MagicCostBaseIndices, X ;================================================================================ ; Faster Great Fairies ;-------------------------------------------------------------------------------- -org $06C83D ; <- sprite_ponds.asm : 784 ( LDA.b #$FF : STA $0DF0, X ) +org $86C83D ; <- sprite_ponds.asm : 784 ( LDA.b #$FF : STA $0DF0, X ) db $30 ; (any faster and she appears as link is still throwing the bottle) ;-------------------------------------------------------------------------------- -org $06C896 ; <- sprite_ponds.asm : 844 ( LDA $1A : AND.b #$07 : BNE BRANCH_ALPHA ) +org $86C896 ; <- sprite_ponds.asm : 844 ( LDA $1A : AND.b #$07 : BNE BRANCH_ALPHA ) db $03 ; fade in speed. Should be power of 2 minus 1 -org $06C985 ; <- sprite_ponds.asm : 1025 ( LDA $1A : AND.b #$07 : BNE BRANCH_ALPHA ) +org $86C985 ; <- sprite_ponds.asm : 1025 ( LDA $1A : AND.b #$07 : BNE BRANCH_ALPHA ) db $03 ; fade out speed. Should be power of 2 minus 1 -;-------------------------------------------------------------------------------- ;================================================================================ ; New Items ;-------------------------------------------------------------------------------- -;org $07B57B ; <- 3B57B - Bank07.asm : 8523 (BMI .cantOpen) -;NOP #2 -;-------------------------------------------------------------------------------- -org $07B574 ; <- 3B574 - Bank07.asm : 8519 (LDA.b #$01 : STA $02E9) -JSL.l ChestPrep -NOP #3 +org $87B574 ; <- 3B574 - Bank07.asm : 8519 (LDA.b #$01 : STA $02E9) +JSL ChestPrep : NOP #3 db $90 ; !BCC .cantOpen ;-------------------------------------------------------------------------------- -org $008A9D +org $808A9D JSL ConditionalPushBlockTransfer : NOP -org $00D531 ; 5531 - Bank00.asm:3451 (LDY.b #$5D) -JML.l GetAnimatedSpriteGfxFile +org $80D531 ; 5531 - Bank00.asm:3451 (LDY.b #$5D) +JML GetAnimatedSpriteGfxFile -org $00D547 ; 5547 - Bank00.asm:3467 (JSR Decomp_spr_high) +org $80D547 ; 5547 - Bank00.asm:3467 (JSR Decomp_spr_high) GetAnimatedSpriteGfxFile_return: -org $00D557 ; 5557 - Bank00.asm:3486 (LDA $00 : ADC $D469, X) -JSL.l GetAnimatedSpriteBufferPointer -NOP +org $80D557 ; 5557 - Bank00.asm:3486 (LDA $00 : ADC $D469, X) +JSL GetAnimatedSpriteBufferPointer : NOP -org $05FA50 +org $85FA50 JSL Sprite_ConditionalPrepOAMCoord -org $0799F7 ; 399F7 - Bank07.asm:4107 (JSL AddReceivedItem) -JSL.l AddReceivedItemExpanded +org $8799F7 ; 399F7 - Bank07.asm:4107 (JSL AddReceivedItem) +JSL AddReceivedItemExpanded -org $08C505 +org $88C505 JSL Ancilla22_ItemReceipt_ContinueB : NOP #2 -org $098605 ; 48605 - ancilla_init.asm:709 (TYA : STA $02E4 : PHX) -JML.l Multiworld_AddReceivedItem_notCrystal +org $898605 ; 48605 - ancilla_init.asm:709 (TYA : STA $02E4 : PHX) +JML Multiworld_AddReceivedItem_notCrystal NOP -org $098611 ; 48611 - ancilla_init.asm:720 (LDA .item_target_addr+0, X) -LDA.w AddReceivedItemExpanded_item_target_addr+0, X -org $098616 ; 48616 - ancilla_init.asm:721 (LDA .item_target_addr+1, X) -LDA.w AddReceivedItemExpanded_item_target_addr+1, X -org $09861F ; 4861F - ancilla_init.asm:724 (LDA .item_values, Y) -LDA.w AddReceivedItemExpanded_item_values, Y +org $898611 ; 48611 - ancilla_init.asm:720 (LDA .item_target_addr+0, X) +LDA.w ItemReceipts_target+0, X +org $898616 ; 48616 - ancilla_init.asm:721 (LDA .item_target_addr+1, X) +LDA.w ItemReceipts_target+1, X +org $89861F ; 4861F - ancilla_init.asm:724 (LDA .item_values, Y) +LDA.w ItemReceipts_value, Y -org $098627 ; 48627 - ancilla_init.asm:731 (LDA .item_target_addr+0, X) -LDA.w AddReceivedItemExpanded_item_target_addr+0, X -org $09862C ; 4862C - ancilla_init.asm:722 (LDA .item_target_addr+1, X) -LDA.w AddReceivedItemExpanded_item_target_addr+1, X -org $098635 ; 48635 - ancilla_init.asm:727 (LDA .item_values, Y) -LDA.w AddReceivedItemExpanded_item_values, Y +org $898627 ; 48627 - ancilla_init.asm:731 (LDA .item_target_addr+0, X) +LDA.w ItemReceipts_target+0, X +org $89862C ; 4862C - ancilla_init.asm:722 (LDA .item_target_addr+1, X) +LDA.w ItemReceipts_target+1, X +org $898635 ; 48635 - ancilla_init.asm:727 (LDA .item_values, Y) +LDA.w ItemReceipts_value, Y -org $0986AA ; 486AA - ancilla_init.asm:848 (LDA .item_masks, X) -LDA.w AddReceivedItemExpanded_item_masks, X +org $8986AA ; 486AA - ancilla_init.asm:848 (LDA .item_masks, X) +LDA.w DungeonItemMasks, X -org $098769 ; 48769 - ancilla_init.asm:1005 (LDA .item_graphics_indices, Y) -LDA.w AddReceivedItemExpanded_item_graphics_indices, Y +org $898769 ; 48769 - ancilla_init.asm:1005 (LDA .item_graphics_indices, Y) +LDA.w ItemReceipts_graphics, Y -org $09884D ; 4884D - ancilla_init.asm:1137 (LDA $836C, Y) -LDA.w AddReceivedItemExpanded_y_offsets, Y -org $09885B ; 4885B - ancilla_init.asm:1139 (LDA .x_offsets, X) - I think the disassembly is wrong here, should have been LDA .x_offsets, Y -LDA.w AddReceivedItemExpanded_x_offsets, Y +org $898811 +JSL SetItemRiseTimer -org $0988B7 ; 488B7 - ancilla_init.asm:1199 (LDA .wide_item_flag, Y) -LDA.w AddReceivedItemExpanded_wide_item_flag, Y +org $89884D ; 4884D - ancilla_init.asm:1137 (LDA $836C, Y) +LDA.w ItemReceipts_offset_y, Y +org $89885B ; 4885B - ancilla_init.asm:1139 (LDA .x_offsets, X) - I think the disassembly is wrong here, should have been LDA .x_offsets, Y +LDA.w ItemReceipts_offset_x, Y -org $0988EF ; 488EF - ancilla_init.asm:1248 (LDA $836C, Y) -LDA.w AddReceivedItemExpanded_y_offsets, Y -org $098908 ; 48908 - ancilla_init.asm:1258 (LDA .x_offsets, Y) -LDA.w AddReceivedItemExpanded_x_offsets, Y +org $8988B7 ; 488B7 - ancilla_init.asm:1199 (LDA .wide_item_flag, Y) +LDA.w SpriteProperties_chest_width, Y -org $08C6C8 ; 446C8 - ancilla_receive_item.asm:538 (LDA AddReceiveItem.properties, X) +org $8988EF ; 488EF - ancilla_init.asm:1248 (LDA $836C, Y) +LDA.w ItemReceipts_offset_y, Y +org $898908 ; 48908 - ancilla_init.asm:1258 (LDA .x_offsets, Y) +LDA.w ItemReceipts_offset_x, Y + +org $88C6C8 ; 446C8 - ancilla_receive_item.asm:538 (LDA AddReceiveItem.properties, X) JSL CheckReceivedItemPropertiesBeforeLoad -org $08C6DE ; 446DE - ancilla_receive_item.asm:550 (LDA .wide_item_flag, X) -LDA.l AddReceivedItemExpanded_wide_item_flag, X +org $88C6DE ; 446DE - ancilla_receive_item.asm:550 (LDA .wide_item_flag, X) +JSL ItemReceiptWidthCheck -org $08C6F9 ; 446F9 - ancilla_receive_item.asm:570 (LDA AddReceiveItem.properties, X) +org $88C6F9 ; 446F9 - ancilla_receive_item.asm:570 (LDA AddReceiveItem.properties, X) JSL CheckReceivedItemPropertiesBeforeLoad -org $08C70F ; 4470F - ancilla_receive_item.asm : 582 - (LDA.b #$00 : STA ($92), Y) -JSL.l LoadNarrowObject +org $8985ED ; 485ED - ancilla_init.asm:693 (LDA $02E9 : CMP.b #$01) +JSL AddReceivedItemExpandedGetItem : NOP -org $0985ED ; 485ED - ancilla_init.asm:693 (LDA $02E9 : CMP.b #$01) -JSL.l AddReceivedItemExpandedGetItem -NOP +org $87B57D ; 3B57D - Bank07.asm:8527 (LDA Link_ReceiveItemAlternates, Y : STA $03) +BRA Link_PerformOpenChest_no_replacement -org $07B57D ; 3B57D - Bank07.asm:8527 (LDA Link_ReceiveItemAlternates, Y : STA $03) -JSL.l Link_ReceiveItemAlternatesExpanded_loadAlternate -NOP - -org $08C563 +org $88C563 JML ItemGetAlternateSFX : NOP -org $0988A5 +org $8988A5 JSL ItemGetOverworldAlternateSFX : NOP #5 ;-------------------------------------------------------------------------------- -org $09892E ; 4892E - ancilla_init.asm:1307 (LDA BottleList, X) +org $89892E ; 4892E - ancilla_init.asm:1307 (LDA BottleList, X) LDA.w BottleListExpanded, X -org $09895C ; 4895C - ancilla_init.asm:1344 (LDA PotionList, X) +org $89895C ; 4895C - ancilla_init.asm:1344 (LDA PotionList, X) LDA.w PotionListExpanded, X ;-------------------------------------------------------------------------------- -;org $098A36 ; <- 48A36 - ancilla_init.asm:1432 (LDA AddReceiveItem.item_graphics_indices, Y : STA $72) -;LDA AddReceivedItemExpanded_item_graphics_indices, Y -;-------------------------------------------------------------------------------- -org $06D1EB ; 351EB - sprite_absorbable.asm:364 (STA $7EF375) ; bugbug commented out until i figure out why it doesn't work +org $86D1EB ; 351EB - sprite_absorbable.asm:364 (STA $7EF375) ; bugbug commented out until i figure out why it doesn't work JSL HandleBombAbsorbtion ;-------------------------------------------------------------------------------- -;org $09873F ; <- 04873F - ancilla_init.asm : 960 (ADC [$00] : STA [$00] ) -;JSL.l AddToStock -;-------------------------------------------------------------------------------- -org $02EB18 +org $82EB18 JSL PostOverworldGfxLoad -org $18BD55 +org $98BD55 JSL PostUnderworldMap ;================================================================================ ; Kholdstare Shell Fix ;-------------------------------------------------------------------------------- -org $00EC88 ; <- 6C88 - Bank00.asm:6671 - (LDA $7EC380, X : STA $7EC580, X) -LDA $7EC3A0, X : STA $7EC5A0, X -;-------------------------------------------------------------------------------- -org $00ECEB ; <- 6CEB - Bank00.asm:6730 - (LDX.w #$0080) -LDX.w #$00A0 -LDA.w #$00B0 +org $80EC88 ; <- 6C88 - Bank00.asm:6671 - (LDA $7EC380, X : STA $7EC580, X) +LDA.l $7EC3A0, X : STA.l $7EC5A0, X ;-------------------------------------------------------------------------------- +org $80ECEB ; <- 6CEB - Bank00.asm:6730 - (LDX.w #$0080) +LDX.w #$00A0 : LDA.w #$00B0 ;================================================================================ ; Potion Refill Fixes ;-------------------------------------------------------------------------------- -;org $0DF1B3 ; <- 6F1B3 - headsup_display.asm:492 - (SEP #$30) -;JSL.l RefillMagic -;RTL +org $80F8FB ; <- 78FB - Bank00.asm:8507 - (JSL HUD.RefillHealth : BCC BRANCH_ALPHA) +JSL RefillHealth ;-------------------------------------------------------------------------------- -;org $0DF128 ; <- 6F128 - headsup_display.asm:407 - (LDA $7EF36D : CMP $7EF36C : BCC .refillAllHealth) -;JSL.l RefillHealth -;RTL +org $80F911 ; <- 7911 - Bank00.asm:8528 - (JSL HUD.RefillMagicPower : BCS BRANCH_$7901) +JSL RefillMagic ;-------------------------------------------------------------------------------- -org $00F8FB ; <- 78FB - Bank00.asm:8507 - (JSL HUD.RefillHealth : BCC BRANCH_ALPHA) -JSL.l RefillHealth -;-------------------------------------------------------------------------------- -org $00F911 ; <- 7911 - Bank00.asm:8528 - (JSL HUD.RefillMagicPower : BCS BRANCH_$7901) -JSL.l RefillMagic -;-------------------------------------------------------------------------------- -org $00F918 ; <- 7918 - Bank00.asm:8537 - (JSL HUD.RefillHealth : BCC .alpha) -JSL.l RefillHealth -;-------------------------------------------------------------------------------- -org $00F922 ; <- 7922 - Bank00.asm:8543 - (JSL HUD.RefillMagicPower : BCC .beta) -JSL.l RefillMagic +org $80F918 ; <- 7918 - Bank00.asm:8537 - (JSL HUD.RefillHealth : BCC .alpha) +JSL RefillHealth ;-------------------------------------------------------------------------------- +org $80F922 ; <- 7922 - Bank00.asm:8543 - (JSL HUD.RefillMagicPower : BCC .beta) +JSL RefillMagic ;================================================================================ ; Early Bottle Fix ;-------------------------------------------------------------------------------- -org $09894C ; <- 4894C - ancilla_init.asm:1327 -JSL.l InitializeBottles -;-------------------------------------------------------------------------------- +org $89894C ; <- 4894C - ancilla_init.asm:1327 +JSL InitializeBottles ;================================================================================ ; Agahnim Doors Fix ;-------------------------------------------------------------------------------- -org $099BBA +org $899BBA JSL FlagAgahnimDoor -org $1BBC94 ; <- DBC94 - Bank1B.asm : 201 (LDA $7EF3C5 : AND.w #$000F : CMP.w #$0003 : BCS BRANCH_EPSILON) -JSL.l LockAgahnimDoors : BNE Overworld_Entrance_BRANCH_EPSILON : NOP #6 +org $9BBC94 ; <- DBC94 - Bank1B.asm : 201 (LDA $7EF3C5 : AND.w #$000F : CMP.w #$0003 : BCS BRANCH_EPSILON) +JSL LockAgahnimDoors : BNE Overworld_Entrance_BRANCH_EPSILON : NOP #6 -org $1BBCC1 ; <- DBCC1 - Bank1B.asm : 223 (LDA $0F8004, X : AND.w #$01FF : STA $00) +org $9BBCC1 ; <- DBCC1 - Bank1B.asm : 223 (LDA $0F8004, X : AND.w #$01FF : STA $00) Overworld_Entrance_BRANCH_EPSILON: ; go here to lock doors ;-------------------------------------------------------------------------------- -; -- HOOK THIS LATER TO FUCK WITH BOSS DROPS -- -org $01C73E ; <- C73E - Bank01.asm : 10377 (LDA $01C6FC, X : JSL Sprite_SpawnFallingItem) -JSL.l DropSafeDungeon -NOP #4 +; Dungeon Drops ;-------------------------------------------------------------------------------- +org $81C50D : JSL CheckDungeonWorld +org $81C517 : JSL CheckDungeonCompletion +org $81C523 : JSL CheckDungeonCompletion +org $81C710 : JSL CheckSpawnPrize +BCS RoomTag_GetHeartForPrize_spawn_prize : BRA RoomTag_GetHeartForPrize_delete_tag +org $81C742 : JSL SpawnDungeonPrize +org $8799EA : JML SetItemPose +org $88C415 : JSL PendantMusicCheck +BCS Ancilla22_ItemReceipt_is_pendant : BRA Ancilla22_ItemReceipt_wait_for_music +;org $88C452 : JSL MaybeKeepLootID : NOP #2 DR overwrote hook see RetrieveBunnyState +org $88C61D : JSL AnimatePrizeCutscene : NOP +org $88C622 : BCC ItemReceipt_Animate_continue +org $88C6BA : JSL CheckPoseItemCoordinates +org $88CAD6 : JSL HandleDropSFX : NOP #2 +org $88CADC : BCC Ancilla29_MilestoneItemReceipt_skip_crystal_sfx +org $88CAE9 : JSL PrepPrizeTile +org $88CB23 : JSL PrizeDropSparkle : BCC Ancilla29_MilestoneItemReceipt_no_sparkle : NOP #2 +org $88CB97 : JSL PrepPrizeOAMCoordinates : BRA + : NOP #$12 : + +org $88CBFF : JSL PrepPrizeShadow +org $88CC6C : JSL HandleCrystalsField +org $88CCA6 : JSL PrepPrizeOAMCoordinates : NOP +org $8985FA : JSL SetCutsceneFlag : NOP #3 : BCC AddReceivedItem_notCrystal +org $8988B2 : JSL SetPrizeCoords : NOP + ;================================================================================ ; Uncle / Sage Fixes - Old Man Fixes - Link's House Fixes ;-------------------------------------------------------------------------------- -org $05DA4F ; <- 2DA4F - sprite_uncle_and_priest.asm : 45 (BCC .agahnim_not_defeated) -db 80 ; BRA +org $85DA4F ; <- 2DA4F - sprite_uncle_and_priest.asm : 45 (BCC .agahnim_not_defeated) +db $80 ; BRA ;-------------------------------------------------------------------------------- -org $05DA61 ; <- 2DA61 - sprite_uncle_and_priest.asm : 51 (BEQ .priest_not_already_dead) -db 80 ; BRA +org $85DA61 ; <- 2DA61 - sprite_uncle_and_priest.asm : 51 (BEQ .priest_not_already_dead) +db $80 ; BRA ;-------------------------------------------------------------------------------- -org $05DA81 ; <- 2DA81 - sprite_uncle_and_priest.asm : 65 (BCC .dontHaveMasterSword) -db 80 ; BRA +org $85DA81 ; <- 2DA81 - sprite_uncle_and_priest.asm : 65 (BCC .dontHaveMasterSword) +db $80 ; BRA ;-------------------------------------------------------------------------------- -;org $05DE1D ; <- 2DE1D - sprite_uncle_and_priest.asm : 725 (LDA.b #$A0 : STA $7EF372) -;JSL.l RefillHealthPlusMagic8bit -;NOP #2 -;-------------------------------------------------------------------------------- -org $05DEF8 ; <- 2DEF8 - sprite_uncle_and_priest.asm : 917 (LDA.b #$05) +org $85DEF8 ; <- 2DEF8 - sprite_uncle_and_priest.asm : 917 (LDA.b #$05) LDA.b #$00 ;-------------------------------------------------------------------------------- -;org $1EEAB6 ; <- F6AB6 - sprite_old_mountain_man.asm : 338 (LDA.b #$A0 : STA $7EF372) -;JSL.l RefillHealthPlusMagic8bit -;NOP #2 -;-------------------------------------------------------------------------------- -;org $01E5B2 ; <- E5B8 - lower pot link's house -;db $14 ; fairy -;org $01E5B5 ; <- E5B8 - lower pot link's house -;db $14 ; fairy -;org $01E5B8 ; <- E5B8 - lower pot link's house -;db $0D ; big magic -;-------------------------------------------------------------------------------- - -;================================================================================ -; Ganon's Tower Basement Door Fix -;-------------------------------------------------------------------------------- -;org $1FF3F4 ; <- 0FF3F4 -;db $00 -;-------------------------------------------------------------------------------- -; Misery Mire Basement Door Fix -;-------------------------------------------------------------------------------- -;org $1FB8E4 ; <- 0FB8E4 -;db $00 -;-------------------------------------------------------------------------------- ;0xFE465 -> 0x1E -org $1FE465 -db #$1E +org $9FE465 ; changes key door in tr pipes to a normal door +db $1E ;-------------------------------------------------------------------------------- ;================================================================================ ; Bomb & Arrow Capacity Updates ;-------------------------------------------------------------------------------- -org $0DDC27 ; <- 6DC27 - headsup_display.asm:151 (LDA $7EF370 : TAY) -JSL.l IncrementBombs -NOP #15 +org $8DDC27 ; <- 6DC27 - headsup_display.asm:151 (LDA $7EF370 : TAY) +JSL IncrementBombs : NOP #15 ;-------------------------------------------------------------------------------- -org $0DDC49 ; <- 6DC49 - headsup_display.asm:169 (LDA $7EF371 : TAY) -JSL.l IncrementArrows -NOP #15 -;-------------------------------------------------------------------------------- -org $1EE199 ; <- F6199 - sprite_bomb_shop_entity.asm:102 (LDA $7EF370 : PHX : TAX) -JSL.l CompareBombsToMax -NOP #11 +org $8DDC49 ; <- 6DC49 - headsup_display.asm:169 (LDA $7EF371 : TAY) +JSL IncrementArrows : NOP #15 ;-------------------------------------------------------------------------------- +org $9EE199 ; <- F6199 - sprite_bomb_shop_entity.asm:102 (LDA $7EF370 : PHX : TAX) +JSL CompareBombsToMax : NOP #11 ;================================================================================ ; Bonk Items ;-------------------------------------------------------------------------------- -org $05FC7E ; <- 2FC7E - sprite_dash_item.asm : 118 (LDA $7EF36F : INC A : STA $7EF36F) -JSL.l GiveBonkItem : NOP #5 -org $05FC97 ; <- 2FC97 - sprite_dash_item.asm : 126 (LDA.b #$2F : JSL Sound_SetSfx3PanLong) +org $85FC7E ; <- 2FC7E - sprite_dash_item.asm : 118 (LDA $7EF36F : INC A : STA $7EF36F) +JSL GiveBonkItem : NOP #5 +org $85FC97 ; <- 2FC97 - sprite_dash_item.asm : 126 (LDA.b #$2F : JSL Sound_SetSfx3PanLong) NOP #6 ;-------------------------------------------------------------------------------- -org $068D39 ; <- 30D39 - sprite_prep.asm : 1435 - (LDA.b #$08 : STA $0F50, X) -JSL.l LoadBonkItemGFX -;-------------------------------------------------------------------------------- -org $05FC04 ; <- 2FC04 - sprite_dash_item.asm : 38 - (JSL DashKey_Draw) -JSL.l DrawBonkItemGFX +org $868D39 ; <- 30D39 - sprite_prep.asm : 1435 - (LDA.b #$08 : STA $0F50, X) +JSL LoadBonkItemGFX ;-------------------------------------------------------------------------------- +org $85FC04 ; <- 2FC04 - sprite_dash_item.asm : 38 - (JSL DashKey_Draw) +JSL DrawBonkItemGFX ;================================================================================ ; Library Item ;-------------------------------------------------------------------------------- -org $05FD44 ; <- 2FD44 - sprite_dash_item.asm : 244 - (JSL Link_ReceiveItem) -JSL.l SetLibraryItem +org $85FD44 ; <- 2FD44 - sprite_dash_item.asm : 244 - (JSL Link_ReceiveItem) +JSL SetLibraryItem ;-------------------------------------------------------------------------------- -org $068D1B ; <- 30D1B - sprite_prep.asm : 1414 - (JSL GetAnimatedSpriteTile.variable) -JSL.l LoadLibraryItemGFX +org $868D1B ; <- 30D1B - sprite_prep.asm : 1414 - (JSL GetAnimatedSpriteTile.variable) +JSL LoadLibraryItemGFX ;-------------------------------------------------------------------------------- -org $05FC9E ; <- 2FC9E - sprite_dash_item.asm : 138 - (JSL Sprite_PrepAndDrawSingleLargeLong) -JSL.l DrawLibraryItemGFX -;-------------------------------------------------------------------------------- -org $068D0E ; <- 30D0E - sprite_prep.asm : 1401 - (LDA $7EF34E : BEQ .book_of_mudora) -JSL.l ItemCheck_Library +org $85FC9E ; <- 2FC9E - sprite_dash_item.asm : 138 - (JSL Sprite_PrepAndDrawSingleLargeLong) +JSL DrawLibraryItemGFX ;-------------------------------------------------------------------------------- +org $868D0E ; <- 30D0E - sprite_prep.asm : 1401 - (LDA $7EF34E : BEQ .book_of_mudora) +JSL ItemCheck_Library ;================================================================================ ; Inventory Updates ;-------------------------------------------------------------------------------- -org $0DDF38 ; <- 6DF38 - equipment.asm : 480 -JSL.l ProcessMenuButtons +org $8DDF38 ; <- 6DF38 - equipment.asm : 480 +JSL ProcessMenuButtons BCC _equipment_497 JMP.w _equipment_544 -;NOP #7 ResetEquipment: -JSR.w RestoreNormalMenu ; (short) +JSR RestoreNormalMenu ; (short) RTL NOP #3 -warnpc $0DDF49 -org $0DDF49 ; <- 6DF49 - equipment.asm : 497 +warnpc $8DDF49 +org $8DDF49 ; <- 6DF49 - equipment.asm : 497 _equipment_497: ; LDA $F4 : AND.b #$08 : BEQ .notPressingUp - NO BUTTON CAPTURE -;org $0DDF7E ; <- 6DF7E - equipment.asm : 539 -org $0DDF88 ; <- 6DF88 - equipment.asm : 544 -;org $0DE10E ; <- 6E10E - equipment.asm : 806 +org $8DDF88 ; <- 6DF88 - equipment.asm : 544 _equipment_544: ;-------------------------------------------------------------------------------- -org $0DEB98 ; <- 6EB98 - equipment.asm : 1803 -;LDA.w #$3C60 : STA $FFBE, Y -;ORA.w #$4000 : STA $FFC4, Y -;ORA.w #$8000 : STA $0084, Y -;EOR.w #$4000 : STA $007E, Y -LDA.w #$3C60 : STA $FFBE, Y -ORA.w #$8000 : STA $007E, Y -ORA.w #$4000 : STA $0084, Y -JSL.l AddYMarker -NOP #2 +org $8DEB98 ; <- 6EB98 - equipment.asm : 1803 +LDA.w #$3C60 : STA.w $FFBE, Y +ORA.w #$8000 : STA.w $007E, Y +ORA.w #$4000 : STA.w $0084, Y +JSL AddYMarker : NOP #2 ;-------------------------------------------------------------------------------- -org $0DF789+6 ; <- 6F789+6 (not in disassembly) - red bottle hud tile, lower right -dw #$2413 ; (Orig: #$24E3) -org $0DF789+6+8 ; green bottle hud tile, lower right -dw #$3C12 ; (Orig: #$3CE3) -org $0DF789+6+16 ; blue bottle hud tile, lower right -dw #$2C14 ; (Orig: #$2CD2) -org $0DF789+6+40 ; good bee hud tile, lower right -dw #$2815 ; (Orig: #$283A) -org $0DF8A1+6 ; <- 6F8A1+6 (not in disassembly) - green mail tile, lower right -dw #$3C4B ; (Orig: #$7C78) -org $0DF8A1+6+8 ; blue mail tile tile, lower right -dw #$2C4F ; (Orig: #$6C78) -org $0DF8A1+6+16 ; red mail tile, lower right -dw #$242F ; (Orig: #$6478) +org $8DF789+6 ; <- 6F789+6 (not in disassembly) - red bottle hud tile, lower right +dw $2413 ; (Orig: #$24E3) +org $8DF789+6+8 ; green bottle hud tile, lower right +dw $3C12 ; (Orig: #$3CE3) +org $8DF789+6+16 ; blue bottle hud tile, lower right +dw $2C14 ; (Orig: #$2CD2) +org $8DF789+6+40 ; good bee hud tile, lower right +dw $2815 ; (Orig: #$283A) +org $8DF8A1+6 ; <- 6F8A1+6 (not in disassembly) - green mail tile, lower right +dw $3C4B ; (Orig: #$7C78) +org $8DF8A1+6+8 ; blue mail tile tile, lower right +dw $2C4F ; (Orig: #$6C78) +org $8DF8A1+6+16 ; red mail tile, lower right +dw $242F ; (Orig: #$6478) ;-------------------------------------------------------------------------------- -;org $0DDE9B ; <- 6DE9B equipment.asm:296 - LDA $0202 : CMP.b #$10 : BNE .notOnBottleMenu (CMP instruction) -;CMP.b #$FF -;-------------------------------------------------------------------------------- -org $0DDE9F ; <- 6DE9F equipment.asm:300 - LDA.b #$0A : STA $0200 +org $8DDE9F ; <- 6DE9F equipment.asm:300 - LDA.b #$0A : STA $0200 LDA.b #$04 ;-------------------------------------------------------------------------------- -org $0DDE59 ; <- 6DE59 equipment.asm:247 - REP #$20 -JSL.l BringMenuDownEnhanced : RTS +org $8DDE59 ; <- 6DE59 equipment.asm:247 - REP #$20 +JSL BringMenuDownEnhanced : RTS ;-------------------------------------------------------------------------------- -org $0DDFBC ; <- 6DFBC equipment.asm:599 - LDA $EA : ADD.w #$0008 : STA $EA : SEP #$20 : BNE .notDoneScrolling -JSL.l RaiseHudMenu : NOP #3 +org $8DDFBC ; <- 6DFBC equipment.asm:599 - LDA $EA : ADD.w #$0008 : STA $EA : SEP #$20 : BNE .notDoneScrolling +JSL RaiseHudMenu : NOP #3 ;-------------------------------------------------------------------------------- -org $0DDE3D ; <- 6DE3D equipment.asm:217 - BNE .equippedItemIsntBottle +org $8DDE3D ; <- 6DE3D equipment.asm:217 - BNE .equippedItemIsntBottle db $80 ; BRA ;-------------------------------------------------------------------------------- -org $0DDF9A ; <- 6DF9A - equipment.asm : 554 -JSL.l OpenBottleMenu -NOP +org $8DDF9A ; <- 6DF9A - equipment.asm : 554 +JSL OpenBottleMenu : NOP ;-------------------------------------------------------------------------------- -org $0DE12D ; <- 6E12D - equipment.asm : 828 -JSL.l CloseBottleMenu +org $8DE12D ; <- 6E12D - equipment.asm : 828 +JSL CloseBottleMenu ;-------------------------------------------------------------------------------- -org $0DDF1E ; <- 6DF1E - equipment.asm : 462 - LDA $F4 : AND.b #$10 : BEQ .dontLeaveMenu -JSL.l CheckCloseItemMenu +org $8DDF1E ; <- 6DF1E - equipment.asm : 462 - LDA $F4 : AND.b #$10 : BEQ .dontLeaveMenu +JSL CheckCloseItemMenu ;-------------------------------------------------------------------------------- -org $0DEE70 ; <- 6EE70 - equipment.asm : 2137 -JSL.l PrepItemScreenBigKey -NOP +org $8DEE70 ; <- 6EE70 - equipment.asm : 2137 +JSL PrepItemScreenBigKey : NOP ;-------------------------------------------------------------------------------- -org $08D395 ; <- 45395 - ancilla_bird_travel_intro.asm : 253 -JSL.l UpgradeFlute -NOP #2 +org $8DDEA5 ; LDA.b Joy1A_New : BEQ .wait_for_button +JSL HandleEmptyMenu : RTS +org $8DEB3C ; LDA.w ItemCursor : AND.w #$00FF +JML MaybeDrawEquippedItem : NOP #2 +org $8DE363 ; LDA.b #$04 : STA.w SubModuleInterface +JSL RestoreMenu_SetSubModule : NOP ;-------------------------------------------------------------------------------- -org $07A408 ; LDA.l $7EF34C -JSL.l FluteCallForDuck +org $88D395 ; <- 45395 - ancilla_bird_travel_intro.asm : 253 +JSL UpgradeFlute : NOP #2 ;-------------------------------------------------------------------------------- -org $05E4D7 ; <- 2E4D7 - sprite_witch.asm : 213 -JSL.l RemoveMushroom -NOP #2 +org $87A408 ; LDA.l $7EF34C +JSL FluteCallForDuck ;-------------------------------------------------------------------------------- -org $05F55F ; <- 2F55F - sprite_potion_shop.asm : 59 -JSL.l LoadPowder +org $85E4D7 ; <- 2E4D7 - sprite_witch.asm : 213 +JSL RemoveMushroom : NOP #2 ;-------------------------------------------------------------------------------- -org $05F67B ; <- 2F67B - sprite_potion_shop.asm : 234 +org $85F55F ; <- 2F55F - sprite_potion_shop.asm : 59 +JSL LoadPowder +;-------------------------------------------------------------------------------- +org $85F67B ; <- 2F67B - sprite_potion_shop.asm : 234 JSL DrawPowder RTS ;-------------------------------------------------------------------------------- -org $05F65D ; <- 2F65D - sprite_potion_shop.asm : 198 -JSL.l CollectPowder -NOP #5 +org $85F65D ; <- 2F65D - sprite_potion_shop.asm : 198 +JSL CollectPowder : NOP #5 ;-------------------------------------------------------------------------------- -org $05EE5F ; <- 2EE5F - sprite_mushroom.asm : 30 -JSL.l LoadMushroom -BRA + : NOP #7 : + +org $85EE5F ; <- 2EE5F - sprite_mushroom.asm : 30 +JSL LoadMushroom : NOP ;-------------------------------------------------------------------------------- -org $05EE78 ; <- 2EE78 - sprite_mushroom.asm : 58 -JSL.l DrawMushroom +org $85EE78 ; <- 2EE78 - sprite_mushroom.asm : 58 +JSL DrawMushroom ;-------------------------------------------------------------------------------- -org $05EE97 ; <- 2EE97 - sprite_mushroom.asm : 81 +org $85EE97 ; <- 2EE97 - sprite_mushroom.asm : 81 NOP #14 ;-------------------------------------------------------------------------------- -org $06C09C ; <- - bank06.asm : 1885 (JSL SpritePrep_PotionShopLong) +org $86C09C ; <- - bank06.asm : 1885 (JSL SpritePrep_PotionShopLong) JSL SpritePrep_ShopKeeper_PotionShop -org $05F521 +org $85F521 SpritePrep_PotionShopLong: -org $05F539 +org $85F539 SpawnMagicPowder: ;-------------------------------------------------------------------------------- -org $05F568 ; <- 2F568 - sprite_potion_shop.asm -LDA #$b0 : STA $0D00, Y : LDA #$90 : STA $0D10, Y ; manually set position of powder item -LDA #$21 : STA $0D20, Y : LDA #$12 : STA $0D30, Y +org $85F568 ; <- 2F568 - sprite_potion_shop.asm +LDA.b #$B0 : STA.w SpritePosYLow, Y : LDA.b #$90 : STA.w SpritePosXLow, Y ; manually set position of powder item +LDA.b #$21 : STA.w SpritePosYHigh, Y : LDA.b #$12 : STA.w SpritePosXHigh, Y JMP $F61D ;-------------------------------------------------------------------------------- -org $05F633 ; <- 2F633 - sprite_potion_shop.asm +org $85F633 ; <- 2F633 - sprite_potion_shop.asm JSL Sprite_ShopKeeperPotion : RTS : NOP ;; TODO: i don't remember prices being set on top of the player PotionShopkeeperJumpTable: -org $05F893 ; <- witch behavior here +org $85F893 ; <- witch behavior here Sprite_WitchAssistant: -org $05F644 ; <- powder behavior here +org $85F644 ; <- powder behavior here Sprite_MagicPowderItem: ;-------------------------------------------------------------------------------- -org $05EB1D ; <- 2EB1D - sprite_bottle_vendor.asm : 158 -JSL.l Multiworld_BottleVendor_GiveBottle +org $85EB1D ; <- 2EB1D - sprite_bottle_vendor.asm : 158 +JSL Multiworld_BottleVendor_GiveBottle ;-------------------------------------------------------------------------------- -org $07A36F ; <- 3A36F - Bank07.asm : 5679 +org $87A36F ; <- 3A36F - Bank07.asm : 5679 NOP #5 -org $07A379 ; <- 3A379 - Bank07.asm : 5687 -JSL.l SpawnHauntedGroveItem +org $87A379 ; <- 3A379 - Bank07.asm : 5687 +JSL SpawnHauntedGroveItem ;-------------------------------------------------------------------------------- -org $07A303 ; 3A303 - Bank07.asm : 5622 -;JSL.l FixShovelLock -;-------------------------------------------------------------------------------- -org $07A3A2 ; 3A3A2 - Bank07.asm : 5720 - JSL DiggingGameGuy_AttemptPrizeSpawn -JSL.l SpawnShovelItem +org $87A3A2 ; 3A3A2 - Bank07.asm : 5720 - JSL DiggingGameGuy_AttemptPrizeSpawn +JSL SpawnShovelItem BRA _Bank07_5726 -org $1DFDAC -JSL.l SpawnShovelGamePrize -org $07A3AB ; 3A3AB - Bank07.asm : 5726 - LDA.b #$12 : JSR Player_DoSfx2 +org $9DFDAC +JSL SpawnShovelGamePrize +org $87A3AB ; 3A3AB - Bank07.asm : 5726 - LDA.b #$12 : JSR Player_DoSfx2 _Bank07_5726: -;org $07A381 ; 3A381 - Bank07.asm : 5693 - ORA $035B -;ORA $035B -;-------------------------------------------------------------------------------- -org $079A0E ; 39A0E - Bank07.asm : 4117 - JSL HUD.RefreshIconLong -JSL.l Link_ReceiveItem_HUDRefresh ;-------------------------------------------------------------------------------- +org $879A0E ; 39A0E - Bank07.asm : 4117 - JSL HUD.RefreshIconLong +JSL Link_ReceiveItem_HUDRefresh ;================================================================================ ; Swordless Mode ;-------------------------------------------------------------------------------- -org $07A49F ; <- 3A49F - Bank07.asm:5903 (LDA $7EF359 : INC A : AND.b #$FE : BEQ .cant_cast_play_sound) - Ether -JSL.l CheckMedallionSword +org $87A49F ; <- 3A49F - Bank07.asm:5903 (LDA $7EF359 : INC A : AND.b #$FE : BEQ .cant_cast_play_sound) - Ether +JSL CheckMedallionSword ;-------------------------------------------------------------------------------- -org $07A574 ; <- 3A574 - Bank07.asm:6025 (LDA $7EF359 : INC A : AND.b #$FE : BEQ BRANCH_BETA) - Bombos -JSL.l CheckMedallionSword +org $87A574 ; <- 3A574 - Bank07.asm:6025 (LDA $7EF359 : INC A : AND.b #$FE : BEQ BRANCH_BETA) - Bombos +JSL CheckMedallionSword ;-------------------------------------------------------------------------------- -org $07A656 ; <- 3A656 - Bank07.asm:6133 (LDA $7EF359 : INC A : AND.b #$FE : BEQ BRANCH_BETA) - Quake -JSL.l CheckMedallionSword +org $87A656 ; <- 3A656 - Bank07.asm:6133 (LDA $7EF359 : INC A : AND.b #$FE : BEQ BRANCH_BETA) - Quake +JSL CheckMedallionSword ;-------------------------------------------------------------------------------- -org $05F3A0 ; <- 2F3A0 - sprite_medallion_tablet.asm:240 (LDA $7EF359 : BMI .zeta) -JSL.l CheckTabletSword +org $85F3A0 ; <- 2F3A0 - sprite_medallion_tablet.asm:240 (LDA $7EF359 : BMI .zeta) +JSL CheckTabletSword ;-------------------------------------------------------------------------------- -org $05F40A ; <- 2F40A - sprite_medallion_tablet.asm:303 (LDA $7EF359 : BMI .show_hylian_script) -JSL.l CheckTabletSword +org $85F40A ; <- 2F40A - sprite_medallion_tablet.asm:303 (LDA $7EF359 : BMI .show_hylian_script) +JSL CheckTabletSword ;-------------------------------------------------------------------------------- -org $1DF086 ; <- EF086 - sprite_evil_barrier.asm:303 (LDA $7EF359 : CMP.b #$02 : BCS .anozap_from_player_attack) -JSL.l GetSwordLevelForEvilBarrier +org $9DF086 ; <- EF086 - sprite_evil_barrier.asm:303 (LDA $7EF359 : CMP.b #$02 : BCS .anozap_from_player_attack) +JSL GetSwordLevelForEvilBarrier ;-------------------------------------------------------------------------------- ;================================================================================ ; Medallion Tablets ;-------------------------------------------------------------------------------- -org $05F274 ; <- 2F274 -JSL.l ItemCheck_BombosTablet +org $85F274 ; <- 2F274 +JSL ItemCheck_BombosTablet ;-------------------------------------------------------------------------------- -org $05F285 ; <- 2F285 -JSL.l ItemCheck_EtherTablet +org $85F285 ; <- 2F285 +JSL ItemCheck_EtherTablet ;-------------------------------------------------------------------------------- -;org $098BCC ; <- 48BCC - ancilla_init.asm : 1679 (LDA AddReceiveItem.item_graphics_indices, Y : STA $72) -;;JSL.l SetTabletItem -;JSL SpawnTabletItem : PLX : PLB : RTL -;-------------------------------------------------------------------------------- -org $07859F ; <- 3859F - Bank07.asm : 965 (JSL AddPendantOrCrystal) +org $87859F ; <- 3859F - Bank07.asm : 965 (JSL AddPendantOrCrystal) JSL SpawnTabletItem -org $07862A ; <- 3862A - Bank07.asm : 1064 (JSL AddPendantOrCrystal) +org $87862A ; <- 3862A - Bank07.asm : 1064 (JSL AddPendantOrCrystal) JSL SpawnTabletItem ;-------------------------------------------------------------------------------- +org $85EF1E ; LDA.l $7EF280,X : AND #$40 +JSL CheckTabletItem : NOP #2 +;-------------------------------------------------------------------------------- +org $85EFFA ; <- 2EFFA - sprite_heart_upgrades.asm : 216 (LDA $7EF280, X : ORA.b #$40 : STA $7EF280, X) +JSL.l SaveTabletItem +NOP #6 ;================================================================================ ; Medallion Entrances ;-------------------------------------------------------------------------------- -org $08B504 ; <- 43504 - ancilla_bombos_spell.asm : 671 -JSL.l MedallionTrigger_Bombos -NOP +org $88B504 ; <- 43504 - ancilla_bombos_spell.asm : 671 +JSL MedallionTrigger_Bombos : NOP ;-------------------------------------------------------------------------------- -org $08ACC8 ; <- 42CC8 - ancilla_ether_spell.asm : 350 -JSL.l MedallionTrigger_Ether +org $88ACC8 ; <- 42CC8 - ancilla_ether_spell.asm : 350 +JSL MedallionTrigger_Ether JMP _ancilla_ether_spell_363 -warnpc $08ACE6 -org $08ACE6 ; <- 42CE6 - ancilla_quake_spell.asm : 363 +warnpc $88ACE6 +org $88ACE6 ; <- 42CE6 - ancilla_quake_spell.asm : 363 _ancilla_ether_spell_363: ;-------------------------------------------------------------------------------- -org $08B6EA ; <- 436EA - ancilla_quake_spell.asm : 67 -JSL.l MedallionTrigger_Quake +org $88B6EA ; <- 436EA - ancilla_quake_spell.asm : 67 +JSL MedallionTrigger_Quake JMP _ancilla_quake_spell_83 Ancilla_CheckIfEntranceTriggered: JSR $F856 RTL -warnpc $08B708 -org $08B708 ; <- 43708 - ancilla_quake_spell.asm : 83 +warnpc $88B708 +org $88B708 ; <- 43708 - ancilla_quake_spell.asm : 83 _ancilla_quake_spell_83: -;-------------------------------------------------------------------------------- ;================================================================================ ; Animated Entrances ;-------------------------------------------------------------------------------- -org $1BCAC4 ; <- Bank1B.asm : 1537 (STA $02E4 ; Link can't move.) +org $9BCAC4 ; <- Bank1B.asm : 1537 (STA $02E4 ; Link can't move.) JSL AnimatedEntranceFix BNE + RTL NOP #2 + -;-------------------------------------------------------------------------------- ;================================================================================ ; Big & Great Fairies ;-------------------------------------------------------------------------------- -org $1DC475 ; <- EC475 - sprite_big_fairie.asm : 70 (LDA.w #$00A0 : ADD $7EF372 : STA $7EF372) -JSL.l RefillHealthPlusMagic -NOP #8 +org $9DC475 ; <- EC475 - sprite_big_fairie.asm : 70 (LDA.w #$00A0 : ADD $7EF372 : STA $7EF372) +JSL RefillHealthPlusMagic : NOP #8 -org $1DC489 ; <- EC489 - sprite_big_fairie.asm : 88 (LDA $7EF36D : CMP $7EF36C : BNE .player_hp_not_full_yet) -NOP #4 -JSL.l CheckFullHealth +org $9DC489 ; <- EC489 - sprite_big_fairie.asm : 88 (LDA $7EF36D : CMP $7EF36C : BNE .player_hp_not_full_yet) +NOP #4 : JSL CheckFullHealth ;-------------------------------------------------------------------------------- ;================================================================================ ; RNG Fixes ;-------------------------------------------------------------------------------- -org $1DFD9E ; <- EFD9E - sprite_diggin_guy.asm : 307 +org $9DFD9E ; <- EFD9E - sprite_diggin_guy.asm : 307 NOP #8 ;-------------------------------------------------------------------------------- -org $1DFD67 ; <- EFD67 - sprite_diggin_guy.asm : 242 -JSL.l RigDigRNG +org $9DFD67 ; <- EFD67 - sprite_diggin_guy.asm : 242 +JSL RigDigRNG ;-------------------------------------------------------------------------------- -org $01EE94 ; <- EE94 - Bank01.asm : 14121 -JSL.l RigChestRNG -org $01EEF5 ; <- EEF5 - Bank01.asm -JSL.l FixChestCounterForChestGame -org $01EEFD ; <- EEFD - Bank01.asm -JSL.l FixChestCounterForChestGame +org $81EE94 ; <- EE94 - Bank01.asm : 14121 +JSL RigChestRNG +org $81EEF5 ; <- EEF5 - Bank01.asm +JSL FixChestCounterForChestGame +org $81EEFD ; <- EEFD - Bank01.asm +JSL FixChestCounterForChestGame ;-------------------------------------------------------------------------------- -org $1ED63E ; <- F563E - sprite_agahnim.asm +org $9ED63E ; <- F563E - sprite_agahnim.asm JSL RNG_Agahnim1 -org $1ED6EF ; <- F56EF - sprite_agahnim.asm +org $9ED6EF ; <- F56EF - sprite_agahnim.asm JSL RNG_Agahnim1 -org $1D91E3 ; <- E91E3 - sprite_ganon.asm +org $9D91E3 ; <- E91E3 - sprite_ganon.asm JSL RNG_Ganon_Extra_Warp -org $1D9488 ; <- E9488 - sprite_ganon.asm +org $9D9488 ; <- E9488 - sprite_ganon.asm JSL RNG_Ganon ;-------------------------------------------------------------------------------- -;org $01EDB2 ; <- EDB2 - Bank01.asm : 14038 -;INC $04C4 +org $85A3F4 ; <- 2A3F4 - sprite_lanmola.asm : 112 (JSL GetRandomInt : AND.b #$07 : TAY) +JSL RNG_Lanmolas1 +org $85A401 ; <- 2A401 - sprite_lanmola.asm : 116 (JSL GetRandomInt : AND.b #$07 : TAY) +JSL RNG_Lanmolas1 +org $85A4FA ; <- 2A4FA - sprite_lanmola.asm : 241 (JSL GetRandomInt : AND.b #$07 : TAY) +JSL RNG_Lanmolas1 +org $85A507 ; <- 2A507 - sprite_lanmola.asm : 245 (JSL GetRandomInt : AND.b #$07 : TAY) +JSL RNG_Lanmolas1 ;-------------------------------------------------------------------------------- -org $05A3F4 ; <- 2A3F4 - sprite_lanmola.asm : 112 (JSL GetRandomInt : AND.b #$07 : TAY) -JSL.l RNG_Lanmolas1 -org $05A401 ; <- 2A401 - sprite_lanmola.asm : 116 (JSL GetRandomInt : AND.b #$07 : TAY) -JSL.l RNG_Lanmolas1 -org $05A4FA ; <- 2A4FA - sprite_lanmola.asm : 241 (JSL GetRandomInt : AND.b #$07 : TAY) -JSL.l RNG_Lanmolas1 -org $05A507 ; <- 2A507 - sprite_lanmola.asm : 245 (JSL GetRandomInt : AND.b #$07 : TAY) -JSL.l RNG_Lanmolas1 +org $9DD817 ; <- ED817 - sprite_giant_moldorm.asm : 187 (JSL GetRandomInt : AND.b #$02 : DEC A : STA $0EB0, X) +JSL RNG_Moldorm1 +org $9DD821 ; <- ED821 - sprite_giant_moldorm.asm : 189 (JSL GetRandomInt : AND.b #$1F : ADC.b #$20 : STA !timer_0, X) +JSL RNG_Moldorm1 +org $9DD832 ; <- ED832 - sprite_giant_moldorm.asm : 203 (JSL GetRandomInt : AND.b #$0F : ADC.b #$08 : STA !timer_0, X) +JSL RNG_Moldorm1 ;-------------------------------------------------------------------------------- -org $1DD817 ; <- ED817 - sprite_giant_moldorm.asm : 187 (JSL GetRandomInt : AND.b #$02 : DEC A : STA $0EB0, X) -JSL.l RNG_Moldorm1 -org $1DD821 ; <- ED821 - sprite_giant_moldorm.asm : 189 (JSL GetRandomInt : AND.b #$1F : ADC.b #$20 : STA !timer_0, X) -JSL.l RNG_Moldorm1 -org $1DD832 ; <- ED832 - sprite_giant_moldorm.asm : 203 (JSL GetRandomInt : AND.b #$0F : ADC.b #$08 : STA !timer_0, X) -JSL.l RNG_Moldorm1 +org $9E81A9 ; <- F01A9 - sprite_helmasaur_king.asm : 247 (JSL GetRandomInt : AND.b #$07 : TAY) +JSL RNG_Helmasaur +org $9E8262 ; <- F0262 - sprite_helmasaur_king.asm : 373 (JSL GetRandomInt : AND.b #$01 : BEQ BRANCH_BETA) +JSL RNG_Helmasaur +org $9DEEE1 ; <- EEEE1 - sprite_helmasaur_fireball.asm : 236 (JSL GetRandomInt : STA $0FB6) +JSL RNG_Helmasaur ;-------------------------------------------------------------------------------- -org $1E81A9 ; <- F01A9 - sprite_helmasaur_king.asm : 247 (JSL GetRandomInt : AND.b #$07 : TAY) -JSL.l RNG_Helmasaur -org $1E8262 ; <- F0262 - sprite_helmasaur_king.asm : 373 (JSL GetRandomInt : AND.b #$01 : BEQ BRANCH_BETA) -JSL.l RNG_Helmasaur -org $1DEEE1 ; <- EEEE1 - sprite_helmasaur_fireball.asm : 236 (JSL GetRandomInt : STA $0FB6) -JSL.l RNG_Helmasaur +org $9EB5F7 ; <- F35F7 - sprite_arrghus.asm : 328 (JSL GetRandomInt : AND.b #$3F : ADC.b #$30 : STA $0DF0, X) +JSL RNG_Arrghus ;-------------------------------------------------------------------------------- -org $1EB5F7 ; <- F35F7 - sprite_arrghus.asm : 328 (JSL GetRandomInt : AND.b #$3F : ADC.b #$30 : STA $0DF0, X) -JSL.l RNG_Arrghus +org $9EBF4D ; <- F3F4D - sprite_mothula.asm : 180 (JSL GetRandomInt : AND.b #$07 : TAY) +JSL RNG_Mothula +org $9EBF60 ; <- F3F60 - sprite_mothula.asm : 187 (JSL GetRandomInt : AND.b #$1F : ADC.b #$40 : STA $0DF0, X) +JSL RNG_Mothula +org $9EBFBE ; <- F3FBE - sprite_mothula.asm : 261 (JSL GetRandomInt : AND.b #$1F : ORA.b #$40 : STA !beam_timer, X) +JSL RNG_Mothula +org $9EC095 ; <- F4095 - sprite_mothula.asm : 373 (JSL GetRandomInt : AND.b #$1F : CMP #$1E : BCC .already_in_range) +JSL RNG_Mothula ;-------------------------------------------------------------------------------- -org $1EBF4D ; <- F3F4D - sprite_mothula.asm : 180 (JSL GetRandomInt : AND.b #$07 : TAY) -JSL.l RNG_Mothula -org $1EBF60 ; <- F3F60 - sprite_mothula.asm : 187 (JSL GetRandomInt : AND.b #$1F : ADC.b #$40 : STA $0DF0, X) -JSL.l RNG_Mothula -org $1EBFBE ; <- F3FBE - sprite_mothula.asm : 261 (JSL GetRandomInt : AND.b #$1F : ORA.b #$40 : STA !beam_timer, X) -JSL.l RNG_Mothula -org $1EC095 ; <- F4095 - sprite_mothula.asm : 373 (JSL GetRandomInt : AND.b #$1F : CMP #$1E : BCC .already_in_range) -JSL.l RNG_Mothula +org $9E957A ; <- F157A - sprite_kholdstare.asm : 209 (JSL GetRandomInt : AND.b #$3F : ADC.b #$20 : STA $0DF0, X) +JSL RNG_Kholdstare +org $9E95F0 ; <- F15F0 - sprite_kholdstare.asm : 289 (JSL GetRandomInt : AND.b #$3F : ADC.b #$60 : STA $0DF0, X) +JSL RNG_Kholdstare +org $9E95FB ; <- F15FB - sprite_kholdstare.asm : 291 (JSL GetRandomInt : PHA : AND.b #$03 : TAY) +JSL RNG_Kholdstare +org $9E96C9 ; <- F16C9 - sprite_kholdstare.asm : 453 (JSL GetRandomInt : AND.b #$07 : TAY) +JSL RNG_Kholdstare +org $9E96E5 ; <- F16E5 - sprite_kholdstare.asm : 458 (JSL GetRandomInt : AND.b #$07 : TAY) +JSL RNG_Kholdstare +org $9E97D5 ; <- F17D5 - sprite_kholdstare.asm : 605 (JSL GetRandomInt : AND.b #$04 : STA $0D) +JSL RNG_Kholdstare ;-------------------------------------------------------------------------------- -org $1E957A ; <- F157A - sprite_kholdstare.asm : 209 (JSL GetRandomInt : AND.b #$3F : ADC.b #$20 : STA $0DF0, X) -JSL.l RNG_Kholdstare -org $1E95F0 ; <- F15F0 - sprite_kholdstare.asm : 289 (JSL GetRandomInt : AND.b #$3F : ADC.b #$60 : STA $0DF0, X) -JSL.l RNG_Kholdstare -org $1E95FB ; <- F15FB - sprite_kholdstare.asm : 291 (JSL GetRandomInt : PHA : AND.b #$03 : TAY) -JSL.l RNG_Kholdstare -org $1E96C9 ; <- F16C9 - sprite_kholdstare.asm : 453 (JSL GetRandomInt : AND.b #$07 : TAY) -JSL.l RNG_Kholdstare -org $1E96E5 ; <- F16E5 - sprite_kholdstare.asm : 458 (JSL GetRandomInt : AND.b #$07 : TAY) -JSL.l RNG_Kholdstare -org $1E97D5 ; <- F17D5 - sprite_kholdstare.asm : 605 (JSL GetRandomInt : AND.b #$04 : STA $0D) -JSL.l RNG_Kholdstare +org $9DE5E4 ; <- EE5E4 - sprite_vitreous.asm : 207 (JSL GetRandomInt : AND.b #$0F : TAY) +JSL RNG_Vitreous +org $9DE626 ; <- EE626 - sprite_vitreous.asm : 255 (JSL GetRandomInt : AND.b #$07 : STA $0D90, Y) +JSL RNG_Vitreous ;-------------------------------------------------------------------------------- -org $1DE5E4 ; <- EE5E4 - sprite_vitreous.asm : 207 (JSL GetRandomInt : AND.b #$0F : TAY) -JSL.l RNG_Vitreous -org $1DE626 ; <- EE626 - sprite_vitreous.asm : 255 (JSL GetRandomInt : AND.b #$07 : STA $0D90, Y) -JSL.l RNG_Vitreous -;-------------------------------------------------------------------------------- -org $1DB16C ; <- EB16C - sprite_trinexx.asm : 530 (JSL GetRandomInt : AND.b #$07 : TAY) -JSL.l RNG_Trinexx -org $1DB186 ; <- EB186 - sprite_trinexx.asm : 535 (JSL GetRandomInt : AND.b #$07 : TAY) -JSL.l RNG_Trinexx -org $1DB25E ; <- EB25E - sprite_trinexx.asm : 643 (JSL GetRandomInt : AND.b #$03 : TAY : CMP $00 : BEQ BRANCH_ALPHA) -JSL.l RNG_Trinexx -org $1DB28D ; <- EB28D - sprite_trinexx.asm : 661 (JSL GetRandomInt : AND.b #$03 : CMP.b #$01 : TYA : BCS BRANCH_GAMMA) -JSL.l RNG_Trinexx -org $1DB9B0 ; <- EB9B0 - sprite_sidenexx.asm : 165 (JSL GetRandomInt : AND.b #$07 : INC A : CMP.b #$05 : BCS BRANCH_ALPHA) -JSL.l RNG_Trinexx -org $1DB9CC ; <- EB9CC - sprite_sidenexx.asm : 175 (JSL GetRandomInt : LSR A : BCS BRANCH_ALPHA) -JSL.l RNG_Trinexx -org $1DBA5D ; <- EBA5D - sprite_sidenexx.asm : 270 (JSL GetRandomInt : AND.b #$0F : STA $0DF0, X) -JSL.l RNG_Trinexx -org $1DBAB1 ; <- EBAB1 - sprite_sidenexx.asm : 314 (JSL GetRandomInt : AND.b #$0F : LDY.b #$00 : SUB.b #$03) -JSL.l RNG_Trinexx -org $1DBAC3 ; <- EBAC3 - sprite_sidenexx.asm : 323 (JSL GetRandomInt : AND.b #$0F : ADD.b #$0C : STA $02 : STZ $03) -JSL.l RNG_Trinexx +org $9DB16C ; <- EB16C - sprite_trinexx.asm : 530 (JSL GetRandomInt : AND.b #$07 : TAY) +JSL RNG_Trinexx +org $9DB186 ; <- EB186 - sprite_trinexx.asm : 535 (JSL GetRandomInt : AND.b #$07 : TAY) +JSL RNG_Trinexx +org $9DB25E ; <- EB25E - sprite_trinexx.asm : 643 (JSL GetRandomInt : AND.b #$03 : TAY : CMP $00 : BEQ BRANCH_ALPHA) +JSL RNG_Trinexx +org $9DB28D ; <- EB28D - sprite_trinexx.asm : 661 (JSL GetRandomInt : AND.b #$03 : CMP.b #$01 : TYA : BCS BRANCH_GAMMA) +JSL RNG_Trinexx +org $9DB9B0 ; <- EB9B0 - sprite_sidenexx.asm : 165 (JSL GetRandomInt : AND.b #$07 : INC A : CMP.b #$05 : BCS BRANCH_ALPHA) +JSL RNG_Trinexx +org $9DB9CC ; <- EB9CC - sprite_sidenexx.asm : 175 (JSL GetRandomInt : LSR A : BCS BRANCH_ALPHA) +JSL RNG_Trinexx +org $9DBA5D ; <- EBA5D - sprite_sidenexx.asm : 270 (JSL GetRandomInt : AND.b #$0F : STA $0DF0, X) +JSL RNG_Trinexx +org $9DBAB1 ; <- EBAB1 - sprite_sidenexx.asm : 314 (JSL GetRandomInt : AND.b #$0F : LDY.b #$00 : SUB.b #$03) +JSL RNG_Trinexx +org $9DBAC3 ; <- EBAC3 - sprite_sidenexx.asm : 323 (JSL GetRandomInt : AND.b #$0F : ADD.b #$0C : STA $02 : STZ $03) +JSL RNG_Trinexx ;-------------------------------------------------------------------------------- org $6F9B8 ; <- 379B8 - bank06.asm : 6693 (JSL GetRandomInt : PLY : AND $FA5C, Y : BNE BRANCH_MU) -JSL.l RNG_Enemy_Drops +JSL RNG_Enemy_Drops ;================================================================================ ; HUD Changes ;-------------------------------------------------------------------------------- -org $0DFC4C ; <- 6FC4C - headsup_display.asm : 836 (LDA $7EF36E : AND.w #$00FF : ADD.w #$0007 : AND.w #$FFF8 : TAX) -JML.l OnDrawHud -NOP #197 +org $8DFDCB +JSL UpdateHearts +RTS +org $8DF191 : JSL ColorAnimatedHearts : BRA + : NOP #7 : + + +org $8DFC4C ; <- 6FC4C - headsup_display.asm : 836 (LDA $7EF36E : AND.w #$00FF : ADD.w #$0007 : AND.w #$FFF8 : TAX) +JML OnDrawHud : NOP #197 ; why? it's not hurting anyone lol ReturnFromOnDrawHud: SEP #$30 LDX.b #$FF ; vanilla hud code ends with #$FF in X, and it's required for unknown reasons. - -;org $0DFD0A ; <- 6FD0A - headsup_display.asm : 900 -;STA $7EC766 ; nudge key digit right - -;org $0DFD13 ; <- 6FD13 - headsup_display.asm : 905 -;STA $7EC726 ; key icon blank - -org $0DFC37 ; <- 6FC37 - headsup_display.asm : 828 (LDA.w #$28F7) -JSL.l DrawMagicHeader +org $8DFC37 ; <- 6FC37 - headsup_display.asm : 828 (LDA.w #$28F7) +JSL DrawMagicHeader BRA + : NOP #15 : + ;-------------------------------------------------------------------------------- -org $0DFB29 ; <- headsup_display.asm : 688 (LDA.b #$86 : STA $7EC71E) -;LDA.b #$86 : STA $7EC720 ; nudge silver arrow right - remember to update this in newit -;LDA.b #$24 : STA $7EC721 -;LDA.b #$87 : STA $7EC722 -;LDA.b #$24 : STA $7EC723 -JSL.l DrawHUDArrows : BRA + - NOP #18 -+ +org $81CF67 ; <- CF67 - Bank01.asm : 11625 (STA $7EF36F) +JSL DecrementSmallKeys ;-------------------------------------------------------------------------------- -org $01CF67 ; <- CF67 - Bank01.asm : 11625 (STA $7EF36F) -JSL.l DecrementSmallKeys -;-------------------------------------------------------------------------------- -org $0DED04 ; <- 6ED04 - equipment.asm : 1963 (REP #$30) -JSL.l DrawHUDDungeonItems +org $8DED04 ; <- 6ED04 - equipment.asm : 1963 (REP #$30) +JSL DrawHUDDungeonItems ;-------------------------------------------------------------------------------- ; Insert our version of the hud tilemap -org $0DFA96 ; <- 6FA96 - headsup_display.asm : 626 (LDX.w #.hud_tilemap) +org $8DFA96 ; <- 6FA96 - headsup_display.asm : 626 (LDX.w #.hud_tilemap) LDX.w #HUD_TileMap -org $0DFA9C ; <- 6FA9C - headsup_display.asm : 629 (MVN $0D, $7E ; $Transfer 0x014A bytes from $6FE77 -> $7EC700) -MVN $217E +org $8DFA9C ; <- 6FA9C - headsup_display.asm : 629 (MVN $0D, $7E ; $Transfer 0x014A bytes from $6FE77 -> $7EC700) +MVN $A17E ;-------------------------------------------------------------------------------- -;org $0DE48E ; <- 6E48E - equipment.asm : 1233 (LDA.w #$11CE : STA $00) - HOOK HERE TO DRAW ON THE ITEM SCREEN -;JSL.l DrawHUDDungeonItems -;NOP +org $8DFB1F : JSL CheckHUDSilverArrows +org $8DFB29 : BRA UpdateHUDBuffer_update_item_check_arrows ;-------------------------------------------------------------------------------- -org $0DFB1F ; 6FB1F - headsup_display.asm : 681 (LDA $7EF340 : BEQ .hastNoBow) -JSL.l CheckHUDSilverArrows +org $8DF1AB : JSR RebuildHUD_update +org $8DDFC8 : JSR RebuildHUD_update +org $8DDB85 : JSR RefreshIcon_UpdateHUD : BRA + : NOP : + +;-------------------------------------------------------------------------------- +org $87A205 : JSL RebuildHUD_update_long +org $87A1A4 : JSL RebuildHUD_update_long +org $87A1CF : JSL RebuildHUD_update_long +org $87A21D : JSL RebuildHUD_update_long +org $87A235 : JSL RebuildHUD_update_long +org $8AEF62 : JSL RebuildHUD_update_long +;-------------------------------------------------------------------------------- +org $8DFFE1 +RebuildHUD_update_long: +JSR RebuildHUD_update : RTL + +RefreshIcon_UpdateHUD: +INC.w UpdateHUDFlag +JSR RebuildHUD +JSR UpdateEquippedItem +RTS +warnpc $8E8000 +;-------------------------------------------------------------------------------- +org $8DEDE8 +JSL DrawHeartPiecesMenu : BRA DrawEquipment_in_a_dungeon ;-------------------------------------------------------------------------------- ;================================================================================ ; 300 Rupee NPC ;-------------------------------------------------------------------------------- -org $1EF060 ; <- F7060 - sprite_shopkeeper.asm:242 (INC $0D80, X) -JSL.l Set300RupeeNPCItem -NOP +org $9EF060 ; <- F7060 - sprite_shopkeeper.asm:242 (INC $0D80, X) +JSL Set300RupeeNPCItem : NOP + +;================================================================================ +; Tree Kid Fix ;-------------------------------------------------------------------------------- +org $86B12B ; <- 3312B - tree status set - 418 - LDA NpcFlagsVanilla : ORA.b #$08 : STA NpcFlagsVanilla +LDA.l NpcFlagsVanilla : AND.b #$F7 : STA.l NpcFlagsVanilla ; unset arboration instead of setting it +;-------------------------------------------------------------------------------- +org $86B072 ; <- 33072 - FluteAardvark_InitialStateFromFluteState - 418 : dw FluteAardvark_AlreadyArborated +dw $06B08B +;================================================================================ ;================================================================================ ; Glitched Mode Fixes ;-------------------------------------------------------------------------------- -org $0691AC ; <- 311AC - sprite_prep.asm:2453 (LDY $0FFF) -JSL.l GetAgahnimPalette -NOP #2 +org $8691AC ; <- 311AC - sprite_prep.asm:2453 (LDY $0FFF) +JSL GetAgahnimPalette : NOP #2 ;-------------------------------------------------------------------------------- -org $06F0DD ; <- 370DD - Bank06.asm:5399 (STA $0BA0, X) -JSL.l GetAgahnimDeath -NOP #2 +org $86F0DD ; <- 370DD - Bank06.asm:5399 (STA $0BA0, X) +JSL GetAgahnimDeath : NOP #2 ;-------------------------------------------------------------------------------- -org $1ED4E6 ; <- F54E6 - sprite_agahnim.asm:314 (LDY $0FFF) -JSL.l GetAgahnimType -NOP #2 +org $9ED4E6 ; <- F54E6 - sprite_agahnim.asm:314 (LDY $0FFF) +JSL GetAgahnimType : NOP #2 ;-------------------------------------------------------------------------------- -org $1ED577 ; <- F5577 - sprite_agahnim.asm:418 (PHX) -JML.l GetAgahnimSlot +org $9ED577 ; <- F5577 - sprite_agahnim.asm:418 (PHX) +JML GetAgahnimSlot GetAgahnimSlotReturn: ;-------------------------------------------------------------------------------- -org $1ED678 ; <- F5678 - sprite_agahnim.asm:587 (INC $0E30, X) -NOP #2 -JSL.l GetAgahnimLightning +org $9ED678 ; <- F5678 - sprite_agahnim.asm:587 (INC $0E30, X) +NOP #2 : JSL GetAgahnimLightning ;-------------------------------------------------------------------------------- -org $0287E0 ; <- 107E0 - Bnak02.asm:1507 (LDA $0112 : ORA $02E4 : ORA $0FFC : BEQ .allowJoypadInput) -JSL.l AllowJoypadInput : NOP #5 +org $8287E0 ; <- 107E0 - Bnak02.asm:1507 (LDA $0112 : ORA $02E4 : ORA $0FFC : BEQ .allowJoypadInput) +JSL AllowJoypadInput : BRA ++ : NOP #3 : ++ ;================================================================================ ; Half Magic Bat ;-------------------------------------------------------------------------------- -org $05FBD3 ; <- 2FBD3 - sprite_mad_batter.asm:209 - (STA $7EF37B) -JSL.l GetMagicBatItem -;-------------------------------------------------------------------------------- +org $85FBD3 ; <- 2FBD3 - sprite_mad_batter.asm:209 - (STA $7EF37B) +JSL GetMagicBatItem ;================================================================================ ; MSU Music ;-------------------------------------------------------------------------------- -org $0080D7 ; <- D7 - Bank00.asm:172 (SEP #$30) +org $8080D7 ; <- D7 - Bank00.asm:172 (SEP #$30) JML MSUMain : NOP SPCContinue: -org $028B7A ; <- C220 A5A0 - Bank02.asm:2225 (REP #$20 : LDA $A0) +org $828B7A ; <- C220 A5A0 - Bank02.asm:2225 (REP #$20 : LDA $A0) JSL SpiralStairsPreCheck -org $029069 ; <- A21C A5A0 - Bank02.asm:3081 (LDX.b #$1C : LDA $A0) +org $829069 ; <- A21C A5A0 - Bank02.asm:3081 (LDX.b #$1C : LDA $A0) JSL SpiralStairsPostCheck -org $02D6E8 ; <- 9C0A01 - Bank02.asm:10811 (STZ $010A) +org $82D6E8 ; <- 9C0A01 - Bank02.asm:10811 (STZ $010A) NOP #3 -org $08C421 ; <- AD4021 F005 - ancilla_receive_item.asm:108 (LDA $2140 : BEQ .wait_for_music) +org $88C421 ; <- AD4021 F005 - ancilla_receive_item.asm:108 (LDA $2140 : BEQ .wait_for_music) JML PendantFanfareWait : NOP PendantFanfareContinue: -org $08C42B +org $88C42B PendantFanfareDone: -org $08C62A ; <- AD4021 D008 - ancilla_receive_item.asm:442 (LDA $2140 : BNE .waitForSilence) +org $88C62A ; <- AD4021 D008 - ancilla_receive_item.asm:442 (LDA $2140 : BNE .waitForSilence) JML CrystalFanfareWait : NOP CrystalFanfareDone: -org $08C637 +org $88C637 CrystalFanfareContinue: -org $0988A0 ; <- 8D2C01 8009 - ancilla_init.asm:1179 (STA $012C : BRA .doneWithSoundEffects) +org $8988A0 ; <- 8D2C01 8009 - ancilla_init.asm:1179 (STA $012C : BRA .doneWithSoundEffects) JML FanfarePreload : NOP -org $09F2A7 ; <- 8F27C27E - module_death.asm:56 (STA $7EC227) -JSL.l StoreMusicOnDeath +org $89F2A7 ; <- 8F27C27E - module_death.asm:56 (STA $7EC227) +JSL StoreMusicOnDeath -org $0CC100 ; <- A511 C904 - Bank0C.asm:07 (LDA $11 : CMP.b #$04) -;JSL.l StartupWait - -org $0EE6EC ; <- E220 A922 - Bank0E.asm:2892 (SEP #$20 : LDA.b #$22 : STA $012C) -JSL.l EndingMusicWait +org $8EE6EC ; <- E220 A922 - Bank0E.asm:2892 (SEP #$20 : LDA.b #$22 : STA $012C) +JSL EndingMusicWait ; Process music commands in NMI from new location after muting is processed -org $0080DD -dw !REG_MUSIC_CONTROL +org $8080DD +dw MusicControl -org $008101 -dw !REG_MUSIC_CONTROL +org $808101 +dw MusicControl -org $09F512 -dw !REG_MUSIC_CONTROL +org $89F512 +dw MusicControl -org $0CF05F -dw !REG_MUSIC_CONTROL -;-------------------------------------------------------------------------------- +org $8CF05F +dw MusicControl ;================================================================================ ; Replacement Shopkeeper ;-------------------------------------------------------------------------------- -org $068BEB ; <- 30BEB - sprite_prep.asm:1125 - (INC $0BA0, X) -JSL.l SpritePrep_ShopKeeper : RTS : NOP +org $868BEB ; <- 30BEB - sprite_prep.asm:1125 - (INC $0BA0, X) +JSL SpritePrep_ShopKeeper : RTS : NOP ShopkeeperFinishInit: ;-------------------------------------------------------------------------------- -org $1EEEE3 ; <- F6EE3 - sprite_shopkeeper.asm:7 - (LDA $0E80, X) -JSL.l Sprite_ShopKeeper : RTS : NOP +org $9EEEE3 ; <- F6EE3 - sprite_shopkeeper.asm:7 - (LDA $0E80, X) +JSL Sprite_ShopKeeper : RTS : NOP ShopkeeperJumpTable: -;-------------------------------------------------------------------------------- ;================================================================================ ; Tile Target Loader ;-------------------------------------------------------------------------------- -org $00D55E ; <- 555E - Bank00.asm:3491 (LDX.w #$2D40) -JSL.l LoadModifiedTileBufferAddress : NOP #2 -;-------------------------------------------------------------------------------- +org $80D55E ; <- 555E - Bank00.asm:3491 (LDX.w #$2D40) +JSL LoadModifiedTileBufferAddress : NOP #2 ;================================================================================ ; Permabunny Fix ;-------------------------------------------------------------------------------- -org $078F32 ; <- 38F32 - Bank07.asm:2420 - (LDA $7EF357) -JSL.l DecideIfBunny ; for bunny beams -;-------------------------------------------------------------------------------- +org $878F32 ; <- 38F32 - Bank07.asm:2420 - (LDA $7EF357) +JSL DecideIfBunny ; for bunny beams ;================================================================================ ; Other bunny Fixes ;-------------------------------------------------------------------------------- -org $029E7C; <- 11E7C - module_ganon_emerges.asm:127 - (LDA.b #$09 : STA $012C) -JSL.l FixAga2Bunny : NOP -;-------------------------------------------------------------------------------- +org $829E7C; <- 11E7C - module_ganon_emerges.asm:127 - (LDA.b #$09 : STA $012C) +JSL FixAga2Bunny : NOP ;================================================================================ ; Open Mode Fixes ;-------------------------------------------------------------------------------- -org $05DF65 ; <- 2DF65 - sprite_uncle_and_priest.asm:994 - (LDA.b #$01 : STA $7EF3C5) +org $85DF65 ; <- 2DF65 - sprite_uncle_and_priest.asm:994 - (LDA.b #$01 : STA $7EF3C5) NOP #6 ;-------------------------------------------------------------------------------- -;org $0280DD ; <- 100DD - Bank02.asm:298 - (LDA $7EF3C5 : CMP.b #$02 : BCC .indoors) -;JSL.l ForceLinksHouse -;-------------------------------------------------------------------------------- -org $05EDDF ; <- 2EDDF - sprite_zelda.asm:398 - (LDA.b #$02 : STA $7EF3C5) -JSL.l EndRainState : NOP #2 -;-------------------------------------------------------------------------------- -org $05DF49 ; <- 2DF49 - sprite_uncle_and_priest.asm:984 - (JSL Link_ReceiveItem) -JSL.l OnUncleItemGet +org $85EDDF ; <- 2EDDF - sprite_zelda.asm:398 - (LDA.b #$02 : STA $7EF3C5) +JSL EndRainState : NOP #2 ;-------------------------------------------------------------------------------- +org $85DF49 ; <- 2DF49 - sprite_uncle_and_priest.asm:984 - (JSL Link_ReceiveItem) +JSL OnUncleItemGet ;================================================================================ ; Generic Keys ;-------------------------------------------------------------------------------- -org $028157 ; <- 10157 - Bank02.asm:381 - (LDA $040C : CMP.b #$FF : BEQ .notPalace) -JSL.l CheckKeys : NOP +org $828157 ; <- 10157 - Bank02.asm:381 - (LDA $040C : CMP.b #$FF : BEQ .notPalace) +JSL CheckKeys : NOP ;-------------------------------------------------------------------------------- -org $028166 ; <- 10166 - Bank02.asm:396 - (LDA $7EF37C, X) -JSL.l LoadKeys +org $828166 ; <- 10166 - Bank02.asm:396 - (LDA $7EF37C, X) +JSL LoadKeys ;-------------------------------------------------------------------------------- -org $029A31 ; <- 11A31 - Bank02.asm:4785 - (LDA $7EF37C, X) -JSL.l LoadKeys +org $829A31 ; <- 11A31 - Bank02.asm:4785 - (LDA $7EF37C, X) +JSL LoadKeys ;-------------------------------------------------------------------------------- -org $02A0D1 ; <- 120D1 - Bank02.asm:5841 - (STA $7EF37C, X) -JSL.l SaveKeys +org $82A0D1 ; <- 120D1 - Bank02.asm:5841 - (STA $7EF37C, X) +JSL SaveKeys ;-------------------------------------------------------------------------------- -org $09F584 ; <- 4F584 - module_death.asm:447 - (STA $7EF37C, X) -JSL.l SaveKeys +org $89F584 ; <- 4F584 - module_death.asm:447 - (STA $7EF37C, X) +JSL SaveKeys ;-------------------------------------------------------------------------------- -org $0282EC ; <- 102EC - Bank02.asm:650 - (STA $7EF36F) -JSL.l ClearOWKeys +org $8282EC ; <- 102EC - Bank02.asm:650 - (STA $7EF36F) +JSL ClearOWKeys ;-------------------------------------------------------------------------------- -org $0DFA80 ; <- 6FA80 : headsup_display.asm:596 - (LDA.b #$00 : STA $7EC017) -JSL.l HUDRebuildIndoor : NOP #4 -;-------------------------------------------------------------------------------- -org $029A35 ; <- 11A35 : Bank02.asm:4789 - (JSL HUD.RebuildIndoor.palace) -JSL.l HUDRebuildIndoorHole +org $8DFA80 ; <- 6FA80 : headsup_display.asm:596 - (LDA.b #$00 : STA $7EC017) +JSL HUDRebuildIndoor : NOP #4 ;-------------------------------------------------------------------------------- +org $829A35 ; <- 11A35 : Bank02.asm:4789 - (JSL HUD.RebuildIndoor.palace) +JSL HUDRebuildIndoorHole ;================================================================================ ; Skull Woods back entrance fire fix ;-------------------------------------------------------------------------------- -org $099C42 ; ancilla_init.asm:4264 - (LDA $8A : AND.b #$40 : BEQ AddDoorDebris.spawn_failed) -JML.l Multiworld_ConsumingFire_TransmuteToSkullWoodsFire +org $899C42 ; ancilla_init.asm:4264 - (LDA $8A : AND.b #$40 : BEQ AddDoorDebris.spawn_failed) +JML Multiworld_ConsumingFire_TransmuteToSkullWoodsFire NOP #2 ConsumingFire_TransmuteToSkullWoodsFire_continue: -org $099C39 -AddDoorDebris_spawn_failed: - ;================================================================================ ; Pendant / Crystal Fixes ;-------------------------------------------------------------------------------- -;org $0DE9C8 ; <- 6E9C8 - original check for agahnim 1 being defeated -;;LDA $7EF3CA : CMP.b #$40 ; check for dark world instead -;JSL.l CheckPendantHUD -;NOP #2 ;================================================================================ -org $098BB0 ; <- 048BB0 - ancilla_init.asm:1663 - (STX $02D8 : JSR AddAncilla) -JSL.l TryToSpawnCrystalUntilSuccess -NOP -org $01C74B ; <- 00C74B - bank01.asm:10368 - (STZ $AE, X) -NOP #2 ; this STZ is what makes the crystal never spawn if it fails to spawn on the first try +org $8DE9C8 ; <- 6E9C8 - equipment.asm:1623 - (LDA $7EF3C5 : CMP.b #$03 : BCC .beforeAgahnim) +JSL DrawPendantCrystalDiagram : RTS ;================================================================================ -org $0DE9C8 ; <- 6E9C8 - equipment.asm:1623 - (LDA $7EF3C5 : CMP.b #$03 : BCC .beforeAgahnim) -JSL.l DrawPendantCrystalDiagram : RTS -;NOP #11 -;================================================================================ -org $0DEDCC ; <- 6EDCC - equipment.asm:2043 - (LDA $040C : AND.w #$00FF : CMP.w #$00FF : BNE .inSpecificDungeon) -JSL.l ShowDungeonItems : NOP #5 +org $8DEDCC ; <- 6EDCC - equipment.asm:2043 - (LDA $040C : AND.w #$00FF : CMP.w #$00FF : BNE .inSpecificDungeon) +JSL ShowDungeonItems : NOP #5 -org $0DEE59 ; <- 6EE59 - equipment.asm:2126 - (LDA $040C : AND.w #$00FF : CMP.w #$00FF : BEQ .notInPalace) -JSL.l ShowDungeonItems : NOP #5 +org $8DEE59 ; <- 6EE59 - equipment.asm:2126 - (LDA $040C : AND.w #$00FF : CMP.w #$00FF : BEQ .notInPalace) +JSL ShowDungeonItems : NOP #5 -org $0DEE8A ; <- 6EE8A - equipment.asm:2151 - (LDA $040C : AND.w #$00FF : CMP.w #$00FF : BEQ .notInPalaceAgain) -JSL.l ShowDungeonItems : NOP #5 +org $8DEE8A ; <- 6EE8A - equipment.asm:2151 - (LDA $040C : AND.w #$00FF : CMP.w #$00FF : BEQ .notInPalaceAgain) +JSL ShowDungeonItems : NOP #5 -org $0DEF3B ; <- 6EF3B - equipment.asm:2290 - (LDA $040C : AND.w #$00FF : CMP.w #$00FF : BEQ .notInPalace) -JSL.l ShowDungeonItems : NOP #5 +org $8DEF3B ; <- 6EF3B - equipment.asm:2290 - (LDA $040C : AND.w #$00FF : CMP.w #$00FF : BEQ .notInPalace) +JSL ShowDungeonItems : NOP #5 ;================================================================================ -org $0DEA5F ; <- 6EA5F - equipment.asm:1679 - (SEP #$30) -;NOP #5 -;JMP .skipCrystalInit -;org $0DEAA4 ; <- 6EAA4 - equipment.asm:1706 - (LDA $7EF37A : AND.w #$0001) -;.skipCrystalInit +org $80F97E ; <- 797E - Bank00.asm:8586 - (LDA $7EF3CA : EOR.b #$40 : STA $7EF3CA) +JSL FlipLWDWFlag : NOP #6 ;================================================================================ -org $0DE9D8 ; <- 6E9D8 - equipment.asm:1635 - (LDA $E860, X : STA $12EA, X) -org $0DEA15 ; <- 6EA15 - equipment.asm:1647 - (LDA.w #$13B2 : STA $00) +org $82B15C ; <- 1315C - Bank02.asm:7672 - (LDA $7EF3CA : EOR.b #$40 : STA $7EF3CA) +JSL IncrementOWMirror +JSL FlipLWDWFlag : NOP #2 ;================================================================================ -org $00F97E ; <- 797E - Bank00.asm:8586 - (LDA $7EF3CA : EOR.b #$40 : STA $7EF3CA) -JSL.l FlipLWDWFlag : NOP #6 +;org $8AC5BB ; < 545BB - Bank0A.asm:1856 - (LDA $7EF3C7 : CMP.b #$03 : BNE .fail) +;JSL OverworldMap_CheckObject : RTS +;org $8AC5D8 ; < 545D8 - Bank0A.asm:1885 - (LDA $7EF3C7 : CMP.b #$07 : BNE OverworldMap_CheckPendant_fail) +;JSL OverworldMap_CheckObject : RTS ;================================================================================ -org $02B15C ; <- 1315C - Bank02.asm:7672 - (LDA $7EF3CA : EOR.b #$40 : STA $7EF3CA) -JSL.l IncrementOWMirror -JSL.l FlipLWDWFlag -NOP #2 -;================================================================================ -;Clear level to open doors -org $01C50D ; 0xC50D - Bank01.asm:10032 - (LDA $7EF3CA : BNE .inDarkWorld) -LDA CrystalPendantFlags_2, X -;================================================================================ -;Kill enemy to clear level -org $01C715 ; <- C715 - Bank01.asm:10358 - (LDA $7EF3CA : BNE .inDarkWorld) -LDA CrystalPendantFlags_2, X -;JSL.l GetPendantCrystalWorld -;================================================================================ -;org $0AC5C3 ; <- 545C3 - Bank0A.asm:1859 - (LDA $7EF374 : AND $0AC5A6, X : BEQ .fail) -;NOP #10 -;CLC -;================================================================================ -;org $0AC5BB ; < 545BB - Bank0A.asm:1856 - (LDA $7EF3C7 : CMP.b #$03 : BNE .fail) -;JSL.l OverworldMap_CheckObject : RTS -;org $0AC5D8 ; < 545D8 - Bank0A.asm:1885 - (LDA $7EF3C7 : CMP.b #$07 : BNE OverworldMap_CheckPendant_fail) -;JSL.l OverworldMap_CheckObject : RTS -;================================================================================ -org $0AC53e ; <- 5453E - Bank0A.asm:1771 - (LDA $0AC50D, X : STA $0D) -LDA.l CrystalNumberTable-1, X +org $8AC53E ; <- 5453E - Bank0A.asm:1771 - (LDA $0AC50D, X : STA $0D) +LDA.l CrystalNumberTable-1,X ;================================================================================ ; EVERY INSTANCE OF STA $7EF3C7 IN THE ENTIRE CODEBASE -org $029D51 ; <- 11D51 -JSL.l SetLWDWMap -org $0589BB ; <- 289BB -JSL.l SetLWDWMap -org $05DD9A ; <- 2DD9A -JSL.l SetLWDWMap +org $829D51 : JSL SetLWDWMap +org $8589BB : JSL SetLWDWMap +org $85DD9A : JSL SetLWDWMap -org $05F1F6 ; <- 2F1F6 -JSL.l SetLWDWMap -org $05F209 ; <- 2F209 -JSL.l SetLWDWMap -org $05FF91 ; <- 2FF91 -JSL.l SetLWDWMap +org $85F1F6 : JSL SetLWDWMap +org $85F209 : JSL SetLWDWMap +org $85FF91 : JSL SetLWDWMap -org $098687 ; <- 48687 -JSL.l SetLWDWMap -org $1ECEDD ; <- F4EDD -JSL.l SetLWDWMap -org $1ECF0D ; <- F4F0D -JSL.l SetLWDWMap +org $898687 : JSL SetLWDWMap +org $9ECEDD : JSL SetLWDWMap +org $9ECF0D : JSL SetLWDWMap ;================================================================================ -; EVERY INSTANCE OF LDA $7EF3C7 IN THE ENTIRE CODEBASE -org $05DDFE ; <- 2DDFE -JSL.l GetMapMode -org $05EE25 ; <- 2EE25 -JSL.l GetMapMode -org $05F17D ; <- 2F17D -JSL.l GetMapMode -org $05FF7D ; <- 2FF7D -JSL.l GetMapMode - -org $0AC01A ; <- 5401A -JSL.l GetMapMode -;Overwritten -;org $0AC037 ; <- 54037 -;JSL.l GetMapMode -;org $0AC079 ; <- 54079 -;JSL.l GetMapMode -;org $0AC0B8 ; <- 540B8 x -;JSL.l GetMapMode -;org $0AC0F8 ; <- 540F8 -;JSL.l GetMapMode -;org $0AC137 ; <- 54137 -;JSL.l GetMapMode -;org $0AC179 ; <- 54179 -;JSL.l GetMapMode -;org $0AC1B3 ; <- 541B3 -;JSL.l GetMapMode -;org $0AC1F5 ; <- 541F5 -;JSL.l GetMapMode -;org $0AC22F ; <- 5422F -;JSL.l GetMapMode -;org $0AC271 ; <- 54271 -;JSL.l GetMapMode -;org $0AC2AB ; <- 542AB -;JSL.l GetMapMode -;org $0AC2ED ; <- 542ED -;JSL.l GetMapMode -;org $0AC327 ; <- 54327 -;JSL.l GetMapMode -;org $0AC369 ; <- 54369 -;JSL.l GetMapMode - -org $0DC849 ; <- 6C849 -JSL.l GetMapMode +org $85DDFE : JSL GetMapMode +org $85EE25 : JSL GetMapMode +org $85F17D : JSL GetMapMode +org $85FF7D : JSL GetMapMode +org $8AC01A : JSL GetMapMode +org $8DC849 : JSL GetMapMode ;================================================================================ -org $0AC012 ; <- 54012 - Bank0A.asm:1039 (LDA $7EF2DB : AND.b #$20 : BNE BRANCH_DELTA) +org $8AC012 ; <- 54012 - Bank0A.asm:1039 (LDA $7EF2DB : AND.b #$20 : BNE BRANCH_DELTA) NOP #8 -;org $0AC012 ; <- 54012 - Bank0A.asm:1039 - (LDA $7EF2DB) -;JSL.l OnLoadMap ;================================================================================ -org $028B8F ; <- 10B8F - Bank02.asm:2236 (LDA $7EF374 : LSR A) +org $828B8F ; <- 10B8F - Bank02.asm:2236 (LDA $7EF374 : LSR A) JSL CheckHeraBossDefeated : NOP ;================================================================================ -org $028D6E +org $828D6E JSL FallingMusicFadeOut : BRA + : NOP #2 : + ;================================================================================ -org $029090 ; <- 11090 - Bank02.asm:3099 (LDA $7EF374 : LSR A) +org $829090 ; <- 11090 - Bank02.asm:3099 (LDA $7EF374 : LSR A) JSL CheckHeraBossDefeated : NOP ;================================================================================ -org $029798 ; <- 11798 - Bank02.asm:4287 (CMP $02895C, X : BNE BRANCH_ALPHA) +org $829798 ; <- 11798 - Bank02.asm:4287 (CMP $02895C, X : BNE BRANCH_ALPHA) NOP #6 ; remove crystal room cutscene check that causes softlocks ;================================================================================ ;================================================================================ ; Text Changes ;-------------------------------------------------------------------------------- -;org $06C7D3 ; <- 347D3 - sprite_ponds.asm:720 (LDA.b #$8A) -;JSL.l DialogFairyThrow +org $86C7BB ; <- 347BB - sprite_ponds.asm:702 (JSL Sprite_ShowMessageFromPlayerContact : BCC BRANCH_ALPHA) +JSL FairyPond_Init ;-------------------------------------------------------------------------------- -org $06C7BB ; <- 347BB - sprite_ponds.asm:702 (JSL Sprite_ShowMessageFromPlayerContact : BCC BRANCH_ALPHA) -JSL.l FairyPond_Init +org $9D92EC ; <- E92EC - sprite_ganon.asm:947 (JSL Sprite_ShowMessageMinimal) +JSL DialogGanon1 ;-------------------------------------------------------------------------------- -org $1D92EC ; <- E92EC - sprite_ganon.asm:947 (JSL Sprite_ShowMessageMinimal) -JSL.l DialogGanon1 -;-------------------------------------------------------------------------------- -org $1D9078 ; <- E9078 - sprite_ganon.asm:552 (LDA.b #$70 : STA $1CF0) -JSL.l DialogGanon2 : RTS +org $9D9078 ; <- E9078 - sprite_ganon.asm:552 (LDA.b #$70 : STA $1CF0) +JSL DialogGanon2 : RTS ;-------------------------------------------------------------------------------- ;-- Convert Capitalism fairy to shop -org $06C4BD ; <- 34C4BD - sprite_ponds.asm:107 (LDA $A0 : CMP.b #$15 : BEQ Sprite_HappinessPond) -JSL.l HappinessPond_Check +org $86C4BD ; <- 34C4BD - sprite_ponds.asm:107 (LDA $A0 : CMP.b #$15 : BEQ Sprite_HappinessPond) +JSL HappinessPond_Check ;-------------------------------------------------------------------------------- ;-- Sahasrahla (no green pendant) -org $05F16C ; <- 2F16C sprite_elder.asm:137 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) -JSL.l Sprite_ShowSolicitedMessageIfPlayerFacing_Alt +org $85F16C ; <- 2F16C sprite_elder.asm:137 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) +JSL Sprite_ShowSolicitedMessageIfPlayerFacing_Alt ;-------------------------------------------------------------------------------- ;-- Sahasrahla (have boots) -org $05F1A8 ; <- 2F1A8 sprite_elder.asm:170 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) -JSL.l Sprite_ShowSolicitedMessageIfPlayerFacing_Alt +org $85F1A8 ; <- 2F1A8 sprite_elder.asm:170 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) +JSL Sprite_ShowSolicitedMessageIfPlayerFacing_Alt ;-------------------------------------------------------------------------------- ;-- Sahasrahla (have boots, have ice rod) -org $05F1BC ; <- 2F1BC sprite_elder.asm:182 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) -JSL.l Sprite_ShowSolicitedMessageIfPlayerFacing_Alt +org $85F1BC ; <- 2F1BC sprite_elder.asm:182 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) +JSL Sprite_ShowSolicitedMessageIfPlayerFacing_Alt ;-------------------------------------------------------------------------------- ;-- Sahasrahla (have boots, have ice rod, have 3 pendants) -org $05F1CE ; <- 2F1CE sprite_elder.asm:194 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) -JSL.l Sprite_ShowSolicitedMessageIfPlayerFacing_Alt +org $85F1CE ; <- 2F1CE sprite_elder.asm:194 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) +JSL Sprite_ShowSolicitedMessageIfPlayerFacing_Alt ;-------------------------------------------------------------------------------- ;-- Sahasrahla (have boots, have ice rod, have 3 pendants, have master sword) -org $05F1D8 ; <- 2F1D8 sprite_elder.asm:204 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) -JSL.l Sprite_ShowSolicitedMessageIfPlayerFacing_Alt +org $85F1D8 ; <- 2F1D8 sprite_elder.asm:204 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) +JSL Sprite_ShowSolicitedMessageIfPlayerFacing_Alt ;---------------------------------------------------------- ;-- Bomb shop guy (talking to him before and after big bomb is available) -org $1EE181 ; <- F6181 sprite_bomb_shop_entity.asm : 85 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) +org $9EE181 ; <- F6181 sprite_bomb_shop_entity.asm : 85 (JSL Sprite_ShowSolicitedMessageIfPlayerFacing) JSL Sprite_ShowSolicitedMessageIfPlayerFacing_Alt ;---------------------------------------------------- ;-- Bombos tablet -org $05F3BF ; <- 2F3BF sprite_medallion_tablet.asm : 254 (JSL Sprite_ShowMessageUnconditional) -JSL.l DialogBombosTablet +org $85F3BF ; <- 2F3BF sprite_medallion_tablet.asm : 254 (JSL Sprite_ShowMessageUnconditional) +JSL DialogBombosTablet ;---------------------------------------------------- ;-- Ether tablet -org $05F429 ; <- 2F429 sprite_medallion_tablet.asm : 317 (JSL Sprite_ShowMessageUnconditional) -JSL.l DialogEtherTablet +org $85F429 ; <- 2F429 sprite_medallion_tablet.asm : 317 (JSL Sprite_ShowMessageUnconditional) +JSL DialogEtherTablet ;---------------------------------------------------- ;-- Thrown fish (move to different text ID) -org $1D82B2 ; <- 0xE82B2 low byte of message -db #$8F +org $9D82B2 ; <- 0xE82B2 low byte of message +db $8F ;================================================================================ ;================================================================================ ; Text Removal ;-------------------------------------------------------------------------------- -org $05FA8E +org $85FA8E Sprite_ShowMessageMinimal: -JML.l Sprite_ShowMessageMinimal_Alt +JML Sprite_ShowMessageMinimal_Alt ;-------------------------------------------------------------------------------- -;org $1CFD69 -;Main_ShowTextMessage: -;JML.l Main_ShowTextMessage_Alt +org $87B0CC ; <- 3b0d0 - Bank 07.asm : 7767 (JSL Main_ShowTextMessage) +JSL Main_ShowTextMessage_Alt ;-------------------------------------------------------------------------------- -org $07b0cc ; <- 3b0d0 - Bank 07.asm : 7767 (JSL Main_ShowTextMessage) -JSL.l Main_ShowTextMessage_Alt +org $88C5FE ; <- 445FE - ancilla_receive_item.asm : 408 (JSL Main_ShowTextMessage) +JSL Main_ShowTextMessage_Alt ;-------------------------------------------------------------------------------- -org $08c5fe ; <- 445FE - ancilla_receive_item.asm : 408 (JSL Main_ShowTextMessage) -JSL.l Main_ShowTextMessage_Alt -;-------------------------------------------------------------------------------- -org $05E21F ; <- 2E21F - Bank05.asm : 2691 (STZ $0223) -JSL.l Sprite_ShowMessageMinimal_Alt +org $85E21F ; <- 2E21F - Bank05.asm : 2691 (STZ $0223) +JSL Sprite_ShowMessageMinimal_Alt BRA Sprite_ShowMessageUnconditional_Rest -org $05E232 ; <- 2E232 - Bank05.asm : 2700 (PHX) +org $85E232 ; <- 2E232 - Bank05.asm : 2700 (PHX) Sprite_ShowMessageUnconditional_Rest: ;-------------------------------------------------------------------------------- ;-- Music restarting at zelda fix -org $05ED10 ; <- 2ED10 - sprite_zelda.asm : 233 - (LDA.b #$19 : STA $012C) +org $85ED10 ; <- 2ED10 - sprite_zelda.asm : 233 - (LDA.b #$19 : STA $012C) NOP #5 ;-------------------------------------------------------------------------------- -org $1ECE47 ; <- F4E47 - sprite_crystal_maiden.asm : 220 -JML.l MaidenCrystalScript +org $9ECE47 ; <- F4E47 - sprite_crystal_maiden.asm : 220 +JML MaidenCrystalScript ;-------------------------------------------------------------------------------- -org $1ECCEB ; <- F4CEB - sprite_crystal_maiden.asm : 25 ; skip all palette nonsense -JML.l SkipCrystalPalette -org $1ECD39 -SkipCrystalPalette: +org $9ECCEB ; <- F4CEB - sprite_crystal_maiden.asm : 25 ; skip all palette nonsense +BRA CrystalCutscene_Initialize_skip_palette ;-------------------------------------------------------------------------------- -org $08C3FD ; <- 443FD - ancilla_receive_item.asm : 89 -!MS_GOT = "$7F5031" -LDA #$40 : STA !MS_GOT -;;NOP #6 ; don't set master sword follower +org $88C3FD ; <- 443FD - ancilla_receive_item.asm : 89 +BRA + : NOP #4 : + ;-------------------------------------------------------------------------------- -org $08C5E5 ; <- 445ED - ancilla_receive_item.asm:395 (LDA .item_messages, Y : CMP.w #$FFFF : BEQ .handleGraphics) -JSL.l DialogItemReceive : NOP #2 -org $08C301 ; <- 44301 - ancilla_receive_item.asm:8 (.item_messages) +org $88C5E5 ; <- 445ED - ancilla_receive_item.asm:395 (LDA .item_messages, Y : CMP.w #$FFFF : BEQ .handleGraphics) +JSL DialogItemReceive : NOP #2 +org $88C301 ; <- 44301 - ancilla_receive_item.asm:8 (.item_messages) Ancilla_ReceiveItem_item_messages: ;---------------------------------------------------------- ;-- Shopkeepers -org $1EF379 ; <- F7379 sprite_shopkeeper.asm : 810 (JSL Sprite_ShowMessageUnconditional : JSL ShopKeeper_RapidTerminateReceiveItem) +org $9EF379 ; <- F7379 sprite_shopkeeper.asm : 810 (JSL Sprite_ShowMessageUnconditional : JSL ShopKeeper_RapidTerminateReceiveItem) NOP #4 ;Just remove the rapid terminate call ;-------------------------------------------------------------------------------- ;-- Reset Dialog Selection index for each new message -org $0EEE5D ; <- 76E5D - vwf.asm:84 (JSL Attract_DecompressStoryGfx) -JSL.l DialogResetSelectionIndex +org $8EEE5D ; <- 76E5D - vwf.asm:84 (JSL Attract_DecompressStoryGfx) +JSL DialogResetSelectionIndex ;---------------------------------------------------- ;-- Agahnim 1 Defeated -org $068475 ; <- 30475 Bank06.asm : 762 - (JSL Sprite_ShowMessageMinimal) -JSL.l AddInventory_incrementBossSwordLong -;NOP #4 +org $868475 ; <- 30475 Bank06.asm : 762 - (JSL Sprite_ShowMessageMinimal) +JSL IncrementBossSword ;---------------------------------------------------------- ;-- We'll take your sword -org $06B4F3 ; <- 334F3 sprite_smithy_bros.asm : 556 (JSL Sprite_ShowMessageUnconditional) +org $86B4F3 ; <- 334F3 sprite_smithy_bros.asm : 556 (JSL Sprite_ShowMessageUnconditional) JSL ItemSet_SmithSword -;NOP #4 ;---------------------------------------------------------- ;=================================== ;-- Escort Text ;-- dw coordinate, coordinate, flag, text message number, tagalong number ;=================================== -org $09A4C2 ; <- 4A4C2 tagalong.asm : 967 - (.room_data_1) +org $89A4C2 ; <- 4A4C2 tagalong.asm : 967 - (.room_data_1) dw $1EF0, $0288, $0001, $0097, $00F0 ; Old man first text after encounter text dw $1E58, $02F0, $0002, $0098, $00F0 ; Old man "dead end" (when you run to the pot) dw $1EA8, $03B8, $0004, $0099, $00F0 ; Old man "turn right here" @@ -2115,385 +1877,315 @@ dw $1BD8, $16FC, $0001, $0122, $00F0 ; Blind (maiden) "don't take me outside!" dw $1520, $167C, $0001, $0122, $00F0 ; Blind (maiden) "don't take me outside!" dw $05AC, $04FC, $0001, $0027, $00F0 ; Zelda in the water room ;---------------------------------------------------------- -;---------------------------------------------------------- -;-- Speed up Walls (Desert, Mire, and Palace of Darkness) -; org $01CA66 ; <- CA66 Bank01.asm : 10864 - (LDA.w #$2200 : ADD $041C : STA $041C) -; LDA.w #$4400 ; #$2200 is the normal speed, $#FF00 is max. -;---------------------------------------------------------- ;-- New Sign table offet calculation -org $07b4fe ; <- 3b4fe - bank07.asm : 8454 (LDA $8A : ASL A : TAY) +org $87B4FE ; <- 3b4fe - bank07.asm : 8454 (LDA $8A : ASL A : TAY) JSL CalculateSignIndex -;================================================================================ -; Ganon Fixes -;-------------------------------------------------------------------------------- -;org $1D91E3 ; <- E91E3 - sprite_ganon.asm : 778 -;JSL.l GanonWarpRNG -;NOP #2 -;LDA #$00 : NOP #4 -;-------------------------------------------------------------------------------- - ;================================================================================ ; Dark World Spawn Location Fix & Follower Fixes ;-------------------------------------------------------------------------------- -org $00894A ; <- 94A -PHB : JSL.l DarkWorldSaveFix +org $80894A ; <- 94A +PHB : JSL DarkWorldSaveFix ;-------------------------------------------------------------------------------- -org $028046 ; <- 10046 - Bank02.asm : 217 (JSL EnableForceBlank) (Start of Module_LoadFile) -JSL.l OnFileLoad +org $828046 ; <- 10046 - Bank02.asm : 217 (JSL EnableForceBlank) (Start of Module_LoadFile) +JSL OnFileLoad ;-------------------------------------------------------------------------------- -org $0280A2 +org $8280A2 JSL GetCurrentWorldForLoad ;-------------------------------------------------------------------------------- -org $09F520 ; <- 4F520 - module_death.asm : 401 (LDA $7EF3C5 : CMP.b #$03 : BCS BRANCH_THETA) -JSL.l OnPlayerDead -JSL.l IncrementDeathCounter -NOP #6 +org $89F520 ; <- 4F520 - module_death.asm : 401 (LDA $7EF3C5 : CMP.b #$03 : BCS BRANCH_THETA) +JSL OnPlayerDead +JSL IncrementDeathCounter : NOP #6 ;-------------------------------------------------------------------------------- -;org $02D61A ; <- 1561A -;LDA.b #$01 : STA $1B ; fix something i wrote over i shouldn't have -;-------------------------------------------------------------------------------- -org $1ED379 ; <- F5379 - sprite_agahnim.asm:75 - JSL PrepDungeonExit +org $9ED379 ; <- F5379 - sprite_agahnim.asm:75 - JSL PrepDungeonExit JSL FixAgahnimFollowers ;================================================================================ ;================================================================================ ; Randomize NPC Items ;-------------------------------------------------------------------------------- -org $028823 ; <- 10823 - Bank02.asm:1560 (LDA $7EF3C5 : BEQ .ignoreInput) -JSL.l AllowSQ +org $828823 ; <- 10823 - Bank02.asm:1560 (LDA $7EF3C5 : BEQ .ignoreInput) +JSL AllowSQ ;-------------------------------------------------------------------------------- - -org $08C45F ; <- 4445F - ancilla_recieve_item.asm:157 (STZ $02E9 : LDA $0C5E, X) +org $88C45F ; <- 4445F - ancilla_recieve_item.asm:157 (STZ $02E9 : LDA $0C5E, X) Ancilla_ReceiveItem_optimus: -JML.l PostItemAnimation : NOP #2 +JML PostItemAnimation : NOP #2 -org $08C548 ; <- 44548 - ancilla_recieve_item.asm:297 (CMP.b #$28 : BNE .dontGiveRupees) -JML.l Multiworld_Ancilla_ReceiveItem_stillInMotion +org $88C548 ; <- 44548 - ancilla_recieve_item.asm:297 (CMP.b #$28 : BNE .dontGiveRupees) +JML Multiworld_Ancilla_ReceiveItem_stillInMotion Ancilla_ReceiveItem_stillInMotion_moveon: -org $08C560 ; <- 44548 - ancilla_recieve_item.asm:307 +org $88C560 ; <- 44548 - ancilla_recieve_item.asm:307 Ancilla_ReceiveItem_dontGiveRupees: +;-------------------------------------------------------------------------------- +org $9EE90A ; <- F690A +JSL ItemCheck_OldMan : NOP #2 +;-------------------------------------------------------------------------------- +org $8280F2 ; <- 100F2 +JSL ItemCheck_OldMan : NOP #2 +;-------------------------------------------------------------------------------- +org $9EE9FE ; <- F69FE +JSL ItemSet_OldMan +;-------------------------------------------------------------------------------- +org $868F16 ; <- 30F16 +JSL ItemCheck_ZoraKing +;-------------------------------------------------------------------------------- +org $859ACA ; <- 29ACA +JSL Zora_RegurgitateFlippers +;-------------------------------------------------------------------------------- +org $9DE1E4 ; <- EE1E4 - sprite_great_catfish.asm : 489 +JSL LoadZoraKingItemGFX : NOP #2 +;-------------------------------------------------------------------------------- +org $868D86 ; <- 30D86 +JSL ItemCheck_SickKid +;-------------------------------------------------------------------------------- +org $86B9D4 ; <- 339D4 - sprite_bug_net_kid.asm : 111 (JSL Link_ReceiveItem) +JSL ItemSet_SickKid +;-------------------------------------------------------------------------------- +org $868BAC ; <- 30BAC - SpritePrep_FluteBoy : 1068 +JSL ItemCheck_TreeKid2 -;-------------------------------------------------------------------------------- -org $1EE90A ; <- F690A -JSL.l ItemCheck_OldMan -NOP #2 -;-------------------------------------------------------------------------------- -org $0280F2 ; <- 100F2 -JSL.l ItemCheck_OldMan -NOP #2 -;-------------------------------------------------------------------------------- -org $1EE9FE ; <- F69FE -JSL.l ItemSet_OldMan -;-------------------------------------------------------------------------------- -org $068F16 ; <- 30F16 -JSL.l ItemCheck_ZoraKing -;-------------------------------------------------------------------------------- -org $059ACA ; <- 29ACA -JSL $1DE1AA ; Sprite_SpawnFlippersItem -;-------------------------------------------------------------------------------- -org $1DE1E4 ; <- EE1E4 - sprite_great_catfish.asm : 489 -JSL.l LoadZoraKingItemGFX -NOP #2 -;-------------------------------------------------------------------------------- -org $068D86 ; <- 30D86 -JSL.l ItemCheck_SickKid -;-------------------------------------------------------------------------------- -org $06B9D4 ; <- 339D4 - sprite_bug_net_kid.asm : 111 (JSL Link_ReceiveItem) -JSL.l ItemSet_SickKid -;-------------------------------------------------------------------------------- -org $068BAC ; <- 30BAC - SpritePrep_FluteBoy : 1068 -JSL.l ItemCheck_TreeKid2 +org $86908D ; <- 3108D - SpritePrep_FluteBoy : 2175 +JSL ItemCheck_TreeKid : CMP.b #$08 : BEQ $0A -org $06908D ; <- 3108D - SpritePrep_FluteBoy : 2175 -JSL.l ItemCheck_TreeKid -CMP.b #$08 -BEQ $0A +org $869095 ; <- 31095 - SpritePrep_FluteBoy : 2177 +JSL ItemCheck_TreeKid : CMP.b #$08 -org $069095 ; <- 31095 - SpritePrep_FluteBoy : 2177 -JSL.l ItemCheck_TreeKid -CMP.b #$08 +org $8690BD ; <- 310BD - SpritePrep_FluteBoy : 2202 +JSL ItemCheck_TreeKid2 -org $0690BD ; <- 310BD - SpritePrep_FluteBoy : 2202 -JSL.l ItemCheck_TreeKid2 - -org $06AF9B ; <- 32F9B - FluteBoy_Chillin : 73 : LDA $7EF34C : CMP.b #$02 : BCS .player_has_flute -;NOP #8 +org $86AF9B ; <- 32F9B - FluteBoy_Chillin : 73 : LDA $7EF34C : CMP.b #$02 : BCS .player_has_flute LDA HasGroveItem : AND.b #$01 -db #$D0 ; BNE +db $D0 ; BNE -org $06B062 ; <- 33062 - FluteAardvark_InitialStateFromFluteState : 225 : LDA $7EF34C : AND.b #$03 : !BGE #$05 -JSL.l ItemCheck_TreeKid2 -NOP #$02 ; remove pointless AND +org $86B062 ; <- 33062 - FluteAardvark_InitialStateFromFluteState : 225 : LDA $7EF34C : AND.b #$03 : !BGE #$05 +JSL ItemCheck_TreeKid2 : NOP #$02 ; remove pointless AND -org $06B048 ; <- 33048 -JSL.l ItemCheck_TreeKid3 +org $86B048 ; <- 33048 +JSL ItemCheck_TreeKid3 -org $06AF59 ; <- 32F59 - sprite_flute_boy.asm : 36 (LDA $0D80, X : CMP.b #$03 : BEQ .invisible) -JML.l FluteBoy +org $86AF59 ; <- 32F59 - sprite_flute_boy.asm : 36 (LDA $0D80, X : CMP.b #$03 : BEQ .invisible) +JML FluteBoy FluteBoy_Abort: RTS FluteBoy_Continue: -;org $1E9968 ; <- F1968 - sprite_flute_boy_ostrich.asm : 14 (dw FluteBoyOstrich_Chillin) -;dw #$9991 ; FluteBoyOstrich_RunAway ;-------------------------------------------------------------------------------- -org $06B0C9 ; <- 330C9 -JSL.l ItemSet_TreeKid +org $86B0C9 ; <- 330C9 +JSL ItemSet_TreeKid ;-------------------------------------------------------------------------------- -org $05F177 ; <- 2F177 -JSL.l ItemCheck_Sahasrala +org $85F177 ; <- 2F177 +JSL ItemCheck_Sahasrala ;-------------------------------------------------------------------------------- -org $05F200 ; <- 2F200 -JSL.l ItemSet_Sahasrala +org $85F200 ; <- 2F200 +JSL ItemSet_Sahasrala ;-------------------------------------------------------------------------------- -org $1DE102 ; <- EE102 -JSL.l ItemCheck_Catfish -org $1DE11C ; <- EE11C -JSL.l ItemCheck_Catfish +org $9DE102 ; <- EE102 +JSL ItemCheck_Catfish +org $9DE11C ; <- EE11C +JSL ItemCheck_Catfish ;-------------------------------------------------------------------------------- -org $1DE1A1 ; <- EE1A1 - sprite_great_catfish.asm : 445 -JSL.l LoadCatfishItemGFX -NOP #2 +org $9DE1A1 ; <- EE1A1 - sprite_great_catfish.asm : 445 +JSL LoadCatfishItemGFX : NOP #2 ;-------------------------------------------------------------------------------- -org $1DDF49 ; <- EDF49 - sprite_great_catfish.asm : 19 -JML.l JumpToSplashItemTarget : NOP -org $1DDF4E ; <- EDF4E - sprite_great_catfish.asm : 21 +org $9DDF49 ; <- EDF49 - sprite_great_catfish.asm : 19 +JML JumpToSplashItemTarget : NOP +org $9DDF4E ; <- EDF4E - sprite_great_catfish.asm : 21 SplashItem_SpawnSplash: -org $1DDF52 ; <- EDF52 - sprite_great_catfish.asm : 27 +org $9DDF52 ; <- EDF52 - sprite_great_catfish.asm : 27 SplashItem_SpawnOther: -org $1DE228 ; <- EE228 - sprite_great_catfish.asm : 290 +org $9DE228 ; <- EE228 - sprite_great_catfish.asm : 290 LDA.b #$FF ;-------------------------------------------------------------------------------- -org $1DDF81 ; <- EDF81 - sprite_great_catfish.asm : 61 -JSL.l DrawThrownItem +org $9DDF81 ; <- EDF81 - sprite_great_catfish.asm : 61 +JSL DrawThrownItem ;-------------------------------------------------------------------------------- -;org $1DE1B0 ; <- EE1B0 - sprite_great_catfish.asm : 461 -;NOP #2 +org $85EE53 ; <- 2EE53 - mushroom.asm : 22 +JSL ItemCheck_Mushroom : NOP #2 ;-------------------------------------------------------------------------------- -org $05EE53 ; <- 2EE53 - mushroom.asm : 22 -JSL.l ItemCheck_Mushroom -NOP #2 +org $85EE8C ; <- 2EE8C - mushroom.asm : 69 +JSL ItemSet_Mushroom : NOP ;-------------------------------------------------------------------------------- -org $05EE8C ; <- 2EE8C - mushroom.asm : 69 -JSL.l ItemSet_Mushroom -NOP -;-------------------------------------------------------------------------------- -org $05F53E ; <- 2F53E - sprite_potion_shop.asm : 40 -JSL.l ItemCheck_Powder -CMP.b #$20 +org $85F53E ; <- 2F53E - sprite_potion_shop.asm : 40 +JSL ItemCheck_Powder : CMP.b #$20 ;-------------------------------------------------------------------------------- ; the quake medallion AND FLIPPERS -org $1DDF71 ; <- EDF71 - sprite_great_catfish.asm : 47 -JSL.l MarkThrownItem +org $9DDF71 ; <- EDF71 - sprite_great_catfish.asm : 47 +JSL MarkThrownItem ;-------------------------------------------------------------------------------- -;org $05F65D ; <- 2F65D - DONE IN INVENTORY -;JSL.l ItemSet_Powder -;NOP #2 -;-------------------------------------------------------------------------------- -;JSL.l ItemCheck_RupeeNPC -;-------------------------------------------------------------------------------- -;JSL.l ItemSet_RupeeNPC -;-------------------------------------------------------------------------------- -;org $08D01B ; PC 0x4501B - ancilla_flute.asm - 55 -;JSL.l ItemSet_Flute -;-------------------------------------------------------------------------------- -org $05FAFF ; <- 2FAFF - sprite_mad_batter.asm:57 (LDA $7EF37B : CMP.b #$01 : BCS .magic_already_doubled) -JSL.l ItemCheck_MagicBat : BEQ + : RTS : NOP : + +org $85FAFF ; <- 2FAFF - sprite_mad_batter.asm:57 (LDA $7EF37B : CMP.b #$01 : BCS .magic_already_doubled) +JSL ItemCheck_MagicBat : BEQ + : RTS : NOP : + ;================================================================================ -org $06BD6C ; <- 33D6C - sprite_middle_aged_man.asm:143 (JSL Link_ReceiveItem) -JSL.l Multiworld_MiddleAgedMan_ReactToSecretKeepingResponse -org $06BE81 ; <- 33E81 - sprite_hobo.asm:150 (JSL Link_ReceiveItem) -JSL.l Multiworld_Hobo_GrantBottle -org $0589B4 ; <- 289B4 ; sprite_master_sword.asm:183 (JSL Link_ReceiveItem) -JSL.l Multiworld_MasterSword_GrantToPlayer +org $86BD6C ; <- 33D6C - sprite_middle_aged_man.asm:143 (JSL Link_ReceiveItem) +JSL Multiworld_MiddleAgedMan_ReactToSecretKeepingResponse +org $86BE81 ; <- 33E81 - sprite_hobo.asm:150 (JSL Link_ReceiveItem) +JSL Multiworld_Hobo_GrantBottle +org $8589B4 ; <- 289B4 ; sprite_master_sword.asm:183 (JSL Link_ReceiveItem) +JSL Multiworld_MasterSword_GrantToPlayer ;================================================================================ ; Boss Hearts ;-------------------------------------------------------------------------------- -org $05EF5D ; <- 2EF5D - sprite_heart_upgrades.asm:110 (JSL GetAnimatedSpriteTile.variable) -JSL.l HeartContainerSpritePrep +org $85EF5D ; <- 2EF5D - sprite_heart_upgrades.asm:110 (JSL GetAnimatedSpriteTile.variable) +JSL HeartContainerSpritePrep ;-------------------------------------------------------------------------------- -org $05EF79 ; <- 2EF79 - sprite_heart_upgrades.asm:128 (JSL Sprite_PrepAndDrawSingleLargeLong) -JSL.l DrawHeartContainerGFX +org $85EF79 ; <- 2EF79 - sprite_heart_upgrades.asm:128 (JSL Sprite_PrepAndDrawSingleLargeLong) +JSL DrawHeartContainerGFX ;-------------------------------------------------------------------------------- -org $05EFCE ; <- 2EFCE - sprite_heart_upgrades.asm:176 (JSL Link_ReceiveItem) -;org $05EFEE ; <- 2EFEE - sprite_heart_upgrades.asm:202 (JSL Link_ReceiveItem) -JSL.l HeartContainerGet +org $85EFCE ; <- 2EFCE - sprite_heart_upgrades.asm:176 (JSL Link_ReceiveItem) +JSL HeartContainerGet ;-------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------- -org $0799B1 ; 399B1 - Bank07.asm:4063 (CPY.b #$3E : BNE .notHeartContainer) -JSL.l HeartContainerSound -BCC Link_ReceiveItem_notHeartContainer -; JSR Player_DoSfx3 -org $0799BA ; 399BA - Bank07.asm:4070 (LDA.b #$60 : STA $02D9) +org $8799B1 ; 399B1 - Bank07.asm:4063 (CPY.b #$3E : BNE .notHeartContainer) +JSL HeartContainerSound : BCC Link_ReceiveItem_notHeartContainer +org $8799BA ; 399BA - Bank07.asm:4070 (LDA.b #$60 : STA $02D9) Link_ReceiveItem_notHeartContainer: ;-------------------------------------------------------------------------------- -org $09887F ; <- 4887F - ancilla_init.asm : 1163 (LDA $0C5E, X : CMP.b #$3E : BEQ .doneWithSoundEffects) -JSL NormalItemSkipSound -NOP -BCS AddReceivedItem_doneWithSoundEffects -org $0988AE ; <- 488AE - ancilla_init.asm : 1193 (LDA.b #$0A : STA $02) +org $89887F ; <- 4887F - ancilla_init.asm : 1163 (LDA $0C5E, X : CMP.b #$3E : BEQ .doneWithSoundEffects) +JSL NormalItemSkipSound : NOP : BCS AddReceivedItem_doneWithSoundEffects +org $8988AE ; <- 488AE - ancilla_init.asm : 1193 (LDA.b #$0A : STA $02) AddReceivedItem_doneWithSoundEffects: ;================================================================================ ; Heart Pieces ;-------------------------------------------------------------------------------- -org $05F030 ; <- 2F030 - display item -JSL.l DrawHeartPieceGFX +org $85F030 ; <- 2F030 - display item +JSL DrawHeartPieceGFX ;-------------------------------------------------------------------------------- ; moving LinkBusy check to later time to avoid a delay in HP movement -org $05F037 ; (JSL CheckIfLinkIsBusy : BCS .exit) +org $85F037 ; (JSL CheckIfLinkIsBusy : BCS .exit) BRA + : NOP #4 : + -org $05F083 -JSL.l HeartPieceSpawnDelayFix +org $85F083 +JSL HeartPieceSpawnDelayFix ;-------------------------------------------------------------------------------- -org $05F08A ; <- 2F08A - sprite_heart_upgrades.asm : 324 - (LDA $7EF36B : INC A : AND.b #$03 : STA $7EF36B : BNE .got_4_piecese) item determination -JSL.l HeartPieceGet -BCS $18 ; reinsert the near branch that appears midway through what we overrode -BRA + : NOP #20 : + +org $85F08A ; <- 2F08A - sprite_heart_upgrades.asm : 324 - (LDA $7EF36B : INC A : AND.b #$03 : STA $7EF36B : BNE .got_4_piecese) item determination +JSL HeartPieceGet +JSL DynamicDrawCleanup +JSL IsMedallion +BCS + : BRA Sprite_EB_HeartPiece_handle_flags : + ; Don't change OW flags if we're +STZ.w SpriteAITable, X : RTS ; getting a tablet item ;-------------------------------------------------------------------------------- -org $06C0B0 ; <- 340B0 - sprite prep -JSL.l HeartPieceSpritePrep +org $86C0B0 ; <- 340B0 - sprite prep +JSL HeartPieceSpritePrep ;-------------------------------------------------------------------------------- -org $08C45B ; <- 4445B - ancilla_receive_item.asm : 152 -JSL.l HPItemReset -;-------------------------------------------------------------------------------- -org $05EF1E ; <- 2EF1E - sprite_heart_upgrades.asm : 48 (LDA $7EF280, X : AND.b #$40 : BEQ .dont_self_terminate) -JSL.l HeartUpgradeSpawnDecision -;-------------------------------------------------------------------------------- -org $05EFFA ; <- 2EFFA - sprite_heart_upgrades.asm : 216 (LDA $7EF280, X : ORA.b #$40 : STA $7EF280, X) -JSL.l SaveHeartCollectedStatus -NOP #6 +org $88C45B ; <- 4445B - ancilla_receive_item.asm : 152 +JSL HPItemReset ;================================================================================ ;================================================================================ ; Fake Flippers Softlock Fix + General Damage Hooks ;-------------------------------------------------------------------------------- -org $078091 ; <- 38091 - Bank07.asm:138 (LDA $037B : BNE .linkNotDamaged) -LDA $0373 : STA $00 : STZ $0373 ; store and zero damage -LDA $037B : BNE LinkDamaged_linkNotDamaged ; skip if immune +org $878091 ; <- 38091 - Bank07.asm:138 (LDA $037B : BNE .linkNotDamaged) +LDA.w DamageReceived : STA.b Scrap00 : STZ.w DamageReceived ; store and zero damage +LDA.w NoDamage : BNE LinkDamaged_linkNotDamaged ; skip if immune ;-------------------------------------------------------------------------------- -org $0780C6 ; <- 380C6 - Bank07.asm:174 (LDA $7EF36D) -JSL.l OnLinkDamaged +org $8780C6 ; <- 380C6 - Bank07.asm:174 (LDA $7EF36D) +JSL OnLinkDamaged ;-------------------------------------------------------------------------------- -org $0780FB ; <- 380FB - Bank07.asm:207 (.linkNotDamaged) +org $8780FB ; <- 380FB - Bank07.asm:207 (.linkNotDamaged) LinkDamaged_linkNotDamaged: ;-------------------------------------------------------------------------------- -org $0794FB ; <- 394FB - Bank07.asm:3336 (LDA.b #$14 : STA $11) -JSL.l OnLinkDamagedFromPit +org $8794FB ; <- 394FB - Bank07.asm:3336 (LDA.b #$14 : STA $11) +JSL OnLinkDamagedFromPit ;-------------------------------------------------------------------------------- -org $01FFE7 ; <- FFE7 - Bank01.asm:16375 (LDA $7EF36D) -JSL.l OnLinkDamagedFromPitOutdoors +org $81FFE7 ; <- FFE7 - Bank01.asm:16375 (LDA $7EF36D) +JSL OnLinkDamagedFromPitOutdoors ;-------------------------------------------------------------------------------- -;org $078F27 ; <- 38F27 -;JSL.l FlipperReset +;org $878F27 ; <- 38F27 +;JSL FlipperReset ;-------------------------------------------------------------------------------- -org $02B468 +org $82B468 dw FakeFlipperProtection -org $02FFC7 +org $82FFC7 FakeFlipperProtection: - JSR.w $029485 + JSR RecoverPositionAfterDrowning JSL protectff RTS ;-------------------------------------------------------------------------------- -org $02B46C ; <- bank_02.asm:9722 (STZ.b $00 : STZ.b $02) +org $82B46C ; <- bank_02.asm:9722 (STZ.b $00 : STZ.b $02) JSL FlipperScrollWarp ;-------------------------------------------------------------------------------- -;org $09F40B ; <- 4F40B - module_death.asm:222 (LDX.b #$00) -;JSL.l IgnoreFairyCheck -;-------------------------------------------------------------------------------- -org $078F51 ; <- 38F51 - Bank07.asm:2444 (JSR $AE54 ; $3AE54 IN ROM) -JSL.l OnEnterWater : NOP -;-------------------------------------------------------------------------------- - +;org $878F51 ; <- 38F51 - Bank07.asm:2444 (JSR $AE54 ; $3AE54 IN ROM) +;JSL OnEnterWater : NOP ;================================================================================ ; Floodgate Softlock Fix ;-------------------------------------------------------------------------------- -org $0AB8E5 ; <- 538E5 -JSL.l FloodGateAndMasterSwordFollowerReset -JSL.l IncrementFlute -STZ $1000 : STZ $1001 -NOP #26 +org $8AB8E5 ; <- 538E5 +JSL FloodGateAndMasterSwordFollowerReset +JSL IncrementFlute +STZ.w GFXStripes : STZ.w GFXStripes+1 +BRA ++ : NOP #24 : ++ ;-------------------------------------------------------------------------------- -org $02AA87 ; <- 12A87 -JSL.l OnOWTransition -NOP #36 +org $82AA87 ; <- 12A87 +JSL OnOWTransition : BRA ++ : NOP #34 : ++ ;================================================================================ ;Inverted mode tile map update (executed right after the original tile load) ;-------------------------------------------------------------------------------- -org $02ED51 ; <- 16D51 -JSL.l Overworld_LoadNewTiles -NOP #$02 -;-------------------------------------------------------------------------------- -;Same as above -org $02EC2E ;<- 016C2E -JSL.l Overworld_LoadNewTiles -NOP #$02 +org $82ED51 +JSL Overworld_LoadNewTiles : BRA ++ : ++ +org $82EC2E +JSL Overworld_LoadNewTiles : BRA ++ : ++ ;================================================================================ -org $07A3E2 ;<- 3A3E2 Bank07.asm:5764 (LDA.b #$80 : STA $03F0) -JSL.l FreeDuckCheck : BEQ + +org $87A3E2 ;<- 3A3E2 Bank07.asm:5764 (LDA.b #$80 : STA $03F0) +JSL FreeDuckCheck : BEQ + NOP skip 3 ; a JSR we need to keep + ;================================================================================ -org $07A9AC ; <- 3A9AC - Bank07.asm:6628 (LDA $0C : ORA $0E : STA $00 : AND.b #$0C : BEQ BRANCH_BETA) +org $87A9AC ; <- 3A9AC - Bank07.asm:6628 (LDA $0C : ORA $0E : STA $00 : AND.b #$0C : BEQ BRANCH_BETA) JML MirrorBonk MirrorBonk_NormalReturn: -org $07A9D1 ; <- 3A9D1 - Bank07.asm:6649 (BRANCH_GAMMA:) +org $87A9D1 ; <- 3A9D1 - Bank07.asm:6649 (BRANCH_GAMMA:) MirrorBonk_BranchGamma: ;================================================================================ ;================================================================================ ; Add SFX ;-------------------------------------------------------------------------------- -org $1DFDA8 ; <- EFDA9 - sprite_digging_game_guy.asm:309 (STA $7FFE00) -JSL.l SpawnShovelGamePrizeSFX +org $9DFDA8 ; <- EFDA9 - sprite_digging_game_guy.asm:309 (STA $7FFE00) +JSL SpawnShovelGamePrizeSFX ;-------------------------------------------------------------------------------- -;org $01EEB6 ; <- EEB6 - Bank01.asm:14138 (ORA.b #$40 : STA $0403) -org $01EECD ; <- EECD - Bank01.asm:14160 (LDA.b #$0E : STA $012F) -JSL.l SpawnChestGamePrizeSFX : NOP +org $81EECD ; <- EECD - Bank01.asm:14160 (LDA.b #$0E : STA $012F) +JSL SpawnChestGamePrizeSFX : NOP ;================================================================================ ;================================================================================ ; Heart Beep Timer ;-------------------------------------------------------------------------------- -org $0DDC9B ; <- 6DC9B -JSL.l BeepLogic -NOP #6 +org $8DDC9B ; <- 6DC9B +JSL BeepLogic : NOP #6 ;================================================================================ ;================================================================================ ; Item Downgrade Fix ;-------------------------------------------------------------------------------- -org $09865E ; <- 4865E -JSL.l $1BEE1B ; fix something i wrote over i shouldn't have +org $89865E ; <- 4865E +JSL Palettes_Load_LinkGloves ; fix something i wrote over i shouldn't have ;-------------------------------------------------------------------------------- -org $098638 ; <- 48638 - ancilla_init.asm:737 - LDA .item_values, Y : BMI .dontWrite (BMI) -JSL.l ItemDowngradeFix +org $898638 ; <- 48638 - ancilla_init.asm:737 - LDA .item_values, Y : BMI .dontWrite (BMI) +JSL ItemDowngradeFix ;================================================================================ ;================================================================================ ; Lamp Mantle & Light Cone Fix ;-------------------------------------------------------------------------------- -org $1AFC4D ; <- D7C4D - sprite_movable_mantle.asm:31 (LDA $7EF3CC : CMP.b #$01 : BNE .return) -JSL.l CheckForZelda +org $9AFC4D ; <- D7C4D - sprite_movable_mantle.asm:31 (LDA $7EF3CC : CMP.b #$01 : BNE .return) +JSL CheckForZelda ;-------------------------------------------------------------------------------- -org $1AFC55 ; <- D7C55 - sprite_movable_mantle.asm:34 (LDA $7EF34A : BEQ .return) +org $9AFC55 ; <- D7C55 - sprite_movable_mantle.asm:34 (LDA $7EF34A : BEQ .return) NOP #6 ; remove check ;-------------------------------------------------------------------------------- -org $068841 ; <- 30841 - sprite_prep.asm:269 (LDA $0D00, X : ADD.b #$03 : STA $0D00, X) -JSL.l Mantle_CorrectPosition : NOP #2 +org $868841 ; <- 30841 - sprite_prep.asm:269 (LDA $0D00, X : ADD.b #$03 : STA $0D00, X) +JSL Mantle_CorrectPosition : NOP #2 ;-------------------------------------------------------------------------------- -org $0297FD ; <- bank02 : Module07_19_MirrorFade (STZ.b $11 : STZ.b $14) +org $8297FD ; <- bank02 : Module07_19_MirrorFade (STZ.b $11 : STZ.b $14) JSL MirrorScrollSpawnZelda ;-------------------------------------------------------------------------------- -org $0DFA53 ; <- 6FA53 - hud check for lantern -JSL.l LampCheck +org $8DFA53 ; <- 6FA53 - hud check for lantern +JSL LampCheck ;-------------------------------------------------------------------------------- -org $01F503 ; <- F503 - Bank01.asm:14994 (LDA.b #$01 : STA $1D) -JSL.l SetOverlayIfLamp +org $81F503 ; <- F503 - Bank01.asm:14994 (LDA.b #$01 : STA $1D) +JSL SetOverlayIfLamp ;================================================================================ ;================================================================================ @@ -2504,77 +2196,68 @@ JSL.l SetOverlayIfLamp ; overlay to draw when leaving the cave again. We also use this value to ; identify the tavern entrance to determine whether link should walk up or down. ;-------------------------------------------------------------------------------- -org $1BBD5F ; <- Bank1b.asm:296 (LDA $1BBB73, X : STA $010E) -JSL.l StoreLastOverworldDoorID -NOP #3 +org $9BBD5F ; <- Bank1b.asm:296 (LDA $1BBB73, X : STA $010E) +JSL StoreLastOverworldDoorID : NOP #3 ;-------------------------------------------------------------------------------- -org $02D754 ; <- Bank02.asm:10847 (LDA $D724, X : STA $0696 : STZ $0698) -JSL.l CacheDoorFrameData -NOP #5 +org $82D754 ; <- Bank02.asm:10847 (LDA $D724, X : STA $0696 : STZ $0698) +JSL CacheDoorFrameData : NOP #5 ;-------------------------------------------------------------------------------- -org $0298AD ; <- Bank02.asm:4495 (LDA $010E : CMP.b #$43) -JSL.l WalkDownIntoTavern -NOP #1 +org $8298AD ; <- Bank02.asm:4495 (LDA $010E : CMP.b #$43) +JSL WalkDownIntoTavern : NOP #1 ;================================================================================ ;================================================================================ ; Hole fixes ;-------------------------------------------------------------------------------- -org $1BB88E ; <- DB88E - Bank1B.asm:59 (LDX.w #$0024) -JML.l CheckHole -org $1BB8A4 ; <- DB8A4 - Bank1B.asm:78 (LDX.w #$0026) +org $9BB88E ; <- DB88E - Bank1B.asm:59 (LDX.w #$0024) +JML CheckHole +org $9BB8A4 ; <- DB8A4 - Bank1B.asm:78 (LDX.w #$0026) Overworld_Hole_GotoHoulihan: -org $1BB8AF ; <- DB8AF - Bank1B.asm:85 (.matchedHole) +org $9BB8AF ; <- DB8AF - Bank1B.asm:85 (.matchedHole) Overworld_Hole_matchedHole: -org $1BB8BD ; <- DB8BD - Bank1B.asm:85 (PLB) +org $9BB8BD ; <- DB8BD - Bank1B.asm:85 (PLB) Overworld_Hole_End: -;-------------------------------------------------------------------------------- - ;================================================================================ ; Replace pyramid hole check for killing aga2 ; ; this check is intended to prevent getting fluted out a second time if you ; return to his room after already killing him once. ;--------------------------------------------------------------------------------- -org $01C74E ; 00C74E - bank_01.asm:13281 - (LDA.l $7EF2DB : AND.b #$20) +org $81C74E ; 00C74E - bank_01.asm:13281 - (LDA.l $7EF2DB : AND.b #$20) LDA.l Aga2Duck : NOP #2 ;================================================================================ ; Music fixes ;-------------------------------------------------------------------------------- -org $0282F4 ; <- Bank02.asm:654 (LDY.b #$58 ...) -JML.l PreOverworld_LoadProperties_ChooseMusic -org $028389 ; <- Bank02.asm:763 +org $8282F4 ; <- Bank02.asm:654 (LDY.b #$58 ...) +JML PreOverworld_LoadProperties_ChooseMusic +org $828389 ; <- Bank02.asm:763 PreOverworld_LoadProperties_SetSong: ;-------------------------------------------------------------------------------- ; Remove Aga1 check for Kakariko music, always play track 7 -org $02A992 ; (BCS $A999) +org $82A992 ; (BCS $A999) NOP #2 -org $02A9B0 ; (BCS $A9B7) +org $82A9B0 ; (BCS $A9B7) NOP #2 -org $02C1C8 ; (BCS $C1CC) +org $82C1C8 ; (BCS $C1CC) NOP #2 -; -org $02ADA0 ; (LDA.b #$F1 : STA $012C) +org $82ADA0 ; (LDA.b #$F1 : STA $012C) JSL Overworld_MosaicDarkWorldChecks : NOP ;-------------------------------------------------------------------------------- -org $05CC58 ; <- Bank05.asm:1307 (LDA $040A : CMP.b #$18) -JSL PsychoSolder_MusicCheck -NOP #1 -; -org $06F96A -JSL PsychoSolder_MusicCheck -NOP #1 +org $85CC58 ; <- Bank05.asm:1307 (LDA $040A : CMP.b #$18) +JSL PsychoSolder_MusicCheck : NOP #1 +org $86F96A +JSL PsychoSolder_MusicCheck : NOP #1 ;-------------------------------------------------------------------------------- -org $02B13A ; <- Bank02.asm:7647 +org $82B13A ; <- Bank02.asm:7647 dl Overworld_FinishMirrorWarp ;-------------------------------------------------------------------------------- -org $0AB949 ; <- Bank0A.asm:270 (Different from US ROM) +org $8AB949 ; <- Bank0A.asm:270 (Different from US ROM) JSL BirdTravel_LoadTargetAreaMusic BRA + : NOP #14 : + ;-------------------------------------------------------------------------------- -org $02B027 ; <- Bank02.asm:7535-7541 +org $82B027 ; <- Bank02.asm:7535-7541 JSL Overworld_DetermineMusic BRA + : NOP #42 : + ;================================================================================ @@ -2582,182 +2265,179 @@ BRA + : NOP #42 : + ;================================================================================ ; Hooks for roomloading.asm ;-------------------------------------------------------------------------------- -org $02895D ; <- Bank02.asm:1812 (JSL Dungeon_LoadRoom) - JSL LoadRoomHook +org $82895D ; <- Bank02.asm:1812 (JSL Dungeon_LoadRoom) +JSL LoadRoomHook ;-------------------------------------------------------------------------------- -org $028BE7 ; <- Bank02.asm:2299 (JSL Dungeon_LoadRoom) - JSL LoadRoomHook_noStats +org $828BE7 ; <- Bank02.asm:2299 (JSL Dungeon_LoadRoom) +JSL LoadRoomHook_noStats ;-------------------------------------------------------------------------------- -org $029309 ; <- Bank02.asm:3533 (JSL Dungeon_LoadRoom) - JSL LoadRoomHook_noStats +org $829309 ; <- Bank02.asm:3533 (JSL Dungeon_LoadRoom) +JSL LoadRoomHook_noStats ;-------------------------------------------------------------------------------- -org $02C2F3 ; <- Bank02.asm:10391 (JSL Dungeon_LoadRoom) - JSL LoadRoomHook_noStats +org $82C2F3 ; <- Bank02.asm:10391 (JSL Dungeon_LoadRoom) +JSL LoadRoomHook_noStats ;================================================================================ ;================================================================================ ; Hooks into the "Reloading all graphics" routine ;-------------------------------------------------------------------------------- -org $00E64D ; <- Bank00.asm:5656 (STZ $00 : STX $01 : STA $02) - JML BgGraphicsLoading - BgGraphicsLoadingCancel: - RTS : NOP - BgGraphicsLoadingResume: +org $80E64D ; <- Bank00.asm:5656 (STZ $00 : STX $01 : STA $02) +JML BgGraphicsLoading +BgGraphicsLoadingCancel: +RTS : NOP +BgGraphicsLoadingResume: ;================================================================================ ;================================================================================ ; Hook when updating the floor tileset in dungeons (such as between floors) ;-------------------------------------------------------------------------------- -org $00DF62 ; <- Bank00.asm:4672 (LDX.w #$0000 : LDY.w #$0040) - JML ReloadingFloors - NOP : NOP - ReloadingFloorsResume: -org $00DF6E ; <- A few instructions later, right after JSR Do3To.high16Bit - ReloadingFloorsCancel: +org $80DF62 ; <- Bank00.asm:4672 (LDX.w #$0000 : LDY.w #$0040) +JML ReloadingFloors : NOP #2 +ReloadingFloorsResume: +org $80DF6E ; <- A few instructions later, right after JSR Do3To.high16Bit +ReloadingFloorsCancel: ;================================================================================ ;================================================================================ ; Hook bow use - to use rupees instead of actual arrows ;-------------------------------------------------------------------------------- -org $07A055 ; <- Bank07.asm:5205 (LDA $0B99 : BEQ BRANCH_DELTA) -JSL.l ArrowGame : NOP #14 +org $87A055 ; <- Bank07.asm:5205 (LDA $0B99 : BEQ BRANCH_DELTA) +JSL ArrowGame : BRA ++ : NOP #12 : ++ -org $07A06C ; <- Bank07.asm:5215 (LDA $7EF377 : BEQ BRANCH_EPSILON) -JSL.l DecrementArrows : SKIP 2 : NOP : LDA CurrentArrows +org $87A06C ; <- Bank07.asm:5215 (LDA $7EF377 : BEQ BRANCH_EPSILON) +JSL DecrementArrows : SKIP 2 : NOP : LDA CurrentArrows ;================================================================================ ;================================================================================ ; Quick Swap ;-------------------------------------------------------------------------------- -org $0287FB ; <- 107FB - Bank02.asm:1526 (LDA $F6 : AND.b #$40 : BEQ .dontActivateMap) -JSL.l QuickSwap +org $8287FB ; <- 107FB - Bank02.asm:1526 (LDA $F6 : AND.b #$40 : BEQ .dontActivateMap) +JSL QuickSwap -org $02A451 ; <- 12451 - Bank02.asm:6283 (LDA $F6 : AND.b #$40 : BEQ .xButtonNotDown) -JSL.l QuickSwap +org $82A451 ; <- 12451 - Bank02.asm:6283 (LDA $F6 : AND.b #$40 : BEQ .xButtonNotDown) +JSL QuickSwap ;================================================================================ ;================================================================================ ; Tagalong Fixes ;-------------------------------------------------------------------------------- -org $0689AB ; <- 309AB - sprite_prep.asm: 647 (LDA $7EF3CC : CMP.b #$06 : BEQ .killSprite) +org $8689AB ; <- 309AB - sprite_prep.asm: 647 (LDA $7EF3CC : CMP.b #$06 : BEQ .killSprite) ; Note: In JP 1.0 we have: (CMP.b #$00 : BNE .killSprite) appling US bugfix ; Prevent followers from causing blind/maiden to despawn: ; Door rando: let zelda despawn the maiden. JSL BlindZeldaDespawnFix -org $0689AF +org $8689AF SpritePrep_BlindMaiden_despawn_follower: ; this is the normal execution path -org $0689C9 +org $8689C9 SpritePrep_BlindMaiden_kill_the_girl: ; not the follower ;-------------------------------------------------------------------------------- ; Fix old man purple chest issues using the same method as above -org $1EE906 ; <- F6906 - sprite_old_mountain_man.asm : 31 (LDA $7EF3CC : CMP.b #$00 : BNE .already_have_tagalong) -CMP.b #$04 : db #$F0 ; BEQ +org $9EE906 ; <- F6906 - sprite_old_mountain_man.asm : 31 (LDA $7EF3CC : CMP.b #$00 : BNE .already_have_tagalong) +CMP.b #$04 : db $F0 ; BEQ ;-------------------------------------------------------------------------------- ;Control which doors frog/smith can enter -org $1BBCF0 ; <- DBCF0 - Bank1B.asm: 248 (LDA $04B8 : BNE BRANCH_MU) +org $9BBCF0 ; <- DBCF0 - Bank1B.asm: 248 (LDA $04B8 : BNE BRANCH_MU) Overworld_Entrance_BRANCH_LAMBDA: ; Branch here to show Cannot Enter with Follower message -org $1BBD55 ; <- DBD55 - Bank1B.asm: 290 (CPX.w #$0076 : BCC BRANCH_LAMBDA) -JML.l SmithDoorCheck : NOP +org $9BBD55 ; <- DBD55 - Bank1B.asm: 290 (CPX.w #$0076 : BCC BRANCH_LAMBDA) +JML SmithDoorCheck : NOP Overworld_Entrance_BRANCH_RHO: ; branch here to continue into door ;================================================================================ ;================================================================================ ; Paradox Cave Shopkeeper Fixes ;-------------------------------------------------------------------------------- -org $008C19 ; Bank00.asm@1633 (LDA.b #$01 : STA $420B) -JSL ParadoxCaveGfxFix -NOP +;org $808C19 ; Bank00.asm 1633 (LDA.b #$01 : STA MDMAEN) +JSL ParadoxCaveGfxFix : NOP ;================================================================================ ;================================================================================ ; Resolve conflict between race game and witch item ;-------------------------------------------------------------------------------- ; Change race game to use $021B instead of $0ABF for detecting cheating -org $0DCB9D ; STZ.w $0ABF -STZ $021B +org $8DCB9D ; STZ.w $0ABF +STZ.w RaceGameFlag -org $0DCBFE ; LDA.w $0ABF -LDA $021B +org $8DCBFE ; LDA.w $0ABF +LDA.w RaceGameFlag -org $02BFE0 ; LDA.b #$01 : STA.w $0ABF -JSL SetOverworldTransitionFlags -NOP +org $82BFE0 ; LDA.b #$01 : STA.w $0ABF +JSL SetOverworldTransitionFlags : NOP ; For mirroring, the new flag is set in IncrementOWMirror in stats.asm ;================================================================================ ;================================================================================ ; Player Sprite Fixes ;-------------------------------------------------------------------------------- -org $0DA9C8 ; <- 06A9C8 - player_oam.asm: 1663 (AND.w #$00FF : CMP.w #$00F8 : BCC BRANCH_MARLE) +org $8DA9C8 ; <- 06A9C8 - player_oam.asm: 1663 (AND.w #$00FF : CMP.w #$00F8 : BCC BRANCH_MARLE) ; We are converting this branching code that basically puts the carry from the ; CMP into $02 into constant time code, so that player sprite head-bobbing can ; be removed by sprites while remaining race legal (cycle-for-cycle identical ; to the link sprite). -LDA $02 ; always zero! (this replaces the BCC) +LDA.b Scrap02 ; always zero! (this replaces the BCC) ADC.w #0000 ; put the carry bit into the accumulator instead of a hardcoded 1. ;------------------------------------------------------------------------------- -org $02FD6F ; <- 017d6f - bank0E.asm: 3694 (LoadActualGearPalettes:) Note: Overflow of bank02 moved to 0e in US Rom -JSL LoadActualGearPalettesWithGloves -RTL +org $82FD6F ; <- 017d6f - bank0E.asm: 3694 (LoadActualGearPalettes:) Note: Overflow of bank02 moved to 0e in US Rom +JSL LoadActualGearPalettesWithGloves : RTL ;-------------------------------------------------------------------------------- ; Bunny Palette/Overworld Map Bugfix ;-------------------------------------------------------------------------------- -org $02FDF0 ; <- 017df0 - bank0E (LDA [$00] : STA $7EC300, X : STA $7EC500, X) -JSL LoadGearPalette_safe_for_bunny -RTS +org $82FDF0 ; <- 017df0 - bank0E (LDA [$00] : STA $7EC300, X : STA $7EC500, X) +JSL LoadGearPalette_safe_for_bunny : RTS ;================================================================================ ;================================================================================ ; Chest Encryption ;-------------------------------------------------------------------------------- -org $01EBEB ; <- 0EBEB - bank01.asm : 13760 (INC $0E) -JML.l GetChestData : NOP -org $01EBDE ; <- 0EBDE - bank01.asm : 13740 (.couldntFindChest) +org $81EBEB ; <- 0EBEB - bank01.asm : 13760 (INC $0E) +JML GetChestData : NOP +org $81EBDE ; <- 0EBDE - bank01.asm : 13740 (.couldntFindChest) Dungeon_OpenKeyedObject_couldntFindChest: -org $01EBF0 ; <- 0EBF0 - bank01.asm : 13764 (.nextChest) +org $81EBF0 ; <- 0EBF0 - bank01.asm : 13764 (.nextChest) Dungeon_OpenKeyedObject_nextChest: -org $01EC14 ; <- 0EC14 - bank01.asm : 13783 (LDX $040C) +org $81EC14 ; <- 0EC14 - bank01.asm : 13783 (LDX $040C) Dungeon_OpenKeyedObject_bigChest: -org $01EC38 ; <- 0EC38 - bank01.asm : 13809 (.smallChest) +org $81EC38 ; <- 0EC38 - bank01.asm : 13809 (.smallChest) Dungeon_OpenKeyedObject_smallChest: ;================================================================================ ;================================================================================ ; Murahdahla (The brother who re-assembles the triforce pieces) ;-------------------------------------------------------------------------------- -org $06C092 ; bank06.asm:1864 (JSL Sprite_ElderLong) [22 CD F0 05] +org $86C092 ; bank06.asm:1864 (JSL Sprite_ElderLong) [22 CD F0 05] JSL NewElderCode ;-------------------------------------------------------------------------------- ; Add him to Castle Map post-rain, and post aga1 ;-------------------------------------------------------------------------------- -org $09D0A9 -db #$18, #$0A, #$D8, #$18, #$0F, #$43, #$FF;remove heart from tree adjancent map [LW1] -db #$12, #$19, #$16 ;add sahasrala in castle Y, X, Sprite ID -org $09C937 -db #$B0, #$D0 ;change [LW1] map 01C pointers -org $09D421 -db #$18, #$0F, #$45, #$FF;remove heart from tree adjancent map [LW2] -db #$12, #$19, #$16 ;add sahasrala in castle Y, X, Sprite ID -org $09CA57 -db #$25, #$D4 ;change [LW2] map 01C pointers +org $89D0A9 +db $18, $0A, $D8, $18, $0F, $43, $FF;remove heart from tree adjancent map [LW1] +db $12, $19, $16 ;add sahasrala in castle Y, X, Sprite ID +org $89C937 +db $B0, $D0 ;change [LW1] map 01C pointers +org $89D421 +db $18, $0F, $45, $FF;remove heart from tree adjancent map [LW2] +db $12, $19, $16 ;add sahasrala in castle Y, X, Sprite ID +org $89CA57 +db $25, $D4 ;change [LW2] map 01C pointers ;-------------------------------------------------------------------------------- ; Expanded trinexx sheet gfx. ;-------------------------------------------------------------------------------- -org $00CFC0+178 : db #$33 -org $00D09F+178 : db #$90 -org $00D17E+178 : db #$00 +org $80CFC0+178 : db ExpandedTrinexx>>16 +org $80D09F+178 : db ExpandedTrinexx>>8 +org $80D17E+178 : db ExpandedTrinexx>>0 ; Use above sheet in Hyrule castle courtyard after rain state. -org $00DB9E ; Hyrule Castle GFX Sprite Sheet 4 on [LW1] -db #$3F -org $00DC0A ; Hyrule Castle GFX Sprite Sheet 4 on [LW2] -db #$3F +org $80DB9E ; Hyrule Castle GFX Sprite Sheet 4 on [LW1] +db $3F +db $80DBA2 ; Hyrule Castle GFX Sprite Sheet 4 on [RainState] +db $3F +org $80DC0A ; Hyrule Castle GFX Sprite Sheet 4 on [LW2] +db $3F ;-------------------------------------------------------------------------------- ; Updated evil barrier animation table ;-------------------------------------------------------------------------------- -org $1DF0E1;Evil Barrier new draw code +org $9DF0E1 ;Evil Barrier new draw code dw 0, 0 : db $CC, $00, $00, $02 dw -29, 3 : db $EA, $00, $00, $00 @@ -2813,162 +2493,221 @@ dw 37, 11 : db $FB, $40, $00, $00 ;-------------------------------------------------------------------------------- ; Allow Bunny Link to Read Signposts ;-------------------------------------------------------------------------------- -org $07839E ; bunny BAGE check +org $87839E ; bunny BAGE check BunnyRead: - JSR.w $07B5A9 ; check A button + JSR Link_CheckNewAPress BCC .noA - JSR.w CheckIfReading + JSR CheckIfReading BNE .noread - JSR.w $07B4DB + JSR Link_PerformRead NOP .noread .noA -org $07FFF4 +org $87FFF4 CheckIfReading: - JSR.w $07D36C ; check action - LDA #$80 : TRB $3B - CPX #$04 + JSR Link_HandleLiftables + LDA.b #$80 : TRB.b $3B + CPX.b #$04 RTS ;================================================================================ -org $0DB4CA : db $40, $40 ; fire bar statis -org $0DB4A9 : db $50, $50, $6E, $6E ; roller statis -org $0DB4B2 : db $40, $40, $40, $40 ; cannon statis -org $0DB4C3 : db $C0 ; anti fairy statis -org $0DB516 : db $40 ; chain chomp statis +; remove kill room requirements +org $8DB4CA : db $40, $40 ; fire bar +org $8DB4A9 : db $50, $50, $6E, $6E ; roller +org $8DB4B2 : db $40, $40, $40, $40 ; cannon +org $8DB4C3 : db $C0 ; anti fairy +org $8DB516 : db $40 ; chain chomp ;-------------------------------------------------------------------------------- ; Keep Firebar Damage on Same Layer ;-------------------------------------------------------------------------------- -org $06F425 -Sprite_AttemptDamageToPlayerPlusRecoilLong: - -org $1ED1B6 -JSL NewFireBarDamage +org $9ED1B6 : JSL NewFireBarDamage ;================================================================================ ; Remove heart beeps from 1/2 max HP -org $0DDB60 +org $8DDB60 db $00, $00 - - +;================================================================================ +; Credits +;================================================================================ +org $8EE651 : JSL LoadCreditsTiles +org $8EEDAF : JSL NearEnding +org $8EEDD9 : JSL EndingItems +org $8EE828 : JSL PreparePointer : LDA.b [CreditsPtr],Y : NOP +org $8EE83F : LDA.b [CreditsPtr],Y : NOP +org $8EE853 +LDA.b [CreditsPtr],Y : NOP : AND.w #$00FF : ASL A : JSL CheckFontTable +org $8EE86D : JSL RenderCreditsStatCounter : JMP.w AfterDeathCounterOutput +org $82857D : JSL LoadOverworldCreditsTiles ;================================================================================ ; Fast credits - -org $02A096 -JSL DumbFlagForMSU - -org $0EC3AF -JSL FastCreditsScrollOW -JMP.w $0EC3C7 - -org $0EC41F -JSL FastCreditsCutsceneUnderworldY - -org $0EC42C -JSL FastCreditsCutsceneUnderworldX - - -org $0EC488 -JSL FastCreditsCutsceneTimer - -org $0EE773 -JSL FastTextScroll : NOP +org $8EC2B1 : JSL FlagFastCredits +org $82A096 : JSL DumbFlagForMSU +org $8EC3AF : JSL FastCreditsScrollOW : JMP.w Credits_ScrollScene_Overworld_no_scroll +org $8EC41F : JSL FastCreditsCutsceneUnderworldY +org $8EC42C : JSL FastCreditsCutsceneUnderworldX +org $8EC488 : JSL FastCreditsCutsceneTimer +org $8EE773 : JSL FastTextScroll : NOP ;================================================================================ -org $01FFEE : JSL IncrementDamageTakenCounter_Eight ; overworld pit -org $079506 : JSL IncrementDamageTakenCounter_Eight ; underworld pit +org $81FFEE : JSL IncrementDamageTakenCounter_Eight ; overworld pit +org $879506 : JSL IncrementDamageTakenCounter_Eight ; underworld pit -org $07B0B1 : JSL IncrementMagicUseCounter +org $87B0B1 : JSL IncrementMagicUseCounter ;================================================================================ ; Boss icons -org $0AEEDF : db $02 ; big icon -org $0AEAFF : db $48 ; X position +org $8AEEDF : db $02 ; big icon +org $8AEAFF : db $48 ; X position -org $0AEED4 ; disable flashing - BRA ++ : NOP #6 : ++ +org $8AEED4 ; disable flashing +BRA ++ : NOP #6 : ++ -org $0AEEF2 - SBC.b #$03 : STA.w $0801,X - LDA.b #$03 : STA.w $0802,X - LDA.b #$31 : STA.w $0803,X +org $8AEEF2 +SBC.b #$03 : STA.w $0801,X +LDA.b #$03 : STA.w $0802,X +LDA.b #$31 : STA.w $0803,X -org $008BE5 ; hijack stripes for boss GFX transfer - JSL DoDungeonMapBossIcon +org $808BE5 ; hijack stripes for boss GFX transfer +JSL DoDungeonMapBossIcon ;================================================================================ - -org $01C4B8 : JSL FixJingleGlitch -org $01C536 : JSL FixJingleGlitch -org $01C592 : JSL FixJingleGlitch -org $01C65F : JSL FixJingleGlitch +org $81C4B8 +JSL FixJingleGlitch +org $81C536 +JSL FixJingleGlitch +org $81C592 +JSL FixJingleGlitch +org $81C65F +JSL FixJingleGlitch ;================================================================================ ; Hooks for when submenu opens ;-------------------------------------------------------------------------------- -org $028818 +org $828818 JSL OnMenuLoad -org $02A463 +org $82A463 JSL OnMenuLoad -;================================================================================ -; Terrorpin AI fix -;-------------------------------------------------------------------------------- -org $1EB2B1 ; sprite_terrorpin.asm(57) : AND.b #$03 : STA $0DE0, X ; 5 bytes -JSL FixTerrorpin ; 4 bytes -NOP ; 1 byte - ;-------------------------------------------------------------------------------- ; Text Renderer ;-------------------------------------------------------------------------------- -if !FEATURE_NEW_TEXT - org $0EF51B - JML RenderCharExtended - org $0EF520 - RenderCharExtended_returnOriginal: - org $0EF567 - RenderCharExtended_returnUncompressed: +org $8EF51B : JML RenderCharExtended +org $8EF520 : RenderCharExtended_returnOriginal: +org $8EF567 : RenderCharExtended_returnUncompressed: +org $8EF356 : JSL RenderCharLookupWidth +org $8EF3BA : JSL RenderCharLookupWidth +org $8EF48E : JML RenderCharLookupWidthDraw +org $8EF499 : RenderCharLookupWidthDraw_return: +org $8EF6AA : JML RenderCharToMapExtended +org $8EF6C2 : RenderCharToMapExtended_return: +org $8EFA50 : JSL RenderCharSetColorExtended +org $8EEE5D : JSL RenderCharSetColorExtended_init +org $8EF285 : JSL RenderCharSetColorExtended_close : NOP - org $0EF356 - JSL RenderCharLookupWidth - org $0EF3BA - JSL RenderCharLookupWidth - org $0EF48E - JML RenderCharLookupWidthDraw - org $0EF499 - RenderCharLookupWidthDraw_return: +;================================================================================ +; VRAM +;-------------------------------------------------------------------------------- +org $808BE5 ; hijack stripes +JSL TransferVRAMStripes - org $0EF6AA - JML RenderCharToMapExtended - org $0EF6C2 - RenderCharToMapExtended_return: +;=================================================================================================== +; Fix fairy palette on file select +;=================================================================================================== +org $9BF029+1 : db $10 + +;=================================================================================================== +; Item decompression/loading +;=================================================================================================== +; mushroom - are these even necessary in rando? +org $8283CF : JSL TransferItemReceiptToBuffer_using_GraphicsID +org $82ADB6 : JSL TransferItemReceiptToBuffer_using_GraphicsID +org $82ADE9 : JSL TransferItemReceiptToBuffer_using_GraphicsID + +; big key +org $869261 : JSL TransferItemReceiptToBuffer_using_GraphicsID + +; falling items +org $898BD2 : JSL TransferItemReceiptToBuffer_using_GraphicsID + +; misc +org $89878C : JSL TransferItemReceiptToBuffer_using_GraphicsID + +; rupees +org $88C6A0 : JSL TransferRupeesProperly + + +; pond items +org $898A4D : JSL TransferItemReceiptToBuffer_using_GraphicsID +org $898AEE : JSL TransferItemReceiptToBuffer_using_GraphicsID + +; flute +org $898C85 : JSL TransferItemReceiptToBuffer_using_GraphicsID + +; gt cutscene +org $899BBE : JSL TransferItemReceiptToBuffer_using_GraphicsID + +;=================================================================================================== +; gratuitous NOPs removed for speed +;=================================================================================================== +org $1D8E75 : RTS + +org $1DB5D8 : JML $9DB5DF +org $1DB605 : JML $9DB60C +org $1DBBF1 : JML $9DBBF8 +org $1DBC19 : JML $9DBC20 +org $1DC072 : JMP.w $9DC079 +org $1DC0A5 : JMP.w $9DC0AC +org $1DED3B : JML $9DED42 +org $1DED7A : JML $9DED81 + +org $05B55E : JMP ++ : ++ +org $05B580 : JMP ++ : ++ + +org $05B5BE : RTS + +org $0DD7AD : JMP ++ : ++ +org $0DD7CB : JMP ++ : ++ + +org $1E8A85 : RTS + +org $1E8955 : LDA 1,S : NOP +org $1E8973 : LDA 1,S : NOP +org $1E89AF : LDA 1,S : NOP +org $1E89D5 : LDA 1,S : NOP +org $1EB797 : LDA 1,S : NOP +org $1EB7D1 : LDA 1,S : NOP +org $1ED0A9 : LDA 1,S : NOP + +org $1ED122 : JMP ++ : ++ +org $1ED141 : JMP ++ : ++ + +;=================================================================================================== - org $0EFA50 - JSL RenderCharSetColorExtended - org $0EEE5D - JSL RenderCharSetColorExtended_init - org $0EF285 - JSL RenderCharSetColorExtended_close : NOP -endif ;-------------------------------------------------------------------------------- ; Back of tavern fixes ;-------------------------------------------------------------------------------- -org $028177 ; JSL Underworld_LoadCustomTileAttributes +org $828177 ; JSL Underworld_LoadCustomTileAttributes JSL TurnAroundOnUnderworld -org $02ABC1 ; JSL Link_HandleMovingAnimation_FullLongEntry +org $82ABC1 ; JSL Link_HandleMovingAnimation_FullLongEntry JSL TurnUpOnOverworld -org $02E297 ; LDA.w #$0002 : STA.b $2F +org $82E297 ; LDA.w #$0002 : STA.b $2F JSL WalkUpOnOverworld NOP -org $02E36F +org $82E36F JSL CheckStairsAdjustment NOP -org $02D7D2 ; BEQ .face_up +org $82D7D2 ; BEQ .face_up NOP #2 ; this fixes Link's direction after mirroring and falling after entering through back of tavern + +;-------------------------------------------------------------------------------- +; Enable new room header table +;-------------------------------------------------------------------------------- +org $81B5E6 +LDA.b #$30 diff --git a/hud.asm b/hud.asm index 06904ae..ed684d9 100644 --- a/hud.asm +++ b/hud.asm @@ -1,47 +1,47 @@ -;org $0DFE97 ; <- 6FE97 - headsup_display.asm:1009 (.hud_tilemap) +;org $8DFE97 ; <- 6FE97 - headsup_display.asm:1009 (.hud_tilemap) ; DO NOT EXCEED 0x150 HUD_TileMap: - dw $207F, $207F, $2850, $A856 - dw $2852, $285B, $285B, $285C - ;dw $207F, $3CA8, $207F, $207F, $207F + dw $207F, $207F, $2850, $A856 + dw $2852, $285B, $285B, $285C + ;dw $207F, $3CA8, $207F, $207F, $207F dw $207F, $3C02, $3C03, $207F, $207F ; normal mode ;dw $3C02, $3C03, $207F, $207F, $207F ; rupee arrows - dw $2C88, $2C89, $207F, $20A7 - dw $20A9, $207F, $2871 ;, $207F - dw $207F, $207F, $288B, $288F - dw $24AB, $24AC, $688F, $688B - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $2854, $2871 - dw $2858, $207F, $207F, $285D - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $2854, $304E - dw $2858, $207F, $207F, $285D - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $2854, $305E - dw $2859, $A85B, $A85B, $A85C - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $2854, $305E - dw $6854, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $207F, $207F - dw $207F, $207F, $A850, $2856 - dw $E850 + dw $2C88, $2C89, $207F, $20A7 + dw $20A9, $207F, $2871 ;, $207F + dw $207F, $207F, $288B, $288F + dw $24AB, $24AC, $688F, $688B + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $2854, $2871 + dw $2858, $207F, $207F, $285D + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $2854, $304E + dw $2858, $207F, $207F, $285D + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $2854, $305E + dw $2859, $A85B, $A85B, $A85C + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $2854, $305E + dw $6854, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $207F, $207F + dw $207F, $207F, $A850, $2856 + dw $E850 diff --git a/hudtext.asm b/hudtext.asm index ebebe9d..880cb4b 100644 --- a/hudtext.asm +++ b/hudtext.asm @@ -9,17 +9,17 @@ PHP ; $7EC026 = When we find an empty item get set on 1 ; $7EC027 = character data - LDX #$80 : STX $2100 + LDX.b #$80 : STX.w INIDISP REP #$20 - LDA #$6000+$0340 : STA $2116 + LDA.w #$6000+$0340 : STA.w VMADDL - LDA.w #$C027 : STA $4342 - LDX.b #$7E : STX $4344 - LDA #$0040 : STA $4345 - LDA #$1801 : STA $4340 - LDX #$10 : STX $420B + LDA.w #$C027 : STA.w A1T4L + LDX.b #$7E : STX.w A1B4 + LDA.w #$0040 : STA.w DAS4L + LDA.w #$1801 : STA.w DMAP4 + LDX.b #$10 : STX.w MDMAEN - LDX #$0F : STX $2100 + LDX.b #$0F : STX.w INIDISP PLP RTL } @@ -28,17 +28,17 @@ RTL ClearBG: { PHP - LDX #$80 : STX $2100 + LDX.b #$80 : STX.w INIDISP REP #$20 - LDA #$6000+$0340 : STA $2116 - LDA.w #clearTable : STA $4342 - LDX.b #clearTable>>16 : STX $4344 + LDA.w #$6000+$0340 : STA.w VMADDL + LDA.w #clearTable : STA.w A1T4L + LDX.b #clearTable>>16 : STX.w A1B4 - LDA #$0040 : STA $4345 - LDA #$1801 : STA $4340 - LDX #$10 : STX $420B + LDA.w #$0040 : STA.w DAS4L + LDA.w #$1801 : STA.w DMAP4 + LDX.b #$10 : STX.w MDMAEN - LDX #$0F : STX $2100 + LDX.b #$0F : STX.w INIDISP PLP RTL -} \ No newline at end of file +} diff --git a/icepalacegraphics.asm b/icepalacegraphics.asm index 22d5903..284b36d 100644 --- a/icepalacegraphics.asm +++ b/icepalacegraphics.asm @@ -3,8 +3,8 @@ ShouldOverrideFileLoad: CPY #$0A ; 0A = Ice/Mire floor file BNE .no - LDA $040C ; Dungeon number - CMP #$12 ; Ice Palace + LDA.w DungeonID ; Dungeon number + CMP.b #$12 ; Ice Palace BEQ .yes .no CLC : RTS @@ -13,9 +13,9 @@ ShouldOverrideFileLoad: BgGraphicsLoading: ; Instructions overwritten - STZ $00 - STX $01 - STA $02 + STZ.b Scrap00 + STX.b Scrap01 + STA.b Scrap02 JSR ShouldOverrideFileLoad BCS .useSpecialIcePalaceFile @@ -25,24 +25,22 @@ BgGraphicsLoading: ; We're loading the floor tiles in Ice Palace. Instead of the normal file, ; load another one that replaces the bridge tiles with the Bombos medallion - ;LDA $FFFFFF - LDA.b #IcePalaceFloorGfx>>16 - STA $02 + STA.b Scrap02 REP #$20 LDA.w #IcePalaceFloorGfx - STA $00 + STA.b Scrap00 LDX.b #64*2 ; Tiles to load * 2 - ; Unrolled loop to upload half a tile - LDA [$00] : STA $2118 : INC $00 : INC $00 - LDA [$00] : STA $2118 : INC $00 : INC $00 - LDA [$00] : STA $2118 : INC $00 : INC $00 - LDA [$00] : STA $2118 : INC $00 : INC $00 - LDA [$00] : STA $2118 : INC $00 : INC $00 - LDA [$00] : STA $2118 : INC $00 : INC $00 - LDA [$00] : STA $2118 : INC $00 : INC $00 - LDA [$00] : STA $2118 : INC $00 : INC $00 + LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 + LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 + LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 + LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 + LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 + LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 + LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 + LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00 DEX BNE - @@ -51,7 +49,7 @@ BgGraphicsLoading: ReloadingFloors: SEP #$30 ; 8 AXY - LDA $7EC2F8 ; Floor file that has been decompressed + LDA.l LastBGSet ; Floor file that has been decompressed TAY JSR ShouldOverrideFileLoad REP #$30 ; 16 AXY @@ -76,6 +74,6 @@ ReloadingFloors: ; Pretend that we ran the original routine LDX.w #$0800 LDA.w #$6600 - STA $03 + STA.b Scrap03 JML ReloadingFloorsCancel diff --git a/init.asm b/init.asm index 888986f..c1ce317 100644 --- a/init.asm +++ b/init.asm @@ -5,59 +5,59 @@ ; called and it only gets called once ever during RESET. ;-------------------------------------------------------------------------------- Init_Primary: - LDA #$00 - - LDX #$00 ; initalize our ram + LDA.b #$00 + LDX.b #$14 - - STA $7EC025, X - STA $7EC035, X - STA $7F5000, X - INX - CPX #$10 : !BLT - + LDA.l RomNameSRAM, X : CMP.w $FFC0, X : BNE .clear + DEX + BPL - + REP #$30 + LDX.w #$00D9 ; initalize our ram + - + STA.l $7EC025, X + DEX #2 + BPL - + LDA.w #$0000 + LDX.w #$2FFE + - + STA.l $7F5000, X + DEX #2 + BPL - - LDX #$10 ; initalize more ram - - - STA $7F5000, X - INX - CPX #$FF : !BLT - - - LDX #$00 - - - LDA RomNameSRAM, X : CMP $00FFC0, X : BNE .clear - INX - CPX #$15 : !BLT - BRA .done .clear - REP #$30 ; set 16-bit accumulator & index registers + REP #$30 LDA.w #$0000 + LDX.w #$1FFE - - STA $700000, X - INX - CPX #$2000 : !BLT - - SEP #$30 ; set 8-bit accumulator & index registers - LDX #$00 + STA.l CartridgeSRAM, X + STA.l SaveBackupSRAM, X + DEX #2 + BPL - + LDA.w RomVersion+$00 : STA.l RomVersionSRAM+$00 + LDA.w RomVersion+$02 : STA.l RomVersionSRAM+$02 + SEP #$30 + LDX.b #$14 - - LDA $00FFC0, X : STA RomNameSRAM, X - INX - CPX #$15 : !BLT - - LDX #$00 - - - LDA RomVersion, X : STA RomVersionSRAM, X - INX - CPX #$04 : !BLT - + LDA.w $FFC0, X : STA.l RomNameSRAM, X + DEX + BPL - .done REP #$20 - LDA.l OneMindTimer : STA.l !ONEMIND_TIMER - SEP #$20 + LDA.l OneMindTimerInit : STA.l OneMindTimerRAM + SEP #$30 - LDA.b #$01 : STA $420D ; enable fastrom access on upper banks - STA.l !ONEMIND_ID + LDA.l RomSpeed : STA.w MEMSEL ; enable fastrom access on upper banks + LDA.b #$01 : STA.l OneMindId - LDA.b #$10 : STA $BC ; set default player sprite bank - - LDA.b #$81 : STA $4200 ; thing we wrote over, turn on NMI & gamepad -RTL + LDA.b #$10 : STA.b PlayerSpriteBank ; set default player sprite bank + LDA.b #$81 : STA.w NMITIMEN ; thing we wrote over, turn on NMI & gamepad + LDA.b #(ReturnFromInit>>16)|$80 : PHA : PLB + +JML ReturnFromInit + + ;-------------------------------------------------------------------------------- ; Init_PostRAMClear ;-------------------------------------------------------------------------------- @@ -68,6 +68,37 @@ Init_PostRAMClear: JSL MSUInit JSL InitRNGPointerTable - JSL InitCompassTotalsRAM + JSL DecompressAllItemGraphics + JSR InitDungeonCounts -JML $00D463 ; The original target of the jump table that we hijacked +JML Tagalong_LoadGfx ; The original target of the jump table that we hijacked + +;=================================================================================================== +InitDungeonCounts: + PHB + LDX.b #$1E + REP #$20 + - + LDA.l CompassTotalsROM, X : STA.l CompassTotalsWRAM, X + DEX #2 + BPL - + SEP #$20 + LDX.b #$0F + - + LDA.l ChestKeys, X : STA.l MapTotalsWRAM, X + DEX + BPL - + + LDA.b #$7E + PHA : PLB + REP #$30 + LDA.l TotalItemCount + JSL HUDHex4Digit_Long + SEP #$20 + LDA.b Scrap04 : TAX : STX.w TotalItemCountTiles+$00 + LDA.b Scrap05 : TAX : STX.w TotalItemCountTiles+$02 + LDA.b Scrap06 : TAX : STX.w TotalItemCountTiles+$04 + LDA.b Scrap07 : TAX : STX.w TotalItemCountTiles+$06 + SEP #$10 + PLB +RTS diff --git a/initsramtable.asm b/initsramtable.asm index a93d0c1..908ee85 100644 --- a/initsramtable.asm +++ b/initsramtable.asm @@ -14,29 +14,30 @@ fillword $0000 ; Zero out the table fill $500 ; -org $30B000 ; PC 0x183000 +org $B0B000 ; PC 0x183000 +InitSRAMTable: InitRoomDataWRAM: -org $30B060 ; PC 0x183060 +org $B0B060 ; PC 0x183060 InitATAltarRoom: dw $0000 ; aga curtains -org $30B092 ; PC 0x183092 -InitSWBackEntryRoom: dw $0000 ; skull woods curtains (?) +org $B0B092 ; PC 0x183092 +InitSWBackEntryRoom: dw $0000 ; skull woods curtains -org $30B20C +org $B0B20C dw $F000, $F000 ; Pre-open kak bomb hut & brewery -org $30B280 ; PC 0x183280 - 0x1832FF +org $B0B280 ; PC 0x183280 - 0x1832FF InitOverworldEvents: -org $30B282 ; PC 0x183282 - Lumberjacks +org $B0B282 ; PC 0x183282 - Lumberjacks InitLumberjackOW: db $00 -org $30B29B ; PC 0x18329B - Open castle gate +org $B0B29B ; PC 0x18329B - Open castle gate InitHyruleCastleOW: db $20 -org $30B2DB ; PC 0x1832DB - Pyramid hole +org $B0B2DB ; PC 0x1832DB - Pyramid hole InitPyramidOW: db $00 -org $30B2C3 ; PC 0x1832C3 - GT +org $B0B2C3 ; PC 0x1832C3 - GT InitDDMWestOW: db $00 -org $30B340 ; PC 0x183340 +org $B0B340 ; PC 0x183340 StartingEquipment: StartingBow: skip 1 ; PC 0x183340 StartingBoomerang: skip 1 ; PC 0x183341 @@ -81,8 +82,8 @@ StartingHealth: db $18 ; PC 0x18336C StartingMaximumHealth: db $18 ; PC 0x18336D StartingMagic: skip 1 ; PC 0x18336E StartingSmallKeys: db $FF ; PC 0x18336F -StartingBombCapacityUpgrade: skip 1 ; PC 0x183370 -StartingArrowCapacityUpgrade: skip 1 ; PC 0x183371 +StartingBombCapacity: db $0A ; PC 0x183370 +StartingArrowCapacity: db $1E ; PC 0x183371 InitHeartsFiller: skip 1 ; PC 0x183372 InitMagicFiller: skip 1 ; PC 0x183373 StartingPendants: skip 1 ; PC 0x183374 @@ -128,13 +129,13 @@ InitDroppedFollowerIndoors: skip 1 ; PC 0x1833D1 InitDroppedFollowerLayer: skip 1 ; PC 0x1833D2 InitFollowerDropped: skip 1 ; PC 0x1833D3 -org $30B3D9 ; PC 0x1833D9 - 0x1833F0 +org $B0B3D9 ; PC 0x1833D9 - 0x1833F0 StaticFileName: ; The validity value ($55AA) must be written manually on SRAM init at $7003E1 -dw $0181, $0162, $0168, $018C -dw $0166, $014E, $0162, $018C -dw $0165, $0162, $0167, $018C +dw $0181, $0068, $006E, $018C +dw $0166, $0064, $0068, $018C +dw $0165, $0068, $006D, $018C -org $30B401 ; PC 0x183401 +org $B0B401 ; PC 0x183401 InitDeathCounter: dw $FFFF @@ -146,29 +147,29 @@ dw $FFFF ; excluding ~28 bytes (File name, validity value, and checksum.) ;-------------------------------------------------------------------------------- -org $30B414 ; PC 0x183414-0x183416 +org $B0B414 ; PC 0x183414-0x183416 InitMapOverlay: dw $0000 -org $30B417 ; PC 0x183417 +org $B0B417 ; PC 0x183417 InitHighestSword: db $00 -org $30B414 ; PC 0x183418-0x183419 +org $B0B414 ; PC 0x183418-0x183419 InitGoalCounter: dw $0000 -org $30B422 ; PC 0x183422 +org $B0B422 ; PC 0x183422 InitHighestShield: db $00 -org $30B428 ; PC 0x183428 +org $B0B428 ; PC 0x183428 InitMapsCompasses: db $00 -org $30B429 ; PC 0x183429 +org $B0B429 ; PC 0x183429 InitPendantCounter: db $00 -org $30B454 ; PC 0x183454-0x183457 +org $B0B454 ; PC 0x183454-0x183457 InitChallengeTimer: dw $0000, $0000 -org $30B46E ; PC 0x18346E +org $B0B46E ; PC 0x18346E InitHighestMail: db $00 -org $30B471 ; PC 0x183471 +org $B0B471 ; PC 0x183471 InitCrystalCounter: db $00 diff --git a/inventory.asm b/inventory.asm index fff30c6..5ed357a 100644 --- a/inventory.asm +++ b/inventory.asm @@ -1,116 +1,96 @@ ;================================================================================ ; Inventory Updates ;================================================================================ -; InventoryTracking -; brmpnskf ------oq -; b = blue boomerang | - -; r = red boomerang | - -; m = mushroom current | - -; p = magic powder | - -; n = mushroom past | - -; s = shovel | - -; k = fake flute | o = any bomb acquired from item location -; f = working flute | q = quickswap locked -;-------------------------------------------------------------------------------- -; BowTracking -; Item Tracking Slot #2 -; bsp----- -; b = bow -; s = silver arrow bow -; p = 2nd progressive bow -; - -; - -; - -; - -; - ;-------------------------------------------------------------------------------- ; ProcessMenuButtons: ; out: Carry - 0 = No Button, 1 = Yes Button ;-------------------------------------------------------------------------------- ProcessMenuButtons: - ;LDA #$FD : STA InventoryTracking ; DEBUG MODE - ;LDA $F6 : BIT #$20 : BNE .l_pressed ; check for P1 L-button - LDA $F4 : BIT #$40 : BNE .y_pressed ; check for P1 Y-button - BIT #$20 : BNE .sel_pressed ; check for P1 Select button - LDA $F0 : BIT #$20 : BNE .sel_held + LDA.b Joy1A_New : BIT.b #$40 : BNE .y_pressed ; check for P1 Y-button + BIT.b #$20 : BNE .sel_pressed ; check for P1 Select button + LDA.b Joy1A_All : BIT.b #$20 : BNE .sel_held .sel_unheld - LDA HudFlag : AND #$20 : BEQ + - LDA HudFlag : AND #$DF : STA HudFlag ; select is released, unset hud flag - LDA $1B : BEQ + ; skip if outdoors - LDA.b #$20 : STA $012F ; menu select sound + LDA.l HudFlag : AND.b #$60 : BEQ + + LDA.b #$00 : STA.l HudFlag + JSL MaybePlaySelectSFX + - JSL.l ResetEquipment + JSL ResetEquipment + .sel_held CLC ; no buttons RTL .sel_pressed - LDA HudFlag : ORA #$20 : STA HudFlag ; set hud flag - LDA.b #$20 : STA $012F ; menu select sound - JSL.l ResetEquipment + LDA.l HUDDungeonItems : BIT.b #$0C : BNE + + LDA.b #$40 + BRA .store_flag + + + LDA.b #$60 + .store_flag + STA.l HudFlag + JSL MaybePlaySelectSFX + JSL ResetEquipment RTL .y_pressed ; Note: used as entry point by quickswap code. Must preserve X. - LDA.b #$10 : STA $0207 - LDA $0202 ; check selected item - CMP #$02 : BNE + ; boomerang - LDA InventoryTracking : AND #$C0 : CMP #$C0 : BNE .errorJump ; make sure we have both boomerangs - LDA BoomerangEquipment : EOR #$03 : STA BoomerangEquipment ; swap blue & red boomerang - LDA.b #$20 : STA $012F ; menu select sound + LDA.b #$10 : STA.w MenuBlink + LDA.w ItemCursor ; check selected item + CMP.b #$02 : BNE + ; boomerang + LDA.l InventoryTracking : AND.b #$C0 : CMP.b #$C0 : BNE .errorJump ; make sure we have both boomerangs + LDA.l BoomerangEquipment : EOR.b #$03 : STA.l BoomerangEquipment ; swap blue & red boomerang + LDA.b #$20 : STA.w SFX3 ; menu select sound JMP .captured - + CMP #$01 : BNE + ; bow - LDA BowTracking : AND #$C0 : CMP #$C0 : BNE .errorJump ; make sure we have both bows + + CMP.b #$01 : BNE + ; bow + LDA.l BowTracking : AND.b #$C0 : CMP.b #$C0 : BNE .errorJump ; make sure we have both bows PHX : LDX.b #$00 ; scan ancilla table for arrows -- : CPX.b #$0A : !BGE ++ - LDA $0C4A, X : CMP.b #$09 : BNE +++ + LDA.w AncillaID, X : CMP.b #$09 : BNE +++ PLX : BRA .errorJump2 ; found an arrow, don't allow the swap +++ INX : BRA -- : ++ PLX LDA.l SilverArrowsUseRestriction : BEQ ++ - LDA $A0 : ORA $A1 : BEQ ++ ; not in ganon's room in restricted mode - LDA BowEquipment : CMP.b #$03 : !BLT .errorJump : !SUB #$02 : STA BowEquipment + LDA.b RoomIndex : ORA.b RoomIndex+1 : BEQ ++ ; not in ganon's room in restricted mode + LDA.l BowEquipment : CMP.b #$03 : !BLT .errorJump : !SUB #$02 : STA.l BowEquipment BRA .errorJump2 ++ - LDA BowEquipment : !SUB #$01 : EOR #$02 : !ADD #$01 : STA BowEquipment ; swap bows - LDA.b #$20 : STA $012F ; menu select sound + LDA.l BowEquipment : !SUB #$01 : EOR.b #$02 : !ADD #$01 : STA.l BowEquipment ; swap bows + LDA.b #$20 : STA.w SFX3 ; menu select sound JMP .captured + BRA + .errorJump BRA .errorJump2 - + CMP #$05 : BNE + ; powder - LDA InventoryTracking : AND #$30 : CMP #$30 : BNE .errorJump ; make sure we have mushroom & magic powder - LDA PowderEquipment : EOR #$03 : STA PowderEquipment ; swap mushroom & magic powder - LDA.b #$20 : STA $012F ; menu select sound + + CMP.b #$05 : BNE + ; powder + LDA.l InventoryTracking : AND.b #$30 : CMP.b #$30 : BNE .errorJump ; make sure we have mushroom & magic powder + LDA.l PowderEquipment : EOR.b #$03 : STA.l PowderEquipment ; swap mushroom & magic powder + LDA.b #$20 : STA.w SFX3 ; menu select sound JMP .captured + BRA + .errorJump2 BRA .error - + CMP #$0D : BNE + ; flute - LDA $037A : CMP #$01 : BEQ .midShovel ; inside a shovel animation, force the shovel & make error sound - LDA InventoryTracking : BIT #$04 : BEQ .error ; make sure we have shovel - AND #$03 : BEQ .error ; make sure we have one of the flutes - LDA FluteEquipment : CMP #01 : BNE .toShovel ; not shovel + + CMP.b #$0D : BNE + ; flute + LDA.w UseY2 : CMP.b #$01 : BEQ .midShovel ; inside a shovel animation, force the shovel & make error sound + LDA.l InventoryTracking : BIT.b #$04 : BEQ .error ; make sure we have shovel + AND.b #$03 : BEQ .error ; make sure we have one of the flutes + LDA.l FluteEquipment : CMP.b #01 : BNE .toShovel ; not shovel - LDA InventoryTracking : AND #$01 : BEQ .toFakeFlute ; check for real flute - LDA #$03 ; set real flute + LDA.l InventoryTracking : AND.b #$01 : BEQ .toFakeFlute ; check for real flute + LDA.b #$03 ; set real flute BRA .fluteSuccess .toFakeFlute - LDA #$02 ; set fake flute + LDA.b #$02 ; set fake flute BRA .fluteSuccess .toShovel - LDA #$01 ; set shovel + LDA.b #$01 ; set shovel .fluteSuccess - STA FluteEquipment ; store set item - LDA.b #$20 : STA $012F ; menu select sound + STA.l FluteEquipment ; store set item + LDA.b #$20 : STA.w SFX3 ; menu select sound BRA .captured + - CMP #$10 : BNE .error : JSL.l ProcessBottleMenu : BRA .captured : + + CMP.b #$10 : BNE .error : JSL ProcessBottleMenu : BRA .captured : + CLC RTL .midShovel - ; LDA #$01 : STA FluteEquipment ; set shovel .error - LDA.b #$3C : STA $012E ; error sound + LDA.b #$3C : STA.w SFX2 ; error sound .captured SEC RTL @@ -120,621 +100,282 @@ RTL ;ProcessBottleMenu: ;-------------------------------------------------------------------------------- ProcessBottleMenu: -; LDA $F6 : AND #$30 : CMP.b #$30 : BEQ .double_shoulder_pressed -; LDA $F4 : AND #$40 : BEQ .y_not_pressed ; skip if Y is not down -; .double_shoulder_pressed - LDA BottleIndex ; check bottle state + LDA.l BottleIndex ; check bottle state BEQ .no_bottles ; skip if we have no bottles PHX - INC : CMP #$05 : !BLT + : LDA #$01 : + ;increment and wrap 1-4 - TAX : LDA BottleContents-1, X ; check bottle - BNE + : LDX #$01 : + ; wrap if we reached the last bottle - TXA : STA BottleIndex ; set bottle index - LDA.b #$20 : STA $012F ; menu select sound + INC : CMP.b #$05 : !BLT + : LDA.b #$01 : + ;increment and wrap 1-4 + TAX : LDA.l BottleContents-1, X ; check bottle + BNE + : LDX.b #$01 : + ; wrap if we reached the last bottle + TXA : STA.l BottleIndex ; set bottle index + LDA.b #$20 : STA.w SFX3 ; menu select sound PLX .no_bottles - LDA #$00 ; pretend like the controller state was 0 from the overridden load + LDA.b #$00 ; pretend like the controller state was 0 from the overridden load RTL -; .y_not_pressed -; LDA $F4 : AND.b #$0C ; thing we wrote over - load controller state -;RTL -;-------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------- ;OpenBottleMenu: ;-------------------------------------------------------------------------------- OpenBottleMenu: - LDA $F6 : AND #$40 : BEQ .x_not_pressed ; skip if X is not down - LDA.b #$10 : STA $0207 ; set 16 frame cool off - LDA.b #$20 : STA $012F ; make menu sound - LDA.b #$07 : STA $0200 ; thing we wrote over - opens bottle menu + LDA.b Joy1B_New : AND.b #$40 : BEQ .x_not_pressed ; skip if X is not down + LDA.b #$10 : STA.w MenuBlink ; set 16 frame cool off + LDA.b #$20 : STA.w SFX3 ; make menu sound + LDA.b #$07 : STA.w SubModuleInterface ; thing we wrote over - opens bottle menu .x_not_pressed RTL -;-------------------------------------------------------------------------------- - ;-------------------------------------------------------------------------------- ;CloseBottleMenu: ;-------------------------------------------------------------------------------- CloseBottleMenu: - LDA $F6 : AND #$40 : BEQ .x_not_pressed ; skip if X is not down + LDA.b Joy1B_New : AND.b #$40 : BEQ .x_not_pressed ; skip if X is not down + LDA.b #$10 : STA.w MenuBlink ; set 16 frame cool off + LDA.b #$20 : STA.w SFX3 ; make menu sound - LDA.b #$10 : STA $0207 ; set 16 frame cool off - LDA.b #$20 : STA $012F ; make menu sound - - INC $0200 ; return to normal menu - STZ $0205 - - LDA #$00 + INC.w SubModuleInterface ; return to normal menu + STZ.w BottleMenuCounter + LDA.b #$00 RTL - .x_not_pressed - LDA $F4 : AND.b #$0C ; thing we wrote over (probably) + .x_not_pressed + LDA.b Joy1A_New : AND.b #$0C ; thing we wrote over (probably) RTL -;-------------------------------------------------------------------------------- - ;-------------------------------------------------------------------------------- ; AddInventory: ;-------------------------------------------------------------------------------- -macro TopHalf(address) - LDA
: !ADD #$10 : STA
-endmacro - -macro BottomHalf(address) - PHA : PHX - LDA
: INC : AND #$0F : TAX - LDA
: AND #$F0 : STA
- TXA : ORA
: STA
- PLX : PLA -endmacro -;-------------------------------------------------------------------------------- -;FullInventoryExternal: -; LDA StatsLocked : BEQ + : RTL : + -; PHA : PHX : PHP : JMP AddInventory_fullItemCounts -;-------------------------------------------------------------------------------- -FullInventoryExternal: - LDA StatsLocked : BEQ + : RTL : + - PHA : PHX : PHP : JMP AddInventory_incrementCounts -;-------------------------------------------------------------------------------- AddInventory: - PHA : PHX : PHP - - LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ + - BRL .incrementCounts - + - - CPY.b #$0C : BNE + ; Blue Boomerang - LDA InventoryTracking : ORA #$80 : STA InventoryTracking - JMP .incrementCounts - + CPY.b #$2A : BNE + ; Red Boomerang - LDA InventoryTracking : ORA #$40 : STA InventoryTracking - JMP .incrementCounts - + CPY.b #$29 : BNE + ; Mushroom - LDA InventoryTracking : ORA #$28 : STA InventoryTracking - JMP .incrementCounts - + CPY.b #$0D : BNE + ; Magic Powder - LDA InventoryTracking : ORA #$10 : STA InventoryTracking - JMP .incrementCounts - + CPY.b #$13 : BNE + ; Shovel - LDA InventoryTracking : ORA #$04 : STA InventoryTracking - JMP .incrementCounts - + CPY.b #$14 : BNE + ; Flute (Inactive) - LDA InventoryTracking : ORA #$02 : STA InventoryTracking - JMP .incrementCounts - + CPY.b #$4A : BNE + ; Flute (Active) - LDA InventoryTracking : ORA #$01 : STA InventoryTracking - JMP .incrementCounts - + CPY.b #$0B : BNE + ; Bow - LDA ArrowMode : BNE +++ - LDA BowTracking : ORA #$80 : STA BowTracking - +++ - JMP .incrementCounts - + CPY.b #$3A : BNE + ; Bow & Arrows - LDA BowTracking : ORA #$80 : STA BowTracking - JMP .incrementCounts - + CPY.b #$3B : BNE + ; Bow & Silver Arrows - LDA BowTracking : ORA #$40 : STA BowTracking - LDA ArrowMode : BNE +++ - LDA BowTracking : ORA #$80 : STA BowTracking ; activate wood arrows when not in rupee bow - +++ - JMP .incrementCounts - + CPY.b #$43 : BNE + ; Single arrow - LDA ArrowMode : BEQ +++ - LDA BowTracking : ORA #$80 : STA BowTracking ; activate wood arrows in quick-swap - +++ - JMP .incrementCounts - + CPY.b #$58 : BNE + ; Upgrade-Only Silver Arrows - LDA BowTracking : ORA #$40 : STA BowTracking - + - - .incrementCounts - LDA StatsLocked : BEQ + : JMP .done : + - - LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ + - BRL .dungeonCounts - + - - - ; don't count any of this stuff - CPY.b #$20 : BNE + : JMP .itemCounts : + ; Crystal - CPY.b #$26 : BNE + : JMP .itemCounts : + ; Heart Piece Completion Heart - LDA.l !SHOP_ENABLE_COUNT : BNE ++ - CPY.b #$2E : BNE + : JMP .itemCounts : + ; Red Potion (Refill) - CPY.b #$2F : BNE + : JMP .itemCounts : + ; Green Potion (Refill) - CPY.b #$30 : BNE + : JMP .itemCounts : + ; Blue Potion (Refill) - ++ - CPY.b #$37 : BNE + : JMP .itemCounts : + ; Pendant - CPY.b #$38 : BNE + : JMP .itemCounts : + ; Pendant - CPY.b #$39 : BNE + : JMP .itemCounts : + ; Pendant - - CPY.b #$04 : !BLT .isSword ; Swords - Skip Shop/Fairy Check for Swords - CPY.b #$49 : BEQ .isSword - CPY.b #$50 : BEQ .isSword - CPY.b #$5E : BEQ .isSword - BRA + - .isSword - JMP .dungeonCounts - + - CPY.b #$3B : BNE + : JMP .dungeonCounts : + ; Silver Arrow Bow - Skip Shop/Fairy Check for Silver Arrow Bow - - LDA $1B : BNE + : JMP .dungeonCounts : + ; skip shop check if outdoors - LDA $02E9 : CMP.b #$01 : BEQ ++ ; skip shop check for chests - PHP : REP #$20 ; set 16-bit accumulator - LDA $048E - CMP.w #274 : BNE + : JMP .shop : + ; dark world death mountain shop, ornamental shield shop - CMP.w #271 : BNE + : JMP .shop : + ; villiage of outcasts shop, lumberjack shop, lake hylia shop, dark world magic shop - CMP.w #272 : BNE + : JMP .shop : + ; red shield shop - CMP.w #284 : BNE + : JMP .shop : + ; bomb shop - CMP.w #265 : BNE + : JMP .shop : + ; potion shop - commented this out because it's easier to just block potion refills because this one interferes with the powder item being counted - CMP.w #287 : BNE + : LDA.b $A9 : CMP.w #$0201 : BNE + ; kakariko shop - JMP .shop : + LDA.b $A0 - CMP.w #255 : BNE + : LDA.b $A9 : BNE + ; light world death mountain shop - JMP .shop : + LDA.b $A0 - CMP.w #276 : BNE + : LDA.b $A9 : CMP.w #$0200 : BNE + ; waterfall fairy - JMP .shop : + LDA.b $A0 - CMP.w #277 : BNE + : JMP .shop : + ; upgrade fairy (shop) - CMP.w #278 : BNE + : JMP .shop : + ; pyramid fairy - PLP : BRA ++ - .shop - PLP - LDA.l !SHOP_ENABLE_COUNT : BNE ++ - JMP .done - ++ - - .dungeonCounts - - LDA !MULTIWORLD_RECEIVING_ITEM : CMP #$01 : BNE + - JMP .fullItemCounts - + - - LDA $1B : BNE + : JMP .fullItemCounts : + - SEP #$20 ; Set 8-bit Accumulator - - LDA $040C ; get dungeon id - BNE + - INC #2 ; treat sewers as HC - + CMP #$FF : BEQ .fullItemCounts - - CMP.l BallNChainDungeon : BNE + - CPY.b #$32 : BNE + - JMP .done - + LSR : TAX : LDA DungeonLocationsChecked, X : INC : STA DungeonLocationsChecked, X - CPX.b #$0D : BNE + - LDA BigKeyField : AND #$04 : BNE ++ - JSR .incrementGTowerPreBigKey - ++ - + - ; == END INDOOR-ONLY SECTION - .fullItemCounts - - LDA !MULTIWORLD_RECEIVING_ITEM : CMP #$01 : BEQ ++ - LDA BootsEquipment : BNE + ; Check for Boots - REP #$20 - LDA PreBootsLocations : INC : STA PreBootsLocations ; Increment Pre Boots Counter - SEP #$20 - + - - LDA MirrorEquipment : BNE + ; Check for Mirror - REP #$20 - LDA PreMirrorLocations : INC : STA PreMirrorLocations ; Increment Pre Mirror Counter - SEP #$20 - + - LDA FluteEquipment : BNE + ; Check for Flute - REP #$20 - LDA PreFluteLocations : INC : STA PreFluteLocations ; Increment Pre Flute Counter - SEP #$20 - + - REP #$20 - LDA TotalItemCounter : INC : STA TotalItemCounter ; Increment Item Total - SEP #$20 - ++ - - .itemCounts - - LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ + - BRL .done - + - - CPY.b #$00 : BNE + ; Fighter's Sword & Fighter's Shield - LDX #$01 - JSR .incrementSword - JSR .incrementShield - JMP .done - + CPY.b #$01 : BNE + ; Master Sword - LDX #$02 - JSR .incrementSword - JMP .done - + CPY.b #$02 : BNE + ; Tempered Sword - LDX #$03 - JSR .incrementSword - JMP .done - + CPY.b #$03 : BNE + ; Golden Sword - LDX #$04 - JSR .incrementSword - JMP .done - + CPY.b #$04 : BNE + ; Fighter's Shield - LDX #$01 - JSR .incrementShield - JMP .done - + CPY.b #$05 : BNE + ; Red Shield - LDX #$02 - JSR .incrementShield - JMP .done - + CPY.b #$06 : BNE + ; Mirror Shield - LDX #$03 - JSR .incrementShield - JMP .done - + CPY.b #$07 : !BLT + ; Items $07 - $0D - CPY.b #$0E : !BGE + - JSR .incrementY - JMP .done - + CPY.b #$14 : BNE + ; Flute (Inactive) - LEAVE THIS ABOVE THE 0F-16 CONDITION - kkat - JSR .stampFlute - JSR .incrementY - JMP .done - + CPY.b #$0F : !BLT + ; Items $0F - $16 - CPY.b #$17 : !BGE + - JSR .incrementY - JMP .done - + CPY.b #$17 : BNE + ; Heart Piece - JSR .incrementHeartPiece - JMP .done - + CPY.b #$18 : !BLT + ; Items $18 - $19 - CPY.b #$1A : !BGE + - JSR .incrementY - JMP .done - + CPY.b #$1A : BNE + ; Magic Mirror - JSR .stampMirror - JSR .incrementY - JMP .done - + CPY.b #$1D : BNE + ; Book of Mudora - LEAVE THIS ABOVE THE 1B-1F CONDITION - kkat - JSR .incrementY - JMP .done - + CPY.b #$1B : !BLT + ; Items $1B - $1F - CPY.b #$20 : !BGE + - JSR .incrementA - JMP .done - + CPY.b #$20 : BNE + ; Crystal - JSR .incrementCrystal - JSR .setDungeonCompletion - JMP .done - + CPY.b #$21 : BNE + ; Bug Net - JSR .incrementY - JMP .done - + CPY.b #$22 : BNE + ; Blue Mail - LDX #$01 - JSR .incrementMail - + CPY.b #$23 : BNE + ; Red Mail - LDX #$02 - JSR .incrementMail - + CPY.b #$24 : BNE + ; Small Key - JSR .incrementKey - JMP .done - + CPY.b #$25 : BNE + ; Compass - JSL MaybeFlagCompassTotalPickup - JSR .incrementCompass - JMP .done - + CPY.b #$26 : BNE + ; Liar Heart (Container) - ;JSR .incrementHeartContainer - JMP .done - + CPY.b #$27 : BNE + ; 1 Bomb - JSR .maybeIncrementBombs - JMP .done - + CPY.b #$28 : BNE + ; 3 Bombs - JSR .maybeIncrementBombs - JMP .done - + CPY.b #$29 : BNE + ; Mushroom - JSR .incrementY - JMP .done - + CPY.b #$2A : !BLT + ; Items $2A - $2D - CPY.b #$2E : !BGE + - JSR .incrementY - JMP .done - + CPY.b #$31 : BNE + ; 10 Bombs - JSR .maybeIncrementBombs - JMP .done - + CPY.b #$32 : BNE + ; Big Key - JSR .incrementBigKey - JMP .done - + CPY.b #$33 : BNE + ; Map - JSR .incrementMap - JMP .done - + CPY.b #$37 : !BLT + ; Items $37 - $39 - Pendants - CPY.b #$3A : !BGE + - JSR .incrementPendant - JSR .setDungeonCompletion - JMP .done - + CPY.b #$3A : !BLT + ; Items $3A - $3B - Bow & Silver Arrows - CPY.b #$3C : !BGE + - JSR .incrementBow - JMP .done - + CPY.b #$3C : BNE + ; Bottle w/Bee - JSR .incrementY - JMP .done - + CPY.b #$3D : BNE + ; Bottle w/Fairy - JSR .incrementY - JMP .done - + CPY.b #$3E : !BLT + ; Items $3E - $3F - Heart Containers - CPY.b #$40 : !BGE + - JSR .incrementHeartContainer - JMP .done - + CPY.b #$48 : BNE + ; Bottle w/Gold Bee - JSR .incrementY - JMP .done - + CPY.b #$49 : BNE + ; Fighter's Sword - LDX #$01 - JSR .incrementSword - JMP .done - + CPY.b #$4A : BNE + ; Flute (Active) - JSR .stampFlute - JSR .incrementY - JMP .done - + CPY.b #$4B : BNE + ; Pegasus Boots - JSR .stampBoots - JSR .incrementA - JMP .done - + CPY.b #$4C : BNE + ; 50 Bomb Capacity Upgrade - JSR .incrementCapacity - JSR .maybeIncrementBombs - JMP .done - + CPY.b #$4D : !BLT + ; Items $4D - $4F - Capacity Upgrades - CPY.b #$50 : !BGE + - JSR .incrementCapacity - JMP .done - + CPY.b #$50 : BNE + ; Master Sword (Safe) - LDX #$02 - JSR .incrementSword - JMP .done - + CPY.b #$51 : BNE + ; 5 Bomb Capacity Upgrade - LDX #$02 - JSR .maybeIncrementBombs - JMP .done - + CPY.b #$52 : BNE + ; 10 Bomb Capacity Upgrade - LDX #$02 - JSR .maybeIncrementBombs - JMP .done - + CPY.b #$51 : !BLT + ; Items $51 - $54 - Capacity Upgrades - CPY.b #$55 : !BGE + - JSR .incrementCapacity - JMP .done - + CPY.b #$58 : BNE + ; Upgrade-Only Silver Arrows - JSR .incrementBow - JMP .done - + CPY.b #$5E : BNE + ; Progressive Sword - LDA SwordEquipment : INC : TAX - JSR .incrementSword - JMP .done - + CPY.b #$5F : BNE + ; Progressive Shield - LDA ShieldEquipment : INC : TAX - JSR .incrementShield - JMP .done - + CPY.b #$60 : BNE + ; Progressive Armor - LDA ArmorEquipment : INC : TAX - JSR .incrementMail - JMP .done - + CPY.b #$61 : BNE + ; Progressive Lifting Glove - JSR .incrementA - JMP .done - + CPY.b #$64 : !BLT + ; Items $64 & $65 - Progressive Bow - CPY.b #$66 : !BGE + - JSR .incrementBow - JMP .done - + CPY.b #$70 : !BLT + ; Items $70 - $7F - Free Maps - CPY.b #$80 : !BGE + - JSR .incrementMap - JMP .done - + CPY.b #$80 : !BLT + ; Items $80 - $8F - Free Compasses - ; there was a bug for all loot ID's >$7F - LDA.w AddReceivedItemExpanded_item_target_addr+$100, X : STA.b $00 - LDA.w AddReceivedItemExpanded_item_target_addr+$101, X : STA.b $01 - CPY.b #$90 : !BGE + - JSL MaybeFlagCompassTotalPickup - JSR .incrementCompass - JMP .done - + CPY.b #$90 : !BLT + ; Items $90 - $9F - Free Big Keys - CPY.b #$A0 : !BGE + - JSR .incrementBigKey - JMP .done - + CPY.b #$A0 : !BLT + ; Items $A0 - $AF - Free Small Keys - CPY.b #$B0 : !BGE + - JSR .incrementKey - JMP .done - + +; In: Y - Receipt ID +; Uses $0B-$0D for long absolute addressing + PHA : PHX : PHY : PHP : PHB + PHK : PLB + LDA.b #$7E : STA.b Scrap0D + LDA.l StatsLocked : BNE .done + LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .countDungeonChecks + REP #$30 + TYA : AND.w #$00FF : ASL : TAX + SEP #$20 + LDA.w InventoryTable_properties,X : BIT.b #$01 : BEQ .done + JSR ShopCheck : BCS .done + .countDungeonChecks + JSR DungeonIncrement : BCS .done + LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .totalCount + JSR IncrementByOne + JSR StampItem + SEP #$20 + JSR IncrementYAItems + .totalCount + LDA.l !MULTIWORLD_RECEIVING_ITEM : BNE .done + REP #$30 + LDA.l TotalItemCounter : INC : TAY + LDA.l BootsEquipment : AND.w #$00FF : BNE + + TYA : STA.l PreBootsLocations + + + LDA.l MirrorEquipment : AND.w #$00FF : BNE + + TYA : STA.l PreMirrorLocations + + + LDA.l FluteEquipment : AND.w #$00FF : BNE + + TYA : STA.l PreFluteLocations + + + TYA + STA.l TotalItemCounter .done - PLP : PLX : PLA -RTL -; WHICH BEE IS BOTTLED? -; MAKE SURE FAIRY FOUNTAINS DON'T FUCK THE COUNTS UP - -.stampSword - REP #$20 ; set 16-bit accumulator - LDA SwordTime : BNE + - LDA SwordTime+2 : BNE + - LDA NMIFrames : STA SwordTime - LDA NMIFrames+2 : STA SwordTime+2 - + - SEP #$20 ; set 8-bit accumulator -RTS - -.stampBoots - REP #$20 ; set 16-bit accumulator - LDA BootsTime : BNE + - LDA BootsTime+2 : BNE + - LDA NMIFrames : STA BootsTime - LDA NMIFrames+2 : STA BootsTime+2 - + - SEP #$20 ; set 8-bit accumulator -RTS - -.stampFlute - REP #$20 ; set 16-bit accumulator - LDA FluteTime : BNE + - LDA FluteTime+2 : BNE + - LDA NMIFrames : STA FluteTime - LDA NMIFrames+2 : STA FluteTime+2 - + - SEP #$20 ; set 8-bit accumulator -RTS - -.stampMirror - REP #$20 ; set 16-bit accumulator - LDA MirrorTime : BNE + - LDA MirrorTime+2 : BNE + - LDA NMIFrames : STA MirrorTime - LDA NMIFrames+2 : STA MirrorTime+2 - + - SEP #$20 ; set 8-bit accumulator -RTS - -.incrementSword - JSR .stampSword - LDA HighestSword - INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better sword - TXA : STA HighestSword - + -RTS - -.incrementShield - LDA HighestShield - INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better shield - TXA : STA HighestShield - + -RTS - -.incrementBow - LDA BowEquipment : BNE .dontCount ; Don't increment Y item count for extra bows -.incrementY - LDA YAItemCounter : !ADD #$08 : STA YAItemCounter -.dontCount -RTS - -.incrementA - LDA YAItemCounter : INC : AND #$07 : TAX - LDA YAItemCounter : AND #$F8 : STA YAItemCounter - TXA : ORA YAItemCounter : STA YAItemCounter -RTS - -.incrementPendant - LDA PendantCounter : INC : STA PendantCounter -RTS - -.incrementCapacity - LDA CapacityUpgrades : INC : STA CapacityUpgrades -RTS - -.incrementHeartPiece - LDA HeartPieceCounter : INC : STA HeartPieceCounter -RTS - -.incrementHeartContainer - LDA HeartContainerCounter : INC : STA HeartContainerCounter -RTS - -.incrementCrystal - LDA CrystalCounter : INC : STA CrystalCounter -RTS - -.incrementMail - - LDA HighestMail - INC : STA $04 : CPX $04 : !BLT + ; don't increment unless we're getting a better mail - TXA : STA HighestMail - + -RTS - -.incrementKeyLong - JSR .incrementKey + SEP #$30 + PLB : PLP : PLY : PLX : PLA RTL -.incrementKey - LDA SmallKeyCounter : INC : STA SmallKeyCounter +ShopCheck: +; In: X - Receipt ID << 1 +; TODO: If we write all shops, we can use the ShopPurchase flag instead of this + PHX + LDA.b IndoorsFlag : BEQ .count + LDA.w ItemReceiptMethod : CMP.b #$01 : BEQ .count + LDA.l ShopEnableCount : BNE .count + LDA.w InventoryTable_properties,X : BIT.b #$02 : BNE .count + REP #$20 + LDA.b RoomIndex + CMP.w #274 : BEQ .nocount ; dark world death mountain shop, ornamental shield shop + CMP.w #271 : BEQ .nocount ; villiage of outcasts shop, lumberjack shop, lake hylia shop, dark world magic shop + CMP.w #272 : BEQ .nocount ; red shield shop + CMP.w #284 : BEQ .nocount ; bomb shop + CMP.w #265 : BEQ .nocount ; potion shop - powder is flagged as "ShopEnableCount" in CollectPowder + ; these room contain pots so you must check the quadrant as well for pottery lottery + CMP.w #287 : BNE + : LDA.b LinkQuadrantH : CMP.w #$0201 : BEQ .nocount ; kakariko shop + LDA.b RoomIndex + + CMP.w #255 : BNE + : LDA.b LinkQuadrantH : BEQ .nocount ; light world death mountain shop + LDA.b RoomIndex + + CMP.w #276 : BNE + : LDA.b LinkQuadrantH : CMP.w #$0200 : BEQ .nocount ; waterfall fairy + LDA.b RoomIndex + + CMP.w #277 : BEQ .nocount ; upgrade fairy (shop) + CMP.w #278 : BEQ .nocount ; pyramid fairy + SEP #$20 + .count + CLC + PLX +RTS + .nocount + SEP #$21 + PLX RTS -.incrementCompass - %BottomHalf(MapsCompasses) +DungeonIncrement: +; In: X - Receipt ID << 1 + REP #$10 + PHX + LDA.w InventoryTable_properties,X : BIT.b #$40 : BEQ + + JSL CountChestKeyLong + + + LDA.l !MULTIWORLD_RECEIVING_ITEM : BNE .done + SEP #$10 + LDA.b IndoorsFlag : BEQ .done + LDA.w DungeonID : BMI .done + CMP.l BallNChainDungeon : BNE + + CPY.b #$32 : BEQ .ballchain_bigkey + + + CMP.b #$00 : BNE + + INC #2 + + TAX : REP #$20 : LDA.l DungeonLocationsChecked, X : INC : STA.l DungeonLocationsChecked, X : SEP #$20 + CPX.b #$0D : BNE + + LDA.l BigKeyField : BIT.b #$04 : BNE ++ + LDA.l PreGTBKLocations : INC : STA.l PreGTBKLocations + ++ + + + .done + REP #$11 + PLX +RTS + .ballchain_bigkey + REP #$10 + PLX + SEC RTS -.incrementBigKey - %TopHalf(BigKeysBigChests) +StampItem: + REP #$30 + LDA.w InventoryTable_stamp,X : BEQ .skip + STA.b Scrap0B + LDA.b [Scrap0B] : BNE .skip + INC.b Scrap0B : INC.b Scrap0B + LDA.b [Scrap0B] : BNE .skip + DEC.b Scrap0B : DEC.b Scrap0B + LDA.l NMIFrames : STA.b [Scrap0B] + INC.b Scrap0B : INC.b Scrap0B + LDA.l NMIFrames+2 : STA.b [Scrap0B] + .skip + SEP #$20 RTS -.incrementGTowerPreBigKey - LDA PreGTBKLocations : INC : STA PreGTBKLocations +IncrementYAItems: + PHX + LDA.w InventoryTable_properties,X + BIT.b #$10 : BNE .bomb_check + BIT.b #$20 : BNE .bow_check + BIT.b #$04 : BEQ .not_y + .y_item + LDA.l YAItemCounter : !ADD #$08 : STA.l YAItemCounter + BRA .done + .not_y + BIT.b #$08 : BEQ .done + .a_item + LDA.l YAItemCounter : INC : AND.b #$07 : TAX + LDA.l YAItemCounter : AND.b #$F8 : STA.l YAItemCounter + TXA : ORA.l YAItemCounter : STA.l YAItemCounter + .done + PLX +RTS + .bow_check + LDA.l BowEquipment : BNE + + BRA .y_item + .bomb_check + LDA.l InventoryTracking+1 : BIT.b #$02 : BNE + + ORA.b #$02 : STA.l InventoryTracking+1 + BRA .y_item + + + PLX RTS -.maybeIncrementBombs - LDA InventoryTracking+1 : AND #$02 : BNE + - LDA InventoryTracking+1 : ORA #$02 : STA InventoryTracking+1 - JSR .incrementY - + +IncrementByOne: + PHX + REP #$20 + LDA.w InventoryTable_stat,X : BEQ .skip + STA.b Scrap0B + SEP #$21 + LDA.b #$00 : ADC.b [Scrap0B] : STA.b [Scrap0B] + .skip + SEP #$20 + PLX RTS -.incrementMap - %TopHalf(MapsCompasses) -RTS +IncrementBossSword: + PHX + LDA.l StatsLocked : BNE .done + LDA.l SwordEquipment : CMP.b #$FF : BNE + + BRA .none + + + ASL : TAX + JMP.w (.vectors,X) -.incrementBossSwordLong - JSR .incrementBossSword -RTL + .vectors + dw .none + dw .fighter + dw .master + dw .tempered + dw .golden -.incrementBossSword - LDA SwordEquipment - BNE + : - - LDA SwordlessBossKills : INC : STA SwordlessBossKills - RTS - + CMP #$FF : BEQ - - + CMP #$01 : BNE + - %TopHalf(SwordBossKills) : RTS - + CMP #$02 : BNE + - %BottomHalf(SwordBossKills) : RTS - + CMP #$03 : BNE + - %TopHalf(SwordBossKills+1) : RTS - + CMP #$04 : BNE + - %BottomHalf(SwordBossKills+1) - + -RTS - -.setDungeonCompletion - LDX $040C : BMI + - REP #$20 ; 16 bit - LDA.l DungeonMask, X - ORA DungeonsCompleted : STA DungeonsCompleted - SEP #$20 ; 8 bit - + -RTS -;-------------------------------------------------------------------------------- + .none + LDA.l SwordlessBossKills : INC : STA.l SwordlessBossKills + .done + PLX + RTL + .fighter + LDA.l SwordBossKills + CLC : ADC.b #$10 + STA.l SwordBossKills + PLX + RTL + .master + LDA.l SwordBossKills : INC : AND.b #$0F : TAX + LDA.l SwordBossKills : AND.b #$F0 : STA.l SwordBossKills + TXA : ORA.l SwordBossKills : STA.l SwordBossKills + PLX + RTL + .tempered + LDA.l SwordBossKills+1 + CLC : ADC.b #$10 + STA.l SwordBossKills+1 + PLX + RTL + .golden + LDA.l SwordBossKills+1 : INC : AND.b #$0F : TAX + LDA.l SwordBossKills+1 : AND.b #$F0 : STA.l SwordBossKills+1 + TXA : ORA.l SwordBossKills+1 : STA.l SwordBossKills+1 + PLX + RTL ;-------------------------------------------------------------------------------- -; Link_ReceiveItem_HUDRefresh: +IncrementFinalSword: + PHX + REP #$20 + LDA.b RoomIndex : BNE .done + SEP #$20 + LDA.l SwordEquipment : CMP.b #$FF : BNE + + BRA IncrementBossSword_none + + + ASL : TAX + JMP.w (IncrementBossSword_vectors,X) + .done + SEP #$20 + PLX +RTL ;-------------------------------------------------------------------------------- Link_ReceiveItem_HUDRefresh: - LDA BombsEquipment : BNE + ; skip if we have bombs - LDA BombCapacityUpgrades : !ADD.l StartingMaxBombs : BEQ + ; skip if we can't have bombs - LDA BombsFiller : BEQ + ; skip if we are filling no bombs - DEC : STA BombsFiller ; decrease bomb fill count - LDA.b #$01 : STA BombsEquipment ; increase actual bomb count + LDA.l BombsEquipment : BNE + ; skip if we have bombs + LDA.l BombCapacity : BEQ + ; skip if we can't have bombs + LDA.l BombsFiller : BEQ + ; skip if we are filling no bombs + DEC : STA.l BombsFiller ; decrease bomb fill count + LDA.b #$01 : STA.l BombsEquipment ; increase actual bomb count + - JSL.l HUD_RefreshIconLong ; thing we wrote over - JSL.l PostItemGet + JSL HUD_RefreshIconLong ; thing we wrote over + INC.w UpdateHUDFlag + JSL PostItemGet RTL ;-------------------------------------------------------------------------------- @@ -742,12 +383,13 @@ RTL ; HandleBombAbsorbtion: ;-------------------------------------------------------------------------------- HandleBombAbsorbtion: - STA BombsFiller ; thing we wrote over - LDA $0303 : BNE + ; skip if we already have some item selected - LDA BombCapacityUpgrades : !ADD.l StartingMaxBombs : BEQ + ; skip if we can't have bombs - LDA.b #$04 : STA $0202 ; set selected item to bombs - LDA.b #$01 : STA $0303 ; set selected item to bombs - JSL.l HUD_RebuildLong + STA.l BombsFiller ; thing we wrote over + LDA.w CurrentYItem : BNE + ; skip if we already have some item selected + LDA.l BombCapacity : BEQ + ; skip if we can't have bombs + LDA.b #$04 : STA.w ItemCursor ; set selected item to bombs + LDA.b #$01 : STA.w CurrentYItem ; set selected item to bombs + JSL HUD_RebuildLong + INC.w UpdateHUDFlag + RTL ;-------------------------------------------------------------------------------- @@ -755,17 +397,16 @@ RTL ;-------------------------------------------------------------------------------- ; AddYMarker: ;-------------------------------------------------------------------------------- -;!JAR_STATUS = "$7F5030"; AddYMarker: - LDA $0202 : AND.w #$FF ; load item value + LDA.w ItemCursor : AND.w #$FF ; load item value CMP.w #$02 : BNE + ; boomerang - LDA InventoryTracking : AND.w #$C0 : CMP.w #$C0 : BEQ .drawYBubble : BRA .drawNormal + LDA.l InventoryTracking : AND.w #$C0 : CMP.w #$C0 : BEQ .drawYBubble : BRA .drawNormal + CMP.w #$01 : BNE + ; bow - LDA BowTracking : AND.w #$C0 : CMP.w #$C0 : BEQ .drawYBubble : BRA .drawNormal + LDA.l BowTracking : AND.w #$C0 : CMP.w #$C0 : BEQ .drawYBubble : BRA .drawNormal + CMP.w #$05 : BNE + ; powder - LDA InventoryTracking : AND.w #$30 : CMP.w #$30 : BEQ .drawYBubble : BRA .drawNormal + LDA.l InventoryTracking : AND.w #$30 : CMP.w #$30 : BEQ .drawYBubble : BRA .drawNormal + CMP.w #$0D : BNE + ; flute - LDA InventoryTracking : BIT.w #$04 : BEQ .drawNormal ; make sure we have shovel + LDA.l InventoryTracking : BIT.w #$04 : BEQ .drawNormal ; make sure we have shovel AND.w #$03 : BNE .drawYBubble ; make sure we have one of the flutes BRA .drawNormal + CMP.w #$10 : BEQ .drawJarMarker @@ -775,8 +416,7 @@ AddYMarker: BRA .drawTile .drawJarMarker - ;SEP #$20 : LDA !JAR_STATUS : INC : AND.b #$01 : STA !JAR_STATUS : REP #$20 : BEQ .drawXBubble - LDA $0207 : AND.w #$0020 : BNE .drawXBubble + LDA.w MenuBlink : AND.w #$0020 : BNE .drawXBubble .drawYBubble LDA.w #$3D4F @@ -787,7 +427,7 @@ AddYMarker: LDA.w #$2D3E .drawTile - STA $FFC4, Y + STA.w $FFC4, Y RTL ;-------------------------------------------------------------------------------- @@ -796,22 +436,22 @@ RTL ; this is horrible, make it better ;-------------------------------------------------------------------------------- MakeCircleBlue: - LDA $FFC0, Y : AND.w #$EFFF : STA $FFC0, Y - LDA $FFC2, Y : AND.w #$EFFF : STA $FFC2, Y + LDA.w $FFC0, Y : AND.w #$EFFF : STA.w $FFC0, Y + LDA.w $FFC2, Y : AND.w #$EFFF : STA.w $FFC2, Y - LDA $FFFE, Y : AND.w #$EFFF : STA $FFFE, Y - LDA $0004, Y : AND.w #$EFFF : STA $0004, Y + LDA.w $FFFE, Y : AND.w #$EFFF : STA.w $FFFE, Y + LDA.w $0004, Y : AND.w #$EFFF : STA.w $0004, Y - LDA $003E, Y : AND.w #$EFFF : STA $003E, Y - LDA $0044, Y : AND.w #$EFFF : STA $0044, Y + LDA.w $003E, Y : AND.w #$EFFF : STA.w $003E, Y + LDA.w $0044, Y : AND.w #$EFFF : STA.w $0044, Y - LDA $0080, Y : AND.w #$EFFF : STA $0080, Y - LDA $0082, Y : AND.w #$EFFF : STA $0082, Y + LDA.w $0080, Y : AND.w #$EFFF : STA.w $0080, Y + LDA.w $0082, Y : AND.w #$EFFF : STA.w $0082, Y - LDA $FFBE, Y : AND.w #$EFFF : STA $FFBE, Y - LDA $FFC4, Y : AND.w #$EFFF : STA $FFC4, Y - LDA $0084, Y : AND.w #$EFFF : STA $0084, Y - LDA $007E, Y : AND.w #$EFFF : STA $007E, Y + LDA.w $FFBE, Y : AND.w #$EFFF : STA.w $FFBE, Y + LDA.w $FFC4, Y : AND.w #$EFFF : STA.w $FFC4, Y + LDA.w $0084, Y : AND.w #$EFFF : STA.w $0084, Y + LDA.w $007E, Y : AND.w #$EFFF : STA.w $007E, Y RTS ;-------------------------------------------------------------------------------- @@ -819,8 +459,8 @@ RTS ; UpgradeFlute: ;-------------------------------------------------------------------------------- UpgradeFlute: - LDA InventoryTracking : AND #$FC : ORA #$01 : STA InventoryTracking ; switch to the working flute - LDA.b #$03 : STA FluteEquipment ; upgrade primary inventory + LDA.l InventoryTracking : AND.b #$FC : ORA.b #$01 : STA.l InventoryTracking ; switch to the working flute + LDA.b #$03 : STA.l FluteEquipment ; upgrade primary inventory RTL ;-------------------------------------------------------------------------------- @@ -845,7 +485,7 @@ RTL ;-------------------------------------------------------------------------------- CheckKeys: LDA.l GenericKeys : BEQ + : RTL : + - LDA $040C : CMP.b #$FF + LDA.w DungeonID : CMP.b #$FF RTL ;-------------------------------------------------------------------------------- @@ -853,8 +493,8 @@ RTL ; DrawKeyIcon: ;-------------------------------------------------------------------------------- DrawKeyIcon: - LDA $04 : AND.w #$00FF : CMP.w #$0090 : BNE + : LDA.w #$007F : + : ORA.w #$2400 : STA $7EC764 - LDA $05 : AND.w #$00FF : ORA.w #$2400 : STA $7EC766 + LDA.b Scrap04 : AND.w #$00FF : CMP.w #$0090 : BNE + : LDA.w #$007F : + : ORA.w #$2400 : STA.l HUDKeyDigits + LDA.b Scrap05 : AND.w #$00FF : ORA.w #$2400 : STA.l HUDTileMapBuffer+$66 RTL ;-------------------------------------------------------------------------------- @@ -863,10 +503,10 @@ RTL ;-------------------------------------------------------------------------------- LoadKeys: LDA.l GenericKeys : BEQ + - LDA CurrentGenericKeys + LDA.l CurrentGenericKeys RTL + - LDA DungeonKeys, X + LDA.l DungeonKeys, X RTL ;-------------------------------------------------------------------------------- @@ -874,12 +514,18 @@ RTL ; SaveKeys: ;-------------------------------------------------------------------------------- SaveKeys: - PHA - LDA.l GenericKeys : BEQ + - PLA : STA CurrentGenericKeys - RTL - + - PLA : STA DungeonKeys, X + PHA + LDA.l GenericKeys : BEQ + + PLA : STA.l CurrentGenericKeys + RTL + + + PLA : STA.l DungeonKeys, X + CPX.b #$00 : BNE + + STA.l HyruleCastleKeys ; copy HC to sewers + + + CPX.b #$01 : BNE + + STA.l SewerKeys ; copy sewers to HC + + RTL ;-------------------------------------------------------------------------------- @@ -889,57 +535,23 @@ RTL ClearOWKeys: PHA - JSL.l TurtleRockEntranceFix - JSL.l FakeWorldFix - JSR.w FixBunnyOnExitToLightWorld + JSL TurtleRockEntranceFix + JSL FakeWorldFix + JSL FixBunnyOnExitToLightWorld LDA.l GenericKeys : BEQ + - PLA : LDA CurrentGenericKeys : STA CurrentSmallKeys + PLA : LDA.l CurrentGenericKeys : STA.l CurrentSmallKeys RTL + - PLA : STA CurrentSmallKeys + PLA : STA.l CurrentSmallKeys RTL ;-------------------------------------------------------------------------------- -;-------------------------------------------------------------------------------- -; GetWitchLootOAMTableIndex -; in: A - Loot ID -; out: A - Loot OAM Table Index -; check if this is even still referenced anywhere -;-------------------------------------------------------------------------------- -;GetWitchLootOAMTableIndex: -; PHX -; PHB : PHK : PLB -; ;-------- -; TAX : LDA .gfxSlots, X ; look up item gfx -; PLB : PLX -;RTL -; -;;DATA - Loot Identifier to Sprite ID -;{ -; .gfxSlots -; db $FF, $FF, $FF, $FF, $05, $06, $FF, $0C -; db $0B, $0D, $0A, $07, $13, $0E, $FF, $FF -; -; db $FF, $FF, $FF, $FF, $FF, $09, $FF, $FF -; db $08, $FF, $FF, $10, $11, $12, $FF, $FF -; -; db $FF, $FF, $03, $04, $FF, $FF, $02, $FF -; db $FF, $FF, $14, $15, $17, $16, $15, $17 -; -; db $16, $0F, $FF, $FF, $FF, $FF, $FF, $FF -; db $FF, $FF, $FF, $FF, $FF, $FF, $02, $02 -; -; db $FF, $FF, $FF, $FF, $01, $FF, $FF, $FF -; db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF -;} -;-------------------------------------------------------------------------------- - ;-------------------------------------------------------------------------------- ; PrepItemScreenBigKey: ;-------------------------------------------------------------------------------- PrepItemScreenBigKey: - STZ $02 - STZ $03 + STZ.b Scrap02 + STZ.b Scrap03 REP #$30 ; thing we wrote over - set 16-bit accumulator RTL ;-------------------------------------------------------------------------------- @@ -948,15 +560,14 @@ RTL ; LoadPowder: ;-------------------------------------------------------------------------------- LoadPowder: - JSL.l Sprite_SpawnDynamically ; thing we wrote over - LDA.l WitchItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID - %GetPossiblyEncryptedItem(WitchItem, SpriteItemValues) - STA $0DA0, Y ; Store item type - LDA.b #$01 : STA.w !SPRITE_REDRAW, Y - LDA #$00 - STA $7F505F - STA $7F5060 - STA $7F5061 + JSL Sprite_SpawnDynamically ; thing we wrote over + LDA.l WitchItem_Player : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID + %GetPossiblyEncryptedItem(WitchItem, SpriteItemValues) + JSL AttemptItemSubstitution + JSL ResolveLootIDLong + STA.w SpriteID, Y + STA.l PowderFlag + LDA.b #$01 : STA.w SprRedrawFlag, Y RTL ;-------------------------------------------------------------------------------- @@ -964,10 +575,10 @@ RTL ; InitializeBottles: ;-------------------------------------------------------------------------------- InitializeBottles: - STA BottleContents, X ; thing we wrote over + STA.l BottleContents, X ; thing we wrote over PHA - LDA BottleIndex : BNE + - TXA : INC : STA BottleIndex ; write bottle index to menu properly + LDA.l BottleIndex : BNE + + TXA : INC : STA.l BottleIndex ; write bottle index to menu properly + PLA RTL @@ -977,15 +588,16 @@ RTL ; DrawPowder: ;-------------------------------------------------------------------------------- DrawPowder: - LDA $02DA : BNE .defer ; defer if link is buying a potion - LDA.w !SPRITE_REDRAW, X : BEQ + + ;LDA.w ItemReceiptPose : BNE .defer ; defer if link is buying a potion + LDA.w SprRedrawFlag, X : BEQ + LDA.l WitchItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID - LDA $0DA0, X ; Retrieve stored item type - JML RequestSlottedTile + LDA.w SpriteID, X ; Retrieve stored item type + JML RequestStandingItemVRAMSlot + ; this fights with the shopkeep code, so had to move the powder draw there when potion shop is custom - LDA $0DA0, X ; Retrieve stored item type - JML DrawSlottedTile + ; LDA.l ShopType : CMP.b #$FF : BNE .defer + LDA.w SpriteID, X ; Retrieve stored item type + JML DrawPotItem .defer RTL ;-------------------------------------------------------------------------------- @@ -994,14 +606,17 @@ RTL ; LoadMushroom: ;-------------------------------------------------------------------------------- LoadMushroom: - LDA.b #$00 : STA $0DC0, X ; thing we wrote over + LDA.b #$00 : STA.w SpriteGFXControl, X ; thing we wrote over .justGFX + PHA LDA.l MushroomItem_Player : STA !MULTIWORLD_SPRITEITEM_PLAYER_ID %GetPossiblyEncryptedItem(MushroomItem, SpriteItemValues) - STA $0E80, X ; Store item type - JSL.l RequestSlottedTile + JSL AttemptItemSubstitution + JSR ResolveLootID + STA.w SpriteID,X + JSL RequestStandingItemVRAMSlot .skip PLA @@ -1013,14 +628,14 @@ RTL ;-------------------------------------------------------------------------------- DrawMushroom: PHA : PHY - LDA.w !SPRITE_REDRAW, X : BEQ .skipInit ; skip init if already ready - JSL.l LoadMushroom_justGFX - LDA.w !SPRITE_REDRAW, X : CMP.b #$02 : BEQ .skipInit + LDA.w SprRedrawFlag, X : BEQ .skipInit ; skip init if already ready + JSL LoadMushroom_justGFX + LDA.w SprRedrawFlag, X : CMP.b #$02 : BEQ .skipInit BRA .done ; don't draw on the init frame .skipInit - LDA $0E80, X ; Retrieve stored item type - JSL.l DrawSlottedTile + LDA.w SpriteID, X ; Retrieve stored item type + JSL DrawPotItem .done PLY : PLA @@ -1031,20 +646,18 @@ RTL ; CollectPowder: ;-------------------------------------------------------------------------------- CollectPowder: - LDY $0DA0, X ; Retrieve stored item type - BNE + - ; if for any reason the item value is 0 reload it, just in case - %GetPossiblyEncryptedItem(WitchItem, SpriteItemValues) : TAY - + - PHA - LDA WitchItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID - LDA.b #$01 : STA.l !SHOP_ENABLE_COUNT - PLA - STZ $02E9 ; item from NPC - JSL.l Link_ReceiveItem - PHA : LDA.b #$00 : STA.l !SHOP_ENABLE_COUNT : PLA - ;JSL.l FullInventoryExternal - JSL.l ItemSet_Powder + LDY.w SpriteID, X ; Retrieve stored item type + BNE + + ; if for any reason the item value is 0 reload it, just in case + %GetPossiblyEncryptedItem(WitchItem, SpriteItemValues) : TAY + + PHA + LDA WitchItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID + LDA.b #$01 : STA.l ShopEnableCount + PLA + STZ.w ItemReceiptMethod ; item from NPC + JSL Link_ReceiveItem + PHA : LDA.b #$00 : STA.l ShopEnableCount : STA.l PowderFlag : PLA + JSL ItemSet_Powder RTL ;-------------------------------------------------------------------------------- @@ -1052,12 +665,12 @@ RTL ; RemoveMushroom: ;-------------------------------------------------------------------------------- RemoveMushroom: - LDA InventoryTracking : AND #$DF : STA InventoryTracking ; remove the mushroom - AND #$10 : BEQ .empty ; check if we have powder - LDA.b #$02 : STA PowderEquipment ; give powder if we have it + LDA.l InventoryTracking : AND.b #$DF : STA.l InventoryTracking ; remove the mushroom + AND.b #$10 : BEQ .empty ; check if we have powder + LDA.b #$02 : STA.l PowderEquipment ; give powder if we have it RTL .empty - LDA.b #$00 : STA PowderEquipment ; clear the inventory slot if we don't have powder + LDA.b #$00 : STA.l PowderEquipment ; clear the inventory slot if we don't have powder RTL ;-------------------------------------------------------------------------------- @@ -1065,37 +678,26 @@ RTL ; DrawMagicHeader: ;-------------------------------------------------------------------------------- DrawMagicHeader: - LDA MagicConsumption : AND.w #$00FF : CMP.w #$0002 : BEQ .quarterMagic + LDA.l MagicConsumption : AND.w #$00FF : CMP.w #$0002 : BEQ .quarterMagic .halfMagic - LDA.w #$28F7 : STA $7EC704 - LDA.w #$2851 : STA $7EC706 - LDA.w #$28FA : STA $7EC708 + LDA.w #$28F7 : STA.l HUDTileMapBuffer+$04 + LDA.w #$2851 : STA.l HUDTileMapBuffer+$06 + LDA.w #$28FA : STA.l HUDTileMapBuffer+$08 RTL .quarterMagic - LDA.w #$28F7 : STA $7EC704 - LDA.w #$2800 : STA $7EC706 - LDA.w #$2801 : STA $7EC708 + LDA.w #$28F7 : STA.l HUDTileMapBuffer+$04 + LDA.w #$2800 : STA.l HUDTileMapBuffer+$06 + LDA.w #$2801 : STA.l HUDTileMapBuffer+$08 RTL ;-------------------------------------------------------------------------------- -;-------------------------------------------------------------------------------- -; FixShovelLock: -;-------------------------------------------------------------------------------- -;FixShovelLock: -; LDA $037A : CMP #$01 : BEQ + ; skip if link is shoveling -; LDA FluteEquipment ; load shovel/flute item ID -; + -; CMP #$00 -;RTL -;-------------------------------------------------------------------------------- - ;-------------------------------------------------------------------------------- ; SpawnShovelGamePrizeSFX: ;-------------------------------------------------------------------------------- SpawnShovelGamePrizeSFX: - STA $7FFE00 ; thing we wrote over + STA.l MiniGameTime ; thing we wrote over PHA - LDA.b #$1B : STA $012F ; play puzzle sound + LDA.b #$1B : STA.w SFX3 ; play puzzle sound PLA RTL ;-------------------------------------------------------------------------------- @@ -1105,11 +707,11 @@ RTL ;-------------------------------------------------------------------------------- SpawnChestGamePrizeSFX: CPX.b #$07 : BNE .normal - LDA $A0 : CMP.b #$06 : BNE .normal + LDA.b RoomIndex : CMP.b #$06 : BNE .normal .prize - LDA.b #$1B : STA $012F : RTL ; play puzzle sound + LDA.b #$1B : STA.w SFX3 : RTL ; play puzzle sound .normal - LDA.b #$0E : STA $012F ; play chest sound + LDA.b #$0E : STA.w SFX3 ; play chest sound RTL ;-------------------------------------------------------------------------------- @@ -1118,27 +720,27 @@ RTL ;-------------------------------------------------------------------------------- SpawnShovelGamePrize: JSL Sprite_SpawnDynamically ; thing we wrote over - LDA.b #$01 : STA.w !SPRITE_REDRAW, Y + LDA.b #$01 : STA.w SprRedrawFlag, Y RTL ;-------------------------------------------------------------------------------- SpawnShovelItem: - LDA $03FC : BEQ + + LDA.w YButtonOverride : BEQ + JSL DiggingGameGuy_AttemptPrizeSpawn JMP .skip + - LDA $035B : AND.b #$01 : BNE + : JMP .skip : + ; corner dig fix + LDA.w TileActDig : AND.b #$01 : BNE + : JMP .skip : + ; corner dig fix PHY : PHP PHB : PHK : PLB SEP #$30 ; set 8-bit accumulator and index registers - LDA $1B : BEQ + : JMP .no_drop : + ; skip if indoors + LDA.b IndoorsFlag : BEQ + : JMP .no_drop : + ; skip if indoors - LDA $8A : CMP #$2A : BEQ .no_drop ; don't drop in the haunted grove - CMP #$68 : BEQ .no_drop ; don't drop in the digging game area + LDA.b OverworldIndex : CMP.b #$2A : BEQ .no_drop ; don't drop in the haunted grove + CMP.b #$68 : BEQ .no_drop ; don't drop in the digging game area - JSL GetRandomInt : BIT #$03 : BNE .no_drop ; drop with 1/4 chance + JSL GetRandomInt : BIT.b #$03 : BNE .no_drop ; drop with 1/4 chance LSR #2 : TAX ; clobber lower 2 bis - we have 64 slots now @@ -1146,27 +748,27 @@ SpawnShovelItem: ;most of this part below is copied from the digging game - STA $7FFE00 + STA.l MiniGameTime JSL Sprite_SpawnDynamically LDX.b #$00 - LDA $2F : CMP.b #$04 : BEQ + : INX : + + LDA.b LinkDirection : CMP.b #$04 : BEQ + : INX : + - LDA.l .x_speeds, X : STA $0D50, Y + LDA.l .x_speeds, X : STA.w SpriteVelocityX, Y - LDA.b #$00 : STA $0D40, Y - LDA.b #$18 : STA $0F80, Y - LDA.b #$FF : STA $0B58, Y - LDA.b #$30 : STA $0F10, Y + LDA.b #$00 : STA.w SpriteVelocityY, Y + LDA.b #$18 : STA.w SpriteVelocityZ, Y + LDA.b #$FF : STA.w EnemyStunTimer, Y + LDA.b #$30 : STA.w SpriteTimerE, Y - LDA $22 : !ADD.l .x_offsets, X - AND.b #$F0 : STA $0D10, Y - LDA $23 : ADC.b #$00 : STA $0D30, Y + LDA.b LinkPosX : !ADD.l .x_offsets, X + AND.b #$F0 : STA.w SpritePosXLow, Y + LDA.b LinkPosX+1 : ADC.b #$00 : STA.w SpritePosXHigh, Y - LDA $20 : !ADD.b #$16 : AND.b #$F0 : STA $0D00, Y - LDA $21 : ADC.b #$00 : STA $0D20, Y + LDA.b LinkPosY : !ADD.b #$16 : AND.b #$F0 : STA.w SpritePosYLow, Y + LDA.b LinkPosY+1 : ADC.b #$00 : STA.w SpritePosYHigh, Y - LDA.b #$00 : STA $0F20, Y + LDA.b #$00 : STA.w SpriteLayer, Y TYX LDA.b #$30 : JSL Sound_SetSfx3PanLong @@ -1190,21 +792,33 @@ RTL } ;-------------------------------------------------------------------------------- +MaybePlaySelectSFX: + LDA.w DungeonID : BMI .not_dungeon + .play + LDA.b #$20 : STA.w SFX3 ; menu select sound + RTL + .not_dungeon + LDA.l HUDDungeonItems : BIT.b #$13 : BEQ .dont_play + BIT.b #$0C : BEQ .dont_play + BRA .play + .dont_play +RTL +;-------------------------------------------------------------------------------- ; A = item id being collected ItemGetAlternateSFX: PEA.w $C567 ; SNES to RTS to in bank 08 -LDA.w $0C5E,X : CMP.b #$4A : BNE + +LDA.w AncillaGet,X : CMP.b #$4A : BNE + ; collecting pre-activated flute - LDA.b #$13 : JML $088007 + LDA.b #$13 : JML Ancilla_SFX2_Near + ; normal itemget sfx -LDA.b #$0F : JML $08800E ; what we wrote over +LDA.b #$0F : JML Ancilla_SFX3_Near ; what we wrote over ; A = item id being collected ItemGetOverworldAlternateSFX: -CMP.b #$4A : BNE + - JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$13 : STA.w $012E +CPY.b #$4A : BNE + + JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$13 : STA.w SFX2 RTL + ; normal itemget sfx -JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$0F : STA.w $012F ; what we wrote over +JSL Sound_SetSfxPanWithPlayerCoords : ORA.b #$0F : STA.w SFX3 ; what we wrote over RTL ;-------------------------------------------------------------------------------- diff --git a/inverted.asm b/inverted.asm index dec7e99..b970fe4 100644 --- a/inverted.asm +++ b/inverted.asm @@ -3,7 +3,7 @@ ; Does tile modification for... the pyramid of power hole ; after Ganon slams into it in bat form? Overworld_CreatePyramidHoleModified: - PHX : LDX $8A : LDA.l OWTileMapAlt, X : PLX : AND.b #$01 : BNE + + PHX : LDX.b OverworldIndex : LDA.l OWTileMapAlt, X : PLX : AND.b #$01 : BNE + JMP .originalBehaviour + .invertedBehavior @@ -35,7 +35,7 @@ Overworld_CreatePyramidHoleModified: JSL C9DE_LONG JSL C9DE_LONG - LDA.w #$FFFF : STA $1012, Y + LDA.w #$FFFF : STA.w GFXStripes+$12, Y JMP .ending .originalBehaviour @@ -64,33 +64,33 @@ Overworld_CreatePyramidHoleModified: JSL C9DE_LONG JSL C9DE_LONG - LDA.w #$FFFF : STA $1012, Y + LDA.w #$FFFF : STA.w GFXStripes+$12, Y .ending - LDA.w #$3515 : STA $012D + LDA.w #$3515 : STA.w SFX1 SEP #$30 - LDA OverworldEventDataWRAM+$5B : ORA.b #$20 : STA OverworldEventDataWRAM+$5B + LDA.l OverworldEventDataWRAM+$5B : ORA.b #$20 : STA.l OverworldEventDataWRAM+$5B - LDA.b #$03 : STA $012F + LDA.b #$03 : STA.w SFX3 - LDA.b #$01 : STA $14 + LDA.b #$01 : STA.b NMISTRIPES RTL ;------------------------------------------------------------------------------ Draw_PyramidOverlay: - PHX : LDA $8A : AND.w #$00FF : TAX : LDA.l OWTileMapAlt, X : PLX : AND.w #$0001 : BNE .done + PHX : LDA.b OverworldIndex : AND.w #$00FF : TAX : LDA.l OWTileMapAlt, X : PLX : AND.w #$0001 : BNE .done .normal - LDA.w #$0E39 : STA $23BC - INC A : STA $23BE - INC A : STA $23C0 - INC A : STA $243C - INC A : STA $243E - INC A : STA $2440 - INC A : STA $24BC - INC A : STA $24BE - INC A : STA $24C0 + LDA.w #$0E39 : STA.w $23BC + INC A : STA.w $23BE + INC A : STA.w $23C0 + INC A : STA.w $243C + INC A : STA.w $243E + INC A : STA.w $2440 + INC A : STA.w $24BC + INC A : STA.w $24BE + INC A : STA.w $24C0 .done RTL ;------------------------------------------------------------------------------ @@ -130,65 +130,65 @@ db $02, $02, $02, $00, $08, $02, $02, $00, $00, $00, $00, $01, $00, $00, $20, $0 db $02, $02, $02, $02, $02, $02, $02, $00, $00, $01, $01, $01, $02, $00, $08, $00 Electric_Barrier: - LDA SwapAgaGanonsTower : BEQ .done - LDA OverworldEventDataWRAM, X : ORA #$40 : STA OverworldEventDataWRAM, X ;set barrier dead + LDA.l SwapAgaGanonsTower : BEQ .done + LDA.l OverworldEventDataWRAM, X : ORA.b #$40 : STA.l OverworldEventDataWRAM, X ;set barrier dead .done - LDA OverworldEventDataWRAM, X ; what we wrote over + LDA.l OverworldEventDataWRAM, X ; what we wrote over RTL GanonTowerAnimation: - LDA SwapAgaGanonsTower : BEQ .done - LDA.b #$1B : STA $012F - STZ $04C6 - STZ $B0 - STZ $0710 - STZ $02E4 - - STZ $0FC1 - - STZ $011A - STZ $011B - STZ $011C - STZ $011D + LDA.l SwapAgaGanonsTower : BEQ .done + LDA.b #$1B : STA.w SFX3 + STZ.w OWEntranceCutscene + STZ.b SubSubModule + STZ.w SkipOAM + STZ.w CutsceneFlag + + STZ.w FreezeSprites + + STZ.w BG1ShakeV + STZ.w BG1ShakeV+1 + STZ.w BG1ShakeH + STZ.w BG1ShakeH+1 PHX - JSL Overworld_DetermineMusic : STX !REG_MUSIC_CONTROL_REQUEST + JSL Overworld_DetermineMusic : STX.w MusicControlRequest PLX - LDA.b #$09 : STA $012D - RTL - .done - LDA.b #$05 : STA $04C6 ;what we wrote over - STZ $B0 ; (continued) - STZ $C8 ; (continued) + LDA.b #$09 : STA.w SFX1 + RTL + + .done + LDA.b #$05 : STA.w OWEntranceCutscene ; what we wrote over + STZ.b SubSubModule ; (continued) + STZ.b ScrapBufferBD+$0B ; (continued) RTL GanonTowerInvertedCheck: { - LDA SwapAgaGanonsTower : BEQ .done - LDA #$01 ; Load a random value so it doesn't BEQ + LDA.l SwapAgaGanonsTower : BEQ .done + LDA.b #$01 ; Load a random value so it doesn't BEQ RTL .done - LDA $8A : CMP.b #$43 ;what we wrote over + LDA.b OverworldIndex : CMP.b #$43 ;what we wrote over RTL } ;Hard coded rock removed in LW for Inverted mode HardcodedRocks: - - LDA $8A : AND.w #$00FF : TAX : LDA.l OWTileMapAlt, X : AND.w #$0001 : BEQ .normalrocks + LDA.b OverworldIndex : AND.w #$00FF : TAX : LDA.l OWTileMapAlt, X : AND.w #$0001 : BEQ .normalrocks BRA .noRock2 .normalrocks - LDA.w #$020F : LDX $8A : CPX.w #$0033 : BNE .noRock - STA $7E22A8 + LDA.w #$020F : CPX.w #$0033 : BNE .noRock + STA.l $7E22A8 .noRock CPX.w #$002F : BNE .noRock2 - STA $7E2BB2 + STA.l $7E2BB2 .noRock2 RTL TurtleRockPegSolved: - PHX : LDA $8A : AND.w #$00FF : TAX : LDA.l OWTileMapAlt, X : PLX : AND.w #$0001 : BNE + + PHX : LDA.b OverworldIndex : AND.w #$00FF : TAX : LDA.l OWTileMapAlt, X : PLX : AND.w #$0001 : BNE + LDA.l OverworldEventDataWRAM+07 ; What we wrote over (reading flags for this screen) RTL + @@ -196,50 +196,52 @@ TurtleRockPegSolved: RTL MirrorBonk: - ; must preserve X/Y, and must preserve $00-$0F - PHX : LDX $8A : LDA.l OWTileMapAlt, X : PLX : AND.b #$01 : BEQ .normal + ; must preserve X/Y, and must preserve $00-$0F + PHX : LDX.b OverworldIndex : LDA.l OWTileMapAlt, X : PLX : AND.b #$01 : BEQ .normal ; Goal: use $20 and $22 to decide to force a bonk - ; if we want to bonk branch to .forceBonk - ; otherwise fall through to .normal - PHX : PHP - PHB : PHK : PLB - LDX $8A : LDA.l OWTileWorldAssoc, X - TAX : LDA.l InvertedMode : BEQ + - TXA : EOR #$40 : TAX - + TXA : BNE .endLoop ;World we're in? branch if we are in LW we don't want bonks - REP #$30 - LDX #$0000 - .loop - LDA.l .bonkRectanglesTable, X ;Load X1 - CMP $22 : !BGE ++ - ;IF X > X1 - LDA.l .bonkRectanglesTable+2, X ; Load X2 - CMP $22 : !BLT ++ - ;IF X < X2 - LDA.l .bonkRectanglesTable+4, X ;Load Y1 - CMP $20 : !BGE ++ - ;IF Y > Y1 - LDA.l .bonkRectanglesTable+6, X ; Load Y2 - CMP $20 : !BLT ++ - ;IF Y < Y2 - ;Bonk Here - PLB : PLP : PLX - BRA .forceBonk - ++ - TXA : !ADD #$0008 : CMP #.tableEnd-.bonkRectanglesTable : BEQ .endLoop - TAX - BRA .loop - .endbonkRectanglesTable + ; if we want to bonk branch to .forceBonk + ; otherwise fall through to .normal + PHX : PHP + PHB : PHK : PLB + LDX.b OverworldIndex : LDA.l OWTileWorldAssoc, X + TAX : LDA.l InvertedMode : BEQ + + TXA : EOR.b #$40 : TAX + + TXA : BNE .endLoop ;World we're in? branch if we are in LW we don't want bonks + REP #$30 + LDX.w #$0000 + + .loop + LDA.l .bonkRectanglesTable, X ;Load X1 + CMP.b LinkPosX : !BGE ++ + ;IF X > X1 + LDA.l .bonkRectanglesTable+2, X ; Load X2 + CMP.b LinkPosX : !BLT ++ + ;IF X < X2 + LDA.l .bonkRectanglesTable+4, X ;Load Y1 + CMP.b LinkPosY : !BGE ++ + ;IF Y > Y1 + LDA.l .bonkRectanglesTable+6, X ; Load Y2 + CMP.b LinkPosY : !BLT ++ + ;IF Y < Y2 + ;Bonk Here + PLB : PLP : PLX + BRA .forceBonk + ++ + TXA : !ADD #$0008 : CMP.w #.tableEnd-.bonkRectanglesTable : BEQ .endLoop + TAX + BRA .loop + .endbonkRectanglesTable + + .endLoop + PLB : PLP : PLX - .endLoop - PLB : PLP : PLX .normal - ;Not forcing a bonk, so the vanilla bonk detection run. - LDA $0C : ORA $0E -JML.l MirrorBonk_NormalReturn +;Not forcing a bonk, so the vanilla bonk detection run. +LDA.b Scrap0C : ORA.b Scrap0E +JML MirrorBonk_NormalReturn .forceBonk -JML.l MirrorBonk_BranchGamma +JML MirrorBonk_BranchGamma .bonkRectanglesTable ;X1 X2 Y1 Y2 diff --git a/invertedmaps.asm b/invertedmaps.asm index 348e228..ecbef3b 100644 --- a/invertedmaps.asm +++ b/invertedmaps.asm @@ -1,867 +1,1494 @@ +;=================================================================================================== + +OWWriteSize = $00 +OWWriteIncrement = $02 +OWWriteTile = $06 +OWWriteCommand = $08 + +OWSkipLookup = $00 +OWSkipFlags = $03 + +;--------------------------------------------------------------------------------------------------- + +function OWW_RLESize(s) = s<<8 + +!OWW_STOP = $8000 +!OWW_END = $FFFF + +!OWW_SKIP = $FFFF + +!OWW_Vertical = $0080 +!OWW_Horizontal = $0000 + +;=================================================================================================== + Overworld_LoadNewTiles: -{ - JSL.l Overworld_LoadBonkTiles - - LDA $040A : AND #$00FF : CMP #$0005 : BNE + - ; add sign to EDM for OWG people to read - LDA #$0101 : STA $7E2E18 ; #$0101 is the sign tile16 id, $7E2D98 is the position of the tile16 on map - BRA .atgtSwap - + CMP #$005B : BNE .atgtSwap - ; add Goal sign to Pyramid - LDA #$0101 : STA $7E27B6 ; Moved sign near statue - LDA #$05C2 : STA $7E27B4 ; added a pyramid peg on the left of the sign - - .atgtSwap - LDA.l SwapAgaGanonsTower : AND #$00FF : BEQ ++ ; forced inverted changes - LDA $040A : AND #$00FF : CMP #$0043 : BNE + - LDA #$08D5 : STA $7E235E ; GT entrance auto-opened - LDA #$08E3 : STA $7E23DE - LDA #$0E90 : STA $7E245E - LDA #$0E96 : STA $7E24DE : STA $7E255E - LDA #$08D6 : STA $7E2360 - LDA #$08E4 : STA $7E23E0 - LDA #$0E91 : STA $7E2460 - LDA #$0E97 : STA $7E24E0 : STA $7E2560 - LDA #$0E94 : STA $7E25DE - LDA #$0E95 : STA $7E25E0 - BRA .postAtGtSwap - + CMP #$001B : BNE .postAtGtSwap - LDA #$0101 : STA $7E222C ; add sign for Tower Entry at HC - BRA .postAtGtSwap - ++ ; forced non-inverted changes - LDA $040A : AND #$00FF : CMP #$0043 : BNE .postAtGtSwap - LDA #$0101 : STA $7E2550 ; GT sign - - .postAtGtSwap - SEP #$30 - LDX $8A : LDA.l OWTileMapAlt, X : BEQ .notInverted - PHB - - ; Set the data bank to $7E. - LDA.b #$7E : PHA : PLB - REP #$30 - ; Use it as an index into a jump table. - LDA $8A : CMP #$0080 : !BGE .noData - ASL A : TAX - - JSR (Overworld_NewTilesTable, X) - .noData - PLB - .notInverted - REP #$30 - LDX #$001E : LDA #$0DBE - - RTL -} - - -Overworld_NewTilesTable: -{ -;LW - ;00 01 02 03 04 05 06 07 -dw return, return, return, map003, return, map005, return, map007 - ;08 09 10 11 12 13 14 15 -dw return, return, return, return, return, return, return, return - ;16 17 18 19 20 21 22 23 -dw map016, return, return, return, map020, return, return, return - ;24 25 26 27 28 29 30 31 -dw return, return, map026, map027, return, return, return, return - ;32 33 34 35 36 37 38 39 -dw return, return, map034, return, return, return, return, return - ;40 41 42 43 44 45 46 47 -dw return, map041, return, return, return, return, return, return - ;48 49 50 51 52 53 54 55 -dw map048, return, map050, map051, return, map053, return, return - ;56 57 58 59 60 61 62 63 -dw return, return, map058, return, map060, return, return, map063 -;DW - ;64 65 66 67 68 69 70 71 -dw return, return, return, map067, return, map069, return, map071 - ;72 73 74 75 76 77 78 79 -dw return, return, return, return, return, return, return, return - ;80 81 82 83 84 85 86 87 -dw map080, return, return, return, return, return, return, return - ;88 89 90 91 92 93 94 95 -dw return, return, map090, map091, return, return, return, return - ;96 97 98 99 100 101 102 103 -dw return, return, map098, return, return, return, return, return - ;104 105 106 107 108 109 110 111 -dw return, return, return, return, return, return, return, map111 - ;112 113 114 115 116 117 118 119 -dw map120, return, return, map115, return, map117, return, return - ;120 121 122 123 124 125 126 127 -dw return, return, return, return, return, return, return, map127 - -return: -RTS - -map003: -{ -LDA.l OWTileMapAlt+3 : AND #$0001 : BEQ .notInverted - LDA.l WarningFlags : AND #$0020 : BNE + - LDA #$021A : STA $29B6 - LDA #$01F3 : STA $29B8 - LDA #$00A0 : STA $29BA - LDA #$0104 : STA $29BC - LDA #$00C6 : STA $2A34 : STA $2A38 : STA $2A3A - + - LDA #$0034 : STA $2BE0 -.notInverted -LDA.l OWTileMapAlt+3 : AND #$0002 : BEQ .return - LDA.l OWMode : AND #$00FF : BEQ .return - LDA $2BE0 : STA $38B4 ;adding convenient WDM portal in OW Shuffle -.return -RTS -} - -map005: -{ -LDA.l WarningFlags : AND #$0020 : BEQ + : JMP .spiral_mimic_ledge - + LDA #$0111 : STA $206E : STA $20EC - LDA #$0113 : STA $2070 : STA $2072 - LDA #$0112 : STA $2074 : STA $20EE : STA $216C - LDA #$0116 : STA $20F0 : STA $216E - LDA #$0117 : STA $20F2 - LDA #$0118 : STA $20F4 - LDA #$011C : STA $2170 - LDA #$011D : STA $2172 - LDA #$011E : STA $2174 - LDA #$0130 : STA $21E2 : STA $21F0 : STA $22E2 : STA $22F0 - LDA #$0123 : STA $21EC - LDA #$0124 : STA $21EE - LDA #$0034 : STA $21F2 - LDA #$0126 : STA $21F4 - LDA #$0135 : STA $2262 : STA $2270 : STA $2362 : STA $2370 - LDA #$0136 : STA $2264 : STA $2266 : STA $226C : STA $226E - LDA #$0137 : STA $2268 : STA $226A - LDA #$013C : STA $22E4 : STA $22E6 : STA $22EC : STA $22EE - LDA #$013D : STA $22E8 : STA $22EA - LDA #$0144 : STA $2364 - LDA #$0145 : STA $2366 - LDA #$0146 : STA $2368 - LDA #$0147 : STA $236A - LDA #$01B3 : STA $236C - LDA #$01B4 : STA $236E - - ;mimic cave ledge drop - ;LDA #$0139 : STA $2970 : STA $2C6C - ;LDA #$014B : STA $2972 : STA $2C6E - ;LDA #$016B : STA $29F0 : STA $2CEC - ;LDA #$0182 : STA $29F2 : STA $2CEE - -;spiral/mimic ledge extend 2bdc-2be2 8x5 -.spiral_mimic_ledge -LDA #$00E3 : STA $2BDC : STA $2BDE : STA $2BE0 : STA $2BE2 - STA $2BE4 : STA $2BE6 : STA $2BE8 : STA $2BEA -LDA #$014E : STA $2C5C : STA $2C5E : STA $2C64 : STA $2C66 - STA $2C68 : STA $2C6A -LDA #$0139 : STA $2C60 -LDA #$014B : STA $2C62 -LDA #$0152 : STA $2CDC : STA $2CDE : STA $2CE4 : STA $2CE6 - STA $2CE8 : STA $2CEA -LDA #$016B : STA $2CE0 -LDA #$0182 : STA $2CE2 -LDA #$022E : STA $2D5C : STA $2D5E : STA $2D60 : STA $2D62 - STA $2D64 : STA $2D66 : STA $2D68 : STA $2D6A -LDA #$0230 : STA $2DDC : STA $2DDE : STA $2DE0 : STA $2DE6 - STA $2DE8 : STA $2DEA -LDA #$02A6 : STA $2DE2 : STA $2DE4 - -; remove portal -LDA #$0034 : STA $3D4A - -RTS -} - -map007: -{ -; hammerpeg barrier -; LDA #$021B : STA $259E : STA $25A2 : STA $25A4 : STA $261C -; STA $2626 : STA $269A : STA $26A8 : STA $271A -; STA $2728 : STA $279A : STA $27A8 : STA $281E -; STA $2820 : STA $2822 : STA $2824 : STA $2828 -; STA $289C : STA $28A6 : STA $291E : STA $2924 -; LDA #$0134 : STA $269E : STA $26A4 -; LDA #$0034 : STA $2826 - -; ledge barrier -LDA #$0163 : STA $251C : STA $259A : STA $2618 -LDA #$0152 : STA $251E : STA $2520 : STA $2522 : STA $2524 : STA $2A1E : STA $2A24 -LDA #$01F2 : STA $2526 : STA $25A8 : STA $262A -LDA #$011C : STA $259C : STA $261A -LDA #$011D : STA $259E : STA $25A0 : STA $25A2 : STA $25A4 -LDA #$011E : STA $25A6 : STA $2628 -LDA #$0125 : STA $261C : STA $269A -LDA #$021B : STA $2620 -LDA #$0126 : STA $2626 : STA $26A8 -LDA #$0124 : STA $2698 : STA $2718 : STA $2798 : STA $2818 : STA $2898 -LDA #$0127 : STA $26AA : STA $272A : STA $27AA : STA $282A : STA $28AA -LDA #$0139 : STA $289A : STA $291C -LDA #$014B : STA $28A8 : STA $2926 -LDA #$0161 : STA $2918 : STA $299A : STA $2A1C -LDA #$0141 : STA $291A : STA $299C -LDA #$014F : STA $2928 : STA $29A6 -LDA #$0150 : STA $292A : STA $29A8 : STA $2A26 -LDA #$014E : STA $299E : STA $29A0 : STA $29A2 : STA $29A4 - -; remove ladder -LDA OverworldEventDataWRAM+$07 : CMP.w #$0010 : BNE .ladder : RTS - -.ladder -LDA #$0152 : STA $2A20 : STA $2A22 -LDA #$00E3 : STA $2AA0 : STA $2AA2 -RTS -} - -map016: -{ -LDA #$0034 : STA $2B2E -RTS -} - -map020: -{ -LDA.l WarningFlags : AND #$0020 : BNE + - LDA #$02F1 : STA $2422 - LDA #$02F2 : STA $2424 - LDA #$0184 : STA $24A2 : STA $2522 - LDA #$0185 : STA $24A4 : STA $2524 -+ -RTS -} - -map026: -{ -LDA.l OWTileMapAlt+$1A : AND #$0002 : BEQ .return - LDA #$02F8 : STA $2FBC - LDA #$02F9 : STA $2FBE - -.return -RTS -} - -map027: ;Castle map -{ -LDA.l OWTileMapAlt+$1B : AND #$0001 : BNE + : JMP .notSwapped - ;Eye removed - + LDA #$046D : STA $243E : STA $24BC : STA $24BE : STA $253E - STA $2440 : STA $24C0 : STA $24C2 : STA $2540 - - ;new trees - LDA #$0035 : STA $2C28 : STA $2FAE - LDA #$0034 : STA $2C2C : STA $2C2E : STA $2CB6 : STA $2D36 - STA $2DB6 : STA $2EB6 : STA $2F30 : STA $2F36 - STA $2FAA : STA $2FB0 : STA $2FB4 : STA $2FB6 - LDA #$00E2 : STA $2C36 : STA $2FA8 - LDA #$00AE : STA $2CAC - LDA #$00AF : STA $2CAE - LDA #$007E : STA $2CB0 - LDA #$007F : STA $2CB2 - LDA #$04BA : STA $2CB4 : STA $2DB4 : STA $2EB4 - LDA #$00B0 : STA $2D2C - LDA #$0014 : STA $2D2E - LDA #$0015 : STA $2D30 - LDA #$00A8 : STA $2D32 - LDA #$04BB : STA $2D34 : STA $2E34 : STA $2F34 - LDA #$0089 : STA $2DAC - LDA #$001C : STA $2DAE - LDA #$001D : STA $2DB0 - LDA #$0076 : STA $2DB2 - LDA #$00F1 : STA $2E2C - LDA #$004E : STA $2E2E - LDA #$004F : STA $2E30 - LDA #$00D9 : STA $2E32 - LDA #$009A : STA $2EAC - LDA #$009B : STA $2EAE - LDA #$009C : STA $2EB0 - LDA #$0095 : STA $2EB2 - LDA #$0034 : STA $3028 : STA $302C - LDA #$0035 : STA $302A : STA $3032 - LDA #$00DA : STA $302E - LDA #$00E2 : STA $3030 - - ;removing original castle ledge drop - ;LDA #$0485 : STA $2424 : STA $2426 - ;LDA #$0454 : STA $24A4 : STA $24A6 - ;LDA #$0476 : STA $2522 - ;LDA #$0460 : STA $2524 : STA $2526 - ;LDA #$04D7 : STA $2528 - - ;new Inverted Pyramid Entrance (Ganon Fall) - ;LDA #$04DD : STA $2624 - ;LDA #$04DE : STA $2626 - ;LDA #$04E0 : STA $26A4 - ;LDA #$04E1 : STA $26A6 - ;LDA #$04E4 : STA $2724 - ;LDA #$04E5 : STA $2726 - ;LDA #$0034 : STA $27A4 : STA $27A6 - - ;adding new castle ledge drop - ;LDA #$0486 : STA $26B0 - ;LDA #$0487 : STA $26B2 - ;LDA #$0454 : STA $272C : STA $272E - ;LDA #$048E : STA $2730 - ;LDA #$048F : STA $2732 - ;LDA #$04CA : STA $27AC - ;LDA #$045E : STA $27AE - ;LDA #$0494 : STA $27B0 - ;LDA #$0495 : STA $27B2 - ;LDA #$049E : STA $27B4 - ;LDA #$0499 : STA $282C - ;LDA #$0451 : STA $2830 - ;LDA #$0034 : STA $28AC : STA $28AE : STA $28B0 - ;removed right pillar to match removed left one - ;LDA #$0454 : STA $274E : STA $2750 - ;LDA #$0608 : STA $2752 - ;LDA #$0459 : STA $27CE : STA $27D0 - ;LDA #$045E : STA $27D2 - ;LDA #$0451 : STA $284E : STA $2850 : STA $2852 : STA $282E - ;LDA #$0034 : STA $28CE : STA $28D0 : STA $28D2 - - ;new HC door - LDA #$044F : STA $201C : STA $201E - LDA #$0455 : STA $209C : STA $209E - LDA #$045A : STA $211A - LDA #$045B : STA $211C - LDA #$045C : STA $211E - LDA #$045D : STA $2120 - LDA #$0463 : STA $219A - LDA #$0464 : STA $219C - LDA #$0465 : STA $219E - LDA #$0466 : STA $21A0 - - LDA #$0101 : STA $2252 ; add sign for Goal at HC - - ; CHECK IF AGAHNIM 2 IS DEAD AND WE HAVE ALREADY LANDED - LDA OverworldEventDataWRAM+$5B : AND #$0020 : BEQ .notSwapped - LDA #$0E3A : STA $24BC - LDA #$0E3B : STA $24BE - LDA #$0E3E : STA $253C - LDA #$0E3F : STA $253E - LDA #$0490 : STA $25BE - LDA #$0E39 : STA $2440 - LDA #$0E3C : STA $24C0 - LDA #$0E3D : STA $24C2 - LDA #$0E40 : STA $2540 - LDA #$0E41 : STA $2542 - LDA #$0491 : STA $25C0 - -.notSwapped -LDA.l OWTileMapAlt+$1B : AND #$0002 : BEQ .return - ;rocks for hardlock protection - LDA #$02FA : STA $2F80 - LDA #$030A : STA $3000 - LDA #$030D : STA $3080 - - LDA #$039A : STA $2FFE - LDA #$039B : STA $307E - -.return -RTS -} - -map034: -{ -LDA.l OWTileMapAlt+$22 : AND #$0002 : BEQ .return - ;rocks for hardlock protection - LDA #$02B9 : STA $203C - LDA #$0309 : STA $203E - LDA #$030E : STA $20BE -.return -RTS -} - -map041: -{ -LDA #$0034 : STA $2288 : STA $2308 : STA $2388 : STA $2408 - STA $2488 : STA $248A -LDA #$0036 : STA $2386 -RTS -} - -map048: -{ -LDA.l WarningFlags : AND #$0020 : BEQ + : JMP .map056 - + LDA #$017E : STA $2050 : STA $20CE - LDA #$00D1 : STA $2052 : STA $2054 : STA $2056 : STA $2058 - STA $205A : STA $205C : STA $205E : STA $21E6 : STA $21E8 - STA $21EA : STA $21EC : STA $21EE : STA $21F0 - LDA #$00D2 : STA $2060 : STA $20E2 : STA $2164 - LDA #$0183 : STA $20D0 : STA $214E - LDA #$00D0 : STA $20E0 : STA $2162 : STA $21E4 - LDA #$0153 : STA $2150 : STA $21CE : STA $21D0 : STA $2250 : STA $22CE - LDA #$00C8 : STA $2160 : STA $21E2 : STA $2264 : STA $28DA : STA $295C - LDA #$00D3 : STA $22E2 - LDA #$00C9 : STA $20D2 : STA $20D4 : STA $20D6 : STA $20D8 : STA $20DA - STA $20DC : STA $20DE : STA $2152 : STA $2154 - STA $2156 : STA $2158 : STA $215A : STA $215C - STA $215E : STA $2266 : STA $2268 : STA $226A - STA $226C : STA $226E : STA $2270 : STA $22CC - LDA #$00DC : STA $21D2 : STA $21D4 : STA $21D6 : STA $21D8 - STA $21DA : STA $21DC : STA $21DE : STA $224C - LDA #$00CA : STA $21E0 : STA $2262 : STA $285A : STA $28DC - LDA #$0178 : STA $224E - LDA #$00E3 : STA $2252 : STA $2254 - LDA #$0186 : STA $22D0 : STA $234E - LDA #$0034 : STA $22D2 : STA $22D4 : STA $22D6 : STA $2350 - STA $2352 : STA $2354 : STA $2356 : STA $23D0 - STA $23D2 : STA $23D4 : STA $23D6 : STA $2452 - STA $2454 : STA $2456 : STA $2458 : STA $24D4 - STA $24D6 : STA $2554 : STA $2556 : STA $25D4 - STA $25D6 : STA $2656 - LDA #$0302 : STA $22E4 - LDA #$00CC : STA $22E6 : STA $22E8 : STA $22EA : STA $22EC - STA $22EE : STA $22F0 : STA $234C - LDA #$0162 : STA $2460 - LDA #$0106 : STA $2462 : STA $24E0 : STA $255C - LDA #$00CE : STA $2362 : STA $23E2 : STA $25D8 - STA $2658 : STA $26D8 : STA $2758 - LDA #$00C5 : STA $2364 : STA $23E4 : STA $25DC - STA $265C : STA $26DC : STA $275C - LDA #$06AB : STA $2366 : STA $23E6 : STA $2466 - STA $24E4 : STA $24E6 : STA $2760 - LDA #$00AA : STA $2368 - LDA #$0384 : STA $236A : STA $236E : STA $23EC : STA $246A - STA $24E8 : STA $24EA : STA $24EC : STA $24EE - LDA #$0759 : STA $23C8 : STA $244A : STA $24CC : STA $254E - STA $26D0 : STA $2752 : STA $27D4 - LDA #$00AB : STA $236C - LDA #$0757 : STA $23CA : STA $244C : STA $24CE - STA $2550 : STA $26D2 : STA $2754 - LDA #$01FF : STA $23CC : STA $244E : STA $24D0 - STA $2652 : STA $26D4 : STA $2756 - LDA #$017C : STA $23CE : STA $2450 : STA $24D2 : STA $2654 : STA $26D6 - LDA #$015C : STA $23E0 - LDA #$0100 : STA $245A : STA $24D8 - LDA #$01C2 : STA $245C - LDA #$0218 : STA $245E - LDA #$0107 : STA $2464 : STA $24E2 - LDA #$0104 : STA $24DA : STA $2558 - LDA #$01D4 : STA $24DC - LDA #$0219 : STA $24DE - LDA #$0179 : STA $2552 : STA $25D2 - LDA #$0105 : STA $255A - LDA #$0166 : STA $255E - LDA #$0766 : STA $2560 - LDA #$06B4 : STA $2562 : STA $2564 : STA $2566 : STA $2568 - STA $256A : STA $256C : STA $256E : STA $2570 - LDA #$00C4 : STA $25DA : STA $265A : STA $26DA : STA $275A - LDA #$0171 : STA $25DE - LDA #$0165 : STA $25E4 : STA $25E6 : STA $25E8 : STA $25EA - STA $25EC : STA $25EE : STA $25F0 - LDA #$06E4 : STA $27D2 : STA $2852 : STA $2854 : STA $2856 - STA $28D4 : STA $28D6 : STA $2956 - STA $2958 : STA $29D8 : STA $29DA - LDA #$06E5 : STA $25D0 : STA $2650 - LDA #$06E1 : STA $27D6 - LDA #$02FD : STA $27D8 : STA $2858 - LDA #$00CF : STA $27DA - LDA #$06E7 : STA $28D8 : STA $295A : STA $29DC - - LDA #$0769 : STA $38F8 - LDA #$06E1 : STA $38FA : STA $38FC : STA $38FE - LDA #$06E3 : STA $3978 - LDA #$02E5 : STA $397A : STA $397E - LDA #$02EC : STA $397C - LDA #$02F0 : STA $39F8 - LDA #$02F3 : STA $39FA : STA $39FC : STA $39FE - -.map056 -LDA #$0034 : STA $3D94 - -RTS -} - -map060: -{ -LDA #$02E5 : STA $27AE : STA $282C : STA $282E : STA $2832 - STA $28AC : STA $28AE : STA $2928 : STA $292C - STA $29A8 : STA $29B0 : STA $2A28 : STA $2A30 - STA $2AAC : STA $2AB2 -LDA #$078A : STA $28AA : STA $28B0 : STA $2AAA - STA $2B2A : STA $2B30 : STA $2BAE -LDA #$02EB : STA $28B4 : STA $2930 : STA $29AE - STA $2A2C : STA $2A32 : STA $2AAE -LDA #$02EC : STA $2934 : STA $2B28 : STA $2B2C : STA $2B2E : STA $2B32 -RTS -} - -map050: -{ -LDA.l WarningFlags : AND #$0020 : BEQ + : RTS - + LDA #$0034 : STA $270E : STA $278E : STA $2790 : STA $280E - STA $2810 : STA $2812 : STA $2814 : STA $2816 - STA $2818 : STA $281A : STA $281C : STA $288E - STA $2892 : STA $2894 : STA $2896 : STA $2898 - STA $289A : STA $289C : STA $289E : STA $290E - STA $2910 : STA $2912 : STA $2918 : STA $291A - STA $291C : STA $291E : STA $2920 : STA $298C - STA $298E : STA $2990 : STA $2992 : STA $2998 - STA $299A : STA $299E : STA $29A0 : STA $2A06 - STA $2A08 : STA $2A0A : STA $2A0C : STA $2A10 - STA $2A12 : STA $2A14 : STA $2A16 : STA $2A18 - STA $2A1C : STA $2A1E : STA $2A84 : STA $2A86 - STA $2A88 : STA $2A8C : STA $2A8E : STA $2A90 - STA $2A92 : STA $2A94 : STA $2A96 : STA $2A98 - STA $2A9A : STA $2A9C : STA $2B06 : STA $2B0A - STA $2B0E : STA $2B12 : STA $2B1A : STA $2B84 - STA $2B86 : STA $2B88 : STA $2B8A : STA $2B8E - STA $2B92 : STA $2B94 : STA $2B98 : STA $2B9A - STA $2C04 : STA $2C08 : STA $2C0A : STA $2C0E - STA $2C12 : STA $2C14 : STA $2C18 : STA $2C86 - STA $2C88 : STA $2C8A : STA $2C90 : STA $2C92 - STA $2C94 : STA $2C98 : STA $2D0A : STA $2D0C - STA $2D10 : STA $2D14 : STA $2D16 : STA $2D8A - STA $2D8C : STA $2D8E : STA $2D94 - LDA #$01D5 : STA $2486 - LDA #$0165 : STA $2506 - LDA #$0166 : STA $2508 : STA $258A - LDA #$00C6 : STA $2586 : STA $2608 : STA $2688 : STA $2708 - STA $2788 : STA $2806 : STA $2808 - LDA #$0171 : STA $2588 - LDA #$021C : STA $260A : STA $268A : STA $270A : STA $278A - LDA #$016A : STA $278C : STA $280C : STA $2A82 : STA $2B02 - STA $2B82 : STA $2C02 : STA $2C82 - LDA #$01FA : STA $288C - LDA #$00DA : STA $2890 : STA $299C : STA $2B14 : STA $2B16 - STA $2B18 : STA $2B96 : STA $2C16 - STA $2C96 : STA $2D08 : STA $2D92 - LDA #$0186 : STA $290C : STA $298A : STA $2A04 - LDA #$0036 : STA $2914 : STA $2916 : STA $2994 : STA $2996 : STA $2D12 - LDA #$00E4 : STA $2986 - LDA #$00E5 : STA $2988 - LDA #$0100 : STA $29A2 - LDA #$0071 : STA $2A0E : STA $2A1A : STA $2C8C - LDA #$015C : STA $2A20 : STA $2A9E : STA $2B1C - STA $2C9A : STA $2D18 : STA $2D96 - LDA #$0104 : STA $2A22 - LDA #$01D4 : STA $2A24 - LDA #$0035 : STA $2A8A : STA $2B08 : STA $2C06 : STA $2D0E : STA $2D90 - LDA #$0162 : STA $2AA0 : STA $2B1E : STA $2B9C : STA $2D1A : STA $2D98 - LDA #$00E2 : STA $2B04 : STA $2B0C : STA $2B10 : STA $2B8C - STA $2B90 : STA $2C0C : STA $2C10 : STA $2C8E - LDA #$00F8 : STA $2C1A - LDA #$00CE : STA $2C1C : STA $2C9C - LDA #$0160 : STA $2C84 : STA $2D06 : STA $2D88 - LDA #$0167 : STA $2D04 : STA $2D86 - LDA #$0172 : STA $2E08 - LDA #$015E : STA $2E0A : STA $2E0C : STA $2E0E - STA $2E10 : STA $2E12 : STA $2E14 - LDA #$0174 : STA $2E16 -+ -RTS -} - -map051: -{ -LDA #$037D : STA $22A8 -RTS -} - -map053: -{ -LDA.l WarningFlags : AND #$0020 : BNE + - LDA #$02F1 : STA $2BB0 - LDA #$02F2 : STA $2BB2 - LDA #$0184 : STA $2C30 - LDA #$0185 : STA $2C32 - LDA #$0392 : STA $2CB0 - LDA #$0393 : STA $2CB2 - LDA #$0394 : STA $2D30 - LDA #$0395 : STA $2D32 -+ -LDA #$0034 : STA $2F56 - -RTS -} - -map058: -{ -LDA.l WarningFlags : AND #$0020 : BNE + - LDA #$0774 : STA $2800 - LDA #$06E1 : STA $2802 - LDA #$0757 : STA $2804 : STA $2886 - LDA #$0779 : STA $2880 - LDA #$02EC : STA $2882 - LDA #$0759 : STA $2884 : STA $2906 - LDA #$02E5 : STA $2900 : STA $2902 : STA $2904 - LDA #$076A : STA $2908 - LDA #$02F3 : STA $2980 : STA $2982 - LDA #$02F1 : STA $2984 - LDA #$02F2 : STA $2986 - LDA #$038A : STA $2988 - LDA #$0184 : STA $2A04 : STA $2A84 : STA $2B04 : STA $2B84 - LDA #$0185 : STA $2A06 : STA $2A86 : STA $2B06 : STA $2B86 -+ -RTS -} - -map063: -{ -LDA.l OWTileMapAlt+$3F : AND #$0003 : CMP #$0002 : BEQ + : RTS - + LDA #$02EC : STA $29A4 : STA $2BA0 : STA $2C16 ;grass - LDA #$02E5 : STA $2A1A : STA $2A26 : STA $2AA6 : STA $2B20 : STA $2C9A ;blank - LDA #$06F5 : STA $2A1C : STA $2BA2 - LDA #$06F6 : STA $2A1E : STA $2A20 : STA $2C20 - LDA #$0752 : STA $2A22 - LDA #$0753 : STA $2A24 - LDA #$075C : STA $2A9A - LDA #$06F7 : STA $2A9C : STA $2C22 - LDA #$0774 : STA $2A9E - LDA #$06E1 : STA $2AA0 : STA $2C9E : STA $2CA0 - LDA #$0757 : STA $2AA2 : STA $2C1C - LDA #$06E3 : STA $2AA4 : STA $2C24 - LDA #$075D : STA $2B1A - LDA #$0784 : STA $2B1C : STA $2B9C - LDA #$076E : STA $2B1E - LDA #$0759 : STA $2B22 : STA $2C9C - LDA #$0779 : STA $2B24 - LDA #$075E : STA $2B9A - LDA #$076C : STA $2B9E - LDA #$0705 : STA $2BA4 - LDA #$076F : STA $2C1A - LDA #$0704 : STA $2C1E - LDA #$0762 : STA $2CA2 - LDA #$0773 : STA $2CA4 -RTS -} - -map067: -{ -LDA.l OWTileMapAlt+$43 : AND #$0001 : BEQ .owshuffle - ; LDA.l WarningFlags : AND #$0020 : BNE + - ; ladder - ; LDA #$0180 : STA $275E - ; LDA #$0181 : STA $2760 - ; LDA #$0184 : STA $27DE : STA $285E - ; LDA #$0185 : STA $27E0 : STA $2860 - ; + - LDA #$0212 : STA $2BE0 ; portal - -.owshuffle -LDA.l OWTileMapAlt+$43 : AND #$0002 : BEQ .return - LDA.l OWMode : AND #$00FF : BEQ .return - LDA $2BE0 : STA $38B4 ; adding convenient WDM portal in OW Shuffle -.return -RTS -} - -map069: -{ -LDA #$0239 : STA $3D4A -RTS -} - -map071: -{ -LDA.l WarningFlags : AND #$0020 : BNE + - LDA #$0398 : STA $25A0 - LDA #$0522 : STA $25A2 - LDA #$0125 : STA $2620 - LDA #$0126 : STA $2622 -+ -LDA #$0239 : STA $269E : STA $26A4 - -RTS -} - -map080: -{ -LDA #$020F : STA $2B2E -RTS -} - -map090: -{ -LDA.l OWTileMapAlt+$5A : AND #$0002 : BEQ .return - ;rocks for hardlock protection - LDA #$02F8 : STA $2FBC - LDA #$02F9 : STA $2FBE -.return -RTS -} - -map091: ;Pyramid -{ -LDA.l OWTileMapAlt+$5B : AND #$0001 : BNE + : JMP .notInverted - ; Warp Tile Post-Aga Defeated - + LDA #$0034 : STA $3BBE - LDA ProgressIndicator : AND #$00FF : CMP #$0003 : BNE + - LDA #$0212 : STA $3BBE - + - - ; delete Goal sign - LDA #$09F1 : STA $27B6 ; remove sign - LDA #$09F0 : STA $27B4 ; remove the added pyramid peg on the left of the sign - - LDA #$0A06 : STA $2E1C ; cover up entrance - LDA #$0A0E : STA $2E1E - - ;Added Pegs on pyramid map - ;{ - ;STA $321C - ;STA $329C - ;STA $32A0 - - ;LDA #$0071 : STA $321E - ;;LDA #$00DA : STA $3220 : STA $329A - ;LDA #$00E1 : STA $329E - ;LDA #$0382 : STA $3318 - ;LDA #$037C : STA $3322 - - ;LDA #$021B : STA $3218 : STA $3222 : STA $3298 : STA $32A2 - ; STA $331A : STA $331C : STA $331E : STA $3320 - ;LDA #$00E2 : STA $321A - ;} - - LDA #$0323 : STA $39B6 - LDA #$0324 : STA $39B8 : STA $39BA : STA $39BC : STA $39BE - LDA #$02FE : STA $3A34 - LDA #$02FF : STA $3A36 - LDA #$0326 : STA $3A38 : STA $3A3A : STA $3A3C : STA $3A3E - LDA #$039D : STA $3AB2 - LDA #$0303 : STA $3AB4 - LDA #$0232 : STA $3AB6 : STA $3B34 - LDA #$0233 : STA $3AB8 : STA $3ABA : STA $3ABC : STA $3ABE - LDA #$03A2 : STA $3B32 - LDA #$0235 : STA $3B36 : STA $3BB4 - LDA #$046A : STA $3B38 - LDA #$0333 : STA $3B3A : STA $3B3C : STA $3B3E - LDA #$0034 : STA $3BB6 : STA $3BBA : STA $3BBC - STA $3C3A : STA $3C3C : STA $3C3E - LDA #$00F2 : STA $3BB8 - LDA #$0108 : STA $3C38 - LDA #$0324 : STA $39C0 : STA $39C2 : STA $39C4 - LDA #$0325 : STA $39C6 - LDA #$02D5 : STA $39C8 : STA $39D2 - LDA #$02CC : STA $39CC : STA $39D4 - LDA #$0326 : STA $3A40 : STA $3A42 : STA $3A44 - LDA #$0327 : STA $3A46 - LDA #$02F7 : STA $3A48 - LDA #$02E3 : STA $3A4C : STA $3A4E - LDA #$0233 : STA $3AC0 : STA $3AC2 : STA $3AC4 - LDA #$0234 : STA $3AC6 : STA $3B48 - LDA #$02F6 : STA $3AC8 - LDA #$0396 : STA $3ACA - LDA #$0333 : STA $3B40 : STA $3B42 - LDA #$03AA : STA $3B44 - LDA #$03A3 : STA $3B46 : STA $3BC8 - LDA #$0397 : STA $3B4A - LDA #$0034 : STA $3BC0 : STA $3BC2 : STA $3BC6 : STA $3C40 : STA $3C42 - LDA #$029C : STA $3BC4 - LDA #$010A : STA $3C44 - LDA #$010B : STA $3C46 : STA $3C48 : STA $3C4A : STA $3C4C - STA $3C4E : STA $3C50 : STA $3C52 : STA $3C54 - STA $3C56 : STA $3C58 : STA $3C5A - STA $3C5C : STA $3C5E : STA $3C60 - STA $3C62 : STA $3C64 : STA $3C66 - -.notInverted -LDA.l OWTileMapAlt+$5B : AND #$0002 : BEQ .return - ;rocks for hardlock protection - LDA #$02FA : STA $2F80 - LDA #$030A : STA $3000 - LDA #$030D : STA $3080 - - LDA #$039A : STA $2FFE - LDA #$039B : STA $307E -.return -RTS -} - -map098: -{ -LDA.l OWTileMapAlt+$62 : AND #$0002 : BEQ .return - ;rocks for hardlock protection - LDA #$02B9 : STA $203C - LDA #$0309 : STA $203E - LDA #$030E : STA $20BE -.return -RTS -} - -map111: -{ -LDA #$020F : STA $2BB2 -RTS -} - -map115: -{ -LDA #$020F : STA $22A8 -RTS -} - -map120: -{ -LDA #$0239 : STA $3D94 -RTS -} - -map117: -{ -LDA #$0239 : STA $3352 ; portal -;LDA #$0239 : STA $2F50 ; portal inside ice palace - -; ice palace opened -; ; map118 -; LDA #$0BA3 : STA $2F52 : STA $2FCE : STA $2FD0 -; ; map126 -; LDA #$0BA3 : STA $3054 : STA $3056 : STA $3058 : STA $305A -; STA $3254 : STA $3256 : STA $3258 : STA $325A -; LDA #$0BAC : STA $30D4 -; LDA #$0BAD : STA $30D6 : STA $3156 : STA $31D6 -; LDA #$0BA9 : STA $30D8 : STA $3158 : STA $31D8 -; LDA #$0BAA : STA $30DA -; LDA #$0BC5 : STA $3154 -; LDA #$0BC8 : STA $315A -; LDA #$0BCA : STA $31D4 -; LDA #$0BCD : STA $31DA -RTS -} - -map127: -{ -LDA.l OWTileMapAlt+$7F : AND #$0003 : CMP #$0003 : BEQ + : RTS - + LDA #$02EC : STA $29A4 : STA $2BA0 : STA $2C16 ;grass - LDA #$02E5 : STA $2A26 : STA $2AA6 : STA $2B20 ;blank - LDA #$0752 : STA $2A22 - LDA #$0753 : STA $2A24 - LDA #$075C : STA $2A9A - LDA #$0774 : STA $2A9E - LDA #$06E1 : STA $2AA0 - LDA #$0757 : STA $2AA2 - LDA #$06E3 : STA $2AA4 : STA $2C24 - LDA #$075D : STA $2B1A - LDA #$076E : STA $2B1E - LDA #$0759 : STA $2B22 - LDA #$0779 : STA $2B24 - LDA #$075E : STA $2B9A - LDA #$076C : STA $2B9E - LDA #$06F5 : STA $2BA2 - LDA #$0705 : STA $2BA4 - LDA #$076F : STA $2C1A - LDA #$0704 : STA $2C1E - LDA #$06F6 : STA $2C20 - LDA #$06F7 : STA $2C22 - LDA #$0762 : STA $2CA2 - LDA #$0773 : STA $2CA4 -RTS -} - -Overworld_InvertedTRPuzzle: -{ - REP #$30 - LDA.l OWTileMapAlt+07 : AND #$00FF : BNE .inverted - LDA.w #$0212 : LDX.w #$0720 : STA.l $7E2000,X ; what we wrote over - JSL.l Overworld_MemorizeMap16Change : JSL.l Overworld_DrawPersistentMap16+4 ; what we wrote over - RTL - - ; removes barriers from TR Peg Puzzle Ledge - .inverted - LDA.w #$0184 : LDX.w #$0A20 : JSL.l Overworld_DrawPersistentMap16 - LDA.w #$0184 : LDX.w #$0AA0 : JSL.l Overworld_DrawPersistentMap16 - LDA.w #$0185 : LDX.w #$0A22 : JSL.l Overworld_DrawPersistentMap16 - LDA.w #$0185 : LDX.w #$0AA2 : JSL.l Overworld_DrawPersistentMap16 - RTL -} + JSL Overworld_LoadBonkTiles + + LDA.b OverworldIndex + CMP.w #$0080 + BCS .exit + + ASL + TAX + + LDA.l OverworldMapChangePointers2,X + BNE .do_overlay + +.exit + LDX.w #$001E + LDA.w #$0DBE + + RTL + +.end + PLB + BRA .exit + +.do_overlay + PHB + PHK + PLB + + ; give Y the pointer to our data + TAY + +.next_tile + ; format: + ; dw , + ; or if bit 15 is set + ; dw , ... + ; commands are: + ; 1sss ssss dccc cccc + ; s - size (if applicable) + ; d - direction (if applicable) + ; c - command id + ; FFFF is end + LDA.w $0000,Y + INY + INY + TAX + BMI .command + + LDX.w $0000,Y + STA.l $7E0000,X + + INY + INY + + BRA .next_tile + + ; when using commands, list parameters will never have bit-15 set + ; so we use that as our sentinel in data lists + ; we could encode the size for everything + ; but that makes adjustments more burdensome +.command + CMP.w #!OWW_END + BEQ .end + + STA.b OWWriteCommand + + AND.w #$007F + ASL + TAX + + JSR (.command_vectors,X) + + BRA .next_tile + +.command_vectors + ; dw !OWW_Stripe|!OWW_ + ; dw + ; dw , , ... |!OWW_STOP + ; use !SKIP to not place a tile but continue the stripe + !OWW_Stripe = $8000 + dw .stripe ; 00 + + ; dw !OWW_StripeRLE|!OWW_|RLESize() + ; dw , + !OWW_StripeRLE = $8001 + dw .stripe_rle ; 01 + + ; dw !OWW_StripeRLEINC|!OWW_|RLESize() + ; dw , + !OWW_StripeRLEINC = $8002 + dw .stripe_rle_inc ; 02 + + ; dw !OWW_ArbTileCopy + ; dw + ; dw , , ... |!OWW_STOP + !OWW_ArbTileCopy = $8003 + dw .arbitrary_tile_copy ; 03 + + dw .nothing ; 04 + dw .nothing ; 05 + dw .nothing ; 06 + dw .nothing ; 07 + dw .nothing ; 08 + dw .nothing ; 09 + + ; dw !OWW_SkipAhead,
+ ; skips to
unconditionally + !OWW_SkipAhead = $800A + dw .skip_ahead ; 0A + + ; dw !OWW_SkipIfFlagSet, , ,
+ ; skips to
when value at has bits matching + !OWW_SkipIfFlagSet = $800B + dw .flag_skip ; 0B + + ; dw !OWW_SkipIfNotFlagSet, , ,
+ ; skips to
when value at has bits not matching + !OWW_SkipIfNotFlagSet = $800C + dw .flag_block ; 0C + + ; dw !OWW_SkipIfInverted,
+ ; skips to
when inverted mode + !OWW_SkipIfInverted = $800D + dw .inverted_skip ; 0D + + ; dw !OWW_SkipIfNotInverted,
+ ; skips to
when not inverted + !OWW_SkipIfNotInverted = $800E + dw .inverted_block ; 0E + + ; dw !OWW_InvertedOnly + ; cancels everything if not inverted + !OWW_InvertedOnly = $800F + dw .inverted_only ; 0F + + ; dw !OWW_CustomCommand, + !OWW_CustomCommand = $8010 + dw .custom_command ; 10 + + dw .nothing ; 11 + dw .nothing ; 12 + dw .nothing ; 13 + dw .nothing ; 14 + dw .nothing ; 15 + dw .nothing ; 16 + dw .nothing ; 17 + dw .nothing ; 18 + dw .nothing ; 19 + +;--------------------------------------------------------------------------------------------------- + +.custom_command + TYX + + INY + INY + + JMP.w ($0000,X) + +;--------------------------------------------------------------------------------------------------- + +.skip_ahead + LDX.w $0000,Y + INY : INY + + TXY + + RTS + +;--------------------------------------------------------------------------------------------------- + +.flag_skip + LDX.w $0000,Y : STX.b OWSkipLookup + INY : INY + LDX.w $0000,Y : STX.b OWSkipFlags-1 + INY : INY + LDX.w $0000,Y + INY : INY + + SEP #$20 + LDA.b [OWSkipLookup] + AND.b OWSkipFlags + CMP.b OWSkipFlags + REP #$20 + BNE .nothing + + TXY + + RTS + +;--------------------------------------------------------------------------------------------------- + +.flag_block + LDX.w $0000,Y : STX.b OWSkipLookup + INY : INY + LDX.w $0000,Y : STX.b OWSkipFlags-1 + INY : INY + LDX.w $0000,Y + INY : INY + + SEP #$20 + LDA.b [OWSkipLookup] + AND.b OWSkipFlags + CMP.b OWSkipFlags + REP #$20 + BEQ .nothing + + TXY + + RTS + +;--------------------------------------------------------------------------------------------------- + +.inverted_skip + LDX.w $0000,Y + + INY + INY + + PHX + SEP #$20 + LDX.b OverworldIndex : LDA.l OWTileMapAlt, X + REP #$20 + PLX + AND.w #$0001 + BEQ .nothing + + TXY + +.nothing + RTS + +;--------------------------------------------------------------------------------------------------- + +.inverted_block + LDX.w $0000,Y + INY + INY + BRA .check_inverted + +#ReliableOWWSentinel: + dw !OWW_END + +.inverted_only + LDX.w #ReliableOWWSentinel + +.check_inverted + PHX + SEP #$20 + LDX.b OverworldIndex : LDA.l OWTileMapAlt, X + REP #$20 + PLX + AND.w #$0001 + BNE .nothing + + TXY + + RTS + +;--------------------------------------------------------------------------------------------------- + +.get_increment + LDA.b OWWriteCommand + AND.w #$0080 + BNE .vertical_increment + + LDA.w #$0002 + +.vertical_increment + STA.b OWWriteIncrement + + RTS + +;--------------------------------------------------------------------------------------------------- + +.stripe + JSR .get_increment + + LDX.w $0000,Y + + BRA ++ ; to increment at start of loop properly + +-- TXA + CLC + ADC.b OWWriteIncrement + TAX + +++ INY + INY + + LDA.w $0000,Y + BMI .end_stripe_maybe + + STA.l $7E0000,X + BRA -- + +.end_stripe_maybe + CMP.w #!OWW_SKIP ; just skip, so we can have fewer discontinuous commands + BEQ -- + + AND.w #$7FFF + STA.l $7E0000,X + + INY + INY + + RTS + +;--------------------------------------------------------------------------------------------------- + +.stripe_rle_inc + JSR .get_increment + JSR .get_rle_size_and_tile + + LDX.w $0000,Y + BRA ++ + +-- TXA + CLC + ADC.b OWWriteIncrement + TAX + + LDA.b OWWriteTile + INC + STA.b OWWriteTile + +++ STA.l $7E0000,X + + DEC.b OWWriteSize + BNE -- + + INY + INY + + RTS + +;--------------------------------------------------------------------------------------------------- + +.get_rle_size_and_tile + LDA.b OWWriteCommand+1 + AND.w #$007F + STA.b OWWriteSize + + LDA.w $0000,Y + STA.b OWWriteTile + + INY + INY + + RTS + +;--------------------------------------------------------------------------------------------------- + +.stripe_rle + JSR .get_increment + JSR .get_rle_size_and_tile + + LDX.w $0000,Y + BRA ++ + +-- TXA + CLC + ADC.b OWWriteIncrement + TAX + + LDA.b OWWriteTile + +++ STA.l $7E0000,X + + DEC.b OWWriteSize + BNE -- + + INY + INY + + RTS + +;--------------------------------------------------------------------------------------------------- +; Don't use SKIP with this, since that's not really meaningful anyways... +;--------------------------------------------------------------------------------------------------- +.arbitrary_tile_copy + LDA.w $0000,Y + +-- INY + INY + + LDX.w $0000,Y + BMI .last_arb + + STA.l $7E0000,X + BRA -- + +.last_arb + PHA + + TXA + AND.w #$7FFF + TAX + + PLA + + STA.l $7E0000,X + + INY + INY + + RTS + +;--------------------------------------------------------------------------------------------------- + +;=================================================================================================== + +OverworldMapChangePointers: + ; light world + dw $0000 ; 00 + dw $0000 ; 01 + dw $0000 ; 02 + dw .map03 ; 03 + dw $0000 ; 04 + dw .map05 ; 05 + dw $0000 ; 06 + dw .map07 ; 07 + dw $0000 ; 08 + dw $0000 ; 09 + dw $0000 ; 0A + dw $0000 ; 0B + dw $0000 ; 0C + dw $0000 ; 0D + dw $0000 ; 0E + dw $0000 ; 0F + dw .map10 ; 10 + dw $0000 ; 11 + dw $0000 ; 12 + dw $0000 ; 13 + dw .map14 ; 14 + dw $0000 ; 15 + dw $0000 ; 16 + dw $0000 ; 17 + dw $0000 ; 18 + dw $0000 ; 19 + dw $0000 ; 1A + dw .map1B ; 1B + dw $0000 ; 1C + dw $0000 ; 1D + dw $0000 ; 1E + dw $0000 ; 1F + dw $0000 ; 20 + dw $0000 ; 21 + dw $0000 ; 22 + dw $0000 ; 23 + dw $0000 ; 24 + dw $0000 ; 25 + dw $0000 ; 26 + dw $0000 ; 27 + dw $0000 ; 28 + dw .map29 ; 29 + dw $0000 ; 2A + dw $0000 ; 2B + dw $0000 ; 2C + dw $0000 ; 2D + dw $0000 ; 2E + dw $0000 ; 2F + dw .map30 ; 30 + dw $0000 ; 31 + dw .map32 ; 32 + dw .map33 ; 33 + dw $0000 ; 34 + dw .map35 ; 35 + dw $0000 ; 36 + dw $0000 ; 37 + dw $0000 ; 38 + dw $0000 ; 39 + dw .map3A ; 3A + dw $0000 ; 3B + dw $0000 ; 3C + dw $0000 ; 3D + dw $0000 ; 3E + dw $0000 ; 3F + + ; dark world + dw $0000 ; 40 + dw $0000 ; 41 + dw $0000 ; 42 + dw .map43 ; 43 + dw $0000 ; 44 + dw .map45 ; 45 + dw $0000 ; 46 + dw .map47 ; 47 + dw $0000 ; 48 + dw $0000 ; 49 + dw $0000 ; 4A + dw $0000 ; 4B + dw $0000 ; 4C + dw $0000 ; 4D + dw $0000 ; 4E + dw $0000 ; 4F + dw .map50 ; 50 + dw $0000 ; 51 + dw $0000 ; 52 + dw $0000 ; 53 + dw .map54 ; 54 + dw $0000 ; 55 + dw $0000 ; 56 + dw $0000 ; 57 + dw $0000 ; 58 + dw $0000 ; 59 + dw $0000 ; 5A + dw .map5B ; 5B + dw $0000 ; 5C + dw $0000 ; 5D + dw $0000 ; 5E + dw $0000 ; 5F + dw $0000 ; 60 + dw $0000 ; 61 + dw $0000 ; 62 + dw $0000 ; 63 + dw $0000 ; 64 + dw $0000 ; 65 + dw $0000 ; 66 + dw $0000 ; 67 + dw $0000 ; 68 + dw $0000 ; 69 + dw $0000 ; 6A + dw $0000 ; 6B + dw $0000 ; 6C + dw $0000 ; 6D + dw $0000 ; 6E + dw .map6F ; 6F + dw .map70 ; 70 + dw $0000 ; 71 + dw $0000 ; 72 + dw .map73 ; 73 + dw $0000 ; 74 + dw .map75 ; 75 + dw $0000 ; 76 + dw $0000 ; 77 + dw $0000 ; 78 + dw $0000 ; 79 + dw $0000 ; 7A + dw $0000 ; 7B + dw $0000 ; 7C + dw $0000 ; 7D + dw $0000 ; 7E + dw $0000 ; 7F + +;--------------------------------------------------------------------------------------------------- + +.map03 + dw !OWW_InvertedOnly + + ; singles + dw $0034, $2BE0 + + dw !OWW_Stripe|!OWW_Horizontal + dw $29B6 ; address + dw $021A, $01F3, $00A0, $0104|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $00C6 ; tile + dw $2A34, $2A38, $2A3A|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map05 + dw $0101, $2E18 ; OWG sign + + dw !OWW_InvertedOnly + + ; singles + dw $0034, $21F2 + dw $0034, $3D4A + dw $0116, $216E + dw $0126, $21F4 + + dw $0139, $2C6C + dw $014B, $2C6E + dw $016B, $29F0 + dw $016B, $2CEC + dw $0182, $29F2 + dw $0182, $2CEE + + dw !OWW_Stripe|!OWW_Horizontal + dw $206E ; address + dw $0112, $0113, $0113, $0112|!OWW_STOP + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(2) + dw $0111, $20EC ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(3) + dw $0116, $20F0 ; tile, start + + dw !OWW_Stripe|!OWW_Horizontal + dw $216C ; address + dw $0112, $0116, $011C, $011D, $011E|!OWW_STOP + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(3) + dw $011C, $2170 ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(2) + dw $0123, $21EC ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(4) + dw $0144, $2364 ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(2) + dw $01B3, $236C ; tile, start + + dw !OWW_Stripe|!OWW_Horizontal + dw $2970 ; address + dw $0139, $014B|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0130 ; tile + dw $21E2, $21F0, $22E2, $22F0|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0135 ; tile + dw $2262, $2270, $2362, $2370|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0136 ; tile + dw $2264, $2266, $226C, $226E|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0137 ; tile + dw $2268, $226A|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $22E4 ; start + dw $013C, $013C, $013D, $013D, $013C, $013C|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map07 + dw !OWW_InvertedOnly + + ; singles + dw $0134, $269E + dw $0134, $26A4 + dw $0034, $2826 + + dw !OWW_ArbTileCopy + dw $021B ; tile + dw $259E, $25A2, $25A4, $261C + dw $2626, $269A, $26A8, $271A + dw $2728, $279A, $27A8, $281E + dw $2820, $2822, $2824, $2828 + dw $289C, $28A6, $291E, $2924|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map10 + dw !OWW_InvertedOnly + + dw $0034, $2B2E + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map14 + dw !OWW_InvertedOnly + + dw !OWW_Stripe|!OWW_Vertical + dw $2422 + dw $02F1, $0184, $0184|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2424 + dw $02F2, $0185, $0185|!OWW_STOP + + dw !OWW_END + +;=================================================================================================== + +.map1B + dw !OWW_InvertedOnly + + ; singles + dw $0476, $2522 + dw $04D7, $2528 + + dw !OWW_Stripe|!OWW_Vertical + dw $2424 ; address + dw $0485, $0454, $0460, !OWW_SKIP + dw $04DD, $04E0, $04E4, $0034|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2426 ; address + dw $0485, $0454, $0460, !OWW_SKIP + dw $04DE, $04E1, $04E5, $0034|!OWW_STOP + + + ; Eye removed + dw !OWW_ArbTileCopy + dw $046D ; tile + dw $243E, $24BC, $24BE, $253E + dw $2440, $24C0, $24C2, $2540|!OWW_STOP + + ; new trees + + dw !OWW_Stripe|!OWW_Horizontal + dw $2D2C ; address + dw $00B0, $0014, $0015, $00A8 + dw $04BB, $0034|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2DAC ; address + dw $0089, $001C, $001D, $0076 + dw $04BA, $0034|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2E2C ; address + dw $00F1, $004E, $004F, $00D9 + dw $04BB|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0034 ; tile + dw $28AC, $28AE + dw $28B0, $28CE, $28D0, $28D2 + dw $2C2C, $2C2E, $2CB6, $2EB6 + dw $2F30, $2F36, $2FAA, $2FB0 + dw $2FB4, $2FB6, $3028, $302C|!OWW_STOP + + ; TODO still need to optimize this last section ugh + dw $0035, $2C28 + dw $0035, $2FAE + dw $0035, $302A + dw $0035, $3032 + dw $007E, $2CB0 + dw $007F, $2CB2 + dw $0095, $2EB2 + dw $009A, $2EAC + dw $009B, $2EAE + dw $009C, $2EB0 + dw $00AE, $2CAC + dw $00AF, $2CAE + dw $00DA, $302E + dw $00E2, $2C36 + dw $00E2, $2FA8 + dw $00E2, $3030 + dw $0451, $282E + dw $0451, $2830 + dw $0451, $284E + dw $0451, $2850 + dw $0451, $2852 + dw $0454, $272C + dw $0454, $272E + dw $0454, $274E + dw $0454, $2750 + dw $0459, $27CE + dw $0459, $27D0 + dw $045E, $27AE + dw $045E, $27D2 + dw $0476, $2522 + dw $0486, $26B0 + dw $0487, $26B2 + dw $048E, $2730 + dw $048F, $2732 + dw $0494, $27B0 + dw $0495, $27B2 + dw $0499, $282C + dw $049E, $27B4 + dw $04BA, $2CB4 + dw $04BA, $2EB4 + dw $04BB, $2F34 + dw $04CA, $27AC + dw $04D7, $2528 + dw $0608, $2752 + + dw !OWW_CustomCommand, .map1B_check_aga + + dw $046D, $243E + dw $0E39, $2440 + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(4) + dw $0E3A, $24BC ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(4) + dw $0E3E, $253C ; tile, start + + dw $0490, $25BE + dw $0491, $25C0 + +.map1B_no_hole + ; add sign for tower entry + dw $0101, $222C + dw $0101, $2252 + + dw !OWW_END + +.map1B_check_aga + LDA.l OverworldEventDataWRAM+$5B + AND.w #$0020 + BNE ++ + + LDY.w #.map1B_no_hole + +++ RTS + +;--------------------------------------------------------------------------------------------------- + +.map29 + dw !OWW_InvertedOnly + + ; singles + dw $0036, $2386 + + dw !OWW_ArbTileCopy + dw $0034 ; tile + dw $2288, $2308, $2388, $2408 + dw $2488, $248A|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- +.map30 + dw !OWW_InvertedOnly + + dw $0178, $224E + dw $00D3, $22E2 + dw $0302, $22E4 + dw $00AA, $2368 + dw $00AB, $236C + dw $01C2, $245C + dw $015C, $23E0 + dw $0218, $245E + dw $0162, $2460 + dw $0105, $255A + dw $01D4, $24DC + dw $0219, $24DE + dw $0171, $25DE + dw $0166, $255E + dw $0766, $2560 + dw $06E1, $27D6 + dw $00CF, $27DA + dw $0034, $3D94 + + dw !OWW_ArbTileCopy + dw $017E + dw $2050, $20CE|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(7) + dw $00D1, $2052 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(6) + dw $00D1, $21E6 + + dw !OWW_ArbTileCopy + dw $00D2 + dw $2060, $20E2, $2164|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0183 + dw $20D0, $214E|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(7) + dw $00C9, $20D2 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(7) + dw $00C9, $2152 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(6) + dw $00C9, $2266 + dw $00C9, $22CC + + dw !OWW_ArbTileCopy + dw $00D0 + dw $20E0, $2162, $21E4|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(3) + dw $0153, $2150 + + dw !OWW_ArbTileCopy + dw $0153 + dw $21CE, $22CE|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $00C8 + dw $2160, $21E2, $2264, $28DA, $295C|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $00CA + dw $21E0, $2262, $285A, $28DC|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(7) + dw $00DC, $21D2 + dw $00DC, $224C + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(2) + dw $00E3, $2252 + + dw !OWW_ArbTileCopy + dw $0186 + dw $22D0, $234E|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(4) + dw $0034, $22D2 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(7) + dw $0034, $22D4 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(7) + dw $0034, $22D6 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(2) + dw $0034, $2350 + + dw !OWW_ArbTileCopy + dw $0034 + dw $2458, $2656|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(6) + dw $00CC, $22E6 + dw $00CC, $234C + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(2) + dw $00CE, $2362 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(4) + dw $00CE, $25D8 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(2) + dw $00C5, $2364 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(4) + dw $00C5, $25DC + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(4) + dw $06AB, $2366 + + dw !OWW_ArbTileCopy + dw $06AB + dw $24E4, $2760|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0384 + dw $236A, $236E, $23EC, $246A|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $0384, $24E8 + + dw !OWW_ArbTileCopy + dw $0759 + dw $23C8, $244A, $24CC, $254E, $26D0, $2752, $27D4|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0757 + dw $23CA, $244C, $24CE, $2550, $26D2, $2754|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $01FF + dw $23CC, $244E, $24D0, $2652, $26D4, $2756|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $017C + dw $23CE, $2450, $24D2, $2654, $26D6|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0100 + dw $245A, $24D8|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0104 + dw $24DA, $2558|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0106 + dw $2462, $24E0, $255C|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0107 + dw $2464, $24E2|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(2) + dw $0179, $2552 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(8) + dw $06B4, $2562 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(2) + dw $06E5, $25D0 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(4) + dw $00C4, $25DA + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(7) + dw $0165, $25E4 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(2) + dw $06E4, $27D2 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(2) + dw $06E4, $2854 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(3) + dw $06E4, $2856 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(2) + dw $06E4, $2958 + dw $06E4, $29DA + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(2) + dw $02FD, $27D8 + + dw !OWW_ArbTileCopy + dw $06E7 + dw $28D8, $295A, $29DC|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map32 + dw !OWW_InvertedOnly + + dw !OWW_Stripe|!OWW_Vertical + dw $2486 + dw $01D5, $0165, $00C6|!OWW_STOP + + dw $0166, $2508 + dw $0171, $2588 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(5) + dw $00C6, $2608 + + dw $0166, $258A + dw $016A, $278C + dw $016A, $280C + dw $00C6, $2806 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(5) + dw $021C, $260A + + dw !OWW_ArbTileCopy + dw $0034 + dw $270E, $278E, $2790, $2918, $291A, $2998, $299A, $291C, $291E, $2920|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(8) + dw $0034, $280E + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(7) + dw $0034, $2892 + + dw !OWW_Stripe|!OWW_Horizontal + dw $288C + dw $01FA, $0034, $00DA|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $290C + dw $0186 + dw $0034, $0034, $0034 + dw $0036, $0036|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(7) + dw $0034, $2818 + + dw !OWW_Stripe|!OWW_Horizontal + dw $2986 + dw $00E4, $00E5, $0186 + dw $0034, $0034, $0034, $0034 + dw $0036, $0036 + dw $0034, $0034 + dw $00DA + dw $0034, $0034 + dw $0100|!OWW_STOP + + dw $0186, $2A04 + + ; a couple of these will be overwritten in a second + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(13) + dw $0034, $2A06 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(13) + dw $0034, $2A84 + + ; leave these after the above + dw $0071, $2A0E + dw $0071, $2A1A + dw $0035, $2A8C + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(5) + dw $0034, $2B84 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(6) + dw $0034, $2C86 + + dw !OWW_ArbTileCopy + dw $0034 ; tile + dw $2B06, $2B0A, $2B0E, $2B12 + dw $2B1A, $2B92, $2B94 + dw $2B98, $2B9A, $2C04, $2C08 + dw $2C0A, $2C0E, $2C12, $2C14 + dw $2C18, $2C98 + dw $2D0A, $2D0C, $2D10, $2D14 + dw $2D16, $2D8A, $2D8C, $2D8E + dw $2C94, $2C92, $2B8E + dw $2D94|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0035 ; tile + dw $2B08, $2C06, $2D0E, $2D90|!OWW_STOP + + dw $0104, $2A22 + dw $01D4, $2A24 + dw $00F8, $2C1A + dw $00CE, $2C1C + dw $0071, $2C8C + dw $00CE, $2C9C + dw $0167, $2D04 + dw $0036, $2D12 + dw $0167, $2D86 + dw $0172, $2E08 + dw $0174, $2E16 + + dw !OWW_ArbTileCopy + dw $00DA ; tile + dw $2B14, $2B16, $2B18, $2B96 + dw $2C16, $2C96, $2D08, $2D92|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $00E2 ; tile + dw $2B04, $2B0C, $2B10, $2B8C, $2B90 + dw $2C0C, $2C10, $2C8E|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $015C ; tile + dw $2A20, $2A9E, $2B1C, $2C9A, $2D18 + dw $2D96|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $015E ; tile + dw $2E0A, $2E0C, $2E0E, $2E10 + dw $2E12, $2E14|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0160 ; tile + dw $2C84, $2D06, $2D88|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0162 ; tile + dw $2AA0, $2B1E, $2B9C, $2D1A + dw $2D98|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $016A ; tile + dw $2A82, $2B02, $2B82, $2C02 + dw $2C82|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map33 + dw !OWW_InvertedOnly + + dw $0034, $22A8 + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map35 + dw !OWW_InvertedOnly + + dw !OWW_Stripe|!OWW_Vertical + dw $2BB0 + dw $02F1, $0184, $0392, $0394|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2BB2 + dw $02F2, $0185, $0393, $0395|!OWW_STOP + + dw $0034, $2F56 + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map3A + dw !OWW_InvertedOnly + + dw !OWW_Stripe|!OWW_Horizontal + dw $2800 + dw $0774, $06E1, $0757|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2880 + dw $0779, $02EC, $0759, $0757|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2900 + dw $02E5, $02E5, $02E5, $0759, $076A|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2980 + dw $02F3, $02F3, $02F1, $02F2, $038A|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(4) + dw $0184, $2A04 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(4) + dw $0185, $2A06 + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map43 + dw !OWW_SkipIfInverted, .map43_inverted + dw $0101, $2550 ; GT sign + + .map43_inverted + dw !OWW_InvertedOnly + + dw $0212, $2BE0 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(5) + dw $0E96, $235E + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(5) + dw $0E97, $2360 + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(2) + dw $0E94, $25DE ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(2) + dw $0180, $275E + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(2) + dw $0184, $27DE + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(2) + dw $0185, $27E0 + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- +.map45 + dw !OWW_InvertedOnly + + dw $0239, $3D4A + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map47 + dw !OWW_InvertedOnly + + dw $0398, $25A0 + dw $0522, $25A2 + dw $0125, $2620 + dw $0126, $2622 + dw $0239, $269E + dw $0239, $26A4 + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map50 + dw !OWW_InvertedOnly + + dw $020F, $2B2E + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map54 + dw !OWW_InvertedOnly + + dw !OWW_Stripe|!OWW_Vertical + dw $2422 + dw $02F3, $00C9, $00E3|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2424 + dw $02F3, $00C9, $00E3|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +; Pyramid +.map5B + dw !OWW_SkipIfInverted, .map5B_inverted_mode + + dw $0101, $27B6 ; sign to statue + dw $05C2, $27B4 ; peg left of sign + +.map5B_inverted_mode + dw !OWW_InvertedOnly + + dw $0323, $39B6 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $0324, $39B8 + + dw $02FE, $3A34 + dw $02FF, $3A36 + dw $0235, $3BB4 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $0326, $3A38 + + dw !OWW_Stripe|!OWW_Horizontal + dw $3AB2 + dw $039D, $0303, $0232 + dw $0233, $0233, $0233, $0233|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $3B32 + dw $03A2, $0232, $0235, $046A + dw $0333, $0333, $0333|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0034 ; tile + dw $3BB6, $3BBA, $3BBC, $3C3A + dw $3C3C, $3C3E|!OWW_STOP + + + ; pegs + dw !OWW_ArbTileCopy + dw $0034 ; tile + dw $321C, $329C, $32A0|!OWW_STOP + + dw $00E2, $321A + dw $0071, $321E + dw $00DA, $3220 + + dw $00DA, $329A + dw $00E1, $329E + + dw $0382, $3318 + dw $037C, $3322 + + dw $00F2, $3BB8 + dw $0108, $3C38 + + dw !OWW_ArbTileCopy + dw $021B ; tile + dw $3218, $3222, $3298, $32A2 + dw $331A, $331C, $331E, $3320|!OWW_STOP + + + dw !OWW_CustomCommand, .map5B_pick_warp_tile + + dw !OWW_Stripe|!OWW_Horizontal + dw $39C0 ; start + dw $0324, $0324, $0324, $0325, $02D5 + dw !OWW_SKIP, $02CC|!OWW_STOP + + dw $02CC, $39D4 + + dw !OWW_Stripe|!OWW_Horizontal + dw $3A40 ; start + dw $0326, $0326, $0326 + dw $0327, $02F7, !OWW_SKIP + dw $02E3, $02E3|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $3AC0 ; start + dw $0233, $0233, $0233, $0234 + dw $02F6, $0396|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $3B40 + dw $0333, $0333, $03AA, $03A3 + dw $0234, $0397|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $3BC0 ; start + dw $0034, $0034, $029C, $0034 + dw $03A3|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $3C40 ; start + dw $0034, $0034, $010A|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(17) + dw $010B, $3C46 + + dw !OWW_END + +.map5B_pick_warp_tile + LDA.l ProgressIndicator + AND.w #$00FF + CMP.w #$0003 + + LDA.w #$0034 + BCC ++ + + LDA.w #$0212 + +++ STA.l $7E3BBE + + RTS + +;--------------------------------------------------------------------------------------------------- + +.map6F + dw !OWW_InvertedOnly + + dw $020F, $2BB2 + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map70 + dw !OWW_InvertedOnly + + dw $0239, $3D94 + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map73 + dw !OWW_InvertedOnly + + dw $020F, $22A8 + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map75 + dw !OWW_InvertedOnly + + ; singles + dw $0239, $2F50 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $0BA3, $3054 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $0BA3, $3254 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(3) + dw $0BAD, $30D6 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(3) + dw $0BA9, $30D8 + + dw !OWW_Stripe|!OWW_Vertical + dw $30D4 ; start + dw $0BAC, $0BC5, $0BCA|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $30DA ; start + dw $0BAA, $0BC8, $0BCD|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0BA3 ; tile + dw $2F52, $2FCE, $2FD0|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +;=================================================================================================== diff --git a/invertedmaps2.asm b/invertedmaps2.asm new file mode 100644 index 0000000..b441c8f --- /dev/null +++ b/invertedmaps2.asm @@ -0,0 +1,1147 @@ +OverworldMapChangePointers2: + ; light world + dw $0000 ; 00 + dw $0000 ; 01 + dw $0000 ; 02 + dw .map03 ; 03 + dw $0000 ; 04 + dw .map05 ; 05 + dw $0000 ; 06 + dw .map07 ; 07 + dw $0000 ; 08 + dw $0000 ; 09 + dw $0000 ; 0A + dw $0000 ; 0B + dw $0000 ; 0C + dw $0000 ; 0D + dw $0000 ; 0E + dw $0000 ; 0F + dw .map10 ; 10 + dw $0000 ; 11 + dw $0000 ; 12 + dw $0000 ; 13 + dw .map14 ; 14 + dw $0000 ; 15 + dw $0000 ; 16 + dw $0000 ; 17 + dw $0000 ; 18 + dw $0000 ; 19 + dw .map1A ; 1A + dw .map1B ; 1B + dw $0000 ; 1C + dw $0000 ; 1D + dw $0000 ; 1E + dw $0000 ; 1F + dw $0000 ; 20 + dw $0000 ; 21 + dw .map22 ; 22 + dw $0000 ; 23 + dw $0000 ; 24 + dw $0000 ; 25 + dw $0000 ; 26 + dw $0000 ; 27 + dw $0000 ; 28 + dw .map29 ; 29 + dw $0000 ; 2A + dw $0000 ; 2B + dw $0000 ; 2C + dw $0000 ; 2D + dw $0000 ; 2E + ;dw .map2F ; 2F + dw $0000 ; 2F + dw .map30 ; 30 + dw $0000 ; 31 + dw .map32 ; 32 + ;dw .map33 ; 33 + dw $0000 ; 33 + dw $0000 ; 34 + dw .map35 ; 35 + dw $0000 ; 36 + dw $0000 ; 37 + dw $0000 ; 38 + dw $0000 ; 39 + dw .map3A ; 3A + dw $0000 ; 3B + dw $0000 ; 3C + dw $0000 ; 3D + dw $0000 ; 3E + dw .map3F ; 3F + + ; dark world + dw $0000 ; 40 + dw $0000 ; 41 + dw $0000 ; 42 + dw .map43 ; 43 + dw $0000 ; 44 + dw .map45 ; 45 + dw $0000 ; 46 + dw .map47 ; 47 + dw $0000 ; 48 + dw $0000 ; 49 + dw $0000 ; 4A + dw $0000 ; 4B + dw $0000 ; 4C + dw $0000 ; 4D + dw $0000 ; 4E + dw $0000 ; 4F + dw .map50 ; 50 + dw $0000 ; 51 + dw $0000 ; 52 + dw $0000 ; 53 + dw $0000 ; 54 + dw $0000 ; 55 + dw $0000 ; 56 + dw $0000 ; 57 + dw $0000 ; 58 + dw $0000 ; 59 + dw .map5A ; 5A + dw .map5B ; 5B + dw $0000 ; 5C + dw $0000 ; 5D + dw $0000 ; 5E + dw $0000 ; 5F + dw $0000 ; 60 + dw $0000 ; 61 + dw .map62 ; 62 + dw $0000 ; 63 + dw $0000 ; 64 + dw $0000 ; 65 + dw $0000 ; 66 + dw $0000 ; 67 + dw $0000 ; 68 + dw $0000 ; 69 + dw $0000 ; 6A + dw $0000 ; 6B + dw $0000 ; 6C + dw $0000 ; 6D + dw $0000 ; 6E + dw .map6F ; 6F + dw .map70 ; 70 + dw $0000 ; 71 + dw $0000 ; 72 + dw .map73 ; 73 + dw $0000 ; 74 + dw .map75 ; 75 + dw $0000 ; 76 + dw $0000 ; 77 + dw $0000 ; 78 + dw $0000 ; 79 + dw $0000 ; 7A + dw $0000 ; 7B + dw $0000 ; 7C + dw $0000 ; 7D + dw $0000 ; 7E + dw .map7F ; 7F + +;--------------------------------------------------------------------------------------------------- + +.map03 + dw !OWW_InvertedOnly + + ; singles + dw $0034, $2BE0 ; portal + + dw !OWW_SkipIfFlagSet + dl WarningFlags + db $20 + dw ReliableOWWSentinel + + dw !OWW_Stripe|!OWW_Horizontal + dw $29B6 ; address + dw $021A, $01F3, $00A0, $0104|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $00C6 ; tile + dw $2A34, $2A38, $2A3A|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map05 + dw $0101, $2E18 ; OWG sign + + dw !OWW_InvertedOnly + + dw $0034, $3D4A ; portal + + dw !OWW_SkipIfFlagSet + dl WarningFlags + db $20 + dw .map05_spiral_mimic_ledge + + ; singles + dw $0034, $21F2 + dw $0116, $216E + dw $0126, $21F4 + + dw $0139, $2C6C + dw $014B, $2C6E + dw $016B, $29F0 + dw $016B, $2CEC + dw $0182, $29F2 + dw $0182, $2CEE + + dw !OWW_Stripe|!OWW_Horizontal + dw $206E ; address + dw $0111, $0113, $0113, $0112|!OWW_STOP + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(2) + dw $0111, $20EC ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(3) + dw $0116, $20F0 ; tile, start + + dw !OWW_Stripe|!OWW_Horizontal + dw $216C ; address + dw $0112, $0116, $011C, $011D, $011E|!OWW_STOP + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(3) + dw $011C, $2170 ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(2) + dw $0123, $21EC ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(4) + dw $0144, $2364 ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(2) + dw $01B3, $236C ; tile, start + + dw !OWW_Stripe|!OWW_Horizontal + dw $2970 ; address + dw $0139, $014B|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0130 ; tile + dw $21E2, $21F0, $22E2, $22F0|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0135 ; tile + dw $2262, $2270, $2362, $2370|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0136 ; tile + dw $2264, $2266, $226C, $226E|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0137 ; tile + dw $2268, $226A|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $22E4 ; start + dw $013C, $013C, $013D, $013D, $013C, $013C|!OWW_STOP + +.map05_spiral_mimic_ledge + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(8) + dw $00E3, $2BDC ; tile, start + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(2) + dw $014E, $2C5C ; tile, start + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $014E, $2C64 ; tile, start + + dw !OWW_Stripe|!OWW_Horizontal + dw $2C60 ; start + dw $0139, $014B|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(2) + dw $0152, $2CDC ; tile, start + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $0152, $2CE4 ; tile, start + + dw !OWW_Stripe|!OWW_Horizontal + dw $2CE0 ; start + dw $016B, $0182|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(8) + dw $022E, $2D5C ; tile, start + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(3) + dw $0230, $2DDC ; tile, start + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(3) + dw $0230, $2DE6 ; tile, start + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(2) + dw $02A6, $2DE2 ; tile, start + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map07 + dw !OWW_InvertedOnly + + ; ledge barrier + dw !OWW_Stripe|!OWW_Horizontal + dw $251C ; start + dw $0163, $0152, $0152, $0152, $0152, $01F2|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $259A ; start + dw $0163, $011C, $011D, $011D, $011D, $011D, $011E, $01F2|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2618 ; start + dw $0163, $0124, $0124, $0124, $0124, $0124, $0140|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $262A ; start + dw $01F2, $0127, $0127, $0127, $0127, $0127, $0150|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $299A ; start + dw $0161, $0141, $014E, $014E, $014E, $014E, $014F, $0150|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0125 ; tile + dw $261C, $269A|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0126 ; tile + dw $2626, $26A8|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0139 ; tile + dw $289A, $291C|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $014B ; tile + dw $28A8, $2926|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0152 ; tile + dw $2A1E, $2A24|!OWW_STOP + + dw $011C, $261A + dw $011E, $2628 + dw $00CE, $2896 + dw $016A, $28AC + dw $0141, $291A + dw $014F, $2928 + dw $0161, $2A1C + dw $0150, $2A26 + dw $021B, $2620 ; moved peg + + dw !OWW_SkipIfFlagSet + dl OverworldEventDataWRAM+$07 + db $10 + dw ReliableOWWSentinel + + ; replace ladder with mountainside + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(2) + dw $0152, $2A20 ; tile, start + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(2) + dw $00E3, $2AA0 ; tile, start + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map10 + dw !OWW_InvertedOnly + + dw $0034, $2B2E + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map14 + dw !OWW_InvertedOnly + + dw !OWW_SkipIfFlagSet + dl WarningFlags + db $20 + dw ReliableOWWSentinel + + dw !OWW_Stripe|!OWW_Vertical + dw $2422 + dw $02F1, $0184, $0184|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2424 + dw $02F2, $0185, $0185|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map1A + dw !OWW_SkipIfNotFlagSet + dl OWTileMapAlt+$1A + db $02 + dw ReliableOWWSentinel + + ; rocks for hardlock protection + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(2) + dw $02F8, $2FBC ; tile, start + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map1B + dw !OWW_SkipIfNotFlagSet + dl OWTileMapAlt+$1B + db $02 + dw .map1B_inverted + + ; rocks for hardlock protection + dw !OWW_Stripe|!OWW_Vertical + dw $2FFE ; start + dw $039A, $039B|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2F80 ; start + dw $02FA, $030A, $030D|!OWW_STOP + +.map1B_inverted + dw !OWW_InvertedOnly + + ; Eye removed + dw !OWW_ArbTileCopy + dw $046D ; tile + dw $243E, $24BC, $24BE, $253E + dw $2440, $24C0, $24C2, $2540|!OWW_STOP + + ; New trees + dw !OWW_Stripe|!OWW_Vertical + dw $2DAA ; address + dw $0034, $04BA, $04BB, $0034|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2DB0 ; address + dw $0034, $04BA, $04BB, $0034|!OWW_STOP + + ; New HC door + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(2) + dw $044F, $201C ; tile, start + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(2) + dw $0455, $209C ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(4) + dw $045A, $211A ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(4) + dw $0463, $219A ; tile, start + + ; Bat hole + dw !OWW_SkipIfNotFlagSet + dl OverworldEventDataWRAM+$5B + db $20 + dw .map1B_no_hole + + dw $046D, $243E + dw $0E39, $2440 + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(4) + dw $0E3A, $24BC ; tile, start + + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(4) + dw $0E3E, $253C ; tile, start + + dw $0490, $25BE + dw $0491, $25C0 + +.map1B_no_hole + dw $0101, $2252 ; goal sign + + dw !OWW_SkipIfNotFlagSet + dl SwapAgaGanonsTower + db $01 + dw #ReliableOWWSentinel + + dw $0101, $222C ; tower entry sign + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map22 + dw !OWW_SkipIfNotFlagSet + dl OWTileMapAlt+$22 + db $02 + dw ReliableOWWSentinel + + ; rocks for hardlock protection + dw $02B9, $203C + dw $0309, $203E + dw $030E, $20BE + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map29 + dw !OWW_InvertedOnly + + ; singles + dw $0034, $248A ; remove bush + dw $0036, $2386 ; add bush + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +; .map2F +; dw !OWW_InvertedOnly + +; dw $0034, $2BB2 ; add portal + +; dw !OWW_END + +;--------------------------------------------------------------------------------------------------- +.map30 + dw !OWW_InvertedOnly + + dw $0034, $3D94 ; remove portal + + dw !OWW_SkipIfFlagSet + dl WarningFlags + db $20 + dw ReliableOWWSentinel + + ; Checkerboard cave mods + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(6) + dw $00D1, $2052 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(6) + dw $00C9, $20D2 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(6) + dw $00DC, $2152 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(6) + dw $00D1, $2266 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(6) + dw $0721, $22E6 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(6) + dw $00CC, $2366 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $0384, $25E6 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(8) + dw $06B4, $2662 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(9) + dw $0165, $26E0 + + dw !OWW_Stripe|!OWW_Horizontal + dw $2460 ; address + dw $00A3, $00D5, $00C5, $063D, $0384, $00AB, $0384|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2552 ; address + dw $06E5, $063D, $06AB, $0109, $06AA, $06AA, $06AA + dw $010C, $0106, $0107, $06AB, $0384|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $25D2 ; address + dw $06E5, $06AB, $0109, $010C, $06A7, $06A7 + dw $06A7, $0106, $0107, $06AB|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2652 ; address + dw $06E5, $06AB, $010C, $0105, $0106, $0165, $0166, $0766|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $24E0 ; address + dw $0109, $00D5, $00C5|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $224C ; address + dw $00DC, $00C9, $0386, $0759|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $21CE ; address + dw $0153, $0153, $0153, $0256, $0757, $0759|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2150 ; address + dw $0153, $0178, $0153, $0256, $06AB, $06AB, $0757, $0759|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $26D2 ; address + dw $06E5, $06E5, $06E5, $0759|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $26D6 ; address + dw $00D5, $00D5, $00D5, $00D5, $01E9|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $26D8 ; address + dw $00C4, $00CF, $0302, $00C5|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $20DE ; address + dw $00D0, $00C8, $00CA, $00C8, $00DB|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2160 ; address + dw $00D0, $00C8, $00CA, $00C8, $00DB, $009E|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $21E2 ; address + dw $00D0, $00C8, $00CA, $00D3, $00CE|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2264 ; address + dw $00D0, $00C8, $0302, $00C5|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $06AB + dw $23D2, $23E6, $2452, $2454, $24D4 + dw $24E6, $26D4, $2754, $27D4|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $00D2 + dw $205E, $20E0, $2162, $21E4, $275C|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $017E + dw $2050, $20CE|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0183 + dw $20D0, $214E|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0384 + dw $24D8, $24EA|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0757 + dw $24D2, $2854|!OWW_STOP + + dw $00AB, $2352 + dw $0171, $26DE + dw $0759, $28D4 + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map32 + dw !OWW_InvertedOnly + + dw !OWW_SkipIfFlagSet + dl WarningFlags + db $20 + dw ReliableOWWSentinel + + ; Cave 45 mods + dw $01D5, $2486 + dw $0165, $2506 + dw $0166, $2508 + dw $0220, $278C + dw $075E, $299A + dw $00AB, $299C + dw $0BDB, $2C0A + + dw !OWW_Stripe|!OWW_Horizontal + dw $2586 + dw $00C6, $0171, $0166|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2A1A + dw $075F, $00C6, $01E5, $077E|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2A9A + dw $0775, $01E5, $077E, $0106, $0165|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2B1A + dw $075F, $077E, $0106, $0107, $00C6|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2B9C + dw $00D5, $00C5, $00C6|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $009F, $2812 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $06E1, $2890 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $0034, $29A2 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(4) + dw $00C6, $2608 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(4) + dw $021C, $260A + + dw !OWW_ArbTileCopy + dw $0167 + dw $2488, $250A, $258C, $2A28, $2AAA, $2B2C, $2BAE|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0160 + dw $248A, $250C, $2A2A, $2AAC, $2B2E|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $017C + dw $270E, $2790, $281A, $289C, $291E, $29A0|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $01FF + dw $278E, $2810, $289A, $291C, $299E|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0757 + dw $280E, $2898, $291A|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0034 + dw $281C, $289E, $2920|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0759 + dw $288E, $2918, $2B9A|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $02EC + dw $2A8A, $2A8E, $2A92, $2A94, $2A96, $2C0C|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0789 + dw $2B0A, $2B0E, $2B14, $2B94|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $02EB + dw $2B12, $2B16, $2C8C, $2C94|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0BDC + dw $2B8A, $2B8E, $2C0E, $2C14|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +; .map33 +; dw !OWW_InvertedOnly + +; dw $0034, $22A8 ; remove portal + +; dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map35 + dw !OWW_InvertedOnly + + dw $0034, $2F56 ; remove portal + + dw !OWW_SkipIfFlagSet + dl WarningFlags + db $20 + dw ReliableOWWSentinel + + dw !OWW_Stripe|!OWW_Vertical + dw $2BB0 + dw $02F1, $0184, $0392, $0394|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2BB2 + dw $02F2, $0185, $0393, $0395|!OWW_STOP + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map3A + dw !OWW_InvertedOnly + + dw !OWW_SkipIfFlagSet + dl WarningFlags + db $20 + dw ReliableOWWSentinel + + dw $0964, $2984 + dw $017E, $2986 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(4) + dw $0184, $2A04 + + dw !OWW_StripeRLE|!OWW_Vertical|OWW_RLESize(4) + dw $0185, $2A06 + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map3F + dw !OWW_SkipIfNotFlagSet + dl OWTileMapAlt+$3F + db $02 + dw ReliableOWWSentinel + + dw !OWW_SkipIfFlagSet + dl OWTileWorldAssoc+$3F + db $40 + dw ReliableOWWSentinel + + dw !OWW_StripeRLEINC|!OWW_Vertical|OWW_RLESize(2) + dw $075C, $2A9A ; tile, start + + dw !OWW_Stripe|!OWW_Horizontal + dw $2A22 + dw $0752, $0753, $02E5|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2A9E + dw $0774, $06E1, $0757, $06E3, $02E5|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2B1E + dw $076E, $02E5, $0759, $0779|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2B9E + dw $076C, $02EC, $06F5, $0705|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2C1E + dw $0704, $06F6, $06F7, $06E3|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2CA2 + dw $0762, $0773|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $02EC ; tile + dw $29A4, $2C16|!OWW_STOP + + dw $075E, $2B9A + dw $076F, $2C1A + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map43 + dw !OWW_SkipIfFlagSet + dl SwapAgaGanonsTower + db $01 + dw .map43_atgt_swapped + + dw $0101, $2550 ; GT sign + dw !OWW_SkipAhead, .map43_inverted + +.map43_atgt_swapped + ; GT entrance auto-opened + dw !OWW_Stripe|!OWW_Vertical + dw $235E ; start + dw $08D5, $08E3, $0E90, $0E96, $0E96|!OWW_STOP + + dw !OWW_Stripe|!OWW_Vertical + dw $2360 ; start + dw $08D6, $08E4, $0E91, $0E97, $0E97|!OWW_STOP + +.map43_inverted + dw !OWW_InvertedOnly + + dw $0212, $2BE0 ; add portal + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- +.map45 + dw !OWW_InvertedOnly + + dw $0239, $3D4A ; add portal + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map47 + dw !OWW_InvertedOnly + + ; portals + dw $0239, $269E + dw $0239, $26A4 + + dw !OWW_SkipIfFlagSet + dl WarningFlags + db $20 + dw ReliableOWWSentinel + + ; Turtle tail hop + dw $0398, $25A0 + dw $0522, $25A2 + dw $0125, $2620 + dw $0126, $2622 + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map50 + dw !OWW_InvertedOnly + + dw $020F, $2B2E ; add portal + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map5A + dw !OWW_SkipIfNotFlagSet + dl OWTileMapAlt+$5A + db $02 + dw ReliableOWWSentinel + + ; rocks for hardlock protection + dw !OWW_StripeRLEINC|!OWW_Horizontal|OWW_RLESize(2) + dw $02F8, $2FBC ; tile, start + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +; Pyramid +.map5B + dw !OWW_SkipIfNotFlagSet + dl OWTileMapAlt+$5B + db $02 + dw .map5B_continue + + ; rocks for hardlock protection + dw !OWW_Stripe|!OWW_Vertical + dw $2F80 ; start + dw $02FA, $030A, $030D|!OWW_STOP + + dw !OWW_StripeRLEINC|!OWW_Vertical|OWW_RLESize(2) + dw $039A, $2FFE ; tile, start + +.map5B_continue + dw !OWW_SkipIfInverted, .map5B_inverted + + dw $0101, $27B6 ; sign to statue + dw $05C2, $27B4 ; peg left of sign + + dw !OWW_InvertedOnly + +.map5B_inverted + ; Seal pyramid entrance + dw !OWW_Stripe|!OWW_Horizontal + dw $2E1C + dw $0A06, $0A0E|!OWW_STOP + + ; South pyramid terrain + dw $0323, $39B6 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $0324, $39B8 + + dw $02FE, $3A34 + dw $02FF, $3A36 + dw $0235, $3BB4 + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(4) + dw $0326, $3A38 + + dw !OWW_Stripe|!OWW_Horizontal + dw $3AB2 + dw $039D, $0303, $0232 + dw $0233, $0233, $0233, $0233|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $3B32 + dw $03A2, $0232, $0235, $046A + dw $0333, $0333, $0333|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $0034 ; tile + dw $3BB6, $3BBA, $3BBC, $3C3A + dw $3C3C, $3C3E|!OWW_STOP + + dw $00F2, $3BB8 + dw $0108, $3C38 + + dw !OWW_Stripe|!OWW_Horizontal + dw $39C0 ; start + dw $0324, $0324, $0324, $0325, $02D5 + dw !OWW_SKIP, $02CC|!OWW_STOP + + dw $02CC, $39D4 + + dw !OWW_Stripe|!OWW_Horizontal + dw $3A40 ; start + dw $0326, $0326, $0326 + dw $0327, $02F7, !OWW_SKIP + dw $02E3, $02E3|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $3AC0 ; start + dw $0233, $0233, $0233, $0234 + dw $02F6, $0396|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $3B40 + dw $0333, $0333, $03AA, $03A3 + dw $0234, $0397|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $3BC0 ; start + dw $0034, $0034, $029C, $0034 + dw $03A3|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $3C40 ; start + dw $0034, $0034, $010A|!OWW_STOP + + dw !OWW_StripeRLE|!OWW_Horizontal|OWW_RLESize(17) + dw $010B, $3C46 + + dw !OWW_CustomCommand, .map5B_pick_warp_tile + + dw !OWW_END + +.map5B_pick_warp_tile + LDA.l ProgressIndicator + AND.w #$00FF + CMP.w #$0003 + + LDA.w #$0034 + BCC ++ + + LDA.w #$0212 + +++ STA.l $7E3BBE + + RTS + +;--------------------------------------------------------------------------------------------------- + +.map62 + dw !OWW_SkipIfNotFlagSet + dl OWTileMapAlt+$62 + db $02 + dw ReliableOWWSentinel + + ; rocks for hardlock protection + dw $02B9, $203C + dw $0309, $203E + dw $030E, $20BE + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map6F + dw !OWW_InvertedOnly + + dw $020F, $2BB2 ; add portal + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map70 + dw !OWW_InvertedOnly + + dw $0239, $3D94 ; add portal + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map73 + dw !OWW_InvertedOnly + + dw $020F, $22A8 ; add portal + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map75 + dw !OWW_InvertedOnly + + dw $0239, $3352 ; add portal + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +.map7F + dw !OWW_SkipIfNotFlagSet + dl OWTileMapAlt+$7F + db $02 + dw ReliableOWWSentinel + + dw !OWW_SkipIfFlagSet + dl OWTileWorldAssoc+$7F + db $40 + dw ReliableOWWSentinel + + dw !OWW_StripeRLEINC|!OWW_Vertical|OWW_RLESize(2) + dw $075C, $2A9A ; tile, start + + dw !OWW_Stripe|!OWW_Horizontal + dw $2A22 + dw $0752, $0753, $02E5|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2A9E + dw $0774, $06E1, $0757, $06E3, $02E5|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2B1E + dw $076E, $02E5, $0759, $0779|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2B9E + dw $076C, $02EC, $06F5, $0705|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2C1E + dw $0704, $06F6, $06F7, $06E3|!OWW_STOP + + dw !OWW_Stripe|!OWW_Horizontal + dw $2CA2 + dw $0762, $0773|!OWW_STOP + + dw !OWW_ArbTileCopy + dw $02EC ; tile + dw $29A4, $2C16|!OWW_STOP + + dw $075E, $2B9A + dw $076F, $2C1A + + dw !OWW_END + +;--------------------------------------------------------------------------------------------------- + +;=================================================================================================== + +Overworld_InvertedTRPuzzle: +{ + REP #$30 + LDA.l OWTileMapAlt+07 : AND #$00FF : BNE .inverted + LDA.w #$0212 : LDX.w #$0720 : STA.l TileMapA,X ; what we wrote over + JSL Overworld_MemorizeMap16Change : JSL Overworld_DrawPersistentMap16+4 ; what we wrote over + RTL + + ; removes barriers from TR Peg Puzzle Ledge + .inverted + LDA.w #$0184 : LDX.w #$0A20 : JSL Overworld_DrawPersistentMap16 + LDA.w #$0184 : LDX.w #$0AA0 : JSL Overworld_DrawPersistentMap16 + LDA.w #$0185 : LDX.w #$0A22 : JSL Overworld_DrawPersistentMap16 + LDA.w #$0185 : LDX.w #$0AA2 : JSL Overworld_DrawPersistentMap16 + RTL +} \ No newline at end of file diff --git a/invertedstatic.asm b/invertedstatic.asm index 01c4f52..18500f8 100644 --- a/invertedstatic.asm +++ b/invertedstatic.asm @@ -1,9 +1,9 @@ ;Statically mapped at $A1A000 Referenced by the front end. Do not move without coordination. InvertedTileAttributeLookup: SEP #$20 - LDA $8A : CMP.b #$47 : BEQ .turtleRock - LDA Overworld_TileAttr, X - JML.l Overworld_GetTileAttrAtLocation_continue + LDA.b OverworldIndex : CMP.b #$47 : BEQ .turtleRock + LDA.l Overworld_TileAttr, X + JML Overworld_GetTileAttrAtLocation_continue .turtleRock - LDA Inverted_TR_TileAttributes, X - JML.l Overworld_GetTileAttrAtLocation_continue + LDA.l Inverted_TR_TileAttributes, X + JML Overworld_GetTileAttrAtLocation_continue diff --git a/itemdatatables.asm b/itemdatatables.asm new file mode 100644 index 0000000..53d3de4 --- /dev/null +++ b/itemdatatables.asm @@ -0,0 +1,1750 @@ +;------------------------------------------------------------------------------ +; Item Data Tables +;------------------------------------------------------------------------------ +; This module contains several statically mapped tables related to items, item +; receipts, and item graphics. There are 256 item receipt indexes and the tables are +; written column-major, meaning each "column" property of every table entry is +; written adjacent to each other (e.g., ItemReceipts_offset_y is one byte per item. +; All 256 bytes for each item are written in receipt ID order, then 256 bytes are +; written for ItemReceipts_offset_x, etc.) The addresses and description of each +; table and column are described immediately below. The tables themselves are below +; the documentation. +; +; The tables and documentation here should provide the knowledge and capability +; to add an item into an unclaimed receipt ID or replace some existing items, although +; you should prefer to use unclaimed space or reuse randomizer item slots as some +; vanilla behavior is still hard-coded. +; +; Some of the entries in these tables are word-length vectors, or pointers to +; code the randomizer ROM runs on item pickup or resolution (e.g., resolving a +; progressive sword that's a standing item.) We provide all our own routines plus +; some for "skipping" these steps when not necessary. If you want an item to potentially +; resolve to a different one, or to run some custom code on pickup, you will have to use +; ItemSubstitutionRules in tables.asm or claim some free space in this bank to put your +; own code with vectors to it in the appropriate tables. +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; ItemReceiptGraphicsROM - $A28000 (0x110000 PC) +;------------------------------------------------------------------------------ +; Where the custom uncompressed 4bpp item graphics are stored. See customitems.4bpp +; and customitems.png for reference. Offsets into this label should written to +; ItemReceiptGraphicsOffsets & StandingItemGraphicsOffsets without the high byte +; (0x8000) set. +; +; We can understand this buffer as being divided into an 8x8 grid with most sprites +; occupying a 16x16 space and narrow sprites occupying an 8x16 space. The first 16x16 +; item tile is a blank one-color sprite, the second 16x16 is the triforce piece, +; and the third is the fighter sword sprite. +; +; Every 8x8 4bpp tile from left to right is offset by 0x20. From top to bottom +; the offset is 0x200. This means that each "row" of 8x8 tiles should be written +; contiguously, but to write the next tile(s) below the base upper-left address +; should be incremented by 0x200. +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; ItemReceipts +;------------------------------------------------------------------------------ +; .offset_y [0x01] - $A2B000 (0x113000 PC) +; • Sprite Y offset from default position +; .offset_x [0x01] - $A2B100 (0x113100 PC) +; • Sprite X offset from default position +; .graphics [0x01] - $A2B200 (0x113200 PC) +; • Sprite index for compressed graphics +; .target [0x02] - $A2B300 (0x113300 PC) +; • Target address in save buffer in bank $7E +; .value [0x01] - $A2B500 (0x113500 PC) +; • Value written to target address +; .behavior [0x02] - $A2B600 (0x113600 PC) +; • Vector to code in this bank that runs on item pickup +; .resolution [0x02] - $A2B600 (0x113600 PC) +; • Vector to code in this bank that can resolve to new item (e.g. for progressive items) +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; SpriteProperties +;------------------------------------------------------------------------------ +; For the most part item sprites are identical in all contexts, but some +; sprites have two graphics, chest/npc graphics and standing item graphics. +;------------------------------------------------------------------------------ +; .chest_width [0x01] - $A2BA00 (0x11CA00 PC) +; .standing_width [0x01] - $A2BB00 (0x11CB00 PC) +; • $00 = 8x16 sprite | $02 = 16x16 sprite +; .chest_palette [0x01] - $A2BC00 (0x11CC00 PC) +; .standing_palette [0x01] - $A2BD00 (0x11CD00 PC) +; • l - - - - c c c +; c = palette index | l = load palette from .palette_addr +; .palette_addr [0x02] - $A2BE00 (0x11CE00 PC) +; • Pointer to 8-color palette in bank $9B (see custompalettes.asm) +; • If an item has two sprites, this should be the chest sprite for +; dark rooms. +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; InventoryTable +;------------------------------------------------------------------------------ +; .properties [0x01] - $A2C000 (0x114000 PC) +; • v - - - - - - - p k w o a y s t +; t = Count for total item counter | s = Count for total in shops +; y = Y item | a = A item +; o = Bomb item | w = Bow item +; k = Chest Key | p = Crystal prize behavior (sparkle, etc) if set +; v = use vram location specified in item receipts gfx +; .stamp [0x02] - $A2C200 (0x114200 PC) +; • Pointer to address in bank $7E. Stamps 32-bit frame time if stats not locked. +; .stat [0x02] - $A2C400 (0x114400 PC) +; • Pointer to address in bank $7E. Increments byte by one if stats not locked. +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; ItemReceiptGraphicsOffsets - $22C600 (0x114600) +; StandingItemGraphicsOffsets - $22C800 (0x114800) +;------------------------------------------------------------------------------ +; Each receipt ID has one word-length entry. Decompressed vanilla item graphics +; are located starting at BigDecompressionBuffer. The graphics routines use the +; fact that the high bit is set for these in this table to know to load from the +; buffer. Custom graphics are offset from ItemReceiptGraphicsRom, allocated in +; LTTP_RND_GeneralBugfixes.asm and written to with decompressed customitems.4bpp +; (see customitems.png for reference.) +; +; ItemReceiptGraphicsOffsets is used for chest items and items link holds up while +; in an item receipt post. StandingItemGraphicsOffsets is for standing items in +; heart piece, heart container, and shop locations. +;------------------------------------------------------------------------------ + +ItemReceipts: + .offset_y : fillbyte $00 : fill 256 + .offset_x : fillbyte $00 : fill 256 + .graphics : fillbyte $00 : fill 256 ; item_graphics_indices + .target : fillword $0000 : fill 256*2 ; item_target_addr + .value : fillbyte $00 : fill 256 ; item_values + .behavior : fillword $0000 : fill 256*2 ; ItemBehavior + .resolution : fillword $0000 : fill 256*2 ; ReceiptResolution + + +macro ReceiptProps(id, y, x, gfx, sram, value, behavior, res) + pushpc + + org ItemReceipts_offset_y+ : db + org ItemReceipts_offset_x+ : db + org ItemReceipts_graphics+ : db + org ItemReceipts_target++ : dw + org ItemReceipts_value+ : db + org ItemReceipts_behavior++ : dw ItemBehavior_ + org ItemReceipts_resolution++ : dw ResolveLootID_ + + pullpc +endmacro + +%ReceiptProps($00, -5, 0, $06, $F359, $01, sword_shield, skip) ; 00 - Fighter sword & Shield +%ReceiptProps($01, -5, 4, $18, $F359, $02, master_sword, skip) ; 01 - Master sword +%ReceiptProps($02, -5, 4, $18, $F359, $03, tempered_sword, skip) ; 02 - Tempered sword +%ReceiptProps($03, -5, 4, $18, $F359, $04, gold_sword, skip) ; 03 - Golden sword +%ReceiptProps($04, -5, 4, $2D, $F35A, $01, fighter_shield, skip) ; 04 - Fighter shield +%ReceiptProps($05, -4, 0, $20, $F35A, $02, red_shield, skip) ; 05 - Fire shield +%ReceiptProps($06, -4, 0, $2E, $F35A, $03, mirror_shield, skip) ; 06 - Mirror shield +%ReceiptProps($07, -5, 4, $09, $F345, $01, skip, skip) ; 07 - Fire rod +%ReceiptProps($08, -5, 4, $09, $F346, $01, skip, skip) ; 08 - Ice rod +%ReceiptProps($09, -4, 4, $0A, $F34B, $01, skip, skip) ; 09 - Hammer +%ReceiptProps($0A, -4, 4, $08, $F342, $01, skip, skip) ; 0A - Hookshot +%ReceiptProps($0B, -4, 4, $05, $F340, $01, bow, skip) ; 0B - Bow +%ReceiptProps($0C, -2, 5, $10, $F341, $01, blue_boomerang, skip) ; 0C - Blue Boomerang +%ReceiptProps($0D, -4, 0, $0B, $F344, $02, powder, skip) ; 0D - Powder +%ReceiptProps($0E, -4, 0, $2C, $F35C, $FF, skip, skip) ; 0E - Bottle refill (bee) +%ReceiptProps($0F, -4, 0, $1B, $F347, $01, skip, skip) ; 0F - Bombos +%ReceiptProps($10, -4, 0, $1A, $F348, $01, skip, skip) ; 10 - Ether +%ReceiptProps($11, -4, 0, $1C, $F349, $01, skip, skip) ; 11 - Quake +%ReceiptProps($12, -4, 0, $14, $F34A, $01, skip, skip) ; 12 - Lamp +%ReceiptProps($13, -4, 4, $19, $F34C, $01, shovel, skip) ; 13 - Shovel +%ReceiptProps($14, -4, 0, $0C, $F34C, $02, flute_inactive, skip) ; 14 - Flute +%ReceiptProps($15, -4, 4, $07, $F350, $01, skip, skip) ; 15 - Somaria +%ReceiptProps($16, -4, 0, $1D, $F35C, $FF, skip, bottles) ; 16 - Bottle +%ReceiptProps($17, -4, 0, $2F, $F36B, $FF, skip, skip) ; 17 - Heart piece +%ReceiptProps($18, -4, 4, $07, $F351, $01, skip, skip) ; 18 - Byrna +%ReceiptProps($19, -4, 0, $15, $F352, $01, skip, skip) ; 19 - Cape +%ReceiptProps($1A, -4, 0, $12, $F353, $02, skip, skip) ; 1A - Mirror +%ReceiptProps($1B, -4, 0, $0D, $F354, $01, skip, skip) ; 1B - Glove +%ReceiptProps($1C, -4, 0, $0D, $F354, $02, skip, skip) ; 1C - Mitts +%ReceiptProps($1D, -4, 0, $0E, $F34E, $01, skip, skip) ; 1D - Book +%ReceiptProps($1E, -4, 0, $11, $F356, $01, skip, skip) ; 1E - Flippers +%ReceiptProps($1F, -4, 0, $17, $F357, $01, skip, skip) ; 1F - Pearl +%ReceiptProps($20, -4, 0, $28, $F37A, $FF, dungeon_crystal, skip) ; 20 - Crystal +%ReceiptProps($21, -4, 0, $27, $F34D, $01, skip, skip) ; 21 - Net +%ReceiptProps($22, -4, 0, $04, $F35B, $FF, blue_mail, skip) ; 22 - Blue mail +%ReceiptProps($23, -5, 0, $04, $F35B, $02, red_mail, skip) ; 23 - Red mail +%ReceiptProps($24, -4, 4, $0F, $F36F, $FF, skip, skip) ; 24 - Small key +%ReceiptProps($25, -4, 0, $16, $F364, $FF, dungeon_compass, skip) ; 25 - Compass +%ReceiptProps($26, -4, 0, $03, $F36C, $FF, skip, skip) ; 26 - Heart container from 4/4 +%ReceiptProps($27, -4, 0, $13, $F375, $FF, skip, skip) ; 27 - Bomb +%ReceiptProps($28, -4, 0, $01, $F375, $FF, skip, skip) ; 28 - 3 bombs +%ReceiptProps($29, -4, 0, $1F, $F344, $FF, mushroom, skip) ; 29 - Mushroom +%ReceiptProps($2A, -2, 5, $10, $F341, $02, red_boomerang, skip) ; 2A - Red boomerang +%ReceiptProps($2B, -4, 0, $1E, $F35C, $FF, skip, bottles) ; 2B - Full bottle (red) +%ReceiptProps($2C, -4, 0, $1E, $F35C, $FF, skip, bottles) ; 2C - Full bottle (green) +%ReceiptProps($2D, -4, 0, $1E, $F35C, $FF, skip, bottles) ; 2D - Full bottle (blue) +%ReceiptProps($2E, -4, 0, $1E, $F36D, $FF, skip, skip) ; 2E - Potion refill (red) +%ReceiptProps($2F, -4, 0, $1E, $F36E, $FF, skip, skip) ; 2F - Potion refill (green) +%ReceiptProps($30, -4, 0, $1E, $F36E, $FF, skip, skip) ; 30 - Potion refill (blue) +%ReceiptProps($31, -4, 0, $30, $F375, $FF, skip, skip) ; 31 - 10 bombs +%ReceiptProps($32, -4, 0, $22, $F366, $FF, dungeon_bigkey, skip) ; 32 - Big key +%ReceiptProps($33, -4, 0, $21, $F368, $FF, dungeon_map, skip) ; 33 - Map +%ReceiptProps($34, -2, 4, $24, $F360, $FF, skip, skip) ; 34 - 1 rupee +%ReceiptProps($35, -2, 4, $24, $F360, $FF, skip, skip) ; 35 - 5 rupees +%ReceiptProps($36, -2, 4, $24, $F360, $EC, skip, skip) ; 36 - 20 rupees +%ReceiptProps($37, -4, 0, $23, $F374, $FF, pendant, skip) ; 37 - Green pendant +%ReceiptProps($38, -4, 0, $39, $F374, $FF, pendant, skip) ; 38 - Red pendant +%ReceiptProps($39, -4, 0, $39, $F374, $FF, pendant, skip) ; 39 - Blue pendant +%ReceiptProps($3A, -4, 0, $29, $F340, $01, bow_and_arrows, skip) ; 3A - Bow And Arrows +%ReceiptProps($3B, -4, 0, $2A, $F340, $03, silver_bow, skip) ; 3B - Silver Bow +%ReceiptProps($3C, -4, 0, $2C, $F35C, $FF, skip, skip) ; 3C - Full bottle (bee) +%ReceiptProps($3D, -4, 0, $2B, $F35C, $FF, skip, skip) ; 3D - Full bottle (fairy) +%ReceiptProps($3E, -4, 0, $03, $F36C, $FF, skip, skip) ; 3E - Boss heart +%ReceiptProps($3F, -4, 0, $03, $F36C, $FF, skip, skip) ; 3F - Sanc heart +%ReceiptProps($40, -4, 0, $34, $F360, $9C, skip, skip) ; 40 - 100 rupees +%ReceiptProps($41, -4, 0, $35, $F360, $CE, skip, skip) ; 41 - 50 rupees +%ReceiptProps($42, -2, 4, $31, $F372, $FF, skip, skip) ; 42 - Heart +%ReceiptProps($43, -2, 4, $33, $F376, $01, single_arrow, skip) ; 43 - Arrow +%ReceiptProps($44, -4, 0, $02, $F376, $0A, skip, skip) ; 44 - 10 arrows +%ReceiptProps($45, -2, 4, $32, $F373, $FF, skip, skip) ; 45 - Small magic +%ReceiptProps($46, -4, 0, $36, $F360, $FF, skip, skip) ; 46 - 300 rupees +%ReceiptProps($47, -4, 0, $37, $F360, $FF, skip, skip) ; 47 - 20 rupees green +%ReceiptProps($48, -4, 0, $2C, $F35C, $FF, skip, skip) ; 48 - Full bottle (good bee) +%ReceiptProps($49, -5, 4, $06, $F359, $01, fighter_sword, skip) ; 49 - Tossed fighter sword +%ReceiptProps($4A, -4, 0, $0C, $F34C, $03, flute_active, skip) ; 4A - Active Flute +%ReceiptProps($4B, -4, 0, $38, $F355, $01, skip, skip) ; 4B - Boots +%ReceiptProps($4C, -4, 0, $39, $F375, $32, bombs_50, skip) ; 4C - Bomb capacity (50) +%ReceiptProps($4D, -4, 0, $3A, $F376, $46, arrows_70, skip) ; 4D - Arrow capacity (70) +%ReceiptProps($4E, -4, 0, $3B, $F373, $80, magic_2, magic) ; 4E - 1/2 magic +%ReceiptProps($4F, -4, 0, $3C, $F373, $80, magic_4, skip) ; 4F - 1/4 magic +%ReceiptProps($50, -5, 4, $18, $F359, $02, master_sword_safe, skip) ; 50 - Safe master sword +%ReceiptProps($51, -4, 0, $42, $F375, $FF, bombs_5, skip) ; 51 - Bomb capacity (+5) +%ReceiptProps($52, -4, 0, $3E, $F375, $FF, bombs_10, skip) ; 52 - Bomb capacity (+10) +%ReceiptProps($53, -4, 0, $3F, $F376, $FF, arrows_5, skip) ; 53 - Arrow capacity (+5) +%ReceiptProps($54, -4, 0, $40, $F376, $FF, arrows_10, skip) ; 54 - Arrow capacity (+10) +%ReceiptProps($55, -4, 0, $00, $F41A, $FF, programmable_1, skip) ; 55 - Programmable item 1 +%ReceiptProps($56, -4, 0, $00, $F41C, $FF, programmable_2, skip) ; 56 - Programmable item 2 +%ReceiptProps($57, -4, 0, $00, $F41E, $FF, programmable_3, skip) ; 57 - Programmable item 3 +%ReceiptProps($58, -4, 0, $41, $F340, $FF, silver_arrows, skip) ; 58 - Upgrade-only Silver Arrows +%ReceiptProps($59, -4, 4, $24, $F360, $FF, rupoor, skip) ; 59 - Rupoor +%ReceiptProps($5A, -4, 0, $47, $F36A, $FF, skip, skip) ; 5A - Nothing +%ReceiptProps($5B, -4, 0, $4B, $F454, $FF, red_clock, skip) ; 5B - Red clock +%ReceiptProps($5C, -4, 0, $4B, $F454, $FF, blue_clock, skip) ; 5C - Blue clock +%ReceiptProps($5D, -4, 0, $4B, $F454, $FF, green_clock, skip) ; 5D - Green clock +%ReceiptProps($5E, -4, 0, $FE, $F359, $FF, prog_sword, prog_sword) ; 5E - Progressive sword +%ReceiptProps($5F, -4, 0, $FF, $F35A, $FF, prog_shield, shields) ; 5F - Progressive shield +%ReceiptProps($60, -4, 0, $FD, $F35B, $FF, prog_mail, armor) ; 60 - Progressive armor +%ReceiptProps($61, -4, 0, $0D, $F354, $FF, skip, gloves) ; 61 - Progressive glove +%ReceiptProps($62, -4, 0, $FF, $F36A, $FF, skip, rng_single) ; 62 - RNG pool item (single) +%ReceiptProps($63, -4, 0, $FF, $F36A, $FF, skip, rng_multi) ; 63 - RNG pool item (multi) +%ReceiptProps($64, -4, 0, $FF, $F340, $FF, skip, progressive_bow) ; 64 - Progressive bow +%ReceiptProps($65, -4, 0, $FF, $F340, $FF, skip, progressive_bow_2) ; 65 - Progressive bow +%ReceiptProps($66, -4, 0, $FF, $F36A, $FF, skip, skip) ; 66 - +%ReceiptProps($67, -4, 0, $FF, $F36A, $FF, skip, skip) ; 67 - +%ReceiptProps($68, -4, 0, $FF, $F36A, $FF, skip, skip) ; 68 - +%ReceiptProps($69, -4, 0, $FF, $F36A, $FF, skip, skip) ; 69 - +%ReceiptProps($6A, -4, 0, $49, $F36A, $FF, triforce, skip) ; 6A - Triforce +%ReceiptProps($6B, -4, 0, $50, $F36A, $FF, goal_item, skip) ; 6B - Power star +%ReceiptProps($6C, -4, 0, $49, $F36A, $FF, goal_item, skip) ; 6C - Triforce Piece +%ReceiptProps($6D, -4, 0, $FF, $F36A, $FF, request_F0, skip) ; 6D - Server request item +%ReceiptProps($6E, -4, 0, $FF, $F36A, $FF, request_F1, skip) ; 6E - Server request item (dungeon drop) +%ReceiptProps($6F, -4, 0, $FF, $F36A, $FF, request_F2, skip) ; 6F - +%ReceiptProps($70, -4, 0, $21, $F36A, $FF, free_map, skip) ; 70 - Map of Light World +%ReceiptProps($71, -4, 0, $21, $F36A, $FF, free_map, skip) ; 71 - Map of Dark World +%ReceiptProps($72, -4, 0, $21, $F36A, $FF, free_map, skip) ; 72 - Map of Ganon's Tower +%ReceiptProps($73, -4, 0, $21, $F36A, $FF, free_map, skip) ; 73 - Map of Turtle Rock +%ReceiptProps($74, -4, 0, $21, $F36A, $FF, free_map, skip) ; 74 - Map of Thieves' Town +%ReceiptProps($75, -4, 0, $21, $F36A, $FF, free_map, skip) ; 75 - Map of Tower of Hera +%ReceiptProps($76, -4, 0, $21, $F36A, $FF, free_map, skip) ; 76 - Map of Ice Palace +%ReceiptProps($77, -4, 0, $21, $F36A, $FF, free_map, skip) ; 77 - Map of Skull Woods +%ReceiptProps($78, -4, 0, $21, $F36A, $FF, free_map, skip) ; 78 - Map of Misery Mire +%ReceiptProps($79, -4, 0, $21, $F36A, $FF, free_map, skip) ; 79 - Map of Dark Palace +%ReceiptProps($7A, -4, 0, $21, $F36A, $FF, free_map, skip) ; 7A - Map of Swamp Palace +%ReceiptProps($7B, -4, 0, $21, $F36A, $FF, free_map, skip) ; 7B - Map of Agahnim's Tower +%ReceiptProps($7C, -4, 0, $21, $F36A, $FF, free_map, skip) ; 7C - Map of Desert Palace +%ReceiptProps($7D, -4, 0, $21, $F36A, $FF, free_map, skip) ; 7D - Map of Eastern Palace +%ReceiptProps($7E, -4, 0, $21, $F36A, $FF, hc_map, skip) ; 7E - Map of Hyrule Castle +%ReceiptProps($7F, -4, 0, $21, $F36A, $FF, hc_map, skip) ; 7F - Map of Sewers +%ReceiptProps($80, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 80 - Compass of Light World +%ReceiptProps($81, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 81 - Compass of Dark World +%ReceiptProps($82, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 82 - Compass of Ganon's Tower +%ReceiptProps($83, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 83 - Compass of Turtle Rock +%ReceiptProps($84, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 84 - Compass of Thieves' Town +%ReceiptProps($85, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 85 - Compass of Tower of Hera +%ReceiptProps($86, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 86 - Compass of Ice Palace +%ReceiptProps($87, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 87 - Compass of Skull Woods +%ReceiptProps($88, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 88 - Compass of Misery Mire +%ReceiptProps($89, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 89 - Compass of Dark Palace +%ReceiptProps($8A, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 8A - Compass of Swamp Palace +%ReceiptProps($8B, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 8B - Compass of Agahnim's Tower +%ReceiptProps($8C, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 8C - Compass of Desert Palace +%ReceiptProps($8D, -4, 0, $16, $F36A, $FF, free_compass, skip) ; 8D - Compass of Eastern Palace +%ReceiptProps($8E, -4, 0, $16, $F36A, $FF, hc_compass, skip) ; 8E - Compass of Hyrule Castle +%ReceiptProps($8F, -4, 0, $16, $F36A, $FF, hc_compass, skip) ; 8F - Compass of Sewers +%ReceiptProps($90, -4, 0, $22, $F36A, $FF, skip, skip) ; 90 - Skull key +%ReceiptProps($91, -4, 0, $22, $F36A, $FF, skip, skip) ; 91 - Reserved +%ReceiptProps($92, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 92 - Big key of Ganon's Tower +%ReceiptProps($93, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 93 - Big key of Turtle Rock +%ReceiptProps($94, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 94 - Big key of Thieves' Town +%ReceiptProps($95, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 95 - Big key of Tower of Hera +%ReceiptProps($96, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 96 - Big key of Ice Palace +%ReceiptProps($97, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 97 - Big key of Skull Woods +%ReceiptProps($98, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 98 - Big key of Misery Mire +%ReceiptProps($99, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 99 - Big key of Dark Palace +%ReceiptProps($9A, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 9A - Big key of Swamp Palace +%ReceiptProps($9B, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 9B - Big key of Agahnim's Tower +%ReceiptProps($9C, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 9C - Big key of Desert Palace +%ReceiptProps($9D, -4, 0, $22, $F36A, $FF, free_bigkey, skip) ; 9D - Big key of Eastern Palace +%ReceiptProps($9E, -4, 0, $22, $F36A, $FF, hc_bigkey, skip) ; 9E - Big key of Hyrule Castle +%ReceiptProps($9F, -4, 0, $22, $F36A, $FF, hc_bigkey, skip) ; 9F - Big key of Sewers +%ReceiptProps($A0, -4, 4, $0F, $F36A, $FF, hc_smallkey, skip) ; A0 - Small key of Sewers +%ReceiptProps($A1, -4, 4, $0F, $F36A, $FF, hc_smallkey, skip) ; A1 - Small key of Hyrule Castle +%ReceiptProps($A2, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; A2 - Small key of Eastern Palace +%ReceiptProps($A3, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; A3 - Small key of Desert Palace +%ReceiptProps($A4, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; A4 - Small key of Agahnim's Tower +%ReceiptProps($A5, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; A5 - Small key of Swamp Palace +%ReceiptProps($A6, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; A6 - Small key of Dark Palace +%ReceiptProps($A7, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; A7 - Small key of Misery Mire +%ReceiptProps($A8, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; A8 - Small key of Skull Woods +%ReceiptProps($A9, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; A9 - Small key of Ice Palace +%ReceiptProps($AA, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; AA - Small key of Tower of Hera +%ReceiptProps($AB, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; AB - Small key of Thieves' Town +%ReceiptProps($AC, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; AC - Small key of Turtle Rock +%ReceiptProps($AD, -4, 4, $0F, $F36A, $FF, free_smallkey, skip) ; AD - Small key of Ganon's Tower +%ReceiptProps($AE, -4, 4, $0F, $F36A, $FF, skip, skip) ; AE - Reserved +%ReceiptProps($AF, -4, 4, $0F, $F36A, $FF, generic_smallkey, skip) ; AF - Generic small key +%ReceiptProps($B0, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B0 - Crystal 6 +%ReceiptProps($B1, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B1 - Crystal 1 +%ReceiptProps($B2, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B2 - Crystal 5 +%ReceiptProps($B3, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B3 - Crystal 7 +%ReceiptProps($B4, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B4 - Crystal 2 +%ReceiptProps($B5, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B5 - Crystal 4 +%ReceiptProps($B6, -4, 0, $28, $F36A, $FF, free_crystal, skip) ; B6 - Crystal 3 +%ReceiptProps($B7, -4, 0, $49, $F36A, $FF, skip, skip) ; B7 - Reserved +%ReceiptProps($B8, -4, 0, $49, $F36A, $FF, skip, skip) ; B8 - +%ReceiptProps($B9, -4, 0, $49, $F36A, $FF, skip, skip) ; B9 - +%ReceiptProps($BA, -4, 0, $49, $F36A, $FF, skip, skip) ; BA - +%ReceiptProps($BB, -4, 0, $49, $F36A, $FF, skip, skip) ; BB - +%ReceiptProps($BC, -4, 0, $49, $F36A, $FF, skip, skip) ; BC - +%ReceiptProps($BD, -4, 0, $49, $F36A, $FF, skip, skip) ; BD - +%ReceiptProps($BE, -4, 0, $49, $F36A, $FF, skip, skip) ; BE - +%ReceiptProps($BF, -4, 0, $49, $F36A, $FF, skip, skip) ; BF - +%ReceiptProps($C0, -4, 0, $49, $F36A, $FF, skip, skip) ; C0 - +%ReceiptProps($C1, -4, 0, $49, $F36A, $FF, skip, skip) ; C1 - +%ReceiptProps($C2, -4, 0, $49, $F36A, $FF, skip, skip) ; C2 - +%ReceiptProps($C3, -4, 0, $49, $F36A, $FF, skip, skip) ; C3 - +%ReceiptProps($C4, -4, 0, $49, $F36A, $FF, skip, skip) ; C4 - +%ReceiptProps($C5, -4, 0, $49, $F36A, $FF, skip, skip) ; C5 - +%ReceiptProps($C6, -4, 0, $49, $F36A, $FF, skip, skip) ; C6 - +%ReceiptProps($C7, -4, 0, $49, $F36A, $FF, skip, skip) ; C7 - +%ReceiptProps($C8, -4, 0, $49, $F36A, $FF, skip, skip) ; C8 - +%ReceiptProps($C9, -4, 0, $49, $F36A, $FF, skip, skip) ; C9 - +%ReceiptProps($CA, -4, 0, $49, $F36A, $FF, skip, skip) ; CA - +%ReceiptProps($CB, -4, 0, $49, $F36A, $FF, skip, skip) ; CB - +%ReceiptProps($CC, -4, 0, $49, $F36A, $FF, skip, skip) ; CC - +%ReceiptProps($CD, -4, 0, $49, $F36A, $FF, skip, skip) ; CD - +%ReceiptProps($CE, -4, 0, $49, $F36A, $FF, skip, skip) ; CE - +%ReceiptProps($CF, -4, 0, $49, $F36A, $FF, skip, skip) ; CF - +%ReceiptProps($D0, -4, 0, $47, $F36A, $FF, bee_trap, skip) ; D0 - Bee trap +%ReceiptProps($D1, -4, 0, $47, $F36A, $FF, apples, skip) ; D1 - Apples +%ReceiptProps($D2, -4, 0, $47, $F36A, $FF, fairy, skip) ; D2 - Fairy +%ReceiptProps($D3, -4, 0, $47, $F36A, $FF, chicken, skip) ; D3 - Chicken +%ReceiptProps($D4, -4, 4, $3B, $F373, $80, refill_magic, skip) ; D4 - Big Magic +%ReceiptProps($D5, -4, 0, $02, $F376, $05, skip, skip) ; D5 - 5 Arrows +%ReceiptProps($D6, -4, 4, $47, $F36A, $FF, good_bee, skip) ; D6 - Good Bee +%ReceiptProps($D7, -4, 0, $49, $F36A, $FF, skip, skip) ; D7 - +%ReceiptProps($D8, -4, 0, $49, $F36A, $FF, skip, skip) ; D8 - +%ReceiptProps($D9, -4, 0, $49, $F36A, $FF, skip, skip) ; D9 - +%ReceiptProps($DA, -4, 0, $49, $F36A, $FF, skip, skip) ; DA - +%ReceiptProps($DB, -4, 0, $49, $F36A, $FF, skip, skip) ; DB - +%ReceiptProps($DC, -4, 0, $49, $F36A, $FF, skip, skip) ; DC - +%ReceiptProps($DD, -4, 0, $49, $F36A, $FF, skip, skip) ; DD - +%ReceiptProps($DE, -4, 0, $49, $F36A, $FF, skip, skip) ; DE - +%ReceiptProps($DF, -4, 0, $49, $F36A, $FF, skip, skip) ; DF - +%ReceiptProps($E0, -4, 0, $49, $F36A, $FF, skip, skip) ; E0 - +%ReceiptProps($E1, -4, 0, $49, $F36A, $FF, skip, skip) ; E1 - +%ReceiptProps($E2, -4, 0, $49, $F36A, $FF, skip, skip) ; E2 - +%ReceiptProps($E3, -4, 0, $49, $F36A, $FF, skip, skip) ; E3 - +%ReceiptProps($E4, -4, 0, $49, $F36A, $FF, skip, skip) ; E4 - +%ReceiptProps($E5, -4, 0, $49, $F36A, $FF, skip, skip) ; E5 - +%ReceiptProps($E6, -4, 0, $49, $F36A, $FF, skip, skip) ; E6 - +%ReceiptProps($E7, -4, 0, $49, $F36A, $FF, skip, skip) ; E7 - +%ReceiptProps($E8, -4, 0, $49, $F36A, $FF, skip, skip) ; E8 - +%ReceiptProps($E9, -4, 0, $49, $F36A, $FF, skip, skip) ; E9 - +%ReceiptProps($EA, -4, 0, $49, $F36A, $FF, skip, skip) ; EA - +%ReceiptProps($EB, -4, 0, $49, $F36A, $FF, skip, skip) ; EB - +%ReceiptProps($EC, -4, 0, $49, $F36A, $FF, skip, skip) ; EC - +%ReceiptProps($ED, -4, 0, $49, $F36A, $FF, skip, skip) ; ED - +%ReceiptProps($EE, -4, 0, $49, $F36A, $FF, skip, skip) ; EE - +%ReceiptProps($EF, -4, 0, $49, $F36A, $FF, skip, skip) ; EF - +%ReceiptProps($F0, -4, 0, $49, $F36A, $FF, skip, skip) ; F0 - +%ReceiptProps($F1, -4, 0, $49, $F36A, $FF, skip, skip) ; F1 - +%ReceiptProps($F2, -4, 0, $49, $F36A, $FF, skip, skip) ; F2 - +%ReceiptProps($F3, -4, 0, $49, $F36A, $FF, skip, skip) ; F3 - +%ReceiptProps($F4, -4, 0, $49, $F36A, $FF, skip, skip) ; F4 - +%ReceiptProps($F5, -4, 0, $49, $F36A, $FF, skip, skip) ; F5 - +%ReceiptProps($F6, -4, 0, $49, $F36A, $FF, skip, skip) ; F6 - +%ReceiptProps($F7, -4, 0, $49, $F36A, $FF, skip, skip) ; F7 - +%ReceiptProps($F8, -4, 0, $49, $F36A, $FF, skip, skip) ; F8 - +%ReceiptProps($F9, -4, 0, $49, $F36A, $FF, skip, skip) ; F9 - +%ReceiptProps($FA, -4, 0, $49, $F36A, $FF, skip, skip) ; FA - +%ReceiptProps($FB, -4, 0, $49, $F36A, $FF, skip, skip) ; FB - +%ReceiptProps($FC, -4, 0, $49, $F36A, $FF, skip, skip) ; FC - +%ReceiptProps($FD, -4, 0, $49, $F36A, $FF, skip, skip) ; FD - +%ReceiptProps($FE, -4, 0, $49, $F36A, $FF, skip, skip) ; FE - Server request (async) +%ReceiptProps($FF, -4, 0, $49, $F36A, $FF, skip, skip) ; FF - + +;------------------------------------------------------------------------------ +; Palettes: l - - - - c c c +; c = Color Index | l = Load palette data from ROM +SpriteProperties: + .chest_width : fillbyte $00 : fill 256 + .standing_width : fillbyte $00 : fill 256 + .chest_palette : fillbyte $00 : fill 256 + .standing_palette : fillbyte $00 : fill 256 + .palette_addr : fillword $0000 : fill 256*2 ; bank $9B + +macro SpriteProps(id, chest_width, standing_width, chest_pal, standing_pal, addr) + pushpc + + org SpriteProperties_chest_width+ : db + org SpriteProperties_standing_width+ : db + org SpriteProperties_chest_palette+ : db + org SpriteProperties_standing_palette+ : db + org SpriteProperties_palette_addr++ : dw + + pullpc +endmacro + +%SpriteProps($00, 0, 2, $05, $02, PalettesVanilla_blue_ice+$0E) ; 00 - Fighter sword & Shield +%SpriteProps($01, 0, 2, $05, $05, PalettesCustom_master_sword) ; 01 - Master sword +%SpriteProps($02, 0, 2, $05, $01, PalettesCustom_tempered_sword) ; 02 - Tempered sword +%SpriteProps($03, 0, 2, $05, $04, PalettesCustom_golden_sword) ; 03 - Golden sword +%SpriteProps($04, 0, 0, $05, $80, PalettesCustom_fighter_shield) ; 04 - Fighter shield +%SpriteProps($05, 2, 2, $05, $80, PalettesCustom_red_shield) ; 05 - Fire shield +%SpriteProps($06, 2, 2, $05, $80, PalettesCustom_mirror_shield) ; 06 - Mirror shield +%SpriteProps($07, 0, 0, $01, $01, PalettesVanilla_red_melon+$0E) ; 07 - Fire rod +%SpriteProps($08, 0, 0, $02, $02, PalettesVanilla_blue_ice+$0E) ; 08 - Ice rod +%SpriteProps($09, 0, 0, $01, $01, PalettesVanilla_red_melon+$0E) ; 09 - Hammer +%SpriteProps($0A, 0, 0, $01, $01, PalettesVanilla_red_melon+$0E) ; 0A - Hookshot +%SpriteProps($0B, 0, 0, $01, $01, PalettesVanilla_red_melon+$0E) ; 0B - Bow +%SpriteProps($0C, 0, 0, $02, $02, PalettesVanilla_blue_ice+$0E) ; 0C - Blue Boomerang +%SpriteProps($0D, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 0D - Powder +%SpriteProps($0E, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 0E - Bottle refill (bee) +%SpriteProps($0F, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 0F - Bombos +%SpriteProps($10, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 10 - Ether +%SpriteProps($11, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 11 - Quake +%SpriteProps($12, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 12 - Lamp +%SpriteProps($13, 0, 0, $01, $01, PalettesVanilla_red_melon+$0E) ; 13 - Shovel +%SpriteProps($14, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 14 - Flute +%SpriteProps($15, 0, 0, $01, $01, PalettesVanilla_red_melon+$0E) ; 15 - Somaria +%SpriteProps($16, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 16 - Bottle +%SpriteProps($17, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 17 - Heart piece +%SpriteProps($18, 0, 0, $02, $02, PalettesVanilla_blue_ice+$0E) ; 18 - Byrna +%SpriteProps($19, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 19 - Cape +%SpriteProps($1A, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 1A - Mirror +%SpriteProps($1B, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 1B - Glove +%SpriteProps($1C, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 1C - Mitts +%SpriteProps($1D, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 1D - Book +%SpriteProps($1E, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 1E - Flippers +%SpriteProps($1F, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 1F - Pearl +%SpriteProps($20, 2, 2, $86, $86, PalettesCustom_crystal) ; 20 - Crystal +%SpriteProps($21, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 21 - Net +%SpriteProps($22, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 22 - Blue mail +%SpriteProps($23, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 23 - Red mail +%SpriteProps($24, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; 24 - Small key +%SpriteProps($25, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 25 - Compass +%SpriteProps($26, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 26 - Heart container from 4/4 +%SpriteProps($27, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 27 - Bomb +%SpriteProps($28, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 28 - 3 bombs +%SpriteProps($29, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 29 - Mushroom +%SpriteProps($2A, 0, 0, $01, $01, PalettesVanilla_red_melon+$0E) ; 2A - Red boomerang +%SpriteProps($2B, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 2B - Full bottle (red) +%SpriteProps($2C, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 2C - Full bottle (green) +%SpriteProps($2D, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 2D - Full bottle (blue) +%SpriteProps($2E, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 2E - Potion refill (red) +%SpriteProps($2F, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 2F - Potion refill (green) +%SpriteProps($30, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 30 - Potion refill (blue) +%SpriteProps($31, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 31 - 10 bombs +%SpriteProps($32, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 32 - Big key +%SpriteProps($33, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 33 - Map +%SpriteProps($34, 0, 0, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 34 - 1 rupee +%SpriteProps($35, 0, 0, $02, $02, PalettesVanilla_blue_ice+$0E) ; 35 - 5 rupees +%SpriteProps($36, 0, 0, $01, $01, PalettesVanilla_red_melon+$0E) ; 36 - 20 rupees +%SpriteProps($37, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 37 - Green pendant +%SpriteProps($38, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 38 - Red pendant +%SpriteProps($39, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 39 - Blue pendant +%SpriteProps($3A, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 3A - Bow And Arrows +%SpriteProps($3B, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 3B - Silver Bow +%SpriteProps($3C, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 3C - Full bottle (bee) +%SpriteProps($3D, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 3D - Full bottle (fairy) +%SpriteProps($3E, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 3E - Boss heart +%SpriteProps($3F, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 3F - Sanc heart +%SpriteProps($40, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 40 - 100 rupees +%SpriteProps($41, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 41 - 50 rupees +%SpriteProps($42, 0, 0, $01, $01, PalettesVanilla_red_melon+$0E) ; 42 - Heart +%SpriteProps($43, 0, 0, $02, $02, PalettesVanilla_blue_ice+$0E) ; 43 - Arrow +%SpriteProps($44, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 44 - 10 arrows +%SpriteProps($45, 0, 0, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 45 - Small magic +%SpriteProps($46, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 46 - 300 rupees +%SpriteProps($47, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 47 - 20 rupees green +%SpriteProps($48, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 48 - Full bottle (good bee) +%SpriteProps($49, 0, 2, $05, $02, PalettesCustom_fighter_shield) ; 49 - Tossed fighter sword +%SpriteProps($4A, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 4A - Active Flute +%SpriteProps($4B, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 4B - Boots +%SpriteProps($4C, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 4C - Bomb capacity (50) +%SpriteProps($4D, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 4D - Arrow capacity (70) +%SpriteProps($4E, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 4E - 1/2 magic +%SpriteProps($4F, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 4F - 1/4 magic +%SpriteProps($50, 0, 2, $05, $02, PalettesCustom_master_sword) ; 50 - Safe master sword +%SpriteProps($51, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 51 - Bomb capacity (+5) +%SpriteProps($52, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 52 - Bomb capacity (+10) +%SpriteProps($53, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 53 - Arrow capacity (+5) +%SpriteProps($54, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 54 - Arrow capacity (+10) +%SpriteProps($55, 2, 2, $04, $04, $0000) ; 55 - Programmable item 1 +%SpriteProps($56, 2, 2, $04, $04, $0000) ; 56 - Programmable item 2 +%SpriteProps($57, 2, 2, $04, $04, $0000) ; 57 - Programmable item 3 +%SpriteProps($58, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 58 - Upgrade-only Silver Arrows +%SpriteProps($59, 0, 0, $03, $03, PalettesCustom_off_black) ; 59 - Rupoor +%SpriteProps($5A, 2, 2, $01, $01, $0000) ; 5A - Nothing +%SpriteProps($5B, 2, 2, $01, $01, PalettesVanilla_red_melon+$0E) ; 5B - Red clock +%SpriteProps($5C, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 5C - Blue clock +%SpriteProps($5D, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 5D - Green clock +%SpriteProps($5E, 2, 2, $FF, $FF, $0000) ; 5E - Progressive sword +%SpriteProps($5F, 2, 2, $FF, $FF, $0000) ; 5F - Progressive shield +%SpriteProps($60, 2, 2, $FF, $FF, $0000) ; 60 - Progressive armor +%SpriteProps($61, 2, 2, $FF, $FF, $0000) ; 61 - Progressive glove +%SpriteProps($62, 2, 2, $FF, $FF, $0000) ; 62 - RNG pool item (single) +%SpriteProps($63, 2, 2, $FF, $FF, $0000) ; 63 - RNG pool item (multi) +%SpriteProps($64, 2, 2, $FF, $FF, $0000) ; 64 - Progressive bow +%SpriteProps($65, 2, 2, $FF, $FF, $0000) ; 65 - Progressive bow +%SpriteProps($66, 2, 2, $00, $00, $0000) ; 66 - +%SpriteProps($67, 2, 2, $00, $00, $0000) ; 67 - +%SpriteProps($68, 2, 2, $00, $00, $0000) ; 68 - +%SpriteProps($69, 2, 2, $00, $00, $0000) ; 69 - +%SpriteProps($6A, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 6A - Triforce +%SpriteProps($6B, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 6B - Power star +%SpriteProps($6C, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 6C - Triforce Piece +%SpriteProps($6D, 2, 2, $FF, $FF, $0000) ; 6D - Server request item +%SpriteProps($6E, 2, 2, $FF, $FF, $0000) ; 6E - Server request item (dungeon drop) +%SpriteProps($6F, 2, 2, $FF, $FF, $0000) ; 6F - +%SpriteProps($70, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 70 - Map of Light World +%SpriteProps($71, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 71 - Map of Dark World +%SpriteProps($72, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 72 - Map of Ganon's Tower +%SpriteProps($73, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 73 - Map of Turtle Rock +%SpriteProps($74, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 74 - Map of Thieves' Town +%SpriteProps($75, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 75 - Map of Tower of Hera +%SpriteProps($76, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 76 - Map of Ice Palace +%SpriteProps($77, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 77 - Map of Skull Woods +%SpriteProps($78, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 78 - Map of Misery Mire +%SpriteProps($79, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 79 - Map of Dark Palace +%SpriteProps($7A, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 7A - Map of Swamp Palace +%SpriteProps($7B, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 7B - Map of Agahnim's Tower +%SpriteProps($7C, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 7C - Map of Desert Palace +%SpriteProps($7D, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 7D - Map of Eastern Palace +%SpriteProps($7E, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 7E - Map of Hyrule Castle +%SpriteProps($7F, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 7F - Map of Sewers +%SpriteProps($80, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 80 - Compass of Light World +%SpriteProps($81, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 81 - Compass of Dark World +%SpriteProps($82, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 82 - Compass of Ganon's Tower +%SpriteProps($83, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 83 - Compass of Turtle Rock +%SpriteProps($84, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 84 - Compass of Thieves' Town +%SpriteProps($85, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 85 - Compass of Tower of Hera +%SpriteProps($86, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 86 - Compass of Ice Palace +%SpriteProps($87, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 87 - Compass of Skull Woods +%SpriteProps($88, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 88 - Compass of Misery Mire +%SpriteProps($89, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 89 - Compass of Dark Palace +%SpriteProps($8A, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 8A - Compass of Swamp Palace +%SpriteProps($8B, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 8B - Compass of Agahnim's Tower +%SpriteProps($8C, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 8C - Compass of Desert Palace +%SpriteProps($8D, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 8D - Compass of Eastern Palace +%SpriteProps($8E, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 8E - Compass of Hyrule Castle +%SpriteProps($8F, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; 8F - Compass of Sewers +%SpriteProps($90, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 90 - Skull key +%SpriteProps($91, 2, 2, $04, $04, $0000) ; 91 - Reserved +%SpriteProps($92, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 92 - Big key of Ganon's Tower +%SpriteProps($93, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 93 - Big key of Turtle Rock +%SpriteProps($94, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 94 - Big key of Thieves' Town +%SpriteProps($95, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 95 - Big key of Tower of Hera +%SpriteProps($96, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 96 - Big key of Ice Palace +%SpriteProps($97, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 97 - Big key of Skull Woods +%SpriteProps($98, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 98 - Big key of Misery Mire +%SpriteProps($99, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 99 - Big key of Dark Palace +%SpriteProps($9A, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 9A - Big key of Swamp Palace +%SpriteProps($9B, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 9B - Big key of Agahnim's Tower +%SpriteProps($9C, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 9C - Big key of Desert Palace +%SpriteProps($9D, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 9D - Big key of Eastern Palace +%SpriteProps($9E, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 9E - Big key of Hyrule Castle +%SpriteProps($9F, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; 9F - Big key of Sewers +%SpriteProps($A0, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; A0 - Small key of Sewers +%SpriteProps($A1, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; A1 - Small key of Hyrule Castle +%SpriteProps($A2, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; A2 - Small key of Eastern Palace +%SpriteProps($A3, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; A3 - Small key of Desert Palace +%SpriteProps($A4, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; A4 - Small key of Agahnim's Tower +%SpriteProps($A5, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; A5 - Small key of Swamp Palace +%SpriteProps($A6, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; A6 - Small key of Dark Palace +%SpriteProps($A7, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; A7 - Small key of Misery Mire +%SpriteProps($A8, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; A8 - Small key of Skull Woods +%SpriteProps($A9, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; A9 - Small key of Ice Palace +%SpriteProps($AA, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; AA - Small key of Tower of Hera +%SpriteProps($AB, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; AB - Small key of Thieves' Town +%SpriteProps($AC, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; AC - Small key of Turtle Rock +%SpriteProps($AD, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; AD - Small key of Ganon's Tower +%SpriteProps($AE, 2, 2, $02, $02, $0000) ; AE - Reserved +%SpriteProps($AF, 0, 0, $02, $04, PalettesVanilla_blue_ice+$0E) ; AF - Generic small key +%SpriteProps($B0, 2, 2, $80, $80, PalettesCustom_crystal) ; B0 - Crystal 6 +%SpriteProps($B1, 2, 2, $80, $80, PalettesCustom_crystal) ; B1 - Crystal 1 +%SpriteProps($B2, 2, 2, $80, $80, PalettesCustom_crystal) ; B2 - Crystal 5 +%SpriteProps($B3, 2, 2, $80, $80, PalettesCustom_crystal) ; B3 - Crystal 7 +%SpriteProps($B4, 2, 2, $80, $80, PalettesCustom_crystal) ; B4 - Crystal 2 +%SpriteProps($B5, 2, 2, $80, $80, PalettesCustom_crystal) ; B5 - Crystal 4 +%SpriteProps($B6, 2, 2, $80, $80, PalettesCustom_crystal) ; B6 - Crystal 3 +%SpriteProps($B7, 2, 2, $80, $80, $0000) ; B7 - Reserved +%SpriteProps($B8, 2, 2, $04, $04, $0000) ; B8 - +%SpriteProps($B9, 2, 2, $04, $04, $0000) ; B9 - +%SpriteProps($BA, 2, 2, $04, $04, $0000) ; BA - +%SpriteProps($BB, 2, 2, $04, $04, $0000) ; BB - +%SpriteProps($BC, 2, 2, $04, $04, $0000) ; BC - +%SpriteProps($BD, 2, 2, $04, $04, $0000) ; BD - +%SpriteProps($BE, 2, 2, $04, $04, $0000) ; BE - +%SpriteProps($BF, 2, 2, $04, $04, $0000) ; BF - +%SpriteProps($C0, 2, 2, $04, $04, $0000) ; C0 - +%SpriteProps($C1, 2, 2, $04, $04, $0000) ; C1 - +%SpriteProps($C2, 2, 2, $04, $04, $0000) ; C2 - +%SpriteProps($C3, 2, 2, $04, $04, $0000) ; C3 - +%SpriteProps($C4, 2, 2, $04, $04, $0000) ; C4 - +%SpriteProps($C5, 2, 2, $04, $04, $0000) ; C5 - +%SpriteProps($C6, 2, 2, $04, $04, $0000) ; C6 - +%SpriteProps($C7, 2, 2, $04, $04, $0000) ; C7 - +%SpriteProps($C8, 2, 2, $04, $04, $0000) ; C8 - +%SpriteProps($C9, 2, 2, $04, $04, $0000) ; C9 - +%SpriteProps($CA, 2, 2, $04, $04, $0000) ; CA - +%SpriteProps($CB, 2, 2, $04, $04, $0000) ; CB - +%SpriteProps($CC, 2, 2, $04, $04, $0000) ; CC - +%SpriteProps($CD, 2, 2, $04, $04, $0000) ; CD - +%SpriteProps($CE, 2, 2, $04, $04, $0000) ; CE - +%SpriteProps($CF, 2, 2, $04, $04, $0000) ; CF - +%SpriteProps($D0, 2, 2, $01, $01, PalettesVanilla_green_blue_guard+$0E) ; D0 - Bee Trap todo: sprite props +%SpriteProps($D1, 2, 2, $01, $01, PalettesVanilla_green_blue_guard+$0E) ; D1 - Apples +%SpriteProps($D2, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; D2 - Fairy +%SpriteProps($D3, 2, 2, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; D3 - Chicken +%SpriteProps($D4, 0, 0, $04, $04, PalettesVanilla_green_blue_guard+$0E) ; D4 - Big Magic +%SpriteProps($D5, 2, 2, $02, $02, PalettesVanilla_blue_ice+$0E) ; D5 - 5 Arrows +%SpriteProps($D6, 0, 0, $02, $02, PalettesVanilla_green_blue_guard+$0E) ; D6 - Good Bee +%SpriteProps($D7, 2, 2, $04, $04, $0000) ; D7 - +%SpriteProps($D8, 2, 2, $04, $04, $0000) ; D8 - +%SpriteProps($D9, 2, 2, $04, $04, $0000) ; D9 - +%SpriteProps($DA, 2, 2, $04, $04, $0000) ; DA - +%SpriteProps($DB, 2, 2, $04, $04, $0000) ; DB - +%SpriteProps($DC, 2, 2, $04, $04, $0000) ; DC - +%SpriteProps($DD, 2, 2, $04, $04, $0000) ; DD - +%SpriteProps($DE, 2, 2, $04, $04, $0000) ; DE - +%SpriteProps($DF, 2, 2, $04, $04, $0000) ; DF - +%SpriteProps($E0, 2, 2, $04, $04, $0000) ; E0 - +%SpriteProps($E1, 2, 2, $04, $04, $0000) ; E1 - +%SpriteProps($E2, 2, 2, $04, $04, $0000) ; E2 - +%SpriteProps($E3, 2, 2, $04, $04, $0000) ; E3 - +%SpriteProps($E4, 2, 2, $04, $04, $0000) ; E4 - +%SpriteProps($E5, 2, 2, $04, $04, $0000) ; E5 - +%SpriteProps($E6, 2, 2, $04, $04, $0000) ; E6 - +%SpriteProps($E7, 2, 2, $04, $04, $0000) ; E7 - +%SpriteProps($E8, 2, 2, $04, $04, $0000) ; E8 - +%SpriteProps($E9, 2, 2, $04, $04, $0000) ; E9 - +%SpriteProps($EA, 2, 2, $04, $04, $0000) ; EA - +%SpriteProps($EB, 2, 2, $04, $04, $0000) ; EB - +%SpriteProps($EC, 2, 2, $04, $04, $0000) ; EC - +%SpriteProps($ED, 2, 2, $04, $04, $0000) ; ED - +%SpriteProps($EE, 2, 2, $04, $04, $0000) ; EE - +%SpriteProps($EF, 2, 2, $04, $04, $0000) ; EF - +%SpriteProps($F0, 2, 2, $04, $04, $0000) ; F0 - +%SpriteProps($F1, 2, 2, $04, $04, $0000) ; F1 - +%SpriteProps($F2, 2, 2, $04, $04, $0000) ; F2 - +%SpriteProps($F3, 2, 2, $04, $04, $0000) ; F3 - +%SpriteProps($F4, 2, 2, $04, $04, $0000) ; F4 - +%SpriteProps($F5, 2, 2, $04, $04, $0000) ; F5 - +%SpriteProps($F6, 2, 2, $04, $04, $0000) ; F6 - +%SpriteProps($F7, 2, 2, $04, $04, $0000) ; F7 - +%SpriteProps($F8, 2, 2, $04, $04, $0000) ; F8 - +%SpriteProps($F9, 2, 2, $04, $04, $0000) ; F9 - +%SpriteProps($FA, 2, 2, $04, $04, $0000) ; FA - +%SpriteProps($FB, 2, 2, $04, $04, $0000) ; FB - +%SpriteProps($FC, 2, 2, $04, $04, $0000) ; FC - +%SpriteProps($FD, 2, 2, $04, $04, $0000) ; FD - +%SpriteProps($FE, 2, 2, $FF, $FF, $0000) ; FE - Server request (async) +%SpriteProps($FF, 2, 2, $04, $04, $0000) ; FF - + +;------------------------------------------------------------------------------ +; Properties: - - - - - - - - p k w o a y s t +; t = Count for total item counter | s = Count for total in shops +; y = Y item | a = A item +; o = Bomb item | w = Bow item +; k = Chest Key | p = Crystal prize behavior (sparkle, etc) if set +InventoryTable: + .properties : fillword $0000 : fill 256*2 ; See above + .stamp : fillword $0000 : fill 256*2 ; Address to stamp with 32-bit time (bank $7E) + .stat : fillword $0000 : fill 256*2 ; Address to increment by one (bank $7E) + +macro InventoryItem(id, props, stamp, stat) + pushpc + org InventoryTable_properties++ : dw + org InventoryTable_stamp++ : dw + org InventoryTable_stat++ : dw + pullpc +endmacro + +%InventoryItem($00, $0081, SwordTime, $0000) ; 00 - Fighter sword & Shield +%InventoryItem($01, $0081, SwordTime, $0000) ; 01 - Master sword +%InventoryItem($02, $0001, SwordTime, $0000) ; 02 - Tempered sword +%InventoryItem($03, $0081, SwordTime, $0000) ; 03 - Butter sword +%InventoryItem($04, $0081, $0000, $0000) ; 04 - Fighter shield +%InventoryItem($05, $0081, $0000, $0000) ; 05 - Fire shield +%InventoryItem($06, $0081, $0000, $0000) ; 06 - Mirror shield +%InventoryItem($07, $0085, $0000, $0000) ; 07 - Fire rod +%InventoryItem($08, $0085, $0000, $0000) ; 08 - Ice rod +%InventoryItem($09, $0085, $0000, $0000) ; 09 - Hammer +%InventoryItem($0A, $0085, $0000, $0000) ; 0A - Hookshot +%InventoryItem($0B, $0085, $0000, $0000) ; 0B - Bow +%InventoryItem($0C, $0085, $0000, $0000) ; 0C - Blue Boomerang +%InventoryItem($0D, $0085, $0000, $0000) ; 0D - Powder +%InventoryItem($0E, $0081, $0000, $0000) ; 0E - Bottle refill (bee) +%InventoryItem($0F, $0085, $0000, $0000) ; 0F - Bombos +%InventoryItem($10, $0085, $0000, $0000) ; 10 - Ether +%InventoryItem($11, $0085, $0000, $0000) ; 11 - Quake +%InventoryItem($12, $0085, $0000, $0000) ; 12 - Lamp +%InventoryItem($13, $0085, $0000, $0000) ; 13 - Shovel +%InventoryItem($14, $0085, FluteTime, $0000) ; 14 - Flute (inactive) +%InventoryItem($15, $0085, $0000, $0000) ; 15 - Somaria +%InventoryItem($16, $0085, $0000, $0000) ; 16 - Bottle +%InventoryItem($17, $0001, $0000, HeartPieceCounter) ; 17 - Heart piece +%InventoryItem($18, $0085, $0000, $0000) ; 18 - Byrna +%InventoryItem($19, $0085, $0000, $0000) ; 19 - Cape +%InventoryItem($1A, $0085, MirrorTime, $0000) ; 1A - Mirror +%InventoryItem($1B, $0089, $0000, $0000) ; 1B - Glove +%InventoryItem($1C, $0089, $0000, $0000) ; 1C - Mitts +%InventoryItem($1D, $0085, $0000, $0000) ; 1D - Book +%InventoryItem($1E, $0089, $0000, $0000) ; 1E - Flippers +%InventoryItem($1F, $0081, $0000, $0000) ; 1F - Pearl +%InventoryItem($20, $0080, $0000, $0000) ; 20 - Crystal +%InventoryItem($21, $0085, $0000, $0000) ; 21 - Net +%InventoryItem($22, $0081, $0000, $0000) ; 22 - Blue mail +%InventoryItem($23, $0081, $0000, $0000) ; 23 - Red mail +%InventoryItem($24, $0041, $0000, SmallKeyCounter) ; 24 - Small key +%InventoryItem($25, $0001, $0000, $0000) ; 25 - Compass +%InventoryItem($26, $0000, $0000, $0000) ; 26 - Heart container from 4/4 +%InventoryItem($27, $0015, $0000, $0000) ; 27 - Bomb +%InventoryItem($28, $0015, $0000, $0000) ; 28 - 3 bombs +%InventoryItem($29, $0085, $0000, $0000) ; 29 - Mushroom +%InventoryItem($2A, $0005, $0000, $0000) ; 2A - Red boomerang +%InventoryItem($2B, $0085, $0000, $0000) ; 2B - Full bottle (red) +%InventoryItem($2C, $0085, $0000, $0000) ; 2C - Full bottle (green) +%InventoryItem($2D, $0085, $0000, $0000) ; 2D - Full bottle (blue) +%InventoryItem($2E, $0081, $0000, $0000) ; 2E - Potion refill (red) +%InventoryItem($2F, $0081, $0000, $0000) ; 2F - Potion refill (green) +%InventoryItem($30, $0081, $0000, $0000) ; 30 - Potion refill (blue) +%InventoryItem($31, $0011, $0000, $0000) ; 31 - 10 bombs +%InventoryItem($32, $0001, $0000, $0000) ; 32 - Big key +%InventoryItem($33, $0001, $0000, $0000) ; 33 - Map +%InventoryItem($34, $0001, $0000, $0000) ; 34 - 1 rupee +%InventoryItem($35, $0001, $0000, $0000) ; 35 - 5 rupees +%InventoryItem($36, $0001, $0000, $0000) ; 36 - 20 rupees +%InventoryItem($37, $0000, $0000, $0000) ; 37 - Green pendant +%InventoryItem($38, $0000, $0000, $0000) ; 38 - Red pendant +%InventoryItem($39, $0000, $0000, $0000) ; 39 - Blue pendant +%InventoryItem($3A, $00A5, $0000, $0000) ; 3A - Bow And Arrows +%InventoryItem($3B, $00A5, $0000, $0000) ; 3B - Silver Bow +%InventoryItem($3C, $0085, $0000, $0000) ; 3C - Full bottle (bee) +%InventoryItem($3D, $0085, $0000, $0000) ; 3D - Full bottle (fairy) +%InventoryItem($3E, $0001, $0000, HeartContainerCounter) ; 3E - Boss heart +%InventoryItem($3F, $0081, $0000, HeartContainerCounter) ; 3F - Sanc heart +%InventoryItem($40, $0001, $0000, $0000) ; 40 - 100 rupees +%InventoryItem($41, $0001, $0000, $0000) ; 41 - 50 rupees +%InventoryItem($42, $0001, $0000, $0000) ; 42 - Heart +%InventoryItem($43, $0001, $0000, $0000) ; 43 - Arrow +%InventoryItem($44, $0001, $0000, $0000) ; 44 - 10 arrows +%InventoryItem($45, $0001, $0000, $0000) ; 45 - Small magic +%InventoryItem($46, $0001, $0000, $0000) ; 46 - 300 rupees +%InventoryItem($47, $0001, $0000, $0000) ; 47 - 20 rupees green +%InventoryItem($48, $0085, $0000, $0000) ; 48 - Full bottle (good bee) +%InventoryItem($49, $0081, $0000, $0000) ; 49 - Tossed fighter sword +%InventoryItem($4A, $0085, FluteTime, $0000) ; 4A - Active Flute +%InventoryItem($4B, $0089, BootsTime, $0000) ; 4B - Boots +%InventoryItem($4C, $0015, $0000, CapacityUpgrades) ; 4C - Bomb capacity (50) +%InventoryItem($4D, $0001, $0000, CapacityUpgrades) ; 4D - Arrow capacity (70) +%InventoryItem($4E, $0081, $0000, CapacityUpgrades) ; 4E - 1/2 magic +%InventoryItem($4F, $0081, $0000, CapacityUpgrades) ; 4F - 1/4 magic +%InventoryItem($50, $0081, SwordTime, $0000) ; 50 - Master Sword (safe) +%InventoryItem($51, $0015, $0000, CapacityUpgrades) ; 51 - Bomb capacity (+5) +%InventoryItem($52, $0015, $0000, CapacityUpgrades) ; 52 - Bomb capacity (+10) +%InventoryItem($53, $0001, $0000, CapacityUpgrades) ; 53 - Arrow capacity (+5) +%InventoryItem($54, $0001, $0000, CapacityUpgrades) ; 54 - Arrow capacity (+10) +%InventoryItem($55, $0001, $0000, $0000) ; 55 - Programmable item 1 +%InventoryItem($56, $0001, $0000, $0000) ; 56 - Programmable item 2 +%InventoryItem($57, $0001, $0000, $0000) ; 57 - Programmable item 3 +%InventoryItem($58, $0081, $0000, $0000) ; 58 - Upgrade-only Silver Arrows +%InventoryItem($59, $0001, $0000, $0000) ; 59 - Rupoor +%InventoryItem($5A, $0001, $0000, $0000) ; 5A - Nothing +%InventoryItem($5B, $0081, $0000, $0000) ; 5B - Red clock +%InventoryItem($5C, $0081, $0000, $0000) ; 5C - Blue clock +%InventoryItem($5D, $0081, $0000, $0000) ; 5D - Green clock +%InventoryItem($5E, $0081, $0000, $0000) ; 5E - Progressive sword +%InventoryItem($5F, $0081, $0000, $0000) ; 5F - Progressive shield +%InventoryItem($60, $0081, $0000, $0000) ; 60 - Progressive armor +%InventoryItem($61, $0089, $0000, $0000) ; 61 - Progressive glove +%InventoryItem($62, $0001, $0000, $0000) ; 62 - RNG pool item (single) +%InventoryItem($63, $0001, $0000, $0000) ; 63 - RNG pool item (multi) +%InventoryItem($64, $00A5, $0000, $0000) ; 64 - Progressive bow +%InventoryItem($65, $00A5, $0000, $0000) ; 65 - Progressive bow +%InventoryItem($66, $0001, $0000, $0000) ; 66 - +%InventoryItem($67, $0001, $0000, $0000) ; 67 - +%InventoryItem($68, $0001, $0000, $0000) ; 68 - +%InventoryItem($69, $0001, $0000, $0000) ; 69 - +%InventoryItem($6A, $0081, $0000, $0000) ; 6A - Triforce +%InventoryItem($6B, $0081, $0000, $0000) ; 6B - Power star +%InventoryItem($6C, $0081, $0000, $0000) ; 6C - Triforce Piece +%InventoryItem($6D, $0001, $0000, $0000) ; 6D - Server request item +%InventoryItem($6E, $0001, $0000, $0000) ; 6E - Server request item (dungeon drop) +%InventoryItem($6F, $0001, $0000, $0000) ; 6F - +%InventoryItem($70, $0001, $0000, $0000) ; 70 - Map of Light World +%InventoryItem($71, $0001, $0000, $0000) ; 71 - Map of Dark World +%InventoryItem($72, $0001, $0000, $0000) ; 72 - Map of Ganon's Tower +%InventoryItem($73, $0001, $0000, $0000) ; 73 - Map of Turtle Rock +%InventoryItem($74, $0001, $0000, $0000) ; 74 - Map of Thieves' Town +%InventoryItem($75, $0001, $0000, $0000) ; 75 - Map of Tower of Hera +%InventoryItem($76, $0001, $0000, $0000) ; 76 - Map of Ice Palace +%InventoryItem($77, $0001, $0000, $0000) ; 77 - Map of Skull Woods +%InventoryItem($78, $0001, $0000, $0000) ; 78 - Map of Misery Mire +%InventoryItem($79, $0001, $0000, $0000) ; 79 - Map of Dark Palace +%InventoryItem($7A, $0001, $0000, $0000) ; 7A - Map of Swamp Palace +%InventoryItem($7B, $0001, $0000, $0000) ; 7B - Map of Agahnim's Tower +%InventoryItem($7C, $0001, $0000, $0000) ; 7C - Map of Desert Palace +%InventoryItem($7D, $0001, $0000, $0000) ; 7D - Map of Eastern Palace +%InventoryItem($7E, $0001, $0000, $0000) ; 7E - Map of Hyrule Castle +%InventoryItem($7F, $0001, $0000, $0000) ; 7F - Map of Sewers +%InventoryItem($80, $0001, $0000, $0000) ; 80 - Compass of Light World +%InventoryItem($81, $0001, $0000, $0000) ; 81 - Compass of Dark World +%InventoryItem($82, $0001, $0000, $0000) ; 82 - Compass of Ganon's Tower +%InventoryItem($83, $0001, $0000, $0000) ; 83 - Compass of Turtle Rock +%InventoryItem($84, $0001, $0000, $0000) ; 84 - Compass of Thieves' Town +%InventoryItem($85, $0001, $0000, $0000) ; 85 - Compass of Tower of Hera +%InventoryItem($86, $0001, $0000, $0000) ; 86 - Compass of Ice Palace +%InventoryItem($87, $0001, $0000, $0000) ; 87 - Compass of Skull Woods +%InventoryItem($88, $0001, $0000, $0000) ; 88 - Compass of Misery Mire +%InventoryItem($89, $0001, $0000, $0000) ; 89 - Compass of Dark Palace +%InventoryItem($8A, $0001, $0000, $0000) ; 8A - Compass of Swamp Palace +%InventoryItem($8B, $0001, $0000, $0000) ; 8B - Compass of Agahnim's Tower +%InventoryItem($8C, $0001, $0000, $0000) ; 8C - Compass of Desert Palace +%InventoryItem($8D, $0001, $0000, $0000) ; 8D - Compass of Eastern Palace +%InventoryItem($8E, $0001, $0000, $0000) ; 8E - Compass of Hyrule Castle +%InventoryItem($8F, $0001, $0000, $0000) ; 8F - Compass of Sewers +%InventoryItem($90, $0081, $0000, $0000) ; 90 - Skull key +%InventoryItem($91, $0001, $0000, $0000) ; 91 - Reserved +%InventoryItem($92, $0001, $0000, $0000) ; 92 - Big key of Ganon's Tower +%InventoryItem($93, $0001, $0000, $0000) ; 93 - Big key of Turtle Rock +%InventoryItem($94, $0001, $0000, $0000) ; 94 - Big key of Thieves' Town +%InventoryItem($95, $0001, $0000, $0000) ; 95 - Big key of Tower of Hera +%InventoryItem($96, $0001, $0000, $0000) ; 96 - Big key of Ice Palace +%InventoryItem($97, $0001, $0000, $0000) ; 97 - Big key of Skull Woods +%InventoryItem($98, $0001, $0000, $0000) ; 98 - Big key of Misery Mire +%InventoryItem($99, $0001, $0000, $0000) ; 99 - Big key of Dark Palace +%InventoryItem($9A, $0001, $0000, $0000) ; 9A - Big key of Swamp Palace +%InventoryItem($9B, $0001, $0000, $0000) ; 9B - Big key of Agahnim's Tower +%InventoryItem($9C, $0001, $0000, $0000) ; 9C - Big key of Desert Palace +%InventoryItem($9D, $0001, $0000, $0000) ; 9D - Big key of Eastern Palace +%InventoryItem($9E, $0001, $0000, $0000) ; 9E - Big key of Hyrule Castle +%InventoryItem($9F, $0001, $0000, $0000) ; 9F - Big key of Sewers +%InventoryItem($A0, $0041, $0000, SmallKeyCounter) ; A0 - Small key of Sewers +%InventoryItem($A1, $0041, $0000, SmallKeyCounter) ; A1 - Small key of Hyrule Castle +%InventoryItem($A2, $0041, $0000, SmallKeyCounter) ; A2 - Small key of Eastern Palace +%InventoryItem($A3, $0041, $0000, SmallKeyCounter) ; A3 - Small key of Desert Palace +%InventoryItem($A4, $0041, $0000, SmallKeyCounter) ; A4 - Small key of Agahnim's Tower +%InventoryItem($A5, $0041, $0000, SmallKeyCounter) ; A5 - Small key of Swamp Palace +%InventoryItem($A6, $0041, $0000, SmallKeyCounter) ; A6 - Small key of Dark Palace +%InventoryItem($A7, $0041, $0000, SmallKeyCounter) ; A7 - Small key of Misery Mire +%InventoryItem($A8, $0041, $0000, SmallKeyCounter) ; A8 - Small key of Skull Woods +%InventoryItem($A9, $0041, $0000, SmallKeyCounter) ; A9 - Small key of Ice Palace +%InventoryItem($AA, $0041, $0000, SmallKeyCounter) ; AA - Small key of Tower of Hera +%InventoryItem($AB, $0041, $0000, SmallKeyCounter) ; AB - Small key of Thieves' Town +%InventoryItem($AC, $0041, $0000, SmallKeyCounter) ; AC - Small key of Turtle Rock +%InventoryItem($AD, $0041, $0000, SmallKeyCounter) ; AD - Small key of Ganon's Tower +%InventoryItem($AE, $0001, $0000, $0000) ; AE - Reserved +%InventoryItem($AF, $0001, $0000, SmallKeyCounter) ; AF - Generic small key +%InventoryItem($B0, $0080, $0000, $0000) ; B0 - Crystal 6 +%InventoryItem($B1, $0080, $0000, $0000) ; B1 - Crystal 1 +%InventoryItem($B2, $0080, $0000, $0000) ; B2 - Crystal 5 +%InventoryItem($B3, $0080, $0000, $0000) ; B3 - Crystal 7 +%InventoryItem($B4, $0080, $0000, $0000) ; B4 - Crystal 2 +%InventoryItem($B5, $0080, $0000, $0000) ; B5 - Crystal 4 +%InventoryItem($B6, $0080, $0000, $0000) ; B6 - Crystal 3 +%InventoryItem($B7, $0000, $0000, $0000) ; B7 - Reserved +%InventoryItem($B8, $0001, $0000, $0000) ; B8 - +%InventoryItem($B9, $0001, $0000, $0000) ; B9 - +%InventoryItem($BA, $0001, $0000, $0000) ; BA - +%InventoryItem($BB, $0001, $0000, $0000) ; BB - +%InventoryItem($BC, $0001, $0000, $0000) ; BC - +%InventoryItem($BD, $0001, $0000, $0000) ; BD - +%InventoryItem($BE, $0001, $0000, $0000) ; BE - +%InventoryItem($BF, $0001, $0000, $0000) ; BF - +%InventoryItem($C0, $0001, $0000, $0000) ; C0 - +%InventoryItem($C1, $0001, $0000, $0000) ; C1 - +%InventoryItem($C2, $0001, $0000, $0000) ; C2 - +%InventoryItem($C3, $0001, $0000, $0000) ; C3 - +%InventoryItem($C4, $0001, $0000, $0000) ; C4 - +%InventoryItem($C5, $0001, $0000, $0000) ; C5 - +%InventoryItem($C6, $0001, $0000, $0000) ; C6 - +%InventoryItem($C7, $0001, $0000, $0000) ; C7 - +%InventoryItem($C8, $0001, $0000, $0000) ; C8 - +%InventoryItem($C9, $0001, $0000, $0000) ; C9 - +%InventoryItem($CA, $0001, $0000, $0000) ; CA - +%InventoryItem($CB, $0001, $0000, $0000) ; CB - +%InventoryItem($CC, $0001, $0000, $0000) ; CC - +%InventoryItem($CD, $0001, $0000, $0000) ; CD - +%InventoryItem($CE, $0001, $0000, $0000) ; CE - +%InventoryItem($CF, $0001, $0000, $0000) ; CF - +%InventoryItem($D0, $0001, $0000, $0000) ; D0 - Bee trap +%InventoryItem($D1, $8001, $0000, $0000) ; D1 - Apples +%InventoryItem($D2, $8001, $0000, $0000) ; D2 - Fairy +%InventoryItem($D3, $0001, $0000, $0000) ; D3 - Chicken +%InventoryItem($D4, $8001, $0000, $0000) ; D4 - Big Magic +%InventoryItem($D5, $0001, $0000, $0000) ; D5 - 5 Arrows +%InventoryItem($D6, $0001, $0000, $0000) ; D6 - Good Bee +%InventoryItem($D7, $0001, $0000, $0000) ; D7 - +%InventoryItem($D8, $0001, $0000, $0000) ; D8 - +%InventoryItem($D9, $0001, $0000, $0000) ; D9 - +%InventoryItem($DA, $0001, $0000, $0000) ; DA - +%InventoryItem($DB, $0001, $0000, $0000) ; DB - +%InventoryItem($DC, $0001, $0000, $0000) ; DC - +%InventoryItem($DD, $0001, $0000, $0000) ; DD - +%InventoryItem($DE, $0001, $0000, $0000) ; DE - +%InventoryItem($DF, $0001, $0000, $0000) ; DF - +%InventoryItem($E0, $0001, $0000, $0000) ; E0 - +%InventoryItem($E1, $0001, $0000, $0000) ; E1 - +%InventoryItem($E2, $0001, $0000, $0000) ; E2 - +%InventoryItem($E3, $0001, $0000, $0000) ; E3 - +%InventoryItem($E4, $0001, $0000, $0000) ; E4 - +%InventoryItem($E5, $0001, $0000, $0000) ; E5 - +%InventoryItem($E6, $0001, $0000, $0000) ; E6 - +%InventoryItem($E7, $0001, $0000, $0000) ; E7 - +%InventoryItem($E8, $0001, $0000, $0000) ; E8 - +%InventoryItem($E9, $0001, $0000, $0000) ; E9 - +%InventoryItem($EA, $0001, $0000, $0000) ; EA - +%InventoryItem($EB, $0001, $0000, $0000) ; EB - +%InventoryItem($EC, $0001, $0000, $0000) ; EC - +%InventoryItem($ED, $0001, $0000, $0000) ; ED - +%InventoryItem($EE, $0001, $0000, $0000) ; EE - +%InventoryItem($EF, $0001, $0000, $0000) ; EF - +%InventoryItem($F0, $0001, $0000, $0000) ; F0 - +%InventoryItem($F1, $0001, $0000, $0000) ; F1 - +%InventoryItem($F2, $0001, $0000, $0000) ; F2 - +%InventoryItem($F3, $0001, $0000, $0000) ; F3 - +%InventoryItem($F4, $0001, $0000, $0000) ; F4 - +%InventoryItem($F5, $0001, $0000, $0000) ; F5 - +%InventoryItem($F6, $0001, $0000, $0000) ; F6 - +%InventoryItem($F7, $0001, $0000, $0000) ; F7 - +%InventoryItem($F8, $0001, $0000, $0000) ; F8 - +%InventoryItem($F9, $0001, $0000, $0000) ; F9 - +%InventoryItem($FA, $0001, $0000, $0000) ; FA - +%InventoryItem($FB, $0001, $0000, $0000) ; FB - +%InventoryItem($FC, $0001, $0000, $0000) ; FC - +%InventoryItem($FD, $0001, $0000, $0000) ; FD - +%InventoryItem($FE, $0001, $0000, $0000) ; FE - Server request (async) +%InventoryItem($FF, $0001, $0000, $0000) ; FF - + +ItemReceiptGraphicsOffsets: + dw $0860 ; 00 - Fighter Sword and Shield + dw BigDecompressionBuffer+$11C0 ; 01 - Master Sword + dw BigDecompressionBuffer+$11C0 ; 01 - Tempered Sword + dw BigDecompressionBuffer+$11C0 ; 03 - Butter Sword + dw BigDecompressionBuffer+$09E0 ; 04 - Fighter Shield + dw BigDecompressionBuffer+$1940 ; 05 - Fire Shield + dw BigDecompressionBuffer+$0C80 ; 06 - Mirror Shield + dw BigDecompressionBuffer+$1C80 ; 07 - Fire Rod + dw BigDecompressionBuffer+$1C80 ; 08 - Ice Rod + dw BigDecompressionBuffer+$1CA0 ; 09 - Hammer + dw BigDecompressionBuffer+$1C60 ; 0A - Hookshot + dw BigDecompressionBuffer+$1C00 ; 0B - Bow + dw BigDecompressionBuffer+$1DE0 ; 0C - Boomerang + dw BigDecompressionBuffer+$1CC0 ; 0D - Powder + dw BigDecompressionBuffer+$09A0 ; 0E - Bottle Refill (bee) + dw BigDecompressionBuffer+$1440 ; 0F - Bombos + dw BigDecompressionBuffer+$1400 ; 10 - Ether + dw BigDecompressionBuffer+$1480 ; 11 - Quake + dw BigDecompressionBuffer+$10C0 ; 12 - Lamp + dw BigDecompressionBuffer+$11E0 ; 13 - Shovel + dw BigDecompressionBuffer+$0C40 ; 14 - Flute + dw BigDecompressionBuffer+$1C40 ; 15 - Somaria + dw BigDecompressionBuffer+$14C0 ; 16 - Bottle + dw BigDecompressionBuffer+$0C00 ; 17 - Heartpiece + dw BigDecompressionBuffer+$1C40 ; 18 - Byrna + dw BigDecompressionBuffer+$1100 ; 19 - Cape + dw BigDecompressionBuffer+$1040 ; 1A - Mirror + dw BigDecompressionBuffer+$1D40 ; 1B - Glove + dw BigDecompressionBuffer+$1D40 ; 1C - Mitts + dw BigDecompressionBuffer+$1D80 ; 1D - Book + dw BigDecompressionBuffer+$1000 ; 1E - Flippers + dw BigDecompressionBuffer+$1180 ; 1F - Pearl + dw BigDecompressionBuffer+$08A0 ; 20 - Crystal + dw BigDecompressionBuffer+$0860 ; 21 - Net + dw BigDecompressionBuffer+$1900 ; 22 - Blue Mail + dw BigDecompressionBuffer+$1900 ; 23 - Red Mail + dw BigDecompressionBuffer+$1DC0 ; 24 - Small Key + dw BigDecompressionBuffer+$1140 ; 25 - Compbutt + dw BigDecompressionBuffer+$18C0 ; 26 - Heart Container from 4/4 + dw BigDecompressionBuffer+$1080 ; 27 - Bomb + dw BigDecompressionBuffer+$1840 ; 28 - 3 bombs + dw BigDecompressionBuffer+$1540 ; 29 - Mushroom + dw BigDecompressionBuffer+$1DE0 ; 2A - Red boomerang + dw BigDecompressionBuffer+$1500 ; 2B - Full bottle (red) + dw BigDecompressionBuffer+$1500 ; 2C - Full bottle (green) + dw BigDecompressionBuffer+$1500 ; 2D - Full bottle (blue) + dw BigDecompressionBuffer+$1500 ; 2E - Potion refill (red) + dw BigDecompressionBuffer+$1500 ; 2F - Potion refill (green) + dw BigDecompressionBuffer+$1500 ; 30 - Potion refill (blue) + dw BigDecompressionBuffer+$1D00 ; 31 - 10 bombs + dw BigDecompressionBuffer+$15C0 ; 32 - Big key + dw BigDecompressionBuffer+$1580 ; 33 - Map + dw BigDecompressionBuffer+$0800 ; 34 - 1 rupee + dw BigDecompressionBuffer+$0800 ; 35 - 5 rupees + dw BigDecompressionBuffer+$0800 ; 36 - 20 rupees + dw $0820 ; 37 - Green pendant + dw BigDecompressionBuffer+$0080 ; 38 - Blue pendant + dw BigDecompressionBuffer+$0080 ; 39 - Red pendant + dw BigDecompressionBuffer+$0920 ; 3A - Tossed bow + dw BigDecompressionBuffer+$08E0 ; 3B - Silver bow + dw BigDecompressionBuffer+$09A0 ; 3C - Full bottle (bee) + dw BigDecompressionBuffer+$0960 ; 3D - Full bottle (fairy) + dw BigDecompressionBuffer+$18C0 ; 3E - Boss heart + dw BigDecompressionBuffer+$18C0 ; 3F - Sanc heart + dw BigDecompressionBuffer+$0D20 ; 40 - 100 rupees + dw BigDecompressionBuffer+$0D60 ; 41 - 50 rupees + dw BigDecompressionBuffer+$0CC0 ; 42 - Heart + dw BigDecompressionBuffer+$0D00 ; 43 - Arrow + dw BigDecompressionBuffer+$1880 ; 44 - 10 arrows + dw BigDecompressionBuffer+$0CE0 ; 45 - Small magic + dw BigDecompressionBuffer+$0DA0 ; 46 - 300 rupees + dw BigDecompressionBuffer+$0000 ; 47 - 20 rupees green + dw BigDecompressionBuffer+$09A0 ; 48 - Full bottle (good bee) + dw BigDecompressionBuffer+$1C20 ; 49 - Tossed fighter sword + dw BigDecompressionBuffer+$0C40 ; 4A - Active Flute + dw BigDecompressionBuffer+$0040 ; 4B - Boots + + ; Rando items + dw $04A0 ; 4C - Bomb capacity (50) + dw $05A0 ; 4D - Arrow capacity (70) + dw $01A0 ; 4E - 1/2 magic + dw $01E0 ; 4F - 1/4 magic + dw $00E0 ; 50 - Safe master sword + dw $0420 ; 51 - Bomb capacity (+5) + dw $0460 ; 52 - Bomb capacity (+10) + dw $0520 ; 53 - Arrow capacity (+5) + dw $0560 ; 54 - Arrow capacity (+10) + dw $0 ; 55 - Programmable item 1 + dw $0 ; 56 - Programmable item 2 + dw $0 ; 57 - Programmable item 3 + dw $05E0 ; 58 - Upgrade-only silver arrows + dw $0 ; 59 - Rupoor + dw $0020 ; 5A - Nothing + dw $0DE0 ; 5B - Red clock + dw $0DE0 ; 5C - Blue clock + dw $0DE0 ; 5D - Green clock + dw $0 ; 5E - Progressive sword + dw $0 ; 5F - Progressive shield + dw $0 ; 60 - Progressive armor + dw $0 ; 61 - Progressive glove + dw $0 ; 62 - RNG pool item (single) + dw $0 ; 63 - RNG pool item (multi) + dw $0 ; 64 - Progressive bow + dw $0 ; 65 - Progressive bow + dw $0 ; 66 - + dw $0 ; 67 - + dw $0 ; 68 - + dw $0 ; 69 - + dw $0060 ; 6A - Triforce + dw $11E0 ; 6B - Power star + dw $0060 ; 6C - Triforce Piece + dw $0 ; 6D - Server request item + dw $0 ; 6E - Server request item (dungeon drop) + dw $0 ; 6F - + + dw BigDecompressionBuffer+$1580 ; 70 - Map of Light World + dw BigDecompressionBuffer+$1580 ; 71 - Map of Dark World + dw BigDecompressionBuffer+$1580 ; 72 - Map of Ganon's Tower + dw BigDecompressionBuffer+$1580 ; 73 - Map of Turtle Rock + dw BigDecompressionBuffer+$1580 ; 74 - Map of Thieves' Town + dw BigDecompressionBuffer+$1580 ; 75 - Map of Tower of Hera + dw BigDecompressionBuffer+$1580 ; 76 - Map of Ice Palace + dw BigDecompressionBuffer+$1580 ; 77 - Map of Skull Woods + dw BigDecompressionBuffer+$1580 ; 78 - Map of Misery Mire + dw BigDecompressionBuffer+$1580 ; 79 - Map of Dark Palace + dw BigDecompressionBuffer+$1580 ; 7A - Map of Swamp Palace + dw BigDecompressionBuffer+$1580 ; 7B - Map of Agahnim's Tower + dw BigDecompressionBuffer+$1580 ; 7C - Map of Desert Palace + dw BigDecompressionBuffer+$1580 ; 7D - Map of Eastern Palace + dw BigDecompressionBuffer+$1580 ; 7E - Map of Hyrule Castle + dw BigDecompressionBuffer+$1580 ; 7F - Map of Sewers + + dw BigDecompressionBuffer+$1140 ; 80 - Compass of Light World + dw BigDecompressionBuffer+$1140 ; 81 - Compass of Dark World + dw BigDecompressionBuffer+$1140 ; 82 - Compass of Ganon's Tower + dw BigDecompressionBuffer+$1140 ; 83 - Compass of Turtle Rock + dw BigDecompressionBuffer+$1140 ; 84 - Compass of Thieves' Town + dw BigDecompressionBuffer+$1140 ; 85 - Compass of Tower of Hera + dw BigDecompressionBuffer+$1140 ; 86 - Compass of Ice Palace + dw BigDecompressionBuffer+$1140 ; 87 - Compass of Skull Woods + dw BigDecompressionBuffer+$1140 ; 88 - Compass of Misery Mire + dw BigDecompressionBuffer+$1140 ; 89 - Compass of Dark Palace + dw BigDecompressionBuffer+$1140 ; 8A - Compass of Swamp Palace + dw BigDecompressionBuffer+$1140 ; 8B - Compass of Agahnim's Tower + dw BigDecompressionBuffer+$1140 ; 8C - Compass of Desert Palace + dw BigDecompressionBuffer+$1140 ; 8D - Compass of Eastern Palace + dw BigDecompressionBuffer+$1140 ; 8E - Compass of Hyrule Castle + dw BigDecompressionBuffer+$1140 ; 8F - Compass of Sewers + dw $0 ; 90 - Skull key + dw $0 ; 91 - Reserved + + dw BigDecompressionBuffer+$15C0 ; 92 - Big key of Ganon's Tower + dw BigDecompressionBuffer+$15C0 ; 93 - Big key of Turtle Rock + dw BigDecompressionBuffer+$15C0 ; 94 - Big key of Thieves' Town + dw BigDecompressionBuffer+$15C0 ; 95 - Big key of Tower of Hera + dw BigDecompressionBuffer+$15C0 ; 96 - Big key of Ice Palace + dw BigDecompressionBuffer+$15C0 ; 97 - Big key of Skull Woods + dw BigDecompressionBuffer+$15C0 ; 98 - Big key of Misery Mire + dw BigDecompressionBuffer+$15C0 ; 99 - Big key of Dark Palace + dw BigDecompressionBuffer+$15C0 ; 9A - Big key of Swamp Palace + dw BigDecompressionBuffer+$15C0 ; 9B - Big key of Agahnim's Tower + dw BigDecompressionBuffer+$15C0 ; 9C - Big key of Desert Palace + dw BigDecompressionBuffer+$15C0 ; 9D - Big key of Eastern Palace + dw BigDecompressionBuffer+$15C0 ; 9E - Big key of Hyrule Castle + dw BigDecompressionBuffer+$15C0 ; 9F - Big key of Sewers + + dw BigDecompressionBuffer+$1DC0 ; A0 - Small key of Sewers + dw BigDecompressionBuffer+$1DC0 ; A1 - Small key of Hyrule Castle + dw BigDecompressionBuffer+$1DC0 ; A2 - Small key of Eastern Palace + dw BigDecompressionBuffer+$1DC0 ; A3 - Small key of Desert Palace + dw BigDecompressionBuffer+$1DC0 ; A4 - Small key of Agahnim's Tower + dw BigDecompressionBuffer+$1DC0 ; A5 - Small key of Swamp Palace + dw BigDecompressionBuffer+$1DC0 ; A6 - Small key of Dark Palace + dw BigDecompressionBuffer+$1DC0 ; A7 - Small key of Misery Mire + dw BigDecompressionBuffer+$1DC0 ; A8 - Small key of Skull Woods + dw BigDecompressionBuffer+$1DC0 ; A9 - Small key of Ice Palace + dw BigDecompressionBuffer+$1DC0 ; AA - Small key of Tower of Hera + dw BigDecompressionBuffer+$1DC0 ; AB - Small key of Thieves' Town + dw BigDecompressionBuffer+$1DC0 ; AC - Small key of Turtle Rock + dw BigDecompressionBuffer+$1DC0 ; AD - Small key of Ganon's Tower + dw $0 ; AE - Reserved + dw BigDecompressionBuffer+$1DC0 ; AF - Generic small key + dw BigDecompressionBuffer+$08A0 ; B0 - Crystal 6 + dw BigDecompressionBuffer+$08A0 ; B1 - Crystal 1 + dw BigDecompressionBuffer+$08A0 ; B2 - Crystal 5 + dw BigDecompressionBuffer+$08A0 ; B3 - Crystal 7 + dw BigDecompressionBuffer+$08A0 ; B4 - Crystal 2 + dw BigDecompressionBuffer+$08A0 ; B5 - Crystal 4 + dw BigDecompressionBuffer+$08A0 ; B6 - Crystal 3 + dw $0 ; B7 - Reserved + dw $0 ; B8 - + dw $0 ; B9 - + dw $0 ; BA - + dw $0 ; BB - + dw $0 ; BC - + dw $0 ; BD - + dw $0 ; BE - + dw $0 ; BF - + dw $0 ; C0 - + dw $0 ; C1 - + dw $0 ; C2 - + dw $0 ; C3 - + dw $0 ; C4 - + dw $0 ; C5 - + dw $0 ; C6 - + dw $0 ; C7 - + dw $0 ; C8 - + dw $0 ; C9 - + dw $0 ; CA - + dw $0 ; CB - + dw $0 ; CC - + dw $0 ; CD - + dw $0 ; CE - + dw $0 ; CF - + dw $11E0 ; D0 - Bee trap + dw $11E0 ; D1 - Apples + dw $11E0 ; D2 - Fairy + dw $11E0 ; D3 - Chicken + dw $11E0 ; D4 - Big Magic + dw $11E0 ; D5 - 5 Arrows + dw $11E0 ; D6 - Good Bee + dw $0 ; D7 - + dw $0 ; D8 - + dw $0 ; D9 - + dw $0 ; DA - + dw $0 ; DB - + dw $0 ; DC - + dw $0 ; DD - + dw $0 ; DE - + dw $0 ; DF - + dw $0 ; E0 - + dw $0 ; E1 - + dw $0 ; E2 - + dw $0 ; E3 - + dw $0 ; E4 - + dw $0 ; E5 - + dw $0 ; E6 - + dw $0 ; E7 - + dw $0 ; E8 - + dw $0 ; E9 - + dw $0 ; EA - + dw $0 ; EB - + dw $0 ; EC - + dw $0 ; ED - + dw $0 ; EE - + dw $0 ; EF - + dw $0 ; F0 - + dw $0 ; F1 - + dw $0 ; F2 - + dw $0 ; F3 - + dw $0 ; F4 - + dw $0 ; F5 - + dw $0 ; F6 - + dw $0 ; F7 - + dw $0 ; F8 - + dw $0 ; F9 - + dw $0 ; FA - + dw $0 ; FB - + dw $0 ; FC - + dw $0 ; FD - + dw $0 ; FE - Server request (async) + dw $0 ; FF - + +;=================================================================================================== +; The table below is for "standing" items, either in heart piece locations, boss heart locations +; or shops etc. Generally we do not and shouldn't use different gfx for this purpose, so this is +; mostly a copy of the previous table. However some items, such as swords, use a separate sprite +; for receipt and non-receipt drawing. +;=================================================================================================== +StandingItemGraphicsOffsets: + dw $0860 ; 00 - Fighter Sword and Shield + dw $00E0 ; 01 - Master Sword + dw $0120 ; 02 - Tempered Sword + dw $0160 ; 03 - Butter Sword + dw BigDecompressionBuffer+$09E0 ; 04 - Fighter Shield + dw BigDecompressionBuffer+$1940 ; 05 - Fire Shield + dw BigDecompressionBuffer+$0C80 ; 06 - Mirror Shield + dw BigDecompressionBuffer+$1C80 ; 07 - Fire Rod + dw BigDecompressionBuffer+$1C80 ; 08 - Ice Rod + dw BigDecompressionBuffer+$1CA0 ; 09 - Hammer + dw BigDecompressionBuffer+$1C60 ; 0A - Hookshot + dw BigDecompressionBuffer+$1C00 ; 0B - Bow + dw BigDecompressionBuffer+$1DE0 ; 0C - Boomerang + dw BigDecompressionBuffer+$1CC0 ; 0D - Powder + dw BigDecompressionBuffer+$09A0 ; 0E - Bottle Refill (bee) + dw BigDecompressionBuffer+$1440 ; 0F - Bombos + dw BigDecompressionBuffer+$1400 ; 10 - Ether + dw BigDecompressionBuffer+$1480 ; 11 - Quake + dw BigDecompressionBuffer+$10C0 ; 12 - Lamp + dw BigDecompressionBuffer+$11E0 ; 13 - Shovel + dw BigDecompressionBuffer+$0C40 ; 14 - Flute + dw BigDecompressionBuffer+$1C40 ; 15 - Somaria + dw BigDecompressionBuffer+$14C0 ; 16 - Bottle + dw BigDecompressionBuffer+$0C00 ; 17 - Heartpiece + dw BigDecompressionBuffer+$1C40 ; 18 - Byrna + dw BigDecompressionBuffer+$1100 ; 19 - Cape + dw BigDecompressionBuffer+$1040 ; 1A - Mirror + dw BigDecompressionBuffer+$1D40 ; 1B - Glove + dw BigDecompressionBuffer+$1D40 ; 1C - Mitts + dw BigDecompressionBuffer+$1D80 ; 1D - Book + dw BigDecompressionBuffer+$1000 ; 1E - Flippers + dw BigDecompressionBuffer+$1180 ; 1F - Pearl + dw BigDecompressionBuffer+$08A0 ; 20 - Crystal + dw BigDecompressionBuffer+$0860 ; 21 - Net + dw BigDecompressionBuffer+$1900 ; 22 - Blue Mail + dw BigDecompressionBuffer+$1900 ; 23 - Red Mail + dw BigDecompressionBuffer+$1DC0 ; 24 - Small Key + dw BigDecompressionBuffer+$1140 ; 25 - Compbutt + dw BigDecompressionBuffer+$18C0 ; 26 - Heart Container from 4/4 + dw BigDecompressionBuffer+$1080 ; 27 - Bomb + dw BigDecompressionBuffer+$1840 ; 28 - 3 bombs + dw BigDecompressionBuffer+$1540 ; 29 - Mushroom + dw BigDecompressionBuffer+$1DE0 ; 2A - Red boomerang + dw BigDecompressionBuffer+$1500 ; 2B - Full bottle (red) + dw BigDecompressionBuffer+$1500 ; 2C - Full bottle (green) + dw BigDecompressionBuffer+$1500 ; 2D - Full bottle (blue) + dw BigDecompressionBuffer+$1500 ; 2E - Potion refill (red) + dw BigDecompressionBuffer+$1500 ; 2F - Potion refill (green) + dw BigDecompressionBuffer+$1500 ; 30 - Potion refill (blue) + dw BigDecompressionBuffer+$1D00 ; 31 - 10 bombs + dw BigDecompressionBuffer+$15C0 ; 32 - Big key + dw BigDecompressionBuffer+$1580 ; 33 - Map + dw BigDecompressionBuffer+$0800 ; 34 - 1 rupee + dw BigDecompressionBuffer+$0800 ; 35 - 5 rupees + dw BigDecompressionBuffer+$0800 ; 36 - 20 rupees + dw $0820 ; 37 - Green pendant + dw BigDecompressionBuffer+$0080 ; 38 - Blue pendant + dw BigDecompressionBuffer+$0080 ; 39 - Red pendant + dw BigDecompressionBuffer+$0920 ; 3A - Tossed bow + dw BigDecompressionBuffer+$08E0 ; 3B - Silvers + dw BigDecompressionBuffer+$09A0 ; 3C - Full bottle (bee) + dw BigDecompressionBuffer+$0960 ; 3D - Full bottle (fairy) + dw BigDecompressionBuffer+$18C0 ; 3E - Boss heart + dw BigDecompressionBuffer+$18C0 ; 3F - Sanc heart + dw BigDecompressionBuffer+$0D20 ; 40 - 100 rupees + dw BigDecompressionBuffer+$0D60 ; 41 - 50 rupees + dw BigDecompressionBuffer+$0CC0 ; 42 - Heart + dw BigDecompressionBuffer+$0D00 ; 43 - Arrow + dw BigDecompressionBuffer+$1880 ; 44 - 10 arrows + dw BigDecompressionBuffer+$0CE0 ; 45 - Small magic + dw BigDecompressionBuffer+$0DA0 ; 46 - 300 rupees + dw BigDecompressionBuffer+$0000 ; 47 - 20 rupees green + dw BigDecompressionBuffer+$09A0 ; 48 - Full bottle (good bee) + dw $00A0 ; 49 - Tossed fighter sword + dw BigDecompressionBuffer+$0C40 ; 4A - Active Flute + dw BigDecompressionBuffer+$0040 ; 4B - Boots + + ; Rando items + dw $04A0 ; 4C - Bomb capacity (50) + dw $05A0 ; 4D - Arrow capacity (70) + dw $01A0 ; 4E - 1/2 magic + dw $01E0 ; 4F - 1/4 magic + dw $00E0 ; 50 - Safe master sword + dw $0420 ; 51 - Bomb capacity (+5) + dw $0460 ; 52 - Bomb capacity (+10) + dw $0520 ; 53 - Arrow capacity (+5) + dw $0560 ; 54 - Arrow capacity (+10) + dw $0 ; 55 - Programmable item 1 + dw $0 ; 56 - Programmable item 2 + dw $0 ; 57 - Programmable item 3 + dw $05E0 ; 58 - Upgrade-only silver arrows + dw $0 ; 59 - Rupoor + dw $0020 ; 5A - Nothing + dw $0DE0 ; 5B - Red clock + dw $0DE0 ; 5C - Blue clock + dw $0DE0 ; 5D - Green clock + dw $0 ; 5E - Progressive sword + dw $0 ; 5F - Progressive shield + dw $0 ; 60 - Progressive armor + dw $0 ; 61 - Progressive glove + dw $0 ; 62 - RNG pool item (single) + dw $0 ; 63 - RNG pool item (multi) + dw $0 ; 64 - Progressive bow + dw $0 ; 65 - Progressive bow + dw $0 ; 66 - + dw $0 ; 67 - + dw $0 ; 68 - + dw $0 ; 69 - + dw $0060 ; 6A - Triforce + dw $11E0 ; 6B - Power star + dw $0060 ; 6C - Triforce Piece + dw $0 ; 6D - Server request item + dw $0 ; 6E - Server request item (dungeon drop) + dw $0 ; 6F - + + dw BigDecompressionBuffer+$1580 ; 70 - Map of Light World + dw BigDecompressionBuffer+$1580 ; 71 - Map of Dark World + dw BigDecompressionBuffer+$1580 ; 72 - Map of Ganon's Tower + dw BigDecompressionBuffer+$1580 ; 73 - Map of Turtle Rock + dw BigDecompressionBuffer+$1580 ; 74 - Map of Thieves' Town + dw BigDecompressionBuffer+$1580 ; 75 - Map of Tower of Hera + dw BigDecompressionBuffer+$1580 ; 76 - Map of Ice Palace + dw BigDecompressionBuffer+$1580 ; 77 - Map of Skull Woods + dw BigDecompressionBuffer+$1580 ; 78 - Map of Misery Mire + dw BigDecompressionBuffer+$1580 ; 79 - Map of Dark Palace + dw BigDecompressionBuffer+$1580 ; 7A - Map of Swamp Palace + dw BigDecompressionBuffer+$1580 ; 7B - Map of Agahnim's Tower + dw BigDecompressionBuffer+$1580 ; 7C - Map of Desert Palace + dw BigDecompressionBuffer+$1580 ; 7D - Map of Eastern Palace + dw BigDecompressionBuffer+$1580 ; 7E - Map of Hyrule Castle + dw BigDecompressionBuffer+$1580 ; 7F - Map of Sewers + + dw BigDecompressionBuffer+$1140 ; 80 - Compass of Light World + dw BigDecompressionBuffer+$1140 ; 81 - Compass of Dark World + dw BigDecompressionBuffer+$1140 ; 82 - Compass of Ganon's Tower + dw BigDecompressionBuffer+$1140 ; 83 - Compass of Turtle Rock + dw BigDecompressionBuffer+$1140 ; 84 - Compass of Thieves' Town + dw BigDecompressionBuffer+$1140 ; 85 - Compass of Tower of Hera + dw BigDecompressionBuffer+$1140 ; 86 - Compass of Ice Palace + dw BigDecompressionBuffer+$1140 ; 87 - Compass of Skull Woods + dw BigDecompressionBuffer+$1140 ; 88 - Compass of Misery Mire + dw BigDecompressionBuffer+$1140 ; 89 - Compass of Dark Palace + dw BigDecompressionBuffer+$1140 ; 8A - Compass of Swamp Palace + dw BigDecompressionBuffer+$1140 ; 8B - Compass of Agahnim's Tower + dw BigDecompressionBuffer+$1140 ; 8C - Compass of Desert Palace + dw BigDecompressionBuffer+$1140 ; 8D - Compass of Eastern Palace + dw BigDecompressionBuffer+$1140 ; 8E - Compass of Hyrule Castle + dw BigDecompressionBuffer+$1140 ; 8F - Compass of Sewers + dw $0 ; 90 - Skull key + dw $0 ; 91 - Reserved + + dw BigDecompressionBuffer+$15C0 ; 92 - Big key of Ganon's Tower + dw BigDecompressionBuffer+$15C0 ; 93 - Big key of Turtle Rock + dw BigDecompressionBuffer+$15C0 ; 94 - Big key of Thieves' Town + dw BigDecompressionBuffer+$15C0 ; 95 - Big key of Tower of Hera + dw BigDecompressionBuffer+$15C0 ; 96 - Big key of Ice Palace + dw BigDecompressionBuffer+$15C0 ; 97 - Big key of Skull Woods + dw BigDecompressionBuffer+$15C0 ; 98 - Big key of Misery Mire + dw BigDecompressionBuffer+$15C0 ; 99 - Big key of Dark Palace + dw BigDecompressionBuffer+$15C0 ; 9A - Big key of Swamp Palace + dw BigDecompressionBuffer+$15C0 ; 9B - Big key of Agahnim's Tower + dw BigDecompressionBuffer+$15C0 ; 9C - Big key of Desert Palace + dw BigDecompressionBuffer+$15C0 ; 9D - Big key of Eastern Palace + dw BigDecompressionBuffer+$15C0 ; 9E - Big key of Hyrule Castle + dw BigDecompressionBuffer+$15C0 ; 9F - Big key of Sewers + + dw BigDecompressionBuffer+$1DC0 ; A0 - Small key of Sewers + dw BigDecompressionBuffer+$1DC0 ; A1 - Small key of Hyrule Castle + dw BigDecompressionBuffer+$1DC0 ; A2 - Small key of Eastern Palace + dw BigDecompressionBuffer+$1DC0 ; A3 - Small key of Desert Palace + dw BigDecompressionBuffer+$1DC0 ; A4 - Small key of Agahnim's Tower + dw BigDecompressionBuffer+$1DC0 ; A5 - Small key of Swamp Palace + dw BigDecompressionBuffer+$1DC0 ; A6 - Small key of Dark Palace + dw BigDecompressionBuffer+$1DC0 ; A7 - Small key of Misery Mire + dw BigDecompressionBuffer+$1DC0 ; A8 - Small key of Skull Woods + dw BigDecompressionBuffer+$1DC0 ; A9 - Small key of Ice Palace + dw BigDecompressionBuffer+$1DC0 ; AA - Small key of Tower of Hera + dw BigDecompressionBuffer+$1DC0 ; AB - Small key of Thieves' Town + dw BigDecompressionBuffer+$1DC0 ; AC - Small key of Turtle Rock + dw BigDecompressionBuffer+$1DC0 ; AD - Small key of Ganon's Tower + dw $0 ; AE - Reserved + dw BigDecompressionBuffer+$1DC0 ; AF - Generic small key + dw BigDecompressionBuffer+$08A0 ; B0 - Crystal 6 + dw BigDecompressionBuffer+$08A0 ; B1 - Crystal 1 + dw BigDecompressionBuffer+$08A0 ; B2 - Crystal 5 + dw BigDecompressionBuffer+$08A0 ; B3 - Crystal 7 + dw BigDecompressionBuffer+$08A0 ; B4 - Crystal 2 + dw BigDecompressionBuffer+$08A0 ; B5 - Crystal 4 + dw BigDecompressionBuffer+$08A0 ; B6 - Crystal 3 + dw $0 ; B7 - Reserved + dw $0 ; B8 - + dw $0 ; B9 - + dw $0 ; BA - + dw $0 ; BB - + dw $0 ; BC - + dw $0 ; BD - + dw $0 ; BE - + dw $0 ; BF - + dw $0 ; C0 - + dw $0 ; C1 - + dw $0 ; C2 - + dw $0 ; C3 - + dw $0 ; C4 - + dw $0 ; C5 - + dw $0 ; C6 - + dw $0 ; C7 - + dw $0 ; C8 - + dw $0 ; C9 - + dw $0 ; CA - + dw $0 ; CB - + dw $0 ; CC - + dw $0 ; CD - + dw $0 ; CE - + dw $0 ; CF - + dw BigDecompressionBuffer+$09A0 ; D0 - Bee trap + dw $0 ; D1 - Apples + dw $0 ; D2 - Fairy + dw $11E0 ; D3 - Chicken + dw $01E0 ; D4 - Big Magic + dw $11E0 ; D5 - 5 Arrows + dw $0 ; D6 - Good Bee + dw $0 ; D7 - + dw $0 ; D8 - + dw $0 ; D9 - + dw $0 ; DA - + dw $0 ; DB - + dw $0 ; DC - + dw $0 ; DD - + dw $0 ; DE - + dw $0 ; DF - + dw $0 ; E0 - + dw $0 ; E1 - + dw $0 ; E2 - + dw $0 ; E3 - + dw $0 ; E4 - + dw $0 ; E5 - + dw $0 ; E6 - + dw $0 ; E7 - + dw $0 ; E8 - + dw $0 ; E9 - + dw $0 ; EA - + dw $0 ; EB - + dw $0 ; EC - + dw $0 ; ED - + dw $0 ; EE - + dw $0 ; EF - + dw $0 ; F0 - + dw $0 ; F1 - + dw $0 ; F2 - + dw $0 ; F3 - + dw $0 ; F4 - + dw $0 ; F5 - + dw $0 ; F6 - + dw $0 ; F7 - + dw $0 ; F8 - + dw $0 ; F9 - + dw $0 ; FA - + dw $0 ; FB - + dw $0 ; FC - + dw $0 ; FD - + dw $0 ; FE - Server request (async) + dw $0 ; FF - + +; high byte is ignore currently for narrow sprites, can't use stuff in OAM2 yet +; may mess with palette as well +VRAMAddressOffset: + dw $0024 ; 00 - Fighter Sword and Shield + dw $0024 ; 01 - Master Sword + dw $0024 ; 02 - Tempered Sword + dw $0024 ; 03 - Butter Sword + dw $0024 ; 04 - Fighter Shield + dw $0024 ; 05 - Fire Shield + dw $0024 ; 06 - Mirror Shield + dw $0024 ; 07 - Fire Rod + dw $0024 ; 08 - Ice Rod + dw $0024 ; 09 - Hammer + dw $0024 ; 0A - Hookshot + dw $0024 ; 0B - Bow + dw $0024 ; 0C - Boomerang + dw $0024 ; 0D - Powder + dw $0024 ; 0E - Bottle Refill (bee) + dw $0024 ; 0F - Bombos + dw $0024 ; 10 - Ether + dw $0024 ; 11 - Quake + dw $0024 ; 12 - Lamp + dw $0024 ; 13 - Shovel + dw $0024 ; 14 - Flute + dw $0024 ; 15 - Somaria + dw $0024 ; 16 - Bottle + dw $0024 ; 17 - Heartpiece + dw $0024 ; 18 - Byrna + dw $0024 ; 19 - Cape + dw $0024 ; 1A - Mirror + dw $0024 ; 1B - Glove + dw $0024 ; 1C - Mitts + dw $0024 ; 1D - Book + dw $0024 ; 1E - Flippers + dw $0024 ; 1F - Pearl + dw $0024 ; 20 - Crystal + dw $0024 ; 21 - Net + dw $0024 ; 22 - Blue Mail + dw $0024 ; 23 - Red Mail + dw $0024 ; 24 - Small Key + dw $0024 ; 25 - Compbutt + dw $0024 ; 26 - Heart Container from 4/4 + dw $0024 ; 27 - Bomb + dw $0024 ; 28 - 3 bombs + dw $0024 ; 29 - Mushroom + dw $0024 ; 2A - Red boomerang + dw $0024 ; 2B - Full bottle (red) + dw $0024 ; 2C - Full bottle (green) + dw $0024 ; 2D - Full bottle (blue) + dw $0024 ; 2E - Potion refill (red) + dw $0024 ; 2F - Potion refill (green) + dw $0024 ; 30 - Potion refill (blue) + dw $0024 ; 31 - 10 bombs + dw $0024 ; 32 - Big key + dw $0024 ; 33 - Map + dw $000B ; 34 - 1 rupee + dw $000B ; 35 - 5 rupees + dw $000B ; 36 - 20 rupees + dw $0024 ; 37 - Green pendant + dw $0024 ; 38 - Blue pendant + dw $0024 ; 39 - Red pendant + dw $0024 ; 3A - Tossed bow + dw $0024 ; 3B - Silvers + dw $0024 ; 3C - Full bottle (bee) + dw $0024 ; 3D - Full bottle (fairy) + dw $0024 ; 3E - Boss heart + dw $0024 ; 3F - Sanc heart + dw $0024 ; 40 - 100 rupees + dw $0024 ; 41 - 50 rupees + dw $0024 ; 42 - Heart + dw $0024 ; 43 - Arrow + dw $0024 ; 44 - 10 arrows + dw $0060 ; 45 - Small magic + dw $0024 ; 46 - 300 rupees + dw $0024 ; 47 - 20 rupees green + dw $0024 ; 48 - Full bottle (good bee) + dw $0024 ; 49 - Tossed fighter sword + dw $0024 ; 4A - Active Flute + dw $0024 ; 4B - Boots + + ; Rando items + dw $0024 ; 4C - Bomb capacity (50) + dw $0024 ; 4D - Arrow capacity (70) + dw $0024 ; 4E - 1/2 magic + dw $0024 ; 4F - 1/4 magic + dw $0024 ; 50 - Safe master sword + dw $0024 ; 51 - Bomb capacity (+5) + dw $0024 ; 52 - Bomb capacity (+10) + dw $0024 ; 53 - Arrow capacity (+5) + dw $0024 ; 54 - Arrow capacity (+10) + dw $0024 ; 55 - Programmable item 1 + dw $0024 ; 56 - Programmable item 2 + dw $0024 ; 57 - Programmable item 3 + dw $0024 ; 58 - Upgrade-only silver arrows + dw $0024 ; 59 - Rupoor + dw $0024 ; 5A - Nothing + dw $0024 ; 5B - Red clock + dw $0024 ; 5C - Blue clock + dw $0024 ; 5D - Green clock + dw $0024 ; 5E - Progressive sword + dw $0024 ; 5F - Progressive shield + dw $0024 ; 60 - Progressive armor + dw $0024 ; 61 - Progressive glove + dw $0024 ; 62 - RNG pool item (single) + dw $0024 ; 63 - RNG pool item (multi) + dw $0024 ; 64 - Progressive bow + dw $0024 ; 65 - Progressive bow + dw $0024 ; 66 - + dw $0024 ; 67 - + dw $0024 ; 68 - + dw $0024 ; 69 - + dw $0024 ; 6A - Triforce + dw $0024 ; 6B - Power star + dw $0024 ; 6C - Triforce Piece + dw $0024 ; 6D - Server request item + dw $0024 ; 6E - Server request item (dungeon drop) + dw $0024 ; 6F - + + dw $0024 ; 70 - Map of Light World + dw $0024 ; 71 - Map of Dark World + dw $0024 ; 72 - Map of Ganon's Tower + dw $0024 ; 73 - Map of Turtle Rock + dw $0024 ; 74 - Map of Thieves' Town + dw $0024 ; 75 - Map of Tower of Hera + dw $0024 ; 76 - Map of Ice Palace + dw $0024 ; 77 - Map of Skull Woods + dw $0024 ; 78 - Map of Misery Mire + dw $0024 ; 79 - Map of Dark Palace + dw $0024 ; 7A - Map of Swamp Palace + dw $0024 ; 7B - Map of Agahnim's Tower + dw $0024 ; 7C - Map of Desert Palace + dw $0024 ; 7D - Map of Eastern Palace + dw $0024 ; 7E - Map of Hyrule Castle + dw $0024 ; 7F - Map of Sewers + + dw $0024 ; 80 - Compass of Light World + dw $0024 ; 81 - Compass of Dark World + dw $0024 ; 82 - Compass of Ganon's Tower + dw $0024 ; 83 - Compass of Turtle Rock + dw $0024 ; 84 - Compass of Thieves' Town + dw $0024 ; 85 - Compass of Tower of Hera + dw $0024 ; 86 - Compass of Ice Palace + dw $0024 ; 87 - Compass of Skull Woods + dw $0024 ; 88 - Compass of Misery Mire + dw $0024 ; 89 - Compass of Dark Palace + dw $0024 ; 8A - Compass of Swamp Palace + dw $0024 ; 8B - Compass of Agahnim's Tower + dw $0024 ; 8C - Compass of Desert Palace + dw $0024 ; 8D - Compass of Eastern Palace + dw $0024 ; 8E - Compass of Hyrule Castle + dw $0024 ; 8F - Compass of Sewers + dw $0024 ; 90 - Skull key + dw $0024 ; 91 - Reserved + + dw $0024 ; 92 - Big key of Ganon's Tower + dw $0024 ; 93 - Big key of Turtle Rock + dw $0024 ; 94 - Big key of Thieves' Town + dw $0024 ; 95 - Big key of Tower of Hera + dw $0024 ; 96 - Big key of Ice Palace + dw $0024 ; 97 - Big key of Skull Woods + dw $0024 ; 98 - Big key of Misery Mire + dw $0024 ; 99 - Big key of Dark Palace + dw $0024 ; 9A - Big key of Swamp Palace + dw $0024 ; 9B - Big key of Agahnim's Tower + dw $0024 ; 9C - Big key of Desert Palace + dw $0024 ; 9D - Big key of Eastern Palace + dw $0024 ; 9E - Big key of Hyrule Castle + dw $0024 ; 9F - Big key of Sewers + + dw $006B ; A0 - Small key of Sewers + dw $006B ; A1 - Small key of Hyrule Castle + dw $006B ; A2 - Small key of Eastern Palace + dw $006B ; A3 - Small key of Desert Palace + dw $006B ; A4 - Small key of Agahnim's Tower + dw $006B ; A5 - Small key of Swamp Palace + dw $006B ; A6 - Small key of Dark Palace + dw $006B ; A7 - Small key of Misery Mire + dw $006B ; A8 - Small key of Skull Woods + dw $006B ; A9 - Small key of Ice Palace + dw $006B ; AA - Small key of Tower of Hera + dw $006B ; AB - Small key of Thieves' Town + dw $006B ; AC - Small key of Turtle Rock + dw $006B ; AD - Small key of Ganon's Tower + dw $0024 ; AE - Reserved + dw $006B ; AF - Generic small key + dw $0024 ; B0 - Crystal 6 + dw $0024 ; B1 - Crystal 1 + dw $0024 ; B2 - Crystal 5 + dw $0024 ; B3 - Crystal 7 + dw $0024 ; B4 - Crystal 2 + dw $0024 ; B5 - Crystal 4 + dw $0024 ; B6 - Crystal 3 + dw $0024 ; B7 - Reserved + dw $0024 ; B8 - + dw $0024 ; B9 - + dw $0024 ; BA - + dw $0024 ; BB - + dw $0024 ; BC - + dw $0024 ; BD - + dw $0024 ; BE - + dw $0024 ; BF - + dw $0024 ; C0 - + dw $0024 ; C1 - + dw $0024 ; C2 - + dw $0024 ; C3 - + dw $0024 ; C4 - + dw $0024 ; C5 - + dw $0024 ; C6 - + dw $0024 ; C7 - + dw $0024 ; C8 - + dw $0024 ; C9 - + dw $0024 ; CA - + dw $0024 ; CB - + dw $0024 ; CC - + dw $0024 ; CD - + dw $0024 ; CE - + dw $0024 ; CF - + dw $0024 ; D0 - Bee trap + dw $00E5 ; D1 - Apples + dw $00EA ; D2 - Fairy + dw $0024 ; D3 - Chicken + dw $0062 ; D4 - Big Magic + dw $0024 ; D5 - 5 Arrows + dw $00E4 ; D6 - Good Bee + dw $0024 ; D7 - + dw $0024 ; D8 - + dw $0024 ; D9 - + dw $0024 ; DA - + dw $0024 ; DB - + dw $0024 ; DC - + dw $0024 ; DD - + dw $0024 ; DE - + dw $0024 ; DF - + dw $0024 ; E0 - + dw $0024 ; E1 - + dw $0024 ; E2 - + dw $0024 ; E3 - + dw $0024 ; E4 - + dw $0024 ; E5 - + dw $0024 ; E6 - + dw $0024 ; E7 - + dw $0024 ; E8 - + dw $0024 ; E9 - + dw $0024 ; EA - + dw $0024 ; EB - + dw $0024 ; EC - + dw $0024 ; ED - + dw $0024 ; EE - + dw $0024 ; EF - + dw $0024 ; F0 - + dw $0024 ; F1 - + dw $0024 ; F2 - + dw $0024 ; F3 - + dw $0024 ; F4 - + dw $0024 ; F5 - + dw $0024 ; F6 - + dw $0024 ; F7 - + dw $0024 ; F8 - + dw $0024 ; F9 - + dw $0024 ; FA - + dw $0024 ; FB - + dw $0024 ; FC - + dw $0024 ; FD - + dw $0024 ; FE - Server request (async) + dw $0024 ; FF - diff --git a/itemdowngrade.asm b/itemdowngrade.asm index a1f19f6..b0b6c46 100644 --- a/itemdowngrade.asm +++ b/itemdowngrade.asm @@ -2,12 +2,7 @@ ; Item Downgrade Fix ;-------------------------------------------------------------------------------- ItemDowngradeFix: - JSR ItemDowngradeFixMain - JSL CountChestKeyLong -RTL - -ItemDowngradeFixMain: - JSL.l AddInventory + JSL AddInventory BMI .dontWrite ; thing we wrote over part 1 CPY.b #$1B : BEQ .isPowerGloves ; Power Gloves @@ -32,18 +27,18 @@ ItemDowngradeFixMain: CPY.b #$00 : BEQ .isUncleSwordShield ; Fighter's Sword & Shield .done - STA [$00] ; thing we wrote over part 2 + STA.b [Scrap00] ; thing we wrote over part 2 .dontWrite -RTS +RTL .isPowerGloves .isBlueShield .isRedShield .isBlueBoomerang .isBow .isBowAndArrows - CMP [$00] : !BGE .done ; finished if we're upgrading - LDA [$00] ; reload old value -RTS + CMP.b [$00] : !BGE .done ; finished if we're upgrading + LDA.b [$00] ; reload old value +RTL .isSilverArrowBow .isRedBoomerang .isMagicPowder @@ -51,31 +46,31 @@ RTS .isShovel .isMushroom PHA - LDA [$00] : BNE + ; don't upgrade if we already have the toggle for it + LDA.b [Scrap00] : BNE + ; don't upgrade if we already have the toggle for it PLA - STA [$00] - RTS + STA.b [Scrap00] + RTL + PLA -RTS +RTL .isSword PHA - LDA HighestSword : STA $04 + LDA.l HighestSword : STA.b Scrap04 TYA ; load sword item CMP.b #$49 : BNE + : LDA.b #$00 : + ; convert extra fighter's sword to normal one CMP.b #$50 : BNE + : LDA.b #$01 : + ; convert extra master sword to normal one - INC : CMP $04 : !BGE + ; skip if highest is lower (this is an upgrade) - LDA $04 : DEC ; convert to item id - TAY : PLA : LDA $04 ; put sword id into the thing to write + INC : CMP.b Scrap04 : !BGE + ; skip if highest is lower (this is an upgrade) + LDA.b Scrap04 : DEC ; convert to item id + TAY : PLA : LDA.b Scrap04 ; put sword id into the thing to write JMP .done + PLA JMP .done .isUncleSwordShield PHA - LDA HighestSword : STA [$00] ; already set to 1 if we had no sword, always keep highest - INC $00 - LDA HighestShield : STA [$00] + LDA.l HighestSword : STA.b [Scrap00] ; already set to 1 if we had no sword, always keep highest + INC.b Scrap00 + LDA.l HighestShield : STA.b [Scrap00] PLA -RTS +RTL ;================================================================================ diff --git a/itemtext.asm b/itemtext.asm index f4d32c1..d4061f7 100644 --- a/itemtext.asm +++ b/itemtext.asm @@ -1,113 +1,147 @@ -org $328000 +org $B28000 ; You have found ; the map of Notice_MapOf: - db $74, $00, $C2, $00, $B8, $00, $BE, $00, $FF, $00, $B1, $00, $AA, $00, $BF, $00, $AE, $00, $FF, $00, $AF, $00, $B8, $00, $BE, $00, $B7, $00, $AD - db $75, $00, $BD, $00, $B1, $00, $AE, $00, $FF, $00, $B6, $00, $AA, $00, $B9, $00, $FF, $00, $B8, $00, $AF + db $74, $00, $C2, $00, $DE, $00, $E4, $00, $FF, $00, $D7, $00, $D0, $00, $E5, $00, $D4, $00, $FF, $00, $D5, $00, $DE, $00, $E4, $00, $DD, $00, $D3 + db $75, $00, $E3, $00, $D7, $00, $D4, $00, $FF, $00, $DC, $00, $D0, $00, $DF, $00, $FF, $00, $DE, $00, $D5 dw #$7F7F ; You have found ; the compass of Notice_CompassOf: - db $74, $00, $C2, $00, $B8, $00, $BE, $00, $FF, $00, $B1, $00, $AA, $00, $BF, $00, $AE, $00, $FF, $00, $AF, $00, $B8, $00, $BE, $00, $B7, $00, $AD - db $75, $00, $BD, $00, $B1, $00, $AE, $00, $FF, $00, $AC, $00, $B8, $00, $B6, $00, $B9, $00, $AA, $00, $BC, $00, $BC, $00, $FF, $00, $B8, $00, $AF + db $74, $00, $C2, $00, $DE, $00, $E4, $00, $FF, $00, $D7, $00, $D0, $00, $E5, $00, $D4, $00, $FF, $00, $D5, $00, $DE, $00, $E4, $00, $DD, $00, $D3 + db $75, $00, $E3, $00, $D7, $00, $D4, $00, $FF, $00, $D2, $00, $DE, $00, $DC, $00, $DF, $00, $D0, $00, $E2, $00, $E2, $00, $FF, $00, $DE, $00, $D5 dw #$7F7F ; Oh look! it's ; the big key of Notice_BigKeyOf: - db $74, $00, $B8, $00, $B1, $00, $FF, $00, $B5, $00, $B8, $00, $B8, $00, $B4, $00, $C7, $00, $FF, $00, $B2, $00, $BD, $00, $D8, $00, $BC - db $75, $00, $BD, $00, $B1, $00, $AE, $00, $FF, $00, $AB, $00, $B2, $00, $B0, $00, $FF, $00, $B4, $00, $AE, $00, $C2, $00, $FF, $00, $B8, $00, $AF + db $74, $00, $B8, $00, $D7, $00, $FF, $00, $DB, $00, $DE, $00, $DE, $00, $DA, $00, $C7, $00, $FF, $00, $D8, $00, $E3, $00, $9D, $00, $E2 + db $75, $00, $E3, $00, $D7, $00, $D4, $00, $FF, $00, $D1, $00, $D8, $00, $D6, $00, $FF, $00, $DA, $00, $D4, $00, $E8, $00, $FF, $00, $DE, $00, $D5 dw #$7F7F ; this is a ; small key to Notice_SmallKeyOf: - db $74, $00, $BD, $00, $B1, $00, $B2, $00, $BC, $00, $FF, $00, $B2, $00, $BC, $00, $FF, $00, $AA - db $75, $00, $BC, $00, $B6, $00, $AA, $00, $B5, $00, $B5, $00, $FF, $00, $B4, $00, $AE, $00, $C2, $00, $FF, $00, $BD, $00, $B8 + db $74, $00, $BD, $00, $D7, $00, $D8, $00, $E2, $00, $FF, $00, $D8, $00, $E2, $00, $FF, $00, $D0 + db $75, $00, $E2, $00, $DC, $00, $D0, $00, $DB, $00, $DB, $00, $FF, $00, $DA, $00, $D4, $00, $E8, $00, $FF, $00, $E3, $00, $DE dw #$7F7F +; You picked up +Notice_Crystal: + db $74, $00, $C2, $00, $DE, $00, $E4, $00, $FF, $00, $DF, $00, $D8, $00, $D2, $00, $DA, $00, $D4, $00, $D3, $00, $FF, $00, $E4, $00, $DF + dw $7F7F + ; light world Notice_LightWorld: - db $76, $00, $B5, $00, $B2, $00, $B0, $00, $B1, $00, $BD, $00, $FF, $00, $C0, $00, $B8, $00, $BB, $00, $B5, $00, $AD + db $76, $00, $B5, $00, $D8, $00, $D6, $00, $D7, $00, $E3, $00, $FF, $00, $C0, $00, $DE, $00, $E1, $00, $DB, $00, $D3 dw #$7F7F ; dark world Notice_DarkWorld: - db $76, $00, $AD, $00, $AA, $00, $BB, $00, $B4, $00, $FF, $00, $C0, $00, $B8, $00, $BB, $00, $B5, $00, $AD + db $76, $00, $AD, $00, $D0, $00, $E1, $00, $DA, $00, $FF, $00, $C0, $00, $DE, $00, $E1, $00, $DB, $00, $D3 dw #$7F7F ; Ganons Tower Notice_GTower: - db $76, $00, $B0, $00, $AA, $00, $B7, $00, $B8, $00, $B7, $00, $BC, $00, $FF, $00, $BD, $00, $B8, $00, $C0, $00, $AE, $00, $BB + db $76, $00, $B0, $00, $D0, $00, $DD, $00, $DE, $00, $DD, $00, $E2, $00, $FF, $00, $BD, $00, $DE, $00, $E6, $00, $D4, $00, $E1 dw #$7F7F ; Turtle Rock Notice_TRock: - db $76, $00, $BD, $00, $BE, $00, $BB, $00, $BD, $00, $B5, $00, $AE, $00, $FF, $00, $BB, $00, $B8, $00, $AC, $00, $B4 + db $76, $00, $BD, $00, $E4, $00, $E1, $00, $E3, $00, $DB, $00, $D4, $00, $FF, $00, $BB, $00, $DE, $00, $D2, $00, $DA dw #$7F7F ; Thieves Town Notice_Thieves: - db $76, $00, $BD, $00, $B1, $00, $B2, $00, $AE, $00, $BF, $00, $AE, $00, $BC, $00, $FF, $00, $BD, $00, $B8, $00, $C0, $00, $B7 + db $76, $00, $BD, $00, $D7, $00, $D8, $00, $D4, $00, $E5, $00, $D4, $00, $E2, $00, $FF, $00, $BD, $00, $DE, $00, $E6, $00, $DD dw #$7F7F ; Tower of Hera Notice_Hera: - db $76, $00, $BD, $00, $B8, $00, $C0, $00, $AE, $00, $BB, $00, $FF, $00, $B8, $00, $AF, $00, $FF, $00, $B1, $00, $AE, $00, $BB, $00, $AA + db $76, $00, $BD, $00, $DE, $00, $E6, $00, $D4, $00, $E1, $00, $FF, $00, $DE, $00, $D5, $00, $FF, $00, $B1, $00, $D4, $00, $E1, $00, $D0 dw #$7F7F ; Ice Palace Notice_Ice: - db $76, $00, $B2, $00, $AC, $00, $AE, $00, $FF, $00, $B9, $00, $AA, $00, $B5, $00, $AA, $00, $AC, $00, $AE + db $76, $00, $B2, $00, $D2, $00, $D4, $00, $FF, $00, $B9, $00, $D0, $00, $DB, $00, $D0, $00, $D2, $00, $D4 dw #$7F7F ; Skull Woods Notice_Skull: - db $76, $00, $BC, $00, $B4, $00, $BE, $00, $B5, $00, $B5, $00, $FF, $00, $C0, $00, $B8, $00, $B8, $00, $AD, $00, $BC + db $76, $00, $BC, $00, $DA, $00, $E4, $00, $DB, $00, $DB, $00, $FF, $00, $C0, $00, $DE, $00, $DE, $00, $D3, $00, $E2 dw #$7F7F ; Misery Mire Notice_Mire: - db $76, $00, $B6, $00, $B2, $00, $BC, $00, $AE, $00, $BB, $00, $C2, $00, $FF, $00, $B6, $00, $B2, $00, $BB, $00, $AE + db $76, $00, $B6, $00, $D8, $00, $E2, $00, $D4, $00, $E1, $00, $E8, $00, $FF, $00, $B6, $00, $D8, $00, $E1, $00, $D4 dw #$7F7F ; Dark Palace Notice_PoD: - db $76, $00, $AD, $00, $AA, $00, $BB, $00, $B4, $00, $FF, $00, $B9, $00, $AA, $00, $B5, $00, $AA, $00, $AC, $00, $AE + db $76, $00, $AD, $00, $D0, $00, $E1, $00, $DA, $00, $FF, $00, $B9, $00, $D0, $00, $DB, $00, $D0, $00, $D2, $00, $D4 dw #$7F7F ; Swamp Palace Notice_Swamp: - db $76, $00, $BC, $00, $C0, $00, $AA, $00, $B6, $00, $B9, $00, $FF, $00, $B9, $00, $AA, $00, $B5, $00, $AA, $00, $AC, $00, $AE + db $76, $00, $BC, $00, $E6, $00, $D0, $00, $DC, $00, $DF, $00, $FF, $00, $B9, $00, $D0, $00, $DB, $00, $D0, $00, $D2, $00, $D4 dw #$7F7F ; Castle Tower Notice_AgaTower: - db $76, $00, $AC, $00, $AA, $00, $BC, $00, $BD, $00, $B5, $00, $AE, $00, $FF, $00, $BD, $00, $B8, $00, $C0, $00, $AE, $00, $BB + db $76, $00, $AC, $00, $D0, $00, $E2, $00, $E3, $00, $DB, $00, $D4, $00, $FF, $00, $BD, $00, $DE, $00, $E6, $00, $D4, $00, $E1 dw #$7F7F ; Desert Palace Notice_Desert: - db $76, $00, $AD, $00, $AE, $00, $BC, $00, $AE, $00, $BB, $00, $BD, $00, $FF, $00, $B9, $00, $AA, $00, $B5, $00, $AA, $00, $AC, $00, $AE + db $76, $00, $AD, $00, $D4, $00, $E2, $00, $D4, $00, $E1, $00, $E3, $00, $FF, $00, $B9, $00, $D0, $00, $DB, $00, $D0, $00, $D2, $00, $D4 dw #$7F7F ; Eastern Palace Notice_Eastern: - db $76, $00, $AE, $00, $AA, $00, $BC, $00, $BD, $00, $AE, $00, $BB, $00, $B7, $00, $FF, $00, $B9, $00, $AA, $00, $B5, $00, $AA, $00, $AC, $00, $AE + db $76, $00, $AE, $00, $D0, $00, $E2, $00, $E3, $00, $D4, $00, $E1, $00, $DD, $00, $FF, $00, $B9, $00, $D0, $00, $DB, $00, $D0, $00, $D2, $00, $D4 dw #$7F7F ; Hyrule Castle Notice_Castle: - db $76, $00, $B1, $00, $C2, $00, $BB, $00, $BE, $00, $B5, $00, $AE, $00, $FF, $00, $AC, $00, $AA, $00, $BC, $00, $BD, $00, $B5, $00, $AE + db $76, $00, $B1, $00, $E8, $00, $E1, $00, $E4, $00, $DB, $00, $D4, $00, $FF, $00, $AC, $00, $D0, $00, $E2, $00, $E3, $00, $DB, $00, $D4 dw #$7F7F ; Hyrule Castle Notice_Sewers: - db $76, $00, $B1, $00, $C2, $00, $BB, $00, $BE, $00, $B5, $00, $AE, $00, $FF, $00, $AC, $00, $AA, $00, $BC, $00, $BD, $00, $B5, $00, $AE + db $76, $00, $B1, $00, $E8, $00, $E1, $00, $E4, $00, $DB, $00, $D4, $00, $FF, $00, $AC, $00, $D0, $00, $E2, $00, $E3, $00, $DB, $00, $D4 dw #$7F7F ; This Dungeon Notice_Self: - db $76, $00, $BD, $00, $B1, $00, $B2, $00, $BC, $00, $FF, $00, $AD, $00, $BE, $00, $B7, $00, $B0, $00, $AE, $00, $B8, $00, $B7 + db $76, $00, $E3, $00, $D7, $00, $D8, $00, $E2, $00, $FF, $00, $D3, $00, $E4, $00, $DD, $00, $D6, $00, $D4, $00, $DE, $00, $Dd + dw #$7F7F + +; Crystal numbers +Notice_One: + db $75, $00, $D2, $00, $E1, $00, $E8, $00, $E2, $00, $E3, $00, $D0, $00, $DB, $00, $FF, $00, $DE, $00, $DD, $00, $D4 + dw #$7F7F + +Notice_Two: + db $75, $00, $D2, $00, $E1, $00, $E8, $00, $E2, $00, $E3, $00, $D0, $00, $DB, $00, $FF, $00, $E3, $00, $E6, $00, $DE + dw #$7F7F + +Notice_Three: + db $75, $00, $D2, $00, $E1, $00, $E8, $00, $E2, $00, $E3, $00, $D0, $00, $DB, $00, $FF, $00, $E3, $00, $D7, $00, $E1, $00, $D4, $00, $D4 + dw #$7F7F + +Notice_Four: + db $75, $00, $D2, $00, $E1, $00, $E8, $00, $E2, $00, $E3, $00, $D0, $00, $DB, $00, $FF, $00, $D5, $00, $DE, $00, $E4, $00, $E1 + dw #$7F7F + +Notice_Five: + db $75, $00, $D2, $00, $E1, $00, $E8, $00, $E2, $00, $E3, $00, $D0, $00, $DB, $00, $FF, $00, $D5, $00, $D8, $00, $E5, $00, $D4 + dw #$7F7F + +Notice_Six: + db $75, $00, $D2, $00, $E1, $00, $E8, $00, $E2, $00, $E3, $00, $D0, $00, $DB, $00, $FF, $00, $E2, $00, $D8, $00, $E7 + dw #$7F7F + +Notice_Seven: + db $75, $00, $D2, $00, $E1, $00, $E8, $00, $E2, $00, $E3, $00, $D0, $00, $DB, $00, $FF, $00, $E2, $00, $D4, $00, $E5, $00, $D4, $00, $DD dw #$7F7F diff --git a/itemtext_lower.asm b/itemtext_lower.asm deleted file mode 100644 index 11abd13..0000000 --- a/itemtext_lower.asm +++ /dev/null @@ -1,113 +0,0 @@ -org $328000 -; You have found -; the Map of -Notice_MapOf: - db $74, $00, $C2, $00, $3E, $00, $44, $00, $FF, $00, $37, $00, $30, $00, $45, $00, $34, $00, $FF, $00, $35, $00, $3E, $00, $44, $00, $3D, $00, $33 - db $75, $00, $43, $00, $37, $00, $34, $00, $FF, $00, $B6, $00, $30, $00, $3F, $00, $FF, $00, $3E, $00, $35 - dw #$7F7F - -; You have found -; the Compass of -Notice_CompassOf: - db $74, $00, $C2, $00, $3E, $00, $44, $00, $FF, $00, $37, $00, $30, $00, $45, $00, $34, $00, $FF, $00, $35, $00, $3E, $00, $44, $00, $3D, $00, $33 - db $75, $00, $43, $00, $37, $00, $34, $00, $FF, $00, $AC, $00, $3E, $00, $3C, $00, $3F, $00, $30, $00, $42, $00, $42, $00, $FF, $00, $3E, $00, $35 - dw #$7F7F - -; Oh look! it's -; the Big Key of -Notice_BigKeyOf: - db $74, $00, $B8, $00, $37, $00, $FF, $00, $3B, $00, $3E, $00, $3E, $00, $3A, $00, $C7, $00, $FF, $00, $38, $00, $43, $00, $D8, $00, $42 - db $75, $00, $43, $00, $37, $00, $34, $00, $FF, $00, $AB, $00, $38, $00, $36, $00, $FF, $00, $B4, $00, $34, $00, $48, $00, $FF, $00, $3E, $00, $35 - dw #$7F7F - -; This is a -; Small Key to -Notice_SmallKeyOf: - db $74, $00, $BD, $00, $37, $00, $38, $00, $42, $00, $FF, $00, $38, $00, $42, $00, $FF, $00, $30 - db $75, $00, $BC, $00, $3C, $00, $30, $00, $3B, $00, $3B, $00, $FF, $00, $B4, $00, $34, $00, $48, $00, $FF, $00, $43, $00, $3E - dw #$7F7F - -; Light World -Notice_LightWorld: - db $76, $00, $B5, $00, $38, $00, $36, $00, $37, $00, $43, $00, $FF, $00, $C0, $00, $3E, $00, $41, $00, $3B, $00, $33 - dw #$7F7F - -; Dark World -Notice_DarkWorld: - db $76, $00, $AD, $00, $30, $00, $41, $00, $3A, $00, $FF, $00, $C0, $00, $3E, $00, $41, $00, $3B, $00, $33 - dw #$7F7F - -; Ganons Tower -Notice_GTower: - db $76, $00, $B0, $00, $30, $00, $3D, $00, $3E, $00, $3D, $00, $42, $00, $FF, $00, $BD, $00, $3E, $00, $46, $00, $34, $00, $41 - dw #$7F7F - -; Turtle Rock -Notice_TRock: - db $76, $00, $BD, $00, $44, $00, $41, $00, $43, $00, $3B, $00, $34, $00, $FF, $00, $BB, $00, $3E, $00, $32, $00, $3A - dw #$7F7F - -; Thieves Town -Notice_Thieves: - db $76, $00, $BD, $00, $37, $00, $38, $00, $34, $00, $45, $00, $34, $00, $42, $00, $FF, $00, $BD, $00, $3E, $00, $46, $00, $3D - dw #$7F7F - -; Tower of Hera -Notice_Hera: - db $76, $00, $BD, $00, $3E, $00, $46, $00, $34, $00, $41, $00, $FF, $00, $3E, $00, $35, $00, $FF, $00, $B1, $00, $34, $00, $41, $00, $30 - dw #$7F7F - -; Ice Palace -Notice_Ice: - db $76, $00, $B2, $00, $32, $00, $34, $00, $FF, $00, $B9, $00, $30, $00, $3B, $00, $30, $00, $32, $00, $34 - dw #$7F7F - -; Skull Woods -Notice_Skull: - db $76, $00, $BC, $00, $3A, $00, $44, $00, $3B, $00, $3B, $00, $FF, $00, $C0, $00, $3E, $00, $3E, $00, $33, $00, $42 - dw #$7F7F - -; Misery Mire -Notice_Mire: - db $76, $00, $B6, $00, $38, $00, $42, $00, $34, $00, $41, $00, $48, $00, $FF, $00, $B6, $00, $38, $00, $41, $00, $34 - dw #$7F7F - -; Dark Palace -Notice_PoD: - db $76, $00, $AD, $00, $30, $00, $41, $00, $3A, $00, $FF, $00, $B9, $00, $30, $00, $3B, $00, $30, $00, $32, $00, $34 - dw #$7F7F - -; Swamp Palace -Notice_Swamp: - db $76, $00, $BC, $00, $46, $00, $30, $00, $3C, $00, $3F, $00, $FF, $00, $B9, $00, $30, $00, $3B, $00, $30, $00, $32, $00, $34 - dw #$7F7F - -; Castle Tower -Notice_AgaTower: - db $76, $00, $AC, $00, $30, $00, $42, $00, $43, $00, $3B, $00, $34, $00, $FF, $00, $BD, $00, $3E, $00, $46, $00, $34, $00, $41 - dw #$7F7F - -; Desert Palace -Notice_Desert: - db $76, $00, $AD, $00, $34, $00, $42, $00, $34, $00, $41, $00, $43, $00, $FF, $00, $B9, $00, $30, $00, $3B, $00, $30, $00, $32, $00, $34 - dw #$7F7F - -; Eastern Palace -Notice_Eastern: - db $76, $00, $AE, $00, $30, $00, $42, $00, $43, $00, $34, $00, $41, $00, $3D, $00, $FF, $00, $B9, $00, $30, $00, $3B, $00, $30, $00, $32, $00, $34 - dw #$7F7F - -; Hyrule Castle -Notice_Castle: - db $76, $00, $B1, $00, $48, $00, $41, $00, $44, $00, $3B, $00, $34, $00, $FF, $00, $AC, $00, $30, $00, $42, $00, $43, $00, $3B, $00, $34 - dw #$7F7F - -; Hyrule Castle -Notice_Sewers: - db $76, $00, $B1, $00, $48, $00, $41, $00, $44, $00, $3B, $00, $34, $00, $FF, $00, $AC, $00, $30, $00, $42, $00, $43, $00, $3B, $00, $34 - dw #$7F7F - -; this dungeon -Notice_Self: - db $76, $00, $43, $00, $37, $00, $38, $00, $42, $00, $FF, $00, $33, $00, $44, $00, $3D, $00, $36, $00, $34, $00, $3E, $00, $3D - dw #$7F7F diff --git a/keydrop/dynamic_si_vram.asm b/keydrop/dynamic_si_vram.asm index f84309c..c63cdf4 100644 --- a/keydrop/dynamic_si_vram.asm +++ b/keydrop/dynamic_si_vram.asm @@ -1,100 +1,77 @@ -; where we shove the decompressed graphics to send to WRAM -DynamicDropGFX = $7ECC00 - -; this will just count from 0 to 4 to determine which slot we're using -; we're expecting 5 items max per room, and order is irrelevant -; we just need to keep track of where they go -DynamicDropGFXIndex = $7E1E70 !DynamicDropGFXSlotCount_UW = (FreeUWGraphics_end-FreeUWGraphics)>>1 !DynamicDropGFXSlotCount_OW = (FreeOWGraphics_end-FreeOWGraphics)>>1 -; this will keep track of the above for each item -SprItemGFX = $7E0780 - -; this is the item requested and a flag (we anticipate no more than 3 requests to be active, but built to support 8) -DynamicDropRequest = $7E1E71 ; bitfield indicating which request slot to process -DynamicDropQueue = $7E1E72 ; 0x08 bytes, occupies 1 byte for each slot in the request queue (loot id at first, but stores GFX index) - ; Come in with ; A = item receipt ID ; X = sprite slot -RequestSlottedTile: +RequestStandingItemVRAMSlot: PHX : PHY - PHA - LDA.b #$01 : STA.w !SPRITE_REDRAW, X + LDA.b #$01 : STA.w SprRedrawFlag, X JSL Sprite_IsOnscreen : BCC ++ ; skip sending the request if busy with other things - LDA.b $11 : CMP.b #$21 : BCS ++ ; skip if OW is loading Map16 GFX ; TODO: Figure out how to allow submodule 22, check DMA status instead - LDA.b $5D : CMP.b #$14 : BEQ ++ ; skip if we're mid-mirror - LDA.b $1B : BEQ + ; OW current doesn't occupy any slots that medallion gfx do + LDA.b GameSubMode : CMP.b #$21 : BCS ++ ; skip if OW is loading Map16 GFX ; TODO: Figure out how to allow submodule 22, check DMA status instead + LDA.b LinkState : CMP.b #$14 : BEQ ++ ; skip if we're mid-mirror + LDA.b IndoorsFlag : BEQ + ; OW current doesn't occupy any slots that medallion gfx do CMP.b #$08 : BCC + : CMP.b #$0A+1 : BCS + ; skip if we're mid-medallion ++ PLA : JMP .return + - LDA.w $0E20, X : CMP.b #$C0 : BNE + ; if catfish + LDA.w SpriteTypeTable, X : CMP.b #$C0 : BNE + ; if catfish TYX + CMP.b #$52 : BNE + ; if zora TYX + - LDA.b 1,S : JSL.l GetSpritePalette : STA.w $0F50, X ; setup the palette + LDA.b 1,S : PHX : JSL GetSpritePalette : PLX : STA.w SpriteOAMProp, X ; setup the palette PLA ; gfx that are already present, use that instead of a new slot CMP.b #$34 : BCC + : CMP.b #$36+1 : BCS + ; if rupees, use animated rupee OAM slot - LDA.b $1B : BEQ ++ + LDA.b IndoorsFlag : BEQ ++ LDA.b #!DynamicDropGFXSlotCount_UW BRA +++ ++ LDA.b #!DynamicDropGFXSlotCount_OW +++ INC : STA.w SprItemGFX,X JMP .success + CMP.b #$A0 : BCC + : CMP.b #$AF+1 : BCS + ; if key, use key OAM slot - LDY.b $5D : CPY.b #$19 : BCC ++ : CPY.b #$1A+1 : BCS ++ ; if getting tablet item, don't use key slot + LDY.b LinkState : CPY.b #$19 : BCC ++ : CPY.b #$1A+1 : BCS ++ ; if getting tablet item, don't use key slot BRA + ++ - LDA.b $1B : BEQ ++ + LDA.b IndoorsFlag : BEQ ++ LDA.b #!DynamicDropGFXSlotCount_UW BRA +++ ++ LDA.b #!DynamicDropGFXSlotCount_OW - +++ INC : INC : STA.w SprItemGFX,X + +++ INC #2 : STA.w SprItemGFX,X JMP .success - + CMP.b #$B5 : BNE + ; if good bee, use bee OAM slot - LDA.b $1B : BEQ ++ + + CMP.b #$D6 : BNE + ; if good bee, use bee OAM slot + LDA.b IndoorsFlag : BEQ ++ LDA.b #!DynamicDropGFXSlotCount_UW BRA +++ ++ LDA.b #!DynamicDropGFXSlotCount_OW - +++ INC : INC : INC : STA.w SprItemGFX,X + +++ INC #3 : STA.w SprItemGFX,X JMP .success - + CMP.b #$B2 : BNE + ; if fairy, use fairy OAM slot - LDA.b $1B : BEQ ++ - LDA.b #!DynamicDropGFXSlotCount_UW - BRA +++ - ++ LDA.b #!DynamicDropGFXSlotCount_OW - +++ INC : INC : STA.w SprItemGFX,X - JMP .success - + CMP.b #$B1 : BNE + ; if apple, use apple OAM slot - LDA.b $1B : BEQ ++ - LDA.b #!DynamicDropGFXSlotCount_UW - BRA +++ - ++ LDA.b #!DynamicDropGFXSlotCount_OW - +++ INC : INC : INC : STA.w SprItemGFX,X - JMP .success - + CMP.b #$6A : BNE + ; if triforce, use cutscene OAM slot - PHA - LDA.b $1B : BEQ ++ + + CMP.b #$D2 : BNE + ; if fairy, use fairy OAM slot + LDA.b IndoorsFlag : BEQ ++ LDA.b #!DynamicDropGFXSlotCount_UW BRA +++ ++ LDA.b #!DynamicDropGFXSlotCount_OW +++ INC : STA.w SprItemGFX,X - JMP .initRequest ; don't jump to end, we need the TF GFX to draw at $E7 + JMP .success + + CMP.b #$D1 : BNE + ; if apple, use apple OAM slot + LDA.b IndoorsFlag : BEQ ++ + LDA.b #!DynamicDropGFXSlotCount_UW + BRA +++ + ++ LDA.b #!DynamicDropGFXSlotCount_OW + +++ INC #2 : STA.w SprItemGFX,X + JMP .success + PHA LDA.w DynamicDropGFXIndex INC PHX - LDX.b $1B : BEQ + + LDX.b IndoorsFlag : BEQ + CMP.b #!DynamicDropGFXSlotCount_UW : BCC .setIndex BRA ++ + CMP.b #!DynamicDropGFXSlotCount_OW : BCC .setIndex @@ -107,11 +84,11 @@ RequestSlottedTile: PHX ; loop thru other sprites, check if any use the same gfx slot LDY.b #$0F - - TYA : CMP 1,S : BEQ + ; don't check self - LDA.w $0DD0,Y : BEQ + - LDA.w !SPRITE_REDRAW, Y : BNE + + - TYA : CMP.b 1,S : BEQ + ; don't check self + LDA.w SpriteAITable,Y : BEQ + + LDA.w SprRedrawFlag, Y : BNE + LDA.w SprItemGFX,Y : CMP.w DynamicDropGFXIndex : BNE + - LDA.w $0E20,Y ; don't need E5 enemy big key drop and E9 powder item + LDA.w SpriteTypeTable,Y ; don't need E5 enemy big key drop and E9 powder item CMP.b #$EB : BEQ ++ ; heart piece CMP.b #$E4 : BEQ ++ ; enemy drop CMP.b #$3B : BEQ ++ ; bonk item @@ -119,8 +96,8 @@ RequestSlottedTile: BRA + ++ ; slot already in use, use overflow slot - LDA.b #$02 : STA.w !SPRITE_REDRAW, X - LDA.b $1B : BEQ ++ + LDA.b #$02 : STA.w SprRedrawFlag, X + LDA.b IndoorsFlag : BEQ ++ LDA.b #!DynamicDropGFXSlotCount_UW BRA +++ ++ LDA.b #!DynamicDropGFXSlotCount_OW @@ -129,110 +106,34 @@ RequestSlottedTile: + DEY : BPL - PLX - .initRequest - PHX - LDY.b #$00 - LDA.w DynamicDropRequest - - LSR : INY : BCS - - CPY.b #$08 : BCC + - ; all request slots occupied, exit without drawing - PLX : PLA - LDY.b #$FE ; indicate failure - BRA .return - + TYX - LDA.b #$00 : SEC - - ROL : DEX : BNE - - DEY ; y = slot index, a = new request bit flag - ORA.w DynamicDropRequest - STA.w DynamicDropRequest - PLX + .initRequest PLA - STA.w DynamicDropQueue,Y - - ; decompress graphics - PHX : PHY - - REP #$20 - LDA.w #DynamicDropGFX-$7E9000 - TYX : BEQ + - - CLC : ADC.w #$0080 : DEX : BNE - - + STA.l !TILE_UPLOAD_OFFSET_OVERRIDE - SEP #$20 - - LDA.w DynamicDropQueue,Y - JSL.l GetSpriteID - JSL.l GetAnimatedSpriteTile_variable + PHX ;: PHY + ; unsure about substitution rules here, because they aren't skipped properly for MW yet + JSL AttemptItemSubstitution + JSL ResolveLootIDLong + JSL ResolveBeeTrapLong + REP #$30 + ASL : TAX + LDA.l StandingItemGraphicsOffsets,X : LDX.w ItemStackPtr : STA.l ItemGFXStack,X + LDA.w DynamicDropGFXIndex : AND.w #$000F : ASL : TAX + LDA.b IndoorsFlag : AND.w #$00FF : BEQ + + LDA.l FreeUWGraphics,X : BRA ++ + + LDA.l FreeOWGraphics,X + ++ LDX.w ItemStackPtr : STA.l ItemTargetStack,X + TXA : INC #2 : STA.w ItemStackPtr SEP #$30 - PLY : PLX - LDA.w DynamicDropQueue,Y : PHA ; we want A to return the loot id - LDA.w SprItemGFX,X : STA.w DynamicDropQueue,Y - PLA + PLX .success - STZ.w !SPRITE_REDRAW, X + STZ.w SprRedrawFlag, X .return PLY : PLX RTL ;=================================================================================================== -TransferPotGFX: - SEP #$10 - REP #$20 - LDA.w DynamicDropRequest : AND.w #$00FF - BEQ .no - - .next - LDY.b #$00 - - INY : LSR : BCC - - - PHY - LDA.w #$0000 - - ROL : DEY : BNE - - PLY - DEY ; y = slot index, a = request bit flag - - EOR.w DynamicDropRequest : STA.w DynamicDropRequest - - LDA.w DynamicDropQueue,Y - ASL - TAX - LDA.b $1B : AND.w #$00FF : BEQ + - LDA.l FreeUWGraphics,X - BRA ++ - + LDA.l FreeOWGraphics,X - ++ STA.w $2116 - - ; calculate bottom row now - CLC : ADC.w #$0200>>1 : PHA - - LDX.b #$7E : STX.w $4314 - LDA.w #DynamicDropGFX - CPY.b #$00 : BEQ + - - CLC : ADC.w #$0080 : DEY : BNE - - + STA.w $4302 - - LDX.b #$80 : STX.w $2115 - LDA.w #$1801 : STA.w $4300 - - LDA.w #$0040 : STA.w $4305 - LDY.b #$01 - - STY.w $420B - STA.w $4305 - - PLA - STA.w $2116 - STY.w $420B - - LDA.w DynamicDropRequest : AND.w #$00FF - BNE .next - -.no - RTL - - FreeUWGraphics: dw $8800>>1 dw $8840>>1 @@ -244,7 +145,6 @@ FreeUWGraphics: ; add new slots above this line .end dw $0000 ; overflow slot, intentionally blank - dw $9CE0>>1 ; Triforce ; above this line, add slots that we want to draw to specific slots FreeOWGraphics: @@ -257,7 +157,6 @@ FreeOWGraphics: ; add new slots above this line .end dw $0000 ; overflow slot, intentionally blank - dw $9CE0>>1 ; Triforce ; above this line, add slots that we want to draw to specific slots ;=================================================================================================== @@ -265,94 +164,103 @@ FreeOWGraphics: ; A = item receipt ID ; X = sprite slot ; Returns with Carry flag set if gfx drawing was skipped -DrawSlottedTile: +DrawPotItem: PHA ; TODO: allow drawing if gfx are not using a VRAM slot that changes during medallion LDA.b $5D : CMP.b #$08 : BCC + : CMP.b #$0A+1 : BCS + ; skip if we're mid-medallion PLA : SEC : RTL + PLA - STA.b $07 ; store loot ID temporarily, will get overwritten in Sprite_DrawMultiple_quantity_preset call - JSL.l IsNarrowSprite : BCS .narrow + + PHX + JSL AttemptItemSubstitution + JSL ResolveLootIDLong + TAX + LDA.l BeeTrapDisguise : BEQ + + TAX + + STA.b Scrap07 ; store loot ID temporarily, will get overwritten in Sprite_DrawMultiple_quantity_preset call + LDA.l SpriteProperties_standing_width,X : BEQ .narrow - ; TODO: Instead of loading the whole fixed 16 bytes from DynamicOAMTile**_** into !SPRITE_DYNAMIC_OAM + ; TODO: Instead of loading the whole fixed 16 bytes from DynamicOAMTile**_** into SpriteDynamicOAM ; Do something more like how DrawDynamicTile does it ; Then we won't need all the separate DynamicOAMTile**_** tables .full - LDA.b #$01 : STA $06 - LDA #$0C : JSL.l OAM_AllocateFromRegionC - LDA #$02 : PHA + PLX + LDA.b #$01 : STA.b Scrap06 + LDA.b #$0C : JSL OAM_AllocateFromRegionC + LDA.b #$02 : PHA REP #$20 - LDA.b $1B : AND.w #$00FF : BEQ + + LDA.b IndoorsFlag : AND.w #$00FF : BEQ + LDA.w #DynamicOAMTileUW_full BRA .transfer + LDA.w #DynamicOAMTileOW_full BRA .transfer .narrow - LDA.b #$02 : STA $06 - LDA #$10 : JSL.l OAM_AllocateFromRegionC - LDA #$03 : PHA + PLX + LDA.b #$02 : STA.b Scrap06 + LDA.b #$10 : JSL OAM_AllocateFromRegionC + LDA.b #$03 : PHA REP #$20 - LDA.b $1B : AND.w #$00FF : BEQ + + LDA.b IndoorsFlag : AND.w #$00FF : BEQ + LDA.w #DynamicOAMTileUW_thin BRA .transfer + LDA.w #DynamicOAMTileOW_thin .transfer - STA.b $08 + STA.b Scrap08 LDA.w SprItemGFX,X AND.w #$00FF ASL : ASL : ASL : ASL - ADC.b $08 - STA.b $08 - PHK : PLY : STY.b $0A - LDY #$7E : PHB : PHY : PLB + ADC.b Scrap08 + STA.b Scrap08 + PHK : PLY : STY.b Scrap0A + LDY.b #$7E : PHB : PHY : PLB ; transfer fixed table data into WRAM LDY.b #$0E - - LDA.b [$08],Y : STA.w !SPRITE_DYNAMIC_OAM,Y + - LDA.b [$08],Y : STA.w SpriteDynamicOAM,Y DEY : DEY : BPL - LDA.w SprItemFlags, X : AND.w #$00FF : BNE .draw - LDA.b $06 : LSR : BCC + + LDA.b Scrap06 : LSR : BCC + ; full LDA.w #$0000 - STA.w !SPRITE_DYNAMIC_OAM : STA.w !SPRITE_DYNAMIC_OAM+2 + STA.w SpriteDynamicOAM : STA.w SpriteDynamicOAM+2 BRA .draw + ; narrow - LDA.w $0E20, X : AND.w #$00FF : CMP.w #$003B : BEQ .draw ; bonk item - LDA.b $A0 : CMP.w #$0120 : BNE + - LDA.b $1B : BNE .draw ; good bee statue + LDA.w SpriteTypeTable, X : AND.w #$00FF : CMP.w #$003B : BEQ .draw ; bonk item + LDA.b RoomIndex : CMP.w #$0120 : BNE + + LDA.b IndoorsFlag : BNE .draw ; good bee statue + ; TODO: Figure out how to target bottle vendor fish item better than this - LDA.b $8A : AND.w #$00FF : CMP.w #$0018 : BNE + - LDA.b $1B : BEQ .draw ; bottle vendor key + LDA.b OverworldIndex : AND.w #$00FF : CMP.w #$0018 : BNE + + LDA.b IndoorsFlag : BEQ .draw ; bottle vendor key + LDA.w #$0004 - STA.w !SPRITE_DYNAMIC_OAM : STA.w !SPRITE_DYNAMIC_OAM+8 + STA.w SpriteDynamicOAM : STA.w SpriteDynamicOAM+8 .draw ; special handling - LDY.b $07 : CPY.b #$B2 : BNE + ; fairy - LDA.b $1A : AND.w #$0020 : BEQ ++ ; alternate every 32 frames - LDA.w !SPRITE_DYNAMIC_OAM+4 : CLC : ADC.w #$02 ; use other fairy GFX - STA.w !SPRITE_DYNAMIC_OAM+4 - ++ LDA.b $1A : SEC : SBC.w #$10 : AND.w #$0020 : BEQ + ; alternate every 32 frames - LDA.w !SPRITE_DYNAMIC_OAM+2 : SEC : SBC.w #$02 ; move fairy up 2 pixels - STA.w !SPRITE_DYNAMIC_OAM+2 + LDY.b Scrap07 : CPY.b #$B2 : BNE + ; fairy + LDA.b FrameCounter : AND.w #$0020 : BEQ ++ ; alternate every 32 frames + LDA.w SpriteDynamicOAM+4 : CLC : ADC.w #$02 ; use other fairy GFX + STA.w SpriteDynamicOAM+4 + ++ LDA.b FrameCounter : SEC : SBC.w #$10 : AND.w #$0020 : BEQ + ; alternate every 32 frames + LDA.w SpriteDynamicOAM+2 : SEC : SBC.w #$02 ; move fairy up 2 pixels + STA.w SpriteDynamicOAM+2 + CPY.b #$B5 : BNE + ; good bee - LDA.b $1A : AND.w #$0020 : BEQ ++ ; alternate every 32 frames - LDA.w !SPRITE_DYNAMIC_OAM+12 : SEC : SBC.w #$10 ; use other fairy GFX - STA.w !SPRITE_DYNAMIC_OAM+12 - ++ LDA.b $1A : SEC : SBC.w #$10 : AND.w #$0020 : BEQ + ; alternate every 32 frames - LDA.w !SPRITE_DYNAMIC_OAM+10 : SEC : SBC.w #$02 ; move fairy up 2 pixels - STA.w !SPRITE_DYNAMIC_OAM+10 + LDA.b FrameCounter : AND.w #$0020 : BEQ ++ ; alternate every 32 frames + LDA.w SpriteDynamicOAM+12 : SEC : SBC.w #$10 ; use other fairy GFX + STA.w SpriteDynamicOAM+12 + ++ LDA.b FrameCounter : SEC : SBC.w #$10 : AND.w #$0020 : BEQ + ; alternate every 32 frames + LDA.w SpriteDynamicOAM+10 : SEC : SBC.w #$02 ; move fairy up 2 pixels + STA.w SpriteDynamicOAM+10 + - LDA.w #!SPRITE_DYNAMIC_OAM : STA.b $08 + LDA.w #SpriteDynamicOAM : STA.b Scrap08 SEP #$20 - STZ.b $07 - LDA.b #$00 : STA.l !SKIP_EOR + STZ.b Scrap07 + LDA.b #$00 : STA.l SpriteSkipEOR JSL Sprite_DrawMultiple_quantity_preset PLB @@ -422,9 +330,6 @@ DynamicOAMTileUW_full: dw -4, -1 : db $A0, $00, $20, $02 ; overflow slot dd 0, 0 - dw -4, -1 : db $E7, $00, $20, $02 ; triforce - dd 0, 0 - ; above this line, add slots that we want to draw to specific slots dw -4, -1 : db $EA, $00, $20, $02 ; fairy @@ -492,9 +397,6 @@ DynamicOAMTileOW_full: dw 0, 0 : db $A0, $00, $20, $02 ; overflow slot dd 0, 0 - dw 0, 0 : db $E7, $00, $20, $02 ; triforce - dd 0, 0 - ; above this line, add slots that we want to draw to specific slots dw 0, 0 : db $EA, $00, $20, $02 ; fairy @@ -504,7 +406,7 @@ DynamicOAMTileOW_full: dd 0, 0 ConditionalPushBlockTransfer: - LDA.b $1B : BNE + + LDA.b IndoorsFlag : BNE + LDA.b #$0F ; don't transfer push block when on the OW BRA .return-3 + @@ -514,7 +416,7 @@ RTL pushpc ; fix Arghuss/Zora splash graphics -org $068595 +org $868595 db $E7, $E7, $E7, $E7, $E7, $C0, $C0 pullpc diff --git a/keydrop/standing_items.asm b/keydrop/standing_items.asm index f32f9b9..857173d 100644 --- a/keydrop/standing_items.asm +++ b/keydrop/standing_items.asm @@ -22,6 +22,9 @@ org $86F976 org $86E3C4 JSL RevealSpriteDrop2 : NOP +org $86F933 + JSL PikitOverride + org $86926e ; <- 3126e - sprite_prep.asm : 2664 (LDA $0B9B : STA $0CBA, X) JSL SpriteKeyPrep : NOP #2 @@ -40,13 +43,11 @@ org $86d180 org $86d18d ; <- 3518D - sprite_absorbable.asm : 274 (LDA $7EF36F : INC A : STA $7EF36F) JSL KeyGet -org $86f9f3 ; bank06.asm : 6732 (JSL Sprite_LoadProperties) +org $86f9f3 ; bank06.asm : 6732 (JSL SpritePrep_LoadProperties) JSL LoadProperties_PreserveCertainProps -org $808BAA ; NMI hook - JSL TransferPotGFX - org $86828A +Sprite_SpawnSecret_SpriteSpawnDynamically: JSL CheckSprite_Spawn org $87B169 @@ -73,67 +74,29 @@ org $8681F4 Sprite_SpawnSecret_pool_ID: org $868283 Sprite_SpawnSecret_NotRandomBush: -org $86828A -Sprite_SpawnSecret_SpriteSpawnDynamically: org $8682A5 Sprite_SpawnSecret_SetCoords: org $86d23a Sprite_DrawAbsorbable: -org $9eff81 -Sprite_DrawRippleIfInWater: -org $8db818 -Sprite_LoadProperties: org $86D038 KeyRoomFlagMasks: org $80FDEE InitializeMirrorHDMA: -org $80E3C4 -LoadCommonSprites_long: -; defines -; Ram usage -SpawnedItemID = $7E0720 ; 0x02 -SpawnedItemIndex = $7E0722 ; 0x02 -SpawnedItemIsMultiWorld = $7E0724 ; 0x02 -SpawnedItemFlag = $7E0726 ; 0x02 - one for pot, 2 for sprite drop -; (flag used as a bitmask in conjunction with StandingItemCounterMask) -SpawnedItemMWPlayer = $7E0728 ; 0x02 -; clear all of them in a loop during room load -SprDropsItem = $7E0730 ; 0x16 -SprItemReceipt = $7E0740 ; 0x16 -SprItemIndex = $7E0750 -SprItemMWPlayer = $7E0760 ; 0x16 -SprItemFlags = $7E0770 ; 0x16 (used for both pots and drops) (combine with SprDropsItem?) +org $89D62E +UWSpritesPointers: ; 0x250 bytes for 0x128 rooms' 16-bit pointers -; todo: move sprites -;org $09D62E -;UWSpritesPointers ; 0x250 bytes for 0x128 rooms' 16-bit pointers - -;org $09D87E -;UWPotsPointers ; 0x250 bytes for 0x128 rooms' 16-bit pointers - -;org $09DACE -;UWPotsData ; variable number of bytes (max 0x11D1) for all pots data - -;org $A88000 -;UWSpritesData ; variable number of bytes (max 0x2800) for all sprites and sprite drop data -; First $2800 bytes of this bank (28) is reserved for the sprite tables - -;org $09C297 -;LDA.w UWSpritesPointers,Y -;org $01E6BF ; not sure this code is reachable anymore -;LDA.l UWPotsPointers,X -;STA.b $00 -;LDA.w #UWPotsPointers>>16 - -; $2800 bytes reserved for sprites - -; temporary pot table until sprites get moved: -org $A88000 +org $89D87E UWPotsPointers: ; 0x250 bytes for 0x128 rooms' 16-bit pointers -org $A88250 -UWPotsData: +org $89DACE +UWPotsData: ; variable number of bytes (max 0x11D1) for all pots data + +org $A88000 +UWSpritesData: ; variable number of bytes (max 0x2800) for all sprites and sprite drop data +; First $2800 bytes of this bank (28) is reserved for the sprite tables + +; $2800 bytes reserved for sprites org $A8A800 ;tables: @@ -161,17 +124,67 @@ PotCollectionRateTable: ; Reserved $250 296 * 2 org $A8ACB0 +UWEnemyItemFlags: +; Reserved $250 296 * 2 + +org $A8AF00 +UWSpecialFlagIndex: +; Reserved $128 (296) +; Initial table indexed by room id +; Special values: $FF indicates the room can use the UWEnemyItemFlags table +; Any other value tell you where to start in the special table +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF + +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF + +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF + +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF + +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF +db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF + + +org $A8B028 +UWSpecialFlag: +; reserved exactly $100 or 256 bytes for now estimated usage is at 159 bytes right now +; Simple mask table, 3 bytes per entry: 1st byte what dungeon it applies, if $FF, then the list is done +; Lists that has even numbers of entries will end with $FF $FF to keep everything 2 byte aligned +; (if not matched, assume mask of value 0) +; 2nd and 3rd bytes are the mask + +; For indicator idea: +; EOR between a mask and the equivalent SRAM should result in zero if all items are obtained + +; For whether to spawn: +; $FF indicates a spawn without further checking, otherwise need to check the mask in the simple table +; this should be checked in addition to SRAM + +org $A8B128 RevealPotItem: - STA.b $04 ; save tilemap coordinates + STA.b Scrap04 ; save tilemap coordinates STZ.w SpawnedItemFlag STZ.w SpawnedItemMWPlayer LDA.w $0B9C : AND.w #$FF00 : STA.w $0B9C - LDA.b $A0 : ASL : TAX + LDA.b RoomIndex : ASL : TAX - LDA.l UWPotsPointers,X : STA.b $00 ; we may move this - LDA.w #UWPotsPointers>>16 : STA.b $02 + LDA.l UWPotsPointers,X : STA.b Scrap00 ; we may move this + LDA.w #UWPotsPointers>>16 : STA.b Scrap02 LDY.w #$FFFD : LDX.w #$FFFF @@ -183,40 +196,41 @@ RevealPotItem: INX - STA.w $08 ; remember the exact value + STA.w Scrap08 ; remember the exact value AND.w #$3FFF - CMP.b $04 : BNE .next_pot ; not the correct value + CMP.b Scrap04 : BNE .next_pot ; not the correct value STZ.w SpawnedItemIsMultiWorld - BIT.b $08 + BIT.b Scrap08 BVS LoadMultiWorldPotItem BMI LoadMajorPotItem .normal_secret - STA $08 + STA.b Scrap08 PHX : PHY ; set bit and count if first time lifting this pot - TXA : ASL : TAX : LDA.l BitFieldMasks, X : STA $0A - LDA.b $A0 : ASL : TAX + TXA : ASL : TAX : LDA.l BitFieldMasks, X : STA.b Scrap0A + LDA.b RoomIndex : ASL : TAX JSR ShouldCountNormalPot : BCC .obtained - LDA.l RoomPotData, X : BIT $0A : BNE .obtained - ORA $0A : STA RoomPotData, X + LDA.l RoomPotData, X : BIT.b Scrap0A : BNE .obtained + ORA.b Scrap0A : STA.l RoomPotData, X ; increment dungeon counts - SEP #$30 - LDA $040C : CMP #$FF : BEQ + - BNE ++ - INC #2 ; treat sewers as HC - ++ LSR : TAX : LDA DungeonLocationsChecked, X : INC : STA DungeonLocationsChecked, X + SEP #$10 + LDX.w DungeonID : CPX.b #$FF : BEQ + + CPX.b #$00 : BNE ++ + INX #2 ; treat sewers as HC + ++ LDA.l DungeonLocationsChecked, X : INC : STA.l DungeonLocationsChecked, X ; Could increment GT Tower Pre Big Key but we aren't showing that stat right now - + REP #$30 - LDA TotalItemCounter : INC : STA TotalItemCounter ; Increment Item Total + + REP #$10 + LDA.l TotalItemCounter : INC : STA.l TotalItemCounter ; Increment Item Total + INC.w UpdateHUDFlag .obtained PLY : PLX PLA ; remove the JSL return lower 16 bits - LDA $08 - PEA.w $01E6E2-1 ; change return address to go back to the vanilla routine + LDA.b Scrap08 + PEA.w RevealPotItem_found_match-1 ; return to vanilla routine .exit RTL @@ -260,34 +274,34 @@ SaveMajorItemDrop: LDA.w #$0018 : BRA .substitute + CPY.w #$0031 : BNE + ; 10 pack bombs LDA.w #$0019 : BRA .substitute - + CPY.w #$00B1 : BNE + ; Apples + + CPY.w #$00D1 : BNE + ; Apples LDA.w #$001A : BRA .substitute - + CPY.w #$00B0 : BNE + ; Bee Trap + + CPY.w #$00D0 : BNE + ; Bee Trap LDA.w #$001B : BRA .substitute - + CPY.w #$00B5 : BNE + ; Good Bee + + CPY.w #$00D6 : BNE + ; Good Bee LDA.w #$001C : BRA .substitute - + STA $0B9C ; indicates we should use the key routines or a substitute + + STA.w $0B9C ; indicates we should use the key routines or a substitute RTL .substitute PHA - TXA : ASL : STA.b $00 - LDA.w #$001F : SBC $00 - TAX : LDA.l BitFieldMasks, X : STA $00 - LDA.b $A0 : ASL : TAX + TXA : ASL : STA.b Scrap00 + LDA.w #$001F : SBC.b Scrap00 + TAX : LDA.l BitFieldMasks, X : STA.b Scrap00 + LDA.b RoomIndex : ASL : TAX LDA.l $7EF580, X - AND.b $00 + AND.b Scrap00 BNE .exit - LDA.l $7EF580, X : ORA $00 : STA.l $7EF580, X - PLA : STA $0B9C + LDA.l $7EF580, X : ORA.b Scrap00 : STA.l $7EF580, X + PLA : STA.w $0B9C RTL .exit PLA : STZ.w $0B9C RTL ShouldCountNormalPot: - INY : INY : LDA [$00], Y : AND #$00FF : CMP #$0080 : BCS .clear + INY : INY : LDA.b [$00], Y : AND.w #$00FF : CMP.w #$0080 : BCS .clear LDA.l PotCountMode : BEQ .clear - LDA.l PotCollectionRateTable, X : BIT $0A : BEQ .clear ; don't count if clear + LDA.l PotCollectionRateTable, X : BIT.b Scrap0A : BEQ .clear ; don't count if clear .set SEC RTS @@ -297,222 +311,399 @@ RTS IncrementCountsForSubstitute: PHX : REP #$30 - LDA.w SpawnedItemIndex : ASL : TAX : LDA.l BitFieldMasks, X : STA $0A - LDA.b $A0 : ASL : TAX - LDA.l RoomPotData, X : BIT $0A : BNE .obtained - ORA $0A : STA RoomPotData, X - SEP #$30 - LDA $040C : CMP #$FF : BEQ + - BNE ++ - INC #2 ; treat sewers as HC - ++ LSR : TAX : LDA DungeonLocationsChecked, X : INC : STA DungeonLocationsChecked, X + LDA.w SpawnedItemIndex : ASL : TAX : LDA.l BitFieldMasks, X : STA.b Scrap0A + LDA.b RoomIndex : ASL : TAX + LDA.l RoomPotData, X : BIT.b Scrap0A : BNE .obtained + ORA.b Scrap0A : STA.l RoomPotData, X + SEP #$10 + LDX.w DungeonID : CPX.b #$FF : BEQ + + CPX.b #$00 : BNE ++ + INX #2 ; treat sewers as HC + ++ LDA.l DungeonLocationsChecked, X : INC : STA.l DungeonLocationsChecked, X ; Could increment GT Tower Pre Big Key but we aren't showing that stat right now - + REP #$30 - LDA TotalItemCounter : INC : STA TotalItemCounter ; Increment Item Total + + + LDA.l TotalItemCounter : INC : STA.l TotalItemCounter ; Increment Item Total + INC.w UpdateHUDFlag .obtained SEP #$30 : PLX RTS ClearSpriteData: - STZ.b $02 : STZ.b $03 ; what we overrode + STZ.b Scrap03 ; what we overrode # we no longer need STZ $02 see underworld_sprite_hooks .shared: + PHX - LDA #$00 : LDX #$00 + LDA.b #$00 : LDX.b #$00 .loop - STA SprDropsItem, X : STA SprItemReceipt, X : STA SprItemIndex, X - STA SprItemMWPlayer, X : STA SprItemFlags, X - INX : CPX #$10 : BCC .loop + STA.w SprDropsItem, X : STA.w SprItemReceipt, X : STA.w SprItemIndex, X + STA.w SprItemMWPlayer, X : STA.w SprItemFlags, X + INX : CPX.b #$10 : BCC .loop + JSR SetupEnemyDropIndicator PLX RTL ClearSpriteData2: - LDA.b #$82 : STA.b $99 + LDA.b #$82 : STA.b CGWSELQ JMP ClearSpriteData_shared + +; this routine determines whether enemies still have drops or not +; and sets EnemyDropIndicator appropriately +; uses X register, assumes flags are (MX) but (mX) is fine +SetupEnemyDropIndicator: + REP #$20 + LDA.w #!BlankTile : STA.w EnemyDropIndicator + LDX.b IndoorsFlag : BEQ .done + ; do we have a flag for enemy drops on? could check it here + LDA.w DungeonID : AND.w #$00FF : CMP.w #$00FF : BEQ .skipCompassChecks + ; compass checks + ; does compass for dungeon exist? + LSR : TAX : LDA.l ExistsTransfer, X : TAX : LDA.l CompassExists, X : BEQ .skipCompassChecks + ; do we have the compass + ; todo: sewers? + LDA.l CompassField : LDX.w DungeonID : AND.l DungeonMask, X : BEQ .done + +.skipCompassChecks + ; either we're in a cave ($040C: $FF), compass doesn't exist, or we have the compass + ; check if there are enemy drops + LDA.b Scrap02 : PHA : REP #$10 ; store 02/03 for later + LDX.b RoomIndex : LDA.l UWSpecialFlagIndex, X : AND.w #$00FF ; determine if special case or not + CMP.w #$00FF : BEQ .loadNormalFlags + JSR FetchBitmaskForSpecialCase + PHA : LDA.b RoomIndex : ASL : TAX : PLA + BRA .testAgainstMask + +.loadNormalFlags + TXA : ASL : TAX : LDA.l UWEnemyItemFlags, X + +.testAgainstMask + STA.b Scrap02 : LDA.l SpriteDropData, X : AND.b Scrap02 : EOR.b Scrap02 + BEQ .cleanup + LDA.w #!BlueSquare : STA.w EnemyDropIndicator + +.cleanup + SEP #$10 : PLA : STA.b Scrap02 + +.done +SEP #$20 +RTS + + ; Runs during sprite load of the room LoadSpriteData: INY : INY - LDA.b ($00), Y - CMP #$F3 : BCC .normal + LDA.b [$00], Y + CMP.b #$F3 : BCC .normal PHA - DEC.b $02 ; standing items shouldn't consume a sprite slot - LDX.b $02 - CMP #$F9 : BNE .not_multiworld - DEY : LDA.b ($00), Y : STA.l SprItemMWPlayer, X - LDA.b #$02 : STA.l SprDropsItem, X : BRA .common + DEC.b Scrap03 ; standing items shouldn't consume a sprite slot + LDX.b Scrap03 ; these were changed to $03, for moved sprites + CMP.b #$F9 : BNE .not_multiworld + DEY : LDA.b [$00], Y : STA.w SprItemMWPlayer, X + LDA.b #$02 : STA.w SprDropsItem, X : BRA .common .not_multiworld - LDA.b #$00 : STA.l SprItemMWPlayer, X - LDA.b #$01 : STA.l SprDropsItem, X + LDA.b #$00 : STA.w SprItemMWPlayer, X + LDA.b #$01 : STA.w SprDropsItem, X DEY .common - DEY : LDA.b ($00), Y : STA.l SprItemReceipt, X + DEY : LDA.b [$00], Y : STA.w SprItemReceipt, X + STA.b Scrap0E + LDA.w SprItemMWPlayer, X : BNE + ; skip if multiworld + PHX + LDX.b #$00 ; see if the item should be replaced by an absorbable + - CPX.b #$1A : BCS .done + LDA.l MinorForcedDrops, X + CMP.b Scrap0E : BEQ ++ + INX #2 : BRA - + ++ PLX : LDA.w SprItemFlags, X : ORA.b #$80 : STA.w SprItemFlags, X : PHX + .done PLX + + INY : INY PLA PLA : PLA ; remove the JSL return lower 16 bits - PEA.w $09C344-1 ; change return address to exit from Underworld_LoadSingleSprite + PEA.w $89C344-1 ; change return address to exit from Underworld_LoadSingleSprite RTL .normal RTL ; Run when a sprite dies ... Sets Flag to #$02 and Index to sprite slot for RevealSpriteDrop: - LDA.l SprDropsItem, X : BEQ .normal - LDA #$02 : STA.l SpawnedItemFlag + LDA.w SprDropsItem, X : BNE CheckIfDropValid + JMP DoNormalDrop + +CheckIfDropValid: + LDA.w SprItemFlags, X : BIT.b #$80 : BNE .do_the_drop ; it's a minor item + JSR CheckIfDropsInThisLocation : BCC DoNormalDrop + .do_the_drop + ;This section sets up the drop + LDA.b #$02 : STA.w SpawnedItemFlag STX.w SpawnedItemIndex - LDA.l SprItemReceipt, X : STA SpawnedItemID - LDA.l SprItemMWPlayer, X : STA SpawnedItemMWPlayer + LDA.w SprItemReceipt, X : STA.w SpawnedItemID + LDA.w SprItemMWPlayer, X : STA.w SpawnedItemMWPlayer LDY.b #$01 ; trigger the small key routines - LDA SpawnedItemID : CMP #$32 : BNE + + LDA.w SpawnedItemID : STA.b Scrap00 : CMP.b #$32 : BNE + LDA.l StandingItemsOn : BNE + INY ; big key routine - + RTL ; unstun if stunned - .normal - LDY.w $0CBA, X : BEQ .no_forced_drop + + + PHX + LDA.w SpawnedItemMWPlayer : BNE .done ; abort check for absorbables it belong to someone else + LDX.b #$00 ; see if the item should be replaced by an absorbable + - CPX.b #$1A : BCS .done + LDA.l MinorForcedDrops, X + CMP.b Scrap00 : BNE + + INX : LDA.l MinorForcedDrops, X : STA.b Scrap00 + PLX : PLA : PLA : PEA.w PrepareEnemyDrop-1 ; change call stack for PrepareEnemyDrop + JSR IncrementCountForMinor + LDA.b Scrap00 : RTL + + INX #2 : BRA - + .done PLX + RTL ; unstun if stunned + +DoNormalDrop: + SEP #$30 + LDY.w SpriteForceDrop, X : BEQ .no_forced_drop RTL .no_forced_drop PLA : PLA ; remove the JSL return lower 16 bits - PEA.w $06F996-1 ; change return address to .no_forced_drop of (Sprite_DoTheDeath) + PEA.w $86F996-1 ; change return address to .no_forced_drop of (Sprite_DoTheDeath) RTL RevealSpriteDrop2: LDY.w SprDropsItem, X : BEQ .normal BRA .no_forced_drop .normal - LDY.w $0CBA, X : BEQ .no_forced_drop + LDY.w SpriteForceDrop, X : BEQ .no_forced_drop RTL .no_forced_drop PLA : PLA ; remove the JSL return lower 16 bits - PEA.w $06E3CE-1 ; change return address to .no_forced_drop of (Sprite_DoTheDeath) + PEA.w $86E3CE-1 ; change return address to .no_forced_drop of (Sprite_DoTheDeath) RTL +PikitOverride: + CMP.b #$AA : BNE .no_pikit_drop + LDY.w $0E90,X : BEQ .no_pikit_drop + CPY.b #$04 : BEQ .normal_pikit + LDA.w SprDropsItem, X : BEQ .normal_pikit + JSR CheckIfDropsInThisLocation : BCC .normal_pikit +.no_pikit_drop + PLA : PLA : PEA.w Sprite_DoTheDeath_NotAPikitDrop-1 +RTL +.normal_pikit + PLA : PLA : PEA.w Sprite_DoTheDeath_PikitDrop-1 +RTL + +; output - carry clear if the enemy doesn't drop, set if it does +CheckIfDropsInThisLocation: + REP #$30 : PHX ; save it for later + TXA : ASL : TAX : LDA.l BitFieldMasks, X : STA.b Scrap00 ; stores the bitmask for the specific drop + ; check sram, if gotten, run normal + LDA.b RoomIndex : ASL : TAX : LDA.l SpriteDropData, X : PLX ; restore X in case we're done + BIT.b Scrap00 : BNE .normal_drop ; zero indicates the item has not been obtained + PHX ; save it for later + LDX.b RoomIndex : LDA.l UWSpecialFlagIndex, X : AND.w #$00FF + CMP.w #$00FF : BEQ + ; $FF indicates the EnemyItemFlags are sufficient + JSR FetchBitmaskForSpecialCase + BRA .test + + TXA : ASL : TAX : LDA.l UWEnemyItemFlags, X + .test PLX : BIT.b Scrap00 : BEQ .normal_drop ; zero indicates the enemy doesn't drop + .valid + SEP #$30 : SEC +RTS + .normal_drop + SEP #$30 : CLC +RTS + +; input - A the index from UWSpecialFlagIndex +; uses X for loop, $02 for comparing first byte to dungeon +; output - A the correct bitmask +FetchBitmaskForSpecialCase: + ASL : TAX + LDA.w DungeonID : BNE + ; here and branch to different function? + INC #2 ; move sewers to HC + + CMP.w #$00FF : BNE + ; check if we are in a cave + LDA.l PreviousOverworldDoor : AND.w #$00FF ; use this instead of dungeon id + + STA.b Scrap02 + - LDA.l UWSpecialFlag, X : AND.w #$00FF + CMP.w #$00FF : BNE + ; if the value is FF we are done, use 0 as bitmask + LDA.w #$0000 : RTS + + CMP.b Scrap02 : BNE + ; if the value matches the dungeon, use next 2 bytes as bitmask + INX : LDA.l UWSpecialFlag, X : RTS + + INX #3 : BRA - ; else move to the next row + +MinorForcedDrops: +; Item ID -> Sprite ID +db $27, $DC ; BOMB REFILL 1 +db $28, $DD ; BOMB REFILL 4 +db $31, $DE ; BOMB REFILL 8 +db $34, $D9 ; GREEN RUPEE ($34) +db $35, $DA ; BLUE RUPEE ($35) +db $36, $DB ; RED RUPEE ($36) +db $42, $D8 ; HEART ($42) +db $44, $E2 ; ARROW REFILL 10 ($44) +db $45, $DF ; SMALL MAGIC DECANTER ($45) +db $D2, $E3 ; FAERIE ($D2) +db $D3, $0B ; CUCCO ($D3) +db $D4, $E0 ; LARGE MAGIC DECANTER ($D4) +db $D5, $E1 ; ARROW REFILL 5 (x$D5) + + +IncrementCountForMinor: + PHX : REP #$30 + LDA.w SpawnedItemIndex : ASL : TAX : LDA.l BitFieldMasks, X : STA.b Scrap0A + LDA.b RoomIndex : ASL : TAX + LDA.l SpriteDropData, X : BIT.b Scrap0A : BNE .obtained + ORA.b Scrap0A : STA.l SpriteDropData, X + SEP #$10 + JSR SetupEnemyDropIndicator + REP #$20 + LDX.w DungeonID : CPX.b #$FF : BEQ + + CPX.b #$00 : BNE ++ + INX #2 ; treat sewers as HC + ++ LDA.l DungeonLocationsChecked, X : INC : STA.l DungeonLocationsChecked, X + ; Could increment GT Tower Pre Big Key but we aren't showing that stat right now + + + LDA.l TotalItemCounter : INC : STA.l TotalItemCounter ; Increment Item Total + INC.w UpdateHUDFlag + .obtained + SEP #$30 : PLX +RTS + BitFieldMasks: dw $8000, $4000, $2000, $1000, $0800, $0400, $0200, $0100 dw $0080, $0040, $0020, $0010, $0008, $0004, $0002, $0001 ; Runs during Sprite_E4_SmallKey and during Sprite_E5_BigKey spawns ShouldSpawnItem: - LDA $048E : CMP.b #$87 : BNE + ; check for hera basement cage - LDA $A8 : AND.b #$03 : CMP.b #$02 : BNE + ; we're not in that quadrant - LDA.w $0403 : AND.w KeyRoomFlagMasks,Y : RTL + LDA.w RoomIndexMirror : CMP.b #$87 : BNE + ; check for hera basement cage + CPX.b #$0A : BNE + ; the hera basement key is always sprite 0x0A + LDA.b $A8 : AND.b #$03 : CMP.b #$02 : BNE + ; we're not in that quadrant + LDA.w RoomItemsTaken : AND.w KeyRoomFlagMasks,Y : RTL + ; checking our sram table PHX : PHY REP #$30 - LDA.b $A0 : ASL : TAY - LDA.w SprItemIndex, X : AND #$00FF : ASL + LDA.b RoomIndex : ASL : TAY + LDA.w SprItemIndex, X : AND.w #$00FF : ASL PHX - TAX : LDA.l BitFieldMasks, X : STA $00 + TAX : LDA.l BitFieldMasks, X : STA.b Scrap00 PLX ; restore X again - LDA.w SprItemFlags, X : AND #$00FF : CMP #$0001 : BEQ + - TYX : LDA.l SpritePotData, X : BIT $00 : BEQ .notObtained + LDA.w SprItemFlags, X : BIT.w #$0001 : BNE + + TYX : LDA.l SpriteDropData, X : BIT.b Scrap00 : BEQ .notObtained BRA .obtained - + TYX : LDA.l RoomPotData, X : BIT $00 : BEQ .notObtained + + TYX : LDA.l RoomPotData, X : BIT.b Scrap00 : BEQ .notObtained .obtained - SEP #$30 : PLY : PLX : LDA #$01 : RTL ; already obtained + SEP #$30 : PLY : PLX : LDA.b #$01 : RTL ; already obtained .notObtained SEP #$30 : PLY : PLX - LDA #$00 + LDA.b #$00 RTL MarkSRAMForItem: - LDA $048E : CMP.b #$87 : BNE + ; check for hera basement cage - LDA $A8 : AND.b #$03 : CMP.b #$02 : BNE + - LDA.w $0403 : ORA.w KeyRoomFlagMasks, Y : RTL + LDA.b RoomIndex : CMP.b #$87 : BNE + ; check for hera basement cage + CPX.b #$0A : BNE + ; the hera basement key is always sprite 0x0A + LDA.b $A8 : AND.b #$03 : CMP.b #$02 : BNE + + LDA.w RoomItemsTaken : ORA.w KeyRoomFlagMasks, Y : RTL + PHX : PHY : REP #$30 - LDA.b $A0 : ASL : TAY - LDA.l SpawnedItemIndex : ASL - TAX : LDA.l BitFieldMasks, X : STA $00 + LDA.b RoomIndex : ASL : TAY + LDA.w SpawnedItemIndex : ASL + TAX : LDA.l BitFieldMasks, X : STA.b Scrap00 TYX - LDA.w SpawnedItemFlag : CMP #$0001 : BEQ + - LDA SpritePotData, X : ORA $00 : STA SpritePotData, X : BRA .end - + LDA RoomPotData, X : ORA $00 : STA RoomPotData, X + LDA.w SpawnedItemFlag : CMP.w #$0001 : BEQ + + LDA.l SpriteDropData, X : ORA.b Scrap00 : STA.l SpriteDropData, X + SEP #$10 : JSR SetupEnemyDropIndicator + BRA .end + + LDA.l RoomPotData, X : ORA.b Scrap00 : STA.l RoomPotData, X .end SEP #$30 : PLY : PLX - LDA.w $0403 + LDA.w RoomItemsTaken RTL SpriteKeyPrep: - LDA.w $0B9B : STA.w $0CBA, X ; what we wrote over + LDA.w $0B9B : STA.w SpriteForceDrop, X ; what we wrote over PHA - LDA $A0 : CMP #$87 : BNE .continue - LDA $A9 : ORA $AA : AND #$03 : CMP #$02 : BNE .continue - LDA #$00 : STA.w SpawnedItemFlag : STA SprItemFlags, X - LDA #$24 : STA $0E80, X - BRA + + LDA.b RoomIndex : CMP.b #$87 : BNE .continue + CPX.b #$0A : BNE .continue ; the hera basement key is always sprite 0x0A + LDA.b LinkQuadrantH : ORA.b LinkQuadrantV : AND.b #$03 : CMP.b #$02 : BNE .continue + LDA.b #$00 : STA.w SpawnedItemFlag : STA.w SprItemFlags, X + LDA.b #$24 : STA.w SpriteItemType, X + BRA + .continue - LDA.w SpawnedItemIndex : STA SprItemIndex, X - LDA.w SpawnedItemMWPlayer : STA SprItemMWPlayer, X - LDA.w SpawnedItemFlag : STA SprItemFlags, X : BEQ + - LDA.l SpawnedItemID : STA $0E80, X + LDA.w SpawnedItemIndex : STA.w SprItemIndex, X + LDA.w SpawnedItemMWPlayer : STA.w SprItemMWPlayer, X : STA.w !MULTIWORLD_SPRITEITEM_PLAYER_ID + LDA.w SpawnedItemFlag : STA.w SprItemFlags, X : BEQ + + LDA.w SpawnedItemID : STA.w SpriteItemType, X + PHA : PHY : PHX + JSL GetSpritePalette : PLX : STA.w SpriteOAMProp, X ; setup the palette + PLY : PLA CMP #$24 : BNE ++ ; - JSL.l GetSpritePalette : STA.w $0F50, X ; setup the palette - LDA $A0 : CMP.b #$80 : BNE + - LDA SpawnedItemFlag : BNE + - LDA #$24 ; it's the big key drop? - ++ JSL RequestSlottedTile + PHX : JSL GetSpritePalette : PLX : STA.w SpriteOAMProp, X ; setup the palette + LDA.b RoomIndex : CMP.b #$80 : BNE + + LDA.w SpawnedItemFlag : BNE + + LDA.b #$24 ; it's the big key drop? + ++ JSL RequestStandingItemVRAMSlot + PLA RTL SpriteKeyDrawGFX: - JSL Sprite_DrawRippleIfInWater - PHA - LDA.w !SPRITE_REDRAW, X : BEQ + - LDA $0E80, X - JSL RequestSlottedTile - LDA.w !SPRITE_REDRAW, X : CMP.b #$02 : BEQ + + JSL Sprite_DrawRippleIfInWater + PHA + LDA.l SprItemMWPlayer, X : STA.w !MULTIWORLD_SPRITEITEM_PLAYER_ID + LDA.w SprRedrawFlag, X : BEQ + + LDA.w SpriteItemType, X + JSL RequestStandingItemVRAMSlot + LDA.w SprRedrawFlag, X : CMP.b #$02 : BEQ + BRA .skipDraw - + LDA $0E80, X + + LDA.w SpriteItemType, X CMP.b #$24 : BNE + - LDA $A0 : CMP #$80 : BNE ++ - LDA SpawnedItemFlag : BNE ++ - LDA #$24 : BRA + + LDA.b RoomIndex : CMP.b #$80 : BNE ++ + LDA.w SpawnedItemFlag : BNE ++ + LDA.b #$24 : BRA + ++ PLA PHK : PEA.w .jslrtsreturn-1 - PEA.w $068014 ; an rtl address - 1 in Bank06 + PEA.w $868014 ; an rtl address - 1 in Bank06 JML Sprite_DrawAbsorbable .jslrtsreturn RTL - + JSL DrawSlottedTile : BCS .skipDraw + + JSL DrawPotItem : BCS .skipDraw ; draw shadow - CMP #$03 : BNE + - PHA : LDA $0E60, X : ORA.b #$20 : STA $0E60, X : PLA - + JSL.l Sprite_DrawShadowLong + CMP.b #$03 : BNE + + PHA : LDA.w SpriteControl, X : ORA.b #$20 : STA.w SpriteControl, X : PLA + + JSL Sprite_DrawShadowLong .skipDraw - PLA - RTL + PLA : RTL KeyGet: - LDA CurrentSmallKeys ; what we wrote over + LDA.l CurrentSmallKeys ; what we wrote over PHA LDA.l StandingItemsOn : BNE + PLA : RTL - + LDY $0E80, X - LDA SprItemIndex, X : STA SpawnedItemIndex - LDA SprItemFlags, X : STA SpawnedItemFlag - LDA $A0 : CMP #$87 : BNE + ;check for hera cage - LDA SpawnedItemFlag : BNE + ; if it came from a pot, it's fine + + LDY.w SpriteItemType, X + LDA.w SprItemIndex, X : STA.w SpawnedItemIndex + LDA.w SprItemFlags, X : STA.w SpawnedItemFlag + LDA.b RoomIndex : CMP.b #$87 : BNE + ;check for hera cage + LDA.w SpawnedItemFlag : BNE + ; if it came from a pot, it's fine JSR ShouldKeyBeCountedForDungeon : BCC ++ JSL CountChestKeyLong ++ PLA : RTL - + STY $00 - LDA SprItemMWPlayer, X : STA !MULTIWORLD_ITEM_PLAYER_ID : BNE .receive + + STY.b Scrap00 + LDA.w SprItemMWPlayer, X : STA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE .receive PHX - LDA $040C : CMP #$FF : BNE + - LDA $00 : CMP.b #$AF : BNE .skip - LDA CurrentGenericKeys : INC : STA CurrentGenericKeys - LDA $00 : BRA .countIt + LDA.w DungeonID : CMP.b #$FF : BNE + + LDA.b Scrap00 : CMP.b #$AF : BNE .skip + LDA.l CurrentGenericKeys : INC : STA.l CurrentGenericKeys + LDA.b Scrap00 : BRA .countIt + LSR : TAX - LDA $00 : CMP.l KeyTable, X : BNE + + LDA.b Scrap00 : CMP.l KeyTable, X : BNE + .countIt - LDA.l StandingItemCounterMask : AND SpawnedItemFlag : BEQ ++ - JSL.l FullInventoryExternal : JSL CountChestKeyLong + LDA.l StandingItemCounterMask : AND.w SpawnedItemFlag : BEQ ++ + JSL AddInventory ++ PLX : PLA : RTL + CMP.b #$AF : beq .countIt ; universal key CMP.b #$24 : beq .countIt ; small key for this dungeon .skip PLX .receive - JSL $0791b3 ; Player_HaltDashAttackLong - JSL.l Link_ReceiveItem + JSL Player_HaltDashAttackLong + TYA : JSL.l AttemptItemSubstitution : JSL.l ResolveLootIDLong : TAY + JSL Link_ReceiveItem PLA : DEC : RTL KeyTable: @@ -521,32 +712,32 @@ db $A0, $A0, $A2, $A3, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD ; Input Y - the item type ShouldKeyBeCountedForDungeon: PHX - LDA $040C : CMP #$FF : BEQ .done + LDA.w DungeonID : CMP.b #$FF : BEQ .done LSR : TAX TYA : cmp KeyTable, X : BNE + - PLX : SEC : RTS - + CMP.B #$24 : BEQ - + + CMP.b #$24 : BEQ - .done PLX : CLC : RTS BigKeyGet: - LDY $0E80, X - CPY #$32 : BNE + - STZ $02E9 : LDY.b #$32 ; what we wrote over + LDY.w SpriteItemType, X + CPY.b #$32 : BNE + + STZ.w ItemReceiptMethod : LDY.b #$32 ; what we wrote over PHX : JSL Link_ReceiveItem : PLX ; what we wrote over CLC : RTL + SEC : RTL LoadProperties_PreserveCertainProps: - LDA $0E20, X : CMP #$E4 : BEQ + - CMP #$E5 : BEQ + - JML Sprite_LoadProperties - + LDA $0F50, X : PHA - LDA $0E80, X : PHA - JSL Sprite_LoadProperties - PLA : STA $0E80, X - PLA : STA $0F50, X + LDA.w SpriteTypeTable, X : CMP.b #$E4 : BEQ + + CMP.b #$E5 : BEQ + + JML SpritePrep_LoadProperties + + LDA.w SpriteOAMProp, X : PHA + LDA.w SpriteItemType, X : PHA + JSL SpritePrep_LoadProperties + PLA : STA.w SpriteItemType, X + PLA : STA.w SpriteOAMProp, X RTL SubstitionFlow: @@ -575,7 +766,7 @@ SubstituteSpriteId: + LDA.b #$01 CPY.b #$18 : BCC + LDA.b #$05 - + STA.b $0D + + STA.b Scrap0D JSR IncrementCountsForSubstitute PHB : PHK : PLB LDA.w SubstitionTable-$16, Y ; Do substitute @@ -588,51 +779,51 @@ CheckSprite_Spawn: JSL Sprite_SpawnDynamically BMI .check PHX - TYX : JSL.l Sprite_LoadProperties + TYX : JSL SpritePrep_LoadProperties PLX - JSL.l GoldBee_SpawnSelf_SetProperties + JSL GoldBee_SpawnSelf_SetProperties PLA : PLA : PLA ; pop the return address PHX : LDX.b #$03 JML Sprite_SpawnSecret_SetCoords + CPY.b #$1A : BCC + ; all other non-normal pot sprite spawns JSL Sprite_SpawnDynamically BMI .check - LDA.b #$10 : STA.b $0D ; lets the outside code treat this sprite like a Stal (most normal table values) + LDA.b #$10 : STA.b Scrap0D ; lets the outside code treat this sprite like a Stal (most normal table values) RTL + JSL Sprite_SpawnDynamically BMI .check RTL .check - LDA $0D : CMP #$08 : BNE + - LDA $0372 : BNE .error - LDX #$0F + LDA.b Scrap0D : CMP #$08 : BNE + + LDA.w LinkDashing : BNE .error + LDX.b #$0F ; loop looking for a Sprite with state 0A (carried by the player) - - LDA $0DD0, X : CMP #$0A : BEQ .foundIt + - LDA.w SpriteAITable, X : CMP.b #$0A : BEQ .foundIt DEX : BMI .error : BRA - .foundIt - LDA #$00 : STZ $0DD0, X - LDA #$E4 : JSL Sprite_SpawnDynamically + LDA.b #$00 : STZ.w SpriteAITable, X + LDA.b #$E4 : JSL Sprite_SpawnDynamically BMI .error - LDA #$40 : TSB $0308 : RTL + LDA.b #$40 : TSB.w AButtonAct : RTL .error LDA.b #$3C ; SFX2_3C - error beep - STA.w $012E - + LDA #$FF + STA.w SFX2 + + LDA.b #$FF RTL PreventPotSpawn: - LDA #$40 : BIT $0308 : BEQ + - STZ $0308 : RTL - + LDA.b #$80 : STA.w $0308 ; what we wrote over + LDA.b #$40 : BIT.w AButtonAct : BEQ + + STZ.w AButtonAct : RTL + + LDA.b #$80 : STA.w AButtonAct ; what we wrote over RTL PreventPotSpawn2: - LDA $0308 : BEQ + - LDA.b #$01 : TSB.b $50 ; what we wrote over + LDA.w AButtonAct : BEQ + + LDA.b #$01 : TSB.b LinkStrafe ; what we wrote over + RTL CheckIfPotIsSpecial: @@ -656,21 +847,21 @@ org $868072 JSL SetBottleVendorKey : NOP #4 pullpc SetBottleVendorKey: - LDA.w $0E20,Y : CMP.b #$E4 : BNE + + LDA.w SpriteTypeTable,Y : CMP.b #$E4 : BNE + ; small key from bottle vendor - LDA.b #$AF : STA.w $0E80,Y - LDA.b #$01 : STA.w !SPRITE_REDRAW, Y + LDA.b #$AF : STA.w SpriteItemType,Y + LDA.b #$01 : STA.w SprRedrawFlag, Y BRA .shift + CMP.b #$DE : BEQ .return CMP.b #$E2 : BEQ .return ; shift narrow sprite to left by 4 .shift - LDA.b $00 : CLC : ADC.b #$04 : STA.w $0D10,Y ; what we wrote over + LDA.b Scrap00 : CLC : ADC.b #$04 : STA.w SpritePosXLow,Y ; what we wrote over .return RTL ConditionalLoadCommonSprites_Do3To4Low: - LDA.b $10 : CMP.b #$01 : BEQ + ; what we wrote over + LDA.b GameMode : CMP.b #$01 : BEQ + ; what we wrote over CMP.b #$0E : BEQ ++ JML LoadCommonSprites_Prep3To4Low + JML LoadCommonSprites_in_file_select diff --git a/lampmantlecone.asm b/lampmantlecone.asm index 8f7bf6c..b0f00e8 100644 --- a/lampmantlecone.asm +++ b/lampmantlecone.asm @@ -4,36 +4,49 @@ ; Output: 0 for darkness, 1 for lamp cone ;-------------------------------------------------------------------------------- LampCheck: - LDA $7F50C4 : CMP.b #$01 : BNE + : RTL : + - CMP.b #$FF : BNE + : INC : RTL : + - - LDA LampEquipment : BNE .done ; skip if we already have lantern - - LDA $040C : CMP.b #$FF : BEQ + - CMP.b #$04 : BCS + ; check if we're in HC - LDA LampConeSewers : BRA .done - + LDA CurrentWorld : BNE + - LDA LampConeLightWorld : BRA .done - + LDA LampConeDarkWorld - .done - ;BNE + : STZ $1D : + ; remember to turn cone off after a torch + LDA.l LightConeModifier : BNE .lamp + LDA.l LampEquipment : BNE .lamp ; skip if we already have lantern + LDA.w DungeonID : CMP.b #$04 : BCS + ; are we en HC? + LDA.l LampConeSewers : RTL + + : TDC + .lamp RTL ;================================================================================ ;-------------------------------------------------------------------------------- ; Output: 0 locked, 1 open ;-------------------------------------------------------------------------------- CheckForZelda: - LDA.l ProgressIndicator : CMP.b #$02 : !BLT + ; Skip if rain is falling - LDA.b #$01 ; pretend we have zelda anyway - RTL - + - LDA FollowerIndicator + LDA.l ProgressIndicator : CMP.b #$02 : !BLT + ; Skip if rain is falling + LDA.b #$01 ; pretend we have zelda anyway + RTL + + + LDA.l FollowerIndicator RTL ;================================================================================ -;-------------------------------------------------------------------------------- SetOverlayIfLamp: - JSL.l LampCheck - STA $1D ; write it directly to the overlay, this isn't a terrible idea at all + JSL LampCheck + STA.b SUBDESQ ; write it directly to the overlay, this isn't a terrible idea at all RTL ;================================================================================ -;LDA CurrentWorld : EOR #$40 : LSR #6 : AND #$01 ; return the same result as having the lantern in the light world +; Mantle Object Changes +;-------------------------------------------------------------------------------- +Mantle_CorrectPosition: + LDA.l ProgressFlags : AND.b #$04 : BEQ + + LDA.b #$0A : STA.w SpritePosXLow, X ; just spawn it off to the side where we know it should be + LDA.b #$03 : STA.w SpritePosXHigh, X + LDA.b #$90 : STA.w SpriteSpawnStep, X + + + LDA.w SpritePosYLow, X : !ADD.b #$03 ; thing we did originally +RTL + +;================================================================================ +; Mirror Scroll -> Spawn at Zelda's Cell +;-------------------------------------------------------------------------------- +MirrorScrollSpawnZelda: + LDA.l MirrorEquipment : CMP.b #$01 : BNE + ;mirror scroll + LDA.l StartingEntrance : CMP.b #$02 : BEQ ++ ; zelda's cell + CMP.b #$04 : BNE + + ++ INC.w RespawnFlag + ; what we replaced + + STZ.b GameSubMode : STZ.b NMISTRIPES +RTL diff --git a/maidencrystals.asm b/maidencrystals.asm index b02ae1b..ff01c60 100644 --- a/maidencrystals.asm +++ b/maidencrystals.asm @@ -6,20 +6,13 @@ ; MaidenCrystalScript ;-------------------------------------------------------------------------------- MaidenCrystalScript: - LDA.b #$00 : STA $7F5091 - STZ $02D8 - STZ $02DA - STZ $2E - LDA #$02 : STA $2F - - ; Load the dungeon index. Is it the Dark Palace? - ;LDA $040C : !SUB.b #$0A : TAY : CPY.b #$02 : BNE + - ; LDA MapIcons : CMP.b #$07 : BCS ++ : LDA.b #$07 : STA MapIcons : ++ - ;+ - - LDA CrystalsField : AND.b #$7F : CMP.b #$7F : BNE + ; check if we have all crystals - LDA.b #$08 : STA MapIcons ; Update the map icon to just be Ganon's Tower + LDA.b #$00 : STA.l BusyItem + STZ.w ItemReceiptID + STZ.w ItemReceiptPose + STZ.b LinkAnimationStep + LDA.b #$02 : STA.w LinkDirection + LDA.l CrystalsField : AND.b #$7F : CMP.b #$7F : BNE + ; check if we have all crystals + LDA.b #$08 : STA.l MapIcons ; Update the map icon to just be Ganon's Tower + - -JML.l $1ECF35 ; <- F4F35 - sprite_crystal_maiden.asm : 426 +JML CrystalMaiden_KickOutOfDungeon ; <- F4F35 - sprite_crystal_maiden.asm : 426 ;-------------------------------------------------------------------------------- diff --git a/mantle.asm b/mantle.asm deleted file mode 100644 index 4496898..0000000 --- a/mantle.asm +++ /dev/null @@ -1,22 +0,0 @@ -;================================================================================ -; Mantle Object Changes -;-------------------------------------------------------------------------------- -Mantle_CorrectPosition: - LDA.l ProgressFlags : AND.b #$04 : BNE .spawnOpen - LDA.l StartingEntrance : CMP.b #$04 : BNE + - .spawnOpen - LDA.b #$0A : STA $0D10, X ; just spawn it off to the side where we know it should be - LDA.b #$03 : STA $0D30, X - LDA.b #$90 : STA $0ED0, X - + - LDA $0D00, X : !ADD.b #$03 ; thing we did originally -RTL -;-------------------------------------------------------------------------------- -MirrorScrollSpawnZelda: - LDA.l MirrorEquipment : CMP.b #$01 : BNE + ;mirror scroll - LDA.l StartingEntrance : CMP.b #$02 : BEQ ++ ; zelda's cell - CMP.b #$04 : BNE + - ++ INC $04AA - ; what we replaced - + STZ.b $11 : STZ.b $14 -RTL \ No newline at end of file diff --git a/map.asm b/map.asm deleted file mode 100644 index c682a0c..0000000 --- a/map.asm +++ /dev/null @@ -1,16 +0,0 @@ -; ============================================================================== -;PrepMapZoom: -; LDA.b #$80 : STA $211A ; thing we wrote over -; -; LDA.b #$00 : STA !MAP_ZOOM -;RTL -; ============================================================================== -;ForceMapZoom: -; LDA !MAP_ZOOM : BNE .isPreset -; LDA.b #$01 -; LDA.b #$01 : STA !MAP_ZOOM -;RTL -; .isPreset -; LDA $F6 : AND.b #$70 -;RTL -; ============================================================================== \ No newline at end of file diff --git a/medallions.asm b/medallions.asm index c70a57c..3bcbf58 100644 --- a/medallions.asm +++ b/medallions.asm @@ -3,63 +3,61 @@ ;-------------------------------------------------------------------------------- TryOpenMire: ; Checks if we're in the Swamp of Evil. - LDA $8A : CMP.b #$70 : BNE .untriggered + LDA.b OverworldIndex : CMP.b #$70 : BNE .untriggered ; Checks whether the Misery Mire dungeon is already revealed. - LDA OverworldEventDataWRAM+$70 : AND.b #$20 : BNE .untriggered + LDA.l OverworldEventDataWRAM+$70 : AND.b #$20 : BNE .untriggered ; You have to be in the trigger window. - LDY.b #$02 : JSL.l Ancilla_CheckIfEntranceTriggered : BCC .untriggered + LDY.b #$02 : JSL Ancilla_CheckIfEntranceTriggered : BCC .untriggered ; Do the 3rd animation for opening entrances - LDA.b #$03 : STA $04C6 + LDA.b #$03 : STA.w OWEntranceCutscene - STZ $B0 ; reset the sub-submodule index - STZ $C8 ; reset this other index. + STZ.b SubSubModule ; reset the sub-submodule index + STZ.b ScrapBufferBD+$0B ; reset this other index. .untriggered RTL ;-------------------------------------------------------------------------------- TryOpenTRock: ; Checks if we're at Turtle Rock. - LDA $8A : CMP.b #$47 : BNE .untriggered + LDA.b OverworldIndex : CMP.b #$47 : BNE .untriggered ; Checks whether the Turtle Rock dungeon is already revealed. - LDA OverworldEventDataWRAM+$47 : AND.b #$20 : BNE .untriggered + LDA.l OverworldEventDataWRAM+$47 : AND.b #$20 : BNE .untriggered ; You have to be in the trigger window. - LDY.b #$03 : JSL.l Ancilla_CheckIfEntranceTriggered : BCC .untriggered + LDY.b #$03 : JSL Ancilla_CheckIfEntranceTriggered : BCC .untriggered ; Do the 4rd animation for opening entrances - LDA.b #$04 : STA $04C6 + LDA.b #$04 : STA.w OWEntranceCutscene - STZ $B0 ; reset the sub-submodule index - STZ $C8 ; reset this other index. + STZ.b SubSubModule ; reset the sub-submodule index + STZ.b ScrapBufferBD+$0B ; reset this other index. .untriggered RTL ;-------------------------------------------------------------------------------- MedallionTrigger_Bombos: - STZ $50 ; stuff we wrote over - STZ $0FC1 + STZ.b LinkStrafe ; stuff we wrote over + STZ.w FreezeSprites PHA LDA.l MireRequiredMedallion : BNE + - JSL.l TryOpenMire + JSL TryOpenMire + LDA.l TRockRequiredMedallion : BNE + - JSL.l TryOpenTRock + JSL TryOpenTRock + PLA RTL ;-------------------------------------------------------------------------------- -!EPILEPSY_TIMER = "$7F5041" MedallionTrigger_Ether: PHA - LDA.b #$00 : STA !EPILEPSY_TIMER LDA.l MireRequiredMedallion : CMP.b #$01 : BNE + - JSL.l TryOpenMire + JSL TryOpenMire + LDA.l TRockRequiredMedallion : CMP.b #$01 : BNE + - JSL.l TryOpenTRock + JSL TryOpenTRock + PLA RTL @@ -67,9 +65,9 @@ RTL MedallionTrigger_Quake: PHA LDA.l MireRequiredMedallion : CMP.b #$02 : BNE + - JSL.l TryOpenMire + JSL TryOpenMire + LDA.l TRockRequiredMedallion : CMP.b #$02 : BNE + - JSL.l TryOpenTRock + JSL TryOpenTRock + PLA RTL diff --git a/menu/hudalpha.asm b/menu/hudalpha.asm index c24b758..238bb07 100644 --- a/menu/hudalpha.asm +++ b/menu/hudalpha.asm @@ -1,8 +1,8 @@ OnMenuLoad: - LDA.b #UploadMenuOnlyIcons>>0 : STA !NMI_AUX - LDA.b #UploadMenuOnlyIcons>>8 : STA !NMI_AUX+1 - LDA.b #UploadMenuOnlyIcons>>16 : STA !NMI_AUX+2 - LDA.b #$0E : STA.b $10 ; what we overwrote + LDA.b #UploadMenuOnlyIcons>>0 : STA NMIAux + LDA.b #UploadMenuOnlyIcons>>8 : STA NMIAux+1 + LDA.b #UploadMenuOnlyIcons>>16 : STA NMIAux+2 + LDA.b #$0E : STA.b GameMode ; what we overwrote RTL UploadMenuOnlyIcons: diff --git a/menu/overworldmap.asm b/menu/overworldmap.asm index e500a92..fcfe38b 100644 --- a/menu/overworldmap.asm +++ b/menu/overworldmap.asm @@ -1,151 +1,17 @@ -; adding support for up to 13 markers -!MC_FLAG = "$7F5420" - -; tables -org $8ABDF6 -WorldMapIcon_posx_vanilla: -dw $0F31 ; prize1 -dw $08D0 ; prize2 -dw $0108 -dw $0F40 - -dw $0082 -dw $0F11 -dw $01D0 -dw $0100 - -dw $0CA0 -dw $0759 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FFFF ; reserved - not used -dw $FFFF -dw $FFFF - -org $8ABE16 -WorldMapIcon_posy_vanilla: -dw $0620 ; prize1 -dw $0080 ; prize2 -dw $0D70 -dw $0620 - -dw $00B0 -dw $0103 -dw $0780 -dw $0CA0 - -dw $0DA0 -dw $0ED0 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FFFF ; reserved - not used -dw $FFFF -dw $FFFF - -org $8ABE36 -WorldMapIcon_posx_located: -dw $FF00 ; prize1 -dw $FF00 ; prize2 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FF00 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FF00 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FFFF ; reserved - not used -dw $FFFF -dw $FFFF - -org $8ABE56 -WorldMapIcon_posy_located: -dw $FF00 ; prize1 -dw $FF00 ; prize2 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FF00 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FF00 -dw $FF00 -dw $FF00 - -dw $FF00 -dw $FFFF ; reserved - not used -dw $FFFF -dw $FFFF - -org $8ABE76 -WorldMapIcon_tile: -db $38, $62 ; green pendant -db $32, $60 ; red pendant -db $34, $60 ; blue pendant -db $34, $64 ; crystal - -db $34, $64 ; crystal -db $34, $64 ; crystal -db $34, $64 ; crystal -db $34, $64 ; crystal - -db $34, $64 ; crystal -db $34, $64 ; crystal -db $32, $66 ; skull looking thing -db $00, $00 ; red x - -db $00, $00 ; red x -db $00, $00 ; unused red x's -db $00, $00 -db $00, $00 - -org $8ABE96 -CompassExists: -; dw $37FC ; todo: convert to two bytes with masks? so much extra code... -; eastern hera desert pod skull trock thieves mire ice swamp gt at escape -db $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00, $00 - -; 0 = light world, 1 = dark world -org $8ABEA6 -WorldCompassMask: -db $00, $00, $00, $01, $01, $01, $01, $01, $01, $01, $01, $00, $00, $00, $00, $00 - -; eastern desert hera pod skull trock thieves mire ice swamp gt at escape x1 x2 x3 - -; refs -org $8AC59B -WorldMapIcon_AdjustCoordinate: -org $8AC3B1 -WorldMap_CalculateOAMCoordinates: -org $8AC52E -WorldMap_HandleSpriteBlink: -org $8ABF70 -WorldMap_RedXChars: +pushpc org $8AC02B DrawPrizesOverride: LDX.b #$FF + .loopStart INX : PHX JSR OverworldMap_CheckForPrize BCC + : JMP .skip_draw : + TXA : ASL A : TAX - LDA.l !MC_FLAG - AND #$01 : BNE + + LDA.l MapCompassFlag + AND.b #$01 : BNE + LDA.l WorldMapIcon_posx_vanilla+1, X : STA.l $7EC10B LDA.l WorldMapIcon_posx_vanilla, X : STA.l $7EC10A LDA.l WorldMapIcon_posy_vanilla+1, X : STA.l $7EC109 @@ -156,10 +22,10 @@ LDX.b #$FF LDA.l WorldMapIcon_posy_located+1, X : STA.l $7EC109 LDA.l WorldMapIcon_posy_located, X : STA.l $7EC108 .adjustment - LDA.l WorldMapIcon_tile, X : CMP #$FF : BEQ .skip_draw + LDA.l WorldMapIcon_tile, X : CMP.b #$FF : BEQ .skip_draw LDA.l WorldMapIcon_tile+1, X : BEQ .dont_adjust CMP.b #$64 : BEQ .is_crystal - LDA.b $1A : AND.b #$10 : BNE .skip_draw + LDA.b FrameCounter : AND.b #$10 : BNE .skip_draw .is_crystal JSR WorldMapIcon_AdjustCoordinate .dont_adjust @@ -167,21 +33,21 @@ LDX.b #$FF BCC .skip_draw PLX : PHX : TXA : ASL A : TAX LDA.l WorldMapIcon_tile+1, X : BEQ .is_red_x - LDA.l !MC_FLAG : CMP.b #$01 : BEQ .is_red_x - LDA.l WorldMapIcon_tile+1, X : STA.b $0D - LDA.l WorldMapIcon_tile, X : STA.b $0C + LDA.l MapCompassFlag : CMP.b #$01 : BEQ .is_red_x + LDA.l WorldMapIcon_tile+1, X : STA.b Scrap0D + LDA.l WorldMapIcon_tile, X : STA.b Scrap0C LDA.b #$02 : BRA .continue .is_red_x - LDA.b $1A : LSR #3 : AND.b #$03 : TAX - LDA.l WorldMap_RedXChars,X : STA.b $0D - LDA.b #$32 : STA.b $0C : LDA.b #$00 + LDA.b FrameCounter : LSR #3 : AND.b #$03 : TAX + LDA.l WorldMap_RedXChars,X : STA.b Scrap0D + LDA.b #$32 : STA.b Scrap0C : LDA.b #$00 .continue - STA.b $0B + STA.b Scrap0B PLX : PHX INX : JSR WorldMap_HandleSpriteBlink .skip_draw ; end of loop - PLX : CPX #12 : BCS + : JMP .loopStart : + + PLX : CPX.b #12 : BCS + : JMP .loopStart : + PLA : STA.l $7EC10B PLA : STA.l $7EC10A @@ -193,56 +59,45 @@ LDX.b #$FF ; X - the index of the prize marker OverworldMap_CheckForPrize: PHX - LDA #$00 : STA.l !MC_FLAG + LDA.b #$00 : STA.l MapCompassFlag JSR OverworldMap_CheckForCompass BCC + - LDA.l !MC_FLAG : ORA #$01 : STA.l !MC_FLAG - LDA CurrentWorld : AND #$40 : BNE ++ ; is the compass position on LW or DW? + LDA.l MapCompassFlag : ORA.b #$01 : STA.l MapCompassFlag + LDA.l CurrentWorld : AND.b #$40 : BNE ++ ; is the compass position on LW or DW? LDA.l WorldCompassMask, X : BEQ + : JMP .fail ++ LDA.l WorldCompassMask, X : BNE + : JMP .fail + JSR OverworldMap_CheckForMap BCC + - LDA.l !MC_FLAG : ORA #$02 : STA.l !MC_FLAG + LDA.l MapCompassFlag : ORA.b #$02 : STA.l MapCompassFlag + - LDA.l !MC_FLAG : BEQ .fail - CMP #$02 : BNE .checkIfObtained - LDA CurrentWorld : AND #$40 : BNE + - CPX #3 : BCS .fail : BRA .checkIfObtained - + CPX #10 : BCS .fail - CPX #3 : BCC .fail + LDA.l MapCompassFlag : BEQ .fail + CMP.b #$02 : BNE .checkIfObtained + LDA.l CurrentWorld : AND.b #$40 : BNE + + CPX.b #3 : BCS .fail : BRA .checkIfObtained + + CPX.b #10 : BCS .fail + CPX.b #3 : BCC .fail .checkIfObtained LDA.l MC_DungeonIdsForPrize, X BPL +++ : CLC : BRA .done : +++ ; non-prize flags - - TAX : LDA.l CrystalPendantFlags_2, X : BEQ .checkPendant - AND.b #$40 : BNE .checkCrystal - LDA.l CrystalPendantFlags_2, X : AND.b #$01 : BNE .checkAga1 - LDA.l CrystalPendantFlags_2, X : AND.b #$02 : BNE .checkAga2 + CMP.b #$02 : BCC .hyrule_castle + ASL : TAX + REP #$20 + LDA.l DungeonsCompleted : AND.l DungeonItemMasks,X : BNE .fail + CLC : BRA .done ; see if hyrule castle has been completely cleared - LDA.l CompassTotalsWRAM, X : SEC : SBC DungeonLocationsChecked, X : BEQ .fail - CLC : BRA .done - - .checkPendant - LDA PendantsField : AND.l CrystalPendantFlags, X : BNE .fail - CLC : BRA .done - - .checkCrystal - LDA CrystalsField : AND.l CrystalPendantFlags, X : BNE .fail - CLC : BRA .done - - .checkAga1 - LDA ProgressIndicator : CMP #$03 : BEQ .fail - CLC : BRA .done - - .checkAga2 - LDA RoomDataWRAM[$0D].high : AND #$08 : BNE .fail + .hyrule_castle + REP #$20 + LDA.l CompassTotalsWRAM, X : SEC : SBC.l DungeonLocationsChecked, X + SEP #$20 + BEQ .fail CLC : BRA .done .fail SEC .done +SEP #$20 PLX RTS @@ -250,14 +105,14 @@ RTS ; CLC - should not move indicator ; SEC - yep indicator can move OverworldMap_CheckForCompass: - LDA.l CompassMode : AND #$80 : BEQ .unset ; should I check for compass logic - LDA.l CompassMode : AND #$40 : BEQ .set ; compasses/maps aren't shuffled - LDA.l CompassMode : AND #$20 : BNE + + LDA.l CompassMode : AND.b #$80 : BEQ .unset ; should I check for compass logic + LDA.l CompassMode : AND.b #$40 : BEQ .set ; compasses/maps aren't shuffled + LDA.l CompassMode : AND.b #$20 : BNE + JSR OverworldMap_CheckForMap : BCC .unset : BRA .set + LDA.l CompassExists, X : BEQ .set ; compass doesn't exist PHX LDA.l MC_SRAM_Offsets, X : TAX ; put compass offset into X - LDA CompassField, X : ORA MapOverlay, X + LDA.l CompassField, X : ORA.l MapOverlay, X PLX AND.l MC_Masks, X : BNE .set ; is the compass obtained .unset @@ -272,13 +127,13 @@ RTS ; SEC - yep should show exact prize OverworldMap_CheckForMap: LDA.l MapMode : BEQ .set ; obtaining map doesn't change anything - LDA CurrentWorld : AND #$40 : BNE + ; not really sure on this check - LDA MapField : ORA MapOverlay : AND.b #$01 : BNE .set : BRA .continue - + LDA MapField : ORA MapOverlay : AND.b #$02 : BNE .set + LDA.l CurrentWorld : AND.b #$40 : BNE + ; not really sure on this check + LDA.l MapField : ORA.l MapOverlay : AND.b #$01 : BNE .set : BRA .continue + + LDA.l MapField : ORA.l MapOverlay : AND.b #$02 : BNE .set .continue PHX LDA.l MC_SRAM_Offsets, X : TAX ; put map offset into X - LDA MapField, X : ORA MapOverlay, X + LDA.l MapField, X : ORA.l MapOverlay, X PLX AND.l MC_Masks, X : BNE .set ; is the map obtained? .unset @@ -288,13 +143,4 @@ RTS SEC RTS -; eastern desert hera pod skull trock thieves mire ice swamp gt at escape -MC_DungeonIdsForPrize: -db $02, $0A, $03, $06, $08, $0C, $0B, $07, $09, $05, $00, $04, $01 -MC_SRAM_Offsets: -db $01, $00, $01, $01, $00, $00, $00, $01, $00, $01, $00, $01, $01 -MC_Masks: -; EP TH DP PD SK TR TT MM -db $20, $20, $10, $02, $80, $08, $10, $01, $40, $04, $04, $08, $40 - -warnpc $8AC3B1 ; above code should not exceed the space of the code segment it is overwriting \ No newline at end of file +pullpc diff --git a/msu.asm b/msu.asm index 0bf06a3..e834bc0 100644 --- a/msu.asm +++ b/msu.asm @@ -81,86 +81,48 @@ ; ;======================================= -!REG_MSU_STATUS = $2000 +!VAL_MSU_ID_01 = $2D53 ; 'S-' +!VAL_MSU_ID_23 = $534D ; 'MS' +!VAL_MSU_ID_45 = $3155 ; 'U1' -!REG_MSU_ID_0 = $2002 -!REG_MSU_ID_1 = $2003 -!REG_MSU_ID_2 = $2004 -!REG_MSU_ID_3 = $2005 -!REG_MSU_ID_4 = $2006 -!REG_MSU_ID_5 = $2007 +!FLAG_MSU_PLAY = $01 +!FLAG_MSU_REPEAT = $02 +!FLAG_MSU_RESUME = $04 +!FLAG_MSU_STATUS_TRACK_MISSING = $08 +!FLAG_MSU_STATUS_AUDIO_PLAYING = $10 +!FLAG_MSU_STATUS_AUDIO_REPEATING = $20 +!FLAG_MSU_STATUS_AUDIO_BUSY = $40 +!FLAG_MSU_STATUS_DATA_BUSY = $80 -!REG_MSU_ID_01 = $2002 -!REG_MSU_ID_23 = $2004 -!REG_MSU_ID_45 = $2006 +!FLAG_RESUME_CANCEL = $01 +!FLAG_RESUME_FADEIN = $02 +!VAL_COMMAND_STOP_PLAYBACK = $F0 +!VAL_COMMAND_FADE_OUT = $F1 +!VAL_COMMAND_FADE_HALF = $F2 +!VAL_COMMAND_FULL_VOLUME = $F3 +!VAL_COMMAND_MUTE_SPC = $FA +!VAL_COMMAND_UNMUTE_SPC = $FB +!VAL_COMMAND_LOAD_NEW_BANK = $FF -!VAL_MSU_ID_0 = #$53 ; 'S' -!VAL_MSU_ID_1 = #$2D ; '-' -!VAL_MSU_ID_2 = #$4D ; 'M' -!VAL_MSU_ID_3 = #$53 ; 'S' -!VAL_MSU_ID_4 = #$55 ; 'U' -!VAL_MSU_ID_5 = #$31 ; '1' - -!VAL_MSU_ID_01 = #$2D53 ; 'S-' -!VAL_MSU_ID_23 = #$534D ; 'MS' -!VAL_MSU_ID_45 = #$3155 ; 'U1' - - -!REG_MSU_TRACK = $2004 -!REG_MSU_TRACK_LO = $2004 -!REG_MSU_TRACK_HI = $2005 -!REG_MSU_VOLUME = $2006 -!REG_MSU_CONTROL = $2007 - - -!FLAG_MSU_PLAY = #$01 -!FLAG_MSU_REPEAT = #$02 -!FLAG_MSU_RESUME = #$04 -!FLAG_MSU_STATUS_TRACK_MISSING = #$08 -!FLAG_MSU_STATUS_AUDIO_PLAYING = #$10 -!FLAG_MSU_STATUS_AUDIO_REPEATING = #$20 -!FLAG_MSU_STATUS_AUDIO_BUSY = #$40 -!FLAG_MSU_STATUS_DATA_BUSY = #$80 - -!FLAG_RESUME_CANCEL = #$01 -!FLAG_RESUME_FADEIN = #$02 - -!REG_CURRENT_MSU_TRACK = $010B -!REG_CURRENT_VOLUME = $0127 -!REG_TARGET_VOLUME = $0129 -!REG_CURRENT_TRACK = $0130 -!REG_CURRENT_COMMAND = $0133 - -!REG_SPC_CONTROL = $2140 -!REG_NMI_FLAGS = $4210 - -!VAL_COMMAND_STOP_PLAYBACK = #$F0 -!VAL_COMMAND_FADE_OUT = #$F1 -!VAL_COMMAND_FADE_HALF = #$F2 -!VAL_COMMAND_FULL_VOLUME = #$F3 -!VAL_COMMAND_MUTE_SPC = #$FA -!VAL_COMMAND_UNMUTE_SPC = #$FB -!VAL_COMMAND_LOAD_NEW_BANK = #$FF - -!VAL_VOLUME_INCREMENT = #$10 -!VAL_VOLUME_DECREMENT = #$02 -!VAL_VOLUME_HALF = #$80 -!VAL_VOLUME_FULL = #$FF +!VAL_VOLUME_INCREMENT = $10 +!VAL_VOLUME_DECREMENT = $02 +!VAL_VOLUME_HALF = $80 +!VAL_VOLUME_FULL = $FF ;================================================================================ ; Check if A has an overworld track ;-------------------------------------------------------------------------------- IsOverworldTrack: - CMP #02 : BEQ .yes ; 2 - Hyrule Field - CMP #03 : BEQ .yes ; 3 - Time of Falling Rain - CMP #04 : BEQ .yes ; 4 - The Silly Pink Rabbit - CMP #05 : BEQ .yes ; 5 - Forest of Mystery - CMP #07 : BEQ .yes ; 7 - Kakariko Village - CMP #09 : BEQ .yes ; 9 - Dark Golden Land - CMP #15 : BEQ .yes ; 15 - Dark Woods - CMP #60 : BEQ .yes ; 60 - Light World OW (after ped pull) - CMP #61 : BEQ .yes ; 61 - Dark World OW (with all crystals) + CMP.b #02 : BEQ .yes ; 2 - Hyrule Field + CMP.b #03 : BEQ .yes ; 3 - Time of Falling Rain + CMP.b #04 : BEQ .yes ; 4 - The Silly Pink Rabbit + CMP.b #05 : BEQ .yes ; 5 - Forest of Mystery + CMP.b #07 : BEQ .yes ; 7 - Kakariko Village + CMP.b #09 : BEQ .yes ; 9 - Dark Golden Land + CMP.b #15 : BEQ .yes ; 15 - Dark Woods + CMP.b #60 : BEQ .yes ; 60 - Light World OW (after ped pull) + CMP.b #61 : BEQ .yes ; 61 - Dark World OW (with all crystals) .no CLC : RTS .yes @@ -172,7 +134,7 @@ SEC : RTS ;-------------------------------------------------------------------------------- IsResumableTrack: PHA - LDA MSUResumeType : BEQ + + LDA.l MSUResumeType : BEQ + PLA JSR IsOverworldTrack RTS @@ -187,54 +149,54 @@ RTS ;-------------------------------------------------------------------------------- CheckMusicLoadRequest: PHP : PHB : PHD : REP #$30 : PHA : PHX : PHY - LDA #$0000 : TCD : SEP #$20 : PHA : PLB - LDA !REG_MUSIC_CONTROL_REQUEST : BEQ .skip+3 : BMI .skip+3 - CMP !REG_CURRENT_COMMAND : BNE .continue + LDA.w #$0000 : TCD : SEP #$20 : PHA : PLB + LDA.w MusicControlRequest : BEQ .skip+3 : BMI .skip+3 + CMP.w CurrentControlRequest : BNE .continue CMP.b #22 : BNE .skip ; Check GT when mirroring from upstairs - LDA !REG_CURRENT_MSU_TRACK : CMP.b #59 : BNE .skip - LDA.b #$00 : STA !REG_CURRENT_COMMAND + LDA.w CurrentMSUTrack : CMP.b #59 : BNE .skip + LDA.b #$00 : STA.w CurrentControlRequest BRA .continue .skip - LDA !REG_MUSIC_CONTROL_REQUEST - STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST + LDA.w MusicControlRequest + STA.w MusicControl : STZ.w MusicControlRequest REP #$30 : PLY : PLX : PLA : PLD : PLB : PLP RTL .continue - LDA TournamentSeed : BNE +++ - LDA !REG_MSU_PACK_REQUEST - CMP !REG_MSU_PACK_CURRENT : BEQ +++ - CMP !REG_MSU_PACK_COUNT : !BLT ++ - CMP #$FE : !BLT + - STA !REG_MSU_PACK_CURRENT + LDA.l TournamentSeed : BNE +++ + LDA.w MSUPackRequest + CMP.w MSUPackCurrent : BEQ +++ + CMP.w MSUPackCount : !BLT ++ + CMP.b #$FE : !BLT + + STA.w MSUPackCurrent SEP #$10 - LDA #$00 - LDX #$07 + LDA.b #$00 + LDX.b #$07 - - STA !REG_MSU_FALLBACK_TABLE,X + STA.w MSUFallbackTable,X DEX : BPL - REP #$10 BRA +++ - + : LDA !REG_MSU_PACK_CURRENT : STA !REG_MSU_PACK_REQUEST - ++ : STA !REG_MSU_PACK_CURRENT + + : LDA.w MSUPackCurrent : STA.w MSUPackRequest + ++ : STA.w MSUPackCurrent JSL MSUInit_check_fallback +++ - LDA !REG_MUSIC_CONTROL_REQUEST : CMP #$08 : BEQ ++ ; Mirror SFX is not affected by NoBGM or pack $FE - LDA NoBGM : BNE + - LDA !REG_MSU_PACK_CURRENT : CMP #$FE : BNE ++ + LDA.w MusicControlRequest : CMP.b #$08 : BEQ ++ ; Mirror SFX is not affected by NoBGM or pack $FE + LDA.l NoBGM : BNE + + LDA.w MSUPackCurrent : CMP.b #$FE : BNE ++ + : JMP .mute ++ - LDX !REG_MSU_ID_01 : CPX !VAL_MSU_ID_01 : BEQ + + LDX.w MSUID : CPX.w #!VAL_MSU_ID_01 : BEQ + - : JMP .unmute + - LDX !REG_MSU_ID_23 : CPX !VAL_MSU_ID_23 : BNE - - LDX !REG_MSU_ID_45 : CPX !VAL_MSU_ID_45 : BNE - + LDX.w MSUID+2 : CPX.w #!VAL_MSU_ID_23 : BNE - + LDX.w MSUID+4 : CPX.w #!VAL_MSU_ID_45 : BNE - SEP #$10 ; Load alternate or dungeon-specific tracks - LDA !REG_MUSIC_CONTROL_REQUEST + LDA.w MusicControlRequest CMP.b #02 : BEQ .lightworld CMP.b #04 : BEQ .no_change+1 ; bunny @@ -248,50 +210,50 @@ CheckMusicLoadRequest: JMP .check_fallback .boss - LDA $040C : LSR : !ADD.b #45 + LDA.w DungeonID : LSR : !ADD.b #45 BRA .check_fallback-3 .no_change PLA : BRA .check_fallback-3 .lightworld PHA - LDA InvertedMode : BNE + + LDA.l InvertedMode : BNE + ;LDA OverworldEventDataWRAM+$80 : AND.b #$40 : BEQ + ; ped pull - LDA ProgressIndicator : CMP.b #03 : BNE .no_change ; aga1 killed + LDA.l ProgressIndicator : CMP.b #03 : BNE .no_change ; aga1 killed - PLA : LDA.b #60 : BRA .check_fallback-3 + - LDA CrystalsField : CMP.b #$7F : BNE .no_change + LDA.l CrystalsField : CMP.b #$7F : BNE .no_change BRA - .darkworld PHA - LDA InvertedMode : BNE + - LDA CrystalsField : CMP.b #$7F : BNE .no_change + LDA.l InvertedMode : BNE + + LDA.l CrystalsField : CMP.b #$7F : BNE .no_change - PLA : LDA.b #61 : BRA .check_fallback-3 + - LDA ProgressIndicator : CMP.b #03 : BNE .no_change ; aga1 killed + LDA.l ProgressIndicator : CMP.b #03 : BNE .no_change ; aga1 killed BRA - .darkwoods PHA - LDX $8A : LDA.l OWTileWorldAssoc,X : BEQ + + LDX.b OverworldIndex : LDA.l OWTileWorldAssoc,X : BEQ + PLA : BRA .darkworld + PLA : BRA .lightworld .castle - LDA $040C + LDA.w DungeonID CMP.b #$08 : BNE .check_fallback ; Hyrule Castle 2 .dungeon - LDA $040C : CMP.b #$1A : BNE + + LDA.w DungeonID : CMP.b #$1A : BNE + PHA : LDA.l DRMode : BEQ ++ - LDA.w BigKeyField : AND.b #$04 : BEQ ++ + LDA.l BigKeyField : AND.b #$04 : BEQ ++ ; if door rando and entering GT with BK PLA : LDA.b #59 : BRA .check_fallback-3 ++ PLA - + LSR : !ADD.b #33 : STA !REG_MUSIC_CONTROL_REQUEST + + LSR : !ADD.b #33 : STA.w MusicControlRequest .check_fallback - LDX !REG_MUSIC_CONTROL_REQUEST - LDA MusicShuffleTable-1,X : DEC : PHA + LDX.w MusicControlRequest + LDA.l MusicShuffleTable-1,X : DEC : PHA AND.b #$07 : TAY PLA : LSR #3 : TAX - LDA !REG_MSU_FALLBACK_TABLE,X : BEQ .secondary_fallback : CMP.b #$FF : BEQ .mute + LDA.w MSUFallbackTable,X : BEQ .secondary_fallback : CMP.b #$FF : BEQ .mute - : CPY #$00 : BEQ + LSR : DEY : BRA - @@ -300,49 +262,49 @@ CheckMusicLoadRequest: AND.b #$01 : BEQ .secondary_fallback .mute - LDA.b !VAL_COMMAND_MUTE_SPC + LDA.b #!VAL_COMMAND_MUTE_SPC BRA .load .secondary_fallback - LDX !REG_MUSIC_CONTROL_REQUEST : LDA MSUExtendedFallbackList-1,X + LDX.w MusicControlRequest : LDA.l MSUExtendedFallbackList-1,X PHX - TAX : LDA MusicShuffleTable-1,X + TAX : LDA.l MusicShuffleTable-1,X PLX - CMP !REG_MUSIC_CONTROL_REQUEST : BEQ .unmute + CMP.w MusicControlRequest : BEQ .unmute CPX #35 : !BLT + CPX #47 : !BLT .dungeon_fallback + - STA !REG_MUSIC_CONTROL_REQUEST + STA.w MusicControlRequest BRA .check_fallback .dungeon_fallback PHB : REP #$10 - LDX $040C + LDX.w DungeonID LDA.b #Music_Eastern>>16 : PHA : PLB ; Set bank to music pointers - LDY $00 : PHY + LDY.b Scrap00 : PHY REP #$20 - LDA MSUDungeonFallbackList,X : STA $00 + LDA.l MSUDungeonFallbackList,X : STA.b Scrap00 SEP #$20 - LDA ($00) - PLY : STY $00 : SEP #$10 : PLB - TAX : LDA MusicShuffleTable-1,X - STA !REG_MUSIC_CONTROL_REQUEST + LDA.b (Scrap00) + PLY : STY.b Scrap00 : SEP #$10 : PLB + TAX : LDA.l MusicShuffleTable-1,X + STA.w MusicControlRequest JMP .check_fallback .unmute - LDA.b !VAL_COMMAND_UNMUTE_SPC + LDA.b #!VAL_COMMAND_UNMUTE_SPC .load REP #$10 - STZ $4200 - - : STA !REG_SPC_CONTROL : CMP !REG_SPC_CONTROL : BNE - ; Wait until mute/unmute command is ACK'ed - - : STZ !REG_SPC_CONTROL : LDA !REG_SPC_CONTROL : BNE - ; Wait until mute/unmute command is completed - LDA.b #$81 : STA $4200 + STZ.w NMITIMEN + - : STA.w APUIO0 : CMP.w APUIO0 : BNE - ; Wait until mute/unmute command is ACK'ed + - : STZ.w APUIO0 : LDA.w APUIO0 : BNE - ; Wait until mute/unmute command is completed + LDA.b #$81 : STA.w NMITIMEN - LDA !REG_MUSIC_CONTROL_REQUEST : CMP.b #08 : BEQ .done+3 ; No SFX during warp track + LDA.w MusicControlRequest : CMP.b #08 : BEQ .done+3 ; No SFX during warp track - LDA $10 + LDA.b GameMode CMP.b #$07 : BEQ .sfx_indoors CMP.b #$0E : BEQ .sfx_indoors CMP.b #$09 : BNE .done @@ -351,30 +313,30 @@ CheckMusicLoadRequest: SEP #$10 LDX.b #$09 - LDA $8A ; Dark Death Mountain + LDA.b OverworldIndex ; Dark Death Mountain CMP.b #$43 : BEQ + : CMP.b #$45 : BEQ + : CMP.b #$47 : BEQ + LDX.b #$05 + CMP.b #$70 : BNE + ; Misery Mire - LDA OverworldEventDataWRAM+$70 : AND.b #$20 : BEQ .rain + LDA.l OverworldEventDataWRAM+$70 : AND.b #$20 : BEQ .rain + - LDA ProgressIndicator : CMP.b #$02 : BCS + + LDA.l ProgressIndicator : CMP.b #$02 : BCS + .rain LDX.b #$01 + - STX $012D + STX.w SFX1 REP #$10 .done - LDA !REG_MUSIC_CONTROL_REQUEST : STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST + LDA.w MusicControlRequest : STA.w MusicControl : STZ.w MusicControlRequest REP #$30 : PLY : PLX : PLA : PLD : PLB : PLP RTL .sfx_indoors - LDA !REG_MUSIC_CONTROL_REQUEST : STA !REG_MUSIC_CONTROL : STZ !REG_MUSIC_CONTROL_REQUEST - SEP #$20 : LDA.b #$05 : STA $012D + LDA.w MusicControlRequest : STA.w MusicControl : STZ.w MusicControlRequest + SEP #$20 : LDA.b #$05 : STA.w SFX1 REP #$30 : PLY : PLX : PLA : PLD : PLB : PLP JML Module_PreDungeon_setAmbientSfx ;-------------------------------------------------------------------------------- @@ -389,31 +351,31 @@ SpiralStairsPreCheck: LDA.l SpiralTable,X SEP #$10 : TAX : CPX.b #$07 : BNE .done ; check if hera boss JSL CheckHeraBossDefeated : BCS .done - LDX.b #$F1 : STX !REG_MUSIC_CONTROL_REQUEST + LDX.b #$F1 : STX.w MusicControlRequest BRA .done + REP #$20 ; thing we wrote over - LDA $A0 + LDA.b RoomIndex CMP.w #$000C : BNE + - LDA !REG_CURRENT_MSU_TRACK : AND.w #$00FF : CMP.w #59 : BNE .done + LDA.w CurrentMSUTrack : AND.w #$00FF : CMP.w #59 : BNE .done BRA .fade + CMP.w #$006B : BNE .done+2 - LDA TournamentSeed : CMP.w #$0001 : BEQ + - LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BNE .done - LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .done - LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .done + LDA.l TournamentSeed : CMP.w #$0001 : BEQ + + LDA.w MSUID : CMP.w #!VAL_MSU_ID_01 : BNE .done + LDA.w MSUID+2 : CMP.w #!VAL_MSU_ID_23 : BNE .done + LDA.w MSUID+4 : CMP.w #!VAL_MSU_ID_45 : BNE .done + - LDA BigKeyField : AND.w #$0004 : BEQ .done ; Check that we have the GT big key - LDA !REG_MSU_FALLBACK_TABLE+7 : AND.w #$0004 : BEQ .done ; Check that we have the extended track + LDA.l BigKeyField : AND.w #$0004 : BEQ .done ; Check that we have the GT big key + LDA.w MSUFallbackTable+7 : AND.w #$0004 : BEQ .done ; Check that we have the extended track .fade - LDX.b #$F1 : STX !REG_MUSIC_CONTROL_REQUEST + LDX.b #$F1 : STX.w MusicControlRequest .done - LDA $A0 ; thing we wrote over + LDA.b RoomIndex ; thing we wrote over RTL ;-------------------------------------------------------------------------------- @@ -422,27 +384,27 @@ SpiralStairsPreCheck: ;-------------------------------------------------------------------------------- SpiralStairsPostCheck: LDA.l DRMode : BEQ + ; if door rando enabled - LDA.b $A2 : CMP.w #$0007 : BNE .done - LDA.l Music_Hera : TAX : STX !REG_MUSIC_CONTROL_REQUEST + LDA.b PreviousRoom : CMP.w #$0007 : BNE .done + LDA.l Music_Hera : TAX : STX.w MusicControlRequest BRA .done - + LDA $A0 + + LDA.b RoomIndex CMP.w #$000C : BNE + ; Ganon's tower entrance - LDX $0130 : CPX.b #$F1 : BNE .done ; Check that we were fading out + LDX.w LastAPUCommand : CPX.b #$F1 : BNE .done ; Check that we were fading out - LDX #22 : STX !REG_MUSIC_CONTROL_REQUEST + LDX.b #22 : STX.w MusicControlRequest BRA .done + CMP.w #$006B : BNE .done ; Ganon's tower upstairs (with big key) - LDX $0130 : CPX.b #$F1 : BNE .done ; Check that we were fading out + LDX.w LastAPUCommand : CPX.b #$F1 : BNE .done ; Check that we were fading out - LDX #59 : STX !REG_MUSIC_CONTROL_REQUEST + LDX.b #59 : STX.w MusicControlRequest .done - LDX.b #$1C : LDA $A0 ; thing we wrote over + LDX.b #$1C : LDA.b RoomIndex ; thing we wrote over RTL ;-------------------------------------------------------------------------------- @@ -450,9 +412,9 @@ SpiralStairsPostCheck: ; Make sure expanded OST tracks load properly after death/fairy revival ;-------------------------------------------------------------------------------- StoreMusicOnDeath: - STA.l $7EC227 ; thing we wrote over - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done - LDA !REG_CURRENT_MSU_TRACK : STA.l $7EC227 + STA.l GameOverSongCache ; thing we wrote over + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done + LDA.w CurrentMSUTrack : STA.l GameOverSongCache .done RTL ;-------------------------------------------------------------------------------- @@ -463,19 +425,19 @@ StoreMusicOnDeath: MSUInit: PHP - LDA #$00 - STA !MSU_LOADED_TRACK - STA !MSU_RESUME_TRACK - STA !MSU_RESUME_TIME : STA !MSU_RESUME_TIME+1 : STA !MSU_RESUME_TIME+2 : STA !MSU_RESUME_TIME+3 - STA !MSU_RESUME_CONTROL + LDA.b #$00 + STA.w MSULoadedTrack + STA.w MSUResumeTrack + STA.w MSUResumeTime : STA.w MSUResumeTime+1 : STA.w MSUResumeTime+2 : STA.w MSUResumeTime+3 + STA.w MSUResumeControl - LDA NoBGM : BNE .done + LDA.l NoBGM : BNE .done REP #$20 - LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BNE .done - LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .done - LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .done + LDA.w MSUID : CMP.w #!VAL_MSU_ID_01 : BNE .done + LDA.w MSUID+2 : CMP.w #!VAL_MSU_ID_23 : BNE .done + LDA.w MSUID+4 : CMP.w #!VAL_MSU_ID_45 : BNE .done ; Count the number of available MSU-1 packs LDA.w #$0000 @@ -486,37 +448,37 @@ MSUInit: .check_pack TYA REP #$20 - STA !REG_MSU_TRACK + STA.w MSUTRACK !ADD.w #100 INX SEP #$20 TAY .wait_pack - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BNE .wait_pack - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BEQ .check_pack - TXA : STA !REG_MSU_PACK_COUNT + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_AUDIO_BUSY : BNE .wait_pack + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_TRACK_MISSING : BEQ .check_pack + TXA : STA.w MSUPackCount BRA + ; Check the current MSU-1 pack for tracks that require SPC fallback .check_fallback PHP : SEP #$10 - LDA NoBGM : BNE .done + LDA.l NoBGM : BNE .done + : LDA.b #64 LDX.b #7 LDY.b #7 .check_track - STA !REG_MSU_TRACK_LO - STZ !REG_MSU_TRACK_HI + STA.w MSUTRACK + STZ.w MSUTRACK+1 PHA CLC .wait_track - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BNE .wait_track - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE + + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_AUDIO_BUSY : BNE .wait_track + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_TRACK_MISSING : BNE + SEC + - LDA !REG_MSU_FALLBACK_TABLE,X : ROL : STA !REG_MSU_FALLBACK_TABLE,X + LDA.w MSUFallbackTable,X : ROL : STA.w MSUFallbackTable,X DEY : BPL .next_track DEX : BPL + @@ -537,32 +499,32 @@ MSUInit: ;-------------------------------------------------------------------------------- MSUStopPlaying: PHA : XBA : PHA - LDA !MSU_LOADED_TRACK + LDA.w MSULoadedTrack JSR IsResumableTrack : BCC + ; dont save if we already saved recently REP #$20 - LDA !MSU_RESUME_TRACK : AND #$00FF : BEQ ++ - LDA NMIFrames : !SUB !MSU_RESUME_TIME : PHA - LDA NMIFrames+2 : SBC !MSU_RESUME_TIME+2 : BNE +++ - PLA : CMP MSUResumeTimer : !BLT .too_early + LDA.w MSUResumeTrack : AND #$00FF : BEQ ++ + LDA.l NMIFrames : !SUB MSUResumeTime : PHA + LDA.l NMIFrames+2 : SBC MSUResumeTime+2 : BNE +++ + PLA : CMP.l MSUResumeTimer : !BLT .too_early BRA ++ +++ PLA ++ ; saving - LDA NMIFrames : STA !MSU_RESUME_TIME - LDA NMIFrames+2 : STA !MSU_RESUME_TIME+2 + LDA.l NMIFrames : STA.w MSUResumeTime + LDA.l NMIFrames+2 : STA.w MSUResumeTime+2 SEP #$20 - LDA !MSU_LOADED_TRACK : STA !MSU_RESUME_TRACK - LDA #$00 : STA !MSU_LOADED_TRACK ; dont take this path if we're calling again - LDA !FLAG_MSU_RESUME : STA !REG_MSU_CONTROL ; save this track's position + LDA.w MSULoadedTrack : STA.w MSUResumeTrack + LDA.b #$00 : STA.w MSULoadedTrack ; dont take this path if we're calling again + LDA.b #!FLAG_MSU_RESUME : STA.w MSUCTL ; save this track's position PLA : XBA : PLA RTS .too_early SEP #$20 + - LDA #$00 : STA !REG_MSU_CONTROL + LDA.b #$00 : STA.w MSUCTL PLA : XBA : PLA RTS ;-------------------------------------------------------------------------------- @@ -572,124 +534,124 @@ RTS ;-------------------------------------------------------------------------------- MSUMain: SEP #$20 ; set 8-BIT accumulator - LDA $4210 ; thing we wrote over + LDA.w RDNMI ; thing we wrote over REP #$20 ; set 16-BIT accumulator - LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BEQ .continue + LDA.w MSUID : CMP.w #!VAL_MSU_ID_01 : BEQ .continue .nomsu SEP #$30 - JML SPCContinue .continue - LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .nomsu - LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .nomsu + LDA.w MSUID+2 : CMP.w #!VAL_MSU_ID_23 : BNE .nomsu + LDA.w MSUID+4 : CMP.w #!VAL_MSU_ID_45 : BNE .nomsu SEP #$30 - LDX !REG_MUSIC_CONTROL : BEQ + + LDX.w MusicControl : BEQ + JMP .command_ff + - LDA !REG_MSU_DELAYED_COMMAND : BEQ .do_fade + LDA.w MSUDelayedCommand : BEQ .do_fade .check_busy - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_BUSY : BNE - + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_AUDIO_BUSY : BNE - .ready - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE - + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_TRACK_MISSING : BNE - .start - LDA !MSU_RESUME_CONTROL : BIT !FLAG_RESUME_CANCEL : BEQ + - EOR !FLAG_RESUME_CANCEL : STA !MSU_RESUME_CONTROL - REP #$20 : LDA !REG_MSU_LOADED_TRACK : STA !REG_MSU_TRACK : SEP #$20 + LDA.w MSUResumeControl : BIT.b #!FLAG_RESUME_CANCEL : BEQ + + EOR.b #!FLAG_RESUME_CANCEL : STA.w MSUResumeControl + REP #$20 : LDA.w MSULoadedTrack : STA.w MSUTRACK : SEP #$20 BRA - + - LDA !VAL_VOLUME_FULL - STA !REG_TARGET_VOLUME + LDA.b #!VAL_VOLUME_FULL + STA.w TargetVolume - LDA !MSU_RESUME_CONTROL : BIT !FLAG_RESUME_FADEIN : BEQ + - EOR !FLAG_RESUME_FADEIN : STA !MSU_RESUME_CONTROL - LDA #$00 + LDA.w MSUResumeControl : BIT.b #!FLAG_RESUME_FADEIN : BEQ + + EOR.b #!FLAG_RESUME_FADEIN : STA.w MSUResumeControl + LDA.b #$00 BRA ++ + - LDA !VAL_VOLUME_FULL + LDA.b #!VAL_VOLUME_FULL ++ - STA !REG_CURRENT_VOLUME - STA !REG_MSU_VOLUME + STA.w CurrentVolume + STA.w MSUVOL - LDA !REG_CURRENT_MSU_TRACK : DEC : PHA + LDA.w CurrentMSUTrack : DEC : PHA AND.b #$07 : TAY PLA : LSR #3 : TAX - LDA !REG_MSU_FALLBACK_TABLE,X : BEQ +++ : CMP.b #$FF : BEQ ++ + LDA.w MSUFallbackTable,X : BEQ +++ : CMP.b #$FF : BEQ ++ - : CPY #$00 : BEQ + LSR : DEY : BRA - + AND.b #$01 : BEQ +++ - ++ : LDA !REG_MSU_DELAYED_COMMAND - +++ : STA !REG_MSU_CONTROL + ++ : LDA.w MSUDelayedCommand + +++ : STA.w MSUCTL LDA.b #$00 - STA !REG_MSU_DELAYED_COMMAND + STA.w MSUDelayedCommand JML SPCContinue .do_fade: - LDA !REG_CURRENT_VOLUME : CMP !REG_TARGET_VOLUME : BNE + + LDA.w CurrentVolume : CMP.w TargetVolume : BNE + JML SPCContinue + : BCC .increment .decrement - SBC !VAL_VOLUME_DECREMENT : BCC .mute - CMP !REG_TARGET_VOLUME : !BGE .set - LDA !REG_TARGET_VOLUME : BRA .set + SBC.b #!VAL_VOLUME_DECREMENT : BCC .mute + CMP.w TargetVolume : !BGE .set + LDA.w TargetVolume : BRA .set .mute - STZ !REG_CURRENT_VOLUME + STZ.w CurrentVolume JSR MSUStopPlaying BRA .set .increment - ADC !VAL_VOLUME_INCREMENT : BCS .max - CMP !REG_TARGET_VOLUME : !BLT .set - LDA !REG_TARGET_VOLUME : BRA .set + ADC.b #!VAL_VOLUME_INCREMENT : BCS .max + CMP.w TargetVolume : !BLT .set + LDA.w TargetVolume : BRA .set .max - LDA !VAL_VOLUME_FULL + LDA.b #!VAL_VOLUME_FULL .set - STA !REG_CURRENT_VOLUME - STA !REG_MSU_VOLUME + STA.w CurrentVolume + STA.w MSUVOL JML SPCContinue .command_ff: - CPX !VAL_COMMAND_LOAD_NEW_BANK : BNE .command_f3 + CPX.b #!VAL_COMMAND_LOAD_NEW_BANK : BNE .command_f3 JML SPCContinue .command_f3: - CPX !VAL_COMMAND_FULL_VOLUME : BNE .command_f2 - LDA !VAL_VOLUME_FULL - STA !REG_TARGET_VOLUME + CPX.b #!VAL_COMMAND_FULL_VOLUME : BNE .command_f2 + LDA.b #!VAL_VOLUME_FULL + STA.w TargetVolume JML SPCContinue .command_f2: - CPX !VAL_COMMAND_FADE_HALF : BNE .command_f1 - LDA !VAL_VOLUME_HALF - STA !REG_TARGET_VOLUME + CPX.b #!VAL_COMMAND_FADE_HALF : BNE .command_f1 + LDA.b #!VAL_VOLUME_HALF + STA.w TargetVolume JML SPCContinue .command_f1: - CPX !VAL_COMMAND_FADE_OUT : BNE .command_f0 - STZ !REG_TARGET_VOLUME - STZ !REG_CURRENT_MSU_TRACK + CPX.b #!VAL_COMMAND_FADE_OUT : BNE .command_f0 + STZ.w TargetVolume + STZ.w CurrentMSUTrack JML SPCContinue .command_f0: - CPX !VAL_COMMAND_STOP_PLAYBACK : !BLT .load_track - CPX !VAL_COMMAND_MUTE_SPC : BEQ + ; Don't allow executing the mute/umute - CPX !VAL_COMMAND_UNMUTE_SPC : BNE ++ ; commands during NMI like this - + : LDA.b #$00 : STA !REG_MUSIC_CONTROL + CPX.b #!VAL_COMMAND_STOP_PLAYBACK : !BLT .load_track + CPX.b #!VAL_COMMAND_MUTE_SPC : BEQ + ; Don't allow executing the mute/umute + CPX.b #!VAL_COMMAND_UNMUTE_SPC : BNE ++ ; commands during NMI like this + + : LDA.b #$00 : STA.w MusicControl ++ : JML SPCContinue .load_track: - CPX !REG_CURRENT_MSU_TRACK : BNE + - - : CPX #27 : BEQ + + CPX.w CurrentMSUTrack : BNE + + - : CPX.b #27 : BEQ + TXA JMP .done+1 + - CPX !REG_CURRENT_COMMAND : BEQ - + CPX.w CurrentControlRequest : BEQ - LDA.b #$00 : XBA - LDA !REG_MSU_PACK_CURRENT : BEQ + - - : CMP !REG_MSU_PACK_COUNT : !BLT + - !SUB !REG_MSU_PACK_COUNT : BRA - + LDA.w MSUPackCurrent : BEQ + + - : CMP.w MSUPackCount : !BLT + + !SUB.w MSUPackCount : BRA - + JSR MSUStopPlaying @@ -701,62 +663,62 @@ MSUMain: !ADD.w #100 DEX : BNE - + - STA !REG_MSU_TRACK - STA !REG_MSU_LOADED_TRACK + STA.w MSUTRACK + STA.w MSULoadedTrack SEP #$20 PLX - TXA : CMP !MSU_RESUME_TRACK : BNE + ; dont resume if too late + TXA : CMP.w MSUResumeTrack : BNE + ; dont resume if too late REP #$20 - LDA NMIFrames : !SUB !MSU_RESUME_TIME : PHA - LDA NMIFrames+2 : SBC !MSU_RESUME_TIME+2 : BNE ++ - PLA : CMP MSUResumeTimer : !BGE +++ + LDA.l NMIFrames : !SUB MSUResumeTime : PHA + LDA.l NMIFrames+2 : SBC MSUResumeTime+2 : BNE ++ + PLA : CMP.l MSUResumeTimer : !BGE +++ SEP #$20 - LDA !FLAG_RESUME_FADEIN : BRA .done_resume + LDA.b #!FLAG_RESUME_FADEIN : BRA .done_resume ++ PLA +++ SEP #$20 - LDA !FLAG_RESUME_CANCEL + LDA.b #!FLAG_RESUME_CANCEL .done_resume: - STA !MSU_RESUME_CONTROL - LDA #$00 : STA !MSU_RESUME_TRACK + STA.w MSUResumeControl + LDA.b #$00 : STA.w MSUResumeTrack + CPX #07 : BNE + ; Kakariko Village - LDA $10 : CMP #$07 : BNE + + LDA.b GameMode : CMP #$07 : BNE + ; we're in link's house -> ignore - LDA #$00 + LDA.b #$00 BRA ++ + TXA ++ - STA !MSU_LOADED_TRACK - STX !REG_CURRENT_MSU_TRACK - LDA !REG_MSU_PACK_CURRENT : CMP #$FE : !BLT + - LDA #$00 : BRA ++ - + : LDA MSUTrackList-1,X - ++ : STA !REG_MSU_DELAYED_COMMAND - LDA MSUExtendedFallbackList-1,X + STA.w MSULoadedTrack + STX.w CurrentMSUTrack + LDA.w MSUPackCurrent : CMP #$FE : !BLT + + LDA.b #$00 : BRA ++ + + : LDA.l MSUTrackList-1,X + ++ : STA.w MSUDelayedCommand + LDA.l MSUExtendedFallbackList-1,X CMP.b #17 : BEQ + CMP.b #22 : BEQ + CMP.b #35 : !BLT .done CMP.b #47 : !BGE .done + : PHB : REP #$10 - LDX $040C + LDX.w DungeonID LDA.b #Music_Eastern>>16 : PHA : PLB ; Set bank to music pointers - LDY $00 : PHY + LDY.b Scrap00 : PHY REP #$20 - LDA MSUDungeonFallbackList,X : STA $00 + LDA.l MSUDungeonFallbackList,X : STA.b Scrap00 SEP #$20 - LDA ($00) - PLY : STY $00 : SEP #$10 : PLB + LDA.b (Scrap00) + PLY : STY.b Scrap00 : SEP #$10 : PLB .done - - : TAX : CMP MSUExtendedFallbackList-1,X : BEQ + - LDA MSUExtendedFallbackList-1,X : BRA - + - : TAX : CMP.l MSUExtendedFallbackList-1,X : BEQ + + LDA.l MSUExtendedFallbackList-1,X : BRA - + - STA !REG_MUSIC_CONTROL + STA.w MusicControl JML SPCContinue ;-------------------------------------------------------------------------------- @@ -765,12 +727,12 @@ MSUMain: ; Wait for the fanfare music to start, or else it can get skipped entirely ;-------------------------------------------------------------------------------- FanfarePreload: - STA.l !REG_MUSIC_CONTROL_REQUEST ; thing we wrote over + STA.w MusicControlRequest ; thing we wrote over PHA JSL CheckMusicLoadRequest WAI PLA - - : CMP.l !REG_SPC_CONTROL : BNE - + - : CMP.w APUIO0 : BNE - JML AddReceivedItem_doneWithSoundEffects ;-------------------------------------------------------------------------------- @@ -778,22 +740,22 @@ FanfarePreload: ; Wait for pendant fanfare to finish ;-------------------------------------------------------------------------------- PendantFanfareWait: - LDA TournamentSeed : BNE .spc - LDA FastFanfare : BNE .done + LDA.l TournamentSeed : BNE .spc + LDA.l FastFanfare : BNE .done REP #$20 - LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BNE .spc - LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .spc - LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .spc + LDA.w MSUID : CMP.w #!VAL_MSU_ID_01 : BNE .spc + LDA.w MSUID+2 : CMP.w #!VAL_MSU_ID_23 : BNE .spc + LDA.w MSUID+4 : CMP.w #!VAL_MSU_ID_45 : BNE .spc SEP #$20 - LDA !REG_MSU_PACK_CURRENT : CMP #$FE : !BGE .spc - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE .spc - LDA !REG_MSU_DELAYED_COMMAND : BNE .continue - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done + LDA.w MSUPackCurrent : CMP #$FE : !BGE .spc + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_TRACK_MISSING : BNE .spc + LDA.w MSUDelayedCommand : BNE .continue + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done .continue jml PendantFanfareContinue .spc SEP #$20 - LDA.l !REG_SPC_CONTROL : BNE .continue + LDA.l APUIO0 : BNE .continue .done jml PendantFanfareDone ;-------------------------------------------------------------------------------- @@ -802,32 +764,32 @@ PendantFanfareWait: ; Wait for crystal fanfare to finish ;-------------------------------------------------------------------------------- CrystalFanfareWait: - LDA TournamentSeed : BNE .spc - LDA FastFanfare : BNE .done + LDA.l TournamentSeed : BNE .spc + LDA.l FastFanfare : BNE .done REP #$20 - LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BNE .spc - LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .spc - LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .spc + LDA.w MSUID : CMP.w #!VAL_MSU_ID_01 : BNE .spc + LDA.w MSUID+2 : CMP.w #!VAL_MSU_ID_23 : BNE .spc + LDA.w MSUID+4 : CMP.w #!VAL_MSU_ID_45 : BNE .spc SEP #$20 - LDA !REG_MSU_PACK_CURRENT : CMP #$FE : !BGE .spc - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_TRACK_MISSING : BNE .spc - LDA !REG_MSU_DELAYED_COMMAND : BNE .continue - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done + LDA.w MSUPackCurrent : CMP.b #$FE : !BGE .spc + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_TRACK_MISSING : BNE .spc + LDA.w MSUDelayedCommand : BNE .continue + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_AUDIO_PLAYING : BEQ .done .continue jml CrystalFanfareContinue .spc SEP #$20 - LDA.l !REG_SPC_CONTROL : BNE .continue + LDA.l APUIO0 : BNE .continue .done - jml CrystalFanfareDone + JML CrystalFanfareDone ;-------------------------------------------------------------------------------- ;================================================================================ ; Delay input scanning on startup/S&Q to avoid hard-lock from button mashing ;-------------------------------------------------------------------------------- StartupWait: - LDA $11 : CMP.b #$04 : BCC .done ; thing we wrote over - LDA !REG_SPC_CONTROL : BEQ .done-1 + LDA.b GameSubMode : CMP.b #$04 : BCC .done ; thing we wrote over + LDA.w APUIO0 : BEQ .done-1 CMP.b #$01 : BEQ .done CLC .done @@ -839,13 +801,13 @@ StartupWait: ;-------------------------------------------------------------------------------- EndingMusicWait: REP #$20 - LDA !REG_MSU_ID_01 : CMP !VAL_MSU_ID_01 : BNE .done - LDA !REG_MSU_ID_23 : CMP !VAL_MSU_ID_23 : BNE .done - LDA !REG_MSU_ID_45 : CMP !VAL_MSU_ID_45 : BNE .done + LDA.w MSUID : CMP.w #!VAL_MSU_ID_01 : BNE .done + LDA.w MSUID+2 : CMP.w #!VAL_MSU_ID_23 : BNE .done + LDA.w MSUID+4 : CMP.w #!VAL_MSU_ID_45 : BNE .done SEP #$20 .wait - LDA.b $50 : BNE .done - LDA !REG_MSU_STATUS : BIT !FLAG_MSU_STATUS_AUDIO_PLAYING : BNE .wait + LDA.b LinkStrafe : BNE .done + LDA.w MSUSTATUS : BIT.b #!FLAG_MSU_STATUS_AUDIO_PLAYING : BNE .wait .done SEP #$20 LDA.b #$22 diff --git a/scratchpad.asm b/multi/multiworld.asm similarity index 100% rename from scratchpad.asm rename to multi/multiworld.asm diff --git a/multiworld.asm b/multiworld.asm index ba82d71..1b51038 100644 --- a/multiworld.asm +++ b/multiworld.asm @@ -14,9 +14,9 @@ PHX : PHY : PHP LDY LDA - AND #$00FF + AND.w #$00FF DEC - CMP #$00FF : !BGE .textdone + CMP.w #$00FF : !BGE .textdone ASL #5 TAX - @@ -29,15 +29,15 @@ PHX : PHY : PHP TYX - - CPX #$0040 : !BGE ++ - LDA #$007F + CPX.w #$0040 : !BGE ++ + LDA.w #$007F STA !MULTIWORLD_HUD_CHARACTER_DATA, X INX #2 BRA - ++ SEP #$20 - LDA #$01 : STA !NMI_MW+1 : STA !NMI_MW + LDA.b #$01 : STA !NMI_MW+1 : STA !NMI_MW LDA !MULTIWORLD_HUD_DELAY STA !MULTIWORLD_HUD_TIMER .textdone @@ -48,38 +48,38 @@ WriteText: { PHA : PHX : PHP SEP #$10 - LDX $4340 : PHX ; preserve DMA parameters - LDX $4341 : PHX ; preserve DMA parameters - LDX $4342 : PHX ; preserve DMA parameters - LDX $4343 : PHX ; preserve DMA parameters - LDX $4344 : PHX ; preserve DMA parameters - LDX $4345 : PHX ; preserve DMA parameters - LDX $4346 : PHX ; preserve DMA parameters - LDX $2115 : PHX ; preserve DMA parameters - LDX $2116 : PHX ; preserve DMA parameters - LDX $2117 : PHX ; preserve DMA parameters - LDX $2100 : PHX : LDX.b #$80 : STX $2100 ; save screen state & turn screen off + LDX.w $4340 : PHX ; preserve DMA parameters + LDX.w $4341 : PHX ; preserve DMA parameters + LDX.w $4342 : PHX ; preserve DMA parameters + LDX.w $4343 : PHX ; preserve DMA parameters + LDX.w $4344 : PHX ; preserve DMA parameters + LDX.w $4345 : PHX ; preserve DMA parameters + LDX.w $4346 : PHX ; preserve DMA parameters + LDX.w $2115 : PHX ; preserve DMA parameters + LDX.w $2116 : PHX ; preserve DMA parameters + LDX.w $2117 : PHX ; preserve DMA parameters + LDX.w $2100 : PHX : LDX.b #$80 : STX.w $2100 ; save screen state & turn screen off REP #$20 - LDX #$80 : STX $2115 - LDA #$6000+$0340 : STA $2116 - LDA.w #!MULTIWORLD_HUD_CHARACTER_DATA : STA $4342 - LDX.b #!MULTIWORLD_HUD_CHARACTER_DATA>>16 : STX $4344 - LDA #$0040 : STA $4345 - LDA #$1801 : STA $4340 - LDX #$10 : STX $420B + LDX.b #$80 : STX.w $2115 + LDA.w #$6000+$0340 : STA.w $2116 + LDA.w #!MULTIWORLD_HUD_CHARACTER_DATA : STA.w $4342 + LDX.b #!MULTIWORLD_HUD_CHARACTER_DATA>>16 : STX.w $4344 + LDA.w #$0040 : STA.w $4345 + LDA.w #$1801 : STA.w $4340 + LDX.b #$10 : STX.w $420B - PLX : STX $2100 ; put screen back however it was before - PLX : STX $2117 ; restore DMA parameters - PLX : STX $2116 ; restore DMA parameters - PLX : STX $2115 ; restore DMA parameters - PLX : STX $4346 ; restore DMA parameters - PLX : STX $4345 ; restore DMA parameters - PLX : STX $4344 ; restore DMA parameters - PLX : STX $4343 ; restore DMA parameters - PLX : STX $4342 ; restore DMA parameters - PLX : STX $4341 ; restore DMA parameters - PLX : STX $4340 ; restore DMA parameters + PLX : STX.w $2100 ; put screen back however it was before + PLX : STX.w $2117 ; restore DMA parameters + PLX : STX.w $2116 ; restore DMA parameters + PLX : STX.w $2115 ; restore DMA parameters + PLX : STX.w $4346 ; restore DMA parameters + PLX : STX.w $4345 ; restore DMA parameters + PLX : STX.w $4344 ; restore DMA parameters + PLX : STX.w $4343 ; restore DMA parameters + PLX : STX.w $4342 ; restore DMA parameters + PLX : STX.w $4341 ; restore DMA parameters + PLX : STX.w $4340 ; restore DMA parameters PLP : PLX : PLA RTL } @@ -92,34 +92,34 @@ GetMultiworldItem: BRL .return + - LDA $10 - CMP #$07 : BEQ + - CMP #$09 : BEQ + - CMP #$0B : BEQ + + LDA.b GameMode + CMP.b #$07 : BEQ + + CMP.b #$09 : BEQ + + CMP.b #$0B : BEQ + BRL .return + LDA !MULTIWORLD_HUD_TIMER : BEQ .textend - DEC #$01 : STA !MULTIWORLD_HUD_TIMER - CMP #$00 : BNE .textend + DEC : STA !MULTIWORLD_HUD_TIMER + CMP.b #$00 : BNE .textend ; Clear text PHP : REP #$30 - LDX #$0000 + LDX.w #$0000 - - CPX #$0040 : !BGE ++ - LDA #$007F + CPX.w #$0040 : !BGE ++ + LDA.w #$007F STA !MULTIWORLD_HUD_CHARACTER_DATA, X INX #2 BRA - ++ PLP - LDA #$01 : STA !NMI_MW+1 : STA !NMI_MW + LDA.b #$01 : STA !NMI_MW+1 : STA !NMI_MW .textend - LDA $5D - CMP #$00 : BEQ + - CMP #$04 : BEQ + - CMP #$17 : BEQ + + LDA.b LinkState + CMP.b #$00 : BEQ + + CMP.b #$04 : BEQ + + CMP.b #$17 : BEQ + BRL .return + @@ -128,8 +128,8 @@ GetMultiworldItem: + PHA - LDA #$22 - LDY #$04 + LDA.b #$22 + LDY.b #$04 JSL Ancilla_CheckForAvailableSlot : BPL + PLA BRL .return @@ -137,55 +137,55 @@ GetMultiworldItem: PLA ; Check if we have a key for the dungeon we are currently in - LDX $040C + LDX.w DungeonID ; Escape - CMP #$A0 : BNE + : CPX #$00 : BEQ ++ : CPX #$02 : BEQ ++ : BRL .keyend : ++ : BRL .thisdungeon : + + CMP.b #$A0 : BNE + : CPX.b #$00 : BEQ ++ : CPX.b #$02 : BEQ ++ : BRL .keyend : ++ : BRL .thisdungeon : + ; Eastern - CMP #$A2 : BNE + : CPX #$04 : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$A2 : BNE + : CPX.b #$04 : BEQ .thisdungeon : BRA .keyend : + ; Desert - CMP #$A3 : BNE + : CPX #$06 : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$A3 : BNE + : CPX.b #$06 : BEQ .thisdungeon : BRA .keyend : + ; Hera - CMP #$AA : BNE + : CPX #$14 : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$AA : BNE + : CPX.b #$14 : BEQ .thisdungeon : BRA .keyend : + ; Aga - CMP #$A4 : BNE + : CPX #$08 : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$A4 : BNE + : CPX.b #$08 : BEQ .thisdungeon : BRA .keyend : + ; PoD - CMP #$A6 : BNE + : CPX #$0C : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$A6 : BNE + : CPX.b #$0C : BEQ .thisdungeon : BRA .keyend : + ; Swamp - CMP #$A5 : BNE + : CPX #$0A : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$A5 : BNE + : CPX.b #$0A : BEQ .thisdungeon : BRA .keyend : + ; SW - CMP #$A8 : BNE + : CPX #$10 : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$A8 : BNE + : CPX.b #$10 : BEQ .thisdungeon : BRA .keyend : + ; TT - CMP #$AB : BNE + : CPX #$16 : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$AB : BNE + : CPX.b #$16 : BEQ .thisdungeon : BRA .keyend : + ; Ice - CMP #$A9 : BNE + : CPX #$12 : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$A9 : BNE + : CPX.b #$12 : BEQ .thisdungeon : BRA .keyend : + ; Mire - CMP #$A7 : BNE + : CPX #$0E : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$A7 : BNE + : CPX.b #$0E : BEQ .thisdungeon : BRA .keyend : + ; TR - CMP #$AC : BNE + : CPX #$18 : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$AC : BNE + : CPX.b #$18 : BEQ .thisdungeon : BRA .keyend : + ; GT - CMP #$AD : BNE + : CPX #$1A : BEQ .thisdungeon : BRA .keyend : + + CMP.b #$AD : BNE + : CPX.b #$1A : BEQ .thisdungeon : BRA .keyend : + ; GT BK - CMP #$92 : BNE .keyend : CPX #$1A : BNE .keyend : LDA #$32 : BRA .keyend + CMP.b #$92 : BNE .keyend : CPX.b #$1A : BNE .keyend : LDA.b #$32 : BRA .keyend .thisdungeon - LDA #$24 + LDA.b #$24 .keyend - STA $02D8 ;Set Item to receive + STA.w ItemReceiptID ;Set Item to receive TAY - LDA #$01 : STA !MULTIWORLD_RECEIVING_ITEM - LDA #$00 : STA !MULTIWORLD_ITEM_PLAYER_ID + LDA.b #$01 : STA !MULTIWORLD_RECEIVING_ITEM + LDA.b #$00 : STA !MULTIWORLD_ITEM_PLAYER_ID - STZ $02E9 - JSL.l $0791B3 ; Player_HaltDashAttackLong + STZ.w ItemReceiptMethod + JSL Player_HaltDashAttackLong JSL Link_ReceiveItem - LDA #$00 : STA !MULTIWORLD_ITEM : STA !MULTIWORLD_RECEIVING_ITEM + LDA.b #$00 : STA !MULTIWORLD_ITEM : STA !MULTIWORLD_RECEIVING_ITEM %Print_Text(HUD_ReceivedFrom, #$001C, !MULTIWORLD_ITEM_FROM) .return PLP - LDA $5D : ASL A : TAX + LDA.b LinkState : ASL A : TAX RTL } @@ -249,40 +249,40 @@ RTL Multiworld_AddReceivedItem_notCrystal: { - TYA : STA $02E4 : PHX ; things we wrote over + TYA : STA.w CutsceneFlag : PHX ; things we wrote over LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ + - PHY : LDY $02D8 : JSL AddInventory : PLY + PHY : LDY.w ItemReceiptID : JSL AddInventory : PLY %Print_Text(HUD_SentTo, #$0010, !MULTIWORLD_ITEM_PLAYER_ID) - LDA #$33 : STA $012F + LDA.b #$33 : STA.w SFX3 - JML.l AddReceivedItem_gfxHandling + JML AddReceivedItem_gfxHandling + - JML.l AddReceivedItem_notCrystal+5 + JML AddReceivedItem_notCrystal+5 } Multiworld_Ancilla_ReceiveItem_stillInMotion: { CMP.b #$28 : BNE + ; thing we wrote over LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE + - JML.l Ancilla_ReceiveItem_stillInMotion_moveon + JML Ancilla_ReceiveItem_stillInMotion_moveon + - JML.l Ancilla_ReceiveItem_dontGiveRupees + JML Ancilla_ReceiveItem_dontGiveRupees } Multiworld_ConsumingFire_TransmuteToSkullWoodsFire: { - LDA $8A : AND.b #$40 : BEQ .failed ; things we wrote over - LDA $0C4A : CMP #$22 : BEQ .failed - LDA $0C4B : CMP #$22 : BEQ .failed - LDA $0C4C : CMP #$22 : BEQ .failed - LDA $0C4D : CMP #$22 : BEQ .failed - LDA $0C4E : CMP #$22 : BEQ .failed - LDA $0C4F : CMP #$22 : BEQ .failed + LDA.b OverworldIndex : AND.b #$40 : BEQ .failed ; things we wrote over + LDA.w AncillaID : CMP.b #$22 : BEQ .failed + LDA.w AncillaID+1 : CMP.b #$22 : BEQ .failed + LDA.w AncillaID+2 : CMP.b #$22 : BEQ .failed + LDA.w AncillaID+3 : CMP.b #$22 : BEQ .failed + LDA.w AncillaID+4 : CMP.b #$22 : BEQ .failed + LDA.w AncillaID+5 : CMP.b #$22 : BEQ .failed - JML.l ConsumingFire_TransmuteToSkullWoodsFire_continue + JML ConsumingFire_TransmuteToSkullWoodsFire_continue .failed - JML.l AddDoorDebris_spawn_failed + JML AddDoorDebris_spawn_failed } diff --git a/music.asm b/music.asm index c68e388..b06ef78 100644 --- a/music.asm +++ b/music.asm @@ -3,38 +3,35 @@ PreOverworld_LoadProperties_ChooseMusic: ; A: scratch space (value never used) ; Y: set to overworld animated tileset ; X: set to music track/command id - JSL.l FixFrogSmith ; Just a convenient spot to install this hook + JSL FixFrogSmith ; Just a convenient spot to install this hook LDY.b #$58 ; death mountain animated tileset. - LDA $8A : ORA #$40 ; check both light and dark world DM at the same time + LDA.b OverworldIndex : ORA.b #$40 ; check both light and dark world DM at the same time CMP.b #$43 : BEQ + CMP.b #$45 : BEQ + CMP.b #$47 : BEQ + + LDY.b #$5A ; Main overworld animated tileset - LDY.b #$5A ; Main overworld animated tileset - - ; if we are in the light world go ahead and set chosen selection - ;LDA CurrentWorld : BEQ .checkInverted+4 + JSL Overworld_DetermineMusic .lastCheck - LDA $0132 : CMP.b #$F2 : BNE + - CPX $0130 : BNE + - ; If the last played command ($0132) was half volume (#$F2) - ; and the actual song playing ($0130) is same as the one for this area (X) + LDA.w MusicControlQueue : CMP.b #$F2 : BNE + + CPX.w LastAPUCommand : BNE + + ; If the last played command (MusicControlQueue) was half volume (#$F2) + ; and the actual song playing (LastAPUCommand) is same as the one for this area (X) ; then play the full volume command (#F3) instead of restarting the song LDX.b #$F3 + - JML.l PreOverworld_LoadProperties_SetSong + JML PreOverworld_LoadProperties_SetSong ;-------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------- Overworld_FinishMirrorWarp: REP #$20 - LDA.w #$2641 : STA $4370 + LDA.w #$2641 : STA.w DMAP7 LDX.b #$3E @@ -42,33 +39,32 @@ Overworld_FinishMirrorWarp: .clear_hdma_table - STA $1B00, X : STA $1B40, X - STA $1B80, X : STA $1BC0, X - STA $1C00, X : STA $1C40, X - STA $1C80, X + STA.w IrisPtr+$0000, X : STA.w IrisPtr+$0040, X + STA.w IrisPtr+$0080, X : STA.w IrisPtr+$00C0, X + STA.w IrisPtr+$0100, X : STA.w IrisPtr+$0140, X + STA.w IrisPtr+$0180, X DEX #2 : BPL .clear_hdma_table - - LDA.w #$0000 : STA $7EC007 : STA $7EC009 + LDA.w #$0000 : STA.l FadeTimer : STA.l FadeDirection SEP #$20 - JSL $00D7C8 ; $57C8 IN ROM + JSL ReloadPreviouslyLoadedSheets - LDA.b #$80 : STA $9B + LDA.b #$80 : STA.b HDMAENQ JSL Overworld_DetermineAmbientSFX JSL Overworld_DetermineMusic .done - STX $012C + STX.w MusicControlRequest - LDA $11 : STA $010C + LDA.b GameSubMode : STA.w GameSubModeCache - STZ $11 - STZ $B0 - STZ $0200 - STZ $0710 + STZ.b GameSubMode + STZ.b SubSubModule + STZ.w SubModuleInterface + STZ.w SkipOAM RTL ;-------------------------------------------------------------------------------- @@ -84,21 +80,21 @@ BirdTravel_LoadTargetAreaMusic: ;-------------------------------------------------------------------------------- ;X to be set to music track to load Overworld_DetermineMusic: - LDA ProgressIndicator : CMP.b #$02 : !BGE + + LDA.l ProgressIndicator : CMP.b #$02 : !BGE + LDX.b #$03 ; If phase < 2, play the rain music BRA .done - + LDA $8A : CMP.b #$43 : BEQ .darkMountain + + LDA.b OverworldIndex : CMP.b #$43 : BEQ .darkMountain CMP.b #$45 : BEQ .darkMountain CMP.b #$47 : BEQ .darkMountain LDX.b #$02 ; hyrule field theme - LDA CurrentWorld : BEQ + + LDA.l CurrentWorld : BEQ + LDX.b #$09 ; default dark world theme ; Check if we're entering the village - + LDA $8A : CMP.b #$18 : BNE + + + LDA.b OverworldIndex : CMP.b #$18 : BNE + ; Check what phase we're in ; LDA ProgressIndicator : CMP.b #$03 : !BGE .bunny LDX.b #$07 ; Default village theme (phase <3) @@ -106,12 +102,12 @@ Overworld_DetermineMusic: ; Check if we're entering the lost woods + CMP.b #$00 : BNE + - LDA OverworldEventDataWRAM+$80 : AND.b #$40 : BNE .bunny + LDA.l OverworldEventDataWRAM+$80 : AND.b #$40 : BNE .bunny LDX.b #$05 ; lost woods theme BRA .bunny + CMP.b #$40 : BNE .bunny - LDX #$0F ; dark woods theme + LDX.b #$0F ; dark woods theme BRA .bunny .darkMountain @@ -119,9 +115,9 @@ Overworld_DetermineMusic: .bunny ; if not inverted and light world, or inverted and dark world, skip moon pearl check - LDA CurrentWorld : CLC : ROL #$03 : CMP InvertedMode : BEQ .done - LDA MoonPearlEquipment : BNE .done - LDX #$04 ; bunny theme + LDA.l CurrentWorld : CLC : ROL #$03 : CMP.l InvertedMode : BEQ .done + LDA.l MoonPearlEquipment : BNE .done + LDX.b #$04 ; bunny theme .done RTL @@ -130,10 +126,10 @@ Overworld_DetermineMusic: ;-------------------------------------------------------------------------------- ;$012D to be set to any ambient SFX for the area Overworld_DetermineAmbientSFX: - LDA ProgressIndicator : CMP.b #$02 : !BGE + + LDA.l ProgressIndicator : CMP.b #$02 : !BGE + BRA .done ; rain state sfx handled elsewhere - + LDA $8A : CMP.b #$43 : BEQ .darkMountain + + LDA.b OverworldIndex : CMP.b #$43 : BEQ .darkMountain CMP.b #$45 : BEQ .darkMountain CMP.b #$47 : BEQ .darkMountain @@ -149,9 +145,9 @@ Overworld_DetermineAmbientSFX: LDA.b #$09 : BRA .setSfx ; set storm ambient SFX .setSfx - CMP $0131 : BEQ + - STA $012D - + STZ $012D + CMP.w LastSFX1 : BEQ + + STA.w SFX1 + + STZ.w SFX1 .done RTL @@ -161,8 +157,8 @@ Overworld_DetermineAmbientSFX: ;0 = Is Kakariko Overworld ;1 = Not Kakariko Overworld PsychoSolder_MusicCheck: - LDA $040A : CMP.b #$18 : BNE .done ; thing we overwrote - check if overworld location is Kakariko - LDA $1B ; Also check that we are outdoors + LDA.b OverworldIndex : CMP.b #$18 : BNE .done ; thing we overwrote - check if overworld location is Kakariko + LDA.b IndoorsFlag ; Also check that we are outdoors .done RTL ;-------------------------------------------------------------------------------- @@ -173,16 +169,16 @@ RTL ; ; On entry, A = $8A (overworld area being loaded) Overworld_MosaicDarkWorldChecks: - CMP.b #$40 : beq .checkCrystals - CMP.b #$42 : beq .checkCrystals - CMP.b #$50 : beq .checkCrystals - CMP.b #$51 : bne .doFade + CMP.b #$40 : BEQ .checkCrystals + CMP.b #$42 : BEQ .checkCrystals + CMP.b #$50 : BEQ .checkCrystals + CMP.b #$51 : BNE .doFade .checkCrystals - LDA CrystalsField : CMP.b #$7F : BEQ .done + LDA.l CrystalsField : CMP.b #$7F : BEQ .done .doFade - LDA.b #$F1 : STA $012C ; thing we wrote over, fade out music + LDA.b #$F1 : STA.w MusicControlRequest ; thing we wrote over, fade out music .done RTL @@ -198,13 +194,13 @@ Underworld_DoorDown_Entry: LDA.l DRMode : BNE .done .vanilla ; thing we wrote over - LDA $A0 : CMP.w #$0012 : BNE + + LDA.b RoomIndex : CMP.w #$0012 : BNE + LDX.b #$14 ; value for Sanc music BRA .done - + LDA $A2 : CMP.w #$0012 : BNE .done + + LDA.b PreviousRoom : CMP.w #$0012 : BNE .done LDX.b #$10 ; value for Hyrule Castle music .done - LDA $A0 : RTL + LDA.b RoomIndex : RTL ;-------------------------------------------------------------------------------- ; This is for changing to/from ToH dungeon/boss music ; @@ -217,6 +213,7 @@ LDA RoomDataWRAM[$07].high : AND.w #$00FF : BEQ + FallingMusicFadeOut: CMP.w #$0017 ; what we wrote over BNE .return - LDA.w $0130 : AND.w #$00FF : CMP.w #$0015 ; if boss music is playing, then fade out + LDA.w LastAPUCommand : AND.w #$00FF : CMP.w #$0015 ; if boss music is playing, then fade out .return RTL +;-------------------------------------------------------------------------------- diff --git a/musicvolumes.asm b/musicvolumes.asm index c046558..7cb61de 100644 --- a/musicvolumes.asm +++ b/musicvolumes.asm @@ -26,1184 +26,1184 @@ ;== File select == org $1A9D28 ; <- D1D28 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1A9D41 ; <- D1D41 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1A9D5C ; <- D1D5C . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1A9D77 ; <- D1D77 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1A9D92 ; <- D1D92 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1A9DBD ; <- D1DBD . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1A9DEB ; <- D1DEB . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;org $1A9EEE ; <- D1EEE . (silent track) -;db !VOLUME_8C ; $8C +;db #!VOLUME_8C ; $8C ;== Title Theme (Triforce jingle) == org $1A9F5D ; <- D1F5D . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1A9F9F ; <- D1F9F . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1A9FBD ; <- D1FBD . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1A9FDC ; <- D1FDC . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1A9FEA ; <- D1FEA . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Light World == org $1AA047 ; <- D2047 . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1AA085 ; <- D2085 . -db !VOLUME_FF ; $FF +db #!VOLUME_FF ; $FF org $1AA0CA ; <- D20CA . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AA10A ; <- D210A . -db !VOLUME_E6 ; $E6 +db #!VOLUME_E6 ; $E6 org $1AA13F ; <- D213F . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AA174 ; <- D2174 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AA1BB ; <- D21BB . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AA1C5 ; <- D21C5 . -db !VOLUME_FF ; $FF +db #!VOLUME_FF ; $FF org $1AA1CD ; <- D21CD . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AA279 ; <- D2279 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AA29E ; <- D229E . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AA2C9 ; <- D22C9 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AA2DC ; <- D22DC . -db !VOLUME_E6 ; $E6 +db #!VOLUME_E6 ; $E6 org $1AA349 ; <- D2349 . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1AA426 ; <- D2426 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AA447 ; <- D2447 . -db !VOLUME_E6 ; $E6 +db #!VOLUME_E6 ; $E6 org $1AA49C ; <- D249C . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AA4C2 ; <- D24C2 . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1AA4CD ; <- D24CD . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AA4EC ; <- D24EC . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1AA5A4 ; <- D25A4 . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1AA754 ; <- D2754 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Escape == org $1AA84C ; <- D284C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AA866 ; <- D2866 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AA887 ; <- D2887 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AA8A0 ; <- D28A0 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AA8BA ; <- D28BA . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AA8DB ; <- D28DB . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AA8F4 ; <- D28F4 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AA93E ; <- D293E . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AAB88 ; <- D2B88 . -db !VOLUME_D2 ; $D2 +db #!VOLUME_D2 ; $D2 ;== Bunny == org $1AABF3 ; <- D2BF3 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AAC09 ; <- D2C09 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AAC1F ; <- D2C1F . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AAC53 ; <- D2C53 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AAC69 ; <- D2C69 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;org $1AACA1 ; <- D2CA1 . (silent track) -;db !VOLUME_C8 ; $C8 +;db #!VOLUME_C8 ; $C8 org $1AACAF ; <- D2CAF . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AACC5 ; <- D2CC5 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AACEB ; <- D2CEB . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AAD05 ; <- D2D05 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AAD73 ; <- D2D73 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AAD91 ; <- D2D91 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AADAF ; <- D2DAF . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Lost Woods == org $1AAE3D ; <- D2E3D . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AAE66 ; <- D2E66 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AAE70 ; <- D2E70 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AAEAB ; <- D2EAB . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AAEE6 ; <- D2EE6 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AAF00 ; <- D2F00 . -db !VOLUME_82 ; $82 +db #!VOLUME_82 ; $82 org $1AAF36 ; <- D2F36 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AAF46 ; <- D2F46 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AAF6F ; <- D2F6F . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;org $1AAFCF ; <- D2FCF . (unused track) -;db !VOLUME_C8 ; $C8 +;db #!VOLUME_C8 ; $C8 ;org $1AAFDF ; <- D2FDF . (unused track) -;db !VOLUME_C8 ; $C8 +;db #!VOLUME_C8 ; $C8 ;org $1AB02B ; <- D302B . (unused track) -;db !VOLUME_C8 ; $C8 +;db #!VOLUME_C8 ; $C8 org $1AB086 ; <- D3086 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB099 ; <- D3099 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB0A5 ; <- D30A5 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB0CD ; <- D30CD . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB0F6 ; <- D30F6 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB11D ; <- D311D . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1AB154 ; <- D3154 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB184 ; <- D3184 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB1D1 ; <- D31D1 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C ;== Episode III - A Link to the Past randomizer == org $1AB33A ; <- D333A . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB3D9 ; <- D33D9 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB49F ; <- D349F . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB54A ; <- D354A . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB5E5 ; <- D35E5 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB624 ; <- D3624 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB63C ; <- D363C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB64A ; <- D364A . -db !VOLUME_D2 ; $D2 +db #!VOLUME_D2 ; $D2 org $1AB672 ; <- D3672 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB691 ; <- D3691 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB69F ; <- D369F . -db !VOLUME_D2 ; $D2 +db #!VOLUME_D2 ; $D2 org $1AB6B4 ; <- D36B4 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB6C6 ; <- D36C6 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB724 ; <- D3724 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;org $1AB73B ; <- D373B . (muted track) -;db !VOLUME_00 ; $00 +;db #!VOLUME_00 ; $00 org $1AB747 ; <- D3747 . -db !VOLUME_D2 ; $D2 +db #!VOLUME_D2 ; $D2 ;org $1AB75B ; <- D375B . (muted track) -;db !VOLUME_00 ; $00 +;db #!VOLUME_00 ; $00 org $1AB767 ; <- D3767 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Kakariko == org $1AB8CB ; <- D38CB . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AB8ED ; <- D38ED . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1ABB1D ; <- D3B1D . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABB2F ; <- D3B2F . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABB55 ; <- D3B55 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABB70 ; <- D3B70 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABB81 ; <- D3B81 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABB97 ; <- D3B97 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ABBAC ; <- D3BAC . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ABBBF ; <- D3BBF . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABBE8 ; <- D3BE8 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ABC0D ; <- D3C0D . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ABC39 ; <- D3C39 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ABC68 ; <- D3C68 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ABC91 ; <- D3C91 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1ABC9F ; <- D3C9F . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ABCBC ; <- D3CBC . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ABCD3 ; <- D3CD3 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1ABCE8 ; <- D3CE8 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 ;== Mirror Sounds == org $1ABD34 ; <- D3D34 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABD55 ; <- D3D55 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABD6E ; <- D3D6E . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABDAA ; <- D3DAA . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1ABDC6 ; <- D3DC6 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABE04 ; <- D3E04 . (this track sounds awesome on its own) -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABE38 ; <- D3E38 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Dark World == org $1ABF0C ; <- D3F0C . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1ABF45 ; <- D3F45 . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1ABF65 ; <- D3F65 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ABF82 ; <- D3F82 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1ABFA6 ; <- D3FA6 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC01E ; <- D401E . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AC04F ; <- D404F . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC05F ; <- D405F . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC087 ; <- D4087 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC139 ; <- D4139 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC148 ; <- D4148 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1AC17A ; <- D417A . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC198 ; <- D4198 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC1A0 ; <- D41A0 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC1D5 ; <- D41D5 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC1F6 ; <- D41F6 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC22B ; <- D422B . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC25C ; <- D425C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC270 ; <- D4270 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC290 ; <- D4290 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AC2B1 ; <- D42B1 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC2EB ; <- D42EB . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1AC306 ; <- D4306 (Volume fade) . -db !VOLUME_5A ; $5A +db #!VOLUME_5A ; $5A org $1AC319 ; <- D4319 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC334 ; <- D4334 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC33C ; <- D433C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC371 ; <- D4371 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC3A6 ; <- D43A6 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC3DB ; <- D43DB . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC3EF ; <- D43EF . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC40C ; <- D440C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC41E ; <- D441E . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC43E ; <- D443E . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AC452 ; <- D4452 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC494 ; <- D4494 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC4B5 ; <- D44B5 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC512 ; <- D4512 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC56F ; <- D456F . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AC597 ; <- D4597 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AC5D1 ; <- D45D1 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC5EF ; <- D45EF . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC682 ; <- D4682 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC6C3 ; <- D46C3 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Getting Master Sword == org $1AC731 ; <- D4731 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AC753 ; <- D4753 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AC774 ; <- D4774 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AC795 ; <- D4795 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AC7B6 ; <- D47B6 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AC7D3 ; <- D47D3 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 ;== Hostile Kakariko Guards == org $1AC83C ; <- D483C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC848 ; <- D4848 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC855 ; <- D4855 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC862 ; <- D4862 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC86F ; <- D486F . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC87C ; <- D487C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AC8B9 ; <- D48B9 . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1AC8FF ; <- D48FF . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 ;== Title theme (after triforce jingle) == org $1ACA1C ; <- D4A1C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ACA3B ; <- D4A3B . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ACA60 ; <- D4A60 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ACAA5 ; <- D4AA5 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1ACAE4 ; <- D4AE4 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1ACB27 ; <- D4B27 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ACB3C ; <- D4B3C . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1ACB96 ; <- D4B96 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1ACBAB ; <- D4BAB . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1ACC03 ; <- D4C03 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1ACC53 ; <- D4C53 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1ACC7A ; <- D4C7A . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ACC7F ; <- D4C7F . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1ACCA5 ; <- D4CA5 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC ;== Skull Woods == org $1ACD12 ; <- D4D12 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ACD43 ; <- D4D43 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ACD81 ; <- D4D81 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ACD9C ; <- D4D9C . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1ACDCC ; <- D4DCC . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ACE90 ; <- D4E90 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ACEBA ; <- D4EBA . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ACED6 ; <- D4ED6 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ACEE2 ; <- D4EE2 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ACF0B ; <- D4F0B . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ACFE5 ; <- D4FE5 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AD005 ; <- D5005 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD012 ; <- D5012 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AD02E ; <- D502E . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD03C ; <- D503C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD081 ; <- D5081 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Minigame == org $1AD1A8 ; <- D51A8 . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1AD1B1 ; <- D51B1 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD1C7 ; <- D51C7 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD1CF ; <- D51CF . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD1E6 ; <- D51E6 . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1AD1EF ; <- D51EF . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD20C ; <- D520C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD214 ; <- D5214 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD231 ; <- D5231 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD24E ; <- D524E . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1AD257 ; <- D5257 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD26D ; <- D526D . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD275 ; <- D5275 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD29E ; <- D529E . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1AD2AF ; <- D52AF . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD2BD ; <- D52BD . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD2CD ; <- D52CD . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD2DB ; <- D52DB . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Triforce Chamber == org $1AD424 ; <- D5424 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AD43F ; <- D543F . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1AD477 ; <- D5477 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AD49C ; <- D549C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD4BC ; <- D54BC . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AD4D5 ; <- D54D5 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AD4F0 ; <- D54F0 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AD509 ; <- D5509 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AD543 ; <- D5543 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C ;== Credits fuck it i'm not testing this, they look right though. === org $1AD7D8 ; <- D57D8 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AD801 ; <- D5801 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD817 ; <- D5817 . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1AD8A4 ; <- D58A4 -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AD954 ; <- D5954 -db !VOLUME_3C ; $3C +db #!VOLUME_3C ; $3C org $1AD957 ; <- D5957 (Volume fade) -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1AD9B9 ; <- D59B9 -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ADA2F ; <- D5A2F (maybe a silent track?) -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ADA3D ; <- D5A3D -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1ADA4D ; <- D5A4D -db !VOLUME_E6 ; $E6 +db #!VOLUME_E6 ; $E6 org $1ADA68 ; <- D5A68 -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ADA7F ; <- D5A7F -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ADACB ; <- D5ACB -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1ADAE8 ; <- D5AE8 -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1ADAEB ; <- D5AEB (Volume fade) -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ADB47 ; <- D5B47 -db !VOLUME_50 ; $50 +db #!VOLUME_50 ; $50 org $1ADB4A ; <- D5B4A (Volume fade) -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1ADB5E ; <- D5B5E -db !VOLUME_50 ; $50 +db #!VOLUME_50 ; $50 org $1ADB6F ; <- D5B6F (Volume fade) -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1ADC12 ; <- D5C12 -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ADD71 ; <- D5D71 -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ADDDC ; <- D5DDC -db !VOLUME_E6 ; $E6 +db #!VOLUME_E6 ; $E6 org $1ADE10 ; <- D5E10 -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ADE5E ; <- D5E5E -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1ADE9A ; <- D5E9A -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ADF28 ; <- D5F28 -db !VOLUME_FF ; $FF +db #!VOLUME_FF ; $FF org $1ADF8B ; <- D5F8B -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ADFA4 ; <- D5FA4 -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1ADFE9 ; <- D5FE9 -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AE045 ; <- D6045 . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA ;== Pre-credits == org $1AE51A ; <- D651A . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AE53B ; <- D653B (Volume Fade) . -db !VOLUME_3C ; $3C +db #!VOLUME_3C ; $3C org $1AE542 ; <- D6542 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AE566 ; <- D6566 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AE58F ; <- D658F . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AE5B3 ; <- D65B3 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1AE5D2 ; <- D65D2 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AE5ED ; <- D65ED . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AE61D ; <- D661D . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AE64F ; <- D664F . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AE698 ; <- D6698 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AE6D7 ; <- D66D7 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AE6FF ; <- D66FF . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AE72C ; <- D672C . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AE74A ; <- D674A . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AE760 ; <- D6760 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1AE776 ; <- D6776 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AE7C0 ; <- D67C0 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AE827 ; <- D6827 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AE878 ; <- D6878 . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1AE883 ; <- D6883 . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1AE8BD ; <- D68BD . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Holding the Triforce (part 1, more below) == org $1AE8E5 ; <- D68E5 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== More pre-credits stuff == org $1AE956 ; <- D6956 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AE973 ; <- D6973 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AE985 ; <- D6985 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AE9A8 ; <- D69A8 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AE9B8 ; <- D69B8 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AE9D6 ; <- D69D6 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AE9F5 ; <- D69F5 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AEA05 ; <- D6A05 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AEA51 ; <- D6A51 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AEA86 ; <- D6A86 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AEAB1 ; <- D6AB1 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AEAE9 ; <- D6AE9 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AEB6B ; <- D6B6B . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1AEB96 ; <- D6B96 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AEC05 ; <- D6C05 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AEC3E ; <- D6C3E . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AEC5C ; <- D6C5C . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AEC6F ; <- D6C6F . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AEC8E ; <- D6C8E . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AECB4 ; <- D6CB4 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AED4A ; <- D6D4A . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AED7D ; <- D6D7D . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1AEDB3 ; <- D6DB3 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AEDCF ; <- D6DCF . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AEDF6 ; <- D6DF6 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1AEE0D ; <- D6E0D . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1AEE20 ; <- D6E20 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AEE48 ; <- D6E48 . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1AEE76 ; <- D6E76 . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1AEE9C ; <- D6E9C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AEECB ; <- D6ECB . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AEEFB ; <- D6EFB . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1AEF2D ; <- D6F2D . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1AEF80 ; <- D6F80 (i think this is unused, but i don't feel like confirming this one) -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AF17E ; <- D717E . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Holding the Triforce (part 2) == org $1AF190 ; <- D7190 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AF1AB ; <- D71AB . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1AF1B9 ; <- D71B9 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1AF1D4 ; <- D71D4 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AF1E6 ; <- D71E6 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AF203 ; <- D7203 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1AF21E ; <- D721E . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 ;== More Credits == org $1AF3A1 ; <- D73A1 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C ;== Hyrule Castle == org $1B811D ; <- D811D . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;org $1B8139 ; <- D8139 . (silent track) -;db !VOLUME_C8 ; $C8 +;db #!VOLUME_C8 ; $C8 ;org $1B814C ; <- D814C . (silent track) -;db !VOLUME_8C ; $8C +;db #!VOLUME_8C ; $8C org $1B816B ; <- D816B . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B818A ; <- D818A . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B819E ; <- D819E . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B81BE ; <- D81BE . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B81DE ; <- D81DE . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1B821E ; <- D821E . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1B825D ; <- D825D . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1B827D ; <- D827D . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1B829C ; <- D829C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B82BE ; <- D82BE . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1B82E1 ; <- D82E1 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8306 ; <- D8306 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B830E ; <- D830E . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8340 ; <- D8340 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1B835E ; <- D835E . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8394 ; <- D8394 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1B83AB ; <- D83AB . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B83CA ; <- D83CA . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B83F0 ; <- D83F0 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B83F8 ; <- D83F8 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B842C ; <- D842C . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1B844B ; <- D844B . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8479 ; <- D8479 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B849E ; <- D849E . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B84CB ; <- D84CB . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B84EB ; <- D84EB . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B84F3 ; <- D84F3 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B854A ; <- D854A . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8573 ; <- D8573 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B859D ; <- D859D . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B85B4 ; <- D85B4 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B85CE ; <- D85CE . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B862A ; <- D862A . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8681 ; <- D8681 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8724 ; <- D8724 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1B8732 ; <- D8732 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1B8796 ; <- D8796 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1B87E3 ; <- D87E3 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B87FF ; <- D87FF . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B887B ; <- D887B . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B88C6 ; <- D88C6 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B88E3 ; <- D88E3 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;org $1B8903 ; <- D8903 . (silent track) -;db !VOLUME_8C ; $8C +;db #!VOLUME_8C ; $8C org $1B892A ; <- D892A . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1B8944 ; <- D8944 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B897B ; <- D897B . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Pendant Dungeon == org $1B8C97 ; <- D8C97 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8CA4 ; <- D8CA4 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8CB3 ; <- D8CB3 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8CC2 ; <- D8CC2 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8CD1 ; <- D8CD1 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8D01 ; <- D8D01 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B8E2D ; <- D8E2D . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1B8F0D ; <- D8F0D . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC ;org $1B90F8 ; <- D90F8 (muted track) -;db !VOLUME_00 ; $00 +;db #!VOLUME_00 ; $00 ;== Caves == org $1B917B ; <- D917B . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B918C ; <- D918C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B919A ; <- D919A . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B91B5 ; <- D91B5 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B91D0 ; <- D91D0 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B91DD ; <- D91DD . (splashy sound) -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B91E8 ; <- D91E8 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1B9220 ; <- D9220 . (splashy sound) -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B922B ; <- D922B . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1B9273 ; <- D9273 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9284 ; <- D9284 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9292 ; <- D9292 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B92AD ; <- D92AD . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B92C8 ; <- D92C8 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B92D5 ; <- D92D5 . (splashy sound) -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B92E0 ; <- D92E0 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1B9311 ; <- D9311 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9322 ; <- D9322 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9330 ; <- D9330 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B934B ; <- D934B . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9366 ; <- D9366 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9373 ; <- D9373 . (splashy sound) -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B937E ; <- D937E . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1B93B6 ; <- D93B6 . (splashy sound) -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B93C1 ; <- D93C1 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C ;== Crystal/Pendant get == org $1B945E ; <- D945E . -db !VOLUME_F0 ; $F0 +db #!VOLUME_F0 ; $F0 org $1B94AA ; <- D94AA . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA org $1B94E0 ; <- D94E0 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1B9544 ; <- D9544 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1B95A8 ; <- D95A8 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1B960C ; <- D960C . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1B9652 ; <- D9652 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1B967D ; <- D967D . -db !VOLUME_F0 ; $F0 +db #!VOLUME_F0 ; $F0 org $1B9698 ; <- D9698 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1B96C2 ; <- D96C2 . -db !VOLUME_F0 ; $F0 +db #!VOLUME_F0 ; $F0 ;== Sanctuary == org $1B97A6 ; <- D97A6 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B97C2 ; <- D97C2 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B97DC ; <- D97DC . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B97FB ; <- D97FB . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9811 ; <- D9811 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9828 ; <- D9828 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 ;== Boss == ;org $1B98FF ; <- D98FF . (silent track) -;db !VOLUME_C8 ; $C8 +;db #!VOLUME_C8 ; $C8 org $1B996F ; <- D996F . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9982 ; <- D9982 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1B99A8 ; <- D99A8 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B99D5 ; <- D99D5 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9A02 ; <- D9A02 . -db !VOLUME_AA ; $AA +db #!VOLUME_AA ; $AA org $1B9A30 ; <- D9A30 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9A4E ; <- D9A4E . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9A6B ; <- D9A6B . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9A88 ; <- D9A88 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9A9E ; <- D9A9E . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA ;org $1B9AE4 ; <- D9AE4 . (unused track) these three tracks go together -;db !VOLUME_FA ; $FA +;db #!VOLUME_FA ; $FA ;org $1B9AF7 ; <- D9AF7 . (unused track) -;db !VOLUME_C8 ; $C8 +;db #!VOLUME_C8 ; $C8 ;org $1B9B1D ; <- D9B1D . (unused track) -;db !VOLUME_C8 ; $C8 +;db #!VOLUME_C8 ; $C8 org $1B9B43 ; <- D9B43 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9B56 ; <- D9B56 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1B9B7C ; <- D9B7C . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9BA9 ; <- D9BA9 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9BD6 ; <- D9BD6 . -db !VOLUME_AA ; $AA +db #!VOLUME_AA ; $AA ;== Crystal Dungeon == org $1B9C84 ; <- D9C84 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9C8D ; <- D9C8D . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9C95 ; <- D9C95 . -db !VOLUME_F0 ; $F0 +db #!VOLUME_F0 ; $F0 org $1B9CAC ; <- D9CAC . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9CBC ; <- D9CBC . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1B9CE8 ; <- D9CE8 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9CF3 ; <- D9CF3 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9CFD ; <- D9CFD . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9D46 ; <- D9D46 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1B9DC0 ; <- D9DC0 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1B9E49 ; <- D9E49 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1B9EE6 ; <- D9EE6 . -db !VOLUME_F0 ; $F0 +db #!VOLUME_F0 ; $F0 ;== Fortuneteller == org $1BA211 ; <- DA211 . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1BA233 ; <- DA233 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1BA251 ; <- DA251 . -db !VOLUME_E6 ; $E6 +db #!VOLUME_E6 ; $E6 org $1BA26C ; <- DA26C . -db !VOLUME_E6 ; $E6 +db #!VOLUME_E6 ; $E6 org $1BA289 ; <- DA289 . -db !VOLUME_FA ; $FA +db #!VOLUME_FA ; $FA ;== Zelda's Lullaby == org $1BA35B ; <- DA35B . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1BA35E ; <- DA35E (Volume fade) . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BA37B ; <- DA37B . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1BA37E ; <- DA37E (Volume fade) . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BA38E ; <- DA38E . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1BA391 ; <- DA391 (Volume fade) . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BA39F ; <- DA39F . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1BA3A2 ; <- DA3A2 (Volume fade) . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1BA3D5 ; <- DA3D5 . -db !VOLUME_82 ; $82 +db #!VOLUME_82 ; $82 org $1BA478 ; <- DA478 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BA49E ; <- DA49E . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1BA4C3 ; <- DA4C3 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BA4D7 ; <- DA4D7 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BA4F6 ; <- DA4F6 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BA515 ; <- DA515 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Maidens == org $1BA5C3 ; <- DA5C3 . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1BA5C6 ; <- DA5C6 (Volume fade) . -db !VOLUME_F0 ; $F0 +db #!VOLUME_F0 ; $F0 org $1BA5DE ; <- DA5DE . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1BA608 ; <- DA608 . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1BA635 ; <- DA635 . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1BA662 ; <- DA662 . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1BA691 ; <- DA691 . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1BA694 ; <- DA694 (Volume fade) . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1BA6A8 ; <- DA6A8 . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1BA6AB ; <- DA6AB (Volume fade) . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1BA6DF ; <- DA6DF . -db !VOLUME_64 ; $64 +db #!VOLUME_64 ; $64 org $1BA6E2 ; <- DA6E2 (Volume fade) . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BA710 ; <- DA710 . -db !VOLUME_14 ; $14 +db #!VOLUME_14 ; $14 org $1BA71F ; <- DA71F (Volume fade) . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1BA72B ; <- DA72B . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1BA736 ; <- DA736 (Volume fade) . -db !VOLUME_3C ; $3C +db #!VOLUME_3C ; $3C org $1BA745 ; <- DA745 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1BA752 ; <- DA752 (Volume fade) . -db !VOLUME_3C ; $3C +db #!VOLUME_3C ; $3C org $1BA765 ; <- DA765 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1BA772 ; <- DA772 (Volume fade) . -db !VOLUME_3C ; $3C +db #!VOLUME_3C ; $3C org $1BA785 ; <- DA785 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1BA792 ; <- DA792 (Volume fade) . -db !VOLUME_3C ; $3C +db #!VOLUME_3C ; $3C org $1BA7A4 ; <- DA7A4 . -db !VOLUME_14 ; $14 +db #!VOLUME_14 ; $14 org $1BA7AF ; <- DA7AF (Volume fade) . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1BA7BB ; <- DA7BB . -db !VOLUME_14 ; $14 +db #!VOLUME_14 ; $14 org $1BA7C6 ; <- DA7C6 (Volume fade) . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 org $1BA7D2 ; <- DA7D2 . -db !VOLUME_14 ; $14 +db #!VOLUME_14 ; $14 org $1BA7DD ; <- DA7DD (Volume fade) . -db !VOLUME_78 ; $78 +db #!VOLUME_78 ; $78 ;== Fairy Fountain == org $1BA958 ; <- DA958 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1BA971 ; <- DA971 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1BA98C ; <- DA98C . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1BA9A7 ; <- DA9A7 . -db !VOLUME_8C ; $8C +db #!VOLUME_8C ; $8C org $1BA9C2 ; <- DA9C2 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BA9ED ; <- DA9ED . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAA1B ; <- DAA1B . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAA57 ; <- DAA57 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAA68 ; <- DAA68 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1BAA77 ; <- DAA77 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1BAA88 ; <- DAA88 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1BAA99 ; <- DAA99 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 ;== Pre-Ganon Fight == org $1BABAF ; <- DABAF . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BABC9 ; <- DABC9 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BABE2 ; <- DABE2 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BABF6 ; <- DABF6 . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1BAC0D ; <- DAC0D . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1BAC28 ; <- DAC28 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAC46 ; <- DAC46 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAC63 ; <- DAC63 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Agah 2 defeated == ;org $1BACB8 ; <- DACB8 . (silent track) -;db !VOLUME_C8 ; $C8 +;db #!VOLUME_C8 ; $C8 org $1BACEC ; <- DACEC . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAD08 ; <- DAD08 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAD25 ; <- DAD25 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAD42 ; <- DAD42 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAD5F ; <- DAD5F . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 ;== Ganon == org $1BAE17 ; <- DAE17 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAE34 ; <- DAE34 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAE51 ; <- DAE51 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAE88 ; <- DAE88 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1BAEBE ; <- DAEBE . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 org $1BAEC8 ; <- DAEC8 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1BAEE6 ; <- DAEE6 . -db !VOLUME_DC ; $DC +db #!VOLUME_DC ; $DC org $1BAF04 ; <- DAF04 . -db !VOLUME_B4 ; $B4 +db #!VOLUME_B4 ; $B4 org $1BAF2E ; <- DAF2E . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAF55 ; <- DAF55 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAF6B ; <- DAF6B . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAF81 ; <- DAF81 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BAFAC ; <- DAFAC . -db !VOLUME_A0 ; $A0 +db #!VOLUME_A0 ; $A0 ;== Falling into the Ganon fight == org $1BB14F ; <- DB14F . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BB16B ; <- DB16B . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BB180 ; <- DB180 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BB195 ; <- DB195 . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BB1AA ; <- DB1AA . -db !VOLUME_C8 ; $C8 +db #!VOLUME_C8 ; $C8 org $1BB1BF ; <- DB1BF . -db !VOLUME_DC ; $DC \ No newline at end of file +db #!VOLUME_DC ; $DC diff --git a/newhud.asm b/newhud.asm index cf059f9..96457a3 100644 --- a/newhud.asm +++ b/newhud.asm @@ -1,296 +1,558 @@ +!InfiniteTile = $2431 +!BlankTile = $207F +!SlashTile = $2830 +!PTile = $296C +!CTile = $295F + NewDrawHud: + PHB + SEP #$30 -;================================================================================ -; Draw bomb count -!BOMBCOUNT_DRAW_ADDRESS = "$7EC75A" -!INFINITE_BOMBS = "$7F50C9" -;================================================================================ + REP #$10 - LDA !INFINITE_BOMBS : BNE .infinite_bombs - .finite_bombs - LDA.l $7EF343 ; bombs - JSR HudHexToDec2Digit ;requires 8 bit registers! - REP #$20 - LDX.b $06 : TXA : ORA.w #$2400 : STA !BOMBCOUNT_DRAW_ADDRESS ; Draw bombs 10 digit - LDX.b $07 : TXA : ORA.w #$2400 : STA !BOMBCOUNT_DRAW_ADDRESS+2 ; Draw bombs 1 digit - BRA + - - .infinite_bombs - REP #$20 - LDA.w #$2431 : STA !BOMBCOUNT_DRAW_ADDRESS ; infinity (left half) - INC A : STA !BOMBCOUNT_DRAW_ADDRESS+2 ; infinity (right half) - + + LDA.b #$7E + PHA : PLB ;================================================================================ -; Draw rupee counter -!RUPEE_DRAW_ADDRESS = "$7EC750" -;================================================================================ +NewHUD_DrawBombs: + LDA.l InfiniteBombs : BEQ .finite - LDA.l $7EF362 ; Drawing bombs (above) always ends with 16-bit A, so, no need to REP here - JSR HudHexToDec4Digit - LDX.b $04 : TXA : ORA.w #$2400 : STA !RUPEE_DRAW_ADDRESS ; 1000s - LDX.b $05 : TXA : ORA.w #$2400 : STA !RUPEE_DRAW_ADDRESS+2 ; 100s - LDX.b $06 : TXA : ORA.w #$2400 : STA !RUPEE_DRAW_ADDRESS+4 ; 10s - LDX.b $07 : TXA : ORA.w #$2400 : STA !RUPEE_DRAW_ADDRESS+6 ; 1s +.infinite + LDY.w #!InfiniteTile+0 + LDX.w #!InfiniteTile+1 + BRA .draw + +.finite + LDA.w BombsEquipment + JSR HUDHex2Digit + +.draw + STY.w HUDBombCount+0 + STX.w HUDBombCount+2 ;================================================================================ -; Draw arrow count -!ARROWCOUNT_DRAW_ADDRESS = "$7EC760" -!INFINITE_ARROWS = "$7F50C8" -;================================================================================ +NewHUD_DrawRupees: + REP #$20 - SEP #$20 - LDA.l ArrowMode : BNE + - LDA !INFINITE_ARROWS : BNE .infinite_arrows - .finite_arrows - LDA.l $7EF377 ; arrows - JSR HudHexToDec2Digit - REP #$20 - LDX.b $06 : TXA : ORA.w #$2400 : STA !ARROWCOUNT_DRAW_ADDRESS ; Draw arrows 10 digit - LDX.b $07 : TXA : ORA.w #$2400 : STA !ARROWCOUNT_DRAW_ADDRESS+2 ; Draw arrows 1 digit - BRA + + LDA.w DisplayRupees + JSR HUDHex4Digit - .infinite_arrows - REP #$20 - LDA.w #$2431 : STA !ARROWCOUNT_DRAW_ADDRESS ; infinity (left half) - INC A : STA !ARROWCOUNT_DRAW_ADDRESS+2 ; infinity (right half) - + -;================================================================================ -; Draw Goal Item Indicator -!GOAL_DRAW_ADDRESS = "$7EC72A" -;================================================================================ - REP #$20 - LDA.l GoalItemRequirement : BNE + : JMP .done : + ; Star Meter + LDA.b Scrap04 : TAX : STX.w HUDRupees+0 ; 1000s + LDA.b Scrap05 : TAX : STX.w HUDRupees+2 ; 100s + LDA.b Scrap06 : TAX : STX.w HUDRupees+4 ; 10s + LDA.b Scrap07 : TAX : STX.w HUDRupees+6 ; 1s +;================================================================================ +NewHUD_DrawArrows: + SEP #$20 + + LDA.l ArrowMode : BNE NewHUD_DrawGoal + LDA.l InfiniteArrows : BEQ .finite + +.infinite + LDY.w #!InfiniteTile+0 + LDX.w #!InfiniteTile+1 + BRA .draw + +.finite + LDA.w CurrentArrows + JSR HUDHex2Digit + +.draw + STY.w HUDArrowCount+0 + STX.w HUDArrowCount+2 + +;================================================================================ +NewHUD_DrawGoal: + REP #$20 + LDA.w UpdateHUDFlag : BEQ .no_goal + LDA.l GoalItemRequirement : BEQ .no_goal + + LDA.l GoalItemIcon : STA.w HUDGoalIndicator + LDA.w #!SlashTile : STA.w HUDGoalIndicator+8 LDA.l GoalCounter - JSR HudHexToDec4Digit + JSR HUDHex4Digit - LDA.l GoalItemIcon : STA !GOAL_DRAW_ADDRESS ; draw star icon - - LDX.b $05 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+2 ; draw 100's digit - LDX.b $06 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+4 ; draw 10's digit - LDX.b $07 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+6 ; draw 1's digit + LDA.b Scrap05 : TAX : STX.w HUDGoalIndicator+2 ; draw 100's digit + LDA.b Scrap06 : TAX : STX.w HUDGoalIndicator+4 ; draw 10's digit + LDA.b Scrap07 : TAX : STX.w HUDGoalIndicator+6 ; draw 1's digit - LDA.l GoalItemRequirement : CMP.w #$FFFF : BEQ .skip - LDA.l GoalItemRequirement - JSR HudHexToDec4Digit - LDA.w #$2830 : STA !GOAL_DRAW_ADDRESS+8 ; draw slash - LDX.b $05 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+10 ; draw 100's digit - LDX.b $06 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+12 ; draw 10's digit - LDX.b $07 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+14 ; draw 1's digit - BRA .done - .skip - LDA.w #$207F ; transparent tile - STA !GOAL_DRAW_ADDRESS+8 - STA !GOAL_DRAW_ADDRESS+10 - STA !GOAL_DRAW_ADDRESS+12 - .done + REP #$20 + LDX.w #!BlankTile + LDA.w GoalCounter + CMP.w #100 : BCS .req : STX.w HUDGoalIndicator+$02 + CMP.w #10 : BCS .req : STX.w HUDGoalIndicator+$04 + +.req + LDA.l GoalItemRequirement : CMP.w #$FFFF : BNE .real_goal + + STX.w HUDGoalIndicator+10 + STX.w HUDGoalIndicator+12 + STX.w HUDGoalIndicator+14 + +.no_goal + SEP #$20 + BRA NewHUD_DrawKeys + +.real_goal + JSR HUDHex4Digit + + LDA.b Scrap05 : TAX : STX.w HUDGoalIndicator+10 ; draw 100's digit + LDA.b Scrap06 : TAX : STX.w HUDGoalIndicator+12 ; draw 10's digit + LDA.b Scrap07 : TAX : STX.w HUDGoalIndicator+14 ; draw 1's digit ;================================================================================ -; Draw Dungeon Compass Counts +NewHUD_DrawKeys: + LDA.w CurrentSmallKeys + CMP.b #$FF + BNE .in_dungeon + + LDY.w #!BlankTile + STY.w HUDKeyIcon + STY.w HUDKeyDigits+0 + STY.w HUDKeyDigits+2 + BRA NewHUD_DrawDungeonCounters + +.in_dungeon + JSR HUDHex2Digit + CPY.w #$2490 + BNE .real_10s + + LDY.w #!BlankTile + +.real_10s + STY.w HUDKeyDigits+0 + STX.w HUDKeyDigits+2 + ;================================================================================ - LDA.l CompassMode : AND #$000F : BEQ + ; skip if CompassMode is 0. - JSL.l DrawDungeonCompassCounts ; compasses.asm +NewHUD_DrawDungeonCounters: + LDA.w UpdateHUDFlag : BEQ NewHUD_DrawPrizeIcon + LDA.l CompassMode : ORA.l MapHUDMode : BIT.b #$03 : BEQ NewHUD_DrawPrizeIcon + LDX.b IndoorsFlag : BNE + + JMP.w NewHUD_DrawMagicMeter + + + SEP #$30 + ; extra hard safeties for getting dungeon ID to prevent crashes + LDA.w DungeonID + CMP.b #$1B : BCS NewHUD_DrawPrizeIcon ; Skip if not in a valid dungeon ID + AND.b #$FE : TAX + LSR : TAY + PHX : PHY + + JSR DrawCompassCounts + SEP #$10 + PLY : PLX + JSR DrawMapCounts + +;================================================================================ +NewHUD_DrawPrizeIcon: + REP #$10 + SEP #$20 + LDA.b GameMode + CMP.b #$12 : BEQ .no_prize + CMP.b #$0E : BEQ + + LDA.w UpdateHUDFlag : BEQ NewHUD_DrawItemCounter + + LDA.w DungeonID + CMP.b #$1A : BCS .no_prize + CMP.b #$04 : BCC .no_prize + CMP.b #$08 : BNE .dungeon -;================================================================================ -; Draw key count -!KEY_DIGITS_ADDRESS = "$7EC764" -!KEY_ICON_ADDRESS = "$7EC726" -;================================================================================ - SEP #$20 - LDA.l CurrentSmallKeys : CMP.b #$FF : BEQ .not_in_dungeon - .in_dungeon - JSR HudHexToDec2Digit : REP #$20 - - ; if 10s digit is 0, draw transparent tile instead of 0 - LDX.b $06 : TXA : CPX.b #$90 : BNE + - LDA.w #$007F - + - ORA.w #$2400 : STA !KEY_DIGITS_ADDRESS - - ; 1s digit - LDX.b $07 : TXA : ORA.w #$2400 : STA !KEY_DIGITS_ADDRESS+2 - BRA .done_keys - - .not_in_dungeon - REP #$20 - - ;in the overworld, draw transparent tiles instead of key count - LDA.w #$247F : STA !KEY_DIGITS_ADDRESS : STA !KEY_DIGITS_ADDRESS+2 - STA !KEY_ICON_ADDRESS - - .done_keys - -;-------------------------------------------------------------------------------- -; Draw pendant/crystal icon -;-------------------------------------------------------------------------------- -!PRIZE_ICON = $7EC742 -!P_ICON = $296C -!C_ICON = $295F - - SEP #$20 - LDA.b $1B : BEQ .noprize - - LDX.w $040C - CPX #$1A : !BGE .noprize - CPX #$04 : !BLT .noprize - CPX #$08 : BEQ .noprize - - LDA $10 : CMP #$12 : BEQ .noprize +.no_prize + LDY.w #!BlankTile + BRA .draw_prize +.dungeon + SEP #$30 + TAX + LSR + TAY LDA.l MapMode - REP #$20 - BEQ .drawprize - LDA.l MapField + REP #$30 + BEQ .prize + + LDA.w MapField AND.l DungeonItemMasks,X - BEQ .noprize + BEQ .no_prize -.drawprize - TXA : LSR : TAX - LDA.l CrystalPendantFlags_2, X - AND.w #$0040 : BNE .is_crystal + .prize + TYX + LDA.l CrystalPendantFlags_2,X + BIT.w #$0080 + BNE .no_icon - LDA.w #!P_ICON - BRA .doneprize + BIT.w #$0040 + BNE .crystal -.is_crystal - LDA.w #!C_ICON - BRA .doneprize + LDY.w #!PTile + BRA .draw_prize -.noprize - REP #$20 - LDA.w #$207F +.crystal + LDY.w #!CTile + BRA .draw_prize -.doneprize - STA.l !PRIZE_ICON +.no_icon + LDY.w #!BlankTile -;-------------------------------------------------------------------------------- -; Draw Magic Meter -!INFINITE_MAGIC = "$7F50CA" -!DrawMagicMeter_mp_tilemap = "$0DFE0F" -;-------------------------------------------------------------------------------- - LDA CurrentMagic : AND #$00FF ; crap we wrote over when placing the hook for OnDrawHud - !ADD #$0007 - AND #$FFF8 - TAX ; end of crap - - LDA !INFINITE_MAGIC : AND.w #$00FF : BNE + : JMP .green : + - SEP #$20 : LDA.b #$80 : STA CurrentMagic : REP #$30 ; set magic to max - LDX.w #$0080 ; load full magic meter graphics - LDA $1A : AND.w #$000C : LSR #2 - BEQ .red - CMP.w #0001 : BEQ .yellow - CMP.w #0002 : BNE + : JMP .green : + - .blue - LDA !DrawMagicMeter_mp_tilemap+0, X : AND.w #$EFFF : STA $7EC746 - LDA !DrawMagicMeter_mp_tilemap+2, X : AND.w #$EFFF : STA $7EC786 - LDA !DrawMagicMeter_mp_tilemap+4, X : AND.w #$EFFF : STA $7EC7C6 - LDA !DrawMagicMeter_mp_tilemap+6, X : AND.w #$EFFF : STA $7EC806 - RTL - .red - LDA !DrawMagicMeter_mp_tilemap+0, X : AND.w #$E7FF : STA $7EC746 - LDA !DrawMagicMeter_mp_tilemap+2, X : AND.w #$E7FF : STA $7EC786 - LDA !DrawMagicMeter_mp_tilemap+4, X : AND.w #$E7FF : STA $7EC7C6 - LDA !DrawMagicMeter_mp_tilemap+6, X : AND.w #$E7FF : STA $7EC806 - RTL - .yellow - LDA !DrawMagicMeter_mp_tilemap+0, X : AND.w #$EBFF : STA $7EC746 - LDA !DrawMagicMeter_mp_tilemap+2, X : AND.w #$EBFF : STA $7EC786 - LDA !DrawMagicMeter_mp_tilemap+4, X : AND.w #$EBFF : STA $7EC7C6 - LDA !DrawMagicMeter_mp_tilemap+6, X : AND.w #$EBFF : STA $7EC806 - RTL - .orange - LDA !DrawMagicMeter_mp_tilemap+0, X : AND.w #$E3FF : STA $7EC746 - LDA !DrawMagicMeter_mp_tilemap+2, X : AND.w #$E3FF : STA $7EC786 - LDA !DrawMagicMeter_mp_tilemap+4, X : AND.w #$E3FF : STA $7EC7C6 - LDA !DrawMagicMeter_mp_tilemap+6, X : AND.w #$E3FF : STA $7EC806 - RTL - .green - LDA !DrawMagicMeter_mp_tilemap+0, X : STA $7EC746 - LDA !DrawMagicMeter_mp_tilemap+2, X : STA $7EC786 - LDA !DrawMagicMeter_mp_tilemap+4, X : STA $7EC7C6 - LDA !DrawMagicMeter_mp_tilemap+6, X : STA $7EC806 +.draw_prize + STY.w HUDPrizeIcon + +;================================================================================ +NewHUD_DrawItemCounter: + REP #$20 + LDA.w UpdateHUDFlag : BNE .continue + .early_exit + JMP NewHUD_DrawMagicMeter + .continue + LDA.l ItemCounterHUD : AND.w #$00FF : BEQ .early_exit + LDA.w #!SlashTile : STA.w HUDGoalIndicator+$08 + LDA.l TotalItemCount : CMP.w #1000 : BCS .item_four_digits + LDA.w TotalItemCountTiles+$02 : STA.w HUDGoalIndicator+$0A + LDA.w TotalItemCountTiles+$04 : STA.w HUDGoalIndicator+$0C + LDA.w TotalItemCountTiles+$06 : STA.w HUDGoalIndicator+$0E + + LDA.w TotalItemCounter + JSR HUDHex4Digit + LDA.b Scrap05 : TAX : STX.w HUDGoalIndicator+$02 + LDA.b Scrap06 : TAX : STX.w HUDGoalIndicator+$04 + LDA.b Scrap07 : TAX : STX.w HUDGoalIndicator+$06 + REP #$20 : LDA.w TotalItemCounter + LDX.w #!BlankTile + CMP.w #100 : BCS NewHUD_DrawMagicMeter : STX.w HUDGoalIndicator+$02 + CMP.w #10 : BCS NewHUD_DrawMagicMeter : STX.w HUDGoalIndicator+$04 + BRA NewHUD_DrawMagicMeter + + .item_four_digits + LDA.w TotalItemCountTiles+$00 : STA.w HUDGoalIndicator+$0A + LDA.w TotalItemCountTiles+$02 : STA.w HUDGoalIndicator+$0C + LDA.w TotalItemCountTiles+$04 : STA.w HUDGoalIndicator+$0E + LDA.w TotalItemCountTiles+$06 : STA.w HUDGoalIndicator+$10 + + LDA.w TotalItemCounter + JSR HUDHex4Digit + LDA.b Scrap04 : TAX : STX.w HUDGoalIndicator+$00 + LDA.b Scrap05 : TAX : STX.w HUDGoalIndicator+$02 + LDA.b Scrap06 : TAX : STX.w HUDGoalIndicator+$04 + LDA.b Scrap07 : TAX : STX.w HUDGoalIndicator+$06 + REP #$20 : LDA.w TotalItemCounter + LDX.w #!BlankTile + CMP.w #1000 : BCS NewHUD_DrawMagicMeter : STX.w HUDGoalIndicator+$00 + CMP.w #100 : BCS NewHUD_DrawMagicMeter : STX.w HUDGoalIndicator+$02 + CMP.w #10 : BCS NewHUD_DrawMagicMeter : STX.w HUDGoalIndicator+$04 + +;================================================================================ +DrawMagicMeter_mp_tilemap = $0DFE0F +NewHUD_DrawMagicMeter: + SEP #$31 + LDA.l CurrentMagic + ADC.b #$06 ; carry set by above for +1 to get +7 + AND.b #$F8 + TAY + + LDA.l InfiniteMagic + BEQ .set_index + +.infinite_magic + LDA.b #$80 + STA.w CurrentMagic + TAY + + LDA.b FrameCounter + REP #$30 + AND.w #$000C + LSR + BRA .recolor + +.set_index ; this branch is always 0000 when taken + REP #$30 + TDC + .recolor + TAX + LDA.l MagicMeterColorMasks,X + + TYX + TAY : AND.l DrawMagicMeter_mp_tilemap+0,X : STA.w HUDTileMapBuffer+$046 + TYA : AND.l DrawMagicMeter_mp_tilemap+2,X : STA.w HUDTileMapBuffer+$086 + TYA : AND.l DrawMagicMeter_mp_tilemap+4,X : STA.w HUDTileMapBuffer+$0C6 + TYA : AND.l DrawMagicMeter_mp_tilemap+6,X : STA.w HUDTileMapBuffer+$106 + +;================================================================================ +NewHUD_DoneDrawing: + STZ.w UpdateHUDFlag + PLB RTL ;================================================================================ -; 16-bit A, 8-bit X -; in: A(b) - Byte to Convert -; out: $04 - $07 (high - low) -;================================================================================ -HudHexToDec4Digit: - LDY.b #$90 - - - CMP.w #1000 : !BLT + - INY - SBC.w #1000 : BRA - - + - STY $04 : LDY #$90 ; Store 1000s digit & reset Y - - - CMP.w #100 : !BLT + - INY - SBC.w #100 : BRA - - + - STY $05 : LDY #$90 ; Store 100s digit & reset Y - - - CMP.w #10 : !BLT + - INY - SBC.w #10 : BRA - - + - STY $06 : LDY #$90 ; Store 10s digit & reset Y - CMP.w #1 : !BLT + - - - INY - DEC : BNE - - + - STY $07 ; Store 1s digit -RTS +MagicMeterColorMasks: + dw $FFFF ; green - KEEP GREEN FIRST + dw $EFFF ; blue + dw $E7FF ; red + dw $EBFF ; yellow + dw $E3FF ; orange ;================================================================================ -; 8-bit registers -; in: A(b) - Byte to Convert -; out: $05 - $07 (high - low) +DrawCompassCounts: + LDA.l CompassMode : AND.b #$0F : BNE .continue + .early_exit + JMP .done + .continue + + ; no compass needed if this bit is set + BIT.b #$02 : BNE .draw_compass_count + TYX : LDA.l ExistsTransfer, X : TAX : LDA.l CompassExists, X : BEQ .draw_compass_count + REP #$20 + LDX.w DungeonID : LDA.w CompassField : AND.l DungeonItemMasks,X : BEQ .early_exit + + .draw_compass_count + LDX.w DungeonID + CPX.b #$00 : BNE .not_sewers + INX #2 + + .not_sewers + REP #$20 + LDA.w DungeonLocationsChecked, X + PHA + + LDA.w #!SlashTile : STA.w HUDTileMapBuffer+$98 ; always slash + LDA.l CompassTotalsWRAM,X + CMP.w #100 : BCS .three_digits + CMP.w #10 : BCS .two_digits + + LDA.l CompassTotalsOneDigit, X : STA.w HUDTileMapBuffer+$9A + PLA + JSR HUDHex2Digit + STX.w HUDTileMapBuffer+$96 + BRA .done + + .two_digits + LDA.l CompassTotalsTensDigit, X : STA.w HUDTileMapBuffer+$9A + LDA.l CompassTotalsOneDigit, X : STA.w HUDTileMapBuffer+$9C + PLA + JSR HUDHex2Digit + CPY.w #$2490 : BEQ + + STY.w HUDTileMapBuffer+$94 + + STX.w HUDTileMapBuffer+$96 + BRA .done + + .three_digits + LDA.l CompassTotalsHundredsDigit, X : STA.w HUDTileMapBuffer+$9A + LDA.l CompassTotalsTensDigit, X : STA.w HUDTileMapBuffer+$9C + LDA.l CompassTotalsOneDigit, X : STA.w HUDTileMapBuffer+$9E + PLA : PHA + JSR HUDHex4Digit + LDA.b Scrap05 : TAX : STX.w HUDTileMapBuffer+$92 + LDA.b Scrap06 : TAX : STX.w HUDTileMapBuffer+$94 + LDA.b Scrap07 : TAX : STX.w HUDTileMapBuffer+$96 + REP #$20 : PLA + LDX.w #!BlankTile + CMP.w #100 : BCS .done + STX.w HUDTileMapBuffer+$92 + CMP.w #10 : BCS .done + STX.w HUDTileMapBuffer+$94 + +.done + SEP #$20 +RTS ;================================================================================ -;HudHexToDec3Digit: ; this may be overkill, could have used the 4 digit one... -; LDY.b #$90 -; - -; CMP.b #100 : !BLT + -; INY -; SBC.b #100 : BRA - -; + -; STY $05 : LDY.b #$90 ; Store 100s digit and reset Y -; - -; CMP.b #10 : !BLT + -; INY -; SBC.b #10 : BRA - -; + -; STY $06 : LDY #$90 ; Store 10s digit and reset Y -; CMP.b #1 : !BLT + -; - -; INY -; DEC : BNE - -; + -; STY $07 ; Store 1s digit -;RTS +DrawMapCounts: + LDA.l MapHUDMode : BEQ .done + + ; no map needed if this bit is set + BIT.b #$02 : BNE .draw_map_count + REP #$20 + LDA.w MapField : AND.l DungeonItemMasks,X : BEQ .done + +.draw_map_count + SEP #$20 + TYX : BNE .not_sewers + INX + +.not_sewers + LDA.w DungeonCollectedKeys, X + PHA + + LDA.l MapTotalsWRAM,X + + JSR HUDHex2Digit + STX.w HUDTileMapBuffer+$A6 + + LDX.w #!SlashTile : STX.w HUDTileMapBuffer+$A4 + + PLA + JSR HUDHex2Digit + STX.w HUDTileMapBuffer+$A2 + +.done + SEP #$20 +RTS + +; maps from $040C to the odd order used in overworld map +ExistsTransfer: +db $0C, $0C, $00, $02, $0B, $09, $03, $07, $04, $08, $01, $06, $05, $0A ;================================================================================ -; 8-bit registers -; in: A(b) - Byte to Convert -; out: $06 - $07 (high - low) +; Exits with: +; X - ones place tile +; Y - tens place tile +;=================================================================================================== +HUDHex2Digit: + SEP #$30 ; clear high byte of X and Y and make it so they don't get B + ASL : TAX + + REP #$10 + + LDA.b #$24 : XBA ; tile props in high byte + + LDA.l FastHexTable,X : LSR #4 : ORA.b #$90 + TAY + + LDA.l FastHexTable,X : AND.b #$0F : ORA.b #$90 + TAX + + RTS + +HUDHex4Digit: + JSL HexToDec + + REP #$30 + + LDA.l HexToDecDigit2 : ORA.w #$9090 : STA.b Scrap04 + LDA.l HexToDecDigit4 : ORA.w #$9090 : STA.b Scrap06 + + LDA.w #$2400 + + SEP #$20 + RTS + +HUDHex2Digit_Long: + JSR HUDHex2Digit + REP #$20 +RTL + +HUDHex4Digit_Long: + JSR HUDHex4Digit + REP #$20 +RTL + ;================================================================================ -HudHexToDec2Digit: - LDY.b #$90 - - - CMP.b #10 : !BLT + - INY - SBC.b #10 : BRA - - + - STY $06 : LDY #$90 ; Store 10s digit and reset Y - CMP.b #1 : !BLT + - - - INY - DEC : BNE - - + - STY $07 ; Store 1s digit +UpdateHearts: + PHB + REP #$20 + SEP #$10 + + LDX.b #$7E + PHX + PLB + + LDA.w MaximumHealth + LSR + LSR + LSR + AND.w #$1F1F + + + TAX + XBA + TAY + + LDA.w #HUDTileMapBuffer+$068 + STA.b Scrap07 + STA.b Scrap09 + +.next_filled_heart + CPX.b #$01 + BMI .done_hearts + + PHX + LDA.l HUDHeartColors_index : ASL : TAX + LDA.l HUDHeartColors_masks_game_hud,X + PLX + ORA.w #$20A0 + + CPY.b #$01 + BPL .add_heart + + INC + INC + +.add_heart + STA.b ($07) + + DEY + DEX + + LDA.b Scrap07 + INC + INC + CMP.w #HUDTileMapBuffer+$07C + BEQ .next_row + + CMP.w #HUDTileMapBuffer+$0BC + BNE .fine + +.next_row + ADC.w #$002B + +.fine + STA.b Scrap07 + + CPY.b #$00 + BNE .next_filled_heart + + STA.b Scrap09 + BRA .next_filled_heart + +.done_hearts + LDA.w CurrentHealth + AND.w #$0007 + BEQ .skip_partial + CMP.w #$0005 + BCS .more_than_half + + LDA.l HUDHeartColors_index : ASL : TAX + LDA.l HUDHeartColors_masks_game_hud,X + ORA.w #$20A1 + STA.b ($09) + BRA .skip_partial + +.more_than_half + LDA.l HUDHeartColors_index : ASL : TAX + LDA.l HUDHeartColors_masks_game_hud,X + ORA.w #$20A0 + STA.b ($09) + +.skip_partial + SEP #$30 + + PLB + RTL + +CheckHeartPaletteFileSelect: + LDA.l HUDHeartColors_index : ASL : TAX + LDA.l HUDHeartColors_masks_file_select,X + ORA.w #$0200 + LDX.w #$000A +RTL + +CheckHeartPalette: + PHX + LDA.l HUDHeartColors_index : ASL : TAX + LDA.l HUDHeartColors_masks_game_hud,X + ORA.w #$20A0 + PLX RTS + +ColorAnimatedHearts: + PHX + REP #$20 + LDA.l HUDHeartColors_index : ASL : TAX + LDA.l HUDHeartColors_masks_game_hud,X + PLX + ORA.l HeartFramesBaseTiles,X + STA.b [Scrap00],Y + SEP #$20 +RTL + +HeartFramesBaseTiles: +dw $20A3, $20A4, $20A3, $20A0 diff --git a/newitems.asm b/newitems.asm index eddae26..4eb605e 100755 --- a/newitems.asm +++ b/newitems.asm @@ -1,53 +1,6 @@ ;================================================================================ ; New Item Handlers ;-------------------------------------------------------------------------------- -; REMEMBER TO UPDATE THE TABLES IN UTILITIES.ASM! -;-------------------------------------------------------------------------------- -; #$4C - Bomb Capacity (50) -; #$4D - Arrow Capacity (70) -; #$4E - 1/2 Magic -; #$4F - 1/4 Magic -; #$50 - Safe Master Sword -; #$51 - Bomb Capacity (+5) -; #$52 - Bomb Capacity (+10) -; #$53 - Arrow Capacity (+5) -; #$54 - Arrow Capacity (+10) -; #$55 - Programmable Item 1 -; #$56 - Programmable Item 2 -; #$57 - Programmable Item 3 -; #$58 - Upgrade-Only Silver Arrows -; #$59 - Rupoor -; #$5A - Null Item -; #$5B - Red Clock -; #$5C - Blue Clock -; #$5D - Green Clock -; #$5E - Progressive Sword -; #$5F - Progressive Shield -; #$60 - Progressive Armor -; #$61 - Progressive Lifting Glove -; #$62 - RNG Pool Item (Single) -; #$63 - RNG Pool Item (Multi) -; #$64 - Progressive Bow -; #$65 - Progressive Bow -; #$6A - Goal Item (Single/Triforce) -; #$6B - Goal Item (Multi/Power Star) -; #$6C - Goal Item (Multi/Triforce Piece) -; #$6D - Server Request F0 (Hearts / Powder / Mushroom / Bonkable) -; #$6E - Server Request F1 (NPC) -; #$6F - Server Request F2 (Tablets / Pedestal) -; #$70 - Maps -; #$80 - Compasses -; #$90 - Big Keys -; #$A0 - Small Keys -; #$B0 - Bee Trap -; #$B1 - Apples -; #$B2 - Fairy -; #$B3 - Chicken -; #$B4 - Big Magic -; #$B5 - Good Bee -; #$B6/B7 - Reserved for Kara -; #$FE - Server Request (Asychronous Chest) -; #$FF - Null Chest ;-------------------------------------------------------------------------------- ; Service Indexes ; 0x00 - 0x04 - chests @@ -55,24 +8,6 @@ ; 0xF1 - freestanding heart 2 / boss heart / npc ; 0xF3 - tablet/pedestal ;-------------------------------------------------------------------------------- -;GetAnimatedSpriteGfxFile: -; LDY.b #$32 -; CMP.b #$39 : BCS + ; If tile index >= 0x39, use sprite file 0x32 (Blank file) -; -; LDY.b #$5D -; -; CMP.b #$23 : BEQ + ; If tile index is 0x23 (Pendant)... -; CMP.b #$37 : BCS + ; ...or tile index >= 0x37, use sprite file 0x5D (Pendant, Boots, 20 Rupees) -; -; LDY.b #$5C -; -; CMP.b #$0C : BEQ + ; If tile index is 0x0C (Flute)... -; CMP.b #$24 : BCS + ; ...or tile index >= 24, use sprite file 0x5C (Rupees, Crystal, Heart Piece ... ...) -; -; ; Otherwise, use sprite file 0x5B (Medallions, Mirror, Flippers, Lantern, Compass...) -; LDY.b #$5B -;+ -;JML GetAnimatedSpriteGfxFile_return ;-------------------------------------------------------------------------------- GetAnimatedSpriteGfxFile: CMP.b #$0C : BNE + @@ -102,7 +37,7 @@ GetAnimatedSpriteGfxFile: + LDY.b #$32 JML GetAnimatedSpriteGfxFile_return -;-------------------------------------------------------------------------------- + GetAnimatedSpriteBufferPointer_table: ; Original data: dw $09C0, $0030, $0060, $0090, $00C0, $0300, $0318, $0330 @@ -118,7 +53,7 @@ dw $03C0, $0990, $09A8, $09C0, $09D8, $0A08, $0A38, $0600 dw $0630 ; New data: dw $0600, $0630, $0660, $0690 ; 50 Bombs / 70 Arrows / Half Magic / Quarter Magic -dw $06C0, $06F0, $0720 ; +5/+10 Bomb Arrows +dw $06C0, $06F0, $8520 ; +5/+10 Bomb Arrows ;#$4x dw $0750 ; +10 Arrows @@ -135,61 +70,52 @@ dw $0988 ; Apple GetAnimatedSpriteBufferPointer: ;PHB : PHK : PLB - LDA.b $00 : ADC.l GetAnimatedSpriteBufferPointer_table, X + LDA.b Scrap00 : ADC.l GetAnimatedSpriteBufferPointer_table, X ;PLB RTL -;-------------------------------------------------------------------------------- + macro ProgrammableItemLogic(index) LDA.l ProgrammableItemLogicPointer_ : BNE ?jump LDA.l ProgrammableItemLogicPointer_+1 : BNE ?jump LDA.l ProgrammableItemLogicPointer_+2 : BNE ?jump BRA ?end ?jump: - JSL.l ProgrammableItemLogicJump_ + JSL ProgrammableItemLogicJump_ ?end: endmacro -macro ValueShift() - TAX : LDA.b #$01 - ?start: - CPX #$00 : BEQ ?end - ASL - DEX - BRA ?start : ?end: -endmacro ;-------------------------------------------------------------------------------- ;carry clear if pass ;carry set if caught ;incsrc eventdata.asm ProcessEventItems: - ;STA $FFFFFF - LDA $00 : PHA - LDA $01 : PHA - LDA $02 : PHA + LDA.b Scrap00 : PHA + LDA.b Scrap01 : PHA + LDA.b Scrap02 : PHA PHY : PHP PHB : LDA.b #$AF : PHA : PLB - LDA $02D8 + LDA.w ItemReceiptID CMP.b #$E0 : BNE + REP #$30 ; set 16-bit accumulator & index registers - LDA RNGItem : ASL : TAX - LDA.l EventDataOffsets, X : !ADD #EventDataTable : STA $00 + LDA.l RNGItem : ASL : TAX + LDA.l EventDataOffsets, X : !ADD #EventDataTable : STA.b Scrap00 SEP #$20 ; set 8-bit accumulator - LDA.b #$AF : STA $02 + LDA.b #$AF : STA.b Scrap02 - JSL.l LoadDialogAddressIndirect - LDA RNGItem : INC : STA RNGItem + JSL LoadDialogAddressIndirect + LDA.l RNGItem : INC : STA.l RNGItem SEP #$10 ; set 8-bit index registers REP #$20 ; set 16-bit accumulator - LDA GoalItemRequirement : BEQ ++ - LDA GoalCounter : INC : STA GoalCounter - CMP GoalItemRequirement : !BLT ++ - LDA TurnInGoalItems : AND.w #$00FF : BNE ++ + LDA.l GoalItemRequirement : BEQ ++ + LDA.l GoalCounter : INC : STA.l GoalCounter + CMP.l GoalItemRequirement : !BLT ++ + LDA.l TurnInGoalItems : AND.w #$00FF : BNE ++ SEP #$20 ; set 8-bit accumulator - LDA.b $8A : CMP.b #$80 : BNE +++ - LDA.b $23 : BNE +++ - JSL.l ActivateGoal + LDA.b OverworldIndex : CMP.b #$80 : BNE +++ + LDA.b LinkPosX+1 : BNE +++ + JSL ActivateGoal +++ ++ SEP #$20 ; set 8-bit accumulator @@ -199,776 +125,786 @@ ProcessEventItems: .done PLB PLP : PLY - PLA : STA $02 - PLA : STA $01 - PLA : STA $00 + PLA : STA.b Scrap02 + PLA : STA.b Scrap01 + PLA : STA.b Scrap00 RTS ;-------------------------------------------------------------------------------- -AddReceivedItemExpandedGetItem: - PHX - - LDA $02D8 ; check inventory - JSL.l FreeDungeonItemNotice - - PHA - LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ + - PLA - BRL .done - + - PLA - - CMP.b #$0B : BNE + ; Bow - LDA BowTracking : AND.b #$40 : BEQ ++ - LDA.l SilverArrowsUseRestriction : BNE ++ - LDA.b #03 : STA BowEquipment ; set bow to silver - ++ - JMP .done - + CMP.b #$3B : BNE + ; Silver Bow - LDA.l SilverArrowsUseRestriction : BNE .noequip - LDA.l SilverArrowsAutoEquip : AND.b #$01 : BEQ .noequip - LDA ArrowsFiller : BNE ++ ; check arrows - LDA.b #$03 : BRA +++ ; bow without arrow - ++ - LDA.b #$04 ; bow with arrow - +++ - STA BowEquipment - .noequip - LDA BowTracking : ORA #$40 : STA BowTracking ; mark silver bow on y-toggle - JMP .done - + CMP.b #$4C : BNE + ; 50 bombs - ;LDA.b #$07 : STA BombCapacityUpgrades ; upgrade bombs - LDA.b #50 : !SUB.l StartingMaxBombs : STA BombCapacityUpgrades ; upgrade bombs - LDA.b #50 : STA BombsFiller ; fill bombs - JMP .done - + CMP.b #$4D : BNE + ; 70 arrows - ;LDA #$07 : STA ArrowCapacityUpgrades ; upgrade arrows - LDA.b #70 : !SUB.l StartingMaxArrows : STA ArrowCapacityUpgrades ; upgrade arrows - LDA.b #70 : STA ArrowsFiller ; fill arrows - JMP .done - + CMP.b #$4E : BNE + ; 1/2 magic - LDA MagicConsumption : CMP #$02 : !BGE ++ - INC : STA MagicConsumption ; upgrade magic - ++ - LDA.b #$80 : STA MagicFiller ; fill magic - JMP .done - + CMP.b #$4F : BNE + ; 1/4 magic - LDA.b #$02 : STA MagicConsumption ; upgrade magic - LDA.b #$80 : STA MagicFiller ; fill magic - JMP .done - + CMP.b #$50 : BNE + ; Master Sword (Safe) - LDA SwordEquipment : CMP.b #$02 : !BGE + ; skip if we have a better sword - LDA.b #$02 : STA SwordEquipment ; set master sword - JMP .done - + CMP.b #$51 : BNE + ; +5 Bombs - LDA BombCapacityUpgrades : !ADD.b #$05 : STA BombCapacityUpgrades ; upgrade bombs +5 - LDA.l Upgrade5BombsRefill : STA BombsFiller ; fill bombs - JMP .done - + CMP.b #$52 : BNE + ; +10 Bombs - LDA BombCapacityUpgrades : !ADD.b #$0A : STA BombCapacityUpgrades ; upgrade bombs +10 - LDA.l Upgrade10BombsRefill : STA BombsFiller ; fill bombs - JMP .done - + CMP.b #$53 : BNE + ; +5 Arrows - LDA ArrowCapacityUpgrades : !ADD.b #$05 : STA ArrowCapacityUpgrades ; upgrade arrows +5 - LDA.l Upgrade5ArrowsRefill : STA ArrowsFiller ; fill arrows - JMP .done - + CMP.b #$54 : BNE + ; +10 Arrows - LDA ArrowCapacityUpgrades : !ADD.b #$0A : STA ArrowCapacityUpgrades ; upgrade arrows +10 - LDA.l Upgrade10ArrowsRefill : STA ArrowsFiller ; fill arrows - JMP .done - + CMP.b #$55 : BNE + ; Programmable Object 1 - %ProgrammableItemLogic(1) - JMP .done - + CMP.b #$56 : BNE + ; Programmable Object 2 - %ProgrammableItemLogic(2) - JMP .done - + CMP.b #$57 : BNE + ; Programmable Object 3 - %ProgrammableItemLogic(3) - JMP .done - + CMP.b #$58 : BNE + ; Upgrade-Only Sivler Arrows - LDA.l SilverArrowsUseRestriction : BNE +++ - LDA.l SilverArrowsAutoEquip : AND.b #$01 : BEQ +++ - LDA BowEquipment : BEQ ++ : CMP.b #$03 : !BGE ++ - !ADD.b #$02 : STA BowEquipment ; switch to silver bow - ++ - +++ - LDA.l ArrowMode : BEQ ++ - LDA.b #$01 : STA ArrowsFiller - ++ - + CMP.b #$59 : BNE + ; 1 Rupoor - REP #$20 : LDA CurrentRupees : !SUB RupoorDeduction : STA CurrentRupees : SEP #$20 ; Take 1 rupee - JMP .done - + CMP.b #$5A : BNE + ; Null Item - JMP .done - + CMP.b #$5B : BNE + ; Red Clock - REP #$20 ; set 16-bit accumulator - LDA ChallengeTimer : !ADD.l RedClockAmount : STA ChallengeTimer - LDA ChallengeTimer+2 : ADC.l RedClockAmount+2 : STA ChallengeTimer+2 - SEP #$20 ; set 8-bit accumulator - JMP .done - + CMP.b #$5C : BNE + ; Blue Clock - REP #$20 ; set 16-bit accumulator - LDA ChallengeTimer : !ADD.l BlueClockAmount : STA ChallengeTimer - LDA ChallengeTimer+2 : ADC.l BlueClockAmount+2 : STA ChallengeTimer+2 - SEP #$20 ; set 8-bit accumulator - JMP .done - + CMP.b #$5D : BNE + ; Green Clock - REP #$20 ; set 16-bit accumulator - LDA ChallengeTimer : !ADD.l GreenClockAmount : STA ChallengeTimer - LDA ChallengeTimer+2 : ADC.l GreenClockAmount+2 : STA ChallengeTimer+2 - SEP #$20 ; set 8-bit accumulator - JMP .done - + CMP.b #$5E : BNE + ; Progressive Sword - JMP .done - + CMP.b #$5F : BNE + ; Progressive Shield - JMP .done - + CMP.b #$60 : BNE + ; Progressive Armor - JMP .done - + CMP.b #$61 : BNE + ; Progressive Lifting Glove - JMP .done - + CMP.b #$62 : BNE + ; RNG Pool Item (Single) - JMP .done - + CMP.b #$63 : BNE + ; RNG Pool Item (Multi) - JMP .done - + CMP.b #$64 : BNE + ; Progressive Bow - JMP .done - + CMP.b #$65 : BNE + ; Progressive Bow - JMP .done - + CMP.b #$6A : BNE + ; Goal Collectable (Single/Triforce) - LDA.b $8A : CMP.b #$80 : BNE ++ - LDA.b $23 : BNE ++ - JSL.l ActivateGoal - ++ - JMP .done - + CMP.b #$6B : BNE + ; Goal Collectable (Multi/Power Star) - BRA .multi_collect - + CMP.b #$6C : BNE + ; Goal Collectable (Multi/Power Star) Alternate Graphic - .multi_collect - REP #$20 ; set 16-bit accumulator - LDA.l GoalItemRequirement : BEQ ++ - LDA.l GoalCounter : INC : STA.l GoalCounter - CMP.w GoalItemRequirement : !BLT ++ - LDA.l TurnInGoalItems : AND.w #$00FF : BNE ++ - SEP #$20 ; set 8-bit accumulator - LDA.b $8A : CMP.b #$80 : BNE +++ - LDA.b $23 : BNE +++ - JSL.l ActivateGoal - +++ - ++ - SEP #$20 ; set 8-bit accumulator - JMP .done - + CMP.b #$6D : BNE + ; Server Request F0 - JSL.l ItemGetServiceRequest_F0 - JMP .done - + CMP.b #$6E : BNE + ; Server Request F1 - JSL.l ItemGetServiceRequest_F1 - JMP .done - + CMP.b #$6F : BNE + ; Server Request F2 - JSL.l ItemGetServiceRequest_F2 - JMP .done - ;+ CMP.b #$FE : BNE + ; Server Request (Null Chest) - ; JSL.l ItemGetServiceRequest - ; JMP .done - + CMP.b #$70 : !BLT + : CMP.b #$80 : !BGE + ; Free Map - AND #$0F : CMP #$08 : !BGE ++ - %ValueShift() - ORA MapField : STA MapField ; Map 1 - JMP .done - ++ - !SUB #$08 - %ValueShift() - BIT.b #$C0 : BEQ +++ : LDA.b #$C0 : +++ ; Make Hyrule Castle / Sewers Count for Both - ORA MapField+1 : STA MapField+1 ; Map 2 - JMP .done - + CMP.b #$80 : !BLT + : CMP.b #$90 : !BGE + ; Free Compass - AND #$0F : CMP #$08 : !BGE ++ - %ValueShift() - ORA CompassField : STA CompassField ; Compass 1 - JMP .done - ++ - !SUB #$08 - %ValueShift() - BIT.b #$C0 : BEQ +++ : LDA.b #$C0 : +++ ; Make Hyrule Castle / Sewers Count for Both - ORA CompassField+1 : STA CompassField+1 ; Compass 2 - JMP .done - + CMP.b #$90 : !BLT + : CMP.b #$A0 : !BGE + ; Free Big Key - AND #$0F : CMP #$08 : !BGE ++ - %ValueShift() - ORA BigKeyField : STA BigKeyField ; Big Key 1 - JMP .done - ++ - !SUB #$08 - %ValueShift() - BIT.b #$C0 : BEQ +++ : LDA.b #$C0 : +++ ; Make Hyrule Castle / Sewers Count for Both - ORA BigKeyField+1 : STA BigKeyField+1 ; Big Key 2 - JMP .done - + CMP.b #$A0 : !BLT + : CMP.b #$B0 : !BGE + ; Free Small Key - AND #$0F : TAX - LDA DungeonKeys, X : INC : STA DungeonKeys, X ; Increment Key Count - - CPX.b #$00 : BNE ++ - STA HyruleCastleKeys ; copy HC to sewers - ++ : CPX.b #$01 : BNE ++ - STA SewerKeys ; copy sewers to HC - ++ - - LDA.l GenericKeys : BEQ + - .generic - LDA CurrentSmallKeys : INC : STA CurrentSmallKeys - JMP .done - .normal - TXA : ASL : CMP $040C : BNE ++ - LDA CurrentSmallKeys : INC : STA CurrentSmallKeys - ++ - JMP .done - + CMP.b #$B0 : BNE + ; Bee Trap - LDA.b #$79 : JSL Sprite_SpawnDynamically : BMI ++ ; DashBeeHive_SpawnBee - LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y - LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8 - LDA $20 : STA $0D00, Y : LDA $21 : STA $0D20, Y - LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link - ++ JMP .done - + CMP.b #$B1 : BNE + ; Apples - LDA.b #$AC : JSL Sprite_SpawnDynamically : BMI ++ - LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y - LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8 - LDA.b $20 : SEC : SBC.b #$10 : STA.w $0D00,Y - LDA.b $21 : SBC.b #$00 : STA.w $0D20,Y ; move up 16 pixels - LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link - LDA.b #$FF : STA.w $0B58,Y ; allows them to expire - ++ JMP .done - + CMP.b #$B2 : BNE + ; Fairy - LDA.b #$E3 : JSL Sprite_SpawnDynamically : BMI ++ - LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y - LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8 - LDA.b $20 : SEC : SBC.b #$10 : STA.w $0D00,Y - LDA.b $21 : SBC.b #$00 : STA.w $0D20,Y ; move up 16 pixels - LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link - LDA.b #$FF : STA.w $0B58,Y ; allows them to expire - ++ BRA .done - + CMP.b #$B3 : BNE + ; Chicken - LDA.b #$0B : JSL Sprite_SpawnDynamically : BMI .done - LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y - LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8 - LDA.b $20 : SEC : SBC.b #$08 : STA.w $0D00,Y - LDA.b $21 : SBC.b #$00 : STA.w $0D20,Y ; move up 8 pixels - LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link - BRA .done - + CMP.b #$B4 : BNE + ; Big Magic - LDA.b #$80 : STA MagicFiller ; fill magic - BRA .done - + CMP.b #$B5 : BNE + ; Good Bee - LDA.b #$79 : JSL Sprite_SpawnDynamically : BMI .done - LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y - LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8 - LDA $20 : STA $0D00, Y : LDA $21 : STA $0D20, Y - LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link - JSL GoldBee_SpawnSelf_SetProperties - BRA .done - + - .done - PLX - LDA $02E9 : CMP.b #$01 ; thing we wrote over -RTL -; #$70 - Maps -; #$80 - Compasses -; #$90 - Big Keys -; #$A0 - Small Keys -;-------------------------------------------------------------------------------- -!SCRATCH_AREA = "$7F5020" -!SINGLE_INDEX_TEMP = "$7F5020" -!SINGLE_INDEX_OFFSET_TEMP = "$7F5021" -!SINGLE_INDEX_BITMASK_TEMP = "$7F5022" -!LOCK_IN = "$7F5090" -!ITEM_BUSY = "$7F5091" -;2B:Bottle Already Filled w/ Red Potion -;2C:Bottle Already Filled w/ Green Potion -;2D:Bottle Already Filled w/ Blue Potion -;3C:Bottle Already Filled w/ Bee -;3D:Bottle Already Filled w/ Fairy -;48:Bottle Already Filled w/ Gold Bee AddReceivedItemExpanded: -{ PHA : PHX - LDA RemoteItems : BEQ + : LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ + - LDA $02E9 : BEQ ++ : CMP #$03 : BNE +++ : ++ + LDA.l RemoteItems : BEQ + : LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ + + LDA.w ItemReceiptMethod : BEQ ++ : CMP.b #$03 : BNE +++ : ++ ; fromTextOrObject - LDA $0345 : BEQ ++ : LDA.b #$04 : ++ : STA $5D ; Restore Link to his swimming state - STZ $02DA : STZ $037B : STZ $02E4 - LDA #$0E : STA $012F + LDA.w $0345 : BEQ ++ : LDA.b #$04 : ++ : STA.b LinkState ; Restore Link to his swimming state + STZ.w ItemReceiptPose : STZ.w NoDamage : STZ.w CutsceneFlag + LDA.b #$0E : STA.w SFX3 +++ - STZ $02D8 : STZ $02D9 : STZ $02E9 + STZ.w ItemReceiptID : STZ.w ItemReceiptID+1 : STZ.w ItemReceiptMethod PHY : LDY.b #$00 : JSL AddInventory : PLY PLX : PLA : RTL - + + + PLX : PLA + JSR ResolveReceipt + PHB : PHK +JML AddReceivedItem+2 - JSL.l PreItemGet +AddReceivedItemExpandedGetItem: + PHX : PHB - LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE + - LDA $02D8 - JSR AttemptItemSubstitution - STA $02D8 + LDA.w ItemReceiptID + JSL FreeDungeonItemNotice + PHA : LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BEQ + + PLA : BRA .done + + PLA + JSR ItemBehavior + SEP #$30 +.done + PLB : PLX + LDA.w ItemReceiptMethod : CMP.b #$01 ; thing we wrote over +RTL - JSR IncrementItemCounters - + - LDA $02D8 ; Item Value - STA !MULTIWORLD_ITEM_ID +ItemBehavior: + REP #$30 + AND #$00FF : ASL : TAX + SEP #$20 + JMP.w (ItemReceipts_behavior,X) - CMP.b #$16 : BEQ .bottle ; Bottle - CMP.b #$2B : BEQ .bottle ; Red Potion w/bottle - CMP.b #$2C : BEQ .bottle ; Green Potion w/bottle - CMP.b #$2D : BEQ .bottle ; Blue Potion w/bottle - CMP.b #$3C : BEQ .bottle ; Bee w/bottle - CMP.b #$3D : BEQ .bottle ; Fairy w/bottle - CMP.b #$48 : BEQ .bottle ; Gold Bee w/bottle - BRA .notBottle - .bottle - JSR.w CountBottles : CMP.l BottleLimit : !BLT +++ - LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE +++ - LDA.l BottleLimitReplacement : STA $02D8 - +++ : JMP .done - .notBottle - ++ : CMP.b #$4E : BNE ++ ; Progressive Magic - LDA MagicConsumption : BEQ +++ - LDA.b #$4F : STA $02D8 - +++ : JMP .done - ++ : CMP.b #$5E : BNE ++ ; Progressive Sword - LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE + - LDA HighestSword : CMP.l ProgressiveSwordLimit : !BLT + - LDA.l ProgressiveSwordReplacement : STA $02D8 : JMP .done - + - LDA SwordEquipment : CMP.b #$FF : BNE + ; Swordless - LDA.b #$49 : STA $02D8 : JMP .done - + : CMP.b #$00 : BNE + ; No Sword - LDA.b #$49 : STA $02D8 : JMP .done - + : CMP.b #$01 : BNE + ; Fighter Sword - LDA.b #$50 : STA $02D8 : JMP .done - + : CMP.b #$02 : BNE + ; Master Sword - LDA.b #$02 : STA $02D8 : JMP .done - + ; Everything Else - LDA.b #$03 : STA $02D8 : JMP .done - ++ : CMP.b #$5F : BNE ++ ; Progressive Shield - LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ + - LDA ShieldEquipment : BNE +++ ; No Shield - LDA.b #$04 : STA $02D8 : JMP .done - +++ : CMP.b #$40 : BNE +++ ; Fighter Shield - LDA.b #$05 : STA $02D8 : JMP .done - +++ ; Everything Else - LDA.b #$06 : STA $02D8 : JMP .done - + - LDA HighestShield : CMP.l ProgressiveShieldLimit : !BLT + - LDA.l ProgressiveShieldReplacement : STA $02D8 : JMP .done - + - LDA HighestShield : BNE + ; No Shield - LDA.b #$04 : BRA .shielddone - + : CMP.b #$01 : BNE + ; Fighter Shield - LDA.b #$05 : BRA .shielddone - + ; Everything Else - LDA.b #$06 - .shielddone : STA $02D8 - JMP .done - ++ : CMP.b #$60 : BNE ++ ; Progressive Armor - LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE + - LDA HighestMail : CMP.l ProgressiveArmorLimit : !BLT + - LDA.l ProgressiveArmorReplacement : STA $02D8 : JMP .done - + - LDA ArmorEquipment : CMP.b #$00 : BNE + ; No Armor - LDA.b #$22 : STA $02D8 : JMP .done - + ; Everything Else - LDA.b #$23 : STA $02D8 : JMP .done - ++ : CMP.b #$61 : BNE ++ ; Progressive Lifting Glove - LDA GloveEquipment : BNE + ; No Lift - LDA.b #$1B : STA $02D8 : JMP .done - + ; Everything Else - LDA.b #$1C : STA $02D8 : JMP .done - ++ : CMP.b #$64 : BNE ++ : -- ; Progressive Bow - LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE + - LDA BowEquipment : INC : LSR : CMP.l ProgressiveBowLimit : !BLT + - LDA.l ProgressiveBowReplacement : STA $02D8 : JMP .done - + LDA BowEquipment : INC : LSR : CMP.b #$00 : BNE + ; No Bow - LDA.b #$3A : STA $02D8 : BRA .done - + ; Any Bow - LDA.b #$3B : STA $02D8 : BRA .done - ++ : CMP.b #$65 : BNE ++ ; Progressive Bow 2 - LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE +++ - LDA.l BowTracking : ORA #$20 : STA.l BowTracking - +++ : BRA -- - ; ++ : CMP.b #$FE : BNE ++ ; Server Request (Null Chest) - ; JSL ChestItemServiceRequest - ; BRA .done - ++ : CMP.b #$62 : BNE ++ ; RNG Item (Single) - JSL.l GetRNGItemSingle : STA $02D8 - XBA : JSR.w MarkRNGItemSingle - LDA #$FF : STA !LOCK_IN ; clear lock-in - BRA .done - ++ : CMP.b #$63 : BNE ++ ; RNG Item (Multi) - JSL.l GetRNGItemMulti : STA $02D8 - LDA #$FF : STA !LOCK_IN ; clear lock-in - BRA .done - ++ : CMP.b #$B0 : BNE ++ ; Bee Trap - LDA !MULTIWORLD_ITEM_PLAYER_ID : BEQ +++ - LDA.b #$0E : STA $02D8 : BRA .done ; Bee in a bottle - +++ - ++ - .done - PLX : PLA + .skip + RTS + + .blue_boomerang + LDA.l InventoryTracking : ORA.b #$80 + BRA .store_inventory_tracking + + .red_boomerang + LDA.l InventoryTracking : ORA.b #$40 + BRA .store_inventory_tracking + + .mushroom + LDA.l InventoryTracking : ORA.b #$28 + BRA .store_inventory_tracking + + .powder + LDA.l InventoryTracking : ORA.b #$10 + BRA .store_inventory_tracking + + .flute_inactive + LDA.l InventoryTracking : ORA.b #$02 + BRA .store_inventory_tracking + + .flute_active + LDA.l InventoryTracking : ORA.b #$01 + BRA .store_inventory_tracking + + .shovel + LDA.l InventoryTracking : ORA.b #$04 + + .store_inventory_tracking + STA.l InventoryTracking + RTS + + .sword_shield + SEP #$10 + LDX.b #$01 + JSR .increment_sword + JSR .increment_shield + RTS + + .master_sword + SEP #$10 + LDX.b #$02 + JSR .increment_sword + RTS + + .tempered_sword + SEP #$10 + LDX.b #$03 + JSR .increment_sword + RTS + + .gold_sword + SEP #$10 + LDX.b #$04 + JSR .increment_sword + RTS + + .fighter_shield + .red_shield + .mirror_shield + SEP #$10 + LDA.l ProgressiveFlag : BEQ + + LDA.l HighestShield : INC : TAX + JSR .increment_shield + + RTS + + .blue_mail + SEP #$10 + LDX.b #$01 + JSR .increment_mail + REP #$10 + RTS + + .red_mail + SEP #$10 + LDX.b #$02 + JSR .increment_mail + REP #$10 + RTS + + .fighter_sword + SEP #$10 + LDX.b #$01 + JSR .increment_sword + REP #$10 + RTS + + .prog_sword + SEP #$10 + LDA.l SwordEquipment : INC : TAX + JSR .increment_sword + REP #$10 + RTS + + .prog_shield + SEP #$10 + LDA.l HighestShield : INC : TAX + JSR .increment_shield + REP #$10 + RTS + + .prog_mail + SEP #$10 + LDA.l ArmorEquipment : INC : TAX + JSR .increment_mail + REP #$10 + RTS + + .bow + BIT #$40 : BNE .silversbow + LDA.b #$01 : STA.l BowEquipment + RTS + + .silversbow + LDA.l BowTracking : ORA.b #$40 : STA.l BowTracking + LDA.l SilverArrowsUseRestriction : BNE + + LDA.b #03 : STA.l BowEquipment ; set bow to silver + + + LDA.b #$01 : STA.l BowEquipment + RTS + + .dungeon_compass + REP #$20 + LDA.w DungeonID : CMP.w #$0003 : BCC ..hc_sewers + TAX + LDA.l DungeonItemMasks,X : TAY + ORA.l CompassField : STA.l CompassField + JMP.w .increment_compass + ..hc_sewers + LDA.w #$C000 : TAY + ORA.l CompassField : STA.l CompassField + JMP.w .increment_compass + + + .dungeon_bigkey + REP #$20 + LDA.w DungeonID : CMP.w #$0003 : BCC ..hc_sewers + TAX + LDA.l DungeonItemMasks,X : ORA.l BigKeyField : STA.l BigKeyField + JMP.w .increment_bigkey + ..hc_sewers + LDA.w #$C000 : ORA.l BigKeyField : STA.l BigKeyField + JMP.w .increment_bigkey + + .dungeon_map + REP #$20 + LDA.w DungeonID : CMP.w #$0003 : BCC ..hc_sewers + TAX + LDA.l DungeonItemMasks,X : TAY + ORA.l MapField : STA.l MapField + JMP.w .increment_map + ..hc_sewers + LDA.w #$C000 : TAY + ORA.l MapField : STA.l MapField + JMP.w .increment_map + + .bow_and_arrows + LDA.l BowTracking : BIT.b #$40 : BEQ .no_silvers + LDA.l SilverArrowsUseRestriction : BNE .no_silvers + LDA.l CurrentArrows : BEQ + + LDA.b #04 : STA.l BowEquipment + BRA .store_bow + + + LDA.b #$03 + BRA .store_bow + .no_silvers + LDA.l CurrentArrows : BEQ + + LDA.b #02 + BRA .store_bow + + + LDA.b #$01 + .store_bow + STA.l BowEquipment + RTS + + .silver_bow + LDA.b #$40 : ORA.l BowTracking : STA.l BowTracking + LDA.l SilverArrowsUseRestriction : BNE .noequip + LDA.l SilverArrowsAutoEquip : AND.b #$01 : BEQ .noequip + LDA.l CurrentArrows : BNE + ; check arrows + LDA.b #$03 : BRA ++ ; bow without arrow + + + LDA.b #$04 ; bow with arrow + ++ + STA.l BowEquipment + .noequip + RTS + + .bombs_50 + LDA.b #50 : STA.l BombCapacity ; upgrade bombs + LDA.b #50 : STA.l BombsFiller ; fill bombs + RTS + + .arrows_70 + LDA.b #70 : STA.l ArrowCapacity ; upgrade arrows + LDA.b #70 : STA.l ArrowsFiller ; fill arrows + RTS + + .magic_2 + LDA.l MagicConsumption : CMP.b #$02 : !BGE + + INC : STA.l MagicConsumption ; upgrade magic + + + LDA.b #$80 : STA.l MagicFiller ; fill magic + RTS + + .magic_4 + LDA.b #$02 : STA.l MagicConsumption ; upgrade magic + LDA.b #$80 : STA.l MagicFiller ; fill magic + RTS + + .master_sword_safe + SEP #$10 + LDA.l SwordEquipment : CMP.b #$02 : !BGE + ; skip if we have a better sword + LDA.b #$02 : STA.l SwordEquipment ; set master sword + + + LDX.b #$02 + JSR .increment_sword + RTS + + .bombs_5 + LDA.l BombCapacity : !ADD.b #$05 : STA.l BombCapacity ; upgrade bombs +5 + LDA.l Upgrade5BombsRefill : STA.l BombsFiller ; fill bombs + RTS + + .bombs_10 + LDA.l BombCapacity : !ADD.b #$0A : STA.l BombCapacity ; upgrade bombs +10 + LDA.l Upgrade10BombsRefill : STA.l BombsFiller ; fill bombs + RTS + + .arrows_5 + LDA.l ArrowCapacity : !ADD.b #$05 : STA.l ArrowCapacity ; upgrade arrows +5 + LDA.l Upgrade5ArrowsRefill : STA.l ArrowsFiller ; fill arrows + RTS + + .arrows_10 + LDA.l ArrowCapacity : !ADD.b #$0A : STA.l ArrowCapacity ; upgrade arrows +10 + LDA.l Upgrade10ArrowsRefill : STA.l ArrowsFiller ; fill arrows + RTS + + .programmable_1 + %ProgrammableItemLogic(1) + RTS + + .programmable_2 + %ProgrammableItemLogic(2) + RTS + + .programmable_3 + %ProgrammableItemLogic(3) + RTS + + .silver_arrows + LDA.l BowTracking : ORA.b #$40 : STA.l BowTracking + LDA.l SilverArrowsUseRestriction : BNE ++ + LDA.l SilverArrowsAutoEquip : AND.b #$01 : BEQ ++ + LDA.l BowEquipment : BEQ ++ : CMP.b #$03 : !BGE + + !ADD.b #$02 : STA.l BowEquipment ; switch to silver bow + + + ++ + LDA.l ArrowMode : BEQ + + LDA.b #$01 : STA.l ArrowsFiller + + + RTS + + .single_arrow + LDA.l ArrowMode : BEQ + + LDA.l CurrentArrows : INC : STA.l CurrentArrows ; Should be sole write to this address + INC.w UpdateHUDFlag ; in retro/rupee bow mode. + + + RTS + + .rupoor + REP #$20 : LDA.l CurrentRupees : !SUB RupoorDeduction : STA.l CurrentRupees : SEP #$20 ; Take 1 rupee + RTS + + .null + RTS + + .red_clock + REP #$20 ; set 16-bit accumulator + LDA.l ChallengeTimer : !ADD.l RedClockAmount : STA.l ChallengeTimer + LDA.l ChallengeTimer+2 : ADC.l RedClockAmount+2 : STA.l ChallengeTimer+2 + SEP #$20 ; set 8-bit accumulator + RTS + + .blue_clock + REP #$20 ; set 16-bit accumulator + LDA.l ChallengeTimer : !ADD.l BlueClockAmount : STA.l ChallengeTimer + LDA.l ChallengeTimer+2 : ADC.l BlueClockAmount+2 : STA.l ChallengeTimer+2 + SEP #$20 ; set 8-bit accumulator + RTS + + .green_clock + REP #$20 ; set 16-bit accumulator + LDA.l ChallengeTimer : !ADD.l GreenClockAmount : STA.l ChallengeTimer + LDA.l ChallengeTimer+2 : ADC.l GreenClockAmount+2 : STA.l ChallengeTimer+2 + SEP #$20 ; set 8-bit accumulator + RTS + + .triforce + JSL ActivateGoal + RTS + + .goal_item + REP #$20 ; set 16-bit accumulator + LDA.l GoalItemRequirement : BEQ + + LDA.l GoalCounter : INC : STA.l GoalCounter + CMP.w GoalItemRequirement : BCC + + LDA.l TurnInGoalItems : AND.w #$00FF : BNE + + JSL ActivateGoal + + + SEP #$20 ; set 8-bit accumulator + RTS + + .request_F0 + JSL ItemGetServiceRequest_F0 + RTS + + .request_F1 + JSL ItemGetServiceRequest_F1 + RTS + + .request_F2 + JSL ItemGetServiceRequest_F2 + RTS + + .request_async + ; JSL ItemGetServiceRequest + RTS + + .free_map + REP #$20 + LSR + AND.w #$000F : ASL : TAX + LDA.w DungeonItemIDMap,X : TAX + LDA.l DungeonItemMasks,X : TAY + ORA.l MapField : STA.l MapField + SEP #$20 + JMP.w .increment_map + + .hc_map + REP #$20 + LDA.w #$C000 : TAY + ORA.l MapField : STA.l MapField + JMP.w .increment_map + + .free_compass + REP #$20 + LSR + AND.w #$000F : ASL : TAX + LDA.w DungeonItemIDMap,X : TAX + LDA.l DungeonItemMasks,X : TAY + ORA.l CompassField : STA.l CompassField + SEP #$20 + JMP.w .increment_compass + + .hc_compass + REP #$20 + LDA.w #$C000 : TAY + ORA.l CompassField : STA.l CompassField + SEP #$20 + JMP.w .increment_compass + + .free_bigkey + REP #$20 + LSR + AND.w #$000F : ASL : TAX + LDA.w DungeonItemIDMap,X : TAX + LDA.l DungeonItemMasks,X : ORA.l BigKeyField : STA.l BigKeyField + SEP #$20 + JMP.w .increment_bigkey + + .hc_bigkey + LDA.b #$C0 : ORA.l BigKeyField+1 : STA.l BigKeyField+1 + JMP.w .increment_bigkey + + .free_smallkey + REP #$20 + LSR + AND.w #$000F : TAX + ASL : CMP.w DungeonID : BEQ .same_dungeon + LDA.l DungeonKeys,X : INC : STA.l DungeonKeys,X + RTS + .same_dungeon + SEP #$20 + LDA.l CurrentSmallKeys : INC : STA.l CurrentSmallKeys : STA.l DungeonKeys,X + RTS + + .same_dungeon_hc + SEP #$20 + LDA.l CurrentSmallKeys : INC : STA.l CurrentSmallKeys + LDA.l SewerKeys : INC + STA.l SewerKeys : STA.l HyruleCastleKeys + RTS + + .hc_smallkey + LDA.w DungeonID : CMP.b #$03 : BCC .same_dungeon_hc + LDA.l HyruleCastleKeys : INC : STA.l HyruleCastleKeys + LDA.l SewerKeys : INC : STA.l SewerKeys + RTS + + .generic_smallkey + LDA.l GenericKeys : BEQ .normal + LDA.l CurrentSmallKeys : INC + STA.l CurrentGenericKeys : STA.l CurrentSmallKeys + RTS + .normal + LDA.w DungeonID : BMI + + LDA.l CurrentSmallKeys : INC : STA.l CurrentSmallKeys + RTS + + + RTS + + .increment_sword + LDA.l HighestSword + INC : STA.b Scrap04 : CPX.b Scrap04 : BCC + ; don't increment unless we're getting a better sword + TXA : STA.l HighestSword + + + RTS + + .increment_shield + LDA.l HighestShield + INC : STA.b Scrap04 : CPX.b Scrap04 : BCC + ; don't increment unless we're getting a better shield + TXA : STA.l HighestShield + + + RTS + + .increment_mail + LDA.l HighestMail + INC : STA.b Scrap04 : CPX.b Scrap04 : BCC + ; don't increment unless we're getting a better mail + TXA : STA.l HighestMail + + + RTS + + .increment_bigkey + SEP #$20 + LDA.l StatsLocked : BNE + + LDA.l BigKeysBigChests + CLC : ADC.b #$10 + STA.l BigKeysBigChests + + + RTS + + .increment_map + SEP #$20 + LDA.l StatsLocked : BNE + + LDA.l MapsCompasses + CLC : ADC.b #$10 + STA.l MapsCompasses + JSL MaybeFlagMapTotalPickup + + + RTS + + .increment_compass + SEP #$20 + LDA.l StatsLocked : BNE + + LDA.l MapsCompasses : INC : AND.b #$0F : TAX + LDA.l MapsCompasses : AND.b #$F0 : STA.l MapsCompasses + TXA : ORA.l MapsCompasses : STA.l MapsCompasses + JSL MaybeFlagCompassTotalPickup + + + RTS + + .pendant + SEP #$20 + LSR + SEC : SBC.b #$37 + TAX + LDA.w PendantMasks,X : AND.l PendantsField : BNE + + LDA.l PendantCounter : INC : STA.l PendantCounter + + + RTS + + .dungeon_crystal + SEP #$20 + LDA.l CrystalCounter : INC : STA.l CrystalCounter + RTS + + .free_crystal + REP #$20 + LSR + AND.w #$000F : TAX + LDA.w #$0000 + SEC + - + ROL + DEX + BPL - + SEP #$20 + TAX + AND.l CrystalsField : BNE + + TXA + ORA.l CrystalsField : STA.l CrystalsField + LDA.l CrystalCounter : INC : STA.l CrystalCounter + + + .done + RTS + + .refill_magic + SEP #$30 : LDA.b #$80 : STA.l MagicFiller : RTS + + .bee_trap + SEP #$30 + LDA.b #$79 : JSL Sprite_SpawnDynamically : BMI + ; DashBeeHive_SpawnBee + LDA.b LinkPosX : CLC : ADC.b #$03 : AND.b #$F8 : STA.w SpritePosXLow,Y + LDA.b LinkPosX+1 : ADC.b #$00 : STA.w SpritePosXHigh,Y ; round X to nearest 8 + LDA.b LinkPosY : STA.w SpritePosYLow, Y : LDA.b LinkPosY+1 : STA.w SpritePosYHigh, Y + LDA.b LinkLayer : STA.w SpriteLayer,Y ; spawns on same layer as link + + + RTS + + .good_bee + SEP #$30 + LDA.b #$79 : JSL Sprite_SpawnDynamically : BMI + ; DashBeeHive_SpawnBee + LDA.b LinkPosX : CLC : ADC.b #$03 : AND.b #$F8 : STA.w SpritePosXLow,Y + LDA.b LinkPosX+1 : ADC.b #$00 : STA.w SpritePosXHigh,Y ; round X to nearest 8 + LDA.b LinkPosY : STA.w SpritePosYLow, Y : LDA.b LinkPosY+1 : STA.w SpritePosYHigh, Y + LDA.b LinkLayer : STA.w SpriteLayer,Y ; spawns on same layer as link + JSL GoldBee_SpawnSelf_SetProperties + + + RTS + + .apples + SEP #$30 + LDA.b #$AC : JSL Sprite_SpawnDynamically : BMI + + LDA.b LinkPosX : CLC : ADC.b #$03 : AND.b #$F8 : STA.w SpritePosXLow,Y + LDA.b LinkPosX+1 : ADC.b #$00 : STA.w SpritePosXHigh,Y ; round X to nearest 8 + LDA.b LinkPosY : SEC : SBC.b #$10 : STA.w SpritePosYLow,Y + LDA.b LinkPosY+1 : SBC.b #$00 : STA.w SpritePosYHigh,Y ; move up 16 pixels + LDA.b LinkLayer : STA.w SpriteLayer,Y ; spawns on same layer as link + LDA.b #$FF : STA.w EnemyStunTimer,Y ; allows them to expire + + + RTS + + .fairy + SEP #$30 + LDA.b #$E3 : JSL Sprite_SpawnDynamically : BMI + + LDA.b LinkPosX : CLC : ADC.b #$03 : AND.b #$F8 : STA.w SpritePosXLow,Y + LDA.b LinkPosX+1 : ADC.b #$00 : STA.w SpritePosXHigh,Y ; round X to nearest 8 + LDA.b LinkPosY : SEC : SBC.b #$10 : STA.w SpritePosYLow,Y + LDA.b LinkPosY+1 : SBC.b #$00 : STA.w SpritePosYHigh,Y ; move up 16 pixels + LDA.b LinkLayer : STA.w SpriteLayer,Y ; spawns on same layer as link + LDA.b #$FF : STA.w EnemyStunTimer,Y ; allows them to expire + + + RTS + + .chicken + SEP #$30 + LDA.b #$0B : JSL Sprite_SpawnDynamically : BMI + + LDA.b LinkPosX : CLC : ADC.b #$03 : AND.b #$F8 : STA.w SpritePosXLow,Y + LDA.b LinkPosX+1 : ADC.b #$00 : STA.w SpritePosXHigh,Y ; round X to nearest 8 + LDA.b LinkPosY : SEC : SBC.b #$08 : STA.w SpritePosYLow,Y + LDA.b LinkPosY+1 : SBC.b #$00 : STA.w SpritePosYHigh,Y ; move up 8 pixels + LDA.b LinkLayer : STA.w SpriteLayer,Y ; spawns on same layer as link + + + RTS + +ResolveReceipt: + PHA : PHX + PHK : PLB + JSL PreItemGet + LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE + + LDA.w ItemReceiptID + .get_item + JSL AttemptItemSubstitution + JSR HandleBowTracking + + + LDA.w ItemReceiptID + STA.l !MULTIWORLD_ITEM_ID + JSR ResolveLootID + .have_item + STA.w ItemReceiptID + LDA.l !MULTIWORLD_ITEM_PLAYER_ID : BNE + + LDA.w ItemReceiptID + JSR IncrementItemCounters + + + PLX : PLA + RTS + +ResolveLootIDLong: + PHY + JSR ResolveLootID + PLY +RTL + +ResolveLootID: +; In: A - Loot ID +; Out: A - Resolved Loot ID +; Caller is responsible for running AttemptItemSubstitution prior if applicable. + + PHX : PHB + PHK : PLB + .get_item + TAY + REP #$30 + AND.w #$00FF : ASL : TAX + TYA + JMP.w (ItemReceipts_resolution,X) + .have_item + SEP #$30 + PLB : PLX + RTS + + .skip + JMP.w .have_item + + .bottles + SEP #$30 + JSR CountBottles : CMP.l BottleLimit : BCC + + LDA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID : BNE + + LDA.l BottleLimitReplacement + JMP.w .get_item + + + TYA + JMP.w .have_item + + .magic + SEP #$20 + LDA.l MagicConsumption : TAX + LDA.w .magic_ids,X + JMP.w .have_item + ..ids + db $4E, $4F, $4F + + .prog_sword + SEP #$20 + LDA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID : BNE ++ + LDA.l HighestSword + CMP.l ProgressiveSwordLimit : BCC + + LDA.l ProgressiveSwordReplacement + JMP.w .get_item + ++ LDA.l SwordEquipment + + + TAX + LDA.w .prog_sword_ids,X + JMP.w .have_item + ..ids + db $49, $50, $02, $03, $03 + + .shields + SEP #$20 + LDA !MULTIWORLD_SPRITEITEM_PLAYER_ID : BNE ++ + LDA.b #$01 : STA.l ProgressiveFlag + LDA.l HighestShield + CMP.l ProgressiveShieldLimit : BCC + + LDA.l ProgressiveShieldReplacement + JMP.w .get_item + ++ LDA.l HighestShield + + + TAX + LDA.w .shields_ids,X + JMP.w .have_item + ..ids + db $04, $05, $06, $06 + + .armor + SEP #$20 + LDA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID : BNE ++ + LDA.l HighestMail + CMP.l ProgressiveArmorLimit : BCC + + LDA.l ProgressiveArmorReplacement + JMP.w .get_item + + + ++ LDA.l ArmorEquipment + TAX + LDA.w .armor_ids,X + JMP.w .have_item + ..ids + db $22, $23, $23 + + + .gloves + SEP #$20 + LDA.l GloveEquipment : TAX + LDA.w .gloves_ids,X + JMP.w .have_item + ..ids + db $1B, $1C, $1C + + .progressive_bow + ; For non-chest progressive bows we assign the tracking bits to SpriteMetaData,X + ; (where X is that sprite's slot) so the bit can be set on pickup. + SEP #$30 + LDA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID : BNE .skipbowlimit + LDA.l BowEquipment : INC : LSR : CMP.l ProgressiveBowLimit : BCC + + LDA.l ProgressiveBowReplacement + JMP.w .get_item + + + LDA.w ItemReceiptMethod : CMP.b #$01 : BEQ + + LDX.w CurrentSpriteSlot + LDA.b #$10 : STA.w SpriteMetaData,X + + + .skipbowlimit + LDA.l BowEquipment : TAX + LDA.w ResolveLootID_bows_ids,X + JMP.w .get_item + + .progressive_bow_2 + SEP #$30 + LDA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID : BNE .skipbowlimit_2 + LDA.l BowEquipment : INC : LSR : CMP.l ProgressiveBowLimit : BCC + + LDA.l ProgressiveBowReplacement + JMP.w .get_item + + + LDA.w ItemReceiptMethod : CMP.b #$01 : BEQ + + LDX.w CurrentSpriteSlot + LDA.b #$20 : STA.w SpriteMetaData,X + .skipbowlimit_2 + + + LDA.l BowEquipment : TAX + LDA.w ResolveLootID_bows_ids,X + JMP.w .get_item + + .bows + ..ids + db $3A, $3B, $3B, $3B, $3B + + .null_chest + ; JSL ChestItemServiceRequest + JMP.w .have_item + + .rng_single + JSL GetRNGItemSingle : STA.w ScratchBufferV+6 + XBA : JSR MarkRNGItemSingle + LDA.b #$FF : STA.l RNGLockIn ; clear lock-in + LDA.w ScratchBufferV+6 : JMP.w .get_item + + .rng_multi + JSL GetRNGItemMulti : STA.w ScratchBufferV+6 + LDA.b #$FF : STA.l RNGLockIn ; clear lock-in + LDA.w ScratchBufferV+6 : JMP.w .get_item - PHB : PHK ; we're skipping the corresponding instructions to grab the data bank - JML.l AddReceivedItem+2 -} ;-------------------------------------------------------------------------------- -;DATA AddReceivedItemExpanded -{ -; This is a temporary measure for Fish to have consistent addresses -warnpc $A08A00 -org $A08A00 - -.y_offsets - db -5, -5, -5, -5, -5, -4, -4, -5 - db -5, -4, -4, -4, -2, -4, -4, -4 - - db -4, -4, -4, -4, -4, -4, -4, -4 - db -4, -4, -4, -4, -4, -4, -4, -4 - - db -4, -4, -4, -5, -4, -4, -4, -4 - db -4, -4, -2, -4, -4, -4, -4, -4 - - db -4, -4, -4, -4, -2, -2, -2, -4 - db -4, -4, -4, -4, -4, -4, -4, -4 - - db -4, -4, -2, -2, -4, -2, -4, -4 - db -4, -5, -4, -4 - ;new - db -4, -4, -4, -4 - db -5 ; Master Sword (Safe) - db -4, -4, -4, -4 ; +5/+10 Bomb Arrows - db -4, -4, -4 ; 3x Programmable Item - db -4 ; Upgrade-Only Sivler Arrows - db -4 ; 1 Rupoor - db -4 ; Null Item - db -4, -4, -4 ; Red, Blue & Green Clocks - db -4, -4, -4, -4 ; Progressive Sword, Shield, Armor & Gloves - db -4, -4 ; RNG Single & Multi - db -4, -4 ; Progressive Bow x2 - db -4, -4, -4, -4 ; Unused - db -4, -4, -4 ; Goal Item Single, Multi & Alt Multi - db -4, -4, -4 ; Unused - db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Map - db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Compass - db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Big Key - db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Small Key - db -4 ; Bee Trap - db -4 ; Apples - db -4 ; Fairy - db -4 ; Chicken - db -4 ; Big Magic - db -4 ; Good Bee - db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused - db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused - db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused - db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused - -.x_offsets - db 4, 4, 4, 4, 4, 0, 0, 4 - db 4, 4, 4, 4, 5, 0, 0, 0 - - db 0, 0, 0, 4, 0, 4, 0, 0 - db 4, 0, 0, 0, 0, 0, 0, 0 - - db 0, 0, 0, 0, 4, 0, 0, 0 - db 0, 0, 5, 0, 0, 0, 0, 0 - - db 0, 0, 0, 0, 4, 4, 4, 0 - db 0, 0, 0, 0, 0, 0, 0, 0 - - db 0, 0, 4, 4, 0, 4, 0, 0 - db 0, 4, 0, 0 - ;new - db 0, 0, 0, 0 - db 4 ; Master Sword (Safe) - db 0, 0, 0, 0 ; +5/+10 Bomb Arrows - db 0, 0, 0 ; 3x Programmable Item - db 0 ; Upgrade-Only Sivler Arrows - db 4 ; 1 Rupoor - db 0 ; Null Item - db 0, 0, 0 ; Red, Blue & Green Clocks - db 0, 0, 0, 0 ; Progressive Sword, Shield, Armor & Gloves - db 0, 0 ; RNG Single & Multi - db 0, 0 ; Progressive Bow x2 - db 0, 0, 0, 0 ; Unused - db 0, 0, 0 ; Goal Item Single, Multi & Alt Multi - db 0, 0, 0 ; Unused - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Free Map - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Free Compass - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Free Big Key - ;db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; *EVENT* - db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Small Key - db 0 ; Bee Trap - db 0 ; Apples - db 0 ; Fairy - db 0 ; Chicken - db 4 ; Big Magic - db 0 ; Good Bee - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused - -.item_graphics_indices - db $06, $18, $18, $18, $2D, $20, $2E, $09 - db $09, $0A, $08, $05, $10, $0B, $2C, $1B - - db $1A, $1C, $14, $19, $0C, $07, $1D, $2F - db $07, $15, $12, $0D, $0D, $0E, $11, $17 - - db $28, $27, $04, $04, $0F, $16, $03, $13 - db $01, $1E, $10, $00, $00, $00, $00, $00 - - db $00, $30, $22, $21, $24, $24, $24, $23 - db $23, $23, $29, $2A, $2C, $2B, $03, $03 - - db $34, $35, $31, $33, $02, $32, $36, $37 - db $2C, $06, $0C, $38 - ;new - db $39, $3A, $3B, $3C - ;5x - db $18 ; Master Sword (Safe) - db $3D, $3E, $3F, $40 ; +5/+10 Bomb Arrows - db $00, $00, $00 ; 3x Programmable Item - db $41 ; Upgrade-Only Sivler Arrows - db $24 ; 1 Rupoor - db $47 ; Null Item - db $48, $48, $48 ; Red, Blue & Green Clocks - db $FF, $FF, $04, $0D ; Progressive Sword, Shield, Armor & Gloves - db $FF, $FF ; RNG Single & Multi - db $FF, $FF ; Progressive Bow x2 - db $FF, $FF, $FF, $FF ; Unused - db $49, $4A, $49 ; Goal Item Single, Multi & Alt Multi - db $FF, $FF, $FF ; Unused - db $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21 ; Free Map - db $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16 ; Free Compass - db $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22 ; Free Big Key - db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F ; Free Small Key - ;db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; *EVENT* - ;db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; *EVENT* - ;db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; *EVENT* - ;db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; *EVENT* - - db $47 ; Bee Trap - db $47 ; Apples - db $47 ; Fairy - db $47 ; Chicken - db $3B ; Big Magic - db $47 ; Good Bee - db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused - db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused - db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused - db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused - -.wide_item_flag - db $00, $00, $00, $00, $00, $02, $02, $00 - db $00, $00, $00, $00, $00, $02, $02, $02 - - db $02, $02, $02, $00, $02, $00, $02, $02 - db $00, $02, $02, $02, $02, $02, $02, $02 - - db $02, $02, $02, $02, $00, $02, $02, $02 - db $02, $02, $00, $02, $02, $02, $02, $02 - - db $02, $02, $02, $02, $00, $00, $00, $02 - db $02, $02, $02, $02, $02, $02, $02, $02 - - db $02, $02, $00, $00, $02, $00, $02, $02 - db $02, $00, $02, $02 - ;new - db $02, $02, $02, $02 - db $00 ; Master Sword (Safe) - db $02, $02, $02, $02 ; +5/+10 Bomb Arrows - db $02, $02, $02 ; 3x Programmable Item - db $02 ; Upgrade-Only Sivler Arrows - db $00 ; 1 Rupoor - db $02 ; Null Item - db $02, $02, $02 ; Red, Blue & Green Clocks - db $02, $02, $02, $02 ; Progressive Sword, Shield, Armor & Gloves - db $02, $02 ; RNG Single & Multi - db $02, $02 ; Progressive Bow x2 - db $02, $02, $02, $02 ; Unused - db $02, $02, $02 ; Goal Item Single, Multi & Alt Multi - db $02, $02, $02 ; Unused - db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Free Map - db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Free Compass - db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Free Big Key - db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; Free Small Key - db $02 ; Bee Trap - db $02 ; Apples - db $02 ; Fairy - db $02 ; Chicken - db $00 ; Big Magic - db $02 ; Good Bee - - db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused - db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused - db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused - db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused - db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused - -.properties - db 5, -1, 5, 5, 5, 5, 5, 1 - db 2, 1, 1, 1, 2, 2, 2, 4 - - db 4, 4, 1, 1, 2, 1, 1, 1 - db 2, 1, 2, 1, 4, 4, 2, 1 - - db 6, 1, 2, 1, 2, 2, 1, 2 - db 2, 4, 1, 1, 4, 2, 1, 4 - - db 2, 2, 4, 4, 4, 2, 1, 4 - db 1, 2, 2, 1, 2, 2, 1, 1 - - db 4, 4, 1, 2, 2, 4, 4, 4 - db 2, 5, 2, 1 - ;new - db 4, 4, 4, 4 - db 5 ; Master Sword (Safe) - db 4, 4, 4, 4 ; +5/+10 Bomb Arrows - db 4, 4, 4 ; 3x Programmable Item - db 1 ; Upgrade-Only Sivler Arrows - db 3 ; 1 Rupoor - db 1 ; Null Item - db 1, 2, 4 ; Red, Blue & Green Clocks - db $FF, $FF, $FF, $FF ; Progressive Sword, Shield, Armor & Gloves - db $FF, $FF ; RNG Single & Multi - db 0, 0 ; Progressive Bow - db 0, 0, 0, 0 ; Unused - db 4, 4, 4 ; Goal Item Single, Multi & Alt Multi - db 0, 0, 0 ; Unused - db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Map - db 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ; Free Compass - db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Big Key - db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Small Key - db 1 ; Bee Trap - db 1 ; Apples - db 1 ; Fairy - db 1 ; Chicken - db 4 ; Big Magic - db 1 ; Good Bee - db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused - db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused - db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused - db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused - db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused - -; \item Target SRAM addresses for items you receive -.item_target_addr - dw $F359, $F359, $F359, $F359, $F35A, $F35A, $F35A, $F345 - dw $F346, $F34B, $F342, $F340, $F341, $F344, $F35C, $F347 - - dw $F348, $F349, $F34A, $F34C, $F34C, $F350, $F35C, $F36B - dw $F351, $F352, $F353, $F354, $F354, $F34E, $F356, $F357 - - dw $F37A, $F34D, $F35B, $F35B, $F36F, $F364, $F36C, $F375 - dw $F375, $F344, $F341, $F35C, $F35C, $F35C, $F36D, $F36E - - dw $F36E, $F375, $F366, $F368, $F360, $F360, $F360, $F374 - dw $F374, $F374, $F340, $F340, $F35C, $F35C, $F36C, $F36C - - dw $F360, $F360, $F372, $F376, $F376, $F373, $F360, $F360 - dw $F35C, $F359, $F34C, $F355 - ;new - dw $F375, $F376, $F373, $F373 - dw $F359 ; Master Sword (Safe) - dw $F375, $F375, $F376, $F376 ; +5/+10 Bomb Arrows - dw $F41A, $F41C, $F41E ; 3x Programmable Item - dw $F340 ; Upgrade-Only Silver Arrows - dw $F360 ; 1 Rupoor - dw $F36A ; Null Item - dw $F454, $F454, $F454 ; Red, Blue & Green Clocks - dw $F359, $F35A, $F35B, $F354 ; Progressive Sword, Shield, Armor & Gloves - dw $F36A, $F36A ; RNG Single & Multi - dw $F340, $F340 ; Progressive Bow x2 - dw $F36A, $F36A, $F36A, $F36A ; Unused - dw $F36A, $F36A, $F36A ; Goal Item Single, Multi & Alt Multi - dw $F36A, $F36A, $F36A ; Unused - dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Map - dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Compass - dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Big Key - dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Small Key - dw $F36A ; Bee Trap - dw $F36A ; Apples - dw $F36A ; Fairy - dw $F36A ; Chicken - dw $F373 ; Big Magic - dw $F36A ; Good Bee - dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused - dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused - dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused - dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused - dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused -} - -; DATA Values to write to the above SRAM locations. -{ -.item_values - db $01, $02, $03, $04, $01, $02, $03, $01 - db $01, $01, $01, $01, $01, $02, $FF, $01 - - db $01, $01, $01, $01, $02, $01, $FF, $FF - db $01, $01, $02, $01, $02, $01, $01, $01 - - db $FF, $01, $FF, $02, $FF, $FF, $FF, $FF - db $FF, $FF, $02, $FF, $FF, $FF, $FF, $FF - - db $FF, $FF, $FF, $FF, $FF, $FB, $EC, $FF - db $FF, $FF, $01, $03, $FF, $FF, $FF, $FF - - db $9C, $CE, $FF, $01, $0A, $FF, $FF, $FF - db $FF, $01, $03, $01 - ;new - db $32, $46, $80, $80 - db $02 ; Master Sword (Safe) - db $FF, $FF, $FF, $FF ; +5/+10 Bomb Arrows - db $FF, $FF, $FF ; 3x Programmable Item - db $FF ; Upgrade-Only Sivler Arrows - db $FF ; 1 Rupoor - db $FF ; Null Item - db $FF, $FF, $FF ; Red, Blue & Green Clocks - db $FF, $FF, $FF, $FF ; Progressive Sword, Shield, Armor & Gloves - db $FF, $FF ; RNG Single & Multi - db $FF, $FF ; Progressive Bow - db $FF, $FF, $FF, $FF ; Unused - db $FF, $FF, $FF ; Goal Item Single, Multi & Alt Multi - db $FF, $FF, $FF ; Unused - db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Map - db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Compass - db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Big Key - db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Small Key - db $FF ; Bee Trap - db $FF ; Apples - db $FF ; Fairy - db $FF ; Chicken - db $80 ; Big Magic - db $FF ; Good Bee - db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused - db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused - db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused - db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused - db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused - - ;0x00 - Sewer Passage - ;0x02 - Hyrule Castle - ;0x04 - Eastern Palace - ;0x06 - Desert Palace - ;0x08 - Hyrule Castle 2 - ;0x0A - Swamp Palace - ;0x0C - Dark Palace - ;0x0E - Misery Mire - ;0x10 - Skull Woods - ;0x12 - Ice Palace - ;0x14 - Tower of Hera - ;0x16 - Gargoyle's Domain - ;0x18 - Turtle Rock - ;0x1A - Ganon's Tower - -.item_masks ; these are dungeon correlations to $7EF364 - $7EF369 so it knows where to store compasses, etc +DungeonItemMasks: + ; these are dungeon correlations to $7EF364 - $7EF369 so it knows where to store compasses, etc ; sewers and castle get 2 bits active so that they can share their items elegantly dw $C000, $C000, $2000, $1000, $0800, $0400, $0200, $0100 dw $0080, $0040, $0020, $0010, $0008, $0004, $4B8B, $20AB ; last two can be re-used @@ -989,7 +925,8 @@ org $A08A00 dw $040C, $20C2, $C6BD, $0785, $8700, $E200, $8220, $00B0 dw $3EC0, $0AD0, $082C, $1003, $A905, $8D02, $0309, $20C0 dw $44D0 -} + + ;-------------------------------------------------------------------------------- BottleListExpanded: db $16, $2B, $2C, $2D, $3D, $3C, $48 @@ -997,168 +934,123 @@ BottleListExpanded: PotionListExpanded: db $2E, $2F, $30, $FF, $0E ;-------------------------------------------------------------------------------- -Link_ReceiveItemAlternatesExpanded: -{ - db -1, -1, -1, -1, -1, -1, -1, -1 - db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, -1, -1, $44, -1, -1, -1 - - db -1, -1, $35, -1, -1, -1, -1, -1 - db -1, -1, -1, -1, -1, -1, -1, -1 - - db -1, -1, -1, -1, -1, -1, -1, -1 - db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, $46, -1, -1, -1, -1, -1 - - db -1, -1, -1, -1, -1, -1, -1, -1 - db -1, -1, -1, -1, -1, -1, -1, -1 - - db -1, -1, -1, -1, -1, -1, -1, -1 - db -1, -1, -1, -1 - - db -1, -1, -1, -1 - db -1 ; Master Sword (Safe) - db -1, -1, -1, -1 ; +5/+10 Bomb Arrows - db -1, -1, -1 ; 3x Programmable Item - db -1 ; Upgrade-Only Silver Arrows - db -1 ; 1 Rupoor - db -1 ; Null Item - db -1, -1, -1 ; Red, Blue & Green Clocks - db -1, -1, -1, -1 ; Progressive Sword, Shield, Armor & Gloves - db -1, -1 ; RNG Single & Multi - db -1, -1 ; Progressive Bow - db -1, -1, -1, -1 ; Unused - db -1, -1 ; Goal Item Single, Multi & Alt Multi - db -1, -1, -1, -1 ; Unused - db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Map - db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Compass - db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Big Key - db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Small Key - db -1 ; Bee Trap - db -1 ; Apples - db -1 ; Fairy - db -1 ; Chicken - db -1 ; Big Magic - db -1 ; Good Bee - db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused - db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused - db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused - db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused - db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused -} -;-------------------------------------------------------------------------------- -.loadAlternate - PHB : PHK : PLB - ;TYA : JSR IncrementItemCounters - ;LDA Link_ReceiveItemAlternatesExpanded, Y : STA $03 - LDA !MULTIWORLD_ITEM_PLAYER_ID : BNE + - TYA - JSR AttemptItemSubstitution - BRA ++ - + - TYA - ++ - STA $03 - CPY $03 : BNE + : LDA.b #$FF : STA $03 : + - PLB -RTL -;-------------------------------------------------------------------------------- -;DrawHUDSilverArrows: -; LDA BowEquipment : AND.w #$00FF : BNE + -; LDA BowTracking : AND.w #$0040 : BEQ + -; LDA.w #$2810 : STA $11C8 -; LDA.w #$2811 : STA $11CA -; LDA.w #$2820 : STA $1208 -; LDA.w #$2821 : STA $120A -; + -; LDA.w #$11CE : STA $00 ; thing we wrote over -;RTL +HandleBowTracking: +; In: A - Item Receipt ID + PHA + CMP.b #$64 : BEQ .prog_one + CMP.b #$65 : BEQ .prog_two + CMP.b #$0B : BEQ .vanilla_bow + CMP.b #$3A : BEQ .vanilla_bow + CMP.b #$3B : BEQ .vanilla_bow + PLA + RTS + .prog_one + LDA.b #$10 + BRA .done + .prog_two + LDA.b #$20 + BRA .done + .vanilla_bow + ; A non-chest progressive bow will always have been resolved to a vanilla bow ID + ; at this point. + LDA.w ItemReceiptMethod : CMP.b #$01 : BEQ + + LDX.w CurrentSpriteSlot + LDA.w SpriteMetaData,X : BEQ + + BRA .done + + + LDA.b #$00 + .done + ORA.b #$80 : ORA.l BowTracking + STA.l BowTracking + PLA +RTS ;-------------------------------------------------------------------------------- ;Return BowEquipment but also draw silver arrows if you have the upgrade even if you don't have the bow CheckHUDSilverArrows: - LDA.l ArrowMode : BEQ .normal - .rupee_arrows - JSL.l DrawHUDArrows - LDA BowEquipment - RTL - .normal - LDA BowEquipment : BNE + - LDA BowTracking : AND.b #$40 : BEQ ++ - JSL.l DrawHUDArrows - ++ - LDA BowEquipment - + -RTL + LDA.l ArrowMode : BNE .rupee_bow + LDA.l BowEquipment : TAX : BEQ .nobow + JSL DrawHUDArrows_normal + TXA + RTL + .rupee_bow + LDA.l BowEquipment : TAX + JSL DrawHUDArrows_rupee_arrows + TXA + RTL + .nobow + JSL DrawHUDArrows_silverscheck + TXA + RTL ;-------------------------------------------------------------------------------- DrawHUDArrows: -LDA.l ArrowMode : BEQ .normal .rupee_arrows - - LDA CurrentArrows : BEQ .none ; assuming silvers will increment this. if we go with something else, reorder these checks - LDA BowEquipment : BNE + - LDA BowTracking : AND.b #$40 : BNE .silver + LDA.l CurrentArrows : BEQ .none ; assuming silvers will increment this. if we go with something else, reorder these checks + TXA : BNE + + .silverscheck + LDA.l BowTracking : AND.b #$40 : BNE .silver BRA .wooden + CMP.b #03 : !BGE .silver .wooden - LDA.b #$A7 : STA $7EC720 ; draw wooden arrow marker - LDA.b #$20 : STA $7EC721 - LDA.b #$A9 : STA $7EC722 - LDA.b #$20 : STA $7EC723 + LDA.b #$A7 : STA.l HUDTileMapBuffer+$20 ; draw wooden arrow marker + LDA.b #$20 : STA.l HUDTileMapBuffer+$21 + LDA.b #$A9 : STA.l HUDTileMapBuffer+$22 + LDA.b #$20 : STA.l HUDTileMapBuffer+$23 + .skip RTL - .normal ; in normal arrow mode this function is only ever called for silvers + .normal + TXA + CMP.b #$03 : BCS .silver + BRA .wooden .silver - LDA.b #$86 : STA $7EC720 ; draw silver arrow marker - LDA.b #$24 : STA $7EC721 - LDA.b #$87 : STA $7EC722 - LDA.b #$24 : STA $7EC723 + LDA.b #$86 : STA.l HUDTileMapBuffer+$20 ; draw silver arrow marker + LDA.b #$24 : STA.l HUDTileMapBuffer+$21 + LDA.b #$87 : STA.l HUDTileMapBuffer+$22 + LDA.b #$24 : STA.l HUDTileMapBuffer+$23 RTL .none - LDA.b #$7F : STA $7EC720 ; draw no arrow marker - LDA.b #$24 : STA $7EC721 - LDA.b #$7F : STA $7EC722 - LDA.b #$24 : STA $7EC723 + LDA.b #$7F : STA.l HUDTileMapBuffer+$20 ; draw no arrow marker + LDA.b #$24 : STA.l HUDTileMapBuffer+$21 + LDA.b #$7F : STA.l HUDTileMapBuffer+$22 + LDA.b #$24 : STA.l HUDTileMapBuffer+$23 RTL ;-------------------------------------------------------------------------------- -!SCRATCH_AREA = "$7F5020" -!SINGLE_INDEX_TEMP = "$7F5020" -!SINGLE_INDEX_OFFSET_TEMP = "$7F5021" -!SINGLE_INDEX_BITMASK_TEMP = "$7F5022" -!LOCK_IN = "$7F5090" GetRNGItemSingle: PHY - LDA !LOCK_IN : CMP.b #$FF : BEQ + : TAX : XBA : LDA.l RNGSingleItemTable, X : RTL : + + LDA.l RNGLockIn : CMP.b #$FF : BEQ + : TAX : XBA : LDA.l RNGSingleItemTable, X : RTL : + LDX.b #$00 .single_reroll - JSL.l GetRandomInt : AND.b #$7F ; select random value - INX : CPX #$7F : !BLT + : LDA.b #$00 : BRA +++ : + ; default to 0 if too many attempts + JSL GetRandomInt : AND.b #$7F ; select random value + INX : CPX.b #$7F : BCC + : LDA.b #$00 : BRA +++ : + ; default to 0 if too many attempts CMP.l RNGSingleTableSize : !BGE .single_reroll +++ - STA !SINGLE_INDEX_TEMP ; put our index value here - LDX #$00 + STA.w ScratchBufferV ; put our index value here + LDX.b #$00 TAY .recheck TYA - JSR.w CheckSingleItem : BEQ .single_unused ; already used - LDA !SINGLE_INDEX_TEMP : INC ; increment index - CMP.l RNGSingleTableSize : !BLT +++ : LDA.b #$00 : +++ ; rollover index if needed - STA !SINGLE_INDEX_TEMP ; store index - INX : TAY : TXA : CMP.l RNGSingleTableSize : !BLT .recheck + JSR CheckSingleItem : BEQ .single_unused ; already used + LDA.w ScratchBufferV : INC ; increment index + CMP.l RNGSingleTableSize : BCC +++ : LDA.b #$00 : +++ ; rollover index if needed + STA.w ScratchBufferV ; store index + INX : TAY : TXA : CMP.l RNGSingleTableSize : BCC .recheck LDA.b #$5A ; everything is gone, default to null item - MAKE THIS AN OPTION FOR THIS AND THE OTHER ONE BRA .single_done .single_unused - LDA !SINGLE_INDEX_TEMP + LDA.w ScratchBufferV .single_done TAX : LDA.l RNGSingleItemTable, X - XBA : LDA.l !SINGLE_INDEX_TEMP : STA !LOCK_IN : XBA + XBA : LDA.w ScratchBufferV : STA.l RNGLockIn : XBA PLY RTL ;-------------------------------------------------------------------------------- CheckSingleItem: LSR #3 : TAX - LDA.l RNGItem, X : STA !SINGLE_INDEX_BITMASK_TEMP ; load value to temporary + LDA.l RNGItem, X : STA.w ScratchBufferV+2 ; load value to temporary PHX - LDA !SINGLE_INDEX_TEMP : AND #$07 : TAX ; load 0-7 part into X - LDA !SINGLE_INDEX_BITMASK_TEMP + LDA.w ScratchBufferV : AND.b #$07 : TAX ; load 0-7 part into X + LDA.w ScratchBufferV+2 --- CPX.b #$00 : BEQ +++ LSR @@ -1170,12 +1062,10 @@ CheckSingleItem: RTS ;-------------------------------------------------------------------------------- MarkRNGItemSingle: - ;STA !SINGLE_INDEX_TEMP - - LSR #3 : STA !SINGLE_INDEX_OFFSET_TEMP : TAX + LSR #3 : STA.w ScratchBufferV+1 : TAX LDA.l RNGItem, X - STA.l !SINGLE_INDEX_BITMASK_TEMP - LDA.l !SINGLE_INDEX_TEMP : AND #$07 : TAX ; load 0-7 part into X + STA.w ScratchBufferV+2 + LDA.w ScratchBufferV : AND.b #$07 : TAX ; load 0-7 part into X LDA.b #01 --- CPX.b #$00 : BEQ +++ @@ -1185,21 +1075,21 @@ MarkRNGItemSingle: +++ PHA - LDA.l !SINGLE_INDEX_OFFSET_TEMP : TAX + LDA.w ScratchBufferV+1 : TAX PLA - ORA.l !SINGLE_INDEX_BITMASK_TEMP + ORA.w ScratchBufferV+2 STA.l RNGItem, X RTS ;-------------------------------------------------------------------------------- GetRNGItemMulti: - LDA !LOCK_IN : CMP #$FF : BEQ + : TAX : XBA : LDA.l RNGMultiItemTable, X : RTL : + + LDA.l RNGLockIn : CMP.b #$FF : BEQ + : TAX : XBA : LDA.l RNGMultiItemTable, X : RTL : + LDX.b #$00 - ; reroll - JSL.l GetRandomInt : AND.b #$7F ; select random value - INX : CPX #$7F : !BLT + : LDA.b 00 : BRA .done : + ; default to 0 if too many attempts + JSL GetRandomInt : AND.b #$7F ; select random value + INX : CPX.b #$7F : BCC + : LDA.b 00 : BRA .done : + ; default to 0 if too many attempts CMP.l RNGMultiTableSize : !BGE - .done - STA !LOCK_IN + STA.l RNGLockIn TAX : XBA : LDA.l RNGMultiItemTable, X RTL ;-------------------------------------------------------------------------------- @@ -1209,11 +1099,11 @@ IncrementItemCounters: - LDA.l ItemSubstitutionRules, X CMP.b #$FF : BEQ .exit - CMP 1,s : BNE .noMatch + CMP.b 1,s : BNE .noMatch .match PHX TXA : LSR #2 : TAX - LDA ItemLimitCounts, X : INC : STA ItemLimitCounts, X + LDA.l ItemLimitCounts, X : INC : STA.l ItemLimitCounts, X PLX BEQ .exit .noMatch @@ -1224,106 +1114,141 @@ IncrementItemCounters: RTS ;-------------------------------------------------------------------------------- AttemptItemSubstitution: - PHX : PHA - LDX.b #$00 - - - LDA.l ItemSubstitutionRules, X - CMP.b #$FF : BEQ .exit - CMP 1,s : BNE .noMatch - .match - PHX - TXA : LSR #2 : TAX - LDA ItemLimitCounts, X - PLX - CMP.l ItemSubstitutionRules+1, X : !BLT + - LDA.l ItemSubstitutionRules+2, X : STA 1,s - + - BEQ .exit - .noMatch - INX #4 - BRA - -.exit - PLA : PLX -RTS + PHX : PHA + LDA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID : BNE .exit + LDX.b #$00 + - + LDA.l ItemSubstitutionRules, X + CMP.b #$FF : BEQ .exit + CMP.b 1,S : BNE .noMatch + .match + PHX + TXA : LSR #2 : TAX + LDA.l ItemLimitCounts, X + PLX + CMP.l ItemSubstitutionRules+1, X : BCC + + LDA.l ItemSubstitutionRules+2, X : STA.b 1,S + + + BEQ .exit + .noMatch + INX #4 + BRA - + .exit + PLA : PLX +RTL ;-------------------------------------------------------------------------------- CountBottles: - PHX + PHX LDX.b #$00 - LDA BottleContentsOne : BEQ ++ : INX - ++ : LDA BottleContentsTwo : BEQ ++ : INX - ++ : LDA BottleContentsThree : BEQ ++ : INX - ++ : LDA BottleContentsFour : BEQ ++ : INX - ++ + LDA.l BottleContentsOne : BEQ + : INX + + : LDA.l BottleContentsTwo : BEQ + : INX + + : LDA.l BottleContentsThree : BEQ + : INX + + : LDA.l BottleContentsFour : BEQ + : INX + + TXA PLX RTS ;-------------------------------------------------------------------------------- ActivateGoal: - STZ $11 - STZ $B0 -JML.l StatsFinalPrep + STZ.b GameSubMode + STZ.b SubSubModule +JML StatsFinalPrep ;-------------------------------------------------------------------------------- ChestPrep: - LDA.b #$01 : STA $02E9 - JSL.l IncrementChestCounter + LDA.b #$01 : STA.w ItemReceiptMethod + JSL IncrementChestCounter LDA.l ServerRequestMode : BEQ + - JSL.l ChestItemServiceRequest + JSL ChestItemServiceRequest RTL + - LDY $0C ; get item value + LDY.b Scrap0C ; get item value SEC RTL + ;-------------------------------------------------------------------------------- Ancilla22_ItemReceipt_ContinueB: CMP.b #$6A : BNE .return JSL ActivateTriforceCutscene .return - STZ.w $0C4A,X : STZ.w $0FC1 ; what we wrote over + STZ.w AncillaID,X : STZ.w FreezeSprites ; what we wrote over RTL ;-------------------------------------------------------------------------------- -; Set a flag in SRAM if we pick up a compass in its own dungeon with HUD compass -; counts on MaybeFlagCompassTotalPickup: LDA.l CompassMode : AND.b #$0F : BEQ .done - LDA $040C : CMP #$FF : BEQ .done - LSR : STA $04 : LDA #$0F : !SUB $04 ; Compute flag "index" - CPY #$25 : BEQ .setFlag ; Set flag if it's a compass for this dungeon - STA $04 - TYA : AND #$0F : CMP $04 : BNE .done ; Check if compass is for this dungeon - .setFlag - CMP #$08 : !BGE ++ - %ValueShift() - ORA CompassCountDisplay : STA CompassCountDisplay - BRA .done - ++ - !SUB #$08 - %ValueShift() - BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both - ORA CompassCountDisplay+1 : STA CompassCountDisplay+1 + LDA.w DungeonID : BMI .done + LDA.w ItemReceiptID : CMP.b #$25 : BEQ .set_flag + REP #$20 + AND.w #$000F : ASL : TAX + LDA.w DungeonItemIDMap,X : CMP.w DungeonID : BNE .done + .set_flag + REP #$20 + TYA : ORA.l CompassCountDisplay : STA.l CompassCountDisplay + .done +RTL + +MaybeFlagMapTotalPickup: +; LDA.l MapHUDMode : AND.b #$0F : BEQ .done + LDA.w DungeonID : BMI .done + LDA.w ItemReceiptID : CMP.b #$33 : BEQ .set_flag + REP #$20 + AND.w #$000F : ASL : TAX + LDA.w DungeonItemIDMap,X : CMP.w DungeonID : BNE .done + .set_flag + REP #$20 + TYA : ORA.l MapCountDisplay : STA.l MapCountDisplay + .done +RTL + +;-------------------------------------------------------------------------------- +; Set the dungeon item count display flags if we're entering a dungeon and have the +; corresponding dungeon item +MaybeFlagDungeonTotalsEntrance: + LDX.w DungeonID : BMI .done ; Skip if we're not entering dungeon + REP #$10 + LDA.l DungeonItemMasks,X : TAY + LDA.l CompassMode : AND.w #$000F : BEQ .maps ; Skip if we're not showing compass counts + JSR FlagCompassCount + .maps +; LDA.l MapHUDMode : AND.w #$000F : BEQ .done + LDX.w DungeonID + JSR FlagMapCount .done RTL ;-------------------------------------------------------------------------------- -; Set the compass count display flag if we're entering a dungeon and alerady have -; that compass -MaybeFlagCompassTotalEntrance: - LDX $040C : CPX #$FF : BEQ .done ; Skip if we're not entering dungeon - LDA.l CompassMode : AND.w #$000F : BEQ .done ; Skip if we're not showing compass counts - CMP.w #$0002 : BEQ .countShown - LDA CompassField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have compass - .countShown - SEP #$20 - TXA : LSR : STA.b $04 : LDA.b #$0F : !SUB $04 ; Compute flag "index" - CMP #$08 : !BGE ++ - %ValueShift() - ORA CompassCountDisplay : STA CompassCountDisplay - REP #$20 - BRA .done - ++ - !SUB #$08 - %ValueShift() - BIT.b #$C0 : BEQ + : LDA.b #$C0 : + ; Make Hyrule Castle / Sewers Count for Both - ORA CompassCountDisplay+1 : STA CompassCountDisplay+1 - REP #$20 +FlagCompassCount: + CMP.w #$0002 : BEQ .compass_shown + LDA.l CompassField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have compass + .compass_shown + TYA : ORA.l CompassCountDisplay : STA.l CompassCountDisplay .done -RTL +RTS ;-------------------------------------------------------------------------------- +FlagMapCount: + CMP.w #$0002 : BEQ .mapShown + LDA.l MapField : AND.l DungeonItemMasks, X : BEQ .done ; skip if we don't have map + .mapShown + TYA : ORA.l MapCountDisplay : STA.l MapCountDisplay + .done +RTS + +;-------------------------------------------------------------------------------- +DungeonItemIDMap: ; Maps lower four bits of our new dungeon items to DungeonID +dw $FFFF +dw $FFFF +dw $001A ; GT +dw $0018 ; TR +dw $0016 ; TT +dw $0014 ; TH +dw $0012 ; IP +dw $0010 ; SW +dw $000E ; MM +dw $000C ; PD +dw $000A ; SP +dw $0008 ; CT +dw $0006 ; DP +dw $0004 ; EP +dw $0002 ; HC +dw $0000 ; Sewers + +PendantMasks: +db $04, 01, 02 diff --git a/npcitems.asm b/npcitems.asm index da52533..cfd7052 100644 --- a/npcitems.asm +++ b/npcitems.asm @@ -23,154 +23,133 @@ ;-------------------------------------------------------------------------------- ItemCheck_FairySword: - LDA NpcFlags+1 : AND.b #$08 + LDA.l NpcFlags+1 : AND.b #$08 RTL ItemCheck_SmithSword: - LDA NpcFlags+1 : AND.b #$04 + LDA.l NpcFlags+1 : AND.b #$04 RTL ItemCheck_MagicBat: - LDA NpcFlags+1 : AND.b #$80 + LDA.l NpcFlags+1 : AND.b #$80 RTL ItemCheck_OldMan: - LDA NpcFlags : AND.b #$01 : CMP #$01 + LDA.l NpcFlags : AND.b #$01 : CMP.b #$01 RTL ItemCheck_ZoraKing: - LDA NpcFlags : AND.b #$02 + LDA.l NpcFlags : AND.b #$02 RTL ItemCheck_SickKid: - LDA NpcFlags : AND.b #$04 + LDA.l NpcFlags : AND.b #$04 RTL ItemCheck_TreeKid: - LDA NpcFlags : AND.b #$08 ; FluteBoy_Chillin - 73: LDA FluteEquipment + LDA.l NpcFlags : AND.b #$08 RTL ItemCheck_TreeKid2: - LDA NpcFlags : AND.b #$08 : LSR #$02 ; FluteAardvark_InitialStateFromFluteState - 225: LDA FluteEquipment : AND.b #$03 + LDA.l NpcFlags : AND.b #$08 + LSR #2 RTL ItemCheck_TreeKid3: - JSL $0DD030 ; FluteAardvark_Draw - thing we wrote over - LDA NpcFlags : AND.b #$08 - BEQ .normal - BRA .done + JSL SpriteDraw_Stumpy ; thing we wrote over + LDA.l NpcFlags : AND.b #$08 + BNE .done LDA.b #$05 - .normal - LDA $0D80, X - .done -RTL +.normal + LDA.w SpriteActivity, X +.done + RTL ItemCheck_Sahasrala: - LDA NpcFlags : AND.b #$10 + LDA.l NpcFlags : AND.b #$10 RTL ItemCheck_Library: - LDA NpcFlags : AND.b #$80 + LDA.l NpcFlags : AND.b #$80 RTL ItemCheck_Mushroom: - LDA NpcFlags+1 : ROL #4 ; does the same thing as below -; LDA NpcFlags+1 : AND.b #$10 : BEQ .clear -; SEC -;RTL -; .clear -; CLC + LDA.l NpcFlags+1 : AND.b #$10 : CMP.b #$10 ; does the same thing as below RTL ItemCheck_Powder: - LDA NpcFlags+1 : AND.b #$20 + LDA.l NpcFlags+1 : AND.b #$20 RTL ItemCheck_Catfish: - ;LDA CatfishGoodItem : BEQ .junk - ;PHX - ; LDA CatfishGoodItem+1 : TAX - ; LDA BowEquipment-1, X - ;PLX - ;-- - ;CMP CatfishGoodItem : !BLT .oursNewer - ;.theirsNewer - ;LDA #$20 : RTL ; don't give item - ;.oursNewers - ;LDA #$00 : RTL ; give item - ;.junk - LDA NpcFlags : AND.b #$20 + LDA.l NpcFlags : AND.b #$20 RTL ;-------------------------------------------------------------------------------- ItemSet_FairySword: - PHA : LDA NpcFlags+1 : ORA.b #$08 : STA NpcFlags+1 : PLA + PHA : LDA.l NpcFlags+1 : ORA.b #$08 : STA.l NpcFlags+1 : PLA RTL ItemSet_SmithSword: - PHA : LDA NpcFlags+1 : ORA.b #$04 : STA NpcFlags+1 : PLA + PHA : LDA.l NpcFlags+1 : ORA.b #$04 : STA.l NpcFlags+1 : PLA RTL ItemSet_MagicBat: - PHA : LDA NpcFlags+1 : ORA.b #$80 : STA NpcFlags+1 : PLA + PHA : LDA.l NpcFlags+1 : ORA.b #$80 : STA.l NpcFlags+1 : PLA RTL ItemSet_OldMan: PHA : LDA OldManItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID : PLA - JSL.l Link_ReceiveItem ; thing we wrote over - PHA : LDA NpcFlags : ORA.b #$01 : STA NpcFlags : PLA + JSL Link_ReceiveItem ; thing we wrote over + PHA : LDA.l NpcFlags : ORA.b #$01 : STA.l NpcFlags : PLA RTL ItemSet_ZoraKing: - ;JSL $1DE1AA ; Sprite_SpawnFlippersItem ; thing we wrote over - PHA : LDA NpcFlags : ORA.b #$02 : STA NpcFlags : PLA + PHA : LDA.l NpcFlags : ORA.b #$02 : STA.l NpcFlags : PLA RTL ItemSet_SickKid: PHA : LDA SickKidItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID : PLA - JSL.l Link_ReceiveItem ; thing we wrote over - PHA : LDA NpcFlags : ORA.b #$04 : STA NpcFlags : PLA + JSL Link_ReceiveItem ; thing we wrote over + PHA : LDA.l NpcFlags : ORA.b #$04 : STA.l NpcFlags : PLA RTL ItemSet_TreeKid: PHA : LDA TreeKidItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID : PLA - JSL.l Link_ReceiveItem ; thing we wrote over - PHA : LDA NpcFlags : ORA.b #$08 : STA NpcFlags : PLA + JSL Link_ReceiveItem ; thing we wrote over + PHA : LDA.l NpcFlags : ORA.b #$08 : STA.l NpcFlags : PLA RTL ItemSet_Sahasrala: PHA : LDA SahasralaItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID : PLA - JSL.l Link_ReceiveItem ; thing we wrote over - PHA : LDA NpcFlags : ORA.b #$10 : STA NpcFlags : PLA + JSL Link_ReceiveItem ; thing we wrote over + PHA : LDA.l NpcFlags : ORA.b #$10 : STA.l NpcFlags : PLA RTL ItemSet_Catfish: - ;JSL $00D52D ; GetAnimatedSpriteTile.variable ; thing we wrote over - ;JSL.l LoadCatfishItemGFX - PHA : LDA NpcFlags : ORA.b #$20 : STA NpcFlags : PLA + PHA : LDA.l NpcFlags : ORA.b #$20 : STA.l NpcFlags : PLA RTL ItemSet_Library: PHA : LDA LibraryItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID : PLA - JSL.l Link_ReceiveItem ; thing we wrote over - PHA : LDA NpcFlags : ORA.b #$80 : STA NpcFlags : PLA + JSL Link_ReceiveItem ; thing we wrote over + PHA : LDA.l NpcFlags : ORA.b #$80 : STA.l NpcFlags : PLA RTL ItemSet_Mushroom: PHA - LDA NpcFlags+1 : ORA.b #$10 : STA NpcFlags+1 - LDY $0E80, X ; Retrieve stored item type + LDA.l NpcFlags+1 : ORA.b #$10 : STA.l NpcFlags+1 + LDY.w SpriteID, X ; Retrieve stored item type BNE + ; if for any reason the item value is 0 reload it, just in case %GetPossiblyEncryptedItem(MushroomItem, SpriteItemValues) : TAY + LDA MushroomItem_Player : STA !MULTIWORLD_ITEM_PLAYER_ID PLA - ;LDY.b #$29 - STZ $02E9 ; thing we wrote over - the mushroom is an npc for item purposes apparently + STZ.w ItemReceiptMethod ; thing we wrote over - the mushroom is an npc for item purposes apparently RTL ItemSet_Powder: - PHA : LDA NpcFlags+1 : ORA.b #$20 : STA NpcFlags+1 : PLA + PHA : LDA.l NpcFlags+1 : ORA.b #$20 : STA.l NpcFlags+1 : PLA RTL ;================================================================================ @@ -178,11 +157,11 @@ RTL ; Randomize 300 Rupee NPC ;-------------------------------------------------------------------------------- Set300RupeeNPCItem: - INC $0D80, X ; thing we wrote over + INC.w SpriteActivity, X ; thing we wrote over PHA : PHP REP #$20 ; set 16-bit accumulator - LDA $A0 ; these are all decimal because i got them that way + LDA.b RoomIndex ; these are all decimal because i got them that way CMP.w #291 : BNE + %GetPossiblyEncryptedItem(RupeeNPC_MoldormCave, SpriteItemValues) TAY ; load moldorm cave value into Y @@ -201,4 +180,56 @@ Set300RupeeNPCItem: STA !MULTIWORLD_ITEM_PLAYER_ID PLP : PLA RTL + ;================================================================================ +; Randomize Zora King +;-------------------------------------------------------------------------------- +LoadZoraKingItemGFX: + LDA.l ZoraItem_Player : : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID + LDA.l $1DE1C3 ; location randomizer writes zora item to + JSL AttemptItemSubstitution + JSL ResolveLootIDLong + STA.w SpriteID,Y + TYX + JML RequestStandingItemVRAMSlot +;-------------------------------------------------------------------------------- +JumpToSplashItemTarget: + LDA.w SpriteMovement, X + CMP.b #$FF : BNE + : JML SplashItem_SpawnSplash : + + CMP.b #$00 : JML SplashItem_SpawnOther + +;================================================================================ +; Randomize Catfish +;-------------------------------------------------------------------------------- +LoadCatfishItemGFX: + LDA.l CatfishItem_Player : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID + LDA.l $1DE185 ; location randomizer writes catfish item to + JSL AttemptItemSubstitution + JSL ResolveLootIDLong + STA.w SpriteID, Y + TYX + JML RequestStandingItemVRAMSlot +;-------------------------------------------------------------------------------- +DrawThrownItem: + LDA.w SpriteID,X + JML DrawPotItem +;-------------------------------------------------------------------------------- +MarkThrownItem: + PHA + + LDA.b OverworldIndex : CMP.b #$81 : BNE .catfish + + .zora + JSL ItemSet_ZoraKing + LDA.l ZoraItem_Player : STA.l !MULTIWORLD_ITEM_PLAYER_ID + BRA .done + + .catfish + JSL ItemSet_Catfish + LDA.l CatfishItem_Player : STA.l !MULTIWORLD_ITEM_PLAYER_ID + + .done + PLA + JSL Link_ReceiveItem ; thing we wrote over +RTL +;-------------------------------------------------------------------------------- diff --git a/output.txt b/output.txt deleted file mode 100644 index 2962db9..0000000 --- a/output.txt +++ /dev/null @@ -1,3 +0,0 @@ -llh@tinymagnet.com:~/DBMS/Run$ ./dbms -? -(Lena Hellstrom) bad option...should be "f" or "b" or "a" -llh@tinymagnet.com:~/DBMS/Run$ \ No newline at end of file diff --git a/owrando.asm b/owrando.asm index bb9856b..2b9eab1 100644 --- a/owrando.asm +++ b/owrando.asm @@ -1,10 +1,3 @@ -; Free RAM notes -; $06F8-$06F9: Used to store edge table addresses -; $06FA-$06FB: Used to store target edge IDs -; $06FC-$06FD: Used for custom walk destination after transitions -; $0703: Used to flag forced transitions -; $0704-$0705: Used to store terrain type at the start of a transition - org $aa8000 ;150000 db $4f, $52 ;OR OWMode: @@ -18,103 +11,103 @@ OWVersionInfo: dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 ;Hooks -org $02a929 +org $82a929 OWDetectTransitionReturn: -org $02a939 +org $82a939 OverworldHandleTransitions_SpecialTrigger: JSL OWDetectEdgeTransition BCS OWDetectTransitionReturn -org $02a999 +org $82a999 jsl OWEdgeTransition : nop #4 ;LDA $02A4E3,X : ORA $7EF3CA -org $02aa07 +org $82aa07 JSL OWMarkVisited : NOP -org $04e8ae +org $84e8ae JSL OWDetectSpecialTransition RTL : NOP -org $02e809 +org $82e809 JSL OWSpecialExit -org $02bfe8 +org $82bfe8 JSL OWAdjustExitPosition -org $02c1a9 +org $82c1a9 JSL OWEndScrollTransition -org $04E881 +org $84E881 Overworld_LoadSpecialOverworld_RoomId: -org $04E8B4 +org $84E8B4 Overworld_LoadSpecialOverworld: -org $02A9DA +org $82A9DA JSL OWSkipPalettes BCC OverworldHandleTransitions_change_palettes : NOP #4 -org $07982A +org $87982A Link_ResetSwimmingState: ; mirror hooks -org $0283DC ; override world check when spawning mirror portal sprite in Crossed OWR -jsl.l OWLightWorldOrCrossed -org $05AF75 +org $8283DC ; override world check when spawning mirror portal sprite in Crossed OWR +jsl OWLightWorldOrCrossed +org $85AF75 Sprite_6C_MirrorPortal: jsl OWMirrorSpriteDisable ; LDA $7EF3CA -org $05AF88 +org $85AF88 jsl OWMirrorSpriteSkipDraw : NOP ; LDA.w $0FC6 : CMP.b #$03 -org $05AFDF +org $85AFDF Sprite_6C_MirrorPortal_missing_mirror: -org $0ABFB6 +org $8ABFB6 jsl OWMirrorSpriteOnMap : NOP ; LDA.w $008A : CMP.b #$40 ; whirlpool shuffle cross world change -org $02b3bd +org $82b3bd jsl OWWhirlpoolUpdate ;JSL $02EA6C -org $02B44E +org $82B44E jsl OWWhirlpoolEnd ; STZ.b $11 : STZ.b $B0 ; flute menu cancel -org $0ab7af ;LDA $F2 : ORA $F0 : AND #$C0 +org $8ab7af ;LDA $F2 : ORA $F0 : AND #$C0 jml OWFluteCancel2 : nop -org $0ab90d ;JSL $02E99D +org $8ab90d ;JSL $02E99D jsl OWFluteCancel ; allows Frog sprite to spawn in LW and also allows his friend to spawn in their house -org $068a76 ; < 30a76 - sprite_prep.asm:785 (LDA $7EF3CA : AND.w #$40) -lda $1b : eor.b #1 : nop #2 +org $868a76 ; < 30a76 - sprite_prep.asm:785 (LDA $7EF3CA : AND.w #$40) +lda.b IndoorsFlag : eor.b #1 : nop #2 ; allows Frog to be accepted at Blacksmith -org $06b3ee ; < 333ee - sprite_smithy_bros.asm:347 (LDA $7EF3CC : CMP.b #$08 : BEQ .no_returning_smithy_tagalong) +org $86b3ee ; < 333ee - sprite_smithy_bros.asm:347 (LDA $7EF3CC : CMP.b #$08 : BEQ .no_returning_smithy_tagalong) jsl OWSmithAccept : nop #2 db #$b0 ; BCS to replace BEQ ; load Stumpy per screen's original world, not current world flag -org $06907f ; < 3107f - sprite_prep.asm:2170 (LDA $7EF3CA) -lda $8a : and.b #$40 +org $86907f ; < 3107f - sprite_prep.asm:2170 (LDA $7EF3CA) +lda.b OverworldIndex : and.b #$40 ; override Link speed with Old Man following -org $09a32e ; < bank_09.asm:7457 (LDA.b #$0C : STA.b $5E) +org $89a32e ; < bank_09.asm:7457 (LDA.b #$0C : STA.b $5E) jsl OWOldManSpeed ; Dark Bonk Rocks Rain Sequence Guards (allowing Tile Swap on Dark Bonk Rocks) -;org $09c957 ; <- 4c957 +;org $89c957 ; <- 4c957 ;dw #$cb5f ; matches value on Central Bonk Rocks screen ; override world check when viewing overworld (incl. title screen portion) -org $0aba6c ; < ? - Bank0a.asm:474 () -jsl.l OWMapWorldCheck16 : nop +org $8aba6c ; < ? - Bank0a.asm:474 () +jsl OWMapWorldCheck16 : nop ; Mixed Overworld Map -org $0ABA99 +org $8ABA99 WorldMap_LoadDarkWorldMap: -LDA.b $10 : CMP.b #$14 ; attract module +LDA.b GameMode : CMP.b #$14 ; attract module BEQ .vanilla_light LDA.l OWMode+1 : AND.b #!FLAG_OW_MIXED : BNE .mixed - LDA.b $8A : AND.b #$40 + LDA.b OverworldIndex : AND.b #$40 BEQ .vanilla_light .mixed PHB : PHK : PLB @@ -123,55 +116,55 @@ BEQ .vanilla_light .vanilla_light ; $0ABAB5 ;(replacing -> LDA $8A : AND.b #$40) -org $00d8c4 ; < ? - Bank00.asm:4068 () -jsl.l OWWorldCheck -org $02aa36 ; < ? - Bank02.asm:6559 () -jsl.l OWWorldCheck -org $02aeca ; < ? - Bank02.asm:7257 () -jsl.l OWWorldCheck16 : nop -org $02b349 ; < ? - Bank02.asm:7902 () -jsl.l OWWorldCheck -org $02c40a ; < ? - Bank02.asm:10547 () -jsl.l OWWorldCheck -org $05afd9 ; < ? - sprite_warp_vortex.asm:60 () -jsl.l OWWorldCheck -org $07a3f0 ; < ? - Bank07.asm:5772 () ; flute activation/use -jsl.l OWWorldCheck -org $07a967 ; < ? - Bank07.asm:6578 () -jsl.l OWWorldCheck -org $07a9a1 ; < ? - Bank07.asm:6622 () -jsl.l OWWorldCheck -org $07a9ed ; < ? - Bank07.asm:6677 () -jsl.l OWWorldCheck -org $07aa34 ; < ? - Bank07.asm:6718 () -jsl.l OWWorldCheck -org $08d408 ; < ? - ancilla_morph_poof.asm:48 () -jsl.l OWWorldCheck -org $0bfeab ; < ? - Bank0b.asm:36 () -jsl.l OWWorldCheck16 : nop -org $0cffb6 ; < ? - ?.asm ? () -jsl.l OWWorldCheck16 : nop -org $0cffe8 ; < ? - ?.asm ? () -jsl.l OWWorldCheck16 : nop -org $1beca2 ; < ? - palettes.asm:556 () -jsl.l OWWorldCheck16 : nop -org $1bed95 ; < ? - palettes.asm:748 () -jsl.l OWWorldCheck16 : nop +org $80d8c4 ; < ? - Bank00.asm:4068 () +jsl OWWorldCheck +org $82aa36 ; < ? - Bank02.asm:6559 () +jsl OWWorldCheck +org $82aeca ; < ? - Bank02.asm:7257 () +jsl OWWorldCheck16 : nop +org $82b349 ; < ? - Bank02.asm:7902 () +jsl OWWorldCheck +org $82c40a ; < ? - Bank02.asm:10547 () +jsl OWWorldCheck +org $85afd9 ; < ? - sprite_warp_vortex.asm:60 () +jsl OWWorldCheck +org $87a3f0 ; < ? - Bank07.asm:5772 () ; flute activation/use +jsl OWWorldCheck +org $87a967 ; < ? - Bank07.asm:6578 () +jsl OWWorldCheck +org $87a9a1 ; < ? - Bank07.asm:6622 () +jsl OWWorldCheck +org $87a9ed ; < ? - Bank07.asm:6677 () +jsl OWWorldCheck +org $87aa34 ; < ? - Bank07.asm:6718 () +jsl OWWorldCheck +org $88d408 ; < ? - ancilla_morph_poof.asm:48 () +jsl OWWorldCheck +org $8bfeab ; < ? - Bank0b.asm:36 () +jsl OWWorldCheck16 : nop +org $8cffb6 ; < ? - ?.asm ? () +jsl OWWorldCheck16 : nop +org $8cffe8 ; < ? - ?.asm ? () +jsl OWWorldCheck16 : nop +org $9beca2 ; < ? - palettes.asm:556 () +jsl OWWorldCheck16 : nop +org $9bed95 ; < ? - palettes.asm:748 () +jsl OWWorldCheck16 : nop -org $02b16e ; AND #$3F : ORA 7EF3CA +org $82b16e ; AND #$3F : ORA 7EF3CA and #$7f : eor #$40 : nop #2 -org $09C3C4 -jsl.l OWBonkDropPrepSprite : nop #2 -org $09C801 -jsl.l OWBonkDropPrepSprite : nop #2 -org $06D052 -jsl.l OWBonkDropSparkle -org $06AD49 -jsl.l OWBonkDropsOverworld : nop -org $1EDE6A -jsl.l OWBonkDropSparkle : BNE GoldBee_Dormant_exit -jsl.l OWBonkDropsUnderworld : bra + +org $89C3C4 +jsl OWBonkDropPrepSprite : nop #2 +org $89C801 +jsl OWBonkDropPrepSprite : nop #2 +org $86D052 +jsl OWBonkDropSparkle +org $86AD49 +jsl OWBonkDropsOverworld : nop +org $9EDE6A +jsl OWBonkDropSparkle : BNE GoldBee_Dormant_exit +jsl OWBonkDropsUnderworld : bra + GoldBee_SpawnSelf_SetProperties: phb : lda.b #$1E : pha : plb ; switch to bank 1E jsr GoldBee_SpawnSelf+12 @@ -216,18 +209,18 @@ DivideByTwoPreserveSign: OWWorldCheck: { phx - ldx $8a : lda.l OWTileWorldAssoc,x + ldx.b OverworldIndex : lda.l OWTileWorldAssoc,x plx : and.b #$ff : rtl } OWWorldCheck16: { phx - ldx $8a : lda.l OWTileWorldAssoc,x + ldx.b OverworldIndex : lda.l OWTileWorldAssoc,x plx : and.w #$00ff : rtl } OWMapWorldCheck16: { - lda $10 : cmp #$0014 : beq .return ; attract module, return with Z flag cleared + lda.b GameMode : cmp.w #$0014 : beq .return ; attract module, return with Z flag cleared jsl OWWorldCheck16 .return rtl @@ -235,19 +228,19 @@ OWMapWorldCheck16: OWWhirlpoolUpdate: { - jsl $02ea6c ; what we wrote over - ldx $8a : ldy #$03 : jsr OWWorldTerrainUpdate + jsl FindPartnerWhirlpoolExit ; what we wrote over + ldx.b OverworldIndex : ldy.b #$03 : jsr OWWorldTerrainUpdate rtl } OWWhirlpoolEnd: { - STZ.b $B0 ; what we wrote over - LDA.w $0703 : BEQ .normal - LDA.b #$3C : STA.w $012E ; play error sound before forced transition + STZ.b SubSubModule ; what we wrote over + LDA.w RandoOverworldForceTrans : BEQ .normal + LDA.b #$3C : STA.w SFX2 ; play error sound before forced transition RTL .normal - STZ.b $11 ; end whirlpool transition + STZ.b GameSubMode ; end whirlpool transition RTL } @@ -255,11 +248,11 @@ OWDestroyItemSprites: { PHX : LDX.b #$0F .nextSprite - LDA.w $0E20,X + LDA.w SpriteTypeTable,X CMP.b #$D8 : BCC .continue CMP.b #$EC : BCS .continue .killSprite ; need to kill sprites from D8 to EB on screen transition - STZ.w $0DD0,X + STZ.w SpriteAITable,X .continue DEX : BPL .nextSprite PLX : RTL @@ -273,7 +266,7 @@ OWMirrorSpriteOnMap: } OWMirrorSpriteDisable: { - LDA.b $10 : CMP.b #$0F : BNE + ; avoid rare freeze during mirror superbunny + LDA.b GameMode : CMP.b #$0F : BNE + ; avoid rare freeze during mirror superbunny PLA : PLA : PLA : JML Sprite_6C_MirrorPortal_missing_mirror + @@ -293,7 +286,7 @@ OWMirrorSpriteSkipDraw: lda.l CurrentWorld : eor.b #$40 bra ++ + lda.l CurrentWorld : ++ beq .vanilla - stz.w $0D90,x ; disables collision + stz.w SpriteMovement,x ; disables collision sec : rtl .vanilla @@ -304,56 +297,56 @@ OWLightWorldOrCrossed: { lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq ++ lda.l InvertedMode : beq + - lda #$40 + lda.b #$40 + rtl ++ jsl OWWorldCheck : rtl } OWFluteCancel: { - lda.l OWFlags+1 : and #$01 : bne + + lda.l OWFlags+1 : and.b #$01 : bne + jsl FluteMenu_LoadTransport : rtl - + lda $7f5006 : cmp #$01 : beq + + + lda.l HexToDecDigit4 : cmp.b #$01 : beq + jsl FluteMenu_LoadTransport - + lda #$00 : sta $7f5006 : rtl + + lda.b #$00 : sta.l HexToDecDigit4 : rtl } OWFluteCancel2: { - lda $f2 : ora $f0 : and #$c0 : bne + + lda.b Joy1B_All : ora.b Joy1A_All : and.b #$c0 : bne + jml FluteMenu_HandleSelection_NoSelection - + inc $0200 - lda.l OWFlags+1 : and #$01 : beq + - lda $f2 : cmp #$40 : bne + - lda #$01 : sta $7f5006 + + inc.w SubModuleInterface + lda.l OWFlags+1 : and.b #$01 : beq + + lda.b Joy1B_All : cmp.b #$40 : bne + + lda.b #$01 : sta.l HexToDecDigit4 + rtl } OWSmithAccept: { - lda FollowerIndicator : cmp #$07 : beq + - cmp #$08 : beq + + lda FollowerIndicator : cmp.b #$07 : beq + + cmp.b #$08 : beq + clc : rtl + sec : rtl } OWOldManSpeed: { - lda $1b : beq .outdoors - lda $a0 : and #$fe : cmp #$f0 : beq .vanilla ; if in cave where you find Old Man + lda.b IndoorsFlag : beq .outdoors + lda.b RoomIndex : and.b #$fe : cmp.b #$f0 : beq .vanilla ; if in cave where you find Old Man bra .normalspeed .outdoors - lda $8a : cmp #$03 : beq .vanilla ; if on WDM screen + lda.b OverworldIndex : cmp.b #$03 : beq .vanilla ; if on WDM screen .normalspeed - lda $5e : cmp #$0c : rtl - stz $5e : rtl + lda.b LinkSpeed : cmp.b #$0c : rtl + stz.b LinkSpeed : rtl .vanilla - lda #$0c : sta $5e ; what we wrote over + lda.b #$0c : sta.b LinkSpeed ; what we wrote over rtl } OWMarkVisited: { - LDX.b $8A : STZ.w $0412 ; what we wrote over - LDA.b $10 : CMP.b #$14 : BCS .return + LDX.b OverworldIndex : STZ.w $0412 ; what we wrote over + LDA.b GameMode : CMP.b #$14 : BCS .return LDA.l OverworldEventDataWRAM,X ORA.b #$80 : STA.l OverworldEventDataWRAM,X @@ -366,19 +359,19 @@ LoadMapDarkOrMixed: CMP.b #!FLAG_OW_MIXED : REP #$30 : BEQ .mixed LDX.w #$03FE ; draw vanilla Dark World (what we wrote over) .copy_next - LDA.w $D739,X : STA.w $1000,X ; DB is $0A + LDA.w WorldMap_DarkWorldTilemap,X : STA.w $1000,X DEX : DEX : BPL .copy_next BRL .end .mixed - LDX.b $8A + LDX.b OverworldIndex LDA.l OWTileWorldAssoc,X - STA.b $00 + STA.b Scrap00 LDY.w #$139C LDX.w #$003F .next_screen PHX LDA.l OWTileWorldAssoc,X - EOR.b $00 + EOR.b Scrap00 AND.w #$0040 BEQ .light TYX : BRA .copy_screen @@ -404,7 +397,7 @@ LoadMapDarkOrMixed: BPL .next_screen .end SEP #$30 - LDA.b #$15 : STA.b $17 ; what we wrote over + LDA.b #$15 : STA.b NMIINCR ; what we wrote over RTL LWQuadrantOffsets: @@ -417,30 +410,30 @@ LoadMapDarkOrMixed: OWBonkDropPrepSprite: { - LDA.b $1B : BEQ + + LDA.b IndoorsFlag : BEQ + LDA.w $0FB5 ; what we wrote over PHA BRA .continue + - STZ.w $0F20,X : STZ.w $0E30,X ; what we wrote over + STZ.w SpriteLayer,X : STZ.w SpriteAux,X ; what we wrote over PHA .continue LDA.l OWFlags+1 : AND.b #!FLAG_OW_BONKDROP : BEQ .return - + LDA.w $0E20,X : CMP.b #$D9 : BNE + - LDA.b #$03 : STA.w $0F20,X + + LDA.w SpriteTypeTable,X : CMP.b #$D9 : BNE + + LDA.b #$03 : STA.w SpriteLayer,X BRA .prep + CMP.b #$B2 : BEQ .prep PLA : RTL .prep - STZ.w !SPRITE_REDRAW,X + STZ.w SprRedrawFlag,X PHB : PHK : PLB : PHY TXY : JSR OWBonkDropLookup : BCC .done ; found match ; X = rec + 1 INX : LDA.w OWBonkPrizeData,X : PHA JSR OWBonkDropCollected : PLA : BCC .done - TYX : LDA.b #$01 : STA.w !SPRITE_REDRAW,X + TYX : LDA.b #$01 : STA.w SprRedrawFlag,X .done TYX : PLY : PLB @@ -452,7 +445,7 @@ OWBonkDropSparkle: { LDA.l OWFlags+1 : AND.b #!FLAG_OW_BONKDROP : BEQ .nosparkle LDA.w $0E90,X : BEQ .nosparkle - LDA.w !SPRITE_REDRAW,X : BNE .nosparkle + LDA.w SprRedrawFlag,X : BNE .nosparkle JSL Sprite_SpawnSparkleGarnish ; move sparkle down 1 tile PHX : TYX : PLY @@ -461,12 +454,12 @@ OWBonkDropSparkle: PHY : TXY : PLX .nosparkle - LDA $0E20,X : CMP.b #$D9 : BEQ .greenrupee + LDA.w SpriteTypeTable,X : CMP.b #$D9 : BEQ .greenrupee CMP.b #$B2 : BEQ .goodbee RTL .goodbee - LDA $0E90,X ; what we wrote over + LDA.w $0E90,X ; what we wrote over RTL .greenrupee @@ -478,20 +471,20 @@ OWBonkDropsUnderworld: { LDA.l OWFlags+1 : AND.b #!FLAG_OW_BONKDROP : BNE .shuffled .vanilla ; what we wrote over - STZ.w $0DD0,X + STZ.w SpriteAITable,X LDA.l BottleContentsOne : ORA.l BottleContentsTwo ORA.l BottleContentsThree : ORA.l BottleContentsFour RTL .shuffled - LDA.w $0DD0,X : BNE + + LDA.w SpriteAITable,X : BNE + BRA .return+1 + PHY : TXY JSL OWBonkDrops .return PLY - LDA #$08 ; makes original good bee not spawn + LDA.b #$08 ; makes original good bee not spawn RTL } @@ -501,23 +494,23 @@ OWBonkDropsOverworld: BRA .vanilla .shuffled - LDA.w $0DD0,Y : BNE + + LDA.w SpriteAITable,Y : BNE + BRA .vanilla - + LDA.w $0E20,Y : CMP.b #$D9 : BEQ + + + LDA.w SpriteTypeTable,Y : CMP.b #$D9 : BEQ + BRA .vanilla+3 + - LDA.b #$00 : STA.w $0F20,Y ; restore proper layer + LDA.b #$00 : STA.w SpriteLayer,Y ; restore proper layer JSL OWBonkDrops .vanilla - LDA.w $0E20,Y : CMP.b #$D8 ; what we wrote over + LDA.w SpriteTypeTable,Y : CMP.b #$D8 ; what we wrote over RTL } OWBonkDrops: { PHB : PHK : PLB - LDA.b $1B : BEQ + + LDA.b IndoorsFlag : BEQ + LDX.b #((UWBonkPrizeData-OWBonkPrizeData)+1) BRA .found_match + @@ -527,7 +520,7 @@ OWBonkDrops: .found_match INX : LDA.w OWBonkPrizeData,X : PHX : PHA ; S = FlagBitmask, X (row + 2) JSR OWBonkDropCollected : PHA : BCS .load_item_and_mw ; S = Collected, FlagBitmask, X (row + 2) - LDA.b #$1B : STA $12F ; JSL Sound_SetSfx3PanLong ; seems that when you bonk, there is a pending bonk sfx, so we clear that out and replace with reveal secret sfx + LDA.b #$1B : STA.w SFX3 ; JSL Sound_SetSfx3PanLong ; seems that when you bonk, there is a pending bonk sfx, so we clear that out and replace with reveal secret sfx ; JSLSpriteSFX_QueueSFX3WithPan .load_item_and_mw @@ -539,10 +532,10 @@ OWBonkDrops: + DEX : PLA ; A = item id; X = row + 3 .determine_type ; A = item id; X = row + 3; S = Collected, FlagBitmask, X (row + 2) - CMP.b #$B0 : BNE + + CMP.b #$D0 : BNE + LDA.b #$79 : JMP .sprite_transform ; transform to bees + CMP.b #$42 : BNE + - JSL.l Sprite_TransmuteToBomb ; transform a heart to bomb, vanilla behavior + JSL Sprite_TransmuteToBomb ; transform a heart to bomb, vanilla behavior JMP .mark_collected + CMP.b #$34 : BNE + LDA.b #$D9 : JMP .sprite_transform ; transform to single rupee @@ -558,37 +551,37 @@ OWBonkDrops: LDA.b #$DE : BRA .sprite_transform ; transform to 8 bombs + CMP.b #$45 : BNE + LDA.b #$DF : BRA .sprite_transform ; transform to small magic - + CMP.b #$B4 : BNE + + + CMP.b #$D4 : BNE + LDA.b #$E0 : BRA .sprite_transform ; transform to big magic - + CMP.b #$B5 : BNE + - LDA.b #$79 : JSL.l OWBonkSpritePrep - JSL.l GoldBee_SpawnSelf_SetProperties ; transform to good bee + + CMP.b #$D6 : BNE + + LDA.b #$79 : JSL OWBonkSpritePrep + JSL GoldBee_SpawnSelf_SetProperties ; transform to good bee BRA .mark_collected + CMP.b #$44 : BNE + LDA.b #$E2 : BRA .sprite_transform ; transform to 10 arrows - + CMP.b #$B1 : BNE + + + CMP.b #$D1 : BNE + LDA.b #$AC : BRA .sprite_transform ; transform to apples - + CMP.b #$B2 : BNE + + + CMP.b #$D2 : BNE + LDA.b #$E3 : BRA .sprite_transform ; transform to fairy - + CMP.b #$B3 : BNE .spawn_item + + CMP.b #$D3 : BNE .spawn_item INX : INX : LDA.w OWBonkPrizeData,X ; X = row + 5 CLC : ADC.b #$08 : PHA - LDA.w $0D00,Y : SEC : SBC.b 1,S : STA.w $0D00,Y - LDA.w $0D20,Y : SBC.b #$00 : STA.w $0D20,Y : PLX + LDA.w SpritePosYLow,Y : SEC : SBC.b 1,S : STA.w SpritePosYLow,Y + LDA.w SpritePosYHigh,Y : SBC.b #$00 : STA.w SpritePosYHigh,Y : PLX LDA.b #$0B ; BRA .sprite_transform ; transform to chicken .sprite_transform - JSL.l OWBonkSpritePrep + JSL OWBonkSpritePrep .mark_collected ; S = Collected, FlagBitmask, X (row + 2) PLA : BNE + ; S = FlagBitmask, X (row + 2) TYX : JSL Sprite_IsOnscreen : BCC + - LDA.b $1B : BEQ ++ + LDA.b IndoorsFlag : BEQ ++ LDA.l RoomDataWRAM[$0120].high : ORA 1,S : STA.l RoomDataWRAM[$0120].high LDA.w $0400 : ORA 1,S : STA.w $0400 BRA .increment_collection ++ - LDX.b $8A : LDA.l OverworldEventDataWRAM,X : ORA 1,S : STA.l OverworldEventDataWRAM,X + LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X : ORA 1,S : STA.l OverworldEventDataWRAM,X .increment_collection REP #$20 @@ -598,40 +591,41 @@ OWBonkDrops: ; spawn itemget item .spawn_item ; A = item id ; Y = bonk sprite slot ; S = Collected, FlagBitmask, X (row + 2) - PLX : BEQ + : LDA.b #$00 : STA.w $0DD0,Y : BRA .return ; S = FlagBitmask, X (row + 2) + PLX : BEQ + : LDA.b #$00 : STA.w SpriteAITable,Y : BRA .return ; S = FlagBitmask, X (row + 2) + PHA - LDA.b #$01 : STA !FORCE_HEART_SPAWN - - LDA.b #$EB : STA.l $7FFE00 + LDA.b #$EB : STA.l MiniGameTime JSL Sprite_SpawnDynamically+15 ; +15 to skip finding a new slot, use existing sprite - LDA.b #$01 : STA.w !SPRITE_REDRAW,Y + LDA.b #$01 : STA.w SprRedrawFlag,Y - PLA : STA.w $0E80,Y + PLA + JSL AttemptItemSubstitution + STA.w SpriteItemType,Y + STA.w SpriteID,Y ; affects the rate the item moves in the Y/X direction - LDA.b #$00 : STA.w $0D40,Y - LDA.b #$0A : STA.w $0D50,Y + LDA.b #$00 : STA.w SpriteVelocityY,Y + LDA.b #$0A : STA.w SpriteVelocityX,Y - LDA.b #$1A : STA.w $0F80,Y ; amount of force (gives height to the arch) - LDA.b #$FF : STA.w $0B58,Y ; stun timer - LDA.b #$30 : STA.w $0F10,Y ; aux delay timer 4 ?? dunno what that means + LDA.b #$1A : STA.w SpriteVelocityZ,Y ; amount of force (gives height to the arch) + LDA.b #$FF : STA.w EnemyStunTimer,Y ; stun timer + LDA.b #$30 : STA.w SpriteTimerE,Y ; aux delay timer 4 ?? dunno what that means - LDA.b #$00 : STA.w $0F20,Y ; layer the sprite is on + LDA.b #$00 : STA.w SpriteLayer,Y ; layer the sprite is on - LDA.b $1B : BEQ + + LDA.b IndoorsFlag : BEQ + ; sets the tile type that is underneath the sprite, water TYX : LDA.b #$09 : STA.l $7FF9C2,X ; TODO: Figure out how to get the game to set this + ; sets bitmask flag, uses free RAM - PLA : STA.w $0ED0,Y ; S = X (row + 2) + PLA : STA.w SpriteSpawnStep,Y ; S = X (row + 2) ; determines the initial spawn point of item PLX : INX : INX : INX - LDA.w $0D00,Y : SEC : SBC.w OWBonkPrizeData,X : STA.w $0D00,Y - LDA.w $0D20,Y : SBC #$00 : STA.w $0D20,Y + LDA.w SpritePosYLow,Y : SEC : SBC.w OWBonkPrizeData,X : STA.w SpritePosYLow,Y + LDA.w SpritePosYHigh,Y : SBC #$00 : STA.w SpritePosYHigh,Y BRA .return+2 @@ -644,14 +638,14 @@ OWBonkDrops: OWBonkDropLookup: { ; loop thru rando bonk table to find match - LDA.b $8A + LDA.b OverworldIndex LDX.b #((UWBonkPrizeData-OWBonkPrizeData)-sizeof(OWBonkPrizeTable)) ; 41 bonk items, 6 bytes each - CMP.w OWBonkPrizeData,X : BNE + INX - LDA.w $0D10,Y : LSR A : LSR A : LSR A : LSR A - EOR.w $0D00,Y : CMP.w OWBonkPrizeData,X : BNE ++ ; X = row + 1 + LDA.w SpritePosXLow,Y : LSR A : LSR A : LSR A : LSR A + EOR.w SpritePosYLow,Y : CMP.w OWBonkPrizeData,X : BNE ++ ; X = row + 1 SEC : RTS - ++ DEX : LDA.b $8A + ++ DEX : LDA.b OverworldIndex + CPX.b #$00 : BNE + CLC : RTS + DEX : DEX : DEX : DEX : DEX : DEX : BRA - @@ -662,11 +656,11 @@ OWBonkDropCollected: { ; check if collected CLC - LDA.b $1B : BEQ + + LDA.b IndoorsFlag : BEQ + LDA.l RoomDataWRAM[$0120].high : AND.b 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2) SEC : RTS + - LDX.b $8A : LDA.l OverworldEventDataWRAM,X : AND 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2) + LDX.b OverworldIndex : LDA.l OverworldEventDataWRAM,X : AND 3,S : BEQ .return ; S = Collected, FlagBitmask, X (row + 2) SEC : RTS .return @@ -676,13 +670,13 @@ OWBonkDropCollected: ; A = SpriteID, Y = Sprite Slot Index, X = free/overwritten OWBonkSpritePrep: { - STA.w $0E20,Y - TYX : JSL.l Sprite_LoadProperties + STA.w SpriteTypeTable,Y + TYX : JSL SpritePrep_LoadProperties BEQ + ; these are sprite properties that make it fall out of the tree to the east - LDA #$30 : STA $0F80,Y ; amount of force (related to speed) - LDA #$10 : STA $0D50,Y ; eastward rate of speed - LDA #$FF : STA $0B58,Y ; expiration timer + LDA.b #$30 : STA.w SpriteVelocityZ,Y ; amount of force (related to speed) + LDA.b #$10 : STA.w SpriteVelocityX,Y ; eastward rate of speed + LDA.b #$FF : STA.w EnemyStunTimer,Y ; expiration timer + RTL } @@ -690,27 +684,27 @@ org $aa9000 OWDetectEdgeTransition: { JSL OWDestroyItemSprites - STZ.w $06FC + STZ.w RandoOverworldWalkDist LDA.l OWMode : ORA.l OWMode+1 : BEQ .vanilla JSR OWShuffle - LDA.w $06FA : BMI .special + LDA.w RandoOverworldTargetEdge : BMI .special .vanilla - REP #$31 : LDX.b $02 : LDA.b $84 ; what we wrote over + REP #$31 : LDX.b Scrap02 : LDA.b OverworldMap16Buffer ; what we wrote over RTL .special REP #$30 AND.w #$0003 : TAY : ASL : TAX - LDA.w #$007F : STA.w $06FA + LDA.w #$007F : STA.w RandoOverworldTargetEdge JSR OWLoadSpecialArea SEC RTL } OWDetectSpecialTransition: { - STZ.w $06FC + STZ.w RandoOverworldWalkDist LDA.l OWMode : BEQ .normal TXA : AND.w #$0002 : LSR - STA.w $0704 + STA.w RandoOverworldTerrain LDA.l OWSpecialDestIndex,X : BIT.w #$0080 : BEQ .switch_to_edge AND.w #$0003 : TAY : ASL : TAX .normal @@ -719,40 +713,40 @@ OWDetectSpecialTransition: RTL .switch_to_edge - STA.w $06FA - LDA.l OWEdgeDataOffset,X : STA.w $06F8 + STA.w RandoOverworldTargetEdge + LDA.l OWEdgeDataOffset,X : STA.w RandoOverworldEdgeAddr PLA : SEP #$30 : PLA ; delete 3 bytes from stack JSL Link_CheckForEdgeScreenTransition : BCS .return ; Link_CheckForEdgeScreenTransition - LDA.l Overworld_CheckForSpecialOverworldTrigger_Direction,X : STA.b $00 : CMP.b #$08 : BNE .hobo - LSR : STA.b $20 : STZ.b $E8 ; move Link and camera to edge - LDA.b #$06 : STA.b $02 - STZ.w $0418 + LDA.l Overworld_CheckForSpecialOverworldTrigger_Direction,X : STA.b Scrap00 : CMP.b #$08 : BNE .hobo + LSR : STA.b LinkPosY : STZ.b BG2V ; move Link and camera to edge + LDA.b #$06 : STA.b Scrap02 + STZ.w TransitionDirection BRA .continue .hobo - STA.b $02 : STA.w $0418 - ASL : STA.b $22 : STZ.b $E2 ; move Link and camera to edge - LDA.b #$0A : STA.b $23 : STA.b $E3 + STA.b Scrap02 : STA.w TransitionDirection + ASL : STA.b LinkPosX : STZ.b BG2H ; move Link and camera to edge + LDA.b #$0A : STA.b LinkPosX+1 : STA.b BG2H+1 .continue - STZ.b $03 + STZ.b Scrap03 ; copied from DeleteCertainAncillaeStopDashing at $028A0E JSL Ancilla_TerminateSelectInteractives - LDA.w $0372 : BEQ .not_dashing - STZ.b $4D : STZ.b $46 - LDA.b #$FF : STA.b $29 : STA.b $C7 - STZ.b $3D : STZ.b $5E : STZ.w $032B : STZ.w $0372 : STZ.b $5D + LDA.w LinkDashing : BEQ .not_dashing + STZ.b LinkJumping : STZ.b LinkIncapacitatedTimer + LDA.b #$FF : STA.b LinkRecoilZ : STA.b $C7 + STZ.b $3D : STZ.b LinkSpeed : STZ.w $032B : STZ.w LinkDashing : STZ.b LinkState .not_dashing PLA : REP #$31 : PLA ; delete 3 bytes from stack - LDX.b $02 - LDA.b $84 + LDX.b Scrap02 + LDA.b OverworldMap16Buffer JML OverworldHandleTransitions_SpecialTrigger+6 } OWEdgeTransition: { LDA.l OWMode : ORA.l OWMode+1 : BEQ .unshuffled - LDY.w $06FA : CPY.b #$7F + LDY.w RandoOverworldTargetEdge : CPY.b #$7F BEQ .unshuffled REP #$10 - LDX.w $06F8 + LDX.w RandoOverworldEdgeAddr PHB : PHK : PLB JSR OWNewDestination PLB @@ -773,10 +767,10 @@ OWSpecialExit: LDA.l OWMode : ORA.l OWMode+1 : BEQ .vanilla PHY LDY.b #$00 - LDA.w $0418 : LSR : BNE + - LDY.w $0704 : BRA ++ + LDA.w TransitionDirection : LSR : BNE + + LDY.w RandoOverworldTerrain : BRA ++ + - LDA.w $0704 : BNE ++ + LDA.w RandoOverworldTerrain : BNE ++ LDY.b #$02 ++ JSR OWWorldTerrainUpdate @@ -788,21 +782,21 @@ OWSpecialExit: OWShuffle: { ;determine direction of edge transition - phx : lsr.w $0700 - tyx : lda.l OWTransitionDirection,X : sta.w $0418 + phx : lsr.w OverworldSlotPosition + tyx : lda.l OWTransitionDirection,X : sta.w TransitionDirection .setOWID ;look up transitions in current area in table OWEdgeOffsets ;offset is (8bytes * OW Slot ID) + (2bytes * direction) asl : rep #$20 : and.w #$00ff : pha : sep #$20 ;2 bytes per direction - ldx $8a : lda.l OWTileWorldAssoc,X : eor.l CurrentWorld : beq + + ldx.b OverworldIndex : lda.l OWTileWorldAssoc,X : eor.l CurrentWorld : beq + ; fake world, will treat this OW area as opposite world txa : eor.b #$40 : tax - + txa : and #$40 : !add $700 : rep #$30 : and #$00ff : asl #3 + + txa : and #$40 : !add.w OverworldSlotPosition : rep #$30 : and #$00ff : asl #3 adc 1,S : tax - asl $700 : pla + asl.w OverworldSlotPosition : pla ;x = offset to edgeoffsets table sep #$20 : lda.l OWEdgeOffsets,x : and #$ff : beq .noTransition : pha ;get number of transitions @@ -810,16 +804,16 @@ OWShuffle: inx : lda.l OWEdgeOffsets,x ;record id of first transition in table ;multiply ^ by 16, 16bytes per record - sta $4202 : lda #16 : sta $4203 ;wait 8 cycles + sta.w CPUMULTA : lda #16 : sta.w CPUMULTB ;wait 8 cycles pla ;a = number of trans rep #$20 - and #$00ff - ldx $4216 ;x = offset to first record + and.w #$00ff + ldx.w CPUPRODUCT ;x = offset to first record .nextTransition pha jsr OWSearchTransition_entry : bcs .newDestination - txa : !add #$0010 : tax + txa : !add.w #$0010 : tax pla : dec : bne .nextTransition : bra .noTransition .newDestination @@ -827,7 +821,7 @@ OWShuffle: .noTransition sep #$30 : plx - lda.b #$7f : sta.w $06fa + lda.b #$7f : sta.w RandoOverworldTargetEdge .return rts @@ -839,10 +833,10 @@ OWSearchTransition: .entry ;A-16 XY-16 - lda $418 : bne + ;north + lda.w TransitionDirection : bne + ;north lda.l OWNorthEdges,x : dec - cmp $22 : !bge .exitloop - lda.l OWNorthEdges+2,x : cmp $22 : !blt .exitloop + cmp.b LinkPosX : !bge .exitloop + lda.l OWNorthEdges+2,x : cmp.b LinkPosX : !blt .exitloop ;MATCH lda.l OWNorthEdges+14,x : tay ;y = record id of dest lda.l OWNorthEdges+12,x ;a = current terrain @@ -850,8 +844,8 @@ OWSearchTransition: bra .matchfound + dec : bne + ;south lda.l OWSouthEdges,x : dec - cmp $22 : !bge .exitloop - lda.l OWSouthEdges+2,x : cmp $22 : !blt .exitloop + cmp.b LinkPosX : !bge .exitloop + lda.l OWSouthEdges+2,x : cmp.b LinkPosX : !blt .exitloop ;MATCH lda.l OWSouthEdges+14,x : tay ;y = record id of dest lda.l OWSouthEdges+12,x ;a = current terrain @@ -859,135 +853,135 @@ OWSearchTransition: bra .matchfound + dec : bne + ; west lda.l OWWestEdges,x : dec - cmp $20 : !bge .exitloop - lda.l OWWestEdges+2,x : cmp $20 : !blt .exitloop + cmp.b LinkPosY : !bge .exitloop + lda.l OWWestEdges+2,x : cmp.b LinkPosY : !blt .exitloop ;MATCH lda.l OWWestEdges+14,x : tay ;y = record id of dest lda.l OWWestEdges+12,x ;a = current terrain ldx.w #OWEastEdges ;x = address of table bra .matchfound + lda.l OWEastEdges,x : dec ;east - cmp $20 : !bge .exitloop - lda.l OWEastEdges+2,x : cmp $20 : !blt .exitloop + cmp.b LinkPosY : !bge .exitloop + lda.l OWEastEdges+2,x : cmp.b LinkPosY : !blt .exitloop ;MATCH lda.l OWEastEdges+14,x : tay ;y = record id of dest lda.l OWEastEdges+12,x ;a = current terrain ldx.w #OWWestEdges ;x = address of table .matchfound - stx $06f8 : sty $06fa : sta $0704 : sec : rts - plx : pla : pea $0001 : phx + stx.w RandoOverworldEdgeAddr : sty.w RandoOverworldTargetEdge : sta.w RandoOverworldTerrain : sec : rts + plx : pla : pea.w $0001 : phx sec : rts } OWNewDestination: { - tya : sta $4202 : lda #16 : sta $4203 ;wait 8 cycles - rep #$20 : txa : nop : !add $4216 : tax ;a = offset to dest record - lda.w $0008,x : sta $04 ;save dest OW slot/ID - ldy $20 : lda $418 : dec #2 : bpl + : ldy $22 : + sty $06 + tya : sta.w CPUMULTA : lda.b #16 : sta.w CPUMULTB ;wait 8 cycles + rep #$20 : txa : nop : !add.w CPUPRODUCT : tax ;a = offset to dest record + lda.w $0008,x : sta.b Scrap04 ;save dest OW slot/ID + ldy.b LinkPosY : lda.w TransitionDirection : dec #2 : bpl + : ldy.b LinkPosX : + sty.b Scrap06 ;;22 e0 e2 61c 61e - X ;;20 e6 e8 618 61a - Y ;keep current position if within incoming gap - lda.w $0000,x : and #$01ff : pha : lda.w $0002,x : and #$01ff : pha + lda.w $0000,x : and.w #$01ff : pha : lda.w $0002,x : and.w #$01ff : pha LDA.l OWMode : AND.w #$0007 : BEQ .noLayoutShuffle ;temporary fix until VRAM issues are solved - lda.w $0006,x : sta $06 ;set coord - lda.w $000a,x : sta $84 ;VRAM - tya : and #$01ff : cmp 3,s : !blt .adjustMainAxis - dec : cmp 1,s : !bge .adjustMainAxis - inc : pha : lda $06 : and #$fe00 : !add 1,s : sta $06 : pla + lda.w $0006,x : sta.b Scrap06 ;set coord + lda.w $000a,x : sta.b OverworldMap16Buffer ;VRAM + tya : and.w #$01ff : cmp.b 3,s : !blt .adjustMainAxis + dec : cmp.b 1,s : !bge .adjustMainAxis + inc : pha : lda.b Scrap06 : and.w #$fe00 : !add.b 1,s : sta.b Scrap06 : pla ; adjust and set other VRAM addresses - lda.w $0006,x : pha : lda $06 : !sub 1,s + lda.w $0006,x : pha : lda.b Scrap06 : !sub 1,s jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : jsl DivideByTwoPreserveSign : pha ; number of tiles - lda $418 : dec #2 : bmi + - pla : pea $0000 : bra ++ ;pla : asl #7 : pha : bra ++ ; y-axis shifts VRAM by increments of 0x80 (disabled for now) + lda.w TransitionDirection : dec #2 : bmi + + pla : pea.w $0000 : bra ++ ;pla : asl #7 : pha : bra ++ ; y-axis shifts VRAM by increments of 0x80 (disabled for now) + pla : asl : pha ; x-axis shifts VRAM by increments of 0x02 - ++ lda $84 : !add 1,s : sta $84 : pla : pla + ++ lda.b OverworldMap16Buffer : !add 1,s : sta.b OverworldMap16Buffer : pla : pla .adjustMainAxis - LDA $84 : SEC : SBC #$0400 : AND #$0F00 : ASL : XBA : STA $88 ; vram - LDA $84 : SEC : SBC #$0010 : AND #$003E : LSR : STA $86 + LDA.b OverworldMap16Buffer : SEC : SBC #$0400 : AND #$0F00 : ASL : XBA : STA.b OverworldTilemapIndexY ; vram + LDA.b OverworldMap16Buffer : SEC : SBC #$0010 : AND #$003E : LSR : STA.b OverworldTilemapIndexX .noLayoutShuffle - LDA.w $000F,X : AND.w #$00FF : STA.w $06FC ; position to walk to after transition (if non-zero) + LDA.w $000F,X : AND.w #$00FF : STA.w RandoOverworldWalkDist ; position to walk to after transition (if non-zero) LDY.w #$0000 LDA.w $000C,X : AND.w #$0001 : BEQ + ; check if going to water transition - LDA.w $0704 : AND.w #$0001 : BNE ++ ; check if coming from water transition + LDA.w RandoOverworldTerrain : AND.w #$0001 : BNE ++ ; check if coming from water transition INY : BRA ++ + - LDA.w $0704 : BEQ ++ ; check if coming from water transition + LDA.w RandoOverworldTerrain : BEQ ++ ; check if coming from water transition LDY.w #$0002 ++ - STY.b $08 + STY.b Scrap08 - pla : pla : sep #$10 : ldy $418 - ldx OWCoordIndex,y : lda $20,x : and #$fe00 : pha - lda $20,x : and #$01ff : pha ;s1 = relative cur, s3 = ow cur - lda $06 : and #$fe00 : !sub 3,s : pha ;set coord, s1 = ow diff, s3 = relative cur, s5 = ow cur - lda $06 : and #$01ff : !sub 3,s : pha ;s1 = rel diff, s3 = ow diff, s5 = relative cur, s7 = ow cur - lda $06 : sta $20,x : and #$fe00 : sta $06 ;set coord - ldx OWBGIndex,y : lda $e2,x : !add 1,s : adc 3,s : sta $e2,x - ldx OWCameraIndex,y : lda $618,x : !add 1,s : adc 3,s : sta $618,x - ldx OWCameraIndex,y : lda $61a,x : !add 1,s : adc 3,s : sta $61a,x + pla : pla : sep #$10 : ldy.w TransitionDirection + ldx.w OWCoordIndex,y : lda.b LinkPosY,x : and.w #$fe00 : pha + lda.b LinkPosY,x : and.w #$01ff : pha ;s1 = relative cur, s3 = ow cur + lda.b Scrap06 : and #$fe00 : !sub.b 3,s : pha ;set coord, s1 = ow diff, s3 = relative cur, s5 = ow cur + lda.b Scrap06 : and.w #$01ff : !sub.b 3,s : pha ;s1 = rel diff, s3 = ow diff, s5 = relative cur, s7 = ow cur + lda.b Scrap06 : sta.b LinkPosY,x : and.w #$fe00 : sta.b Scrap06 ;set coord + ldx.w OWBGIndex,y : lda.b BG2H,x : !add.b 1,s : adc.b 3,s : sta.b BG2H,x + ldx.w OWCameraIndex,y : lda.w CameraScrollN,x : !add.b 1,s : adc.b 3,s : sta.w CameraScrollN,x + ldx.w OWCameraIndex,y : lda.w CameraScrollS,x : !add.b 1,s : adc.b 3,s : sta.w CameraScrollS,x pla : jsl DivideByTwoPreserveSign : pha - ldx OWBGIndex,y : lda $e0,x : !add 1,s : sta $e0,x : pla - ldx OWBGIndex,y : lda $e0,x : !add 1,s : sta $e0,x : pla + ldx.w OWBGIndex,y : lda.b BG1H,x : !add.b 1,s : sta.b BG1H,x : pla + ldx.w OWBGIndex,y : lda.b BG1H,x : !add.b 1,s : sta.b BG1H,x : pla pla : pla ;fix camera unlock - lda $e2,x : !sub $06 : bpl + - pha : lda $06 : sta $e2,x - ldx.w OWCameraIndex,y : lda $0618,x : !sub 1,s : sta $0618,x - lda $061a,x : !sub 1,s : sta $061a,x : pla + lda.b BG2H,x : !sub.b Scrap06 : bpl + + pha : lda.b Scrap06 : sta.b BG2H,x + ldx.w OWCameraIndex,y : lda.w CameraScrollN,x : !sub.b 1,s : sta.w CameraScrollN,x + lda.w CameraScrollS,x : !sub.b 1,s : sta.w CameraScrollS,x : pla bra .adjustOppositeAxis - + lda $06 : ldx.w OWCameraRangeIndex,y : !add.w OWCameraRange,x : sta $06 - ldx.w OWBGIndex,y : !sub $e2,x : bcs .adjustOppositeAxis - pha : lda $06 : sta $e2,x - ldx.w OWCameraIndex,y : lda $0618,x : !add 1,s : sta $0618,x - lda $061a,x : !add 1,s : sta $061a,x : pla + + lda.b Scrap06 : ldx.w OWCameraRangeIndex,y : !add.w OWCameraRange,x : sta.b Scrap06 + ldx.w OWBGIndex,y : !sub.b BG2H,x : bcs .adjustOppositeAxis + pha : lda.b Scrap06 : sta.b BG2H,x + ldx.w OWCameraIndex,y : lda.w CameraScrollN,x : !add.b 1,s : sta.w CameraScrollN,x + lda.w CameraScrollS,x : !add.b 1,s : sta.w CameraScrollS,x : pla .adjustOppositeAxis ;opposite coord stuff - rep #$30 : lda OWOppDirectionOffset,y : and #$00ff : bit #$0080 : beq + - ora #$ff00 ;extend 8-bit negative to 16-bit negative - + pha : cpy #$0002 : lda $700 : !bge + - and #$00f0 : pha : lda $04 : asl : and #$0070 : !sub 1,s : tax : pla : txa + rep #$30 : lda OWOppDirectionOffset,y : and.w #$00ff : bit.w #$0080 : beq + + ora.w #$ff00 ;extend 8-bit negative to 16-bit negative + + pha : cpy.w #$0002 : lda.w OverworldSlotPosition : !bge + + and.w #$00f0 : pha : lda.b Scrap04 : asl : and.w #$0070 : !sub.b 1,s : tax : pla : txa !add 1,s : tax : pla : txa : asl : asl : asl : asl : asl : pha : bra ++ - + and #$000f : pha : lda $04 : asl : and #$000f : !sub 1,s : !add 3,s - sep #$10 : tax : phx : ldx #$0 : phx : rep #$10 : pla : plx : plx : pha + + and.w #$000f : pha : lda.b Scrap04 : asl : and.w #$000f : !sub.b 1,s : !add.b 3,s + sep #$10 : tax : phx : ldx.b #$0 : phx : rep #$10 : pla : plx : plx : pha - ++ sep #$10 : ldx OWOppCoordIndex,y : lda $20,x : !add 1,s : sta $20,x ;set coord - ldx OWOppBGIndex,y : lda $e2,x : !add 1,s : sta $e2,x - ldx OWOppCameraIndex,y : lda $618,x : !add 1,s : sta $618,x - ldx OWOppCameraIndex,y : lda $61a,x : !add 1,s : sta $61a,x - ldx OWOppBGIndex,y : lda $e0,x : !add 1,s : sta $e0,x - lda $418 : asl : tax : lda $610,x : !add 1,s : sta $610,x : pla + ++ sep #$10 : ldx OWOppCoordIndex,y : lda.b LinkPosY,x : !add.b 1,s : sta.b LinkPosY,x ;set coord + ldx OWOppBGIndex,y : lda.b BG2H,x : !add.b 1,s : sta.b BG2H,x + ldx OWOppCameraIndex,y : lda.w CameraScrollN,x : !add.b 1,s : sta.w CameraScrollN,x + ldx OWOppCameraIndex,y : lda.w CameraScrollS,x : !add.b 1,s : sta.w CameraScrollS,x + ldx OWOppBGIndex,y : lda.b BG1H,x : !add.b 1,s : sta.b BG1H,x + lda.w TransitionDirection : asl : tax : lda.w CameraTargetN,x : !add.b 1,s : sta.w CameraTargetN,x : pla - sep #$30 : lda $04 : and #$3f : !add OWOppSlotOffset,y : asl : sta $700 + sep #$30 : lda.b Scrap04 : and.b #$3f : !add OWOppSlotOffset,y : asl : sta.w OverworldSlotPosition ; crossed OW shuffle and terrain - ldx $05 : ldy $08 : jsr OWWorldTerrainUpdate + ldx.b Scrap05 : ldy.b Scrap08 : jsr OWWorldTerrainUpdate - ldx $8a : lda $05 : sta $8a : stx $05 ; $05 is prev screen id, $8a is dest screen + ldx.b OverworldIndex : lda.b Scrap05 : sta.b OverworldIndex : stx.b Scrap05 ; $05 is prev screen id, $8a is dest screen jsr OWGfxUpdate - lda $8a + lda.b OverworldIndex rep #$30 : rts } OWLoadSpecialArea: { - LDA.l Overworld_LoadSpecialOverworld_RoomId,X : STA.b $A0 + LDA.l Overworld_LoadSpecialOverworld_RoomId,X : STA.b RoomIndex JSL Overworld_LoadSpecialOverworld ; sets M and X flags TYX LDY.b #$00 CPX.b #$01 : BNE + ; check if going to water transition - LDA.w $0704 : BNE ++ ; check if coming from water transition + LDA.w RandoOverworldTerrain : BNE ++ ; check if coming from water transition INY : BRA ++ + - LDA.w $0704 : BEQ ++ ; check if coming from water transition + LDA.w RandoOverworldTerrain : BEQ ++ ; check if coming from water transition LDY.b #$02 ++ LDA.l OWSpecialDestSlot,X : TAX @@ -1005,100 +999,100 @@ OWWorldTerrainUpdate: ; x = owid of destination screen, y = 1 for land to water, sta.l CurrentWorld ; change world ; moving mirror portal off screen when in DW - cmp #0 : beq + : lda #1 + cmp.b #0 : beq + : lda.b #1 + cmp.l InvertedMode : bne + - lda $1acf : and #$0f : sta $1acf : bra .playSfx ; bring portal back into position - + lda $1acf : ora #$40 : sta $1acf ; move portal off screen + lda.w MirrorPortalPosXH : and.b #$0f : sta.w MirrorPortalPosXH : bra .playSfx ; bring portal back into position + + lda.w MirrorPortalPosXH : ora.b #$40 : sta.w MirrorPortalPosXH ; move portal off screen .playSfx - lda #$38 : sta $012f ; play sfx - #$3b is an alternative + lda.b #$38 : sta.w SFX3 ; play sfx - #$3b is an alternative ; toggle bunny mode - lda MoonPearlEquipment : beq + : jmp .nobunny + lda.l MoonPearlEquipment : beq + : jmp .nobunny + lda.l InvertedMode : bne .inverted - lda CurrentWorld : bra + - .inverted lda CurrentWorld : eor #$40 - + and #$40 : beq .nobunny - LDA.w $0703 : BEQ + ; check if forced transition + lda.l CurrentWorld : bra + + .inverted lda.l CurrentWorld : eor.b #$40 + + and.b #$40 : beq .nobunny + LDA.w RandoOverworldForceTrans : BEQ + ; check if forced transition CPY.b #$03 : BEQ ++ - LDA.b #$17 : STA.b $5D - LDA.b #$01 : STA.w $02E0 : STA.b $56 - LDA.w $0703 : JSR OWLoadGearPalettes : BRA .end_forced_edge + LDA.b #$17 : STA.b LinkState + LDA.b #$01 : STA.w BunnyFlag : STA.b BunnyFlagDP + LDA.w RandoOverworldForceTrans : JSR OWLoadGearPalettes : BRA .end_forced_edge ++ JSR OWLoadGearPalettes : BRA .end_forced_whirlpool + CPY.b #$01 : BEQ .auto ; check if going from land to water CPY.b #$02 : BEQ .to_bunny_reset_swim ; bunny state if swimming to land - LDA.b $5D : CMP.b #$04 : BNE .to_bunny ; check if swimming + LDA.b LinkState : CMP.b #$04 : BNE .to_bunny ; check if swimming .auto PHX LDA.b #$01 - LDX.b $5D : CPX.b #$04 : BNE + + LDX.b LinkState : CPX.b #$04 : BNE + INC + - STA.w $0703 + STA.w RandoOverworldForceTrans CPY.b #$03 : BEQ .whirlpool - LDA.b #$01 : STA.w $0345 - LDX.w $0418 - LDA.l OWAutoWalk,X : STA.b $49 - STZ.b $5D + LDA.b #$01 : STA.w LinkDeepWater + LDX.w TransitionDirection + LDA.l OWAutoWalk,X : STA.b ForceMove + STZ.b LinkState PLX BRA .to_pseudo_bunny .whirlpool PLX : JMP OWLoadGearPalettes .to_bunny_reset_swim - LDA.b $5D : CMP.b #$04 : BNE .to_bunny ; check if swimming + LDA.b LinkState : CMP.b #$04 : BNE .to_bunny ; check if swimming JSL Link_ResetSwimmingState - STZ.w $0345 + STZ.w LinkDeepWater .to_bunny - LDA.b #$17 : STA.b $5D + LDA.b #$17 : STA.b LinkState .to_pseudo_bunny - LDA.b #$01 : STA.w $02E0 : STA.b $56 + LDA.b #$01 : STA.w BunnyFlag : STA.b BunnyFlagDP JMP OWLoadGearPalettes .nobunny - lda $5d : cmp #$17 : bne + ; retain current state unless bunny - stz $5d - + stz $02e0 : stz $56 + lda.b LinkState : cmp.b #$17 : bne + ; retain current state unless bunny + stz.b LinkState + + stz.w BunnyFlag : stz.b BunnyFlagDP .normal - LDA.w $0703 : BEQ .not_forced ; check if forced transition + LDA.w RandoOverworldForceTrans : BEQ .not_forced ; check if forced transition CPY.b #$03 : BEQ .end_forced_whirlpool .end_forced_edge - STZ.b $49 : STZ.w $0345 + STZ.b ForceMove : STZ.w LinkDeepWater .end_forced_whirlpool - STZ.w $0703 + STZ.w RandoOverworldForceTrans CMP.b #$02 : BNE + - DEC : STA.w $0345 : STZ.w $0340 + DEC : STA.w LinkDeepWater : STZ.w LinkSwimDirection LDA.b #$04 : BRA .set_state + CMP.b #$03 : BNE ++ LDA.b #$17 .set_state - STA.b $5D + STA.b LinkState ++ RTS .not_forced CPY.b #$02 : BNE + ; check if going from water to land - LDA.b $5D : CMP.b #$04 : BNE .return ; check if swimming + LDA.b LinkState : CMP.b #$04 : BNE .return ; check if swimming JSL Link_ResetSwimmingState - STZ.w $0345 - STZ.b $5D + STZ.w LinkDeepWater + STZ.b LinkState + CPY.b #$01 : BNE .return ; check if going from land to water - LDA.b $5D : CMP.b #$04 : BEQ .return ; check if swimming - LDA.b #$01 : STA.w $0345 + LDA.b LinkState : CMP.b #$04 : BEQ .return ; check if swimming + LDA.b #$01 : STA.w LinkDeepWater LDA.l FlippersEquipment : BEQ .no_flippers ; check if flippers obtained - LDA.b $5D : CMP.b #$17 : BEQ .no_flippers ; check if bunny - LDA.b #$04 : STA.b $5D : STZ.w $0340 : RTS + LDA.b LinkState : CMP.b #$17 : BEQ .no_flippers ; check if bunny + LDA.b #$04 : STA.b LinkState : STZ.w LinkSwimDirection : RTS .no_flippers PHX - INC : STA.w $0703 - LDX.w $0418 - LDA.l OWAutoWalk,X : STA.b $49 + INC : STA.w RandoOverworldForceTrans + LDX.w TransitionDirection + LDA.l OWAutoWalk,X : STA.b ForceMove PLX - LDA.b $5D : CMP.b #$17 : BNE .return ; check if bunny - LDA.b #$03 : STA.w $0703 - STZ.b $5D + LDA.b LinkState : CMP.b #$17 : BNE .return ; check if bunny + LDA.b #$03 : STA.w RandoOverworldForceTrans + STZ.b LinkState .return RTS } @@ -1106,13 +1100,13 @@ OWGfxUpdate: { REP #$20 : LDA.l OWMode : AND.w #$0207 : BEQ .is_only_mixed : SEP #$20 ;;;;PLA : AND.b #$3F : BEQ .leaving_woods - LDA.b $8A : AND.b #$3F : BEQ .entering_woods - ;LDA.b $05 : JSL OWSkipPalettes : BCS .skip_palettes - LDA.b $8A : JSR OWDetermineScreensPaletteSet + LDA.b OverworldIndex : AND.b #$3F : BEQ .entering_woods + ;LDA.b Scrap05 : JSL OWSkipPalettes : BCS .skip_palettes + LDA.b OverworldIndex : JSR OWDetermineScreensPaletteSet CPX.w $0AB3 : BEQ .skip_palettes ; check if next screen's palette is different - LDA $00 : PHA + LDA.b Scrap00 : PHA JSL OverworldLoadScreensPaletteSet_long ; loading correct OW palette - PLA : STA $00 + PLA : STA.b Scrap00 .leaving_woods .entering_woods .is_only_mixed @@ -1121,14 +1115,14 @@ OWGfxUpdate: } OWLoadGearPalettes: { - PHX : PHY : LDA $00 : PHA - LDA.w $02E0 : BEQ + + PHX : PHY : LDA.b Scrap00 : PHA + LDA.w BunnyFlag : BEQ + JSL LoadGearPalettes_bunny BRA .return + JSL LoadGearPalettes_link .return - PLA : STA $00 : PLY : PLX + PLA : STA.b Scrap00 : PLY : PLX RTS } OWDetermineScreensPaletteSet: ; A = OWID to check @@ -1146,19 +1140,19 @@ OWDetermineScreensPaletteSet: ; A = OWID to check } OWSkipPalettes: { - STA.b $05 ; A = previous screen, also stored in $05 + STA.b Scrap05 ; A = previous screen, also stored in $05 ; only skip mosaic if OWR Layout or Crossed PHP : REP #$20 : LDA.l OWMode : AND.w #$0207 : BEQ .vanilla : PLP ; checks to see if going to from any DM screens - ;LDA.b $05 : JSR OWDetermineScreensPaletteSet : TXA : AND.b #$FE : STA $04 - ;LDA.b $8A : JSR OWDetermineScreensPaletteSet : TXA : AND.b #$FE - ;CMP.b $04 : BNE .skip_palettes + ;LDA.b Scrap05 : JSR OWDetermineScreensPaletteSet : TXA : AND.b #$FE : STA.b Scrap04 + ;LDA.b OverworldIndex : JSR OWDetermineScreensPaletteSet : TXA : AND.b #$FE + ;CMP.b Scrap04 : BNE .skip_palettes BRA .vanilla+1 .vanilla PLP - LDA.b $05 : AND.b #$3F : BEQ .skip_palettes ; what we - LDA.b $8A : AND.b #$BF : BNE .change_palettes ; wrote over, kinda + LDA.b Scrap05 : AND.b #$3F : BEQ .skip_palettes ; what we + LDA.b OverworldIndex : AND.b #$BF : BNE .change_palettes ; wrote over, kinda .skip_palettes SEC : RTL ; mosaic transition occurs .change_palettes @@ -1166,26 +1160,26 @@ OWSkipPalettes: } OWAdjustExitPosition: { - LDA.w $06FC : CMP.b #$60 : BEQ .stone_bridge + LDA.w RandoOverworldWalkDist : CMP.b #$60 : BEQ .stone_bridge CMP.b #$B0 : BNE .normal - LDA.b #$80 : STA.b $20 : STZ.b $21 + LDA.b #$80 : STA.b LinkPosY : STZ.b LinkPosY+1 BRA .normal .stone_bridge - LDA.b #$A0 : STA.b $E2 - LDA.b #$3D : STA.w $061C - LDA.b #$3B : STA.w $061E - INC.b $23 : INC.w $061D : INC.w $061F + LDA.b #$A0 : STA.b BG2H + LDA.b #$3D : STA.w CameraScrollW + LDA.b #$3B : STA.w CameraScrollE + INC.b LinkPosX+1 : INC.w CameraScrollW+1 : INC.w CameraScrollE+1 .normal - LDA.w $0703 : BEQ + - LDA.b #$3C : STA.w $012E ; play error sound before forced transition + LDA.w RandoOverworldForceTrans : BEQ + + LDA.b #$3C : STA.w SFX2 ; play error sound before forced transition + - INC.b $11 : STZ.b $B0 ; what we wrote over + INC.b GameSubMode : STZ.b SubSubModule ; what we wrote over RTL } OWEndScrollTransition: { - LDY.w $06FC : BEQ .normal - CMP.w $06FC + LDY.w RandoOverworldWalkDist : BEQ .normal + CMP.w RandoOverworldWalkDist RTL .normal CMP.l Overworld_FinalizeEntryOntoScreen_Data,X ; what we wrote over @@ -1776,7 +1770,7 @@ db $ff, $00, $02, $b5, $00, $08 ; temporary fix - murahdahla replaces one of the bonk tree prizes ; so we copy the sprite table here and update the pointer ; longterm solution should be to spawn in murahdahla separately -org $09AE2A +org $89AE2A Overworld_Sprites_Screen1A_2: db $08, $0F, $41 ; yx:{ 0x080, 0x0F0 } db $0E, $0C, $41 ; yx:{ 0x0E0, 0x0C0 } @@ -1784,5 +1778,5 @@ db $11, $0D, $E3 ; yx:{ 0x110, 0x0D0 } db $18, $0A, $D8 ; yx:{ 0x180, 0x0A0 } db $18, $0F, $45 ; yx:{ 0x180, 0x0F0 } db $FF ; END -org $09CA55 +org $89CA55 dw Overworld_Sprites_Screen1A_2&$FFFF \ No newline at end of file diff --git a/password.asm b/password.asm index 4e71af0..fcb22a4 100644 --- a/password.asm +++ b/password.asm @@ -1,10 +1,7 @@ -!PASSWORD_CODE_POSITION = "$C8" -!PASSWORD_SELECTION_POSITION = "$C9" - Module_Password: - LDA $11 + LDA.b GameSubMode - JSL.l UseImplicitRegIndexedLongJumpTable + JSL JumpTableLong dl Password_BeginInit ; 0 dl Password_EndInit ; 1 @@ -13,36 +10,35 @@ Module_Password: dl Password_Return ; 4 Password_BeginInit: - LDA.b #$80 : STA $0710 ;skip animated sprite updates in NMI + LDA.b #$80 : STA.w SkipOAM ;skip animated sprite updates in NMI JSL EnableForceBlank JSL Vram_EraseTilemaps_triforce - ;JSL Palette_SelectScreen JSL LoadCustomHudPalette ; replace the 2bpp palettes, and trigger upload - LDA.b #$07 : STA $14 ; have NMI load up the initial tilemap from Password_Tilemap + LDA.b #$07 : STA.b NMISTRIPES ; have NMI load up the initial tilemap from Password_Tilemap - INC $11 + INC.b GameSubMode RTL Password_EndInit: - JSR LoadPasswordStripeTemplate + JSR LoadPasswordStripeTemplate - ;reset the variables used by this screen - STZ !PASSWORD_CODE_POSITION - STZ !PASSWORD_SELECTION_POSITION + ;reset the variables used by this screen + STZ.b PasswordCodePosition + STZ.b PasswordSelectPosition - JSL ValidatePassword : BNE + - ; zero out password if not valid - LDX.b #$0F - LDA.b #$00 - - - STA.l PasswordSRAM, X - DEX : BPL - + JSL ValidatePassword : BNE + + ; zero out password if not valid + LDX.b #$0F + LDA.b #$00 + - + STA.l PasswordSRAM, X + DEX : BPL - + - LDA.b #$0F : STA $13 - INC $11 + LDA.b #$0F : STA.b INIDISPQ + INC.b GameSubMode RTL Password_Main: @@ -52,78 +48,78 @@ Password_Main: JSR PasswordEraseOldCursors ; handle joypad input - LDA $F6 : AND.b #$10 : BEQ + ; R Button + LDA.b Joy1B_New : AND.b #$10 : BEQ + ; R Button JSR PasswordMoveCursorRight + - LDA $F6 : AND.b #$20 : BEQ + ; L Button + LDA.b Joy1B_New : AND.b #$20 : BEQ + ; L Button JSR PasswordMoveCursorLeft + - LDA $F4 : AND.b #$01 : BEQ + ; right - LDA !PASSWORD_SELECTION_POSITION : INC A : CMP.b #$24 : !BLT ++ + LDA.b Joy1A_New : AND.b #$01 : BEQ + ; right + LDA.b PasswordSelectPosition : INC A : CMP.b #$24 : !BLT ++ !SUB.b #$24 ++ - STA !PASSWORD_SELECTION_POSITION - LDA.b #$20 : STA $012F + STA.b PasswordSelectPosition + LDA.b #$20 : STA.w SFX3 + - LDA $F4 : AND.b #$02 : BEQ + ; left - LDA !PASSWORD_SELECTION_POSITION : DEC A : BPL ++ + LDA.b Joy1A_New : AND.b #$02 : BEQ + ; left + LDA.b PasswordSelectPosition : DEC A : BPL ++ !ADD.b #$24 ++ - STA !PASSWORD_SELECTION_POSITION - LDA.b #$20 : STA $012F + STA.b PasswordSelectPosition + LDA.b #$20 : STA.w SFX3 + - LDA $F4 : AND.b #$04 : BEQ + ; down - LDA !PASSWORD_SELECTION_POSITION : !ADD.b #$09 : CMP.b #$24 : !BLT ++ + LDA.b Joy1A_New : AND.b #$04 : BEQ + ; down + LDA.b PasswordSelectPosition : !ADD.b #$09 : CMP.b #$24 : !BLT ++ !SUB.b #$24 ++ - STA !PASSWORD_SELECTION_POSITION - LDA.b #$20 : STA $012F + STA.b PasswordSelectPosition + LDA.b #$20 : STA.w SFX3 + - LDA $F4 : AND.b #$08 : BEQ + ; up - LDA !PASSWORD_SELECTION_POSITION : !SUB.b #$09 : BPL ++ + LDA.b Joy1A_New : AND.b #$08 : BEQ + ; up + LDA.b PasswordSelectPosition : !SUB.b #$09 : BPL ++ !ADD.b #$24 ++ - STA !PASSWORD_SELECTION_POSITION - LDA.b #$20 : STA $012F + STA.b PasswordSelectPosition + LDA.b #$20 : STA.w SFX3 + - LDA $F4 : ORA $F6 : AND.b #$C0 : BEQ + ; face button - LDX !PASSWORD_SELECTION_POSITION + LDA.b Joy1A_New : ORA.b Joy1B_New : AND.b #$C0 : BEQ + ; face button + LDX.b PasswordSelectPosition LDA.l .selectionValues, X : BPL ++ - CMP #$F0 : BNE +++ - INC $11 + CMP.b #$F0 : BNE +++ + INC.b GameSubMode BRA .endOfButtonChecks - +++ : CMP #$F1 : BNE +++ + +++ : CMP.b #$F1 : BNE +++ JSR PasswordMoveCursorLeft BRA + - +++ : CMP #$F2 : BNE +++ + +++ : CMP.b #$F2 : BNE +++ JSR PasswordMoveCursorRight BRA + - +++ : CMP #$F3 : BNE +++ - INC $11 : INC $11 ; skip to return submodule - LDA.b #$2C : STA $012E ;file screen selection sound + +++ : CMP.b #$F3 : BNE +++ + INC.b GameSubMode : INC.b GameSubMode ; skip to return submodule + LDA.b #$2C : STA.w SFX2 ;file screen selection sound BRA .endOfButtonChecks +++ BRA + ++ - LDX !PASSWORD_CODE_POSITION - STA PasswordSRAM,X - TXA : INC A : AND.b #$0F : STA !PASSWORD_CODE_POSITION + LDX.b PasswordCodePosition + STA.l PasswordSRAM,X + TXA : INC A : AND.b #$0F : STA.b PasswordCodePosition BNE ++ - STZ $012E - INC $11 + STZ.w SFX2 + INC.b GameSubMode BRA .endOfButtonChecks ++ - LDA.b #$2B : STA $012E + LDA.b #$2B : STA.w SFX2 + - LDA $F4 : AND.b #$10 : BEQ + ; start - INC $11 + LDA.b Joy1A_New : AND.b #$10 : BEQ + ; start + INC.b GameSubMode + .endOfButtonChecks JSR UpdatePasswordTiles JSR PasswordSetNewCursors - LDA.b #$01 : STA $14 + LDA.b #$01 : STA.b NMISTRIPES PLB RTL .selectionValues @@ -133,22 +129,22 @@ db $11, $12, $13, $14, $15, $16, $17, $18, $F2 db $19, $1A, $1B, $1C, $1D, $1E, $1F, $20, $F3 Password_Check: - JSL.l ValidatePassword : BNE .correct - LDA.b #$3C : STA $012E ; error - DEC $11 + JSL ValidatePassword : BNE .correct + LDA.b #$3C : STA.w SFX2 ; error + DEC.b GameSubMode RTL .correct - LDA.b #$1B : STA $012F ; solved puzzle sound - INC $11 + LDA.b #$1B : STA.w SFX3 ; solved puzzle sound + INC.b GameSubMode RTL Password_Return: - LDA.b #$01 : STA $10 ; select screen - LDA.b #$01 : STA $11 ; Skip the first submodule - STZ $B0 - STZ $0B9D ; Reset file screen cursor pre-selection - STZ $C8 - STZ $C9 + LDA.b #$01 : STA.b GameMode ; select screen + LDA.b #$01 : STA.b GameSubMode ; Skip the first submodule + STZ.b SubSubModule + STZ.w SaveFileIndex + STZ.b PasswordCodePosition + STZ.b PasswordCodePosition+1 RTL ;-------------------------------------------------------------------------------- @@ -162,7 +158,7 @@ ValidatePassword: PHX : PHY ;check for incomplete password - LDX #$0F + LDX.b #$0F - LDA.l PasswordSRAM, X : BNE + JMP .incorrect @@ -174,45 +170,45 @@ ValidatePassword: ; Clear out any existing encryption key LDX.b #$0E LDA.w #$0000 - - : STA.l !keyBase, X : DEX #2 : BPL - + - : STA.l KeyBase, X : DEX #2 : BPL - JSR PasswordToKey - LDA.l StaticDecryptionKey+$0A : STA.l !keyBase+$0A - LDA.l StaticDecryptionKey+$0C : STA.l !keyBase+$0C - LDA.l StaticDecryptionKey+$0E : STA.l !keyBase+$0E + LDA.l StaticDecryptionKey+$0A : STA.l KeyBase+$0A + LDA.l StaticDecryptionKey+$0C : STA.l KeyBase+$0C + LDA.l StaticDecryptionKey+$0E : STA.l KeyBase+$0E - LDA.l KnownEncryptedValue : STA.l !CryptoBuffer - LDA.l KnownEncryptedValue+2 : STA.l !CryptoBuffer+2 - LDA.l KnownEncryptedValue+4 : STA.l !CryptoBuffer+4 - LDA.l KnownEncryptedValue+6 : STA.l !CryptoBuffer+6 + LDA.l KnownEncryptedValue : STA.l CryptoBuffer + LDA.l KnownEncryptedValue+2 : STA.l CryptoBuffer+2 + LDA.l KnownEncryptedValue+4 : STA.l CryptoBuffer+4 + LDA.l KnownEncryptedValue+6 : STA.l CryptoBuffer+6 - LDA.w #$0002 : STA $04 ;set block size + LDA.w #$0002 : STA.b Scrap04 ;set block size - JSL.l XXTEA_Decode + JSL XXTEA_Decode SEP #$20 ; 8 bit accumulator - LDA !CryptoBuffer+0 : CMP #$31 : BNE .incorrect - LDA !CryptoBuffer+1 : CMP #$41 : BNE .incorrect - LDA !CryptoBuffer+2 : CMP #$59 : BNE .incorrect - LDA !CryptoBuffer+3 : CMP #$26 : BNE .incorrect - LDA !CryptoBuffer+4 : CMP #$53 : BNE .incorrect - LDA !CryptoBuffer+5 : CMP #$58 : BNE .incorrect - LDA !CryptoBuffer+6 : CMP #$97 : BNE .incorrect - LDA !CryptoBuffer+7 : CMP #$93 : BNE .incorrect + LDA.l CryptoBuffer+0 : CMP.b #$31 : BNE .incorrect + LDA.l CryptoBuffer+1 : CMP.b #$41 : BNE .incorrect + LDA.l CryptoBuffer+2 : CMP.b #$59 : BNE .incorrect + LDA.l CryptoBuffer+3 : CMP.b #$26 : BNE .incorrect + LDA.l CryptoBuffer+4 : CMP.b #$53 : BNE .incorrect + LDA.l CryptoBuffer+5 : CMP.b #$58 : BNE .incorrect + LDA.l CryptoBuffer+6 : CMP.b #$97 : BNE .incorrect + LDA.l CryptoBuffer+7 : CMP.b #$93 : BNE .incorrect ;trial decrypt the known plaintext, and verify if result is correct .correct PLY : PLX - LDA #$01 : STA.l !ValidKeyLoaded + LDA.b #$01 : STA.l ValidKeyLoaded RTL .incorrect PLY : PLX - LDA #$00 + LDA.b #$00 RTL ;-------------------------------------------------------------------------------- @@ -223,75 +219,69 @@ PasswordToKey: ; $00 input offset ; $02 output offset ; $04 shift amount - LDA.w #$0000 : STA $00 : STA $02 - LDA.w #$000B : STA $04 + LDA.w #$0000 : STA.b Scrap00 : STA.b Scrap02 + LDA.w #$000B : STA.b Scrap04 - - LDX $00 - LDA PasswordSRAM, X : DEC : AND #$001F - LDY $04 + LDX.b Scrap00 + LDA.l PasswordSRAM, X : DEC : AND.w #$001F + LDY.b Scrap04 -- : BEQ + : ASL : DEY : BRA -- : + ; Shift left by Y XBA - LDX $02 - ORA !keyBase, X - STA !keyBase, X + LDX.b Scrap02 + ORA.l KeyBase, X + STA.l KeyBase, X - LDA $04 : !SUB.w #$0005 : BPL + + LDA.b Scrap04 : !SUB.w #$0005 : BPL + !ADD.w #$0008 - INC $02 - + : STA $04 + INC.b Scrap02 + + : STA.b Scrap04 - LDA $00 : INC : STA $00 : CMP.w #$0010 : !BLT - + LDA.b Scrap00 : INC : STA.b Scrap00 : CMP.w #$0010 : !BLT - RTS LoadPasswordStripeTemplate: - LDA $4300 : PHA : LDA $4301 : PHA : LDA $4302 : PHA ; preserve DMA parameters - LDA $4303 : PHA : LDA $4304 : PHA : LDA $4305 : PHA ; preserve DMA parameters - LDA $4306 : PHA ; preserve DMA parameters + LDA.w DMAP0 : PHA : LDA.w BBAD0 : PHA : LDA.w A1T0L : PHA ; preserve DMA parameters + LDA.w A1T0H : PHA : LDA.w A1B0 : PHA : LDA.w DAS0L : PHA ; preserve DMA parameters + LDA.w DAS0H : PHA ; preserve DMA parameters + + LDA.b #$00 : STA.w DMAP0 ; set DMA transfer direction A -> B, bus A auto increment, single-byte mode + LDA.b #$80 : STA.w BBAD0 ; set bus B destination to WRAM register - LDA.b #$00 : STA $4300 ; set DMA transfer direction A -> B, bus A auto increment, single-byte mode - LDA.b #$80 : STA $4301 ; set bus B destination to WRAM register + LDA.b #$02 : STA.w WMADDL ; set WRAM register source address + LDA.b #$10 : STA.w WMADDH + LDA.b #$7E : STA.w WMADDB - LDA.b #$02 : STA $2181 ; set WRAM register source address - LDA.b #$10 : STA $2182 - LDA.b #$7E : STA $2183 - - LDA.b #Password_StripeImageTemplate : STA $4302 ; set bus A source address - LDA.b #Password_StripeImageTemplate>>8 : STA $4303 ; set bus A source address - LDA.b #Password_StripeImageTemplate>>16 : STA $4304 ; set bus A source bank + LDA.b #Password_StripeImageTemplate : STA.w A1T0L ; set bus A source address + LDA.b #Password_StripeImageTemplate>>8 : STA.w A1T0H ; set bus A source address + LDA.b #Password_StripeImageTemplate>>16 : STA.w A1B0 ; set bus A source bank LDA.b #Password_StripeImageTemplate_end-Password_StripeImageTemplate - STA $4305 ; + STA.w DAS0L ; LDA.b #Password_StripeImageTemplate_end-Password_StripeImageTemplate>>8 - STA $4306 ; set transfer size + STA.w DAS0H ; set transfer size - LDA #$01 : STA $420B ; begin DMA transfer + LDA.b #$01 : STA.w MDMAEN ; begin DMA transfer - PLA : STA $4306 : PLA : STA $4305 : PLA : STA $4304 ; restore DMA parameters - PLA : STA $4303 : PLA : STA $4302 : PLA : STA $4301 ; restore DMA parameters - PLA : STA $4300 ; restore DMA parameters + PLA : STA.w DAS0H : PLA : STA.w DAS0L : PLA : STA.w A1B0 ; restore DMA parameters + PLA : STA.w A1T0H : PLA : STA.w A1T0L : PLA : STA.w BBAD0 ; restore DMA parameters + PLA : STA.w DMAP0 ; restore DMA parameters RTS -!PASSWORD_INPUT_START_X = $03 -!PASSWORD_INPUT_START_Y = $0D - -!PASSWORD_DISPLAY_START_X = $04 -!PASSWORD_DISPLAY_START_Y = $04 - PasswordEraseOldCursors: REP #$20 ; set 16-bit accumulator ;Code Cursor - LDA !PASSWORD_CODE_POSITION : AND.w #$00FF : ASL : TAX + LDA.b PasswordCodePosition : AND.w #$00FF : ASL : TAX LDA.l .code_offsets, X - !ADD.w #$20*!PASSWORD_DISPLAY_START_Y+!PASSWORD_DISPLAY_START_X+$6000 + !ADD.w #$20*Scrap04+Scrap04+$6000 XBA ; because big endian is needed STA.l $1002+Password_StripeImageTemplate_CodeCursorErase-Password_StripeImageTemplate ;selection cursor - LDA !PASSWORD_SELECTION_POSITION : AND.w #$00FF : ASL : TAX + LDA.b PasswordSelectPosition : AND.w #$00FF : ASL : TAX LDA.l .selection_offsets, X - !ADD.w #$20*!PASSWORD_INPUT_START_Y+!PASSWORD_INPUT_START_X+$6000 + !ADD.w #$20*Scrap0D+Scrap03+$6000 XBA ; because big endian is needed STA.l $1002+Password_StripeImageTemplate_SelectionCursorErase-Password_StripeImageTemplate XBA : !ADD.w #$0020 : XBA @@ -315,16 +305,16 @@ RTS PasswordSetNewCursors: REP #$20 ; set 16-bit accumulator ;Code Cursor - LDA !PASSWORD_CODE_POSITION : AND.w #$00FF : ASL : TAX + LDA.b PasswordCodePosition : AND.w #$00FF : ASL : TAX LDA.l PasswordEraseOldCursors_code_offsets, X - !ADD.w #$20*!PASSWORD_DISPLAY_START_Y+!PASSWORD_DISPLAY_START_X+$6000 + !ADD.w #$20*Scrap04+Scrap04+$6000 XBA ; because big endian is needed STA.l $1002+Password_StripeImageTemplate_CodeCursorDraw-Password_StripeImageTemplate ;Selection cursor - LDA !PASSWORD_SELECTION_POSITION : AND.w #$00FF : ASL : TAX + LDA.b PasswordSelectPosition : AND.w #$00FF : ASL : TAX LDA.l PasswordEraseOldCursors_selection_offsets, X - !ADD.w #$20*!PASSWORD_INPUT_START_Y+!PASSWORD_INPUT_START_X+$6000 + !ADD.w #$20*Scrap0D+Scrap03+$6000 XBA ; because big endian is needed STA.l $1002+Password_StripeImageTemplate_SelectionCursorDraw-Password_StripeImageTemplate XBA : !ADD.w #$0020 : XBA @@ -342,16 +332,16 @@ UpdatePasswordTiles: LDX.w #$000F - LDA.l PasswordSRAM, X : AND.w #$00FF : TXY - ASL #3 : STA $00 - TYA : ASL #4 : STA $03 - LDX $00 : LDA.l HashAlphabetTilesWithBlank, X - LDX $03 : STA $1006, X - LDX $00 : LDA.l HashAlphabetTilesWithBlank+$02, X - LDX $03 : STA $1008, X - LDX $00 : LDA.l HashAlphabetTilesWithBlank+$04, X - LDX $03 : STA $100E, X - LDX $00 : LDA.l HashAlphabetTilesWithBlank+$06, X - LDX $03 : STA $1010, X + ASL #3 : STA.b Scrap00 + TYA : ASL #4 : STA.b Scrap03 + LDX.b Scrap00 : LDA.l HashAlphabetTilesWithBlank, X + LDX.b Scrap03 : STA.w $1006, X + LDX.b Scrap00 : LDA.l HashAlphabetTilesWithBlank+$02, X + LDX.b Scrap03 : STA.w $1008, X + LDX.b Scrap00 : LDA.l HashAlphabetTilesWithBlank+$04, X + LDX.b Scrap03 : STA.w $100E, X + LDX.b Scrap00 : LDA.l HashAlphabetTilesWithBlank+$06, X + LDX.b Scrap03 : STA.w $1010, X TYX : DEX : BMI + : BRA - + @@ -360,13 +350,13 @@ RTS PasswordMoveCursorRight: ; return new code position - LDA.b #$2B : STA $012E - LDA !PASSWORD_CODE_POSITION : INC A : AND.b #$0F : STA !PASSWORD_CODE_POSITION + LDA.b #$2B : STA.w SFX2 + LDA.b PasswordCodePosition : INC A : AND.b #$0F : STA.b PasswordCodePosition RTS PasswordMoveCursorLeft: ; return new code position - LDA.b #$2B : STA $012E - LDA !PASSWORD_CODE_POSITION : DEC A : AND.b #$0F : STA !PASSWORD_CODE_POSITION + LDA.b #$2B : STA.w SFX2 + LDA.b PasswordCodePosition : DEC A : AND.b #$0F : STA.b PasswordCodePosition RTS macro dw_big_endian(value) @@ -380,7 +370,7 @@ endmacro Password_Tilemap: ;Add any graphics for background 0 here -%Layer3_VRAM_Address(!PASSWORD_INPUT_START_X,!PASSWORD_INPUT_START_Y+0) +%Layer3_VRAM_Address(Scrap03,Scrap0D+0) %dw_big_endian(51) ;(9*4)+(8*2)-1 dw #$0201|!FS_COLOR_YELLOW, #$0202|!FS_COLOR_YELLOW ;BOW dw #$0200 @@ -400,7 +390,7 @@ dw #$0285|!FS_COLOR_GREEN, #$0286|!FS_COLOR_GREEN ;PENDANT dw #$0200 dw #$02AB|!FS_COLOR_BW, #$02AB|!FS_COLOR_BW ;placeholder upper half action button -%Layer3_VRAM_Address(!PASSWORD_INPUT_START_X,!PASSWORD_INPUT_START_Y+1) +%Layer3_VRAM_Address(Scrap03,Scrap0D+1) %dw_big_endian(51) ;(9*4)+(8*2)-1 dw #$0211|!FS_COLOR_YELLOW, #$0212|!FS_COLOR_YELLOW ;BOW dw #$0200 @@ -420,7 +410,7 @@ dw #$0295|!FS_COLOR_GREEN, #$0296|!FS_COLOR_GREEN ;PENDANT dw #$0200 dw #$02AB|!FS_COLOR_BW, #$02AB|!FS_COLOR_BW ;placeholder lower half action button -%Layer3_VRAM_Address(!PASSWORD_INPUT_START_X,!PASSWORD_INPUT_START_Y+3) +%Layer3_VRAM_Address(Scrap03,Scrap0D+3) %dw_big_endian(51) ;(9*4)+(8*2)-1 dw #$0207|!FS_COLOR_YELLOW, #$0217|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP ;BOMBOS dw #$0200 @@ -440,7 +430,7 @@ dw #$0228|!FS_COLOR_YELLOW, #$0229|!FS_COLOR_YELLOW ;NET dw #$0200 dw #$018A|!FS_COLOR_BW, #$0200 ; Left -%Layer3_VRAM_Address(!PASSWORD_INPUT_START_X,!PASSWORD_INPUT_START_Y+4) +%Layer3_VRAM_Address(Scrap03,Scrap0D+4) %dw_big_endian(51) ;(9*4)+(8*2)-1 dw #$0217|!FS_COLOR_YELLOW, #$0207|!FS_COLOR_YELLOW|!FS_HFLIP|!FS_VFLIP ;BOMBOS dw #$0200 @@ -460,7 +450,7 @@ dw #$0238|!FS_COLOR_YELLOW, #$0239|!FS_COLOR_YELLOW ;NET dw #$0200 dw #$019A|!FS_COLOR_BW, #$0200 ; Left -%Layer3_VRAM_Address(!PASSWORD_INPUT_START_X,!PASSWORD_INPUT_START_Y+6) +%Layer3_VRAM_Address(Scrap03,Scrap0D+6) %dw_big_endian(51) ;(9*4)+(8*2)-1 dw #$022A|!FS_COLOR_GREEN, #$022B|!FS_COLOR_GREEN ;BOOK dw #$0200 @@ -480,7 +470,7 @@ dw #$024E|!FS_COLOR_BROWN, #$024F|!FS_COLOR_BROWN dw #$0200 dw #$0200, #$018B|!FS_COLOR_BW ; Right -%Layer3_VRAM_Address(!PASSWORD_INPUT_START_X,!PASSWORD_INPUT_START_Y+7) +%Layer3_VRAM_Address(Scrap03,Scrap0D+7) %dw_big_endian(51) ;(9*4)+(8*2)-1 dw #$023A|!FS_COLOR_GREEN, #$023B|!FS_COLOR_GREEN ;BOOK dw #$0200 @@ -500,7 +490,7 @@ dw #$025E|!FS_COLOR_BROWN, #$025F|!FS_COLOR_BROWN ;GLOVES dw #$0200 dw #$0200, #$019B|!FS_COLOR_BW ; Right -%Layer3_VRAM_Address(!PASSWORD_INPUT_START_X,!PASSWORD_INPUT_START_Y+9) +%Layer3_VRAM_Address(Scrap03,Scrap0D+9) %dw_big_endian(51) ;(9*4)+(8*2)-1 dw #$020E|!FS_COLOR_BLUE, #$020F|!FS_COLOR_BLUE ;FLIPPERS dw #$0200 @@ -520,7 +510,7 @@ dw #$022F|!FS_COLOR_YELLOW|!FS_HFLIP, #$022F|!FS_COLOR_YELLOW ;KEY dw #$0200 dw #$0267|!FS_COLOR_BW|!FS_HFLIP, #$0267|!FS_COLOR_BW ;cancel -%Layer3_VRAM_Address(!PASSWORD_INPUT_START_X,!PASSWORD_INPUT_START_Y+10) +%Layer3_VRAM_Address(Scrap03,Scrap0D+10) %dw_big_endian(51) ;(9*4)+(8*2)-1 dw #$021F|!FS_COLOR_BLUE|!FS_HFLIP, #$021F|!FS_COLOR_BLUE ;FLIPPERS dw #$0200 @@ -543,10 +533,10 @@ dw #$0267|!FS_COLOR_BW|!FS_HFLIP|!FS_VFLIP, #$0267|!FS_VFLIP|!FS_COLOR_BW ;cance dw $FFFF macro PasswordDisplaySlot(x,y) - %Layer3_VRAM_Address(!PASSWORD_DISPLAY_START_X+,!PASSWORD_DISPLAY_START_Y+) + %Layer3_VRAM_Address(Scrap04+,Scrap04+) %dw_big_endian(3) dw #$0186|!FS_COLOR_BW, #$0186|!FS_COLOR_BW - %Layer3_VRAM_Address(!PASSWORD_DISPLAY_START_X+,!PASSWORD_DISPLAY_START_Y+1+) + %Layer3_VRAM_Address(Scrap04+,Scrap04+1+) %dw_big_endian(3) dw #$0196|!FS_COLOR_BW, #$0196|!FS_COLOR_BW endmacro @@ -569,37 +559,37 @@ Password_StripeImageTemplate: %PasswordDisplaySlot(18,3) %PasswordDisplaySlot(21,3) .CodeCursorErase ; a code cursor erase (position get be updated) - %Layer3_VRAM_Address(!PASSWORD_DISPLAY_START_X,!PASSWORD_DISPLAY_START_Y+2) + %Layer3_VRAM_Address(Scrap04,Scrap04+2) %dw_big_endian(3) dw #$0200, #$0200 .CodeCursorDraw ; Then comes a code cursor draw (will override the erase if same position) - %Layer3_VRAM_Address(!PASSWORD_DISPLAY_START_X,!PASSWORD_DISPLAY_START_Y+2) + %Layer3_VRAM_Address(Scrap04,Scrap04+2) %dw_big_endian(3) dw #$0267|!FS_COLOR_BW|!FS_HFLIP|!FS_VFLIP, #$0267|!FS_VFLIP|!FS_COLOR_BW .SelectionCursorErase ; a selection cursor erase (position get be updated) - %Layer3_VRAM_Address(!PASSWORD_INPUT_START_X-1,!PASSWORD_INPUT_START_Y-1) + %Layer3_VRAM_Address(Scrap03-1,Scrap0D-1) %dw_big_endian(7) dw #$0200, #$0200, #$0200, #$0200 - %Layer3_VRAM_Address(!PASSWORD_INPUT_START_X-1,!PASSWORD_INPUT_START_Y) + %Layer3_VRAM_Address(Scrap03-1,Scrap0D) %dw_big_endian(3|!FS_VERT_STRIPE) dw #$0200, #$0200 - %Layer3_VRAM_Address(!PASSWORD_INPUT_START_X+2,!PASSWORD_INPUT_START_Y) + %Layer3_VRAM_Address(Scrap03+2,Scrap0D) %dw_big_endian(3|!FS_VERT_STRIPE) dw #$0200, #$0200 - %Layer3_VRAM_Address(!PASSWORD_INPUT_START_X-1,!PASSWORD_INPUT_START_Y+2) + %Layer3_VRAM_Address(Scrap03-1,Scrap0D+2) %dw_big_endian(7) dw #$0200, #$0200, #$0200, #$0200 .SelectionCursorDraw ; Then comes a selection cursor draw (will override the erase if same position) - %Layer3_VRAM_Address(!PASSWORD_INPUT_START_X-1,!PASSWORD_INPUT_START_Y-1) + %Layer3_VRAM_Address(Scrap03-1,Scrap0D-1) %dw_big_endian(7) dw #$02BB|!FS_COLOR_GREEN, #$02BC|!FS_COLOR_GREEN, #$02BC|!FS_COLOR_GREEN|!FS_HFLIP, #$02BB|!FS_COLOR_GREEN|!FS_HFLIP - %Layer3_VRAM_Address(!PASSWORD_INPUT_START_X-1,!PASSWORD_INPUT_START_Y) + %Layer3_VRAM_Address(Scrap03-1,Scrap0D) %dw_big_endian(3|!FS_VERT_STRIPE) dw #$02BD|!FS_COLOR_GREEN, #$02BD|!FS_COLOR_GREEN|!FS_VFLIP - %Layer3_VRAM_Address(!PASSWORD_INPUT_START_X+2,!PASSWORD_INPUT_START_Y) + %Layer3_VRAM_Address(Scrap03+2,Scrap0D) %dw_big_endian(3|!FS_VERT_STRIPE) dw #$02BD|!FS_COLOR_GREEN|!FS_HFLIP, #$02BD|!FS_COLOR_GREEN|!FS_HFLIP|!FS_VFLIP - %Layer3_VRAM_Address(!PASSWORD_INPUT_START_X-1,!PASSWORD_INPUT_START_Y+2) + %Layer3_VRAM_Address(Scrap03-1,Scrap0D+2) %dw_big_endian(7) dw #$02BB|!FS_COLOR_GREEN|!FS_VFLIP, #$02BC|!FS_COLOR_GREEN|!FS_VFLIP, #$02BC|!FS_COLOR_GREEN|!FS_HFLIP|!FS_VFLIP, #$02BB|!FS_COLOR_GREEN|!FS_HFLIP|!FS_VFLIP dw $FFFF diff --git a/pendantcrystalhud.asm b/pendantcrystalhud.asm index 146d4bc..c357377 100644 --- a/pendantcrystalhud.asm +++ b/pendantcrystalhud.asm @@ -1,77 +1,77 @@ ;================================================================================ ; Pendant / Crystal HUD Fix ;-------------------------------------------------------------------------------- -;CheckPendantHUD: -; LDA HudFlag : CMP.b #$40 ; check for hud flag instead -;RTL ;================================================================================ FlipLWDWFlag: PHP SEP #$20 ; set 8-bit accumulator - LDA CurrentWorld : EOR.b #$40 : STA CurrentWorld + LDA.l CurrentWorld : EOR.b #$40 : STA.l CurrentWorld BEQ + LDA.b #07 : BRA ++ ; dark world - crystals + LDA.b #03 ; light world - pendants ++ - STA MapIcons + STA.l MapIcons PLP RTL ;================================================================================ HUDRebuildIndoorHole: PHA + INC.w UpdateHUDFlag LDA.l GenericKeys : BEQ .normal .generic PLA - LDA CurrentGenericKeys ; generic key count - JSL.l HUD_RebuildIndoor_Palace + LDA.l CurrentGenericKeys ; generic key count + JSL HUD_RebuildIndoor_Palace RTL .normal PLA - JSL.l HUD_RebuildIndoor_Palace + JSL HUD_RebuildIndoor_Palace RTL ;================================================================================ HUDRebuildIndoor: + INC.w UpdateHUDFlag LDA.l GenericKeys : BEQ .normal .generic - LDA.b #$00 : STA $7EC017 - LDA CurrentGenericKeys ; generic key count + LDA.b #$00 : STA.l RoomDarkness + LDA.l CurrentGenericKeys ; generic key count RTL .normal - LDA.b #$00 : STA $7EC017 + LDA.b #$00 : STA.l RoomDarkness LDA.b #$FF ; don't show keys RTL ;================================================================================ +GetCrystalNumber: + PHX + TXA : ASL : TAX + LDA.l CurrentWorld : EOR.b #$40 : BNE + + INX + + + LDA.l CrystalNumberTable-16, X + PLX +RTL +;================================================================================ SetLWDWMap: PHP SEP #$20 ; set 8-bit accumulator - LDA CurrentWorld : EOR.b #$40 + LDA.l CurrentWorld : EOR.b #$40 BNE + LDA.b #07 : BRA ++ ; dark world - crystals + LDA.b #03 ; light world - pendants ++ - STA MapIcons + STA.l MapIcons PLP RTL ;================================================================================ GetMapMode: - LDA CurrentWorld : AND.b #$40 : BEQ + + LDA.l CurrentWorld : AND.b #$40 : BEQ + LDA.b #07 ; dark world - crystals RTL + LDA.b #03 ; light world - pendants RTL ;================================================================================ -;GetPendantCrystalWorld: -; PHB : PHK : PLB -; PHX -; LDA $040C : LSR : TAX -; LDA .dungeon_worlds, X -; PLX : PLB -; CMP.b #$00 -;RTL -;================================================================================ BringMenuDownEnhanced: REP #$20 ; set 16-bit accumulator LDA.l TournamentSeed : AND.w #$00FF @@ -83,13 +83,13 @@ BringMenuDownEnhanced: EOR.w #$FFFF : !ADD.w #$0001 ; negate menu speed - !ADD $EA : CMP.w #$FF18 : !BGE .noOvershoot + !ADD BG3VOFSQL : CMP.w #$FF18 : !BGE .noOvershoot LDA.w #$FF18 ; if we went past the limit, go to the limit .noOvershoot - STA $EA : CMP.w #$FF18 + STA.b BG3VOFSQL : CMP.w #$FF18 SEP #$20 ; set 8-bit accumulator BNE .notDoneScrolling - INC $0200 + INC.w SubModuleInterface .notDoneScrolling RTL ;================================================================================ @@ -101,45 +101,46 @@ RaiseHudMenu: LDA.l MenuSpeed : AND.w #$00FF ++ - !ADD $EA : BMI .noOvershoot + !ADD BG3VOFSQL : BMI .noOvershoot LDA.w #$0000 ; if we went past the limit, go to the limit .noOvershoot - STA $EA + STA.b BG3VOFSQL RTL ;================================================================================ CheckCloseItemMenu: LDA.l MenuCollapse : BNE + - LDA $F4 : AND.b #$10 : RTL + LDA.b Joy1A_New : AND.b #$10 : RTL + - LDA $F0 : AND.b #$10 : EOR.b #$10 + LDA.b Joy1A_All : EOR.b #$10 RTL ;================================================================================ ShowDungeonItems: - LDA $040C : AND.w #$00FF : CMP.w #$00FF : BNE + : RTL : + ; return normal result if outdoors or in a cave - ;LDA $F0 : AND.w #$0020 ; check for select - LDA HudFlag : AND.w #$0020 ; check hud flag - BEQ + : LDA.w #$0000 : RTL : + ; if set, send the zero onwards - LDA $040C : AND.w #$00FF : CMP.w #$00FF ; original logic + LDA.w DungeonID-1 : BMI .no_dungeon + LDA.l HudFlag : AND.w #$0040 : BEQ + + .no_dungeon + LDA.w #$0000 + RTL + + + LDA.w DungeonID + REP #$02 + .done RTL ;-------------------------------------------------------------------------------- UpdateKeys: - PHX : PHP - SEP #$30 ; set 8-bit accumulator & index registers - LDA $040C : CMP.b $1F : !BLT .skip - - LSR : TAX ; get dungeon index and store to X - - LDA CurrentSmallKeys ; load current key count - STA DungeonKeys, X ; save to main counts - - CPX.b #$00 : BNE + - STA HyruleCastleKeys ; copy HC to sewers - + : CPX.b #$01 : BNE + - STA SewerKeys ; copy sewers to HC - + - .skip - JSL.l PostItemGet - PLP : PLX + PHX : PHP + SEP #$30 + LDA.l GenericKeys : BNE .skip + LDA.w DungeonID : CMP.b #$1F : BCS .skip + LSR : TAX + LDA.l CurrentSmallKeys + CPX.b #$02 : BCC .castle_sewers + STA.l DungeonKeys, X + BRA .skip + .castle_sewers + STA.l HyruleCastleKeys : STA.l SewerKeys + .skip + JSL PostItemGet + PLP : PLX RTL ;$37C = Sewer Passage ;$37D = Hyrule Castle @@ -158,40 +159,39 @@ RTL ;-------------------------------------------------------------------------------- DrawBootsInMenuLocation: LDA.l HUDDungeonItems : BNE + - LDA.w #$1608 : STA $00 + LDA.w #$1608 : STA.b Scrap00 RTL + - LDA.w #$1588 : STA $00 + LDA.w #$1588 : STA.b Scrap00 RTL ;-------------------------------------------------------------------------------- DrawGlovesInMenuLocation: LDA.l HUDDungeonItems : BNE + - LDA.w #$1610 : STA $00 + LDA.w #$1610 : STA.b Scrap00 RTL + - LDA.w #$1590 : STA $00 + LDA.w #$1590 : STA.b Scrap00 RTL ;-------------------------------------------------------------------------------- DrawFlippersInMenuLocation: LDA.l HUDDungeonItems : BNE + - LDA.w #$1618 : STA $00 + LDA.w #$1618 : STA.b Scrap00 RTL + - LDA.w #$1598 : STA $00 + LDA.w #$1598 : STA.b Scrap00 RTL ;-------------------------------------------------------------------------------- DrawMoonPearlInMenuLocation: LDA.l HUDDungeonItems : BNE + - LDA.w #$1620 : STA $00 + LDA.w #$1620 : STA.b Scrap00 RTL + - LDA.w #$15A0 : STA $00 + LDA.w #$15A0 : STA.b Scrap00 RTL ;-------------------------------------------------------------------------------- DrawHUDDungeonItems: LDA.l HUDDungeonItems : BNE .continue - - RTL +RTL .dungeon_positions dw 0 ; Hyrule Castle @@ -225,7 +225,7 @@ DrawHUDDungeonItems: .dungeon_bitmasks - dw $4000 ; Hyrule Castle + dw $C000 ; Hyrule Castle dw $2000 ; Eastern dw $1000 ; Desert dw $0020 ; Hera @@ -254,28 +254,19 @@ DrawHUDDungeonItems: dw $A4*2 ; ; Turtle Rock dw $0D*2 ; ; Ganon's Tower -.continue - PHP - - PHB - PHK - PLB - - REP #$30 - + .continue + PHP : PHB + PHK : PLB + REP #$30 ;------------------------------------------------------------------------------- ; dungeon names LDA.w #$2D50 + LDY.w #00 - LDY.w #0 - - -.next_dungeon_name + .next_dungeon_name LDX.w .dungeon_positions,Y - STA.w $1646,X - + STA.w GFXStripes+$0646,X INC - INY : INY CPY.w #26 : BCC .next_dungeon_name @@ -283,171 +274,142 @@ DrawHUDDungeonItems: LDX.w #$001E LDA.w #$24F5 --- STA.w $1686,X - STA.w $16C6,X - STA.w $1706,X - - DEX : DEX : BPL -- +-- STA.w GFXStripes+$0686,X + STA.w GFXStripes+$06C6,X + STA.w GFXStripes+$0706,X + DEX : DEX + BPL -- LDA.l HudFlag : AND.w #$0020 : BEQ + - - JMP .maps_and_compasses - -+ + JMP .maps_and_compasses ;------------------------------------------------------------------------------- + + + LDA.l HUDDungeonItems : AND.w #$0001 : BNE + + LDA.w #$24F5 : STA.w GFXStripes+$0684 ; blank tile + BRA .skip_small_keys + + + .draw_small_keys + LDA.w #$2810 : STA.w GFXStripes+$0684 ; small keys icon + LDY.w #0 + CLC - LDA HUDDungeonItems : AND.w #$0001 : BEQ .skip_small_keys + .next_small_key + LDX.w .small_key_x_offset,Y + LDA.l DungeonKeys,X + AND.w #$00FF -.draw_small_keys - LDA.w #$2810 : STA $1684 ; small keys icon + LDX.w .dungeon_positions,Y + ADC.w #$2816 + STA.w GFXStripes+$0686,X - LDY.w #0 - - ; Clear the carry only once - ; it will be cleared by looping condition afterwards - CLC - -.next_small_key - LDX.w .small_key_x_offset,Y - LDA.l DungeonKeys,X - AND.w #$00FF - - LDX.w .dungeon_positions,Y - ADC.w #$2816 - STA.w $1686,X - - INY : INY - CPY.w #26 : BCC .next_small_key + INY : INY + CPY.w #26 : BCC .next_small_key ;------------------------------------------------------------------------------- -.skip_small_keys + .skip_small_keys + ; Big Keys + LDA.l HUDDungeonItems : AND.w #$0002 : BNE + + LDA.w #$24F5 : STA.w GFXStripes+$06C4 ; blank tile + BRA .skip_big_keys + + + LDA.w #$2811 : STA.w GFXStripes+$06C4 ; big key icon + LDX.w #0 + LDA.l BigKeyField - ; Big Keys - LDA HUDDungeonItems : AND.w #$0002 : BEQ .skip_big_keys + .next_big_key + BIT.w .dungeon_bitmasks,X + BEQ ..skip_key + LDY.w .dungeon_positions,X + LDA.w #$2826 + STA.w GFXStripes+$06C6,Y + LDA.l BigKeyField - LDA.w #$2811 : STA $16C4 ; big key icon - - ; use X so we can BIT - LDX.w #0 - - ; load once and test multiple times - LDA.l BigKeyField - -.next_big_key - BIT.w .dungeon_bitmasks,X - BEQ ..skip_key - - LDY.w .dungeon_positions,X - LDA.w #$2826 - STA.w $16C6,Y - - ; reload - LDA.l BigKeyField - -..skip_key - INX : INX - CPX.w #26 : BCC .next_big_key + ..skip_key + INX : INX + CPX.w #26 : BCC .next_big_key ;------------------------------------------------------------------------------- -.skip_big_keys + .skip_big_keys + LDA.l HUDDungeonItems : AND.w #$0010 : BNE + + LDA.w #$24F5 : STA.w GFXStripes+$0704 ; blank tile + BRA .skip_boss_kills + + + LDA.w #$280F : STA.w GFXStripes+$0704 ; skull icon + LDY.w #0 - LDA HUDDungeonItems : AND.w #$0010 : BEQ .skip_boss_kills + .next_boss_kill + LDX.w .boss_room_ids,Y + LDA.l RoomDataWRAM.l,X + AND.w #$0800 + BEQ ..skip_boss_kill + LDA.w #$2826 + LDX.w .dungeon_positions,Y + STA.w GFXStripes+$0706,X + ..skip_boss_kill + INY : INY + CPY.w #26 : BCC .next_boss_kill - LDA.w #$280F : STA $1704 ; skull icon +;------------------------------------------------------------------------------- + .skip_boss_kills + LDA.l HUDDungeonItems : BIT.w #$00F3 : BEQ .maps_and_compasses + JMP .exit +;------------------------------------------------------------------------------- + .maps_and_compasses + LDA.w #$24F5 : STA.w GFXStripes+$0704 ; blank tile boss icon + ; Maps + LDA.l HUDDungeonItems : AND.w #$0004 : BNE + + LDA.w #$24F5 : STA.w GFXStripes+$0684 ; map icon + BRA .skip_maps + + + LDA.w #$2821 : STA.w GFXStripes+$0684 ; map icon + LDX.w #0 + LDA.l MapField - LDY.w #0 + .next_map + BIT.w .dungeon_bitmasks,X + BEQ ..skip_map -.next_boss_kill - LDX.w .boss_room_ids,Y - LDA.l RoomDataWRAM.l,X - AND.w #$0800 - BEQ ..skip_boss_kill + LDY.w .dungeon_positions,X + LDA.w #$2826 + STA.w GFXStripes+$0686,Y + LDA.l MapField - LDA.w #$2826 - LDX.w .dungeon_positions,Y - STA.w $1706,X + ..skip_map + INX : INX + CPX.w #26 : BCC .next_map -..skip_boss_kill - INY : INY - CPY.w #26 : BCC .next_boss_kill + .skip_maps + LDA.l HUDDungeonItems : AND.w #$0008 : BNE + + LDA.w #$24F5 : STA.w GFXStripes+$06C4 ; blank tile + BRA .skip_compasses + + + LDA.w #$2C20 : STA.w GFXStripes+$06C4 ; compass icon + LDX.w #0 + LDA.l CompassField + + .next_compass + BIT.w .dungeon_bitmasks,X + BEQ ..skip_compass + + LDY.w .dungeon_positions,X + LDA.w #$2826 + STA.w GFXStripes+$06C6,Y + LDA.l CompassField + + ..skip_compass + INX : INX + CPX.w #26 : BCC .next_compass ;------------------------------------------------------------------------------- -.skip_boss_kills - JMP .exit - -;------------------------------------------------------------------------------- - - ; This should only display if select is pressed in hud - .maps_and_compasses - - ; Maps - LDA HUDDungeonItems : AND.w #$0004 : BEQ .skip_maps - LDA.w #$2821 : STA $1684 ; map icon - - ; use X so we can BIT - LDX.w #0 - - ; load once and test multiple times - LDA.l MapField - -.next_map - BIT.w .dungeon_bitmasks,X - BNE ..draw_map - ; MapMode indicates if maps are needed for the info - LDA.l MapMode : AND #$00FF : BNE ..skip_map - -..draw_map - LDY.w .dungeon_positions,X - JSL MapIndicatorLong - STA.w $1686,Y - -..skip_map - ; reload - LDA.l MapField - INX : INX - CPX.w #26 : BCC .next_map - -;------------------------------------------------------------------------------- - -.skip_maps - - ; Compasses - LDA HUDDungeonItems : AND.w #$0008 : BEQ .skip_compasses - LDA.w #$2C20 : STA $16C4 ; compass icon - - ; use X so we can BIT - LDX.w #0 - - ; load once and test multiple times - LDA.l CompassField - -.next_compass - BIT.w .dungeon_bitmasks,X - BEQ ..skip_compass - - LDY.w .dungeon_positions,X - LDA.w #$2826 - STA.w $16C6,Y - - ; reload - LDA.l CompassField - -..skip_compass - INX : INX - CPX.w #26 : BCC .next_compass - -;------------------------------------------------------------------------------- - -.skip_compasses - -.exit - PLB - PLP + .skip_compasses + .exit + PLB + PLP RTL ;-------------------------------------------------------------------------------- ;================================================================================ @@ -456,75 +418,72 @@ DrawPendantCrystalDiagram: REP #$30 ; Set 16-bit accumulator & index registers LDX.w #$0000 ; Paint entire box black & draw empty pendants and crystals - - LDA.l .row0, X : STA $12EA, X - LDA.l .row1, X : STA $132A, X - LDA.l .row2, X : STA $136A, X - LDA.l .row3, X : STA $13AA, X - LDA.l .row4, X : STA $13EA, X - LDA.l .row5, X : STA $142A, X - LDA.l .row6, X : STA $146A, X - LDA.l .row7, X : STA $14AA, X - LDA.l .row8, X : STA $14EA, X + LDA.l .row0, X : STA.w GFXStripes+$02EA, X + LDA.l .row1, X : STA.w GFXStripes+$032A, X + LDA.l .row2, X : STA.w GFXStripes+$036A, X + LDA.l .row3, X : STA.w GFXStripes+$03AA, X + LDA.l .row4, X : STA.w GFXStripes+$03EA, X + LDA.l .row5, X : STA.w GFXStripes+$042A, X + LDA.l .row6, X : STA.w GFXStripes+$046A, X + LDA.l .row7, X : STA.w GFXStripes+$04AA, X + LDA.l .row8, X : STA.w GFXStripes+$04EA, X INX #2 : CPX.w #$0014 : BCC - ; pendants - LDA PendantsField + LDA.l PendantsField LSR : BCC + ; pendant of wisdom (red) LDX.w #$252B - STX.w $13B6 - INX : STX.w $13B8 - INX : STX.w $13F6 - INX : STX.w $13F8 + STX.w GFXStripes+$03B6 + INX : STX.w GFXStripes+$03B8 + INX : STX.w GFXStripes+$03F6 + INX : STX.w GFXStripes+$03F8 + LSR : BCC + ; pendant of power (blue) LDX.w #$2D2B - STX.w $13AE - INX : STX.w $13B0 - INX : STX.w $13EE - INX : STX.w $13F0 + STX.w GFXStripes+$03AE + INX : STX.w GFXStripes+$03B0 + INX : STX.w GFXStripes+$03EE + INX : STX.w GFXStripes+$03F0 + LSR : BCC + ; pendant of courage (green) LDX.w #$3D2B - STX.w $1332 - INX : STX.w $1334 - INX : STX.w $1372 - INX : STX.w $1374 + STX.w GFXStripes+$0332 + INX : STX.w GFXStripes+$0334 + INX : STX.w GFXStripes+$0372 + INX : STX.w GFXStripes+$0374 + - - - ; crystals - LDA CrystalsField + LDA.l CrystalsField LDX.w #$2D44 LDY.w #$2D45 BIT.w #$0002 : BEQ + ; crystal 1 - STX.w $14AC - STY.w $14AE + STX.w GFXStripes+$04AC + STY.w GFXStripes+$04AE + BIT.w #$0010 : BEQ + ; crystal 2 - STX.w $146E - STY.w $1470 + STX.w GFXStripes+$046E + STY.w GFXStripes+$0470 + BIT.w #$0040 : BEQ + ; crystal 3 - STX.w $14B0 - STY.w $14B2 + STX.w GFXStripes+$04B0 + STY.w GFXStripes+$04B2 + BIT.w #$0020 : BEQ + ; crystal 4 - STX.w $1472 - STY.w $1474 + STX.w GFXStripes+$0472 + STY.w GFXStripes+$0474 + BIT.w #$0008 : BEQ + ; crystal 7 - STX.w $14B8 - STY.w $14BA + STX.w GFXStripes+$04B8 + STY.w GFXStripes+$04BA + LDX.w #$2544 LDY.w #$2545 BIT.w #$0004 : BEQ + ; crystal 5 - STX.w $14B4 - STY.w $14B6 + STX.w GFXStripes+$04B4 + STY.w GFXStripes+$04B6 + BIT.w #$0001 : BEQ + ; crystal 6 - STX.w $1476 - STY.w $1478 + STX.w GFXStripes+$0476 + STY.w GFXStripes+$0478 + PLB : PLP @@ -602,3 +561,79 @@ dw $A8FB, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $E8FB ;0x1C - ??? possibly unused. (Were they planning two extra dungeons perhaps?) ;0x1E - ??? possibly unused. ;================================================================================ +HandleEmptyMenu: + LDA.b Joy1A_New : BIT.b #$DF : BNE .close_menu ; Not select, close menu + BIT.b #$20 : BNE .sel_pressed + LDA.b Joy1A_All : BIT.b #$20 : BNE .wait_for_change + LDA.l HudFlag : AND.b #$60 : BEQ .wait_for_change + LDA.l HudFlag : AND.b #$9F : STA.l HudFlag ; Unset without select + JSL MaybePlaySelectSFX + LDA.b #$0C : BRA .done + .sel_pressed + LDA.l HUDDungeonItems : BIT.b #$0C : BNE + + LDA.b #$40 + BRA .store_flag + + + LDA.b #$60 + .store_flag + STA.l HudFlag + JSL MaybePlaySelectSFX + LDA.b #$0C : BRA .done + .wait_for_change + LDA.b #$03 : BRA .done + .close_menu + LDA.b #$06 + .done + STA.w SubModuleInterface +RTL +;------------------------------------------------------------------------------- +MaybeDrawEquippedItem: + LDA.w ItemCursor : BEQ + + JML ItemMenu_DrawEquippedYItem+$07 + + +JML ItemMenu_DrawEquippedYItem_exit +;------------------------------------------------------------------------------- +RestoreMenu_SetSubModule: + LDA.w ItemCursor : BEQ + + LDA.b #$04 : STA.w SubModuleInterface + RTL + + + LDA.b #$03 : STA.w SubModuleInterface +RTL +;------------------------------------------------------------------------------- +DrawHeartPiecesMenu: + LDA.l HUDHeartColors_index : AND.w #$00FF + ASL : TAX + LDA.l HUDHeartColors_masks_game_hud,X + STA.b Scrap0D + + LDA.l HeartPieceQuarter : AND.w #$00FF + ASL #3 : TAX + LDY.w #$16F2 + + LDA.l HeartPieceMenuBaseTiles,X + ORA.b Scrap0D + STA.w $0000,Y + + INX #2 + LDA.l HeartPieceMenuBaseTiles,X + ORA.b Scrap0D + STA.w $0002,Y + + INX #2 + LDA.l HeartPieceMenuBaseTiles,X + ORA.b Scrap0D + STA.w $0040,Y + + INX #2 + LDA.l HeartPieceMenuBaseTiles,X + ORA.b Scrap0D + STA.w $0042,Y +RTL + +HeartPieceMenuBaseTiles: +dw $2084, $6084, $2085, $6085 ; 0 heart pieces +dw $20AD, $6084, $2085, $6085 ; 1 heart piece +dw $20AD, $6084, $20AE, $6085 ; 2 heart pieces +dw $20AD, $60AD, $20AE, $6085 ; 3 heart pieces +;------------------------------------------------------------------------------- diff --git a/playername.asm b/playername.asm index 2a820b6..ad0f725 100644 --- a/playername.asm +++ b/playername.asm @@ -15,20 +15,20 @@ WriteBlanksToPlayerName: STA.l ExtendedFileNameSRAM+20 STA.l ExtendedFileNameSRAM+22 - STA.l $7003D9, X ;What we wrote over (clear first byte of vanilla name slot) + STA.l FileNameVanillaSRAM, X ;What we wrote over (clear first byte of vanilla name slot) RTL WriteCharacterToPlayerName: - STA ExtendedFileNameSRAM, X + STA.l ExtendedFileNameSRAM, X CPX.w #$0008 : !BGE + - STA $7003D9, X ;what we wrote over + STA.l FileNameVanillaSRAM, X ;what we wrote over + RTL ReadCharacterFromPlayerName: ;Only for use on Name Screen - LDA ExtendedFileNameSRAM, X + LDA.l ExtendedFileNameSRAM, X CPX.w #$0008 : !BGE + - LDA $7003D9, X ;what we wrote over + LDA.l FileNameVanillaSRAM, X ;what we wrote over + RTL @@ -40,13 +40,13 @@ PLB RTL WrapCharacterPosition: - LDA $0B12 : BPL + + LDA.w PlayerNameCursor : BPL + LDA.b #$0B + CMP.b #$0C : !BLT + LDA.b #$00 + - STA $0B12 + STA.w PlayerNameCursor RTL CharacterPositions: @@ -57,3 +57,76 @@ HeartCursorPositions: db $70, $78, $80, $88 db $98, $a0, $a8, $b0 db $c0, $c8, $d0, $d8 + + +NewNameStripes: +dw $AB66, $1100 ; 0-4 top +dw $1D40, $0188, $1D41, $0188, $1D42, $0188, $1D43, $0188 +dw $1D44 +dw $CB66, $1100 ; 0-4 bottom +dw $1D50, $0188, $1D51, $0188, $1D52, $0188, $1D53, $0188 +dw $1D54 +dw $EB66, $1100 ; 5-9 top +dw $1D45, $0188, $1D46, $0188, $1D47, $0188, $1D48, $0188 +dw $1D49 +dw $0B67, $1100 ; 5-9 bottom +dw $1D55, $0188, $1D56, $0188, $1D57, $0188, $1D58, $0188 +dw $1D59 + +; Move JP characters where a-z are to column where second END button was +dw $B162, $1100 +dw $1CEE, $0188, $1CEF, $0188, $1D05, $0188, $1D06, $0188 +dw $1D07 +dw $D162, $1100 +dw $1CFE, $0188, $1CFF, $0188, $1D15, $0188, $1D16, $0188 +dw $1D17 +dw $F162, $1100 +dw $1D0D, $0188, $1D0E, $0188, $1D0F, $0188, $1D20, $0188 +dw $1D21 +dw $1163, $1100 +dw $1D1D, $0188, $1D1E, $0188, $1D1F, $0188, $1D30, $0188 +dw $1D31 +dw $3163, $1100 +dw $1D22, $0188, $1D23, $0188, $1D24, $0188, $1D25, $0188 +dw $1D26 +dw $5163, $1100 +dw $1D32, $0188, $1D33, $0188, $1D34, $0188, $1D35, $0188 +dw $1D36 + +db $80 ; termination + +TransferNewNameStripes: + REP #$30 + LDA.w GameMode : CMP.w #$0204 : BNE .exit + SEP #$20 + LDA.b #NewNameStripes>>0 : STA.b Scrap00 + LDA.b #NewNameStripes>>8 : STA.b Scrap01 + LDA.b #NewNameStripes>>16 : STA.b Scrap02 : STA.w DMA1ADDRB + STZ.b Scrap06 : LDY.w #$0000 + .check_next + LDA.b [Scrap00],Y : BPL .next_stripe + .exit + SEP #$30 +RTL + .next_stripe + STA.b Scrap04 + INY + LDA.b [Scrap00],Y : STA.b Scrap03 + INY + LDA.b [Scrap00],Y : AND.b #$80 : ASL : ROL : STA.b Scrap07 + LDA.b [Scrap00],Y : AND.b #$40 : STA.b Scrap05 + LSR #3 : ORA.b #$01 : STA.w DMA1MODE + LDA.b #VMDATAL : STA.w DMA1PORT + REP #$20 + LDA.b Scrap03 : STA.w VMADDR + LDA.b [Scrap00],Y : XBA : AND.w #$3FFF + TAX : INX : STX.w DMA1SIZE + INY #2 : TYA + CLC : ADC.b Scrap00 : STA.w DMA1ADDRL + LDA.b Scrap05 + STX.b Scrap03 + TYA : CLC : ADC.b Scrap03 : TAY + SEP #$20 + LDA.b Scrap07 : ORA.b #$80 : STA.w VMAIN + LDA.b #$02 : STA.w MDMAEN + JMP.w .check_next diff --git a/potions.asm b/potions.asm index 1eddb15..7068c0f 100644 --- a/potions.asm +++ b/potions.asm @@ -2,32 +2,31 @@ ; $7F5092 - Potion Animation Busy Flags (Health) ; $7F5093 - Potion Animation Busy Flags (Magic) ;-------------------------------------------------------------------------------- -!BUSY_HEALTH = $7F5092 RefillHealth: REP #$20 ; set 16-bit accumulator - LDA $A0 ; these are all decimal because i got them that way + LDA.b RoomIndex ; these are all decimal because i got them that way CMP.w #279 : BNE + ; Spike Cave bottles work normally SEP #$20 ; set 8-bit accumulator - LDA #$A0 + LDA.b #$A0 BRA .done + SEP #$20 ; set 8-bit accumulator LDA.l PotionHealthRefill : CMP.b #$A0 : !BGE .done - LDA !BUSY_HEALTH : BNE ++ + LDA.l BusyHealth : BNE ++ LDA.l PotionHealthRefill ; load refill amount !ADD CurrentHealth ; add to current health - CMP MaximumHealth : !BLT +++ : LDA MaximumHealth : +++ - STA !BUSY_HEALTH + CMP.l MaximumHealth : !BLT +++ : LDA.l MaximumHealth : +++ + STA.l BusyHealth ++ - LDA CurrentHealth : CMP.l !BUSY_HEALTH : !BLT ++ - LDA.b #$00 : STA HeartsFiller - LDA $020A : BNE .notDone - LDA.b #$00 : STA !BUSY_HEALTH + LDA.l CurrentHealth : CMP.l BusyHealth : !BLT ++ + LDA.b #$00 : STA.l HeartsFiller + LDA.w $020A : BNE .notDone + LDA.b #$00 : STA.l BusyHealth SEC RTL ++ - LDA.b #$08 : STA HeartsFiller ; refill some health + LDA.b #$08 : STA.l HeartsFiller ; refill some health .notDone CLC RTL @@ -35,54 +34,53 @@ RefillHealth: ; Check goal health versus actual health. ; if(actual < goal) then branch. - LDA CurrentHealth : CMP MaximumHealth : BCC .refillAllHealth - LDA MaximumHealth : STA CurrentHealth - LDA.b #$00 : STA HeartsFiller + LDA.l CurrentHealth : CMP.l MaximumHealth : BCC .refillAllHealth + LDA.l MaximumHealth : STA.l CurrentHealth + LDA.b #$00 : STA.l HeartsFiller ; ??? not sure what purpose this branch serves. - LDA $020A : BNE .beta + LDA.w $020A : BNE .beta SEC RTL .refillAllHealth ; Fill up ze health. - LDA.b #$A0 : STA HeartsFiller + LDA.b #$A0 : STA.l HeartsFiller .beta CLC RTL ;-------------------------------------------------------------------------------- -!BUSY_MAGIC = $7F5093 RefillMagic: REP #$20 ; set 16-bit accumulator - LDA $A0 ; these are all decimal because i got them that way + LDA.b RoomIndex ; these are all decimal because i got them that way CMP.w #279 : BNE + ; Spike Cave bottles work normally SEP #$20 ; set 8-bit accumulator - LDA #$80 + LDA.b #$80 BRA .done + SEP #$20 ; set 8-bit accumulator LDA.l PotionMagicRefill : CMP.b #$80 : !BGE .done - LDA !BUSY_MAGIC : BNE ++ + LDA.l BusyMagic : BNE ++ LDA.l PotionMagicRefill ; load refill amount !ADD CurrentMagic ; add to current magic CMP.b #$80 : !BLT +++ : LDA.b #$80 : +++ - STA !BUSY_MAGIC + STA.l BusyMagic ++ - LDA CurrentMagic : CMP.l !BUSY_MAGIC : !BLT ++ - LDA.b #$00 : STA !BUSY_MAGIC + LDA.l CurrentMagic : CMP.l BusyMagic : !BLT ++ + LDA.b #$00 : STA.l BusyMagic SEC RTL ++ - LDA.b #$01 : STA MagicFiller ; refill some magic + LDA.b #$01 : STA.l MagicFiller ; refill some magic CLC RTL .done SEP #$30 ; Check if Link's magic meter is full - LDA CurrentMagic : CMP.b #$80 + LDA.l CurrentMagic : CMP.b #$80 BCS .itsFull ; Tell the magic meter to fill up until it's full. - LDA.b #$80 : STA MagicFiller + LDA.b #$80 : STA.l MagicFiller SEP #$30 RTL .itsFull diff --git a/quickswap.asm b/quickswap.asm index 1331614..acfaea1 100644 --- a/quickswap.asm +++ b/quickswap.asm @@ -4,75 +4,89 @@ QuickSwap: ; We perform all other checks only if we are pushing L or R in order to have minimal ; perf impact, since this runs every frame - LDA.b $F6 : AND #$30 : BEQ .done + LDA.b Joy1B_New : AND.b #$30 : BEQ .done XBA ; stash away the value for after the checks. LDA.l QuickSwapFlag : BEQ .done - LDA.w $0202 : BEQ .done ; Skip everything if we don't have any items - + LDA.w ItemCursor : BEQ .done ; Skip everything if we don't have any items + INC.w UpdateHUDFlag + LDY.b #$14 PHX XBA ; restore the stashed value CMP.b #$30 : BNE + ; If prossing both L and R this frame, then go directly to the special swap code - LDX.w $0202 : BRA .special_swap + LDX.w ItemCursor : BRA .special_swap + - BIT #$10 : BEQ + ; Only pressed R - JSR.w RCode - LDA.b $F2 : BIT #$20 : BNE .special_swap ; Still holding L from a previous frame + BIT.b #$10 : BEQ + ; Only pressed R + JSR RCode + LDA.b Joy1B_All : BIT.b #$20 : BNE .special_swap ; Still holding L from a previous frame BRA .store + ; Only pressed L - JSR.w LCode - LDA.b $F2 : BIT #$10 : BNE .special_swap ; Still holding R from a previous frame + JSR LCode + LDA.b Joy1B_All : BIT #$10 : BNE .special_swap ; Still holding R from a previous frame BRA .store .special_swap - LDA InventoryTracking+1 : ORA #$01 : STA InventoryTracking+1 + LDA.l InventoryTracking+1 : ORA.b #$01 : STA.l InventoryTracking+1 CPX.b #$02 : BEQ + ; boomerang CPX.b #$01 : BEQ + ; bow CPX.b #$05 : BEQ + ; powder CPX.b #$0D : BEQ + ; flute CPX.b #$10 : BEQ + ; bottle BRA .store - + STX $0202 : JSL ProcessMenuButtons_y_pressed + + STX.w ItemCursor : JSL ProcessMenuButtons_y_pressed .store - LDA.b #$20 : STA.w $012F - STX $0202 + LDA.b #$20 : STA.w SFX3 + STX.w ItemCursor JSL HUD_RefreshIconLong PLX .done - LDA.b $F6 : AND.b #$40 ;what we wrote over + LDA.b Joy1B_New : AND.b #$40 ;what we wrote over RTL RCode: - LDX.w $0202 - LDA.b $F2 : BIT #$20 : BNE ++ ; Still holding L from a previous frame - LDA InventoryTracking+1 : AND #$FE : STA InventoryTracking+1 + LDX.w ItemCursor + LDA.b Joy1B_All : BIT.b #$20 : BNE ++ ; Still holding L from a previous frame + LDA.l InventoryTracking+1 : AND.b #$FE : STA.l InventoryTracking+1 BRA + ++ - LDA InventoryTracking+1 : BIT #$01 : BEQ + + LDA.l InventoryTracking+1 : BIT.b #$01 : BEQ + RTS - + CPX.b #$14 : BNE + : LDX.b #$00 ;will wrap around to 1 + INX + DEY : BEQ + .nextItem - JSL.l IsItemAvailable : BEQ - + JSL IsItemAvailable : BEQ - + + RTS LCode: - LDX.w $0202 - LDA.b $F2 : BIT #$10 : BNE ++ ; Still holding R from a previous frame - LDA InventoryTracking+1 : AND #$FE : STA InventoryTracking+1 + LDX.w ItemCursor + LDA.b Joy1B_All : BIT #$10 : BNE ++ ; Still holding R from a previous frame + LDA.l InventoryTracking+1 : AND.b #$FE : STA.l InventoryTracking+1 BRA + ++ - LDA InventoryTracking+1 : BIT #$01 : BEQ + + LDA.l InventoryTracking+1 : BIT.b #$01 : BEQ + RTS - + CPX.b #$01 : BNE + : LDX.b #$15 ; will wrap around to $14 + DEX + DEY : BEQ + .nextItem - JSL.l IsItemAvailable : BEQ - + JSL IsItemAvailable : BEQ - + + RTS + +IsItemAvailable: + LDA.l InfiniteBombs : BEQ .finite + .infinite + CPX.b #$04 : BNE .finite + LDA.b #$01 : RTL + .finite + LDA.l EquipmentWRAM-1, X +RTL diff --git a/ram.asm b/ram.asm index 3510b8f..68adcff 100644 --- a/ram.asm +++ b/ram.asm @@ -1,12 +1,684 @@ ;================================================================================ ; RAM Labels & Assertions ;-------------------------------------------------------------------------------- -; Labels for values in WRAM and assertions that ensure they're correct and -; at the expected addresses. All values larger than one byte are little endian. +; This module is primarily concerned with labeling WRAM addresses used by the +; randomizer and documenting their usage. We use a combination of base $[address] +; and WRAMLabel = $[address] here, favoring the former when we have larger blocks +; of contiguous ram labeled. A line is skipped when the next address is non-cotiguous, +; but comments will go in the empty space if multi-line. In some cases the label +; name can be descriptive enough without documentation. Or I just didn't know what it was. +; +; See the JP 1.0 disassembly for reference, specifically symbols_wram.asm +; (https://github.com/spannerisms/jpdasm/ - 19/11/2022) ;-------------------------------------------------------------------------------- -; Placeholder and for compass item max count allocations, still WIP +pushpc +org 0 + +;================================================================================ +; Bank 7E ;-------------------------------------------------------------------------------- -CompassTotalsWRAM = $7F5410 +;================================================================================ +; Direct Page +;-------------------------------------------------------------------------------- +base $7E0000 +Scrap: +Scrap00: skip 1 ; Used as short-term scratch space. If you need some short-term +Scrap01: skip 1 ; RAM, you can often use these. Double check that the next use +Scrap02: skip 1 ; of the addresses you want to use is a write. +Scrap03: skip 1 ; +Scrap04: skip 1 ; +Scrap05: skip 1 ; +Scrap06: skip 1 ; +Scrap07: skip 1 ; +Scrap08: skip 1 ; +Scrap09: skip 1 ; +Scrap0A: skip 1 ; +Scrap0B: skip 1 ; +Scrap0C: skip 1 ; +Scrap0D: skip 1 ; +Scrap0E: skip 1 ; +Scrap0F: skip 1 ; +GameMode = $7E0010 ; Game mode & submode. Refer to disassembly. +GameSubMode = $7E0011 ; +NMIDoneFlag = $7E0012 ; $00 = Main loop done | $01 = Not done (lag) +INIDISPQ = $7E0013 ; Queue for INIDISP updates. Written during NMI. +NMISTRIPES = $7E0014 ; NMI update flags. +NMICGRAM = $7E0015 ; When non-zero, will trigger a specific gfx update +NMIHUD = $7E0016 ; during NMI. +NMIINCR = $7E0017 ; +NMIUP1100 = $7E0018 ; +UPINCVH = $7E0019 ; Incremental upload VRAM high byte +FrameCounter = $7E001A ; Increments every frame that the game isn't lagging +IndoorsFlag = $7E001B ; $00 = Outdoors | $01 = Indoors +MAINDESQ = $7E001C ; PPU register queues written during NMI +SUBDESQ = $7E001D ; +TMWQ = $7E001E ; +TSWQ = $7E001F ; +LinkPosY = $7E0020 ; Link's absolute x/y coordinates. Both are word length. +LinkPosX = $7E0022 ; +LinkPosZ = $7E0024 ; $FFFF when on ground +LinkPushDirection = $7E0026 ; - - - - u d l r +LinkRecoilY = $7E0027 ; +LinkRecoilX = $7E0028 ; +LinkRecoilZ = $7E0029 ; +LinkSubPixelVelocty = $7E002A ; Word length +LinkAnimationStep = $7E002E ; +LinkDirection = $7E002F ; $00 = Up | $02 = Down | $04 = Left | $06 = Right + ; +OAMOffsetY = $7E0044 ; +OAMOffsetX = $7E0045 ; +LinkIncapacitatedTimer = $7E0046 ; Countdown when Link takes damage, not same as I-frames + ; +ForceMove = $7E0049 ; Forces D-Pad inputs when written to + ; +CapeTimer = $7E004C ; Countdown for cape sapping magic Countdown for cape sapping magic.. +LinkJumping = $7E004D ; $00 = None | $01 = Bonk/damage/water | $02 = Ledge + ; +LinkStrafe = $7E0050 ; ??? + ; +CapeOn = $7E0055 ; Link invisible and untouchable when set. +BunnyFlagDP = $7E0056 ; $00 = Link | $01 = Bunny + ; +PitTileActField = $7E0059 ; Tile action bitfield used by pits +LinkSlipping = $7E005B ; $00 = None | $01 = Near pit + ; $02 = Falling | $03 = Falling "more" +FallTimer = $7E005C ; Timer for falling animation +LinkState = $7E005D ; Main Link state handler +LinkSpeed = $7E005E ; Main Link speed handler +ManipTileField = $7E005F ; Bitfield used by manipulable tiles + ; +LinkWalkDirection = $7E0067 ; - - - - u d l r + ; +ScrapBuffer72 = $7E0072 ; Volatile scrap buffer. 5 bytes. + ; +WorldCache = $7E007B ; $00 = Light world | $40 bit set for dark world. + ; +OverworldMap16Buffer = $7E0084 ; Buffer used to load new GFX when scrolling. Word length. +OverworldTilemapIndexX = $7E0086 ; Used to index $500 and tilemap. Word length. +OverworldTilemapIndexY = $7E0088 ; Used to index $500 and tilemap. Word length. +OverworldIndex = $7E008A ; Overworld screen index. Word length. Dark world is OR $40 of + ; light world screen in same position. Zeroed on UW entry. +OverlayID = $7E008C ; Overworld overlay ID. One Byte. + ; +OAMPtr = $7E0090 ; Pointer used to indirectly address OAM buffer. 4 bytes. +BGMODEQ = $7E0094 ; Various PPU queues handled during NMI +MOSAICQ = $7E0095 ; +W12SELQ = $7E0096 ; +W34SELQ = $7E0097 ; +WOBJSELQ = $7E0098 ; +CGWSELQ = $7E0099 ; +CGADSUBQ = $7E009A ; +HDMAENQ = $7E009B ; HDMA enable flags + ; +RoomIndex = $7E00A0 ; Underworld room index. Word length. High byte: $00 = EG1 | $01 = EG2 + ; Not zeroed on exit to overworld. +PreviousRoom = $7E00A2 ; Stores previous value of RoomIndex + ; +CameraBoundH = $7E00A6 ; Which set of camera boundaries to use. +CameraBoundV = $7E00A7 ; + ; +LinkQuadrantH = $7E00A9 ; Which quadrant Link is in. 0 = left, 1 = right +LinkQuadrantV = $7E00AA ; 0 = top, 2 = bottom + ; +RoomTag = $7E00AE ; Room effects; e.g. kill room, shutter switch, etc. Word length. + ; +SubSubModule = $7E00B0 ; Often used as a submodule, such as for transitions + ; +ObjPtr = $7E00B7 ; Pointer for drawing room objects. Three bytes. +ObjPtrOffset = $7E00BA ; Used as an offset for ObjPointer. Word Length. +PlayerSpriteBank = $7E00BC ; +ScrapBufferBD = $7E00BD ; Another scrap buffer. $23 bytes. +FileSelectPosition = $7E00C8 ; +PasswordCodePosition = $7E00C8 ; +PasswordSelectPosition = $7E00C9 ; + ; +BG1H = $7E00E0 ; Background scroll registers +BG2H = $7E00E2 ; For BG1 and BG2, these registers are used for calculations later for different writes to PPU. +BG3HOFSQL = $7E00E4 ; For BG3, the values are written directly to the PPU during NMI +BG1V = $7E00E6 ; Since BG1 and BG2 are not written directly to PPU they are given different names from BG3. +BG2V = $7E00E8 ; +BG3VOFSQL = $7E00EA ; + ; +LinkLayer = $7E00EE ; Layer that Link is on. $00 = BG2 (upper) | $02 = BG1 (lower) + ; +Joy1A_All = $7E00F0 ; Joypad input +Joy2A_All = $7E00F1 ; All = Current & previous frame +Joy1B_All = $7E00F2 ; New = Current frame +Joy2B_All = $7E00F3 ; Old = Previous frame +Joy1A_New = $7E00F4 ; +Joy2A_New = $7E00F5 ; +Joy1B_New = $7E00F6 ; +Joy2B_New = $7E00F7 ; +Joy1A_Old = $7E00F8 ; +Joy2A_Old = $7E00F9 ; +Joy1B_Old = $7E00FA ; +Joy2B_Old = $7E00FB ; + +;================================================================================ +; Mirrored WRAM +;-------------------------------------------------------------------------------- +; Pages 0x00–0x1F of Bank7E are mirrored to every program bank ALTTP uses. +;-------------------------------------------------------------------------------- + +DeathReloadFlag = $7E010A ; Flag set on death for dungeon reload +CurrentMSUTrack = $7E010B ; +GameModeCache = $7E010C ; +GameSubModeCache = $7E010D ; +EntranceIndex = $7E010E ; Entrance ID into underworld. Word length. + ; +MedallionFlag = $7E0112 ; Medallion cutscene flag. $01 = Cutscene active. + ; +VRAMTileMapIndex = $7E0116 ; Index for high bytes for VRAM tile map uploads +VRAMUploadAddress = $7E0118 ; Incremental VRAM upload address. Low byte always 0. Word length. + ; +BG1ShakeV = $7E011A ; Applied to BG Scroll. Word Length. +BG1ShakeH = $7E011C ; + ; +CurrentVolume = $7E0127 ; +TargetVolume = $7E0129 ; +MusicControl = $7E012B ; +MusicControlRequest = $7E012C ; +SFX1 = $7E012D ; +SFX2 = $7E012E ; +SFX3 = $7E012F ; +LastAPUCommand = $7E0130 ; Last non-zero command given to SPC. +LastSFX1 = $7E0131 ; Last non-zero SFX1 +MusicControlQueue = $7E0132 ; Used to queue up writes to MusicControlRequest +CurrentControlRequest = $7E0133 ; Last thing written to MusicControlRequest +LastAPU = $7E0134 ; Stores last anything written to MusicControlRequest + ; +SubModuleInterface = $7E0200 ; Word length. High byte expected to be $00. +ItemCursor = $7E0202 ; Current location of the item menu cursor. + ; +BottleMenuCounter = $7E0205 ; Step counter for opening bottle menu +MenuFrameCounter = $7E0206 ; Incremented every menu frame. Never read. +MenuBlink = $7E0207 ; Incremented every frame and masked with $10 to blink cursor + ; +RaceGameFlag = $7E021B ; + ; +MessageJunk = $7E0223 ; Zeroed but never used (?) + ; +ProgressiveFlag = $7E0224 ; unused +;CoolScratch = $7E0224 ; 0x5C bytes of free ram +ItemStackPtr = $7E0226 ; Pointer into Item GFX and VRAM target queues. Word length. + ; If not zero, pointer should always be left pointing at the + ; next available slot in the stack during the frame. +SpriteID = $7E0230 ; 0x10 bytes. Receipt ID for main loop sprite we're handling. +SpriteMetaData = $7E0240 ; 0x10 bytes. Sprite metadata. Used for prog bow tracking. +AncillaVelocityZ = $7E0294 ; 0x0A bytes +AncillaZCoord = $7E029E ; 0x0A bytes + ; +ItemReceiptID = $7E02D8 ; +ItemReceiptPose = $7E02DA ; $00 = No pose | $01 = One hand up | $02 = Two hands up + ; +BunnyFlag = $7E02E0 ; $00 = Link | $01 = Bunny +Poofing = $7E02E1 ; Flags cape and bunny poof. +PoofTimer = $7E02E2 ; Countdown timer for poofing. +SwordCooldown = $7E02E3 ; Cooldown for sword after dashing through an enemy. +CutsceneFlag = $7E02E4 ; Flags various cutscenes. + ; +ItemReceiptMethod = $7E02E9 ; + ; +TileActBE = $7E02EF ; Bitfield used by breakables and entrances. b b b b d d d d + ; b = Breakables | d = Entrances +UseY1 = $7E0301 ; Bitfield for Y-item usage: b p - a x z h r + ; b = Boomerang | p = Powder | a = Bow | x = Hammer (tested, never set) + ; z = Rods (tested, never set) | h = Hammer | r = Rods +CurrentYItem = $7E0303 ; + ; +AButtonAct = $7E0308 ; Bitfield for A-actions. $80 = Carry/toss | $02 Prayer | $01 = Tree pull +CarryAct = $7E0309 ; Bitfield for carrying. $02 = Tossing | $01 = Lifting + ; +LinkSwimDirection = $7E0340 ; Bitfield for swim direction. (.... udlr) + ; +LinkDeepWater = $7E0345 ; Set when Link is in deep water. + ; +TileActIce = $7E0348 ; Bitfield used by ice. Word length. + ; +TileActDig = $7E035B ; Bitfield used by diggable ground. Word length. High byte unused. + ; +LinkZap = $7E0360 ; When set, recoil zaps Link. + ; +LinkDashing = $7E0372 ; Flags when Link is dashing, also spinspeed +DamageReceived = $7E0373 ; Damage to deal to Link. + ; +UseY2 = $7E037A ; - - b n c h - s + ; b = Book | n = Net | c = Canes | h = Hookshot | s = Shovel +NoDamage = $7E037B ; Prevents Link from receiving damage. + ; +AncillaGeneralA = $7E0385 ; General use buffer for front slot ancillae. $05 bytes. + ; +AncillaGeneralD = $7E0394 ; General use buffer for front slot ancillae. $05 bytes. + ; +AncillaGeneralF = $7E039F ; General use buffer for front slot ancillae. $0F bytes. + ; +AncillaTimer = $7E03B1 ; Used as a timer for ancilla. + ; +AncillaSearch = $7E03C4 ; Used to search through ancilla when every front slot is occupied. + ; +ForceSwordUp = $7E03EF ; $01 = Force sword up pose. +FluteTimer = $7E03F0 ; Countdown timer for being able to use the flute + ; +YButtonOverride = $7E03FC ; Y override for minigames. $00 = Selected item | $01 = Shovel | $02 = Bow + ; +RoomItemsTaken = $7E0403 ; Items taken in a room: b k u t s e h c + ; b = boss kill/item | k = key/heart piece (prevents crystals) + ; u = 2nd key/heart piece | t = chest 4/rupees/swamp drain/bomb floor/mire wall + ; s = chest 3/pod or dp wall | e, h, c = chest 2, 1, 0 +OverworldIndexMirror = $7E040A ; Overworld Area Index. Mirrors $8A +DungeonID = $7E040C ; High byte mostly unused but sometimes read. Word length. + ; +TransitionDirection = $7E0418 ; OW: 0=N 1=S 2=W 3=E UW: 0=S 1=N 2=E 3=W + ; +LayerAdjustment = $7E047A ; Flags layer adjustments. Arms EG. + ; +RoomIndexMirror = $7E048E ; Mirrors RoomIndex + ; +RespawnFlag = $7E04AA ; If set, entrance loading is treated as a respawn. Word length. +Map16ChangeIndex = $7E04AC ; Word length. + ; +OWEntranceCutscene = $7E04C6 ; + ; +HeartBeepTimer = $7E04CA ; + ; +CameraTargetN = $7E0610 ; Camera scroll target for directions NSEW +CameraTargetS = $7E0612 ; +CameraTargetW = $7E0614 ; +CameraTargetE = $7E0616 ; +CameraScrollN = $7E0618 ; Camera scroll trigger areas for directions NSEW +CameraScrollS = $7E061A ; The higher boundary should always be +2 from the lower in +CameraScrollW = $7E061C ; underworld and -2 in overworld. +CameraScrollE = $7E061E ; + ; +NMIAux = $7E0632 ; Stores long address of NMI jump. Currently only used by shops. + ; +SpriteRoomTag = $7E0642 ; Set high by sprites triggering room tags. + ; +SomariaSwitchFlag = $7E0646 ; Set by Somaria when on a switch. + ; +TileMapEntranceDoors = $7E0696 ; Tilemap location of entrance doors. Word length. +TileMapTile32 = $7E0698 ; Tilemap location of new tile32 objects, such as from graves/rocks. Word length. + ; +RandoOverworldEdgeAddr = $7E06F8 ; Used to store OWR edge table addresses +RandoOverworldTargetEdge = $7E06FA; Used to store target edge IDs +RandoOverworldWalkDist = $7E06FC ; Used for custom walk destination after transitions + ; +OverworldSlotPosition = $7E0700 ; Used to show which OW slot/square Link is in. Useful for "quadrants" on larger screens. + ; +RandoOverworldForceTrans = $7E0703; Used to flag forced transitions +RandoOverworldTerrain = $7E0704 ; Used to store terrain type at the start of a transition + ; +SkipOAM = $7E0710 ; Set to skip OAM updates. High byte written $FF with exploding walls +OWScreenSize = $7E0712 ; Flags overworld screen size. + +SpawnedItemID = $7E0720 ; ID of the Item Spawning. Word +SpawnedItemIndex = $7E0722 ; Sprite/Pot Index of Item Spawning. Word +SpawnedItemIsMultiWorld = $7E0724 ; Multiworld World Flag. Word +SpawnedItemFlag = $7E0726 ; 0x02 - one for pot, 2 for sprite drop + ; (flag used as a bitmask in conjunction with StandingItemCounterMask) +SpawnedItemMWPlayer = $7E0728 ; Player Id for spawned item if Multiworld item 0x02 + ; +EnemyDropIndicator = $7E072A ; Used by HUD to indicate enemy drops remaining + +SprDropsItem = $7E0730 ; Array for whether a sprite drops an item 0x16 +SprItemReceipt = $7E0740 ; Array for item id for each sprite 0x16 +SprItemIndex = $7E0750 ; Array for item index (see code) +SprItemMWPlayer = $7E0760 ; Player id for each sprite drop 0x16 +SprItemFlags = $7E0770 ; Array 0x16 (used for both pots and drops) (combine with SprDropsItem?) +SprItemGFX = $7E0780 ; this will keep track of the DynamicDropGFXIndex for each item +SprRedrawFlag = $7E0790 ; this is a flag indicating the gfx for a sprite should be reloaded and redrawn + ; +DynamicDropGFXIndex = $7E07F0 ; this will just count from 0 to 6 to determine which slot we're using + ; we're expecting 5 items max per room, and order is irrelevant + ; we just need to keep track of where they go +OAMBuffer = $7E0800 ; Main OAM buffer sent to OAM. $200 bytes. +OAMBuffer2 = $7E0A00 ; + ; +TransparencyFlag = $7E0ABD ; Flags transparency effects e.g. in Thieves Town Hellway + ; +OWTransitionFlag = $7E0ABF ; Used for certain transitions like smith, witch, etc. + ; +ItemGFXPtr = $7E0AFA ; Pointer for item receipt graphics transfers + ; $0000 - no transfer, do nothing + ; bit 7 reset - offset into ROM table + ; bit 7 set - explicit bank7 address +ItemGFXTarget = $7E0AFC ; target VRAM address + ; +ArcVariable = $7E0B08 ; Arc variable. Word length. +OverlordXLow = $7E0B08 ; $08 bytes. +OverlordXHigh = $7E0B10 ; $08 bytes. +PlayerNameCursor = $7E0B12 ; Player name screen. +OverlordYLow = $7E0B18 ; $08 bytes. +OverlordYHigh = $7E0B20 ; $08 bytes. + ; +EnemyStunTimer = $7E0B58 ; Auto-decrementing timer for stunned enemies. $10 bytes. + ; +BowDryFire = $7E0B9A ; If set, arrows are deleted immediately + ; +SaveFileIndex = $7E0B9D ; + ; +SpriteAncillaInteract = $7E0BA0 ; If nonzero, ancillae do not interact with the sprite. $10 bytes. + ; +AncillaCoordYLow = $7E0BFA ; +AncillaCoordXLow = $7E0C04 ; +AncillaCoordYHigh = $7E0C0E ; +AncillaCoordXHigh = $7E0C18 ; + ; +AncillaVelocityY = $7E0C22 ; $0A bytes. +AncillaVelocityX = $7E0C2C ; $0A bytes. + ; +AncillaID = $7E0C4A ; $0A bytes. + ; +AncillaGeneralN = $7E0C54 ; General use buffer for ancillae. $0A bytes. + ; +AncillaGet = $7E0C5E ; Used by varius ancilla in various ways. $0F bytes. + ; +AncillaLayer = $7E0C7C ; + ; +SpriteForceDrop = $7E0CBA ; Forces drops on sprite death. $10 bytes. + ; +SpriteBump = $7E0CD2 ; See symbols_wram.asm. $10 bytes. + ; +TreePullKills = $7E0CFB ; Kills for tree pulls. +TreePullHits = $7E0CFC ; Hits taken for tree pulls. + ; +SpritePosYLow = $7E0D00 ; Sprite slot data. Each label has $10 bytes unless otherwise +SpritePosXLow = $7E0D10 ; specified. Some of these I'm not sure what they are. May +SpritePosYHigh = $7E0D20 ; have taken a guess or just made something up. +SpritePosXHigh = $7E0D30 ; +SpriteVelocityY = $7E0D40 ; +SpriteVelocityX = $7E0D50 ; +SpriteSubPixelY = $7E0D60 ; +SpriteSubPixelX = $7E0D70 ; +SpriteActivity = $7E0D80 ; Not sure what this is. +SpriteMovement = $7E0D90 ; Not sure what this is. + ; +SpriteAuxTable = $7E0DA0 ; $20 bytes. +SpriteGFXControl = $7E0DC0 ; +SpriteAITable = $7E0DD0 ; AI state of sprites. $10 bytes. +SpriteMoveDirection = $7E0DE0 ; $00 = Right | $01 = Left | $02 = Down | $03 = Up + ; +SpriteTimer = $7E0DF0 ; + ; +SpriteTypeTable = $7E0E20 ; Which sprite occupies this slot. $10 bytes. +SpriteAux = $7E0E30 ; +SpriteOAMProperties = $7E0E40 ; h m w o o o o o | h = Harmless | m = master sword? | w = walls? + ; | o = OAM allocation +SpriteHitPoints = $7E0E50 ; Set from $0DB173 +SpriteControl = $7E0E60 ; n i o s p p p t | n = Death animation? | i = Immune to attack/collion? + ; o = Shadow | p = OAM prop palette | t = OAM prop name table +SpriteItemType = $7E0E80 ; Sprite Item Type. Also used for jump table local. $10 bytes. + ; +SpriteDirectionTable = $7E0EB0 ; Sprite direction. $10 bytes. + ; +SpriteSpawnStep = $7E0ED0 ; Related to enemies spawning other sprites (eg pikit, zirro) + ; +SpriteHalt = $7E0F00 ; +SpriteTimerE = $7E0F10 ; ? + ; +SpriteLayer = $7E0F20 ; + ; +SpriteOAMProp = $7E0F50 ; + ; +SpriteZCoord = $7E0F70 ; +SpriteVelocityZ = $7E0F80 ; +SpriteSubPixelZ = $7E0F90 ; + ; +CurrentSpriteSlot = $7E0FA0 ; Holds the current sprite/ancilla's index + ; +FreezeSprites = $7E0FC1 ; "Seems to freeze sprites" + ; +PrizePackIndexes = $7E0FC7 ; $07 bytes. One for each prize pack. + ; +SpriteCoordCacheX = $7E0FD8 ; +SpriteCoordCacheY = $7E0FDA ; + ; +NoMenu = $7E0FFC ; When set prevents menu, mirror, medallions + ; +GFXStripes = $7E1000 ; Used by stripes for arbitrary VRAM transfers. $100 bytes. +RoomStripes = $7E1100 ; Used for room drawing. + ; +MirrorPortalPosXH = $7E1ACF ; Mirror portal position. (High byte of X coordinate) + ; +IrisPtr = $7E1B00 ; Spotlight pointers for HDMA. $1C0 bytes (?). + ; +MessageSubModule = $7E1CD8 ; + ; +MessageCursor = $7E1CE8 ; Chosen option in message. +DelayTimer = $7E1CE9 ; + ; +TextID = $7E1CF0 ; Message ID and page. Word length. + ; +UpdateHUDFlag = $7E1E03 ; Flag used to mark HUD updates and avoid heavy code segments. + ; +ToastBuffer = $7E1E0E ; Multiworld buffer. Word length. + ; +MSUResumeTime = $7E1E6B ; Mirrored MSU block +MSUResumeControl = $7E1E6F ; +MSUFallbackTable = $7E1E70 ; +MSUDelayedCommand = $7E1E79 ; +MSUPackCount = $7E1E7A ; +MSUPackCurrent = $7E1E7B ; +MSUPackRequest = $7E1E7C ; +MSULoadedTrack = $7E1E7D ; +MSUResumeTrack = $7E1E7F ; + +ClockHours = $7E1E90 ; Clock Hours +ClockMinutes = $7E1E94 ; Clock Minutes +ClockSeconds = $7E1E98 ; Clock Seconds +ClockBuffer = $7E1E9C ; Clock Temporary +ScratchBufferNV = $7E1EA0 ; Non-volatile scratch buffer. Must preserve values through return. +ScratchBufferV = $7E1EB0 ; Volatile scratch buffer. Can clobber at will. + +TileMapA = $7E2000 +TileMapB = $7E4000 +;================================================================================ +; UNMIRRORED WRAM +; Addresses from here on can only be accessed with long addressing +; or absolute addressing with the appropriate data bank set +;-------------------------------------------------------------------------------- + +TileUploadBuffer = $7EA180 ; 0x300 bytes + ; +ItemGetGFX = $7EBD40 ; Item receipt graphics location + ; +RoomFade = $7EC005 ; Flags fade to black on room transitions. Word length. +FadeTimer = $7EC007 ; Timer for transition fading and mosaics. Word length. +FadeDirection = $7EC009 ; Word length +FadeLevel = $7EC00B ; Target fade level. Word length. + ; + ; +MosaicLevel = $7EC011 ; Word length. High byte unused + ; +RoomDarkness = $7EC017 ; Darkness level of a room. High byte unused. Word length. + ; +SpriteOAM = $7EC025 ; +SpriteDynamicOAM = $7EC035 ; + ; +EN_OWSCR2 = $7EC140 ; $7EC140-$7EC171 Used for caching with entrances. +EN_MAINDESQ = $7EC142 ; Copied from the JP disassembly. +EN_SUBDESQ = $7EC143 ; +EN_BG2VERT = $7EC144 ; +EN_BG2HORZ = $7EC146 ; +EN_POSY = $7EC148 ; +EN_POSX = $7EC14A ; +EN_OWSCR = $7EC14C ; +EN_OWTMAPI = $7EC14E ; +EN_SCROLLATN = $7EC150 ; +EN_SCROLLATW = $7EC152 ; +EN_SCROLLAN = $7EC154 ; +EN_SCROLLBN = $7EC156 ; +EN_SCROLLAS = $7EC158 ; +EN_SCROLLBS = $7EC15A ; +EN_OWTARGN = $7EC15C ; +EN_OWTARGS = $7EC15E ; +EN_OWTARGW = $7EC160 ; +EN_OWTARGE = $7EC162 ; +EN_AA0 = $7EC164 ; +EN_BGSET1 = $7EC165 ; +EN_BGSET2 = $7EC166 ; +EN_SPRSET1 = $7EC167 ; + ; 2 bytes free RAM. +EN_SCRMODYA = $7EC16A ; +EN_SCRMODYB = $7EC16C ; +EN_SCRMODXA = $7EC16E ; +EN_SCRMODXB = $7EC170 ; +PegColor = $7EC172 ; + ; +GameOverSongCache = $7EC227 ; + ; +LastBGSet = $7EC2F8 ; Lists loaded sheets to check for decompression. 4 bytes. + ; +PaletteBufferAux = $7EC300 ; Secondary and main palette buffer. See symbols_wram.asm +PaletteBuffer = $7EC500 ; in the disassembly. +HUDTileMapBuffer = $7EC700 ; HUD tile map buffer. $100 bytes (?) +HUDCurrentDungeonWorld = $7EC702 ; +HUDKeyIcon = $7EC726 ; +HUDGoalIndicator = $7EC72A ; +HUDPrizeIcon = $7EC742 ; +HUDRupees = $7EC750 ; +HUDBombCount = $7EC75A ; +HUDArrowCount = $7EC760 ; +HUDKeyDigits = $7EC764 ; +HUDMultiIndicator = $7EC790 ; +HUDKeysObtained = $7EC7A2 ; +HUDKeysSlash = $7EC7A4 ; +HUDKeysTotal = $7EC7A6 ; + ; +BigRAM = $7EC900 ; Big buffer of free ram (0x1F00) +ItemGFXStack = $7ECB00 ; Pointers to source of decompressed item tiles deferred to NMI loading. +ItemGFXSBankStack = $7ECB20 ; Source bank byte for above. (not used yet) +ItemTargetStack = $7ECB40 ; Pointers to VRAM targets for ItemGFXStack. +TotalItemCountTiles = $7ECF00 ; Cached total item count tiles for HUD. Four words high to low. + +;================================================================================ +; Bank 7F +;-------------------------------------------------------------------------------- +DecompressionBuffer = $7F0000 ; Decompression Buffer. $2000 bytes. + +DecompBuffer2 = $7F4000 ; Another buffer + +base $7F5000 +skip 3 ; Unused +HexToDecDigit1: skip 1 ; Space for storing the result of hex to decimal conversion. +HexToDecDigit2: skip 1 ; Digits are stored from high to low. +HexToDecDigit3: skip 1 ; +HexToDecDigit4: skip 1 ; +HexToDecDigit5: skip 1 ; +SpriteSkipEOR: skip 2 ; Used in utilities.asm to determine when to skip drawing sprites. Zero-padded +skip $2B ; Unused +AltTextFlag: skip 2 ; dialog.asm: Determines whether to load from vanilla decompression buffer + ; or from a secondary buffer (used for things like free dungeon item text) +BossKills: skip 1 ; +LagTime: skip 4 ; Computed during stats preparation for display +RupeesCollected: skip 2 ; Computed during stats preparation for display +NonChestCounter: skip 2 ; Computed during stats preparation for display +BowTrackingFlags: skip 2 ; Stores tracking bits for progressive bows before resolution to concrete item. +TileUploadOffsetOverride: skip 2 ; Offset override for loading sprite gfx +skip 3 ; +skip 8 ; + ; Shop Block $7F504F - $7F506F +ShopEnableCount: skip 1 ; Whether Shops Count for Location Checks +ShopId: skip 1 ; Shop ID. Used for indexing and loading inventory for custom shops +ShopType: skip 1 ; Shop type. $FF = vanilla shop + ; t d a v - - q q + ; t = $01 - Take-any | d = $01 - Door check | a = $01 = Take-all + ; v = Use alt vram | q = Number of items +ShopInventory: skip $0D ; For three possible shop items, row major: + ; [Item ID][Price low][Price High][Purchase Count] +ShopState: skip 1 ; - - - - - l c r | Bitfield that determines whether to draw an item +ShopCapacity: skip 1 ; Four lower bits of shop_config in ShopTable, number of items 1-3 +ShopScratch: skip 1 ; Scratch byte used in shop drawing routines +ShopSRAMIndex: skip 1 ; SRAM index for purchase counts +ShopMerchant: skip 1 ; Loaded from ShopTable and used to jump to one of four drawing routines +ShopkeeperRefill: skip 1 ; Flag for the shopkeeper refill action +PowderFlag: skip 1 ; Flag for powder junk +ShopPriceColumn: skip 3 ; Stores coordinates for drawing prices in shops +ShopInventoryPlayer: skip 3 ; Multiworld id for player inventory +ShopInventoryDisguise: skip 3 ; Bee trap is disguised as another item in shop +BeeTrapDisguise: skip 1 ; Unused +skip 2 ; Reserved for OneMind +OneMindId: skip 1 ; Current OneMind player +OneMindTimerRAM: skip 2 ; Frame counter for OneMind +skip 9 ; Unused +ClockStatus: skip 2 ; 2 bytes second always zero padding + ; ---- --dn + ; d - DNF mode + ; n - Negative +skip $10 ; Unused +RNGLockIn: skip 1 ; Used for RNG item (currently unused by rando) +BusyItem: skip 1 ; Flags for indicating when these things are "busy" +BusyHealth: skip 1 ; e.g. doing some animation +BusyMagic: skip 1 ; +DialogOffsetPointer: skip 2 ; Offset and return pointer into new dialog buffer used +DialogReturnPointer: skip 2 ; for e.g. free dungeon item text. +skip 1 ; Unused +PreviousOverworldDoor: skip 1 ; Previous overworld door is cached or initialized here +skip 1 ; Reserved +skip 1 ; Unused +DuckMapFlag: skip 1 ; Temporary flag used and reset by flute map drawing routine +StalfosBombDamage: skip 1 ; Relocated from damage table +ValidKeyLoaded: skip 1 ; +TextBoxDefer: skip 1 ; Flag used to defer post-item text boxes +skip $10 ; Unused +skip $10 ; Reserved for enemizer + ; Most of these modifiers are intended to be written to by + ; a 3rd party (e.g. Crowd Control.) Writer is responsible + ; for zeroing. +SwordModifier: skip 1 ; Adds level to current sword. Doesn't change graphics. +ShieldModifier: skip 1 ; Not implemented +ArmorModifier: skip 1 ; Adds level to current mail. Doesn't change graphics. +MagicModifier: skip 1 ; Adds level to magic consumption (1/2, 1/4.) +LightConeModifier: skip 1 ; Gives lamp cone when set to 1 +CuccoStormer: skip 1 ; Non-zero write causes storm. +OldManDash: skip 1 ; Unused +IceModifier: skip 1 ; - - - g - - - i | Flipping either sets ice physics +InfiniteArrows: skip 1 ; Setting these to $01 will give infinite ammo. Set by +InfiniteBombs: skip 1 ; EscapeAssist. +InfiniteMagic: skip 1 ; +ControllerInverter: skip 1 ; $01 = D-pad | $02 = Buttons | $03 = Buttons and D-Pad + ; >=$04 = Swap buttons and D-pad +OHKOFlag: skip 1 ; Any non-zero write sets OHKO mode +SpriteSwapper: skip 1 ; Loads new link sprite and glove/armor palette. No gfx or + ; code currently in base ROM for this. +BootsModifier: skip 1 ; $01 = Give dash ability +OHKOCached: skip 1 ; "Old" OHKO flag state. Used to detect changes. + ; Crypto Block ($7F50D0 - $7F51FF) +KeyBase: skip $10 ; +y: skip 4 ; +z: skip 4 ; +Sum: skip 4 ; +p: skip 4 ; +e: skip 2 ; +CryptoScratch: skip $0E ; +CryptoBuffer: ; +v: skip $100 ; +RNGPointers: skip $100 ; Pointers for static RNG + ; Network I/O block. See servicerequest.asm. Rx and Tx channels + ; also allocated 8 persistent bytes each in sram.asm. +RxBuffer: skip $7F ; +RxStatus: skip 1 ; +TxBuffer: skip $7F ; +TxStatus: skip 1 ; +skip $10 ; Unused +CompassTotalsWRAM: skip $20 ; \ Compass and map dungeon HUD display totals. Placed in WRAM +MapTotalsWRAM: skip $10 ; / on boot for tracking. +skip $20 ; Reserved for general dungeon tracking data. May have over + ; allocated here. Feel free to reassign. +MapCompassFlag: skip 2 ; Used to flag overworld map drawing. +skip $3E ; Unused +skip $260 ; Unused +DialogBuffer: skip $100 ; Dialog Buffer + ; +PrivateBlockWRAM = $7F7700 ; Reserved for 3rd party use. $500 bytes. + ; See also: $200 bytes at PrivateBlockPersistent, copied to SRAM. +BigDecompressionBuffer = $7F8000 ; Reserved for large gfx decompression buffer. $5000 bytes. + ; KEEP THIS AT $8000+ + ; its location at an address with bit 7 set is used for detecting + ; ROM location versus RAM locations + ; +MiniGameTime = $7FFE00 ; Time spent in mini game. 32-bits. +MiniGameTimeFinal = $7FFE04 ; Final mini game time. 32 bits. ;================================================================================ ; RAM Assertions @@ -15,4 +687,419 @@ macro assertRAM(label, address) assert