initial checkin

This commit is contained in:
Karkat
2017-05-17 13:00:32 -04:00
parent 81b12bde40
commit f755a63925
78 changed files with 11500 additions and 21 deletions

BIN
99ff1_bombos.gfx Executable file

Binary file not shown.

BIN
99ff1_quake.gfx Executable file

Binary file not shown.

21
LICENSE
View File

@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2017 Karkat
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,424 @@
;================================================================================
; The Legend of Zelda, A Link to the Past - Randomizer General Development & Bugfixes
;================================================================================
lorom
;================================================================================
;org $00FFC0 ; <- 7FC0 - Bank00.asm : 9173 (db "THE LEGEND OF ZELDA " ; 21 bytes)
;db #$23, $4E
org $00FFD5 ; <- 7FD5 - Bank00.asm : 9175 (db $20 ; rom layout)
;db #$35 ; set fast exhirom
db #$30 ; set fast lorom
;org $00FFD6 ; <- 7FD6 - Bank00.asm : 9176 (db $02 ; cartridge type)
;db #$55 ; enable S-RTC
org $00FFD7 ; <- 7FD7 - Bank00.asm : 9177 (db $0A ; rom size)
db #$0B ; mark rom as 16mbit
org $00FFD8 ; <- 7FD8 - Bank00.asm : 9178 (db $03 ; ram size (sram size))
db #$07 ; mark sram as 128k
org $3FFFFF ; <- 1FFFFF
db #$00 ; expand file to 2mb
;================================================================================
!ADD = "CLC : ADC"
!SUB = "SEC : SBC"
!BLT = "BCC"
!BGE = "BCS"
!NPC_FLAGS = "$7EF410"
!NPC_FLAGS_2 = "$7EF411"
!INVENTORY_SWAP = "$7EF412"
!HUD_FLAG = "$7EF416" ; --h- ----
!PROGRESSIVE_SHIELD = "$7EF416" ; ss-- ----
!INVENTORY_SWAP_2 = "$7EF414"
!MAP_ZOOM = "$7EF415"
!HAS_GROVE_ITEM = "$7EF416" ; ---- ---g general flags, don't waste these
!HIGHEST_SWORD_LEVEL = "$7EF417" ; --- -sss
!FRESH_FILE_MARKER = "$7EF4F0" ; zero if fresh file
!SRAM_SINK = "$7EF41E" ; <- change this
;$7EF41A[w] - Programmable Item #1
;$7EF41C[w] - Programmable Item #3
;$7EF41E[w] - Programmable Item #3
;$7EF420 - $7EF44F - Stat Tracking Bank 1
;$7EF450 - $7EF45F - RNG Item (Single) Flags
;$7EF460 - Goal Item Counter
!MS_GOT = "$7F5031"
!DARK_WORLD = "$7EF3CA"
!REDRAW = "$7F5000"
!GANON_WARP_CHAIN = "$7F5032";
!FORCE_HEART_SPAWN = "$7F5033";
!SKIP_HEART_SAVE = "$7F5034";
;================================================================================
incsrc hooks.asm
incsrc treekid.asm
;org $208000 ; bank #$20
org $A08000 ; bank #$A0
incsrc itemdowngrade.asm
incsrc bugfixes.asm
incsrc darkworldspawn.asm
incsrc lampmantlecone.asm
incsrc floodgatesoftlock.asm
incsrc heartpieces.asm
incsrc npcitems.asm
incsrc utilities.asm
incsrc flipperkill.asm
incsrc previewdatacopy.asm
incsrc pendantcrystalhud.asm
incsrc potions.asm
incsrc shopkeeper.asm
incsrc bookofmudora.asm
incsrc crypto.asm
incsrc tablets.asm
incsrc rupeelimit.asm
incsrc fairyfixes.asm
incsrc rngfixes.asm
incsrc medallions.asm
incsrc inventory.asm
incsrc ganonfixes.asm
incsrc maidencrystals.asm
incsrc zoraking.asm
incsrc catfish.asm
incsrc flute.asm
incsrc dungeondrops.asm
incsrc halfmagicbat.asm
incsrc newitems.asm
incsrc swordswap.asm
incsrc stats.asm
incsrc scratchpad.asm
incsrc map.asm
incsrc dialog.asm
incsrc events.asm
incsrc entrances.asm
incsrc clock.asm
incsrc accessability.asm
incsrc heartbeep.asm
incsrc capacityupgrades.asm
incsrc hud.asm
incsrc timer.asm
incsrc glitched.asm
incsrc hardmode.asm
incsrc goalitem.asm
incsrc compasses.asm
incsrc hashalphabet.asm ; <- TAKE OUT THE EXTRA ORGS IN HERE - THIS IS WHY WE COULDN'T ADD MORE FILES EARLIER
warnpc $A18000
incsrc translations.asm
org $A18000 ; static mapping area
incsrc framehook.asm
warnpc $A19000
org $A1FF00 ; static mapping area
incsrc init.asm
org $A48000 ; code bank - PUT NEW CODE HERE
incsrc openmode.asm
;org $228000 ; contrib area
org $A28000 ; contrib area
incsrc contrib.asm
org $A38000
incsrc stats/main.asm
;incsrc sandbox.asm
org $308000 ; bank #$30
incsrc tables.asm
org $318000 ; bank #$31
GFX_Mire_Bombos:
incbin 99ff1_bombos.gfx
warnpc $318800
org $318800
GFX_Mire_Quake:
incbin 99ff1_quake.gfx
warnpc $319000
org $319000
GFX_TRock_Bombos:
incbin a6fc4_bombos.gfx
warnpc $319800
org $319800
GFX_TRock_Ether:
incbin a6fc4_ether.gfx
warnpc $31A000
org $31A000
GFX_HUD_Items:
incbin c2807_v3.gfx
warnpc $31A800
org $31A800
GFX_New_Items:
incbin newitems.gfx
warnpc $31B000
org $31B000
GFX_HUD_Main:
incbin c2e3e.gfx
warnpc $31B800
org $31B800
GFX_Hash_Alphabet:
incbin hashalphabet.chr.gfx
warnpc $31C001
org $338000
GFX_HUD_Palette:
incbin hudpalette.pal
warnpc $348000
org $320000
Extra_Text_Table:
incsrc externalhooks.asm
;================================================================================
org $2F8000 ; PC 0x178000
Static_RNG:
warnpc $2F8400
;================================================================================
;bank $3A reserved for downstream use (Plandomizer)
;bank $3B reserved for downstream use (Plandomizer)
;bank $3F reserved for internal debugging
;$7F5700 - $7F57FF reserved for downstream use
;================================================================================
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
;
;;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
db GFX_HUD_Items>>16
org $00D17B ; 0x517B - HUD Items M
db GFX_HUD_Items>>8
org $00D25A ; 0x525A - HUD Items L
db GFX_HUD_Items
; this used to be a pointer to a dummy file
org $00D065 ; 005065 - New Items H
db GFX_New_Items>>16
org $00D144 ; 005114 - New Items M
db GFX_New_Items>>8
org $00D223 ; 005223 - New Items L
db GFX_New_Items
org $00D09D ; 0x509D - HUD Main H
db GFX_HUD_Main>>16
org $00D17C ; 0x517C - HUD Main M
db GFX_HUD_Main>>8
org $00D25B ; 0x525B - HUD Main L
db GFX_HUD_Main
;================================================================================
org $008333
Vram_EraseTilemaps_triforce:
org $00893D
EnableForceBlank:
org $00D308
DecompSwordGfx:
org $00D348
DecompShieldGfx:
org $00D51B
GetAnimatedSpriteTile:
org $00D52D
GetAnimatedSpriteTile_variable:
org $00E529
LoadSelectScreenGfx:
org $00F945
PrepDungeonExit:
org $00FDEE
Mirror_InitHdmaSettings:
org $01873A
Dungeon_LoadRoom:
org $02A0A8
Dungeon_SaveRoomData:
org $02A0BE
Dungeon_SaveRoomData_justKeys:
org $02B861
Dungeon_SaveRoomQuadrantData:
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 $05E219
Sprite_ShowMessageUnconditional:
org $05FA8E
Sprite_ShowMessageMinimal:
org $06DC5C
Sprite_DrawShadowLong:
org $06DD40
DashKey_Draw:
org $06DBF8
Sprite_PrepAndDrawSingleLargeLong:
org $06DC00
Sprite_PrepAndDrawSingleSmallLong:
org $06EAA6
Sprite_DirectionToFacePlayer:
org $06F12F
Sprite_CheckDamageToPlayerSameLayerLong:
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 $08F710
Ancilla_SetOam_XY_Long:
org $0985E2 ; (break on $0985E4)
AddReceivedItem:
org $0993DF
AddDashTremor:
org $09AD58
GiveRupeeGift:
org $1CFD69
Main_ShowTextMessage:
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 $0DBB8A
Sound_SetSfx3PanLong:
org $0DDB7F
HUD_RefreshIconLong:
org $0DE01E ; 6E10E - equipment.asm : 787
BottleMenu_movingOn:
org $0DE346
RestoreNormalMenu:
org $0DE9C8
DrawProgressIcons: ; this returns short
org $0DED29
DrawEquipment: ; this returns short
org $0EEE10
Messaging_Text:
org $1BED03
Palette_Sword:
org $1BED29
Palette_Shield:
org $1BEDF9
Palette_ArmorAndGloves:
org $1BEE52
Palette_Hud:
org $1DF65D
Sprite_SpawnDynamically:
org $1DFD4B
DiggingGameGuy_AttemptPrizeSpawn:
;================================================================================

BIN
a6fc4_bombos.gfx Executable file

Binary file not shown.

BIN
a6fc4_ether.gfx Executable file

Binary file not shown.

12
accessability.asm Normal file
View File

@@ -0,0 +1,12 @@
;================================================================================
; Accessability 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
;================================================================================

75
bookofmudora.asm Normal file
View File

@@ -0,0 +1,75 @@
;================================================================================
; Randomize Book of Mudora
;--------------------------------------------------------------------------------
LoadLibraryItemGFX:
LDA.l LibraryItem
JSL.l PrepDynamicTile
RTL
;--------------------------------------------------------------------------------
DrawLibraryItemGFX:
PHA
LDA.l LibraryItem
JSL.l DrawDynamicTile
PLA
RTL
;--------------------------------------------------------------------------------
SetLibraryItem:
PHA
LDA LibraryItem : TAY
PLA
JSL.l ItemSet_Library ; contains thing we wrote over
RTL
;--------------------------------------------------------------------------------
;0x0087 - Hera Room w/key
;================================================================================
; Randomize Bonk Keys
;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
;--------------------------------------------------------------------------------
LoadBonkItemGFX:
LDA.b #$08 : STA $0F50, X ; thing we wrote over
LoadBonkItemGFX_inner:
LDA.b #$00 : STA !REDRAW
JSR LoadBonkItem
JSL.l PrepDynamicTile
RTL
;--------------------------------------------------------------------------------
DrawBonkItemGFX:
PHA
LDA !REDRAW : BEQ .skipInit ; skip init if already ready
JSL.l LoadBonkItemGFX_inner
BRA .done ; don't draw on the init frame
.skipInit
JSR LoadBonkItem
JSL.l DrawDynamicTile
.done
PLA
RTL
;--------------------------------------------------------------------------------
GiveBonkItem:
JSR LoadBonkItem
CMP #$24 : BNE .notKey
.key
LDA $7EF36F : INC A : STA $7EF36F
LDA.b #$2F : JSL.l Sound_SetSfx3PanLong
RTL
.notKey
PHY : TAY : JSL.l Link_ReceiveItem : PLY
RTL
;--------------------------------------------------------------------------------
LoadBonkItem:
LDA $A0 ; check room ID - only bonk keys in 2 rooms so we're just checking the lower byte
CMP #115 : BNE + ; Desert Bonk Key
LDA.l BonkKey_Desert
BRA ++
+ : CMP #140 : BNE + ; GTower Bonk Key
LDA.l BonkKey_GTower
BRA ++
+
LDA.b #$24 ; default to small key
++
RTS

20
bugfixes.asm Normal file
View File

@@ -0,0 +1,20 @@
;================================================================================
;--------------------------------------------------------------------------------
AssignKiki:
LDA.b #$00 : STA $7EF3D3 ; defuse bomb
LDA.b #$0A : STA $7EF3CC ; assign kiki as follower
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Name: AllowSQ
; Returns: Accumulator = 0 if S&Q is disallowed, 1 if allowed
;--------------------------------------------------------------------------------
!ITEM_BUSY = "$7F5091"
AllowSQ:
LDA $7EF3C5 : BEQ .done ; thing we overwrote - check if link is in his bed
LDA !ITEM_BUSY : EOR #$01
.done
RTL
;--------------------------------------------------------------------------------

5
build.sh Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/bash
rm ../working.sfc
cp ../alttp.sfc ../working.sfc
./xkas LTTP_RND_GeneralBugfixes.asm ../working.sfc

BIN
c2807_v3.gfx Executable file

Binary file not shown.

BIN
c2e3e.gfx Normal file

Binary file not shown.

42
capacityupgrades.asm Normal file
View File

@@ -0,0 +1,42 @@
;================================================================================
; Capacity Logic
;================================================================================
!BOMB_UPGRADES = "$7EF370"
!BOMB_CURRENT = "$7EF343"
;--------------------------------------------------------------------------------
IncrementBombs:
LDA !BOMB_UPGRADES ; get bomb upgrades
!ADD.l StartingMaxBombs : DEC
CMP !BOMB_CURRENT
!BLT +
LDA !BOMB_CURRENT
CMP.b #99 : !BGE +
INC : STA !BOMB_CURRENT
+
RTL
;--------------------------------------------------------------------------------
!ARROW_UPGRADES = "$7EF371"
!ARROW_CURRENT = "$7EF377"
;--------------------------------------------------------------------------------
IncrementArrows:
LDA !ARROW_UPGRADES ; get arrow upgrades
!ADD.l StartingMaxArrows : DEC
CMP !ARROW_CURRENT
!BLT +
LDA !ARROW_CURRENT
CMP.b #99 : !BGE +
INC : STA !ARROW_CURRENT
+
RTL
;--------------------------------------------------------------------------------
CompareBombsToMax:
LDA !BOMB_UPGRADES ; get bomb upgrades
!ADD.l StartingMaxBombs
CMP !BOMB_CURRENT
RTL
;--------------------------------------------------------------------------------

37
catfish.asm Normal file
View File

@@ -0,0 +1,37 @@
;================================================================================
; Randomize Catfish
;--------------------------------------------------------------------------------
LoadCatfishItemGFX:
LDA.l $1DE185 ; location randomizer writes catfish item to
JSL.l PrepDynamicTile
RTL
;--------------------------------------------------------------------------------
DrawThrownItem:
LDA $8A : CMP.b #$81 : BNE .catfish
.zora
LDA.l $1DE1C3 ; location randomizer writes zora item to
BRA .draw
.catfish
LDA.l $1DE185 ; location randomizer writes catfish item to
.draw
JSL.l DrawDynamicTile
RTL
;--------------------------------------------------------------------------------
MarkThrownItem:
JSL Link_ReceiveItem ; thing we wrote over
LDA $8A : CMP.b #$81 : BNE .catfish
.zora
JSL.l ItemSet_ZoraKing
BRA .done
.catfish
JSL.l ItemSet_Catfish
.done
RTL
;--------------------------------------------------------------------------------

251
clock.asm Normal file
View File

@@ -0,0 +1,251 @@
;--------------------------------------------------------------------------------
; 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:
LDA $FFFFFF
JSL.l Clock_Init
JSL.l Clock_IsSupported
RTL
;--------------------------------------------------------------------------------
; 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 + ; check for clock chip ready signal
CPX.b #$0E : !BLT ++ : CLC : BRA .done : ++ ; if we've read 14 bytes with no success, unset carry and exit
INX
BRA - : +
SEC ; found a clock chip
.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 : BRL .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 : BRL .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
;--------------------------------------------------------------------------------

143
compasses.asm Normal file
View File

@@ -0,0 +1,143 @@
;--------------------------------------------------------------------------------
; $7F5010 - Scratch Space (Callee Preserved)
;--------------------------------------------------------------------------------
!GOAL_COUNTER = "$7EF460"
DrawDungeonCompassCounts:
LDA.l CompassMode : AND.w #$00FF : BNE + : RTL : + ; Item Counts
LDA $1B : AND.w #$00FF : BNE + : RTL : + ; Skip if outdoors
LDA $040C : CMP.w #$00FF : BNE + : RTL : + ; Skip if not in a dungeon
PHX
LDX $040C ; Load dungeon ID to X
LDA $7EF364 : AND .item_masks, X ; Load compass values to A, mask with dungeon item masks
BNE + : BRL .done : + ; skip if we don't have compass
LDA $040C
CMP.w #$0000 : BNE + ; Sewer Passage
+ : CMP.w #$0002 : BNE + ; Hyrule Castle
LDA $7EF434 : AND.w #$00F0 : LSR #4
BRL ++
+ : CMP.w #$0004 : BNE + ; Eastern Palace
LDA $7EF436 : AND.w #$0007
BRL ++
+ : CMP.w #$0006 : BNE + ; Desert Palace
LDA $7EF435 : AND.w #$00E0 : LSR #5
BRL ++
+ : CMP.w #$0008 : BNE + ; Agahnim's Tower
LDA $7EF435 : AND.w #$0002
BRL ++
+ : CMP.w #$000A : BNE + ; Swamp Palace
LDA $7EF439 : AND.w #$000F
BRL ++
+ : CMP.w #$000C : BNE + ; Dark Palace
LDA $7EF434 : AND.w #$000F
BRA ++
+ : CMP.w #$000E : BNE + ; Misery Mire
LDA $7EF438 : AND.w #$000F
BRA ++
+ : CMP.w #$0010 : BNE + ; Skull Woods
LDA $7EF437 : AND.w #$00F0 : LSR #4
BRA ++
+ : CMP.w #$0012 : BNE + ; Ice Palace
LDA $7EF438 : AND.w #$00F0 : LSR #4
BRA ++
+ : CMP.w #$0014 : BNE + ; Tower of Hera
LDA $7EF435 : AND.w #$001C : LSR #5
BRA ++
+ : CMP.w #$0016 : BNE + ; Thieves' Town
LDA $7EF437 : AND.w #$000F
BRA ++
+ : CMP.w #$0018 : BNE + ; Turtle Rock
LDA $7EF439 : AND.w #$00F0 : LSR #4
BRA ++
+ : CMP.w #$001A : BNE + ; Ganon's Tower
LDA $7EF436 : AND.w #$00F8 : LSR #5
BRA ++
+ : ++
JSL.l HexToDec
LDA $7F5006 : AND.w #$00FF : ORA #$2400 : STA $7EC794
LDA $7F5007 : AND.w #$00FF : ORA #$2400 : STA $7EC796
LDA.w #$2830 : STA $7EC798
LDA $040C
CMP.w #$0000 : BNE + ; Sewer Passage
+ : CMP.w #$0002 : BNE + ; Hyrule Castle
LDA.w #$0008
BRL ++
+ : CMP.w #$0004 : BNE + ; Eastern Palace
LDA.w #$0006
BRL ++
+ : CMP.w #$0006 : BNE + ; Desert Palace
LDA.w #$0006
BRL ++
+ : CMP.w #$0008 : BNE + ; Agahnim's Tower
LDA.w #$0002
BRL ++
+ : CMP.w #$000A : BNE + ; Swamp Palace
LDA.w #$000A
BRL ++
+ : CMP.w #$000C : BNE + ; Dark Palace
LDA.w #$000E
BRA ++
+ : CMP.w #$000E : BNE + ; Misery Mire
LDA.w #$0008
BRA ++
+ : CMP.w #$0010 : BNE + ; Skull Woods
LDA.w #$0008
BRA ++
+ : CMP.w #$0012 : BNE + ; Ice Palace
LDA.w #$0008
BRA ++
+ : CMP.w #$0014 : BNE + ; Tower of Hera
LDA.w #$0006
BRA ++
+ : CMP.w #$0016 : BNE + ; Thieves' Town
LDA.w #$0008
BRA ++
+ : CMP.w #$0018 : BNE + ; Turtle Rock
LDA.w #$000C
BRA ++
+ : CMP.w #$001A : BNE + ; Ganon's Tower
LDA.w #$001B
BRA ++
+ : ++
JSL.l HexToDec
LDA $7F5006 : AND.w #$00FF : ORA #$2400 : STA $7EC79A
LDA $7F5007 : AND.w #$00FF : ORA #$2400 : STA $7EC79C
.done
PLX
RTL
.item_masks ; these are dungeon correlations to $7EF364 - $7EF369 so it knows where to store compasses, etc
dw $8000, $4000, $2000, $1000, $0800, $0400, $0200, $0100
dw $0080, $0040, $0020, $0010, $0008, $0004
}
;--------------------------------------------------------------------------------
; $7EF434 - hhhhdddd - item locations checked
; h - hyrule castle
; d - palace of darkness
;--------------------------------------------------------------------------------
; $7EF435 - dddhhhaa - item locations checked
; d - desert palace
; h - tower of hera
; a - agahnim's tower
;--------------------------------------------------------------------------------
; $7EF436 - gggggeee - item locations checked
; g - ganon's tower
; e - eastern palace
;--------------------------------------------------------------------------------
; $7EF437 - sssstttt - item locations checked
; s - skull woods
; t - thieves town
;--------------------------------------------------------------------------------
; $7EF438 - iiiimmmm - item locations checked
; i - ice palace
; m - misery mire
;--------------------------------------------------------------------------------
; $7EF439 - ttttssss - item locations checked
; t - turtle rock
; s - swamp palace
;--------------------------------------------------------------------------------

138
contrib.asm Normal file
View File

@@ -0,0 +1,138 @@
;================================================================
; 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_DirectionToFacePlayer : 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_DirectionToFacePlayer : 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 $7EF3CC
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_DirectionToFacePlayer : 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 #$03 : BEQ .AlcoholicDialog
CMP #$05 : BEQ .SahasrahlaDialogs
CMP #$1C : BEQ .BombShopGuyDialog
BRA .SayNothing
.AlcoholicDialog
JSL DialogAlcoholic : BRA .SayNothing
.SahasrahlaDialogs
JSL DialogSahasrahla : BRA .SayNothing
.BombShopGuyDialog
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
}
;================================================================

284
crypto.asm Normal file
View File

@@ -0,0 +1,284 @@
; $7F50D0 - $7F50FF - Block Cypher Parameters
; $7F5100 - $7F51FF - Block Cypher Buffer
!v = "$7F5100"
!n = "$04"
!MXResult = "$06"
!dpScratch = "$08"
!keyBase = "$7F50D0"
!y = "$7F50E0"
!z = "$7F50E4"
!sum = "$7F50E8"
!p = "$7F50EC"
!rounds = "$05"
!e = "$7F50F0"
!upperScratch = "$7F50F2"
CryptoDelta:
dl #$9e3779b9
macro LSR32(value,k)
LDX.w <k>
?loop:
LDA <value>+2
LSR : STA <value>+2 ; do top part
PHP ; push carry
LDA <value>
LSR ; do bottom part
PLP ; pull carry
BCC ?nc
ORA #$80 ; pull in carry
?nc:
STA <value>
DEX
CPX.w #$0000 : BNE ?loop
endmacro
macro ASL32(value,k)
LDX.w <k>
?loop:
LDA <value>
LSR : STA <value> ; do bottom part
PHP ; push carry
LDA <value>+2
LSR
PLP ; pull carry
ADC.w #$0000
STA <value>+2 ; do top part
DEX
CPX.w #$0000 : BNE ?loop
endmacro
CryptoMX:
PHX
LDA !z : STA !dpScratch
LDA !z+2 : STA !dpScratch+2
%LSR32(!dpScratch,#$05)
LDA !y : STA !dpScratch+4
LDA !y+2 : STA !dpScratch+6
%ASL32(!dpScratch+4,#$02)
LDA !dpScratch : EOR !dpScratch+4 : STA !upperScratch
LDA !dpScratch+2 : EOR !dpScratch+6 : STA !upperScratch+2
;================================
LDA !z : STA !dpScratch
LDA !z+2 : STA !dpScratch+2
%ASL32(!dpScratch,#$04)
LDA !y : STA !dpScratch+4
LDA !y+2 : STA !dpScratch+6
%LSR32(!dpScratch,#$03)
LDA !dpScratch : EOR !dpScratch+4 : STA !upperScratch+4
LDA !dpScratch+2 : EOR !dpScratch+6 : STA !upperScratch+6
;================================
LDA !upperScratch : !ADD !upperScratch+4 : STA !upperScratch
LDA !upperScratch+2 : ADC !upperScratch+6 : STA !upperScratch+2
;================================
LDA !sum : EOR !y : STA !dpScratch
LDA !sum+2 : EOR !y+2 : STA !dpScratch+2
;================================
LDA !p : AND.w #$0003 : EOR !e : ASL #2 : TAX ; put (p&3)^e into X
LDA !keyBase, X : EOR !z : STA !upperScratch+4
LDA !keyBase+2, X : EOR !z+2 : STA !upperScratch+6
;================================
LDA !upperScratch : EOR !upperScratch+4 : STA !MXResult
LDA !upperScratch+2 : EOR !upperScratch+6 : STA !MXResult+2
PLX
RTS
!DIVIDEND_LOW = $4204
!DIVIDEND_HIGH = $4205
!DIVISOR = $4206
!QUOTIENT_LOW = $4214
!QUOTIENT_HIGH = $4215
XXTEA_Decode:
PHP
SEP #$20 ; set 8-bit accumulator
; rounds = 6 + 52/n;
LDA.b #52 : STA !DIVIDEND_LOW ; decimal 52
STZ !DIVIDEND_HIGH
LDA !n : STA !DIVISOR
; NOP #8 ; do something useful here?
LDA.b #$06
NOP #6
!ADD !QUOTIENT_LOW
STA !rounds
; sum = rounds*DELTA;
LDA CryptoDelta : STA !dpScratch
LDA CryptoDelta+1 : STA !dpScratch+1
LDA CryptoDelta+2 : STA !dpScratch+2
LDA CryptoDelta+3 : STA !dpScratch+3
JSR .multiply
LDA !dpScratch
STA !sum
; y = v[0];
REP #$20 ; set 16-bit accumulator
LDA !v : STA !y
LDA !v+2 : STA !y+2
---
LDA !sum : LSR #2 : AND #$03 : STA !e ; e = (sum >> 2) & 3;
LDA !n : !SUB #$01 : STA !p ; for (p=n-1; p>0; p--) {
--
; z = v[p-1];
DEC : ASL #2 : TAX
LDA !v, X : STA !z
LDA !v+2, X : STA !z+2
; y = v[p] -= MX;
JSR CryptoMX
LDA !p : ASL #2 : TAX
LDA !v, X : !SUB !MXResult : STA !v, X : STA !y
LDA !v+2, X : SBC !MXResult+2 : STA !v+2, X : STA !y+2
LDA !p : DEC : STA !p : BNE -- ; }
; z = v[n-1];
LDA !n : DEC : ASL #2 : TAX
LDA !v, X : STA !z
LDA !v+2, X : STA !z+2
; y = v[0] -= MX;
JSR CryptoMX
LDA !v : !SUB !MXResult : STA !v : STA !y
LDA !v+2 : SBC !MXResult+2 : STA !v+2 : STA !y+2
; sum -= DELTA;
LDA !sum : !SUB CryptoDelta : STA !sum
LDA !sum+2 : !SUB CryptoDelta+2 : STA !sum+2
LDA !rounds : BEQ + : BRL --- : + ; } while (--rounds);
PLP
RTL
;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);
; }
.multiply
LDA #$00
STA !upperScratch+4 ;Clear upper half of
STA !upperScratch+5 ;!upperScratchuct
STA !upperScratch+6
STA !upperScratch+7
LDX #$20 ;Set binary count to 32
.shift_r
LSR !dpScratch+3 ;Shift multiplyer right
ROR !dpScratch+2
ROR !dpScratch+1
ROR !dpScratch
BCC .rotate_r ;Go rotate right if c = 0
LDA !upperScratch+4 ;Get upper half of !upperScratchuct
!ADD !rounds ; and add multiplicand to it
STA !upperScratch+4
LDA !upperScratch+5
ADC.w #$00
STA !upperScratch+5
LDA !upperScratch+6
ADC.w #$00
STA !upperScratch+6
LDA !upperScratch+7
ADC.w #$00
.rotate_r
ROR a ;Rotate partial !upperScratchuct
STA !upperScratch+7 ; right
ROR !upperScratch+6
ROR !upperScratch+5
ROR !upperScratch+4
ROR !upperScratch+3
ROR !upperScratch+2
ROR !upperScratch+1
ROR !upperScratch
DEX ;Decrement bit count and
BNE .shift_r ; loop until 32 bits are done
;LDA MULXP1 ;Add dps and put sum in MULXP2
;!ADD MULXP2
;STA MULXP2
RTS
;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)))
;#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);
; }
;}

63
darkworldspawn.asm Normal file
View File

@@ -0,0 +1,63 @@
;================================================================================
; Dark World Spawn Location Fix & Master Sword Grove Fix
;--------------------------------------------------------------------------------
DarkWorldSaveFix:
LDA.b #$70 : PHA : PLB ; thing we wrote over - data bank change
JSL.l DarkWorldFlagSet
JSL.l MasterSwordFollowerClear
JSL.l StatSaveCounter
RTL
;--------------------------------------------------------------------------------
DarkWorldLoadFix:
SEP #$20 ; set 8 bit accumulator
JSL.l OnFileLoad
REP #$20 ; restore 16 bit accumulator
LDA.w #$0007 : STA $7EC00D : STA $7EC013 ; thing we wrote over - sets up some graphics timers
RTL
;--------------------------------------------------------------------------------
DarkWorldFlagSet:
PHA
LDA Bugfix_PreAgaDWDungeonDeathToFakeDW : BEQ +
LDA $10 : CMP #$12 : BEQ .done ; don't do anything in death mode
+
LDA.l Bugfix_MirrorlessSQToLW : BEQ +
LDA $7EF353 : BEQ .noMirror ; check if we have the mirror
+
LDA $7EF3C5 : CMP.b #$03 : !BLT .aga1Alive ; check if agahnim 1 is alive
BRA .done
.noMirror
.aga1Alive
LDA #$00 : STA $7EF3CA ; set flag to light world
;LDA $7EF3CC : CMP #$07 : BNE + : LDA.b #$00 : STA $7EF3CC : + ; clear frog
.done
PLA
RTL
;--------------------------------------------------------------------------------
SetDeathWorldChecked:
PHA
LDA $1B : BEQ + ; skip this for indoors
LDA $040C : CMP #$FF : BNE .done ; unless it's a cave
+
LDA $7EF3C5 : CMP.b #$03 : !BGE .done; thing we originally did - skip if agahnim 1 is dead
LDA $A0 : CMP.b #$00 : BEQ .done ; skip if we died in ganon's room
LDA.b #$00 : STA $7EF3CA : STA $7E0FFF ; set the world to the light world if he's still alive
;LDA $7EF3CC : CMP #$07 : BNE .done : LDA.b #$00 : STA $7EF3CC ; clear dwarf tagalong
.done
PLA
RTL
;--------------------------------------------------------------------------------
MasterSwordFollowerClear:
LDA $7EF3CC
CMP #$0E : BEQ .clear ; clear master sword follower
CMP #$07 : BEQ .clear ; clear frog
;CMP #$08 : BEQ .clear ; clear dwarf - consider flute implications
RTL
.clear
LDA.b #$00 : STA $7EF3CC ; clear follower
RTL
;--------------------------------------------------------------------------------
FixAgahnimFollowers:
LDA.b #$00 : STA $7EF3CC ; clear follower
JSL PrepDungeonExit ; thing we wrote over
RTL
;================================================================================

399
dialog.asm Normal file
View File

@@ -0,0 +1,399 @@
;================================================================================
; Dialog Pointer Override
;--------------------------------------------------------------------------------
DialogOverride:
LDA $7F5035 : BEQ .skip
LDA $7F5700, X ; use alternate buffer
RTL
.skip
LDA $7F1200, X
RTL
;--------------------------------------------------------------------------------
; $7F5035 - Alternate Text Pointer Flag ; 0=Disable
; $7F5036 - Padding Byte (Must be Zero)
; $7F5700 - $7F57FF - Dialog Buffer
;--------------------------------------------------------------------------------
ResetDialogPointer:
LDA.b #$00 : STA $7F5035 ; zero out the alternate flag
LDA.b #$1C : STA $1CE9 ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
;macro LoadDialog(index,table)
; PHA : PHX : PHY
; PHB : PHK : PLB
; LDA $00 : PHA
; LDA $01 : PHA
; LDA $02 : PHA
; LDA.b #$01 : STA $7F5035 ; set flag
;
; LDA <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)
PHP
PHA : PHX : PHY
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
PLY : PLX : PLA
PLP
endmacro
;--------------------------------------------------------------------------------
DialogBlind:
%LoadDialogAddress(BlindText)
JSL.l Sprite_ShowMessageMinimal
RTL
;--------------------------------------------------------------------------------
DialogFatFairy:
%LoadDialogAddress(FatFairyText)
JSL.l Sprite_ShowMessageUnconditional
RTL
;--------------------------------------------------------------------------------
DialogTriforce:
%LoadDialogAddress(TriforceText)
JSL.l Messaging_Text
RTL
;--------------------------------------------------------------------------------
DialogGanon1:
%LoadDialogAddress(GanonText1)
JSL.l Sprite_ShowMessageMinimal
RTL
;--------------------------------------------------------------------------------
DialogGanon2:
%LoadDialogAddress(GanonText2)
JSL.l Sprite_ShowMessageMinimal
RTL
;--------------------------------------------------------------------------------
DialogPedestal:
PHA
LDA $0202 : CMP.b #$0F : BEQ + ; Show normal text if book is not equipped
-
PLA : JSL Sprite_ShowMessageUnconditional ; Wacky Hylian Text
RTL
+
BIT $F4 : BVC - ; Show normal text if Y is not pressed
%LoadDialogAddress(MSPedestalText)
PLA : JSL Sprite_ShowMessageUnconditional ; Text From MSPedestalText (tables.asm)
RTL
;--------------------------------------------------------------------------------
DialogUncle:
;%LoadDialog(UncleQuote,DialogUncleData)
%LoadDialogAddress(UncleText)
JSL Sprite_ShowMessageUnconditional
RTL
;--------------------------------------------------------------------------------
DialogSahasrahla:
LDA.l $7EF374 : AND #$04 : BEQ + ;Check if player has green pendant
%LoadDialogAddress(SahasrahlaAfterItemText)
JSL.l Sprite_ShowMessageUnconditional
RTL
+
%LoadDialogAddress(SahasrahlaNoPendantText)
JSL.l Sprite_ShowMessageUnconditional
RTL
;--------------------------------------------------------------------------------
DialogAlcoholic:
%LoadDialogAddress(AlcoholicText)
JSL.l Sprite_ShowMessageUnconditional
RTL
;--------------------------------------------------------------------------------
DialogBombShopGuy:
LDA.l $7EF37A : AND #$05 : CMP #$05 : BEQ + ;Check if player has crystals 5 & 6
%LoadDialogAddress(BombShopGuyNoCrystalsText)
JSL.l Sprite_ShowMessageUnconditional
RTL
+
%LoadDialogAddress(BombShopGuyText)
JSL.l Sprite_ShowMessageUnconditional
RTL
;--------------------------------------------------------------------------------
; A0 - A9 - 0 - 9
; AA - C3 - A - Z
; C6 - ?
; C7 - !
; C8 - ,
; C9 - - Hyphen
; CD - Japanese period
; CE - ~
; D8 - ` apostraphe
;;--------------------------------------------------------------------------------
;DialogUncleData:
;;--------------------------------------------------------------------------------
; .pointers
; dl #DialogUncleData_weetabix
; dl #DialogUncleData_bootlessUntilBoots
; dl #DialogUncleData_onlyOneBed
; dl #DialogUncleData_onlyTextBox
; dl #DialogUncleData_mothTutorial
; dl #DialogUncleData_seedWorst
; dl #DialogUncleData_chasingTail
; dl #DialogUncleData_doneBefore
; dl #DialogUncleData_capeCanPass
; dl #DialogUncleData_bootsAtRace
; dl #DialogUncleData_kanzeonSeed
; dl #DialogUncleData_notRealUncle
; dl #DialogUncleData_haveAVeryBadTime
; dl #DialogUncleData_todayBadLuck
; dl #DialogUncleData_leavingGoodbye
; dl #DialogUncleData_iGotThis
; dl #DialogUncleData_raceToCastle
; dl #DialogUncleData_69BlazeIt
; dl #DialogUncleData_hi
; dl #DialogUncleData_gettingSmokes
; dl #DialogUncleData_dangerousSeeYa
; dl #DialogUncleData_badEnoughDude
; dl #DialogUncleData_iAmError
; dl #DialogUncleData_sub2Guaranteed
; dl #DialogUncleData_chestSecretEverybody
; dl #DialogUncleData_findWindFish
; dl #DialogUncleData_shortcutToGanon
; dl #DialogUncleData_moonCrashing
; dl #DialogUncleData_fightVoldemort
; dl #DialogUncleData_redMailForCowards
; dl #DialogUncleData_heyListen
; dl #DialogUncleData_excuseMePrincess
;;--------------------------------------------------------------------------------
; .weetabix
; ; Were out of / Weetabix. To / the store!
; db $00, $c0, $00, $ae, $00, $d8, $00, $bb, $00, $ae, $00, $ff, $00, $b8, $00, $be, $00, $bd, $00, $ff, $00, $b8, $00, $af
; db $75, $00, $c0, $00, $ae, $00, $ae, $00, $bd, $00, $aa, $00, $ab, $00, $b2, $00, $c1, $00, $cD, $00, $ff, $00, $bd, $00, $b8
; db $76, $00, $bd, $00, $b1, $00, $ae, $00, $ff, $00, $bc, $00, $bd, $00, $b8, $00, $bb, $00, $ae, $00, $c7
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .bootlessUntilBoots
; ; This seed is / bootless / until boots.
; db $00, $bd, $00, $b1, $00, $b2, $00, $bc, $00, $ff, $00, $bc, $00, $ae, $00, $ae, $00, $ad, $00, $ff, $00, $b2, $00, $bc
; db $75, $00, $ab, $00, $b8, $00, $b8, $00, $bd, $00, $b5, $00, $ae, $00, $bc, $00, $bc
; db $76, $00, $be, $00, $b7, $00, $bd, $00, $b2, $00, $b5, $00, $ff, $00, $ab, $00, $b8, $00, $b8, $00, $bd, $00, $bc, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .onlyOneBed
; ; Why do we only / have one bed?
; db $00, $c0, $00, $b1, $00, $c2, $00, $ff, $00, $ad, $00, $b8, $00, $ff, $00, $c0, $00, $ae, $00, $ff, $00, $b8, $00, $b7, $00, $b5, $00, $c2
; db $75, $00, $b1, $00, $aa, $00, $bf, $00, $ae, $00, $ff, $00, $b8, $00, $b7, $00, $ae, $00, $ff, $00, $ab, $00, $ae, $00, $ad, $00, $c6
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .onlyTextBox
; ; This is the / only textbox.
; db $00, $bd, $00, $b1, $00, $b2, $00, $bc, $00, $ff, $00, $b2, $00, $bc, $00, $ff, $00, $bd, $00, $b1, $00, $ae
; db $75, $00, $b8, $00, $b7, $00, $b5, $00, $c2, $00, $ff, $00, $bd, $00, $ae, $00, $c1, $00, $bd, $00, $ab, $00, $b8, $00, $c1, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .mothTutorial
; ; I'm going to / go watch the / Moth tutorial.
; db $00, $b2, $00, $d8, $00, $b6, $00, $ff, $00, $b0, $00, $b8, $00, $b2, $00, $b7, $00, $b0, $00, $ff, $00, $bd, $00, $b8
; db $75, $00, $b0, $00, $b8, $00, $ff, $00, $c0, $00, $aa, $00, $bd, $00, $ac, $00, $b1, $00, $ff, $00, $bd, $00, $b1, $00, $ae
; db $76, $00, $b6, $00, $b8, $00, $bd, $00, $b1, $00, $ff, $00, $bd, $00, $be, $00, $bd, $00, $b8, $00, $bb, $00, $b2, $00, $aa, $00, $b5, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .seedWorst
; ; This seed is / the worst.
; db $00, $bd, $00, $b1, $00, $b2, $00, $bc, $00, $ff, $00, $bc, $00, $ae, $00, $ae, $00, $ad, $00, $ff, $00, $b2, $00, $bc
; db $75, $00, $bd, $00, $b1, $00, $ae, $00, $ff, $00, $c0, $00, $b8, $00, $bb, $00, $bc, $00, $bd, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .chasingTail
; ; Chasing tail. / Fly ladies. / Do not follow.
; db $00, $ac, $00, $b1, $00, $aa, $00, $bc, $00, $b2, $00, $b7, $00, $b0, $00, $ff, $00, $bd, $00, $aa, $00, $b2, $00, $b5, $00, $cD
; db $75, $00, $af, $00, $b5, $00, $c2, $00, $ff, $00, $b5, $00, $aa, $00, $ad, $00, $b2, $00, $ae, $00, $bc, $00, $cD
; db $76, $00, $ad, $00, $b8, $00, $ff, $00, $b7, $00, $b8, $00, $bd, $00, $ff, $00, $af, $00, $b8, $00, $b5, $00, $b5, $00, $b8, $00, $c0, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .doneBefore
; ; I feel like / Ive done this / before…
; db $00, $b2, $00, $ff, $00, $af, $00, $ae, $00, $ae, $00, $b5, $00, $ff, $00, $b5, $00, $b2, $00, $b4, $00, $ae
; db $75, $00, $b2, $00, $d8, $00, $bf, $00, $ae, $00, $ff, $00, $ad, $00, $b8, $00, $b7, $00, $ae, $00, $ff, $00, $bd, $00, $b1, $00, $b2, $00, $bc
; db $76, $00, $ab, $00, $ae, $00, $af, $00, $b8, $00, $bb, $00, $ae, $00, $cD, $00, $cD, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .capeCanPass
; ; Magic cape can / pass through / the barrier!
; db $00, $b6, $00, $aa, $00, $b0, $00, $b2, $00, $ac, $00, $ff, $00, $ac, $00, $aa, $00, $b9, $00, $ae, $00, $ff, $00, $ac, $00, $aa, $00, $b7
; db $75, $00, $b9, $00, $aa, $00, $bc, $00, $bc, $00, $ff, $00, $bd, $00, $b1, $00, $bb, $00, $b8, $00, $be, $00, $b0, $00, $b1
; db $76, $00, $bd, $00, $b1, $00, $ae, $00, $ff, $00, $ab, $00, $aa, $00, $bb, $00, $bb, $00, $b2, $00, $ae, $00, $bb, $00, $c7
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .bootsAtRace
; ; Boots at race? / Seed confirmed / impossible.
; db $00, $ab, $00, $b8, $00, $b8, $00, $bd, $00, $bc, $00, $ff, $00, $aa, $00, $bd, $00, $ff, $00, $bb, $00, $aa, $00, $ac, $00, $ae, $00, $c6
; db $75, $00, $bc, $00, $ae, $00, $ae, $00, $ad, $00, $ff, $00, $ac, $00, $b8, $00, $b7, $00, $af, $00, $b2, $00, $bb, $00, $b6, $00, $ae, $00, $ad
; db $76, $00, $b2, $00, $b6, $00, $b9, $00, $b8, $00, $bc, $00, $bc, $00, $b2, $00, $ab, $00, $b5, $00, $ae, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .kanzeonSeed
; ; If this is a / Kanzeon seed, / I'm quitting.
; db $00, $b2, $00, $af, $00, $ff, $00, $bd, $00, $b1, $00, $b2, $00, $bc, $00, $ff, $00, $b2, $00, $bc, $00, $ff, $00, $aa
; db $75, $00, $b4, $00, $aa, $00, $b7, $00, $c3, $00, $ae, $00, $b8, $00, $b7, $00, $ff, $00, $bc, $00, $ae, $00, $ae, $00, $ad, $00, $c8
; db $76, $00, $b2, $00, $d8, $00, $b6, $00, $ff, $00, $ba, $00, $be, $00, $b2, $00, $bd, $00, $bd, $00, $b2, $00, $b7, $00, $b0, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .notRealUncle
; ; I am not your / real uncle.
; db $00, $b2, $00, $ff, $00, $aa, $00, $b6, $00, $ff, $00, $b7, $00, $b8, $00, $bd, $00, $ff, $00, $c2, $00, $b8, $00, $be, $00, $bb
; db $75, $00, $bb, $00, $ae, $00, $aa, $00, $b5, $00, $ff, $00, $be, $00, $b7, $00, $ac, $00, $b5, $00, $ae, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .haveAVeryBadTime
; ; You're going / to have a very / bad time.
; db $00, $c2, $00, $b8, $00, $be, $00, $d8, $00, $bb, $00, $ae, $00, $ff, $00, $b0, $00, $b8, $00, $b2, $00, $b7, $00, $b0
; db $75, $00, $bd, $00, $b8, $00, $ff, $00, $b1, $00, $aa, $00, $bf, $00, $ae, $00, $ff, $00, $aa, $00, $ff, $00, $bf, $00, $ae, $00, $bb, $00, $c2
; db $76, $00, $ab, $00, $aa, $00, $ad, $00, $ff, $00, $bd, $00, $b2, $00, $b6, $00, $ae, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .todayBadLuck
; ; Today you / will have / bad luck.
; db $00, $bd, $00, $b8, $00, $ad, $00, $aa, $00, $c2, $00, $ff, $00, $c2, $00, $b8, $00, $be, $00, $ff, $00, $c0, $00, $b2, $00, $b5, $00, $b5
; db $75, $00, $b1, $00, $aa, $00, $bf, $00, $ae, $00, $ff, $00, $ab, $00, $aa, $00, $ad, $00, $ff, $00, $b5, $00, $be, $00, $ac, $00, $b4, $00, $c7
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .leavingGoodbye
; ; I am leaving / forever. / Goodbye.
; db $00, $b2, $00, $ff, $00, $aa, $00, $b6, $00, $ff, $00, $b5, $00, $ae, $00, $aa, $00, $bf, $00, $b2, $00, $b7, $00, $b0
; db $75, $00, $af, $00, $b8, $00, $bb, $00, $ae, $00, $bf, $00, $ae, $00, $bb, $00, $cD
; db $76, $00, $b0, $00, $b8, $00, $b8, $00, $ad, $00, $ab, $00, $c2, $00, $ae, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .iGotThis
; ; Dont worry. / I got this / covered.
; db $00, $ad, $00, $b8, $00, $b7, $00, $d8, $00, $bd, $00, $ff, $00, $c0, $00, $b8, $00, $bb, $00, $bb, $00, $c2, $00, $cD
; db $75, $00, $b2, $00, $ff, $00, $b0, $00, $b8, $00, $bd, $00, $ff, $00, $bd, $00, $b1, $00, $b2, $00, $bc
; db $76, $00, $ac, $00, $b8, $00, $bf, $00, $ae, $00, $bb, $00, $ae, $00, $ad, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .raceToCastle
; ; Race you to / the castle!
; db $00, $bb, $00, $aa, $00, $ac, $00, $ae, $00, $ff, $00, $c2, $00, $b8, $00, $be, $00, $ff, $00, $bd, $00, $b8
; db $75, $00, $bd, $00, $b1, $00, $ae, $00, $ff, $00, $ac, $00, $aa, $00, $bc, $00, $bd, $00, $b5, $00, $ae, $00, $c7
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .69BlazeIt
; ; ~69 Blaze It!~
; db $75, $00, $cE, $00, $a6, $00, $a9, $00, $ff, $00, $ab, $00, $b5, $00, $aa, $00, $c3, $00, $ae, $00, $ff, $00, $b2, $00, $bd, $00, $c7, $00, $cE
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .hi
; ; hi
; db $75, $00, $ff, $00, $ff, $00, $ff, $00, $ff, $00, $ff, $00, $ff, $00, $b1, $00, $b2
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .gettingSmokes
; ; I'M JUST GOING / OUT FOR A / PACK OF SMOKES.
; db $00, $b2, $00, $d8, $00, $b6, $00, $ff, $00, $b3, $00, $be, $00, $bc, $00, $bd, $00, $ff, $00, $b0, $00, $b8, $00, $b2, $00, $b7, $00, $b0
; db $75, $00, $b8, $00, $be, $00, $bd, $00, $ff, $00, $af, $00, $b8, $00, $bb, $00, $ff, $00, $aa
; db $76, $00, $b9, $00, $aa, $00, $ac, $00, $b4, $00, $ff, $00, $b8, $00, $af, $00, $ff, $00, $bc, $00, $b6, $00, $b8, $00, $b4, $00, $ae, $00, $bc, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .dangerousSeeYa
; ; It's dangerous / to go alone. / See ya!
; db $00, $b2, $00, $bd, $00, $d8, $00, $bc, $00, $ff, $00, $ad, $00, $aa, $00, $b7, $00, $b0, $00, $ae, $00, $bb, $00, $b8, $00, $be, $00, $bc
; db $75, $00, $bd, $00, $b8, $00, $ff, $00, $b0, $00, $b8, $00, $ff, $00, $aa, $00, $b5, $00, $b8, $00, $b7, $00, $ae, $00, $cD
; db $76, $00, $bc, $00, $ae, $00, $ae, $00, $ff, $00, $c2, $00, $aa, $00, $c7
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .badEnoughDude
; ; ARE YOU A BAD / ENOUGH DUDE TO / RESCUE ZELDA?
; db $00, $aa, $00, $bb, $00, $ae, $00, $ff, $00, $c2, $00, $b8, $00, $be, $00, $ff, $00, $aa, $00, $ff, $00, $ab, $00, $aa, $00, $ad
; db $75, $00, $ae, $00, $b7, $00, $b8, $00, $be, $00, $b0, $00, $b1, $00, $ff, $00, $ad, $00, $be, $00, $ad, $00, $ae, $00, $ff, $00, $bd, $00, $b8
; db $76, $00, $bb, $00, $ae, $00, $bc, $00, $ac, $00, $be, $00, $ae, $00, $ff, $00, $c3, $00, $ae, $00, $b5, $00, $ad, $00, $aa, $00, $c6
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .iAmError
; ; I AM ERROR
; db $76, $00, $ff, $00, $ff, $00, $ff, $00, $ff, $00, $b2, $00, $ff, $00, $aa, $00, $b6, $00, $ff, $00, $ae, $00, $bb, $00, $bb, $00, $b8, $00, $bb
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .sub2Guaranteed
; ; This seed is / sub 2 hours, / guaranteed.
; db $00, $bd, $00, $b1, $00, $b2, $00, $bc, $00, $ff, $00, $bc, $00, $ae, $00, $ae, $00, $ad, $00, $ff, $00, $b2, $00, $bc
; db $75, $00, $bc, $00, $be, $00, $ab, $00, $ff, $00, $a2, $00, $ff, $00, $b1, $00, $b8, $00, $be, $00, $bb, $00, $bc, $00, $c8
; db $76, $00, $b0, $00, $be, $00, $aa, $00, $bb, $00, $aa, $00, $b7, $00, $bd, $00, $ae, $00, $ae, $00, $ad, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .chestSecretEverybody
; ; The chest is / a secret to / everybody.
; db $00, $bd, $00, $b1, $00, $ae, $00, $ff, $00, $ac, $00, $b1, $00, $ae, $00, $bc, $00, $bd, $00, $ff, $00, $b2, $00, $bc
; db $75, $00, $aa, $00, $ff, $00, $bc, $00, $ae, $00, $ac, $00, $bb, $00, $ae, $00, $bd, $00, $ff, $00, $bd, $00, $b8
; db $76, $00, $ae, $00, $bf, $00, $ae, $00, $bb, $00, $c2, $00, $ab, $00, $b8, $00, $ad, $00, $c2, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .findWindFish
; ; I'm off to / find the / wind fish.
; db $00, $b2, $00, $d8, $00, $b6, $00, $ff, $00, $b8, $00, $af, $00, $af, $00, $ff, $00, $bd, $00, $b8
; db $75, $00, $af, $00, $b2, $00, $b7, $00, $ad, $00, $ff, $00, $bd, $00, $b1, $00, $ae
; db $76, $00, $c0, $00, $b2, $00, $b7, $00, $ad, $00, $ff, $00, $af, $00, $b2, $00, $bc, $00, $b1, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .shortcutToGanon
; ; The shortcut / to Ganon / is this way!
; db $00, $bd, $00, $b1, $00, $ae, $00, $ff, $00, $bc, $00, $b1, $00, $b8, $00, $bb, $00, $bd, $00, $ac, $00, $be, $00, $bd
; db $75, $00, $bd, $00, $b8, $00, $ff, $00, $b0, $00, $aa, $00, $b7, $00, $b8, $00, $b7
; db $76, $00, $b2, $00, $bc, $00, $ff, $00, $bd, $00, $b1, $00, $b2, $00, $bc, $00, $ff, $00, $c0, $00, $aa, $00, $c2, $00, $c7
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .moonCrashing
; ; THE MOON IS / CRASHING! RUN / FOR YOUR LIFE!
; db $00, $bd, $00, $b1, $00, $ae, $00, $ff, $00, $b6, $00, $b8, $00, $b8, $00, $b7, $00, $ff, $00, $b2, $00, $bc
; db $75, $00, $ac, $00, $bb, $00, $aa, $00, $bc, $00, $b1, $00, $b2, $00, $b7, $00, $b0, $00, $c7, $00, $ff, $00, $bb, $00, $be, $00, $b7
; db $76, $00, $af, $00, $b8, $00, $bb, $00, $ff, $00, $c2, $00, $b8, $00, $be, $00, $bb, $00, $ff, $00, $b5, $00, $b2, $00, $af, $00, $ae, $00, $c7
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .fightVoldemort
; ; Time to fight / he who must / not be named.
; db $00, $bd, $00, $b2, $00, $b6, $00, $ae, $00, $ff, $00, $bd, $00, $b8, $00, $ff, $00, $af, $00, $b2, $00, $b0, $00, $b1, $00, $bd
; db $75, $00, $b1, $00, $ae, $00, $ff, $00, $c0, $00, $b1, $00, $b8, $00, $ff, $00, $b6, $00, $be, $00, $bc, $00, $bd
; db $76, $00, $b7, $00, $b8, $00, $bd, $00, $ff, $00, $ab, $00, $ae, $00, $ff, $00, $b7, $00, $aa, $00, $b6, $00, $ae, $00, $ad, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .redMailForCowards
; ; RED MAIL / IS FOR / COWARDS.
; db $00, $bb, $00, $ae, $00, $ad, $00, $ff, $00, $b6, $00, $aa, $00, $b2, $00, $b5
; db $75, $00, $b2, $00, $bc, $00, $ff, $00, $af, $00, $b8, $00, $bb
; db $76, $00, $ac, $00, $b8, $00, $c0, $00, $aa, $00, $bb, $00, $ad, $00, $bc, $00, $cD
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .heyListen
; ; HEY! / / LISTEN!
; db $00, $b1, $00, $ae, $00, $c2, $00, $c7
; db $76, $00, $b5, $00, $b2, $00, $bc, $00, $bd, $00, $ae, $00, $b7, $00, $c7
; db $7f, $7f
;;--------------------------------------------------------------------------------
; .excuseMePrincess
; ; Well / excuuuuuse me, / princess!
; db $00, $c0, $00, $ae, $00, $b5, $00, $b5
; db $75, $00, $ae, $00, $c1, $00, $ac, $00, $be, $00, $be, $00, $be, $00, $be, $00, $be, $00, $bc, $00, $ae, $00, $ff, $00, $b6, $00, $ae, $00, $c8
; db $76, $00, $b9, $00, $bb, $00, $b2, $00, $b7, $00, $ac, $00, $ae, $00, $bc, $00, $bc, $00, $c7
; db $7f, $7f
;;-------------------------------------------------------------------------------- ^32nd

9
dungeondrops.asm Normal file
View File

@@ -0,0 +1,9 @@
;================================================================================
; Dungeon & Boss Drop Fixes
;--------------------------------------------------------------------------------
DropSafeDungeon:
LDA $040C : CMP #$08 : BEQ +
LDA $01C6FC, X : JSL Sprite_SpawnFallingItem
+
RTL
;--------------------------------------------------------------------------------

15
entrances.asm Normal file
View File

@@ -0,0 +1,15 @@
;--------------------------------------------------------------------------------
; LockAgahnimDoors:
; Returns: 0=Unlocked - 1=Locked
;--------------------------------------------------------------------------------
LockAgahnimDoors:
LDA $7EF3C5 : AND.w #$000F : CMP.w #$0002 : !BGE + ; if we rescued zelda, skip
LDA $22 : CMP.w #1992 : !BLT + ; door too far left, skip
CMP.w #2088 : !BGE + ; door too rat right, skip
LDA $20 : CMP.w #1720 : !BGE + ; door too low, skip
LDA.w #$0001
RTL
+
LDA.w #$0000
RTL
;--------------------------------------------------------------------------------

82
events.asm Normal file
View File

@@ -0,0 +1,82 @@
;--------------------------------------------------------------------------------
; OnLoadOW
;--------------------------------------------------------------------------------
OnLoadMap:
JSL.l SetLWDWMap
LDA $7EF2DB ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
OnDrawHud:
JSL.l Draw4DigitRupees
JSL.l DrawChallengeTimer
JSL.l DrawGoalIndicator
JSL.l DrawDungeonCompassCounts
RTL
;--------------------------------------------------------------------------------
OnDungeonEntrance:
PHA : PHP
SEP #$20 ; set 8-bit accumulator
LDA $040C : CMP #$FF : BEQ + ; don't do this unless it's a real dungeon
LDA $7EF3CC ; load follower
CMP #$0C : BNE + ; skip if not the purple chest
LDA #$00 : STA $7EF3CC
+
PLP : PLA
STA $7EC172 ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
!RNG_ITEM_LOCK_IN = "$7F5090"
OnFileLoad:
LDA !FRESH_FILE_MARKER : BNE +
JSL.l OnNewFile
LDA.b #$FF : STA !FRESH_FILE_MARKER
+
JSL.l DarkWorldFlagSet
JSL.l MasterSwordFollowerClear
JSL.l InitOpenMode
LDA #$FF : STA !RNG_ITEM_LOCK_IN ; reset rng item lock-in
RTL
;--------------------------------------------------------------------------------
!RNG_ITEM_LOCK_IN = "$7F5090"
OnNewFile:
REP #$20 ; set 16-bit accumulator
LDA.l StartingTime : STA $7EF454
LDA.l StartingTime+2 : STA $7EF454+2
SEP #$20 ; set 8-bit accumulator
;LDA #$FF : STA !RNG_ITEM_LOCK_IN ; reset rng item lock-in
RTL
;--------------------------------------------------------------------------------
OnLinkDamaged:
;JSL.l FlipperKill
JSL.l OHKOTimer
RTL
;--------------------------------------------------------------------------------
OnLinkDamagedFromPit:
JSL.l OHKOTimer
LDA.b #$14 : STA $11 ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
!RNG_ITEM_LOCK_IN = "$7F5090"
OnOWTransition:
JSL.l FloodGateReset
JSL.l FlipperFlag
JSL.l StatTransitionCounter
PHP
SEP #$20 ; set 8-bit accumulator
LDA.b #$FF : STA !RNG_ITEM_LOCK_IN ; clear lock-in
PLP
RTL
;--------------------------------------------------------------------------------
PreItemGet:
LDA.b #$01 : STA !ITEM_BUSY ; mark item as busy
RTL
;--------------------------------------------------------------------------------
PostItemGet:
;LDA.b #$00 : STA !ITEM_BUSY ; mark item as finished
RTL
;--------------------------------------------------------------------------------
PostItemAnimation:
LDA.b #$00 : STA !ITEM_BUSY ; mark item as finished
STZ $02E9 : LDA $0C5E, X ; thing we wrote over to get here
RTL
;--------------------------------------------------------------------------------

35
externalhooks.asm Normal file
View File

@@ -0,0 +1,35 @@
org $298000 ; 0x148000
Ext_OnFileCreate: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnFileLoad: ;x immediately after load
RTL : RTL : RTL : RTL : RTL
Ext_OnFileSave: ;x immediately before save
RTL : RTL : RTL : RTL : RTL
Ext_OnPlayerDeath: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnMapUse: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnFairyRevive: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnYItemUse: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnIemMenuOpen: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnItemMenuClose: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnItemChange: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnPlayerDamaged: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnPlayerAttack: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnBossDeath: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnDungeonEnter: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnDungeonExit: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnDungeonCompleted: ;x
RTL : RTL : RTL : RTL : RTL
Ext_OnZeldaRescued: ;x
RTL : RTL : RTL : RTL : RTL

26
fairyfixes.asm Normal file
View File

@@ -0,0 +1,26 @@
;================================================================================
; Fairy Changes & Fixes
;--------------------------------------------------------------------------------
RefillHealthPlusMagic:
LDA BigFairyHealth : STA $7EF372
RTL
;--------------------------------------------------------------------------------
RefillHealthPlusMagic8bit:
LDA BigFairyHealth : STA $7EF372
LDA BigFairyMagic : STA $7EF373
RTL
;--------------------------------------------------------------------------------
CheckFullHealth:
LDA BigFairyHealth : BEQ +
LDA $7EF36D : CMP $7EF36C : BNE .player_hp_not_full_yet
+
LDA BigFairyMagic : BEQ +
LDA $7EF36E : CMP.b #$80 : BNE .player_mp_not_full_yet
+
LDA.b #$00
RTL
.player_hp_not_full_yet
.player_mp_not_full_yet
LDA.b #$01
RTL
;--------------------------------------------------------------------------------

44
flipperkill.asm Normal file
View File

@@ -0,0 +1,44 @@
;================================================================================
; Fake Flippers Softlock Fix
;--------------------------------------------------------------------------------
FlipperKill:
PHP
LDA $5D : CMP #$04 : BNE .done ; skip if we're not swimming
LDA $7EF356 : BNE .done ; skip if we have the flippers
LDA $7F5001 : BEQ .done ; skip if we're not marked in danger for softlock
JSL.l KillFairies ; take away fairies
LDA.b #$00 : STA $7EF36D ; kill link
LDA.b #$00 : STA $7F5001 ; mark fake flipper softlock as impossible
.done
PLP
LDA $7EF36D ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
KillFairies:
LDA $7EF35C : CMP #$06 : BNE +
LDA #$02 : STA $7EF35C
+ LDA $7EF35D : CMP #$06 : BNE +
LDA #$02 : STA $7EF35D
+ LDA $7EF35E : CMP #$06 : BNE +
LDA #$02 : STA $7EF35E
+ LDA $7EF35F : CMP #$06 : BNE +
LDA #$02 : STA $7EF35F
+
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 $7EF356 : 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
;--------------------------------------------------------------------------------

13
floodgatesoftlock.asm Normal file
View File

@@ -0,0 +1,13 @@
;================================================================================
; Floodgate Softlock Fix
;--------------------------------------------------------------------------------
FloodGateAndMasterSwordFollowerReset:
JSL.l MasterSwordFollowerClear
FloodGateReset:
LDA.l Bugfix_SwampWaterLevel : BEQ +
LDA $7EF06E : AND.b #$7F : STA $7EF06E ; clear water room 55
LDA $7EF06A : AND.b #$7F : STA $7EF06A ; clear water room 53
+
LDA $7EF051 : AND.b #$FE : STA $7EF051 ; clear water room 40 - thing we wrote over
RTL
;================================================================================

61
flute.asm Normal file
View File

@@ -0,0 +1,61 @@
;================================================================================
; Randomize Flute Dig Item
;--------------------------------------------------------------------------------
SpawnHauntedGroveItem:
LDA $8A : CMP.b #$2A : BEQ + : RTL : + ; Skip if not the haunted grove
LDA $1B : BEQ + : RTL : + ; Skip if indoors
LDA.l HauntedGroveItem
JSL.l PrepDynamicTile
LDA.b #$EB
STA $7FFE00
JSL Sprite_SpawnDynamically
LDX.b #$00
LDA $2F : CMP.b #$04 : BEQ + : INX : +
LDA .x_speeds, X : STA $0D50, Y
LDA.b #$00 : STA $0D40, Y
LDA.b #$18 : STA $0F80, Y
LDA.b #$FF : STA $0B58, Y
LDA.b #$30 : STA $0F10, Y
LDA $22 : !ADD .x_offsets, X
AND.b #$F0 : STA $0D10, Y
LDA $23 : ADC.b #$00 : STA $0D30, Y
LDA $20 : !ADD.b #$16 : AND.b #$F0 : STA $0D00, Y
LDA $21 : ADC.b #$00 : STA $0D20, Y
LDA.b #$00 : STA $0F20, Y
TYX
LDX $8A ; haunted grove (208D0A)
LDA $7EF280, X : AND.b #$40 : BNE +
LDA.b #$1B : JSL Sound_SetSfx3PanLong
+
RTL
;DATA - Flute Spawn Information
{
.x_speeds
db $F0
db $10
.x_offsets
db $00
db $13
}
;--------------------------------------------------------------------------------
FluteBoy:
LDA $10 : CMP.b #$1A : BEQ +
LDA.b #$01 : STA $0FDD
JMP.l FluteBoy_Abort
+
LDA $0D80, X : CMP.b #$03 ; thing we wrote over
JMP.l FluteBoy_Continue
;--------------------------------------------------------------------------------

54
framehook.asm Normal file
View File

@@ -0,0 +1,54 @@
;================================================================================
; Frame Hook
;--------------------------------------------------------------------------------
; $7EF42Ew[2] - loop frame counter (low)
!LOOP_FRAMES_LOW = "$7EF42E"
;--------------------------------------------------------------------------------
; $7EF430w[2] - loop frame counter (high)
!LOOP_FRAMES_HIGH = "$7EF430"
;--------------------------------------------------------------------------------
; $7EF43Ew[2] - nmi frame counter (low)
!NMI_FRAMES_LOW = "$7EF43E"
;--------------------------------------------------------------------------------
; $7EF440w[2] - nmi frame counter (high)
!NMI_FRAMES_HIGH = "$7EF440"
;--------------------------------------------------------------------------------
; $7EF444w[2] - item menu frame counter (low)
!ITEM_FRAMES_LOW = "$7EF444"
;--------------------------------------------------------------------------------
; $7EF446w[2] - item menu frame counter (high)
!ITEM_FRAMES_HIGH = "$7EF446"
;--------------------------------------------------------------------------------
!LOCK_STATS = "$7EF443"
FrameHookAction:
JSL $0080B5 ; Module_MainRouting
PHA : PHP
LDA EnableSRAMTrace : AND.l TournamentSeedInverse : BEQ +
LDA $1A : BNE ++ : JSL.l WriteStatusPreview : ++ ; write every 256 frames
+
LDA !LOCK_STATS : BNE ++
REP #$20 ; set 16-bit accumulator
LDA !LOOP_FRAMES_LOW : INC : STA !LOOP_FRAMES_LOW : BNE +
LDA !LOOP_FRAMES_HIGH : INC : STA !LOOP_FRAMES_HIGH
+
LDA $10 : CMP.w #$010E : BNE + ; move this to nmi hook?
LDA !ITEM_FRAMES_LOW : INC : STA !ITEM_FRAMES_LOW : BNE +
LDA !ITEM_FRAMES_HIGH : INC : STA !ITEM_FRAMES_HIGH
+
SEP #$20 ; set 8-bit accumulator ?? check this
++
PLP : PLA
RTL
;--------------------------------------------------------------------------------
NMIHookAction:
PHA : PHX : PHY : PHD ; thing we wrote over, push stuff
LDA !LOCK_STATS : AND.w #$00FF : BNE ++
LDA !NMI_FRAMES_LOW : INC : STA !NMI_FRAMES_LOW : BNE +
LDA !NMI_FRAMES_HIGH : INC : STA !NMI_FRAMES_HIGH
+
++
JML.l NMIHookReturn
;--------------------------------------------------------------------------------

16
ganonfixes.asm Normal file
View File

@@ -0,0 +1,16 @@
;================================================================================
; 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
;--------------------------------------------------------------------------------

16
glitched.asm Normal file
View File

@@ -0,0 +1,16 @@
;================================================================================
; Glitched Mode Fixes
;================================================================================
GetAgahnimType:
PHP
REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way
CMP.w #13 : BNE + ; Agahnim 2 room
LDA.w #$0006 ; Use Agahnim 2
BRA .done
+ ; Elsewhere
LDA.w #$0001 ; Use Agahnim 1
.done
PLP
RTL
;--------------------------------------------------------------------------------

27
goalitem.asm Normal file
View File

@@ -0,0 +1,27 @@
;--------------------------------------------------------------------------------
; $7F5010 - Scratch Space (Callee Preserved)
;--------------------------------------------------------------------------------
!GOAL_COUNTER = "$7EF460"
DrawGoalIndicator:
LDA.l GoalItemRequirement : AND.w #$00FF : BNE + : RTL : + ; Star Meter
PHX
LDX.w #$0000
LDA.l GoalItemIcon : STA $7EC72C, X : INX #2 ; draw star icon and move the cursor
LDA.l !GOAL_COUNTER
AND.w #$00FF
JSL.l HexToDec
LDA $7F5006 : AND.w #$00FF : ORA.w #$2400 : STA $7EC72C, X : INX #2 ; draw 10's digit and move the cursor
LDA $7F5007 : AND.w #$00FF : ORA.w #$2400 : STA $7EC72C, X : INX #2 ; draw 1's and move the cursor
LDA.w #$2830 : STA $7EC72C, X : INX #2 ; draw slash and move the cursor
LDA.l GoalItemRequirement
AND.w #$00FF
JSL.l HexToDec
LDA $7F5006 : AND.w #$00FF : ORA.w #$2400 : STA $7EC72C, X : INX #2 ; draw 10's digit and move the cursor
LDA $7F5007 : AND.w #$00FF : ORA.w #$2400 : STA $7EC72C, X : INX #2 ; draw 1's and move the cursor
PLX
RTL
;--------------------------------------------------------------------------------

15
halfmagicbat.asm Normal file
View File

@@ -0,0 +1,15 @@
;================================================================================
; Randomize Half Magic Bat
;--------------------------------------------------------------------------------
GetMagicBatItem:
JSL.l ItemSet_MagicBat
LDA MagicBatItem : CMP.b #$FF : BEQ .normalLogic
TAY
STZ $02E9 ; 0 = Receiving item from an NPC or message
JSL.l Link_ReceiveItem
RTL
.normalLogic
LDA HalfMagic
STA $7EF37B
RTL
;--------------------------------------------------------------------------------

17
hardmode.asm Normal file
View File

@@ -0,0 +1,17 @@
;================================================================================
; Hard & Masochist Mode
;================================================================================
CalculateSpikeFloorDamage:
REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way
CMP.w #279
SEP #$20 ; set 8-bit accumulator
BNE +
LDA.l ByrnaCaveSpikeDamage
STA $0373
RTL
+
LDA $D055, Y
STA $0373
RTL
;--------------------------------------------------------------------------------

329
hashalphabet.asm Normal file
View File

@@ -0,0 +1,329 @@
;--------------------------------------------------------------------------------
; PrepHashAlphabet:
;--------------------------------------------------------------------------------
PrepHashAlphabet:
LDA $11 : CMP.b #$03 : BNE +
LDA.b #$06 : STA $14 ; thing we wrote over
RTL
+
LDA $00 : PHA
LDA $01 : PHA
LDA $02 : PHA
LDA $03 : PHA
LDA $04 : PHA
LDA $05 : PHA
LDA $06 : PHA
LDA $07 : PHA
JSL.l NameHash
JSL.l LoadAlphabetTiles
JSL.l LoadAlphabetTilemap
PLA : STA $07
PLA : STA $06
PLA : STA $05
PLA : STA $04
PLA : STA $03
PLA : STA $02
PLA : STA $01
PLA : STA $00
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; GetAlphabetPalette:
; In: X = Alphabet Index
; Out: A = Palette
;--------------------------------------------------------------------------------
GetAlphabetPalette:
LDA.l .table, X
RTL
;--------------------------------------------------------------------------------
.table
db $00, $0C, $04, $0C, $04, $00, $0C, $18
db $08, $08, $08, $04, $00, $00, $0C, $08
db $18, $0C, $18, $04, $04, $0C, $14, $00
db $0C, $04, $08, $18, $04, $08, $04, $08
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; GetAlphabetTileAddr:
; Notes:
; Assumes 16-bit accumulator
;--------------------------------------------------------------------------------
GetAlphabetTileAddr:
ASL #6
!ADD.w #$B800 ; $31:B800
RTL
;--------------------------------------------------------------------------------
!ALPHA_TILE_WIDTH = "#$40"
!ALPHA_VRAM_DEST_BASE = "#$FA00"
;--------------------------------------------------------------------------------
; LoadAlphabetTiles
; In:
; $00 - Tile 0
; $01 - Tile 1
; $02 - Tile 2
; $03 - Tile 3
; $04 - Tile 4
;--------------------------------------------------------------------------------
LoadAlphabetTiles:
PHA : PHX
LDA $4300 : PHA ; preserve DMA parameters
LDA $4301 : PHA ; preserve DMA parameters
LDA $4302 : PHA ; preserve DMA parameters
LDA $4303 : PHA ; preserve DMA parameters
LDA $4304 : PHA ; preserve DMA parameters
LDA $4305 : PHA ; preserve DMA parameters
LDA $4306 : PHA ; preserve DMA parameters
;--------------------------------------------------------------------------------
LDA.b #$80 : STA $2115 ; write read increment on $2119
LDA.b #$01 : STA $4300 ; set DMA transfer direction A -> B, bus A auto increment, double-byte mode
LDA.b #$18 : STA $4301 ; set bus B destination to VRAM register
LDA.b !ALPHA_VRAM_DEST_BASE>>1 : STA $2116 ; write VRAM destination address
LDA.b !ALPHA_VRAM_DEST_BASE>>9 : STA $2117 ; write VRAM destination address
LDA.b #GFX_Hash_Alphabet>>16 : STA $4304 ; set bus A source bank
LDA $2100 : PHA : LDA.b #$80 : STA $2100 ; save screen state & turn screen off
LDX.b #$00 : -
LDA $00, X
REP #$20 ; set 16-bit accumulator
AND.w #$001F ; mask to alphabet of 32
JSL.l GetAlphabetTileAddr : STA $4302 ; set bus A source address to SRAM
SEP #$20 ; set 8-bit accumulator
LDA.b !ALPHA_TILE_WIDTH : STA $4305 : STZ $4306 ; set transfer size to 0x40
LDA #$01 : STA $420B ; begin DMA transfer
INX
CPX.b #$05 : !BLT -
PLA : STA $2100 ; put screen back however it was before
;--------------------------------------------------------------------------------
PLA : STA $4306 ; restore DMA parameters
PLA : STA $4305 ; restore DMA parameters
PLA : STA $4304 ; restore DMA parameters
PLA : STA $4303 ; restore DMA parameters
PLA : STA $4302 ; restore DMA parameters
PLA : STA $4301 ; restore DMA parameters
PLA : STA $4300 ; restore DMA parameters
PLX : PLA
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
;Hash Alphabet
!ALPHA_BOW = "#$0000"
!ALPHA_BOOM = "#$0001"
!ALPHA_HOOK = "#$0002"
!ALPHA_BOMB = "#$0003"
!ALPHA_SHROOM = "#$0004"
!ALPHA_POWDER = "#$0005"
!ALPHA_ROD = "#$0006"
!ALPHA_PENDANT = "#$0007"
!ALPHA_BOMBOS = "#$0008"
!ALPHA_ETHER = "#$0009"
!ALPHA_QUAKE = "#$000A"
!ALPHA_LAMP = "#$000B"
!ALPHA_HAMMER = "#$000C"
!ALPHA_SHOVEL = "#$000D"
!ALPHA_FLUTE = "#$000E"
!ALPHA_NET = "#$000F"
!ALPHA_BOOK = "#$0010"
!ALPHA_BOTTLE = "#$0011"
!ALPHA_POTION = "#$0012"
!ALPHA_CANE = "#$0013"
!ALPHA_CAPE = "#$0014"
!ALPHA_MIRROR = "#$0015"
!ALPHA_BOOTS = "#$0016"
!ALPHA_GLOVES = "#$0017"
!ALPHA_FLIPPERS = "#$0018"
!ALPHA_PEARL = "#$0019"
!ALPHA_SHIELD = "#$001A"
!ALPHA_TUNIC = "#$001B"
!ALPHA_HEART = "#$001C"
!ALPHA_MAP = "#$001D"
!ALPHA_COMPASS = "#$001E"
!ALPHA_KEY = "#$001F"
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
!BIGRAM = "$7EC900";
;--------------------------------------------------------------------------------
LoadAlphabetTilemap:
PHA : PHX : PHY : PHP
SEP #$10 ; 8-bit index registers
REP #$20 ; 16-bit accumulator
LDX.b #$00 : -
LDA FileSelect_PlayerSelectText_Top, X
STA !BIGRAM, X
INX #2
CPX #128 : !BLT -
SEP #$20 ; 8-bit accumulator
LDY.b #00
LDX.b #$00 : -
PHX : TYX : LDA $00, X : PLX
AND.b #$1F ; mask to alphabet of 32
PHX : TAX : JSL.l GetAlphabetPalette : PLX
ORA.b #$01
STA !BIGRAM+28+1, X
STA !BIGRAM+28+1+2, X
STA !BIGRAM+28+64+1, X
STA !BIGRAM+28+64+1+2, X
INX #6 : INY
CPX #25 : !BLT -
JSR DMAAlphabetTilemap:
PLP : PLY : PLX : PLA
RTL
;--------------------------------------------------------------------------------
; DMAAlphabetTilemap:
;--------------------------------------------------------------------------------
DMAAlphabetTilemap:
PHA : PHX
LDA $4300 : PHA ; preserve DMA parameters
LDA $4301 : PHA ; preserve DMA parameters
LDA $4302 : PHA ; preserve DMA parameters
LDA $4303 : PHA ; preserve DMA parameters
LDA $4304 : PHA ; preserve DMA parameters
LDA $4305 : PHA ; preserve DMA parameters
LDA $4306 : PHA ; preserve DMA parameters
;--------------------------------------------------------------------------------
LDA.b #$01 : STA $4300 ; set DMA transfer direction A -> B, bus A auto increment, double-byte mode
LDA.b #$80 : STA $2115 ; write read increment on $2119
LDA.b #$18 : STA $4301 ; set bus B destination to VRAM register
LDA.b #$60 : STA $2116 ; write VRAM destination address
STA $2117 ; write VRAM destination address
LDA.b #!BIGRAM : STA $4302 ; set bus A source address to WRAM
LDA.b #!BIGRAM>>8 : STA $4303 ; set bus A source address to WRAM
LDA.b #!BIGRAM>>16 : STA $4304 ; set bus A source bank
LDA.b #$80 : STA $4305 : STZ $4306 ; set transfer size to 0x40
LDA $2100 : PHA : LDA.b #$80 : STA $2100 ; save screen state & turn screen off
LDA #$01 : STA $420B ; begin DMA transfer
PLA : STA $2100 ; put screen back however it was before
;--------------------------------------------------------------------------------
LDA.b #$00 : STA $4300 ; set DMA transfer direction A -> B, bus A auto increment, single-byte mode
LDA.b #$22 : STA $4301 ; set bus B destination to CGRAM register
STZ $2121 ; write CGRAM destination address
LDA.b #GFX_HUD_Palette : STA $4302 ; set bus A source address to WRAM
LDA.b #GFX_HUD_Palette>>8 : STA $4303 ; set bus A source address to WRAM
LDA.b #GFX_HUD_Palette>>16 : STA $4304 ; set bus A source bank
LDA.b #$80 : STA $4305 : STZ $4306 ; set transfer size to 0x40
LDA $2100 : PHA : LDA.b #$80 : STA $2100 ; save screen state & turn screen off
LDA #$01 : STA $420B ; begin DMA transfer
PLA : STA $2100 ; put screen back however it was before
;--------------------------------------------------------------------------------
PLA : STA $4306 ; restore DMA parameters
PLA : STA $4305 ; restore DMA parameters
PLA : STA $4304 ; restore DMA parameters
PLA : STA $4303 ; restore DMA parameters
PLA : STA $4302 ; restore DMA parameters
PLA : STA $4301 ; restore DMA parameters
PLA : STA $4300 ; restore DMA parameters
PLX : PLA
RTS
;--------------------------------------------------------------------------------
!FSTILE_SPACE = "$0188"
!FSTILE_BRACKET_OPEN_TOP = "$1D8A"
!FSTILE_BRACKET_OPEN_BOTTOM = "$1D9A"
!FSTILE_BRACKET_CLOSE_TOP = "$1D8B"
!FSTILE_BRACKET_CLOSE_BOTTOM = "$1D9B"
;--------------------------------------------------------------------------------
FileSelect_PlayerSelectText_Top:
;db $60, $62, $00, $37
dw !FSTILE_SPACE, !FSTILE_SPACE
dw !FSTILE_BRACKET_OPEN_TOP
dw !FSTILE_SPACE, $1D6C
dw !FSTILE_SPACE, $1D4E
dw !FSTILE_SPACE, $1D4E
dw !FSTILE_SPACE, $1D4D
dw !FSTILE_SPACE, !FSTILE_SPACE
dw !FSTILE_SPACE, $05A0, $05A1
dw !FSTILE_SPACE, $05A4, $05A5
dw !FSTILE_SPACE, $05A8, $05A9
dw !FSTILE_SPACE, $05AC, $05AD
dw !FSTILE_SPACE, $05B0, $05B1
dw !FSTILE_SPACE
dw !FSTILE_BRACKET_CLOSE_TOP
dw !FSTILE_SPACE, !FSTILE_SPACE
;--------------------------------------------------------------------------------
FileSelect_PlayerSelectText_Bottom:
;db $60, $82, $00, $37
dw !FSTILE_SPACE, !FSTILE_SPACE
dw !FSTILE_BRACKET_OPEN_BOTTOM
dw !FSTILE_SPACE, $1D7C
dw !FSTILE_SPACE, $1D5E
dw !FSTILE_SPACE, $1D5E
dw !FSTILE_SPACE, $1D5D
dw !FSTILE_SPACE, !FSTILE_SPACE
dw !FSTILE_SPACE, $05A2, $05A3
dw !FSTILE_SPACE, $05A6, $05A7
dw !FSTILE_SPACE, $05AA, $05AB
dw !FSTILE_SPACE, $05AE, $05AF
dw !FSTILE_SPACE, $05B2, $05B3
dw !FSTILE_SPACE
dw !FSTILE_BRACKET_CLOSE_BOTTOM
dw !FSTILE_SPACE, !FSTILE_SPACE
;--------------------------------------------------------------------------------
org $0CDE60 ; <- 65E60
FileSelect_CopyFile_Top:
db $62, $A5, $00, $15
dw $1D4C, !FSTILE_SPACE, $1D68, !FSTILE_SPACE, $1D69, !FSTILE_SPACE, $1D82, !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
FileSelect_CopyFile_Bottom:
db $62, $C5, $00, $15
dw $1D5C, !FSTILE_SPACE, $1D78, !FSTILE_SPACE, $1D79, !FSTILE_SPACE, $1D92, !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
FileSelect_KillFile_Top:
db $63, $25, $00, $19
dw $1D64, !FSTILE_SPACE, $1D62, !FSTILE_SPACE, $1D65, !FSTILE_SPACE, $1D65, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE
;dw $1D64, !FSTILE_SPACE, $1D62, !FSTILE_SPACE, $1D65, !FSTILE_SPACE, $1D65, !FSTILE_SPACE, $1D04, !FSTILE_SPACE, $1D89, !FSTILE_SPACE, $1D07
;--------------------------------------------------------------------------------
;org $0CDEB2 ; <- 65EB2
;FileSelect_KillFile_Bottom:
db $63, $45, $00, $19
dw $1D74, !FSTILE_SPACE, $1D72, !FSTILE_SPACE, $1D75, !FSTILE_SPACE, $1D75, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE, !FSTILE_SPACE
;dw $1D74, !FSTILE_SPACE, $1D72, !FSTILE_SPACE, $1D75, !FSTILE_SPACE, $1D75, !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
;--------------------------------------------------------------------------------

1
hashalphabet.chr.gfx Normal file
View File

@@ -0,0 +1 @@
<EFBFBD><EFBFBD><EFBFBD>Η<EFBFBD><EFBFBD>Έ<EFBFBD>ώΟ<EFBFBD>η<EFBFBD>σ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD>ρ<EFBFBD>1<EFBFBD>-<2D>ί<EFBFBD>§<EFBFBD>gϋώ<CF8B>ύΞϋ<CE9E>χϋοσ<CEBF>χ<EFBFBD><CF87><EFBFBD><EFBFBD>γ<EFBFBD>σσ<>ωΟωοσ<CEBF><CF83><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΐ<EFBFBD><CE90>Ώ<EFBFBD><EFBFBD>ΐ<EFBFBD><CE90><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><0F>η<EFBFBD>χχχ<1F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>χ<EFBFBD>χ<EFBFBD>χ<EFBFBD>χ<EFBFBD>χ<EFBFBD>χ<EFBFBD><CF87>Ο<EFBFBD><CE9F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD>ω<EFBFBD>ε<EFBFBD>ύ<EFBFBD>O<EFBFBD><EFBFBD><EFBFBD>ό<EFBFBD>ψ<EFBFBD>υ<EFBFBD>οσίηΏΟ<CE8F><CE9F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ώύ<CF8E>ς<EFBFBD>αχθ<CF87>ΐ<EFBFBD><CE90><EFBFBD><EFBFBD>m<EFBFBD><73>O<EFBFBD>ΟοΠοΠ<CEBF>ΐ<EFBFBD>ΰ<EFBFBD>ΰ<EFBFBD>π<EFBFBD>ό<EFBFBD><CF8C>χ χ <0B><03><07><07><0F>?<3F><><EFBFBD><EFBFBD><EFBFBD>ώ<EFBFBD>ψ<EFBFBD>π<EFBFBD>π<EFBFBD>ΰ<EFBFBD>ΐ<EFBFBD><EFBFBD><E282AC><EFBFBD><EFBFBD>ΏOο<>wοη<19><EFBFBD><EFBFBD>ΐϋ<CE90>π<EFBFBD>π<EFBFBD>ψ<EFBFBD><CF88><EFBFBD><EFBFBD><01>a<EFBFBD>σ<1F><0F><0F><1F><><EFBFBD><EFBFBD><EFBFBD>ύϋ½σΎωΧόγ<CF8C>Φ<EFBFBD>Ώω<CE8F><CF89>ί»Ο·Ω<C2B7><03>η<1F><>ηΏπ<CE8F>ΰ<EFBFBD>ΰ<EFBFBD>ΰ<EFBFBD>ΰ<EFBFBD>π<EFBFBD>ό<EFBFBD><CF8C><EFBFBD>s‡yΗ9Ο1<CE9F><01><03><0F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ώ<EFBFBD>ύ<EFBFBD>ύ<EFBFBD>ώ<EFBFBD><CF8E><EFBFBD><EFBFBD>Αέγέ£γ<C2A3>w‰oΧ<6F><CEA7>ό<EFBFBD>ψ<EFBFBD>υ<EFBFBD>οσίηΏΟ<CE8F><CE9F><EFBFBD><EFBFBD>o<EFBFBD><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ψ<EFBFBD>χ<EFBFBD>ο<EFBFBD>ξ<EFBFBD>ρ<EFBFBD><CF81><EFBFBD><1F>o<EFBFBD>χ<EFBFBD>{<7B>»<EFBFBD>έ<EFBFBD>έ<EFBFBD>ϋ<EFBFBD>ηωΗψΞραήχΘ<CF87>α<EFBFBD><CEB1>έ<EFBFBD>½<EFBFBD>½<EFBFBD>½<EFBFBD>Ϋ<EFBFBD>η<EFBFBD><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ό<EFBFBD>π<EFBFBD>ιφΩζΫδΊΕΌΓ<CE8C><CE93>?<3F>Οϋƒa<7F>9Η<39>γ†ωΑώίΰοπσόό<CF8C><CF8C><EFBFBD>=Γ]£Ϋ'g—o<0F>?<3F><><EFBFBD><EFBFBD><EFBFBD>ό<EFBFBD>ςύξράγάγΈΗΈΗ<CE88><CE97>?<3F>Οϋϋύ

12
heartbeep.asm Normal file
View File

@@ -0,0 +1,12 @@
;================================================================================
; Heart Beep Logic
;================================================================================
BeepLogic:
LDA.l HeartBeep : BEQ +
STA $04CA
LDA.b #$2B : STA $012E
RTL
+
LDA.b #$FF : STA $04CA
RTL
;================================================================================

395
heartpieces.asm Normal file
View File

@@ -0,0 +1,395 @@
;================================================================================
; Randomize Heart Pieces
;--------------------------------------------------------------------------------
HeartPieceGet:
PHX : PHY
JSL.l LoadHeartPieceRoomValue : TAY ; load item value into Y register
JSL.l MaybeMarkDigSpotCollected
.skipLoad
STZ $02E9 ; 0 = Receiving item from an NPC or message
CPY.b #$26 : BNE .notHeart ; don't add a 1/4 heart if it's not a heart piece
LDA $7EF36B : INC A : AND.b #$03 : STA $7EF36B : BNE .unfinished_heart ; add up heart quarters
BRA .giveItem
.notHeart
.giveItem
JSL.l $0791B3 ; Player_HaltDashAttackLong
JSL.l Link_ReceiveItem
CLC ; return false
BRL .done ; finished
.unfinished_heart
SEC ; return true
.done
JSL MaybeUnlockTabletAnimation
PLY : PLX
RTL
;--------------------------------------------------------------------------------
HeartContainerGet:
PHX : PHY
JSL.l LoadHeartContainerRoomValue : TAY ; load item value into Y register
BRA HeartPieceGet_skipLoad
;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
DrawHeartPieceGFX:
PHP
JSL.l Sprite_IsOnscreen : BCC .offscreen
PHA : PHY
LDA !REDRAW : BEQ .skipInit ; skip init if already ready
JSL.l HeartPieceSpritePrep
BRL .done ; don't draw on the init frame
.skipInit
JSL.l LoadHeartPieceRoomValue
.skipLoad
PHA
JSL.l IsNarrowSprite : BCC +
LDA $0E60, X : ORA.b #$20 : STA $0E60, X
+
;LDA $0E60, X : ORA.b #$10 : STA $0E60, X
PLA
JSL.l DrawDynamicTile
JSL.l Sprite_DrawShadowLong
.done
PLY : PLA
.offscreen
PLP
RTL
;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
DrawHeartContainerGFX:
PHP
JSL.l Sprite_IsOnscreen : BCC DrawHeartPieceGFX_offscreen
PHA : PHY
LDA !REDRAW : BEQ .skipInit ; skip init if already ready
JSL.l HeartContainerSpritePrep
BRA DrawHeartPieceGFX_done ; don't draw on the init frame
.skipInit
JSL.l LoadHeartContainerRoomValue
BRA DrawHeartPieceGFX_skipLoad
;--------------------------------------------------------------------------------
HeartContainerSound:
CPY.b #$20 : BEQ + ; Skip for Crystal
CPY.b #$37 : BEQ + ; Skip for Pendants
CPY.b #$38 : BEQ +
CPY.b #$39 : BEQ +
JSL.l CheckIfBossRoom : BCC + ; Skip if not in a boss room
LDA.b #$2E
SEC
RTL
+
CLC
RTL
;--------------------------------------------------------------------------------
NormalItemSkipSound:
LDA $0C5E, X ; thing we wrote over
CPY.b #$20 : BEQ + ; Skip for Crystal
CPY.b #$37 : BEQ + ; Skip for Pendants
CPY.b #$38 : BEQ +
CPY.b #$39 : BEQ +
PHA
JSL.l CheckIfBossRoom
PLA
RTL
+
CLC
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 $7EF280, X
RTL
;--------------------------------------------------------------------------------
SaveHeartCollectedStatus:
LDA !SKIP_HEART_SAVE : BEQ .normal_behavior
DEC : STA !SKIP_HEART_SAVE
RTL
.normal_behavior
LDA $7EF280, X : ORA.b #$40 : STA $7EF280, X
RTL
;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
HeartPieceSpritePrep:
PHA
LDA #$01 : STA !REDRAW
LDA $5D : CMP #$14 : BEQ .skip ; skip if we're mid-mirror
LDA #$00 : STA !REDRAW
JSL.l LoadHeartPieceRoomValue ; load item type
JSL.l PrepDynamicTile
.skip
PLA
RTL
;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
HeartContainerSpritePrep:
PHA
LDA #$00 : STA !REDRAW
JSL.l LoadHeartContainerRoomValue ; load item type
JSL.l PrepDynamicTile
PLA
RTL
;--------------------------------------------------------------------------------
LoadHeartPieceRoomValue:
LDA $1B : BEQ .outdoors ; check if we're indoors or outdoors
.indoors
JSL.l LoadIndoorValue
BRL .done
.outdoors
JSL.l LoadOutdoorValue
.done
RTL
;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
HPItemReset:
JSL $09AD58 ; GiveRupeeGift - thing we wrote over
PHA : LDA #$01 : STA !REDRAW : PLA
RTL
;--------------------------------------------------------------------------------
MaybeMarkDigSpotCollected:
PHA : PHP
LDA $1B : BNE +
REP #$20 ; set 16-bit accumulator
LDA $8A
CMP.w #$2A : BNE +
LDA !HAS_GROVE_ITEM : ORA.w #$0001 : STA !HAS_GROVE_ITEM
+
PLP : PLA
RTL
;--------------------------------------------------------------------------------
LoadIndoorValue:
PHP
REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way
CMP.w #225 : BNE +
LDA HeartPiece_Forest_Thieves
BRL .done
+ CMP.w #226 : BNE +
LDA HeartPiece_Lumberjack_Tree
BRL .done
+ CMP.w #234 : BNE +
LDA HeartPiece_Spectacle_Cave
BRL .done
+ CMP.w #283 : BNE +
LDA $22 : XBA : AND.w #$0001 ; figure out where link is
BNE ++
LDA HeartPiece_Circle_Bushes
BRL .done
++
LDA HeartPiece_Graveyard_Warp
BRL .done
+ CMP.w #294 : BNE +
LDA HeartPiece_Mire_Warp
BRL .done
+ CMP.w #295 : BNE +
LDA HeartPiece_Smith_Pegs
BRL .done
+ CMP.w #135 : BNE +
LDA StandingKey_Hera
BRL .done
+
LDA.w #$0017 ; default to a normal hp
.done
AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before
PLP
RTL
;--------------------------------------------------------------------------------
;225 - HeartPiece_Forest_Thieves
;226 - HeartPiece_Lumberjack_Tree
;234 - HeartPiece_Spectacle_Cave
;283 - HeartPiece_Circle_Bushes
;283 - HeartPiece_Graveyard_Warp
;294 - HeartPiece_Mire_Warp
;295 - HeartPiece_Smith_Pegs
;--------------------------------------------------------------------------------
LoadOutdoorValue:
PHP
REP #$20 ; set 16-bit accumulator
LDA $8A
CMP.w #$03 : BNE +
LDA $22 : CMP.w #1890 : !BLT ++
LDA HeartPiece_Spectacle
BRL .done
++
LDA EtherItem
BRL .done
+ CMP.w #$05 : BNE +
LDA HeartPiece_Mountain_Warp
BRL .done
+ CMP.w #$28 : BNE +
LDA HeartPiece_Maze
BRL .done
+ CMP.w #$2A : BNE +
LDA HauntedGroveItem
BRL .done
+ CMP.w #$30 : BNE +
LDA $22 : CMP.w #512 : !BGE ++
LDA HeartPiece_Desert
BRL .done
++
LDA BombosItem
BRL .done
+ CMP.w #$35 : BNE +
LDA HeartPiece_Lake
BRL .done
+ CMP.w #$3B : BNE +
LDA HeartPiece_Swamp
BRL .done
+ CMP.w #$42 : BNE +
LDA HeartPiece_Cliffside
BRL .done
+ CMP.w #$4A : BNE +
LDA HeartPiece_Cliffside
BRL .done
+ CMP.w #$5B : BNE +
LDA HeartPiece_Pyramid
BRL .done
+ CMP.w #$68 : BNE +
LDA HeartPiece_Digging
BRL .done
+ CMP.w #$81 : BNE +
LDA HeartPiece_Zora
BRL .done
+
LDA.w #$0017 ; default to a normal hp
.done
AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before
PLP
RTL
;--------------------------------------------------------------------------------
;$03 - HeartPiece_Spectacle
;$05 - HeartPiece_Mountain_Warp
;$28 - HeartPiece_Maze
;$30 - HeartPiece_Desert
;$35 - HeartPiece_Lake
;$3B - HeartPiece_Swamp
;$42 - HeartPiece_Cliffside - not really but the gfx load weird otherwise
;$4A - HeartPiece_Cliffside
;$5B - HeartPiece_Pyramid
;$68 - HeartPiece_Digging
;$81 - HeartPiece_Zora
;--------------------------------------------------------------------------------
LoadHeartContainerRoomValue:
LoadBossValue:
PHP
REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way
CMP.w #200 : BNE +
LDA HeartContainer_ArmosKnights
BRL .done
+ CMP.w #51 : BNE +
LDA HeartContainer_Lanmolas
BRL .done
+ CMP.w #7 : BNE +
LDA HeartContainer_Moldorm
BRL .done
+ CMP.w #90 : BNE +
LDA HeartContainer_HelmasaurKing
BRL .done
+ CMP.w #6 : BNE +
LDA HeartContainer_Arrghus
BRL .done
+ CMP.w #41 : BNE +
LDA HeartContainer_Mothula
BRL .done
+ CMP.w #172 : BNE +
LDA HeartContainer_Blind
BRL .done
+ CMP.w #222 : BNE +
LDA HeartContainer_Kholdstare
BRL .done
+ CMP.w #144 : BNE +
LDA HeartContainer_Vitreous
BRL .done
+ CMP.w #164 : BNE +
LDA HeartContainer_Trinexx
BRL .done
+
LDA.w #$003E ; default to a normal boss heart
.done
AND.w #$00FF ; the loads are words but the values are 1-byte so we need to clear the top half of the accumulator - no guarantee it was 8-bit before
PLP
RTL
;--------------------------------------------------------------------------------
CheckIfBossRoom:
;--------------------------------------------------------------------------------
; Carry set if we're in a boss room, unset otherwise.
;--------------------------------------------------------------------------------
REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way
CMP.w #200 : BNE +
SEC : BRL .done
+ CMP.w #51 : BNE +
SEC : BRL .done
+ CMP.w #7 : BNE +
SEC : BRL .done
+ CMP.w #90 : BNE +
SEC : BRL .done
+ CMP.w #6 : BNE +
SEC : BRL .done
+ CMP.w #41 : BNE +
SEC : BRL .done
+ CMP.w #172 : BNE +
SEC : BRL .done
+ CMP.w #222 : BNE +
SEC : BRL .done
+ CMP.w #144 : BNE +
SEC : BRL .done
+ CMP.w #164 : BNE +
SEC : BRL .done
+
CLC
.done
SEP #$20 ; set 8-bit accumulator
RTL
;--------------------------------------------------------------------------------
;#200 - Eastern Palace - Armos Knights
;#51 - Desert Palace - Lanmolas
;#7 - Tower of Hera - Moldorm
;#32 - Agahnim's Tower - Agahnim I
;#90 - Palace of Darkness - Helmasaur King
;#6 - Swamp Palace - Arrghus
;#41 - Skull Woods - Mothula
;#172 - Thieves' Town - Blind
;#222 - Ice Palace - Kholdstare
;#144 - Misery Mire - Vitreous
;#164 - Turtle Rock - Trinexx
;#13 - Ganon's Tower - Agahnim II
;#0 - Pyramid of Power - Ganon
;--------------------------------------------------------------------------------
;JSL $06DD40 ; DashKey_Draw
;JSL $06DBF8 ; Sprite_PrepAndDrawSingleLargeLong
;JSL $06DC00 ; Sprite_PrepAndDrawSingleSmallLong ; draw first cell correctly
;JSL $00D51B ; GetAnimatedSpriteTile
;JSL $00D52D ; GetAnimatedSpriteTile.variable
;================================================================================

1555
hooks.asm Normal file

File diff suppressed because it is too large Load Diff

45
hud.asm Normal file
View File

@@ -0,0 +1,45 @@
;org $0DFE97 ; <- 6FE97 - headsup_display.asm:1009 (.hud_tilemap)
HUD_TileMap:
dw $207F, $207F, $2850, $A856
dw $2852, $285B, $285B, $285C
;dw $207F, $3CA8, $207F, $207F, $207F
dw $207F, $3C02, $3C03, $207F, $207F
dw $2C88, $2C89, $207F, $20A7
dw $20A9, $207F, $2871 ;, $207F
dw $207F, $207F, $288B, $288F
dw $24AB, $24AC, $688F, $688B
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $2854, $2871
dw $2858, $207F, $207F, $285D
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $2854, $304E
dw $2858, $207F, $207F, $285D
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $2854, $305E
dw $2859, $A85B, $A85B, $A85C
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $2854, $305E
dw $6854, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $207F, $207F
dw $207F, $207F, $A850, $2856
dw $E850

BIN
hudpalette.pal Normal file

Binary file not shown.

27
init.asm Normal file
View File

@@ -0,0 +1,27 @@
;--------------------------------------------------------------------------------
; Init_Primary
;--------------------------------------------------------------------------------
; This can be as inefficient as we want. Interrupts are off when this gets
; called and it only gets called once ever during RESET.
;--------------------------------------------------------------------------------
Init_Primary:
LDA #$00
LDX #$00 ; initalize our ram
-
STA $7EC025, X
STA $7F5000, X
INX
CPX #$10 : !BLT -
LDX #$10 ; initalize more ram
-
STA $7F5000, X
INX
CPX #$FF : !BLT -
LDA.b #$01 : STA $420D ; enable fastrom access on upper banks
LDA.b #$81 : STA $4200 ; thing we wrote over, turn on NMI & gamepad
RTL
;--------------------------------------------------------------------------------

984
inventory.asm Normal file
View File

@@ -0,0 +1,984 @@
;================================================================================
; Inventory Updates
;================================================================================
!INVENTORY_SWAP = "$7EF412"
; Item Tracking Slot
; brmp-skf
; b = blue boomerang
; r = red boomerang
; m = mushroom
; p = magic powder
; -
; s = shovel
; k = fake flute
; f = working flute
;--------------------------------------------------------------------------------
!INVENTORY_SWAP_2 = "$7EF414"
; Item Tracking Slot #2
; bs------
; b = bow
; s = silver arrow bow
; -
; -
; -
; -
; -
; -
;--------------------------------------------------------------------------------
; ProcessMenuButtons:
; out: Carry - 0 = No Button, 1 = Yes Button
;--------------------------------------------------------------------------------
ProcessMenuButtons:
;LDA #$FD : STA !INVENTORY_SWAP ; DEBUG MODE
;LDA $F6 : BIT #$20 : BNE .l_pressed ; check for P1 L-button
LDA $F4 : BIT #$40 : BNE .y_pressed ; check for P1 Y-button
BIT #$20 : BNE .sel_pressed ; check for P1 Select button
LDA $F0 : BIT #$20 : BNE .sel_held
.sel_unheld
LDA !HUD_FLAG : AND #$20 : BEQ +
LDA !HUD_FLAG : AND #$DF : STA !HUD_FLAG ; select is released, unset hud flag
LDA $1B : BEQ + ; skip if outdoors
LDA.b #$20 : STA $012F ; menu select sound
+
JSL.l ResetEquipment
+
.sel_held
CLC ; no buttons
RTL
.sel_pressed
LDA !HUD_FLAG : ORA #$20 : STA !HUD_FLAG ; set hud flag
LDA.b #$20 : STA $012F ; menu select sound
JSL.l ResetEquipment
RTL
.y_pressed
LDA.b #$10 : STA $0207
LDA $0202 ; check selected item
CMP #$02 : BNE + ; boomerang
LDA !INVENTORY_SWAP : AND #$C0 : CMP #$C0 : BNE .errorJump ; make sure we have both boomerangs
LDA $7EF341 : EOR #$03 : STA $7EF341 ; swap blue & red boomerang
LDA.b #$20 : STA $012F ; menu select sound
BRL .captured
+ CMP #$01 : BNE + ; bow
LDA !INVENTORY_SWAP_2 : AND #$C0 : CMP #$C0 : BNE .errorJump ; make sure we have both bows
LDA $7EF340 : !SUB #$01 : EOR #$02 : !ADD #$01 : STA $7EF340 ; swap bows
LDA.b #$20 : STA $012F ; menu select sound
BRL .captured
+ CMP #$05 : BNE + ; powder
LDA !INVENTORY_SWAP : AND #$30 : CMP #$30 : BNE .errorJump ; make sure we have mushroom & magic powder
LDA $7EF344 : EOR #$03 : STA $7EF344 ; swap mushroom & magic powder
LDA.b #$20 : STA $012F ; menu select sound
BRL .captured
;+ BRA +
.errorJump
BRA .error
+ CMP #$0D : BNE + ; flute
LDA $037A : CMP #$01 : BEQ .midShovel ; inside a shovel animation, force the shovel & make error sound
LDA !INVENTORY_SWAP : BIT #$04 : BEQ .error ; make sure we have shovel
AND #$03 : BEQ .error ; make sure we have one of the flutes
LDA $7EF34C : CMP #01 : BNE .toShovel ; not shovel
LDA !INVENTORY_SWAP : AND #$01 : BEQ .toFakeFlute ; check for real flute
LDA #$03 ; set real flute
BRA .fluteSuccess
.toFakeFlute
LDA #$02 ; set fake flute
BRA .fluteSuccess
.toShovel
LDA #$01 ; set shovel
.fluteSuccess
STA $7EF34C ; store set item
LDA.b #$20 : STA $012F ; menu select sound
BRA .captured
+
CMP #$10 : BNE .error : JSL.l ProcessBottleMenu : BRA .captured : +
CLC
RTL
.midShovel
LDA #$01 : STA $7EF34C ; set shovel
.error
LDA.b #$3C : STA $012E ; error sound
.captured
SEC
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
;ProcessBottleMenu:
;--------------------------------------------------------------------------------
ProcessBottleMenu:
LDA $F4 : AND #$40 : BEQ .y_not_pressed ; skip if Y is not down
LDA $7EF34F ; check bottle state
BEQ .no_bottles ; skip if we have no bottles
PHX
INC : CMP #$05 : !BLT + : LDA #$01 : + ;increment and wrap 1-4
TAX : LDA $7EF35C-1, X ; check bottle
BNE + : LDX #$01 : + ; wrap if we reached the last bottle
TXA : STA $7EF34F ; set bottle index
LDA.b #$20 : STA $012F ; menu select sound
PLX
.no_bottles
LDA #$00 ; pretend like the controller state was 0 from the overridden load
RTL
.y_not_pressed
LDA $F4 : AND.b #$0C ; thing we wrote over - load controller state
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
;OpenBottleMenu:
;--------------------------------------------------------------------------------
OpenBottleMenu:
LDA $F6 : AND #$40 : BEQ .x_not_pressed ; skip if X is not down
LDA.b #$10 : STA $0207 ; set 16 frame cool off
LDA.b #$20 : STA $012F ; make menu sound
LDA.b #$07 : STA $0200 ; thing we wrote over - opens bottle menu
.x_not_pressed
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
;CloseBottleMenu:
;--------------------------------------------------------------------------------
CloseBottleMenu:
LDA $F6 : AND #$40 : BEQ .x_not_pressed ; skip if X is not down
LDA.b #$10 : STA $0207 ; set 16 frame cool off
LDA.b #$20 : STA $012F ; make menu sound
INC $0200 ; return to normal menu
STZ $0205
LDA #$00
RTL
.x_not_pressed
LDA $F4 : AND.b #$0C ; thing we wrote over (probably)
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; AddInventory:
;--------------------------------------------------------------------------------
!LOCK_STATS = "$7EF443"
macro TopHalf(address)
LDA <address> : !ADD #$10 : STA <address>
endmacro
macro BottomHalf(address)
PHA : PHX
LDA <address> : INC : AND #$0F : TAX
LDA <address> : AND #$F0 : STA <address>
TXA : ORA <address> : STA <address>
PLX : PLA
endmacro
;--------------------------------------------------------------------------------
FullInventoryExternal:
LDA !LOCK_STATS : BEQ + : RTL : +
PHA : PHX : PHP : JMP AddInventory_fullItemCounts
;--------------------------------------------------------------------------------
AddInventory:
PHA : PHX : PHP
CPY.b #$0C : BNE + ; Blue Boomerang
LDA !INVENTORY_SWAP : ORA #$80 : STA !INVENTORY_SWAP
BRL .incrementCounts
+ CPY.b #$2A : BNE + ; Red Boomerang
LDA !INVENTORY_SWAP : ORA #$40 : STA !INVENTORY_SWAP
BRL .incrementCounts
+ CPY.b #$29 : BNE + ; Mushroom
LDA !INVENTORY_SWAP : ORA #$20 : STA !INVENTORY_SWAP
BRL .incrementCounts
+ CPY.b #$0D : BNE + ; Magic Powder
LDA !INVENTORY_SWAP : ORA #$10 : STA !INVENTORY_SWAP
BRL .incrementCounts
+ CPY.b #$13 : BNE + ; Shovel
LDA !INVENTORY_SWAP : ORA #$04 : STA !INVENTORY_SWAP
BRL .incrementCounts
+ CPY.b #$14 : BNE + ; Flute (Inactive)
LDA !INVENTORY_SWAP : ORA #$02 : STA !INVENTORY_SWAP
BRL .incrementCounts
+ CPY.b #$4A : BNE + ; Flute (Active)
LDA !INVENTORY_SWAP : ORA #$01 : STA !INVENTORY_SWAP
BRL .incrementCounts
+ CPY.b #$0B : BNE + ; Bow
LDA !INVENTORY_SWAP_2 : ORA #$80 : STA !INVENTORY_SWAP_2
BRL .incrementCounts
+ CPY.b #$3A : BNE + ; Bow & Arrows
LDA !INVENTORY_SWAP_2 : ORA #$80 : STA !INVENTORY_SWAP_2
BRL .incrementCounts
+ CPY.b #$3B : BNE + ; Bow & Silver Arrows
LDA !INVENTORY_SWAP_2 : ORA #$40 : STA !INVENTORY_SWAP_2
BRL .incrementCounts
+ CPY.b #$58 : BNE + ; Upgrade-Only Silver Arrows
LDA !INVENTORY_SWAP_2 : ORA #$40 : STA !INVENTORY_SWAP_2
+
.incrementCounts
LDA !LOCK_STATS : BEQ + : BRL .done : +
; don't count any of this stuff
CPY.b #$20 : BNE + : BRL .itemCounts : + ; Crystal
CPY.b #$26 : BNE + : BRL .itemCounts : + ; Heart Piece Completion Heart
CPY.b #$2E : BNE + : BRL .itemCounts : + ; Red Potion (Refill)
CPY.b #$2F : BNE + : BRL .itemCounts : + ; Green Potion (Refill)
CPY.b #$30 : BNE + : BRL .itemCounts : + ; Blue Potion (Refill)
CPY.b #$37 : BNE + : BRL .itemCounts : + ; Pendant
CPY.b #$38 : BNE + : BRL .itemCounts : + ; Pendant
CPY.b #$39 : BNE + : BRL .itemCounts : + ; Pendant
CPY.b #$00 : BNE + : BRL .itemCounts : + ; Uncle Sword & Shield
CPY.b #$04 : !BLT .isSword ; Swords - Skip Shop/Fairy Check for Swords
CPY.b #$50 : BEQ .isSword
BRA +
.isSword
LDA $7EF42A : AND #$40 : BNE ++ ; skip additional processing if we have the fairy sword flag yet
BRL .dungeonCounts
++
BRL .itemCounts
+
CPY.b #$3B : BNE + : BRL .dungeonCounts : + ; Silver Arrow Bow - Skip Shop/Fairy Check for Silver Arrow Bow
LDA $02E9 : CMP #$01 : BEQ ++ ; skip shop check for chests
PHP : REP #$20 ; set 16-bit accumulator
LDA $048E
CMP.w #274 : BNE + : BRL .shop : + ; dark world death mountain shop, ornamental shield shop
CMP.w #271 : BNE + : BRL .shop : + ; villiage of outcasts shop, lumberjack shop, lake hylia shop, dark world magic shop
CMP.w #272 : BNE + : BRL .shop : + ; red shield shop
CMP.w #284 : BNE + : BRL .shop : + ; bomb shop
;CMP.w #265 : BNE + : BRL .shop : + ; potion shop - commented this out because it's easier to just block potion refills
;CMP.w #271 : BNE + : BRL .shop : + ; lake hylia shop
CMP.w #287 : BNE + : BRL .shop : + ; kakariko shop
CMP.w #255 : BNE + : BRL .shop : + ; light world death mountain shop
CMP.w #276 : BNE + : BRL .shop : + ; waterfall fairy
CMP.w #278 : BNE + : BRL .shop : + ; pyramid fairy
PLP : BRA ++
.shop
PLP : BRL .done
++
.dungeonCounts
LDA $1B : BNE + : BRL .fullItemCounts : +
LDA $040C ; get dungeon id
CMP.b #$00 : BNE + ; Sewers (Escape)
BRA ++
+ CMP.b #$02 : BNE + ; Hyrule Castle (Escape)
++
CPY.b #$32 : BNE ++ : BRL .itemCounts : ++ ; Ball & Chain Guard's Big Key
%TopHalf($7EF434)
BRL .fullItemCounts
+ CMP.b #$04 : BNE + ; Eastern Palace
LDA $7EF436 : INC : AND #$07 : TAX
LDA $7EF436 : AND #$F8 : STA $7EF436
TXA : ORA $7EF436 : STA $7EF436
BRL .fullItemCounts
+ CMP.b #$06 : BNE + ; Desert Palace
LDA $7EF435 : !ADD #$20 : STA $7EF435
BRL .fullItemCounts
+ CMP.b #$08 : BNE + ; Agahnim's Tower
LDA $7EF435 : INC : AND #$03 : TAX
LDA $7EF435 : AND #$FC : STA $7EF435
TXA : ORA $7EF435 : STA $7EF435
BRL .fullItemCounts
+ CMP.b #$0A : BNE + ; Swamp Palace
%BottomHalf($7EF439)
BRL .fullItemCounts
+ CMP.b #$0C : BNE + ; Palace of Darkness
%BottomHalf($7EF434)
BRL .fullItemCounts
+ CMP.b #$0E : BNE + ; Misery Mire
%BottomHalf($7EF438)
BRL .fullItemCounts
+ CMP.b #$10 : BNE + ; Skull Woods
%TopHalf($7EF437)
BRL .fullItemCounts
+ CMP.b #$12 : BNE + ; Ice Palace
%TopHalf($7EF438)
BRL .fullItemCounts
+ CMP.b #$14 : BNE + ; Tower of Hera
LDA $7EF435 : !ADD #$04 : AND #$1C : TAX
LDA $7EF435 : AND #$E3 : STA $7EF435
TXA : ORA $7EF435 : STA $7EF435
BRL .fullItemCounts
+ CMP.b #$16 : BNE + ; Thieves' Town
%BottomHalf($7EF437)
BRL .fullItemCounts
+ CMP.b #$18 : BNE + ; Turtle Rock
%TopHalf($7EF439)
BRL .fullItemCounts
+ CMP.b #$1A : BNE + ; Ganon's Tower
LDA $7EF436 : !ADD #$08 : STA $7EF436
LDA $7EF366 : AND #$04 : BNE ++
JSR .incrementGTowerPreBigKey
++
;BRL .fullItemCounts
+
.fullItemCounts
CPY.b #$3B : BNE + ; Skip Total Counts for Repeat Silver Arrows
LDA $7EF42A : BIT #$20 : BEQ + : BRA .itemCounts
+
LDA $7EF355 : BNE + ; Check for Boots
LDA $7EF432 : INC : STA $7EF432 ; Increment Pre Boots Counter
+
LDA $7EF353 : BNE + ; Check for Mirror
LDA $7EF433 : INC : STA $7EF433 ; Increment Pre Mirror Counter
+
LDA $7EF423 : INC : STA $7EF423 ; Increment Item Total
.itemCounts
CPY.b #$00 : BNE + ; Fighter's Sword & Fighter's Shield
JSR .incrementSword
JSR .incrementShield
BRL .done
+ CPY.b #$01 : BNE + ; Master Sword
JSR .incrementSword
BRL .done
+ CPY.b #$02 : BNE + ; Tempered Sword
JSR .incrementSword
BRL .done
+ CPY.b #$03 : BNE + ; Golden Sword
JSR .incrementSword
BRL .done
+ CPY.b #$04 : BNE + ; Fighter's Shield
JSR .incrementShield
BRL .done
+ CPY.b #$05 : BNE + ; Red Shield
JSR .incrementShield
BRL .done
+ CPY.b #$06 : BNE + ; Mirror Shield
JSR .incrementShield
BRL .done
+ CPY.b #$07 : !BLT + ; Items 7 - D
CPY.b #$0E : !BGE +
JSR .incrementY
BRL .done
+ CPY.b #$0F : !BLT + ; Items F - 16
CPY.b #$17 : !BGE +
JSR .incrementY
BRL .done
+ CPY.b #$17 : BNE + ; Heart Piece
JSR .incrementHeartPiece
BRL .done
+ CPY.b #$18 : !BLT + ; Items 18 - 1A
CPY.b #$1B : !BGE +
JSR .incrementY
BRL .done
+ CPY.b #$1D : BNE + ; Book of Mudora - leave this above the 1B-1F condition
JSR .incrementY
BRL .done
+ CPY.b #$1B : !BLT + ; Items 1B - 1F
CPY.b #$20 : !BGE +
JSR .incrementA
BRL .done
+ CPY.b #$20 : BNE + ; Crystal
JSR .incrementCrystal
BRL .done
+ CPY.b #$21 : BNE + ; Bug Net
JSR .incrementY
BRL .done
+ CPY.b #$22 : !BLT + ; Items 22 - 23
CPY.b #$24 : !BGE +
JSR .incrementMail
BRL .done
+ CPY.b #$24 : BNE + ; Small Key
JSR .incrementKey
BRL .done
+ CPY.b #$25 : BNE + ; Compass
JSR .incrementCompass
BRL .done
+ CPY.b #$26 : BNE + ; Liar Heart (Container)
;JSR .incrementHeartContainer
BRL .done
+ CPY.b #$27 : BNE + ; 1 Bomb
JSR .maybeIncrementBombs
BRL .done
+ CPY.b #$28 : BNE + ; 3 Bombs
JSR .maybeIncrementBombs
BRL .done
+ CPY.b #$29 : BNE + ; Musoroom
JSR .incrementY
BRL .done
+ CPY.b #$2A : !BLT + ; Items 2A - 2D
CPY.b #$2E : !BGE +
JSR .incrementY
BRL .done
+ CPY.b #$31 : BNE + ; 10 Bombs
JSR .maybeIncrementBombs
BRL .done
+ CPY.b #$32 : BNE + ; Big Key
JSR .incrementBigKey
BRL .done
+ CPY.b #$33 : BNE + ; Map
JSR .incrementMap
BRL .done
+ CPY.b #$37 : !BLT + ; Items 37 - 39 - Pendants
CPY.b #$3A : !BGE +
JSR .incrementPendant
BRL .done
+ CPY.b #$3A : !BLT + ; Items 3A - 3B - Bow & Silver Arrows
CPY.b #$3C : !BGE +
JSR .incrementBow
BRL .done
+ CPY.b #$3C : BNE + ; Bottle w/Bee
JSR .incrementY
BRL .done
+ CPY.b #$3D : BNE + ; Bottle w/Fairy
JSR .incrementY
BRL .done
+ CPY.b #$3E : !BLT + ; Items 3E - 3F - Heart Containers
CPY.b #$40 : !BGE +
JSR .incrementHeartContainer
BRL .done
+ CPY.b #$48 : BNE + ; Bottle w/Gold Bee
JSR .incrementY
BRL .done
+ CPY.b #$49 : BNE + ; Fighter's Sword
JSR .incrementSword
BRL .done
+ CPY.b #$4A : BNE + ; Flute (Active)
JSR .incrementY
BRL .done
+ CPY.b #$4B : BNE + ; Pegasus Boots
JSR .incrementA
BRL .done
+ CPY.b #$4C : BNE + ; Bomb Capacity Upgrade
JSR .incrementCapacity
JSR .maybeIncrementBombs
BRL .done
+ CPY.b #$4D : !BLT + ; Items 4D - 4F - Capacity Upgrades
CPY.b #$50 : !BGE +
JSR .incrementCapacity
BRL .done
+ CPY.b #$50 : BNE + ; Master Sword (Safe)
JSR .incrementSword
BRL .done
+ CPY.b #$51 : !BLT + ; Items 4D - 4F - Capacity Upgrades
CPY.b #$55 : !BGE +
JSR .incrementCapacity
BRL .done
+ CPY.b #$58 : BNE + ; Upgrade-Only Sivler Arrows
JSR .incrementBow
BRL .done
+
.done
PLP : PLX : PLA
RTL
; WHICH BEE IS BOTTLED?
; MAKE SURE FAIRY FOUNTAINS DON'T FUCK THE COUNTS UP
.incrementSword
; CHECK FOR DUPLICATE SWORDS
TYA ; load sword item
CMP.b #$50 : BNE + : LDA.b #$01 : + ; convert extra master sword to normal one
CMP.b #$49 : BNE + : LDA.b #$00 : + ; convert extra fighter sword to normal one
INC : CMP !HIGHEST_SWORD_LEVEL : !BLT + ; skip if highest is higher
PHA
LDA !HIGHEST_SWORD_LEVEL : AND #$F8 : ORA 1,s : STA !HIGHEST_SWORD_LEVEL
PLA
+
LDA $00 : PHA
LDA.l FairySword : STA $00
CPY $00 : BNE + ; increment if not the fairy sword
LDA $7EF42A : BIT #$40 : BNE ++ ; skip if we have the fairy sword flag yet
ORA.b #$40 : STA $7EF42A ; set fairy sword flag
+
LDA $7EF422 : !ADD #$20 : STA $7EF422 ; increment sword counter
++
PLA : STA $00
RTS
.incrementShield
; CHECK FOR DUPLICATE SHIELDS
LDA $7EF422 : !ADD #$08 : AND #$18 : TAX
LDA $7EF422 : AND #$E7 : STA $7EF422
TXA : ORA $7EF422 : STA $7EF422
RTS
.incrementBow
CPY.b #$3B : BNE ++
LDA $7EF42A : BIT #$20 : BEQ + : RTS : +
ORA #$20 : STA $7EF42A
++
.incrementY
LDA $7EF421 : !ADD #$08 : STA $7EF421
RTS
.incrementA
LDA $7EF421 : INC : AND #$07 : TAX
LDA $7EF421 : AND #$F8 : STA $7EF421
TXA : ORA $7EF421 : STA $7EF421
RTS
.incrementPendant
LDA $7EF429 : INC : AND #$03 : TAX
LDA $7EF429 : AND #$FC : STA $7EF429
TXA : ORA $7EF429 : STA $7EF429
JSR .incrementBossSword
RTS
.incrementCapacity
%BottomHalf($7EF452)
RTS
.incrementHeartPiece
LDA $7EF448 : INC : AND #$1F : TAX
LDA $7EF448 : AND #$E0 : STA $7EF448
TXA : ORA $7EF448 : STA $7EF448
RTS
.incrementHeartContainer
%TopHalf($7EF429)
RTS
.incrementCrystal
LDA $7EF422 : INC : AND #$07 : TAX
LDA $7EF422 : AND #$F8 : STA $7EF422
TXA : ORA $7EF422 : STA $7EF422
JSR .incrementBossSword
RTS
.incrementMail
LDA $7EF424 : !ADD #$40 : STA $7EF424
RTS
.incrementKeyLong
JSR .incrementKey
RTL
.incrementKey
PHA : PHX
LDA $7EF424 : INC : AND #$3F : TAX
LDA $7EF424 : AND #$C0 : STA $7EF424
TXA : ORA $7EF424 : STA $7EF424
PLX : PLA
RTS
.incrementCompass
%BottomHalf($7EF428)
RTS
.incrementBigKey
LDA $7EF427 : !ADD #$10 : STA $7EF427
RTS
.incrementGTowerPreBigKey
LDA $7EF42A : INC : AND #$1F : TAX
LDA $7EF42A : AND #$E0 : STA $7EF42A
TXA : ORA $7EF42A : STA $7EF42A
RTS
.maybeIncrementBombs
LDA $7EF42A : AND #$80 : BNE +
LDA $7EF42A : ORA #$80 : STA $7EF42A
JSR .incrementY
+
RTS
.incrementMap
LDA $7EF428 : !ADD #$10 : STA $7EF428
RTS
.incrementBossSwordLong
JSR .incrementBossSword
RTL
.incrementBossSword
LDA $7EF359
CMP #$01 : BNE +
%TopHalf($7EF425)
+ CMP #$02 : BNE +
%BottomHalf($7EF425)
+ CMP #$03 : BNE +
%TopHalf($7EF426)
+ CMP #$04 : BNE +
%BottomHalf($7EF426)
+
RTS
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Link_ReceiveItem_HUDRefresh:
;--------------------------------------------------------------------------------
Link_ReceiveItem_HUDRefresh:
LDA $7EF343 : BNE + ; skip if we have bombs
LDA $7EF375 : BEQ + ; skip if we are filling no bombs
DEC : STA $7EF375 ; decrease bomb fill count
LDA.b #$01 : STA $7EF343 ; increase actual bomb count
+
JSL.l HUD_RefreshIconLong ; thing we wrote over
JSL.l PostItemGet
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; HandleBombAbsorbtion: ; NOTE CAREFULLY HOW THESE TWO FUNCTIONS ARE PARTIALLY COMMENTED OUT
;--------------------------------------------------------------------------------
HandleBombAbsorbtion:
STA $7EF375 ; thing we wrote over
;RTL ; don't return, fall throgh to next function
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Link_ReceiveItem_PreselectItems:
;--------------------------------------------------------------------------------
;Link_ReceiveItem_PreselectItems:
LDA $0202 : BNE + ; skip if we already have some item selected
; LDA $7EF343 : BEQ + ; skip if we have no bombs
LDA.b #$04 : STA $0202 ; set selected item to bombs
+
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; AddYMarker:
;--------------------------------------------------------------------------------
;!JAR_STATUS = "$7F5030";
AddYMarker:
LDA $0202 : AND.w #$FF ; load item value
CMP.w #$02 : BNE + ; boomerang
LDA !INVENTORY_SWAP : AND.w #$C0 : CMP.w #$C0 : BEQ .drawYBubble : BRA .drawNormal
+ CMP.w #$01 : BNE + ; bow
LDA !INVENTORY_SWAP_2 : AND.w #$C0 : CMP.w #$C0 : BEQ .drawYBubble : BRA .drawNormal
+ CMP.w #$05 : BNE + ; powder
LDA !INVENTORY_SWAP : AND.w #$30 : CMP.w #$30 : BEQ .drawYBubble : BRA .drawNormal
+ CMP.w #$0D : BNE + ; flute
LDA !INVENTORY_SWAP : BIT.w #$04 : BEQ .drawNormal ; make sure we have shovel
AND.w #$03 : BNE .drawYBubble ; make sure we have one of the flutes
BRA .drawNormal
+ CMP.w #$10 : BEQ .drawJarMarker
.drawNormal
LDA.w #$7C60
BRA .drawTile
.drawJarMarker
;SEP #$20 : LDA !JAR_STATUS : INC : AND.b #$01 : STA !JAR_STATUS : REP #$20 : BEQ .drawXBubble
LDA $0207 : AND.w #$0020 : BNE .drawXBubble
.drawYBubble
LDA.w #$3D4F
BRA .drawTile
.drawXBubble
JSR MakeCircleBlue
LDA.w #$2D3E
.drawTile
STA $FFC4, Y
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; MakeCircleBlue
; this is horrible, make it better
;--------------------------------------------------------------------------------
MakeCircleBlue:
LDA $FFC0, Y : AND.w #$EFFF : STA $FFC0, Y
LDA $FFC2, Y : AND.w #$EFFF : STA $FFC2, Y
LDA $FFFE, Y : AND.w #$EFFF : STA $FFFE, Y
LDA $0004, Y : AND.w #$EFFF : STA $0004, Y
LDA $003E, Y : AND.w #$EFFF : STA $003E, Y
LDA $0044, Y : AND.w #$EFFF : STA $0044, Y
LDA $0080, Y : AND.w #$EFFF : STA $0080, Y
LDA $0082, Y : AND.w #$EFFF : STA $0082, Y
LDA $FFBE, Y : AND.w #$EFFF : STA $FFBE, Y
LDA $FFC4, Y : AND.w #$EFFF : STA $FFC4, Y
LDA $0084, Y : AND.w #$EFFF : STA $0084, Y
LDA $007E, Y : AND.w #$EFFF : STA $007E, Y
RTS
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; UpgradeFlute:
;--------------------------------------------------------------------------------
UpgradeFlute:
LDA !INVENTORY_SWAP : AND #$FC : ORA #$01 : STA !INVENTORY_SWAP ; switch to the working flute
LDA.b #$03 : STA $7EF34C ; upgrade primary inventory
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; GetWitchLootOAMTableIndex
; in: A - Loot ID
; out: A - Loot OAM Table Index
;--------------------------------------------------------------------------------
GetWitchLootOAMTableIndex:
PHX
PHB : PHK : PLB
;--------
TAX : LDA .gfxSlots, X ; look up item gfx
PLB : PLX
RTL
;DATA - Loot Identifier to Sprite ID
{
.gfxSlots
db $FF, $FF, $FF, $FF, $05, $06, $FF, $0C
db $0B, $0D, $0A, $07, $13, $0E, $FF, $FF
db $FF, $FF, $FF, $FF, $FF, $09, $FF, $FF
db $08, $FF, $FF, $10, $11, $12, $FF, $FF
db $FF, $FF, $03, $04, $FF, $FF, $02, $FF
db $FF, $FF, $14, $15, $17, $16, $15, $17
db $16, $0F, $FF, $FF, $FF, $FF, $FF, $FF
db $FF, $FF, $FF, $FF, $FF, $FF, $02, $02
db $FF, $FF, $FF, $FF, $01, $FF, $FF, $FF
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
}
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; PrepItemScreenBigKey:
;--------------------------------------------------------------------------------
PrepItemScreenBigKey:
STZ $02
STZ $03
REP #$30 ; thing we wrote over - set 16-bit accumulator
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; LoadPowder:
;--------------------------------------------------------------------------------
LoadPowder:
JSL.l Sprite_SpawnDynamically ; thing we wrote over
LDA WitchItem
JSL.l PrepDynamicTile
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; InitializeBottles:
;--------------------------------------------------------------------------------
InitializeBottles:
STA $7EF35C, X ; thing we wrote over
PHA
LDA $7EF34F : BNE +
TXA : INC : STA $7EF34F ; write bottle index to menu properly
+
PLA
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; DrawPowder:
;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
;--------------------------------------------------------------------------------
DrawPowder:
LDA $02DA : BNE .defer ; defer if link is buying a potion
LDA.l !REDRAW : BEQ +
LDA WitchItem
JSL.l PrepDynamicTile
LDA #$00 : STA.l !REDRAW ; reset redraw flag
BRA .defer
+
LDA WitchItem
JSL.l DrawDynamicTile
.defer
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; LoadMushroom:
;--------------------------------------------------------------------------------
LoadMushroom:
LDA.b #$00 : STA $0DC0, X ; thing we wrote over
.justGFX
;LDA MushroomItem
;JSL.l PrepDynamicTile
PHA
LDA #$01 : STA !REDRAW
LDA $5D : CMP #$14 : BEQ .skip ; skip if we're mid-mirror
LDA #$00 : STA !REDRAW
LDA MushroomItem
JSL.l PrepDynamicTile
.skip
PLA
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; DrawMushroom:
;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
;--------------------------------------------------------------------------------
DrawMushroom:
PHA : PHY
LDA !REDRAW : BEQ .skipInit ; skip init if already ready
JSL.l LoadMushroom_justGFX
BRA .done ; don't draw on the init frame
.skipInit
LDA MushroomItem
JSL.l DrawDynamicTile
.done
PLY : PLA
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; CollectPowder:
;--------------------------------------------------------------------------------
CollectPowder:
LDA.l WitchItem : TAY ; load witch item
STZ $02E9 ; item from NPC
JSL.l Link_ReceiveItem
;JSL.l FullInventoryExternal
JSL.l ItemSet_Powder
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; RemoveMushroom:
;--------------------------------------------------------------------------------
RemoveMushroom:
LDA !INVENTORY_SWAP : AND #$DF : STA !INVENTORY_SWAP ; remove the mushroom
AND #$10 : BEQ .empty ; check if we have powder
LDA.b #$02 : STA $7EF344 ; give powder if we have it
RTL
.empty
LDA.b #$00 : STA $7EF344 ; clear the inventory slot if we don't have powder
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; DrawMagicHeader:
;--------------------------------------------------------------------------------
DrawMagicHeader:
LDA $7EF37B : AND.w #$00FF : CMP.w #$0002 : BEQ .quarterMagic
.halfMagic
LDA.w #$28F7 : STA $7EC704
LDA.w #$2851 : STA $7EC706
LDA.w #$28FA : STA $7EC708
RTL
.quarterMagic
LDA.w #$28F7 : STA $7EC704
LDA.w #$2800 : STA $7EC706
LDA.w #$2801 : STA $7EC708
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; FixShovelLock:
;--------------------------------------------------------------------------------
;FixShovelLock:
; LDA $037A : CMP #$01 : BEQ + ; skip if link is shoveling
; LDA $7EF34C ; load shovel/flute item ID
; +
; CMP #$00
;RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; SpawnShovelItem:
;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
SpawnShovelItem:
LDA.b #$01 : STA !REDRAW
LDA $03FC : BEQ +
JSL DiggingGameGuy_AttemptPrizeSpawn
BRL .skip
+
LDA $035B : AND.b #$01 : BNE + : BRL .skip : + ; corner dig fix
PHY : PHP
PHB : PHK : PLB
SEP #$30 ; set 8-bit accumulator and index registers
LDA $1B : BEQ + : JMP .no_drop : + ; skip if indoors
LDA $8A : CMP #$2A : BEQ .no_drop ; don't drop in the haunted grove
CMP #$68 : BEQ .no_drop ; don't drop in the digging game area
JSL GetRandomInt : BIT #$03 : BNE .no_drop ; drop with 1/4 chance
LSR #2 : TAX ; clobber lower 2 bis - we have 64 slots now
LDA .spawn_table, X ; look up the drop on the table
;most of this part below is copied from the digging game
STA $7FFE00
JSL Sprite_SpawnDynamically
LDX.b #$00
LDA $2F : CMP.b #$04 : BEQ + : INX : +
LDA .x_speeds, X : STA $0D50, Y
LDA.b #$00 : STA $0D40, Y
LDA.b #$18 : STA $0F80, Y
LDA.b #$FF : STA $0B58, Y
LDA.b #$30 : STA $0F10, Y
LDA $22 : !ADD .x_offsets, X
AND.b #$F0 : STA $0D10, Y
LDA $23 : ADC.b #$00 : STA $0D30, Y
LDA $20 : !ADD.b #$16 : AND.b #$F0 : STA $0D00, Y
LDA $21 : ADC.b #$00 : STA $0D20, Y
LDA.b #$00 : STA $0F20, Y
TYX
LDA.b #$30 : JSL Sound_SetSfx3PanLong
.no_drop
PLB
PLP : PLY
.skip
RTL
;DATA - Shovel Spawn Information
{
.x_speeds
db $F0
db $10
.x_offsets
db $00
db $13
.spawn_table
db $B2 ; Gold Bee
db $D8, $D8, $D8 ; Single Heart
db $D8, $D8, $D8, $D8, $D8 ; Single Heart
db $D9, $D9, $D9, $D9, $D9 ; Green Rupee
db $DA, $DA, $DA, $DA, $DA ; Blue Rupee
db $DB, $DB, $DB, $DB, $DB ; Red Rupee
db $DC, $DC, $DC, $DC, $DC ; 1 Bomb
db $DD, $DD, $DD, $DD, $DD ; 4 Bombs
db $DE, $DE, $DE, $DE, $DE ; 8 Bombs
db $DF, $DF, $DF, $DF, $DF ; Small Magic
db $E0, $E0, $E0, $E0, $E0 ; Large Magic
db $E1, $E1, $E1, $E1, $E1 ; 5 Arrows
db $E2, $E2, $E2, $E2, $E2 ; 10 Arrows
db $E3, $E3, $E3, $E3, $E3 ; Fairy
}
;--------------------------------------------------------------------------------

68
itemdowngrade.asm Normal file
View File

@@ -0,0 +1,68 @@
;================================================================================
; Item Downgrade Fix
;--------------------------------------------------------------------------------
ItemDowngradeFix:
JSL.l AddInventory
BMI .dontWrite ; thing we wrote over part 1
CPY.b #$1B : BEQ .isPowerGloves ; Power Gloves
CPY.b #$05 : BEQ .isRedShield ; Red Shield
CPY.b #$04 : BEQ .isBlueShield ; Blue Shield
CPY.b #$0C : BEQ .isBlueBoomerang ; Blue Boomerang
CPY.b #$0B : BEQ .isBow ; Bow
CPY.b #$3A : BEQ .isBowAndArrows ; Bow
CPY.b #$49 : BEQ .isFightersSword ; Fighter's Sword
CPY.b #$01 : BEQ .isMasterSword ; Master Sword
CPY.b #$50 : BEQ .isMasterSword ; Master Sword (Safe)
CPY.b #$02 : BEQ .isTemperedSword ; Tempered Sword
CPY.b #$3B : BEQ .isSilverArrowBow ; Silver Arrow Bow
CPY.b #$2A : BEQ .isRedBoomerang ; Red Boomerang
CPY.b #$0D : BEQ .isMagicPowder ; Magic Powder
CPY.b #$14 : BEQ .isFlute ; Flute
CPY.b #$13 : BEQ .isShovel ; Shovel
CPY.b #$29 : BEQ .isMushroom ; Mushroom
.done
STA [$00] ; thing we wrote over part 2
.dontWrite
RTL
.isPowerGloves
.isBlueShield
.isRedShield
.isBlueBoomerang
.isBow
.isBowAndArrows
CMP [$00] : !BGE .done ; finished if we're upgrading
LDA [$00] ; reload old value
RTL
.isSilverArrowBow
.isRedBoomerang
.isMagicPowder
.isFlute
.isShovel
.isMushroom
PHA
LDA [$00] : BNE + ; don't upgrade if we already have the toggle for it
PLA
STA [$00]
RTL
+
PLA
RTL
.isFightersSword
.isMasterSword
.isTemperedSword
PHA
TYA ; load sword item
CMP.b #$49 : BNE + : LDA.b #$00 : + ; convert extra fighter's sword to normal one
CMP.b #$50 : BNE + : LDA.b #$01 : + ; convert extra master sword to normal one
INC : CMP !HIGHEST_SWORD_LEVEL : !BGE + ; skip if highest is lower (this is an upgrade)
LDA !HIGHEST_SWORD_LEVEL : DEC ; convert to item id
TAY : PLA : LDA !HIGHEST_SWORD_LEVEL ; put sword id into the thing to write
BRL .done
+
PLA
BRL .done
;================================================================================

33
lampmantlecone.asm Normal file
View File

@@ -0,0 +1,33 @@
;================================================================================
; Lamp Mantle & Light Cone Fix
;--------------------------------------------------------------------------------
; Output: 0 for darkness, 1 for lamp cone
;--------------------------------------------------------------------------------
LampCheck:
LDA $7EF34A : BNE .done ; skip if we already have lantern
LDA $7EF3CA : BNE +
.lightWorld
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
;================================================================================
;--------------------------------------------------------------------------------
; Output: 0 locked, 1 open
;--------------------------------------------------------------------------------
CheckForZelda:
LDA.l OpenMode : BEQ + ; Skip if not open mode
LDA.b #$01 ; open mode, pretend we have zelda anyway
RTL
+
LDA $7EF3CC
RTL
;================================================================================
;LDA $7EF3CA : EOR #$40 : LSR #6 : AND #$01 ; return the same result as having the lantern in the light world

7
license.txt Normal file
View File

@@ -0,0 +1,7 @@
Copyright 2016, 2017 ALT Computer Solutions
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

24
maidencrystals.asm Normal file
View File

@@ -0,0 +1,24 @@
;================================================================================
; Maiden Crystal Fixes
;================================================================================
;--------------------------------------------------------------------------------
; MaidenCrystalScript
;--------------------------------------------------------------------------------
MaidenCrystalScript:
STZ $02D8
STZ $02DA
STZ $2E
LDA #$02 : STA $2F
; Load the dungeon index. Is it the Dark Palace?
;LDA $040C : !SUB.b #$0A : TAY : CPY.b #$02 : BNE +
; LDA $7EF3C7 : CMP.b #$07 : BCS ++ : LDA.b #$07 : STA $7EF3C7 : ++
;+
LDA $7EF37A : AND.b #$7F : CMP.b #$7F : BNE + ; check if we have all crystals
LDA.b #$08 : STA $7EF3C7 ; Update the map icon to just be Ganon's Tower
+
JMP $1ECF35 ; <- F4F35 - sprite_crystal_maiden.asm : 426
;--------------------------------------------------------------------------------

16
map.asm Normal file
View File

@@ -0,0 +1,16 @@
; ==============================================================================
PrepMapZoom:
LDA.b #$80 : STA $211A ; thing we wrote over
LDA.b #$00 : STA !MAP_ZOOM
RTL
; ==============================================================================
ForceMapZoom:
LDA !MAP_ZOOM : BNE .isPreset
LDA.b #$01
LDA.b #$01 : STA !MAP_ZOOM
RTL
.isPreset
LDA $F6 : AND.b #$70
RTL
; ==============================================================================

74
medallions.asm Normal file
View File

@@ -0,0 +1,74 @@
;================================================================================
; Medallion Changes & Fixes
;--------------------------------------------------------------------------------
TryOpenMire:
; Checks if we're in the Swamp of Evil.
LDA $8A : CMP.b #$70 : BNE .untriggered
; Checks whether the Misery Mire dungeon is already revealed.
LDA $7EF2F0 : AND.b #$20 : BNE .untriggered
; You have to be in the trigger window.
LDY.b #$02 : JSL.l Ancilla_CheckIfEntranceTriggered : BCC .untriggered
; Do the 3rd animation for opening entrances
LDA.b #$03 : STA $04C6
STZ $B0 ; reset the sub-submodule index
STZ $C8 ; reset this other index.
.untriggered
RTL
;--------------------------------------------------------------------------------
TryOpenTRock:
; Checks if we're at Turtle Rock.
LDA $8A : CMP.b #$47 : BNE .untriggered
; Checks whether the Turtle Rock dungeon is already revealed.
LDA $7EF2C7 : AND.b #$20 : BNE .untriggered
; You have to be in the trigger window.
LDY.b #$03 : JSL.l Ancilla_CheckIfEntranceTriggered : BCC .untriggered
; Do the 4rd animation for opening entrances
LDA.b #$04 : STA $04C6
STZ $B0 ; reset the sub-submodule index
STZ $C8 ; reset this other index.
.untriggered
RTL
;--------------------------------------------------------------------------------
MedallionTrigger_Bombos:
STZ $50 ; stuff we wrote over
STZ $0FC1
PHA
LDA.l MireRequiredMedallion : BNE +
JSL.l TryOpenMire
+ LDA.l TRockRequiredMedallion : BNE +
JSL.l TryOpenTRock
+
PLA
RTL
;--------------------------------------------------------------------------------
MedallionTrigger_Ether:
PHA
LDA.l MireRequiredMedallion : CMP #$01 : BNE +
JSL.l TryOpenMire
+ LDA.l TRockRequiredMedallion : CMP #$01 : BNE +
JSL.l TryOpenTRock
+
PLA
RTL
;--------------------------------------------------------------------------------
MedallionTrigger_Quake:
PHA
LDA.l MireRequiredMedallion : CMP #$02 : BNE +
JSL.l TryOpenMire
+ LDA.l TRockRequiredMedallion : CMP #$02 : BNE +
JSL.l TryOpenTRock
+
PLA
RTL
;--------------------------------------------------------------------------------

732
newitems.asm Executable file
View File

@@ -0,0 +1,732 @@
;================================================================================
; New Item Handlers
;--------------------------------------------------------------------------------
; REMEMBER TO UPDATE THE TABLES IN UTILITIES.ASM!
;--------------------------------------------------------------------------------
; #$4C - Bomb Capacity (50)
; #$4D - Arrow Capacity (70)
; #$4E - 1/2 Magic
; #$4F - 1/4 Magic
; #$50 - Safe Master Sword
; #$51 - Bomb Capacity (+5)
; #$52 - Bomb Capacity (+10)
; #$53 - Arrow Capacity (+5)
; #$54 - Arrow Capacity (+10)
; #$55 - Programmable Item 1
; #$56 - Programmable Item 2
; #$57 - Programmable Item 3
; #$58 - Upgrade-Only Silver Arrows
; #$59 - Rupoor
; #$5A - Null Item
; #$5B - Red Clock
; #$5C - Blue Clock
; #$5D - Green Clock
; #$5E - Progressive Sword
; #$5F - Progressive Shield
; #$60 - Progressive Armor
; #$61 - Progressive Lifting Glove
; #$62 - RNG Pool Item (Single)
; #$63 - RNG Pool Item (Multi)
; #$6A - Goal Item (Single/Triforce)
; #$6B - Goal Item (Multi/Power Star)
; #$70 - Maps
; #$80 - Compasses
; #$90 - Big Keys
; #$A0 - Small Keys
;--------------------------------------------------------------------------------
;GetAnimatedSpriteGfxFile:
; LDY.b #$32
; CMP.b #$39 : BCS + ; If tile index >= 0x39, use sprite file 0x32 (Blank file)
;
; LDY.b #$5D
;
; CMP.b #$23 : BEQ + ; If tile index is 0x23 (Pendant)...
; CMP.b #$37 : BCS + ; ...or tile index >= 0x37, use sprite file 0x5D (Pendant, Boots, 20 Rupees)
;
; LDY.b #$5C
;
; CMP.b #$0C : BEQ + ; If tile index is 0x0C (Flute)...
; CMP.b #$24 : BCS + ; ...or tile index >= 24, use sprite file 0x5C (Rupees, Crystal, Heart Piece ... ...)
;
; ; Otherwise, use sprite file 0x5B (Medallions, Mirror, Flippers, Lantern, Compass...)
; LDY.b #$5B
;+
;JML GetAnimatedSpriteGfxFile_return
;--------------------------------------------------------------------------------
GetAnimatedSpriteGfxFile:
CMP.b #$0C : BNE +
LDY.b #$5C : JML GetAnimatedSpriteGfxFile_return
+
CMP.b #$23 : BNE +
LDY.b #$5D : JML GetAnimatedSpriteGfxFile_return
+
CMP.b #$48 : BNE +
LDY.b #$60 : JML GetAnimatedSpriteGfxFile_return
+
CMP.b #$24 : !BGE +
LDY.b #$5B : JML GetAnimatedSpriteGfxFile_return
+
CMP.b #$37 : !BGE +
LDY.b #$5C : JML GetAnimatedSpriteGfxFile_return
+
CMP.b #$39 : !BGE +
LDY.b #$5D : JML GetAnimatedSpriteGfxFile_return
+
LDY.b #$32
JML GetAnimatedSpriteGfxFile_return
;--------------------------------------------------------------------------------
GetAnimatedSpriteBufferPointer_table:
; Original data:
dw $09C0, $0030, $0060, $0090, $00C0, $0300, $0318, $0330
dw $0348, $0360, $0378, $0390, $0930, $03F0, $0420, $0450
dw $0468, $0600, $0630, $0660, $0690, $06C0, $06F0, $0720 ; disassembly (incorrectly?) says this is $0270
dw $0750, $0768, $0900, $0930, $0960, $0990, $09F0, $0000
dw $00F0, $0A20, $0A50, $0660, $0600, $0618, $0630, $0648
dw $0678, $06D8, $06A8, $0708, $0738, $0768, $0960, $0900
dw $03C0, $0990, $09A8, $09C0, $09D8, $0A08, $0A38, $0600
dw $0630
; New data:
dw $0600, $0630, $0660, $0690 ; 50 Bombs / 70 Arrows / Half Magic / Quarter Magic
dw $06C0, $06F0, $0720 ; +5/+10 Bomb Arrows
;#$4x
dw $0750 ; +10 Arrows
dw $0900 ; Upgrade-Only Silver Arrows
dw $09D8 ; Unused
dw $0930, $0960, $0990, $09C0 ; Lvl 1/2/3/4 Sword (Freestanding)
dw $09F0 ; Null-Item
dw $09C0 ; Clock
dw $0A20 ; Triforce
dw $0A50 ; Power Star
GetAnimatedSpriteBufferPointer:
;PHB : PHK : PLB
LDA.b $00 : ADC.l GetAnimatedSpriteBufferPointer_table, X
;PLB
RTL
;--------------------------------------------------------------------------------
macro ProgrammableItemLogic(index)
LDA.l ProgrammableItemLogicPointer_<index> : BNE ?jump
LDA.l ProgrammableItemLogicPointer_<index>+1 : BNE ?jump
LDA.l ProgrammableItemLogicPointer_<index>+2 : BNE ?jump
BRA ?end
?jump:
JSL.l ProgrammableItemLogicJump_<index>
?end:
endmacro
macro ValueShift()
TAX : LDA.b #$01
?start:
CPX #$00 : BEQ ?end
ASL
DEX
BRA ?start : ?end:
endmacro
;--------------------------------------------------------------------------------
!CHALLENGE_TIMER = "$7EF454"
!GOAL_COUNTER = "$7EF460"
AddReceivedItemExpandedGetItem:
;STA $FFFFFF
PHX
LDA $02D8 ; check inventory
CMP.b #$4C : BNE + ; 50 bombs
;LDA.b #$07 : STA $7EF370 ; upgrade bombs
LDA.b #50 : !SUB.l StartingMaxBombs : STA $7EF370 ; upgrade bombs
LDA.b #50 : STA $7EF375 ; fill bombs
BRL .done
+ CMP.b #$4D : BNE + ; 70 arrows
;LDA #$07 : STA $7EF371 ; upgrade arrows
LDA.b #70 : !SUB.l StartingMaxArrows : STA $7EF371 ; upgrade arrows
LDA.b #70 : STA $7EF376 ; fill arrows
BRL .done
+ CMP.b #$4E : BNE + ; 1/2 magic
LDA $7EF37B : CMP #$02 : !BGE ++
INC : STA $7EF37B ; upgrade magic
++
LDA.b #$80 : STA $7EF373 ; fill magic
BRL .done
+ CMP.b #$4F : BNE + ; 1/4 magic
LDA.b #$02 : STA $7EF37B ; upgrade magic
LDA.b #$80 : STA $7EF373 ; fill magic
BRL .done
+ CMP.b #$50 : BNE + ; Master Sword (Safe)
LDA $7EF359 : CMP.b #$02 : !BGE + ; skip if we have a better sword
LDA.b #$02 : STA $7EF359 ; set master sword
BRL .done
+ CMP.b #$51 : BNE + ; +5 Bombs
LDA $7EF370 : !ADD.b #$05 : STA $7EF370 ; upgrade bombs +5
LDA.l Upgrade5BombsRefill : STA $7EF375 ; fill bombs
BRL .done
+ CMP.b #$52 : BNE + ; +10 Bombs
LDA $7EF370 : !ADD.b #$0A : STA $7EF370 ; upgrade bombs +10
LDA.l Upgrade10BombsRefill : STA $7EF375 ; fill bombs
BRL .done
+ CMP.b #$53 : BNE + ; +5 Arrows
LDA $7EF371 : !ADD.b #$05 : STA $7EF371 ; upgrade arrows +5
LDA.l Upgrade5ArrowsRefill : STA $7EF376 ; fill arrows
BRL .done
+ CMP.b #$54 : BNE + ; +10 Arrows
LDA $7EF371 : !ADD.b #$0A : STA $7EF371 ; upgrade arrows +10
LDA.l Upgrade10ArrowsRefill : STA $7EF376 ; fill arrows
BRL .done
+ CMP.b #$55 : BNE + ; Programmable Object 1
%ProgrammableItemLogic(1)
BRL .done
+ CMP.b #$56 : BNE + ; Programmable Object 2
%ProgrammableItemLogic(2)
BRL .done
+ CMP.b #$57 : BNE + ; Programmable Object 3
%ProgrammableItemLogic(3)
BRL .done
+ CMP.b #$58 : BNE + ; Upgrade-Only Sivler Arrows
+ CMP.b #$59 : BNE + ; 1 Rupoor
REP #$20 : LDA $7EF360 : !SUB RupoorDeduction : STA $7EF360 : SEP #$20 ; Take 1 rupee
BRL .done
+ CMP.b #$5A : BNE + ; Null Item
BRL .done
+ CMP.b #$5B : BNE + ; Red Clock
REP #$20 ; set 16-bit accumulator
LDA !CHALLENGE_TIMER : !ADD.l RedClockAmount : STA !CHALLENGE_TIMER
LDA !CHALLENGE_TIMER+2 : ADC.l RedClockAmount+2 : STA !CHALLENGE_TIMER+2
SEP #$20 ; set 8-bit accumulator
BRL .done
+ CMP.b #$5C : BNE + ; Blue Clock
REP #$20 ; set 16-bit accumulator
LDA !CHALLENGE_TIMER : !ADD.l BlueClockAmount : STA !CHALLENGE_TIMER
LDA !CHALLENGE_TIMER+2 : ADC.l BlueClockAmount+2 : STA !CHALLENGE_TIMER+2
SEP #$20 ; set 8-bit accumulator
BRL .done
+ CMP.b #$5D : BNE + ; Green Clock
REP #$20 ; set 16-bit accumulator
LDA !CHALLENGE_TIMER : !ADD.l GreenClockAmount : STA !CHALLENGE_TIMER
LDA !CHALLENGE_TIMER+2 : ADC.l GreenClockAmount+2 : STA !CHALLENGE_TIMER+2
SEP #$20 ; set 8-bit accumulator
BRL .done
+ CMP.b #$5E : BNE + ; Progressive Sword
BRL .done
+ CMP.b #$5F : BNE + ; Progressive Shield
BRL .done
+ CMP.b #$60 : BNE + ; Progressive Armor
BRL .done
+ CMP.b #$61 : BNE + ; Progressive Lifting Glove
BRL .done
+ CMP.b #$62 : BNE + ; RNG Pool Item (Single)
BRL .done
+ CMP.b #$63 : BNE + ; RNG Pool Item (Multi)
BRL .done
+ CMP.b #$6A : BNE + ; Goal Collectable (Single/Triforce)
JSL.l StatsFinalPrep
BRL .done
+ CMP.b #$6B : BNE + ; Goal Collectable (Multi/Power Star)
BRA .multi_collect
+ CMP.b #$6C : BNE + ; Goal Collectable (Multi/Power Star) Alternate Graphic
.multi_collect
LDA GoalItemRequirement : BEQ ++
LDA !GOAL_COUNTER : INC : STA !GOAL_COUNTER
CMP GoalItemRequirement : !BLT ++ : JSL.l StatsFinalPrep : ++
BRL .done
+ CMP.b #$70 : !BLT + : CMP.b #$80 : !BGE + ; Free Map
AND #$0F : CMP #$08 : !BGE ++
%ValueShift()
ORA $73F368 : STA $7EF368 ; Map 1
++
!SUB #$08
%ValueShift()
ORA $73F369 : STA $7EF369 ; Map 2
BRL .done
+ CMP.b #$80 : !BLT + : CMP.b #$90 : !BGE + ; Free Compass
AND #$0F : CMP #$08 : !BGE ++
%ValueShift()
ORA $73F364 : STA $7EF364 ; Compass 1
++
!SUB #$08
%ValueShift()
ORA $73F365 : STA $7EF365 ; Compass 2
BRL .done
+ CMP.b #$90 : !BLT + : CMP.b #$A0 : !BGE + ; Free Big Key
AND #$0F : CMP #$08 : !BGE ++
%ValueShift()
ORA $73F366 : STA $7EF366 ; Big Key 1
++
!SUB #$08
%ValueShift()
ORA $73F367 : STA $7EF367 ; Big Key 2
BRL .done
+ CMP.b #$A0 : !BLT + : CMP.b #$B0 : !BGE + ; Free Small Key
AND #$0F : TAX
LDA $7EF37C, X : INC : STA $7EF37C, X ; Increment Key Count
BRL .done
+
.done
PLX
LDA $02E9 : CMP.b #$01 ; thing we wrote over
RTL
; #$70 - Maps
; #$80 - Compasses
; #$90 - Big Keys
;--------------------------------------------------------------------------------
!PROGRESSIVE_SHIELD = "$7EF416" ; ss-- ----
!RNG_ITEM = "$7EF450"
!SCRATCH_AREA = "$7F5020"
!SINGLE_INDEX_TEMP = "$7F5020"
!SINGLE_INDEX_OFFSET_TEMP = "$7F5021"
!SINGLE_INDEX_BITMASK_TEMP = "$7F5022"
!LOCK_IN = "$7F5090"
!ITEM_BUSY = "$7F5091"
AddReceivedItemExpanded:
{
PHA : PHX
JSL.l PreItemGet
LDA $02D8 : CMP #$5E : BNE ++ ; Progressive Sword
LDA $7EF359 : BNE + ; No Sword
LDA.b #$49 : STA $02D8 : BRL .done
+ : CMP.b #$01 : BNE + ; Fighter Sword
LDA.b #$50 : STA $02D8 : BRL .done
+ : CMP.b #$02 : BNE + ; Master Sword
LDA.b #$02 : STA $02D8 : BRL .done
+ ; Everything Else
LDA.b #$03 : STA $02D8 : BRL .done
++ : CMP.b #$5F : BNE ++ ; Progressive Shield
LDA !PROGRESSIVE_SHIELD : AND.b #$C0 : BNE + ; No Shield
LDA.b #$04 : STA $02D8
LDA !PROGRESSIVE_SHIELD : AND.b #$3F : ORA.b #$40 : STA !PROGRESSIVE_SHIELD : BRA .done
+ : CMP.b #$40 : BNE + ; Fighter Shield
LDA.b #$05 : STA $02D8
LDA !PROGRESSIVE_SHIELD : AND.b #$3F : ORA.b #$80 : STA !PROGRESSIVE_SHIELD : BRA .done
+ ; Everything Else
LDA.b #$06 : STA $02D8 : BRA .done
++ : CMP.b #$60 : BNE ++ ; Progressive Armor
LDA $7EF35B : BNE + ; No Shield
LDA.b #$22 : STA $02D8 : BRA .done
+ ; Everything Else
LDA.b #$23 : STA $02D8 : BRA .done
++ : CMP.b #$61 : BNE ++ ; Progressive Lifting Glove
LDA $7EF354 : BNE + ; No Lift
LDA.b #$1B : STA $02D8 : BRA .done
+ ; Everything Else
LDA.b #$1C : STA $02D8 : BRA .done
++ : CMP.b #$62 : BNE ++ ; RNG Item (Single)
JSL.l GetRNGItemSingle : STA $02D8
XBA : JSR.w MarkRNGItemSingle
LDA #$FF : STA !LOCK_IN ; clear lock-in
BRA .done
++ : CMP.b #$63 : BNE ++ ; RNG Item (Multi)
JSL.l GetRNGItemMulti : STA $02D8
LDA #$FF : STA !LOCK_IN ; clear lock-in
BRA .done
++
.done
PLX : PLA
PHB : PHK ; we're skipping the corresponding instructions to grab the data bank
JMP.l AddReceivedItem+2
}
;--------------------------------------------------------------------------------
;DATA AddReceivedItemExpanded
{
.y_offsets
db -5, -5, -5, -5, -5, -4, -4, -5
db -5, -4, -4, -4, -2, -4, -4, -4
db -4, -4, -4, -4, -4, -4, -4, -4
db -4, -4, -4, -4, -4, -4, -4, -4
db -4, -4, -4, -5, -4, -4, -4, -4
db -4, -4, -2, -4, -4, -4, -4, -4
db -4, -4, -4, -4, -2, -2, -2, -4
db -4, -4, -4, -4, -4, -4, -4, -4
db -4, -4, -2, -2, -4, -2, -4, -4
db -4, -5, -4, -4
;new
db -4, -4, -4, -4
db -5 ; Master Sword (Safe)
db -4, -4, -4, -4 ; +5/+10 Bomb Arrows
db -4, -4, -4 ; 3x Programmable Item
db -4 ; Upgrade-Only Sivler Arrows
db -4 ; 1 Rupoor
db -4 ; Null Item
db -4, -4, -4 ; Red, Blue & Green Clocks
db -4, -4, -4, -4 ; Progressive Sword, Shield, Armor & Gloves
db -4, -4 ; RNG Single & Multi
db -4, -4, -4, -4, -4, -4 ; Unused
db -4, -4, -4 ; Goal Item Single, Multi & Alt Multi
db -4, -4, -4 ; Unused
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Map
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Compass
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Big Key
db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Small Key
.x_offsets
db 4, 4, 4, 4, 4, 0, 0, 4
db 4, 4, 4, 4, 5, 0, 0, 0
db 0, 0, 0, 4, 0, 4, 0, 0
db 4, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 4, 0, 0, 0
db 0, 0, 5, 0, 0, 0, 0, 0
db 0, 0, 0, 0, 4, 4, 4, 0
db 0, 0, 0, 0, 0, 0, 0, 0
db 0, 0, 4, 4, 0, 4, 0, 0
db 0, 4, 0, 0
;new
db 0, 0, 0, 0
db 4 ; Master Sword (Safe)
db 0, 0, 0, 0 ; +5/+10 Bomb Arrows
db 0, 0, 0 ; 3x Programmable Item
db 0 ; Upgrade-Only Sivler Arrows
db 4 ; 1 Rupoor
db 0 ; Null Item
db 0, 0, 0 ; Red, Blue & Green Clocks
db 0, 0, 0, 0 ; Progressive Sword, Shield, Armor & Gloves
db 0, 0 ; RNG Single & Multi
db 0, 0, 0, 0, 0, 0 ; Unused
db 0, 0, 0 ; Goal Item Single, Multi & Alt Multi
db 0, 0, 0 ; Unused
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Free Map
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Free Compass
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Free Big Key
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Small Key
.item_graphics_indices
db $06, $18, $18, $18, $2D, $20, $2E, $09
db $09, $0A, $08, $05, $10, $0B, $2C, $1B
db $1A, $1C, $14, $19, $0C, $07, $1D, $2F
db $07, $15, $12, $0D, $0D, $0E, $11, $17
db $28, $27, $04, $04, $0F, $16, $03, $13
db $01, $1E, $10, $00, $00, $00, $00, $00
db $00, $30, $22, $21, $24, $24, $24, $23
db $23, $23, $29, $2A, $2C, $2B, $03, $03
db $34, $35, $31, $33, $02, $32, $36, $37
db $2C, $06, $0C, $38
;new
db $39, $3A, $3B, $3C
db $18 ; Master Sword (Safe)
db $3D, $3E, $3F, $40 ; +5/+10 Bomb Arrows
db $00, $00, $00 ; 3x Programmable Item
db $41 ; Upgrade-Only Sivler Arrows
db $24 ; 1 Rupoor
db $47 ; Null Item
db $48, $48, $48 ; Red, Blue & Green Clocks
db $FF, $FF, $04, $0D ; Progressive Sword, Shield, Armor & Gloves
db $FF, $FF ; RNG Single & Multi
db $FF, $FF, $FF, $FF, $FF, $FF ; Unused
db $49, $4A, $49 ; Goal Item Single, Multi & Alt Multi
db $FF, $FF, $FF ; Unused
db $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21 ; Free Map
db $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16 ; Free Compass
db $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22 ; Free Big Key
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F ; Free Small Key
.wide_item_flag
db $00, $00, $00, $00, $00, $02, $02, $00
db $00, $00, $00, $00, $00, $02, $02, $02
db $02, $02, $02, $00, $02, $00, $02, $02
db $00, $02, $02, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $00, $02, $02, $02
db $02, $02, $00, $02, $02, $02, $02, $02
db $02, $02, $02, $02, $00, $00, $00, $02
db $02, $02, $02, $02, $02, $02, $02, $02
db $02, $02, $00, $00, $02, $00, $02, $02
db $02, $00, $02, $02
;new
db $02, $02, $02, $02
db $00 ; Master Sword (Safe)
db $02, $02, $02, $02 ; +5/+10 Bomb Arrows
db $02, $02, $02 ; 3x Programmable Item
db $02 ; Upgrade-Only Sivler Arrows
db $00 ; 1 Rupoor
db $02 ; Null Item
db $02, $02, $02 ; Red, Blue & Green Clocks
db $02, $02, $02, $02 ; Progressive Sword, Shield, Armor & Gloves
db $02, $02 ; RNG Single & Multi
db $02, $02, $02, $02, $02, $02 ; Unused
db $02, $02, $02 ; Goal Item Single, Multi & Alt Multi
db $02, $02, $02 ; Unused
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Free Map
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Free Compass
db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Free Big Key
db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; Free Small Key
.properties
db 5, -1, 5, 5, 5, 5, 5, 1
db 2, 1, 1, 1, 2, 2, 2, 4
db 4, 4, 1, 1, 2, 1, 1, 1
db 2, 1, 2, 1, 4, 4, 2, 1
db 6, 1, 2, 1, 2, 2, 1, 2
db 2, 4, 1, 1, 4, 2, 1, 4
db 2, 2, 4, 4, 4, 2, 1, 4
db 1, 2, 2, 1, 2, 2, 1, 1
db 4, 4, 1, 2, 2, 4, 4, 4
db 2, 5, 2, 1
;new
db 4, 4, 4, 4
db 5 ; Master Sword (Safe)
db 4, 4, 4, 4 ; +5/+10 Bomb Arrows
db 4, 4, 4 ; 3x Programmable Item
db 1 ; Upgrade-Only Sivler Arrows
db 3 ; 1 Rupoor
db 1 ; Null Item
db 1, 2, 4 ; Red, Blue & Green Clocks
db $FF, $FF, $FF, $FF ; Progressive Sword, Shield, Armor & Gloves
db $FF, $FF ; RNG Single & Multi
db 0, 0, 0, 0, 0, 0 ; Unused
db 4, 4, 4 ; Goal Item Single, Multi & Alt Multi
db 0, 0, 0 ; Unused
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Map
db 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ; Free Compass
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Big Key
db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Small Key
; \item Target SRAM addresses for items you receive
.item_target_addr
dw $F359, $F359, $F359, $F359, $F35A, $F35A, $F35A, $F345
dw $F346, $F34B, $F342, $F340, $F341, $F344, $F35C, $F347
dw $F348, $F349, $F34A, $F34C, $F34C, $F350, $F35C, $F36B
dw $F351, $F352, $F353, $F354, $F354, $F34E, $F356, $F357
dw $F37A, $F34D, $F35B, $F35B, $F36F, $F364, $F36C, $F375
dw $F375, $F344, $F341, $F35C, $F35C, $F35C, $F36D, $F36E
dw $F36E, $F375, $F366, $F368, $F360, $F360, $F360, $F374
dw $F374, $F374, $F340, $F340, $F35C, $F35C, $F36C, $F36C
dw $F360, $F360, $F372, $F376, $F376, $F373, $F360, $F360
dw $F35C, $F359, $F34C, $F355
;new
dw $F375, $F376, $F373, $F373
dw $F359 ; Master Sword (Safe)
dw $F375, $F375, $F376, $F376 ; +5/+10 Bomb Arrows
dw $F41A, $F41C, $F41E ; 3x Programmable Item
dw $F340 ; Upgrade-Only Sivler Arrows
dw $F360 ; 1 Rupoor
dw $F36A ; Null Item
dw $F454, $F454, $F454 ; Red, Blue & Green Clocks
dw $F359, $F35A, $F35B, $F354 ; Progressive Sword, Shield, Armor & Gloves
dw $F36A, $F36A ; RNG Single & Multi
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused
dw $F36A, $F36A, $F36A ; Goal Item Single, Multi & Alt Multi
dw $F36A, $F36A, $F36A ; Unused
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Map
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Compass
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Big Key
dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Small Key
}
; DATA Values to write to the above SRAM locations.
{
.item_values
db $01, $02, $03, $04, $01, $02, $03, $01
db $01, $01, $01, $01, $01, $02, $FF, $01
db $01, $01, $01, $01, $02, $01, $FF, $FF
db $01, $01, $02, $01, $02, $01, $01, $01
db $FF, $01, $FF, $02, $FF, $FF, $FF, $FF
db $FF, $FF, $02, $FF, $FF, $FF, $FF, $FF
db $FF, $FF, $FF, $FF, $FF, $FB, $EC, $FF
db $FF, $FF, $01, $03, $FF, $FF, $FF, $FF
db $9C, $CE, $FF, $01, $0A, $FF, $FF, $FF
db $FF, $01, $03, $01
;new
db $32, $46, $80, $80
db $02 ; Master Sword (Safe)
db $FF, $FF, $FF, $FF ; +5/+10 Bomb Arrows
db $FF, $FF, $FF ; 3x Programmable Item
db $FF ; Upgrade-Only Sivler Arrows
db $FF ; 1 Rupoor
db $FF ; Null Item
db $FF, $FF, $FF ; Red, Blue & Green Clocks
db $FF, $FF, $FF, $FF ; Progressive Sword, Shield, Armor & Gloves
db $FF, $FF ; RNG Single & Multi
db $FF, $FF, $FF, $FF, $FF, $FF ; Unused
db $FF, $FF, $FF ; Goal Item Single, Multi & Alt Multi
db $FF, $FF, $FF ; Unused
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Map
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Compass
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Big Key
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Small Key
;0x00 - Sewer Passage
;0x02 - Hyrule Castle
;0x04 - Eastern Palace
;0x06 - Desert Palace
;0x08 - Hyrule Castle 2
;0x0A - Swamp Palace
;0x0C - Dark Palace
;0x0E - Misery Mire
;0x10 - Skull Woods
;0x12 - Ice Palace
;0x14 - Tower of Hera
;0x16 - Gargoyle's Domain
;0x18 - Turtle Rock
;0x1A - Ganon's Tower
.item_masks ; these are dungeon correlations to $7EF364 - $7EF369 so it knows where to store compasses, etc
dw $8000, $4000, $2000, $1000, $0800, $0400, $0200, $0100
dw $0080, $0040, $0020, $0010, $0008, $0004
}
;--------------------------------------------------------------------------------
BottleListExpanded:
db $16, $2B, $2C, $2D, $3D, $3C, $48
PotionListExpanded:
db $2E, $2F, $30, $FF, $0E
;--------------------------------------------------------------------------------
Link_ReceiveItemAlternatesExpanded:
{
db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, -1, -1, $44, -1, -1, -1
db -1, -1, $35, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1 ; db -1, -1, $46, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1, -1, -1, -1, -1
db -1, -1, -1, -1
db -1, -1, -1, -1
db -1 ; Master Sword (Safe)
db -1, -1, -1, -1 ; +5/+10 Bomb Arrows
db -1, -1, -1 ; 3x Programmable Item
db -1 ; Upgrade-Only Sivler Arrows
db -1 ; 1 Rupoor
db -1 ; Null Item
db -1, -1, -1 ; Red, Blue & Green Clocks
db -1, -1, -1, -1 ; Progressive Sword, Shield, Armor & Gloves
db -1, -1 ; RNG Single & Multi
db -1, -1, -1, -1, -1, -1 ; Unused
db -1, -1 ; Goal Item Single, Multi & Alt Multi
db -1, -1, -1, -1 ; Unused
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Map
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Compass
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Big Key
db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Small Key
}
;--------------------------------------------------------------------------------
.loadAlternate
PHB : PHK : PLB
LDA Link_ReceiveItemAlternatesExpanded, Y : STA $03
PLB
RTL
;--------------------------------------------------------------------------------
DrawHUDSilverArrows:
LDA $7EF340 : AND.w #$00FF : BNE +
LDA $7EF414 : AND.w #$0040 : BEQ +
LDA.w #$2810 : STA $11C8
LDA.w #$2811 : STA $11CA
LDA.w #$2820 : STA $1208
LDA.w #$2821 : STA $120A
+
LDA.w #$11CE : STA $00 ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
!RNG_ITEM = "$7EF450"
!SCRATCH_AREA = "$7F5020"
!SINGLE_INDEX_TEMP = "$7F5020"
!SINGLE_INDEX_OFFSET_TEMP = "$7F5021"
!SINGLE_INDEX_BITMASK_TEMP = "$7F5022"
!LOCK_IN = "$7F5090"
GetRNGItemSingle:
LDA !LOCK_IN : CMP #$FF : BEQ + : TAX : XBA : LDA.l RNGSingleItemTable, X : RTL : +
LDX.b #$00
.single_reroll
JSL.l GetRandomInt : AND.b #$7F ; select random value
INX : CPX #$7F : !BLT + : LDA.b #$00 : BRA +++ : + ; default to 0 if too many attempts
CMP.l RNGSingleTableSize : !BGE .single_reroll
+++
STA !SINGLE_INDEX_TEMP ; put our index value here
LDX #$00
.recheck
JSR.w CheckSingleItem : BEQ .single_unused ; already used
LDA !SINGLE_INDEX_TEMP : INC ; increment index
CMP.l RNGSingleTableSize : !BLT +++ : LDA.b #$00 : +++ ; rollover index if needed
STA !SINGLE_INDEX_TEMP ; store index
INX : CPX.l RNGSingleTableSize : !BLT .recheck
LDA.b #$5A ; everything is gone, default to null item
BRA .single_done
.single_unused
LDA !SINGLE_INDEX_TEMP
.single_done
TAX : LDA.l RNGSingleItemTable, X
XBA : LDA.l !SINGLE_INDEX_TEMP : STA !LOCK_IN : XBA
RTL
;--------------------------------------------------------------------------------
CheckSingleItem:
LSR #3 : TAX
LDA.l !RNG_ITEM, X : STA !SINGLE_INDEX_BITMASK_TEMP ; load value to temporary
PHX
LDA !SINGLE_INDEX_TEMP : AND #$07 : TAX ; load 0-7 part into X
LDA !SINGLE_INDEX_BITMASK_TEMP
---
CPX.b #$00 : BEQ +++
LSR
DEX
BRA ---
+++
PLX
AND.b #$01
RTS
;--------------------------------------------------------------------------------
MarkRNGItemSingle:
;STA !SINGLE_INDEX_TEMP
LSR #3 : STA !SINGLE_INDEX_OFFSET_TEMP : TAX
LDA.l !RNG_ITEM, X
STA.l !SINGLE_INDEX_BITMASK_TEMP
LDA.l !SINGLE_INDEX_TEMP : AND #$07 : TAX ; load 0-7 part into X
LDA.b #01
---
CPX.b #$00 : BEQ +++
ASL
DEX
BRA ---
+++
PHA
LDA.l !SINGLE_INDEX_OFFSET_TEMP : TAX
PLA
ORA.l !SINGLE_INDEX_BITMASK_TEMP
STA.l !RNG_ITEM, X
RTS
;--------------------------------------------------------------------------------
GetRNGItemMulti:
LDA !LOCK_IN : CMP #$FF : BEQ + : TAX : XBA : LDA.l RNGMultiItemTable, X : RTL : +
LDX.b #$00
- ; reroll
JSL.l GetRandomInt : AND.b #$7F ; select random value
INX : CPX #$7F : !BLT + : LDA.b 00 : BRA .done : + ; default to 0 if too many attempts
CMP.l RNGMultiTableSize : !BGE -
.done
STA !LOCK_IN
TAX : XBA : LDA.l RNGMultiItemTable, X
RTL
;--------------------------------------------------------------------------------

BIN
newitems.gfx Executable file

Binary file not shown.

172
npcitems.asm Normal file
View File

@@ -0,0 +1,172 @@
;================================================================================
; Randomize NPC Items
;--------------------------------------------------------------------------------
; Old Man - Zora King - Sick Kid - Tree Kid - Sahasrala - Catfish - Rupee NPC
;=SET 1
;OLD_MAN = "#$01"
;ZORA_KING = "#$02"
;SICK_KID = "#$04"
;TREE_KID = "#$08"
;SAHASRALA = "#$10"
;CATFISH = "#$20"
;UNUSED = "#$40"
;BOOK_MUDORA = "#$80"
;=SET 2
;ETHER_TABLET = "#$01"
;BOMBOS_TABLET = "#$02"
;SMITH_SWORD = "#$04"
;FAIRY_SWORD = "#$08"
;MUSHROOM = "#$10"
;POWDER = "#$20"
;UNUSED = "#$40"
;MAGIC_BAT = "#$80"
;--------------------------------------------------------------------------------
!NPC_FLAGS = "$7EF410"
!NPC_FLAGS_2 = "$7EF411"
ItemCheck_FairySword:
LDA !NPC_FLAGS_2 : AND.b #$08
RTL
ItemCheck_SmithSword:
LDA !NPC_FLAGS_2 : AND.b #$04
RTL
ItemCheck_MagicBat:
LDA !NPC_FLAGS_2 : AND.b #$80
RTL
ItemCheck_OldMan:
LDA !NPC_FLAGS : AND.b #$01 : CMP #$01
RTL
ItemCheck_ZoraKing:
LDA !NPC_FLAGS : AND.b #$02
RTL
ItemCheck_SickKid:
LDA !NPC_FLAGS : AND.b #$04
RTL
ItemCheck_TreeKid:
LDA !NPC_FLAGS : AND.b #$08 ; FluteBoy_Chillin - 73: LDA $7EF34C
RTL
ItemCheck_TreeKid2:
LDA !NPC_FLAGS : AND.b #$08 : LSR #$02 ; FluteAardvark_InitialStateFromFluteState - 225: LDA $7EF34C : AND.b #$03
RTL
ItemCheck_TreeKid3:
JSL $0DD030 ; FluteAardvark_Draw - thing we wrote over
LDA !NPC_FLAGS : AND.b #$08
BEQ .normal
BRA .done
LDA.b #$05
.normal
LDA $0D80, X
.done
RTL
ItemCheck_Sahasrala:
LDA !NPC_FLAGS : AND.b #$10
RTL
ItemCheck_Library:
LDA !NPC_FLAGS : AND.b #$80
RTL
ItemCheck_Mushroom:
LDA !NPC_FLAGS_2 : ROL #4 ; does the same thing as below
; LDA !NPC_FLAGS_2 : AND.b #$10 : BEQ .clear
; SEC
;RTL
; .clear
; CLC
RTL
ItemCheck_Powder:
LDA !NPC_FLAGS_2 : AND.b #$20
RTL
ItemCheck_Catfish:
;LDA CatfishGoodItem : BEQ .junk
;PHX
; LDA CatfishGoodItem+1 : TAX
; LDA $7EF340-1, X
;PLX
;--
;CMP CatfishGoodItem : !BLT .oursNewer
;.theirsNewer
;LDA #$20 : RTL ; don't give item
;.oursNewers
;LDA #$00 : RTL ; give item
;.junk
LDA !NPC_FLAGS : AND.b #$20
RTL
;--------------------------------------------------------------------------------
ItemSet_FairySword:
PHA : LDA !NPC_FLAGS_2 : ORA.b #$08 : STA !NPC_FLAGS_2 : PLA
RTL
ItemSet_SmithSword:
PHA : LDA !NPC_FLAGS_2 : ORA.b #$04 : STA !NPC_FLAGS_2 : PLA
RTL
ItemSet_MagicBat:
PHA : LDA !NPC_FLAGS_2 : ORA.b #$80 : STA !NPC_FLAGS_2 : PLA
RTL
ItemSet_OldMan:
JSL.l Link_ReceiveItem ; thing we wrote over
PHA : LDA !NPC_FLAGS : ORA.b #$01 : STA !NPC_FLAGS : PLA
RTL
ItemSet_ZoraKing:
;JSL $1DE1AA ; Sprite_SpawnFlippersItem ; thing we wrote over
PHA : LDA !NPC_FLAGS : ORA.b #$02 : STA !NPC_FLAGS : PLA
RTL
ItemSet_SickKid:
JSL.l Link_ReceiveItem ; thing we wrote over
PHA : LDA !NPC_FLAGS : ORA.b #$04 : STA !NPC_FLAGS : PLA
RTL
ItemSet_TreeKid:
JSL.l Link_ReceiveItem ; thing we wrote over
PHA : LDA !NPC_FLAGS : ORA.b #$08 : STA !NPC_FLAGS : PLA
RTL
ItemSet_Sahasrala:
JSL.l Link_ReceiveItem ; thing we wrote over
PHA : LDA !NPC_FLAGS : ORA.b #$10 : STA !NPC_FLAGS : PLA
RTL
ItemSet_Catfish:
;JSL $00D52D ; GetAnimatedSpriteTile.variable ; thing we wrote over
;JSL.l LoadCatfishItemGFX
PHA : LDA !NPC_FLAGS : ORA.b #$20 : STA !NPC_FLAGS : PLA
RTL
ItemSet_Library:
JSL.l Link_ReceiveItem ; thing we wrote over
PHA : LDA !NPC_FLAGS : ORA.b #$80 : STA !NPC_FLAGS : PLA
RTL
ItemSet_Mushroom:
PHA
LDA !NPC_FLAGS_2 : ORA.b #$10 : STA !NPC_FLAGS_2
LDA.l MushroomItem : TAY
PLA
;LDY.b #$29
STZ $02E9 ; thing we wrote over - the mushroom is an npc for item purposes apparently
RTL
ItemSet_Powder:
PHA
LDA !NPC_FLAGS_2 : ORA.b #$20 : STA !NPC_FLAGS_2
LDA.l WitchItem : TAY
PLA
;LDY.b #$0D
STZ $02E9 ; thing we wrote over
RTL
;================================================================================

18
openmode.asm Normal file
View File

@@ -0,0 +1,18 @@
;================================================================================
; Open Mode Uncle Rain State Check
;================================================================================
SetUncleRainState:
LDA.l OpenMode : BEQ + : RTL : + ; we're done if open mode is on
LDA.b #$01 : STA $7EF3C5
RTL
;--------------------------------------------------------------------------------
InitOpenMode:
LDA.l OpenMode : BEQ + ; Skip if not open mode
LDA $7EF3C5 : CMP #$02 : !BGE + ; Skip if already past escape
LDA.b #02 : STA $7EF3C5 ; Go to post-escape phase (pre aga1)
LDA $7EF3C6 : ORA #$14 : STA $7EF3C6 ; remove uncle
LDA $7EF3C8 : CMP #$05 : BEQ ++ : LDA.b #$01 : ++ : STA $7EF3C8 ; set spawn points to house+sanc unless already house+sanc+mountain
LDA $7EF29B : ORA.b #$20 : STA $7EF29B ; open castle gate
+
RTL
;--------------------------------------------------------------------------------

3
output.txt Normal file
View File

@@ -0,0 +1,3 @@
llh@tinymagnet.com:~/DBMS/Run$ ./dbms -?
(Lena Hellstrom) bad option...should be "f" or "b" or "a"
llh@tinymagnet.com:~/DBMS/Run$

247
pendantcrystalhud.asm Normal file
View File

@@ -0,0 +1,247 @@
;================================================================================
; Pendant / Crystal HUD Fix
;--------------------------------------------------------------------------------
;CheckPendantHUD:
; LDA !HUD_FLAG : CMP.b #$40 ; check for hud flag instead
;RTL
;================================================================================
FlipLWDWFlag:
PHP
SEP #$20 ; set 8-bit accumulator
LDA $7EF3CA : EOR.b #$40 : STA $7EF3CA
BEQ +
LDA.b #07 : BRA ++ ; dark world - crystals
+
LDA.b #03 ; light world - pendants
++
STA $7EF3C7
PLP
RTL
;================================================================================
GetCrystalNumber:
PHX
TXA : ASL : TAX
LDA $7EF3CA : EOR.b #$40 : BNE +
INX
+
LDA.l CrystalNumberTable-16, X
PLX
RTL
;================================================================================
OverworldMap_CheckObject:
LDA $FFFFFF
PHX
LDA $7EF3C7 : CMP.b #$03 : BNE +
;LW Map
LDA.l .lw_offsets, X
BPL +++ : CLC : BRA .done : +++
TAX : BRA ++
+ : CMP.b #$07 : BNE .fail
;DW Map
LDA.l .dw_offsets, X : TAX
BRA ++
SEC
PLX
RTL
++
LDA.l CrystalPendantFlags_2, X
AND.b #$40 : BNE .checkCrystal
.checkPendant
LDA $7EF374 : AND.l CrystalPendantFlags, X : BNE .fail
CLC : BRA .done
.checkCrystal
LDA $7EF37A : AND.l CrystalPendantFlags, X : BNE .fail
CLC : BRA .done
.fail
SEC
.done
PLX
RTL
.lw_offsets
db $02, $0A, $03, $FF
.dw_offsets
db $06, $08, $0C, $0B, $07, $09, $05
;================================================================================
SetLWDWMap:
PHP
SEP #$20 ; set 8-bit accumulator
LDA $7EF3CA : EOR.b #$40
BNE +
LDA.b #07 : BRA ++ ; dark world - crystals
+
LDA.b #03 ; light world - pendants
++
STA $7EF3C7
PLP
RTL
;================================================================================
GetMapMode:
LDA $7EF3CA : AND.b #$40 : BEQ +
LDA.b #07 ; dark world - crystals
RTL
+
LDA.b #03 ; light world - pendants
RTL
;================================================================================
CheckHeraObject:
LDA CrystalPendantFlags_2_hera : BNE .crystal
.pendant
LDA $7EF374 : AND.l CrystalPendantFlags_hera
RTL
.crystal
LDA $7EF37A : AND.l CrystalPendantFlags_hera
RTL
;================================================================================
;GetPendantCrystalWorld:
; PHB : PHK : PLB
; PHX
; LDA $040C : LSR : TAX
; LDA .dungeon_worlds, X
; PLX : PLB
; CMP.b #$00
;RTL
;================================================================================
ShowDungeonItems:
LDA $040C : AND.w #$00FF : CMP.w #$00FF : BNE + : RTL : + ; return normal result if outdoors or in a cave
;LDA $F0 : AND.w #$0020 ; check for select
LDA !HUD_FLAG : AND.w #$0020 ; check hud flag
BEQ + : LDA.w #$0000 : RTL : + ; if set, send the zero onwards
LDA $040C : AND.w #$00FF : CMP.w #$00FF ; original logic
RTL
;================================================================================
DrawPendantCrystalDiagram:
PHP : PHB : PHK : PLB
REP #$30 ; Set 16-bit accumulator & index registers
LDX.w #$0000 ; Paint entire box black & draw empty pendants and crystals
-
LDA .row0, X : STA $12EA, X
LDA .row1, X : STA $132A, X
LDA .row2, X : STA $136A, X
LDA .row3, X : STA $13AA, X
LDA .row4, X : STA $13EA, X
LDA .row5, X : STA $142A, X
LDA .row6, X : STA $146A, X
LDA .row7, X : STA $14AA, X
LDA .row8, X : STA $14EA, X
INX #2 : CPX.w #$0014 : BCC -
;pendants
LDA $7EF374 : AND.w #$0004 : BEQ + ; pendant of courage (green)
LDA.w #$3D2B : STA $1332
LDA.w #$3D2C : STA $1334
LDA.w #$3D2D : STA $1372
LDA.w #$3D2E : STA $1374
+ LDA $7EF374 : AND.w #$0002 : BEQ + ; pendant of power (blue)
LDA.w #$2D2B : STA $13AE
LDA.w #$2D2C : STA $13B0
LDA.w #$2D2D : STA $13EE
LDA.w #$2D2E : STA $13F0
+ LDA $7EF374 : AND.w #$0001 : BEQ + ; pendant of wisdom (red)
LDA.w #$252B : STA $13B6
LDA.w #$252C : STA $13B8
LDA.w #$252D : STA $13F6
LDA.w #$252E : STA $13F8
+
;crystals
LDA $7EF37A : AND.w #$0002 : BEQ + ; crystal 1
LDA.w #$2D44 : STA $14AC
LDA.w #$2D45 : STA $14AE
+ LDA $7EF37A : AND.w #$0010 : BEQ + ; crystal 2
LDA.w #$2D44 : STA $146E
LDA.w #$2D45 : STA $1470
+ LDA $7EF37A : AND.w #$0040 : BEQ + ; crystal 3
LDA.w #$2D44 : STA $14B0
LDA.w #$2D45 : STA $14B2
+ LDA $7EF37A : AND.w #$0020 : BEQ + ; crystal 4
LDA.w #$2D44 : STA $1472
LDA.w #$2D45 : STA $1474
+ LDA $7EF37A : AND.w #$0004 : BEQ + ; crystal 5
LDA.w #$2D44 : STA $14B4
LDA.w #$2D45 : STA $14B6
+ LDA $7EF37A : AND.w #$0001 : BEQ + ; crystal 6
LDA.w #$2D44 : STA $1476
LDA.w #$2D45 : STA $1478
+ LDA $7EF37A : AND.w #$0008 : BEQ + ; crystal 7
LDA.w #$2D44 : STA $14B8
LDA.w #$2D45 : STA $14BA
+
PLB : PLP
RTL
;================================================================================
.row0 dw $28FB, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $68FB
.row1 dw $28FC, $24F5, $24F5, $24F5, $312B, $312C, $24F5, $24F5, $24F5, $68FC
.row2 dw $28FC, $24F5, $24F5, $24F5, $313D, $312E, $24F5, $24F5, $24F5, $68FC
.row3 dw $28FC, $24F5, $312B, $312C, $24F5, $24F5, $312B, $312C, $24F5, $68FC
.row4 dw $28FC, $24F5, $313D, $312E, $24F5, $24F5, $313D, $312E, $24F5, $68FC
.row5 dw $28FC, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $68FC
.row6 dw $28FC, $24F5, $3146, $3147, $3146, $3147, $3146, $3147, $24F5, $68FC
.row7 dw $28FC, $3146, $3147, $3146, $3147, $3146, $3147, $3146, $3147, $68FC
.row8 dw $A8FB, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $E8FB
;================================================================================
;Crystal 1: $02
;Crystal 2: $10
;Crystal 3: $40
;Crystal 4: $20
;Crystal 5: $04
;Crystal 6: $01
;Crystal 7: $08
;;blank pendant
;db $2B, $31, $2C, $31, $3D, $31, $2E, $31
;
;;red pendant
;db $2B, $25, $2C, $25, $2D, $25, $2E, $25
;
;;blue pendant
;db $2B, $2D, $2C, $2D, $2D, $2D, $2E, $2D
;
;;green pendant
;db $2B, $3D, $2C, $3D, $2D, $3D, $2E, $3D
;================================================================================
.pendants
dw $28FB, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $68FB
dw $28FC, $2521, $2522, $2523, $2524, $253F, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $24F5, $24F5, $213B, $213C, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $24F5, $24F5, $213D, $213E, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $213B, $213C, $24F5, $24F5, $213B, $213C, $24F5, $68FC
dw $28FC, $24F5, $213D, $213E, $24F5, $24F5, $213D, $213E, $24F5, $68FC
dw $A8FB, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $E8FB
.crystals
dw $28FB, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $28F9, $68FB
dw $28FC, $252F, $2534, $2535, $2536, $2537, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $24F5, $3146, $3147, $3146, $3147, $24F5, $24F5, $68FC
dw $28FC, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $3146, $3147, $3146, $3147, $3146, $3147, $24F5, $68FC
dw $28FC, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $24F5, $68FC
dw $28FC, $24F5, $24F5, $3146, $3147, $3146, $3147, $24F5, $24F5, $68FC
dw $A8FB, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $A8F9, $E8FB
;================================================================================
; DATA - Dungeon Worlds
;.dungeon_worlds
;db $00, $00, $00, $00, $00, $40, $40, $40
;db $40, $40, $00, $40, $40, $40, $FF, $FF
;================================================================================
;0x00 - Sewer Passage
;0x02 - Hyrule Castle
;0x04 - Eastern Palace
;0x06 - Desert Palace
;0x08 - Hyrule Castle 2
;0x0A - Swamp Palace
;0x0C - Palace of Darkness
;0x0E - Misery Mire
;0x10 - Skull Woods
;0x12 - Ice Palace
;0x14 - Tower of Hera
;0x16 - Thieves' Town
;0x18 - Turtle Rock
;0x1A - Ganon's Tower
;0x1C - ??? possibly unused. (Were they planning two extra dungeons perhaps?)
;0x1E - ??? possibly unused.
;================================================================================

77
potions.asm Normal file
View File

@@ -0,0 +1,77 @@
;--------------------------------------------------------------------------------
; $7F5092 - Potion Animation Busy Flags (Health)
; $7F5093 - Potion Animation Busy Flags (Magic)
;--------------------------------------------------------------------------------
!BUSY_HEALTH = $7F5092
RefillHealth:
;STA $FFFFFF
LDA.l PotionHealthRefill : CMP.b #$A0 : !BGE +
LDA !BUSY_HEALTH : BNE ++
LDA.l PotionHealthRefill ; load refill amount
!ADD $7EF36D ; add to current health
CMP $7EF36C : !BLT +++ : LDA $7EF36C : +++
STA !BUSY_HEALTH
++
LDA $7EF36D : CMP.l !BUSY_HEALTH : !BLT ++
LDA.b #$00 : STA $7EF372
LDA $020A : BNE .notDone
LDA.b #$00 : STA !BUSY_HEALTH
SEC
RTL
++
LDA.b #$08 : STA $7EF372 ; refill some health
.notDone
CLC
RTL
+
; Check goal health versus actual health.
; if(actual < goal) then branch.
LDA $7EF36D : CMP $7EF36C : BCC .refillAllHealth
LDA $7EF36C : STA $7EF36D
LDA.b #$00 : STA $7EF372
; ??? not sure what purpose this branch serves.
LDA $020A : BNE .beta
SEC
RTL
.refillAllHealth
; Fill up ze health.
LDA.b #$A0 : STA $7EF372
.beta
CLC
RTL
;--------------------------------------------------------------------------------
!BUSY_MAGIC = $7F5093
RefillMagic:
LDA.l PotionMagicRefill : CMP.b #$80 : !BGE +
LDA !BUSY_MAGIC : BNE ++
LDA.l PotionMagicRefill ; load refill amount
!ADD $7EF36E ; add to current magic
CMP.b #$80 : !BLT +++ : LDA.b #$80 : +++
STA !BUSY_MAGIC
++
LDA $7EF36E : CMP.l !BUSY_MAGIC : !BLT ++
LDA.b #$00 : STA !BUSY_MAGIC
SEC
RTL
++
LDA.b #$01 : STA $7EF373 ; refill some magic
CLC
RTL
+
SEP #$30
; Check if Link's magic meter is full
LDA $7EF36E : CMP.b #$80
BCS .itsFull
; Tell the magic meter to fill up until it's full.
LDA.b #$80 : STA $7EF373
SEP #$30
RTL
.itsFull
; Set the carry, signifying we're done filling it.
SEP #$31
RTL
;--------------------------------------------------------------------------------

60
previewdatacopy.asm Normal file
View File

@@ -0,0 +1,60 @@
;================================================================================
; RTPreview SRAM Hook
;--------------------------------------------------------------------------------
WriteStatusPreview:
PHA
LDA $4300 : PHA ; preserve DMA parameters
LDA $4301 : PHA ; preserve DMA parameters
LDA $4302 : PHA ; preserve DMA parameters
LDA $4303 : PHA ; preserve DMA parameters
LDA $4304 : PHA ; preserve DMA parameters
LDA $4305 : PHA ; preserve DMA parameters
LDA $4306 : PHA ; preserve DMA parameters
;--------------------------------------------------------------------------------
LDA #$80 : STA $4300 ; set DMA transfer direction B -> A, bus A auto increment, single-byte mode
STA $4301 ; set bus B source to WRAM register
LDA #$40 : STA $2181 ; set WRAM register source address
LDA #$F3 : STA $2182
LDA #$7E : STA $2183
STZ $4302 ; set bus A destination address to SRAM
LDA #$1E : STA $4303
LDA #$70 : STA $4304
LDA #$80 : STA $4305 ; set transfer size to 0x180
LDA #$01 : STA $4306 ; STZ $4306
LDA #$01 : STA $420B ; begin DMA transfer
;--------------------------------------------------------------------------------
PLA : STA $4306 ; restore DMA parameters
PLA : STA $4305 ; restore DMA parameters
PLA : STA $4304 ; restore DMA parameters
PLA : STA $4303 ; restore DMA parameters
PLA : STA $4302 ; restore DMA parameters
PLA : STA $4301 ; restore DMA parameters
PLA : STA $4300 ; restore DMA parameters
PLA
RTL
;--------------------------------------------------------------------------------
;WriteStatusPreview:
; PHA : PHX : PHP
;
; REP #$20 ; set 16-bit accumulator
; CLC
; LDX.b #$00
; -
; LDA $7EF340, X : STA $701E00, X
; LDA $7EF340+2, X : STA $701E00+2, X
; LDA $7EF340+4, X : STA $701E00+4, X
; TXA : ADC.b #$06 : TAX
; CPX #$24 : !BLT -
;
; SEP #$20 ; set 8-bit accumulator
; LDA $7EF374 : STA $701E24
; LDA $7EF37A : STA $701E25
;
; PLP : PLX : PLA
;RTL
;--------------------------------------------------------------------------------

37
rngfixes.asm Normal file
View File

@@ -0,0 +1,37 @@
;================================================================================
; RNG Fixes
;--------------------------------------------------------------------------------
RigDigRNG:
LDA $7FFE01 : CMP.l DiggingGameRNG : !BGE .forceHeart
.normalItem
JSL $0DBA71 ; GetRandomInt
RTL
.forceHeart
LDA $7FFE00 : BNE .normalItem
LDA #$04
RTL
;--------------------------------------------------------------------------------
RigChestRNG:
JSL.l DecrementChestCounter
LDA $04C4 : CMP.l ChestGameRNG : BEQ .forceHeart
.normalItem
JSL $0DBA71 ; GetRandomInt
AND.b #$07 ; restrict values to 0-7
CMP #$07 : BEQ .notHeart
JSL.l DecrementItemCounter
RTL
.forceHeart
LDA $0403 : AND.b #$40 : BNE .notHeart
LDA #$07 ; give prize item
RTL
.notHeart
JSL.l DecrementItemCounter
;LDA #$00 ; bullshit rupee farming in chest game
JSL $0DBA71 ; GetRandomInt ; spam RNG until we stop getting the prize item
AND.b #$07 ; restrict values to 0-7
CMP #$07 : BNE + ; player got prize item AGAIN
LDA.b #$00 ; give them money instead
+
RTL
;--------------------------------------------------------------------------------

40
rupeelimit.asm Normal file
View File

@@ -0,0 +1,40 @@
;================================================================================
; Four Digit Rupees
;--------------------------------------------------------------------------------
Draw4DigitRupees:
LDA $7EF362
JSL.l HexToDec
;REP #$30
LDA $7F5004 : AND.w #$00FF : ORA.w #$2400 : STA $7EC750
LDA $7F5005 : AND.w #$00FF : ORA.w #$2400 : STA $7EC752
LDA $7F5006 : AND.w #$00FF : ORA.w #$2400 : STA $7EC754
LDA $7F5007 : AND.w #$00FF : ORA.w #$2400 : STA $7EC756
;LDA.w #$247F ; clear other hud cells
;STA $7EC758
;STA $7EC75E
;STA $7EC764
;STA $7EC718 ; bombs
;STA $7EC71E ; arrows
;STA $7EC724 ; keys
;LDA.w #$2C88 : STA $7EC71A ; bomb icon
;LDA.w #$2C89 : STA $7EC71C
;LDA $7EF340 : AND.w #$00FF : CMP.w #$0003 : !BGE .silverArrows
;.woodArrows
;LDA.w #$20A7 : STA $7EC720 ; wood arrow icon
;LDA.w #$20A9 : STA $7EC722
;BRA +
;.silverArrows
;LDA.w #$2486 : STA $7EC720 ; silver arrow icon
;LDA.w #$2487 : STA $7EC722
;+
;LDA.w #$2871 : STA $7EC726 ; key icon
RTL
;================================================================================

70
sandbox.asm Normal file
View File

@@ -0,0 +1,70 @@
;org $06FA78 ; set all prize packs to bombs
;dd #$DDDDDDDD
;dd #$DDDDDDDD
;dd #$DDDDDDDD
;dd #$DDDDDDDD
;dd #$DDDDDDDD
;dd #$DDDDDDDD
;dd #$DDDDDDDD
;dd #$DDDDDDDD
;
;;Zarby
;org $09E329
;db #$6D
;org $01E306
;db #$00
;org $01E397
;db #$00
;org $09DDC1
;db #$07, #$17, #$26, #$0A, #$0A, #$26, #$07, #$18, #$26
;org $09E410
;db #$05, #$09, #$8B
;org $01E28A
;db #$00
;org $01E2E8
;db #$00
;org $1BBBCE
;db #$82, #$82
;
;;--
;
;;Skuj
;org $0A84B9 ; Ganon Basement Remodel
;db #$E1, #$04, #$93, #$13, #$C4, #$B8, #$38, #$C2, #$FC, #$A1, #$00, #$2B, #$22, #$61, #$FC, #$A9, #$04, #$FD, #$21, #$02, #$4B, #$23, #$62, #$FC, #$69, #$00, #$1A, #$A1, #$61, #$FC, #$6E, #$81, #$48, #$9A, #$62, #$FD, #$2A, #$86, #$58, #$AA, #$01, #$FD, #$AA, #$82, #$FE, #$2A, #$80, #$98, #$AA, #$01, #$FE, #$AA, #$84, #$A9, #$81, #$61, #$FE, #$A7, #$05, #$90, #$73, #$02, #$FE, #$07, #$01, #$83, #$10, #$61, #$FE, #$00, #$00, #$93, #$00, #$01, #$FF, #$C0, #$02, #$F3, #$10, #$62, #$FF, #$C7, #$03, #$D8, #$73, #$02, #$FF, #$27, #$07, #$CA, #$82, #$62, #$FF, #$2D, #$03, #$99, #$D2, #$02, #$FE, #$2D, #$01, #$D1, #$13, #$C4, #$90, #$51, #$C4, #$E0, #$51, #$C4, #$FE, #$92, #$48, #$B4, #$26, #$03, #$FF, #$32, #$4A, #$A4, #$36, #$63, #$FE, #$94, #$C9, #$B4, #$4E, #$04, #$FF, #$34, #$CB, #$CC, #$36, #$64, #$FE, #$C3, #$18, #$B8, #$31, #$07, #$FF, #$23, #$1A, #$B0, #$39, #$67, #$FE, #$C4, #$99, #$B8, #$49, #$08, #$FF, #$24, #$9B, #$C8, #$39, #$68, #$A3, #$20, #$22, #$A3, #$20, #$69, #$A3, #$5C, #$22, #$DF, #$20, #$69, #$B8, #$70, #$A4, #$08, #$00, #$60, #$10, #$00, #$60, #$18, #$13, #$C0, #$18, #$53, #$C0, #$59, #$13, #$C0, #$59, #$53, #$C0, #$59, #$89, #$C0, #$89, #$81, #$C0, #$89, #$A0, #$00, #$8B, #$E1, #$C0, #$CA, #$E1, #$C0, #$D9, #$83, #$C0, #$D9, #$C1, #$C0, #$FF, #$FF, #$2B, #$14, #$FF, #$FF, #$FF, #$F0, #$FF, #$61, #$0A, #$82, #$18
;
;org $04F4F3 ; Ganon Basement to Hera
;db #$07
;
;org $02D26A ; Pyramid Hole is Hera Entrance
;db #$14
;
;org $02E849 ; Fly 1 to Sanctuary
;db #$13, #$00, #$16, #$00, #$18, #$00, #$2C, #$00, #$2F, #$00, #$30, #$00, #$3B, #$00, #$3F, #$00, #$5B, #$00, #$35, #$00, #$0F, #$00, #$15, #$00, #$33, #$00, #$12, #$00, #$3F, #$00, #$55, #$00, #$7F, #$00, #$1A, #$00, #$88, #$08, #$30, #$0B, #$88, #$05, #$98, #$07, #$80, #$18, #$9E, #$06, #$10, #$08, #$2E, #$00, #$42, #$12, #$80, #$06, #$12, #$01, #$9E, #$05, #$8E, #$04, #$80, #$02, #$12, #$01, #$80, #$02, #$00, #$04, #$16, #$05, #$59, #$07, #$B9, #$0A, #$FA, #$0A, #$1E, #$0F, #$DF, #$0E, #$05, #$0F, #$00, #$06, #$46, #$0E, #$C6, #$02, #$2A, #$04, #$BA, #$0C, #$9A, #$04, #$56, #$0E, #$2A, #$04, #$56, #$0E, #$D6, #$06, #$4E, #$0C, #$7E, #$01, #$40, #$08, #$B2, #$0E, #$00, #$00, #$F2, #$06, #$75, #$0E, #$78, #$07, #$0A, #$0C, #$06, #$0E, #$8A, #$0A, #$EA, #$06, #$62, #$04, #$00, #$0E, #$8A, #$0A, #$00, #$0E, #$68, #$04, #$78, #$05, #$B7, #$07, #$17, #$0B, #$58, #$0B, #$A8, #$0F, #$3D, #$0F, #$67, #$0F, #$5C, #$06, #$A8, #$0E, #$28, #$03, #$88, #$04, #$18, #$0D, #$F8, #$04, #$B8, #$0E, #$88, #$04, #$B8, #$0E, #$56, #$07, #$C8, #$0C, #$00, #$02, #$B8, #$08, #$30, #$0F, #$78, #$00, #$78, #$07, #$F3, #$0E, #$F0, #$07, #$90, #$0C, #$80, #$0E, #$10, #$0B, #$70, #$07, #$E8, #$04, #$68, #$0E, #$10, #$0B, #$68, #$0E, #$70, #$04, #$83, #$05, #$C6, #$07, #$26, #$0B, #$67, #$0B, #$8D, #$0F, #$4C, #$0F, #$72, #$0F, #$6D, #$06, #$B3, #$0E, #$33, #$03, #$97, #$04, #$27, #$0D, #$07, #$05, #$C3, #$0E, #$97, #$04, #$C3, #$0E, #$56, #$07, #$D3, #$0C, #$0B, #$02, #$BF, #$08, #$37, #$0F, #$8D, #$00, #$7F, #$07, #$FA, #$0E, #$F7, #$07, #$97, #$0C, #$8B, #$0E, #$17, #$0B, #$77, #$07, #$EF, #$04, #$85, #$0E, #$17, #$0B, #$85, #$0E, #$F6, #$FF, #$FA, #$FF, #$07, #$00, #$F7, #$FF, #$F6, #$FF, #$00, #$00, #$F1, #$FF, #$FB, #$FF, #$00, #$00, #$FA, #$FF, #$0A, #$00, #$F6, #$FF, #$F6, #$FF, #$F6, #$FF, #$FA, #$FF, #$F6, #$FF, #$FA, #$FF, #$F2, #$FF, #$F2, #$FF, #$02, #$00, #$00, #$00, #$0E, #$00, #$00, #$00, #$FE, #$FF, #$0B, #$00, #$F8, #$FF, #$06, #$00, #$FA, #$FF, #$FA, #$FF, #$06, #$00, #$0E, #$00, #$00, #$00, #$FA, #$FF, #$00, #$00
;
;;---
;
;org $02A451 ; Disable OW Map
;LDA.b #$00
;
;org $0287FB ; Disable UW Map
;LDA.b #$00
;
;org $06C913 ; 34913 sprite_ponds.asm:933 (LDA.b #$3B : STA $0DC0, X ; silver arrows)
;LDA.b #$43
;
;org $1D9532 ; E9532
;JSL CanGanonTakeDamage : NOP
;
;org $2F8000
;CanGanonTakeDamage:
; LDA $7EF359 : CMP.b #$02 : BEQ .normal
; .invincible
; LDA.b #$01 : STA $0D80, X
; LDA.b #$80 : STA $0DF0, X
;RTL
; .normal
; LDA.b #$11 : STA $0D80, X
; LDA.b #$68 : STA $0DF0, X
;RTL
;
;

0
scratchpad.asm Normal file
View File

34
seedtag.asm Normal file
View File

@@ -0,0 +1,34 @@
;--------------------------------------------------------------------------------
; GenerateSeedTags
;--------------------------------------------------------------------------------
GenerateSeedTags:
PHA : PHX : PHY : PHP
REP #$20 ; set 16-bit accumulator
LDA $00 : PHA
LDA $02 : PHA
LDA $04 : PHA
LDA $06 : PHA
JSL.l NameHash ; get the titlecard hashes
LDA $00 : AND.w #$1F1F : STA $00 ; keep it under 0x20 or we'll run out of items
LDA $02 : AND.w #$1F1F : STA $02
LDA $04 : AND.w #$1F1F : STA $04
LDA $06 : AND.w #$1F1F : STA $06
REP #$30 ; set 8-bit accumulator & index registers
LDY #$08
-
DEY : BNE -
REP #20 ; set 16-bit accumulator
PLA : STA $06
PLA : STA $04
PLA : STA $02
PLA : STA $00
PLP : PLY : PLX : PLA
RTL
;--------------------------------------------------------------------------------

24
shopkeeper.asm Normal file
View File

@@ -0,0 +1,24 @@
;================================================================================
; Randomize 300 Rupee NPC
;--------------------------------------------------------------------------------
Set300RupeeNPCItem:
INC $0D80, X ; thing we wrote over
PHA : PHP
REP #$20 ; set 16-bit accumulator
LDA $A0 ; these are all decimal because i got them that way
CMP.w #291 : BNE +
LDA RupeeNPC_MoldormCave : TAY ; load moldorm cave value into Y
BRA .done
+ CMP.w #286 : BNE +
LDA RupeeNPC_NortheastDarkSwampCave : TAY ; load northeast dark swamp cave value into Y
BRA .done
+
LDY.b #$46 ; default to a normal 300 rupees
.done
PLP : PLA
RTL
;--------------------------------------------------------------------------------
; 291 - Moldorm Cave
; 286 - Northeast Dark Swamp Cave
;--------------------------------------------------------------------------------

380
stats.asm Normal file
View File

@@ -0,0 +1,380 @@
;================================================================================
; Stat Tracking
;================================================================================
; $7EF420 - $7EF441 - Stat Tracking
;--------------------------------------------------------------------------------
; $7EF420 - bonk counter
;--------------------------------------------------------------------------------
; $7EF421 yyyyyaaa
; y - y item counter
; a - a item counter
;--------------------------------------------------------------------------------
; $7EF422 ssshhccc
; s - sword counter
; h - shield counter
; c - crystal counter
;--------------------------------------------------------------------------------
; $7EF423 - item counter
;--------------------------------------------------------------------------------
; $7EF424 mmkkkkkk
; m - mail counter
; k - small keys
;--------------------------------------------------------------------------------
; $7EF425w[2] 1111 2222 3333 4444
; 1 - lvl 1 sword bosses
; 2 - lvl 2 sword bosses
; 3 - lvl 3 sword bosses
; 4 - lvl 4 sword bosses
;--------------------------------------------------------------------------------
; $7EF427 kkkkcccc
; k - big keys
; c - big chests
;--------------------------------------------------------------------------------
; $7EF428 mmmmcccc
; k - maps
; c - compases
;--------------------------------------------------------------------------------
; $7EF429 bbbb--pp
; b - heart containers
; p - pendant upgrades
;--------------------------------------------------------------------------------
; $7EF42A bfsccccc
; b - bomb acquired
; f - fairy sword acquired
; s - silver arrow bow acquired
; c - chests before gtower big key
;--------------------------------------------------------------------------------
; $7EF42Bw[2] - rupees spent
;--------------------------------------------------------------------------------
; $7EF42D - s&q counter
;--------------------------------------------------------------------------------
; $7EF42Ew[2] - loop frame counter (low)
;--------------------------------------------------------------------------------
; $7EF430w[2] - loop frame counter (high)
;--------------------------------------------------------------------------------
; $7EF432 - locations before boots
;--------------------------------------------------------------------------------
; $7EF433 - locations before mirror
;--------------------------------------------------------------------------------
; $7EF434 - hhhhdddd - item locations checked
; h - hyrule castle
; d - palace of darkness
;--------------------------------------------------------------------------------
; $7EF435 - dddhhhaa - item locations checked
; d - desert palace
; h - tower of hera
; a - agahnim's tower
;--------------------------------------------------------------------------------
; $7EF436 - gggggeee - item locations checked
; g - ganon's tower
; e - eastern palace
;--------------------------------------------------------------------------------
; $7EF437 - sssstttt - item locations checked
; s - skull woods
; t - thieves town
;--------------------------------------------------------------------------------
; $7EF438 - iiiimmmm - item locations checked
; i - ice palace
; m - misery mire
;--------------------------------------------------------------------------------
; $7EF439 - ttttssss - item locations checked
; t - turtle rock
; s - swamp palace
;--------------------------------------------------------------------------------
; $7EF43A - times mirrored outdoors
;--------------------------------------------------------------------------------
; $7EF43B - times mirrored in dungeons
;--------------------------------------------------------------------------------
; $7EF43Cw[2] - screen transition counter
;--------------------------------------------------------------------------------
; $7EF43Ew[2] - nmi frame counter (low)
;--------------------------------------------------------------------------------
; $7EF440w[2] - nmi frame counter (high)
;--------------------------------------------------------------------------------
; $7EF442 - chest counter
;--------------------------------------------------------------------------------
; $7EF443 - lock stats
;--------------------------------------------------------------------------------
; $7EF444w[2] - item menu frame counter (low)
;--------------------------------------------------------------------------------
; $7EF446w[2] - item menu frame counter (high)
;--------------------------------------------------------------------------------
; $7EF448 - ---hhhhh
; h - heart pieces
;--------------------------------------------------------------------------------
; $7EF449 - death counter
;--------------------------------------------------------------------------------
; $7EF44A - reserved
;--------------------------------------------------------------------------------
; $7EF44B - flute counter
;--------------------------------------------------------------------------------
; $7EF44Cl[3] - RTA-Timestamp (Start)
;--------------------------------------------------------------------------------
; $7EF44Fl[3] - RTA-Timestamp (End)
;--------------------------------------------------------------------------------
; $7EF452 - ----cccc
; c - capacity upgrades
;--------------------------------------------------------------------------------
; $7EF452 - unused
;--------------------------------------------------------------------------------
; $7EF454w[2] - challenge timer (low)
;--------------------------------------------------------------------------------
; $7EF456w[2] - challenge timer (high)
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
!LOCK_STATS = "$7EF443"
;--------------------------------------------------------------------------------
!BONK_COUNTER = "$7EF420"
!BONK_REPEAT = "$7F503F"
!LOOP_FRAMES_LOW = "$7EF42E"
StatBonkCounter:
PHA
LDA !LOCK_STATS : BNE +
LDA !LOOP_FRAMES_LOW : !SUB !BONK_REPEAT : CMP #30 : !BLT +
LDA !LOOP_FRAMES_LOW : STA !BONK_REPEAT
LDA !BONK_COUNTER : INC
CMP.b #100 : BEQ + ; decimal 100
STA !BONK_COUNTER
+
PLA
JSL.l AddDashTremor ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
!SAVE_COUNTER = "$7EF42D"
StatSaveCounter:
PHA
LDA !LOCK_STATS : BNE +
LDA $10 : CMP.b #$17 : BNE + ; not a proper s&q, link probably died
LDA !SAVE_COUNTER : INC
CMP.b #100 : BEQ + ; decimal 100
STA !SAVE_COUNTER
+
PLA
RTL
;--------------------------------------------------------------------------------
!SAVE_COUNTER = "$7EF42D"
DecrementSaveCounter:
PHA
LDA !LOCK_STATS : BNE +
LDA !SAVE_COUNTER : DEC : STA !SAVE_COUNTER
+
PLA
RTL
;--------------------------------------------------------------------------------
!TRANSITION_COUNTER = "$7EF43C"
DungeonHoleWarpTransition:
LDA $01C31F, X
BRA StatTransitionCounter
DungeonHoleEntranceTransition:
JSL EnableForceBlank
BRA StatTransitionCounter
DungeonStairsTransition:
JSL Dungeon_SaveRoomQuadrantData
BRA StatTransitionCounter
DungeonExitTransition:
LDA.b #$0F : STA $10
StatTransitionCounter:
PHA : PHP
LDA !LOCK_STATS : BNE +
REP #$20 ; set 16-bit accumulator
LDA !TRANSITION_COUNTER : INC
CMP.w #999 : BEQ + ; decimal 999
STA !TRANSITION_COUNTER
+
PLP : PLA
RTL
;--------------------------------------------------------------------------------
!FLUTE_COUNTER = "$7EF44B"
IncrementFlute:
LDA !LOCK_STATS : BNE +
LDA !FLUTE_COUNTER : INC : STA !FLUTE_COUNTER
+
JSL.l StatTransitionCounter ; also increment transition counter
RTL
;--------------------------------------------------------------------------------
IncrementSmallKeys:
LDA !LOCK_STATS : BNE +
JSL AddInventory_incrementKeyLong
+
LDA $7EF36F ; thing we wrote over, read small key count
RTL
;--------------------------------------------------------------------------------
IncrementAgahnim2Sword:
JSL.l Dungeon_SaveRoomData_justKeys ; thing we wrote over
PHA
LDA !LOCK_STATS : BNE +
JSL AddInventory_incrementBossSwordLong
+
PLA
RTL
;--------------------------------------------------------------------------------
!DEATH_COUNTER = "$7EF449"
IncrementDeathCounter:
PHA
LDA !LOCK_STATS : BNE +
LDA $7EF36D : BNE + ; link is still alive, skip
LDA !DEATH_COUNTER : INC : STA !DEATH_COUNTER
;JSL.l DecrementSaveCounter
+
PLA
RTL
;--------------------------------------------------------------------------------
!CHEST_COUNTER = "$7EF442"
IncrementChestCounter:
LDA.b #$01 : STA $02E9 ; thing we wrote over
PHA
LDA !LOCK_STATS : BNE +
LDA !CHEST_COUNTER : INC : STA !CHEST_COUNTER
+
PLA
RTL
;--------------------------------------------------------------------------------
!CHEST_COUNTER = "$7EF442"
DecrementChestCounter:
PHA
LDA !LOCK_STATS : BNE +
LDA !CHEST_COUNTER : DEC : STA !CHEST_COUNTER
+
PLA
RTL
;--------------------------------------------------------------------------------
!ITEM_TOTAL = "$7EF423"
DecrementItemCounter:
PHA
LDA !LOCK_STATS : BNE +
LDA !ITEM_TOTAL : DEC : STA !ITEM_TOTAL
+
PLA
RTL
;--------------------------------------------------------------------------------
IncrementBigChestCounter:
JSL.l Dungeon_SaveRoomQuadrantData ; thing we wrote over
PHA
LDA !LOCK_STATS : BNE +
%BottomHalf($7EF427)
+
PLA
RTL
;--------------------------------------------------------------------------------
!OW_MIRROR_COUNTER = "$7EF43A"
IncrementOWMirror:
PHA
LDA !LOCK_STATS : BNE +
LDA $7EF3CA : BEQ + ; only do this for DW->LW
LDA !OW_MIRROR_COUNTER : INC : STA !OW_MIRROR_COUNTER
+
PLA
JMP StatTransitionCounter
;--------------------------------------------------------------------------------
!UW_MIRROR_COUNTER = "$7EF43B"
IncrementUWMirror:
PHA
LDA !LOCK_STATS : BNE +
LDA $040C : CMP #$FF : BEQ + ; skip if we're in a cave or house
LDA !UW_MIRROR_COUNTER : INC : STA !UW_MIRROR_COUNTER
JSL.l StatTransitionCounter
+
PLA
JSL.l Dungeon_SaveRoomData ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
!SPENT_RUPEES = "$7EF42B"
IncrementSpentRupees:
DEC A : BPL .subtractRupees
LDA.w #$0000 : STA $7EF360
RTL
.subtractRupees
PHA : PHP
LDA !LOCK_STATS : AND.w #$00FF : BNE +
LDA !SPENT_RUPEES : INC
CMP.w #9999 : BEQ + ; decimal 9999
STA !SPENT_RUPEES
+
PLP : PLA
RTL
;--------------------------------------------------------------------------------
IndoorTileTransitionCounter:
JSL.l Dungeon_LoadRoom ; thing we wrote over
JMP StatTransitionCounter
;--------------------------------------------------------------------------------
!REDRAW = "$7F5000"
IndoorSubtileTransitionCounter:
LDA.b #$01 : STA !REDRAW ; set redraw flag for items
STZ $0646 ; stuff we wrote over
STZ $0642
JMP StatTransitionCounter
;--------------------------------------------------------------------------------
!CHEST_COUNTER = "$7EF442"
!MAIL_COUNTER = "$7EF424" ; mmkkkkkk
!BOSS_KILLS = "$7F5037"
!SWORD_KILLS_1 = "$7EF425"
!SWORD_KILLS_2 = "$7EF426"
!GTOWER_PRE_BIG_KEY = "$7EF42A" ; ---ccccc
!NONCHEST_COUNTER = "$7F503E"
!SAVE_COUNTER = "$7EF42D"
!TRANSITION_COUNTER = "$7EF43C"
!NMI_COUNTER = "$7EF43E"
!LOOP_COUNTER = "$7EF42E"
!LAG_TIME = "$7F5038"
!RUPEES_COLLECTED = "$7F503C"
!ITEM_TOTAL = "$7EF423"
!RTA_END = "$7EF44F"
StatsFinalPrep:
PHA : PHX : PHP
SEP #$30 ; set 8-bit accumulator and index registers
LDA !LOCK_STATS : BNE .ramPostOnly
INC : STA !LOCK_STATS
JSL.l AddInventory_incrementBossSwordLong
LDA !MAIL_COUNTER : !ADD #$40 : STA !MAIL_COUNTER ; add green mail to mail count
;LDA !GTOWER_PRE_BIG_KEY : DEC : AND #$1F : TAX
;LDA !GTOWER_PRE_BIG_KEY : AND #$E0 : STA !GTOWER_PRE_BIG_KEY
;TXA : ORA !GTOWER_PRE_BIG_KEY : STA !GTOWER_PRE_BIG_KEY
LDA !TRANSITION_COUNTER : DEC : STA !TRANSITION_COUNTER ; remove extra transition from exiting gtower via duck
.ramPostOnly
LDA !SWORD_KILLS_1 : LSR #4 : !ADD !SWORD_KILLS_1 : STA !BOSS_KILLS
LDA !SWORD_KILLS_2 : LSR #4 : !ADD !SWORD_KILLS_2 : !ADD !BOSS_KILLS : AND #$0F : STA !BOSS_KILLS
LDA !NMI_COUNTER : !SUB !LOOP_COUNTER : STA !LAG_TIME
LDA !NMI_COUNTER+1 : SBC !LOOP_COUNTER+1 : STA !LAG_TIME+1
LDA !NMI_COUNTER+2 : SBC !LOOP_COUNTER+2 : STA !LAG_TIME+2
LDA !NMI_COUNTER+3 : SBC !LOOP_COUNTER+3 : STA !LAG_TIME+3
LDA !SPENT_RUPEES : !ADD $7EF362 : STA !RUPEES_COLLECTED
LDA !SPENT_RUPEES+1 : ADC $7EF363 : STA !RUPEES_COLLECTED+1
LDA !ITEM_TOTAL : !SUB !CHEST_COUNTER : STA !NONCHEST_COUNTER
;LDA $FFFFFF
;JSL.l Clock_IsSupported
BRA +
REP #$20 ; set 16-bit accumulator
LDA $00 : PHA
LDA $02 : PHA
JSL.l Clock_QuickStamp
LDA $00 : STA !RTA_END
LDA $02 : STA !RTA_END+2
PLA : STA $02
PLA : STA $00
+
.done
PLP : PLX : PLA
LDA.b #$19 : STA $10 ; thing we wrote over, load triforce room
RTL
;--------------------------------------------------------------------------------
; Notes:
; s&q counter
;================================================================================

930
stats/credits.asm Executable file
View File

@@ -0,0 +1,930 @@
; SIZE: 5199
CreditsLine000:
;ORIGINAL ALTTP STAFF
db $06, $27, $28, $2B, $22, $20, $22, $27, $1A, $25, $9F, $1A, $25, $2D, $2D, $29, $9F, $2C, $2D, $1A, $1F, $1F
CreditsLine001:
;------------------------------
db $00, $01, $9F
CreditsLine002:
;EXECUTIVE PRODUCER
db $07, $23, $3C, $4F, $3C, $3A, $4C, $4B, $40, $4D, $3C, $9F, $47, $49, $46, $3B, $4C, $3A, $3C, $49
CreditsLine003:
;HIROSHI YAMAUCHI
db $08, $1F, $64, $65, $6E, $6B, $6F, $64, $65, $9F, $75, $5D, $69, $5D, $71, $5F, $64, $65
CreditsLine004:
;HIROSHI YAMAUCHI
db $08, $1F, $8A, $8B, $94, $91, $95, $8A, $8B, $9F, $9B, $83, $8F, $83, $97, $85, $8A, $8B
CreditsLine005:
;PRODUCER
db $0C, $0F, $29, $2B, $28, $1D, $2E, $1C, $1E, $2B
CreditsLine006:
;SHIGERU MIYAMOTO
db $08, $1F, $6F, $64, $65, $63, $61, $6E, $71, $9F, $69, $65, $75, $5D, $69, $6B, $70, $6B
CreditsLine007:
;SHIGERU MIYAMOTO
db $08, $1F, $95, $8A, $8B, $89, $87, $94, $97, $9F, $8F, $8B, $9B, $83, $8F, $91, $96, $91
CreditsLine008:
;DIRECTOR
db $0C, $0F, $03, $08, $11, $04, $02, $13, $0E, $11
CreditsLine009:
;TAKASHI TEZUKA
db $09, $1B, $70, $5D, $67, $5D, $6F, $64, $65, $9F, $70, $61, $76, $71, $67, $5D
CreditsLine010:
;TAKASHI TEZUKA
db $09, $1B, $96, $83, $8D, $83, $95, $8A, $8B, $9F, $96, $87, $9C, $97, $8D, $83
CreditsLine011:
;SCRIPT WRITER
db $09, $19, $4A, $3A, $49, $40, $47, $4B, $9F, $4E, $49, $40, $4B, $3C, $49
CreditsLine012:
;KENSUKE TANABE
db $09, $1B, $67, $61, $6A, $6F, $71, $67, $61, $9F, $70, $5D, $6A, $5D, $5E, $61
CreditsLine013:
;KENSUKE TANABE
db $09, $1B, $8D, $87, $90, $95, $97, $8D, $87, $9F, $96, $83, $90, $83, $84, $87
CreditsLine014:
;ASSISTANT DIRECTORS
db $06, $25, $1A, $2C, $2C, $22, $2C, $2D, $1A, $27, $2D, $9F, $1D, $22, $2B, $1E, $1C, $2D, $28, $2B, $2C
CreditsLine015:
;YASUHISA YAMAMURA
db $07, $21, $75, $5D, $6F, $71, $64, $65, $6F, $5D, $9F, $75, $5D, $69, $5D, $69, $71, $6E, $5D
CreditsLine016:
;YASUHISA YAMAMURA
db $07, $21, $9B, $83, $95, $97, $8A, $8B, $95, $83, $9F, $9B, $83, $8F, $83, $8F, $97, $94, $83
CreditsLine017:
;YOICHI YAMADA
db $09, $19, $75, $6B, $65, $5F, $64, $65, $9F, $75, $5D, $69, $5D, $60, $5D
CreditsLine018:
;YOICHI YAMADA
db $09, $19, $9B, $91, $8B, $85, $8A, $8B, $9F, $9B, $83, $8F, $83, $86, $83
CreditsLine019:
;SCREEN GRAPHICS DESIGNERS
db $03, $31, $4A, $3A, $49, $3C, $3C, $45, $9F, $3E, $49, $38, $47, $3F, $40, $3A, $4A, $9F, $3B, $3C, $4A, $40, $3E, $45, $3C, $49, $4A
CreditsLine020:
;OBJECT DESIGNERS
db $08, $1F, $28, $1B, $23, $1E, $1C, $2D, $9F, $1D, $1E, $2C, $22, $20, $27, $1E, $2B, $2C
CreditsLine021:
;SOICHIRO TOMITA
db $08, $1D, $6F, $6B, $65, $5F, $64, $65, $6E, $6B, $9F, $70, $6B, $69, $65, $70, $5D
CreditsLine022:
;SOICHIRO TOMITA
db $08, $1D, $95, $91, $8B, $85, $8A, $8B, $94, $91, $9F, $96, $91, $8F, $8B, $96, $83
CreditsLine023:
;TAKAYA IMAMURA
db $09, $1B, $70, $5D, $67, $5D, $75, $5D, $9F, $65, $69, $5D, $69, $71, $6E, $5D
CreditsLine024:
;TAKAYA IMAMURA
db $09, $1B, $96, $83, $8D, $83, $9B, $83, $9F, $8B, $8F, $83, $8F, $97, $94, $83
CreditsLine025:
;BACK GROUND DESIGNERS
db $05, $29, $1B, $1A, $1C, $24, $9F, $20, $2B, $28, $2E, $27, $1D, $9F, $1D, $1E, $2C, $22, $20, $27, $1E, $2B, $2C
CreditsLine026:
;MASANAO ARIMOTO
db $08, $1D, $69, $5D, $6F, $5D, $6A, $5D, $6B, $9F, $5D, $6E, $65, $69, $6B, $70, $6B
CreditsLine027:
;MASANAO ARIMOTO
db $08, $1D, $8F, $83, $95, $83, $90, $83, $91, $9F, $83, $94, $8B, $8F, $91, $96, $91
CreditsLine028:
;TSUYOSHI WATANABE
db $07, $21, $70, $6F, $71, $75, $6B, $6F, $64, $65, $9F, $73, $5D, $70, $5D, $6A, $5D, $5E, $61
CreditsLine029:
;TSUYOSHI WATANABE
db $07, $21, $96, $95, $97, $9B, $91, $95, $8A, $8B, $9F, $99, $83, $96, $83, $90, $83, $84, $87
CreditsLine030:
;PROGRAM DIRECTOR
db $08, $1F, $0F, $11, $0E, $06, $11, $00, $0C, $9F, $03, $08, $11, $04, $02, $13, $0E, $11
CreditsLine031:
;TOSHIHIKO NAKAGO
db $08, $1F, $70, $6B, $6F, $64, $65, $64, $65, $67, $6B, $9F, $6A, $5D, $67, $5D, $63, $6B
CreditsLine032:
;TOSHIHIKO NAKAGO
db $08, $1F, $96, $91, $95, $8A, $8B, $8A, $8B, $8D, $91, $9F, $90, $83, $8D, $83, $89, $91
CreditsLine033:
;MAIN PROGRAMMER
db $08, $1D, $44, $38, $40, $45, $9F, $47, $49, $46, $3E, $49, $38, $44, $44, $3C, $49
CreditsLine034:
;YASUNARI SOEJIMA
db $08, $1F, $75, $5D, $6F, $71, $6A, $5D, $6E, $65, $9F, $6F, $6B, $61, $66, $65, $69, $5D
CreditsLine035:
;YASUNARI SOEJIMA
db $08, $1F, $9B, $83, $95, $97, $90, $83, $94, $8B, $9F, $95, $91, $87, $8C, $8B, $8F, $83
CreditsLine036:
;OBJECT PROGRAMMER
db $07, $21, $46, $39, $41, $3C, $3A, $4B, $9F, $47, $49, $46, $3E, $49, $38, $44, $44, $3C, $49
CreditsLine037:
;KAZUAKI MORITA
db $09, $1B, $67, $5D, $76, $71, $5D, $67, $65, $9F, $69, $6B, $6E, $65, $70, $5D
CreditsLine038:
;KAZUAKI MORITA
db $09, $1B, $8D, $83, $9C, $97, $83, $8D, $8B, $9F, $8F, $91, $94, $8B, $96, $83
CreditsLine039:
;PROGRAMMERS
db $0A, $15, $29, $2B, $28, $20, $2B, $1A, $26, $26, $1E, $2B, $2C
CreditsLine040:
;TATSUO NISHIYAMA
db $08, $1F, $70, $5D, $70, $6F, $71, $6B, $9F, $6A, $65, $6F, $64, $65, $75, $5D, $69, $5D
CreditsLine041:
;TATSUO NISHIYAMA
db $08, $1F, $96, $83, $96, $95, $97, $91, $9F, $90, $8B, $95, $8A, $8B, $9B, $83, $8F, $83
CreditsLine042:
;YUICHI YAMAMOTO
db $08, $1D, $75, $71, $65, $5F, $64, $65, $9F, $75, $5D, $69, $5D, $69, $6B, $70, $6B
CreditsLine043:
;YUICHI YAMAMOTO
db $08, $1D, $9B, $97, $8B, $85, $8A, $8B, $9F, $9B, $83, $8F, $83, $8F, $91, $96, $91
CreditsLine044:
;YOSHIHIRO NOMOTO
db $08, $1F, $75, $6B, $6F, $64, $65, $64, $65, $6E, $6B, $9F, $6A, $6B, $69, $6B, $70, $6B
CreditsLine045:
;YOSHIHIRO NOMOTO
db $08, $1F, $9B, $91, $95, $8A, $8B, $8A, $8B, $94, $91, $9F, $90, $91, $8F, $91, $96, $91
CreditsLine046:
;EIJI NOTO
db $0B, $11, $61, $65, $66, $65, $9F, $6A, $6B, $70, $6B
CreditsLine047:
;EIJI NOTO
db $0B, $11, $87, $8B, $8C, $8B, $9F, $90, $91, $96, $91
CreditsLine048:
;SATORU TAKAHATA
db $08, $1D, $6F, $5D, $70, $6B, $6E, $71, $9F, $70, $5D, $67, $5D, $64, $5D, $70, $5D
CreditsLine049:
;SATORU TAKAHATA
db $08, $1D, $95, $83, $96, $91, $94, $97, $9F, $96, $83, $8D, $83, $8A, $83, $96, $83
CreditsLine050:
;TOSHIO IWAWAKI
db $09, $1B, $70, $6B, $6F, $64, $65, $6B, $9F, $65, $73, $5D, $73, $5D, $67, $65
CreditsLine051:
;TOSHIO IWAWAKI
db $09, $1B, $96, $91, $95, $8A, $8B, $91, $9F, $8B, $99, $83, $99, $83, $8D, $8B
CreditsLine052:
;SHIGEHIRO KASAMATSU
db $06, $25, $6F, $64, $65, $63, $61, $64, $65, $6E, $6B, $9F, $67, $5D, $6F, $5D, $69, $5D, $70, $6F, $71
CreditsLine053:
;SHIGEHIRO KASAMATSU
db $06, $25, $95, $8A, $8B, $89, $87, $8A, $8B, $94, $91, $9F, $8D, $83, $95, $83, $8F, $83, $96, $95, $97
CreditsLine054:
;YASUNARI NISHIDA
db $08, $1F, $75, $5D, $6F, $71, $6A, $5D, $6E, $65, $9F, $6A, $65, $6F, $64, $65, $60, $5D
CreditsLine055:
;YASUNARI NISHIDA
db $08, $1F, $9B, $83, $95, $97, $90, $83, $94, $8B, $9F, $90, $8B, $95, $8A, $8B, $86, $83
CreditsLine056:
;SOUND COMPOSER
db $09, $1B, $12, $0E, $14, $0D, $03, $9F, $02, $0E, $0C, $0F, $0E, $12, $04, $11
CreditsLine057:
;KOJI KONDO
db $0B, $13, $67, $6B, $66, $65, $9F, $67, $6B, $6A, $60, $6B
CreditsLine058:
;KOJI KONDO
db $0B, $13, $8D, $91, $8C, $8B, $9F, $8D, $91, $90, $86, $91
CreditsLine059:
;COORDINATORS
db $0A, $17, $3A, $46, $46, $49, $3B, $40, $45, $38, $4B, $46, $49, $4A
CreditsLine060:
;KEIZO KATO
db $0B, $13, $67, $61, $65, $76, $6B, $9F, $67, $5D, $70, $6B
CreditsLine061:
;KEIZO KATO
db $0B, $13, $8D, $87, $8B, $9C, $91, $9F, $8D, $83, $96, $91
CreditsLine062:
;TAKAO SHIMIZU
db $09, $19, $70, $5D, $67, $5D, $6B, $9F, $6F, $64, $65, $69, $65, $76, $71
CreditsLine063:
;TAKAO SHIMIZU
db $09, $19, $96, $83, $8D, $83, $91, $9F, $95, $8A, $8B, $8F, $8B, $9C, $97
CreditsLine064:
;PRINTED ART WORK
db $08, $1F, $29, $2B, $22, $27, $2D, $1E, $1D, $9F, $1A, $2B, $2D, $9F, $30, $28, $2B, $24
CreditsLine065:
;YOICHI KOTABE
db $09, $19, $75, $6B, $65, $5F, $64, $65, $9F, $67, $6B, $70, $5D, $5E, $61
CreditsLine066:
;YOICHI KOTABE
db $09, $19, $9B, $91, $8B, $85, $8A, $8B, $9F, $8D, $91, $96, $83, $84, $87
CreditsLine067:
;HIDEKI FUJII
db $0A, $17, $64, $65, $60, $61, $67, $65, $9F, $62, $71, $66, $65, $65
CreditsLine068:
;HIDEKI FUJII
db $0A, $17, $8A, $8B, $86, $87, $8D, $8B, $9F, $88, $97, $8C, $8B, $8B
CreditsLine069:
;YOSHIAKI KOIZUMI
db $08, $1F, $75, $6B, $6F, $64, $65, $5D, $67, $65, $9F, $67, $6B, $65, $76, $71, $69, $65
CreditsLine070:
;YOSHIAKI KOIZUMI
db $08, $1F, $9B, $91, $95, $8A, $8B, $83, $8D, $8B, $9F, $8D, $91, $8B, $9C, $97, $8F, $8B
CreditsLine071:
;YASUHIRO SAKAI
db $09, $1B, $75, $5D, $6F, $71, $64, $65, $6E, $6B, $9F, $6F, $5D, $67, $5D, $65
CreditsLine072:
;YASUHIRO SAKAI
db $09, $1B, $9B, $83, $95, $97, $8A, $8B, $94, $91, $9F, $95, $83, $8D, $83, $8B
CreditsLine073:
;TOMOAKI KUROUME
db $08, $1D, $70, $6B, $69, $6B, $5D, $67, $65, $9F, $67, $71, $6E, $6B, $71, $69, $61
CreditsLine074:
;TOMOAKI KUROUME
db $08, $1D, $96, $91, $8F, $91, $83, $8D, $8B, $9F, $8D, $97, $94, $91, $97, $8F, $87
CreditsLine075:
;SPECIAL THANKS TO
db $07, $21, $12, $0F, $04, $02, $08, $00, $0B, $9F, $13, $07, $00, $0D, $0A, $12, $9F, $13, $0E
CreditsLine076:
;NOBUO OKAJIMA
db $09, $19, $6A, $6B, $5E, $71, $6B, $9F, $6B, $67, $5D, $66, $65, $69, $5D
CreditsLine077:
;NOBUO OKAJIMA
db $09, $19, $90, $91, $84, $97, $91, $9F, $91, $8D, $83, $8C, $8B, $8F, $83
CreditsLine078:
;YASUNORI TAKETANI
db $07, $21, $75, $5D, $6F, $71, $6A, $6B, $6E, $65, $9F, $70, $5D, $67, $61, $70, $5D, $6A, $65
CreditsLine079:
;YASUNORI TAKETANI
db $07, $21, $9B, $83, $95, $97, $90, $91, $94, $8B, $9F, $96, $83, $8D, $87, $96, $83, $90, $8B
CreditsLine080:
;KIYOSHI KODA
db $0A, $17, $67, $65, $75, $6B, $6F, $64, $65, $9F, $67, $6B, $60, $5D
CreditsLine081:
;KIYOSHI KODA
db $0A, $17, $8D, $8B, $9B, $91, $95, $8A, $8B, $9F, $8D, $91, $86, $83
CreditsLine082:
;TAKAMITSU KUZUHARA
db $07, $23, $70, $5D, $67, $5D, $69, $65, $70, $6F, $71, $9F, $67, $71, $76, $71, $64, $5D, $6E, $5D
CreditsLine083:
;TAKAMITSU KUZUHARA
db $07, $23, $96, $83, $8D, $83, $8F, $8B, $96, $95, $97, $9F, $8D, $97, $9C, $97, $8A, $83, $94, $83
CreditsLine084:
;HIRONOBU KAKUI
db $09, $1B, $64, $65, $6E, $6B, $6A, $6B, $5E, $71, $9F, $67, $5D, $67, $71, $65
CreditsLine085:
;HIRONOBU KAKUI
db $09, $1B, $8A, $8B, $94, $91, $90, $91, $84, $97, $9F, $8D, $83, $8D, $97, $8B
CreditsLine086:
;SHIGEKI YAMASHIRO
db $07, $21, $6F, $64, $65, $63, $61, $67, $65, $9F, $75, $5D, $69, $5D, $6F, $64, $65, $6E, $6B
CreditsLine087:
;SHIGEKI YAMASHIRO
db $07, $21, $95, $8A, $8B, $89, $87, $8D, $8B, $9F, $9B, $83, $8F, $83, $95, $8A, $8B, $94, $91
CreditsLine088:
;ALTTP RANDOMIZER CONTRIBUTORS
db $01, $39, $38, $43, $4B, $4B, $47, $9F, $49, $38, $45, $3B, $46, $44, $40, $51, $3C, $49, $9F, $3A, $46, $45, $4B, $49, $40, $39, $4C, $4B, $46, $49, $4A
CreditsLine089:
;APPLICATION DEVELOPMENT
db $04, $2D, $1A, $29, $29, $25, $22, $1C, $1A, $2D, $22, $28, $27, $9F, $1D, $1E, $2F, $1E, $25, $28, $29, $26, $1E, $27, $2D
CreditsLine090:
;DESSYREQT
db $0B, $11, $60, $61, $6F, $6F, $75, $6E, $61, $6D, $70
CreditsLine091:
;DESSYREQT
db $0B, $11, $86, $87, $95, $95, $9B, $94, $87, $93, $96
CreditsLine092:
;SNES DEVELOPMENT
db $08, $1F, $12, $0D, $04, $12, $9F, $03, $04, $15, $04, $0B, $0E, $0F, $0C, $04, $0D, $13
CreditsLine093:
;KARKAT / MMXBASS
db $08, $1F, $67, $5D, $6E, $67, $5D, $70, $9F, $A2, $9F, $69, $69, $74, $5E, $5D, $6F, $6F
CreditsLine094:
;KARKAT / MMXBASS
db $08, $1F, $8D, $83, $94, $8D, $83, $96, $9F, $C2, $9F, $8F, $8F, $9A, $84, $83, $95, $95
CreditsLine095:
;SMALLHACKER
db $0A, $15, $6F, $69, $5D, $68, $68, $64, $5D, $5F, $67, $61, $6E
CreditsLine096:
;SMALLHACKER
db $0A, $15, $95, $8F, $83, $8E, $8E, $8A, $83, $85, $8D, $87, $94
CreditsLine097:
;LOGIC AND ROUTING
db $07, $21, $43, $46, $3E, $40, $3A, $9F, $38, $45, $3B, $9F, $49, $46, $4C, $4B, $40, $45, $3E
CreditsLine098:
;CHRISTOSOWEN
db $0A, $17, $5F, $64, $6E, $65, $6F, $70, $6B, $6F, $6B, $73, $61, $6A
CreditsLine099:
;CHRISTOSOWEN
db $0A, $17, $85, $8A, $94, $8B, $95, $96, $91, $95, $91, $99, $87, $90
CreditsLine100:
;VEETORP
db $0C, $0D, $72, $61, $61, $70, $6B, $6E, $6C
CreditsLine101:
;VEETORP
db $0C, $0D, $98, $87, $87, $96, $91, $94, $92
CreditsLine102:
;SPECIAL THANKS
db $09, $1B, $2C, $29, $1E, $1C, $22, $1A, $25, $9F, $2D, $21, $1A, $27, $24, $2C
CreditsLine103:
;SUPERSKUJ
db $0B, $11, $6F, $71, $6C, $61, $6E, $6F, $67, $71, $66
CreditsLine104:
;SUPERSKUJ
db $0B, $11, $95, $97, $92, $87, $94, $95, $8D, $97, $8C
CreditsLine105:
;BLUEVIPER85
db $0A, $15, $5E, $68, $71, $61, $72, $65, $6C, $61, $6E, $5B, $58
CreditsLine106:
;BLUEVIPER85
db $0A, $15, $84, $8E, $97, $87, $98, $8B, $92, $87, $94, $81, $7E
CreditsLine107:
;ZARBY89
db $0C, $0D, $76, $5D, $6E, $5E, $75, $5B, $5C
CreditsLine108:
;ZARBY89
db $0C, $0D, $9C, $83, $94, $84, $9B, $81, $82
CreditsLine109:
;MATHONNAPKINS
db $09, $19, $69, $5D, $70, $64, $6B, $6A, $6A, $5D, $6C, $67, $65, $6A, $6F
CreditsLine110:
;MATHONNAPKINS
db $09, $19, $8F, $83, $96, $8A, $91, $90, $90, $83, $92, $8D, $8B, $90, $95
CreditsLine111:
;ACMLM
db $0D, $09, $5D, $5F, $69, $68, $69
CreditsLine112:
;ACMLM
db $0D, $09, $83, $85, $8F, $8E, $8F
CreditsLine113:
;DARKMAGICIAN1184
db $08, $1F, $60, $5D, $6E, $67, $69, $5D, $63, $65, $5F, $65, $5D, $6A, $54, $54, $5B, $57
CreditsLine114:
;DARKMAGICIAN1184
db $08, $1F, $86, $83, $94, $8D, $8F, $83, $89, $8B, $85, $8B, $83, $90, $7A, $7A, $81, $7D
CreditsLine115:
;JOSH
db $0E, $07, $66, $6B, $6F, $64
CreditsLine116:
;JOSH
db $0E, $07, $8C, $91, $95, $8A
CreditsLine117:
;MISHRAK109
db $0B, $13, $69, $65, $6F, $64, $6E, $5D, $67, $54, $53, $5C
CreditsLine118:
;MISHRAK109
db $0B, $13, $8F, $8B, $95, $8A, $94, $83, $8D, $7A, $79, $82
CreditsLine119:
;SEANCASS
db $0C, $0F, $6F, $61, $5D, $6A, $5F, $5D, $6F, $6F
CreditsLine120:
;SEANCASS
db $0C, $0F, $95, $87, $83, $90, $85, $83, $95, $95
CreditsLine121:
;SCREEVO
db $0C, $0D, $6F, $5F, $6E, $61, $61, $72, $6B
CreditsLine122:
;SCREEVO
db $0C, $0D, $95, $85, $94, $87, $87, $98, $91
CreditsLine123:
;GREENHAM
db $0C, $0F, $63, $6E, $61, $61, $6A, $64, $5D, $69
CreditsLine124:
;GREENHAM
db $0C, $0F, $89, $94, $87, $87, $90, $8A, $83, $8F
CreditsLine125:
;GREENLINENSHIRT
db $08, $1D, $63, $6E, $61, $61, $6A, $68, $65, $6A, $61, $6A, $6F, $64, $65, $6E, $70
CreditsLine126:
;GREENLINENSHIRT
db $08, $1D, $89, $94, $87, $87, $90, $8E, $8B, $90, $87, $90, $95, $8A, $8B, $94, $96
CreditsLine127:
;WIZZROBEZC
db $0B, $13, $73, $65, $76, $76, $6E, $6B, $5E, $61, $76, $5F
CreditsLine128:
;WIZZROBEZC
db $0B, $13, $99, $8B, $9C, $9C, $94, $91, $84, $87, $9C, $85
CreditsLine129:
;MYRAMONG
db $0C, $0F, $69, $75, $6E, $5D, $69, $6B, $6A, $63
CreditsLine130:
;MYRAMONG
db $0C, $0F, $8F, $9B, $94, $83, $8F, $91, $90, $89
CreditsLine131:
;BARNOWL
db $0C, $0D, $5E, $5D, $6E, $6A, $6B, $73, $68
CreditsLine132:
;BARNOWL
db $0C, $0D, $84, $83, $94, $90, $91, $99, $8E
CreditsLine133:
;EVILASH25
db $0B, $11, $61, $72, $65, $68, $5D, $6F, $64, $55, $58
CreditsLine134:
;EVILASH25
db $0B, $11, $87, $98, $8B, $8E, $83, $95, $8A, $7B, $7E
CreditsLine135:
;KANZEON
db $0C, $0D, $67, $5D, $6A, $76, $61, $6B, $6A
CreditsLine136:
;KANZEON
db $0C, $0D, $8D, $83, $90, $9C, $87, $91, $90
CreditsLine137:
;RAMBLY
db $0D, $0B, $6E, $5D, $69, $5E, $68, $75
CreditsLine138:
;RAMBLY
db $0D, $0B, $94, $83, $8F, $84, $8E, $9B
CreditsLine139:
;FECHDOG
db $0C, $0D, $62, $61, $5F, $64, $60, $6B, $63
CreditsLine140:
;FECHDOG
db $0C, $0D, $88, $87, $85, $8A, $86, $91, $89
CreditsLine141:
;FLUFFGUCK
db $0B, $11, $62, $68, $71, $62, $62, $63, $71, $5F, $67
CreditsLine142:
;FLUFFGUCK
db $0B, $11, $88, $8E, $97, $88, $88, $89, $97, $85, $8D
CreditsLine143:
;MOPPLETON
db $0B, $11, $69, $6B, $6C, $6C, $68, $61, $70, $6B, $6A
CreditsLine144:
;MOPPLETON
db $0B, $11, $8F, $91, $92, $92, $8E, $87, $96, $91, $90
CreditsLine145:
;DUST N STUFF
db $0A, $17, $60, $71, $6F, $70, $9F, $6A, $9F, $6F, $70, $71, $62, $62
CreditsLine146:
;DUST N STUFF
db $0A, $17, $86, $97, $95, $96, $9F, $90, $9F, $95, $96, $97, $88, $88
CreditsLine147:
;MRJ
db $0E, $05, $69, $6E, $66
CreditsLine148:
;MRJ
db $0E, $05, $8F, $94, $8C
CreditsLine149:
;QUEST PERFORMANCE
db $07, $21, $2A, $2E, $1E, $2C, $2D, $9F, $29, $1E, $2B, $1F, $28, $2B, $26, $1A, $27, $1C, $1E
CreditsLine150:
;ITEM LOCATIONS CHECKED
db $05, $2B, $40, $4B, $3C, $44, $9F, $43, $46, $3A, $38, $4B, $40, $46, $45, $4A, $9F, $3A, $3F, $3C, $3A, $42, $3C, $3B
CreditsLine151:
;CHESTS $$$$/160
db $01, $3B, $5F, $64, $61, $6F, $70, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $54, $59, $53
CreditsLine152:
;CHESTS $$$$/160
db $01, $3B, $85, $8A, $87, $95, $96, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $7A, $7F, $79
CreditsLine153:
;OTHER $$$$/ 56
db $01, $3B, $6B, $70, $64, $61, $6E, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $58, $59
CreditsLine154:
;OTHER $$$$/ 56
db $01, $3B, $91, $96, $8A, $87, $94, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7E, $7F
CreditsLine155:
;TOTAL $$$$/216
db $01, $3B, $70, $6B, $70, $5D, $68, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $55, $54, $59
CreditsLine156:
;TOTAL $$$$/216
db $01, $3B, $96, $91, $96, $83, $8E, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $7B, $7A, $7F
CreditsLine157:
;ITEM COMPLETION
db $08, $1D, $08, $13, $04, $0C, $9F, $02, $0E, $0C, $0F, $0B, $04, $13, $08, $0E, $0D
CreditsLine158:
;Y ITEMS $$$$/ 26
db $01, $3B, $75, $9F, $65, $70, $61, $69, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $55, $59
CreditsLine159:
;Y ITEMS $$$$/ 26
db $01, $3B, $9B, $9F, $8B, $96, $87, $8F, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7B, $7F
CreditsLine160:
;A ITEMS $$$$/ 5
db $01, $3B, $5D, $9F, $65, $70, $61, $69, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $58
CreditsLine161:
;A ITEMS $$$$/ 5
db $01, $3B, $83, $9F, $8B, $96, $87, $8F, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $7E
CreditsLine162:
;SWORDS $$$$/ 4
db $01, $3B, $6F, $73, $6B, $6E, $60, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $57
CreditsLine163:
;SWORDS $$$$/ 4
db $01, $3B, $95, $99, $91, $94, $86, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $7D
CreditsLine164:
;SHIELDS $$$$/ 3
db $01, $3B, $6F, $64, $65, $61, $68, $60, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $56
CreditsLine165:
;SHIELDS $$$$/ 3
db $01, $3B, $95, $8A, $8B, $87, $8E, $86, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $7C
CreditsLine166:
;MAILS $$$$/ 3
db $01, $3B, $69, $5D, $65, $68, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $56
CreditsLine167:
;MAILS $$$$/ 3
db $01, $3B, $8F, $83, $8B, $8E, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $7C
CreditsLine168:
;CAPACITY UPGRADES $$$$/ 15
db $01, $3B, $5F, $5D, $6C, $5D, $5F, $65, $70, $75, $9F, $71, $6C, $63, $6E, $5D, $60, $61, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $58
CreditsLine169:
;CAPACITY UPGRADES $$$$/ 15
db $01, $3B, $85, $83, $92, $83, $85, $8B, $96, $9B, $9F, $97, $92, $89, $94, $83, $86, $87, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7E
CreditsLine170:
;HEART PIECES $$$$/ 24
db $01, $3B, $64, $61, $5D, $6E, $70, $9F, $6C, $65, $61, $5F, $61, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $55, $57
CreditsLine171:
;HEART PIECES $$$$/ 24
db $01, $3B, $8A, $87, $83, $94, $96, $9F, $92, $8B, $87, $85, $87, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7B, $7D
CreditsLine172:
;HEART CONTAINERS $$$$/ 11
db $01, $3B, $64, $61, $5D, $6E, $70, $9F, $5F, $6B, $6A, $70, $5D, $65, $6A, $61, $6E, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $54
CreditsLine173:
;HEART CONTAINERS $$$$/ 11
db $01, $3B, $8A, $87, $83, $94, $96, $9F, $85, $91, $90, $96, $83, $8B, $90, $87, $94, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7A
CreditsLine174:
;DUNGEON COMPLETION
db $07, $23, $3B, $4C, $45, $3E, $3C, $46, $45, $9F, $3A, $46, $44, $47, $43, $3C, $4B, $40, $46, $45
CreditsLine175:
;MAPS $$$$/ 12
db $01, $3B, $69, $5D, $6C, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $55
CreditsLine176:
;MAPS $$$$/ 12
db $01, $3B, $8F, $83, $92, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7B
CreditsLine177:
;COMPASSES $$$$/ 11
db $01, $3B, $5F, $6B, $69, $6C, $5D, $6F, $6F, $61, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $54
CreditsLine178:
;COMPASSES $$$$/ 11
db $01, $3B, $85, $91, $8F, $92, $83, $95, $95, $87, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7A
CreditsLine179:
;SMALL KEYS $$$$/ 61
db $01, $3B, $6F, $69, $5D, $68, $68, $9F, $67, $61, $75, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $59, $54
CreditsLine180:
;SMALL KEYS $$$$/ 61
db $01, $3B, $95, $8F, $83, $8E, $8E, $9F, $8D, $87, $9B, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7F, $7A
CreditsLine181:
;BIG KEYS $$$$/ 12
db $01, $3B, $5E, $65, $63, $9F, $67, $61, $75, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $55
CreditsLine182:
;BIG KEYS $$$$/ 12
db $01, $3B, $84, $8B, $89, $9F, $8D, $87, $9B, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7B
CreditsLine183:
;BIG CHESTS $$$$/ 11
db $01, $3B, $5E, $65, $63, $9F, $5F, $64, $61, $6F, $70, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $54
CreditsLine184:
;BIG CHESTS $$$$/ 11
db $01, $3B, $84, $8B, $89, $9F, $85, $8A, $87, $95, $96, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7A
CreditsLine185:
;PENDANTS $$$$/ 3
db $01, $3B, $6C, $61, $6A, $60, $5D, $6A, $70, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $56
CreditsLine186:
;PENDANTS $$$$/ 3
db $01, $3B, $92, $87, $90, $86, $83, $90, $96, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $7C
CreditsLine187:
;CRYSTALS $$$$/ 7
db $01, $3B, $5F, $6E, $75, $6F, $70, $5D, $68, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $5A
CreditsLine188:
;CRYSTALS $$$$/ 7
db $01, $3B, $85, $94, $9B, $95, $96, $83, $8E, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $80
CreditsLine189:
;BOSSES $$$$/ 13
db $01, $3B, $5E, $6B, $6F, $6F, $61, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $56
CreditsLine190:
;BOSSES $$$$/ 13
db $01, $3B, $84, $91, $95, $95, $87, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7C
CreditsLine191:
;DUNGEON PERFORMANCE
db $06, $25, $1D, $2E, $27, $20, $1E, $28, $27, $9F, $29, $1E, $2B, $1F, $28, $2B, $26, $1A, $27, $1C, $1E
CreditsLine192:
;HYRULE CASTLE $$$$/ 8
db $01, $3B, $64, $75, $6E, $71, $68, $61, $9F, $5F, $5D, $6F, $70, $68, $61, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $5B
CreditsLine193:
;HYRULE CASTLE $$$$/ 8
db $01, $3B, $8A, $9B, $94, $97, $8E, $87, $9F, $85, $83, $95, $96, $8E, $87, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $81
CreditsLine194:
;EASTERN PALACE $$$$/ 6
db $01, $3B, $61, $5D, $6F, $70, $61, $6E, $6A, $9F, $6C, $5D, $68, $5D, $5F, $61, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $59
CreditsLine195:
;EASTERN PALACE $$$$/ 6
db $01, $3B, $87, $83, $95, $96, $87, $94, $90, $9F, $92, $83, $8E, $83, $85, $87, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $7F
CreditsLine196:
;DESERT PALACE $$$$/ 6
db $01, $3B, $60, $61, $6F, $61, $6E, $70, $9F, $6C, $5D, $68, $5D, $5F, $61, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $59
CreditsLine197:
;DESERT PALACE $$$$/ 6
db $01, $3B, $86, $87, $95, $87, $94, $96, $9F, $92, $83, $8E, $83, $85, $87, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $7F
CreditsLine198:
;TOWER OF HERA $$$$/ 5
db $01, $3B, $70, $6B, $73, $61, $6E, $9F, $6B, $62, $9F, $64, $61, $6E, $5D, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $58
CreditsLine199:
;TOWER OF HERA $$$$/ 5
db $01, $3B, $96, $91, $99, $87, $94, $9F, $91, $88, $9F, $8A, $87, $94, $83, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $7E
CreditsLine200:
;AGAHNIM'S TOWER $$$$/ 2
db $01, $3B, $5D, $63, $5D, $64, $6A, $65, $69, $77, $6F, $9F, $70, $6B, $73, $61, $6E, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $55
CreditsLine201:
;AGAHNIM'S TOWER $$$$/ 2
db $01, $3B, $83, $89, $83, $8A, $90, $8B, $8F, $9D, $95, $9F, $96, $91, $99, $87, $94, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $7B
CreditsLine202:
;PALACE OF DARKNESS $$$$/ 14
db $01, $3B, $6C, $5D, $68, $5D, $5F, $61, $9F, $6B, $62, $9F, $60, $5D, $6E, $67, $6A, $61, $6F, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $57
CreditsLine203:
;PALACE OF DARKNESS $$$$/ 14
db $01, $3B, $92, $83, $8E, $83, $85, $87, $9F, $91, $88, $9F, $86, $83, $94, $8D, $90, $87, $95, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7D
CreditsLine204:
;SWAMP PALACE $$$$/ 10
db $01, $3B, $6F, $73, $5D, $69, $6C, $9F, $6C, $5D, $68, $5D, $5F, $61, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $53
CreditsLine205:
;SWAMP PALACE $$$$/ 10
db $01, $3B, $95, $99, $83, $8F, $92, $9F, $92, $83, $8E, $83, $85, $87, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $79
CreditsLine206:
;SKULL WOODS $$$$/ 8
db $01, $3B, $6F, $67, $71, $68, $68, $9F, $73, $6B, $6B, $60, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $5B
CreditsLine207:
;SKULL WOODS $$$$/ 8
db $01, $3B, $95, $8D, $97, $8E, $8E, $9F, $99, $91, $91, $86, $95, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $81
CreditsLine208:
;THIEVES' TOWN $$$$/ 8
db $01, $3B, $70, $64, $65, $61, $72, $61, $6F, $77, $9F, $70, $6B, $73, $6A, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $5B
CreditsLine209:
;THIEVES' TOWN $$$$/ 8
db $01, $3B, $96, $8A, $8B, $87, $98, $87, $95, $9D, $9F, $96, $91, $99, $90, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $81
CreditsLine210:
;ICE PALACE $$$$/ 8
db $01, $3B, $65, $5F, $61, $9F, $6C, $5D, $68, $5D, $5F, $61, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $5B
CreditsLine211:
;ICE PALACE $$$$/ 8
db $01, $3B, $8B, $85, $87, $9F, $92, $83, $8E, $83, $85, $87, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $81
CreditsLine212:
;MISERY MIRE $$$$/ 8
db $01, $3B, $69, $65, $6F, $61, $6E, $75, $9F, $69, $65, $6E, $61, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $9F, $5B
CreditsLine213:
;MISERY MIRE $$$$/ 8
db $01, $3B, $8F, $8B, $95, $87, $94, $9B, $9F, $8F, $8B, $94, $87, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $9F, $81
CreditsLine214:
;TURTLE ROCK $$$$/ 12
db $01, $3B, $70, $71, $6E, $70, $68, $61, $9F, $6E, $6B, $5F, $67, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $55
CreditsLine215:
;TURTLE ROCK $$$$/ 12
db $01, $3B, $96, $97, $94, $96, $8E, $87, $9F, $94, $91, $85, $8D, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7B
CreditsLine216:
;GANON'S TOWER $$$$/ 27
db $01, $3B, $63, $5D, $6A, $6B, $6A, $77, $6F, $9F, $70, $6B, $73, $61, $6E, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $55, $5A
CreditsLine217:
;GANON'S TOWER $$$$/ 27
db $01, $3B, $89, $83, $90, $91, $90, $9D, $95, $9F, $96, $91, $99, $87, $94, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7B, $80
CreditsLine218:
;THE IMPORTANT STUFF
db $06, $25, $2D, $21, $1E, $9F, $22, $26, $29, $28, $2B, $2D, $1A, $27, $2D, $9F, $2C, $2D, $2E, $1F, $1F
CreditsLine219:
;ITEMS PRE GANON KEY $$$$/ 22
db $01, $3B, $65, $70, $61, $69, $6F, $9F, $6C, $6E, $61, $9F, $63, $5D, $6A, $6B, $6A, $9F, $67, $61, $75, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $55, $55
CreditsLine220:
;ITEMS PRE GANON KEY $$$$/ 22
db $01, $3B, $8B, $96, $87, $8F, $95, $9F, $92, $94, $87, $9F, $89, $83, $90, $91, $90, $9F, $8D, $87, $9B, $9F, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7B, $7B
CreditsLine221:
;LEVEL 1 SWORD BOSSES $$$$/ 13
db $01, $3B, $68, $61, $72, $61, $68, $9F, $54, $9F, $6F, $73, $6B, $6E, $60, $9F, $5E, $6B, $6F, $6F, $61, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $56
CreditsLine222:
;LEVEL 1 SWORD BOSSES $$$$/ 13
db $01, $3B, $8E, $87, $98, $87, $8E, $9F, $7A, $9F, $95, $99, $91, $94, $86, $9F, $84, $91, $95, $95, $87, $95, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7C
CreditsLine223:
;LEVEL 2 SWORD BOSSES $$$$/ 13
db $01, $3B, $68, $61, $72, $61, $68, $9F, $55, $9F, $6F, $73, $6B, $6E, $60, $9F, $5E, $6B, $6F, $6F, $61, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $56
CreditsLine224:
;LEVEL 2 SWORD BOSSES $$$$/ 13
db $01, $3B, $8E, $87, $98, $87, $8E, $9F, $7B, $9F, $95, $99, $91, $94, $86, $9F, $84, $91, $95, $95, $87, $95, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7C
CreditsLine225:
;LEVEL 3 SWORD BOSSES $$$$/ 13
db $01, $3B, $68, $61, $72, $61, $68, $9F, $56, $9F, $6F, $73, $6B, $6E, $60, $9F, $5E, $6B, $6F, $6F, $61, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $56
CreditsLine226:
;LEVEL 3 SWORD BOSSES $$$$/ 13
db $01, $3B, $8E, $87, $98, $87, $8E, $9F, $7C, $9F, $95, $99, $91, $94, $86, $9F, $84, $91, $95, $95, $87, $95, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7C
CreditsLine227:
;LEVEL 4 SWORD BOSSES $$$$/ 13
db $01, $3B, $68, $61, $72, $61, $68, $9F, $57, $9F, $6F, $73, $6B, $6E, $60, $9F, $5E, $6B, $6F, $6F, $61, $6F, $9F, $9F, $9F, $9F, $9F, $9F, $A2, $9F, $54, $56
CreditsLine228:
;LEVEL 4 SWORD BOSSES $$$$/ 13
db $01, $3B, $8E, $87, $98, $87, $8E, $9F, $7D, $9F, $95, $99, $91, $94, $86, $9F, $84, $91, $95, $95, $87, $95, $9F, $9F, $9F, $9F, $9F, $9F, $C2, $9F, $7A, $7C
CreditsLine229:
;LOCATIONS PRE BOOTS $$$$
db $01, $25, $68, $6B, $5F, $5D, $70, $65, $6B, $6A, $6F, $9F, $6C, $6E, $61, $9F, $5E, $6B, $6B, $70, $6F
CreditsLine230:
;LOCATIONS PRE BOOTS $$$$
db $01, $25, $8E, $91, $85, $83, $96, $8B, $91, $90, $95, $9F, $92, $94, $87, $9F, $84, $91, $91, $96, $95
CreditsLine231:
;LOCATIONS PRE MIRROR $$$$
db $01, $27, $68, $6B, $5F, $5D, $70, $65, $6B, $6A, $6F, $9F, $6C, $6E, $61, $9F, $69, $65, $6E, $6E, $6B, $6E
CreditsLine232:
;LOCATIONS PRE MIRROR $$$$
db $01, $27, $8E, $91, $85, $83, $96, $8B, $91, $90, $95, $9F, $92, $94, $87, $9F, $8F, $8B, $94, $94, $91, $94
CreditsLine233:
;NUMBER OF BONKS $$$$
db $01, $1D, $6A, $71, $69, $5E, $61, $6E, $9F, $6B, $62, $9F, $5E, $6B, $6A, $67, $6F
CreditsLine234:
;NUMBER OF BONKS $$$$
db $01, $1D, $90, $97, $8F, $84, $87, $94, $9F, $91, $88, $9F, $84, $91, $90, $8D, $95
CreditsLine235:
;MIRROR USES OUTDOORS $$$$
db $01, $27, $69, $65, $6E, $6E, $6B, $6E, $9F, $71, $6F, $61, $6F, $9F, $6B, $71, $70, $60, $6B, $6B, $6E, $6F
CreditsLine236:
;MIRROR USES OUTDOORS $$$$
db $01, $27, $8F, $8B, $94, $94, $91, $94, $9F, $97, $95, $87, $95, $9F, $91, $97, $96, $86, $91, $91, $94, $95
CreditsLine237:
;MIRROR USES IN DUNGEONS $$$$
db $01, $2D, $69, $65, $6E, $6E, $6B, $6E, $9F, $71, $6F, $61, $6F, $9F, $65, $6A, $9F, $60, $71, $6A, $63, $61, $6B, $6A, $6F
CreditsLine238:
;MIRROR USES IN DUNGEONS $$$$
db $01, $2D, $8F, $8B, $94, $94, $91, $94, $9F, $97, $95, $87, $95, $9F, $8B, $90, $9F, $86, $97, $90, $89, $87, $91, $90, $95
CreditsLine239:
;TIMES FLUTED $$$$
db $01, $17, $70, $65, $69, $61, $6F, $9F, $62, $68, $71, $70, $61, $60
CreditsLine240:
;TIMES FLUTED $$$$
db $01, $17, $96, $8B, $8F, $87, $95, $9F, $88, $8E, $97, $96, $87, $86
CreditsLine241:
;SCREEN TRANSITIONS $$$$
db $01, $23, $6F, $5F, $6E, $61, $61, $6A, $9F, $70, $6E, $5D, $6A, $6F, $65, $70, $65, $6B, $6A, $6F
CreditsLine242:
;SCREEN TRANSITIONS $$$$
db $01, $23, $95, $85, $94, $87, $87, $90, $9F, $96, $94, $83, $90, $95, $8B, $96, $8B, $91, $90, $95
CreditsLine243:
;TOTAL RUPEES COLLECTED $$$$
db $01, $2B, $70, $6B, $70, $5D, $68, $9F, $6E, $71, $6C, $61, $61, $6F, $9F, $5F, $6B, $68, $68, $61, $5F, $70, $61, $60
CreditsLine244:
;TOTAL RUPEES COLLECTED $$$$
db $01, $2B, $96, $91, $96, $83, $8E, $9F, $94, $97, $92, $87, $87, $95, $9F, $85, $91, $8E, $8E, $87, $85, $96, $87, $86
CreditsLine245:
;TOTAL RUPEES SPENT $$$$
db $01, $23, $70, $6B, $70, $5D, $68, $9F, $6E, $71, $6C, $61, $61, $6F, $9F, $6F, $6C, $61, $6A, $70
CreditsLine246:
;TOTAL RUPEES SPENT $$$$
db $01, $23, $96, $91, $96, $83, $8E, $9F, $94, $97, $92, $87, $87, $95, $9F, $95, $92, $87, $90, $96
CreditsLine247:
;SAVE AND QUITS $$$$
db $01, $1B, $6F, $5D, $72, $61, $9F, $5D, $6A, $60, $9F, $6D, $71, $65, $70, $6F
CreditsLine248:
;SAVE AND QUITS $$$$
db $01, $1B, $95, $83, $98, $87, $9F, $83, $90, $86, $9F, $93, $97, $8B, $96, $95
CreditsLine249:
;DEATHS $$$$
db $01, $0B, $60, $61, $5D, $70, $64, $6F
CreditsLine250:
;DEATHS $$$$
db $01, $0B, $86, $87, $83, $96, $8A, $95
CreditsLine251:
;TIME IN ITEM MENU $$$$$$$$$$$
db $01, $21, $70, $65, $69, $61, $9F, $65, $6A, $9F, $65, $70, $61, $69, $9F, $69, $61, $6A, $71
CreditsLine252:
;TIME IN ITEM MENU $$$$$$$$$$$
db $01, $21, $96, $8B, $8F, $87, $9F, $8B, $90, $9F, $8B, $96, $87, $8F, $9F, $8F, $87, $90, $97
CreditsLine253:
;TOTAL LAG TIME $$$$$$$$$$$
db $01, $1B, $70, $6B, $70, $5D, $68, $9F, $68, $5D, $63, $9F, $70, $65, $69, $61
CreditsLine254:
;TOTAL LAG TIME $$$$$$$$$$$
db $01, $1B, $96, $91, $96, $83, $8E, $9F, $8E, $83, $89, $9F, $96, $8B, $8F, $87
CreditsLine255:
;TOTAL TIME $$$$$$$$$$$
db $04, $13, $70, $6B, $70, $5D, $68, $9F, $70, $65, $69, $61
CreditsLine256:
;TOTAL TIME $$$$$$$$$$$
db $04, $13, $96, $91, $96, $83, $8E, $9F, $96, $8B, $8F, $87
CreditsLine257:
;(Blank line)
db $FF
CreditsLineTable:
dw CreditsLine000, CreditsLine001, CreditsLine002, CreditsLine003, CreditsLine004, CreditsLine257, CreditsLine005, CreditsLine006
dw CreditsLine007, CreditsLine257, CreditsLine008, CreditsLine009, CreditsLine010, CreditsLine257, CreditsLine011, CreditsLine012
dw CreditsLine013, CreditsLine257, CreditsLine014, CreditsLine015, CreditsLine016, CreditsLine257, CreditsLine017, CreditsLine018
dw CreditsLine257, CreditsLine019, CreditsLine001, CreditsLine020, CreditsLine021, CreditsLine022, CreditsLine257, CreditsLine023
dw CreditsLine024, CreditsLine257, CreditsLine025, CreditsLine026, CreditsLine027, CreditsLine257, CreditsLine028, CreditsLine029
dw CreditsLine257, CreditsLine030, CreditsLine031, CreditsLine032, CreditsLine257, CreditsLine033, CreditsLine034, CreditsLine035
dw CreditsLine257, CreditsLine036, CreditsLine037, CreditsLine038, CreditsLine257, CreditsLine039, CreditsLine040, CreditsLine041
dw CreditsLine257, CreditsLine042, CreditsLine043, CreditsLine257, CreditsLine044, CreditsLine045, CreditsLine257, CreditsLine046
dw CreditsLine047, CreditsLine257, CreditsLine048, CreditsLine049, CreditsLine257, CreditsLine050, CreditsLine051, CreditsLine257
dw CreditsLine052, CreditsLine053, CreditsLine257, CreditsLine054, CreditsLine055, CreditsLine257, CreditsLine056, CreditsLine057
dw CreditsLine058, CreditsLine257, CreditsLine059, CreditsLine060, CreditsLine061, CreditsLine257, CreditsLine062, CreditsLine063
dw CreditsLine257, CreditsLine064, CreditsLine065, CreditsLine066, CreditsLine257, CreditsLine067, CreditsLine068, CreditsLine257
dw CreditsLine069, CreditsLine070, CreditsLine257, CreditsLine071, CreditsLine072, CreditsLine257, CreditsLine073, CreditsLine074
dw CreditsLine257, CreditsLine075, CreditsLine076, CreditsLine077, CreditsLine257, CreditsLine078, CreditsLine079, CreditsLine257
dw CreditsLine080, CreditsLine081, CreditsLine257, CreditsLine082, CreditsLine083, CreditsLine257, CreditsLine084, CreditsLine085
dw CreditsLine257, CreditsLine086, CreditsLine087, CreditsLine257, CreditsLine088, CreditsLine001, CreditsLine089, CreditsLine090
dw CreditsLine091, CreditsLine257, CreditsLine092, CreditsLine093, CreditsLine094, CreditsLine257, CreditsLine095, CreditsLine096
dw CreditsLine257, CreditsLine097, CreditsLine098, CreditsLine099, CreditsLine257, CreditsLine100, CreditsLine101, CreditsLine257
dw CreditsLine102, CreditsLine103, CreditsLine104, CreditsLine257, CreditsLine105, CreditsLine106, CreditsLine257, CreditsLine107
dw CreditsLine108, CreditsLine257, CreditsLine109, CreditsLine110, CreditsLine257, CreditsLine111, CreditsLine112, CreditsLine257
dw CreditsLine113, CreditsLine114, CreditsLine257, CreditsLine115, CreditsLine116, CreditsLine257, CreditsLine117, CreditsLine118
dw CreditsLine257, CreditsLine119, CreditsLine120, CreditsLine257, CreditsLine121, CreditsLine122, CreditsLine257, CreditsLine123
dw CreditsLine124, CreditsLine257, CreditsLine125, CreditsLine126, CreditsLine257, CreditsLine127, CreditsLine128, CreditsLine257
dw CreditsLine129, CreditsLine130, CreditsLine257, CreditsLine131, CreditsLine132, CreditsLine257, CreditsLine133, CreditsLine134
dw CreditsLine257, CreditsLine135, CreditsLine136, CreditsLine257, CreditsLine137, CreditsLine138, CreditsLine257, CreditsLine139
dw CreditsLine140, CreditsLine257, CreditsLine141, CreditsLine142, CreditsLine257, CreditsLine143, CreditsLine144, CreditsLine257
dw CreditsLine145, CreditsLine146, CreditsLine257, CreditsLine147, CreditsLine148, CreditsLine257, CreditsLine149, CreditsLine001
dw CreditsLine150, CreditsLine151, CreditsLine152, CreditsLine257, CreditsLine153, CreditsLine154, CreditsLine257, CreditsLine155
dw CreditsLine156, CreditsLine257, CreditsLine157, CreditsLine158, CreditsLine159, CreditsLine257, CreditsLine160, CreditsLine161
dw CreditsLine257, CreditsLine162, CreditsLine163, CreditsLine257, CreditsLine164, CreditsLine165, CreditsLine257, CreditsLine166
dw CreditsLine167, CreditsLine257, CreditsLine168, CreditsLine169, CreditsLine257, CreditsLine170, CreditsLine171, CreditsLine257
dw CreditsLine172, CreditsLine173, CreditsLine257, CreditsLine174, CreditsLine175, CreditsLine176, CreditsLine257, CreditsLine177
dw CreditsLine178, CreditsLine257, CreditsLine179, CreditsLine180, CreditsLine257, CreditsLine181, CreditsLine182, CreditsLine257
dw CreditsLine183, CreditsLine184, CreditsLine257, CreditsLine185, CreditsLine186, CreditsLine257, CreditsLine187, CreditsLine188
dw CreditsLine257, CreditsLine189, CreditsLine190, CreditsLine257, CreditsLine191, CreditsLine001, CreditsLine150, CreditsLine192
dw CreditsLine193, CreditsLine257, CreditsLine194, CreditsLine195, CreditsLine257, CreditsLine196, CreditsLine197, CreditsLine257
dw CreditsLine198, CreditsLine199, CreditsLine257, CreditsLine200, CreditsLine201, CreditsLine257, CreditsLine202, CreditsLine203
dw CreditsLine257, CreditsLine204, CreditsLine205, CreditsLine257, CreditsLine206, CreditsLine207, CreditsLine257, CreditsLine208
dw CreditsLine209, CreditsLine257, CreditsLine210, CreditsLine211, CreditsLine257, CreditsLine212, CreditsLine213, CreditsLine257
dw CreditsLine214, CreditsLine215, CreditsLine257, CreditsLine216, CreditsLine217, CreditsLine257, CreditsLine218, CreditsLine219
dw CreditsLine220, CreditsLine257, CreditsLine221, CreditsLine222, CreditsLine257, CreditsLine223, CreditsLine224, CreditsLine257
dw CreditsLine225, CreditsLine226, CreditsLine257, CreditsLine227, CreditsLine228, CreditsLine257, CreditsLine229, CreditsLine230
dw CreditsLine257, CreditsLine231, CreditsLine232, CreditsLine257, CreditsLine233, CreditsLine234, CreditsLine257, CreditsLine235
dw CreditsLine236, CreditsLine257, CreditsLine237, CreditsLine238, CreditsLine257, CreditsLine239, CreditsLine240, CreditsLine257
dw CreditsLine241, CreditsLine242, CreditsLine257, CreditsLine243, CreditsLine244, CreditsLine257, CreditsLine245, CreditsLine246
dw CreditsLine257, CreditsLine247, CreditsLine248, CreditsLine257, CreditsLine249, CreditsLine250, CreditsLine257, CreditsLine251
dw CreditsLine252, CreditsLine257, CreditsLine253, CreditsLine254, CreditsLine257, CreditsLine257, CreditsLine257, CreditsLine257
dw CreditsLine257, CreditsLine257, CreditsLine257, CreditsLine001, CreditsLine001, CreditsLine001, CreditsLine001, CreditsLine001
dw CreditsLine001, CreditsLine001, CreditsLine001, CreditsLine001, CreditsLine001, CreditsLine001, CreditsLine255, CreditsLine256
!CHESTS_X = 23
!CHESTS_Y = 217
!OTHER_X = 23
!OTHER_Y = 220
!TOTAL_X = 23
!TOTAL_Y = 223
!Y_ITEMS_X = 23
!Y_ITEMS_Y = 227
!A_ITEMS_X = 23
!A_ITEMS_Y = 230
!SWORDS_X = 23
!SWORDS_Y = 233
!SHIELDS_X = 23
!SHIELDS_Y = 236
!MAILS_X = 23
!MAILS_Y = 239
!CAPACITY_UPGRADES_X = 23
!CAPACITY_UPGRADES_Y = 242
!HEART_PIECES_X = 23
!HEART_PIECES_Y = 245
!HEART_CONTAINERS_X = 23
!HEART_CONTAINERS_Y = 248
!MAPS_X = 23
!MAPS_Y = 252
!COMPASSES_X = 23
!COMPASSES_Y = 255
!SMALL_KEYS_X = 23
!SMALL_KEYS_Y = 258
!BIG_KEYS_X = 23
!BIG_KEYS_Y = 261
!BIG_CHESTS_X = 23
!BIG_CHESTS_Y = 264
!PENDANTS_X = 23
!PENDANTS_Y = 267
!CRYSTALS_X = 23
!CRYSTALS_Y = 270
!BOSSES_X = 23
!BOSSES_Y = 273
!HYRULE_CASTLE_X = 23
!HYRULE_CASTLE_Y = 279
!EASTERN_PALACE_X = 23
!EASTERN_PALACE_Y = 282
!DESERT_PALACE_X = 23
!DESERT_PALACE_Y = 285
!TOWER_OF_HERA_X = 23
!TOWER_OF_HERA_Y = 288
!AGAHNIMS_TOWER_X = 23
!AGAHNIMS_TOWER_Y = 291
!PALACE_OF_DARKNESS_X = 23
!PALACE_OF_DARKNESS_Y = 294
!SWAMP_PALACE_X = 23
!SWAMP_PALACE_Y = 297
!SKULL_WOODS_X = 23
!SKULL_WOODS_Y = 300
!THIEVES_TOWN_X = 23
!THIEVES_TOWN_Y = 303
!ICE_PALACE_X = 23
!ICE_PALACE_Y = 306
!MISERY_MIRE_X = 23
!MISERY_MIRE_Y = 309
!TURTLE_ROCK_X = 23
!TURTLE_ROCK_Y = 312
!GANONS_TOWER_X = 23
!GANONS_TOWER_Y = 315
!ITEMS_PRE_GANON_KEY_X = 23
!ITEMS_PRE_GANON_KEY_Y = 319
!LEVEL_1_SWORD_BOSSES_X = 23
!LEVEL_1_SWORD_BOSSES_Y = 322
!LEVEL_2_SWORD_BOSSES_X = 23
!LEVEL_2_SWORD_BOSSES_Y = 325
!LEVEL_3_SWORD_BOSSES_X = 23
!LEVEL_3_SWORD_BOSSES_Y = 328
!LEVEL_4_SWORD_BOSSES_X = 23
!LEVEL_4_SWORD_BOSSES_Y = 331
!LOCATIONS_PRE_BOOTS_X = 27
!LOCATIONS_PRE_BOOTS_Y = 334
!LOCATIONS_PRE_MIRROR_X = 27
!LOCATIONS_PRE_MIRROR_Y = 337
!NUMBER_OF_BONKS_X = 27
!NUMBER_OF_BONKS_Y = 340
!MIRROR_USES_OUTDOORS_X = 27
!MIRROR_USES_OUTDOORS_Y = 343
!MIRROR_USES_IN_DUNGEONS_X = 27
!MIRROR_USES_IN_DUNGEONS_Y = 346
!TIMES_FLUTED_X = 27
!TIMES_FLUTED_Y = 349
!SCREEN_TRANSITIONS_X = 27
!SCREEN_TRANSITIONS_Y = 352
!TOTAL_RUPEES_COLLECTED_X = 27
!TOTAL_RUPEES_COLLECTED_Y = 355
!TOTAL_RUPEES_SPENT_X = 27
!TOTAL_RUPEES_SPENT_Y = 358
!SAVE_AND_QUITS_X = 27
!SAVE_AND_QUITS_Y = 361
!DEATHS_X = 27
!DEATHS_Y = 364
!TIME_IN_ITEM_MENU_X = 20
!TIME_IN_ITEM_MENU_Y = 367
!TOTAL_LAG_TIME_X = 20
!TOTAL_LAG_TIME_Y = 370
!TOTAL_TIME_X = 17
!TOTAL_TIME_Y = 390

BIN
stats/font.gb Executable file

Binary file not shown.

1
stats/fonttable.bin Executable file
View File

@@ -0,0 +1 @@
ź9°9±9´9µ9¶9·9Ü9Ý9Ţ9ß9đ9ń9ň9ó9ô9ő9ö9÷9ř9ů9ú9ű9ü9ý9ţ9ź-°-±-´-µ-¶-·-Ü-Ý-Ţ-ß-đ-ń-ň-ó-ô-ő-ö-÷-ř-ů-ú-ű-ü-ý-ţ-©-ą-ş-»-ź)°)±)´)µ)¶)·)Ü)Ý)Ţ)ß)đ)ń)ň)ó)ô)ő)ö)÷)ř)ů)ú)ű)ü)ý)ţ)Ľ)@=A=B=C=D=E=F=G=H=I=J=K=L=M=N=O=`=a=b=c=d=e=f=g=h=i=j=k=l=m=n=o=€=<3D>==<3D>=¨=‡=P=Q=R=S=T=U=V=W=X=Y=Z=[=\=]=^=_=p=q=r=s=t=u=v=w=x=y=z={=|=}=~==<3D>===“=¸=—=<3D>=Ŕ=Á=Â=Ă=˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Đ=Ń=Ň=Ó=˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙

599
stats/main.asm Executable file
View File

@@ -0,0 +1,599 @@
lorom
!ADD = "CLC : ADC"
!SUB = "SEC : SBC"
!BLT = "BCC"
!BGE = "BCS"
org $238000
incsrc stats/credits.asm
FontGfx:
incbin stats/font.gb
FontGfxEnd:
; Custom addresses. Most are arbitrary. Feel free to make sure they're okay or moving them elsewhere within ZP
!CreditsPtr = $7C ; 3 bytes
!Temp = $B3 ; 2 bytes
!StatsBottom = $B5 ; 2 bytes
!StatsPtr = $B7 ; 3 bytes
!ValueLow = $BA ; 2 bytes
!ValueHigh = $BC ; 2 bytes
!Hours = $72 ; 2 bytes
!Minutes = $74 ; 2 bytes
!Seconds = $76 ; 2 bytes
!RemoveZero = $78 ; 2 bytes
; Original addresses
!LineNumber = $CA ; 2 bytes
PreparePointer:
LDA.w #$2300
STA.b !CreditsPtr+1
LDA.w #CreditsLineTable
STA.b !CreditsPtr
LDA [!CreditsPtr],Y
STA.b !CreditsPtr
LDY.w #$0000
RTL
; Regular stat: XXXX X00L LLLL LLLL BBBB SSSS CCC- ---- ---- ---- AAAA AAAA AAAA AAAA AAAA AAAA
; Time stat: XXXX X01L LLLL LLLL ---- ---- ---- ---- ---- ---- AAAA AAAA AAAA AAAA AAAA AAAA
; End of data: 1111 1111 1111 1111
; X X offset (measured in 8x8 tiles)
; L Line number
; B Amount of bits to keep after shifting (0000 = 16 bits, 0001 = 1 bit, 1111 = 15 bits)
; S Amount of bits to right shift the value by (0000 = 0 bits, 1111 = 15 bits)
; C Value cap
; 000 No cap
; 001 9
; 010 99
; 011 999
; 100 9999
; A Memory Address
ValueCaps:
dw 0
dw 9
dw 99
dw 999
dw 9999
BitMasks:
dw $FFFF
dw $0001
dw $0003
dw $0007
dw $000F
dw $001F
dw $003F
dw $007F
dw $00FF
dw $01FF
dw $03FF
dw $07FF
dw $0FFF
dw $1FFF
dw $3FFF
dw $7FFF
macro AddStat(address, type, shiftRight, bits, digits, xPos, lineNumber)
db <xPos><<2|<type><<9|<lineNumber>>>8
db <lineNumber>
db <bits><<4|<shiftRight>
db <digits><<5
db $00
dl <address>
endmacro
macro StripeStart(xPos, length)
LDA $C8
CLC
ADC.w #<xPos>
XBA
STA $1002,x
LDA.w #<length>*2-1
XBA
LDA #$0500
STA $1004,x
endmacro
macro StripeTile()
STA $1006,x
INX
INX
endmacro
macro StripeEnd()
INX
INX
INX
INX
endmacro
HexToDecStats:
PHA
PHA
LDA.w #$0000
STA $7F5003 : STA $7F5005 : STA $7F5006 ; clear digit storage
PLA
-
CMP.w #10000 : !BLT +
PHA : SEP #$20 : LDA $7F5003 : INC : STA $7F5003 : REP #$20 : PLA
!SUB.w #10000 : BRA -
+ -
CMP.w #1000 : !BLT +
PHA : SEP #$20 : LDA $7F5004 : INC : STA $7F5004 : REP #$20 : PLA
!SUB.w #1000 : BRA -
+ -
CMP.w #100 : !BLT +
PHA : SEP #$20 : LDA $7F5005 : INC : STA $7F5005 : REP #$20 : PLA
!SUB.w #100 : BRA -
+ -
CMP.w #10 : !BLT +
PHA : SEP #$20 : LDA $7F5006 : INC : STA $7F5006 : REP #$20 : PLA
!SUB.w #10 : BRA -
+ -
CMP.w #1 : !BLT +
PHA : SEP #$20 : LDA $7F5007 : INC : STA $7F5007 : REP #$20 : PLA
!SUB.w #1 : BRA -
+
PLA
RTL
LastHexDigit:
TYA
AND #$000F
PHA
TYA
LSR #4
TAY
CLC
LDA !StatsBottom
BNE +
; Upper half
PLA
ADC #$3D40
RTS
+ ; Lower half
PLA
ADC #$3D50
RTS
FindLine:
LDY.w #$0000
- LDA.w CreditsStats,y
STZ !StatsBottom
CMP #$FFFF
BEQ .noLine
XBA
AND #$01FF
CMP !LineNumber
BEQ .lineFound
INC
INC !StatsBottom
CMP !LineNumber
BEQ .lineFound
INY #8
BRA -
.lineFound
SEC
RTS
.noLine
CLC
RTS
!FRAMES_PER_SECOND = 60
!FRAMES_PER_MINUTE = 60*60
!FRAMES_PER_HOUR = 60*60*60
!MAX_FRAME_COUNT = 59*60+59*60+59*60+99
macro CountUnits(framesPerUnit, unitCounter)
STZ <unitCounter>
?loop:
LDA !ValueLow
SEC
SBC.w #<framesPerUnit>
STA !Temp
LDA !ValueHigh
SBC.w #<framesPerUnit>>>16
BCC ?end
STA !ValueHigh
LDA !Temp
STA !ValueLow
INC <unitCounter>
BRA ?loop
?end:
endmacro
!ColonOffset = $83
!PeriodOffset = $80
!BlankTile = $883D
RenderCreditsStatCounter:
PHB
PHK
PLB
JSR FindLine
BCS +
BRL .endStats
+
; XXXX X00L LLLL LLLL BBBB SSSS CCC- ---- ---- ---- AAAA AAAA AAAA AAAA AAAA AAAA
; == Determine stat type ==
LDA CreditsStats,y ; LLLL LLLL XXXX XTTL
LSR
AND #$0003 ; TT
CMP.w #$0000
BEQ .normalStat
BRL .timeStat
.normalStat
; == Write Stripe header (VRAM address, i.e. tile coordinates) ==
LDA CreditsStats,y ; LLLL LLLL XXXX XTTL
LSR #3
AND #$001F ; X XXXX
CLC
ADC $C8
XBA
STA $1002,x
; == Write Stripe header (Length of data) ==
LDA.w #4*2-1 ; 4 tiles = 8 bytes
XBA
STA $1004,x
PHX
; == Load tile base (upper or lower half of white two-line zero) ==
LDA !StatsBottom
BNE +
LDA #$3D40
BRA ++
+ LDA #$3D50
++ STA !Temp
; == Load the actual stat word ==
LDA.w CreditsStats+5,y
STA.b !StatsPtr
LDA.w CreditsStats+6,y
STA.b !StatsPtr+1
LDA.b [!StatsPtr]
STA !ValueLow
; == Shift value ==
LDA CreditsStats+2,y; CCC- ---- BBBB SSSS
AND.w #$000F ; SSSS
BEQ +
TAX
LDA !ValueLow
- LSR
DEX
BNE -
STA !ValueLow
+
; == Mask value ==
LDA CreditsStats+2,y; CCC- ---- BBBB SSSS
;LSR #4
;AND.w #$000F ; BBBB
LSR #3
AND.w #$001E
TAX
LDA BitMasks,x
AND !ValueLow
STA !ValueLow
; == Cap value ==
LDA CreditsStats+3,y; ---- ---- CCC- ----
LSR #5
AND.w #$0007 ; CCC
BEQ +
ASL : TAX
LDA ValueCaps,x
CMP !ValueLow
!BGE +
STA !ValueLow
+
; == Display value ==
LDA !ValueLow
JSL HexToDecStats
PLX
STZ !RemoveZero
LDA $7F5004
AND #$00FF
CMP !RemoveZero
BNE +
LDA !BlankTile
BRA ++
+ DEC !RemoveZero
CLC
ADC !Temp
++ %StripeTile()
LDA $7F5005
AND #$00FF
CMP !RemoveZero
BNE +
LDA !BlankTile
BRA ++
+ DEC !RemoveZero
CLC
ADC !Temp
++ %StripeTile()
LDA $7F5006
AND #$00FF
CMP !RemoveZero
BNE +
LDA !BlankTile
BRA ++
+ DEC !RemoveZero
CLC
ADC !Temp
++ %StripeTile()
LDA $7F5007
AND #$00FF
CLC
ADC !Temp
%StripeTile()
%StripeEnd()
.endStats
;JSR RenderLineNumber
PLB
RTL
.timeStat
; Output format: HH:MM:SS.FF
; == Write Stripe header (VRAM address, i.e. tile coordinates) ==
LDA CreditsStats,y ; LLLL LLLL XXXX XTTL
LSR #3
AND #$001F ; X XXXX
CLC
ADC $C8
XBA
STA $1002,x
; == Write Stripe header (Length of data) ==
LDA.w #11*2-1 ; 11 tiles = 22 bytes
XBA
STA $1004,x
PHX
; == Load the actual stat words ==
LDA.w CreditsStats+5,y
STA.b !StatsPtr
LDA.w CreditsStats+6,y
STA.b !StatsPtr+1
LDA.b [!StatsPtr]
STA !ValueLow
INC !StatsPtr
INC !StatsPtr
LDA.b [!StatsPtr]
STA !ValueHigh
CMP.w #!MAX_FRAME_COUNT>>16+1
!BGE ++
; == Convert total frames into hours, minutes, seconds and frames ==
%CountUnits(!FRAMES_PER_HOUR, !Hours)
%CountUnits(!FRAMES_PER_MINUTE, !Minutes)
%CountUnits(!FRAMES_PER_SECOND, !Seconds)
; == Cap at 99:59:59.59 ==
LDA !Hours
CMP.w #100
!BLT +
++ LDA.w #99
STA !Hours
LDA.w #59
STA !Minutes
STA !Seconds
STA !ValueLow
+
; == Load tile base (upper or lower half of white two-line zero) ==
LDA !StatsBottom
BNE +
LDA #$3D40
BRA ++
+ LDA #$3D50
++ STA !Temp
PLX
; == Display value ==
LDA !Hours
JSL HexToDecStats
LDA $7F5006
AND #$00FF
CLC
ADC !Temp
%StripeTile()
LDA $7F5007
AND #$00FF
CLC
ADC !Temp
%StripeTile()
LDA.w #!ColonOffset
CLC
ADC !Temp
%StripeTile()
LDA !Minutes
JSL HexToDecStats
LDA $7F5006
AND #$00FF
CLC
ADC !Temp
%StripeTile()
LDA $7F5007
AND #$00FF
CLC
ADC !Temp
%StripeTile()
LDA.w #!ColonOffset
CLC
ADC !Temp
%StripeTile()
LDA !Seconds
JSL HexToDecStats
LDA $7F5006
AND #$00FF
CLC
ADC !Temp
%StripeTile()
LDA $7F5007
AND #$00FF
CLC
ADC !Temp
%StripeTile()
LDA.w #!PeriodOffset
CLC
ADC !Temp
%StripeTile()
LDA !ValueLow
JSL HexToDecStats
LDA $7F5006
AND #$00FF
CLC
ADC !Temp
%StripeTile()
LDA $7F5007
AND #$00FF
CLC
ADC !Temp
%StripeTile()
%StripeEnd()
BRL .endStats
RenderLineNumber:
%StripeStart(0, 3)
STZ !StatsBottom
LDA $CA
TAY
AND #$0001
BEQ +
DEY
INC !StatsBottom
+
JSR LastHexDigit
PHA
JSR LastHexDigit
PHA
JSR LastHexDigit
%StripeTile()
PLA
%StripeTile()
PLA
%StripeTile()
%StripeEnd()
RTS
LoadModifiedFont:
; Based on CopyFontToVram(Bank00)
; copies font graphics to VRAM (for BG3)
; set name base table to vram $4000 (word)
LDA.b #$02 : STA $2101
; increment on writes to $2119
LDA.b #$80 : STA $2115
; set bank of the source address (see below)
LDA.b #FontGfx>>16 : STA $02
REP #$30
; vram target address is $7000 (word)
LDA.w #$7000 : STA $2116
; $00[3] = $0E8000 (offset for the font data)
LDA.w #FontGfx : STA $00
; going to write 0x1000 bytes (0x800 words)
LDX.w #FontGfxEnd-FontGfx/2-1
.nextWord
; read a word from the font data
LDA [$00] : STA $2118
; increment source address by 2
INC $00 : INC $00
DEX : BPL .nextWord
SEP #$30
RTL
CheckFontTable:
TAY
PHB
PHK
PLB
LDA.w FontTable,Y
PLB
RTL
FontTable:
incbin stats/fonttable.bin
CreditsStats:
incsrc stats/statConfig.asm
dw $FFFF
org $0EE651
JSL LoadModifiedFont
org $0EE828
JSL PreparePointer
LDA [!CreditsPtr],Y
NOP
org $0EE83F
LDA [!CreditsPtr],Y
NOP
org $0EE853
LDA [!CreditsPtr],Y
NOP
AND.w #$00ff
ASL A
JSL CheckFontTable
org $0ee86d
JSL RenderCreditsStatCounter
JMP.w AfterDeathCounterOutput
org $0ee8fd
AfterDeathCounterOutput:

57
stats/statConfig.asm Executable file
View File

@@ -0,0 +1,57 @@
;(address, type, shiftRight, bits, digits, xPos, lineNumber)
%AddStat($7EF442, 0, 0, 08, 3, !CHESTS_X, !CHESTS_Y)
%AddStat($7F503E, 0, 0, 06, 2, !OTHER_X, !OTHER_Y)
%AddStat($7EF423, 0, 0, 08, 3, !TOTAL_X, !TOTAL_Y)
%AddStat($7EF421, 0, 3, 05, 2, !Y_ITEMS_X, !Y_ITEMS_Y)
%AddStat($7EF421, 0, 0, 03, 1, !A_ITEMS_X, !A_ITEMS_Y)
%AddStat($7EF422, 0, 5, 03, 1, !SWORDS_X, !SWORDS_Y)
%AddStat($7EF422, 0, 3, 02, 1, !SHIELDS_X, !SHIELDS_Y)
%AddStat($7EF424, 0, 6, 02, 1, !MAILS_X, !MAILS_Y)
%AddStat($7EF452, 0, 0, 04, 2, !CAPACITY_UPGRADES_X, !CAPACITY_UPGRADES_Y)
%AddStat($7EF448, 0, 0, 05, 2, !HEART_PIECES_X, !HEART_PIECES_Y)
%AddStat($7EF429, 0, 4, 04, 2, !HEART_CONTAINERS_X, !HEART_CONTAINERS_Y)
%AddStat($7EF428, 0, 4, 04, 2, !MAPS_X, !MAPS_Y)
%AddStat($7EF428, 0, 0, 04, 2, !COMPASSES_X, !COMPASSES_Y)
%AddStat($7EF424, 0, 0, 06, 2, !SMALL_KEYS_X, !SMALL_KEYS_Y)
%AddStat($7EF427, 0, 4, 04, 2, !BIG_KEYS_X, !BIG_KEYS_Y)
%AddStat($7EF427, 0, 0, 04, 2, !BIG_CHESTS_X, !BIG_CHESTS_Y)
;%AddStat($7E0000, 0, 8, 16, 4, !DOORS_UNLOCKED_X, !DOORS_UNLOCKED_Y)
%AddStat($7EF429, 0, 0, 02, 1, !PENDANTS_X, !PENDANTS_Y)
%AddStat($7EF422, 0, 0, 03, 1, !CRYSTALS_X, !CRYSTALS_Y)
%AddStat($7F5037, 0, 0, 08, 2, !BOSSES_X, !BOSSES_Y)
%AddStat($7EF434, 0, 4, 04, 1, !HYRULE_CASTLE_X, !HYRULE_CASTLE_Y)
%AddStat($7EF436, 0, 0, 03, 1, !EASTERN_PALACE_X, !EASTERN_PALACE_Y)
%AddStat($7EF435, 0, 5, 03, 1, !DESERT_PALACE_X, !DESERT_PALACE_Y)
%AddStat($7EF435, 0, 2, 03, 1, !TOWER_OF_HERA_X, !TOWER_OF_HERA_Y)
%AddStat($7EF435, 0, 0, 02, 1, !AGAHNIMS_TOWER_X, !AGAHNIMS_TOWER_Y)
%AddStat($7EF434, 0, 0, 04, 2, !PALACE_OF_DARKNESS_X, !PALACE_OF_DARKNESS_Y)
%AddStat($7EF439, 0, 0, 04, 2, !SWAMP_PALACE_X, !SWAMP_PALACE_Y)
;(address, type, shiftRight, bits, digits, xPos, lineNumber)
%AddStat($7EF437, 0, 4, 04, 1, !SKULL_WOODS_X, !SKULL_WOODS_Y)
%AddStat($7EF437, 0, 0, 04, 1, !THIEVES_TOWN_X, !THIEVES_TOWN_Y)
%AddStat($7EF438, 0, 4, 04, 1, !ICE_PALACE_X, !ICE_PALACE_Y)
%AddStat($7EF438, 0, 0, 04, 1, !MISERY_MIRE_X, !MISERY_MIRE_Y)
%AddStat($7EF439, 0, 4, 04, 2, !TURTLE_ROCK_X, !TURTLE_ROCK_Y)
%AddStat($7EF436, 0, 3, 05, 2, !GANONS_TOWER_X, !GANONS_TOWER_Y)
%AddStat($7EF42A, 0, 0, 05, 2, !ITEMS_PRE_GANON_KEY_X, !ITEMS_PRE_GANON_KEY_Y)
%AddStat($7EF425, 0, 4, 04, 2, !LEVEL_1_SWORD_BOSSES_X, !LEVEL_1_SWORD_BOSSES_Y)
%AddStat($7EF425, 0, 0, 04, 2, !LEVEL_2_SWORD_BOSSES_X, !LEVEL_2_SWORD_BOSSES_Y)
%AddStat($7EF426, 0, 4, 04, 2, !LEVEL_3_SWORD_BOSSES_X, !LEVEL_3_SWORD_BOSSES_Y)
%AddStat($7EF426, 0, 0, 04, 2, !LEVEL_4_SWORD_BOSSES_X, !LEVEL_4_SWORD_BOSSES_Y)
%AddStat($7EF432, 0, 0, 08, 3, !LOCATIONS_PRE_BOOTS_X, !LOCATIONS_PRE_BOOTS_Y)
%AddStat($7EF433, 0, 0, 08, 3, !LOCATIONS_PRE_MIRROR_X, !LOCATIONS_PRE_MIRROR_Y)
%AddStat($7EF420, 0, 0, 08, 3, !NUMBER_OF_BONKS_X, !NUMBER_OF_BONKS_Y)
%AddStat($7EF43A, 0, 0, 08, 2, !MIRROR_USES_OUTDOORS_X, !MIRROR_USES_OUTDOORS_Y)
%AddStat($7EF43B, 0, 0, 08, 2, !MIRROR_USES_IN_DUNGEONS_X, !MIRROR_USES_IN_DUNGEONS_Y)
%AddStat($7EF44B, 0, 0, 08, 2, !TIMES_FLUTED_X, !TIMES_FLUTED_Y)
%AddStat($7EF43C, 0, 0, 16, 3, !SCREEN_TRANSITIONS_X, !SCREEN_TRANSITIONS_Y)
%AddStat($7F503C, 0, 0, 16, 5, !TOTAL_RUPEES_COLLECTED_X, !TOTAL_RUPEES_COLLECTED_Y)
%AddStat($7EF42B, 0, 0, 16, 5, !TOTAL_RUPEES_SPENT_X, !TOTAL_RUPEES_SPENT_Y)
%AddStat($7EF42D, 0, 0, 08, 2, !SAVE_AND_QUITS_X, !SAVE_AND_QUITS_Y)
%AddStat($7EF449, 0, 0, 08, 2, !DEATHS_X, !DEATHS_Y)
%AddStat($7EF444, 1, 8, 32, 4, !TIME_IN_ITEM_MENU_X, !TIME_IN_ITEM_MENU_Y)
%AddStat($7F5038, 1, 0, 32, 4, !TOTAL_LAG_TIME_X, !TOTAL_LAG_TIME_Y)
%AddStat($7EF43E, 1, 0, 32, 4, !TOTAL_TIME_X, !TOTAL_TIME_Y)

44
swordswap.asm Normal file
View File

@@ -0,0 +1,44 @@
;================================================================================
; Master / Tempered / Golden Sword Swap
;================================================================================
;$03348E: smith sword check (to see if uprade-able)
;================================================================================
GetFairySword:
CMP.b #$49 : BNE + : LDA.b #$00 : + ; convert single fighter sword to low id one
CMP.b #$50 : BNE + : LDA.b #$01 : + ; convert safe master sword to normal one
CMP #$04 : !BLT + : JMP.l PyramidFairy_BRANCH_IOTA : + ; for any sword, incl newer
JSL ItemCheck_FairySword : BEQ + : JMP.l PyramidFairy_BRANCH_IOTA : + ; skip if we already flagged getting this
JSL ItemSet_FairySword ; mark as got
LDA FairySword : STA $0DC0, X ; whichever sword
LDA.b #$05 : STA $0EB0, X ; something we overwrote, documentation unclear on purpose
JMP.l PyramidFairy_BRANCH_GAMMA
;================================================================================
;GetSmithSword:
; JSL ItemCheck_SmithSword : BEQ + : JMP.l Smithy_AlreadyGotSword : + ; check if we're not already done
; ;JSL ItemSet_SmithSword - too early
;JMP.l Smithy_DoesntHaveSword
;================================================================================
LoadSwordForDamage:
LDA $7EF359 : CMP #$04 : BNE .done ; skip if not gold sword
LDA $1B : BEQ + ; skip if outdoors
LDA $A0 : CMP #41 : BNE + ; decimal 41 ; skip if not in the mothula room
LDA #$03 ; pretend we're using tempered
BRA .done
+
LDA #$04 ; nvm gold sword is fine
.done
RTL
;================================================================================
GetSmithSword:
JSL ItemCheck_SmithSword : BEQ + : JMP.l Smithy_AlreadyGotSword : +
LDA.l SmithItemMode : BNE +
JMP.l Smithy_DoesntHaveSword ; Classic Smithy
+
LDA.l SmithItem : TAY
STZ $02E9 ; Item from NPC
PHX : JSL Link_ReceiveItem : PLX
REP #$20 : LDA $7EF360 : !SUB.w #$000A : STA $7EF360 : SEP #$20 ; Take 10 rupees
JSL ItemSet_SmithSword
JMP.l Smithy_AlreadyGotSword
;================================================================================

1097
tables.asm Normal file

File diff suppressed because it is too large Load Diff

135
tablets.asm Normal file
View File

@@ -0,0 +1,135 @@
;================================================================================
; Randomize Tablets
;--------------------------------------------------------------------------------
ItemSet_EtherTablet:
PHA : LDA !NPC_FLAGS_2 : ORA.b #$01 : STA !NPC_FLAGS_2 : PLA
RTL
;--------------------------------------------------------------------------------
ItemSet_BombosTablet:
PHA : LDA !NPC_FLAGS_2 : ORA.b #$02 : STA !NPC_FLAGS_2 : PLA
RTL
;--------------------------------------------------------------------------------
ItemCheck_EtherTablet:
LDA !NPC_FLAGS_2 : AND.b #$01
RTL
;--------------------------------------------------------------------------------
ItemCheck_BombosTablet:
LDA !NPC_FLAGS_2 : AND.b #$02
RTL
;--------------------------------------------------------------------------------
SetTabletItem:
JSL.l GetSpriteID
PHA
LDA $8A : CMP.b #$03 : BEQ .ether ; if we're on the map where ether is, we're the ether tablet
.bombos
JSL.l ItemSet_BombosTablet : BRA .done
.ether
JSL.l ItemSet_EtherTablet
.done
PLA
RTL
;--------------------------------------------------------------------------------
SpawnTabletItem:
; JSL.l HeartPieceGet
;RTL
JSL.l LoadOutdoorValue
JSL.l PrepDynamicTile
LDA.b #$01 : STA !FORCE_HEART_SPAWN : STA !SKIP_HEART_SAVE
JSL.l SetTabletItem
LDA.b #$EB
STA $7FFE00
JSL Sprite_SpawnDynamically
LDA $22 : STA $0D10, Y
LDA $23 : STA $0D30, Y
LDA $20 : STA $0D00, Y
LDA $21 : STA $0D20, Y
LDA.b #$00 : STA $0F20, Y
LDA.b #$7F : STA $0F70, Y ; spawn WAY up high
RTL
;--------------------------------------------------------------------------------
MaybeUnlockTabletAnimation:
PHA : PHP
JSL.l IsMedallion : BCC +
STZ $0112 ; disable falling-medallion mode
STZ $03EF ; release link from item-up pose
LDA.b #$00 : STA $5D ; set link to ground state
REP #$20 ; set 16-bit accumulator
LDA $8A : CMP.w #$0030 : BNE ++ ; Desert
SEP #$20 ; set 8-bit accumulator
LDA.b #$02 : STA $2F ; face link forward
LDA.b #$3C : STA $46 ; lock link for 60f
++
SEP #$20 ; set 8-bit accumulator
+
PLP : PLA
RTL
;--------------------------------------------------------------------------------
IsMedallion:
REP #$20 ; set 16-bit accumulator
LDA $8A
CMP.w #$03 : BNE + ; Death Mountain
LDA $22 : CMP.w #1890 : !BGE ++
SEC
BRL .done
++
BRA .false
+ CMP.w #$30 : BNE + ; Desert
LDA $22 : CMP.w #512 : !BLT ++
SEC
BRL .done
++
+
.false
CLC
.done
SEP #$20 ; set 8-bit accumulator
RTL
;--------------------------------------------------------------------------------
LoadNarrowObject:
LDA AddReceivedItemExpanded_wide_item_flag, X : STA ($92), Y ; AddReceiveItem.wide_item_flag? ; LDA.b #$00 : STA ($92), Y in the japanese version
PLY
;JSL.l DrawNarrowDroppedObject
JMP.l LoadNarrowObjectReturn
;--------------------------------------------------------------------------------
DrawNarrowDroppedObject:
; If it's a 16x16 sprite, we'll only draw one, otherwise we'll end up drawing
; two 8x8 sprites stack on top of each other
CMP.b #$02 : BEQ .large_sprite
REP #$20
; Shift Y coordinate 8 pixels down
LDA $08 : STA $00
SEP #$20
JSL.l Ancilla_SetOam_XY_Long
; always use the same character graphic (0x34)
LDA.b #$34 : STA ($90), Y : INY
LDA AddReceivedItemExpanded_properties, X : BPL .valid_lower_properties
LDA $74
.valid_lower_properties
ASL A : ORA.b #$30 : STA ($90), Y
INY : PHY
TYA : !SUB.b #$04 : LSR #2 : TAY
LDA.b #$00 : STA ($92), Y
PLY
.large_sprite
RTL
;--------------------------------------------------------------------------------

168
timer.asm Normal file
View File

@@ -0,0 +1,168 @@
;================================================================================
; Challenge Timer
;================================================================================
!Temp = "$7F5020"
!BaseTimer = "$7EF43E"
!ChallengeTimer = "$7EF454"
;--------------------------------------------------------------------------------
!CLOCK_HOURS = "$7F5080" ; $7F5080 - $7F5083 - Clock Hours
!CLOCK_MINUTES = "$7F5084" ; $7F5084 - $7F5087 - Clock Minutes
!CLOCK_SECONDS = "$7F5088" ; $7F5088 - $7F508B - Clock Seconds
!CLOCK_TEMPORARY = "$7F508C" ; $7F508C - $7F508F - Clock Temporary
;--------------------------------------------------------------------------------
!FRAMES_PER_SECOND = #60
!FRAMES_PER_MINUTE = #60*60
!FRAMES_PER_HOUR = #60*60*60
;--------------------------------------------------------------------------------
!Status = "$7F507E"
; ---- --dn
; d - dnf
; n - negative
;--------------------------------------------------------------------------------
macro DecIncr(value)
LDA.l <value> : INC
CMP.w #$000A : !BLT ?noIncr
LDA.l <value>+2 : INC : STA.l <value>+2
LDA.w #$0000
?noIncr:
STA.l <value>
endmacro
;--------------------------------------------------------------------------------
macro Sub32(minuend,subtrahend,result)
LDA.l <minuend>
!SUB.l <subtrahend> ; perform subtraction on the LSBs
STA.l <result>
LDA.l <minuend>+2 ; do the same for the MSBs, with carry
SBC.l <subtrahend>+2 ; set according to the previous result
STA.l <result>+2
endmacro
;--------------------------------------------------------------------------------
macro Blt32(value1,value2)
LDA.l <value1>+2
CMP.l <value2>+2
!BLT ?done
BNE ?done
LDA.l <value1>
CMP.l <value2>
?done:
endmacro
;--------------------------------------------------------------------------------
CalculateTimer:
LDA $FFFFFF
LDA.w #$0000
STA.l !CLOCK_HOURS ; clear digit storage
STA.l !CLOCK_HOURS+2
STA.l !CLOCK_MINUTES
STA.l !CLOCK_MINUTES+2
STA.l !CLOCK_SECONDS
STA.l !CLOCK_SECONDS+2
LDA.l TimerStyle : AND.w #$00FF : CMP.w #$0002 : BNE + ; Stopwatch Mode
%Sub32(!BaseTimer,!ChallengeTimer,!CLOCK_TEMPORARY)
BRA ++
+ CMP.w #$0001 : BNE ++ ; Countdown Mode
%Sub32(!ChallengeTimer,!BaseTimer,!CLOCK_TEMPORARY)
++
%Blt32(!CLOCK_TEMPORARY,.halfCycle) : !BLT +
LDA.l TimeoutBehavior : AND.w #$00FF : BNE ++ ; DNF
LDA.w #$0002 : STA.l !Status ; Set DNF Mode
LDA.l !BaseTimer : STA.l !ChallengeTimer
LDA.l !BaseTimer+2 : STA.l !ChallengeTimer+2
RTS
++ CMP.w #$0001 : BNE ++ ; Negative Time
LDA.l !CLOCK_TEMPORARY : EOR.w #$FFFF : !ADD.w #$0001 : STA.l !CLOCK_TEMPORARY
LDA.l !CLOCK_TEMPORARY+2 : EOR.w #$FFFF : ADC.w #$0000 : STA.l !CLOCK_TEMPORARY+2
LDA.w #$0001 : STA.l !Status ; Set Negative Mode
BRA .prepDigits
++ ; OHKO
LDA.w #$0002 : STA.l !Status ; Set DNF Mode
LDA.l !BaseTimer : STA.l !ChallengeTimer
LDA.l !BaseTimer+2 : STA.l !ChallengeTimer+2
RTS
+
LDA.l TimerRestart : AND.w #$00FF : BEQ +
LDA.w #$0000 : STA.l !Status ; Set Positive Mode
+
.prepDigits
-
%Blt32(!CLOCK_TEMPORARY,.hour) : !BLT +
%DecIncr(!CLOCK_HOURS)
%Sub32(!CLOCK_TEMPORARY,.hour,!CLOCK_TEMPORARY) : BRA -
+ -
%Blt32(!CLOCK_TEMPORARY,.minute) : !BLT +
%DecIncr(!CLOCK_MINUTES)
%Sub32(!CLOCK_TEMPORARY,.minute,!CLOCK_TEMPORARY) : BRA -
+ -
%Blt32(!CLOCK_TEMPORARY,.second) : !BLT +
%DecIncr(!CLOCK_SECONDS)
%Sub32(!CLOCK_TEMPORARY,.second,!CLOCK_TEMPORARY) : BRA -
+
LDA !CLOCK_HOURS : !ADD.w #$2490 : STA !CLOCK_HOURS ; convert decimal values to tiles
LDA !CLOCK_HOURS+2 : !ADD.w #$2490 : STA !CLOCK_HOURS+2
LDA !CLOCK_MINUTES : !ADD.w #$2490 : STA !CLOCK_MINUTES
LDA !CLOCK_MINUTES+2 : !ADD.w #$2490 : STA !CLOCK_MINUTES+2
LDA !CLOCK_SECONDS : !ADD.w #$2490 : STA !CLOCK_SECONDS
LDA !CLOCK_SECONDS+2 : !ADD.w #$2490 : STA !CLOCK_SECONDS+2
RTS
;--------------------------------------------------------------------------------
.hour
dw #$4BC0, #$0003
.minute
dw #$0E10, #$0000
.second
dw #$003C, #$0000
.halfCycle
dw #$FFFF, #$7FFF
;--------------------------------------------------------------------------------
DrawChallengeTimer:
LDA.l TimerStyle : BNE + : RTL : + ; Hud Timer
LDA.w #$2807 : STA $7EC792
LDA.l !Status : AND.w #$0002 : BEQ + ; DNF / OKHO
LDA.l TimeoutBehavior : AND.w #$00FF : BNE ++ ; DNF
LDA.w #$2808 : STA $7EC794
LDA.w #$2809 : STA $7EC796
LDA.w #$247F : STA $7EC798
STA $7EC79A
BRA +++
++ ; OHKO
LDA.w #$280A : STA $7EC794
LDA.w #$280B : STA $7EC796
LDA.w #$280C : STA $7EC798
LDA.w #$247F : STA $7EC79A
+++
STA $7EC79C
STA $7EC79E
STA $7EC7A0
STA $7EC7A2
STA $7EC7A4
LDA.l TimerRestart : BNE +++ : RTL : +++
BRA ++
+ ; Show Timer
LDA.l !Status : AND.w #$0001 : !ADD.w #$2804 : STA $7EC794
LDA !CLOCK_HOURS+2 : STA $7EC796
LDA !CLOCK_HOURS : STA $7EC798
LDA.w #$2806 : STA $7EC79A
LDA !CLOCK_MINUTES+2 : STA $7EC79C
LDA !CLOCK_MINUTES : STA $7EC79E
LDA.w #$2806 : STA $7EC7A0
LDA !CLOCK_SECONDS+2 : STA $7EC7A2
LDA !CLOCK_SECONDS : STA $7EC7A4
++
LDA $1A : AND.w #$001F : BNE + : JSR CalculateTimer : +
RTL
;--------------------------------------------------------------------------------
OHKOTimer:
LDA.l TimeoutBehavior : CMP #$02 : BNE +
LDA.l !Status : AND.b #$02 : BEQ +
LDA.b #$00 : STA $7EF36D ; kill link
+
LDA $7EF36D
RTL
;--------------------------------------------------------------------------------

202
translations.asm Normal file
View File

@@ -0,0 +1,202 @@
;--------------------------------------------------------------------------------
org $1C801B ; <- E001B - E003E ; game over menu - 0x24
db $FC, $00, $BC, $AA, $BF, $AE, $C9, $AC, $B8, $B7, $BD, $B2, $B7, $BE, $AE, $F8, $BC, $AA, $BF, $AE, $C9, $BA, $BE, $B2, $BD, $F9, $AC, $B8, $B7, $BD, $B2, $B7, $BE, $AE, $FB, $FC
;--------------------------------------------------------------------------------
org $1C818F ; <- E018F - E01B6 ; tutorial guard's text 1 - 0x28
db $B8, $B7, $B5, $C2, $FF, $AA, $AD, $BE, $B5, $BD, $BC, $FF, $FF, $FF, $F8, $BC, $B1, $B8, $BE, $B5, $AD, $FF, $BD, $BB, $AA, $BF, $AE, $B5, $FF, $F9, $AA, $BD, $FF, $B7, $B2, $B0, $B1, $BD, $FF, $FB
;--------------------------------------------------------------------------------
;org $1C81B7 ; <- E01B7 - E01E3 ; tutorial guard's text 2 - 0x2D
db $C2, $B8, $BE, $FF, $AC, $AA, $B7, $FF, $B9, $BE, $BC, $B1, $FF, $C1, $F8, $BD, $B8, $FF, $BF, $B2, $AE, $C0, $FF, $BD, $B1, $AE, $FF, $FF, $FF, $F9, $B6, $AA, $B9, $CD, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FB
;--------------------------------------------------------------------------------
;org $1C81E4 ; <- E01E4 - E0210 ; tutorial guard's text 3 - 0x2D
db $B9, $BB, $AE, $BC, $BC, $FF, $BD, $B1, $AE, $FF, $AA, $FF, $FF, $FF, $F8, $AB, $BE, $BD, $BD, $B8, $B7, $FF, $BD, $B8, $FF, $B5, $B2, $AF, $BD, $F9, $BD, $B1, $B2, $B7, $B0, $BC, $FF, $AB, $C2, $FF, $C2, $B8, $BE, $FF, $FB
;--------------------------------------------------------------------------------
;org $1C8211 ; <- E0211 - E023D ; tutorial guard's text 4 - 0x2D
db $C0, $B1, $AE, $B7, $FF, $C2, $B8, $BE, $FF, $B1, $AA, $BC, $FF, $AA, $FF, $FF, $F8, $BC, $C0, $B8, $BB, $AD, $FF, $B9, $BB, $AE, $BC, $BC, $FF, $AB, $F9, $BD, $B8, $FF, $BC, $B5, $AA, $BC, $B1, $FF, $FF, $FF, $FF, $FF, $FB
;--------------------------------------------------------------------------------
;org $1C823E ; <- E023E - E0269 ; tutorial guard's text 5 - 0x2C
db $BE, $BC, $AE, $FF, $C2, $B8, $BE, $BB, $FF, $B6, $AA, $B9, $FF, $FF, $F8, $BD, $B8, $FF, $AF, $B2, $B7, $AD, $FF, $BD, $B1, $AE, $FF, $FF, $FF, $F9, $AC, $BB, $C2, $BC, $BD, $AA, $B5, $BC, $FF, $FF, $FF, $FF, $FF, $FB
;--------------------------------------------------------------------------------
;org $1C826A ; <- E026A - E0296 ; tutorial guard's text 6 - 0x2D
db $AA, $BB, $AE, $FF, $C0, $AE, $FF, $BB, $AE, $AA, $B5, $B5, $C2, $F8, $BC, $BD, $B2, $B5, $B5, $FF, $BB, $AE, $AA, $AD, $B2, $B7, $B0, $F9, $BD, $B1, $AE, $BC, $AE, $C6, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $F9, $F9, $FB
;--------------------------------------------------------------------------------
;org $1C8297 ; <- E0297 - E02BF ; tutorial guard's text 7 - 0x29
db $B3, $AE, $AE, $C3, $AE, $FF, $BD, $B1, $AE, $BB, $AE, $F8, $BB, $AE, $AA, $B5, $B5, $C2, $FF, $AA, $BB, $AE, $FF, $AA, $FF, $F9, $B5, $B8, $BD, $FF, $B8, $AF, $FF, $BD, $B1, $B2, $B7, $B0, $BC, $FF, $FB
;--------------------------------------------------------------------------------
;org $1C8CB0 ; <- E0CB0 - ; Saharala text (skipping selection) Eventual text
; free space
;--------------------------------------------------------------------------------
org $1C935A ; <- E135A - E1388 ; first sign (rain state) - 0x2F
db $E0, $FF, $AD, $C2, $B2, $B7, $B0, $FF, $BE, $B7, $AC, $B5, $AE, $FF, $F8, $FF, $FF, $BD, $B1, $B2, $BC, $FF, $C0, $AA, $C2, $FF, $FF, $FF, $FF, $F9, $F9, $F9, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FB
;--------------------------------------------------------------------------------
org $1C9389 ; <- E1389 - E13B4 ; first sign - 0x2C
db $D2, $D3, $FF, $BB, $AA, $B7, $AD, $B8, $B6, $B2, $C3, $AE, $BB, $FF, $F8, $AD, $B8, $B7, $D8, $BD, $FF, $BB, $AE, $AA, $AD, $FF, $B6, $AE, $C8, $F9, $B0, $B8, $FF, $AB, $AE, $AA, $BD, $FF, $B0, $AA, $B7, $B8, $B7, $FB
;--------------------------------------------------------------------------------
org $1C93B5 ; <- E13B5 - E13D7 ; DM cave sign - 0x23
db $AC, $AA, $BF, $AE, $FF, $BD, $B8, $FF, $BD, $B1, $AE, $F8, $B5, $B8, $BC, $BD, $FF, $B8, $B5, $AD, $FF, $B6, $AA, $B7, $F9, $B0, $B8, $B8, $AD, $FF, $B5, $BE, $AC, $B4, $FB
;--------------------------------------------------------------------------------
org $1C93D8 ; <- E13D8 - E13E6 ; Skull Woods sign - 0xF
db $E0, $FF, $B5, $B8, $BC, $BD, $FF, $C0, $B8, $B8, $AD, $BC, $FF, $FF, $FB
;--------------------------------------------------------------------------------
org $1C944B ; <- E144B - E145B ; {left} kakariko sign - 0x11 (0x12)
db $E3, $FF, $B4, $AA, $B4, $AA, $BB, $B2, $B4, $B8, $F8, $FF, $FF, $BD, $B8, $C0, $B7, $FB
;--------------------------------------------------------------------------------
org $1C94FE ; <- E14FE - E150E ; {down} kakariko sign - 0x11
db $E1, $FF, $B4, $AA, $B4, $AA, $BB, $B2, $B4, $B8, $F8, $FF, $FF, $BD, $B8, $C0, $B7, $FB
;--------------------------------------------------------------------------------
org $1C9631 ; <- E1631 - E164F ; Potion Shop no empty bottles - 0x1F (0x20)
db $C0, $B1, $B8, $AA, $FF, $AB, $BE, $AC, $B4, $B8, $C8, $F8, $B7, $B8, $FF, $AE, $B6, $B9, $BD, $C2, $FF, $FF, $F9, $AB, $B8, $BD, $BD, $B5, $AE, $BC, $CD, $FB
;--------------------------------------------------------------------------------
org $1C9E13 ; <- E1E13 ; no big key
db $BC, $B8, $B6, $AE, $BD, $B1, $B2, $B7, $B0, $FF, $B2, $BC, $F8, $B6, $B2, $BC, $BC, $B2, $B7, $B0, $CC, $FF, $FF, $F9, $BD, $B1, $AE, $FF, $AB, $B2, $B0, $FF, $B4, $AE, $C2, $C6, $FB
;--------------------------------------------------------------------------------
org $1CA96D ; <- E296D - E29F1 ; unkown - 0x85 (0x2D)
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $F8, $FF, $FF, $FF, $FF, $FF, $C2, $B8, $C7, $FF, $FF, $FF, $FF, $FF, $FF, $F9, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FB
;--------------------------------------------------------------------------------
;org $1CA9F2 ; <- E29F2 - E2A0E ; Old Man in Tavern - 0x1D (0x70)
db $B5, $B2, $AF, $AE, $C6, $FF, $B5, $B8, $BF, $AE, $C6, $FF, $FF, $FF, $F8, $B1, $AA, $B9, $B9, $B2, $B7, $AE, $BC, $BC, $C6, $FF, $BD, $B1, $AE, $F9, $BA, $BE, $AE, $BC, $BD, $B2, $B8, $B7, $FF, $C2, $B8, $BE, $FF, $FF, $FA, $F6, $BC, $B1, $B8, $BE, $B5, $AD, $FF, $BB, $AE, $AA, $B5, $B5, $C2, $F6, $AA, $BC, $B4, $FF, $B2, $BC, $C8, $FF, $C0, $AA, $BC, $F6, $BD, $B1, $B2, $BC, $FF, $B0, $AE, $B7, $AE, $BB, $AA, $BD, $AE, $AD, $FA, $F6, $AB, $C2, $FF, $BC, $BD, $B8, $B8, $B9, $BC, $FF, $AA, $B5, $BE, $F6, $B8, $BB, $FF, $BC, $BD, $B8, $B8, $B9, $BC, $FF, $B3, $AE, $BD, $C6, $FB
;--------------------------------------------------------------------------------
;org $1CAA0F ; <- E2A0F - E2A3D ; Chicken hut lady - 0x2F (0x36)
db $BD, $B1, $B2, $BC, $FF, $B2, $BC, $F8, $AC, $B1, $BB, $B2, $BC, $BD, $B8, $BC, $D8, $FF, $B1, $BE, $BD, $C8, $FA, $F9, $B1, $AE, $D8, $BC, $FF, $B8, $BE, $BD, $F6, $BC, $AE, $AA, $BB, $AC, $B1, $B2, $B7, $B0, $F6, $AF, $B8, $BB, $FF, $AA, $FF, $AB, $B8, $C0, $CD, $FB
;--------------------------------------------------------------------------------
;org $1CAA3E ; <- E2A3E - E2AD2 ; Running Man - 0x95 (0x8E)
db $B1, $B2, $C8, $FF, $AD, $B8, $FF, $C2, $B8, $BE, $F8, $B4, $B7, $B8, $C0, $FF, $BF, $AE, $AE, $BD, $B8, $BB, $B9, $C6, $F9, $FA, $F6, $C2, $B8, $BE, $FF, $BB, $AE, $AA, $B5, $B5, $C2, $F6, $BC, $B1, $B8, $BE, $B5, $AD, $CD, $FF, $AA, $B7, $AD, $F6, $AA, $B5, $B5, $FF, $BD, $B1, $AE, $FF, $B8, $BD, $B1, $AE, $BB, $FA, $F6, $B0, $BB, $AE, $AA, $BD, $FF, $B0, $BE, $C2, $BC, $FF, $C0, $B1, $B8, $F6, $B6, $AA, $AD, $AE, $FF, $BD, $B1, $B2, $BC, $F6, $B9, $B8, $BC, $BC, $B2, $AB, $B5, $AE, $CD, $FA, $F6, $B0, $B8, $FF, $BD, $B1, $AA, $B7, $B4, $FF, $BD, $B1, $AE, $B6, $F6, $F6, $FA, $F6, $B2, $AF, $FF, $C2, $B8, $BE, $FF, $AC, $AA, $B7, $FF, $F6, $AC, $AA, $BD, $AC, $B1, $FF, $BD, $B1, $AE, $B6, $CC, $FB
;--------------------------------------------------------------------------------
org $1CAAD3 ; <- E2AD3 ; race game sign
db $C0, $B1, $C2, $FF, $AA, $BB, $AE, $FF, $C2, $B8, $BE, $FF, $F8, $BB, $AE, $AA, $AD, $B2, $B7, $B0, $FF, $BD, $B1, $B2, $BC, $F9, $BC, $B2, $B0, $B7, $C6, $FF, $BB, $BE, $B7, $C7, $C7, $C7, $FB
;--------------------------------------------------------------------------------
org $1CAAFA ; <- E2AFA ; cape cave sign
db $C2, $B8, $BE, $FF, $B7, $AE, $AE, $AD, $FF, $AC, $AA, $B9, $AE, $F8, $AB, $BE, $BD, $FF, $B7, $B8, $BD, $F9, $B1, $B8, $B8, $B4, $BC, $B1, $B8, $BD, $FB
;--------------------------------------------------------------------------------
org $1CAB34 ; <- E2B34 ; north of outcasts
db $E0, $FF, $BC, $B4, $BE, $B5, $B5, $FF, $C0, $B8, $B8, $AD, $BC, $F9, $E1, $FF, $BC, $BD, $AE, $BF, $AE, $D8, $BC, $FF, $BD, $B8, $C0, $B7, $FB
;--------------------------------------------------------------------------------
org $1CAB51 ; <- E2B51 ; there is a cave sign
db $F8, $E2, $FF, $B4, $AA, $BB, $B4, $AA, $BD, $BC, $FF, $AC, $AA, $BF, $AE, $FB
;--------------------------------------------------------------------------------
org $1CAB61 ; <- E2B61 ; temple of Yami sign
db $F8, $E2, $FF, $AD, $AA, $BB, $B4, $FF, $B9, $AA, $B5, $AA, $AC, $AE, $FB
;--------------------------------------------------------------------------------
org $1CAB70 ; <- E2B70 ; bomb shop sign
db $F8, $E3, $FF, $AB, $B8, $B6, $AB, $FF, $BC, $B1, $B8, $B9, $B9, $AE, $FB
;--------------------------------------------------------------------------------
org $1CAB7F ; <- E2B7F ; Misery Mire sign
db $E3, $FF, $B6, $B2, $BC, $AE, $BB, $C2, $FF, $B6, $B2, $BB, $AE, $FF, $F8, $B7, $B8, $FF, $C0, $AA, $C2, $FF, $B2, $B7, $FF, $AA, $B7, $AD, $FF, $F9, $B7, $B8, $FF, $C0, $AA, $C2, $FF, $B8, $BE, $BD, $CD, $FF, $FF, $FF, $F9, $F9, $F9, $F9, $FB
;--------------------------------------------------------------------------------
org $1CABB0 ; <- E2BB0 ; outcasts sign
db $B1, $AA, $BF, $AE, $FF, $AA, $FF, $BD, $BB, $BE, $B5, $B2, $AE, $F8, $AA, $C0, $AE, $BC, $B8, $B6, $AE, $FF, $AD, $AA, $C2, $C7, $FB
;--------------------------------------------------------------------------------
org $1CABED ; <- E2BED - E2C1C ; guard on top of castle - 0x30
db $B5, $B8, $B8, $B4, $B2, $B7, $B0, $FF, $AF, $B8, $BB, $FF, $AA, $FF, $F8, $B9, $BB, $B2, $B7, $AC, $AE, $BC, $BC, $C6, $FF, $B5, $B8, $B8, $B4, $F9, $AD, $B8, $C0, $B7, $BC, $BD, $AA, $B2, $BB, $BC, $CD, $FF, $FF, $FF, $F9, $F9, $F9, $FB
;--------------------------------------------------------------------------------
org $1CAC1D ; <- E2C1D - E2C40 ; Gate guard - 0x24
db $B7, $B8, $FF, $B5, $B8, $B7, $B4, $BC, $FF, $FF, $FF, $FF, $FF, $FF, $F8, $AA, $B5, $B5, $B8, $C0, $AE, $AD, $C7, $FF, $FF, $FF, $FF, $FF, $F9, $FF, $FF, $FF, $FF, $FF, $FF, $FB
;--------------------------------------------------------------------------------
org $1CB019 ; <- E3019 - E3067 ; telepathic tile: Ice Palace large ice room - 0x4F
db $FE, $6B, $02, $AA, $B5, $B5, $FF, $BB, $B2, $B0, $B1, $BD, $FF, $BC, $BD, $B8, $B9, $F8, $AC, $B8, $B5, $B5, $AA, $AB, $B8, $BB, $AA, $BD, $AE, $F9, $AA, $B7, $AD, $FF, $B5, $B2, $BC, $BD, $AE, $B7, $FF, $B2, $AC, $AE, $FA, $F6, $B2, $BC, $FF, $AB, $AA, $AC, $B4, $FF, $C0, $B2, $BD, $B1, $F6, $B6, $C2, $FF, $AB, $BB, $AA, $B7, $AD, $FF, $B7, $AE, $C0, $F6, $B2, $B7, $BF, $AE, $B7, $BD, $B2, $B8, $B7, $FB
;--------------------------------------------------------------------------------
;org $1CB068 ; <- E3068 - E3098 ; telepathic tile: Turtle Rock entrance - 0x31
db $FE, $6B, $02, $C2, $B8, $BE, $FF, $BC, $B1, $AA, $B5, $B5, $FF, $B7, $B8, $BD, $FF, $F8, $B9, $AA, $BC, $BC, $CC, $FF, $C0, $B2, $BD, $B1, $B8, $BE, $BD, $FF, $F9, $BD, $B1, $AE, $FF, $BB, $AE, $AD, $FF, $AC, $AA, $B7, $AE, $FB
;--------------------------------------------------------------------------------
org $1CB099 ; <- E3099 - E30C1 ; telepathic tile: Ice Palace entrance - 0x24
db $FE, $6B, $02, $C2, $B8, $BE, $FF, $AC, $AA, $B7, $FF, $BE, $BC, $AE, $FF, $FF, $F8, $AF, $B2, $BB, $AE, $FF, $BB, $B8, $AD, $FF, $B8, $BB, $F9, $AB, $B8, $B6, $AB, $B8, $BC, $FF, $BD, $B8, $FF, $B9, $AA, $BC, $BC, $FB
;--------------------------------------------------------------------------------
;org $1CB0C2 ; <- E30C2 - E30F3 ; telepathic tile: Ice Palace Stalfos Knights room - 0x32
db $FE, $6B, $02, $B4, $B7, $B8, $AC, $B4, $FF, $AE, $B6, $FF, $AD, $B8, $C0, $B7, $FF, $F8, $AA, $B7, $AD, $FF, $BD, $B1, $AE, $B7, $FF, $AB, $B8, $B6, $AB, $F9, $BD, $B1, $AE, $B6, $FF, $AD, $AE, $AA, $AD, $FF, $FF, $FF, $FF, $FF, $FB
;--------------------------------------------------------------------------------
org $1CB176 ; <- E3176 ; catch a bee
db $AC, $AA, $BE, $B0, $B1, $BD, $FF, $AA, $FF, $AB, $AE, $AE, $FF, $FF, $F8, $FF, $FF, $E4, $FF, $FF, $B4, $AE, $AE, $B9, $FF, $FF, $FF, $FF, $FF, $F9, $FF, $FF, $FF, $FF, $FF, $BB, $AE, $B5, $AE, $AA, $BC, $AE, $FE, $68
;--------------------------------------------------------------------------------
org $1CB1A3 ; <- E31A3 ; catch a fairy
db $AC, $AA, $BE, $B0, $B1, $BD, $FF, $AF, $AA, $B2, $BB, $C2, $C7, $FF, $FF, $FF, $E4, $FF, $B4, $AE, $AE, $B9, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $BB, $AE, $B5, $AE, $AA, $BC, $AE, $FE, $68
;--------------------------------------------------------------------------------
org $1CB1CD ; <- E31CD ; no empty bottles
db $C0, $B1, $B8, $AA, $FF, $AB, $BE, $AC, $B4, $B8, $C8, $F8, $B7, $B8, $FF, $AE, $B6, $B9, $BD, $C2, $FF, $FF, $F9, $AB, $B8, $BD, $BD, $B5, $AE, $BC, $CD
;--------------------------------------------------------------------------------
org $1CB1ED ; <- E31ED ; race game boy
db $C2, $B8, $BE, $BB, $FF, $BD, $B2, $B6, $AE, $F8, $C0, $AA, $BC, $F9, $FE, $6C, $03, $FE, $6C, $02, $FF, $B6, $B2, $B7, $FF, $FE, $6C, $01, $FE, $6C, $00, $FF, $BC, $AE, $AC, $CD
;--------------------------------------------------------------------------------
org $1CB212 ; <- E3212 ; race game girl
db $C2, $B8, $BE, $FF, $B1, $AA, $BF, $AE, $FF, $A1, $A5, $FF, $FF, $FF, $F8, $BC, $AE, $AC, $B8, $B7, $AD, $BC, $C8, $FF, $FF, $FF, $FF, $FF, $FF, $F9, $B0, $B8, $CC, $FF, $B0, $B8, $CC, $FF, $B0, $B8, $CC, $FF, $FF
;--------------------------------------------------------------------------------
org $1CB23E ; <- E323E ; race game boy success
db $B7, $B2, $AC, $AE, $C7, $FF, $FF, $FF, $FF, $F8, $C2, $B8, $BE, $FF, $AC, $AA, $B7, $FF, $B1, $AA, $BF, $AE, $F9, $BD, $B1, $B2, $BC, $FF, $BD, $BB, $AA, $BC, $B1, $C7, $FB
;--------------------------------------------------------------------------------
org $1CB261 ; <- E3261 ; race game boy fail
db $BD, $B8, $B8, $FF, $BC, $B5, $B8, $C0, $C7, $FF, $F8, $B2, $FF, $B4, $AE, $AE, $B9, $FF, $B6, $C2, $F9, $B9, $BB, $AE, $AC, $B2, $B8, $BE, $BC, $C7, $FB
;--------------------------------------------------------------------------------
org $1CB280 ; <- E3280 - E3299 ; race game already collected - 0x1A (E32A2 - 0x23)
db $C2, $B8, $BE, $FF, $AA, $B5, $BB, $AE, $AA, $AD, $C2, $F8, $B1, $AA, $BF, $AE, $FF, $C2, $B8, $BE, $BB, $F9, $B9, $BB, $B2, $C3, $AE, $FF, $AD, $B2, $B7, $B0, $BE, $BC, $FB
;--------------------------------------------------------------------------------
org $1CBE1D ; <- E3E1D - E3E4B ; sick kid no bottle - 0x2F
db $FE, $6D, $01, $B2, $D8, $B6, $FF, $BC, $B2, $AC, $B4, $C7, $FF, $BC, $B1, $B8, $C0, $F8, $B6, $AE, $FF, $AA, $FF, $AB, $B8, $BD, $BD, $B5, $AE, $C8, $FF, $F9, $B0, $AE, $BD, $FF, $BC, $B8, $B6, $AE, $BD, $B1, $B2, $B7, $B0, $C7, $FB
;--------------------------------------------------------------------------------
;org $1CBE4C ; <- E3E4C - E3ED3 ; sick kid get item - 0x88
; free space
;--------------------------------------------------------------------------------
org $1CBEC8 ; <- E3ED4 - E3EF3 ; sick kid after bottle - 0x20 (0x2B)
db $FB ; close free space
db $B5, $AE, $AA, $BF, $AE, $FF, $B6, $AE, $FF, $AA, $B5, $B8, $B7, $AE, $F8, $B2, $D8, $B6, $FF, $BC, $B2, $AC, $B4, $CD, $FF, $C2, $B8, $BE, $F9, $B1, $AA, $BF, $AE, $FF, $B6, $C2, $FF, $B2, $BD, $AE, $B6, $CD, $FB
;--------------------------------------------------------------------------------
org $1CC2AA : db $FF ; <- E42AA ; overwrite end boxes for intro
org $1CC2EA : db $FF ; <- E42EA ; overwrite end boxes for intro
org $1CC32B : db $FF ; <- E432B ; overwrite end boxes for intro
org $1CC369 : db $FF ; <- E4369 ; overwrite end boxes for intro
org $1CC0DD ; <- E40DD - E438C ; Intro sequence - 0x2B0
; Main intro
db $FE, $6E, $00, $FE, $77, $07, $FC, $03, $FE, $6B, $02, $FE, $67, $FF, $AE, $B9, $B2, $BC, $B8, $AD, $AE, $FF, $FF, $B2, $B2, $B2, $FF, $FE, $78, $03, $F8, $FF, $AA, $FF, $B5, $B2, $B7, $B4, $FF, $BD, $B8, $FF, $FF, $FF, $FF, $F9, $FF, $FF, $FF, $BD, $B1, $AE, $FF, $B9, $AA, $BC, $BD, $FF, $FF, $FF, $FE, $78, $03, $F6, $F9, $FF, $FF, $BB, $AA, $B7, $AD, $B8, $B6, $B2, $C3, $AE, $BB, $FE, $78, $03, $F6, $F9, $AA, $AF, $BD, $AE, $BB, $FF, $B6, $B8, $BC, $BD, $B5, $C2, $F6, $F9, $AD, $B2, $BC, $BB, $AE, $B0, $AA, $BB, $AD, $B2, $B7, $B0, $F6, $F9, $C0, $B1, $AA, $BD, $FF, $B1, $AA, $B9, $B9, $AE, $B7, $AE, $AD, $F6, $F9, $B2, $B7, $FF, $BD, $B1, $AE, $FF, $AF, $B2, $BB, $BC, $BD, $F6, $F9, $BD, $C0, $B8, $FF, $B0, $AA, $B6, $AE, $BC, $CD, $FE, $78, $03, $F6, $F9, $B5, $B2, $B7, $B4, $FF, $AA, $C0, $AA, $B4, $AE, $B7, $BC, $F6, $F9, $BD, $B8, $FF, $B1, $B2, $BC, $FF, $BE, $B7, $AC, $B5, $AE, $F6, $F9, $B5, $AE, $AA, $BF, $B2, $B7, $B0, $FF, $BD, $B1, $AE, $F6, $F9, $B1, $B8, $BE, $BC, $AE, $C8, $FE, $78, $03, $F6, $F9, $B1, $AE, $FF, $B3, $BE, $BC, $BD, $FF, $BB, $BE, $B7, $BC, $F6, $F9, $B8, $BE, $BD, $FF, $BD, $B1, $AE, $FF, $AD, $B8, $B8, $BB, $FE, $78, $03, $F6, $F9, $B2, $B7, $BD, $B8, $FF, $BD, $B1, $AE, $FF, $BB, $AA, $B2, $B7, $C2, $F6, $F9, $B7, $B2, $B0, $B1, $BD, $CD, $FE, $78, $03, $FE, $67, $FE, $67, $F6, $F9, $B0, $AA, $B7, $B8, $B7, $FF, $B1, $AA, $BC, $F6, $F9, $B6, $B8, $BF, $AE, $AD, $FF, $AA, $B5, $B5, $FF, $BD, $B1, $AE, $F6, $F9, $B2, $BD, $AE, $B6, $BC, $FF, $AA, $BB, $B8, $BE, $B7, $AD, $F6, $F9, $B1, $C2, $BB, $BE, $B5, $AE, $CD, $FE, $78, $07, $F6, $F9, $C2, $B8, $BE, $FF, $C0, $B2, $B5, $B5, $FF, $B1, $AA, $BF, $AE, $F6, $F9, $BD, $B8, $FF, $AF, $B2, $B7, $AD, $FF, $AA, $B5, $B5, $F6, $F9, $BD, $B1, $AE, $FF, $B2, $BD, $AE, $B6, $BC, $F6, $F9, $B7, $AE, $AC, $AE, $BC, $BC, $AA, $BB, $C2, $FF, $BD, $B8, $F6, $F9, $AB, $AE, $AA, $BD, $FF, $B0, $AA, $B7, $B8, $B7, $CD, $FE, $78, $07, $F6, $F9, $BD, $B1, $B2, $BC, $FF, $B2, $BC, $FF, $C2, $B8, $BE, $BB, $F6, $F9, $AC, $B1, $AA, $B7, $AC, $AE, $FF, $BD, $B8, $FF, $AB, $AE, $FF, $AA, $F6, $F9, $B1, $AE, $BB, $B8, $FE, $78, $03, $FE, $67, $FE, $67, $F6, $F9, $C2, $B8, $BE, $FF, $B6, $BE, $BC, $BD, $FF, $B0, $AE, $BD, $F6, $F9, $BD, $B1, $AE, $FF, $A7, $FF, $AC, $BB, $C2, $BC, $BD, $AA, $B5, $BC, $F6, $F9, $BD, $B8, $FF, $AB, $AE, $AA, $BD, $FF, $B0, $AA, $B7, $B8, $B7, $CD, $FE, $78, $09, $FE, $67, $FE, $67, $FB
; Skeleton King
db $FE, $6B, $02, $FE, $77, $07, $FC, $03, $F7, $B5, $B8, $B8, $B4, $FF, $AA, $BD, $FF, $BD, $B1, $B2, $BC, $FF, $FF, $F8, $BC, $BD, $AA, $B5, $AF, $B8, $BC, $FF, $B8, $B7, $FF, $BD, $B1, $AE, $F9, $BD, $B1, $BB, $B8, $B7, $AE, $CD, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FB
; Zelda's cell
db $FE, $6B, $02, $FE, $77, $07, $FC, $03, $F7, $B2, $BD, $FF, $B2, $BC, $FF, $C2, $B8, $BE, $BB, $FF, $FF, $FF, $FF, $F8, $BD, $B2, $B6, $AE, $FF, $BD, $B8, $FF, $BC, $B1, $B2, $B7, $AE, $C7, $FB
; Agahnim magic'ing
db $FE, $6B, $02, $FE, $77, $07, $FC, $03, $F7, $AA, $B5, $BC, $B8, $FF, $C2, $B8, $BE, $FF, $B7, $AE, $AE, $AD, $FF, $F8, $BD, $B8, $FF, $AD, $AE, $AF, $AE, $AA, $BD, $FF, $BD, $B1, $B2, $BC, $F9, $B0, $BE, $C2, $C7, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FB
;--------------------------------------------------------------------------------
org $1CC820 ; <- E4820 - E484A ; Lumberjack left - 0x2B
db $B8, $B7, $AE, $FF, $B8, $AF, $FF, $BE, $BC, $FF, $FF, $FF, $FF, $F8, $AA, $B5, $C0, $AA, $C2, $BC, $FF, $B5, $B2, $AE, $BC, $CD, $FF, $FF, $F9, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FB
;--------------------------------------------------------------------------------
org $1CC84B ; <- E484B - E4874 ; Lumberjack right - 0x2A
db $B8, $B7, $AE, $FF, $B8, $AF, $FF, $BE, $BC, $FF, $FF, $FF, $FF, $F8, $AA, $B5, $C0, $AA, $C2, $BC, $FF, $BD, $AE, $B5, $B5, $BC, $F9, $BD, $B1, $AE, $FF, $BD, $BB, $BE, $BD, $B1, $CD, $FF, $FF, $FF, $FF, $FB
;--------------------------------------------------------------------------------
org $1CE792 ; <- E6792 - E67B8 ; treasure chest game not played yet - 0x27
db $C2, $B8, $BE, $FF, $C0, $AA, $B7, $BD, $FF, $BD, $B8, $FF, $FF, $F8, $B9, $B5, $AA, $C2, $FF, $B0, $AA, $B6, $AE, $C6, $F9, $BD, $AA, $B5, $B4, $FF, $BD, $B8, $FF, $B6, $AE, $CD, $FF, $FF, $FB
;--------------------------------------------------------------------------------
org $1CE7B9 ; <- E67B9 - E67DD ; treasure chest game played - 0x25
db $C2, $B8, $BE, $D8, $BF, $AE, $FF, $B8, $B9, $AE, $B7, $AE, $AD, $F8, $BD, $B1, $AE, $FF, $AC, $B1, $AE, $BC, $BD, $BC, $CD, $F9, $BD, $B2, $B6, $AE, $FF, $BD, $B8, $FF, $B0, $B8, $FB
;--------------------------------------------------------------------------------
org $1CE91B ; <- E691B ; no empty bottles
db $AE, $B6, $B9, $BD, $C2, $FF, $AB, $B8, $BD, $BD, $B5, $AE, $BC, $FF, $F8, $AA, $BB, $AE, $FF, $C0, $B1, $AA, $BD, $FF, $C2, $B8, $BE, $FF, $FF, $F9, $BB, $AE, $AA, $B5, $B5, $C2, $FF, $B7, $AE, $AE, $AD, $C7, $FF, $FF, $FB
;--------------------------------------------------------------------------------
org $1CEF09 ; <- E6F09 - E6F24 ; powdered pickle - 0x1C
db $B2, $D8, $B6, $FF, $AA, $FF, $B5, $B8, $B7, $AE, $B5, $C2, $F8, $AD, $AA, $B7, $AC, $B2, $B7, $B0, $FF, $B9, $B2, $AC, $B4, $B5, $AE, $FB
;--------------------------------------------------------------------------------
org $1CEF45 ; <- E6F45 - E6F61 ; potion shop no cash - 0x1D (0x24)
db $C2, $B8, $C7, $FF, $B2, $D8, $B6, $FF, $B7, $B8, $BD, $F8, $BB, $BE, $B7, $B7, $B2, $B7, $B0, $FF, $AA, $F9, $AC, $B1, $AA, $BB, $B2, $BD, $C2, $FF, $B1, $AE, $BB, $AE, $CD, $FB
;--------------------------------------------------------------------------------
org $1CEFEA ; <- E6FEA - E7039 ; LW chest game south of Kakriko do you want to play? - 0x4F
db $B9, $AA, $C2, $FF, $A2, $A0, $FF, $BB, $BE, $B9, $AE, $AE, $BC, $F8, $B8, $B9, $AE, $B7, $FF, $A1, $FF, $AC, $B1, $AE, $BC, $BD, $F9, $AA, $BB, $AE, $FF, $C2, $B8, $BE, $FF, $B5, $BE, $AC, $B4, $C2, $C6, $FA, $F6, $BC, $B8, $C8, $FF, $B9, $B5, $AA, $C2, $FF, $B0, $AA, $B6, $AE, $C6, $F6, $FF, $FF, $E4, $FF, $B9, $B5, $AA, $C2, $F6, $FF, $FF, $FF, $FF, $B7, $AE, $BF, $AE, $BB, $C7, $FE, $68, $FB
;--------------------------------------------------------------------------------
;org $1CF03A ; <- E703A - E704B ; LW chest game yes play - 0x12
db $B0, $B8, $B8, $AD, $FF, $B5, $BE, $AC, $B4, $FF, $BD, $B1, $AE, $B7, $F8, $FF, $FF, $FB
;--------------------------------------------------------------------------------
;org $1CF04C ; <- E704C - E7071 ; LW chest game no play - 0x26
db $C0, $AE, $B5, $B5, $FF, $AF, $B2, $B7, $AE, $C8, $FF, $B2, $F8, $AD, $B2, $AD, $B7, $D8, $BD, $FF, $C0, $AA, $B7, $BD, $F9, $C2, $B8, $BE, $BB, $FF, $BB, $BE, $B9, $AE, $AE, $BC, $CD, $FB
;--------------------------------------------------------------------------------
org $1CF072; <- E7072 - E7039 ; LW chest game south of Kakriko do you want to play? - 0x50
db $B9, $AA, $C2, $FF, $A1, $A0, $A0, $FF, $BB, $BE, $B9, $AE, $AE, $BC, $F8, $B8, $B9, $AE, $B7, $FF, $A1, $FF, $AC, $B1, $AE, $BC, $BD, $F9, $AA, $BB, $AE, $FF, $C2, $B8, $BE, $FF, $B5, $BE, $AC, $B4, $C2, $C6, $FA, $F6, $BC, $B8, $C8, $FF, $B9, $B5, $AA, $C2, $FF, $B0, $AA, $B6, $AE, $C6, $F6, $FF, $FF, $E4, $FF, $B9, $B5, $AA, $C2, $F6, $FF, $FF, $FF, $FF, $B7, $AE, $BF, $AE, $BB, $C7, $FE, $68, $FB
;--------------------------------------------------------------------------------
org $1CF1E4 ; <- E71E4 ; translate house/sanc spawn menu
db $FE, $6D, $00, $FC, $00, $E4, $FE, $6A, $D8, $BC, $FF, $B1, $B8, $BE, $BC, $AE, $FF, $FF, $F8, $FF, $BC, $AA, $B7, $AC, $BD, $BE, $AA, $BB, $C2, $FE, $72, $FB
;--------------------------------------------------------------------------------
org $1CF204 ; <- E7204 ; translate house/sanc/mountain spawn menu
db $FE, $6D, $00, $FC, $00, $E4, $FE, $6A, $D8, $BC, $FF, $B1, $B8, $BE, $BC, $AE, $F8, $FF, $BC, $AA, $B7, $AC, $BD, $BE, $AA, $BB, $C2, $F9, $FF, $B6, $B8, $BE, $B7, $BD, $AA, $B2, $B7, $FF, $AC, $AA, $BF, $AE, $FE, $71, $FB
;--------------------------------------------------------------------------------
org $1CF2C8 ; <- E72C8 ; digging game no cash
db $C2, $B8, $BE, $FF, $C0, $AA, $B7, $BD, $FF, $BD, $B8, $F8, $AD, $B2, $B0, $C6, $FF, $B2, $FF, $C0, $AA, $B7, $BD, $F9, $A8, $A0, $FF, $BB, $BE, $B9, $AE, $AE, $BC, $CD, $FF, $FB
;--------------------------------------------------------------------------------
org $1CF231 ; <- E7231 - Save and quit
db $FC, $00, $E4, $AC, $B8, $B7, $BD, $B2, $B7, $BE, $AE, $F8, $FF, $BC, $AA, $BF, $AE, $FF, $AA, $B7, $AD, $FF, $BA, $BE, $B2, $BD, $FE, $72, $FB
;--------------------------------------------------------------------------------
org $1CF325 ; <- E7325 ; digging game, no follower
db $BC, $B8, $B6, $AE, $BD, $B1, $B2, $B7, $B0, $FF, $B2, $BC, $FF, $F8, $AF, $B8, $B5, $B5, $B8, $C0, $B2, $B7, $B0, $FF, $C2, $B8, $BE, $F9, $B2, $FF, $AD, $B8, $B7, $D8, $BD, $FF, $B5, $B2, $B4, $AE, $CD, $F9, $F9, $F9, $F9, $F9, $F9, $F9
;--------------------------------------------------------------------------------

9
treekid.asm Normal file
View File

@@ -0,0 +1,9 @@
;================================================================================
; Tree Kid Fix
;--------------------------------------------------------------------------------
org $06B12B ; <- 3312B - tree status set - 418 - LDA $7EF3C9 : ORA.b #$08 : STA $7EF3C9
LDA $7EF3C9 : AND.b #$F7 : STA $7EF3C9 ; unset arboration instead of setting it
;--------------------------------------------------------------------------------
org $06B072 ; <- 33072 - FluteAardvark_InitialStateFromFluteState - 418 : dw FluteAardvark_AlreadyArborated
db #$8B
;================================================================================

463
utilities.asm Normal file
View File

@@ -0,0 +1,463 @@
;================================================================================
; Utility Functions
;================================================================================
!PROGRESSIVE_SHIELD = "$7EF416" ; ss-- ----
;--------------------------------------------------------------------------------
; GetSpriteTile
; in: A - Loot ID
; out: A - Sprite GFX ID
;--------------------------------------------------------------------------------
GetSpriteID:
PHX
PHB : PHK : PLB
;--------
TAX : LDA .gfxSlots, X ; look up item gfx
PLB : PLX
CMP.b #$FA : !BGE .specialHandling
RTL
.specialHandling
CMP.b #$FA : BNE ++ ; RNG Item (Single)
JSL.l GetRNGItemSingle : JMP GetSpriteID
++ CMP.b #$FB : BNE ++ ; RNG Item (Multi)
JSL.l GetRNGItemMulti : JMP GetSpriteID
++ CMP.b #$FE : BNE ++ ; Progressive Sword
LDA $7EF359 : BNE + ; No Sword
LDA.b #$43 : RTL
+ : CMP.b #$01 : BNE + ; Fighter Sword
LDA.b #$44 : RTL
+ : CMP.b #$02 : BNE + ; Master Sword
LDA.b #$45 : RTL
+ ; Everything Else
LDA.b #$46 : RTL
++ : CMP.b #$FF : BNE ++ ; Progressive Shield
LDA !PROGRESSIVE_SHIELD : AND #$C0 : BNE + ; No Shield
LDA.b #$2D : RTL
+ : CMP.b #$40 : BNE + ; Fighter Shield
LDA.b #$20 : RTL
+ ; Everything Else
LDA.b #$2E : RTL
++
RTL
;DATA - Loot Identifier to Sprite ID
{
.gfxSlots
db $06, $44, $45, $46, $2D, $20, $2E, $09
db $09, $0A, $08, $05, $10, $0B, $2C, $1B
db $1A, $1C, $14, $19, $0C, $07, $1D, $2F
db $07, $15, $12, $0D, $0D, $0E, $11, $17
db $28, $27, $04, $04, $0F, $16, $03, $13
db $01, $1E, $10, $00, $00, $00, $00, $00
db $00, $30, $22, $21, $24, $24, $24, $23
db $23, $23, $29, $2A, $2C, $2B, $03, $03
db $34, $35, $31, $33, $02, $32, $36, $37
db $2C, $43, $0C, $38, $39, $3A, $3B, $3C
; db $2C, $06, $0C, $38, $FF, $FF, $FF, $FF
;5x
db $44 ; Safe Master Sword
db $3D, $3E, $3F, $40 ; Bomb & Arrow +5/+10
db $00, $00, $00 ; 3x Programmable Item
db $41 ; Upgrade-Only Silver Arrows
db $24 ; 1 Rupoor
db $47 ; Null Item
db $48, $48, $48 ; Red, Blue & Green Clocks
db $FE, $FF ; Progressive Sword & Shield
;6x
db $04, $0D ; Progressive Armor & Gloves
db $FA, $FB ; RNG Single & Multi
db $FF, $FF, $FF, $FF, $FF, $FF ; Unused
db $49, $4A, $49 ; Goal Item Single, Multi & Alt Multi
db $FF, $FF, $FF ; Unused
;7x
db $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21 ; Free Map
;7x
db $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16 ; Free Compass
;7x
db $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22 ; Free Big Key
;7x
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F ; Free Small Key
}
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; GetSpritePalette
; in: A - Loot ID
; out: A - Palette
;--------------------------------------------------------------------------------
GetSpritePalette:
PHX
PHB : PHK : PLB
;--------
TAX : LDA .gfxPalettes, X ; look up item gfx
PLB : PLX
CMP.b #$FA : !BGE .specialHandling
RTL
.specialHandling
CMP.b #$FD : BNE ++ ; Progressive Sword
LDA $7EF359 : BNE + ; No Sword
LDA.b #$04 : RTL
+ : CMP.b #$01 : BNE + ; Fighter Sword
LDA.b #$04 : RTL
+ : CMP.b #$02 : BNE + ; Master Sword
LDA.b #$02 : RTL
+ ; Everything Else
LDA.b #$08 : RTL
++ : CMP.b #$FE : BNE ++ ; Progressive Shield
LDA $7EF35A : BNE + ; No Shield
LDA.b #$04 : RTL
+ : CMP.b #$01 : BNE + ; Fighter Shield
LDA.b #$02 : RTL
+ ; Everything Else
LDA.b #$08 : RTL
++ : CMP.b #$FF : BNE ++ ; Progressive Armor
LDA $7EF35B : BNE + ; Green Tunic
LDA.b #$04 : RTL
+ ; Everything Else
LDA.b #$02 : RTL
++ : CMP.b #$FC : BNE ++ ; Progressive Gloves
LDA $7EF354 : BNE + ; No Gloves
LDA.b #$02 : RTL
+ ; Everything Else
LDA.b #$08 : RTL
++ : CMP.b #$FA : BNE ++ ; RNG Item (Single)
JSL.l GetRNGItemSingle : JMP GetSpritePalette
++ : CMP.b #$FB : BNE ++ ; RNG Item (Multi)
JSL.l GetRNGItemMulti : JMP GetSpritePalette
++
RTL
;DATA - Loot Identifier to Sprite Palette
{
.gfxPalettes
db $00, $04, $02, $08, $04, $02, $08, $02
db $04, $02, $02, $02, $04, $04, $04, $08
db $08, $08, $02, $02, $04, $02, $02, $02
db $04, $02, $04, $02, $08, $08, $04, $02
db $0A, $02, $04, $02, $04, $04, $00, $04
db $04, $08, $02, $02, $08, $04, $02, $08
db $04, $04, $08, $08, $08, $04, $02, $08
db $02, $04, $08, $02, $04, $04, $02, $02
db $08, $08, $02, $04, $04, $08, $08, $08
db $04, $04, $04, $02, $08, $08, $08, $08
; db $04, $0A, $04, $02, $FF, $FF, $FF, $FF
db $04 ; Safe Master Sword
db $08, $08, $08, $08 ; Bomb & Arrow +5/+10
db $00, $00, $00 ; Programmable Items 1-2
db $02 ; Upgrade-Only Silver Arrows
db $06 ; 1 Rupoor
db $02 ; Null Item
db $02, $04, $08 ; Red, Blue & Green Clocks
db $FD, $FE, $FF, $FC ; Progressive Sword, Shield, Armor & Gloves
db $FA, $FB ; RNG Single & Multi
db $00, $00, $00, $00, $00, $00 ; Unused
db $08, $08, $08 ; Goal Item Single, Multi & Alt Multi
db $00, $00, $00 ; Unused
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Map
db $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04 ; Free Compass
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Big Key
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Small Key
}
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; IsNarrowSprite
; in: A - Loot ID
; out: Carry - 0 = Full, 1 = Narrow
;--------------------------------------------------------------------------------
IsNarrowSprite:
PHA : PHX
PHB : PHK : PLB
;--------
CMP.b #$5F : BNE ++ ; Special Handler for Progressive Shield
LDA $7EF35A : BNE + : SEC : BRA .done : +; No Shield
BRA .false ; Everything Else
++ CMP.b #$62 : BNE ++ ; RNG Item (Single)
JSL.l GetRNGItemSingle : BRA .continue
++ CMP.b #$63 : BNE ++ ; RNG Item (Multi)
JSL.l GetRNGItemMulti
++
.continue
;--------
LDX.b #$00 ; set index counter to 0
;----
-
CPX.b #$24 : !BGE .false ; finish if we've done the whole list
CMP .smallSprites, X : BNE + ; skip to next if we don't match
;--
SEC ; set true state
BRA .done ; we're done
;--
+
INX ; increment index
BRA - ; go back to beginning of loop
;----
.false
CLC
.done
PLB : PLX : PLA
RTL
;DATA - Half-Size Sprite Markers
{
.smallSprites
db $04, $07, $08, $09, $0A, $0B, $0C, $13
db $15, $18, $24, $2A, $31, $34, $35, $36
db $42, $43, $45, $59, $A0, $A1, $A2, $A3
db $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB
db $AC, $AD, $AE, $AF, $FF, $FF, $FF, $FF
}
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; PrepDynamicTile
; in: A - Loot ID
;-------------------------------------------------------------------------------- 20/8477
PrepDynamicTile:
PHA : PHX : PHY
JSR.w LoadDynamicTileOAMTable
JSL.l GetSpriteID ; convert loot id to sprite id
JSL.l GetAnimatedSpriteTile_variable
PLY : PLX : PLA
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; LoadDynamicTileOAMTable
; in: A - Loot ID
;-------------------------------------------------------------------------------- 20/847B
!SPRITE_OAM = "$7EC025"
;--------------------------------------------------------------------------------
LoadDynamicTileOAMTable:
PHA : PHP
PHA
REP #$20 ; set 16-bit accumulator
LDA.w #$0000 : STA.l !SPRITE_OAM
STA.l !SPRITE_OAM+2
LDA.w #$0200 : STA.l !SPRITE_OAM+6
SEP #$20 ; set 8-bit accumulator
LDA.b #$24 : STA.l !SPRITE_OAM+4
LDA $01,s
JSL.l GetSpritePalette
STA !SPRITE_OAM+5 : STA !SPRITE_OAM+13
PLA
JSL.l IsNarrowSprite : BCS .narrow
BRA .done
.narrow
REP #$20 ; set 16-bit accumulator
LDA.w #$0000 : STA.l !SPRITE_OAM+7
STA.l !SPRITE_OAM+14
LDA.w #$0800 : STA.l !SPRITE_OAM+9
LDA.w #$3400 : STA.l !SPRITE_OAM+11
.done
PLP : PLA
RTS
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; DrawDynamicTile
; in: A - Loot ID
; out: A - OAM Slots Taken
;--------------------------------------------------------------------------------
; This wastes two OAM slots if you don't want a shadow - fix later
;-------------------------------------------------------------------------------- 2084B8
!SPRITE_OAM = "$7EC025"
!SKIP_EOR = "$7F5008"
;--------------------------------------------------------------------------------
DrawDynamicTile:
JSL.l IsNarrowSprite : BCS .narrow
.full
LDA.b #$01 : STA $06
LDA #$0C : JSL.l OAM_AllocateFromRegionC
LDA #$02 : PHA
BRA .draw
.narrow
LDA.b #$02 : STA $06
LDA #$10 : JSL.l OAM_AllocateFromRegionC
LDA #$03 : PHA
.draw
LDA.b #!SPRITE_OAM>>0 : STA $08
LDA.b #!SPRITE_OAM>>8 : STA $09
STZ $07
LDA #$7E : PHB : PHA : PLB
LDA.b #$01 : STA.l !SKIP_EOR
JSL Sprite_DrawMultiple_quantity_preset
PLB
LDA $90 : !ADD.b #$08 : STA $90 ; leave the pointer in the right spot to draw the shadow, if desired
LDA $92 : INC #2 : STA $92
PLA
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Sprite_IsOnscreen
; in: X - Sprite Slot
; out: Carry - 1 = On Screen, 0 = Off Screen
;--------------------------------------------------------------------------------
Sprite_IsOnscreen:
JSR _Sprite_IsOnscreen_DoWork
BCS +
REP #$20
LDA $E2 : PHA : !SUB.w #$0F : STA $E2
LDA $E8 : PHA : !SUB.w #$0F : STA $E8
SEP #$20
JSR _Sprite_IsOnscreen_DoWork
REP #$20
PLA : STA $E8
PLA : STA $E2
SEP #$20
+
RTL
_Sprite_IsOnscreen_DoWork:
LDA $0D10, X : CMP $E2
LDA $0D30, X : SBC $E3 : BNE .offscreen
LDA $0D00, X : CMP $E8
LDA $0D20, X : SBC $E9 : BNE .offscreen
SEC
RTS
.offscreen
CLC
RTS
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; Sprite_GetScreenRelativeCoords:
; out: $00.w Sprite Y
; out: $02.w Sprite X
; out: $06.b Sprite Y Relative
; out: $07.b Sprite X Relative
;--------------------------------------------------------------------------------
; Copied from bank $06
;--------------------------------------------------------------------------------
!spr_y_lo = $00
!spr_y_hi = $01
!spr_x_lo = $02
!spr_x_hi = $03
!spr_y_screen_rel = $06
!spr_x_screen_rel = $07
;--------------------------------------------------------------------------------
Sprite_GetScreenRelativeCoords:
STY $0B
STA $08
LDA $0D00, X : STA $00
!SUB $E8 : STA $06
LDA $0D20, X : STA $01
LDA $0D10, X : STA $02
!SUB $E2 : STA $07
LDA $0D30, X : STA $03
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; SkipDrawEOR - Shims in Bank05.asm : 2499
;--------------------------------------------------------------------------------
!SKIP_EOR = "$7F5008"
;--------------------------------------------------------------------------------
SkipDrawEOR:
LDA.l !SKIP_EOR : BEQ .normal
LDA.w #$0000 : STA.l !SKIP_EOR
LDA $04 : AND.w #$F0FF : STA $04
.normal
LDA ($08), Y : EOR $04 ; thing we wrote over
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; HexToDec
; in: A(w) - Word to Convert
; out: $7F5003 - $7F5007 (high - low)
;--------------------------------------------------------------------------------
HexToDec:
PHA
PHA
LDA.w #$9090
STA $7F5003 : STA $7F5005 : STA $7F5006 ; clear digit storage
PLA
-
CMP.w #10000 : !BLT +
PHA : SEP #$20 : LDA $7F5003 : INC : STA $7F5003 : REP #$20 : PLA
!SUB.w #10000 : BRA -
+ -
CMP.w #1000 : !BLT +
PHA : SEP #$20 : LDA $7F5004 : INC : STA $7F5004 : REP #$20 : PLA
!SUB.w #1000 : BRA -
+ -
CMP.w #100 : !BLT +
PHA : SEP #$20 : LDA $7F5005 : INC : STA $7F5005 : REP #$20 : PLA
!SUB.w #100 : BRA -
+ -
CMP.w #10 : !BLT +
PHA : SEP #$20 : LDA $7F5006 : INC : STA $7F5006 : REP #$20 : PLA
!SUB.w #10 : BRA -
+ -
CMP.w #1 : !BLT +
PHA : SEP #$20 : LDA $7F5007 : INC : STA $7F5007 : REP #$20 : PLA
!SUB.w #1 : BRA -
+
PLA
RTL
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------
; NameHash
; out:
; $00 - $07 - 64-bit Seed Hash
;--------------------------------------------------------------------------------
NameHash:
PHP
SEP #$30 ; set 8-bit accumulator & index registers
LDY #$00; ; for (j = 0; j < 8; ++j) {
-
CPY #$08 : !BGE +
LDA $00FFC0 : PHY : !ADD 1,s : STA 1,s : PLX : LDA.l NameHashTable, X ; h = T[(x[0] + j) % 256];
PHY
LDY #$01 ; for (i = 1; i < len; ++i) {
--
CPY #21 : !BGE ++ ; 21 decimal
TYX : EOR $00FFC0, X : TAX : LDA.l NameHashTable, X ; h = T[h ^ x[i]];
INY
BRA --
++ ; }
PLY : TYX
STA $00, X
INY
BRA -
+ ; }
PLP
RTL
;--------------------------------------------------------------------------------
;================================================================================

BIN
xkas Executable file

Binary file not shown.

8
zoraking.asm Normal file
View File

@@ -0,0 +1,8 @@
;================================================================================
; Randomize Zora King
;--------------------------------------------------------------------------------
LoadZoraKingItemGFX:
LDA.l $1DE1C3 ; location randomizer writes zora item to
JSL.l PrepDynamicTile
RTL
;--------------------------------------------------------------------------------