Merge pull request #175 from cassidoxa/quickswap

RAM labels, Length Annotations, and Quickswap Fix
This commit is contained in:
Lexi Rose
2022-11-25 18:58:17 -06:00
committed by GitHub
144 changed files with 9015 additions and 9572 deletions

View File

@@ -36,41 +36,11 @@ dw !ROM_VERSION_LOW
dw !ROM_VERSION_HIGH dw !ROM_VERSION_HIGH
;================================================================================ ;================================================================================
!ADD = "CLC : ADC" !ADD = "CLC : ADC"
!SUB = "SEC : SBC" !SUB = "SEC : SBC"
!BLT = "BCC" !BLT = "BCC"
!BGE = "BCS" !BGE = "BCS"
!MS_GOT = "$7F5031"
!REDRAW = "$7F5000"
!GANON_WARP_CHAIN = "$7F5032";
!TILE_UPLOAD_BUFFER = "$7EA180";
!FORCE_HEART_SPAWN = "$7F5033";
!SKIP_HEART_SAVE = "$7F5034";
; MSU-1
!REG_MSU_FALLBACK_TABLE = $7F50A0 ; 8 bytes
!REG_MSU_DELAYED_COMMAND = $7F50A9
!REG_MSU_PACK_COUNT = $7F50AA
!REG_MSU_PACK_CURRENT = $7F50AB
!REG_MSU_PACK_REQUEST = $7F50AC
!REG_MSU_LOADED_TRACK = $7F50AD ; 2 bytes
!REG_SPC_LOADING = $7F50AF
!MSU_LOADED_TRACK = $7F5400
!MSU_RESUME_TRACK = $7F5401
!MSU_RESUME_TIME = $7F5402 ; 4 bytes
!MSU_RESUME_CONTROL = $7F5406
!REG_MUSIC_CONTROL = $012B
;!REG_MUSIC_CONTROL = $012C
!REG_MUSIC_CONTROL_REQUEST = $012C
!ONEMIND_ID = $7F5072
!ONEMIND_TIMER = $7F5073
function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<0)) function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<0))
; Feature flags, run asar with -DFEATURE_X=1 to enable ; Feature flags, run asar with -DFEATURE_X=1 to enable
@@ -79,12 +49,13 @@ function hexto555(h) = ((((h&$FF)/8)<<10)|(((h>>8&$FF)/8)<<5)|(((h>>16&$FF)/8)<<
;================================================================================ ;================================================================================
incsrc hooks.asm incsrc hooks.asm
incsrc treekid.asm
incsrc spriteswap.asm incsrc spriteswap.asm
incsrc hashalphabethooks.asm incsrc hashalphabethooks.asm
incsrc sharedplayerpalettefix.asm incsrc sharedplayerpalettefix.asm
incsrc ram.asm incsrc ram.asm
incsrc sram.asm incsrc sram.asm
incsrc registers.asm
incsrc vanillalabels.asm
;org $208000 ; bank #$20 ;org $208000 ; bank #$20
org $A08000 ; bank #$A0 org $A08000 ; bank #$A0
@@ -108,22 +79,15 @@ incsrc fairyfixes.asm
incsrc rngfixes.asm incsrc rngfixes.asm
incsrc medallions.asm incsrc medallions.asm
incsrc inventory.asm incsrc inventory.asm
incsrc ganonfixes.asm
incsrc zelda.asm incsrc zelda.asm
incsrc maidencrystals.asm incsrc maidencrystals.asm
incsrc zoraking.asm
incsrc catfish.asm
incsrc flute.asm incsrc flute.asm
incsrc dungeondrops.asm incsrc dungeondrops.asm
incsrc halfmagicbat.asm incsrc halfmagicbat.asm
incsrc mantle.asm
incsrc swordswap.asm incsrc swordswap.asm
incsrc stats.asm incsrc stats.asm
incsrc scratchpad.asm
incsrc map.asm
incsrc dialog.asm incsrc dialog.asm
incsrc entrances.asm incsrc entrances.asm
incsrc clock.asm
incsrc accessibility.asm incsrc accessibility.asm
incsrc heartbeep.asm incsrc heartbeep.asm
incsrc capacityupgrades.asm incsrc capacityupgrades.asm
@@ -132,11 +96,10 @@ incsrc doorframefixes.asm
incsrc music.asm incsrc music.asm
incsrc roomloading.asm incsrc roomloading.asm
incsrc icepalacegraphics.asm incsrc icepalacegraphics.asm
incsrc firebarlayer.asm
warnpc $A18000 warnpc $A18000
org $1C8000 ; text tables for translation org $1C8000 ; text tables for translation
incbin i18n_en.bin incbin "data/i18n_en.bin"
warnpc $1CF356 warnpc $1CF356
org $A18000 ; static mapping area org $A18000 ; static mapping area
@@ -170,7 +133,6 @@ incsrc goalitem.asm
incsrc quickswap.asm incsrc quickswap.asm
incsrc endingsequence.asm incsrc endingsequence.asm
incsrc cuccostorm.asm incsrc cuccostorm.asm
incsrc compression.asm
incsrc retro.asm incsrc retro.asm
incsrc controllerjank.asm incsrc controllerjank.asm
incsrc boots.asm incsrc boots.asm
@@ -199,9 +161,7 @@ if !FEATURE_NEW_TEXT
endif endif
warnpc $A58000 warnpc $A58000
;org $228000 ; contrib area org $A28000
org $A28000 ; contrib area
incsrc contrib.asm
org $A38000 org $A38000
incsrc stats/main.asm incsrc stats/main.asm
@@ -212,89 +172,86 @@ incsrc tables.asm
org $348000 org $348000
incsrc spc.asm incsrc spc.asm
; uncomment for inverted adjustments
;incsrc sandbox.asm
org $318000 ; bank #$31 org $318000 ; bank #$31
GFX_Mire_Bombos: GFX_Mire_Bombos:
incbin 99ff1_bombos.gfx incbin "data/99ff1_bombos.gfx"
warnpc $318800 warnpc $318800
org $318800 org $318800
GFX_Mire_Quake: GFX_Mire_Quake:
incbin 99ff1_quake.gfx incbin "data/99ff1_quake.gfx"
warnpc $319000 warnpc $319000
org $319000 org $319000
GFX_TRock_Bombos: GFX_TRock_Bombos:
incbin a6fc4_bombos.gfx incbin "data/a6fc4_bombos.gfx"
warnpc $319800 warnpc $319800
org $319800 org $319800
GFX_TRock_Ether: GFX_TRock_Ether:
incbin a6fc4_ether.gfx incbin "data/a6fc4_ether.gfx"
warnpc $31A000 warnpc $31A000
org $31A000 org $31A000
GFX_HUD_Items: GFX_HUD_Items:
incbin c2807_v4.gfx incbin "data/c2807_v4.gfx"
warnpc $31A800 warnpc $31A800
org $31A800 org $31A800
GFX_New_Items: GFX_New_Items:
incbin newitems.gfx incbin "data/newitems.gfx"
;incbin eventitems.gfx ; *EVENT* ;incbin eventitems.gfx ; *EVENT*
warnpc $31B000 warnpc $31B000
org $31B000 org $31B000
GFX_HUD_Main: GFX_HUD_Main:
incbin c2e3e.gfx incbin "data/c2e3e.gfx"
warnpc $31B800 warnpc $31B800
org $31C000 org $31C000
IcePalaceFloorGfx: IcePalaceFloorGfx:
incbin ice_palace_floor.bin incbin "data/ice_palace_floor.bin"
warnpc $31C801 warnpc $31C801
org $31C800 org $31C800
Damage_Table: Damage_Table:
incbin damage_table.bin incbin "data/damage_table.bin"
warnpc $31D001 warnpc $31D001
org $31D000 org $31D000
FileSelectNewGraphics: FileSelectNewGraphics:
incbin fileselect.chr.gfx incbin "data/fileselect.chr.gfx"
warnpc $31E001 warnpc $31E001
org $31E000 org $31E000
InvertedCastleHole: ;address used by front end. DO NOT MOVE! InvertedCastleHole: ;address used by front end. DO NOT MOVE!
incbin sheet73.gfx incbin "data/sheet73.gfx"
warnpc $31E501 warnpc $31E501
org $338000 org $338000
GFX_HUD_Palette: GFX_HUD_Palette:
incbin hudpalette.pal incbin "data/hudpalette.pal"
warnpc $338041 warnpc $338041
org $339000 org $339000
incbin sheet178.gfx incbin "data/sheet178.gfx"
warnpc $339600 warnpc $339600
org $339600 org $339600
BossMapIconGFX: BossMapIconGFX:
incbin bossicons.4bpp incbin "data/bossicons.4bpp"
if !FEATURE_NEW_TEXT if !FEATURE_NEW_TEXT
org $339C00 org $339C00
NewFont: NewFont:
incbin newfont.bin incbin "data/newfont.bin"
NewFontInverted: NewFontInverted:
incbin newfont_inverted.bin incbin "data/newfont_inverted.bin"
org $0CD7DF org $0CD7DF
incbin text_unscramble1.bin incbin "data/text_unscramble1.bin"
org $0CE4D5 org $0CE4D5
incbin text_unscramble2.bin incbin "data/text_unscramble2.bin"
endif endif
org $328000 org $328000
@@ -304,7 +261,7 @@ incsrc itemtext.asm
incsrc externalhooks.asm incsrc externalhooks.asm
;================================================================================ ;================================================================================
org $119100 ; PC 0x89100 org $119100 ; PC 0x89100
incbin map_icons.gfx incbin "data/map_icons.gfx"
warnpc $119401 warnpc $119401
;================================================================================ ;================================================================================
org $AF8000 ; PC 0x178000 org $AF8000 ; PC 0x178000
@@ -320,7 +277,7 @@ warnpc $B08000
;Bank Map ;Bank Map
;$20 Code Bank ;$20 Code Bank
;$21 Reserved (Frame Hook & Init) ;$21 Reserved (Frame Hook & Init)
;$22 Contrib Code ;$22 Unused
;$23 Stats & Credits ;$23 Stats & Credits
;$24 Code Bank ;$24 Code Bank
;$29 External hooks (rest of bank not used) ;$29 External hooks (rest of bank not used)
@@ -336,18 +293,18 @@ warnpc $B08000
;$3F reserved for internal debugging ;$3F reserved for internal debugging
;================================================================================ ;================================================================================
;RAM ;RAM
;$7E021B[0x1]: Used by race game instead of $0ABF to avoid witch item conflict ;See ram.asm for label assignments
;$7EC900[0x1F00]: BIGRAM buffer ;$7EC900[0x1F00]: BigRAM buffer
;$7EF000[0x500]: SRAM mirror First 0x500 bytes of SRAM ;$7EF000[0x500]: SRAM mirror First 0x500 bytes of SRAM
; See sram.asm for labels and assignments ; See sram.asm for labels and assignments
;$7F5000[0x800]: Rando's main free ram region ;$7F5000[0x800]: Rando's main free ram region
; See tables.asm for specific assignments ; See ram.asm for specific assignments
;$7F6000[0x1000]: SRAM buffer mapped to vanilla save slots 1 and 2 ;$7F6000[0x1000]: SRAM buffer mapped to vanilla save slots 1 and 2
; See sram.asm for labels and assignments ; See sram.asm for labels and assignments
;$7F7667[0x6719] - free ram ;$7F7667[0x6719] - free ram
;================================================================================ ;================================================================================
;SRAM Map ;SRAM Map
;See sram.asm for rando-specific assignments ;See sram.asm for label assignments and documentation
;$70:0000 (5K) Game state ;$70:0000 (5K) Game state
; 0000-04FF Vanilla Slot 1 (mirrored at $7EF000) ; 0000-04FF Vanilla Slot 1 (mirrored at $7EF000)
; 0500-14FF Ext Slot 1 (mirrored at $7F6000) ; 0500-14FF Ext Slot 1 (mirrored at $7F6000)
@@ -355,44 +312,6 @@ warnpc $B08000
;$70:3000 (0x16) Password ;$70:3000 (0x16) Password
;$70:6000 (8K) Scratch buffers ;$70:6000 (8K) Scratch buffers
;================================================================================ ;================================================================================
;org $0080DC ; <- 0xDC - Bank00.asm:179 - Kill Music
;db #$A9, #$00, #$EA
;LDA.b #$00 : NOP
;================================================================================
;org $0AC53E ; <- 5453E - Bank0A.asm:1103 - (LDA $0AC51F, X) - i have no idea what this is for anymore
;LDA.b #$7F
;NOP #2
;================================================================================
;org $05DF8B ; <- 2DF8B - Bank05.asm : 2483
;AND.w #$0100 ; allow Sprite_DrawMultiple to access lower half of sprite tiles
;================================================================================
;org $0DF8F1 ; this is required for the X-indicator in the HUD except not anymore obviously
;
;;red pendant
;db $2B, $31, $2C, $31, $3D, $31, $2E, $31
;db $2B, $25, $2C, $25, $2D, $25, $2E, $25
;
;;blue pendant
;db $2B, $31, $2C, $31, $3D, $31, $2E, $31
;db $2B, $2D, $2C, $2D, $2D, $2D, $2E, $2D
;
;;green pendant
;db $2B, $31, $2C, $31, $3D, $31, $2E, $31
;db $2B, $3D, $2C, $3D, $2D, $3D, $2E, $3D
;================================================================================
;org $00CFF2 ; 0x4FF2 - Mire H
;db GFX_Mire_Bombos>>16
;org $00D0D1 ; 0x50D1 - Mire M
;db GFX_Mire_Bombos>>8
;org $00D1B0 ; 0x51B0 - Mire L
;db GFX_Mire_Bombos
;org $00D020 ; 0x5020 - Trock H
;db GFX_TRock_Bombos>>16
;org $00D0FF ; 0x50FF - Trock M
;db GFX_TRock_Bombos>>8
;org $00D1DE ; 0x51DE - Trock L
;db GFX_TRock_Bombos
org $00D09C ; 0x509C - HUD Items H org $00D09C ; 0x509C - HUD Items H
db GFX_HUD_Items>>16 db GFX_HUD_Items>>16
@@ -416,308 +335,3 @@ db GFX_HUD_Main>>8
org $00D25B ; 0x525B - HUD Main L org $00D25B ; 0x525B - HUD Main L
db GFX_HUD_Main db GFX_HUD_Main
;================================================================================ ;================================================================================
org $008781
UseImplicitRegIndexedLocalJumpTable:
org $00879c
UseImplicitRegIndexedLongJumpTable:
org $008333
Vram_EraseTilemaps_triforce:
org $008913
Sound_LoadLightWorldSongBank:
org $00891D
.do_load
org $00893D
EnableForceBlank:
DungeonMask = $0098C0
org $00D308
DecompSwordGfx:
org $00D348
DecompShieldGfx:
org $00D463
Tagalong_LoadGfx:
org $00D51B
GetAnimatedSpriteTile:
org $00D52D
GetAnimatedSpriteTile_variable:
org $00D84E
Attract_DecompressStoryGfx:
org $00E529
LoadSelectScreenGfx:
org $00F945
PrepDungeonExit:
org $00FDEE
Mirror_InitHdmaSettings:
org $01873A
Dungeon_LoadRoom:
org $02821E
Module_PreDungeon:
org $028296
.setAmbientSfx
org $02A0A8
Dungeon_SaveRoomData:
org $02A0BE
Dungeon_SaveRoomData_justKeys:
org $02B861
Dungeon_SaveRoomQuadrantData:
org $02FD8A ; 17D8A - Bank0E.asm: 3732 Note: Different bank
LoadGearPalettes_bunny:
org $02FD95 ; 17D95 - Bank0E.asm: 3742 Note: Different bank
LoadGearPalettes_variable:
org $02FEAB
Filter_Majorly_Whiten_Color:
org $05A51D
Sprite_SpawnFallingItem:
org $05DF6C ; 02DF6C - Bank05.asm : 2445
Sprite_DrawMultiple:
org $05DF70 ; 02DF70 - Bank05.asm : 2454
Sprite_DrawMultiple_quantity_preset:
org $05DF75 ; 02DF75 - Bank05.asm : 2461
Sprite_DrawMultiple_player_deferred:
org $05E1A7 ; 02E1A7 - Bank05.asm : 2592
Sprite_ShowSolicitedMessageIfPlayerFacing:
org $05E1F0
Sprite_ShowMessageFromPlayerContact:
org $05E219
Sprite_ShowMessageUnconditional:
org $05EC96
Sprite_ZeldaLong:
org $0680FA
Player_ApplyRumbleToSprites:
org $0683E6
Utility_CheckIfHitBoxesOverlapLong:
org $06A7DB
Chicken_SpawnAvengerChicken: ; returns short
org $06DC5C
Sprite_DrawShadowLong:
org $06DD40
DashKey_Draw:
org $06DBF8
Sprite_PrepAndDrawSingleLargeLong:
org $06DC00
Sprite_PrepAndDrawSingleSmallLong:
org $06EA18
Sprite_ApplySpeedTowardsPlayerLong:
org $06EAA6
Sprite_DirectionToFacePlayerLong:
org $06F12F
Sprite_CheckDamageToPlayerSameLayerLong:
org $06F86A
OAM_AllocateDeferToPlayerLong:
org $0791B3
Player_HaltDashAttackLong:
org $07999D
Link_ReceiveItem:
org $07E68F
Unknown_Method_0: ; In US version disassembly simply called "$3E6A6 IN ROM"
org $07F4AA
Sprite_CheckIfPlayerPreoccupied:
org $08C3AE
Ancilla_ReceiveItem:
org $08CE93
Ancilla_BreakTowerSeal_draw_single_crystal:
org $08CEC3
Ancilla_BreakTowerSeal_stop_spawning_sparkles:
org $08CF59
BreakTowerSeal_ExecuteSparkles:
org $08F710
Ancilla_SetOam_XY_Long:
org $0985E2 ; (break on $0985E4)
AddReceivedItem:
org $098BAD
AddPendantOrCrystal:
org $098CFD
AddWeathervaneExplosion:
org $0993DF
AddDashTremor:
org $099D04
AddAncillaLong:
org $099D1A
Ancilla_CheckIfAlreadyExistsLong:
org $09AE64
Sprite_SetSpawnedCoords:
org $09AD58
GiveRupeeGift:
org $0ABA4F
OverworldMap_InitGfx:
org $0ABA99
OverworldMap_DarkWorldTilemap:
org $0ABAB9
OverworldMap_LoadSprGfx:
org $0CD7D1
NameFile_MakeScreenVisible:
org $0CDB3E
InitializeSaveFile:
org $0CDBC0
InitializeSaveFile_build_checksum:
org $0DBA71
GetRandomInt:
org $0DBA80
OAM_AllocateFromRegionA:
org $0DBA84
OAM_AllocateFromRegionB:
org $0DBA88
OAM_AllocateFromRegionC:
org $0DBA8C
OAM_AllocateFromRegionD:
org $0DBA90
OAM_AllocateFromRegionE:
org $0DBA94
OAM_AllocateFromRegionF:
org $0DBB67
Sound_SetSfxPanWithPlayerCoords:
org $0DBB6E
Sound_SetSfx1PanLong:
org $0DBB7C
Sound_SetSfx2PanLong:
org $0DBB8A
Sound_SetSfx3PanLong:
org $0DDB7F
HUD_RefreshIconLong:
org $0DDD32
Equipment_UpdateEquippedItemLong:
org $0DE01E ; 6E10E - equipment.asm : 787
BottleMenu_movingOn:
org $0DE346
RestoreNormalMenu:
org $0DE395
Equipment_SearchForEquippedItemLong:
org $0DE9C8
DrawProgressIcons: ; this returns short
org $0DED29
DrawEquipment: ; this returns short
org $0DFA78
HUD_RebuildLong:
org $0DFA88
HUD_RebuildIndoor_Palace:
org $0DFA88
HUD_RebuildLong2:
org $0EEE10
Messaging_Text:
org $0FFD94
Overworld_TileAttr:
org $1BC97C
Overworld_DrawPersistentMap16:
org $1BED03
Palette_Sword:
org $1BED29
Palette_Shield:
org $1BEDF9
Palette_ArmorAndGloves:
org $1BEE52
Palette_Hud:
org $1BEF96
Palette_SelectScreen:
org $1CFAAA
ShopKeeper_RapidTerminateReceiveItem:
org $1CF500
Sprite_NullifyHookshotDrag:
org $1CF537
Ancilla_CheckForAvailableSlot:
org $1DE9B6
Filter_MajorWhitenMain:
org $1DF65D
Sprite_SpawnDynamically:
org $1DF65F
Sprite_SpawnDynamically_arbitrary:
org $1DFD4B
DiggingGameGuy_AttemptPrizeSpawn:
org $1EDE28
Sprite_GetEmptyBottleIndex: ; this is totally in sprite_bees.asm
org $1EF4E7
Sprite_PlayerCantPassThrough:
;================================================================================

View File

@@ -1,127 +1,118 @@
;================================================================================ ;================================================================================
; Accessibility Fixes ; Accessibility Fixes
;================================================================================ ;================================================================================
FlipGreenPendant:
LDA $0C : CMP #$38 : BNE + ; check if we have green pendant
ORA #$40 : STA $0C ; flip it
+
LDA $0D : STA $0802, X ; stuff we wrote over "Set CHR, palette, and priority of the sprite"
LDA $0C : STA $0803, X
RTL
;================================================================================
ConditionalLightning: ConditionalLightning:
CMP.b #$05 : BEQ ++ CMP.b #$05 : BEQ ++
CMP.b #$2C : BEQ ++ CMP.b #$2C : BEQ ++
CMP.b #$5A : BEQ ++ CMP.b #$5A : BEQ ++
LDA.l DisableFlashing : BNE ++ LDA.l DisableFlashing : BNE ++
LDA.b #$32 : STA.w $9A LDA.b #$32 : STA.w CGADSUBQ
RTL RTL
++ ++
LDA.b #$72 LDA.b #$72
STA $9A STA.b CGADSUBQ
RTL RTL
;================================================================================ ;================================================================================
ConditionalWhitenBg: ConditionalWhitenBg:
LDX.b #$00 LDX.b #$00
LDA.l DisableFlashing : REP #$20 : BNE + LDA.l DisableFlashing : REP #$20 : BNE +
LDA $00,X LDA.b Scrap00,X
JSR WhitenLoopReal JSR WhitenLoopReal
RTL RTL
+ +
LDA $00 LDA.b Scrap00
JSR WhitenLoopDummy JSR WhitenLoopDummy
RTL RTL
;================================================================================ ;================================================================================
WhitenLoopReal: WhitenLoopReal:
- -
LDA $7EC340, X : JSL Filter_Majorly_Whiten_Color : STA $7EC540, X LDA.l PaletteBufferAux+$40, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$40, X
LDA $7EC350, X : JSL Filter_Majorly_Whiten_Color : STA $7EC550, X LDA.l PaletteBufferAux+$50, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$50, X
LDA $7EC360, X : JSL Filter_Majorly_Whiten_Color : STA $7EC560, X LDA.l PaletteBufferAux+$60, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$60, X
LDA $7EC370, X : JSL Filter_Majorly_Whiten_Color : STA $7EC570, X LDA.l PaletteBufferAux+$70, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$70, X
LDA $7EC380, X : JSL Filter_Majorly_Whiten_Color : STA $7EC580, X LDA.l PaletteBufferAux+$80, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$80, X
LDA $7EC390, X : JSL Filter_Majorly_Whiten_Color : STA $7EC590, X LDA.l PaletteBufferAux+$90, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$90, X
LDA $7EC3A0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5A0, X LDA.l PaletteBufferAux+$A0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$A0, X
LDA $7EC3B0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5B0, X LDA.l PaletteBufferAux+$B0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$B0, X
LDA $7EC3C0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5C0, X LDA.l PaletteBufferAux+$C0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$C0, X
LDA $7EC3D0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5D0, X LDA.l PaletteBufferAux+$D0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$D0, X
LDA $7EC3E0, X : JSL Filter_Majorly_Whiten_Color : STA $7EC5E0, X LDA.l PaletteBufferAux+$E0, X : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$E0, X
INX #2 : CPX.b #$10 : BEQ + INX #2 : CPX.b #$10 : BEQ +
JMP - JMP -
+ +
LDA $7EC3F0 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F0 LDA.l PaletteBufferAux+$F0 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F0
LDA $7EC3F2 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F2 LDA.l PaletteBufferAux+$F2 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F2
LDA $7EC3F4 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F4 LDA.l PaletteBufferAux+$F4 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F4
LDA $10 : CMP.w #$07 : BNE + LDA.b GameMode : CMP.w #$0007 : BNE +
LDA $048E LDA.b RoomIndex
CMP.w #$3C : BEQ ++ CMP.w #$003C : BEQ ++
CMP.w #$9D : BEQ ++ CMP.w #$009D : BEQ ++
CMP.w #$9C : BEQ ++ CMP.w #$009C : BEQ ++
CMP.w #$A5 : BEQ ++ CMP.w #$00A5 : BEQ ++
+ +
LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F6 LDA.l PaletteBufferAux+$F6 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F6
LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F8 LDA.l PaletteBufferAux+$F8 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F8
BRA +++ BRA +++
++ ++
LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F6 LDA.l PaletteBuffer+$F6 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F6
LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F8 LDA.l PaletteBuffer+$F8 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F8
BRA +++ BRA +++
+++ +++
LDA $7EC3FA : JSL Filter_Majorly_Whiten_Color : STA $7EC5FA LDA.l PaletteBufferAux+$FA : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$FA
LDA $7EC3FC : JSL Filter_Majorly_Whiten_Color : STA $7EC5FC LDA.l PaletteBufferAux+$FC : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$FC
LDA $7EC3FE : JSL Filter_Majorly_Whiten_Color : STA $7EC5FE LDA.l PaletteBufferAux+$FE : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$FE
REP #$10 REP #$10
LDA $7EC540 : TAY LDA.l PaletteBuffer+$40 : TAY
LDA $7EC300 : BNE + LDA.l PaletteBufferAux : BNE +
TAY TAY
+ +
TYA : STA $7EC500 TYA : STA.l PaletteBuffer
SEP #$30 SEP #$30
RTS RTS
;================================================================================ ;================================================================================
WhitenLoopDummy: WhitenLoopDummy:
- -
LDA $7EC340, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC540, X LDA.l PaletteBufferAux+$40, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$40, X
LDA $7EC350, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC550, X LDA.l PaletteBufferAux+$50, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$50, X
LDA $7EC360, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC560, X LDA.l PaletteBufferAux+$60, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$60, X
LDA $7EC370, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC570, X LDA.l PaletteBufferAux+$70, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$70, X
LDA $7EC380, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC580, X LDA.l PaletteBufferAux+$80, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$80, X
LDA $7EC390, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC590, X LDA.l PaletteBufferAux+$90, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$90, X
LDA $7EC3A0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5A0, X LDA.l PaletteBufferAux+$A0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$A0, X
LDA $7EC3B0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5B0, X LDA.l PaletteBufferAux+$B0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$B0, X
LDA $7EC3C0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5C0, X LDA.l PaletteBufferAux+$C0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$C0, X
LDA $7EC3D0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5D0, X LDA.l PaletteBufferAux+$D0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$D0, X
LDA $7EC3E0, X : JSL Filter_Majorly_Whiten_Color : LDA $7EC5E0, X LDA.l PaletteBufferAux+$E0, X : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$E0, X
INX #2 : CPX.b #$10 : BEQ + INX #2 : CPX.b #$10 : BEQ +
JMP - JMP -
+ +
LDA $7EC3F0 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F0 LDA.l PaletteBufferAux+$F0 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F0
LDA $7EC3F2 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F2 LDA.l PaletteBufferAux+$F2 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F2
LDA $7EC3F4 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F4 LDA.l PaletteBufferAux+$F4 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F4
LDA $10 : CMP.w #$07 : BNE + ; only light invisifloor if we're in dungeon submodule LDA.b GameMode : CMP.w #$0007 : BNE + ; only light invisifloor if we're in dungeon submodule
LDA $048E LDA.b RoomIndex
CMP.w #$3C : BEQ ++ ; hookshot cave CMP.w #$003C : BEQ ++ ; hookshot cave
CMP.w #$9D : BEQ ++ ; gt right CMP.w #$009D : BEQ ++ ; gt right
CMP.w #$9C : BEQ ++ ; gt big room CMP.w #$009C : BEQ ++ ; gt big room
CMP.w #$A5 : BEQ ++ ; wizzrobes 1 CMP.w #$00A5 : BEQ ++ ; wizzrobes 1
+ +
LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F6 LDA.l PaletteBufferAux+$F6 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F6
LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : LDA $7EC5F8 LDA.l PaletteBufferAux+$F8 : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$F8
BRA +++ BRA +++
++ ++
LDA $7EC3F6 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F6 LDA.l PaletteBufferAux+$F6 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F6
LDA $7EC3F8 : JSL Filter_Majorly_Whiten_Color : STA $7EC5F8 LDA.l PaletteBufferAux+$F8 : JSL Filter_Majorly_Whiten_Color : STA.l PaletteBuffer+$F8
BRA +++ BRA +++
+++ +++
LDA $7EC3FA : JSL Filter_Majorly_Whiten_Color : LDA $7EC5FA LDA.l PaletteBufferAux+$FA : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$FA
LDA $7EC3FC : JSL Filter_Majorly_Whiten_Color : LDA $7EC5FC LDA.l PaletteBufferAux+$FC : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$FC
LDA $7EC3FE : JSL Filter_Majorly_Whiten_Color : LDA $7EC5FE LDA.l PaletteBufferAux+$FE : JSL Filter_Majorly_Whiten_Color : LDA.l PaletteBuffer+$FE
REP #$10 REP #$10
LDA $7EC540 : TAY LDA.l PaletteBuffer+$40 : TAY
LDA $7EC300 : BNE + LDA.l PaletteBufferAux : BNE +
TAY TAY
+ +
TYA : STA $7EC500 TYA : STA.l PaletteBuffer
SEP #$30 SEP #$30
RTS RTS
;================================================================================ ;================================================================================
@@ -129,36 +120,36 @@ RestoreBgEther:
LDX.b #$00 LDX.b #$00
LDA.l DisableFlashing : REP #$20 : BNE + LDA.l DisableFlashing : REP #$20 : BNE +
- -
LDA $00,X LDA.b Scrap00,X
LDA $7EC340, X : STA $7EC540, X LDA.l PaletteBufferAux+$40, X : STA.l PaletteBuffer+$40, X
LDA $7EC350, X : STA $7EC550, X LDA.l PaletteBufferAux+$50, X : STA.l PaletteBuffer+$50, X
LDA $7EC360, X : STA $7EC560, X LDA.l PaletteBufferAux+$60, X : STA.l PaletteBuffer+$60, X
LDA $7EC370, X : STA $7EC570, X LDA.l PaletteBufferAux+$70, X : STA.l PaletteBuffer+$70, X
LDA $7EC380, X : STA $7EC580, X LDA.l PaletteBufferAux+$80, X : STA.l PaletteBuffer+$80, X
LDA $7EC390, X : STA $7EC590, X LDA.l PaletteBufferAux+$90, X : STA.l PaletteBuffer+$90, X
LDA $7EC3A0, X : STA $7EC5A0, X LDA.l PaletteBufferAux+$A0, X : STA.l PaletteBuffer+$A0, X
LDA $7EC3B0, X : STA $7EC5B0, X LDA.l PaletteBufferAux+$B0, X : STA.l PaletteBuffer+$B0, X
LDA $7EC3C0, X : STA $7EC5C0, X LDA.l PaletteBufferAux+$C0, X : STA.l PaletteBuffer+$C0, X
LDA $7EC3D0, X : STA $7EC5D0, X LDA.l PaletteBufferAux+$D0, X : STA.l PaletteBuffer+$D0, X
LDA $7EC3E0, X : STA $7EC5E0, X LDA.l PaletteBufferAux+$E0, X : STA.l PaletteBuffer+$E0, X
LDA $7EC3F0, X : STA $7EC5F0, X LDA.l PaletteBufferAux+$F0, X : STA.l PaletteBuffer+$F0, X
INX #2 : CPX.b #$10 : BNE - INX #2 : CPX.b #$10 : BNE -
BRA ++ BRA ++
+ +
- -
LDA $00 LDA.b Scrap00
LDA $7EC340, X : LDA $7EC540, X LDA.l PaletteBufferAux+$40, X : LDA.l PaletteBuffer+$40, X
LDA $7EC350, X : LDA $7EC550, X LDA.l PaletteBufferAux+$50, X : LDA.l PaletteBuffer+$50, X
LDA $7EC360, X : LDA $7EC560, X LDA.l PaletteBufferAux+$60, X : LDA.l PaletteBuffer+$60, X
LDA $7EC370, X : LDA $7EC570, X LDA.l PaletteBufferAux+$70, X : LDA.l PaletteBuffer+$70, X
LDA $7EC380, X : LDA $7EC580, X LDA.l PaletteBufferAux+$80, X : LDA.l PaletteBuffer+$80, X
LDA $7EC390, X : LDA $7EC590, X LDA.l PaletteBufferAux+$90, X : LDA.l PaletteBuffer+$90, X
LDA $7EC3A0, X : LDA $7EC5A0, X LDA.l PaletteBufferAux+$A0, X : LDA.l PaletteBuffer+$A0, X
LDA $7EC3B0, X : LDA $7EC5B0, X LDA.l PaletteBufferAux+$B0, X : LDA.l PaletteBuffer+$B0, X
LDA $7EC3C0, X : LDA $7EC5C0, X LDA.l PaletteBufferAux+$C0, X : LDA.l PaletteBuffer+$C0, X
LDA $7EC3D0, X : LDA $7EC5D0, X LDA.l PaletteBufferAux+$D0, X : LDA.l PaletteBuffer+$D0, X
LDA $7EC3E0, X : LDA $7EC5E0, X LDA.l PaletteBufferAux+$E0, X : LDA.l PaletteBuffer+$E0, X
LDA $7EC3F0, X : LDA $7EC5F0, X LDA.l PaletteBufferAux+$F0, X : LDA.l PaletteBuffer+$F0, X
INX #2 : CPX.b #$10 : BNE - INX #2 : CPX.b #$10 : BNE -
BRA ++ BRA ++
++ ++
@@ -168,105 +159,105 @@ DDMConditionalLightning:
LDA.l DisableFlashing LDA.l DisableFlashing
REP #$20 REP #$20
BNE + BNE +
LDA.w $0000 LDA.w Scrap
LDX.b #$02 LDX.b #$02
JML $07FA7F ; Bank0E.asm : 4738 vanilla loop equivalent to below beginning at LDY #$00 JML $07FA7F ; Bank0E.asm : 4738 vanilla loop equivalent to below beginning at LDY #$00
+ +
LDA.b $00 : LDX.b #$02 : LDY #$00 LDA.b Scrap00 : LDX.b #$02 : LDY.b #$00
- -
LDA $F4EB, Y : LDA $7EC560, X LDA.w $F4EB, Y : LDA.l PaletteBuffer+$60, X
LDA $F4F9, Y : LDA $7EC570, X LDA.w $F4F9, Y : LDA.l PaletteBuffer+$70, X
LDA $F507, Y : LDA $7EC590, X LDA.w $F507, Y : LDA.l PaletteBuffer+$90, X
LDA $F515, Y : LDA $7EC5E0, X LDA.w $F515, Y : LDA.l PaletteBuffer+$E0, X
LDA $F523, Y : LDA $7EC5F0, X LDA.w $F523, Y : LDA.l PaletteBuffer+$F0, X
INY #2 INY #2
INX #2 : CPX.b #$10 : BNE - INX #2 : CPX.b #$10 : BNE -
JML $07FAAC ; Bank0E.asm : 4754 both branches converge here JML $07FAAC ; Bank0E.asm : 4754 both branches converge here
;================================================================================ ;================================================================================
ConditionalGTFlash: ConditionalGTFlash:
LDA.l DisableFlashing : REP #$20 : BNE + LDA.l DisableFlashing : REP #$20 : BNE +
LDA $0000 LDA.w Scrap
- -
LDA $F9C1, Y : STA $7EC5D0, X LDA.w $F9C1, Y : STA.l PaletteBuffer+$D0, X
INY #2 INY #2
INX #2 : CPX.b #$10 : BNE - INX #2 : CPX.b #$10 : BNE -
RTL RTL
+ +
LDA $00 LDA.b Scrap00
- -
LDA $F9C1, Y : LDA $7EC5D0, X LDA.w $F9C1, Y : LDA.l PaletteBuffer+$D0, X
INY #2 INY #2
INX #2 : CPX.b #$10 : BNE - INX #2 : CPX.b #$10 : BNE -
RTL RTL
;================================================================================ ;================================================================================
ConditionalRedFlash: ConditionalRedFlash:
LDA.l DisableFlashing : REP #$20 : BNE + LDA.l DisableFlashing : REP #$20 : BNE +
LDA $00,X LDA.b Scrap,X
LDA.w #$1D59 : STA $7EC5DA LDA.w #$1D59 : STA.l PaletteBuffer+$DA
LDA.w #$25FF : STA $7EC5DC LDA.w #$25FF : STA.l PaletteBuffer+$DC
LDA.w #$001A LDA.w #$001A
RTL RTL
+ +
LDA $00 LDA.b Scrap00
LDA.w #$1D59 : LDA $7EC5DA LDA.w #$1D59 : LDA.l PaletteBuffer+$DA
LDA.w #$25FF : LDA $7EC5DC LDA.w #$25FF : LDA.l PaletteBuffer+$DC
LDA.w #$0000 LDA.w #$0000
RTL RTL
;================================================================================ ;================================================================================
ConditionalPedAncilla: ConditionalPedAncilla:
LDA.l DisableFlashing : REP #$20 : BNE + LDA.l DisableFlashing : REP #$20 : BNE +
LDA $00,X LDA.b Scrap,X
LDA $00 : STA $04 LDA.b Scrap00 : STA.b Scrap04
LDA $02 : STA $06 LDA.b Scrap02 : STA.b Scrap06
RTL RTL
+ +
LDA $00 LDA.b Scrap
LDA $00 : LDA $04 LDA.b Scrap00 : LDA.b Scrap04
LDA $02 : LDA $06 LDA.b Scrap02 : LDA.b Scrap06
RTL RTL
;================================================================================ ;================================================================================
LoadElectroPalette: LoadElectroPalette:
REP #$20 REP #$20
LDA.w #$0202 : STA $0C LDA.w #$0202 : STA.b Scrap0C
LDA.w #$0404 : STA $0E LDA.w #$0404 : STA.b Scrap0E
LDA.w #$001B : STA $02 LDA.w #$001B : STA.b Scrap02
SEP #$10 SEP #$10
LDX $0C : LDA $1BEBB4, X : AND.w #$00FF : ADC #$D630 LDX.b Scrap0C : LDA.l $1BEBB4, X : AND.w #$00FF : ADC.w #$D630
REP #$10 : LDX.w #$01B2 : LDY.w #$0002 REP #$10 : LDX.w #$01B2 : LDY.w #$0002
JSR ConditionalLoadGearPalette JSR ConditionalLoadGearPalette
SEP #$10 SEP #$10
LDX $0D LDX.b Scrap0D
LDA $1BEBC1, X : AND.w #$00FF : ADC #$D648 LDA.l $1BEBC1, X : AND.w #$00FF : ADC.w #$D648
REP #$10 : LDX.w #$01B8 : LDY.w #$0003 REP #$10 : LDX.w #$01B8 : LDY.w #$0003
JSR ConditionalLoadGearPalette JSR ConditionalLoadGearPalette
SEP #$10 SEP #$10
LDX $0E LDX.b Scrap0E
LDA $1BEC06, X : AND.w #$00FF : ASL A : ADC #$D308 LDA.l $1BEC06, X : AND.w #$00FF : ASL A : ADC.w #$D308
REP #$10 : LDX.w #$01E2 : LDY.w #$000E REP #$10 : LDX.w #$01E2 : LDY.w #$000E
JSR ConditionalLoadGearPalette JSR ConditionalLoadGearPalette
SEP #$30 SEP #$30
INC $15 INC.b NMICGRAM
RTL RTL
;================================================================================ ;================================================================================
ConditionalLoadGearPalette: ConditionalLoadGearPalette:
STA $00 STA.b Scrap00
SEP #$20 SEP #$20
LDA.l DisableFlashing : REP #$20 : BNE + LDA.l DisableFlashing : REP #$20 : BNE +
LDA $00,X LDA.b Scrap,X
- -
LDA [$00] LDA.b [Scrap00]
STA $7EC500, X STA.l PaletteBuffer, X
INC $00 : INC $00 INC.b Scrap00 : INC.b Scrap00
INX #2 INX #2
DEY DEY
BPL - BPL -
RTS RTS
+ +
LDA $00 LDA.b Scrap
- -
LDA [$00] LDA.b [Scrap00]
LDA $7EC500, X LDA.l PaletteBuffer, X
INC $00 : INC $00 INC.b Scrap00 : INC.b Scrap00
INX #2 INX #2
DEY DEY
BPL - BPL -
@@ -281,13 +272,13 @@ RestoreElectroPalette:
LDX.w #$01E2 : LDY.w #$000E LDX.w #$01E2 : LDY.w #$000E
JSR FillPaletteBufferFromAux JSR FillPaletteBufferFromAux
SEP #$30 SEP #$30
INC $15 INC.b NMICGRAM
RTL RTL
;================================================================================ ;================================================================================
FillPaletteBufferFromAux: FillPaletteBufferFromAux:
- -
LDA $7EC300, X LDA.l PaletteBufferAux, X
STA $7EC500, X STA.l PaletteBuffer, X
INX #2 INX #2
DEY DEY
BPL - BPL -

View File

@@ -2,21 +2,21 @@
; Randomize Book of Mudora ; Randomize Book of Mudora
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LoadLibraryItemGFX: LoadLibraryItemGFX:
%GetPossiblyEncryptedItem(LibraryItem, SpriteItemValues) %GetPossiblyEncryptedItem(LibraryItem, SpriteItemValues)
STA $0E80, X ; Store item type STA.w SpriteItemType, X ; Store item type
JSL.l PrepDynamicTile JSL.l PrepDynamicTile
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DrawLibraryItemGFX: DrawLibraryItemGFX:
PHA PHA
LDA $0E80, X ; Retrieve stored item type LDA.w SpriteItemType, X ; Retrieve stored item type
JSL.l DrawDynamicTile JSL.l DrawDynamicTile
PLA PLA
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
SetLibraryItem: SetLibraryItem:
LDY $0E80, X ; Retrieve stored item type LDY.w SpriteItemType, X ; Retrieve stored item type
JSL.l ItemSet_Library ; contains thing we wrote over JSL.l ItemSet_Library ; contains thing we wrote over
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -24,37 +24,34 @@ RTL
;================================================================================ ;================================================================================
; Randomize Bonk Keys ; Randomize Bonk Keys
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
;--------------------------------------------------------------------------------
LoadBonkItemGFX: LoadBonkItemGFX:
LDA.b #$08 : STA $0F50, X ; thing we wrote over LDA.b #$08 : STA.w SpriteOAMProp, X ; thing we wrote over
LoadBonkItemGFX_inner: LoadBonkItemGFX_inner:
LDA.b #$00 : STA !REDRAW LDA.b #$00 : STA.l RedrawFlag
JSR LoadBonkItem JSR LoadBonkItem
JSL.l PrepDynamicTile JSL.l PrepDynamicTile
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DrawBonkItemGFX: DrawBonkItemGFX:
PHA PHA
LDA !REDRAW : BEQ .skipInit ; skip init if already ready LDA.l RedrawFlag : BEQ .skipInit ; skip init if already ready
JSL.l LoadBonkItemGFX_inner JSL.l LoadBonkItemGFX_inner
BRA .done ; don't draw on the init frame BRA .done ; don't draw on the init frame
.skipInit .skipInit
JSR LoadBonkItem
JSL.l DrawDynamicTileNoShadow
JSR LoadBonkItem .done
JSL.l DrawDynamicTileNoShadow PLA
.done
PLA
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
GiveBonkItem: GiveBonkItem:
JSR LoadBonkItem JSR LoadBonkItem
CMP #$24 : BNE .notKey CMP.b #$24 : BNE .notKey
.key .key
PHY : LDY.b #$24 : JSL.l AddInventory : PLY ; do inventory processing for a small key PHY : LDY.b #$24 : JSL.l AddInventory : PLY ; do inventory processing for a small key
LDA CurrentSmallKeys : INC A : STA CurrentSmallKeys LDA.l CurrentSmallKeys : INC A : STA.l CurrentSmallKeys
LDA.b #$2F : JSL.l Sound_SetSfx3PanLong LDA.b #$2F : JSL.l Sound_SetSfx3PanLong
JSL CountBonkItem JSL CountBonkItem
RTL RTL
@@ -64,11 +61,11 @@ RTL
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LoadBonkItem: LoadBonkItem:
LDA $A0 ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte LDA.b RoomIndex ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte
CMP #115 : BNE + ; Desert Bonk Key CMP.b #115 : BNE + ; Desert Bonk Key
LDA.l BonkKey_Desert LDA.l BonkKey_Desert
BRA ++ BRA ++
+ : CMP #140 : BNE + ; GTower Bonk Key + : CMP.b #140 : BNE + ; GTower Bonk Key
LDA.l BonkKey_GTower LDA.l BonkKey_GTower
BRA ++ BRA ++
+ +

View File

@@ -1,28 +1,27 @@
;================================================================================ ;================================================================================
; Boots State Modifier ; Boots State Modifier
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!BOOTS_MODIFIER = "$7F50CE"
ModifyBoots: ModifyBoots:
PHA PHA
LDA !BOOTS_MODIFIER : CMP.b #$01 : BNE + LDA.l BootsModifier : CMP.b #$01 : BNE +
PLA : AND AbilityFlags : ORA.b #$04 : RTL ; yes boots PLA : AND.l AbilityFlags : ORA.b #$04 : RTL ; yes boots
+ : CMP.b #$02 : BNE + + : CMP.b #$02 : BNE +
PLA : AND AbilityFlags : AND.b #$FB : RTL ; no boots PLA : AND.l AbilityFlags : AND.b #$FB : RTL ; no boots
+ : LDA FakeBoots : CMP.b #$01 : BNE + + : LDA.l FakeBoots : CMP.b #$01 : BNE +
LDA $5B : BEQ ++ : LDA $59 : BNE + ; hover check LDA.b LinkSlipping : BEQ ++ : LDA.b $59 : BNE + ; hover check
++ : PLA : AND AbilityFlags : ORA.b #$04 : RTL ; yes boots, not hovering ++ : PLA : AND.l AbilityFlags : ORA.b #$04 : RTL ; yes boots, not hovering
+ +
PLA PLA
AND AbilityFlags ; regular boots AND.l AbilityFlags ; regular boots
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
AddBonkTremors: AddBonkTremors:
PHA PHA
LDA $46 : BNE + ; Check for incapacitated Link LDA.b $46 : BNE + ; Check for incapacitated Link
JSL.l IncrementBonkCounter JSL.l IncrementBonkCounter
+ +
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + LDA.l BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BNE + ; Check for Boots LDA.l BootsEquipment : BNE + ; Check for Boots
PLA : RTL PLA : RTL
+ +
PLA PLA
@@ -32,46 +31,46 @@ RTL
BonkBreakableWall: BonkBreakableWall:
PHX : PHP PHX : PHP
SEP #$30 ; set 8-bit accumulator and index registers SEP #$30 ; set 8-bit accumulator and index registers
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + LDA.l BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BNE + ; Check for Boots LDA.l BootsEquipment : BNE + ; Check for Boots
PLP : PLX : LDA.w #$0000 : RTL PLP : PLX : LDA.w #$0000 : RTL
+ +
PLP : PLX PLP : PLX
LDA $0372 : AND.w #$00FF ; things we wrote over LDA.w $0372 : AND.w #$00FF ; things we wrote over
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
BonkRockPile: BonkRockPile:
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + LDA.l BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BNE + ; Check for Boots LDA.l BootsEquipment : BNE + ; Check for Boots
LDA.b #$00 : RTL LDA.b #$00 : RTL
+ +
LDA $02EF : AND.b #$70 ; things we wrote over LDA.w TileActBE : AND.b #$70 ; things we wrote over
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
GravestoneHook: GravestoneHook:
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + LDA.l BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BEQ .done ; Check for Boots LDA.l BootsEquipment : BEQ .done ; Check for Boots
+ +
LDA $0372 : BEQ .done ; things we wrote over LDA.w $0372 : BEQ .done ; things we wrote over
JML.l moveGravestone JML.l moveGravestone
.done .done
JML.l GravestoneHook_continue JML.l GravestoneHook_continue
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
JumpDownLedge: JumpDownLedge:
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + LDA.l BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BNE + ; Check for Boots LDA.l BootsEquipment : BNE + ; Check for Boots
; Disarm Waterwalk ; Disarm Waterwalk
LDA $5B : CMP.b #$01 : BNE + LDA.b LinkSlipping : CMP.b #$01 : BNE +
STZ $5B STZ.b LinkSlipping
+ +
LDA $1B : BNE .done : LDA.b #$02 : STA $EE ; things we wrote over LDA.b IndoorsFlag : BNE .done : LDA.b #$02 : STA.b LinkLayer ; things we wrote over
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
BonkRecoil: BonkRecoil:
LDA !BOOTS_MODIFIER : CMP.b #$01 : BEQ + LDA.l BootsModifier : CMP.b #$01 : BEQ +
LDA BootsEquipment : BNE + ; Check for Boots LDA.l BootsEquipment : BNE + ; Check for Boots
LDA.b #$16 : STA $29 : RTL LDA.b #$16 : STA.b LinkRecoilZ : RTL
+ +
LDA.b #$24 : STA $29 ; things we wrote over LDA.b #$24 : STA.b LinkRecoilZ ; things we wrote over
RTL RTL

View File

@@ -2,8 +2,8 @@
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
AssignKiki: AssignKiki:
LDA.b #$00 : STA FollowerDropped ; defuse bomb LDA.b #$00 : STA.l FollowerDropped ; defuse bomb
LDA.b #$0A : STA FollowerIndicator ; assign kiki as follower LDA.b #$0A : STA.l FollowerIndicator ; assign kiki as follower
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -11,10 +11,9 @@ RTL
; Name: AllowSQ ; Name: AllowSQ
; Returns: Accumulator = 0 if S&Q is disallowed, 1 if allowed ; Returns: Accumulator = 0 if S&Q is disallowed, 1 if allowed
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!ITEM_BUSY = "$7F5091"
AllowSQ: AllowSQ:
LDA ProgressIndicator : BEQ .done ; thing we overwrote - check if link is in his bed LDA.l ProgressIndicator : BEQ .done ; thing we overwrote - check if link is in his bed
LDA !ITEM_BUSY : EOR #$01 LDA.l BusyItem : EOR.b #$01
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -23,8 +22,8 @@ RTL
;0 = Reset Music ;0 = Reset Music
;1 = Don't Reset Music ;1 = Don't Reset Music
MSMusicReset: MSMusicReset:
LDA $8A : CMP.b #$80 : BNE + LDA.b OverworldIndex : CMP.b #$80 : BNE +
LDA $23 LDA.b LinkPosX+1
+ +
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -32,11 +31,11 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;0 = Become (Perma)bunny ;0 = Become (Perma)bunny
DecideIfBunny: DecideIfBunny:
LDA MoonPearlEquipment : BNE .done LDA.l MoonPearlEquipment : BNE .done
LDA CurrentWorld : AND.b #$40 LDA.l CurrentWorld : AND.b #$40
PHA : LDA.l InvertedMode : BNE .inverted PHA : LDA.l InvertedMode : BNE .inverted
.normal .normal
PLA : EOR #$40 PLA : EOR.b #$40
BRA .done BRA .done
.inverted .inverted
PLA PLA
@@ -47,9 +46,9 @@ RTL
DecideIfBunnyByScreenIndex: DecideIfBunnyByScreenIndex:
; If indoors we don't have a screen index. Return non-bunny to make mirror-based ; If indoors we don't have a screen index. Return non-bunny to make mirror-based
; superbunny work ; superbunny work
LDA $1B : BNE .done LDA.b IndoorsFlag : BNE .done
LDA MoonPearlEquipment : BNE .done LDA.l MoonPearlEquipment : BNE .done
LDA $8A : AND.b #$40 : PHA LDA.b OverworldIndex : AND.b #$40 : PHA
LDA.l InvertedMode : BNE .inverted LDA.l InvertedMode : BNE .inverted
.normal .normal
PLA : EOR #$40 PLA : EOR #$40
@@ -58,21 +57,12 @@ DecideIfBunnyByScreenIndex:
PLA PLA
.done .done
RTL RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
;ReadInventoryPond:
; CPX.b #$1B : BNE + : LDA.b #$01 : RTL : +
; LDA EquipmentWRAM, X
;RTL
;--------------------------------------------------------------------------------
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FixBunnyOnExitToLightWorld: FixBunnyOnExitToLightWorld:
LDA.w $02E0 : BEQ + LDA.w BunnyFlag : BEQ +
JSL.l DecideIfBunny : BEQ + JSL.l DecideIfBunny : BEQ +
STZ $5D ; set player mode to Normal STZ.b LinkState ; set player mode to Normal
STZ $02E0 : STZ $56 ; return player graphics to normal STZ.w BunnyFlag : STZ.b BunnyFlagDP ; return player graphics to normal
+ +
RTS RTS
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -83,17 +73,17 @@ RTS
FixAga2Bunny: FixAga2Bunny:
LDA.l FixFakeWorld : BEQ + ; Only use this fix is fakeworld fix is in use LDA.l FixFakeWorld : BEQ + ; Only use this fix is fakeworld fix is in use
LDA.l InvertedMode : BEQ +++ LDA.l InvertedMode : BEQ +++
LDA.b #$00 : STA CurrentWorld ; Switch to light world LDA.b #$00 : STA.l CurrentWorld ; Switch to light world
BRA ++ BRA ++
+++ +++
LDA.b #$40 : STA CurrentWorld ; Switch to dark world LDA.b #$40 : STA.l CurrentWorld ; Switch to dark world
++ ++
JSL DecideIfBunny : BNE + JSL DecideIfBunny : BNE +
JSR MakeBunny JSR MakeBunny
LDA.b #$04 : STA.w $012C ; play bunny music LDA.b #$04 : STA.w MusicControlRequest ; play bunny music
BRA .done BRA .done
+ +
LDA.b #$09 : STA.w $012C ; what we wrote over LDA.b #$09 : STA.w MusicControlRequest ; what we wrote over
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -101,8 +91,8 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
MakeBunny: MakeBunny:
PHX : PHY PHX : PHY
LDA.b #$17 : STA $5D ; set player mode to permabunny LDA.b #$17 : STA.b LinkState ; set player mode to permabunny
LDA.b #$01 : STA $02E0 : STA $56 ; make player look like bunny LDA.b #$01 : STA.w BunnyFlag : STA.b BunnyFlagDP ; make player look like bunny
JSL LoadGearPalettes_bunny JSL LoadGearPalettes_bunny
PLY : PLX PLY : PLX
RTS RTS
@@ -130,27 +120,27 @@ RTS
; Fix for SQ jumping causing accidental Exploration Glitch ; Fix for SQ jumping causing accidental Exploration Glitch
SQEGFix: SQEGFix:
LDA.l Bugfix_PodEG : BEQ ++ LDA.l Bugfix_PodEG : BEQ ++
STZ.w $047A ; disarm exploration glitch STZ.w LayerAdjustment ; disarm exploration glitch
++ RTL ++ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Fix crystal not spawning when using somaria vs boss ; Fix crystal not spawning when using somaria vs boss
TryToSpawnCrystalUntilSuccess: TryToSpawnCrystalUntilSuccess:
STX $02D8 ; what we overwrote STX.w ItemReceiptID ; what we overwrote
JSL AddAncillaLong : BCS .failed ; a clear carry flag indicates success JSL AddAncillaLong : BCS .failed ; a clear carry flag indicates success
.spawned .spawned
STZ $AE ; the "trying to spawn crystal" flag STZ.b RoomTag ; the "trying to spawn crystal" flag
STZ $AF ; the "trying to spawn pendant" flag STZ.b RoomTag+1 ; the "trying to spawn pendant" flag
.failed .failed
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Fix crystal not spawning when using somaria vs boss ; Fix crystal not spawning when using somaria vs boss
WallmasterCameraFix: WallmasterCameraFix:
STZ $A7 ; disable vertical camera scrolling for current room STZ.b CameraBoundV ; disable vertical camera scrolling for current room
REP #$20 REP #$20
STZ $0618 ; something about scrolling, setting these to 0 tricks the game STZ.w CameraScrollN ; something about scrolling, setting these to 0 tricks the game
STZ $061A ; into thinking we're at the edge of the room so it doesn't scroll. STZ.w CameraScrollS ; into thinking we're at the edge of the room so it doesn't scroll.
SEP #$20 SEP #$20
JML Sound_SetSfx3PanLong ; what we wrote over, also this will RTL JML Sound_SetSfx3PanLong ; what we wrote over, also this will RTL
@@ -158,8 +148,8 @@ WallmasterCameraFix:
; Fix losing glove colors ; Fix losing glove colors
LoadActualGearPalettesWithGloves: LoadActualGearPalettesWithGloves:
REP #$20 REP #$20
LDA SwordEquipment : STA $0C LDA.l SwordEquipment : STA.b Scrap0C
LDA ArmorEquipment : AND.w #$00FF LDA.l ArmorEquipment : AND.w #$00FF
JSL LoadGearPalettes_variable JSL LoadGearPalettes_variable
JSL SpriteSwap_Palette_ArmorAndGloves_part_two JSL SpriteSwap_Palette_ArmorAndGloves_part_two
RTL RTL
@@ -167,24 +157,24 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Fix Bunny Palette Map Bug ; Fix Bunny Palette Map Bug
LoadGearPalette_safe_for_bunny: LoadGearPalette_safe_for_bunny:
LDA $10 LDA.b GameMode
CMP.w #$030E : BEQ .new ; opening dungeon map CMP.w #$030E : BEQ .new ; opening dungeon map
CMP.w #$070E : BEQ .new ; opening overworld map CMP.w #$070E : BEQ .new ; opening overworld map
.original .original
- -
LDA [$00] LDA.b [Scrap00]
STA $7EC300, X STA.l PaletteBufferAux, X
STA $7EC500, X STA.l PaletteBuffer, X
INC $00 : INC $00 INC.b Scrap00 : INC.b Scrap00
INX #2 INX #2
DEY DEY
BPL - BPL -
RTL RTL
.new .new
- -
LDA [$00] LDA.b [Scrap00]
STA $7EC500, X STA.l PaletteBuffer, X
INC $00 : INC $00 INC.b Scrap00 : INC.b Scrap00
INX #2 INX #2
DEY DEY
BPL - BPL -
@@ -193,16 +183,16 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Fix pedestal pull overlay ; Fix pedestal pull overlay
PedestalPullOverlayFix: PedestalPullOverlayFix:
LDA.b #$09 : STA $039F, X ; the thing we wrote over LDA.b #$09 : STA.w AncillaGeneral, X ; the thing we wrote over
LDA $1B : BNE + LDA.b IndoorsFlag : BNE +
LDA $8A : CMP.b #$80 : BNE + LDA.b OverworldIndex : CMP.b #$80 : BNE +
LDA $8C : CMP.b #$97 LDA.b OverlayID : CMP.b #$97
+ +
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FixJingleGlitch: FixJingleGlitch:
LDA.b $11 LDA.b GameSubMode
BEQ .set_doors BEQ .set_doors
LDA.l AllowAccidentalMajorGlitch LDA.l AllowAccidentalMajorGlitch
@@ -210,7 +200,7 @@ FixJingleGlitch:
.set_doors .set_doors
LDA.b #$05 LDA.b #$05
STA.b $11 STA.b GameSubMode
.exit .exit
RTL RTL
@@ -222,7 +212,36 @@ pushpc
pullpc pullpc
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
SetOverworldTransitionFlags: SetOverworldTransitionFlags:
LDA #$01 LDA.b #$01
STA $0ABF ; used by witch STA.w OWTransitionFlag
STA $021B ; used by race game STA.w RaceGameFlag
RTL RTL
;--------------------------------------------------------------------------------
ParadoxCaveGfxFix:
; Always upload line unless you're moving into paradox cave (0x0FF) from above (0x0EF)
LDA.b IndoorsFlag : BEQ .uploadLine
LDX.b RoomIndex : CPX.w #$00FF : BNE .uploadLine
LDX.b PreviousRoom : CPX.w #$00EF : BNE .uploadLine
;Ignore uploading four specific lines of tiles to VRAM
LDX.w VRAMUploadAddress
; Line 1
CPX.w #$1800 : BEQ .skipMostOfLine
; Line 2
CPX.w #$1A00 : BEQ .skipMostOfLine
; Line 3
CPX.w #$1C00 : BEQ .uploadLine
; Line 4
CPX.w #$1E00 : BEQ .uploadLine
.uploadLine
LDA.b #$01 : STA.w MDMAEN
.skipLine
RTL
.skipMostOfLine
; Set line length to 192 bytes (the first 6 8x8 tiles in the line)
LDX.w #$00C0 : STX.w DAS0L
BRA .uploadLine
;--------------------------------------------------------------------------------

View File

@@ -1,34 +0,0 @@
;================================================================================
; Randomize Catfish
;--------------------------------------------------------------------------------
!HEART_REDRAW = "$7F5000"
LoadCatfishItemGFX:
LDA.l $1DE185 ; location randomizer writes catfish item to
JML PrepDynamicTile
;--------------------------------------------------------------------------------
DrawThrownItem:
LDA $8A : CMP.b #$81 : BNE .catfish
.zora
LDA.b #$01 : STA !HEART_REDRAW
LDA.l $1DE1C3 ; location randomizer writes zora item to
BRA .draw
.catfish
LDA.l $1DE185 ; location randomizer writes catfish item to
.draw
JML DrawDynamicTile
;--------------------------------------------------------------------------------
MarkThrownItem:
JSL Link_ReceiveItem ; thing we wrote over
LDA $8A : CMP.b #$81 : BNE .catfish
.zora
JML ItemSet_ZoraKing
.catfish
JML ItemSet_Catfish
;--------------------------------------------------------------------------------

248
clock.asm
View File

@@ -1,248 +0,0 @@
;--------------------------------------------------------------------------------
; http://problemkaputt.de/fullsnes.htm
; 2800h-2801h S-RTC Real Time Clock I/O Ports
; cartridge type change from #$02 to #$55 to enable S-RTC
; SNES Cart S-RTC (Realtime Clock) (1 game)
;
; PCB "SHVC-LJ3R-01" with 24pin "Sharp S-RTC" chip. Used only by one japanese game:
; Dai Kaiju Monogatari 2 (1996) Birthday/Hudson Soft (JP)
;
; S-RTC I/O Ports
; 002800h S-RTC Read (R)
; 002801h S-RTC Write (W)
; Both registers are 4bits wide. When writing: Upper 4bit should be zero. When reading: Upper 4bit should be masked-off (they do possibly contain garbage, eg. open-bus).
;
; S-RTC Communication
; The sequence for setting, and then reading the time is:
; Send <0Eh,04h,0Dh,0Eh,00h,Timestamp(12 digits),0Dh> to [002801h]
; If ([002800h] AND 0F)=0Fh then read <Timestamp(13 digits)>
; If ([002800h] AND 0F)=0Fh then read <Timestamp(13 digits)>
; If ([002800h] AND 0F)=0Fh then read <Timestamp(13 digits)>
; If ([002800h] AND 0F)=0Fh then read <Timestamp(13 digits)>
; etc.
; The exact meaning of the bytes is unknown. 0Eh/0Dh seems to invoke/terminate commands, 04h might be some configuration stuff (like setting 24-hour mode). 00h is apparently the set-time command. There might be further commands (such like setting interrupts, alarm, 12-hour mode, reading battery low & error flags, etc.). When reading, 0Fh seems to indicate sth like "time available".
; The 12/13-digit "SSMMHHDDMYYY(D)" Timestamps are having the following format:
; Seconds.lo (BCD, 0..9)
; Seconds.hi (BCD, 0..5)
; Minutes.lo (BCD, 0..9)
; Minutes.hi (BCD, 0..5)
; Hours.lo (BCD, 0..9)
; Hours.hi (BCD, 0..2)
; Day.lo (BCD, 0..9)
; Day.hi (BCD, 0..3)
; Month (HEX, 01h..0Ch)
; Year.lo (BCD, 0..9)
; Year.hi (BCD, 0..9)
; Century (HEX, 09h..0Ah for 19xx..20xx)
; When READING the time, there is one final extra digit (the existing software doesn't transmit that extra digit on WRITING, though maybe it's possible to do writing, too):
; Day of Week? (0..6) (unknown if RTC assigns sth like 0=Sunday or 0=Monday)
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
macro A_x10()
ASL #1 : PHA
ASL #2 : !ADD 1,s
STA 1,s : PLA
endmacro
;--------------------------------------------------------------------------------
macro A_x24()
ASL #3 : PHA
ASL #1 : !ADD 1,s
STA 1,s : PLA
endmacro
;--------------------------------------------------------------------------------
macro A_x60()
ASL #2 : PHA
ASL #4 : !SUB 1,s
STA 1,s : PLA
endmacro
;--------------------------------------------------------------------------------
macro Clock_ReadBCD()
LDA $002800 : PHA
LDA $002800 : %A_x10() : !ADD 1,s
STA 1,s : PLA
endmacro
;--------------------------------------------------------------------------------
Clock_Test:
JSL.l Clock_Init
JML.l Clock_IsSupported
;--------------------------------------------------------------------------------
; Clock_Init
;--------------------------------------------------------------------------------
Clock_Init:
LDA.b #$0E : STA $002801
LDA.b #$04 : STA $002801
LDA.b #$0D : STA $002801
LDA.b #$0E : STA $002801
LDA.b #$00 : STA $002801
LDA.b #$00 : STA $002801
LDA.b #$00 : STA $002801
LDA.b #$00 : STA $002801
LDA.b #$00 : STA $002801
LDA.b #$00 : STA $002801
LDA.b #$00 : STA $002801
LDA.b #$01 : STA $002801
LDA.b #$00 : STA $002801
LDA.b #$01 : STA $002801
LDA.b #$00 : STA $002801
LDA.b #$00 : STA $002801
LDA.b #$0A : STA $002801
LDA.b #$0D : STA $002801
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Clock_IsSupported
;--------------------------------------------------------------------------------
; Input: None (8-bit accumulator)
;--------------------------------------------------------------------------------
; Output:
; Carry - unset if unsupported, set if supported
; Zero - Undefined
;--------------------------------------------------------------------------------
; Side Effects:
; S-RTC is ready for reading upon exit if supported
;--------------------------------------------------------------------------------
Clock_IsSupported:
PHA : PHX
LDX #$00;
-
LDA $002800 : AND.b #$0F : CMP #$0F : BEQ .done ; check for clock chip ready signal
CPX.b #$0E : BCC ++ : CLC : BRA .done ; if we've read 14 bytes with no success, unset carry and exit
++ INX
BRA -
.done
PLX : PLA
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Clock_QuickStamp
;--------------------------------------------------------------------------------
; Input: None
;--------------------------------------------------------------------------------
; Output:
; $00.b - 24-bit timestamp (low)
; $01.b - 24-bit timestamp (mid)
; $02.b - 24-bit timestamp (high)
; $03.b - zero
; Carry - Unset if error, Set if success
; Zero - Undefined
;--------------------------------------------------------------------------------
; Side Effects:
; Requires Mode-7 Matrix Registers
;--------------------------------------------------------------------------------
Clock_QuickStamp:
PHA : PHX : PHP
SEP #$30 ; set 8-bit accumulator and index registers
LDX #$00;
-
LDA $002800 : AND.b #$0F : CMP #$0F : BEQ .ready ; check for clock chip ready signal
CPX.b #$0E : !BLT ++ : CLC : JMP .done : ++ ; if we've read 14 bytes with no success, unset carry and exit
INX
BRA -
SEC ; indicate success
.ready
%Clock_ReadBCD() : STA $00 ; seconds
%Clock_ReadBCD() : STA $01 ; minutes
%Clock_ReadBCD() : STA $02 ; hours
%Clock_ReadBCD() : STA $03 ; days
REP $20 ; set 16-bit accumulator
LDA $01 : AND #$00FF : %A_x60() ; convert minutes to seconds
STZ $01 : !ADD $00 : STA $00 ; store running total seconds to $00
LDA $03 : AND #$00FF : %A_x24() ; convert days to hours
STZ $03 : !ADD $02 ; get total hours
%A_x60() ; get total minutes
LDY #$60
JSL.l Multiply_A16Y8
STY $02 : STZ $03
!ADD $00 : BCC + : INC $02 : +
.done
PLP : PLX : PLA
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Multiply_A16Y8:
;--------------------------------------------------------------------------------
; Expects:
; Accumulator - 16-bit
; Index Registers - 8-bit
;--------------------------------------------------------------------------------
; Notes:
; Found a (wrong) version of this on wikibooks. This is cleaned up and fixed.
;--------------------------------------------------------------------------------
Multiply_A16Y8:
SEP #$20 ; set 8-bit accumulator
STY $4202
STA $4203
NOP #4
LDA $4216
LDY $4217
XBA
STA $4203
NOP #2
TYA
CLC
ADC $4216
LDY $4217
BCC .carry_bit
INY
.carry_bit:
XBA
REP #$20 ; set 16-bit accumulator
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Clock_GetTime
;--------------------------------------------------------------------------------
; Input: None
;--------------------------------------------------------------------------------
; Output:
; $00.b - Seconds
; $01.b - Minutes
; $02.b - Hours
; $03.b - Days
; $04.b - Months
; $05.w - Years
; Carry - Unset if error, Set if success
; Zero - Undefined
;--------------------------------------------------------------------------------
Clock_GetTime:
PHA : PHX : PHY : PHP
SEP #$30 ; set 8-bit accumulator and index registers
LDX #$00;
-
LDA $002800 : AND.b #$0F : CMP #$0F : BEQ .ready ; check for clock chip ready signal
CPX.b #$0E : !BLT ++ : CLC : JMP .done : ++ ; if we've read 14 bytes with no success, unset carry and exit
INX
BRA -
SEC ; indicate success
.ready
%Clock_ReadBCD() : STA $00 ; seconds
%Clock_ReadBCD() : STA $01 ; minutes
%Clock_ReadBCD() : STA $02 ; hours
%Clock_ReadBCD() : STA $03 ; days
LDA $002800 : STA $04 ; months
%Clock_ReadBCD() : STA $05 ; years
LDA $002800 : STA $06 ; century
REP $20 ; set 16-bit accumulator
STA $06 : AND #$00FF : %A_x10() : %A_x10() : !ADD #1000 ; multiply century digit by 100 and add 1000
STZ $06 : !ADD $05 : STA $05 ; add lower 2 digits of the year and store
.done
PLP : PLY : PLX : PLA
RTL
;--------------------------------------------------------------------------------

View File

@@ -1,19 +1,15 @@
;--------------------------------------------------------------------------------
; $7F5010 - Scratch Space
;--------------------------------------------------------------------------------
DrawDungeonCompassCounts: DrawDungeonCompassCounts:
LDX $1B : BNE + : RTL : + ; Skip if outdoors LDX.b IndoorsFlag : BNE + : RTL : + ; Skip if outdoors
; extra hard safeties for getting dungeon ID to prevent crashes ; extra hard safeties for getting dungeon ID to prevent crashes
PHA PHA
LDA.w $040C : AND.w #$00FE : TAX ; force dungeon ID to be multiple of 2 LDA.w DungeonID : AND.w #$00FE : TAX ; force dungeon ID to be multiple of 2
PLA PLA
CPX.b #$1B : BCS .done ; Skip if not in a valid dungeon ID CPX.b #$1B : BCS .done ; Skip if not in a valid dungeon ID
BIT.w #$0002 : BNE ++ ; if CompassMode==2, we don't check for the compass BIT.w #$0002 : BNE ++ ; if CompassMode==2, we don't check for the compass
LDA CompassField : AND.l DungeonItemMasks, X ; Load compass values to A, mask with dungeon item masks LDA.l CompassField : AND.l DungeonItemMasks, X ; Load compass values to A, mask with dungeon item masks
BEQ .done ; skip if we don't have compass BEQ .done ; skip if we don't have compass
++ ++
@@ -21,23 +17,23 @@ DrawDungeonCompassCounts:
BNE + BNE +
INC INC
+ +
LDA.l CompassTotalsWRAM, X : AND #$00FF LDA.l CompassTotalsWRAM, X : AND.w #$00FF
SEP #$20 SEP #$20
JSR HudHexToDec2Digit JSR HudHexToDec2Digit
REP #$20 REP #$20
PHX PHX
LDX.b $06 : TXA : ORA #$2400 : STA $7EC79A LDX.b Scrap06 : TXA : ORA.w #$2400 : STA.l HUDTileMapBuffer+$9A
LDX.b $07 : TXA : ORA #$2400 : STA $7EC79C LDX.b Scrap07 : TXA : ORA.w #$2400 : STA.l HUDTileMapBuffer+$9C
PLX PLX
LDA DungeonLocationsChecked, X : AND #$00FF LDA.l DungeonLocationsChecked, X : AND.w #$00FF
SEP #$20 SEP #$20
JSR HudHexToDec2Digit JSR HudHexToDec2Digit
REP #$20 REP #$20
LDX.b $06 : TXA : ORA #$2400 : STA $7EC794 ; Draw the item count LDX.b Scrap06 : TXA : ORA.w #$2400 : STA.l HUDTileMapBuffer+$94 ; Draw the item count
LDX.b $07 : TXA : ORA #$2400 : STA $7EC796 LDX.b Scrap07 : TXA : ORA.w #$2400 : STA.l HUDTileMapBuffer+$96
LDA.w #$2830 : STA $7EC798 ; draw the slash LDA.w #$2830 : STA.l HUDTileMapBuffer+$98 ; draw the slash
.done .done
RTL RTL
@@ -47,10 +43,10 @@ DungeonItemMasks: ; these are dungeon correlations to $7EF364 - $7EF369 so it kn
dw $0080, $0040, $0020, $0010, $0008, $0004 dw $0080, $0040, $0020, $0010, $0008, $0004
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
InitCompassTotalsRAM: InitCompassTotalsRAM:
LDX #$00 LDX.b #$00
- -
LDA CompassTotalsROM, X : STA CompassTotalsWRAM, X LDA.l CompassTotalsROM, X : STA.l CompassTotalsWRAM, X
INX INX
CPX #$0F : !BLT - CPX.b #$0F : !BLT -
RTL RTL

View File

@@ -1,29 +0,0 @@
;--------------------------------------------------------------------------------
ParadoxCaveGfxFix:
; Always upload line unless you're moving into paradox cave (0x0FF) from above (0x0EF)
LDA $1B : BEQ .uploadLine
LDX $A0 : CPX #$00FF : BNE .uploadLine
LDX $A2 : CPX #$00EF : BNE .uploadLine
;Ignore uploading four specific lines of tiles to VRAM
LDX $0118
; Line 1
CPX #$1800 : BEQ .skipMostOfLine
; Line 2
CPX #$1A00 : BEQ .skipMostOfLine
; Line 3
CPX #$1C00 : BEQ .uploadLine
; Line 4
CPX #$1E00 : BEQ .uploadLine
.uploadLine
LDA.b #$01 : STA $420B
.skipLine
RTL
.skipMostOfLine
; Set line length to 192 bytes (the first 6 8x8 tiles in the line)
LDX.w #$00C0 : STX $4305
BRA .uploadLine
;--------------------------------------------------------------------------------

View File

@@ -1,182 +0,0 @@
;================================================================
; Contributor: Myramong
;================================================================
;Sprite_ShowMessageFromPlayerContact_Edit:
;{
; STZ $1CE8
; JSL.l Sprite_CheckDamageToPlayerSameLayerLong : BCC .dont_show
;
; LDA $4D : CMP.b #$02 : BEQ .dont_show
;
; JSL.l Sprite_DirectionToFacePlayerLong : TYA : EOR.b #$03
; SEC
;RTL
;.dont_show
; LDA $0DE0, X
; CLC
;RTL
;}
;================================================================
;Sprite_ShowSolicitedMessageIfPlayerFacing_Edit:
;{
; JSL.l Sprite_CheckDamageToPlayerSameLayerLong : BCC .alpha
; JSL.l Sprite_CheckIfPlayerPreoccupied : BCS .alpha
; LDA $F6 : BPL .alpha
; LDA $0F10, X : BNE .alpha
;
; LDA $4D : CMP.b #$02 : BEQ .alpha
;
; STZ $1CE8 ; set text choice to 1st option (usually yes/confirm/etc)
; JSL.l Sprite_DirectionToFacePlayerLong : PHX : TYX
;
; ; Make sure that the sprite is facing towards the player, otherwise
; ; talking can't happen. (What sprites actually use this???)
; LDA $05E1A3, X : PLX : CMP $2F : BNE .not_facing_each_other
; PHY
; LDA.b #$40 : STA $0F10, X
; PLA : EOR.b #$03
; SEC
;RTL
;.not_facing_each_other
;.alpha
; LDA $0DE0, X
; CLC
;RTL
;}
;================================================================
;OldMountainMan_TransitionFromTagalong_Edit:
;{
; PHA
;
; LDA.b #$AD : JSL Sprite_SpawnDynamically
;
; PLA : PHX : TAX
;
; LDA $1A64, X : AND.b #$03 : STA $0EB0, Y
; STA $0DE0, Y
;
; LDA $1A00, X : CLC : ADC.b #$02 : STA $0D00, Y
; LDA $1A14, X : ADC.b #$00 : STA $0D20, Y
;
; LDA $1A28, X : CLC : ADC.b #$02 : STA $0D10, Y
; LDA $1A3C, X : ADC.b #$00 : STA $0D30, Y
;
; LDA $EE : STA $0F20, Y
;
; LDA.b #$01 : STA $0BA0, Y
; STA $0E80, Y
;
; LDA.b #$01 : STA $02E4 ; OldMountainMan_FreezePlayer
; STA $037B ; ^
;
; PLX
;
; LDA.b #$00 : STA FollowerIndicator
;
; STZ $5E
;
; JML $09A6B6 ; <- 4A6B6 tagalong.asm:1194 (SEP #$30 : RTS)
;}
;================================================================
Sprite_ShowSolicitedMessageIfPlayerFacing_Alt:
{
STA $1CF0
STY $1CF1
JSL Sprite_CheckDamageToPlayerSameLayerLong : BCC .alpha
JSL Sprite_CheckIfPlayerPreoccupied : BCS .alpha
LDA $F6 : BPL .alpha
LDA $0F10, X : BNE .alpha
LDA $4D : CMP.b #$02 : BEQ .alpha
JSL Sprite_DirectionToFacePlayerLong : PHX : TYX
; Make sure that the sprite is facing towards the player, otherwise
; talking can't happen. (What sprites actually use this???)
LDA $05E1A3, X : PLX : CMP $2F : BNE .not_facing_each_other
PHY
LDA $1CF0
LDY $1CF1
; Check what room we're in so we know which npc we're talking to
LDA.b $A0 : CMP #$05 : BEQ .SahasrahlaDialogs
CMP #$1C : BEQ .BombShopGuyDialog
BRA .SayNothing
.SahasrahlaDialogs
REP #$20 : LDA.l MapReveal_Sahasrahla : ORA MapOverlay : STA MapOverlay : SEP #$20
JSL DialogSahasrahla : BRA .SayNothing
.BombShopGuyDialog
REP #$20 : LDA.l MapReveal_BombShop : ORA MapOverlay : STA MapOverlay : SEP #$20
JSL DialogBombShopGuy
.SayNothing
LDA.b #$40 : STA $0F10, X
PLA : EOR.b #$03
SEC
RTL
.not_facing_each_other
.alpha
LDA $0DE0, X
CLC
RTL
}
;================================================================
Sprite_ShowSolicitedMessageIfPlayerFacing_PreserveMessage:
{
PHY
PHA
JSL Sprite_CheckDamageToPlayerSameLayerLong : BCC .alpha
JSL Sprite_CheckIfPlayerPreoccupied : BCS .alpha
LDA $F6 : BPL .alpha
LDA $0F10, X : BNE .alpha
LDA $4D : CMP.b #$02 : BEQ .alpha
JSL Sprite_DirectionToFacePlayerLong : PHX : TYX
; Make sure that the sprite is facing towards the player, otherwise
; talking can't happen. (What sprites actually use this???)
LDA $05E1A3, X : PLX : CMP $2F : BNE .not_facing_each_other
PLA : XBA : PLA
PHY
TAY : XBA
JSL Sprite_ShowMessageUnconditional
LDA.b #$40 : STA $0F10, X
PLA : EOR.b #$03
SEC
RTL
.not_facing_each_other
.alpha
PLY
PLA
LDA $0DE0, X
CLC
RTL
}
;================================================================

View File

@@ -4,29 +4,28 @@
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Filtered Joypad 1 Register: [AXLR | ????] ; Filtered Joypad 1 Register: [AXLR | ????]
; Filtered Joypad 1 Register: [BYST | udlr] [AXLR | ????] ; Filtered Joypad 1 Register: [BYST | udlr] [AXLR | ????]
!INVERT_DPAD = "$7F50CB"
InvertDPad: InvertDPad:
LDA.l OneMindPlayerCount : BEQ .crowd_control LDA.l OneMindPlayerCount : BEQ .crowd_control
LDA.l !ONEMIND_ID LDA.l OneMindId
AND.b #$03 AND.b #$03
TAX TAX
LDA.l .onemind_controller_offset, X LDA.l .onemind_controller_offset, X
TAX TAX
LDA.w $4218,X : STA.w $00 LDA.w JOY1L,X : STA.w Scrap00
LDA.w $4219,X : STA.w $01 LDA.w JOY1H,X : STA.w Scrap01
LDA #$80 : STA $4201 ; reset this so latch can read it, otherwise RNG breaks LDA.b #$80 : STA.w WRIO ; reset this so latch can read it, otherwise RNG breaks
JML.l InvertDPadReturn JML.l InvertDPadReturn
.crowd_control .crowd_control
LDA !INVERT_DPAD : BNE + LDA.l ControllerInverter : BNE +
LDA $4218 : STA $00 LDA.w JOY1L : STA.b Scrap00
LDA $4219 : STA $01 LDA.w JOY1H : STA.b Scrap01
JML.l InvertDPadReturn JML.l InvertDPadReturn
+ DEC : BEQ .dpadOnly + DEC : BEQ .dpadOnly
@@ -34,47 +33,47 @@ InvertDPad:
DEC : BEQ .invertBoth DEC : BEQ .invertBoth
.swapSides .swapSides
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $4218 LDA.w JOY1L
BIT.w #$0840 : BEQ + : EOR.w #$0840 : + ; swap X/up BIT.w #$0840 : BEQ + : EOR.w #$0840 : + ; swap X/up
BIT.w #$0180 : BEQ + : EOR.w #$0180 : + ; swap A/right BIT.w #$0180 : BEQ + : EOR.w #$0180 : + ; swap A/right
BIT.w #$4200 : BEQ + : EOR.w #$4200 : + ; swap Y/left BIT.w #$4200 : BEQ + : EOR.w #$4200 : + ; swap Y/left
BIT.w #$8400 : BEQ + : EOR.w #$8400 : + ; swap B/down BIT.w #$8400 : BEQ + : EOR.w #$8400 : + ; swap B/down
STA $00 STA.b Scrap00
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
JML.l InvertDPadReturn JML.l InvertDPadReturn
.invertBoth .invertBoth
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $4218 LDA.w JOY1L
BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B
BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A
BIT.w #$0C00 : BEQ + : EOR.w #$0C00 : + ; swap up/down BIT.w #$0C00 : BEQ + : EOR.w #$0C00 : + ; swap up/down
BIT.w #$0300 : BEQ + : EOR.w #$0300 : + ; swap left/right BIT.w #$0300 : BEQ + : EOR.w #$0300 : + ; swap left/right
STA $00 STA.b Scrap00
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
JML.l InvertDPadReturn JML.l InvertDPadReturn
.buttonsOnly .buttonsOnly
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $4218 LDA.w JOY1L
BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B BIT.w #$8040 : BEQ + : EOR.w #$8040 : + ; swap X/B
BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A BIT.w #$4080 : BEQ + : EOR.w #$4080 : + ; swap Y/A
STA $00 STA.b Scrap00
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
JML.l InvertDPadReturn JML.l InvertDPadReturn
.dpadOnly .dpadOnly
LDA $4218 : STA $00 LDA.w JOY1L : STA.b Scrap00
LDA $4219 LDA.w JOY1H
BIT.b #$0C : BEQ + : EOR.b #$0C : + ; swap up/down BIT.b #$0C : BEQ + : EOR.b #$0C : + ; swap up/down
BIT.b #$03 : BEQ + : EOR.b #$03 : + ; swap left/right BIT.b #$03 : BEQ + : EOR.b #$03 : + ; swap left/right
STA $01 STA.b Scrap01
JML.l InvertDPadReturn JML.l InvertDPadReturn
.onemind_controller_offset .onemind_controller_offset
db 0 ; player 0 - $4218 - joy1d1 db 0 ; player 0 - JOY1L - joy1d1
db 0 ; player 1 - $4218 - joy1d1 db 0 ; player 1 - JOY1L - joy1d1
db 2 ; player 2 - $421A - joy2d1 db 2 ; player 2 - JOY2L - joy2d1
db 6 ; player 3 - $421E - joy2d2 db 6 ; player 3 - JOY4L - joy2d2
db 2 ; player 4 - $421A - joy2d1 db 2 ; player 4 - JOY2L - joy2d1
db 6 ; player 5 - $421E - joy2d2 db 6 ; player 5 - JOY4L - joy2d2
@@ -86,12 +85,12 @@ HandleOneMindController:
REP #$20 REP #$20
LDA.l !ONEMIND_TIMER LDA.l OneMindTimerRAM
DEC DEC
BPL .no_switch BPL .no_switch
SEP #$20 SEP #$20
LDA.l !ONEMIND_ID LDA.l OneMindId
INC INC
CMP.l OneMindPlayerCount CMP.l OneMindPlayerCount
BCC .no_wrap BCC .no_wrap
@@ -99,29 +98,26 @@ HandleOneMindController:
LDA.b #$01 ; reset to player 1 LDA.b #$01 ; reset to player 1
.no_wrap .no_wrap
STA.l !ONEMIND_ID STA.l OneMindId
REP #$20 REP #$20
LDA.l OneMindTimer LDA.l OneMindTimerInit
.no_switch .no_switch
STA.l !ONEMIND_TIMER STA.l OneMindTimerRAM
SEP #$20 SEP #$20
LDA.l !ONEMIND_ID LDA.l OneMindId
CMP.b #$04 ; is it player 4 or 5? CMP.b #$04 ; is it player 4 or 5?
BCC .no_multitap_switch BCC .no_multitap_switch
STZ.w $4201 STZ.w WRIO
.no_multitap_switch .no_multitap_switch
.no_onemind .no_onemind
STZ.b $12 STZ.b NMIDoneFlag
JML $008034 ; reset frame loop JML $008034 ; reset frame loop

View File

@@ -1,21 +1,6 @@
; $7F50D0 - $7F50FF - Block Cypher Parameters ; Scrap04 used for n
; $7F5100 - $7F51FF - Block Cypher Buffer ; Scrap06 used for rounds
!v = "$7F5100" ; Scrap08 use for dpScratch/MXResult (lower 32 of dpScratch)
!n = "$04"
!MXResult = "$08" ; an alternate name for the lower 32 bits of dpScratch
!dpScratch = "$08"
!keyBase = "$7F50D0"
!y = "$7F50E0"
!z = "$7F50E4"
!sum = "$7F50E8"
!p = "$7F50EC"
!rounds = "$06"
!e = "$7F50F0"
!upperScratch = "$7F50F2"
CryptoDelta: CryptoDelta:
dd #$9e3779b9 dd #$9e3779b9
@@ -35,164 +20,144 @@ macro ASL32Single(value)
; ROL handles the carry from the lower byte for us ; ROL handles the carry from the lower byte for us
endmacro endmacro
;macro LSR32(value,k)
; LDX.b <k>
; ?loop:
; %LSR32Single(<value>,<k>)
; DEX : CPX.b #$00 : BNE ?loop
;endmacro
;macro ASL32(value,k)
; LDX.b <k>
; ?loop:
; %LSR32Single(<value>,<k>)
; DEX : CPX.b #$00 : BNE ?loop
;endmacro
CryptoMX: CryptoMX:
PHX PHX
; upperScratch = (z>>5 ^ y <<2) ; upperScratch = (z>>5 ^ y <<2)
LDA.w !z : STA.b !dpScratch LDA.w z : STA.b Scrap08
LDA.w !z+2 : STA.b !dpScratch+2 LDA.w z+2 : STA.b Scrap08+2
%LSR32Single(!dpScratch) %LSR32Single(Scrap08)
%LSR32Single(!dpScratch) %LSR32Single(Scrap08)
%LSR32Single(!dpScratch) %LSR32Single(Scrap08)
%LSR32Single(!dpScratch) %LSR32Single(Scrap08)
%LSR32Single(!dpScratch) %LSR32Single(Scrap08)
;%LSR32(!dpScratch,#$05) ;%LSR32(Scrap08,#$05)
LDA.w !y : STA.b !dpScratch+4 LDA.w y : STA.b Scrap08+4
LDA.w !y+2 : STA.b !dpScratch+6 LDA.w y+2 : STA.b Scrap08+6
%ASL32Single(!dpScratch+4) %ASL32Single(Scrap08+4)
%ASL32Single(!dpScratch+4) %ASL32Single(Scrap08+4)
;%ASL32(!dpScratch+4,#$02) ;%ASL32(Scrap08+4,#$02)
LDA.b !dpScratch : EOR.b !dpScratch+4 : STA.w !upperScratch LDA.b Scrap08 : EOR.b Scrap08+4 : STA.w CryptoScratch
LDA.b !dpScratch+2 : EOR.b !dpScratch+6 : STA.w !upperScratch+2 LDA.b Scrap08+2 : EOR.b Scrap08+6 : STA.w CryptoScratch+2
;================================ ;================================
; upperscratch2 = (y>>3^z<<4) ; upperscratch2 = (y>>3^z<<4)
LDA.w !z : STA.b !dpScratch LDA.w z : STA.b Scrap08
LDA.w !z+2 : STA.b !dpScratch+2 LDA.w z+2 : STA.b Scrap08+2
%ASL32Single(!dpScratch) %ASL32Single(Scrap08)
%ASL32Single(!dpScratch) %ASL32Single(Scrap08)
%ASL32Single(!dpScratch) %ASL32Single(Scrap08)
%ASL32Single(!dpScratch) %ASL32Single(Scrap08)
;%ASL32(!dpScratch,#$04) ;%ASL32(Scrap08,#$04)
LDA.w !y : STA.b !dpScratch+4 LDA.w y : STA.b Scrap08+4
LDA.w !y+2 : STA.b !dpScratch+6 LDA.w y+2 : STA.b Scrap08+6
%LSR32Single(!dpScratch+4) %LSR32Single(Scrap08+4)
%LSR32Single(!dpScratch+4) %LSR32Single(Scrap08+4)
%LSR32Single(!dpScratch+4) %LSR32Single(Scrap08+4)
;%LSR32(!dpScratch+4,#$03) ;%LSR32(Scrap08+4,#$03)
LDA.b !dpScratch : EOR.b !dpScratch+4 : STA.w !upperScratch+4 LDA.b Scrap08 : EOR.b Scrap08+4 : STA.w CryptoScratch+4
LDA.b !dpScratch+2 : EOR.b !dpScratch+6 : STA.w !upperScratch+6 LDA.b Scrap08+2 : EOR.b Scrap08+6 : STA.w CryptoScratch+6
;================================ ;================================
; upperscratch = upperscratch + upperscratch2 ( == (z>>5^y<<2) + (y>>3^z<<4) ) ; upperscratch = upperscratch + upperscratch2 ( == (z>>5^y<<2) + (y>>3^z<<4) )
LDA.w !upperScratch : !ADD.w !upperScratch+4 : STA.w !upperScratch LDA.w CryptoScratch : !ADD.w CryptoScratch+4 : STA.w CryptoScratch
LDA.w !upperScratch+2 : ADC.w !upperScratch+6 : STA.w !upperScratch+2 LDA.w CryptoScratch+2 : ADC.w CryptoScratch+6 : STA.w CryptoScratch+2
;================================ ;================================
; dpscratch = sum^y ; dpscratch = sum^y
LDA.w !sum : EOR.w !y : STA.b !dpScratch LDA.w Sum : EOR.w y : STA.b Scrap08
LDA.w !sum+2 : EOR.w !y+2 : STA.b !dpScratch+2 LDA.w Sum+2 : EOR.w y+2 : STA.b Scrap08+2
;================================ ;================================
; dpscratch2 = (k[p&3^e]^z) ; dpscratch2 = (k[p&3^e]^z)
LDA.w !p : AND.w #$0003 : EOR.w !e : ASL #2 : TAX ; put (p&3)^e into X LDA.w p : AND.w #$0003 : EOR.w e : ASL #2 : TAX ; put (p&3)^e into X
LDA.w !keyBase, X : EOR.w !z : STA.b !dpScratch+4 LDA.w KeyBase, X : EOR.w z : STA.b Scrap08+4
LDA.w !keyBase+2, X : EOR.w !z+2 : STA.b !dpScratch+6 LDA.w KeyBase+2, X : EOR.w z+2 : STA.b Scrap08+6
;================================ ;================================
; upperscratch2 = dpscratch + dpscratch2 (== (sum^y) + (k[p&3^e]^z)) ; upperscratch2 = dpscratch + dpscratch2 (== (sum^y) + (k[p&3^e]^z))
LDA.b !dpScratch : !ADD.b !dpScratch+4 : STA.w !upperScratch+4 LDA.b Scrap08 : !ADD.b Scrap08+4 : STA.w CryptoScratch+4
LDA.b !dpScratch+2 : ADC.b !dpScratch+6 : STA.w !upperScratch+6 LDA.b Scrap08+2 : ADC.b Scrap08+6 : STA.w CryptoScratch+6
;================================ ;================================
; MXResult = uppserscratch ^ upperscratch2 ; MXResult = uppserscratch ^ upperscratch2
LDA.w !upperScratch : EOR.w !upperScratch+4 : STA.b !MXResult LDA.w CryptoScratch : EOR.w CryptoScratch+4 : STA.b Scrap08
LDA.w !upperScratch+2 : EOR.w !upperScratch+6 : STA.b !MXResult+2 LDA.w CryptoScratch+2 : EOR.w CryptoScratch+6 : STA.b Scrap08+2
PLX PLX
RTS RTS
;!DIVIDEND_LOW = $4204
;!DIVIDEND_HIGH = $4205
;!DIVISOR = $4206
;!QUOTIENT_LOW = $4214
;!QUOTIENT_HIGH = $4215
XXTEA_Decode: XXTEA_Decode:
PHP : PHB PHP : PHB
SEP #$30 ; set 8-bit accumulator and index SEP #$30 ; set 8-bit accumulator and index
LDA.b #$7F : PHA : PLB LDA.b #$7F : PHA : PLB
STZ.b !n+1 ; set upper byte of n to be zero, so it can safely be accessed in 16-bit mode STZ.b Scrap04+1 ; set upper byte of n to be zero, so it can safely be accessed in 16-bit mode
; search for lookup table index to avoid division and multiplication ; search for lookup table index to avoid division and multiplication
LDX.b #0 LDX.b #0
- -
LDA.l .n_lookup, X LDA.l .n_lookup, X
CMP.b !n : !BLT + CMP.b Scrap04 : !BLT +
INX INX
BRA - BRA -
+ +
; rounds = 6 + 52/n; ; rounds = 6 + 52/n;
LDA.l .round_counts, X : STA.b !rounds : STZ.b !rounds+1 LDA.l .round_counts, X : STA.b Scrap06 : STZ.b Scrap06+1
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
; sum = rounds*DELTA; ; sum = rounds*DELTA;
TXA : ASL #2 : TAX TXA : ASL #2 : TAX
LDA.l .initial_sums, X : STA.w !sum LDA.l .initial_sums, X : STA.w Sum
LDA.l .initial_sums+2, X : STA.w !sum+2 LDA.l .initial_sums+2, X : STA.w Sum+2
; y = v[0]; ; y = v[0];
LDA.w !v : STA.w !y LDA.w v : STA.w y
LDA.w !v+2 : STA.w !y+2 LDA.w v+2 : STA.w y+2
--- ---
LDA.w !sum : LSR #2 : AND.w #$0003 : STA.w !e ; e = (sum >> 2) & 3; LDA.w Sum : LSR #2 : AND.w #$0003 : STA.w e ; e = (sum >> 2) & 3;
LDA.b !n : DEC : STA.w !p LDA.b Scrap04 : DEC : STA.w p
-- BEQ + ; for (p=n-1; p>0; p--) { -- BEQ + ; for (p=n-1; p>0; p--) {
; z = v[p-1]; ; z = v[p-1];
ASL #2 : TAX ASL #2 : TAX
LDA.w !v-4, X : STA.w !z LDA.w v-4, X : STA.w z
LDA.w !v-4+2, X : STA.w !z+2 LDA.w v-4+2, X : STA.w z+2
; y = v[p] -= MX; ; y = v[p] -= MX;
JSR CryptoMX JSR CryptoMX
LDA.w !p : ASL #2 : TAX LDA.w p : ASL #2 : TAX
LDA.w !v, X : !SUB.b !MXResult : STA.w !v, X : STA.w !y LDA.w v, X : !SUB.b Scrap08 : STA.w v, X : STA.w y
LDA.w !v+2, X : SBC.b !MXResult+2 : STA.w !v+2, X : STA.w !y+2 LDA.w v+2, X : SBC.b Scrap08+2 : STA.w v+2, X : STA.w y+2
LDA.w !p : DEC : STA.w !p : BRA -- ; } LDA.w p : DEC : STA.w p : BRA -- ; }
+ +
; z = v[n-1]; ; z = v[n-1];
LDA.b !n : DEC : ASL #2 : TAX LDA.b Scrap04 : DEC : ASL #2 : TAX
LDA.w !v, X : STA.w !z LDA.w v, X : STA.w z
LDA.w !v+2, X : STA.w !z+2 LDA.w v+2, X : STA.w z+2
; y = v[0] -= MX; ; y = v[0] -= MX;
JSR CryptoMX JSR CryptoMX
LDA.w !v : !SUB.b !MXResult : STA.w !v : STA.w !y LDA.w v : !SUB.b Scrap08 : STA.w v : STA.w y
LDA.w !v+2 : SBC.b !MXResult+2 : STA.w !v+2 : STA.w !y+2 LDA.w v+2 : SBC.b Scrap08+2 : STA.w v+2 : STA.w y+2
; sum -= DELTA; ; sum -= DELTA;
LDA.w !sum : !SUB.l CryptoDelta : STA.w !sum LDA.w Sum : !SUB.l CryptoDelta : STA.w Sum
LDA.w !sum+2 : SBC.l CryptoDelta+2 : STA.w !sum+2 LDA.w Sum+2 : SBC.l CryptoDelta+2 : STA.w Sum+2
DEC !rounds : BEQ + : JMP --- : + ; } while (--rounds); DEC.b Scrap06 : BEQ + : JMP --- : + ; } while (--rounds);
PLB : PLP PLB : PLP
RTL RTL
@@ -243,69 +208,3 @@ db 32 ; n is 2
;dd (23*$9e3779b9)&$ffffffff ; n is 3 ;dd (23*$9e3779b9)&$ffffffff ; n is 3
dd (32*$9e3779b9)&$ffffffff ; n is 2 dd (32*$9e3779b9)&$ffffffff ; n is 2
;void btea(uint32_t *v, int n, uint32_t const key[4]) {
; uint32_t y, z, sum;
; unsigned p, rounds, e;
; } else if (n < -1) { /* Decoding Part */
; n = -n;
; rounds = 6 + 52/n;
; sum = rounds*DELTA;
; y = v[0];
; do {
; e = (sum >> 2) & 3;
; for (p=n-1; p>0; p--) {
; z = v[p-1];
; y = v[p] -= MX;
; }
; z = v[n-1];
; y = v[0] -= MX;
; sum -= DELTA;
; } while (--rounds);
; }
;BTEA will encode or decode n words as a single block where n > 1
;
;v is the n word data vector
;k is the 4 word key
;n is negative for decoding
;if n is zero result is 1 and no coding or decoding takes place, otherwise the result is zero
;assumes 32 bit 'long' and same endian coding and decoding
;#include <stdint.h>
;#define DELTA 0x9e3779b9
;#define MX ((((z>>5)^(y<<2)) + ((y>>3)^(z<<4))) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
;
;void btea(uint32_t *v, int n, uint32_t const key[4]) {
; uint32_t y, z, sum;
; unsigned p, rounds, e;
; if (n > 1) { /* Coding Part */
; rounds = 6 + 52/n;
; sum = 0;
; z = v[n-1];
; do {
; sum += DELTA;
; e = (sum >> 2) & 3;
; for (p=0; p<n-1; p++) {
; y = v[p+1];
; z = v[p] += MX;
; }
; y = v[0];
; z = v[n-1] += MX;
; } while (--rounds);
; } else if (n < -1) { /* Decoding Part */
; n = -n;
; rounds = 6 + 52/n;
; sum = rounds*DELTA;
; y = v[0];
; do {
; e = (sum >> 2) & 3;
; for (p=n-1; p>0; p--) {
; z = v[p-1];
; y = v[p] -= MX;
; }
; z = v[n-1];
; y = v[0] -= MX;
; sum -= DELTA;
; } while (--rounds);
; }
;}

View File

@@ -1,29 +1,15 @@
;================================================================================ ;================================================================================
!CUCCO_STORM = "$7F50C5" !CUCCO = $0B
!IS_INDOORS = "$7E001B" !INERT = $00
!ENEMY_STATE_TABLE = "$7E0DD0" !INIT = $08
!ENEMY_TYPE_TABLE = "$7E0E20" !ALIVE = $09
!ENEMY_AUX1_TABLE = "$7E0DA0" !CUCCO_ENRAGED = $23
!ENEMY_AUX2_TABLE = "$7E0DB0"
!ENEMY_DIRECTION_TABLE = "$7E0EB0"
!CUCCO = "#$0B"
!INERT = "#$00"
!INIT = "#$08"
!ALIVE = "#$09"
!CUCCO_ENRAGED = "#$23"
!LINK_POS_Y_LOW = "$20"
!LINK_POS_Y_HIGH = "$21"
!LINK_POS_X_LOW = "$22"
!LINK_POS_X_HIGH = "$23"
!ENEMY_POS_Y_LOW = "$7E0D00"
!ENEMY_POS_X_LOW = "$7E0D10"
!ENEMY_POS_Y_HIGH = "$7E0D20"
!ENEMY_POS_X_HIGH = "$7E0D30"
CuccoStorm: CuccoStorm:
SEP #$30 ; set 8-bit accumulator index registers SEP #$30 ; set 8-bit accumulator index registers
LDA.l !CUCCO_STORM : BEQ + ; only if storm is on LDA.l CuccoStormer : BEQ + ; only if storm is on
LDA.b $10 : CMP.b #$09 : BNE + ; only if outdoors LDA.b GameMode : CMP.b #$09 : BNE + ; only if outdoors
LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames LDA.l LoopFrames : AND.b #$7F : BNE + ; check every 128 frames
- -
@@ -32,18 +18,18 @@ CuccoStorm:
LDY.b #$FF : PHY ; push "cucco not found" LDY.b #$FF : PHY ; push "cucco not found"
LDX.b #$00 : -- : CPX.b #$10 : !BGE .ldone LDX.b #$00 : -- : CPX.b #$10 : !BGE .ldone
LDA.w !ENEMY_STATE_TABLE, X : CMP.b !ALIVE : BEQ +++ LDA.w SpriteAITable, X : CMP.b #!ALIVE : BEQ +++
; enemy not found ; enemy not found
CMP.b !INERT : BNE ++ CMP.b #!INERT : BNE ++
; log inert enemy slot ; log inert enemy slot
PLA : PHX PLA : PHX
BRA ++ BRA ++
+++ +++
; found an enemy ; found an enemy
LDA.l !ENEMY_TYPE_TABLE, X : CMP.b !CUCCO : BNE ++ LDA.l SpriteTypeTable, X : CMP.b #!CUCCO : BNE ++
; it's a cucco ; it's a cucco
TXY ; record where we found the living cucco in case we don't find any angry ones TXY ; record where we found the living cucco in case we don't find any angry ones
LDA.w !ENEMY_AUX1_TABLE, X : CMP.b !CUCCO_ENRAGED : !BLT ++ LDA.w SpriteAuxTable, X : CMP.b #!CUCCO_ENRAGED : !BLT ++
PLA : BRA + ; we found an angry cucco, done PLA : BRA + ; we found an angry cucco, done
++ : INX : BRA -- : .ldone ++ : INX : BRA -- : .ldone
@@ -53,12 +39,12 @@ CuccoStorm:
; we didn't find a cucco, so try to create one ; we didn't find a cucco, so try to create one
PLY PLY
CPY.b #$FF : BEQ + ; fail if no slots found CPY.b #$FF : BEQ + ; fail if no slots found
LDA.b !CUCCO : STA.w !ENEMY_TYPE_TABLE, Y LDA.b #!CUCCO : STA.w SpriteTypeTable, Y
LDA.b !INIT : STA.w !ENEMY_STATE_TABLE, Y LDA.b #!INIT : STA.w SpriteAITable, Y
LDA.b !LINK_POS_Y_LOW : STA.w !ENEMY_POS_Y_LOW, Y LDA.b LinkPosY : STA.w SpritePosYLow, Y
LDA.b !LINK_POS_Y_HIGH : STA.w !ENEMY_POS_Y_HIGH, Y LDA.b LinkPosY+1 : STA.w SpritePosYHigh, Y
LDA.b !LINK_POS_X_LOW : STA.w !ENEMY_POS_X_LOW, Y LDA.b LinkPosX : STA.w SpritePosXLow, Y
LDA.b !LINK_POS_X_HIGH : STA.w !ENEMY_POS_X_HIGH, Y LDA.b LinkPosX+1 : STA.w SpritePosXHigh, Y
BRA +++ BRA +++
++ ++
PLA PLA
@@ -66,8 +52,8 @@ CuccoStorm:
;==== Enrage a Cucco ;==== Enrage a Cucco
LDA.b !CUCCO_ENRAGED : STA.w !ENEMY_AUX1_TABLE, Y ; enrage the cucco LDA.b #!CUCCO_ENRAGED : STA.w SpriteAuxTable, Y ; enrage the cucco
LDA.b #$00 : STA.w !ENEMY_AUX2_TABLE, Y : STA.w !ENEMY_DIRECTION_TABLE, Y LDA.b #$00 : STA.w SpriteAuxTable+$10, Y : STA.w SpriteDirectionTable, Y
;==== ;====
+ +

View File

@@ -1,6 +1,6 @@
CheckReceivedItemPropertiesBeforeLoad: CheckReceivedItemPropertiesBeforeLoad:
LDA $A0 : BEQ .normalCode LDA.b RoomIndex : BEQ .normalCode
LDA $7EC005 : BNE .lightOff LDA.l RoomFade : BNE .lightOff
.normalCode .normalCode
LDA.l AddReceivedItemExpanded_properties, X ;Restore Rando Code LDA.l AddReceivedItemExpanded_properties, X ;Restore Rando Code
RTL RTL
@@ -10,18 +10,18 @@ CheckReceivedItemPropertiesBeforeLoad:
LDA.l AddReceivedItemExpanded_properties, X ; get palette LDA.l AddReceivedItemExpanded_properties, X ; get palette
REP #$30 REP #$30
AND #$0007 ; mask out palette AND.w #$0007 ; mask out palette
ASL #5 ; multiply by 32 ASL #5 ; multiply by 32
ADC #$C610 ; offset to latter half ADC.w #$C610 ; offset to latter half
TAX ; give to destination TAX ; give to destination
LDY #$C610 ; target palette SP0 colors 8-F LDY.w #$C610 ; target palette SP0 colors 8-F
LDA #$000F ; 16 bytes LDA.w #$000F ; 16 bytes
MVN $7E, $7E ; move palette MVN $7E, $7E ; move palette
SEP #$30 SEP #$30
PLB : PLY : PLX PLB : PLY : PLX
INC $15 INC.b NMICGRAM
LDA #$00 LDA.b #$00
RTL RTL

View File

@@ -7,77 +7,77 @@ DarkWorldSaveFix:
JML.l StatSaveCounter JML.l StatSaveCounter
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DoWorldFix: DoWorldFix:
LDA InvertedMode : BEQ + LDA.l InvertedMode : BEQ +
JMP DoWorldFix_Inverted JMP DoWorldFix_Inverted
+ +
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
LDA.l FollowerIndicator : CMP #$04 : BEQ .setLightWorld ; check if old man is following LDA.l FollowerIndicator : CMP.b #$04 : BEQ .setLightWorld ; check if old man is following
LDA MirrorEquipment : BEQ .noMirror ; check if we have the mirror LDA.l MirrorEquipment : BEQ .noMirror ; check if we have the mirror
.skip_mirror_check ; alt entrance point .skip_mirror_check ; alt entrance point
LDA ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive LDA.l ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive
.setLightWorld .setLightWorld
LDA #$00 LDA.b #$00
.noMirror .noMirror
STA CurrentWorld ; set flag to light world STA.l CurrentWorld ; set flag to light world
LDA FollowerIndicator : CMP #$07 : BNE .done : INC : STA FollowerIndicator ; convert frog to dwarf LDA.l FollowerIndicator : CMP.b #$07 : BNE .done : INC : STA.l FollowerIndicator ; convert frog to dwarf
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
SetDeathWorldChecked: SetDeathWorldChecked:
LDA InvertedMode : BEQ + LDA.l InvertedMode : BEQ +
JMP SetDeathWorldChecked_Inverted JMP SetDeathWorldChecked_Inverted
+ +
LDA $1B : BEQ .outdoors LDA.b IndoorsFlag : BEQ .outdoors
LDA $040C : CMP #$FF : BNE .dungeon LDA.w DungeonID : CMP.b #$FF : BNE .dungeon
LDA $A0 : ORA $A1 : BNE ++ LDA.b RoomIndex : ORA.b RoomIndex+1 : BNE ++
LDA GanonPyramidRespawn : BNE .pyramid ; if flag is set, force respawn at pyramid on death to ganon LDA.l GanonPyramidRespawn : BNE .pyramid ; if flag is set, force respawn at pyramid on death to ganon
++ ++
.outdoors .outdoors
JMP DoWorldFix JMP DoWorldFix
.dungeon .dungeon
LDA Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon LDA.l Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon
JMP DoWorldFix_skip_mirror_check JMP DoWorldFix_skip_mirror_check
.pyramid .pyramid
LDA #$40 : STA CurrentWorld ; set flag to dark world LDA.b #$40 : STA.l CurrentWorld ; set flag to dark world
LDA FollowerIndicator : CMP #$08 : BNE .done : DEC : STA FollowerIndicator : + ; convert dwarf to frog LDA.l FollowerIndicator : CMP.b #$08 : BNE .done : DEC : STA.l FollowerIndicator : + ; convert dwarf to frog
.done .done
RTL RTL
;================================================================================ ;================================================================================
DoWorldFix_Inverted: DoWorldFix_Inverted:
LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check LDA.l Bugfix_MirrorlessSQToLW : BEQ .skip_mirror_check
LDA.l FollowerIndicator : CMP #$04 : BEQ .setDarkWorld ; check if old man is following LDA.l FollowerIndicator : CMP.b #$04 : BEQ .setDarkWorld ; check if old man is following
LDA MirrorEquipment : BEQ .setDarkWorld ; check if we have the mirror LDA.l MirrorEquipment : BEQ .setDarkWorld ; check if we have the mirror
.skip_mirror_check ; alt entrance point .skip_mirror_check ; alt entrance point
LDA ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive LDA.l ProgressIndicator : CMP.b #$03 : BCS .done ; check if agahnim 1 is alive
.setDarkWorld .setDarkWorld
LDA #$40 : STA CurrentWorld ; set flag to dark world LDA.b #$40 : STA.l CurrentWorld ; set flag to dark world
LDA FollowerIndicator LDA.l FollowerIndicator
CMP #$07 : BEQ .clear ; clear frog CMP.b #$07 : BEQ .clear ; clear frog
CMP #$08 : BEQ .clear ; clear dwarf - consider flute implications CMP.b #$08 : BEQ .clear ; clear dwarf - consider flute implications
BRA .done BRA .done
.clear .clear
LDA.b #$00 : STA FollowerIndicator ; clear follower LDA.b #$00 : STA.l FollowerIndicator ; clear follower
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
SetDeathWorldChecked_Inverted: SetDeathWorldChecked_Inverted:
LDA $1B : BEQ .outdoors LDA.b IndoorsFlag : BEQ .outdoors
LDA $040C : CMP #$FF : BNE .dungeon LDA.w DungeonID : CMP.b #$FF : BNE .dungeon
LDA $A0 : ORA $A1 : BNE ++ LDA.b RoomIndex : ORA.b RoomIndex+1 : BNE ++
LDA GanonPyramidRespawn : BNE .castle ; if flag is set, force respawn at pyramid on death to ganon LDA.l GanonPyramidRespawn : BNE .castle ; if flag is set, force respawn at pyramid on death to ganon
++ ++
.outdoors .outdoors
JMP DoWorldFix JMP DoWorldFix
.dungeon .dungeon
LDA Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon LDA.l Bugfix_PreAgaDWDungeonDeathToFakeDW : BNE .done ; if the bugfix is enabled, we do nothing on death in dungeon
JMP DoWorldFix_Inverted_skip_mirror_check JMP DoWorldFix_Inverted_skip_mirror_check
.castle .castle
LDA #$00 : STA CurrentWorld ; set flag to dark world LDA.b #$00 : STA.l CurrentWorld ; set flag to dark world
LDA FollowerIndicator : CMP #$07 : BNE + : LDA.b #$08 : STA FollowerIndicator : + ; convert frog to dwarf LDA.l FollowerIndicator : CMP.b #$07 : BNE + : LDA.b #$08 : STA.l FollowerIndicator : + ; convert frog to dwarf
.done .done
RTL RTL
;================================================================================ ;================================================================================
@@ -85,20 +85,20 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FakeWorldFix: FakeWorldFix:
LDA FixFakeWorld : BEQ + LDA.l FixFakeWorld : BEQ +
LDA $8A : AND.b #$40 : STA CurrentWorld LDA.b OverworldIndex : AND.b #$40 : STA.l CurrentWorld
+ +
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
MasterSwordFollowerClear: MasterSwordFollowerClear:
LDA FollowerIndicator LDA.l FollowerIndicator
CMP #$0E : BNE .exit ; clear master sword follower CMP.b #$0E : BNE .exit ; clear master sword follower
LDA.b #$00 : STA FollowerIndicator ; clear follower LDA.b #$00 : STA.l FollowerIndicator ; clear follower
.exit .exit
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FixAgahnimFollowers: FixAgahnimFollowers:
LDA.b #$00 : STA FollowerIndicator ; clear follower LDA.b #$00 : STA.l FollowerIndicator ; clear follower
JML PrepDungeonExit ; thing we wrote over JML PrepDungeonExit ; thing we wrote over
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -108,10 +108,10 @@ macro SetMinimum(base,filler,compare)
?done: ?done:
endmacro endmacro
RefreshRainAmmo: RefreshRainAmmo:
LDA ProgressIndicator : CMP.b #$01 : BEQ .rain ; check if we're in rain state LDA.l ProgressIndicator : CMP.b #$01 : BEQ .rain ; check if we're in rain state
RTL RTL
.rain .rain
LDA StartingEntrance LDA.l StartingEntrance
+ CMP.b #$03 : BNE + ; Uncle + CMP.b #$03 : BNE + ; Uncle
%SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Uncle) %SetMinimum(CurrentMagic,MagicFiller,RainDeathRefillMagic_Uncle)
%SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Uncle) %SetMinimum(BombsEquipment,BombsFiller,RainDeathRefillBombs_Uncle)
@@ -130,28 +130,25 @@ RefreshRainAmmo:
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!INFINITE_ARROWS = "$7F50C8"
!INFINITE_BOMBS = "$7F50C9"
!INFINITE_MAGIC = "$7F50CA"
SetEscapeAssist: SetEscapeAssist:
LDA ProgressIndicator : CMP.b #$01 : BNE .no_train ; check if we're in rain state LDA.l ProgressIndicator : CMP.b #$01 : BNE .no_train ; check if we're in rain state
.rain .rain
LDA.l EscapeAssist LDA.l EscapeAssist
BIT.b #$04 : BEQ + : STA !INFINITE_MAGIC : + BIT.b #$04 : BEQ + : STA.l InfiniteArrows : +
BIT.b #$02 : BEQ + : STA !INFINITE_BOMBS : + BIT.b #$02 : BEQ + : STA.l InfiniteBombs : +
BIT.b #$01 : BEQ + : STA !INFINITE_ARROWS : + BIT.b #$01 : BEQ + : STA.l InfiniteArrows : +
BRA ++ BRA ++
.no_train ; choo choo .no_train ; choo choo
LDA.l EscapeAssist : BIT.b #$04 : BEQ + : LDA.b #$00 : STA !INFINITE_MAGIC : + LDA.l EscapeAssist : BIT.b #$04 : BEQ + : LDA.b #$00 : STA.l InfiniteMagic : +
LDA.l EscapeAssist : BIT.b #$02 : BEQ + : LDA.b #$00 : STA !INFINITE_BOMBS : + LDA.l EscapeAssist : BIT.b #$02 : BEQ + : LDA.b #$00 : STA.l InfiniteBombs : +
LDA.l EscapeAssist : BIT.b #$01 : BEQ + : LDA.b #$00 : STA !INFINITE_ARROWS : + LDA.l EscapeAssist : BIT.b #$01 : BEQ + : LDA.b #$00 : STA.l InfiniteArrows : +
++ ++
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
SetSilverBowMode: SetSilverBowMode:
LDA SilverArrowsUseRestriction : BEQ + ; fix bow type for restricted arrow mode LDA.l SilverArrowsUseRestriction : BEQ + ; fix bow type for restricted arrow mode
LDA BowEquipment : CMP.b #$3 : BCC + LDA.l BowEquipment : CMP.b #$3 : BCC +
SBC.b #$02 : STA BowEquipment SBC.b #$02 : STA.l BowEquipment
+ +
RTL RTL
;================================================================================ ;================================================================================

View File

@@ -1,13 +1,10 @@
!CryptoBuffer = "$7F5100"
;!keyBase = "$7F50D0"
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LoadStaticDecryptionKey: LoadStaticDecryptionKey:
PHB : PHA : PHX : PHY : PHP PHB : PHA : PHX : PHY : PHP
REP #$30 ; set 16-bit accumulator & index registers REP #$30 ; set 16-bit accumulator & index registers
LDX.w #StaticDecryptionKey ; Source LDX.w #StaticDecryptionKey ; Source
LDY.w #!keyBase ; Target LDY.w #KeyBase ; Target
LDA.w #$000F ; Length LDA.w #$000F ; Length
MVN $307F MVN $307F
@@ -23,65 +20,63 @@ RetrieveValueFromEncryptedTable:
;Returns result in A ;Returns result in A
PHX : PHY PHX : PHY
PHA PHA
LDY $04 : PHY : LDY $06 : PHY : LDY $08 : PHY LDY.b Scrap04 : PHY : LDY.b Scrap06 : PHY : LDY.b Scrap08 : PHY
LDY $0A : PHY : LDY $0C : PHY : LDY $0E : PHY LDY.b Scrap0A : PHY : LDY.b Scrap0C : PHY : LDY.b Scrap0E : PHY
AND.w #$FFF8 : TAY AND.w #$FFF8 : TAY
LDA [$00], Y : STA.l !CryptoBuffer : INY #2 LDA.b [$00], Y : STA.l CryptoBuffer : INY #2
LDA [$00], Y : STA.l !CryptoBuffer+2 : INY #2 LDA.b [$00], Y : STA.l CryptoBuffer+2 : INY #2
LDA [$00], Y : STA.l !CryptoBuffer+4 : INY #2 LDA.b [$00], Y : STA.l CryptoBuffer+4 : INY #2
LDA [$00], Y : STA.l !CryptoBuffer+6 LDA.b [$00], Y : STA.l CryptoBuffer+6
LDA.w #$0002 : STA $04 ;set block size LDA.w #$0002 : STA.b Scrap04 ;set block size
JSL.l XXTEA_Decode JSL.l XXTEA_Decode
PLA : STA $0E : PLA : STA $0C : PLA : STA $0A PLA : STA.b Scrap0E : PLA : STA.b Scrap0C : PLA : STA.b Scrap0A
PLA : STA $08 : PLA : STA $06 : PLA : STA $04 PLA : STA.b Scrap08 : PLA : STA.b Scrap06 : PLA : STA.b Scrap04
PLA : AND.w #$0007 : TAX PLA : AND.w #$0007 : TAX
LDA.l !CryptoBuffer, X LDA.l CryptoBuffer, X
PHA PHA
LDA.w #$0000 LDA.w #$0000
STA.l !CryptoBuffer STA.l CryptoBuffer
STA.l !CryptoBuffer+2 STA.l CryptoBuffer+2
STA.l !CryptoBuffer+4 STA.l CryptoBuffer+4
STA.l !CryptoBuffer+6 STA.l CryptoBuffer+6
PLA PLA
PLY : PLX PLY : PLX
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
ChestData = $01E96C
!ChestData = "$01E96C" ChestDataPayload = $01EABC ; ChestData+$0150
!ChestData_Payload = "$1EABC" ; !ChestData+$0150
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
GetChestData: GetChestData:
LDA.l IsEncrypted : BNE .encrypted LDA.l IsEncrypted : BNE .encrypted
INC $0E : LDX.w #$FFFD ; what we wrote over INC.b Scrap0E : LDX.w #$FFFD ; what we wrote over
JML.l Dungeon_OpenKeyedObject_nextChest JML.l Dungeon_OpenKeyedObject_nextChest
.encrypted .encrypted
INC $0E : LDX.w #$FFFE INC.b Scrap0E : LDX.w #$FFFE
.nextChest .nextChest
INX #2 : CPX.w #$0150 : BEQ .couldntFindChest INX #2 : CPX.w #$0150 : BEQ .couldntFindChest
LDA !ChestData, X : AND.w #$7FFF : CMP $A0 : BNE .nextChest LDA.l ChestData, X : AND.w #$7FFF : CMP.b RoomIndex : BNE .nextChest
DEC $0E : BNE .nextChest DEC.b Scrap0E : BNE .nextChest
LDA $00 : PHA : LDA $02 : PHA LDA.b Scrap00 : PHA : LDA.b Scrap02 : PHA
LDA.w #!ChestData_Payload : STA $00 LDA.w #ChestDataPayload : STA.b Scrap00
LDA.w #!ChestData_Payload>>16 : STA $02 LDA.w #ChestDataPayload>>16 : STA.b Scrap02
TXA : LSR TXA : LSR
JSL RetrieveValueFromEncryptedTable JSL RetrieveValueFromEncryptedTable
STA $0C STA.b Scrap0C
PLA : STA $02 : PLA : STA $00 PLA : STA.b Scrap02 : PLA : STA.b Scrap00
LDA !ChestData, X : ASL A : BCC .smallChest LDA.l ChestData, X : ASL A : BCC .smallChest
JML.l Dungeon_OpenKeyedObject_bigChest ;(bank01.asm line #13783) JML.l Dungeon_OpenKeyedObject_bigChest ;(bank01.asm line #13783)

View File

@@ -2,200 +2,138 @@
; Dialog Pointer Override ; Dialog Pointer Override
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DialogOverride: DialogOverride:
LDA $7F5035 : BEQ .skip LDA.l AltTextFlag : BEQ .skip
LDA $7F5700, X ; use alternate buffer LDA.l DialogBuffer, X ; use alternate buffer
RTL RTL
.skip .skip
LDA $7F1200, X LDA.l DecompressionBuffer+$1200, X
RTL RTL
;--------------------------------------------------------------------------------
; $7F5035 - Alternate Text Pointer Flag ; 0=Disable
; $7F5036 - Padding Byte (Must be Zero)
; $7F5700 - $7F57FF - Dialog Buffer
;--------------------------------------------------------------------------------
ResetDialogPointer: ResetDialogPointer:
STZ $1CF0 : STZ $1CF1 ; reset decompression buffer STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer
LDA.b #$00 : STA $7F5035 ; zero out the alternate flag LDA.b #$00 : STA.l AltTextFlag ; zero out the alternate flag
LDA.b #$1C : STA $1CE9 ; thing we wrote over LDA.b #$1C : STA.w DelayTimer ; thing we wrote over
RTL RTL
;--------------------------------------------------------------------------------
;macro LoadDialog(index,table)
; PHA : PHX : PHY
; PHB : PHK : PLB
; LDA $00 : PHA
; LDA $01 : PHA
; LDA $02 : PHA
; LDA.b #$01 : STA $7F5035 ; set flag
;
; LDA <index> : ASL : !ADD.l <index> : TAX ; get quote offset *3, move to X
; LDA <table>, X : STA $00 ; write pointer to direct page
; LDA <table>+1, X : STA $01
; LDA <table>+2, X : STA $02
;
; LDX.b #$00 : LDY.b #$00
; -
; LDA [$00], Y ; load the next character from the pointer
; STA $7F5700, X ; write to the buffer
; INX : INY
; CMP.b #$7F : BNE -
; PLA : STA $02
; PLA : STA $01
; PLA : STA $00
; PLB
; PLY : PLX : PLA
;endmacro
;--------------------------------------------------------------------------------
;macro LoadDialogAddress(address)
; PHA : PHX : PHY
; PHP
; PHB : PHK : PLB
; SEP #$30 ; set 8-bit accumulator and index registers
; LDA $00 : PHA
; LDA $01 : PHA
; LDA $02 : PHA
; LDA.b #$01 : STA $7F5035 ; set flag
;
; LDA.b #<address> : STA $00 ; write pointer to direct page
; LDA.b #<address>>>8 : STA $01
; LDA.b #<address>>>16 : STA $02
;
; LDX.b #$00 : LDY.b #$00
; -
; LDA [$00], Y ; load the next character from the pointer
; STA $7F5700, X ; write to the buffer
; INX : INY
; CMP.b #$7F : BNE -
; PLA : STA $02
; PLA : STA $01
; PLA : STA $00
; PLB
; PLP
; PLY : PLX : PLA
;endmacro
;--------------------------------------------------------------------------------
!OFFSET_POINTER = "$7F5094"
!OFFSET_RETURN = "$7F5096"
!DIALOG_BUFFER = "$7F5700"
macro LoadDialogAddress(address) macro LoadDialogAddress(address)
PHA : PHX : PHY PHA : PHX : PHY
PHP PHP
PHB : PHK : PLB PHB : PHK : PLB
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
REP #$10 ; set 16-bit index registers REP #$10 ; set 16-bit index registers
PEI ($00) PEI.b ($00)
LDA $02 : PHA LDA.b Scrap02 : PHA
STZ $1CF0 : STZ $1CF1 ; reset decompression buffer STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer
LDA.b #$01 : STA $7F5035 ; set flag LDA.b #$01 : STA.l AltTextFlag ; set flag
%CopyDialog(<address>) %CopyDialog(<address>)
PLA : STA $02 PLA : STA.b Scrap02
REP #$20 REP #$20
PLA : STA $00 PLA : STA.b Scrap00
PLB PLB
PLP PLP
PLY : PLX : PLA PLY : PLX : PLA
endmacro endmacro
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
macro CopyDialog(address) macro CopyDialog(address)
LDA.b #<address> : STA $00 ; write pointer to direct page LDA.b #<address> : STA.b Scrap00 ; write pointer to direct page
LDA.b #<address>>>8 : STA $01 LDA.b #<address>>>8 : STA.b Scrap01
LDA.b #<address>>>16 : STA $02 LDA.b #<address>>>16 : STA.b Scrap02
%CopyDialogIndirect() %CopyDialogIndirect()
endmacro endmacro
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
macro CopyDialogIndirect() macro CopyDialogIndirect()
REP #$20 : LDA !OFFSET_POINTER : TAX : LDY.w #$0000 : SEP #$20 ; copy 2-byte offset pointer to X and set Y to 0 REP #$20 : LDA.l DialogOffsetPointer : TAX : LDY.w #$0000 : SEP #$20 ; copy 2-byte offset pointer to X and set Y to 0
?loop: ?loop:
LDA [$00], Y ; load the next character from the pointer LDA.b [$00], Y ; load the next character from the pointer
STA !DIALOG_BUFFER, X ; write to the buffer STA.l DialogBuffer, X ; write to the buffer
INX : INY INX : INY
CMP.b #$7F : BNE ?loop CMP.b #$7F : BNE ?loop
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
TXA : INC : STA !OFFSET_RETURN ; copy out X into TXA : INC : STA.l DialogReturnPointer ; copy out X into
LDA.w #$0000 : STA !OFFSET_POINTER LDA.w #$0000 : STA.l DialogOffsetPointer
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
endmacro endmacro
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LoadDialogAddressIndirect: LoadDialogAddressIndirect:
STZ $1CF0 : STZ $1CF1 ; reset decompression buffer STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer
LDA.b #$01 : STA $7F5035 ; set flag LDA.b #$01 : STA.l AltTextFlag ; set flag
%CopyDialogIndirect() %CopyDialogIndirect()
;%LoadDialogAddress(UncleText)
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!ITEM_TEMPORARY = "$7F5040"
FreeDungeonItemNotice: FreeDungeonItemNotice:
STA !ITEM_TEMPORARY STA.w ScratchBufferV
PHA : PHX : PHY PHA : PHX : PHY
PHP PHP
PHB : PHK : PLB PHB : PHK : PLB
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
REP #$10 ; set 16-bit index registers REP #$10 ; set 16-bit index registers
PEI ($00) PEI.b (Scrap00)
LDA $02 : PHA LDA.b Scrap02 : PHA
LDA.w ScratchBufferNV : PHA
LDA.w ScratchBufferNV+1 : PHA
;-------------------------------- ;--------------------------------
LDA.l FreeItemText : BNE + : JMP .skip : + LDA.l FreeItemText : BNE + : JMP .skip : +
LDA #$00 : STA $7F5010 ; initialize scratch LDA.b #$00 : STA.w ScratchBufferNV ; initialize scratch
LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for general small key LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for general small key
LDA !ITEM_TEMPORARY : CMP.b #$24 : BNE + ; general small key LDA.w ScratchBufferV : CMP.b #$24 : BNE + ; general small key
%CopyDialog(Notice_SmallKeyOf) %CopyDialog(Notice_SmallKeyOf)
LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
%CopyDialog(Notice_Self) %CopyDialog(Notice_Self)
JMP .done JMP .done
+ : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for general compass + : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for general compass
LDA !ITEM_TEMPORARY : CMP.b #$25 : BNE + ; general compass LDA.w ScratchBufferV : CMP.b #$25 : BNE + ; general compass
%CopyDialog(Notice_CompassOf) %CopyDialog(Notice_CompassOf)
LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
%CopyDialog(Notice_Self) %CopyDialog(Notice_Self)
JMP .done JMP .done
+ : LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for general map + : LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for general map
LDA !ITEM_TEMPORARY : CMP.b #$33 : BNE + ; general map LDA.w ScratchBufferV : CMP.b #$33 : BNE + ; general map
%CopyDialog(Notice_MapOf) %CopyDialog(Notice_MapOf)
LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
%CopyDialog(Notice_Self) %CopyDialog(Notice_Self)
JMP .done JMP .done
+ : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for general big key + : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for general big key
LDA !ITEM_TEMPORARY : CMP.b #$32 : BNE + ; general big key LDA.w ScratchBufferV : CMP.b #$32 : BNE + ; general big key
%CopyDialog(Notice_BigKeyOf) %CopyDialog(Notice_BigKeyOf)
LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
%CopyDialog(Notice_Self) %CopyDialog(Notice_Self)
JMP .done JMP .done
+ +
LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for dungeon map LDA.l FreeItemText : AND.b #$04 : BEQ + ; show message for dungeon map
LDA !ITEM_TEMPORARY : AND.b #$F0 ; looking at high bits only LDA.w ScratchBufferV : AND.b #$F0 ; looking at high bits only
CMP.b #$70 : BNE + ; map of... CMP.b #$70 : BNE + ; map of...
%CopyDialog(Notice_MapOf) %CopyDialog(Notice_MapOf)
JMP .dungeon JMP .dungeon
+ : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for dungeon compass + : LDA.l FreeItemText : AND.b #$02 : BEQ + ; show message for dungeon compass
LDA !ITEM_TEMPORARY : AND.b #$F0 : CMP.b #$80 : BNE + ; compass of... LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$80 : BNE + ; compass of...
%CopyDialog(Notice_CompassOf) %CopyDialog(Notice_CompassOf)
JMP .dungeon JMP .dungeon
+ : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for dungeon big key + : LDA.l FreeItemText : AND.b #$08 : BEQ + ; show message for dungeon big key
LDA !ITEM_TEMPORARY : AND.b #$F0 : CMP.b #$90 : BNE + ; big key of... LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$90 : BNE + ; big key of...
%CopyDialog(Notice_BigKeyOf) %CopyDialog(Notice_BigKeyOf)
BRA .dungeon BRA .dungeon
+ : LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for dungeon small key + : LDA.l FreeItemText : AND.b #$01 : BEQ + ; show message for dungeon small key
LDA !ITEM_TEMPORARY : AND.b #$F0 : CMP.b #$A0 : BNE + ; small key of... LDA.w ScratchBufferV : AND.b #$F0 : CMP.b #$A0 : BNE + ; small key of...
LDA !ITEM_TEMPORARY : CMP.b #$AF : BNE ++ : JMP .skip : ++ LDA.w ScratchBufferV : CMP.b #$AF : BNE ++ : JMP .skip : ++
%CopyDialog(Notice_SmallKeyOf) %CopyDialog(Notice_SmallKeyOf)
PLA : AND.b #$0F : STA $7F5020 : LDA.b #$0F : !SUB $7F5020 : PHA LDA.b #$01 : STA.w ScratchBufferNV ; set up a flip for small keys
LDA #$01 : STA $7F5010 ; set up a flip for small keys
BRA .dungeon BRA .dungeon
+ +
JMP .skip ; it's not something we are going to give a notice for JMP .skip ; it's not something we are going to give a notice for
.dungeon .dungeon
LDA !OFFSET_RETURN : DEC #2 : STA !OFFSET_POINTER LDA.l DialogReturnPointer : DEC #2 : STA.l DialogOffsetPointer
LDA !ITEM_TEMPORARY LDA.w ScratchBufferV
AND.b #$0F ; looking at low bits only AND.b #$0F ; looking at low bits only
STA $7F5011 STA.w ScratchBufferNV+1
LDA $7F5010 : BEQ + LDA.w ScratchBufferNV : BEQ +
LDA $7F5010 LDA.w ScratchBufferNV
LDA #$0F : !SUB $7F5011 : STA $7F5011 ; flip the values for small keys LDA.b #$0F : !SUB.w ScratchBufferNV+1 : STA.w ScratchBufferNV+1 ; flip the values for small keys
+ +
LDA $7F5011 LDA.w ScratchBufferNV+1
CMP.b #$00 : BNE + ; ...light world CMP.b #$00 : BNE + ; ...light world
%CopyDialog(Notice_LightWorld) : JMP .done %CopyDialog(Notice_LightWorld) : JMP .done
+ : CMP.b #$01 : BNE + ; ...dark world + : CMP.b #$01 : BNE + ; ...dark world
@@ -231,30 +169,31 @@ FreeDungeonItemNotice:
+ +
.done .done
STZ $1CF0 : STZ $1CF1 ; reset decompression buffer STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer
LDA.b #$01 : STA $7F5035 ; set alternate dialog flag LDA.b #$01 : STA.l AltTextFlag ; set alternate dialog flag
STA $7F509F STA.l TextBoxDefer
;-------------------------------- ;--------------------------------
.skip .skip
PLA : STA $02 PLA : STA.w ScratchBufferNV+1
REP #$20 PLA : STA.w ScratchBufferNV
PLA : STA $00 PLA : STA.b Scrap02
PLB REP #$20
PLP PLA : STA.b Scrap00
PLY : PLX : PLA PLB
;JSL.l Main_ShowTextMessage_Alt ; .skip can be here so long as this line remains commented out PLP
PLY : PLX : PLA
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DialogResetSelectionIndex: DialogResetSelectionIndex:
JSL.l Attract_DecompressStoryGfx ; what we wrote over JSL.l Attract_DecompressStoryGfx ; what we wrote over
STZ $1CE8 STZ.w MessageCursor
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DialogItemReceive: DialogItemReceive:
BCS .nomessage ; if doubling the item value overflowed it must be a rando item BCS .nomessage ; if doubling the item value overflowed it must be a rando item
CPY #$98 : BCC ++ ;if the item is $4C or greater it must be a rando item CPY.b #$98 : BCC ++ ;if the item is $4C or greater it must be a rando item
.nomessage .nomessage
LDA.w #$FFFF LDA.w #$FFFF
@@ -267,11 +206,11 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DialogFairyThrow: DialogFairyThrow:
LDA.l Restrict_Ponds : BEQ .normal LDA.l Restrict_Ponds : BEQ .normal
LDA BottleContentsOne LDA.l BottleContentsOne
ORA BottleContentsTwo : ORA BottleContentsThree : ORA BottleContentsFour : BNE .normal ORA.l BottleContentsTwo : ORA.l BottleContentsThree : ORA.l BottleContentsFour : BNE .normal
.noInventory .noInventory
LDA $0D80, X : !ADD #$08 : STA $0D80, X LDA.w SpriteActivity, X : !ADD #$08 : STA.w SpriteActivity, X
LDA.b #$51 LDA.b #$51
LDY.b #$01 LDY.b #$01
RTL RTL
@@ -286,7 +225,7 @@ DialogGanon1:
LDA.w #$018C LDA.w #$018C
BCC + BCC +
LDA.w #$016D LDA.w #$016D
+ STA $1CF0 + STA.w TextID
SEP #$20 SEP #$20
JSL.l Sprite_ShowMessageMinimal_Alt JSL.l Sprite_ShowMessageMinimal_Alt
RTL RTL
@@ -322,22 +261,22 @@ DialogGanon2:
+ +
LDA.w #$016E LDA.w #$016E
++ ++
STA $1CF0 STA.w TextID
SEP #$20 SEP #$20
JSL.l Sprite_ShowMessageMinimal_Alt JSL.l Sprite_ShowMessageMinimal_Alt
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DialogEtherTablet: DialogEtherTablet:
PHA PHA
LDA $0202 : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped LDA.w ItemCursor : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped
- -
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
+ +
BIT $F4 : BVC - ; Show normal text if Y is not pressed BIT.b Joy1A_New : BVC - ; Show normal text if Y is not pressed
LDA.l AllowHammerTablets : BEQ ++ LDA.l AllowHammerTablets : BEQ ++
LDA HammerEquipment : BEQ .yesText : BRA .noText LDA.l HammerEquipment : BEQ .yesText : BRA .noText
++ ++
LDA SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : BCS .noText LDA.l SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : BCS .noText
;++ ;++
.yesText .yesText
PLA PLA
@@ -351,15 +290,15 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DialogBombosTablet: DialogBombosTablet:
PHA PHA
LDA $0202 : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped LDA.w ItemCursor : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped
- -
PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text PLA : JML Sprite_ShowMessageUnconditional ; Wacky Hylian Text
+ +
BIT $F4 : BVC - ; Show normal text if Y is not pressed BIT.b Joy1A_New : BVC - ; Show normal text if Y is not pressed
LDA.l AllowHammerTablets : BEQ ++ LDA.l AllowHammerTablets : BEQ ++
LDA HammerEquipment : BEQ .yesText : BRA .noText LDA.l HammerEquipment : BEQ .yesText : BRA .noText
++ ++
LDA SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : !BGE .noText LDA.l SwordEquipment : CMP.b #$FF : BEQ .yesText : CMP.b #$02 : !BGE .noText
;++ ;++
.yesText .yesText
PLA PLA
@@ -372,7 +311,7 @@ DialogBombosTablet:
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DialogSahasrahla: DialogSahasrahla:
LDA.l PendantsField : AND #$04 : BEQ + ;Check if player has green pendant LDA.l PendantsField : AND.b #$04 : BEQ + ;Check if player has green pendant
LDA.b #$2F LDA.b #$2F
LDY.b #$00 LDY.b #$00
JML Sprite_ShowMessageUnconditional JML Sprite_ShowMessageUnconditional
@@ -381,7 +320,7 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DialogBombShopGuy: DialogBombShopGuy:
LDY.b #$15 LDY.b #$15
LDA.l CrystalsField : AND #$05 : CMP #$05 : BNE + ;Check if player has crystals 5 & 6 LDA.l CrystalsField : AND.b #$05 : CMP.b #$05 : BNE + ;Check if player has crystals 5 & 6
INY ; from 15 to 16 INY ; from 15 to 16
+ +
TYA TYA
@@ -399,54 +338,54 @@ AgahnimAsksAboutPed:
BNE .vanilla BNE .vanilla
LDA.b #$8C ; message 018C for no ped LDA.b #$8C ; message 018C for no ped
STA.w $1CF0 STA.w TextID
.vanilla .vanilla
JML $05FA8E ; Sprite_ShowMessageMinimal JML $05FA8E ; Sprite_ShowMessageMinimal
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
Main_ShowTextMessage_Alt: Main_ShowTextMessage_Alt:
; Are we in text mode? If so then end the routine. ; Are we in text mode? If so then end the routine.
LDA $10 : CMP.b #$0E : BEQ .already_in_text_mode LDA.b GameMode : CMP.b #$0E : BEQ .already_in_text_mode
Sprite_ShowMessageMinimal_Alt: Sprite_ShowMessageMinimal_Alt:
STZ $11 STZ.b GameSubMode
PHX : PHY PHX : PHY
PEI ($00) PEI.b (Scrap00)
LDA.b $02 : PHA LDA.b Scrap02 : PHA
LDA.b #$1C : STA.b $02 LDA.b #$1C : STA.b Scrap02
REP #$30 REP #$30
LDA.w $1CF0 : ASL : TAX LDA.w TextID : ASL : TAX
LDA.l $7F71C0, X LDA.l $7F71C0, X
STA.b $00 STA.b Scrap00
SEP #$30 SEP #$30
LDY.b #$00 LDY.b #$00
LDA [$00], Y : CMP.b #$FE : BNE + LDA.b [Scrap00], Y : CMP.b #$FE : BNE +
INY : LDA [$00], Y : CMP.b #$6E : BNE + INY : LDA.b [Scrap00], Y : CMP.b #$6E : BNE +
INY : LDA [$00], Y : : BNE + INY : LDA.b [Scrap00], Y : : BNE +
INY : LDA [$00], Y : CMP.b #$FE : BNE + INY : LDA.b [Scrap00], Y : CMP.b #$FE : BNE +
INY : LDA [$00], Y : CMP.b #$6B : BNE + INY : LDA.b [Scrap00], Y : CMP.b #$6B : BNE +
INY : LDA [$00], Y : CMP.b #$04 : BNE + INY : LDA.b [Scrap00], Y : CMP.b #$04 : BNE +
STZ $1CE8 STZ.w MessageCursor
JMP .end JMP .end
+ +
STZ $0223 ; Otherwise set it so we are in text mode. STZ.w MessageJunk ; Otherwise set it so we are in text mode.
STZ $1CD8 ; Initialize the step in the submodule STZ.w MessageSubModule
; Go to text display mode (as opposed to maps, etc) ; Go to text display mode (as opposed to maps, etc)
LDA.b #$02 : STA $11 LDA.b #$02 : STA.b GameSubMode
; Store the current module in the temporary location. ; Store the current module in the temporary location.
LDA $10 : STA $010C LDA.b GameMode : STA.w GameModeCache
; Switch the main module ($10) to text mode. ; Switch the main module ($10) to text mode.
LDA.b #$0E : STA $10 LDA.b #$0E : STA.b GameMode
.end .end
PLA : STA.b $02 PLA : STA.b Scrap02
PLA : STA.b $01 PLA : STA.b Scrap01
PLA : STA.b $00 PLA : STA.b Scrap00
PLY : PLX PLY : PLX
Main_ShowTextMessage_Alt_already_in_text_mode: Main_ShowTextMessage_Alt_already_in_text_mode:
@@ -458,15 +397,15 @@ CalculateSignIndex:
; And we do this in a way that will likely give the right value even ; And we do this in a way that will likely give the right value even
; with major glitches. ; with major glitches.
LDA $8A : ASL A : TAY ;what we wrote over LDA.b OverworldIndex : ASL A : TAY ;what we wrote over
LDA $0712 : BEQ .done ; If a small map, we can skip these calculations. LDA.w OWScreenSize : BEQ .done ; If a small map, we can skip these calculations.
LDA $21 : AND.w #$0002 : ASL #2 : EOR $8A : AND.w #$0008 : BEQ + LDA.b LinkPosY+1 : AND.w #$0002 : ASL #2 : EOR.b OverworldIndex : AND.w #$0008 : BEQ +
TYA : !ADD.w #$0010 : TAY ;add 16 if we are in lower half of big screen. TYA : !ADD.w #$0010 : TAY ;add 16 if we are in lower half of big screen.
+ +
LDA $23 : AND.w #$0002 : LSR : EOR $8A : AND.w #$0001 : BEQ + LDA.b LinkPosX+1 : AND.w #$0002 : LSR : EOR.b OverworldIndex : AND.w #$0001 : BEQ +
TYA : INC #2 : TAY ;add 16 if we are in lower half of big screen. TYA : INC #2 : TAY ;add 16 if we are in lower half of big screen.
+ +
; ensure even if things go horribly wrong, we don't read the sign out of bounds and crash: ; ensure even if things go horribly wrong, we don't read the sign out of bounds and crash:
@@ -475,6 +414,112 @@ CalculateSignIndex:
.done .done
RTL RTL
;================================================================
; Contributor: Myramong
;================================================================
Sprite_ShowSolicitedMessageIfPlayerFacing_Alt:
{
STA.w TextID
STY.w TextID+1
JSL Sprite_CheckDamageToPlayerSameLayerLong : BCC .alpha
JSL Sprite_CheckIfPlayerPreoccupied : BCS .alpha
LDA.b Joy1B_New : BPL .alpha
LDA.w SpriteTimerE, X : BNE .alpha
LDA.b LinkJumping : CMP.b #$02 : BEQ .alpha
JSL Sprite_DirectionToFacePlayerLong : PHX : TYX
; Make sure that the sprite is facing towards the player, otherwise
; talking can't happen. (What sprites actually use this???)
LDA.l $05E1A3, X : PLX : CMP.b LinkDirection : BNE .not_facing_each_other
PHY
LDA.w TextID
LDY.w TextID+1
; Check what room we're in so we know which npc we're talking to
LDA.b RoomIndex
CMP.b #$05 : BEQ .SahasrahlaDialogs
CMP.b #$1C : BEQ .BombShopGuyDialog
BRA .SayNothing
.SahasrahlaDialogs
REP #$20 : LDA.l MapReveal_Sahasrahla : ORA.l MapOverlay : STA.l MapOverlay : SEP #$20
JSL DialogSahasrahla : BRA .SayNothing
.BombShopGuyDialog
REP #$20 : LDA.l MapReveal_BombShop : ORA.l MapOverlay : STA.l MapOverlay : SEP #$20
JSL DialogBombShopGuy
.SayNothing
LDA.b #$40 : STA.w SpriteTimerE, X
PLA : EOR.b #$03
SEC
RTL
.not_facing_each_other
.alpha
LDA.w SpriteMoveDirection, X
CLC
RTL
}
;================================================================
Sprite_ShowSolicitedMessageIfPlayerFacing_PreserveMessage:
{
PHY
PHA
JSL Sprite_CheckDamageToPlayerSameLayerLong : BCC .alpha
JSL Sprite_CheckIfPlayerPreoccupied : BCS .alpha
LDA.b Joy1B_New : BPL .alpha
LDA.w SpriteTimerE, X : BNE .alpha
LDA.b LinkJumping : CMP.b #$02 : BEQ .alpha
JSL Sprite_DirectionToFacePlayerLong : PHX : TYX
; Make sure that the sprite is facing towards the player, otherwise
; talking can't happen. (What sprites actually use this???)
LDA.l $05E1A3, X : PLX : CMP.b LinkDirection : BNE .not_facing_each_other
PLA : XBA : PLA
PHY
TAY : XBA
JSL Sprite_ShowMessageUnconditional
LDA.b #$40 : STA.w SpriteTimerE, X
PLA : EOR.b #$03
SEC
RTL
.not_facing_each_other
.alpha
PLY
PLA
LDA.w SpriteMoveDirection, X
CLC
RTL
}
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; A0 - A9 - 0 - 9 ; A0 - A9 - 0 - 9
; AA - C3 - A - Z ; AA - C3 - A - Z

View File

@@ -7,8 +7,8 @@
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
StoreLastOverworldDoorID: StoreLastOverworldDoorID:
TXA : INC TXA : INC
STA $7F5099 STA.l PreviousOverworldDoor
LDA $1BBB73, X : STA $010E LDA.l $1BBB73, X : STA.w EntranceIndex
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -16,14 +16,14 @@ RTL
; CacheDoorFrameData ; CacheDoorFrameData
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CacheDoorFrameData: CacheDoorFrameData:
LDA $7F5099 : BEQ .originalBehaviour LDA.l PreviousOverworldDoor : BEQ .originalBehaviour
DEC : ASL : TAX DEC : ASL : TAX
LDA EntranceDoorFrameTable, X : STA $0696 LDA.l EntranceDoorFrameTable, X : STA.w TileMapEntranceDoors
LDA EntranceAltDoorFrameTable, X : STA $0698 LDA.l EntranceAltDoorFrameTable, X : STA.w TileMapTile32
BRA .done BRA .done
.originalBehaviour .originalBehaviour
LDA $D724, X : STA $0696 LDA.w $D724, X : STA.w TileMapEntranceDoors
STZ $0698 STZ.w TileMapTile32
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -32,8 +32,8 @@ RTL
; WalkDownIntoTavern ; WalkDownIntoTavern
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
WalkDownIntoTavern: WalkDownIntoTavern:
LDA $7F5099 LDA.l PreviousOverworldDoor
; tavern door has index 0x42 (saved off value is incremented by one) ; tavern door has index 0x42 (saved off value is incremented by one)
CMP #$43 CMP.b #$43
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

View File

@@ -2,8 +2,8 @@
; Dungeon & Boss Drop Fixes ; Dungeon & Boss Drop Fixes
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DropSafeDungeon: DropSafeDungeon:
LDA $040C : CMP #$08 : BEQ + LDA.w DungeonID : CMP.b #$08 : BEQ +
LDA $01C6FC, X : JML Sprite_SpawnFallingItem LDA.l $01C6FC, X : JML Sprite_SpawnFallingItem
+ +
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

View File

@@ -1,5 +1,5 @@
DoDungeonMapBossIcon: DoDungeonMapBossIcon:
LDA.b $14 LDA.b NMISTRIPES
CMP.b #$09 CMP.b #$09
BEQ .dungeonmap BEQ .dungeonmap
@@ -9,16 +9,9 @@ DoDungeonMapBossIcon:
.dungeonmap .dungeonmap
LDX.w $040C LDX.w DungeonID
BMI .cave BMI .cave
; LDA.l DungeonMapIcons
; AND.b #$01
; BNE ++
;
; INC ; so it's not equal to $01
; BRA .cave
; get dungeon boss room ; get dungeon boss room
++ REP #$30 ++ REP #$30
LDA.l $8AE817,X LDA.l $8AE817,X
@@ -57,7 +50,7 @@ DoDungeonMapBossIcon:
.match .match
LDA.b #$80 LDA.b #$80
STA.w $2121 STA.w CGADD
REP #$30 REP #$30
@@ -74,14 +67,14 @@ DoDungeonMapBossIcon:
ASL ; x128 for graphics ASL ; x128 for graphics
ASL ASL
ADC.w #BossMapIconGFX ADC.w #BossMapIconGFX
STA.w $4312 STA.w A1T1L
PHY PHY
LDY.w #32 LDY.w #32
SEP #$20 SEP #$20
-- LDA.l .boss_palettes,X -- LDA.l .boss_palettes,X
STA.w $2122 STA.w CGDATA
INX INX
DEY DEY
BNE -- BNE --
@@ -94,24 +87,24 @@ DoDungeonMapBossIcon:
SEP #$10 SEP #$10
LDA.w #$1801 LDA.w #$1801
STA.w $4310 STA.w DMAP1
LDX.b #BossMapIconGFX>>16 LDX.b #BossMapIconGFX>>16
STX.w $4314 STX.w A1B1
LDA.w #$A060>>1 LDA.w #$A060>>1
STA.w $2116 STA.w VMADDL
LDA.w #$0040 LDA.w #$0040
STA.w $4315 STA.w DAS1L
LDX.b #$02 LDX.b #$02
STX.w $420B STX.w MDMAEN
STA.w $4315 STA.w DAS1L
LDA.w #$A260>>1 LDA.w #$A260>>1
STA.w $2116 STA.w VMADDL
STX.w $420B STX.w MDMAEN
; done ; done
SEP #$30 SEP #$30

View File

@@ -1,11 +1,11 @@
NewElderCode: NewElderCode:
{ {
LDA $8A : CMP #$1B : BEQ .newCodeContinue LDA.b OverworldIndex : CMP.b #$1B : BEQ .newCodeContinue
;Restore Jump we can keep the RTL so JML ;Restore Jump we can keep the RTL so JML
JML $05F0CD JML $05F0CD
.newCodeContinue .newCodeContinue
PHB : PHK : PLB PHB : PHK : PLB
LDA.b #$07 : STA $0F50, X ;Palette LDA.b #$07 : STA.w SpriteOAMProp, X ; Palette
JSR Elder_Draw JSR Elder_Draw
JSL Sprite_PlayerCantPassThrough JSL Sprite_PlayerCantPassThrough
JSR Elder_Code JSR Elder_Code
@@ -17,12 +17,12 @@ RTL
Elder_Draw: Elder_Draw:
{ {
LDA.b #$02 : STA $06 : STZ $07 ;Number of Tiles LDA.b #$02 : STA.b Scrap06 : STZ.b Scrap07 ;Number of Tiles
LDA $0DC0, X : ASL #04 LDA.w SpriteGFXControl, X : ASL #04
ADC.b #.animation_states : STA $08 ADC.b #.animation_states : STA.b Scrap08
LDA.b #.animation_states>>8 : ADC.b #$00 : STA $09 LDA.b #.animation_states>>8 : ADC.b #$00 : STA.b Scrap09
JSL Sprite_DrawMultiple_player_deferred JSL Sprite_DrawMultiple_player_deferred
JSL Sprite_DrawShadowLong JSL Sprite_DrawShadowLong
@@ -46,11 +46,11 @@ RTL
LDA.l TurnInGoalItems : AND.w #$00FF : BNE + LDA.l TurnInGoalItems : AND.w #$00FF : BNE +
.despawn .despawn
SEP #$20 SEP #$20
STZ $0DD0, X ; despawn self STZ.w SpriteAITable, X ; despawn self
RTS RTS
+ +
SEP #$20 SEP #$20
LDA.b $11 LDA.b GameSubMode
BNE .done BNE .done
LDA.b #$96 LDA.b #$96
LDY.b #$01 LDY.b #$01
@@ -66,6 +66,6 @@ RTL
.done .done
SEP #$20 SEP #$20
LDA.b $1A : LSR #5 : AND.b #$01 : STA.w $0DC0, X LDA.b FrameCounter : LSR #5 : AND.b #$01 : STA.w SpriteGFXControl, X
RTS RTS
} }

View File

@@ -7,7 +7,7 @@ EndingSequenceTableOverride:
TYX TYX
LDA.l EndingSequenceText, X LDA.l EndingSequenceText, X
PLX PLX
STA $1008, X STA.w $1008, X
PLY PLY
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -15,7 +15,7 @@ EndingSequenceTableLookupOverride:
PHY PHY
PHX PHX
TYX TYX
LDA.l EndingSequenceText, X : AND #$00FF LDA.l EndingSequenceText, X : AND.w #$00FF
PLX PLX
PLY PLY
RTL RTL

View File

@@ -3,21 +3,25 @@
; make sure bats always load LW stats ; make sure bats always load LW stats
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
NewBatInit: NewBatInit:
CPY #$00 : BEQ .light_world CPY.b #$00 : BEQ .light_world
;check if map id == 240 or 241 ;check if map id == 240 or 241
LDA $A0 : CMP #$F0 : BEQ .light_world ;oldman cave1 LDA.b RoomIndex : CMP.b #$F0 : BEQ .light_world ;oldman cave1
CMP #$F1 : BEQ .light_world ;oldman cave2 CMP.b #$F1 : BEQ .light_world ;oldman cave2
CMP #$B0 : BEQ .light_world ;agahnim statue keese CMP.b #$B0 : BEQ .light_world ;agahnim statue keese
CMP #$D0 : BEQ .light_world ;agahnim darkmaze CMP.b #$D0 : BEQ .light_world ;agahnim darkmaze
LDA.b #$85 : STA $0CD2, X LDA.b #$85 : STA.w SpriteBump, X
LDA.b #$04 : STA $0E50, X LDA.b #$04 : STA.w SpriteHitPoints, X
RTL RTL
.light_world .light_world
LDA.b #$80 : STA $0CD2, X LDA.b #$80 : STA.w SpriteBump, X
LDA.b #$01 : STA $0E50, X LDA.b #$01 : STA.w SpriteHitPoints, X
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
NewFireBarDamage:
LDA.w $00EE : CMP.w SpriteLayer, X : BNE .NotSameLayer
JSL Sprite_AttemptDamageToPlayerPlusRecoilLong
RTL
.NotSameLayer
RTL

View File

@@ -8,7 +8,7 @@ LockAgahnimDoors:
;#$0 = Never Locked ;#$0 = Never Locked
LDA.w #$0000 : RTL LDA.w #$0000 : RTL
+ : CMP.w #$0001 : BNE + + : CMP.w #$0001 : BNE +
LDA ProgressIndicator : AND.w #$000F : CMP.w #$0002 : !BGE .unlock ; if we rescued zelda, skip LDA.l ProgressIndicator : AND.w #$000F : CMP.w #$0002 : !BGE .unlock ; if we rescued zelda, skip
JSR.w LockAgahnimDoorsCore : RTL JSR.w LockAgahnimDoorsCore : RTL
+ : CMP.w #$0002 : BNE + + : CMP.w #$0002 : BNE +
JSR.w LockAgahnimDoorsCore : BEQ .unlock JSR.w LockAgahnimDoorsCore : BEQ .unlock
@@ -18,20 +18,20 @@ LockAgahnimDoors:
REP #$30 REP #$30
PLY : PLX PLY : PLX
!BGE .crystalOrUnlock !BGE .crystalOrUnlock
LDA #$0001 : RTL LDA.w #$0001 : RTL
.crystalOrUnlock .crystalOrUnlock
LDA InvertedMode : AND.w #$00FF : BEQ .unlock LDA.l InvertedMode : AND.w #$00FF : BEQ .unlock
LDA OverworldEventDataWRAM+$43 : AND.w #$0020 : BNE .unlock ; Check if GT overlay is already on or not LDA.l OverworldEventDataWRAM+$43 : AND.w #$0020 : BNE .unlock ; Check if GT overlay is already on or not
LDA $0308 : AND.w #$0080 : BEQ ++ ;If we are holding an item LDA.w AButtonAct : AND.w #$0080 : BEQ ++ ;If we are holding an item
.locked .locked
LDA #$0001 : RTL ;Keep the door locked LDA.w #$0001 : RTL ;Keep the door locked
++ ++
SEP #$30 SEP #$30
JSL $099B6F ;Add tower break seal JSL $099B6F ;Add tower break seal
REP #$30 REP #$30
LDA #$0001 ;Prevent door from opening that frame otherwise it glitchy LDA.w #$0001 ;Prevent door from opening that frame otherwise it glitchy
RTL RTL
+ +
@@ -44,18 +44,18 @@ RTL
FlagAgahnimDoor: FlagAgahnimDoor:
LDA.l InvertedMode : BEQ .vanilla LDA.l InvertedMode : BEQ .vanilla
LDA OverworldEventDataWRAM+$43 : ORA #$20 : STA OverworldEventDataWRAM+$43 ; activate GT overlay LDA.l OverworldEventDataWRAM+$43 : ORA.b #$20 : STA.l OverworldEventDataWRAM+$43 ; activate GT overlay
.vanilla .vanilla
LDA.b #$28 : STA.b $72 LDA.b #$28 : STA.b ScrapBuffer72
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LockAgahnimDoorsCore: LockAgahnimDoorsCore:
LDA $22 : CMP.w #1992 : !BLT + ; door too far left, skip LDA.b LinkPosX : CMP.w #1992 : !BLT + ; door too far left, skip
CMP.w #2088 : !BGE + ; door too rat right, skip CMP.w #2088 : !BGE + ; door too rat right, skip
LDA $20 : CMP.w #1720 : !BGE + ; door too low, skip LDA.b LinkPosY : CMP.w #1720 : !BGE + ; door too low, skip
LDA.w #$0001 LDA.w #$0001
RTS RTS
+ +
@@ -77,7 +77,7 @@ JML.l Overworld_Entrance_BRANCH_RHO
AllowStartFromSingleEntranceCave: AllowStartFromSingleEntranceCave:
; 16 Bit A, 16 bit XY ; 16 Bit A, 16 bit XY
; do not need to preserve A or X or Y ; do not need to preserve A or X or Y
LDA StartingEntrance : AND.w #$00FF ; What we wrote over LDA.l StartingEntrance : AND.w #$00FF ; What we wrote over
PHA PHA
TAX TAX
LDA.l StartingAreaExitOffset, X LDA.l StartingAreaExitOffset, X
@@ -86,46 +86,45 @@ AllowStartFromSingleEntranceCave:
BNE + BNE +
JMP .done JMP .done
+ +
DEC DEC
STA $00 STA.b Scrap00
ASL #2 : !ADD $00 : ASL #2 ; mult by 20 ASL #2 : !ADD Scrap00 : ASL #2 ; mult by 20
TAX TAX
LDA #$0016 : STA $7EC142 ; Cache the main screen designation LDA.w #$0016 : STA.l EN_MAINDESQ ; Cache the main screen designation
LDA.l StartingAreaExitTable+$05, X : STA $7EC144 ; Cache BG1 V scroll LDA.l StartingAreaExitTable+$05, X : STA.l EN_BG2VERT ; Cache BG1 V scroll
LDA.l StartingAreaExitTable+$07, X : STA $7EC146 ; Cache BG1 H scroll LDA.l StartingAreaExitTable+$07, X : STA.l EN_BG2HORZ ; Cache BG1 H scroll
LDA.l StartingAreaExitTable+$09, X : !ADD.w #$0010 : STA $7EC148 ; Cache Link's Y coordinate LDA.l StartingAreaExitTable+$09, X : !ADD.w #$0010 : STA.l EN_POSY ; Cache Link's Y coordinate
LDA.l StartingAreaExitTable+$0B, X : STA $7EC14A ; Cache Link's X coordinate LDA.l StartingAreaExitTable+$0B, X : STA.l EN_POSX ; Cache Link's X coordinate
LDA.l StartingAreaExitTable+$0D, X : STA $7EC150 ; Cache Camera Y coord lower bound. LDA.l StartingAreaExitTable+$0D, X : STA.l EN_SCROLLATN ; Cache Camera Y coord lower bound.
LDA.l StartingAreaExitTable+$0F, X : STA $7EC152 ; Cache Camera X coord lower bound. LDA.l StartingAreaExitTable+$0F, X : STA.l EN_SCROLLATW ; Cache Camera X coord lower bound.
LDA.l StartingAreaExitTable+$03, X : STA $7EC14E ; Cache Link VRAM Location LDA.l StartingAreaExitTable+$03, X : STA.l EN_OWTMAPI ; Cache Link VRAM Location
; Handle the 2 "unknown" bytes, which control what area of the backgound ; Handle the 2 "unknown" bytes, which control what area of the backgound
; relative to the camera? gets loaded with new tile data as the player moves around ; relative to the camera? gets loaded with new tile data as the player moves around
; (because some overworld areas like Kak are too big for a single VRAM tilemap) ; (because some overworld areas like Kak are too big for a single VRAM tilemap)
LDA.l StartingAreaExitTable+$11, X : AND.w #$00FF LDA.l StartingAreaExitTable+$11, X : AND.w #$00FF
BIT.w #$0080 : BEQ + : ORA #$FF00 : + ; Sign extend BIT.w #$0080 : BEQ + : ORA.w #$FF00 : + ; Sign extend
STA.l $7EC16A STA.l EN_SCRMODYA
LDA.l StartingAreaExitTable+$12, X : AND.w #$00FF LDA.l StartingAreaExitTable+$12, X : AND.w #$00FF
BIT.w #$0080 : BEQ + : ORA #$FF00 : + ; Sign extend BIT.w #$0080 : BEQ + : ORA.w #$FF00 : + ; Sign extend
STA.l $7EC16E STA.l EN_SCRMODXA
LDA.w #$0000 : !SUB.l $7EC16A : STA $7EC16C LDA.w #$0000 : !SUB.l EN_SCRMODYA : STA.l EN_SCRMODYB
LDA.w #$0000 : !SUB.l $7EC16E : STA $7EC170 LDA.w #$0000 : !SUB.l EN_SCRMODXA : STA.l EN_SCRMODXB
LDA.l StartingAreaExitTable+$02, X : AND.w #$00FF LDA.l StartingAreaExitTable+$02, X : AND.w #$00FF
STA $7EC14C ; Cache the overworld area number STA.l EN_OWSCR ; Cache the overworld area number
STA $7EC140 ; Cache the aux overworld area number STA.l EN_OWSCR2 ; Cache the aux overworld area number
STZ $0698 ;zero out door overlays in case starting overworld door is not set STZ.w TileMapTile32 ;zero out door overlays in case starting overworld door is not set
STZ $0699 ;zero out door overlays in case starting overworld door is not set STZ.w TileMapTile32+1 ;zero out door overlays in case starting overworld door is not set
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
LDA $7EF3C8 : TAX LDA.l StartingEntrance : TAX
LDA.l StartingAreaOverworldDoor, X : STA.l $7F5099 ;Load overworld door LDA.l StartingAreaOverworldDoor, X : STA.l PreviousOverworldDoor ;Load overworld door
REP #$20 ; reset 16-bit accumulator REP #$20 ; reset 16-bit accumulator
JSL.l CacheDoorFrameData JSL.l CacheDoorFrameData
@@ -135,7 +134,7 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
AllowStartFromExit: AllowStartFromExit:
LDX $1CE8 LDX.w MessageCursor
LDA.l ShouldStartatExit, X : BNE .doStart LDA.l ShouldStartatExit, X : BNE .doStart
LDA.l StartingEntrance ; what we wrote over LDA.l StartingEntrance ; what we wrote over
@@ -146,39 +145,38 @@ JML.l AllowStartFromExitReturn
LDA.l $028481, X ;Module_LocationMenu_starting_points LDA.l $028481, X ;Module_LocationMenu_starting_points
ASL : TAX ASL : TAX
LDA.l $02D8D2, X : STA $A0 LDA.l $02D8D2, X : STA.b RoomIndex
LDA.l $02D8D3, X : STA $A1 LDA.l $02D8D3, X : STA.b RoomIndex+1
; Go to pre-overworld mode ; Go to pre-overworld mode
LDA.b #$08 : STA $10 LDA.b #$08 : STA.b GameMode
STZ $11 STZ.b GameSubMode
STZ $B0 STZ.b SubSubModule
STZ.w DeathReloadFlag
STZ.w RespawnFlag
STZ $010A
STZ $04AA
JSL Equipment_SearchForEquippedItemLong JSL Equipment_SearchForEquippedItemLong
JSL HUD_RebuildLong2 JSL HUD_RebuildLong2
JSL $0DDD32 ; Equipment_UpdateEquippedItemLong JSL Equipment_UpdateEquippedItemLong
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CheckHole: CheckHole:
LDX.w #$0024 LDX.w #$0024
.nextHoleClassic .nextHoleClassic
LDA.b $00 : CMP.l $1BB800, X LDA.b Scrap00 : CMP.l $1BB800, X
BNE .wrongMap16Classic BNE .wrongMap16Classic
LDA.w $040A : CMP.l $1BB826, X LDA.b OverworldIndex : CMP.l $1BB826, X
BEQ .matchedHoleClassic BEQ .matchedHoleClassic
.wrongMap16Classic .wrongMap16Classic
DEX #2 : BPL .nextHoleClassic DEX #2 : BPL .nextHoleClassic
LDX.w #$001E LDX.w #$001E
.nextHoleExtra .nextHoleExtra
LDA.b $00 : CMP.l ExtraHole_Map16, X LDA.b Scrap00 : CMP.l ExtraHole_Map16, X
BNE .wrongMap16Extra BNE .wrongMap16Extra
LDA.w $040A : CMP.l ExtraHole_Area, X LDA.b OverworldIndex : CMP.l ExtraHole_Area, X
BEQ .matchedHoleExtra BEQ .matchedHoleExtra
.wrongMap16Extra .wrongMap16Extra
DEX #2 : BPL .nextHoleExtra DEX #2 : BPL .nextHoleExtra
@@ -189,14 +187,14 @@ CheckHole:
.matchedHoleExtra .matchedHoleExtra
SEP #$30 SEP #$30
TXA : LSR A : TAX TXA : LSR A : TAX
LDA.l ExtraHole_Entrance, X : STA.w $010E : STZ.w $010F LDA.l ExtraHole_Entrance, X : STA.w EntranceIndex : STZ.w EntranceIndex+1
JML Overworld_Hole_End JML Overworld_Hole_End
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
PreventEnterOnBonk: PreventEnterOnBonk:
STA $00 ; part of what we wrote over STA.b Scrap00 ; part of what we wrote over
LDA.l InvertedMode : AND.w #$00FF : BEQ .done LDA.l InvertedMode : AND.w #$00FF : BEQ .done
LDA.l $5D : AND.w #$00FF : CMP.w #$0014 : BNE .done ;in mirror mode? LDA.b LinkState : AND.w #$00FF : CMP.w #$0014 : BNE .done ;in mirror mode?
LDA.b $8A : AND.w #$0040 : CMP $7B : BEQ .done ; Are we bonking, or doing the superbunny glitch? LDA.b OverworldIndex : AND.w #$0040 : CMP.b WorldCache : BEQ .done ; Are we bonking, or doing the superbunny glitch?
; If in inverted, are in mirror mode, and are bonking then do not enter ; If in inverted, are in mirror mode, and are bonking then do not enter
JML.l PreventEnterOnBonk_BRANCH_IX JML.l PreventEnterOnBonk_BRANCH_IX
@@ -206,8 +204,8 @@ PreventEnterOnBonk:
JML.l PreventEnterOnBonk_return JML.l PreventEnterOnBonk_return
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
TurtleRockEntranceFix: TurtleRockEntranceFix:
LDA TurtleRockAutoOpenFix : BEQ .done LDA.l TurtleRockAutoOpenFix : BEQ .done
LDA $8A : CMP.b #$47 : BNE .done LDA.b OverworldIndex : CMP.b #$47 : BNE .done
;If exiting to turtle rock ensure the entrance is open ;If exiting to turtle rock ensure the entrance is open
LDA.l OverworldEventDataWRAM+$47 : ORA.b #$20 : STA.l OverworldEventDataWRAM+$47 LDA.l OverworldEventDataWRAM+$47 : ORA.b #$20 : STA.l OverworldEventDataWRAM+$47
.done .done
@@ -216,14 +214,14 @@ RTL
AnimatedEntranceFix: ;when an entrance animation tries to start AnimatedEntranceFix: ;when an entrance animation tries to start
PHA PHA
LDA.l InvertedMode : BEQ + ;If we are in inverted mode LDA.l InvertedMode : BEQ + ;If we are in inverted mode
LDA $8A : AND.b #$40 : BNE + ;and in the light world LDA.b OverworldIndex : AND.b #$40 : BNE + ;and in the light world
PLA PLA
STZ $04C6 ; skip it. STZ.w OWEntranceCutscene ; skip it.
LDA #$00 LDA.b #$00
RTL RTL
+ +
PLA PLA
STA $02E4 ;what we wrote over STA.w CutsceneFlag ;what we wrote over
STA $0FC1 ;what we wrote over STA.w FreezeSprites ;what we wrote over
STA $0710 ;what we wrote over STA.w SkipOAM ;what we wrote over
RTL RTL

View File

@@ -1,13 +1,6 @@
;--------------------------------------------------------------------------------
; OnLoadOW
;--------------------------------------------------------------------------------
;OnLoadMap:
; LDA OverworldEventDataWRAM+$5B ; thing we wrote over
;RTL
;--------------------------------------------------------------------------------
OnPrepFileSelect: OnPrepFileSelect:
LDA $11 : CMP.b #$03 : BNE + LDA.b GameSubMode : CMP.b #$03 : BNE +
LDA.b #$06 : STA $14 ; thing we wrote over LDA.b #$06 : STA.b NMISTRIPES ; thing we wrote over
RTL RTL
+ +
JSL.l LoadAlphabetTilemap JSL.l LoadAlphabetTilemap
@@ -22,7 +15,7 @@ OnDrawHud:
JML.l ReturnFromOnDrawHud JML.l ReturnFromOnDrawHud
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OnDungeonEntrance: OnDungeonEntrance:
STA $7EC172 ; thing we wrote over STA.l PegColor ; thing we wrote over
JSL MaybeFlagCompassTotalEntrance JSL MaybeFlagCompassTotalEntrance
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -40,7 +33,7 @@ OnDungeonExit:
JSL.l SQEGFix JSL.l SQEGFix
PLP : PLA PLP : PLA
STA $040C : STZ $04AC ; thing we wrote over STA.w DungeonID : STZ.w Map16ChangeIndex ; thing we wrote over
PHA : PHP PHA : PHP
JSL.l HUD_RebuildLong JSL.l HUD_RebuildLong
@@ -51,17 +44,17 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OnQuit: OnQuit:
JSL.l SQEGFix JSL.l SQEGFix
LDA.b #$00 : STA $7F5035 ; bandaid patch bug with mirroring away from text LDA.b #$00 : STA.l AltTextFlag ; bandaid patch bug with mirroring away from text
LDA.b #$10 : STA $1C ; thing we wrote over LDA.b #$10 : STA.b MAINDESQ ; thing we wrote over
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OnUncleItemGet: OnUncleItemGet:
PHA PHA
LDA.l EscapeAssist LDA.l EscapeAssist
BIT.b #$04 : BEQ + : STA !INFINITE_MAGIC : + BIT.b #$04 : BEQ + : STA.l InfiniteMagic : +
BIT.b #$02 : BEQ + : STA !INFINITE_BOMBS : + BIT.b #$02 : BEQ + : STA.l InfiniteBombs : +
BIT.b #$01 : BEQ + : STA !INFINITE_ARROWS : + BIT.b #$01 : BEQ + : STA.l InfiniteArrows : +
PLA PLA
JSL.l Link_ReceiveItem JSL.l Link_ReceiveItem
@@ -91,15 +84,15 @@ OnFileCreation:
; Copy initial SRAM state from ROM to cart SRAM ; Copy initial SRAM state from ROM to cart SRAM
; If the inital SRAM table is move these addresses must be changed ; If the inital SRAM table is move these addresses must be changed
PHB PHB
LDA.w #$03D7 ; \ LDA.w #$03D7 ; \
LDX.w #$B000 ; | Copies from beginning of inital sram table up to file name LDX.w #$B000 ; | Copies from beginning of inital sram table up to file name
LDY.w #$0000 ; | (exclusively) LDY.w #$0000 ; | (exclusively)
MVN SRAMBank, SRAMTableBank ; / MVN !SRAMBank, !SRAMTableBank ; /
; Skip file name and validity value ; Skip file name and validity value
LDA.w #$010C ; \ LDA.w #$010C ; \
LDX.w #$B3E3 ; | Rando-Specific Assignments & Game Stats block LDX.w #$B3E3 ; | Rando-Specific Assignments & Game Stats block
LDY.w #$03E3 ; | LDY.w #$03E3 ; |
MVN SRAMBank, SRAMTableBank ; / MVN !SRAMBank, !SRAMTableBank ; /
PLB PLB
; resolve instant post-aga if standard ; resolve instant post-aga if standard
@@ -111,33 +104,31 @@ OnFileCreation:
REP #$20 REP #$20
; Set validity value and do some cleanup. Jump to checksum. ; Set validity value and do some cleanup. Jump to checksum.
LDA.w #$55AA : STA.l $7003E1 LDA.w #$55AA : STA.l FileValiditySRAM
STZ $00 STZ.b Scrap00
STZ $01 STZ.b Scrap01
LDX.b $00 LDX.b Scrap00
LDY.w #$0000 LDY.w #$0000
TYA TYA
JML.l InitializeSaveFile_build_checksum JML.l InitializeSaveFile_build_checksum
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!RNG_ITEM_LOCK_IN = "$7F5090"
OnFileLoad: OnFileLoad:
REP #$10 ; set 16 bit index registers REP #$10 ; set 16 bit index registers
JSL.l EnableForceBlank ; what we wrote over JSL.l EnableForceBlank ; what we wrote over
LDA.b #$07 : STA $210C ; Restore screen 3 to normal tile area LDA.b #$07 : STA.w BG34NBA ; Restore screen 3 to normal tile area
LDA.l FileMarker : BNE + LDA.l FileMarker : BNE +
JSL.l OnNewFile JSL.l OnNewFile
LDA.b #$FF : STA.l FileMarker LDA.b #$FF : STA.l FileMarker
+ +
LDA.w $010A : BNE + ; don't adjust the worlds for "continue" or "save-continue" LDA.w DeathReloadFlag : BNE + ; don't adjust the worlds for "continue" or "save-continue"
LDA.l $7EC011 : BNE + ; don't adjust worlds if mosiac is enabled (Read: mirroring in dungeon) LDA.l MosaicLevel : BNE + ; don't adjust worlds if mosiac is enabled (Read: mirroring in dungeon)
JSL.l DoWorldFix JSL.l DoWorldFix
+ +
JSL.l MasterSwordFollowerClear JSL.l MasterSwordFollowerClear
LDA.b #$FF : STA !RNG_ITEM_LOCK_IN ; reset rng item lock-in LDA.b #$FF : STA.l RNGLockIn ; reset rng item lock-in
LDA.b #$00 : STA $7F5001 ; mark fake flipper softlock as impossible
LDA.l GenericKeys : BEQ + LDA.l GenericKeys : BEQ +
LDA.l CurrentGenericKeys : STA.l CurrentSmallKeys ; copy generic keys to key counter LDA.l CurrentGenericKeys : STA.l CurrentSmallKeys ; copy generic keys to key counter
+ +
@@ -152,86 +143,78 @@ OnFileLoad:
SEP #$10 ; restore 8 bit index registers SEP #$10 ; restore 8 bit index registers
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!RNG_ITEM_LOCK_IN = "$7F5090"
OnNewFile: OnNewFile:
PHX : PHP PHX : PHP
; reset some values on new file that are otherwise only reset on hard reset ; reset some values on new file that are otherwise only reset on hard reset
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
STZ $03C4 ; ancilla slot index STZ.w AncillaSearch
STZ $047A ; EG STZ.w LayerAdjustment ; EG
STZ $0B08 : STZ $0B09 ; arc variable STZ.w ArcVariable : STZ.w ArcVariable+1
STZ $0CFB ; enemies killed (pull trees) STZ.w TreePullKills
STZ $0CFC ; times taken damage (pull trees) STZ.w TreePullHits
STZ $0FC7 : STZ $0FC8 : STZ $0FC9 : STZ $0FCA : STZ $0FCB : STZ $0FCC : STZ $0FCD ; prize packs STZ.w PrizePackIndexes
LDA #$00 : STA $7EC011 ; mosaic STZ.w PrizePackIndexes+1
JSL InitRNGPointerTable ; boss RNG STZ.w PrizePackIndexes+2
STZ.w PrizePackIndexes+3
STZ.w PrizePackIndexes+4
STZ.w PrizePackIndexes+5
STZ.w PrizePackIndexes+6
LDA.b #$00 : STA.l MosaicLevel
JSL InitRNGPointerTable
PLP : PLX PLP : PLX
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OnInitFileSelect: OnInitFileSelect:
; LDA.b #$10 : STA $BC ; init sprite pointer - does nothing unless spriteswap.asm is included LDA.b #$51 : STA.w $0AA2 ;<-- Line missing from JP1.0, needed to ensure "extra" copy of naming screen graphics are loaded.
; JSL.l SpriteSwap_SetSprite
LDA.b #$51 : STA $0AA2 ;<-- Line missing from JP1.0, needed to ensure "extra" copy of naming screen graphics are loaded.
JSL.l EnableForceBlank JSL.l EnableForceBlank
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OnLinkDamaged: OnLinkDamaged:
JSL.l IncrementDamageTakenCounter_Arb JSL.l IncrementDamageTakenCounter_Arb
;JSL.l FlipperKill
JML.l OHKOTimer JML.l OHKOTimer
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OnEnterWater: ;OnEnterWater:
JSL.l RegisterWaterEntryScreen ; JSL.l UnequipCapeQuiet ; what we wrote over
;RTL
JSL.l MysteryWaterFunction
LDX.b #$04
RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OnLinkDamagedFromPit: OnLinkDamagedFromPit:
JSL.l OHKOTimer JSL.l OHKOTimer
LDA.l AllowAccidentalMajorGlitch LDA.l AllowAccidentalMajorGlitch
BEQ ++ BEQ ++
-- LDA.b #$14 : STA $11 ; thing we wrote over -- LDA.b #$14 : STA.b GameSubMode ; thing we wrote over
RTL RTL
++ LDA.b $10 : CMP.b #$12 : BNE -- ++ LDA.b GameMode : CMP.b #$12 : BNE --
STZ.b $11 STZ.b GameSubMode
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
OnLinkDamagedFromPitOutdoors: OnLinkDamagedFromPitOutdoors:
JML.l OHKOTimer ; make sure this is last JML.l OHKOTimer ; make sure this is last
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!RNG_ITEM_LOCK_IN = "$7F5090"
OnOWTransition: OnOWTransition:
JSL.l FloodGateReset JSL.l FloodGateReset
JSL.l FlipperFlag
JSL.l StatTransitionCounter JSL.l StatTransitionCounter
PHP PHP
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
LDA.b #$FF : STA !RNG_ITEM_LOCK_IN ; clear lock-in LDA.b #$FF : STA.l RNGLockIn ; clear lock-in
PLP PLP
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!DARK_DUCK_TEMP = "$7F509C"
OnLoadDuckMap: OnLoadDuckMap:
LDA !DARK_DUCK_TEMP LDA.l DuckMapFlag
BNE + BNE +
INC : STA !DARK_DUCK_TEMP INC : STA.l DuckMapFlag
JSL OverworldMap_InitGfx : DEC $0200 JSL OverworldMap_InitGfx : DEC.w SubModuleInterface
RTL RTL
+ +
LDA.b #$00 : STA !DARK_DUCK_TEMP LDA.b #$00 : STA.l DuckMapFlag
JML OverworldMap_DarkWorldTilemap JML OverworldMap_DarkWorldTilemap
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
PreItemGet: PreItemGet:
LDA.b #$01 : STA !ITEM_BUSY ; mark item as busy LDA.b #$01 : STA.l BusyItem ; mark item as busy
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
PostItemGet: PostItemGet:
@@ -239,19 +222,19 @@ PostItemGet:
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
PostItemAnimation: PostItemAnimation:
LDA.b #$00 : STA !ITEM_BUSY ; mark item as finished LDA.b #$00 : STA.l BusyItem ; mark item as finished
LDA $7F509F : BEQ + LDA.l TextBoxDefer : BEQ +
STZ $1CF0 : STZ $1CF1 ; reset decompression buffer STZ.w TextID : STZ.w TextID+1 ; reset decompression buffer
JSL.l Main_ShowTextMessage_Alt JSL.l Main_ShowTextMessage_Alt
LDA.b #$00 : STA $7F509F LDA.b #$00 : STA.l TextBoxDefer
+ +
LDA.w $02E9 : CMP.b #$01 : BNE + LDA.w ItemReceiptMethod : CMP.b #$01 : BNE +
LDA.b $2F : BEQ + LDA.b LinkDirection : BEQ +
JSL.l IncrementChestTurnCounter JSL.l IncrementChestTurnCounter
+ +
STZ $02E9 : LDA $0C5E, X ; thing we wrote over to get here STZ.w ItemReceiptMethod : LDA.w AncillaGet, X ; thing we wrote over to get here
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

View File

@@ -1,9 +1,9 @@
pushtable pushtable
table "bsodencode.txt" table "data/bsodencode.txt"
; Uncomment this to force a crash to test message ; Uncomment this to force a crash to test message
;pushpc : org $008132 : db 0 : pullpc ; pushpc : org $008132 : db 0 : pullpc
;=================================================================================================== ;===================================================================================================
@@ -11,29 +11,29 @@ DontUseZSNES:
SEP #$35 ; sets carry and I flag too SEP #$35 ; sets carry and I flag too
LDA.b #$00 LDA.b #$00
STA.l $4200 ; disable NMI and IRQ STA.l NMITIMEN ; disable NMI and IRQ
STA.l $420C ; disable HDMA STA.l HDMAEN ; disable HDMA
ROR ; A = 0x80 from carry ROR ; A = 0x80 from carry
STA.l $2100 STA.l INIDISP
STA.l $2115 STA.l VMAIN
; Empty VRAM ; Empty VRAM
LDA.b #AllZeros>>16 : STA.l $4304 LDA.b #AllZeros>>16 : STA.l A1B0
REP #$20 REP #$20
LDA.w #AllZeros LDA.w #AllZeros
STA.l $4302 STA.l A1T0L
LDA.w #$1809 LDA.w #$1809
STA.l $4300 STA.l DMAP0
LDA.w #$0000 LDA.w #$0000
STA.l $4305 STA.l DAS0L
LDA.w #$0001 LDA.w #$0001
STA.l $420B STA.l MDMAEN
JSR ConfigurePPUForFailureReport JSR ConfigurePPUForFailureReport
JSR ConfigureBSODVWF JSR ConfigureBSODVWF
@@ -43,7 +43,7 @@ DontUseZSNES:
JSR DrawVWFMessage JSR DrawVWFMessage
LDA.w #$0F0F LDA.w #$0F0F
STA.w $2100 STA.w INIDISP
-- BRA -- -- BRA --
@@ -77,29 +77,29 @@ Crashed:
SEP #$35 ; sets carry and I flag too SEP #$35 ; sets carry and I flag too
LDA.b #$00 LDA.b #$00
STA.l $4200 ; disable NMI and IRQ STA.l NMITIMEN ; disable NMI and IRQ
STA.l $420C ; disable HDMA STA.l HDMAEN ; disable HDMA
ROR ; A = 0x80 from carry ROR ; A = 0x80 from carry
STA.l $2100 STA.l INIDISP
STA.l $2115 STA.l VMAIN
; Empty VRAM ; Empty VRAM
LDA.b #AllZeros>>16 : STA.l $4304 LDA.b #AllZeros>>16 : STA.l A1B0
REP #$38 REP #$38
LDA.w #AllZeros LDA.w #AllZeros
STA.l $4302 STA.l A1T0L
LDA.w #$1809 LDA.w #$1809
STA.l $4300 STA.l DMAP0
LDA.w #$0000 LDA.w #$0000
STA.l $4305 STA.l DAS0L
LDA.w #$0001 LDA.w #$0001
STA.l $420B STA.l MDMAEN
;=================================================================================================== ;===================================================================================================
@@ -113,32 +113,32 @@ Crashed:
; stack pointer ; stack pointer
LDA.w #$0C38>>1 LDA.w #$0C38>>1
STA.b $2116 STA.b VMADDL
TSC TSC
XBA XBA
AND.w #$00FF AND.w #$00FF
ORA.w #$0100 ORA.w #$0100
STA.b $2118 STA.b VMDATAL
TSC TSC
AND.w #$00FF AND.w #$00FF
ORA.w #$0100 ORA.w #$0100
STA.l $2118 STA.l VMDATAL
; game module ; game module
LDA.w #$0C78>>1 LDA.w #$0C78>>1
STA.b $2116 STA.b VMADDL
LDA.l $10 LDA.l GameMode
AND.w #$00FF AND.w #$00FF
ORA.w #$0100 ORA.w #$0100
STA.b $2118 STA.b VMDATAL
LDA.l $11 LDA.l GameSubMode
AND.w #$00FF AND.w #$00FF
ORA.w #$0100 ORA.w #$0100
STA.b $2118 STA.b VMDATAL
;--------------------------------------------------------------------------------------------------- ;---------------------------------------------------------------------------------------------------
@@ -176,7 +176,7 @@ Crashed:
.next_row .next_row
STA.l $7F0004 STA.l $7F0004
STA.b $2116 STA.b VMADDL
LDY.w #20 LDY.w #20
@@ -194,7 +194,7 @@ Crashed:
AND.w #$01FF AND.w #$01FF
.in_stack .in_stack
STA.b $2118 STA.b VMDATAL
DEX DEX
TXA TXA
@@ -235,16 +235,10 @@ Crashed:
JSR DrawVWFMessage JSR DrawVWFMessage
LDA.w #$0F0F LDA.w #$0F0F
STA.w $2100 STA.w INIDISP
-- BRA -- -- BRA --
; LDA.w #$0000
; TCD
;
; TSC
BSODMessage: BSODMessage:
db "A fatal error has occurred and resulted in an", $80 db "A fatal error has occurred and resulted in an", $80
db "unrecoverable crash. ?", $80 db "unrecoverable crash. ?", $80
@@ -260,11 +254,11 @@ BSODMessage:
;=================================================================================================== ;===================================================================================================
DrawVWFMessage: DrawVWFMessage:
STA.b $06 STA.b Scrap06
.next .next
LDA.b ($06) LDA.b (Scrap06)
INC.b $06 INC.b Scrap06
AND.w #$00FF AND.w #$00FF
CMP.w #$0080 CMP.w #$0080
BEQ .done_row BEQ .done_row
@@ -284,26 +278,26 @@ DrawVWFMessage:
ASL ASL
TAX TAX
LDA.w .row_offset,X LDA.w .row_offset,X
STA.w $2116 STA.w VMADDL
INC.b VWFR INC.b VWFR
LDA.w #$1800 LDA.w #$1800
STA.w $4300 STA.w DMAP0
LDA.w #20*16 LDA.w #20*16
STA.w $4305 STA.w DAS0L
LDA.w #$1000 LDA.w #$1000
STA.w $4302 STA.w A1T0L
SEP #$20 SEP #$20
STZ.w $2115 STZ.w VMAIN
STZ.w $4304 STZ.w A1B0
LDA.b #$01 LDA.b #$01
STA.w $420B STA.w MDMAEN
REP #$20 REP #$20
@@ -347,7 +341,7 @@ DrawFailureVWFChar:
ASL ASL
ASL ASL
ADC.w #BSODFontGFX ADC.w #BSODFontGFX
STA.b $08 STA.b Scrap08
LDA.b VWFP LDA.b VWFP
AND.w #$FFF8 AND.w #$FFF8
@@ -402,23 +396,23 @@ LoadBSODHexFont:
REP #$20 REP #$20
LDA.w #BSODHex LDA.w #BSODHex
STA.w $4302 STA.w A1T0L
LDA.w #$1801 LDA.w #$1801
STA.w $4300 STA.w DMAP0
LDA.w #$1000 LDA.w #$1000
STA.w $4305 STA.w DAS0L
LDA.w #$2800 LDA.w #$2800
STA.w $2116 STA.w VMADDL
SEP #$20 SEP #$20
LDA.b #BSODHex>>16 LDA.b #BSODHex>>16
STA.w $4304 STA.w A1B0
LDA.b #$01 LDA.b #$01
STA.w $420B STA.w MDMAEN
REP #$30 REP #$30
@@ -437,21 +431,21 @@ ConfigureBSODVWF:
LDX.b #$FF LDX.b #$FF
LDY.b #$7F LDY.b #$7F
STZ.b $2121 STZ.b CGADD
STZ.b $2122 : STZ.b $2122 STZ.b CGDATA : STZ.b CGDATA
STX.b $2122 : STY.b $2122 STX.b CGDATA : STY.b CGDATA
LDA.b #$05 LDA.b #$05
STA.b $2121 STA.b CGADD
LDA.b #$11 : STA.b $2122 : STY.b $2122 LDA.b #$11 : STA.b CGDATA : STY.b CGDATA
LDA.b #$21 : STA.b $2121 LDA.b #$21 : STA.b CGADD
STX.b $2122 : STY.b $2122 STX.b CGDATA : STY.b CGDATA
LDA.b #$25 : STA.b $2121 LDA.b #$25 : STA.b CGADD
LDA.b #$11 : STA.b $2122 : STY.b $2122 LDA.b #$11 : STA.b CGDATA : STY.b CGDATA
REP #$30 REP #$30
@@ -473,14 +467,14 @@ ConfigureBSODVWF:
.start .start
STA.w $20 STA.w $20
STA.b $2116 STA.b VMADDL
PLA PLA
LDY.w #30 LDY.w #30
.next_char .next_char
STA.b $2118 STA.b VMDATAL
INC INC
DEY DEY
BNE .next_char BNE .next_char
@@ -516,39 +510,39 @@ ConfigurePPUForFailureReport:
PHK PHK
PLB PLB
STZ.w $2105 ; BG mode 0 STZ.w BGMODE ; BG mode 0
STZ.w $2106 ; no mosaic STZ.w MOSAIC ; no mosaic
STZ.w $2107 ; BG1 tilemap to $0000 STZ.w BG1SC ; BG1 tilemap to $0000
STZ.w $212D STZ.w TS
STZ.w $210D : STZ.w $210D STZ.w BG1HOFS : STZ.w BG1HOFS
STZ.w $210E : STZ.w $210E STZ.w BG1VOFS : STZ.w BG1VOFS
STZ.w $210F : STZ.w $210F STZ.w BG2HOFS : STZ.w BG2HOFS
STZ.w $2110 : STZ.w $2110 STZ.w BG2VOFS : STZ.w BG2VOFS
STZ.w $2123 STZ.w W12SEL
STZ.w $2131 STZ.w CGADSUB
STZ.w $2133 STZ.w SETINI
LDA.b #$04 LDA.b #$04
STA.w $2108 ; BG1 tilemap to $0800 STA.w BG2SC ; BG1 tilemap to $0800
LDA.b #$21 LDA.b #$21
STA.w $210B STA.w BG12NBA
LDA.b #$03 LDA.b #$03
STA.w $212C STA.w TM
RTS RTS
;=================================================================================================== ;===================================================================================================
BSODHex: BSODHex:
incbin "bsodhex.2bpp" incbin "data/bsodhex.2bpp"
BSODFontGFX: BSODFontGFX:
incbin "bsodfont.1bpp" incbin "data/bsodfont.1bpp"
BSODCharWidths: BSODCharWidths:
; [space] ; [space]

View File

@@ -2,20 +2,20 @@
; Fairy Changes & Fixes ; Fairy Changes & Fixes
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
RefillHealthPlusMagic: RefillHealthPlusMagic:
LDA BigFairyHealth : STA HeartsFiller LDA.l BigFairyHealth : STA.l HeartsFiller
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
RefillHealthPlusMagic8bit: RefillHealthPlusMagic8bit:
LDA BigFairyHealth : STA HeartsFiller LDA.l BigFairyHealth : STA.l HeartsFiller
LDA BigFairyMagic : STA MagicFiller LDA.l BigFairyMagic : STA.l MagicFiller
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CheckFullHealth: CheckFullHealth:
LDA BigFairyHealth : BEQ + LDA.l BigFairyHealth : BEQ +
LDA CurrentHealth : CMP MaximumHealth : BNE .player_hp_not_full_yet LDA.l CurrentHealth : CMP.l MaximumHealth : BNE .player_hp_not_full_yet
+ +
LDA BigFairyMagic : BEQ + LDA.l BigFairyMagic : BEQ +
LDA CurrentMagic : CMP.b #$80 : BNE .player_mp_not_full_yet LDA.l CurrentMagic : CMP.b #$80 : BNE .player_mp_not_full_yet
+ +
LDA.b #$00 LDA.b #$00
RTL RTL
@@ -30,57 +30,56 @@ FairyPond_Init:
JML.l Sprite_ShowMessageFromPlayerContact JML.l Sprite_ShowMessageFromPlayerContact
+ +
PHY : JSL.l Sprite_CheckDamageToPlayerSameLayerLong : BCC + PHY : JSL.l Sprite_CheckDamageToPlayerSameLayerLong : BCC +
LDA BottleContentsOne : CMP.b #$02 : BNE ++ : LDA.b #$1C : PHA : BRA .emptyBottle : ++ LDA.l BottleContentsOne : CMP.b #$02 : BNE ++ : LDA.b #$1C : PHA : BRA .emptyBottle : ++
LDA BottleContentsTwo : CMP.b #$02 : BNE ++ : LDA.b #$1D : PHA : BRA .emptyBottle : ++ LDA.l BottleContentsTwo : CMP.b #$02 : BNE ++ : LDA.b #$1D : PHA : BRA .emptyBottle : ++
LDA BottleContentsThree : CMP.b #$02 : BNE ++ : LDA.b #$1E : PHA : BRA .emptyBottle : ++ LDA.l BottleContentsThree : CMP.b #$02 : BNE ++ : LDA.b #$1E : PHA : BRA .emptyBottle : ++
LDA BottleContentsFour : CMP.b #$02 : BNE ++ : LDA.b #$1F : PHA : BRA .emptyBottle : ++ LDA.l BottleContentsFour : CMP.b #$02 : BNE ++ : LDA.b #$1F : PHA : BRA .emptyBottle : ++
.noInventory .noInventory
LDA.b #$0A : STA $0D80, X LDA.b #$0A : STA.w SpriteActivity, X
LDA.b #$51 LDA.b #$51
LDY.b #$01 LDY.b #$01
JSL.l Sprite_ShowMessageFromPlayerContact JSL.l Sprite_ShowMessageFromPlayerContact
JMP .cleanup JMP .cleanup
.emptyBottle .emptyBottle
LDA.b #$02 : STA $0D80, X LDA.b #$02 : STA.w SpriteActivity, X
;JSL Player_ResetState ; If we continue to have issues, add this in too. (After determining the address for it) STZ.b LinkDirection
STZ $2F LDA.b #$01 : STA.w CutsceneFlag
LDA.b #$01 : STA $02E4 PLA : STA.w MessageCursor
PLA : STA $1CE8
.cleanup .cleanup
STZ $0EB0, X ; Clear the sprite's item-given variable STZ.w SpriteDirectionTable, X ; Clear the sprite's item-given variable
CLC ; skip rest of original function CLC ; skip rest of original function
+ : PLY + : PLY
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
HappinessPond_Check: HappinessPond_Check:
LDA $A0 : CMP.b #$15 ;what we wrote over LDA.b RoomIndex : CMP.b #$15 ;what we wrote over
BNE .done BNE .done
PHP PHP
LDA.b #$72 LDA.b #$72
JSL Sprite_SpawnDynamically JSL Sprite_SpawnDynamically
LDA $0FD8 : STA $0D10, Y LDA.w SpriteCoordCacheX : STA.w SpritePosXLow, Y
LDA $0FD9 : STA $0D30, Y LDA.w SpriteCoordCacheX+1 : STA.w SpritePosXHigh, Y
LDA $0FDA : !SUB.b #$40 : STA $0D00, Y LDA.w SpriteCoordCacheY : !SUB.b #$40 : STA.w SpritePosYLow, Y
LDA $0FDB : SBC.b #$00 : STA $0D20, Y LDA.w SpriteCoordCacheY+1 : SBC.b #$00 : STA.w SpritePosYHigh, Y
LDA.b #$01 : STA $0DA0, Y LDA.b #$01 : STA.w SpriteAuxTable, Y
LDA.b #$BB LDA.b #$BB
JSL Sprite_SpawnDynamically JSL Sprite_SpawnDynamically
LDA.b #$08 : STA $0DD0, Y ; ensure we run prep for the shopkeeper LDA.b #$08 : STA.w SpriteAITable, Y ; ensure we run prep for the shopkeeper
LDA $0FD8 : STA $0D10, Y LDA.w SpriteCoordCacheX : STA.w SpritePosXLow, Y
LDA $0FD9 : STA $0D30, Y LDA.w SpriteCoordCacheX+1 : STA.w SpritePosXHigh, Y
LDA $0FDA : !SUB.b #$20 : STA $0D00, Y LDA.w SpriteCoordCacheY : !SUB.b #$20 : STA.w SpritePosYLow, Y
LDA $0FDB : SBC.b #$00 : STA $0D20, Y LDA.w SpriteCoordCacheY+1 : SBC.b #$00 : STA.w SpritePosYHigh, Y
STZ $0DD0, X ; self terminate STZ.w SpriteAITable, X ; self terminate
PLP PLP
.done .done

View File

@@ -1,21 +1,21 @@
;=================================================================================================== ;===================================================================================================
FastCreditsCutsceneTimer: FastCreditsCutsceneTimer:
BIT.b $F2-1 : BVC .slow BIT.b Joy1B_All-1 : BVC .slow
LDA.w #$0001 : STA.b $50 LDA.w #$0001 : STA.b $50
LDA.b $C8 LDA.b ScrapBufferBD+$0B
CLC CLC
ADC.w #$0004 ADC.w #$0004
AND.w #$FFFE AND.w #$FFFE
STA.b $C8 STA.b ScrapBufferBD+$0B
SEP #$20 SEP #$20
RTL RTL
.slow .slow
INC.b $C8 INC.b ScrapBufferBD+$0B
SEP #$20 SEP #$20
RTL RTL
@@ -51,16 +51,16 @@ FastCreditsCutsceneScroll:
LDA.w $00E2,Y LDA.w $00E2,Y
CMP.l $0EC308,X ; compare to target CMP.l $0EC308,X ; compare to target
ROL.b $00 ; put carry in here ROL.b Scrap00 ; put carry in here
LDA.l $0EC348,X ; get movement LDA.l $0EC348,X ; get movement
BPL ++ ; if positive, leave saved carry alone BPL ++ ; if positive, leave saved carry alone
INC.b $00 ; otherwise, flip it INC.b Scrap00 ; otherwise, flip it
++ ROR.b $00 ; recover carry ++ ROR.b Scrap00 ; recover carry
BCC ++ ; scroll if carry not set BCC ++ ; scroll if carry not set
LDA.w #$0000 LDA.w #$0000
++ BIT.b $F2-1 : BVC .slow ; check for X held ++ BIT.b Joy1B_All-1 : BVC .slow ; check for X held
AND.w #$FFFF ; get sign of A AND.w #$FFFF ; get sign of A
BPL .positive BPL .positive
@@ -90,8 +90,8 @@ FastCreditsCutsceneScroll:
FastCreditsCutsceneUnderworldX: FastCreditsCutsceneUnderworldX:
JSR FastCreditsCutsceneScrollX JSR FastCreditsCutsceneScrollX
CLC CLC
ADC.b $E2 ADC.b BG2H
STA.b $E2 STA.b BG2H
RTL RTL
@@ -99,15 +99,15 @@ FastCreditsCutsceneUnderworldX:
FastCreditsCutsceneUnderworldY: FastCreditsCutsceneUnderworldY:
JSR FastCreditsCutsceneScrollY JSR FastCreditsCutsceneScrollY
CLC CLC
ADC.b $E8 ADC.b BG2V
STA.b $E8 STA.b BG2V
RTL RTL
FastTextScroll: FastTextScroll:
LDA.b $1A LDA.b FrameCounter
BIT.b $F2-1 : BVC .slow BIT.b Joy1B_All-1 : BVC .slow
AND.w #$0000 AND.w #$0000
RTL RTL

View File

@@ -1,18 +1,17 @@
!ValidKeyLoaded = "$7F509E"
;FS prefix means file_select, since these defines and macros are specific to this screen ;FS prefix means file_select, since these defines and macros are specific to this screen
!FS_COLOR_BROWN = "$0000" ;(only used for: Shovel, hammer, powder) !FS_COLOR_BROWN = $0000 ;(only used for: Shovel, hammer, powder)
!FS_COLOR_RED = "$0400" !FS_COLOR_RED = $0400
!FS_COLOR_YELLOW = "$0800" !FS_COLOR_YELLOW = $0800
!FS_COLOR_BLUE = "$0C00" !FS_COLOR_BLUE = $0C00
!FS_COLOR_GRAY = "$1000" ;(Used to gray out items) !FS_COLOR_GRAY = $1000 ;(Used to gray out items)
!FS_COLOR_BOOTS = "$1400" !FS_COLOR_BOOTS = $1400
!FS_COLOR_GREEN = "$1800" !FS_COLOR_GREEN = $1800
!FS_COLOR_BW = "$1C00" !FS_COLOR_BW = $1C00
!FS_HFLIP = "$4000" !FS_HFLIP = $4000
!FS_VFLIP = "$8000" !FS_VFLIP = $8000
macro fs_draw8x8(screenrow,screencol) macro fs_draw8x8(screenrow,screencol)
;Note due to XKAS's screwy math this formula is misleading. ;Note due to XKAS's screwy math this formula is misleading.
@@ -83,45 +82,45 @@ JMP DrawItemGray
DrawBottle: DrawBottle:
AND.w #$00FF : BNE + AND.w #$00FF : BNE +
LDX #FileSelectItems_empty_bottle LDX.w #FileSelectItems_empty_bottle
JMP DrawItemGray JMP DrawItemGray
+ : DEC #2 : BNE + + : DEC #2 : BNE +
LDX #FileSelectItems_empty_bottle LDX.w #FileSelectItems_empty_bottle
JMP DrawItem JMP DrawItem
+ : DEC : BNE + + : DEC : BNE +
LDX #FileSelectItems_red_potion LDX.w #FileSelectItems_red_potion
JMP DrawItem JMP DrawItem
+ : DEC : BNE + + : DEC : BNE +
LDX #FileSelectItems_green_potion LDX.w #FileSelectItems_green_potion
JMP DrawItem JMP DrawItem
+ : DEC : BNE + + : DEC : BNE +
LDX #FileSelectItems_blue_potion LDX.w #FileSelectItems_blue_potion
JMP DrawItem JMP DrawItem
+ : DEC : BNE + + : DEC : BNE +
LDX #FileSelectItems_fairy_bottle LDX.w #FileSelectItems_fairy_bottle
JMP DrawItem JMP DrawItem
+ : DEC : BNE + + : DEC : BNE +
LDX #FileSelectItems_bee_bottle LDX.w #FileSelectItems_bee_bottle
JMP DrawItem JMP DrawItem
+ +
LDX #FileSelectItems_good_bee_bottle LDX.w #FileSelectItems_good_bee_bottle
JMP DrawItem JMP DrawItem
DrawPlayerFile: DrawPlayerFile:
LDA $1A : AND.w #$0001 : BNE .normal LDA.b FrameCounter : AND.w #$0001 : BNE .normal
JSR DrawPlayerFileShared JSR DrawPlayerFileShared
INC $0710 ; Suppress animated tile updates for this frame INC.w SkipOAM ; Suppress animated tile updates for this frame
; re-enable Stripe Image format upload on this frame ; re-enable Stripe Image format upload on this frame
; Value loaded must match what gets set by AltBufferTable ; Value loaded must match what gets set by AltBufferTable
LDA.w #$0161 : STA $1002 LDA.w #$0161 : STA.w GFXStripes+2
BRA .done BRA .done
.normal .normal
STZ $0710 ; ensure core animated tile updates are not suppressed STZ.w SkipOAM ; ensure core animated tile updates are not suppressed
LDA #$FFFF : STA.w $1002 ; Suppress Stripe Image format upload on this frame LDA.w #$FFFF : STA.w GFXStripes+2 ; Suppress Stripe Image format upload on this frame
.done .done
LDA.w #$0004 : STA $02 ; thing we wrote over LDA.w #$0004 : STA.b Scrap02 ; thing we wrote over
RTL RTL
@@ -132,29 +131,29 @@ DrawPlayerFileShared:
LDA.b #FileSelectItems>>16 : PHA : PLB LDA.b #FileSelectItems>>16 : PHA : PLB
REP #$20 ; restore 16 bit accumulator REP #$20 ; restore 16 bit accumulator
LDA ExtendedFileNameSRAM+$08 : ORA.w #!FS_COLOR_BW LDA.l ExtendedFileNameSRAM+$08 : ORA.w #!FS_COLOR_BW
%fs_draw8x16(6,5) %fs_draw8x16(6,5)
LDA ExtendedFileNameSRAM+$0A : ORA.w #!FS_COLOR_BW LDA.l ExtendedFileNameSRAM+$0A : ORA.w #!FS_COLOR_BW
%fs_draw8x16(6,6) %fs_draw8x16(6,6)
LDA ExtendedFileNameSRAM+$0C : ORA.w #!FS_COLOR_BW LDA.l ExtendedFileNameSRAM+$0C : ORA.w #!FS_COLOR_BW
%fs_draw8x16(6,7) %fs_draw8x16(6,7)
LDA ExtendedFileNameSRAM+$0E : ORA.w #!FS_COLOR_BW LDA.l ExtendedFileNameSRAM+$0E : ORA.w #!FS_COLOR_BW
%fs_draw8x16(6,8) %fs_draw8x16(6,8)
LDA ExtendedFileNameSRAM+$10 : ORA.w #!FS_COLOR_BW LDA.l ExtendedFileNameSRAM+$10 : ORA.w #!FS_COLOR_BW
%fs_draw8x16(9,5) %fs_draw8x16(9,5)
LDA ExtendedFileNameSRAM+$12 : ORA.w #!FS_COLOR_BW LDA.l ExtendedFileNameSRAM+$12 : ORA.w #!FS_COLOR_BW
%fs_draw8x16(9,6) %fs_draw8x16(9,6)
LDA ExtendedFileNameSRAM+$14 : ORA.w #!FS_COLOR_BW LDA.l ExtendedFileNameSRAM+$14 : ORA.w #!FS_COLOR_BW
%fs_draw8x16(9,7) %fs_draw8x16(9,7)
LDA ExtendedFileNameSRAM+$16 : ORA.w #!FS_COLOR_BW LDA.l ExtendedFileNameSRAM+$16 : ORA.w #!FS_COLOR_BW
%fs_draw8x16(9,8) %fs_draw8x16(9,8)
JSR FileSelectDrawHudBar JSR FileSelectDrawHudBar
; Bow ; Bow
LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ + LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ +
LDA EquipmentSRAM+$00 : AND.w #$00FF : BEQ ++ LDA.l EquipmentSRAM+$00 : AND.w #$00FF : BEQ ++
%fs_drawItem(3,12,FileSelectItems_silver_bow) %fs_drawItem(3,12,FileSelectItems_silver_bow)
BRA .bow_end BRA .bow_end
++ ++
@@ -327,10 +326,10 @@ DrawPlayerFileShared:
%fs_drawItem(9,26,FileSelectItems_heart_piece_3_of_4) %fs_drawItem(9,26,FileSelectItems_heart_piece_3_of_4)
++ ++
LDA EquipmentSRAM+$0108 : AND.w #$00FF LDA.l EquipmentSRAM+$0108 : AND.w #$00FF
JSL.l HexToDec JSL.l HexToDec
LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(11,26) LDA.l HexToDecDigit4 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(11,26)
LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(11,27) LDA.l HexToDecDigit5 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(11,27)
; Boots ; Boots
%fs_drawItemBasic(EquipmentSRAM+$15,3,28,FileSelectItems_boots) %fs_drawItemBasic(EquipmentSRAM+$15,3,28,FileSelectItems_boots)
@@ -353,21 +352,21 @@ DrawPlayerFileShared:
%fs_drawItemBasic(EquipmentSRAM+$17,9,28,FileSelectItems_pearl) %fs_drawItemBasic(EquipmentSRAM+$17,9,28,FileSelectItems_pearl)
; Pendants ; Pendants
LDA EquipmentSRAM+$34 : AND.w #$0004 : BEQ + LDA.l EquipmentSRAM+$34 : AND.w #$0004 : BEQ +
%fs_drawItem(12,12,FileSelectItems_green_pendant) %fs_drawItem(12,12,FileSelectItems_green_pendant)
BRA ++ BRA ++
+ +
%fs_drawItem(12,12,FileSelectItems_no_pendant) %fs_drawItem(12,12,FileSelectItems_no_pendant)
++ ++
LDA EquipmentSRAM+$34 : AND.w #$0002 : BEQ + LDA.l EquipmentSRAM+$34 : AND.w #$0002 : BEQ +
%fs_drawItem(12,14,FileSelectItems_blue_pendant) %fs_drawItem(12,14,FileSelectItems_blue_pendant)
BRA ++ BRA ++
+ +
%fs_drawItem(12,14,FileSelectItems_no_pendant) %fs_drawItem(12,14,FileSelectItems_no_pendant)
++ ++
LDA EquipmentSRAM+$34 : AND.w #$0001 : BEQ + LDA.l EquipmentSRAM+$34 : AND.w #$0001 : BEQ +
%fs_drawItem(12,16,FileSelectItems_red_pendant) %fs_drawItem(12,16,FileSelectItems_red_pendant)
BRA ++ BRA ++
+ +
@@ -375,49 +374,49 @@ DrawPlayerFileShared:
++ ++
; Crystals ; Crystals
LDA EquipmentSRAM+$3A : AND.w #$0002 : BEQ + LDA.l EquipmentSRAM+$3A : AND.w #$0002 : BEQ +
LDA.w #$0297|!FS_COLOR_BLUE LDA.w #$0297|!FS_COLOR_BLUE
BRA ++ BRA ++
+ +
LDA.w #$0287|!FS_COLOR_GRAY LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(13,18) ++ : %fs_draw16x8(13,18)
LDA EquipmentSRAM+$3A : AND.w #$0010 : BEQ + LDA.l EquipmentSRAM+$3A : AND.w #$0010 : BEQ +
LDA.w #$0297|!FS_COLOR_BLUE LDA.w #$0297|!FS_COLOR_BLUE
BRA ++ BRA ++
+ +
LDA.w #$0287|!FS_COLOR_GRAY LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(12,19) ++ : %fs_draw16x8(12,19)
LDA EquipmentSRAM+$3A : AND.w #$0040 : BEQ + LDA.l EquipmentSRAM+$3A : AND.w #$0040 : BEQ +
LDA.w #$0297|!FS_COLOR_BLUE LDA.w #$0297|!FS_COLOR_BLUE
BRA ++ BRA ++
+ +
LDA.w #$0287|!FS_COLOR_GRAY LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(13,20) ++ : %fs_draw16x8(13,20)
LDA EquipmentSRAM+$3A : AND.w #$0020 : BEQ + LDA.l EquipmentSRAM+$3A : AND.w #$0020 : BEQ +
LDA.w #$0297|!FS_COLOR_BLUE LDA.w #$0297|!FS_COLOR_BLUE
BRA ++ BRA ++
+ +
LDA.w #$0287|!FS_COLOR_GRAY LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(12,21) ++ : %fs_draw16x8(12,21)
LDA EquipmentSRAM+$3A : AND.w #$0004 : BEQ + LDA.l EquipmentSRAM+$3A : AND.w #$0004 : BEQ +
LDA.w #$0297|!FS_COLOR_RED LDA.w #$0297|!FS_COLOR_RED
BRA ++ BRA ++
+ +
LDA.w #$0287|!FS_COLOR_GRAY LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(13,22) ++ : %fs_draw16x8(13,22)
LDA EquipmentSRAM+$3A : AND.w #$0001 : BEQ + LDA.l EquipmentSRAM+$3A : AND.w #$0001 : BEQ +
LDA.w #$0297|!FS_COLOR_RED LDA.w #$0297|!FS_COLOR_RED
BRA ++ BRA ++
+ +
LDA.w #$0287|!FS_COLOR_GRAY LDA.w #$0287|!FS_COLOR_GRAY
++ : %fs_draw16x8(12,23) ++ : %fs_draw16x8(12,23)
LDA EquipmentSRAM+$3A : AND.w #$0008 : BEQ + LDA.l EquipmentSRAM+$3A : AND.w #$0008 : BEQ +
LDA.w #$0297|!FS_COLOR_BLUE LDA.w #$0297|!FS_COLOR_BLUE
BRA ++ BRA ++
+ +
@@ -558,104 +557,103 @@ FileSelectItems:
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FileSelectDrawHudBar: FileSelectDrawHudBar:
LDA #$029B|!FS_COLOR_GREEN : %fs_draw16x8(0,10) LDA.w #$029B|!FS_COLOR_GREEN : %fs_draw16x8(0,10)
LDA EquipmentSRAM+$22 LDA.l DisplayRupeesSRAM
JSL.l HexToDec JSL.l HexToDec
LDA $7F5004 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,9) LDA.l HexToDecDigit2 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,9)
LDA $7F5005 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,10) LDA.l HexToDecDigit3 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,10)
LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,11) LDA.l HexToDecDigit4 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,11)
LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,12) LDA.l HexToDecDigit5 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,12)
LDA #$028B|!FS_COLOR_BLUE : %fs_draw16x8(0,14) LDA.w #$028B|!FS_COLOR_BLUE : %fs_draw16x8(0,14)
LDA EquipmentSRAM+$03 : AND.w #$00FF LDA.l BombsEquipmentSRAM : AND.w #$00FF
JSL.l HexToDec JSL.l HexToDec
LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,14) LDA.l HexToDecDigit4 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,14)
LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,15) LDA.l HexToDecDigit5 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,15)
LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ + LDA.l BowTrackingSRAM : AND.w #$0040 : BEQ +
LDA #$0299|!FS_COLOR_RED : %fs_draw16x8(0,17) LDA.w #$0299|!FS_COLOR_RED : %fs_draw16x8(0,17)
BRA ++ BRA ++
+ +
LDA #$0289|!FS_COLOR_BROWN : %fs_draw16x8(0,17) LDA.w #$0289|!FS_COLOR_BROWN : %fs_draw16x8(0,17)
++ ++
LDA EquipmentSRAM+$37 : AND.w #$00FF LDA.l CurrentArrowsSRAM : AND.w #$00FF
JSL.l HexToDec JSL.l HexToDec
LDA $7F5006 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,17) LDA.l HexToDecDigit4 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,17)
LDA $7F5007 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,18) LDA.l HexToDecDigit5 : AND.w #$00FF : !ADD.w #$210+!FS_COLOR_BW : %fs_draw8x8(1,18)
RTS RTS
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
AltBufferTable: AltBufferTable:
LDA.b #$02 : STA $210c ; Have Screen 3 use same tile area as screens 1 LDA.b #$02 : STA.w BG34NBA ; Have Screen 3 use same tile area as screens 1
.noScreen3Change .noScreen3Change
REP #$20 REP #$20
LDX.w #$0400 ; 14 rows with 64 bytes (30 tiles * 2 + 4 byte header) LDX.w #$0400 ; 14 rows with 64 bytes (30 tiles * 2 + 4 byte header)
;fill with the blank character ;fill with the blank character
LDA.w #$0188 LDA.w #$0188
- -
STA $1000, X STA.w GFXStripes, X
DEX : DEX : BNE - DEX : DEX : BNE -
; set vram offsets ; set vram offsets
LDA.w #$0161 : STA $1002 ;file 1 top row LDA.w #$0161 : STA.w GFXStripes+$02 ;file 1 top row
LDA.w #$2161 : STA $1042 ;file 1 bottom row LDA.w #$2161 : STA.w GFXStripes+$42 ;file 1 bottom row
LDA.w #$4161 : STA $1082 ;gap row top LDA.w #$4161 : STA.w GFXStripes+$82 ;gap row top
LDA.w #$6161 : STA $10C2 ;gap row bottom LDA.w #$6161 : STA.w GFXStripes+$C2 ;gap row bottom
LDA.w #$8161 : STA $1102 ;file 2 top row LDA.w #$8161 : STA.w GFXStripes+$0102 ;file 2 top row
LDA.w #$A161 : STA $1142 ;file 2 bottom row LDA.w #$A161 : STA.w GFXStripes+$0142 ;file 2 bottom row
LDA.w #$C161 : STA $1182 ;gap row top LDA.w #$C161 : STA.w GFXStripes+$0182 ;gap row top
LDA.w #$E161 : STA $11c2 ;gap row bottom LDA.w #$E161 : STA.w GFXStripes+$01C2 ;gap row bottom
LDA.w #$0162 : STA $1202 ;file 3 top row LDA.w #$0162 : STA.w GFXStripes+$0202 ;file 3 top row
LDA.w #$2162 : STA $1242 ;file 3 bottom row LDA.w #$2162 : STA.w GFXStripes+$0242 ;file 3 bottom row
LDA.w #$4162 : STA $1282 ;extra gap row top LDA.w #$4162 : STA.w GFXStripes+$0282 ;extra gap row top
LDA.w #$6162 : STA $12c2 ;extra gap row bottom LDA.w #$6162 : STA.w GFXStripes+$02C2 ;extra gap row bottom
LDA.w #$8162 : STA $1302 ;extra gap row top LDA.w #$8162 : STA.w GFXStripes+$0302 ;extra gap row top
LDA.w #$A162 : STA $1342 ;extra gap row bottom LDA.w #$A162 : STA.w GFXStripes+$0342 ;extra gap row bottom
LDA.w #$C162 : STA $1382 ;extra gap row top LDA.w #$C162 : STA.w GFXStripes+$0382 ;extra gap row top
LDA.w #$E162 : STA $13C2 ;extra gap row bottom LDA.w #$E162 : STA.w GFXStripes+$03C2 ;extra gap row bottom
; set lengths ; set lengths
LDA.w #$3B00 LDA.w #$3B00
STA $1004 ;file 1 top row STA.w GFXStripes+$04 ;file 1 top row
STA $1044 ;file 1 bottom row STA.w GFXStripes+$44 ;file 1 bottom row
STA $1084 ;gap row top STA.w GFXStripes+$84 ;gap row top
STA $10C4 ;gap row bottom STA.w GFXStripes+$C4 ;gap row bottom
STA $1104 ;file 2 top row STA.w GFXStripes+$0104 ;file 2 top row
STA $1144 ;file 2 bottom row STA.w GFXStripes+$0144 ;file 2 bottom row
STA $1184 ;gap row top STA.w GFXStripes+$0184 ;gap row top
STA $11C4 ;gap row bottom STA.w GFXStripes+$01C4 ;gap row bottom
STA $1204 ;file 3 top row STA.w GFXStripes+$0204 ;file 3 top row
STA $1244 ;file 3 bottom row STA.w GFXStripes+$0244 ;file 3 bottom row
STA $1284 ;extra gap row top STA.w GFXStripes+$0284 ;extra gap row top
STA $12C4 ;extra gap row bottom STA.w GFXStripes+$02C4 ;extra gap row bottom
STA $1304 ;extra gap row top STA.w GFXStripes+$0304 ;extra gap row top
STA $1344 ;extra gap row bottom STA.w GFXStripes+$0344 ;extra gap row bottom
STA $1384 ;extra gap row top STA.w GFXStripes+$0384 ;extra gap row top
STA $13C4 ;extra gap row bottom STA.w GFXStripes+$03C4 ;extra gap row bottom
; Set last packet marker ; Set last packet marker
LDA.w #$00FF : STA $1402 LDA.w #$00FF : STA.w GFXStripes+$0402
; Draw Unlock option if applicable ; Draw Unlock option if applicable
LDA $10 : AND.w #$00FF : CMP.w #$0001 : BNE + LDA.b GameMode : AND.w #$00FF : CMP.w #$0001 : BNE +
LDA.l IsEncrypted : AND.w #$00FF : CMP.w #$0002 : BNE + LDA.l IsEncrypted : AND.w #$00FF : CMP.w #$0002 : BNE +
PHP : SEP #$30 : PHX : PHY : JSL ValidatePassword : PLY : PLX : PLP PHP : SEP #$30 : PHX : PHY : JSL ValidatePassword : PLY : PLX : PLP
AND.w #$00FF : BNE + AND.w #$00FF : BNE +
LDA.w #!FSTILE_U_TOP : %fs_draw8x16(14,5) LDA.w #!FSTILE_U_TOP : %fs_draw8x16(14,5)
LDA.w #!FSTILE_N_TOP : %fs_draw8x16(14,6) LDA.w #!FSTILE_N_TOP : %fs_draw8x16(14,6)
LDA.w #!FSTILE_L_TOP : %fs_draw8x16(14,7) LDA.w #!FSTILE_L_TOP : %fs_draw8x16(14,7)
LDA.w #!FSTILE_O_TOP : %fs_draw8x16(14,8) LDA.w #!FSTILE_O_TOP : %fs_draw8x16(14,8)
LDA.w #!FSTILE_C_TOP : %fs_draw8x16(14,9) LDA.w #!FSTILE_C_TOP : %fs_draw8x16(14,9)
LDA.w #!FSTILE_K_TOP : %fs_draw8x16(14,10) LDA.w #!FSTILE_K_TOP : %fs_draw8x16(14,10)
+ +
SEP #$20
SEP #$20
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -663,36 +661,36 @@ AltBufferTable_credits:
JSL AltBufferTable_noScreen3Change JSL AltBufferTable_noScreen3Change
REP #$20 REP #$20
LDA.w #$6168 : STA $1002 ;file 1 top row LDA.w #$6168 : STA.w GFXStripes+$02 ;file 1 top row
LDA.w #$8168 : STA $1042 ;file 1 bottom row LDA.w #$8168 : STA.w GFXStripes+$42 ;file 1 bottom row
LDA.w #$A168 : STA $1082 ;gap row top LDA.w #$A168 : STA.w GFXStripes+$82 ;gap row top
LDA.w #$C168 : STA $10C2 ;gap row bottom LDA.w #$C168 : STA.w GFXStripes+$C2 ;gap row bottom
LDA.w #$E168 : STA $1102 ;file 2 top row LDA.w #$E168 : STA.w GFXStripes+$0102 ;file 2 top row
LDA.w #$0169 : STA $1142 ;file 2 bottom row LDA.w #$0169 : STA.w GFXStripes+$0142 ;file 2 bottom row
LDA.w #$2169 : STA $1182 ;gap row top LDA.w #$2169 : STA.w GFXStripes+$0182 ;gap row top
LDA.w #$4169 : STA $11c2 ;gap row bottom LDA.w #$4169 : STA.w GFXStripes+$01c2 ;gap row bottom
LDA.w #$6169 : STA $1202 ;file 3 top row LDA.w #$6169 : STA.w GFXStripes+$0202 ;file 3 top row
LDA.w #$8169 : STA $1242 ;file 3 bottom row LDA.w #$8169 : STA.w GFXStripes+$0242 ;file 3 bottom row
LDA.w #$A169 : STA $1282 ;extra gap row top LDA.w #$A169 : STA.w GFXStripes+$0282 ;extra gap row top
LDA.w #$C169 : STA $12c2 ;extra gap row bottom LDA.w #$C169 : STA.w GFXStripes+$02C2 ;extra gap row bottom
LDA.w #$E169 : STA $1302 ;extra gap row top LDA.w #$E169 : STA.w GFXStripes+$0302 ;extra gap row top
LDA.w #$016A : STA $1342 ;extra gap row bottom LDA.w #$016A : STA.w GFXStripes+$0342 ;extra gap row bottom
LDA.w #$216A : STA $1382 ;extra gap row top LDA.w #$216A : STA.w GFXStripes+$0382 ;extra gap row top
LDA.w #$416A : STA $13C2 ;extra gap row bottom LDA.w #$416A : STA.w GFXStripes+$03C2 ;extra gap row bottom
SEP #$20 SEP #$20
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
macro LayoutPriority(address) macro LayoutPriority(address)
LDX.w #$003C LDX.w #$003C
- : LDA.w <address>, X : ORA #$2000 : STA.w <address>, X - : LDA.w <address>, X : ORA.w #$2000 : STA.w <address>, X
DEX : DEX : BNE - DEX : DEX : BNE -
endmacro endmacro
@@ -718,47 +716,47 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LoadFullItemTiles: LoadFullItemTiles:
PHA : PHX PHA : PHX
LDA $4300 : PHA ; preserve DMA parameters LDA.w DMAP0 : PHA ; preserve DMA parameters
LDA $4301 : PHA ; preserve DMA parameters LDA.w BBAD0 : PHA ; preserve DMA parameters
LDA $4302 : PHA ; preserve DMA parameters LDA.w A1T0L : PHA ; preserve DMA parameters
LDA $4303 : PHA ; preserve DMA parameters LDA.w A1T0H : PHA ; preserve DMA parameters
LDA $4304 : PHA ; preserve DMA parameters LDA.w A1B0 : PHA ; preserve DMA parameters
LDA $4305 : PHA ; preserve DMA parameters LDA.w DAS0L : PHA ; preserve DMA parameters
LDA $4306 : PHA ; preserve DMA parameters LDA.w DAS0H : PHA ; preserve DMA parameters
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LDA.b #$80 : STA $2115 ; write read increment on $2119 LDA.b #$80 : STA.w VMAIN ; write read increment on $2119
LDA.b #$01 : STA $4300 ; set DMA transfer direction A -> B, bus A auto increment, double-byte mode LDA.b #$01 : STA.w DMAP0 ; set DMA transfer direction A -> B, bus A auto increment, double-byte mode
LDA.b #$18 : STA $4301 ; set bus B destination to VRAM register LDA.b #$18 : STA.w BBAD0 ; set bus B destination to VRAM register
LDA.b #$00 : STA $2116 ; write VRAM destination address LDA.b #$00 : STA.w VMADDL ; write VRAM destination address
LDA.b #$30 : STA $2117 ; write VRAM destination address LDA.b #$30 : STA.w VMADDH ; write VRAM destination address
LDA.b #$31 : STA $4304 ; set bus A source bank LDA.b #$31 : STA.w A1B0 ; set bus A source bank
LDA.b #FileSelectNewGraphics : STA $4302 ; set bus A source address to ROM LDA.b #FileSelectNewGraphics : STA.w A1T0L ; set bus A source address to ROM
LDA.b #FileSelectNewGraphics>>8 : STA $4303 ; set bus A source address to ROM LDA.b #FileSelectNewGraphics>>8 : STA.w A1T0H ; set bus A source address to ROM
LDA $2100 : PHA : LDA.b #$80 : STA $2100 ; save screen state & turn screen off LDA.w INIDISP : PHA : LDA.b #$80 : STA.w INIDISP ; save screen state & turn screen off
STZ $4305 : LDA.b #$10 : STA $4306 ; set transfer size to 0x1000 STZ.w DAS0L : LDA.b #$10 : STA.w DAS0H ; set transfer size to 0x1000
LDA #$01 : STA $420B ; begin DMA transfer LDA.b #$01 : STA.w MDMAEN ; begin DMA transfer
PLA : STA $2100 ; put screen back however it was before PLA : STA.w INIDISP ; put screen back however it was before
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
PLA : STA $4306 ; restore DMA parameters PLA : STA.w DAS0H ; restore DMA parameters
PLA : STA $4305 ; restore DMA parameters PLA : STA.w DAS0L ; restore DMA parameters
PLA : STA $4304 ; restore DMA parameters PLA : STA.w A1B0 ; restore DMA parameters
PLA : STA $4303 ; restore DMA parameters PLA : STA.w A1T0H ; restore DMA parameters
PLA : STA $4302 ; restore DMA parameters PLA : STA.w A1T0L ; restore DMA parameters
PLA : STA $4301 ; restore DMA parameters PLA : STA.w BBAD0 ; restore DMA parameters
PLA : STA $4300 ; restore DMA parameters PLA : STA.w DMAP0 ; restore DMA parameters
PLX : PLA PLX : PLA
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
SetFileSelectPalette: SetFileSelectPalette:
LDA $10 : CMP.b #$04 : BNE + LDA.b GameMode : CMP.b #$04 : BNE +
; load the vanilla file select screen BG3 palette for naming screen ; load the vanilla file select screen BG3 palette for naming screen
LDA.b #$01 : STA $0AB2 LDA.b #$01 : STA.w $0AB2
JSL.l Palette_Hud JSL.l Palette_Hud
BRA .done BRA .done
+ +
@@ -774,12 +772,12 @@ LoadCustomHudPalette:
LDX.b #$40 LDX.b #$40
- -
LDA.l GFX_HUD_Palette, X LDA.l GFX_HUD_Palette, X
STA.l $7EC500, X STA.l PaletteBuffer, X
DEX : DEX DEX : DEX
BPL - BPL -
SEP #$20 SEP #$20
INC $15 ; ensure CGRAM gets updated INC.b NMICGRAM ; ensure CGRAM gets updated
PLX : PLA PLX : PLA
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -787,16 +785,16 @@ DrawPlayerFile_credits:
; see $6563C for drawing first file name and hearts ; see $6563C for drawing first file name and hearts
REP #$20 ; set 16 bit accumulator REP #$20 ; set 16 bit accumulator
LDA EquipmentSRAM+$99 : ORA.w #!FS_COLOR_BW LDA.l EquipmentSRAM+$99 : ORA.w #!FS_COLOR_BW
%fs_draw8x16(3,5) %fs_draw8x16(3,5)
LDA EquipmentSRAM+$9B : ORA.w #!FS_COLOR_BW LDA.l EquipmentSRAM+$9B : ORA.w #!FS_COLOR_BW
%fs_draw8x16(3,6) %fs_draw8x16(3,6)
LDA EquipmentSRAM+$9D : ORA.w #!FS_COLOR_BW LDA.l EquipmentSRAM+$9D : ORA.w #!FS_COLOR_BW
%fs_draw8x16(3,7) %fs_draw8x16(3,7)
LDA EquipmentSRAM+$9F : ORA.w #!FS_COLOR_BW LDA.l EquipmentSRAM+$9F : ORA.w #!FS_COLOR_BW
%fs_draw8x16(3,8) %fs_draw8x16(3,8)
LDA EquipmentSRAM+$2C : AND.w #$00FF : LSR #3 : STA $02 LDA.l EquipmentSRAM+$2C : AND.w #$00FF : LSR #3 : STA.b Scrap02
%fs_LDY_screenpos(0,20) %fs_LDY_screenpos(0,20)
LDA.w #$028F|!FS_COLOR_RED LDA.w #$028F|!FS_COLOR_RED
LDX.w #$000A LDX.w #$000A
@@ -810,60 +808,61 @@ DrawPlayerFile_credits:
TYA : !ADD.w #$40-$14 : TAY TYA : !ADD.w #$40-$14 : TAY
PLA PLA
+ +
DEC $02 : BNE .nextHeart DEC.b Scrap02 : BNE .nextHeart
JSR DrawPlayerFileShared JSR DrawPlayerFileShared
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FSCursorUp: FSCursorUp:
LDA $C8 : BNE + LDA.b FileSelectPosition : BNE +
LDA #$04 ; up from file becomes delete LDA.b #$04 ; up from file becomes delete
BRA .done BRA .done
+ : CMP #$03 : BNE + + : CMP.b #$03 : BNE +
LDA #$00 ; up from unlock is the file LDA.b #$00 ; up from unlock is the file
BRA .done BRA .done
+ +
LDA.l IsEncrypted : CMP.b #$02 : BNE + LDA.l IsEncrypted : CMP.b #$02 : BNE +
LDA.l !ValidKeyLoaded : BNE + LDA.l ValidKeyLoaded : BNE +
LDA #$03 ; up from delete is unlock for password protected seeds LDA.b #$03 ; up from delete is unlock for password protected seeds
BRA .done BRA .done
+ +
LDA #$00 ;otherwise up from delete is file LDA.b #$00 ;otherwise up from delete is file
.done .done
STA $C8 STA.b FileSelectPosition
RTL RTL
FSCursorDown: FSCursorDown:
LDA $C8 : BNE + LDA.b FileSelectPosition : BNE +
LDA.l IsEncrypted : CMP.b #$02 : BNE ++ LDA.l IsEncrypted : CMP.b #$02 : BNE ++
LDA.l !ValidKeyLoaded : BNE ++ LDA.l ValidKeyLoaded : BNE ++
LDA #$03 ; down from file is unlock for password protected seeds LDA.b #$03 ; down from file is unlock for password protected seeds
BRA .done BRA .done
++ ++
LDA #$04 ;otherwise down from file is delete LDA.b #$04 ;otherwise down from file is delete
BRA .done BRA .done
+ : CMP #$03 : BNE + + : CMP.b #$03 : BNE +
LDA #$04 ; down from unlock is delete LDA.b #$04 ; down from unlock is delete
BRA .done BRA .done
+ +
LDA #$00 ; down from delete is file LDA.b #$00 ; down from delete is file
.done .done
STA $C8 STA.b FileSelectPosition
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FSSelectFile: FSSelectFile:
LDA.l IsEncrypted : CMP.b #$02 : BNE .normal LDA.l IsEncrypted : CMP.b #$02 : BNE .normal
STZ $012E ; temporarily cancel file screen selection sound STZ.w SFX2 ; temporarily cancel file screen selection sound
PHX : PHY PHX : PHY
JSL ValidatePassword : BEQ .must_unlock JSL ValidatePassword : BEQ .must_unlock
PLY : PLX PLY : PLX
LDA.b #$2C : STA $012E ;file screen selection sound LDA.b #$2C : STA.w SFX2 ;file screen selection sound
.normal .normal
LDA.b #$F1 : STA $012C LDA.b #$F1 : STA.w MusicControlRequest
JML FSSelectFile_continue JML FSSelectFile_continue
.must_unlock .must_unlock
PLY : PLX PLY : PLX
LDA #$03 : STA $C8 ;set cursor to unlock LDA.b #$03 : STA.b FileSelectPosition ;set cursor to unlock
LDA.b #$3C : STA $012E ; play error sound LDA.b #$3C : STA.w SFX2 ; play error sound
JML FSSelectFile_return JML FSSelectFile_return
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
MaybeForceFileName: MaybeForceFileName:
@@ -873,8 +872,8 @@ MaybeForceFileName:
- -
INX : INX INX : INX
LDA.l StaticFileName, X : STA.l ExtendedFileNameSRAM, X LDA.l StaticFileName, X : STA.l ExtendedFileNameSRAM, X
CPX #$16 : BEQ .done CPX.b #$16 : BEQ .done
CPX #$08 : BCS - CPX.b #$08 : BCS -
STA.l FileNameVanillaSRAM, X STA.l FileNameVanillaSRAM, X
BRA - BRA -
.done .done

View File

@@ -1,8 +0,0 @@
NewFireBarDamage:
{
LDA $00EE : CMP $0F20, X : BNE .NotSameLayer
JSL Sprite_AttemptDamageToPlayerPlusRecoilLong
RTL
.NotSameLayer
RTL
}

View File

@@ -1,78 +1,14 @@
;================================================================================ ;================================================================================
; Fake Flippers Softlock Fix ; Fake Flippers Softlock Fix
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FlipperKill:
PHP
LDA $5D : CMP #$04 : BNE .done ; skip if we're not swimming
LDA FlippersEquipment : BNE .done ; skip if we have the flippers
LDA $7F5001 : BEQ .done ; skip if we're not marked in danger for softlock
LDA $8A : CMP $7F5098 : BEQ .done ; skip if we're on the same screen we entered the water on
;JSL.l KillFairies ; take away fairies
LDA IgnoreFaeries : ORA.b #$04 : STA IgnoreFaeries
LDA.b #$00 : STA CurrentHealth ; kill link
LDA.b #$00 : STA $7F5001 ; mark fake flipper softlock as impossible
.done
PLP
LDA CurrentHealth ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
IgnoreFairyCheck:
LDX.b #$00 ; thing we wrote over
LDA IgnoreFaeries : BIT.b #$04 : BEQ .normal
AND.b #$FB : STA IgnoreFaeries ; clear ignore fairy flag ; Written over and used by OnEnterWater hook.
LDA.b #$F0 ; set check to invalid entry UnequipCapeQuiet:
LDA.b #$20 : STA.w PoofTimer
STZ.w NoDamage
STZ.b CapeOn
STZ.w LinkZap
RTL RTL
.normal
LDA.b #$06 ; set check to fairy
RTL
;--------------------------------------------------------------------------------
;KillFairies:
; LDA BottleContentsOne : CMP #$06 : BNE +
; LDA #$02 : STA BottleContentsOne
; + LDA BottleContentsTwo : CMP #$06 : BNE +
; LDA #$02 : STA BottleContentsTwo
; + LDA BottleContentsThree : CMP #$06 : BNE +
; LDA #$02 : STA BottleContentsThree
; + LDA BottleContentsFour : CMP #$06 : BNE +
; LDA #$02 : STA BottleContentsFour
; +
;RTL
;--------------------------------------------------------------------------------
FlipperReset:
JSL $0998E8 ; AddTransitionSplash
LDA #$00 : STA $7F5001 ; mark fake flipper softlock as impossible
.done
RTL
;--------------------------------------------------------------------------------
FlipperFlag:
LDA $5D : CMP #$04 : BNE .done ; skip if we're not swimming
LDA FlippersEquipment : BNE .safe ; skip if we have the flippers
LDA #$01 : STA $7F5001 ; mark fake flipper softlock as possible
BRA .done
.safe
LDA #$00 : STA $7F5001 ; mark fake flipper softlock as impossible
.done
RTL
;--------------------------------------------------------------------------------
RegisterWaterEntryScreen:
PHA
LDA $8A : STA $7F5098 ; store ow index
PLA
RTL
;--------------------------------------------------------------------------------
MysteryWaterFunction: ; *$3AE54 ALTERNATE ENTRY POINT
LDA.b #$20 : STA $02E2
STZ $037B
STZ $55
STZ $0360
RTL
;--------------------------------------------------------------------------------
;===================================================================================================
; More elegant solution
;===================================================================================================
protectff: protectff:
LDA.l AllowAccidentalMajorGlitch LDA.l AllowAccidentalMajorGlitch
@@ -83,16 +19,16 @@ protectff:
.yes_protect .yes_protect
REP #$30 REP #$30
LDA.b $20 LDA.b LinkPosY
AND.w #$1E00 AND.w #$1E00
ASL ASL
ASL ASL
ASL ASL
STA.b $06 STA.b Scrap06
LDA.b $22 LDA.b LinkPosX
AND.w #$1E00 AND.w #$1E00
ORA.b $06 ORA.b Scrap06
XBA XBA
LSR LSR
@@ -103,7 +39,7 @@ protectff:
; Remove dark world bit ; Remove dark world bit
; in game table that converts coordinates to actual screen ID ; in game table that converts coordinates to actual screen ID
; special case for other areas ; special case for other areas
LDA.b $8A LDA.b OverworldIndex
BMI .special_overworld BMI .special_overworld
AND.b #$3F AND.b #$3F
@@ -112,17 +48,17 @@ protectff:
.protect .protect
LDA.b #$15 LDA.b #$15
STA.b $5D STA.b LinkState
STZ.b $2E STZ.b LinkAnimationStep
STZ.b $67 STZ.b LinkWalkDirection
LDA.b #$02 LDA.b #$02
STA.b $2F STA.b LinkDirection
STZ.w $0112 STZ.w MedallionFlag
STZ.w $02E4 STZ.w CutsceneFlag
STZ.w $0FFC STZ.w NoMenu
++ RTL ++ RTL

View File

@@ -5,21 +5,21 @@ FloodGateAndMasterSwordFollowerReset:
JSL.l MasterSwordFollowerClear JSL.l MasterSwordFollowerClear
FloodGateReset: FloodGateReset:
LDA.l PersistentFloodgate : BNE + LDA.l PersistentFloodgate : BNE +
LDA OverworldEventDataWRAM+$3B : AND.b #$DF : STA OverworldEventDataWRAM+$3B ; reset water outside floodgate LDA.l OverworldEventDataWRAM+$3B : AND.b #$DF : STA.l OverworldEventDataWRAM+$3B ; reset water outside floodgate
LDA OverworldEventDataWRAM+$7B : AND.b #$DF : STA OverworldEventDataWRAM+$7B ; reset water outside swamp palace LDA.l OverworldEventDataWRAM+$7B : AND.b #$DF : STA.l OverworldEventDataWRAM+$7B ; reset water outside swamp palace
LDA RoomDataWRAM[$010B].low : AND.b #$7F : STA RoomDataWRAM[$010B].low ; clear water inside floodgate LDA.l RoomDataWRAM[$010B].low : AND.b #$7F : STA.l RoomDataWRAM[$010B].low ; clear water inside floodgate
LDA RoomDataWRAM[$28].high : AND.b #$FE : STA RoomDataWRAM[$28].high ; clear water front room (room 40) LDA.l RoomDataWRAM[$28].high : AND.b #$FE : STA.l RoomDataWRAM[$28].high ; clear water front room (room 40)
+ +
FloodGateResetInner: FloodGateResetInner:
LDA.l Bugfix_SwampWaterLevel : BEQ +++ LDA.l Bugfix_SwampWaterLevel : BEQ +++
LDA RoomDataWRAM[$37].low : AND.b #$04 : BEQ + ; Check if key in room 55 has been collected. LDA.l RoomDataWRAM[$37].low : AND.b #$04 : BEQ + ; Check if key in room 55 has been collected.
LDA FlippersEquipment : AND.b #$01 : BNE ++ ; Check for flippers. This can otherwise softlock doors if flooded without flippers and no way to reset. LDA.l FlippersEquipment : AND.b #$01 : BNE ++ ; Check for flippers. This can otherwise softlock doors if flooded without flippers and no way to reset.
+ +
LDA RoomDataWRAM[$37].low : AND.b #$7F : STA RoomDataWRAM[$37].low ; clear water room 55 - outer room you shouldn't be able to softlock except in major glitches LDA.l RoomDataWRAM[$37].low : AND.b #$7F : STA.l RoomDataWRAM[$37].low ; clear water room 55 - outer room you shouldn't be able to softlock except in major glitches
++ ++
LDA RoomDataWRAM[$35].high : AND.b #$04 : BNE +++ ; Check if key in room 53 has been collected. LDA.l RoomDataWRAM[$35].high : AND.b #$04 : BNE +++ ; Check if key in room 53 has been collected.
; no need to check for flippers on the inner room, as you can't get to the west door no matter what, without flippers. ; no need to check for flippers on the inner room, as you can't get to the west door no matter what, without flippers.
LDA RoomDataWRAM[$35].low : AND.b #$7F : STA RoomDataWRAM[$35].low ; clear water room 53 - inner room with the easy key flood softlock LDA.l RoomDataWRAM[$35].low : AND.b #$7F : STA.l RoomDataWRAM[$35].low ; clear water room 53 - inner room with the easy key flood softlock
+++ +++
RTL RTL
;================================================================================ ;================================================================================

View File

@@ -2,38 +2,38 @@
; Randomize Flute Dig Item ; Randomize Flute Dig Item
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
SpawnHauntedGroveItem: SpawnHauntedGroveItem:
LDA $8A : CMP.b #$2A : BEQ + : RTL : + ; Skip if not the haunted grove LDA.b OverworldIndex : CMP.b #$2A : BEQ + : RTL : + ; Skip if not the haunted grove
LDA $1B : BEQ + : RTL : + ; Skip if indoors LDA.b IndoorsFlag : BEQ + : RTL : + ; Skip if indoors
%GetPossiblyEncryptedItem(HauntedGroveItem, HeartPieceOutdoorValues) %GetPossiblyEncryptedItem(HauntedGroveItem, HeartPieceOutdoorValues)
JSL.l PrepDynamicTile JSL.l PrepDynamicTile
LDA.b #$EB LDA.b #$EB
STA $7FFE00 STA.l MiniGameTime
JSL Sprite_SpawnDynamically JSL Sprite_SpawnDynamically
LDX.b #$00 LDX.b #$00
LDA $2F : CMP.b #$04 : BEQ + : INX : + LDA.b LinkDirection : CMP.b #$04 : BEQ + : INX : +
LDA.l .x_speeds, X : STA $0D50, Y LDA.l .x_speeds, X : STA.w SpriteVelocityX, Y
LDA.b #$00 : STA $0D40, Y LDA.b #$00 : STA.w SpriteVelocityY, Y
LDA.b #$18 : STA $0F80, Y LDA.b #$18 : STA.w SpriteVelocityZ, Y
LDA.b #$FF : STA $0B58, Y LDA.b #$FF : STA.w EnemyStunTimer, Y
LDA.b #$30 : STA $0F10, Y LDA.b #$30 : STA.w SpriteTimerE, Y
LDA $22 : !ADD.l .x_offsets, X LDA.b LinkPosX : !ADD.l .x_offsets, X
AND.b #$F0 : STA $0D10, Y AND.b #$F0 : STA.w SpritePosXLow, Y
LDA $23 : ADC.b #$00 : STA $0D30, Y LDA.b LinkPosX+1 : ADC.b #$00 : STA.w SpritePosXHigh, Y
LDA $20 : !ADD.b #$16 : AND.b #$F0 : STA $0D00, Y LDA.b LinkPosY : !ADD.b #$16 : AND.b #$F0 : STA.w SpritePosYLow, Y
LDA $21 : ADC.b #$00 : STA $0D20, Y LDA.b LinkPosY+1 : ADC.b #$00 : STA.w SpritePosYHigh, Y
LDA.b #$00 : STA $0F20, Y LDA.b #$00 : STA.w SpriteLayer, Y
TYX TYX
LDX $8A ; haunted grove (208D0A) LDX.b OverworldIndex ; haunted grove (208D0A)
LDA OverworldEventDataWRAM, X : AND.b #$40 : BNE + LDA.l OverworldEventDataWRAM, X : AND.b #$40 : BNE +
LDA.b #$1B : JSL Sound_SetSfx3PanLong LDA.b #$1B : JSL Sound_SetSfx3PanLong
+ +
RTL RTL
@@ -52,30 +52,30 @@ RTL
} }
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FluteBoy: FluteBoy:
LDA $10 : CMP.b #$1A : BEQ + LDA.b GameMode : CMP.b #$1A : BEQ +
LDA.b #$01 : STA $0FDD LDA.b #$01 : STA.w $0FDD
JML.l FluteBoy_Abort JML.l FluteBoy_Abort
+ +
LDA $0D80, X : CMP.b #$03 ; thing we wrote over LDA.w SpriteActivity, X : CMP.b #$03 ; thing we wrote over
JML.l FluteBoy_Continue JML.l FluteBoy_Continue
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FreeDuckCheck: FreeDuckCheck:
LDA.l InvertedMode : BEQ .done LDA.l InvertedMode : BEQ .done
LDA FluteEquipment : CMP.b #$03 : BEQ .done ; flute is already active LDA.l FluteEquipment : CMP.b #$03 : BEQ .done ; flute is already active
; check the area, is it #$18 = 30? ; check the area, is it #$18 = 30?
LDA $8A : CMP.b #$18 : BNE .done LDA.b OverworldIndex : CMP.b #$18 : BNE .done
REP #$20 REP #$20
; Y coordinate boundaries for setting it off. ; Y coordinate boundaries for setting it off.
LDA $20 LDA.b LinkPosY
CMP.w #$0760 : BCC .done CMP.w #$0760 : BCC .done
CMP.w #$07E0 : BCS .done CMP.w #$07E0 : BCS .done
; do if( (Ycoord >= 0x0760) && (Ycoord < 0x07e0 ; do if( (Ycoord >= 0x0760) && (Ycoord < 0x07e0
LDA $22 LDA.b LinkPosX
CMP.w #$01CF : BCC .done CMP.w #$01CF : BCC .done
CMP.w #$0230 : BCS .done CMP.w #$0230 : BCS .done
@@ -84,7 +84,7 @@ FreeDuckCheck:
SEP #$20 SEP #$20
; Apparently a special Overworld mode for doing this? ; Apparently a special Overworld mode for doing this?
LDA.b #$2D : STA $11 LDA.b #$2D : STA.b GameSubMode
; Trigger the sequence to start the weathervane explosion. ; Trigger the sequence to start the weathervane explosion.
LDY.b #$00 LDY.b #$00
@@ -94,12 +94,12 @@ FreeDuckCheck:
BRA .skipSong BRA .skipSong
.done .done
SEP #$20 SEP #$20
LDA.b #$80 : STA $03F0 ; thing we wrote over, load flute timer LDA.b #$80 : STA.w FluteTimer ; thing we wrote over
LDA.b #$13 LDA.b #$13
RTL RTL
.skipSong .skipSong
SEP #$20 SEP #$20
LDA.b #$80 : STA $03F0 ; thing we wrote over, load flute timer LDA.b #$80 : STA.w FluteTimer ; thing we wrote over
LDA.b #$00 LDA.b #$00
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

View File

@@ -2,58 +2,40 @@
; Frame Hook ; Frame Hook
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
FrameHookAction: FrameHookAction:
JSL $0080B5 ; Module_MainRouting JSL $0080B5 ; Module_MainRouting
JSL CheckMusicLoadRequest JSL CheckMusicLoadRequest
PHP : REP #$30 : PHA PHP : REP #$30 : PHA
SEP #$20
LDA.l StatsLocked : BNE ++
REP #$20 ; set 16-bit accumulator
LDA.l LoopFrames : INC : STA.l LoopFrames : BNE +
LDA.l LoopFrames+2 : INC : STA.l LoopFrames+2
+
LDA.l GameMode : CMP.w #$010E : BNE ++ ; move this to nmi hook?
LDA.l MenuFrames : INC : STA.l MenuFrames : BNE ++
LDA.l MenuFrames+2 : INC : STA.l MenuFrames+2
++
REP #$30 : PLA : PLP
SEP #$20
LDA StatsLocked : BNE ++
REP #$20 ; set 16-bit accumulator
LDA LoopFrames : INC : STA LoopFrames : BNE +
LDA LoopFrames+2 : INC : STA LoopFrames+2
+
LDA $10 : CMP.w #$010E : BNE + ; move this to nmi hook?
LDA MenuFrames : INC : STA MenuFrames : BNE +
LDA MenuFrames+2 : INC : STA MenuFrames+2
+
++
REP #$30 : PLA : PLP
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
NMIHookAction: NMIHookAction:
PHA : PHX : PHY : PHD ; thing we wrote over, push stuff PHA : PHX : PHY : PHD ; thing we wrote over, push stuff
LDA.l StatsLocked : AND.w #$00FF : BNE +
LDA StatsLocked : AND.w #$00FF : BNE ++ LDA.l NMIFrames : INC : STA.l NMIFrames : BNE +
LDA NMIFrames : INC : STA NMIFrames : BNE + LDA.l NMIFrames+2 : INC : STA.l NMIFrames+2
LDA NMIFrames+2 : INC : STA NMIFrames+2 +
+
++
JML.l NMIHookReturn JML.l NMIHookReturn
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!NMI_AUX = "$7F5044"
PostNMIHookAction: PostNMIHookAction:
LDA !NMI_AUX : BEQ + LDA.w NMIAux : BEQ +
LDA $00 : PHA ; preserve DP ram PHK : PEA .return-1 ; push stack for RTL return
LDA $01 : PHA JMP.w [NMIAux]
LDA $02 : PHA .return
STZ.w NMIAux ; zero bank byte of NMI hook pointer
+
LDA.b INIDISPQ : STA.w INIDISP ; thing we wrote over, turn screen back on
LDA !NMI_AUX+2 : STA $02 ; set up jump pointer
LDA !NMI_AUX+1 : STA $01
LDA !NMI_AUX+0 : STA $00
PHK : PER .return-1 ; push stack for RTL return
JMP [$0000]
.return
LDA.b #$00 : STA !NMI_AUX ; zero bank byte of NMI hook pointer
PLA : STA $02
PLA : STA $01
PLA : STA $00
+
LDA $13 : STA $2100 ; thing we wrote over, turn screen back on
JML.l PostNMIHookReturn JML.l PostNMIHookReturn
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

View File

@@ -1,16 +0,0 @@
;================================================================================
; Ganon Fixes
;================================================================================
;--------------------------------------------------------------------------------
; GanonWarpRNG
; out: Accumulator - #$00 or #01 randomly, with no repeated #$01s
;--------------------------------------------------------------------------------
;GanonWarpRNG:
; JSL GetRandomInt : AND.b #$01 : BEQ .zero
; LDA !GANON_WARP_CHAIN : EOR #$01 : STA !GANON_WARP_CHAIN
;RTL
; .zero
; STA !GANON_WARP_CHAIN
;RTL
;--------------------------------------------------------------------------------

View File

@@ -2,7 +2,7 @@
; Glitched Mode Fixes ; Glitched Mode Fixes
;================================================================================ ;================================================================================
GetAgahnimPalette: GetAgahnimPalette:
LDA $A0 ; get room id LDA.b RoomIndex ; get room id
CMP.b #13 : BNE + ; Agahnim 2 room CMP.b #13 : BNE + ; Agahnim 2 room
LDA.b #$07 ; Use Agahnim 2 LDA.b #$07 ; Use Agahnim 2
RTL RTL
@@ -11,25 +11,25 @@ GetAgahnimPalette:
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
GetAgahnimDeath: GetAgahnimDeath:
STA $0BA0, X ; thing we wrote over STA.w $0BA0, X ; thing we wrote over
LDA $A0 ; get room id LDA.b RoomIndex ; get room id
CMP.b #13 : BNE + ; Agahnim 2 room CMP.b #13 : BNE + ; Agahnim 2 room
LDA.l Bugfix_SetWorldOnAgahnimDeath : BEQ ++ LDA.l Bugfix_SetWorldOnAgahnimDeath : BEQ ++
LDA.l InvertedMode : BEQ +++ LDA.l InvertedMode : BEQ +++
LDA.b #$00 : STA CurrentWorld ; Switch to light world LDA.b #$00 : STA.l CurrentWorld ; Switch to light world
BRA ++ BRA ++
+++ +++
LDA.b #$40 : STA CurrentWorld ; Switch to dark world LDA.b #$40 : STA.l CurrentWorld ; Switch to dark world
++ ++
LDA.b #$01 ; Use Agahnim 2 LDA.b #$01 ; Use Agahnim 2
RTL RTL
+ ; Elsewhere + ; Elsewhere
LDA.l Bugfix_SetWorldOnAgahnimDeath : BEQ ++ LDA.l Bugfix_SetWorldOnAgahnimDeath : BEQ ++
LDA.l InvertedMode : BEQ +++ LDA.l InvertedMode : BEQ +++
LDA.b #$40 : STA CurrentWorld ; Switch to dark world LDA.b #$40 : STA.l CurrentWorld ; Switch to dark world
BRA ++ BRA ++
+++ +++
LDA.b #$00 : STA CurrentWorld ; Switch to light world LDA.b #$00 : STA.l CurrentWorld ; Switch to light world
; (This will later get flipped to DW when Agahnim 1 ; (This will later get flipped to DW when Agahnim 1
; warps us to the pyramid) ; warps us to the pyramid)
++ ++
@@ -37,7 +37,7 @@ GetAgahnimDeath:
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
GetAgahnimType: GetAgahnimType:
LDA $A0 ; get room id LDA.b RoomIndex ; get room id
CMP.b #13 : BNE + ; Agahnim 2 room CMP.b #13 : BNE + ; Agahnim 2 room
LDA.b #$0006 ; Use Agahnim 2 LDA.b #$0006 ; Use Agahnim 2
BRA .done BRA .done
@@ -48,7 +48,7 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
GetAgahnimSlot: GetAgahnimSlot:
PHX ; thing we wrote over PHX ; thing we wrote over
LDA $A0 ; get room id LDA.b RoomIndex ; get room id
CMP.b #13 : BNE + ; Agahnim 2 room CMP.b #13 : BNE + ; Agahnim 2 room
LDA.b #$01 ; Use Agahnim 2 LDA.b #$01 ; Use Agahnim 2
JML.l GetAgahnimSlotReturn JML.l GetAgahnimSlotReturn
@@ -57,8 +57,8 @@ GetAgahnimSlot:
JML.l GetAgahnimSlotReturn JML.l GetAgahnimSlotReturn
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
GetAgahnimLightning: GetAgahnimLightning:
INC $0E30, X ; thing we wrote over INC.w SpriteAux, X ; thing we wrote over
LDA $A0 ; get room id LDA.b RoomIndex ; get room id
CMP.b #13 : BNE + ; Agahnim 2 room CMP.b #13 : BNE + ; Agahnim 2 room
LDA.b #$01 ; Use Agahnim 2 LDA.b #$01 ; Use Agahnim 2
RTL RTL
@@ -69,11 +69,11 @@ GetAgahnimLightning:
;0 = Allow ;0 = Allow
;1 = Forbid ;1 = Forbid
AllowJoypadInput: AllowJoypadInput:
LDA PermitSQFromBosses : BEQ .fullCheck LDA.l PermitSQFromBosses : BEQ .fullCheck
LDA $0403 : AND.b #$80 : BEQ .fullCheck LDA.w ItemsTaken : AND.b #$80 : BEQ .fullCheck
LDA $0112 : ORA $02E4 ; we have heart container, do short check LDA.w MedallionFlag : ORA.w CutsceneFlag ; we have heart container, do short check
RTL RTL
.fullCheck .fullCheck
LDA $0112 : ORA $02E4 : ORA $0FFC LDA.w MedallionFlag : ORA.w CutsceneFlag : ORA.w NoMenu
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

View File

@@ -1,21 +1,14 @@
;--------------------------------------------------------------------------------
; $7F5010 - Scratch Space (Callee Preserved)
;--------------------------------------------------------------------------------
!GOAL_DRAW_ADDRESS = "$7EC72A"
;--------------------------------------------------------------------------------
; DrawGoalIndicator moved to newhud.asm
;--------------------------------------------------------------------------------
GoalItemGanonCheck: GoalItemGanonCheck:
LDA $0E20, X : CMP.b #$D6 : BNE .success ; skip if not ganon LDA.w SpriteTypeTable, X : CMP.b #$D6 : BNE .success ; skip if not ganon
JSL.l CheckGanonVulnerability JSL.l CheckGanonVulnerability
BCS .success BCS .success
.fail .fail
LDA $0D80, X : CMP.b #17 : !BLT .success ; decmial 17 because Acmlm's chart is decimal LDA.w SpriteActivity, X : CMP.b #17 : !BLT .success ; decmial 17 because Acmlm's chart is decimal
LDA.b #$00 LDA.b #$00
RTL RTL
.success .success
LDA $44 : CMP.b #$80 ; thing we wrote over LDA.b OAMOffsetY : CMP.b #$80 ; thing we wrote over
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;Carry clear = ganon invincible ;Carry clear = ganon invincible
@@ -125,12 +118,12 @@ GetRequiredCrystalsInX:
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CheckEnoughCrystalsForGanon: CheckEnoughCrystalsForGanon:
LDA CrystalCounter LDA.l CrystalCounter
CMP.l NumberOfCrystalsRequiredForGanon CMP.l NumberOfCrystalsRequiredForGanon
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CheckEnoughCrystalsForTower: CheckEnoughCrystalsForTower:
LDA CrystalCounter LDA.l CrystalCounter
CMP.l NumberOfCrystalsRequiredForTower CMP.l NumberOfCrystalsRequiredForTower
RTL RTL
@@ -145,13 +138,13 @@ CheckAgaForPed:
BEQ .force_blue_ball BEQ .force_blue_ball
.vanilla ; run vanilla check for phase .vanilla ; run vanilla check for phase
LDA.w $0E30, X LDA.w SpriteAux, X
CMP.b #$02 CMP.b #$02
RTL RTL
.force_blue_ball .force_blue_ball
LDA.b #$01 : STA.w $0DA0, Y LDA.b #$01 : STA.w SpriteAuxTable, Y
LDA.b #$20 : STA.w $0DF0, Y LDA.b #$20 : STA.w SpriteTimer, Y
CLC ; skip the RNG check CLC ; skip the RNG check
RTL RTL
@@ -182,7 +175,7 @@ CheckForCrystalBossesDefeated:
REP #$30 REP #$30
; count of number of bosses killed ; count of number of bosses killed
STZ.b $00 STZ.b Scrap00
LDY.w #10 LDY.w #10
@@ -202,7 +195,7 @@ CheckForCrystalBossesDefeated:
AND.w #$0800 AND.w #$0800
BEQ ++ BEQ ++
INC.b $00 INC.b Scrap00
++ DEY ++ DEY
BPL .next_check BPL .next_check
@@ -210,7 +203,7 @@ CheckForCrystalBossesDefeated:
SEP #$30 SEP #$30
PLY : PLX : PLB PLY : PLX : PLB
LDA.b $00 : CMP.l NumberOfCrystalsRequiredForGanon LDA.b Scrap00 : CMP.l NumberOfCrystalsRequiredForGanon
RTS RTS

View File

@@ -6,10 +6,10 @@ GetMagicBatItem:
%GetPossiblyEncryptedItem(MagicBatItem, SpriteItemValues) %GetPossiblyEncryptedItem(MagicBatItem, SpriteItemValues)
CMP.b #$FF : BEQ .normalLogic CMP.b #$FF : BEQ .normalLogic
TAY TAY
STZ $02E9 ; 0 = Receiving item from an NPC or message STZ.b ItemReceiptMethod ; 0 = Receiving item from an NPC or message
JML.l Link_ReceiveItem JML.l Link_ReceiveItem
.normalLogic .normalLogic
LDA HalfMagic LDA.l HalfMagic
STA MagicConsumption STA.l MagicConsumption
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

View File

@@ -3,22 +3,22 @@
;================================================================================ ;================================================================================
CalculateSpikeFloorDamage: CalculateSpikeFloorDamage:
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way LDA.b RoomIndex ; these are all decimal because i got them that way
CMP.w #279 CMP.w #279
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
BNE + BNE +
LDA.l ByrnaCaveSpikeDamage LDA.l ByrnaCaveSpikeDamage
STA $0373 STA.w DamageReceived
RTL RTL
+ +
LDA $D055, Y LDA.w $D055, Y
STA $0373 STA.w DamageReceived
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CalculateByrnaUsage: CalculateByrnaUsage:
LDA $1B : BEQ ++ LDA.b IndoorsFlag : BEQ ++
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way LDA.b RoomIndex ; these are all decimal because i got them that way
CMP.w #95 : BEQ + ; Ice Palace Spike Room CMP.w #95 : BEQ + ; Ice Palace Spike Room
CMP.w #172 : BEQ + ; Blind Boss Room CMP.w #172 : BEQ + ; Blind Boss Room
CMP.w #179 : BEQ + ; Room in Misery Mire CMP.w #179 : BEQ + ; Room in Misery Mire
@@ -29,16 +29,16 @@ CalculateByrnaUsage:
+ +
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
PHX : TYX PHX : TYX
LDA.l HardModeExclusionCaneOfByrnaUsage, X : STA $00 LDA.l HardModeExclusionCaneOfByrnaUsage, X : STA.b Scrap00
PLX PLX
++ ++
LDA CurrentMagic ; thing we wrote over LDA.l CurrentMagic ; thing we wrote over
JML IncrementMagicUseCounterByrna JML IncrementMagicUseCounterByrna
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CalculateCapeUsage: CalculateCapeUsage:
LDA $1B : BEQ ++ LDA.b IndoorsFlag : BEQ ++
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way LDA.b RoomIndex ; these are all decimal because i got them that way
CMP.w #95 : BEQ + ; Ice Palace Spike Room CMP.w #95 : BEQ + ; Ice Palace Spike Room
CMP.w #179 : BEQ + ; Room in Misery Mire CMP.w #179 : BEQ + ; Room in Misery Mire
CMP.w #213 : BEQ + ; Laser Bridge CMP.w #213 : BEQ + ; Laser Bridge
@@ -48,15 +48,15 @@ CalculateCapeUsage:
+ +
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
PHX : TYX PHX : TYX
LDA.l HardModeExclusionCapeUsage, X : STA $4C ; set cape decrement timer LDA.l HardModeExclusionCapeUsage, X : STA.b CapeTimer ; set cape decrement timer
PLX PLX
++ ++
JML IncrementMagicUseCounterOne JML IncrementMagicUseCounterOne
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
ActivateInvulnerabilityOrDont: ActivateInvulnerabilityOrDont:
LDA $1B : BEQ .nowhere_special LDA.b IndoorsFlag : BEQ .nowhere_special
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way LDA.b RoomIndex ; these are all decimal because i got them that way
CMP.w #95 : BEQ .somewhere_cool ; Ice Palace Spike Room CMP.w #95 : BEQ .somewhere_cool ; Ice Palace Spike Room
CMP.w #179 : BEQ .somewhere_cool ; Room in Misery Mire CMP.w #179 : BEQ .somewhere_cool ; Room in Misery Mire
CMP.w #213 : BEQ .somewhere_cool ; Laser Bridge CMP.w #213 : BEQ .somewhere_cool ; Laser Bridge
@@ -66,9 +66,9 @@ ActivateInvulnerabilityOrDont:
BRA .nowhere_special BRA .nowhere_special
.somewhere_cool .somewhere_cool
SEP #$20 ; set 8-bit accumulator SEP #$20 ; set 8-bit accumulator
LDA.b #$01 : STA $037B : RTL LDA.b #$01 : STA.w NoDamage : RTL
.nowhere_special .nowhere_special
LDA.l ByrnaInvulnerability : STA $037B LDA.l ByrnaInvulnerability : STA.w NoDamage
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
GetItemDamageValue: GetItemDamageValue:
@@ -81,13 +81,13 @@ GetItemDamageValue:
CPX.b #$3d : BEQ .hookshot CPX.b #$3d : BEQ .hookshot
.normal .normal
lda $0db8f1,x ;what we wrote over LDA.l $0db8f1,x ;what we wrote over
RTL RTL
.boomerang .boomerang
LDA.l StunItemAction : AND #$01 : BNE .normal LDA.l StunItemAction : AND.b #$01 : BNE .normal
BRA .noDamage BRA .noDamage
.hookshot .hookshot
LDA.l StunItemAction : AND #$02 : BNE .normal LDA.l StunItemAction : AND.b #$02 : BNE .normal
.noDamage .noDamage
LDA.b #$00 LDA.b #$00
RTL RTL
@@ -95,17 +95,17 @@ RTL
;Argument : A = id we want to find return 00 if none found, 01 if found ;Argument : A = id we want to find return 00 if none found, 01 if found
SearchAncilla: SearchAncilla:
{ {
STA $05 STA.b Scrap05
PHX PHX
LDX #$00 LDX.b #$00
.loop .loop
LDA $0C4A, X LDA.w AncillaID, X
INX : CPX #$0A : BEQ .notFound INX : CPX #$0A : BEQ .notFound
CMP $05 : BNE .loop CMP.b Scrap05 : BNE .loop
LDA #$01 LDA.b #$01
BRA .return BRA .return
.notFound .notFound
LDA #$00 LDA.b #$00
.return .return
PLX PLX
RTS RTS

View File

@@ -1,41 +1,39 @@
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;Hash Alphabet ; Hash Alphabet
!ALPHA_BOW = "#$0000" ; ALPHA_BOW = $0000
!ALPHA_BOOM = "#$0001" ; ALPHA_BOOM = $0001
!ALPHA_HOOK = "#$0002" ; ALPHA_HOOK = $0002
!ALPHA_BOMB = "#$0003" ; ALPHA_BOMB = $0003
!ALPHA_SHROOM = "#$0004" ; ALPHA_SHROOM = $0004
!ALPHA_POWDER = "#$0005" ; ALPHA_POWDER = $0005
!ALPHA_ROD = "#$0006" ; ALPHA_ROD = $0006
!ALPHA_PENDANT = "#$0007" ; ALPHA_PENDANT = $0007
!ALPHA_BOMBOS = "#$0008" ; ALPHA_BOMBOS = $0008
!ALPHA_ETHER = "#$0009" ; ALPHA_ETHER = $0009
!ALPHA_QUAKE = "#$000A" ; ALPHA_QUAKE = $000A
!ALPHA_LAMP = "#$000B" ; ALPHA_LAMP = $000B
!ALPHA_HAMMER = "#$000C" ; ALPHA_HAMMER = $000C
!ALPHA_SHOVEL = "#$000D" ; ALPHA_SHOVEL = $000D
!ALPHA_FLUTE = "#$000E" ; ALPHA_FLUTE = $000E
!ALPHA_NET = "#$000F" ; ALPHA_NET = $000F
!ALPHA_BOOK = "#$0010" ; ALPHA_BOOK = $0010
!ALPHA_BOTTLE = "#$0011" ; ALPHA_BOTTLE = $0011
!ALPHA_POTION = "#$0012" ; ALPHA_POTION = $0012
!ALPHA_CANE = "#$0013" ; ALPHA_CANE = $0013
!ALPHA_CAPE = "#$0014" ; ALPHA_CAPE = $0014
!ALPHA_MIRROR = "#$0015" ; ALPHA_MIRROR = $0015
!ALPHA_BOOTS = "#$0016" ; ALPHA_BOOTS = $0016
!ALPHA_GLOVES = "#$0017" ; ALPHA_GLOVES = $0017
!ALPHA_FLIPPERS = "#$0018" ; ALPHA_FLIPPERS = $0018
!ALPHA_PEARL = "#$0019" ; ALPHA_PEARL = $0019
!ALPHA_SHIELD = "#$001A" ; ALPHA_SHIELD = $001A
!ALPHA_TUNIC = "#$001B" ; ALPHA_TUNIC = $001B
!ALPHA_HEART = "#$001C" ; ALPHA_HEART = $001C
!ALPHA_MAP = "#$001D" ; ALPHA_MAP = $001D
!ALPHA_COMPASS = "#$001E" ; ALPHA_COMPASS = $001E
!ALPHA_KEY = "#$001F" ; ALPHA_KEY = $001F
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
!BIGRAM = "$7EC900";
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LoadAlphabetTilemap: LoadAlphabetTilemap:
PHB : PHA : PHX : PHY : PHP PHB : PHA : PHX : PHY : PHP
@@ -45,9 +43,9 @@ LoadAlphabetTilemap:
LDX.b #$00 : - LDX.b #$00 : -
LDA.w FileSelect_PlayerSelectText_Top, X LDA.w FileSelect_PlayerSelectText_Top, X
STA !BIGRAM, X STA.l BigRAM, X
INX #2 INX #2
CPX #128 : !BLT - CPX.b #128 : !BLT -
LDY.b #00 LDY.b #00
LDX.b #$00 : - LDX.b #$00 : -
@@ -55,12 +53,12 @@ LoadAlphabetTilemap:
AND.w #$001F ; mask to alphabet of 32 AND.w #$001F ; mask to alphabet of 32
ASL #3 : PHY : TAY ASL #3 : PHY : TAY
LDA.w HashAlphabetTiles,Y : STA !BIGRAM+24, X LDA.w HashAlphabetTiles,Y : STA.l BigRAM+24, X
LDA.w HashAlphabetTiles+2,Y : STA !BIGRAM+24+2, X LDA.w HashAlphabetTiles+2,Y : STA.l BigRAM+24+2, X
LDA.w HashAlphabetTiles+4,Y : STA !BIGRAM+24+64, X LDA.w HashAlphabetTiles+4,Y : STA.l BigRAM+24+64, X
LDA.w HashAlphabetTiles+6,Y : STA !BIGRAM+24+64+2, X LDA.w HashAlphabetTiles+6,Y : STA.l BigRAM+24+64+2, X
PLY : INX #6 : INY PLY : INX #6 : INY
CPX #25 : !BLT - CPX.b #25 : !BLT -
SEP #$20 ; 8-bit accumulator SEP #$20 ; 8-bit accumulator
@@ -72,38 +70,38 @@ RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
DMAAlphabetTilemap: DMAAlphabetTilemap:
PHA : PHX PHA : PHX
LDA $4300 : PHA ; preserve DMA parameters LDA.w DMAP0 : PHA ; preserve DMA parameters
LDA $4301 : PHA ; preserve DMA parameters LDA.w BBAD0 : PHA ; preserve DMA parameters
LDA $4302 : PHA ; preserve DMA parameters LDA.w A1T0L : PHA ; preserve DMA parameters
LDA $4303 : PHA ; preserve DMA parameters LDA.w A1T0H : PHA ; preserve DMA parameters
LDA $4304 : PHA ; preserve DMA parameters LDA.w A1B0 : PHA ; preserve DMA parameters
LDA $4305 : PHA ; preserve DMA parameters LDA.w DAS0L : PHA ; preserve DMA parameters
LDA $4306 : PHA ; preserve DMA parameters LDA.w DAS0H : PHA ; preserve DMA parameters
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LDA.b #$01 : STA $4300 ; set DMA transfer direction A -> B, bus A auto increment, double-byte mode LDA.b #$01 : STA.w DMAP0 ; set DMA transfer direction A -> B, bus A auto increment, double-byte mode
LDA.b #$80 : STA $2115 ; write read increment on $2119 LDA.b #$80 : STA.w VMAIN ; write read increment on $2119
LDA.b #$18 : STA $4301 ; set bus B destination to VRAM register LDA.b #$18 : STA.w BBAD0 ; set bus B destination to VRAM register
LDA.b #$60 : STA $2116 ; write VRAM destination address LDA.b #$60 : STA.w VMADDL ; write VRAM destination address
STA $2117 ; write VRAM destination address STA.w VMADDH ; write VRAM destination address
LDA.b #!BIGRAM : STA $4302 ; set bus A source address to WRAM LDA.b #BigRAM : STA.w A1T0L ; set bus A source address to WRAM
LDA.b #!BIGRAM>>8 : STA $4303 ; set bus A source address to WRAM LDA.b #BigRAM>>8 : STA.w A1T0H ; set bus A source address to WRAM
LDA.b #!BIGRAM>>16 : STA $4304 ; set bus A source bank LDA.b #BigRAM>>16 : STA.w A1B0 ; set bus A source bank
LDA.b #$80 : STA $4305 : STZ $4306 ; set transfer size to 0x40 LDA.b #$80 : STA.w DAS0L : STZ.w DAS0H ; set transfer size to 0x40
LDA $2100 : PHA : LDA.b #$80 : STA $2100 ; save screen state & turn screen off LDA.w INIDISP : PHA : LDA.b #$80 : STA.w INIDISP ; save screen state & turn screen off
LDA #$01 : STA $420B ; begin DMA transfer LDA.b #$01 : STA.w MDMAEN ; begin DMA transfer
PLA : STA $2100 ; put screen back however it was before PLA : STA.w INIDISP ; put screen back however it was before
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
PLA : STA $4306 ; restore DMA parameters PLA : STA.w DAS0H ; restore DMA parameters
PLA : STA $4305 ; restore DMA parameters PLA : STA.w DAS0L ; restore DMA parameters
PLA : STA $4304 ; restore DMA parameters PLA : STA.w A1B0 ; restore DMA parameters
PLA : STA $4303 ; restore DMA parameters PLA : STA.w A1T0H ; restore DMA parameters
PLA : STA $4302 ; restore DMA parameters PLA : STA.w A1T0L ; restore DMA parameters
PLA : STA $4301 ; restore DMA parameters PLA : STA.w BBAD0 ; restore DMA parameters
PLA : STA $4300 ; restore DMA parameters PLA : STA.w DMAP0 ; restore DMA parameters
PLX : PLA PLX : PLA
RTS RTS
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

View File

@@ -1,106 +1,80 @@
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!FSTILE_SPACE = "$0188" !FSTILE_SPACE = $0188
!FSTILE_BRACKET_OPEN_TOP = "$1D8A" !FSTILE_BRACKET_OPEN_TOP = $1D8A
!FSTILE_BRACKET_OPEN_BOTTOM = "$1D9A" !FSTILE_BRACKET_OPEN_BOTTOM = $1D9A
!FSTILE_BRACKET_CLOSE_TOP = "$1D8B" !FSTILE_BRACKET_CLOSE_TOP = $1D8B
!FSTILE_BRACKET_CLOSE_BOTTOM = "$1D9B" !FSTILE_BRACKET_CLOSE_BOTTOM = $1D9B
!FSTILE_A_TOP = "$1D4A" !FSTILE_A_TOP = $1D4A
!FSTILE_A_BOTTOM = "$1D5A" !FSTILE_A_BOTTOM = $1D5A
!FSTILE_C_TOP = "$1D4C" !FSTILE_C_TOP = $1D4C
!FSTILE_C_BOTTOM = "$1D5C" !FSTILE_C_BOTTOM = $1D5C
!FSTILE_D_TOP = "$1D4D" !FSTILE_D_TOP = $1D4D
!FSTILE_D_BOTTOM = "$1D5D" !FSTILE_D_BOTTOM = $1D5D
!FSTILE_E_TOP = "$1D4E" !FSTILE_E_TOP = $1D4E
!FSTILE_E_BOTTOM = "$1D5E" !FSTILE_E_BOTTOM = $1D5E
!FSTILE_F_TOP = "$1D4F" !FSTILE_F_TOP = $1D4F
!FSTILE_F_BOTTOM = "$1D5F" !FSTILE_F_BOTTOM = $1D5F
!FSTILE_H_TOP = "$1D61" !FSTILE_H_TOP = $1D61
!FSTILE_H_BOTTOM = "$1D71" !FSTILE_H_BOTTOM = $1D71
!FSTILE_I_TOP = "$1D62" !FSTILE_I_TOP = $1D62
!FSTILE_I_BOTTOM = "$1D72" !FSTILE_I_BOTTOM = $1D72
!FSTILE_K_TOP = "$1D64" !FSTILE_K_TOP = $1D64
!FSTILE_K_BOTTOM = "$1D74" !FSTILE_K_BOTTOM = $1D74
!FSTILE_L_TOP = "$1D65" !FSTILE_L_TOP = $1D65
!FSTILE_L_BOTTOM = "$1D75" !FSTILE_L_BOTTOM = $1D75
!FSTILE_N_TOP = "$1D67" !FSTILE_N_TOP = $1D67
!FSTILE_N_BOTTOM = "$1D77" !FSTILE_N_BOTTOM = $1D77
!FSTILE_O_TOP = "$1D68" !FSTILE_O_TOP = $1D68
!FSTILE_O_BOTTOM = "$1D78" !FSTILE_O_BOTTOM = $1D78
!FSTILE_P_TOP = "$1D69" !FSTILE_P_TOP = $1D69
!FSTILE_P_BOTTOM = "$1D79" !FSTILE_P_BOTTOM = $1D79
!FSTILE_S_TOP = "$1D6C" !FSTILE_S_TOP = $1D6C
!FSTILE_S_BOTTOM = "$1D7C" !FSTILE_S_BOTTOM = $1D7C
!FSTILE_T_TOP = "$1D6D" !FSTILE_T_TOP = $1D6D
!FSTILE_T_BOTTOM = "$1D7D" !FSTILE_T_BOTTOM = $1D7D
!FSTILE_U_TOP = "$1D6E" !FSTILE_U_TOP = $1D6E
!FSTILE_U_BOTTOM = "$1D7E" !FSTILE_U_BOTTOM = $1D7E
!FSTILE_Y_TOP = "$1D82" !FSTILE_Y_TOP = $1D82
!FSTILE_Y_BOTTOM = "$1D92" !FSTILE_Y_BOTTOM = $1D92
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $0CDE60 ; <- 65E60 org $0CDE60 ; <- 65E60
FileSelect_CopyFile_Top: FileSelect_CopyFile_Top:
db $62, $A5, $00, $15 db $62, $A5, $00, $15
dw !FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE dw !FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE
;dw !FSTILE_C_TOP, !FSTILE_SPACE, !FSTILE_O_TOP, !FSTILE_SPACE, !FSTILE_P_TOP, !FSTILE_SPACE, !FSTILE_Y_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE
;dw $1CAC, !FSTILE_SPACE, $1D23, !FSTILE_SPACE, $1D89, !FSTILE_SPACE, $1D04, !FSTILE_SPACE, $1D89, !FSTILE_SPACE, $1D07
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $0CDE7A ; <- 65E7A org $0CDE7A ; <- 65E7A
FileSelect_CopyFile_Bottom: FileSelect_CopyFile_Bottom:
db $62, $C5, $00, $15 db $62, $C5, $00, $15
dw !FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE dw !FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE,!FSTILE_SPACE
;dw !FSTILE_C_BOTTOM, !FSTILE_SPACE, !FSTILE_O_BOTTOM, !FSTILE_SPACE, !FSTILE_P_BOTTOM, !FSTILE_SPACE, !FSTILE_Y_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE
;dw $1CBC, !FSTILE_SPACE, $1D33, !FSTILE_SPACE, $1D99, !FSTILE_SPACE, $1D14, !FSTILE_SPACE, $1D99, !FSTILE_SPACE, $1D17
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
org $0CDE94 ; <- 65E94 org $0CDE94 ; <- 65E94
FileSelect_KillFile_Top: FileSelect_KillFile_Top:
db $63, $25, $00, $19 db $63, $25, $00, $19
dw !FSTILE_D_TOP, !FSTILE_E_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_T_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_F_TOP, !FSTILE_I_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE dw !FSTILE_D_TOP, !FSTILE_E_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_T_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_F_TOP, !FSTILE_I_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE
;dw !FSTILE_D_TOP, !FSTILE_SPACE, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_T_TOP, !FSTILE_SPACE, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE
;dw !FSTILE_K_TOP, !FSTILE_SPACE, !FSTILE_I_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE
;dw !FSTILE_K_TOP, !FSTILE_SPACE, !FSTILE_I_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, !FSTILE_L_TOP, !FSTILE_SPACE, $1D04, !FSTILE_SPACE, $1D89, !FSTILE_SPACE, $1D07
;--------------------------------------------------------------------------------
org $0CDEB2 ; <- 65EB2 org $0CDEB2 ; <- 65EB2
FileSelect_KillFile_Bottom: FileSelect_KillFile_Bottom:
db $63, $45, $00, $19 db $63, $45, $00, $19
dw !FSTILE_D_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_T_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_F_BOTTOM, !FSTILE_I_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE dw !FSTILE_D_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_T_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_F_BOTTOM, !FSTILE_I_BOTTOM, !FSTILE_L_BOTTOM, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE
;dw !FSTILE_D_BOTTOM, !FSTILE_SPACE, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_T_BOTTOM, !FSTILE_SPACE, !FSTILE_E_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE
;dw !FSTILE_K_BOTTOM, !FSTILE_SPACE, !FSTILE_I_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE
;dw !FSTILE_K_BOTTOM, !FSTILE_SPACE, !FSTILE_I_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, !FSTILE_L_BOTTOM, !FSTILE_SPACE, $1D14, !FSTILE_SPACE, $1D99, !FSTILE_SPACE, $1D17
;--------------------------------------------------------------------------------
;org $0CDDE8 ; <- 65DE8
;FileSelect_PlayerSelectText_Top:
;db $60, $62, $00, $37
;db $8A, $1D, $88, $01, $69, $1D, $88, $01, $65, $1D, $88, $01, $4A, $1D, $88, $01
;db $82, $1D, $88, $01, $4E, $1D, $88, $01, $6B, $1D, $88, $01, $88, $01, $6C, $1D
;db $88, $01, $4E, $1D, $88, $01, $65, $1D, $88, $01, $4E, $1D, $88, $01, $4C, $1D
;db $88, $01, $6D, $1D, $88, $01, $8B, $1D
;--------------------------------------------------------------------------------
;org $0CDE24 ; <- 65E24
;FileSelect_PlayerSelectText_Bottom:
;db $60, $82, $00, $37
;db $9A, $1D, $88, $01, $79, $1D, $88, $01, $75, $1D, $88, $01, $5A, $1D, $88, $01
;db $92, $1D, $88, $01, $5E, $1D, $88, $01, $7B, $1D, $88, $01, $88, $01, $7C, $1D
;db $88, $01, $5E, $1D, $88, $01, $75, $1D, $88, $01, $5E, $1D, $88, $01, $5C, $1D
;db $88, $01, $7D, $1D, $88, $01, $9B, $1D
;--------------------------------------------------------------------------------
;CopyFile_Header: ;CopyFile_Header:
org $0CE228 ; <- 66228 org $0CE228 ; <- 66228
dw !FSTILE_BRACKET_OPEN_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_C_TOP, !FSTILE_O_TOP, !FSTILE_P_TOP, !FSTILE_Y_TOP, !FSTILE_SPACE, !FSTILE_F_TOP, !FSTILE_I_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_BRACKET_CLOSE_TOP dw !FSTILE_BRACKET_OPEN_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_C_TOP, !FSTILE_O_TOP, !FSTILE_P_TOP, !FSTILE_Y_TOP, !FSTILE_SPACE, !FSTILE_F_TOP, !FSTILE_I_TOP, !FSTILE_L_TOP, !FSTILE_E_TOP, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_BRACKET_CLOSE_TOP
@@ -140,10 +114,8 @@ dw !FSTILE_BRACKET_OPEN_BOTTOM, !FSTILE_SPACE, !FSTILE_D_BOTTOM, !FSTILE_E_BOTTO
;KillFile_Which: ;KillFile_Which:
org $0CE04E ; <- 6604E org $0CE04E ; <- 6604E
dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE
;dw $0D4D, $0D4E, $0D65, $0D4E, $0D6D, $0D4E, !FSTILE_SPACE, $0D80, $0D61, $0D62, $0D4C, $0D61, !FSTILE_SPACE, $0D4F, $0D62, $0D65, $0D4E, $0D86, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE
org $0CE084 ; <- 66084 org $0CE084 ; <- 66084
dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE dw !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE
;dw $0D5D, $0D5E, $0D75, $0D5E, $0D7D, $0D5E, !FSTILE_SPACE, $0D90, $0D71, $0D72, $0D5C, $0D71, !FSTILE_SPACE, $0D5F, $0D72, $0D75, $0D5E, $0D96, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE
;KillFile_Execute: ;KillFile_Execute:
org $0CD328 ; <- 65328 org $0CD328 ; <- 65328

View File

@@ -3,10 +3,10 @@
;================================================================================ ;================================================================================
BeepLogic: BeepLogic:
LDA.l HeartBeep : BEQ + LDA.l HeartBeep : BEQ +
STA $04CA STA.w HeartBeepTimer
LDA.b #$2B : STA $012E LDA.b #$2B : STA.w SFX2
RTL RTL
+ +
LDA.b #$FF : STA $04CA LDA.b #$FF : STA.w HeartBeepTimer
RTL RTL
;================================================================================ ;================================================================================

View File

@@ -2,43 +2,41 @@
; Randomize Heart Pieces ; Randomize Heart Pieces
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
HeartPieceGet: HeartPieceGet:
PHX : PHY PHX : PHY
LDY $0E80, X ; load item value into Y register LDY.w SpriteItemType, X ; load item value into Y register
BNE + BNE +
; if for any reason the item value is 0 reload it, just in case ; if for any reason the item value is 0 reload it, just in case
JSL.l LoadHeartPieceRoomValue : TAY JSL.l LoadHeartPieceRoomValue : TAY
+ +
JSL.l MaybeMarkDigSpotCollected JSL.l MaybeMarkDigSpotCollected
.skipLoad .skipLoad
STZ $02E9 ; 0 = Receiving item from an NPC or message STZ.w ItemReceiptMethod ; 0 = Receiving item from an NPC or message
CPY.b #$26 : BNE .notHeart ; don't add a 1/4 heart if it's not a heart piece CPY.b #$26 : BNE .notHeart ; don't add a 1/4 heart if it's not a heart piece
LDA HeartPieceQuarter : INC A : AND.b #$03 : STA HeartPieceQuarter : BNE .unfinished_heart ; add up heart quarters LDA.l HeartPieceQuarter : INC A : AND.b #$03 : STA.l HeartPieceQuarter : BNE .unfinished_heart ; add up heart quarters
BRA .giveItem BRA .giveItem
.notHeart .notHeart
.giveItem
JSL.l $0791B3 ; Player_HaltDashAttackLong
JSL.l Link_ReceiveItem
CLC ; return false
JMP .done ; finished
.giveItem .unfinished_heart
JSL.l $0791B3 ; Player_HaltDashAttackLong SEC ; return true
JSL.l Link_ReceiveItem .done
CLC ; return false JSL MaybeUnlockTabletAnimation
JMP .done ; finished
.unfinished_heart PLY : PLX
SEC ; return true
.done
JSL MaybeUnlockTabletAnimation
PLY : PLX
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
HeartContainerGet: HeartContainerGet:
PHX : PHY PHX : PHY
JSL.l AddInventory_incrementBossSwordLong JSL.l AddInventory_incrementBossSwordLong
LDY $0E80, X ; load item value into Y register LDY.w SpriteItemType, X ; load item value into Y register
BNE + BNE +
; if for any reason the item value is 0 reload it, just in case ; if for any reason the item value is 0 reload it, just in case
JSL.l LoadHeartContainerRoomValue : TAY JSL.l LoadHeartContainerRoomValue : TAY
@@ -46,27 +44,24 @@ HeartContainerGet:
BRA HeartPieceGet_skipLoad BRA HeartPieceGet_skipLoad
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
DrawHeartPieceGFX: DrawHeartPieceGFX:
PHP PHP
JSL.l Sprite_IsOnscreen : BCC .offscreen JSL.l Sprite_IsOnscreen : BCC .offscreen
PHA : PHY PHA : PHY
LDA !REDRAW : BEQ .skipInit ; skip init if already ready LDA.l RedrawFlag : BEQ .skipInit ; skip init if already ready
JSL.l HeartPieceSpritePrep JSL.l HeartPieceSpritePrep
JMP .done ; don't draw on the init frame JMP .done ; don't draw on the init frame
.skipInit .skipInit
LDA $0E80, X ; Retrieve stored item type LDA.w SpriteItemType, X ; Retrieve stored item type
.skipLoad .skipLoad
PHA PHA
JSL.l IsNarrowSprite : BCC + JSL.l IsNarrowSprite : BCC +
LDA $0E60, X : ORA.b #$20 : STA $0E60, X LDA.w SpriteControl, X : ORA.b #$20 : STA.w SpriteControl, X
+ +
;LDA $0E60, X : ORA.b #$10 : STA $0E60, X
PLA PLA
JSL.l DrawDynamicTile JSL.l DrawDynamicTile
@@ -78,18 +73,17 @@ DrawHeartPieceGFX:
PLP PLP
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
DrawHeartContainerGFX: DrawHeartContainerGFX:
PHP PHP
JSL.l Sprite_IsOnscreen : BCC DrawHeartPieceGFX_offscreen JSL.l Sprite_IsOnscreen : BCC DrawHeartPieceGFX_offscreen
PHA : PHY PHA : PHY
LDA !REDRAW : BEQ .skipInit ; skip init if already ready LDA.l RedrawFlag : BEQ .skipInit ; skip init if already ready
JSL.l HeartContainerSpritePrep JSL.l HeartContainerSpritePrep
BRA DrawHeartPieceGFX_done ; don't draw on the init frame BRA DrawHeartPieceGFX_done ; don't draw on the init frame
.skipInit .skipInit
LDA $0E80, X ; Retrieve stored item type LDA.w SpriteItemType, X ; Retrieve stored item type
BRA DrawHeartPieceGFX_skipLoad BRA DrawHeartPieceGFX_skipLoad
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
@@ -107,7 +101,7 @@ HeartContainerSound:
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
NormalItemSkipSound: NormalItemSkipSound:
LDA $0C5E, X ; thing we wrote over LDA.w AncillaGet, X ; thing we wrote over
CPY.b #$20 : BEQ + ; Skip for Crystal CPY.b #$20 : BEQ + ; Skip for Crystal
CPY.b #$37 : BEQ + ; Skip for Pendants CPY.b #$37 : BEQ + ; Skip for Pendants
@@ -115,66 +109,43 @@ NormalItemSkipSound:
CPY.b #$39 : BEQ + CPY.b #$39 : BEQ +
PHA PHA
JSL.l CheckIfBossRoom JSL.l CheckIfBossRoom
PLA PLA
RTL RTL
+ +
CLC CLC
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
HeartUpgradeSpawnDecision: ; this should return #$00 to make the hp spawn
LDA !FORCE_HEART_SPAWN : BEQ .normal_behavior
DEC : STA !FORCE_HEART_SPAWN
LDA #$00
RTL
.normal_behavior
LDA OverworldEventDataWRAM, X
RTL
;--------------------------------------------------------------------------------
SaveHeartCollectedStatus:
LDA !SKIP_HEART_SAVE : BEQ .normal_behavior
DEC : STA !SKIP_HEART_SAVE
RTL
.normal_behavior
LDA OverworldEventDataWRAM, X : ORA.b #$40 : STA OverworldEventDataWRAM, X
RTL
;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
HeartPieceSpritePrep: HeartPieceSpritePrep:
PHA PHA
LDA ServerRequestMode : BEQ + : : + LDA.l ServerRequestMode : BEQ + : : +
LDA #$01 : STA !REDRAW LDA.b #$01 : STA.l RedrawFlag
LDA $5D : CMP #$14 : BEQ .skip ; skip if we're mid-mirror LDA.b LinkState : CMP.b #$14 : BEQ .skip ; skip if we're mid-mirror
LDA #$00 : STA !REDRAW LDA.b #$00 : STA.l RedrawFlag
JSL.l LoadHeartPieceRoomValue ; load item type JSL.l LoadHeartPieceRoomValue ; load item type
STA $0E80, X ; Store item type STA.w SpriteItemType, X ; Store item type
JSL.l PrepDynamicTile JSL.l PrepDynamicTile
.skip .skip
PLA PLA
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
HeartContainerSpritePrep: HeartContainerSpritePrep:
PHA PHA
LDA #$00 : STA !REDRAW LDA.b #$00 : STA.l RedrawFlag
JSL.l LoadHeartContainerRoomValue ; load item type JSL.l LoadHeartContainerRoomValue ; load item type
STA $0E80, X ; Store item type STA.w SpriteItemType, X ; Store item type
JSL.l PrepDynamicTile JSL.l PrepDynamicTile
PLA PLA
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LoadHeartPieceRoomValue: LoadHeartPieceRoomValue:
LDA $1B : BEQ .outdoors ; check if we're indoors or outdoors LDA.b IndoorsFlag : BEQ .outdoors ; check if we're indoors or outdoors
.indoors .indoors
JSL.l LoadIndoorValue JSL.l LoadIndoorValue
JMP .done JMP .done
@@ -183,38 +154,37 @@ LoadHeartPieceRoomValue:
.done .done
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
HPItemReset: HPItemReset:
JSL $09AD58 ; GiveRupeeGift - thing we wrote over JSL $09AD58 ; GiveRupeeGift - thing we wrote over
PHA : LDA #$01 : STA !REDRAW : PLA PHA : LDA.b #$01 : STA.l RedrawFlag : PLA
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
MaybeMarkDigSpotCollected: MaybeMarkDigSpotCollected:
PHA : PHP PHA : PHP
LDA $1B : BNE + LDA.b IndoorsFlag : BNE +
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $8A LDA.b OverworldIndex
CMP.w #$2A : BNE + CMP.w #$2A : BNE +
LDA HasGroveItem : ORA.w #$0001 : STA HasGroveItem LDA.l HasGroveItem : ORA.w #$0001 : STA.l HasGroveItem
+ +
PLP : PLA PLP : PLA
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
macro GetPossiblyEncryptedItem(ItemLabel,TableLabel) macro GetPossiblyEncryptedItem(ItemLabel,TableLabel)
LDA IsEncrypted : BNE ?encrypted LDA.l IsEncrypted : BNE ?encrypted
LDA.l <ItemLabel> LDA.l <ItemLabel>
BRA ?done BRA ?done
?encrypted: ?encrypted:
PHX : PHP PHX : PHP
REP #$30 ; set 16-bit accumulator & index registers REP #$30 ; set 16-bit accumulator & index registers
LDA $00 : PHA : LDA $02 : PHA LDA.b Scrap00 : PHA : LDA.b Scrap02 : PHA
LDA.w #<TableLabel> : STA $00 LDA.w #<TableLabel> : STA.b Scrap00
LDA.w #<TableLabel>>>16 : STA $02 LDA.w #<TableLabel>>>16 : STA.b Scrap02
LDA.w #<ItemLabel>-<TableLabel> LDA.w #<ItemLabel>-<TableLabel>
JSL RetrieveValueFromEncryptedTable JSL RetrieveValueFromEncryptedTable
PLX : STX $02 : PLX : STX $01 PLX : STX.b Scrap02 : PLX : STX.b Scrap01
PLP : PLX PLP : PLX
?done: ?done:
endmacro endmacro
@@ -222,7 +192,7 @@ endmacro
LoadIndoorValue: LoadIndoorValue:
PHP PHP
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way LDA.b RoomIndex ; these are all decimal because i got them that way
CMP.w #225 : BNE + CMP.w #225 : BNE +
%GetPossiblyEncryptedItem(HeartPiece_Forest_Thieves, HeartPieceIndoorValues) %GetPossiblyEncryptedItem(HeartPiece_Forest_Thieves, HeartPieceIndoorValues)
JMP .done JMP .done
@@ -233,7 +203,7 @@ LoadIndoorValue:
%GetPossiblyEncryptedItem(HeartPiece_Spectacle_Cave, HeartPieceIndoorValues) %GetPossiblyEncryptedItem(HeartPiece_Spectacle_Cave, HeartPieceIndoorValues)
JMP .done JMP .done
+ CMP.w #283 : BNE + + CMP.w #283 : BNE +
LDA $22 : XBA : AND.w #$0001 ; figure out where link is LDA.b LinkPosX : XBA : AND.w #$0001 ; figure out where link is
BNE ++ BNE ++
%GetPossiblyEncryptedItem(HeartPiece_Circle_Bushes, HeartPieceIndoorValues) %GetPossiblyEncryptedItem(HeartPiece_Circle_Bushes, HeartPieceIndoorValues)
JMP .done JMP .done
@@ -247,7 +217,7 @@ LoadIndoorValue:
%GetPossiblyEncryptedItem(HeartPiece_Smith_Pegs, HeartPieceIndoorValues) %GetPossiblyEncryptedItem(HeartPiece_Smith_Pegs, HeartPieceIndoorValues)
JMP .done JMP .done
+ CMP.w #135 : BNE + + CMP.w #135 : BNE +
LDA StandingKey_Hera LDA.l StandingKey_Hera
JMP .done JMP .done
+ +
LDA.w #$0017 ; default to a normal hp LDA.w #$0017 ; default to a normal hp
@@ -267,9 +237,9 @@ RTL
LoadOutdoorValue: LoadOutdoorValue:
PHP PHP
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $8A LDA.b OverworldIndex
CMP.w #$03 : BNE + CMP.w #$03 : BNE +
LDA $22 : CMP.w #1890 : !BLT ++ LDA.b LinkPosX : CMP.w #1890 : !BLT ++
%GetPossiblyEncryptedItem(HeartPiece_Spectacle, HeartPieceOutdoorValues) %GetPossiblyEncryptedItem(HeartPiece_Spectacle, HeartPieceOutdoorValues)
JMP .done JMP .done
++ ++
@@ -285,7 +255,7 @@ LoadOutdoorValue:
%GetPossiblyEncryptedItem(HauntedGroveItem, HeartPieceOutdoorValues) %GetPossiblyEncryptedItem(HauntedGroveItem, HeartPieceOutdoorValues)
JMP .done JMP .done
+ CMP.w #$30 : BNE + + CMP.w #$30 : BNE +
LDA $22 : CMP.w #512 : !BGE ++ LDA.b LinkPosX : CMP.w #512 : !BGE ++
%GetPossiblyEncryptedItem(HeartPiece_Desert, HeartPieceOutdoorValues) %GetPossiblyEncryptedItem(HeartPiece_Desert, HeartPieceOutdoorValues)
JMP .done JMP .done
++ ++
@@ -335,7 +305,7 @@ LoadHeartContainerRoomValue:
LoadBossValue: LoadBossValue:
PHP PHP
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way LDA.b RoomIndex ; these are all decimal because i got them that way
CMP.w #200 : BNE + CMP.w #200 : BNE +
%GetPossiblyEncryptedItem(HeartContainer_ArmosKnights, HeartContainerBossValues) %GetPossiblyEncryptedItem(HeartContainer_ArmosKnights, HeartContainerBossValues)
JMP .done JMP .done
@@ -378,7 +348,7 @@ CheckIfBossRoom:
; Carry set if we're in a boss room, unset otherwise. ; Carry set if we're in a boss room, unset otherwise.
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
REP #$20 ; set 16-bit accumulator REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way LDA.b RoomIndex ; these are all decimal because i got them that way
CMP.w #200 : BEQ .done CMP.w #200 : BEQ .done
CMP.w #51 : BEQ .done CMP.w #51 : BEQ .done
CMP.w #7 : BEQ .done CMP.w #7 : BEQ .done

638
hooks.asm

File diff suppressed because it is too large Load Diff

View File

@@ -9,17 +9,17 @@ PHP
; $7EC026 = When we find an empty item get set on 1 ; $7EC026 = When we find an empty item get set on 1
; $7EC027 = character data ; $7EC027 = character data
LDX #$80 : STX $2100 LDX.b #$80 : STX.w INIDISP
REP #$20 REP #$20
LDA #$6000+$0340 : STA $2116 LDA.w #$6000+$0340 : STA.w VMADDL
LDA.w #$C027 : STA $4342 LDA.w #$C027 : STA.w A1T4L
LDX.b #$7E : STX $4344 LDX.b #$7E : STX.w A1B4
LDA #$0040 : STA $4345 LDA.w #$0040 : STA.w DAS4L
LDA #$1801 : STA $4340 LDA.w #$1801 : STA.w DMAP4
LDX #$10 : STX $420B LDX.b #$10 : STX.w MDMAEN
LDX #$0F : STX $2100 LDX.b #$0F : STX.w INIDISP
PLP PLP
RTL RTL
} }
@@ -28,17 +28,17 @@ RTL
ClearBG: ClearBG:
{ {
PHP PHP
LDX #$80 : STX $2100 LDX.b #$80 : STX.w INIDISP
REP #$20 REP #$20
LDA #$6000+$0340 : STA $2116 LDA.w #$6000+$0340 : STA.w VMADDL
LDA.w #clearTable : STA $4342 LDA.w #clearTable : STA.w A1T4L
LDX.b #clearTable>>16 : STX $4344 LDX.b #clearTable>>16 : STX.w A1B4
LDA #$0040 : STA $4345 LDA.w #$0040 : STA.w DAS4L
LDA #$1801 : STA $4340 LDA.w #$1801 : STA.w DMAP4
LDX #$10 : STX $420B LDX.b #$10 : STX.w MDMAEN
LDX #$0F : STX $2100 LDX.b #$0F : STX.w INIDISP
PLP PLP
RTL RTL
} }

View File

@@ -3,8 +3,8 @@ ShouldOverrideFileLoad:
CPY #$0A ; 0A = Ice/Mire floor file CPY #$0A ; 0A = Ice/Mire floor file
BNE .no BNE .no
LDA $040C ; Dungeon number LDA.w DungeonID ; Dungeon number
CMP #$12 ; Ice Palace CMP.b #$12 ; Ice Palace
BEQ .yes BEQ .yes
.no .no
CLC : RTS CLC : RTS
@@ -13,9 +13,9 @@ ShouldOverrideFileLoad:
BgGraphicsLoading: BgGraphicsLoading:
; Instructions overwritten ; Instructions overwritten
STZ $00 STZ.b Scrap00
STX $01 STX.b Scrap01
STA $02 STA.b Scrap02
JSR ShouldOverrideFileLoad JSR ShouldOverrideFileLoad
BCS .useSpecialIcePalaceFile BCS .useSpecialIcePalaceFile
@@ -25,24 +25,22 @@ BgGraphicsLoading:
; We're loading the floor tiles in Ice Palace. Instead of the normal file, ; We're loading the floor tiles in Ice Palace. Instead of the normal file,
; load another one that replaces the bridge tiles with the Bombos medallion ; load another one that replaces the bridge tiles with the Bombos medallion
;LDA $FFFFFF
LDA.b #IcePalaceFloorGfx>>16 LDA.b #IcePalaceFloorGfx>>16
STA $02 STA.b Scrap02
REP #$20 REP #$20
LDA.w #IcePalaceFloorGfx LDA.w #IcePalaceFloorGfx
STA $00 STA.b Scrap00
LDX.b #64*2 ; Tiles to load * 2 LDX.b #64*2 ; Tiles to load * 2
- -
; Unrolled loop to upload half a tile ; Unrolled loop to upload half a tile
LDA [$00] : STA $2118 : INC $00 : INC $00 LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00
LDA [$00] : STA $2118 : INC $00 : INC $00 LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00
LDA [$00] : STA $2118 : INC $00 : INC $00 LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00
LDA [$00] : STA $2118 : INC $00 : INC $00 LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00
LDA [$00] : STA $2118 : INC $00 : INC $00 LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00
LDA [$00] : STA $2118 : INC $00 : INC $00 LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00
LDA [$00] : STA $2118 : INC $00 : INC $00 LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00
LDA [$00] : STA $2118 : INC $00 : INC $00 LDA.b [$00] : STA.w VMDATAL : INC.b Scrap00 : INC.b Scrap00
DEX DEX
BNE - BNE -
@@ -51,7 +49,7 @@ BgGraphicsLoading:
ReloadingFloors: ReloadingFloors:
SEP #$30 ; 8 AXY SEP #$30 ; 8 AXY
LDA $7EC2F8 ; Floor file that has been decompressed LDA.l LastBGSet ; Floor file that has been decompressed
TAY TAY
JSR ShouldOverrideFileLoad JSR ShouldOverrideFileLoad
REP #$30 ; 16 AXY REP #$30 ; 16 AXY
@@ -76,6 +74,6 @@ ReloadingFloors:
; Pretend that we ran the original routine ; Pretend that we ran the original routine
LDX.w #$0800 LDX.w #$0800
LDA.w #$6600 LDA.w #$6600
STA $03 STA.b Scrap03
JML ReloadingFloorsCancel JML ReloadingFloorsCancel

View File

@@ -5,57 +5,57 @@
; called and it only gets called once ever during RESET. ; called and it only gets called once ever during RESET.
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
Init_Primary: Init_Primary:
LDA #$00 LDA.b #$00
LDX #$00 ; initalize our ram LDX.b #$00 ; initalize our ram
- -
STA $7EC025, X STA.l $7EC025, X
STA $7F5000, X STA.l $7F5000, X
INX INX
CPX #$10 : !BLT - CPX.b #$10 : !BLT -
LDX #$10 ; initalize more ram LDX.b #$10 ; initalize more ram
- -
STA $7F5000, X STA.l $7F5000, X
INX INX
CPX #$FF : !BLT - CPX.b #$FF : !BLT -
LDX #$00 LDX.b #$00
- -
LDA RomNameSRAM, X : CMP $00FFC0, X : BNE .clear LDA.l RomNameSRAM, X : CMP.w $FFC0, X : BNE .clear
INX INX
CPX #$15 : !BLT - CPX.b #$15 : !BLT -
BRA .done BRA .done
.clear .clear
REP #$30 ; set 16-bit accumulator & index registers REP #$30 ; set 16-bit accumulator & index registers
LDA.w #$0000 LDA.w #$0000
- -
STA $700000, X STA.l $700000, X
INX INX
CPX #$2000 : !BLT - CPX.w #$2000 : !BLT -
SEP #$30 ; set 8-bit accumulator & index registers SEP #$30 ; set 8-bit accumulator & index registers
LDX #$00 LDX.b #$00
- -
LDA $00FFC0, X : STA RomNameSRAM, X LDA.w $FFC0, X : STA.l RomNameSRAM, X
INX INX
CPX #$15 : !BLT - CPX #$15 : !BLT -
LDX #$00 LDX.b #$00
- -
LDA RomVersion, X : STA RomVersionSRAM, X LDA.w RomVersion, X : STA.l RomVersionSRAM, X
INX INX
CPX #$04 : !BLT - CPX.b #$04 : !BLT -
.done .done
REP #$20 REP #$20
LDA.l OneMindTimer : STA.l !ONEMIND_TIMER LDA.l OneMindTimerInit : STA.l OneMindTimerRAM
SEP #$20 SEP #$20
LDA.b #$01 : STA $420D ; enable fastrom access on upper banks LDA.b #$01 : STA.w MEMSEL ; enable fastrom access on upper banks
STA.l !ONEMIND_ID STA.l OneMindId
LDA.b #$10 : STA $BC ; set default player sprite bank LDA.b #$10 : STA.b PlayerSpriteBank ; set default player sprite bank
LDA.b #$81 : STA $4200 ; thing we wrote over, turn on NMI & gamepad LDA.b #$81 : STA.w NMITIMEN ; thing we wrote over, turn on NMI & gamepad
RTL RTL
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Init_PostRAMClear ; Init_PostRAMClear

View File

@@ -20,7 +20,7 @@ InitRoomDataWRAM:
org $30B060 ; PC 0x183060 org $30B060 ; PC 0x183060
InitATAltarRoom: dw $0000 ; aga curtains InitATAltarRoom: dw $0000 ; aga curtains
org $30B092 ; PC 0x183092 org $30B092 ; PC 0x183092
InitSWBackEntryRoom: dw $0000 ; skull woods curtains (?) InitSWBackEntryRoom: dw $0000 ; skull woods curtains
org $30B20C org $30B20C
dw $F000, $F000 ; Pre-open kak bomb hut & brewery dw $F000, $F000 ; Pre-open kak bomb hut & brewery

File diff suppressed because it is too large Load Diff

View File

@@ -35,7 +35,7 @@ Overworld_CreatePyramidHoleModified:
JSL C9DE_LONG JSL C9DE_LONG
JSL C9DE_LONG JSL C9DE_LONG
LDA.w #$FFFF : STA $1012, Y LDA.w #$FFFF : STA.w GFXStripes+$12, Y
JMP .ending JMP .ending
.originalBehaviour .originalBehaviour
@@ -64,33 +64,33 @@ Overworld_CreatePyramidHoleModified:
JSL C9DE_LONG JSL C9DE_LONG
JSL C9DE_LONG JSL C9DE_LONG
LDA.w #$FFFF : STA $1012, Y LDA.w #$FFFF : STA.w GFXStripes+$12, Y
.ending .ending
LDA.w #$3515 : STA $012D LDA.w #$3515 : STA.w SFX1
SEP #$30 SEP #$30
LDA OverworldEventDataWRAM+$5B : ORA.b #$20 : STA OverworldEventDataWRAM+$5B LDA.l OverworldEventDataWRAM+$5B : ORA.b #$20 : STA.l OverworldEventDataWRAM+$5B
LDA.b #$03 : STA $012F LDA.b #$03 : STA.w SFX3
LDA.b #$01 : STA $14 LDA.b #$01 : STA.b NMISTRIPES
RTL RTL
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
Draw_PyramidOverlay: Draw_PyramidOverlay:
LDA.l InvertedMode : AND.w #$00FF : BNE .done LDA.l InvertedMode : AND.w #$00FF : BNE .done
.normal .normal
LDA.w #$0E39 : STA $23BC LDA.w #$0E39 : STA.w $23BC
INC A : STA $23BE INC A : STA.w $23BE
INC A : STA $23C0 INC A : STA.w $23C0
INC A : STA $243C INC A : STA.w $243C
INC A : STA $243E INC A : STA.w $243E
INC A : STA $2440 INC A : STA.w $2440
INC A : STA $24BC INC A : STA.w $24BC
INC A : STA $24BE INC A : STA.w $24BE
INC A : STA $24C0 INC A : STA.w $24C0
.done .done
RTL RTL
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
@@ -130,43 +130,44 @@ db $02, $02, $02, $00, $08, $02, $02, $00, $00, $00, $00, $01, $00, $00, $20, $0
db $02, $02, $02, $02, $02, $02, $02, $00, $00, $01, $01, $01, $02, $00, $08, $00 db $02, $02, $02, $02, $02, $02, $02, $00, $00, $01, $01, $01, $02, $00, $08, $00
Electric_Barrier: Electric_Barrier:
LDA InvertedMode : BEQ .done LDA.l InvertedMode : BEQ .done
LDA OverworldEventDataWRAM, X : ORA #$40 : STA OverworldEventDataWRAM, X ;set barrier dead LDA.l OverworldEventDataWRAM, X : ORA.b #$40 : STA.l OverworldEventDataWRAM, X ;set barrier dead
.done .done
LDA OverworldEventDataWRAM, X ; what we wrote over LDA.l OverworldEventDataWRAM, X ; what we wrote over
RTL RTL
GanonTowerAnimation: GanonTowerAnimation:
LDA InvertedMode : BEQ .done LDA.l InvertedMode : BEQ .done
LDA.b #$1B : STA $012F LDA.b #$1B : STA.w SFX3
STZ $04C6 STZ.w OWEntranceCutscene
STZ $B0 STZ.b SubSubModule
STZ $0710 STZ.w SkipOAM
STZ $02E4 STZ.w CutsceneFlag
STZ $0FC1 STZ.w FreezeSprites
STZ $011A STZ.w BG1ShakeV
STZ $011B STZ.w BG1ShakeV+1
STZ $011C STZ.w BG1ShakeH
STZ $011D STZ.w BG1ShakeH+1
LDA.b #$02 : STA $012C LDA.b #$02 : STA.w MusicControlRequest
LDA.b #$09 : STA $012D LDA.b #$09 : STA.w SFX1
RTL RTL
.done
LDA.b #$05 : STA $04C6 ;what we wrote over .done
STZ $B0 ; (continued) LDA.b #$05 : STA.w OWEntranceCutscene ; what we wrote over
STZ $C8 ; (continued) STZ.b SubSubModule ; (continued)
STZ.b ScrapBufferBD+$0B ; (continued)
RTL RTL
GanonTowerInvertedCheck: GanonTowerInvertedCheck:
{ {
LDA InvertedMode : BEQ .done LDA.l InvertedMode : BEQ .done
LDA #$01 ; Load a random value so it doesn't BEQ LDA.b #$01 ; Load a random value so it doesn't BEQ
RTL RTL
.done .done
LDA $8A : CMP.b #$43 ;what we wrote over LDA.b OverworldIndex : CMP.b #$43 ;what we wrote over
RTL RTL
} }
@@ -174,14 +175,14 @@ GanonTowerInvertedCheck:
;Hard coded rock removed in LW for Inverted mode ;Hard coded rock removed in LW for Inverted mode
HardcodedRocks: HardcodedRocks:
LDA InvertedMode : AND.w #$00FF : BEQ .normalrocks LDA.l InvertedMode : AND.w #$00FF : BEQ .normalrocks
BRA .noRock2 BRA .noRock2
.normalrocks .normalrocks
LDA.w #$020F : LDX $8A : CPX.w #$0033 : BNE .noRock LDA.w #$020F : LDX.b OverworldIndex : CPX.w #$0033 : BNE .noRock
STA $7E22A8 STA.l $7E22A8
.noRock .noRock
CPX.w #$002F : BNE .noRock2 CPX.w #$002F : BNE .noRock2
STA $7E2BB2 STA.l $7E2BB2
.noRock2 .noRock2
RTL RTL
@@ -194,44 +195,44 @@ TurtleRockPegSolved:
RTL RTL
MirrorBonk: MirrorBonk:
; must preserve X/Y, and must preserve $00-$0F ; must preserve X/Y, and must preserve $00-$0F
LDA.l InvertedMode : BEQ .normal LDA.l InvertedMode : BEQ .normal
; Goal: use $20 and $22 to decide to force a bonk ; Goal: use $20 and $22 to decide to force a bonk
; if we want to bonk branch to .forceBonk ; if we want to bonk branch to .forceBonk
; otherwise fall through to .normal ; otherwise fall through to .normal
PHX : PHP PHX : PHP
PHB : PHK : PLB PHB : PHK : PLB
LDA $8A : AND.b #$40 : BEQ .endLoop ;World we're in? branch if we are in LW we don't want bonks LDA.b OverworldIndex : AND.b #$40 : BEQ .endLoop ;World we're in? branch if we are in LW we don't want bonks
REP #$30 REP #$30
LDX #$0000 LDX.w #$0000
.loop .loop
LDA.l .bonkRectanglesTable, X ;Load X1 LDA.l .bonkRectanglesTable, X ;Load X1
CMP $22 : !BGE ++ CMP.b LinkPosX : !BGE ++
;IF X > X1 ;IF X > X1
LDA.l .bonkRectanglesTable+2, X ; Load X2 LDA.l .bonkRectanglesTable+2, X ; Load X2
CMP $22 : !BLT ++ CMP.b LinkPosX : !BLT ++
;IF X < X2 ;IF X < X2
LDA.l .bonkRectanglesTable+4, X ;Load Y1 LDA.l .bonkRectanglesTable+4, X ;Load Y1
CMP $20 : !BGE ++ CMP.b LinkPosY : !BGE ++
;IF Y > Y1 ;IF Y > Y1
LDA.l .bonkRectanglesTable+6, X ; Load Y2 LDA.l .bonkRectanglesTable+6, X ; Load Y2
CMP $20 : !BLT ++ CMP.b LinkPosY : !BLT ++
;IF Y < Y2 ;IF Y < Y2
;Bonk Here ;Bonk Here
PLB : PLP : PLX PLB : PLP : PLX
BRA .forceBonk BRA .forceBonk
++ ++
TXA : !ADD #$0008 : CMP #.tableEnd-.bonkRectanglesTable : BEQ .endLoop TXA : !ADD #$0008 : CMP.w #.tableEnd-.bonkRectanglesTable : BEQ .endLoop
TAX TAX
BRA .loop BRA .loop
.endbonkRectanglesTable .endbonkRectanglesTable
.endLoop .endLoop
PLB : PLP : PLX PLB : PLP : PLX
.normal .normal
;Not forcing a bonk, so the vanilla bonk detection run. ;Not forcing a bonk, so the vanilla bonk detection run.
LDA $0C : ORA $0E LDA.b Scrap0C : ORA.b Scrap0E
JML.l MirrorBonk_NormalReturn JML.l MirrorBonk_NormalReturn
.forceBonk .forceBonk
JML.l MirrorBonk_BranchGamma JML.l MirrorBonk_BranchGamma

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,9 @@
;Statically mapped at $A1A000 Referenced by the front end. Do not move without coordination. ;Statically mapped at $A1A000 Referenced by the front end. Do not move without coordination.
InvertedTileAttributeLookup: InvertedTileAttributeLookup:
SEP #$20 SEP #$20
LDA $8A : CMP.b #$47 : BEQ .turtleRock LDA.b OverworldIndex : CMP.b #$47 : BEQ .turtleRock
LDA Overworld_TileAttr, X LDA.l Overworld_TileAttr, X
JML.l Overworld_GetTileAttrAtLocation_continue JML.l Overworld_GetTileAttrAtLocation_continue
.turtleRock .turtleRock
LDA Inverted_TR_TileAttributes, X LDA.l Inverted_TR_TileAttributes, X
JML.l Overworld_GetTileAttrAtLocation_continue JML.l Overworld_GetTileAttrAtLocation_continue

View File

@@ -32,7 +32,7 @@ ItemDowngradeFixMain:
CPY.b #$00 : BEQ .isUncleSwordShield ; Fighter's Sword & Shield CPY.b #$00 : BEQ .isUncleSwordShield ; Fighter's Sword & Shield
.done .done
STA [$00] ; thing we wrote over part 2 STA.b [Scrap00] ; thing we wrote over part 2
.dontWrite .dontWrite
RTS RTS
.isPowerGloves .isPowerGloves
@@ -41,8 +41,8 @@ RTS
.isBlueBoomerang .isBlueBoomerang
.isBow .isBow
.isBowAndArrows .isBowAndArrows
CMP [$00] : !BGE .done ; finished if we're upgrading CMP.b [$00] : !BGE .done ; finished if we're upgrading
LDA [$00] ; reload old value LDA.b [$00] ; reload old value
RTS RTS
.isSilverArrowBow .isSilverArrowBow
.isRedBoomerang .isRedBoomerang
@@ -51,31 +51,31 @@ RTS
.isShovel .isShovel
.isMushroom .isMushroom
PHA PHA
LDA [$00] : BNE + ; don't upgrade if we already have the toggle for it LDA.b [Scrap00] : BNE + ; don't upgrade if we already have the toggle for it
PLA PLA
STA [$00] STA.b [Scrap00]
RTS RTS
+ +
PLA PLA
RTS RTS
.isSword .isSword
PHA PHA
LDA HighestSword : STA $04 LDA.l HighestSword : STA.b Scrap04
TYA ; load sword item TYA ; load sword item
CMP.b #$49 : BNE + : LDA.b #$00 : + ; convert extra fighter's sword to normal one CMP.b #$49 : BNE + : LDA.b #$00 : + ; convert extra fighter's sword to normal one
CMP.b #$50 : BNE + : LDA.b #$01 : + ; convert extra master sword to normal one CMP.b #$50 : BNE + : LDA.b #$01 : + ; convert extra master sword to normal one
INC : CMP $04 : !BGE + ; skip if highest is lower (this is an upgrade) INC : CMP.b Scrap04 : !BGE + ; skip if highest is lower (this is an upgrade)
LDA $04 : DEC ; convert to item id LDA.b Scrap04 : DEC ; convert to item id
TAY : PLA : LDA $04 ; put sword id into the thing to write TAY : PLA : LDA.b Scrap04 ; put sword id into the thing to write
JMP .done JMP .done
+ +
PLA PLA
JMP .done JMP .done
.isUncleSwordShield .isUncleSwordShield
PHA PHA
LDA HighestSword : STA [$00] ; already set to 1 if we had no sword, always keep highest LDA.l HighestSword : STA.b [Scrap00] ; already set to 1 if we had no sword, always keep highest
INC $00 INC.b Scrap00
LDA HighestShield : STA [$00] LDA.l HighestShield : STA.b [Scrap00]
PLA PLA
RTS RTS
;================================================================================ ;================================================================================

View File

@@ -4,39 +4,39 @@
; Output: 0 for darkness, 1 for lamp cone ; Output: 0 for darkness, 1 for lamp cone
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
LampCheck: LampCheck:
LDA $7F50C4 : CMP.b #$01 : BNE + : RTL : + LDA.l LightConeModifier : CMP.b #$01 : BNE + : RTL : +
CMP.b #$FF : BNE + : INC : RTL : + CMP.b #$FF : BNE + : INC : RTL : +
LDA.l LampEquipment : BNE .lamp ; skip if we already have lantern
LDA LampEquipment : BNE .done ; skip if we already have lantern LDA.w DungeonID : BNE + ; check if we're in sewers
LDA.l LampConeSewers : RTL
LDA CurrentWorld : BNE + + : TDC
.lightWorld .lamp
LDA $040C : BNE ++ ; check if we're in sewers
LDA LampConeSewers : BRA .done
++
LDA LampConeLightWorld : BRA .done
+
.darkWorld
LDA LampConeDarkWorld
.done
;BNE + : STZ $1D : + ; remember to turn cone off after a torch
RTL RTL
;================================================================================ ;================================================================================
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
; Output: 0 locked, 1 open ; Output: 0 locked, 1 open
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
CheckForZelda: CheckForZelda:
LDA.l ProgressIndicator : CMP.b #$02 : !BLT + ; Skip if rain is falling LDA.l ProgressIndicator : CMP.b #$02 : !BLT + ; Skip if rain is falling
LDA.b #$01 ; pretend we have zelda anyway LDA.b #$01 ; pretend we have zelda anyway
RTL RTL
+ +
LDA FollowerIndicator LDA.l FollowerIndicator
RTL RTL
;================================================================================ ;================================================================================
;--------------------------------------------------------------------------------
SetOverlayIfLamp: SetOverlayIfLamp:
JSL.l LampCheck JSL.l LampCheck
STA $1D ; write it directly to the overlay, this isn't a terrible idea at all STA.b SUBDESQ ; write it directly to the overlay, this isn't a terrible idea at all
RTL RTL
;================================================================================ ;================================================================================
;LDA CurrentWorld : EOR #$40 : LSR #6 : AND #$01 ; return the same result as having the lantern in the light world ; Mantle Object Changes
;--------------------------------------------------------------------------------
Mantle_CorrectPosition:
LDA.l ProgressFlags : AND.b #$04 : BEQ +
LDA.b #$0A : STA.w SpritePosXLow, X ; just spawn it off to the side where we know it should be
LDA.b #$03 : STA.w SpritePosXHigh, X
LDA.b #$90 : STA.w SpriteSpawnStep, X
+
LDA.w SpritePosYLow, X : !ADD.b #$03 ; thing we did originally
RTL
;--------------------------------------------------------------------------------

View File

@@ -6,20 +6,13 @@
; MaidenCrystalScript ; MaidenCrystalScript
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
MaidenCrystalScript: MaidenCrystalScript:
LDA.b #$00 : STA $7F5091 LDA.b #$00 : STA.l BusyItem
STZ $02D8 STZ.w ItemReceiptID
STZ $02DA STZ.w ItemReceiptPose
STZ $2E STZ.b LinkAnimationStep
LDA #$02 : STA $2F LDA.b #$02 : STA.w LinkDirection
LDA.l CrystalsField : AND.b #$7F : CMP.b #$7F : BNE + ; check if we have all crystals
; Load the dungeon index. Is it the Dark Palace? LDA.b #$08 : STA.l MapIcons ; Update the map icon to just be Ganon's Tower
;LDA $040C : !SUB.b #$0A : TAY : CPY.b #$02 : BNE +
; LDA MapIcons : CMP.b #$07 : BCS ++ : LDA.b #$07 : STA MapIcons : ++
;+
LDA CrystalsField : AND.b #$7F : CMP.b #$7F : BNE + ; check if we have all crystals
LDA.b #$08 : STA MapIcons ; Update the map icon to just be Ganon's Tower
+ +
JML.l $1ECF35 ; <- F4F35 - sprite_crystal_maiden.asm : 426 JML.l $1ECF35 ; <- F4F35 - sprite_crystal_maiden.asm : 426
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------

Some files were not shown because too many files have changed in this diff Show More