; ============================================================================== ; ZScream Custom Overworld ASM ; Written by Jared_Brian_ ; With help and testing from Jeimuzu, Letterbomb, Scawful, and Zarby89 ; ============================================================================== ; The purpose of this ASM is to give users the ability to customize many ; aspects of the ALTTP overworld that were previously hardcoded. ; ; Features include: ; • The ability to add a mosaic on any transition. ; • The ability to change the main palette for each area. ; • The ability to give each area a custom background transparent color. ; • The ability to give each area its own tile GFX set. ; • The ability to give each area its own animated tile set. ; • The ability to add or remove a subscreen overlay on each area. ; (rain, fog, sky, lava, pyramid, etc.) ; • The ability to disable the rain in the beginning phase. ; • Removed hardcoded exits playing music instead of using the area's set ; music. ; • The ability to change the layout of "small" (1x1) and "large" (2x2) areas ; already present in the vanilla game. ; • The ability to have "wide" (2x1) and "tall" (1x2) areas that were not ; present in the vanilla game. ; • The ability to use the other previously unused "secial world" areas ; as if they were a normal area. Including the use of items, entrances, ; exits, whirlpools, bird transports, sign messages, overworld transitions, ; entrance overlays, and subscreen overlays. ; • The ability to have sprites on the DW and SW during phase 0. ; • Fixes several bugs present in the vanilla game that prevent certain normal ; overworld transitions such as "staggered" layouts or transitions in the ; middle of 2 large areas that are next to each other. See the diagrams in ; the OverworldScreenTileMapChange section below for more details. ; ; To achieve this, large portions of the game's vanilla code had to be edited ; or even re-written entirely to instead read from tables in expanded space. ; These tables are written to and generated by ZScream. Tables based on the ; vanilla configuration can be used by changing the debug variable !UseVanillaPool ; down below to a 1, thus removing the need for ZScream although this is not ; reccomended for your average user. ; Some of the new features require a bit more computation time (to decompress ; GFX for example) causing load times to be slightly longer (1-2 frames more at ; most). Because of this, I have made it so certain features can be disabled to ; instead use the original vanilla code if speed is prefered. See the ; EnableTable below for more details. ; ; There are certain things that are still hardcoded here as a result but can ; be changed if you know a bit of ASM, such as: ; • The rain that is originally present in the Misery Mire area. ; • The Lost Woods changing to the tree canopy overlay after obtaining the ; master sword. ; • The fog overlay being disabled after obtaining the master sword in the ; master sword area. ; • The bridge overlay present in the under the bridge area. ; • The BG color present in the under the bridge area. ; • The pyramid overlay only scrolling properly on area $5B. ; • The smaller camera boundaries present in the master sword area and the ; area under the bridge. ; ============================================================================== ; Non-Expanded Space ; ============================================================================== ; TODO: Entrance overlay SRM pushpc incsrc HardwareRegisters.asm ; Free RAM TransGFXModule_PriorSheets = $04CB ; [0x08] May use more in the future here. NewNMISource1 = $04D5 ; [0x02] NewNMITarget1 = $04D3 ; [0x02] NewNMICount1 = $04D7 ; [0x02] NewNMITarget2 = $04D9 ; [0x02] NewNMISource2 = $04DB ; [0x02] NewNMICount2 = $04DD ; [0x02] OWCameraBoundsS = $0716 ; [0x02] OWCameraBoundsE = $0718 ; [0x02] TransGFXModuleFrame = $0CF3 ; [0x01] AnimatedTileGFXSet = $0FC0 ; [0x01] ExpandedSpritePalArray = $7EFDC0 ; [0x40] ; $0716 is not actually free, but labled as such for the sake of organization. ; $0718 is free RAM and took the horizontal responsibility away from $0716. ; ($0716 is labled as OWCameraBoundsSE in the disassembly). ; Hooks Sound_LoadLightWorldSongBank = $008913 ; $000913 EnableForceBlank = $00893D ; $00093D GFXSheetPointers_sprite_bank = $00CFF3 ; $004FF3 GFXSheetPointers_sprite_high = $00D0D2 ; $0050D2 GFXSheetPointers_sprite_low = $00D1B1 ; $0051B1 DecompOwAnimatedTiles = $00D394 ; $005394 GetAnimatedSpriteTile = $00D4DB ; $0054DB GetAnimatedSpriteTile_variable = $00D4ED ; $0054ED LoadTransAuxGFX_sprite_continue = $00D706 ; $005706 SheetsTable_0AA4 = $00D8F4 ; $0058F4 PrepTransAuxGFX = $00DF1A ; $005F1A Do3To4High16Bit = $00DF4F ; $005F4F Do3To4Low16Bit = $00DFB8 ; $005FB8 InitTilesets = $00E19B ; $00619B CopyFontToVram = $00E556 ; $006556 Decomp_bg_variable = $00E78F ; $00678F GFX0AA2ValsOW = $00FC9C ; $007C9C Credits_LoadScene_PrepGFX_sprite_gfx = $0285E2 ; $0105E2 Credits_LoadScene_PrepGFX_sprite_palette = $0285F3 ; $0105F3 DeleteCertainAncillaeStopDashing = $028B0C ; $010B0C OWOverlay_HShift = $02A46D ; $01246D OWOverlay_VShift = $02A471 ; $012471 Overworld_LoadMapProperties = $02AB08 ; $012B08 Overworld_FinishTransGfx_firstHalf_Retrun = $02ABC5 ; $012BC5 Overworld_LoadSubscreenAndSilenceSFX1 = $02AF19 ; $012F19 Overworld_ReloadSubscreenOverlayAndAdvance = $02B1F4 ; $0131F4 Dungeon_LoadPalettes_cacheSettings = $02C65F ; $01465F SpecialOverworld_CopyPalettesToCache = $02C6EB ; $0146EB Overworld_CgramAuxToMain = $02C769 ; $014769 UnderworldExitData_overworld_id = $02DD8A ; $015D8A Pool_LoadSpecialOverworld_GFX_0AA3 = $02E6E1 ; $0166E1 Pool_LoadSpecialOverworld_palette_prop_b = $02E701 ; $016701 Pool_LoadSpecialOverworld_GFX_0AA2 = $02E821 ; $016821 Overworld_ScrollMap = $02F273 ; $017273 LoadSubscreenOverlay = $02FD0D ; $017D0D Link_ItemReset_FromOverworldThings = $07B107 ; $03B107 Player_IsScreenTransitionPermitted = $07F439 ; $03F439 Tagalong_Init = $099EFC ; $049EFC Sprite_ReinitWarpVortex = $09AF89 ; $04AF89 Sprite_ResetAll = $09C44E ; $04C44E Sprite_OverworldReloadAll = $09C499 ; $04C499 OverworldPalettesScreenToSet_New = $09C635 ; $04C635 BirdTravel_LoadAmbientOverlay = $0AB948 ; $053948 Overworld_SetFixedColorAndScroll = $0BFE70 ; $05FE70 Overworld_LoadPalettes = $0ED5A8 ; $0755A8 Palette_SetOwBgColor_Long = $0ED618 ; $075618 Overworld_SetScreenBGColorCacheOnly = $0ED61D ; $07561D LoadGearPalettes_bunny = $0ED6DD ; $0756DD Overworld_CheckForSpecialOverworldTrigger = $0EDE49 ; $075E49 SpecialOverworld_CheckForReturnTrigger = $0EDEE3 ; $075EE3 Overworld_DwDeathMountainPaletteAnimation = $0EF582 ; $077582 Overworld_Entrance = $1BBBF4 ; $0DBBF4 PaletteIDtoOffset_OW_Main = $1BEC3B ; $0DEC3B Palette_SpriteAux3 = $1BEC77 ; $0DEC77 Palette_MainSpr = $1BEC9E ; $0DEC9E Palette_SpriteAux1 = $1BECC5 ; $0DECC5 Palette_SpriteAux2 = $1BECE4 ; $0DECE4 Palette_Sword = $1BED03 ; $0DED03 Palette_Shield = $1BED29 ; $0DED29 Palette_MiscSpr = $1BED6E ; $0DED6E Palette_ArmorAndGloves = $1BEDF9 ; $0DEDF9 Palette_Hud = $1BEE52 ; $0DEE52 Palette_OverworldBgAux3 = $1BEEA8 ; $0DEEA8 Palette_OverworldBgMain = $1BEEC7 ; $0DEEC7 PaletteData_owmain = $1BE6C8 ; $0DE6C8 ; ============================================================================== ; Debug addresses: ; ============================================================================== ; These can be used to turn off each hook used. Some are reliant on eachother ; and disabling only some can break entire features. ; TODO: Create a log of dependencies and change the naming structure of the ; vars themseleves to be more reflective of those features. ; Makes the game decompress the 3 static OW tile sheets on transition. ; $00D585 !Func00D585 = $01 ; Animated tiles on warp. ; $00D8D5 !Func00D8D5 = $01 ; Enable/Disable subscreen. ; $00DA63 !Func00DA63 = $01 ; Changes the InitTilesets function to call from the long tables. ; $00E221 !Func00E221 = $01 ; Zeros out the BG color when mirror warping to the pyramid area. ; $00EEBB !Func00EEBB = $01 ; $007C67 !Func00FC67 = $01 ; BG scrolling for HC and the pyramid area. ; $00FF7C !Func00FF7C = $01 ; Changes the function that loads overworld properties when exiting a dungeon. ; Includes removing asm that plays music in certain areas and changing how ; animated tiles are loaded. ; $0283EE !Func0283EE = $01 ; Changes a function that loads animated tiles under certain conditions. ; $028632 !Func028632 = $01 ; Changes part of a function that changes the sub mask color when leaving ; dungeons. ; $029A37 !Func029A37 = $01 ; Rain animation code. ; $02A4CD !Func02A4CD = $01 ; $02A5D3 !Func02A5D3 = $01 ; $02A62C !Func02A62C = $01 ; $02A9C4 !Func02A9C4 = $01 ; $02AB64 !Func02AB64 = $01 ; Transition animated and main palette. ; $02ABBE !Func02ABBE = $01 ; $02AC40 !Func02AC40 = $01 ; Main subscreen loading function. ; $02AF58 !Func02AF58 = $01 ; turns on subscreen for pyramid. ; $02B2D4 !Func02B2D4 = $01 ; Activate subscreen durring pyramid warp. ; $02B391 !Func02B391 = $01 ; Reset a var needed for whirpool GFX transfer. ; $02B490 !Func02B490 = $01 ; Controls overworld vertical subscreen movement for the pyramid BG. ; $02BC44 !Func02BC44 = $01 ; Changes how the pyramid BG scrolls durring transition. ; $02C02D !Func02C02D = $01 ; $02C0C3 !Func02C0C3 = $01 ; Main palette loading routine. ; $02C692 !Func02C692 = $01 ; $02E598 !Func02E598 = $01 ; $02E931 !Func02E931 = $01 ; $02EF44 !Func02EF44 = $01 ; $03B518 !Func07B518 = $01 ; $04C4C7 !Func09C4C7 = $01 ; Loads different animated tiles when returning from bird travel. ; $0AB8F5 !Func0AB8F5 = $01 ; Loads the animated tiles after the overworld map is closed. ; $0ABC5A !Func0ABC5A = $01 ; Load overlay, fixed color, and BG color. ; $0BFEB6 !Func0BFEB6 = $01 ; Transparent color durring warp and during special area enter. ; $0ED627 !Func0ED627 = $01 ; Resets the area special color after the screen flashes. ; $0ED8AE !Func0ED8AE = $01 ; $1BC8B1 !Func1BC8B1 = $01 ; If 1, all of the default vanilla pool values will be applied. 00 by default. !UseVanillaPool = $00 ; Use this var to disable all of the debug vars above. !AllOff = $00 if !AllOff == 1 !Func00D585 = $00 !Func00D8D5 = $00 !Func00DA63 = $00 !Func00E221 = $00 !Func00EEBB = $00 !Func00FC67 = $00 !Func00FF7C = $00 !Func0283EE = $00 !Func028632 = $00 !Func029A37 = $00 !Func02A4CD = $00 !Func02A5D3 = $00 !Func02A62C = $00 !Func02A9C4 = $00 !Func02AB64 = $00 !Func02ABBE = $00 !Func02AC40 = $00 !Func02AF58 = $00 !Func02B2D4 = $00 !Func02B391 = $00 !Func02B490 = $00 !Func02BC44 = $00 !Func02C02D = $00 !Func02C0C3 = $00 !Func02C692 = $00 !Func02E598 = $00 !Func02E931 = $00 !Func02EF44 = $00 !Func07B518 = $00 !Func09C4C7 = $00 !Func0AB8F5 = $00 !Func0ABC5A = $00 !Func0BFEB6 = $00 !Func0ED627 = $00 !Func0ED8AE = $00 !Func1BC8B1 = $00 endif ; ============================================================================== ; Fixing old hooks: ; ============================================================================== ; TODO: Eventually remove these? I'm not sure. If anyone used an old ZS on their ; ROM these will need to be fixed but also could block people from hooking into ; these spots. We could potentially add these to a "repair ROM" asm feature. ; Main Palette loading routine. org $0ED5E7 ; $0755E7 JSL.l Palette_OverworldBgAux3 ; Repairs an old ZS call. org $02ABB8 ; $012BB8 db $A9, $09, $80, $02 ; ============================================================================== ; Expanded Space ; ============================================================================== ; Reserved ZS space. ; Avoid moving this at all costs. If you do, you will have to change where ZS ; saves this data as well and previous data will be lost or corrupted. org $288000 ; $140000 Pool: { ; Valid values: ; 555 color value $0000 to $7FFF. ; $2669 LW green grass color ; $2A32 DW dead grass color ; $19C6 SW dark green shadow color .BGColorTable ; $140000 if !UseVanillaPool == 1 ; LW dw $2669, $2669, $2669, $0000, $0000, $0000, $0000, $0000 dw $2669, $2669, $2669, $0000, $0000, $0000, $0000, $2669 dw $2669, $2669, $2669, $2669, $2669, $2669, $2669, $2669 dw $2669, $2669, $2669, $2669, $2669, $2669, $2669, $2669 dw $2669, $2669, $2669, $2669, $2669, $2669, $2669, $2669 dw $2669, $2669, $2669, $2669, $2669, $2669, $2669, $2669 dw $2669, $2669, $2669, $2669, $2669, $2669, $2669, $2669 dw $2669, $2669, $2669, $2669, $2669, $2669, $2669, $2669 ; DW dw $2A32, $2A32, $2A32, $0000, $0000, $0000, $0000, $0000 dw $2A32, $2A32, $2A32, $0000, $0000, $0000, $0000, $2A32 dw $2A32, $2A32, $2A32, $2A32, $2A32, $2A32, $2A32, $2A32 dw $2A32, $2A32, $2A32, $0000, $0000, $2A32, $2A32, $2A32 dw $2A32, $2A32, $2A32, $0000, $0000, $2A32, $2A32, $2A32 dw $2A32, $2A32, $2A32, $2A32, $2A32, $2A32, $2A32, $2A32 dw $2A32, $2A32, $2A32, $2A32, $2A32, $2A32, $2A32, $2A32 dw $2A32, $2A32, $2A32, $2A32, $2A32, $2A32, $2A32, $2A32 ; SW dw $19C6, $19C6, $19C6, $0000, $0000, $0000, $0000, $0000 dw $0000, $19C6, $19C6, $0000, $0000, $0000, $0000, $0000 dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 endif assert pc() <= $288140 ; Valid values: ; $00 - Disabled ; Non $00 - Enabled org $288140 ; $140140 .EnableTable ; 0x20 org $288140 ; $140140 .EnableBGColor ; 0x01 if !UseVanillaPool > 0 db $01 endif org $288141 ; $140141 .EnableMainPalette ; 0x01 if !UseVanillaPool > 0 db $01 endif org $288142 ; $140142 .EnableMosaic ; 0x01 Unused for now. db $01 ; When non 0 this will allow animated tiles to be updated between OW ; transitions. Default is $FF. org $288143 ; $140143 .EnableAnimated ; 0x01 if !UseVanillaPool > 0 db $01 endif ; When non 0 this will allow Subscreen Overlays to be updated between OW ; transitions. Default is $FF. org $288144 ; $140144 .EnableSubScreenOverlay ; 0x01 if !UseVanillaPool > 0 db $01 endif ; This is a reserved value that ZS will write to when it has applied the ; ASM. That way the next time ZS loads the ROM it knows to read the custom ; values instead of using the default ones. The current version is 03. org $288145 ; $140145 .ZSAppliedASM ; 0x01 db $03 ; When non 0 this will cause rain to appear on all areas in the beginning ; phase. Default is $FF. org $288146 ; $140146 .EnableBeginningRain ; 0x01 ;if !UseVanillaPool > 0 db $FF ;endif ; TODO: Add a place to change this in ZS. Once that is done add this to the ; vanilla pool checks as well. ; When non 0 this will disable the ambiant sound that plays in the mire ; area after the event is triggered. Default is $FF. org $288147 ; $140147 .EnableRainMireEvent ; 0x01 db $FF ; When non 0 this will make the game reload all gfx in between OW ; transitions. Default is $FF. org $288148 ; $140143 .EnableTransitionGFXGroupLoad ; 0x01 if !UseVanillaPool > 0 db $01 endif ; TODO: Vanilla pool check disabled for now until we put an actual place to ; change it. ; The bridge color is different from the Master Sword area so we are going to ; hard code it here for now. Default is $2669 which is the vanilla LW green. org $288149 ; $140149 .BGColorTable_Bridge ; 0x02 ;if !UseVanillaPool > 0 dw $2669 ;endif ; The rest of these are extra bytes that can be used for anything else ; later on. ;db $00, $00, $00, $00, $00, $00, $00, $00 ;db $00, $00, $00, $00, $00, $00, $00, $00 ;db $00, $00, $00, $00, $00 assert pc() <= $288160 ; Valid values: ; Main overworld palette index $00 to $05. ; $00 is the normal light world palette. ; $01 is the normal dark world palette. ; $02 is the normal light world death mountain palette. ; $03 is the normal dark world death mountain palette. ; $04 is the Triforce room palette. ; $05 is the title screen palette? org $288160 ; $140160 .MainPaletteTable ; 0xA0 if !UseVanillaPool == 1 ; LW db $00, $00, $00, $02, $00, $02, $00, $02 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 ; DW db $01, $01, $01, $03, $01, $03, $01, $03 db $01, $01, $01, $01, $01, $01, $01, $01 db $01, $01, $01, $01, $01, $01, $01, $01 db $01, $01, $01, $01, $01, $01, $01, $01 db $01, $01, $01, $01, $01, $01, $01, $01 db $01, $01, $01, $01, $01, $01, $01, $01 db $01, $01, $01, $01, $01, $01, $01, $01 db $01, $01, $01, $01, $01, $01, $01, $01 ; SW db $00, $00, $00, $00, $00, $00, $00, $00 db $04, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 endif assert pc() <= $288200 ; Valid values: ; .... udlr ; u - Up ; d - Down ; l - Left ; r - Right org $288200 ; $140200 .MosaicTable ; 0xA0 if !UseVanillaPool == 1 ; LW db $05, $00, $02, $00, $00, $00, $00, $00 db $00, $00, $02, $00, $00, $00, $00, $08 db $08, $08, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 ; DW db $05, $00, $02, $00, $00, $00, $00, $00 db $00, $00, $02, $00, $00, $00, $00, $00 db $08, $08, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 ; SW db $04, $04, $00, $00, $00, $00, $00, $00 db $04, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 endif assert pc() <= $2882A0 ; Not the same as OWGFXGroupTable_sheet7. The game uses a combination of $59 ; and $5B to create the sheet in sheet #7. This is done by first transfering ; all the gfx that is needed for the bottom half of the sheet (the door ; frames for example) which is different depending on whether we are in the ; LW or DW. It then loads the actual animated tile frames into a buffer ; where it can transfer over from durring NMI based on whether we are on ; Death Mountain or not (LW or DW). This table is to control the latter. ; Valid values: ; GFX index $00 to $FF. ; In vanilla, $59 are the DW door frames and clouds and $5B are the Lw door ; frames and the regular water tiles. org $2882A0 ; $1402A0 .AnimatedTable ; 0xA0 if !UseVanillaPool == 1 ; LW db $5B, $5B, $5B, $59, $5B, $59, $5B, $59 db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B ; DW db $5B, $5B, $5B, $59, $5B, $59, $5B, $59 db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B ; SW db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B db $5B, $5B, $5B, $5B, $5B, $5B, $5B, $5B endif assert pc() <= $288340 ; Valid values: ; Can be any value $00 to $FF but is stored as 2 bytes instead of one to ; help the code out below. $FF is for no overlay area. Hopefully no crazy ; person decides to expand their overworld to $FF areas. ; $0093 is the triforce room curtain overlay. ; $0094 is the under the bridge overlay. ; $0095 is the sky background overlay. ; $0096 is the pyramid background overlay. ; $0097 is the first fog overlay. ; $009C is the lava background overlay. ; $009D is the second fog overlay. ; $009E is the tree canopy overlay. ; $009F is the rain overlay. org $288340 ; $140340 .OverlayTable ; 0x140 if !UseVanillaPool == 1 ; LW dw $009D, $00FF, $00FF, $0095, $00FF, $0095, $00FF, $0095 dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF ; DW dw $009D, $00FF, $00FF, $009C, $00FF, $009C, $00FF, $009C dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $0096, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $009F, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF ; SP dw $0097, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $0093, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF dw $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF, $00FF endif assert pc() <= $288480 ; Just in case 0xFF is used and there is no sheet to load when warping using ; the bird, unloading the map, or exiting a dungeon, the DefaultGFXGroups ; values are used. 0xFF is used instead of 0x00 as the "don't change the ; sheet" value. That way, we can actually use sheet 00 if we want. org $288480 ; $140480 .OWGFXGroupTable ; 0x500 (0xA0 * 0x08) ; LW org $288480 ; $140480 .OWGFXGroupTable_sheet0 if !UseVanillaPool == 1 db $3A ; 0x00 sheet 0 endif org $288481 ; $140481 .OWGFXGroupTable_sheet1 if !UseVanillaPool == 1 db $3B ; 0x00 sheet 1 endif org $288482 ; $140482 .OWGFXGroupTable_sheet2 if !UseVanillaPool == 1 db $3C ; 0x00 sheet 2 endif org $288483 ; $140483 .OWGFXGroupTable_sheet3 if !UseVanillaPool == 1 db $FF ; 0x00 sheet 3 endif org $288484 ; $140484 .OWGFXGroupTable_sheet4 if !UseVanillaPool == 1 db $57 ; 0x00 sheet 4 endif org $288485 ; $140485 .OWGFXGroupTable_sheet5 if !UseVanillaPool == 1 db $4C ; 0x00 sheet 5 endif org $288486 ; $140486 .OWGFXGroupTable_sheet6 if !UseVanillaPool == 1 db $FF ; 0x00 sheet 6 endif org $288487 ; $140487 .OWGFXGroupTable_sheet7 if !UseVanillaPool == 1 db $5B ; 0x00 sheet 7 db $3A, $3B, $3C, $FF, $57, $4C, $FF, $5B ; 0x01 db $3A, $3B, $3C, $FF, $57, $4C, $FF, $5B ; 0x02 db $3A, $3B, $3C, $FF, $56, $4F, $FF, $5B ; 0x03 db $3A, $3B, $3C, $FF, $56, $4F, $FF, $5B ; 0x04 db $3A, $3B, $3C, $FF, $56, $4F, $FF, $5B ; 0x05 db $3A, $3B, $3C, $FF, $56, $4F, $FF, $5B ; 0x06 db $3A, $3B, $3C, $FF, $56, $4F, $FF, $5B ; 0x07 db $3A, $3B, $3C, $FF, $57, $4C, $FF, $5B ; 0x08 db $3A, $3B, $3C, $FF, $57, $4C, $FF, $5B ; 0x09 db $3A, $3B, $3C, $FF, $57, $4C, $FF, $5B ; 0x0A db $3A, $3B, $3C, $FF, $56, $4F, $FF, $5B ; 0x0B db $3A, $3B, $3C, $FF, $56, $4F, $FF, $5B ; 0x0C db $3A, $3B, $3C, $FF, $56, $4F, $FF, $5B ; 0x0D db $3A, $3B, $3C, $FF, $56, $4F, $FF, $5B ; 0x0E db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x0F db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x10 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x11 db $3A, $3B, $3C, $FF, $FF, $FF, $FF, $5B ; 0x12 db $3A, $3B, $3C, $FF, $50, $4B, $FF, $5B ; 0x13 db $3A, $3B, $3C, $FF, $50, $4B, $FF, $5B ; 0x14 db $3A, $3B, $3C, $FF, $FF, $FF, $FF, $5B ; 0x15 db $3A, $3B, $3C, $FF, $50, $4B, $FF, $5B ; 0x16 db $3A, $3B, $3C, $FF, $50, $4B, $FF, $5B ; 0x17 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x18 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x19 db $3A, $3B, $3C, $FF, $FF, $FF, $FF, $5B ; 0x1A db $3A, $3B, $3C, $FF, $52, $49, $FF, $5B ; 0x1B db $3A, $3B, $3C, $FF, $52, $49, $FF, $5B ; 0x1C db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x1D db $3A, $3B, $3C, $FF, $55, $4A, $FF, $5B ; 0x1E db $3A, $3B, $3C, $FF, $55, $4A, $FF, $5B ; 0x1F db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x20 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x21 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x22 db $3A, $3B, $3C, $FF, $52, $49, $FF, $5B ; 0x23 db $3A, $3B, $3C, $FF, $52, $49, $FF, $5B ; 0x24 db $3A, $3B, $3C, $FF, $FF, $FF, $FF, $5B ; 0x25 db $3A, $3B, $3C, $FF, $55, $4A, $FF, $5B ; 0x26 db $3A, $3B, $3C, $FF, $55, $4A, $FF, $5B ; 0x27 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x28 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x29 db $3A, $3B, $3C, $FF, $57, $4C, $FF, $5B ; 0x2A db $3A, $3B, $3C, $FF, $FF, $FF, $FF, $5B ; 0x2B db $3A, $3B, $3C, $FF, $FF, $FF, $FF, $5B ; 0x2C db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x2D db $3A, $3B, $3C, $FF, $FF, $FF, $FF, $5B ; 0x2E db $3A, $3B, $3C, $FF, $55, $4A, $FF, $5B ; 0x2F db $3A, $3B, $3C, $FF, $55, $54, $FF, $5B ; 0x30 db $3A, $3B, $3C, $FF, $55, $54, $FF, $5B ; 0x31 db $3A, $3B, $3C, $FF, $FF, $FF, $FF, $5B ; 0x32 db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x33 db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x34 db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x35 db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x36 db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x37 db $3A, $3B, $3C, $FF, $55, $54, $FF, $5B ; 0x38 db $3A, $3B, $3C, $FF, $55, $54, $FF, $5B ; 0x39 db $3A, $3B, $3C, $FF, $FF, $FF, $FF, $5B ; 0x3A db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x3B db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x3C db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x3D db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x3E db $3A, $3B, $3C, $FF, $51, $4E, $FF, $5B ; 0x3F ; DW db $42, $43, $44, $FF, $2D, $2E, $FF, $59 ; 0x40 db $42, $43, $44, $FF, $2D, $2E, $FF, $59 ; 0x41 db $42, $43, $44, $FF, $2D, $2E, $FF, $59 ; 0x42 db $42, $43, $44, $FF, $33, $34, $FF, $59 ; 0x43 db $42, $43, $44, $FF, $33, $34, $FF, $59 ; 0x44 db $42, $43, $44, $FF, $33, $34, $FF, $59 ; 0x45 db $42, $43, $44, $FF, $33, $34, $FF, $59 ; 0x46 db $42, $43, $44, $FF, $60, $34, $FF, $59 ; 0x47 db $42, $43, $44, $FF, $2D, $2E, $FF, $59 ; 0x48 db $42, $43, $44, $FF, $2D, $2E, $FF, $59 ; 0x49 db $42, $43, $44, $FF, $2D, $2E, $FF, $59 ; 0x4A db $42, $43, $44, $FF, $33, $34, $FF, $59 ; 0x4B db $42, $43, $44, $FF, $33, $34, $FF, $59 ; 0x4C db $42, $43, $44, $FF, $33, $34, $FF, $59 ; 0x4D db $42, $43, $44, $FF, $33, $34, $FF, $59 ; 0x4E db $42, $43, $44, $FF, $37, $38, $FF, $59 ; 0x4F db $42, $43, $44, $FF, $2F, $30, $FF, $59 ; 0x50 db $42, $43, $44, $FF, $2F, $30, $FF, $59 ; 0x51 db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x52 db $42, $43, $44, $FF, $37, $38, $FF, $59 ; 0x53 db $42, $43, $44, $FF, $37, $38, $FF, $59 ; 0x54 db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x55 db $42, $43, $44, $FF, $37, $38, $FF, $59 ; 0x56 db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x57 db $42, $43, $44, $FF, $2F, $30, $FF, $59 ; 0x58 db $42, $43, $44, $FF, $2F, $30, $FF, $59 ; 0x59 db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x5A db $42, $43, $44, $FF, $35, $36, $FF, $59 ; 0x5B db $42, $43, $44, $FF, $35, $36, $FF, $59 ; 0x5C db $42, $43, $44, $FF, $37, $38, $FF, $59 ; 0x5D db $42, $43, $44, $FF, $2B, $2C, $FF, $59 ; 0x5E db $42, $43, $44, $FF, $2B, $2C, $FF, $59 ; 0x5F db $42, $43, $44, $FF, $2F, $30, $FF, $59 ; 0x60 db $42, $43, $44, $FF, $2F, $30, $FF, $59 ; 0x61 db $42, $43, $44, $FF, $2F, $30, $FF, $59 ; 0x62 db $42, $43, $44, $FF, $35, $36, $FF, $59 ; 0x63 db $42, $43, $44, $FF, $35, $36, $FF, $59 ; 0x64 db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x65 db $42, $43, $44, $FF, $2B, $2C, $FF, $59 ; 0x66 db $42, $43, $44, $FF, $2B, $2C, $FF, $59 ; 0x67 db $42, $43, $44, $FF, $2F, $30, $FF, $59 ; 0x68 db $42, $43, $44, $FF, $2F, $30, $FF, $59 ; 0x69 db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x6A db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x6B db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x6C db $42, $43, $44, $FF, $20, $2B, $FF, $59 ; 0x6D db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x6E db $42, $43, $44, $FF, $2B, $2C, $FF, $59 ; 0x6F db $42, $43, $44, $FF, $31, $32, $FF, $59 ; 0x70 db $42, $43, $44, $FF, $31, $32, $FF, $59 ; 0x71 db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x72 db $42, $43, $44, $FF, $37, $38, $FF, $59 ; 0x73 db $42, $43, $44, $FF, $37, $38, $FF, $59 ; 0x74 db $42, $43, $44, $FF, $31, $32, $FF, $59 ; 0x75 db $42, $43, $44, $FF, $31, $32, $FF, $59 ; 0x76 db $42, $43, $44, $FF, $37, $38, $FF, $59 ; 0x77 db $42, $43, $44, $FF, $31, $32, $FF, $59 ; 0x78 db $42, $43, $44, $FF, $31, $32, $FF, $59 ; 0x79 db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x7A db $42, $43, $44, $FF, $37, $38, $FF, $59 ; 0x7B db $42, $43, $44, $FF, $37, $38, $FF, $59 ; 0x7C db $42, $43, $44, $FF, $31, $32, $FF, $59 ; 0x7D db $42, $43, $44, $FF, $31, $32, $FF, $59 ; 0x7E db $42, $43, $44, $FF, $FF, $FF, $FF, $59 ; 0x7F ; SW db $3A, $3B, $3C, $FF, $47, $48, $FF, $5B ; 0x80 db $3A, $3B, $3C, $FF, $47, $48, $FF, $5B ; 0x81 db $3A, $3B, $3C, $FF, $47, $48, $FF, $5B ; 0x82 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x83 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x84 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x85 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x86 db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x87 db $3A, $3B, $3C, $17, $40, $41, $39, $5B ; 0x88 db $3A, $3B, $3C, $FF, $47, $48, $FF, $5B ; 0x89 db $3A, $3B, $3C, $FF, $47, $48, $FF, $5B ; 0x8A db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x8B db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x8C db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x8D db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x8E db $3A, $3B, $3C, $FF, $53, $4D, $FF, $5B ; 0x8F db $3A, $3B, $3C, $08, $00, $22, $1B, $5B ; 0x90 db $3A, $3B, $3C, $08, $FF, $22, $1B, $5B ; 0x91 db $3A, $3B, $3C, $06, $FF, $1F, $18, $5B ; 0x92 db $3A, $3B, $3C, $08, $FF, $22, $1B, $5B ; 0x93 db $3A, $3B, $3C, $3D, $53, $47, $48, $5B ; 0x94 db $3A, $3B, $3C, $3D, $53, $56, $4F, $5B ; 0x95 db $3A, $3B, $3C, $3D, $35, $36, $3E, $5B ; 0x96 db $3A, $3B, $3C, $3D, $57, $4C, $3E, $5B ; 0x97 db $3A, $3B, $3C, $08, $FF, $22, $1B, $5B ; 0x98 db $3A, $3B, $3C, $08, $FF, $22, $1B, $5B ; 0x99 db $3A, $3B, $3C, $06, $FF, $1F, $18, $5B ; 0x9A db $3A, $3B, $3C, $06, $FF, $1F, $18, $5B ; 0x9B db $3A, $3B, $3C, $3D, $53, $33, $34, $5B ; 0x9C db $3A, $3B, $3C, $3D, $53, $57, $4C, $5B ; 0x9D db $3A, $3B, $3C, $3D, $57, $4C, $3E, $5B ; 0x9E db $3A, $3B, $3C, $3D, $53, $4D, $3E, $5B ; 0x9F endif assert pc() <= $288980 ; TODO: Add a way to edit these within ZS? Unsure. org $288980 ; $140980 .DefaultGFXGroups ; LW org $288980 ; $140980 .DefaultGFXGroups_sheet0 db $3A ; Sheet 0 org $288981 ; $140981 .DefaultGFXGroups_sheet1 db $3B ; Sheet 1 org $288982 ; $140982 .DefaultGFXGroups_sheet2 db $3C ; Sheet 2 org $288983 ; $140983 .DefaultGFXGroups_sheet3 db $3D ; Sheet 3 org $288984 ; $140984 .DefaultGFXGroups_sheet4 db $53 ; Sheet 4 org $288985 ; $140985 .DefaultGFXGroups_sheet5 db $4D ; Sheet 5 org $288986 ; $140986 .DefaultGFXGroups_sheet6 db $3E ; Sheet 6 org $288987 ; $140987 .DefaultGFXGroups_sheet7 db $5B ; Sheet 7 ; DW db $42, $43, $44, $45, $2F, $30, $3F, $59 ; SW db $3A, $3B, $3C, $3D, $47, $48, $3E, $5B ; This tells the game what each area's "parent" area is. ; For small areas this is it's own area number. ; For large areas this is the top left area in the 2x2 grid. ; For wide areas this is the left area in the 2x1 grid. ; For tall areas this is the top area in the 1x2 grid. ; In vanilla, this table was shared for all 3 worlds. org $288998 ; $140998 .Overworld_ActualScreenID_New if !UseVanillaPool > 0 ; LW db $00, $00, $02, $03, $03, $05, $05, $07 db $00, $00, $0A, $03, $03, $05, $05, $0F db $10, $11, $12, $13, $14, $15, $16, $17 db $18, $18, $1A, $1B, $1B, $1D, $1E, $1E db $18, $18, $22, $1B, $1B, $25, $1E, $1E db $28, $29, $2A, $2B, $2C, $2D, $2E, $2F db $30, $30, $32, $33, $34, $35, $35, $37 db $30, $30, $3A, $3B, $3C, $35, $35, $3F ; DW db $40, $40, $42, $43, $43, $45, $45, $47 db $40, $40, $4A, $43, $43, $45, $45, $4F db $50, $51, $52, $53, $54, $55, $56, $57 db $58, $58, $5A, $5B, $5B, $5D, $5E, $5E db $58, $58, $62, $5B, $5B, $65, $5E, $5E db $68, $69, $6A, $6B, $6C, $6D, $6E, $6F db $70, $70, $72, $73, $74, $75, $75, $77 db $70, $70, $7A, $7B, $7C, $75, $75, $7F ; SW db $80, $81, $81, $83, $84, $85, $86, $87 db $88, $81, $81, $8B, $8C, $8D, $8E, $8F db $90, $91, $92, $93, $94, $95, $96, $97 db $98, $99, $9A, $9B, $9C, $9D, $9E, $9F endif ; Examples: ; These work in vanilla: │ These do not: ; ───────────────────────┼─────────────── ; ┌──┬──┐ ┌──┬──┐ │ ┌──┬──┐ ┌──┬──┐ ; │ │ │<->│ │ │ │ │ │ │ │ │ │ ; ├──┼──┤ ├──┼──┤ │ ├──┼──┤<->├──┼──┤ ; │ │ │<->│ │ │ │ │ │ │ │ │ │ ; └──┴──┘ └──┴──┘ │ └──┴──┘ └──┴──┘ ; ┌──┬──┐ │ ┌──┬──┐ ; │ │ │ │ │ │ │ ; ├──┼──┤ │ ├──┼──┤ ; │ │ │ │ │ │ │ ; └──┴──┘ │ └──┴──┘ ; ↕ ↕ │ ↕ ; ┌──┬──┐ │ ┌──┬──┐ ; │ │ │ │ │ │ │ ; ├──┼──┤ │ ├──┼──┤ ; │ │ │ │ │ │ │ ; └──┴──┘ │ └──┴──┘ ; See the layout of Zelda: Interconnected Strongholds. ; ; None of these work in vanilla: ; ┌──┬──┐ ┌──┬──┐ ; │ │ │ │ │ │ ; ├──┼──┤ ┌──┬──┐ ┌──┬──┐ ├──┼──┤ ; │ │ │<->│ │ │ │ │ │<->│ │ │ ; └──┴──┘ ├──┼──┤ ├──┼──┤ └──┴──┘ ; │ │ │ │ │ │ ; └──┴──┘ └──┴──┘ ; ┌──┬──┐ ┌──┬──┐ ; │ │ │ │ │ │ ; ├──┼──┤ ├──┼──┤ ; │ │ │ │ │ │ ; └──┴──┘ └──┴──┘ ; ↕ ↕ ; ┌──┬──┐ ┌──┬──┐ ; │ │ │ │ │ │ ; ├──┼──┤ ├──┼──┤ ; │ │ │ │ │ │ ; └──┴──┘ └──┴──┘ ; As of 05/13/25 there aren't any released hacks that use this kind of layout. ; These values or for the area you are going to, not the one coming from. org $288A38 ; $140A38 .ByScreen1_New ; Transitioning right if !UseVanillaPool > 0 ; LW dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $0060, $F060, $1060, $1060, $0060, $1060, $F060 dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $0060, $F060, $1060, $1060, $F060, $1060, $1060 dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $0060, $F060, $0060, $0060, $1060, $1060, $F060 ; DW dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $0060, $F060, $1060, $1060, $0060, $1060, $F060 dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $0060, $F060, $1060, $1060, $F060, $1060, $1060 dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $0060, $F060, $0060, $0060, $1060, $1060, $F060 ; SW dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $1060, $1060, $F060, $0060, $0060, $0060, $0060 dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 dw $0060, $0060, $0060, $0060, $0060, $0060, $0060, $0060 endif org $288B78 ; $140B78 .ByScreen2_New ; Transitioning left if !UseVanillaPool > 0 ; LW dw $0080, $0080, $0040, $0080, $0080, $0080, $0080, $0040 dw $1080, $1080, $F040, $1080, $0080, $1080, $1080, $0040 dw $0040, $0040, $0040, $0040, $0040, $0040, $0040, $0040 dw $0080, $0080, $0040, $0080, $0080, $0040, $0080, $F080 dw $1080, $1080, $F040, $1080, $1080, $F040, $1080, $1080 dw $0040, $0040, $0040, $0040, $0040, $0040, $0040, $0040 dw $0080, $0080, $0040, $0040, $0040, $0080, $0080, $0040 dw $1080, $1080, $0040, $0040, $F040, $1080, $1080, $0040 ; DW dw $0080, $0080, $0040, $0080, $0080, $0080, $0080, $0040 dw $1080, $1080, $F040, $1080, $0080, $1080, $1080, $0040 dw $0040, $0040, $0040, $0040, $0040, $0040, $0040, $0040 dw $0080, $0080, $0040, $0080, $0080, $0040, $0080, $F080 dw $1080, $1080, $F040, $1080, $1080, $F040, $1080, $1080 dw $0040, $0040, $0040, $0040, $0040, $0040, $0040, $0040 dw $0080, $0080, $0040, $0040, $0040, $0080, $0080, $0040 dw $1080, $1080, $0040, $0040, $F040, $1080, $1080, $0040 ; SW dw $0040, $0080, $0080, $0040, $0040, $0040, $0040, $0040 dw $F040, $1080, $1080, $0040, $0040, $0040, $0040, $0040 dw $0040, $0040, $0040, $0040, $0040, $0040, $0040, $0040 dw $0040, $0040, $0040, $0040, $0040, $0040, $0040, $0040 endif org $288CB8 ; $140CB8 .ByScreen3_New ; Transitioning down if !UseVanillaPool > 0 ; LW dw $1800, $1840, $1800, $1800, $1840, $1800, $1840, $1800 dw $1800, $1840, $1800, $1800, $1840, $1800, $1840, $1800 dw $1800, $17C0, $1800, $1800, $17C0, $1800, $17C0, $1800 dw $1800, $1840, $1800, $1800, $1840, $1800, $1800, $1840 dw $1800, $1840, $1800, $1800, $1840, $1800, $1800, $1840 dw $1800, $17C0, $1800, $1800, $17C0, $1800, $1800, $17C0 dw $1800, $1840, $1800, $1800, $1800, $1800, $1840, $1800 dw $1800, $1840, $1800, $1800, $1800, $1800, $1840, $1800 ; DW dw $1800, $1840, $1800, $1800, $1840, $1800, $1840, $1800 dw $1800, $1840, $1800, $1800, $1840, $1800, $1840, $1800 dw $1800, $17C0, $1800, $1800, $17C0, $1800, $17C0, $1800 dw $1800, $1840, $1800, $1800, $1840, $1800, $1800, $1840 dw $1800, $1840, $1800, $1800, $1840, $1800, $1800, $1840 dw $1800, $17C0, $1800, $1800, $17C0, $1800, $1800, $17C0 dw $1800, $1840, $1800, $1800, $1800, $1800, $1840, $1800 dw $1800, $1840, $1800, $1800, $1800, $1800, $1840, $1800 ; SW dw $1800, $1800, $1840, $1800, $1800, $1800, $1800, $1800 dw $1800, $1800, $1840, $1800, $1800, $1800, $1800, $1800 dw $1800, $1800, $17C0, $1800, $1800, $1800, $1800, $1800 dw $1800, $1800, $1800, $1800, $1800, $1800, $1800, $1800 endif org $288DF8 ; $140DF8 .ByScreen4_New ; Transitioning up if !UseVanillaPool > 0 ; LW dw $2000, $2040, $1000, $2000, $2040, $2000, $2040, $1000 dw $2000, $2040, $1000, $2000, $2040, $2000, $2040, $1000 dw $1000, $0FC0, $1000, $1000, $0FC0, $1000, $1000, $0FC0 dw $2000, $2040, $1000, $2000, $2040, $1000, $2000, $2040 dw $2000, $2040, $1000, $2000, $2040, $1000, $2000, $2040 dw $1000, $0FC0, $1000, $1000, $1000, $1000, $0FC0, $1000 dw $2000, $2040, $1000, $1000, $1000, $2000, $2040, $1000 dw $2000, $2040, $1000, $1000, $1000, $2000, $2040, $1000 ; DW dw $2000, $2040, $1000, $2000, $2040, $2000, $2040, $1000 dw $2000, $2040, $1000, $2000, $2040, $2000, $2040, $1000 dw $1000, $0FC0, $1000, $1000, $0FC0, $1000, $1000, $0FC0 dw $2000, $2040, $1000, $2000, $2040, $1000, $2000, $2040 dw $2000, $2040, $1000, $2000, $2040, $1000, $2000, $2040 dw $1000, $0FC0, $1000, $1000, $1000, $1000, $0FC0, $1000 dw $2000, $2040, $1000, $1000, $1000, $2000, $2040, $1000 dw $2000, $2040, $1000, $1000, $1000, $2000, $2040, $1000 ; SW dw $1000, $2000, $2040, $1000, $1000, $1000, $1000, $1000 dw $1000, $2000, $2040, $1000, $1000, $1000, $1000, $1000 dw $1000, $1000, $1000, $1000, $1000, $1000, $1000, $1000 dw $1000, $1000, $1000, $1000, $1000, $1000, $1000, $1000 endif ; UNUSED: ; The table OverworldTransitionPositionY found at $0128C4 was moved ; here and the original 0x80 bytes are currently unused. org $288F38 ; $140F38 .OverworldTransitionPositionY_New if !UseVanillaPool > 0 ; LW dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 dw $0000, $0000, $0200, $0000, $0000, $0000, $0000, $0200 dw $0400, $0400, $0400, $0400, $0400, $0400, $0400, $0400 dw $0600, $0600, $0600, $0600, $0600, $0600, $0600, $0600 dw $0600, $0600, $0800, $0600, $0600, $0800, $0600, $0600 dw $0A00, $0A00, $0A00, $0A00, $0A00, $0A00, $0A00, $0A00 dw $0C00, $0C00, $0C00, $0C00, $0C00, $0C00, $0C00, $0C00 dw $0C00, $0C00, $0E00, $0E00, $0E00, $0C00, $0C00, $0E00 ; DW dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 dw $0000, $0000, $0200, $0000, $0000, $0000, $0000, $0200 dw $0400, $0400, $0400, $0400, $0400, $0400, $0400, $0400 dw $0600, $0600, $0600, $0600, $0600, $0600, $0600, $0600 dw $0600, $0600, $0800, $0600, $0600, $0800, $0600, $0600 dw $0A00, $0A00, $0A00, $0A00, $0A00, $0A00, $0A00, $0A00 dw $0C00, $0C00, $0C00, $0C00, $0C00, $0C00, $0C00, $0C00 dw $0C00, $0C00, $0E00, $0E00, $0E00, $0C00, $0C00, $0E00 ; SW dw $0000, $0000, $0000, $0000, $0000, $0000, $0000, $0000 dw $0200, $0000, $0000, $0200, $0200, $0200, $0200, $0200 dw $0400, $0400, $0400, $0400, $0400, $0400, $0400, $0400 dw $0600, $0600, $0600, $0600, $0600, $0600, $0600, $0600 endif ; UNUSED: ; The table OverworldTransitionPositionX found at 012944 was moved ; here and the original 0x80 bytes are currently unused. org $289078 ; $141078 .OverworldTransitionPositionX_New if !UseVanillaPool > 0 ; LW dw $0000, $0000, $0400, $0600, $0600, $0A00, $0A00, $0E00 dw $0000, $0000, $0400, $0600, $0600, $0A00, $0A00, $0E00 dw $0000, $0200, $0400, $0600, $0800, $0A00, $0C00, $0E00 dw $0000, $0000, $0400, $0600, $0600, $0A00, $0C00, $0C00 dw $0000, $0000, $0400, $0600, $0600, $0A00, $0C00, $0C00 dw $0000, $0200, $0400, $0600, $0800, $0A00, $0C00, $0E00 dw $0000, $0000, $0400, $0600, $0800, $0A00, $0A00, $0E00 dw $0000, $0000, $0400, $0600, $0800, $0A00, $0A00, $0E00 ; DW dw $0000, $0000, $0400, $0600, $0600, $0A00, $0A00, $0E00 dw $0000, $0000, $0400, $0600, $0600, $0A00, $0A00, $0E00 dw $0000, $0200, $0400, $0600, $0800, $0A00, $0C00, $0E00 dw $0000, $0000, $0400, $0600, $0600, $0A00, $0C00, $0C00 dw $0000, $0000, $0400, $0600, $0600, $0A00, $0C00, $0C00 dw $0000, $0200, $0400, $0600, $0800, $0A00, $0C00, $0E00 dw $0000, $0000, $0400, $0600, $0800, $0A00, $0A00, $0E00 dw $0000, $0000, $0400, $0600, $0800, $0A00, $0A00, $0E00 ; SW dw $0000, $0200, $0200, $0600, $0800, $0A00, $0C00, $0E00 dw $0000, $0200, $0200, $0600, $0800, $0A00, $0C00, $0E00 dw $0000, $0200, $0400, $0600, $0800, $0A00, $0C00, $0E00 dw $0000, $0200, $0400, $0600, $0800, $0A00, $0C00, $0E00 endif ; The original trans_target_north table was moved here from $013EE2. ; The original 0x0080 bytes space is currently unused. org $2891B8 ; $1411B8 .trans_target_north_new if !UseVanillaPool > 0 ; LW dw $FF20, $FF20, $FF20, $FF20, $FF20, $FF20, $FF20, $FF20 dw $FF20, $FF20, $0120, $FF20, $FF20, $FF20, $FF20, $0120 dw $0320, $0320, $0320, $0320, $0320, $0320, $0320, $0320 dw $0520, $0520, $0520, $0520, $0520, $0520, $0520, $0520 dw $0520, $0520, $0720, $0520, $0520, $0720, $0520, $0520 dw $0920, $0920, $0920, $0920, $0920, $0920, $0920, $0920 dw $0B20, $0B20, $0B20, $0B20, $0B20, $0B20, $0B20, $0B20 dw $0B20, $0B20, $0D20, $0D20, $0D20, $0B20, $0B20, $0D20 ; DW dw $FF20, $FF20, $FF20, $FF20, $FF20, $FF20, $FF20, $FF20 dw $FF20, $FF20, $0120, $FF20, $FF20, $FF20, $FF20, $0120 dw $0320, $0320, $0320, $0320, $0320, $0320, $0320, $0320 dw $0520, $0520, $0520, $0520, $0520, $0520, $0520, $0520 dw $0520, $0520, $0720, $0520, $0520, $0720, $0520, $0520 dw $0920, $0920, $0920, $0920, $0920, $0920, $0920, $0920 dw $0B20, $0B20, $0B20, $0B20, $0B20, $0B20, $0B20, $0B20 dw $0B20, $0B20, $0D20, $0D20, $0D20, $0B20, $0B20, $0D20 ; SW dw $FF20, $FF20, $FF20, $FF20, $FF20, $FF20, $FF20, $FF20 dw $0120, $FF20, $FF20, $0120, $0120, $0120, $0120, $0120 dw $0320, $0320, $0320, $0320, $0320, $0320, $0320, $0320 dw $0520, $0520, $0520, $0520, $0520, $0520, $0520, $0520 endif ; The original trans_target_west table was moved here from $013F62. ; The original 0x0080 bytes space is currently unused. org $2892F8 ; $1412F8 .trans_target_west_new if !UseVanillaPool > 0 ; LW dw $FF00, $FF00, $0300, $0500, $0500, $0900, $0900, $0D00 dw $FF00, $FF00, $0300, $0500, $0500, $0900, $0900, $0D00 dw $FF00, $0100, $0300, $0500, $0700, $0900, $0B00, $0D00 dw $FF00, $FF00, $0300, $0500, $0500, $0900, $0B00, $0B00 dw $FF00, $FF00, $0300, $0500, $0500, $0900, $0B00, $0B00 dw $FF00, $0100, $0300, $0500, $0700, $0900, $0B00, $0D00 dw $FF00, $FF00, $0300, $0500, $0700, $0900, $0900, $0D00 dw $FF00, $FF00, $0300, $0500, $0700, $0900, $0900, $0D00 ; DW dw $FF00, $FF00, $0300, $0500, $0500, $0900, $0900, $0D00 dw $FF00, $FF00, $0300, $0500, $0500, $0900, $0900, $0D00 dw $FF00, $0100, $0300, $0500, $0700, $0900, $0B00, $0D00 dw $FF00, $FF00, $0300, $0500, $0500, $0900, $0B00, $0B00 dw $FF00, $FF00, $0300, $0500, $0500, $0900, $0B00, $0B00 dw $FF00, $0100, $0300, $0500, $0700, $0900, $0B00, $0D00 dw $FF00, $FF00, $0300, $0500, $0700, $0900, $0900, $0D00 dw $FF00, $FF00, $0300, $0500, $0700, $0900, $0900, $0D00 ; SW dw $FF00, $0100, $0100, $0500, $0700, $0900, $0B00, $0D00 dw $FF00, $0100, $0100, $0500, $0700, $0900, $0B00, $0D00 dw $FF00, $0100, $0300, $0500, $0700, $0900, $0B00, $0D00 dw $FF00, $0100, $0300, $0500, $0700, $0900, $0B00, $0D00 endif ; The original Overworld_SpritePointers_state_0 table was moved here from ; $04C881. The original 0x0080 bytes space is currently unused. org $289438 ; $141438 .Overworld_SpritePointers_state_0_New if !UseVanillaPool > 0 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB42, $CB41, $CB5B, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB5F, $CB66, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB73, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 endif ; The original Overworld_SpritePointers_state_1 table was moved here from ; $04C901. The original 0x0120 bytes space is currently unused. org $289578 ; $141578 .Overworld_SpritePointers_state_1_New if !UseVanillaPool > 0 dw $CF4C, $CB41, $CF7A, $CF84, $CB41, $CFA6, $CB41, $CFCE dw $CB41, $CB41, $CFDE, $CB41, $CB41, $CB41, $CB41, $CFFD dw $D013, $D020, $D02D, $D03A, $D041, $D051, $D05E, $D068 dw $D078, $CB41, $D0A0, $D0B3, $CB41, $D0DB, $D0EB, $CB41 dw $CB41, $CB41, $D125, $CB41, $CB41, $D12F, $CB41, $CB41 dw $D148, $CB41, $D152, $D168, $D175, $D17C, $D186, $D193 dw $D19D, $CB41, $D1E3, $D1F0, $D1FD, $D213, $CB41, $D259 dw $CB41, $CB41, $D26C, $D279, $D292, $CB41, $CB41, $D2A8 dw $CB7A, $CBB7, $CBB7, $CBC4, $CBCB, $CBCB, $CB41, $CBD5 dw $CB41, $CB41, $CBD9, $CB41, $CB41, $CB41, $CB41, $CBF5 dw $CC02, $CC12, $CC25, $CC35, $CC45, $CC5E, $CC74, $CC84 dw $CC9A, $CB41, $CCCE, $CCE1, $CB41, $CD03, $CD19, $CB41 dw $CB41, $CB41, $CD59, $CB41, $CB41, $CD6C, $CB41, $CB41 dw $CD7F, $CD83, $CD87, $CD8B, $CD9B, $CDAB, $CDBE, $CDD1 dw $CDE1, $CE06, $CE06, $CE16, $CE26, $CE3C, $CE7F, $CE7F dw $CB41, $CB41, $CE92, $CE9F, $CEB2, $CB41, $CB41, $CEC5 dw $CEDB, $CEF4, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 endif ; The original Overworld_SpritePointers_state_2 table was moved here from ; $04CA21. The original 0x0120 bytes space is currently unused. org $2896B8 ; $1416B8 .Overworld_SpritePointers_state_2_New if !UseVanillaPool > 0 dw $D2B8, $CB41, $D2E3, $D2E7, $CB41, $D315, $CB41, $D343 dw $CB41, $CB41, $D353, $CB41, $CB41, $CB41, $CB41, $D369 dw $D37F, $D38F, $D39C, $D3A9, $D3B6, $D3C9, $D3D9, $D3E3 dw $D3F3, $CB41, $D418, $D428, $CB41, $D447, $D454, $CB41 dw $CB41, $CB41, $D491, $CB41, $CB41, $D49B, $CB41, $CB41 dw $D4A8, $D4B8, $D4C2, $D4DE, $D4EE, $D4F5, $D502, $D515 dw $D51F, $CB41, $D55C, $D56F, $D57F, $D58F, $D5D5, $D5D5 dw $D5E5, $D5E5, $D5E5, $D5FE, $D611, $D621, $D621, $D621 dw $CB7A, $CBB7, $CBB7, $CBC4, $CBCB, $CBCB, $CB41, $CBD5 dw $CB41, $CB41, $CBD9, $CB41, $CB41, $CB41, $CB41, $CBF5 dw $CC02, $CC12, $CC25, $CC35, $CC45, $CC5E, $CC74, $CC84 dw $CC9A, $CB41, $CCCE, $CCE1, $CB41, $CD03, $CD19, $CB41 dw $CB41, $CB41, $CD59, $CB41, $CB41, $CD6C, $CB41, $CB41 dw $CD7F, $CD83, $CD87, $CD8B, $CD9B, $CDAB, $CDBE, $CDD1 dw $CDE1, $CE06, $CE06, $CE16, $CE26, $CE3C, $CE7F, $CE7F dw $CB41, $CB41, $CE92, $CE9F, $CEB2, $CB41, $CB41, $CEC5 dw $CEDB, $CEF4, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 dw $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41, $CB41 endif ; The original Overworld_SignText table was moved here from ; $03F51D. The original 0x0120 bytes space is currently unused. org $2897F8 ; $1417F8 .Overworld_SignText_New: if !UseVanillaPool > 0 dw $00A7, $00A7, $0048, $0040, $0040, $00A7, $00A7, $00A7 dw $00A7, $00A7, $003C, $0040, $0040, $00A7, $00A7, $003E dw $003D, $0049, $0042, $0042, $00A7, $00A7, $003F, $00B0 dw $003B, $003B, $00A7, $003B, $003B, $0044, $00A7, $00A7 dw $003B, $003B, $00A7, $003B, $003B, $0045, $00A7, $00A7 dw $00A7, $00A7, $00A7, $00A7, $00A7, $0041, $00A7, $00A7 dw $00A7, $00A7, $00A7, $0042, $00A7, $0046, $0046, $00A7 dw $00A7, $00A7, $0047, $0043, $00A7, $0046, $0046, $00A7 dw $00A7, $00A7, $00A7, $00A7, $00A7, $00A7, $00A7, $00A7 dw $00A7, $00A7, $00A8, $00A7, $00A7, $00A7, $00A7, $00A9 dw $00A7, $00AA, $00AB, $00A7, $00A7, $00A7, $00A7, $00B1 dw $00AF, $00AF, $00A7, $00A7, $00A7, $00A7, $00A7, $00A7 dw $00AF, $00AF, $00A7, $00A7, $00A7, $00AC, $00A7, $00A7 dw $00A7, $00A7, $00A7, $00A7, $00A7, $00AD, $00A7, $00A7 dw $00A7, $00A7, $00A7, $00A7, $00A7, $00A7, $00A7, $00A7 dw $00A7, $00A7, $00A7, $00AE, $00A7, $00A7, $00A7, $00A7 dw $00AF, $00AF, $00A7, $00A7, $00A7, $00AC, $00A7, $00A7 dw $00A7, $00A7, $00A7, $00A7, $00A7, $00AD, $00A7, $00A7 dw $00A7, $00A7, $00A7, $00A7, $00A7, $00A7, $00A7, $00A7 dw $00A7, $00A7, $00A7, $00AE, $00A7, $00A7, $00A7, $00A7 endif } assert pc() <= $289938 ; $141938 ; ============================================================================== ; Start of function space. ; ============================================================================== org $289940 ; $141940 pushpc ; ============================================================================== if !Func00D8D5 == 1 ; Replaces a function that decompresses animated tiles in certain mirror warp ; conditions. org $00D8D5 ; $0058D5 AnimateMirrorWarp_DecompressAnimatedTiles: { PHX ; The decompression function increases it by 1 so subtract 1 here. JSL.l ReadAnimatedTable : DEC : TAY PLX JSL.l DecompOwAnimatedTiles RTL } assert pc() <= $00D8EE else org $00D8D5 ; $0058D5 db $A0, $58, $A5, $8A, $29, $BF, $C9, $03 db $F0, $0A, $C9, $05, $F0, $06, $C9, $07 db $F0, $02, $A0, $5A, $22, $94, $D3, $00 db $6B endif pullpc ReadAnimatedTable: { PHB : PHK : PLB REP #$30 ; Set A, X, and Y in 16bit mode. LDA.b $8A : TAX AND.w #$00C0 : LSR #3 : TAY ; (Area / 8) = LW, DW, or SW *8 SEP #$20 ; Set A in 8bit mode. ; TODO: For the sake of speed, remove these checks. ; $00 crashes the game so just double check that. LDA.w Pool_AnimatedTable, X : BNE .not00 LDA.w Pool_DefaultGFXGroups_sheet7, Y BRA .notFF .not00 ; Load the default sheet if the value is FF. CMP.b #$FF : BNE .notFF LDA.w Pool_DefaultGFXGroups_sheet7, Y .notFF SEP #$10 ; Set X and Y in 8bit mode. PLB RTL } pushpc ; ============================================================================== if !Func00DA63 == 1 ; The first half of this function enables or disables BG1 for subscreen overlay ; use depending on the area. The second half reloads global sprite #2 sheet ; (rock vs skulls, different bush gfx, fish vs bone fish, etc.) based on what ; world we are in. org $00DA63 ; $005A63 AnimateMirrorWarp_LoadSubscreen: { JSL.l ActivateSubScreen ; From this point on it is the vanilla function. PHB : PHK : PLB ; TODO: Eventually un-hardcode this. ; X = 0 for LW, 8 for DW LDA.l SheetsTable_0AA4, X : TAY ; Get the pointer for one of the 2 Global sprite #2 sheets. LDA.w GFXSheetPointers_sprite_low, Y : STA.b $00 LDA.w GFXSheetPointers_sprite_high, Y : STA.b $01 LDA.w GFXSheetPointers_sprite_bank, Y : STA.b $02 STA.b $05 PLB REP #$31 ; Set A, X, and Y in 16bit mode. +1 no idea. ; Source address is determined above, number of tiles is 0x0040, base ; target address is $7F0000. LDX.w #$0000 LDY.w #$0040 LDA.b $00 JSR.w Do3To4High16Bit SEP #$30 ; Set A, X, and Y in 8bit mode. RTL } assert pc() <= $00DABB else org $00DA63 ; $005A63 db $64, $1D, $A5, $8A, $F0, $24, $C9, $70 db $F0, $20, $C9, $40, $F0, $1C, $C9, $5B db $F0, $18, $C9, $03, $F0, $14, $C9, $05 db $F0, $10, $C9, $07, $F0, $0C, $C9, $43 db $F0, $08, $C9, $45, $F0, $04, $C9, $47 db $D0, $04, $A9, $01, $85, $1D, $8B, $4B db $AB, $BF, $F4, $D8, $00, $A8, $B9, $B1 db $D1, $85, $00, $B9, $D2, $D0, $85, $01 db $B9, $F3, $CF, $85, $02, $85, $05, $AB db $C2, $31, $A2, $00, $00, $A0, $40, $00 db $A5, $00, $20, $4F, $DF, $E2, $30, $6B endif pullpc ActivateSubScreen: { PHB : PHK : PLB STZ.b $1D PHX REP #$20 ; Set A in 16bit mode. LDA.b $8A : BNE .notForest ; Check if we have the master sword. LDA.l $7EF300 : AND.w #$0040 : BEQ .notForest ; The forest canopy overlay. BRA .turnOn .notForest ; Check if we need to disable the rain in the misery mire. LDA.w Pool_EnableRainMireEvent : BEQ .notMire LDA.b $8A : CMP.w #$0070 : BNE .notMire ; Has Misery Mire been triggered yet? LDA.l $7EF2F0 : AND.w #$0020 : BNE .notMire BRA .turnOn .notMire ; Check if we are in the beginning phase, if not, no rain. ; If $7EF3C5 >= 0x02. LDA.l $7EF3C5 : AND.w #$00FF : CMP.w #$0002 : BCS .noRain BRA .turnOn .noRain ; Get the overlay value for this overworld area. ; ReadOverlayArray LDA.b $8A : ASL : TAX LDA.w Pool_OverlayTable, X : CMP.w #$00FF : BEQ .normal ; If not $FF, assume we want an overlay. .turnOn SEP #$20 ; Set A in 8bit mode. ; Turn on BG1. LDA.b #$01 : STA.b $1D .normal SEP #$20 ; Set A in 8bit mode. PLX PLB RTL } pushpc ; ============================================================================== if !Func00EEBB == 1 ; Zeros out the BG color when mirror warping from an area with the pyramid BG. ; This is done to prevent a case where the black transparent color is faded to ; white on top of the pyramid BG, resulting in a double faded effect on ; transparent tiles. org $00EEBB ; $006EBB Palette_InitWhiteFilter_Interupt: { ; Check if we are currently in an area that is using an overlay. ; By this point $8A is already set to the area we are going to so flip the ; #$40 bit to get the one we are currently in. LDA.b $8A : EOR.w #$0040 : ASL : TAX LDA.l Pool_OverlayTable, X : CMP.w #$0096 : BNE .notPyramidBG ; If so, don't fade that color to white because then we will get the ; double fading. JSL.l EraseBGColors .notPyramidBG SEP #$20 ; Set A in 8bit mode. LDA.b #$08 : STA.w $06BB STZ.w $06BA RTL } assert pc() <= $00EEE0 else org $00EEBB ; $006EBB db $A5, $8A, $C9, $1B, $00, $D0, $13, $A9 db $00, $00, $8F, $00, $C3, $7E, $8F, $40 db $C3, $7E, $8F, $00, $C5, $7E, $8F, $40 db $C5, $7E, $E2, $20, $A9, $08, $8D, $BB db $06, $9C, $BA, $06, $6B endif pullpc EraseBGColors: { LDA.w #$0000 STA.l $7EC300 : STA.l $7EC340 STA.l $7EC500 : STA.l $7EC540 RTL } pushpc ; ============================================================================== if !Func00FF7C == 1 ; Controls the BG scrolling for HC and the pyramid area. org $00FF7C ; $007F7C MirrorWarp_BuildDewavingHDMATable_Interupt: { LDA.w $1C80 : ORA.w $1C90 : ORA.w $1CA0 : ORA.w $1CB0 : CMP.b $E2 : BNE .BRANCH_DELTA SEP #$30 ; Set A, X, and Y in 8bit mode. STZ.b $9B INC.b $B0 JSL.l Overworld_SetFixedColorAndScroll REP #$30 ; Set A, X, and Y in 16bit mode. ; Check if we are warping to an area with the pyramid BG. JSL.l ReadOverlayArray : CMP.w #$0096 : BEQ .dont_align_bgs LDA.b $E2 : STA.b $E0 STA.w $0120 STA.w $011E LDA.b $E8 : STA.b $E6 STA.w $0122 STA.w $0124 .dont_align_bgs .BRANCH_DELTA SEP #$30 ; Set A, X, and Y in 8bit mode. RTL } ; NOTE: This end point also uses up a null block at the end of the function. assert pc() <= $00FFC0 else org $00FF7C ; $007F7C db $AD, $80, $1C, $0D, $90, $1C, $0D, $A0 db $1C, $0D, $B0, $1C, $C5, $E2, $D0, $28 db $E2, $20, $64, $9B, $E6, $B0, $22, $70 db $FE, $0B, $A5, $8A, $29, $3F, $C9, $1B db $F0, $16, $C2, $20, $A5, $E2, $85, $E0 db $8D, $20, $01, $8D, $1E, $01, $A5, $E8 db $85, $E6, $8D, $22, $01, $8D, $24, $01 db $E2, $30, $6B, $FF, $FF, $FF, $FF, $FF db $FF, $FF, $FF, $FF endif ; ============================================================================== if !Func0283EE == 1 ; Replaces a bunch of calls to a shared function. ; Intro_SetupScreen: org $028027 ; $010027 JSR.w Overworld_LoadMusicIfNeeded assert pc() <= $02802B ; Dungeon_LoadSongBankIfNeeded: org $029C0C ; $011C0C JMP.w Overworld_LoadMusicIfNeeded assert pc() <= $029C0F ; Mirror_LoadMusic: org $029D1E ; $011D1E JSR.w Overworld_LoadMusicIfNeeded assert pc() <= $029D21 ; GanonEmerges_LoadPyramidArea: org $029F82 ; $011F82 JSR.w Overworld_LoadMusicIfNeeded assert pc() <= $029F85 ; Changes the function that loads overworld properties when exiting a dungeon. ; Includes removing asm that plays music in certain areas and changing how ; animated tiles are loaded. org $0283EE ; $0103EE PreOverworld_LoadProperties_Interupt: { LDX.b #$F3 ; If the volume was set to half, set it back to full. LDA.w $0132 : CMP.b #$F2 : BEQ .setToFull ; If we're in the dark world ; If area number is < 0x40 or >= 80 we are not in the dark world. LDA.b $8A : CMP.b #$40 : BCC .setNormalSong CMP.b #$80 : BCS .setNormalSong ; Does Link have a moon pearl? LDA.l $7EF357 : BNE .setNormalSong ; If not, play the music that plays when you're a bunny in the ; Dark World. LDX.b #$04 BRA .setToFull .setNormalSong LDX.b $8A LDA.l $7F5B00, X : AND.b #$0F : TAX .setToFull ; The value written here will take effect during NMI. STX.w $0132 ; Set the ambient sound. This is a bug present in vanilla. This was removed ; because this is also done later on and does not need to be done twice. ; Doing so creates a slight pause and causes the ambient sound to stop and ; start playing again rather than just continuing to play. ;LDX.b $8A ;LDA.l $7F5B00, X : LSR #4 : STA.w $012D ; The decompression function increases it by 1 so subtract 1 here. JSL.l ReadAnimatedTable : DEC : TAY JSL.l DecompOwAnimatedTiles ; Decompress all other graphics. JSL.l InitTilesets ; Load palettes for overworld. JSR.w Overworld_LoadAreaPalettes LDX.b $8A LDA.l $7EFD40, X : STA.b $00 LDA.l OverworldPalettesScreenToSet_New, X ; Load some other palettes. JSL.l Overworld_LoadPalettes ; Sets the background color (changes depending on area). JSL.l Palette_SetOwBgColor_Long LDA.b $10 : CMP.b #$08 : BNE .specialArea2 ; Copies $7EC300[0x200] to $7EC500[0x200]. JSR.w Dungeon_LoadPalettes_cacheSettings BRA .normalArea2 .specialArea2 ; Apparently special overworld handles palettes a bit differently? JSR.w SpecialOverworld_CopyPalettesToCache .normalArea2 ; Sets fixed colors and scroll values. JSL.l Overworld_SetFixedColorAndScroll ; Set darkness level to zero for the overworld. LDA.b #$00 : STA.l $7EC017 ; Sets up properties in the event a tagalong shows up. JSL.l Tagalong_Init ; Set animated sprite gfx for area 0x00 and 0x40. LDA.b $8A : AND.b #$3F : BNE .notForestArea LDA.b #$1E JSL.l GetAnimatedSpriteTile_variable .notForestArea ; 0x09 is the normal overworld $10 module. LDX.b #$09 ; Check if we are going to a SW area. If so we need to move into the SW ; mode after we are done loading. LDA.b $8A : AND.b #$80 : BEQ .notSWArea ; 0x0B is the SW overworld $10 module. LDX.b #$0B .notSWArea ; Cache the overworld mode. STX.w $010C JSL.l Sprite_OverworldReloadAll ; Are we in the dark world? If so, there's no warp vortex there. LDA.b $8A : AND.b #$40 : BNE .noWarpVortex JSL.l Sprite_ReinitWarpVortex .noWarpVortex ; Check if Blind disguised as a crystal maiden was following us when ; we left the dungeon area. LDA.l $7EF3CC : CMP.b #$06 : BNE .notBlindGirl ; If it is Blind, kill her! LDA.b #$00 : STA.l $7EF3CC .notBlindGirl ; Reset player variables. STZ.b $6C ; In doorway flag STZ.b $3A ; BY Bitfield STZ.b $3C ; B Button timer STZ.b $50 ; Link strafe STZ.b $5E ; Link speed handler STZ.w $0351 ; Link feet gfx fx ; Reinitialize many of Link's gameplay variables. JSR.w DeleteCertainAncillaeStopDashing LDA.l $7EF357 : BNE .notBunny LDA.l $7EF3CA : BEQ .notBunny LDA.b #$01 : STA.w $02E0 STA.b $56 LDA.b #$17 : STA.b $5D JSL.l LoadGearPalettes_bunny .notBunny ; Set screen to mode 1 with BG3 priority. LDA.b #$09 : STA.b $94 LDA.b #$00 : STA.l $7EC005 STZ.w $046C ; Collision BG1 flag STZ.b $EE ; Reset Link layer to BG2 STZ.w $0476 ; Another layer flag ; Move to Overworld_LoadSubscreenAndSilenceSFX1 which is the 1st ; submodule of Module_PreOverworld. INC.b $11 INC.b $16 ; NMI HUD Update flag STZ.w $0402 : STZ.w $0403 ; Bleeds into the next function } ; Vanilla alternate entry point. Called in 4 different locations all of ; which are overwritten above. Overworld_LoadMusicIfNeeded: { LDA.w $0136 : BEQ .no_music_load_needed SEI ; Shut down NMI until music loads. STZ.w SNES.NMIVHCountJoypadEnable ; Stop all HDMA. STZ.w SNES.HDMAChannelEnable STZ.w $0136 LDA.b #$FF : STA.w SNES.APUIOPort0 JSL.l Sound_LoadLightWorldSongBank ; Re-enable NMI and joypad. LDA.b #$81 : STA.w SNES.NMIVHCountJoypadEnable .no_music_load_needed ; PLACE CUSTOM GFX LOAD HERE! JSL Oracle_CheckForChangeGraphicsNormalLoadBoat RTS } assert pc() <= $02856A ; $01056A else org $028027 ; $010027 db $20, $4C, $85 org $029C0C ; $011C0C db $4C, $4C, $85 org $029D1E ; $011D1E db $20, $4C, $85 org $029F82 ; $011F82 db $20, $4C, $85 org $0283EE ; $0103EE db $A0, $58, $A2, $02, $A5, $8A, $C9, $03 db $F0, $6F, $C9, $05, $F0, $6B, $C9, $07 db $F0, $67, $A2, $09, $A5, $8A, $C9, $43 db $F0, $5F, $C9, $45, $F0, $5B, $C9, $47 db $F0, $57, $A0, $5A, $A5, $8A, $C9, $40 db $B0, $3A, $A2, $07, $AF, $C5, $F3, $7E db $C9, $03, $90, $02, $A2, $02, $A5, $A0 db $C9, $E3, $F0, $3D, $C9, $18, $F0, $39 db $C9, $2F, $F0, $35, $A5, $A0, $C9, $1F db $D0, $06, $A5, $8A, $C9, $18, $F0, $29 db $A2, $05, $AF, $00, $F3, $7E, $29, $40 db $F0, $02, $A2, $02, $A5, $A0, $F0, $19 db $C9, $E1, $F0, $15, $A2, $F3, $AD, $32 db $01, $C9, $F2, $F0, $30, $A2, $02, $AF db $C5, $F3, $7E, $C9, $02, $B0, $02, $A2 db $03, $AF, $CA, $F3, $7E, $F0, $1E, $A2 db $0D, $A5, $8A, $C9, $40, $F0, $0E, $C9 db $43, $F0, $0A, $C9, $45, $F0, $06, $C9 db $47, $F0, $02, $A2, $09, $AF, $57, $F3 db $7E, $D0, $02, $A2, $04, $8E, $32, $01 db $22, $94, $D3, $00, $22, $9B, $E1, $00 db $20, $92, $C6, $A6, $8A, $BF, $40, $FD db $7E, $85, $00, $BF, $1C, $FD, $00, $22 db $A8, $D5, $0E, $22, $18, $D6, $0E, $A5 db $10, $C9, $08, $D0, $05, $20, $5F, $C6 db $80, $03, $20, $EB, $C6, $22, $70, $FE db $0B, $A9, $00, $8F, $17, $C0, $7E, $22 db $FC, $9E, $09, $A5, $8A, $29, $3F, $D0 db $06, $A9, $1E, $22, $ED, $D4, $00, $A9 db $09, $8D, $0C, $01, $22, $99, $C4, $09 db $A5, $8A, $29, $40, $D0, $04, $22, $89 db $AF, $09, $A2, $05, $AF, $C5, $F3, $7E db $C9, $02, $B0, $02, $A2, $01, $8E, $2D db $01, $AF, $CC, $F3, $7E, $C9, $06, $D0 db $06, $A9, $00, $8F, $CC, $F3, $7E, $64 db $6C, $64, $3A, $64, $3C, $64, $50, $64 db $5E, $9C, $51, $03, $20, $0C, $8B, $AF db $57, $F3, $7E, $D0, $15, $AF, $CA, $F3 db $7E, $F0, $0F, $A9, $01, $8D, $E0, $02 db $85, $56, $A9, $17, $85, $5D, $22, $DD db $D6, $0E, $A9, $09, $85, $94, $A9, $00 db $8F, $05, $C0, $7E, $9C, $6C, $04, $64 db $EE, $9C, $76, $04, $E6, $11, $E6, $16 db $9C, $02, $04, $9C, $03, $04, $AD, $36 db $01, $F0, $18, $78, $9C, $00, $42, $9C db $0C, $42, $9C, $36, $01, $A9, $FF, $8D db $40, $21, $22, $13, $89, $00, $A9, $81 db $8D, $00, $42, $60 endif ; ============================================================================== if !Func028632 == 1 ; Changes a function that loads animated tiles under certain conditions. org $028632 ; $010632 Credits_LoadScene_Overworld_PrepGFX_Interupt: { ; The decompression function increases it by 1 so subtract 1 here. JSL.l ReadAnimatedTable : DEC : TAY JSL.l DecompOwAnimatedTiles ; The current scene of the Module_EndSequence module. Example: 0x04 is ; the shot of kakariko and 0x06 is the shot of the desert palace. LDA.b $11 : LSR : TAX LDA.l Credits_LoadScene_PrepGFX_sprite_gfx, X : STA.w $0AA3 LDA.l Credits_LoadScene_PrepGFX_sprite_palette, X : PHA JSL.l InitTilesets ; Load Palettes. JSR.w Overworld_LoadAreaPalettes PLA : STA.b $00 LDX.b $8A LDA.l OverworldPalettesScreenToSet_New, X JSL.l Overworld_LoadPalettes LDA.b #$01 : STA.w $0AB2 JSL.l Palette_Hud LDA.l $11 : BNE .BRANCH_4 JSL.l CopyFontToVram .BRANCH_4 JSR.w Dungeon_LoadPalettes_cacheSettings JSL.l Overworld_SetFixedColorAndScroll LDA.l $8A : CMP.b #$80 : BCC .BRANCH_5 JSL.l Palette_SetOwBgColor_Long .BRANCH_5 LDA.b #$09 : STA.b $94 INC.b $B0 RTS } assert pc() <= $028697 ; $010697 else org $028632 ; $010632 db $A0, $58, $A5, $8A, $29, $BF, $C9, $03 db $F0, $0A, $C9, $05, $F0, $06, $C9, $07 db $F0, $02, $A0, $5A, $22, $94, $D3, $00 db $A5, $11, $4A, $AA, $BF, $E2, $85, $02 db $8D, $A3, $0A, $BF, $F3, $85, $02, $48 db $22, $9B, $E1, $00, $20, $92, $C6, $68 db $85, $00, $A6, $8A, $BF, $1C, $FD, $00 db $22, $A8, $D5, $0E, $A9, $01, $8D, $B2 db $0A, $22, $52, $EE, $1B, $A5, $11, $D0 db $04, $22, $56, $E5, $00, $20, $5F, $C6 db $22, $70, $FE, $0B, $A5, $8A, $C9, $80 db $90, $04, $22, $18, $D6, $0E, $A9, $09 db $85, $94, $E6, $B0, $60 endif ; ============================================================================== if !Func029A37 == 1 ; Changes part of a function that changes the sub mask color when leaving ; dungeons. org $029A37 ; $011A37 Spotlight_ConfigureTableAndControl_Interupt: { LDA.b $10 : CMP.b #$09 : BEQ .dontPrepForDungeon CMP.b #$0B : BEQ .dontPrepForDungeon ; Force V-blank in preperation for Dungeon mode. JSL.l EnableForceBlank JSL.l Link_ItemReset_FromOverworldThings .dontPrepForDungeon LDA.b $10 : CMP.b #$09 : BEQ .inOWMode CMP.b #$0B : BNE .notInOWMode .inOWMode LDA.b $A1 : BNE .BRANCH_DELTA LDA.b $A0 : CMP.b #$20 : BEQ .BRANCH_EPSILON .BRANCH_DELTA LDA.b #$0A LDX.b $2F : BNE .BRANCH_ZETA LDA.b #$0B .BRANCH_ZETA STA.b $11 .BRANCH_EPSILON LDA.b #$10 : STA.w $069A ; Not an extended door type (palace or sanctuary). LDA.w $0696 : ORA.w $0698 : BEQ .BRANCH_GAMMA LDA.w $0699 : BEQ .BRANCH_GAMMA LDX.b #$00 ASL : BCC .BRANCH_THETA LDX.b #$18 .BRANCH_THETA LDA.w $0699 : AND.b #$7F : STA.w $0699 STX.w $0692 STZ.w $0690 LDA.b #$09 : STA.b $11 STZ.b $B0 LDA.b #$15 : STA.w $012F .BRANCH_GAMMA .notInOWMode STZ.b $96 : STZ.b $97 : STZ.b $98 STZ.b $1E : STZ.b $1F : STZ.w $03EF REP #$30 ; Setup fixed color values based on area number. LDX.w #$4C26 LDY.w #$8C4C ; TODO: Wtf why is this 0x00? ; Check for LW death mountain. JSL.l ReadOverlayArray : CMP.w #$0095 : BEQ .mountain LDX.w #$4A26 LDY.w #$874A ; Check for DW death mountain. CMP.w #$009C : BEQ .mountain BRA .other .mountain STX.b $9C STY.b $9D .other SEP #$30 ; Set A, X, and Y in 8bit mode. RTS } assert pc() <= $029AD3 ; $011AD3 else org $029A37 ; $011A37 db $A5, $10, $C9, $09, $F0, $08, $22, $3D db $89, $00, $22, $07, $B1, $07, $A5, $10 db $C9, $09, $D0, $46, $A5, $A1, $D0, $06 db $A5, $A0, $C9, $20, $F0, $0A, $A9, $0A db $A6, $2F, $D0, $02, $A9, $0B, $85, $11 db $A9, $10, $8D, $9A, $06, $AD, $96, $06 db $0D, $98, $06, $F0, $25, $AD, $99, $06 db $F0, $20, $A2, $00, $0A, $90, $02, $A2 db $18, $AD, $99, $06, $29, $7F, $8D, $99 db $06, $8E, $92, $06, $9C, $90, $06, $A9 db $09, $85, $11, $64, $B0, $A9, $15, $8D db $2F, $01, $64, $96, $64, $97, $64, $98 db $64, $1E, $64, $1F, $9C, $EF, $03, $C2 db $30, $A2, $26, $4C, $A0, $4C, $8C, $A5 db $8A, $C9, $03, $00, $F0, $1F, $C9, $05 db $00, $F0, $1A, $C9, $07, $00, $F0, $15 db $A2, $26, $4A, $A0, $4A, $87, $C9, $43 db $00, $F0, $0A, $C9, $45, $00, $F0, $05 db $C9, $47, $00, $D0, $04, $86, $9C, $84 db $9D, $E2, $30, $60 endif ; ============================================================================== if !Func02AF58 == 1 ; Main subscreen overlay loading function. Changed so that they will load ; from a table. This does not change the event overlays like the lost woods ; changing to the tree canopy, the master sword area, or the misery mire rain. ; This also does not change the overlay for under the bridge because it shares ; an area with the master sword. org $02AF58 ; $012F58 Overworld_ReloadSubscreenOverlay_Interupt: { SEP #$20 ; Set A in 8bit mode. ; Check to see if we are using the mirror so that our $A0 doesn't ; accidentally persist and we trigger rain sounds when we don't want them. LDA.b $11 : CMP.b #$23 : BEQ .mirrorWarp CMP.b #$24 : BEQ .mirrorWarp CMP.b #$2C : BEQ .mirrorWarp ; We can't warp to or from a special area anyway so this is fine. REP #$20 ; Set A in 16bit mode. ; Check to see if we are in a SW overworld area. LDA.b $8A : CMP.w #$0080 : BCC .notExtendedArea ; $0182 is the exit room number used for getting to Zora's Domain. LDA.b $A0 : CMP.w #$0182 : BNE .notZoraFalls SEP #$20 ; Set A in 8bit mode. ; Play rain (waterfall) sound. ; TODO: Write a patch to change/disable this. LDA.b #$01 : STA.w $012D REP #$20 ; Set A in 16bit mode. .notZoraFalls ; Check for exit rooms (the faked way of getting from one overworld ; area to another). $0180 is the exit room number used for getting ; into the mastersword area. LDA.b $A0 : CMP.w #$0180 : BNE .notMasterSwordArea ; If the Master sword is retrieved, don't do the mist overlay. LDA.l $7EF300 : AND.w #$0040 : BNE .masterSwordRecieved JSL.l ReadOverlayArray : TAX .loadOverlayShortcut ; Save the overlay for later. PHX JMP.w .loadSubScreenOverlay .masterSwordRecieved ; TODO: Write a patch to change what overlay is loaded here? BRA .noSubscreenOverlay .notMasterSwordArea ; TODO: Write a patch to change what overlay is loaded here? ; The second mastersword/under the bridge area. LDX.w #$0094 ; $0181 is the exit room number used for getting into the under the ; bridge area. LDA.b $A0 : CMP.w #$0181 : BEQ .loadOverlayShortcut ; TODO: Write a patch to change what overlay is loaded here? ; The second Triforce room area. LDX.w #$0093 ; $0189 is the exit room number used for getting to the ; Triforce room. CMP.w #$0189 : BEQ .loadOverlayShortcut .noSubscreenOverlay SEP #$30 ; Set A, X, and Y in 8bit mode. ; Clear TSQ PPU Register, to be handled in NMI. STZ.b $1D ; Submodule 0x18 (Module09_18:) of Module 0x0B ; (Overworld Mode (special overworld)) INC.b $11 RTS .notExtendedArea .mirrorWarp REP #$20 ; Set A in 16bit mode. JSL.l ReadOverlayArray : TAX LDA.b $8A : BNE .notForest ; Check if we have the master sword. LDA.l $7EF300 : AND.w #$0040 : BEQ .notForest ; TODO: Write a patch to change this? ; The forest canopy overlay. LDX.w #$009E .notForest ; Check if we need to disable the rain in the misery mire. LDA.l Pool_EnableRainMireEvent : BEQ .notMire LDA.b $8A : CMP.w #$0070 : BNE .notMire ; Has Misery Mire been triggered yet? LDA.l $7EF2F0 : AND.w #$0020 : BNE .notMire ; The rain overlay. LDX.w #$009F SEP #$20 ; Set A in 8bit mode. ; Load the rain sound effect. ; This is done here because of some jank in the vanilla code in ; this function a bit further down. Basically it loads the ; overlay's ambient sound instead of the acutal areas, which ; only seems to benefit us here. LDA.b #$01 : STA.w $012D REP #$20 ; Set A in 16bit mode. .notMire ; Check if we are in the beginning phase, if not, no rain. ; If $7EF3C5 >= 0x02. LDA.l Pool_EnableBeginningRain : AND.w #$00FF : BEQ .noRain LDA.l $7EF3C5 : AND.w #$00FF : CMP.w #$0002 : BCS .noRain ; The rain overlay. LDX.w #$009F .noRain ; Store the overlay for later. PHX ; If the value is 0xFF that means we didn't set any overlay so load the ; pyramid one by default. This is done in vanilla to not have to load the ; BG during a normal transition from area 0x65 to the pyramid area. CPX.w #$00FF : BNE .notFF ; The pyramid background. LDX.w #$0096 .notFF .loadSubScreenOverlay STY.b $84 STX.b $8A : STX.b $8C ; Overworld map16 buffer manipulation during scrolling. LDA.b $84 : SEC : SBC.w #$0400 : AND.w #$0F80 : ASL : XBA : STA.b $88 LDA.b $84 : SEC : SBC.w #$0010 : AND.w #$003E : LSR : STA.b $86 STZ.w $0418 : STZ.w $0410 : STZ.w $0416 SEP #$30 ; Set A, X, and Y in 8bit mode. ; Color +/- buffered register. LDA.b #$82 : STA.b $99 ; Puts OBJ, BG2, and BG3 on the main screen. LDA.b #$16 : STA.b $1C ; Puts BG1 on the subscreen. LDA.b #$01 : STA.b $1D ; Pull the 16 bit overlay from earlier and just discard the high byte. PLX : PLA ; One possible configuration for SNES.AddSubtractSelectAndEnable (CGADSUB). LDA.b #$72 ; Comparing different screen types. CPX.b #$97 : BEQ .loadOverlay ; Fog 1 CPX.b #$94 : BEQ .loadOverlay ; Master sword/bridge 2 CPX.b #$93 : BEQ .loadOverlay ; Triforce room 2 CPX.b #$9D : BEQ .loadOverlay ; Fog 2 CPX.b #$9E : BEQ .loadOverlay ; Tree canopy CPX.b #$9F : BEQ .loadOverlay ; Rain ; Alternative setting for CGADSUB (only background is enabled on ; subscreen). LDA.b #$20 CPX.b #$95 : BEQ .loadOverlay ; Sky CPX.b #$9C : BEQ .loadOverlay ; Lava CPX.b #$96 : BEQ .loadOverlay ; Pyramid BG ; TODO: Investigate what these checks are for. LDX.b $11 : CPX.b #$23 : BEQ .loadOverlay CPX.b #$2C : BEQ .loadOverlay STZ.b $1D .loadOverlay ; Apply the selected settings to CGADSUB's mirror ($9A). STA.b $9A JSR.w LoadSubscreenOverlay ; This is the "under the bridge" area. LDA.b $8C : CMP.b #$94 : BNE .notUnderBridge ; All this is doing is setting the X coordinate of BG1 to 0x0100 ; rather than 0x0000. (this area uses the second half of the data only, ; similar to the master sword area). LDA.b $E7 : ORA.b #$01 : STA.b $E7 .notUnderBridge REP #$20 ; Set A in 16bit mode. ; We were pretending to be in a different area to load the subscreen ; overlay, so we're restoring all those settings. LDA.l $7EC213 : STA.b $8A LDA.l $7EC215 : STA.b $84 LDA.l $7EC217 : STA.b $88 LDA.l $7EC219 : STA.b $86 LDA.l $7EC21B : STA.w $0418 LDA.l $7EC21D : STA.w $0410 LDA.l $7EC21F : STA.w $0416 SEP #$20 ; Set A in 8bit mode. RTS } assert pc() <= $02B0D2 ; $0130D2 else org $02AF58 ; $012F58 db $A5, $8A, $C9, $80, $00, $90, $44, $A2 db $97, $00, $A5, $A0, $C9, $80, $01, $D0 db $12, $A2, $80, $00, $BF, $80, $F2, $7E db $A2, $97, $00, $29, $40, $00, $D0, $24 db $4C, $0B, $B0, $A2, $94, $00, $C9, $81 db $01, $F0, $F5, $A2, $93, $00, $C9, $89 db $01, $F0, $ED, $C9, $82, $01, $F0, $05 db $C9, $83, $01, $D0, $07, $E2, $30, $A9 db $01, $8D, $2D, $01, $E2, $30, $64, $1D db $E6, $11, $60, $29, $3F, $00, $D0, $1B db $A5, $8A, $29, $40, $00, $D0, $0F, $A2 db $80, $00, $BF, $80, $F2, $7E, $A2, $9E db $00, $29, $40, $00, $D0, $4D, $A2, $9D db $00, $80, $48, $A2, $95, $00, $A5, $8A db $C9, $03, $00, $F0, $3E, $C9, $05, $00 db $F0, $39, $C9, $07, $00, $F0, $34, $A2 db $9C, $00, $C9, $43, $00, $F0, $2C, $C9 db $45, $00, $F0, $27, $C9, $47, $00, $F0 db $22, $C9, $70, $00, $D0, $0B, $AF, $F0 db $F2, $7E, $29, $20, $00, $D0, $14, $80 db $0F, $A2, $96, $00, $AF, $C5, $F3, $7E db $29, $FF, $00, $C9, $02, $00, $B0, $03 db $A2, $9F, $00, $84, $84, $86, $8A, $86 db $8C, $A5, $84, $38, $E9, $00, $04, $29 db $80, $0F, $0A, $EB, $85, $88, $A5, $84 db $38, $E9, $10, $00, $29, $3E, $00, $4A db $85, $86, $9C, $18, $04, $9C, $10, $04 db $9C, $16, $04, $E2, $30, $A9, $82, $85 db $99, $A9, $16, $85, $1C, $A9, $01, $85 db $1D, $DA, $A6, $8A, $BF, $00, $5B, $7F db $4A, $4A, $4A, $4A, $8D, $2D, $01, $FA db $A9, $72, $E0, $97, $F0, $39, $E0, $94 db $F0, $35, $E0, $93, $F0, $31, $E0, $9D db $F0, $2D, $E0, $9E, $F0, $29, $E0, $9F db $F0, $25, $A9, $20, $E0, $95, $F0, $1F db $E0, $9C, $F0, $1B, $AF, $13, $C2, $7E db $AA, $A9, $20, $E0, $5B, $F0, $10, $E0 db $1B, $D0, $0A, $A6, $11, $E0, $23, $F0 db $06, $E0, $2C, $F0, $02, $64, $1D, $85 db $9A, $20, $0D, $FD, $A5, $8C, $C9, $94 db $D0, $06, $A5, $E7, $09, $01, $85, $E7 db $C2, $20, $AF, $13, $C2, $7E, $85, $8A db $AF, $15, $C2, $7E, $85, $84, $AF, $17 db $C2, $7E, $85, $88, $AF, $19, $C2, $7E db $85, $86, $AF, $1B, $C2, $7E, $8D, $18 db $04, $AF, $1D, $C2, $7E, $8D, $10, $04 db $AF, $1F, $C2, $7E, $8D, $16, $04, $E2 db $20, $60 endif ; ============================================================================== if !Func02B2D4 == 1 ; Turns on the subscreen if the pyramid is loaded. org $02B2D4 ; $0132D4 Func02B2D4: { JSR.w Overworld_LoadSubscreenAndSilenceSFX1 ; In vanilla a check for the overlay is done here but we don't need ; it at all. It is handled in Func02B391 later on. ;JSL.l EnableSubScreenCheckForPyramid RTL } assert pc() <= $02B2E6 ; $0132E6 else org $02B2D4 ; $0132D4 db $20, $19, $AF, $A5, $8A, $C9, $1B, $F0 db $04, $C9, $5B, $D0, $04, $A9, $01, $85 db $1D, $6B endif pullpc EnableSubScreenCheckForPyramid: { REP #$20 ; Set A in 16bit mode. LDA.b $8A : ASL : TAX LDA.w Pool_OverlayTable, X : CMP.w #$0096 : BNE .notPyramidOrCastle SEP #$20 ; Set A in 8bit mode. LDA.b #$01 : STA.b $1D .notPyramidOrCastle SEP #$20 ; Set A in 8bit mode. RTL } pushpc ; ============================================================================== if !Func02B391 == 1 ; Handles activating the subscreen and special BG color when warping to an area ; with the pyramid BG. org $02B391 ; $013391 MirrorWarp_LoadSpritesAndColors_Interupt: { LDA.l OverworldPalettesScreenToSet_New, X JSL.l Overworld_LoadPalettes JSL.l Overworld_SetScreenBGColorCacheOnly JSL.l Overworld_SetFixedColorAndScroll JSL.l EnableSubScreenCheckForPyramid REP #$20 ; Set A in 16bit mode. LDX.b #$00 LDA.w #$7FFF .setBgPalettesToWhite STA.l $7EC540, X : STA.l $7EC560, X STA.l $7EC580, X : STA.l $7EC5A0, X STA.l $7EC5C0, X : STA.l $7EC5E0, X INX : INX : CPX.b #$20 : BNE .setBgPalettesToWhite ; Also set the background color to white. STA.l $7EC500 JSL.l ReadOverlayArray ; This sets the color to transparent so that we don't see an additional ; white layer on top of the pyramid bg. CMP.w #$0096 : BNE .notPyramidOfPower LDA.w #$0000 : STA.l $7EC500 STA.l $7EC540 .notPyramidOfPower SEP #$20 ; Set A in 8bit mode. JSL.l Sprite_ResetAll JSL.l Sprite_OverworldReloadAll JSL.l Link_ItemReset_FromOverworldThings JSR.w DeleteCertainAncillaeStopDashing LDA.b #$14 : STA.b $5D LDA.b $8A : AND.b #$40 : BNE .darkWorld JSL.l Sprite_ReinitWarpVortex .darkWorld RTL } assert pc() <= $02B40A ; $01340A else org $02B391 ; $013391 db $BF, $1C, $FD, $00, $22, $A8, $D5, $0E db $22, $1D, $D6, $0E, $22, $70, $FE, $0B db $A5, $8A, $C9, $1B, $F0, $04, $C9, $5B db $D0, $04, $A9, $01, $85, $1D, $C2, $20 db $A2, $00, $A9, $FF, $7F, $9F, $40, $C5 db $7E, $9F, $60, $C5, $7E, $9F, $80, $C5 db $7E, $9F, $A0, $C5, $7E, $9F, $C0, $C5 db $7E, $9F, $E0, $C5, $7E, $E8, $E8, $E0 db $20, $D0, $E2, $8F, $00, $C5, $7E, $A5 db $8A, $C9, $5B, $00, $D0, $0B, $A9, $00 db $00, $8F, $00, $C5, $7E, $8F, $40, $C5 db $7E, $E2, $20, $22, $4E, $C4, $09, $22 db $99, $C4, $09, $22, $07, $B1, $07, $20 db $0C, $8B, $A9, $14, $85, $5D, $A5, $8A db $29, $40, $D0, $04, $22, $89, $AF, $09 db $6B endif ; ============================================================================== if !Func02BC44 == 1 ; Controls overworld vertical subscreen movement for the pyramid BG. org $02BC44 ; $013C44 Overworld_OperateCameraScroll_Interupt: { ; Check for the pyramid BG. JSL.l ReadOverlayArray : CMP.w #$0096 : BNE .BRANCH_IOTA JSL.l BGControl BRA .BRANCH_IOTA assert pc() <= $02BC60 ; $013C60 org $02BC60 ; $013C60 .BRANCH_IOTA } assert pc() <= $02BC60 ; $013C60 else org $02BC44 ; $013C44 db $A5, $8A, $29, $3F, $00, $C9, $1B, $00 db $D0, $12, $A9, $00, $06, $C5, $E6, $90 db $02, $85, $E6, $A9, $C0, $06, $C5, $E6 db $B0, $02, $85, $E6 endif pullpc ReadOverlayArray: { PHB : PHK : PLB LDA.b $8A : ASL : TAX LDA.w Pool_OverlayTable, X PLB RTL } ; TODO: These comparison values will need to be calculated somehow or set ; depending on the area. Right now they are hardcoded to work with the ; pyramid area. BGControl: { ; TODO: I'm pretty sure this part was AHE specific. Verify. ; Check link's Y position. This will need to be changed per area and per ; need. ;LDA.b $20 : CMP.w #$08E0 : BCC .startShowingMountains ; Lock the position so that nothing shows through the trees. ;LDA.w #$06C0 : STA.b $E6 ;RTL ;.startShowingMountains ; Don't let the BG scroll down further than the "top" of the bg when ; walking up. LDA.w #$0600 : CMP.b $E6 : BCC .dontLock STA.b $E6 .dontLock ; Don't let the BG scroll up further than the "bottom" of the bg when ; walking down. LDA.w #$06C0 : CMP.b $E6 : BCS .dontLock2 STA.b $E6 .dontLock2 RTL } pushpc ; ============================================================================== if !Func02C02D == 1 ; Changes how the pyramid BG scrolls durring transition. org $02C02D ; $01402D OverworldScrollTransition_Interupt: { PHA JSL.l ReadOverlayArray2 PLA ; Check for the pyramid BG. CPY.b #$96 : BEQ .dontMoveBg1 ; This shifts the BG over by a half small area's width. This is to ; line up the mountain with the tower in the distance at the appropriate ; location when coming into the pyramid area from the right. ; This also keeps the BG aligned when entering the area from below, ; keeping you from seeing the mountains through the trees. STA.b $E0, X ; NOTE: There is currently a bug in vanilla where if you exit a dungeon ; into the LW death mountain the sky background will become miss-aligned ; and this movement will cause the sky to flicker or jump when moving to ; another area. In order to fix this you would have to find the ; alignment exit code and change how the game aligns BG2 when exiting. ; Possibly when using the bird too. .dontMoveBg1 } assert pc() <= $02C039 ; $014039 else org $02C02D ; $01402D db $A4, $8A, $C0, $1B, $F0, $06, $C0, $5B db $F0, $02, $95, $E0 endif pullpc ReadOverlayArray2: { PHX ; A is already 16 bit here. REP #$10 ; Set X and Y in 16bit mode. ; ReadOverlayArray LDA.b $8A : ASL : TAX LDA.l Pool_OverlayTable, X : TAY SEP #$10 ; Set X and Y in 8bit mode. PLX RTL } pushpc ; ============================================================================== if !Func02C692 == 1 ; Replaces a call to a shared function. Normally this is goes to .lightworld ; to change the main color palette manually but we change it here so that it ; just uses the same table as everything else. org $02A07A ; $01207A JSR.w Overworld_LoadAreaPalettes assert pc() <= $02A07D ; $01207D ; The main overworld palette loading routine un-hardcoded to load the custom ; main palette. org $02C692 ; $014692 Overworld_LoadAreaPalettes: { ; $0AB3 = ; 0 - LW ; 1 - DW ; 2 - LW death mountain ; 3 - DW death mountain ; 4 - triforce room LDX.b $8A LDA.l Pool_MainPaletteTable, X : STA.w $0AB3 ; Reset pal buffer high byte. STZ.w $0AA9 ; Load SP1 through SP4. JSL.l Palette_MainSpr ; Load SP0 (2nd half) and SP6 (2nd half). JSL.l Palette_MiscSpr ; Load SP5 (1st half). JSL.l Palette_SpriteAux1 ; Load SP6 (1st half). JSL.l Palette_SpriteAux2 ; Load SP5 (2nd half, 1st 3 colors), which is the sword palette. JSL.l Palette_Sword ; Load SP5 (2nd half, next 4 colors), which is the shield. JSL.l Palette_Shield ; Load SP7 (full) Link's whole palette, including Armor. JSL.l Palette_ArmorAndGloves LDX.b #$01 ; Changes the Palette_SpriteAux3 load depending on if we are in the LW or ; not. Will probably need it own custom table in the future? not sure. LDA.l $7EF3CA : AND.b #$40 : BEQ .lightWorld2 LDX.b #$03 .lightWorld2 ; Reset pal buffer0. STX.w $0AAC ; Load SP0 (first half) (or SP7 (first half)). JSL.l Palette_SpriteAux3 ; Load BP0 and BP1 (first halves). JSL.l Palette_Hud ; Load BP2 through BP5 (first halves). JSL.l Palette_OverworldBgMain RTS } assert pc() <= $02C6EB ; $0146EB else org $02A07A ; $01207A db $20, $AD, $C6 org $02C692 ; $014692 db $A2, $02, $A5, $8A, $29, $3F, $C9, $03 db $F0, $0A, $C9, $05, $F0, $06, $C9, $07 db $F0, $02, $A2, $00, $A5, $8A, $29, $40 db $F0, $01, $E8, $8E, $B3, $0A, $9C, $A9 db $0A, $22, $9E, $EC, $1B, $22, $6E, $ED db $1B, $22, $C5, $EC, $1B, $22, $E4, $EC db $1B, $22, $03, $ED, $1B, $22, $29, $ED db $1B, $22, $F9, $ED, $1B, $A2, $01, $AF db $CA, $F3, $7E, $29, $40, $F0, $02, $A2 db $03, $8E, $AC, $0A, $22, $77, $EC, $1B db $22, $52, $EE, $1B, $22, $C7, $EE, $1B db $60 endif ; ============================================================================== if !Func02A4CD == 1 ; Rain animation code. Just replaces a single check that checks for the ; misery mire to instead check the current overlay to see if it's rain. org $02A4CD ; $0124CD RainAnimation: { LDA.b $8C : CMP.b #$9F : BEQ .rainOverlaySet ; Check the progress indicator. LDA.l $7EF3C5 : CMP.b #$02 : BRA .skipMovement .rainOverlaySet ; If misery mire has been opened already, we're done. ;LDA.l $7EF2F0 : AND.b #$20 : BNE .skipMovement ; Check the frame counter. ; On the 0x03rd frame, cue the lightning. LDA.b $1A : CMP.b #$03 : BEQ .lightning ; On the 0x05th frame, normal light level. CMP.b #$05 : BEQ .normalLight ; On the 0x24th frame, cue the thunder. CMP.b #$24 : BEQ .thunder ; On the 0x2Cth frame, normal light level. CMP.b #$2C : BEQ .normalLight ; On the 0x58th frame, cue the lightning. CMP.b #$58 : BEQ .lightning ; On the 0x5Ath frame, normal light level. CMP.b #$5A : BNE .moveOverlay .normalLight ; Keep the screen semi-dark. LDA.b #$72 BRA .setBrightness .thunder ; Play the thunder sound when outdoors. LDX.b #$36 : STX.w $012E .lightning ; Make the screen flash with lightning. LDA.b #$32 .setBrightness STA.b $9A .moveOverlay ; Overlay is only moved every 4th frame. LDA.b $1A : AND.b #$03 : BNE .skipMovement LDA.w $0494 : INC : AND.b #$03 : STA.w $0494 TAX LDA.b $E1 : CLC : ADC.l OWOverlay_HShift, X : STA.b $E1 LDA.b $E7 : CLC : ADC.l OWOverlay_VShift, X : STA.b $E7 .skipMovement RTL } assert pc() <= $02A52D ; $01252D else org $02A4CD ; $0124CD db $A5, $8A, $C9, $70, $F0, $08, $AF, $C5 db $F3, $7E, $C9, $02, $B0, $51, $AF, $F0 db $F2, $7E, $29, $20, $D0, $49, $A5, $1A db $C9, $03, $F0, $1D, $C9, $05, $F0, $10 db $C9, $24, $F0, $10, $C9, $2C, $F0, $08 db $C9, $58, $F0, $0D, $C9, $5A, $D0, $0D db $A9, $72, $80, $07, $A2, $36, $8E, $2E db $01, $A9, $32, $85, $9A, $A5, $1A, $29 db $03, $D0, $1C, $AD, $94, $04, $1A, $29 db $03, $8D, $94, $04, $AA, $A5, $E1, $18 db $7F, $6D, $A4, $02, $85, $E1, $A5, $E7 db $18, $7F, $71, $A4, $02, $85, $E7, $6B endif ; ============================================================================== if !Func02ABBE == 1 org $02ABBE ; $012BBE JSL.l NewOverworld_FinishTransGfx NOP : NOP : NOP assert pc() <= $02ABC5 ; $012BC5 else org $02ABBE ; $012BBE db $85, $17, $8D, $10, $07, $E6, $11 endif pullpc ; Loads the animated tiles after most of the transition gfx changes take place. NewOverworld_FinishTransGfx: { PHB : PHK : PLB ; The whirlpool code resuses this code so don't do any of the custom stuff if ; we are in the whirlpool module. LDA.b $11 : CMP.b #$2E : BEQ .whirpool LDA.w TransGFXModuleFrame : BNE .notFirstFrame JSR.w CheckForChangeGraphicsTransitionLoad ; Prep the new static gfx tile sets. JSR.w LoadTransMainGFX ; A check to see if we need to Prep the GFX in the buffer. ; Saves about a frame. LDA.b $04 : BEQ .dontPrep JSR.w PrepTransMainGFX .dontPrep ; Move on to next submodule. INC.b $11 .notFirstFrame LDA.b #$08 : STA.b $06 JSR.w BlockGFXCheck ; If we haven't made it to frame 8, don't move on yet. CPY.b #$08 : BCC .return ; Move on to next submodule. INC.b $11 .return PLB RTL .whirpool ; On the "second" frame, upload the animated tiles. LDA.b $B0 : CMP.b #$08 : BEQ .loadAnimated LDA.w TransGFXModuleFrame : BNE .notFirstFrame2 JSR.w CheckForChangeGraphicsTransitionLoad ; Prep the new static gfx tile sets. JSR.w LoadTransMainGFX ; A check to see if we need to Prep the GFX in the buffer. ; Saves about a frame. LDA.b $04 : BEQ .dontPrep2 JSR.w PrepTransMainGFX .dontPrep2 .notFirstFrame2 LDA.b #$08 : STA.b $06 JSR.w BlockGFXCheck ; If we haven't made it to frame 8, don't move on yet. CPY.b #$08 : BCS .MoveOn ; Don't move on to next submodule yet. DEC.b $B0 .MoveOn ; Move on to next submodule. This will get undone by the vanilla ; whirlpool code because it shared the function with the OW ; transition code which uses $11 as its module index but the ; whirlpool uses $B0 instead. INC.b $11 PLB RTL .loadAnimated ; The NMI_DoUpdates function is never actually run while the whirpool is ; happening. So we need to upload the animated tiles manually here while ; the screen is still blue to cover up the change. ; Set the bank for the source to $7E. LDA.b #$7E : STA.w DMA.0_SourceAddrBank REP #$20 LDA.w #DMA.0_TransferParameters : STA.w SNES.VRAMAddrReadWriteLow LDA.w $0ADC : STA.w DMA.0_SourceAddrOffsetLow ; Set the target VRAM address. LDA.w $0134 : STA.w SNES.VRAMAddrReadWriteLow ; Transfer #$400 = 4 * 256 = 1024 bytes = 1 Kbyte LDA.w #$0400 : STA.w DMA.0_TransferSizeLow SEP #$20 ; Activate line 0. LDA.b #$01 : STA.w SNES.DMAChannelEnable ; Move on to next submodule. This will get undone by the vanilla ; whirlpool code because it shared the function with the OW ; transition code which uses $11 as its module index but the ; whirlpool uses $B0 instead. INC.b $11 PLB RTL } BlockGFXCheck: { REP #$30 ; $0E = $8A * 8 LDA.b $8A : AND.w #$00FF : ASL #3 : STA.b $0E STZ.b $02 STZ.b $04 STZ.w NewNMITarget1 STZ.w NewNMISource1 STZ.w NewNMICount1 STZ.w NewNMITarget2 STZ.w NewNMISource2 STZ.w NewNMICount2 SEP #$30 LDY.w TransGFXModuleFrame .loop ; Get the sheet that needs to be loaded. LDA.w .sheetLoadOrder, Y : STA $02 REP #$30 AND.w #$00FF : CLC : ADC.b $0E : TAX SEP #$20 LDA.l Pool_OWGFXGroupTable_sheet0, X : STA.b $00 SEP #$10 ; Check if it is #$FF. CMP.b #$FF : BEQ .dontLoadThisSheet ; Get the sheet that is currently loaded and check if the sheets ; are the same. LDX.b $02 LDA.w TransGFXModule_PriorSheets, X : CMP.b $00 : BEQ .dontLoadThisSheet LDA.b $00 : STA.w TransGFXModule_PriorSheets, X ; Trigger NMI module: NMI_DoNothing which we replaced with ; NMI_UpdateChr_Bg2HalfAndAnimated down below. LDA.b #$06 : STA.b $17 STA.w $0710 TXA : ASL : TAX REP #$20 LDA.b $04 : BNE .second LDA.w .sheetTarget, X : STA.w NewNMITarget1 LDA.w .sheetSource, X : STA.w NewNMISource1 LDA.w .sheetCount, X : STA.w NewNMICount1 SEP #$20 INC.b $04 BRA .first .second LDA.w .sheetTarget, X : STA.w NewNMITarget2 LDA.w .sheetSource, X : STA.w NewNMISource2 LDA.w .sheetCount, X : STA.w NewNMICount2 SEP #$20 INC.b $04 INY BRA .twoReady .first .dontLoadThisSheet INY : CPY.b $06 : BCC .loop .twoReady STY.w TransGFXModuleFrame RTS .sheetLoadOrder db $03, $04, $05, $06, $00, $01, $02, $07 .sheetTarget dw #$2000, #$2400, #$2800, #$2C00, #$3000, #$3400, #$3800, #$3E00 .sheetSource dw #$2000, #$2800, #$3000, #$0000, #$0800, #$1000, #$1800, #$3C00 .sheetCount dw #$0800, #$0800, #$0800, #$0800, #$0800, #$0800, #$0800, #$0400 ; Only copy the latter half of the sheet to prevent the animated tiles ; from flickering on transition. } CheckForChangeGraphicsTransitionLoad: { ; Are we currently in a mosaic? LDA.b $11 : CMP.b #$0F : BEQ .mosaic ; Are we entering a special area? CMP.b #$1A : BEQ .mosaic ; Are we leaving a special area? CMP.b #$26 : BEQ .mosaic ; Just a normal transition, Not a mosaic. LDA.l Pool_EnableAnimated : BEQ .dontUpdateAnimated1 ; Check to see if we need to update the animated tiles ; by checking what was previously loaded. JSL.l ReadAnimatedTable : CMP.w AnimatedTileGFXSet : BEQ .dontUpdateAnimated1 STA.w AnimatedTileGFXSet DEC : TAY ; This forces the game toupdate the animated tiles ; when going from one area to another. JSL.l DecompOwAnimatedTiles .dontUpdateAnimated1 LDA.w Pool_EnableMainPalette : BEQ .dontUpdateMain1 ; Check to see if we need to update the main palette by ; checking what was previously loaded. LDX.b $8A LDA.w Pool_MainPaletteTable, X : CMP.w $0AB3 : BEQ .dontUpdateMain1 STA.w $0AB3 ; Run the modified routine that loads the buffer ; and normal color ram. JSL.l Palette_OverworldBgMain2 .dontUpdateMain1 LDA.w Pool_EnableBGColor : BEQ .dontUpdateBGColor1 REP #$30 ; Set A, X, and Y in 16bit mode. ; Get area code and times it by 2. LDA.b $8A : ASL : TAX ; Where ZS saves the array of palettes LDA.w Pool_BGColorTable, X STA.l $7EE018 JSL Oracle_BackgroundFix ; STA.l $7EC300 : STA.l $7EC500 ; STA.l $7EC540 : STA.l $7EC340 SEP #$30 ; Set A, X, and Y in 8bit mode. ; Don't update the CRAM until later when the overlays are ; loaded so that way the BG overlays have a chance to hide ; the cracks. ;INC.b $15 .dontUpdateBGColor1 RTS .mosaic ; Check to see if we need to update the animated tiles by checking what ; was previously loaded. JSL.l ReadAnimatedTable : CMP.w AnimatedTileGFXSet : BEQ .dontUpdateAnimated2 STA.w AnimatedTileGFXSet DEC : TAY ; This forces the game to update the animated tiles when going ; from one area to another. JSL.l DecompOwAnimatedTiles .dontUpdateAnimated2 ; Check to see if we need to update the main palette by checking ; what was previously loaded. LDX.b $8A LDA.w Pool_MainPaletteTable, X : CMP.w $0AB3 : BEQ .dontUpdateMain2 STA.w $0AB3 ; Run the vanilla routine that only loads the buffer. JSL.l Palette_OverworldBgMain .dontUpdateMain2 REP #$30 ; Set A, X, and Y in 16bit mode. ; $0181 is the exit room number used for getting into the under the bridge ; area. LDA.b $A0 : CMP.w #$0181 : BNE .notBridge LDA.w Pool_BGColorTable_Bridge BRA .storeColor .notBridge ; Get area code and times it by 2. LDA.b $8A : ASL : TAX ; Where ZS saves the array of palettes. LDA.w Pool_BGColorTable, X .storeColor ; Set transparent color. only set the buffer so it fades in right ; during mosaic transition. STA.l $7EE018 JSL Oracle_MosaicFix ;STA.l $7EC300 : STA.l $7EC340 ; Write the fixed color. LDX.w #$4020 : STX.b $9C LDX.w #$8040 : STX.b $9D LDX.w #$4F33 LDY.w #$894F ; Change the fixed color depending on our sub screen overlay. ; Lost woods and skull woods. LDA.b $8A : ASL : TAX LDA.w Pool_OverlayTable, X : CMP.w #$009D : BEQ .noSpecialColor CMP.w #$0040 : BEQ .noSpecialColor ; Pyramid area. CMP.w #$0096 : BEQ .specialColor LDX.w #$4C26 LDY.w #$8C4C ; LW death mountain. CMP.w #$0095 : BEQ .specialColor LDX.w #$4A26 LDY.w #$874A ; DW death mountain. CMP.w #$009C : BEQ .specialColor BRA .noSpecialColor .specialColor ; Write the fixed color. STX.b $9C STY.b $9D .noSpecialColor SEP #$30 ; Set A, X, and Y in 8bit mode. ; Don't update the CRAM until later when the overlays are loaded so ; that way the BG overlays have a chance to hide the cracks. ;INC.b $15 ; PLACE CUSTOM GFX LOAD HERE! JSL Oracle_CheckForChangeGraphicsNormalLoadBoat CheckForChangeGraphicsTransitionLoadRetrun: RTS SkipOverworld_FinishTransGfx_firstHalf: ; Move on to next submodule. INC.b $11 RTS } ; The following 2 functions are copied from the bank 0x1B but they only ; copied colors into the buffer so these copy colors into the normal ram as ; well. Palette_OverworldBgMain2: { REP #$21 LDA.w $0AB3 : ASL : TAX LDA.l PaletteIDtoOffset_OW_Main, X : ADC.w #PaletteData_owmain : STA.b $00 REP #$10 ; Target BP2 through BP6 (first halves). ; Each palette has 7 colors. ; Load 5 palettes. LDA.w #$0042 LDX.w #$0006 LDY.w #$0004 JSR.w Palette_MultiLoad_NonBuffer SEP #$30 RTL } ; Description: Generally used to load multiple palettes for BGs. ; Upon close inspection, one sees that this algorithm is almost the same as ; the last subroutine. ; Name = Palette_MultiLoad(A, X, Y). ; Parameters: X = (number of colors in the palette - 1). ; A = offset to add to $7EC300, in other words, where to write ; in palette memory. ; Y = (number of palettes to load - 1). Palette_MultiLoad_NonBuffer: { STA.b $04 ; Save the values for future reference. STX.b $06 STY.b $08 ; The absolute address at $00 was planted in the calling function. This ; value is the bank #$1B ( => D in Rom) The address is found from $0AB6 and ; of course, store it at $02. LDA.w #$001B : STA.b $02 .nextPalette ; $0AA8 + A parameter will be the X value. LDA.w $0AA8 : CLC : ADC.b $04 : TAX LDY.b $06 ; Tell me how long the palette is. .copyColors ; We're loading A from the address set up in the calling function. LDA.b [$00] : STA.l $7EC300, X STA.l $7EC500, X ; Increment the absolute portion of the address by two, and ; decrease the color count by one. INC.b $00 : INC.b $00 INX : INX ; So basically loop (Y+1) times, taking (Y * 2 bytes) to $7EC300, X. DEY : BPL .copyColors ; This technique bumps us up to the next 4bpp (16 color) palette. LDA.b $04 : CLC : ADC.w #$0020 : STA.b $04 ; Decrease the number of palettes we have to load. DEC.b $08 BPL .nextPalette ; We're done loading palettes. RTS } LoadTransMainGFX: { ; Setup the decompression buffer address. ; $00[3] = $7E4000 STZ.b $00 LDA.b #$40 : STA.b $01 LDA.b #$7E : STA.b $02 STZ.b $04 REP #$30 ; $0E = $8A * 8 LDA.b $8A : AND.w #$00FF : ASL #3 : STA.b $0E SEP #$20 ; Sheet 0 (static 0) LDX.b $0E LDA.w Pool_OWGFXGroupTable_sheet0, X : CMP.b #$FF : BEQ .noBgGfxChange0 SEP #$10 CMP.w TransGFXModule_PriorSheets+0 : BEQ .noBgGfxChange0 TAY INC.b $04 JSL.l Decomp_bg_variableLONG .noBgGfxChange0 SEP #$10 ; Increment buffer address by 0x0600. LDA.b $01 : CLC : ADC.b #$06 : STA.b $01 REP #$10 ; Sheet 1 (static 1) LDX.b $0E LDA.w Pool_OWGFXGroupTable_sheet1, X : CMP.b #$FF : BEQ .noBgGfxChange1 SEP #$10 CMP.w TransGFXModule_PriorSheets+1 : BEQ .noBgGfxChange1 TAY INC.b $04 JSL.l Decomp_bg_variableLONG .noBgGfxChange1 SEP #$10 ; Increment buffer address by 0x0600. LDA.b $01 : CLC : ADC.b #$06 : STA.b $01 REP #$10 ; Sheet 2 (static 2) LDX.b $0E LDA.w Pool_OWGFXGroupTable_sheet2, X : CMP.b #$FF : BEQ .noBgGfxChange2 SEP #$10 CMP.w TransGFXModule_PriorSheets+2 : BEQ .noBgGfxChange2 TAY INC.b $04 JSL.l Decomp_bg_variableLONG .noBgGfxChange2 SEP #$10 ; Increment buffer address by 0x0600. LDA.b $01 : CLC : ADC.b #$06 : STA.b $01 REP #$10 ; Sheet 7 (animated) LDX.b $0E LDA.w Pool_OWGFXGroupTable_sheet7, X : CMP.b #$FF : BEQ .noBgGfxChange7 SEP #$10 CMP.w TransGFXModule_PriorSheets+7 : BEQ .noBgGfxChange7 TAY INC.b $04 JSL.l Decomp_bg_variableLONG .noBgGfxChange7 RTS } ; Prepares the transition graphics to be transferred to VRAM during NMI. ; This could occur either during this frame or any subsequent frame. PrepTransMainGFX: { ; Set bank for source address. LDA.b #$7E : STA.b $02 STA.b $05 REP #$31 ; Source address is $7E4000, number of tiles is 0x40, ; base address is $7F0000. LDX.w #$2000 LDY.w #$0040 LDA.w #$4000 ; The first graphics pack always uses the higher 8 palette values. JSL.l Do3To4High16BitLONG ; Number of tiles for next set is 0xC0. LDY.w #$00C0 LDA.b $03 JSL.l Do3To4Low16BitLONG SEP #$30 RTS } pushpc ; ============================================================================== if !Func0ABC5A == 1 org $0ABC5A ; $053C5A JSL.l CheckForChangeGraphicsNormalLoad assert pc() <= $0ABC5E ; $053C5E else org $0ABC5A ; $053C5A db $22, $9B, $E1, $00 endif pullpc ; Loads the animated tiles after the overworld map is closed. CheckForChangeGraphicsNormalLoad: { PHB : PHK : PLB JSL.l InitTilesets ; Replaced code. JSL.l ReadAnimatedTable : STA.w AnimatedTileGFXSet DEC : TAY ; This function is not needed here and is handled somewhere else. This ; forces the game to update the animated tiles when going from one area to ; another. ;JSL.l DecompOwAnimatedTiles ; PLACE CUSTOM GFX LOAD HERE! JSL Oracle_CheckForChangeGraphicsNormalLoadBoat ; TODO: Instead of the place custom gfx load here, pre-allocate a function. ; Some free space ; ZSOW_LoadCustomGraphics: ; Maybe register push/pops or leave that to users ; User defined custom graphics code ; RTL PLB RTL } pushpc ; ============================================================================== if !Func0AB8F5 == 1 ; Loads different animated tiles when returning from bird travel. org $0AB8F5 ; $0538F5 BirdTravel_LoadTargetArea_Interupt: { JSL.l ReadAnimatedTable : STA.w AnimatedTileGFXSet DEC : TAY ; From this point on it is the vanilla function. JSL.l DecompOwAnimatedTiles JSL.l Overworld_SetFixedColorAndScroll STZ.w $0AA9 STZ.w $0AB2 JSL.l InitTilesets ; Move to the next submodule (BirdTravel_LoadAmbientOverlay) the next frame. INC.w $0200 STZ.b $B2 JSL.l Overworld_ReloadSubscreenOverlayAndAdvance ; Play sound effect indicating we're coming out of map mode. LDA.b #$10 : STA.w $012F JSL.l LoadAmbientSound ; If it's a different music track than was playing where we came from, ; simply change to it (as opposed to setting volume back to full). LDA.l $7F5B00, X : AND.b #$0F : TAX : CPX.w $0130 : BNE .different_music ; Otherwise, just set the volume back to full. LDX.b #$F3 .different_music STX.w $012C ; PLACE CUSTOM GFX LOAD HERE! JSL Oracle_CheckForChangeGraphicsNormalLoadBoat RTL } assert pc() <= $0AB948 ; $053948 else org $0AB8F5 ; $0538F5 db $A0, $58, $A5, $8A, $29, $BF, $C9, $03 db $F0, $0A, $C9, $05, $F0, $06, $C9, $07 db $F0, $02, $A0, $5A, $22, $94, $D3, $00 db $22, $70, $FE, $0B, $9C, $A9, $0A, $9C db $B2, $0A, $22, $9B, $E1, $00, $EE, $00 db $02, $64, $B2, $22, $F4, $B1, $02, $A9 db $10, $8D, $2F, $01, $A6, $8A, $BF, $00 db $5B, $7F, $4A, $4A, $4A, $4A, $8D, $2D db $01, $BF, $00, $5B, $7F, $29, $0F, $AA db $EC, $30, $01, $D0, $02, $A2, $F3, $8E db $2C, $01, $6B endif pullpc LoadAmbientSound: { PHB : PHK : PLB ; Reset the ambient sound effect to what it was. LDX.b $8A LDA.l $7F5B00, X : LSR #4 : STA.w $012D ; Check if we need to stop the rain sound in the misery mire. LDA.w Pool_EnableRainMireEvent : BEQ .disableRainSound LDA.b $8A : CMP.b #$70 : BNE .disableRainSound ; Has Misery Mire been triggered yet? LDA.l $7EF2F0 : AND.b #$20 : BNE .disableRainSound LDA.b #$01 : STA.w $012D .disableRainSound PLB RTL } pushpc ; ============================================================================== if !Func0BFEB6 == 1 ; There is a STZ.b $1D here in vanilla and I'm not sure why. It might have been ; to hide something but then just gets set a second later. So all this does in ; function is give the game a chance to hit NMI and flash a transparent color ; on screen when while warping from and area that has a different transparent ; color set. The whole function is NOT overwritten so that the default BG color ; values that get set here will retain their positions in ROM and can be changed ; in ZS. org $0BFE70 ; $05FE70 NOP : NOP ; Loads different special transparent colors and overlay speeds based on the ; overlay during transition and under other certain cases. TODO: Exact cases need ; to be investigated. When leaving dungeon. org $0BFEB6 ; $05FEB6 Overworld_LoadBGColorAndSubscreenOverlay: { JSL.l ReplaceBGColor ; Set fixed color to neutral. LDA.w #$4020 : STA.b $9C LDA.w #$8040 : STA.b $9D ; Check if we need to load the rain in the misery mire. LDA.l Pool_EnableRainMireEvent : BEQ .notMire LDA.b $8A : CMP.w #$0070 : BNE .notMire ; Has Misery Mire been triggered yet? LDA.l $7EF2F0 : AND.w #$0020 : BNE .notMire JMP.w .subscreenOnAndReturn .notMire JSL.l ReadOverlayArray ; Check for misery mire. CMP.w #$009F : BNE .notRain JMP.w .subscreenOnAndReturn .notRain ; Change the fixed color depending on our sub screen overlay. ; Check for lost woods?, skull woods, and pyramid area. CMP.w #$009D : BEQ .noCustomFixedColor CMP.w #$0096 : BEQ .noCustomFixedColor LDX.w #$4C26 LDY.w #$8C4C ; Check for LW Death mountain. CMP.w #$0095 : BEQ .setCustomFixedColor LDX.w #$4A26 LDY.w #$874A ; Check for DW Death mountain. (not turtle rock?). CMP.w #$009C : BEQ .setCustomFixedColor SEP #$30 ; Set A, X, and Y in 8bit mode. ; Don't set the subscreen during a warp to hide the transparent ; color change. This will get set properly later in the warp ; but not everywhere else. LDA.b $11 : CMP.b #$23 : BEQ .inWarp STZ.b $1D .inWarp ; Update CGRAM this frame. INC.b $15 RTL .setCustomFixedColor ; Set the fixed color addition color values. STX.b $9C STY.b $9D .noCustomFixedColor LDA.b $11 : AND.w #$00FF : CMP.w #$0004 : BEQ .BRANCH_11 ; Make sure BG2 and BG1 Y scroll values are synchronized. ; Same for X scroll. LDA.b $E8 : STA.b $E6 LDA.b $E2 : STA.b $E0 ; Just because I need a bit more space. JSL.l ReadOverlayArray ; Are we at Hyrule Castle or Pyramid of Power? CMP.w #$0096 : BNE .subscreenOnAndReturn JSL.l SpecialBgHorizOffsetAdjustment BRA .subscreenOnAndReturn .BRANCH_11 ; Check for the pyramid BG. JSL.l ReadOverlayArray : CMP.w #$0096 : BNE .subscreenOnAndReturn ; Synchronize Y scrolls on BG0 and BG1. Same for X scrolls. LDA.b $E8 : STA.b $E6 LDA.b $E2 : STA.b $E0 LDA.w $0410 : AND.w #$00FF : CMP.w #$0008 : BEQ .BRANCH_12 ; Handles scroll for special areas maybe? LDA.w #$0838 : STA.b $E0 .BRANCH_12 LDA.w #$06C0 : STA.b $E6 .subscreenOnAndReturn SEP #$30 ; Set A, X, and Y in 8bit mode. ; Put BG0 on the subscreen. LDA.b #$01 : STA.b $1D ; Update palette. INC.b $15 RTL } assert pc() <= $0BFFA8 ; $05FFA8 else org $0BFE70 ; $05FE70 STZ.b $1D org $0BFEB6 ; $05FEB6 db $8F, $00, $C5, $7E, $8F, $00, $C3, $7E db $8F, $40, $C5, $7E, $8F, $40, $C3, $7E db $A9, $20, $40, $85, $9C, $A9, $40, $80 db $85, $9D, $A5, $8A, $F0, $40, $C9, $70 db $00, $D0, $03, $4C, $9D, $FF, $C9, $40 db $00, $F0, $33, $C9, $5B, $00, $F0, $2E db $A2, $26, $4C, $A0, $4C, $8C, $C9, $03 db $00, $F0, $1F, $C9, $05, $00, $F0, $1A db $C9, $07, $00, $F0, $15, $A2, $26, $4A db $A0, $4A, $87, $C9, $43, $00, $F0, $0A db $C9, $45, $00, $F0, $05, $E2, $30, $E6 db $15, $6B, $86, $9C, $84, $9D, $A5, $11 db $29, $FF, $00, $C9, $04, $00, $F0, $58 db $A5, $E8, $85, $E6, $A5, $E2, $85, $E0 db $A5, $8A, $29, $3F, $00, $C9, $1B, $00 db $D0, $6D, $A5, $E2, $38, $E9, $78, $07 db $4A, $A8, $29, $00, $40, $F0, $05, $98 db $09, $00, $80, $A8, $84, $00, $A5, $E2 db $38, $E5, $00, $85, $E0, $A5, $E6, $C9 db $C0, $06, $90, $17, $38, $E9, $00, $06 db $29, $FF, $03, $C9, $80, $01, $B0, $06 db $4A, $09, $00, $06, $80, $0E, $A9, $C0 db $06, $80, $09, $A5, $E6, $29, $FF, $00 db $4A, $09, $00, $06, $85, $E6, $80, $27 db $A5, $8A, $29, $3F, $00, $C9, $1B, $00 db $D0, $1D, $A5, $E8, $85, $E6, $A5, $E2 db $85, $E0, $AD, $10, $04, $29, $FF, $00 db $C9, $08, $00, $F0, $05, $A9, $38, $08 db $85, $E0, $A9, $C0, $06, $85, $E6, $E2 db $20, $A9, $01, $85, $1D, $E2, $30, $E6 db $15, $6B endif pullpc ReplaceBGColor: { PHB : PHK : PLB SEP #$20 ; Set A in 8bit mode. LDA.w Pool_EnableBGColor : BNE .custom REP #$20 ; Set A in 16bit mode. PLB RTL .custom REP #$20 ; Set A in 16bit mode. ; Get area code and times it by 2. Get the color. LDA.b $8A : ASL : TAX LDA.w Pool_BGColorTable, X : PHA SEP #$20 ; Set A in 8bit mode. ; TODO: Pretty sure this is needed. Just keep an eye out for it. ; Set the buffer color when exiting to the OW to prevent a bug when using ; the map in an area with a subscreen overlay. LDA.b $10 : CMP.b #$08 : BEQ .setBuffer CMP.b #$0A : BEQ .setBuffer ; Set the buffer color during warps. LDA.b $11 : CMP.b #$23 : BNE .notWarp .setBuffer REP #$20 ; Set A in 16bit mode. ; Set the BG color buffer. PLA STA.l $7EE018 JSL Oracle_BackgroundFix ; $3482DD ; Background Fix ; STA.l $7EC300 : STA.l $7EC340 ; Set the BG color. ; STA.l $7EC500 : STA.l $7EC540 BRA .skipActualColor .notWarp REP #$20 ; Set A in 16bit mode. ; Set the BG color. PLA STA.l $7EE018 JSL Oracle_BackgroundFix ; STA.l $7EC500 ; STA.l $7EC540 .skipActualColor PLB RTL } ; This sets the initial scroll offsets for the pyramid BG. It seems highly ; hardcoded and overly complicated. it could probably be changed to just a ; standard clamp function to keep it from being too high or too low. SpecialBgHorizOffsetAdjustment: { LDA.b $E2 : SEC : SBC.w #$0778 : LSR : TAY : AND.w #$4000 : BEQ .BRANCH_7 TYA : ORA.w #$8000 : TAY .BRANCH_7 STY.b $00 LDA.b $E2 : SEC : SBC.b $00 : STA.b $E0 LDA.b $E6 : CMP.w #$06C0 : BCC .BRANCH_9 SEC : SBC.w #$0600 : AND.w #$03FF : CMP.w #$0180 : BCS .BRANCH_8 LSR : ORA.w #$0600 BRA .BRANCH_10 .BRANCH_8 LDA.w #$06C0 BRA .BRANCH_10 .BRANCH_9 LDA.b $E6 : AND.w #$00FF : LSR : ORA.w #$0600 .BRANCH_10 ; Set BG1 vertical scroll. STA.b $E6 RTL } pushpc ; ============================================================================== if !Func0ED627 == 1 ; Loads the transparent color during mirror\warp, entering/leaving special ; overworlds, exiting dungeons, loading end credits overworld scenes, whirlpool ; warps, and bird travel. org $0ED627 ; $075627 JML.l InitColorLoad2 NOP assert pc() <= $0ED62C ; $07562C else org $0ED627 ; $075627 db $A5, $8A, $C9, $80, $00 endif org $0ED652 ; $075652 InitColorLoad2_Return: pullpc InitColorLoad2: { PHB : PHK : PLB ; $0181 is the exit room number used for getting into the under the bridge ; area. LDA.b $A0 : CMP.w #$0181 : BNE .notBridge LDA.w Pool_BGColorTable_Bridge BRA .storeColor .notBridge ; Get area code and times it by 2. LDA.b $8A : ASL : TAX ; Get the color. LDA.w Pool_BGColorTable, X .storeColor ; Set transparent color. STA.l $7EC300 STA.l $7EC340 ; Set transparent color. ; TODO: Based on the conditions as explained above, double check that this is ; not needed for any of them. ;STA.l $7EC500 ;STA.l $7EC540 INC.b $15 PLB JML.l InitColorLoad2_Return } pushpc ; ============================================================================== if !Func0ED8AE == 1 ; Resets the area special color after the screen flashes. org $0ED8AE ; $0758AE Palette_RestoreFixedColor_Interupt: { LDA.b $1B : BNE .noSpecialColor REP #$30 ; Set A, X, and Y in 16bit mode. LDX.w #$4020 : STX.b $9C LDX.w #$8040 : STX.b $9D LDX.w #$4F33 LDY.w #$894F ; Change the fixed color depending on our sub screen overlay. ; Lost woods and skull woods. JSL.l ReadOverlayArray : CMP.w #$009D : BEQ .noSpecialColor CMP.w #$0040 : BEQ .noSpecialColor ; Pyramid area. CMP.w #$0096 : BEQ .specialColor LDX.w #$4C26 LDY.w #$8C4C ; LW death mountain. CMP.w #$0095 : BEQ .specialColor LDX.w #$4A26 LDY.w #$874A ; DW death mountain. CMP.w #$009C : BEQ .specialColor BRA .noSpecialColor .specialColor STX.b $9C STY.b $9D .noSpecialColor SEP #$30 ; Set A, X, and Y in 8bit mode. RTL } assert pc() <= $0ED8FB ; $0758FB else org $0ED8AE ; $0758AE db $A5, $1B, $D0, $46, $C2, $10, $A2, $20 db $40, $86, $9C, $A2, $40, $80, $86, $9D db $A2, $33, $4F, $A0, $4F, $89, $A5, $8A db $F0, $30, $C9, $40, $F0, $2C, $C9, $5B db $F0, $24, $A2, $26, $4C, $A0, $4C, $8C db $C9, $03, $F0, $1A, $C9, $05, $F0, $16 db $C9, $07, $F0, $12, $A2, $26, $4A, $A0 db $4A, $87, $C9, $43, $F0, $08, $C9, $45 db $F0, $04, $C9, $47, $D0, $04, $86, $9C db $84, $9D, $E2, $10, $6B endif ; ============================================================================== if !Func00D585 == 1 ; Interupts the vanilla LoadTransAuxGFX function org $00D673 ; $005673 JML.l NewLoadTransAuxGFX assert pc() <= $00D677 ; $005677 org $00D677 ; $005677 LoadTransAuxGFX_return: org $008C8A ; $000C8A dw NMI_UpdateChr_Bg2HalfAndAnimated assert pc() <= $008C8C ; $000C8C org $02ABB4 ; $012BB4 JSL.l NewPrepTransAuxGFX assert pc() <= $02ABB8 ; $012BB8 ; Replaces the UNREACHABLE_00D585 which is unused. org $00D585 ; $005585 Decomp_bg_variableLONG: { PHB : PHK : PLB JSR.w Decomp_bg_variable PLB RTL } Do3To4Low16BitLONG: { PHB : PHK : PLB JSR.w Do3To4Low16Bit PLB RTL } Do3To4High16BitLONG: { PHB : PHK : PLB JSR.w Do3To4High16Bit PLB RTL } NMI_UpdateChr_Bg2HalfAndAnimated: { JSL.l NMI_UpdateChr_Bg2HalfAndAnimatedLONG RTS } assert pc() <= $00D5CB ; $0055CB else org $00D673 ; $005673 db $A9, $60, $85, $01 org $008C8A ; $000C8A db $4B, $8E org $00D585 ; $005585 db $A0, $08, $00, $84, $0E, $85, $00, $18 db $69, $10, $00, $85, $03, $A0, $07, $00 db $A7, $00, $9F, $00, $90, $7E, $E6, $00 db $E6, $00, $A7, $03, $29, $FF, $00, $9F db $10, $90, $7E, $E6, $03, $E8, $E8, $88 db $10, $E6, $8A, $18, $69, $10, $00, $AA db $A5, $03, $29, $78, $00, $D0, $08, $A5 db $03, $18, $69, $80, $01, $85, $03, $A5 db $03, $C6, $0E, $D0, $C0, $60 endif pullpc NewLoadTransAuxGFX: { PHB : PHK : PLB LDA.b $1B : BNE .indoors LDA.w Pool_EnableTransitionGFXGroupLoad : BNE .notNormalLoad .indoors PLB ; Replaced code: LDA.b #$60 : STA.b $01 ; Return to regular code. JML.l LoadTransAuxGFX_return .notNormalLoad ; Setup the decompression buffer address. ; $00[3] = $7E6000 STZ.b $00 LDA.b #$60 : STA.b $01 LDA.b #$7E : STA.b $02 STZ.b $04 REP #$30 ; $0E = $8A * 8 LDA.b $8A : AND.w #$00FF : ASL #3 : STA.b $0E SEP #$20 ; Sheet 3 (variable 0) LDX.b $0E LDA.w Pool_OWGFXGroupTable_sheet3, X : CMP.b #$FF : BEQ .noBgGfxChange3 SEP #$10 CMP.w TransGFXModule_PriorSheets+3 : BEQ .noBgGfxChange3 TAY INC.b $04 JSL.l Decomp_bg_variableLONG .noBgGfxChange3 SEP #$10 ; Increment buffer address by 0x0600. LDA.b $01 : CLC : ADC.b #$06 : STA.b $01 REP #$10 ; Sheet 4 (variable 1) LDX.b $0E LDA.w Pool_OWGFXGroupTable_sheet4, X : CMP.b #$FF : BEQ .noBgGfxChange4 SEP #$10 CMP.w TransGFXModule_PriorSheets+4 : BEQ .noBgGfxChange4 TAY INC.b $04 JSL.l Decomp_bg_variableLONG .noBgGfxChange4 SEP #$10 ; Increment buffer address by 0x0600. LDA.b $01 : CLC : ADC.b #$06 : STA.b $01 REP #$10 ; Sheet 5 (variable 2) LDX.b $0E LDA.w Pool_OWGFXGroupTable_sheet5, X : CMP.b #$FF : BEQ .noBgGfxChange5 SEP #$10 CMP.w TransGFXModule_PriorSheets+5 : BEQ .noBgGfxChange5 TAY INC.b $04 JSL.l Decomp_bg_variableLONG .noBgGfxChange5 SEP #$10 ; Increment buffer address by 0x0600. LDA.b $01 : CLC : ADC.b #$06 : STA.b $01 REP #$10 ; Sheet 6 (variable 3) LDX.b $0E LDA.w Pool_OWGFXGroupTable_sheet6, X : CMP.b #$FF : BEQ .noBgGfxChange6 SEP #$10 CMP.w TransGFXModule_PriorSheets+6 : BEQ .noBgGfxChange6 TAY INC.b $04 JSL.l Decomp_bg_variableLONG .noBgGfxChange6 SEP #$10 ; Increment buffer address by 0x0600. LDA.b $01 : CLC : ADC.b #$06 : STA.b $01 REP #$10 STZ.w TransGFXModuleFrame PLB ; $005706 Return to regular code. JML.l LoadTransAuxGFX_sprite_continue } NMI_UpdateChr_Bg2HalfAndAnimatedLONG: { PHB : PHK : PLB REP #$20 ; Increment on writes to SNES.VRAMDataWriteHigh. LDY.b #$80 : STY.w SNES.VRAMAddrIncrementVal ; Target is SNES.VRAMDataWriteLow, write two registers once ; (SNES.VRAMDataWriteLow / SNES.VRAMDataWriteHigh). LDA.w #$1801 : STA.w DMA.0_TransferParameters LDA.w NewNMICount1 : BEQ .skipFirst ; Sheet 1 ; Target address LDA.w NewNMITarget1 : STA.w SNES.VRAMAddrReadWriteLow ; Source address LDA.w NewNMISource1 : STA.w DMA.0_SourceAddrOffsetLow LDY.b #$7F : STY.w DMA.0_SourceAddrBank ; Write count LDA.w NewNMICount1 : STA.w DMA.0_TransferSizeLow ; Transfer data on channel 0. LDY.b #$01 : STY.w SNES.DMAChannelEnable .skipFirst LDA.w NewNMICount2 : BEQ .skipSecond ; Sheet 2 ; Target address LDA.w NewNMITarget2 : STA.w SNES.VRAMAddrReadWriteLow ; Source address LDA.w NewNMISource2 : STA.w DMA.0_SourceAddrOffsetLow LDY.b #$7F : STY.w DMA.0_SourceAddrBank ; Write count LDA.w NewNMICount2 : STA.w DMA.0_TransferSizeLow ; Transfer data on channel 0. LDY.b #$01 : STY.w SNES.DMAChannelEnable .skipSecond SEP #$20 STZ.w $0710 PLB RTL } NewPrepTransAuxGFX: { LDA.b $04 : BEQ .dontPrep JSL.l PrepTransAuxGFX .dontPrep RTL } pushpc ; ============================================================================== if !Func00E221 == 1 org $00E221 ; $006221 JML.l InitTilesetsLongCalls assert pc() <= $00E225 ; $006225 org $00D904 ; $005904 JML.l AnimateMirrorWarp_DecompressNewTileSetsLongCalls assert pc() <= $00D908 ; $005908 org $00D97D ; $00597D JML.l AnimateMirrorWarp_DecompressNewTileSetsLongCalls2 assert pc() <= $00D981 ; $005981 org $00D9BC ; $0059BC JML.l AnimateMirrorWarp_DecompressBackgroundsALongCalls assert pc() <= $00D9C1 ; $0059C1 org $00DA2F ; $005A2F JML.l AnimateMirrorWarp_DecompressBackgroundsCLongCalls else org $00E221 ; $006221 db $AD, $A1, $0A, $29 org $00D904 ; $005904 db $AD, $A1, $0A, $29 org $00D97D ; $00597D db $BF, $EF, $D8, $00 org $00D9BC ; $0059BC db $BF, $F1, $D8, $00 org $00DA2F ; $005A2F db $BF, $F3, $D8, $00 endif pullpc InitTilesetsLongCalls: { SEP #$20 ; TODO: This will eventually be changed when changing the dungeon GFX. LDA.b $10 : CMP.b #$0E : BNE .notMapMode ; Mode 0x0E is the map mode for both the OW and in dungeons. ; So we need to check where we are here. LDA.b $1B : BEQ .outdoors ; Indoors .notMapMode ; TODO: This will eventually be changed when changing the dungeon GFX. ; Only trigger the new code when in certain outdoor modes. ; Modes 0x08 through 0x0B are outdoor related modes. LDA.b $10 : CMP.b #$08 : BCC .regularLoad CMP.b #$0C : BCC .outdoors .regularLoad REP #$30 ; Replaced code. LDA.w $0AA1 : AND.w #$00FF ; Return to normal code. JML.l $00E227 ; $006227 .outdoors PHB : PHK : PLB REP #$30 LDA.b $8A : AND.w #$00FF : ASL #3 : TAX LDA.b $8A : AND.w #$00C0 : LSR #3 : TAY ; (Area / 8) = LW, DW, or SW *8 SEP #$20 LDA.w Pool_OWGFXGroupTable_sheet0, X : CMP.b #$FF : BNE .notFF0 LDA.w Pool_DefaultGFXGroups_sheet0, Y .notFF0 STA.b $0D STA.w TransGFXModule_PriorSheets+0 LDA.w Pool_OWGFXGroupTable_sheet1, X : CMP.b #$FF : BNE .notFF1 LDA.w Pool_DefaultGFXGroups_sheet1, Y .notFF1 STA.b $0C STA.w TransGFXModule_PriorSheets+1 LDA.w Pool_OWGFXGroupTable_sheet2, X : CMP.b #$FF : BNE .notFF2 LDA.w Pool_DefaultGFXGroups_sheet2, Y .notFF2 STA.b $0B STA.w TransGFXModule_PriorSheets+2 LDA.w Pool_OWGFXGroupTable_sheet3, X : CMP.b #$FF : BNE .notFF3 LDA.w Pool_DefaultGFXGroups_sheet3, Y .notFF3 STA.l $7EC2F8 STA.b $0A STA.w TransGFXModule_PriorSheets+3 LDA.w Pool_OWGFXGroupTable_sheet4, X : CMP.b #$FF : BNE .notFF4 LDA.w Pool_DefaultGFXGroups_sheet4, Y .notFF4 STA.l $7EC2F9 STA.b $09 STA.w TransGFXModule_PriorSheets+4 LDA.w Pool_OWGFXGroupTable_sheet5, X : CMP.b #$FF : BNE .notFF5 LDA.w Pool_DefaultGFXGroups_sheet5, Y .notFF5 STA.l $7EC2FA STA.b $08 STA.w TransGFXModule_PriorSheets+5 LDA.w Pool_OWGFXGroupTable_sheet6, X : CMP.b #$FF : BNE .notFF6 LDA.w Pool_DefaultGFXGroups_sheet6, Y .notFF6 STA.l $7EC2FB STA.b $07 STA.w TransGFXModule_PriorSheets+6 LDA.w Pool_OWGFXGroupTable_sheet7, X : CMP.b #$FF : BNE .notFF7 LDA.w Pool_DefaultGFXGroups_sheet7, Y .notFF7 STA.b $06 STA.w TransGFXModule_PriorSheets+7 PLB ; $006282 Skip normal sheet load. JML.l $00E282 } AnimateMirrorWarp_DecompressNewTileSetsLongCalls: { PHB : PHK : PLB LDA.b $8A : AND.w #$00FF : ASL #3 : TAX LDA.b $8A : AND.w #$00C0 : LSR #3 : TAY ; (Area / 8) = LW, DW, or SW *8 SEP #$20 LDA.w Pool_OWGFXGroupTable_sheet3, X : CMP.b #$FF : BNE .notFF3 LDA.w Pool_DefaultGFXGroups_sheet3, Y .notFF3 STA.l $7EC2F8 STA.w TransGFXModule_PriorSheets+3 LDA.w Pool_OWGFXGroupTable_sheet4, X : CMP.b #$FF : BNE .notFF4 LDA.w Pool_DefaultGFXGroups_sheet4, Y .notFF4 STA.l $7EC2F9 STA.w TransGFXModule_PriorSheets+4 LDA.w Pool_OWGFXGroupTable_sheet5, X : CMP.b #$FF : BNE .notFF5 LDA.w Pool_DefaultGFXGroups_sheet5, Y .notFF5 STA.l $7EC2FA STA.w TransGFXModule_PriorSheets+5 LDA.w Pool_OWGFXGroupTable_sheet6, X : CMP.b #$FF : BNE .notFF6 LDA.w Pool_DefaultGFXGroups_sheet6, Y .notFF6 STA.l $7EC2FB STA.w TransGFXModule_PriorSheets+6 PLB ; $005949 Skip normal sheet load. JML.l $00D949 } AnimateMirrorWarp_DecompressNewTileSetsLongCalls2: { PHB : PHK : PLB REP #$30 LDA.b $8A : AND.w #$00FF : ASL #3 : TAX LDA.b $8A : AND.w #$00C0 : LSR #3 : TAY ; (Area / 8) = LW, DW, or SW *8 SEP #$20 LDA.w Pool_OWGFXGroupTable_sheet1, X : CMP.b #$FF : BNE .notFF1 LDA.w Pool_DefaultGFXGroups_sheet1, Y .notFF1 STA.b $08 STA.w TransGFXModule_PriorSheets+1 LDA.w Pool_OWGFXGroupTable_sheet0, X : CMP.b #$FF : BNE .notFF0 LDA.w Pool_DefaultGFXGroups_sheet0, Y .notFF0 TAY STA.w TransGFXModule_PriorSheets+0 SEP #$10 PLB ; $005988 Skip normal sheet load. JML.l $00D988 } AnimateMirrorWarp_DecompressBackgroundsALongCalls: { PHB : PHK : PLB REP #$30 LDA.b $8A : AND.w #$00FF : ASL #3 : TAX LDA.b $8A : AND.w #$00C0 : LSR #3 : TAY ; (Area / 8) = LW, DW, or SW *8 SEP #$20 LDA.w Pool_OWGFXGroupTable_sheet3, X : CMP.b #$FF : BNE .notFF3 LDA.w Pool_DefaultGFXGroups_sheet3, Y .notFF3 STA.b $08 STA.w TransGFXModule_PriorSheets+3 LDA.w Pool_OWGFXGroupTable_sheet2, X : CMP.b #$FF : BNE .notFF2 LDA.w Pool_DefaultGFXGroups_sheet2, Y .notFF2 TAY STA.w TransGFXModule_PriorSheets+2 SEP #$10 PLB ; $0059C7 Skip normal sheet load. JML.l $00D9C7 } AnimateMirrorWarp_DecompressBackgroundsCLongCalls: { PHB : PHK : PLB REP #$30 LDA.b $8A : AND.w #$00FF : ASL #3 : TAX LDA.b $8A : AND.w #$00C0 : LSR #3 : TAY ; (Area / 8) = LW, DW, or SW *8 SEP #$20 LDA.w Pool_OWGFXGroupTable_sheet7, X : CMP.b #$FF : BNE .notFF7 LDA.w Pool_DefaultGFXGroups_sheet7, Y .notFF7 STA.b $08 STA.w AnimatedTileGFXSet STA.w TransGFXModule_PriorSheets+7 LDA.w Pool_OWGFXGroupTable_sheet6, X : CMP.b #$FF : BNE .notFF6 LDA.w Pool_DefaultGFXGroups_sheet6, Y .notFF6 TAY STA.w TransGFXModule_PriorSheets+6 SEP #$10 PLB ; $005A3A Skip normal sheet load. JML.l $00DA3A } pushpc ; ============================================================================== if !Func00E221 == 1 org $02B490 ; $013490 JSL.l Whirlpool_LoadDestinationMap_Interupt else org $02B490 ; $013490 JSL.l BirdTravel_LoadAmbientOverlay endif pullpc Whirlpool_LoadDestinationMap_Interupt: { ; Replaced code. JSL.l BirdTravel_LoadAmbientOverlay STZ.w TransGFXModuleFrame RTL } pushpc ; ============================================================================== if !Func02A9C4 == 1 org $02A9C4 ; $0129C4 OverworldHandleTransitions: { ; Tells us which direction we're scrolling in. LDA.w $0416 : BEQ .noScroll JSR.w Overworld_ScrollMap .noScroll REP #$20 ; Check if link is moving up/down. LDA.b $30 : AND.w #$00FF : BEQ .noDeltaY LDA.b $67 : AND.w #$000C : STA.b $00 REP #$10 LDA.b $8A : ASL : TAX LDA.b $20 : SEC : SBC.l Pool_OverworldTransitionPositionY_New, X SEP #$10 ; Transitioning up. LDY.b #$06 LDX.b #$08 CMP.w #$0004 : BCC .checkDirection ; Transitioning down. LDY.b #$04 LDX.b #$04 CMP.w OWCameraBoundsS : BCS .checkDirection .noDeltaY ; Check if Link is moving right/left. LDA.b $31 : AND.w #$00FF : BEQ .noDeltaX ; Add an offset to the X position. LDA.w OWCameraBoundsE : CLC : ADC.w #$0004 : STA.b $02 LDA.b $67 : AND.w #$0003 : STA.b $00 REP #$10 LDA.b $8A : ASL : TAX LDA.b $22 : SEC : SBC.l Pool_OverworldTransitionPositionX_New, X SEP #$10 ; Transitioning left. LDY.b #$02 LDX.b #$02 CMP.w #$0006 : BCC .checkDirection ; Transitioning right. LDY.b #$00 LDX.b #$01 CMP.b $02 : BCC .noTransition .checkDirection ; Check if the direction the player is moving matches the boundary we hit: CPX.b $00 : BEQ .transition .noTransition .noDeltaX JSL.l Overworld_CheckForSpecialOverworldTrigger RTS ; Triggers when Link finally reaches the edge of the screen and is moving ; in that direction. .transition SEP #$20 ; Just makes sure we're not using a medallion or input is disabled. JSL.l Player_IsScreenTransitionPermitted : BCS .noTransition STY.b $02 : STZ.b $03 JSR.w DeleteCertainAncillaeStopDashing REP #$31 ; Remove potential large world offest. LDX.b $02 LDA.b $84 : AND.l OverworldScreenTileMapChange_Masks, X : STA.b $84 ; $0700 does not store the world we are in, so we need to extract it ; from $8A and then apply it to $0700. We cannot just shift $8A instead ; because $0700 is the true area and not the "parent" area. LDA.b $8A : AND.w #$00C0 : ASL ORA.w $0700 : CLC : ADC.l OverworldScreenIDChange, X : STA.b $04 ; X here equals which direction we are currently moving to. ; 0x00 - Right ; 0x02 - Left ; 0x04 - Down ; 0x06 - Up CLC : ADC.l .ByScreenAddresses, X : TAX LDA.b $84 : CLC : ADC.l Pool_ByScreen1_New, X : STA.b $84 LDA.b $04 : LSR : TAX SEP #$30 LDA.b $8A : PHA ; Set the OW area number. ; LDA.l Pool_Overworld_ActualScreenID_New, X JSL Oracle_LostWoods STA.b $8A STA.w $040A TAX ; HARDCODED: Bunny music. LDA.l $7EF3CA : BEQ .lightWorld ; Check for moon pearl. LDA.l $7EF357 : BEQ .noMusicChange .lightWorld ; Extract the ambient sound from this array. LDA.l $7F5B00, X : LSR #4 : BNE .ambientSound LDA.b #$05 : STA.w $012D ; No ambient sound. .ambientSound LDA.l $7F5B00, X : AND.b #$0F : CMP.w $0130 : BEQ .noMusicChange LDA.b #$F1 : STA.w $012C .noMusicChange JSR.w Overworld_LoadMapProperties LDA.b #$01 : STA.b $11 LDA.b $00 : STA.w $0410 STA.w $0416 LDX.b #$04 ; Converts a bitwise direction indicator to a value based one. .loop DEX LSR : BCC .loop STX.w $0418 STX.w $069C STZ.w $0696 : STZ.w $0698 : STZ.w $0126 ; ----udlr ; u - Up ; d - Down ; l - Left ; r - Right ; Check if the area we are in needs a mosaic. ; Filter out the the direction of the transition we are looking for. PLX LDA.l Pool_MosaicTable, X : AND.w $0416 : BEQ .noMosaic ; Trigger a mosaic transition. ; Send us to a submodule that will handle a mosaic transition. LDA.b #$0D : STA.b $11 ; Reset mosaic settings. LDA.b #$00 : STA.b $95 STA.l $7EC011 STA.b $B0 RTS .noMosaic LDX.b $8A LDA.l $7EFD40, X : STA.b $00 LDA.l OverworldPalettesScreenToSet_New, X JSL.l Overworld_LoadPalettes JSR.w Overworld_CgramAuxToMain RTS } assert pc() <= $02AB08 ; $012B08 org $02A62C ; $01262C OverworldScreenTileMapChange: { ; These mask values are changed to fix several vanilla issues surrounding ; large areas. Moving from one large area to another twords the center of ; the side would cause a broken transition. A large area next to another ; but offset by the length of another would also cause a broken transition. ; $01262C .Masks if !Func02A62C == 1 dw $1F80, $1F80, $007F, $007F else dw $0F80, $0F80, $003F, $003F endif } assert pc() <= $02A634 ; $012634 ; This table was moved from its original location at $012834 to make more ; space for the bigger tables down below. Replaces a few bytes from ; OverworldScreenTileMapChange_ByScreen1. org $02A634 ; $012634 OverworldScreenIDChange: { dw $0002, $FFFE, $0010, $FFF0 } assert pc() <= $02A63C ; $01263C ; This table was moved from its original location at $01283C to make more ; space for the bigger tables down below. This now replaces a few bytes from ; OverworldScreenTileMapChange_ByScreen1. org $02A63C ; $01263C OverworldMixedCoordsChange: { dw $FFF0, $0010, $FFFE, $0002 } assert pc() <= $02A644 ; $012644 ; This table was moved from its original location at $016DC5. This now replaces ; OverworldScreenTileMapChange_ByScreen1, OverworldScreenTileMapChange_ByScreen2 ; and part of OverworldScreenTileMapChange_ByScreen3. org $02A644 ; $012644 Overworld_HandleOverlaysAndBombDoors_bombable_door_location_New: ; This table was moved from its original location at $0DC2F9. This now replaces ; part of OverworldScreenTileMapChange_ByScreen3 and all of the following ; OverworldScreenTileMapChange_ByScreen4, ; OverworldScreenIDChange, OverworldMixedCoordsChange, ; OverworldScreenSizeFlag, and OverworldScreenSizeHighByte. ; The bytes of space at $0DC2F9 is now unused. The references to this table are ; updated by ZS itself. org $02A784 ; $012784 OverworldData_HiddenItems_New: ; Update this address. org $02C098 ; $014098 ADC.w OverworldMixedCoordsChange, Y else org $02A9C4 ; $0129C4 db $AD, $16, $04, $F0, $03, $20, $73, $F2 db $C2, $20, $A5, $30, $29, $FF, $00, $F0 db $23, $A5, $67, $29, $0C, $00, $85, $00 db $AE, $00, $07, $A5, $20, $38, $FF, $C4 db $A8, $02, $A0, $06, $A2, $08, $C9, $04 db $00, $90, $3B, $A0, $04, $A2, $04, $CD db $16, $07, $B0, $32, $A5, $31, $29, $FF db $00, $F0, $2F, $AD, $16, $07, $18, $69 db $04, $00, $85, $02, $A5, $67, $29, $03 db $00, $85, $00, $AE, $00, $07, $A5, $22 db $38, $FF, $44, $A9, $02, $A0, $02, $A2 db $02, $C9, $06, $00, $90, $08, $A0, $00 db $A2, $01, $C5, $02, $90, $04, $E4, $00 db $F0, $05, $22, $49, $DE, $0E, $60, $E2 db $20, $22, $39, $F4, $07, $B0, $F3, $84 db $02, $64, $03, $20, $0C, $8B, $C2, $31 db $A6, $02, $A5, $84, $3F, $2C, $A6, $02 db $85, $84, $AD, $00, $07, $18, $7F, $34 db $A8, $02, $48, $85, $04, $8A, $0A, $0A db $0A, $0A, $0A, $0A, $05, $04, $AA, $A5 db $84, $18, $7F, $34, $A6, $02, $85, $84 db $68, $4A, $AA, $E2, $30, $A5, $8A, $48 db $C9, $2A, $D0, $05, $A9, $80, $8D, $2D db $01, $BF, $EC, $A5, $02, $0F, $CA, $F3 db $7E, $85, $8A, $8D, $0A, $04, $AA, $AF db $CA, $F3, $7E, $F0, $06, $AF, $57, $F3 db $7E, $F0, $1F, $BF, $00, $5B, $7F, $4A db $4A, $4A, $4A, $D0, $05, $A9, $05, $8D db $2D, $01, $BF, $00, $5B, $7F, $29, $0F db $CD, $30, $01, $F0, $05, $A9, $F1, $8D db $2C, $01, $20, $08, $AB, $A9, $01, $85 db $11, $A5, $00, $8D, $10, $04, $8D, $16 db $04, $A2, $04, $CA, $4A, $90, $FC, $8E db $18, $04, $8E, $9C, $06, $9C, $96, $06 db $9C, $98, $06, $9C, $26, $01, $68, $29 db $3F, $F0, $06, $A5, $8A, $29, $BF, $D0 db $0F, $64, $B0, $A9, $0D, $85, $11, $A9 db $00, $85, $95, $8F, $11, $C0, $7E, $60 db $A6, $8A, $BF, $40, $FD, $7E, $85, $00 db $BF, $1C, $FD, $00, $22, $A8, $D5, $0E db $20, $69, $C7, $60 org $02A62C ; $01262C dw $0F80, $0F80, $003F, $003F org $02C098 ; $014098 db $79, $3C, $A8 endif pullpc OverworldHandleTransitions_ByScreenAddresses: { dw Pool_ByScreen1_New-Pool_ByScreen1_New dw Pool_ByScreen2_New-Pool_ByScreen1_New dw Pool_ByScreen3_New-Pool_ByScreen1_New dw Pool_ByScreen4_New-Pool_ByScreen1_New } pushpc ; ============================================================================== ; This section changes how all of the camera values get set. if !Func02C0C3 == $01 org $02C0C3 ; $0140C3 Overworld_SetCameraBounds_Interupt: { JSL.l NewOverworld_SetCameraBounds RTS } assert pc() <= $02C0F8 ; $0140F8 else org $02C0C3 ; $0140C3 db $B9, $C4, $A8, $8D, $00, $06, $18, $7D db $E2, $BF, $8D, $02, $06, $B9, $44, $A9 db $8D, $04, $06, $18, $7D, $E6, $BF, $8D db $06, $06, $B9, $E2, $BE, $8D, $10, $06 db $18, $7D, $EA, $BF, $8D, $12, $06, $B9 db $62, $BF, $8D, $14, $06, $18, $7D, $EE db $BF, $8D, $16, $06, $60 endif pullpc ; Y - The overworld area number * 2 we are going to. Note: NOT the parent ; number. Meaning if you are going to hyrule castle from Link's house, ; this will be 0x48 (0x24 * 2) and not 0x36 (0x1B * 2). ; X - 0 for small map, 2 for large map NewOverworld_SetCameraBounds: { PHB : PHK : PLB LDX.b $8A LDA.l Pool_BufferAndBuildMap16Stripes_overworldScreenSize, X AND.w #$00FF : ASL : TAX REP #$10 LDA.b $8A : ASL : TAY LDA.w Pool_OverworldTransitionPositionY_New, Y : STA.w $0600 CLC : ADC.w .boundary_y_size, X : STA.w $0602 LDA.w Pool_OverworldTransitionPositionX_New, Y : STA.w $0604 CLC : ADC.w .boundary_x_size, X : STA.w $0606 LDA.w Pool_trans_target_north_new, Y : STA.w $0610 CLC : ADC.w .trans_target_south_offset, X : STA.w $0612 LDA.w Pool_trans_target_west_new, Y : STA.w $0614 CLC : ADC.w .trans_target_east_offset, X : STA.w $0616 SEP #$10 PLB RTL ; Small, Large, Wide, Tall .boundary_y_size dw $011E, $031E, $011E, $031E .boundary_x_size dw $0100, $0300, $0300, $0100 .trans_target_south_offset dw $02E0, $04E0, $02E0, $04E0 .trans_target_east_offset dw $0300, $0500, $0500, $0300 } ; NOTE: UNUSED: ; The $0712 check at $01408D in OverworldScrollTransition and at $0165AA ; in Overworld_LoadNewScreenProperties are now unused because of the ; new Overworld_SetCameraBounds function. pushpc ; ============================================================================== ; This changes how OverworldScreenSizeHighByte is used. Using OWCameraBoundsE ; ($0718) which is free RAM to be the new X boundary check. if !Func02E598 == $01 org $02E598 ; $016598 JSL.l Copy0716 NOP assert pc() <= $02E59D ; $01659D org $02EADC ; $016ADC JSL.l Copy0716 NOP assert pc() <= $02EAE1 ; $016AE1 ; This function returns carry set if the hookshot is off screen when used. ; It's only use is to prevent the hookshot from interacting with anything ; that is offscreen. ; Changed to use the new x value and the new OverworldTransitionPositionX and Y ; tables. org $08FA49 ; $047A49 Hookshot_IsCollisionCheckFutile_Interupt: { LDA.w $0C72, X : AND.w #$0002 : BNE .moving_horizontally LDX.w $0700 LDA.b $00 : SEC : SBC.l Pool_OverworldTransitionPositionY_New, X CMP.w #$0004 : BCC .off_screen CMP.w OWCameraBoundsS : BCS .off_screen BRA .not_at_screen_edge .moving_horizontally LDX.w $0700 LDA.b $02 : SEC : SBC.l Pool_OverworldTransitionPositionX_New, X CMP.w #$0006 : BCC .off_screen CMP.w OWCameraBoundsE : BCC .not_at_screen_edge .off_screen SEP #$20 PLY PLX SEC RTS assert pc() <= $08FA81 org $08FA81 .not_at_screen_edge } assert pc() <= $08FA81 ; $047A81 ; Change an old OverworldScreenSizeFlag use to set the X value instead. org $02AB0D ; $012B0D Overworld_LoadMapProperties_Interupt: { CPX.b #$80 : BCS .inSW ; $0AA3 is the sprite graphics index. LDA.l $7EFCC0, X BRA .write0AA3 .inSW LDA.l Pool_LoadSpecialOverworld_GFX_0AA3-$80, X .write0AA3 ; $0AA3 is the sprite graphics index. STA.w $0AA3 ; $0AA2 is the secondary background graphics index. LDA.l GFX0AA2ValsOW, X ; In PrepTransAuxGFX the game checks if $0AA2 is below 0x20, if it is, ; it will load 3 of the aux sheets as using the low palette instead of ; the high palette. So since $0AA2 isn't really used on the overworld ; anymore, we can just OR it so it will always load properly. ORA.b #$20 : STA.w $0AA2 ; Code from vanilla that is still needed. LDA.w $0712 : STA.w $0714 LDA.l Pool_BufferAndBuildMap16Stripes_overworldScreenSize, X : TAX LDA.l .xSize, X : STA.w $0719 LDA.l .ySize, X : STA.w $0717 LDY.b #$20 LDX.b #$00 LDA.b $8A : AND.b #$40 : BEQ .lightWorld ; $0AA1 = 0x21 for dark world, 0x20 for light world. INY ; 0x08 for dark world, 0x00 for light world. LDX.b #$08 .lightWorld STY.w $0AA1 ; X = 0x01 in LW, 0x0B in DW. LDA.l SheetsTable_0AA4, X : STA.w $0AA4 REP #$30 JSL.l AreaSizeCheck SEP #$30 RTS ; 0x01 - Small map ; 0x03 - Large map .xSize db $01, $03, $03, $01 .ySize db $01, $03, $01, $03 } assert pc() <= $02AB7B ; $012B7B else org $02E598 ; $016598 db $A9, $E4, $8D, $16, $07 org $02EADC ; $016ADC db $A9, $E4, $8D, $16, $07 org $08FA49 ; $047A49 db $BD, $72, $0C, $29, $02, $00, $D0, $16 db $AE, $00, $07, $A5, $00, $38, $FF, $C4 db $A8, $02, $C9, $04, $00, $90, $1B, $CD db $16, $07, $B0, $16, $80, $1A, $AE, $00 db $07, $A5, $02, $38, $FF, $44, $A9, $02 db $C9, $06, $00, $90, $05, $CD, $16, $07 db $90, $06, $E2, $20, $7A, $FA, $38 org $02AB0D ; $012B0D db $BF, $C0, $FC, $7E, $8D, $A3, $0A, $BF db $9C, $FC, $00, $8D, $A2, $0A, $8A, $29 db $3F, $AA, $AD, $12, $07, $8D, $14, $07 db $BF, $44, $A8, $02, $8D, $12, $07, $BF db $84, $A8, $02, $8D, $17, $07, $A0, $20 db $A2, $00, $A5, $8A, $29, $40, $F0, $03 db $C8, $A2, $08, $8C, $A1, $0A, $BF, $F4 db $D8, $00, $8D, $A4, $0A, $C2, $30, $A5 db $8A, $29, $BF, $00, $0A, $AA, $BF, $C4 db $A8, $02, $8D, $08, $07, $BF, $44, $A9 db $02, $4A, $4A, $4A, $8D, $0C, $07, $A9 db $F0, $03, $AE, $12, $07, $D0, $03, $A9 db $F0, $01, $8D, $0A, $07, $4A, $4A, $4A db $8D, $0E, $07, $E2, $30, $60 endif pullpc Copy0716: { LDA.b #$E4 : STA.w OWCameraBoundsS STA.w OWCameraBoundsE RTL } AreaSizeCheck: { PHB : PHK : PLB LDA.b $8A : ASL : TAX LDA.l Pool_OverworldTransitionPositionY_New, X : STA.w $0708 LDA.l Pool_OverworldTransitionPositionX_New, X : LSR #3 : STA.w $070C LDX.b $8A LDA.l Pool_BufferAndBuildMap16Stripes_overworldScreenSize, X AND.w #$00FF : ASL : TAX LDA.w .YSize, X : STA.w $070A LDA.w .XSize, X : STA.w $070E PLB RTL ; Small, Large, Wide, Tall .YSize dw $01F0, $03F0, $01F0, $03F0 .XSize dw $003E, $007E, $007E, $003E } pushpc ; ============================================================================== if !Func09C4C7 == $01 org $09C4C7 ; $04C4C7 LoadOverworldSprites_Interupt: { LDX.w $040A LDA.l Pool_BufferAndBuildMap16Stripes_overworldScreenSize, X : TAY LDA.w .xSize, Y : STA.w $0FB9 STZ.w $0FB8 LDA.w .ySize, Y : STA.w $0FBB STZ.w $0FBA ; What phase are we in? LDA.l $7EF3C5 : ASL : TAY REP #$30 ; And then, what overworld area are we in? TXA : ASL : CLC : ADC.w .phaseOffset, Y : TAX ; Get the overworld sprite pointer based on the overworld area and game phase. LDA.l Pool_Overworld_SpritePointers_state_0_New, X : STA.b $00 SEP #$20 BRA .skip .xSize db $02, $04, $04, $02 .ySize db $02, $04, $02, $04 .phaseOffset dw $0000, $0000, $0140, $0280 ; We have some extra bytes of space here. NOP : NOP : NOP org $09C50D ; $04C50D .skip } assert pc() <= $09C50D ; $04C50D ; The table OverworldScreenSizeForLoading which is located at $04C635 and ; used by the vanilla LoadOverworldSprites function is no longer needed for ; its original purpose. This is for controlling the boundaries used by sprites ; to check if they should be loaded. This is now unused in favor of just ; getting a value based on the size of the area. Its 0xC0 bytes of space is ; now used by OverworldPalettesScreenToSet_New which was moved here from is ; original loaction at $007D1C. The old 0x88 bytes of space at $007D1C is ; now unused. else org $09C4C7 ; $04C4C7 db $AD, $0A, $04, $A8, $BE, $35, $C6, $8E db $B9, $0F, $9C, $B8, $0F, $8E, $BB, $0F db $9C, $BA, $0F, $C2, $30, $AD, $0A, $04 db $0A, $A8, $E2, $20, $AF, $C5, $F3, $7E db $C9, $03, $F0, $0E, $C9, $02, $F0, $14 db $B9, $81, $C8, $85, $00, $B9, $82, $C8 db $80, $12, $B9, $21, $CA, $85, $00, $B9 db $22, $CA, $80, $08, $B9, $01, $C9, $85 db $00, $B9, $02, $C9 endif ; ============================================================================== ; This is the new truth table as to what each area's size is. org $02F88D ; $01788D Pool_BufferAndBuildMap16Stripes_overworldScreenSize: { ; The large area value and small area values were swapped. ; 0x00 was large before and 0x01 was small. ; 0x00 - Small area (1x1) ; 0x01 - Large area (2x2) ; 0x02 - Wide area (2x1) ; 0x03 - Tall area (1x2) if !UseVanillaPool > 0 ; LW db $01, $01, $00, $01, $01, $01, $01, $00 db $01, $01, $00, $01, $01, $01, $01, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $01, $01, $00, $01, $01, $00, $01, $01 db $01, $01, $00, $01, $01, $00, $01, $01 db $00, $00, $00, $00, $00, $00, $00, $00 db $01, $01, $00, $00, $00, $01, $01, $00 db $01, $01, $00, $00, $00, $01, $01, $00 ; DW db $01, $01, $00, $01, $01, $01, $01, $00 db $01, $01, $00, $01, $01, $01, $01, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $01, $01, $00, $01, $01, $00, $01, $01 db $01, $01, $00, $01, $01, $00, $01, $01 db $00, $00, $00, $00, $00, $00, $00, $00 db $01, $01, $00, $00, $00, $01, $01, $00 db $01, $01, $00, $00, $00, $01, $01, $00 ; SW db $00, $01, $01, $00, $00, $00, $00, $00 db $00, $01, $01, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 ; The later half of the SW doesn't exist but this table does have values for ; them here. So this space could be used for something else. db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 db $00, $00, $00, $00, $00, $00, $00, $00 endif } assert pc() <= $02F94D ; $01794D if !Func02AC40 == $01 ; Change a bunch of Pool_BufferAndBuildMap16Stripes_overworldScreenSize checks ; from a BEQ to a BNE. org $02AC40 ; $012C40 db $D0 org $02AC70 ; $012C70 db $D0 org $02B2FA ; $0132FA db $D0 org $02B356 ; $013356 db $D0 org $02ED39 ; $016D39 db $D0 org $02ED6D ; $016D6D db $D0 ; Change a bunch of Pool_BufferAndBuildMap16Stripes_overworldScreenSize checks ; from a BNE to a BEQ. org $02F039 ; $017039 db $F0 org $02F2EF ; $0172EF db $F0 org $02F323 ; $017323 db $F0 org $02F361 ; $017361 db $F0 org $02F39B ; $01739B db $F0 else org $02AC40 ; $012C40 db $F0 org $02AC70 ; $012C70 db $F0 org $02B2FA ; $0132FA db $F0 org $02B356 ; $013356 db $F0 org $02ED39 ; $016D39 db $F0 org $02ED6D ; $016D6D db $F0 org $02F039 ; $017039 db $D0 org $02F2EF ; $0172EF db $D0 org $02F323 ; $017323 db $D0 org $02F361 ; $017361 db $D0 org $02F39B ; $01739B db $D0 endif ; ============================================================================== if !Func02E931 == $01 org $02E931 ; $016931 LoadSpecialOverworld_Interupt: { LDA.b $8A : SEC : SBC.b #$80 : TAX ; GFX $0AA3 LDA.l Pool_LoadSpecialOverworld_GFX_0AA3, X : STA.w $0AA3 ; GFX $0AA2 LDA.l Pool_LoadSpecialOverworld_GFX_0AA2, X : STA.w $0AA2 ; Palette property b LDA.l Pool_LoadSpecialOverworld_palette_prop_b, X : STA.b $00 ; This table call was changed to read from the same one as the rest of the ; areas and is no longer SW specific. ; Property property a LDX.b $8A LDA.l OverworldPalettesScreenToSet_New, X JSL.l Overworld_LoadPalettes PLA : STA.b $A0 REP #$30 ; These 2 exits need the special smaller camera bounds instead of the usual ; ones. Such as the master sword area being half of a small area. LDA.b $A0 : CMP.w #$0180 : BEQ .SpecialCameraBounds CMP.w #$0181 : BEQ .SpecialCameraBounds LDA.b $8A : AND.w #$00FF : ASL : TAX LDA.l Pool_OverworldTransitionPositionY_New, X : STA.w $0708 LDA.l Pool_OverworldTransitionPositionX_New, X : LSR #3 : STA.w $070C JSL.l AreaSizeCheck JSL.l NewOverworld_SetCameraBounds BRA .end .SpecialCameraBounds JSL.l SetupSpecialCameraBounds .end SEP #$30 PLB JSL.l Overworld_SetScreenBGColorCacheOnly RTS } assert pc() <= $02E9BC ; $0169BC else org $02E931 ; $016931 db $BF, $11, $E8, $02, $8D, $A3, $0A, $BF db $21, $E8, $02, $8D, $A2, $0A, $DA, $BF db $41, $E8, $02, $85, $00, $BF, $31, $E8 db $02, $22, $A8, $D5, $0E, $FA, $C2, $30 db $A9, $F0, $03, $85, $00, $A5, $A0, $29 db $3F, $00, $0A, $AA, $BF, $E1, $E6, $02 db $8D, $08, $07, $BF, $E1, $E7, $02, $4A db $4A, $4A, $8D, $0C, $07, $A5, $00, $8D db $0A, $07, $A5, $00, $4A, $4A, $4A, $8D db $0E, $07, $A5, $A0, $0A, $A8, $E2, $10 db $B9, $E1, $E6, $8D, $00, $06, $B9, $01 db $E7, $8D, $02, $06, $B9, $21, $E7, $8D db $04, $06, $B9, $41, $E7, $8D, $06, $06 db $B9, $61, $E7, $8D, $10, $06, $B9, $A1 db $E7, $8D, $12, $06, $B9, $81, $E7, $8D db $14, $06, $B9, $C1, $E7, $8D, $16, $06 db $E2, $20, $68, $85, $A0, $AB, $22, $1D db $D6, $0E, $60 endif pullpc SetupSpecialCameraBounds: { PHB : PHK : PLB LDA.w #$03F0 : STA.b $00 LDA.b $A0 : SEC : SBC.w #$0080 : AND.w #$003F : ASL : TAX LDA.w .SpecialCamera600, X : STA.w $0708 LDA.w .SpecialCamera70C, X : LSR #3 : STA.w $070C LDA.b $00 : STA.w $070A LDA.b $00 : LSR #3 : STA.w $070E SEP #$10 LDA.w .SpecialCamera600, X : STA.w $0600 LDA.w .SpecialCamera602, X : STA.w $0602 LDA.w .SpecialCamera604, X : STA.w $0604 LDA.w .SpecialCamera606, X : STA.w $0606 LDA.w .SpecialCamera610, X : STA.w $0610 LDA.w .SpecialCamera612, X : STA.w $0612 LDA.w .SpecialCamera614, X : STA.w $0614 LDA.w .SpecialCamera616, X : STA.w $0616 PLB RTL ; These are the camera values that are used for the master sword area and ; the area under the bridge. .SpecialCamera600 dw $0000, $0000 .SpecialCamera602 dw $0120, $0020 .SpecialCamera604 dw $0000, $0100 .SpecialCamera606 dw $0000, $0100 .SpecialCamera610 dw $FF20, $FF20 .SpecialCamera612 dw $FFFC, $0100 .SpecialCamera614 dw $FF20, $FF20 .SpecialCamera616 dw $0004, $0104 .SpecialCamera70C dw $0000, $0000 } pushpc ; ============================================================================== if !Func02A5D3 == $01 org $02A5D3 ; $0125D3 Overworld_PlayerControl_Interupt: { JSL.l Overworld_Entrance JSL.l Overworld_DwDeathMountainPaletteAnimation ; If not in SW mode skip this part. LDA.b $8A : CMP.b #$80 : BCC .notSpecialOverworld ; Checks for tiles that lead back to normal overworld. JSL.l SpecialOverworld_CheckForReturnTrigger ; If $11 == 0x24, that means we did trigger a special overworld tile LDA.b $11 : CMP.b #$24 : BNE .noSpecialTrigger ; Tell the game we are in the SW mode. LDA.b #$0B : STA.b $10 RTS .noSpecialTrigger .notSpecialOverworld JSR.w OverworldHandleTransitions .return ; TODO: I think this SEP is not needed but am too scared to comit to ; removing it. SEP #$20 RTS } assert pc() <= $02A62C ; $01262C ; NOTE: This overwrites the unused table found at $0125EC-$01262B else org $02A5D3 ; $0125D3 db $A5, $10, $C9, $0B, $F0, $0D, $22, $F4 db $BB, $1B, $22, $82, $F5, $0E, $20, $C4 db $A9, $80, $03, $20, $7B, $AB, $E2, $20 db $60, $00, $00, $02, $03, $03, $05, $05 db $07, $00, $00, $0A, $03, $03, $05, $05 db $0F, $10, $11, $12, $13, $14, $15, $16 db $17, $18, $18, $1A, $1B, $1B, $1D, $1E db $1E, $18, $18, $22, $1B, $1B, $25, $1E db $1E, $28, $29, $2A, $2B, $2C, $2D, $2E db $2F, $30, $30, $32, $33, $34, $35, $35 db $37, $30, $30, $3A, $3B, $3C, $35, $35 db $3F endif ; ============================================================================== if !Func00FC67 == $01 org $00FC67 ; $007C67 JSL.l Sprite_LoadGfxProperties_Interupt NOP : NOP : NOP org $0286DB ; $0106DB LDA.l OverworldPalettesScreenToSet_New, X org $02B0FB ; $0130FB LDA.l OverworldPalettesScreenToSet_New, X org $02B4CD ; $0134CD LDA.l OverworldPalettesScreenToSet_New, X org $02EAAB ; $016AAB LDA.l OverworldPalettesScreenToSet_New, X org $02ECE8 ; $016CE8 LDA.l OverworldPalettesScreenToSet_New, X else org $00FC67 ; $007C67 db $A0, $3E, $00, $AF, $C5, $F3, $7E org $0286DB ; $0106DB db $BF, $1C, $FD, $00 org $02B0FB ; $0130FB db $BF, $1C, $FD, $00 org $02B4CD ; $0134CD db $BF, $1C, $FD, $00 org $02EAAB ; $016AAB db $BF, $1C, $FD, $00 org $02ECE8 ; $016CE8 db $BF, $1C, $FD, $00 endif pullpc Sprite_LoadGfxProperties_Interupt: { LDX.w #$003E .loop ; The free RAM used here is right after $7EFD40 which is where ; vanilla stores the sprite palettes for the LW and DW. Very convenient ; for our needs, we don't even have to update the read. LDA.l Pool_LoadSpecialOverworld_palette_prop_b, X STA.l ExpandedSpritePalArray, X DEX : DEX : BPL .loop ; Replaced code. LDY.w #$003E LDA.l $7EF3C5 RTL } pushpc ; ============================================================================== if !Func1BC8B1 == $01 ; Remove the SW overworld item check. org $1BC8B4 ; $0DC8B4 Overworld_RevealSecret_Interupt: { NOP : NOP } assert pc() <= $1BC8B6 ; $0DC8B6 org $02EF64 ; $016F64 LDA.l Overworld_HandleOverlaysAndBombDoors_bombable_door_location_New, X else org $1BC8B4 ; $0DC8B4 db $B0, $7D org $02EF64 ; $016F64 db $BF, $C5, $ED, $02 endif ; ============================================================================== if !Func07B518 == $01 org $07B518 ; $03B518 JSL Link_Read_Interupt else org $07B518 ; $03B518 db $A8, $B9, $1D, $F5 endif pullpc Link_Read_Interupt: { PHB : PHK : PLB TAY LDA.w Pool_Overworld_SignText_New, Y PLB RTL } pushpc ; ============================================================================== if !Func02EF44 == $01 ; Remove a check so that entrance overlays can be used on the SW. org $02EF44 ; $016F44 Overworld_LoadMapData_Interupt: { NOP : NOP : NOP : NOP } else org $02EF44 ; $016F44 db $E0, $80, $B0, $0C endif ; ============================================================================== ; TODO: Check HandleEdgeTransition_AdjustCameraBounds for possible needed changes. ; Currently I don't think anything is needed here. ; $013CFB ; TODO: In the fog scrolling code, there is a bit that checks for the turtle ; rock area. If left unchanged, this will prevent the fog and lava from working ; poperly in this area. ; ============================================================================== ; NOTE: A second pullpc is needed here just in case someone incorperates this ; ASM into their own code base. pullpc pullpc