Welcome to Data Crystal's new home! Data Crystal is now part of the TCRF family (sort of).
The wiki has recently moved; please report any issues in Discord. Pardon the dust.
The wiki has recently moved; please report any issues in Discord. Pardon the dust.
Dragon Warrior II (NES)/ROM map/ASM bank 0F: Difference between revisions
Jump to navigation
Jump to search
(→top) |
m (Hawk moved page Dragon Warrior II//ROM map/ASM bank 0F to Dragon Warrior II (NES)//ROM map/ASM bank 0F) |
(No difference)
|
Revision as of 21:10, 28 January 2024
This is a sub-page of Dragon Warrior II (NES)/ROM map.
- bank 0x0F of 16 starts at file address 0x03C010
; code bytes: $3C56 (94.27% of bytes in this ROM bank) ; data bytes: $035F (5.27% of bytes in this ROM bank) ; pcm bytes: $0000 (0.00% of bytes in this ROM bank) ; chr bytes: $0000 (0.00% of bytes in this ROM bank) ; free bytes: $0023 (0.21% of bytes in this ROM bank) ; unknown bytes: $002A (0.26% of bytes in this ROM bank) ; $003B bytes last seen in RAM bank $8000 - $BFFF (0.36% of bytes seen in this ROM bank, 0.36% of bytes in this ROM bank): ; $002E code bytes (77.97% of bytes seen in this RAM bank, 0.28% of bytes in this ROM bank) ; $000D data bytes (22.03% of bytes seen in this RAM bank, 0.08% of bytes in this ROM bank) ; $3F78 bytes last seen in RAM bank $C000 - $FFFF (99.64% of bytes seen in this ROM bank, 99.17% of bytes in this ROM bank): ; $3C28 code bytes (94.78% of bytes seen in this RAM bank, 93.99% of bytes in this ROM bank) ; $0352 data bytes (5.23% of bytes seen in this RAM bank, 5.19% of bytes in this ROM bank) ; PRG Bank 0x0F: the fixed bank, contains a little bit of everything ; [bank start] -> code ; NMI vector ; indirect control flow target (via $FFFA) 0x03C010|$0F:$C000:78 SEI 0x03C011|$0F:$C001:48 PHA 0x03C012|$0F:$C002:98 TYA 0x03C013|$0F:$C003:48 PHA 0x03C014|$0F:$C004:8A TXA 0x03C015|$0F:$C005:48 PHA 0x03C016|$0F:$C006:AD 07 60 LDA $6007 0x03C019|$0F:$C009:D0 0A BNE $C015 0x03C01B|$0F:$C00B:A5 93 LDA $93 ; NMI counter, decremented once per NMI until it reaches 0 0x03C01D|$0F:$C00D:F0 02 BEQ $C011 0x03C01F|$0F:$C00F:C6 93 DEC $93 ; NMI counter, decremented once per NMI until it reaches 0 ; control flow target (from $C00D) 0x03C021|$0F:$C011:A4 00 LDY $00 0x03C023|$0F:$C013:10 03 BPL $C018 ; control flow target (from $C009) 0x03C025|$0F:$C015:4C C3 C0 JMP $C0C3 ; control flow target (from $C013) 0x03C028|$0F:$C018:AD 45 61 LDA $6145 0x03C02B|$0F:$C01B:10 03 BPL $C020 0x03C02D|$0F:$C01D:4C 48 C1 JMP $C148 ; control flow target (from $C01B) 0x03C030|$0F:$C020:A4 00 LDY $00 0x03C032|$0F:$C022:F0 5C BEQ $C080 0x03C034|$0F:$C024:88 DEY 0x03C035|$0F:$C025:F0 59 BEQ $C080 0x03C037|$0F:$C027:88 DEY ; control flow target (from $C07C) 0x03C038|$0F:$C028:B9 38 C1 LDA $C138,Y 0x03C03B|$0F:$C02B:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C03E|$0F:$C02E:C8 INY 0x03C03F|$0F:$C02F:B9 38 C1 LDA $C138,Y 0x03C042|$0F:$C032:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C045|$0F:$C035:C8 INY 0x03C046|$0F:$C036:A9 5F LDA #$5F 0x03C048|$0F:$C038:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C04B|$0F:$C03B:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C04E|$0F:$C03E:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C051|$0F:$C041:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C054|$0F:$C044:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C057|$0F:$C047:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C05A|$0F:$C04A:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C05D|$0F:$C04D:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C060|$0F:$C050:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C063|$0F:$C053:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C066|$0F:$C056:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C069|$0F:$C059:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C06C|$0F:$C05C:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C06F|$0F:$C05F:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C072|$0F:$C062:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C075|$0F:$C065:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C078|$0F:$C068:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C07B|$0F:$C06B:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C07E|$0F:$C06E:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C081|$0F:$C071:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C084|$0F:$C074:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C087|$0F:$C077:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C08A|$0F:$C07A:C0 10 CPY #$10 0x03C08C|$0F:$C07C:D0 AA BNE $C028 0x03C08E|$0F:$C07E:F0 31 BEQ $C0B1 ; control flow target (from $C022, $C025) 0x03C090|$0F:$C080:AD 83 01 LDA $0183 0x03C093|$0F:$C083:F0 03 BEQ $C088 0x03C095|$0F:$C085:4C A0 C1 JMP $C1A0 ; control flow target (from $C083) 0x03C098|$0F:$C088:A5 02 LDA $02 0x03C09A|$0F:$C08A:C9 18 CMP #$18 0x03C09C|$0F:$C08C:B0 05 BCS $C093 0x03C09E|$0F:$C08E:A9 02 LDA #$02 0x03C0A0|$0F:$C090:8D 14 40 STA $4014 ; Sprite DMA Register (copy $100 bytes from $100 * N) ; control flow target (from $C08C) 0x03C0A3|$0F:$C093:A2 00 LDX #$00 ; control flow target (from $C0AE) 0x03C0A5|$0F:$C095:E4 02 CPX $02 0x03C0A7|$0F:$C097:F0 18 BEQ $C0B1 0x03C0A9|$0F:$C099:BD 00 03 LDA $0300,X ; PPU write buffer start 0x03C0AC|$0F:$C09C:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C0AF|$0F:$C09F:E8 INX 0x03C0B0|$0F:$C0A0:BD 00 03 LDA $0300,X ; PPU write buffer start 0x03C0B3|$0F:$C0A3:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C0B6|$0F:$C0A6:E8 INX 0x03C0B7|$0F:$C0A7:BD 00 03 LDA $0300,X ; PPU write buffer start 0x03C0BA|$0F:$C0AA:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C0BD|$0F:$C0AD:E8 INX 0x03C0BE|$0F:$C0AE:4C 95 C0 JMP $C095 ; control flow target (from $C07E, $C097, $C19D, $C1D9) 0x03C0C1|$0F:$C0B1:A9 00 LDA #$00 0x03C0C3|$0F:$C0B3:85 01 STA $01 0x03C0C5|$0F:$C0B5:85 02 STA $02 0x03C0C7|$0F:$C0B7:8D 83 01 STA $0183 0x03C0CA|$0F:$C0BA:20 03 C1 JSR $C103 0x03C0CD|$0F:$C0BD:A9 00 LDA #$00 0x03C0CF|$0F:$C0BF:85 00 STA $00 0x03C0D1|$0F:$C0C1:E6 03 INC $03 ; game clock? ; control flow target (from $C015) 0x03C0D3|$0F:$C0C3:20 0B C6 JSR $C60B ; initialize MMC control mode and CHR banks 0x03C0D6|$0F:$C0C6:A9 03 LDA #$03 0x03C0D8|$0F:$C0C8:20 D8 C3 JSR $C3D8 ; CLI and load bank specified by A ; call to code in a different bank ($03:$8000) 0x03C0DB|$0F:$C0CB:20 00 80 JSR $8000 0x03C0DE|$0F:$C0CE:AD F6 05 LDA $05F6 ; current bank 0x03C0E1|$0F:$C0D1:20 D8 C3 JSR $C3D8 ; CLI and load bank specified by A 0x03C0E4|$0F:$C0D4:BA TSX ; ummm... skipping X/Y/A on stack, if second caller is $FFC0 - $FFD4 inclusive, mess around with stack, pull X/Y/A, clobber A with current bank, and RTI ; else pull X/Y/A and RTI 0x03C0E5|$0F:$C0D5:BD 06 01 LDA $0106,X 0x03C0E8|$0F:$C0D8:C9 FF CMP #$FF 0x03C0EA|$0F:$C0DA:D0 21 BNE $C0FD 0x03C0EC|$0F:$C0DC:BD 05 01 LDA $0105,X 0x03C0EF|$0F:$C0DF:C9 C0 CMP #$C0 0x03C0F1|$0F:$C0E1:90 1A BCC $C0FD 0x03C0F3|$0F:$C0E3:C9 D5 CMP #$D5 0x03C0F5|$0F:$C0E5:B0 16 BCS $C0FD 0x03C0F7|$0F:$C0E7:A9 04 LDA #$04 0x03C0F9|$0F:$C0E9:1D 04 01 ORA $0104,X 0x03C0FC|$0F:$C0EC:9D 04 01 STA $0104,X 0x03C0FF|$0F:$C0EF:A9 C0 LDA #$C0 0x03C101|$0F:$C0F1:9D 05 01 STA $0105,X 0x03C104|$0F:$C0F4:68 PLA 0x03C105|$0F:$C0F5:AA TAX 0x03C106|$0F:$C0F6:68 PLA 0x03C107|$0F:$C0F7:A8 TAY 0x03C108|$0F:$C0F8:68 PLA 0x03C109|$0F:$C0F9:AD F6 05 LDA $05F6 ; current bank 0x03C10C|$0F:$C0FC:40 RTI ; control flow target (from $C0DA, $C0E1, $C0E5) 0x03C10D|$0F:$C0FD:68 PLA 0x03C10E|$0F:$C0FE:AA TAX 0x03C10F|$0F:$C0FF:68 PLA 0x03C110|$0F:$C100:A8 TAY 0x03C111|$0F:$C101:68 PLA 0x03C112|$0F:$C102:40 RTI ; control flow target (from $C0BA) 0x03C113|$0F:$C103:A9 3F LDA #$3F 0x03C115|$0F:$C105:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C118|$0F:$C108:A9 00 LDA #$00 0x03C11A|$0F:$C10A:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C11D|$0F:$C10D:A5 30 LDA $30 0x03C11F|$0F:$C10F:29 0F AND #$0F 0x03C121|$0F:$C111:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C124|$0F:$C114:A9 00 LDA #$00 0x03C126|$0F:$C116:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C129|$0F:$C119:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C12C|$0F:$C11C:A5 04 LDA $04 0x03C12E|$0F:$C11E:D0 05 BNE $C125 0x03C130|$0F:$C120:AD AE 61 LDA $61AE 0x03C133|$0F:$C123:D0 03 BNE $C128 ; control flow target (from $C11E) 0x03C135|$0F:$C125:AD AF 61 LDA $61AF ; control flow target (from $C123) 0x03C138|$0F:$C128:09 80 ORA #$80 0x03C13A|$0F:$C12A:8D 00 20 STA $2000 ; PPU Control Register #1 (#$80: Execute NMI on VBlank, #$40: unused, #$20: Sprite Size [8x8/8x16], #$10: Background Pattern Table Address [$0000/$1000], #$08: Sprite Pattern Table Address [$0000/$1000], #$04: PPU Address Increment [1/32], #$03: Name Table Address [$2000/$2400/$2800/$2C00]) 0x03C13D|$0F:$C12D:A5 05 LDA $05 0x03C13F|$0F:$C12F:8D 05 20 STA $2005 ; VRAM Address Register #1 (write twice; BG scroll) 0x03C142|$0F:$C132:A5 06 LDA $06 0x03C144|$0F:$C134:8D 05 20 STA $2005 ; VRAM Address Register #1 (write twice; BG scroll) 0x03C147|$0F:$C137:60 RTS ; code -> data ; PPU addresses ; indexed data load target (from $C028, $C02F) 0x03C148|$0F:$C138:22 65 0x03C14A|$0F:$C13A:22 85 0x03C14C|$0F:$C13C:22 A5 0x03C14E|$0F:$C13E:22 C5 0x03C150|$0F:$C140:22 E5 0x03C152|$0F:$C142:23 05 0x03C154|$0F:$C144:23 25 0x03C156|$0F:$C146:23 45 ; data -> code ; control flow target (from $C01D) 0x03C158|$0F:$C148:A2 00 LDX #$00 0x03C15A|$0F:$C14A:A4 01 LDY $01 0x03C15C|$0F:$C14C:F0 4C BEQ $C19A ; control flow target (from $C198) 0x03C15E|$0F:$C14E:BD 00 03 LDA $0300,X ; PPU write buffer start 0x03C161|$0F:$C151:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C164|$0F:$C154:BD 01 03 LDA $0301,X 0x03C167|$0F:$C157:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C16A|$0F:$C15A:BD 02 03 LDA $0302,X 0x03C16D|$0F:$C15D:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C170|$0F:$C160:BD 03 03 LDA $0303,X 0x03C173|$0F:$C163:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C176|$0F:$C166:BD 00 03 LDA $0300,X ; PPU write buffer start 0x03C179|$0F:$C169:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C17C|$0F:$C16C:BD 01 03 LDA $0301,X 0x03C17F|$0F:$C16F:09 20 ORA #$20 0x03C181|$0F:$C171:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C184|$0F:$C174:BD 04 03 LDA $0304,X 0x03C187|$0F:$C177:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C18A|$0F:$C17A:BD 05 03 LDA $0305,X 0x03C18D|$0F:$C17D:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C190|$0F:$C180:BD 06 03 LDA $0306,X 0x03C193|$0F:$C183:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C196|$0F:$C186:BD 07 03 LDA $0307,X 0x03C199|$0F:$C189:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C19C|$0F:$C18C:BD 08 03 LDA $0308,X 0x03C19F|$0F:$C18F:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C1A2|$0F:$C192:8A TXA 0x03C1A3|$0F:$C193:18 CLC 0x03C1A4|$0F:$C194:69 09 ADC #$09 0x03C1A6|$0F:$C196:AA TAX 0x03C1A7|$0F:$C197:88 DEY 0x03C1A8|$0F:$C198:D0 B4 BNE $C14E ; control flow target (from $C14C) 0x03C1AA|$0F:$C19A:8C 45 61 STY $6145 0x03C1AD|$0F:$C19D:4C B1 C0 JMP $C0B1 ; control flow target (from $C085) 0x03C1B0|$0F:$C1A0:A2 00 LDX #$00 0x03C1B2|$0F:$C1A2:AD 02 20 LDA $2002 ; PPU Status Register (#$80: In VBlank, #$40: Sprite #0 Hit, #$20: Scanline Sprite Count > 8, #$10: Ignore VRAM Writes); after read, #$80 and $2005-$2006 are reset 0x03C1B5|$0F:$C1A5:A5 02 LDA $02 0x03C1B7|$0F:$C1A7:F0 26 BEQ $C1CF ; control flow target (from $C1CD) 0x03C1B9|$0F:$C1A9:A0 01 LDY #$01 0x03C1BB|$0F:$C1AB:BD 00 03 LDA $0300,X ; PPU write buffer start 0x03C1BE|$0F:$C1AE:10 04 BPL $C1B4 0x03C1C0|$0F:$C1B0:E8 INX 0x03C1C1|$0F:$C1B1:BC 00 03 LDY $0300,X ; PPU write buffer start ; control flow target (from $C1AE) 0x03C1C4|$0F:$C1B4:E8 INX 0x03C1C5|$0F:$C1B5:29 3F AND #$3F 0x03C1C7|$0F:$C1B7:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C1CA|$0F:$C1BA:BD 00 03 LDA $0300,X ; PPU write buffer start 0x03C1CD|$0F:$C1BD:E8 INX 0x03C1CE|$0F:$C1BE:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) ; control flow target (from $C1C9) 0x03C1D1|$0F:$C1C1:BD 00 03 LDA $0300,X ; PPU write buffer start 0x03C1D4|$0F:$C1C4:E8 INX 0x03C1D5|$0F:$C1C5:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C1D8|$0F:$C1C8:88 DEY 0x03C1D9|$0F:$C1C9:D0 F6 BNE $C1C1 0x03C1DB|$0F:$C1CB:C6 01 DEC $01 0x03C1DD|$0F:$C1CD:D0 DA BNE $C1A9 ; control flow target (from $C1A7) 0x03C1DF|$0F:$C1CF:AD 08 60 LDA $6008 0x03C1E2|$0F:$C1D2:D0 05 BNE $C1D9 0x03C1E4|$0F:$C1D4:A9 02 LDA #$02 0x03C1E6|$0F:$C1D6:8D 14 40 STA $4014 ; Sprite DMA Register (copy $100 bytes from $100 * N) ; control flow target (from $C1D2) 0x03C1E9|$0F:$C1D9:4C B1 C0 JMP $C0B1 ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $C1EE, $C22C, $C23F, $C30A, $C3E8, $C421, $C465, $C595, $C67D, $C747, $C7EC, $C975, $C9A8, $CCD9, $CFA5, $D0E2, $D13D, $D317, $D48C, $D65B, $D6EE, $D72B, $D73F, $E2B8, $E2CE, $E5EC, $E609, $E660, $E69D, $E6D6, $E6EC, $E719, $E743, $E764, $E7B7, $E7EA, $E817, $E841, $E862, $E972, $E980, $E9F9, $EB6D, $F476, $F862, $F868, $FB05, $FD08, $FD9C) ; external control flow target (from $00:$803C, $00:$807B, $00:$8328, $00:$83A4, $00:$B783, $00:$B80A, $00:$B822, $00:$B95C, $02:$AB9B, $02:$B1FA, $02:$B717, $04:$8CE9, $04:$8D9B, $04:$8DE1, $04:$8E02, $04:$8E05, $04:$8E3F, $04:$8E9A, $04:$8EAE, $04:$8EB1, $04:$8FE7, $04:$902C, $04:$909B, $04:$90B7, $04:$99F9, $04:$9A39, $06:$8048, $06:$8905, $06:$8929, $06:$895F, $06:$8988, $06:$A262, $06:$A270, $06:$A273, $06:$A617, $06:$A620, $06:$A984, $06:$AF9B, $06:$B21B, $07:$81C3, $07:$8654, $07:$86E5, $07:$8715, $07:$8908, $07:$89BD, $07:$89CF, $08:$804F, $08:$8296, $08:$832E, $09:$802D, $09:$8070, $09:$8098, $09:$80CC, $09:$80DD, $09:$82A0, $09:$82EA, $09:$82ED, $09:$8310, $09:$8313, $09:$9E19, $09:$9EFB, $09:$9F59, $09:$9F95, $09:$9FFC, $09:$A02E, $09:$A03F, $09:$A07D, $09:$A0F3, $0A:$8049, $0A:$81DF) 0x03C1EC|$0F:$C1DC:A9 00 LDA #$00 0x03C1EE|$0F:$C1DE:8D 07 60 STA $6007 0x03C1F1|$0F:$C1E1:A9 01 LDA #$01 0x03C1F3|$0F:$C1E3:85 00 STA $00 ; control flow target (from $C1E7) 0x03C1F5|$0F:$C1E5:A5 00 LDA $00 0x03C1F7|$0F:$C1E7:D0 FC BNE $C1E5 0x03C1F9|$0F:$C1E9:A9 FF LDA #$FF 0x03C1FB|$0F:$C1EB:85 00 STA $00 0x03C1FD|$0F:$C1ED:60 RTS ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF ; control flow target (from $C1F2, $C329, $C520, $C592, $C5A5, $C6A5, $C82C, $C83B, $CAE6, $CC4A, $CD74, $CD83, $D0F9, $D5D7, $FC3A) ; external control flow target (from $00:$B7B5, $00:$B8BF, $04:$9019, $06:$824C, $06:$8A57, $06:$8B01, $06:$96AD, $06:$96C0, $06:$970E, $06:$97CB, $06:$98F5, $06:$9941, $06:$A2EB, $06:$A316, $06:$BBEC, $06:$BC3A, $06:$BC88, $06:$BD1E, $06:$BD76, $06:$BD86, $06:$BD93, $07:$81CB, $07:$81F0, $07:$81F9, $07:$85C8, $07:$863F, $07:$866D, $07:$8672, $07:$867A, $07:$867F, $07:$898F, $09:$8002, $09:$80A4, $09:$80D7, $09:$9E13, $09:$9E4C, $09:$9E5B, $09:$9E62, $09:$9F44, $09:$9FDC, $0A:$801C, $0A:$8024, $0A:$8038) 0x03C1FE|$0F:$C1EE:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03C201|$0F:$C1F1:CA DEX 0x03C202|$0F:$C1F2:D0 FA BNE $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03C204|$0F:$C1F4:60 RTS ; wait for battle message delay to expire ; control flow target (from $C1F7) ; external control flow target (from $04:$9A13) 0x03C205|$0F:$C1F5:A5 93 LDA $93 ; NMI counter, decremented once per NMI until it reaches 0 0x03C207|$0F:$C1F7:D0 FC BNE $C1F5 ; wait for battle message delay to expire 0x03C209|$0F:$C1F9:60 RTS ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 ; control flow target (from $C1FE, $C2C9, $D65E, $D661, $D66F, $D672, $DEBA, $DED7, $DEE7, $DF03, $DF14, $DF3D, $FD26, $FD99) ; external control flow target (from $00:$83AC, $00:$B95F, $02:$B74F, $04:$8D92, $04:$8DD8, $04:$8E91, $04:$909E, $04:$9A36, $06:$8996, $06:$AF73, $06:$B0A9, $07:$897A, $07:$8A90, $09:$8089, $09:$81ED) 0x03C20A|$0F:$C1FA:A6 02 LDX $02 0x03C20C|$0F:$C1FC:E0 C0 CPX #$C0 0x03C20E|$0F:$C1FE:F0 FA BEQ $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00; wait for $02 to not be #$C0 0x03C210|$0F:$C200:A5 08 LDA $08 ; PPU address, high byte 0x03C212|$0F:$C202:9D 00 03 STA $0300,X ; PPU write buffer start 0x03C215|$0F:$C205:E8 INX 0x03C216|$0F:$C206:A5 07 LDA $07 ; PPU address, low byte 0x03C218|$0F:$C208:9D 00 03 STA $0300,X ; PPU write buffer start 0x03C21B|$0F:$C20B:E8 INX 0x03C21C|$0F:$C20C:A5 09 LDA $09 ; PPU tile ID 0x03C21E|$0F:$C20E:9D 00 03 STA $0300,X ; PPU write buffer start 0x03C221|$0F:$C211:E8 INX 0x03C222|$0F:$C212:E6 01 INC $01 0x03C224|$0F:$C214:86 02 STX $02 0x03C226|$0F:$C216:E6 07 INC $07 ; INC 16-bit PPU address $07-$08 0x03C228|$0F:$C218:D0 02 BNE $C21C 0x03C22A|$0F:$C21A:E6 08 INC $08 ; control flow target (from $C218) 0x03C22C|$0F:$C21C:48 PHA 0x03C22D|$0F:$C21D:A9 00 LDA #$00 0x03C22F|$0F:$C21F:8D 83 01 STA $0183 0x03C232|$0F:$C222:68 PLA 0x03C233|$0F:$C223:60 RTS ; control flow target (from $C315) 0x03C234|$0F:$C224:A9 10 LDA #$10 0x03C236|$0F:$C226:D0 24 BNE $C24C ; control flow target (from $C324) ; external control flow target (from $06:$A284, $07:$8668) 0x03C238|$0F:$C228:A9 00 LDA #$00 0x03C23A|$0F:$C22A:F0 20 BEQ $C24C ; external control flow target (from $00:$B92E, $04:$8738, $04:$90D1, $04:$90D7, $04:$A0F5, $06:$866C, $06:$8BF0, $06:$8CC5, $06:$9431, $06:$951F, $06:$95F6, $06:$A1ED, $06:$AEB4, $06:$BD53) 0x03C23C|$0F:$C22C:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03C23F|$0F:$C22F:A9 00 LDA #$00 0x03C241|$0F:$C231:85 0C STA $0C 0x03C243|$0F:$C233:A2 02 LDX #$02 0x03C245|$0F:$C235:20 42 C2 JSR $C242 0x03C248|$0F:$C238:A2 00 LDX #$00 0x03C24A|$0F:$C23A:A9 10 LDA #$10 0x03C24C|$0F:$C23C:20 42 C2 JSR $C242 0x03C24F|$0F:$C23F:4C DC C1 JMP $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $C235, $C23C) 0x03C252|$0F:$C242:BC E7 C2 LDY $C2E7,X 0x03C255|$0F:$C245:84 0A STY $0A 0x03C257|$0F:$C247:BC E8 C2 LDY $C2E8,X 0x03C25A|$0F:$C24A:84 0B STY $0B ; control flow target (from $C226, $C22A) 0x03C25C|$0F:$C24C:85 07 STA $07 0x03C25E|$0F:$C24E:A9 3F LDA #$3F 0x03C260|$0F:$C250:85 08 STA $08 0x03C262|$0F:$C252:A0 01 LDY #$01 ; control flow target (from $C266) 0x03C264|$0F:$C254:A5 30 LDA $30 0x03C266|$0F:$C256:29 0F AND #$0F 0x03C268|$0F:$C258:20 BE C2 JSR $C2BE 0x03C26B|$0F:$C25B:20 69 C2 JSR $C269 0x03C26E|$0F:$C25E:20 BB C2 JSR $C2BB 0x03C271|$0F:$C261:20 BB C2 JSR $C2BB 0x03C274|$0F:$C264:C0 0D CPY #$0D 0x03C276|$0F:$C266:D0 EC BNE $C254 0x03C278|$0F:$C268:60 RTS ; control flow target (from $C25B) 0x03C279|$0F:$C269:A5 30 LDA $30 0x03C27B|$0F:$C26B:30 4E BMI $C2BB 0x03C27D|$0F:$C26D:A5 07 LDA $07 0x03C27F|$0F:$C26F:C9 01 CMP #$01 0x03C281|$0F:$C271:D0 48 BNE $C2BB 0x03C283|$0F:$C273:18 CLC 0x03C284|$0F:$C274:08 PHP 0x03C285|$0F:$C275:A2 00 LDX #$00 ; control flow target (from $C2B1) 0x03C287|$0F:$C277:BD 2D 06 LDA $062D,X ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03C28A|$0F:$C27A:0A ASL 0x03C28B|$0F:$C27B:29 08 AND #$08 0x03C28D|$0F:$C27D:F0 2B BEQ $C2AA 0x03C28F|$0F:$C27F:B0 06 BCS $C287 0x03C291|$0F:$C281:28 PLP 0x03C292|$0F:$C282:A9 26 LDA #$26 0x03C294|$0F:$C284:4C BD C2 JMP $C2BD ; control flow target (from $C27F) 0x03C297|$0F:$C287:BD 30 06 LDA $0630,X ; Midenhall Max HP low byte 0x03C29A|$0F:$C28A:48 PHA 0x03C29B|$0F:$C28B:BD 31 06 LDA $0631,X ; Midenhall Max HP high byte 0x03C29E|$0F:$C28E:4A LSR 0x03C29F|$0F:$C28F:7E 30 06 ROR $0630,X ; Midenhall Max HP low byte 0x03C2A2|$0F:$C292:4A LSR 0x03C2A3|$0F:$C293:7E 30 06 ROR $0630,X ; Midenhall Max HP low byte 0x03C2A6|$0F:$C296:DD 3C 06 CMP $063C,X ; Midenhall Current HP, high byte 0x03C2A9|$0F:$C299:D0 06 BNE $C2A1 0x03C2AB|$0F:$C29B:BD 30 06 LDA $0630,X ; Midenhall Max HP low byte 0x03C2AE|$0F:$C29E:DD 3B 06 CMP $063B,X ; Midenhall Current HP, low byte ; control flow target (from $C299) 0x03C2B1|$0F:$C2A1:68 PLA 0x03C2B2|$0F:$C2A2:9D 30 06 STA $0630,X ; Midenhall Max HP low byte 0x03C2B5|$0F:$C2A5:90 03 BCC $C2AA 0x03C2B7|$0F:$C2A7:28 PLP 0x03C2B8|$0F:$C2A8:38 SEC 0x03C2B9|$0F:$C2A9:08 PHP ; control flow target (from $C27D, $C2A5) 0x03C2BA|$0F:$C2AA:8A TXA 0x03C2BB|$0F:$C2AB:18 CLC 0x03C2BC|$0F:$C2AC:69 12 ADC #$12 0x03C2BE|$0F:$C2AE:AA TAX 0x03C2BF|$0F:$C2AF:C9 36 CMP #$36 0x03C2C1|$0F:$C2B1:90 C4 BCC $C277 0x03C2C3|$0F:$C2B3:28 PLP 0x03C2C4|$0F:$C2B4:90 05 BCC $C2BB 0x03C2C6|$0F:$C2B6:A9 37 LDA #$37 0x03C2C8|$0F:$C2B8:4C BD C2 JMP $C2BD ; control flow target (from $C25E, $C261, $C26B, $C271, $C2B4) 0x03C2CB|$0F:$C2BB:B1 0A LDA ($0A),Y ; control flow target (from $C284, $C2B8) 0x03C2CD|$0F:$C2BD:C8 INY ; control flow target (from $C258) 0x03C2CE|$0F:$C2BE:38 SEC 0x03C2CF|$0F:$C2BF:E5 0C SBC $0C 0x03C2D1|$0F:$C2C1:B0 04 BCS $C2C7 0x03C2D3|$0F:$C2C3:A5 30 LDA $30 0x03C2D5|$0F:$C2C5:29 0F AND #$0F ; control flow target (from $C2C1) 0x03C2D7|$0F:$C2C7:85 09 STA $09 0x03C2D9|$0F:$C2C9:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 0x03C2DC|$0F:$C2CC:60 RTS ; control flow target (from $E32C) ; external control flow target (from $07:$8A76, $09:$815D, $0A:$8134, $0B:$8084) 0x03C2DD|$0F:$C2CD:A0 00 LDY #$00 ; control flow target (from $C2DC) 0x03C2DF|$0F:$C2CF:B1 0E LDA ($0E),Y 0x03C2E1|$0F:$C2D1:99 00 05 STA $0500,Y 0x03C2E4|$0F:$C2D4:B1 10 LDA ($10),Y 0x03C2E6|$0F:$C2D6:99 0D 05 STA $050D,Y 0x03C2E9|$0F:$C2D9:C8 INY 0x03C2EA|$0F:$C2DA:C0 0D CPY #$0D 0x03C2EC|$0F:$C2DC:D0 F1 BNE $C2CF ; external control flow target (from $06:$828A) 0x03C2EE|$0F:$C2DE:A9 30 LDA #$30 0x03C2F0|$0F:$C2E0:85 0C STA $0C 0x03C2F2|$0F:$C2E2:A9 F0 LDA #$F0 0x03C2F4|$0F:$C2E4:4C 09 ; external indexed data load target (from $06:$827F) 0x03C2F6|$0F:$C2E6: C3 JMP $C309 ; code -> data ; indexed data load target (from $C242, $C2FB) 0x03C2F7|$0F:$C2E7:00 ; indexed data load target (from $C247) 0x03C2F8|$0F:$C2E8: 05 ; $0500 ; external data load target (from $06:$A276) 0x03C2F9|$0F:$C2E9:0D ; external data load target (from $06:$A27B) 0x03C2FA|$0F:$C2EA: 05 ; $050D ; data -> code ; control flow target (from $C42E) ; external control flow target (from $06:$8253, $0A:$8114) 0x03C2FB|$0F:$C2EB:A5 3C LDA $3C 0x03C2FD|$0F:$C2ED:C9 30 CMP #$30 0x03C2FF|$0F:$C2EF:D0 08 BNE $C2F9 0x03C301|$0F:$C2F1:A9 00 LDA #$00 0x03C303|$0F:$C2F3:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; call to code in a different bank ($00:$800F) 0x03C306|$0F:$C2F6:20 0F 80 JSR $800F ; control flow target (from $C2EF) 0x03C309|$0F:$C2F9:A2 03 LDX #$03 ; control flow target (from $C301) 0x03C30B|$0F:$C2FB:BD E7 C2 LDA $C2E7,X 0x03C30E|$0F:$C2FE:95 0E STA $0E,X 0x03C310|$0F:$C300:CA DEX 0x03C311|$0F:$C301:10 F8 BPL $C2FB 0x03C313|$0F:$C303:A9 00 LDA #$00 0x03C315|$0F:$C305:85 0C STA $0C 0x03C317|$0F:$C307:A9 10 LDA #$10 ; control flow target (from $C2E4) 0x03C319|$0F:$C309:48 PHA 0x03C31A|$0F:$C30A:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $C335) 0x03C31D|$0F:$C30D:A5 0E LDA $0E 0x03C31F|$0F:$C30F:85 0A STA $0A 0x03C321|$0F:$C311:A5 0F LDA $0F 0x03C323|$0F:$C313:85 0B STA $0B 0x03C325|$0F:$C315:20 24 C2 JSR $C224 0x03C328|$0F:$C318:A5 0D LDA $0D 0x03C32A|$0F:$C31A:F0 0B BEQ $C327 0x03C32C|$0F:$C31C:A5 10 LDA $10 0x03C32E|$0F:$C31E:85 0A STA $0A 0x03C330|$0F:$C320:A5 11 LDA $11 0x03C332|$0F:$C322:85 0B STA $0B 0x03C334|$0F:$C324:20 28 C2 JSR $C228 ; control flow target (from $C31A) 0x03C337|$0F:$C327:A2 04 LDX #$04 0x03C339|$0F:$C329:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03C33C|$0F:$C32C:68 PLA 0x03C33D|$0F:$C32D:48 PHA 0x03C33E|$0F:$C32E:18 CLC 0x03C33F|$0F:$C32F:65 0C ADC $0C 0x03C341|$0F:$C331:85 0C STA $0C 0x03C343|$0F:$C333:C9 50 CMP #$50 0x03C345|$0F:$C335:90 D6 BCC $C30D 0x03C347|$0F:$C337:68 PLA 0x03C348|$0F:$C338:60 RTS ; 16-bit multiplication: ($10-$11) = ($0C-$0D) * ($0E-$0F); consumes $0C-$0F ; control flow target (from $D692, $E19F, $E472) ; external control flow target (from $02:$B03E, $06:$86B4, $0A:$8171) 0x03C349|$0F:$C339:A9 00 LDA #$00 0x03C34B|$0F:$C33B:85 10 STA $10 0x03C34D|$0F:$C33D:85 11 STA $11 ; control flow target (from $C35C) 0x03C34F|$0F:$C33F:A5 0C LDA $0C 0x03C351|$0F:$C341:05 0D ORA $0D 0x03C353|$0F:$C343:F0 1A BEQ $C35F 0x03C355|$0F:$C345:46 0D LSR $0D 0x03C357|$0F:$C347:66 0C ROR $0C 0x03C359|$0F:$C349:90 0D BCC $C358 0x03C35B|$0F:$C34B:A5 0E LDA $0E 0x03C35D|$0F:$C34D:18 CLC 0x03C35E|$0F:$C34E:65 10 ADC $10 0x03C360|$0F:$C350:85 10 STA $10 0x03C362|$0F:$C352:A5 0F LDA $0F 0x03C364|$0F:$C354:65 11 ADC $11 0x03C366|$0F:$C356:85 11 STA $11 ; control flow target (from $C349) 0x03C368|$0F:$C358:06 0E ASL $0E 0x03C36A|$0F:$C35A:26 0F ROL $0F 0x03C36C|$0F:$C35C:4C 3F C3 JMP $C33F ; control flow target (from $C343) 0x03C36F|$0F:$C35F:60 RTS ; 16-bit division: ($0C-$0D) / ($0E-$0F) = quotient in ($0C-$0D), remainder in ($10-$11) ; external control flow target (from $02:$B063) 0x03C370|$0F:$C360:A0 10 LDY #$10 ; 16 bit logic 0x03C372|$0F:$C362:A9 00 LDA #$00 ; initialize remainder 0x03C374|$0F:$C364:85 10 STA $10 0x03C376|$0F:$C366:85 11 STA $11 ; control flow target (from $C390) 0x03C378|$0F:$C368:06 0C ASL $0C ; 16-bit ASL $0C-$0D into 16-bit $10-$11 0x03C37A|$0F:$C36A:26 0D ROL $0D 0x03C37C|$0F:$C36C:26 10 ROL $10 0x03C37E|$0F:$C36E:26 11 ROL $11 0x03C380|$0F:$C370:E6 0C INC $0C ; assume ($10-$11) >= ($0E-$0F), INC quotient and MOD remainder 0x03C382|$0F:$C372:A5 10 LDA $10 0x03C384|$0F:$C374:38 SEC 0x03C385|$0F:$C375:E5 0E SBC $0E 0x03C387|$0F:$C377:85 10 STA $10 0x03C389|$0F:$C379:A5 11 LDA $11 0x03C38B|$0F:$C37B:E5 0F SBC $0F 0x03C38D|$0F:$C37D:85 11 STA $11 0x03C38F|$0F:$C37F:B0 0E BCS $C38F ; branch if assumption was correct; otherwise undo INC/MOD 0x03C391|$0F:$C381:A5 10 LDA $10 0x03C393|$0F:$C383:65 0E ADC $0E 0x03C395|$0F:$C385:85 10 STA $10 0x03C397|$0F:$C387:A5 11 LDA $11 0x03C399|$0F:$C389:65 0F ADC $0F 0x03C39B|$0F:$C38B:85 11 STA $11 0x03C39D|$0F:$C38D:C6 0C DEC $0C ; control flow target (from $C37F) 0x03C39F|$0F:$C38F:88 DEY 0x03C3A0|$0F:$C390:D0 D6 BNE $C368 ; if more bits to divide, divide them 0x03C3A2|$0F:$C392:60 RTS ; control flow target (from $DF71) 0x03C3A3|$0F:$C393:A0 08 LDY #$08 0x03C3A5|$0F:$C395:A9 00 LDA #$00 ; control flow target (from $C3A6) 0x03C3A7|$0F:$C397:06 0C ASL $0C 0x03C3A9|$0F:$C399:2A ROL 0x03C3AA|$0F:$C39A:E6 0C INC $0C 0x03C3AC|$0F:$C39C:38 SEC 0x03C3AD|$0F:$C39D:E5 0E SBC $0E 0x03C3AF|$0F:$C39F:B0 04 BCS $C3A5 0x03C3B1|$0F:$C3A1:65 0E ADC $0E 0x03C3B3|$0F:$C3A3:C6 0C DEC $0C ; control flow target (from $C39F) 0x03C3B5|$0F:$C3A5:88 DEY 0x03C3B6|$0F:$C3A6:D0 EF BNE $C397 0x03C3B8|$0F:$C3A8:85 10 STA $10 0x03C3BA|$0F:$C3AA:60 RTS ; generate a random number and store it in $32-$33 (two passes) ; control flow target (from $C490, $D685, $D99C) ; external control flow target (from $04:$802D, $04:$80DC, $04:$824F, $04:$97CC, $04:$9880, $04:$A005, $04:$A044, $04:$AEDF, $04:$B078, $04:$B6C1, $04:$B793, $06:$846C, $06:$8744, $06:$8847, $06:$921E, $06:$9B5D, $06:$9BBE, $06:$9C41, $06:$BC6B, $06:$BCE8, $06:$BCF4, $06:$BD0E, $09:$9E5E) 0x03C3BB|$0F:$C3AB:A9 FF LDA #$FF 0x03C3BD|$0F:$C3AD:85 0C STA $0C 0x03C3BF|$0F:$C3AF:20 B6 C3 JSR $C3B6 ; generate a random number and store it in $32-$33 (one pass) 0x03C3C2|$0F:$C3B2:A9 FF LDA #$FF 0x03C3C4|$0F:$C3B4:85 0C STA $0C ; generate a random number and store it in $32-$33 (one pass) ; control flow target (from $C3AF) ; external control flow target (from $06:$ACC6) 0x03C3C6|$0F:$C3B6:A0 08 LDY #$08 ; control flow target (from $C3D2) 0x03C3C8|$0F:$C3B8:A5 33 LDA $33 ; RNG byte 1 0x03C3CA|$0F:$C3BA:45 0C EOR $0C 0x03C3CC|$0F:$C3BC:06 32 ASL $32 ; RNG byte 0 0x03C3CE|$0F:$C3BE:26 33 ROL $33 ; RNG byte 1 0x03C3D0|$0F:$C3C0:06 0C ASL $0C 0x03C3D2|$0F:$C3C2:0A ASL 0x03C3D3|$0F:$C3C3:90 0C BCC $C3D1 0x03C3D5|$0F:$C3C5:A5 32 LDA $32 ; RNG byte 0 0x03C3D7|$0F:$C3C7:49 21 EOR #$21 0x03C3D9|$0F:$C3C9:85 32 STA $32 ; RNG byte 0 0x03C3DB|$0F:$C3CB:A5 33 LDA $33 ; RNG byte 1 0x03C3DD|$0F:$C3CD:49 10 EOR #$10 0x03C3DF|$0F:$C3CF:85 33 STA $33 ; RNG byte 1 ; control flow target (from $C3C3) 0x03C3E1|$0F:$C3D1:88 DEY 0x03C3E2|$0F:$C3D2:D0 E4 BNE $C3B8 0x03C3E4|$0F:$C3D4:60 RTS ; save A to $05F6, X to $43, and load bank specified by A ; control flow target (from $C2F3, $C3DC, $C4E8, $C4FA, $C506, $C50E, $C544, $C55E, $C569, $C574, $C57F, $C58A, $C688, $C690, $CCEE, $CFA2, $D09B, $D0E7, $D2FF, $D31C, $D34A, $F782, $F86D, $FCFA) ; external control flow target (from $02:$B205, $06:$BC85) 0x03C3E5|$0F:$C3D5:4C BB FF JMP $FFBB ; save A to $05F6, X to $43, and load bank specified by A ; CLI and load bank specified by A ; control flow target (from $C0C8, $C0D1) 0x03C3E8|$0F:$C3D8:58 CLI 0x03C3E9|$0F:$C3D9:4C C0 FF JMP $FFC0 ; load bank specified by A ; load bank specified by A, wait for interrupt, set $6007 to #$FF, turn screen off, copy ($0C) inclusive - ($0E) exclusive to PPU at ($10), wait for interrupt, turn screen sprites and backround on ; external control flow target (from $00:$8039, $00:$80FF) 0x03C3EC|$0F:$C3DC:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A 0x03C3EF|$0F:$C3DF:20 E8 C3 JSR $C3E8 ; wait for interrupt, set $6007 to #$FF, turn screen off 0x03C3F2|$0F:$C3E2:20 F6 C3 JSR $C3F6 ; copy ($0C) inclusive - ($0E) exclusive to PPU at ($10) 0x03C3F5|$0F:$C3E5:4C 1C C4 JMP $C41C ; wait for interrupt, turn screen sprites and backround on ; wait for interrupt, set $6007 to #$FF, turn screen off ; control flow target (from $C3DF, $C446) ; external control flow target (from $00:$803F, $00:$807E, $00:$823A, $04:$8715, $08:$801B, $0A:$8010, $0A:$80BC, $0A:$81E2, $0B:$8087) 0x03C3F8|$0F:$C3E8:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03C3FB|$0F:$C3EB:A9 FF LDA #$FF 0x03C3FD|$0F:$C3ED:8D 07 60 STA $6007 0x03C400|$0F:$C3F0:A9 00 LDA #$00 ; screen off 0x03C402|$0F:$C3F2:8D 01 20 STA $2001 ; PPU Control Register #2 (#$E0: Full Background Colour, #$01 set [None, Green, Blue, Red], #$E0: Colour Intensity, #$01 not set [None, Green, Blue, Red], #$10: Sprite Visibility, #$80: Background Visibility, #$40: No Sprite Clipping, #$20: No Background Clipping, #$01: Monochrome Display) 0x03C405|$0F:$C3F5:60 RTS ; copy ($0C) inclusive - ($0E) exclusive to PPU at ($10) ; control flow target (from $C3E2) ; external control flow target (from $00:$8081, $00:$80C0, $00:$8396, $04:$8A84, $0A:$81E5, $0B:$808A) 0x03C406|$0F:$C3F6:A5 11 LDA $11 ; PPU address high byte; PPU address low byte 0x03C408|$0F:$C3F8:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C40B|$0F:$C3FB:A5 10 LDA $10 0x03C40D|$0F:$C3FD:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C410|$0F:$C400:A0 00 LDY #$00 ; control flow target (from $C416, $C41A) 0x03C412|$0F:$C402:B1 0C LDA ($0C),Y ; CHR data 0x03C414|$0F:$C404:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C417|$0F:$C407:A5 0C LDA $0C 0x03C419|$0F:$C409:C5 0E CMP $0E ; CHR end address low byte (exclusive) 0x03C41B|$0F:$C40B:D0 07 BNE $C414 ; update $0C-$0D 0x03C41D|$0F:$C40D:A5 0D LDA $0D 0x03C41F|$0F:$C40F:C5 0F CMP $0F ; CHR end address high byte (exclusive) 0x03C421|$0F:$C411:D0 01 BNE $C414 ; update $0C-$0D 0x03C423|$0F:$C413:60 RTS ; update $0C-$0D ; control flow target (from $C40B, $C411) 0x03C424|$0F:$C414:E6 0C INC $0C 0x03C426|$0F:$C416:D0 EA BNE $C402 0x03C428|$0F:$C418:E6 0D INC $0D 0x03C42A|$0F:$C41A:D0 E6 BNE $C402 ; wait for interrupt, turn screen sprites and backround on ; control flow target (from $C3E5, $C462) ; external control flow target (from $00:$8078, $00:$80E2, $00:$8325, $04:$8730, $06:$A98C) 0x03C42C|$0F:$C41C:A9 00 LDA #$00 ; useless op 0x03C42E|$0F:$C41E:8D 07 60 STA $6007 ; useless op 0x03C431|$0F:$C421:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03C434|$0F:$C424:A9 18 LDA #$18 ; turn sprites and backround on 0x03C436|$0F:$C426:8D 01 20 STA $2001 ; PPU Control Register #2 (#$E0: Full Background Colour, #$01 set [None, Green, Blue, Red], #$E0: Colour Intensity, #$01 not set [None, Green, Blue, Red], #$10: Sprite Visibility, #$80: Background Visibility, #$40: No Sprite Clipping, #$20: No Background Clipping, #$01: Monochrome Display) 0x03C439|$0F:$C429:60 RTS ; control flow target (from $C52D, $C6F3, $C97B, $D2B6, $D2DE, $E27E, $E287) ; external control flow target (from $04:$870F, $06:$A97E, $07:$81BD, $07:$81D6, $07:$84DD, $07:$851F, $07:$853B, $07:$85F6, $07:$88FF, $08:$8018, $09:$8005, $0A:$800D) 0x03C43A|$0F:$C42A:A9 FF LDA #$FF 0x03C43C|$0F:$C42C:85 0D STA $0D 0x03C43E|$0F:$C42E:20 EB C2 JSR $C2EB 0x03C441|$0F:$C431:A2 00 LDX #$00 0x03C443|$0F:$C433:8A TXA ; control flow target (from $C438) 0x03C444|$0F:$C434:9D 00 04 STA $0400,X ; menu-based palette overrides start 0x03C447|$0F:$C437:E8 INX 0x03C448|$0F:$C438:D0 FA BNE $C434 0x03C44A|$0F:$C43A:A2 C0 LDX #$C0 ; control flow target (from $C443) 0x03C44C|$0F:$C43C:9D 00 03 STA $0300,X ; PPU write buffer start 0x03C44F|$0F:$C43F:9D 00 07 STA $0700,X 0x03C452|$0F:$C442:E8 INX 0x03C453|$0F:$C443:D0 F7 BNE $C43C 0x03C455|$0F:$C445:60 RTS ; turn screen off, write $800 [space] tiles to PPU $2000, turn screen on ; control flow target (from $C533, $D2E1) ; external control flow target (from $04:$870C, $06:$A981, $07:$81C0, $07:$8902, $08:$801E, $09:$8008) 0x03C456|$0F:$C446:20 E8 C3 JSR $C3E8 ; wait for interrupt, set $6007 to #$FF, turn screen off 0x03C459|$0F:$C449:A9 20 LDA #$20 0x03C45B|$0F:$C44B:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C45E|$0F:$C44E:A9 00 LDA #$00 0x03C460|$0F:$C450:8D 06 20 STA $2006 ; VRAM Address Register #2 (write twice; $2007 address) 0x03C463|$0F:$C453:A9 5F LDA #$5F 0x03C465|$0F:$C455:A2 08 LDX #$08 ; control flow target (from $C460) 0x03C467|$0F:$C457:A0 00 LDY #$00 ; control flow target (from $C45D) 0x03C469|$0F:$C459:8D 07 20 STA $2007 ; VRAM I/O Register 0x03C46C|$0F:$C45C:88 DEY 0x03C46D|$0F:$C45D:D0 FA BNE $C459 0x03C46F|$0F:$C45F:CA DEX 0x03C470|$0F:$C460:D0 F5 BNE $C457 0x03C472|$0F:$C462:4C 1C C4 JMP $C41C ; wait for interrupt, turn screen sprites and backround on ; wait for interrupt and then set every 4th byte of $0200 - $02FC to #$F0 ; control flow target (from $C530, $D2E4, $E281, $E28A) ; external control flow target (from $04:$86FE, $07:$8905, $09:$800B, $0A:$805C) 0x03C475|$0F:$C465:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; set every 4th byte of $0200 - $02FC to #$F0 ; control flow target (from $C67A, $D8E0) ; external control flow target (from $07:$81BA, $08:$8021, $0A:$8013) 0x03C478|$0F:$C468:A2 00 LDX #$00 0x03C47A|$0F:$C46A:A9 F0 LDA #$F0 ; control flow target (from $C473) 0x03C47C|$0F:$C46C:9D 00 02 STA $0200,X ; sprite buffer start 0x03C47F|$0F:$C46F:E8 INX 0x03C480|$0F:$C470:E8 INX 0x03C481|$0F:$C471:E8 INX 0x03C482|$0F:$C472:E8 INX 0x03C483|$0F:$C473:D0 F7 BNE $C46C 0x03C485|$0F:$C475:60 RTS ; read joypad 1 data into $2F ; control flow target (from $C704, $D140) ; external control flow target (from $02:$B71A, $04:$9A4D, $06:$8930, $06:$A976, $06:$AFAE, $06:$BC5D, $06:$BC74, $06:$BC7B, $08:$8299, $08:$8335, $0A:$804C) 0x03C486|$0F:$C476:A9 01 LDA #$01 0x03C488|$0F:$C478:8D 16 40 STA $4016 ; Joypad #1 (READ: #$10: Zapper Trigger Not Pulled, #$08: Zapper Sprite Detection, #$01: Joypad Data; WRITE: #$01: Reset Joypad Strobe, set Expansion Port Method to Read) 0x03C48B|$0F:$C47B:A9 00 LDA #$00 0x03C48D|$0F:$C47D:8D 16 40 STA $4016 ; Joypad #1 (READ: #$10: Zapper Trigger Not Pulled, #$08: Zapper Sprite Detection, #$01: Joypad Data; WRITE: #$01: Reset Joypad Strobe, set Expansion Port Method to Read) 0x03C490|$0F:$C480:A0 08 LDY #$08 ; 8 bits of data to read ; control flow target (from $C48C) 0x03C492|$0F:$C482:AD 16 40 LDA $4016 ; Joypad #1 (READ: #$10: Zapper Trigger Not Pulled, #$08: Zapper Sprite Detection, #$01: Joypad Data; WRITE: #$01: Reset Joypad Strobe, set Expansion Port Method to Read) 0x03C495|$0F:$C485:29 03 AND #$03 ; mask off the non-joypad data (should be AND #$01?) 0x03C497|$0F:$C487:C9 01 CMP #$01 ; set C to low bit of joypad data 0x03C499|$0F:$C489:66 2F ROR $2F ; joypad 1 data 0x03C49B|$0F:$C48B:88 DEY 0x03C49C|$0F:$C48C:D0 F4 BNE $C482 ; loop until all 8 bits read 0x03C49E|$0F:$C48E:A6 0C LDX $0C ; save value of $0C in X 0x03C4A0|$0F:$C490:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x03C4A3|$0F:$C493:86 0C STX $0C ; restore value of $0C from X 0x03C4A5|$0F:$C495:60 RTS ; given a hero ID in $9C and an item ID in A, SEC if hero has that item, CLC otherwise ; control flow target (from $C4B0, $C4B6) 0x03C4A6|$0F:$C496:86 CB STX $CB ; save X for later 0x03C4A8|$0F:$C498:85 9B STA $9B ; item ID 0x03C4AA|$0F:$C49A:A5 9C LDA $9C ; hero ID 0x03C4AC|$0F:$C49C:0A ASL ; 8 inventory slots per hero 0x03C4AD|$0F:$C49D:0A ASL 0x03C4AE|$0F:$C49E:0A ASL 0x03C4AF|$0F:$C49F:AA TAX 0x03C4B0|$0F:$C4A0:A0 08 LDY #$08 ; 8 inventory slots per hero ; control flow target (from $C4AC) 0x03C4B2|$0F:$C4A2:BD 00 06 LDA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x03C4B5|$0F:$C4A5:C5 9B CMP $9B ; item ID 0x03C4B7|$0F:$C4A7:38 SEC 0x03C4B8|$0F:$C4A8:F0 05 BEQ $C4AF ; if found, RTS 0x03C4BA|$0F:$C4AA:E8 INX 0x03C4BB|$0F:$C4AB:88 DEY 0x03C4BC|$0F:$C4AC:D0 F4 BNE $C4A2 ; if more inventory to check, check it 0x03C4BE|$0F:$C4AE:18 CLC ; if we get here, then hero does not posses item $9B ; control flow target (from $C4A8) 0x03C4BF|$0F:$C4AF:60 RTS ; given a hero ID in $9C and an item ID in A, SEC if hero has that item, CLC otherwise ; external control flow target (from $04:$A4ED, $04:$A9E4, $04:$AFCF, $04:$AFE3, $04:$AFEC, $04:$B3D1, $06:$8DC0, $06:$A1C1) 0x03C4C0|$0F:$C4B0:20 96 C4 JSR $C496 ; given a hero ID in $9C and an item ID in A, SEC if hero has that item, CLC otherwise 0x03C4C3|$0F:$C4B3:A6 CB LDX $CB ; restore the original value of X 0x03C4C5|$0F:$C4B5:60 RTS ; given a hero ID in $9C and an item ID in A, remove that item from hero's inventory if present and SEC, CLC otherwise ; external control flow target (from $06:$8DC9, $06:$92CF, $06:$92DE, $06:$97A7) 0x03C4C6|$0F:$C4B6:20 96 C4 JSR $C496 ; given a hero ID in $9C and an item ID in A, SEC if hero has that item, CLC otherwise 0x03C4C9|$0F:$C4B9:B0 03 BCS $C4BE ; given a party inventory offset in X and a number of items to be moved up in Y, move that many inventory items up 0x03C4CB|$0F:$C4BB:A6 CB LDX $CB ; restore the original value of X 0x03C4CD|$0F:$C4BD:60 RTS ; given a party inventory offset in X and a number of items to be moved up in Y, move that many inventory items up ; control flow target (from $C4B9, $C4C8, $C4E3) 0x03C4CE|$0F:$C4BE:88 DEY ; number of items to move up 0x03C4CF|$0F:$C4BF:F0 0A BEQ $C4CB ; if zero, then done moving items up ; copy item N+1 to item N 0x03C4D1|$0F:$C4C1:BD 01 06 LDA $0601,X ; Midenhall inventory item 2 (| #$40 if equipped) 0x03C4D4|$0F:$C4C4:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x03C4D7|$0F:$C4C7:E8 INX 0x03C4D8|$0F:$C4C8:4C BE C4 JMP $C4BE ; given a party inventory offset in X and a number of items to be moved up in Y, move that many inventory items up ; control flow target (from $C4BF) 0x03C4DB|$0F:$C4CB:A9 00 LDA #$00 ; set the final inventory slot to #$00 (no item) 0x03C4DD|$0F:$C4CD:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x03C4E0|$0F:$C4D0:A6 CB LDX $CB ; restore the original value of X 0x03C4E2|$0F:$C4D2:38 SEC 0x03C4E3|$0F:$C4D3:60 RTS ; given hero ID in A and hero inventory offset in X, remove that item from hero's inventory and move all lower items up 1 slot ; external control flow target (from $04:$A4F6, $06:$853D, $06:$95FC, $06:$9621, $06:$9706, $06:$9A1C, $06:$9AB7) 0x03C4E4|$0F:$C4D4:86 CB STX $CB 0x03C4E6|$0F:$C4D6:0A ASL 0x03C4E7|$0F:$C4D7:0A ASL 0x03C4E8|$0F:$C4D8:0A ASL 0x03C4E9|$0F:$C4D9:18 CLC 0x03C4EA|$0F:$C4DA:65 CB ADC $CB 0x03C4EC|$0F:$C4DC:AA TAX ; X = A * 8 + X, i.e. convert hero inventory offset to party inventory offset 0x03C4ED|$0F:$C4DD:A9 08 LDA #$08 0x03C4EF|$0F:$C4DF:38 SEC 0x03C4F0|$0F:$C4E0:E5 CB SBC $CB 0x03C4F2|$0F:$C4E2:A8 TAY ; Y = number of items to bubble up 0x03C4F3|$0F:$C4E3:4C BE C4 JMP $C4BE ; given a party inventory offset in X and a number of items to be moved up in Y, move that many inventory items up ; return 1 byte from bank 1's ($00,Y) in A, INC 16-bit $00,Y-$01,Y ; external control flow target (from $04:$8F9F) 0x03C4F6|$0F:$C4E6:A9 01 LDA #$01 0x03C4F8|$0F:$C4E8:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A 0x03C4FB|$0F:$C4EB:98 TYA 0x03C4FC|$0F:$C4EC:AA TAX 0x03C4FD|$0F:$C4ED:A1 00 LDA ($00,X) 0x03C4FF|$0F:$C4EF:F6 00 INC $00,X 0x03C501|$0F:$C4F1:D0 02 BNE $C4F5 0x03C503|$0F:$C4F3:F6 01 INC $01,X ; control flow target (from $C4F1) 0x03C505|$0F:$C4F5:48 PHA 0x03C506|$0F:$C4F6:A6 43 LDX $43 0x03C508|$0F:$C4F8:A9 04 LDA #$04 0x03C50A|$0F:$C4FA:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A 0x03C50D|$0F:$C4FD:68 PLA 0x03C50E|$0F:$C4FE:60 RTS ; external control flow target (from $00:$B798, $00:$B7B0) 0x03C50F|$0F:$C4FF:90 03 BCC $C504 0x03C511|$0F:$C501:20 11 C5 JSR $C511 ; flash screen 5 times ; control flow target (from $C4FF, $D328, $FF66) 0x03C514|$0F:$C504:A9 04 LDA #$04 0x03C516|$0F:$C506:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; call to code in a different bank ($04:$8015) 0x03C519|$0F:$C509:20 15 80 JSR $8015 0x03C51C|$0F:$C50C:A9 00 LDA #$00 0x03C51E|$0F:$C50E:4C D5 C3 JMP $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; flash screen 5 times ; control flow target (from $C501) ; external control flow target (from $06:$BD17, $06:$BD81, $06:$BD8E, $07:$84F9, $07:$8687) 0x03C521|$0F:$C511:A2 05 LDX #$05 0x03C523|$0F:$C513:D0 02 BNE $C517 ; flash screen 10 times ; external control flow target (from $04:$86ED, $04:$9CA0, $06:$85AF, $06:$8606, $06:$8BC6, $06:$9172, $06:$940B, $06:$9519, $06:$96C3, $06:$9944, $06:$9947, $06:$BD3B, $06:$BD3E, $07:$8625) 0x03C525|$0F:$C515:A2 0A LDX #$0A ; control flow target (from $C513, $C52A) 0x03C527|$0F:$C517:8A TXA ; save X on the stack 0x03C528|$0F:$C518:48 PHA 0x03C529|$0F:$C519:29 01 AND #$01 ; pick out the even/odd bit 0x03C52B|$0F:$C51B:49 19 EOR #$19 ; enable sprites and background, toggle monochrome 0x03C52D|$0F:$C51D:48 PHA ; new PPU setting 0x03C52E|$0F:$C51E:A2 03 LDX #$03 0x03C530|$0F:$C520:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03C533|$0F:$C523:68 PLA ; new PPU setting 0x03C534|$0F:$C524:8D 01 20 STA $2001 ; PPU Control Register #2 (#$E0: Full Background Colour, #$01 set [None, Green, Blue, Red], #$E0: Colour Intensity, #$01 not set [None, Green, Blue, Red], #$10: Sprite Visibility, #$80: Background Visibility, #$40: No Sprite Clipping, #$20: No Background Clipping, #$01: Monochrome Display) 0x03C537|$0F:$C527:68 PLA ; restore X from the stack 0x03C538|$0F:$C528:AA TAX 0x03C539|$0F:$C529:CA DEX 0x03C53A|$0F:$C52A:D0 EB BNE $C517 ; loop until no more flashes left 0x03C53C|$0F:$C52C:60 RTS ; external control flow target (from $09:$8027) 0x03C53D|$0F:$C52D:20 2A C4 JSR $C42A 0x03C540|$0F:$C530:20 65 C4 JSR $C465 ; wait for interrupt and then set every 4th byte of $0200 - $02FC to #$F0 0x03C543|$0F:$C533:20 46 C4 JSR $C446 ; turn screen off, write $800 [space] tiles to PPU $2000, turn screen on 0x03C546|$0F:$C536:A9 8F LDA #$8F 0x03C548|$0F:$C538:85 30 STA $30 0x03C54A|$0F:$C53A:A9 00 LDA #$00 0x03C54C|$0F:$C53C:85 05 STA $05 0x03C54E|$0F:$C53E:85 06 STA $06 0x03C550|$0F:$C540:85 04 STA $04 0x03C552|$0F:$C542:A9 00 LDA #$00 0x03C554|$0F:$C544:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A 0x03C557|$0F:$C547:A9 06 LDA #$06 0x03C559|$0F:$C549:85 0C STA $0C ; call to code in a different bank ($00:$8000) 0x03C55B|$0F:$C54B:20 00 80 JSR $8000 0x03C55E|$0F:$C54E:A9 0E LDA #$0E 0x03C560|$0F:$C550:85 0C STA $0C ; call to code in a different bank ($00:$8000) 0x03C562|$0F:$C552:20 00 80 JSR $8000 0x03C565|$0F:$C555:A9 0F LDA #$0F 0x03C567|$0F:$C557:85 0C STA $0C ; call to code in a different bank ($00:$8000) 0x03C569|$0F:$C559:20 00 80 JSR $8000 0x03C56C|$0F:$C55C:A9 09 LDA #$09 0x03C56E|$0F:$C55E:4C D5 C3 JMP $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) ; control flow target (from $C58D, $C5A0, $CAD2, $CFF6, $D03D, $D0D2, $D21A, $D22E, $D4E8, $D4FE, $D53E, $D6E3, $E383, $F693, $F69C, $FD82) ; external control flow target (from $00:$B793, $00:$B7AB, $00:$B8ED, $02:$B728, $04:$86FB, $04:$8AD5, $04:$8AEA, $04:$8FE4, $04:$959A, $04:$969E, $04:$973F, $04:$980B, $04:$98FA, $04:$9B61, $04:$9B71, $04:$9C84, $04:$9C9D, $04:$9CB4, $06:$81AC, $06:$882F, $06:$89F7, $06:$8BC3, $06:$8C5A, $06:$97C6, $06:$A18C, $06:$A254, $06:$A298, $06:$A2BC, $06:$B0D3, $06:$BC17, $06:$BD08, $06:$BD27, $06:$BD6E, $06:$BD7E, $06:$BD8B, $07:$8207, $07:$8218, $07:$83F1, $07:$84DA, $07:$8512, $07:$8538, $07:$85F3, $07:$8605, $07:$8613, $07:$8618, $07:$861D, $07:$8622, $07:$862B, $07:$8635, $07:$8684, $07:$868F, $08:$81E7, $08:$81F6, $08:$820E) 0x03C571|$0F:$C561:78 SEI 0x03C572|$0F:$C562:AA TAX 0x03C573|$0F:$C563:AD F6 05 LDA $05F6 ; current bank 0x03C576|$0F:$C566:48 PHA ; save current bank on the stack 0x03C577|$0F:$C567:A9 03 LDA #$03 0x03C579|$0F:$C569:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A 0x03C57C|$0F:$C56C:8A TXA ; call to code in a different bank ($03:$8003) 0x03C57D|$0F:$C56D:20 03 80 JSR $8003 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03C580|$0F:$C570:68 PLA ; restore current bank from stack 0x03C581|$0F:$C571:8D F6 05 STA $05F6 ; current bank 0x03C584|$0F:$C574:4C D5 C3 JMP $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; set $6144 to #$05 ; external control flow target (from $06:$AA60, $07:$81C6, $07:$81FF, $07:$83E9, $07:$84E0, $08:$8015) 0x03C587|$0F:$C577:78 SEI 0x03C588|$0F:$C578:AA TAX 0x03C589|$0F:$C579:AD F6 05 LDA $05F6 ; current bank 0x03C58C|$0F:$C57C:48 PHA 0x03C58D|$0F:$C57D:A9 03 LDA #$03 0x03C58F|$0F:$C57F:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A 0x03C592|$0F:$C582:8A TXA ; call to code in a different bank ($03:$8009) 0x03C593|$0F:$C583:20 09 80 JSR $8009 0x03C596|$0F:$C586:68 PLA 0x03C597|$0F:$C587:8D F6 05 STA $05F6 ; current bank 0x03C59A|$0F:$C58A:4C D5 C3 JMP $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]), wait for it to finish, then play previous BGM ; external control flow target (from $06:$8111, $06:$8258, $06:$8656, $06:$8735, $06:$8A4F, $06:$9742, $06:$998A, $06:$A956) 0x03C59D|$0F:$C58D:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03C5A0|$0F:$C590:A2 03 LDX #$03 0x03C5A2|$0F:$C592:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF ; control flow target (from $C59B) ; external control flow target (from $04:$975B, $04:$9902) 0x03C5A5|$0F:$C595:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03C5A8|$0F:$C598:AD 56 01 LDA $0156 ; probably music playing flag? set to #$00 when music finishes 0x03C5AB|$0F:$C59B:D0 F8 BNE $C595 ; control flow target (from $C5A8) ; external control flow target (from $06:$A2F5) 0x03C5AD|$0F:$C59D:AD F7 05 LDA $05F7 ; probably BGM for current area 0x03C5B0|$0F:$C5A0:4C 61 C5 JMP $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) ; external control flow target (from $04:$968F, $04:$9731) 0x03C5B3|$0F:$C5A3:A2 3C LDX #$3C 0x03C5B5|$0F:$C5A5:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03C5B8|$0F:$C5A8:4C 9D C5 JMP $C59D ; IRQ/BRK vector handler ; indirect control flow target (via $FFFE) 0x03C5BB|$0F:$C5AB:2C 15 40 BIT $4015 ; READ: pAPU Sound/Vertical Clock Signal Register (#$40: Vertical Clock Signal IRQ Availability, #$10: Delta Modulation, #$08: Noise, #$04: Triangle, #$02: Pulse #2, #$01: Pulse #1), WRITE: pAPU Channel Control (#$10: Delta Modulation, #$08: Noise, #$04: Triangle, #$02: Pulse #2, #$01: Pulse #1) 0x03C5BE|$0F:$C5AE:40 RTI ; reset vector handler ; control flow target (from $FFDB) 0x03C5BF|$0F:$C5AF:D8 CLD ; control flow target (from $C5B3) 0x03C5C0|$0F:$C5B0:AD 02 20 LDA $2002 ; PPU Status Register (#$80: In VBlank, #$40: Sprite #0 Hit, #$20: Scanline Sprite Count > 8, #$10: Ignore VRAM Writes); after read, #$80 and $2005-$2006 are reset 0x03C5C3|$0F:$C5B3:10 FB BPL $C5B0 ; wait for VBlank ; control flow target (from $C5B8) 0x03C5C5|$0F:$C5B5:AD 02 20 LDA $2002 ; PPU Status Register (#$80: In VBlank, #$40: Sprite #0 Hit, #$20: Scanline Sprite Count > 8, #$10: Ignore VRAM Writes); after read, #$80 and $2005-$2006 are reset 0x03C5C8|$0F:$C5B8:10 FB BPL $C5B5 ; wait for VBlank again 0x03C5CA|$0F:$C5BA:A9 08 LDA #$08 0x03C5CC|$0F:$C5BC:8D 00 20 STA $2000 ; PPU Control Register #1 (#$80: Execute NMI on VBlank, #$40: unused, #$20: Sprite Size [8x8/8x16], #$10: Background Pattern Table Address [$0000/$1000], #$08: Sprite Pattern Table Address [$0000/$1000], #$04: PPU Address Increment [1/32], #$03: Name Table Address [$2000/$2400/$2800/$2C00]) 0x03C5CF|$0F:$C5BF:A9 00 LDA #$00 0x03C5D1|$0F:$C5C1:8D 01 20 STA $2001 ; PPU Control Register #2 (#$E0: Full Background Colour, #$01 set [None, Green, Blue, Red], #$E0: Colour Intensity, #$01 not set [None, Green, Blue, Red], #$10: Sprite Visibility, #$80: Background Visibility, #$40: No Sprite Clipping, #$20: No Background Clipping, #$01: Monochrome Display) 0x03C5D4|$0F:$C5C4:8D FF FF STA $FFFF ; swap in bank 0 0x03C5D7|$0F:$C5C7:8D FF FF STA $FFFF 0x03C5DA|$0F:$C5CA:8D FF FF STA $FFFF 0x03C5DD|$0F:$C5CD:8D FF FF STA $FFFF 0x03C5E0|$0F:$C5D0:8D FF FF STA $FFFF 0x03C5E3|$0F:$C5D3:8D 45 61 STA $6145 0x03C5E6|$0F:$C5D6:8D 46 61 STA $6146 0x03C5E9|$0F:$C5D9:A9 88 LDA #$88 0x03C5EB|$0F:$C5DB:8D AE 61 STA $61AE 0x03C5EE|$0F:$C5DE:A9 89 LDA #$89 0x03C5F0|$0F:$C5E0:8D AF 61 STA $61AF 0x03C5F3|$0F:$C5E3:A2 FF LDX #$FF ; reset stack pointer 0x03C5F5|$0F:$C5E5:9A TXS 0x03C5F6|$0F:$C5E6:A0 00 LDY #$00 0x03C5F8|$0F:$C5E8:84 00 STY $00 0x03C5FA|$0F:$C5EA:84 01 STY $01 0x03C5FC|$0F:$C5EC:98 TYA ; control flow target (from $C5F9) 0x03C5FD|$0F:$C5ED:91 00 STA ($00),Y ; reset all $800 of system RAM to #$00 0x03C5FF|$0F:$C5EF:E6 00 INC $00 0x03C601|$0F:$C5F1:D0 02 BNE $C5F5 0x03C603|$0F:$C5F3:E6 01 INC $01 ; control flow target (from $C5F1) 0x03C605|$0F:$C5F5:A6 01 LDX $01 0x03C607|$0F:$C5F7:E0 08 CPX #$08 0x03C609|$0F:$C5F9:D0 F2 BNE $C5ED 0x03C60B|$0F:$C5FB:A9 0E LDA #$0E ; 8kb CHR, 16kb+fixed-last PRG, vertical mirroring 0x03C60D|$0F:$C5FD:8D 92 01 STA $0192 ; MMC1 control mode (#$10 = CHR mode [1 8k block/2 4k blocks], #$0C = PRG mode [32kb/32kb/fixed-first+16kb/16kb+fixed-last], #$03 = Mirroring [1 low/1 high/vertical/horizontal]) 0x03C610|$0F:$C600:A9 00 LDA #$00 ; CHR bank 0 0x03C612|$0F:$C602:8D 93 01 STA $0193 ; CHR bank 0 0x03C615|$0F:$C605:20 0B C6 JSR $C60B ; initialize MMC control mode and CHR banks 0x03C618|$0F:$C608:4C 61 C6 JMP $C661 ; initialize MMC control mode and CHR banks ; control flow target (from $C0C3, $C605) 0x03C61B|$0F:$C60B:EE DE FF INC $FFDE ; #$80; used to reset MMC1 shift register and switch to last-fixed-bank mode 0x03C61E|$0F:$C60E:AD 92 01 LDA $0192 ; MMC1 control mode (#$10 = CHR mode [1 8k block/2 4k blocks], #$0C = PRG mode [32kb/32kb/fixed-first+16kb/16kb+fixed-last], #$03 = Mirroring [1 low/1 high/vertical/horizontal]) 0x03C621|$0F:$C611:20 1F C6 JSR $C61F ; set MMC control mode based on A 0x03C624|$0F:$C614:AD 93 01 LDA $0193 ; CHR bank 0 0x03C627|$0F:$C617:20 36 C6 JSR $C636 ; set CHR bank 0 based on A 0x03C62A|$0F:$C61A:A9 00 LDA #$00 0x03C62C|$0F:$C61C:4C 4D C6 JMP $C64D ; set CHR bank 1 based on A ; set MMC control mode based on A ; control flow target (from $C611) ; external control flow target (from $07:$8917, $07:$89C2, $09:$801A) 0x03C62F|$0F:$C61F:8D 92 01 STA $0192 ; MMC1 control mode (#$10 = CHR mode [1 8k block/2 4k blocks], #$0C = PRG mode [32kb/32kb/fixed-first+16kb/16kb+fixed-last], #$03 = Mirroring [1 low/1 high/vertical/horizontal]) 0x03C632|$0F:$C622:8D FF 9F STA $9FFF 0x03C635|$0F:$C625:4A LSR 0x03C636|$0F:$C626:8D FF 9F STA $9FFF 0x03C639|$0F:$C629:4A LSR 0x03C63A|$0F:$C62A:8D FF 9F STA $9FFF 0x03C63D|$0F:$C62D:4A LSR 0x03C63E|$0F:$C62E:8D FF 9F STA $9FFF 0x03C641|$0F:$C631:4A LSR 0x03C642|$0F:$C632:8D FF 9F STA $9FFF 0x03C645|$0F:$C635:60 RTS ; set CHR bank 0 based on A ; control flow target (from $C617, $D19B) 0x03C646|$0F:$C636:8D 93 01 STA $0193 ; CHR bank 0 0x03C649|$0F:$C639:8D FF BF STA $BFFF 0x03C64C|$0F:$C63C:4A LSR 0x03C64D|$0F:$C63D:8D FF BF STA $BFFF 0x03C650|$0F:$C640:4A LSR 0x03C651|$0F:$C641:8D FF BF STA $BFFF 0x03C654|$0F:$C644:4A LSR 0x03C655|$0F:$C645:8D FF BF STA $BFFF 0x03C658|$0F:$C648:4A LSR 0x03C659|$0F:$C649:8D FF BF STA $BFFF 0x03C65C|$0F:$C64C:60 RTS ; set CHR bank 1 based on A ; control flow target (from $C61C) 0x03C65D|$0F:$C64D:8D FF DF STA $DFFF 0x03C660|$0F:$C650:4A LSR 0x03C661|$0F:$C651:8D FF DF STA $DFFF 0x03C664|$0F:$C654:4A LSR 0x03C665|$0F:$C655:8D FF DF STA $DFFF 0x03C668|$0F:$C658:4A LSR 0x03C669|$0F:$C659:8D FF DF STA $DFFF 0x03C66C|$0F:$C65C:4A LSR 0x03C66D|$0F:$C65D:8D FF DF STA $DFFF 0x03C670|$0F:$C660:60 RTS ; control flow target (from $C608) 0x03C671|$0F:$C661:A9 FF LDA #$FF 0x03C673|$0F:$C663:85 00 STA $00 0x03C675|$0F:$C665:84 01 STY $01 ; Y is still #$00 0x03C677|$0F:$C667:A9 8F LDA #$8F 0x03C679|$0F:$C669:85 30 STA $30 0x03C67B|$0F:$C66B:A9 00 LDA #$00 0x03C67D|$0F:$C66D:8D 07 60 STA $6007 0x03C680|$0F:$C670:A9 88 LDA #$88 0x03C682|$0F:$C672:8D 00 20 STA $2000 ; PPU Control Register #1 (#$80: Execute NMI on VBlank, #$40: unused, #$20: Sprite Size [8x8/8x16], #$10: Background Pattern Table Address [$0000/$1000], #$08: Sprite Pattern Table Address [$0000/$1000], #$04: PPU Address Increment [1/32], #$03: Name Table Address [$2000/$2400/$2800/$2C00]) 0x03C685|$0F:$C675:A9 00 LDA #$00 0x03C687|$0F:$C677:8D 01 20 STA $2001 ; PPU Control Register #2 (#$E0: Full Background Colour, #$01 set [None, Green, Blue, Red], #$E0: Colour Intensity, #$01 not set [None, Green, Blue, Red], #$10: Sprite Visibility, #$80: Background Visibility, #$40: No Sprite Clipping, #$20: No Background Clipping, #$01: Monochrome Display) 0x03C68A|$0F:$C67A:20 68 C4 JSR $C468 ; set every 4th byte of $0200 - $02FC to #$F0 0x03C68D|$0F:$C67D:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03C690|$0F:$C680:20 75 F7 JSR $F775 ; load ROM bank #$03 ; call to code in a different bank ($03:$8006) 0x03C693|$0F:$C683:20 06 80 JSR $8006 0x03C696|$0F:$C686:A9 0A LDA #$0A 0x03C698|$0F:$C688:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; call to code in a different bank ($0A:$8000) 0x03C69B|$0F:$C68B:20 00 80 JSR $8000 0x03C69E|$0F:$C68E:A9 0B LDA #$0B 0x03C6A0|$0F:$C690:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; call to code in a different bank ($0B:$8000) 0x03C6A3|$0F:$C693:20 00 80 JSR $8000 0x03C6A6|$0F:$C696:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03C6A9|$0F:$C699:00 ; $08:$8000 ; data -> code 0x03C6AA|$0F:$C69A:A9 FF LDA #$FF 0x03C6AC|$0F:$C69C:8D 08 60 STA $6008 0x03C6AF|$0F:$C69F:A9 8F LDA #$8F 0x03C6B1|$0F:$C6A1:85 30 STA $30 0x03C6B3|$0F:$C6A3:A2 1E LDX #$1E 0x03C6B5|$0F:$C6A5:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03C6B8|$0F:$C6A8:20 5C F7 JSR $F75C ; load ROM bank #$00 0x03C6BB|$0F:$C6AB:A9 05 LDA #$05 0x03C6BD|$0F:$C6AD:85 0C STA $0C ; call to code in a different bank ($00:$8000) 0x03C6BF|$0F:$C6AF:20 00 80 JSR $8000 0x03C6C2|$0F:$C6B2:20 5E C7 JSR $C75E ; copy $C7A7-$C7AE to $053A-$0541, set $1F to #$FF 0x03C6C5|$0F:$C6B5:A2 17 LDX #$17 ; control flow target (from $C6BE) 0x03C6C7|$0F:$C6B7:BD 8F C7 LDA $C78F,X ; hero starting equipment 0x03C6CA|$0F:$C6BA:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x03C6CD|$0F:$C6BD:CA DEX 0x03C6CE|$0F:$C6BE:10 F7 BPL $C6B7 0x03C6D0|$0F:$C6C0:A9 FF LDA #$FF 0x03C6D2|$0F:$C6C2:85 8E STA $8E ; flag for in battle or not (#$FF)? 0x03C6D4|$0F:$C6C4:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03C6D7|$0F:$C6C7:C2 ; $06:$8004; -> $06:$A843: display and handle main game menu ; data -> code 0x03C6D8|$0F:$C6C8:A9 00 LDA #$00 0x03C6DA|$0F:$C6CA:85 8E STA $8E ; flag for in battle or not (#$FF)? 0x03C6DC|$0F:$C6CC:8D AD 61 STA $61AD 0x03C6DF|$0F:$C6CF:AD 70 70 LDA $7070 ; ????, SRAM buffer 0x03C6E2|$0F:$C6D2:D0 19 BNE $C6ED 0x03C6E4|$0F:$C6D4:20 6C C7 JSR $C76C 0x03C6E7|$0F:$C6D7:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03C6EA|$0F:$C6DA:CF ; $06:$801E; -> $06:$A885: copy save data from system RAM to per-game save data ; data -> code 0x03C6EB|$0F:$C6DB:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03C6EE|$0F:$C6DE:E0 ; $07:$8000 ; data -> code 0x03C6EF|$0F:$C6DF:A9 07 LDA #$07 0x03C6F1|$0F:$C6E1:85 48 STA $48 ; last save point ID 0x03C6F3|$0F:$C6E3:20 1F C8 JSR $C81F 0x03C6F6|$0F:$C6E6:A9 00 LDA #$00 ; Save Point ID #$00: Midenhall 2F 0x03C6F8|$0F:$C6E8:85 48 STA $48 ; last save point ID 0x03C6FA|$0F:$C6EA:4C 00 C7 JMP $C700 ; control flow target (from $C6D2) 0x03C6FD|$0F:$C6ED:20 61 F7 JSR $F761 ; load ROM bank #$06 0x03C700|$0F:$C6F0:20 6C C7 JSR $C76C 0x03C703|$0F:$C6F3:20 2A C4 JSR $C42A 0x03C706|$0F:$C6F6:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03C709|$0F:$C6F9:C3 ; $06:$8006; -> $06:$ABC7: copy save data from save data buffer at $7000 to system RAM; update Don Mahone quest status if applicable ; data -> code 0x03C70A|$0F:$C6FA:20 B9 D2 JSR $D2B9 ; call to code in a different bank ($06:$8F4E) 0x03C70D|$0F:$C6FD:20 4E 8F JSR $8F4E ; control flow target (from $C6EA, $C716, $C898, $C91E, $C928, $C9BD, $CA4A, $CA91, $CAB0, $CAB7, $CB39, $CB5F, $CBA2, $CBDC, $CC07, $CC5D, $CC9F, $D292) 0x03C710|$0F:$C700:A9 00 LDA #$00 0x03C712|$0F:$C702:85 03 STA $03 ; game clock? ; control flow target (from $C75B) 0x03C714|$0F:$C704:20 76 C4 JSR $C476 ; read joypad 1 data into $2F 0x03C717|$0F:$C707:A5 2F LDA $2F ; joypad 1 data 0x03C719|$0F:$C709:4A LSR 0x03C71A|$0F:$C70A:90 0D BCC $C719 0x03C71C|$0F:$C70C:20 61 F7 JSR $F761 ; load ROM bank #$06 ; call to code in a different bank ($06:$8048) 0x03C71F|$0F:$C70F:20 48 80 JSR $8048 0x03C722|$0F:$C712:A9 00 LDA #$00 0x03C724|$0F:$C714:85 35 STA $35 ; flag indicating whether any menu is currently open 0x03C726|$0F:$C716:4C 00 C7 JMP $C700 ; control flow target (from $C70A) 0x03C729|$0F:$C719:A5 2F LDA $2F ; joypad 1 data 0x03C72B|$0F:$C71B:29 10 AND #$10 0x03C72D|$0F:$C71D:F0 06 BEQ $C725 0x03C72F|$0F:$C71F:20 97 E7 JSR $E797 0x03C732|$0F:$C722:4C 7F C8 JMP $C87F ; control flow target (from $C71D) 0x03C735|$0F:$C725:A5 2F LDA $2F ; joypad 1 data 0x03C737|$0F:$C727:29 20 AND #$20 0x03C739|$0F:$C729:F0 06 BEQ $C731 0x03C73B|$0F:$C72B:20 B4 E6 JSR $E6B4 0x03C73E|$0F:$C72E:4C 7F C8 JMP $C87F ; control flow target (from $C729) 0x03C741|$0F:$C731:A5 2F LDA $2F ; joypad 1 data 0x03C743|$0F:$C733:29 40 AND #$40 0x03C745|$0F:$C735:F0 06 BEQ $C73D 0x03C747|$0F:$C737:20 36 E6 JSR $E636 0x03C74A|$0F:$C73A:4C 7F C8 JMP $C87F ; control flow target (from $C735) 0x03C74D|$0F:$C73D:A5 2F LDA $2F ; joypad 1 data 0x03C74F|$0F:$C73F:10 06 BPL $C747 0x03C751|$0F:$C741:20 C2 E5 JSR $E5C2 0x03C754|$0F:$C744:4C 7F C8 JMP $C87F ; control flow target (from $C73F, $D426, $E5CD, $E641, $E6BF, $E7A2) 0x03C757|$0F:$C747:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03C75A|$0F:$C74A:A5 03 LDA $03 ; game clock? 0x03C75C|$0F:$C74C:C9 51 CMP #$51 0x03C75E|$0F:$C74E:D0 08 BNE $C758 0x03C760|$0F:$C750:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x03C763|$0F:$C753:00 ; Menu ID #$00: Mini status window, bottom ; data -> code 0x03C764|$0F:$C754:A9 51 LDA #$51 0x03C766|$0F:$C756:85 03 STA $03 ; game clock? ; control flow target (from $C74E) 0x03C768|$0F:$C758:20 CB D8 JSR $D8CB 0x03C76B|$0F:$C75B:4C 04 C7 JMP $C704 ; copy $C7A7-$C7AE to $053A-$0541, set $1F to #$FF ; control flow target (from $C6B2) 0x03C76E|$0F:$C75E:A0 07 LDY #$07 ; control flow target (from $C767) 0x03C770|$0F:$C760:B9 A7 C7 LDA $C7A7,Y 0x03C773|$0F:$C763:99 3A 05 STA $053A,Y 0x03C776|$0F:$C766:88 DEY 0x03C777|$0F:$C767:10 F7 BPL $C760 0x03C779|$0F:$C769:84 1F STY $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu); $1F = #$FF 0x03C77B|$0F:$C76B:60 RTS ; control flow target (from $C6D4, $C6F0) 0x03C77C|$0F:$C76C:A9 84 LDA #$84 0x03C77E|$0F:$C76E:8D 2D 06 STA $062D ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03C781|$0F:$C771:20 66 F7 JSR $F766 ; load ROM bank #$04 ; call to code in a different bank ($04:$8009) 0x03C784|$0F:$C774:20 09 80 JSR $8009 ; update each hero's stats based on their current EXP 0x03C787|$0F:$C777:A9 0F LDA #$0F 0x03C789|$0F:$C779:85 30 STA $30 ; restore full HP/MP to all living party members ; control flow target (from $D2D5) ; external control flow target (from $06:$9419, $06:$BD4C) 0x03C78B|$0F:$C77B:A9 01 LDA #$01 ; make sure each hero has at least 1 HP so that $06:$8DCC will fully heal them 0x03C78D|$0F:$C77D:8D 3B 06 STA $063B ; Midenhall Current HP, low byte 0x03C790|$0F:$C780:8D 4D 06 STA $064D ; Cannock Current HP, low byte 0x03C793|$0F:$C783:8D 5F 06 STA $065F ; Moonbrooke Current HP, low byte 0x03C796|$0F:$C786:20 61 F7 JSR $F761 ; load ROM bank #$06 ; call to code in a different bank ($06:$8DCC) 0x03C799|$0F:$C789:20 CC 8D JSR $8DCC ; restore full HP to all living party members ; call to code in a different bank ($06:$8DEC) 0x03C79C|$0F:$C78C:4C EC 8D JMP $8DEC ; restore full MP to all living party members ; code -> data ; hero starting equipment ; Midenhall ; indexed data load target (from $C6B7) 0x03C79F|$0F:$C78F:55 ; Item ID #$55: Leather Armor (equipped) 0x03C7A0|$0F:$C790:00 ; Item ID #$00: (no item) 0x03C7A1|$0F:$C791:00 ; Item ID #$00: (no item) 0x03C7A2|$0F:$C792:00 ; Item ID #$00: (no item) 0x03C7A3|$0F:$C793:00 ; Item ID #$00: (no item) 0x03C7A4|$0F:$C794:00 ; Item ID #$00: (no item) 0x03C7A5|$0F:$C795:00 ; Item ID #$00: (no item) 0x03C7A6|$0F:$C796:00 ; Item ID #$00: (no item) ; Cannock 0x03C7A7|$0F:$C797:45 ; Item ID #$45: Club (equipped) 0x03C7A8|$0F:$C798:55 ; Item ID #$55: Leather Armor (equipped) 0x03C7A9|$0F:$C799:00 ; Item ID #$00: (no item) 0x03C7AA|$0F:$C79A:00 ; Item ID #$00: (no item) 0x03C7AB|$0F:$C79B:00 ; Item ID #$00: (no item) 0x03C7AC|$0F:$C79C:00 ; Item ID #$00: (no item) 0x03C7AD|$0F:$C79D:00 ; Item ID #$00: (no item) 0x03C7AE|$0F:$C79E:00 ; Item ID #$00: (no item) ; Moonbrooke 0x03C7AF|$0F:$C79F:41 ; Item ID #$41: Bamboo Stick (equipped) 0x03C7B0|$0F:$C7A0:51 ; Item ID #$51: Clothes (equipped) 0x03C7B1|$0F:$C7A1:00 ; Item ID #$00: (no item) 0x03C7B2|$0F:$C7A2:00 ; Item ID #$00: (no item) 0x03C7B3|$0F:$C7A3:00 ; Item ID #$00: (no item) 0x03C7B4|$0F:$C7A4:00 ; Item ID #$00: (no item) 0x03C7B5|$0F:$C7A5:00 ; Item ID #$00: (no item) 0x03C7B6|$0F:$C7A6:00 ; Item ID #$00: (no item) ; indexed data load target (from $C760) 0x03C7B7|$0F:$C7A7:80 0x03C7B8|$0F:$C7A8:6F 0x03C7B9|$0F:$C7A9:00 0x03C7BA|$0F:$C7AA:00 0x03C7BB|$0F:$C7AB:00 0x03C7BC|$0F:$C7AC:00 0x03C7BD|$0F:$C7AD:02 0x03C7BE|$0F:$C7AE:00 ; data -> code ; control flow target (from $C81F, $D2D8, $FF5A) 0x03C7BF|$0F:$C7AF:A9 FF LDA #$FF 0x03C7C1|$0F:$C7B1:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03C7C3|$0F:$C7B3:A5 48 LDA $48 ; last save point ID 0x03C7C5|$0F:$C7B5:0A ASL 0x03C7C6|$0F:$C7B6:0A ASL 0x03C7C7|$0F:$C7B7:A8 TAY 0x03C7C8|$0F:$C7B8:B9 EF C7 LDA $C7EF,Y ; save point map ID 0x03C7CB|$0F:$C7BB:85 31 STA $31 ; current map ID 0x03C7CD|$0F:$C7BD:B9 F0 C7 LDA $C7F0,Y ; save point X-pos 0x03C7D0|$0F:$C7C0:85 16 STA $16 ; current map X-pos (1) 0x03C7D2|$0F:$C7C2:85 28 STA $28 ; current map X-pos (2) 0x03C7D4|$0F:$C7C4:85 2A STA $2A ; current map X-pos pixel, low byte 0x03C7D6|$0F:$C7C6:B9 F1 C7 LDA $C7F1,Y ; save point Y-pos 0x03C7D9|$0F:$C7C9:85 17 STA $17 ; current map Y-pos (1) 0x03C7DB|$0F:$C7CB:85 29 STA $29 ; current map Y-pos (2) 0x03C7DD|$0F:$C7CD:85 2C STA $2C ; current map Y-pos pixel, low byte 0x03C7DF|$0F:$C7CF:B9 F2 C7 LDA $C7F2,Y ; save point ??? 0x03C7E2|$0F:$C7D2:85 45 STA $45 0x03C7E4|$0F:$C7D4:A9 00 LDA #$00 0x03C7E6|$0F:$C7D6:85 38 STA $38 0x03C7E8|$0F:$C7D8:85 2B STA $2B ; current map X-pos pixel, high byte 0x03C7EA|$0F:$C7DA:85 2D STA $2D ; current map Y-pos pixel, high byte 0x03C7EC|$0F:$C7DC:A2 04 LDX #$04 ; convert 16x16 map positions to pixels ; control flow target (from $C7E7) 0x03C7EE|$0F:$C7DE:06 2A ASL $2A ; current map X-pos pixel, low byte 0x03C7F0|$0F:$C7E0:26 2B ROL $2B ; current map X-pos pixel, high byte 0x03C7F2|$0F:$C7E2:06 2C ASL $2C ; current map Y-pos pixel, low byte 0x03C7F4|$0F:$C7E4:26 2D ROL $2D ; current map Y-pos pixel, high byte 0x03C7F6|$0F:$C7E6:CA DEX 0x03C7F7|$0F:$C7E7:D0 F5 BNE $C7DE 0x03C7F9|$0F:$C7E9:20 8A E2 JSR $E28A 0x03C7FC|$0F:$C7EC:4C DC C1 JMP $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; code -> data ; save point map ID ; indexed data load target (from $C7B8) 0x03C7FF|$0F:$C7EF:02 ; save point X-pos ; indexed data load target (from $C7BD) 0x03C800|$0F:$C7F0: 03 ; save point Y-pos ; indexed data load target (from $C7C6) 0x03C801|$0F:$C7F1: 04 ; save point ??? ; indexed data load target (from $C7CF) 0x03C802|$0F:$C7F2: 05 ; Save Point ID #$00: Midenhall 2F ; indirect data load target 0x03C803|$0F:$C7F3:06 03 05 05 ; Save Point ID #$01: Cannock 0x03C807|$0F:$C7F7:0C 1B 07 05 ; Save Point ID #$02: Tantegel 0x03C80B|$0F:$C7FB:0F 0E 06 05 ; Save Point ID #$03: Osterfair 0x03C80F|$0F:$C7FF:15 02 02 05 ; Save Point ID #$04: Beran 0x03C813|$0F:$C803:1F 04 03 05 ; Save Point ID #$05: Rhone Shrine 0x03C817|$0F:$C807:07 0F 02 05 ; Save Point ID #$06: Hamlin 0x03C81B|$0F:$C80B:02 06 03 00 ; Map ID #$02: Midenhall 2F 0x03C81F|$0F:$C80F:09 07 0A FF ; Map ID #$09: Moonbrooke 0x03C823|$0F:$C813:03 0F 11 FF ; Map ID #$03: Midenhall 1F 0x03C827|$0F:$C817:01 63 6F FF ; Map ID #$01: World Map 0x03C82B|$0F:$C81B:01 CF 38 FF ; Map ID #$01: World Map ; data -> code ; control flow target (from $C6E3) 0x03C82F|$0F:$C81F:20 AF C7 JSR $C7AF 0x03C832|$0F:$C822:A9 0A LDA #$0A 0x03C834|$0F:$C824:8D 71 05 STA $0571 ; NPC #$06 sprite ID 0x03C837|$0F:$C827:20 CB D8 JSR $D8CB 0x03C83A|$0F:$C82A:A2 3C LDX #$3C 0x03C83C|$0F:$C82C:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03C83F|$0F:$C82F:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03C842|$0F:$C832:83 ; indirect data load target 0x03C843|$0F:$C833:20 ; indirect data load target 0x03C844|$0F:$C834:C1 80 ; $07:$80C1; motion script for guard #2 part 9, prologue ; data -> code 0x03C846|$0F:$C836:20 D2 CC JSR $CCD2 ; execute scripted motion 0x03C849|$0F:$C839:A2 3C LDX #$3C 0x03C84B|$0F:$C83B:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03C84E|$0F:$C83E:20 EA F6 JSR $F6EA ; open main dialogue window and display string ID specified by byte following JSR ; code -> data ; indirect data load target 0x03C851|$0F:$C841:73 ; String ID #$0073: ‘Hear me, oh King[.’][wait][line]‘The army of Hargon the Sorcerer has sacked Moonbrooke Castle from whence I came[.’][wait][line]‘The evil of his magic is great and I fear he will soon rule all the world[..][..][wait][line]unless a monarch as great as thyself stands against him[.’][end-FC] ; data -> code 0x03C852|$0F:$C842:A9 FF LDA #$FF 0x03C854|$0F:$C844:8D 71 05 STA $0571 ; NPC #$06 sprite ID 0x03C857|$0F:$C847:20 CB D8 JSR $D8CB 0x03C85A|$0F:$C84A:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03C85D|$0F:$C84D:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x03C860|$0F:$C850:04 ; Menu ID #$04: Dialogue window ; data -> code 0x03C861|$0F:$C851:A9 00 LDA #$00 0x03C863|$0F:$C853:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA 0x03C866|$0F:$C856:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x03C869|$0F:$C859:74 ; String ID #$0074: ‘[name], my heir. Thou hast heard the tale of this man[.’][wait][line]‘I am old and this task must fall to younger hands[.’][wait][line]‘Thy destiny lies on that difficult road, just as it did for Erdrick the Great,[wait][line]for thou art of the line of Erdrick, and his doom is thine[.’][wait][line]‘Come with me now if thou art ready[.’][end-FC] ; data -> code 0x03C86A|$0F:$C85A:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03C86D|$0F:$C85D:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03C870|$0F:$C860:81 ; indirect data load target 0x03C871|$0F:$C861:22 ; indirect data load target 0x03C872|$0F:$C862:4A 80 ; $07:$804A; motion script for King Midenhall, Lighthouse Wizard part 1 ; data -> code 0x03C874|$0F:$C864:20 D2 CC JSR $CCD2 ; execute scripted motion 0x03C877|$0F:$C867:A9 03 LDA #$03 0x03C879|$0F:$C869:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03C87B|$0F:$C86B:A9 00 LDA #$00 0x03C87D|$0F:$C86D:85 35 STA $35 ; flag indicating whether any menu is currently open 0x03C87F|$0F:$C86F:60 RTS ; code -> data ; Hargon's minion map ID ; indexed data load target (from $C8AF) 0x03C880|$0F:$C870:46 ; Hargon's minion X-pos ; indexed data load target (from $C8B7) ; indirect data load target 0x03C881|$0F:$C871: 06 ; Hargon's minion Y-pos ; indexed data load target (from $C8BF) 0x03C882|$0F:$C872: 05 ; Hargon's minion $05FD value ; indexed data load target (from $C8C4) 0x03C883|$0F:$C873: 04 ; Hargon's minion fixed encounter ID ; indexed data load target (from $C8CE) 0x03C884|$0F:$C874: 08 ; Map ID #$46: Hargon's Castle 4F 0x03C885|$0F:$C875:47 01 01 08 09 ; Map ID #$47: Hargon's Castle 5F 0x03C88A|$0F:$C87A:48 0B 03 10 0A ; Map ID #$48: Hargon's Castle 6F ; data -> code ; control flow target (from $C722, $C72E, $C73A, $C744) 0x03C88F|$0F:$C87F:20 6B D4 JSR $D46B 0x03C892|$0F:$C882:A5 D0 LDA $D0 ; Malroth status flag (#$FF = defeated, #$00 = alive, others = countdown to battle) 0x03C894|$0F:$C884:10 15 BPL $C89B 0x03C896|$0F:$C886:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03C899|$0F:$C889:DD ; $06:$803A ; data -> code 0x03C89A|$0F:$C88A:A5 31 LDA $31 ; current map ID 0x03C89C|$0F:$C88C:C9 03 CMP #$03 ; Map ID #$03: Midenhall 1F 0x03C89E|$0F:$C88E:D0 08 BNE $C898 0x03C8A0|$0F:$C890:A9 06 LDA #$06 0x03C8A2|$0F:$C892:85 94 STA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03C8A4|$0F:$C894:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03C8A7|$0F:$C897:DC ; $06:$8038 ; data -> code ; control flow target (from $C88E) 0x03C8A8|$0F:$C898:4C 00 C7 JMP $C700 ; control flow target (from $C884) 0x03C8AB|$0F:$C89B:20 61 F7 JSR $F761 ; load ROM bank #$06 ; call to code in a different bank ($06:$A09E) 0x03C8AE|$0F:$C89E:20 9E A0 JSR $A09E 0x03C8B1|$0F:$C8A1:EA NOP 0x03C8B2|$0F:$C8A2:EA NOP 0x03C8B3|$0F:$C8A3:EA NOP 0x03C8B4|$0F:$C8A4:EA NOP 0x03C8B5|$0F:$C8A5:EA NOP 0x03C8B6|$0F:$C8A6:EA NOP 0x03C8B7|$0F:$C8A7:A5 31 LDA $31 ; current map ID 0x03C8B9|$0F:$C8A9:C9 0F CMP #$0F ; Map ID #$0F: Osterfair 0x03C8BB|$0F:$C8AB:F0 5E BEQ $C90B 0x03C8BD|$0F:$C8AD:A0 00 LDY #$00 ; control flow target (from $C8EA) 0x03C8BF|$0F:$C8AF:D9 70 C8 CMP $C870,Y ; Hargon's minion map ID 0x03C8C2|$0F:$C8B2:D0 2F BNE $C8E3 0x03C8C4|$0F:$C8B4:A5 16 LDA $16 ; current map X-pos (1) 0x03C8C6|$0F:$C8B6:4A LSR 0x03C8C7|$0F:$C8B7:D9 71 C8 CMP $C871,Y ; Hargon's minion X-pos 0x03C8CA|$0F:$C8BA:D0 30 BNE $C8EC 0x03C8CC|$0F:$C8BC:A5 17 LDA $17 ; current map Y-pos (1) 0x03C8CE|$0F:$C8BE:4A LSR 0x03C8CF|$0F:$C8BF:D9 72 C8 CMP $C872,Y ; Hargon's minion Y-pos 0x03C8D2|$0F:$C8C2:D0 28 BNE $C8EC 0x03C8D4|$0F:$C8C4:B9 73 C8 LDA $C873,Y ; Hargon's minion $05FD value 0x03C8D7|$0F:$C8C7:8D FD 05 STA $05FD 0x03C8DA|$0F:$C8CA:25 D1 AND $D1 ; fixed battle status bits (#$10 = Zarlox, #$08 = Bazuzu, #$04 = Atlas, #$02 = Hamlin Waterway Gremlins, #$01 = Evil Clown) 0x03C8DC|$0F:$C8CC:D0 1E BNE $C8EC ; branch if minion already dead 0x03C8DE|$0F:$C8CE:B9 74 C8 LDA $C874,Y ; Hargon's minion fixed encounter ID 0x03C8E1|$0F:$C8D1:20 5C D2 JSR $D25C ; trigger fixed battle A 0x03C8E4|$0F:$C8D4:A5 98 LDA $98 ; outcome of last fight? 0x03C8E6|$0F:$C8D6:C9 FC CMP #$FC 0x03C8E8|$0F:$C8D8:F0 12 BEQ $C8EC 0x03C8EA|$0F:$C8DA:A5 D1 LDA $D1 ; fixed battle status bits (#$10 = Zarlox, #$08 = Bazuzu, #$04 = Atlas, #$02 = Hamlin Waterway Gremlins, #$01 = Evil Clown) 0x03C8EC|$0F:$C8DC:0D FD 05 ORA $05FD 0x03C8EF|$0F:$C8DF:85 D1 STA $D1 ; fixed battle status bits (#$10 = Zarlox, #$08 = Bazuzu, #$04 = Atlas, #$02 = Hamlin Waterway Gremlins, #$01 = Evil Clown) 0x03C8F1|$0F:$C8E1:D0 09 BNE $C8EC ; control flow target (from $C8B2) 0x03C8F3|$0F:$C8E3:C8 INY 0x03C8F4|$0F:$C8E4:C8 INY 0x03C8F5|$0F:$C8E5:C8 INY 0x03C8F6|$0F:$C8E6:C8 INY 0x03C8F7|$0F:$C8E7:C8 INY 0x03C8F8|$0F:$C8E8:C0 0F CPY #$0F 0x03C8FA|$0F:$C8EA:D0 C3 BNE $C8AF ; control flow target (from $C8BA, $C8C2, $C8CC, $C8D8, $C8E1) 0x03C8FC|$0F:$C8EC:20 66 F7 JSR $F766 ; load ROM bank #$04 0x03C8FF|$0F:$C8EF:A5 1D LDA $1D 0x03C901|$0F:$C8F1:F0 12 BEQ $C905 0x03C903|$0F:$C8F3:A9 00 LDA #$00 0x03C905|$0F:$C8F5:AE FD 05 LDX $05FD 0x03C908|$0F:$C8F8:8D FD 05 STA $05FD 0x03C90B|$0F:$C8FB:E0 00 CPX #$00 0x03C90D|$0F:$C8FD:F0 06 BEQ $C905 ; call to code in a different bank ($04:$8018) 0x03C90F|$0F:$C8FF:20 18 80 JSR $8018 0x03C912|$0F:$C902:4C 08 C9 JMP $C908 ; control flow target (from $C8F1, $C8FD) ; call to code in a different bank ($04:$8000) 0x03C915|$0F:$C905:20 00 80 JSR $8000 ; control flow target (from $C902) 0x03C918|$0F:$C908:20 62 D2 JSR $D262 ; control flow target (from $C8AB) 0x03C91B|$0F:$C90B:A5 31 LDA $31 ; current map ID 0x03C91D|$0F:$C90D:C9 29 CMP #$29 ; Map ID #$29: Rubiss' Shrine B7 0x03C91F|$0F:$C90F:D0 10 BNE $C921 0x03C921|$0F:$C911:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03C924|$0F:$C914:03 ; indirect data load target 0x03C925|$0F:$C915:03 ; data -> code 0x03C926|$0F:$C916:D0 09 BNE $C921 0x03C928|$0F:$C918:20 FB D2 JSR $D2FB ; load ROM bank 6 ; call to code in a different bank ($06:$A2A7) 0x03C92B|$0F:$C91B:20 A7 A2 JSR $A2A7 0x03C92E|$0F:$C91E:4C 00 C7 JMP $C700 ; control flow target (from $C90F, $C916) 0x03C931|$0F:$C921:A5 44 LDA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03C933|$0F:$C923:F0 06 BEQ $C92B 0x03C935|$0F:$C925:4C C0 C9 JMP $C9C0 ; control flow target (from $C930) 0x03C938|$0F:$C928:4C 00 C7 JMP $C700 ; control flow target (from $C923) 0x03C93B|$0F:$C92B:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03C93E|$0F:$C92E:05 ; indirect data load target 0x03C93F|$0F:$C92F:08 ; data -> code 0x03C940|$0F:$C930:D0 F6 BNE $C928 0x03C942|$0F:$C932:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03C945|$0F:$C935:88 ; indirect data load target 0x03C946|$0F:$C936:22 ; indirect data load target 0x03C947|$0F:$C937:10 80 ; $07:$8010; motion script for granddaughter in Lianport, part 1 ; data -> code 0x03C949|$0F:$C939:A9 00 LDA #$00 0x03C94B|$0F:$C93B:85 98 STA $98 ; outcome of last fight? 0x03C94D|$0F:$C93D:20 D2 CC JSR $CCD2 ; execute scripted motion ; control flow target (from $C978) 0x03C950|$0F:$C940:20 F6 F6 JSR $F6F6 ; open main dialogue window and display string ID specified by byte following JSR + #$0200 ; code -> data ; indirect data load target 0x03C953|$0F:$C943:B3 ; String ID #$02B3: ‘Help! Help! Evil has come!’[end-FC] ; data -> code 0x03C954|$0F:$C944:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03C957|$0F:$C947:A5 98 LDA $98 ; outcome of last fight? 0x03C959|$0F:$C949:D0 11 BNE $C95C 0x03C95B|$0F:$C94B:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03C95E|$0F:$C94E:87 ; indirect data load target 0x03C95F|$0F:$C94F:20 ; indirect data load target 0x03C960|$0F:$C950:1D 80 ; $07:$801D; motion script for Lianport Gremlin #1 ; data -> code 0x03C962|$0F:$C952:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03C965|$0F:$C955:86 ; indirect data load target 0x03C966|$0F:$C956:23 ; indirect data load target 0x03C967|$0F:$C957:18 80 ; $07:$8018; motion script for Lianport Gremlin #2 ; data -> code 0x03C969|$0F:$C959:20 D2 CC JSR $CCD2 ; execute scripted motion ; control flow target (from $C949) 0x03C96C|$0F:$C95C:20 66 F7 JSR $F766 ; load ROM bank #$04 0x03C96F|$0F:$C95F:A9 00 LDA #$00 ; Fixed Battle #$00: 2 Gremlins (Map ID #$0B: Lianport) ; call to code in a different bank ($04:$800F) 0x03C971|$0F:$C961:20 0F 80 JSR $800F 0x03C974|$0F:$C964:A9 00 LDA #$00 0x03C976|$0F:$C966:85 8E STA $8E ; flag for in battle or not (#$FF)? 0x03C978|$0F:$C968:A5 98 LDA $98 ; outcome of last fight? 0x03C97A|$0F:$C96A:C9 FC CMP #$FC 0x03C97C|$0F:$C96C:F0 04 BEQ $C972 0x03C97E|$0F:$C96E:C9 FF CMP #$FF 0x03C980|$0F:$C970:D0 09 BNE $C97B ; control flow target (from $C96C) 0x03C982|$0F:$C972:20 62 D2 JSR $D262 0x03C985|$0F:$C975:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03C988|$0F:$C978:4C 40 C9 JMP $C940 ; control flow target (from $C970) 0x03C98B|$0F:$C97B:20 2A C4 JSR $C42A 0x03C98E|$0F:$C97E:A9 FF LDA #$FF 0x03C990|$0F:$C980:8D 89 05 STA $0589 ; NPC #$09 sprite ID 0x03C993|$0F:$C983:8D 91 05 STA $0591 ; NPC #$0A sprite ID 0x03C996|$0F:$C986:A9 05 LDA #$05 0x03C998|$0F:$C988:8D 94 05 STA $0594 ; NPC #$0B X-pos 0x03C99B|$0F:$C98B:A9 08 LDA #$08 0x03C99D|$0F:$C98D:8D 95 05 STA $0595 ; NPC #$0B Y-pos 0x03C9A0|$0F:$C990:A9 03 LDA #$03 0x03C9A2|$0F:$C992:8D 98 05 STA $0598 ; NPC #$0B motion nybble + direction nybble 0x03C9A5|$0F:$C995:A9 04 LDA #$04 0x03C9A7|$0F:$C997:85 16 STA $16 ; current map X-pos (1) 0x03C9A9|$0F:$C999:85 28 STA $28 ; current map X-pos (2) 0x03C9AB|$0F:$C99B:A9 40 LDA #$40 0x03C9AD|$0F:$C99D:85 2A STA $2A ; current map X-pos pixel, low byte 0x03C9AF|$0F:$C99F:A9 01 LDA #$01 ; update ship status: you beat the Gremlins 0x03C9B1|$0F:$C9A1:85 CF STA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x03C9B3|$0F:$C9A3:A9 06 LDA #$06 0x03C9B5|$0F:$C9A5:20 9A D2 JSR $D29A 0x03C9B8|$0F:$C9A8:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03C9BB|$0F:$C9AB:20 F6 F6 JSR $F6F6 ; open main dialogue window and display string ID specified by byte following JSR + #$0200 ; code -> data ; indirect data load target 0x03C9BE|$0F:$C9AE:B4 ; String ID #$02B4: ‘Thou hast saved me from the fiends[.’][wait][line]‘Please follow me and meet my grandfather[.’][end-FC] ; data -> code 0x03C9BF|$0F:$C9AF:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03C9C2|$0F:$C9B2:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03C9C5|$0F:$C9B5:88 ; indirect data load target 0x03C9C6|$0F:$C9B6:21 ; indirect data load target 0x03C9C7|$0F:$C9B7:22 80 ; $07:$8022; motion script for granddaughter in Lianport, part 2 ; data -> code 0x03C9C9|$0F:$C9B9:A9 01 LDA #$01 0x03C9CB|$0F:$C9BB:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03C9CD|$0F:$C9BD:4C 00 C7 JMP $C700 ; control flow target (from $C925) 0x03C9D0|$0F:$C9C0:C9 01 CMP #$01 0x03C9D2|$0F:$C9C2:F0 03 BEQ $C9C7 0x03C9D4|$0F:$C9C4:4C 4D CA JMP $CA4D ; control flow target (from $C9C2) 0x03C9D7|$0F:$C9C7:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03C9DA|$0F:$C9CA:0F ; indirect data load target 0x03C9DB|$0F:$C9CB:08 ; data -> code 0x03C9DC|$0F:$C9CC:D0 04 BNE $C9D2 0x03C9DE|$0F:$C9CE:A9 01 LDA #$01 0x03C9E0|$0F:$C9D0:D0 1B BNE $C9ED ; control flow target (from $C9CC) 0x03C9E2|$0F:$C9D2:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03C9E5|$0F:$C9D5:11 ; indirect data load target 0x03C9E6|$0F:$C9D6:08 ; data -> code 0x03C9E7|$0F:$C9D7:D0 04 BNE $C9DD 0x03C9E9|$0F:$C9D9:A9 03 LDA #$03 0x03C9EB|$0F:$C9DB:D0 10 BNE $C9ED ; control flow target (from $C9D7) 0x03C9ED|$0F:$C9DD:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03C9F0|$0F:$C9E0:10 ; indirect data load target 0x03C9F1|$0F:$C9E1:09 ; data -> code 0x03C9F2|$0F:$C9E2:D0 66 BNE $CA4A 0x03C9F4|$0F:$C9E4:A9 00 LDA #$00 0x03C9F6|$0F:$C9E6:8D 40 05 STA $0540 ; NPC #$00 ? + direction nybble 0x03C9F9|$0F:$C9E9:A9 02 LDA #$02 0x03C9FB|$0F:$C9EB:D0 03 BNE $C9F0 ; control flow target (from $C9D0, $C9DB) 0x03C9FD|$0F:$C9ED:8D 40 05 STA $0540 ; NPC #$00 ? + direction nybble ; control flow target (from $C9EB) 0x03CA00|$0F:$C9F0:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CA02|$0F:$C9F2:20 F6 F6 JSR $F6F6 ; open main dialogue window and display string ID specified by byte following JSR + #$0200 ; code -> data ; indirect data load target 0x03CA05|$0F:$C9F5:B5 ; String ID #$02B5: ‘These good people aided me in my time of need, Grandfather[.’][FD][FD][end-FC] ; data -> code 0x03CA06|$0F:$C9F6:A5 44 LDA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CA08|$0F:$C9F8:C9 01 CMP #$01 0x03CA0A|$0F:$C9FA:D0 09 BNE $CA05 0x03CA0C|$0F:$C9FC:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CA0F|$0F:$C9FF:88 ; indirect data load target 0x03CA10|$0F:$CA00:20 ; indirect data load target 0x03CA11|$0F:$CA01:2F 80 ; $07:$802F; motion script for granddaughter in Lianport, part 3 (from left) ; data -> code 0x03CA13|$0F:$CA03:90 07 BCC $CA0C ; control flow target (from $C9FA) 0x03CA15|$0F:$CA05:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CA18|$0F:$CA08:88 ; indirect data load target 0x03CA19|$0F:$CA09:20 ; indirect data load target 0x03CA1A|$0F:$CA0A:33 80 ; $07:$8033; motion script for granddaughter in Lianport, part 3 (from right) ; data -> code ; control flow target (from $CA03) 0x03CA1C|$0F:$CA0C:20 D2 CC JSR $CCD2 ; execute scripted motion 0x03CA1F|$0F:$CA0F:A5 44 LDA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CA21|$0F:$CA11:C9 01 CMP #$01 0x03CA23|$0F:$CA13:D0 09 BNE $CA1E 0x03CA25|$0F:$CA15:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CA28|$0F:$CA18:89 ; indirect data load target 0x03CA29|$0F:$CA19:22 ; indirect data load target 0x03CA2A|$0F:$CA1A:36 80 ; $07:$8036; motion script for grandfather in Lianport, part 1 (from left or bottom) ; data -> code 0x03CA2C|$0F:$CA1C:90 14 BCC $CA32 ; control flow target (from $CA13) 0x03CA2E|$0F:$CA1E:C9 02 CMP #$02 0x03CA30|$0F:$CA20:D0 09 BNE $CA2B 0x03CA32|$0F:$CA22:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CA35|$0F:$CA25:89 ; indirect data load target 0x03CA36|$0F:$CA26:22 ; indirect data load target 0x03CA37|$0F:$CA27:39 80 ; $07:$8039; motion script for grandfather in Lianport, part 1 (from bottom) ; data -> code 0x03CA39|$0F:$CA29:90 07 BCC $CA32 ; control flow target (from $CA20) 0x03CA3B|$0F:$CA2B:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CA3E|$0F:$CA2E:89 ; indirect data load target 0x03CA3F|$0F:$CA2F:22 ; indirect data load target 0x03CA40|$0F:$CA30:3C 80 ; $07:$803C; motion script for grandfather in Lianport, part 1 (from right) ; data -> code ; control flow target (from $CA1C, $CA29) 0x03CA42|$0F:$CA32:20 D2 CC JSR $CCD2 ; execute scripted motion 0x03CA45|$0F:$CA35:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x03CA48|$0F:$CA38:B6 ; String ID #$02B6: ‘Having gallantly aided my granddaughter,[wait][line]I shall gladly lend thee my swiftest ship[.’][end-FC] ; data -> code 0x03CA49|$0F:$CA39:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03CA4C|$0F:$CA3C:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CA4F|$0F:$CA3F:89 ; indirect data load target 0x03CA50|$0F:$CA40:20 ; indirect data load target 0x03CA51|$0F:$CA41:3F 80 ; $07:$803F; motion script for grandfather in Lianport, part 2 ; data -> code ; control flow target (from $CA6D) 0x03CA53|$0F:$CA43:20 D2 CC JSR $CCD2 ; execute scripted motion 0x03CA56|$0F:$CA46:A9 FF LDA #$FF 0x03CA58|$0F:$CA48:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) ; control flow target (from $C9E2, $CA5D) 0x03CA5A|$0F:$CA4A:4C 00 C7 JMP $C700 ; control flow target (from $C9C4) 0x03CA5D|$0F:$CA4D:C9 02 CMP #$02 0x03CA5F|$0F:$CA4F:D0 1E BNE $CA6F 0x03CA61|$0F:$CA51:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CA64|$0F:$CA54:03 ; indirect data load target 0x03CA65|$0F:$CA55:03 ; data -> code 0x03CA66|$0F:$CA56:F0 07 BEQ $CA5F 0x03CA68|$0F:$CA58:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CA6B|$0F:$CA5B:04 ; indirect data load target 0x03CA6C|$0F:$CA5C:03 ; data -> code 0x03CA6D|$0F:$CA5D:D0 EB BNE $CA4A ; control flow target (from $CA56) 0x03CA6F|$0F:$CA5F:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CA72|$0F:$CA62:82 ; indirect data load target 0x03CA73|$0F:$CA63:23 ; indirect data load target 0x03CA74|$0F:$CA64:47 80 ; $07:$8047; motion script for guard #1, Shrine SW of Cannock ; data -> code 0x03CA76|$0F:$CA66:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CA79|$0F:$CA69:81 ; indirect data load target 0x03CA7A|$0F:$CA6A:21 ; indirect data load target 0x03CA7B|$0F:$CA6B:44 80 ; $07:$8044; motion script for guard #1, Shrine SW of Cannock ; data -> code 0x03CA7D|$0F:$CA6D:90 D4 BCC $CA43 ; control flow target (from $CA4F) 0x03CA7F|$0F:$CA6F:C9 03 CMP #$03 0x03CA81|$0F:$CA71:D0 21 BNE $CA94 0x03CA83|$0F:$CA73:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CA86|$0F:$CA76:03 ; indirect data load target 0x03CA87|$0F:$CA77:06 ; data -> code 0x03CA88|$0F:$CA78:F0 0E BEQ $CA88 0x03CA8A|$0F:$CA7A:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CA8D|$0F:$CA7D:03 ; indirect data load target 0x03CA8E|$0F:$CA7E:08 ; data -> code 0x03CA8F|$0F:$CA7F:F0 07 BEQ $CA88 0x03CA91|$0F:$CA81:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CA94|$0F:$CA84:02 ; indirect data load target 0x03CA95|$0F:$CA85:07 ; data -> code 0x03CA96|$0F:$CA86:D0 09 BNE $CA91 ; control flow target (from $CA78, $CA7F) 0x03CA98|$0F:$CA88:A9 FF LDA #$FF 0x03CA9A|$0F:$CA8A:8D 61 05 STA $0561 ; NPC #$04 sprite ID 0x03CA9D|$0F:$CA8D:A9 04 LDA #$04 0x03CA9F|$0F:$CA8F:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) ; control flow target (from $CA86, $CA9C, $CAA3) 0x03CAA1|$0F:$CA91:4C 00 C7 JMP $C700 ; control flow target (from $CA71) 0x03CAA4|$0F:$CA94:C9 04 CMP #$04 0x03CAA6|$0F:$CA96:D0 1B BNE $CAB3 0x03CAA8|$0F:$CA98:A5 31 LDA $31 ; current map ID 0x03CAAA|$0F:$CA9A:C9 03 CMP #$03 ; Map ID #$03: Midenhall 1F 0x03CAAC|$0F:$CA9C:D0 F3 BNE $CA91 0x03CAAE|$0F:$CA9E:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CAB1|$0F:$CAA1:0F ; indirect data load target 0x03CAB2|$0F:$CAA2:02 ; data -> code 0x03CAB3|$0F:$CAA3:D0 EC BNE $CA91 0x03CAB5|$0F:$CAA5:20 EA F6 JSR $F6EA ; open main dialogue window and display string ID specified by byte following JSR ; code -> data ; indirect data load target 0x03CAB8|$0F:$CAA8:75 ; String ID #$0075: ‘Open the treasure chest and prepare for thy journey[.’][wait][line]‘Now listen closely, [name][.’][wait][line]‘Seek out worthy companions along thy road[.’][wait][line]‘In Cannock and Moonbrooke there are those who are also of Erdrick's line[.’][wait][line]‘They will surely help thee to defeat Hargon's dark plot[.’][end-FC] ; data -> code 0x03CAB9|$0F:$CAA9:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03CABC|$0F:$CAAC:A9 05 LDA #$05 0x03CABE|$0F:$CAAE:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CAC0|$0F:$CAB0:4C 00 C7 JMP $C700 ; control flow target (from $CA96) 0x03CAC3|$0F:$CAB3:C9 05 CMP #$05 0x03CAC5|$0F:$CAB5:D0 4B BNE $CB02 0x03CAC7|$0F:$CAB7:4C 00 C7 JMP $C700 ; external control flow target (from $06:$91C0) 0x03CACA|$0F:$CABA:20 B4 E6 JSR $E6B4 0x03CACD|$0F:$CABD:20 B4 E6 JSR $E6B4 0x03CAD0|$0F:$CAC0:20 B4 E6 JSR $E6B4 0x03CAD3|$0F:$CAC3:20 58 D0 JSR $D058 0x03CAD6|$0F:$CAC6:A9 0A LDA #$0A 0x03CAD8|$0F:$CAC8:99 2A 05 STA $052A,Y 0x03CADB|$0F:$CACB:A9 09 LDA #$09 0x03CADD|$0F:$CACD:99 2B 05 STA $052B,Y 0x03CAE0|$0F:$CAD0:A9 87 LDA #$87 ; Music ID #$87: hit 2 SFX 0x03CAE2|$0F:$CAD2:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03CAE5|$0F:$CAD5:A9 F8 LDA #$F8 0x03CAE7|$0F:$CAD7:85 18 STA $18 0x03CAE9|$0F:$CAD9:A9 00 LDA #$00 0x03CAEB|$0F:$CADB:85 19 STA $19 0x03CAED|$0F:$CADD:85 1E STA $1E 0x03CAEF|$0F:$CADF:85 1C STA $1C 0x03CAF1|$0F:$CAE1:20 C5 DE JSR $DEC5 0x03CAF4|$0F:$CAE4:A2 0A LDX #$0A 0x03CAF6|$0F:$CAE6:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03CAF9|$0F:$CAE9:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CAFC|$0F:$CAEC:85 ; indirect data load target 0x03CAFD|$0F:$CAED:21 ; indirect data load target 0x03CAFE|$0F:$CAEE:4F 80 ; $07:$804F; motion script for Saber Lion, Osterfair ; data -> code 0x03CB00|$0F:$CAF0:20 D2 CC JSR $CCD2 ; execute scripted motion 0x03CB03|$0F:$CAF3:A9 FF LDA #$FF 0x03CB05|$0F:$CAF5:8D 81 05 STA $0581 ; NPC #$08 sprite ID 0x03CB08|$0F:$CAF8:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CB0A|$0F:$CAFA:A9 02 LDA #$02 ; Fixed Battle #$02: 1 Saber Lion (Map ID #$0F: Osterfair) 0x03CB0C|$0F:$CAFC:20 5C D2 JSR $D25C ; trigger fixed battle A 0x03CB0F|$0F:$CAFF:4C FB D2 JMP $D2FB ; load ROM bank 6 ; control flow target (from $CAB5) 0x03CB12|$0F:$CB02:C9 09 CMP #$09 0x03CB14|$0F:$CB04:D0 36 BNE $CB3C 0x03CB16|$0F:$CB06:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CB19|$0F:$CB09:13 ; indirect data load target 0x03CB1A|$0F:$CB0A:08 ; data -> code 0x03CB1B|$0F:$CB0B:D0 09 BNE $CB16 0x03CB1D|$0F:$CB0D:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CB20|$0F:$CB10:85 ; indirect data load target 0x03CB21|$0F:$CB11:20 ; indirect data load target 0x03CB22|$0F:$CB12:55 80 ; $07:$8055; motion script for Cannock and Moonbrooke, ending part 3, dog in Zahan, triggered from right ; data -> code 0x03CB24|$0F:$CB14:90 15 BCC $CB2B ; control flow target (from $CB0B) 0x03CB26|$0F:$CB16:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CB29|$0F:$CB19:12 ; indirect data load target 0x03CB2A|$0F:$CB1A:07 ; data -> code 0x03CB2B|$0F:$CB1B:F0 07 BEQ $CB24 0x03CB2D|$0F:$CB1D:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CB30|$0F:$CB20:11 ; indirect data load target 0x03CB31|$0F:$CB21:08 ; data -> code 0x03CB32|$0F:$CB22:D0 15 BNE $CB39 ; control flow target (from $CB1B) 0x03CB34|$0F:$CB24:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CB37|$0F:$CB27:85 ; indirect data load target 0x03CB38|$0F:$CB28:21 ; indirect data load target 0x03CB39|$0F:$CB29:51 80 ; $07:$8051; motion script for dog in Zahan, triggered from left/top ; data -> code ; control flow target (from $CB14) 0x03CB3B|$0F:$CB2B:20 D2 CC JSR $CCD2 ; execute scripted motion 0x03CB3E|$0F:$CB2E:20 F6 F6 JSR $F6F6 ; open main dialogue window and display string ID specified by byte following JSR + #$0200 ; code -> data ; indirect data load target 0x03CB41|$0F:$CB31:D0 ; String ID #$02D0: ‘Bow-wow-wow!’[end-FC] ; data -> code 0x03CB42|$0F:$CB32:A9 FF LDA #$FF 0x03CB44|$0F:$CB34:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CB46|$0F:$CB36:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 ; control flow target (from $CB22, $CB52) 0x03CB49|$0F:$CB39:4C 00 C7 JMP $C700 ; control flow target (from $CB04) 0x03CB4C|$0F:$CB3C:C9 0A CMP #$0A 0x03CB4E|$0F:$CB3E:D0 22 BNE $CB62 0x03CB50|$0F:$CB40:A5 31 LDA $31 ; current map ID 0x03CB52|$0F:$CB42:C9 56 CMP #$56 ; Map ID #$56: Lighthouse 7F 0x03CB54|$0F:$CB44:D0 19 BNE $CB5F 0x03CB56|$0F:$CB46:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CB59|$0F:$CB49:0A ; indirect data load target 0x03CB5A|$0F:$CB4A:04 ; data -> code 0x03CB5B|$0F:$CB4B:F0 07 BEQ $CB54 0x03CB5D|$0F:$CB4D:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CB60|$0F:$CB50:0B ; indirect data load target 0x03CB61|$0F:$CB51:04 ; data -> code 0x03CB62|$0F:$CB52:D0 E5 BNE $CB39 ; control flow target (from $CB4B) 0x03CB64|$0F:$CB54:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CB67|$0F:$CB57:81 ; indirect data load target 0x03CB68|$0F:$CB58:22 ; indirect data load target 0x03CB69|$0F:$CB59:4A 80 ; $07:$804A; motion script for King Midenhall, Lighthouse Wizard part 1 ; data -> code 0x03CB6B|$0F:$CB5B:A9 0B LDA #$0B 0x03CB6D|$0F:$CB5D:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) ; control flow target (from $CB44, $CB6B, $CB76, $CB80, $CB8E) 0x03CB6F|$0F:$CB5F:4C 00 C7 JMP $C700 ; control flow target (from $CB3E) 0x03CB72|$0F:$CB62:C9 0B CMP #$0B 0x03CB74|$0F:$CB64:D0 12 BNE $CB78 0x03CB76|$0F:$CB66:AD 60 05 LDA $0560 ; NPC #$04 motion nybble + direction nybble 0x03CB79|$0F:$CB69:29 F0 AND #$F0 0x03CB7B|$0F:$CB6B:D0 F2 BNE $CB5F 0x03CB7D|$0F:$CB6D:A9 FF LDA #$FF 0x03CB7F|$0F:$CB6F:8D 61 05 STA $0561 ; NPC #$04 sprite ID 0x03CB82|$0F:$CB72:A9 0C LDA #$0C 0x03CB84|$0F:$CB74:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CB86|$0F:$CB76:D0 E7 BNE $CB5F ; control flow target (from $CB64) 0x03CB88|$0F:$CB78:C9 0C CMP #$0C 0x03CB8A|$0F:$CB7A:D0 29 BNE $CBA5 0x03CB8C|$0F:$CB7C:A5 31 LDA $31 ; current map ID 0x03CB8E|$0F:$CB7E:C9 56 CMP #$56 ; Map ID #$56: Lighthouse 7F 0x03CB90|$0F:$CB80:D0 DD BNE $CB5F 0x03CB92|$0F:$CB82:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CB95|$0F:$CB85:0E ; indirect data load target 0x03CB96|$0F:$CB86:09 ; data -> code 0x03CB97|$0F:$CB87:F0 07 BEQ $CB90 0x03CB99|$0F:$CB89:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CB9C|$0F:$CB8C:0F ; indirect data load target 0x03CB9D|$0F:$CB8D:09 ; data -> code 0x03CB9E|$0F:$CB8E:D0 CF BNE $CB5F ; control flow target (from $CB87) 0x03CBA0|$0F:$CB90:20 EA F6 JSR $F6EA ; open main dialogue window and display string ID specified by byte following JSR ; code -> data ; indirect data load target 0x03CBA3|$0F:$CB93:66 ; String ID #$0066: ‘Thou need not speak for I know thy mind well[.’][wait][line]‘Come, follow me[.’][wait][line]‘I will guide thee to the place where thou shall find the Crest[.’][end-FC] ; data -> code 0x03CBA4|$0F:$CB94:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03CBA7|$0F:$CB97:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CBAA|$0F:$CB9A:80 ; indirect data load target 0x03CBAB|$0F:$CB9B:22 ; indirect data load target 0x03CBAC|$0F:$CB9C:59 80 ; $07:$8059; motion script for Lighthouse Wizard part 2 ; data -> code 0x03CBAE|$0F:$CB9E:A9 0D LDA #$0D 0x03CBB0|$0F:$CBA0:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CBB2|$0F:$CBA2:4C 00 C7 JMP $C700 ; control flow target (from $CB7A) 0x03CBB5|$0F:$CBA5:A0 00 LDY #$00 ; control flow target (from $CBE2) 0x03CBB7|$0F:$CBA7:D9 AF CC CMP $CCAF,Y 0x03CBBA|$0F:$CBAA:D0 33 BNE $CBDF 0x03CBBC|$0F:$CBAC:A5 31 LDA $31 ; current map ID 0x03CBBE|$0F:$CBAE:D9 B4 CC CMP $CCB4,Y 0x03CBC1|$0F:$CBB1:D0 29 BNE $CBDC 0x03CBC3|$0F:$CBB3:A5 16 LDA $16 ; current map X-pos (1) 0x03CBC5|$0F:$CBB5:D9 B9 CC CMP $CCB9,Y 0x03CBC8|$0F:$CBB8:90 22 BCC $CBDC 0x03CBCA|$0F:$CBBA:D9 BE CC CMP $CCBE,Y 0x03CBCD|$0F:$CBBD:B0 1D BCS $CBDC 0x03CBCF|$0F:$CBBF:A5 17 LDA $17 ; current map Y-pos (1) 0x03CBD1|$0F:$CBC1:D9 C3 CC CMP $CCC3,Y 0x03CBD4|$0F:$CBC4:90 16 BCC $CBDC 0x03CBD6|$0F:$CBC6:D9 C8 CC CMP $CCC8,Y 0x03CBD9|$0F:$CBC9:B0 11 BCS $CBDC 0x03CBDB|$0F:$CBCB:AD 58 05 LDA $0558 ; NPC #$03 motion nybble + direction nybble 0x03CBDE|$0F:$CBCE:29 F0 AND #$F0 0x03CBE0|$0F:$CBD0:D0 0A BNE $CBDC 0x03CBE2|$0F:$CBD2:A9 FF LDA #$FF 0x03CBE4|$0F:$CBD4:8D 59 05 STA $0559 ; NPC #$03 sprite ID 0x03CBE7|$0F:$CBD7:B9 CD CC LDA $CCCD,Y 0x03CBEA|$0F:$CBDA:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) ; control flow target (from $CBB1, $CBB8, $CBBD, $CBC4, $CBC9, $CBD0, $CBEC, $CBFA) 0x03CBEC|$0F:$CBDC:4C 00 C7 JMP $C700 ; control flow target (from $CBAA) 0x03CBEF|$0F:$CBDF:C8 INY 0x03CBF0|$0F:$CBE0:C0 05 CPY #$05 0x03CBF2|$0F:$CBE2:D0 C3 BNE $CBA7 0x03CBF4|$0F:$CBE4:C9 17 CMP #$17 0x03CBF6|$0F:$CBE6:D0 78 BNE $CC60 0x03CBF8|$0F:$CBE8:A5 31 LDA $31 ; current map ID 0x03CBFA|$0F:$CBEA:C9 51 CMP #$51 ; Map ID #$51: Lighthouse 2F 0x03CBFC|$0F:$CBEC:D0 EE BNE $CBDC 0x03CBFE|$0F:$CBEE:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CC01|$0F:$CBF1:1C ; indirect data load target 0x03CC02|$0F:$CBF2:1F ; data -> code 0x03CC03|$0F:$CBF3:F0 07 BEQ $CBFC 0x03CC05|$0F:$CBF5:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CC08|$0F:$CBF8:1D ; indirect data load target 0x03CC09|$0F:$CBF9:1F ; data -> code 0x03CC0A|$0F:$CBFA:D0 E0 BNE $CBDC ; control flow target (from $CBF3) 0x03CC0C|$0F:$CBFC:20 EA F6 JSR $F6EA ; open main dialogue window and display string ID specified by byte following JSR ; code -> data ; indirect data load target 0x03CC0F|$0F:$CBFF:67 ; String ID #$0067: ‘Open now the treasure chest[.’][end-FC] ; data -> code 0x03CC10|$0F:$CC00:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03CC13|$0F:$CC03:A9 1B LDA #$1B 0x03CC15|$0F:$CC05:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CC17|$0F:$CC07:4C 00 C7 JMP $C700 ; trigger Stars Crest battle ; external control flow target (from $06:$9BA0) 0x03CC1A|$0F:$CC0A:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x03CC1D|$0F:$CC0D:69 ; String ID #$0069: [wait]‘Haha! Into my trap thou hast stepped! It shall be thy last[.’][end-FC] ; data -> code 0x03CC1E|$0F:$CC0E:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03CC21|$0F:$CC11:A9 05 LDA #$05 0x03CC23|$0F:$CC13:A0 2F LDY #$2F 0x03CC25|$0F:$CC15:20 5C CD JSR $CD5C 0x03CC28|$0F:$CC18:A9 05 LDA #$05 0x03CC2A|$0F:$CC1A:A0 27 LDY #$27 0x03CC2C|$0F:$CC1C:20 5C CD JSR $CD5C 0x03CC2F|$0F:$CC1F:A9 05 LDA #$05 0x03CC31|$0F:$CC21:A0 37 LDY #$37 0x03CC33|$0F:$CC23:20 5C CD JSR $CD5C 0x03CC36|$0F:$CC26:A9 FF LDA #$FF 0x03CC38|$0F:$CC28:8D 59 05 STA $0559 ; NPC #$03 sprite ID 0x03CC3B|$0F:$CC2B:8D 61 05 STA $0561 ; NPC #$04 sprite ID 0x03CC3E|$0F:$CC2E:8D 69 05 STA $0569 ; NPC #$05 sprite ID 0x03CC41|$0F:$CC31:8D 71 05 STA $0571 ; NPC #$06 sprite ID 0x03CC44|$0F:$CC34:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CC46|$0F:$CC36:A9 05 LDA #$05 ; Fixed Battle #$05: 4 Gremlins (Map ID #$51: Lighthouse 2F) 0x03CC48|$0F:$CC38:20 5C D2 JSR $D25C ; trigger fixed battle A 0x03CC4B|$0F:$CC3B:A5 98 LDA $98 ; outcome of last fight? 0x03CC4D|$0F:$CC3D:C9 FC CMP #$FC 0x03CC4F|$0F:$CC3F:F0 1B BEQ $CC5C 0x03CC51|$0F:$CC41:AD 12 01 LDA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x03CC54|$0F:$CC44:29 02 AND #$02 0x03CC56|$0F:$CC46:D0 14 BNE $CC5C 0x03CC58|$0F:$CC48:A2 46 LDX #$46 0x03CC5A|$0F:$CC4A:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03CC5D|$0F:$CC4D:20 F6 F6 JSR $F6F6 ; open main dialogue window and display string ID specified by byte following JSR + #$0200 ; code -> data ; indirect data load target 0x03CC60|$0F:$CC50:32 ; String ID #$0232: Thou hast found the Stars Crest.[end-FC] ; data -> code 0x03CC61|$0F:$CC51:AD 12 01 LDA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x03CC64|$0F:$CC54:09 02 ORA #$02 0x03CC66|$0F:$CC56:8D 12 01 STA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x03CC69|$0F:$CC59:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 ; control flow target (from $CC3F, $CC46) 0x03CC6C|$0F:$CC5C:60 RTS ; control flow target (from $CC70, $CC99) 0x03CC6D|$0F:$CC5D:4C 00 C7 JMP $C700 ; control flow target (from $CBE6) 0x03CC70|$0F:$CC60:C9 18 CMP #$18 0x03CC72|$0F:$CC62:D0 33 BNE $CC97 0x03CC74|$0F:$CC64:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CC77|$0F:$CC67:10 ; indirect data load target 0x03CC78|$0F:$CC68:0C ; data -> code 0x03CC79|$0F:$CC69:F0 07 BEQ $CC72 0x03CC7B|$0F:$CC6B:20 26 CD JSR $CD26 ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; code -> data ; indirect data load target 0x03CC7E|$0F:$CC6E:10 ; indirect data load target 0x03CC7F|$0F:$CC6F:0D ; data -> code 0x03CC80|$0F:$CC70:D0 EB BNE $CC5D ; control flow target (from $CC69) 0x03CC82|$0F:$CC72:20 EA F6 JSR $F6EA ; open main dialogue window and display string ID specified by byte following JSR ; code -> data ; indirect data load target 0x03CC85|$0F:$CC75:6C ; String ID #$006C: ‘Such rudeness in a Wizard's Home is not acceptable[.’][wait][line]‘Perhaps I should turn thee into a frog!’[end-FC] ; data -> code 0x03CC86|$0F:$CC76:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03CC89|$0F:$CC79:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CC8C|$0F:$CC7C:81 ; indirect data load target 0x03CC8D|$0F:$CC7D:23 ; indirect data load target 0x03CC8E|$0F:$CC7E:CB 80 ; $07:$80CB; motion script for Evil Clown #1, Sea Cave B5 ; data -> code 0x03CC90|$0F:$CC80:A9 05 LDA #$05 0x03CC92|$0F:$CC82:8D 61 05 STA $0561 ; NPC #$04 sprite ID 0x03CC95|$0F:$CC85:20 D2 CC JSR $CCD2 ; execute scripted motion 0x03CC98|$0F:$CC88:A9 FF LDA #$FF 0x03CC9A|$0F:$CC8A:8D 59 05 STA $0559 ; NPC #$03 sprite ID 0x03CC9D|$0F:$CC8D:8D 61 05 STA $0561 ; NPC #$04 sprite ID 0x03CCA0|$0F:$CC90:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CCA2|$0F:$CC92:A9 06 LDA #$06 ; Fixed Battle #$06: 2 Evil Clown (Map ID #$33: Sea Cave B5) 0x03CCA4|$0F:$CC94:20 5C D2 JSR $D25C ; trigger fixed battle A ; control flow target (from $CC62) 0x03CCA7|$0F:$CC97:C9 64 CMP #$64 0x03CCA9|$0F:$CC99:D0 C2 BNE $CC5D 0x03CCAB|$0F:$CC9B:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03CCAE|$0F:$CC9E:A0 ; $06:$8040 ; data -> code 0x03CCAF|$0F:$CC9F:4C 00 C7 JMP $C700 ; external control flow target (from $06:$90C6) 0x03CCB2|$0F:$CCA2:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CCB5|$0F:$CCA5:89 ; indirect data load target 0x03CCB6|$0F:$CCA6:20 ; indirect data load target 0x03CCB7|$0F:$CCA7:40 80 ; $07:$8040; motion script for grandfather in Lianport, part 3 ; data -> code 0x03CCB9|$0F:$CCA9:20 D2 CC JSR $CCD2 ; execute scripted motion 0x03CCBC|$0F:$CCAC:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; code -> data ; indexed data load target (from $CBA7) 0x03CCBF|$0F:$CCAF:0D 0x03CCC0|$0F:$CCB0:0F 0x03CCC1|$0F:$CCB1:11 0x03CCC2|$0F:$CCB2:13 0x03CCC3|$0F:$CCB3:15 ; indexed data load target (from $CBAE) ; indirect data load target 0x03CCC4|$0F:$CCB4:56 ; Map ID #$56: Lighthouse 7F ; indirect data load target 0x03CCC5|$0F:$CCB5:55 ; Map ID #$55: Lighthouse 6F ; indirect data load target 0x03CCC6|$0F:$CCB6:54 ; Map ID #$54: Lighthouse 5F ; indirect data load target 0x03CCC7|$0F:$CCB7:53 ; Map ID #$53: Lighthouse 4F ; indirect data load target 0x03CCC8|$0F:$CCB8:52 ; Map ID #$52: Lighthouse 3F ; indexed data load target (from $CBB5) ; indirect data load target 0x03CCC9|$0F:$CCB9:00 ; indirect data load target 0x03CCCA|$0F:$CCBA:10 ; indirect data load target 0x03CCCB|$0F:$CCBB:1A ; indirect data load target 0x03CCCC|$0F:$CCBC:16 ; indirect data load target 0x03CCCD|$0F:$CCBD:1E ; indexed data load target (from $CBBA) ; indirect data load target 0x03CCCE|$0F:$CCBE:03 ; indirect data load target 0x03CCCF|$0F:$CCBF:14 ; indirect data load target 0x03CCD0|$0F:$CCC0:1C ; indirect data load target 0x03CCD1|$0F:$CCC1:19 ; indirect data load target 0x03CCD2|$0F:$CCC2:20 ; indexed data load target (from $CBC1) ; indirect data load target 0x03CCD3|$0F:$CCC3:11 ; indirect data load target 0x03CCD4|$0F:$CCC4:1A ; indirect data load target 0x03CCD5|$0F:$CCC5:0E ; indirect data load target 0x03CCD6|$0F:$CCC6:19 ; indirect data load target 0x03CCD7|$0F:$CCC7:16 ; indexed data load target (from $CBC6) ; indirect data load target 0x03CCD8|$0F:$CCC8:14 ; indirect data load target 0x03CCD9|$0F:$CCC9:1C ; indirect data load target 0x03CCDA|$0F:$CCCA:12 ; indirect data load target 0x03CCDB|$0F:$CCCB:1C ; indirect data load target 0x03CCDC|$0F:$CCCC:1A ; indexed data load target (from $CBD7) ; indirect data load target 0x03CCDD|$0F:$CCCD:0E ; indirect data load target 0x03CCDE|$0F:$CCCE:10 ; indirect data load target 0x03CCDF|$0F:$CCCF:12 ; indirect data load target 0x03CCE0|$0F:$CCD0:14 ; indirect data load target 0x03CCE1|$0F:$CCD1:16 ; data -> code ; execute scripted motion ; control flow target (from $C836, $C864, $C93D, $C959, $CA0C, $CA32, $CA43, $CAF0, $CB2B, $CC85, $CCA9, $CCE7, $FF84) ; external control flow target (from $06:$BB3A) 0x03CCE2|$0F:$CCD2:A5 35 LDA $35 ; flag indicating whether any menu is currently open 0x03CCE4|$0F:$CCD4:48 PHA 0x03CCE5|$0F:$CCD5:A9 00 LDA #$00 0x03CCE7|$0F:$CCD7:85 35 STA $35 ; flag indicating whether any menu is currently open ; control flow target (from $CCE1) 0x03CCE9|$0F:$CCD9:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03CCEC|$0F:$CCDC:20 CB D8 JSR $D8CB 0x03CCEF|$0F:$CCDF:A5 38 LDA $38 0x03CCF1|$0F:$CCE1:30 F6 BMI $CCD9 0x03CCF3|$0F:$CCE3:68 PLA 0x03CCF4|$0F:$CCE4:85 35 STA $35 ; flag indicating whether any menu is currently open 0x03CCF6|$0F:$CCE6:60 RTS ; external control flow target (from $06:$BB91, $06:$BBA5) 0x03CCF7|$0F:$CCE7:20 D2 CC JSR $CCD2 ; execute scripted motion 0x03CCFA|$0F:$CCEA:A9 06 LDA #$06 0x03CCFC|$0F:$CCEC:85 94 STA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03CCFE|$0F:$CCEE:4C D5 C3 JMP $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; control flow target (from $C82F, $C85D, $C932, $C94B, $C952, $C9B2, $C9FC, $CA05, $CA15, $CA22, $CA2B, $CA3C, $CA5F, $CA66, $CAE9, $CB0D, $CB24, $CB54, $CB97, $CC79, $CCA2, $CEC2) ; external control flow target (from $06:$BACC, $06:$BAD5, $06:$BADF, $06:$BB83, $06:$BB8A, $06:$BB97, $06:$BB9E, $07:$822A, $07:$823B, $07:$8271, $07:$82CB, $07:$82EE, $07:$8329, $07:$8358, $07:$836D, $07:$837E, $07:$83F4, $07:$845C, $07:$8495, $07:$84CE, $07:$84EF, $07:$84FC, $07:$8515, $07:$852C, $07:$8559, $07:$8571, $07:$8578, $07:$85B3, $07:$85BA, $07:$85E7) 0x03CD01|$0F:$CCF1:68 PLA ; return address low byte 0x03CD02|$0F:$CCF2:85 0C STA $0C ; return address low byte 0x03CD04|$0F:$CCF4:68 PLA ; return address high byte 0x03CD05|$0F:$CCF5:85 0D STA $0D ; return address high byte 0x03CD07|$0F:$CCF7:A0 01 LDY #$01 0x03CD09|$0F:$CCF9:B1 0C LDA ($0C),Y ; data byte 0 0x03CD0B|$0F:$CCFB:85 38 STA $38 0x03CD0D|$0F:$CCFD:29 7F AND #$7F ; useless op 0x03CD0F|$0F:$CCFF:0A ASL 0x03CD10|$0F:$CD00:0A ASL 0x03CD11|$0F:$CD01:0A ASL 0x03CD12|$0F:$CD02:AA TAX 0x03CD13|$0F:$CD03:C8 INY 0x03CD14|$0F:$CD04:B1 0C LDA ($0C),Y ; data byte 1 0x03CD16|$0F:$CD06:9D 58 05 STA $0558,X ; NPC #$03 motion nybble + direction nybble 0x03CD19|$0F:$CD09:C8 INY 0x03CD1A|$0F:$CD0A:B1 0C LDA ($0C),Y ; data byte 2 0x03CD1C|$0F:$CD0C:9D 52 05 STA $0552,X ; NPC #$02 scripted motion low byte 0x03CD1F|$0F:$CD0F:C8 INY 0x03CD20|$0F:$CD10:B1 0C LDA ($0C),Y ; data byte 3 0x03CD22|$0F:$CD12:9D 53 05 STA $0553,X ; NPC #$02 scripted motion high byte 0x03CD25|$0F:$CD15:A5 0C LDA $0C ; return address low byte 0x03CD27|$0F:$CD17:18 CLC 0x03CD28|$0F:$CD18:69 04 ADC #$04 ; 4 data bytes 0x03CD2A|$0F:$CD1A:85 0C STA $0C ; return address low byte 0x03CD2C|$0F:$CD1C:A5 0D LDA $0D ; return address high byte 0x03CD2E|$0F:$CD1E:69 00 ADC #$00 ; add carry from low byte 0x03CD30|$0F:$CD20:48 PHA ; return address high byte 0x03CD31|$0F:$CD21:A5 0C LDA $0C ; return address low byte 0x03CD33|$0F:$CD23:48 PHA ; return address low byte 0x03CD34|$0F:$CD24:18 CLC 0x03CD35|$0F:$CD25:60 RTS ; set Z if your current map position is the (X, Y) co-ordinates given by the next 2 bytes ; control flow target (from $C911, $C92B, $C9C7, $C9D2, $C9DD, $CA51, $CA58, $CA73, $CA7A, $CA81, $CA9E, $CB06, $CB16, $CB1D, $CB46, $CB4D, $CB82, $CB89, $CBEE, $CBF5, $CC64, $CC6B) ; external control flow target (from $06:$96B7, $06:$9793, $06:$BB3D) 0x03CD36|$0F:$CD26:68 PLA ; original return address, low byte 0x03CD37|$0F:$CD27:85 0C STA $0C ; original return address, low byte 0x03CD39|$0F:$CD29:18 CLC 0x03CD3A|$0F:$CD2A:69 02 ADC #$02 ; calls to this routine are followed by 2 bytes of data 0x03CD3C|$0F:$CD2C:85 0E STA $0E ; new return address, low byte 0x03CD3E|$0F:$CD2E:68 PLA ; original return address, high byte 0x03CD3F|$0F:$CD2F:85 0D STA $0D ; original return address, high byte 0x03CD41|$0F:$CD31:69 00 ADC #$00 ; add carry from low address 0x03CD43|$0F:$CD33:48 PHA ; new return address, high byte 0x03CD44|$0F:$CD34:A5 0E LDA $0E ; new return address, low byte 0x03CD46|$0F:$CD36:48 PHA ; new return address, low byte 0x03CD47|$0F:$CD37:A0 01 LDY #$01 ; 1 byte after the original return address 0x03CD49|$0F:$CD39:A5 16 LDA $16 ; current map X-pos (1) 0x03CD4B|$0F:$CD3B:D1 0C CMP ($0C),Y 0x03CD4D|$0F:$CD3D:D0 05 BNE $CD44 ; not the same X-pos => Z not set 0x03CD4F|$0F:$CD3F:A5 17 LDA $17 ; current map Y-pos (1) 0x03CD51|$0F:$CD41:C8 INY ; 2 bytes after the original return address 0x03CD52|$0F:$CD42:D1 0C CMP ($0C),Y ; set or clear Z based on whether your Y-pos matches ; control flow target (from $CD3D) 0x03CD54|$0F:$CD44:60 RTS ; external control flow target (from $06:$971D) 0x03CD55|$0F:$CD45:20 51 CD JSR $CD51 ; control flow target (from $CD4E) 0x03CD58|$0F:$CD48:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; external control flow target (from $06:$9724) 0x03CD5B|$0F:$CD4B:20 5C CD JSR $CD5C 0x03CD5E|$0F:$CD4E:4C 48 CD JMP $CD48 ; control flow target (from $CD45) 0x03CD61|$0F:$CD51:85 C9 STA $C9 0x03CD63|$0F:$CD53:84 97 STY $97 ; subject hero ID $97 0x03CD65|$0F:$CD55:A9 FF LDA #$FF 0x03CD67|$0F:$CD57:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs 0x03CD69|$0F:$CD59:4C 64 CD JMP $CD64 ; control flow target (from $CC15, $CC1C, $CC23, $CD4B) 0x03CD6C|$0F:$CD5C:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs 0x03CD6E|$0F:$CD5E:84 97 STY $97 ; subject hero ID $97 0x03CD70|$0F:$CD60:A9 FF LDA #$FF 0x03CD72|$0F:$CD62:85 C9 STA $C9 ; control flow target (from $CD59) 0x03CD74|$0F:$CD64:A9 01 LDA #$01 0x03CD76|$0F:$CD66:85 49 STA $49 ; object hero/target/item/string ID $49 ; control flow target (from $CD8C) 0x03CD78|$0F:$CD68:A5 C9 LDA $C9 0x03CD7A|$0F:$CD6A:A4 97 LDY $97 ; subject hero ID $97 0x03CD7C|$0F:$CD6C:99 3A 05 STA $053A,Y 0x03CD7F|$0F:$CD6F:20 CB D8 JSR $D8CB 0x03CD82|$0F:$CD72:A2 04 LDX #$04 0x03CD84|$0F:$CD74:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03CD87|$0F:$CD77:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x03CD89|$0F:$CD79:A4 97 LDY $97 ; subject hero ID $97 0x03CD8B|$0F:$CD7B:99 3A 05 STA $053A,Y 0x03CD8E|$0F:$CD7E:20 CB D8 JSR $D8CB 0x03CD91|$0F:$CD81:A6 49 LDX $49 ; object hero/target/item/string ID $49 0x03CD93|$0F:$CD83:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03CD96|$0F:$CD86:E6 49 INC $49 ; object hero/target/item/string ID $49 0x03CD98|$0F:$CD88:A5 49 LDA $49 ; object hero/target/item/string ID $49 0x03CD9A|$0F:$CD8A:C9 08 CMP #$08 0x03CD9C|$0F:$CD8C:90 DA BCC $CD68 0x03CD9E|$0F:$CD8E:60 RTS ; control flow target (from $E56C) 0x03CD9F|$0F:$CD8F:A5 31 LDA $31 ; current map ID 0x03CDA1|$0F:$CD91:C9 01 CMP #$01 ; Map ID #$01: World Map 0x03CDA3|$0F:$CD93:D0 05 BNE $CD9A ; control flow target (from $CDAA, $CDB8) 0x03CDA5|$0F:$CD95:A9 FF LDA #$FF 0x03CDA7|$0F:$CD97:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CDA9|$0F:$CD99:60 RTS ; control flow target (from $CD93) 0x03CDAA|$0F:$CD9A:C9 0B CMP #$0B ; Map ID #$0B: Lianport 0x03CDAC|$0F:$CD9C:D0 13 BNE $CDB1 0x03CDAE|$0F:$CD9E:A5 CF LDA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x03CDB0|$0F:$CDA0:F0 0A BEQ $CDAC 0x03CDB2|$0F:$CDA2:A9 FF LDA #$FF 0x03CDB4|$0F:$CDA4:8D 89 05 STA $0589 ; NPC #$09 sprite ID 0x03CDB7|$0F:$CDA7:8D 91 05 STA $0591 ; NPC #$0A sprite ID 0x03CDBA|$0F:$CDAA:D0 E9 BNE $CD95 ; control flow target (from $CDA0) 0x03CDBC|$0F:$CDAC:A9 00 LDA #$00 0x03CDBE|$0F:$CDAE:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CDC0|$0F:$CDB0:60 RTS ; control flow target (from $CD9C) 0x03CDC1|$0F:$CDB1:C9 1A CMP #$1A ; Map ID #$1A: Shrine SW of Cannock 0x03CDC3|$0F:$CDB3:D0 0A BNE $CDBF 0x03CDC5|$0F:$CDB5:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x03CDC8|$0F:$CDB8:D0 DB BNE $CD95 0x03CDCA|$0F:$CDBA:A9 02 LDA #$02 0x03CDCC|$0F:$CDBC:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CDCE|$0F:$CDBE:60 RTS ; control flow target (from $CDB3) 0x03CDCF|$0F:$CDBF:C9 02 CMP #$02 ; Map ID #$02: Midenhall 2F 0x03CDD1|$0F:$CDC1:D0 10 BNE $CDD3 0x03CDD3|$0F:$CDC3:A5 44 LDA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CDD5|$0F:$CDC5:C9 04 CMP #$04 0x03CDD7|$0F:$CDC7:F0 04 BEQ $CDCD 0x03CDD9|$0F:$CDC9:C9 05 CMP #$05 0x03CDDB|$0F:$CDCB:D0 29 BNE $CDF6 ; control flow target (from $CDC7) 0x03CDDD|$0F:$CDCD:A9 FF LDA #$FF 0x03CDDF|$0F:$CDCF:8D 61 05 STA $0561 ; NPC #$04 sprite ID 0x03CDE2|$0F:$CDD2:60 RTS ; control flow target (from $CDC1) 0x03CDE3|$0F:$CDD3:C9 03 CMP #$03 ; Map ID #$03: Midenhall 1F 0x03CDE5|$0F:$CDD5:D0 24 BNE $CDFB 0x03CDE7|$0F:$CDD7:A5 44 LDA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CDE9|$0F:$CDD9:C9 04 CMP #$04 0x03CDEB|$0F:$CDDB:F0 18 BEQ $CDF5 0x03CDED|$0F:$CDDD:C9 05 CMP #$05 0x03CDEF|$0F:$CDDF:F0 14 BEQ $CDF5 0x03CDF1|$0F:$CDE1:A9 FF LDA #$FF 0x03CDF3|$0F:$CDE3:8D C1 05 STA $05C1 ; NPC #$10 sprite ID 0x03CDF6|$0F:$CDE6:AD AD 61 LDA $61AD 0x03CDF9|$0F:$CDE9:D0 0A BNE $CDF5 0x03CDFB|$0F:$CDEB:A9 0E LDA #$0E 0x03CDFD|$0F:$CDED:8D 1A 05 STA $051A ; something to do with whether you've opened the chest containing the Shield of Erdrick 0x03CE00|$0F:$CDF0:A9 02 LDA #$02 0x03CE02|$0F:$CDF2:8D 1B 05 STA $051B ; control flow target (from $CDDB, $CDDF, $CDE9) 0x03CE05|$0F:$CDF5:60 RTS ; control flow target (from $CDCB, $CE0A) 0x03CE06|$0F:$CDF6:A9 FF LDA #$FF 0x03CE08|$0F:$CDF8:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CE0A|$0F:$CDFA:60 RTS ; control flow target (from $CDD5) 0x03CE0B|$0F:$CDFB:C9 05 CMP #$05 ; Map ID #$05: Leftwyne 0x03CE0D|$0F:$CDFD:D0 13 BNE $CE12 0x03CE0F|$0F:$CDFF:AD 3F 06 LDA $063F ; Cannock status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03CE12|$0F:$CE02:29 04 AND #$04 0x03CE14|$0F:$CE04:D0 06 BNE $CE0C 0x03CE16|$0F:$CE06:A5 CA LDA $CA ; Cannock runaround quest status (0 = start of game, 0 -> 1 = talked to King Cannock, 1 -> 2 = said YES to seeking Cannock in Spring of Bravery, 2 -> 3 = talked to King Midenhall; adding Cannock sets this to 3; some code checks for 4) 0x03CE18|$0F:$CE08:C9 02 CMP #$02 0x03CE1A|$0F:$CE0A:B0 EA BCS $CDF6 ; control flow target (from $CE04) 0x03CE1C|$0F:$CE0C:A9 FF LDA #$FF 0x03CE1E|$0F:$CE0E:8D C1 05 STA $05C1 ; NPC #$10 sprite ID 0x03CE21|$0F:$CE11:60 RTS ; control flow target (from $CDFD) 0x03CE22|$0F:$CE12:C9 0F CMP #$0F ; Map ID #$0F: Osterfair 0x03CE24|$0F:$CE14:D0 05 BNE $CE1B 0x03CE26|$0F:$CE16:A9 00 LDA #$00 0x03CE28|$0F:$CE18:85 98 STA $98 ; outcome of last fight? 0x03CE2A|$0F:$CE1A:60 RTS ; control flow target (from $CE14) 0x03CE2B|$0F:$CE1B:C9 10 CMP #$10 ; Map ID #$10: Zahan 0x03CE2D|$0F:$CE1D:D0 05 BNE $CE24 0x03CE2F|$0F:$CE1F:A9 09 LDA #$09 0x03CE31|$0F:$CE21:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CE33|$0F:$CE23:60 RTS ; control flow target (from $CE1D) 0x03CE34|$0F:$CE24:C9 20 CMP #$20 ; Map ID #$20: Shrine SW of Moonbrooke 0x03CE36|$0F:$CE26:D0 18 BNE $CE40 0x03CE38|$0F:$CE28:A0 00 LDY #$00 ; control flow target (from $CE38) 0x03CE3A|$0F:$CE2A:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03CE3D|$0F:$CE2D:29 04 AND #$04 0x03CE3F|$0F:$CE2F:F0 0E BEQ $CE3F 0x03CE41|$0F:$CE31:98 TYA 0x03CE42|$0F:$CE32:18 CLC 0x03CE43|$0F:$CE33:69 12 ADC #$12 0x03CE45|$0F:$CE35:A8 TAY 0x03CE46|$0F:$CE36:C9 36 CMP #$36 0x03CE48|$0F:$CE38:D0 F0 BNE $CE2A 0x03CE4A|$0F:$CE3A:A9 06 LDA #$06 0x03CE4C|$0F:$CE3C:8D 54 05 STA $0554 ; NPC #$03 X-pos ; control flow target (from $CE2F) 0x03CE4F|$0F:$CE3F:60 RTS ; control flow target (from $CE26) 0x03CE50|$0F:$CE40:C9 57 CMP #$57 ; Map ID #$57: Lighthouse 8F 0x03CE52|$0F:$CE42:D0 01 BNE $CE45 0x03CE54|$0F:$CE44:60 RTS ; control flow target (from $CE42) 0x03CE55|$0F:$CE45:C9 56 CMP #$56 ; Map ID #$56: Lighthouse 7F 0x03CE57|$0F:$CE47:D0 3E BNE $CE87 0x03CE59|$0F:$CE49:AD 12 01 LDA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x03CE5C|$0F:$CE4C:29 02 AND #$02 0x03CE5E|$0F:$CE4E:D0 2C BNE $CE7C 0x03CE60|$0F:$CE50:A5 44 LDA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CE62|$0F:$CE52:C9 FF CMP #$FF 0x03CE64|$0F:$CE54:F0 04 BEQ $CE5A 0x03CE66|$0F:$CE56:C9 0A CMP #$0A 0x03CE68|$0F:$CE58:D0 05 BNE $CE5F ; control flow target (from $CE54) 0x03CE6A|$0F:$CE5A:A9 0A LDA #$0A 0x03CE6C|$0F:$CE5C:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CE6E|$0F:$CE5E:60 RTS ; control flow target (from $CE58) 0x03CE6F|$0F:$CE5F:C9 0B CMP #$0B 0x03CE71|$0F:$CE61:F0 1E BEQ $CE81 0x03CE73|$0F:$CE63:C9 0C CMP #$0C 0x03CE75|$0F:$CE65:F0 1A BEQ $CE81 0x03CE77|$0F:$CE67:C9 0D CMP #$0D 0x03CE79|$0F:$CE69:D0 11 BNE $CE7C 0x03CE7B|$0F:$CE6B:A9 00 LDA #$00 0x03CE7D|$0F:$CE6D:8D 54 05 STA $0554 ; NPC #$03 X-pos 0x03CE80|$0F:$CE70:A9 13 LDA #$13 0x03CE82|$0F:$CE72:8D 55 05 STA $0555 ; NPC #$03 Y-pos 0x03CE85|$0F:$CE75:A9 01 LDA #$01 0x03CE87|$0F:$CE77:8D 58 05 STA $0558 ; NPC #$03 motion nybble + direction nybble 0x03CE8A|$0F:$CE7A:D0 05 BNE $CE81 ; control flow target (from $CE4E, $CE69) 0x03CE8C|$0F:$CE7C:A9 FF LDA #$FF 0x03CE8E|$0F:$CE7E:8D 59 05 STA $0559 ; NPC #$03 sprite ID ; control flow target (from $CE61, $CE65, $CE7A) 0x03CE91|$0F:$CE81:A9 FF LDA #$FF 0x03CE93|$0F:$CE83:8D 61 05 STA $0561 ; NPC #$04 sprite ID 0x03CE96|$0F:$CE86:60 RTS ; control flow target (from $CE47) 0x03CE97|$0F:$CE87:A0 00 LDY #$00 ; control flow target (from $CEE2) 0x03CE99|$0F:$CE89:D9 2C CF CMP $CF2C,Y 0x03CE9C|$0F:$CE8C:D0 51 BNE $CEDF 0x03CE9E|$0F:$CE8E:A5 44 LDA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CEA0|$0F:$CE90:D9 31 CF CMP $CF31,Y 0x03CEA3|$0F:$CE93:D0 13 BNE $CEA8 0x03CEA5|$0F:$CE95:B9 36 CF LDA $CF36,Y 0x03CEA8|$0F:$CE98:8D 54 05 STA $0554 ; NPC #$03 X-pos 0x03CEAB|$0F:$CE9B:B9 3B CF LDA $CF3B,Y 0x03CEAE|$0F:$CE9E:8D 55 05 STA $0555 ; NPC #$03 Y-pos 0x03CEB1|$0F:$CEA1:B9 40 CF LDA $CF40,Y 0x03CEB4|$0F:$CEA4:8D 58 05 STA $0558 ; NPC #$03 motion nybble + direction nybble 0x03CEB7|$0F:$CEA7:60 RTS ; control flow target (from $CE93) 0x03CEB8|$0F:$CEA8:D9 45 CF CMP $CF45,Y 0x03CEBB|$0F:$CEAB:D0 2C BNE $CED9 0x03CEBD|$0F:$CEAD:A5 16 LDA $16 ; current map X-pos (1) 0x03CEBF|$0F:$CEAF:D9 4A CF CMP $CF4A,Y 0x03CEC2|$0F:$CEB2:D0 25 BNE $CED9 0x03CEC4|$0F:$CEB4:A5 17 LDA $17 ; current map Y-pos (1) 0x03CEC6|$0F:$CEB6:D9 4F CF CMP $CF4F,Y 0x03CEC9|$0F:$CEB9:D0 1E BNE $CED9 0x03CECB|$0F:$CEBB:B9 31 CF LDA $CF31,Y 0x03CECE|$0F:$CEBE:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CED0|$0F:$CEC0:98 TYA 0x03CED1|$0F:$CEC1:48 PHA 0x03CED2|$0F:$CEC2:20 F1 CC JSR $CCF1 ; set up scripted motion variables based on next 4 bytes (low 5 bits = NPC index, NPC index + 1's motion + direction byte?, 2-byte pointer to motion script) ; code -> data ; indirect data load target 0x03CED5|$0F:$CEC5:80 ; indirect data load target 0x03CED6|$0F:$CEC6:22 ; indirect data load target 0x03CED7|$0F:$CEC7:72 80 ; $07:$8072; motion script for Lighthouse Wizard part 3 ; data -> code 0x03CED9|$0F:$CEC9:68 PLA 0x03CEDA|$0F:$CECA:0A ASL 0x03CEDB|$0F:$CECB:A8 TAY 0x03CEDC|$0F:$CECC:B9 54 CF LDA $CF54,Y ; motion script pointers for Lighthouse Wizard 0x03CEDF|$0F:$CECF:8D 52 05 STA $0552 ; NPC #$02 scripted motion low byte 0x03CEE2|$0F:$CED2:B9 55 CF LDA $CF55,Y 0x03CEE5|$0F:$CED5:8D 53 05 STA $0553 ; NPC #$02 scripted motion high byte 0x03CEE8|$0F:$CED8:60 RTS ; control flow target (from $CEAB, $CEB2, $CEB9) 0x03CEE9|$0F:$CED9:A9 FF LDA #$FF 0x03CEEB|$0F:$CEDB:8D 59 05 STA $0559 ; NPC #$03 sprite ID ; control flow target (from $CEE6) 0x03CEEE|$0F:$CEDE:60 RTS ; control flow target (from $CE8C) 0x03CEEF|$0F:$CEDF:C8 INY 0x03CEF0|$0F:$CEE0:C0 05 CPY #$05 0x03CEF2|$0F:$CEE2:D0 A5 BNE $CE89 0x03CEF4|$0F:$CEE4:C9 50 CMP #$50 ; Map ID #$50: Lighthouse 1F 0x03CEF6|$0F:$CEE6:F0 F6 BEQ $CEDE 0x03CEF8|$0F:$CEE8:C9 33 CMP #$33 ; Map ID #$33: Sea Cave B5 0x03CEFA|$0F:$CEEA:D0 05 BNE $CEF1 0x03CEFC|$0F:$CEEC:A9 18 LDA #$18 0x03CEFE|$0F:$CEEE:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CF00|$0F:$CEF0:60 RTS ; control flow target (from $CEEA) 0x03CF01|$0F:$CEF1:C9 04 CMP #$04 ; Map ID #$04: Midenhall B1 0x03CF03|$0F:$CEF3:D0 0C BNE $CF01 0x03CF05|$0F:$CEF5:A5 D1 LDA $D1 ; fixed battle status bits (#$10 = Zarlox, #$08 = Bazuzu, #$04 = Atlas, #$02 = Hamlin Waterway Gremlins, #$01 = Evil Clown) 0x03CF07|$0F:$CEF7:4A LSR 0x03CF08|$0F:$CEF8:90 2D BCC $CF27 0x03CF0A|$0F:$CEFA:A9 FF LDA #$FF 0x03CF0C|$0F:$CEFC:8D 69 05 STA $0569 ; NPC #$05 sprite ID 0x03CF0F|$0F:$CEFF:D0 26 BNE $CF27 ; control flow target (from $CEF3) 0x03CF11|$0F:$CF01:C9 07 CMP #$07 ; Map ID #$07: Hamlin 0x03CF13|$0F:$CF03:D0 0E BNE $CF13 0x03CF15|$0F:$CF05:AD 51 06 LDA $0651 ; Moonbrooke status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03CF18|$0F:$CF08:29 04 AND #$04 ; In Party 0x03CF1A|$0F:$CF0A:F0 07 BEQ $CF13 0x03CF1C|$0F:$CF0C:A9 FF LDA #$FF 0x03CF1E|$0F:$CF0E:8D 59 05 STA $0559 ; NPC #$03 sprite ID 0x03CF21|$0F:$CF11:D0 14 BNE $CF27 ; control flow target (from $CF03, $CF0A) 0x03CF23|$0F:$CF13:C9 08 CMP #$08 ; Map ID #$08: Hamlin Waterway 0x03CF25|$0F:$CF15:D0 10 BNE $CF27 0x03CF27|$0F:$CF17:A5 D1 LDA $D1 ; fixed battle status bits (#$10 = Zarlox, #$08 = Bazuzu, #$04 = Atlas, #$02 = Hamlin Waterway Gremlins, #$01 = Evil Clown) 0x03CF29|$0F:$CF19:29 02 AND #$02 0x03CF2B|$0F:$CF1B:F0 0A BEQ $CF27 0x03CF2D|$0F:$CF1D:A9 FF LDA #$FF 0x03CF2F|$0F:$CF1F:8D 59 05 STA $0559 ; NPC #$03 sprite ID 0x03CF32|$0F:$CF22:8D 61 05 STA $0561 ; NPC #$04 sprite ID 0x03CF35|$0F:$CF25:D0 00 BNE $CF27 ; control flow target (from $CEF8, $CEFF, $CF11, $CF15, $CF1B, $CF25) 0x03CF37|$0F:$CF27:A9 FF LDA #$FF 0x03CF39|$0F:$CF29:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03CF3B|$0F:$CF2B:60 RTS ; code -> data ; indexed data load target (from $CE89) 0x03CF3C|$0F:$CF2C:55 ; Map ID #$55: Lighthouse 6F 0x03CF3D|$0F:$CF2D:54 ; Map ID #$54: Lighthouse 5F 0x03CF3E|$0F:$CF2E:53 ; Map ID #$53: Lighthouse 4F 0x03CF3F|$0F:$CF2F:52 ; Map ID #$52: Lighthouse 3F 0x03CF40|$0F:$CF30:51 ; Map ID #$51: Lighthouse 2F ; indexed data load target (from $CE90, $CEBB) ; indirect data load target 0x03CF41|$0F:$CF31:0F ; indirect data load target 0x03CF42|$0F:$CF32:11 ; indirect data load target 0x03CF43|$0F:$CF33:13 ; indirect data load target 0x03CF44|$0F:$CF34:15 ; indirect data load target 0x03CF45|$0F:$CF35:17 ; indexed data load target (from $CE95) ; indirect data load target 0x03CF46|$0F:$CF36:12 ; indirect data load target 0x03CF47|$0F:$CF37:1A ; indirect data load target 0x03CF48|$0F:$CF38:16 ; indirect data load target 0x03CF49|$0F:$CF39:1E ; indirect data load target 0x03CF4A|$0F:$CF3A:1D ; indexed data load target (from $CE9B) ; indirect data load target 0x03CF4B|$0F:$CF3B:1B ; indirect data load target 0x03CF4C|$0F:$CF3C:0F ; indirect data load target 0x03CF4D|$0F:$CF3D:1B ; indirect data load target 0x03CF4E|$0F:$CF3E:17 ; indirect data load target 0x03CF4F|$0F:$CF3F:1E ; indexed data load target (from $CEA1) ; indirect data load target 0x03CF50|$0F:$CF40:03 ; indirect data load target 0x03CF51|$0F:$CF41:02 ; indirect data load target 0x03CF52|$0F:$CF42:01 ; indirect data load target 0x03CF53|$0F:$CF43:02 ; indirect data load target 0x03CF54|$0F:$CF44:02 ; indexed data load target (from $CEA8) ; indirect data load target 0x03CF55|$0F:$CF45:0E ; indirect data load target 0x03CF56|$0F:$CF46:10 ; indirect data load target 0x03CF57|$0F:$CF47:12 ; indirect data load target 0x03CF58|$0F:$CF48:14 ; indirect data load target 0x03CF59|$0F:$CF49:16 ; indexed data load target (from $CEAF) ; indirect data load target 0x03CF5A|$0F:$CF4A:01 ; indirect data load target 0x03CF5B|$0F:$CF4B:19 ; indirect data load target 0x03CF5C|$0F:$CF4C:1B ; indirect data load target 0x03CF5D|$0F:$CF4D:13 ; indirect data load target 0x03CF5E|$0F:$CF4E:23 ; indexed data load target (from $CEB6) ; indirect data load target 0x03CF5F|$0F:$CF4F:18 ; indirect data load target 0x03CF60|$0F:$CF50:18 ; indirect data load target 0x03CF61|$0F:$CF51:12 ; indirect data load target 0x03CF62|$0F:$CF52:1E ; indirect data load target 0x03CF63|$0F:$CF53:1E ; motion script pointers for Lighthouse Wizard ; indexed data load target (from $CECC) ; indirect data load target 0x03CF64|$0F:$CF54:72 ; indexed data load target (from $CED2) 0x03CF65|$0F:$CF55: 80 ; $07:$8072; motion script for Lighthouse Wizard part 3 0x03CF66|$0F:$CF56:87 80 ; $07:$8087; motion script for Lighthouse Wizard part 4 0x03CF68|$0F:$CF58:92 80 ; $07:$8092; motion script for Lighthouse Wizard part 5 0x03CF6A|$0F:$CF5A:A0 80 ; $07:$80A0; motion script for Lighthouse Wizard part 6 0x03CF6C|$0F:$CF5C:B3 80 ; $07:$80B3; motion script for Lighthouse Wizard part 7 ; data -> code ; external control flow target (from $02:$B1FD) 0x03CF6E|$0F:$CF5E:20 CB D8 JSR $D8CB 0x03CF71|$0F:$CF61:4C 70 F7 JMP $F770 ; load ROM bank #$02 ; external control flow target (from $06:$8053, $06:$827A, $06:$9371, $06:$A311, $06:$BBC4, $06:$BC2D) 0x03CF74|$0F:$CF64:20 CB D8 JSR $D8CB ; load ROM bank #$06 ; control flow target (from $CF6D, $CF73, $CF79) 0x03CF77|$0F:$CF67:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; wipe selected menu region ; external control flow target (from $06:$806F, $06:$8097, $06:$84C9, $06:$8A16, $06:$8A5C, $06:$8B09, $06:$9555, $06:$9CE0) 0x03CF7A|$0F:$CF6A:20 8C F7 JSR $F78C ; wipe selected menu region 0x03CF7D|$0F:$CF6D:4C 67 CF JMP $CF67 ; load ROM bank #$06 ; external control flow target (from $06:$80AD, $06:$96E1) 0x03CF80|$0F:$CF70:20 87 F7 JSR $F787 0x03CF83|$0F:$CF73:4C 67 CF JMP $CF67 ; load ROM bank #$06 ; external control flow target (from $06:$826D) 0x03CF86|$0F:$CF76:20 F7 D2 JSR $D2F7 0x03CF89|$0F:$CF79:4C 67 CF JMP $CF67 ; load ROM bank #$06 ; external control flow target (from $06:$8C6A, $06:$8C77, $06:$8C84, $06:$9775) 0x03CF8C|$0F:$CF7C:A9 00 LDA #$00 0x03CF8E|$0F:$CF7E:85 49 STA $49 ; object hero/target/item/string ID $49 0x03CF90|$0F:$CF80:20 6B D0 JSR $D06B ; copy $16 to $0C, $17 to $0E 0x03CF93|$0F:$CF83:C6 0E DEC $0E ; check up 0x03CF95|$0F:$CF85:20 A5 CF JSR $CFA5 0x03CF98|$0F:$CF88:20 6B D0 JSR $D06B ; copy $16 to $0C, $17 to $0E 0x03CF9B|$0F:$CF8B:E6 0C INC $0C ; check right 0x03CF9D|$0F:$CF8D:20 A5 CF JSR $CFA5 0x03CFA0|$0F:$CF90:20 6B D0 JSR $D06B ; copy $16 to $0C, $17 to $0E 0x03CFA3|$0F:$CF93:E6 0E INC $0E ; check down 0x03CFA5|$0F:$CF95:20 A5 CF JSR $CFA5 0x03CFA8|$0F:$CF98:20 6B D0 JSR $D06B ; copy $16 to $0C, $17 to $0E 0x03CFAB|$0F:$CF9B:C6 0C DEC $0C ; check left 0x03CFAD|$0F:$CF9D:20 A5 CF JSR $CFA5 0x03CFB0|$0F:$CFA0:A5 94 LDA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03CFB2|$0F:$CFA2:4C D5 C3 JMP $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; control flow target (from $CF85, $CF8D, $CF95, $CF9D) 0x03CFB5|$0F:$CFA5:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03CFB8|$0F:$CFA8:20 89 DF JSR $DF89 0x03CFBB|$0F:$CFAB:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03CFBD|$0F:$CFAD:D0 01 BNE $CFB0 ; control flow target (from $CFB8, $CFBC, $CFCB, $D000, $D006, $D00A) 0x03CFBF|$0F:$CFAF:60 RTS ; control flow target (from $CFAD) 0x03CFC0|$0F:$CFB0:C9 01 CMP #$01 0x03CFC2|$0F:$CFB2:D0 48 BNE $CFFC 0x03CFC4|$0F:$CFB4:A5 0C LDA $0C 0x03CFC6|$0F:$CFB6:C9 18 CMP #$18 0x03CFC8|$0F:$CFB8:90 F5 BCC $CFAF 0x03CFCA|$0F:$CFBA:C9 1B CMP #$1B 0x03CFCC|$0F:$CFBC:B0 F1 BCS $CFAF 0x03CFCE|$0F:$CFBE:A9 01 LDA #$01 0x03CFD0|$0F:$CFC0:05 49 ORA $49 ; object hero/target/item/string ID $49 0x03CFD2|$0F:$CFC2:85 49 STA $49 ; object hero/target/item/string ID $49 0x03CFD4|$0F:$CFC4:A5 C9 LDA $C9 0x03CFD6|$0F:$CFC6:18 CLC 0x03CFD7|$0F:$CFC7:69 18 ADC #$18 0x03CFD9|$0F:$CFC9:C5 0C CMP $0C 0x03CFDB|$0F:$CFCB:D0 E2 BNE $CFAF 0x03CFDD|$0F:$CFCD:20 58 D0 JSR $D058 0x03CFE0|$0F:$CFD0:A9 FF LDA #$FF 0x03CFE2|$0F:$CFD2:85 49 STA $49 ; object hero/target/item/string ID $49 0x03CFE4|$0F:$CFD4:A5 12 LDA $12 0x03CFE6|$0F:$CFD6:99 2A 05 STA $052A,Y 0x03CFE9|$0F:$CFD9:A5 13 LDA $13 0x03CFEB|$0F:$CFDB:99 2B 05 STA $052B,Y 0x03CFEE|$0F:$CFDE:A5 12 LDA $12 0x03CFF0|$0F:$CFE0:38 SEC 0x03CFF1|$0F:$CFE1:E5 16 SBC $16 ; current map X-pos (1) 0x03CFF3|$0F:$CFE3:0A ASL 0x03CFF4|$0F:$CFE4:85 18 STA $18 0x03CFF6|$0F:$CFE6:A5 13 LDA $13 0x03CFF8|$0F:$CFE8:38 SEC 0x03CFF9|$0F:$CFE9:E5 17 SBC $17 ; current map Y-pos (1) 0x03CFFB|$0F:$CFEB:0A ASL 0x03CFFC|$0F:$CFEC:85 19 STA $19 0x03CFFE|$0F:$CFEE:A9 00 LDA #$00 0x03D000|$0F:$CFF0:85 1C STA $1C 0x03D002|$0F:$CFF2:85 1E STA $1E 0x03D004|$0F:$CFF4:A9 93 LDA #$93 ; Music ID #$93: door open SFX 0x03D006|$0F:$CFF6:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03D009|$0F:$CFF9:4C 74 D0 JMP $D074 ; control flow target (from $CFB2) 0x03D00C|$0F:$CFFC:A5 C9 LDA $C9 0x03D00E|$0F:$CFFE:C9 02 CMP #$02 0x03D010|$0F:$D000:B0 AD BCS $CFAF 0x03D012|$0F:$D002:A5 0C LDA $0C 0x03D014|$0F:$D004:C9 18 CMP #$18 0x03D016|$0F:$D006:90 A7 BCC $CFAF 0x03D018|$0F:$D008:C9 1C CMP #$1C 0x03D01A|$0F:$D00A:B0 A3 BCS $CFAF 0x03D01C|$0F:$D00C:A9 01 LDA #$01 0x03D01E|$0F:$D00E:05 49 ORA $49 ; object hero/target/item/string ID $49 0x03D020|$0F:$D010:85 49 STA $49 ; object hero/target/item/string ID $49 0x03D022|$0F:$D012:20 58 D0 JSR $D058 0x03D025|$0F:$D015:A9 FF LDA #$FF 0x03D027|$0F:$D017:85 49 STA $49 ; object hero/target/item/string ID $49 0x03D029|$0F:$D019:A5 12 LDA $12 0x03D02B|$0F:$D01B:99 2A 05 STA $052A,Y 0x03D02E|$0F:$D01E:A5 13 LDA $13 0x03D030|$0F:$D020:99 2B 05 STA $052B,Y 0x03D033|$0F:$D023:A5 12 LDA $12 0x03D035|$0F:$D025:0A ASL 0x03D036|$0F:$D026:38 SEC 0x03D037|$0F:$D027:E5 16 SBC $16 ; current map X-pos (1) 0x03D039|$0F:$D029:0A ASL 0x03D03A|$0F:$D02A:85 18 STA $18 0x03D03C|$0F:$D02C:A5 13 LDA $13 0x03D03E|$0F:$D02E:0A ASL 0x03D03F|$0F:$D02F:38 SEC 0x03D040|$0F:$D030:E5 17 SBC $17 ; current map Y-pos (1) 0x03D042|$0F:$D032:0A ASL 0x03D043|$0F:$D033:85 19 STA $19 0x03D045|$0F:$D035:A9 00 LDA #$00 0x03D047|$0F:$D037:85 1C STA $1C 0x03D049|$0F:$D039:85 1E STA $1E 0x03D04B|$0F:$D03B:A9 93 LDA #$93 ; Music ID #$93: door open SFX 0x03D04D|$0F:$D03D:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03D050|$0F:$D040:20 74 D0 JSR $D074 0x03D053|$0F:$D043:E6 18 INC $18 0x03D055|$0F:$D045:E6 18 INC $18 0x03D057|$0F:$D047:20 74 D0 JSR $D074 0x03D05A|$0F:$D04A:E6 19 INC $19 0x03D05C|$0F:$D04C:E6 19 INC $19 0x03D05E|$0F:$D04E:20 74 D0 JSR $D074 0x03D061|$0F:$D051:C6 18 DEC $18 0x03D063|$0F:$D053:C6 18 DEC $18 0x03D065|$0F:$D055:4C 74 D0 JMP $D074 ; control flow target (from $CAC3, $CFCD, $D012) 0x03D068|$0F:$D058:A0 00 LDY #$00 ; control flow target (from $D066) 0x03D06A|$0F:$D05A:B9 2A 05 LDA $052A,Y 0x03D06D|$0F:$D05D:19 2B 05 ORA $052B,Y 0x03D070|$0F:$D060:F0 08 BEQ $D06A 0x03D072|$0F:$D062:C8 INY 0x03D073|$0F:$D063:C8 INY 0x03D074|$0F:$D064:C0 10 CPY #$10 0x03D076|$0F:$D066:D0 F2 BNE $D05A 0x03D078|$0F:$D068:68 PLA 0x03D079|$0F:$D069:68 PLA ; control flow target (from $D060) 0x03D07A|$0F:$D06A:60 RTS ; copy $16 to $0C, $17 to $0E ; control flow target (from $CF80, $CF88, $CF90, $CF98, $D0A0) 0x03D07B|$0F:$D06B:A5 16 LDA $16 ; current map X-pos (1) 0x03D07D|$0F:$D06D:85 0C STA $0C 0x03D07F|$0F:$D06F:A5 17 LDA $17 ; current map Y-pos (1) 0x03D081|$0F:$D071:85 0E STA $0E 0x03D083|$0F:$D073:60 RTS ; control flow target (from $CFF9, $D040, $D047, $D04E, $D055) 0x03D084|$0F:$D074:A5 18 LDA $18 0x03D086|$0F:$D076:18 CLC 0x03D087|$0F:$D077:69 10 ADC #$10 0x03D089|$0F:$D079:85 0C STA $0C 0x03D08B|$0F:$D07B:A5 19 LDA $19 0x03D08D|$0F:$D07D:18 CLC 0x03D08E|$0F:$D07E:69 0E ADC #$0E 0x03D090|$0F:$D080:85 0E STA $0E 0x03D092|$0F:$D082:20 2D DE JSR $DE2D 0x03D095|$0F:$D085:A0 00 LDY #$00 0x03D097|$0F:$D087:B1 07 LDA ($07),Y 0x03D099|$0F:$D089:F0 01 BEQ $D08C 0x03D09B|$0F:$D08B:60 RTS ; control flow target (from $D089) 0x03D09C|$0F:$D08C:A9 00 LDA #$00 0x03D09E|$0F:$D08E:85 1C STA $1C 0x03D0A0|$0F:$D090:85 1E STA $1E 0x03D0A2|$0F:$D092:4C C5 DE JMP $DEC5 ; external control flow target (from $06:$9B30) 0x03D0A5|$0F:$D095:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03D0A7|$0F:$D097:D0 07 BNE $D0A0 ; control flow target (from $D0AA, $D0BC) 0x03D0A9|$0F:$D099:A5 94 LDA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03D0AB|$0F:$D09B:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A 0x03D0AE|$0F:$D09E:18 CLC 0x03D0AF|$0F:$D09F:60 RTS ; control flow target (from $D097) 0x03D0B0|$0F:$D0A0:20 6B D0 JSR $D06B ; copy $16 to $0C, $17 to $0E 0x03D0B3|$0F:$D0A3:20 89 DF JSR $DF89 0x03D0B6|$0F:$D0A6:A5 0C LDA $0C 0x03D0B8|$0F:$D0A8:C9 14 CMP #$14 0x03D0BA|$0F:$D0AA:D0 ED BNE $D099 0x03D0BC|$0F:$D0AC:A0 00 LDY #$00 ; control flow target (from $D0BA) 0x03D0BE|$0F:$D0AE:B9 1A 05 LDA $051A,Y ; something to do with whether you've opened the chest containing the Shield of Erdrick 0x03D0C1|$0F:$D0B1:19 1B 05 ORA $051B,Y 0x03D0C4|$0F:$D0B4:F0 08 BEQ $D0BE 0x03D0C6|$0F:$D0B6:C8 INY 0x03D0C7|$0F:$D0B7:C8 INY 0x03D0C8|$0F:$D0B8:C0 10 CPY #$10 0x03D0CA|$0F:$D0BA:D0 F2 BNE $D0AE 0x03D0CC|$0F:$D0BC:F0 DB BEQ $D099 ; control flow target (from $D0B4) 0x03D0CE|$0F:$D0BE:A5 12 LDA $12 0x03D0D0|$0F:$D0C0:99 1A 05 STA $051A,Y ; something to do with whether you've opened the chest containing the Shield of Erdrick 0x03D0D3|$0F:$D0C3:A5 13 LDA $13 0x03D0D5|$0F:$D0C5:99 1B 05 STA $051B,Y 0x03D0D8|$0F:$D0C8:A0 00 LDY #$00 0x03D0DA|$0F:$D0CA:B1 10 LDA ($10),Y 0x03D0DC|$0F:$D0CC:29 E0 AND #$E0 0x03D0DE|$0F:$D0CE:91 10 STA ($10),Y 0x03D0E0|$0F:$D0D0:A9 92 LDA #$92 ; Music ID #$92: open chest SFX 0x03D0E2|$0F:$D0D2:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03D0E5|$0F:$D0D5:A9 00 LDA #$00 0x03D0E7|$0F:$D0D7:85 18 STA $18 0x03D0E9|$0F:$D0D9:85 19 STA $19 0x03D0EB|$0F:$D0DB:85 1C STA $1C 0x03D0ED|$0F:$D0DD:85 1E STA $1E 0x03D0EF|$0F:$D0DF:20 C5 DE JSR $DEC5 0x03D0F2|$0F:$D0E2:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03D0F5|$0F:$D0E5:A5 94 LDA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03D0F7|$0F:$D0E7:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A 0x03D0FA|$0F:$D0EA:38 SEC 0x03D0FB|$0F:$D0EB:60 RTS ; update each hero's stats based on their current EXP ; control flow target (from $F5AE) ; external control flow target (from $06:$8B04) 0x03D0FC|$0F:$D0EC:20 66 F7 JSR $F766 ; load ROM bank #$04 ; call to code in a different bank ($04:$8009) 0x03D0FF|$0F:$D0EF:20 09 80 JSR $8009 ; update each hero's stats based on their current EXP 0x03D102|$0F:$D0F2:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 ; control flow target (from $C84A, $C85A, $C944, $C9AF, $CA39, $CAA9, $CB36, $CB94, $CC00, $CC0E, $CC59, $CC76, $D1A1, $D1C6) ; external control flow target (from $06:$90C3, $06:$91B7, $06:$935C, $06:$9374, $06:$96A8, $06:$9709, $06:$979E, $06:$98F0, $06:$A1B1, $06:$A2F8, $06:$BB80, $06:$BBB3, $06:$BBD7, $07:$81FC, $07:$8227, $07:$8238, $07:$827F, $07:$82EB, $07:$8355, $07:$8366, $07:$837B, $07:$8402, $07:$84CB, $07:$8595) 0x03D105|$0F:$D0F5:8A TXA ; save X on the stack; pointless since X gets overwritten before next use 0x03D106|$0F:$D0F6:48 PHA 0x03D107|$0F:$D0F7:A2 1E LDX #$1E 0x03D109|$0F:$D0F9:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03D10C|$0F:$D0FC:68 PLA ; restore X from the stack 0x03D10D|$0F:$D0FD:AA TAX 0x03D10E|$0F:$D0FE:AD 2C 06 LDA $062C ; current battle message delay 0x03D111|$0F:$D101:C9 28 CMP #$28 ; FAST uses #$82 0x03D113|$0F:$D103:F0 0C BEQ $D111 0x03D115|$0F:$D105:C9 46 CMP #$46 ; NORMAL uses #$AA 0x03D117|$0F:$D107:F0 04 BEQ $D10D 0x03D119|$0F:$D109:A9 E6 LDA #$E6 ; ergo SLOW uses #$E6 0x03D11B|$0F:$D10B:D0 06 BNE $D113 ; control flow target (from $D107) 0x03D11D|$0F:$D10D:A9 AA LDA #$AA ; from NORMAL 0x03D11F|$0F:$D10F:D0 02 BNE $D113 ; control flow target (from $D103) 0x03D121|$0F:$D111:A9 82 LDA #$82 ; from FAST ; control flow target (from $D10B, $D10F) 0x03D123|$0F:$D113:85 93 STA $93 ; NMI counter, decremented once per NMI until it reaches 0 ; wait until battle message delay reaches zero or no buttons pressed ; control flow target (from $D11E) 0x03D125|$0F:$D115:20 3D D1 JSR $D13D ; wait for interrupt, read joypad data into $2F and A 0x03D128|$0F:$D118:A6 93 LDX $93 ; NMI counter, decremented once per NMI until it reaches 0 0x03D12A|$0F:$D11A:F0 0F BEQ $D12B 0x03D12C|$0F:$D11C:C9 00 CMP #$00 0x03D12E|$0F:$D11E:D0 F5 BNE $D115 ; wait until battle message delay reaches is zero or some button pressed ; control flow target (from $D129) 0x03D130|$0F:$D120:20 3D D1 JSR $D13D ; wait for interrupt, read joypad data into $2F and A 0x03D133|$0F:$D123:A6 93 LDX $93 ; NMI counter, decremented once per NMI until it reaches 0 0x03D135|$0F:$D125:F0 04 BEQ $D12B 0x03D137|$0F:$D127:C9 00 CMP #$00 0x03D139|$0F:$D129:F0 F5 BEQ $D120 ; control flow target (from $D11A, $D125) 0x03D13B|$0F:$D12B:20 89 FA JSR $FA89 ; useless JSR to RTS?! 0x03D13E|$0F:$D12E:A9 03 LDA #$03 0x03D140|$0F:$D130:20 8C F7 JSR $F78C ; wipe selected menu region 0x03D143|$0F:$D133:A9 00 LDA #$00 0x03D145|$0F:$D135:20 8C F7 JSR $F78C ; wipe selected menu region 0x03D148|$0F:$D138:A9 01 LDA #$01 0x03D14A|$0F:$D13A:4C 8C F7 JMP $F78C ; wipe selected menu region ; wait for interrupt, read joypad data into $2F and A ; control flow target (from $D115, $D120) ; external control flow target (from $06:$809D, $06:$80A2) 0x03D14D|$0F:$D13D:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03D150|$0F:$D140:20 76 C4 JSR $C476 ; read joypad 1 data into $2F 0x03D153|$0F:$D143:A5 2F LDA $2F ; joypad 1 data 0x03D155|$0F:$D145:60 RTS ; heal hero ID in A by random amount based on healing power in X ; external control flow target (from $06:$8BED) 0x03D156|$0F:$D146:20 66 F7 JSR $F766 ; load ROM bank #$04 ; call to code in a different bank ($04:$8006) 0x03D159|$0F:$D149:20 06 80 JSR $8006 0x03D15C|$0F:$D14C:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; control flow target (from $FF60) ; external control flow target (from $06:$A848, $06:$A98F) 0x03D15F|$0F:$D14F:A9 00 LDA #$00 0x03D161|$0F:$D151:85 27 STA $27 ; map palette; offset from ($E27C) 0x03D163|$0F:$D153:20 F9 E2 JSR $E2F9 0x03D166|$0F:$D156:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; external control flow target (from $06:$A35D) 0x03D169|$0F:$D159:A5 94 LDA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03D16B|$0F:$D15B:48 PHA 0x03D16C|$0F:$D15C:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03D16F|$0F:$D15F:C4 ; $06:$8008 ; data -> code 0x03D170|$0F:$D160:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x03D173|$0F:$D163:7A ; String ID #$007A: ‘Then farewell and good luck!’[end-FC] ; data -> code ; control flow target (from $D172) 0x03D174|$0F:$D164:20 61 F7 JSR $F761 ; load ROM bank #$06 0x03D177|$0F:$D167:68 PLA 0x03D178|$0F:$D168:85 94 STA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03D17A|$0F:$D16A:60 RTS ; external control flow target (from $06:$8F20) 0x03D17B|$0F:$D16B:A5 94 LDA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03D17D|$0F:$D16D:48 PHA 0x03D17E|$0F:$D16E:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03D181|$0F:$D171:C4 ; $06:$8008 ; data -> code 0x03D182|$0F:$D172:4C 64 D1 JMP $D164 ; external control flow target (from $06:$A882) 0x03D185|$0F:$D175:A9 8F LDA #$8F 0x03D187|$0F:$D177:85 30 STA $30 0x03D189|$0F:$D179:20 DE D2 JSR $D2DE 0x03D18C|$0F:$D17C:20 75 F7 JSR $F775 ; load ROM bank #$03 ; call to code in a different bank ($03:$8006) 0x03D18F|$0F:$D17F:20 06 80 JSR $8006 0x03D192|$0F:$D182:A9 FF LDA #$FF 0x03D194|$0F:$D184:85 8E STA $8E ; flag for in battle or not (#$FF)? 0x03D196|$0F:$D186:A9 04 LDA #$04 ; Menu ID #$04: Dialogue window 0x03D198|$0F:$D188:20 89 EB JSR $EB89 ; open menu specified by A 0x03D19B|$0F:$D18B:A9 00 LDA #$00 0x03D19D|$0F:$D18D:85 27 STA $27 ; map palette; offset from ($E27C) 0x03D19F|$0F:$D18F:20 F9 E2 JSR $E2F9 0x03D1A2|$0F:$D192:E6 8E INC $8E ; flag for in battle or not (#$FF)? 0x03D1A4|$0F:$D194:A9 7B LDA #$7B ; String ID #$007B: In that case, return when thou can, for Hargon does not sleep.[wait][line]In order to preserve the Imperial Scrolls of honor, please hold the REST button in while pushing the POWER button off.[wait][line]If you turn off the POWER first, you may lose the record of your great deeds, and that would be a shame.[line][FD][FD] [line][end-FC] 0x03D1A6|$0F:$D196:20 4A FA JSR $FA4A ; display string ID specified by A 0x03D1A9|$0F:$D199:A9 10 LDA #$10 0x03D1AB|$0F:$D19B:20 36 C6 JSR $C636 ; set CHR bank 0 based on A ; infinite loop ; control flow target (from $D19E) 0x03D1AE|$0F:$D19E:4C 9E D1 JMP $D19E ; infinite loop ; handle Hamlin Waterway Gremlins fight ; external control flow target (from $06:$906E) 0x03D1B1|$0F:$D1A1:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03D1B4|$0F:$D1A4:20 66 F7 JSR $F766 ; load ROM bank #$04 0x03D1B7|$0F:$D1A7:A9 03 LDA #$03 ; Fixed Battle #$03: 2 Ozwargs (Map ID #$08: Hamlin Waterway) ; call to code in a different bank ($04:$800F) 0x03D1B9|$0F:$D1A9:20 0F 80 JSR $800F 0x03D1BC|$0F:$D1AC:A5 98 LDA $98 ; outcome of last fight? 0x03D1BE|$0F:$D1AE:C9 FC CMP #$FC 0x03D1C0|$0F:$D1B0:F0 0E BEQ $D1C0 0x03D1C2|$0F:$D1B2:A9 02 LDA #$02 0x03D1C4|$0F:$D1B4:05 D1 ORA $D1 ; fixed battle status bits (#$10 = Zarlox, #$08 = Bazuzu, #$04 = Atlas, #$02 = Hamlin Waterway Gremlins, #$01 = Evil Clown) 0x03D1C6|$0F:$D1B6:85 D1 STA $D1 ; fixed battle status bits (#$10 = Zarlox, #$08 = Bazuzu, #$04 = Atlas, #$02 = Hamlin Waterway Gremlins, #$01 = Evil Clown) 0x03D1C8|$0F:$D1B8:A9 FF LDA #$FF 0x03D1CA|$0F:$D1BA:8D 59 05 STA $0559 ; NPC #$03 sprite ID 0x03D1CD|$0F:$D1BD:8D 61 05 STA $0561 ; NPC #$04 sprite ID ; control flow target (from $D1B0) 0x03D1D0|$0F:$D1C0:20 62 D2 JSR $D262 0x03D1D3|$0F:$D1C3:4C FB D2 JMP $D2FB ; load ROM bank 6 ; external control flow target (from $06:$9342) 0x03D1D6|$0F:$D1C6:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x03D1D9|$0F:$D1C9:20 66 F7 JSR $F766 ; load ROM bank #$04 0x03D1DC|$0F:$D1CC:A9 04 LDA #$04 ; Fixed Battle #$04: 2 Gold Batboons (Map ID #$16: Hargon's Castle 1F) ; call to code in a different bank ($04:$800F) 0x03D1DE|$0F:$D1CE:20 0F 80 JSR $800F 0x03D1E1|$0F:$D1D1:A5 98 LDA $98 ; outcome of last fight? 0x03D1E3|$0F:$D1D3:C9 FC CMP #$FC 0x03D1E5|$0F:$D1D5:F0 08 BEQ $D1DF 0x03D1E7|$0F:$D1D7:A9 FF LDA #$FF 0x03D1E9|$0F:$D1D9:8D 81 05 STA $0581 ; NPC #$08 sprite ID 0x03D1EC|$0F:$D1DC:8D 89 05 STA $0589 ; NPC #$09 sprite ID ; control flow target (from $D1D5) 0x03D1EF|$0F:$D1DF:20 62 D2 JSR $D262 0x03D1F2|$0F:$D1E2:4C FB D2 JMP $D2FB ; load ROM bank 6 ; trigger Fixed Battle #$01: 1 Evil Clown (Map ID #$04: Midenhall B1) ; external control flow target (from $06:$80E5) 0x03D1F5|$0F:$D1E5:A9 FF LDA #$FF 0x03D1F7|$0F:$D1E7:8D 69 05 STA $0569 ; NPC #$05 sprite ID 0x03D1FA|$0F:$D1EA:A9 01 LDA #$01 ; Fixed Battle #$01: 1 Evil Clown (Map ID #$04: Midenhall B1) 0x03D1FC|$0F:$D1EC:20 5C D2 JSR $D25C ; trigger fixed battle A 0x03D1FF|$0F:$D1EF:A9 01 LDA #$01 0x03D201|$0F:$D1F1:05 D1 ORA $D1 ; fixed battle status bits (#$10 = Zarlox, #$08 = Bazuzu, #$04 = Atlas, #$02 = Hamlin Waterway Gremlins, #$01 = Evil Clown) 0x03D203|$0F:$D1F3:85 D1 STA $D1 ; fixed battle status bits (#$10 = Zarlox, #$08 = Bazuzu, #$04 = Atlas, #$02 = Hamlin Waterway Gremlins, #$01 = Evil Clown) 0x03D205|$0F:$D1F5:4C FB D2 JMP $D2FB ; load ROM bank 6 ; trigger Fixed Battle #$0B: 1 Hargon (Map ID #$17: Hargon's Castle 7F) ; external control flow target (from $06:$935F) 0x03D208|$0F:$D1F8:A9 0B LDA #$0B ; Fixed Battle #$0B: 1 Hargon (Map ID #$17: Hargon's Castle 7F) 0x03D20A|$0F:$D1FA:20 5C D2 JSR $D25C ; trigger fixed battle A 0x03D20D|$0F:$D1FD:4C FB D2 JMP $D2FB ; load ROM bank 6 ; external control flow target (from $06:$BD2A) 0x03D210|$0F:$D200:20 66 F7 JSR $F766 ; load ROM bank #$04 0x03D213|$0F:$D203:A9 0C LDA #$0C ; Fixed Battle #$0C: 1 Malroth (Map ID #$17: Hargon's Castle 7F) ; call to code in a different bank ($04:$800F) 0x03D215|$0F:$D205:20 0F 80 JSR $800F 0x03D218|$0F:$D208:A9 FF LDA #$FF 0x03D21A|$0F:$D20A:85 44 STA $44 ; non-saved event status (#$00 = event start, #$01 = Lianport Gremlins defeated, #$02 = met with Lianport grandfather/have no friends at Shrine SW of Cannock, #$03 = King Midenhall moved to stairs, #$04 = King Midenhall moved down stairs, #$05 = King Midenhall spoke on Midenhall 1F, #$0B = Lighthouse Wizard 7F, #$1B Lighthouse Wizard 2F spoke, #$64 = Hargon dead, #$FF = event end) 0x03D21C|$0F:$D20C:A5 98 LDA $98 ; outcome of last fight? 0x03D21E|$0F:$D20E:C9 FF CMP #$FF 0x03D220|$0F:$D210:D0 03 BNE $D215 0x03D222|$0F:$D212:4C 67 D2 JMP $D267 ; control flow target (from $D210) 0x03D225|$0F:$D215:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; open path to Sea Cave ; external control flow target (from $06:$98FD) 0x03D228|$0F:$D218:A9 97 LDA #$97 ; Music ID #$97: shoals submerging SFX 0x03D22A|$0F:$D21A:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03D22D|$0F:$D21D:20 5C F7 JSR $F75C ; load ROM bank #$00 0x03D230|$0F:$D220:A9 00 LDA #$00 ; call to code in a different bank ($00:$8006) 0x03D232|$0F:$D222:20 06 80 JSR $8006 0x03D235|$0F:$D225:A9 32 LDA #$32 0x03D237|$0F:$D227:85 41 STA $41 0x03D239|$0F:$D229:20 38 E9 JSR $E938 0x03D23C|$0F:$D22C:A9 97 LDA #$97 ; Music ID #$97: shoals submerging SFX 0x03D23E|$0F:$D22E:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03D241|$0F:$D231:20 5C F7 JSR $F75C ; load ROM bank #$00 0x03D244|$0F:$D234:A9 FF LDA #$FF ; call to code in a different bank ($00:$8006) 0x03D246|$0F:$D236:20 06 80 JSR $8006 0x03D249|$0F:$D239:68 PLA 0x03D24A|$0F:$D23A:68 PLA 0x03D24B|$0F:$D23B:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; external control flow target (from $06:$96B0) 0x03D24E|$0F:$D23E:20 5C F7 JSR $F75C ; load ROM bank #$00 ; call to code in a different bank ($00:$8009) 0x03D251|$0F:$D241:20 09 80 JSR $8009 0x03D254|$0F:$D244:A9 01 LDA #$01 0x03D256|$0F:$D246:8D F9 05 STA $05F9 ; flag for Cave to Rhone open 0x03D259|$0F:$D249:A9 32 LDA #$32 0x03D25B|$0F:$D24B:85 41 STA $41 0x03D25D|$0F:$D24D:20 38 E9 JSR $E938 0x03D260|$0F:$D250:20 5C F7 JSR $F75C ; load ROM bank #$00 ; call to code in a different bank ($00:$800C) 0x03D263|$0F:$D253:4C 0C 80 JMP $800C ; external control flow target (from $06:$97BA, $06:$97C1) 0x03D266|$0F:$D256:20 C5 DE JSR $DEC5 0x03D269|$0F:$D259:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; trigger fixed battle A ; control flow target (from $C8D1, $CAFC, $CC38, $CC94, $D1EC, $D1FA) 0x03D26C|$0F:$D25C:20 66 F7 JSR $F766 ; load ROM bank #$04 ; call to code in a different bank ($04:$800F) 0x03D26F|$0F:$D25F:20 0F 80 JSR $800F ; control flow target (from $C908, $C972, $D1C0, $D1DF) 0x03D272|$0F:$D262:A5 98 LDA $98 ; outcome of last fight? 0x03D274|$0F:$D264:D0 01 BNE $D267 0x03D276|$0F:$D266:60 RTS ; control flow target (from $D212, $D264) 0x03D277|$0F:$D267:A9 00 LDA #$00 0x03D279|$0F:$D269:85 8E STA $8E ; flag for in battle or not (#$FF)? 0x03D27B|$0F:$D26B:A5 98 LDA $98 ; outcome of last fight? 0x03D27D|$0F:$D26D:C9 FF CMP #$FF 0x03D27F|$0F:$D26F:D0 24 BNE $D295 ; external control flow target (from $06:$A25A) 0x03D281|$0F:$D271:A9 26 LDA #$26 0x03D283|$0F:$D273:8D 0E 05 STA $050E 0x03D286|$0F:$D276:20 DE D2 JSR $D2DE 0x03D289|$0F:$D279:A9 84 LDA #$84 0x03D28B|$0F:$D27B:8D 2D 06 STA $062D ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03D28E|$0F:$D27E:A2 FF LDX #$FF 0x03D290|$0F:$D280:9A TXS 0x03D291|$0F:$D281:A9 01 LDA #$01 0x03D293|$0F:$D283:8D 3B 06 STA $063B ; Midenhall Current HP, low byte 0x03D296|$0F:$D286:20 FB D2 JSR $D2FB ; load ROM bank 6 ; call to code in a different bank ($06:$8DCC) 0x03D299|$0F:$D289:20 CC 8D JSR $8DCC ; restore full HP to all living party members 0x03D29C|$0F:$D28C:20 B9 D2 JSR $D2B9 ; call to code in a different bank ($06:$8F39) 0x03D29F|$0F:$D28F:20 39 8F JSR $8F39 0x03D2A2|$0F:$D292:4C 00 C7 JMP $C700 ; control flow target (from $D26F) 0x03D2A5|$0F:$D295:20 DE D2 JSR $D2DE 0x03D2A8|$0F:$D298:A9 FF LDA #$FF ; control flow target (from $C9A5) 0x03D2AA|$0F:$D29A:85 45 STA $45 0x03D2AC|$0F:$D29C:20 5C F7 JSR $F75C ; load ROM bank #$00 0x03D2AF|$0F:$D29F:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03D2B1|$0F:$D2A1:85 0C STA $0C ; call to code in a different bank ($00:$8000) 0x03D2B3|$0F:$D2A3:20 00 80 JSR $8000 0x03D2B6|$0F:$D2A6:20 F7 D2 JSR $D2F7 0x03D2B9|$0F:$D2A9:20 5C F7 JSR $F75C ; load ROM bank #$00 0x03D2BC|$0F:$D2AC:A9 04 LDA #$04 0x03D2BE|$0F:$D2AE:85 0C STA $0C ; call to code in a different bank ($00:$8000) 0x03D2C0|$0F:$D2B0:20 00 80 JSR $8000 0x03D2C3|$0F:$D2B3:4C 81 E2 JMP $E281 0x03D2C6|$0F:$D2B6:20 2A C4 JSR $C42A ; control flow target (from $C6FA, $D28C) 0x03D2C9|$0F:$D2B9:20 FB D2 JSR $D2FB ; load ROM bank 6 0x03D2CC|$0F:$D2BC:20 A2 E5 JSR $E5A2 0x03D2CF|$0F:$D2BF:A2 03 LDX #$03 0x03D2D1|$0F:$D2C1:20 E7 D2 JSR $D2E7 ; X = 1 => CLC and update $0C-$0D to warp point data to use if Outside allowed from current map, SEC otherwise, X = 2 => CLC and update $0C-$0D to warp point data to use if Return allowed from current map, SEC otherwise, X = 3 => disembark from ship and update ship position based on last save point ID $48 0x03D2D4|$0F:$D2C4:A5 48 LDA $48 ; last save point ID 0x03D2D6|$0F:$D2C6:C9 05 CMP #$05 ; Save Point ID #$05: Rhone Shrine 0x03D2D8|$0F:$D2C8:D0 0E BNE $D2D8 0x03D2DA|$0F:$D2CA:A9 84 LDA #$84 0x03D2DC|$0F:$D2CC:8D 2D 06 STA $062D ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03D2DF|$0F:$D2CF:8D 3F 06 STA $063F ; Cannock status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03D2E2|$0F:$D2D2:8D 51 06 STA $0651 ; Moonbrooke status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03D2E5|$0F:$D2D5:20 7B C7 JSR $C77B ; restore full HP/MP to all living party members ; control flow target (from $D2C8) 0x03D2E8|$0F:$D2D8:20 AF C7 JSR $C7AF 0x03D2EB|$0F:$D2DB:4C FB D2 JMP $D2FB ; load ROM bank 6 ; control flow target (from $D179, $D276, $D295) 0x03D2EE|$0F:$D2DE:20 2A C4 JSR $C42A 0x03D2F1|$0F:$D2E1:20 46 C4 JSR $C446 ; turn screen off, write $800 [space] tiles to PPU $2000, turn screen on 0x03D2F4|$0F:$D2E4:4C 65 C4 JMP $C465 ; wait for interrupt and then set every 4th byte of $0200 - $02FC to #$F0 ; X = 1 => CLC and update $0C-$0D to warp point data to use if Outside allowed from current map, SEC otherwise, X = 2 => CLC and update $0C-$0D to warp point data to use if Return allowed from current map, SEC otherwise, X = 3 => disembark from ship and update ship position based on last save point ID $48 ; control flow target (from $D2C1, $D2F1) ; external control flow target (from $06:$8C53, $06:$8CD6) 0x03D2F7|$0F:$D2E7:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03D2FA|$0F:$D2EA:A3 ; $06:$8046; -> $06:$BEED: X = 1 => CLC and update $0C-$0D to warp point data to use if Outside allowed from current map, SEC otherwise, X = 2 => CLC and update $0C-$0D to warp point data to use if Return allowed from current map, SEC otherwise, X = 3 => disembark from ship and update ship position based on last save point ID $48 ; data -> code 0x03D2FB|$0F:$D2EB:08 PHP 0x03D2FC|$0F:$D2EC:20 61 F7 JSR $F761 ; load ROM bank #$06 0x03D2FF|$0F:$D2EF:28 PLP 0x03D300|$0F:$D2F0:60 RTS ; external control flow target (from $06:$BD62) 0x03D301|$0F:$D2F1:20 E7 D2 JSR $D2E7 ; X = 1 => CLC and update $0C-$0D to warp point data to use if Outside allowed from current map, SEC otherwise, X = 2 => CLC and update $0C-$0D to warp point data to use if Return allowed from current map, SEC otherwise, X = 3 => disembark from ship and update ship position based on last save point ID $48 0x03D304|$0F:$D2F4:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; control flow target (from $CF76, $D2A6, $D311, $D3C2, $D4A6, $E4BE, $E9B7) 0x03D307|$0F:$D2F7:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03D30A|$0F:$D2FA:A2 ; $06:$8044 ; data -> code ; load ROM bank 6 ; control flow target (from $C918, $CAFF, $D1C3, $D1E2, $D1F5, $D1FD, $D286, $D2B9, $D2DB, $D340) 0x03D30B|$0F:$D2FB:A9 06 LDA #$06 0x03D30D|$0F:$D2FD:85 94 STA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03D30F|$0F:$D2FF:4C D5 C3 JMP $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; external control flow target (from $06:$8669, $06:$8CC2, $06:$9420, $06:$9427, $06:$942E, $06:$A225) 0x03D312|$0F:$D302:20 5C F7 JSR $F75C ; load ROM bank #$00 0x03D315|$0F:$D305:A4 97 LDY $97 ; subject hero ID $97 0x03D317|$0F:$D307:B9 1F D3 LDA $D31F,Y ; call to code in a different bank ($00:$8003) 0x03D31A|$0F:$D30A:20 03 80 JSR $8003 0x03D31D|$0F:$D30D:A9 FF LDA #$FF 0x03D31F|$0F:$D30F:85 45 STA $45 0x03D321|$0F:$D311:20 F7 D2 JSR $D2F7 0x03D324|$0F:$D314:20 CB D8 JSR $D8CB 0x03D327|$0F:$D317:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03D32A|$0F:$D31A:A5 94 LDA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03D32C|$0F:$D31C:4C D5 C3 JMP $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; code -> data ; indexed data load target (from $D307) ; indirect data load target 0x03D32F|$0F:$D31F:5C ; indirect data load target 0x03D330|$0F:$D320:61 ; indirect data load target 0x03D331|$0F:$D321:66 ; indirect data load target 0x03D332|$0F:$D322:58 0x03D333|$0F:$D323:59 ; indirect data load target 0x03D334|$0F:$D324:5A ; data -> code ; external control flow target (from $06:$BD0B) 0x03D335|$0F:$D325:20 C5 DE JSR $DEC5 0x03D338|$0F:$D328:20 04 C5 JSR $C504 ; control flow target (from $D331) 0x03D33B|$0F:$D32B:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; external control flow target (from $06:$BD71) 0x03D33E|$0F:$D32E:20 CB D8 JSR $D8CB 0x03D341|$0F:$D331:4C 2B D3 JMP $D32B ; post-Malroth dialogue ; external control flow target (from $06:$80B9) 0x03D344|$0F:$D334:20 5C F7 JSR $F75C ; load ROM bank #$00 ; call to code in a different bank ($00:$8012) 0x03D347|$0F:$D337:20 12 80 JSR $8012 ; return value for $0D for post-Malroth dialogue 0x03D34A|$0F:$D33A:85 0D STA $0D 0x03D34C|$0F:$D33C:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03D34F|$0F:$D33F:43 ; $02:$8006; -> $02:$B292: looks like this determines NPC's post-Malroth text ; data -> code 0x03D350|$0F:$D340:4C FB D2 JMP $D2FB ; load ROM bank 6 ; external control flow target (from $06:$BC2A) 0x03D353|$0F:$D343:EA NOP 0x03D354|$0F:$D344:EA NOP 0x03D355|$0F:$D345:EA NOP 0x03D356|$0F:$D346:A9 09 LDA #$09 0x03D358|$0F:$D348:85 94 STA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03D35A|$0F:$D34A:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; call to code in a different bank ($09:$8000) 0x03D35D|$0F:$D34D:20 00 80 JSR $8000 ; control flow target (from $D353) 0x03D360|$0F:$D350:AD 56 01 LDA $0156 ; probably music playing flag? set to #$00 when music finishes 0x03D363|$0F:$D353:D0 FB BNE $D350 0x03D365|$0F:$D355:78 SEI 0x03D366|$0F:$D356:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03D369|$0F:$D359:DF ; $06:$803E ; data -> code 0x03D36A|$0F:$D35A:60 RTS ; control flow target (from $E5E1, $E655, $E6D3, $E7B4) 0x03D36B|$0F:$D35B:A5 28 LDA $28 ; current map X-pos (2) 0x03D36D|$0F:$D35D:85 0C STA $0C 0x03D36F|$0F:$D35F:A5 29 LDA $29 ; current map Y-pos (2) 0x03D371|$0F:$D361:85 0E STA $0E 0x03D373|$0F:$D363:20 89 DF JSR $DF89 0x03D376|$0F:$D366:20 4A DF JSR $DF4A 0x03D379|$0F:$D369:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03D37C|$0F:$D36C:A0 04 LDY #$04 0x03D37E|$0F:$D36E:B1 10 LDA ($10),Y 0x03D380|$0F:$D370:29 FC AND #$FC 0x03D382|$0F:$D372:85 3B STA $3B ; high nybble = terrain ID 0x03D384|$0F:$D374:AD AD 61 LDA $61AD 0x03D387|$0F:$D377:F0 01 BEQ $D37A 0x03D389|$0F:$D379:60 RTS ; control flow target (from $D377) 0x03D38A|$0F:$D37A:AD BA FF LDA $FFBA 0x03D38D|$0F:$D37D:D0 09 BNE $D388 0x03D38F|$0F:$D37F:A5 2F LDA $2F ; joypad 1 data 0x03D391|$0F:$D381:29 02 AND #$02 0x03D393|$0F:$D383:F0 03 BEQ $D388 0x03D395|$0F:$D385:4C 29 D4 JMP $D429 ; control flow target (from $D37D, $D383) 0x03D398|$0F:$D388:A5 CF LDA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x03D39A|$0F:$D38A:29 04 AND #$04 0x03D39C|$0F:$D38C:F0 41 BEQ $D3CF 0x03D39E|$0F:$D38E:A5 3B LDA $3B ; high nybble = terrain ID 0x03D3A0|$0F:$D390:29 F0 AND #$F0 0x03D3A2|$0F:$D392:C9 40 CMP #$40 0x03D3A4|$0F:$D394:D0 03 BNE $D399 0x03D3A6|$0F:$D396:4C 29 D4 JMP $D429 ; control flow target (from $D394) 0x03D3A9|$0F:$D399:C9 A0 CMP #$A0 0x03D3AB|$0F:$D39B:B0 77 BCS $D414 0x03D3AD|$0F:$D39D:A5 CF LDA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x03D3AF|$0F:$D39F:29 FB AND #$FB 0x03D3B1|$0F:$D3A1:85 CF STA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x03D3B3|$0F:$D3A3:A5 16 LDA $16 ; current map X-pos (1) 0x03D3B5|$0F:$D3A5:85 D2 STA $D2 ; ship X-pos (when you aren't on it) 0x03D3B7|$0F:$D3A7:8D D4 05 STA $05D4 ; NPC #$13 X-pos 0x03D3BA|$0F:$D3AA:A5 17 LDA $17 ; current map Y-pos (1) 0x03D3BC|$0F:$D3AC:85 D3 STA $D3 ; ship Y-pos (when you aren't on it) 0x03D3BE|$0F:$D3AE:8D D5 05 STA $05D5 ; NPC #$13 Y-pos 0x03D3C1|$0F:$D3B1:A9 05 LDA #$05 0x03D3C3|$0F:$D3B3:8D D9 05 STA $05D9 ; NPC #$13 sprite ID 0x03D3C6|$0F:$D3B6:AD 40 05 LDA $0540 ; NPC #$00 ? + direction nybble 0x03D3C9|$0F:$D3B9:29 03 AND #$03 0x03D3CB|$0F:$D3BB:8D D8 05 STA $05D8 ; NPC #$13 motion nybble + direction nybble 0x03D3CE|$0F:$D3BE:A9 01 LDA #$01 0x03D3D0|$0F:$D3C0:85 45 STA $45 0x03D3D2|$0F:$D3C2:20 F7 D2 JSR $D2F7 0x03D3D5|$0F:$D3C5:20 2F E3 JSR $E32F 0x03D3D8|$0F:$D3C8:A9 00 LDA #$00 0x03D3DA|$0F:$D3CA:85 38 STA $38 0x03D3DC|$0F:$D3CC:4C 29 D4 JMP $D429 ; control flow target (from $D38C) 0x03D3DF|$0F:$D3CF:A5 3B LDA $3B ; high nybble = terrain ID 0x03D3E1|$0F:$D3D1:29 F0 AND #$F0 0x03D3E3|$0F:$D3D3:C9 40 CMP #$40 0x03D3E5|$0F:$D3D5:D0 21 BNE $D3F8 0x03D3E7|$0F:$D3D7:A5 31 LDA $31 ; current map ID 0x03D3E9|$0F:$D3D9:C9 01 CMP #$01 ; Map ID #$01: World Map 0x03D3EB|$0F:$D3DB:F0 04 BEQ $D3E1 0x03D3ED|$0F:$D3DD:C9 0B CMP #$0B ; Map ID #$0B: Lianport 0x03D3EF|$0F:$D3DF:D0 33 BNE $D414 ; control flow target (from $D3DB) 0x03D3F1|$0F:$D3E1:AD D4 05 LDA $05D4 ; NPC #$13 X-pos 0x03D3F4|$0F:$D3E4:C5 28 CMP $28 ; current map X-pos (2) 0x03D3F6|$0F:$D3E6:D0 2C BNE $D414 0x03D3F8|$0F:$D3E8:AD D5 05 LDA $05D5 ; NPC #$13 Y-pos 0x03D3FB|$0F:$D3EB:C5 29 CMP $29 ; current map Y-pos (2) 0x03D3FD|$0F:$D3ED:D0 25 BNE $D414 0x03D3FF|$0F:$D3EF:AD D9 05 LDA $05D9 ; NPC #$13 sprite ID 0x03D402|$0F:$D3F2:C9 FF CMP #$FF 0x03D404|$0F:$D3F4:F0 1E BEQ $D414 0x03D406|$0F:$D3F6:D0 51 BNE $D449 ; control flow target (from $D3D5) 0x03D408|$0F:$D3F8:A5 3B LDA $3B ; high nybble = terrain ID 0x03D40A|$0F:$D3FA:29 F0 AND #$F0 0x03D40C|$0F:$D3FC:C9 A0 CMP #$A0 0x03D40E|$0F:$D3FE:D0 10 BNE $D410 0x03D410|$0F:$D400:A5 31 LDA $31 ; current map ID 0x03D412|$0F:$D402:C9 2C CMP #$2C ; Map ID #$2C: Lake Cave B1 0x03D414|$0F:$D404:F0 0E BEQ $D414 0x03D416|$0F:$D406:C9 2D CMP #$2D ; Map ID #$2D: Lake Cave B2 0x03D418|$0F:$D408:F0 0A BEQ $D414 0x03D41A|$0F:$D40A:C9 40 CMP #$40 0x03D41C|$0F:$D40C:F0 06 BEQ $D414 0x03D41E|$0F:$D40E:D0 19 BNE $D429 ; control flow target (from $D3FE) 0x03D420|$0F:$D410:C9 B0 CMP #$B0 0x03D422|$0F:$D412:90 15 BCC $D429 ; control flow target (from $D39B, $D3DF, $D3E6, $D3ED, $D3F4, $D404, $D408, $D40C, $D43E) 0x03D424|$0F:$D414:A5 16 LDA $16 ; current map X-pos (1) 0x03D426|$0F:$D416:85 28 STA $28 ; current map X-pos (2) 0x03D428|$0F:$D418:A5 17 LDA $17 ; current map Y-pos (1) 0x03D42A|$0F:$D41A:85 29 STA $29 ; current map Y-pos (2) 0x03D42C|$0F:$D41C:68 PLA 0x03D42D|$0F:$D41D:68 PLA 0x03D42E|$0F:$D41E:68 PLA 0x03D42F|$0F:$D41F:68 PLA 0x03D430|$0F:$D420:A9 00 LDA #$00 0x03D432|$0F:$D422:85 03 STA $03 ; game clock? 0x03D434|$0F:$D424:85 3B STA $3B ; high nybble = terrain ID 0x03D436|$0F:$D426:4C 47 C7 JMP $C747 ; control flow target (from $D385, $D396, $D3CC, $D40E, $D412) 0x03D439|$0F:$D429:A0 18 LDY #$18 ; control flow target (from $D447) 0x03D43B|$0F:$D42B:B9 41 05 LDA $0541,Y ; NPC #$00 sprite ID 0x03D43E|$0F:$D42E:C9 FF CMP #$FF 0x03D440|$0F:$D430:F0 0E BEQ $D440 0x03D442|$0F:$D432:B9 3C 05 LDA $053C,Y ; NPC #$00 ? 0x03D445|$0F:$D435:C5 28 CMP $28 ; current map X-pos (2) 0x03D447|$0F:$D437:D0 07 BNE $D440 0x03D449|$0F:$D439:B9 3D 05 LDA $053D,Y ; NPC #$00 ? 0x03D44C|$0F:$D43C:C5 29 CMP $29 ; current map Y-pos (2) 0x03D44E|$0F:$D43E:F0 D4 BEQ $D414 ; control flow target (from $D430, $D437) 0x03D450|$0F:$D440:98 TYA 0x03D451|$0F:$D441:18 CLC 0x03D452|$0F:$D442:69 08 ADC #$08 0x03D454|$0F:$D444:A8 TAY 0x03D455|$0F:$D445:C9 B8 CMP #$B8 0x03D457|$0F:$D447:D0 E2 BNE $D42B ; control flow target (from $D3F6) 0x03D459|$0F:$D449:A0 00 LDY #$00 0x03D45B|$0F:$D44B:20 50 D4 JSR $D450 0x03D45E|$0F:$D44E:A0 08 LDY #$08 ; control flow target (from $D44B) 0x03D460|$0F:$D450:B9 42 05 LDA $0542,Y ; NPC #$00 ? 0x03D463|$0F:$D453:19 43 05 ORA $0543,Y ; NPC #$00 ? 0x03D466|$0F:$D456:D0 01 BNE $D459 0x03D468|$0F:$D458:60 RTS ; control flow target (from $D456) 0x03D469|$0F:$D459:AD 3C 05 LDA $053C ; NPC #$00 ? 0x03D46C|$0F:$D45C:20 63 D4 JSR $D463 0x03D46F|$0F:$D45F:C8 INY 0x03D470|$0F:$D460:AD 3D 05 LDA $053D ; NPC #$00 ? ; control flow target (from $D45C) 0x03D473|$0F:$D463:38 SEC 0x03D474|$0F:$D464:F9 44 05 SBC $0544,Y ; NPC #$01 ? 0x03D477|$0F:$D467:99 46 05 STA $0546,Y ; NPC #$01 ? 0x03D47A|$0F:$D46A:60 RTS ; control flow target (from $C87F) 0x03D47B|$0F:$D46B:A5 CF LDA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x03D47D|$0F:$D46D:29 04 AND #$04 0x03D47F|$0F:$D46F:D0 40 BNE $D4B1 0x03D481|$0F:$D471:A5 31 LDA $31 ; current map ID 0x03D483|$0F:$D473:C9 01 CMP #$01 ; Map ID #$01: World Map 0x03D485|$0F:$D475:F0 04 BEQ $D47B 0x03D487|$0F:$D477:C9 0B CMP #$0B ; Map ID #$0B: Lianport 0x03D489|$0F:$D479:D0 36 BNE $D4B1 ; control flow target (from $D475) 0x03D48B|$0F:$D47B:AD D4 05 LDA $05D4 ; NPC #$13 X-pos 0x03D48E|$0F:$D47E:C5 16 CMP $16 ; current map X-pos (1) 0x03D490|$0F:$D480:D0 2F BNE $D4B1 0x03D492|$0F:$D482:AD D5 05 LDA $05D5 ; NPC #$13 Y-pos 0x03D495|$0F:$D485:C5 17 CMP $17 ; current map Y-pos (1) 0x03D497|$0F:$D487:D0 28 BNE $D4B1 0x03D499|$0F:$D489:20 DA D6 JSR $D6DA 0x03D49C|$0F:$D48C:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03D49F|$0F:$D48F:A9 FF LDA #$FF 0x03D4A1|$0F:$D491:8D D9 05 STA $05D9 ; NPC #$13 sprite ID 0x03D4A4|$0F:$D494:20 5C F7 JSR $F75C ; load ROM bank #$00 0x03D4A7|$0F:$D497:A9 6B LDA #$6B ; call to code in a different bank ($00:$8003) 0x03D4A9|$0F:$D499:20 03 80 JSR $8003 0x03D4AC|$0F:$D49C:A9 06 LDA #$06 0x03D4AE|$0F:$D49E:05 CF ORA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x03D4B0|$0F:$D4A0:85 CF STA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x03D4B2|$0F:$D4A2:A9 FF LDA #$FF 0x03D4B4|$0F:$D4A4:85 45 STA $45 0x03D4B6|$0F:$D4A6:20 F7 D2 JSR $D2F7 0x03D4B9|$0F:$D4A9:20 2F E3 JSR $E32F 0x03D4BC|$0F:$D4AC:A9 00 LDA #$00 0x03D4BE|$0F:$D4AE:85 35 STA $35 ; flag indicating whether any menu is currently open 0x03D4C0|$0F:$D4B0:60 RTS ; control flow target (from $D46F, $D479, $D480, $D487) 0x03D4C1|$0F:$D4B1:A5 31 LDA $31 ; current map ID 0x03D4C3|$0F:$D4B3:C9 0B CMP #$0B ; Map ID #$0B: Lianport 0x03D4C5|$0F:$D4B5:D0 1B BNE $D4D2 0x03D4C7|$0F:$D4B7:A5 16 LDA $16 ; current map X-pos (1) 0x03D4C9|$0F:$D4B9:C9 19 CMP #$19 0x03D4CB|$0F:$D4BB:D0 15 BNE $D4D2 0x03D4CD|$0F:$D4BD:A5 17 LDA $17 ; current map Y-pos (1) 0x03D4CF|$0F:$D4BF:C9 01 CMP #$01 0x03D4D1|$0F:$D4C1:D0 0F BNE $D4D2 0x03D4D3|$0F:$D4C3:AD B0 D6 LDA $D6B0 0x03D4D6|$0F:$D4C6:85 0C STA $0C 0x03D4D8|$0F:$D4C8:AD B1 D6 LDA $D6B1 0x03D4DB|$0F:$D4CB:85 0D STA $0D 0x03D4DD|$0F:$D4CD:A9 FF LDA #$FF 0x03D4DF|$0F:$D4CF:4C 8F D8 JMP $D88F ; warp to warp point given by ($0C) ; control flow target (from $D4B5, $D4BB, $D4C1) 0x03D4E2|$0F:$D4D2:A6 3C LDX $3C 0x03D4E4|$0F:$D4D4:A5 3B LDA $3B ; high nybble = terrain ID 0x03D4E6|$0F:$D4D6:29 F0 AND #$F0 0x03D4E8|$0F:$D4D8:85 3C STA $3C 0x03D4EA|$0F:$D4DA:A4 31 LDY $31 ; current map ID 0x03D4EC|$0F:$D4DC:F0 26 BEQ $D504 ; Map ID #$00: Fake Midenhall 0x03D4EE|$0F:$D4DE:E0 10 CPX #$10 0x03D4F0|$0F:$D4E0:F0 0C BEQ $D4EE 0x03D4F2|$0F:$D4E2:C9 10 CMP #$10 0x03D4F4|$0F:$D4E4:D0 08 BNE $D4EE 0x03D4F6|$0F:$D4E6:A9 82 LDA #$82 ; Music ID #$82: Stairs SFX 0x03D4F8|$0F:$D4E8:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03D4FB|$0F:$D4EB:4C EE D7 JMP $D7EE ; control flow target (from $D4E0, $D4E4) 0x03D4FE|$0F:$D4EE:C9 20 CMP #$20 0x03D500|$0F:$D4F0:F0 0A BEQ $D4FC 0x03D502|$0F:$D4F2:C9 30 CMP #$30 0x03D504|$0F:$D4F4:D0 0E BNE $D504 0x03D506|$0F:$D4F6:20 A2 E5 JSR $E5A2 0x03D509|$0F:$D4F9:4C A6 D7 JMP $D7A6 ; control flow target (from $D4F0) 0x03D50C|$0F:$D4FC:A9 82 LDA #$82 ; Music ID #$82: Stairs SFX 0x03D50E|$0F:$D4FE:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03D511|$0F:$D501:4C A6 D7 JMP $D7A6 ; control flow target (from $D4DC, $D4F4) 0x03D514|$0F:$D504:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03D516|$0F:$D506:C9 02 CMP #$02 0x03D518|$0F:$D508:B0 3A BCS $D544 0x03D51A|$0F:$D50A:A5 21 LDA $21 ; map width 0x03D51C|$0F:$D50C:C5 16 CMP $16 ; current map X-pos (1) 0x03D51E|$0F:$D50E:90 07 BCC $D517 0x03D520|$0F:$D510:A5 22 LDA $22 ; map height 0x03D522|$0F:$D512:C5 17 CMP $17 ; current map Y-pos (1) 0x03D524|$0F:$D514:90 01 BCC $D517 0x03D526|$0F:$D516:60 RTS ; control flow target (from $D50E, $D514, $D55E) 0x03D527|$0F:$D517:20 75 F7 JSR $F775 ; load ROM bank #$03 0x03D52A|$0F:$D51A:AD EC D7 LDA $D7EC ; -> $03:$BD13: warp points (map ID, X-pos, Y-pos); other end is same index in $02:$A27E 0x03D52D|$0F:$D51D:85 0C STA $0C 0x03D52F|$0F:$D51F:AD ED D7 LDA $D7ED 0x03D532|$0F:$D522:85 0D STA $0D 0x03D534|$0F:$D524:A0 00 LDY #$00 ; control flow target (from $D535, $D539) 0x03D536|$0F:$D526:B1 0C LDA ($0C),Y 0x03D538|$0F:$D528:29 7F AND #$7F 0x03D53A|$0F:$D52A:C5 31 CMP $31 ; current map ID 0x03D53C|$0F:$D52C:F0 0E BEQ $D53C 0x03D53E|$0F:$D52E:A5 0C LDA $0C 0x03D540|$0F:$D530:18 CLC 0x03D541|$0F:$D531:69 03 ADC #$03 0x03D543|$0F:$D533:85 0C STA $0C 0x03D545|$0F:$D535:90 EF BCC $D526 0x03D547|$0F:$D537:E6 0D INC $0D 0x03D549|$0F:$D539:D0 EB BNE $D526 0x03D54B|$0F:$D53B:60 RTS ; control flow target (from $D52C) 0x03D54C|$0F:$D53C:A9 82 LDA #$82 ; Music ID #$82: Stairs SFX 0x03D54E|$0F:$D53E:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03D551|$0F:$D541:4C B6 D7 JMP $D7B6 ; control flow target (from $D508) 0x03D554|$0F:$D544:A5 16 LDA $16 ; current map X-pos (1) 0x03D556|$0F:$D546:4A LSR 0x03D557|$0F:$D547:18 CLC 0x03D558|$0F:$D548:E5 21 SBC $21 ; map width 0x03D55A|$0F:$D54A:B0 0B BCS $D557 0x03D55C|$0F:$D54C:A5 17 LDA $17 ; current map Y-pos (1) 0x03D55E|$0F:$D54E:4A LSR 0x03D55F|$0F:$D54F:18 CLC 0x03D560|$0F:$D550:E5 22 SBC $22 ; map height 0x03D562|$0F:$D552:B0 03 BCS $D557 0x03D564|$0F:$D554:4C E9 D5 JMP $D5E9 ; control flow target (from $D54A, $D552) 0x03D567|$0F:$D557:A5 31 LDA $31 ; current map ID 0x03D569|$0F:$D559:A0 05 LDY #$05 ; control flow target (from $D561) 0x03D56B|$0F:$D55B:D9 9B D6 CMP $D69B,Y 0x03D56E|$0F:$D55E:F0 B7 BEQ $D517 0x03D570|$0F:$D560:88 DEY 0x03D571|$0F:$D561:10 F8 BPL $D55B 0x03D573|$0F:$D563:AD 40 05 LDA $0540 ; NPC #$00 ? + direction nybble 0x03D576|$0F:$D566:29 03 AND #$03 0x03D578|$0F:$D568:AA TAX 0x03D579|$0F:$D569:0A ASL 0x03D57A|$0F:$D56A:A8 TAY 0x03D57B|$0F:$D56B:BD A9 D6 LDA $D6A9,X 0x03D57E|$0F:$D56E:85 0F STA $0F 0x03D580|$0F:$D570:B9 A1 D6 LDA $D6A1,Y 0x03D583|$0F:$D573:85 12 STA $12 0x03D585|$0F:$D575:85 10 STA $10 0x03D587|$0F:$D577:B9 A2 D6 LDA $D6A2,Y 0x03D58A|$0F:$D57A:85 13 STA $13 0x03D58C|$0F:$D57C:85 11 STA $11 0x03D58E|$0F:$D57E:20 61 F7 JSR $F761 ; load ROM bank #$06 0x03D591|$0F:$D581:A5 0F LDA $0F 0x03D593|$0F:$D583:48 PHA 0x03D594|$0F:$D584:A5 10 LDA $10 0x03D596|$0F:$D586:48 PHA 0x03D597|$0F:$D587:A9 6E LDA #$6E ; call to code in a different bank ($06:$A369) 0x03D599|$0F:$D589:20 69 A3 JSR $A369 ; check for item A in party inventory, returning inventory index of item in A/X if found, #$FF if not 0x03D59C|$0F:$D58C:AA TAX 0x03D59D|$0F:$D58D:68 PLA 0x03D59E|$0F:$D58E:85 10 STA $10 0x03D5A0|$0F:$D590:68 PLA 0x03D5A1|$0F:$D591:85 0F STA $0F 0x03D5A3|$0F:$D593:E0 FF CPX #$FF 0x03D5A5|$0F:$D595:D0 06 BNE $D59D ; call to code in a different bank ($06:$8CD4) 0x03D5A7|$0F:$D597:20 D4 8C JSR $8CD4 ; handler for Outside spell effect 0x03D5AA|$0F:$D59A:4C B6 D5 JMP $D5B6 ; control flow target (from $D595) ; call to code in a different bank ($06:$8CD4) 0x03D5AD|$0F:$D59D:20 D4 8C JSR $8CD4 ; handler for Outside spell effect 0x03D5B0|$0F:$D5A0:46 0E LSR $0E 0x03D5B2|$0F:$D5A2:F0 12 BEQ $D5B6 ; control flow target (from $D5B4) 0x03D5B4|$0F:$D5A4:A5 10 LDA $10 0x03D5B6|$0F:$D5A6:18 CLC 0x03D5B7|$0F:$D5A7:65 12 ADC $12 0x03D5B9|$0F:$D5A9:85 12 STA $12 0x03D5BB|$0F:$D5AB:A5 11 LDA $11 0x03D5BD|$0F:$D5AD:18 CLC 0x03D5BE|$0F:$D5AE:65 13 ADC $13 0x03D5C0|$0F:$D5B0:85 13 STA $13 0x03D5C2|$0F:$D5B2:C6 0E DEC $0E 0x03D5C4|$0F:$D5B4:D0 EE BNE $D5A4 ; control flow target (from $D59A, $D5A2) 0x03D5C6|$0F:$D5B6:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03D5C9|$0F:$D5B9:A0 00 LDY #$00 0x03D5CB|$0F:$D5BB:B1 0C LDA ($0C),Y 0x03D5CD|$0F:$D5BD:85 5A STA $5A ; Crest/direction name write buffer start 0x03D5CF|$0F:$D5BF:C8 INY 0x03D5D0|$0F:$D5C0:B1 0C LDA ($0C),Y 0x03D5D2|$0F:$D5C2:18 CLC 0x03D5D3|$0F:$D5C3:65 12 ADC $12 0x03D5D5|$0F:$D5C5:85 5B STA $5B 0x03D5D7|$0F:$D5C7:C8 INY 0x03D5D8|$0F:$D5C8:B1 0C LDA ($0C),Y 0x03D5DA|$0F:$D5CA:18 CLC 0x03D5DB|$0F:$D5CB:65 13 ADC $13 0x03D5DD|$0F:$D5CD:85 5C STA $5C ; control flow target (from $D617) 0x03D5DF|$0F:$D5CF:A5 0F LDA $0F 0x03D5E1|$0F:$D5D1:48 PHA 0x03D5E2|$0F:$D5D2:20 E1 D6 JSR $D6E1 0x03D5E5|$0F:$D5D5:A2 28 LDX #$28 0x03D5E7|$0F:$D5D7:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03D5EA|$0F:$D5DA:AD 99 D6 LDA $D699 0x03D5ED|$0F:$D5DD:85 0C STA $0C 0x03D5EF|$0F:$D5DF:AD 9A D6 LDA $D69A 0x03D5F2|$0F:$D5E2:85 0D STA $0D 0x03D5F4|$0F:$D5E4:68 PLA 0x03D5F5|$0F:$D5E5:4C 8F D8 JMP $D88F ; warp to warp point given by ($0C) ; control flow target (from $D5ED, $D5FA, $D5FE, $D61C, $D620, $D629) 0x03D5F8|$0F:$D5E8:60 RTS ; control flow target (from $D554) 0x03D5F9|$0F:$D5E9:A5 31 LDA $31 ; current map ID 0x03D5FB|$0F:$D5EB:C9 65 CMP #$65 ; Map ID #$65: Dragon Horn South 6F 0x03D5FD|$0F:$D5ED:B0 F9 BCS $D5E8 0x03D5FF|$0F:$D5EF:C9 61 CMP #$61 ; Map ID #$61: Dragon Horn South 2F 0x03D601|$0F:$D5F1:90 27 BCC $D61A 0x03D603|$0F:$D5F3:20 78 D6 JSR $D678 0x03D606|$0F:$D5F6:A5 0C LDA $0C 0x03D608|$0F:$D5F8:C9 08 CMP #$08 0x03D60A|$0F:$D5FA:B0 EC BCS $D5E8 0x03D60C|$0F:$D5FC:C9 04 CMP #$04 0x03D60E|$0F:$D5FE:90 E8 BCC $D5E8 0x03D610|$0F:$D600:A9 60 LDA #$60 0x03D612|$0F:$D602:85 5A STA $5A ; Crest/direction name write buffer start 0x03D614|$0F:$D604:A5 16 LDA $16 ; current map X-pos (1) 0x03D616|$0F:$D606:85 5B STA $5B 0x03D618|$0F:$D608:A5 17 LDA $17 ; current map Y-pos (1) 0x03D61A|$0F:$D60A:85 5C STA $5C ; control flow target (from $D675) 0x03D61C|$0F:$D60C:AD 40 05 LDA $0540 ; NPC #$00 ? + direction nybble 0x03D61F|$0F:$D60F:29 03 AND #$03 0x03D621|$0F:$D611:A8 TAY 0x03D622|$0F:$D612:B9 A9 D6 LDA $D6A9,Y 0x03D625|$0F:$D615:85 0F STA $0F 0x03D627|$0F:$D617:4C CF D5 JMP $D5CF ; control flow target (from $D5F1) 0x03D62A|$0F:$D61A:C9 40 CMP #$40 ; Map ID #$40: Spring of Bravery 0x03D62C|$0F:$D61C:B0 CA BCS $D5E8 0x03D62E|$0F:$D61E:C9 38 CMP #$38 ; Map ID #$38: Cave to Rhone 1F 0x03D630|$0F:$D620:90 C6 BCC $D5E8 0x03D632|$0F:$D622:20 78 D6 JSR $D678 0x03D635|$0F:$D625:A5 0C LDA $0C 0x03D637|$0F:$D627:C9 05 CMP #$05 0x03D639|$0F:$D629:D0 BD BNE $D5E8 0x03D63B|$0F:$D62B:A5 31 LDA $31 ; current map ID 0x03D63D|$0F:$D62D:38 SEC 0x03D63E|$0F:$D62E:E9 38 SBC #$38 ; Map ID #$38: Cave to Rhone 1F 0x03D640|$0F:$D630:AA TAX 0x03D641|$0F:$D631:BD B2 D6 LDA $D6B2,X 0x03D644|$0F:$D634:85 5A STA $5A ; Crest/direction name write buffer start 0x03D646|$0F:$D636:BD BA D6 LDA $D6BA,X 0x03D649|$0F:$D639:20 83 D6 JSR $D683 0x03D64C|$0F:$D63C:7D CA D6 ADC $D6CA,X 0x03D64F|$0F:$D63F:85 5B STA $5B 0x03D651|$0F:$D641:BD C2 D6 LDA $D6C2,X 0x03D654|$0F:$D644:20 83 D6 JSR $D683 0x03D657|$0F:$D647:7D D2 D6 ADC $D6D2,X 0x03D65A|$0F:$D64A:85 5C STA $5C 0x03D65C|$0F:$D64C:A5 14 LDA $14 0x03D65E|$0F:$D64E:85 0C STA $0C 0x03D660|$0F:$D650:A5 15 LDA $15 0x03D662|$0F:$D652:85 0E STA $0E 0x03D664|$0F:$D654:20 FC DD JSR $DDFC 0x03D667|$0F:$D657:A9 5F LDA #$5F 0x03D669|$0F:$D659:85 09 STA $09 0x03D66B|$0F:$D65B:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03D66E|$0F:$D65E:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 0x03D671|$0F:$D661:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 0x03D674|$0F:$D664:A5 07 LDA $07 0x03D676|$0F:$D666:18 CLC 0x03D677|$0F:$D667:69 1E ADC #$1E 0x03D679|$0F:$D669:85 07 STA $07 0x03D67B|$0F:$D66B:90 02 BCC $D66F 0x03D67D|$0F:$D66D:E6 08 INC $08 ; control flow target (from $D66B) 0x03D67F|$0F:$D66F:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 0x03D682|$0F:$D672:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 0x03D685|$0F:$D675:4C 0C D6 JMP $D60C ; control flow target (from $D5F3, $D622) 0x03D688|$0F:$D678:A5 16 LDA $16 ; current map X-pos (1) 0x03D68A|$0F:$D67A:85 0C STA $0C 0x03D68C|$0F:$D67C:A5 17 LDA $17 ; current map Y-pos (1) 0x03D68E|$0F:$D67E:85 0E STA $0E 0x03D690|$0F:$D680:4C 89 DF JMP $DF89 ; control flow target (from $D639, $D644) 0x03D693|$0F:$D683:85 0E STA $0E 0x03D695|$0F:$D685:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x03D698|$0F:$D688:A5 32 LDA $32 ; RNG byte 0 0x03D69A|$0F:$D68A:85 0C STA $0C 0x03D69C|$0F:$D68C:A9 00 LDA #$00 0x03D69E|$0F:$D68E:85 0D STA $0D 0x03D6A0|$0F:$D690:85 0F STA $0F 0x03D6A2|$0F:$D692:20 39 C3 JSR $C339 ; 16-bit multiplication: ($10-$11) = ($0C-$0D) * ($0E-$0F); consumes $0C-$0F 0x03D6A5|$0F:$D695:A5 11 LDA $11 0x03D6A7|$0F:$D697:0A ASL 0x03D6A8|$0F:$D698:60 RTS ; code -> data ; data load target (from $D5DA) ; indirect data load target 0x03D6A9|$0F:$D699:5A ; data load target (from $D5DF) ; indirect data load target 0x03D6AA|$0F:$D69A:00 ; indexed data load target (from $D55B) ; indirect data load target 0x03D6AB|$0F:$D69B:38 ; Map ID #$38: Cave to Rhone 1F ; indirect data load target 0x03D6AC|$0F:$D69C:49 ; Map ID #$49: Moon Tower 1F ; indirect data load target 0x03D6AD|$0F:$D69D:50 ; Map ID #$50: Lighthouse 1F ; indirect data load target 0x03D6AE|$0F:$D69E:58 ; Map ID #$58: Wind Tower 1F ; indirect data load target 0x03D6AF|$0F:$D69F:60 ; Map ID #$60: Dragon Horn South 1F ; indirect data load target 0x03D6B0|$0F:$D6A0:66 ; Map ID #$66: Dragon Horn North 1F ; indexed data load target (from $D570) ; indirect data load target 0x03D6B1|$0F:$D6A1:00 ; indexed data load target (from $D577) ; indirect data load target 0x03D6B2|$0F:$D6A2:FF ; indirect data load target 0x03D6B3|$0F:$D6A3:01 ; indirect data load target 0x03D6B4|$0F:$D6A4:00 ; indirect data load target 0x03D6B5|$0F:$D6A5:00 ; indirect data load target 0x03D6B6|$0F:$D6A6:01 ; indirect data load target 0x03D6B7|$0F:$D6A7:FF ; indirect data load target 0x03D6B8|$0F:$D6A8:00 ; indexed data load target (from $D56B, $D612) ; indirect data load target 0x03D6B9|$0F:$D6A9:09 ; indirect data load target 0x03D6BA|$0F:$D6AA:04 ; indirect data load target 0x03D6BB|$0F:$D6AB:0A ; indirect data load target 0x03D6BC|$0F:$D6AC:03 ; indirect data load target 0x03D6BD|$0F:$D6AD:01 ; indirect data load target 0x03D6BE|$0F:$D6AE:1E ; indirect data load target 0x03D6BF|$0F:$D6AF:38 ; data load target (from $D4C3) ; indirect data load target 0x03D6C0|$0F:$D6B0:AD ; data load target (from $D4C8) ; indirect data load target 0x03D6C1|$0F:$D6B1:D6 ; indexed data load target (from $D631) ; indirect data load target 0x03D6C2|$0F:$D6B2:37 ; indirect data load target 0x03D6C3|$0F:$D6B3:38 ; indirect data load target 0x03D6C4|$0F:$D6B4:38 ; indirect data load target 0x03D6C5|$0F:$D6B5:38 ; indirect data load target 0x03D6C6|$0F:$D6B6:3B ; indirect data load target 0x03D6C7|$0F:$D6B7:3C ; indirect data load target 0x03D6C8|$0F:$D6B8:3D ; indirect data load target 0x03D6C9|$0F:$D6B9:3E ; indexed data load target (from $D636) ; indirect data load target 0x03D6CA|$0F:$D6BA:08 ; indirect data load target 0x03D6CB|$0F:$D6BB:02 ; indirect data load target 0x03D6CC|$0F:$D6BC:02 ; indirect data load target 0x03D6CD|$0F:$D6BD:02 ; indirect data load target 0x03D6CE|$0F:$D6BE:02 ; indirect data load target 0x03D6CF|$0F:$D6BF:02 ; indirect data load target 0x03D6D0|$0F:$D6C0:08 ; indirect data load target 0x03D6D1|$0F:$D6C1:08 ; indexed data load target (from $D641) ; indirect data load target 0x03D6D2|$0F:$D6C2:07 ; indirect data load target 0x03D6D3|$0F:$D6C3:02 ; indirect data load target 0x03D6D4|$0F:$D6C4:02 ; indirect data load target 0x03D6D5|$0F:$D6C5:02 ; indirect data load target 0x03D6D6|$0F:$D6C6:04 ; indirect data load target 0x03D6D7|$0F:$D6C7:03 ; indirect data load target 0x03D6D8|$0F:$D6C8:08 ; indirect data load target 0x03D6D9|$0F:$D6C9:03 ; indexed data load target (from $D63C) ; indirect data load target 0x03D6DA|$0F:$D6CA:02 ; indirect data load target 0x03D6DB|$0F:$D6CB:06 ; indirect data load target 0x03D6DC|$0F:$D6CC:06 ; indirect data load target 0x03D6DD|$0F:$D6CD:06 ; indirect data load target 0x03D6DE|$0F:$D6CE:0E ; indirect data load target 0x03D6DF|$0F:$D6CF:0C ; indirect data load target 0x03D6E0|$0F:$D6D0:08 ; indirect data load target 0x03D6E1|$0F:$D6D1:12 ; indexed data load target (from $D647) ; indirect data load target 0x03D6E2|$0F:$D6D2:02 ; indirect data load target 0x03D6E3|$0F:$D6D3:0E ; indirect data load target 0x03D6E4|$0F:$D6D4:0E ; indirect data load target 0x03D6E5|$0F:$D6D5:0E ; indirect data load target 0x03D6E6|$0F:$D6D6:0A ; indirect data load target 0x03D6E7|$0F:$D6D7:30 ; indirect data load target 0x03D6E8|$0F:$D6D8:08 ; indirect data load target 0x03D6E9|$0F:$D6D9:02 ; data -> code ; control flow target (from $D489) 0x03D6EA|$0F:$D6DA:20 CC E3 JSR $E3CC 0x03D6ED|$0F:$D6DD:A9 10 LDA #$10 0x03D6EF|$0F:$D6DF:D0 07 BNE $D6E8 ; control flow target (from $D5D2) 0x03D6F1|$0F:$D6E1:A9 98 LDA #$98 ; Music ID #$98: more Watergate? SFX 0x03D6F3|$0F:$D6E3:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03D6F6|$0F:$D6E6:A9 08 LDA #$08 ; control flow target (from $D6DF) 0x03D6F8|$0F:$D6E8:85 97 STA $97 ; subject hero ID $97 0x03D6FA|$0F:$D6EA:A9 FF LDA #$FF 0x03D6FC|$0F:$D6EC:85 35 STA $35 ; flag indicating whether any menu is currently open 0x03D6FE|$0F:$D6EE:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03D701|$0F:$D6F1:A9 00 LDA #$00 0x03D703|$0F:$D6F3:8D 3A 05 STA $053A 0x03D706|$0F:$D6F6:8D 3B 05 STA $053B 0x03D709|$0F:$D6F9:20 CB D8 JSR $D8CB 0x03D70C|$0F:$D6FC:AD 49 05 LDA $0549 ; NPC #$01 sprite ID 0x03D70F|$0F:$D6FF:48 PHA 0x03D710|$0F:$D700:AD 51 05 LDA $0551 ; NPC #$02 sprite ID 0x03D713|$0F:$D703:48 PHA 0x03D714|$0F:$D704:20 1D D7 JSR $D71D 0x03D717|$0F:$D707:20 1D D7 JSR $D71D 0x03D71A|$0F:$D70A:A9 80 LDA #$80 0x03D71C|$0F:$D70C:8D 3A 05 STA $053A 0x03D71F|$0F:$D70F:A9 6F LDA #$6F 0x03D721|$0F:$D711:8D 3B 05 STA $053B 0x03D724|$0F:$D714:68 PLA 0x03D725|$0F:$D715:8D 51 05 STA $0551 ; NPC #$02 sprite ID 0x03D728|$0F:$D718:68 PLA 0x03D729|$0F:$D719:8D 49 05 STA $0549 ; NPC #$01 sprite ID 0x03D72C|$0F:$D71C:60 RTS ; control flow target (from $D704, $D707) 0x03D72D|$0F:$D71D:A5 97 LDA $97 ; subject hero ID $97 0x03D72F|$0F:$D71F:85 49 STA $49 ; object hero/target/item/string ID $49 ; control flow target (from $D733) 0x03D731|$0F:$D721:A0 08 LDY #$08 0x03D733|$0F:$D723:20 69 D7 JSR $D769 0x03D736|$0F:$D726:A0 10 LDY #$10 0x03D738|$0F:$D728:20 69 D7 JSR $D769 0x03D73B|$0F:$D72B:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03D73E|$0F:$D72E:20 CB D8 JSR $D8CB 0x03D741|$0F:$D731:C6 49 DEC $49 ; object hero/target/item/string ID $49 0x03D743|$0F:$D733:D0 EC BNE $D721 0x03D745|$0F:$D735:A0 10 LDY #$10 0x03D747|$0F:$D737:20 77 D7 JSR $D777 0x03D74A|$0F:$D73A:A0 08 LDY #$08 0x03D74C|$0F:$D73C:20 77 D7 JSR $D777 0x03D74F|$0F:$D73F:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03D752|$0F:$D742:4C CB D8 JMP $D8CB ; control flow target (from $D770, $D773) 0x03D755|$0F:$D745:B9 3A 05 LDA $053A,Y 0x03D758|$0F:$D748:38 SEC 0x03D759|$0F:$D749:F9 3C 05 SBC $053C,Y ; NPC #$00 ? 0x03D75C|$0F:$D74C:99 3A 05 STA $053A,Y 0x03D75F|$0F:$D74F:A5 97 LDA $97 ; subject hero ID $97 0x03D761|$0F:$D751:C9 10 CMP #$10 0x03D763|$0F:$D753:F0 0A BEQ $D75F 0x03D765|$0F:$D755:B9 3A 05 LDA $053A,Y 0x03D768|$0F:$D758:38 SEC 0x03D769|$0F:$D759:F9 3C 05 SBC $053C,Y ; NPC #$00 ? 0x03D76C|$0F:$D75C:99 3A 05 STA $053A,Y ; control flow target (from $D753) 0x03D76F|$0F:$D75F:C8 INY 0x03D770|$0F:$D760:60 RTS ; control flow target (from $D7A0, $D7A3) 0x03D771|$0F:$D761:B9 34 05 LDA $0534,Y 0x03D774|$0F:$D764:99 3C 05 STA $053C,Y ; NPC #$00 ? 0x03D777|$0F:$D767:C8 INY 0x03D778|$0F:$D768:60 RTS ; control flow target (from $D723, $D728) 0x03D779|$0F:$D769:B9 41 05 LDA $0541,Y ; NPC #$00 sprite ID 0x03D77C|$0F:$D76C:C9 FF CMP #$FF 0x03D77E|$0F:$D76E:F0 06 BEQ $D776 0x03D780|$0F:$D770:20 45 D7 JSR $D745 0x03D783|$0F:$D773:20 45 D7 JSR $D745 ; control flow target (from $D76E, $D77C) 0x03D786|$0F:$D776:60 RTS ; control flow target (from $D737, $D73C) 0x03D787|$0F:$D777:B9 41 05 LDA $0541,Y ; NPC #$00 sprite ID 0x03D78A|$0F:$D77A:C9 FF CMP #$FF 0x03D78C|$0F:$D77C:F0 F8 BEQ $D776 0x03D78E|$0F:$D77E:B9 3A 05 LDA $053A,Y 0x03D791|$0F:$D781:C9 80 CMP #$80 0x03D793|$0F:$D783:D0 15 BNE $D79A 0x03D795|$0F:$D785:B9 3B 05 LDA $053B,Y 0x03D798|$0F:$D788:C9 6F CMP #$6F 0x03D79A|$0F:$D78A:D0 0E BNE $D79A 0x03D79C|$0F:$D78C:A9 FF LDA #$FF 0x03D79E|$0F:$D78E:99 41 05 STA $0541,Y ; NPC #$00 sprite ID 0x03D7A1|$0F:$D791:A9 00 LDA #$00 0x03D7A3|$0F:$D793:99 3A 05 STA $053A,Y 0x03D7A6|$0F:$D796:99 3B 05 STA $053B,Y 0x03D7A9|$0F:$D799:60 RTS ; control flow target (from $D783, $D78A) 0x03D7AA|$0F:$D79A:B9 38 05 LDA $0538,Y 0x03D7AD|$0F:$D79D:99 40 05 STA $0540,Y ; NPC #$00 ? + direction nybble 0x03D7B0|$0F:$D7A0:20 61 D7 JSR $D761 0x03D7B3|$0F:$D7A3:4C 61 D7 JMP $D761 ; control flow target (from $D4F9, $D501) ; external control flow target (from $06:$96C6) 0x03D7B6|$0F:$D7A6:20 75 F7 JSR $F775 ; load ROM bank #$03 0x03D7B9|$0F:$D7A9:AD EC D7 LDA $D7EC ; -> $03:$BD13: warp points (map ID, X-pos, Y-pos); other end is same index in $02:$A27E 0x03D7BC|$0F:$D7AC:85 0C STA $0C 0x03D7BE|$0F:$D7AE:AD ED D7 LDA $D7ED 0x03D7C1|$0F:$D7B1:85 0D STA $0D 0x03D7C3|$0F:$D7B3:20 69 D8 JSR $D869 ; scan through warp point list (not sure what stops this from scanning through entire ROM...), updating $0C-$0D to address of the relevant warp point ; control flow target (from $D541) 0x03D7C6|$0F:$D7B6:A5 0C LDA $0C 0x03D7C8|$0F:$D7B8:38 SEC 0x03D7C9|$0F:$D7B9:ED EC D7 SBC $D7EC ; -> $03:$BD13: warp points (map ID, X-pos, Y-pos); other end is same index in $02:$A27E 0x03D7CC|$0F:$D7BC:85 0C STA $0C 0x03D7CE|$0F:$D7BE:A5 0D LDA $0D 0x03D7D0|$0F:$D7C0:ED ED D7 SBC $D7ED 0x03D7D3|$0F:$D7C3:85 0D STA $0D 0x03D7D5|$0F:$D7C5:A5 0C LDA $0C 0x03D7D7|$0F:$D7C7:18 CLC 0x03D7D8|$0F:$D7C8:6D EA D7 ADC $D7EA ; -> $02:$A27E: warp points (map ID, X-pos, Y-pos); other end is same index in $03:$BD13 0x03D7DB|$0F:$D7CB:85 0C STA $0C 0x03D7DD|$0F:$D7CD:A5 0D LDA $0D 0x03D7DF|$0F:$D7CF:6D EB D7 ADC $D7EB 0x03D7E2|$0F:$D7D2:85 0D STA $0D 0x03D7E4|$0F:$D7D4:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03D7E7|$0F:$D7D7:A0 00 LDY #$00 0x03D7E9|$0F:$D7D9:B1 0C LDA ($0C),Y 0x03D7EB|$0F:$D7DB:10 03 BPL $D7E0 0x03D7ED|$0F:$D7DD:98 TYA 0x03D7EE|$0F:$D7DE:F0 57 BEQ $D837 ; control flow target (from $D7DB) 0x03D7F0|$0F:$D7E0:B1 0C LDA ($0C),Y 0x03D7F2|$0F:$D7E2:29 7F AND #$7F 0x03D7F4|$0F:$D7E4:C9 2B CMP #$2B 0x03D7F6|$0F:$D7E6:B0 49 BCS $D831 0x03D7F8|$0F:$D7E8:90 4B BCC $D835 ; code -> data ; -> $02:$A27E: warp points (map ID, X-pos, Y-pos); other end is same index in $03:$BD13 ; data load target (from $D7C8, $D7F1, $D801) 0x03D7FA|$0F:$D7EA:7E ; data load target (from $D7CF, $D7F6, $D808) 0x03D7FB|$0F:$D7EB: A2 ; $02:$A27E; warp points (map ID, X-pos, Y-pos); other end is same index in $03:$BD13 ; -> $03:$BD13: warp points (map ID, X-pos, Y-pos); other end is same index in $02:$A27E ; data load target (from $D51A, $D7A9, $D7B9, $D810) 0x03D7FC|$0F:$D7EC:13 ; data load target (from $D51F, $D7AE, $D7C0, $D817) 0x03D7FD|$0F:$D7ED: BD ; $03:$BD13; warp points (map ID, X-pos, Y-pos); other end is same index in $02:$A27E ; data -> code ; control flow target (from $D4EB) 0x03D7FE|$0F:$D7EE:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03D801|$0F:$D7F1:AD EA D7 LDA $D7EA ; -> $02:$A27E: warp points (map ID, X-pos, Y-pos); other end is same index in $03:$BD13; set $0C-$0D to the bank 2 end of the warp point data 0x03D804|$0F:$D7F4:85 0C STA $0C 0x03D806|$0F:$D7F6:AD EB D7 LDA $D7EB 0x03D809|$0F:$D7F9:85 0D STA $0D 0x03D80B|$0F:$D7FB:20 69 D8 JSR $D869 ; scan through warp point list (not sure what stops this from scanning through entire ROM...), updating $0C-$0D to address of the relevant warp point 0x03D80E|$0F:$D7FE:A5 0C LDA $0C ; now that we have the warp point address in $0C-$0D, subtract the original pointer to get the relative offset 0x03D810|$0F:$D800:38 SEC 0x03D811|$0F:$D801:ED EA D7 SBC $D7EA ; -> $02:$A27E: warp points (map ID, X-pos, Y-pos); other end is same index in $03:$BD13 0x03D814|$0F:$D804:85 0C STA $0C 0x03D816|$0F:$D806:A5 0D LDA $0D 0x03D818|$0F:$D808:ED EB D7 SBC $D7EB 0x03D81B|$0F:$D80B:85 0D STA $0D 0x03D81D|$0F:$D80D:A5 0C LDA $0C ; and then add the bank 3 pointer to get the corresponding bank 3 end of the warp point data 0x03D81F|$0F:$D80F:18 CLC 0x03D820|$0F:$D810:6D EC D7 ADC $D7EC ; -> $03:$BD13: warp points (map ID, X-pos, Y-pos); other end is same index in $02:$A27E 0x03D823|$0F:$D813:85 0C STA $0C 0x03D825|$0F:$D815:A5 0D LDA $0D 0x03D827|$0F:$D817:6D ED D7 ADC $D7ED 0x03D82A|$0F:$D81A:85 0D STA $0D ; external control flow target (from $06:$9956) 0x03D82C|$0F:$D81C:20 75 F7 JSR $F775 ; load ROM bank #$03 0x03D82F|$0F:$D81F:A0 00 LDY #$00 0x03D831|$0F:$D821:B1 0C LDA ($0C),Y ; map ID 0x03D833|$0F:$D823:10 04 BPL $D829 0x03D835|$0F:$D825:A9 02 LDA #$02 0x03D837|$0F:$D827:D0 0E BNE $D837 ; control flow target (from $D823) 0x03D839|$0F:$D829:B1 0C LDA ($0C),Y ; useless op; A hasn't changed since the last LDA 0x03D83B|$0F:$D82B:29 7F AND #$7F ; useless op; we got here from BPL 0x03D83D|$0F:$D82D:C9 2B CMP #$2B 0x03D83F|$0F:$D82F:B0 04 BCS $D835 ; control flow target (from $D7E6) 0x03D841|$0F:$D831:A9 04 LDA #$04 0x03D843|$0F:$D833:D0 02 BNE $D837 ; control flow target (from $D7E8, $D82F) 0x03D845|$0F:$D835:A9 03 LDA #$03 ; control flow target (from $D7DE, $D827, $D833, $D894) 0x03D847|$0F:$D837:85 45 STA $45 0x03D849|$0F:$D839:A0 00 LDY #$00 0x03D84B|$0F:$D83B:B1 0C LDA ($0C),Y ; warp destination map ID 0x03D84D|$0F:$D83D:29 7F AND #$7F 0x03D84F|$0F:$D83F:85 31 STA $31 ; current map ID 0x03D851|$0F:$D841:C8 INY 0x03D852|$0F:$D842:B1 0C LDA ($0C),Y ; warp destination X-pos 0x03D854|$0F:$D844:85 16 STA $16 ; current map X-pos (1) 0x03D856|$0F:$D846:85 28 STA $28 ; current map X-pos (2) 0x03D858|$0F:$D848:85 2A STA $2A ; current map X-pos pixel, low byte 0x03D85A|$0F:$D84A:C8 INY 0x03D85B|$0F:$D84B:B1 0C LDA ($0C),Y ; warp destination Y-pos 0x03D85D|$0F:$D84D:85 17 STA $17 ; current map Y-pos (1) 0x03D85F|$0F:$D84F:85 29 STA $29 ; current map Y-pos (2) 0x03D861|$0F:$D851:85 2C STA $2C ; current map Y-pos pixel, low byte 0x03D863|$0F:$D853:A9 00 LDA #$00 0x03D865|$0F:$D855:85 2B STA $2B ; current map X-pos pixel, high byte 0x03D867|$0F:$D857:85 2D STA $2D ; current map Y-pos pixel, high byte 0x03D869|$0F:$D859:A2 04 LDX #$04 ; convert 16x16 map positions to pixels ; control flow target (from $D864) 0x03D86B|$0F:$D85B:06 2A ASL $2A ; current map X-pos pixel, low byte 0x03D86D|$0F:$D85D:26 2B ROL $2B ; current map X-pos pixel, high byte 0x03D86F|$0F:$D85F:06 2C ASL $2C ; current map Y-pos pixel, low byte 0x03D871|$0F:$D861:26 2D ROL $2D ; current map Y-pos pixel, high byte 0x03D873|$0F:$D863:CA DEX 0x03D874|$0F:$D864:D0 F5 BNE $D85B 0x03D876|$0F:$D866:4C 87 E2 JMP $E287 ; scan through warp point list (not sure what stops this from scanning through entire ROM...), updating $0C-$0D to address of the relevant warp point ; control flow target (from $D7B3, $D7FB, $D889, $D88D) 0x03D879|$0F:$D869:A0 00 LDY #$00 0x03D87B|$0F:$D86B:B1 0C LDA ($0C),Y ; Map ID 0x03D87D|$0F:$D86D:29 7F AND #$7F 0x03D87F|$0F:$D86F:C5 31 CMP $31 ; current map ID 0x03D881|$0F:$D871:D0 0F BNE $D882 ; if different map/pos, update $0C-$0D to next index 0x03D883|$0F:$D873:C8 INY 0x03D884|$0F:$D874:A5 16 LDA $16 ; current map X-pos (1) 0x03D886|$0F:$D876:D1 0C CMP ($0C),Y 0x03D888|$0F:$D878:D0 08 BNE $D882 ; if different map/pos, update $0C-$0D to next index 0x03D88A|$0F:$D87A:C8 INY 0x03D88B|$0F:$D87B:A5 17 LDA $17 ; current map Y-pos (1) 0x03D88D|$0F:$D87D:D1 0C CMP ($0C),Y 0x03D88F|$0F:$D87F:D0 01 BNE $D882 ; if different map/pos, update $0C-$0D to next index 0x03D891|$0F:$D881:60 RTS ; if different map/pos, update $0C-$0D to next index ; control flow target (from $D871, $D878, $D87F) 0x03D892|$0F:$D882:A5 0C LDA $0C 0x03D894|$0F:$D884:18 CLC 0x03D895|$0F:$D885:69 03 ADC #$03 ; warp data is 3 bytes each 0x03D897|$0F:$D887:85 0C STA $0C 0x03D899|$0F:$D889:90 DE BCC $D869 ; scan through warp point list (not sure what stops this from scanning through entire ROM...), updating $0C-$0D to address of the relevant warp point 0x03D89B|$0F:$D88B:E6 0D INC $0D 0x03D89D|$0F:$D88D:D0 DA BNE $D869 ; scan through warp point list (not sure what stops this from scanning through entire ROM...), updating $0C-$0D to address of the relevant warp point ; warp to warp point given by ($0C) ; control flow target (from $D4CF, $D5E5) ; external control flow target (from $06:$8C39, $06:$8C5F, $06:$BD69) 0x03D89F|$0F:$D88F:48 PHA 0x03D8A0|$0F:$D890:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03D8A3|$0F:$D893:68 PLA 0x03D8A4|$0F:$D894:4C 37 D8 JMP $D837 ; control flow target (from $E600, $E630, $E694, $E6AE, $E6DD, $E704, $E72E, $E75B, $E791, $E7DB, $E802, $E82C, $E859, $E877) 0x03D8A7|$0F:$D897:A0 08 LDY #$08 0x03D8A9|$0F:$D899:20 D1 DB JSR $DBD1 0x03D8AC|$0F:$D89C:A0 10 LDY #$10 0x03D8AE|$0F:$D89E:20 D1 DB JSR $DBD1 0x03D8B1|$0F:$D8A1:A5 03 LDA $03 ; game clock? 0x03D8B3|$0F:$D8A3:29 0F AND #$0F 0x03D8B5|$0F:$D8A5:D0 24 BNE $D8CB 0x03D8B7|$0F:$D8A7:A0 00 LDY #$00 0x03D8B9|$0F:$D8A9:B9 49 05 LDA $0549,Y ; NPC #$01 sprite ID 0x03D8BC|$0F:$D8AC:C9 FF CMP #$FF 0x03D8BE|$0F:$D8AE:F0 03 BEQ $D8B3 0x03D8C0|$0F:$D8B0:20 E0 DB JSR $DBE0 ; control flow target (from $D8AE) 0x03D8C3|$0F:$D8B3:A0 08 LDY #$08 0x03D8C5|$0F:$D8B5:B9 49 05 LDA $0549,Y ; NPC #$01 sprite ID 0x03D8C8|$0F:$D8B8:C9 FF CMP #$FF 0x03D8CA|$0F:$D8BA:F0 03 BEQ $D8BF 0x03D8CC|$0F:$D8BC:20 E0 DB JSR $DBE0 ; control flow target (from $D8BA) 0x03D8CF|$0F:$D8BF:AD 48 05 LDA $0548 ; NPC #$01 ? + direction nybble 0x03D8D2|$0F:$D8C2:8D 50 05 STA $0550 ; NPC #$02 ? + direction nybble 0x03D8D5|$0F:$D8C5:AD 40 05 LDA $0540 ; NPC #$00 ? + direction nybble 0x03D8D8|$0F:$D8C8:8D 48 05 STA $0548 ; NPC #$01 ? + direction nybble ; control flow target (from $C758, $C827, $C847, $CCDC, $CD6F, $CD7E, $CF5E, $CF64, $D314, $D32E, $D6F9, $D72E, $D742, $D8A5, $E2F2, $E979, $F470, $F865, $FF8A) 0x03D8DB|$0F:$D8CB:A5 8E LDA $8E ; flag for in battle or not (#$FF)? 0x03D8DD|$0F:$D8CD:F0 01 BEQ $D8D0 0x03D8DF|$0F:$D8CF:60 RTS ; control flow target (from $D8CD) 0x03D8E0|$0F:$D8D0:20 75 F7 JSR $F775 ; load ROM bank #$03 0x03D8E3|$0F:$D8D3:A5 03 LDA $03 ; game clock? 0x03D8E5|$0F:$D8D5:29 0F AND #$0F 0x03D8E7|$0F:$D8D7:D0 07 BNE $D8E0 0x03D8E9|$0F:$D8D9:A5 36 LDA $36 0x03D8EB|$0F:$D8DB:18 CLC 0x03D8EC|$0F:$D8DC:69 08 ADC #$08 0x03D8EE|$0F:$D8DE:85 36 STA $36 ; control flow target (from $D8D7) 0x03D8F0|$0F:$D8E0:20 68 C4 JSR $C468 ; set every 4th byte of $0200 - $02FC to #$F0 0x03D8F3|$0F:$D8E3:A2 00 LDX #$00 0x03D8F5|$0F:$D8E5:A0 00 LDY #$00 0x03D8F7|$0F:$D8E7:84 37 STY $37 0x03D8F9|$0F:$D8E9:20 9A DC JSR $DC9A 0x03D8FC|$0F:$D8EC:A0 08 LDY #$08 0x03D8FE|$0F:$D8EE:A2 50 LDX #$50 0x03D900|$0F:$D8F0:20 9A DC JSR $DC9A 0x03D903|$0F:$D8F3:A0 10 LDY #$10 0x03D905|$0F:$D8F5:A2 B0 LDX #$B0 0x03D907|$0F:$D8F7:20 9A DC JSR $DC9A 0x03D90A|$0F:$D8FA:A5 38 LDA $38 0x03D90C|$0F:$D8FC:C9 FF CMP #$FF 0x03D90E|$0F:$D8FE:D0 03 BNE $D903 0x03D910|$0F:$D900:4C B6 DB JMP $DBB6 ; control flow target (from $D8FE) 0x03D913|$0F:$D903:A5 35 LDA $35 ; flag indicating whether any menu is currently open 0x03D915|$0F:$D905:F0 03 BEQ $D90A 0x03D917|$0F:$D907:4C 35 DB JMP $DB35 ; control flow target (from $D905) 0x03D91A|$0F:$D90A:A5 38 LDA $38 0x03D91C|$0F:$D90C:10 02 BPL $D910 0x03D91E|$0F:$D90E:29 7F AND #$7F ; control flow target (from $D90C) 0x03D920|$0F:$D910:0A ASL 0x03D921|$0F:$D911:0A ASL 0x03D922|$0F:$D912:0A ASL 0x03D923|$0F:$D913:69 18 ADC #$18 0x03D925|$0F:$D915:AA TAX 0x03D926|$0F:$D916:A9 02 LDA #$02 0x03D928|$0F:$D918:85 34 STA $34 ; control flow target (from $DB32) 0x03D92A|$0F:$D91A:BD 41 05 LDA $0541,X ; NPC #$00 sprite ID 0x03D92D|$0F:$D91D:C9 FF CMP #$FF 0x03D92F|$0F:$D91F:D0 03 BNE $D924 0x03D931|$0F:$D921:4C 29 DB JMP $DB29 ; control flow target (from $D91F) 0x03D934|$0F:$D924:A5 03 LDA $03 ; game clock? 0x03D936|$0F:$D926:29 0F AND #$0F 0x03D938|$0F:$D928:C9 01 CMP #$01 0x03D93A|$0F:$D92A:F0 03 BEQ $D92F 0x03D93C|$0F:$D92C:4C C4 DA JMP $DAC4 ; control flow target (from $D92A) 0x03D93F|$0F:$D92F:A5 35 LDA $35 ; flag indicating whether any menu is currently open 0x03D941|$0F:$D931:F0 1C BEQ $D94F ; control flow target (from $D95C, $D9F9) 0x03D943|$0F:$D933:A5 38 LDA $38 0x03D945|$0F:$D935:10 0D BPL $D944 0x03D947|$0F:$D937:DE 3A 05 DEC $053A,X 0x03D94A|$0F:$D93A:BD 3A 05 LDA $053A,X 0x03D94D|$0F:$D93D:C9 FF CMP #$FF 0x03D94F|$0F:$D93F:D0 03 BNE $D944 0x03D951|$0F:$D941:DE 3B 05 DEC $053B,X ; control flow target (from $D935, $D93F, $D997) 0x03D954|$0F:$D944:BD 40 05 LDA $0540,X ; NPC #$00 ? + direction nybble 0x03D957|$0F:$D947:29 F3 AND #$F3 0x03D959|$0F:$D949:9D 40 05 STA $0540,X ; NPC #$00 ? + direction nybble 0x03D95C|$0F:$D94C:4C 29 DB JMP $DB29 ; control flow target (from $D931) 0x03D95F|$0F:$D94F:BD 40 05 LDA $0540,X ; NPC #$00 ? + direction nybble 0x03D962|$0F:$D952:29 F0 AND #$F0 0x03D964|$0F:$D954:C9 10 CMP #$10 0x03D966|$0F:$D956:F0 44 BEQ $D99C 0x03D968|$0F:$D958:C9 20 CMP #$20 0x03D96A|$0F:$D95A:F0 03 BEQ $D95F 0x03D96C|$0F:$D95C:4C 33 D9 JMP $D933 ; control flow target (from $D95A) 0x03D96F|$0F:$D95F:BD 3A 05 LDA $053A,X 0x03D972|$0F:$D962:85 0C STA $0C 0x03D974|$0F:$D964:BD 3B 05 LDA $053B,X 0x03D977|$0F:$D967:85 0D STA $0D 0x03D979|$0F:$D969:20 7A F7 JSR $F77A ; load ROM bank #$07 0x03D97C|$0F:$D96C:A0 00 LDY #$00 0x03D97E|$0F:$D96E:B1 0C LDA ($0C),Y 0x03D980|$0F:$D970:10 11 BPL $D983 0x03D982|$0F:$D972:BD 40 05 LDA $0540,X ; NPC #$00 ? + direction nybble 0x03D985|$0F:$D975:29 03 AND #$03 0x03D987|$0F:$D977:9D 40 05 STA $0540,X ; NPC #$00 ? + direction nybble 0x03D98A|$0F:$D97A:A5 38 LDA $38 0x03D98C|$0F:$D97C:29 7F AND #$7F 0x03D98E|$0F:$D97E:85 38 STA $38 0x03D990|$0F:$D980:4C 29 DB JMP $DB29 ; control flow target (from $D970) 0x03D993|$0F:$D983:FE 3A 05 INC $053A,X 0x03D996|$0F:$D986:D0 03 BNE $D98B 0x03D998|$0F:$D988:FE 3B 05 INC $053B,X ; control flow target (from $D986) 0x03D99B|$0F:$D98B:BD 40 05 LDA $0540,X ; NPC #$00 ? + direction nybble 0x03D99E|$0F:$D98E:29 F0 AND #$F0 0x03D9A0|$0F:$D990:11 0C ORA ($0C),Y 0x03D9A2|$0F:$D992:9D 40 05 STA $0540,X ; NPC #$00 ? + direction nybble 0x03D9A5|$0F:$D995:29 08 AND #$08 0x03D9A7|$0F:$D997:D0 AB BNE $D944 0x03D9A9|$0F:$D999:4C BC DA JMP $DABC ; control flow target (from $D956) 0x03D9AC|$0F:$D99C:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x03D9AF|$0F:$D99F:A5 32 LDA $32 ; RNG byte 0 0x03D9B1|$0F:$D9A1:29 03 AND #$03 0x03D9B3|$0F:$D9A3:85 0C STA $0C 0x03D9B5|$0F:$D9A5:BD 40 05 LDA $0540,X ; NPC #$00 ? + direction nybble 0x03D9B8|$0F:$D9A8:29 F0 AND #$F0 0x03D9BA|$0F:$D9AA:05 0C ORA $0C 0x03D9BC|$0F:$D9AC:9D 40 05 STA $0540,X ; NPC #$00 ? + direction nybble 0x03D9BF|$0F:$D9AF:20 F8 DB JSR $DBF8 0x03D9C2|$0F:$D9B2:20 03 DC JSR $DC03 0x03D9C5|$0F:$D9B5:A5 11 LDA $11 0x03D9C7|$0F:$D9B7:F0 04 BEQ $D9BD 0x03D9C9|$0F:$D9B9:A5 10 LDA $10 0x03D9CB|$0F:$D9BB:D0 3C BNE $D9F9 ; control flow target (from $D9B7) 0x03D9CD|$0F:$D9BD:20 18 E2 JSR $E218 0x03D9D0|$0F:$D9C0:BD 40 05 LDA $0540,X ; NPC #$00 ? + direction nybble 0x03D9D3|$0F:$D9C3:29 03 AND #$03 0x03D9D5|$0F:$D9C5:D0 05 BNE $D9CC 0x03D9D7|$0F:$D9C7:C6 13 DEC $13 0x03D9D9|$0F:$D9C9:4C E0 D9 JMP $D9E0 ; control flow target (from $D9C5) 0x03D9DC|$0F:$D9CC:C9 01 CMP #$01 0x03D9DE|$0F:$D9CE:D0 05 BNE $D9D5 0x03D9E0|$0F:$D9D0:E6 12 INC $12 0x03D9E2|$0F:$D9D2:4C E0 D9 JMP $D9E0 ; control flow target (from $D9CE) 0x03D9E5|$0F:$D9D5:C9 02 CMP #$02 0x03D9E7|$0F:$D9D7:D0 05 BNE $D9DE 0x03D9E9|$0F:$D9D9:E6 13 INC $13 0x03D9EB|$0F:$D9DB:4C E0 D9 JMP $D9E0 ; control flow target (from $D9D7) 0x03D9EE|$0F:$D9DE:C6 12 DEC $12 ; control flow target (from $D9C9, $D9D2, $D9DB) 0x03D9F0|$0F:$D9E0:A5 38 LDA $38 0x03D9F2|$0F:$D9E2:30 32 BMI $DA16 0x03D9F4|$0F:$D9E4:A0 0C LDY #$0C ; control flow target (from $D9EE) 0x03D9F6|$0F:$D9E6:A5 31 LDA $31 ; current map ID 0x03D9F8|$0F:$D9E8:D9 FC D9 CMP $D9FC,Y 0x03D9FB|$0F:$D9EB:F0 05 BEQ $D9F2 ; control flow target (from $D9F7) 0x03D9FD|$0F:$D9ED:88 DEY 0x03D9FE|$0F:$D9EE:10 F6 BPL $D9E6 0x03DA00|$0F:$D9F0:30 24 BMI $DA16 ; control flow target (from $D9EB) 0x03DA02|$0F:$D9F2:A5 13 LDA $13 0x03DA04|$0F:$D9F4:D9 09 DA CMP $DA09,Y 0x03DA07|$0F:$D9F7:D0 F4 BNE $D9ED ; control flow target (from $D9BB, $DA1A, $DA20, $DA2B, $DA37) 0x03DA09|$0F:$D9F9:4C 33 D9 JMP $D933 ; code -> data ; indexed data load target (from $D9E8) 0x03DA0C|$0F:$D9FC:15 ; Map ID #$15: Beran 0x03DA0D|$0F:$D9FD:0B ; Map ID #$0B: Lianport 0x03DA0E|$0F:$D9FE:0F ; Map ID #$0F: Osterfair 0x03DA0F|$0F:$D9FF:1A ; Map ID #$1A: Shrine SW of Cannock 0x03DA10|$0F:$DA00:10 ; Map ID #$10: Zahan 0x03DA11|$0F:$DA01:03 ; Map ID #$03: Midenhall 1F 0x03DA12|$0F:$DA02:05 ; Map ID #$05: Leftwyne 0x03DA13|$0F:$DA03:06 ; Map ID #$06: Cannock 0x03DA14|$0F:$DA04:07 ; Map ID #$07: Hamlin 0x03DA15|$0F:$DA05:0B ; Map ID #$0B: Lianport 0x03DA16|$0F:$DA06:0C ; Map ID #$0C: Tantegel 0x03DA17|$0F:$DA07:11 ; Map ID #$11: Tuhn 0x03DA18|$0F:$DA08:14 ; Map ID #$14: Wellgarth Underground ; indexed data load target (from $D9F4) ; indirect data load target 0x03DA19|$0F:$DA09:10 ; indirect data load target 0x03DA1A|$0F:$DA0A:08 ; indirect data load target 0x03DA1B|$0F:$DA0B:0D 0x03DA1C|$0F:$DA0C:04 ; indirect data load target 0x03DA1D|$0F:$DA0D:08 0x03DA1E|$0F:$DA0E:13 0x03DA1F|$0F:$DA0F:0D 0x03DA20|$0F:$DA10:0F 0x03DA21|$0F:$DA11:0F ; indirect data load target 0x03DA22|$0F:$DA12:14 ; indirect data load target 0x03DA23|$0F:$DA13:0C ; indirect data load target 0x03DA24|$0F:$DA14:0E ; indirect data load target 0x03DA25|$0F:$DA15:12 ; data -> code ; control flow target (from $D9E2, $D9F0) 0x03DA26|$0F:$DA16:A5 22 LDA $22 ; map height 0x03DA28|$0F:$DA18:C5 13 CMP $13 0x03DA2A|$0F:$DA1A:90 DD BCC $D9F9 0x03DA2C|$0F:$DA1C:A5 21 LDA $21 ; map width 0x03DA2E|$0F:$DA1E:C5 12 CMP $12 0x03DA30|$0F:$DA20:90 D7 BCC $D9F9 0x03DA32|$0F:$DA22:20 03 DC JSR $DC03 0x03DA35|$0F:$DA25:A5 11 LDA $11 0x03DA37|$0F:$DA27:F0 04 BEQ $DA2D 0x03DA39|$0F:$DA29:A5 10 LDA $10 ; control flow target (from $DAA7) 0x03DA3B|$0F:$DA2B:D0 CC BNE $D9F9 ; control flow target (from $DA27) 0x03DA3D|$0F:$DA2D:A5 12 LDA $12 0x03DA3F|$0F:$DA2F:C5 16 CMP $16 ; current map X-pos (1) 0x03DA41|$0F:$DA31:D0 06 BNE $DA39 0x03DA43|$0F:$DA33:A5 13 LDA $13 0x03DA45|$0F:$DA35:C5 17 CMP $17 ; current map Y-pos (1) ; control flow target (from $DA43, $DA5D, $DA71, $DA88) 0x03DA47|$0F:$DA37:F0 C0 BEQ $D9F9 ; control flow target (from $DA31) 0x03DA49|$0F:$DA39:A5 12 LDA $12 0x03DA4B|$0F:$DA3B:C5 28 CMP $28 ; current map X-pos (2) 0x03DA4D|$0F:$DA3D:D0 06 BNE $DA45 0x03DA4F|$0F:$DA3F:A5 13 LDA $13 0x03DA51|$0F:$DA41:C5 29 CMP $29 ; current map Y-pos (2) 0x03DA53|$0F:$DA43:F0 F2 BEQ $DA37 ; control flow target (from $DA3D) 0x03DA55|$0F:$DA45:A5 17 LDA $17 ; current map Y-pos (1) 0x03DA57|$0F:$DA47:18 CLC 0x03DA58|$0F:$DA48:6D 45 05 ADC $0545 ; NPC #$01 ? 0x03DA5B|$0F:$DA4B:85 0F STA $0F 0x03DA5D|$0F:$DA4D:A5 16 LDA $16 ; current map X-pos (1) 0x03DA5F|$0F:$DA4F:18 CLC 0x03DA60|$0F:$DA50:6D 44 05 ADC $0544 ; NPC #$01 ? 0x03DA63|$0F:$DA53:85 0E STA $0E 0x03DA65|$0F:$DA55:C5 12 CMP $12 0x03DA67|$0F:$DA57:D0 06 BNE $DA5F 0x03DA69|$0F:$DA59:A5 0F LDA $0F 0x03DA6B|$0F:$DA5B:C5 13 CMP $13 0x03DA6D|$0F:$DA5D:F0 D8 BEQ $DA37 ; control flow target (from $DA57) 0x03DA6F|$0F:$DA5F:A5 0E LDA $0E 0x03DA71|$0F:$DA61:18 CLC 0x03DA72|$0F:$DA62:6D 4C 05 ADC $054C ; NPC #$02 ? 0x03DA75|$0F:$DA65:C5 12 CMP $12 0x03DA77|$0F:$DA67:D0 0A BNE $DA73 0x03DA79|$0F:$DA69:A5 0F LDA $0F 0x03DA7B|$0F:$DA6B:18 CLC 0x03DA7C|$0F:$DA6C:6D 4D 05 ADC $054D ; NPC #$02 ? 0x03DA7F|$0F:$DA6F:C5 13 CMP $13 0x03DA81|$0F:$DA71:F0 C4 BEQ $DA37 ; control flow target (from $DA67) 0x03DA83|$0F:$DA73:A0 18 LDY #$18 ; control flow target (from $DA91) 0x03DA85|$0F:$DA75:B9 41 05 LDA $0541,Y ; NPC #$00 sprite ID 0x03DA88|$0F:$DA78:C9 FF CMP #$FF 0x03DA8A|$0F:$DA7A:F0 0E BEQ $DA8A 0x03DA8C|$0F:$DA7C:B9 3C 05 LDA $053C,Y ; NPC #$00 ? 0x03DA8F|$0F:$DA7F:C5 12 CMP $12 0x03DA91|$0F:$DA81:D0 07 BNE $DA8A 0x03DA93|$0F:$DA83:B9 3D 05 LDA $053D,Y ; NPC #$00 ? 0x03DA96|$0F:$DA86:C5 13 CMP $13 0x03DA98|$0F:$DA88:F0 AD BEQ $DA37 ; control flow target (from $DA7A, $DA81) 0x03DA9A|$0F:$DA8A:98 TYA 0x03DA9B|$0F:$DA8B:18 CLC 0x03DA9C|$0F:$DA8C:69 08 ADC #$08 0x03DA9E|$0F:$DA8E:A8 TAY 0x03DA9F|$0F:$DA8F:C9 B8 CMP #$B8 0x03DAA1|$0F:$DA91:D0 E2 BNE $DA75 0x03DAA3|$0F:$DA93:A5 0D LDA $0D 0x03DAA5|$0F:$DA95:48 PHA 0x03DAA6|$0F:$DA96:A5 12 LDA $12 0x03DAA8|$0F:$DA98:85 0C STA $0C 0x03DAAA|$0F:$DA9A:A5 13 LDA $13 0x03DAAC|$0F:$DA9C:85 0E STA $0E 0x03DAAE|$0F:$DA9E:20 89 DF JSR $DF89 0x03DAB1|$0F:$DAA1:20 22 E2 JSR $E222 0x03DAB4|$0F:$DAA4:68 PLA 0x03DAB5|$0F:$DAA5:C5 0D CMP $0D ; control flow target (from $DABA) 0x03DAB7|$0F:$DAA7:D0 82 BNE $DA2B 0x03DAB9|$0F:$DAA9:20 4A DF JSR $DF4A 0x03DABC|$0F:$DAAC:A0 04 LDY #$04 0x03DABE|$0F:$DAAE:B1 10 LDA ($10),Y 0x03DAC0|$0F:$DAB0:29 F0 AND #$F0 0x03DAC2|$0F:$DAB2:F0 08 BEQ $DABC 0x03DAC4|$0F:$DAB4:C9 10 CMP #$10 0x03DAC6|$0F:$DAB6:F0 04 BEQ $DABC 0x03DAC8|$0F:$DAB8:C9 20 CMP #$20 0x03DACA|$0F:$DABA:D0 EB BNE $DAA7 ; control flow target (from $D999, $DAB2, $DAB6) 0x03DACC|$0F:$DABC:BD 40 05 LDA $0540,X ; NPC #$00 ? + direction nybble 0x03DACF|$0F:$DABF:09 08 ORA #$08 0x03DAD1|$0F:$DAC1:9D 40 05 STA $0540,X ; NPC #$00 ? + direction nybble ; control flow target (from $D92C) 0x03DAD4|$0F:$DAC4:BD 40 05 LDA $0540,X ; NPC #$00 ? + direction nybble 0x03DAD7|$0F:$DAC7:29 08 AND #$08 0x03DAD9|$0F:$DAC9:F0 5E BEQ $DB29 0x03DADB|$0F:$DACB:A5 35 LDA $35 ; flag indicating whether any menu is currently open 0x03DADD|$0F:$DACD:D0 5A BNE $DB29 0x03DADF|$0F:$DACF:BD 40 05 LDA $0540,X ; NPC #$00 ? + direction nybble 0x03DAE2|$0F:$DAD2:29 03 AND #$03 0x03DAE4|$0F:$DAD4:D0 15 BNE $DAEB 0x03DAE6|$0F:$DAD6:BD 3F 05 LDA $053F,X ; NPC #$00 ? 0x03DAE9|$0F:$DAD9:38 SEC 0x03DAEA|$0F:$DADA:E9 01 SBC #$01 0x03DAEC|$0F:$DADC:29 0F AND #$0F 0x03DAEE|$0F:$DADE:9D 3F 05 STA $053F,X ; NPC #$00 ? 0x03DAF1|$0F:$DAE1:C9 0F CMP #$0F 0x03DAF3|$0F:$DAE3:D0 44 BNE $DB29 0x03DAF5|$0F:$DAE5:DE 3D 05 DEC $053D,X ; NPC #$00 ? 0x03DAF8|$0F:$DAE8:4C 29 DB JMP $DB29 ; control flow target (from $DAD4) 0x03DAFB|$0F:$DAEB:C9 01 CMP #$01 0x03DAFD|$0F:$DAED:D0 12 BNE $DB01 0x03DAFF|$0F:$DAEF:BD 3E 05 LDA $053E,X ; NPC #$00 ? 0x03DB02|$0F:$DAF2:18 CLC 0x03DB03|$0F:$DAF3:69 01 ADC #$01 0x03DB05|$0F:$DAF5:29 0F AND #$0F 0x03DB07|$0F:$DAF7:9D 3E 05 STA $053E,X ; NPC #$00 ? 0x03DB0A|$0F:$DAFA:D0 2D BNE $DB29 0x03DB0C|$0F:$DAFC:FE 3C 05 INC $053C,X ; NPC #$00 ? 0x03DB0F|$0F:$DAFF:D0 28 BNE $DB29 ; control flow target (from $DAED) 0x03DB11|$0F:$DB01:C9 02 CMP #$02 0x03DB13|$0F:$DB03:D0 12 BNE $DB17 0x03DB15|$0F:$DB05:BD 3F 05 LDA $053F,X ; NPC #$00 ? 0x03DB18|$0F:$DB08:18 CLC 0x03DB19|$0F:$DB09:69 01 ADC #$01 0x03DB1B|$0F:$DB0B:29 0F AND #$0F 0x03DB1D|$0F:$DB0D:9D 3F 05 STA $053F,X ; NPC #$00 ? 0x03DB20|$0F:$DB10:D0 17 BNE $DB29 0x03DB22|$0F:$DB12:FE 3D 05 INC $053D,X ; NPC #$00 ? 0x03DB25|$0F:$DB15:D0 12 BNE $DB29 ; control flow target (from $DB03) 0x03DB27|$0F:$DB17:BD 3E 05 LDA $053E,X ; NPC #$00 ? 0x03DB2A|$0F:$DB1A:38 SEC 0x03DB2B|$0F:$DB1B:E9 01 SBC #$01 0x03DB2D|$0F:$DB1D:29 0F AND #$0F 0x03DB2F|$0F:$DB1F:9D 3E 05 STA $053E,X ; NPC #$00 ? 0x03DB32|$0F:$DB22:C9 0F CMP #$0F 0x03DB34|$0F:$DB24:D0 03 BNE $DB29 0x03DB36|$0F:$DB26:DE 3C 05 DEC $053C,X ; NPC #$00 ? ; control flow target (from $D921, $D94C, $D980, $DAC9, $DACD, $DAE3, $DAE8, $DAFA, $DAFF, $DB10, $DB15, $DB24) 0x03DB39|$0F:$DB29:8A TXA 0x03DB3A|$0F:$DB2A:18 CLC 0x03DB3B|$0F:$DB2B:69 08 ADC #$08 0x03DB3D|$0F:$DB2D:AA TAX 0x03DB3E|$0F:$DB2E:C6 34 DEC $34 0x03DB40|$0F:$DB30:F0 03 BEQ $DB35 0x03DB42|$0F:$DB32:4C 1A D9 JMP $D91A ; control flow target (from $D907, $DB30) 0x03DB45|$0F:$DB35:A6 3A LDX $3A ; control flow target (from $DBB3) 0x03DB47|$0F:$DB37:BD 41 05 LDA $0541,X ; NPC #$00 sprite ID 0x03DB4A|$0F:$DB3A:C9 FF CMP #$FF 0x03DB4C|$0F:$DB3C:F0 60 BEQ $DB9E 0x03DB4E|$0F:$DB3E:20 33 DC JSR $DC33 0x03DB51|$0F:$DB41:A5 0E LDA $0E 0x03DB53|$0F:$DB43:18 CLC 0x03DB54|$0F:$DB44:69 07 ADC #$07 0x03DB56|$0F:$DB46:85 0E STA $0E 0x03DB58|$0F:$DB48:A5 0F LDA $0F 0x03DB5A|$0F:$DB4A:69 00 ADC #$00 0x03DB5C|$0F:$DB4C:F0 0A BEQ $DB58 0x03DB5E|$0F:$DB4E:C9 01 CMP #$01 0x03DB60|$0F:$DB50:D0 4C BNE $DB9E 0x03DB62|$0F:$DB52:A5 0E LDA $0E 0x03DB64|$0F:$DB54:C9 07 CMP #$07 0x03DB66|$0F:$DB56:B0 46 BCS $DB9E ; control flow target (from $DB4C) 0x03DB68|$0F:$DB58:20 65 DC JSR $DC65 0x03DB6B|$0F:$DB5B:A5 10 LDA $10 0x03DB6D|$0F:$DB5D:18 CLC 0x03DB6E|$0F:$DB5E:69 0D ADC #$0D 0x03DB70|$0F:$DB60:A5 11 LDA $11 0x03DB72|$0F:$DB62:69 00 ADC #$00 0x03DB74|$0F:$DB64:D0 38 BNE $DB9E 0x03DB76|$0F:$DB66:20 F8 DB JSR $DBF8 0x03DB79|$0F:$DB69:20 03 DC JSR $DC03 0x03DB7C|$0F:$DB6C:A5 11 LDA $11 0x03DB7E|$0F:$DB6E:F0 04 BEQ $DB74 0x03DB80|$0F:$DB70:A5 10 LDA $10 0x03DB82|$0F:$DB72:D0 2A BNE $DB9E ; control flow target (from $DB6E) 0x03DB84|$0F:$DB74:20 18 E2 JSR $E218 0x03DB87|$0F:$DB77:A5 0D LDA $0D 0x03DB89|$0F:$DB79:C5 1D CMP $1D 0x03DB8B|$0F:$DB7B:D0 21 BNE $DB9E 0x03DB8D|$0F:$DB7D:AD 48 61 LDA $6148 0x03DB90|$0F:$DB80:85 0E STA $0E 0x03DB92|$0F:$DB82:AD 49 61 LDA $6149 0x03DB95|$0F:$DB85:85 0F STA $0F 0x03DB97|$0F:$DB87:AD 4A 61 LDA $614A 0x03DB9A|$0F:$DB8A:85 10 STA $10 0x03DB9C|$0F:$DB8C:AD 4B 61 LDA $614B 0x03DB9F|$0F:$DB8F:85 11 STA $11 0x03DBA1|$0F:$DB91:8A TXA 0x03DBA2|$0F:$DB92:A8 TAY 0x03DBA3|$0F:$DB93:20 CB DD JSR $DDCB 0x03DBA6|$0F:$DB96:20 75 F7 JSR $F775 ; load ROM bank #$03 0x03DBA9|$0F:$DB99:20 DD DC JSR $DCDD 0x03DBAC|$0F:$DB9C:98 TYA 0x03DBAD|$0F:$DB9D:AA TAX ; control flow target (from $DB3C, $DB50, $DB56, $DB64, $DB72, $DB7B) 0x03DBAE|$0F:$DB9E:8A TXA 0x03DBAF|$0F:$DB9F:18 CLC 0x03DBB0|$0F:$DBA0:69 08 ADC #$08 0x03DBB2|$0F:$DBA2:AA TAX 0x03DBB3|$0F:$DBA3:E0 B8 CPX #$B8 0x03DBB5|$0F:$DBA5:D0 02 BNE $DBA9 0x03DBB7|$0F:$DBA7:A2 18 LDX #$18 ; control flow target (from $DBA5) 0x03DBB9|$0F:$DBA9:E4 3A CPX $3A 0x03DBBB|$0F:$DBAB:F0 09 BEQ $DBB6 0x03DBBD|$0F:$DBAD:A5 37 LDA $37 0x03DBBF|$0F:$DBAF:C9 0D CMP #$0D 0x03DBC1|$0F:$DBB1:F0 03 BEQ $DBB6 0x03DBC3|$0F:$DBB3:4C 37 DB JMP $DB37 ; control flow target (from $D900, $DBAB, $DBB1) 0x03DBC6|$0F:$DBB6:86 3A STX $3A 0x03DBC8|$0F:$DBB8:A5 03 LDA $03 ; game clock? 0x03DBCA|$0F:$DBBA:29 0F AND #$0F 0x03DBCC|$0F:$DBBC:D0 12 BNE $DBD0 0x03DBCE|$0F:$DBBE:A5 38 LDA $38 0x03DBD0|$0F:$DBC0:30 0E BMI $DBD0 0x03DBD2|$0F:$DBC2:E6 38 INC $38 0x03DBD4|$0F:$DBC4:E6 38 INC $38 0x03DBD6|$0F:$DBC6:A5 38 LDA $38 0x03DBD8|$0F:$DBC8:C9 0A CMP #$0A 0x03DBDA|$0F:$DBCA:90 04 BCC $DBD0 0x03DBDC|$0F:$DBCC:A9 00 LDA #$00 0x03DBDE|$0F:$DBCE:85 38 STA $38 ; control flow target (from $DBBC, $DBC0, $DBCA) 0x03DBE0|$0F:$DBD0:60 RTS ; control flow target (from $D899, $D89E) 0x03DBE1|$0F:$DBD1:20 D4 DB JSR $DBD4 ; control flow target (from $DBD1) 0x03DBE4|$0F:$DBD4:B9 3A 05 LDA $053A,Y 0x03DBE7|$0F:$DBD7:18 CLC 0x03DBE8|$0F:$DBD8:79 3E 05 ADC $053E,Y ; NPC #$00 ? 0x03DBEB|$0F:$DBDB:99 3A 05 STA $053A,Y 0x03DBEE|$0F:$DBDE:C8 INY 0x03DBEF|$0F:$DBDF:60 RTS ; control flow target (from $D8B0, $D8BC) 0x03DBF0|$0F:$DBE0:20 E3 DB JSR $DBE3 ; control flow target (from $DBE0) 0x03DBF3|$0F:$DBE3:B9 46 05 LDA $0546,Y ; NPC #$01 ? 0x03DBF6|$0F:$DBE6:38 SEC 0x03DBF7|$0F:$DBE7:F9 3E 05 SBC $053E,Y ; NPC #$00 ? 0x03DBFA|$0F:$DBEA:18 CLC 0x03DBFB|$0F:$DBEB:79 44 05 ADC $0544,Y ; NPC #$01 ? 0x03DBFE|$0F:$DBEE:99 44 05 STA $0544,Y ; NPC #$01 ? 0x03DC01|$0F:$DBF1:A9 00 LDA #$00 0x03DC03|$0F:$DBF3:99 3E 05 STA $053E,Y ; NPC #$00 ? 0x03DC06|$0F:$DBF6:C8 INY 0x03DC07|$0F:$DBF7:60 RTS ; control flow target (from $D9AF, $DB66) 0x03DC08|$0F:$DBF8:BD 3C 05 LDA $053C,X ; NPC #$00 ? 0x03DC0B|$0F:$DBFB:85 12 STA $12 0x03DC0D|$0F:$DBFD:BD 3D 05 LDA $053D,X ; NPC #$00 ? 0x03DC10|$0F:$DC00:85 13 STA $13 0x03DC12|$0F:$DC02:60 RTS ; control flow target (from $D9B2, $DA22, $DB69) 0x03DC13|$0F:$DC03:A9 00 LDA #$00 0x03DC15|$0F:$DC05:85 11 STA $11 0x03DC17|$0F:$DC07:A5 12 LDA $12 0x03DC19|$0F:$DC09:38 SEC 0x03DC1A|$0F:$DC0A:E5 16 SBC $16 ; current map X-pos (1) 0x03DC1C|$0F:$DC0C:18 CLC 0x03DC1D|$0F:$DC0D:69 08 ADC #$08 0x03DC1F|$0F:$DC0F:85 0C STA $0C 0x03DC21|$0F:$DC11:C9 10 CMP #$10 0x03DC23|$0F:$DC13:90 01 BCC $DC16 0x03DC25|$0F:$DC15:60 RTS ; control flow target (from $DC13) 0x03DC26|$0F:$DC16:A5 13 LDA $13 0x03DC28|$0F:$DC18:38 SEC 0x03DC29|$0F:$DC19:E5 17 SBC $17 ; current map Y-pos (1) 0x03DC2B|$0F:$DC1B:18 CLC 0x03DC2C|$0F:$DC1C:69 07 ADC #$07 0x03DC2E|$0F:$DC1E:85 0E STA $0E 0x03DC30|$0F:$DC20:C9 0F CMP #$0F 0x03DC32|$0F:$DC22:90 01 BCC $DC25 0x03DC34|$0F:$DC24:60 RTS ; control flow target (from $DC22) 0x03DC35|$0F:$DC25:20 31 DE JSR $DE31 0x03DC38|$0F:$DC28:A0 00 LDY #$00 0x03DC3A|$0F:$DC2A:B1 07 LDA ($07),Y 0x03DC3C|$0F:$DC2C:85 10 STA $10 0x03DC3E|$0F:$DC2E:A9 FF LDA #$FF 0x03DC40|$0F:$DC30:85 11 STA $11 0x03DC42|$0F:$DC32:60 RTS ; control flow target (from $DB3E) 0x03DC43|$0F:$DC33:BD 3C 05 LDA $053C,X ; NPC #$00 ? 0x03DC46|$0F:$DC36:85 0F STA $0F 0x03DC48|$0F:$DC38:A9 00 LDA #$00 0x03DC4A|$0F:$DC3A:46 0F LSR $0F 0x03DC4C|$0F:$DC3C:6A ROR 0x03DC4D|$0F:$DC3D:46 0F LSR $0F 0x03DC4F|$0F:$DC3F:6A ROR 0x03DC50|$0F:$DC40:46 0F LSR $0F 0x03DC52|$0F:$DC42:6A ROR 0x03DC53|$0F:$DC43:46 0F LSR $0F 0x03DC55|$0F:$DC45:6A ROR 0x03DC56|$0F:$DC46:1D 3E 05 ORA $053E,X ; NPC #$00 ? 0x03DC59|$0F:$DC49:38 SEC 0x03DC5A|$0F:$DC4A:E5 2A SBC $2A ; current map X-pos pixel, low byte 0x03DC5C|$0F:$DC4C:49 80 EOR #$80 0x03DC5E|$0F:$DC4E:85 0E STA $0E 0x03DC60|$0F:$DC50:A5 0F LDA $0F 0x03DC62|$0F:$DC52:E5 2B SBC $2B ; current map X-pos pixel, high byte 0x03DC64|$0F:$DC54:85 0F STA $0F 0x03DC66|$0F:$DC56:A5 0E LDA $0E 0x03DC68|$0F:$DC58:8D 48 61 STA $6148 0x03DC6B|$0F:$DC5B:30 02 BMI $DC5F 0x03DC6D|$0F:$DC5D:E6 0F INC $0F ; control flow target (from $DC5B) 0x03DC6F|$0F:$DC5F:A5 0F LDA $0F 0x03DC71|$0F:$DC61:8D 49 61 STA $6149 0x03DC74|$0F:$DC64:60 RTS ; control flow target (from $DB58) 0x03DC75|$0F:$DC65:BD 3D 05 LDA $053D,X ; NPC #$00 ? 0x03DC78|$0F:$DC68:85 11 STA $11 0x03DC7A|$0F:$DC6A:A9 00 LDA #$00 0x03DC7C|$0F:$DC6C:46 11 LSR $11 0x03DC7E|$0F:$DC6E:6A ROR 0x03DC7F|$0F:$DC6F:46 11 LSR $11 0x03DC81|$0F:$DC71:6A ROR 0x03DC82|$0F:$DC72:46 11 LSR $11 0x03DC84|$0F:$DC74:6A ROR 0x03DC85|$0F:$DC75:46 11 LSR $11 0x03DC87|$0F:$DC77:6A ROR 0x03DC88|$0F:$DC78:1D 3F 05 ORA $053F,X ; NPC #$00 ? 0x03DC8B|$0F:$DC7B:38 SEC 0x03DC8C|$0F:$DC7C:E5 2C SBC $2C ; current map Y-pos pixel, low byte 0x03DC8E|$0F:$DC7E:85 10 STA $10 0x03DC90|$0F:$DC80:A5 11 LDA $11 0x03DC92|$0F:$DC82:E5 2D SBC $2D ; current map Y-pos pixel, high byte 0x03DC94|$0F:$DC84:85 11 STA $11 0x03DC96|$0F:$DC86:A5 10 LDA $10 0x03DC98|$0F:$DC88:18 CLC 0x03DC99|$0F:$DC89:69 6F ADC #$6F 0x03DC9B|$0F:$DC8B:85 10 STA $10 0x03DC9D|$0F:$DC8D:8D 4A 61 STA $614A 0x03DCA0|$0F:$DC90:90 02 BCC $DC94 0x03DCA2|$0F:$DC92:E6 11 INC $11 ; control flow target (from $DC90) 0x03DCA4|$0F:$DC94:A5 11 LDA $11 0x03DCA6|$0F:$DC96:8D 4B 61 STA $614B 0x03DCA9|$0F:$DC99:60 RTS ; control flow target (from $D8E9, $D8F0, $D8F7) 0x03DCAA|$0F:$DC9A:8A TXA 0x03DCAB|$0F:$DC9B:48 PHA 0x03DCAC|$0F:$DC9C:20 75 F7 JSR $F775 ; load ROM bank #$03 0x03DCAF|$0F:$DC9F:68 PLA 0x03DCB0|$0F:$DCA0:AA TAX 0x03DCB1|$0F:$DCA1:B9 3A 05 LDA $053A,Y 0x03DCB4|$0F:$DCA4:19 3B 05 ORA $053B,Y 0x03DCB7|$0F:$DCA7:F0 23 BEQ $DCCC 0x03DCB9|$0F:$DCA9:B9 3A 05 LDA $053A,Y 0x03DCBC|$0F:$DCAC:4A LSR 0x03DCBD|$0F:$DCAD:4A LSR 0x03DCBE|$0F:$DCAE:4A LSR 0x03DCBF|$0F:$DCAF:4A LSR 0x03DCC0|$0F:$DCB0:85 0C STA $0C 0x03DCC2|$0F:$DCB2:B9 3B 05 LDA $053B,Y 0x03DCC5|$0F:$DCB5:4A LSR 0x03DCC6|$0F:$DCB6:4A LSR 0x03DCC7|$0F:$DCB7:4A LSR 0x03DCC8|$0F:$DCB8:4A LSR 0x03DCC9|$0F:$DCB9:85 0E STA $0E 0x03DCCB|$0F:$DCBB:E6 0E INC $0E 0x03DCCD|$0F:$DCBD:20 31 DE JSR $DE31 0x03DCD0|$0F:$DCC0:84 0C STY $0C 0x03DCD2|$0F:$DCC2:A0 00 LDY #$00 0x03DCD4|$0F:$DCC4:B1 07 LDA ($07),Y 0x03DCD6|$0F:$DCC6:A4 0C LDY $0C 0x03DCD8|$0F:$DCC8:C9 00 CMP #$00 0x03DCDA|$0F:$DCCA:F0 01 BEQ $DCCD ; control flow target (from $DCA7) 0x03DCDC|$0F:$DCCC:60 RTS ; control flow target (from $DCCA) 0x03DCDD|$0F:$DCCD:B9 3A 05 LDA $053A,Y 0x03DCE0|$0F:$DCD0:85 0E STA $0E 0x03DCE2|$0F:$DCD2:B9 3B 05 LDA $053B,Y 0x03DCE5|$0F:$DCD5:85 10 STA $10 0x03DCE7|$0F:$DCD7:A9 00 LDA #$00 0x03DCE9|$0F:$DCD9:85 0F STA $0F 0x03DCEB|$0F:$DCDB:85 11 STA $11 ; control flow target (from $DB99) 0x03DCED|$0F:$DCDD:20 3F DD JSR $DD3F 0x03DCF0|$0F:$DCE0:98 TYA 0x03DCF1|$0F:$DCE1:48 PHA 0x03DCF2|$0F:$DCE2:A9 00 LDA #$00 0x03DCF4|$0F:$DCE4:A8 TAY 0x03DCF5|$0F:$DCE5:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03DCF7|$0F:$DCE7:F0 02 BEQ $DCEB 0x03DCF9|$0F:$DCE9:A9 FC LDA #$FC ; control flow target (from $DCE7) 0x03DCFB|$0F:$DCEB:85 0C STA $0C ; control flow target (from $DD38) 0x03DCFD|$0F:$DCED:A9 00 LDA #$00 0x03DCFF|$0F:$DCEF:85 0D STA $0D ; control flow target (from $DD2D) 0x03DD01|$0F:$DCF1:A5 0E LDA $0E 0x03DD03|$0F:$DCF3:18 CLC 0x03DD04|$0F:$DCF4:65 0D ADC $0D 0x03DD06|$0F:$DCF6:9D 03 02 STA $0203,X 0x03DD09|$0F:$DCF9:A5 0F LDA $0F 0x03DD0B|$0F:$DCFB:69 00 ADC #$00 0x03DD0D|$0F:$DCFD:D0 23 BNE $DD22 0x03DD0F|$0F:$DCFF:A5 10 LDA $10 0x03DD11|$0F:$DD01:18 CLC 0x03DD12|$0F:$DD02:65 0C ADC $0C 0x03DD14|$0F:$DD04:9D 00 02 STA $0200,X ; sprite buffer start 0x03DD17|$0F:$DD07:B1 12 LDA ($12),Y 0x03DD19|$0F:$DD09:9D 01 02 STA $0201,X 0x03DD1C|$0F:$DD0C:C8 INY 0x03DD1D|$0F:$DD0D:A5 6D LDA $6D 0x03DD1F|$0F:$DD0F:C9 03 CMP #$03 0x03DD21|$0F:$DD11:B0 05 BCS $DD18 0x03DD23|$0F:$DD13:20 75 DD JSR $DD75 0x03DD26|$0F:$DD16:B0 02 BCS $DD1A ; control flow target (from $DD11) 0x03DD28|$0F:$DD18:B1 12 LDA ($12),Y ; control flow target (from $DD16) 0x03DD2A|$0F:$DD1A:88 DEY 0x03DD2B|$0F:$DD1B:9D 02 02 STA $0202,X 0x03DD2E|$0F:$DD1E:E8 INX 0x03DD2F|$0F:$DD1F:E8 INX 0x03DD30|$0F:$DD20:E8 INX 0x03DD31|$0F:$DD21:E8 INX ; control flow target (from $DCFD) 0x03DD32|$0F:$DD22:C8 INY 0x03DD33|$0F:$DD23:C8 INY 0x03DD34|$0F:$DD24:A5 0D LDA $0D 0x03DD36|$0F:$DD26:18 CLC 0x03DD37|$0F:$DD27:69 08 ADC #$08 0x03DD39|$0F:$DD29:85 0D STA $0D 0x03DD3B|$0F:$DD2B:C9 10 CMP #$10 0x03DD3D|$0F:$DD2D:D0 C2 BNE $DCF1 0x03DD3F|$0F:$DD2F:A5 0C LDA $0C 0x03DD41|$0F:$DD31:18 CLC 0x03DD42|$0F:$DD32:69 08 ADC #$08 0x03DD44|$0F:$DD34:85 0C STA $0C 0x03DD46|$0F:$DD36:C9 0C CMP #$0C 0x03DD48|$0F:$DD38:90 B3 BCC $DCED 0x03DD4A|$0F:$DD3A:68 PLA 0x03DD4B|$0F:$DD3B:A8 TAY 0x03DD4C|$0F:$DD3C:60 RTS ; code -> data ; data load target (from $DD65) 0x03DD4D|$0F:$DD3D:F7 ; data load target (from $DD6D) 0x03DD4E|$0F:$DD3E: B8 ; $03:$B8F7 ; data -> code ; control flow target (from $DCDD) 0x03DD4F|$0F:$DD3F:A9 00 LDA #$00 0x03DD51|$0F:$DD41:85 13 STA $13 0x03DD53|$0F:$DD43:B9 40 05 LDA $0540,Y ; NPC #$00 ? + direction nybble 0x03DD56|$0F:$DD46:29 03 AND #$03 0x03DD58|$0F:$DD48:85 12 STA $12 0x03DD5A|$0F:$DD4A:B9 41 05 LDA $0541,Y ; NPC #$00 sprite ID 0x03DD5D|$0F:$DD4D:85 6D STA $6D 0x03DD5F|$0F:$DD4F:0A ASL 0x03DD60|$0F:$DD50:0A ASL 0x03DD61|$0F:$DD51:05 12 ORA $12 0x03DD63|$0F:$DD53:0A ASL 0x03DD64|$0F:$DD54:0A ASL 0x03DD65|$0F:$DD55:0A ASL 0x03DD66|$0F:$DD56:26 13 ROL $13 0x03DD68|$0F:$DD58:0A ASL 0x03DD69|$0F:$DD59:26 13 ROL $13 0x03DD6B|$0F:$DD5B:85 12 STA $12 0x03DD6D|$0F:$DD5D:A5 36 LDA $36 0x03DD6F|$0F:$DD5F:29 08 AND #$08 0x03DD71|$0F:$DD61:05 12 ORA $12 0x03DD73|$0F:$DD63:85 12 STA $12 0x03DD75|$0F:$DD65:AD 3D DD LDA $DD3D 0x03DD78|$0F:$DD68:18 CLC 0x03DD79|$0F:$DD69:65 12 ADC $12 0x03DD7B|$0F:$DD6B:85 12 STA $12 0x03DD7D|$0F:$DD6D:AD 3E DD LDA $DD3E 0x03DD80|$0F:$DD70:65 13 ADC $13 0x03DD82|$0F:$DD72:85 13 STA $13 0x03DD84|$0F:$DD74:60 RTS ; control flow target (from $DD13) 0x03DD85|$0F:$DD75:48 PHA 0x03DD86|$0F:$DD76:AD AD 61 LDA $61AD 0x03DD89|$0F:$DD79:D0 45 BNE $DDC0 0x03DD8B|$0F:$DD7B:68 PLA 0x03DD8C|$0F:$DD7C:D0 0E BNE $DD8C 0x03DD8E|$0F:$DD7E:AD 2D 06 LDA $062D ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03DD91|$0F:$DD81:29 04 AND #$04 0x03DD93|$0F:$DD83:F0 25 BEQ $DDAA 0x03DD95|$0F:$DD85:AD 2D 06 LDA $062D ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03DD98|$0F:$DD88:10 22 BPL $DDAC 0x03DD9A|$0F:$DD8A:18 CLC 0x03DD9B|$0F:$DD8B:60 RTS ; control flow target (from $DD7C) 0x03DD9C|$0F:$DD8C:C9 02 CMP #$02 0x03DD9E|$0F:$DD8E:F0 0E BEQ $DD9E 0x03DDA0|$0F:$DD90:AD 3F 06 LDA $063F ; Cannock status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03DDA3|$0F:$DD93:29 04 AND #$04 0x03DDA5|$0F:$DD95:F0 13 BEQ $DDAA 0x03DDA7|$0F:$DD97:AD 3F 06 LDA $063F ; Cannock status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03DDAA|$0F:$DD9A:10 10 BPL $DDAC 0x03DDAC|$0F:$DD9C:18 CLC 0x03DDAD|$0F:$DD9D:60 RTS ; control flow target (from $DD8E) 0x03DDAE|$0F:$DD9E:AD 51 06 LDA $0651 ; Moonbrooke status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03DDB1|$0F:$DDA1:29 04 AND #$04 0x03DDB3|$0F:$DDA3:F0 05 BEQ $DDAA 0x03DDB5|$0F:$DDA5:AD 51 06 LDA $0651 ; Moonbrooke status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03DDB8|$0F:$DDA8:10 02 BPL $DDAC ; control flow target (from $DD83, $DD95, $DDA3, $DDC5) 0x03DDBA|$0F:$DDAA:18 CLC 0x03DDBB|$0F:$DDAB:60 RTS ; control flow target (from $DD88, $DD9A, $DDA8) 0x03DDBC|$0F:$DDAC:A5 27 LDA $27 ; map palette; offset from ($E27C) 0x03DDBE|$0F:$DDAE:C9 68 CMP #$68 0x03DDC0|$0F:$DDB0:F0 06 BEQ $DDB8 0x03DDC2|$0F:$DDB2:B1 12 LDA ($12),Y 0x03DDC4|$0F:$DDB4:29 FC AND #$FC 0x03DDC6|$0F:$DDB6:38 SEC 0x03DDC7|$0F:$DDB7:60 RTS ; control flow target (from $DDB0) 0x03DDC8|$0F:$DDB8:B1 12 LDA ($12),Y 0x03DDCA|$0F:$DDBA:29 FC AND #$FC 0x03DDCC|$0F:$DDBC:09 03 ORA #$03 0x03DDCE|$0F:$DDBE:38 SEC 0x03DDCF|$0F:$DDBF:60 RTS ; control flow target (from $DD79) 0x03DDD0|$0F:$DDC0:68 PLA 0x03DDD1|$0F:$DDC1:F0 04 BEQ $DDC7 0x03DDD3|$0F:$DDC3:C9 01 CMP #$01 0x03DDD5|$0F:$DDC5:D0 E3 BNE $DDAA ; control flow target (from $DDC1) 0x03DDD7|$0F:$DDC7:A9 03 LDA #$03 0x03DDD9|$0F:$DDC9:38 SEC 0x03DDDA|$0F:$DDCA:60 RTS ; control flow target (from $DB93) 0x03DDDB|$0F:$DDCB:E6 39 INC $39 0x03DDDD|$0F:$DDCD:A5 39 LDA $39 0x03DDDF|$0F:$DDCF:C9 0D CMP #$0D 0x03DDE1|$0F:$DDD1:90 04 BCC $DDD7 0x03DDE3|$0F:$DDD3:A9 00 LDA #$00 0x03DDE5|$0F:$DDD5:85 39 STA $39 ; control flow target (from $DDD1) 0x03DDE7|$0F:$DDD7:18 CLC 0x03DDE8|$0F:$DDD8:65 37 ADC $37 0x03DDEA|$0F:$DDDA:AA TAX 0x03DDEB|$0F:$DDDB:BD E2 DD LDA $DDE2,X 0x03DDEE|$0F:$DDDE:AA TAX 0x03DDEF|$0F:$DDDF:E6 37 INC $37 0x03DDF1|$0F:$DDE1:60 RTS ; code -> data ; indexed data load target (from $DDDB) 0x03DDF2|$0F:$DDE2:90 0x03DDF3|$0F:$DDE3:40 0x03DDF4|$0F:$DDE4:E0 0x03DDF5|$0F:$DDE5:30 0x03DDF6|$0F:$DDE6:80 0x03DDF7|$0F:$DDE7:D0 0x03DDF8|$0F:$DDE8:10 0x03DDF9|$0F:$DDE9:C0 0x03DDFA|$0F:$DDEA:70 0x03DDFB|$0F:$DDEB:20 0x03DDFC|$0F:$DDEC:F0 0x03DDFD|$0F:$DDED:60 0x03DDFE|$0F:$DDEE:A0 0x03DDFF|$0F:$DDEF:90 0x03DE00|$0F:$DDF0:40 0x03DE01|$0F:$DDF1:E0 0x03DE02|$0F:$DDF2:30 0x03DE03|$0F:$DDF3:80 0x03DE04|$0F:$DDF4:D0 0x03DE05|$0F:$DDF5:10 0x03DE06|$0F:$DDF6:C0 0x03DE07|$0F:$DDF7:70 0x03DE08|$0F:$DDF8:20 0x03DE09|$0F:$DDF9:F0 ; indirect data load target 0x03DE0A|$0F:$DDFA:60 ; indirect data load target 0x03DE0B|$0F:$DDFB:A0 ; data -> code ; control flow target (from $D654) 0x03DE0C|$0F:$DDFC:06 0C ASL $0C 0x03DE0E|$0F:$DDFE:06 0E ASL $0E ; control flow target (from $EB07) ; external control flow target (from $02:$B119) 0x03DE10|$0F:$DE00:A5 0E LDA $0E 0x03DE12|$0F:$DE02:85 08 STA $08 0x03DE14|$0F:$DE04:A9 00 LDA #$00 0x03DE16|$0F:$DE06:46 08 LSR $08 0x03DE18|$0F:$DE08:6A ROR 0x03DE19|$0F:$DE09:46 08 LSR $08 0x03DE1B|$0F:$DE0B:6A ROR 0x03DE1C|$0F:$DE0C:46 08 LSR $08 0x03DE1E|$0F:$DE0E:6A ROR 0x03DE1F|$0F:$DE0F:85 07 STA $07 0x03DE21|$0F:$DE11:A5 0C LDA $0C 0x03DE23|$0F:$DE13:29 1F AND #$1F 0x03DE25|$0F:$DE15:18 CLC 0x03DE26|$0F:$DE16:65 07 ADC $07 0x03DE28|$0F:$DE18:85 07 STA $07 0x03DE2A|$0F:$DE1A:08 PHP 0x03DE2B|$0F:$DE1B:A5 0C LDA $0C 0x03DE2D|$0F:$DE1D:29 20 AND #$20 0x03DE2F|$0F:$DE1F:D0 04 BNE $DE25 0x03DE31|$0F:$DE21:A9 20 LDA #$20 0x03DE33|$0F:$DE23:D0 02 BNE $DE27 ; control flow target (from $DE1F) 0x03DE35|$0F:$DE25:A9 24 LDA #$24 ; control flow target (from $DE23) 0x03DE37|$0F:$DE27:28 PLP 0x03DE38|$0F:$DE28:65 08 ADC $08 0x03DE3A|$0F:$DE2A:85 08 STA $08 0x03DE3C|$0F:$DE2C:60 RTS ; control flow target (from $D082, $F441) 0x03DE3D|$0F:$DE2D:46 0C LSR $0C 0x03DE3F|$0F:$DE2F:46 0E LSR $0E ; control flow target (from $DC25, $DCBD, $F7E3) 0x03DE41|$0F:$DE31:A5 0E LDA $0E 0x03DE43|$0F:$DE33:0A ASL 0x03DE44|$0F:$DE34:0A ASL 0x03DE45|$0F:$DE35:0A ASL 0x03DE46|$0F:$DE36:0A ASL 0x03DE47|$0F:$DE37:65 0C ADC $0C 0x03DE49|$0F:$DE39:85 07 STA $07 0x03DE4B|$0F:$DE3B:A9 04 LDA #$04 0x03DE4D|$0F:$DE3D:85 08 STA $08 0x03DE4F|$0F:$DE3F:60 RTS ; control flow target (from $DE68, $DEA0) 0x03DE50|$0F:$DE40:06 0C ASL $0C 0x03DE52|$0F:$DE42:06 0E ASL $0E ; control flow target (from $DE6E, $DEA6) 0x03DE54|$0F:$DE44:A5 0E LDA $0E 0x03DE56|$0F:$DE46:29 FC AND #$FC 0x03DE58|$0F:$DE48:0A ASL 0x03DE59|$0F:$DE49:85 07 STA $07 0x03DE5B|$0F:$DE4B:A5 0C LDA $0C 0x03DE5D|$0F:$DE4D:29 1F AND #$1F 0x03DE5F|$0F:$DE4F:4A LSR 0x03DE60|$0F:$DE50:4A LSR 0x03DE61|$0F:$DE51:18 CLC 0x03DE62|$0F:$DE52:65 07 ADC $07 0x03DE64|$0F:$DE54:18 CLC 0x03DE65|$0F:$DE55:69 C0 ADC #$C0 0x03DE67|$0F:$DE57:85 07 STA $07 0x03DE69|$0F:$DE59:A5 0C LDA $0C 0x03DE6B|$0F:$DE5B:29 20 AND #$20 0x03DE6D|$0F:$DE5D:D0 04 BNE $DE63 0x03DE6F|$0F:$DE5F:A9 03 LDA #$03 0x03DE71|$0F:$DE61:D0 02 BNE $DE65 ; control flow target (from $DE5D) 0x03DE73|$0F:$DE63:A9 07 LDA #$07 ; control flow target (from $DE61) 0x03DE75|$0F:$DE65:85 08 STA $08 0x03DE77|$0F:$DE67:60 RTS 0x03DE78|$0F:$DE68:20 40 DE JSR $DE40 0x03DE7B|$0F:$DE6B:4C 71 DE JMP $DE71 ; control flow target (from $DF2F, $EADF) ; external control flow target (from $04:$8D88) 0x03DE7E|$0F:$DE6E:20 44 DE JSR $DE44 ; control flow target (from $DE6B) 0x03DE81|$0F:$DE71:98 TYA 0x03DE82|$0F:$DE72:48 PHA 0x03DE83|$0F:$DE73:A5 0E LDA $0E 0x03DE85|$0F:$DE75:29 02 AND #$02 0x03DE87|$0F:$DE77:0A ASL 0x03DE88|$0F:$DE78:85 0D STA $0D 0x03DE8A|$0F:$DE7A:A5 0C LDA $0C 0x03DE8C|$0F:$DE7C:29 02 AND #$02 0x03DE8E|$0F:$DE7E:18 CLC 0x03DE8F|$0F:$DE7F:65 0D ADC $0D 0x03DE91|$0F:$DE81:A8 TAY 0x03DE92|$0F:$DE82:A9 FC LDA #$FC 0x03DE94|$0F:$DE84:C0 00 CPY #$00 0x03DE96|$0F:$DE86:F0 07 BEQ $DE8F ; control flow target (from $DE8D) 0x03DE98|$0F:$DE88:38 SEC 0x03DE99|$0F:$DE89:2A ROL 0x03DE9A|$0F:$DE8A:06 09 ASL $09 0x03DE9C|$0F:$DE8C:88 DEY 0x03DE9D|$0F:$DE8D:D0 F9 BNE $DE88 ; control flow target (from $DE86) 0x03DE9F|$0F:$DE8F:31 07 AND ($07),Y 0x03DEA1|$0F:$DE91:05 09 ORA $09 0x03DEA3|$0F:$DE93:91 07 STA ($07),Y 0x03DEA5|$0F:$DE95:85 09 STA $09 0x03DEA7|$0F:$DE97:68 PLA 0x03DEA8|$0F:$DE98:A8 TAY 0x03DEA9|$0F:$DE99:60 RTS ; control flow target (from $E71C, $E81A) 0x03DEAA|$0F:$DE9A:20 62 DF JSR $DF62 0x03DEAD|$0F:$DE9D:4C A6 DE JMP $DEA6 0x03DEB0|$0F:$DEA0:20 40 DE JSR $DE40 0x03DEB3|$0F:$DEA3:4C A9 DE JMP $DEA9 ; control flow target (from $DE9D) 0x03DEB6|$0F:$DEA6:20 44 DE JSR $DE44 ; control flow target (from $DEA3) 0x03DEB9|$0F:$DEA9:98 TYA 0x03DEBA|$0F:$DEAA:48 PHA 0x03DEBB|$0F:$DEAB:A0 00 LDY #$00 0x03DEBD|$0F:$DEAD:B1 07 LDA ($07),Y 0x03DEBF|$0F:$DEAF:85 09 STA $09 0x03DEC1|$0F:$DEB1:68 PLA 0x03DEC2|$0F:$DEB2:A8 TAY 0x03DEC3|$0F:$DEB3:A5 08 LDA $08 0x03DEC5|$0F:$DEB5:18 CLC 0x03DEC6|$0F:$DEB6:69 20 ADC #$20 0x03DEC8|$0F:$DEB8:85 08 STA $08 0x03DECA|$0F:$DEBA:4C FA C1 JMP $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 ; code -> data ; indexed data load target (from $DF54, $DF5A, $E951, $E957) 0x03DECD|$0F:$DEBD:CB 83 ; $02:$83CB 0x03DECF|$0F:$DEBF:6B 84 ; $02:$846B 0x03DED1|$0F:$DEC1:33 85 ; $02:$8533 ; indirect data load target 0x03DED3|$0F:$DEC3:FB 85 ; $02:$85FB ; data -> code ; control flow target (from $CAE1, $D092, $D0DF, $D256, $D325, $E2C5, $E2D7, $E5F5, $E669, $E6F5, $E74C, $E7F3, $E84A) 0x03DED5|$0F:$DEC5:20 FC EA JSR $EAFC 0x03DED8|$0F:$DEC8:90 01 BCC $DECB 0x03DEDA|$0F:$DECA:60 RTS ; control flow target (from $DEC8) 0x03DEDB|$0F:$DECB:20 4A DF JSR $DF4A 0x03DEDE|$0F:$DECE:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03DEE1|$0F:$DED1:A0 00 LDY #$00 0x03DEE3|$0F:$DED3:B1 10 LDA ($10),Y 0x03DEE5|$0F:$DED5:85 09 STA $09 0x03DEE7|$0F:$DED7:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 0x03DEEA|$0F:$DEDA:A5 1C LDA $1C 0x03DEEC|$0F:$DEDC:4A LSR 0x03DEED|$0F:$DEDD:90 03 BCC $DEE2 0x03DEEF|$0F:$DEDF:20 41 DF JSR $DF41 ; control flow target (from $DEDD) 0x03DEF2|$0F:$DEE2:C8 INY 0x03DEF3|$0F:$DEE3:B1 10 LDA ($10),Y 0x03DEF5|$0F:$DEE5:85 09 STA $09 0x03DEF7|$0F:$DEE7:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 0x03DEFA|$0F:$DEEA:A5 1C LDA $1C 0x03DEFC|$0F:$DEEC:29 02 AND #$02 0x03DEFE|$0F:$DEEE:F0 03 BEQ $DEF3 0x03DF00|$0F:$DEF0:20 41 DF JSR $DF41 ; control flow target (from $DEEE) 0x03DF03|$0F:$DEF3:C8 INY 0x03DF04|$0F:$DEF4:A5 07 LDA $07 0x03DF06|$0F:$DEF6:18 CLC 0x03DF07|$0F:$DEF7:69 1E ADC #$1E 0x03DF09|$0F:$DEF9:85 07 STA $07 0x03DF0B|$0F:$DEFB:90 02 BCC $DEFF 0x03DF0D|$0F:$DEFD:E6 08 INC $08 ; control flow target (from $DEFB) 0x03DF0F|$0F:$DEFF:B1 10 LDA ($10),Y 0x03DF11|$0F:$DF01:85 09 STA $09 0x03DF13|$0F:$DF03:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 0x03DF16|$0F:$DF06:A5 1C LDA $1C 0x03DF18|$0F:$DF08:29 04 AND #$04 0x03DF1A|$0F:$DF0A:F0 03 BEQ $DF0F 0x03DF1C|$0F:$DF0C:20 41 DF JSR $DF41 ; control flow target (from $DF0A) 0x03DF1F|$0F:$DF0F:C8 INY 0x03DF20|$0F:$DF10:B1 10 LDA ($10),Y 0x03DF22|$0F:$DF12:85 09 STA $09 0x03DF24|$0F:$DF14:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 0x03DF27|$0F:$DF17:A5 1C LDA $1C 0x03DF29|$0F:$DF19:29 08 AND #$08 0x03DF2B|$0F:$DF1B:F0 03 BEQ $DF20 0x03DF2D|$0F:$DF1D:20 41 DF JSR $DF41 ; control flow target (from $DF1B) 0x03DF30|$0F:$DF20:C8 INY 0x03DF31|$0F:$DF21:B1 10 LDA ($10),Y 0x03DF33|$0F:$DF23:29 03 AND #$03 0x03DF35|$0F:$DF25:85 09 STA $09 0x03DF37|$0F:$DF27:A5 1A LDA $1A 0x03DF39|$0F:$DF29:85 0C STA $0C 0x03DF3B|$0F:$DF2B:A5 1B LDA $1B 0x03DF3D|$0F:$DF2D:85 0E STA $0E 0x03DF3F|$0F:$DF2F:20 6E DE JSR $DE6E 0x03DF42|$0F:$DF32:A5 1E LDA $1E 0x03DF44|$0F:$DF34:D0 0A BNE $DF40 0x03DF46|$0F:$DF36:A5 08 LDA $08 0x03DF48|$0F:$DF38:18 CLC 0x03DF49|$0F:$DF39:69 20 ADC #$20 0x03DF4B|$0F:$DF3B:85 08 STA $08 0x03DF4D|$0F:$DF3D:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 ; control flow target (from $DF34) 0x03DF50|$0F:$DF40:60 RTS ; control flow target (from $DEDF, $DEF0, $DF0C, $DF1D) 0x03DF51|$0F:$DF41:C6 02 DEC $02 0x03DF53|$0F:$DF43:C6 02 DEC $02 0x03DF55|$0F:$DF45:C6 02 DEC $02 0x03DF57|$0F:$DF47:C6 01 DEC $01 0x03DF59|$0F:$DF49:60 RTS ; control flow target (from $D366, $DAA9, $DECB, $E3E5) 0x03DF5A|$0F:$DF4A:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03DF5C|$0F:$DF4C:0A ASL 0x03DF5D|$0F:$DF4D:A8 TAY 0x03DF5E|$0F:$DF4E:A5 0C LDA $0C 0x03DF60|$0F:$DF50:0A ASL 0x03DF61|$0F:$DF51:0A ASL 0x03DF62|$0F:$DF52:65 0C ADC $0C 0x03DF64|$0F:$DF54:79 BD DE ADC $DEBD,Y 0x03DF67|$0F:$DF57:85 10 STA $10 0x03DF69|$0F:$DF59:C8 INY 0x03DF6A|$0F:$DF5A:B9 BD DE LDA $DEBD,Y 0x03DF6D|$0F:$DF5D:69 00 ADC #$00 0x03DF6F|$0F:$DF5F:85 11 STA $11 0x03DF71|$0F:$DF61:60 RTS ; control flow target (from $DE9A, $EAFC) ; external control flow target (from $02:$B116) 0x03DF72|$0F:$DF62:A5 15 LDA $15 0x03DF74|$0F:$DF64:0A ASL 0x03DF75|$0F:$DF65:18 CLC 0x03DF76|$0F:$DF66:65 19 ADC $19 0x03DF78|$0F:$DF68:18 CLC 0x03DF79|$0F:$DF69:69 1E ADC #$1E 0x03DF7B|$0F:$DF6B:85 0C STA $0C 0x03DF7D|$0F:$DF6D:A9 1E LDA #$1E 0x03DF7F|$0F:$DF6F:85 0E STA $0E 0x03DF81|$0F:$DF71:20 93 C3 JSR $C393 0x03DF84|$0F:$DF74:85 0E STA $0E 0x03DF86|$0F:$DF76:A5 14 LDA $14 0x03DF88|$0F:$DF78:0A ASL 0x03DF89|$0F:$DF79:18 CLC 0x03DF8A|$0F:$DF7A:65 18 ADC $18 0x03DF8C|$0F:$DF7C:29 3F AND #$3F 0x03DF8E|$0F:$DF7E:85 0C STA $0C 0x03DF90|$0F:$DF80:60 RTS ; code -> data ; data load target (from $E0CB) 0x03DF91|$0F:$DF81:95 ; data load target (from $E0D2) 0x03DF92|$0F:$DF82: 9D ; $03:$9D95 ; data -> code ; external control flow target (from $02:$B266) 0x03DF93|$0F:$DF83:20 89 DF JSR $DF89 0x03DF96|$0F:$DF86:4C 70 F7 JMP $F770 ; load ROM bank #$02 ; control flow target (from $CFA8, $D0A3, $D363, $D680, $DA9E, $DF83, $E3E2, $EB20, $F95D) 0x03DF99|$0F:$DF89:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03DF9B|$0F:$DF8B:C9 02 CMP #$02 0x03DF9D|$0F:$DF8D:90 18 BCC $DFA7 0x03DF9F|$0F:$DF8F:A5 0E LDA $0E 0x03DFA1|$0F:$DF91:48 PHA 0x03DFA2|$0F:$DF92:A5 0C LDA $0C 0x03DFA4|$0F:$DF94:48 PHA 0x03DFA5|$0F:$DF95:46 0C LSR $0C 0x03DFA7|$0F:$DF97:46 0E LSR $0E 0x03DFA9|$0F:$DF99:20 A7 DF JSR $DFA7 0x03DFAC|$0F:$DF9C:68 PLA 0x03DFAD|$0F:$DF9D:4A LSR 0x03DFAE|$0F:$DF9E:68 PLA 0x03DFAF|$0F:$DF9F:2A ROL 0x03DFB0|$0F:$DFA0:29 03 AND #$03 0x03DFB2|$0F:$DFA2:05 0C ORA $0C 0x03DFB4|$0F:$DFA4:85 0C STA $0C 0x03DFB6|$0F:$DFA6:60 RTS ; control flow target (from $DF8D, $DF99) 0x03DFB7|$0F:$DFA7:A5 0C LDA $0C 0x03DFB9|$0F:$DFA9:85 12 STA $12 0x03DFBB|$0F:$DFAB:A5 0E LDA $0E 0x03DFBD|$0F:$DFAD:85 13 STA $13 0x03DFBF|$0F:$DFAF:A5 21 LDA $21 ; map width 0x03DFC1|$0F:$DFB1:C5 0C CMP $0C 0x03DFC3|$0F:$DFB3:B0 05 BCS $DFBA ; control flow target (from $DFBE) 0x03DFC5|$0F:$DFB5:A5 20 LDA $20 ; map exterior border tile ID (#$00 = Road, #$01 = Grass, #$02 = Sand, #$03 = Tree, #$04 = Water, #$05 = Vertical Wall, #$06 = Shrub, #$07 = Horizontal Wall, #$08 = Swamp, ..., #$20 = Ceiling Alternating?, #$21 = Ceiling Down?, #$24 = Black?, #$28 = Blue?) 0x03DFC7|$0F:$DFB7:85 0C STA $0C 0x03DFC9|$0F:$DFB9:60 RTS ; control flow target (from $DFB3) 0x03DFCA|$0F:$DFBA:A5 22 LDA $22 ; map height 0x03DFCC|$0F:$DFBC:C5 0E CMP $0E 0x03DFCE|$0F:$DFBE:90 F5 BCC $DFB5 0x03DFD0|$0F:$DFC0:98 TYA 0x03DFD1|$0F:$DFC1:48 PHA 0x03DFD2|$0F:$DFC2:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03DFD4|$0F:$DFC4:F0 03 BEQ $DFC9 0x03DFD6|$0F:$DFC6:4C 69 E1 JMP $E169 ; control flow target (from $DFC4) 0x03DFD9|$0F:$DFC9:20 75 F7 JSR $F775 ; load ROM bank #$03 0x03DFDC|$0F:$DFCC:A5 D0 LDA $D0 ; Malroth status flag (#$FF = defeated, #$00 = alive, others = countdown to battle) 0x03DFDE|$0F:$DFCE:F0 19 BEQ $DFE9 0x03DFE0|$0F:$DFD0:A5 12 LDA $12 0x03DFE2|$0F:$DFD2:C9 5E CMP #$5E 0x03DFE4|$0F:$DFD4:90 13 BCC $DFE9 0x03DFE6|$0F:$DFD6:C9 60 CMP #$60 0x03DFE8|$0F:$DFD8:B0 0F BCS $DFE9 0x03DFEA|$0F:$DFDA:A5 13 LDA $13 0x03DFEC|$0F:$DFDC:C9 A4 CMP #$A4 0x03DFEE|$0F:$DFDE:90 09 BCC $DFE9 0x03DFF0|$0F:$DFE0:C9 A6 CMP #$A6 0x03DFF2|$0F:$DFE2:B0 05 BCS $DFE9 0x03DFF4|$0F:$DFE4:A9 02 LDA #$02 0x03DFF6|$0F:$DFE6:4C 87 E0 JMP $E087 ; control flow target (from $DFCE, $DFD4, $DFD8, $DFDE, $DFE2) 0x03DFF9|$0F:$DFE9:A5 CE LDA $CE ; Tuhn Watergate open flag (#$00 = closed, #$01 = open) 0x03DFFB|$0F:$DFEB:F0 13 BEQ $E000 0x03DFFD|$0F:$DFED:A5 12 LDA $12 0x03DFFF|$0F:$DFEF:C9 44 CMP #$44 0x03E001|$0F:$DFF1:D0 0D BNE $E000 0x03E003|$0F:$DFF3:A5 13 LDA $13 0x03E005|$0F:$DFF5:C9 86 CMP #$86 0x03E007|$0F:$DFF7:90 07 BCC $E000 0x03E009|$0F:$DFF9:C9 89 CMP #$89 0x03E00B|$0F:$DFFB:B0 03 BCS $E000 0x03E00D|$0F:$DFFD:4C 85 E0 JMP $E085 ; control flow target (from $DFEB, $DFF1, $DFF7, $DFFB) 0x03E010|$0F:$E000:AD F9 05 LDA $05F9 ; flag for Cave to Rhone open 0x03E013|$0F:$E003:D0 10 BNE $E015 0x03E015|$0F:$E005:A5 12 LDA $12 0x03E017|$0F:$E007:C9 73 CMP #$73 0x03E019|$0F:$E009:D0 0A BNE $E015 0x03E01B|$0F:$E00B:A5 13 LDA $13 0x03E01D|$0F:$E00D:C9 C5 CMP #$C5 0x03E01F|$0F:$E00F:D0 04 BNE $E015 0x03E021|$0F:$E011:A9 05 LDA #$05 0x03E023|$0F:$E013:D0 72 BNE $E087 ; control flow target (from $E003, $E009, $E00F) 0x03E025|$0F:$E015:20 C0 E0 JSR $E0C0 0x03E028|$0F:$E018:C9 04 CMP #$04 0x03E02A|$0F:$E01A:F0 03 BEQ $E01F 0x03E02C|$0F:$E01C:68 PLA 0x03E02D|$0F:$E01D:A8 TAY 0x03E02E|$0F:$E01E:60 RTS ; control flow target (from $E01A) 0x03E02F|$0F:$E01F:A0 00 LDY #$00 0x03E031|$0F:$E021:84 D4 STY $D4 0x03E033|$0F:$E023:8C F4 05 STY $05F4 ; control flow target (from $E057) 0x03E036|$0F:$E026:B9 B4 E0 LDA $E0B4,Y 0x03E039|$0F:$E029:18 CLC 0x03E03A|$0F:$E02A:65 12 ADC $12 0x03E03C|$0F:$E02C:85 0C STA $0C 0x03E03E|$0F:$E02E:B9 B8 E0 LDA $E0B8,Y 0x03E041|$0F:$E031:18 CLC 0x03E042|$0F:$E032:65 13 ADC $13 0x03E044|$0F:$E034:85 0E STA $0E 0x03E046|$0F:$E036:20 C0 E0 JSR $E0C0 0x03E049|$0F:$E039:C9 04 CMP #$04 0x03E04B|$0F:$E03B:F0 12 BEQ $E04F 0x03E04D|$0F:$E03D:C9 09 CMP #$09 0x03E04F|$0F:$E03F:F0 0E BEQ $E04F 0x03E051|$0F:$E041:C9 0D CMP #$0D 0x03E053|$0F:$E043:F0 0A BEQ $E04F 0x03E055|$0F:$E045:AC F4 05 LDY $05F4 0x03E058|$0F:$E048:B9 BC E0 LDA $E0BC,Y 0x03E05B|$0F:$E04B:05 D4 ORA $D4 0x03E05D|$0F:$E04D:85 D4 STA $D4 ; control flow target (from $E03B, $E03F, $E043) 0x03E05F|$0F:$E04F:EE F4 05 INC $05F4 0x03E062|$0F:$E052:AC F4 05 LDY $05F4 0x03E065|$0F:$E055:C0 04 CPY #$04 0x03E067|$0F:$E057:D0 CD BNE $E026 0x03E069|$0F:$E059:A4 D4 LDY $D4 0x03E06B|$0F:$E05B:B9 8C E0 LDA $E08C,Y 0x03E06E|$0F:$E05E:85 D4 STA $D4 0x03E070|$0F:$E060:30 23 BMI $E085 0x03E072|$0F:$E062:C9 15 CMP #$15 0x03E074|$0F:$E064:B0 21 BCS $E087 0x03E076|$0F:$E066:A8 TAY 0x03E077|$0F:$E067:B9 9C E0 LDA $E09C,Y 0x03E07A|$0F:$E06A:18 CLC 0x03E07B|$0F:$E06B:65 12 ADC $12 0x03E07D|$0F:$E06D:85 0C STA $0C 0x03E07F|$0F:$E06F:B9 A4 E0 LDA $E0A4,Y 0x03E082|$0F:$E072:18 CLC 0x03E083|$0F:$E073:65 13 ADC $13 0x03E085|$0F:$E075:85 0E STA $0E 0x03E087|$0F:$E077:20 C0 E0 JSR $E0C0 0x03E08A|$0F:$E07A:C9 04 CMP #$04 0x03E08C|$0F:$E07C:D0 07 BNE $E085 0x03E08E|$0F:$E07E:A4 D4 LDY $D4 0x03E090|$0F:$E080:B9 AC E0 LDA $E0AC,Y 0x03E093|$0F:$E083:D0 02 BNE $E087 ; control flow target (from $DFFD, $E060, $E07C, $E191) 0x03E095|$0F:$E085:A9 04 LDA #$04 ; control flow target (from $DFE6, $E013, $E064, $E083, $E174) 0x03E097|$0F:$E087:85 0C STA $0C 0x03E099|$0F:$E089:68 PLA 0x03E09A|$0F:$E08A:A8 TAY 0x03E09B|$0F:$E08B:60 RTS ; code -> data ; indexed data load target (from $E05B) 0x03E09C|$0F:$E08C:FF 0x03E09D|$0F:$E08D:04 0x03E09E|$0F:$E08E:05 0x03E09F|$0F:$E08F:00 0x03E0A0|$0F:$E090:06 0x03E0A1|$0F:$E091:FF 0x03E0A2|$0F:$E092:01 0x03E0A3|$0F:$E093:FF 0x03E0A4|$0F:$E094:07 0x03E0A5|$0F:$E095:02 0x03E0A6|$0F:$E096:FF ; indirect data load target 0x03E0A7|$0F:$E097:FF 0x03E0A8|$0F:$E098:03 0x03E0A9|$0F:$E099:FF 0x03E0AA|$0F:$E09A:FF ; indirect data load target 0x03E0AB|$0F:$E09B:FF ; indexed data load target (from $E067) 0x03E0AC|$0F:$E09C:FF 0x03E0AD|$0F:$E09D:FF 0x03E0AE|$0F:$E09E:01 0x03E0AF|$0F:$E09F:01 0x03E0B0|$0F:$E0A0:01 0x03E0B1|$0F:$E0A1:FF 0x03E0B2|$0F:$E0A2:FF 0x03E0B3|$0F:$E0A3:01 ; indexed data load target (from $E06F) 0x03E0B4|$0F:$E0A4:01 0x03E0B5|$0F:$E0A5:FF 0x03E0B6|$0F:$E0A6:01 0x03E0B7|$0F:$E0A7:FF 0x03E0B8|$0F:$E0A8:01 0x03E0B9|$0F:$E0A9:01 0x03E0BA|$0F:$E0AA:FF 0x03E0BB|$0F:$E0AB:FF ; indexed data load target (from $E080) 0x03E0BC|$0F:$E0AC:16 0x03E0BD|$0F:$E0AD:1B 0x03E0BE|$0F:$E0AE:14 0x03E0BF|$0F:$E0AF:19 0x03E0C0|$0F:$E0B0:15 0x03E0C1|$0F:$E0B1:18 0x03E0C2|$0F:$E0B2:1A 0x03E0C3|$0F:$E0B3:17 ; indexed data load target (from $E026) 0x03E0C4|$0F:$E0B4:00 0x03E0C5|$0F:$E0B5:01 0x03E0C6|$0F:$E0B6:00 0x03E0C7|$0F:$E0B7:FF ; indexed data load target (from $E02E) 0x03E0C8|$0F:$E0B8:FF 0x03E0C9|$0F:$E0B9:00 0x03E0CA|$0F:$E0BA:01 0x03E0CB|$0F:$E0BB:00 ; indexed data load target (from $E048) 0x03E0CC|$0F:$E0BC:01 0x03E0CD|$0F:$E0BD:02 0x03E0CE|$0F:$E0BE:04 0x03E0CF|$0F:$E0BF:08 ; data -> code ; control flow target (from $E015, $E036, $E077) ; indirect data load target ; WARNING! $E0C0 was also seen as data 0x03E0D0|$0F:$E0C0:A9 ; WARNING! $E0C1 was also seen as data 0x03E0D1|$0F:$E0C1: 00 LDA #$00 0x03E0D2|$0F:$E0C2:85 0F STA $0F 0x03E0D4|$0F:$E0C4:06 0E ASL $0E 0x03E0D6|$0F:$E0C6:26 0F ROL $0F 0x03E0D8|$0F:$E0C8:A5 0E LDA $0E 0x03E0DA|$0F:$E0CA:18 CLC 0x03E0DB|$0F:$E0CB:6D 81 DF ADC $DF81 0x03E0DE|$0F:$E0CE:85 0E STA $0E 0x03E0E0|$0F:$E0D0:A5 0F LDA $0F 0x03E0E2|$0F:$E0D2:6D 82 DF ADC $DF82 0x03E0E5|$0F:$E0D5:85 0F STA $0F 0x03E0E7|$0F:$E0D7:A0 00 LDY #$00 0x03E0E9|$0F:$E0D9:B1 0E LDA ($0E),Y 0x03E0EB|$0F:$E0DB:85 10 STA $10 0x03E0ED|$0F:$E0DD:C8 INY 0x03E0EE|$0F:$E0DE:B1 0E LDA ($0E),Y 0x03E0F0|$0F:$E0E0:85 11 STA $11 0x03E0F2|$0F:$E0E2:A5 0C LDA $0C 0x03E0F4|$0F:$E0E4:C9 80 CMP #$80 0x03E0F6|$0F:$E0E6:90 2A BCC $E112 0x03E0F8|$0F:$E0E8:49 FF EOR #$FF 0x03E0FA|$0F:$E0EA:85 0C STA $0C 0x03E0FC|$0F:$E0EC:C8 INY 0x03E0FD|$0F:$E0ED:B1 0E LDA ($0E),Y 0x03E0FF|$0F:$E0EF:18 CLC 0x03E100|$0F:$E0F0:E5 10 SBC $10 0x03E102|$0F:$E0F2:A8 TAY 0x03E103|$0F:$E0F3:A9 00 LDA #$00 0x03E105|$0F:$E0F5:85 0D STA $0D ; control flow target (from $E10F) 0x03E107|$0F:$E0F7:B1 10 LDA ($10),Y 0x03E109|$0F:$E0F9:E6 0D INC $0D 0x03E10B|$0F:$E0FB:29 E0 AND #$E0 0x03E10D|$0F:$E0FD:F0 09 BEQ $E108 0x03E10F|$0F:$E0FF:B1 10 LDA ($10),Y 0x03E111|$0F:$E101:29 1F AND #$1F 0x03E113|$0F:$E103:18 CLC 0x03E114|$0F:$E104:65 0D ADC $0D 0x03E116|$0F:$E106:85 0D STA $0D ; control flow target (from $E0FD) 0x03E118|$0F:$E108:A5 0C LDA $0C 0x03E11A|$0F:$E10A:C5 0D CMP $0D 0x03E11C|$0F:$E10C:90 22 BCC $E130 0x03E11E|$0F:$E10E:88 DEY 0x03E11F|$0F:$E10F:4C F7 E0 JMP $E0F7 ; control flow target (from $E0E6) 0x03E122|$0F:$E112:88 DEY 0x03E123|$0F:$E113:84 0D STY $0D ; control flow target (from $E12D) 0x03E125|$0F:$E115:B1 10 LDA ($10),Y 0x03E127|$0F:$E117:E6 0D INC $0D 0x03E129|$0F:$E119:29 E0 AND #$E0 0x03E12B|$0F:$E11B:F0 09 BEQ $E126 0x03E12D|$0F:$E11D:B1 10 LDA ($10),Y 0x03E12F|$0F:$E11F:29 1F AND #$1F 0x03E131|$0F:$E121:18 CLC 0x03E132|$0F:$E122:65 0D ADC $0D 0x03E134|$0F:$E124:85 0D STA $0D ; control flow target (from $E11B) 0x03E136|$0F:$E126:A5 0C LDA $0C 0x03E138|$0F:$E128:C5 0D CMP $0D 0x03E13A|$0F:$E12A:90 04 BCC $E130 0x03E13C|$0F:$E12C:C8 INY 0x03E13D|$0F:$E12D:4C 15 E1 JMP $E115 ; control flow target (from $E10C, $E12A) 0x03E140|$0F:$E130:B1 10 LDA ($10),Y 0x03E142|$0F:$E132:29 E0 AND #$E0 0x03E144|$0F:$E134:D0 2C BNE $E162 0x03E146|$0F:$E136:B1 10 LDA ($10),Y 0x03E148|$0F:$E138:29 1F AND #$1F ; control flow target (from $E167) 0x03E14A|$0F:$E13A:85 0C STA $0C 0x03E14C|$0F:$E13C:AD F8 05 LDA $05F8 ; Sea Cave shoal status (#$00 = shoals up, others = shoals down) 0x03E14F|$0F:$E13F:F0 1E BEQ $E15F 0x03E151|$0F:$E141:A5 12 LDA $12 0x03E153|$0F:$E143:C9 B2 CMP #$B2 0x03E155|$0F:$E145:90 18 BCC $E15F 0x03E157|$0F:$E147:C9 B9 CMP #$B9 0x03E159|$0F:$E149:B0 14 BCS $E15F 0x03E15B|$0F:$E14B:A5 13 LDA $13 0x03E15D|$0F:$E14D:C9 A3 CMP #$A3 0x03E15F|$0F:$E14F:90 0E BCC $E15F 0x03E161|$0F:$E151:C9 AC CMP #$AC 0x03E163|$0F:$E153:B0 0A BCS $E15F 0x03E165|$0F:$E155:A5 0C LDA $0C 0x03E167|$0F:$E157:C9 13 CMP #$13 0x03E169|$0F:$E159:90 04 BCC $E15F 0x03E16B|$0F:$E15B:A9 04 LDA #$04 0x03E16D|$0F:$E15D:85 0C STA $0C ; control flow target (from $E13F, $E145, $E149, $E14F, $E153, $E159) 0x03E16F|$0F:$E15F:A5 0C LDA $0C 0x03E171|$0F:$E161:60 RTS ; control flow target (from $E134) 0x03E172|$0F:$E162:4A LSR 0x03E173|$0F:$E163:4A LSR 0x03E174|$0F:$E164:4A LSR 0x03E175|$0F:$E165:4A LSR 0x03E176|$0F:$E166:4A LSR 0x03E177|$0F:$E167:90 D1 BCC $E13A ; control flow target (from $DFC6) 0x03E179|$0F:$E169:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03E17C|$0F:$E16C:A5 D0 LDA $D0 ; Malroth status flag (#$FF = defeated, #$00 = alive, others = countdown to battle) 0x03E17E|$0F:$E16E:30 07 BMI $E177 0x03E180|$0F:$E170:F0 05 BEQ $E177 0x03E182|$0F:$E172:A9 17 LDA #$17 0x03E184|$0F:$E174:4C 87 E0 JMP $E087 ; control flow target (from $E16E, $E170) 0x03E187|$0F:$E177:A5 31 LDA $31 ; current map ID 0x03E189|$0F:$E179:C9 12 CMP #$12 ; Map ID #$12: Tuhn Watergate 0x03E18B|$0F:$E17B:D0 17 BNE $E194 0x03E18D|$0F:$E17D:A5 CE LDA $CE ; Tuhn Watergate open flag (#$00 = closed, #$01 = open) 0x03E18F|$0F:$E17F:F0 13 BEQ $E194 0x03E191|$0F:$E181:A5 13 LDA $13 0x03E193|$0F:$E183:C9 05 CMP #$05 0x03E195|$0F:$E185:D0 0D BNE $E194 0x03E197|$0F:$E187:A5 12 LDA $12 0x03E199|$0F:$E189:C9 02 CMP #$02 0x03E19B|$0F:$E18B:F0 04 BEQ $E191 0x03E19D|$0F:$E18D:C9 03 CMP #$03 0x03E19F|$0F:$E18F:D0 03 BNE $E194 ; control flow target (from $E18B) 0x03E1A1|$0F:$E191:4C 85 E0 JMP $E085 ; control flow target (from $E17B, $E17F, $E185, $E18F) 0x03E1A4|$0F:$E194:A9 00 LDA #$00 0x03E1A6|$0F:$E196:85 0D STA $0D 0x03E1A8|$0F:$E198:85 0F STA $0F 0x03E1AA|$0F:$E19A:A4 21 LDY $21 ; map width 0x03E1AC|$0F:$E19C:C8 INY 0x03E1AD|$0F:$E19D:84 0C STY $0C 0x03E1AF|$0F:$E19F:20 39 C3 JSR $C339 ; 16-bit multiplication: ($10-$11) = ($0C-$0D) * ($0E-$0F); consumes $0C-$0F 0x03E1B2|$0F:$E1A2:A5 12 LDA $12 0x03E1B4|$0F:$E1A4:18 CLC 0x03E1B5|$0F:$E1A5:65 10 ADC $10 0x03E1B7|$0F:$E1A7:85 10 STA $10 0x03E1B9|$0F:$E1A9:85 0E STA $0E 0x03E1BB|$0F:$E1AB:A5 11 LDA $11 0x03E1BD|$0F:$E1AD:69 00 ADC #$00 0x03E1BF|$0F:$E1AF:85 0F STA $0F 0x03E1C1|$0F:$E1B1:18 CLC 0x03E1C2|$0F:$E1B2:69 78 ADC #$78 0x03E1C4|$0F:$E1B4:85 11 STA $11 0x03E1C6|$0F:$E1B6:A0 00 LDY #$00 0x03E1C8|$0F:$E1B8:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E1CA|$0F:$E1BA:C9 02 CMP #$02 0x03E1CC|$0F:$E1BC:B0 07 BCS $E1C5 0x03E1CE|$0F:$E1BE:B1 10 LDA ($10),Y 0x03E1D0|$0F:$E1C0:29 1F AND #$1F 0x03E1D2|$0F:$E1C2:4C CB E1 JMP $E1CB ; control flow target (from $E1BC) 0x03E1D5|$0F:$E1C5:B1 10 LDA ($10),Y 0x03E1D7|$0F:$E1C7:29 1F AND #$1F 0x03E1D9|$0F:$E1C9:0A ASL 0x03E1DA|$0F:$E1CA:0A ASL ; control flow target (from $E1C2) 0x03E1DB|$0F:$E1CB:85 0C STA $0C 0x03E1DD|$0F:$E1CD:C9 14 CMP #$14 0x03E1DF|$0F:$E1CF:D0 1E BNE $E1EF 0x03E1E1|$0F:$E1D1:A0 00 LDY #$00 ; control flow target (from $E1ED) 0x03E1E3|$0F:$E1D3:A5 12 LDA $12 0x03E1E5|$0F:$E1D5:D9 1A 05 CMP $051A,Y ; something to do with whether you've opened the chest containing the Shield of Erdrick 0x03E1E8|$0F:$E1D8:D0 0F BNE $E1E9 0x03E1EA|$0F:$E1DA:C8 INY 0x03E1EB|$0F:$E1DB:A5 13 LDA $13 0x03E1ED|$0F:$E1DD:D9 1A 05 CMP $051A,Y ; something to do with whether you've opened the chest containing the Shield of Erdrick 0x03E1F0|$0F:$E1E0:D0 08 BNE $E1EA ; control flow target (from $E20E) 0x03E1F2|$0F:$E1E2:A9 00 LDA #$00 0x03E1F4|$0F:$E1E4:85 0C STA $0C ; control flow target (from $E1FB, $E216) 0x03E1F6|$0F:$E1E6:68 PLA 0x03E1F7|$0F:$E1E7:A8 TAY 0x03E1F8|$0F:$E1E8:60 RTS ; control flow target (from $E1D8) 0x03E1F9|$0F:$E1E9:C8 INY ; control flow target (from $E1E0) 0x03E1FA|$0F:$E1EA:C8 INY 0x03E1FB|$0F:$E1EB:C0 10 CPY #$10 0x03E1FD|$0F:$E1ED:D0 E4 BNE $E1D3 ; control flow target (from $E1CF) 0x03E1FF|$0F:$E1EF:A5 0C LDA $0C 0x03E201|$0F:$E1F1:C9 18 CMP #$18 0x03E203|$0F:$E1F3:F0 08 BEQ $E1FD 0x03E205|$0F:$E1F5:C9 19 CMP #$19 0x03E207|$0F:$E1F7:F0 04 BEQ $E1FD 0x03E209|$0F:$E1F9:C9 1A CMP #$1A 0x03E20B|$0F:$E1FB:D0 E9 BNE $E1E6 ; control flow target (from $E1F3, $E1F7) 0x03E20D|$0F:$E1FD:A0 00 LDY #$00 ; control flow target (from $E214) 0x03E20F|$0F:$E1FF:A5 12 LDA $12 0x03E211|$0F:$E201:D9 2A 05 CMP $052A,Y 0x03E214|$0F:$E204:D0 0A BNE $E210 0x03E216|$0F:$E206:C8 INY 0x03E217|$0F:$E207:A5 13 LDA $13 0x03E219|$0F:$E209:D9 2A 05 CMP $052A,Y 0x03E21C|$0F:$E20C:D0 03 BNE $E211 0x03E21E|$0F:$E20E:F0 D2 BEQ $E1E2 ; control flow target (from $E204) 0x03E220|$0F:$E210:C8 INY ; control flow target (from $E20C) 0x03E221|$0F:$E211:C8 INY 0x03E222|$0F:$E212:C0 10 CPY #$10 0x03E224|$0F:$E214:D0 E9 BNE $E1FF 0x03E226|$0F:$E216:F0 CE BEQ $E1E6 ; control flow target (from $D9BD, $DB74, $E882, $E92D) 0x03E228|$0F:$E218:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E22A|$0F:$E21A:C9 02 CMP #$02 0x03E22C|$0F:$E21C:90 04 BCC $E222 0x03E22E|$0F:$E21E:46 12 LSR $12 0x03E230|$0F:$E220:46 13 LSR $13 ; control flow target (from $DAA1, $E21C, $E3F3, $EB23, $F960) 0x03E232|$0F:$E222:A5 25 LDA $25 ; map header byte 5 0x03E234|$0F:$E224:05 26 ORA $26 ; map header byte 6, always #$00 0x03E236|$0F:$E226:D0 05 BNE $E22D ; control flow target (from $E231, $E237) 0x03E238|$0F:$E228:A9 00 LDA #$00 0x03E23A|$0F:$E22A:85 0D STA $0D 0x03E23C|$0F:$E22C:60 RTS ; control flow target (from $E226) 0x03E23D|$0F:$E22D:A5 21 LDA $21 ; map width 0x03E23F|$0F:$E22F:C5 12 CMP $12 0x03E241|$0F:$E231:90 F5 BCC $E228 0x03E243|$0F:$E233:A5 22 LDA $22 ; map height 0x03E245|$0F:$E235:C5 13 CMP $13 0x03E247|$0F:$E237:90 EF BCC $E228 0x03E249|$0F:$E239:98 TYA 0x03E24A|$0F:$E23A:48 PHA 0x03E24B|$0F:$E23B:8A TXA 0x03E24C|$0F:$E23C:48 PHA 0x03E24D|$0F:$E23D:A6 21 LDX $21 ; map width 0x03E24F|$0F:$E23F:E8 INX 0x03E250|$0F:$E240:86 74 STX $74 0x03E252|$0F:$E242:A9 00 LDA #$00 0x03E254|$0F:$E244:85 72 STA $72 0x03E256|$0F:$E246:A2 78 LDX #$78 0x03E258|$0F:$E248:A4 13 LDY $13 0x03E25A|$0F:$E24A:F0 0D BEQ $E259 ; control flow target (from $E257) 0x03E25C|$0F:$E24C:A5 72 LDA $72 0x03E25E|$0F:$E24E:18 CLC 0x03E25F|$0F:$E24F:65 74 ADC $74 0x03E261|$0F:$E251:85 72 STA $72 0x03E263|$0F:$E253:90 01 BCC $E256 0x03E265|$0F:$E255:E8 INX ; control flow target (from $E253) 0x03E266|$0F:$E256:88 DEY 0x03E267|$0F:$E257:D0 F3 BNE $E24C ; control flow target (from $E24A) 0x03E269|$0F:$E259:86 73 STX $73 0x03E26B|$0F:$E25B:A4 12 LDY $12 0x03E26D|$0F:$E25D:B1 72 LDA ($72),Y 0x03E26F|$0F:$E25F:4A LSR 0x03E270|$0F:$E260:4A LSR 0x03E271|$0F:$E261:4A LSR 0x03E272|$0F:$E262:4A LSR 0x03E273|$0F:$E263:4A LSR 0x03E274|$0F:$E264:85 0D STA $0D 0x03E276|$0F:$E266:68 PLA 0x03E277|$0F:$E267:AA TAX 0x03E278|$0F:$E268:68 PLA 0x03E279|$0F:$E269:A8 TAY 0x03E27A|$0F:$E26A:60 RTS ; code -> data ; indirect data load target (via $E278) 0x03E27B|$0F:$E26B:0F ; indirect data load target 0x03E27C|$0F:$E26C:36 ; indirect data load target 0x03E27D|$0F:$E26D:30 ; indirect data load target 0x03E27E|$0F:$E26E:11 ; indirect data load target 0x03E27F|$0F:$E26F:36 ; indirect data load target 0x03E280|$0F:$E270:19 ; indirect data load target 0x03E281|$0F:$E271:16 ; indirect data load target 0x03E282|$0F:$E272:36 ; indirect data load target 0x03E283|$0F:$E273:30 ; indirect data load target 0x03E284|$0F:$E274:13 ; indirect data load target 0x03E285|$0F:$E275:01 ; indirect data load target 0x03E286|$0F:$E276:01 ; indirect data load target 0x03E287|$0F:$E277:01 ; data load target (from $E30D) 0x03E288|$0F:$E278:6B ; data load target (from $E312) 0x03E289|$0F:$E279: E2 ; $0F:$E26B ; data load target (from $E302) 0x03E28A|$0F:$E27A:84 ; data load target (from $E307) 0x03E28B|$0F:$E27B: BC ; $03:$BC84 ; data load target (from $E319) 0x03E28C|$0F:$E27C:91 ; data load target (from $E321) 0x03E28D|$0F:$E27D: BC ; $03:$BC91 ; data -> code 0x03E28E|$0F:$E27E:20 2A C4 JSR $C42A ; control flow target (from $D2B3) 0x03E291|$0F:$E281:20 65 C4 JSR $C465 ; wait for interrupt and then set every 4th byte of $0200 - $02FC to #$F0 0x03E294|$0F:$E284:4C 90 E2 JMP $E290 ; control flow target (from $D866) 0x03E297|$0F:$E287:20 2A C4 JSR $C42A ; control flow target (from $C7E9) 0x03E29A|$0F:$E28A:20 65 C4 JSR $C465 ; wait for interrupt and then set every 4th byte of $0200 - $02FC to #$F0 0x03E29D|$0F:$E28D:20 FD E3 JSR $E3FD ; control flow target (from $E284) 0x03E2A0|$0F:$E290:20 CC E3 JSR $E3CC 0x03E2A3|$0F:$E293:A5 31 LDA $31 ; current map ID 0x03E2A5|$0F:$E295:C9 01 CMP #$01 ; Map ID #$01: World Map 0x03E2A7|$0F:$E297:D0 18 BNE $E2B1 0x03E2A9|$0F:$E299:A5 16 LDA $16 ; current map X-pos (1) 0x03E2AB|$0F:$E29B:C9 54 CMP #$54 ; Rhone region is from #$54 <= X-pos < #$90 0x03E2AD|$0F:$E29D:90 12 BCC $E2B1 0x03E2AF|$0F:$E29F:C9 90 CMP #$90 0x03E2B1|$0F:$E2A1:B0 0E BCS $E2B1 0x03E2B3|$0F:$E2A3:A5 17 LDA $17 ; current map Y-pos (1) 0x03E2B5|$0F:$E2A5:C9 91 CMP #$91 ; Rhone region is from #$91 <= Y-pos < #$BA 0x03E2B7|$0F:$E2A7:90 08 BCC $E2B1 0x03E2B9|$0F:$E2A9:C9 BA CMP #$BA 0x03E2BB|$0F:$E2AB:B0 04 BCS $E2B1 0x03E2BD|$0F:$E2AD:A9 68 LDA #$68 ; palette for Rhone region of Wolrd Map 0x03E2BF|$0F:$E2AF:85 27 STA $27 ; map palette; offset from ($E27C) ; control flow target (from $E297, $E29D, $E2A1, $E2A7, $E2AB) 0x03E2C1|$0F:$E2B1:20 DA E3 JSR $E3DA 0x03E2C4|$0F:$E2B4:A9 F2 LDA #$F2 0x03E2C6|$0F:$E2B6:85 19 STA $19 ; control flow target (from $E2EC) 0x03E2C8|$0F:$E2B8:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03E2CB|$0F:$E2BB:A9 EE LDA #$EE 0x03E2CD|$0F:$E2BD:85 18 STA $18 ; control flow target (from $E2CC) 0x03E2CF|$0F:$E2BF:A9 00 LDA #$00 0x03E2D1|$0F:$E2C1:85 1C STA $1C 0x03E2D3|$0F:$E2C3:85 1E STA $1E 0x03E2D5|$0F:$E2C5:20 C5 DE JSR $DEC5 0x03E2D8|$0F:$E2C8:E6 18 INC $18 0x03E2DA|$0F:$E2CA:E6 18 INC $18 0x03E2DC|$0F:$E2CC:D0 F1 BNE $E2BF 0x03E2DE|$0F:$E2CE:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $E2E2) 0x03E2E1|$0F:$E2D1:A9 00 LDA #$00 0x03E2E3|$0F:$E2D3:85 1C STA $1C 0x03E2E5|$0F:$E2D5:85 1E STA $1E 0x03E2E7|$0F:$E2D7:20 C5 DE JSR $DEC5 0x03E2EA|$0F:$E2DA:E6 18 INC $18 0x03E2EC|$0F:$E2DC:E6 18 INC $18 0x03E2EE|$0F:$E2DE:A5 18 LDA $18 0x03E2F0|$0F:$E2E0:C9 12 CMP #$12 0x03E2F2|$0F:$E2E2:D0 ED BNE $E2D1 0x03E2F4|$0F:$E2E4:E6 19 INC $19 0x03E2F6|$0F:$E2E6:E6 19 INC $19 0x03E2F8|$0F:$E2E8:A5 19 LDA $19 0x03E2FA|$0F:$E2EA:C9 10 CMP #$10 0x03E2FC|$0F:$E2EC:D0 CA BNE $E2B8 0x03E2FE|$0F:$E2EE:A9 FF LDA #$FF 0x03E300|$0F:$E2F0:85 35 STA $35 ; flag indicating whether any menu is currently open 0x03E302|$0F:$E2F2:20 CB D8 JSR $D8CB 0x03E305|$0F:$E2F5:A9 00 LDA #$00 0x03E307|$0F:$E2F7:85 35 STA $35 ; flag indicating whether any menu is currently open ; control flow target (from $D153, $D18F) 0x03E309|$0F:$E2F9:20 75 F7 JSR $F775 ; load ROM bank #$03 0x03E30C|$0F:$E2FC:A5 27 LDA $27 ; map palette; offset from ($E27C) 0x03E30E|$0F:$E2FE:C9 68 CMP #$68 0x03E310|$0F:$E300:F0 0B BEQ $E30D 0x03E312|$0F:$E302:AD 7A E2 LDA $E27A 0x03E315|$0F:$E305:85 0E STA $0E 0x03E317|$0F:$E307:AD 7B E2 LDA $E27B 0x03E31A|$0F:$E30A:4C 17 E3 JMP $E317 ; control flow target (from $E300) 0x03E31D|$0F:$E30D:AD 78 E2 LDA $E278 0x03E320|$0F:$E310:85 0E STA $0E 0x03E322|$0F:$E312:AD 79 E2 LDA $E279 0x03E325|$0F:$E315:85 0F STA $0F ; useless op ; control flow target (from $E30A) 0x03E327|$0F:$E317:85 0F STA $0F 0x03E329|$0F:$E319:AD 7C E2 LDA $E27C 0x03E32C|$0F:$E31C:18 CLC 0x03E32D|$0F:$E31D:65 27 ADC $27 ; map palette; offset from ($E27C) 0x03E32F|$0F:$E31F:85 10 STA $10 0x03E331|$0F:$E321:AD 7D E2 LDA $E27D 0x03E334|$0F:$E324:69 00 ADC #$00 0x03E336|$0F:$E326:85 11 STA $11 0x03E338|$0F:$E328:A9 FF LDA #$FF 0x03E33A|$0F:$E32A:85 0D STA $0D 0x03E33C|$0F:$E32C:20 CD C2 JSR $C2CD ; control flow target (from $D3C5, $D4A9) 0x03E33F|$0F:$E32F:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E341|$0F:$E331:10 04 BPL $E337 0x03E343|$0F:$E333:A9 0C LDA #$0C ; Music ID #$0C: game menu / Wellgarth singer BGM 0x03E345|$0F:$E335:D0 44 BNE $E37B ; control flow target (from $E331) 0x03E347|$0F:$E337:D0 4E BNE $E387 0x03E349|$0F:$E339:A5 CF LDA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x03E34B|$0F:$E33B:29 04 AND #$04 0x03E34D|$0F:$E33D:F0 04 BEQ $E343 0x03E34F|$0F:$E33F:A9 16 LDA #$16 ; Music ID #$16: sea BGM 0x03E351|$0F:$E341:D0 38 BNE $E37B ; control flow target (from $E33D) 0x03E353|$0F:$E343:A5 16 LDA $16 ; current map X-pos (1) 0x03E355|$0F:$E345:C9 20 CMP #$20 0x03E357|$0F:$E347:90 12 BCC $E35B 0x03E359|$0F:$E349:C9 57 CMP #$57 0x03E35B|$0F:$E34B:B0 0E BCS $E35B 0x03E35D|$0F:$E34D:A5 17 LDA $17 ; current map Y-pos (1) 0x03E35F|$0F:$E34F:C9 17 CMP #$17 0x03E361|$0F:$E351:90 08 BCC $E35B 0x03E363|$0F:$E353:C9 56 CMP #$56 0x03E365|$0F:$E355:B0 04 BCS $E35B 0x03E367|$0F:$E357:A9 0D LDA #$0D ; Music ID #$0D: Tantegel BGM 0x03E369|$0F:$E359:D0 20 BNE $E37B ; control flow target (from $E347, $E34B, $E351, $E355) 0x03E36B|$0F:$E35B:A0 00 LDY #$00 0x03E36D|$0F:$E35D:84 0C STY $0C ; control flow target (from $E36D) 0x03E36F|$0F:$E35F:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03E372|$0F:$E362:10 02 BPL $E366 0x03E374|$0F:$E364:E6 0C INC $0C ; control flow target (from $E362) 0x03E376|$0F:$E366:98 TYA 0x03E377|$0F:$E367:18 CLC 0x03E378|$0F:$E368:69 12 ADC #$12 0x03E37A|$0F:$E36A:A8 TAY 0x03E37B|$0F:$E36B:C9 36 CMP #$36 0x03E37D|$0F:$E36D:90 F0 BCC $E35F 0x03E37F|$0F:$E36F:A5 0C LDA $0C 0x03E381|$0F:$E371:C9 03 CMP #$03 0x03E383|$0F:$E373:F0 04 BEQ $E379 0x03E385|$0F:$E375:A9 15 LDA #$15 ; Music ID #$15: small party BGM 0x03E387|$0F:$E377:D0 02 BNE $E37B ; control flow target (from $E373) 0x03E389|$0F:$E379:A9 14 LDA #$14 ; Music ID #$14: full party BGM ; control flow target (from $E335, $E341, $E359, $E377, $E38D, $E395, $E3A4, $E3AC, $E3B1) 0x03E38B|$0F:$E37B:CD F7 05 CMP $05F7 ; probably BGM for current area 0x03E38E|$0F:$E37E:F0 06 BEQ $E386 0x03E390|$0F:$E380:8D F7 05 STA $05F7 ; probably BGM for current area 0x03E393|$0F:$E383:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) ; control flow target (from $E37E) 0x03E396|$0F:$E386:60 RTS ; control flow target (from $E337) 0x03E397|$0F:$E387:C9 03 CMP #$03 0x03E399|$0F:$E389:D0 04 BNE $E38F 0x03E39B|$0F:$E38B:A9 11 LDA #$11 ; Music ID #$11: tower BGM 0x03E39D|$0F:$E38D:D0 EC BNE $E37B ; control flow target (from $E389) 0x03E39F|$0F:$E38F:C9 02 CMP #$02 0x03E3A1|$0F:$E391:D0 04 BNE $E397 0x03E3A3|$0F:$E393:A9 10 LDA #$10 ; Music ID #$10: cave BGM 0x03E3A5|$0F:$E395:D0 E4 BNE $E37B ; control flow target (from $E391) 0x03E3A7|$0F:$E397:A6 31 LDX $31 ; current map ID 0x03E3A9|$0F:$E399:E0 09 CPX #$09 ; Map ID #$09: Moonbrooke 0x03E3AB|$0F:$E39B:D0 09 BNE $E3A6 0x03E3AD|$0F:$E39D:AD AD 61 LDA $61AD 0x03E3B0|$0F:$E3A0:F0 04 BEQ $E3A6 0x03E3B2|$0F:$E3A2:A9 0E LDA #$0E ; Music ID #$0E: town music 1 BGM 0x03E3B4|$0F:$E3A4:D0 D5 BNE $E37B ; control flow target (from $E39B, $E3A0) 0x03E3B6|$0F:$E3A6:E0 19 CPX #$19 ; Map ID #$19: Shrine NW of Midenhall 0x03E3B8|$0F:$E3A8:90 04 BCC $E3AE 0x03E3BA|$0F:$E3AA:A9 13 LDA #$13 ; Music ID #$13: shrine BGM 0x03E3BC|$0F:$E3AC:D0 CD BNE $E37B ; control flow target (from $E3A8) 0x03E3BE|$0F:$E3AE:BD B3 E3 LDA $E3B3,X ; map BGM 0x03E3C1|$0F:$E3B1:D0 C8 BNE $E37B ; code -> data ; map BGM ; indexed data load target (from $E3AE) 0x03E3C3|$0F:$E3B3:0E ; Map ID #$00: Fake Midenhall; Music ID #$0E: town music 1 BGM 0x03E3C4|$0F:$E3B4:0E ; Map ID #$01: World Map; Music ID #$0E: town music 1 BGM 0x03E3C5|$0F:$E3B5:0E ; Map ID #$02: Midenhall 2F; Music ID #$0E: town music 1 BGM 0x03E3C6|$0F:$E3B6:0E ; Map ID #$03: Midenhall 1F; Music ID #$0E: town music 1 BGM 0x03E3C7|$0F:$E3B7:0E ; Map ID #$04: Midenhall B1; Music ID #$0E: town music 1 BGM 0x03E3C8|$0F:$E3B8:0F ; Map ID #$05: Leftwyne; Music ID #$0F: town music 2 BGM 0x03E3C9|$0F:$E3B9:0E ; Map ID #$06: Cannock; Music ID #$0E: town music 1 BGM 0x03E3CA|$0F:$E3BA:0F ; Map ID #$07: Hamlin; Music ID #$0F: town music 2 BGM 0x03E3CB|$0F:$E3BB:0F ; Map ID #$08: Hamlin Waterway; Music ID #$0F: town music 2 BGM 0x03E3CC|$0F:$E3BC:10 ; Map ID #$09: Moonbrooke; Music ID #$10: cave BGM 0x03E3CD|$0F:$E3BD:10 ; Map ID #$0A: Moonbrooke B1; Music ID #$10: cave BGM 0x03E3CE|$0F:$E3BE:0F ; Map ID #$0B: Lianport; Music ID #$0F: town music 2 BGM 0x03E3CF|$0F:$E3BF:0E ; Map ID #$0C: Tantegel; Music ID #$0E: town music 1 BGM 0x03E3D0|$0F:$E3C0:0E ; Map ID #$0D: Tantegel Town 2F; Music ID #$0E: town music 1 BGM 0x03E3D1|$0F:$E3C1:0E ; Map ID #$0E: Tantegel Castle 2F; Music ID #$0E: town music 1 BGM 0x03E3D2|$0F:$E3C2:0E ; Map ID #$0F: Osterfair; Music ID #$0E: town music 1 BGM 0x03E3D3|$0F:$E3C3:0F ; Map ID #$10: Zahan; Music ID #$0F: town music 2 BGM 0x03E3D4|$0F:$E3C4:0F ; Map ID #$11: Tuhn; Music ID #$0F: town music 2 BGM 0x03E3D5|$0F:$E3C5:0F ; Map ID #$12: Tuhn Watergate; Music ID #$0F: town music 2 BGM 0x03E3D6|$0F:$E3C6:0F ; Map ID #$13: Wellgarth; Music ID #$0F: town music 2 BGM 0x03E3D7|$0F:$E3C7:0F ; Map ID #$14: Wellgarth Underground; Music ID #$0F: town music 2 BGM 0x03E3D8|$0F:$E3C8:0F ; Map ID #$15: Beran; Music ID #$0F: town music 2 BGM 0x03E3D9|$0F:$E3C9:10 ; Map ID #$16: Hargon's Castle 1F; Music ID #$10: cave BGM 0x03E3DA|$0F:$E3CA:11 ; Map ID #$17: Hargon's Castle 7F; Music ID #$11: tower BGM 0x03E3DB|$0F:$E3CB:10 ; Map ID #$18: Charlock Castle B8; Music ID #$10: cave BGM ; data -> code ; control flow target (from $D6DA, $E290) 0x03E3DC|$0F:$E3CC:A9 00 LDA #$00 0x03E3DE|$0F:$E3CE:85 3B STA $3B ; high nybble = terrain ID 0x03E3E0|$0F:$E3D0:8D 59 01 STA $0159 0x03E3E3|$0F:$E3D3:8D 5A 01 STA $015A 0x03E3E6|$0F:$E3D6:8D 5B 01 STA $015B 0x03E3E9|$0F:$E3D9:60 RTS ; control flow target (from $E2B1) 0x03E3EA|$0F:$E3DA:A5 16 LDA $16 ; current map X-pos (1) 0x03E3EC|$0F:$E3DC:85 0C STA $0C 0x03E3EE|$0F:$E3DE:A5 17 LDA $17 ; current map Y-pos (1) 0x03E3F0|$0F:$E3E0:85 0E STA $0E 0x03E3F2|$0F:$E3E2:20 89 DF JSR $DF89 0x03E3F5|$0F:$E3E5:20 4A DF JSR $DF4A 0x03E3F8|$0F:$E3E8:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03E3FB|$0F:$E3EB:A0 04 LDY #$04 0x03E3FD|$0F:$E3ED:B1 10 LDA ($10),Y 0x03E3FF|$0F:$E3EF:29 F0 AND #$F0 0x03E401|$0F:$E3F1:85 3C STA $3C 0x03E403|$0F:$E3F3:20 22 E2 JSR $E222 0x03E406|$0F:$E3F6:A5 0D LDA $0D 0x03E408|$0F:$E3F8:85 1D STA $1D 0x03E40A|$0F:$E3FA:60 RTS ; code -> data ; -> $02:$8018: map header info (exterior border tile ID, width, height, pointer low byte, pointer high byte, ?, ?, palette) ; data load target (from $E475) 0x03E40B|$0F:$E3FB:18 ; data load target (from $E47D) 0x03E40C|$0F:$E3FC: 80 ; $02:$8018; map header info (exterior border tile ID, width, height, pointer low byte, pointer high byte, ?, ?, palette) ; data -> code ; control flow target (from $E28D) 0x03E40D|$0F:$E3FD:A5 31 LDA $31 ; current map ID 0x03E40F|$0F:$E3FF:C9 01 CMP #$01 ; Map ID #$01: World Map 0x03E411|$0F:$E401:D0 04 BNE $E407 0x03E413|$0F:$E403:A9 00 LDA #$00 ; World Map uses #$00 0x03E415|$0F:$E405:F0 12 BEQ $E419 ; control flow target (from $E401) 0x03E417|$0F:$E407:C9 2B CMP #$2B ; Map ID #$2B: Cave to Hamlin 0x03E419|$0F:$E409:B0 04 BCS $E40F 0x03E41B|$0F:$E40B:A9 01 LDA #$01 ; other non-dungeon maps use #$01 0x03E41D|$0F:$E40D:D0 0A BNE $E419 ; control flow target (from $E409) 0x03E41F|$0F:$E40F:C9 44 CMP #$44 ; Map ID #$44: Hargon's Castle 2F 0x03E421|$0F:$E411:B0 04 BCS $E417 0x03E423|$0F:$E413:A9 02 LDA #$02 ; other maps up to #$44 use #$02 0x03E425|$0F:$E415:D0 02 BNE $E419 ; control flow target (from $E411) 0x03E427|$0F:$E417:A9 03 LDA #$03 ; maps >= #$44 use #$03 ; control flow target (from $E405, $E40D, $E415) 0x03E429|$0F:$E419:85 1F STA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E42B|$0F:$E41B:85 0C STA $0C 0x03E42D|$0F:$E41D:20 5C F7 JSR $F75C ; load ROM bank #$00 ; call to code in a different bank ($00:$8000) 0x03E430|$0F:$E420:20 00 80 JSR $8000 0x03E433|$0F:$E423:A5 31 LDA $31 ; current map ID 0x03E435|$0F:$E425:D0 04 BNE $E42B ; Map ID #$00: Fake Midenhall 0x03E437|$0F:$E427:A9 FF LDA #$FF 0x03E439|$0F:$E429:D0 07 BNE $E432 ; control flow target (from $E425) 0x03E43B|$0F:$E42B:AD FC 05 LDA $05FC 0x03E43E|$0F:$E42E:F0 0B BEQ $E43B 0x03E440|$0F:$E430:A9 00 LDA #$00 ; control flow target (from $E429) 0x03E442|$0F:$E432:8D FC 05 STA $05FC 0x03E445|$0F:$E435:20 61 F7 JSR $F761 ; load ROM bank #$06 ; call to code in a different bank ($06:$A319) 0x03E448|$0F:$E438:20 19 A3 JSR $A319 ; if $05FC is #$00, copy battle stats at $015D,Y to field stats at $0600,X, otherwise copy field stats at $0600,X to battle stats at $015D,Y ; control flow target (from $E42E) 0x03E44B|$0F:$E43B:A9 04 LDA #$04 0x03E44D|$0F:$E43D:85 0C STA $0C 0x03E44F|$0F:$E43F:20 5C F7 JSR $F75C ; load ROM bank #$00 ; call to code in a different bank ($00:$8000) 0x03E452|$0F:$E442:20 00 80 JSR $8000 0x03E455|$0F:$E445:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03E458|$0F:$E448:A5 31 LDA $31 ; current map ID 0x03E45A|$0F:$E44A:C9 01 CMP #$01 ; Map ID #$01: World Map 0x03E45C|$0F:$E44C:D0 03 BNE $E451 0x03E45E|$0F:$E44E:20 A2 E5 JSR $E5A2 ; control flow target (from $E44C) 0x03E461|$0F:$E451:A9 08 LDA #$08 0x03E463|$0F:$E453:85 14 STA $14 0x03E465|$0F:$E455:A9 07 LDA #$07 0x03E467|$0F:$E457:85 15 STA $15 0x03E469|$0F:$E459:A9 00 LDA #$00 0x03E46B|$0F:$E45B:85 05 STA $05 0x03E46D|$0F:$E45D:85 06 STA $06 0x03E46F|$0F:$E45F:85 04 STA $04 ; control flow target (from $E92A) 0x03E471|$0F:$E461:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03E474|$0F:$E464:A9 00 LDA #$00 0x03E476|$0F:$E466:85 0D STA $0D ; multiplication high byte 0x03E478|$0F:$E468:85 0F STA $0F ; multiplication high byte 0x03E47A|$0F:$E46A:A5 31 LDA $31 ; current map ID 0x03E47C|$0F:$E46C:85 0C STA $0C ; multiplication low byte 0x03E47E|$0F:$E46E:A9 08 LDA #$08 0x03E480|$0F:$E470:85 0E STA $0E ; multiplication low byte 0x03E482|$0F:$E472:20 39 C3 JSR $C339 ; 16-bit multiplication: ($10-$11) = ($0C-$0D) * ($0E-$0F); consumes $0C-$0F 0x03E485|$0F:$E475:AD FB E3 LDA $E3FB ; -> $02:$8018: map header info (exterior border tile ID, width, height, pointer low byte, pointer high byte, ?, ?, palette) 0x03E488|$0F:$E478:18 CLC 0x03E489|$0F:$E479:65 10 ADC $10 ; add low byte of map ID * 8 0x03E48B|$0F:$E47B:85 10 STA $10 0x03E48D|$0F:$E47D:AD FC E3 LDA $E3FC 0x03E490|$0F:$E480:65 11 ADC $11 ; add high byte of map ID * 8 0x03E492|$0F:$E482:85 11 STA $11 0x03E494|$0F:$E484:A0 00 LDY #$00 ; control flow target (from $E48E) 0x03E496|$0F:$E486:B1 10 LDA ($10),Y 0x03E498|$0F:$E488:99 20 00 STA $0020,Y ; map exterior border tile ID (#$00 = Road, #$01 = Grass, #$02 = Sand, #$03 = Tree, #$04 = Water, #$05 = Vertical Wall, #$06 = Shrub, #$07 = Horizontal Wall, #$08 = Swamp, ..., #$20 = Ceiling Alternating?, #$21 = Ceiling Down?, #$24 = Black?, #$28 = Blue?) 0x03E49B|$0F:$E48B:C8 INY 0x03E49C|$0F:$E48C:C0 08 CPY #$08 ; copy 8 byte map header to $20 0x03E49E|$0F:$E48E:D0 F6 BNE $E486 0x03E4A0|$0F:$E490:AD AD 61 LDA $61AD 0x03E4A3|$0F:$E493:F0 14 BEQ $E4A9 0x03E4A5|$0F:$E495:A5 31 LDA $31 ; current map ID 0x03E4A7|$0F:$E497:C9 09 CMP #$09 ; Map ID #$09: Moonbrooke 0x03E4A9|$0F:$E499:D0 0E BNE $E4A9 0x03E4AB|$0F:$E49B:AD D7 86 LDA $86D7 ; -> $02:$A201: Map ID #$6D: Moonbrooke (prologue) 0x03E4AE|$0F:$E49E:85 23 STA $23 ; map pointer, low byte 0x03E4B0|$0F:$E4A0:AD D8 86 LDA $86D8 0x03E4B3|$0F:$E4A3:85 24 STA $24 ; map pointer, high byte 0x03E4B5|$0F:$E4A5:A9 02 LDA #$02 0x03E4B7|$0F:$E4A7:85 20 STA $20 ; map exterior border tile ID (#$00 = Road, #$01 = Grass, #$02 = Sand, #$03 = Tree, #$04 = Water, #$05 = Vertical Wall, #$06 = Shrub, #$07 = Horizontal Wall, #$08 = Swamp, ..., #$20 = Ceiling Alternating?, #$21 = Ceiling Down?, #$24 = Black?, #$28 = Blue?) ; control flow target (from $E493, $E499) 0x03E4B9|$0F:$E4A9:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E4BB|$0F:$E4AB:F0 03 BEQ $E4B0 ; call to code in a different bank ($02:$AB89) 0x03E4BD|$0F:$E4AD:20 89 AB JSR $AB89 ; control flow target (from $E4AB) 0x03E4C0|$0F:$E4B0:A5 31 LDA $31 ; current map ID 0x03E4C2|$0F:$E4B2:C9 12 CMP #$12 ; Map ID #$12: Tuhn Watergate 0x03E4C4|$0F:$E4B4:D0 08 BNE $E4BE 0x03E4C6|$0F:$E4B6:A5 CE LDA $CE ; Tuhn Watergate open flag (#$00 = closed, #$01 = open) 0x03E4C8|$0F:$E4B8:F0 04 BEQ $E4BE 0x03E4CA|$0F:$E4BA:A9 04 LDA #$04 0x03E4CC|$0F:$E4BC:85 20 STA $20 ; map exterior border tile ID (#$00 = Road, #$01 = Grass, #$02 = Sand, #$03 = Tree, #$04 = Water, #$05 = Vertical Wall, #$06 = Shrub, #$07 = Horizontal Wall, #$08 = Swamp, ..., #$20 = Ceiling Alternating?, #$21 = Ceiling Down?, #$24 = Black?, #$28 = Blue?) ; control flow target (from $E4B4, $E4B8) 0x03E4CE|$0F:$E4BE:20 F7 D2 JSR $D2F7 0x03E4D1|$0F:$E4C1:A9 00 LDA #$00 0x03E4D3|$0F:$E4C3:85 39 STA $39 0x03E4D5|$0F:$E4C5:85 35 STA $35 ; flag indicating whether any menu is currently open 0x03E4D7|$0F:$E4C7:85 36 STA $36 0x03E4D9|$0F:$E4C9:85 03 STA $03 ; game clock? 0x03E4DB|$0F:$E4CB:A9 18 LDA #$18 0x03E4DD|$0F:$E4CD:85 3A STA $3A 0x03E4DF|$0F:$E4CF:A0 18 LDY #$18 ; control flow target (from $E4DD) 0x03E4E1|$0F:$E4D1:A9 FF LDA #$FF 0x03E4E3|$0F:$E4D3:99 41 05 STA $0541,Y ; NPC #$00 sprite ID 0x03E4E6|$0F:$E4D6:98 TYA 0x03E4E7|$0F:$E4D7:18 CLC 0x03E4E8|$0F:$E4D8:69 08 ADC #$08 0x03E4EA|$0F:$E4DA:A8 TAY 0x03E4EB|$0F:$E4DB:C9 B8 CMP #$B8 0x03E4ED|$0F:$E4DD:D0 F2 BNE $E4D1 0x03E4EF|$0F:$E4DF:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03E4F2|$0F:$E4E2:A5 D0 LDA $D0 ; Malroth status flag (#$FF = defeated, #$00 = alive, others = countdown to battle) 0x03E4F4|$0F:$E4E4:10 19 BPL $E4FF 0x03E4F6|$0F:$E4E6:A5 31 LDA $31 ; current map ID 0x03E4F8|$0F:$E4E8:C9 03 CMP #$03 ; Map ID #$03: Midenhall 1F 0x03E4FA|$0F:$E4EA:D0 13 BNE $E4FF 0x03E4FC|$0F:$E4EC:20 DA FE JSR $FEDA ; parse byte following JSR for bank and pointer index, set $D6-$D7 to $8000,X-$8001,X in selected bank ; code -> data ; indirect data load target 0x03E4FF|$0F:$E4EF:49 ; $02:$8012; -> $02:$B351: looks like more NPC data? ; data -> code 0x03E500|$0F:$E4F0:A5 D6 LDA $D6 0x03E502|$0F:$E4F2:85 0C STA $0C 0x03E504|$0F:$E4F4:A5 D7 LDA $D7 0x03E506|$0F:$E4F6:85 0D STA $0D 0x03E508|$0F:$E4F8:20 FA FE JSR $FEFA ; increment JSR's return address, read byte following JSR, parse it for bank and pointer index, set $D6-$D7 to $8000,X-$8001,X in selected bank ; code -> data ; indirect data load target 0x03E50B|$0F:$E4FB:49 ; $02:$8012; -> $02:$B351: looks like more NPC data? ; data -> code 0x03E50C|$0F:$E4FC:4C 70 E5 JMP $E570 ; control flow target (from $E4E4, $E4EA) 0x03E50F|$0F:$E4FF:AD AD 61 LDA $61AD 0x03E512|$0F:$E502:F0 1F BEQ $E523 0x03E514|$0F:$E504:A5 31 LDA $31 ; current map ID 0x03E516|$0F:$E506:C9 09 CMP #$09 ; Map ID #$09: Moonbrooke 0x03E518|$0F:$E508:F0 08 BEQ $E512 0x03E51A|$0F:$E50A:C9 01 CMP #$01 ; Map ID #$01: World Map 0x03E51C|$0F:$E50C:F0 08 BEQ $E516 0x03E51E|$0F:$E50E:A9 6E LDA #$6E 0x03E520|$0F:$E510:D0 13 BNE $E525 ; control flow target (from $E508) 0x03E522|$0F:$E512:A9 6D LDA #$6D 0x03E524|$0F:$E514:D0 0F BNE $E525 ; control flow target (from $E50C) 0x03E526|$0F:$E516:A0 6F LDY #$6F 0x03E528|$0F:$E518:AD AD 61 LDA $61AD 0x03E52B|$0F:$E51B:C9 FE CMP #$FE 0x03E52D|$0F:$E51D:D0 01 BNE $E520 0x03E52F|$0F:$E51F:C8 INY ; control flow target (from $E51D) 0x03E530|$0F:$E520:98 TYA 0x03E531|$0F:$E521:D0 02 BNE $E525 ; control flow target (from $E502) 0x03E533|$0F:$E523:A5 31 LDA $31 ; current map ID ; control flow target (from $E510, $E514, $E521) 0x03E535|$0F:$E525:0A ASL 0x03E536|$0F:$E526:A8 TAY 0x03E537|$0F:$E527:B9 39 A5 LDA $A539,Y ; pointers to per-map NPC setup (X-pos, Y-pos, ???, sprite ID, dialogue [not string] ID) 0x03E53A|$0F:$E52A:85 0C STA $0C 0x03E53C|$0F:$E52C:B9 3A A5 LDA $A53A,Y 0x03E53F|$0F:$E52F:85 0D STA $0D 0x03E541|$0F:$E531:05 0C ORA $0C 0x03E543|$0F:$E533:D0 3B BNE $E570 ; zero pointer => no NPCs 0x03E545|$0F:$E535:A5 31 LDA $31 ; current map ID 0x03E547|$0F:$E537:C9 01 CMP #$01 ; Map ID #$01: World Map 0x03E549|$0F:$E539:D0 2D BNE $E568 ; if we're on the world map, check to see if we need to add the ship sprite 0x03E54B|$0F:$E53B:AD AD 61 LDA $61AD 0x03E54E|$0F:$E53E:D0 12 BNE $E552 0x03E550|$0F:$E540:A5 CF LDA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x03E552|$0F:$E542:29 06 AND #$06 0x03E554|$0F:$E544:C9 02 CMP #$02 0x03E556|$0F:$E546:D0 20 BNE $E568 0x03E558|$0F:$E548:A5 D2 LDA $D2 ; ship X-pos (when you aren't on it) 0x03E55A|$0F:$E54A:8D D4 05 STA $05D4 ; NPC #$13 X-pos 0x03E55D|$0F:$E54D:A5 D3 LDA $D3 ; ship Y-pos (when you aren't on it) 0x03E55F|$0F:$E54F:8D D5 05 STA $05D5 ; NPC #$13 Y-pos ; control flow target (from $E53E) 0x03E562|$0F:$E552:A9 00 LDA #$00 0x03E564|$0F:$E554:8D D6 05 STA $05D6 ; NPC #$13 ? 0x03E567|$0F:$E557:8D D7 05 STA $05D7 ; NPC #$13 ? 0x03E56A|$0F:$E55A:85 38 STA $38 0x03E56C|$0F:$E55C:A9 01 LDA #$01 0x03E56E|$0F:$E55E:8D D8 05 STA $05D8 ; NPC #$13 motion nybble + direction nybble 0x03E571|$0F:$E561:A9 05 LDA #$05 0x03E573|$0F:$E563:8D D9 05 STA $05D9 ; NPC #$13 sprite ID 0x03E576|$0F:$E566:D0 04 BNE $E56C ; control flow target (from $E539, $E546) 0x03E578|$0F:$E568:A9 FF LDA #$FF 0x03E57A|$0F:$E56A:85 38 STA $38 ; control flow target (from $E566, $E57A) 0x03E57C|$0F:$E56C:20 8F CD JSR $CD8F 0x03E57F|$0F:$E56F:60 RTS ; control flow target (from $E4FC, $E533) 0x03E580|$0F:$E570:A0 00 LDY #$00 0x03E582|$0F:$E572:84 38 STY $38 0x03E584|$0F:$E574:A2 18 LDX #$18 ; control flow target (from $E5A0) 0x03E586|$0F:$E576:B1 0C LDA ($0C),Y 0x03E588|$0F:$E578:C9 FF CMP #$FF 0x03E58A|$0F:$E57A:F0 F0 BEQ $E56C 0x03E58C|$0F:$E57C:9D 3C 05 STA $053C,X ; NPC #$00 ? 0x03E58F|$0F:$E57F:C8 INY 0x03E590|$0F:$E580:B1 0C LDA ($0C),Y 0x03E592|$0F:$E582:9D 3D 05 STA $053D,X ; NPC #$00 ? 0x03E595|$0F:$E585:C8 INY 0x03E596|$0F:$E586:A9 00 LDA #$00 0x03E598|$0F:$E588:9D 3E 05 STA $053E,X ; NPC #$00 ? 0x03E59B|$0F:$E58B:9D 3F 05 STA $053F,X ; NPC #$00 ? 0x03E59E|$0F:$E58E:B1 0C LDA ($0C),Y 0x03E5A0|$0F:$E590:9D 40 05 STA $0540,X ; NPC #$00 ? + direction nybble 0x03E5A3|$0F:$E593:C8 INY 0x03E5A4|$0F:$E594:B1 0C LDA ($0C),Y 0x03E5A6|$0F:$E596:9D 41 05 STA $0541,X ; NPC #$00 sprite ID 0x03E5A9|$0F:$E599:C8 INY 0x03E5AA|$0F:$E59A:C8 INY 0x03E5AB|$0F:$E59B:8A TXA 0x03E5AC|$0F:$E59C:18 CLC 0x03E5AD|$0F:$E59D:69 08 ADC #$08 0x03E5AF|$0F:$E59F:AA TAX 0x03E5B0|$0F:$E5A0:D0 D4 BNE $E576 ; control flow target (from $D2BC, $D4F6, $E44E) 0x03E5B2|$0F:$E5A2:A2 00 LDX #$00 0x03E5B4|$0F:$E5A4:8A TXA ; control flow target (from $E5AB) 0x03E5B5|$0F:$E5A5:9D 1A 05 STA $051A,X ; something to do with whether you've opened the chest containing the Shield of Erdrick 0x03E5B8|$0F:$E5A8:E8 INX 0x03E5B9|$0F:$E5A9:E0 20 CPX #$20 0x03E5BB|$0F:$E5AB:D0 F8 BNE $E5A5 0x03E5BD|$0F:$E5AD:60 RTS ; control flow target (from $E5C2, $E636, $E6B4, $E797) 0x03E5BE|$0F:$E5AE:AD C5 04 LDA $04C5 0x03E5C1|$0F:$E5B1:D0 01 BNE $E5B4 0x03E5C3|$0F:$E5B3:60 RTS ; control flow target (from $E5B1) 0x03E5C4|$0F:$E5B4:A5 03 LDA $03 ; game clock? 0x03E5C6|$0F:$E5B6:48 PHA 0x03E5C7|$0F:$E5B7:A9 00 LDA #$00 0x03E5C9|$0F:$E5B9:85 0C STA $0C 0x03E5CB|$0F:$E5BB:20 8C F7 JSR $F78C ; wipe selected menu region 0x03E5CE|$0F:$E5BE:68 PLA 0x03E5CF|$0F:$E5BF:85 03 STA $03 ; game clock? 0x03E5D1|$0F:$E5C1:60 RTS ; control flow target (from $C741, $FF6C) 0x03E5D2|$0F:$E5C2:20 AE E5 JSR $E5AE 0x03E5D5|$0F:$E5C5:A5 03 LDA $03 ; game clock? 0x03E5D7|$0F:$E5C7:29 0F AND #$0F 0x03E5D9|$0F:$E5C9:F0 05 BEQ $E5D0 0x03E5DB|$0F:$E5CB:68 PLA 0x03E5DC|$0F:$E5CC:68 PLA 0x03E5DD|$0F:$E5CD:4C 47 C7 JMP $C747 ; control flow target (from $E5C9) 0x03E5E0|$0F:$E5D0:E6 28 INC $28 ; current map X-pos (2) 0x03E5E2|$0F:$E5D2:A9 FF LDA #$FF 0x03E5E4|$0F:$E5D4:8D 3C 05 STA $053C ; NPC #$00 ? 0x03E5E7|$0F:$E5D7:A9 00 LDA #$00 0x03E5E9|$0F:$E5D9:8D 3D 05 STA $053D ; NPC #$00 ? 0x03E5EC|$0F:$E5DC:A9 01 LDA #$01 0x03E5EE|$0F:$E5DE:8D 40 05 STA $0540 ; NPC #$00 ? + direction nybble 0x03E5F1|$0F:$E5E1:20 5B D3 JSR $D35B 0x03E5F4|$0F:$E5E4:A9 12 LDA #$12 0x03E5F6|$0F:$E5E6:85 18 STA $18 0x03E5F8|$0F:$E5E8:A9 F2 LDA #$F2 0x03E5FA|$0F:$E5EA:85 19 STA $19 ; control flow target (from $E607) 0x03E5FC|$0F:$E5EC:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03E5FF|$0F:$E5EF:A9 00 LDA #$00 0x03E601|$0F:$E5F1:85 1C STA $1C 0x03E603|$0F:$E5F3:85 1E STA $1E 0x03E605|$0F:$E5F5:20 C5 DE JSR $DEC5 0x03E608|$0F:$E5F8:E6 19 INC $19 0x03E60A|$0F:$E5FA:E6 19 INC $19 0x03E60C|$0F:$E5FC:E6 05 INC $05 0x03E60E|$0F:$E5FE:E6 2A INC $2A ; current map X-pos pixel, low byte 0x03E610|$0F:$E600:20 97 D8 JSR $D897 0x03E613|$0F:$E603:A5 19 LDA $19 0x03E615|$0F:$E605:C9 10 CMP #$10 0x03E617|$0F:$E607:D0 E3 BNE $E5EC 0x03E619|$0F:$E609:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03E61C|$0F:$E60C:E6 05 INC $05 0x03E61E|$0F:$E60E:D0 06 BNE $E616 0x03E620|$0F:$E610:A5 04 LDA $04 0x03E622|$0F:$E612:49 01 EOR #$01 0x03E624|$0F:$E614:85 04 STA $04 ; control flow target (from $E60E) 0x03E626|$0F:$E616:E6 14 INC $14 0x03E628|$0F:$E618:A9 1F LDA #$1F 0x03E62A|$0F:$E61A:25 14 AND $14 0x03E62C|$0F:$E61C:85 14 STA $14 0x03E62E|$0F:$E61E:E6 16 INC $16 ; current map X-pos (1) 0x03E630|$0F:$E620:E6 2A INC $2A ; current map X-pos pixel, low byte 0x03E632|$0F:$E622:D0 0C BNE $E630 0x03E634|$0F:$E624:E6 2B INC $2B ; current map X-pos pixel, high byte 0x03E636|$0F:$E626:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E638|$0F:$E628:D0 06 BNE $E630 0x03E63A|$0F:$E62A:A5 2B LDA $2B ; current map X-pos pixel, high byte 0x03E63C|$0F:$E62C:29 0F AND #$0F 0x03E63E|$0F:$E62E:85 2B STA $2B ; current map X-pos pixel, high byte ; control flow target (from $E622, $E628) 0x03E640|$0F:$E630:20 97 D8 JSR $D897 0x03E643|$0F:$E633:4C 7A E8 JMP $E87A ; control flow target (from $C737, $FF72) 0x03E646|$0F:$E636:20 AE E5 JSR $E5AE 0x03E649|$0F:$E639:A5 03 LDA $03 ; game clock? 0x03E64B|$0F:$E63B:29 0F AND #$0F 0x03E64D|$0F:$E63D:F0 05 BEQ $E644 0x03E64F|$0F:$E63F:68 PLA 0x03E650|$0F:$E640:68 PLA 0x03E651|$0F:$E641:4C 47 C7 JMP $C747 ; control flow target (from $E63D) 0x03E654|$0F:$E644:C6 28 DEC $28 ; current map X-pos (2) 0x03E656|$0F:$E646:A9 01 LDA #$01 0x03E658|$0F:$E648:8D 3C 05 STA $053C ; NPC #$00 ? 0x03E65B|$0F:$E64B:A9 00 LDA #$00 0x03E65D|$0F:$E64D:8D 3D 05 STA $053D ; NPC #$00 ? 0x03E660|$0F:$E650:A9 03 LDA #$03 0x03E662|$0F:$E652:8D 40 05 STA $0540 ; NPC #$00 ? + direction nybble 0x03E665|$0F:$E655:20 5B D3 JSR $D35B 0x03E668|$0F:$E658:A9 EC LDA #$EC 0x03E66A|$0F:$E65A:85 18 STA $18 0x03E66C|$0F:$E65C:A9 F2 LDA #$F2 0x03E66E|$0F:$E65E:85 19 STA $19 ; control flow target (from $E69B) 0x03E670|$0F:$E660:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03E673|$0F:$E663:A9 00 LDA #$00 0x03E675|$0F:$E665:85 1C STA $1C 0x03E677|$0F:$E667:85 1E STA $1E 0x03E679|$0F:$E669:20 C5 DE JSR $DEC5 0x03E67C|$0F:$E66C:E6 19 INC $19 0x03E67E|$0F:$E66E:E6 19 INC $19 0x03E680|$0F:$E670:A5 05 LDA $05 0x03E682|$0F:$E672:38 SEC 0x03E683|$0F:$E673:E9 01 SBC #$01 0x03E685|$0F:$E675:85 05 STA $05 0x03E687|$0F:$E677:B0 06 BCS $E67F 0x03E689|$0F:$E679:A5 04 LDA $04 0x03E68B|$0F:$E67B:49 01 EOR #$01 0x03E68D|$0F:$E67D:85 04 STA $04 ; control flow target (from $E677) 0x03E68F|$0F:$E67F:A5 2A LDA $2A ; current map X-pos pixel, low byte 0x03E691|$0F:$E681:38 SEC 0x03E692|$0F:$E682:E9 01 SBC #$01 0x03E694|$0F:$E684:85 2A STA $2A ; current map X-pos pixel, low byte 0x03E696|$0F:$E686:B0 0C BCS $E694 0x03E698|$0F:$E688:C6 2B DEC $2B ; current map X-pos pixel, high byte 0x03E69A|$0F:$E68A:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E69C|$0F:$E68C:D0 06 BNE $E694 0x03E69E|$0F:$E68E:A5 2B LDA $2B ; current map X-pos pixel, high byte 0x03E6A0|$0F:$E690:29 0F AND #$0F 0x03E6A2|$0F:$E692:85 2B STA $2B ; current map X-pos pixel, high byte ; control flow target (from $E686, $E68C) 0x03E6A4|$0F:$E694:20 97 D8 JSR $D897 0x03E6A7|$0F:$E697:A5 19 LDA $19 0x03E6A9|$0F:$E699:C9 10 CMP #$10 0x03E6AB|$0F:$E69B:D0 C3 BNE $E660 0x03E6AD|$0F:$E69D:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03E6B0|$0F:$E6A0:C6 05 DEC $05 0x03E6B2|$0F:$E6A2:C6 14 DEC $14 0x03E6B4|$0F:$E6A4:A9 1F LDA #$1F 0x03E6B6|$0F:$E6A6:25 14 AND $14 0x03E6B8|$0F:$E6A8:85 14 STA $14 0x03E6BA|$0F:$E6AA:C6 16 DEC $16 ; current map X-pos (1) 0x03E6BC|$0F:$E6AC:C6 2A DEC $2A ; current map X-pos pixel, low byte 0x03E6BE|$0F:$E6AE:20 97 D8 JSR $D897 0x03E6C1|$0F:$E6B1:4C 7A E8 JMP $E87A ; control flow target (from $C72B, $CABA, $CABD, $CAC0, $FF7E) 0x03E6C4|$0F:$E6B4:20 AE E5 JSR $E5AE 0x03E6C7|$0F:$E6B7:A5 03 LDA $03 ; game clock? 0x03E6C9|$0F:$E6B9:29 0F AND #$0F 0x03E6CB|$0F:$E6BB:F0 05 BEQ $E6C2 0x03E6CD|$0F:$E6BD:68 PLA 0x03E6CE|$0F:$E6BE:68 PLA 0x03E6CF|$0F:$E6BF:4C 47 C7 JMP $C747 ; control flow target (from $E6BB) 0x03E6D2|$0F:$E6C2:E6 29 INC $29 ; current map Y-pos (2) 0x03E6D4|$0F:$E6C4:A9 00 LDA #$00 0x03E6D6|$0F:$E6C6:8D 3C 05 STA $053C ; NPC #$00 ? 0x03E6D9|$0F:$E6C9:A9 FF LDA #$FF 0x03E6DB|$0F:$E6CB:8D 3D 05 STA $053D ; NPC #$00 ? 0x03E6DE|$0F:$E6CE:A9 02 LDA #$02 0x03E6E0|$0F:$E6D0:8D 40 05 STA $0540 ; NPC #$00 ? + direction nybble 0x03E6E3|$0F:$E6D3:20 5B D3 JSR $D35B 0x03E6E6|$0F:$E6D6:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03E6E9|$0F:$E6D9:E6 06 INC $06 0x03E6EB|$0F:$E6DB:E6 2C INC $2C ; current map Y-pos pixel, low byte 0x03E6ED|$0F:$E6DD:20 97 D8 JSR $D897 0x03E6F0|$0F:$E6E0:A9 10 LDA #$10 0x03E6F2|$0F:$E6E2:85 19 STA $19 0x03E6F4|$0F:$E6E4:A9 EE LDA #$EE 0x03E6F6|$0F:$E6E6:85 18 STA $18 ; control flow target (from $E70B) 0x03E6F8|$0F:$E6E8:A9 03 LDA #$03 0x03E6FA|$0F:$E6EA:85 2E STA $2E 0x03E6FC|$0F:$E6EC:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $E6FE) 0x03E6FF|$0F:$E6EF:A9 0C LDA #$0C 0x03E701|$0F:$E6F1:85 1C STA $1C 0x03E703|$0F:$E6F3:85 1E STA $1E 0x03E705|$0F:$E6F5:20 C5 DE JSR $DEC5 0x03E708|$0F:$E6F8:E6 18 INC $18 0x03E70A|$0F:$E6FA:E6 18 INC $18 0x03E70C|$0F:$E6FC:C6 2E DEC $2E 0x03E70E|$0F:$E6FE:D0 EF BNE $E6EF 0x03E710|$0F:$E700:E6 06 INC $06 0x03E712|$0F:$E702:E6 2C INC $2C ; current map Y-pos pixel, low byte 0x03E714|$0F:$E704:20 97 D8 JSR $D897 0x03E717|$0F:$E707:A5 18 LDA $18 0x03E719|$0F:$E709:C9 12 CMP #$12 0x03E71B|$0F:$E70B:D0 DB BNE $E6E8 0x03E71D|$0F:$E70D:A9 10 LDA #$10 0x03E71F|$0F:$E70F:85 19 STA $19 0x03E721|$0F:$E711:A9 EC LDA #$EC 0x03E723|$0F:$E713:85 18 STA $18 ; control flow target (from $E735) 0x03E725|$0F:$E715:A9 05 LDA #$05 0x03E727|$0F:$E717:85 2E STA $2E 0x03E729|$0F:$E719:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $E728) 0x03E72C|$0F:$E71C:20 9A DE JSR $DE9A 0x03E72F|$0F:$E71F:A5 18 LDA $18 0x03E731|$0F:$E721:18 CLC 0x03E732|$0F:$E722:69 04 ADC #$04 0x03E734|$0F:$E724:85 18 STA $18 0x03E736|$0F:$E726:C6 2E DEC $2E 0x03E738|$0F:$E728:D0 F2 BNE $E71C 0x03E73A|$0F:$E72A:E6 06 INC $06 0x03E73C|$0F:$E72C:E6 2C INC $2C ; current map Y-pos pixel, low byte 0x03E73E|$0F:$E72E:20 97 D8 JSR $D897 0x03E741|$0F:$E731:A5 18 LDA $18 0x03E743|$0F:$E733:C9 14 CMP #$14 0x03E745|$0F:$E735:D0 DE BNE $E715 0x03E747|$0F:$E737:A9 10 LDA #$10 0x03E749|$0F:$E739:85 19 STA $19 0x03E74B|$0F:$E73B:A9 EE LDA #$EE 0x03E74D|$0F:$E73D:85 18 STA $18 ; control flow target (from $E762) 0x03E74F|$0F:$E73F:A9 03 LDA #$03 0x03E751|$0F:$E741:85 2E STA $2E 0x03E753|$0F:$E743:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $E755) 0x03E756|$0F:$E746:A9 03 LDA #$03 0x03E758|$0F:$E748:85 1C STA $1C 0x03E75A|$0F:$E74A:85 1E STA $1E 0x03E75C|$0F:$E74C:20 C5 DE JSR $DEC5 0x03E75F|$0F:$E74F:E6 18 INC $18 0x03E761|$0F:$E751:E6 18 INC $18 0x03E763|$0F:$E753:C6 2E DEC $2E 0x03E765|$0F:$E755:D0 EF BNE $E746 0x03E767|$0F:$E757:E6 06 INC $06 0x03E769|$0F:$E759:E6 2C INC $2C ; current map Y-pos pixel, low byte 0x03E76B|$0F:$E75B:20 97 D8 JSR $D897 0x03E76E|$0F:$E75E:A5 18 LDA $18 0x03E770|$0F:$E760:C9 12 CMP #$12 0x03E772|$0F:$E762:D0 DB BNE $E73F 0x03E774|$0F:$E764:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03E777|$0F:$E767:E6 06 INC $06 0x03E779|$0F:$E769:A5 06 LDA $06 0x03E77B|$0F:$E76B:C9 F0 CMP #$F0 0x03E77D|$0F:$E76D:D0 04 BNE $E773 0x03E77F|$0F:$E76F:A9 00 LDA #$00 0x03E781|$0F:$E771:85 06 STA $06 ; control flow target (from $E76D) 0x03E783|$0F:$E773:E6 15 INC $15 0x03E785|$0F:$E775:A5 15 LDA $15 0x03E787|$0F:$E777:C9 0F CMP #$0F 0x03E789|$0F:$E779:D0 04 BNE $E77F 0x03E78B|$0F:$E77B:A9 00 LDA #$00 0x03E78D|$0F:$E77D:85 15 STA $15 ; control flow target (from $E779) 0x03E78F|$0F:$E77F:E6 17 INC $17 ; current map Y-pos (1) 0x03E791|$0F:$E781:E6 2C INC $2C ; current map Y-pos pixel, low byte 0x03E793|$0F:$E783:D0 0C BNE $E791 0x03E795|$0F:$E785:E6 2D INC $2D ; current map Y-pos pixel, high byte 0x03E797|$0F:$E787:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E799|$0F:$E789:D0 06 BNE $E791 0x03E79B|$0F:$E78B:A5 2D LDA $2D ; current map Y-pos pixel, high byte 0x03E79D|$0F:$E78D:29 0F AND #$0F 0x03E79F|$0F:$E78F:85 2D STA $2D ; current map Y-pos pixel, high byte ; control flow target (from $E783, $E789) 0x03E7A1|$0F:$E791:20 97 D8 JSR $D897 0x03E7A4|$0F:$E794:4C 7A E8 JMP $E87A ; control flow target (from $C71F, $FF78) 0x03E7A7|$0F:$E797:20 AE E5 JSR $E5AE 0x03E7AA|$0F:$E79A:A5 03 LDA $03 ; game clock? 0x03E7AC|$0F:$E79C:29 0F AND #$0F 0x03E7AE|$0F:$E79E:F0 05 BEQ $E7A5 0x03E7B0|$0F:$E7A0:68 PLA 0x03E7B1|$0F:$E7A1:68 PLA 0x03E7B2|$0F:$E7A2:4C 47 C7 JMP $C747 ; control flow target (from $E79E) 0x03E7B5|$0F:$E7A5:C6 29 DEC $29 ; current map Y-pos (2) 0x03E7B7|$0F:$E7A7:A9 00 LDA #$00 0x03E7B9|$0F:$E7A9:8D 3C 05 STA $053C ; NPC #$00 ? 0x03E7BC|$0F:$E7AC:8D 40 05 STA $0540 ; NPC #$00 ? + direction nybble 0x03E7BF|$0F:$E7AF:A9 01 LDA #$01 0x03E7C1|$0F:$E7B1:8D 3D 05 STA $053D ; NPC #$00 ? 0x03E7C4|$0F:$E7B4:20 5B D3 JSR $D35B 0x03E7C7|$0F:$E7B7:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03E7CA|$0F:$E7BA:C6 06 DEC $06 0x03E7CC|$0F:$E7BC:A5 06 LDA $06 0x03E7CE|$0F:$E7BE:C9 FF CMP #$FF 0x03E7D0|$0F:$E7C0:D0 04 BNE $E7C6 0x03E7D2|$0F:$E7C2:A9 EF LDA #$EF 0x03E7D4|$0F:$E7C4:85 06 STA $06 ; control flow target (from $E7C0) 0x03E7D6|$0F:$E7C6:A5 2C LDA $2C ; current map Y-pos pixel, low byte 0x03E7D8|$0F:$E7C8:38 SEC 0x03E7D9|$0F:$E7C9:E9 01 SBC #$01 0x03E7DB|$0F:$E7CB:85 2C STA $2C ; current map Y-pos pixel, low byte 0x03E7DD|$0F:$E7CD:B0 0C BCS $E7DB 0x03E7DF|$0F:$E7CF:C6 2D DEC $2D ; current map Y-pos pixel, high byte 0x03E7E1|$0F:$E7D1:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E7E3|$0F:$E7D3:D0 06 BNE $E7DB 0x03E7E5|$0F:$E7D5:A5 2D LDA $2D ; current map Y-pos pixel, high byte 0x03E7E7|$0F:$E7D7:29 0F AND #$0F 0x03E7E9|$0F:$E7D9:85 2D STA $2D ; current map Y-pos pixel, high byte ; control flow target (from $E7CD, $E7D3) 0x03E7EB|$0F:$E7DB:20 97 D8 JSR $D897 0x03E7EE|$0F:$E7DE:A9 F0 LDA #$F0 0x03E7F0|$0F:$E7E0:85 19 STA $19 0x03E7F2|$0F:$E7E2:A9 EE LDA #$EE 0x03E7F4|$0F:$E7E4:85 18 STA $18 ; control flow target (from $E809) 0x03E7F6|$0F:$E7E6:A9 03 LDA #$03 0x03E7F8|$0F:$E7E8:85 2E STA $2E 0x03E7FA|$0F:$E7EA:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $E7FC) 0x03E7FD|$0F:$E7ED:A9 03 LDA #$03 0x03E7FF|$0F:$E7EF:85 1C STA $1C 0x03E801|$0F:$E7F1:85 1E STA $1E 0x03E803|$0F:$E7F3:20 C5 DE JSR $DEC5 0x03E806|$0F:$E7F6:E6 18 INC $18 0x03E808|$0F:$E7F8:E6 18 INC $18 0x03E80A|$0F:$E7FA:C6 2E DEC $2E 0x03E80C|$0F:$E7FC:D0 EF BNE $E7ED 0x03E80E|$0F:$E7FE:C6 06 DEC $06 0x03E810|$0F:$E800:C6 2C DEC $2C ; current map Y-pos pixel, low byte 0x03E812|$0F:$E802:20 97 D8 JSR $D897 0x03E815|$0F:$E805:A5 18 LDA $18 0x03E817|$0F:$E807:C9 12 CMP #$12 0x03E819|$0F:$E809:D0 DB BNE $E7E6 0x03E81B|$0F:$E80B:A9 F0 LDA #$F0 0x03E81D|$0F:$E80D:85 19 STA $19 0x03E81F|$0F:$E80F:A9 EC LDA #$EC 0x03E821|$0F:$E811:85 18 STA $18 ; control flow target (from $E833) 0x03E823|$0F:$E813:A9 05 LDA #$05 0x03E825|$0F:$E815:85 2E STA $2E 0x03E827|$0F:$E817:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $E826) 0x03E82A|$0F:$E81A:20 9A DE JSR $DE9A 0x03E82D|$0F:$E81D:A5 18 LDA $18 0x03E82F|$0F:$E81F:18 CLC 0x03E830|$0F:$E820:69 04 ADC #$04 0x03E832|$0F:$E822:85 18 STA $18 0x03E834|$0F:$E824:C6 2E DEC $2E 0x03E836|$0F:$E826:D0 F2 BNE $E81A 0x03E838|$0F:$E828:C6 06 DEC $06 0x03E83A|$0F:$E82A:C6 2C DEC $2C ; current map Y-pos pixel, low byte 0x03E83C|$0F:$E82C:20 97 D8 JSR $D897 0x03E83F|$0F:$E82F:A5 18 LDA $18 0x03E841|$0F:$E831:C9 14 CMP #$14 0x03E843|$0F:$E833:D0 DE BNE $E813 0x03E845|$0F:$E835:A9 F0 LDA #$F0 0x03E847|$0F:$E837:85 19 STA $19 0x03E849|$0F:$E839:A9 EE LDA #$EE 0x03E84B|$0F:$E83B:85 18 STA $18 ; control flow target (from $E860) 0x03E84D|$0F:$E83D:A9 03 LDA #$03 0x03E84F|$0F:$E83F:85 2E STA $2E 0x03E851|$0F:$E841:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $E853) 0x03E854|$0F:$E844:A9 0C LDA #$0C 0x03E856|$0F:$E846:85 1C STA $1C 0x03E858|$0F:$E848:85 1E STA $1E 0x03E85A|$0F:$E84A:20 C5 DE JSR $DEC5 0x03E85D|$0F:$E84D:E6 18 INC $18 0x03E85F|$0F:$E84F:E6 18 INC $18 0x03E861|$0F:$E851:C6 2E DEC $2E 0x03E863|$0F:$E853:D0 EF BNE $E844 0x03E865|$0F:$E855:C6 06 DEC $06 0x03E867|$0F:$E857:C6 2C DEC $2C ; current map Y-pos pixel, low byte 0x03E869|$0F:$E859:20 97 D8 JSR $D897 0x03E86C|$0F:$E85C:A5 18 LDA $18 0x03E86E|$0F:$E85E:C9 12 CMP #$12 0x03E870|$0F:$E860:D0 DB BNE $E83D 0x03E872|$0F:$E862:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03E875|$0F:$E865:C6 06 DEC $06 0x03E877|$0F:$E867:C6 15 DEC $15 0x03E879|$0F:$E869:A5 15 LDA $15 0x03E87B|$0F:$E86B:C9 FF CMP #$FF 0x03E87D|$0F:$E86D:D0 04 BNE $E873 0x03E87F|$0F:$E86F:A9 0E LDA #$0E 0x03E881|$0F:$E871:85 15 STA $15 ; control flow target (from $E86D) 0x03E883|$0F:$E873:C6 17 DEC $17 ; current map Y-pos (1) 0x03E885|$0F:$E875:C6 2C DEC $2C ; current map Y-pos pixel, low byte 0x03E887|$0F:$E877:20 97 D8 JSR $D897 ; control flow target (from $E633, $E6B1, $E794) 0x03E88A|$0F:$E87A:A5 16 LDA $16 ; current map X-pos (1) 0x03E88C|$0F:$E87C:85 12 STA $12 0x03E88E|$0F:$E87E:A5 17 LDA $17 ; current map Y-pos (1) 0x03E890|$0F:$E880:85 13 STA $13 0x03E892|$0F:$E882:20 18 E2 JSR $E218 0x03E895|$0F:$E885:A5 0D LDA $0D 0x03E897|$0F:$E887:C5 1D CMP $1D 0x03E899|$0F:$E889:D0 17 BNE $E8A2 0x03E89B|$0F:$E88B:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E89D|$0F:$E88D:C9 02 CMP #$02 0x03E89F|$0F:$E88F:D0 10 BNE $E8A1 0x03E8A1|$0F:$E891:A5 16 LDA $16 ; current map X-pos (1) 0x03E8A3|$0F:$E893:4A LSR 0x03E8A4|$0F:$E894:18 CLC 0x03E8A5|$0F:$E895:E5 21 SBC $21 ; map width 0x03E8A7|$0F:$E897:B0 10 BCS $E8A9 0x03E8A9|$0F:$E899:A5 17 LDA $17 ; current map Y-pos (1) 0x03E8AB|$0F:$E89B:4A LSR 0x03E8AC|$0F:$E89C:18 CLC 0x03E8AD|$0F:$E89D:E5 22 SBC $22 ; map height 0x03E8AF|$0F:$E89F:B0 08 BCS $E8A9 ; control flow target (from $E88F) 0x03E8B1|$0F:$E8A1:60 RTS ; control flow target (from $E889) 0x03E8B2|$0F:$E8A2:85 1D STA $1D 0x03E8B4|$0F:$E8A4:A9 FF LDA #$FF 0x03E8B6|$0F:$E8A6:8D FD 05 STA $05FD ; control flow target (from $E897, $E89F) 0x03E8B9|$0F:$E8A9:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E8BB|$0F:$E8AB:C9 02 CMP #$02 0x03E8BD|$0F:$E8AD:F0 03 BEQ $E8B2 0x03E8BF|$0F:$E8AF:4C 34 E9 JMP $E934 ; control flow target (from $E8AD) 0x03E8C2|$0F:$E8B2:20 61 F7 JSR $F761 ; load ROM bank #$06 0x03E8C5|$0F:$E8B5:A5 31 LDA $31 ; current map ID 0x03E8C7|$0F:$E8B7:38 SEC 0x03E8C8|$0F:$E8B8:E9 2B SBC #$2B ; only maps between #$2B and #$47 inclusive are checked for irregularities 0x03E8CA|$0F:$E8BA:0A ASL 0x03E8CB|$0F:$E8BB:A8 TAY 0x03E8CC|$0F:$E8BC:B9 E1 A3 LDA $A3E1,Y ; pointers to warp spaces for irregularly-shaped maps 0x03E8CF|$0F:$E8BF:85 10 STA $10 0x03E8D1|$0F:$E8C1:B9 E2 A3 LDA $A3E2,Y 0x03E8D4|$0F:$E8C4:85 11 STA $11 0x03E8D6|$0F:$E8C6:05 10 ORA $10 0x03E8D8|$0F:$E8C8:F0 6A BEQ $E934 ; no irregularity => skip over handling irregularities 0x03E8DA|$0F:$E8CA:A5 16 LDA $16 ; current map X-pos (1) 0x03E8DC|$0F:$E8CC:29 FE AND #$FE ; maps are designed with 2-tile wide transitions between visible segments, so ignore the low bit of map position to cover a 2-tile-wide space 0x03E8DE|$0F:$E8CE:85 0C STA $0C ; current X-pos, 2-tile granularity 0x03E8E0|$0F:$E8D0:A5 17 LDA $17 ; current map Y-pos (1) 0x03E8E2|$0F:$E8D2:29 FE AND #$FE ; maps are designed with 2-tile high transitions between visible segments, so ignore the low bit of map position to cover a 2-tile-high space 0x03E8E4|$0F:$E8D4:85 0E STA $0E ; current Y-pos, 2-tile granularity 0x03E8E6|$0F:$E8D6:A0 FF LDY #$FF ; initialize index to -1 so that when we INY we'll be at #$00 ; control flow target (from $E8E7, $E8ED) 0x03E8E8|$0F:$E8D8:C8 INY ; offset for destination map ID 0x03E8E9|$0F:$E8D9:B1 10 LDA ($10),Y ; destination map ID 0x03E8EB|$0F:$E8DB:C9 FF CMP #$FF ; #$FF => end of list 0x03E8ED|$0F:$E8DD:F0 55 BEQ $E934 0x03E8EF|$0F:$E8DF:C8 INY ; offset for destination X-pos 0x03E8F0|$0F:$E8E0:C8 INY ; offset for destination Y-pos 0x03E8F1|$0F:$E8E1:C8 INY ; offset for transition X-pos 0x03E8F2|$0F:$E8E2:B1 10 LDA ($10),Y ; transition X-pos 0x03E8F4|$0F:$E8E4:C8 INY 0x03E8F5|$0F:$E8E5:C5 0C CMP $0C ; current X-pos, 2-tile granularity 0x03E8F7|$0F:$E8E7:D0 EF BNE $E8D8 ; not the right X-pos space => loop to next irregularity 0x03E8F9|$0F:$E8E9:B1 10 LDA ($10),Y ; transition Y-pos 0x03E8FB|$0F:$E8EB:C5 0E CMP $0E ; current Y-pos, 2-tile granularity 0x03E8FD|$0F:$E8ED:D0 E9 BNE $E8D8 ; not the right X-pos space => loop to next irregularity 0x03E8FF|$0F:$E8EF:88 DEY ; offset for transition X-pos 0x03E900|$0F:$E8F0:88 DEY ; offset for destination Y-pos 0x03E901|$0F:$E8F1:A5 17 LDA $17 ; current map Y-pos (1) 0x03E903|$0F:$E8F3:29 01 AND #$01 ; pick out difference between real position and 2-tile granularity 0x03E905|$0F:$E8F5:11 10 ORA ($10),Y ; set low bit of destination Y-pos 0x03E907|$0F:$E8F7:85 17 STA $17 ; current map Y-pos (1) 0x03E909|$0F:$E8F9:85 29 STA $29 ; current map Y-pos (2) 0x03E90B|$0F:$E8FB:85 13 STA $13 0x03E90D|$0F:$E8FD:85 2C STA $2C ; current map Y-pos pixel, low byte 0x03E90F|$0F:$E8FF:88 DEY ; offset for destination X-pos 0x03E910|$0F:$E900:A5 16 LDA $16 ; current map X-pos (1) 0x03E912|$0F:$E902:29 01 AND #$01 ; pick out difference between real position and 2-tile granularity 0x03E914|$0F:$E904:11 10 ORA ($10),Y ; set low bit of destination X-pos 0x03E916|$0F:$E906:85 16 STA $16 ; current map X-pos (1) 0x03E918|$0F:$E908:85 28 STA $28 ; current map X-pos (2) 0x03E91A|$0F:$E90A:85 12 STA $12 0x03E91C|$0F:$E90C:85 2A STA $2A ; current map X-pos pixel, low byte 0x03E91E|$0F:$E90E:88 DEY ; offset for destination map ID 0x03E91F|$0F:$E90F:B1 10 LDA ($10),Y 0x03E921|$0F:$E911:85 31 STA $31 ; current map ID 0x03E923|$0F:$E913:A9 00 LDA #$00 0x03E925|$0F:$E915:85 2B STA $2B ; current map X-pos pixel, high byte 0x03E927|$0F:$E917:85 2D STA $2D ; current map Y-pos pixel, high byte 0x03E929|$0F:$E919:A2 04 LDX #$04 ; shift 16x16 map position into pixel position variables ; control flow target (from $E924) 0x03E92B|$0F:$E91B:06 2A ASL $2A ; current map X-pos pixel, low byte 0x03E92D|$0F:$E91D:26 2B ROL $2B ; current map X-pos pixel, high byte 0x03E92F|$0F:$E91F:06 2C ASL $2C ; current map Y-pos pixel, low byte 0x03E931|$0F:$E921:26 2D ROL $2D ; current map Y-pos pixel, high byte 0x03E933|$0F:$E923:CA DEX 0x03E934|$0F:$E924:D0 F5 BNE $E91B 0x03E936|$0F:$E926:A9 FF LDA #$FF 0x03E938|$0F:$E928:85 45 STA $45 0x03E93A|$0F:$E92A:20 61 E4 JSR $E461 0x03E93D|$0F:$E92D:20 18 E2 JSR $E218 0x03E940|$0F:$E930:A5 0D LDA $0D 0x03E942|$0F:$E932:85 1D STA $1D ; control flow target (from $E8AF, $E8C8, $E8DD) 0x03E944|$0F:$E934:A9 FF LDA #$FF 0x03E946|$0F:$E936:85 41 STA $41 ; control flow target (from $D229, $D24D) ; external control flow target (from $06:$97D2) 0x03E948|$0F:$E938:A9 00 LDA #$00 0x03E94A|$0F:$E93A:85 18 STA $18 0x03E94C|$0F:$E93C:85 19 STA $19 0x03E94E|$0F:$E93E:85 42 STA $42 0x03E950|$0F:$E940:A9 FE LDA #$FE 0x03E952|$0F:$E942:85 3D STA $3D 0x03E954|$0F:$E944:85 3F STA $3F 0x03E956|$0F:$E946:85 3E STA $3E 0x03E958|$0F:$E948:85 40 STA $40 0x03E95A|$0F:$E94A:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03E95D|$0F:$E94D:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E95F|$0F:$E94F:0A ASL 0x03E960|$0F:$E950:A8 TAY 0x03E961|$0F:$E951:B9 BD DE LDA $DEBD,Y 0x03E964|$0F:$E954:85 6F STA $6F 0x03E966|$0F:$E956:C8 INY 0x03E967|$0F:$E957:B9 BD DE LDA $DEBD,Y 0x03E96A|$0F:$E95A:85 70 STA $70 0x03E96C|$0F:$E95C:A0 00 LDY #$00 ; control flow target (from $E964) 0x03E96E|$0F:$E95E:B1 6F LDA ($6F),Y 0x03E970|$0F:$E960:99 00 6E STA $6E00,Y 0x03E973|$0F:$E963:88 DEY 0x03E974|$0F:$E964:D0 F8 BNE $E95E 0x03E976|$0F:$E966:20 6D EB JSR $EB6D 0x03E979|$0F:$E969:20 FC E9 JSR $E9FC 0x03E97C|$0F:$E96C:A5 41 LDA $41 0x03E97E|$0F:$E96E:C9 32 CMP #$32 0x03E980|$0F:$E970:F0 48 BEQ $E9BA 0x03E982|$0F:$E972:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03E985|$0F:$E975:A9 FF LDA #$FF 0x03E987|$0F:$E977:85 35 STA $35 ; flag indicating whether any menu is currently open 0x03E989|$0F:$E979:20 CB D8 JSR $D8CB 0x03E98C|$0F:$E97C:A9 00 LDA #$00 0x03E98E|$0F:$E97E:85 35 STA $35 ; flag indicating whether any menu is currently open 0x03E990|$0F:$E980:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03E993|$0F:$E983:A9 F2 LDA #$F2 0x03E995|$0F:$E985:85 19 STA $19 0x03E997|$0F:$E987:A9 F0 LDA #$F0 0x03E999|$0F:$E989:85 18 STA $18 0x03E99B|$0F:$E98B:A9 02 LDA #$02 0x03E99D|$0F:$E98D:85 3D STA $3D 0x03E99F|$0F:$E98F:85 3E STA $3E 0x03E9A1|$0F:$E991:A9 0E LDA #$0E 0x03E9A3|$0F:$E993:85 3F STA $3F 0x03E9A5|$0F:$E995:85 40 STA $40 0x03E9A7|$0F:$E997:A9 00 LDA #$00 0x03E9A9|$0F:$E999:85 41 STA $41 0x03E9AB|$0F:$E99B:A2 FF LDX #$FF 0x03E9AD|$0F:$E99D:8E 45 61 STX $6145 0x03E9B0|$0F:$E9A0:20 38 EA JSR $EA38 0x03E9B3|$0F:$E9A3:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E9B5|$0F:$E9A5:C9 03 CMP #$03 0x03E9B7|$0F:$E9A7:F0 0A BEQ $E9B3 0x03E9B9|$0F:$E9A9:A5 1D LDA $1D 0x03E9BB|$0F:$E9AB:D0 0D BNE $E9BA 0x03E9BD|$0F:$E9AD:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03E9BF|$0F:$E9AF:C9 02 CMP #$02 0x03E9C1|$0F:$E9B1:F0 07 BEQ $E9BA ; control flow target (from $E9A7) 0x03E9C3|$0F:$E9B3:A9 01 LDA #$01 0x03E9C5|$0F:$E9B5:85 45 STA $45 0x03E9C7|$0F:$E9B7:20 F7 D2 JSR $D2F7 ; control flow target (from $E970, $E9AB, $E9B1) 0x03E9CA|$0F:$E9BA:A9 EE LDA #$EE 0x03E9CC|$0F:$E9BC:85 18 STA $18 ; control flow target (from $E9F7) 0x03E9CE|$0F:$E9BE:20 6D EB JSR $EB6D 0x03E9D1|$0F:$E9C1:A9 F2 LDA #$F2 0x03E9D3|$0F:$E9C3:85 19 STA $19 ; control flow target (from $E9D6) 0x03E9D5|$0F:$E9C5:A9 00 LDA #$00 0x03E9D7|$0F:$E9C7:85 1C STA $1C 0x03E9D9|$0F:$E9C9:85 1E STA $1E 0x03E9DB|$0F:$E9CB:20 9F EA JSR $EA9F 0x03E9DE|$0F:$E9CE:E6 19 INC $19 0x03E9E0|$0F:$E9D0:E6 19 INC $19 0x03E9E2|$0F:$E9D2:A5 19 LDA $19 0x03E9E4|$0F:$E9D4:C9 02 CMP #$02 0x03E9E6|$0F:$E9D6:D0 ED BNE $E9C5 0x03E9E8|$0F:$E9D8:20 6D EB JSR $EB6D ; control flow target (from $E9EC) 0x03E9EB|$0F:$E9DB:A9 00 LDA #$00 0x03E9ED|$0F:$E9DD:85 1C STA $1C 0x03E9EF|$0F:$E9DF:85 1E STA $1E 0x03E9F1|$0F:$E9E1:20 9F EA JSR $EA9F 0x03E9F4|$0F:$E9E4:E6 19 INC $19 0x03E9F6|$0F:$E9E6:E6 19 INC $19 0x03E9F8|$0F:$E9E8:A5 19 LDA $19 0x03E9FA|$0F:$E9EA:C9 10 CMP #$10 0x03E9FC|$0F:$E9EC:D0 ED BNE $E9DB 0x03E9FE|$0F:$E9EE:A5 18 LDA $18 0x03EA00|$0F:$E9F0:18 CLC 0x03EA01|$0F:$E9F1:69 22 ADC #$22 0x03EA03|$0F:$E9F3:85 18 STA $18 0x03EA05|$0F:$E9F5:C9 32 CMP #$32 0x03EA07|$0F:$E9F7:D0 C5 BNE $E9BE 0x03EA09|$0F:$E9F9:4C DC C1 JMP $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $E969, $EA08, $EA6D, $EA73) 0x03EA0C|$0F:$E9FC:20 76 EA JSR $EA76 0x03EA0F|$0F:$E9FF:A5 18 LDA $18 0x03EA11|$0F:$EA01:18 CLC 0x03EA12|$0F:$EA02:65 3D ADC $3D 0x03EA14|$0F:$EA04:85 18 STA $18 0x03EA16|$0F:$EA06:C5 3F CMP $3F 0x03EA18|$0F:$EA08:D0 F2 BNE $E9FC 0x03EA1A|$0F:$EA0A:A5 3D LDA $3D 0x03EA1C|$0F:$EA0C:49 FF EOR #$FF 0x03EA1E|$0F:$EA0E:85 3D STA $3D 0x03EA20|$0F:$EA10:E6 3D INC $3D 0x03EA22|$0F:$EA12:A5 3F LDA $3F 0x03EA24|$0F:$EA14:49 FF EOR #$FF 0x03EA26|$0F:$EA16:85 3F STA $3F 0x03EA28|$0F:$EA18:E6 3F INC $3F 0x03EA2A|$0F:$EA1A:10 0B BPL $EA27 0x03EA2C|$0F:$EA1C:A5 41 LDA $41 0x03EA2E|$0F:$EA1E:F0 0F BEQ $EA2F 0x03EA30|$0F:$EA20:C6 3F DEC $3F 0x03EA32|$0F:$EA22:C6 3F DEC $3F 0x03EA34|$0F:$EA24:4C 2F EA JMP $EA2F ; control flow target (from $EA1A) 0x03EA37|$0F:$EA27:A5 41 LDA $41 0x03EA39|$0F:$EA29:D0 04 BNE $EA2F 0x03EA3B|$0F:$EA2B:C6 3F DEC $3F 0x03EA3D|$0F:$EA2D:C6 3F DEC $3F ; control flow target (from $EA1E, $EA24, $EA29) 0x03EA3F|$0F:$EA2F:A5 41 LDA $41 0x03EA41|$0F:$EA31:D0 05 BNE $EA38 0x03EA43|$0F:$EA33:A5 19 LDA $19 0x03EA45|$0F:$EA35:D0 01 BNE $EA38 0x03EA47|$0F:$EA37:60 RTS ; control flow target (from $E9A0, $EA31, $EA35, $EA44) 0x03EA48|$0F:$EA38:20 76 EA JSR $EA76 0x03EA4B|$0F:$EA3B:A5 19 LDA $19 0x03EA4D|$0F:$EA3D:18 CLC 0x03EA4E|$0F:$EA3E:65 3E ADC $3E 0x03EA50|$0F:$EA40:85 19 STA $19 0x03EA52|$0F:$EA42:C5 40 CMP $40 0x03EA54|$0F:$EA44:D0 F2 BNE $EA38 0x03EA56|$0F:$EA46:A5 3E LDA $3E 0x03EA58|$0F:$EA48:49 FF EOR #$FF 0x03EA5A|$0F:$EA4A:85 3E STA $3E 0x03EA5C|$0F:$EA4C:E6 3E INC $3E 0x03EA5E|$0F:$EA4E:A5 40 LDA $40 0x03EA60|$0F:$EA50:49 FF EOR #$FF 0x03EA62|$0F:$EA52:85 40 STA $40 0x03EA64|$0F:$EA54:E6 40 INC $40 0x03EA66|$0F:$EA56:10 0B BPL $EA63 0x03EA68|$0F:$EA58:A5 41 LDA $41 0x03EA6A|$0F:$EA5A:F0 0F BEQ $EA6B 0x03EA6C|$0F:$EA5C:C6 40 DEC $40 0x03EA6E|$0F:$EA5E:C6 40 DEC $40 0x03EA70|$0F:$EA60:4C 6B EA JMP $EA6B ; control flow target (from $EA56) 0x03EA73|$0F:$EA63:A5 41 LDA $41 0x03EA75|$0F:$EA65:D0 04 BNE $EA6B 0x03EA77|$0F:$EA67:C6 40 DEC $40 0x03EA79|$0F:$EA69:C6 40 DEC $40 ; control flow target (from $EA5A, $EA60, $EA65) 0x03EA7B|$0F:$EA6B:A5 41 LDA $41 0x03EA7D|$0F:$EA6D:F0 8D BEQ $E9FC 0x03EA7F|$0F:$EA6F:A5 40 LDA $40 0x03EA81|$0F:$EA71:C9 10 CMP #$10 0x03EA83|$0F:$EA73:D0 87 BNE $E9FC 0x03EA85|$0F:$EA75:60 RTS ; control flow target (from $E9FC, $EA38) 0x03EA86|$0F:$EA76:A9 00 LDA #$00 0x03EA88|$0F:$EA78:85 1E STA $1E 0x03EA8A|$0F:$EA7A:A5 41 LDA $41 0x03EA8C|$0F:$EA7C:F0 04 BEQ $EA82 0x03EA8E|$0F:$EA7E:A9 FF LDA #$FF 0x03EA90|$0F:$EA80:D0 02 BNE $EA84 ; control flow target (from $EA7C) 0x03EA92|$0F:$EA82:A9 FE LDA #$FE ; control flow target (from $EA80) 0x03EA94|$0F:$EA84:85 1C STA $1C 0x03EA96|$0F:$EA86:20 9F EA JSR $EA9F 0x03EA99|$0F:$EA89:E6 42 INC $42 0x03EA9B|$0F:$EA8B:A5 42 LDA $42 0x03EA9D|$0F:$EA8D:C9 1E CMP #$1E 0x03EA9F|$0F:$EA8F:F0 06 BEQ $EA97 0x03EAA1|$0F:$EA91:A5 01 LDA $01 0x03EAA3|$0F:$EA93:C9 12 CMP #$12 0x03EAA5|$0F:$EA95:90 07 BCC $EA9E ; control flow target (from $EA8F) 0x03EAA7|$0F:$EA97:20 6D EB JSR $EB6D 0x03EAAA|$0F:$EA9A:A9 00 LDA #$00 0x03EAAC|$0F:$EA9C:85 42 STA $42 ; control flow target (from $EA95) 0x03EAAE|$0F:$EA9E:60 RTS ; control flow target (from $E9CB, $E9E1, $EA86) 0x03EAAF|$0F:$EA9F:20 FC EA JSR $EAFC 0x03EAB2|$0F:$EAA2:90 01 BCC $EAA5 0x03EAB4|$0F:$EAA4:60 RTS ; control flow target (from $EAA2) 0x03EAB5|$0F:$EAA5:A5 0C LDA $0C 0x03EAB7|$0F:$EAA7:0A ASL 0x03EAB8|$0F:$EAA8:0A ASL 0x03EAB9|$0F:$EAA9:65 0C ADC $0C 0x03EABB|$0F:$EAAB:A8 TAY 0x03EABC|$0F:$EAAC:A6 02 LDX $02 0x03EABE|$0F:$EAAE:A5 08 LDA $08 0x03EAC0|$0F:$EAB0:9D 00 03 STA $0300,X ; PPU write buffer start 0x03EAC3|$0F:$EAB3:A5 07 LDA $07 0x03EAC5|$0F:$EAB5:9D 01 03 STA $0301,X 0x03EAC8|$0F:$EAB8:B9 00 6E LDA $6E00,Y 0x03EACB|$0F:$EABB:9D 02 03 STA $0302,X 0x03EACE|$0F:$EABE:B9 01 6E LDA $6E01,Y 0x03EAD1|$0F:$EAC1:9D 03 03 STA $0303,X 0x03EAD4|$0F:$EAC4:B9 02 6E LDA $6E02,Y 0x03EAD7|$0F:$EAC7:9D 04 03 STA $0304,X 0x03EADA|$0F:$EACA:B9 03 6E LDA $6E03,Y 0x03EADD|$0F:$EACD:9D 05 03 STA $0305,X 0x03EAE0|$0F:$EAD0:B9 04 6E LDA $6E04,Y 0x03EAE3|$0F:$EAD3:29 03 AND #$03 0x03EAE5|$0F:$EAD5:85 09 STA $09 0x03EAE7|$0F:$EAD7:A5 1A LDA $1A 0x03EAE9|$0F:$EAD9:85 0C STA $0C 0x03EAEB|$0F:$EADB:A5 1B LDA $1B 0x03EAED|$0F:$EADD:85 0E STA $0E 0x03EAEF|$0F:$EADF:20 6E DE JSR $DE6E 0x03EAF2|$0F:$EAE2:A5 08 LDA $08 0x03EAF4|$0F:$EAE4:09 20 ORA #$20 0x03EAF6|$0F:$EAE6:9D 06 03 STA $0306,X 0x03EAF9|$0F:$EAE9:A5 07 LDA $07 0x03EAFB|$0F:$EAEB:9D 07 03 STA $0307,X 0x03EAFE|$0F:$EAEE:A5 09 LDA $09 0x03EB00|$0F:$EAF0:9D 08 03 STA $0308,X 0x03EB03|$0F:$EAF3:8A TXA 0x03EB04|$0F:$EAF4:18 CLC 0x03EB05|$0F:$EAF5:69 09 ADC #$09 0x03EB07|$0F:$EAF7:85 02 STA $02 0x03EB09|$0F:$EAF9:E6 01 INC $01 0x03EB0B|$0F:$EAFB:60 RTS ; control flow target (from $DEC5, $EA9F) 0x03EB0C|$0F:$EAFC:20 62 DF JSR $DF62 0x03EB0F|$0F:$EAFF:A5 0C LDA $0C 0x03EB11|$0F:$EB01:85 1A STA $1A 0x03EB13|$0F:$EB03:A5 0E LDA $0E 0x03EB15|$0F:$EB05:85 1B STA $1B 0x03EB17|$0F:$EB07:20 00 DE JSR $DE00 0x03EB1A|$0F:$EB0A:A5 18 LDA $18 0x03EB1C|$0F:$EB0C:0A ASL 0x03EB1D|$0F:$EB0D:A5 18 LDA $18 0x03EB1F|$0F:$EB0F:6A ROR 0x03EB20|$0F:$EB10:18 CLC 0x03EB21|$0F:$EB11:65 16 ADC $16 ; current map X-pos (1) 0x03EB23|$0F:$EB13:85 0C STA $0C 0x03EB25|$0F:$EB15:A5 19 LDA $19 0x03EB27|$0F:$EB17:0A ASL 0x03EB28|$0F:$EB18:A5 19 LDA $19 0x03EB2A|$0F:$EB1A:6A ROR 0x03EB2B|$0F:$EB1B:18 CLC 0x03EB2C|$0F:$EB1C:65 17 ADC $17 ; current map Y-pos (1) 0x03EB2E|$0F:$EB1E:85 0E STA $0E 0x03EB30|$0F:$EB20:20 89 DF JSR $DF89 0x03EB33|$0F:$EB23:20 22 E2 JSR $E222 0x03EB36|$0F:$EB26:A5 1D LDA $1D 0x03EB38|$0F:$EB28:C5 0D CMP $0D 0x03EB3A|$0F:$EB2A:F0 22 BEQ $EB4E 0x03EB3C|$0F:$EB2C:A5 0C LDA $0C 0x03EB3E|$0F:$EB2E:C9 28 CMP #$28 0x03EB40|$0F:$EB30:B0 1C BCS $EB4E 0x03EB42|$0F:$EB32:A5 1D LDA $1D 0x03EB44|$0F:$EB34:D0 14 BNE $EB4A 0x03EB46|$0F:$EB36:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03EB48|$0F:$EB38:C9 01 CMP #$01 0x03EB4A|$0F:$EB3A:F0 0A BEQ $EB46 0x03EB4C|$0F:$EB3C:A5 0C LDA $0C 0x03EB4E|$0F:$EB3E:C9 08 CMP #$08 0x03EB50|$0F:$EB40:90 04 BCC $EB46 0x03EB52|$0F:$EB42:C9 0C CMP #$0C 0x03EB54|$0F:$EB44:90 08 BCC $EB4E ; control flow target (from $EB3A, $EB40) 0x03EB56|$0F:$EB46:A9 20 LDA #$20 0x03EB58|$0F:$EB48:D0 02 BNE $EB4C ; control flow target (from $EB34) 0x03EB5A|$0F:$EB4A:A9 24 LDA #$24 ; control flow target (from $EB48) 0x03EB5C|$0F:$EB4C:85 0C STA $0C ; control flow target (from $EB2A, $EB30, $EB44) 0x03EB5E|$0F:$EB4E:A5 1C LDA $1C 0x03EB60|$0F:$EB50:C9 FF CMP #$FF 0x03EB62|$0F:$EB52:D0 07 BNE $EB5B 0x03EB64|$0F:$EB54:A5 0C LDA $0C 0x03EB66|$0F:$EB56:C9 20 CMP #$20 0x03EB68|$0F:$EB58:90 0D BCC $EB67 0x03EB6A|$0F:$EB5A:60 RTS ; control flow target (from $EB52) 0x03EB6B|$0F:$EB5B:C9 FE CMP #$FE 0x03EB6D|$0F:$EB5D:D0 0C BNE $EB6B 0x03EB6F|$0F:$EB5F:A5 0C LDA $0C 0x03EB71|$0F:$EB61:C9 20 CMP #$20 0x03EB73|$0F:$EB63:B0 02 BCS $EB67 0x03EB75|$0F:$EB65:38 SEC 0x03EB76|$0F:$EB66:60 RTS ; control flow target (from $EB58, $EB63) 0x03EB77|$0F:$EB67:A9 00 LDA #$00 0x03EB79|$0F:$EB69:85 1C STA $1C ; control flow target (from $EB5D) 0x03EB7B|$0F:$EB6B:18 CLC 0x03EB7C|$0F:$EB6C:60 RTS ; control flow target (from $E966, $E9BE, $E9D8, $EA97) 0x03EB7D|$0F:$EB6D:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03EB80|$0F:$EB70:A9 FF LDA #$FF 0x03EB82|$0F:$EB72:8D 45 61 STA $6145 0x03EB85|$0F:$EB75:60 RTS ; open menu specified by next byte ; control flow target (from $C750, $C84D, $F6FC) ; external control flow target (from $02:$B29D, $06:$8061, $06:$8065, $06:$8232, $06:$8242, $06:$8374, $06:$83A3, $06:$8455, $06:$84BB, $06:$8540, $06:$855B, $06:$867D, $06:$868D, $06:$8BFC, $06:$8C29, $06:$9584, $06:$95FF, $06:$9ACB, $06:$9AD0, $06:$9B17, $06:$A0CA, $06:$A204, $06:$BB4E, $06:$BB5F, $06:$BBAB, $06:$BBCA, $06:$BC22, $06:$BD4F) 0x03EB86|$0F:$EB76:68 PLA ; low byte of return address 0x03EB87|$0F:$EB77:18 CLC 0x03EB88|$0F:$EB78:69 01 ADC #$01 ; increment it (byte following the JSR is data) 0x03EB8A|$0F:$EB7A:85 0E STA $0E ; store to $0E 0x03EB8C|$0F:$EB7C:68 PLA ; high byte of return address 0x03EB8D|$0F:$EB7D:69 00 ADC #$00 ; add carry from incrementing low byte 0x03EB8F|$0F:$EB7F:85 0F STA $0F ; store to $0F 0x03EB91|$0F:$EB81:48 PHA ; push the new return address's high byte 0x03EB92|$0F:$EB82:A5 0E LDA $0E 0x03EB94|$0F:$EB84:48 PHA ; push the new return address's low byte 0x03EB95|$0F:$EB85:A0 00 LDY #$00 0x03EB97|$0F:$EB87:B1 0E LDA ($0E),Y ; read the byte following the original JSR ; open menu specified by A ; control flow target (from $D188, $F494, $F49B, $F4A2, $F4BE, $F514, $F521, $F526, $F531, $F53F, $F54F, $F565, $F573, $F581, $F58F, $F59D, $F5CF, $F5D8, $F5DC, $F5F0, $F60C, $F620, $F625, $F63F, $F648, $F652, $F657) ; external control flow target (from $04:$9AB1, $04:$9AC4, $06:$A997, $06:$AEAC, $06:$AEB1) 0x03EB99|$0F:$EB89:20 6E F6 JSR $F66E ; do special effects for certain menus; sets A to menu ID 0x03EB9C|$0F:$EB8C:90 03 BCC $EB91 ; all $F66E code paths end with SEC, so this branch is never taken 0x03EB9E|$0F:$EB8E:20 98 EB JSR $EB98 ; control flow target (from $EB8C) 0x03EBA1|$0F:$EB91:48 PHA 0x03EBA2|$0F:$EB92:AD 94 00 LDA $0094 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03EBA5|$0F:$EB95:4C 82 F7 JMP $F782 ; load bank specified by A then PLA ; control flow target (from $EB8E) 0x03EBA8|$0F:$EB98:85 59 STA $59 ; menu ID 0x03EBAA|$0F:$EB9A:A9 01 LDA #$01 0x03EBAC|$0F:$EB9C:8D B4 60 STA $60B4 ; menu phase (1 = first, 0 = second) 0x03EBAF|$0F:$EB9F:20 A8 EB JSR $EBA8 0x03EBB2|$0F:$EBA2:20 35 F4 JSR $F435 0x03EBB5|$0F:$EBA5:CE B4 60 DEC $60B4 ; menu phase (1 = first, 0 = second) ; control flow target (from $EB9F) 0x03EBB8|$0F:$EBA8:20 B2 EB JSR $EBB2 ; given menu ID in $59, set $55-$56 to start of menu data 0x03EBBB|$0F:$EBAB:20 C5 EB JSR $EBC5 ; parse menu setup header 0x03EBBE|$0F:$EBAE:20 11 EC JSR $EC11 0x03EBC1|$0F:$EBB1:60 RTS ; given menu ID in $59, set $55-$56 to start of menu data ; control flow target (from $EBA8) 0x03EBC2|$0F:$EBB2:A9 20 LDA #$20 ; menu pointer table 0x03EBC4|$0F:$EBB4:20 E2 F3 JSR $F3E2 ; parse bank/pointer indices from A, load desired bank, set $57-$58 to desired pointer value 0x03EBC7|$0F:$EBB7:A5 59 LDA $59 ; menu ID 0x03EBC9|$0F:$EBB9:0A ASL ; 2 bytes per pointer 0x03EBCA|$0F:$EBBA:A8 TAY 0x03EBCB|$0F:$EBBB:B1 57 LDA ($57),Y ; pointer to start of main pointer table, low byte; copy menu pointer to $55-$56 0x03EBCD|$0F:$EBBD:85 55 STA $55 ; pointer to start of sub pointer data, low byte 0x03EBCF|$0F:$EBBF:C8 INY 0x03EBD0|$0F:$EBC0:B1 57 LDA ($57),Y ; pointer to start of main pointer table, low byte 0x03EBD2|$0F:$EBC2:85 56 STA $56 ; pointer to start of sub pointer data, high byte 0x03EBD4|$0F:$EBC4:60 RTS ; parse menu setup header ; control flow target (from $EBAB) 0x03EBD5|$0F:$EBC5:A0 00 LDY #$00 ; start at the start 0x03EBD7|$0F:$EBC7:B1 55 LDA ($55),Y ; pointer to start of sub pointer data, low byte 0x03EBD9|$0F:$EBC9:8D AA 60 STA $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) 0x03EBDC|$0F:$EBCC:C8 INY 0x03EBDD|$0F:$EBCD:B1 55 LDA ($55),Y ; pointer to start of sub pointer data, low byte 0x03EBDF|$0F:$EBCF:8D A2 60 STA $60A2 ; menu window height (from ROM) 0x03EBE2|$0F:$EBD2:0A ASL 0x03EBE3|$0F:$EBD3:8D A3 60 STA $60A3 ; menu window height (ROM value * 2) 0x03EBE6|$0F:$EBD6:C8 INY 0x03EBE7|$0F:$EBD7:B1 55 LDA ($55),Y ; pointer to start of sub pointer data, low byte 0x03EBE9|$0F:$EBD9:8D A1 60 STA $60A1 ; menu window width 0x03EBEC|$0F:$EBDC:C8 INY 0x03EBED|$0F:$EBDD:B1 55 LDA ($55),Y ; pointer to start of sub pointer data, low byte 0x03EBEF|$0F:$EBDF:8D A4 60 STA $60A4 ; menu window position (from ROM; X-pos = low nybble * 2, Y-pos = high nybble * 2) 0x03EBF2|$0F:$EBE2:48 PHA 0x03EBF3|$0F:$EBE3:29 0F AND #$0F 0x03EBF5|$0F:$EBE5:0A ASL 0x03EBF6|$0F:$EBE6:85 4D STA $4D ; menu window X-pos 0x03EBF8|$0F:$EBE8:68 PLA 0x03EBF9|$0F:$EBE9:29 F0 AND #$F0 0x03EBFB|$0F:$EBEB:4A LSR 0x03EBFC|$0F:$EBEC:4A LSR 0x03EBFD|$0F:$EBED:4A LSR 0x03EBFE|$0F:$EBEE:85 4E STA $4E ; menu window Y-pos 0x03EC00|$0F:$EBF0:C8 INY 0x03EC01|$0F:$EBF1:AD AA 60 LDA $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) 0x03EC04|$0F:$EBF4:10 0C BPL $EC02 ; if no cursor, skip ahead 0x03EC06|$0F:$EBF6:B1 55 LDA ($55),Y ; pointer to start of sub pointer data, low byte 0x03EC08|$0F:$EBF8:8D A5 60 STA $60A5 ; menu cursor second column X-offset (from left edge of menu) 0x03EC0B|$0F:$EBFB:C8 INY 0x03EC0C|$0F:$EBFC:B1 55 LDA ($55),Y ; pointer to start of sub pointer data, low byte 0x03EC0E|$0F:$EBFE:8D A9 60 STA $60A9 ; menu cursor initial position (from ROM; X-pos = low nybble, Y-pos = high nybble) 0x03EC11|$0F:$EC01:C8 INY ; control flow target (from $EBF4) 0x03EC12|$0F:$EC02:2C AA 60 BIT $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) 0x03EC15|$0F:$EC05:50 06 BVC $EC0D ; if menu is not linked, skip ahead 0x03EC17|$0F:$EC07:B1 55 LDA ($55),Y ; pointer to start of sub pointer data, low byte 0x03EC19|$0F:$EC09:8D AE 60 STA $60AE ; menu link ID 0x03EC1C|$0F:$EC0C:C8 INY ; control flow target (from $EC05) 0x03EC1D|$0F:$EC0D:8C A6 60 STY $60A6 ; current menu read index 0x03EC20|$0F:$EC10:60 RTS ; control flow target (from $EBAE) 0x03EC21|$0F:$EC11:20 29 EC JSR $EC29 ; initialize menu vars, remove battle item menu link if not enough items ; control flow target (from $EC23, $ECEE) 0x03EC24|$0F:$EC14:20 78 EC JSR $EC78 ; set menu text $609B to [space] or the appropriate border tile 0x03EC27|$0F:$EC17:20 C5 EC JSR $ECC5 ; tweak dynamic list height if necessary, otherwise set menu function index and parameter 0x03EC2A|$0F:$EC1A:20 1C ED JSR $ED1C ; given menu function index in $609C, set $57-$58 to corresponding function address and execute it 0x03EC2D|$0F:$EC1D:20 2B F0 JSR $F02B 0x03EC30|$0F:$EC20:20 57 F0 JSR $F057 ; CLC if more menu rows to display, SEC otherwise 0x03EC33|$0F:$EC23:90 EF BCC $EC14 0x03EC35|$0F:$EC25:20 B7 F0 JSR $F0B7 0x03EC38|$0F:$EC28:60 RTS ; initialize menu vars, remove battle item menu link if not enough items ; control flow target (from $EC11) 0x03EC39|$0F:$EC29:20 C1 F0 JSR $F0C1 ; write [space] to $600B-$6046 0x03EC3C|$0F:$EC2C:A9 FF LDA #$FF 0x03EC3E|$0F:$EC2E:8D B9 60 STA $60B9 0x03EC41|$0F:$EC31:A9 00 LDA #$00 0x03EC43|$0F:$EC33:8D 9E 60 STA $609E ; menu current column 0x03EC46|$0F:$EC36:8D 9F 60 STA $609F ; menu current row 0x03EC49|$0F:$EC39:8D AC 60 STA $60AC ; menu list index 0x03EC4C|$0F:$EC3C:8D AB 60 STA $60AB ; which list segment we're dealing with 0x03EC4F|$0F:$EC3F:8D A8 60 STA $60A8 ; remaining number of rows for dynamic menu lists 0x03EC52|$0F:$EC42:85 10 STA $10 0x03EC54|$0F:$EC44:85 11 STA $11 0x03EC56|$0F:$EC46:85 12 STA $12 0x03EC58|$0F:$EC48:A5 59 LDA $59 ; menu ID 0x03EC5A|$0F:$EC4A:C9 22 CMP #$22 ; Menu ID #$22: Battle menu: item list window 2 0x03EC5C|$0F:$EC4C:D0 05 BNE $EC53 0x03EC5E|$0F:$EC4E:A9 04 LDA #$04 0x03EC60|$0F:$EC50:8D AC 60 STA $60AC ; menu list index ; control flow target (from $EC4C) 0x03EC63|$0F:$EC53:A5 59 LDA $59 ; menu ID 0x03EC65|$0F:$EC55:C9 08 CMP #$08 ; Menu ID #$08: Battle menu: item list window 1 0x03EC67|$0F:$EC57:D0 14 BNE $EC6D 0x03EC69|$0F:$EC59:A9 04 LDA #$04 ; count all items 0x03EC6B|$0F:$EC5B:8D 9D 60 STA $609D ; menu function parameter 0x03EC6E|$0F:$EC5E:20 B7 F1 JSR $F1B7 ; given hero ID in $4A and item type in $609D, set A = number of items of desired type in hero's inventory 0x03EC71|$0F:$EC61:C9 05 CMP #$05 ; max 4 items per screen 0x03EC73|$0F:$EC63:B0 08 BCS $EC6D ; if < 5 items, disable menu link 0x03EC75|$0F:$EC65:AD AA 60 LDA $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) 0x03EC78|$0F:$EC68:29 BF AND #$BF ; clear bit 6 0x03EC7A|$0F:$EC6A:8D AA 60 STA $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) ; control flow target (from $EC57, $EC63) 0x03EC7D|$0F:$EC6D:A9 00 LDA #$00 ; write #$00 to $606B-$607A 0x03EC7F|$0F:$EC6F:A2 0F LDX #$0F ; control flow target (from $EC75) 0x03EC81|$0F:$EC71:9D 6B 60 STA $606B,X 0x03EC84|$0F:$EC74:CA DEX 0x03EC85|$0F:$EC75:10 FA BPL $EC71 0x03EC87|$0F:$EC77:60 RTS ; set menu text $609B to [space] or the appropriate border tile ; control flow target (from $EC14) 0x03EC88|$0F:$EC78:A9 5F LDA #$5F ; [space] 0x03EC8A|$0F:$EC7A:8D 9B 60 STA $609B ; menu text 0x03EC8D|$0F:$EC7D:AE 9E 60 LDX $609E ; menu current column 0x03EC90|$0F:$EC80:F0 1D BEQ $EC9F ; if we're at column 0, branch to figure out what kind of left border to draw 0x03EC92|$0F:$EC82:E8 INX 0x03EC93|$0F:$EC83:EC A1 60 CPX $60A1 ; menu window width 0x03EC96|$0F:$EC86:D0 2E BNE $ECB6 ; if we're not at width - 1, branch over figuring out what kind of right border to draw 0x03EC98|$0F:$EC88:AE 9F 60 LDX $609F ; menu current row 0x03EC9B|$0F:$EC8B:F0 0A BEQ $EC97 ; if we're on row 0, use a [top-right border] 0x03EC9D|$0F:$EC8D:E8 INX 0x03EC9E|$0F:$EC8E:EC A3 60 CPX $60A3 ; menu window height (ROM value * 2) 0x03ECA1|$0F:$EC91:F0 08 BEQ $EC9B ; if we're on the last row, use a [bottom-right border], otherwise we're in between, so use a plain [right border] 0x03ECA3|$0F:$EC93:A9 7B LDA #$7B ; [right border] 0x03ECA5|$0F:$EC95:D0 2A BNE $ECC1 ; control flow target (from $EC8B) 0x03ECA7|$0F:$EC97:A9 7C LDA #$7C ; [top-right border] 0x03ECA9|$0F:$EC99:D0 26 BNE $ECC1 ; control flow target (from $EC91) 0x03ECAB|$0F:$EC9B:A9 7E LDA #$7E ; [bottom-right border] 0x03ECAD|$0F:$EC9D:D0 22 BNE $ECC1 ; control flow target (from $EC80) 0x03ECAF|$0F:$EC9F:AE 9F 60 LDX $609F ; menu current row 0x03ECB2|$0F:$ECA2:F0 0A BEQ $ECAE ; if we're on row 0, use a [top-left border] 0x03ECB4|$0F:$ECA4:E8 INX 0x03ECB5|$0F:$ECA5:EC A3 60 CPX $60A3 ; menu window height (ROM value * 2) 0x03ECB8|$0F:$ECA8:F0 08 BEQ $ECB2 ; if we're on the last row, use a [bottom-left border], otherwise we're in between, so use a plain [left border] 0x03ECBA|$0F:$ECAA:A9 76 LDA #$76 ; [left border] 0x03ECBC|$0F:$ECAC:D0 13 BNE $ECC1 ; control flow target (from $ECA2) 0x03ECBE|$0F:$ECAE:A9 79 LDA #$79 ; [top-left border] 0x03ECC0|$0F:$ECB0:D0 0F BNE $ECC1 ; control flow target (from $ECA8) 0x03ECC2|$0F:$ECB2:A9 7A LDA #$7A ; [bottom-left border] 0x03ECC4|$0F:$ECB4:D0 0B BNE $ECC1 ; control flow target (from $EC86) 0x03ECC6|$0F:$ECB6:AE 9F 60 LDX $609F ; menu current row 0x03ECC9|$0F:$ECB9:E8 INX 0x03ECCA|$0F:$ECBA:EC A3 60 CPX $60A3 ; menu window height (ROM value * 2) 0x03ECCD|$0F:$ECBD:D0 05 BNE $ECC4 ; if we're on the last row, use a [bottom border], otherwise keep that [space] we started with 0x03ECCF|$0F:$ECBF:A9 7D LDA #$7D ; [bottom border] ; control flow target (from $EC95, $EC99, $EC9D, $ECAC, $ECB0, $ECB4) 0x03ECD1|$0F:$ECC1:8D 9B 60 STA $609B ; menu text ; control flow target (from $ECBD) 0x03ECD4|$0F:$ECC4:60 RTS ; tweak dynamic list height if necessary, otherwise set menu function index and parameter ; control flow target (from $EC17) 0x03ECD5|$0F:$ECC5:AD 9B 60 LDA $609B ; menu text 0x03ECD8|$0F:$ECC8:C9 5F CMP #$5F ; [space] 0x03ECDA|$0F:$ECCA:D0 4A BNE $ED16 ; if menu text is not a [space], set menu function index to #$10 (print one byte of menu text) and RTS 0x03ECDC|$0F:$ECCC:AD AA 60 LDA $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) 0x03ECDF|$0F:$ECCF:29 20 AND #$20 ; pick out the single-spaced bit 0x03ECE1|$0F:$ECD1:D0 22 BNE $ECF5 ; read current menu byte and set menu function index and parameter; branch if single-spaced 0x03ECE3|$0F:$ECD3:AD 9F 60 LDA $609F ; menu current row 0x03ECE6|$0F:$ECD6:4A LSR 0x03ECE7|$0F:$ECD7:90 1C BCC $ECF5 ; read current menu byte and set menu function index and parameter; branch if even row 0x03ECE9|$0F:$ECD9:AD A8 60 LDA $60A8 ; remaining number of rows for dynamic menu lists 0x03ECEC|$0F:$ECDC:C9 01 CMP #$01 0x03ECEE|$0F:$ECDE:D0 11 BNE $ECF1 ; set menu function index and parameter to #$00 (i.e. setup for newline function) 0x03ECF0|$0F:$ECE0:A9 00 LDA #$00 ; reset menu current column 0x03ECF2|$0F:$ECE2:8D 9E 60 STA $609E ; menu current column 0x03ECF5|$0F:$ECE5:AE 9F 60 LDX $609F ; menu current row 0x03ECF8|$0F:$ECE8:E8 INX 0x03ECF9|$0F:$ECE9:8E A3 60 STX $60A3 ; menu window height (ROM value * 2) 0x03ECFC|$0F:$ECEC:68 PLA ; skip over the next few menu processing functions 0x03ECFD|$0F:$ECED:68 PLA 0x03ECFE|$0F:$ECEE:4C 14 EC JMP $EC14 ; set menu function index and parameter to #$00 (i.e. setup for newline function) ; control flow target (from $ECDE) 0x03ED01|$0F:$ECF1:A9 00 LDA #$00 0x03ED03|$0F:$ECF3:F0 0E BEQ $ED03 ; split A into menu function index and parameter and save them ; read current menu byte and set menu function index and parameter ; control flow target (from $ECD1, $ECD7) 0x03ED05|$0F:$ECF5:AC A6 60 LDY $60A6 ; current menu read index 0x03ED08|$0F:$ECF8:EE A6 60 INC $60A6 ; current menu read index 0x03ED0B|$0F:$ECFB:20 FA FE JSR $FEFA ; increment JSR's return address, read byte following JSR, parse it for bank and pointer index, set $D6-$D7 to $8000,X-$8001,X in selected bank ; code -> data ; indirect data load target 0x03ED0E|$0F:$ECFE:20 ; $01:$8000; -> $01:$B642: menu pointer table ; data -> code 0x03ED0F|$0F:$ECFF:B1 55 LDA ($55),Y ; pointer to start of sub pointer data, low byte 0x03ED11|$0F:$ED01:10 10 BPL $ED13 ; high bit determines whether byte is function (set) or text (clear) ; split A into menu function index and parameter and save them ; control flow target (from $ECF3) 0x03ED13|$0F:$ED03:29 7F AND #$7F ; clear function bit 0x03ED15|$0F:$ED05:48 PHA 0x03ED16|$0F:$ED06:29 07 AND #$07 ; menu function parameter is 3 bits wide 0x03ED18|$0F:$ED08:8D 9D 60 STA $609D ; menu function parameter 0x03ED1B|$0F:$ED0B:68 PLA 0x03ED1C|$0F:$ED0C:4A LSR ; menu function index is 4 bits wide 0x03ED1D|$0F:$ED0D:4A LSR 0x03ED1E|$0F:$ED0E:4A LSR 0x03ED1F|$0F:$ED0F:8D 9C 60 STA $609C ; menu function index 0x03ED22|$0F:$ED12:60 RTS ; control flow target (from $ED01) 0x03ED23|$0F:$ED13:8D 9B 60 STA $609B ; menu text ; control flow target (from $ECCA) 0x03ED26|$0F:$ED16:A9 10 LDA #$10 0x03ED28|$0F:$ED18:8D 9C 60 STA $609C ; menu function index 0x03ED2B|$0F:$ED1B:60 RTS ; given menu function index in $609C, set $57-$58 to corresponding function address and execute it ; control flow target (from $EC1A) 0x03ED2C|$0F:$ED1C:AD 9C 60 LDA $609C ; menu function index 0x03ED2F|$0F:$ED1F:0A ASL 0x03ED30|$0F:$ED20:AA TAX 0x03ED31|$0F:$ED21:BD CC F0 LDA $F0CC,X ; menu control code jump table low byte 0x03ED34|$0F:$ED24:85 57 STA $57 ; pointer to start of main pointer table, low byte 0x03ED36|$0F:$ED26:BD CD F0 LDA $F0CD,X ; menu control code jump table high byte 0x03ED39|$0F:$ED29:85 58 STA $58 ; pointer to start of main pointer table, high byte 0x03ED3B|$0F:$ED2B:6C 57 00 JMP ($0057) ; pointer to start of main pointer table, low byte ; menu control code #$80-#$87 handler: print number of spaces specified by $609D (or rest of line if $609D is #$00) to current menu position ; control flow target (from $EF8A) ; indirect control flow target (via $F0CC) 0x03ED3E|$0F:$ED2E:A9 5F LDA #$5F ; Tile ID #$5F: [space] 0x03ED40|$0F:$ED30:8D 9B 60 STA $609B ; menu text 0x03ED43|$0F:$ED33:20 5E F0 JSR $F05E ; set $60A0 based on menu function parameter $609D and number of remaining tiles in the current line ; control flow target (from $ED3C) 0x03ED46|$0F:$ED36:20 13 F0 JSR $F013 ; update menu current column and row 0x03ED49|$0F:$ED39:CE A0 60 DEC $60A0 ; maximum string length 0x03ED4C|$0F:$ED3C:D0 F8 BNE $ED36 ; if more tiles to print, print them 0x03ED4E|$0F:$ED3E:60 RTS ; menu control code #$88-#$8F handler: print number of top border tiles specified by $609D (or rest of line if $609D is #$00) to current menu position, accounting for possible linked menu ; indirect control flow target (via $F0CE) 0x03ED4F|$0F:$ED3F:2C AA 60 BIT $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) 0x03ED52|$0F:$ED42:50 10 BVC $ED54 ; if not linked, skip ahead 0x03ED54|$0F:$ED44:A9 5F LDA #$5F ; Tile ID #$5F: [space] 0x03ED56|$0F:$ED46:8D 9B 60 STA $609B ; menu text 0x03ED59|$0F:$ED49:20 E4 EF JSR $EFE4 ; print one byte of menu text 0x03ED5C|$0F:$ED4C:A9 63 LDA #$63 ; Tile ID #$63: [right arrow] 0x03ED5E|$0F:$ED4E:8D 9B 60 STA $609B ; menu text 0x03ED61|$0F:$ED51:20 E4 EF JSR $EFE4 ; print one byte of menu text ; control flow target (from $ED42) 0x03ED64|$0F:$ED54:A9 77 LDA #$77 ; Tile ID #$77: [top border] 0x03ED66|$0F:$ED56:8D 9B 60 STA $609B ; menu text 0x03ED69|$0F:$ED59:20 5E F0 JSR $F05E ; set $60A0 based on menu function parameter $609D and number of remaining tiles in the current line ; control flow target (from $ED62) 0x03ED6C|$0F:$ED5C:20 E4 EF JSR $EFE4 ; print one byte of menu text 0x03ED6F|$0F:$ED5F:CE A0 60 DEC $60A0 ; maximum string length 0x03ED72|$0F:$ED62:D0 F8 BNE $ED5C ; if more tiles to print, print them 0x03ED74|$0F:$ED64:60 RTS ; menu control code #$90-#$97 handler: print selected hero's current HP or MP ; indirect control flow target (via $F0D0) 0x03ED75|$0F:$ED65:A9 03 LDA #$03 0x03ED77|$0F:$ED67:20 7A F0 JSR $F07A ; set maximum string length $60A0 to A and update menu function parameter $609D: if its bits 0-1 are both set, use $4A | bit 2 of $609D, else use the low 3 bits of $609D 0x03ED7A|$0F:$ED6A:A2 0E LDX #$0E ; offset for current HP 0x03ED7C|$0F:$ED6C:AD 9D 60 LDA $609D ; menu function parameter 0x03ED7F|$0F:$ED6F:29 04 AND #$04 ; MP control codes set bit 2 0x03ED81|$0F:$ED71:F0 02 BEQ $ED75 0x03ED83|$0F:$ED73:A2 10 LDX #$10 ; offset for current MP ; control flow target (from $ED71) 0x03ED85|$0F:$ED75:A0 01 LDY #$01 ; print one byte (ignores 2nd byte of current HP) 0x03ED87|$0F:$ED77:4C 96 F0 JMP $F096 ; given hero ID in ID $609D, stat offset in X, and stat byte size in Y (max of #$03), print that stat in base 10 to current menu position, replacing leading zeroes with spaces ; menu control code #$98-#$9F handler: print party gold or crests or "ADVENTURE LOG" ; indirect control flow target (via $F0D2) 0x03ED8A|$0F:$ED7A:A9 05 LDA #$05 ; start by assuming crests 0x03ED8C|$0F:$ED7C:8D A0 60 STA $60A0 ; maximum string length 0x03ED8F|$0F:$ED7F:AD 9D 60 LDA $609D ; menu function parameter 0x03ED92|$0F:$ED82:F0 23 BEQ $EDA7 ; menu control code #$98 handler: print party gold 0x03ED94|$0F:$ED84:C9 01 CMP #$01 0x03ED96|$0F:$ED86:D0 25 BNE $EDAD ; menu control code #$9A-#$9F handler: print "ADVENTURE LOG" ; menu control code #$99 handler: print obtained crests 0x03ED98|$0F:$ED88:20 9F F1 JSR $F19F ; initialize string buffer $0100-$010C with [space]s 0x03ED9B|$0F:$ED8B:AD 12 01 LDA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x03ED9E|$0F:$ED8E:29 1F AND #$1F ; pretty sure nothing writes to the high 3 bits, but better safe than sorry 0x03EDA0|$0F:$ED90:85 10 STA $10 ; crests found 0x03EDA2|$0F:$ED92:A2 04 LDX #$04 ; maximum of 5 crests 0x03EDA4|$0F:$ED94:A0 5A LDY #$5A ; Tile ID #$5A: [sun] ; control flow target (from $EDA2) 0x03EDA6|$0F:$ED96:46 10 LSR $10 ; shift crest bit into C 0x03EDA8|$0F:$ED98:90 05 BCC $ED9F ; branch if crest not found 0x03EDAA|$0F:$ED9A:98 TYA 0x03EDAB|$0F:$ED9B:9D 00 01 STA $0100,X ; string copy buffer start (often referenced as $00FF,X) 0x03EDAE|$0F:$ED9E:CA DEX ; control flow target (from $ED98) 0x03EDAF|$0F:$ED9F:C8 INY ; crest tile ID 0x03EDB0|$0F:$EDA0:A5 10 LDA $10 ; remaining crests 0x03EDB2|$0F:$EDA2:D0 F2 BNE $ED96 ; if more crests to copy, copy them 0x03EDB4|$0F:$EDA4:4C A5 F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; menu control code #$98 handler: print party gold ; control flow target (from $ED82) 0x03EDB7|$0F:$EDA7:20 79 F4 JSR $F479 ; print party gold to $0100 in decimal in reverse, replacing leading (now trailing) zeroes with spaces, leaving X at most significant digit 0x03EDBA|$0F:$EDAA:4C A5 F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; menu control code #$9A-#$9F handler: print "ADVENTURE LOG" ; 9B-9F are unused ; control flow target (from $ED86) 0x03EDBD|$0F:$EDAD:A9 0D LDA #$0D ; length of "ADVENTRUE LOG" 0x03EDBF|$0F:$EDAF:8D A0 60 STA $60A0 ; maximum string length 0x03EDC2|$0F:$EDB2:AA TAX ; control flow target (from $EDBA) 0x03EDC3|$0F:$EDB3:BD BE ED LDA $EDBE,X ; built-in offset from $EDBF: "GOL ERUTNEVDA", i.e. "ADVENTRUE LOG" backwards 0x03EDC6|$0F:$EDB6:9D FF 00 STA $00FF,X ; built-in offset from string copy buffer start at $0100 0x03EDC9|$0F:$EDB9:CA DEX 0x03EDCA|$0F:$EDBA:D0 F7 BNE $EDB3 0x03EDCC|$0F:$EDBC:4C A5 ; built-in offset from $EDBF: "GOL ERUTNEVDA", i.e. "ADVENTRUE LOG" backwards ; indexed data load target (from $EDB3) 0x03EDCE|$0F:$EDBE: F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; code -> data ; "GOL ERUTNEVDA", i.e. "ADVENTRUE LOG" backwards 0x03EDCF|$0F:$EDBF:2A 32 2F 5F 28 35 38 37 31 28 39 27 24 ; data -> code ; menu control code #$A0-#$A7 handler: print level of selected hero or Midenhall's level in current save file ; indirect control flow target (via $F0D4) 0x03EDDC|$0F:$EDCC:AD 9D 60 LDA $609D ; menu function parameter 0x03EDDF|$0F:$EDCF:C9 04 CMP #$04 0x03EDE1|$0F:$EDD1:F0 2E BEQ $EE01 ; menu control code #$A4 handler: print Midenhall's level in current save file 0x03EDE3|$0F:$EDD3:A9 02 LDA #$02 0x03EDE5|$0F:$EDD5:20 7A F0 JSR $F07A ; set maximum string length $60A0 to A and update menu function parameter $609D: if its bits 0-1 are both set, use $4A | bit 2 of $609D, else use the low 3 bits of $609D 0x03EDE8|$0F:$EDD8:A2 00 LDX #$00 ; offset for hero status 0x03EDEA|$0F:$EDDA:A0 01 LDY #$01 ; which is one byte long 0x03EDEC|$0F:$EDDC:20 4A F1 JSR $F14A ; given stat offset in X and stat byte size in Y (max of #$03), copy that many bytes of hero ID $609D's stats to $10-$12 0x03EDEF|$0F:$EDDF:A5 10 LDA $10 ; hero status 0x03EDF1|$0F:$EDE1:10 0B BPL $EDEE ; dead hero 0x03EDF3|$0F:$EDE3:29 20 AND #$20 ; pick out the poison bit 0x03EDF5|$0F:$EDE5:D0 0D BNE $EDF4 ; poisoned hero 0x03EDF7|$0F:$EDE7:A2 11 LDX #$11 ; offset for level 0x03EDF9|$0F:$EDE9:A0 01 LDY #$01 ; which is one byte long 0x03EDFB|$0F:$EDEB:4C 96 F0 JMP $F096 ; given hero ID in ID $609D, stat offset in X, and stat byte size in Y (max of #$03), print that stat in base 10 to current menu position, replacing leading zeroes with spaces ; dead hero ; control flow target (from $EDE1) 0x03EDFE|$0F:$EDEE:A9 27 LDA #$27 ; Tile ID #$27: D 0x03EE00|$0F:$EDF0:A2 28 LDX #$28 ; Tile ID #$28: E 0x03EE02|$0F:$EDF2:D0 04 BNE $EDF8 ; poisoned hero ; control flow target (from $EDE5) 0x03EE04|$0F:$EDF4:A9 33 LDA #$33 ; Tile ID #$33: P 0x03EE06|$0F:$EDF6:A2 32 LDX #$32 ; Tile ID #$32: O ; control flow target (from $EDF2) 0x03EE08|$0F:$EDF8:8D 01 01 STA $0101 0x03EE0B|$0F:$EDFB:8E 00 01 STX $0100 ; string copy buffer start (often referenced as $00FF,X) 0x03EE0E|$0F:$EDFE:4C A5 F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; menu control code #$A4 handler: print Midenhall's level in current save file ; control flow target (from $EDD1) 0x03EE11|$0F:$EE01:A9 02 LDA #$02 0x03EE13|$0F:$EE03:8D A0 60 STA $60A0 ; maximum string length 0x03EE16|$0F:$EE06:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03EE19|$0F:$EE09:C6 ; $06:$800C; -> $06:$A8AA: given current game save slot in $75DB, return Midenhall's level in that save game in A/$0E ; data -> code 0x03EE1A|$0F:$EE0A:A5 0E LDA $0E ; useless op 0x03EE1C|$0F:$EE0C:85 10 STA $10 0x03EE1E|$0F:$EE0E:A9 00 LDA #$00 0x03EE20|$0F:$EE10:85 11 STA $11 ; this is either useless if we're relying on $11 still being #$00 from the earlier call to $EC29 or a bug since we aren't setting $12 0x03EE22|$0F:$EE12:20 9F F0 JSR $F09F ; given a 24-bit number N in $10-$12, print its base 10 digits in reverse to $0100 up to maximum string length $60A0, replacing leading (trailing in reverse) zeroes with spaces 0x03EE25|$0F:$EE15:4C A5 F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; menu control code #$A8-#$AF handler: print selected hero's current EXP ; indirect control flow target (via $F0D6) 0x03EE28|$0F:$EE18:A9 07 LDA #$07 0x03EE2A|$0F:$EE1A:20 7A F0 JSR $F07A ; set maximum string length $60A0 to A and update menu function parameter $609D: if its bits 0-1 are both set, use $4A | bit 2 of $609D, else use the low 3 bits of $609D 0x03EE2D|$0F:$EE1D:A2 06 LDX #$06 ; offset for current EXP 0x03EE2F|$0F:$EE1F:A0 03 LDY #$03 ; which is 3 bytes long 0x03EE31|$0F:$EE21:4C 96 F0 JMP $F096 ; given hero ID in ID $609D, stat offset in X, and stat byte size in Y (max of #$03), print that stat in base 10 to current menu position, replacing leading zeroes with spaces ; menu control code #$B0-#$B7 handler: print selected hero's short name, current hero's full name, or Midenhall's short name from selected save game ; indirect control flow target (via $F0D8) 0x03EE34|$0F:$EE24:AD 9D 60 LDA $609D ; menu function parameter 0x03EE37|$0F:$EE27:C9 04 CMP #$04 0x03EE39|$0F:$EE29:F0 22 BEQ $EE4D ; menu control code #$B4 handler: print current hero's full name 0x03EE3B|$0F:$EE2B:C9 05 CMP #$05 0x03EE3D|$0F:$EE2D:B0 41 BCS $EE70 ; menu control code #$B5-#$B7 handler: print short save name ; menu control code #$B0-#$B3 handler: print short name of hero ID in $609D ; control flow target (from $EE52) 0x03EE3F|$0F:$EE2F:A9 04 LDA #$04 0x03EE41|$0F:$EE31:20 7A F0 JSR $F07A ; set maximum string length $60A0 to A and update menu function parameter $609D: if its bits 0-1 are both set, use $4A | bit 2 of $609D, else use the low 3 bits of $609D; for #$B3, set hero ID = $4A 0x03EE44|$0F:$EE34:AD 9D 60 LDA $609D ; menu function parameter 0x03EE47|$0F:$EE37:0A ASL 0x03EE48|$0F:$EE38:0A ASL 0x03EE49|$0F:$EE39:6D 9D 60 ADC $609D ; menu function parameter; A = hero ID * 5 0x03EE4C|$0F:$EE3C:AA TAX 0x03EE4D|$0F:$EE3D:AC A0 60 LDY $60A0 ; maximum string length ; control flow target (from $EE48) 0x03EE50|$0F:$EE40:BD 13 01 LDA $0113,X ; Midenhall name bytes 0-3 + terminator 0x03EE53|$0F:$EE43:99 FF 00 STA $00FF,Y ; built-in offset from string copy buffer start at $0100 0x03EE56|$0F:$EE46:E8 INX ; read index 0x03EE57|$0F:$EE47:88 DEY ; write index 0x03EE58|$0F:$EE48:D0 F6 BNE $EE40 ; if more tiles to print, print them 0x03EE5A|$0F:$EE4A:4C A5 F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; menu control code #$B4 handler: print current hero's full name ; control flow target (from $EE29) 0x03EE5D|$0F:$EE4D:A9 03 LDA #$03 ; start by printing selected hero's short name 0x03EE5F|$0F:$EE4F:8D 9D 60 STA $609D ; menu function parameter 0x03EE62|$0F:$EE52:20 2F EE JSR $EE2F ; menu control code #$B0-#$B3 handler: print short name of hero ID in $609D 0x03EE65|$0F:$EE55:A9 04 LDA #$04 0x03EE67|$0F:$EE57:8D A0 60 STA $60A0 ; maximum string length 0x03EE6A|$0F:$EE5A:AD 9D 60 LDA $609D ; menu function parameter 0x03EE6D|$0F:$EE5D:0A ASL 0x03EE6E|$0F:$EE5E:0A ASL 0x03EE6F|$0F:$EE5F:AA TAX ; A = hero ID * 4 0x03EE70|$0F:$EE60:AC A0 60 LDY $60A0 ; maximum string length ; control flow target (from $EE6B) 0x03EE73|$0F:$EE63:BD 86 01 LDA $0186,X ; Midenhall name bytes 4-7 0x03EE76|$0F:$EE66:99 FF 00 STA $00FF,Y ; built-in offset from string copy buffer start at $0100 0x03EE79|$0F:$EE69:E8 INX ; read index 0x03EE7A|$0F:$EE6A:88 DEY ; write index 0x03EE7B|$0F:$EE6B:D0 F6 BNE $EE63 ; if more tiles to print, print them 0x03EE7D|$0F:$EE6D:4C A5 F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; menu control code #$B5-#$B7 handler: print short save name ; control flow target (from $EE2D) 0x03EE80|$0F:$EE70:A9 04 LDA #$04 0x03EE82|$0F:$EE72:8D A0 60 STA $60A0 ; maximum string length 0x03EE85|$0F:$EE75:AD 9D 60 LDA $609D ; menu function parameter 0x03EE88|$0F:$EE78:38 SEC 0x03EE89|$0F:$EE79:E9 05 SBC #$05 ; #$05-#$07 -> #$00-#$02 0x03EE8B|$0F:$EE7B:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03EE8E|$0F:$EE7E:CE ; $06:$801C; -> $06:$A88F: copy Midenhall's short name from save slot in A to $0100 in reverse ; data -> code 0x03EE8F|$0F:$EE7F:4C A5 F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; menu control code #$B8-#$BF handler: print various item names based on menu format ; indirect control flow target (via $F0DA) 0x03EE92|$0F:$EE82:A9 0D LDA #$0D 0x03EE94|$0F:$EE84:8D A0 60 STA $60A0 ; maximum string length 0x03EE97|$0F:$EE87:AD AA 60 LDA $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) 0x03EE9A|$0F:$EE8A:29 02 AND #$02 0x03EE9C|$0F:$EE8C:F0 05 BEQ $EE93 ; if this menu only displays equipped items (i.e. it's Menu ID #$1C: Main menu: status screen equipped items), set menu list index $60AC = #$00 0x03EE9E|$0F:$EE8E:A9 00 LDA #$00 0x03EEA0|$0F:$EE90:8D AC 60 STA $60AC ; menu list index ; control flow target (from $EE8C) 0x03EEA3|$0F:$EE93:AD 9D 60 LDA $609D ; menu function parameter 0x03EEA6|$0F:$EE96:C9 05 CMP #$05 0x03EEA8|$0F:$EE98:B0 0C BCS $EEA6 ; menu control code #$BD-#$BF handler: given shop ID in $60AF and menu list index in $60AC, print name of the corresponding item ID or #$00 if it's the Jailor's Key to $0100; depending on settings, possibly update menu's [left border] to [left border, equipped], then toggle list segment $60AB; if list segment becomes #$01, INC menu list index $60AC 0x03EEAA|$0F:$EE9A:20 19 F2 JSR $F219 ; return the $60AC'th item of item type $609D in A and the party inventory index of that item in X, or #$00 in A and #$FF in X if no such item exists; also sets $60BA,X to #$FF if found and #$00 otherwise 0x03EEAD|$0F:$EE9D:20 9D F2 JSR $F29D ; given party inventory offset in X, print name of that item ID to $0100 in reverse; depending on settings, possibly update menu's [left border] to [left border, equipped] ; print string at $0100 in reverse to current menu position and toggle list segment $60AB; if list segment becomes #$01, INC menu list index $60AC ; control flow target (from $EEAC) 0x03EEB0|$0F:$EEA0:20 A5 F0 JSR $F0A5 ; print string at $0100 in reverse to current menu position 0x03EEB3|$0F:$EEA3:4C 21 F3 JMP $F321 ; toggle list segment $60AB; if list segment becomes #$01, INC menu list index $60AC ; menu control code #$BD-#$BF handler: given shop ID in $60AF and menu list index in $60AC, print name of the corresponding item ID or #$00 if it's the Jailor's Key to $0100; depending on settings, possibly update menu's [left border] to [left border, equipped], then toggle list segment $60AB; if list segment becomes #$01, INC menu list index $60AC ; control flow target (from $EE98) 0x03EEB6|$0F:$EEA6:20 7F F2 JSR $F27F ; given shop ID in $60AF and menu list index in $60AC, set A to the corresponding item ID or #$00 if it's the Jailor's Key 0x03EEB9|$0F:$EEA9:20 A7 F2 JSR $F2A7 ; print name of item ID in A to $0100 in reverse; depending on settings, possibly update menu's [left border] to [left border, equipped] 0x03EEBC|$0F:$EEAC:4C A0 EE JMP $EEA0 ; print string at $0100 in reverse to current menu position and toggle list segment $60AB; if list segment becomes #$01, INC menu list index $60AC ; menu control code #$C0-#$C7 handler: draw spell name stuff ; indirect control flow target (via $F0DC) 0x03EEBF|$0F:$EEAF:A9 09 LDA #$09 0x03EEC1|$0F:$EEB1:8D A0 60 STA $60A0 ; maximum string length 0x03EEC4|$0F:$EEB4:20 35 F3 JSR $F335 0x03EEC7|$0F:$EEB7:20 9F F3 JSR $F39F ; given spell name index in A, print spell name to $0100 in reverse, set Y to length of string copied, then load bank specified by $60D7 (set by last call to $F3E2) 0x03EECA|$0F:$EEBA:20 A5 F0 JSR $F0A5 ; print string at $0100 in reverse to current menu position 0x03EECD|$0F:$EEBD:EE AC 60 INC $60AC ; menu list index 0x03EED0|$0F:$EEC0:60 RTS ; menu control code #$C8-#$CF handler: draw item price stuff ; indirect control flow target (via $F0DE) 0x03EED1|$0F:$EEC1:20 9F F1 JSR $F19F ; initialize string buffer $0100-$010C with [space]s 0x03EED4|$0F:$EEC4:A9 05 LDA #$05 0x03EED6|$0F:$EEC6:8D A0 60 STA $60A0 ; maximum string length 0x03EED9|$0F:$EEC9:20 61 F7 JSR $F761 ; load ROM bank #$06 0x03EEDC|$0F:$EECC:AD AD 60 LDA $60AD ; item ID 0x03EEDF|$0F:$EECF:F0 13 BEQ $EEE4 0x03EEE1|$0F:$EED1:0A ASL 0x03EEE2|$0F:$EED2:AA TAX 0x03EEE3|$0F:$EED3:BD FC 9F LDA $9FFC,X ; Item Prices, low byte 0x03EEE6|$0F:$EED6:85 10 STA $10 0x03EEE8|$0F:$EED8:BD FD 9F LDA $9FFD,X ; Item Prices, high byte 0x03EEEB|$0F:$EEDB:85 11 STA $11 0x03EEED|$0F:$EEDD:A9 00 LDA #$00 0x03EEEF|$0F:$EEDF:85 12 STA $12 0x03EEF1|$0F:$EEE1:20 9F F0 JSR $F09F ; given a 24-bit number N in $10-$12, print its base 10 digits in reverse to $0100 up to maximum string length $60A0, replacing leading (trailing in reverse) zeroes with spaces ; control flow target (from $EECF) 0x03EEF4|$0F:$EEE4:4C A5 F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; menu control code #$D0-#$D7 handler: start lists ; indirect control flow target (via $F0E0) 0x03EEF7|$0F:$EEE7:AD 9D 60 LDA $609D ; menu function parameter 0x03EEFA|$0F:$EEEA:C9 06 CMP #$06 0x03EEFC|$0F:$EEEC:F0 25 BEQ $EF13 ; menu control code #$D6 handler: start field spell list 0x03EEFE|$0F:$EEEE:C9 07 CMP #$07 0x03EF00|$0F:$EEF0:F0 33 BEQ $EF25 ; menu control code #$D7 handler: start monster list 0x03EF02|$0F:$EEF2:C9 05 CMP #$05 0x03EF04|$0F:$EEF4:D0 06 BNE $EEFC ; menu control code #$D0-#$D4 handler: start item lists ; menu control code #$D5 handler: start shop item list 0x03EF06|$0F:$EEF6:20 55 F2 JSR $F255 ; given shop ID in $60AF and menu list index in $60AC, set A to the corresponding item ID and X to the number of items in the shop 0x03EF09|$0F:$EEF9:8A TXA 0x03EF0A|$0F:$EEFA:D0 0D BNE $EF09 ; set remaining number of rows for dynamic menu lists to A, set menu read index for start of repeating lists to current menu read index ; menu control code #$D0-#$D4 handler: start item lists ; control flow target (from $EEF4) 0x03EF0C|$0F:$EEFC:A9 00 LDA #$00 0x03EF0E|$0F:$EEFE:8D AC 60 STA $60AC ; menu list index 0x03EF11|$0F:$EF01:A9 00 LDA #$00 0x03EF13|$0F:$EF03:8D AB 60 STA $60AB ; which list segment we're dealing with 0x03EF16|$0F:$EF06:20 B7 F1 JSR $F1B7 ; given hero ID in $4A and item type in $609D, set A = number of items of desired type in hero's inventory ; set remaining number of rows for dynamic menu lists to A, set menu read index for start of repeating lists to current menu read index ; control flow target (from $EEFA, $EF22, $EF34) 0x03EF19|$0F:$EF09:8D A8 60 STA $60A8 ; remaining number of rows for dynamic menu lists 0x03EF1C|$0F:$EF0C:AD A6 60 LDA $60A6 ; current menu read index 0x03EF1F|$0F:$EF0F:8D A7 60 STA $60A7 ; menu read index for start of repeating lists 0x03EF22|$0F:$EF12:60 RTS ; menu control code #$D6 handler: start field spell list ; control flow target (from $EEEC) 0x03EF23|$0F:$EF13:A0 00 LDY #$00 ; number of learned spells 0x03EF25|$0F:$EF15:A6 4A LDX $4A ; hero ID 0x03EF27|$0F:$EF17:BD 1A 06 LDA $061A,X ; Cannock's learned field spell list ; control flow target (from $EF1F) 0x03EF2A|$0F:$EF1A:0A ASL 0x03EF2B|$0F:$EF1B:90 02 BCC $EF1F ; branch if spell not learned 0x03EF2D|$0F:$EF1D:C8 INY ; number of learned spells 0x03EF2E|$0F:$EF1E:AA TAX ; set Z (updated by INY) back to A ; control flow target (from $EF1B) 0x03EF2F|$0F:$EF1F:D0 F9 BNE $EF1A 0x03EF31|$0F:$EF21:98 TYA ; number of learned spells 0x03EF32|$0F:$EF22:4C 09 EF JMP $EF09 ; set remaining number of rows for dynamic menu lists to A, set menu read index for start of repeating lists to current menu read index ; menu control code #$D7 handler: start monster list ; control flow target (from $EEF0) 0x03EF35|$0F:$EF25:A2 00 LDX #$00 ; number of monster groups ; control flow target (from $EF30) 0x03EF37|$0F:$EF27:BD 1C 06 LDA $061C,X ; monster group 1 monster ID 0x03EF3A|$0F:$EF2A:F0 06 BEQ $EF32 0x03EF3C|$0F:$EF2C:E8 INX ; this part of monster group data is 2 bytes each 0x03EF3D|$0F:$EF2D:E8 INX 0x03EF3E|$0F:$EF2E:E0 08 CPX #$08 ; maximum 4 groups * 2 bytes each = 8 bytes 0x03EF40|$0F:$EF30:D0 F5 BNE $EF27 ; control flow target (from $EF2A) 0x03EF42|$0F:$EF32:8A TXA 0x03EF43|$0F:$EF33:4A LSR ; 2 bytes per group, so divide by 2 0x03EF44|$0F:$EF34:4C 09 EF JMP $EF09 ; set remaining number of rows for dynamic menu lists to A, set menu read index for start of repeating lists to current menu read index ; menu control code #$E8-#$EF handler: repeat/end list and full save name handlers ; indirect control flow target (via $F0E6) 0x03EF47|$0F:$EF37:AD 9D 60 LDA $609D ; menu function parameter 0x03EF4A|$0F:$EF3A:C9 02 CMP #$02 0x03EF4C|$0F:$EF3C:F0 15 BEQ $EF53 ; menu control code #$EA handler: print Midenhall's full name from save slot in $75DB 0x03EF4E|$0F:$EF3E:29 03 AND #$03 0x03EF50|$0F:$EF40:D0 1D BNE $EF5F ; menu control code #$E9 handler: end current repeating list ; menu control code #$E8 handler: update remaining number of rows for dynamic menu lists, reset current menu read index if applicable 0x03EF52|$0F:$EF42:AD A8 60 LDA $60A8 ; remaining number of rows for dynamic menu lists 0x03EF55|$0F:$EF45:F0 0B BEQ $EF52 0x03EF57|$0F:$EF47:CE A8 60 DEC $60A8 ; remaining number of rows for dynamic menu lists 0x03EF5A|$0F:$EF4A:F0 06 BEQ $EF52 0x03EF5C|$0F:$EF4C:AD A7 60 LDA $60A7 ; menu read index for start of repeating lists 0x03EF5F|$0F:$EF4F:8D A6 60 STA $60A6 ; current menu read index ; control flow target (from $EF45, $EF4A) 0x03EF62|$0F:$EF52:60 RTS ; menu control code #$EA handler: print Midenhall's full name from save slot in $75DB ; control flow target (from $EF3C) 0x03EF63|$0F:$EF53:A9 08 LDA #$08 0x03EF65|$0F:$EF55:8D A0 60 STA $60A0 ; maximum string length 0x03EF68|$0F:$EF58:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03EF6B|$0F:$EF5B:C5 ; $06:$800A; -> $06:$A896: copy Midenhall's full name from save slot in $75DB to $0100 in reverse ; data -> code 0x03EF6C|$0F:$EF5C:4C A5 F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; menu control code #$E9 handler: end current repeating list ; control flow target (from $EF40) 0x03EF6F|$0F:$EF5F:A9 00 LDA #$00 0x03EF71|$0F:$EF61:8D 9E 60 STA $609E ; menu current column 0x03EF74|$0F:$EF64:8D 9D 60 STA $609D ; menu function parameter 0x03EF77|$0F:$EF67:AD 9F 60 LDA $609F ; menu current row 0x03EF7A|$0F:$EF6A:29 01 AND #$01 0x03EF7C|$0F:$EF6C:49 01 EOR #$01 0x03EF7E|$0F:$EF6E:18 CLC 0x03EF7F|$0F:$EF6F:69 01 ADC #$01 0x03EF81|$0F:$EF71:6D 9F 60 ADC $609F ; menu current row 0x03EF84|$0F:$EF74:8D A3 60 STA $60A3 ; menu window height (ROM value * 2); height = number of rows + 1 if odd, + 2 if even 0x03EF87|$0F:$EF77:4A LSR 0x03EF88|$0F:$EF78:8D A2 60 STA $60A2 ; menu window height (from ROM) 0x03EF8B|$0F:$EF7B:AD 9F 60 LDA $609F ; menu current row 0x03EF8E|$0F:$EF7E:29 01 AND #$01 0x03EF90|$0F:$EF80:D0 0B BNE $EF8D 0x03EF92|$0F:$EF82:A9 76 LDA #$76 ; Tile ID #$76: [left border] 0x03EF94|$0F:$EF84:8D 9B 60 STA $609B ; menu text 0x03EF97|$0F:$EF87:20 E4 EF JSR $EFE4 ; print one byte of menu text 0x03EF9A|$0F:$EF8A:4C 2E ED JMP $ED2E ; menu control code #$80-#$87 handler: print number of spaces specified by $609D (or rest of line if $609D is #$00) to current menu position ; control flow target (from $EF80) 0x03EF9D|$0F:$EF8D:60 RTS ; menu control code #$D8-#$DF handler: print selected stat ; indirect control flow target (via $F0E2) 0x03EF9E|$0F:$EF8E:AE 9D 60 LDX $609D ; menu function parameter 0x03EFA1|$0F:$EF91:BD EE F0 LDA $F0EE,X ; stat offsets 0x03EFA4|$0F:$EF94:48 PHA ; stat offset 0x03EFA5|$0F:$EF95:A9 03 LDA #$03 0x03EFA7|$0F:$EF97:8D 9D 60 STA $609D ; menu function parameter 0x03EFAA|$0F:$EF9A:20 7A F0 JSR $F07A ; set maximum string length $60A0 to A and update menu function parameter $609D: if its bits 0-1 are both set, use $4A | bit 2 of $609D, else use the low 3 bits of $609D 0x03EFAD|$0F:$EF9D:68 PLA ; stat offset 0x03EFAE|$0F:$EF9E:AA TAX ; stat offset 0x03EFAF|$0F:$EF9F:A0 01 LDY #$01 ; number of bytes 0x03EFB1|$0F:$EFA1:4C 96 F0 JMP $F096 ; given hero ID in ID $609D, stat offset in X, and stat byte size in Y (max of #$03), print that stat in base 10 to current menu position, replacing leading zeroes with spaces ; menu control code #$E0-#$E7 handler: draw monster text stuff ; indirect control flow target (via $F0E4) 0x03EFB4|$0F:$EFA4:AD 9D 60 LDA $609D ; menu function parameter 0x03EFB7|$0F:$EFA7:D0 23 BNE $EFCC 0x03EFB9|$0F:$EFA9:A9 0B LDA #$0B 0x03EFBB|$0F:$EFAB:8D A0 60 STA $60A0 ; maximum string length 0x03EFBE|$0F:$EFAE:AD AB 60 LDA $60AB ; which list segment we're dealing with 0x03EFC1|$0F:$EFB1:4A LSR 0x03EFC2|$0F:$EFB2:90 05 BCC $EFB9 0x03EFC4|$0F:$EFB4:A9 09 LDA #$09 0x03EFC6|$0F:$EFB6:8D A0 60 STA $60A0 ; maximum string length ; control flow target (from $EFB2) 0x03EFC9|$0F:$EFB9:AD AC 60 LDA $60AC ; menu list index 0x03EFCC|$0F:$EFBC:0A ASL 0x03EFCD|$0F:$EFBD:AA TAX 0x03EFCE|$0F:$EFBE:BD 1C 06 LDA $061C,X ; monster group 1 monster ID 0x03EFD1|$0F:$EFC1:A2 00 LDX #$00 0x03EFD3|$0F:$EFC3:20 B7 F3 JSR $F3B7 ; given monster ID in A, copy monster name segment to $0100 in reverse 0x03EFD6|$0F:$EFC6:20 A5 F0 JSR $F0A5 ; print string at $0100 in reverse to current menu position 0x03EFD9|$0F:$EFC9:4C 21 F3 JMP $F321 ; toggle list segment $60AB; if list segment becomes #$01, INC menu list index $60AC ; control flow target (from $EFA7) 0x03EFDC|$0F:$EFCC:A9 01 LDA #$01 0x03EFDE|$0F:$EFCE:8D A0 60 STA $60A0 ; maximum string length 0x03EFE1|$0F:$EFD1:AD AC 60 LDA $60AC ; menu list index 0x03EFE4|$0F:$EFD4:0A ASL 0x03EFE5|$0F:$EFD5:AA TAX 0x03EFE6|$0F:$EFD6:BD 1D 06 LDA $061D,X ; monster group 1 monster count 0x03EFE9|$0F:$EFD9:85 10 STA $10 0x03EFEB|$0F:$EFDB:20 7C F1 JSR $F17C ; given a 24-bit number N in $10-$12, print its base 10 digits in reverse to $0100 up to maximum string length $60A0 0x03EFEE|$0F:$EFDE:4C A5 F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; menu control code #$F0-#$FF + text handler: print one byte of menu text to current position ; indirect control flow target (via $F0E8, $F0EA, $F0EC) 0x03EFF1|$0F:$EFE1:4C E4 EF JMP $EFE4 ; print one byte of menu text ; print one byte of menu text ; control flow target (from $ED49, $ED51, $ED5C, $EF87, $EFE1, $F0AE, $F332) 0x03EFF4|$0F:$EFE4:AD B4 60 LDA $60B4 ; menu phase (1 = first, 0 = second) 0x03EFF7|$0F:$EFE7:D0 2A BNE $F013 ; update menu current column and row; if it's first phase, skip ahead 0x03EFF9|$0F:$EFE9:AD 9F 60 LDA $609F ; menu current row 0x03EFFC|$0F:$EFEC:29 01 AND #$01 0x03EFFE|$0F:$EFEE:F0 03 BEQ $EFF3 0x03F000|$0F:$EFF0:AD A1 60 LDA $60A1 ; menu window width ; control flow target (from $EFEE) 0x03F003|$0F:$EFF3:18 CLC 0x03F004|$0F:$EFF4:6D 9E 60 ADC $609E ; menu current column 0x03F007|$0F:$EFF7:AA TAX 0x03F008|$0F:$EFF8:AD 9B 60 LDA $609B ; menu text 0x03F00B|$0F:$EFFB:9D 0B 60 STA $600B,X 0x03F00E|$0F:$EFFE:C9 76 CMP #$76 ; [left border] 0x03F010|$0F:$F000:B0 11 BCS $F013 ; update menu current column and row 0x03F012|$0F:$F002:BD 0A 60 LDA $600A,X 0x03F015|$0F:$F005:C9 77 CMP #$77 ; [top border] 0x03F017|$0F:$F007:D0 0A BNE $F013 ; update menu current column and row 0x03F019|$0F:$F009:AD 9E 60 LDA $609E ; menu current column 0x03F01C|$0F:$F00C:F0 05 BEQ $F013 ; update menu current column and row 0x03F01E|$0F:$F00E:A9 78 LDA #$78 ; [top border short] 0x03F020|$0F:$F010:9D 0A 60 STA $600A,X ; update menu current column and row ; control flow target (from $ED36, $EFE7, $F000, $F007, $F00C) 0x03F023|$0F:$F013:EE 9E 60 INC $609E ; menu current column 0x03F026|$0F:$F016:AD 9E 60 LDA $609E ; menu current column 0x03F029|$0F:$F019:CD A1 60 CMP $60A1 ; menu window width 0x03F02C|$0F:$F01C:90 0C BCC $F02A ; if current column < window width, nothing else to do here 0x03F02E|$0F:$F01E:A2 01 LDX #$01 ; otherwise set string length to #$01 (for the left border of the next row) 0x03F030|$0F:$F020:8E A0 60 STX $60A0 ; maximum string length 0x03F033|$0F:$F023:CA DEX ; and reset the current column to #$00 0x03F034|$0F:$F024:8E 9E 60 STX $609E ; menu current column 0x03F037|$0F:$F027:EE 9F 60 INC $609F ; menu current row ; control flow target (from $F01C) 0x03F03A|$0F:$F02A:60 RTS ; control flow target (from $EC1D) 0x03F03B|$0F:$F02B:AD 9F 60 LDA $609F ; menu current row 0x03F03E|$0F:$F02E:29 01 AND #$01 0x03F040|$0F:$F030:0D 9E 60 ORA $609E ; menu current column 0x03F043|$0F:$F033:D0 21 BNE $F056 0x03F045|$0F:$F035:AD B4 60 LDA $60B4 ; menu phase (1 = first, 0 = second) 0x03F048|$0F:$F038:D0 1C BNE $F056 0x03F04A|$0F:$F03A:AD A1 60 LDA $60A1 ; menu window width 0x03F04D|$0F:$F03D:4A LSR 0x03F04E|$0F:$F03E:09 10 ORA #$10 0x03F050|$0F:$F040:8D 7B 60 STA $607B 0x03F053|$0F:$F043:AD A4 60 LDA $60A4 ; menu window position (from ROM; X-pos = low nybble * 2, Y-pos = high nybble * 2) 0x03F056|$0F:$F046:8D 7C 60 STA $607C 0x03F059|$0F:$F049:18 CLC 0x03F05A|$0F:$F04A:69 10 ADC #$10 0x03F05C|$0F:$F04C:8D A4 60 STA $60A4 ; menu window position (from ROM; X-pos = low nybble * 2, Y-pos = high nybble * 2) 0x03F05F|$0F:$F04F:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03F062|$0F:$F052:C0 ; $06:$8000 ; data -> code 0x03F063|$0F:$F053:20 C1 F0 JSR $F0C1 ; write [space] to $600B-$6046 ; control flow target (from $F033, $F038) 0x03F066|$0F:$F056:60 RTS ; CLC if more menu rows to display, SEC otherwise ; control flow target (from $EC20) 0x03F067|$0F:$F057:AD 9F 60 LDA $609F ; menu current row 0x03F06A|$0F:$F05A:CD A3 60 CMP $60A3 ; menu window height (ROM value * 2) 0x03F06D|$0F:$F05D:60 RTS ; set $60A0 based on menu function parameter $609D and number of remaining tiles in the current line ; control flow target (from $ED33, $ED59) 0x03F06E|$0F:$F05E:AD 9D 60 LDA $609D ; menu function parameter 0x03F071|$0F:$F061:D0 02 BNE $F065 ; control codes #$80 and #$88 fill out the rest of the line, so default length to #$FF 0x03F073|$0F:$F063:A9 FF LDA #$FF ; control flow target (from $F061) 0x03F075|$0F:$F065:8D A0 60 STA $60A0 ; maximum string length 0x03F078|$0F:$F068:18 CLC 0x03F079|$0F:$F069:AD A1 60 LDA $60A1 ; menu window width 0x03F07C|$0F:$F06C:ED 9E 60 SBC $609E ; menu current column 0x03F07F|$0F:$F06F:90 08 BCC $F079 ; branch if we're already done this line 0x03F081|$0F:$F071:CD A0 60 CMP $60A0 ; maximum string length 0x03F084|$0F:$F074:B0 03 BCS $F079 ; if number of tiles remaining is less than string length, update string length 0x03F086|$0F:$F076:8D A0 60 STA $60A0 ; maximum string length ; control flow target (from $F06F, $F074) 0x03F089|$0F:$F079:60 RTS ; set maximum string length $60A0 to A and update menu function parameter $609D: if its bits 0-1 are both set, use $4A | bit 2 of $609D, else use the low 3 bits of $609D ; control flow target (from $ED67, $EDD5, $EE1A, $EE31, $EF9A) 0x03F08A|$0F:$F07A:8D A0 60 STA $60A0 ; maximum string length 0x03F08D|$0F:$F07D:AD 9D 60 LDA $609D ; menu function parameter 0x03F090|$0F:$F080:48 PHA 0x03F091|$0F:$F081:29 03 AND #$03 0x03F093|$0F:$F083:C9 03 CMP #$03 0x03F095|$0F:$F085:D0 02 BNE $F089 0x03F097|$0F:$F087:A5 4A LDA $4A ; control flow target (from $F085) 0x03F099|$0F:$F089:8D 9D 60 STA $609D ; menu function parameter 0x03F09C|$0F:$F08C:68 PLA 0x03F09D|$0F:$F08D:29 04 AND #$04 0x03F09F|$0F:$F08F:0D 9D 60 ORA $609D ; menu function parameter 0x03F0A2|$0F:$F092:8D 9D 60 STA $609D ; menu function parameter 0x03F0A5|$0F:$F095:60 RTS ; given hero ID in ID $609D, stat offset in X, and stat byte size in Y (max of #$03), print that stat in base 10 to current menu position, replacing leading zeroes with spaces ; control flow target (from $ED77, $EDEB, $EE21, $EFA1) 0x03F0A6|$0F:$F096:20 9C F0 JSR $F09C ; given hero ID in ID $609D, stat offset in X, and stat byte size in Y (max of #$03), print that stat's base 10 digits in reverse to $0100 up to maximum string length $60A0, replacing leading (trailing in reverse) zeroes with spaces 0x03F0A9|$0F:$F099:4C A5 F0 JMP $F0A5 ; print string at $0100 in reverse to current menu position ; given hero ID in ID $609D, stat offset in X, and stat byte size in Y (max of #$03), print that stat's base 10 digits in reverse to $0100 up to maximum string length $60A0, replacing leading (trailing in reverse) zeroes with spaces ; control flow target (from $F096) 0x03F0AC|$0F:$F09C:20 4A F1 JSR $F14A ; given stat offset in X and stat byte size in Y (max of #$03), copy that many bytes of hero ID $609D's stats to $10-$12 ; given a 24-bit number N in $10-$12, print its base 10 digits in reverse to $0100 up to maximum string length $60A0, replacing leading (trailing in reverse) zeroes with spaces ; control flow target (from $EE12, $EEE1) 0x03F0AF|$0F:$F09F:20 7C F1 JSR $F17C ; given a 24-bit number N in $10-$12, print its base 10 digits in reverse to $0100 up to maximum string length $60A0 0x03F0B2|$0F:$F0A2:4C 8D F1 JMP $F18D ; scan through $0100 + maximum string length $60A0 in reverse, replacing zeroes with spaces until the first non-zero or $0100 is reached; leaves X at most significant digit ; print string at $0100 in reverse to current menu position ; control flow target (from $EDA4, $EDAA, $EDBC, $EDFE, $EE15, $EE4A, $EE6D, $EE7F, $EEA0, $EEBA, $EEE4, $EF5C, $EFC6, $EFDE, $F099, $F0B4) 0x03F0B5|$0F:$F0A5:AE A0 60 LDX $60A0 ; maximum string length 0x03F0B8|$0F:$F0A8:BD FF 00 LDA $00FF,X ; built-in offset from string copy buffer start at $0100 0x03F0BB|$0F:$F0AB:8D 9B 60 STA $609B ; menu text 0x03F0BE|$0F:$F0AE:20 E4 EF JSR $EFE4 ; print one byte of menu text 0x03F0C1|$0F:$F0B1:CE A0 60 DEC $60A0 ; maximum string length 0x03F0C4|$0F:$F0B4:D0 EF BNE $F0A5 ; print string at $0100 in reverse to current menu position 0x03F0C6|$0F:$F0B6:60 RTS ; control flow target (from $EC25) 0x03F0C7|$0F:$F0B7:AD AA 60 LDA $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) 0x03F0CA|$0F:$F0BA:10 04 BPL $F0C0 0x03F0CC|$0F:$F0BC:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03F0CF|$0F:$F0BF:CC ; $06:$8018 ; data -> code ; control flow target (from $F0BA) 0x03F0D0|$0F:$F0C0:60 RTS ; write [space] to $600B-$6046 ; control flow target (from $EC29, $F053) 0x03F0D1|$0F:$F0C1:A9 5F LDA #$5F 0x03F0D3|$0F:$F0C3:A2 3B LDX #$3B ; control flow target (from $F0C9) 0x03F0D5|$0F:$F0C5:9D 0B 60 STA $600B,X 0x03F0D8|$0F:$F0C8:CA DEX 0x03F0D9|$0F:$F0C9:10 FA BPL $F0C5 0x03F0DB|$0F:$F0CB:60 RTS ; code -> data ; menu control code jump table low byte ; indexed data load target (from $ED21) 0x03F0DC|$0F:$F0CC:2E ; menu control code jump table high byte ; indexed data load target (from $ED26) 0x03F0DD|$0F:$F0CD: ED ; $0F:$ED2E; menu control code #$80-#$87 handler: print number of spaces specified by $609D (or rest of line if $609D is #$00) to current menu position 0x03F0DE|$0F:$F0CE:3F ED ; $0F:$ED3F; menu control code #$88-#$8F handler: print number of top border tiles specified by $609D (or rest of line if $609D is #$00) to current menu position, accounting for possible linked menu 0x03F0E0|$0F:$F0D0:65 ED ; $0F:$ED65; menu control code #$90-#$97 handler: print selected hero's current HP or MP 0x03F0E2|$0F:$F0D2:7A ED ; $0F:$ED7A; menu control code #$98-#$9F handler: print party gold or crests or "ADVENTURE LOG" 0x03F0E4|$0F:$F0D4:CC ED ; $0F:$EDCC; menu control code #$A0-#$A7 handler: print level of selected hero or Midenhall's level in current save file 0x03F0E6|$0F:$F0D6:18 EE ; $0F:$EE18; menu control code #$A8-#$AF handler: print selected hero's current EXP 0x03F0E8|$0F:$F0D8:24 EE ; $0F:$EE24; menu control code #$B0-#$B7 handler: print selected hero's short name, current hero's full name, or Midenhall's short name from selected save game 0x03F0EA|$0F:$F0DA:82 EE ; $0F:$EE82; menu control code #$B8-#$BF handler: print various item names based on menu format 0x03F0EC|$0F:$F0DC:AF EE ; $0F:$EEAF; menu control code #$C0-#$C7 handler: draw spell name stuff 0x03F0EE|$0F:$F0DE:C1 EE ; $0F:$EEC1; menu control code #$C8-#$CF handler: draw item price stuff 0x03F0F0|$0F:$F0E0:E7 EE ; $0F:$EEE7; menu control code #$D0-#$D7 handler: start lists 0x03F0F2|$0F:$F0E2:8E EF ; $0F:$EF8E; menu control code #$D8-#$DF handler: print selected stat 0x03F0F4|$0F:$F0E4:A4 EF ; $0F:$EFA4; menu control code #$E0-#$E7 handler: draw monster text stuff 0x03F0F6|$0F:$F0E6:37 EF ; $0F:$EF37; menu control code #$E8-#$EF handler: repeat/end list and full save name handlers 0x03F0F8|$0F:$F0E8:E1 EF ; $0F:$EFE1; menu control code #$F0-#$FF + text handler: print one byte of menu text to current position 0x03F0FA|$0F:$F0EA:E1 EF ; $0F:$EFE1; menu control code #$F0-#$FF + text handler: print one byte of menu text to current position 0x03F0FC|$0F:$F0EC:E1 EF ; $0F:$EFE1; menu control code #$F0-#$FF + text handler: print one byte of menu text to current position ; stat offsets ; indexed data load target (from $EF91) 0x03F0FE|$0F:$F0EE:09 ; Strength 0x03F0FF|$0F:$F0EF:0A ; Agility 0x03F100|$0F:$F0F0:0B ; Attack Power 0x03F101|$0F:$F0F1:0C ; Defence Power 0x03F102|$0F:$F0F2:03 ; Max HP, low byte 0x03F103|$0F:$F0F3:05 ; Max MP ; data -> code ; 16-bit multiplication: set 16-bit ($00,X-$01,X) = ($00,X-$01,X) * A ; control flow target (from $FDAC) ; external control flow target (from $06:$B2A8) 0x03F104|$0F:$F0F4:8D 84 60 STA $6084 0x03F107|$0F:$F0F7:A9 00 LDA #$00 0x03F109|$0F:$F0F9:8D 85 60 STA $6085 0x03F10C|$0F:$F0FC:8D 86 60 STA $6086 ; control flow target (from $F11C) 0x03F10F|$0F:$F0FF:4E 84 60 LSR $6084 0x03F112|$0F:$F102:90 11 BCC $F115 0x03F114|$0F:$F104:B5 00 LDA $00,X 0x03F116|$0F:$F106:18 CLC 0x03F117|$0F:$F107:6D 85 60 ADC $6085 0x03F11A|$0F:$F10A:8D 85 60 STA $6085 0x03F11D|$0F:$F10D:B5 01 LDA $01,X 0x03F11F|$0F:$F10F:6D 86 60 ADC $6086 0x03F122|$0F:$F112:8D 86 60 STA $6086 ; control flow target (from $F102) 0x03F125|$0F:$F115:16 00 ASL $00,X 0x03F127|$0F:$F117:36 01 ROL $01,X 0x03F129|$0F:$F119:AD 84 60 LDA $6084 0x03F12C|$0F:$F11C:D0 E1 BNE $F0FF 0x03F12E|$0F:$F11E:AD 85 60 LDA $6085 0x03F131|$0F:$F121:95 00 STA $00,X 0x03F133|$0F:$F123:AD 86 60 LDA $6086 0x03F136|$0F:$F126:95 01 STA $01,X 0x03F138|$0F:$F128:60 RTS ; given a 24-bit number N in $10-$12, set $10-$12 to quotient of N / 10 and $13 to the remainder of N / 10, i.e. for base 10 N, $13 = the low digit, $10-$12 = the high digits ; control flow target (from $F17E) 0x03F139|$0F:$F129:8A TXA ; save X on the stack 0x03F13A|$0F:$F12A:48 PHA 0x03F13B|$0F:$F12B:A9 00 LDA #$00 0x03F13D|$0F:$F12D:85 13 STA $13 ; initialize remainder to #$00 0x03F13F|$0F:$F12F:A2 18 LDX #$18 ; we're wokring with 24-bit input ; control flow target (from $F145) 0x03F141|$0F:$F131:06 10 ASL $10 ; ASL 24-bit value into $13 0x03F143|$0F:$F133:26 11 ROL $11 0x03F145|$0F:$F135:26 12 ROL $12 0x03F147|$0F:$F137:26 13 ROL $13 0x03F149|$0F:$F139:38 SEC 0x03F14A|$0F:$F13A:A5 13 LDA $13 0x03F14C|$0F:$F13C:E9 0A SBC #$0A ; converting to base 10 0x03F14E|$0F:$F13E:90 04 BCC $F144 ; if remainder < 10, nothing else to do 0x03F150|$0F:$F140:85 13 STA $13 ; reduce remainder by 10 0x03F152|$0F:$F142:E6 10 INC $10 ; set quotient bit for next call to $F129 ; control flow target (from $F13E) 0x03F154|$0F:$F144:CA DEX 0x03F155|$0F:$F145:D0 EA BNE $F131 ; keep looping until we've gone through all 24 original bits 0x03F157|$0F:$F147:68 PLA ; restore X from the stack 0x03F158|$0F:$F148:AA TAX 0x03F159|$0F:$F149:60 RTS ; given stat offset in X and stat byte size in Y (max of #$03), copy that many bytes of hero ID $609D's stats to $10-$12 ; control flow target (from $EDDC, $F09C) 0x03F15A|$0F:$F14A:86 10 STX $10 0x03F15C|$0F:$F14C:8C 84 60 STY $6084 0x03F15F|$0F:$F14F:A9 00 LDA #$00 ; useless op 0x03F161|$0F:$F151:AD 9D 60 LDA $609D ; menu function parameter 0x03F164|$0F:$F154:29 03 AND #$03 ; hero ID 0x03F166|$0F:$F156:AA TAX 0x03F167|$0F:$F157:F0 08 BEQ $F161 ; if Midenhall, no need to adjust offsets 0x03F169|$0F:$F159:A9 00 LDA #$00 ; update offset into hero data based on hero ID ; control flow target (from $F15F) 0x03F16B|$0F:$F15B:18 CLC 0x03F16C|$0F:$F15C:69 12 ADC #$12 ; hero data is #$12 bytes each 0x03F16E|$0F:$F15E:CA DEX 0x03F16F|$0F:$F15F:D0 FA BNE $F15B ; control flow target (from $F157) 0x03F171|$0F:$F161:18 CLC 0x03F172|$0F:$F162:65 10 ADC $10 ; desired stat offset 0x03F174|$0F:$F164:AA TAX 0x03F175|$0F:$F165:A9 00 LDA #$00 ; initialize $10-$12 and Y to #$00 0x03F177|$0F:$F167:85 10 STA $10 0x03F179|$0F:$F169:85 11 STA $11 0x03F17B|$0F:$F16B:85 12 STA $12 0x03F17D|$0F:$F16D:A8 TAY ; control flow target (from $F179) 0x03F17E|$0F:$F16E:BD 2D 06 LDA $062D,X ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03F181|$0F:$F171:99 10 00 STA $0010,Y 0x03F184|$0F:$F174:E8 INX 0x03F185|$0F:$F175:C8 INY 0x03F186|$0F:$F176:CC 84 60 CPY $6084 0x03F189|$0F:$F179:D0 F3 BNE $F16E 0x03F18B|$0F:$F17B:60 RTS ; given a 24-bit number N in $10-$12, print its base 10 digits in reverse to $0100 up to maximum string length $60A0 ; control flow target (from $EFDB, $F09F, $F48C) ; external control flow target (from $02:$BE4A) 0x03F18C|$0F:$F17C:A0 00 LDY #$00 ; control flow target (from $F18A) 0x03F18E|$0F:$F17E:20 29 F1 JSR $F129 ; given a 24-bit number N in $10-$12, set $10-$12 to quotient of N / 10 and $13 to the remainder of N / 10, i.e. for base 10 N, $13 = the low digit, $10-$12 = the high digits 0x03F191|$0F:$F181:A5 13 LDA $13 ; remainder 0x03F193|$0F:$F183:99 00 01 STA $0100,Y ; string copy buffer start (often referenced as $00FF,X) 0x03F196|$0F:$F186:C8 INY 0x03F197|$0F:$F187:CC A0 60 CPY $60A0 ; maximum string length 0x03F19A|$0F:$F18A:D0 F2 BNE $F17E ; if more digits to print, keep printing 0x03F19C|$0F:$F18C:60 RTS ; scan through $0100 + maximum string length $60A0 in reverse, replacing zeroes with spaces until the first non-zero or $0100 is reached; leaves X at most significant digit ; control flow target (from $F0A2, $F48F) ; external control flow target (from $02:$BE4D) 0x03F19D|$0F:$F18D:AE A0 60 LDX $60A0 ; maximum string length 0x03F1A0|$0F:$F190:CA DEX ; control flow target (from $F19C) 0x03F1A1|$0F:$F191:BD 00 01 LDA $0100,X ; string copy buffer start (often referenced as $00FF,X) 0x03F1A4|$0F:$F194:D0 08 BNE $F19E 0x03F1A6|$0F:$F196:A9 5F LDA #$5F 0x03F1A8|$0F:$F198:9D 00 01 STA $0100,X ; string copy buffer start (often referenced as $00FF,X) 0x03F1AB|$0F:$F19B:CA DEX 0x03F1AC|$0F:$F19C:D0 F3 BNE $F191 ; control flow target (from $F194) 0x03F1AE|$0F:$F19E:60 RTS ; initialize string buffer $0100-$010C with [space]s ; control flow target (from $ED88, $EEC1, $F2F0, $F3A0, $F3D7) 0x03F1AF|$0F:$F19F:48 PHA 0x03F1B0|$0F:$F1A0:8A TXA 0x03F1B1|$0F:$F1A1:48 PHA 0x03F1B2|$0F:$F1A2:A2 0C LDX #$0C 0x03F1B4|$0F:$F1A4:A9 5F LDA #$5F ; [space] ; control flow target (from $F1AA) 0x03F1B6|$0F:$F1A6:9D 00 01 STA $0100,X ; string copy buffer start (often referenced as $00FF,X) 0x03F1B9|$0F:$F1A9:CA DEX 0x03F1BA|$0F:$F1AA:10 FA BPL $F1A6 0x03F1BC|$0F:$F1AC:68 PLA 0x03F1BD|$0F:$F1AD:AA TAX 0x03F1BE|$0F:$F1AE:68 PLA 0x03F1BF|$0F:$F1AF:60 RTS ; given a hero ID in $4A, set A and X to hero ID * 8, a.k.a. offset for start of hero's inventory ; control flow target (from $F1B7, $F22D) ; external control flow target (from $06:$AE05) 0x03F1C0|$0F:$F1B0:A5 4A LDA $4A 0x03F1C2|$0F:$F1B2:0A ASL 0x03F1C3|$0F:$F1B3:0A ASL 0x03F1C4|$0F:$F1B4:0A ASL 0x03F1C5|$0F:$F1B5:AA TAX 0x03F1C6|$0F:$F1B6:60 RTS ; given hero ID in $4A and item type in $609D, set A = number of items of desired type in hero's inventory ; control flow target (from $EC5E, $EF06, $F4B7, $F5C3, $F605) 0x03F1C7|$0F:$F1B7:20 B0 F1 JSR $F1B0 ; given a hero ID in $4A, set A and X to hero ID * 8, a.k.a. offset for start of hero's inventory 0x03F1CA|$0F:$F1BA:A0 00 LDY #$00 0x03F1CC|$0F:$F1BC:84 10 STY $10 ; number of items in hero's inventory ; control flow target (from $F1D1) 0x03F1CE|$0F:$F1BE:BD 00 06 LDA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x03F1D1|$0F:$F1C1:F0 0A BEQ $F1CD ; branch if no item 0x03F1D3|$0F:$F1C3:20 D6 F1 JSR $F1D6 ; determine item type (#$00 = weapon, #$01 = armour, #$02 = shield, #$03 = helmet, #$04 = menu function wants all items or item is non-equipment, #$05 = menu format wants equipped items only and item not equipped) 0x03F1D6|$0F:$F1C6:CD 9D 60 CMP $609D ; menu function parameter 0x03F1D9|$0F:$F1C9:D0 02 BNE $F1CD ; branch if wrong type of item 0x03F1DB|$0F:$F1CB:E6 10 INC $10 ; number of items of desired type in hero's inventory ; control flow target (from $F1C1, $F1C9) 0x03F1DD|$0F:$F1CD:E8 INX ; increment total inventory offset 0x03F1DE|$0F:$F1CE:C8 INY ; increment hero inventory offset 0x03F1DF|$0F:$F1CF:C0 08 CPY #$08 ; 8 inventory slots per hero 0x03F1E1|$0F:$F1D1:D0 EB BNE $F1BE ; if more inventory to check, check it 0x03F1E3|$0F:$F1D3:A5 10 LDA $10 ; number of items of desired type in hero's inventory 0x03F1E5|$0F:$F1D5:60 RTS ; determine item type (#$00 = weapon, #$01 = armour, #$02 = shield, #$03 = helmet, #$04 = menu function wants all items or item is non-equipment, #$05 = menu format wants equipped items only and item not equipped) ; control flow target (from $F1C3, $F235) ; external control flow target (from $06:$AE10) 0x03F1E6|$0F:$F1D6:48 PHA ; item ID 0x03F1E7|$0F:$F1D7:AD AA 60 LDA $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) 0x03F1EA|$0F:$F1DA:29 02 AND #$02 0x03F1EC|$0F:$F1DC:F0 06 BEQ $F1E4 0x03F1EE|$0F:$F1DE:68 PLA ; item ID 0x03F1EF|$0F:$F1DF:48 PHA ; item ID 0x03F1F0|$0F:$F1E0:29 40 AND #$40 ; #$40 => equipped 0x03F1F2|$0F:$F1E2:F0 21 BEQ $F205 ; item is not equipped ; control flow target (from $F1DC) 0x03F1F4|$0F:$F1E4:AD 9D 60 LDA $609D ; menu function parameter 0x03F1F7|$0F:$F1E7:C9 04 CMP #$04 ; #$04 => count all items as non-equipment 0x03F1F9|$0F:$F1E9:F0 2A BEQ $F215 ; item is non-equipment 0x03F1FB|$0F:$F1EB:68 PLA ; item ID 0x03F1FC|$0F:$F1EC:29 3F AND #$3F ; strip off equipped bit 0x03F1FE|$0F:$F1EE:C9 00 CMP #$00 ; no item 0x03F200|$0F:$F1F0:F0 24 BEQ $F216 0x03F202|$0F:$F1F2:C9 11 CMP #$11 ; first armour ID 0x03F204|$0F:$F1F4:90 13 BCC $F209 ; item is a weapon 0x03F206|$0F:$F1F6:C9 1C CMP #$1C ; first shield ID 0x03F208|$0F:$F1F8:90 12 BCC $F20C ; item is an armour 0x03F20A|$0F:$F1FA:C9 21 CMP #$21 ; first helmet ID 0x03F20C|$0F:$F1FC:90 11 BCC $F20F ; item is a shield 0x03F20E|$0F:$F1FE:C9 24 CMP #$24 ; first non-equipment item ID 0x03F210|$0F:$F200:90 10 BCC $F212 ; item is a helmet 0x03F212|$0F:$F202:A9 04 LDA #$04 ; item is non-equipment 0x03F214|$0F:$F204:60 RTS ; item is not equipped ; control flow target (from $F1E2) 0x03F215|$0F:$F205:68 PLA 0x03F216|$0F:$F206:A9 05 LDA #$05 0x03F218|$0F:$F208:60 RTS ; item is a weapon ; control flow target (from $F1F4) 0x03F219|$0F:$F209:A9 00 LDA #$00 0x03F21B|$0F:$F20B:60 RTS ; item is an armour ; control flow target (from $F1F8) 0x03F21C|$0F:$F20C:A9 01 LDA #$01 0x03F21E|$0F:$F20E:60 RTS ; item is a shield ; control flow target (from $F1FC) 0x03F21F|$0F:$F20F:A9 02 LDA #$02 0x03F221|$0F:$F211:60 RTS ; item is a helmet ; control flow target (from $F200) 0x03F222|$0F:$F212:A9 03 LDA #$03 0x03F224|$0F:$F214:60 RTS ; item is non-equipment ; control flow target (from $F1E9) 0x03F225|$0F:$F215:68 PLA ; control flow target (from $F1F0) 0x03F226|$0F:$F216:A9 04 LDA #$04 0x03F228|$0F:$F218:60 RTS ; return the $60AC'th item of item type $609D in A and the party inventory index of that item in X, or #$00 in A and #$FF in X if no such item exists; also sets $60BA,X to #$FF if found and #$00 otherwise ; control flow target (from $EE9A) 0x03F229|$0F:$F219:AD AC 60 LDA $60AC ; menu list index 0x03F22C|$0F:$F21C:29 03 AND #$03 0x03F22E|$0F:$F21E:AA TAX 0x03F22F|$0F:$F21F:A9 FF LDA #$FF 0x03F231|$0F:$F221:9D BA 60 STA $60BA,X 0x03F234|$0F:$F224:AD AC 60 LDA $60AC ; menu list index 0x03F237|$0F:$F227:29 07 AND #$07 0x03F239|$0F:$F229:85 10 STA $10 0x03F23B|$0F:$F22B:E6 10 INC $10 0x03F23D|$0F:$F22D:20 B0 F1 JSR $F1B0 ; given a hero ID in $4A, set A and X to hero ID * 8, a.k.a. offset for start of hero's inventory ; control flow target (from $F245) 0x03F240|$0F:$F230:BD 00 06 LDA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x03F243|$0F:$F233:F0 12 BEQ $F247 0x03F245|$0F:$F235:20 D6 F1 JSR $F1D6 ; determine item type (#$00 = weapon, #$01 = armour, #$02 = shield, #$03 = helmet, #$04 = menu function wants all items or item is non-equipment, #$05 = menu format wants equipped items only and item not equipped) 0x03F248|$0F:$F238:CD 9D 60 CMP $609D ; menu function parameter 0x03F24B|$0F:$F23B:D0 04 BNE $F241 0x03F24D|$0F:$F23D:C6 10 DEC $10 0x03F24F|$0F:$F23F:F0 13 BEQ $F254 ; control flow target (from $F23B) 0x03F251|$0F:$F241:E8 INX 0x03F252|$0F:$F242:8A TXA 0x03F253|$0F:$F243:29 07 AND #$07 0x03F255|$0F:$F245:D0 E9 BNE $F230 ; control flow target (from $F233) 0x03F257|$0F:$F247:AD AC 60 LDA $60AC ; menu list index 0x03F25A|$0F:$F24A:29 03 AND #$03 0x03F25C|$0F:$F24C:AA TAX 0x03F25D|$0F:$F24D:A9 00 LDA #$00 0x03F25F|$0F:$F24F:9D BA 60 STA $60BA,X 0x03F262|$0F:$F252:A2 FF LDX #$FF ; control flow target (from $F23F) 0x03F264|$0F:$F254:60 RTS ; given shop ID in $60AF and menu list index in $60AC, set A to the corresponding item ID and X to the number of items in the shop ; control flow target (from $EEF6) 0x03F265|$0F:$F255:20 61 F7 JSR $F761 ; load ROM bank #$06 0x03F268|$0F:$F258:AD AF 60 LDA $60AF ; shop ID 0x03F26B|$0F:$F25B:0A ASL 0x03F26C|$0F:$F25C:85 10 STA $10 0x03F26E|$0F:$F25E:0A ASL 0x03F26F|$0F:$F25F:65 10 ADC $10 ; A = A * 6; 6 items per shop 0x03F271|$0F:$F261:A8 TAY 0x03F272|$0F:$F262:84 10 STY $10 ; start of shop's inventory list 0x03F274|$0F:$F264:A2 00 LDX #$00 ; number of items in shop ; control flow target (from $F26F) 0x03F276|$0F:$F266:B9 8A 9F LDA $9F8A,Y ; Weapon Shop inventories 0x03F279|$0F:$F269:F0 06 BEQ $F271 ; #$00 marks the end of shop's item list 0x03F27B|$0F:$F26B:E8 INX 0x03F27C|$0F:$F26C:C8 INY 0x03F27D|$0F:$F26D:E0 06 CPX #$06 ; 6 items per shop 0x03F27F|$0F:$F26F:D0 F5 BNE $F266 ; if more items to check, check them ; control flow target (from $F269) 0x03F281|$0F:$F271:AD AC 60 LDA $60AC ; menu list index 0x03F284|$0F:$F274:18 CLC 0x03F285|$0F:$F275:65 10 ADC $10 ; start of shop's inventory list 0x03F287|$0F:$F277:A8 TAY ; selected item 0x03F288|$0F:$F278:B9 8A 9F LDA $9F8A,Y ; Weapon Shop inventories 0x03F28B|$0F:$F27B:60 RTS ; given shop ID in $60AF and menu list index in $60AC, set A to the corresponding item ID ; control flow target (from $F62F) 0x03F28C|$0F:$F27C:4C 89 F2 JMP $F289 ; given shop ID in $60AF and menu list index in $60AC, set A to the corresponding item ID ; given shop ID in $60AF and menu list index in $60AC, set A to the corresponding item ID or #$00 if it's the Jailor's Key ; control flow target (from $EEA6) 0x03F28F|$0F:$F27F:20 89 F2 JSR $F289 ; given shop ID in $60AF and menu list index in $60AC, set A to the corresponding item ID 0x03F292|$0F:$F282:C9 39 CMP #$39 ; Item ID #$39: Jailor’s Key 0x03F294|$0F:$F284:D0 02 BNE $F288 ; if Jailor's Key, display [blank] instead 0x03F296|$0F:$F286:A9 00 LDA #$00 ; control flow target (from $F284) 0x03F298|$0F:$F288:60 RTS ; given shop ID in $60AF and menu list index in $60AC, set A to the corresponding item ID ; control flow target (from $F27C, $F27F) 0x03F299|$0F:$F289:20 61 F7 JSR $F761 ; load ROM bank #$06 0x03F29C|$0F:$F28C:AD AF 60 LDA $60AF ; shop ID 0x03F29F|$0F:$F28F:0A ASL 0x03F2A0|$0F:$F290:85 10 STA $10 0x03F2A2|$0F:$F292:0A ASL 0x03F2A3|$0F:$F293:65 10 ADC $10 ; A = A * 6; 6 items per shop 0x03F2A5|$0F:$F295:6D AC 60 ADC $60AC ; menu list index 0x03F2A8|$0F:$F298:AA TAX 0x03F2A9|$0F:$F299:BD 8A 9F LDA $9F8A,X ; Weapon Shop inventories 0x03F2AC|$0F:$F29C:60 RTS ; given party inventory offset in X, print name of that item ID to $0100 in reverse; depending on settings, possibly update menu's [left border] to [left border, equipped] ; control flow target (from $EE9D) 0x03F2AD|$0F:$F29D:20 F0 F2 JSR $F2F0 ; initialize string buffer $0100-$010C with [space]s, set maximum string length to #$0B if we're dealing with the second segment 0x03F2B0|$0F:$F2A0:E0 FF CPX #$FF 0x03F2B2|$0F:$F2A2:F0 4B BEQ $F2EF 0x03F2B4|$0F:$F2A4:BD 00 06 LDA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) ; print name of item ID in A to $0100 in reverse; depending on settings, possibly update menu's [left border] to [left border, equipped] ; control flow target (from $EEA9) ; external control flow target (from $02:$BE95) 0x03F2B7|$0F:$F2A7:8D AD 60 STA $60AD ; item ID 0x03F2BA|$0F:$F2AA:29 40 AND #$40 ; pick out the equipped bit 0x03F2BC|$0F:$F2AC:F0 06 BEQ $F2B4 ; skip ahead if item is not equipped 0x03F2BE|$0F:$F2AE:AD AC 60 LDA $60AC ; menu list index 0x03F2C1|$0F:$F2B1:8D B9 60 STA $60B9 ; control flow target (from $F2AC) 0x03F2C4|$0F:$F2B4:20 F0 F2 JSR $F2F0 ; initialize string buffer $0100-$010C with [space]s, set maximum string length to #$0B if we're dealing with the second segment 0x03F2C7|$0F:$F2B7:AD AB 60 LDA $60AB ; which list segment we're dealing with 0x03F2CA|$0F:$F2BA:29 01 AND #$01 ; pretty sure the only options are 0 and 1, so this seems useless 0x03F2CC|$0F:$F2BC:F0 02 BEQ $F2C0 ; if 0, use 0 0x03F2CE|$0F:$F2BE:A9 01 LDA #$01 ; else use 1 (... but it already was 1) ; control flow target (from $F2BC) 0x03F2D0|$0F:$F2C0:A8 TAY ; set item pointer list index 0x03F2D1|$0F:$F2C1:AD AD 60 LDA $60AD ; item ID 0x03F2D4|$0F:$F2C4:48 PHA ; item ID 0x03F2D5|$0F:$F2C5:29 40 AND #$40 ; pick out the equipped bit 0x03F2D7|$0F:$F2C7:F0 1B BEQ $F2E4 ; if not equipped, skip ahead 0x03F2D9|$0F:$F2C9:AD AA 60 LDA $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) 0x03F2DC|$0F:$F2CC:4A LSR 0x03F2DD|$0F:$F2CD:90 15 BCC $F2E4 ; if not replacing [left border] with [left border, equipped], skip ahead 0x03F2DF|$0F:$F2CF:AD AB 60 LDA $60AB ; which list segment we're dealing with 0x03F2E2|$0F:$F2D2:4A LSR 0x03F2E3|$0F:$F2D3:B0 0F BCS $F2E4 ; if not dealing with list segmetn 1, skip ahead 0x03F2E5|$0F:$F2D5:A9 00 LDA #$00 ; otherwise reset current column 0x03F2E7|$0F:$F2D7:8D 9E 60 STA $609E ; menu current column 0x03F2EA|$0F:$F2DA:A9 8B LDA #$8B ; [left border, equipped] 0x03F2EC|$0F:$F2DC:20 2F F3 JSR $F32F ; print A to menu 0x03F2EF|$0F:$F2DF:A9 5F LDA #$5F ; [space] 0x03F2F1|$0F:$F2E1:20 2F F3 JSR $F32F ; print A to menu ; control flow target (from $F2C7, $F2CD, $F2D3) 0x03F2F4|$0F:$F2E4:68 PLA ; item ID 0x03F2F5|$0F:$F2E5:29 3F AND #$3F ; strip off the equipped bit 0x03F2F7|$0F:$F2E7:8D AD 60 STA $60AD ; item ID 0x03F2FA|$0F:$F2EA:F0 03 BEQ $F2EF ; if no item, just RTS 0x03F2FC|$0F:$F2EC:20 FF F2 JSR $F2FF ; given item ID in A, print name of item to $0100 in reverse ; control flow target (from $F2A2, $F2EA) 0x03F2FF|$0F:$F2EF:60 RTS ; initialize string buffer $0100-$010C with [space]s, set maximum string length to #$0B if we're dealing with the second segment ; control flow target (from $F29D, $F2B4) 0x03F300|$0F:$F2F0:20 9F F1 JSR $F19F ; initialize string buffer $0100-$010C with [space]s 0x03F303|$0F:$F2F3:AD AB 60 LDA $60AB ; which list segment we're dealing with 0x03F306|$0F:$F2F6:4A LSR 0x03F307|$0F:$F2F7:90 05 BCC $F2FE ; if first segment, skip ahead 0x03F309|$0F:$F2F9:A9 0B LDA #$0B ; max length of second segment 0x03F30B|$0F:$F2FB:8D A0 60 STA $60A0 ; maximum string length ; control flow target (from $F2F7) 0x03F30E|$0F:$F2FE:60 RTS ; given item ID in A, print name of item to $0100 in reverse ; control flow target (from $F2EC) 0x03F30F|$0F:$F2FF:48 PHA ; item ID 0x03F310|$0F:$F300:C9 21 CMP #$21 ; split point for item list pointers 0x03F312|$0F:$F302:90 06 BCC $F30A ; if < #$21, use the first set of pointers 0x03F314|$0F:$F304:68 PLA ; item ID 0x03F315|$0F:$F305:E9 20 SBC #$20 ; adjust item ID for second set of pointers; note that C is set since we got here by not taking BCC 0x03F317|$0F:$F307:C8 INY ; pointer address += 2 0x03F318|$0F:$F308:C8 INY 0x03F319|$0F:$F309:48 PHA ; item ID within list segment ; control flow target (from $F302) 0x03F31A|$0F:$F30A:B9 16 F3 LDA $F316,Y ; item list bank/pointers 0x03F31D|$0F:$F30D:20 E2 F3 JSR $F3E2 ; parse bank/pointer indices from A, load desired bank, set $57-$58 to desired pointer value 0x03F320|$0F:$F310:68 PLA ; item ID within list segment 0x03F321|$0F:$F311:F0 07 BEQ $F31A ; load bank specified by $60D7 (set by last call to $F3E2) 0x03F323|$0F:$F313:4C F8 F3 JMP $F3F8 ; find desired list item A (one-based) in ($57), copy it to $0100 (referenced as $00FF,X) in reverse; set Y to length of string copied, then load bank specified by $60D7 (set by last call to $F3E2) ; code -> data ; item list bank/pointers ; indexed data load target (from $F30A) 0x03F326|$0F:$F316:D1 ; $06:$8022; -> $06:$B2CA: Item list part 1, line 1 0x03F327|$0F:$F317:D2 ; $06:$8024; -> $06:$B4B2: Item list part 1, line 2 0x03F328|$0F:$F318:D8 ; $06:$8030; -> $06:$B3BE: Item list part 2, line 1 0x03F329|$0F:$F319:D9 ; $06:$8032; -> $06:$B57C: Item list part 2, line 2 ; data -> code ; load bank specified by $60D7 (set by last call to $F3E2) ; control flow target (from $F311, $F3FB) 0x03F32A|$0F:$F31A:48 PHA 0x03F32B|$0F:$F31B:AD D7 60 LDA $60D7 ; backup copy of current bank set by calls to $F3E2; used by $F31A 0x03F32E|$0F:$F31E:4C 82 F7 JMP $F782 ; load bank specified by A then PLA ; toggle list segment $60AB; if list segment becomes #$01, INC menu list index $60AC ; control flow target (from $EEA3, $EFC9) 0x03F331|$0F:$F321:AD AB 60 LDA $60AB ; which list segment we're dealing with 0x03F334|$0F:$F324:49 01 EOR #$01 0x03F336|$0F:$F326:D0 03 BNE $F32B 0x03F338|$0F:$F328:EE AC 60 INC $60AC ; menu list index ; control flow target (from $F326) 0x03F33B|$0F:$F32B:8D AB 60 STA $60AB ; which list segment we're dealing with 0x03F33E|$0F:$F32E:60 RTS ; print A to menu ; control flow target (from $F2DC, $F2E1) 0x03F33F|$0F:$F32F:8D 9B 60 STA $609B ; menu text 0x03F342|$0F:$F332:4C E4 EF JMP $EFE4 ; print one byte of menu text ; control flow target (from $EEB4) 0x03F345|$0F:$F335:AE AC 60 LDX $60AC ; menu list index 0x03F348|$0F:$F338:A9 FF LDA #$FF 0x03F34A|$0F:$F33A:9D BA 60 STA $60BA,X 0x03F34D|$0F:$F33D:AD 9D 60 LDA $609D ; menu function parameter 0x03F350|$0F:$F340:0A ASL ; A is either #$00 (battle spells) or #$01 (field spells), so this is either #$00 or #$02 0x03F351|$0F:$F341:65 4A ADC $4A ; hero ID - 1 0x03F353|$0F:$F343:AA TAX 0x03F354|$0F:$F344:BD 18 06 LDA $0618,X ; Cannock's learned battle spell list 0x03F357|$0F:$F347:85 10 STA $10 ; selected hero's learned spell list 0x03F359|$0F:$F349:A9 80 LDA #$80 0x03F35B|$0F:$F34B:85 11 STA $11 0x03F35D|$0F:$F34D:AD AC 60 LDA $60AC ; menu list index 0x03F360|$0F:$F350:AE 9D 60 LDX $609D ; menu function parameter 0x03F363|$0F:$F353:D0 05 BNE $F35A ; branch if field spells 0x03F365|$0F:$F355:4A LSR 0x03F366|$0F:$F356:A2 88 LDX #$88 0x03F368|$0F:$F358:86 11 STX $11 ; control flow target (from $F353) 0x03F36A|$0F:$F35A:AA TAX ; control flow target (from $F360) 0x03F36B|$0F:$F35B:CA DEX 0x03F36C|$0F:$F35C:30 04 BMI $F362 0x03F36E|$0F:$F35E:46 11 LSR $11 0x03F370|$0F:$F360:90 F9 BCC $F35B ; control flow target (from $F35C) 0x03F372|$0F:$F362:AD 9D 60 LDA $609D ; menu function parameter 0x03F375|$0F:$F365:29 01 AND #$01 0x03F377|$0F:$F367:D0 0D BNE $F376 ; branch if field spells 0x03F379|$0F:$F369:AD AC 60 LDA $60AC ; menu list index 0x03F37C|$0F:$F36C:29 01 AND #$01 0x03F37E|$0F:$F36E:AA TAX 0x03F37F|$0F:$F36F:BD 9D F3 LDA $F39D,X 0x03F382|$0F:$F372:25 11 AND $11 0x03F384|$0F:$F374:85 11 STA $11 ; control flow target (from $F367) 0x03F386|$0F:$F376:A5 10 LDA $10 ; selected hero's learned spell list 0x03F388|$0F:$F378:25 11 AND $11 0x03F38A|$0F:$F37A:F0 16 BEQ $F392 0x03F38C|$0F:$F37C:A5 4A LDA $4A ; hero ID - 1 0x03F38E|$0F:$F37E:0A ASL 0x03F38F|$0F:$F37F:0A ASL 0x03F390|$0F:$F380:0A ASL 0x03F391|$0F:$F381:0A ASL 0x03F392|$0F:$F382:48 PHA 0x03F393|$0F:$F383:AD 9D 60 LDA $609D ; menu function parameter 0x03F396|$0F:$F386:0A ASL 0x03F397|$0F:$F387:0A ASL 0x03F398|$0F:$F388:0A ASL 0x03F399|$0F:$F389:85 12 STA $12 0x03F39B|$0F:$F38B:68 PLA 0x03F39C|$0F:$F38C:65 12 ADC $12 0x03F39E|$0F:$F38E:6D AC 60 ADC $60AC ; menu list index 0x03F3A1|$0F:$F391:60 RTS ; control flow target (from $F37A) 0x03F3A2|$0F:$F392:A9 00 LDA #$00 0x03F3A4|$0F:$F394:AE AC 60 LDX $60AC ; menu list index 0x03F3A7|$0F:$F397:9D BA 60 STA $60BA,X 0x03F3AA|$0F:$F39A:A9 FF LDA #$FF 0x03F3AC|$0F:$F39C:60 RTS ; code -> data ; indexed data load target (from $F36F) 0x03F3AD|$0F:$F39D:F0 0x03F3AE|$0F:$F39E:0F ; data -> code ; given spell name index in A, print spell name to $0100 in reverse, set Y to length of string copied, then load bank specified by $60D7 (set by last call to $F3E2) ; control flow target (from $EEB7) ; external control flow target (from $02:$BEA5) 0x03F3AF|$0F:$F39F:48 PHA ; spell name index 0x03F3B0|$0F:$F3A0:20 9F F1 JSR $F19F ; initialize string buffer $0100-$010C with [space]s 0x03F3B3|$0F:$F3A3:68 PLA ; spell name index 0x03F3B4|$0F:$F3A4:85 10 STA $10 ; spell name index 0x03F3B6|$0F:$F3A6:C9 FF CMP #$FF 0x03F3B8|$0F:$F3A8:F0 0C BEQ $F3B6 ; #$FF => not a real spell 0x03F3BA|$0F:$F3AA:A9 D3 LDA #$D3 ; spell list bank/pointer 0x03F3BC|$0F:$F3AC:20 E2 F3 JSR $F3E2 ; parse bank/pointer indices from A, load desired bank, set $57-$58 to desired pointer value 0x03F3BF|$0F:$F3AF:A6 10 LDX $10 ; spell name index 0x03F3C1|$0F:$F3B1:E8 INX ; $F3F8 is one-based, so convert from zero-based 0x03F3C2|$0F:$F3B2:8A TXA 0x03F3C3|$0F:$F3B3:20 F8 F3 JSR $F3F8 ; find desired list item A (one-based) in ($57), copy it to $0100 (referenced as $00FF,X) in reverse; set Y to length of string copied, then load bank specified by $60D7 (set by last call to $F3E2) ; control flow target (from $F3A8) 0x03F3C6|$0F:$F3B6:60 RTS ; given monster ID in A, copy monster name segment to $0100 in reverse ; control flow target (from $EFC3, $FC98, $FCB5) 0x03F3C7|$0F:$F3B7:85 10 STA $10 ; save desired monster index for later (both here and in calling code) 0x03F3C9|$0F:$F3B9:86 11 STX $11 ; pointless? 0x03F3CB|$0F:$F3BB:A0 00 LDY #$00 ; start by assuming we're dealing with Monsters 1 Line 1 (LDY $60AB would save 6 bytes?) 0x03F3CD|$0F:$F3BD:AD AB 60 LDA $60AB ; which list segment we're dealing with 0x03F3D0|$0F:$F3C0:4A LSR ; shift low bit to C 0x03F3D1|$0F:$F3C1:90 01 BCC $F3C4 ; C = 0 => first segment, so keep Y at #$00 0x03F3D3|$0F:$F3C3:C8 INY ; otherwise it's the second segment, so set Y = #$01 ; control flow target (from $F3C1) 0x03F3D4|$0F:$F3C4:A5 10 LDA $10 ; restore monster index 0x03F3D6|$0F:$F3C6:48 PHA ; save monster index 0x03F3D7|$0F:$F3C7:C9 33 CMP #$33 ; is monster index < 51? 0x03F3D9|$0F:$F3C9:90 06 BCC $F3D1 ; if monster index < 51, skip ahead 0x03F3DB|$0F:$F3CB:68 PLA ; pop old monster index 0x03F3DC|$0F:$F3CC:E9 32 SBC #$32 ; otherwise subtract 50 0x03F3DE|$0F:$F3CE:C8 INY ; and use the second half of the pointer list 0x03F3DF|$0F:$F3CF:C8 INY 0x03F3E0|$0F:$F3D0:48 PHA ; push new monster index ; control flow target (from $F3C9) 0x03F3E1|$0F:$F3D1:B9 DE F3 LDA $F3DE,Y ; monster list bank/pointers 0x03F3E4|$0F:$F3D4:20 E2 F3 JSR $F3E2 ; parse bank/pointer indices from A, load desired bank, set $57-$58 to desired pointer value 0x03F3E7|$0F:$F3D7:20 9F F1 JSR $F19F ; initialize string buffer $0100-$010C with [space]s 0x03F3EA|$0F:$F3DA:68 PLA ; monster index 0x03F3EB|$0F:$F3DB:4C F8 F3 JMP $F3F8 ; find desired list item A (one-based) in ($57), copy it to $0100 (referenced as $00FF,X) in reverse; set Y to length of string copied, then load bank specified by $60D7 (set by last call to $F3E2) ; code -> data ; monster list bank/pointers ; indexed data load target (from $F3D1) 0x03F3EE|$0F:$F3DE:D4 ; $06:$8028; -> $06:$B718: Monster list part 1, line 1 0x03F3EF|$0F:$F3DF:D5 ; $06:$802A; -> $06:$B945: Monster list part 1, line 2 0x03F3F0|$0F:$F3E0:DA ; $06:$8034; -> $06:$B85E: Monster list part 2, line 1 0x03F3F1|$0F:$F3E1:DB ; $06:$8036; -> $06:$B9D5: Monster list part 2, line 2 ; data -> code ; parse bank/pointer indices from A, load desired bank, set $57-$58 to desired pointer value ; control flow target (from $EBB4, $F30D, $F3AC, $F3D4) 0x03F3F2|$0F:$F3E2:48 PHA 0x03F3F3|$0F:$F3E3:AD F6 05 LDA $05F6 ; current bank 0x03F3F6|$0F:$F3E6:8D D7 60 STA $60D7 ; backup copy of current bank set by calls to $F3E2; used by $F31A 0x03F3F9|$0F:$F3E9:68 PLA 0x03F3FA|$0F:$F3EA:20 33 FF JSR $FF33 ; parse A into bank and pointer indices and load specified bank 0x03F3FD|$0F:$F3ED:BD 00 80 LDA $8000,X 0x03F400|$0F:$F3F0:85 57 STA $57 ; pointer to start of main pointer table, low byte 0x03F402|$0F:$F3F2:BD 01 80 LDA $8001,X 0x03F405|$0F:$F3F5:85 58 STA $58 ; pointer to start of main pointer table, high byte 0x03F407|$0F:$F3F7:60 RTS ; find desired list item A (one-based) in ($57), copy it to $0100 (referenced as $00FF,X) in reverse; set Y to length of string copied, then load bank specified by $60D7 (set by last call to $F3E2) ; control flow target (from $F313, $F3B3, $F3DB) 0x03F408|$0F:$F3F8:20 FE F3 JSR $F3FE ; find desired list item A (one-based) in ($57), copy it to $0100 (referenced as $00FF,X) in reverse; set Y to length of string copied 0x03F40B|$0F:$F3FB:4C 1A F3 JMP $F31A ; load bank specified by $60D7 (set by last call to $F3E2) ; find desired list item A (one-based) in ($57), copy it to $0100 (referenced as $00FF,X) in reverse; set Y to length of string copied ; control flow target (from $F3F8) 0x03F40E|$0F:$F3FE:AA TAX 0x03F40F|$0F:$F3FF:A0 00 LDY #$00 ; control flow target (from $F412, $F416) 0x03F411|$0F:$F401:CA DEX 0x03F412|$0F:$F402:F0 14 BEQ $F418 ; control flow target (from $F40B, $F40F) 0x03F414|$0F:$F404:B1 57 LDA ($57),Y ; pointer to start of main pointer table, low byte; scan through ($57),Y, counting #$FF bytes until we've reached the right list item 0x03F416|$0F:$F406:C9 FF CMP #$FF 0x03F418|$0F:$F408:F0 07 BEQ $F411 0x03F41A|$0F:$F40A:C8 INY 0x03F41B|$0F:$F40B:D0 F7 BNE $F404 0x03F41D|$0F:$F40D:E6 58 INC $58 ; pointer to start of main pointer table, high byte 0x03F41F|$0F:$F40F:D0 F3 BNE $F404 ; control flow target (from $F408) 0x03F421|$0F:$F411:C8 INY 0x03F422|$0F:$F412:D0 ED BNE $F401 0x03F424|$0F:$F414:E6 58 INC $58 ; pointer to start of main pointer table, high byte 0x03F426|$0F:$F416:D0 E9 BNE $F401 ; control flow target (from $F402) 0x03F428|$0F:$F418:98 TYA 0x03F429|$0F:$F419:18 CLC 0x03F42A|$0F:$F41A:65 57 ADC $57 ; pointer to start of main pointer table, low byte 0x03F42C|$0F:$F41C:85 57 STA $57 ; pointer to start of main pointer table, low byte 0x03F42E|$0F:$F41E:90 02 BCC $F422 0x03F430|$0F:$F420:E6 58 INC $58 ; pointer to start of main pointer table, high byte ; control flow target (from $F41E) 0x03F432|$0F:$F422:A0 00 LDY #$00 0x03F434|$0F:$F424:AE A0 60 LDX $60A0 ; maximum string length ; control flow target (from $F432) 0x03F437|$0F:$F427:B1 57 LDA ($57),Y ; pointer to start of main pointer table, low byte 0x03F439|$0F:$F429:C9 FF CMP #$FF 0x03F43B|$0F:$F42B:F0 07 BEQ $F434 0x03F43D|$0F:$F42D:9D FF 00 STA $00FF,X ; built-in offset from string copy buffer start at $0100 0x03F440|$0F:$F430:C8 INY 0x03F441|$0F:$F431:CA DEX 0x03F442|$0F:$F432:D0 F3 BNE $F427 ; control flow target (from $F42B, $F437) 0x03F444|$0F:$F434:60 RTS ; control flow target (from $EBA2) 0x03F445|$0F:$F435:A5 8E LDA $8E ; flag for in battle or not (#$FF)? 0x03F447|$0F:$F437:D0 FB BNE $F434 0x03F449|$0F:$F439:A5 4D LDA $4D 0x03F44B|$0F:$F43B:85 0C STA $0C 0x03F44D|$0F:$F43D:A5 4E LDA $4E 0x03F44F|$0F:$F43F:85 0E STA $0E 0x03F451|$0F:$F441:20 2D DE JSR $DE2D 0x03F454|$0F:$F444:A0 00 LDY #$00 0x03F456|$0F:$F446:84 12 STY $12 0x03F458|$0F:$F448:AD A3 60 LDA $60A3 ; menu window height (ROM value * 2) 0x03F45B|$0F:$F44B:4A LSR 0x03F45C|$0F:$F44C:85 10 STA $10 ; control flow target (from $F467) 0x03F45E|$0F:$F44E:AD A1 60 LDA $60A1 ; menu window width 0x03F461|$0F:$F451:4A LSR 0x03F462|$0F:$F452:85 11 STA $11 0x03F464|$0F:$F454:A9 01 LDA #$01 ; control flow target (from $F45B) 0x03F466|$0F:$F456:91 07 STA ($07),Y ; mark menu open 0x03F468|$0F:$F458:C8 INY 0x03F469|$0F:$F459:C6 11 DEC $11 0x03F46B|$0F:$F45B:D0 F9 BNE $F456 0x03F46D|$0F:$F45D:A5 12 LDA $12 0x03F46F|$0F:$F45F:18 CLC 0x03F470|$0F:$F460:69 10 ADC #$10 0x03F472|$0F:$F462:85 12 STA $12 0x03F474|$0F:$F464:A8 TAY 0x03F475|$0F:$F465:C6 10 DEC $10 0x03F477|$0F:$F467:D0 E5 BNE $F44E 0x03F479|$0F:$F469:A5 35 LDA $35 ; flag indicating whether any menu is currently open 0x03F47B|$0F:$F46B:48 PHA 0x03F47C|$0F:$F46C:A9 FF LDA #$FF 0x03F47E|$0F:$F46E:85 35 STA $35 ; flag indicating whether any menu is currently open 0x03F480|$0F:$F470:20 CB D8 JSR $D8CB 0x03F483|$0F:$F473:68 PLA 0x03F484|$0F:$F474:85 35 STA $35 ; flag indicating whether any menu is currently open 0x03F486|$0F:$F476:4C DC C1 JMP $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; print party gold to $0100 in decimal in reverse, replacing leading (now trailing) zeroes with spaces, leaving X at most significant digit ; control flow target (from $EDA7) 0x03F489|$0F:$F479:A9 05 LDA #$05 0x03F48B|$0F:$F47B:8D A0 60 STA $60A0 ; maximum string length 0x03F48E|$0F:$F47E:AD 24 06 LDA $0624 ; party gold, low byte 0x03F491|$0F:$F481:85 10 STA $10 0x03F493|$0F:$F483:AD 25 06 LDA $0625 ; party gold, high byte 0x03F496|$0F:$F486:85 11 STA $11 0x03F498|$0F:$F488:A9 00 LDA #$00 0x03F49A|$0F:$F48A:85 12 STA $12 0x03F49C|$0F:$F48C:20 7C F1 JSR $F17C ; given a 24-bit number N in $10-$12, print its base 10 digits in reverse to $0100 up to maximum string length $60A0 0x03F49F|$0F:$F48F:4C 8D F1 JMP $F18D ; scan through $0100 + maximum string length $60A0 in reverse, replacing zeroes with spaces until the first non-zero or $0100 is reached; leaves X at most significant digit ; display Menu ID #$02: Main menu: gold/crests ; external control flow target (from $06:$89DC) 0x03F4A2|$0F:$F492:A9 02 LDA #$02 ; Menu ID #$02: Main menu: gold/crests 0x03F4A4|$0F:$F494:4C 89 EB JMP $EB89 ; open menu specified by A ; display Menu ID #$03: Main menu: selected hero's status ; external control flow target (from $06:$89D6) 0x03F4A7|$0F:$F497:85 4A STA $4A 0x03F4A9|$0F:$F499:A9 03 LDA #$03 ; Menu ID #$03: Main menu: selected hero's status 0x03F4AB|$0F:$F49B:4C 89 EB JMP $EB89 ; open menu specified by A ; external control flow target (from $04:$B5D8) 0x03F4AE|$0F:$F49E:85 4A STA $4A 0x03F4B0|$0F:$F4A0:A9 07 LDA #$07 ; Menu ID #$07: Battle menu: spell list 0x03F4B2|$0F:$F4A2:20 89 EB JSR $EB89 ; open menu specified by A 0x03F4B5|$0F:$F4A5:C9 FF CMP #$FF 0x03F4B7|$0F:$F4A7:F0 04 BEQ $F4AD 0x03F4B9|$0F:$F4A9:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03F4BC|$0F:$F4AC:CA ; $06:$8014; -> $06:$AE3D: given hero ID - 1 in $4A and battle spell menu selection index in A, return spell ID in A ; data -> code ; control flow target (from $F4A7) 0x03F4BD|$0F:$F4AD:4C C2 F6 JMP $F6C2 ; load bank specified by $94 ; given hero ID in A, display that hero's battle item list window and return the selected item ID in A ; external control flow target (from $04:$B5E1) 0x03F4C0|$0F:$F4B0:85 4A STA $4A ; hero ID 0x03F4C2|$0F:$F4B2:A9 04 LDA #$04 ; count all items 0x03F4C4|$0F:$F4B4:8D 9D 60 STA $609D ; menu function parameter 0x03F4C7|$0F:$F4B7:20 B7 F1 JSR $F1B7 ; given hero ID in $4A and item type in $609D, set A = number of items of desired type in hero's inventory 0x03F4CA|$0F:$F4BA:F0 30 BEQ $F4EC ; no items => set A = #$FE and RTS 0x03F4CC|$0F:$F4BC:A9 08 LDA #$08 ; Menu ID #$08: Battle menu: item list window 1 ; control flow target (from $F4CD) 0x03F4CE|$0F:$F4BE:20 89 EB JSR $EB89 ; open menu specified by A 0x03F4D1|$0F:$F4C1:AE B1 60 LDX $60B1 0x03F4D4|$0F:$F4C4:D0 09 BNE $F4CF 0x03F4D6|$0F:$F4C6:C9 FF CMP #$FF 0x03F4D8|$0F:$F4C8:F0 1F BEQ $F4E9 0x03F4DA|$0F:$F4CA:AD AE 60 LDA $60AE ; menu link ID 0x03F4DD|$0F:$F4CD:D0 EF BNE $F4BE ; control flow target (from $F4C4) 0x03F4DF|$0F:$F4CF:AE AE 60 LDX $60AE ; menu link ID 0x03F4E2|$0F:$F4D2:E0 08 CPX #$08 ; Menu ID #$08: Battle menu: item list window 1 0x03F4E4|$0F:$F4D4:D0 07 BNE $F4DD ; menu link ID != #$08 => we're currently in Menu ID #$08: Battle menu: item list window 1, so no need to adjust A 0x03F4E6|$0F:$F4D6:C9 FF CMP #$FF ; #$FF stays #$FF 0x03F4E8|$0F:$F4D8:F0 0F BEQ $F4E9 0x03F4EA|$0F:$F4DA:18 CLC ; otherwise, we're in Menu ID #$22: Battle menu: item list window 2; menu displays 4 items per page, so add 4 to the selected item index 0x03F4EB|$0F:$F4DB:69 04 ADC #$04 ; control flow target (from $F4D4) 0x03F4ED|$0F:$F4DD:A2 04 LDX #$04 ; count all items 0x03F4EF|$0F:$F4DF:C9 FE CMP #$FE 0x03F4F1|$0F:$F4E1:B0 06 BCS $F4E9 0x03F4F3|$0F:$F4E3:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03F4F6|$0F:$F4E6:C8 ; $06:$8010; -> $06:$ADFC: given a selected list index in A, an item type in X, and a hero ID in $4A, set A to the A'th item of type X in hero $4A's inventory ; data -> code 0x03F4F7|$0F:$F4E7:29 3F AND #$3F ; strip off the equipped bit ; control flow target (from $F4C8, $F4D8, $F4E1) 0x03F4F9|$0F:$F4E9:4C C2 F6 JMP $F6C2 ; load bank specified by $94 ; control flow target (from $F4BA) 0x03F4FC|$0F:$F4EC:A9 FE LDA #$FE 0x03F4FE|$0F:$F4EE:60 RTS ; open battle command menu for hero A ; external control flow target (from $04:$B56E) 0x03F4FF|$0F:$F4EF:85 4A STA $4A 0x03F501|$0F:$F4F1:AA TAX 0x03F502|$0F:$F4F2:F0 1D BEQ $F511 ; if it's Midenhall, just display Midenhall's command menu 0x03F504|$0F:$F4F4:E0 01 CPX #$01 0x03F506|$0F:$F4F6:D0 07 BNE $F4FF ; branch if not Cannock 0x03F508|$0F:$F4F8:2C 2D 06 BIT $062D ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03F50B|$0F:$F4FB:10 10 BPL $F50D ; Cannock: if Midenhall is dead, display alternate Cannock command menu 0x03F50D|$0F:$F4FD:70 0E BVS $F50D ; Cannock: if Midenhall is asleep, display alternate Cannock command menu ; control flow target (from $F4F6) 0x03F50F|$0F:$F4FF:2C 2D 06 BIT $062D ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03F512|$0F:$F502:10 02 BPL $F506 ; Cannock would have taken the earlier BPL, so this is just Moonbrooke: if Midenhall is dead, check Cannock 0x03F514|$0F:$F504:50 0B BVC $F511 ; Cannock/Moonbrooke: if Midenhall is awake, display normal Cannock/Moonbrooke command menu ; control flow target (from $F502) 0x03F516|$0F:$F506:2C 3F 06 BIT $063F ; Cannock status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03F519|$0F:$F509:10 02 BPL $F50D ; Cannock must have taken one of the earlier BPL/BVS/BVC, so this is just Moonbrooke: if Cannock is dead, display alternate Moonbrooke command menu 0x03F51B|$0F:$F50B:50 04 BVC $F511 ; Cannock must have taken one of the earlier BPL/BVS/BVC, so this is just Moonbrooke: if Cannock is awake, display normal Moonbrooke command menu ; control flow target (from $F4FB, $F4FD, $F509) 0x03F51D|$0F:$F50D:A2 03 LDX #$03 ; index for alternate command menu 0x03F51F|$0F:$F50F:D0 00 BNE $F511 ; useless op ; control flow target (from $F4F2, $F504, $F50B, $F50F) 0x03F521|$0F:$F511:BD 17 F5 LDA $F517,X ; Battle command menus 0x03F524|$0F:$F514:4C 89 EB JMP $EB89 ; open menu specified by A ; code -> data ; Battle command menus ; indexed data load target (from $F511) 0x03F527|$0F:$F517:09 ; Menu ID #$09: Battle menu: Midenhall's command options 0x03F528|$0F:$F518:23 ; Menu ID #$23: Battle menu: Cannock/Moonbrooke's command options 0x03F529|$0F:$F519:23 ; Menu ID #$23: Battle menu: Cannock/Moonbrooke's command options 0x03F52A|$0F:$F51A:49 ; Menu ID #$49: Battle menu: Leader's command options when Midenhall asleep/dead ; data -> code ; display appropriate battle menu monster list ; external control flow target (from $04:$B5A9) 0x03F52B|$0F:$F51B:A5 4B LDA $4B ; flag for whether to display the selectable or non-selectable monster list 0x03F52D|$0F:$F51D:D0 05 BNE $F524 ; display Menu ID #$05: Battle menu: monster list, non-selectable 0x03F52F|$0F:$F51F:A9 0A LDA #$0A ; Menu ID #$0A: Battle menu: monster list, selectable 0x03F531|$0F:$F521:4C 89 EB JMP $EB89 ; open menu specified by A ; display Menu ID #$05: Battle menu: monster list, non-selectable ; control flow target (from $F51D) 0x03F534|$0F:$F524:A9 05 LDA #$05 ; Menu ID #$05: Battle menu: monster list, non-selectable 0x03F536|$0F:$F526:4C 89 EB JMP $EB89 ; open menu specified by A ; display appropriate battle menu item/spell target ; external control flow target (from $04:$B5E8) 0x03F539|$0F:$F529:20 5A F6 JSR $F65A ; set A and X to the current number of party members 0x03F53C|$0F:$F52C:F0 06 BEQ $F534 ; if just Midenhall, no need to display hero select menu 0x03F53E|$0F:$F52E:BD 34 F5 LDA $F534,X 0x03F541|$0F:$F531:20 89 EB JSR $EB89 ; open menu specified by A ; control flow target (from $F52C) ; indexed data load target (from $F52E) 0x03F544|$0F:$F534:60 RTS ; code -> data ; Battle item/spell target menus 0x03F545|$0F:$F535:0B ; Menu ID #$0B: Battle menu: Midenhall + Cannock item/spell target 0x03F546|$0F:$F536:24 ; Menu ID #$24: Battle menu: Midenhall + Cannock + Moonbrooke item/spell target ; data -> code ; display hero select STATUS menu if necessary ; external control flow target (from $06:$89CA) 0x03F547|$0F:$F537:20 5A F6 JSR $F65A ; set A and X to the current number of party members 0x03F54A|$0F:$F53A:F0 06 BEQ $F542 ; if just Midenhall, no need to display hero select menu 0x03F54C|$0F:$F53C:BD 42 F5 LDA $F542,X 0x03F54F|$0F:$F53F:20 89 EB JSR $EB89 ; open menu specified by A ; control flow target (from $F53A) ; indexed data load target (from $F53C) 0x03F552|$0F:$F542:60 RTS ; code -> data ; main STATUS hero select menus 0x03F553|$0F:$F543:0C ; Menu ID #$0C: Main menu: STATUS with Midenhall + Cannock 0x03F554|$0F:$F544:25 ; Menu ID #$25: Main menu: STATUS with Midenhall + Cannock + Moonbrooke ; data -> code ; depending on number of casters in party, maybe open caster select menu ; external control flow target (from $06:$8B36) 0x03F555|$0F:$F545:20 5A F6 JSR $F65A ; set A and X to the current number of party members 0x03F558|$0F:$F548:F0 10 BEQ $F55A ; if just Midenhall, no need to display hero select menu 0x03F55A|$0F:$F54A:CA DEX 0x03F55B|$0F:$F54B:F0 0A BEQ $F557 ; if only 2 party members, Midenhall can't use magic, so no need to display menu 0x03F55D|$0F:$F54D:A9 0D LDA #$0D ; Menu ID #$0D: Main menu: SPELL with Cannock + Moonbrooke 0x03F55F|$0F:$F54F:20 89 EB JSR $EB89 ; open menu specified by A 0x03F562|$0F:$F552:C9 FF CMP #$FF 0x03F564|$0F:$F554:F0 03 BEQ $F559 ; this is never true? 0x03F566|$0F:$F556:AA TAX ; control flow target (from $F54B) 0x03F567|$0F:$F557:E8 INX 0x03F568|$0F:$F558:8A TXA ; control flow target (from $F554) 0x03F569|$0F:$F559:60 RTS ; control flow target (from $F548) 0x03F56A|$0F:$F55A:A9 FE LDA #$FE 0x03F56C|$0F:$F55C:60 RTS ; display appropriate main ITEM hero select menu ; external control flow target (from $06:$955B, $06:$9CC9) 0x03F56D|$0F:$F55D:20 5A F6 JSR $F65A ; set A and X to the current number of party members 0x03F570|$0F:$F560:F0 06 BEQ $F568 ; if just Midenhall, no need to display hero select menu 0x03F572|$0F:$F562:BD 68 F5 LDA $F568,X 0x03F575|$0F:$F565:20 89 EB JSR $EB89 ; open menu specified by A ; control flow target (from $F560) ; indexed data load target (from $F562) 0x03F578|$0F:$F568:60 RTS ; code -> data ; main ITEM hero select menus 0x03F579|$0F:$F569:0E ; Menu ID #$0E: Main menu: ITEM with Midenhall + Cannock 0x03F57A|$0F:$F56A:26 ; Menu ID #$26: Main menu: ITEM with Midenhall + Cannock + Moonbrooke ; data -> code ; display appropriate main EQUIP hero select menu ; external control flow target (from $06:$8A02) 0x03F57B|$0F:$F56B:20 5A F6 JSR $F65A ; set A and X to the current number of party members 0x03F57E|$0F:$F56E:F0 06 BEQ $F576 ; if just Midenhall, no need to display hero select menu 0x03F580|$0F:$F570:BD 76 F5 LDA $F576,X 0x03F583|$0F:$F573:20 89 EB JSR $EB89 ; open menu specified by A ; control flow target (from $F56E) ; indexed data load target (from $F570) 0x03F586|$0F:$F576:60 RTS ; code -> data ; main EQUIP hero select menus 0x03F587|$0F:$F577:0F ; Menu ID #$0F: Main menu: EQUIP with Midenhall + Cannock 0x03F588|$0F:$F578:27 ; Menu ID #$27: Main menu: EQUIP with Midenhall + Cannock + Moonbrooke ; data -> code ; display appropriate main SPELL target menu ; external control flow target (from $06:$8B98) 0x03F589|$0F:$F579:20 5A F6 JSR $F65A ; set A and X to the current number of party members 0x03F58C|$0F:$F57C:F0 06 BEQ $F584 ; if just Midenhall, no need to display hero select menu 0x03F58E|$0F:$F57E:BD 84 F5 LDA $F584,X 0x03F591|$0F:$F581:20 89 EB JSR $EB89 ; open menu specified by A ; control flow target (from $F57C) ; indexed data load target (from $F57E) 0x03F594|$0F:$F584:60 RTS ; code -> data ; main COMMAND menu SPELL target menus 0x03F595|$0F:$F585:10 ; Menu ID #$10: Main menu: SPELL target, Midenhall + Cannock 0x03F596|$0F:$F586:28 ; Menu ID #$28: Main menu: SPELL target, Midenhall + Cannock + Moonbrooke ; data -> code ; display appropriate main ITEM target menu ; external control flow target (from $06:$95B1, $06:$9629, $06:$99C1) 0x03F597|$0F:$F587:20 5A F6 JSR $F65A ; set A and X to the current number of party members 0x03F59A|$0F:$F58A:F0 06 BEQ $F592 ; if just Midenhall, no need to display hero select menu 0x03F59C|$0F:$F58C:BD 92 F5 LDA $F592,X 0x03F59F|$0F:$F58F:20 89 EB JSR $EB89 ; open menu specified by A ; control flow target (from $F58A) ; indexed data load target (from $F58C) 0x03F5A2|$0F:$F592:60 RTS ; code -> data ; main COMMAND menu ITEM target menus 0x03F5A3|$0F:$F593:11 ; Menu ID #$11: Main menu: ITEM target, Midenhall + Cannock 0x03F5A4|$0F:$F594:29 ; Menu ID #$29: Main menu: ITEM target, Midenhall + Cannock + Moonbrooke ; data -> code ; display appropriate shop BUY/SELL hero select menu ; external control flow target (from $06:$830E, $06:$8427, $06:$8490, $06:$8589, $06:$85D2, $06:$862B) 0x03F5A5|$0F:$F595:20 5A F6 JSR $F65A ; set A and X to the current number of party members 0x03F5A8|$0F:$F598:F0 06 BEQ $F5A0 ; if just Midenhall, no need to display hero select menu 0x03F5AA|$0F:$F59A:BD A0 F5 LDA $F5A0,X 0x03F5AD|$0F:$F59D:20 89 EB JSR $EB89 ; open menu specified by A ; control flow target (from $F598) ; indexed data load target (from $F59A) 0x03F5B0|$0F:$F5A0:60 RTS ; code -> data ; shop menu BUY/SELL hero select menus 0x03F5B1|$0F:$F5A1:12 ; Menu ID #$12: Shop menu: buy/sell target, Midenhall + Cannock 0x03F5B2|$0F:$F5A2:2A ; Menu ID #$2A: Shop menu: buy/sell target, Midenhall + Cannock + Moonbrooke ; data -> code ; given a hero ID in A and an item type in X, display the EQUIP sub-menu for hero A and item type X, returning the selected item ID in A ; ##>hero ID ; external control flow target (from $06:$8A1D, $06:$8A2E) 0x03F5B3|$0F:$F5A3:85 4A STA $4A 0x03F5B5|$0F:$F5A5:86 96 STX $96 ; temp storage for item/spell/type/etc. IDs; item type 0x03F5B7|$0F:$F5A7:BD E8 F5 LDA $F5E8,X ; EQUIP sub-menu IDs 0x03F5BA|$0F:$F5AA:48 PHA ; EQUIP sub-menu ID 0x03F5BB|$0F:$F5AB:A5 A5 LDA $A5 0x03F5BD|$0F:$F5AD:48 PHA 0x03F5BE|$0F:$F5AE:20 EC D0 JSR $D0EC ; update each hero's stats based on their current EXP 0x03F5C1|$0F:$F5B1:68 PLA 0x03F5C2|$0F:$F5B2:85 A5 STA $A5 0x03F5C4|$0F:$F5B4:A9 07 LDA #$07 0x03F5C6|$0F:$F5B6:20 8C F7 JSR $F78C ; wipe selected menu region 0x03F5C9|$0F:$F5B9:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item type 0x03F5CB|$0F:$F5BB:8D 9D 60 STA $609D ; menu function parameter 0x03F5CE|$0F:$F5BE:A9 00 LDA #$00 0x03F5D0|$0F:$F5C0:8D AA 60 STA $60AA ; menu format (#$80 = has cursor, #$40 = is linked, #$20 = is single spaced, #$02 = only display equipped items, #$01 = display [left border, equipped] if equipped) 0x03F5D3|$0F:$F5C3:20 B7 F1 JSR $F1B7 ; given hero ID in $4A and item type in $609D, set A = number of items of desired type in hero's inventory 0x03F5D6|$0F:$F5C6:D0 0E BNE $F5D6 ; if hero has items of this type, branch to display the EQUIP sub-menu 0x03F5D8|$0F:$F5C8:68 PLA ; EQUIP sub-menu ID 0x03F5D9|$0F:$F5C9:C9 2F CMP #$2F ; Menu ID #$2F: Main menu: equip helmet 0x03F5DB|$0F:$F5CB:D0 05 BNE $F5D2 ; if we're processing the final EQUIP sub-menu but hero has no helmets, leave the current Attack/Defense menu on the screen for a bit 0x03F5DD|$0F:$F5CD:A9 48 LDA #$48 ; Menu ID #$48: Main menu: Equip menu's current Attack/Defense 0x03F5DF|$0F:$F5CF:20 89 EB JSR $EB89 ; open menu specified by A ; control flow target (from $F5CB) 0x03F5E2|$0F:$F5D2:A9 FE LDA #$FE 0x03F5E4|$0F:$F5D4:D0 0F BNE $F5E5 ; load bank specified by $94 ; control flow target (from $F5C6) 0x03F5E6|$0F:$F5D6:A9 48 LDA #$48 ; Menu ID #$48: Main menu: Equip menu's current Attack/Defense 0x03F5E8|$0F:$F5D8:20 89 EB JSR $EB89 ; open menu specified by A 0x03F5EB|$0F:$F5DB:68 PLA ; EQUIP sub-menu 0x03F5EC|$0F:$F5DC:20 89 EB JSR $EB89 ; open menu specified by A 0x03F5EF|$0F:$F5DF:A6 96 LDX $96 ; temp storage for item/spell/type/etc. IDs; item type 0x03F5F1|$0F:$F5E1:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03F5F4|$0F:$F5E4:C8 ; $06:$8010; -> $06:$ADFC: given a selected list index in A, an item type in X, and a hero ID in $4A, set A to the A'th item of type X in hero $4A's inventory ; data -> code ; load bank specified by $94 ; control flow target (from $F5D4, $F5F5) 0x03F5F5|$0F:$F5E5:4C C2 F6 JMP $F6C2 ; load bank specified by $94 ; code -> data ; EQUIP sub-menu IDs ; indexed data load target (from $F5A7) 0x03F5F8|$0F:$F5E8:13 ; Menu ID #$13: Main menu: equip weapon 0x03F5F9|$0F:$F5E9:2D ; Menu ID #$2D: Main menu: equip armour 0x03F5FA|$0F:$F5EA:2E ; Menu ID #$2E: Main menu: equip shield 0x03F5FB|$0F:$F5EB:2F ; Menu ID #$2F: Main menu: equip helmet ; data -> code ; given hero ID - 1 in A, open hero's spell list and return selected spell ID in A ; external control flow target (from $06:$8B6E) 0x03F5FC|$0F:$F5EC:85 4A STA $4A ; hero ID - 1 0x03F5FE|$0F:$F5EE:A9 14 LDA #$14 ; Menu ID #$14: Main menu: spell list 0x03F600|$0F:$F5F0:20 89 EB JSR $EB89 ; open menu specified by A 0x03F603|$0F:$F5F3:C9 FF CMP #$FF 0x03F605|$0F:$F5F5:F0 EE BEQ $F5E5 ; load bank specified by $94 0x03F607|$0F:$F5F7:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03F60A|$0F:$F5FA:C9 ; $06:$8012; -> $06:$AE30: given hero ID - 1 in $4A and field spell menu selection index in A, return spell ID in A ; data -> code 0x03F60B|$0F:$F5FB:4C C2 F6 JMP $F6C2 ; load bank specified by $94 ; given a hero ID in A, open hero's item list and return selected item ID (or #$FE if they have no items) ; external control flow target (from $06:$84C1, $06:$9564, $06:$9CD8) 0x03F60E|$0F:$F5FE:85 4A STA $4A ; hero ID 0x03F610|$0F:$F600:A9 04 LDA #$04 ; count all items 0x03F612|$0F:$F602:8D 9D 60 STA $609D ; menu function parameter 0x03F615|$0F:$F605:20 B7 F1 JSR $F1B7 ; given hero ID in $4A and item type in $609D, set A = number of items of desired type in hero's inventory 0x03F618|$0F:$F608:F0 0E BEQ $F618 ; if no items, don't open the item list 0x03F61A|$0F:$F60A:A9 15 LDA #$15 ; Menu ID #$15: Main menu: item list 0x03F61C|$0F:$F60C:20 89 EB JSR $EB89 ; open menu specified by A 0x03F61F|$0F:$F60F:A2 04 LDX #$04 ; parameter for $06:$ADFC: count all items 0x03F621|$0F:$F611:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03F624|$0F:$F614:C8 ; $06:$8010; -> $06:$ADFC: given a selected list index in A, an item type in X, and a hero ID in $4A, set A to the A'th item of type X in hero $4A's inventory ; data -> code 0x03F625|$0F:$F615:4C C2 F6 JMP $F6C2 ; load bank specified by $94 ; control flow target (from $F608) 0x03F628|$0F:$F618:A9 FE LDA #$FE 0x03F62A|$0F:$F61A:60 RTS ; display shop menu item list for shop ID given in A, returning selected item (with Jailor's Key replaced by blank) in A ; external control flow target (from $06:$82DE, $06:$83CA) 0x03F62B|$0F:$F61B:8D AF 60 STA $60AF ; shop ID 0x03F62E|$0F:$F61E:A9 1B LDA #$1B ; Menu ID #$1B: Shop menu: current gold 0x03F630|$0F:$F620:20 89 EB JSR $EB89 ; open menu specified by A 0x03F633|$0F:$F623:A9 16 LDA #$16 ; Menu ID #$16: Shop menu: Item BUY list 0x03F635|$0F:$F625:20 89 EB JSR $EB89 ; open menu specified by A 0x03F638|$0F:$F628:C9 FF CMP #$FF 0x03F63A|$0F:$F62A:F0 0C BEQ $F638 0x03F63C|$0F:$F62C:8D AC 60 STA $60AC ; menu list index 0x03F63F|$0F:$F62F:20 7C F2 JSR $F27C ; given shop ID in $60AF and menu list index in $60AC, set A to the corresponding item ID 0x03F642|$0F:$F632:C9 39 CMP #$39 ; Item ID #$39: Jailor’s Key 0x03F644|$0F:$F634:D0 02 BNE $F638 0x03F646|$0F:$F636:A9 00 LDA #$00 ; control flow target (from $F62A, $F634) 0x03F648|$0F:$F638:4C C2 F6 JMP $F6C2 ; load bank specified by $94 ; display Menu ID #$1C: Main menu: status screen equipped items ; external control flow target (from $06:$89E1) 0x03F64B|$0F:$F63B:85 4A STA $4A 0x03F64D|$0F:$F63D:A9 1C LDA #$1C ; Menu ID #$1C: Main menu: status screen equipped items 0x03F64F|$0F:$F63F:4C 89 EB JMP $EB89 ; open menu specified by A ; display appropriate battle EXP + Gold menu ; external control flow target (from $04:$9940) 0x03F652|$0F:$F642:20 5A F6 JSR $F65A ; set A and X to the current number of party members 0x03F655|$0F:$F645:BD 4B F6 LDA $F64B,X ; Battle menu EXP + Gold 0x03F658|$0F:$F648:4C 89 EB JMP $EB89 ; open menu specified by A ; code -> data ; Battle menu EXP + Gold ; indexed data load target (from $F645) 0x03F65B|$0F:$F64B:1D ; Menu ID #$1D: Battle menu: Midenhall EXP + Gold 0x03F65C|$0F:$F64C:2B ; Menu ID #$2B: Battle menu: Midenhall + Cannock EXP + Gold 0x03F65D|$0F:$F64D:2C ; Menu ID #$2C: Battle menu: Midenhall + Cannock + Moonbrooke EXP + Gold ; data -> code ; display spell lists ; external control flow target (from $06:$89FC) 0x03F65E|$0F:$F64E:85 4A STA $4A 0x03F660|$0F:$F650:A9 30 LDA #$30 ; Menu ID #$30: Main menu: out-of-battle spell list 0x03F662|$0F:$F652:20 89 EB JSR $EB89 ; open menu specified by A 0x03F665|$0F:$F655:A9 31 LDA #$31 ; Menu ID #$31: Main menu: battle spell list 0x03F667|$0F:$F657:4C 89 EB JMP $EB89 ; open menu specified by A ; set A and X to the current number of party members ; control flow target (from $F529, $F537, $F545, $F55D, $F56B, $F579, $F587, $F595, $F642, $F685) 0x03F66A|$0F:$F65A:A2 00 LDX #$00 ; you always have Midenhall 0x03F66C|$0F:$F65C:AD 3F 06 LDA $063F ; Cannock status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03F66F|$0F:$F65F:29 04 AND #$04 ; pick out the In Party bit 0x03F671|$0F:$F661:F0 01 BEQ $F664 ; if Cannock not in party, don't INX; no Cannock => no Moonbrooke, so BEQ $F66C would be faster 0x03F673|$0F:$F663:E8 INX ; control flow target (from $F661) 0x03F674|$0F:$F664:AD 51 06 LDA $0651 ; Moonbrooke status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03F677|$0F:$F667:29 04 AND #$04 ; pick out the In Party bit 0x03F679|$0F:$F669:F0 01 BEQ $F66C ; if Moonbrooke not in party, don't INX 0x03F67B|$0F:$F66B:E8 INX ; control flow target (from $F669) 0x03F67C|$0F:$F66C:8A TXA 0x03F67D|$0F:$F66D:60 RTS ; do special effects for certain menus; sets A to menu ID ; control flow target (from $EB89) 0x03F67E|$0F:$F66E:C9 19 CMP #$19 ; Menu ID #$19: General menu: YES/NO 0x03F680|$0F:$F670:F0 1F BEQ $F691 ; YES/NO menu extra: play double beep SFX 0x03F682|$0F:$F672:C9 04 CMP #$04 ; Menu ID #$04: Dialogue window 0x03F684|$0F:$F674:F0 2D BEQ $F6A3 ; initialize main dialogue window 0x03F686|$0F:$F676:C9 06 CMP #$06 ; Menu ID #$06: Map menu: main COMMAND menu 0x03F688|$0F:$F678:F0 20 BEQ $F69A ; COMMAND menu extra: play single beep SFX 0x03F68A|$0F:$F67A:C9 02 CMP #$02 ; Menu ID #$02: Main menu: gold/crests 0x03F68C|$0F:$F67C:B0 11 BCS $F68F ; anything else > 1 just does SEC and RTS 0x03F68E|$0F:$F67E:85 10 STA $10 ; at this point A is either Menu ID #$00: Mini status window, bottom or Menu ID #$01: Mini status window, top and C is clear 0x03F690|$0F:$F680:0A ASL 0x03F691|$0F:$F681:65 10 ADC $10 0x03F693|$0F:$F683:85 10 STA $10 ; A = A * 3; 3 versions of each menu 0x03F695|$0F:$F685:20 5A F6 JSR $F65A ; set A and X to the current number of party members 0x03F698|$0F:$F688:18 CLC 0x03F699|$0F:$F689:65 10 ADC $10 ; add number of party members to menu type offset 0x03F69B|$0F:$F68B:AA TAX 0x03F69C|$0F:$F68C:BD C8 F6 LDA $F6C8,X ; mini status menu IDs ; control flow target (from $F67C) 0x03F69F|$0F:$F68F:38 SEC 0x03F6A0|$0F:$F690:60 RTS ; YES/NO menu extra: play double beep SFX ; control flow target (from $F670) 0x03F6A1|$0F:$F691:A9 86 LDA #$86 ; Music ID #$86: double beep SFX 0x03F6A3|$0F:$F693:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03F6A6|$0F:$F696:A9 19 LDA #$19 0x03F6A8|$0F:$F698:38 SEC 0x03F6A9|$0F:$F699:60 RTS ; COMMAND menu extra: play single beep SFX ; control flow target (from $F678) 0x03F6AA|$0F:$F69A:A9 85 LDA #$85 ; Music ID #$85: single beep SFX 0x03F6AC|$0F:$F69C:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x03F6AF|$0F:$F69F:A9 06 LDA #$06 0x03F6B1|$0F:$F6A1:38 SEC 0x03F6B2|$0F:$F6A2:60 RTS ; initialize main dialogue window ; control flow target (from $F674) 0x03F6B3|$0F:$F6A3:A9 00 LDA #$00 0x03F6B5|$0F:$F6A5:8D D0 60 STA $60D0 0x03F6B8|$0F:$F6A8:8D D1 60 STA $60D1 0x03F6BB|$0F:$F6AB:A2 B0 LDX #$B0 ; write #$B0 [space] to $06F8-$07A7, a.k.a. blank out the main dialogue window 0x03F6BD|$0F:$F6AD:A9 5F LDA #$5F ; control flow target (from $F6B3) 0x03F6BF|$0F:$F6AF:9D F7 06 STA $06F7,X 0x03F6C2|$0F:$F6B2:CA DEX 0x03F6C3|$0F:$F6B3:D0 FA BNE $F6AF 0x03F6C5|$0F:$F6B5:A9 00 LDA #$00 0x03F6C7|$0F:$F6B7:85 7C STA $7C 0x03F6C9|$0F:$F6B9:85 7D STA $7D 0x03F6CB|$0F:$F6BB:8D C8 60 STA $60C8 ; speech sound effect / auto-indent flag 0x03F6CE|$0F:$F6BE:A9 04 LDA #$04 0x03F6D0|$0F:$F6C0:38 SEC 0x03F6D1|$0F:$F6C1:60 RTS ; load bank specified by $94 ; control flow target (from $F4AD, $F4E9, $F5E5, $F5FB, $F615, $F638, $FA65, $FC85, $FF94) 0x03F6D2|$0F:$F6C2:48 PHA 0x03F6D3|$0F:$F6C3:A5 94 LDA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03F6D5|$0F:$F6C5:4C 82 F7 JMP $F782 ; load bank specified by A then PLA ; code -> data ; mini status menu IDs ; indexed data load target (from $F68C) 0x03F6D8|$0F:$F6C8:00 ; Mini status window, bottom, Midenhall only 0x03F6D9|$0F:$F6C9:1E ; Mini status window, bottom, Midenhall + Cannock 0x03F6DA|$0F:$F6CA:1F ; Mini status window, bottom, Midenhall + Cannock + Moonbrooke 0x03F6DB|$0F:$F6CB:01 ; Mini status window, top, Midenhall only 0x03F6DC|$0F:$F6CC:20 ; Mini status window, top, Midenhall + Cannock 0x03F6DD|$0F:$F6CD:21 ; Mini status window, top, Midenhall + Cannock + Moonbrooke ; data -> code ; return number of party members - 1 in A/X ; control flow target (from $CDB5) ; external control flow target (from $06:$8223, $06:$82F1, $06:$83EE, $06:$8485, $06:$857E, $06:$85C7, $06:$8620, $06:$8FD2, $06:$9023, $06:$93A3, $06:$99AF, $06:$9C80, $06:$A241) 0x03F6DE|$0F:$F6CE:A0 00 LDY #$00 ; status index 0x03F6E0|$0F:$F6D0:A2 00 LDX #$00 ; party member counter 0x03F6E2|$0F:$F6D2:A9 03 LDA #$03 ; maximum number of party members 0x03F6E4|$0F:$F6D4:85 0C STA $0C ; remaining party members to check ; control flow target (from $F6E5) 0x03F6E6|$0F:$F6D6:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x03F6E9|$0F:$F6D9:29 04 AND #$04 ; pick out the "In Party" bit 0x03F6EB|$0F:$F6DB:F0 01 BEQ $F6DE ; if member is in party, increment party member counter 0x03F6ED|$0F:$F6DD:E8 INX ; control flow target (from $F6DB) 0x03F6EE|$0F:$F6DE:98 TYA ; update status index for next party member 0x03F6EF|$0F:$F6DF:18 CLC 0x03F6F0|$0F:$F6E0:69 12 ADC #$12 ; hero data is #$12 bytes long 0x03F6F2|$0F:$F6E2:A8 TAY 0x03F6F3|$0F:$F6E3:C6 0C DEC $0C ; remaining party members to check 0x03F6F5|$0F:$F6E5:D0 EF BNE $F6D6 ; if more members to check, check them 0x03F6F7|$0F:$F6E7:CA DEX 0x03F6F8|$0F:$F6E8:8A TXA 0x03F6F9|$0F:$F6E9:60 RTS ; open main dialogue window and display string ID specified by byte following JSR ; control flow target (from $C83E, $CAA5, $CB90, $CBFC, $CC72) ; external control flow target (from $06:$80EF, $06:$8B83, $07:$81F3, $07:$8223, $07:$8234, $07:$827B, $07:$82E7, $07:$8351, $07:$8362, $07:$8369, $07:$83FE, $07:$84C7, $07:$8582) 0x03F6FA|$0F:$F6EA:20 FC F6 JSR $F6FC ; open main dialogue window, set A to string ID specified by byte following second JSR 0x03F6FD|$0F:$F6ED:4C 4A FA JMP $FA4A ; display string ID specified by A ; open main dialogue window and display string ID specified by byte following JSR + #$0100 ; external control flow target (from $06:$80C3, $06:$822E, $06:$82C3, $06:$839F, $06:$8553, $06:$86C0, $06:$8A49) 0x03F700|$0F:$F6F0:20 FC F6 JSR $F6FC ; open main dialogue window, set A to string ID specified by byte following second JSR 0x03F703|$0F:$F6F3:4C 4E FA JMP $FA4E ; display string ID specified by A + #$0100 ; open main dialogue window and display string ID specified by byte following JSR + #$0200 ; control flow target (from $C940, $C9AB, $C9F2, $CB2E, $CC4D) ; external control flow target (from $06:$80E1, $06:$81A6, $06:$82BC, $06:$9368, $06:$A2C6) 0x03F706|$0F:$F6F6:20 FC F6 JSR $F6FC ; open main dialogue window, set A to string ID specified by byte following second JSR 0x03F709|$0F:$F6F9:4C 52 FA JMP $FA52 ; display string ID specified by A + #$0200 ; open main dialogue window, set A to string ID specified by byte following second JSR ; control flow target (from $F6EA, $F6F0, $F6F6) 0x03F70C|$0F:$F6FC:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x03F70F|$0F:$F6FF:04 ; Menu ID #$04: Dialogue window ; data -> code 0x03F710|$0F:$F700:68 PLA ; first JSR's return address, low byte 0x03F711|$0F:$F701:85 0C STA $0C ; first JSR's return address, low byte 0x03F713|$0F:$F703:68 PLA ; first JSR's return address, high byte 0x03F714|$0F:$F704:85 0D STA $0D ; first JSR's return address, high byte 0x03F716|$0F:$F706:68 PLA ; second JSR's return address, low byte 0x03F717|$0F:$F707:18 CLC 0x03F718|$0F:$F708:69 01 ADC #$01 ; byte following second JSR is data 0x03F71A|$0F:$F70A:85 0E STA $0E ; second JSR's new return address, low byte 0x03F71C|$0F:$F70C:68 PLA ; second JSR's return address, high byte 0x03F71D|$0F:$F70D:69 00 ADC #$00 ; add carry from incrementing low byte 0x03F71F|$0F:$F70F:85 0F STA $0F 0x03F721|$0F:$F711:48 PHA ; second JSR's new return address, high byte 0x03F722|$0F:$F712:A5 0E LDA $0E ; second JSR's new return address, low byte 0x03F724|$0F:$F714:48 PHA ; second JSR's new return address, low byte 0x03F725|$0F:$F715:A0 00 LDY #$00 0x03F727|$0F:$F717:B1 0E LDA ($0E),Y ; read byte following second JSR 0x03F729|$0F:$F719:A8 TAY ; stash in Y for now 0x03F72A|$0F:$F71A:A5 0D LDA $0D ; first JSR's return address, high byte 0x03F72C|$0F:$F71C:48 PHA ; first JSR's return address, high byte 0x03F72D|$0F:$F71D:A5 0C LDA $0C ; first JSR's return address, low byte 0x03F72F|$0F:$F71F:48 PHA ; first JSR's return address, low byte 0x03F730|$0F:$F720:98 TYA ; copy desired menu ID to A 0x03F731|$0F:$F721:60 RTS ; restore the hero ID in A's MP by a random amount based on the Wizard's Ring's power; returns a random number between $03 and #$0A in A and $99 ; external control flow target (from $06:$97FE) 0x03F732|$0F:$F722:20 66 F7 JSR $F766 ; load ROM bank #$04 ; call to code in a different bank ($04:$8003) 0x03F735|$0F:$F725:20 03 80 JSR $8003 ; restore the hero ID in A's MP by a random amount based on the Wizard's Ring's power; returns a random number between $03 and #$0A in A and $99 0x03F738|$0F:$F728:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; heal hero ID in A by random amount based on healing power in X ; identical to $0F:$D146 ; external control flow target (from $06:$95F3) 0x03F73B|$0F:$F72B:20 66 F7 JSR $F766 ; load ROM bank #$04 ; call to code in a different bank ($04:$8006) 0x03F73E|$0F:$F72E:20 06 80 JSR $8006 0x03F741|$0F:$F731:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; set $8F-$90 to EXP required to reach next level ; external control flow target (from $06:$9473) 0x03F744|$0F:$F734:20 66 F7 JSR $F766 ; load ROM bank #$04 ; call to code in a different bank ($04:$800C) 0x03F747|$0F:$F737:20 0C 80 JSR $800C ; set $8F-$90 to EXP required to reach next level 0x03F74A|$0F:$F73A:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; calls $04:$99E6 ; external control flow target (from $06:$9900, $06:$990C, $06:$995B, $06:$99A0) 0x03F74D|$0F:$F73D:20 66 F7 JSR $F766 ; load ROM bank #$04 ; call to code in a different bank ($04:$8012) 0x03F750|$0F:$F740:20 12 80 JSR $8012 0x03F753|$0F:$F743:4C 61 F7 JMP $F761 ; load ROM bank #$06 ; external control flow target (from $04:$A176) 0x03F756|$0F:$F746:20 61 F7 JSR $F761 ; load ROM bank #$06 0x03F759|$0F:$F749:A0 06 LDY #$06 0x03F75B|$0F:$F74B:84 94 STY $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus ; call to code in a different bank ($06:$9829) 0x03F75D|$0F:$F74D:20 29 98 JSR $9829 0x03F760|$0F:$F750:A0 04 LDY #$04 0x03F762|$0F:$F752:84 94 STY $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03F764|$0F:$F754:4C 66 F7 JMP $F766 ; load ROM bank #$04 ; code -> data ; table of first item IDs for each item type ; external indexed data load target (from $06:$8A68) 0x03F767|$0F:$F757:01 ; Weapons ; external indexed data load target (from $06:$8A6D) 0x03F768|$0F:$F758:11 ; Armour 0x03F769|$0F:$F759:1C ; Helmets 0x03F76A|$0F:$F75A:21 ; Shields 0x03F76B|$0F:$F75B:24 ; non-EQUIP items ; data -> code ; load ROM bank #$00 ; control flow target (from $C6A8, $D21D, $D231, $D23E, $D250, $D29C, $D2A9, $D302, $D334, $D494, $E41D, $E43F) 0x03F76C|$0F:$F75C:48 PHA 0x03F76D|$0F:$F75D:A9 00 LDA #$00 0x03F76F|$0F:$F75F:F0 21 BEQ $F782 ; load bank specified by A then PLA ; load ROM bank #$06 ; control flow target (from $C6ED, $C70C, $C786, $C89B, $CCAC, $CD48, $CF67, $D0F2, $D14C, $D156, $D164, $D215, $D23B, $D259, $D2EC, $D2F4, $D32B, $D57E, $E435, $E8B2, $EEC9, $F255, $F289, $F728, $F731, $F73A, $F743, $F746) 0x03F771|$0F:$F761:48 PHA 0x03F772|$0F:$F762:A9 06 LDA #$06 0x03F774|$0F:$F764:D0 1C BNE $F782 ; load bank specified by A then PLA ; load ROM bank #$04 ; control flow target (from $C771, $C8EC, $C95C, $D0EC, $D146, $D1A4, $D1C9, $D200, $D25C, $F722, $F72B, $F734, $F73D, $F754) 0x03F776|$0F:$F766:48 PHA 0x03F777|$0F:$F767:A9 04 LDA #$04 0x03F779|$0F:$F769:D0 17 BNE $F782 ; load bank specified by A then PLA ; laod ROM bank #$01 0x03F77B|$0F:$F76B:48 PHA 0x03F77C|$0F:$F76C:A9 01 LDA #$01 0x03F77E|$0F:$F76E:D0 12 BNE $F782 ; load bank specified by A then PLA ; load ROM bank #$02 ; control flow target (from $CF61, $D369, $D5B6, $D7D4, $D7EE, $D890, $DECE, $DF86, $E169, $E3E8, $E445, $E461, $E4DF, $E94A, $F9AA, $FA8A, $FE3A) 0x03F780|$0F:$F770:48 PHA 0x03F781|$0F:$F771:A9 02 LDA #$02 0x03F783|$0F:$F773:D0 0D BNE $F782 ; load bank specified by A then PLA ; load ROM bank #$03 ; control flow target (from $C680, $D17C, $D517, $D7A6, $D81C, $D8D0, $DB96, $DC9C, $DFC9, $E2F9) 0x03F785|$0F:$F775:48 PHA 0x03F786|$0F:$F776:A9 03 LDA #$03 0x03F788|$0F:$F778:D0 08 BNE $F782 ; load bank specified by A then PLA ; load ROM bank #$07 ; control flow target (from $D969) 0x03F78A|$0F:$F77A:48 PHA 0x03F78B|$0F:$F77B:A9 07 LDA #$07 0x03F78D|$0F:$F77D:D0 03 BNE $F782 ; load bank specified by A then PLA ; load ROM bank #$05 0x03F78F|$0F:$F77F:48 PHA 0x03F790|$0F:$F780:A9 05 LDA #$05 ; load bank specified by A then PLA ; control flow target (from $EB95, $F31E, $F6C5, $F75F, $F764, $F769, $F76E, $F773, $F778, $F77D) 0x03F792|$0F:$F782:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A 0x03F795|$0F:$F785:68 PLA 0x03F796|$0F:$F786:60 RTS ; control flow target (from $CF70) 0x03F797|$0F:$F787:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03F79A|$0F:$F78A:41 ; $02:$8002 ; data -> code 0x03F79B|$0F:$F78B:60 RTS ; wipe selected menu region ; control flow target (from $CF6A, $D130, $D135, $D13A, $E5BB, $F5B6) ; external control flow target (from $04:$9ACC) 0x03F79C|$0F:$F78C:85 0C STA $0C ; A values of #$00, #$01, #$02, and #$05 wipe all menus; #$03, #$04, #$06, and #$07 do not 0x03F79E|$0F:$F78E:C9 05 CMP #$05 0x03F7A0|$0F:$F790:F0 04 BEQ $F796 0x03F7A2|$0F:$F792:C9 03 CMP #$03 0x03F7A4|$0F:$F794:B0 02 BCS $F798 ; control flow target (from $F790) 0x03F7A6|$0F:$F796:A9 00 LDA #$00 ; control flow target (from $F794) 0x03F7A8|$0F:$F798:85 2E STA $2E ; whether to wipe all menus (#$00) or not 0x03F7AA|$0F:$F79A:A5 0C LDA $0C 0x03F7AC|$0F:$F79C:0A ASL 0x03F7AD|$0F:$F79D:0A ASL 0x03F7AE|$0F:$F79E:A8 TAY 0x03F7AF|$0F:$F79F:B9 DB F8 LDA $F8DB,Y 0x03F7B2|$0F:$F7A2:29 0F AND #$0F 0x03F7B4|$0F:$F7A4:85 0C STA $0C 0x03F7B6|$0F:$F7A6:38 SEC 0x03F7B7|$0F:$F7A7:E9 08 SBC #$08 0x03F7B9|$0F:$F7A9:0A ASL 0x03F7BA|$0F:$F7AA:85 18 STA $18 0x03F7BC|$0F:$F7AC:B9 DC F8 LDA $F8DC,Y 0x03F7BF|$0F:$F7AF:85 0E STA $0E 0x03F7C1|$0F:$F7B1:48 PHA 0x03F7C2|$0F:$F7B2:0A ASL 0x03F7C3|$0F:$F7B3:0A ASL 0x03F7C4|$0F:$F7B4:0A ASL 0x03F7C5|$0F:$F7B5:0A ASL 0x03F7C6|$0F:$F7B6:05 0C ORA $0C 0x03F7C8|$0F:$F7B8:8D 7C 60 STA $607C 0x03F7CB|$0F:$F7BB:68 PLA 0x03F7CC|$0F:$F7BC:38 SEC 0x03F7CD|$0F:$F7BD:E9 07 SBC #$07 0x03F7CF|$0F:$F7BF:0A ASL 0x03F7D0|$0F:$F7C0:85 19 STA $19 0x03F7D2|$0F:$F7C2:B9 DD F8 LDA $F8DD,Y 0x03F7D5|$0F:$F7C5:85 53 STA $53 0x03F7D7|$0F:$F7C7:85 4E STA $4E 0x03F7D9|$0F:$F7C9:B9 DE F8 LDA $F8DE,Y 0x03F7DC|$0F:$F7CC:85 54 STA $54 0x03F7DE|$0F:$F7CE:A5 53 LDA $53 0x03F7E0|$0F:$F7D0:0A ASL 0x03F7E1|$0F:$F7D1:65 18 ADC $18 0x03F7E3|$0F:$F7D3:85 18 STA $18 0x03F7E5|$0F:$F7D5:85 4D STA $4D 0x03F7E7|$0F:$F7D7:A5 4E LDA $4E 0x03F7E9|$0F:$F7D9:29 0F AND #$0F 0x03F7EB|$0F:$F7DB:18 CLC 0x03F7EC|$0F:$F7DC:69 01 ADC #$01 0x03F7EE|$0F:$F7DE:09 10 ORA #$10 0x03F7F0|$0F:$F7E0:8D 7B 60 STA $607B 0x03F7F3|$0F:$F7E3:20 31 DE JSR $DE31 0x03F7F6|$0F:$F7E6:A5 07 LDA $07 0x03F7F8|$0F:$F7E8:85 4F STA $4F 0x03F7FA|$0F:$F7EA:A5 08 LDA $08 0x03F7FC|$0F:$F7EC:85 50 STA $50 ; control flow target (from $F85C) 0x03F7FE|$0F:$F7EE:A5 4E LDA $4E 0x03F800|$0F:$F7F0:0A ASL 0x03F801|$0F:$F7F1:8D 9E 60 STA $609E ; menu current column ; control flow target (from $F838) 0x03F804|$0F:$F7F4:A4 53 LDY $53 0x03F806|$0F:$F7F6:A5 2E LDA $2E ; whether to wipe all menus (#$00) or not 0x03F808|$0F:$F7F8:F0 2B BEQ $F825 ; display background tiles 0x03F80A|$0F:$F7FA:C9 03 CMP #$03 0x03F80C|$0F:$F7FC:F0 0A BEQ $F808 0x03F80E|$0F:$F7FE:C9 07 CMP #$07 0x03F810|$0F:$F800:F0 06 BEQ $F808 0x03F812|$0F:$F802:A9 10 LDA #$10 0x03F814|$0F:$F804:85 1E STA $1E 0x03F816|$0F:$F806:D0 0E BNE $F816 ; control flow target (from $F7FC, $F800) 0x03F818|$0F:$F808:A9 00 LDA #$00 0x03F81A|$0F:$F80A:85 1E STA $1E 0x03F81C|$0F:$F80C:B1 4F LDA ($4F),Y ; screen map of background vs. menu tile 0x03F81E|$0F:$F80E:F0 15 BEQ $F825 ; display background tiles 0x03F820|$0F:$F810:C9 FF CMP #$FF 0x03F822|$0F:$F812:F0 11 BEQ $F825 ; display background tiles 0x03F824|$0F:$F814:A9 00 LDA #$00 ; control flow target (from $F806) 0x03F826|$0F:$F816:20 70 F8 JSR $F870 0x03F829|$0F:$F819:90 0A BCC $F825 ; display background tiles 0x03F82B|$0F:$F81B:A9 00 LDA #$00 0x03F82D|$0F:$F81D:85 1C STA $1C 0x03F82F|$0F:$F81F:20 AA F9 JSR $F9AA ; display menu tiles 0x03F832|$0F:$F822:4C 32 F8 JMP $F832 ; control flow target (from $F7F8, $F80E, $F812, $F819) 0x03F835|$0F:$F825:A9 00 LDA #$00 0x03F837|$0F:$F827:A4 53 LDY $53 0x03F839|$0F:$F829:91 4F STA ($4F),Y ; update screen map to show background tiles 0x03F83B|$0F:$F82B:85 1C STA $1C 0x03F83D|$0F:$F82D:85 1E STA $1E 0x03F83F|$0F:$F82F:20 47 F9 JSR $F947 ; menu and background code paths rejoin here ; control flow target (from $F822) 0x03F842|$0F:$F832:C6 18 DEC $18 0x03F844|$0F:$F834:C6 18 DEC $18 0x03F846|$0F:$F836:C6 53 DEC $53 0x03F848|$0F:$F838:10 BA BPL $F7F4 0x03F84A|$0F:$F83A:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03F84D|$0F:$F83D:C0 ; $06:$8000 ; data -> code 0x03F84E|$0F:$F83E:AD 7C 60 LDA $607C 0x03F851|$0F:$F841:38 SEC 0x03F852|$0F:$F842:E9 10 SBC #$10 0x03F854|$0F:$F844:8D 7C 60 STA $607C 0x03F857|$0F:$F847:A5 4F LDA $4F 0x03F859|$0F:$F849:38 SEC 0x03F85A|$0F:$F84A:E9 10 SBC #$10 0x03F85C|$0F:$F84C:85 4F STA $4F 0x03F85E|$0F:$F84E:A5 4D LDA $4D 0x03F860|$0F:$F850:85 18 STA $18 0x03F862|$0F:$F852:A5 4E LDA $4E 0x03F864|$0F:$F854:85 53 STA $53 0x03F866|$0F:$F856:C6 19 DEC $19 0x03F868|$0F:$F858:C6 19 DEC $19 0x03F86A|$0F:$F85A:C6 54 DEC $54 0x03F86C|$0F:$F85C:10 90 BPL $F7EE 0x03F86E|$0F:$F85E:A5 35 LDA $35 ; flag indicating whether any menu is currently open 0x03F870|$0F:$F860:F0 09 BEQ $F86B 0x03F872|$0F:$F862:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03F875|$0F:$F865:20 CB D8 JSR $D8CB 0x03F878|$0F:$F868:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $F860) 0x03F87B|$0F:$F86B:A5 94 LDA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03F87D|$0F:$F86D:4C D5 C3 JMP $C3D5 ; save A to $05F6, X to $43, and load bank specified by A ; control flow target (from $F816) 0x03F880|$0F:$F870:A8 TAY 0x03F881|$0F:$F871:D0 17 BNE $F88A 0x03F883|$0F:$F873:A5 54 LDA $54 0x03F885|$0F:$F875:AE 9E 60 LDX $609E ; menu current column 0x03F888|$0F:$F878:C9 04 CMP #$04 0x03F88A|$0F:$F87A:B0 1F BCS $F89B 0x03F88C|$0F:$F87C:E0 08 CPX #$08 0x03F88E|$0F:$F87E:B0 1B BCS $F89B 0x03F890|$0F:$F880:0A ASL 0x03F891|$0F:$F881:0A ASL 0x03F892|$0F:$F882:0A ASL 0x03F893|$0F:$F883:0A ASL 0x03F894|$0F:$F884:85 10 STA $10 0x03F896|$0F:$F886:8A TXA 0x03F897|$0F:$F887:0A ASL 0x03F898|$0F:$F888:65 10 ADC $10 ; control flow target (from $F871) 0x03F89A|$0F:$F88A:18 CLC 0x03F89B|$0F:$F88B:6D FD F8 ADC $F8FD 0x03F89E|$0F:$F88E:85 10 STA $10 0x03F8A0|$0F:$F890:A9 00 LDA #$00 0x03F8A2|$0F:$F892:6D FE F8 ADC $F8FE 0x03F8A5|$0F:$F895:85 11 STA $11 0x03F8A7|$0F:$F897:85 1E STA $1E 0x03F8A9|$0F:$F899:D0 3C BNE $F8D7 ; control flow target (from $F87A, $F87E) 0x03F8AB|$0F:$F89B:C9 08 CMP #$08 0x03F8AD|$0F:$F89D:D0 3A BNE $F8D9 0x03F8AF|$0F:$F89F:AD 92 04 LDA $0492 0x03F8B2|$0F:$F8A2:F0 35 BEQ $F8D9 0x03F8B4|$0F:$F8A4:AD FB F8 LDA $F8FB 0x03F8B7|$0F:$F8A7:85 10 STA $10 0x03F8B9|$0F:$F8A9:AD FC F8 LDA $F8FC 0x03F8BC|$0F:$F8AC:85 11 STA $11 0x03F8BE|$0F:$F8AE:A9 77 LDA #$77 0x03F8C0|$0F:$F8B0:8D B5 60 STA $60B5 0x03F8C3|$0F:$F8B3:8D B6 60 STA $60B6 0x03F8C6|$0F:$F8B6:85 1E STA $1E 0x03F8C8|$0F:$F8B8:8A TXA 0x03F8C9|$0F:$F8B9:18 CLC 0x03F8CA|$0F:$F8BA:69 07 ADC #$07 0x03F8CC|$0F:$F8BC:AA TAX 0x03F8CD|$0F:$F8BD:BD F8 06 LDA $06F8,X ; start of main dialogue window 0x03F8D0|$0F:$F8C0:8D B7 60 STA $60B7 0x03F8D3|$0F:$F8C3:BD F9 06 LDA $06F9,X 0x03F8D6|$0F:$F8C6:8D B8 60 STA $60B8 0x03F8D9|$0F:$F8C9:E0 15 CPX #$15 0x03F8DB|$0F:$F8CB:D0 0A BNE $F8D7 0x03F8DD|$0F:$F8CD:A9 7C LDA #$7C 0x03F8DF|$0F:$F8CF:8D B6 60 STA $60B6 0x03F8E2|$0F:$F8D2:A9 7B LDA #$7B 0x03F8E4|$0F:$F8D4:8D B8 60 STA $60B8 ; control flow target (from $F899, $F8CB) 0x03F8E7|$0F:$F8D7:38 SEC 0x03F8E8|$0F:$F8D8:60 RTS ; control flow target (from $F89D, $F8A2) 0x03F8E9|$0F:$F8D9:18 CLC 0x03F8EA|$0F:$F8DA:60 RTS ; code -> data ; byte 1 sets $0C and ((byte 1) - #$08) << 1 sets $18 ; byte 2 sets $0E, ((byte 2) << 4) | (byte 1) sets $607C, ((byte 2) - #$07) << 1 sets $19 ; byte 3 sets $53 and $4E ; byte 4 sets $54 and stuff: $18, $4D, $607B ; maybe (X start, Y start, width, height)? ; indexed data load target (from $F79F) 0x03F8EB|$0F:$F8DB:02 ; indexed data load target (from $F7AC) 0x03F8EC|$0F:$F8DC: 0D ; indexed data load target (from $F7C2) 0x03F8ED|$0F:$F8DD: 0C ; indexed data load target (from $F7C9) 0x03F8EE|$0F:$F8DE: 03 ; anything in the dialogue window area, including the mini-status menu and bottom of the full status menu 0x03F8EF|$0F:$F8DF:02 09 0C 08 ; anything in the top area, including main COMMAND/STATUS/SPELL menu 0x03F8F3|$0F:$F8E3:0A 06 03 03 ; YES/NO menu 0x03F8F7|$0F:$F8E7:06 09 07 08 ; item list in SELL menu 0x03F8FB|$0F:$F8EB:02 0D 0B 04 ; bottom battle menu region 0x03F8FF|$0F:$F8EF:02 0D 0B 04 ; ??? 0x03F903|$0F:$F8F3:02 0D 03 04 ; ??? 0x03F907|$0F:$F8F7:06 0A 07 09 ; EQUIP sub-menu ; data load target (from $F8A4) 0x03F90B|$0F:$F8FB:B5 ; data load target (from $F8A9) 0x03F90C|$0F:$F8FC:60 ; data load target (from $F88B) 0x03F90D|$0F:$F8FD:FF ; data load target (from $F892) 0x03F90E|$0F:$F8FE:F8 ; tiles for redrawing the part of the main COMMAND menu obscured by the EQUIP sub-menu when the EQUIP sub-menu is closed; (only?) read outside of battle ; indirect data load target 0x03F90F|$0F:$F8FF:24 31 5F 5F 0x03F913|$0F:$F903:27 77 5F 5F 0x03F917|$0F:$F907:77 77 5F 5F 0x03F91B|$0F:$F90B:77 7C 5F 7B 0x03F91F|$0F:$F90F:5F 5F 5F 5F 0x03F923|$0F:$F913:36 33 5F 5F 0x03F927|$0F:$F917:28 2F 5F 5F 0x03F92B|$0F:$F91B:2F 7B 5F 7B 0x03F92F|$0F:$F91F:5F 5F 5F 5F 0x03F933|$0F:$F923:2C 37 5F 5F 0x03F937|$0F:$F927:28 30 5F 5F 0x03F93B|$0F:$F92B:5F 7B 5F 7B 0x03F93F|$0F:$F92F:5F 5F 7D 7D 0x03F943|$0F:$F933:28 34 7D 7D 0x03F947|$0F:$F937:38 2C 7D 7D 0x03F94B|$0F:$F93B:33 7B 7D 7E ; indexed data load target (from $FA00, $FA06) 0x03F94F|$0F:$F93F:CB 83 ; $02:$83CB 0x03F951|$0F:$F941:6B 84 ; $02:$846B 0x03F953|$0F:$F943:33 85 ; $02:$8533 0x03F955|$0F:$F945:FB 85 ; $02:$85FB ; data -> code ; control flow target (from $F82F) 0x03F957|$0F:$F947:A5 18 LDA $18 0x03F959|$0F:$F949:0A ASL 0x03F95A|$0F:$F94A:A5 18 LDA $18 0x03F95C|$0F:$F94C:6A ROR 0x03F95D|$0F:$F94D:18 CLC 0x03F95E|$0F:$F94E:65 16 ADC $16 ; current map X-pos (1) 0x03F960|$0F:$F950:85 0C STA $0C 0x03F962|$0F:$F952:A5 19 LDA $19 0x03F964|$0F:$F954:0A ASL 0x03F965|$0F:$F955:A5 19 LDA $19 0x03F967|$0F:$F957:6A ROR 0x03F968|$0F:$F958:18 CLC 0x03F969|$0F:$F959:65 17 ADC $17 ; current map Y-pos (1) 0x03F96B|$0F:$F95B:85 0E STA $0E 0x03F96D|$0F:$F95D:20 89 DF JSR $DF89 0x03F970|$0F:$F960:20 22 E2 JSR $E222 0x03F973|$0F:$F963:A5 1D LDA $1D 0x03F975|$0F:$F965:C5 0D CMP $0D 0x03F977|$0F:$F967:F0 22 BEQ $F98B 0x03F979|$0F:$F969:A5 0C LDA $0C 0x03F97B|$0F:$F96B:C9 28 CMP #$28 0x03F97D|$0F:$F96D:B0 1C BCS $F98B 0x03F97F|$0F:$F96F:A5 1D LDA $1D 0x03F981|$0F:$F971:D0 14 BNE $F987 0x03F983|$0F:$F973:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03F985|$0F:$F975:C9 01 CMP #$01 0x03F987|$0F:$F977:F0 0A BEQ $F983 0x03F989|$0F:$F979:A5 0C LDA $0C 0x03F98B|$0F:$F97B:C9 08 CMP #$08 0x03F98D|$0F:$F97D:90 04 BCC $F983 0x03F98F|$0F:$F97F:C9 0C CMP #$0C 0x03F991|$0F:$F981:90 08 BCC $F98B ; control flow target (from $F977, $F97D) 0x03F993|$0F:$F983:A9 20 LDA #$20 0x03F995|$0F:$F985:D0 02 BNE $F989 ; control flow target (from $F971) 0x03F997|$0F:$F987:A9 24 LDA #$24 ; control flow target (from $F985) 0x03F999|$0F:$F989:85 0C STA $0C ; control flow target (from $F967, $F96D, $F981) 0x03F99B|$0F:$F98B:A5 1C LDA $1C 0x03F99D|$0F:$F98D:C9 FF CMP #$FF 0x03F99F|$0F:$F98F:D0 07 BNE $F998 0x03F9A1|$0F:$F991:A5 0C LDA $0C 0x03F9A3|$0F:$F993:C9 20 CMP #$20 0x03F9A5|$0F:$F995:90 0C BCC $F9A3 0x03F9A7|$0F:$F997:60 RTS ; control flow target (from $F98F) 0x03F9A8|$0F:$F998:C9 FE CMP #$FE 0x03F9AA|$0F:$F99A:D0 0B BNE $F9A7 0x03F9AC|$0F:$F99C:A5 0C LDA $0C 0x03F9AE|$0F:$F99E:C9 20 CMP #$20 0x03F9B0|$0F:$F9A0:B0 01 BCS $F9A3 0x03F9B2|$0F:$F9A2:60 RTS ; control flow target (from $F995, $F9A0) 0x03F9B3|$0F:$F9A3:A9 00 LDA #$00 0x03F9B5|$0F:$F9A5:85 1C STA $1C ; control flow target (from $F99A) 0x03F9B7|$0F:$F9A7:20 F6 F9 JSR $F9F6 ; control flow target (from $F81F) 0x03F9BA|$0F:$F9AA:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03F9BD|$0F:$F9AD:A0 00 LDY #$00 0x03F9BF|$0F:$F9AF:8C 9F 60 STY $609F ; menu current row 0x03F9C2|$0F:$F9B2:B1 10 LDA ($10),Y 0x03F9C4|$0F:$F9B4:20 0E FA JSR $FA0E 0x03F9C7|$0F:$F9B7:C8 INY 0x03F9C8|$0F:$F9B8:B1 10 LDA ($10),Y 0x03F9CA|$0F:$F9BA:20 0E FA JSR $FA0E 0x03F9CD|$0F:$F9BD:C8 INY 0x03F9CE|$0F:$F9BE:CE 9E 60 DEC $609E ; menu current column 0x03F9D1|$0F:$F9C1:CE 9E 60 DEC $609E ; menu current column 0x03F9D4|$0F:$F9C4:A9 01 LDA #$01 0x03F9D6|$0F:$F9C6:8D 9F 60 STA $609F ; menu current row 0x03F9D9|$0F:$F9C9:B1 10 LDA ($10),Y 0x03F9DB|$0F:$F9CB:20 0E FA JSR $FA0E 0x03F9DE|$0F:$F9CE:C8 INY 0x03F9DF|$0F:$F9CF:B1 10 LDA ($10),Y 0x03F9E1|$0F:$F9D1:20 0E FA JSR $FA0E 0x03F9E4|$0F:$F9D4:C8 INY 0x03F9E5|$0F:$F9D5:A9 00 LDA #$00 0x03F9E7|$0F:$F9D7:A6 1E LDX $1E 0x03F9E9|$0F:$F9D9:D0 04 BNE $F9DF 0x03F9EB|$0F:$F9DB:B1 10 LDA ($10),Y 0x03F9ED|$0F:$F9DD:29 03 AND #$03 ; control flow target (from $F9D9) 0x03F9EF|$0F:$F9DF:48 PHA 0x03F9F0|$0F:$F9E0:AD 9E 60 LDA $609E ; menu current column 0x03F9F3|$0F:$F9E3:38 SEC 0x03F9F4|$0F:$F9E4:E9 02 SBC #$02 0x03F9F6|$0F:$F9E6:4A LSR 0x03F9F7|$0F:$F9E7:AA TAX 0x03F9F8|$0F:$F9E8:68 PLA 0x03F9F9|$0F:$F9E9:9D 6B 60 STA $606B,X 0x03F9FC|$0F:$F9EC:AD 9E 60 LDA $609E ; menu current column 0x03F9FF|$0F:$F9EF:38 SEC 0x03FA00|$0F:$F9F0:E9 04 SBC #$04 0x03FA02|$0F:$F9F2:8D 9E 60 STA $609E ; menu current column 0x03FA05|$0F:$F9F5:60 RTS ; control flow target (from $F9A7) 0x03FA06|$0F:$F9F6:A5 1F LDA $1F ; some kind of map type (#$00: World Map, #$01: other non-dungeon maps, #$02: maps #$2B - #$43 inclusive, #$03: maps >= #$44, #$FF => game menu) 0x03FA08|$0F:$F9F8:0A ASL 0x03FA09|$0F:$F9F9:A8 TAY 0x03FA0A|$0F:$F9FA:A5 0C LDA $0C 0x03FA0C|$0F:$F9FC:0A ASL 0x03FA0D|$0F:$F9FD:0A ASL 0x03FA0E|$0F:$F9FE:65 0C ADC $0C 0x03FA10|$0F:$FA00:79 3F F9 ADC $F93F,Y 0x03FA13|$0F:$FA03:85 10 STA $10 0x03FA15|$0F:$FA05:C8 INY 0x03FA16|$0F:$FA06:B9 3F F9 LDA $F93F,Y 0x03FA19|$0F:$FA09:69 00 ADC #$00 0x03FA1B|$0F:$FA0B:85 11 STA $11 0x03FA1D|$0F:$FA0D:60 RTS ; control flow target (from $F9B4, $F9BA, $F9CB, $F9D1) 0x03FA1E|$0F:$FA0E:48 PHA 0x03FA1F|$0F:$FA0F:A2 00 LDX #$00 0x03FA21|$0F:$FA11:AD 9F 60 LDA $609F ; menu current row 0x03FA24|$0F:$FA14:F0 06 BEQ $FA1C 0x03FA26|$0F:$FA16:A5 4E LDA $4E 0x03FA28|$0F:$FA18:0A ASL 0x03FA29|$0F:$FA19:69 02 ADC #$02 0x03FA2B|$0F:$FA1B:AA TAX ; control flow target (from $FA14) 0x03FA2C|$0F:$FA1C:8A TXA 0x03FA2D|$0F:$FA1D:18 CLC 0x03FA2E|$0F:$FA1E:6D 9E 60 ADC $609E ; menu current column 0x03FA31|$0F:$FA21:AA TAX 0x03FA32|$0F:$FA22:68 PLA 0x03FA33|$0F:$FA23:9D 0B 60 STA $600B,X 0x03FA36|$0F:$FA26:EE 9E 60 INC $609E ; menu current column 0x03FA39|$0F:$FA29:60 RTS ; display string ID specified by next byte ; control flow target (from $C856, $CC0A, $D160) ; external control flow target (from $06:$80D6, $06:$8BBD, $06:$8BF8, $06:$8C18, $06:$8CCD, $06:$947F, $06:$94ED, $06:$94FB, $06:$950E, $06:$9515, $06:$9534, $06:$9538, $06:$9BEB, $06:$9C5B, $06:$A228, $07:$8377, $07:$8591) 0x03FA3A|$0F:$FA2A:A2 00 LDX #$00 0x03FA3C|$0F:$FA2C:F0 06 BEQ $FA34 ; display string ID specified by next byte + #$0100 ; external control flow target (from $02:$B2D2, $06:$8102, $06:$810B, $06:$8246, $06:$828D, $06:$8291, $06:$8298, $06:$829C, $06:$82CE, $06:$82D5, $06:$82EA, $06:$82FF, $06:$830A, $06:$8327, $06:$8341, $06:$8348, $06:$8358, $06:$835C, $06:$837C, $06:$83B2, $06:$83B9, $06:$83C4, $06:$83E7, $06:$83FF, $06:$840D, $06:$8423, $06:$843B, $06:$843F, $06:$844A, $06:$8451, $06:$8465, $06:$847E, $06:$848C, $06:$84B0, $06:$84B7, $06:$84FE, $06:$8502, $06:$8514, $06:$851F, $06:$8532, $06:$8547, $06:$8557, $06:$8563, $06:$856A, $06:$8585, $06:$859C, $06:$85AB, $06:$85CE, $06:$85F3, $06:$8602, $06:$8627, $06:$8641, $06:$8650, $06:$8672, $06:$8679, $06:$8694, $06:$869D, $06:$86CB, $06:$86DE, $06:$86EA, $06:$86F5, $06:$86FC, $06:$8707, $06:$871F, $06:$8738, $06:$8AB6, $06:$8ADC, $06:$8AF8, $06:$8B4E, $06:$8B62, $06:$8C3C, $06:$8C8D, $06:$91DC, $06:$9529, $06:$9577, $06:$95A0, $06:$95C9, $06:$963D, $06:$9647, $06:$965A, $06:$9668, $06:$9673, $06:$9685, $06:$96C9, $06:$96D7, $06:$96F2, $06:$96FE, $06:$973C, $06:$9750, $06:$979A, $06:$97ED, $06:$97F8, $06:$9805, $06:$9813, $06:$981E, $06:$988E, $06:$98CB, $06:$9903, $06:$9908, $06:$990F, $06:$992F, $06:$993B, $06:$995E, $06:$9963, $06:$999C, $06:$99A3, $06:$99BA, $06:$99E8, $06:$99F5, $06:$99F9, $06:$9A10, $06:$9A29, $06:$9A5B, $06:$9A62, $06:$9A72, $06:$9A7D, $06:$9AA2, $06:$9AAF, $06:$9ABD, $06:$9AC4, $06:$9AF4, $06:$9B7D, $06:$9B8A, $06:$9B92, $06:$9BAF, $06:$9BB3, $06:$9BBA, $06:$9BFE, $06:$9C30, $06:$9C62, $06:$9CAA, $06:$9CBA, $06:$9CC5, $06:$9CD2, $06:$9CF9, $06:$9D0E, $06:$9D30, $06:$9D3F, $06:$A24B, $06:$BB57, $06:$BB5B, $06:$BB67, $06:$BB73, $06:$BB7C, $06:$BBAF, $06:$BBD3, $06:$BC26) 0x03FA3E|$0F:$FA2E:A2 20 LDX #$20 0x03FA40|$0F:$FA30:D0 02 BNE $FA34 ; display string ID specified by next byte + #$0200 ; control flow target (from $CA35) ; external control flow target (from $02:$B2EB, $06:$8163, $06:$83D5, $06:$841A, $06:$8E39, $06:$8E3D, $06:$8ED5, $06:$8EF6, $06:$8EFA, $06:$8F05, $06:$8F11, $06:$8F1C, $06:$8F29, $06:$8F32, $06:$8F47, $06:$8F58, $06:$8F63, $06:$8F94, $06:$8FB1, $06:$8FD7, $06:$8FEF, $06:$8FFE, $06:$9002, $06:$9012, $06:$9028, $06:$9055, $06:$905E, $06:$9065, $06:$907C, $06:$908E, $06:$909A, $06:$90A1, $06:$90BF, $06:$9102, $06:$910B, $06:$9117, $06:$916E, $06:$917E, $06:$9185, $06:$9190, $06:$91A8, $06:$91B3, $06:$91D0, $06:$91E6, $06:$91ED, $06:$91FA, $06:$9201, $06:$920C, $06:$9213, $06:$928B, $06:$9292, $06:$92E7, $06:$930B, $06:$933E, $06:$9348, $06:$9384, $06:$93EB, $06:$93F2, $06:$93F9, $06:$9407, $06:$9437, $06:$9446, $06:$9458, $06:$945F, $06:$9486, $06:$9817, $06:$A2E5, $06:$BD37, $06:$BD56) 0x03FA42|$0F:$FA32:A2 40 LDX #$40 ; control flow target (from $FA2C, $FA30) 0x03FA44|$0F:$FA34:68 PLA ; low byte of return address 0x03FA45|$0F:$FA35:18 CLC 0x03FA46|$0F:$FA36:69 01 ADC #$01 ; increment it (byte following the JSR is data) 0x03FA48|$0F:$FA38:85 0E STA $0E ; store to $0E 0x03FA4A|$0F:$FA3A:68 PLA ; high byte of return address 0x03FA4B|$0F:$FA3B:69 00 ADC #$00 ; add carry from incrementing low byte 0x03FA4D|$0F:$FA3D:85 0F STA $0F ; store to $0F 0x03FA4F|$0F:$FA3F:48 PHA ; push the new return address's high byte 0x03FA50|$0F:$FA40:A5 0E LDA $0E 0x03FA52|$0F:$FA42:48 PHA ; push the new return address's low byte 0x03FA53|$0F:$FA43:A0 00 LDY #$00 0x03FA55|$0F:$FA45:B1 0E LDA ($0E),Y ; load the byte following the original JSR 0x03FA57|$0F:$FA47:4C 54 FA JMP $FA54 ; display string ID specified by A ; control flow target (from $D196, $F6ED) ; external control flow target (from $04:$97F4, $04:$98C3, $04:$9CC7, $06:$94B8, $06:$94CB, $06:$94DE, $06:$A99F) 0x03FA5A|$0F:$FA4A:A2 00 LDX #$00 0x03FA5C|$0F:$FA4C:F0 06 BEQ $FA54 ; display string ID specified by A + #$0100 ; control flow target (from $F6F3) ; external control flow target (from $02:$B334, $04:$9CC4, $06:$95D8, $06:$97E3, $06:$98AC, $06:$98C7, $06:$992B, $06:$9A41, $06:$9B2D, $06:$9D49, $06:$A0CF) 0x03FA5E|$0F:$FA4E:A2 20 LDX #$20 0x03FA60|$0F:$FA50:D0 02 BNE $FA54 ; display string ID specified by A + #$0200 ; control flow target (from $F6F9) ; external control flow target (from $06:$8E30, $06:$8E51, $06:$8E64, $06:$8F7F, $06:$8FA6, $06:$8FC6, $06:$9039, $06:$90B9, $06:$90E9, $06:$90FC, $06:$9147, $06:$9168, $06:$9248, $06:$92F8, $06:$9326, $06:$9338, $06:$9359, $06:$9395, $06:$93B8, $06:$93DB) 0x03FA62|$0F:$FA52:A2 40 LDX #$40 ; control flow target (from $FA47, $FA4C, $FA50) 0x03FA64|$0F:$FA54:20 68 FA JSR $FA68 ; figure out which bank the string is in, scan to start of string 0x03FA67|$0F:$FA57:20 A7 FA JSR $FAA7 ; initialize text engine variables ; control flow target (from $FA63) 0x03FA6A|$0F:$FA5A:20 24 FB JSR $FB24 0x03FA6D|$0F:$FA5D:20 63 FB JSR $FB63 0x03FA70|$0F:$FA60:20 C8 FA JSR $FAC8 ; CLC if we've read an end token, otherwise (probably?) print word to screen and SEC 0x03FA73|$0F:$FA63:90 F5 BCC $FA5A 0x03FA75|$0F:$FA65:4C C2 F6 JMP $F6C2 ; load bank specified by $94 ; figure out which bank the string is in, scan to start of string ; control flow target (from $FA54) 0x03FA78|$0F:$FA68:20 6E FA JSR $FA6E ; text engine: determine which ROM bank to load based on string index 0x03FA7B|$0F:$FA6B:4C 8A FA JMP $FA8A ; given a string ID in X (high, << 5) + A (low), scan to start of string ; text engine: determine which ROM bank to load based on string index ; IN: ; A = low byte of string index ; X = high byte of string index << 5 (for easy adding later) ; Y and C irrelevant ; ; OUT: no change to A or X ; Y = index of ROM bank to swap in to read the string from ; C not used, but does indicate whether we ended up choosing bank 5 (clear) or 2 (set) ; control flow target (from $FA68) 0x03FA7E|$0F:$FA6E:A0 05 LDY #$05 ; default to bank 5 0x03FA80|$0F:$FA70:48 PHA ; save the original string index in A 0x03FA81|$0F:$FA71:29 F0 AND #$F0 ; useless op 0x03FA83|$0F:$FA73:4A LSR 0x03FA84|$0F:$FA74:4A LSR 0x03FA85|$0F:$FA75:4A LSR 0x03FA86|$0F:$FA76:4A LSR 0x03FA87|$0F:$FA77:85 10 STA $10 ; 16 strings per pointer, so low byte of string index >> 4 = low nybble of pointer index 0x03FA89|$0F:$FA79:8A TXA 0x03FA8A|$0F:$FA7A:29 E0 AND #$E0 0x03FA8C|$0F:$FA7C:4A LSR ; A = high nybble of pointer index 0x03FA8D|$0F:$FA7D:05 10 ORA $10 ; glue the high and low nybbles of the pointer index together into a single byte 0x03FA8F|$0F:$FA7F:C9 2E CMP #$2E 0x03FA91|$0F:$FA81:90 02 BCC $FA85 ; if the pointer index < #$2E, keep the bank 5 default 0x03FA93|$0F:$FA83:A0 02 LDY #$02 ; if the pointer index >= #$2E, load bank 2 instead ; control flow target (from $FA81) 0x03FA95|$0F:$FA85:8C C6 60 STY $60C6 ; ROM bank containing the desired text string 0x03FA98|$0F:$FA88:68 PLA ; restore the original string index in A ; control flow target (from $D12B) ; external control flow target (from $06:$9542, $06:$9550) 0x03FA99|$0F:$FA89:60 RTS ; given a string ID in X (high, << 5) + A (low), scan to start of string ; control flow target (from $FA6B) 0x03FA9A|$0F:$FA8A:20 70 F7 JSR $F770 ; load ROM bank #$02 0x03FA9D|$0F:$FA8D:86 11 STX $11 ; save high byte of string index to $11 0x03FA9F|$0F:$FA8F:85 10 STA $10 ; save low byte of string index to $10 0x03FAA1|$0F:$FA91:4A LSR ; 16 strings per 2-byte pointer = >> 4 + << 1 a.k.a. >> 3 + & #$1E 0x03FAA2|$0F:$FA92:4A LSR 0x03FAA3|$0F:$FA93:4A LSR 0x03FAA4|$0F:$FA94:29 1E AND #$1E 0x03FAA6|$0F:$FA96:18 CLC 0x03FAA7|$0F:$FA97:65 11 ADC $11 ; add high byte of string index to get pointer index 0x03FAA9|$0F:$FA99:A8 TAY 0x03FAAA|$0F:$FA9A:B9 52 B7 LDA $B752,Y ; -> $05:$8000: main script strings, part 1 0x03FAAD|$0F:$FA9D:85 55 STA $55 ; pointer to start of sub pointer data, low byte 0x03FAAF|$0F:$FA9F:B9 53 B7 LDA $B753,Y 0x03FAB2|$0F:$FAA2:85 56 STA $56 ; pointer to start of sub pointer data, high byte 0x03FAB4|$0F:$FAA4:4C B3 FD JMP $FDB3 ; scan through group of strings until we find the start of the desired string ; initialize text engine variables ; control flow target (from $FA57) 0x03FAB7|$0F:$FAA7:A9 00 LDA #$00 0x03FAB9|$0F:$FAA9:8D C8 60 STA $60C8 ; speech sound effect / auto-indent flag 0x03FABC|$0F:$FAAC:8D CA 60 STA $60CA ; unused text engine variable 0x03FABF|$0F:$FAAF:8D CC 60 STA $60CC ; text engine end token flag 0x03FAC2|$0F:$FAB2:8D C9 60 STA $60C9 ; count (only used as flag) of interpolated variable bytes read from $60F1 0x03FAC5|$0F:$FAB5:8D D2 60 STA $60D2 ; read index within current dictionary entry 0x03FAC8|$0F:$FAB8:A9 08 LDA #$08 0x03FACA|$0F:$FABA:8D C7 60 STA $60C7 0x03FACD|$0F:$FABD:A5 7C LDA $7C 0x03FACF|$0F:$FABF:8D CE 60 STA $60CE 0x03FAD2|$0F:$FAC2:A5 7D LDA $7D 0x03FAD4|$0F:$FAC4:8D CF 60 STA $60CF 0x03FAD7|$0F:$FAC7:60 RTS ; CLC if we've read an end token, otherwise (probably?) print word to screen and SEC ; control flow target (from $FA60) 0x03FAD8|$0F:$FAC8:AD CC 60 LDA $60CC ; text engine end token flag 0x03FADB|$0F:$FACB:D0 02 BNE $FACF 0x03FADD|$0F:$FACD:18 CLC 0x03FADE|$0F:$FACE:60 RTS ; control flow target (from $FACB) 0x03FADF|$0F:$FACF:A6 7D LDX $7D 0x03FAE1|$0F:$FAD1:AD D0 60 LDA $60D0 0x03FAE4|$0F:$FAD4:D0 03 BNE $FAD9 0x03FAE6|$0F:$FAD6:8E D0 60 STX $60D0 ; control flow target (from $FAD4) 0x03FAE9|$0F:$FAD9:AD D1 60 LDA $60D1 0x03FAEC|$0F:$FADC:D0 03 BNE $FAE1 0x03FAEE|$0F:$FADE:8E D1 60 STX $60D1 ; control flow target (from $FADC) 0x03FAF1|$0F:$FAE1:A5 8E LDA $8E ; flag for in battle or not (#$FF)? 0x03FAF3|$0F:$FAE3:10 26 BPL $FB0B 0x03FAF5|$0F:$FAE5:A5 7D LDA $7D 0x03FAF7|$0F:$FAE7:C9 01 CMP #$01 0x03FAF9|$0F:$FAE9:F0 01 BEQ $FAEC 0x03FAFB|$0F:$FAEB:4A LSR ; control flow target (from $FAE9) 0x03FAFC|$0F:$FAEC:18 CLC 0x03FAFD|$0F:$FAED:69 01 ADC #$01 0x03FAFF|$0F:$FAEF:85 9C STA $9C ; control flow target (from $FB08) 0x03FB01|$0F:$FAF1:38 SEC 0x03FB02|$0F:$FAF2:A5 7D LDA $7D 0x03FB04|$0F:$FAF4:ED CF 60 SBC $60CF 0x03FB07|$0F:$FAF7:90 12 BCC $FB0B 0x03FB09|$0F:$FAF9:F0 10 BEQ $FB0B 0x03FB0B|$0F:$FAFB:C9 01 CMP #$01 0x03FB0D|$0F:$FAFD:F0 03 BEQ $FB02 0x03FB0F|$0F:$FAFF:20 0D FB JSR $FB0D ; control flow target (from $FAFD) 0x03FB12|$0F:$FB02:20 0D FB JSR $FB0D 0x03FB15|$0F:$FB05:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03FB18|$0F:$FB08:4C F1 FA JMP $FAF1 ; control flow target (from $FAE3, $FAF7, $FAF9) 0x03FB1B|$0F:$FB0B:38 SEC 0x03FB1C|$0F:$FB0C:60 RTS ; control flow target (from $FAFF, $FB02) 0x03FB1D|$0F:$FB0D:AD CF 60 LDA $60CF 0x03FB20|$0F:$FB10:48 PHA 0x03FB21|$0F:$FB11:EE CF 60 INC $60CF 0x03FB24|$0F:$FB14:20 A2 FD JSR $FDA2 ; 16-bit multiplication: set 16-bit ($10-$11) = A * #$16; returns low byte in A and clears C 0x03FB27|$0F:$FB17:8D 85 60 STA $6085 0x03FB2A|$0F:$FB1A:68 PLA 0x03FB2B|$0F:$FB1B:18 CLC 0x03FB2C|$0F:$FB1C:69 13 ADC #$13 0x03FB2E|$0F:$FB1E:8D 84 60 STA $6084 0x03FB31|$0F:$FB21:4C 0F FD JMP $FD0F ; control flow target (from $FA5A) 0x03FB34|$0F:$FB24:20 B8 FB JSR $FBB8 ; read a main script word into word buffer $60D9 0x03FB37|$0F:$FB27:2C CA 60 BIT $60CA ; unused text engine variable 0x03FB3A|$0F:$FB2A:30 36 BMI $FB62 0x03FB3C|$0F:$FB2C:A5 7C LDA $7C 0x03FB3E|$0F:$FB2E:8D 9E 60 STA $609E ; menu current column 0x03FB41|$0F:$FB31:A9 00 LDA #$00 0x03FB43|$0F:$FB33:8D 89 60 STA $6089 ; string word buffer index 2 ; control flow target (from $FB4E) 0x03FB46|$0F:$FB36:AE 89 60 LDX $6089 ; string word buffer index 2 0x03FB49|$0F:$FB39:BD D9 60 LDA $60D9,X ; start of string word buffer 0x03FB4C|$0F:$FB3C:EE 89 60 INC $6089 ; string word buffer index 2 0x03FB4F|$0F:$FB3F:C9 5F CMP #$5F ; [space] 0x03FB51|$0F:$FB41:F0 0D BEQ $FB50 0x03FB53|$0F:$FB43:C9 FA CMP #$FA ; [end-FA] 0x03FB55|$0F:$FB45:B0 09 BCS $FB50 0x03FB57|$0F:$FB47:EE 9E 60 INC $609E ; menu current column 0x03FB5A|$0F:$FB4A:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FB5D|$0F:$FB4D:45 ; $02:$800A; -> $02:$B677: CLC if end of word, SEC otherwise ; data -> code 0x03FB5E|$0F:$FB4E:B0 E6 BCS $FB36 ; control flow target (from $FB41, $FB45) 0x03FB60|$0F:$FB50:CE 9E 60 DEC $609E ; menu current column 0x03FB63|$0F:$FB53:AD 9E 60 LDA $609E ; menu current column 0x03FB66|$0F:$FB56:10 06 BPL $FB5E 0x03FB68|$0F:$FB58:AD C8 60 LDA $60C8 ; speech sound effect / auto-indent flag 0x03FB6B|$0F:$FB5B:8D 9E 60 STA $609E ; menu current column ; control flow target (from $FB56) 0x03FB6E|$0F:$FB5E:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FB71|$0F:$FB61:47 ; $02:$800E; -> $02:$B687: if menu current column < #$16, CLC and RTS, otherwise do stuff ; data -> code ; control flow target (from $FB2A) 0x03FB72|$0F:$FB62:60 RTS ; control flow target (from $FA5D) 0x03FB73|$0F:$FB63:A2 00 LDX #$00 0x03FB75|$0F:$FB65:8E CB 60 STX $60CB ; string word buffer index 1 ; control flow target (from $FB7E) 0x03FB78|$0F:$FB68:AE CB 60 LDX $60CB ; string word buffer index 1 0x03FB7B|$0F:$FB6B:BD D9 60 LDA $60D9,X ; start of string word buffer 0x03FB7E|$0F:$FB6E:EE CB 60 INC $60CB ; string word buffer index 1 0x03FB81|$0F:$FB71:C9 FA CMP #$FA 0x03FB83|$0F:$FB73:B0 0C BCS $FB81 0x03FB85|$0F:$FB75:48 PHA 0x03FB86|$0F:$FB76:20 37 FD JSR $FD37 0x03FB89|$0F:$FB79:68 PLA 0x03FB8A|$0F:$FB7A:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FB8D|$0F:$FB7D:45 ; $02:$800A; -> $02:$B677: CLC if end of word, SEC otherwise ; data -> code 0x03FB8E|$0F:$FB7E:B0 E8 BCS $FB68 0x03FB90|$0F:$FB80:60 RTS ; control flow target (from $FB73) 0x03FB91|$0F:$FB81:C9 FB CMP #$FB ; [wait]; implies [line] 0x03FB93|$0F:$FB83:F0 12 BEQ $FB97 0x03FB95|$0F:$FB85:C9 FC CMP #$FC ; [end-FC] 0x03FB97|$0F:$FB87:F0 24 BEQ $FBAD 0x03FB99|$0F:$FB89:C9 FD CMP #$FD 0x03FB9B|$0F:$FB8B:F0 1B BEQ $FBA8 0x03FB9D|$0F:$FB8D:C9 FE CMP #$FE ; [line] 0x03FB9F|$0F:$FB8F:F0 12 BEQ $FBA3 ; set text engine end token flag $60CC and RTS ; FA/FF handler + end of FC handler ; control flow target (from $FBB5) 0x03FBA1|$0F:$FB91:A9 FF LDA #$FF 0x03FBA3|$0F:$FB93:8D CC 60 STA $60CC ; text engine end token flag 0x03FBA6|$0F:$FB96:60 RTS ; FB handler: [wait] ; control flow target (from $FB83) 0x03FBA7|$0F:$FB97:A5 8E LDA $8E ; flag for in battle or not (#$FF)? 0x03FBA9|$0F:$FB99:30 0C BMI $FBA7 0x03FBAB|$0F:$FB9B:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FBAE|$0F:$FB9E:46 ; $02:$800C ; data -> code 0x03FBAF|$0F:$FB9F:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FBB2|$0F:$FBA2:48 ; $02:$8010 ; data -> code ; FE handler: [line] ; control flow target (from $FB8F) 0x03FBB3|$0F:$FBA3:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FBB6|$0F:$FBA6:46 ; $02:$800C ; data -> code ; control flow target (from $FB99) 0x03FBB7|$0F:$FBA7:60 RTS ; FD handler ; control flow target (from $FB8B) 0x03FBB8|$0F:$FBA8:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FBBB|$0F:$FBAB:40 ; $02:$8000; -> $02:$B68F: handler for control code #$FD ; data -> code 0x03FBBC|$0F:$FBAC:60 RTS ; FC handler: [end-FC] ; control flow target (from $FB87) 0x03FBBD|$0F:$FBAD:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FBC0|$0F:$FBB0:46 ; $02:$800C ; data -> code 0x03FBC1|$0F:$FBB1:A9 00 LDA #$00 0x03FBC3|$0F:$FBB3:85 7C STA $7C 0x03FBC5|$0F:$FBB5:4C 91 FB JMP $FB91 ; set text engine end token flag $60CC and RTS ; read a main script word into word buffer $60D9 ; control flow target (from $FB24) 0x03FBC8|$0F:$FBB8:A9 00 LDA #$00 0x03FBCA|$0F:$FBBA:8D CB 60 STA $60CB ; string word buffer index 1 ; control flow target (from $FBDA) 0x03FBCD|$0F:$FBBD:20 DD FB JSR $FBDD ; return next byte of string in A 0x03FBD0|$0F:$FBC0:C9 FE CMP #$FE ; useless op 0x03FBD2|$0F:$FBC2:D0 00 BNE $FBC4 ; useless op ; control flow target (from $FBC2) 0x03FBD4|$0F:$FBC4:C9 65 CMP #$65 ; "‘" 0x03FBD6|$0F:$FBC6:D0 05 BNE $FBCD ; "‘" enables speech sound effect 0x03FBD8|$0F:$FBC8:A2 01 LDX #$01 0x03FBDA|$0F:$FBCA:8E C8 60 STX $60C8 ; speech sound effect / auto-indent flag ; control flow target (from $FBC6) 0x03FBDD|$0F:$FBCD:AE CB 60 LDX $60CB ; string word buffer index 1 0x03FBE0|$0F:$FBD0:9D D9 60 STA $60D9,X ; start of string word buffer 0x03FBE3|$0F:$FBD3:EE CB 60 INC $60CB ; string word buffer index 1 0x03FBE6|$0F:$FBD6:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FBE9|$0F:$FBD9:45 ; $02:$800A; -> $02:$B677: CLC if end of word, SEC otherwise ; data -> code 0x03FBEA|$0F:$FBDA:B0 E1 BCS $FBBD ; if not end of word, keep reading more string bytes 0x03FBEC|$0F:$FBDC:60 RTS ; return next byte of string in A ; control flow target (from $FBBD) 0x03FBED|$0F:$FBDD:AE C9 60 LDX $60C9 ; count (only used as flag) of interpolated variable bytes read from $60F1 0x03FBF0|$0F:$FBE0:F0 12 BEQ $FBF4 ; if we're not in "read from $60F1" mode, read next string byte from ROM ; control flow target (from $FBFC) 0x03FBF2|$0F:$FBE2:BD F1 60 LDA $60F1,X ; start of text variable buffer 0x03FBF5|$0F:$FBE5:EE C9 60 INC $60C9 ; count (only used as flag) of interpolated variable bytes read from $60F1 0x03FBF8|$0F:$FBE8:C9 FA CMP #$FA ; [end-FA] 0x03FBFA|$0F:$FBEA:D0 07 BNE $FBF3 ; if not [end-FA], use it 0x03FBFC|$0F:$FBEC:A2 00 LDX #$00 ; otherwise reset read index and "read from $60F1" flag 0x03FBFE|$0F:$FBEE:8E C9 60 STX $60C9 ; count (only used as flag) of interpolated variable bytes read from $60F1 0x03FC01|$0F:$FBF1:F0 01 BEQ $FBF4 ; and read next string token from ROM ; control flow target (from $FBEA, $FBF8) 0x03FC03|$0F:$FBF3:60 RTS ; control flow target (from $FBE0, $FBF1) 0x03FC04|$0F:$FBF4:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FC07|$0F:$FBF7:4A ; $02:$8014; -> $02:$BE00: read the next text token and interpolate any variable control codes; SEC to trigger read of [end-FA]-terminated string from $60F1, CLC to use A ; data -> code 0x03FC08|$0F:$FBF8:90 F9 BCC $FBF3 ; CLC means to use value in A, so RTS 0x03FC0A|$0F:$FBFA:A2 00 LDX #$00 ; else, SEC means to read from $60F1, so initialize read index to #$00 0x03FC0C|$0F:$FBFC:4C E2 FB JMP $FBE2 ; and start reading ; external control flow target (from $04:$9ADB, $04:$9B46) 0x03FC0F|$0F:$FBFF:29 0F AND #$0F 0x03FC11|$0F:$FC01:C9 0F CMP #$0F 0x03FC13|$0F:$FC03:F0 0E BEQ $FC13 0x03FC15|$0F:$FC05:C9 0E CMP #$0E 0x03FC17|$0F:$FC07:F0 14 BEQ $FC1D 0x03FC19|$0F:$FC09:C9 0C CMP #$0C 0x03FC1B|$0F:$FC0B:D0 06 BNE $FC13 0x03FC1D|$0F:$FC0D:AD D1 60 LDA $60D1 0x03FC20|$0F:$FC10:4C 25 FC JMP $FC25 ; control flow target (from $FC03, $FC0B) 0x03FC23|$0F:$FC13:A9 00 LDA #$00 0x03FC25|$0F:$FC15:8D D0 60 STA $60D0 0x03FC28|$0F:$FC18:8D D1 60 STA $60D1 0x03FC2B|$0F:$FC1B:F0 08 BEQ $FC25 ; control flow target (from $FC07) 0x03FC2D|$0F:$FC1D:A9 00 LDA #$00 0x03FC2F|$0F:$FC1F:8D D1 60 STA $60D1 0x03FC32|$0F:$FC22:AD D0 60 LDA $60D0 ; control flow target (from $FC10, $FC1B) 0x03FC35|$0F:$FC25:85 7D STA $7D 0x03FC37|$0F:$FC27:0A ASL 0x03FC38|$0F:$FC28:69 02 ADC #$02 0x03FC3A|$0F:$FC2A:85 00 STA $00 0x03FC3C|$0F:$FC2C:A9 00 LDA #$00 0x03FC3E|$0F:$FC2E:85 7C STA $7C ; control flow target (from $FC32) 0x03FC40|$0F:$FC30:A5 00 LDA $00 0x03FC42|$0F:$FC32:D0 FC BNE $FC30 0x03FC44|$0F:$FC34:A9 FF LDA #$FF 0x03FC46|$0F:$FC36:85 00 STA $00 0x03FC48|$0F:$FC38:A2 08 LDX #$08 0x03FC4A|$0F:$FC3A:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x03FC4D|$0F:$FC3D:A5 7D LDA $7D 0x03FC4F|$0F:$FC3F:20 A2 FD JSR $FDA2 ; 16-bit multiplication: set 16-bit ($10-$11) = A * #$16; returns low byte in A and clears C 0x03FC52|$0F:$FC42:65 7C ADC $7C 0x03FC54|$0F:$FC44:AA TAX 0x03FC55|$0F:$FC45:A9 5F LDA #$5F ; control flow target (from $FC4D) 0x03FC57|$0F:$FC47:9D F8 06 STA $06F8,X ; start of main dialogue window 0x03FC5A|$0F:$FC4A:E8 INX 0x03FC5B|$0F:$FC4B:E0 B0 CPX #$B0 0x03FC5D|$0F:$FC4D:D0 F8 BNE $FC47 0x03FC5F|$0F:$FC4F:60 RTS ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; control flow target (from $C853) ; external control flow target (from $02:$B2CF, $02:$B2E8, $02:$B330, $04:$9CD3, $06:$80D3, $06:$80FF, $06:$8108, $06:$8B4B, $06:$8BF5, $06:$8C15, $06:$8CCA, $06:$8D27, $06:$8E11, $06:$8E2C, $06:$8ED2, $06:$8EDE, $06:$8F0E, $06:$8F2F, $06:$8F44, $06:$8F55, $06:$8F60, $06:$8F6C, $06:$8F87, $06:$8FCF, $06:$8FE0, $06:$900F, $06:$9079, $06:$908B, $06:$91F7, $06:$9381, $06:$93E8, $06:$9404, $06:$9443, $06:$9574, $06:$95CF, $06:$9644, $06:$96FB, $06:$9739, $06:$9CA7, $06:$A21B, $06:$A248, $06:$BB54, $06:$BB70, $06:$BB79, $06:$BBD0, $07:$82E4) 0x03FC60|$0F:$FC50:48 PHA 0x03FC61|$0F:$FC51:29 03 AND #$03 0x03FC63|$0F:$FC53:85 10 STA $10 0x03FC65|$0F:$FC55:0A ASL 0x03FC66|$0F:$FC56:0A ASL 0x03FC67|$0F:$FC57:85 12 STA $12 ; A & #$03 * 4 0x03FC69|$0F:$FC59:65 10 ADC $10 0x03FC6B|$0F:$FC5B:85 11 STA $11 ; A & #$03 * 5 0x03FC6D|$0F:$FC5D:A0 00 LDY #$00 ; control flow target (from $FC76) 0x03FC6F|$0F:$FC5F:A6 11 LDX $11 0x03FC71|$0F:$FC61:BD 13 01 LDA $0113,X ; Midenhall name bytes 0-3 + terminator 0x03FC74|$0F:$FC64:99 19 61 STA $6119,Y ; start of buffer for [monster(s)], [name], maybe more 0x03FC77|$0F:$FC67:A6 12 LDX $12 0x03FC79|$0F:$FC69:BD 86 01 LDA $0186,X ; Midenhall name bytes 4-7 0x03FC7C|$0F:$FC6C:99 1D 61 STA $611D,Y 0x03FC7F|$0F:$FC6F:E6 11 INC $11 0x03FC81|$0F:$FC71:E6 12 INC $12 0x03FC83|$0F:$FC73:C8 INY 0x03FC84|$0F:$FC74:C0 04 CPY #$04 0x03FC86|$0F:$FC76:D0 E7 BNE $FC5F 0x03FC88|$0F:$FC78:A0 08 LDY #$08 0x03FC8A|$0F:$FC7A:20 D7 FC JSR $FCD7 ; update write index to trim trailing spaces 0x03FC8D|$0F:$FC7D:68 PLA 0x03FC8E|$0F:$FC7E:10 00 BPL $FC80 ; append [end-FA] to string and swap return bank $94 back in; useless op ; append [end-FA] to string and swap return bank $94 back in ; control flow target (from $FC7E, $FCC3, $FCC5, $FCD5) 0x03FC90|$0F:$FC80:A9 FA LDA #$FA ; [end-FA] 0x03FC92|$0F:$FC82:99 19 61 STA $6119,Y ; start of buffer for [monster(s)], [name], maybe more 0x03FC95|$0F:$FC85:20 C2 F6 JSR $F6C2 ; load bank specified by $94 0x03FC98|$0F:$FC88:60 RTS ; write monster name in A (+ monster number within its group in X, if > 0) to $6119 ; external control flow target (from $04:$9CD9) 0x03FC99|$0F:$FC89:8E 8B 60 STX $608B ; monster number within its group 0x03FC9C|$0F:$FC8C:48 PHA ; monster ID 0x03FC9D|$0F:$FC8D:A9 00 LDA #$00 ; start with the first segment 0x03FC9F|$0F:$FC8F:8D AB 60 STA $60AB ; which list segment we're dealing with 0x03FCA2|$0F:$FC92:A9 0B LDA #$0B ; max length of first segment 0x03FCA4|$0F:$FC94:8D A0 60 STA $60A0 ; maximum string length; max segment length 0x03FCA7|$0F:$FC97:68 PLA ; monster ID 0x03FCA8|$0F:$FC98:20 B7 F3 JSR $F3B7 ; given monster ID in A, copy monster name segment to $0100 in reverse 0x03FCAB|$0F:$FC9B:A0 00 LDY #$00 ; initialize write index to #$00 0x03FCAD|$0F:$FC9D:20 E8 FC JSR $FCE8 ; copy $60A0 bytes of data from $00FF to $6119 0x03FCB0|$0F:$FCA0:20 D7 FC JSR $FCD7 ; update write index to trim trailing spaces 0x03FCB3|$0F:$FCA3:A9 5F LDA #$5F ; [space] 0x03FCB5|$0F:$FCA5:99 19 61 STA $6119,Y ; start of buffer for [monster(s)], [name], maybe more; write [space] to $6119,Y 0x03FCB8|$0F:$FCA8:C8 INY ; increment write index 0x03FCB9|$0F:$FCA9:98 TYA 0x03FCBA|$0F:$FCAA:48 PHA ; save write index for later 0x03FCBB|$0F:$FCAB:EE AB 60 INC $60AB ; which list segment we're dealing with 0x03FCBE|$0F:$FCAE:A9 09 LDA #$09 ; max length of second segment 0x03FCC0|$0F:$FCB0:8D A0 60 STA $60A0 ; maximum string length; max segment length 0x03FCC3|$0F:$FCB3:A5 10 LDA $10 ; monster ID, set by previous call to $F3B7 0x03FCC5|$0F:$FCB5:20 B7 F3 JSR $F3B7 ; given monster ID in A, copy monster name segment to $0100 in reverse 0x03FCC8|$0F:$FCB8:68 PLA ; pull write index back into Y 0x03FCC9|$0F:$FCB9:A8 TAY 0x03FCCA|$0F:$FCBA:20 E8 FC JSR $FCE8 ; copy $60A0 bytes of data from $00FF to $6119 0x03FCCD|$0F:$FCBD:20 D7 FC JSR $FCD7 ; update write index to trim trailing spaces 0x03FCD0|$0F:$FCC0:AE 8B 60 LDX $608B ; monster number within its group 0x03FCD3|$0F:$FCC3:F0 BB BEQ $FC80 ; append [end-FA] to string and swap return bank $94 back in 0x03FCD5|$0F:$FCC5:30 B9 BMI $FC80 ; append [end-FA] to string and swap return bank $94 back in 0x03FCD7|$0F:$FCC7:A9 6A LDA #$6A ; "-" 0x03FCD9|$0F:$FCC9:99 19 61 STA $6119,Y ; start of buffer for [monster(s)], [name], maybe more 0x03FCDC|$0F:$FCCC:C8 INY 0x03FCDD|$0F:$FCCD:8A TXA ; monster number within its group 0x03FCDE|$0F:$FCCE:18 CLC 0x03FCDF|$0F:$FCCF:69 23 ADC #$23 ; #$23 == "z" and A > 0, so this is the uppercase letter corresponding to the monster number within its group; net effect is e.g. "-A", "-B", etc. 0x03FCE1|$0F:$FCD1:99 19 61 STA $6119,Y ; start of buffer for [monster(s)], [name], maybe more 0x03FCE4|$0F:$FCD4:C8 INY 0x03FCE5|$0F:$FCD5:D0 A9 BNE $FC80 ; append [end-FA] to string and swap return bank $94 back in ; update write index to trim trailing spaces ; control flow target (from $FC7A, $FCA0, $FCBD, $FCE5) 0x03FCE7|$0F:$FCD7:B9 18 61 LDA $6118,Y ; last byte written 0x03FCEA|$0F:$FCDA:C9 60 CMP #$60 ; [no voice] 0x03FCEC|$0F:$FCDC:F0 04 BEQ $FCE2 0x03FCEE|$0F:$FCDE:C9 5F CMP #$5F ; [space] 0x03FCF0|$0F:$FCE0:D0 05 BNE $FCE7 ; control flow target (from $FCDC) 0x03FCF2|$0F:$FCE2:88 DEY ; if it's some kind of whitespace, decrement the write index 0x03FCF3|$0F:$FCE3:30 02 BMI $FCE7 ; if Y became negative (oops - string is now 0 bytes), stop 0x03FCF5|$0F:$FCE5:D0 F0 BNE $FCD7 ; update write index to trim trailing spaces ; control flow target (from $FCE0, $FCE3) 0x03FCF7|$0F:$FCE7:60 RTS ; copy $60A0 bytes of data from $00FF to $6119 ; X is used as a read index, Y as a write index ; data gets copied in reverse order ; IN: ; A/X/C = irrelevant ; Y = current write index ; OUT: ; A = last byte copied (but calling code doesn't care) ; X = 0 ; Y = current write index; this is important since the calling code needs to remember the write index from the first segment when dealing with the second segment ; C = unchanged ; control flow target (from $FC9D, $FCBA) 0x03FCF8|$0F:$FCE8:AE A0 60 LDX $60A0 ; maximum string length; initialize the read index to the value of $60A0 ; control flow target (from $FCF3) 0x03FCFB|$0F:$FCEB:BD FF 00 LDA $00FF,X ; built-in offset from string copy buffer start at $0100 0x03FCFE|$0F:$FCEE:99 19 61 STA $6119,Y ; start of buffer for [monster(s)], [name], maybe more; write data to $6119,Y 0x03FD01|$0F:$FCF1:C8 INY ; increment write index 0x03FD02|$0F:$FCF2:CA DEX ; decrement read index 0x03FD03|$0F:$FCF3:D0 F6 BNE $FCEB ; if the read index is not 0, loop back to $FCEB 0x03FD05|$0F:$FCF5:60 RTS ; otherwise the read index is 0, so we're done ; text engine: load bank specified by $60C6 (bank containing the desired text string) ; control flow target (from $FDD3, $FE16, $FE34) 0x03FD06|$0F:$FCF6:48 PHA 0x03FD07|$0F:$FCF7:AD C6 60 LDA $60C6 ; ROM bank containing the desired text string 0x03FD0A|$0F:$FCFA:20 D5 C3 JSR $C3D5 ; save A to $05F6, X to $43, and load bank specified by A 0x03FD0D|$0F:$FCFD:68 PLA 0x03FD0E|$0F:$FCFE:60 RTS ; external control flow target (from $02:$B6DB) 0x03FD0F|$0F:$FCFF:20 0F FD JSR $FD0F 0x03FD12|$0F:$FD02:EE 84 60 INC $6084 0x03FD15|$0F:$FD05:20 0F FD JSR $FD0F 0x03FD18|$0F:$FD08:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x03FD1B|$0F:$FD0B:EE 84 60 INC $6084 0x03FD1E|$0F:$FD0E:60 RTS ; control flow target (from $FB21, $FCFF, $FD05) 0x03FD1F|$0F:$FD0F:AD 84 60 LDA $6084 0x03FD22|$0F:$FD12:8D 8C 60 STA $608C 0x03FD25|$0F:$FD15:A9 05 LDA #$05 0x03FD27|$0F:$FD17:8D 8B 60 STA $608B ; control flow target (from $FD34) 0x03FD2A|$0F:$FD1A:AE 85 60 LDX $6085 0x03FD2D|$0F:$FD1D:BD F8 06 LDA $06F8,X ; start of main dialogue window 0x03FD30|$0F:$FD20:85 09 STA $09 0x03FD32|$0F:$FD22:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FD35|$0F:$FD25:C1 ; $06:$8002 ; data -> code 0x03FD36|$0F:$FD26:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 0x03FD39|$0F:$FD29:EE 85 60 INC $6085 0x03FD3C|$0F:$FD2C:EE 8B 60 INC $608B 0x03FD3F|$0F:$FD2F:AD 8B 60 LDA $608B 0x03FD42|$0F:$FD32:C9 1B CMP #$1B 0x03FD44|$0F:$FD34:D0 E4 BNE $FD1A 0x03FD46|$0F:$FD36:60 RTS ; control flow target (from $FB76) 0x03FD47|$0F:$FD37:48 PHA 0x03FD48|$0F:$FD38:A5 7C LDA $7C 0x03FD4A|$0F:$FD3A:8D 9E 60 STA $609E ; menu current column 0x03FD4D|$0F:$FD3D:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FD50|$0F:$FD40:47 ; $02:$800E; -> $02:$B687: if menu current column < #$16, CLC and RTS, otherwise do stuff ; data -> code 0x03FD51|$0F:$FD41:A5 7D LDA $7D 0x03FD53|$0F:$FD43:20 A2 FD JSR $FDA2 ; 16-bit multiplication: set 16-bit ($10-$11) = A * #$16; returns low byte in A and clears C 0x03FD56|$0F:$FD46:65 7C ADC $7C 0x03FD58|$0F:$FD48:AA TAX 0x03FD59|$0F:$FD49:68 PLA 0x03FD5A|$0F:$FD4A:C9 5F CMP #$5F 0x03FD5C|$0F:$FD4C:F0 11 BEQ $FD5F 0x03FD5E|$0F:$FD4E:C9 65 CMP #$65 0x03FD60|$0F:$FD50:D0 14 BNE $FD66 0x03FD62|$0F:$FD52:A4 7C LDY $7C 0x03FD64|$0F:$FD54:C0 01 CPY #$01 0x03FD66|$0F:$FD56:D0 0E BNE $FD66 0x03FD68|$0F:$FD58:88 DEY 0x03FD69|$0F:$FD59:84 7C STY $7C 0x03FD6B|$0F:$FD5B:CA DEX 0x03FD6C|$0F:$FD5C:4C 66 FD JMP $FD66 ; control flow target (from $FD4C) 0x03FD6F|$0F:$FD5F:A4 7C LDY $7C 0x03FD71|$0F:$FD61:CC C8 60 CPY $60C8 ; speech sound effect / auto-indent flag 0x03FD74|$0F:$FD64:F0 3B BEQ $FDA1 ; control flow target (from $FD50, $FD56, $FD5C) 0x03FD76|$0F:$FD66:48 PHA 0x03FD77|$0F:$FD67:BD F8 06 LDA $06F8,X ; start of main dialogue window 0x03FD7A|$0F:$FD6A:85 09 STA $09 0x03FD7C|$0F:$FD6C:A8 TAY 0x03FD7D|$0F:$FD6D:68 PLA 0x03FD7E|$0F:$FD6E:C0 5F CPY #$5F 0x03FD80|$0F:$FD70:D0 05 BNE $FD77 0x03FD82|$0F:$FD72:9D F8 06 STA $06F8,X ; start of main dialogue window 0x03FD85|$0F:$FD75:85 09 STA $09 ; control flow target (from $FD70) 0x03FD87|$0F:$FD77:A5 8E LDA $8E ; flag for in battle or not (#$FF)? 0x03FD89|$0F:$FD79:30 24 BMI $FD9F 0x03FD8B|$0F:$FD7B:AD C8 60 LDA $60C8 ; speech sound effect / auto-indent flag 0x03FD8E|$0F:$FD7E:F0 05 BEQ $FD85 0x03FD90|$0F:$FD80:A9 8F LDA #$8F ; Music ID #$8F: speech SFX 0x03FD92|$0F:$FD82:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) ; control flow target (from $FD7E) 0x03FD95|$0F:$FD85:A5 7C LDA $7C 0x03FD97|$0F:$FD87:18 CLC 0x03FD98|$0F:$FD88:69 05 ADC #$05 0x03FD9A|$0F:$FD8A:8D 8B 60 STA $608B 0x03FD9D|$0F:$FD8D:A5 7D LDA $7D 0x03FD9F|$0F:$FD8F:18 CLC 0x03FDA0|$0F:$FD90:69 13 ADC #$13 0x03FDA2|$0F:$FD92:8D 8C 60 STA $608C 0x03FDA5|$0F:$FD95:20 97 FE JSR $FE97 ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; code -> data ; indirect data load target 0x03FDA8|$0F:$FD98:C1 ; $06:$8002 ; data -> code 0x03FDA9|$0F:$FD99:20 FA C1 JSR $C1FA ; wait for $02 to not be #$C0, write PPU address in $07-$08 and data in $09 to PPU write buffer at $0300,$02, $01 += 1, $02 += 3, and set $0183 to #$00 0x03FDAC|$0F:$FD9C:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $FD79) 0x03FDAF|$0F:$FD9F:E6 7C INC $7C ; control flow target (from $FD64) 0x03FDB1|$0F:$FDA1:60 RTS ; 16-bit multiplication: set 16-bit ($10-$11) = A * #$16; returns low byte in A and clears C ; control flow target (from $FB14, $FC3F, $FD43) 0x03FDB2|$0F:$FDA2:85 10 STA $10 0x03FDB4|$0F:$FDA4:A9 00 LDA #$00 0x03FDB6|$0F:$FDA6:85 11 STA $11 0x03FDB8|$0F:$FDA8:A2 10 LDX #$10 0x03FDBA|$0F:$FDAA:A9 16 LDA #$16 0x03FDBC|$0F:$FDAC:20 F4 F0 JSR $F0F4 ; 16-bit multiplication: set 16-bit ($00,X-$01,X) = ($00,X-$01,X) * A 0x03FDBF|$0F:$FDAF:A5 10 LDA $10 0x03FDC1|$0F:$FDB1:18 CLC 0x03FDC2|$0F:$FDB2:60 RTS ; scan through group of strings until we find the start of the desired string ; control flow target (from $FAA4) 0x03FDC3|$0F:$FDB3:A9 00 LDA #$00 0x03FDC5|$0F:$FDB5:8D D6 60 STA $60D6 ; bit index into the byte containing the 5-bit text token currently being processed 0x03FDC8|$0F:$FDB8:8D D2 60 STA $60D2 ; read index within current dictionary entry 0x03FDCB|$0F:$FDBB:A5 10 LDA $10 ; low byte of string index 0x03FDCD|$0F:$FDBD:29 0F AND #$0F ; chop it down to index within the current pointer 0x03FDCF|$0F:$FDBF:AA TAX 0x03FDD0|$0F:$FDC0:F0 06 BEQ $FDC8 ; if we want the first string in the pointer, nothing more to do here, so RTS ; otherwise scan through the pointer data to find the start of the desired string ; control flow target (from $FDC6) 0x03FDD2|$0F:$FDC2:20 C9 FD JSR $FDC9 ; scan through current string pointer to find the start of the next string 0x03FDD5|$0F:$FDC5:CA DEX 0x03FDD6|$0F:$FDC6:D0 FA BNE $FDC2 ; control flow target (from $FDC0) 0x03FDD8|$0F:$FDC8:60 RTS ; scan through current string pointer to find the start of the next string ; control flow target (from $FDC2) 0x03FDD9|$0F:$FDC9:8A TXA 0x03FDDA|$0F:$FDCA:48 PHA 0x03FDDB|$0F:$FDCB:20 D3 FD JSR $FDD3 ; scan through string until we reach an end token; updates read address in $55-$56 0x03FDDE|$0F:$FDCE:68 PLA 0x03FDDF|$0F:$FDCF:AA TAX 0x03FDE0|$0F:$FDD0:A5 6D LDA $6D 0x03FDE2|$0F:$FDD2:60 RTS ; scan through string until we reach an end token; updates read address in $55-$56 ; control flow target (from $FDCB, $FDF0) 0x03FDE3|$0F:$FDD3:20 F6 FC JSR $FCF6 ; text engine: load bank specified by $60C6 (bank containing the desired text string) 0x03FDE6|$0F:$FDD6:A9 00 LDA #$00 0x03FDE8|$0F:$FDD8:8D D3 60 STA $60D3 ; secondary text table offset for C0 - C3 tables ; control flow target (from $FDE8) 0x03FDEB|$0F:$FDDB:20 3D FE JSR $FE3D ; set A to the current text dictionary index 0x03FDEE|$0F:$FDDE:20 F7 FD JSR $FDF7 ; after reading a text token, update the read address in $55-$56 and bit index in $60D6 0x03FDF1|$0F:$FDE1:C9 1C CMP #$1C ; #$1C - #$1F are the C0 - C3 table switch tokens 0x03FDF3|$0F:$FDE3:90 06 BCC $FDEB ; if token >= #$1C, we know it's a switch token and the next token is not an end token, so skip over the next token 0x03FDF5|$0F:$FDE5:20 F7 FD JSR $FDF7 ; after reading a text token, update the read address in $55-$56 and bit index in $60D6 0x03FDF8|$0F:$FDE8:4C DB FD JMP $FDDB ; loop to read the next token ; control flow target (from $FDE3) 0x03FDFB|$0F:$FDEB:AD 8B 60 LDA $608B ; text engine: $608B = dictionary index 0x03FDFE|$0F:$FDEE:C9 05 CMP #$05 ; the text tokens 0 - 4 are end tokens 0x03FE00|$0F:$FDF0:B0 E1 BCS $FDD3 ; scan through string until we reach an end token; updates read address in $55-$56; if not an end token, keep scanning 0x03FE02|$0F:$FDF2:A9 FC LDA #$FC ; if end token, set A and $6D to #$FC and RTS 0x03FE04|$0F:$FDF4:85 6D STA $6D ; stash #$FC in $6A since caller needs to pop stuff off the stack 0x03FE06|$0F:$FDF6:60 RTS ; after reading a text token, update the read address in $55-$56 and bit index in $60D6 ; control flow target (from $FDDE, $FDE5) ; external control flow target (from $02:$B3C6, $02:$B3E3) 0x03FE07|$0F:$FDF7:48 PHA 0x03FE08|$0F:$FDF8:AD D6 60 LDA $60D6 ; bit index into the byte containing the 5-bit text token currently being processed 0x03FE0B|$0F:$FDFB:C9 03 CMP #$03 ; if all 5 bits we need are already in A, keep using it, otherwise update read position in $55-$56 0x03FE0D|$0F:$FDFD:90 26 BCC $FE25 ; $FE29 would be a better target :p 0x03FE0F|$0F:$FDFF:E6 55 INC $55 ; pointer to start of sub pointer data, low byte 0x03FE11|$0F:$FE01:D0 02 BNE $FE05 0x03FE13|$0F:$FE03:E6 56 INC $56 ; pointer to start of sub pointer data, high byte ; control flow target (from $FE01) 0x03FE15|$0F:$FE05:A5 55 LDA $55 ; pointer to start of sub pointer data, low byte; check for $55-$56 == $BFD7; if yes, switch to bank #$02, if no, keep using current address 0x03FE17|$0F:$FE07:C9 D7 CMP #$D7 0x03FE19|$0F:$FE09:D0 1A BNE $FE25 0x03FE1B|$0F:$FE0B:A5 56 LDA $56 ; pointer to start of sub pointer data, high byte 0x03FE1D|$0F:$FE0D:C9 BF CMP #$BF 0x03FE1F|$0F:$FE0F:D0 14 BNE $FE25 0x03FE21|$0F:$FE11:A9 02 LDA #$02 0x03FE23|$0F:$FE13:8D C6 60 STA $60C6 ; ROM bank containing the desired text string 0x03FE26|$0F:$FE16:20 F6 FC JSR $FCF6 ; text engine: load bank specified by $60C6 (bank containing the desired text string) 0x03FE29|$0F:$FE19:A9 2E LDA #$2E ; useless 0x03FE2B|$0F:$FE1B:AD 32 FE LDA $FE32 ; set $55-$56 to new address in bank #$02 0x03FE2E|$0F:$FE1E:85 55 STA $55 ; pointer to start of sub pointer data, low byte 0x03FE30|$0F:$FE20:AD 33 FE LDA $FE33 0x03FE33|$0F:$FE23:85 56 STA $56 ; pointer to start of sub pointer data, high byte ; control flow target (from $FDFD, $FE09, $FE0F) 0x03FE35|$0F:$FE25:AD D6 60 LDA $60D6 ; bit index into the byte containing the 5-bit text token currently being processed 0x03FE38|$0F:$FE28:18 CLC 0x03FE39|$0F:$FE29:69 05 ADC #$05 ; we read 5 bits, so update the bit index 0x03FE3B|$0F:$FE2B:29 07 AND #$07 0x03FE3D|$0F:$FE2D:8D D6 60 STA $60D6 ; bit index into the byte containing the 5-bit text token currently being processed 0x03FE40|$0F:$FE30:68 PLA 0x03FE41|$0F:$FE31:60 RTS ; code -> data ; data load target (from $FE1B) 0x03FE42|$0F:$FE32:B2 ; data load target (from $FE20) 0x03FE43|$0F:$FE33: B7 ; $02:$B7B2 ; data -> code ; swap in the right text bank, set A to the current dictionary index, swap in bank #$02 ; external control flow target (from $02:$B3AB) 0x03FE44|$0F:$FE34:20 F6 FC JSR $FCF6 ; text engine: load bank specified by $60C6 (bank containing the desired text string) 0x03FE47|$0F:$FE37:20 3D FE JSR $FE3D ; set A to the current text dictionary index 0x03FE4A|$0F:$FE3A:4C 70 F7 JMP $F770 ; load ROM bank #$02 ; set A to the current text dictionary index ; control flow target (from $FDDB, $FE37) 0x03FE4D|$0F:$FE3D:AD D6 60 LDA $60D6 ; bit index into the byte containing the 5-bit text token currently being processed 0x03FE50|$0F:$FE40:0A ASL 0x03FE51|$0F:$FE41:A8 TAY 0x03FE52|$0F:$FE42:B9 5C FE LDA $FE5C,Y ; jump table for functions to convert the current 5-bit text token into a dictionary index in A 0x03FE55|$0F:$FE45:85 57 STA $57 ; pointer to start of main pointer table, low byte 0x03FE57|$0F:$FE47:B9 5D FE LDA $FE5D,Y 0x03FE5A|$0F:$FE4A:85 58 STA $58 ; pointer to start of main pointer table, high byte ; BUG: this reads the first 2 bytes of ($55) *before* the code for checking whether the read position needs to jump to bank 2 runs 0x03FE5C|$0F:$FE4C:A0 01 LDY #$01 0x03FE5E|$0F:$FE4E:B1 55 LDA ($55),Y ; pointer to start of sub pointer data, low byte 0x03FE60|$0F:$FE50:8D 8C 60 STA $608C ; text engine: $608C = string byte #2 0x03FE63|$0F:$FE53:88 DEY 0x03FE64|$0F:$FE54:B1 55 LDA ($55),Y ; pointer to start of sub pointer data, low byte 0x03FE66|$0F:$FE56:8D 8B 60 STA $608B ; text engine: $608B = string byte #1 0x03FE69|$0F:$FE59:6C 57 00 JMP ($0057) ; pointer to start of main pointer table, low byte; convert the current 5-bit text token into a dictionary index in A ; code -> data ; jump table for functions to convert the current 5-bit text token into a dictionary index in A ; indexed data load target (from $FE42) 0x03FE6C|$0F:$FE5C:6C ; indexed data load target (from $FE47) 0x03FE6D|$0F:$FE5D: FE ; $0F:$FE6C; token is in bits 7-3 of A 0x03FE6E|$0F:$FE5E:6D FE ; $0F:$FE6D; token is in bits 6-2 of A 0x03FE70|$0F:$FE60:6E FE ; $0F:$FE6E; token is in bits 5-1 of A 0x03FE72|$0F:$FE62:8D FE ; $0F:$FE8D; token is in bits 4-0 of A (yay) 0x03FE74|$0F:$FE64:84 FE ; $0F:$FE84; token is in bits 3-0 of A + bit 7 of $608C 0x03FE76|$0F:$FE66:7E FE ; $0F:$FE7E; token is in bits 2-0 of A + bits 7-6 of $608C 0x03FE78|$0F:$FE68:78 FE ; $0F:$FE78; token is in bits 1-0 of A + bits 7-5 of $608C 0x03FE7A|$0F:$FE6A:72 FE ; $0F:$FE72; token is in bit 0 of A + bits 7-4 of $608C ; data -> code ; token is in bits 7-3 of A ; indirect control flow target (via $FE5C) 0x03FE7C|$0F:$FE6C:4A LSR ; token is in bits 6-2 of A ; indirect control flow target (via $FE5E) 0x03FE7D|$0F:$FE6D:4A LSR ; token is in bits 5-1 of A ; indirect control flow target (via $FE60) 0x03FE7E|$0F:$FE6E:4A LSR 0x03FE7F|$0F:$FE6F:4C 8D FE JMP $FE8D ; token is in bits 4-0 of A (yay) ; token is in bit 0 of A + bits 7-4 of $608C ; indirect control flow target (via $FE6A) 0x03FE82|$0F:$FE72:0E 8C 60 ASL $608C ; string byte #2 0x03FE85|$0F:$FE75:2E 8B 60 ROL $608B ; text engine: $608B = string byte #1 ; token is in bits 1-0 of A + bits 7-5 of $608C ; indirect control flow target (via $FE68) 0x03FE88|$0F:$FE78:0E 8C 60 ASL $608C ; string byte #2 0x03FE8B|$0F:$FE7B:2E 8B 60 ROL $608B ; text engine: $608B = string byte #1 ; token is in bits 2-0 of A + bits 7-6 of $608C ; indirect control flow target (via $FE66) 0x03FE8E|$0F:$FE7E:0E 8C 60 ASL $608C ; string byte #2 0x03FE91|$0F:$FE81:2E 8B 60 ROL $608B ; text engine: $608B = string byte #1 ; token is in bits 3-0 of A + bit 7 of $608C ; indirect control flow target (via $FE64) 0x03FE94|$0F:$FE84:0E 8C 60 ASL $608C ; string byte #2 0x03FE97|$0F:$FE87:2E 8B 60 ROL $608B ; text engine: $608B = string byte #1 0x03FE9A|$0F:$FE8A:AD 8B 60 LDA $608B ; text engine: $608B = string byte #1 ; token is in bits 4-0 of A (yay) ; control flow target (from $FE6F) ; indirect control flow target (via $FE62) 0x03FE9D|$0F:$FE8D:29 1F AND #$1F 0x03FE9F|$0F:$FE8F:18 CLC 0x03FEA0|$0F:$FE90:6D D3 60 ADC $60D3 ; secondary text table offset for C0 - C3 tables 0x03FEA3|$0F:$FE93:8D 8B 60 STA $608B ; text engine: $608B = dictionary index 0x03FEA6|$0F:$FE96:60 RTS ; read byte following JSR, parse it for bank and pointer index, execute ($8000,X) in selected bank, swap back in original bank ; BUG: does LDA before PHP, so status of N and Z flags are lost ; control flow target (from $C696, $C6C4, $C6D7, $C6DB, $C6F6, $C886, $C894, $CC9B, $D15C, $D16E, $D2E7, $D2F7, $D33C, $D356, $EE06, $EE7B, $EF58, $F04F, $F0BC, $F4A9, $F4E3, $F5E1, $F5F7, $F611, $F787, $F83A, $FB4A, $FB5E, $FB7A, $FB9B, $FB9F, $FBA3, $FBA8, $FBAD, $FBD6, $FBF4, $FD22, $FD3D, $FD95) ; external control flow target (from $02:$B74B, $02:$BE00, $02:$BE2C, $02:$BE34, $02:$BEA1, $06:$B0A5, $07:$87F1, $08:$80C9, $0A:$80F2, $0A:$813B) 0x03FEA7|$0F:$FE97:8D 94 01 STA $0194 0x03FEAA|$0F:$FE9A:8E 95 01 STX $0195 0x03FEAD|$0F:$FE9D:8C 96 01 STY $0196 0x03FEB0|$0F:$FEA0:AD F6 05 LDA $05F6 ; current bank 0x03FEB3|$0F:$FEA3:48 PHA 0x03FEB4|$0F:$FEA4:08 PHP 0x03FEB5|$0F:$FEA5:20 0E FF JSR $FF0E ; from the perspective of the caller (which always pushes 2 extra bytes to the stack before calling us), increment JSR's return address, read byte following JSR, parse it for bank and pointer index, set $D6-$D7 to $8000,X-$8001,X in selected bank 0x03FEB8|$0F:$FEA8:28 PLP 0x03FEB9|$0F:$FEA9:AC 96 01 LDY $0196 0x03FEBC|$0F:$FEAC:AE 95 01 LDX $0195 0x03FEBF|$0F:$FEAF:AD 94 01 LDA $0194 0x03FEC2|$0F:$FEB2:20 C8 FE JSR $FEC8 ; execute ($D6) 0x03FEC5|$0F:$FEB5:08 PHP 0x03FEC6|$0F:$FEB6:8D 94 01 STA $0194 0x03FEC9|$0F:$FEB9:68 PLA 0x03FECA|$0F:$FEBA:85 D6 STA $D6 0x03FECC|$0F:$FEBC:68 PLA ; original value of $05F6 (current bank) 0x03FECD|$0F:$FEBD:20 BB FF JSR $FFBB ; save A to $05F6, X to $43, and load bank specified by A 0x03FED0|$0F:$FEC0:A5 D6 LDA $D6 ; P 0x03FED2|$0F:$FEC2:48 PHA 0x03FED3|$0F:$FEC3:AD 94 01 LDA $0194 0x03FED6|$0F:$FEC6:28 PLP 0x03FED7|$0F:$FEC7:60 RTS ; execute ($D6) ; control flow target (from $FEB2) 0x03FED8|$0F:$FEC8:6C D6 00 JMP ($00D6) ; code -> unknown ; must be unused since it's invalid 0x03FEDB|$0F:$FECB:20 DA FE ; JSR $FEDA 0x03FEDC|$0F:$FECC:DA ; INVALID OPCODE 0x03FEDD|$0F:$FECD:FE A5 D6 ; INC $D6A5,X 0x03FEDE|$0F:$FECE:A5 D6 ; LDA $D6 0x03FEDF|$0F:$FECF:D6 95 ; DEC $95,X 0x03FEE0|$0F:$FED0:95 00 ; STA $00,X 0x03FEE1|$0F:$FED1:00 ; BRK 0x03FEE2|$0F:$FED2:A5 D7 ; LDA $D7 0x03FEE3|$0F:$FED3:D7 ; INVALID OPCODE 0x03FEE4|$0F:$FED4:95 01 ; STA $01,X 0x03FEE5|$0F:$FED5:01 AD ; ORA ($AD,X) 0x03FEE6|$0F:$FED6:AD 94 01 ; LDA $0194 0x03FEE7|$0F:$FED7:94 01 ; STY $01,X 0x03FEE8|$0F:$FED8:01 60 ; ORA ($60,X) 0x03FEE9|$0F:$FED9:60 ; RTS ; unknown -> code ; parse byte following JSR for bank and pointer index, set $D6-$D7 to $8000,X-$8001,X in selected bank ; control flow target (from $E4EC) ; external control flow target (from $02:$B1C0) 0x03FEEA|$0F:$FEDA:8D 94 01 STA $0194 0x03FEED|$0F:$FEDD:8E 95 01 STX $0195 0x03FEF0|$0F:$FEE0:8C 96 01 STY $0196 0x03FEF3|$0F:$FEE3:AD F6 05 LDA $05F6 ; current bank 0x03FEF6|$0F:$FEE6:48 PHA 0x03FEF7|$0F:$FEE7:48 PHA 0x03FEF8|$0F:$FEE8:20 0E FF JSR $FF0E ; from the perspective of the caller (which always pushes 2 extra bytes to the stack before calling us), increment JSR's return address, read byte following JSR, parse it for bank and pointer index, set $D6-$D7 to $8000,X-$8001,X in selected bank 0x03FEFB|$0F:$FEEB:68 PLA 0x03FEFC|$0F:$FEEC:68 PLA 0x03FEFD|$0F:$FEED:20 BB FF JSR $FFBB ; save A to $05F6, X to $43, and load bank specified by A 0x03FF00|$0F:$FEF0:AC 96 01 LDY $0196 0x03FF03|$0F:$FEF3:AE 95 01 LDX $0195 0x03FF06|$0F:$FEF6:AD 94 01 LDA $0194 0x03FF09|$0F:$FEF9:60 RTS ; increment JSR's return address, read byte following JSR, parse it for bank and pointer index, set $D6-$D7 to $8000,X-$8001,X in selected bank ; control flow target (from $E4F8, $ECFB) 0x03FF0A|$0F:$FEFA:08 PHP 0x03FF0B|$0F:$FEFB:48 PHA 0x03FF0C|$0F:$FEFC:8E 95 01 STX $0195 0x03FF0F|$0F:$FEFF:8C 96 01 STY $0196 0x03FF12|$0F:$FF02:20 0E FF JSR $FF0E ; from the perspective of the caller (which always pushes 2 extra bytes to the stack before calling us), increment JSR's return address, read byte following JSR, parse it for bank and pointer index, set $D6-$D7 to $8000,X-$8001,X in selected bank 0x03FF15|$0F:$FF05:AC 96 01 LDY $0196 0x03FF18|$0F:$FF08:AE 95 01 LDX $0195 0x03FF1B|$0F:$FF0B:68 PLA 0x03FF1C|$0F:$FF0C:28 PLP 0x03FF1D|$0F:$FF0D:60 RTS ; from the perspective of the caller (which always pushes 2 extra bytes to the stack before calling us), increment JSR's return address, read byte following JSR, parse it for bank and pointer index, set $D6-$D7 to $8000,X-$8001,X in selected bank ; control flow target (from $FEA5, $FEE8, $FF02) 0x03FF1E|$0F:$FF0E:BA TSX 0x03FF1F|$0F:$FF0F:FE 05 01 INC $0105,X 0x03FF22|$0F:$FF12:D0 03 BNE $FF17 0x03FF24|$0F:$FF14:FE 06 01 INC $0106,X ; control flow target (from $FF12) 0x03FF27|$0F:$FF17:BD 05 01 LDA $0105,X 0x03FF2A|$0F:$FF1A:85 D6 STA $D6 0x03FF2C|$0F:$FF1C:BD 06 01 LDA $0106,X 0x03FF2F|$0F:$FF1F:85 D7 STA $D7 0x03FF31|$0F:$FF21:A0 00 LDY #$00 0x03FF33|$0F:$FF23:B1 D6 LDA ($D6),Y 0x03FF35|$0F:$FF25:20 33 FF JSR $FF33 ; parse A into bank and pointer indices and load specified bank 0x03FF38|$0F:$FF28:BD 00 80 LDA $8000,X 0x03FF3B|$0F:$FF2B:85 D6 STA $D6 0x03FF3D|$0F:$FF2D:BD 01 80 LDA $8001,X 0x03FF40|$0F:$FF30:85 D7 STA $D7 0x03FF42|$0F:$FF32:60 RTS ; parse A into bank and pointer indices and load specified bank ; bank is high 3 bits of A (but 8 if 0 and 6 if 5), pointer is low 5 bits of A (but low 6 if bank is 6) ; control flow target (from $F3EA, $FF25) 0x03FF43|$0F:$FF33:48 PHA 0x03FF44|$0F:$FF34:2A ROL 0x03FF45|$0F:$FF35:2A ROL 0x03FF46|$0F:$FF36:2A ROL 0x03FF47|$0F:$FF37:2A ROL 0x03FF48|$0F:$FF38:29 07 AND #$07 0x03FF4A|$0F:$FF3A:D0 04 BNE $FF40 0x03FF4C|$0F:$FF3C:A9 08 LDA #$08 0x03FF4E|$0F:$FF3E:D0 06 BNE $FF46 ; control flow target (from $FF3A) 0x03FF50|$0F:$FF40:C9 05 CMP #$05 0x03FF52|$0F:$FF42:D0 02 BNE $FF46 0x03FF54|$0F:$FF44:A9 06 LDA #$06 ; control flow target (from $FF3E, $FF42) 0x03FF56|$0F:$FF46:20 BB FF JSR $FFBB ; save A to $05F6, X to $43, and load bank specified by A 0x03FF59|$0F:$FF49:68 PLA 0x03FF5A|$0F:$FF4A:48 PHA 0x03FF5B|$0F:$FF4B:29 E0 AND #$E0 0x03FF5D|$0F:$FF4D:AA TAX 0x03FF5E|$0F:$FF4E:68 PLA 0x03FF5F|$0F:$FF4F:29 3F AND #$3F 0x03FF61|$0F:$FF51:E0 A0 CPX #$A0 0x03FF63|$0F:$FF53:F0 02 BEQ $FF57 0x03FF65|$0F:$FF55:29 1F AND #$1F ; control flow target (from $FF53) 0x03FF67|$0F:$FF57:0A ASL 0x03FF68|$0F:$FF58:AA TAX 0x03FF69|$0F:$FF59:60 RTS ; external control flow target (from $07:$81E7, $07:$84EC, $07:$8529, $07:$8556) 0x03FF6A|$0F:$FF5A:20 AF C7 JSR $C7AF 0x03FF6D|$0F:$FF5D:4C 90 FF JMP $FF90 ; load bank 7 ; external control flow target (from $07:$81CE) 0x03FF70|$0F:$FF60:20 4F D1 JSR $D14F 0x03FF73|$0F:$FF63:4C 90 FF JMP $FF90 ; load bank 7 ; external control flow target (from $07:$8692) 0x03FF76|$0F:$FF66:20 04 C5 JSR $C504 0x03FF79|$0F:$FF69:4C 90 FF JMP $FF90 ; load bank 7 ; external indirect control flow target (via $07:$8798) ; indirect control flow target 0x03FF7C|$0F:$FF6C:20 C2 E5 JSR $E5C2 0x03FF7F|$0F:$FF6F:4C 90 FF JMP $FF90 ; load bank 7 ; external indirect control flow target (via $07:$879C) ; indirect control flow target 0x03FF82|$0F:$FF72:20 36 E6 JSR $E636 0x03FF85|$0F:$FF75:4C 90 FF JMP $FF90 ; load bank 7 ; external indirect control flow target (via $07:$8796) ; indirect control flow target 0x03FF88|$0F:$FF78:20 97 E7 JSR $E797 0x03FF8B|$0F:$FF7B:4C 90 FF JMP $FF90 ; load bank 7 ; external indirect control flow target (via $07:$879A) ; indirect control flow target 0x03FF8E|$0F:$FF7E:20 B4 E6 JSR $E6B4 0x03FF91|$0F:$FF81:4C 90 FF JMP $FF90 ; load bank 7 ; external control flow target (from $07:$8231, $07:$8242, $07:$8278, $07:$8330, $07:$835F, $07:$8374, $07:$8385, $07:$83FB, $07:$849C, $07:$84D5, $07:$84F6, $07:$8503, $07:$851C, $07:$8533, $07:$8560, $07:$857F, $07:$85EE, $07:$8776) 0x03FF94|$0F:$FF84:20 D2 CC JSR $CCD2 ; execute scripted motion 0x03FF97|$0F:$FF87:4C 90 FF JMP $FF90 ; load bank 7 ; external control flow target (from $07:$8291, $07:$82B1, $07:$82DC, $07:$856B, $07:$85AC, $07:$85E4, $07:$8651, $07:$8675, $07:$86E2, $07:$8712) 0x03FF9A|$0F:$FF8A:20 CB D8 JSR $D8CB 0x03FF9D|$0F:$FF8D:4C 90 FF JMP $FF90 ; load bank 7 ; load bank 7 ; control flow target (from $FF5D, $FF63, $FF69, $FF6F, $FF75, $FF7B, $FF81, $FF87, $FF8D) 0x03FFA0|$0F:$FF90:A9 07 LDA #$07 0x03FFA2|$0F:$FF92:85 94 STA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x03FFA4|$0F:$FF94:4C C2 F6 JMP $F6C2 ; load bank specified by $94 ; code -> free 0x03FFA7|$0F:$FF97:FF ; ... skipping $21 FF bytes 0x03FFC9|$0F:$FFB9:FF ; free -> data ; data load target (from $D37A) 0x03FFCA|$0F:$FFBA:FF ; data -> code ; save A to $05F6, X to $43, and load bank specified by A ; control flow target (from $C3D5, $FEBD, $FEED, $FF46) 0x03FFCB|$0F:$FFBB:8D F6 05 STA $05F6 ; current bank 0x03FFCE|$0F:$FFBE:86 43 STX $43 ; load bank specified by A ; control flow target (from $C3D9) 0x03FFD0|$0F:$FFC0:78 SEI 0x03FFD1|$0F:$FFC1:8D FF FF STA $FFFF 0x03FFD4|$0F:$FFC4:4A LSR 0x03FFD5|$0F:$FFC5:8D FF FF STA $FFFF 0x03FFD8|$0F:$FFC8:4A LSR 0x03FFD9|$0F:$FFC9:8D FF FF STA $FFFF 0x03FFDC|$0F:$FFCC:4A LSR 0x03FFDD|$0F:$FFCD:8D FF FF STA $FFFF 0x03FFE0|$0F:$FFD0:4A LSR 0x03FFE1|$0F:$FFD1:8D FF FF STA $FFFF 0x03FFE4|$0F:$FFD4:EA NOP 0x03FFE5|$0F:$FFD5:EA NOP 0x03FFE6|$0F:$FFD6:60 RTS ; reset vector ; indirect control flow target (via $FFFC) 0x03FFE7|$0F:$FFD7:78 SEI 0x03FFE8|$0F:$FFD8:EE DE FF INC $FFDE ; #$80; used to reset MMC1 shift register and switch to last-fixed-bank mode 0x03FFEB|$0F:$FFDB:4C AF C5 JMP $C5AF ; reset vector handler ; code -> data ; #$80; used to reset MMC1 shift register and switch to last-fixed-bank mode ; data load target (from $C60B, $FFD8) 0x03FFEE|$0F:$FFDE:80 ; data -> unknown 0x03FFEF|$0F:$FFDF:44 ; INVALID OPCODE 0x03FFF0|$0F:$FFE0:52 ; INVALID OPCODE 0x03FFF1|$0F:$FFE1:41 47 ; EOR ($47,X) 0x03FFF2|$0F:$FFE2:47 ; INVALID OPCODE 0x03FFF3|$0F:$FFE3:4F ; INVALID OPCODE 0x03FFF4|$0F:$FFE4:4E 20 57 ; LSR $5720 0x03FFF5|$0F:$FFE5:20 57 41 ; JSR $4157 0x03FFF6|$0F:$FFE6:57 ; INVALID OPCODE 0x03FFF7|$0F:$FFE7:41 52 ; EOR ($52,X) 0x03FFF8|$0F:$FFE8:52 ; INVALID OPCODE 0x03FFF9|$0F:$FFE9:52 ; INVALID OPCODE 0x03FFFA|$0F:$FFEA:49 4F ; EOR #$4F 0x03FFFB|$0F:$FFEB:4F ; INVALID OPCODE 0x03FFFC|$0F:$FFEC:52 ; INVALID OPCODE 0x03FFFD|$0F:$FFED:20 49 49 ; JSR $4949 0x03FFFE|$0F:$FFEE:49 49 ; EOR #$49 0x03FFFF|$0F:$FFEF:49 C7 ; EOR #$C7 0x040000|$0F:$FFF0:C7 ; INVALID OPCODE 0x040001|$0F:$FFF1:AA ; TAX 0x040002|$0F:$FFF2:00 ; BRK 0x040003|$0F:$FFF3:00 ; BRK 0x040004|$0F:$FFF4:48 ; PHA 0x040005|$0F:$FFF5:04 ; INVALID OPCODE 0x040006|$0F:$FFF6:01 0F ; ORA ($0F,X) 0x040007|$0F:$FFF7:0F ; INVALID OPCODE 0x040008|$0F:$FFF8:07 ; INVALID OPCODE 0x040009|$0F:$FFF9:9D 00 C0 ; STA $C000,X ; unknown -> data 0x04000A|$0F:$FFFA:00 C0 ; $0F:$C000; NMI vector 0x04000C|$0F:$FFFC:D7 FF ; $0F:$FFD7; reset vector 0x04000E|$0F:$FFFE:AB C5 ; $0F:$C5AB; IRQ/BRK vector handler