Disclaimer:
These files are provided copyright-free, credit-free, mention-free, and email-free.
Recognition is not requested.
You may freely merge it with your own work.

Special credit is given to
- David Mullen for his invaluable insights and knowledge
- Duke Serkol and Con for their guidance and support

==============================================================

Note: You should use the overworld map patch first before any of these ones.
      Do not use Roto's patch as it de-sync's and indirectly disables audio.

Note: This patch replaces and deprecates the old versions of
- ast_nofloor.ips
- ast_sound.ips
- ast_time.ips

1. Move the floor data from $4A-$4F PSRAM to stable $2A-$2F ROM
- Prevents distortion and garbage

2. Proper booting of audio data at the game start
- Keeps music data intact for force-shuffling later

3. Initialise ticks timer
- Not set by the game, causing the first minute to last about 17 minutes

4. Load outdoor music
- Restores "lost" code that prevents tracks from playing
  (well, the 65816 bytes look intentionally ripped out)


Known issues:
- Music is still problematic
- Has problems switching songs mid-overworld

- Each entrance has its own music attached to play upon returning to the overworld
  (List starts at $82:83CF where X=track #, very time consuming to fix by hand)

  The odd thing here is that the outdoor list is changed from LTTP at $02:83F0.

- Indoor music not available except when collecting a tablet
- Walls, floors, overlays not rendered
- Dungeon 7 has an unknown object east of the dungeon's large chest
- Not all interior objects displayed

===============================================================

Patch notes:

1. $80:E778 and $80:E928 are 2-byte pointers to a grid of 32x32 tile pointers to draw each room.
   $80:EAFD is the bank to a grid of 16x16 2-byte pointers to the final name data.

$80:EAD8 A5 A0       LDA $A0    [$00:00A0]   A:FFFF X:0000 Y:0000 D:0000 DB:80 S:01EC P:envmxdiZC HC:474 VC:169 00
$80:EADA 29 FF 00    AND #$00FF              A:0061 X:0000 Y:0000 D:0000 DB:80 S:01EC P:envmxdizC HC:502 VC:169 00
$80:EADD 85 00       STA $00    [$00:0000]   A:0061 X:0000 Y:0000 D:0000 DB:80 S:01EC P:envmxdizC HC:520 VC:169 00
$80:EADF 0A          ASL A                   A:0061 X:0000 Y:0000 D:0000 DB:80 S:01EC P:envmxdizC HC:548 VC:169 00
$80:EAE0 18          CLC                     A:00C2 X:0000 Y:0000 D:0000 DB:80 S:01EC P:envmxdizc HC:560 VC:169 00
$80:EAE1 65 00       ADC $00    [$00:0000]   A:00C2 X:0000 Y:0000 D:0000 DB:80 S:01EC P:envmxdizc HC:572 VC:169 00
$80:EAE3 A8          TAY                     A:0123 X:0000 Y:0000 D:0000 DB:80 S:01EC P:envmxdizc HC:600 VC:169 00
$80:EAE4 B9 78 E7    LDA $E778,y[$80:E89B]   A:0123 X:0000 Y:0123 D:0000 DB:80 S:01EC P:envmxdizc HC:612 VC:169 00
$80:EAE7 85 08       STA $08    [$00:0008]   A:8400 X:0000 Y:0123 D:0000 DB:80 S:01EC P:eNvmxdizc HC:642 VC:169 00
$80:EAE9 B9 7A E7    LDA $E77A,y[$80:E89D]   A:8400 X:0000 Y:0123 D:0000 DB:80 S:01EC P:eNvmxdizc HC:670 VC:169 00
$80:EAEC 85 0A       STA $0A    [$00:000A]   A:004E X:0000 Y:0123 D:0000 DB:80 S:01EC P:envmxdizc HC:700 VC:169 00
$80:EAEE B9 28 E9    LDA $E928,y[$80:EA4B]   A:004E X:0000 Y:0123 D:0000 DB:80 S:01EC P:envmxdizc HC:728 VC:169 00
$80:EAF1 85 0C       STA $0C    [$00:000C]   A:8600 X:0000 Y:0123 D:0000 DB:80 S:01EC P:eNvmxdizc HC:758 VC:169 00
$80:EAF3 B9 2A E9    LDA $E92A,y[$80:EA4D]   A:8600 X:0000 Y:0123 D:0000 DB:80 S:01EC P:eNvmxdizc HC:786 VC:169 00
$80:EAF6 85 0E       STA $0E    [$00:000E]   A:004E X:0000 Y:0123 D:0000 DB:80 S:01EC P:envmxdizc HC:816 VC:169 00
$80:EAF8 A9 00 80    LDA #$8000              A:004E X:0000 Y:0123 D:0000 DB:80 S:01EC P:envmxdizc HC:844 VC:169 00
$80:EAFB 85 7C       STA $7C    [$00:007C]   A:8000 X:0000 Y:0123 D:0000 DB:80 S:01EC P:eNvmxdizc HC:862 VC:169 00

; Move to bank $2A
$80:EAFD A9 4A 00    LDA #$004A              A:8000 X:0000 Y:0123 D:0000 DB:80 S:01EC P:eNvmxdizc HC:890 VC:169 00
$80:EB00 85 7E       STA $7E    [$00:007E]   A:004A X:0000 Y:0123 D:0000 DB:80 S:01EC P:envmxdizc HC:908 VC:169 00
$80:EB02 A9 00 80    LDA #$8000              A:004A X:0000 Y:0123 D:0000 DB:80 S:01EC P:envmxdizc HC:936 VC:169 00
$80:EB05 85 B7       STA $B7    [$00:00B7]   A:8000 X:0000 Y:0123 D:0000 DB:80 S:01EC P:eNvmxdizc HC:954 VC:169 00
$80:EB07 A9 8C 00    LDA #$008C              A:8000 X:0000 Y:0123 D:0000 DB:80 S:01EC P:eNvmxdizc HC:982 VC:169 00
$80:EB0A 85 B9       STA $B9    [$00:00B9]   A:008C X:0000 Y:0123 D:0000 DB:80 S:01EC P:envmxdizc HC:1000 VC:169 00
$80:EB0C 60          RTS                     A:008C X:0000 Y:0123 D:0000 DB:80 S:01EC P:envmxdizc HC:1028 VC:169 00

=============================================================================

2. $80:095F = outdoor, $80:0971 = indoor

; Normal code to load indoor audio data
$82:9C22 A9 FF       LDA #$FF                A:0200 X:0000 Y:0000 D:0000 DB:80 S:01F6 P:envMXdIzc HC:440 VC:006 00
$82:9C24 8D 40 21    STA $2140  [$80:2140]   A:02FF X:0000 Y:0000 D:0000 DB:80 S:01F6 P:eNvMXdIzc HC:452 VC:006 00
$82:9C27 22 71 89 80 JSL $808971[$80:8971]   A:02FF X:0000 Y:0000 D:0000 DB:80 S:01F6 P:eNvMXdIzc HC:476 VC:006 00

; During reset phase
$80:802D 22 56 8B 80 JSL $808B56[$80:8B56]   A:01FF X:0000 Y:0000 D:0000 DB:80 S:01FF P:eNvMXdIzC HC:530 VC:000 00
(change to $A08000)

; Manually load sound effects at $A0:8000
A9 00       LDA #$00
85 00       STA $00
A9 80       LDA #$80
85 01       STA $01
A9 99       LDA #$99
22 69 89 80 JSL $808969
A9 FF       LDA #$FF
8D 40 21    STA $2140
5C 56 8B 80 JMP $808B56

-----------------------------------------------------------------------------

; bug: should be #$FC
$80:895F A9 FD       LDA #$FD                A:08FF X:00FF Y:000F D:0000 DB:80 S:01F7 P:eNvMXdIzc HC:1254 VC:001 00
$80:8961 85 00       STA $00    [$00:0000]   A:08FD X:00FF Y:000F D:0000 DB:80 S:01F7 P:eNvMXdIzc HC:1266 VC:001 00
$80:8963 A9 9E       LDA #$9E                A:08FD X:00FF Y:000F D:0000 DB:80 S:01F7 P:eNvMXdIzc HC:1286 VC:001 00
$80:8965 85 01       STA $01    [$00:0001]   A:089E X:00FF Y:000F D:0000 DB:80 S:01F7 P:eNvMXdIzc HC:1298 VC:001 00
$80:8967 A9 9A       LDA #$9A                A:089E X:00FF Y:000F D:0000 DB:80 S:01F7 P:eNvMXdIzc HC:1318 VC:001 00
$80:8969 85 02       STA $02    [$00:0002]   A:089A X:00FF Y:000F D:0000 DB:80 S:01F7 P:eNvMXdIzc HC:1330 VC:001 00

=============================================================================

3. In the $A0:8000 code above, add
A9 1A       LDA #$1A
8F FA FF 7F STA $7FFFFA
A9 0E       LDA #$0E
8F FB FF 7F STA $7FFFFB

=============================================================================

4.

; Fresh new track data

$82:8432 A2 02       LDX #$02                A:2000 X:00F3 Y:005A D:0000 DB:80 S:01FA P:envMXdizc HC:1316 VC:017 00
$82:8434 AF C7 F3 7E LDA $7EF3C7[$7E:F3C7]   A:2000 X:0002 Y:005A D:0000 DB:80 S:01FA P:envMXdizc HC:1328 VC:017 00
$82:8438 C9 02       CMP #$02                A:2002 X:0002 Y:005A D:0000 DB:80 S:01FA P:envMXdizc HC:1360 VC:017 00
$82:843A B0 02       BCS $02    [$843E]      A:2002 X:0002 Y:005A D:0000 DB:80 S:01FA P:envMXdiZC HC:1372 VC:017 00
$82:843E AF CC F3 7E LDA $7EF3CC[$7E:F3CC]   A:2002 X:0002 Y:005A D:0000 DB:80 S:01FA P:envMXdiZC HC:022 VC:018 00
$82:8442 F0 1E       BEQ $1E    [$8462]      A:2000 X:0002 Y:005A D:0000 DB:80 S:01FA P:envMXdiZC HC:054 VC:018 00

($02:848B 8E 32 01    STX $0132  [$00:0132]   A:2400 X:0002 Y:005A D:0000 DB:00 S:01FA P:envMXdiZC HC:1008 VC:025 00)
$82:8462 22 14 84 8E JSL $8E8414[$8E:8414]   A:2000 X:0002 Y:005A D:0000 DB:80 S:01FA P:envMXdiZC HC:072 VC:018 00

Remap $82:8462 to "JSL $A080F8"

At $A0:80F8
8E 32 01    STX $0132
5C 14 84 8E JMP $8E8414

-----------------------------------------------------------------------------

; Update at next interval

$80:DC3E AD 32 01    LDA $0132  [$80:0132]   A:FF13 X:00FE Y:00FF D:0000 DB:80 S:01F6 P:eNvMXdizc HC:114 VC:222 00
$80:DC41 C9 FF       CMP #$FF                A:FF02 X:00FE Y:00FF D:0000 DB:80 S:01F6 P:envMXdizc HC:140 VC:222 00
$80:DC43 F0 00       BEQ $00    [$DC45]      A:FF02 X:00FE Y:00FF D:0000 DB:80 S:01F6 P:envMXdizc HC:152 VC:222 00

Replace with at 80:DC41
22 F0 80 A0 JSL $A080F0

At A0:80F0
C9 FF       CMP #$FF
F0 03       BEQ $03
8D 2C 01    STA $012C
6B          RTL

-----------------------------------------------------------------------------

; Switch tracks mid-overworld

$82:C110 AD 30 01    LDA $0130  [$80:0130]   A:FF08 X:0001 Y:0000 D:0000 DB:80 S:01FA P:envMXdiZC HC:818 VC:257 00
$82:C113 C9 F1       CMP #$F1                A:FFF1 X:0001 Y:0000 D:0000 DB:80 S:01FA P:eNvMXdizC HC:844 VC:257 00
$82:C115 D0 00       BNE $00    [$C117]      A:FFF1 X:0001 Y:0000 D:0000 DB:80 S:01FA P:envMXdiZC HC:856 VC:257 00

Replace with at 82:C113
22 E4 80 A0 JSL $A080E4

At A0:80E4
C9 F1       CMP #$F1
D0 07       BNE $07
AF C7 F3 7E LDA $7EF3C7 ; This is wrong
8D 2C 01    STA $012C
6B          RTL

-----------------------------------------------------------------------------

; Switch data off when entering interiors

$82:9C22 A9 FF       LDA #$FF                A:0000 X:0002 Y:000A D:0000 DB:80 S:01FA P:envMXdIzc HC:402 VC:068 00
$82:9C24 8D 40 21    STA $2140  [$80:2140]   A:00FF X:0002 Y:000A D:0000 DB:80 S:01FA P:eNvMXdIzc HC:414 VC:068 00
$82:9C27 22 71 89 80 JSL $808971[$80:8971]   A:00FF X:0002 Y:000A D:0000 DB:80 S:01FA P:eNvMXdIzc HC:438 VC:068 00

Replace with at $82:9C27
22 D0 80 A0 JSL $A080D0

At A0:80D0
9C 2C 01    STZ $012C
9C 32 01    STZ $0132
9C 33 01    STZ $0133
5C 71 89 80 JMP $808971
