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.

Dragon Warrior II (NES)/ROM map/ASM bank 0F

From Data Crystal
Jump to navigation Jump to search

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