Welcome to Data Crystal's new home! Data Crystal is now part of the TCRF family (sort of).
The wiki has recently moved; please report any issues in Discord. Pardon the dust.
The wiki has recently moved; please report any issues in Discord. Pardon the dust.
Dragon Warrior II (NES)/ROM map/ASM bank 06
Jump to navigation
Jump to search
; bank 0x06 of 16 starts at file address 0x018010 ; code bytes: $2F06 (73.47% of bytes in this ROM bank) ; data bytes: $10B1 (26.08% 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: $0021 (0.20% of bytes in this ROM bank) ; unknown bytes: $0028 (0.24% of bytes in this ROM bank) ; $3FB7 bytes last seen in RAM bank $8000 - $BFFF (100.00% of bytes seen in this ROM bank, 99.55% of bytes in this ROM bank): ; $2F06 code bytes (73.80% of bytes seen in this RAM bank, 73.47% of bytes in this ROM bank) ; $10B1 data bytes (26.20% of bytes seen in this RAM bank, 26.08% of bytes in this ROM bank) ; PRG Bank 0x06: handlers for main COMMAND menu options (TALK, SPELL, STATUS, ITEM, SEARCH, and EQUIP) including pretty much anything that is required input to or happens as a result of those commands; also includes code and data for gluing together irregularly shaped dungeon maps, starting and saving a game, text for items/spells/monster names, and the ending sequence ; [bank start] -> data ; possible external indexed data load target (from $0F:$F3ED, $0F:$FF28) ; external indirect data load target (via $08:$80CC, $0A:$80F5, $0A:$813E, $0F:$F052, $0F:$F83D) 0x018010|$06:$8000:12 ; possible external indexed data load target (from $0F:$F3F2, $0F:$FF2D) 0x018011|$06:$8001: A6 ; $06:$A612 ; indirect data load target (via $B0A8) ; external indirect data load target (via $02:$B74E, $0F:$FD25, $0F:$FD98) 0x018012|$06:$8002:09 A8 ; $06:$A809 ; -> $06:$A843: display and handle main game menu ; external indirect data load target (via $0F:$C6C7) 0x018014|$06:$8004:43 A8 ; $06:$A843; display and handle main game menu ; -> $06:$ABC7: copy save data from save data buffer at $7000 to system RAM; update Don Mahone quest status if applicable ; external indirect data load target (via $0F:$C6F9) 0x018016|$06:$8006:C7 AB ; $06:$ABC7; copy save data from save data buffer at $7000 to system RAM; update Don Mahone quest status if applicable ; external indirect data load target (via $0F:$D15F, $0F:$D171) 0x018018|$06:$8008:5F A8 ; $06:$A85F ; -> $06:$A896: copy Midenhall's full name from save slot in $75DB to $0100 in reverse ; external indirect data load target (via $0F:$EF5B) 0x01801A|$06:$800A:96 A8 ; $06:$A896; copy Midenhall's full name from save slot in $75DB to $0100 in reverse ; -> $06:$A8AA: given current game save slot in $75DB, return Midenhall's level in that save game in A/$0E ; external indirect data load target (via $0F:$EE09) 0x01801C|$06:$800C:AA A8 ; $06:$A8AA; given current game save slot in $75DB, return Midenhall's level in that save game in A/$0E 0x01801E|$06:$800E:B7 A8 ; $06:$A8B7 ; -> $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 ; external indirect data load target (via $0F:$F4E6, $0F:$F5E4, $0F:$F614) 0x018020|$06:$8010:FC AD ; $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 ; -> $06:$AE30: given hero ID - 1 in $4A and field spell menu selection index in A, return spell ID in A ; external indirect data load target (via $0F:$F5FA) 0x018022|$06:$8012:30 AE ; $06:$AE30; given hero ID - 1 in $4A and field spell menu selection index in A, return spell ID in A ; -> $06:$AE3D: given hero ID - 1 in $4A and battle spell menu selection index in A, return spell ID in A ; external indirect data load target (via $0F:$F4AC) 0x018024|$06:$8014:3D AE ; $06:$AE3D; given hero ID - 1 in $4A and battle spell menu selection index in A, return spell ID in A 0x018026|$06:$8016:86 AE ; $06:$AE86 ; external indirect data load target (via $0F:$F0BF) 0x018028|$06:$8018:7F AF ; $06:$AF7F 0x01802A|$06:$801A:8E AF ; $06:$AF8E ; -> $06:$A88F: copy Midenhall's short name from save slot in A to $0100 in reverse ; external indirect data load target (via $0F:$EE7E) 0x01802C|$06:$801C:8F A8 ; $06:$A88F; copy Midenhall's short name from save slot in A to $0100 in reverse ; -> $06:$A885: copy save data from system RAM to per-game save data ; external indirect data load target (via $0F:$C6DA) 0x01802E|$06:$801E:85 A8 ; $06:$A885; copy save data from system RAM to per-game save data ; -> $06:$AE4A: given spell ID in A, set A to spell name index ; external indirect data load target (via $02:$BEA4) 0x018030|$06:$8020:4A AE ; $06:$AE4A; given spell ID in A, set A to spell name index ; -> $06:$B2CA: Item list part 1, line 1 ; external indirect data load target (via $0F:$F316) 0x018032|$06:$8022:CA B2 ; $06:$B2CA; Item list part 1, line 1 ; -> $06:$B4B2: Item list part 1, line 2 ; external indirect data load target (via $0F:$F317) 0x018034|$06:$8024:B2 B4 ; $06:$B4B2; Item list part 1, line 2 ; -> $06:$B624: Spell name list ; data load target (from $F3AB) 0x018036|$06:$8026:24 B6 ; $06:$B624; Spell name list ; -> $06:$B718: Monster list part 1, line 1 ; external indirect data load target (via $0F:$F3DE) 0x018038|$06:$8028:18 B7 ; $06:$B718; Monster list part 1, line 1 ; -> $06:$B945: Monster list part 1, line 2 ; external indirect data load target (via $0F:$F3DF) 0x01803A|$06:$802A:45 B9 ; $06:$B945; Monster list part 1, line 2 0x01803C|$06:$802C:43 BA ; $06:$BA43; 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 during battle where there is no main COMMAND menu 0x01803E|$06:$802E:83 BA ; $06:$BA83 ; -> $06:$B3BE: Item list part 2, line 1 ; external indirect data load target (via $0F:$F318) 0x018040|$06:$8030:BE B3 ; $06:$B3BE; Item list part 2, line 1 ; -> $06:$B57C: Item list part 2, line 2 ; external indirect data load target (via $0F:$F319) 0x018042|$06:$8032:7C B5 ; $06:$B57C; Item list part 2, line 2 ; -> $06:$B85E: Monster list part 2, line 1 ; external indirect data load target (via $0F:$F3E0) 0x018044|$06:$8034:5E B8 ; $06:$B85E; Monster list part 2, line 1 ; -> $06:$B9D5: Monster list part 2, line 2 ; external indirect data load target (via $0F:$F3E1) 0x018046|$06:$8036:D5 B9 ; $06:$B9D5; Monster list part 2, line 2 ; external indirect data load target (via $0F:$C897) 0x018048|$06:$8038:3D BB ; $06:$BB3D ; external indirect data load target (via $0F:$C889) 0x01804A|$06:$803A:A3 BA ; $06:$BAA3 0x01804C|$06:$803C:1A A6 ; $06:$A61A ; external indirect data load target (via $0F:$D359) 0x01804E|$06:$803E:3D BC ; $06:$BC3D ; external indirect data load target (via $0F:$CC9E) 0x018050|$06:$8040:8D BC ; $06:$BC8D 0x018052|$06:$8042:E1 A3 ; $06:$A3E1; pointers to warp spaces for irregularly-shaped maps ; external indirect data load target (via $0F:$D2FA) 0x018054|$06:$8044:96 BD ; $06:$BD96 ; -> $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 ; external indirect data load target (via $0F:$D2EA) 0x018056|$06:$8046:ED BE ; $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 ; control flow target (from $8056) ; external control flow target (from $0F:$C70F) ; call to code in a different bank ($0F:$C1DC) 0x018058|$06:$8048:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x01805B|$06:$804B:A5 03 LDA $03 ; game clock? 0x01805D|$06:$804D:29 0F AND #$0F 0x01805F|$06:$804F:C9 01 CMP #$01 0x018061|$06:$8051:F0 06 BEQ $8059 ; call to code in a different bank ($0F:$CF64) 0x018063|$06:$8053:20 64 CF JSR $CF64 0x018066|$06:$8056:4C 48 80 JMP $8048 ; control flow target (from $8051) 0x018069|$06:$8059:A9 FF LDA #$FF 0x01806B|$06:$805B:85 35 STA $35 ; flag indicating whether any menu is currently open 0x01806D|$06:$805D:A9 06 LDA #$06 0x01806F|$06:$805F:85 94 STA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus ; call to code in a different bank ($0F:$EB76) 0x018071|$06:$8061:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x018074|$06:$8064:00 ; Menu ID #$00: Mini status window, bottom ; data -> code ; call to code in a different bank ($0F:$EB76) 0x018075|$06:$8065:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x018078|$06:$8068:06 ; Menu ID #$06: Map menu: main COMMAND menu ; data -> code 0x018079|$06:$8069:C9 FF CMP #$FF 0x01807B|$06:$806B:D0 0A BNE $8077 ; given a main COMMAND menu selection index in A, execute the handler for that menu function ; exit COMMAND menu ; control flow target (from $809A, $89D1, $8A09, $8B0C, $8B3D, $8B9F, $9545, $9558) 0x01807D|$06:$806D:A9 01 LDA #$01 ; call to code in a different bank ($0F:$CF6A) 0x01807F|$06:$806F:20 6A CF JSR $CF6A ; wipe selected menu region 0x018082|$06:$8072:A9 00 LDA #$00 0x018084|$06:$8074:85 35 STA $35 ; flag indicating whether any menu is currently open 0x018086|$06:$8076:60 RTS ; given a main COMMAND menu selection index in A, execute the handler for that menu function ; control flow target (from $806B) 0x018087|$06:$8077:0A ASL 0x018088|$06:$8078:A8 TAY 0x018089|$06:$8079:B9 86 80 LDA $8086,Y ; COMMAND menu command handler pointers 0x01808C|$06:$807C:85 0C STA $0C 0x01808E|$06:$807E:B9 87 80 LDA $8087,Y 0x018091|$06:$8081:85 0D STA $0D 0x018093|$06:$8083:6C 0C 00 JMP ($000C) ; code -> data ; COMMAND menu command handler pointers ; indexed data load target (from $8079) 0x018096|$06:$8086:A8 ; indexed data load target (from $807E) 0x018097|$06:$8087: 80 ; $06:$80A8; COMMAND menu TALK command handler 0x018098|$06:$8088:36 8B ; $06:$8B36; COMMAND menu SPELL command handler 0x01809A|$06:$808A:CA 89 ; $06:$89CA; COMMAND menu STATUS command handler 0x01809C|$06:$808C:5B 95 ; $06:$955B; COMMAND menu ITEM command handler 0x01809E|$06:$808E:17 9B ; $06:$9B17; COMMAND menu SEARCH handler 0x0180A0|$06:$8090:02 8A ; $06:$8A02; COMMAND menu EQUIP handler ; data -> code ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; control flow target (from $80BC, $80C7, $80DA, $80F3, $8139, $816F, $81AF, $8295, $82A0, $82C0, $82D2, $8385, $83B6, $8567, $86D2, $89FF, $8AFC, $8B52, $8B66, $8B87, $8C00, $8C2D, $8C91, $8C9C, $8F4B, $8F67) 0x0180A2|$06:$8092:20 9D 80 JSR $809D ; wait until all joypad buttons are released and then some button pressed ; wipe menus and exit COMMAND menu ; control flow target (from $80E8, $9071, $90C9, $91C3, $9345) 0x0180A5|$06:$8095:A9 00 LDA #$00 ; call to code in a different bank ($0F:$CF6A) 0x0180A7|$06:$8097:20 6A CF JSR $CF6A ; wipe selected menu region 0x0180AA|$06:$809A:4C 6D 80 JMP $806D ; exit COMMAND menu ; wait until all joypad buttons are released and then some button pressed ; control flow target (from $8092, $80A0, $89D9, $89F2, $954D, $A257) ; call to code in a different bank ($0F:$D13D) 0x0180AD|$06:$809D:20 3D D1 JSR $D13D ; wait for interrupt, read joypad data into $2F and A 0x0180B0|$06:$80A0:D0 FB BNE $809D ; wait until all joypad buttons are released and then some button pressed; loop until no buttons pressed ; control flow target (from $80A5) ; call to code in a different bank ($0F:$D13D) 0x0180B2|$06:$80A2:20 3D D1 JSR $D13D ; wait for interrupt, read joypad data into $2F and A 0x0180B5|$06:$80A5:F0 FB BEQ $80A2 ; loop until some button pressed 0x0180B7|$06:$80A7:60 RTS ; COMMAND menu TALK command handler ; indirect control flow target (via $8086) 0x0180B8|$06:$80A8:AD 40 05 LDA $0540 ; NPC #$00 ? + direction nybble 0x0180BB|$06:$80AB:29 03 AND #$03 ; call to code in a different bank ($0F:$CF70) 0x0180BD|$06:$80AD:20 70 CF JSR $CF70 ; -> $02:$B141 0x0180C0|$06:$80B0:A5 D0 LDA $D0 ; Malroth status flag (#$FF = defeated, #$00 = alive, others = countdown to battle) 0x0180C2|$06:$80B2:10 0B BPL $80BF ; pre-Malroth dialogue 0x0180C4|$06:$80B4:AD F3 05 LDA $05F3 ; target NPC sprite ID; post-Malroth, most dialogue becomes based on NPC sprite ID 0x0180C7|$06:$80B7:F0 0A BEQ $80C3 ; no sprite ID => nobody to talk to ; call to code in a different bank ($0F:$D334) 0x0180C9|$06:$80B9:20 34 D3 JSR $D334 ; post-Malroth dialogue 0x0180CC|$06:$80BC:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; pre-Malroth dialogue ; control flow target (from $80B2) 0x0180CF|$06:$80BF:A5 0C LDA $0C ; dialogue ID 0x0180D1|$06:$80C1:D0 07 BNE $80CA ; #$00 => nobody to talk to ; control flow target (from $80B7, $8216) ; call to code in a different bank ($0F:$F6F0) 0x0180D3|$06:$80C3:20 F0 F6 JSR $F6F0 ; open main dialogue window and display string ID specified by byte following JSR + #$0100 ; code -> data ; indirect data load target 0x0180D6|$06:$80C6:00 ; String ID #$0100: No one is in that direction.[end-FC] ; data -> code 0x0180D7|$06:$80C7:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; control flow target (from $80C1) 0x0180DA|$06:$80CA:C9 D7 CMP #$D7 0x0180DC|$06:$80CC:D0 0F BNE $80DD 0x0180DE|$06:$80CE:20 CB 9A JSR $9ACB ; open dialogue window 0x0180E1|$06:$80D1:A9 00 LDA #$00 ; Midenhall; useless since string doesn't use [name] control code ; call to code in a different bank ($0F:$FC50) 0x0180E3|$06:$80D3:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2A) 0x0180E6|$06:$80D6:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x0180E9|$06:$80D9:76 ; String ID #$0076: ‘Go now, my heir! Our fate is now in thy hands[.’][end-FC] ; data -> code 0x0180EA|$06:$80DA:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; control flow target (from $80CC) 0x0180ED|$06:$80DD:C9 D9 CMP #$D9 0x0180EF|$06:$80DF:D0 0A BNE $80EB ; call to code in a different bank ($0F:$F6F6) 0x0180F1|$06:$80E1: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 0x0180F4|$06:$80E4:9A ; String ID #$029A: ‘Would thou allow me to escape and tell Hargon many tidings?’[wait][line]‘Oh, but thou art such a fool[.’][wait][end-FC] ; data -> code ; call to code in a different bank ($0F:$D1E5) 0x0180F5|$06:$80E5:20 E5 D1 JSR $D1E5 ; trigger Fixed Battle #$01: 1 Evil Clown (Map ID #$04: Midenhall B1) 0x0180F8|$06:$80E8:4C 95 80 JMP $8095 ; wipe menus and exit COMMAND menu ; control flow target (from $80DF) 0x0180FB|$06:$80EB:C9 D8 CMP #$D8 0x0180FD|$06:$80ED:D0 07 BNE $80F6 ; call to code in a different bank ($0F:$F6EA) 0x0180FF|$06:$80EF:20 EA F6 JSR $F6EA ; open main dialogue window and display string ID specified by byte following JSR ; code -> data ; indirect data load target 0x018102|$06:$80F2:67 ; String ID #$0067: ‘Open now the treasure chest[.’][end-FC] ; data -> code 0x018103|$06:$80F3:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; control flow target (from $80ED) 0x018106|$06:$80F6:C9 01 CMP #$01 0x018108|$06:$80F8:D0 62 BNE $815C 0x01810A|$06:$80FA:20 CB 9A JSR $9ACB ; open dialogue window 0x01810D|$06:$80FD:A9 01 LDA #$01 ; Cannock; useless since string doesn't use [name] control code ; call to code in a different bank ($0F:$FC50) 0x01810F|$06:$80FF:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x018112|$06:$8102:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018115|$06:$8105:55 ; String ID #$0155: ‘Hail, friend! I am Prince [name] of Cannock[.’][wait][end-FC] ; data -> code 0x018116|$06:$8106:A9 00 LDA #$00 ; call to code in a different bank ($0F:$FC50) 0x018118|$06:$8108:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01811B|$06:$810B:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01811E|$06:$810E:56 ; String ID #$0156: ‘Art thou my cousin from Midenhall? Ah, it is as I guessed[.’][wait][line]‘I have been seeking thee so that together we may oppose Hargon[.’][wait][line]‘Come, let us go forth[.’][end-FC] ; data -> code 0x01811F|$06:$810F:A9 07 LDA #$07 ; Music ID #$07: add party member BGM ; call to code in a different bank ($0F:$C58D) 0x018121|$06:$8111:20 8D C5 JSR $C58D ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]), wait for it to finish, then play previous BGM 0x018124|$06:$8114:AD C0 05 LDA $05C0 ; NPC #$10 motion nybble + direction nybble 0x018127|$06:$8117:29 03 AND #$03 0x018129|$06:$8119:0A ASL 0x01812A|$06:$811A:0A ASL 0x01812B|$06:$811B:0A ASL 0x01812C|$06:$811C:AA TAX 0x01812D|$06:$811D:A0 00 LDY #$00 ; control flow target (from $8129) 0x01812F|$06:$811F:BD 3C 81 LDA $813C,X 0x018132|$06:$8122:99 42 05 STA $0542,Y ; NPC #$00 ? 0x018135|$06:$8125:C8 INY 0x018136|$06:$8126:E8 INX 0x018137|$06:$8127:C0 08 CPY #$08 0x018139|$06:$8129:D0 F4 BNE $811F 0x01813B|$06:$812B:A9 84 LDA #$84 ; add Cannock to party 0x01813D|$06:$812D:8D 3F 06 STA $063F ; Cannock status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x018140|$06:$8130:A9 FF LDA #$FF 0x018142|$06:$8132:8D C1 05 STA $05C1 ; NPC #$10 sprite ID 0x018145|$06:$8135:A9 03 LDA #$03 0x018147|$06:$8137:85 CA STA $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) 0x018149|$06:$8139:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; code -> data ; indexed data load target (from $811F, $817D) 0x01814C|$06:$813C:80 7F 00 01 00 00 00 01 0x018154|$06:$8144:70 6F FF 00 00 00 01 01 0x01815C|$06:$814C:80 5F 00 FF 00 00 02 01 0x018164|$06:$8154:90 6F 01 00 00 00 03 01 ; data -> code ; control flow target (from $80F8) 0x01816C|$06:$815C:C9 02 CMP #$02 0x01816E|$06:$815E:D0 42 BNE $81A2 0x018170|$06:$8160:20 CB 9A JSR $9ACB ; open dialogue window ; call to code in a different bank ($0F:$FA32) 0x018173|$06:$8163:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018176|$06:$8166:A8 ; String ID #$02A8: ‘Woof-woof!’[end-FC] ; data -> code 0x018177|$06:$8167:20 72 81 JSR $8172 0x01817A|$06:$816A:A9 09 LDA #$09 ; Sprite ID $#09: Dog 0x01817C|$06:$816C:8D 51 05 STA $0551 ; NPC #$02 sprite ID 0x01817F|$06:$816F:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; control flow target (from $8167, $9727) 0x018182|$06:$8172:AD 58 05 LDA $0558 ; NPC #$03 motion nybble + direction nybble 0x018185|$06:$8175:29 03 AND #$03 0x018187|$06:$8177:0A ASL 0x018188|$06:$8178:0A ASL 0x018189|$06:$8179:0A ASL 0x01818A|$06:$817A:AA TAX 0x01818B|$06:$817B:A0 00 LDY #$00 ; control flow target (from $8187) 0x01818D|$06:$817D:BD 3C 81 LDA $813C,X 0x018190|$06:$8180:99 4A 05 STA $054A,Y ; NPC #$01 scripted motion low byte 0x018193|$06:$8183:C8 INY 0x018194|$06:$8184:E8 INX 0x018195|$06:$8185:C0 08 CPY #$08 0x018197|$06:$8187:D0 F4 BNE $817D 0x018199|$06:$8189:A9 FF LDA #$FF 0x01819B|$06:$818B:8D 59 05 STA $0559 ; NPC #$03 sprite ID 0x01819E|$06:$818E:A0 08 LDY #$08 0x0181A0|$06:$8190:4C 93 81 JMP $8193 ; useless op ; control flow target (from $8190) 0x0181A3|$06:$8193:20 97 81 JSR $8197 0x0181A6|$06:$8196:C8 INY ; control flow target (from $8193) 0x0181A7|$06:$8197:B9 44 05 LDA $0544,Y ; NPC #$01 ? 0x0181AA|$06:$819A:38 SEC 0x0181AB|$06:$819B:F9 3C 05 SBC $053C,Y ; NPC #$00 ? 0x0181AE|$06:$819E:99 44 05 STA $0544,Y ; NPC #$01 ? 0x0181B1|$06:$81A1:60 RTS ; control flow target (from $815E) 0x0181B2|$06:$81A2:C9 03 CMP #$03 0x0181B4|$06:$81A4:D0 0C BNE $81B2 ; call to code in a different bank ($0F:$F6F6) 0x0181B6|$06:$81A6: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 0x0181B9|$06:$81A9:4D ; String ID #$024D: ‘I bid thee welcome to Wellgarth Town[.’][wait][line]‘I shall sing for thee[.’][end-FC] ; data -> code 0x0181BA|$06:$81AA:A9 0C LDA #$0C ; Music ID #$0C: game menu / Wellgarth singer BGM ; call to code in a different bank ($0F:$C561) 0x0181BC|$06:$81AC:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x0181BF|$06:$81AF:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; control flow target (from $81A4) 0x0181C2|$06:$81B2:C9 04 CMP #$04 0x0181C4|$06:$81B4:D0 03 BNE $81B9 0x0181C6|$06:$81B6:4C 34 97 JMP $9734 ; unused since no NPC has dialogue ID #$04 ; control flow target (from $81B4) 0x0181C9|$06:$81B9:C9 05 CMP #$05 0x0181CB|$06:$81BB:D0 08 BNE $81C5 0x0181CD|$06:$81BD:20 CB 9A JSR $9ACB ; open dialogue window 0x0181D0|$06:$81C0:A9 06 LDA #$06 ; Save Point ID #$06: Hamlin 0x0181D2|$06:$81C2:4C E3 93 JMP $93E3 ; update save point $48 to A, run through the whole save point sequence ; control flow target (from $81BB) 0x0181D5|$06:$81C5:C9 0A CMP #$0A ; useless op 0x0181D7|$06:$81C7:B0 00 BCS $81C9 ; useless op ; control flow target (from $81C7) 0x0181D9|$06:$81C9:C9 14 CMP #$14 0x0181DB|$06:$81CB:B0 03 BCS $81D0 0x0181DD|$06:$81CD:4C 19 82 JMP $8219 ; handler for dialogue IDs #$0A-#$13 (Innkeepers) ; control flow target (from $81CB) 0x0181E0|$06:$81D0:C9 1C CMP #$1C 0x0181E2|$06:$81D2:B0 03 BCS $81D7 0x0181E4|$06:$81D4:4C AD 82 JMP $82AD ; handler for dialogue IDs #$14-#$1B (Weapon Shops) ; control flow target (from $81D2) 0x0181E7|$06:$81D7:C9 27 CMP #$27 0x0181E9|$06:$81D9:B0 03 BCS $81DE 0x0181EB|$06:$81DB:4C 9A 83 JMP $839A ; handler for dialogue IDs #$1C-#$26 (Item Shops) ; control flow target (from $81D9) 0x0181EE|$06:$81DE:C9 28 CMP #$28 0x0181F0|$06:$81E0:B0 03 BCS $81E5 0x0181F2|$06:$81E2:4C 4E 85 JMP $854E ; handler for dialogue ID #$27 (House of Healing) ; control flow target (from $81E0) 0x0181F5|$06:$81E5:C9 29 CMP #$29 0x0181F7|$06:$81E7:B0 03 BCS $81EC 0x0181F9|$06:$81E9:4C C0 86 JMP $86C0 ; handler for dialogue ID #$28 (Lottery) ; control flow target (from $81E7) 0x0181FC|$06:$81EC:C9 95 CMP #$95 0x0181FE|$06:$81EE:B0 03 BCS $81F3 0x018200|$06:$81F0:4C 06 8E JMP $8E06 ; handler for dialogue IDs #$29-#$94 (open dialogue window and display string specified by A + #$1D7, i.e. String IDs #$0200-#$026B) ; control flow target (from $81EE) 0x018203|$06:$81F3:C9 9D CMP #$9D 0x018205|$06:$81F5:B0 03 BCS $81FA 0x018207|$06:$81F7:4C 44 8E JMP $8E44 ; handler for dialogue IDs #$95-#$9C (open dialogue window, display string specified by A + #$1D9, display YES/NO menu, and display string corresponding to selected option) ; control flow target (from $81F5) 0x01820A|$06:$81FA:C9 C3 CMP #$C3 0x01820C|$06:$81FC:B0 03 BCS $8201 0x01820E|$06:$81FE:4C 6A 8E JMP $8E6A ; handler for dialogue IDs #$9D-#$C2 (town NPCs with complex logic) ; control flow target (from $81FC) 0x018211|$06:$8201:C9 CD CMP #$CD 0x018213|$06:$8203:B0 03 BCS $8208 0x018215|$06:$8205:4C B0 94 JMP $94B0 ; handler for dialogue IDs #$C3-#$CC (open dialogue window and display string specified by A - #$73) ; control flow target (from $8203) 0x018218|$06:$8208:C9 D0 CMP #$D0 0x01821A|$06:$820A:B0 03 BCS $820F 0x01821C|$06:$820C:4C BE 94 JMP $94BE ; handler for dialogue IDs #$CD-#$CF (open dialogue window, display string specified by A - #$73, display YES/NO menu, and display string corresponding to selected option) ; control flow target (from $820A) 0x01821F|$06:$820F:C9 D9 CMP #$D9 0x018221|$06:$8211:B0 03 BCS $8216 0x018223|$06:$8213:4C E4 94 JMP $94E4 ; handler for dialogue IDs #$D0-#$D8 (dungeon NPCs with complex logic) ; control flow target (from $8211) 0x018226|$06:$8216:4C C3 80 JMP $80C3 ; unused since #$D9 was handled earlier and no NPC has dialogue ID > #$D9 ; handler for dialogue IDs #$0A-#$13 (Innkeepers) ; control flow target (from $81CD) 0x018229|$06:$8219:38 SEC 0x01822A|$06:$821A:E9 0A SBC #$0A ; convert to zero-based 0x01822C|$06:$821C:85 49 STA $49 ; object hero/target/item/string ID $49 0x01822E|$06:$821E:A8 TAY 0x01822F|$06:$821F:B9 80 9F LDA $9F80,Y ; Inn prices per party member 0x018232|$06:$8222:48 PHA ; Inn price per party member ; call to code in a different bank ($0F:$F6CE) 0x018233|$06:$8223:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x018236|$06:$8226:85 0C STA $0C ; number of party members - 1 0x018238|$06:$8228:E6 0C INC $0C ; number of party members 0x01823A|$06:$822A:68 PLA ; Inn price per party member 0x01823B|$06:$822B:20 AC 86 JSR $86AC ; multiply A by $0C, store results in ($10-$11) and ($8F-$90); consumes $0C ; call to code in a different bank ($0F:$F6F0) 0x01823E|$06:$822E:20 F0 F6 JSR $F6F0 ; open main dialogue window and display string ID specified by byte following JSR + #$0100 ; code -> data ; indirect data load target 0x018241|$06:$8231:7B ; String ID #$017B: ‘Welcome to the Village Inn[.’][wait][line]‘It's only [number] piece[(s)] of gold for the night.[line]Dost thou want a room?’[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$EB76) 0x018242|$06:$8232:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x018245|$06:$8235:1B ; Menu ID #$1B: Shop menu: current gold ; data -> code 0x018246|$06:$8236:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x018249|$06:$8239:C9 00 CMP #$00 ; YES 0x01824B|$06:$823B:D0 5F BNE $829C 0x01824D|$06:$823D:20 31 8D JSR $8D31 ; given gold amount in $8F-$90, decrease party gold by that amount and SEC if possible, CLC otherwise 0x018250|$06:$8240:90 56 BCC $8298 ; call to code in a different bank ($0F:$EB76) 0x018252|$06:$8242:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x018255|$06:$8245:1B ; Menu ID #$1B: Shop menu: current gold ; data -> code ; call to code in a different bank ($0F:$FA2E) 0x018256|$06:$8246:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018259|$06:$8249:7E ; String ID #$017E: ‘Sleep well[.’][FD][FD][end-FC] ; data -> code 0x01825A|$06:$824A:A2 14 LDX #$14 ; call to code in a different bank ($0F:$C1EE) 0x01825C|$06:$824C:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x01825F|$06:$824F:A9 FF LDA #$FF 0x018261|$06:$8251:85 0D STA $0D ; call to code in a different bank ($0F:$C2EB) 0x018263|$06:$8253:20 EB C2 JSR $C2EB 0x018266|$06:$8256:A9 01 LDA #$01 ; Music ID #$01: Inn BGM ; call to code in a different bank ($0F:$C58D) 0x018268|$06:$8258:20 8D C5 JSR $C58D ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]), wait for it to finish, then play previous BGM 0x01826B|$06:$825B:20 CC 8D JSR $8DCC ; restore full HP to all living party members 0x01826E|$06:$825E:20 EC 8D JSR $8DEC ; restore full MP to all living party members 0x018271|$06:$8261:A4 49 LDY $49 ; object hero/target/item/string ID $49 0x018273|$06:$8263:B9 A3 82 LDA $82A3,Y ; party direction after sleeping at inn (bits 0-1 = Cannock and Moonbrooke direction, 2-3 = Midenhall direction) 0x018276|$06:$8266:29 03 AND #$03 0x018278|$06:$8268:18 CLC 0x018279|$06:$8269:69 05 ADC #$05 0x01827B|$06:$826B:85 45 STA $45 ; call to code in a different bank ($0F:$CF76) 0x01827D|$06:$826D:20 76 CF JSR $CF76 0x018280|$06:$8270:A4 49 LDY $49 ; object hero/target/item/string ID $49 0x018282|$06:$8272:B9 A3 82 LDA $82A3,Y ; party direction after sleeping at inn (bits 0-1 = Cannock and Moonbrooke direction, 2-3 = Midenhall direction) 0x018285|$06:$8275:4A LSR 0x018286|$06:$8276:4A LSR 0x018287|$06:$8277:8D 40 05 STA $0540 ; NPC #$00 ? + direction nybble ; call to code in a different bank ($0F:$CF64) 0x01828A|$06:$827A:20 64 CF JSR $CF64 0x01828D|$06:$827D:A0 00 LDY #$00 ; control flow target (from $8288) 0x01828F|$06:$827F:B9 E6 C2 LDA $C2E6,Y 0x018292|$06:$8282:99 0D 00 STA $000D,Y 0x018295|$06:$8285:C8 INY 0x018296|$06:$8286:C0 05 CPY #$05 0x018298|$06:$8288:D0 F5 BNE $827F ; call to code in a different bank ($0F:$C2DE) 0x01829A|$06:$828A:20 DE C2 JSR $C2DE ; call to code in a different bank ($0F:$FA2E) 0x01829D|$06:$828D:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0182A0|$06:$8290:7F ; String ID #$017F: ‘Ah, good morning.[line]I trust thou art well rested[.’][wait][end-FC] ; data -> code ; call to code in a different bank ($0F:$FA2E) 0x0182A1|$06:$8291:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0182A4|$06:$8294:80 ; String ID #$0180: ‘Goodbye[.’][end-FC] ; data -> code 0x0182A5|$06:$8295:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; control flow target (from $8240) ; call to code in a different bank ($0F:$FA2E) 0x0182A8|$06:$8298:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0182AB|$06:$829B:7D ; String ID #$017D: ‘Sorry, thou hasn't enough gold[.’][wait][end-FC] ; data -> code ; control flow target (from $823B) ; call to code in a different bank ($0F:$FA2E) 0x0182AC|$06:$829C:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0182AF|$06:$829F:7C ; String ID #$017C: ‘Farewell, stranger[.’][end-FC] ; data -> code 0x0182B0|$06:$82A0:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; code -> data ; party direction after sleeping at inn (bits 0-1 = Cannock and Moonbrooke direction, 2-3 = Midenhall direction) ; indexed data load target (from $8263, $8272) 0x0182B3|$06:$82A3:04 ; Inn ID #$00, Map IDs #$00/#$03: Fake Midenhall/Midenhall 1F 0x0182B4|$06:$82A4:04 ; Inn ID #$01, Map ID #$05: Leftwyne 0x0182B5|$06:$82A5:0E ; Inn ID #$02, Map ID #$06: Cannock 0x0182B6|$06:$82A6:0C ; Inn ID #$03, Map ID #$07: Hamlin 0x0182B7|$06:$82A7:04 ; Inn ID #$04, Map ID #$0B: Lianport 0x0182B8|$06:$82A8:0C ; Inn ID #$05, Map ID #$0C: Tantegel 0x0182B9|$06:$82A9:0C ; Inn ID #$06, Map ID #$0F: Osterfair 0x0182BA|$06:$82AA:0C ; Inn ID #$07, Map ID #$10: Zahan 0x0182BB|$06:$82AB:0F ; Inn ID #$08, Map ID #$11: Tuhn / Map ID #$14: Wellgarth Underground 0x0182BC|$06:$82AC:0C ; Inn ID #$09, Map ID #$15: Beran ; data -> code ; handler for dialogue IDs #$14-#$1B (Weapon Shops) ; control flow target (from $81D4) 0x0182BD|$06:$82AD:85 49 STA $49 ; object hero/target/item/string ID $49 0x0182BF|$06:$82AF:C9 18 CMP #$18 ; Weapon Shop ID #04, Map ID #$0F: Osterfair 0x0182C1|$06:$82B1:D0 10 BNE $82C3 0x0182C3|$06:$82B3:AD C0 05 LDA $05C0 ; NPC #$10 motion nybble + direction nybble 0x0182C6|$06:$82B6:29 03 AND #$03 0x0182C8|$06:$82B8:C9 01 CMP #$01 ; Right 0x0182CA|$06:$82BA:F0 07 BEQ $82C3 ; talking to the shopkeeper from behind the counter, use a different string ; call to code in a different bank ($0F:$F6F6) 0x0182CC|$06:$82BC: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 0x0182CF|$06:$82BF:CE ; String ID #$02CE: ‘Do not enter this place!’[end-FC] ; data -> code 0x0182D0|$06:$82C0:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; control flow target (from $82B1, $82BA) ; call to code in a different bank ($0F:$F6F0) 0x0182D3|$06:$82C3:20 F0 F6 JSR $F6F0 ; open main dialogue window and display string ID specified by byte following JSR + #$0100 ; code -> data ; indirect data load target 0x0182D6|$06:$82C6:5B ; String ID #$015B: ‘We deal in weapons and armor.[line]Dost thou wish to see them?’[FD][FD][end-FC] ; data -> code 0x0182D7|$06:$82C7:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x0182DA|$06:$82CA:C9 00 CMP #$00 ; YES 0x0182DC|$06:$82CC:F0 07 BEQ $82D5 ; finish weapon transaction ; control flow target (from $82E3, $8318, $8367) ; call to code in a different bank ($0F:$FA2E) 0x0182DE|$06:$82CE:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0182E1|$06:$82D1:5D ; String ID #$015D: ‘Come again[.’][end-FC] ; data -> code 0x0182E2|$06:$82D2:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; control flow target (from $82CC, $836A) ; call to code in a different bank ($0F:$FA2E) 0x0182E5|$06:$82D5:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0182E8|$06:$82D8:5C ; String ID #$015C: ‘What would thou purchase?’[FD][FD][end-FC] ; data -> code 0x0182E9|$06:$82D9:A5 49 LDA $49 ; object hero/target/item/string ID $49 0x0182EB|$06:$82DB:38 SEC 0x0182EC|$06:$82DC:E9 14 SBC #$14 ; convert to Shop ID ; call to code in a different bank ($0F:$F61B) 0x0182EE|$06:$82DE:20 1B F6 JSR $F61B ; display shop menu item list for shop ID given in A, returning selected item (with Jailor's Key replaced by blank) in A 0x0182F1|$06:$82E1:C9 FF CMP #$FF 0x0182F3|$06:$82E3:F0 E9 BEQ $82CE ; finish weapon transaction 0x0182F5|$06:$82E5:20 4D 8D JSR $8D4D ; given item ID in A, save it to $96 and set $8F-$90 to purchase price of item, accounting for possible Golden Card discount; decrease party gold by that amount and SEC if possible, CLC otherwise 0x0182F8|$06:$82E8:B0 07 BCS $82F1 ; branch if price of item was deducted from party gold ; call to code in a different bank ($0F:$FA2E) 0x0182FA|$06:$82EA:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0182FD|$06:$82ED:5E ; String ID #$015E: ‘Sorry, it seems thou hast not enough gold[.’][wait][end-FC] ; data -> code 0x0182FE|$06:$82EE:4C 5C 83 JMP $835C ; control flow target (from $82E8) ; call to code in a different bank ($0F:$F6CE) 0x018301|$06:$82F1:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x018304|$06:$82F4:C9 00 CMP #$00 0x018306|$06:$82F6:D0 0E BNE $8306 ; if Midenhall is alone, no need to ask who to give it to 0x018308|$06:$82F8:20 6D 83 JSR $836D ; given hero ID in A and item ID in $96, try to add item to first empty slot in hero's inventory; if unable to add, refund purchase, pop JSR return address and JMP $8092 instead 0x01830B|$06:$82FB:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x01830D|$06:$82FD:85 95 STA $95 ; ID for [item] and [spell] control codes ; call to code in a different bank ($0F:$FA2E) 0x01830F|$06:$82FF:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018312|$06:$8302:5F ; String ID #$015F: ‘The [item], is it? Good choice and many thanks[.’][wait][end-FC] ; data -> code 0x018313|$06:$8303:4C 4C 83 JMP $834C ; control flow target (from $82F6) 0x018316|$06:$8306:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x018318|$06:$8308:85 95 STA $95 ; ID for [item] and [spell] control codes ; call to code in a different bank ($0F:$FA2E) 0x01831A|$06:$830A:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01831D|$06:$830D:62 ; String ID #$0162: ‘The [item]? Who will take this?’[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$F595) 0x01831E|$06:$830E:20 95 F5 JSR $F595 ; display appropriate shop BUY/SELL hero select menu 0x018321|$06:$8311:C9 FF CMP #$FF 0x018323|$06:$8313:D0 06 BNE $831B ; control flow target (from $8330) 0x018325|$06:$8315:20 88 83 JSR $8388 ; add the number at $8F-$90 to party gold; no check for overflow, so this is only safe to use when reverting a sale 0x018328|$06:$8318:4C CE 82 JMP $82CE ; finish weapon transaction ; control flow target (from $8313) 0x01832B|$06:$831B:85 97 STA $97 ; subject hero ID $97 0x01832D|$06:$831D:20 A3 A3 JSR $A3A3 ; given item ID in $96 and hero ID in $97, set A to #$80 if hero can equip item, #$00 otherwise 0x018330|$06:$8320:C9 00 CMP #$00 0x018332|$06:$8322:D0 0E BNE $8332 0x018334|$06:$8324:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x018337|$06:$8327:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01833A|$06:$832A:91 ; String ID #$0191: ‘[name] cannot be equipped with the [item]. Is it all right?’[end-FC] ; data -> code 0x01833B|$06:$832B:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x01833E|$06:$832E:C9 00 CMP #$00 0x018340|$06:$8330:D0 E3 BNE $8315 ; control flow target (from $8322) 0x018342|$06:$8332:A5 97 LDA $97 ; subject hero ID $97 0x018344|$06:$8334:20 6D 83 JSR $836D ; given hero ID in A and item ID in $96, try to add item to first empty slot in hero's inventory; if unable to add, refund purchase, pop JSR return address and JMP $8092 instead 0x018347|$06:$8337:A9 80 LDA #$80 ; Alive 0x018349|$06:$8339:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x01834C|$06:$833C:90 0A BCC $8348 0x01834E|$06:$833E:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x018351|$06:$8341:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018354|$06:$8344:63 ; String ID #$0163: ‘Splendid, [name]!’[wait][end-FC] ; data -> code 0x018355|$06:$8345:4C 4C 83 JMP $834C ; control flow target (from $833C) ; call to code in a different bank ($0F:$FA2E) 0x018358|$06:$8348:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01835B|$06:$834B:64 ; String ID #$0164: ‘Well, I'll just give it to the ghost, eh?’[wait][end-FC] ; data -> code ; control flow target (from $8303, $8345) 0x01835C|$06:$834C:A9 32 LDA #$32 ; Item ID #$32: Golden Card 0x01835E|$06:$834E: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 0x018361|$06:$8351:C9 FF CMP #$FF 0x018363|$06:$8353:F0 07 BEQ $835C 0x018365|$06:$8355:20 11 8D JSR $8D11 ; given item ID in $96 and discount amount in $8F-$90, set $8F-$90 to discounted item price ; call to code in a different bank ($0F:$FA2E) 0x018368|$06:$8358:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01836B|$06:$835B:60 ; String ID #$0160: ‘Since thou hast the Golden Card I shall give thee a special discount of [number] piece[(s)] of gold[.’][wait][end-FC] ; data -> code ; control flow target (from $82EE, $8353) ; call to code in a different bank ($0F:$FA2E) 0x01836C|$06:$835C:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01836F|$06:$835F:61 ; String ID #$0161: ‘Can I interest thee in anything else?’[FD][FD][end-FC] ; data -> code 0x018370|$06:$8360:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x018373|$06:$8363:C9 00 CMP #$00 ; YES 0x018375|$06:$8365:F0 03 BEQ $836A 0x018377|$06:$8367:4C CE 82 JMP $82CE ; finish weapon transaction ; control flow target (from $8365) 0x01837A|$06:$836A:4C D5 82 JMP $82D5 ; given hero ID in A and item ID in $96, try to add item to first empty slot in hero's inventory; if unable to add, refund purchase, pop JSR return address and JMP $8092 instead ; control flow target (from $82F8, $8334) 0x01837D|$06:$836D:85 97 STA $97 ; subject hero ID $97 0x01837F|$06:$836F:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x018382|$06:$8372:90 05 BCC $8379 ; call to code in a different bank ($0F:$EB76) 0x018384|$06:$8374:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x018387|$06:$8377:1B ; Menu ID #$1B: Shop menu: current gold ; data -> code 0x018388|$06:$8378:60 RTS ; control flow target (from $8372) 0x018389|$06:$8379:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01838C|$06:$837C:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01838F|$06:$837F:65 ; String ID #$0165: ‘It seems [name] has no more room to carry things[.’][end-FC] ; data -> code 0x018390|$06:$8380:20 88 83 JSR $8388 ; add the number at $8F-$90 to party gold; no check for overflow, so this is only safe to use when reverting a sale 0x018393|$06:$8383:68 PLA 0x018394|$06:$8384:68 PLA 0x018395|$06:$8385:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; add the number at $8F-$90 to party gold; no check for overflow, so this is only safe to use when reverting a sale ; control flow target (from $8315, $8380, $8403) 0x018398|$06:$8388:A5 8F LDA $8F 0x01839A|$06:$838A:18 CLC 0x01839B|$06:$838B:6D 24 06 ADC $0624 ; party gold, low byte 0x01839E|$06:$838E:8D 24 06 STA $0624 ; party gold, low byte 0x0183A1|$06:$8391:A5 90 LDA $90 0x0183A3|$06:$8393:6D 25 06 ADC $0625 ; party gold, high byte 0x0183A6|$06:$8396:8D 25 06 STA $0625 ; party gold, high byte 0x0183A9|$06:$8399:60 RTS ; handler for dialogue IDs #$1C-#$26 (Item Shops) ; control flow target (from $81DB) 0x0183AA|$06:$839A:38 SEC 0x0183AB|$06:$839B:E9 14 SBC #$14 ; convert to Shop ID 0x0183AD|$06:$839D:85 49 STA $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$F6F0) 0x0183AF|$06:$839F:20 F0 F6 JSR $F6F0 ; open main dialogue window and display string ID specified by byte following JSR + #$0100 ; code -> data ; indirect data load target 0x0183B2|$06:$83A2:66 ; String ID #$0166: ‘We deal in tools.[line]What can I offer thee?’[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$EB76) 0x0183B3|$06:$83A3:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x0183B6|$06:$83A6:18 ; Menu ID #$18: Shop menu: BUY/SELL ; data -> code 0x0183B7|$06:$83A7:C9 FF CMP #$FF 0x0183B9|$06:$83A9:F0 07 BEQ $83B2 ; finish item transaction 0x0183BB|$06:$83AB:C9 00 CMP #$00 ; BUY 0x0183BD|$06:$83AD:F0 15 BEQ $83C4 ; BUY handler 0x0183BF|$06:$83AF:4C 85 84 JMP $8485 ; SELL handler ; finish item transaction ; control flow target (from $83A9, $83C2, $83CF, $83DE, $8406, $8497, $84B4) ; call to code in a different bank ($0F:$FA2E) 0x0183C2|$06:$83B2:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0183C5|$06:$83B5:70 ; String ID #$0170: ‘Good day, then[.’][end-FC] ; data -> code 0x0183C6|$06:$83B6:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; control flow target (from $83EB, $8469, $8482) ; call to code in a different bank ($0F:$FA2E) 0x0183C9|$06:$83B9:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0183CC|$06:$83BC:6F ; String ID #$016F: ‘Dost thou need anything else?’[FD][FD][end-FC] ; data -> code 0x0183CD|$06:$83BD:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x0183D0|$06:$83C0:C9 00 CMP #$00 ; YES 0x0183D2|$06:$83C2:D0 EE BNE $83B2 ; finish item transaction ; BUY handler ; control flow target (from $83AD) ; call to code in a different bank ($0F:$FA2E) 0x0183D4|$06:$83C4:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0183D7|$06:$83C7:67 ; String ID #$0167: ‘What dost thou want?’[FD][FD][end-FC] ; data -> code 0x0183D8|$06:$83C8:A5 49 LDA $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$F61B) 0x0183DA|$06:$83CA:20 1B F6 JSR $F61B ; display shop menu item list for shop ID given in A, returning selected item (with Jailor's Key replaced by blank) in A 0x0183DD|$06:$83CD:C9 FF CMP #$FF 0x0183DF|$06:$83CF:F0 E1 BEQ $83B2 ; finish item transaction 0x0183E1|$06:$83D1:C9 00 CMP #$00 ; Jailor's Key converted to #$00 0x0183E3|$06:$83D3:D0 0D BNE $83E2 ; call to code in a different bank ($0F:$FA32) 0x0183E5|$06:$83D5:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0183E8|$06:$83D8:DA ; String ID #$02DA: ‘So thou hast heard about my wares[.’][wait][line]‘A bit expensive, maybe, but such fine craftsmanship![line]Will thou take it?’[FD][FD][end-FC] ; data -> code 0x0183E9|$06:$83D9:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x0183EC|$06:$83DC:C9 00 CMP #$00 ; YES 0x0183EE|$06:$83DE:D0 D2 BNE $83B2 ; finish item transaction 0x0183F0|$06:$83E0:A9 39 LDA #$39 ; Item ID #$39: Jailor’s Key ; control flow target (from $83D3) 0x0183F2|$06:$83E2:20 4D 8D JSR $8D4D ; given item ID in A, save it to $96 and set $8F-$90 to purchase price of item, accounting for possible Golden Card discount; decrease party gold by that amount and SEC if possible, CLC otherwise 0x0183F5|$06:$83E5:B0 07 BCS $83EE ; call to code in a different bank ($0F:$FA2E) 0x0183F7|$06:$83E7:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0183FA|$06:$83EA:68 ; String ID #$0168: ‘Unfortunately, thou hast not enough gold for that[.’][wait][end-FC] ; data -> code 0x0183FB|$06:$83EB:4C B9 83 JMP $83B9 ; control flow target (from $83E5) ; call to code in a different bank ($0F:$F6CE) 0x0183FE|$06:$83EE:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x018401|$06:$83F1:C9 00 CMP #$00 0x018403|$06:$83F3:D0 1F BNE $8414 ; if Midenhall is alone, no need to ask who to give it to 0x018405|$06:$83F5:85 97 STA $97 ; subject hero ID $97 0x018407|$06:$83F7:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x01840A|$06:$83FA:B0 0D BCS $8409 0x01840C|$06:$83FC:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01840F|$06:$83FF:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018412|$06:$8402:6C ; String ID #$016C: ‘Sorry. Thou cannot carry more[.’][wait][end-FC] ; data -> code ; revert sale, finish item transaction ; control flow target (from $842E, $8448) 0x018413|$06:$8403:20 88 83 JSR $8388 ; add the number at $8F-$90 to party gold; no check for overflow, so this is only safe to use when reverting a sale 0x018416|$06:$8406:4C B2 83 JMP $83B2 ; finish item transaction ; control flow target (from $83FA) 0x018419|$06:$8409:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x01841B|$06:$840B:85 95 STA $95 ; ID for [item] and [spell] control codes ; call to code in a different bank ($0F:$FA2E) 0x01841D|$06:$840D:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018420|$06:$8410:69 ; String ID #$0169: ‘The [item], eh? I thank thee[.’][wait][end-FC] ; data -> code 0x018421|$06:$8411:4C 55 84 JMP $8455 ; control flow target (from $83F3) 0x018424|$06:$8414:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x018426|$06:$8416:C9 39 CMP #$39 ; Item ID #$39: Jailor’s Key 0x018428|$06:$8418:D0 07 BNE $8421 ; call to code in a different bank ($0F:$FA32) 0x01842A|$06:$841A:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01842D|$06:$841D:DB ; String ID #$02DB: ‘Tell nobody that I have sold it[.’][wait][end-FC] ; data -> code 0x01842E|$06:$841E:4C 4A 84 JMP $844A ; control flow target (from $8418) 0x018431|$06:$8421:85 95 STA $95 ; ID for [item] and [spell] control codes ; call to code in a different bank ($0F:$FA2E) 0x018433|$06:$8423:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018436|$06:$8426:6A ; String ID #$016A: ‘Thou will buy the [item]?[line]And who will carry it?’[FD][FD][end-FC] ; data -> code ; control flow target (from $844E) ; call to code in a different bank ($0F:$F595) 0x018437|$06:$8427:20 95 F5 JSR $F595 ; display appropriate shop BUY/SELL hero select menu 0x01843A|$06:$842A:C9 FF CMP #$FF 0x01843C|$06:$842C:D0 03 BNE $8431 0x01843E|$06:$842E:4C 03 84 JMP $8403 ; revert sale, finish item transaction ; control flow target (from $842C) 0x018441|$06:$8431:85 97 STA $97 ; subject hero ID $97 0x018443|$06:$8433:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x018446|$06:$8436:B0 19 BCS $8451 0x018448|$06:$8438:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01844B|$06:$843B:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01844E|$06:$843E:6C ; String ID #$016C: ‘Sorry. Thou cannot carry more[.’][wait][end-FC] ; data -> code ; call to code in a different bank ($0F:$FA2E) 0x01844F|$06:$843F:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018452|$06:$8442:6D ; String ID #$016D: ‘Will one of thy companions carry it?’[FD][FD][end-FC] ; data -> code 0x018453|$06:$8443:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x018456|$06:$8446:C9 00 CMP #$00 ; YES 0x018458|$06:$8448:D0 B9 BNE $8403 ; revert sale, finish item transaction ; control flow target (from $841E) ; call to code in a different bank ($0F:$FA2E) 0x01845A|$06:$844A:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01845D|$06:$844D:6E ; String ID #$016E: ‘Who shall take it?’[FD][FD][end-FC] ; data -> code 0x01845E|$06:$844E:4C 27 84 JMP $8427 ; control flow target (from $8436) ; call to code in a different bank ($0F:$FA2E) 0x018461|$06:$8451:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018464|$06:$8454:6B ; String ID #$016B: ‘I thank thee kindly[.’][wait][end-FC] ; data -> code ; control flow target (from $8411) ; call to code in a different bank ($0F:$EB76) 0x018465|$06:$8455:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x018468|$06:$8458:1B ; Menu ID #$1B: Shop menu: current gold ; data -> code 0x018469|$06:$8459:A9 32 LDA #$32 ; Item ID #$32: Golden Card 0x01846B|$06:$845B: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 0x01846E|$06:$845E:C9 FF CMP #$FF 0x018470|$06:$8460:F0 0A BEQ $846C 0x018472|$06:$8462:20 11 8D JSR $8D11 ; given item ID in $96 and discount amount in $8F-$90, set $8F-$90 to discounted item price ; call to code in a different bank ($0F:$FA2E) 0x018475|$06:$8465:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018478|$06:$8468:71 ; String ID #$0171: ‘I see thou hast a Golden Card, but I will offer only a discount of [number] piece[(s)] of gold[.’][wait][end-FC] ; data -> code ; control flow target (from $8473, $847C) 0x018479|$06:$8469:4C B9 83 JMP $83B9 ; control flow target (from $8460) ; call to code in a different bank ($0F:$C3AB) 0x01847C|$06:$846C:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x01847F|$06:$846F:A5 32 LDA $32 ; RNG byte 0 0x018481|$06:$8471:C9 2B CMP #$2B ; odds of getting a Lottery Ticket = 43/256 0x018483|$06:$8473:B0 F4 BCS $8469 0x018485|$06:$8475:A9 33 LDA #$33 ; Item ID #$33: Lottery Ticket 0x018487|$06:$8477:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs 0x018489|$06:$8479:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x01848C|$06:$847C:90 EB BCC $8469 ; call to code in a different bank ($0F:$FA2E) 0x01848E|$06:$847E:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018491|$06:$8481:9D ; String ID #$019D: ‘With my compliments, here is an extra lottery ticket[.’][wait][end-FC] ; data -> code 0x018492|$06:$8482:4C B9 83 JMP $83B9 ; SELL handler ; control flow target (from $83AF) ; call to code in a different bank ($0F:$F6CE) 0x018495|$06:$8485:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x018498|$06:$8488:C9 00 CMP #$00 0x01849A|$06:$848A:F0 0E BEQ $849A ; if Midenhall is alone, no need to ask who's selling ; call to code in a different bank ($0F:$FA2E) 0x01849C|$06:$848C:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01849F|$06:$848F:72 ; String ID #$0172: ‘Whose property will thou sell?’[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$F595) 0x0184A0|$06:$8490:20 95 F5 JSR $F595 ; display appropriate shop BUY/SELL hero select menu 0x0184A3|$06:$8493:C9 FF CMP #$FF 0x0184A5|$06:$8495:D0 03 BNE $849A 0x0184A7|$06:$8497:4C B2 83 JMP $83B2 ; finish item transaction ; control flow target (from $848A, $8495) 0x0184AA|$06:$849A:85 97 STA $97 ; subject hero ID $97 ; control flow target (from $850D) 0x0184AC|$06:$849C:A5 97 LDA $97 ; subject hero ID $97 0x0184AE|$06:$849E:0A ASL ; 8 inventory items per hero 0x0184AF|$06:$849F:0A ASL 0x0184B0|$06:$84A0:0A ASL 0x0184B1|$06:$84A1:A8 TAY ; hero inventory read index 0x0184B2|$06:$84A2:A2 08 LDX #$08 ; 8 inventory items per hero; loop counter ; control flow target (from $84AB) 0x0184B4|$06:$84A4:B9 00 06 LDA $0600,Y ; Midenhall inventory item 1 (| #$40 if equipped) 0x0184B7|$06:$84A7:D0 0E BNE $84B7 0x0184B9|$06:$84A9:C8 INY ; hero inventory read index 0x0184BA|$06:$84AA:CA DEX ; loop counter 0x0184BB|$06:$84AB:D0 F7 BNE $84A4 0x0184BD|$06:$84AD:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x0184C0|$06:$84B0:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0184C3|$06:$84B3:73 ; String ID #$0173: ‘But [name] hast nothing to sell[.’][wait][end-FC] ; data -> code ; finish item transaction ; control flow target (from $84CF, $850B) 0x0184C4|$06:$84B4:4C B2 83 JMP $83B2 ; finish item transaction ; control flow target (from $84A7) ; call to code in a different bank ($0F:$FA2E) 0x0184C7|$06:$84B7:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0184CA|$06:$84BA:74 ; String ID #$0174: ‘Which art thou going to sell?’[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$EB76) 0x0184CB|$06:$84BB:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x0184CE|$06:$84BE:1B ; Menu ID #$1B: Shop menu: current gold ; data -> code 0x0184CF|$06:$84BF:A5 97 LDA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$F5FE) 0x0184D1|$06:$84C1:20 FE F5 JSR $F5FE ; given a hero ID in A, open hero's item list and return selected item ID (or #$FE if they have no items) 0x0184D4|$06:$84C4:86 49 STX $49 ; object hero/target/item/string ID $49 0x0184D6|$06:$84C6:48 PHA ; item ID 0x0184D7|$06:$84C7:A9 03 LDA #$03 ; call to code in a different bank ($0F:$CF6A) 0x0184D9|$06:$84C9:20 6A CF JSR $CF6A ; wipe selected menu region 0x0184DC|$06:$84CC:68 PLA ; item ID 0x0184DD|$06:$84CD:C9 FF CMP #$FF 0x0184DF|$06:$84CF:F0 E3 BEQ $84B4 ; finish item transaction 0x0184E1|$06:$84D1:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x0184E3|$06:$84D3:29 3F AND #$3F ; strip off the equipped bit 0x0184E5|$06:$84D5:0A ASL 0x0184E6|$06:$84D6:A8 TAY 0x0184E7|$06:$84D7:B9 FC 9F LDA $9FFC,Y ; Item Prices, low byte 0x0184EA|$06:$84DA:85 8F STA $8F 0x0184EC|$06:$84DC:B9 FD 9F LDA $9FFD,Y ; Item Prices, high byte 0x0184EF|$06:$84DF:85 90 STA $90 0x0184F1|$06:$84E1:46 90 LSR $90 ; LSR 16-bit $8F-$90 0x0184F3|$06:$84E3:66 8F ROR $8F 0x0184F5|$06:$84E5:46 90 LSR $90 ; LSR 16-bit $8F-$90 0x0184F7|$06:$84E7:66 8F ROR $8F 0x0184F9|$06:$84E9:B9 FC 9F LDA $9FFC,Y ; Item Prices, low byte 0x0184FC|$06:$84EC:38 SEC 0x0184FD|$06:$84ED:E5 8F SBC $8F 0x0184FF|$06:$84EF:85 8F STA $8F 0x018501|$06:$84F1:B9 FD 9F LDA $9FFD,Y ; Item Prices, high byte 0x018504|$06:$84F4:E5 90 SBC $90 0x018506|$06:$84F6:85 90 STA $90 ; at this point item sell price is 75% of base price 0x018508|$06:$84F8:A5 8F LDA $8F ; check if sell price is zero 0x01850A|$06:$84FA:05 90 ORA $90 0x01850C|$06:$84FC:D0 12 BNE $8510 ; sell price of zero => key item ; call to code in a different bank ($0F:$FA2E) 0x01850E|$06:$84FE:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018511|$06:$8501:75 ; String ID #$0175: ‘Sorry, friend, but I cannot buy that[.’][wait][end-FC] ; data -> code ; control flow target (from $8523, $8544, $854B) ; call to code in a different bank ($0F:$FA2E) 0x018512|$06:$8502:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018515|$06:$8505:79 ; String ID #$0179: ‘Art thou going to sell more?’[FD][FD][end-FC] ; data -> code 0x018516|$06:$8506:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x018519|$06:$8509:C9 00 CMP #$00 ; YES 0x01851B|$06:$850B:D0 A7 BNE $84B4 ; finish item transaction 0x01851D|$06:$850D:4C 9C 84 JMP $849C ; control flow target (from $84FC) 0x018520|$06:$8510:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x018522|$06:$8512:85 95 STA $95 ; ID for [item] and [spell] control codes ; call to code in a different bank ($0F:$FA2E) 0x018524|$06:$8514:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018527|$06:$8517:76 ; String ID #$0176: ‘Thy [item]? Well, I'll give thee [number] piece[(s)] of gold for that[.’][FD][FD][end-FC] ; data -> code 0x018528|$06:$8518:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x01852B|$06:$851B:C9 00 CMP #$00 ; YES 0x01852D|$06:$851D:F0 07 BEQ $8526 ; call to code in a different bank ($0F:$FA2E) 0x01852F|$06:$851F:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018532|$06:$8522:77 ; String ID #$0177: ‘That's too bad[.’][wait][end-FC] ; data -> code 0x018533|$06:$8523:4C 02 85 JMP $8502 ; control flow target (from $851D) 0x018536|$06:$8526:A6 49 LDX $49 ; object hero/target/item/string ID $49 0x018538|$06:$8528:20 0F 8B JSR $8B0F ; given hero ID in $97 and hero inventory index in X, return corresponding item ID in A and party inventory index in X 0x01853B|$06:$852B:8A TXA ; don't care about the item ID, just want the party inventory ID 0x01853C|$06:$852C:A8 TAY 0x01853D|$06:$852D:20 23 8B JSR $8B23 ; given party inventory index in Y, CLC and return equipped item ID in A if corresponding item is equipped and cursed, SEC and return unequipped item ID in A otherwise 0x018540|$06:$8530:90 15 BCC $8547 ; call to code in a different bank ($0F:$FA2E) 0x018542|$06:$8532:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018545|$06:$8535:78 ; String ID #$0178: ‘I thank thee[.’][wait][end-FC] ; data -> code 0x018546|$06:$8536:20 F5 8C JSR $8CF5 ; add $8F-$90 to party gold, capped at $FFFF 0x018549|$06:$8539:A5 97 LDA $97 ; subject hero ID $97 0x01854B|$06:$853B:A6 49 LDX $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$C4D4) 0x01854D|$06:$853D:20 D4 C4 JSR $C4D4 ; 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 ; call to code in a different bank ($0F:$EB76) 0x018550|$06:$8540:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x018553|$06:$8543:1B ; Menu ID #$1B: Shop menu: current gold ; data -> code 0x018554|$06:$8544:4C 02 85 JMP $8502 ; control flow target (from $8530) ; call to code in a different bank ($0F:$FA2E) 0x018557|$06:$8547:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01855A|$06:$854A:7A ; String ID #$017A: ‘I fear it won't come off due to the curse[.’][wait][end-FC] ; data -> code 0x01855B|$06:$854B:4C 02 85 JMP $8502 ; handler for dialogue ID #$27 (House of Healing) ; control flow target (from $81E2) 0x01855E|$06:$854E:38 SEC 0x01855F|$06:$854F:E9 27 SBC #$27 ; LDA #$00 would have been shorter and faster 0x018561|$06:$8551:85 49 STA $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$F6F0) 0x018563|$06:$8553:20 F0 F6 JSR $F6F0 ; open main dialogue window and display string ID specified by byte following JSR + #$0100 ; code -> data ; indirect data load target 0x018566|$06:$8556:81 ; String ID #$0181: ‘Welcome to the House of Healing[.’][wait][end-FC] ; data -> code ; control flow target (from $8573) ; call to code in a different bank ($0F:$FA2E) 0x018567|$06:$8557:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01856A|$06:$855A:82 ; String ID #$0182: ‘What service dost thou require?’[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$EB76) 0x01856B|$06:$855B:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x01856E|$06:$855E:1A ; Menu ID #$1A: Priest menu: DETOXICATE/UNCURSE/REVIVAL ; data -> code 0x01856F|$06:$855F:C9 FF CMP #$FF 0x018571|$06:$8561:D0 14 BNE $8577 ; finish conversation ; control flow target (from $8575, $858E, $85D9, $8632) ; call to code in a different bank ($0F:$FA2E) 0x018573|$06:$8563:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018576|$06:$8566:88 ; String ID #$0188: ‘Good luck and hey, let's be careful out there[.’][end-FC] ; data -> code 0x018577|$06:$8567:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; repeat service loop ; control flow target (from $85A0, $85BD, $85F7, $8619, $8645, $866F, $869A) ; call to code in a different bank ($0F:$FA2E) 0x01857A|$06:$856A:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01857D|$06:$856D:87 ; String ID #$0187: ‘Can I do anything else for thee?’[FD][FD][end-FC] ; data -> code 0x01857E|$06:$856E:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x018581|$06:$8571:C9 00 CMP #$00 ; YES 0x018583|$06:$8573:F0 E2 BEQ $8557 0x018585|$06:$8575:D0 EC BNE $8563 ; finish conversation ; control flow target (from $8561) 0x018587|$06:$8577:C9 00 CMP #$00 ; DETOXICATE 0x018589|$06:$8579:F0 03 BEQ $857E ; DETOXICATE handler 0x01858B|$06:$857B:4C C0 85 JMP $85C0 ; DETOXICATE handler ; control flow target (from $8579) ; call to code in a different bank ($0F:$F6CE) 0x01858E|$06:$857E:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x018591|$06:$8581:C9 00 CMP #$00 0x018593|$06:$8583:F0 0B BEQ $8590 ; if Midenhall is alone, no need to ask for target hero ; call to code in a different bank ($0F:$FA2E) 0x018595|$06:$8585:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018598|$06:$8588:83 ; String ID #$0183: ‘Who is the patient?’[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$F595) 0x018599|$06:$8589:20 95 F5 JSR $F595 ; display appropriate shop BUY/SELL hero select menu 0x01859C|$06:$858C:C9 FF CMP #$FF 0x01859E|$06:$858E:F0 D3 BEQ $8563 ; finish conversation ; control flow target (from $8583) 0x0185A0|$06:$8590:85 97 STA $97 ; subject hero ID $97 0x0185A2|$06:$8592:A9 20 LDA #$20 ; Poison 0x0185A4|$06:$8594:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x0185A7|$06:$8597:B0 0A BCS $85A3 0x0185A9|$06:$8599:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x0185AC|$06:$859C:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0185AF|$06:$859F:84 ; String ID #$0184: ‘Good news, [name] has not been poisoned[.’][wait][end-FC] ; data -> code 0x0185B0|$06:$85A0:4C 6A 85 JMP $856A ; repeat service loop ; control flow target (from $8597) 0x0185B3|$06:$85A3:A9 02 LDA #$02 ; DETOXICATE fee is hero level * 2 0x0185B5|$06:$85A5:20 A4 86 JSR $86A4 ; given hero ID in $97, multiply A by that hero's level, store results in ($10-$11) and ($8F-$90); consumes $0C 0x0185B8|$06:$85A8:20 79 86 JSR $8679 ; try to collect payment for House of Healing service; refusal or insufficient gold pops JSP return address and jumps to repeat service loop at $06:$856A ; call to code in a different bank ($0F:$FA2E) 0x0185BB|$06:$85AB:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0185BE|$06:$85AE:86 ; String ID #$0186: ‘Now I will administer the antidote to [name].[line]Stand still, please[.’][wait][end-FC] ; data -> code ; call to code in a different bank ($0F:$C515) 0x0185BF|$06:$85AF:20 15 C5 JSR $C515 ; flash screen 10 times 0x0185C2|$06:$85B2:20 AA 8D JSR $8DAA ; given hero ID in $97, set Y to start of hero's data in $062D,Y, i.e. Y = $97 * #$12 0x0185C5|$06:$85B5:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x0185C8|$06:$85B8:29 DF AND #$DF ; clear Poison 0x0185CA|$06:$85BA:99 2D 06 STA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x0185CD|$06:$85BD:4C 6A 85 JMP $856A ; repeat service loop ; control flow target (from $857B) 0x0185D0|$06:$85C0:C9 01 CMP #$01 ; UNCURSE 0x0185D2|$06:$85C2:F0 03 BEQ $85C7 ; UNCURSE handler 0x0185D4|$06:$85C4:4C 20 86 JMP $8620 ; REVIVAL handler ; UNCURSE handler ; control flow target (from $85C2) ; call to code in a different bank ($0F:$F6CE) 0x0185D7|$06:$85C7:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x0185DA|$06:$85CA:C9 00 CMP #$00 0x0185DC|$06:$85CC:F0 0E BEQ $85DC ; if Midenhall is alone, no need to ask for target hero ; call to code in a different bank ($0F:$FA2E) 0x0185DE|$06:$85CE:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0185E1|$06:$85D1:8B ; String ID #$018B: ‘A curse is it?[line]Who needs the cure?’[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$F595) 0x0185E2|$06:$85D2:20 95 F5 JSR $F595 ; display appropriate shop BUY/SELL hero select menu 0x0185E5|$06:$85D5:C9 FF CMP #$FF 0x0185E7|$06:$85D7:D0 03 BNE $85DC 0x0185E9|$06:$85D9:4C 63 85 JMP $8563 ; finish conversation ; control flow target (from $85CC, $85D7) 0x0185EC|$06:$85DC:85 97 STA $97 ; subject hero ID $97 0x0185EE|$06:$85DE:A9 04 LDA #$04 ; there are 4 cursed items in the game 0x0185F0|$06:$85E0:85 0C STA $0C ; control flow target (from $85EE) 0x0185F2|$06:$85E2:A4 0C LDY $0C 0x0185F4|$06:$85E4:B9 1B 86 LDA $861B,Y ; list of cursed items (equipped), built in offset from $861C 0x0185F7|$06:$85E7:20 BA 8D JSR $8DBA ; given a hero ID in $97 and an item ID in A, SEC if hero has that item, CLC otherwise 0x0185FA|$06:$85EA:B0 0E BCS $85FA 0x0185FC|$06:$85EC:C6 0C DEC $0C 0x0185FE|$06:$85EE:D0 F2 BNE $85E2 ; loop to check next cursed item 0x018600|$06:$85F0:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x018603|$06:$85F3:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018606|$06:$85F6:8C ; String ID #$018C: ‘Hmmm. No. [name] is not cursed[.’][wait][end-FC] ; data -> code 0x018607|$06:$85F7:4C 6A 85 JMP $856A ; repeat service loop ; control flow target (from $85EA) 0x01860A|$06:$85FA:A9 64 LDA #$64 ; UNCURSE fee is hero level * 100 0x01860C|$06:$85FC:20 A4 86 JSR $86A4 ; given hero ID in $97, multiply A by that hero's level, store results in ($10-$11) and ($8F-$90); consumes $0C 0x01860F|$06:$85FF:20 79 86 JSR $8679 ; try to collect payment for House of Healing service; refusal or insufficient gold pops JSP return address and jumps to repeat service loop at $06:$856A ; call to code in a different bank ($0F:$FA2E) 0x018612|$06:$8602:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018615|$06:$8605:8D ; String ID #$018D: ‘A curse is like a virus, of course. This medicine should remove it[.’][end-FC] ; data -> code ; call to code in a different bank ($0F:$C515) 0x018616|$06:$8606:20 15 C5 JSR $C515 ; flash screen 10 times 0x018619|$06:$8609:A9 04 LDA #$04 ; there are 4 cursed items in the game 0x01861B|$06:$860B:85 0C STA $0C ; control flow target (from $8617) 0x01861D|$06:$860D:A4 0C LDY $0C 0x01861F|$06:$860F:B9 1B 86 LDA $861B,Y ; list of cursed items (equipped), built in offset from $861C 0x018622|$06:$8612:20 C3 8D JSR $8DC3 ; given a hero ID in $97 and an item ID in A, remove that item from hero's inventory if present and SEC, CLC otherwise 0x018625|$06:$8615:C6 0C DEC $0C 0x018627|$06:$8617:D0 F4 BNE $860D ; loop to keep removing cursed items 0x018629|$06:$8619:4C 6A ; list of cursed items (equipped), built in offset from $861C ; indexed data load target (from $85E4, $860F, $8AC8) 0x01862B|$06:$861B: 85 JMP $856A ; repeat service loop ; code -> data ; list of equipped cursed items ; indexed data load target (from $8B28) 0x01862C|$06:$861C:6F ; Item ID #$6F: Gremlin’s Tail (equipped) 0x01862D|$06:$861D:4C ; Item ID #$4C: Sword of Destruction (equipped) 0x01862E|$06:$861E:57 ; Item ID #$57: Gremlin’s Armor (equipped) 0x01862F|$06:$861F:5F ; Item ID #$5F: Evil Shield (equipped) ; data -> code ; REVIVAL handler ; control flow target (from $85C4) ; call to code in a different bank ($0F:$F6CE) 0x018630|$06:$8620:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x018633|$06:$8623:C9 00 CMP #$00 ; if Midenhall is alone, no need to ask for target hero 0x018635|$06:$8625:F0 0E BEQ $8635 ; call to code in a different bank ($0F:$FA2E) 0x018637|$06:$8627:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01863A|$06:$862A:8E ; String ID #$018E: ‘Whom shall I revive?’[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$F595) 0x01863B|$06:$862B:20 95 F5 JSR $F595 ; display appropriate shop BUY/SELL hero select menu 0x01863E|$06:$862E:C9 FF CMP #$FF 0x018640|$06:$8630:D0 03 BNE $8635 0x018642|$06:$8632:4C 63 85 JMP $8563 ; finish conversation ; control flow target (from $8625, $8630) 0x018645|$06:$8635:85 97 STA $97 ; subject hero ID $97 0x018647|$06:$8637:A9 80 LDA #$80 ; Alive 0x018649|$06:$8639:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x01864C|$06:$863C:90 0A BCC $8648 0x01864E|$06:$863E:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x018651|$06:$8641:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018654|$06:$8644:8F ; String ID #$018F: ‘There, I think [name] will live now[.’][wait][end-FC] ; data -> code 0x018655|$06:$8645:4C 6A 85 JMP $856A ; repeat service loop ; control flow target (from $863C) 0x018658|$06:$8648:A9 14 LDA #$14 ; REVIVAL fee is hero level * 20 0x01865A|$06:$864A:20 A4 86 JSR $86A4 ; given hero ID in $97, multiply A by that hero's level, store results in ($10-$11) and ($8F-$90); consumes $0C 0x01865D|$06:$864D:20 79 86 JSR $8679 ; try to collect payment for House of Healing service; refusal or insufficient gold pops JSP return address and jumps to repeat service loop at $06:$856A ; call to code in a different bank ($0F:$FA2E) 0x018660|$06:$8650:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018663|$06:$8653:90 ; String ID #$0190: ‘This is a very delicate operation[.’][wait][line]‘It may take a little while[.’][FD][FD][end-FC] ; data -> code 0x018664|$06:$8654:A9 02 LDA #$02 ; Music ID #$02: revive BGM ; call to code in a different bank ($0F:$C58D) 0x018666|$06:$8656:20 8D C5 JSR $C58D ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]), wait for it to finish, then play previous BGM 0x018669|$06:$8659:20 AA 8D JSR $8DAA ; given hero ID in $97, set Y to start of hero's data in $062D,Y, i.e. Y = $97 * #$12 0x01866C|$06:$865C:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01866F|$06:$865F:09 80 ORA #$80 ; Alive 0x018671|$06:$8661:99 2D 06 STA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x018674|$06:$8664:A9 01 LDA #$01 ; revived with 1 HP 0x018676|$06:$8666:99 3B 06 STA $063B,Y ; Midenhall Current HP, low byte ; call to code in a different bank ($0F:$D302) 0x018679|$06:$8669:20 02 D3 JSR $D302 ; call to code in a different bank ($0F:$C22C) 0x01867C|$06:$866C:20 2C C2 JSR $C22C 0x01867F|$06:$866F:4C 6A 85 JMP $856A ; repeat service loop ; call to code in a different bank ($0F:$FA2E) 0x018682|$06:$8672:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data 0x018685|$06:$8675:91 ; String ID #$0191: ‘[name] cannot be equipped with the [item]. Is it all right?’[end-FC] ; data -> code 0x018686|$06:$8676:4C 7D 86 JMP $867D ; try to collect payment for House of Healing service; refusal or insufficient gold pops JSP return address and jumps to repeat service loop at $06:$856A ; control flow target (from $85A8, $85FF, $864D) ; call to code in a different bank ($0F:$FA2E) 0x018689|$06:$8679:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01868C|$06:$867C:85 ; String ID #$0185: ‘The fee is [number] piece[(s)] of gold.[line]Will thou pay?’[FD][FD][end-FC] ; data -> code ; control flow target (from $8676) ; call to code in a different bank ($0F:$EB76) 0x01868D|$06:$867D:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x018690|$06:$8680:1B ; Menu ID #$1B: Shop menu: current gold ; data -> code 0x018691|$06:$8681:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x018694|$06:$8684:C9 00 CMP #$00 ; YES 0x018696|$06:$8686:D0 0C BNE $8694 0x018698|$06:$8688:20 31 8D JSR $8D31 ; given gold amount in $8F-$90, decrease party gold by that amount and SEC if possible, CLC otherwise 0x01869B|$06:$868B:90 10 BCC $869D ; call to code in a different bank ($0F:$EB76) 0x01869D|$06:$868D:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x0186A0|$06:$8690:1B ; Menu ID #$1B: Shop menu: current gold ; data -> code 0x0186A1|$06:$8691:4C 25 8D JMP $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; control flow target (from $8686) ; call to code in a different bank ($0F:$FA2E) 0x0186A4|$06:$8694:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0186A7|$06:$8697:89 ; String ID #$0189: ‘Come now, dost thou think leeches grow on trees?’[wait][line]‘I have expenses, taxes to pay, a wife, two kids, and a brand new cow[.’][wait][end-FC] ; data -> code ; control flow target (from $86A1) 0x0186A8|$06:$8698:68 PLA 0x0186A9|$06:$8699:68 PLA 0x0186AA|$06:$869A:4C 6A 85 JMP $856A ; repeat service loop ; control flow target (from $868B) ; call to code in a different bank ($0F:$FA2E) 0x0186AD|$06:$869D:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0186B0|$06:$86A0:8A ; String ID #$018A: ‘What's this?[line]Thou hast no gold?[line]Well then get some!’[wait][end-FC] ; data -> code 0x0186B1|$06:$86A1:4C 98 86 JMP $8698 ; given hero ID in $97, multiply A by that hero's level, store results in ($10-$11) and ($8F-$90); consumes $0C ; control flow target (from $85A5, $85FC, $864A) 0x0186B4|$06:$86A4:85 0C STA $0C 0x0186B6|$06:$86A6:20 AA 8D JSR $8DAA ; given hero ID in $97, set Y to start of hero's data in $062D,Y, i.e. Y = $97 * #$12 0x0186B9|$06:$86A9:B9 3E 06 LDA $063E,Y ; Midenhall Level ; multiply A by $0C, store results in ($10-$11) and ($8F-$90); consumes $0C ; control flow target (from $822B) 0x0186BC|$06:$86AC:85 0E STA $0E 0x0186BE|$06:$86AE:A9 00 LDA #$00 0x0186C0|$06:$86B0:85 0D STA $0D 0x0186C2|$06:$86B2:85 0F STA $0F ; call to code in a different bank ($0F:$C339) 0x0186C4|$06:$86B4:20 39 C3 JSR $C339 ; 16-bit multiplication: ($10-$11) = ($0C-$0D) * ($0E-$0F); consumes $0C-$0F 0x0186C7|$06:$86B7:A5 10 LDA $10 0x0186C9|$06:$86B9:85 8F STA $8F 0x0186CB|$06:$86BB:A5 11 LDA $11 0x0186CD|$06:$86BD:85 90 STA $90 0x0186CF|$06:$86BF:60 RTS ; handler for dialogue ID #$28 (Lottery) ; control flow target (from $81E9) ; call to code in a different bank ($0F:$F6F0) 0x0186D0|$06:$86C0:20 F0 F6 JSR $F6F0 ; open main dialogue window and display string ID specified by byte following JSR + #$0100 ; code -> data ; indirect data load target 0x0186D3|$06:$86C3:94 ; String ID #$0194: ‘Step right up and welcome to the Lottery.[line]Art thou going to play?’[FD][FD][end-FC] ; data -> code 0x0186D4|$06:$86C4:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x0186D7|$06:$86C7:C9 00 CMP #$00 ; YES 0x0186D9|$06:$86C9:F0 0A BEQ $86D5 ; finish lottery conversation ; control flow target (from $86E2, $870B, $8723, $873C) ; call to code in a different bank ($0F:$FA2E) 0x0186DB|$06:$86CB:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0186DE|$06:$86CE:95 ; String ID #$0195: ‘Well, perhaps some other time[.’][end-FC] ; data -> code 0x0186DF|$06:$86CF:20 05 89 JSR $8905 0x0186E2|$06:$86D2:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; control flow target (from $86C9) 0x0186E5|$06:$86D5:A9 33 LDA #$33 ; Item ID #$33: Lottery Ticket 0x0186E7|$06:$86D7: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 0x0186EA|$06:$86DA:C9 FF CMP #$FF 0x0186EC|$06:$86DC:D0 07 BNE $86E5 ; call to code in a different bank ($0F:$FA2E) 0x0186EE|$06:$86DE:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0186F1|$06:$86E1:96 ; String ID #$0196: ‘I'm afraid thou must have a Lottery Ticket[.’][wait][end-FC] ; data -> code 0x0186F2|$06:$86E2:4C CB 86 JMP $86CB ; finish lottery conversation ; control flow target (from $86DC) 0x0186F5|$06:$86E5:4A LSR ; convert party inventory index to hero ID 0x0186F6|$06:$86E6:4A LSR 0x0186F7|$06:$86E7:4A LSR 0x0186F8|$06:$86E8:85 97 STA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$FA2E) 0x0186FA|$06:$86EA:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0186FD|$06:$86ED:97 ; String ID #$0197: ‘Dost thou wish to hear how the game is played?’[FD][FD][end-FC] ; data -> code 0x0186FE|$06:$86EE:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x018701|$06:$86F1:C9 00 CMP #$00 ; YES 0x018703|$06:$86F3:D0 04 BNE $86F9 ; call to code in a different bank ($0F:$FA2E) 0x018705|$06:$86F5:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018708|$06:$86F8:98 ; String ID #$0198: ‘As the Lottery wheels spin, push thy controller button to stop them[.’][wait][line]‘Three [sun] marks win the first prize--a Golden Card[.’][wait][line]‘Three [star] marks win the second prize--the Wizard's Ring[.’][wait][line][FD][FD]‘There may be further prizes, too[.’][wait][end-FC] ; data -> code ; control flow target (from $86F3) 0x018709|$06:$86F9:20 44 87 JSR $8744 ; call to code in a different bank ($0F:$FA2E) 0x01870C|$06:$86FC:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01870F|$06:$86FF:99 ; String ID #$0199: ‘Let's play now!’[FD][FD][no voice][no voice][no voice][no voice][no voice][no voice][no voice][sun] [star] [moon][FD][FD][end-FC] ; data -> code 0x018710|$06:$8700:20 78 87 JSR $8778 0x018713|$06:$8703:C9 05 CMP #$05 0x018715|$06:$8705:D0 07 BNE $870E ; call to code in a different bank ($0F:$FA2E) 0x018717|$06:$8707:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01871A|$06:$870A:9C ; String ID #$019C: [wait]‘That was close.[line]As a consolation prize I'll give thee a lottery ticket[.’][wait][end-FC] ; data -> code 0x01871B|$06:$870B:4C CB 86 JMP $86CB ; finish lottery conversation ; control flow target (from $8705) 0x01871E|$06:$870E:85 8F STA $8F ; prize number 0x018720|$06:$8710:A9 00 LDA #$00 0x018722|$06:$8712:85 90 STA $90 0x018724|$06:$8714:A9 33 LDA #$33 ; Item ID #$33: Lottery Ticket 0x018726|$06:$8716:20 C3 8D JSR $8DC3 ; given a hero ID in $97 and an item ID in A, remove that item from hero's inventory if present and SEC, CLC otherwise 0x018729|$06:$8719:A5 8F LDA $8F 0x01872B|$06:$871B:C9 FF CMP #$FF 0x01872D|$06:$871D:D0 07 BNE $8726 ; call to code in a different bank ($0F:$FA2E) 0x01872F|$06:$871F:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018732|$06:$8722:9B ; String ID #$019B: [wait]‘Sorry, thou hast lost. Better luck next time[.’][wait][end-FC] ; data -> code 0x018733|$06:$8723:4C CB 86 JMP $86CB ; finish lottery conversation ; control flow target (from $871D) 0x018736|$06:$8726:A8 TAY 0x018737|$06:$8727:B9 3F 87 LDA $873F,Y ; Lottery prizes 0x01873A|$06:$872A:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs 0x01873C|$06:$872C:85 95 STA $95 ; ID for [item] and [spell] control codes 0x01873E|$06:$872E:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x018741|$06:$8731:E6 8F INC $8F 0x018743|$06:$8733:A9 06 LDA #$06 ; Music ID #$06: lottery win BGM ; call to code in a different bank ($0F:$C58D) 0x018745|$06:$8735:20 8D C5 JSR $C58D ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]), wait for it to finish, then play previous BGM ; call to code in a different bank ($0F:$FA2E) 0x018748|$06:$8738:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01874B|$06:$873B:9A ; String ID #$019A: [wait]‘Congratulations![line]Thou hast won prize number [number], the [item]!’[wait][end-FC] ; data -> code 0x01874C|$06:$873C:4C CB 86 JMP $86CB ; finish lottery conversation ; code -> data ; Lottery prizes ; indexed data load target (from $8727) 0x01874F|$06:$873F:32 ; Item ID #$32: Golden Card 0x018750|$06:$8740:3D ; Item ID #$3D: Wizard’s Ring 0x018751|$06:$8741:03 ; Item ID #$03: Wizard’s Wand 0x018752|$06:$8742:30 ; Item ID #$30: Dragon’s Bane 0x018753|$06:$8743:3C ; Item ID #$3C: Medical Herb ; data -> code ; control flow target (from $86F9) ; call to code in a different bank ($0F:$C3AB) 0x018754|$06:$8744:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x018757|$06:$8747:A5 32 LDA $32 ; RNG byte 0 0x018759|$06:$8749:4A LSR 0x01875A|$06:$874A:29 78 AND #$78 0x01875C|$06:$874C:85 DD STA $DD 0x01875E|$06:$874E:A2 00 LDX #$00 0x018760|$06:$8750:20 78 88 JSR $8878 0x018763|$06:$8753:A5 32 LDA $32 ; RNG byte 0 0x018765|$06:$8755:0A ASL 0x018766|$06:$8756:0A ASL 0x018767|$06:$8757:0A ASL 0x018768|$06:$8758:29 78 AND #$78 0x01876A|$06:$875A:85 DF STA $DF 0x01876C|$06:$875C:A2 08 LDX #$08 0x01876E|$06:$875E:20 78 88 JSR $8878 0x018771|$06:$8761:A5 33 LDA $33 ; RNG byte 1 0x018773|$06:$8763:29 78 AND #$78 0x018775|$06:$8765:85 E1 STA $E1 0x018777|$06:$8767:A2 10 LDX #$10 0x018779|$06:$8769:20 78 88 JSR $8878 0x01877C|$06:$876C:A9 00 LDA #$00 0x01877E|$06:$876E:85 DE STA $DE 0x018780|$06:$8770:85 E0 STA $E0 0x018782|$06:$8772:85 E2 STA $E2 0x018784|$06:$8774:20 5B 89 JSR $895B 0x018787|$06:$8777:60 RTS ; control flow target (from $8700) 0x018788|$06:$8778:A9 00 LDA #$00 0x01878A|$06:$877A:85 DC STA $DC 0x01878C|$06:$877C:A5 2F LDA $2F ; joypad 1 data 0x01878E|$06:$877E:29 01 AND #$01 0x018790|$06:$8780:85 DA STA $DA ; control flow target (from $87D5) 0x018792|$06:$8782:A5 DC LDA $DC 0x018794|$06:$8784:29 07 AND #$07 0x018796|$06:$8786:C9 07 CMP #$07 0x018798|$06:$8788:F0 1D BEQ $87A7 ; control flow target (from $8799) 0x01879A|$06:$878A:20 1F 89 JSR $891F 0x01879D|$06:$878D:45 DC EOR $DC 0x01879F|$06:$878F:4A LSR 0x0187A0|$06:$8790:90 02 BCC $8794 0x0187A2|$06:$8792:E6 DC INC $DC ; control flow target (from $8790) 0x0187A4|$06:$8794:A5 DC LDA $DC 0x0187A6|$06:$8796:4A LSR 0x0187A7|$06:$8797:29 03 AND #$03 0x0187A9|$06:$8799:F0 EF BEQ $878A 0x0187AB|$06:$879B:90 0A BCC $87A7 0x0187AD|$06:$879D:0A ASL 0x0187AE|$06:$879E:AA TAX 0x0187AF|$06:$879F:CA DEX 0x0187B0|$06:$87A0:CA DEX 0x0187B1|$06:$87A1:B5 DE LDA $DE,X 0x0187B3|$06:$87A3:09 40 ORA #$40 0x0187B5|$06:$87A5:95 DE STA $DE,X ; control flow target (from $8788, $879B) 0x0187B7|$06:$87A7:A2 00 LDX #$00 ; control flow target (from $87C9) 0x0187B9|$06:$87A9:86 D5 STX $D5 0x0187BB|$06:$87AB:8A TXA 0x0187BC|$06:$87AC:0A ASL 0x0187BD|$06:$87AD:0A ASL 0x0187BE|$06:$87AE:85 D6 STA $D6 0x0187C0|$06:$87B0:B5 DD LDA $DD,X 0x0187C2|$06:$87B2:85 D7 STA $D7 0x0187C4|$06:$87B4:B5 DE LDA $DE,X 0x0187C6|$06:$87B6:85 D8 STA $D8 0x0187C8|$06:$87B8:20 1A 88 JSR $881A 0x0187CB|$06:$87BB:A6 D5 LDX $D5 0x0187CD|$06:$87BD:A5 D7 LDA $D7 0x0187CF|$06:$87BF:95 DD STA $DD,X 0x0187D1|$06:$87C1:A5 D8 LDA $D8 0x0187D3|$06:$87C3:95 DE STA $DE,X 0x0187D5|$06:$87C5:E8 INX 0x0187D6|$06:$87C6:E8 INX 0x0187D7|$06:$87C7:E0 06 CPX #$06 0x0187D9|$06:$87C9:D0 DE BNE $87A9 0x0187DB|$06:$87CB:20 5B 89 JSR $895B 0x0187DE|$06:$87CE:A5 DE LDA $DE 0x0187E0|$06:$87D0:25 E0 AND $E0 0x0187E2|$06:$87D2:25 E2 AND $E2 0x0187E4|$06:$87D4:0A ASL 0x0187E5|$06:$87D5:90 AB BCC $8782 0x0187E7|$06:$87D7:A2 05 LDX #$05 0x0187E9|$06:$87D9:A9 00 LDA #$00 ; control flow target (from $87DF) 0x0187EB|$06:$87DB:9D 62 06 STA $0662,X ; Moonbrooke Level 0x0187EE|$06:$87DE:CA DEX 0x0187EF|$06:$87DF:D0 FA BNE $87DB 0x0187F1|$06:$87E1:A0 00 LDY #$00 ; control flow target (from $87FF) 0x0187F3|$06:$87E3:B6 DD LDX $DD,Y 0x0187F5|$06:$87E5:8A TXA 0x0187F6|$06:$87E6:4A LSR 0x0187F7|$06:$87E7:4A LSR 0x0187F8|$06:$87E8:4A LSR 0x0187F9|$06:$87E9:29 0F AND #$0F 0x0187FB|$06:$87EB:85 D5 STA $D5 0x0187FD|$06:$87ED:98 TYA 0x0187FE|$06:$87EE:0A ASL 0x0187FF|$06:$87EF:0A ASL 0x018800|$06:$87F0:0A ASL 0x018801|$06:$87F1:05 D5 ORA $D5 0x018803|$06:$87F3:AA TAX 0x018804|$06:$87F4:BD D5 88 LDA $88D5,X 0x018807|$06:$87F7:AA TAX 0x018808|$06:$87F8:FE 63 06 INC $0663,X ; monster ID, group 1 0x01880B|$06:$87FB:C8 INY 0x01880C|$06:$87FC:C8 INY 0x01880D|$06:$87FD:C0 06 CPY #$06 0x01880F|$06:$87FF:D0 E2 BNE $87E3 0x018811|$06:$8801:A2 00 LDX #$00 ; control flow target (from $8811) 0x018813|$06:$8803:BD 63 06 LDA $0663,X ; monster ID, group 1 0x018816|$06:$8806:C9 03 CMP #$03 0x018818|$06:$8808:F0 0B BEQ $8815 0x01881A|$06:$880A:C9 02 CMP #$02 0x01881C|$06:$880C:F0 09 BEQ $8817 0x01881E|$06:$880E:E8 INX 0x01881F|$06:$880F:E0 05 CPX #$05 0x018821|$06:$8811:D0 F0 BNE $8803 0x018823|$06:$8813:A2 FF LDX #$FF ; control flow target (from $8808) 0x018825|$06:$8815:8A TXA 0x018826|$06:$8816:60 RTS ; control flow target (from $880C) 0x018827|$06:$8817:A9 05 LDA #$05 0x018829|$06:$8819:60 RTS ; control flow target (from $87B8) 0x01882A|$06:$881A:A5 D8 LDA $D8 0x01882C|$06:$881C:30 51 BMI $886F 0x01882E|$06:$881E:29 07 AND #$07 0x018830|$06:$8820:D0 4B BNE $886D 0x018832|$06:$8822:E6 D7 INC $D7 0x018834|$06:$8824:20 7C 88 JSR $887C 0x018837|$06:$8827:A5 D7 LDA $D7 0x018839|$06:$8829:29 07 AND #$07 0x01883B|$06:$882B:D0 2C BNE $8859 0x01883D|$06:$882D:A9 85 LDA #$85 ; Music ID #$85: single beep SFX ; call to code in a different bank ($0F:$C561) 0x01883F|$06:$882F:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x018842|$06:$8832:A5 D8 LDA $D8 0x018844|$06:$8834:29 78 AND #$78 0x018846|$06:$8836:C9 40 CMP #$40 0x018848|$06:$8838:90 1F BCC $8859 0x01884A|$06:$883A:C9 78 CMP #$78 0x01884C|$06:$883C:B0 14 BCS $8852 0x01884E|$06:$883E:18 CLC 0x01884F|$06:$883F:69 08 ADC #$08 0x018851|$06:$8841:85 D8 STA $D8 0x018853|$06:$8843:29 20 AND #$20 0x018855|$06:$8845:F0 12 BEQ $8859 ; call to code in a different bank ($0F:$C3AB) 0x018857|$06:$8847:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x01885A|$06:$884A:A5 32 LDA $32 ; RNG byte 0 0x01885C|$06:$884C:45 D8 EOR $D8 0x01885E|$06:$884E:29 18 AND #$18 0x018860|$06:$8850:D0 07 BNE $8859 ; control flow target (from $883C) 0x018862|$06:$8852:A5 D8 LDA $D8 0x018864|$06:$8854:09 80 ORA #$80 0x018866|$06:$8856:85 D8 STA $D8 0x018868|$06:$8858:60 RTS ; control flow target (from $882B, $8838, $8845, $8850) 0x018869|$06:$8859:A5 D8 LDA $D8 0x01886B|$06:$885B:29 78 AND #$78 0x01886D|$06:$885D:85 D8 STA $D8 0x01886F|$06:$885F:4A LSR 0x018870|$06:$8860:4A LSR 0x018871|$06:$8861:4A LSR 0x018872|$06:$8862:29 07 AND #$07 0x018874|$06:$8864:AA TAX 0x018875|$06:$8865:BD 70 88 LDA $8870,X 0x018878|$06:$8868:05 D8 ORA $D8 0x01887A|$06:$886A:85 D8 STA $D8 0x01887C|$06:$886C:60 RTS ; control flow target (from $8820) 0x01887D|$06:$886D:C6 D8 DEC $D8 ; control flow target (from $881C) 0x01887F|$06:$886F:60 RTS ; code -> data ; indexed data load target (from $8865) 0x018880|$06:$8870:00 0x018881|$06:$8871:01 0x018882|$06:$8872:01 0x018883|$06:$8873:02 0x018884|$06:$8874:02 0x018885|$06:$8875:03 0x018886|$06:$8876:04 0x018887|$06:$8877:07 ; data -> code ; control flow target (from $8750, $875E, $8769) 0x018888|$06:$8878:86 D6 STX $D6 0x01888A|$06:$887A:85 D7 STA $D7 ; control flow target (from $8824) 0x01888C|$06:$887C:A5 D6 LDA $D6 0x01888E|$06:$887E:0A ASL 0x01888F|$06:$887F:85 D9 STA $D9 0x018891|$06:$8881:A5 D7 LDA $D7 0x018893|$06:$8883:4A LSR 0x018894|$06:$8884:4A LSR 0x018895|$06:$8885:4A LSR 0x018896|$06:$8886:29 0F AND #$0F 0x018898|$06:$8888:05 D9 ORA $D9 0x01889A|$06:$888A:AA TAX 0x01889B|$06:$888B:A5 D7 LDA $D7 0x01889D|$06:$888D:29 07 AND #$07 0x01889F|$06:$888F:85 D9 STA $D9 0x0188A1|$06:$8891:BD D5 88 LDA $88D5,X 0x0188A4|$06:$8894:0A ASL 0x0188A5|$06:$8895:0A ASL 0x0188A6|$06:$8896:0A ASL 0x0188A7|$06:$8897:18 CLC 0x0188A8|$06:$8898:65 D9 ADC $D9 0x0188AA|$06:$889A:AA TAX 0x0188AB|$06:$889B:A4 D6 LDY $D6 ; control flow target (from $88A8) 0x0188AD|$06:$889D:BD A2 89 LDA $89A2,X 0x0188B0|$06:$88A0:99 63 06 STA $0663,Y ; monster ID, group 1 0x0188B3|$06:$88A3:C8 INY 0x0188B4|$06:$88A4:E8 INX 0x0188B5|$06:$88A5:8A TXA 0x0188B6|$06:$88A6:29 07 AND #$07 0x0188B8|$06:$88A8:D0 F3 BNE $889D 0x0188BA|$06:$88AA:A5 D9 LDA $D9 0x0188BC|$06:$88AC:F0 26 BEQ $88D4 0x0188BE|$06:$88AE:A5 D6 LDA $D6 0x0188C0|$06:$88B0:0A ASL 0x0188C1|$06:$88B1:85 D9 STA $D9 0x0188C3|$06:$88B3:A5 D7 LDA $D7 0x0188C5|$06:$88B5:4A LSR 0x0188C6|$06:$88B6:4A LSR 0x0188C7|$06:$88B7:4A LSR 0x0188C8|$06:$88B8:18 CLC 0x0188C9|$06:$88B9:69 01 ADC #$01 0x0188CB|$06:$88BB:29 0F AND #$0F 0x0188CD|$06:$88BD:05 D9 ORA $D9 0x0188CF|$06:$88BF:AA TAX 0x0188D0|$06:$88C0:BD D5 88 LDA $88D5,X 0x0188D3|$06:$88C3:0A ASL 0x0188D4|$06:$88C4:0A ASL 0x0188D5|$06:$88C5:0A ASL 0x0188D6|$06:$88C6:AA TAX ; control flow target (from $88D2) 0x0188D7|$06:$88C7:BD A2 89 LDA $89A2,X 0x0188DA|$06:$88CA:99 63 06 STA $0663,Y ; monster ID, group 1 0x0188DD|$06:$88CD:E8 INX 0x0188DE|$06:$88CE:C8 INY 0x0188DF|$06:$88CF:98 TYA 0x0188E0|$06:$88D0:29 07 AND #$07 0x0188E2|$06:$88D2:D0 F3 BNE $88C7 ; control flow target (from $88AC) 0x0188E4|$06:$88D4:60 RTS ; code -> data ; indexed data load target (from $87F4, $8891, $88C0) 0x0188E5|$06:$88D5:04 0x0188E6|$06:$88D6:03 0x0188E7|$06:$88D7:02 0x0188E8|$06:$88D8:04 0x0188E9|$06:$88D9:00 0x0188EA|$06:$88DA:04 0x0188EB|$06:$88DB:01 0x0188EC|$06:$88DC:04 0x0188ED|$06:$88DD:02 0x0188EE|$06:$88DE:03 0x0188EF|$06:$88DF:04 0x0188F0|$06:$88E0:01 0x0188F1|$06:$88E1:03 0x0188F2|$06:$88E2:04 0x0188F3|$06:$88E3:02 0x0188F4|$06:$88E4:03 0x0188F5|$06:$88E5:02 0x0188F6|$06:$88E6:04 0x0188F7|$06:$88E7:03 0x0188F8|$06:$88E8:01 0x0188F9|$06:$88E9:04 0x0188FA|$06:$88EA:00 0x0188FB|$06:$88EB:02 0x0188FC|$06:$88EC:04 0x0188FD|$06:$88ED:01 0x0188FE|$06:$88EE:03 0x0188FF|$06:$88EF:04 0x018900|$06:$88F0:03 0x018901|$06:$88F1:01 0x018902|$06:$88F2:04 0x018903|$06:$88F3:00 0x018904|$06:$88F4:04 0x018905|$06:$88F5:04 0x018906|$06:$88F6:00 0x018907|$06:$88F7:04 0x018908|$06:$88F8:02 0x018909|$06:$88F9:01 0x01890A|$06:$88FA:04 0x01890B|$06:$88FB:03 0x01890C|$06:$88FC:02 0x01890D|$06:$88FD:04 0x01890E|$06:$88FE:03 0x01890F|$06:$88FF:01 0x018910|$06:$8900:04 0x018911|$06:$8901:02 0x018912|$06:$8902:03 0x018913|$06:$8903:04 0x018914|$06:$8904:03 ; data -> code ; control flow target (from $86CF, $890A) ; call to code in a different bank ($0F:$C1DC) 0x018915|$06:$8905:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x018918|$06:$8908:A5 02 LDA $02 0x01891A|$06:$890A:D0 F9 BNE $8905 0x01891C|$06:$890C:A9 05 LDA #$05 0x01891E|$06:$890E:85 08 STA $08 0x018920|$06:$8910:AD 1D 89 LDA $891D 0x018923|$06:$8913:85 D7 STA $D7 0x018925|$06:$8915:AD 1E 89 LDA $891E 0x018928|$06:$8918:85 D8 STA $D8 0x01892A|$06:$891A:4C 73 89 JMP $8973 ; code -> data ; data load target (from $8910) 0x01892D|$06:$891D:A2 ; data load target (from $8915) 0x01892E|$06:$891E: 89 ; $06:$89A2 ; data -> code ; control flow target (from $878A) 0x01892F|$06:$891F:A2 20 LDX #$20 0x018931|$06:$8921:A5 DC LDA $DC 0x018933|$06:$8923:29 06 AND #$06 0x018935|$06:$8925:D0 07 BNE $892E 0x018937|$06:$8927:85 DB STA $DB ; call to code in a different bank ($0F:$C1DC) 0x018939|$06:$8929:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x01893C|$06:$892C:A2 08 LDX #$08 ; control flow target (from $8925) 0x01893E|$06:$892E:86 DB STX $DB ; call to code in a different bank ($0F:$C476) 0x018940|$06:$8930:20 76 C4 JSR $C476 ; read joypad 1 data into $2F 0x018943|$06:$8933:A5 2F LDA $2F ; joypad 1 data 0x018945|$06:$8935:45 DA EOR $DA 0x018947|$06:$8937:4A LSR 0x018948|$06:$8938:90 07 BCC $8941 0x01894A|$06:$893A:A5 2F LDA $2F ; joypad 1 data 0x01894C|$06:$893C:29 01 AND #$01 0x01894E|$06:$893E:85 DA STA $DA 0x018950|$06:$8940:60 RTS ; control flow target (from $8938) 0x018951|$06:$8941:A5 DC LDA $DC 0x018953|$06:$8943:18 CLC 0x018954|$06:$8944:69 08 ADC #$08 0x018956|$06:$8946:85 DC STA $DC 0x018958|$06:$8948:90 10 BCC $895A 0x01895A|$06:$894A:E6 DA INC $DA 0x01895C|$06:$894C:E6 DA INC $DA 0x01895E|$06:$894E:A5 DA LDA $DA 0x018960|$06:$8950:C5 DB CMP $DB 0x018962|$06:$8952:90 06 BCC $895A 0x018964|$06:$8954:49 01 EOR #$01 0x018966|$06:$8956:29 01 AND #$01 0x018968|$06:$8958:85 DA STA $DA ; control flow target (from $8948, $8952) 0x01896A|$06:$895A:60 RTS ; control flow target (from $8774, $87CB, $8962) 0x01896B|$06:$895B:A5 02 LDA $02 0x01896D|$06:$895D:F0 06 BEQ $8965 ; call to code in a different bank ($0F:$C1DC) 0x01896F|$06:$895F:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x018972|$06:$8962:4C 5B 89 JMP $895B ; control flow target (from $895D) 0x018975|$06:$8965:A9 05 LDA #$05 0x018977|$06:$8967:85 08 STA $08 0x018979|$06:$8969:AD 8C 89 LDA $898C 0x01897C|$06:$896C:85 D7 STA $D7 0x01897E|$06:$896E:AD 8D 89 LDA $898D 0x018981|$06:$8971:85 D8 STA $D8 ; control flow target (from $891A) 0x018983|$06:$8973:A9 A0 LDA #$A0 0x018985|$06:$8975:A0 00 LDY #$00 0x018987|$06:$8977:20 8E 89 JSR $898E 0x01898A|$06:$897A:A9 B0 LDA #$B0 0x01898C|$06:$897C:A0 08 LDY #$08 0x01898E|$06:$897E:20 8E 89 JSR $898E 0x018991|$06:$8981:A9 C0 LDA #$C0 0x018993|$06:$8983:A0 10 LDY #$10 0x018995|$06:$8985:20 8E 89 JSR $898E ; call to code in a different bank ($0F:$C1DC) 0x018998|$06:$8988:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x01899B|$06:$898B:60 RTS ; code -> data ; data load target (from $8969) 0x01899C|$06:$898C:63 ; data load target (from $896E) 0x01899D|$06:$898D: 06 ; $06:$0663; monster ID, group 1 ; data -> code ; control flow target (from $8977, $897E, $8985) 0x01899E|$06:$898E:85 07 STA $07 ; control flow target (from $899F) 0x0189A0|$06:$8990:84 D5 STY $D5 0x0189A2|$06:$8992:B1 D7 LDA ($D7),Y 0x0189A4|$06:$8994:85 09 STA $09 ; call to code in a different bank ($0F:$C1FA) 0x0189A6|$06:$8996: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 0x0189A9|$06:$8999:A4 D5 LDY $D5 0x0189AB|$06:$899B:C8 INY 0x0189AC|$06:$899C:98 TYA 0x0189AD|$06:$899D:29 07 AND #$07 0x0189AF|$06:$899F:D0 EF BNE $8990 0x0189B1|$06:$89A1:60 RTS ; code -> data ; indexed data load target (from $889D, $88C7) ; indirect data load target (via $891D) 0x0189B2|$06:$89A2:10 82 38 7C 7C 38 82 10 0x0189BA|$06:$89AA:10 10 FE 7C 38 7C 6C 82 0x0189C2|$06:$89B2:70 38 1C 1C 1C 1C 38 70 0x0189CA|$06:$89BA:10 10 38 7C FE FE FE 7C 0x0189D2|$06:$89C2:00 6C FE FE 7C 7C 38 10 ; data -> code ; COMMAND menu STATUS command handler ; indirect control flow target (via $808A) ; call to code in a different bank ($0F:$F537) 0x0189DA|$06:$89CA:20 37 F5 JSR $F537 ; display hero select STATUS menu if necessary 0x0189DD|$06:$89CD:C9 FF CMP #$FF 0x0189DF|$06:$89CF:D0 03 BNE $89D4 0x0189E1|$06:$89D1:4C 6D 80 JMP $806D ; exit COMMAND menu ; control flow target (from $89CF) 0x0189E4|$06:$89D4:85 97 STA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$F497) 0x0189E6|$06:$89D6:20 97 F4 JSR $F497 ; display Menu ID #$03: Main menu: selected hero's status 0x0189E9|$06:$89D9:20 9D 80 JSR $809D ; wait until all joypad buttons are released and then some button pressed ; call to code in a different bank ($0F:$F492) 0x0189EC|$06:$89DC:20 92 F4 JSR $F492 ; display Menu ID #$02: Main menu: gold/crests 0x0189EF|$06:$89DF:A5 97 LDA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$F63B) 0x0189F1|$06:$89E1:20 3B F6 JSR $F63B ; display Menu ID #$1C: Main menu: status screen equipped items 0x0189F4|$06:$89E4:C6 97 DEC $97 ; subject hero ID $97 0x0189F6|$06:$89E6:30 17 BMI $89FF ; Midenhall has no magic, so no need to show spell lists 0x0189F8|$06:$89E8:A6 97 LDX $97 ; subject hero ID $97 0x0189FA|$06:$89EA:BD 18 06 LDA $0618,X ; Cannock's learned battle spell list 0x0189FD|$06:$89ED:1D 1A 06 ORA $061A,X ; Cannock's learned field spell list 0x018A00|$06:$89F0:F0 0D BEQ $89FF ; if casters haven't learned any spell yet (which is impossible), no need to show spell lists 0x018A02|$06:$89F2:20 9D 80 JSR $809D ; wait until all joypad buttons are released and then some button pressed 0x018A05|$06:$89F5:A9 85 LDA #$85 ; Music ID #$85: single beep SFX ; call to code in a different bank ($0F:$C561) 0x018A07|$06:$89F7:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x018A0A|$06:$89FA:A5 97 LDA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$F64E) 0x018A0C|$06:$89FC:20 4E F6 JSR $F64E ; display spell lists ; control flow target (from $89E6, $89F0) 0x018A0F|$06:$89FF:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; COMMAND menu EQUIP handler ; indirect control flow target (via $8090) ; call to code in a different bank ($0F:$F56B) 0x018A12|$06:$8A02:20 6B F5 JSR $F56B ; display appropriate main EQUIP hero select menu 0x018A15|$06:$8A05:C9 FF CMP #$FF 0x018A17|$06:$8A07:D0 03 BNE $8A0C 0x018A19|$06:$8A09:4C 6D 80 JMP $806D ; exit COMMAND menu ; control flow target (from $8A07) 0x018A1C|$06:$8A0C:85 97 STA $97 ; subject hero ID $97 0x018A1E|$06:$8A0E:A9 00 LDA #$00 0x018A20|$06:$8A10:85 49 STA $49 ; object hero/target/item/string ID $49; EQUIP sub-type 0x018A22|$06:$8A12:85 A5 STA $A5 0x018A24|$06:$8A14:A9 00 LDA #$00 ; call to code in a different bank ($0F:$CF6A) 0x018A26|$06:$8A16:20 6A CF JSR $CF6A ; wipe selected menu region ; control flow target (from $8AEB) 0x018A29|$06:$8A19:A6 49 LDX $49 ; object hero/target/item/string ID $49 0x018A2B|$06:$8A1B:A5 97 LDA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$F5A3) 0x018A2D|$06:$8A1D:20 A3 F5 JSR $F5A3 ; 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 0x018A30|$06:$8A20:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs; new item to equip ; control flow target (from $8A35) 0x018A32|$06:$8A22:C9 FF CMP #$FF 0x018A34|$06:$8A24:D0 18 BNE $8A3E 0x018A36|$06:$8A26:C6 49 DEC $49 ; object hero/target/item/string ID $49 0x018A38|$06:$8A28:30 11 BMI $8A3B ; control flow target (from $8A39) 0x018A3A|$06:$8A2A:A6 49 LDX $49 ; object hero/target/item/string ID $49 0x018A3C|$06:$8A2C:A5 97 LDA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$F5A3) 0x018A3E|$06:$8A2E:20 A3 F5 JSR $F5A3 ; 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 0x018A41|$06:$8A31:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs; new item to equip 0x018A43|$06:$8A33:C9 FE CMP #$FE 0x018A45|$06:$8A35:D0 EB BNE $8A22 0x018A47|$06:$8A37:C6 49 DEC $49 ; object hero/target/item/string ID $49 0x018A49|$06:$8A39:10 EF BPL $8A2A ; control flow target (from $8A28) 0x018A4B|$06:$8A3B:4C FF 8A JMP $8AFF ; wait #$14 interrupts, update each hero's stats based on their current EXP, wipe menu and exit COMMAND menu ; control flow target (from $8A24) 0x018A4E|$06:$8A3E:C9 FE CMP #$FE 0x018A50|$06:$8A40:D0 20 BNE $8A62 0x018A52|$06:$8A42:4C E3 8A JMP $8AE3 ; control flow target (from $8A8C) 0x018A55|$06:$8A45:29 3F AND #$3F ; strip off the equipped bit 0x018A57|$06:$8A47:85 95 STA $95 ; ID for [item] and [spell] control codes ; call to code in a different bank ($0F:$F6F0) 0x018A59|$06:$8A49:20 F0 F6 JSR $F6F0 ; open main dialogue window and display string ID specified by byte following JSR + #$0100 ; code -> data ; indirect data load target 0x018A5C|$06:$8A4C:12 ; String ID #$0112: It cannot be removed due to the curse.[end-FC] ; data -> code ; control flow target (from $8AE0) 0x018A5D|$06:$8A4D:A9 0A LDA #$0A ; Music ID #$0A: cursed BGM ; call to code in a different bank ($0F:$C58D) 0x018A5F|$06:$8A4F:20 8D C5 JSR $C58D ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]), wait for it to finish, then play previous BGM 0x018A62|$06:$8A52:4C 5A 8A JMP $8A5A ; control flow target (from $8ABC) 0x018A65|$06:$8A55:A2 50 LDX #$50 ; call to code in a different bank ($0F:$C1EE) 0x018A67|$06:$8A57:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF ; control flow target (from $8A52) 0x018A6A|$06:$8A5A:A9 05 LDA #$05 ; call to code in a different bank ($0F:$CF6A) 0x018A6C|$06:$8A5C:20 6A CF JSR $CF6A ; wipe selected menu region 0x018A6F|$06:$8A5F:4C E3 8A JMP $8AE3 ; control flow target (from $8A40) 0x018A72|$06:$8A62:E6 A5 INC $A5 0x018A74|$06:$8A64:86 12 STX $12 0x018A76|$06:$8A66:A6 49 LDX $49 ; object hero/target/item/string ID $49 0x018A78|$06:$8A68:BD 57 F7 LDA $F757,X ; table of first item IDs for each item type 0x018A7B|$06:$8A6B:85 0E STA $0E ; lowest item ID of current item type 0x018A7D|$06:$8A6D:BD 58 F7 LDA $F758,X 0x018A80|$06:$8A70:85 0F STA $0F ; lowest item ID of next item type 0x018A82|$06:$8A72:20 1D 8B JSR $8B1D ; set A to hero ID in $97 * 8 0x018A85|$06:$8A75:A8 TAY 0x018A86|$06:$8A76:A9 08 LDA #$08 ; 8 inventory slots per hero 0x018A88|$06:$8A78:85 0C STA $0C ; number of invetory slots left to check ; control flow target (from $8A94) 0x018A8A|$06:$8A7A:B9 00 06 LDA $0600,Y ; Midenhall inventory item 1 (| #$40 if equipped) 0x018A8D|$06:$8A7D:F0 12 BEQ $8A91 0x018A8F|$06:$8A7F:29 3F AND #$3F ; strip off the equipped bit 0x018A91|$06:$8A81:C5 0E CMP $0E ; lowest item ID of current item type 0x018A93|$06:$8A83:90 0C BCC $8A91 0x018A95|$06:$8A85:C5 0F CMP $0F ; lowest item ID of next item type 0x018A97|$06:$8A87:B0 08 BCS $8A91 0x018A99|$06:$8A89:20 23 8B JSR $8B23 ; given party inventory index in Y, CLC and return equipped item ID in A if corresponding item is equipped and cursed, SEC and return unequipped item ID in A otherwise 0x018A9C|$06:$8A8C:90 B7 BCC $8A45 0x018A9E|$06:$8A8E:99 00 06 STA $0600,Y ; Midenhall inventory item 1 (| #$40 if equipped); note that this unequips the item! ; control flow target (from $8A7D, $8A83, $8A87) 0x018AA1|$06:$8A91:C8 INY 0x018AA2|$06:$8A92:C6 0C DEC $0C ; number of invetory slots left to check 0x018AA4|$06:$8A94:D0 E4 BNE $8A7A 0x018AA6|$06:$8A96:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x018AA8|$06:$8A98:F0 49 BEQ $8AE3 0x018AAA|$06:$8A9A:C9 FF CMP #$FF 0x018AAC|$06:$8A9C:F0 45 BEQ $8AE3 0x018AAE|$06:$8A9E:A6 12 LDX $12 0x018AB0|$06:$8AA0:20 0F 8B JSR $8B0F ; given hero ID in $97 and hero inventory index in X, return corresponding item ID in A and party inventory index in X 0x018AB3|$06:$8AA3:29 3F AND #$3F ; strip off the equipped bit 0x018AB5|$06:$8AA5:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs 0x018AB7|$06:$8AA7:85 95 STA $95 ; ID for [item] and [spell] control codes 0x018AB9|$06:$8AA9:20 A3 A3 JSR $A3A3 ; given item ID in $96 and hero ID in $97, set A to #$80 if hero can equip item, #$00 otherwise 0x018ABC|$06:$8AAC:C9 00 CMP #$00 0x018ABE|$06:$8AAE:D0 0F BNE $8ABF 0x018AC0|$06:$8AB0:20 CB 9A JSR $9ACB ; open dialogue window 0x018AC3|$06:$8AB3:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x018AC6|$06:$8AB6:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018AC9|$06:$8AB9:92 ; String ID #$0192: [name] cannot be equipped with the [item].[end-FC] ; data -> code 0x018ACA|$06:$8ABA:C6 49 DEC $49 ; object hero/target/item/string ID $49 0x018ACC|$06:$8ABC:4C 55 8A JMP $8A55 ; control flow target (from $8AAE) 0x018ACF|$06:$8ABF:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs ; equip item 0x018AD1|$06:$8AC1:09 40 ORA #$40 0x018AD3|$06:$8AC3:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x018AD6|$06:$8AC6:A0 04 LDY #$04 ; there are 4 cursed item in the game ; control flow target (from $8ACE) 0x018AD8|$06:$8AC8:D9 1B 86 CMP $861B,Y ; list of cursed items (equipped), built in offset from $861C 0x018ADB|$06:$8ACB:F0 05 BEQ $8AD2 0x018ADD|$06:$8ACD:88 DEY 0x018ADE|$06:$8ACE:D0 F8 BNE $8AC8 0x018AE0|$06:$8AD0:F0 11 BEQ $8AE3 ; control flow target (from $8ACB) 0x018AE2|$06:$8AD2:29 3F AND #$3F ; strip off the equipped bit 0x018AE4|$06:$8AD4:85 95 STA $95 ; ID for [item] and [spell] control codes 0x018AE6|$06:$8AD6:20 CB 9A JSR $9ACB ; open dialogue window 0x018AE9|$06:$8AD9:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x018AEC|$06:$8ADC:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018AEF|$06:$8ADF:11 ; String ID #$0111: [name], too, was cursed.[end-FC] ; data -> code 0x018AF0|$06:$8AE0:4C 4D 8A JMP $8A4D ; control flow target (from $8A42, $8A5F, $8A98, $8A9C, $8AD0) 0x018AF3|$06:$8AE3:E6 49 INC $49 ; object hero/target/item/string ID $49 0x018AF5|$06:$8AE5:A5 49 LDA $49 ; object hero/target/item/string ID $49 0x018AF7|$06:$8AE7:C9 04 CMP #$04 ; there are 4 EQUIP item types 0x018AF9|$06:$8AE9:F0 03 BEQ $8AEE 0x018AFB|$06:$8AEB:4C 19 8A JMP $8A19 ; control flow target (from $8AE9) 0x018AFE|$06:$8AEE:A5 A5 LDA $A5 0x018B00|$06:$8AF0:D0 0D BNE $8AFF ; wait #$14 interrupts, update each hero's stats based on their current EXP, wipe menu and exit COMMAND menu 0x018B02|$06:$8AF2:20 CB 9A JSR $9ACB ; open dialogue window 0x018B05|$06:$8AF5:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x018B08|$06:$8AF8:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018B0B|$06:$8AFB:A0 ; String ID #$01A0: [name] has nothing to equip.[end-FC] ; data -> code 0x018B0C|$06:$8AFC:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; wait #$14 interrupts, update each hero's stats based on their current EXP, wipe menu and exit COMMAND menu ; control flow target (from $8A3B, $8AF0) 0x018B0F|$06:$8AFF:A2 14 LDX #$14 ; call to code in a different bank ($0F:$C1EE) 0x018B11|$06:$8B01:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF ; call to code in a different bank ($0F:$D0EC) 0x018B14|$06:$8B04:20 EC D0 JSR $D0EC ; update each hero's stats based on their current EXP 0x018B17|$06:$8B07:A9 07 LDA #$07 ; call to code in a different bank ($0F:$CF6A) 0x018B19|$06:$8B09:20 6A CF JSR $CF6A ; wipe selected menu region 0x018B1C|$06:$8B0C:4C 6D 80 JMP $806D ; exit COMMAND menu ; given hero ID in $97 and hero inventory index in X, return corresponding item ID in A and party inventory index in X ; control flow target (from $8528, $8AA0, $989E, $98B9, $991D) 0x018B1F|$06:$8B0F:20 1D 8B JSR $8B1D ; set A to hero ID in $97 * 8 0x018B22|$06:$8B12:85 0C STA $0C 0x018B24|$06:$8B14:8A TXA 0x018B25|$06:$8B15:18 CLC 0x018B26|$06:$8B16:65 0C ADC $0C 0x018B28|$06:$8B18:AA TAX 0x018B29|$06:$8B19:BD 00 06 LDA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x018B2C|$06:$8B1C:60 RTS ; set A to hero ID in $97 * 8 ; control flow target (from $8A72, $8B0F) 0x018B2D|$06:$8B1D:A5 97 LDA $97 ; subject hero ID $97 0x018B2F|$06:$8B1F:0A ASL 0x018B30|$06:$8B20:0A ASL 0x018B31|$06:$8B21:0A ASL 0x018B32|$06:$8B22:60 RTS ; given party inventory index in Y, CLC and return equipped item ID in A if corresponding item is equipped and cursed, SEC and return unequipped item ID in A otherwise ; control flow target (from $852D, $8A89) 0x018B33|$06:$8B23:B9 00 06 LDA $0600,Y ; Midenhall inventory item 1 (| #$40 if equipped) 0x018B36|$06:$8B26:A2 03 LDX #$03 ; max index of list of cursed items in the game ; control flow target (from $8B2E) 0x018B38|$06:$8B28:DD 1C 86 CMP $861C,X ; list of equipped cursed items 0x018B3B|$06:$8B2B:F0 07 BEQ $8B34 0x018B3D|$06:$8B2D:CA DEX 0x018B3E|$06:$8B2E:10 F8 BPL $8B28 0x018B40|$06:$8B30:29 3F AND #$3F 0x018B42|$06:$8B32:38 SEC 0x018B43|$06:$8B33:60 RTS ; control flow target (from $8B2B) 0x018B44|$06:$8B34:18 CLC 0x018B45|$06:$8B35:60 RTS ; COMMAND menu SPELL command handler ; indirect control flow target (via $8088) ; call to code in a different bank ($0F:$F545) 0x018B46|$06:$8B36:20 45 F5 JSR $F545 ; depending on number of casters in party, maybe open caster select menu 0x018B49|$06:$8B39:C9 FF CMP #$FF 0x018B4B|$06:$8B3B:D0 03 BNE $8B40 ; did not cancel menu ; exit COMMAND menu ; control flow target (from $8B73) 0x018B4D|$06:$8B3D:4C 6D 80 JMP $806D ; exit COMMAND menu ; did not cancel menu ; control flow target (from $8B3B) 0x018B50|$06:$8B40:85 97 STA $97 ; subject hero ID $97; caster hero ID 0x018B52|$06:$8B42:C9 FE CMP #$FE 0x018B54|$06:$8B44:D0 0F BNE $8B55 ; hero is a caster 0x018B56|$06:$8B46:20 CB 9A JSR $9ACB ; open dialogue window 0x018B59|$06:$8B49:A9 00 LDA #$00 ; Midenhall ; call to code in a different bank ($0F:$FC50) 0x018B5B|$06:$8B4B:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x018B5E|$06:$8B4E:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018B61|$06:$8B51:01 ; String ID #$0101: [name] cannot use the spell.[end-FC] ; data -> code 0x018B62|$06:$8B52:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; hero is a caster ; control flow target (from $8B44) 0x018B65|$06:$8B55:A9 80 LDA #$80 ; Alive 0x018B67|$06:$8B57:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x018B6A|$06:$8B5A:B0 0D BCS $8B69 ; caster is alive 0x018B6C|$06:$8B5C:20 CB 9A JSR $9ACB ; open dialogue window 0x018B6F|$06:$8B5F:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x018B72|$06:$8B62:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018B75|$06:$8B65:02 ; String ID #$0102: Alas, poor [name] is dead.[end-FC] ; data -> code 0x018B76|$06:$8B66:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; caster is alive ; control flow target (from $8B5A) 0x018B79|$06:$8B69:A5 97 LDA $97 ; subject hero ID $97; caster hero ID 0x018B7B|$06:$8B6B:38 SEC 0x018B7C|$06:$8B6C:E9 01 SBC #$01 ; Midenhall can't use magic and $0F:$F5EC wants hero ID - 1 ; call to code in a different bank ($0F:$F5EC) 0x018B7E|$06:$8B6E:20 EC F5 JSR $F5EC ; given hero ID - 1 in A, open hero's spell list and return selected spell ID in A 0x018B81|$06:$8B71:C9 FF CMP #$FF 0x018B83|$06:$8B73:F0 C8 BEQ $8B3D ; exit COMMAND menu 0x018B85|$06:$8B75:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs; selected spell ID 0x018B87|$06:$8B77:AA TAX 0x018B88|$06:$8B78:20 AA 8D JSR $8DAA ; given hero ID in $97, set Y to start of hero's data in $062D,Y, i.e. Y = $97 * #$12 0x018B8B|$06:$8B7B:B9 3D 06 LDA $063D,Y ; Midenhall Current MP 0x018B8E|$06:$8B7E:DD DD 8C CMP $8CDD,X ; MP costs (built in offset from real data at $8CE6) 0x018B91|$06:$8B81:B0 07 BCS $8B8A ; hero has enough MP to cast ; call to code in a different bank ($0F:$F6EA) 0x018B93|$06:$8B83:20 EA F6 JSR $F6EA ; open main dialogue window and display string ID specified by byte following JSR ; code -> data ; indirect data load target 0x018B96|$06:$8B86:11 ; String ID #$0011: Thy MP is low.[end-FC] ; data -> code 0x018B97|$06:$8B87:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; hero has enough MP to cast ; control flow target (from $8B81) 0x018B9A|$06:$8B8A:A0 04 LDY #$04 ; there are 5 single-target spells on the field 0x018B9C|$06:$8B8C:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; selected spell ID ; check if spell is a healing spell ; control flow target (from $8B94) 0x018B9E|$06:$8B8E:D9 E1 8C CMP $8CE1,Y ; single-target spell list, field 0x018BA1|$06:$8B91:F0 05 BEQ $8B98 ; chose a healing spell 0x018BA3|$06:$8B93:88 DEY 0x018BA4|$06:$8B94:10 F8 BPL $8B8E ; check if spell is a healing spell 0x018BA6|$06:$8B96:30 0C BMI $8BA4 ; cast spell ; chose a healing spell ; control flow target (from $8B91) ; call to code in a different bank ($0F:$F579) 0x018BA8|$06:$8B98:20 79 F5 JSR $F579 ; display appropriate main SPELL target menu 0x018BAB|$06:$8B9B:C9 FF CMP #$FF 0x018BAD|$06:$8B9D:D0 03 BNE $8BA2 ; update target hero ID 0x018BAF|$06:$8B9F:4C 6D 80 JMP $806D ; exit COMMAND menu ; update target hero ID ; control flow target (from $8B9D) 0x018BB2|$06:$8BA2:85 49 STA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells ; cast spell ; control flow target (from $8B96) 0x018BB4|$06:$8BA4:20 AA 8D JSR $8DAA ; given hero ID in $97, set Y to start of hero's data in $062D,Y, i.e. Y = $97 * #$12 0x018BB7|$06:$8BA7:A6 96 LDX $96 ; temp storage for item/spell/type/etc. IDs; selected spell ID 0x018BB9|$06:$8BA9:B9 3D 06 LDA $063D,Y ; Midenhall Current MP 0x018BBC|$06:$8BAC:38 SEC 0x018BBD|$06:$8BAD:FD DD 8C SBC $8CDD,X ; MP costs (built in offset from real data at $8CE6) 0x018BC0|$06:$8BB0:99 3D 06 STA $063D,Y ; Midenhall Current MP 0x018BC3|$06:$8BB3:20 CB 9A JSR $9ACB ; open dialogue window 0x018BC6|$06:$8BB6:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA 0x018BC9|$06:$8BB9:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; selected spell ID 0x018BCB|$06:$8BBB:85 95 STA $95 ; ID for [item] and [spell] control codes ; call to code in a different bank ($0F:$FA2A) 0x018BCD|$06:$8BBD:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x018BD0|$06:$8BC0:1A ; String ID #$001A: [name] chanted the spell of [spell].[end-FC] ; data -> code 0x018BD1|$06:$8BC1:A9 90 LDA #$90 ; Music ID #$90: casting SFX ; call to code in a different bank ($0F:$C561) 0x018BD3|$06:$8BC3:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) ; call to code in a different bank ($0F:$C515) 0x018BD6|$06:$8BC6:20 15 C5 JSR $C515 ; flash screen 10 times 0x018BD9|$06:$8BC9:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; selected spell ID 0x018BDB|$06:$8BCB:C9 09 CMP #$09 ; Spell ID #$09: Heal 0x018BDD|$06:$8BCD:D0 04 BNE $8BD3 ; spell ID is not #$09 0x018BDF|$06:$8BCF:A2 40 LDX #$40 ; power on field for Heal 0x018BE1|$06:$8BD1:D0 0E BNE $8BE1 ; spell ID is not #$09 ; control flow target (from $8BCD) 0x018BE3|$06:$8BD3:C9 0B CMP #$0B ; Spell ID #$0B: Healmore 0x018BE5|$06:$8BD5:D0 04 BNE $8BDB ; spell ID is not #$09 or #$0B 0x018BE7|$06:$8BD7:A2 64 LDX #$64 ; power on field for Healmore 0x018BE9|$06:$8BD9:D0 06 BNE $8BE1 ; spell ID is not #$09 or #$0B ; control flow target (from $8BD5) 0x018BEB|$06:$8BDB:C9 0D CMP #$0D ; Spell ID #$0D: Healall 0x018BED|$06:$8BDD:D0 24 BNE $8C03 ; spell ID is not #$09, #$0B, or #$0D 0x018BEF|$06:$8BDF:A2 FF LDX #$FF ; power on field for Healall ; control flow target (from $8BD1, $8BD9) 0x018BF1|$06:$8BE1:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells 0x018BF3|$06:$8BE3:20 AC 8D JSR $8DAC ; given hero ID in A, set Y to start of hero's data in $062D,Y, i.e. Y = A * #$12 0x018BF6|$06:$8BE6:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x018BF9|$06:$8BE9:10 51 BPL $8C3C ; spell ineffective; can't heal dead people :( 0x018BFB|$06:$8BEB:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells ; call to code in a different bank ($0F:$D146) 0x018BFD|$06:$8BED:20 46 D1 JSR $D146 ; heal hero ID in A by random amount based on healing power in X ; call to code in a different bank ($0F:$C22C) 0x018C00|$06:$8BF0:20 2C C2 JSR $C22C 0x018C03|$06:$8BF3:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells ; call to code in a different bank ($0F:$FC50) 0x018C05|$06:$8BF5:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2A) 0x018C08|$06:$8BF8:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x018C0B|$06:$8BFB:17 ; String ID #$0017: [name]'s wounds were healed.[end-FC] ; data -> code ; call to code in a different bank ($0F:$EB76) 0x018C0C|$06:$8BFC:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x018C0F|$06:$8BFF:01 ; Menu ID #$01: Mini status window, top, Midenhall only ; data -> code 0x018C10|$06:$8C00:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; spell ID is not #$09, #$0B, or #$0D ; control flow target (from $8BDD) 0x018C13|$06:$8C03:C9 10 CMP #$10 ; Spell ID #$10: Antidote 0x018C15|$06:$8C05:D0 29 BNE $8C30 ; spell ID is not #$09, #$0B, #$0D, or #$10 0x018C17|$06:$8C07:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells 0x018C19|$06:$8C09:20 AC 8D JSR $8DAC ; given hero ID in A, set Y to start of hero's data in $062D,Y, i.e. Y = A * #$12 0x018C1C|$06:$8C0C:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x018C1F|$06:$8C0F:29 20 AND #$20 ; pick out the poison bit from hero status byte 0x018C21|$06:$8C11:F0 29 BEQ $8C3C ; spell ineffective 0x018C23|$06:$8C13:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells ; call to code in a different bank ($0F:$FC50) 0x018C25|$06:$8C15:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2A) 0x018C28|$06:$8C18:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x018C2B|$06:$8C1B:43 ; String ID #$0043: The poison was drawn out of [name]'s wound.[end-FC] ; data -> code 0x018C2C|$06:$8C1C:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells 0x018C2E|$06:$8C1E:20 AC 8D JSR $8DAC ; given hero ID in A, set Y to start of hero's data in $062D,Y, i.e. Y = A * #$12 0x018C31|$06:$8C21:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x018C34|$06:$8C24:29 DF AND #$DF ; set poison bit to 0 0x018C36|$06:$8C26:99 2D 06 STA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) ; call to code in a different bank ($0F:$EB76) 0x018C39|$06:$8C29:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x018C3C|$06:$8C2C:01 ; Menu ID #$01: Mini status window, top ; data -> code ; control flow target (from $8C4B) 0x018C3D|$06:$8C2D:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; spell ID is not #$09, #$0B, #$0D, or #$10 ; control flow target (from $8C05) 0x018C40|$06:$8C30:C9 12 CMP #$12 ; Spell ID #$12: Outside 0x018C42|$06:$8C32:D0 0F BNE $8C43 ; spell ID is not #$09, #$0B, #$0D, #$10, or #$12 0x018C44|$06:$8C34:20 D4 8C JSR $8CD4 ; handler for Outside spell effect 0x018C47|$06:$8C37:A9 00 LDA #$00 ; call to code in a different bank ($0F:$D88F) 0x018C49|$06:$8C39:4C 8F D8 JMP $D88F ; warp to warp point given by ($0C) ; spell ineffective ; control flow target (from $8BE9, $8C11, $8C56, $8CAB, $8CDE) ; call to code in a different bank ($0F:$FA2E) 0x018C4C|$06:$8C3C:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018C4F|$06:$8C3F:9E ; String ID #$019E: But nothing happened.[end-FC] ; data -> code 0x018C50|$06:$8C40:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; spell ID is not #$09, #$0B, #$0D, #$10, or #$12 ; control flow target (from $8C32) 0x018C53|$06:$8C43:C9 13 CMP #$13 ; Spell ID #$13: Repel 0x018C55|$06:$8C45:D0 06 BNE $8C4D ; spell ID is not #$09, #$0B, #$0D, #$10, or #$12-#$13 0x018C57|$06:$8C47:A9 FE LDA #$FE 0x018C59|$06:$8C49:85 46 STA $46 ; Repel (#$FE) / Fairy Water (#$FF) flag 0x018C5B|$06:$8C4B:D0 E0 BNE $8C2D ; spell ID is not #$09, #$0B, #$0D, #$10, or #$12-#$13 ; control flow target (from $8C45) 0x018C5D|$06:$8C4D:C9 14 CMP #$14 ; Spell ID #$14: Return 0x018C5F|$06:$8C4F:D0 11 BNE $8C62 ; spell ID is not #$09, #$0B, #$0D, #$10, or #$12-#$14 ; handler for Return spell effect ; control flow target (from $9661) 0x018C61|$06:$8C51:A2 02 LDX #$02 ; call to code in a different bank ($0F:$D2E7) 0x018C63|$06:$8C53: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 0x018C66|$06:$8C56:B0 E4 BCS $8C3C ; spell ineffective 0x018C68|$06:$8C58:A9 95 LDA #$95 ; Music ID #$95: Return SFX ; call to code in a different bank ($0F:$C561) 0x018C6A|$06:$8C5A:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x018C6D|$06:$8C5D:A9 00 LDA #$00 ; call to code in a different bank ($0F:$D88F) 0x018C6F|$06:$8C5F:4C 8F D8 JMP $D88F ; warp to warp point given by ($0C) ; spell ID is not #$09, #$0B, #$0D, #$10, or #$12-#$14 ; control flow target (from $8C4F) 0x018C72|$06:$8C62:C9 15 CMP #$15 ; Spell ID #$15: Open 0x018C74|$06:$8C64:D0 2E BNE $8C94 ; spell ID is not #$09, #$0B, #$0D, #$10, or #$12-#$15 0x018C76|$06:$8C66:A9 00 LDA #$00 0x018C78|$06:$8C68:85 C9 STA $C9 ; call to code in a different bank ($0F:$CF7C) 0x018C7A|$06:$8C6A:20 7C CF JSR $CF7C 0x018C7D|$06:$8C6D:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells 0x018C7F|$06:$8C6F:C9 FF CMP #$FF 0x018C81|$06:$8C71:F0 1E BEQ $8C91 0x018C83|$06:$8C73:A9 01 LDA #$01 0x018C85|$06:$8C75:85 C9 STA $C9 ; call to code in a different bank ($0F:$CF7C) 0x018C87|$06:$8C77:20 7C CF JSR $CF7C 0x018C8A|$06:$8C7A:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells 0x018C8C|$06:$8C7C:C9 FF CMP #$FF 0x018C8E|$06:$8C7E:F0 11 BEQ $8C91 0x018C90|$06:$8C80:A9 02 LDA #$02 0x018C92|$06:$8C82:85 C9 STA $C9 ; call to code in a different bank ($0F:$CF7C) 0x018C94|$06:$8C84:20 7C CF JSR $CF7C 0x018C97|$06:$8C87:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells 0x018C99|$06:$8C89:C9 FF CMP #$FF 0x018C9B|$06:$8C8B:F0 04 BEQ $8C91 ; call to code in a different bank ($0F:$FA2E) 0x018C9D|$06:$8C8D:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x018CA0|$06:$8C90:3B ; String ID #$013B: There is no door here.[end-FC] ; data -> code ; control flow target (from $8C71, $8C7E, $8C8B) 0x018CA1|$06:$8C91:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; spell ID is not #$09, #$0B, #$0D, #$10, or #$12-#$15 ; control flow target (from $8C64) 0x018CA4|$06:$8C94:C9 16 CMP #$16 ; Spell ID #$16: Stepguard 0x018CA6|$06:$8C96:D0 07 BNE $8C9F ; spell ID is not #$09, #$0B, #$0D, #$10, or #$12-#$16; ergo it's Spell ID #$17: Revive 0x018CA8|$06:$8C98:A9 FF LDA #$FF 0x018CAA|$06:$8C9A:85 47 STA $47 ; Stepguard flag 0x018CAC|$06:$8C9C:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; spell ID is not #$09, #$0B, #$0D, #$10, or #$12-#$16; ergo it's Spell ID #$17: Revive ; control flow target (from $8C96, $964B) 0x018CAF|$06:$8C9F:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells 0x018CB1|$06:$8CA1:20 AC 8D JSR $8DAC ; given hero ID in A, set Y to start of hero's data in $062D,Y, i.e. Y = A * #$12 0x018CB4|$06:$8CA4:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x018CB7|$06:$8CA7:29 80 AND #$80 ; Alive 0x018CB9|$06:$8CA9:F0 03 BEQ $8CAE 0x018CBB|$06:$8CAB:4C 3C 8C JMP $8C3C ; spell ineffective ; control flow target (from $8CA9) 0x018CBE|$06:$8CAE:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells 0x018CC0|$06:$8CB0:85 97 STA $97 ; subject hero ID $97 0x018CC2|$06:$8CB2:20 AC 8D JSR $8DAC ; given hero ID in A, set Y to start of hero's data in $062D,Y, i.e. Y = A * #$12 0x018CC5|$06:$8CB5:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x018CC8|$06:$8CB8:09 80 ORA #$80 ; Alive 0x018CCA|$06:$8CBA:99 2D 06 STA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x018CCD|$06:$8CBD:A9 01 LDA #$01 ; revive with 1 HP 0x018CCF|$06:$8CBF:99 3B 06 STA $063B,Y ; Midenhall Current HP, low byte ; call to code in a different bank ($0F:$D302) 0x018CD2|$06:$8CC2:20 02 D3 JSR $D302 ; call to code in a different bank ($0F:$C22C) 0x018CD5|$06:$8CC5:20 2C C2 JSR $C22C 0x018CD8|$06:$8CC8:A5 49 LDA $49 ; object hero/target/item/string ID $49; target hero ID for single-target spells ; call to code in a different bank ($0F:$FC50) 0x018CDA|$06:$8CCA:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2A) 0x018CDD|$06:$8CCD:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x018CE0|$06:$8CD0:44 ; String ID #$0044: [name] returned to life.[end-FC] ; data -> code 0x018CE1|$06:$8CD1:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for Outside spell effect ; control flow target (from $8C34) ; external control flow target (from $0F:$D597, $0F:$D59D) 0x018CE4|$06:$8CD4:A2 01 LDX #$01 ; call to code in a different bank ($0F:$D2E7) 0x018CE6|$06:$8CD6: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 0x018CE9|$06:$8CD9:B0 01 BCS $8CDC 0x018CEB|$06:$8CDB:60 RTS ; control flow target (from $8CD9) 0x018CEC|$06:$8CDC:68 PLA ; MP costs (built in offset from real data at $8CE6) ; indexed data load target (from $8B7E, $8BAD) 0x018CED|$06:$8CDD:68 PLA 0x018CEE|$06:$8CDE:4C 3C 8C JMP $8C3C ; spell ineffective ; code -> data ; single-target spell list, field ; indexed data load target (from $8B8E) 0x018CF1|$06:$8CE1:09 ; Spell ID #$09: Heal 0x018CF2|$06:$8CE2:0B ; Spell ID #$0B: Healmore 0x018CF3|$06:$8CE3:0D ; Spell ID #$0D: Healall 0x018CF4|$06:$8CE4:10 ; Spell ID #$10: Antidote 0x018CF5|$06:$8CE5:17 ; Spell ID #$17: Revive ; MP Cost for Spells on Field (referenced as $8CDD,X) 0x018CF6|$06:$8CE6:03 ; Spell ID #$09: Heal 0x018CF7|$06:$8CE7:00 ; Spell ID #$0A: Increase 0x018CF8|$06:$8CE8:05 ; Spell ID #$0B: Healmore 0x018CF9|$06:$8CE9:00 ; Spell ID #$0C: Sacrifice 0x018CFA|$06:$8CEA:08 ; Spell ID #$0D: Healall 0x018CFB|$06:$8CEB:00 ; Spell ID #$0E: Explodet 0x018CFC|$06:$8CEC:00 ; Spell ID #$0F: Chance 0x018CFD|$06:$8CED:03 ; Spell ID #$10: Antidote 0x018CFE|$06:$8CEE:02 ; Spell ID #$11: Heal (not used by heroes) 0x018CFF|$06:$8CEF:06 ; Spell ID #$12: Outside 0x018D00|$06:$8CF0:02 ; Spell ID #$13: Repel 0x018D01|$06:$8CF1:06 ; Spell ID #$14: Return 0x018D02|$06:$8CF2:02 ; Spell ID #$15: Open 0x018D03|$06:$8CF3:04 ; Spell ID #$16: Stepguard 0x018D04|$06:$8CF4:0F ; Spell ID #$17: Revive ; data -> code ; add $8F-$90 to party gold, capped at $FFFF ; control flow target (from $8536, $9C58) 0x018D05|$06:$8CF5:A5 8F LDA $8F 0x018D07|$06:$8CF7:18 CLC 0x018D08|$06:$8CF8:6D 24 06 ADC $0624 ; party gold, low byte 0x018D0B|$06:$8CFB:8D 24 06 STA $0624 ; party gold, low byte 0x018D0E|$06:$8CFE:A5 90 LDA $90 0x018D10|$06:$8D00:6D 25 06 ADC $0625 ; party gold, high byte 0x018D13|$06:$8D03:8D 25 06 STA $0625 ; party gold, high byte 0x018D16|$06:$8D06:90 08 BCC $8D10 ; cap party gold at 65,535 0x018D18|$06:$8D08:A9 FF LDA #$FF 0x018D1A|$06:$8D0A:8D 24 06 STA $0624 ; party gold, low byte 0x018D1D|$06:$8D0D:8D 25 06 STA $0625 ; party gold, high byte ; control flow target (from $8D06) 0x018D20|$06:$8D10:60 RTS ; given item ID in $96 and discount amount in $8F-$90, set $8F-$90 to discounted item price ; control flow target (from $8355, $8462) 0x018D21|$06:$8D11:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x018D23|$06:$8D13:0A ASL ; item prices are 2 bytes each 0x018D24|$06:$8D14:A8 TAY 0x018D25|$06:$8D15:B9 FC 9F LDA $9FFC,Y ; Item Prices, low byte 0x018D28|$06:$8D18:38 SEC 0x018D29|$06:$8D19:E5 8F SBC $8F 0x018D2B|$06:$8D1B:85 8F STA $8F 0x018D2D|$06:$8D1D:B9 FD 9F LDA $9FFD,Y ; Item Prices, high byte 0x018D30|$06:$8D20:E5 90 SBC $90 0x018D32|$06:$8D22:85 90 STA $90 0x018D34|$06:$8D24:60 RTS ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; control flow target (from $8324, $833E, $8379, $83FC, $8438, $84AD, $8599, $85F0, $863E, $8691, $8AB3, $8AD9, $8AF5, $8B5F, $8BB6, $8F26, $904A, $9125, $9476, $959D, $95C0, $963A, $9652, $96D4, $9830, $99B7, $99E5, $99F2, $9A0D, $9A26, $9A31, $9A55, $9A5F, $9A6F, $9A7A, $9A9F, $9AAC, $9AF1, $9B1E, $9D2D, $9D3C) 0x018D35|$06:$8D25:A5 97 LDA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$FC50) 0x018D37|$06:$8D27:4C 50 FC JMP $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; set $8F-$90 to A-#$00 ; control flow target (from $9C75) 0x018D3A|$06:$8D2A:85 8F STA $8F 0x018D3C|$06:$8D2C:A9 00 LDA #$00 0x018D3E|$06:$8D2E:85 90 STA $90 0x018D40|$06:$8D30:60 RTS ; given gold amount in $8F-$90, decrease party gold by that amount and SEC if possible, CLC otherwise ; control flow target (from $823D, $8688, $8D7B, $9130) 0x018D41|$06:$8D31:AD 24 06 LDA $0624 ; party gold, low byte 0x018D44|$06:$8D34:38 SEC 0x018D45|$06:$8D35:E5 8F SBC $8F ; amount to subtract, low byte 0x018D47|$06:$8D37:85 0C STA $0C 0x018D49|$06:$8D39:AD 25 06 LDA $0625 ; party gold, high byte 0x018D4C|$06:$8D3C:E5 90 SBC $90 ; amount to subtract, high byte 0x018D4E|$06:$8D3E:85 0D STA $0D 0x018D50|$06:$8D40:90 0A BCC $8D4C ; C clear => not enough gold, so just RTS 0x018D52|$06:$8D42:A5 0C LDA $0C ; otherwise, C is set; update party gold with new total 0x018D54|$06:$8D44:8D 24 06 STA $0624 ; party gold, low byte 0x018D57|$06:$8D47:A5 0D LDA $0D 0x018D59|$06:$8D49:8D 25 06 STA $0625 ; party gold, high byte ; control flow target (from $8D40) 0x018D5C|$06:$8D4C:60 RTS ; given item ID in A, save it to $96 and set $8F-$90 to purchase price of item, accounting for possible Golden Card discount; decrease party gold by that amount and SEC if possible, CLC otherwise ; control flow target (from $82E5, $83E2) 0x018D5D|$06:$8D4D:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x018D5F|$06:$8D4F:0A ASL ; price list is 2 bytes wide 0x018D60|$06:$8D50:A8 TAY 0x018D61|$06:$8D51:B9 FC 9F LDA $9FFC,Y ; Item Prices, low byte 0x018D64|$06:$8D54:85 8F STA $8F 0x018D66|$06:$8D56:B9 FD 9F LDA $9FFD,Y ; Item Prices, high byte 0x018D69|$06:$8D59:85 90 STA $90 0x018D6B|$06:$8D5B:A9 32 LDA #$32 ; Item ID #$32: Golden Card 0x018D6D|$06:$8D5D: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 0x018D70|$06:$8D60:C9 FF CMP #$FF 0x018D72|$06:$8D62:F0 17 BEQ $8D7B ; branch if no Golden Card, otherwise extra string and altered price 0x018D74|$06:$8D64:46 90 LSR $90 ; 16-bit LSR 0x018D76|$06:$8D66:66 8F ROR $8F 0x018D78|$06:$8D68:46 90 LSR $90 ; 16-bit LSR 0x018D7A|$06:$8D6A:66 8F ROR $8F 0x018D7C|$06:$8D6C:B9 FC 9F LDA $9FFC,Y ; Item Prices, low byte 0x018D7F|$06:$8D6F:38 SEC 0x018D80|$06:$8D70:E5 8F SBC $8F 0x018D82|$06:$8D72:85 8F STA $8F 0x018D84|$06:$8D74:B9 FD 9F LDA $9FFD,Y ; Item Prices, high byte 0x018D87|$06:$8D77:E5 90 SBC $90 0x018D89|$06:$8D79:85 90 STA $90 ; 25% discount ; control flow target (from $8D62) 0x018D8B|$06:$8D7B:4C 31 8D JMP $8D31 ; given gold amount in $8F-$90, decrease party gold by that amount and SEC if possible, CLC otherwise ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots ; control flow target (from $836F, $83F7, $8433, $8479, $872E, $92A9, $9313, $9A07, $9C70, $9C8B, $A2D2, $A2D9, $A2E0) 0x018D8E|$06:$8D7E:A5 97 LDA $97 ; subject hero ID $97; hero ID 0x018D90|$06:$8D80:0A ASL ; 8 inventory slots per hero 0x018D91|$06:$8D81:0A ASL 0x018D92|$06:$8D82:0A ASL 0x018D93|$06:$8D83:A8 TAY 0x018D94|$06:$8D84:A2 00 LDX #$00 ; loop counter ; control flow target (from $8D8F) 0x018D96|$06:$8D86:B9 00 06 LDA $0600,Y ; Midenhall inventory item 1 (| #$40 if equipped) 0x018D99|$06:$8D89:F0 08 BEQ $8D93 ; if empty slot, go add item 0x018D9B|$06:$8D8B:C8 INY ; else, increment inventory index and loop counter 0x018D9C|$06:$8D8C:E8 INX 0x018D9D|$06:$8D8D:E0 08 CPX #$08 ; 8 inventory slots per hero 0x018D9F|$06:$8D8F:D0 F5 BNE $8D86 ; if more inventory slots to check, loop to check them 0x018DA1|$06:$8D91:18 CLC ; at this point, we know hero's inventory is already full, so flag failure for calling code 0x018DA2|$06:$8D92:60 RTS ; control flow target (from $8D89) 0x018DA3|$06:$8D93:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x018DA5|$06:$8D95:99 00 06 STA $0600,Y ; Midenhall inventory item 1 (| #$40 if equipped); add to hero's inventory 0x018DA8|$06:$8D98:38 SEC ; flag success for calling code 0x018DA9|$06:$8D99:60 RTS ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise ; control flow target (from $8339, $8594, $8639, $8B57, $9045, $9453, $946C, $9499, $94A3, $9595, $95EA, $9608, $99E0, $9A21, $9A36, $9A50, $9A9A, $9ADB, $9D25) 0x018DAA|$06:$8D9A:85 0C STA $0C 0x018DAC|$06:$8D9C:20 AA 8D JSR $8DAA ; given hero ID in $97, set Y to start of hero's data in $062D,Y, i.e. Y = $97 * #$12 0x018DAF|$06:$8D9F:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x018DB2|$06:$8DA2:25 0C AND $0C 0x018DB4|$06:$8DA4:F0 02 BEQ $8DA8 0x018DB6|$06:$8DA6:38 SEC 0x018DB7|$06:$8DA7:60 RTS ; control flow target (from $8DA4) 0x018DB8|$06:$8DA8:18 CLC 0x018DB9|$06:$8DA9:60 RTS ; given hero ID in $97, set Y to start of hero's data in $062D,Y, i.e. Y = $97 * #$12 ; control flow target (from $85B2, $8659, $86A6, $8B78, $8BA4, $8D9C) 0x018DBA|$06:$8DAA:A5 97 LDA $97 ; subject hero ID $97 ; given hero ID in A, set Y to start of hero's data in $062D,Y, i.e. Y = A * #$12 ; control flow target (from $8BE3, $8C09, $8C1E, $8CA1, $8CB2, $960F) 0x018DBC|$06:$8DAC:F0 0A BEQ $8DB8 ; if it's Midenhall, use + #$00 0x018DBE|$06:$8DAE:C9 01 CMP #$01 ; is it Cannock? 0x018DC0|$06:$8DB0:D0 04 BNE $8DB6 ; if no, keep checking 0x018DC2|$06:$8DB2:A9 12 LDA #$12 ; if yes, use + #$12 0x018DC4|$06:$8DB4:D0 02 BNE $8DB8 ; and skip over Moonbrooke ; control flow target (from $8DB0) 0x018DC6|$06:$8DB6:A9 24 LDA #$24 ; it's Moonbrooke, so use + #$24 ; control flow target (from $8DAC, $8DB4) 0x018DC8|$06:$8DB8:A8 TAY 0x018DC9|$06:$8DB9:60 RTS ; given a hero ID in $97 and an item ID in A, SEC if hero has that item, CLC otherwise ; control flow target (from $85E7, $9897, $98B2, $9916) 0x018DCA|$06:$8DBA:48 PHA 0x018DCB|$06:$8DBB:A5 97 LDA $97 ; subject hero ID $97 0x018DCD|$06:$8DBD:85 9C STA $9C 0x018DCF|$06:$8DBF:68 PLA ; call to code in a different bank ($0F:$C4B0) 0x018DD0|$06:$8DC0:4C B0 C4 JMP $C4B0 ; given a hero ID in $9C and an item ID in A, SEC if hero has that item, CLC otherwise ; given a hero ID in $97 and an item ID in A, remove that item from hero's inventory if present and SEC, CLC otherwise ; control flow target (from $8612, $8716) 0x018DD3|$06:$8DC3:48 PHA 0x018DD4|$06:$8DC4:A5 97 LDA $97 ; subject hero ID $97 0x018DD6|$06:$8DC6:85 9C STA $9C 0x018DD8|$06:$8DC8:68 PLA ; call to code in a different bank ($0F:$C4B6) 0x018DD9|$06:$8DC9:4C B6 C4 JMP $C4B6 ; 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 ; restore full HP to all living party members ; control flow target (from $825B, $951C) ; external control flow target (from $0F:$C789, $0F:$D289) 0x018DDC|$06:$8DCC:A0 00 LDY #$00 ; control flow target (from $8DE9) 0x018DDE|$06:$8DCE:B9 3B 06 LDA $063B,Y ; Midenhall Current HP, low byte 0x018DE1|$06:$8DD1:19 3C 06 ORA $063C,Y ; Midenhall Current HP, high byte 0x018DE4|$06:$8DD4:F0 0C BEQ $8DE2 ; branch if current HP is #$00 0x018DE6|$06:$8DD6:B9 30 06 LDA $0630,Y ; Midenhall Max HP low byte 0x018DE9|$06:$8DD9:99 3B 06 STA $063B,Y ; Midenhall Current HP, low byte 0x018DEC|$06:$8DDC:B9 31 06 LDA $0631,Y ; Midenhall Max HP high byte 0x018DEF|$06:$8DDF:99 3C 06 STA $063C,Y ; Midenhall Current HP, high byte ; control flow target (from $8DD4) 0x018DF2|$06:$8DE2:98 TYA 0x018DF3|$06:$8DE3:18 CLC 0x018DF4|$06:$8DE4:69 12 ADC #$12 ; hero data is #$12 bytes each 0x018DF6|$06:$8DE6:A8 TAY 0x018DF7|$06:$8DE7:C9 36 CMP #$36 ; and there are 3 heroes 0x018DF9|$06:$8DE9:D0 E3 BNE $8DCE ; if more heroes to heal, heal them 0x018DFB|$06:$8DEB:60 RTS ; restore full MP to all living party members ; control flow target (from $825E, $9175) ; external control flow target (from $0F:$C78C) 0x018DFC|$06:$8DEC:A0 00 LDY #$00 ; start with Midenhall ; control flow target (from $8E03) 0x018DFE|$06:$8DEE:B9 3B 06 LDA $063B,Y ; Midenhall Current HP, low byte 0x018E01|$06:$8DF1:19 3C 06 ORA $063C,Y ; Midenhall Current HP, high byte 0x018E04|$06:$8DF4:F0 06 BEQ $8DFC ; zero HP => dead, right? 0x018E06|$06:$8DF6:B9 32 06 LDA $0632,Y ; Midenhall Max MP 0x018E09|$06:$8DF9:99 3D 06 STA $063D,Y ; Midenhall Current MP ; control flow target (from $8DF4) 0x018E0C|$06:$8DFC:98 TYA 0x018E0D|$06:$8DFD:18 CLC 0x018E0E|$06:$8DFE:69 12 ADC #$12 ; hero data is #$12 bytes wide 0x018E10|$06:$8E00:A8 TAY 0x018E11|$06:$8E01:C9 36 CMP #$36 ; max of 3 heroes at #$12 each => stop at #$36 0x018E13|$06:$8E03:D0 E9 BNE $8DEE ; if more heroes to check, check them 0x018E15|$06:$8E05:60 RTS ; handler for dialogue IDs #$29-#$94 (open dialogue window and display string specified by A + #$1D7, i.e. String IDs #$0200-#$026B) ; control flow target (from $81F0) 0x018E16|$06:$8E06:38 SEC 0x018E17|$06:$8E07:E9 29 SBC #$29 0x018E19|$06:$8E09:85 49 STA $49 ; object hero/target/item/string ID $49 0x018E1B|$06:$8E0B:48 PHA ; string ID 0x018E1C|$06:$8E0C:20 CB 9A JSR $9ACB ; open dialogue window 0x018E1F|$06:$8E0F:A9 00 LDA #$00 ; call to code in a different bank ($0F:$FC50) 0x018E21|$06:$8E11:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA 0x018E24|$06:$8E14:68 PLA ; string ID 0x018E25|$06:$8E15:C9 64 CMP #$64 ; either this or the above call to $FC50 are useless 0x018E27|$06:$8E17:90 17 BCC $8E30 0x018E29|$06:$8E19:48 PHA ; string ID 0x018E2A|$06:$8E1A:C9 6A CMP #$6A 0x018E2C|$06:$8E1C:B0 04 BCS $8E22 0x018E2E|$06:$8E1E:A9 00 LDA #$00 ; Midenhall 0x018E30|$06:$8E20:F0 0A BEQ $8E2C ; control flow target (from $8E1C) 0x018E32|$06:$8E22:C9 6A CMP #$6A ; string ID #026A uses Cannock's name 0x018E34|$06:$8E24:D0 04 BNE $8E2A ; string IDs > #026A uses Moonbrooke's name 0x018E36|$06:$8E26:A9 01 LDA #$01 ; Cannock 0x018E38|$06:$8E28:D0 02 BNE $8E2C ; control flow target (from $8E24) 0x018E3A|$06:$8E2A:A9 02 LDA #$02 ; Moonbrooke ; control flow target (from $8E20, $8E28) ; call to code in a different bank ($0F:$FC50) 0x018E3C|$06:$8E2C:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA 0x018E3F|$06:$8E2F:68 PLA ; String IDs #$0200-#$026B: "‘When in need, visit the Houses of Healing[.’][end-FC]" / "‘[name] is still inexperienced.[line]Return here in thy need[.’][end-FC]" / "‘One who sets foot upon the Travel Door is transported to a distant place[.’][end-FC]" / "‘The Dragon's Bane is a magic charm[.’][wait][line]‘It is said that it may keep one safe from the spell[.’][end-FC]" / "‘If thy path leads west of this castle thou shall reach the town of Leftwyne[.’][end-FC]" / "‘This is Midenhall Castle[.’][end-FC]" / "‘Remember to equip thyself with weapons and armor when thou obtains such items[.’][end-FC]" / "‘Woof, woof!’[end-FC]" / "‘[name], royalty should not venture into prisons such as this[.’][end-FC]" / "‘I have heard that the heir of our good King has ventured forth to do battle with the evil sorcerer, Hargon[.’][wait][line]‘What? Thou art the one? Luck be with thee[.’][end-FC]" / "‘If thou art poisoned, each step will weaken thee further[.’][end-FC]" / "‘Northward lies the castle of Cannock, my friend[.’][end-FC]" / "‘Welcome to Leftwyne[.’][end-FC]" / "‘Look for the monolith by the inland sea west of this place[.’][wait][line]‘It is by that route alone that thou shall reach Moonbrooke[.’][end-FC]" / "‘Oh, thou scared me! And my hiccups are cured! Thank thee, stranger[.’][end-FC]" / "‘Bow-wow!’[end-FC]" / "‘I have heard of a cave far to the east in which the Spring of Bravery rises[.’][end-FC]" / "‘Welcome to Cannock Castle[.’][end-FC]" / "‘Only if the descendants of Erdrick combine their skills can the forces of evil be overcome[.’][end-FC]" / "‘If thou would speak to the prisoners, do so through the barred doors[.’][end-FC]" / "‘Pssst.[line]I'll tell thee a secret[.’][wait][line]‘There is a silver key that opens doors of silver[.’][end-FC]" / "‘What does it matter if people steal things[.’][wait][line]‘The world is doomed no matter what happens[.’][end-FC]" / "‘I saw the sky burning red on the southern horizon[.’][wait][line]‘Perhaps it was Moonbrooke Castle in flames[.’][end-FC]" / "‘Listen closely[.’][wait][line]‘Our prince has studied the ways of magic, though with heavy armor or weapons he has no skill[.’][wait][line]‘Still, he seeks to fight evil[.’][end-FC]" / "‘There is a legend that tells of a great and good wizard who lives in a cave in the sea[.’][wait][line]‘If thou hast the five crests he will come to thee[.’][end-FC]" / "‘Here in Hamlin not all is as it seems[.’][wait][line]‘Talk to everyone, for appearances may not reflect the true person[.’][end-FC]" / "‘Southwest of this village lies the castle of Moonbrooke[.’][end-FC]" / "‘Some say that there is a tall tower, and in it a brave adventurer may find the Cloak of Wind[.’][wait][line]‘It can save thee if thou falls from a great height[.’][end-FC]" / "‘The Mirror of Ra was lost long ago in a swamp southeast of Hamlin in the place where four bridges can be seen[.’][end-FC]" / "‘Help! Help! Hargon is coming to destroy us all!’[end-FC]" / "‘Of keys and doors I know this[.’][wait][line]‘There are silver keys and golden keys, and doors to match them each[.’][wait][line]‘Seek thee first the silver key, for this is what I teach[.’][wait][line]‘That key is in the Cave of the Lake, west of Cannock's walls[.’][wait][line]‘But go only with a friend inside, or there thou shall surely fall[.’][end-FC]" / "‘Eastward, across an arm of the sea lies the kingdom of Alefgard[.’][wait][line]‘From there in ages past came a great warrior ‟a descendant of Erdrick” who slew dragons, and there came also a princess named Gwaelin[.’][end-FC]" / "‘Please, please, do not hurt me!’[wait][line]‘I can tell thee of a secret[.’][wait][line]‘In Hamlin Village there is a Water Crest. Seek it!’[end-FC]" / "‘It has been rumored that the king of Tantegel Castle has disappeared[.’][end-FC]" / "‘I am a soldier from Alefgard[.’][wait][line]‘Perhaps thou has seen ancient maps of my land, but it has changed much through the ages[.’][end-FC]" / "‘Thou art welcome in Lianport[.’][end-FC]" / "‘Yes, this is Tantegel[.’][end-FC]" / "‘The golden key opens the red door, too[.’][end-FC]" / "‘Pardon me, stranger, but I had a vision and in it descendants of the great hero Erdrick came to us in our need[.’][wait][line]‘Ah! So it was true.[line]Thou art truly welcome[.’][end-FC]" / "‘Thou hast come to Tantegel Castle[.’][end-FC]" / "‘Long ago Princess Gwaelin departed over the sea, but thy companion is her twin in appearance[.’][end-FC]" / "‘So thou has come even here to this simple room[.’][wait][line]‘I cannot help thee. My hope fled long ago[.’][end-FC]" / "‘The King keeps himself hidden, for he is afraid of Hargon's wrath[.’][end-FC]" / "‘The Echoing Flute blows a magical note[.’][wait][line]‘On an island, in a tower, in a chamber remote, play it and listen, a wise man once wrote[.’][wait][line]‘For when the sound echoes, there shall thou find, a crest of great power to aid thee in time[.’][end-FC]" / "‘So, thou art the great warriors of which we have heard[.’][end-FC]" / "‘Here in this coliseum many heroes have proven their strength[.’][end-FC]" / "‘Beyond lies the coliseum and the court of the King[.’][end-FC]" / "‘In the island town of Zahan in the southern ocean lives a man named Torval who owns the golden key[.’][end-FC]" / "‘As the story goes, it was a dark and stormy night when the pirate ship, Relentless, hit a reef and sank[.’][wait][line]‘They say that in its hold was the Echoing Flute[.’][end-FC]" / "‘I seek the Armor of Gaia[.’][wait][line]‘I was told that it was kept in a shop that sells armor[.’][end-FC]" / "Thou hast found the Stars Crest.[end-FC]" / "‘Do not overburden thyself. Cast away those items that thou doesn't need[.’][end-FC]" / "‘I have come seeking a thief by the name of Roge Fastfinger[.’][end-FC]" / "‘I warn thee to go back. This wizard's house may be thy ruin[.’][end-FC]" / "‘Thou hast come to Zahan at a poor time[.’][wait][line]‘All the men are away fishing at sea[.’][end-FC]" / "‘Many are the tales of a mountainous island in the sea and its great cavern[.’][wait][line]‘It is said that only one who bears the Moon Fragment may enter there[.’][end-FC]" / "‘One day I will be a great fisherman like Papa[.’][end-FC]" / "‘When the Moon Fragment is held upon high, the tide will rise and the seagulls cry[.’][end-FC]" / "‘Oh Formeo, Formeo, where for art thou my Formeo!’[end-FC]" / "‘Yes, I am Torval's wife. But just between us, he loves his dogs more than me[.’][end-FC]" / "‘That mutt yonder keeps pulling at my sleeve[.’][end-FC]" / "‘So thou hast heard of the sinking of the Relentless[.’][wait][line]‘Some say that the pirates simply left the plug out. Fools[.’][end-FC]" / "‘This is a town of lonely women, old men, dogs and children[.’][wait][line]‘What the men want of those stinking fish is beyond me[.’][end-FC]" / "‘Hello. This is the village of Tuhn[.’][end-FC]" / "‘Many years have passed since the Tower of the Moon could be reached by ship[.’][wait][line]‘It lies to the south[.’][end-FC]" / "‘Thou hast heard of Roge Fastfinger I see[.’][wait][line]‘Well, he stole the key to our watergate, the scoundrel.[line]We would dearly love to have it back[.’][end-FC]" / "‘If Jena sent thee, tell her I would not name our dog Ruffles for all the dragon's gold in Alefgard[.’][end-FC]" / "‘Ruff, ruff..[.’][end-FC]" / "‘It is said that the Tower of the Moon holds a piece of the moon[.’][end-FC]" / "‘I'm Jena. If thou meets my husband, tell him that my father's name was Ruffles[.’][end-FC]" / "‘Far and wide I have sought a master weaver who makes Water Flying Cloth, and they say such a man lives here[.’][end-FC]" / "‘If the watergate were to be raised, water would once more fill the dry riverbed[.’][end-FC]" / "‘Where has everyone gone?[line]Dost thou think it is my breath?’[end-FC]" / "‘Yip, yip, yip!’[end-FC]" / "‘Hargon dwells on the high plateau of Rhone[.’][wait][line]‘Only one who has the Eye of Malroth can find the road to that place[.’][end-FC]" / "‘It is true enough[.’][wait][line]‘I locked Roge Fastfinger in prison and threw away the key.[line]But he has escaped[.’][end-FC]" / "‘For the finest Water Flying Cloth I recommend Don Mahone who lives in Tuhn[.’][end-FC]" / "‘I bid thee welcome to Wellgarth Town[.’][wait][line]‘I shall sing for thee[.’][end-FC]" / "‘Let me tell thee, Hargon is a master of disguise, but if thou hast the Charm of Rubiss thou will see through the deception[.’][end-FC]" / "‘How dare thou enter a lady's room unbidden!’[end-FC]" / "‘It is said that the greatest shall fall by a spell of his own devising[.’][end-FC]" / "‘There is an isolated valley northwest of the town where once a road led to Rhone[.’][end-FC]" / "‘Some say that Hargon has cast a spell over his entire castle, that it looks fair and peaceful[.’][wait][line]‘Thou will not be deceived if thou hast the gift of Rubiss[.’][end-FC]" / "‘In the ocean far to the east lies an island and on it are trees from every corner of the world[.’][end-FC]" / "‘Having come this far, thou may as well try the door there to the left[.’][end-FC]" / "‘Roge Fastfinger? No, I have not heard the name[.’][end-FC]" / "‘We call this town Beran. Welcome[.’][end-FC]" / "‘Thou should see the King of Osterfair for the Moon Crest[.’][end-FC]" / "‘With the Magic Loom and Dew's Yarn thou can make the Water Flying Cloth[.’][end-FC]" / "‘The Leaf of the World Tree has the power to revive ghosts[.’][end-FC]" / "‘I seek the Thunder Sword, for one need not know magic to use its power[.’][end-FC]" / "‘Osterfair lies far south of Midenhall on a great island[.’][end-FC]" / "‘Welcome to Bragol's Tools. May I help thee?’[end-FC]" / "‘Greetings. I am the Keeper of this Inn[.’][end-FC]" / "‘Thou hast come to Midenhall[.’][end-FC]" / "‘[..][..][.’][end-FC]" / "‘[..][..][.’][end-FC]" / "‘Only the golden key can open this door[.’][end-FC]" / "‘This travel door takes one back to the underworld.[line]If that is thy wish, please enter[.’][end-FC]" / "‘The ancient road to Rhone was once west of this monolith[.’][end-FC]" / "‘In Cannock there is a young prince and Moonbrooke had a princess[.’][end-FC]" / "‘Although it makes me sad, thou must go forth and seek thy destiny[.’][end-FC]" / "‘Thief! Thief! What? Thou art [name], heir of Midenhall!’[wait][line]‘Please forgive me[.’][end-FC]" / "[end-FC]" / "‘Ghosts may wander this world under moon or sun and at times they may even be recalled[.’][end-FC]" / "‘If thy name is [name], I have a message for thee[.’][wait][line]‘Seek the Fire Monolith and thou shall find the Sun Crest[.’][end-FC]" / "‘That is the chamber of Prince [name]'s sister, Princess Halla[.’][end-FC]" / "‘After the sacking of Moonbrooke I escaped and made my way here, hoping others would follow[.’][end-FC]" ; control flow target (from $8E17) ; call to code in a different bank ($0F:$FA52) 0x018E40|$06:$8E30:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x018E43|$06:$8E33:A5 49 LDA $49 ; object hero/target/item/string ID $49 0x018E45|$06:$8E35:C9 6B CMP #$6B 0x018E47|$06:$8E37:D0 08 BNE $8E41 ; call to code in a different bank ($0F:$FA32) 0x018E49|$06:$8E39:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018E4C|$06:$8E3C:6C ; String ID #$026C: [end-FC] ; data -> code ; call to code in a different bank ($0F:$FA32) 0x018E4D|$06:$8E3D:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018E50|$06:$8E40:6D ; String ID #$026D: [end-FC] ; data -> code ; control flow target (from $8E37) 0x018E51|$06:$8E41:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue IDs #$95-#$9C (open dialogue window, display string specified by A + #$1D9, display YES/NO menu, and display string corresponding to selected option) ; control flow target (from $81F7) 0x018E54|$06:$8E44:38 SEC 0x018E55|$06:$8E45:E9 95 SBC #$95 ; why not just SBC #$27? 0x018E57|$06:$8E47:18 CLC 0x018E58|$06:$8E48:69 6E ADC #$6E ; String IDs #$026E-#$0275: "‘Dost thou think it was Hargon who attacked Moonbrooke and set it aflame?’[FD][FD][end-FC]" / "‘Dost thou have a lottery ticket?’[FD][FD][end-FC]" / "‘This is a sewing shop, true, but I do not have the Dew's Yarn[.’][line]Dost thou seek the Dew's Yarn, too?’[FD][FD][end-FC]" / "‘Hast thou heard of the sunken treasure?’[FD][FD][end-FC]" / "‘Tell me, did thou come to buy the Jailor's Key?’[FD][FD][end-FC]" / "‘Pardon me, good folk, but dost thou have the time?’[FD][FD][end-FC]" / "‘Hast thou found the Eye of Malroth?’[FD][FD][end-FC]" / "‘Hast thy travels taken thee to the monolith south of Midenhall?’[FD][FD][end-FC]" 0x018E5A|$06:$8E4A:85 49 STA $49 ; object hero/target/item/string ID $49 0x018E5C|$06:$8E4C:20 CB 9A JSR $9ACB ; open dialogue window 0x018E5F|$06:$8E4F:A5 49 LDA $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$FA52) 0x018E61|$06:$8E51:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x018E64|$06:$8E54:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x018E67|$06:$8E57:C9 00 CMP #$00 ; YES 0x018E69|$06:$8E59:D0 04 BNE $8E5F 0x018E6B|$06:$8E5B:A9 08 LDA #$08 ; String IDs #$0276-#$027D: "‘Yes, I think so, too[.’][end-FC]" / "‘The Lottery is but a game; do not take it too seriously[.’][end-FC]" / "‘Alas, I have no more of the Dew's Yarn, but I know where thou may seek some,[wait][line]for it is a substance made of wind and water and it drifts aloft until it lands on the third floor[line]in the North Tower of the Dragon's Horn[.’][end-FC]" / "‘The pirate ship sank in the wide seas of the north[.’][end-FC]" / "‘I heard that it is sold here, but perhaps that is a lie[.’][end-FC]" / "‘I thank thee very much indeed[.’][end-FC]" / "‘The Eye of Malroth sees much that is not readily apparent[.’][wait][line]‘Use it in the swamp of the hidden valley and perhaps thou will see a way to Rhone[.’][end-FC]" / "‘Please say nothing of this[.’][end-FC]" 0x018E6D|$06:$8E5D:D0 02 BNE $8E61 ; control flow target (from $8E59) 0x018E6F|$06:$8E5F:A9 10 LDA #$10 ; String IDs #$027E-#$0285: "‘But I cannot think of anyone else with such power[.’][end-FC]" / "‘Some merchants give out Lottery Tickets for free[.’][end-FC]" / "‘Stop again if thou art near[.’][end-FC]" / "‘Speak to the merchantman in Lianport[.’][end-FC]" / "‘Perhaps I should not say anything more[.’][end-FC]" / "‘Then may thy ears become cabbages and thy tongue a sausage[.’][wait][line]‘A little courtesy never killed anyone[.’][end-FC]" / "‘Once thou hast the Moon Fragment thou may enter the island cave where the Eye of Malroth is kept in darkness[.’][end-FC]" / "‘My brother must be there now. Will thou not go to him?’[end-FC]" ; control flow target (from $8E5D) 0x018E71|$06:$8E61:18 CLC 0x018E72|$06:$8E62:65 49 ADC $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$FA52) 0x018E74|$06:$8E64:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x018E77|$06:$8E67:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue IDs #$9D-#$C2 (town NPCs with complex logic) ; control flow target (from $81FE) 0x018E7A|$06:$8E6A:48 PHA ; dialogue ID 0x018E7B|$06:$8E6B:20 CB 9A JSR $9ACB ; open dialogue window 0x018E7E|$06:$8E6E:68 PLA ; dialogue ID 0x018E7F|$06:$8E6F:38 SEC 0x018E80|$06:$8E70:E9 9D SBC #$9D ; convert to zero-based 0x018E82|$06:$8E72:0A ASL ; 2 bytes per pointer 0x018E83|$06:$8E73:AA TAX 0x018E84|$06:$8E74:BD 81 8E LDA $8E81,X ; complex dialogue logic handlers 0x018E87|$06:$8E77:85 0C STA $0C 0x018E89|$06:$8E79:BD 82 8E LDA $8E82,X 0x018E8C|$06:$8E7C:85 0D STA $0D 0x018E8E|$06:$8E7E:6C 0C 00 JMP ($000C) ; code -> data ; complex dialogue logic handlers ; indexed data load target (from $8E74) 0x018E91|$06:$8E81:CD ; indexed data load target (from $8E79) 0x018E92|$06:$8E82: 8E ; $06:$8ECD; handler for dialogue ID #$9D: King in Map ID #$02: Midenhall 2F 0x018E93|$06:$8E83:6A 8F ; $06:$8F6A; handler for dialogue ID #$9E: Guard in Map ID #$02: Midenhall 2F 0x018E95|$06:$8E85:85 8F ; $06:$8F85; handler for dialogue ID #$9F: Wizard in Map ID #$02: Midenhall 2F 0x018E97|$06:$8E87:AC 8F ; $06:$8FAC; handler for dialogue ID #$A0: Brute in Map ID #$04: Midenhall B1 0x018E99|$06:$8E89:CC 8F ; $06:$8FCC; handler for dialogue ID #$A1: King in Map ID #$06: Cannock 0x018E9B|$06:$8E8B:19 90 ; $06:$9019; handler for dialogue ID #$A2: Princess Halla in Map ID #$06: Cannock 0x018E9D|$06:$8E8D:55 90 ; $06:$9055; handler for dialogue ID #$A3: Wizard in Map ID #$06: Cannock 0x018E9F|$06:$8E8F:65 90 ; $06:$9065; handler for dialogue ID #$A4-#$A5: Monsters in Map ID #$08: Hamlin Waterway 0x018EA1|$06:$8E91:65 90 ; $06:$9065; handler for dialogue ID #$A4-#$A5: Monsters in Map ID #$08: Hamlin Waterway 0x018EA3|$06:$8E93:77 90 ; $06:$9077; handler for dialogue ID #$A6: King Moonbrooke's Flame in Map ID #$09: Moonbrooke 0x018EA5|$06:$8E95:95 90 ; $06:$9095; handler for dialogue ID #$A7: Guard in Map ID #$0A: Moonbrooke B1 0x018EA7|$06:$8E97:A8 90 ; $06:$90A8; handler for dialogue ID #$A8: Wizard in Map ID #$0B: Lianport 0x018EA9|$06:$8E99:CC 90 ; $06:$90CC; handler for dialogue ID #$A9: Echoing Flute guy in NE in Map ID #$0B: Lianport 0x018EAB|$06:$8E9B:EF 90 ; $06:$90EF; handler for dialogue ID #$AA: Woman in Map ID #$0B: Lianport 0x018EAD|$06:$8E9D:02 91 ; $06:$9102; handler for dialogue ID #$AB: Brute in Map ID #$0B: Lianport 0x018EAF|$06:$8E9F:12 91 ; $06:$9112; handler for dialogue ID #$AC: Woman in SW corner of Map ID #$0B: Lianport 0x018EB1|$06:$8EA1:4D 91 ; $06:$914D; handler for dialogue ID #$AD: Wizard in Map ID #$0C: Tantegel 0x018EB3|$06:$8EA3:6E 91 ; $06:$916E; handler for dialogue ID #$AE: Wizard in Map ID #$0C: Tantegel 0x018EB5|$06:$8EA5:7B 91 ; $06:$917B; handler for dialogue ID #$AF: Priest in Map ID #$0C: Tantegel 0x018EB7|$06:$8EA7:97 91 ; $06:$9197; handler for dialogue ID #$B0: King in Map ID #$0F: Osterfair 0x018EB9|$06:$8EA9:13 92 ; $06:$9213; handler for dialogue ID #$B1: crazy fortuneteller Wizard in NW Map ID #$0F: Osterfair 0x018EBB|$06:$8EAB:8B 92 ; $06:$928B; handler for dialogue IDs #$B2-#$B3: Dog in Map ID #$0F: Osterfair 0x018EBD|$06:$8EAD:8B 92 ; $06:$928B; handler for dialogue IDs #$B2-#$B3: Dog in Map ID #$0F: Osterfair 0x018EBF|$06:$8EAF:92 92 ; $06:$9292; handler for dialogue ID #$B4: Dog in Map ID #$10: Zahan 0x018EC1|$06:$8EB1:99 92 ; $06:$9299; handler for dialogue ID #$B5: Don Mahone in Map ID #$11: Tuhn 0x018EC3|$06:$8EB3:FE 92 ; $06:$92FE; handler for dialogue ID #$B6: Roge Fastfinger in NE Map ID #$14: Wellgarth Underground 0x018EC5|$06:$8EB5:2C 93 ; $06:$932C; handler for dialogue IDs #$B7-#$B9: Priest in Map ID #$15: Beran 0x018EC7|$06:$8EB7:2C 93 ; $06:$932C; handler for dialogue IDs #$B7-#$B9: Priest in Map ID #$15: Beran 0x018EC9|$06:$8EB9:2C 93 ; $06:$932C; handler for dialogue IDs #$B7-#$B9: Priest in Map ID #$15: Beran 0x018ECB|$06:$8EBB:3E 93 ; $06:$933E; handler for dialogue ID #$BA: Monster in Map ID #$16: Hargon's Castle 1F 0x018ECD|$06:$8EBD:48 93 ; $06:$9348; handler for dialogue ID #$BB: Hargon in Map ID #$17: Hargon's Castle 7F 0x018ECF|$06:$8EBF:7F 93 ; $06:$937F; handler for dialogue ID #$BC: Dragonlord's Grandson in Map ID #$18: Charlock Castle B8 0x018ED1|$06:$8EC1:9B 93 ; $06:$939B; handler for dialogue ID #$BD: Guard in Map ID #$1A: Shrine SW of Cannock 0x018ED3|$06:$8EC3:9F 93 ; $06:$939F; handler for dialogue ID #$BE: Guard in Map ID #$1A: Shrine SW of Cannock 0x018ED5|$06:$8EC5:BE 93 ; $06:$93BE; handler for dialogue ID #$BF: Wizard in Map ID #$1C: Shrine SE of Rimuldar 0x018ED7|$06:$8EC7:E1 93 ; $06:$93E1; handler for dialogue ID #$C0: Wizard in Map ID #$15: Beran 0x018ED9|$06:$8EC9:00 94 ; $06:$9400; handler for dialogue ID #$C1: Priest in Map ID #$1F: Rhone Shrine 0x018EDB|$06:$8ECB:4D 94 ; $06:$944D; handler for dialogue ID #$C2: Priest in Map ID #$20: Shrine SW of Moonbrooke ; data -> code ; handler for dialogue ID #$9D: King in Map ID #$02: Midenhall 2F ; indirect control flow target (via $8E81) 0x018EDD|$06:$8ECD:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero 0x018EE0|$06:$8ED0:D0 3A BNE $8F0C ; different dialogue when talking to King Midenhall depending on whether Prince Midenhall is alive or not ; call to code in a different bank ($0F:$FC50) 0x018EE2|$06:$8ED2:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x018EE5|$06:$8ED5:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018EE8|$06:$8ED8:86 ; String ID #$0286: ‘Welcome back, [name][.’][wait][end-FC] ; data -> code 0x018EE9|$06:$8ED9:20 66 94 JSR $9466 ; display EXP to next level messages for entire party 0x018EEC|$06:$8EDC:A9 00 LDA #$00 ; Midenhall; pointless since none of these string use the [name] control code ; call to code in a different bank ($0F:$FC50) 0x018EEE|$06:$8EDE:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA 0x018EF1|$06:$8EE1: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) 0x018EF3|$06:$8EE3:C9 02 CMP #$02 0x018EF5|$06:$8EE5:F0 0D BEQ $8EF4 ; update Cannock quest status to 3 0x018EF7|$06:$8EE7:C9 03 CMP #$03 0x018EF9|$06:$8EE9:D0 0F BNE $8EFA 0x018EFB|$06:$8EEB:AD 3F 06 LDA $063F ; Cannock status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x018EFE|$06:$8EEE:29 04 AND #$04 ; pick out the In Party bit 0x018F00|$06:$8EF0:F0 04 BEQ $8EF6 ; message for when you're able to add Cannock, but haven't yet done so 0x018F02|$06:$8EF2:D0 06 BNE $8EFA ; control flow target (from $8EE5) 0x018F04|$06:$8EF4:E6 CA INC $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) ; control flow target (from $8EF0) ; call to code in a different bank ($0F:$FA32) 0x018F06|$06:$8EF6:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018F09|$06:$8EF9:89 ; String ID #$0289: ‘Well, thou hast missed him[.’][wait][line]‘The Prince of Cannock was here, but now he is off to Midenhall, looking for thee, I believe[.’][wait][end-FC] ; data -> code ; control flow target (from $8EE9, $8EF2) ; call to code in a different bank ($0F:$FA32) 0x018F0A|$06:$8EFA:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018F0D|$06:$8EFD:87 ; String ID #$0287: ‘Dost thou wish to save thy deeds in the Imperial Scrolls of Honor?’[FD][FD][end-FC] ; data -> code 0x018F0E|$06:$8EFE:A9 00 LDA #$00 ; Save Point ID #$00: Midenhall 2F 0x018F10|$06:$8F00:85 48 STA $48 ; last save point ID 0x018F12|$06:$8F02:20 5D A3 JSR $A35D ; save game handler ; call to code in a different bank ($0F:$FA32) 0x018F15|$06:$8F05:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018F18|$06:$8F08:88 ; String ID #$0288: [wait]‘All of us await the day that Hargon is cast down[.’][end-FC] ; data -> code 0x018F19|$06:$8F09:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $8ED0) 0x018F1C|$06:$8F0C:A9 00 LDA #$00 ; Midenhall ; call to code in a different bank ($0F:$FC50) 0x018F1E|$06:$8F0E:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x018F21|$06:$8F11:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018F24|$06:$8F14:8A ; String ID #$028A: ‘Poor [name]. Thou hast met an untimely end[.’][wait][end-FC] ; data -> code 0x018F25|$06:$8F15:20 66 94 JSR $9466 ; display EXP to next level messages for entire party 0x018F28|$06:$8F18:A9 00 LDA #$00 ; Save Point ID #$00: Midenhall 2F 0x018F2A|$06:$8F1A:85 48 STA $48 ; last save point ID ; call to code in a different bank ($0F:$FA32) 0x018F2C|$06:$8F1C:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018F2F|$06:$8F1F:87 ; String ID #$0287: ‘Dost thou wish to save thy deeds in the Imperial Scrolls of Honor?’[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$D16B) 0x018F30|$06:$8F20:20 6B D1 JSR $D16B 0x018F33|$06:$8F23:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero 0x018F36|$06:$8F26:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x018F39|$06:$8F29:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018F3C|$06:$8F2C:8B ; String ID #$028B: ‘[name]!’[wait][end-FC] ; data -> code 0x018F3D|$06:$8F2D:A9 00 LDA #$00 ; Midenhall ; call to code in a different bank ($0F:$FC50) 0x018F3F|$06:$8F2F:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x018F42|$06:$8F32:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018F45|$06:$8F35:8C ; String ID #$028C: ‘Please give thy[line]regards to my son[.’][end-FC] ; data -> code 0x018F46|$06:$8F36:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; external control flow target (from $0F:$D28F) 0x018F49|$06:$8F39:4E 25 06 LSR $0625 ; party gold, high byte; full party death costs you half your gold 0x018F4C|$06:$8F3C:6E 24 06 ROR $0624 ; party gold, low byte 0x018F4F|$06:$8F3F:20 CB 9A JSR $9ACB ; open dialogue window 0x018F52|$06:$8F42:A9 00 LDA #$00 ; Midenhall ; call to code in a different bank ($0F:$FC50) 0x018F54|$06:$8F44:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x018F57|$06:$8F47:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018F5A|$06:$8F4A:8D ; String ID #$028D: ‘No pulse, no breath, cold as a cod[.’][wait][line]‘Yes, thou art truly dead, [name][.’][wait][line]‘I suppose I had better revive thee, though thou deserve less[.’][end-FC] ; data -> code 0x018F5B|$06:$8F4B:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; external control flow target (from $0F:$C6FD) 0x018F5E|$06:$8F4E:20 CB 9A JSR $9ACB ; open dialogue window 0x018F61|$06:$8F51:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero 0x018F64|$06:$8F54:48 PHA ; call to code in a different bank ($0F:$FC50) 0x018F65|$06:$8F55:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x018F68|$06:$8F58:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018F6B|$06:$8F5B:8E ; String ID #$028E: ‘Welcome back, [name][.’][wait][end-FC] ; data -> code 0x018F6C|$06:$8F5C:20 66 94 JSR $9466 ; display EXP to next level messages for entire party 0x018F6F|$06:$8F5F:68 PLA ; call to code in a different bank ($0F:$FC50) 0x018F70|$06:$8F60:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x018F73|$06:$8F63:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018F76|$06:$8F66:90 ; String ID #$0290: ‘Thy road is long and fraught with peril, but don't despair.[line]Come see me in thy need, [name][.’][end-FC] ; data -> code 0x018F77|$06:$8F67:4C 92 80 JMP $8092 ; wait until all joypad buttons are released and then some button pressed then wipe menus and exit COMMAND menu ; handler for dialogue ID #$9E: Guard in Map ID #$02: Midenhall 2F ; indirect control flow target (via $8E83) 0x018F7A|$06:$8F6A:A9 00 LDA #$00 ; Midenhall ; call to code in a different bank ($0F:$FC50) 0x018F7C|$06:$8F6C:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA 0x018F7F|$06:$8F6F: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) 0x018F81|$06:$8F71:C9 03 CMP #$03 0x018F83|$06:$8F73:F0 08 BEQ $8F7D 0x018F85|$06:$8F75:C9 04 CMP #$04 0x018F87|$06:$8F77:F0 04 BEQ $8F7D 0x018F89|$06:$8F79:A9 92 LDA #$92 ; String ID #$0292: ‘I would come with thee, [name],[wait][line]but my place is here beside the King[.’][end-FC] 0x018F8B|$06:$8F7B:D0 02 BNE $8F7F ; control flow target (from $8F73, $8F77) 0x018F8D|$06:$8F7D:A9 91 LDA #$91 ; String ID #$0291: ‘By land and sea and air will thy path lead, and in places I cannot see[.’][end-FC] ; control flow target (from $8F7B) ; call to code in a different bank ($0F:$FA52) 0x018F8F|$06:$8F7F:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x018F92|$06:$8F82:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$9F: Wizard in Map ID #$02: Midenhall 2F ; indirect control flow target (via $8E85) 0x018F95|$06:$8F85:A9 00 LDA #$00 ; Midenhall ; call to code in a different bank ($0F:$FC50) 0x018F97|$06:$8F87:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA 0x018F9A|$06:$8F8A: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) 0x018F9C|$06:$8F8C:C9 03 CMP #$03 0x018F9E|$06:$8F8E:F0 04 BEQ $8F94 0x018FA0|$06:$8F90:C9 04 CMP #$04 0x018FA2|$06:$8F92:D0 07 BNE $8F9B ; control flow target (from $8F8E) ; call to code in a different bank ($0F:$FA32) 0x018FA4|$06:$8F94:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018FA7|$06:$8F97:93 ; String ID #$0293: ‘It is difficult to see thee go, [name][.’][end-FC] ; data -> code 0x018FA8|$06:$8F98:4C A9 8F JMP $8FA9 ; control flow target (from $8F92) 0x018FAB|$06:$8F9B:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero 0x018FAE|$06:$8F9E:D0 04 BNE $8FA4 ; branch if Midenhall dead 0x018FB0|$06:$8FA0:A9 94 LDA #$94 ; String ID #$0294: ‘Thou art now as strong as an ox and twice as good looking.[line]That is very good[.’][end-FC] 0x018FB2|$06:$8FA2:D0 02 BNE $8FA6 ; control flow target (from $8F9E) 0x018FB4|$06:$8FA4:A9 95 LDA #$95 ; String ID #$0295: ‘[name], it is such a pity[.’][end-FC] ; control flow target (from $8FA2) ; call to code in a different bank ($0F:$FA52) 0x018FB6|$06:$8FA6:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 ; control flow target (from $8F98) 0x018FB9|$06:$8FA9:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$A0: Brute in Map ID #$04: Midenhall B1 ; indirect control flow target (via $8E87) 0x018FBC|$06:$8FAC:AD F2 05 LDA $05F2 ; probably whether door between you and NPC is open 0x018FBF|$06:$8FAF:F0 13 BEQ $8FC4 ; call to code in a different bank ($0F:$FA32) 0x018FC1|$06:$8FB1:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018FC4|$06:$8FB4:96 ; String ID #$0296: ‘Dost thou have the Jailor's Key?’[end-FC] ; data -> code 0x018FC5|$06:$8FB5:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x018FC8|$06:$8FB8:C9 00 CMP #$00 ; YES 0x018FCA|$06:$8FBA:D0 04 BNE $8FC0 0x018FCC|$06:$8FBC:A9 97 LDA #$97 ; String ID #$0297: ‘Open this and I shall give thee some news[.’][end-FC] 0x018FCE|$06:$8FBE:D0 06 BNE $8FC6 ; control flow target (from $8FBA) 0x018FD0|$06:$8FC0:A9 98 LDA #$98 ; String ID #$0298: ‘Be gone with thee!’[end-FC] 0x018FD2|$06:$8FC2:D0 02 BNE $8FC6 ; control flow target (from $8FAF) 0x018FD4|$06:$8FC4:A9 99 LDA #$99 ; String ID #$0299: ‘As a reward for opening the door, let me tell thee of the Crest of Life[.’][wait][line]‘Find it on the dark road that leads to Rhone[.’][end-FC] ; control flow target (from $8FBE, $8FC2) ; call to code in a different bank ($0F:$FA52) 0x018FD6|$06:$8FC6:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x018FD9|$06:$8FC9:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$A1: King in Map ID #$06: Cannock ; indirect control flow target (via $8E89) 0x018FDC|$06:$8FCC:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero ; call to code in a different bank ($0F:$FC50) 0x018FDF|$06:$8FCF:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$F6CE) 0x018FE2|$06:$8FD2:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x018FE5|$06:$8FD5:85 49 STA $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$FA32) 0x018FE7|$06:$8FD7:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x018FEA|$06:$8FDA:E2 ; String ID #$02E2: ‘Welcome, [name]!’[wait][end-FC] ; data -> code 0x018FEB|$06:$8FDB:20 66 94 JSR $9466 ; display EXP to next level messages for entire party 0x018FEE|$06:$8FDE:A9 01 LDA #$01 ; Cannock ; call to code in a different bank ($0F:$FC50) 0x018FF0|$06:$8FE0:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA 0x018FF3|$06:$8FE3: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) 0x018FF5|$06:$8FE5:F0 06 BEQ $8FED 0x018FF7|$06:$8FE7:C9 01 CMP #$01 0x018FF9|$06:$8FE9:F0 04 BEQ $8FEF 0x018FFB|$06:$8FEB:D0 09 BNE $8FF6 ; control flow target (from $8FE5) 0x018FFD|$06:$8FED:E6 CA INC $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) ; control flow target (from $8FE9) ; call to code in a different bank ($0F:$FA32) 0x018FFF|$06:$8FEF:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019002|$06:$8FF2:9D ; String ID #$029D: ‘My son, [name], has already left on his journey[.’][wait] [line]‘Please find him and take him as thy companion[.’][wait][end-FC] ; data -> code 0x019003|$06:$8FF3:4C 02 90 JMP $9002 ; control flow target (from $8FEB) 0x019006|$06:$8FF6:C9 03 CMP #$03 0x019008|$06:$8FF8:D0 08 BNE $9002 0x01900A|$06:$8FFA:A5 49 LDA $49 ; object hero/target/item/string ID $49 0x01900C|$06:$8FFC:D0 04 BNE $9002 ; call to code in a different bank ($0F:$FA32) 0x01900E|$06:$8FFE:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019011|$06:$9001:9E ; String ID #$029E: [end-FC] ; data -> code ; control flow target (from $8FF3, $8FF8, $8FFC) ; call to code in a different bank ($0F:$FA32) 0x019012|$06:$9002:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019015|$06:$9005:87 ; String ID #$0287: ‘Dost thou wish to save thy deeds in the Imperial Scrolls of Honor?’[FD][FD][end-FC] ; data -> code 0x019016|$06:$9006:A9 01 LDA #$01 ; Save Point ID #$01: Cannock 0x019018|$06:$9008:85 48 STA $48 ; last save point ID 0x01901A|$06:$900A:20 5D A3 JSR $A35D ; save game handler 0x01901D|$06:$900D:A9 01 LDA #$01 ; Cannock ; call to code in a different bank ($0F:$FC50) 0x01901F|$06:$900F:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x019022|$06:$9012:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019025|$06:$9015:9C ; String ID #$029C: [wait]‘With my son's help thou shall go far[.’][end-FC] ; data -> code 0x019026|$06:$9016:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$A2: Princess Halla in Map ID #$06: Cannock ; indirect control flow target (via $8E8B) 0x019029|$06:$9019: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) 0x01902B|$06:$901B:C9 04 CMP #$04 0x01902D|$06:$901D:D0 04 BNE $9023 0x01902F|$06:$901F:A9 A4 LDA #$A4 ; String ID #$02A4: [end-FC] 0x019031|$06:$9021:D0 16 BNE $9039 ; control flow target (from $901D) ; call to code in a different bank ($0F:$F6CE) 0x019033|$06:$9023:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x019036|$06:$9026:D0 17 BNE $903F ; call to code in a different bank ($0F:$FA32) 0x019038|$06:$9028:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01903B|$06:$902B:9F ; String ID #$029F: ‘Who art thou?[line]A friend of my brother's?’[FD][FD][end-FC] ; data -> code 0x01903C|$06:$902C:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x01903F|$06:$902F:C9 00 CMP #$00 ; YES 0x019041|$06:$9031:D0 04 BNE $9037 0x019043|$06:$9033:A9 A0 LDA #$A0 ; String ID #$02A0: ‘Then I'll give thee some advice[.’][wait][line]‘My brother has gone searching for the Spring of Bravery, but he travels slowly[.’][end-FC] 0x019045|$06:$9035:D0 02 BNE $9039 ; control flow target (from $9031) 0x019047|$06:$9037:A9 A1 LDA #$A1 ; String ID #$02A1: ‘Then I wish to be left alone[.’][end-FC] ; control flow target (from $9021, $9035, $904F, $9053) ; call to code in a different bank ($0F:$FA52) 0x019049|$06:$9039:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x01904C|$06:$903C:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9026) 0x01904F|$06:$903F:A9 01 LDA #$01 ; Cannock 0x019051|$06:$9041:85 97 STA $97 ; subject hero ID $97 0x019053|$06:$9043:A9 80 LDA #$80 ; Alive 0x019055|$06:$9045:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x019058|$06:$9048:90 07 BCC $9051 0x01905A|$06:$904A:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA 0x01905D|$06:$904D:A9 A2 LDA #$A2 ; String ID #$02A2: ‘So, thou hast found my brother[.’][wait][line]‘Why dost thou tarry here when the world is in grave peril?’[end-FC] 0x01905F|$06:$904F:D0 E8 BNE $9039 ; control flow target (from $9048) 0x019061|$06:$9051:A9 A3 LDA #$A3 ; String ID #$02A3: ‘Oh, no! He is as dead as a pork chop[.’][end-FC] 0x019063|$06:$9053:D0 E4 BNE $9039 ; handler for dialogue ID #$A3: Wizard in Map ID #$06: Cannock ; indirect control flow target (via $8E8D) ; call to code in a different bank ($0F:$FA32) 0x019065|$06:$9055:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019068|$06:$9058:A5 ; String ID #$02A5: ‘Well, don't just stand there.[line]Open the treasure chest[.’][end-FC] ; data -> code 0x019069|$06:$9059:AD 1A 05 LDA $051A ; something to do with whether you've opened the chest containing the Shield of Erdrick 0x01906C|$06:$905C:F0 04 BEQ $9062 ; call to code in a different bank ($0F:$FA32) 0x01906E|$06:$905E:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019071|$06:$9061:A6 ; String ID #$02A6: [wait]‘So you've already peeked, eh?’[end-FC] ; data -> code ; control flow target (from $905C) 0x019072|$06:$9062:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$A4-#$A5: Monsters in Map ID #$08: Hamlin Waterway ; indirect control flow target (via $8E8F, $8E91) ; call to code in a different bank ($0F:$FA32) 0x019075|$06:$9065:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019078|$06:$9068:A9 ; String ID #$02A9: ‘Aiyee!’[end-FC] ; data -> code 0x019079|$06:$9069:AD F2 05 LDA $05F2 ; probably whether door between you and NPC is open 0x01907C|$06:$906C:D0 06 BNE $9074 ; call to code in a different bank ($0F:$D1A1) 0x01907E|$06:$906E:20 A1 D1 JSR $D1A1 ; handle Hamlin Waterway Gremlins fight 0x019081|$06:$9071:4C 95 80 JMP $8095 ; wipe menus and exit COMMAND menu ; control flow target (from $906C) 0x019084|$06:$9074:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$A6: King Moonbrooke's Flame in Map ID #$09: Moonbrooke ; indirect control flow target (via $8E93) 0x019087|$06:$9077:A9 02 LDA #$02 ; Moonbrooke ; call to code in a different bank ($0F:$FC50) 0x019089|$06:$9079:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x01908C|$06:$907C:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01908F|$06:$907F:AA ; String ID #$02AA: ‘Woe is me, for I am the unhappy ghost of the King of Moonbrooke[.’][wait][line]‘To make matters worse, my daughter has been cursed and transformed into a common mutt[.’][wait][line]‘I am burning with shame[.’][end-FC] ; data -> code 0x019090|$06:$9080:AD 51 06 LDA $0651 ; Moonbrooke status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x019093|$06:$9083:29 84 AND #$84 ; pick out the Alive and In Party bits 0x019095|$06:$9085:C9 84 CMP #$84 ; is Moonbrooke alive and in your party? 0x019097|$06:$9087:D0 09 BNE $9092 ; if yes, she gets extra text 0x019099|$06:$9089:A9 02 LDA #$02 ; Moonbrooke ; call to code in a different bank ($0F:$FC50) 0x01909B|$06:$908B:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x01909E|$06:$908E:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0190A1|$06:$9091:AB ; String ID #$02AB: [wait][line][no voice]Then [name] cried[line][no voice]out: ‘Father? Is it really thee in the flames?’[wait][line]And the Flame replied: ‘Alas, it is I. It is Hargon's way of firing those he doesn't need[.’][end-FC] ; data -> code ; control flow target (from $9087) 0x0190A2|$06:$9092:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$A7: Guard in Map ID #$0A: Moonbrooke B1 ; indirect control flow target (via $8E95) 0x0190A5|$06:$9095:20 93 94 JSR $9493 ; SEC if Moonbrooke in party, CLC otherwise 0x0190A8|$06:$9098:90 07 BCC $90A1 ; call to code in a different bank ($0F:$FA32) 0x0190AA|$06:$909A:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0190AD|$06:$909D:AD ; String ID #$02AD: ‘Princess, thou art now free[.’][end-FC] ; data -> code 0x0190AE|$06:$909E:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9098) ; call to code in a different bank ($0F:$FA32) 0x0190B1|$06:$90A1:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0190B4|$06:$90A4:AC ; String ID #$02AC: ‘The Princess has been transformed by a curse[.’][wait][line]‘Only the Mirror of Ra can break the spell, for in that glass one sees her true self[.’][end-FC] ; data -> code 0x0190B5|$06:$90A5:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$A8: Wizard in Map ID #$0B: Lianport ; indirect control flow target (via $8E97) 0x0190B8|$06:$90A8:AD 9C 05 LDA $059C ; NPC #$0C X-pos 0x0190BB|$06:$90AB:C9 0F CMP #$0F 0x0190BD|$06:$90AD:D0 04 BNE $90B3 0x0190BF|$06:$90AF:A9 B8 LDA #$B8 ; String ID #$02B8: ‘Farewell[.’][end-FC] 0x0190C1|$06:$90B1:D0 06 BNE $90B9 ; control flow target (from $90AD) 0x0190C3|$06:$90B3:A5 CF LDA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x0190C5|$06:$90B5:D0 08 BNE $90BF 0x0190C7|$06:$90B7:A9 AE LDA #$AE ; String ID #$02AE: ‘We never lend boats to strangers, sorry[.’][end-FC] ; control flow target (from $90B1) ; call to code in a different bank ($0F:$FA52) 0x0190C9|$06:$90B9:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x0190CC|$06:$90BC:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $90B5) ; call to code in a different bank ($0F:$FA32) 0x0190CF|$06:$90BF:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0190D2|$06:$90C2:AF ; String ID #$02AF: ‘Oh, thou art the ones who helped my granddaughter[.’][wait][line]‘Many thanks[.’][end-FC] ; data -> code ; call to code in a different bank ($0F:$D0F5) 0x0190D3|$06:$90C3:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 ; call to code in a different bank ($0F:$CCA2) 0x0190D6|$06:$90C6:20 A2 CC JSR $CCA2 0x0190D9|$06:$90C9:4C 95 80 JMP $8095 ; wipe menus and exit COMMAND menu ; handler for dialogue ID #$A9: Echoing Flute guy in NE in Map ID #$0B: Lianport ; indirect control flow target (via $8E99) 0x0190DC|$06:$90CC:A9 25 LDA #$25 ; Item ID #$25: Tresures 0x0190DE|$06:$90CE: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 0x0190E1|$06:$90D1:10 0B BPL $90DE ; branch if found 0x0190E3|$06:$90D3:A9 2A LDA #$2A ; Item ID #$2A: Echoing Flute 0x0190E5|$06:$90D5: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 0x0190E8|$06:$90D8:10 0D BPL $90E7 ; branch if found 0x0190EA|$06:$90DA:A9 B0 LDA #$B0 ; String ID #$02B0: ‘The pirate ship Relentless sank in chill waters with a great treasure still aboard[.’][wait][line]‘Bring me this treasure and I shall pay a handsome fee[.’][end-FC] 0x0190EC|$06:$90DC:D0 0B BNE $90E9 ; control flow target (from $90D1) 0x0190EE|$06:$90DE:A9 2A LDA #$2A ; Item ID #$2A: Echoing Flute 0x0190F0|$06:$90E0:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped); replace Tresures in party inventory with Echoing Flute 0x0190F3|$06:$90E3:A9 B1 LDA #$B1 ; String ID #$02B1: ‘Thou hast done exceedingly well[.’][wait][line]‘As I promised I shall give thee the Echoing Flute as thy reward[.’][end-FC] 0x0190F5|$06:$90E5:D0 02 BNE $90E9 ; control flow target (from $90D8) 0x0190F7|$06:$90E7:A9 B2 LDA #$B2 ; String ID #$02B2: ‘Thanks to thee I was greatly helped[.’][end-FC] ; control flow target (from $90DC, $90E5) ; call to code in a different bank ($0F:$FA52) 0x0190F9|$06:$90E9:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x0190FC|$06:$90EC:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$AA: Woman in Map ID #$0B: Lianport ; indirect control flow target (via $8E9B) 0x0190FF|$06:$90EF:AD 94 05 LDA $0594 ; NPC #$0B X-pos 0x019102|$06:$90F2:C9 03 CMP #$03 0x019104|$06:$90F4:D0 04 BNE $90FA 0x019106|$06:$90F6:A9 B9 LDA #$B9 ; String ID #$02B9: ‘I am in thy debt.[line]Please see my grandfather[.’][wait][line]‘He is at the port where his ship is docked[.’][end-FC] 0x019108|$06:$90F8:D0 02 BNE $90FC ; control flow target (from $90F4) 0x01910A|$06:$90FA:A9 B7 LDA #$B7 ; String ID #$02B7: ‘I wish thee speed and health[.’][end-FC] ; control flow target (from $90F8) ; call to code in a different bank ($0F:$FA52) 0x01910C|$06:$90FC:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x01910F|$06:$90FF:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$AB: Brute in Map ID #$0B: Lianport ; indirect control flow target (via $8E9D) ; call to code in a different bank ($0F:$FA32) 0x019112|$06:$9102:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019115|$06:$9105:BA ; String ID #$02BA: ‘I have nothing to say to thee[.’][end-FC] ; data -> code 0x019116|$06:$9106:20 9D 94 JSR $949D ; SEC if Moonbrooke alive, CLC otherwise 0x019119|$06:$9109:90 04 BCC $910F ; call to code in a different bank ($0F:$FA32) 0x01911B|$06:$910B:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01911E|$06:$910E:BB ; String ID #$02BB: [wait]‘That's right, nothing at all[.’][end-FC] ; data -> code ; control flow target (from $9109) 0x01911F|$06:$910F:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$AC: Woman in SW corner of Map ID #$0B: Lianport ; indirect control flow target (via $8E9F) 0x019122|$06:$9112:20 9D 94 JSR $949D ; SEC if Moonbrooke alive, CLC otherwise 0x019125|$06:$9115:B0 2E BCS $9145 ; if Moonbrooke's alive, display the boring string, otherwise... ; call to code in a different bank ($0F:$FA32) 0x019127|$06:$9117:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01912A|$06:$911A:BC ; String ID #$02BC: ‘Dost thou think I am pretty enough to be a queen?’[end-FC] ; data -> code 0x01912B|$06:$911B:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x01912E|$06:$911E:C9 00 CMP #$00 ; #$00 = YES 0x019130|$06:$9120:D0 1F BNE $9141 ; branch if you chose NO 0x019132|$06:$9122:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero 0x019135|$06:$9125:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA 0x019138|$06:$9128:A9 64 LDA #$64 ; 100 gold 0x01913A|$06:$912A:85 8F STA $8F 0x01913C|$06:$912C:A9 00 LDA #$00 0x01913E|$06:$912E:85 90 STA $90 0x019140|$06:$9130:20 31 8D JSR $8D31 ; given gold amount in $8F-$90, decrease party gold by that amount and SEC if possible, CLC otherwise 0x019143|$06:$9133:B0 08 BCS $913D ; if you didn't have 100 G to start with, reduce party gold to 0 :( 0x019145|$06:$9135:A9 00 LDA #$00 0x019147|$06:$9137:8D 24 06 STA $0624 ; party gold, low byte 0x01914A|$06:$913A:8D 25 06 STA $0625 ; party gold, high byte ; control flow target (from $9133) 0x01914D|$06:$913D:A9 BD LDA #$BD ; String ID #$02BD: ‘Perhaps the great Prince of Cannock thinks so too[.’][end-FC] 0x01914F|$06:$913F:D0 06 BNE $9147 ; control flow target (from $9120) 0x019151|$06:$9141:A9 BE LDA #$BE ; String ID #$02BE: ‘What's wrong!’[end-FC] 0x019153|$06:$9143:D0 02 BNE $9147 ; control flow target (from $9115) 0x019155|$06:$9145:A9 BF LDA #$BF ; String ID #$02BF: ‘Be nice to one who lives here; she knows how to turn princes into tadpoles[.’][end-FC] ; control flow target (from $913F, $9143) ; call to code in a different bank ($0F:$FA52) 0x019157|$06:$9147:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x01915A|$06:$914A:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$AD: Wizard in Map ID #$0C: Tantegel ; indirect control flow target (via $8EA1) 0x01915D|$06:$914D:A9 00 LDA #$00 0x01915F|$06:$914F:85 49 STA $49 ; object hero/target/item/string ID $49 0x019161|$06:$9151:85 97 STA $97 ; subject hero ID $97 ; control flow target (from $915E) 0x019163|$06:$9153:20 FC 9A JSR $9AFC ; given hero ID in $97 and hero inventory index in $49, set Z if item is equipped and cursed, clear if not 0x019166|$06:$9156:F0 0A BEQ $9162 0x019168|$06:$9158:E6 49 INC $49 ; object hero/target/item/string ID $49 0x01916A|$06:$915A:A5 49 LDA $49 ; object hero/target/item/string ID $49 0x01916C|$06:$915C:C9 18 CMP #$18 ; party inventory size 0x01916E|$06:$915E:D0 F3 BNE $9153 0x019170|$06:$9160:F0 04 BEQ $9166 ; control flow target (from $9156) 0x019172|$06:$9162:A9 C1 LDA #$C1 ; String ID #$02C1: ‘Unfortunately I have not the skill to cure this curse[.’][end-FC] 0x019174|$06:$9164:D0 02 BNE $9168 ; control flow target (from $9160) 0x019176|$06:$9166:A9 C0 LDA #$C0 ; String ID #$02C0: ‘Come here when thou art afflicted by a curse[.’][end-FC] ; control flow target (from $9164) ; call to code in a different bank ($0F:$FA52) 0x019178|$06:$9168:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x01917B|$06:$916B:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$AE: Wizard in Map ID #$0C: Tantegel ; indirect control flow target (via $8EA3) ; call to code in a different bank ($0F:$FA32) 0x01917E|$06:$916E:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019181|$06:$9171:C2 ; String ID #$02C2: ‘Peace be with thee[.’][end-FC] ; data -> code ; call to code in a different bank ($0F:$C515) 0x019182|$06:$9172:20 15 C5 JSR $C515 ; flash screen 10 times 0x019185|$06:$9175:20 EC 8D JSR $8DEC ; restore full MP to all living party members 0x019188|$06:$9178:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$AF: Priest in Map ID #$0C: Tantegel ; indirect control flow target (via $8EA5) 0x01918B|$06:$917B:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero ; call to code in a different bank ($0F:$FA32) 0x01918E|$06:$917E:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019191|$06:$9181:C3 ; String ID #$02C3: ‘To the noble descendant of Erdrick I bid welcome[.’][wait][end-FC] ; data -> code 0x019192|$06:$9182:20 66 94 JSR $9466 ; display EXP to next level messages for entire party ; call to code in a different bank ($0F:$FA32) 0x019195|$06:$9185:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019198|$06:$9188:A7 ; String ID #$02A7: ‘Although there is no king here, I can save thy deeds[.’][wait][line]‘Shall I do this?’[FD][FD][end-FC] ; data -> code 0x019199|$06:$9189:A9 02 LDA #$02 ; Save Point ID #$02: Tantegel 0x01919B|$06:$918B:85 48 STA $48 ; last save point ID 0x01919D|$06:$918D:20 5D A3 JSR $A35D ; save game handler ; call to code in a different bank ($0F:$FA32) 0x0191A0|$06:$9190:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0191A3|$06:$9193:C4 ; String ID #$02C4: [wait]‘Go in peace[.’][end-FC] ; data -> code 0x0191A4|$06:$9194:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$B0: King in Map ID #$0F: Osterfair ; indirect control flow target (via $8EA7) 0x0191A7|$06:$9197:A5 98 LDA $98 ; outcome of last fight? 0x0191A9|$06:$9199:F0 06 BEQ $91A1 0x0191AB|$06:$919B:C9 FC CMP #$FC 0x0191AD|$06:$919D:F0 44 BEQ $91E3 0x0191AF|$06:$919F:D0 25 BNE $91C6 ; control flow target (from $9199) 0x0191B1|$06:$91A1:AD 12 01 LDA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x0191B4|$06:$91A4:29 04 AND #$04 ; Moon Crest 0x0191B6|$06:$91A6:D0 4C BNE $91F4 ; call to code in a different bank ($0F:$FA32) 0x0191B8|$06:$91A8:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0191BB|$06:$91AB:C5 ; String ID #$02C5: ‘Thou art welcome in my castle of Osterfair[.’][wait][line]‘If thou entertain me, thou shall receive a valuable prize[.’][wait][line]‘Dost thou wish to try?’[FD][FD][end-FC] ; data -> code 0x0191BC|$06:$91AC:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x0191BF|$06:$91AF:C9 00 CMP #$00 ; YES 0x0191C1|$06:$91B1:D0 3A BNE $91ED ; call to code in a different bank ($0F:$FA32) 0x0191C3|$06:$91B3:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0191C6|$06:$91B6:C6 ; String ID #$02C6: ‘Thou must go forth to the center of this Coliseum[.’][end-FC] ; data -> code ; call to code in a different bank ($0F:$D0F5) 0x0191C7|$06:$91B7:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x0191CA|$06:$91BA:A9 00 LDA #$00 0x0191CC|$06:$91BC:85 98 STA $98 ; outcome of last fight? 0x0191CE|$06:$91BE:85 03 STA $03 ; game clock? ; call to code in a different bank ($0F:$CABA) 0x0191D0|$06:$91C0:20 BA CA JSR $CABA 0x0191D3|$06:$91C3:4C 95 80 JMP $8095 ; wipe menus and exit COMMAND menu ; control flow target (from $919F) 0x0191D6|$06:$91C6:20 CB 9A JSR $9ACB ; open dialogue window 0x0191D9|$06:$91C9:AD 12 01 LDA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x0191DC|$06:$91CC:29 04 AND #$04 ; Moon Crest 0x0191DE|$06:$91CE:D0 0C BNE $91DC ; call to code in a different bank ($0F:$FA32) 0x0191E0|$06:$91D0:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0191E3|$06:$91D3:C7 ; String ID #$02C7: ‘Thou hast done well[.’][wait][line]‘I shall give thee the Moon Crest[.’][wait][end-FC] ; data -> code 0x0191E4|$06:$91D4:A9 04 LDA #$04 ; Moon Crest 0x0191E6|$06:$91D6:0D 12 01 ORA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x0191E9|$06:$91D9:8D 12 01 STA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) ; control flow target (from $91CE) ; call to code in a different bank ($0F:$FA2E) 0x0191EC|$06:$91DC:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0191EF|$06:$91DF:15 ; String ID #$0115: ‘Thou must fight gallantly[.’][end-FC] ; data -> code 0x0191F0|$06:$91E0:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $919D) 0x0191F3|$06:$91E3:20 CB 9A JSR $9ACB ; open dialogue window ; call to code in a different bank ($0F:$FA32) 0x0191F6|$06:$91E6:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0191F9|$06:$91E9:C9 ; String ID #$02C9: ‘Thou art a poor excuse for a warrior[.’][wait][line]‘Get thee gone!’[end-FC] ; data -> code 0x0191FA|$06:$91EA:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $91B1) ; call to code in a different bank ($0F:$FA32) 0x0191FD|$06:$91ED:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019200|$06:$91F0:C8 ; String ID #$02C8: ‘That's unfortunate[.’][wait][line]‘Good bye[.’][end-FC] ; data -> code 0x019201|$06:$91F1:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $91A6) 0x019204|$06:$91F4:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero ; call to code in a different bank ($0F:$FC50) 0x019207|$06:$91F7:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x01920A|$06:$91FA:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01920D|$06:$91FD:EC ; String ID #$02EC: ‘Welcome back!’[wait][end-FC] ; data -> code 0x01920E|$06:$91FE:20 66 94 JSR $9466 ; display EXP to next level messages for entire party ; call to code in a different bank ($0F:$FA32) 0x019211|$06:$9201:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019214|$06:$9204:87 ; String ID #$0287: ‘Dost thou wish to save thy deeds in the Imperial Scrolls of Honor?’[FD][FD][end-FC] ; data -> code 0x019215|$06:$9205:A9 03 LDA #$03 ; Save Point ID #$03: Osterfair 0x019217|$06:$9207:85 48 STA $48 ; last save point ID 0x019219|$06:$9209:20 5D A3 JSR $A35D ; save game handler ; call to code in a different bank ($0F:$FA32) 0x01921C|$06:$920C:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01921F|$06:$920F:CA ; String ID #$02CA: [wait]‘Thy strength is that of many fearsome Hibabongos[.’][wait][line]‘The Moon Crest that I have given thee is just one of many tokens thou must collect[.’][end-FC] ; data -> code 0x019220|$06:$9210:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$B1: crazy fortuneteller Wizard in NW Map ID #$0F: Osterfair ; indirect control flow target (via $8EA9) ; call to code in a different bank ($0F:$FA32) 0x019223|$06:$9213:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019226|$06:$9216:CB ; String ID #$02CB: ‘I'm a fortune-teller.[line]Art thou looking for something?’[FD][FD][end-FC] ; data -> code 0x019227|$06:$9217:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x01922A|$06:$921A:C9 00 CMP #$00 ; YES 0x01922C|$06:$921C:D0 28 BNE $9246 ; call to code in a different bank ($0F:$C3AB) 0x01922E|$06:$921E:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x019231|$06:$9221:A5 32 LDA $32 ; RNG byte 0 0x019233|$06:$9223:05 33 ORA $33 ; RNG byte 1 0x019235|$06:$9225:29 03 AND #$03 ; 4 direction options to choose from 0x019237|$06:$9227:AA TAX 0x019238|$06:$9228:E8 INX 0x019239|$06:$9229:AD 4E 92 LDA $924E ; -> $06:$9250: Direction Names text 0x01923C|$06:$922C:85 0C STA $0C 0x01923E|$06:$922E:AD 4F 92 LDA $924F 0x019241|$06:$9231:85 0D STA $0D 0x019243|$06:$9233:20 66 92 JSR $9266 ; given a pointer ($0C) and a number (one-based) in X, update $0C-$0D to the address of the start of the X'th string in ($0C) 0x019246|$06:$9236:A0 00 LDY #$00 ; copy direction name to $5A ; control flow target (from $9240) 0x019248|$06:$9238:B1 0C LDA ($0C),Y 0x01924A|$06:$923A:99 5A 00 STA $005A,Y ; Crest/direction name write buffer start 0x01924D|$06:$923D:C8 INY ; [end-FA] 0x01924E|$06:$923E:C9 FA CMP #$FA 0x019250|$06:$9240:D0 F6 BNE $9238 ; if not end of string, loop to copy more data 0x019252|$06:$9242:A9 CC LDA #$CC ; String ID #$02CC: ‘I'll tell thy fortune[.’][wait][line]‘That which thou seeks is [item-F9]!’[end-FC] 0x019254|$06:$9244:D0 02 BNE $9248 ; control flow target (from $921C) 0x019256|$06:$9246:A9 CD LDA #$CD ; String ID #$02CD: ‘So be it then.[line]I shall tell thee nothing[.’][end-FC] ; control flow target (from $9244) ; call to code in a different bank ($0F:$FA52) 0x019258|$06:$9248:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x01925B|$06:$924B:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; code -> data ; -> $06:$9250: Direction Names text ; data load target (from $9229) 0x01925E|$06:$924E:50 ; data load target (from $922E) 0x01925F|$06:$924F: 92 ; $06:$9250; Direction Names text ; Direction Names text ; indirect data load target (via $924E) 0x019260|$06:$9250:28 0A 1C 1D FA ; "East" + [end-FA] ; indirect data load target 0x019265|$06:$9255:3A 0E 1C 1D FA ; "West" + [end-FA] ; indirect data load target 0x01926A|$06:$925A:36 18 1E 1D 11 FA ; "South" + [end-FA] ; indirect data load target 0x019270|$06:$9260:31 18 1B 1D 11 FA ; "North" + [end-FA] ; data -> code ; given a pointer ($0C) and a number (one-based) in X, update $0C-$0D to the address of the start of the X'th string in ($0C) ; control flow target (from $9233, $9287) 0x019276|$06:$9266:A0 00 LDY #$00 ; start at the current position of ($0C) ; control flow target (from $9277) 0x019278|$06:$9268:B1 0C LDA ($0C),Y ; [end-FA] 0x01927A|$06:$926A:C9 FA CMP #$FA 0x01927C|$06:$926C:F0 0C BEQ $927A ; found some end token ; [end-FC] 0x01927E|$06:$926E:C9 FC CMP #$FC 0x019280|$06:$9270:F0 08 BEQ $927A ; found some end token ; [end-FF] 0x019282|$06:$9272:C9 FF CMP #$FF 0x019284|$06:$9274:F0 04 BEQ $927A ; found some end token 0x019286|$06:$9276:C8 INY 0x019287|$06:$9277:4C 68 92 JMP $9268 ; found some end token ; control flow target (from $926C, $9270, $9274) 0x01928A|$06:$927A:CA DEX ; number of strings to skip ahead + 1 0x01928B|$06:$927B:F0 0D BEQ $928A ; if no more strings to skip, then ($0C) is correct and we're done 0x01928D|$06:$927D:98 TYA ; otherwise update $0C-$0D and loop to the next string 0x01928E|$06:$927E:38 SEC 0x01928F|$06:$927F:65 0C ADC $0C 0x019291|$06:$9281:85 0C STA $0C 0x019293|$06:$9283:90 02 BCC $9287 0x019295|$06:$9285:E6 0D INC $0D ; control flow target (from $9283) 0x019297|$06:$9287:4C 66 92 JMP $9266 ; given a pointer ($0C) and a number (one-based) in X, update $0C-$0D to the address of the start of the X'th string in ($0C) ; control flow target (from $927B) 0x01929A|$06:$928A:60 RTS ; handler for dialogue IDs #$B2-#$B3: Dog in Map ID #$0F: Osterfair ; indirect control flow target (via $8EAB, $8EAD) ; call to code in a different bank ($0F:$FA32) 0x01929B|$06:$928B:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01929E|$06:$928E:CF ; String ID #$02CF: ‘Roarrrr[..][..]!’[end-FC] ; data -> code 0x01929F|$06:$928F:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$B4: Dog in Map ID #$10: Zahan ; indirect control flow target (via $8EAF) ; call to code in a different bank ($0F:$FA32) 0x0192A2|$06:$9292:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0192A5|$06:$9295:D0 ; String ID #$02D0: ‘Bow-wow-wow!’[end-FC] ; data -> code 0x0192A6|$06:$9296:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$B5: Don Mahone in Map ID #$11: Tuhn ; indirect control flow target (via $8EB1) 0x0192A9|$06:$9299:A5 CD LDA $CD ; Don Mahone quest status (#$00 = not started, #$01 = ingredients delivered, #$03 = game loaded after ingredients delivered) 0x0192AB|$06:$929B:F0 1D BEQ $92BA 0x0192AD|$06:$929D:C9 03 CMP #$03 0x0192AF|$06:$929F:D0 0D BNE $92AE 0x0192B1|$06:$92A1:A9 02 LDA #$02 ; Moonbrooke 0x0192B3|$06:$92A3:85 97 STA $97 ; subject hero ID $97 0x0192B5|$06:$92A5:A9 13 LDA #$13 ; Item ID #$13: Water Flying Cloth 0x0192B7|$06:$92A7:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs 0x0192B9|$06:$92A9:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x0192BC|$06:$92AC:B0 04 BCS $92B2 ; control flow target (from $929F) 0x0192BE|$06:$92AE:A9 D5 LDA #$D5 ; String ID #$02D5: ‘Sorry.[line]I haven't finished it yet.[line]Please be patient[.’][end-FC] 0x0192C0|$06:$92B0:D0 46 BNE $92F8 ; display string, end TALK routine ; control flow target (from $92AC) 0x0192C2|$06:$92B2:A9 00 LDA #$00 0x0192C4|$06:$92B4:85 CD STA $CD ; Don Mahone quest status (#$00 = not started, #$01 = ingredients delivered, #$03 = game loaded after ingredients delivered) 0x0192C6|$06:$92B6:A9 D6 LDA #$D6 ; String ID #$02D6: ‘Hello.[line]I've just finished[.’][wait][line]‘See that the princess wears this[.’][end-FC] 0x0192C8|$06:$92B8:D0 3E BNE $92F8 ; display string, end TALK routine ; control flow target (from $929B) 0x0192CA|$06:$92BA:A9 2C LDA #$2C ; Item ID #$2C: Dew’s Yarn 0x0192CC|$06:$92BC: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 0x0192CF|$06:$92BF:30 26 BMI $92E7 0x0192D1|$06:$92C1:A9 2D LDA #$2D ; Item ID #$2D: Magic Loom 0x0192D3|$06:$92C3: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 0x0192D6|$06:$92C6:30 1F BMI $92E7 0x0192D8|$06:$92C8:20 A7 94 JSR $94A7 ; X = A mod 8, A = A / 8 0x0192DB|$06:$92CB:85 9C STA $9C ; hero ID 0x0192DD|$06:$92CD:A9 2D LDA #$2D ; Item ID #$2D: Magic Loom ; call to code in a different bank ($0F:$C4B6) 0x0192DF|$06:$92CF:20 B6 C4 JSR $C4B6 ; 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 0x0192E2|$06:$92D2:A9 2C LDA #$2C ; Item ID #$2C: Dew’s Yarn 0x0192E4|$06:$92D4:48 PHA ; Item ID #$2C: Dew’s Yarn 0x0192E5|$06:$92D5: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 0x0192E8|$06:$92D8:20 A7 94 JSR $94A7 ; X = A mod 8, A = A / 8 0x0192EB|$06:$92DB:85 9C STA $9C ; hero ID 0x0192ED|$06:$92DD:68 PLA ; Item ID #$2C: Dew’s Yarn ; call to code in a different bank ($0F:$C4B6) 0x0192EE|$06:$92DE:20 B6 C4 JSR $C4B6 ; 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 0x0192F1|$06:$92E1:E6 CD INC $CD ; Don Mahone quest status (#$00 = not started, #$01 = ingredients delivered, #$03 = game loaded after ingredients delivered) 0x0192F3|$06:$92E3:A9 D4 LDA #$D4 ; String ID #$02D4: ‘Ah, so thou has found my loom, and the Dew's Yarn, too[.’][wait][line]‘I shall weave thee a Water Flying Cloth, but it will take time[.’][wait][line]‘Please come back in a day or so[.’][end-FC] 0x0192F5|$06:$92E5:D0 11 BNE $92F8 ; display string, end TALK routine ; control flow target (from $92BF, $92C6) ; call to code in a different bank ($0F:$FA32) 0x0192F7|$06:$92E7:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0192FA|$06:$92EA:D1 ; String ID #$02D1: ‘Yes, I am Don Mahone. Once I was a famous weaver, but my loom was stolen[.’][wait][line]‘Will thou help me?’[FD][FD][end-FC] ; data -> code 0x0192FB|$06:$92EB:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x0192FE|$06:$92EE:C9 00 CMP #$00 ; YES 0x019300|$06:$92F0:D0 04 BNE $92F6 0x019302|$06:$92F2:A9 D2 LDA #$D2 ; String ID #$02D2: ‘Good, good.[line]All I can tell thee is that the loom was taken by someone who smelled like fish[.’][end-FC] 0x019304|$06:$92F4:D0 02 BNE $92F8 ; display string, end TALK routine ; control flow target (from $92F0) 0x019306|$06:$92F6:A9 D3 LDA #$D3 ; String ID #$02D3: ‘That's too bad.[line]We could help each other[.’][end-FC] ; display string, end TALK routine ; control flow target (from $92B0, $92B8, $92E5, $92F4) ; call to code in a different bank ($0F:$FA52) 0x019308|$06:$92F8:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x01930B|$06:$92FB:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$B6: Roge Fastfinger in NE Map ID #$14: Wellgarth Underground ; indirect control flow target (via $8EB3) 0x01930E|$06:$92FE:A5 CE LDA $CE ; Tuhn Watergate open flag (#$00 = closed, #$01 = open) 0x019310|$06:$9300:D0 22 BNE $9324 0x019312|$06:$9302:A9 3A LDA #$3A ; Item ID #$3A: Watergate Key 0x019314|$06:$9304:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs 0x019316|$06:$9306: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 0x019319|$06:$9309:10 19 BPL $9324 ; call to code in a different bank ($0F:$FA32) 0x01931B|$06:$930B:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01931E|$06:$930E:D7 ; String ID #$02D7: ‘Curses, I am found!’[wait][line]‘Yes, I am Roge Fastfinger and here is the watergate key[.’][end-FC] ; data -> code 0x01931F|$06:$930F:A9 00 LDA #$00 ; Midenhall ; control flow target (from $931E) 0x019321|$06:$9311:85 97 STA $97 ; subject hero ID $97 0x019323|$06:$9313:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x019326|$06:$9316:B0 11 BCS $9329 0x019328|$06:$9318:E6 97 INC $97 ; subject hero ID $97 0x01932A|$06:$931A:A5 97 LDA $97 ; subject hero ID $97 0x01932C|$06:$931C:C9 03 CMP #$03 ; max of 3 heroes 0x01932E|$06:$931E:D0 F1 BNE $9311 ; if more heroes to check, check them 0x019330|$06:$9320:A9 D8 LDA #$D8 ; String ID #$02D8: [wait]‘But thou hast many things.[line]See me again later[.’][end-FC] 0x019332|$06:$9322:D0 02 BNE $9326 ; control flow target (from $9300, $9309) 0x019334|$06:$9324:A9 D9 LDA #$D9 ; String ID #$02D9: ‘I'm sorry; I will not do that anymore[.’][end-FC] ; control flow target (from $9322) ; call to code in a different bank ($0F:$FA52) 0x019336|$06:$9326:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 ; control flow target (from $9316) 0x019339|$06:$9329:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue IDs #$B7-#$B9: Priest in Map ID #$15: Beran ; indirect control flow target (via $8EB5, $8EB7, $8EB9) 0x01933C|$06:$932C: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) 0x01933E|$06:$932E:C9 04 CMP #$04 0x019340|$06:$9330:B0 04 BCS $9336 0x019342|$06:$9332:A9 E1 LDA #$E1 ; String ID #$02E1: ‘I see that thou hast faced many dangers and the greatest lie ahead[.’][end-FC] 0x019344|$06:$9334:D0 02 BNE $9338 ; control flow target (from $9330) 0x019346|$06:$9336:A9 E2 LDA #$E2 ; String ID #$02E2: ‘Welcome, [name]!’[wait][end-FC] ; control flow target (from $9334) ; call to code in a different bank ($0F:$FA52) 0x019348|$06:$9338:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x01934B|$06:$933B:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$BA: Monster in Map ID #$16: Hargon's Castle 1F ; indirect control flow target (via $8EBB) ; call to code in a different bank ($0F:$FA32) 0x01934E|$06:$933E:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019351|$06:$9341:E3 ; String ID #$02E3: ‘The fool's false paradise suited thee better[.’][wait][line]‘Thou shall regret meddling in Hargon's affairs[.’][end-FC] ; data -> code ; call to code in a different bank ($0F:$D1C6) 0x019352|$06:$9342:20 C6 D1 JSR $D1C6 0x019355|$06:$9345:4C 95 80 JMP $8095 ; wipe menus and exit COMMAND menu ; handler for dialogue ID #$BB: Hargon in Map ID #$17: Hargon's Castle 7F ; indirect control flow target (via $8EBD) ; call to code in a different bank ($0F:$FA32) 0x019358|$06:$9348:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01935B|$06:$934B:E4 ; String ID #$02E4: ‘Who comes hither to disturb the Great Hargon?’[wait][line]‘Dost thou know who I am?’[FD][FD][end-FC] ; data -> code 0x01935C|$06:$934C:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x01935F|$06:$934F:C9 00 CMP #$00 ; YES 0x019361|$06:$9351:D0 04 BNE $9357 0x019363|$06:$9353:A9 E5 LDA #$E5 ; String ID #$02E5: ‘Such audacity is unforgivable!’[end-FC] 0x019365|$06:$9355:D0 02 BNE $9359 ; control flow target (from $9351) 0x019367|$06:$9357:A9 E6 LDA #$E6 ; String ID #$02E6: ‘Then I shall teach the proper respect!’[end-FC] ; control flow target (from $9355) ; call to code in a different bank ($0F:$FA52) 0x019369|$06:$9359:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 ; call to code in a different bank ($0F:$D0F5) 0x01936C|$06:$935C:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 ; call to code in a different bank ($0F:$D1F8) 0x01936F|$06:$935F:20 F8 D1 JSR $D1F8 ; trigger Fixed Battle #$0B: 1 Hargon (Map ID #$17: Hargon's Castle 7F) 0x019372|$06:$9362:A5 98 LDA $98 ; outcome of last fight? 0x019374|$06:$9364:C9 FC CMP #$FC 0x019376|$06:$9366:F0 14 BEQ $937C ; call to code in a different bank ($0F:$F6F6) 0x019378|$06:$9368: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 0x01937B|$06:$936B:E7 ; String ID #$02E7: ‘So thou hast proven a mighty warrior, mightier even than Hargon the Great[.’][wait][line]‘But there is one even greater than I, a sorcerer of the Shadowtime,[wait][line]a being of pure malice that none shall overcome[.’][wait][line]‘I send thee now to meet Malroth!’[end-FC] ; data -> code 0x01937C|$06:$936C:A9 FF LDA #$FF 0x01937E|$06:$936E:8D 61 05 STA $0561 ; NPC #$04 sprite ID ; call to code in a different bank ($0F:$CF64) 0x019381|$06:$9371:20 64 CF JSR $CF64 ; call to code in a different bank ($0F:$D0F5) 0x019384|$06:$9374:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x019387|$06:$9377:A9 64 LDA #$64 0x019389|$06:$9379: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) 0x01938B|$06:$937B:60 RTS ; control flow target (from $9366) 0x01938C|$06:$937C:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$BC: Dragonlord's Grandson in Map ID #$18: Charlock Castle B8 ; indirect control flow target (via $8EBF) 0x01938F|$06:$937F:A9 00 LDA #$00 ; Midenhall ; call to code in a different bank ($0F:$FC50) 0x019391|$06:$9381:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x019394|$06:$9384:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019397|$06:$9387:EA ; String ID #$02EA: ‘Welcome, [name][.’][wait][line]‘All that Hargon threatens to take is really mine, for I am the grandson of the Dragonlord[.’][wait][line]‘Defeat Hargon and I will give thee advice.[line]Will thou do this?’[FD][FD][end-FC] ; data -> code 0x019398|$06:$9388:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x01939B|$06:$938B:C9 00 CMP #$00 ; YES 0x01939D|$06:$938D:D0 04 BNE $9393 0x01939F|$06:$938F:A9 F0 LDA #$F0 ; String ID #$02F0: ‘Once thou hast the five crests, seek out the good wizard, Rubiss,[wait][line]who dwells in the depths of the sea south of Midenhall[.’][end-FC] 0x0193A1|$06:$9391:D0 02 BNE $9395 ; control flow target (from $938D) 0x0193A3|$06:$9393:A9 F1 LDA #$F1 ; String ID #$02F1: ‘Thou art surely missing thy brain.[line]But it is up to thee[.’][end-FC] ; control flow target (from $9391) ; call to code in a different bank ($0F:$FA52) 0x0193A5|$06:$9395:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x0193A8|$06:$9398:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$BD: Guard in Map ID #$1A: Shrine SW of Cannock ; indirect control flow target (via $8EC1) 0x0193AB|$06:$939B:A9 BD LDA #$BD ; dialogue ID 0x0193AD|$06:$939D:D0 02 BNE $93A1 ; handler for dialogue ID #$BE: Guard in Map ID #$1A: Shrine SW of Cannock ; indirect control flow target (via $8EC3) 0x0193AF|$06:$939F:A9 BE LDA #$BE ; dialogue ID ; control flow target (from $939D) 0x0193B1|$06:$93A1:85 49 STA $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$F6CE) 0x0193B3|$06:$93A3:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x0193B6|$06:$93A6:D0 0E BNE $93B6 ; if Midenhall is alone, he can't pass 0x0193B8|$06:$93A8:A5 49 LDA $49 ; object hero/target/item/string ID $49 0x0193BA|$06:$93AA:C9 BD CMP #$BD 0x0193BC|$06:$93AC:D0 04 BNE $93B2 0x0193BE|$06:$93AE:A9 F3 LDA #$F3 ; String ID #$02F3: ‘It is dangerous to tread some roads alone[.’][end-FC] 0x0193C0|$06:$93B0:D0 06 BNE $93B8 ; control flow target (from $93AC) 0x0193C2|$06:$93B2:A9 F4 LDA #$F4 ; String ID #$02F4: ‘The King of Cannock has left orders that none shall pass alone[.’][end-FC] 0x0193C4|$06:$93B4:D0 02 BNE $93B8 ; control flow target (from $93A6) 0x0193C6|$06:$93B6:A9 EB LDA #$EB ; String ID #$02EB: ‘Please go through[.’][end-FC] ; control flow target (from $93B0, $93B4) ; call to code in a different bank ($0F:$FA52) 0x0193C8|$06:$93B8:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x0193CB|$06:$93BB:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$BF: Wizard in Map ID #$1C: Shrine SE of Rimuldar ; indirect control flow target (via $8EC5) 0x0193CE|$06:$93BE:A9 23 LDA #$23 ; Item ID #$23: Helmet of Erdrick 0x0193D0|$06:$93C0: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 0x0193D3|$06:$93C3:30 04 BMI $93C9 0x0193D5|$06:$93C5:A9 F7 LDA #$F7 ; String ID #$02F7: ‘Thou hast no further business here. Go[.’][end-FC] 0x0193D7|$06:$93C7:D0 12 BNE $93DB ; control flow target (from $93C3) 0x0193D9|$06:$93C9:A9 24 LDA #$24 ; Item ID #$24: Token of Erdrick 0x0193DB|$06:$93CB: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 0x0193DE|$06:$93CE:10 04 BPL $93D4 0x0193E0|$06:$93D0:A9 F5 LDA #$F5 ; String ID #$02F5: ‘The real descendant of Erdrick carries a token to prove his heritage[.’][wait][line]‘Now be off with thee, imposter[.’][end-FC] 0x0193E2|$06:$93D2:D0 07 BNE $93DB ; control flow target (from $93CE) 0x0193E4|$06:$93D4:A9 23 LDA #$23 ; Item ID #$23: Helmet of Erdrick 0x0193E6|$06:$93D6:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x0193E9|$06:$93D9:A9 F6 LDA #$F6 ; String ID #$02F6: ‘I have been waiting for thee to come[.’][wait][line]‘I will trade the Helmet of Erdrick for the token thou carries[.’][end-FC] ; control flow target (from $93C7, $93D2) ; call to code in a different bank ($0F:$FA52) 0x0193EB|$06:$93DB:20 52 FA JSR $FA52 ; display string ID specified by A + #$0200 0x0193EE|$06:$93DE:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$C0: Wizard in Map ID #$15: Beran ; indirect control flow target (via $8EC7) 0x0193F1|$06:$93E1:A9 04 LDA #$04 ; Save Point ID #$04: Beran ; update save point $48 to A, run through the whole save point sequence ; control flow target (from $81C2) 0x0193F3|$06:$93E3:85 48 STA $48 ; last save point ID 0x0193F5|$06:$93E5:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero ; call to code in a different bank ($0F:$FC50) 0x0193F8|$06:$93E8:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x0193FB|$06:$93EB:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x0193FE|$06:$93EE:F8 ; String ID #$02F8: ‘Even here thou can record thy deeds in the Imperial Scrolls of Honor[.’][wait][end-FC] ; data -> code 0x0193FF|$06:$93EF:20 66 94 JSR $9466 ; display EXP to next level messages for entire party ; call to code in a different bank ($0F:$FA32) 0x019402|$06:$93F2:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019405|$06:$93F5:87 ; String ID #$0287: ‘Dost thou wish to save thy deeds in the Imperial Scrolls of Honor?’[FD][FD][end-FC] ; data -> code 0x019406|$06:$93F6:20 5D A3 JSR $A35D ; save game handler ; call to code in a different bank ($0F:$FA32) 0x019409|$06:$93F9:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01940C|$06:$93FC:F9 ; String ID #$02F9: [wait]‘Return when in need[.’][end-FC] ; data -> code 0x01940D|$06:$93FD:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$C1: Priest in Map ID #$1F: Rhone Shrine ; indirect control flow target (via $8EC9) 0x019410|$06:$9400:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero 0x019413|$06:$9403:48 PHA ; ID of first living hero at start of conversation ; call to code in a different bank ($0F:$FC50) 0x019414|$06:$9404:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x019417|$06:$9407:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01941A|$06:$940A:FA ; String ID #$02FA: ‘May the light shine upon thee, [name][.’][FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$C515) 0x01941B|$06:$940B:20 15 C5 JSR $C515 ; flash screen 10 times 0x01941E|$06:$940E:A9 84 LDA #$84 ; everybody's alive and in your party! 0x019420|$06:$9410:8D 2D 06 STA $062D ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x019423|$06:$9413:8D 3F 06 STA $063F ; Cannock status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x019426|$06:$9416:8D 51 06 STA $0651 ; Moonbrooke status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) ; call to code in a different bank ($0F:$C77B) 0x019429|$06:$9419:20 7B C7 JSR $C77B ; restore full HP/MP to all living party members 0x01942C|$06:$941C:A9 00 LDA #$00 0x01942E|$06:$941E:85 97 STA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$D302) 0x019430|$06:$9420:20 02 D3 JSR $D302 0x019433|$06:$9423:A9 01 LDA #$01 0x019435|$06:$9425:85 97 STA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$D302) 0x019437|$06:$9427:20 02 D3 JSR $D302 0x01943A|$06:$942A:A9 02 LDA #$02 0x01943C|$06:$942C:85 97 STA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$D302) 0x01943E|$06:$942E:20 02 D3 JSR $D302 ; call to code in a different bank ($0F:$C22C) 0x019441|$06:$9431:20 2C C2 JSR $C22C 0x019444|$06:$9434:20 66 94 JSR $9466 ; display EXP to next level messages for entire party ; call to code in a different bank ($0F:$FA32) 0x019447|$06:$9437:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01944A|$06:$943A:87 ; String ID #$0287: ‘Dost thou wish to save thy deeds in the Imperial Scrolls of Honor?’[FD][FD][end-FC] ; data -> code 0x01944B|$06:$943B:A9 05 LDA #$05 ; Save Point ID #$05: Rhone Shrine 0x01944D|$06:$943D:85 48 STA $48 ; last save point ID 0x01944F|$06:$943F:20 5D A3 JSR $A35D ; save game handler 0x019452|$06:$9442:68 PLA ; ID of first living hero at start of conversation ; call to code in a different bank ($0F:$FC50) 0x019453|$06:$9443:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA32) 0x019456|$06:$9446:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019459|$06:$9449:FB ; String ID #$02FB: [wait]‘Go now, [name][.’][end-FC] ; data -> code 0x01945A|$06:$944A:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue ID #$C2: Priest in Map ID #$20: Shrine SW of Moonbrooke ; indirect control flow target (via $8ECB) 0x01945D|$06:$944D:A9 02 LDA #$02 ; Moonbrooke 0x01945F|$06:$944F:85 97 STA $97 ; subject hero ID $97 0x019461|$06:$9451:A9 04 LDA #$04 ; In Party 0x019463|$06:$9453:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x019466|$06:$9456:B0 07 BCS $945F ; call to code in a different bank ($0F:$FA32) 0x019468|$06:$9458:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data 0x01946B|$06:$945B:FC ; String ID #$02FC: ‘None shall pass until aid has been rendered to the Princess of Moonbrooke[.’][end-FC] ; data -> code 0x01946C|$06:$945C:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9456) ; call to code in a different bank ($0F:$FA32) 0x01946F|$06:$945F:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019472|$06:$9462:00 ; String ID #$0200: ‘When in need, visit the Houses of Healing[.’][end-FC] ; data -> code 0x019473|$06:$9463:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; display EXP to next level messages for entire party ; control flow target (from $8ED9, $8F15, $8F5C, $8FDB, $9182, $91FE, $93EF, $9434) 0x019476|$06:$9466:A9 00 LDA #$00 ; Midenhall 0x019478|$06:$9468:85 97 STA $97 ; subject hero ID $97 ; control flow target (from $9490) 0x01947A|$06:$946A:A9 04 LDA #$04 ; In Party 0x01947C|$06:$946C:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise ; skip if not in party 0x01947F|$06:$946F:90 19 BCC $948A 0x019481|$06:$9471:A5 97 LDA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$F734) 0x019483|$06:$9473:20 34 F7 JSR $F734 ; set $8F-$90 to EXP required to reach next level 0x019486|$06:$9476:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA 0x019489|$06:$9479:A5 8F LDA $8F 0x01948B|$06:$947B:05 90 ORA $90 0x01948D|$06:$947D:D0 07 BNE $9486 ; different messages depending on whether you're at max EXP or not ; call to code in a different bank ($0F:$FA2A) 0x01948F|$06:$947F:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x019492|$06:$9482:52 ; String ID #$0052: ‘[name] is now strong enough[.’][wait][end-FC] ; data -> code 0x019493|$06:$9483:4C 8A 94 JMP $948A ; control flow target (from $947D) ; call to code in a different bank ($0F:$FA32) 0x019496|$06:$9486:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x019499|$06:$9489:8F ; String ID #$028F: ‘Of experience points [name] needs [number] to reach the next level[.’][wait][end-FC] ; data -> code ; control flow target (from $946F, $9483) 0x01949A|$06:$948A:E6 97 INC $97 ; subject hero ID $97 0x01949C|$06:$948C:A5 97 LDA $97 ; subject hero ID $97 0x01949E|$06:$948E:C9 03 CMP #$03 ; max of 3 heroes 0x0194A0|$06:$9490:90 D8 BCC $946A ; if more heroes to handle, handle them 0x0194A2|$06:$9492:60 RTS ; SEC if Moonbrooke in party, CLC otherwise ; control flow target (from $9095) 0x0194A3|$06:$9493:A9 02 LDA #$02 ; Moonbrooke 0x0194A5|$06:$9495:85 97 STA $97 ; subject hero ID $97 0x0194A7|$06:$9497:A9 04 LDA #$04 ; In Party 0x0194A9|$06:$9499:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x0194AC|$06:$949C:60 RTS ; SEC if Moonbrooke alive, CLC otherwise ; control flow target (from $9106, $9112) 0x0194AD|$06:$949D:A9 02 LDA #$02 ; Moonbrooke 0x0194AF|$06:$949F:85 97 STA $97 ; subject hero ID $97 0x0194B1|$06:$94A1:A9 80 LDA #$80 ; Alive 0x0194B3|$06:$94A3:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x0194B6|$06:$94A6:60 RTS ; X = A mod 8, A = A / 8 ; control flow target (from $92C8, $92D8) 0x0194B7|$06:$94A7:48 PHA 0x0194B8|$06:$94A8:29 07 AND #$07 0x0194BA|$06:$94AA:AA TAX 0x0194BB|$06:$94AB:68 PLA 0x0194BC|$06:$94AC:4A LSR 0x0194BD|$06:$94AD:4A LSR 0x0194BE|$06:$94AE:4A LSR 0x0194BF|$06:$94AF:60 RTS ; handler for dialogue IDs #$C3-#$CC (open dialogue window and display string specified by A - #$73) ; control flow target (from $8205) 0x0194C0|$06:$94B0:38 SEC 0x0194C1|$06:$94B1:E9 73 SBC #$73 ; convert to string ID 0x0194C3|$06:$94B3:48 PHA 0x0194C4|$06:$94B4:20 CB 9A JSR $9ACB ; open dialogue window 0x0194C7|$06:$94B7:68 PLA ; String IDs #$50-#$59: "‘Take care that thou strays not over the tower's edge[.’][end-FC]" / "‘As the full moon waxes and wanes so too the tide rises and falls[.’][end-FC]" / "‘[name] is now strong enough[.’][wait][end-FC]" / "And [cardinal #] [monster(s)][line]appeared.[end-FC]" / "[cardinal #] [monster(s)][line]appeared.[end-FC]" / "[end-FC]" / "[end-FC]" / "‘In ancient times a volcano rose from the seabed, and inside was a deep cavern[.’][end-FC]" / "[end-FC]" / "[end-FC]" ; call to code in a different bank ($0F:$FA4A) 0x0194C8|$06:$94B8:20 4A FA JSR $FA4A ; display string ID specified by A 0x0194CB|$06:$94BB:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue IDs #$CD-#$CF (open dialogue window, display string specified by A - #$73, display YES/NO menu, and display string corresponding to selected option) ; control flow target (from $820C) 0x0194CE|$06:$94BE:38 SEC 0x0194CF|$06:$94BF:E9 CD SBC #$CD ; why not just SBC #$73? 0x0194D1|$06:$94C1:18 CLC 0x0194D2|$06:$94C2:69 5A ADC #$5A ; String IDs #$5A-#$5C: "‘Hast thou purified thy body in the Spring of Bravery?’[end-FC]" / "‘Dost thou know what I know?’[FD][FD][end-FC]" / "‘Hast thou found the Wizard's Home?’[FD][FD][end-FC]" 0x0194D4|$06:$94C4:85 49 STA $49 ; object hero/target/item/string ID $49 0x0194D6|$06:$94C6:20 CB 9A JSR $9ACB ; open dialogue window 0x0194D9|$06:$94C9:A5 49 LDA $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$FA4A) 0x0194DB|$06:$94CB:20 4A FA JSR $FA4A ; display string ID specified by A 0x0194DE|$06:$94CE:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x0194E1|$06:$94D1:C9 00 CMP #$00 ; YES 0x0194E3|$06:$94D3:D0 04 BNE $94D9 0x0194E5|$06:$94D5:A9 03 LDA #$03 ; String IDs #$5D-#$5F: "‘Then all is well[.’][end-FC]" / "‘But I have not yet spoken[.’][end-FC]" / "‘Go then, for thou must defeat Hargon[.’][end-FC]" 0x0194E7|$06:$94D7:D0 02 BNE $94DB ; control flow target (from $94D3) 0x0194E9|$06:$94D9:A9 06 LDA #$06 ; String IDs #$60-#$62: "‘That is not good[.’][wait][line]‘All who seek victory must first visit the Spring of Bravery[.’][end-FC]" / "‘These twin towers are known as the Dragon's Horn[.’][end-FC]" / "‘Thou art close to the island cave wherein lies an object of great power and greater peril!’[end-FC]" ; control flow target (from $94D7) 0x0194EB|$06:$94DB:18 CLC 0x0194EC|$06:$94DC:65 49 ADC $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$FA4A) 0x0194EE|$06:$94DE:20 4A FA JSR $FA4A ; display string ID specified by A 0x0194F1|$06:$94E1:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; handler for dialogue IDs #$D0-#$D8 (dungeon NPCs with complex logic) ; control flow target (from $8213) 0x0194F4|$06:$94E4:48 PHA ; dialogue ID 0x0194F5|$06:$94E5:20 CB 9A JSR $9ACB ; open dialogue window 0x0194F8|$06:$94E8:68 PLA ; dialogue ID 0x0194F9|$06:$94E9:C9 D0 CMP #$D0 ; dialogue ID #$D0: Wizard in Map ID #$40: Spring of Bravery 0x0194FB|$06:$94EB:D0 38 BNE $9525 ; call to code in a different bank ($0F:$FA2A) 0x0194FD|$06:$94ED:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x019500|$06:$94F0:6A ; String ID #$006A: ‘Welcome to the Spring of Bravery[.’][wait][end-FC] ; data -> code 0x019501|$06:$94F1: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) 0x019503|$06:$94F3:C9 01 CMP #$01 0x019505|$06:$94F5:F0 04 BEQ $94FB 0x019507|$06:$94F7:C9 02 CMP #$02 0x019509|$06:$94F9:D0 1A BNE $9515 ; control flow target (from $94F5) ; call to code in a different bank ($0F:$FA2A) 0x01950B|$06:$94FB:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x01950E|$06:$94FE:64 ; String ID #$0064: ‘Art thou seeking the Prince of Cannock?’[FD][FD][end-FC] ; data -> code 0x01950F|$06:$94FF:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x019512|$06:$9502:C9 00 CMP #$00 ; YES 0x019514|$06:$9504:D0 0F BNE $9515 0x019516|$06:$9506: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) 0x019518|$06:$9508:C9 01 CMP #$01 0x01951A|$06:$950A:D0 02 BNE $950E 0x01951C|$06:$950C:E6 CA INC $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) ; control flow target (from $950A) ; call to code in a different bank ($0F:$FA2A) 0x01951E|$06:$950E:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x019521|$06:$9511:65 ; String ID #$0065: ‘Only moments ago he was here.[line]I think he is going to Midenhall Castle[.’][end-FC] ; data -> code 0x019522|$06:$9512:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $94F9, $9504) ; call to code in a different bank ($0F:$FA2A) 0x019525|$06:$9515:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x019528|$06:$9518:63 ; String ID #$0063: ‘I shall anoint thee with this water and wish thee well[.’][wait][line]‘Know that Token of Erdrick is kept by a brave hero[.’][end-FC] ; data -> code ; call to code in a different bank ($0F:$C515) 0x019529|$06:$9519:20 15 C5 JSR $C515 ; flash screen 10 times 0x01952C|$06:$951C:20 CC 8D JSR $8DCC ; restore full HP to all living party members ; call to code in a different bank ($0F:$C22C) 0x01952F|$06:$951F:20 2C C2 JSR $C22C 0x019532|$06:$9522:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $94EB) 0x019535|$06:$9525:C9 D1 CMP #$D1 ; dialogue ID #$D1: Wizard in Map ID #$56: Lighthouse 7F 0x019537|$06:$9527:D0 07 BNE $9530 ; call to code in a different bank ($0F:$FA2E) 0x019539|$06:$9529:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data 0x01953C|$06:$952C:52 ; String ID #$0152: ‘Follow me and do not make a peep[.’][end-FC] ; data -> code 0x01953D|$06:$952D:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9527) 0x019540|$06:$9530:C9 D6 CMP #$D6 ; dialogue ID #$D6: Guard in Map ID ; Map ID #$57: Lighthouse 8F 0x019542|$06:$9532:D0 0B BNE $953F ; call to code in a different bank ($0F:$FA2A) 0x019544|$06:$9534:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x019547|$06:$9537:70 ; String ID #$0070: ‘For long ages have I guarded the Chamber of Hargon[.’][wait][end-FC] ; data -> code ; call to code in a different bank ($0F:$FA2A) 0x019548|$06:$9538:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x01954B|$06:$953B:71 ; String ID #$0071: ‘There is a land called Rhone, high in the mountains in the middle of a great continent[.’][wait][line]‘There shall thou find Hargon[.’][end-FC] ; data -> code 0x01954C|$06:$953C:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9532) 0x01954F|$06:$953F:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; exit COMMAND menu ; control flow target (from $9560, $9569, $958A, $95B8, $9630, $99C8) ; call to code in a different bank ($0F:$FA89) 0x019552|$06:$9542:20 89 FA JSR $FA89 ; useless JSR to RTS?! 0x019555|$06:$9545:4C 6D 80 JMP $806D ; exit COMMAND menu ; end TALK/ITEM routines ; control flow target (from $8C40, $8CD1, $8E41, $8E67, $8F09, $8F36, $8F82, $8FA9, $8FC9, $9016, $903C, $9062, $9074, $9092, $909E, $90A5, $90BC, $90EC, $90FF, $910F, $914A, $916B, $9178, $9194, $91E0, $91EA, $91F1, $9210, $924B, $928F, $9296, $92FB, $9329, $933B, $937C, $9398, $93BB, $93DE, $93FD, $944A, $945C, $9463, $94BB, $94E1, $9512, $9522, $952D, $953C, $953F, $957B, $95A4, $9603, $966C, $967E, $96CD, $96F6, $9745, $9754, $97E6, $97F1, $980C, $9822, $983B, $9845, $984F, $9859, $9863, $986D, $9877, $9881, $988B, $9892, $99BE, $99EC, $99FD, $9A14, $9A44, $9A66, $9A81, $9ABA, $9AC1, $9AC8, $9B81, $9BA3, $9BB7, $9BEF, $9C02, $9C34, $9C5F, $9C90, $9CBE, $9D4C) 0x019558|$06:$9548:A5 8E LDA $8E ; flag for in battle or not (#$FF)? 0x01955A|$06:$954A:10 01 BPL $954D 0x01955C|$06:$954C:60 RTS ; control flow target (from $954A) 0x01955D|$06:$954D:20 9D 80 JSR $809D ; wait until all joypad buttons are released and then some button pressed ; call to code in a different bank ($0F:$FA89) 0x019560|$06:$9550:20 89 FA JSR $FA89 ; useless JSR to RTS?! 0x019563|$06:$9553:A9 00 LDA #$00 ; call to code in a different bank ($0F:$CF6A) 0x019565|$06:$9555:20 6A CF JSR $CF6A ; wipe selected menu region 0x019568|$06:$9558:4C 6D 80 JMP $806D ; exit COMMAND menu ; COMMAND menu ITEM command handler ; indirect control flow target (via $808C) ; call to code in a different bank ($0F:$F55D) 0x01956B|$06:$955B:20 5D F5 JSR $F55D ; display appropriate main ITEM hero select menu 0x01956E|$06:$955E:C9 FF CMP #$FF 0x019570|$06:$9560:F0 E0 BEQ $9542 ; exit COMMAND menu 0x019572|$06:$9562:85 97 STA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$F5FE) 0x019574|$06:$9564:20 FE F5 JSR $F5FE ; given a hero ID in A, open hero's item list and return selected item ID (or #$FE if they have no items) 0x019577|$06:$9567:C9 FF CMP #$FF 0x019579|$06:$9569:F0 D7 BEQ $9542 ; exit COMMAND menu 0x01957B|$06:$956B:C9 FE CMP #$FE 0x01957D|$06:$956D:D0 0F BNE $957E ; hero has selected an item to use 0x01957F|$06:$956F:20 CB 9A JSR $9ACB ; open dialogue window 0x019582|$06:$9572:A5 97 LDA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$FC50) 0x019584|$06:$9574:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019587|$06:$9577:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01958A|$06:$957A:13 ; String ID #$0113: [name] does not yet have anything.[end-FC] ; data -> code 0x01958B|$06:$957B:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; hero has selected an item to use ; control flow target (from $956D) 0x01958E|$06:$957E:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x019590|$06:$9580:85 95 STA $95 ; ID for [item] and [spell] control codes; item ID 0x019592|$06:$9582:86 49 STX $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$EB76) 0x019594|$06:$9584:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x019597|$06:$9587:17 ; Menu ID #$17: Main menu: what to do with selected item ; data -> code 0x019598|$06:$9588:C9 FF CMP #$FF 0x01959A|$06:$958A:F0 B6 BEQ $9542 ; exit COMMAND menu 0x01959C|$06:$958C:C9 01 CMP #$01 ; TRADE 0x01959E|$06:$958E:90 03 BCC $9593 ; USE handler 0x0195A0|$06:$9590:4C A8 99 JMP $99A8 ; TRADE/THROW handler ; USE handler ; control flow target (from $958E) 0x0195A3|$06:$9593:A9 80 LDA #$80 ; Alive 0x0195A5|$06:$9595:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x0195A8|$06:$9598:B0 0D BCS $95A7 ; USE handler, hero alive 0x0195AA|$06:$959A:20 CB 9A JSR $9ACB ; open dialogue window 0x0195AD|$06:$959D:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x0195B0|$06:$95A0:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0195B3|$06:$95A3:1F ; String ID #$011F: Alas, being but a ghost, [name] cannot use the [item].[end-FC] ; data -> code 0x0195B4|$06:$95A4:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; USE handler, hero alive ; control flow target (from $9598) 0x0195B7|$06:$95A7:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x0195B9|$06:$95A9:C9 3C CMP #$3C ; Item ID #$3C: Medical Herb 0x0195BB|$06:$95AB:F0 04 BEQ $95B1 ; USE Medical/Antidote Herb 0x0195BD|$06:$95AD:C9 3B CMP #$3B ; Item ID #$3B: Antidote Herb 0x0195BF|$06:$95AF:D0 74 BNE $9625 ; USE Medical/Antidote Herb ; control flow target (from $95AB) ; call to code in a different bank ($0F:$F587) 0x0195C1|$06:$95B1:20 87 F5 JSR $F587 ; display appropriate main ITEM target menu 0x0195C4|$06:$95B4:C9 FF CMP #$FF 0x0195C6|$06:$95B6:D0 03 BNE $95BB 0x0195C8|$06:$95B8:4C 42 95 JMP $9542 ; exit COMMAND menu ; control flow target (from $95B6) 0x0195CB|$06:$95BB:85 C9 STA $C9 ; target hero ID 0x0195CD|$06:$95BD:20 CB 9A JSR $9ACB ; open dialogue window 0x0195D0|$06:$95C0:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA 0x0195D3|$06:$95C3:A5 97 LDA $97 ; subject hero ID $97 0x0195D5|$06:$95C5:C5 C9 CMP $C9 ; target hero ID 0x0195D7|$06:$95C7:F0 0D BEQ $95D6 ; use different strings depending on whether hero uses item on themself or another hero ; call to code in a different bank ($0F:$FA2E) 0x0195D9|$06:$95C9:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0195DC|$06:$95CC:20 ; String ID #$0120: [name] [end-FF] ; data -> code 0x0195DD|$06:$95CD:A5 C9 LDA $C9 ; target hero ID ; call to code in a different bank ($0F:$FC50) 0x0195DF|$06:$95CF:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA 0x0195E2|$06:$95D2:A9 1D LDA #$1D ; String ID #$011D: used the [item] on [name].[end-FC] 0x0195E4|$06:$95D4:D0 02 BNE $95D8 ; control flow target (from $95C7) 0x0195E6|$06:$95D6:A9 1E LDA #$1E ; String ID #$011E: [name] used the [item].[end-FC] ; control flow target (from $95D4) ; call to code in a different bank ($0F:$FA4E) 0x0195E8|$06:$95D8:20 4E FA JSR $FA4E ; display string ID specified by A + #$0100 0x0195EB|$06:$95DB:A5 97 LDA $97 ; subject hero ID $97 0x0195ED|$06:$95DD:48 PHA ; subject hero ID 0x0195EE|$06:$95DE:A5 C9 LDA $C9 ; target hero ID 0x0195F0|$06:$95E0:85 97 STA $97 ; subject hero ID $97 0x0195F2|$06:$95E2:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x0195F4|$06:$95E4:C9 3C CMP #$3C ; Item ID #$3C: Medical Herb 0x0195F6|$06:$95E6:D0 1E BNE $9606 ; USE Antidote Herb 0x0195F8|$06:$95E8:A9 80 LDA #$80 ; Alive 0x0195FA|$06:$95EA:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x0195FD|$06:$95ED:90 0A BCC $95F9 ; Medical Herbs can't heal dead people 0x0195FF|$06:$95EF:A5 C9 LDA $C9 ; target hero ID 0x019601|$06:$95F1:A2 64 LDX #$64 ; Healing Power on field for Medical Herb ; call to code in a different bank ($0F:$F72B) 0x019603|$06:$95F3:20 2B F7 JSR $F72B ; heal hero ID in A by random amount based on healing power in X ; call to code in a different bank ($0F:$C22C) 0x019606|$06:$95F6:20 2C C2 JSR $C22C ; control flow target (from $95ED, $960B, $961A) 0x019609|$06:$95F9:68 PLA ; subject hero ID 0x01960A|$06:$95FA:A6 49 LDX $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$C4D4) 0x01960C|$06:$95FC:20 D4 C4 JSR $C4D4 ; 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 ; call to code in a different bank ($0F:$EB76) 0x01960F|$06:$95FF:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x019612|$06:$9602:01 ; Menu ID #$01: Mini status window, top ; data -> code 0x019613|$06:$9603:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; USE Antidote Herb ; control flow target (from $95E6) 0x019616|$06:$9606:A9 80 LDA #$80 ; Alive 0x019618|$06:$9608:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x01961B|$06:$960B:90 EC BCC $95F9 ; Antidote Herbs can't heal dead people 0x01961D|$06:$960D:A5 C9 LDA $C9 ; target hero ID 0x01961F|$06:$960F:20 AC 8D JSR $8DAC ; given hero ID in A, set Y to start of hero's data in $062D,Y, i.e. Y = A * #$12 0x019622|$06:$9612:A9 DF LDA #$DF ; clear Poison 0x019624|$06:$9614:39 2D 06 AND $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x019627|$06:$9617:99 2D 06 STA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01962A|$06:$961A:4C F9 95 JMP $95F9 ; given hero ID in $97 and hero inventory offset in $49, remove that item from hero's inventory and move all lower items up 1 slot ; control flow target (from $9634, $965E, $967B, $9809) 0x01962D|$06:$961D:A5 97 LDA $97 ; subject hero ID $97 0x01962F|$06:$961F:A6 49 LDX $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$C4D4) 0x019631|$06:$9621:20 D4 C4 JSR $C4D4 ; 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 0x019634|$06:$9624:60 RTS ; control flow target (from $95AF) 0x019635|$06:$9625:C9 29 CMP #$29 ; Item ID #$29: Leaf of The World Tree 0x019637|$06:$9627:D0 25 BNE $964E ; call to code in a different bank ($0F:$F587) 0x019639|$06:$9629:20 87 F5 JSR $F587 ; display appropriate main ITEM target menu 0x01963C|$06:$962C:C9 FF CMP #$FF 0x01963E|$06:$962E:D0 03 BNE $9633 ; USE Item ID #$29: Leaf of The World Tree on target hero 0x019640|$06:$9630:4C 42 95 JMP $9542 ; exit COMMAND menu ; USE Item ID #$29: Leaf of The World Tree on target hero ; control flow target (from $962E) 0x019643|$06:$9633:48 PHA ; target hero ID 0x019644|$06:$9634:20 1D 96 JSR $961D ; given hero ID in $97 and hero inventory offset in $49, remove that item from hero's inventory and move all lower items up 1 slot 0x019647|$06:$9637:20 CB 9A JSR $9ACB ; open dialogue window 0x01964A|$06:$963A:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01964D|$06:$963D:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019650|$06:$9640:20 ; String ID #$0120: [name] [end-FF] ; data -> code 0x019651|$06:$9641:68 PLA ; target hero ID 0x019652|$06:$9642:85 49 STA $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$FC50) 0x019654|$06:$9644:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019657|$06:$9647:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01965A|$06:$964A:32 ; String ID #$0132: ground up the Leaf of the World Tree and gave it to [name].[wait][end-FC] ; data -> code 0x01965B|$06:$964B:4C 9F 8C JMP $8C9F ; spell ID is not #$09, #$0B, #$0D, #$10, or #$12-#$16; ergo it's Spell ID #$17: Revive ; control flow target (from $9627) 0x01965E|$06:$964E:48 PHA ; item ID 0x01965F|$06:$964F:20 CB 9A JSR $9ACB ; open dialogue window 0x019662|$06:$9652:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA 0x019665|$06:$9655:68 PLA ; item ID 0x019666|$06:$9656:C9 35 CMP #$35 ; Item ID #$35: Wing of the Wyvern 0x019668|$06:$9658:D0 0A BNE $9664 ; call to code in a different bank ($0F:$FA2E) 0x01966A|$06:$965A:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01966D|$06:$965D:21 ; String ID #$0121: [name] threw the Wing of the Wyvern into the air.[end-FC] ; data -> code 0x01966E|$06:$965E:20 1D 96 JSR $961D ; given hero ID in $97 and hero inventory offset in $49, remove that item from hero's inventory and move all lower items up 1 slot 0x019671|$06:$9661:4C 51 8C JMP $8C51 ; handler for Return spell effect ; control flow target (from $9658) 0x019674|$06:$9664:C9 25 CMP #$25 ; Item ID #$25: Tresures 0x019676|$06:$9666:D0 07 BNE $966F ; call to code in a different bank ($0F:$FA2E) 0x019678|$06:$9668:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01967B|$06:$966B:29 ; String ID #$0129: [name] could not open the treasure chest, for it was locked.[end-FC] ; data -> code 0x01967C|$06:$966C:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9666) 0x01967F|$06:$966F:C9 34 CMP #$34 ; Item ID #$34: Fairy Water 0x019681|$06:$9671:D0 0E BNE $9681 ; call to code in a different bank ($0F:$FA2E) 0x019683|$06:$9673:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019686|$06:$9676:2A ; String ID #$012A: [name] sprinkled the Fairy Water from head to toe.[end-FC] ; data -> code 0x019687|$06:$9677:A9 FF LDA #$FF 0x019689|$06:$9679:85 46 STA $46 ; Repel (#$FE) / Fairy Water (#$FF) flag 0x01968B|$06:$967B:20 1D 96 JSR $961D ; given hero ID in $97 and hero inventory offset in $49, remove that item from hero's inventory and move all lower items up 1 slot 0x01968E|$06:$967E:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9671) 0x019691|$06:$9681:C9 28 CMP #$28 ; Item ID #$28: Eye of Malroth 0x019693|$06:$9683:D0 4B BNE $96D0 ; call to code in a different bank ($0F:$FA2E) 0x019695|$06:$9685:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019698|$06:$9688:31 ; String ID #$0131: [name] held high the Eye of Malroth.[end-FC] ; data -> code 0x019699|$06:$9689:A5 31 LDA $31 ; current map ID 0x01969B|$06:$968B:C9 01 CMP #$01 ; Map ID #$01: World Map 0x01969D|$06:$968D:D0 24 BNE $96B3 ; if not World Map, go check Hagon's Castle 1F 0x01969F|$06:$968F:AD F9 05 LDA $05F9 ; flag for Cave to Rhone open 0x0196A2|$06:$9692:D0 35 BNE $96C9 ; item useless here 0x0196A4|$06:$9694:A5 16 LDA $16 ; current map X-pos (1) 0x0196A6|$06:$9696:C9 71 CMP #$71 ; X-pos range for successful use: #$71 - #$76 inclusive 0x0196A8|$06:$9698:90 2F BCC $96C9 ; item useless here 0x0196AA|$06:$969A:C9 77 CMP #$77 0x0196AC|$06:$969C:B0 2B BCS $96C9 ; item useless here 0x0196AE|$06:$969E:A5 17 LDA $17 ; current map Y-pos (1) 0x0196B0|$06:$96A0:C9 C6 CMP #$C6 ; Y-pos range for successful use: #$C6 - #$C8 inclusive 0x0196B2|$06:$96A2:90 25 BCC $96C9 ; item useless here 0x0196B4|$06:$96A4:C9 C9 CMP #$C9 0x0196B6|$06:$96A6:B0 21 BCS $96C9 ; item useless here ; call to code in a different bank ($0F:$D0F5) 0x0196B8|$06:$96A8:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x0196BB|$06:$96AB:A2 3C LDX #$3C ; call to code in a different bank ($0F:$C1EE) 0x0196BD|$06:$96AD:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF ; call to code in a different bank ($0F:$D23E) 0x0196C0|$06:$96B0:4C 3E D2 JMP $D23E ; control flow target (from $968D) 0x0196C3|$06:$96B3:C9 16 CMP #$16 ; Map ID #$16: Hargon's Castle 1F 0x0196C5|$06:$96B5:D0 12 BNE $96C9 ; item useless here ; call to code in a different bank ($0F:$CD26) 0x0196C7|$06:$96B7: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 0x0196CA|$06:$96BA:0D ; indirect data load target 0x0196CB|$06:$96BB:04 ; data -> code 0x0196CC|$06:$96BC:D0 0B BNE $96C9 ; item useless here 0x0196CE|$06:$96BE:A2 78 LDX #$78 ; call to code in a different bank ($0F:$C1EE) 0x0196D0|$06:$96C0:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF ; call to code in a different bank ($0F:$C515) 0x0196D3|$06:$96C3:20 15 C5 JSR $C515 ; flash screen 10 times ; call to code in a different bank ($0F:$D7A6) 0x0196D6|$06:$96C6:4C A6 D7 JMP $D7A6 ; item useless here ; control flow target (from $9692, $9698, $969C, $96A2, $96A6, $96B5, $96BC) ; call to code in a different bank ($0F:$FA2E) 0x0196D9|$06:$96C9:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0196DC|$06:$96CC:27 ; String ID #$0127: [wait]But nothing happened.[end-FC] ; data -> code 0x0196DD|$06:$96CD:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9683) 0x0196E0|$06:$96D0:C9 2B CMP #$2B ; Item ID #$2B: Mirror of Ra 0x0196E2|$06:$96D2:D0 74 BNE $9748 0x0196E4|$06:$96D4:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x0196E7|$06:$96D7:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0196EA|$06:$96DA:36 ; String ID #$0136: [name] held up the Mirror of Ra.[end-FC] ; data -> code 0x0196EB|$06:$96DB:A9 00 LDA #$00 0x0196ED|$06:$96DD:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs ; control flow target (from $96F0) 0x0196EF|$06:$96DF:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs ; call to code in a different bank ($0F:$CF70) 0x0196F1|$06:$96E1:20 70 CF JSR $CF70 0x0196F4|$06:$96E4:A5 0C LDA $0C 0x0196F6|$06:$96E6:C9 02 CMP #$02 ; Moonbrooke 0x0196F8|$06:$96E8:F0 0F BEQ $96F9 0x0196FA|$06:$96EA:E6 96 INC $96 ; temp storage for item/spell/type/etc. IDs 0x0196FC|$06:$96EC:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x0196FE|$06:$96EE:C9 04 CMP #$04 0x019700|$06:$96F0:D0 ED BNE $96DF ; call to code in a different bank ($0F:$FA2E) 0x019702|$06:$96F2:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019705|$06:$96F5:27 ; String ID #$0127: [wait]But nothing happened.[end-FC] ; data -> code 0x019706|$06:$96F6:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $96E8) 0x019709|$06:$96F9:A9 02 LDA #$02 ; Moonbrooke; useless op ; call to code in a different bank ($0F:$FC50) 0x01970B|$06:$96FB:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01970E|$06:$96FE:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019711|$06:$9701:37 ; String ID #$0137: [wait]Behold, the mirror reflected back the image of Princess [name].[wait][line]Suddenly it shattered and the enchantment was broken,[wait][line]freeing the princess from her furry form.[end-FC] ; data -> code 0x019712|$06:$9702:A5 97 LDA $97 ; subject hero ID $97 0x019714|$06:$9704:A6 49 LDX $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$C4D4) 0x019716|$06:$9706:20 D4 C4 JSR $C4D4 ; 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 ; call to code in a different bank ($0F:$D0F5) 0x019719|$06:$9709:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x01971C|$06:$970C:A2 28 LDX #$28 ; call to code in a different bank ($0F:$C1EE) 0x01971E|$06:$970E:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x019721|$06:$9711:A9 00 LDA #$00 0x019723|$06:$9713:8D 4A 05 STA $054A ; NPC #$01 scripted motion low byte 0x019726|$06:$9716:8D 4B 05 STA $054B ; NPC #$01 scripted motion high byte 0x019729|$06:$9719:A9 09 LDA #$09 0x01972B|$06:$971B:A0 1F LDY #$1F ; call to code in a different bank ($0F:$CD45) 0x01972D|$06:$971D:20 45 CD JSR $CD45 0x019730|$06:$9720:A9 02 LDA #$02 0x019732|$06:$9722:A0 1F LDY #$1F ; call to code in a different bank ($0F:$CD4B) 0x019734|$06:$9724:20 4B CD JSR $CD4B 0x019737|$06:$9727:20 72 81 JSR $8172 0x01973A|$06:$972A:A9 84 LDA #$84 ; add Moonbrooke to party 0x01973C|$06:$972C:8D 51 06 STA $0651 ; Moonbrooke status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01973F|$06:$972F:A9 02 LDA #$02 0x019741|$06:$9731:8D 51 05 STA $0551 ; NPC #$02 sprite ID ; control flow target (from $81B6) 0x019744|$06:$9734:20 CB 9A JSR $9ACB ; open dialogue window 0x019747|$06:$9737:A9 02 LDA #$02 ; Moonbrooke ; call to code in a different bank ($0F:$FC50) 0x019749|$06:$9739:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01974C|$06:$973C:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01974F|$06:$973F:57 ; String ID #$0157: ‘Oh, dear cousin, thou hast freed me beyond all hope[.’][wait][line]‘To repay this, I offer thee my loyalty and service as the Princess of Moonbrooke[.’][wait][line]‘Please, take me with thee on thy quest[.’][end-FC] ; data -> code 0x019750|$06:$9740:A9 07 LDA #$07 ; Music ID #$07: add party member BGM ; call to code in a different bank ($0F:$C58D) 0x019752|$06:$9742:20 8D C5 JSR $C58D ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]), wait for it to finish, then play previous BGM 0x019755|$06:$9745:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $96D2) 0x019758|$06:$9748:C9 2C CMP #$2C ; Item ID #$2C: Dew’s Yarn 0x01975A|$06:$974A:F0 04 BEQ $9750 0x01975C|$06:$974C:C9 2D CMP #$2D ; Item ID #$2D: Magic Loom 0x01975E|$06:$974E:D0 07 BNE $9757 ; control flow target (from $974A) ; call to code in a different bank ($0F:$FA2E) 0x019760|$06:$9750:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019763|$06:$9753:38 ; String ID #$0138: [name] tried to use the [item],[wait] but didn't know how.[end-FC] ; data -> code 0x019764|$06:$9754:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $974E) 0x019767|$06:$9757:C9 37 CMP #$37 ; Item ID #$37: Golden Key 0x019769|$06:$9759:D0 04 BNE $975F 0x01976B|$06:$975B:A9 01 LDA #$01 0x01976D|$06:$975D:D0 14 BNE $9773 ; control flow target (from $9759) 0x01976F|$06:$975F:C9 38 CMP #$38 ; Item ID #$38: Silver Key 0x019771|$06:$9761:D0 04 BNE $9767 0x019773|$06:$9763:A9 00 LDA #$00 0x019775|$06:$9765:F0 0C BEQ $9773 ; control flow target (from $9761) 0x019777|$06:$9767:C9 39 CMP #$39 ; Item ID #$39: Jailor’s Key 0x019779|$06:$9769:F0 06 BEQ $9771 0x01977B|$06:$976B:C9 3A CMP #$3A ; Item ID #$3A: Watergate Key 0x01977D|$06:$976D:F0 1E BEQ $978D ; check Watergate 0x01977F|$06:$976F:D0 78 BNE $97E9 ; control flow target (from $9769) 0x019781|$06:$9771:A9 02 LDA #$02 ; control flow target (from $975D, $9765) 0x019783|$06:$9773:85 C9 STA $C9 ; call to code in a different bank ($0F:$CF7C) 0x019785|$06:$9775:20 7C CF JSR $CF7C 0x019788|$06:$9778:A5 49 LDA $49 ; object hero/target/item/string ID $49 0x01978A|$06:$977A:D0 08 BNE $9784 0x01978C|$06:$977C:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x01978E|$06:$977E:C9 39 CMP #$39 ; Item ID #$39: Jailor’s Key 0x019790|$06:$9780:F0 57 BEQ $97D9 0x019792|$06:$9782:D0 51 BNE $97D5 ; control flow target (from $977A) 0x019794|$06:$9784:C9 01 CMP #$01 0x019796|$06:$9786:F0 59 BEQ $97E1 ; wrong key for door 0x019798|$06:$9788:A9 58 LDA #$58 ; String ID #$0158: The door opened.[end-FC] 0x01979A|$06:$978A:4C E3 97 JMP $97E3 ; check Watergate ; control flow target (from $976D) 0x01979D|$06:$978D:A5 31 LDA $31 ; current map ID 0x01979F|$06:$978F:C9 12 CMP #$12 ; Map ID #$12: Tuhn Watergate 0x0197A1|$06:$9791:D0 4A BNE $97DD ; call to code in a different bank ($0F:$CD26) 0x0197A3|$06:$9793: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 0x0197A6|$06:$9796:02 ; indirect data load target 0x0197A7|$06:$9797:04 ; data -> code 0x0197A8|$06:$9798:D0 43 BNE $97DD ; call to code in a different bank ($0F:$FA2E) 0x0197AA|$06:$979A:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0197AD|$06:$979D:59 ; String ID #$0159: The water gate opened.[end-FC] ; data -> code ; call to code in a different bank ($0F:$D0F5) 0x0197AE|$06:$979E:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x0197B1|$06:$97A1:A5 97 LDA $97 ; subject hero ID $97 0x0197B3|$06:$97A3:85 9C STA $9C 0x0197B5|$06:$97A5:A9 3A LDA #$3A ; Item ID #$3A: Watergate Key ; call to code in a different bank ($0F:$C4B6) 0x0197B7|$06:$97A7:20 B6 C4 JSR $C4B6 ; 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 0x0197BA|$06:$97AA:A9 04 LDA #$04 0x0197BC|$06:$97AC: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?) 0x0197BE|$06:$97AE:A9 01 LDA #$01 0x0197C0|$06:$97B0:85 CE STA $CE ; Tuhn Watergate open flag (#$00 = closed, #$01 = open) 0x0197C2|$06:$97B2:A9 00 LDA #$00 0x0197C4|$06:$97B4:85 18 STA $18 0x0197C6|$06:$97B6:A9 02 LDA #$02 0x0197C8|$06:$97B8:85 19 STA $19 ; call to code in a different bank ($0F:$D256) 0x0197CA|$06:$97BA:20 56 D2 JSR $D256 0x0197CD|$06:$97BD:A9 02 LDA #$02 0x0197CF|$06:$97BF:85 18 STA $18 ; call to code in a different bank ($0F:$D256) 0x0197D1|$06:$97C1:20 56 D2 JSR $D256 0x0197D4|$06:$97C4:A9 96 LDA #$96 ; Music ID #$96: Watergate SFX ; call to code in a different bank ($0F:$C561) 0x0197D6|$06:$97C6:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x0197D9|$06:$97C9:A2 3C LDX #$3C ; call to code in a different bank ($0F:$C1EE) 0x0197DB|$06:$97CB:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x0197DE|$06:$97CE:A9 32 LDA #$32 0x0197E0|$06:$97D0:85 41 STA $41 ; call to code in a different bank ($0F:$E938) 0x0197E2|$06:$97D2:4C 38 E9 JMP $E938 ; control flow target (from $9782) 0x0197E5|$06:$97D5:A9 3B LDA #$3B ; String ID #$013B: There is no door here.[end-FC] 0x0197E7|$06:$97D7:D0 0A BNE $97E3 ; control flow target (from $9780) 0x0197E9|$06:$97D9:A9 3C LDA #$3C ; String ID #$013C: There is no prison here.[end-FC] 0x0197EB|$06:$97DB:D0 06 BNE $97E3 ; control flow target (from $9791, $9798) 0x0197ED|$06:$97DD:A9 3D LDA #$3D ; String ID #$013D: This is not the water gate.[end-FC] 0x0197EF|$06:$97DF:D0 02 BNE $97E3 ; wrong key for door ; control flow target (from $9786) 0x0197F1|$06:$97E1:A9 3E LDA #$3E ; String ID #$013E: The key wouldn't turn in the lock.[end-FC] ; control flow target (from $978A, $97D7, $97DB, $97DF) ; call to code in a different bank ($0F:$FA4E) 0x0197F3|$06:$97E3:20 4E FA JSR $FA4E ; display string ID specified by A + #$0100 0x0197F6|$06:$97E6:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $976F) 0x0197F9|$06:$97E9:C9 33 CMP #$33 ; Item ID #$33: Lottery Ticket 0x0197FB|$06:$97EB:D0 07 BNE $97F4 ; call to code in a different bank ($0F:$FA2E) 0x0197FD|$06:$97ED:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019800|$06:$97F0:40 ; String ID #$0140: [name] eagerly handed over the lottery ticket.[end-FC] ; data -> code 0x019801|$06:$97F1:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $97EB) 0x019804|$06:$97F4:C9 3D CMP #$3D ; Item ID #$3D: Wizard’s Ring 0x019806|$06:$97F6:D0 17 BNE $980F ; call to code in a different bank ($0F:$FA2E) 0x019808|$06:$97F8:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01980B|$06:$97FB:41 ; String ID #$0141: [name] slipped on the Wizard's Ring and spoke a word of magic.[end-FC] ; data -> code 0x01980C|$06:$97FC:A5 97 LDA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$F722) 0x01980E|$06:$97FE:20 22 F7 JSR $F722 ; 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 0x019811|$06:$9801:A5 99 LDA $99 ; chance for Wizard's Ring to break 0x019813|$06:$9803:D0 07 BNE $980C ; call to code in a different bank ($0F:$FA2E) 0x019815|$06:$9805:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019818|$06:$9808:42 ; String ID #$0142: [wait]The ring crumbled like clay into dust, losing all its power.[end-FC] ; data -> code 0x019819|$06:$9809:20 1D 96 JSR $961D ; given hero ID in $97 and hero inventory offset in $49, remove that item from hero's inventory and move all lower items up 1 slot ; control flow target (from $9803) 0x01981C|$06:$980C:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $97F6) 0x01981F|$06:$980F:C9 31 CMP #$31 ; Item ID #$31: Dragon’s Potion 0x019821|$06:$9811:D0 12 BNE $9825 ; call to code in a different bank ($0F:$FA2E) 0x019823|$06:$9813:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019826|$06:$9816:43 ; String ID #$0143: The beautiful voice can be heard from somewhere[..][..][wait][end-FC] ; data -> code ; call to code in a different bank ($0F:$FA32) 0x019827|$06:$9817:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01982A|$06:$981A:87 ; String ID #$0287: ‘Dost thou wish to save thy deeds in the Imperial Scrolls of Honor?’[FD][FD][end-FC] ; data -> code 0x01982B|$06:$981B:20 5D A3 JSR $A35D ; save game handler ; call to code in a different bank ($0F:$FA2E) 0x01982E|$06:$981E:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019831|$06:$9821:47 ; String ID #$0147: ‘I watch over my descendants[.’][end-FC] ; data -> code 0x019832|$06:$9822:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9811) 0x019835|$06:$9825:C9 3E CMP #$3E ; Item ID #$3E: Perilous 0x019837|$06:$9827:D0 0B BNE $9834 ; external control flow target (from $0F:$F74D) 0x019839|$06:$9829:86 49 STX $49 ; object hero/target/item/string ID $49 0x01983B|$06:$982B:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs 0x01983D|$06:$982D:85 95 STA $95 ; ID for [item] and [spell] control codes 0x01983F|$06:$982F:48 PHA 0x019840|$06:$9830:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA 0x019843|$06:$9833:68 PLA ; control flow target (from $9827) 0x019844|$06:$9834:C9 30 CMP #$30 ; Item ID #$30: Dragon’s Bane 0x019846|$06:$9836:D0 06 BNE $983E 0x019848|$06:$9838:20 95 98 JSR $9895 ; USE Dragon's Bane 0x01984B|$06:$983B:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9836) 0x01984E|$06:$983E:C9 2F CMP #$2F ; Item ID #$2F: Gremlin’s Tail 0x019850|$06:$9840:D0 06 BNE $9848 0x019852|$06:$9842:20 B0 98 JSR $98B0 ; USE Gremlin's Tail 0x019855|$06:$9845:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9840) 0x019858|$06:$9848:C9 26 CMP #$26 ; Item ID #$26: Moon Fragment 0x01985A|$06:$984A:D0 06 BNE $9852 0x01985C|$06:$984C:20 CB 98 JSR $98CB ; USE Moon Fragment 0x01985F|$06:$984F:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $984A) 0x019862|$06:$9852:C9 24 CMP #$24 ; Item ID #$24: Token of Erdrick 0x019864|$06:$9854:D0 06 BNE $985C 0x019866|$06:$9856:20 08 99 JSR $9908 ; USE Token of Erdrick 0x019869|$06:$9859:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9854) 0x01986C|$06:$985C:C9 2E CMP #$2E ; Item ID #$2E: Cloak of Wind 0x01986E|$06:$985E:D0 06 BNE $9866 0x019870|$06:$9860:20 14 99 JSR $9914 ; USE Cloak of Wind 0x019873|$06:$9863:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $985E) 0x019876|$06:$9866:C9 27 CMP #$27 ; Item ID #$27: Charm of Rubiss 0x019878|$06:$9868:D0 06 BNE $9870 0x01987A|$06:$986A:20 2F 99 JSR $992F ; USE Charm of Rubiss 0x01987D|$06:$986D:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9868) 0x019880|$06:$9870:C9 2A CMP #$2A ; Item ID #$2A: Echoing Flute 0x019882|$06:$9872:D0 06 BNE $987A 0x019884|$06:$9874:20 63 99 JSR $9963 ; USE Echoing Flute 0x019887|$06:$9877:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9872) 0x01988A|$06:$987A:C9 36 CMP #$36 ; Item ID #$36: [blank] 0x01988C|$06:$987C:D0 06 BNE $9884 0x01988E|$06:$987E:20 9C 99 JSR $999C ; USE Golden Card 0x019891|$06:$9881:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $987C) 0x019894|$06:$9884:C9 32 CMP #$32 ; Item ID #$32: Golden Card 0x019896|$06:$9886:D0 06 BNE $988E 0x019898|$06:$9888:20 9C 99 JSR $999C ; USE Golden Card 0x01989B|$06:$988B:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9886) ; call to code in a different bank ($0F:$FA2E) 0x01989E|$06:$988E:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0198A1|$06:$9891:9E ; String ID #$019E: But nothing happened.[end-FC] ; data -> code 0x0198A2|$06:$9892:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; USE Dragon's Bane ; control flow target (from $9838) 0x0198A5|$06:$9895:09 40 ORA #$40 ; check for equipped version 0x0198A7|$06:$9897:20 BA 8D JSR $8DBA ; given a hero ID in $97 and an item ID in A, SEC if hero has that item, CLC otherwise 0x0198AA|$06:$989A:B0 0E BCS $98AA 0x0198AC|$06:$989C:A6 49 LDX $49 ; object hero/target/item/string ID $49 0x0198AE|$06:$989E:20 0F 8B JSR $8B0F ; given hero ID in $97 and hero inventory index in X, return corresponding item ID in A and party inventory index in X 0x0198B1|$06:$98A1:09 40 ORA #$40 ; equip it 0x0198B3|$06:$98A3:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x0198B6|$06:$98A6:A9 22 LDA #$22 ; String ID #$0122: [name] put on the Dragon's Bane.[end-FC] 0x0198B8|$06:$98A8:D0 02 BNE $98AC ; control flow target (from $989A) 0x0198BA|$06:$98AA:A9 23 LDA #$23 ; String ID #$0123: [name] has already put on the Dragon's Bane.[end-FC] ; control flow target (from $98A8) ; call to code in a different bank ($0F:$FA4E) 0x0198BC|$06:$98AC:20 4E FA JSR $FA4E ; display string ID specified by A + #$0100 0x0198BF|$06:$98AF:60 RTS ; USE Gremlin's Tail ; control flow target (from $9842) 0x0198C0|$06:$98B0:09 40 ORA #$40 ; check for equipped version 0x0198C2|$06:$98B2:20 BA 8D JSR $8DBA ; given a hero ID in $97 and an item ID in A, SEC if hero has that item, CLC otherwise 0x0198C5|$06:$98B5:B0 0E BCS $98C5 0x0198C7|$06:$98B7:A6 49 LDX $49 ; object hero/target/item/string ID $49 0x0198C9|$06:$98B9:20 0F 8B JSR $8B0F ; given hero ID in $97 and hero inventory index in X, return corresponding item ID in A and party inventory index in X 0x0198CC|$06:$98BC:09 40 ORA #$40 ; equip it 0x0198CE|$06:$98BE:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x0198D1|$06:$98C1:A9 24 LDA #$24 ; String ID #$0124: [name] put on the Gremlin's Tail.[end-FC] 0x0198D3|$06:$98C3:D0 02 BNE $98C7 ; control flow target (from $98B5) 0x0198D5|$06:$98C5:A9 25 LDA #$25 ; String ID #$0125: [name] has already put on the Gremlin's Tail.[end-FC] ; control flow target (from $98C3) ; call to code in a different bank ($0F:$FA4E) 0x0198D7|$06:$98C7:20 4E FA JSR $FA4E ; display string ID specified by A + #$0100 0x0198DA|$06:$98CA:60 RTS ; USE Moon Fragment ; control flow target (from $984C) ; call to code in a different bank ($0F:$FA2E) 0x0198DB|$06:$98CB:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0198DE|$06:$98CE:26 ; String ID #$0126: [name] held the Moon Fragment overhead.[end-FC] ; data -> code 0x0198DF|$06:$98CF:A5 8E LDA $8E ; flag for in battle or not (#$FF)? 0x0198E1|$06:$98D1:30 2D BMI $9900 0x0198E3|$06:$98D3: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) 0x0198E5|$06:$98D5:D0 29 BNE $9900 0x0198E7|$06:$98D7:AD F8 05 LDA $05F8 ; Sea Cave shoal status (#$00 = shoals up, others = shoals down) 0x0198EA|$06:$98DA:D0 24 BNE $9900 0x0198EC|$06:$98DC:A5 16 LDA $16 ; current map X-pos (1) 0x0198EE|$06:$98DE:C9 B1 CMP #$B1 ; X-range for effective use is #$B1-#$B9 inclusive 0x0198F0|$06:$98E0:90 1E BCC $9900 0x0198F2|$06:$98E2:C9 BA CMP #$BA 0x0198F4|$06:$98E4:B0 1A BCS $9900 0x0198F6|$06:$98E6:A5 17 LDA $17 ; current map Y-pos (1) 0x0198F8|$06:$98E8:C9 A2 CMP #$A2 ; Y-range for effective use is #$A2-#$AC inclusive 0x0198FA|$06:$98EA:90 14 BCC $9900 0x0198FC|$06:$98EC:C9 AD CMP #$AD 0x0198FE|$06:$98EE:B0 10 BCS $9900 ; call to code in a different bank ($0F:$D0F5) 0x019900|$06:$98F0:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x019903|$06:$98F3:A2 3C LDX #$3C ; call to code in a different bank ($0F:$C1EE) 0x019905|$06:$98F5:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x019908|$06:$98F8:A9 01 LDA #$01 0x01990A|$06:$98FA:8D F8 05 STA $05F8 ; Sea Cave shoal status (#$00 = shoals up, others = shoals down) ; call to code in a different bank ($0F:$D218) 0x01990D|$06:$98FD:4C 18 D2 JMP $D218 ; open path to Sea Cave ; control flow target (from $98D1, $98D5, $98DA, $98E0, $98E4, $98EA, $98EE) ; call to code in a different bank ($0F:$F73D) 0x019910|$06:$9900:20 3D F7 JSR $F73D ; calls $04:$99E6 ; call to code in a different bank ($0F:$FA2E) 0x019913|$06:$9903:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019916|$06:$9906:27 ; String ID #$0127: [wait]But nothing happened.[end-FC] ; data -> code 0x019917|$06:$9907:60 RTS ; USE Token of Erdrick ; control flow target (from $9856) ; call to code in a different bank ($0F:$FA2E) 0x019918|$06:$9908:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data 0x01991B|$06:$990B:28 ; String ID #$0128: [name] gripped Token of Erdrick.[wait][end-FC] ; data -> code ; call to code in a different bank ($0F:$F73D) 0x01991C|$06:$990C:20 3D F7 JSR $F73D ; calls $04:$99E6 ; call to code in a different bank ($0F:$FA2E) 0x01991F|$06:$990F:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data 0x019922|$06:$9912:53 ; String ID #$0153: Thy courage soared![end-FC] ; data -> code 0x019923|$06:$9913:60 RTS ; USE Cloak of Wind ; control flow target (from $9860) 0x019924|$06:$9914:09 40 ORA #$40 ; check for equipped version 0x019926|$06:$9916:20 BA 8D JSR $8DBA ; given a hero ID in $97 and an item ID in A, SEC if hero has that item, CLC otherwise 0x019929|$06:$9919:B0 0E BCS $9929 0x01992B|$06:$991B:A6 49 LDX $49 ; object hero/target/item/string ID $49 0x01992D|$06:$991D:20 0F 8B JSR $8B0F ; given hero ID in $97 and hero inventory index in X, return corresponding item ID in A and party inventory index in X 0x019930|$06:$9920:09 40 ORA #$40 ; equip it 0x019932|$06:$9922:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x019935|$06:$9925:A9 2C LDA #$2C ; String ID #$012C: [name] donned the Cloak of Wind.[end-FC] 0x019937|$06:$9927:D0 02 BNE $992B ; control flow target (from $9919) 0x019939|$06:$9929:A9 2D LDA #$2D ; String ID #$012D: Remember, [name] has already put on the Cloak of Wind.[end-FC] ; control flow target (from $9927) ; call to code in a different bank ($0F:$FA4E) 0x01993B|$06:$992B:20 4E FA JSR $FA4E ; display string ID specified by A + #$0100 0x01993E|$06:$992E:60 RTS ; USE Charm of Rubiss ; control flow target (from $986A) ; call to code in a different bank ($0F:$FA2E) 0x01993F|$06:$992F:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019942|$06:$9932:2E ; String ID #$012E: With one hand, [name] held aloft the Charm of Rubiss.[wait][end-FC] ; data -> code 0x019943|$06:$9933:A5 8E LDA $8E ; flag for in battle or not (#$FF)? 0x019945|$06:$9935:30 24 BMI $995B 0x019947|$06:$9937:A5 31 LDA $31 ; current map ID ; Map ID #$00: Fake Midenhall 0x019949|$06:$9939:D0 20 BNE $995B ; call to code in a different bank ($0F:$FA2E) 0x01994B|$06:$993B:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01994E|$06:$993E:30 ; String ID #$0130: [name] could hear a voice drawing near.[wait][line]‘[name]! Be not deceived by false visions[.’][end-FC] ; data -> code 0x01994F|$06:$993F:A2 78 LDX #$78 ; call to code in a different bank ($0F:$C1EE) 0x019951|$06:$9941:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF ; call to code in a different bank ($0F:$C515) 0x019954|$06:$9944:20 15 C5 JSR $C515 ; flash screen 10 times ; call to code in a different bank ($0F:$C515) 0x019957|$06:$9947:20 15 C5 JSR $C515 ; flash screen 10 times 0x01995A|$06:$994A:68 PLA 0x01995B|$06:$994B:68 PLA 0x01995C|$06:$994C:AD 59 99 LDA $9959 0x01995F|$06:$994F:85 0C STA $0C 0x019961|$06:$9951:AD 5A 99 LDA $995A 0x019964|$06:$9954:85 0D STA $0D ; call to code in a different bank ($0F:$D81C) 0x019966|$06:$9956:4C 1C D8 JMP $D81C ; code -> data ; data load target (from $994C) 0x019969|$06:$9959:85 ; data load target (from $9951) 0x01996A|$06:$995A: BD ; $03:$BD85 ; data -> code ; control flow target (from $9935, $9939) ; call to code in a different bank ($0F:$F73D) 0x01996B|$06:$995B:20 3D F7 JSR $F73D ; calls $04:$99E6 ; call to code in a different bank ($0F:$FA2E) 0x01996E|$06:$995E:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019971|$06:$9961:2F ; String ID #$012F: And yet nothing happened.[end-FC] ; data -> code 0x019972|$06:$9962:60 RTS ; USE Echoing Flute ; control flow target (from $9874) ; call to code in a different bank ($0F:$FA2E) 0x019973|$06:$9963:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019976|$06:$9966:35 ; String ID #$0135: Briefly, [name] played the Echoing Flute.[end-FC] ; data -> code 0x019977|$06:$9967:A0 00 LDY #$00 0x019979|$06:$9969:A5 31 LDA $31 ; current map ID ; control flow target (from $9986) 0x01997B|$06:$996B:D9 8D 99 CMP $998D,Y ; minimum map ID (inclusive) 0x01997E|$06:$996E:90 11 BCC $9981 ; wrong map 0x019980|$06:$9970:D9 8E 99 CMP $998E,Y ; maximum map ID (exclusive) 0x019983|$06:$9973:B0 0C BCS $9981 ; wrong map 0x019985|$06:$9975:B9 8F 99 LDA $998F,Y ; Crest in this map 0x019988|$06:$9978:2D 12 01 AND $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x01998B|$06:$997B:D0 0B BNE $9988 ; flute does not echo 0x01998D|$06:$997D:A9 03 LDA #$03 ; Music ID #$03: Echoing Flute echoing BGM 0x01998F|$06:$997F:D0 09 BNE $998A ; flute echoes! ; wrong map ; control flow target (from $996E, $9973) 0x019991|$06:$9981:C8 INY 0x019992|$06:$9982:C8 INY 0x019993|$06:$9983:C8 INY 0x019994|$06:$9984:C0 0F CPY #$0F ; 3 bytes per crest * 5 crests = #$0F 0x019996|$06:$9986:D0 E3 BNE $996B ; if more maps to check, check them ; flute does not echo ; control flow target (from $997B) 0x019998|$06:$9988:A9 04 LDA #$04 ; Music ID #$04: Echoing Flute not echoing BGM ; control flow target (from $997F) ; call to code in a different bank ($0F:$C58D) 0x01999A|$06:$998A:4C 8D C5 JMP $C58D ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]), wait for it to finish, then play previous BGM ; code -> data ; minimum map ID (inclusive) ; indexed data load target (from $996B) 0x01999D|$06:$998D:08 ; maximum map ID (exclusive) ; indexed data load target (from $9970) 0x01999E|$06:$998E: 09 ; Crest in this map ; indexed data load target (from $9975) 0x01999F|$06:$998F: 08 ; Map ID #$08: Hamlin Waterway 0x0199A0|$06:$9990:0F 10 04 ; Map ID #$0F: Osterfair 0x0199A3|$06:$9993:1E 1F 01 ; Map ID #$1E: Shrine NW of Zahan 0x0199A6|$06:$9996:50 58 02 ; Map IDs #$50 - #$57: Lighthouse 0x0199A9|$06:$9999:37 40 10 ; Map IDs #$37 - #$3F: Cave to Rhone ; data -> code ; USE Golden Card ; control flow target (from $987E, $9888) ; call to code in a different bank ($0F:$FA2E) 0x0199AC|$06:$999C:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0199AF|$06:$999F:3F ; String ID #$013F: [name] took the Golden Card.[wait][end-FC] ; data -> code ; call to code in a different bank ($0F:$F73D) 0x0199B0|$06:$99A0:20 3D F7 JSR $F73D ; calls $04:$99E6 ; call to code in a different bank ($0F:$FA2E) 0x0199B3|$06:$99A3:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0199B6|$06:$99A6:54 ; String ID #$0154: Thou art happy indeed.[end-FC] ; data -> code 0x0199B7|$06:$99A7:60 RTS ; TRADE/THROW handler ; control flow target (from $9590) 0x0199B8|$06:$99A8:C9 01 CMP #$01 ; TRADE; useless op 0x0199BA|$06:$99AA:F0 03 BEQ $99AF ; TRADE handler 0x0199BC|$06:$99AC:4C 84 9A JMP $9A84 ; THROW command handler ; TRADE handler ; control flow target (from $99AA) ; call to code in a different bank ($0F:$F6CE) 0x0199BF|$06:$99AF:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x0199C2|$06:$99B2:D0 0D BNE $99C1 ; determine target hero 0x0199C4|$06:$99B4:20 CB 9A JSR $9ACB ; open dialogue window 0x0199C7|$06:$99B7:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x0199CA|$06:$99BA:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0199CD|$06:$99BD:19 ; String ID #$0119: [name] has no companion with which to exchange tools.[end-FC] ; data -> code 0x0199CE|$06:$99BE:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; determine target hero ; control flow target (from $99B2) ; call to code in a different bank ($0F:$F587) 0x0199D1|$06:$99C1:20 87 F5 JSR $F587 ; display appropriate main ITEM target menu 0x0199D4|$06:$99C4:C9 FF CMP #$FF 0x0199D6|$06:$99C6:D0 03 BNE $99CB 0x0199D8|$06:$99C8:4C 42 95 JMP $9542 ; exit COMMAND menu ; control flow target (from $99C6) 0x0199DB|$06:$99CB:85 C9 STA $C9 ; target hero ID 0x0199DD|$06:$99CD:20 CB 9A JSR $9ACB ; open dialogue window 0x0199E0|$06:$99D0:20 FC 9A JSR $9AFC ; given hero ID in $97 and hero inventory index in $49, set Z if item is equipped and cursed, clear if not 0x0199E3|$06:$99D3:D0 03 BNE $99D8 ; item can be traded 0x0199E5|$06:$99D5:4C C4 9A JMP $9AC4 ; item is equipped and cursed ; item can be traded ; control flow target (from $99D3) 0x0199E8|$06:$99D8:A5 97 LDA $97 ; subject hero ID $97 0x0199EA|$06:$99DA:C5 C9 CMP $C9 ; target hero ID 0x0199EC|$06:$99DC:D0 22 BNE $9A00 ; give to different hero 0x0199EE|$06:$99DE:A9 80 LDA #$80 ; Alive 0x0199F0|$06:$99E0:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x0199F3|$06:$99E3:90 0A BCC $99EF ; ghost giving to itself 0x0199F5|$06:$99E5:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x0199F8|$06:$99E8:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x0199FB|$06:$99EB:1C ; String ID #$011C: [name] started to give it, but held on to it instead.[end-FC] ; data -> code 0x0199FC|$06:$99EC:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; ghost giving to itself ; control flow target (from $99E3) 0x0199FF|$06:$99EF:20 EB 9A JSR $9AEB ; using name of first living hero, display String ID #$0120: [name] [end-FF] 0x019A02|$06:$99F2:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019A05|$06:$99F5:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019A08|$06:$99F8:A1 ; String ID #$01A1: took the [item] from the ghost of [name] and [end-FF] ; data -> code ; call to code in a different bank ($0F:$FA2E) 0x019A09|$06:$99F9:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019A0C|$06:$99FC:A3 ; String ID #$01A3: gave it back to the ghost of [name].[end-FC] ; data -> code 0x019A0D|$06:$99FD:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; give to different hero ; control flow target (from $99DC) 0x019A10|$06:$9A00:A5 97 LDA $97 ; subject hero ID $97 0x019A12|$06:$9A02:48 PHA ; item owner hero ID 0x019A13|$06:$9A03:A5 C9 LDA $C9 ; target hero ID 0x019A15|$06:$9A05:85 97 STA $97 ; subject hero ID $97 0x019A17|$06:$9A07:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x019A1A|$06:$9A0A:B0 0B BCS $9A17 ; item given to target hero 0x019A1C|$06:$9A0C:68 PLA ; item owner hero ID 0x019A1D|$06:$9A0D:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019A20|$06:$9A10:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019A23|$06:$9A13:1B ; String ID #$011B: [name] cannot carry more items.[end-FC] ; data -> code 0x019A24|$06:$9A14:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; item given to target hero ; control flow target (from $9A0A) 0x019A27|$06:$9A17:68 PLA ; item owner hero ID 0x019A28|$06:$9A18:85 97 STA $97 ; subject hero ID $97 0x019A2A|$06:$9A1A:A6 49 LDX $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$C4D4) 0x019A2C|$06:$9A1C:20 D4 C4 JSR $C4D4 ; 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 0x019A2F|$06:$9A1F:A9 80 LDA #$80 ; Alive 0x019A31|$06:$9A21:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x019A34|$06:$9A24:90 21 BCC $9A47 ; owner is a ghost 0x019A36|$06:$9A26:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019A39|$06:$9A29:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019A3C|$06:$9A2C:20 ; String ID #$0120: [name] [end-FF] ; data -> code 0x019A3D|$06:$9A2D:A5 C9 LDA $C9 ; target hero ID 0x019A3F|$06:$9A2F:85 97 STA $97 ; subject hero ID $97 0x019A41|$06:$9A31:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA 0x019A44|$06:$9A34:A9 80 LDA #$80 ; Alive 0x019A46|$06:$9A36:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x019A49|$06:$9A39:90 04 BCC $9A3F ; target is a ghost 0x019A4B|$06:$9A3B:A9 1A LDA #$1A ; String ID #$011A: handed the [item] to [name].[end-FC] 0x019A4D|$06:$9A3D:D0 02 BNE $9A41 ; target is alive ; target is a ghost ; control flow target (from $9A39) 0x019A4F|$06:$9A3F:A9 17 LDA #$17 ; String ID #$0117: gave the [item] to the ghost of [name].[end-FC] ; target is alive ; control flow target (from $9A3D) ; call to code in a different bank ($0F:$FA4E) 0x019A51|$06:$9A41:20 4E FA JSR $FA4E ; display string ID specified by A + #$0100 0x019A54|$06:$9A44:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; owner is a ghost ; control flow target (from $9A24) 0x019A57|$06:$9A47:A5 97 LDA $97 ; subject hero ID $97 0x019A59|$06:$9A49:48 PHA ; item owner hero ID 0x019A5A|$06:$9A4A:A5 C9 LDA $C9 ; target hero ID 0x019A5C|$06:$9A4C:85 97 STA $97 ; subject hero ID $97 0x019A5E|$06:$9A4E:A9 80 LDA #$80 ; Alive 0x019A60|$06:$9A50:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x019A63|$06:$9A53:90 14 BCC $9A69 ; target is a ghost 0x019A65|$06:$9A55:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA 0x019A68|$06:$9A58:68 PLA ; item owner hero ID 0x019A69|$06:$9A59:85 97 STA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$FA2E) 0x019A6B|$06:$9A5B:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019A6E|$06:$9A5E:20 ; String ID #$0120: [name] [end-FF] ; data -> code 0x019A6F|$06:$9A5F:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019A72|$06:$9A62:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019A75|$06:$9A65:18 ; String ID #$0118: took the [item] from [name].[end-FC] ; data -> code 0x019A76|$06:$9A66:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; target is a ghost ; control flow target (from $9A53) 0x019A79|$06:$9A69:20 EB 9A JSR $9AEB ; using name of first living hero, display String ID #$0120: [name] [end-FF] 0x019A7C|$06:$9A6C:68 PLA ; item owner hero ID 0x019A7D|$06:$9A6D:85 97 STA $97 ; subject hero ID $97 0x019A7F|$06:$9A6F:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019A82|$06:$9A72:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019A85|$06:$9A75:A1 ; String ID #$01A1: took the [item] from the ghost of [name] and [end-FF] ; data -> code 0x019A86|$06:$9A76:A5 C9 LDA $C9 ; target hero ID 0x019A88|$06:$9A78:85 97 STA $97 ; subject hero ID $97 0x019A8A|$06:$9A7A:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019A8D|$06:$9A7D:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019A90|$06:$9A80:A2 ; String ID #$01A2: gave it to ghost of [name].[end-FC] ; data -> code 0x019A91|$06:$9A81:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; THROW command handler ; control flow target (from $99AC) 0x019A94|$06:$9A84:20 CB 9A JSR $9ACB ; open dialogue window 0x019A97|$06:$9A87:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x019A99|$06:$9A89:0A ASL ; item prices are 2 bytes each 0x019A9A|$06:$9A8A:A8 TAY 0x019A9B|$06:$9A8B:B9 FC 9F LDA $9FFC,Y ; Item Prices, low byte 0x019A9E|$06:$9A8E:19 FD 9F ORA $9FFD,Y ; Item Prices, high byte 0x019AA1|$06:$9A91:F0 2A BEQ $9ABD ; 0 G items are key items 0x019AA3|$06:$9A93:20 FC 9A JSR $9AFC ; given hero ID in $97 and hero inventory index in $49, set Z if item is equipped and cursed, clear if not 0x019AA6|$06:$9A96:F0 2C BEQ $9AC4 ; item is equipped and cursed 0x019AA8|$06:$9A98:A9 80 LDA #$80 ; Alive 0x019AAA|$06:$9A9A:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x019AAD|$06:$9A9D:90 0A BCC $9AA9 ; owner is a ghost 0x019AAF|$06:$9A9F:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019AB2|$06:$9AA2:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019AB5|$06:$9AA5:14 ; String ID #$0114: [name] threw away the [item].[end-FC] ; data -> code 0x019AB6|$06:$9AA6:4C B3 9A JMP $9AB3 ; owner is a ghost ; control flow target (from $9A9D) 0x019AB9|$06:$9AA9:20 EB 9A JSR $9AEB ; using name of first living hero, display String ID #$0120: [name] [end-FF] 0x019ABC|$06:$9AAC:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019ABF|$06:$9AAF:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019AC2|$06:$9AB2:16 ; String ID #$0116: took the [item] from [name] and threw it away.[end-FC] ; data -> code ; control flow target (from $9AA6) 0x019AC3|$06:$9AB3:A5 97 LDA $97 ; subject hero ID $97 0x019AC5|$06:$9AB5:A6 49 LDX $49 ; object hero/target/item/string ID $49 ; call to code in a different bank ($0F:$C4D4) 0x019AC7|$06:$9AB7:20 D4 C4 JSR $C4D4 ; 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 0x019ACA|$06:$9ABA:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; 0 G items are key items ; control flow target (from $9A91) ; call to code in a different bank ($0F:$FA2E) 0x019ACD|$06:$9ABD:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019AD0|$06:$9AC0:0E ; String ID #$010E: Thou should not throw that away.[end-FC] ; data -> code 0x019AD1|$06:$9AC1:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; item is equipped and cursed ; control flow target (from $99D5, $9A96) ; call to code in a different bank ($0F:$FA2E) 0x019AD4|$06:$9AC4:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019AD7|$06:$9AC7:12 ; String ID #$0112: It cannot be removed due to the curse.[end-FC] ; data -> code 0x019AD8|$06:$9AC8:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; open dialogue window ; control flow target (from $80CE, $80FA, $8160, $81BD, $8AB0, $8AD6, $8AF2, $8B46, $8B5C, $8BB3, $8E0C, $8E4C, $8E6B, $8F3F, $8F4E, $91C6, $91E3, $94B4, $94C6, $94E5, $956F, $959A, $95BD, $9637, $964F, $9734, $99B4, $99CD, $9A84) ; call to code in a different bank ($0F:$EB76) 0x019ADB|$06:$9ACB:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x019ADE|$06:$9ACE:04 ; Menu ID #$04: Dialogue window ; data -> code 0x019ADF|$06:$9ACF:60 RTS ; open YES/NO menu, return selected option in A ; control flow target (from $8236, $82C7, $832B, $8360, $83BD, $83D9, $8443, $8506, $8518, $856E, $8681, $86C4, $86EE, $8E54, $8FB5, $902C, $911B, $91AC, $9217, $92EB, $934C, $9388, $94CE, $94FF, $9CAE) ; call to code in a different bank ($0F:$EB76) 0x019AE0|$06:$9AD0:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x019AE3|$06:$9AD3:19 ; Menu ID #$19: General menu: YES/NO ; data -> code 0x019AE4|$06:$9AD4:60 RTS ; set A/$97 to ID of first living hero ; control flow target (from $8ECD, $8F23, $8F51, $8F9B, $8FCC, $9122, $917B, $91F4, $93E5, $9400, $9AEE, $9B1B) 0x019AE5|$06:$9AD5:A9 00 LDA #$00 ; start with Midenhall 0x019AE7|$06:$9AD7:85 97 STA $97 ; subject hero ID $97 ; control flow target (from $9AE6) 0x019AE9|$06:$9AD9:A9 80 LDA #$80 ; Alive 0x019AEB|$06:$9ADB:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x019AEE|$06:$9ADE:B0 08 BCS $9AE8 ; if hero alive, then we're done 0x019AF0|$06:$9AE0:E6 97 INC $97 ; subject hero ID $97 0x019AF2|$06:$9AE2:A5 97 LDA $97 ; subject hero ID $97 0x019AF4|$06:$9AE4:C9 03 CMP #$03 ; only 3 heroes 0x019AF6|$06:$9AE6:D0 F1 BNE $9AD9 ; loop if more heroes to check ; control flow target (from $9ADE) 0x019AF8|$06:$9AE8:A5 97 LDA $97 ; subject hero ID $97 0x019AFA|$06:$9AEA:60 RTS ; using name of first living hero, display String ID #$0120: [name] [end-FF] ; control flow target (from $99EF, $9A69, $9AA9, $9D2A) 0x019AFB|$06:$9AEB:A5 97 LDA $97 ; subject hero ID $97; save $97 to stack since $9AD5 will overwrite it 0x019AFD|$06:$9AED:48 PHA 0x019AFE|$06:$9AEE:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero 0x019B01|$06:$9AF1:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019B04|$06:$9AF4:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019B07|$06:$9AF7:20 ; String ID #$0120: [name] [end-FF] ; data -> code 0x019B08|$06:$9AF8:68 PLA ; restore $97 from stack 0x019B09|$06:$9AF9:85 97 STA $97 ; subject hero ID $97 0x019B0B|$06:$9AFB:60 RTS ; given hero ID in $97 and hero inventory index in $49, set Z if item is equipped and cursed, clear if not ; control flow target (from $9153, $99D0, $9A93, $9CF4) 0x019B0C|$06:$9AFC:A5 97 LDA $97 ; subject hero ID $97 0x019B0E|$06:$9AFE:0A ASL ; inventory is 8 items per hero 0x019B0F|$06:$9AFF:0A ASL 0x019B10|$06:$9B00:0A ASL 0x019B11|$06:$9B01:18 CLC 0x019B12|$06:$9B02:65 49 ADC $49 ; object hero/target/item/string ID $49 0x019B14|$06:$9B04:AA TAX 0x019B15|$06:$9B05:BD 00 06 LDA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x019B18|$06:$9B08:C9 4C CMP #$4C ; Item ID #$4C: Sword of Destruction (equipped) 0x019B1A|$06:$9B0A:F0 0A BEQ $9B16 0x019B1C|$06:$9B0C:C9 57 CMP #$57 ; Item ID #$57: Gremlin’s Armor (equipped) 0x019B1E|$06:$9B0E:F0 06 BEQ $9B16 0x019B20|$06:$9B10:C9 5F CMP #$5F ; Item ID #$5F: Evil Shield (equipped) 0x019B22|$06:$9B12:F0 02 BEQ $9B16 0x019B24|$06:$9B14:C9 6F CMP #$6F ; Item ID #$6F: Gremlin’s Tail (equipped) ; control flow target (from $9B0A, $9B0E, $9B12) 0x019B26|$06:$9B16:60 RTS ; COMMAND menu SEARCH handler ; indirect control flow target (via $808E) ; call to code in a different bank ($0F:$EB76) 0x019B27|$06:$9B17:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x019B2A|$06:$9B1A:04 ; Menu ID #$04: Dialogue window ; data -> code 0x019B2B|$06:$9B1B:20 D5 9A JSR $9AD5 ; set A/$97 to ID of first living hero 0x019B2E|$06:$9B1E:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA 0x019B31|$06:$9B21:A5 CF LDA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x019B33|$06:$9B23:29 04 AND #$04 ; pick out the "on ship" bit 0x019B35|$06:$9B25:F0 04 BEQ $9B2B ; branch if you're not on the ship 0x019B37|$06:$9B27:A9 07 LDA #$07 ; String ID #$0107: [name] dove overboard into the sea.[wait][end-FC] 0x019B39|$06:$9B29:D0 02 BNE $9B2D ; control flow target (from $9B25) 0x019B3B|$06:$9B2B:A9 03 LDA #$03 ; String ID #$0103: [name] searched all about.[wait][end-FC] ; control flow target (from $9B29) ; call to code in a different bank ($0F:$FA4E) 0x019B3D|$06:$9B2D:20 4E FA JSR $FA4E ; display string ID specified by A + #$0100 ; call to code in a different bank ($0F:$D095) 0x019B40|$06:$9B30:20 95 D0 JSR $D095 0x019B43|$06:$9B33:90 10 BCC $9B45 0x019B45|$06:$9B35:AD 2A 9E LDA $9E2A ; -> $06:$9E2E: Treasure List 1 (map ID, X-pos, Y-pos, item ID) 0x019B48|$06:$9B38:85 0C STA $0C 0x019B4A|$06:$9B3A:AD 2B 9E LDA $9E2B 0x019B4D|$06:$9B3D:85 0D STA $0D 0x019B4F|$06:$9B3F:20 58 9D JSR $9D58 ; scan treasure list at ($0C), returning in A/$95/$96 the item ID corresponding to party's current map ID/position or #$00 if there is no item or you're not allowed to get it 0x019B52|$06:$9B42:4C 84 9B JMP $9B84 ; control flow target (from $9B33) 0x019B55|$06:$9B45:A5 31 LDA $31 ; current map ID 0x019B57|$06:$9B47:C9 68 CMP #$68 ; Map ID #$68: Dragon Horn North 3F 0x019B59|$06:$9B49:D0 1E BNE $9B69 0x019B5B|$06:$9B4B:A9 2C LDA #$2C ; Item ID #$2C: Dew’s Yarn 0x019B5D|$06:$9B4D:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x019B5F|$06:$9B4F:85 95 STA $95 ; ID for [item] and [spell] control codes; item ID 0x019B61|$06:$9B51: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 0x019B64|$06:$9B54:10 27 BPL $9B7D ; search failed 0x019B66|$06:$9B56:A9 13 LDA #$13 ; Item ID #$13: Water Flying Cloth 0x019B68|$06:$9B58:20 60 A3 JSR $A360 ; check for item A (possibly equipped) in party inventory, returning inventory index of item in A/X if found, #$FF if not 0x019B6B|$06:$9B5B:10 20 BPL $9B7D ; search failed ; call to code in a different bank ($0F:$C3AB) 0x019B6D|$06:$9B5D:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x019B70|$06:$9B60:A5 32 LDA $32 ; RNG byte 0 0x019B72|$06:$9B62:29 03 AND #$03 ; 1/4 chance to find item 0x019B74|$06:$9B64:D0 17 BNE $9B7D ; search failed 0x019B76|$06:$9B66:4C 05 9C JMP $9C05 ; control flow target (from $9B49) 0x019B79|$06:$9B69:AD 2C 9E LDA $9E2C ; -> $06:$9F07: Treasure List 2 (map ID, X-pos, Y-pos, item ID) 0x019B7C|$06:$9B6C:85 0C STA $0C 0x019B7E|$06:$9B6E:AD 2D 9E LDA $9E2D 0x019B81|$06:$9B71:85 0D STA $0D 0x019B83|$06:$9B73:20 58 9D JSR $9D58 ; scan treasure list at ($0C), returning in A/$95/$96 the item ID corresponding to party's current map ID/position or #$00 if there is no item or you're not allowed to get it 0x019B86|$06:$9B76:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; useless op; $96 is already in A 0x019B88|$06:$9B78:F0 03 BEQ $9B7D ; search failed 0x019B8A|$06:$9B7A:4C 05 9C JMP $9C05 ; search failed ; control flow target (from $9B54, $9B5B, $9B64, $9B78) ; call to code in a different bank ($0F:$FA2E) 0x019B8D|$06:$9B7D:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019B90|$06:$9B80:06 ; String ID #$0106: But [name] found nothing.[end-FC] ; data -> code 0x019B91|$06:$9B81:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9B42) 0x019B94|$06:$9B84:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; useless op; $96 is already in A 0x019B96|$06:$9B86:C9 FF CMP #$FF ; Item ID #$FF: Trap! 0x019B98|$06:$9B88:F0 1C BEQ $9BA6 ; if Midenhall is equipped with the Armour of Erdrick, chest is empty, otherwise it's a trap with 50/50 chance for the party leader losing half their current HP or getting poisoned ; call to code in a different bank ($0F:$FA2E) 0x019B9A|$06:$9B8A:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019B9D|$06:$9B8D:05 ; String ID #$0105: Seeing a treasure chest, [name] opened it.[wait][end-FC] ; data -> code 0x019B9E|$06:$9B8E:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x019BA0|$06:$9B90:D0 73 BNE $9C05 ; Item ID #$00: (no item) ; call to code in a different bank ($0F:$FA2E) 0x019BA2|$06:$9B92:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019BA5|$06:$9B95:4B ; String ID #$014B: But it was empty.[end-FC] ; data -> code 0x019BA6|$06:$9B96:A5 31 LDA $31 ; current map ID 0x019BA8|$06:$9B98:C9 51 CMP #$51 ; Map ID #$51: Lighthouse 2F 0x019BAA|$06:$9B9A:D0 07 BNE $9BA3 0x019BAC|$06:$9B9C:A5 D0 LDA $D0 ; Malroth status flag (#$FF = defeated, #$00 = alive, others = countdown to battle) 0x019BAE|$06:$9B9E:30 03 BMI $9BA3 ; call to code in a different bank ($0F:$CC0A) 0x019BB0|$06:$9BA0:4C 0A CC JMP $CC0A ; trigger Stars Crest battle ; control flow target (from $9B9A, $9B9E) 0x019BB3|$06:$9BA3:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; if Midenhall is equipped with the Armour of Erdrick, chest is empty, otherwise it's a trap with 50/50 chance for the party leader losing half their current HP or getting poisoned ; control flow target (from $9B88) 0x019BB6|$06:$9BA6:A9 5B LDA #$5B ; Item ID #$5B: Armor of Erdrick (equipped) 0x019BB8|$06:$9BA8: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 0x019BBB|$06:$9BAB:C9 08 CMP #$08 ; only Midenhall can equip the Armour of Erdrick, so inventory index >= #$08 means he does not have it equipped 0x019BBD|$06:$9BAD:B0 0B BCS $9BBA ; if you don't have it or it isn't equipped, the treasure chest is a trap :( ; call to code in a different bank ($0F:$FA2E) 0x019BBF|$06:$9BAF:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019BC2|$06:$9BB2:05 ; String ID #$0105: Seeing a treasure chest, [name] opened it.[wait][end-FC] ; data -> code ; call to code in a different bank ($0F:$FA2E) 0x019BC3|$06:$9BB3:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019BC6|$06:$9BB6:4B ; String ID #$014B: But it was empty.[end-FC] ; data -> code 0x019BC7|$06:$9BB7:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9BAD) ; call to code in a different bank ($0F:$FA2E) 0x019BCA|$06:$9BBA:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019BCD|$06:$9BBD:4C ; String ID #$014C: The treasure chest was a trap![end-FC] ; data -> code ; call to code in a different bank ($0F:$C3AB) 0x019BCE|$06:$9BBE:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x019BD1|$06:$9BC1:A5 32 LDA $32 ; RNG byte 0 0x019BD3|$06:$9BC3:30 2D BMI $9BF2 ; 50% chance to branch and get poisoned or not branch and lose half your current HP 0x019BD5|$06:$9BC5:20 4F 9D JSR $9D4F ; given hero ID in $97, set A to the offset of that hero's data in $062D 0x019BD8|$06:$9BC8:18 CLC 0x019BD9|$06:$9BC9:69 0E ADC #$0E ; offset for hero's current HP, low byte 0x019BDB|$06:$9BCB:AA TAX 0x019BDC|$06:$9BCC:BD 2D 06 LDA $062D,X ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x019BDF|$06:$9BCF:85 8F STA $8F ; hero's current HP, low byte 0x019BE1|$06:$9BD1:BD 2E 06 LDA $062E,X ; Midenhall Battle Command Target 0x019BE4|$06:$9BD4:85 90 STA $90 ; hero's current HP, high byte 0x019BE6|$06:$9BD6:46 90 LSR $90 ; divide 16-bit current HP by 2 (round down) 0x019BE8|$06:$9BD8:66 8F ROR $8F 0x019BEA|$06:$9BDA:BD 2D 06 LDA $062D,X ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x019BED|$06:$9BDD:38 SEC ; set 16-bit current HP to 1/2 current HP, rounded up 0x019BEE|$06:$9BDE:E5 8F SBC $8F 0x019BF0|$06:$9BE0:9D 2D 06 STA $062D,X ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x019BF3|$06:$9BE3:BD 2E 06 LDA $062E,X ; Midenhall Battle Command Target 0x019BF6|$06:$9BE6:E5 90 SBC $90 0x019BF8|$06:$9BE8:9D 2E 06 STA $062E,X ; Midenhall Battle Command Target ; call to code in a different bank ($0F:$FA2A) 0x019BFB|$06:$9BEB:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x019BFE|$06:$9BEE:0C ; String ID #$000C: [name]'s HP is reduced by [number].[end-FC] ; data -> code 0x019BFF|$06:$9BEF:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9BC3) 0x019C02|$06:$9BF2:20 4F 9D JSR $9D4F ; given hero ID in $97, set A to the offset of that hero's data in $062D 0x019C05|$06:$9BF5:AA TAX 0x019C06|$06:$9BF6:A9 20 LDA #$20 ; Poison 0x019C08|$06:$9BF8:1D 2D 06 ORA $062D,X ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x019C0B|$06:$9BFB:9D 2D 06 STA $062D,X ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) ; call to code in a different bank ($0F:$FA2E) 0x019C0E|$06:$9BFE:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019C11|$06:$9C01:4D ; String ID #$014D: The poison weakened [name].[end-FC] ; data -> code 0x019C12|$06:$9C02:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9B66, $9B7A, $9B90) 0x019C15|$06:$9C05:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x019C17|$06:$9C07:C9 40 CMP #$40 ; Crest ID #$40: Sun Crest 0x019C19|$06:$9C09:90 57 BCC $9C62 ; find a regular item 0x019C1B|$06:$9C0B:C9 45 CMP #$45 ; Chest Gold ID #$45: 15 - 30 G 0x019C1D|$06:$9C0D:B0 28 BCS $9C37 ; generate randomized gold amount for treasure ID in A 0x019C1F|$06:$9C0F:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; ... yup, still item ID 0x019C21|$06:$9C11:C9 43 CMP #$43 ; Crest ID #$43: Water Crest 0x019C23|$06:$9C13:D0 04 BNE $9C19 0x019C25|$06:$9C15:A0 0A LDY #$0A ; offset from $9F5F for start of "Water Crest" 0x019C27|$06:$9C17:D0 0A BNE $9C23 ; control flow target (from $9C13) 0x019C29|$06:$9C19:C9 40 CMP #$40 ; Crest ID #$40: Sun Crest 0x019C2B|$06:$9C1B:D0 04 BNE $9C21 ; #$44 = Life Crest, #$41, #$42 = Life Crest too :p 0x019C2D|$06:$9C1D:A0 00 LDY #$00 ; offset from $9F5F for start of "Sun Crest" 0x019C2F|$06:$9C1F:F0 02 BEQ $9C23 ; control flow target (from $9C1B) 0x019C31|$06:$9C21:A0 16 LDY #$16 ; offset from $9F5F for start of "Life Crest" ; copy crest name (terminated by #$FA) to $5A,X ; control flow target (from $9C17, $9C1F) 0x019C33|$06:$9C23:A2 00 LDX #$00 ; control flow target (from $9C2E) 0x019C35|$06:$9C25:B9 5F 9F LDA $9F5F,Y ; Crest Names 0x019C38|$06:$9C28:95 5A STA $5A,X ; Crest/direction name write buffer start 0x019C3A|$06:$9C2A:C8 INY 0x019C3B|$06:$9C2B:E8 INX 0x019C3C|$06:$9C2C:C9 FA CMP #$FA 0x019C3E|$06:$9C2E:D0 F5 BNE $9C25 ; call to code in a different bank ($0F:$FA2E) 0x019C40|$06:$9C30:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019C43|$06:$9C33:4E ; String ID #$014E: Thou hast found the [item-F9].[end-FC] ; data -> code 0x019C44|$06:$9C34:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; generate randomized gold amount for treasure ID in A ; control flow target (from $9C0D) 0x019C47|$06:$9C37:38 SEC 0x019C48|$06:$9C38:E9 45 SBC #$45 ; subtract treasure offset to get index 0x019C4A|$06:$9C3A:85 8F STA $8F ; A = A * 3 (treasure list is 3 bytes per item) 0x019C4C|$06:$9C3C:0A ASL 0x019C4D|$06:$9C3D:18 CLC 0x019C4E|$06:$9C3E:65 8F ADC $8F 0x019C50|$06:$9C40:48 PHA ; call to code in a different bank ($0F:$C3AB) 0x019C51|$06:$9C41:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x019C54|$06:$9C44:68 PLA 0x019C55|$06:$9C45:A8 TAY 0x019C56|$06:$9C46:B9 3A 9F LDA $9F3A,Y ; random treasure chest gold amount; fetch maximum bonus gold amount 0x019C59|$06:$9C49:25 32 AND $32 ; RNG byte 0; AND with random number to make a randomized bonus gold amount 0x019C5B|$06:$9C4B:18 CLC 0x019C5C|$06:$9C4C:79 38 9F ADC $9F38,Y ; base treasure chest gold amount, low byte; add random bonus amount to low byte of base gold amount 0x019C5F|$06:$9C4F:85 8F STA $8F ; store to $8F for later use 0x019C61|$06:$9C51:B9 39 9F LDA $9F39,Y ; base treasure chest gold amount, high byte; load high byte of base gold amount 0x019C64|$06:$9C54:69 00 ADC #$00 ; add carry from low byte 0x019C66|$06:$9C56:85 90 STA $90 ; store to $90 for later use ; add $8F-$90 to party gold, capped at $FFFF, and display String ID #$0048: And earned [number] piece[(s)] of gold.[end-FC] ; control flow target (from $9C78) 0x019C68|$06:$9C58:20 F5 8C JSR $8CF5 ; add $8F-$90 to party gold, capped at $FFFF ; call to code in a different bank ($0F:$FA2A) 0x019C6B|$06:$9C5B:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x019C6E|$06:$9C5E:48 ; String ID #$0048: And earned [number] piece[(s)] of gold.[end-FC] ; data -> code 0x019C6F|$06:$9C5F:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; find a regular item ; control flow target (from $9C09) ; call to code in a different bank ($0F:$FA2E) 0x019C72|$06:$9C62:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019C75|$06:$9C65:04 ; String ID #$0104: And there [name] discovered the [item]![end-FC] ; data -> code 0x019C76|$06:$9C66:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x019C78|$06:$9C68:C9 06 CMP #$06 ; Item ID #$06: Copper Sword 0x019C7A|$06:$9C6A:D0 0F BNE $9C7B 0x019C7C|$06:$9C6C:A9 00 LDA #$00 ; Midenhall 0x019C7E|$06:$9C6E:85 97 STA $97 ; subject hero ID $97 0x019C80|$06:$9C70:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x019C83|$06:$9C73:A9 32 LDA #$32 ; at this point in the game, Midenhall is incapable of having a full inventory, so no need to check C; #$32 = 50 Gold 0x019C85|$06:$9C75:20 2A 8D JSR $8D2A ; set $8F-$90 to A-#$00 0x019C88|$06:$9C78:4C 58 9C JMP $9C58 ; add $8F-$90 to party gold, capped at $FFFF, and display String ID #$0048: And earned [number] piece[(s)] of gold.[end-FC] ; control flow target (from $9C6A) 0x019C8B|$06:$9C7B:A5 95 LDA $95 ; ID for [item] and [spell] control codes; item ID 0x019C8D|$06:$9C7D:8D 4C 61 STA $614C ; found item ID ; call to code in a different bank ($0F:$F6CE) 0x019C90|$06:$9C80:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x019C93|$06:$9C83:85 C9 STA $C9 ; number of party members - 1 0x019C95|$06:$9C85:E6 C9 INC $C9 ; number of party members 0x019C97|$06:$9C87:A9 00 LDA #$00 0x019C99|$06:$9C89:85 97 STA $97 ; subject hero ID $97 ; try to add item to party member's inventory ; control flow target (from $9C99) 0x019C9B|$06:$9C8B:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x019C9E|$06:$9C8E:90 03 BCC $9C93 ; branch if party member has no room 0x019CA0|$06:$9C90:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9C8E) 0x019CA3|$06:$9C93:E6 97 INC $97 ; subject hero ID $97 0x019CA5|$06:$9C95:A5 97 LDA $97 ; subject hero ID $97 0x019CA7|$06:$9C97:C5 C9 CMP $C9 ; if more party members to try, try them 0x019CA9|$06:$9C99:D0 F0 BNE $9C8B ; try to add item to party member's inventory 0x019CAB|$06:$9C9B:A9 00 LDA #$00 0x019CAD|$06:$9C9D:85 97 STA $97 ; subject hero ID $97 0x019CAF|$06:$9C9F:C6 C9 DEC $C9 ; number of party members 0x019CB1|$06:$9CA1:A5 C9 LDA $C9 ; number of party members - 1 0x019CB3|$06:$9CA3:F0 02 BEQ $9CA7 ; useless op; #$80 and #$00 are identical as far as $FC50 is concerned 0x019CB5|$06:$9CA5:A9 80 LDA #$80 ; control flow target (from $9CA3) ; call to code in a different bank ($0F:$FC50) 0x019CB7|$06:$9CA7:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019CBA|$06:$9CAA:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019CBD|$06:$9CAD:08 ; String ID #$0108: [wait][name] can carry no more. Dost thou wish to throw something away?[FD][FD][end-FC] ; data -> code 0x019CBE|$06:$9CAE:20 D0 9A JSR $9AD0 ; open YES/NO menu, return selected option in A 0x019CC1|$06:$9CB1:C9 00 CMP #$00 ; YES 0x019CC3|$06:$9CB3:F0 0C BEQ $9CC1 ; give up new item ; control flow target (from $9CCE, $9CEC) 0x019CC5|$06:$9CB5:AD 4C 61 LDA $614C ; found item ID; useless op; $95 hasn't changed since we copied it to $614C 0x019CC8|$06:$9CB8:85 95 STA $95 ; ID for [item] and [spell] control codes ; call to code in a different bank ($0F:$FA2E) 0x019CCA|$06:$9CBA:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019CCD|$06:$9CBD:09 ; String ID #$0109: [name] gave up the [item].[end-FC] ; data -> code 0x019CCE|$06:$9CBE:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; control flow target (from $9CB3) 0x019CD1|$06:$9CC1:A5 C9 LDA $C9 ; number of party members - 1 0x019CD3|$06:$9CC3:F0 0D BEQ $9CD2 ; if Midenhall's alone, no need to pick a party member ; control flow target (from $9CEE) ; call to code in a different bank ($0F:$FA2E) 0x019CD5|$06:$9CC5:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019CD8|$06:$9CC8:0A ; String ID #$010A: Who shall throw something away?[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$F55D) 0x019CD9|$06:$9CC9:20 5D F5 JSR $F55D ; display appropriate main ITEM hero select menu 0x019CDC|$06:$9CCC:C9 FF CMP #$FF 0x019CDE|$06:$9CCE:F0 E5 BEQ $9CB5 ; give up new item 0x019CE0|$06:$9CD0:85 97 STA $97 ; subject hero ID $97 ; control flow target (from $9CC3, $9CFD, $9D12) ; call to code in a different bank ($0F:$FA2E) 0x019CE2|$06:$9CD2:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019CE5|$06:$9CD5:0B ; String ID #$010B: What shall thou throw away?[FD][FD][end-FC] ; data -> code 0x019CE6|$06:$9CD6:A5 97 LDA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$F5FE) 0x019CE8|$06:$9CD8:20 FE F5 JSR $F5FE ; given a hero ID in A, open hero's item list and return selected item ID (or #$FE if they have no items) 0x019CEB|$06:$9CDB:48 PHA ; item ID to drop 0x019CEC|$06:$9CDC:8A TXA 0x019CED|$06:$9CDD:48 PHA ; save X 0x019CEE|$06:$9CDE:A9 03 LDA #$03 ; call to code in a different bank ($0F:$CF6A) 0x019CF0|$06:$9CE0:20 6A CF JSR $CF6A ; wipe selected menu region 0x019CF3|$06:$9CE3:68 PLA ; restore X 0x019CF4|$06:$9CE4:AA TAX 0x019CF5|$06:$9CE5:68 PLA ; item ID to drop 0x019CF6|$06:$9CE6:C9 FF CMP #$FF 0x019CF8|$06:$9CE8:D0 06 BNE $9CF0 0x019CFA|$06:$9CEA:A5 C9 LDA $C9 ; number of party members - 1 0x019CFC|$06:$9CEC:F0 C7 BEQ $9CB5 ; give up new item 0x019CFE|$06:$9CEE:D0 D5 BNE $9CC5 ; control flow target (from $9CE8) 0x019D00|$06:$9CF0:86 49 STX $49 ; object hero/target/item/string ID $49 0x019D02|$06:$9CF2:85 95 STA $95 ; ID for [item] and [spell] control codes 0x019D04|$06:$9CF4:20 FC 9A JSR $9AFC ; given hero ID in $97 and hero inventory index in $49, set Z if item is equipped and cursed, clear if not 0x019D07|$06:$9CF7:D0 07 BNE $9D00 ; call to code in a different bank ($0F:$FA2E) 0x019D09|$06:$9CF9:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019D0C|$06:$9CFC:12 ; String ID #$0112: It cannot be removed due to the curse.[end-FC] ; data -> code 0x019D0D|$06:$9CFD:4C D2 9C JMP $9CD2 ; control flow target (from $9CF7) 0x019D10|$06:$9D00:A5 95 LDA $95 ; ID for [item] and [spell] control codes; item ID to throw away 0x019D12|$06:$9D02:29 3F AND #$3F ; strip off the equipped bit 0x019D14|$06:$9D04:0A ASL 0x019D15|$06:$9D05:A8 TAY 0x019D16|$06:$9D06:B9 FC 9F LDA $9FFC,Y ; Item Prices, low byte 0x019D19|$06:$9D09:19 FD 9F ORA $9FFD,Y ; Item Prices, high byte 0x019D1C|$06:$9D0C:D0 07 BNE $9D15 ; if price is 0 G, it's a quest item ; call to code in a different bank ($0F:$FA2E) 0x019D1E|$06:$9D0E:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019D21|$06:$9D11:0E ; String ID #$010E: Thou should not throw that away.[end-FC] ; data -> code 0x019D22|$06:$9D12:4C D2 9C JMP $9CD2 ; control flow target (from $9D0C) 0x019D25|$06:$9D15:A5 97 LDA $97 ; subject hero ID $97 0x019D27|$06:$9D17:0A ASL ; 8 items per hero 0x019D28|$06:$9D18:0A ASL 0x019D29|$06:$9D19:0A ASL 0x019D2A|$06:$9D1A:18 CLC 0x019D2B|$06:$9D1B:65 49 ADC $49 ; object hero/target/item/string ID $49 0x019D2D|$06:$9D1D:AA TAX 0x019D2E|$06:$9D1E:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID to gain 0x019D30|$06:$9D20:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x019D33|$06:$9D23:A9 80 LDA #$80 ; Alive 0x019D35|$06:$9D25:20 9A 8D JSR $8D9A ; given hero ID in $97, and status in A, SEC if hero has that status, CLC otherwise 0x019D38|$06:$9D28:B0 12 BCS $9D3C 0x019D3A|$06:$9D2A:20 EB 9A JSR $9AEB ; using name of first living hero, display String ID #$0120: [name] [end-FF] 0x019D3D|$06:$9D2D:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019D40|$06:$9D30:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019D43|$06:$9D33:0F ; String ID #$010F: threw away [name]'s [item] and gave [end-FF] ; data -> code 0x019D44|$06:$9D34:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x019D46|$06:$9D36:85 95 STA $95 ; ID for [item] and [spell] control codes 0x019D48|$06:$9D38:A9 10 LDA #$10 ; String ID #$0110: the [item] to ghost of [name].[end-FC] 0x019D4A|$06:$9D3A:D0 0D BNE $9D49 ; control flow target (from $9D28) 0x019D4C|$06:$9D3C:20 25 8D JSR $8D25 ; print name of hero given by low 2 bits of $97 to [name] buffer $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x019D4F|$06:$9D3F:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x019D52|$06:$9D42:0C ; String ID #$010C: [name] threw away the [item].[end-FC] ; data -> code 0x019D53|$06:$9D43:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x019D55|$06:$9D45:85 95 STA $95 ; ID for [item] and [spell] control codes 0x019D57|$06:$9D47:A9 0D LDA #$0D ; String ID #$010D: [name] obtained the [item].[end-FC] ; control flow target (from $9D3A) ; call to code in a different bank ($0F:$FA4E) 0x019D59|$06:$9D49:20 4E FA JSR $FA4E ; display string ID specified by A + #$0100 0x019D5C|$06:$9D4C:4C 48 95 JMP $9548 ; end TALK/ITEM routines ; given hero ID in $97, set A to the offset of that hero's data in $062D ; control flow target (from $9BC5, $9BF2) 0x019D5F|$06:$9D4F:A6 97 LDX $97 ; subject hero ID $97 0x019D61|$06:$9D51:BD 55 9D LDA $9D55,X ; pre-computed offsets for the start of each hero's data at $062D 0x019D64|$06:$9D54:60 RTS ; code -> data ; pre-computed offsets for the start of each hero's data at $062D ; indexed data load target (from $9D51) 0x019D65|$06:$9D55:00 ; Midenhall 0x019D66|$06:$9D56:12 ; Cannock 0x019D67|$06:$9D57:24 ; Moonbrooke ; data -> code ; scan treasure list at ($0C), returning in A/$95/$96 the item ID corresponding to party's current map ID/position or #$00 if there is no item or you're not allowed to get it ; control flow target (from $9B3F, $9B73, $9DFB) 0x019D68|$06:$9D58:A0 00 LDY #$00 0x019D6A|$06:$9D5A:B1 0C LDA ($0C),Y ; read map ID 0x019D6C|$06:$9D5C:C9 FF CMP #$FF ; #$FF => end of list 0x019D6E|$06:$9D5E:D0 03 BNE $9D63 0x019D70|$06:$9D60:4C FE 9D JMP $9DFE ; end of treasure list or you aren't allowed to get the item again; set $95 = $96 = #$00 and RTS ; control flow target (from $9D5E) 0x019D73|$06:$9D63:C5 31 CMP $31 ; current map ID 0x019D75|$06:$9D65:F0 03 BEQ $9D6A ; map ID matches, start checking position 0x019D77|$06:$9D67:4C EE 9D JMP $9DEE ; increment 16-bit $0C-$0D by 4 (move to next treasure record) and loop to check next treasure ; map ID matches, start checking position ; control flow target (from $9D65) 0x019D7A|$06:$9D6A:C8 INY 0x019D7B|$06:$9D6B:B1 0C LDA ($0C),Y ; treasure X-pos 0x019D7D|$06:$9D6D:C5 16 CMP $16 ; current map X-pos (1) 0x019D7F|$06:$9D6F:D0 7D BNE $9DEE ; increment 16-bit $0C-$0D by 4 (move to next treasure record) and loop to check next treasure 0x019D81|$06:$9D71:C8 INY 0x019D82|$06:$9D72:B1 0C LDA ($0C),Y ; treasure Y-pos 0x019D84|$06:$9D74:C5 17 CMP $17 ; current map Y-pos (1) 0x019D86|$06:$9D76:D0 76 BNE $9DEE ; increment 16-bit $0C-$0D by 4 (move to next treasure record) and loop to check next treasure 0x019D88|$06:$9D78:C8 INY 0x019D89|$06:$9D79:B1 0C LDA ($0C),Y ; item ID 0x019D8B|$06:$9D7B:D0 03 BNE $9D80 ; map/position is valid and there is an item here 0x019D8D|$06:$9D7D:4C 00 9E JMP $9E00 ; store item ID in $95 and $96 and RTS ; map/position is valid and there is an item here ; control flow target (from $9D7B) 0x019D90|$06:$9D80:C9 45 CMP #$45 ; randomized gold chests have IDs >= #$45 0x019D92|$06:$9D82:B0 7C BCS $9E00 ; store item ID in $95 and $96 and RTS 0x019D94|$06:$9D84:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x019D96|$06:$9D86:C9 25 CMP #$25 ; Item ID #$25: Tresures 0x019D98|$06:$9D88:D0 09 BNE $9D93 0x019D9A|$06:$9D8A:A9 2A LDA #$2A ; Item ID #$2A: Echoing Flute 0x019D9C|$06:$9D8C: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 0x019D9F|$06:$9D8F:10 6D BPL $9DFE ; end of treasure list or you aren't allowed to get the item again; set $95 = $96 = #$00 and RTS 0x019DA1|$06:$9D91:30 27 BMI $9DBA ; control flow target (from $9D88) 0x019DA3|$06:$9D93:C9 2B CMP #$2B ; Item ID #$2B: Mirror of Ra 0x019DA5|$06:$9D95:D0 09 BNE $9DA0 0x019DA7|$06:$9D97:AD 51 06 LDA $0651 ; Moonbrooke status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x019DAA|$06:$9D9A:29 04 AND #$04 ; pick out the In Party bit 0x019DAC|$06:$9D9C:D0 60 BNE $9DFE ; end of treasure list or you aren't allowed to get the item again; set $95 = $96 = #$00 and RTS 0x019DAE|$06:$9D9E:F0 1A BEQ $9DBA ; control flow target (from $9D95) 0x019DB0|$06:$9DA0:C9 37 CMP #$37 ; Item ID #$37: Golden Key 0x019DB2|$06:$9DA2:D0 16 BNE $9DBA ; the Golden Key is available in 2 places in Zahan; a dog points you to the one at (#$16, #$08), and the other one is at (#$12, #$04) ; you can only pick it up from one place at a time, however, depending on the position of the dog 0x019DB4|$06:$9DA4:A5 17 LDA $17 ; current map Y-pos (1) 0x019DB6|$06:$9DA6:C9 04 CMP #$04 0x019DB8|$06:$9DA8:D0 09 BNE $9DB3 ; the (#$12, #$04) Golden Key 0x019DBA|$06:$9DAA:AD 7C 05 LDA $057C ; NPC #$08 X-pos; dog's X-pos 0x019DBD|$06:$9DAD:C9 12 CMP #$12 0x019DBF|$06:$9DAF:D0 3D BNE $9DEE ; increment 16-bit $0C-$0D by 4 (move to next treasure record) and loop to check next treasure 0x019DC1|$06:$9DB1:F0 07 BEQ $9DBA ; the (#$16, #$08) Golden Key ; control flow target (from $9DA8) 0x019DC3|$06:$9DB3:AD 7C 05 LDA $057C ; NPC #$08 X-pos; dog's X-pos 0x019DC6|$06:$9DB6:C9 12 CMP #$12 0x019DC8|$06:$9DB8:F0 34 BEQ $9DEE ; increment 16-bit $0C-$0D by 4 (move to next treasure record) and loop to check next treasure ; control flow target (from $9D91, $9D9E, $9DA2, $9DB1) 0x019DCA|$06:$9DBA:AD 24 9F LDA $9F24 ; -> $06:$9F26: unique items 0x019DCD|$06:$9DBD:85 0C STA $0C 0x019DCF|$06:$9DBF:AD 25 9F LDA $9F25 0x019DD2|$06:$9DC2:85 0D STA $0D 0x019DD4|$06:$9DC4:A0 00 LDY #$00 0x019DD6|$06:$9DC6:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID ; control flow target (from $9DCF) 0x019DD8|$06:$9DC8:D1 0C CMP ($0C),Y ; compare against list of unique items 0x019DDA|$06:$9DCA:F0 08 BEQ $9DD4 0x019DDC|$06:$9DCC:C8 INY 0x019DDD|$06:$9DCD:C0 12 CPY #$12 0x019DDF|$06:$9DCF:D0 F7 BNE $9DC8 ; if more items to check, check them 0x019DE1|$06:$9DD1:4C 00 9E JMP $9E00 ; store item ID in $95 and $96 and RTS; happens if item is not unique ; control flow target (from $9DCA) 0x019DE4|$06:$9DD4:C9 40 CMP #$40 ; we already handled IDs >= #$45, so this checks for Crests #$40 - #$44 0x019DE6|$06:$9DD6:B0 2D BCS $9E05 ; handle finding a Crest 0x019DE8|$06:$9DD8:20 60 A3 JSR $A360 ; check for item A (possibly equipped) in party inventory, returning inventory index of item in A/X if found, #$FF if not 0x019DEB|$06:$9DDB:10 21 BPL $9DFE ; end of treasure list or you aren't allowed to get the item again; set $95 = $96 = #$00 and RTS 0x019DED|$06:$9DDD:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x019DEF|$06:$9DDF:C9 24 CMP #$24 ; Item ID #$24: Token of Erdrick 0x019DF1|$06:$9DE1:D0 1D BNE $9E00 ; store item ID in $95 and $96 and RTS 0x019DF3|$06:$9DE3:A9 23 LDA #$23 ; Item ID #$23: Helmet of Erdrick 0x019DF5|$06:$9DE5:20 60 A3 JSR $A360 ; check for item A (possibly equipped) in party inventory, returning inventory index of item in A/X if found, #$FF if not 0x019DF8|$06:$9DE8:10 14 BPL $9DFE ; end of treasure list or you aren't allowed to get the item again; set $95 = $96 = #$00 and RTS 0x019DFA|$06:$9DEA:A9 24 LDA #$24 ; Item ID #$24: Token of Erdrick 0x019DFC|$06:$9DEC:D0 12 BNE $9E00 ; store item ID in $95 and $96 and RTS ; increment 16-bit $0C-$0D by 4 (move to next treasure record) and loop to check next treasure ; control flow target (from $9D67, $9D6F, $9D76, $9DAF, $9DB8) 0x019DFE|$06:$9DEE:A5 0C LDA $0C 0x019E00|$06:$9DF0:18 CLC 0x019E01|$06:$9DF1:69 04 ADC #$04 0x019E03|$06:$9DF3:85 0C STA $0C 0x019E05|$06:$9DF5:A5 0D LDA $0D 0x019E07|$06:$9DF7:69 00 ADC #$00 0x019E09|$06:$9DF9:85 0D STA $0D 0x019E0B|$06:$9DFB:4C 58 9D JMP $9D58 ; scan treasure list at ($0C), returning in A/$95/$96 the item ID corresponding to party's current map ID/position or #$00 if there is no item or you're not allowed to get it ; end of treasure list or you aren't allowed to get the item again; set $95 = $96 = #$00 and RTS ; control flow target (from $9D60, $9D8F, $9D9C, $9DDB, $9DE8, $9E1C) 0x019E0E|$06:$9DFE:A9 00 LDA #$00 ; store item ID in $95 and $96 and RTS ; control flow target (from $9D7D, $9D82, $9DD1, $9DE1, $9DEC, $9E28) 0x019E10|$06:$9E00:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs 0x019E12|$06:$9E02:85 95 STA $95 ; ID for [item] and [spell] control codes 0x019E14|$06:$9E04:60 RTS ; handle finding a Crest ; control flow target (from $9DD6) 0x019E15|$06:$9E05:C9 43 CMP #$43 ; Crest ID #$43: Water Crest 0x019E17|$06:$9E07:D0 04 BNE $9E0D 0x019E19|$06:$9E09:A9 08 LDA #$08 ; Crest ID #$43: Water Crest sets bit #$08 0x019E1B|$06:$9E0B:D0 0A BNE $9E17 ; control flow target (from $9E07) 0x019E1D|$06:$9E0D:C9 40 CMP #$40 0x019E1F|$06:$9E0F:D0 04 BNE $9E15 0x019E21|$06:$9E11:A9 01 LDA #$01 ; Crest ID #$40: Sun Crest sets bit #$01 0x019E23|$06:$9E13:D0 02 BNE $9E17 ; control flow target (from $9E0F) 0x019E25|$06:$9E15:A9 10 LDA #$10 ; by process of elimination, Crest ID #$44: Life Crest sets bit #$10 ; control flow target (from $9E0B, $9E13) 0x019E27|$06:$9E17:85 0C STA $0C 0x019E29|$06:$9E19:2D 12 01 AND $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x019E2C|$06:$9E1C:D0 E0 BNE $9DFE ; end of treasure list or you aren't allowed to get the item again; set $95 = $96 = #$00 and RTS 0x019E2E|$06:$9E1E:A5 0C LDA $0C 0x019E30|$06:$9E20:0D 12 01 ORA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x019E33|$06:$9E23:8D 12 01 STA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun); mark Crest as found 0x019E36|$06:$9E26:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x019E38|$06:$9E28:D0 D6 BNE $9E00 ; store item ID in $95 and $96 and RTS ; code -> data ; -> $06:$9E2E: Treasure List 1 (map ID, X-pos, Y-pos, item ID) ; data load target (from $9B35) 0x019E3A|$06:$9E2A:2E ; data load target (from $9B3A) 0x019E3B|$06:$9E2B: 9E ; $06:$9E2E; Treasure List 1 (map ID, X-pos, Y-pos, item ID) ; -> $06:$9F07: Treasure List 2 (map ID, X-pos, Y-pos, item ID) ; data load target (from $9B69) 0x019E3C|$06:$9E2C:07 ; data load target (from $9B6E) 0x019E3D|$06:$9E2D: 9F ; $06:$9F07; Treasure List 2 (map ID, X-pos, Y-pos, item ID) ; Treasure List 1 (map ID, X-pos, Y-pos, item ID) ; indirect data load target (via $9E2A) 0x019E3E|$06:$9E2E:03 0E 02 06 ; Item ID #$06: Copper Sword (Midenhall Castle) 0x019E42|$06:$9E32:03 13 0E 35 ; Item ID #$35: Wing of Wyvern (Midenhall Castle) 0x019E46|$06:$9E36:03 14 0E 3C ; Item ID #$3C: Medical Herb (Midenhall Castle) 0x019E4A|$06:$9E3A:03 13 0F 47 ; Item ID #$47: 50 - 113 G (Midenhall Castle) 0x019E4E|$06:$9E3E:03 14 0F 00 ; Item ID #$00: Empty (Midenhall Castle) 0x019E52|$06:$9E42:03 15 0F 24 ; Item ID #$24: Token of Erdrick (Midenhall Castle) 0x019E56|$06:$9E46:06 0A 0A 20 ; Item ID #$20: Shield of Erdrick (Cannock Castle) 0x019E5A|$06:$9E4A:0F 06 14 1A ; Item ID #$1A: Armor of Gaia (Osterfair) 0x019E5E|$06:$9E4E:0F 06 16 02 ; Item ID #$02: Magic Knife (Osterfair) 0x019E62|$06:$9E52:10 02 02 2D ; Item ID #$2D: Magic Loom (Zahan) 0x019E66|$06:$9E56:18 07 06 33 ; Item ID #$33: Lottery Ticket (Charlock Castle) 0x019E6A|$06:$9E5A:18 08 06 3C ; Item ID #$3C: Medical Herb (Charlock Castle) 0x019E6E|$06:$9E5E:18 06 07 49 ; Item ID #$49: 100 - 163 G (Charlock Castle) 0x019E72|$06:$9E62:18 07 07 35 ; Item ID #$35: Wing of Wyvern (Charlock Castle) 0x019E76|$06:$9E66:2C 12 0C 3C ; Item ID #$3C: Medical Herb (Lake Cave B1) 0x019E7A|$06:$9E6A:2C 0E 1C 45 ; Item ID #$45: 15 - 30 G (Lake Cave B1) 0x019E7E|$06:$9E6E:2D 0E 0C 3C ; Item ID #$3C: Medical Herb (Lake Cave B2) 0x019E82|$06:$9E72:2D 14 1A 46 ; Item ID #$46: 31 - 46 G (Lake Cave B2) 0x019E86|$06:$9E76:2D 02 14 3B ; Item ID #$3B: Antidote Herb (Lake Cave B2) 0x019E8A|$06:$9E7A:2D 14 1C 35 ; Item ID #$35: Wing of Wyvern (Lake Cave B2) 0x019E8E|$06:$9E7E:2D 14 14 38 ; Item ID #$38: Silver Key (Lake Cave B2) 0x019E92|$06:$9E82:2E 18 02 4B ; Item ID #$4B: 111 - 142 G (Sea Cave B1) 0x019E96|$06:$9E86:2E 02 0A 3C ; Item ID #$3C: Medical Herb (Sea Cave B1) 0x019E9A|$06:$9E8A:2F 20 0E FF ; Item ID #$FF: Trap (Sea Cave B2) 0x019E9E|$06:$9E8E:2F 0E 18 48 ; Item ID #$48: 51 - 82 G (Sea Cave B2) 0x019EA2|$06:$9E92:31 02 02 49 ; Item ID #$49: 100 - 163 G (Sea Cave B3(2)) 0x019EA6|$06:$9E96:31 0A 02 FF ; Item ID #$FF: Trap (Sea Cave B3(2)) 0x019EAA|$06:$9E9A:32 10 0E 30 ; Item ID #$30: Dragon's Bane (Sea Cave B4) 0x019EAE|$06:$9E9E:33 16 02 28 ; Item ID #$28: Eye of Malroth (Sea Cave B5) 0x019EB2|$06:$9EA2:34 0E 10 0F ; Item ID #$0F: Sword of Erdrick (Charlock Castle) 0x019EB6|$06:$9EA6:37 10 10 44 ; Item ID #$44: Life Crest (Cave to Rhone B1) 0x019EBA|$06:$9EAA:3C 0C 1A 4B ; Item ID #$4B: 111 - 142 G (Cave to Rhone 3F) 0x019EBE|$06:$9EAE:3C 0E 32 10 ; Item ID #$10: Thunder Sword (Cave to Rhone 3F) 0x019EC2|$06:$9EB2:3C 1E 2C 33 ; Item ID #$33: Lottery Ticket (Cave to Rhone 3F) 0x019EC6|$06:$9EB6:3E 18 0E 1B ; Item ID #$1B: Armor of Erdrick (Cave to Rhone 5F) 0x019ECA|$06:$9EBA:3E 1A 18 4D ; Item ID #$4D: 111 - 174 G (Cave to Rhone 5F) 0x019ECE|$06:$9EBE:3E 12 20 FF ; Item ID #$FF: Trap (Cave to Rhone 5F) 0x019ED2|$06:$9EC2:3E 12 24 4A ; Item ID #$4A: 561 - 624 G (Cave to Rhone 5F) 0x019ED6|$06:$9EC6:40 02 0E 3C ; Item ID #$3C: Medical Herb (Spring Of Bravery) 0x019EDA|$06:$9ECA:40 0E 1A 45 ; Item ID #$45: 15 - 30 G (Spring Of Bravery) 0x019EDE|$06:$9ECE:40 16 1C 3C ; Item ID #$3C: Medical Herb (Spring Of Bravery) 0x019EE2|$06:$9ED2:49 12 14 3C ; Item ID #$3C: Medical Herb (Moon Tower 1F) 0x019EE6|$06:$9ED6:49 10 02 26 ; Item ID #$26: Moon Fragment (Moon Tower 1F) 0x019EEA|$06:$9EDA:4B 02 02 50 ; Item ID #$50: 101 - 132 G (Moon Tower 3F) 0x019EEE|$06:$9EDE:4C 04 0C 01 ; Item ID #$01: Bamboo Stick (Moon Tower 4F) 0x019EF2|$06:$9EE2:4C 02 0C 4F ; Item ID #$4F: 251 - 282 G (Moon Tower 4F) 0x019EF6|$06:$9EE6:50 14 0A 51 ; Item ID #$51: 38 - 53 G (Lighthouse 1F) 0x019EFA|$06:$9EEA:51 1E 1C 00 ; Item ID #$00: Empty (triggers Star Crest battle) (Lighthouse 2F) 0x019EFE|$06:$9EEE:53 0C 16 4E ; Item ID #$4E: 120 - 135 G (Lighthouse 4F) 0x019F02|$06:$9EF2:54 16 02 34 ; Item ID #$34: Fairy Water (Lighthouse 5F) 0x019F06|$06:$9EF6:54 0E 12 07 ; Item ID #$07: Chain Sickle (Lighthouse 5F) 0x019F0A|$06:$9EFA:58 10 14 3C ; Item ID #$3C: Medical Herb (Wind Tower 1F) 0x019F0E|$06:$9EFE:59 02 04 2E ; Item ID #$2E: Cloak of Wind (Wind Tower 2F) 0x019F12|$06:$9F02:5A 06 10 4C ; Item ID #$4C: 41 - 56 G (Wind Tower 3F) ; indirect data load target 0x019F16|$06:$9F06:FF ; end of Treasure List 1 ; Treasure List 2 (map ID, X-pos, Y-pos, item ID) ; indirect data load target (via $9E2C) 0x019F17|$06:$9F07:01 92 6D 2B ; Item ID #$2B: Mirror of Ra (Swamp SE of Hamlin) 0x019F1B|$06:$9F0B:01 1E FC 25 ; Item ID #$25: Tresures (Ocean NW of Tantegal) 0x019F1F|$06:$9F0F:01 BB DD 29 ; Item ID #$29: Leaf of World Tree (Island E of Wellgarth) 0x019F23|$06:$9F13:08 05 01 43 ; Item ID #$43: Water Crest (Hamlin) 0x019F27|$06:$9F17:1E 08 00 40 ; Item ID #$40: Sun Crest (Monolith E of Wellgarth) 0x019F2B|$06:$9F1B:10 12 04 37 ; Item ID #$37: Golden Key location #1 (Zahan) 0x019F2F|$06:$9F1F:10 16 08 37 ; Item ID #$37: Golden Key location #2 (Zahan) ; indirect data load target 0x019F33|$06:$9F23:FF ; end of Treasure List 2 ; -> $06:$9F26: unique items ; data load target (from $9DBA) 0x019F34|$06:$9F24:26 ; data load target (from $9DBF) 0x019F35|$06:$9F25: 9F ; $06:$9F26; unique items ; unique items ; indirect data load target (via $9F24) 0x019F36|$06:$9F26:38 ; Item ID #$38: Silver Key 0x019F37|$06:$9F27:25 ; Item ID #$25: Tresures 0x019F38|$06:$9F28:29 ; Item ID #$29: Leaf of The World Tree 0x019F39|$06:$9F29:24 ; Item ID #$24: Token of Erdrick 0x019F3A|$06:$9F2A:20 ; Item ID #$20: Shield of Erdrick 0x019F3B|$06:$9F2B:43 ; Crest ID #$43: Water Crest 0x019F3C|$06:$9F2C:1A ; Item ID #$1A: Armor of Gaia 0x019F3D|$06:$9F2D:10 ; Item ID #$10: Thunder Sword 0x019F3E|$06:$9F2E:40 ; Crest ID #$40: Sun Crest 0x019F3F|$06:$9F2F:28 ; Item ID #$28: Eye of Malroth 0x019F40|$06:$9F30:0F ; Item ID #$0F: Sword of Erdrick 0x019F41|$06:$9F31:44 ; Crest ID #$44: Life Crest 0x019F42|$06:$9F32:1B ; Item ID #$1B: Armor of Erdrick 0x019F43|$06:$9F33:26 ; Item ID #$26: Moon Fragment 0x019F44|$06:$9F34:2E ; Item ID #$2E: Cloak of Wind 0x019F45|$06:$9F35:2B ; Item ID #$2B: Mirror of Ra 0x019F46|$06:$9F36:37 ; Item ID #$37: Golden Key 0x019F47|$06:$9F37:2D ; Item ID #$2D: Magic Loom ; base treasure chest gold amount, low byte ; random gold amounts ; indexed data load target (from $9C4C) 0x019F48|$06:$9F38:0F ; base treasure chest gold amount, high byte ; indexed data load target (from $9C51) 0x019F49|$06:$9F39: 00 ; random treasure chest gold amount ; indexed data load target (from $9C46) 0x019F4A|$06:$9F3A: 0F ; Chest Gold ID #$45: 15 - 30 G 0x019F4B|$06:$9F3B:1F 00 0F ; Chest Gold ID #$46: 31 - 46 G 0x019F4E|$06:$9F3E:32 00 3F ; Chest Gold ID #$47: 50 - 113 G 0x019F51|$06:$9F41:33 00 1F ; Chest Gold ID #$48: 51 - 82 G 0x019F54|$06:$9F44:64 00 3F ; Chest Gold ID #$49: 100 - 163 G 0x019F57|$06:$9F47:31 02 3F ; Chest Gold ID #$4A: 561 - 624 G 0x019F5A|$06:$9F4A:6F 00 1F ; Chest Gold ID #$4B: 111 - 142 G 0x019F5D|$06:$9F4D:29 00 0F ; Chest Gold ID #$4C: 41 - 56 G 0x019F60|$06:$9F50:6F 00 3F ; Chest Gold ID #$4D: 111 - 174 G 0x019F63|$06:$9F53:78 00 0F ; Chest Gold ID #$4E: 120 - 135 G 0x019F66|$06:$9F56:FB 00 1F ; Chest Gold ID #$4F: 251 - 282 G 0x019F69|$06:$9F59:65 00 1F ; Chest Gold ID #$50: 101 - 132 G 0x019F6C|$06:$9F5C:26 00 0F ; Chest Gold ID #$51: 38 - 53 G ; Crest Names ; indexed data load target (from $9C25) 0x019F6F|$06:$9F5F:36 1E 17 5F 26 1B 0E 1C 1D FA ; "Sun Crest" + [end-FA] 0x019F79|$06:$9F69:3A 0A 1D 0E 1B 5F 26 1B 0E 1C 1D FA ; "Water Crest" + [end-FA] 0x019F85|$06:$9F75:2F 12 0F 0E 5F 26 1B 0E 1C 1D FA ; "Life Crest" + [end-FA] ; Inn prices per party member ; indexed data load target (from $821F) 0x019F90|$06:$9F80:04 ; Inn ID #$00, Map IDs #$00/#$03: Fake Midenhall/Midenhall 1F 0x019F91|$06:$9F81:06 ; Inn ID #$01, Map ID #$05: Leftwyne 0x019F92|$06:$9F82:08 ; Inn ID #$02, Map ID #$06: Cannock 0x019F93|$06:$9F83:0C ; Inn ID #$03, Map ID #$07: Hamlin 0x019F94|$06:$9F84:14 ; Inn ID #$04, Map ID #$0B: Lianport 0x019F95|$06:$9F85:02 ; Inn ID #$05, Map ID #$0C: Tantegel 0x019F96|$06:$9F86:19 ; Inn ID #$06, Map ID #$0F: Osterfair 0x019F97|$06:$9F87:1E ; Inn ID #$07, Map ID #$10: Zahan 0x019F98|$06:$9F88:28 ; Inn ID #$08, Map ID #$11: Tuhn / Map ID #$14: Wellgarth Underground 0x019F99|$06:$9F89:1E ; Weapon Shop inventories ; external indexed data load target (from $0F:$F266, $0F:$F278, $0F:$F299) 0x019F9A|$06:$9F8A:05 06 02 07 16 1C ; Shop ID #00, Weapons/Armor, Map ID #$05: Leftwyne 0x019FA0|$06:$9F90:07 08 0A 16 19 1E ; Shop ID #01, Weapons/Armor, Map ID #$07: Hamlin 0x019FA6|$06:$9F96:02 0A 03 19 12 1E ; Shop ID #02, Weapons/Armor, Map ID #$0B: Lianport 0x019FAC|$06:$9F9C:0A 0B 03 12 1E 22 ; Shop ID #03, Weapons/Armor, Map ID #$0C: Tantegel 0x019FB2|$06:$9FA2:0A 0B 0D 12 18 22 ; Shop ID #04, Weapons/Armor, Map ID #$0F: Osterfair 0x019FB8|$06:$9FA8:03 09 0D 18 1D 22 ; Shop ID #05, Weapons/Armor, Map ID #$11: Tuhn 0x019FBE|$06:$9FAE:0B 0D 0E 14 1D 22 ; Shop ID #06, Weapons/Armor, Map ID #$14: Wellgarth Underground 0x019FC4|$06:$9FB4:0B 03 0D 1E 1D 22 ; Shop ID #07, Weapons/Armor, Map ID #$15: Beran ; Tool Shop inventories 0x019FCA|$06:$9FBA:3C 3B 00 00 00 00 ; Shop ID #$00, Items, Map IDs #$00/#$03: Fake Midenhall/Midenhall 1F 0x019FD0|$06:$9FC0:3C 3B 35 00 00 00 ; Shop ID #$01, Items, Map ID #$05: Leftwyne 0x019FD6|$06:$9FC6:3C 3B 35 34 00 00 ; Shop ID #$02, Items, Map ID #$06: Cannock 0x019FDC|$06:$9FCC:3C 3B 35 34 00 00 ; Shop ID #$03, Items, Map ID #$07: Hamlin 0x019FE2|$06:$9FD2:3C 3B 35 34 30 00 ; Shop ID #$04, Items, Map ID #$0B: Lianport 0x019FE8|$06:$9FD8:3C 3B 35 34 30 00 ; Shop ID #$05, Items, Map ID #$0C: Tantegel 0x019FEE|$06:$9FDE:3C 35 34 30 00 00 ; Shop ID #$06, Items, Map ID #$10: Zahan 0x019FF4|$06:$9FE4:35 34 30 00 00 00 ; Shop ID #$07, Items, Map ID #$11: Tuhn 0x019FFA|$06:$9FEA:3C 3B 34 30 00 00 ; Shop ID #$08, Items, Map ID #$14: Wellgarth Underground, #1 0x01A000|$06:$9FF0:3C 3B 39 35 00 00 ; Shop ID #$09, Items, Map ID #$14: Wellgarth Underground, #2 0x01A006|$06:$9FF6:3C 3B 35 34 00 00 ; Shop ID #$0A, Items, Map ID #$15: Beran ; Item Prices, low byte ; indexed data load target (from $84D7, $84E9, $8D15, $8D51, $8D6C, $9A8B, $9D06) ; external indexed data load target (from $0F:$EED3) 0x01A00C|$06:$9FFC:00 ; Item Prices, high byte ; indexed data load target (from $84DC, $84F1, $8D1D, $8D56, $8D74, $9A8E, $9D09) ; external indexed data load target (from $0F:$EED8) 0x01A00D|$06:$9FFD: 00 ; Item ID #$00: (no item) 0x01A00E|$06:$9FFE:14 00 ; Item ID #$01: Bamboo Stick 0x01A010|$06:$A000:C8 00 ; Item ID #$02: Magic Knife 0x01A012|$06:$A002:C4 09 ; Item ID #$03: Wizard’s Wand 0x01A014|$06:$A004:90 65 ; Item ID #$04: Staff of Thunder 0x01A016|$06:$A006:3C 00 ; Item ID #$05: Club 0x01A018|$06:$A008:64 00 ; Item ID #$06: Copper Sword 0x01A01A|$06:$A00A:86 01 ; Item ID #$07: Chain Sickle 0x01A01C|$06:$A00C:02 03 ; Item ID #$08: Iron Spear 0x01A01E|$06:$A00E:A8 61 ; Item ID #$09: Falcon Sword 0x01A020|$06:$A010:DC 05 ; Item ID #$0A: Broad Sword 0x01A022|$06:$A012:A0 0F ; Item ID #$0B: Giant Hammer 0x01A024|$06:$A014:98 3A ; Item ID #$0C: Sword of Destruction 0x01A026|$06:$A016:40 1F ; Item ID #$0D: Dragon Killer 0x01A028|$06:$A018:80 3E ; Item ID #$0E: Light Sword 0x01A02A|$06:$A01A:02 00 ; Item ID #$0F: Sword of Erdrick 0x01A02C|$06:$A01C:F4 01 ; Item ID #$10: Thunder Sword 0x01A02E|$06:$A01E:1E 00 ; Item ID #$11: Clothes 0x01A030|$06:$A020:E2 04 ; Item ID #$12: Clothes Hiding 0x01A032|$06:$A022:46 00 ; Item ID #$13: Water Flying Cloth 0x01A034|$06:$A024:E8 FD ; Item ID #$14: Mink Coat 0x01A036|$06:$A026:96 00 ; Item ID #$15: Leather Armor 0x01A038|$06:$A028:E0 01 ; Item ID #$16: Chain Mail 0x01A03A|$06:$A02A:00 19 ; Item ID #$17: Gremlin’s Armor 0x01A03C|$06:$A02C:CC 10 ; Item ID #$18: Magic Armor 0x01A03E|$06:$A02E:E8 03 ; Item ID #$19: Full Plate Armor 0x01A040|$06:$A030:32 00 ; Item ID #$1A: Armor of Gaia 0x01A042|$06:$A032:04 00 ; Item ID #$1B: Armor of Erdrick 0x01A044|$06:$A034:5A 00 ; Item ID #$1C: Leather Shield 0x01A046|$06:$A036:FC 53 ; Item ID #$1D: Shield of Strength 0x01A048|$06:$A038:D0 07 ; Item ID #$1E: Steel Shield 0x01A04A|$06:$A03A:60 22 ; Item ID #$1F: Evil Shield 0x01A04C|$06:$A03C:14 00 ; Item ID #$20: Shield of Erdrick 0x01A04E|$06:$A03E:20 4E ; Item ID #$21: Mysterious Hat 0x01A050|$06:$A040:4E 0C ; Item ID #$22: Iron Helmet 0x01A052|$06:$A042:46 00 ; Item ID #$23: Helmet of Erdrick 0x01A054|$06:$A044:0A 00 ; Item ID #$24: Token of Erdrick 0x01A056|$06:$A046:00 00 ; Item ID #$25: Tresures 0x01A058|$06:$A048:2C 01 ; Item ID #$26: Moon Fragment 0x01A05A|$06:$A04A:00 00 ; Item ID #$27: Charm of Rubiss 0x01A05C|$06:$A04C:00 00 ; Item ID #$28: Eye of Malroth 0x01A05E|$06:$A04E:06 00 ; Item ID #$29: Leaf of The World Tree 0x01A060|$06:$A050:90 01 ; Item ID #$2A: Echoing Flute 0x01A062|$06:$A052:00 00 ; Item ID #$2B: Mirror of Ra 0x01A064|$06:$A054:28 00 ; Item ID #$2C: Dew’s Yarn 0x01A066|$06:$A056:1E 00 ; Item ID #$2D: Magic Loom 0x01A068|$06:$A058:46 00 ; Item ID #$2E: Cloak of Wind 0x01A06A|$06:$A05A:DC 05 ; Item ID #$2F: Gremlin’s Tail 0x01A06C|$06:$A05C:80 02 ; Item ID #$30: Dragon’s Bane 0x01A06E|$06:$A05E:10 27 ; Item ID #$31: Dragon’s Potion 0x01A070|$06:$A060:F4 01 ; Item ID #$32: Golden Card 0x01A072|$06:$A062:46 00 ; Item ID #$33: Lottery Ticket 0x01A074|$06:$A064:28 00 ; Item ID #$34: Fairy Water 0x01A076|$06:$A066:50 00 ; Item ID #$35: Wing of the Wyvern 0x01A078|$06:$A068:02 00 ; Item ID #$36: [blank] 0x01A07A|$06:$A06A:02 00 ; Item ID #$37: Golden Key 0x01A07C|$06:$A06C:02 00 ; Item ID #$38: Silver Key 0x01A07E|$06:$A06E:D0 07 ; Item ID #$39: Jailor’s Key 0x01A080|$06:$A070:00 00 ; Item ID #$3A: Watergate Key 0x01A082|$06:$A072:08 00 ; Item ID #$3B: Antidote Herb 0x01A084|$06:$A074:0F 00 ; Item ID #$3C: Medical Herb 0x01A086|$06:$A076:28 0A ; Item ID #$3D: Wizard’s Ring 0x01A088|$06:$A078:02 00 ; Item ID #$3E: Perilous 0x01A08A|$06:$A07A:02 00 ; Item ID #$3F: [blank] ; data -> code ; control flow target (from $A141, $A14C) 0x01A08C|$06:$A07C:A5 47 LDA $47 ; Stepguard flag 0x01A08E|$06:$A07E:10 08 BPL $A088 0x01A090|$06:$A080:C0 04 CPY #$04 0x01A092|$06:$A082:D0 11 BNE $A095 0x01A094|$06:$A084:A9 07 LDA #$07 0x01A096|$06:$A086:85 47 STA $47 ; Stepguard flag ; control flow target (from $A07E) 0x01A098|$06:$A088:98 TYA 0x01A099|$06:$A089:25 47 AND $47 ; Stepguard flag 0x01A09B|$06:$A08B:F0 0D BEQ $A09A 0x01A09D|$06:$A08D:0A ASL 0x01A09E|$06:$A08E:38 SEC 0x01A09F|$06:$A08F:E9 01 SBC #$01 0x01A0A1|$06:$A091:05 47 ORA $47 ; Stepguard flag 0x01A0A3|$06:$A093:85 47 STA $47 ; Stepguard flag ; control flow target (from $A082) 0x01A0A5|$06:$A095:68 PLA 0x01A0A6|$06:$A096:68 PLA 0x01A0A7|$06:$A097:4C A1 A1 JMP $A1A1 ; control flow target (from $A08B) 0x01A0AA|$06:$A09A:60 RTS ; code -> data ; indexed data load target (from $A11D) 0x01A0AB|$06:$A09B:04 0x01A0AC|$06:$A09C:02 0x01A0AD|$06:$A09D:01 ; data -> code ; external control flow target (from $0F:$C89E) 0x01A0AE|$06:$A09E:AD 5A 01 LDA $015A 0x01A0B1|$06:$A0A1:8D 5B 01 STA $015B 0x01A0B4|$06:$A0A4:AD 59 01 LDA $0159 0x01A0B7|$06:$A0A7:8D 5A 01 STA $015A 0x01A0BA|$06:$A0AA:A5 3B LDA $3B ; high nybble = terrain ID 0x01A0BC|$06:$A0AC:8D 59 01 STA $0159 0x01A0BF|$06:$A0AF:A9 00 LDA #$00 0x01A0C1|$06:$A0B1:85 0E STA $0E 0x01A0C3|$06:$A0B3:A9 06 LDA #$06 0x01A0C5|$06:$A0B5:85 94 STA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x01A0C7|$06:$A0B7:A5 46 LDA $46 ; Repel (#$FE) / Fairy Water (#$FF) flag 0x01A0C9|$06:$A0B9:F0 23 BEQ $A0DE 0x01A0CB|$06:$A0BB:C9 01 CMP #$01 0x01A0CD|$06:$A0BD:D0 04 BNE $A0C3 0x01A0CF|$06:$A0BF:A9 2B LDA #$2B ; String ID #$012B: The Fairy Water evaporated and lost its power.[end-FC] 0x01A0D1|$06:$A0C1:D0 06 BNE $A0C9 ; control flow target (from $A0BD) 0x01A0D3|$06:$A0C3:C9 02 CMP #$02 0x01A0D5|$06:$A0C5:D0 13 BNE $A0DA 0x01A0D7|$06:$A0C7:A9 BE LDA #$BE ; String ID #$01BE: Repel has lost its effect.[end-FC] ; control flow target (from $A0C1) 0x01A0D9|$06:$A0C9:48 PHA ; call to code in a different bank ($0F:$EB76) 0x01A0DA|$06:$A0CA:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x01A0DD|$06:$A0CD:04 ; Menu ID #$04: Dialogue window ; data -> code 0x01A0DE|$06:$A0CE:68 PLA ; call to code in a different bank ($0F:$FA4E) 0x01A0DF|$06:$A0CF:20 4E FA JSR $FA4E ; display string ID specified by A + #$0100 0x01A0E2|$06:$A0D2:A9 01 LDA #$01 0x01A0E4|$06:$A0D4:85 0E STA $0E 0x01A0E6|$06:$A0D6:A9 02 LDA #$02 0x01A0E8|$06:$A0D8:85 46 STA $46 ; Repel (#$FE) / Fairy Water (#$FF) flag ; control flow target (from $A0C5) 0x01A0EA|$06:$A0DA:C6 46 DEC $46 ; Repel (#$FE) / Fairy Water (#$FF) flag 0x01A0EC|$06:$A0DC:C6 46 DEC $46 ; Repel (#$FE) / Fairy Water (#$FF) flag ; control flow target (from $A0B9) 0x01A0EE|$06:$A0DE:EE FB 05 INC $05FB ; movement counter 0x01A0F1|$06:$A0E1:AD FB 05 LDA $05FB ; movement counter 0x01A0F4|$06:$A0E4:29 03 AND #$03 0x01A0F6|$06:$A0E6:D0 26 BNE $A10E 0x01A0F8|$06:$A0E8: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) 0x01A0FA|$06:$A0EA:C9 01 CMP #$01 0x01A0FC|$06:$A0EC:F0 20 BEQ $A10E 0x01A0FE|$06:$A0EE:A0 00 LDY #$00 ; control flow target (from $A10C) 0x01A100|$06:$A0F0:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01A103|$06:$A0F3:29 A0 AND #$A0 0x01A105|$06:$A0F5:C9 A0 CMP #$A0 0x01A107|$06:$A0F7:D0 0C BNE $A105 0x01A109|$06:$A0F9:98 TYA 0x01A10A|$06:$A0FA:48 PHA 0x01A10B|$06:$A0FB:20 62 A2 JSR $A262 0x01A10E|$06:$A0FE:68 PLA 0x01A10F|$06:$A0FF:A8 TAY 0x01A110|$06:$A100:A9 01 LDA #$01 0x01A112|$06:$A102:20 C7 A1 JSR $A1C7 ; control flow target (from $A0F7) 0x01A115|$06:$A105:98 TYA 0x01A116|$06:$A106:18 CLC 0x01A117|$06:$A107:69 12 ADC #$12 0x01A119|$06:$A109:A8 TAY 0x01A11A|$06:$A10A:C0 36 CPY #$36 0x01A11C|$06:$A10C:90 E2 BCC $A0F0 ; control flow target (from $A0E6, $A0EC) 0x01A11E|$06:$A10E:A9 24 LDA #$24 0x01A120|$06:$A110:85 49 STA $49 ; object hero/target/item/string ID $49 0x01A122|$06:$A112:A9 00 LDA #$00 0x01A124|$06:$A114:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs ; control flow target (from $A1AA) 0x01A126|$06:$A116:A5 49 LDA $49 ; object hero/target/item/string ID $49 0x01A128|$06:$A118:4A LSR 0x01A129|$06:$A119:4A LSR 0x01A12A|$06:$A11A:4A LSR 0x01A12B|$06:$A11B:4A LSR 0x01A12C|$06:$A11C:AA TAX 0x01A12D|$06:$A11D:BC 9B A0 LDY $A09B,X 0x01A130|$06:$A120:BD 59 01 LDA $0159,X 0x01A133|$06:$A123:C9 70 CMP #$70 0x01A135|$06:$A125:D0 04 BNE $A12B 0x01A137|$06:$A127:A9 02 LDA #$02 0x01A139|$06:$A129:D0 36 BNE $A161 ; control flow target (from $A125) 0x01A13B|$06:$A12B:C9 A0 CMP #$A0 0x01A13D|$06:$A12D:D0 0E BNE $A13D 0x01A13F|$06:$A12F:A5 31 LDA $31 ; current map ID 0x01A141|$06:$A131:C9 2E CMP #$2E ; Map ID #$2E: Sea Cave B1 0x01A143|$06:$A133:90 1E BCC $A153 0x01A145|$06:$A135:C9 34 CMP #$34 ; Map ID #$34: Charlock Castle B1/B2 0x01A147|$06:$A137:B0 1A BCS $A153 0x01A149|$06:$A139:A9 01 LDA #$01 0x01A14B|$06:$A13B:D0 24 BNE $A161 ; control flow target (from $A12D) 0x01A14D|$06:$A13D:C9 80 CMP #$80 0x01A14F|$06:$A13F:D0 07 BNE $A148 0x01A151|$06:$A141:20 7C A0 JSR $A07C 0x01A154|$06:$A144:A9 0F LDA #$0F 0x01A156|$06:$A146:D0 19 BNE $A161 ; control flow target (from $A13F) 0x01A158|$06:$A148:C9 90 CMP #$90 0x01A15A|$06:$A14A:D0 07 BNE $A153 0x01A15C|$06:$A14C:20 7C A0 JSR $A07C 0x01A15F|$06:$A14F:A9 1E LDA #$1E 0x01A161|$06:$A151:D0 0E BNE $A161 ; control flow target (from $A133, $A137, $A14A) 0x01A163|$06:$A153:A5 47 LDA $47 ; Stepguard flag 0x01A165|$06:$A155:30 4A BMI $A1A1 0x01A167|$06:$A157:98 TYA 0x01A168|$06:$A158:49 FF EOR #$FF 0x01A16A|$06:$A15A:25 47 AND $47 ; Stepguard flag 0x01A16C|$06:$A15C:85 47 STA $47 ; Stepguard flag 0x01A16E|$06:$A15E:4C A1 A1 JMP $A1A1 ; control flow target (from $A129, $A13B, $A146, $A151) 0x01A171|$06:$A161:85 CC STA $CC 0x01A173|$06:$A163:A4 49 LDY $49 ; object hero/target/item/string ID $49 0x01A175|$06:$A165:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01A178|$06:$A168:10 37 BPL $A1A1 0x01A17A|$06:$A16A:A9 5B LDA #$5B 0x01A17C|$06:$A16C:20 B5 A1 JSR $A1B5 0x01A17F|$06:$A16F:B0 30 BCS $A1A1 0x01A181|$06:$A171:A5 CC LDA $CC 0x01A183|$06:$A173:C9 0A CMP #$0A 0x01A185|$06:$A175:B0 07 BCS $A17E 0x01A187|$06:$A177:A9 53 LDA #$53 0x01A189|$06:$A179:20 B5 A1 JSR $A1B5 0x01A18C|$06:$A17C:B0 23 BCS $A1A1 ; control flow target (from $A175) 0x01A18E|$06:$A17E:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs 0x01A190|$06:$A180:D0 18 BNE $A19A 0x01A192|$06:$A182:98 TYA 0x01A193|$06:$A183:48 PHA 0x01A194|$06:$A184:A5 CC LDA $CC 0x01A196|$06:$A186:C9 0A CMP #$0A 0x01A198|$06:$A188:B0 0B BCS $A195 0x01A19A|$06:$A18A:A9 91 LDA #$91 ; Music ID #$91: swamp SFX ; call to code in a different bank ($0F:$C561) 0x01A19C|$06:$A18C:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x01A19F|$06:$A18F:20 62 A2 JSR $A262 0x01A1A2|$06:$A192:4C 98 A1 JMP $A198 ; control flow target (from $A188) 0x01A1A5|$06:$A195:20 96 A2 JSR $A296 ; control flow target (from $A192) 0x01A1A8|$06:$A198:68 PLA 0x01A1A9|$06:$A199:A8 TAY ; control flow target (from $A180) 0x01A1AA|$06:$A19A:E6 96 INC $96 ; temp storage for item/spell/type/etc. IDs 0x01A1AC|$06:$A19C:A5 CC LDA $CC 0x01A1AE|$06:$A19E:20 C7 A1 JSR $A1C7 ; control flow target (from $A097, $A155, $A15E, $A168, $A16F, $A17C) 0x01A1B1|$06:$A1A1:A5 49 LDA $49 ; object hero/target/item/string ID $49 0x01A1B3|$06:$A1A3:38 SEC 0x01A1B4|$06:$A1A4:E9 12 SBC #$12 0x01A1B6|$06:$A1A6:85 49 STA $49 ; object hero/target/item/string ID $49 0x01A1B8|$06:$A1A8:30 03 BMI $A1AD 0x01A1BA|$06:$A1AA:4C 16 A1 JMP $A116 ; control flow target (from $A1A8) 0x01A1BD|$06:$A1AD:A5 0E LDA $0E 0x01A1BF|$06:$A1AF:F0 03 BEQ $A1B4 ; call to code in a different bank ($0F:$D0F5) 0x01A1C1|$06:$A1B1:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 ; control flow target (from $A1AF) 0x01A1C4|$06:$A1B4:60 RTS ; control flow target (from $A16C, $A179) 0x01A1C5|$06:$A1B5:85 0C STA $0C 0x01A1C7|$06:$A1B7:98 TYA 0x01A1C8|$06:$A1B8:48 PHA 0x01A1C9|$06:$A1B9:4A LSR 0x01A1CA|$06:$A1BA:4A LSR 0x01A1CB|$06:$A1BB:4A LSR 0x01A1CC|$06:$A1BC:4A LSR 0x01A1CD|$06:$A1BD:85 9C STA $9C 0x01A1CF|$06:$A1BF:A5 0C LDA $0C ; call to code in a different bank ($0F:$C4B0) 0x01A1D1|$06:$A1C1:20 B0 C4 JSR $C4B0 ; given a hero ID in $9C and an item ID in A, SEC if hero has that item, CLC otherwise 0x01A1D4|$06:$A1C4:68 PLA 0x01A1D5|$06:$A1C5:A8 TAY 0x01A1D6|$06:$A1C6:60 RTS ; control flow target (from $A102, $A19E) 0x01A1D7|$06:$A1C7:85 0C STA $0C 0x01A1D9|$06:$A1C9:B9 3B 06 LDA $063B,Y ; Midenhall Current HP, low byte 0x01A1DC|$06:$A1CC:38 SEC 0x01A1DD|$06:$A1CD:E5 0C SBC $0C 0x01A1DF|$06:$A1CF:99 3B 06 STA $063B,Y ; Midenhall Current HP, low byte 0x01A1E2|$06:$A1D2:B9 3C 06 LDA $063C,Y ; Midenhall Current HP, high byte 0x01A1E5|$06:$A1D5:E9 00 SBC #$00 0x01A1E7|$06:$A1D7:99 3C 06 STA $063C,Y ; Midenhall Current HP, high byte 0x01A1EA|$06:$A1DA:B0 08 BCS $A1E4 0x01A1EC|$06:$A1DC:A9 00 LDA #$00 0x01A1EE|$06:$A1DE:99 3B 06 STA $063B,Y ; Midenhall Current HP, low byte 0x01A1F1|$06:$A1E1:99 3C 06 STA $063C,Y ; Midenhall Current HP, high byte ; control flow target (from $A1DA) 0x01A1F4|$06:$A1E4:19 3B 06 ORA $063B,Y ; Midenhall Current HP, low byte 0x01A1F7|$06:$A1E7:F0 0C BEQ $A1F5 0x01A1F9|$06:$A1E9:98 TYA 0x01A1FA|$06:$A1EA:48 PHA 0x01A1FB|$06:$A1EB:8A TXA 0x01A1FC|$06:$A1EC:48 PHA ; call to code in a different bank ($0F:$C22C) 0x01A1FD|$06:$A1ED:20 2C C2 JSR $C22C 0x01A200|$06:$A1F0:68 PLA 0x01A201|$06:$A1F1:AA TAX 0x01A202|$06:$A1F2:68 PLA 0x01A203|$06:$A1F3:A8 TAY 0x01A204|$06:$A1F4:60 RTS ; control flow target (from $A1E7) 0x01A205|$06:$A1F5:A9 04 LDA #$04 0x01A207|$06:$A1F7:99 2D 06 STA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01A20A|$06:$A1FA:A9 FF LDA #$FF 0x01A20C|$06:$A1FC:85 35 STA $35 ; flag indicating whether any menu is currently open 0x01A20E|$06:$A1FE:A5 0E LDA $0E 0x01A210|$06:$A200:D0 0C BNE $A20E 0x01A212|$06:$A202:98 TYA 0x01A213|$06:$A203:48 PHA ; call to code in a different bank ($0F:$EB76) 0x01A214|$06:$A204:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x01A217|$06:$A207:04 ; Menu ID #$04: Dialogue window ; data -> code 0x01A218|$06:$A208:68 PLA 0x01A219|$06:$A209:A8 TAY 0x01A21A|$06:$A20A:A9 00 LDA #$00 0x01A21C|$06:$A20C:85 0E STA $0E ; control flow target (from $A200) 0x01A21E|$06:$A20E:E6 0E INC $0E 0x01A220|$06:$A210:A5 0E LDA $0E 0x01A222|$06:$A212:48 PHA 0x01A223|$06:$A213:98 TYA 0x01A224|$06:$A214:48 PHA 0x01A225|$06:$A215:4A LSR 0x01A226|$06:$A216:4A LSR 0x01A227|$06:$A217:4A LSR 0x01A228|$06:$A218:4A LSR 0x01A229|$06:$A219:85 97 STA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$FC50) 0x01A22B|$06:$A21B:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA 0x01A22E|$06:$A21E:A5 97 LDA $97 ; subject hero ID $97 0x01A230|$06:$A220:18 CLC 0x01A231|$06:$A221:69 03 ADC #$03 0x01A233|$06:$A223:85 97 STA $97 ; subject hero ID $97 ; call to code in a different bank ($0F:$D302) 0x01A235|$06:$A225:20 02 D3 JSR $D302 ; call to code in a different bank ($0F:$FA2A) 0x01A238|$06:$A228:20 2A FA JSR $FA2A ; display string ID specified by next byte ; code -> data ; indirect data load target 0x01A23B|$06:$A22B:1B ; String ID #$001B: Alas, brave [name] hast died.[end-FC] ; data -> code 0x01A23C|$06:$A22C:68 PLA 0x01A23D|$06:$A22D:A8 TAY 0x01A23E|$06:$A22E:68 PLA 0x01A23F|$06:$A22F:85 0E STA $0E 0x01A241|$06:$A231:A2 00 LDX #$00 ; control flow target (from $A23F) 0x01A243|$06:$A233:BD 2D 06 LDA $062D,X ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01A246|$06:$A236:30 25 BMI $A25D 0x01A248|$06:$A238:8A TXA 0x01A249|$06:$A239:18 CLC 0x01A24A|$06:$A23A:69 12 ADC #$12 0x01A24C|$06:$A23C:AA TAX 0x01A24D|$06:$A23D:C9 36 CMP #$36 0x01A24F|$06:$A23F:90 F2 BCC $A233 ; call to code in a different bank ($0F:$F6CE) 0x01A251|$06:$A241:20 CE F6 JSR $F6CE ; return number of party members - 1 in A/X 0x01A254|$06:$A244:F0 09 BEQ $A24F 0x01A256|$06:$A246:A9 80 LDA #$80 ; call to code in a different bank ($0F:$FC50) 0x01A258|$06:$A248:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01A25B|$06:$A24B:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01A25E|$06:$A24E:51 ; String ID #$0151: [name] is utterly destroyed.[end-FC] ; data -> code ; control flow target (from $A244) 0x01A25F|$06:$A24F:A9 12 LDA #$12 ; Music ID #$12: party defeat BGM 0x01A261|$06:$A251:8D F7 05 STA $05F7 ; probably BGM for current area ; call to code in a different bank ($0F:$C561) 0x01A264|$06:$A254:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x01A267|$06:$A257:20 9D 80 JSR $809D ; wait until all joypad buttons are released and then some button pressed ; call to code in a different bank ($0F:$D271) 0x01A26A|$06:$A25A:4C 71 D2 JMP $D271 ; control flow target (from $A236) 0x01A26D|$06:$A25D:A9 00 LDA #$00 0x01A26F|$06:$A25F:85 35 STA $35 ; flag indicating whether any menu is currently open 0x01A271|$06:$A261:60 RTS ; control flow target (from $A0FB, $A18F, $A29F) ; call to code in a different bank ($0F:$C1DC) 0x01A272|$06:$A262:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x01A275|$06:$A265:AD 87 A2 LDA $A287 0x01A278|$06:$A268:85 0A STA $0A 0x01A27A|$06:$A26A:AD 88 A2 LDA $A288 0x01A27D|$06:$A26D:20 7E A2 JSR $A27E ; call to code in a different bank ($0F:$C1DC) 0x01A280|$06:$A270:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; call to code in a different bank ($0F:$C1DC) 0x01A283|$06:$A273:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x01A286|$06:$A276:AD E9 C2 LDA $C2E9 0x01A289|$06:$A279:85 0A STA $0A 0x01A28B|$06:$A27B:AD EA C2 LDA $C2EA ; control flow target (from $A26D) 0x01A28E|$06:$A27E:85 0B STA $0B 0x01A290|$06:$A280:A9 00 LDA #$00 0x01A292|$06:$A282:85 0C STA $0C ; call to code in a different bank ($0F:$C228) 0x01A294|$06:$A284:4C 28 C2 JMP $C228 ; code -> data ; data load target (from $A265) 0x01A297|$06:$A287:89 ; data load target (from $A26A) 0x01A298|$06:$A288: A2 ; $06:$A289 ; indirect data load target (via $A287) 0x01A299|$06:$A289:0F ; indirect data load target 0x01A29A|$06:$A28A:16 ; indirect data load target 0x01A29B|$06:$A28B:16 ; indirect data load target 0x01A29C|$06:$A28C:16 ; indirect data load target 0x01A29D|$06:$A28D:16 ; indirect data load target 0x01A29E|$06:$A28E:16 ; indirect data load target 0x01A29F|$06:$A28F:16 ; indirect data load target 0x01A2A0|$06:$A290:16 ; indirect data load target 0x01A2A1|$06:$A291:16 ; indirect data load target 0x01A2A2|$06:$A292:16 ; indirect data load target 0x01A2A3|$06:$A293:16 ; indirect data load target 0x01A2A4|$06:$A294:16 ; indirect data load target 0x01A2A5|$06:$A295:16 ; data -> code ; control flow target (from $A195) 0x01A2A6|$06:$A296:A9 81 LDA #$81 ; Music ID #$81: hit 1 SFX ; call to code in a different bank ($0F:$C561) 0x01A2A8|$06:$A298:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x01A2AB|$06:$A29B:A9 04 LDA #$04 0x01A2AD|$06:$A29D:85 13 STA $13 ; control flow target (from $A2A4) 0x01A2AF|$06:$A29F:20 62 A2 JSR $A262 0x01A2B2|$06:$A2A2:C6 13 DEC $13 0x01A2B4|$06:$A2A4:D0 F9 BNE $A29F 0x01A2B6|$06:$A2A6:60 RTS ; external control flow target (from $0F:$C91B) 0x01A2B7|$06:$A2A7:AD 12 01 LDA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x01A2BA|$06:$A2AA:29 1F AND #$1F 0x01A2BC|$06:$A2AC:C9 1F CMP #$1F 0x01A2BE|$06:$A2AE:F0 01 BEQ $A2B1 ; control flow target (from $A2B8) 0x01A2C0|$06:$A2B0:60 RTS ; control flow target (from $A2AE) 0x01A2C1|$06:$A2B1:A9 27 LDA #$27 0x01A2C3|$06:$A2B3: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 0x01A2C6|$06:$A2B6:C9 FF CMP #$FF 0x01A2C8|$06:$A2B8:D0 F6 BNE $A2B0 0x01A2CA|$06:$A2BA:A9 05 LDA #$05 ; Music ID #$05: Rubiss BGM ; call to code in a different bank ($0F:$C561) 0x01A2CC|$06:$A2BC:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x01A2CF|$06:$A2BF:A9 04 LDA #$04 0x01A2D1|$06:$A2C1:85 49 STA $49 ; object hero/target/item/string ID $49 0x01A2D3|$06:$A2C3:20 FB A2 JSR $A2FB ; call to code in a different bank ($0F:$F6F6) 0x01A2D6|$06:$A2C6: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 0x01A2D9|$06:$A2C9:FD ; String ID #$02FD: I hear a mortal voice calling me.[wait][line]‘Ah, three descendants of Erdrick[.’][wait][line]‘Yes, I shall help thee[.’][wait][line]‘I am Rubiss, an Enchanter, and long ago I promised Erdrick to help when the time came[.’][wait][line]‘Now is the time[.’][wait][line]‘Receive now my charm and my spell of protection[.’][end-FC] ; data -> code 0x01A2DA|$06:$A2CA:A9 27 LDA #$27 0x01A2DC|$06:$A2CC:85 96 STA $96 ; temp storage for item/spell/type/etc. IDs 0x01A2DE|$06:$A2CE:A9 00 LDA #$00 0x01A2E0|$06:$A2D0:85 97 STA $97 ; subject hero ID $97 0x01A2E2|$06:$A2D2:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x01A2E5|$06:$A2D5:B0 12 BCS $A2E9 0x01A2E7|$06:$A2D7:E6 97 INC $97 ; subject hero ID $97 0x01A2E9|$06:$A2D9:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x01A2EC|$06:$A2DC:B0 0B BCS $A2E9 0x01A2EE|$06:$A2DE:E6 97 INC $97 ; subject hero ID $97 0x01A2F0|$06:$A2E0:20 7E 8D JSR $8D7E ; given hero ID in $97 and item ID in $96, try to add item to first empty slot in hero's inventory; SEC if added, CLC if no empty slots 0x01A2F3|$06:$A2E3:B0 04 BCS $A2E9 ; call to code in a different bank ($0F:$FA32) 0x01A2F5|$06:$A2E5:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data 0x01A2F8|$06:$A2E8:D8 ; String ID #$02D8: [wait]‘But thou hast many things.[line]See me again later[.’][end-FC] ; data -> code ; control flow target (from $A2D5, $A2DC, $A2E3) 0x01A2F9|$06:$A2E9:A2 3C LDX #$3C ; call to code in a different bank ($0F:$C1EE) 0x01A2FB|$06:$A2EB:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x01A2FE|$06:$A2EE:A9 FF LDA #$FF 0x01A300|$06:$A2F0:85 49 STA $49 ; object hero/target/item/string ID $49 0x01A302|$06:$A2F2:20 FB A2 JSR $A2FB ; call to code in a different bank ($0F:$C59D) 0x01A305|$06:$A2F5:20 9D C5 JSR $C59D ; call to code in a different bank ($0F:$D0F5) 0x01A308|$06:$A2F8:4C F5 D0 JMP $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 ; control flow target (from $A2C3, $A2F2) 0x01A30B|$06:$A2FB:A0 1F LDY #$1F 0x01A30D|$06:$A2FD:20 0C A3 JSR $A30C 0x01A310|$06:$A300:A0 27 LDY #$27 0x01A312|$06:$A302:20 0C A3 JSR $A30C 0x01A315|$06:$A305:A0 2F LDY #$2F 0x01A317|$06:$A307:20 0C A3 JSR $A30C 0x01A31A|$06:$A30A:A0 37 LDY #$37 ; control flow target (from $A2FD, $A302, $A307) 0x01A31C|$06:$A30C:A5 49 LDA $49 ; object hero/target/item/string ID $49 0x01A31E|$06:$A30E:99 3A 05 STA $053A,Y ; call to code in a different bank ($0F:$CF64) 0x01A321|$06:$A311:20 64 CF JSR $CF64 0x01A324|$06:$A314:A2 19 LDX #$19 ; call to code in a different bank ($0F:$C1EE) 0x01A326|$06:$A316:4C EE C1 JMP $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF ; 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 ; external control flow target (from $0F:$E438) 0x01A329|$06:$A319:A2 00 LDX #$00 0x01A32B|$06:$A31B:A0 00 LDY #$00 ; control flow target (from $A337) 0x01A32D|$06:$A31D:86 0C STX $0C 0x01A32F|$06:$A31F:BD 4E A3 LDA $A34E,X 0x01A332|$06:$A322:85 0D STA $0D 0x01A334|$06:$A324:BD 4D A3 LDA $A34D,X ; stat ranges 0x01A337|$06:$A327:AA TAX ; control flow target (from $A32F) 0x01A338|$06:$A328:20 3A A3 JSR $A33A ; if $05FC is #$00, copy $015D,Y to $0600,X, otherwise copy $0600,X to $015D,Y 0x01A33B|$06:$A32B:E8 INX 0x01A33C|$06:$A32C:C8 INY 0x01A33D|$06:$A32D:E4 0D CPX $0D 0x01A33F|$06:$A32F:D0 F7 BNE $A328 0x01A341|$06:$A331:A6 0C LDX $0C 0x01A343|$06:$A333:E8 INX 0x01A344|$06:$A334:E8 INX 0x01A345|$06:$A335:E0 10 CPX #$10 0x01A347|$06:$A337:D0 E4 BNE $A31D 0x01A349|$06:$A339:60 RTS ; if $05FC is #$00, copy $015D,Y to $0600,X, otherwise copy $0600,X to $015D,Y ; control flow target (from $A328) 0x01A34A|$06:$A33A:AD FC 05 LDA $05FC 0x01A34D|$06:$A33D:F0 07 BEQ $A346 0x01A34F|$06:$A33F:BD 00 06 LDA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x01A352|$06:$A342:99 5D 01 STA $015D,Y 0x01A355|$06:$A345:60 RTS ; control flow target (from $A33D) 0x01A356|$06:$A346:B9 5D 01 LDA $015D,Y 0x01A359|$06:$A349:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x01A35C|$06:$A34C:60 RTS ; code -> data ; stat ranges ; indexed data load target (from $A324) 0x01A35D|$06:$A34D:00 ; indexed data load target (from $A31F) 0x01A35E|$06:$A34E: 18 ; $0600 inclusive - $0618 exclusive 0x01A35F|$06:$A34F:24 26 ; $0624 inclusive - $0626 exclusive 0x01A361|$06:$A351:2D 2E ; $062D inclusive - $062E exclusive 0x01A363|$06:$A353:3B 3E ; $063B inclusive - $063E exclusive 0x01A365|$06:$A355:3F 40 ; $063F inclusive - $0640 exclusive 0x01A367|$06:$A357:4D 50 ; $064D inclusive - $0650 exclusive 0x01A369|$06:$A359:51 52 ; $0651 inclusive - $0652 exclusive 0x01A36B|$06:$A35B:5F 62 ; $065F inclusive - $0662 exclusive ; data -> code ; save game handler ; control flow target (from $8F02, $900A, $918D, $9209, $93F6, $943F, $981B) ; call to code in a different bank ($0F:$D159) 0x01A36D|$06:$A35D:4C 59 D1 JMP $D159 ; check for item A (possibly equipped) in party inventory, returning inventory index of item in A/X if found, #$FF if not ; control flow target (from $9B58, $9DD8, $9DE5) 0x01A370|$06:$A360: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 0x01A373|$06:$A363:10 3A BPL $A39F ; if found, RTS 0x01A375|$06:$A365:A5 0C LDA $0C ; otherwise re-load the item ID 0x01A377|$06:$A367:09 40 ORA #$40 ; and check for an equipped version ; check for item A in party inventory, returning inventory index of item in A/X if found, #$FF if not ; control flow target (from $834E, $845B, $86D7, $8D5D, $90CE, $90D5, $92BC, $92C3, $92D5, $9306, $93C0, $93CB, $9B51, $9BA8, $9D8C, $A2B3, $A360) ; external control flow target (from $0F:$D589) 0x01A379|$06:$A369:84 10 STY $10 ; save Y in $10 0x01A37B|$06:$A36B:85 0C STA $0C ; save item ID in $0C 0x01A37D|$06:$A36D:A2 00 LDX #$00 ; initialize both inventory index and hero ID to #$00 0x01A37F|$06:$A36F:86 0D STX $0D ; inventory index ; control flow target (from $A398) 0x01A381|$06:$A371:A4 0D LDY $0D ; hero ID 0x01A383|$06:$A373:B9 A0 A3 LDA $A3A0,Y ; pre-computed offsets for the start of each hero's data (what's wrong with the same data at $06:$9D55?) 0x01A386|$06:$A376:A8 TAY 0x01A387|$06:$A377:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01A38A|$06:$A37A:29 04 AND #$04 ; pick out the In Party bit 0x01A38C|$06:$A37C:D0 07 BNE $A385 ; if not in party, skip to the next hero (but heroes are gained sequentially and never leave, so BNE $A39A would be faster) 0x01A38E|$06:$A37E:8A TXA ; inventory index 0x01A38F|$06:$A37F:18 CLC 0x01A390|$06:$A380:69 08 ADC #$08 ; move to start of next hero's inventory 0x01A392|$06:$A382:AA TAX 0x01A393|$06:$A383:D0 0D BNE $A392 ; branch always taken; skip cheking current hero's inventory (since they're not in the party) ; control flow target (from $A37C, $A390) 0x01A395|$06:$A385:BD 00 06 LDA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x01A398|$06:$A388:C5 0C CMP $0C ; item ID 0x01A39A|$06:$A38A:F0 10 BEQ $A39C ; if we have one, then done 0x01A39C|$06:$A38C:E8 INX ; otherwise move to next inventory index 0x01A39D|$06:$A38D:8A TXA ; calculate inventory index mod 8 0x01A39E|$06:$A38E:29 07 AND #$07 0x01A3A0|$06:$A390:D0 F3 BNE $A385 ; if this hero has more inventory to check, check it ; control flow target (from $A383) 0x01A3A2|$06:$A392:E6 0D INC $0D ; increment hero ID 0x01A3A4|$06:$A394:A5 0D LDA $0D 0x01A3A6|$06:$A396:C9 03 CMP #$03 ; 3 heroes total 0x01A3A8|$06:$A398:D0 D7 BNE $A371 ; if more heroes to check, check them 0x01A3AA|$06:$A39A:A2 FF LDX #$FF ; otherwise flag item not found ; control flow target (from $A38A) 0x01A3AC|$06:$A39C:A4 10 LDY $10 ; restore Y from $10 0x01A3AE|$06:$A39E:8A TXA ; control flow target (from $A363) 0x01A3AF|$06:$A39F:60 RTS ; code -> data ; pre-computed offsets for the start of each hero's data (what's wrong with the same data at $06:$9D55?) ; indexed data load target (from $A373) 0x01A3B0|$06:$A3A0:00 ; Midenhall 0x01A3B1|$06:$A3A1:12 ; Cannock 0x01A3B2|$06:$A3A2:24 ; Moonbrooke ; data -> code ; given item ID in $96 and hero ID in $97, set A to #$80 if hero can equip item, #$00 otherwise ; control flow target (from $831D, $8AA9) 0x01A3B3|$06:$A3A3:86 10 STX $10 ; save X 0x01A3B5|$06:$A3A5:A5 96 LDA $96 ; temp storage for item/spell/type/etc. IDs; item ID 0x01A3B7|$06:$A3A7:29 3F AND #$3F ; strip off equipped bit 0x01A3B9|$06:$A3A9:AA TAX 0x01A3BA|$06:$A3AA:BD BD A3 LDA $A3BD,X ; Bit fields controlling who can equip each item 0x01A3BD|$06:$A3AD:85 0D STA $0D 0x01A3BF|$06:$A3AF:A4 97 LDY $97 ; subject hero ID $97 0x01A3C1|$06:$A3B1:C8 INY ; number of bits to shift ; control flow target (from $A3B8) 0x01A3C2|$06:$A3B2:A9 00 LDA #$00 ; initialize return value 0x01A3C4|$06:$A3B4:46 0D LSR $0D ; shift hero's equipability bit into C 0x01A3C6|$06:$A3B6:6A ROR ; and then into A 0x01A3C7|$06:$A3B7:88 DEY ; number of bits to shift 0x01A3C8|$06:$A3B8:D0 F8 BNE $A3B2 ; if it's the wrong hero's data, loop to next hero 0x01A3CA|$06:$A3BA:A6 10 LDX $10 ; restore X 0x01A3CC|$06:$A3BC:60 RTS ; code -> data ; Bit fields controlling who can equip each item ; #$01 = Midenhall, #$02 = Cannock, #$04 = Moonbrooke ; indexed data load target (from $A3AA) 0x01A3CD|$06:$A3BD:00 ; Item ID #$00: (no item) 0x01A3CE|$06:$A3BE:07 ; Item ID #$01: Bamboo Stick 0x01A3CF|$06:$A3BF:07 ; Item ID #$02: Magic Knife 0x01A3D0|$06:$A3C0:07 ; Item ID #$03: Wizard’s Wand 0x01A3D1|$06:$A3C1:07 ; Item ID #$04: Staff of Thunder 0x01A3D2|$06:$A3C2:03 ; Item ID #$05: Club 0x01A3D3|$06:$A3C3:03 ; Item ID #$06: Copper Sword 0x01A3D4|$06:$A3C4:03 ; Item ID #$07: Chain Sickle 0x01A3D5|$06:$A3C5:03 ; Item ID #$08: Iron Spear 0x01A3D6|$06:$A3C6:03 ; Item ID #$09: Falcon Sword 0x01A3D7|$06:$A3C7:01 ; Item ID #$0A: Broad Sword 0x01A3D8|$06:$A3C8:01 ; Item ID #$0B: Giant Hammer 0x01A3D9|$06:$A3C9:01 ; Item ID #$0C: Sword of Destruction 0x01A3DA|$06:$A3CA:01 ; Item ID #$0D: Dragon Killer 0x01A3DB|$06:$A3CB:01 ; Item ID #$0E: Light Sword 0x01A3DC|$06:$A3CC:01 ; Item ID #$0F: Sword of Erdrick 0x01A3DD|$06:$A3CD:01 ; Item ID #$10: Thunder Sword 0x01A3DE|$06:$A3CE:07 ; Item ID #$11: Clothes 0x01A3DF|$06:$A3CF:07 ; Item ID #$12: Clothes Hiding 0x01A3E0|$06:$A3D0:07 ; Item ID #$13: Water Flying Cloth 0x01A3E1|$06:$A3D1:07 ; Item ID #$14: Mink Coat 0x01A3E2|$06:$A3D2:03 ; Item ID #$15: Leather Armor 0x01A3E3|$06:$A3D3:03 ; Item ID #$16: Chain Mail 0x01A3E4|$06:$A3D4:03 ; Item ID #$17: Gremlin’s Armor 0x01A3E5|$06:$A3D5:03 ; Item ID #$18: Magic Armor 0x01A3E6|$06:$A3D6:01 ; Item ID #$19: Full Plate Armor 0x01A3E7|$06:$A3D7:01 ; Item ID #$1A: Armor of Gaia 0x01A3E8|$06:$A3D8:01 ; Item ID #$1B: Armor of Erdrick 0x01A3E9|$06:$A3D9:03 ; Item ID #$1C: Leather Shield 0x01A3EA|$06:$A3DA:03 ; Item ID #$1D: Shield of Strength 0x01A3EB|$06:$A3DB:01 ; Item ID #$1E: Steel Shield 0x01A3EC|$06:$A3DC:01 ; Item ID #$1F: Evil Shield 0x01A3ED|$06:$A3DD:01 ; Item ID #$20: Shield of Erdrick 0x01A3EE|$06:$A3DE:07 ; Item ID #$21: Mysterious Hat 0x01A3EF|$06:$A3DF:01 ; Item ID #$22: Iron Helmet 0x01A3F0|$06:$A3E0:01 ; Item ID #$23: Helmet of Erdrick ; pointers to warp spaces for irregularly-shaped maps ; indirect data load target (via $8042) ; external indexed data load target (from $0F:$E8BC) 0x01A3F1|$06:$A3E1:00 ; external indexed data load target (from $0F:$E8C1) 0x01A3F2|$06:$A3E2: 00 ; $06:$0000; Map ID #$2B: Cave to Hamlin 0x01A3F3|$06:$A3E3:1B A4 ; $06:$A41B; Map ID #$2C: Lake Cave B1 0x01A3F5|$06:$A3E5:30 A4 ; $06:$A430; Map ID #$2D: Lake Cave B2 0x01A3F7|$06:$A3E7:45 A4 ; $06:$A445; Map ID #$2E: Sea Cave B1 0x01A3F9|$06:$A3E9:50 A4 ; $06:$A450; Map ID #$2F: Sea Cave B2 0x01A3FB|$06:$A3EB:00 00 ; $06:$0000; Map ID #$30: Sea Cave B3-1 0x01A3FD|$06:$A3ED:00 00 ; $06:$0000; Map ID #$31: Sea Cave B3-2 0x01A3FF|$06:$A3EF:00 00 ; $06:$0000; Map ID #$32: Sea Cave B4 0x01A401|$06:$A3F1:00 00 ; $06:$0000; Map ID #$33: Sea Cave B5 0x01A403|$06:$A3F3:00 00 ; $06:$0000; Map ID #$34: Charlock Castle B1/B2 0x01A405|$06:$A3F5:00 00 ; $06:$0000; Map ID #$35: Charlock Castle B3/B4-1/B5-1 0x01A407|$06:$A3F7:00 00 ; $06:$0000; Map ID #$36: Charlock Castle B4-2/B5-2/B6 0x01A409|$06:$A3F9:00 00 ; $06:$0000; Map ID #$37: Cave to Rhone B1 0x01A40B|$06:$A3FB:00 00 ; $06:$0000; Map ID #$38: Cave to Rhone 1F 0x01A40D|$06:$A3FD:5B A4 ; $06:$A45B; Map ID #$39: Cave to Rhone 2F-1 0x01A40F|$06:$A3FF:98 A4 ; $06:$A498; Map ID #$3A: Cave to Rhone 2F-2 0x01A411|$06:$A401:D5 A4 ; $06:$A4D5; Map ID #$3B: Cave to Rhone 2F-3 0x01A413|$06:$A403:F4 A4 ; $06:$A4F4; Map ID #$3C: Cave to Rhone 3F 0x01A415|$06:$A405:00 00 ; $06:$0000; Map ID #$3D: Cave to Rhone 4F 0x01A417|$06:$A407:00 00 ; $06:$0000; Map ID #$3E: Cave to Rhone 5F 0x01A419|$06:$A409:31 A5 ; $06:$A531; Map ID #$3F: Cave to Rhone 6F 0x01A41B|$06:$A40B:00 00 ; $06:$0000; Map ID #$40: Spring of Bravery 0x01A41D|$06:$A40D:00 00 ; $06:$0000; Map ID #$41: unused? 0x01A41F|$06:$A40F:00 00 ; $06:$0000; Map ID #$42: unused? 0x01A421|$06:$A411:00 00 ; $06:$0000; Map ID #$43: Cave to Rimuldar 0x01A423|$06:$A413:00 00 ; $06:$0000; Map ID #$44: Hargon's Castle 2F 0x01A425|$06:$A415:00 00 ; $06:$0000; Map ID #$45: Hargon's Castle 3F 0x01A427|$06:$A417:00 00 ; $06:$0000; Map ID #$46: Hargon's Castle 4F 0x01A429|$06:$A419:00 00 ; $06:$0000; Map ID #$47: Hargon's Castle 5F ; warp spaces for irregularly-shaped maps; format is (destination map ID, destination X-pos, destination Y-pos, transition X-pos, transition Y-pos), all positions are 7-bit, describing a 2x2 space ; Map ID #$2C: Lake Cave B1 ; indirect data load target (via $A3E3) 0x01A42B|$06:$A41B:2C 1E 16 FE 10 0x01A430|$06:$A420:2C 00 10 20 16 0x01A435|$06:$A425:2C 04 00 18 20 0x01A43A|$06:$A42A:2C 18 1E 04 FE ; indirect data load target 0x01A43F|$06:$A42F:FF ; Map ID #$2D: Lake Cave B2 ; indirect data load target (via $A3E5) 0x01A440|$06:$A430:2D 16 02 0E 20 0x01A445|$06:$A435:2D 0E 1E 16 00 0x01A44A|$06:$A43A:2D 1A 1C FE 1C 0x01A44F|$06:$A43F:2D 00 1C 1C 1C ; indirect data load target 0x01A454|$06:$A444:FF ; Map ID #$2E: Sea Cave B1 ; indirect data load target (via $A3E7) 0x01A455|$06:$A445:2E 04 02 02 1C 0x01A45A|$06:$A44A:2E 02 1A 04 00 ; indirect data load target 0x01A45F|$06:$A44F:FF ; Map ID #$2F: Sea Cave B2 ; indirect data load target (via $A3E9) 0x01A460|$06:$A450:2F 20 14 12 28 0x01A465|$06:$A455:2F 12 26 20 12 ; indirect data load target 0x01A46A|$06:$A45A:FF ; Map ID #$39: Cave to Rhone 2F-1 ; indirect data load target (via $A3FD) 0x01A46B|$06:$A45B:3A 06 0A 06 00 0x01A470|$06:$A460:3A 10 0A 10 00 0x01A475|$06:$A465:3A 1A 0A 1A 00 0x01A47A|$06:$A46A:3A 24 0A 24 00 0x01A47F|$06:$A46F:3A 2E 0A 2E 00 0x01A484|$06:$A474:3A 06 02 06 0C 0x01A489|$06:$A479:3A 10 02 10 0C 0x01A48E|$06:$A47E:3A 1A 02 1A 0C 0x01A493|$06:$A483:3A 24 02 24 0C 0x01A498|$06:$A488:3A 2E 02 2E 0C 0x01A49D|$06:$A48D:3B 08 04 FE 08 0x01A4A2|$06:$A492:3B 00 04 36 08 ; indirect data load target 0x01A4A7|$06:$A497:FF ; Map ID #$3A: Cave to Rhone 2F-2 ; indirect data load target (via $A3FF) 0x01A4A8|$06:$A498:39 06 0A 06 00 0x01A4AD|$06:$A49D:39 10 0A 10 00 0x01A4B2|$06:$A4A2:39 1A 0A 1A 00 0x01A4B7|$06:$A4A7:39 24 0A 24 00 0x01A4BC|$06:$A4AC:39 2E 0A 2E 00 0x01A4C1|$06:$A4B1:39 06 02 06 0C 0x01A4C6|$06:$A4B6:39 10 02 10 0C 0x01A4CB|$06:$A4BB:39 1A 02 1A 0C 0x01A4D0|$06:$A4C0:39 24 02 24 0C 0x01A4D5|$06:$A4C5:39 2E 02 2E 0C 0x01A4DA|$06:$A4CA:3B 08 0E FE 08 0x01A4DF|$06:$A4CF:3B 00 0E 36 08 ; indirect data load target 0x01A4E4|$06:$A4D4:FF ; Map ID #$3B: Cave to Rhone 2F-3 ; indirect data load target (via $A401) 0x01A4E5|$06:$A4D5:3B 04 00 04 14 0x01A4EA|$06:$A4DA:3B 04 12 04 FE 0x01A4EF|$06:$A4DF:39 34 08 FE 04 0x01A4F4|$06:$A4E4:39 00 08 0A 04 0x01A4F9|$06:$A4E9:3A 34 08 FE 0E 0x01A4FE|$06:$A4EE:3A 00 08 0A 0E ; indirect data load target 0x01A503|$06:$A4F3:FF ; Map ID #$3C: Cave to Rhone 3F ; indirect data load target (via $A403) 0x01A504|$06:$A4F4:3C 16 18 FE 06 0x01A509|$06:$A4F9:3C 00 06 18 18 0x01A50E|$06:$A4FE:3C 26 0A FE 12 0x01A513|$06:$A503:3C 00 12 28 0A 0x01A518|$06:$A508:3C 26 16 FE 22 0x01A51D|$06:$A50D:3C 00 22 28 16 0x01A522|$06:$A512:3C 22 1E 20 38 0x01A527|$06:$A517:3C 20 36 22 1C 0x01A52C|$06:$A51C:3C 0A 2A 28 34 0x01A531|$06:$A521:3C 26 34 08 2A 0x01A536|$06:$A526:3C 26 02 10 16 0x01A53B|$06:$A52B:3C 12 16 28 02 ; indirect data load target 0x01A540|$06:$A530:FF ; Map ID #$3F: Cave to Rhone 6F ; indirect data load target (via $A409) 0x01A541|$06:$A531:3F 02 16 1A 12 0x01A546|$06:$A536:3F 18 12 00 16 0x01A54B|$06:$A53B:3F 18 12 20 14 0x01A550|$06:$A540:3F 18 12 FE 02 0x01A555|$06:$A545:3F 08 0C 12 0E 0x01A55A|$06:$A54A:3F 12 10 08 0E 0x01A55F|$06:$A54F:3F 12 10 06 30 0x01A564|$06:$A554:3F 24 0E 0A 12 0x01A569|$06:$A559:3F 0C 12 26 0E 0x01A56E|$06:$A55E:3F 0C 12 06 02 0x01A573|$06:$A563:3F 0C 12 06 12 0x01A578|$06:$A568:3F 00 0C 28 02 0x01A57D|$06:$A56D:3F 26 02 FE 0C 0x01A582|$06:$A572:3F 00 12 28 1A 0x01A587|$06:$A577:3F 26 1A FE 12 0x01A58C|$06:$A57C:3F 00 26 1E 04 0x01A591|$06:$A581:3F 00 26 28 14 0x01A596|$06:$A586:3F 00 26 20 1C 0x01A59B|$06:$A58B:3F 10 2C 12 24 0x01A5A0|$06:$A590:3F 10 2C 20 22 0x01A5A5|$06:$A595:3F 10 2C 1A 2C 0x01A5AA|$06:$A59A:3F 22 22 12 2C 0x01A5AF|$06:$A59F:3F 00 1C 28 24 0x01A5B4|$06:$A5A4:3F 00 1C 28 2C 0x01A5B9|$06:$A5A9:3F 26 24 FE 1C 0x01A5BE|$06:$A5AE:3F 00 20 28 28 0x01A5C3|$06:$A5B3:3F 26 28 FE 20 0x01A5C8|$06:$A5B8:3F 1C 2C 28 20 0x01A5CD|$06:$A5BD:3F 0E 0C 1E 26 0x01A5D2|$06:$A5C2:3F 1A 1E 0A FE 0x01A5D7|$06:$A5C7:3F 16 2E 1C 16 0x01A5DC|$06:$A5CC:3F 08 18 1C 24 0x01A5E1|$06:$A5D1:3F 1A 24 06 18 0x01A5E6|$06:$A5D6:3F 18 0A 16 1E 0x01A5EB|$06:$A5DB:3F 14 1E 16 0A 0x01A5F0|$06:$A5E0:3F 06 2E 12 FE 0x01A5F5|$06:$A5E5:3F 0C 24 0E 0E 0x01A5FA|$06:$A5EA:3F 0C 24 1A 20 0x01A5FF|$06:$A5EF:3F 0C 24 16 30 0x01A604|$06:$A5F4:3F 12 0A 12 1A 0x01A609|$06:$A5F9:3F 12 18 12 08 0x01A60E|$06:$A5FE:3F 12 18 0C 22 0x01A613|$06:$A603:3F 12 18 22 FE 0x01A618|$06:$A608:3F 1C 04 FE 26 0x01A61D|$06:$A60D:FF ; data -> code 0x01A61E|$06:$A60E:A9 FF LDA #$FF 0x01A620|$06:$A610:D0 02 BNE $A614 ; indirect control flow target (via $8000) 0x01A622|$06:$A612:A9 00 LDA #$00 ; control flow target (from $A610) 0x01A624|$06:$A614:20 1A A6 JSR $A61A ; call to code in a different bank ($0F:$C1DC) 0x01A627|$06:$A617:4C DC C1 JMP $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $A614) ; indirect control flow target (via $803C) 0x01A62A|$06:$A61A:48 PHA 0x01A62B|$06:$A61B:AD 01 00 LDA $0001 0x01A62E|$06:$A61E:F0 03 BEQ $A623 ; call to code in a different bank ($0F:$C1DC) 0x01A630|$06:$A620:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $A61E) 0x01A633|$06:$A623:A9 01 LDA #$01 0x01A635|$06:$A625:8D 83 01 STA $0183 0x01A638|$06:$A628:A9 00 LDA #$00 0x01A63A|$06:$A62A:8D 80 60 STA $6080 0x01A63D|$06:$A62D:68 PLA 0x01A63E|$06:$A62E:20 63 A7 JSR $A763 0x01A641|$06:$A631:A9 00 LDA #$00 0x01A643|$06:$A633:8D 81 60 STA $6081 0x01A646|$06:$A636:8D 82 60 STA $6082 0x01A649|$06:$A639:AD 7B 60 LDA $607B 0x01A64C|$06:$A63C:48 PHA 0x01A64D|$06:$A63D:29 F0 AND #$F0 0x01A64F|$06:$A63F:4A LSR 0x01A650|$06:$A640:4A LSR 0x01A651|$06:$A641:4A LSR 0x01A652|$06:$A642:8D 7E 60 STA $607E 0x01A655|$06:$A645:68 PLA 0x01A656|$06:$A646:29 0F AND #$0F 0x01A658|$06:$A648:0A ASL 0x01A659|$06:$A649:8D 7F 60 STA $607F 0x01A65C|$06:$A64C:8D 83 60 STA $6083 0x01A65F|$06:$A64F:AE 02 00 LDX $0002 ; control flow target (from $A6D0) 0x01A662|$06:$A652:A5 08 LDA $08 0x01A664|$06:$A654:8D 90 60 STA $6090 0x01A667|$06:$A657:A5 07 LDA $07 0x01A669|$06:$A659:8D 8F 60 STA $608F 0x01A66C|$06:$A65C:29 1F AND #$1F 0x01A66E|$06:$A65E:8D 8B 60 STA $608B 0x01A671|$06:$A661:A9 20 LDA #$20 0x01A673|$06:$A663:38 SEC 0x01A674|$06:$A664:ED 8B 60 SBC $608B 0x01A677|$06:$A667:8D 8D 60 STA $608D 0x01A67A|$06:$A66A:AD 7F 60 LDA $607F 0x01A67D|$06:$A66D:38 SEC 0x01A67E|$06:$A66E:ED 8D 60 SBC $608D 0x01A681|$06:$A671:8D 8E 60 STA $608E 0x01A684|$06:$A674:F0 02 BEQ $A678 0x01A686|$06:$A676:B0 09 BCS $A681 ; control flow target (from $A674) 0x01A688|$06:$A678:AD 7F 60 LDA $607F 0x01A68B|$06:$A67B:8D 8D 60 STA $608D 0x01A68E|$06:$A67E:4C A4 A6 JMP $A6A4 ; control flow target (from $A676) 0x01A691|$06:$A681:20 D6 A6 JSR $A6D6 0x01A694|$06:$A684:AD 90 60 LDA $6090 0x01A697|$06:$A687:49 04 EOR #$04 0x01A699|$06:$A689:8D 90 60 STA $6090 0x01A69C|$06:$A68C:AD 8F 60 LDA $608F 0x01A69F|$06:$A68F:29 1F AND #$1F 0x01A6A1|$06:$A691:8D 8B 60 STA $608B 0x01A6A4|$06:$A694:AD 8F 60 LDA $608F 0x01A6A7|$06:$A697:38 SEC 0x01A6A8|$06:$A698:ED 8B 60 SBC $608B 0x01A6AB|$06:$A69B:8D 8F 60 STA $608F 0x01A6AE|$06:$A69E:AD 8E 60 LDA $608E 0x01A6B1|$06:$A6A1:8D 8D 60 STA $608D ; control flow target (from $A67E) 0x01A6B4|$06:$A6A4:20 D6 A6 JSR $A6D6 0x01A6B7|$06:$A6A7:A5 08 LDA $08 0x01A6B9|$06:$A6A9:29 FB AND #$FB 0x01A6BB|$06:$A6AB:C9 23 CMP #$23 0x01A6BD|$06:$A6AD:90 11 BCC $A6C0 0x01A6BF|$06:$A6AF:A5 07 LDA $07 0x01A6C1|$06:$A6B1:C9 A0 CMP #$A0 0x01A6C3|$06:$A6B3:90 0B BCC $A6C0 0x01A6C5|$06:$A6B5:29 1F AND #$1F 0x01A6C7|$06:$A6B7:85 07 STA $07 0x01A6C9|$06:$A6B9:A5 08 LDA $08 0x01A6CB|$06:$A6BB:29 FC AND #$FC 0x01A6CD|$06:$A6BD:4C CB A6 JMP $A6CB ; control flow target (from $A6AD, $A6B3) 0x01A6D0|$06:$A6C0:A5 07 LDA $07 0x01A6D2|$06:$A6C2:18 CLC 0x01A6D3|$06:$A6C3:69 20 ADC #$20 0x01A6D5|$06:$A6C5:85 07 STA $07 0x01A6D7|$06:$A6C7:A5 08 LDA $08 0x01A6D9|$06:$A6C9:69 00 ADC #$00 ; control flow target (from $A6BD) 0x01A6DB|$06:$A6CB:85 08 STA $08 0x01A6DD|$06:$A6CD:CE 7E 60 DEC $607E 0x01A6E0|$06:$A6D0:D0 80 BNE $A652 0x01A6E2|$06:$A6D2:8E 02 00 STX $0002 0x01A6E5|$06:$A6D5:60 RTS ; control flow target (from $A681, $A6A4) 0x01A6E6|$06:$A6D6:AD 90 60 LDA $6090 0x01A6E9|$06:$A6D9:09 80 ORA #$80 0x01A6EB|$06:$A6DB:9D 00 03 STA $0300,X ; PPU write buffer start 0x01A6EE|$06:$A6DE:AD 8D 60 LDA $608D 0x01A6F1|$06:$A6E1:9D 01 03 STA $0301,X 0x01A6F4|$06:$A6E4:AD 8F 60 LDA $608F 0x01A6F7|$06:$A6E7:9D 02 03 STA $0302,X 0x01A6FA|$06:$A6EA:E8 INX 0x01A6FB|$06:$A6EB:E8 INX 0x01A6FC|$06:$A6EC:E8 INX 0x01A6FD|$06:$A6ED:AD 8D 60 LDA $608D 0x01A700|$06:$A6F0:48 PHA 0x01A701|$06:$A6F1:AC 81 60 LDY $6081 ; control flow target (from $A6FF) 0x01A704|$06:$A6F4:B9 0B 60 LDA $600B,Y 0x01A707|$06:$A6F7:9D 00 03 STA $0300,X ; PPU write buffer start 0x01A70A|$06:$A6FA:E8 INX 0x01A70B|$06:$A6FB:C8 INY 0x01A70C|$06:$A6FC:CE 8D 60 DEC $608D 0x01A70F|$06:$A6FF:D0 F3 BNE $A6F4 0x01A711|$06:$A701:8C 81 60 STY $6081 0x01A714|$06:$A704:68 PLA 0x01A715|$06:$A705:4A LSR 0x01A716|$06:$A706:8D 8D 60 STA $608D 0x01A719|$06:$A709:AD 7E 60 LDA $607E 0x01A71C|$06:$A70C:29 01 AND #$01 0x01A71E|$06:$A70E:F0 4F BEQ $A75F 0x01A720|$06:$A710:AC 82 60 LDY $6082 0x01A723|$06:$A713:AD 90 60 LDA $6090 0x01A726|$06:$A716:8D 98 60 STA $6098 0x01A729|$06:$A719:AD 8F 60 LDA $608F 0x01A72C|$06:$A71C:8D 97 60 STA $6097 ; control flow target (from $A75A) 0x01A72F|$06:$A71F:8A TXA 0x01A730|$06:$A720:48 PHA 0x01A731|$06:$A721:98 TYA 0x01A732|$06:$A722:48 PHA 0x01A733|$06:$A723:AD 90 60 LDA $6090 0x01A736|$06:$A726:48 PHA 0x01A737|$06:$A727:B9 6B 60 LDA $606B,Y 0x01A73A|$06:$A72A:20 89 A7 JSR $A789 0x01A73D|$06:$A72D:8D 8B 60 STA $608B 0x01A740|$06:$A730:68 PLA 0x01A741|$06:$A731:8D 90 60 STA $6090 0x01A744|$06:$A734:68 PLA 0x01A745|$06:$A735:A8 TAY 0x01A746|$06:$A736:68 PLA 0x01A747|$06:$A737:AA TAX 0x01A748|$06:$A738:AD 9A 60 LDA $609A 0x01A74B|$06:$A73B:9D 00 03 STA $0300,X ; PPU write buffer start 0x01A74E|$06:$A73E:E8 INX 0x01A74F|$06:$A73F:AD 99 60 LDA $6099 0x01A752|$06:$A742:9D 00 03 STA $0300,X ; PPU write buffer start 0x01A755|$06:$A745:E8 INX 0x01A756|$06:$A746:AD 8B 60 LDA $608B 0x01A759|$06:$A749:9D 00 03 STA $0300,X ; PPU write buffer start 0x01A75C|$06:$A74C:E8 INX 0x01A75D|$06:$A74D:C8 INY 0x01A75E|$06:$A74E:EE 97 60 INC $6097 0x01A761|$06:$A751:EE 97 60 INC $6097 0x01A764|$06:$A754:EE 01 00 INC $0001 0x01A767|$06:$A757:CE 8D 60 DEC $608D 0x01A76A|$06:$A75A:D0 C3 BNE $A71F 0x01A76C|$06:$A75C:8C 82 60 STY $6082 ; control flow target (from $A70E) 0x01A76F|$06:$A75F:EE 01 00 INC $0001 0x01A772|$06:$A762:60 RTS ; control flow target (from $A62E) 0x01A773|$06:$A763:48 PHA 0x01A774|$06:$A764:20 72 A7 JSR $A772 0x01A777|$06:$A767:68 PLA 0x01A778|$06:$A768:D0 01 BNE $A76B 0x01A77A|$06:$A76A:60 RTS ; control flow target (from $A768) 0x01A77B|$06:$A76B:A5 08 LDA $08 0x01A77D|$06:$A76D:49 04 EOR #$04 0x01A77F|$06:$A76F:85 08 STA $08 0x01A781|$06:$A771:60 RTS ; control flow target (from $A764) 0x01A782|$06:$A772:AD 7C 60 LDA $607C 0x01A785|$06:$A775:0A ASL 0x01A786|$06:$A776:29 1E AND #$1E 0x01A788|$06:$A778:8D 8B 60 STA $608B 0x01A78B|$06:$A77B:AD 7C 60 LDA $607C 0x01A78E|$06:$A77E:4A LSR 0x01A78F|$06:$A77F:4A LSR 0x01A790|$06:$A780:4A LSR 0x01A791|$06:$A781:29 1E AND #$1E 0x01A793|$06:$A783:8D 8C 60 STA $608C 0x01A796|$06:$A786:4C 09 A8 JMP $A809 ; control flow target (from $A72A) 0x01A799|$06:$A789:8D 96 60 STA $6096 0x01A79C|$06:$A78C:A9 1F LDA #$1F 0x01A79E|$06:$A78E:2D 97 60 AND $6097 0x01A7A1|$06:$A791:4A LSR 0x01A7A2|$06:$A792:4A LSR 0x01A7A3|$06:$A793:8D 90 60 STA $6090 0x01A7A6|$06:$A796:A9 80 LDA #$80 0x01A7A8|$06:$A798:2D 97 60 AND $6097 0x01A7AB|$06:$A79B:4A LSR 0x01A7AC|$06:$A79C:4A LSR 0x01A7AD|$06:$A79D:4A LSR 0x01A7AE|$06:$A79E:4A LSR 0x01A7AF|$06:$A79F:0D 90 60 ORA $6090 0x01A7B2|$06:$A7A2:8D 90 60 STA $6090 0x01A7B5|$06:$A7A5:A9 03 LDA #$03 0x01A7B7|$06:$A7A7:2D 98 60 AND $6098 0x01A7BA|$06:$A7AA:0A ASL 0x01A7BB|$06:$A7AB:0A ASL 0x01A7BC|$06:$A7AC:0A ASL 0x01A7BD|$06:$A7AD:0A ASL 0x01A7BE|$06:$A7AE:09 C0 ORA #$C0 0x01A7C0|$06:$A7B0:0D 90 60 ORA $6090 0x01A7C3|$06:$A7B3:8D 99 60 STA $6099 0x01A7C6|$06:$A7B6:A2 23 LDX #$23 0x01A7C8|$06:$A7B8:AD 98 60 LDA $6098 0x01A7CB|$06:$A7BB:C9 24 CMP #$24 0x01A7CD|$06:$A7BD:90 02 BCC $A7C1 0x01A7CF|$06:$A7BF:A2 27 LDX #$27 ; control flow target (from $A7BD) 0x01A7D1|$06:$A7C1:8E 9A 60 STX $609A 0x01A7D4|$06:$A7C4:AD 97 60 LDA $6097 0x01A7D7|$06:$A7C7:29 40 AND #$40 0x01A7D9|$06:$A7C9:4A LSR 0x01A7DA|$06:$A7CA:4A LSR 0x01A7DB|$06:$A7CB:4A LSR 0x01A7DC|$06:$A7CC:4A LSR 0x01A7DD|$06:$A7CD:8D 93 60 STA $6093 0x01A7E0|$06:$A7D0:AD 97 60 LDA $6097 0x01A7E3|$06:$A7D3:29 02 AND #$02 0x01A7E5|$06:$A7D5:0D 93 60 ORA $6093 0x01A7E8|$06:$A7D8:8D 93 60 STA $6093 0x01A7EB|$06:$A7DB:AD 99 60 LDA $6099 0x01A7EE|$06:$A7DE:85 57 STA $57 ; pointer to start of main pointer table, low byte 0x01A7F0|$06:$A7E0:AD 9A 60 LDA $609A 0x01A7F3|$06:$A7E3:29 07 AND #$07 0x01A7F5|$06:$A7E5:85 58 STA $58 ; pointer to start of main pointer table, high byte 0x01A7F7|$06:$A7E7:A0 00 LDY #$00 0x01A7F9|$06:$A7E9:B1 57 LDA ($57),Y ; pointer to start of main pointer table, low byte 0x01A7FB|$06:$A7EB:8D 94 60 STA $6094 0x01A7FE|$06:$A7EE:A9 03 LDA #$03 0x01A800|$06:$A7F0:AC 93 60 LDY $6093 0x01A803|$06:$A7F3:F0 07 BEQ $A7FC ; control flow target (from $A7FA) 0x01A805|$06:$A7F5:0A ASL 0x01A806|$06:$A7F6:0E 96 60 ASL $6096 0x01A809|$06:$A7F9:88 DEY 0x01A80A|$06:$A7FA:D0 F9 BNE $A7F5 ; control flow target (from $A7F3) 0x01A80C|$06:$A7FC:49 FF EOR #$FF 0x01A80E|$06:$A7FE:2D 94 60 AND $6094 0x01A811|$06:$A801:0D 96 60 ORA $6096 0x01A814|$06:$A804:A0 00 LDY #$00 0x01A816|$06:$A806:91 57 STA ($57),Y ; pointer to start of main pointer table, low byte 0x01A818|$06:$A808:60 RTS ; from $02:$B74E, $06:$B0A8, $0F:$FD25, $0F:$FD98 via $8002 ; control flow target (from $A786, $AF70) ; indirect control flow target (via $8002) 0x01A819|$06:$A809:A5 04 LDA $04 0x01A81B|$06:$A80B:0A ASL 0x01A81C|$06:$A80C:0A ASL 0x01A81D|$06:$A80D:29 04 AND #$04 0x01A81F|$06:$A80F:09 20 ORA #$20 0x01A821|$06:$A811:85 08 STA $08 0x01A823|$06:$A813:AD 8B 60 LDA $608B 0x01A826|$06:$A816:0A ASL 0x01A827|$06:$A817:0A ASL 0x01A828|$06:$A818:0A ASL 0x01A829|$06:$A819:18 CLC 0x01A82A|$06:$A81A:65 05 ADC $05 0x01A82C|$06:$A81C:85 07 STA $07 0x01A82E|$06:$A81E:90 06 BCC $A826 0x01A830|$06:$A820:A5 08 LDA $08 0x01A832|$06:$A822:49 04 EOR #$04 0x01A834|$06:$A824:85 08 STA $08 ; control flow target (from $A81E) 0x01A836|$06:$A826:A5 06 LDA $06 0x01A838|$06:$A828:4A LSR 0x01A839|$06:$A829:4A LSR 0x01A83A|$06:$A82A:4A LSR 0x01A83B|$06:$A82B:18 CLC 0x01A83C|$06:$A82C:6D 8C 60 ADC $608C 0x01A83F|$06:$A82F:C9 1E CMP #$1E 0x01A841|$06:$A831:90 02 BCC $A835 0x01A843|$06:$A833:E9 1E SBC #$1E ; control flow target (from $A831) 0x01A845|$06:$A835:4A LSR 0x01A846|$06:$A836:66 07 ROR $07 0x01A848|$06:$A838:4A LSR 0x01A849|$06:$A839:66 07 ROR $07 0x01A84B|$06:$A83B:4A LSR 0x01A84C|$06:$A83C:66 07 ROR $07 0x01A84E|$06:$A83E:05 08 ORA $08 0x01A850|$06:$A840:85 08 STA $08 0x01A852|$06:$A842:60 RTS ; display and handle main game menu ; from $0F:$C6C7 via $8004 ; indirect control flow target (via $8004) 0x01A853|$06:$A843:A9 0C LDA #$0C ; Music ID #$0C: game menu / Wellgarth singer BGM 0x01A855|$06:$A845:8D F7 05 STA $05F7 ; probably BGM for current area ; call to code in a different bank ($0F:$D14F) 0x01A858|$06:$A848:20 4F D1 JSR $D14F 0x01A85B|$06:$A84B:A9 00 LDA #$00 ; Music ID #$00: BGM off 0x01A85D|$06:$A84D:8D F7 05 STA $05F7 ; probably BGM for current area 0x01A860|$06:$A850:20 CA A8 JSR $A8CA ; control flow target (from $A85C) 0x01A863|$06:$A853:20 7E A9 JSR $A97E ; control flow target (from $A9CC) 0x01A866|$06:$A856:20 A3 A9 JSR $A9A3 ; open apporpriate main game menu based on number of filled save slots, set $75DB = #$0A, #$05, or #$00 based on number of filled slots, return menu selection index in A 0x01A869|$06:$A859:20 CF A9 JSR $A9CF 0x01A86C|$06:$A85C:4C 53 A8 JMP $A853 ; from $0F:$D15F via $8008 ; indirect control flow target (via $8008) 0x01A86F|$06:$A85F:A9 19 LDA #$19 ; Menu ID #$19: General menu: YES/NO 0x01A871|$06:$A861:20 93 A9 JSR $A993 ; open menu specified by A 0x01A874|$06:$A864:AA TAX 0x01A875|$06:$A865:D0 0D BNE $A874 ; branch if NO 0x01A877|$06:$A867:A9 FF LDA #$FF 0x01A879|$06:$A869:8D 70 70 STA $7070 ; ????, SRAM buffer 0x01A87C|$06:$A86C:20 85 A8 JSR $A885 ; copy save data from system RAM to per-game save data 0x01A87F|$06:$A86F:A9 78 LDA #$78 ; String ID #$0078: ‘I have entered thy deeds in the Imperial Scrolls of Honor[.’][wait][end-FC] 0x01A881|$06:$A871:20 9B A9 JSR $A99B ; display string ID specified by A ; control flow target (from $A865) 0x01A884|$06:$A874:A9 79 LDA #$79 ; String ID #$0079: ‘Dost thou wish to continue thy quest?’[FD][FD][end-FC] 0x01A886|$06:$A876:20 9B A9 JSR $A99B ; display string ID specified by A 0x01A889|$06:$A879:A9 19 LDA #$19 ; Menu ID #$19: General menu: YES/NO 0x01A88B|$06:$A87B:20 93 A9 JSR $A993 ; open menu specified by A 0x01A88E|$06:$A87E:AA TAX 0x01A88F|$06:$A87F:D0 01 BNE $A882 ; branch if NO 0x01A891|$06:$A881:60 RTS ; control flow target (from $A87F) ; call to code in a different bank ($0F:$D175) 0x01A892|$06:$A882:4C 75 D1 JMP $D175 ; copy save data from system RAM to per-game save data ; from $0F:$C6DA via $801E ; control flow target (from $A86C) ; indirect control flow target (via $801E) 0x01A895|$06:$A885:20 3C AC JSR $AC3C ; copy save data from system RAM to $7000-$706F 0x01A898|$06:$A888:20 AD AC JSR $ACAD ; initialize the RNG based on 71 passes using SRAM data $7000-$7070 and save resulting seed to $7071-$7072 0x01A89B|$06:$A88B:20 87 AB JSR $AB87 ; copy data from SRAM buffer to per-game save data 0x01A89E|$06:$A88E:60 RTS ; copy Midenhall's short name from save slot in A to $0100 in reverse ; from $0F:$EE7E via $801C ; indirect control flow target (via $801C) 0x01A89F|$06:$A88F:20 F5 A9 JSR $A9F5 ; given save slot number in A, set $99-$9A to pointer to second part of save slot data 0x01A8A2|$06:$A892:A0 03 LDY #$03 ; copy 4 bytes 0x01A8A4|$06:$A894:D0 08 BNE $A89E ; copy Midenhall's full name from save slot in $75DB to $0100 in reverse ; from $0F:$EF5B via $800A ; indirect control flow target (via $800A) 0x01A8A6|$06:$A896:AD DB 75 LDA $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01A8A9|$06:$A899:20 F5 A9 JSR $A9F5 ; given save slot number in A, set $99-$9A to pointer to second part of save slot data 0x01A8AC|$06:$A89C:A0 07 LDY #$07 ; copy 8 bytes ; control flow target (from $A894) 0x01A8AE|$06:$A89E:A2 00 LDX #$00 ; control flow target (from $A8A7) 0x01A8B0|$06:$A8A0:B1 99 LDA ($99),Y 0x01A8B2|$06:$A8A2:9D 00 01 STA $0100,X ; string copy buffer start (often referenced as $00FF,X) 0x01A8B5|$06:$A8A5:E8 INX 0x01A8B6|$06:$A8A6:88 DEY 0x01A8B7|$06:$A8A7:10 F7 BPL $A8A0 0x01A8B9|$06:$A8A9:60 RTS ; given current game save slot in $75DB, return Midenhall's level in that save game in A/$0E ; indirect control flow target (via $800C) 0x01A8BA|$06:$A8AA:AD DB 75 LDA $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01A8BD|$06:$A8AD:20 F5 A9 JSR $A9F5 ; given save slot number in A, set $99-$9A to pointer to second part of save slot data 0x01A8C0|$06:$A8B0:A0 08 LDY #$08 ; offset for Midenhall's level 0x01A8C2|$06:$A8B2:B1 99 LDA ($99),Y 0x01A8C4|$06:$A8B4:85 0E STA $0E 0x01A8C6|$06:$A8B6:60 RTS ; indirect control flow target (via $800E) 0x01A8C7|$06:$A8B7:20 F5 A9 JSR $A9F5 ; given save slot number in A, set $99-$9A to pointer to second part of save slot data 0x01A8CA|$06:$A8BA:A2 02 LDX #$02 0x01A8CC|$06:$A8BC:A0 09 LDY #$09 0x01A8CE|$06:$A8BE:B1 99 LDA ($99),Y 0x01A8D0|$06:$A8C0:30 06 BMI $A8C8 0x01A8D2|$06:$A8C2:C9 46 CMP #$46 0x01A8D4|$06:$A8C4:F0 01 BEQ $A8C7 0x01A8D6|$06:$A8C6:CA DEX ; control flow target (from $A8C4) 0x01A8D7|$06:$A8C7:CA DEX ; control flow target (from $A8C0) 0x01A8D8|$06:$A8C8:8A TXA 0x01A8D9|$06:$A8C9:60 RTS ; control flow target (from $A850) 0x01A8DA|$06:$A8CA:A2 05 LDX #$05 ; control flow target (from $A8DF) 0x01A8DC|$06:$A8CC:BD B9 AD LDA $ADB9,X 0x01A8DF|$06:$A8CF:DD FA 75 CMP $75FA,X 0x01A8E2|$06:$A8D2:F0 0A BEQ $A8DE 0x01A8E4|$06:$A8D4:DD 01 60 CMP $6001,X 0x01A8E7|$06:$A8D7:F0 05 BEQ $A8DE 0x01A8E9|$06:$A8D9:DD A7 61 CMP $61A7,X 0x01A8EC|$06:$A8DC:D0 05 BNE $A8E3 ; control flow target (from $A8D2, $A8D7) 0x01A8EE|$06:$A8DE:CA DEX 0x01A8EF|$06:$A8DF:10 EB BPL $A8CC 0x01A8F1|$06:$A8E1:30 36 BMI $A919 ; control flow target (from $A8DC) 0x01A8F3|$06:$A8E3:AD F4 AD LDA $ADF4 0x01A8F6|$06:$A8E6:8D 99 00 STA $0099 0x01A8F9|$06:$A8E9:AD F5 AD LDA $ADF5 0x01A8FC|$06:$A8EC:8D 9A 00 STA $009A 0x01A8FF|$06:$A8EF:A2 0D LDX #$0D ; control flow target (from $A908) 0x01A901|$06:$A8F1:A0 72 LDY #$72 0x01A903|$06:$A8F3:A9 00 LDA #$00 ; control flow target (from $A8F8) 0x01A905|$06:$A8F5:91 99 STA ($99),Y 0x01A907|$06:$A8F7:88 DEY 0x01A908|$06:$A8F8:10 FB BPL $A8F5 0x01A90A|$06:$A8FA:38 SEC 0x01A90B|$06:$A8FB:A5 99 LDA $99 0x01A90D|$06:$A8FD:E9 73 SBC #$73 0x01A90F|$06:$A8FF:85 99 STA $99 0x01A911|$06:$A901:A5 9A LDA $9A 0x01A913|$06:$A903:E9 00 SBC #$00 0x01A915|$06:$A905:85 9A STA $9A 0x01A917|$06:$A907:CA DEX 0x01A918|$06:$A908:D0 E7 BNE $A8F1 0x01A91A|$06:$A90A:A9 00 LDA #$00 0x01A91C|$06:$A90C:8D DA 75 STA $75DA ; bit field for which save game slots are filled 0x01A91F|$06:$A90F:A2 02 LDX #$02 0x01A921|$06:$A911:A9 FF LDA #$FF ; control flow target (from $A917) 0x01A923|$06:$A913:9D D7 75 STA $75D7,X ; save slot 1 status (write-only?) 0x01A926|$06:$A916:CA DEX 0x01A927|$06:$A917:10 FA BPL $A913 ; control flow target (from $A8E1) 0x01A929|$06:$A919:A2 05 LDX #$05 ; control flow target (from $A928) 0x01A92B|$06:$A91B:BD B9 AD LDA $ADB9,X 0x01A92E|$06:$A91E:9D FA 75 STA $75FA,X 0x01A931|$06:$A921:9D 01 60 STA $6001,X 0x01A934|$06:$A924:9D A7 61 STA $61A7,X 0x01A937|$06:$A927:CA DEX 0x01A938|$06:$A928:10 F1 BPL $A91B 0x01A93A|$06:$A92A:A9 00 LDA #$00 0x01A93C|$06:$A92C:8D DB 75 STA $75DB ; in game: current game save slot; out of game: various temporary game menu setup values ; control flow target (from $A973) 0x01A93F|$06:$A92F:AE DB 75 LDX $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01A942|$06:$A932:AD DA 75 LDA $75DA ; bit field for which save game slots are filled ; control flow target (from $A937) 0x01A945|$06:$A935:4A LSR 0x01A946|$06:$A936:CA DEX 0x01A947|$06:$A937:10 FC BPL $A935 0x01A949|$06:$A939:90 30 BCC $A96B 0x01A94B|$06:$A93B:20 44 AB JSR $AB44 ; copy current save game's data to save data buffer at $7000; CLC if data is valid, SEC if it's unrecoverable 0x01A94E|$06:$A93E:90 28 BCC $A968 0x01A950|$06:$A940:AE DB 75 LDX $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01A953|$06:$A943:A9 FD LDA #$FD 0x01A955|$06:$A945:9D D7 75 STA $75D7,X ; save slot 1 status (write-only?) 0x01A958|$06:$A948:E8 INX 0x01A959|$06:$A949:86 8F STX $8F 0x01A95B|$06:$A94B:A9 00 LDA #$00 0x01A95D|$06:$A94D:85 90 STA $90 0x01A95F|$06:$A94F:A9 04 LDA #$04 ; Menu ID #$04: Dialogue window 0x01A961|$06:$A951:20 93 A9 JSR $A993 ; open menu specified by A 0x01A964|$06:$A954:A9 0A LDA #$0A ; Music ID #$0A: cursed BGM ; call to code in a different bank ($0F:$C58D) 0x01A966|$06:$A956:20 8D C5 JSR $C58D ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]), wait for it to finish, then play previous BGM 0x01A969|$06:$A959:E6 8E INC $8E ; flag for in battle or not (#$FF)? 0x01A96B|$06:$A95B:A9 77 LDA #$77 ; String ID #$0077: [no voice]I'm afraid that[line][no voice]scenario [number] was not[line][no voice]recorded in the[line][no voice]Imperial Scrolls of[line][no voice]Honor.[end-FC] 0x01A96D|$06:$A95D:20 9B A9 JSR $A99B ; display string ID specified by A 0x01A970|$06:$A960:E6 8E INC $8E ; flag for in battle or not (#$FF)? 0x01A972|$06:$A962:20 76 A9 JSR $A976 ; wait for controller input 0x01A975|$06:$A965:20 EB AA JSR $AAEB ; control flow target (from $A93E) 0x01A978|$06:$A968:20 02 AA JSR $AA02 ; copy more data to second part of per-game save data ; control flow target (from $A939) 0x01A97B|$06:$A96B:EE DB 75 INC $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01A97E|$06:$A96E:AD DB 75 LDA $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01A981|$06:$A971:C9 03 CMP #$03 0x01A983|$06:$A973:90 BA BCC $A92F 0x01A985|$06:$A975:60 RTS ; wait for controller input ; control flow target (from $A962, $A97B) ; call to code in a different bank ($0F:$C476) 0x01A986|$06:$A976:20 76 C4 JSR $C476 ; read joypad 1 data into $2F 0x01A989|$06:$A979:A5 2F LDA $2F ; joypad 1 data 0x01A98B|$06:$A97B:F0 F9 BEQ $A976 ; wait for controller input 0x01A98D|$06:$A97D:60 RTS ; control flow target (from $A853) ; call to code in a different bank ($0F:$C42A) 0x01A98E|$06:$A97E:20 2A C4 JSR $C42A ; call to code in a different bank ($0F:$C446) 0x01A991|$06:$A981:20 46 C4 JSR $C446 ; turn screen off, write $800 [space] tiles to PPU $2000, turn screen on ; call to code in a different bank ($0F:$C1DC) 0x01A994|$06:$A984:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x01A997|$06:$A987:A9 80 LDA #$80 0x01A999|$06:$A989:8D 07 60 STA $6007 ; call to code in a different bank ($0F:$C41C) 0x01A99C|$06:$A98C:20 1C C4 JSR $C41C ; wait for interrupt, turn screen sprites and backround on ; call to code in a different bank ($0F:$D14F) 0x01A99F|$06:$A98F:20 4F D1 JSR $D14F 0x01A9A2|$06:$A992:60 RTS ; open menu specified by A ; control flow target (from $A861, $A87B, $A951, $A9C2, $AA76, $AAFE, $AB03, $AB1C) 0x01A9A3|$06:$A993:A2 06 LDX #$06 0x01A9A5|$06:$A995:86 94 STX $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus ; call to code in a different bank ($0F:$EB89) 0x01A9A7|$06:$A997:20 89 EB JSR $EB89 ; open menu specified by A 0x01A9AA|$06:$A99A:60 RTS ; JMP > JSR + RTS ; display string ID specified by A ; control flow target (from $A871, $A876, $A95D) 0x01A9AB|$06:$A99B:A2 06 LDX #$06 0x01A9AD|$06:$A99D:86 94 STX $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus ; call to code in a different bank ($0F:$FA4A) 0x01A9AF|$06:$A99F:20 4A FA JSR $FA4A ; display string ID specified by A 0x01A9B2|$06:$A9A2:60 RTS ; open apporpriate main game menu based on number of filled save slots, set $75DB = #$0A, #$05, or #$00 based on number of filled slots, return menu selection index in A ; control flow target (from $A856) 0x01A9B3|$06:$A9A3:A2 02 LDX #$02 0x01A9B5|$06:$A9A5:AD DA 75 LDA $75DA ; bit field for which save game slots are filled 0x01A9B8|$06:$A9A8:29 07 AND #$07 0x01A9BA|$06:$A9AA:F0 06 BEQ $A9B2 ; 0 slots filled => use X = #$02 0x01A9BC|$06:$A9AC:C9 07 CMP #$07 0x01A9BE|$06:$A9AE:D0 01 BNE $A9B1 ; 1-2 slots filled => use X = #$01 0x01A9C0|$06:$A9B0:CA DEX ; 3 slots filled => use X = #$00 ; control flow target (from $A9AE) 0x01A9C1|$06:$A9B1:CA DEX ; control flow target (from $A9AA) 0x01A9C2|$06:$A9B2:8A TXA 0x01A9C3|$06:$A9B3:8D DB 75 STA $75DB ; in game: current game save slot; out of game: various temporary game menu setup values; base index into main game menu handlers 0x01A9C6|$06:$A9B6:0A ASL 0x01A9C7|$06:$A9B7:0A ASL 0x01A9C8|$06:$A9B8:6D DB 75 ADC $75DB ; in game: current game save slot; out of game: various temporary game menu setup values; base index into main game menu handlers 0x01A9CB|$06:$A9BB:8D DB 75 STA $75DB ; in game: current game save slot; out of game: various temporary game menu setup values; base index into main game menu handlers 0x01A9CE|$06:$A9BE:8A TXA 0x01A9CF|$06:$A9BF:18 CLC 0x01A9D0|$06:$A9C0:69 32 ADC #$32 ; Menu ID #$32 - #$34: Game menu: 3, 1-2, or 0 saves 0x01A9D2|$06:$A9C2:20 93 A9 JSR $A993 ; open menu specified by A 0x01A9D5|$06:$A9C5:C9 FF CMP #$FF 0x01A9D7|$06:$A9C7:F0 01 BEQ $A9CA 0x01A9D9|$06:$A9C9:60 RTS ; control flow target (from $A9C7) 0x01A9DA|$06:$A9CA:68 PLA 0x01A9DB|$06:$A9CB:68 PLA 0x01A9DC|$06:$A9CC:4C 56 A8 JMP $A856 ; control flow target (from $A859) 0x01A9DF|$06:$A9CF:18 CLC 0x01A9E0|$06:$A9D0:6D DB 75 ADC $75DB ; in game: current game save slot; out of game: various temporary game menu setup values; base index into main game menu handlers 0x01A9E3|$06:$A9D3:AA TAX 0x01A9E4|$06:$A9D4:BD D7 AD LDA $ADD7,X ; index into jump table at $ADE2 0x01A9E7|$06:$A9D7:0A ASL 0x01A9E8|$06:$A9D8:AA TAX 0x01A9E9|$06:$A9D9:BD E2 AD LDA $ADE2,X ; jump table for main game menu handlers 0x01A9EC|$06:$A9DC:85 99 STA $99 0x01A9EE|$06:$A9DE:BD E3 AD LDA $ADE3,X 0x01A9F1|$06:$A9E1:85 9A STA $9A 0x01A9F3|$06:$A9E3:6C 99 00 JMP ($0099) 0x01A9F6|$06:$A9E6:A8 TAY 0x01A9F7|$06:$A9E7:A2 00 LDX #$00 0x01A9F9|$06:$A9E9:AD DA 75 LDA $75DA ; bit field for which save game slots are filled ; control flow target (from $A9EE, $A9F1) 0x01A9FC|$06:$A9EC:E8 INX 0x01A9FD|$06:$A9ED:4A LSR 0x01A9FE|$06:$A9EE:90 FC BCC $A9EC 0x01AA00|$06:$A9F0:88 DEY 0x01AA01|$06:$A9F1:10 F9 BPL $A9EC 0x01AA03|$06:$A9F3:CA DEX 0x01AA04|$06:$A9F4:8A TXA ; given save slot number in A, set $99-$9A to pointer to second part of save slot data ; control flow target (from $A88F, $A899, $A8AD, $A8B7, $AA05) 0x01AA05|$06:$A9F5:0A ASL 0x01AA06|$06:$A9F6:AA TAX 0x01AA07|$06:$A9F7:BD F6 AD LDA $ADF6,X 0x01AA0A|$06:$A9FA:85 99 STA $99 0x01AA0C|$06:$A9FC:BD F7 AD LDA $ADF7,X 0x01AA0F|$06:$A9FF:85 9A STA $9A 0x01AA11|$06:$AA01:60 RTS ; copy more data to second part of per-game save data ; control flow target (from $A968, $AB8C) 0x01AA12|$06:$AA02:AD DB 75 LDA $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01AA15|$06:$AA05:20 F5 A9 JSR $A9F5 ; given save slot number in A, set $99-$9A to pointer to second part of save slot data 0x01AA18|$06:$AA08:A0 09 LDY #$09 0x01AA1A|$06:$AA0A:AD 6F 70 LDA $706F ; current battle message delay, SRAM buffer 0x01AA1D|$06:$AA0D:91 99 STA ($99),Y 0x01AA1F|$06:$AA0F:88 DEY 0x01AA20|$06:$AA10:AD 26 70 LDA $7026 0x01AA23|$06:$AA13:91 99 STA ($99),Y 0x01AA25|$06:$AA15:A2 03 LDX #$03 ; control flow target (from $AA1E) 0x01AA27|$06:$AA17:88 DEY 0x01AA28|$06:$AA18:BD 63 70 LDA $7063,X ; party names, bytes 4-7, SRAM buffer 0x01AA2B|$06:$AA1B:91 99 STA ($99),Y 0x01AA2D|$06:$AA1D:CA DEX 0x01AA2E|$06:$AA1E:10 F7 BPL $AA17 0x01AA30|$06:$AA20:88 DEY ; control flow target (from $AA27) 0x01AA31|$06:$AA21:B9 09 70 LDA $7009,Y ; Midenhall name bytes 0-3, SRAM buffer 0x01AA34|$06:$AA24:91 99 STA ($99),Y 0x01AA36|$06:$AA26:88 DEY 0x01AA37|$06:$AA27:10 F8 BPL $AA21 0x01AA39|$06:$AA29:60 RTS ; mark save game slot specified by $75DB as filled ; control flow target (from $AAAE, $AAD3) 0x01AA3A|$06:$AA2A:38 SEC 0x01AA3B|$06:$AA2B:A9 00 LDA #$00 0x01AA3D|$06:$AA2D:AE DB 75 LDX $75DB ; in game: current game save slot; out of game: various temporary game menu setup values ; control flow target (from $AA32) 0x01AA40|$06:$AA30:2A ROL 0x01AA41|$06:$AA31:CA DEX 0x01AA42|$06:$AA32:10 FC BPL $AA30 ; keep shifting that 1 set bit until it's in the right position 0x01AA44|$06:$AA34:0D DA 75 ORA $75DA ; bit field for which save game slots are filled 0x01AA47|$06:$AA37:8D DA 75 STA $75DA ; bit field for which save game slots are filled 0x01AA4A|$06:$AA3A:60 RTS ; mark save game slot specified by $75DB as empty ; control flow target (from $AAEB) 0x01AA4B|$06:$AA3B:18 CLC 0x01AA4C|$06:$AA3C:A9 FF LDA #$FF 0x01AA4E|$06:$AA3E:AE DB 75 LDX $75DB ; in game: current game save slot; out of game: various temporary game menu setup values ; control flow target (from $AA43) 0x01AA51|$06:$AA41:2A ROL 0x01AA52|$06:$AA42:CA DEX 0x01AA53|$06:$AA43:10 FC BPL $AA41 ; keep shifting that 1 clear bit until it's in the right position 0x01AA55|$06:$AA45:2D DA 75 AND $75DA ; bit field for which save game slots are filled 0x01AA58|$06:$AA48:8D DA 75 STA $75DA ; bit field for which save game slots are filled 0x01AA5B|$06:$AA4B:60 RTS ; set $75D7,$75DB to #$FF (useless op?) ; control flow target (from $AAB1, $AAD6) 0x01AA5C|$06:$AA4C:A9 FF LDA #$FF 0x01AA5E|$06:$AA4E:AE DB 75 LDX $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01AA61|$06:$AA51:9D D7 75 STA $75D7,X ; save slot 1 status (write-only?) 0x01AA64|$06:$AA54:60 RTS ; CONTINUE A QUEST handler ; indirect control flow target (via $ADE2) 0x01AA65|$06:$AA55:20 0C AB JSR $AB0C ; display filled slots selection menu, set A/$75DB to selected slot 0x01AA68|$06:$AA58:20 44 AB JSR $AB44 ; copy current save game's data to save data buffer at $7000; CLC if data is valid, SEC if it's unrecoverable 0x01AA6B|$06:$AA5B:20 C7 AB JSR $ABC7 ; copy save data from save data buffer at $7000 to system RAM; update Don Mahone quest status if applicable ; control flow target (from $AABA) 0x01AA6E|$06:$AA5E:68 PLA 0x01AA6F|$06:$AA5F:68 PLA ; call to code in a different bank ($0F:$C577) 0x01AA70|$06:$AA60:20 77 C5 JSR $C577 ; set $6144 to #$05 0x01AA73|$06:$AA63:60 RTS ; CHANGE MESSAGE SPEED handler ; indirect control flow target (via $ADE4) 0x01AA74|$06:$AA64:20 0C AB JSR $AB0C ; display filled slots selection menu, set A/$75DB to selected slot 0x01AA77|$06:$AA67:20 44 AB JSR $AB44 ; copy current save game's data to save data buffer at $7000; CLC if data is valid, SEC if it's unrecoverable 0x01AA7A|$06:$AA6A:20 6E AA JSR $AA6E ; display Menu ID #$45: Game menu: select message speed, update message speed based on new selection 0x01AA7D|$06:$AA6D:60 RTS ; display Menu ID #$45: Game menu: select message speed, update message speed based on new selection ; control flow target (from $AA6A, $AAA9) 0x01AA7E|$06:$AA6E:AD 6F 70 LDA $706F ; current battle message delay, SRAM buffer 0x01AA81|$06:$AA71:8D 2C 06 STA $062C ; current battle message delay 0x01AA84|$06:$AA74:A9 45 LDA #$45 ; Menu ID #$45: Game menu: select message speed 0x01AA86|$06:$AA76:20 93 A9 JSR $A993 ; open menu specified by A 0x01AA89|$06:$AA79:C9 FF CMP #$FF 0x01AA8B|$06:$AA7B:F0 12 BEQ $AA8F ; pop JSR return address and RTS back to to display and handle main game menu 0x01AA8D|$06:$AA7D:AA TAX 0x01AA8E|$06:$AA7E:BD BF AD LDA $ADBF,X ; battle message delays (frames between prints; higher = slower) 0x01AA91|$06:$AA81:8D 6F 70 STA $706F ; current battle message delay, SRAM buffer 0x01AA94|$06:$AA84:8D 2C 06 STA $062C ; current battle message delay 0x01AA97|$06:$AA87:20 AD AC JSR $ACAD ; initialize the RNG based on 71 passes using SRAM data $7000-$7070 and save resulting seed to $7071-$7072 0x01AA9A|$06:$AA8A:20 87 AB JSR $AB87 ; copy data from SRAM buffer to per-game save data 0x01AA9D|$06:$AA8D:18 CLC 0x01AA9E|$06:$AA8E:60 RTS ; pop JSR return address and RTS back to to display and handle main game menu ; control flow target (from $AA7B) 0x01AA9F|$06:$AA8F:68 PLA 0x01AAA0|$06:$AA90:68 PLA 0x01AAA1|$06:$AA91:38 SEC 0x01AAA2|$06:$AA92:60 RTS ; BEGIN A NEW QUEST handler ; indirect control flow target (via $ADE6) 0x01AAA3|$06:$AA93:A9 00 LDA #$00 0x01AAA5|$06:$AA95:8D 70 70 STA $7070 ; ????, SRAM buffer 0x01AAA8|$06:$AA98:20 15 AB JSR $AB15 ; display empty slots selection menu, set A/$75DB to selected slot 0x01AAAB|$06:$AA9B:20 CD AC JSR $ACCD 0x01AAAE|$06:$AA9E:20 C0 AA JSR $AAC0 ; if $0100 is [space], pop JSR return address and RTS back to to display and handle main game menu 0x01AAB1|$06:$AAA1:A9 46 LDA #$46 ; NORMAL 0x01AAB3|$06:$AAA3:8D 2C 06 STA $062C ; current battle message delay 0x01AAB6|$06:$AAA6:8D 6F 70 STA $706F ; current battle message delay, SRAM buffer 0x01AAB9|$06:$AAA9:20 6E AA JSR $AA6E ; display Menu ID #$45: Game menu: select message speed, update message speed based on new selection 0x01AABC|$06:$AAAC:B0 0F BCS $AABD ; impossible branch; if $AA6E finishes with SEC, it also popped its return address, so control flow does not end up here 0x01AABE|$06:$AAAE:20 2A AA JSR $AA2A ; mark save game slot specified by $75DB as filled 0x01AAC1|$06:$AAB1:20 4C AA JSR $AA4C ; set $75D7,$75DB to #$FF (useless op?) 0x01AAC4|$06:$AAB4:20 AD AC JSR $ACAD ; initialize the RNG based on 71 passes using SRAM data $7000-$7070 and save resulting seed to $7071-$7072 0x01AAC7|$06:$AAB7:20 87 AB JSR $AB87 ; copy data from SRAM buffer to per-game save data 0x01AACA|$06:$AABA:4C 5E AA JMP $AA5E ; pop JSR return address and RTS back to to display and handle main game menu ; control flow target (from $AAAC) 0x01AACD|$06:$AABD:68 PLA 0x01AACE|$06:$AABE:68 PLA 0x01AACF|$06:$AABF:60 RTS ; if $0100 is [space], pop JSR return address and RTS back to to display and handle main game menu ; control flow target (from $AA9E) 0x01AAD0|$06:$AAC0:AD 00 01 LDA $0100 ; string copy buffer start (often referenced as $00FF,X) 0x01AAD3|$06:$AAC3:C9 5F CMP #$5F ; Tile ID #$5F: [space] 0x01AAD5|$06:$AAC5:D0 02 BNE $AAC9 0x01AAD7|$06:$AAC7:68 PLA 0x01AAD8|$06:$AAC8:68 PLA ; control flow target (from $AAC5) 0x01AAD9|$06:$AAC9:60 RTS ; COPY A QUEST handler ; indirect control flow target (via $ADE8) 0x01AADA|$06:$AACA:20 0C AB JSR $AB0C ; display filled slots selection menu, set A/$75DB to selected slot 0x01AADD|$06:$AACD:20 44 AB JSR $AB44 ; copy current save game's data to save data buffer at $7000; CLC if data is valid, SEC if it's unrecoverable 0x01AAE0|$06:$AAD0:20 15 AB JSR $AB15 ; display empty slots selection menu, set A/$75DB to selected slot 0x01AAE3|$06:$AAD3:20 2A AA JSR $AA2A ; mark save game slot specified by $75DB as filled 0x01AAE6|$06:$AAD6:20 4C AA JSR $AA4C ; set $75D7,$75DB to #$FF (useless op?) 0x01AAE9|$06:$AAD9:20 87 AB JSR $AB87 ; copy data from SRAM buffer to per-game save data 0x01AAEC|$06:$AADC:60 RTS ; ERASE A QUEST handler ; indirect control flow target (via $ADEA) 0x01AAED|$06:$AADD:20 0C AB JSR $AB0C ; display filled slots selection menu, set A/$75DB to selected slot 0x01AAF0|$06:$AAE0:20 FC AA JSR $AAFC ; display Menu ID #$43: Game menu: delete selected game and Menu ID #$19: General menu: YES/NO 0x01AAF3|$06:$AAE3:AE DB 75 LDX $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01AAF6|$06:$AAE6:A9 FE LDA #$FE 0x01AAF8|$06:$AAE8:9D D7 75 STA $75D7,X ; save slot 1 status (write-only?) ; control flow target (from $A965) 0x01AAFB|$06:$AAEB:20 3B AA JSR $AA3B ; mark save game slot specified by $75DB as empty 0x01AAFE|$06:$AAEE:A2 72 LDX #$72 ; fill save game buffer with #$00 0x01AB00|$06:$AAF0:A9 00 LDA #$00 ; control flow target (from $AAF6) 0x01AB02|$06:$AAF2:9D 00 70 STA $7000,X ; 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), SRAM buffer 0x01AB05|$06:$AAF5:CA DEX 0x01AB06|$06:$AAF6:10 FA BPL $AAF2 0x01AB08|$06:$AAF8:20 87 AB JSR $AB87 ; copy data from SRAM buffer to per-game save data 0x01AB0B|$06:$AAFB:60 RTS ; display Menu ID #$43: Game menu: delete selected game and Menu ID #$19: General menu: YES/NO ; control flow target (from $AAE0) 0x01AB0C|$06:$AAFC:A9 43 LDA #$43 ; Menu ID #$43: Game menu: delete selected game 0x01AB0E|$06:$AAFE:20 93 A9 JSR $A993 ; open menu specified by A 0x01AB11|$06:$AB01:A9 19 LDA #$19 ; Menu ID #$19: General menu: YES/NO 0x01AB13|$06:$AB03:20 93 A9 JSR $A993 ; open menu specified by A 0x01AB16|$06:$AB06:AA TAX ; if NO, pop JSR return address and RTS back to to display and handle main game menu 0x01AB17|$06:$AB07:F0 02 BEQ $AB0B 0x01AB19|$06:$AB09:68 PLA 0x01AB1A|$06:$AB0A:68 PLA ; control flow target (from $AB07) 0x01AB1B|$06:$AB0B:60 RTS ; display filled slots selection menu, set A/$75DB to selected slot ; control flow target (from $AA55, $AA64, $AACA, $AADD) 0x01AB1C|$06:$AB0C:A9 00 LDA #$00 ; get index for filled slots 0x01AB1E|$06:$AB0E:20 32 AB JSR $AB32 ; set A to offset of appropriate save slot selection menu: A = #$00 gets index for filled slots, A = #$FF gets index for empty slots; also sets $75DB to offset for corresponding current slot lut 0x01AB21|$06:$AB11:69 3C ADC #$3C ; base menu ID 0x01AB23|$06:$AB13:D0 07 BNE $AB1C ; display empty slots selection menu, set A/$75DB to selected slot ; control flow target (from $AA98, $AAD0) 0x01AB25|$06:$AB15:A9 FF LDA #$FF ; get index for empty slots 0x01AB27|$06:$AB17:20 32 AB JSR $AB32 ; set A to offset of appropriate save slot selection menu: A = #$00 gets index for filled slots, A = #$FF gets index for empty slots; also sets $75DB to offset for corresponding current slot lut 0x01AB2A|$06:$AB1A:69 35 ADC #$35 ; base menu ID ; control flow target (from $AB13) 0x01AB2C|$06:$AB1C:20 93 A9 JSR $A993 ; open menu specified by A 0x01AB2F|$06:$AB1F:C9 FF CMP #$FF 0x01AB31|$06:$AB21:F0 0C BEQ $AB2F ; pop JSR return address and RTS back to to display and handle main game menu 0x01AB33|$06:$AB23:18 CLC 0x01AB34|$06:$AB24:6D DB 75 ADC $75DB ; in game: current game save slot; out of game: various temporary game menu setup values; offset for current slot lookup table 0x01AB37|$06:$AB27:AA TAX 0x01AB38|$06:$AB28:BD C2 AD LDA $ADC2,X ; lookup table for save game slot based on save game slot selection type + menu selection index 0x01AB3B|$06:$AB2B:8D DB 75 STA $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01AB3E|$06:$AB2E:60 RTS ; pop JSR return address and RTS back to to display and handle main game menu ; control flow target (from $AB21) 0x01AB3F|$06:$AB2F:68 PLA 0x01AB40|$06:$AB30:68 PLA 0x01AB41|$06:$AB31:60 RTS ; set A to offset of appropriate save slot selection menu: A = #$00 gets index for filled slots, A = #$FF gets index for empty slots; also sets $75DB to offset for corresponding current slot lut ; control flow target (from $AB0E, $AB17) 0x01AB42|$06:$AB32:4D DA 75 EOR $75DA ; bit field for which save game slots are filled 0x01AB45|$06:$AB35:29 07 AND #$07 ; 3 save slots 0x01AB47|$06:$AB37:AA TAX 0x01AB48|$06:$AB38:CA DEX 0x01AB49|$06:$AB39:8A TXA 0x01AB4A|$06:$AB3A:85 99 STA $99 0x01AB4C|$06:$AB3C:0A ASL 0x01AB4D|$06:$AB3D:65 99 ADC $99 0x01AB4F|$06:$AB3F:8D DB 75 STA $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01AB52|$06:$AB42:8A TXA 0x01AB53|$06:$AB43:60 RTS ; copy current save game's data to save data buffer at $7000; CLC if data is valid, SEC if it's unrecoverable ; control flow target (from $A93B, $AA58, $AA67, $AACD) 0x01AB54|$06:$AB44:20 90 AB JSR $AB90 ; set $99-$9A to pointer to current game's save slot, $9B-$9C to pointer to save data buffer at $7000 0x01AB57|$06:$AB47:A2 00 LDX #$00 ; save data copy number ; control flow target (from $AB7B) 0x01AB59|$06:$AB49:A0 72 LDY #$72 ; copy #$73 bytes of data from current game's save slot to save data buffer at $7000 ; control flow target (from $AB50) 0x01AB5B|$06:$AB4B:B1 99 LDA ($99),Y 0x01AB5D|$06:$AB4D:91 9B STA ($9B),Y 0x01AB5F|$06:$AB4F:88 DEY 0x01AB60|$06:$AB50:10 F9 BPL $AB4B 0x01AB62|$06:$AB52:98 TYA ; save Y and X on the stack 0x01AB63|$06:$AB53:48 PHA 0x01AB64|$06:$AB54:8A TXA 0x01AB65|$06:$AB55:48 PHA 0x01AB66|$06:$AB56:20 BB AC JSR $ACBB ; initialize the RNG based on 71 passes using SRAM data $7000-$7070 0x01AB69|$06:$AB59:68 PLA ; restore X and Y from the stack 0x01AB6A|$06:$AB5A:AA TAX 0x01AB6B|$06:$AB5B:68 PLA 0x01AB6C|$06:$AB5C:A8 TAY 0x01AB6D|$06:$AB5D:AD 71 70 LDA $7071 ; RNG byte 0, SRAM buffer 0x01AB70|$06:$AB60:C5 32 CMP $32 ; RNG byte 0 0x01AB72|$06:$AB62:D0 07 BNE $AB6B ; save data corrupted! 0x01AB74|$06:$AB64:AD 72 70 LDA $7072 ; RNG byte 1, SRAM buffer 0x01AB77|$06:$AB67:C5 33 CMP $33 ; RNG byte 1 0x01AB79|$06:$AB69:F0 14 BEQ $AB7F ; save data valid! ; save data corrupted! ; control flow target (from $AB62) 0x01AB7B|$06:$AB6B:18 CLC ; add #$159 (i.e. #$73 * 3) to $99-$9A 0x01AB7C|$06:$AB6C:A9 59 LDA #$59 0x01AB7E|$06:$AB6E:65 99 ADC $99 0x01AB80|$06:$AB70:85 99 STA $99 0x01AB82|$06:$AB72:A9 01 LDA #$01 0x01AB84|$06:$AB74:65 9A ADC $9A 0x01AB86|$06:$AB76:85 9A STA $9A 0x01AB88|$06:$AB78:E8 INX ; save data copy number 0x01AB89|$06:$AB79:E0 04 CPX #$04 ; there are 4 copies of save data 0x01AB8B|$06:$AB7B:D0 CC BNE $AB49 0x01AB8D|$06:$AB7D:38 SEC ; flag data as unrecoverable :( 0x01AB8E|$06:$AB7E:60 RTS ; save data valid! ; control flow target (from $AB69) 0x01AB8F|$06:$AB7F:8A TXA 0x01AB90|$06:$AB80:F0 03 BEQ $AB85 ; if first save data copy was bad, update all copies with good data 0x01AB92|$06:$AB82:20 AA AB JSR $ABAA ; copy save data from save data buffer to current game's save slot, making X copies of the data spaced 3 saves slots away ; control flow target (from $AB80) 0x01AB95|$06:$AB85:18 CLC ; flag data as valid 0x01AB96|$06:$AB86:60 RTS ; copy data from SRAM buffer to per-game save data ; control flow target (from $A88B, $AA8A, $AAB7, $AAD9, $AAF8) 0x01AB97|$06:$AB87:A2 04 LDX #$04 ; make 4 copies of save data 0x01AB99|$06:$AB89:20 AA AB JSR $ABAA ; copy save data from save data buffer to current game's save slot, making X copies of the data spaced 3 saves slots away 0x01AB9C|$06:$AB8C:20 02 AA JSR $AA02 ; copy more data to second part of per-game save data 0x01AB9F|$06:$AB8F:60 RTS ; set $99-$9A to pointer to current game's save slot, $9B-$9C to pointer to save data buffer at $7000 ; control flow target (from $AB44, $ABAA) 0x01ABA0|$06:$AB90:AD DB 75 LDA $75DB ; in game: current game save slot; out of game: various temporary game menu setup values 0x01ABA3|$06:$AB93:0A ASL 0x01ABA4|$06:$AB94:A8 TAY 0x01ABA5|$06:$AB95:B9 EE AD LDA $ADEE,Y ; pointers to start of per-game save data 0x01ABA8|$06:$AB98:85 99 STA $99 0x01ABAA|$06:$AB9A:B9 EF AD LDA $ADEF,Y 0x01ABAD|$06:$AB9D:85 9A STA $9A 0x01ABAF|$06:$AB9F:AD EC AD LDA $ADEC ; pointer to start of current game save data buffer 0x01ABB2|$06:$ABA2:85 9B STA $9B 0x01ABB4|$06:$ABA4:AD ED AD LDA $ADED 0x01ABB7|$06:$ABA7:85 9C STA $9C 0x01ABB9|$06:$ABA9:60 RTS ; copy save data from save data buffer to current game's save slot, making X copies of the data spaced 3 saves slots away ; control flow target (from $AB82, $AB89) 0x01ABBA|$06:$ABAA:20 90 AB JSR $AB90 ; set $99-$9A to pointer to current game's save slot, $9B-$9C to pointer to save data buffer at $7000 ; control flow target (from $ABC4) 0x01ABBD|$06:$ABAD:A0 72 LDY #$72 ; control flow target (from $ABB4) 0x01ABBF|$06:$ABAF:B1 9B LDA ($9B),Y 0x01ABC1|$06:$ABB1:91 99 STA ($99),Y 0x01ABC3|$06:$ABB3:88 DEY 0x01ABC4|$06:$ABB4:10 F9 BPL $ABAF 0x01ABC6|$06:$ABB6:18 CLC ; add #$72 * 3 = #$0159 to write address $99-$9A 0x01ABC7|$06:$ABB7:A9 59 LDA #$59 0x01ABC9|$06:$ABB9:65 99 ADC $99 0x01ABCB|$06:$ABBB:85 99 STA $99 0x01ABCD|$06:$ABBD:A9 01 LDA #$01 0x01ABCF|$06:$ABBF:65 9A ADC $9A 0x01ABD1|$06:$ABC1:85 9A STA $9A 0x01ABD3|$06:$ABC3:CA DEX 0x01ABD4|$06:$ABC4:D0 E7 BNE $ABAD ; make X copies of the save data 0x01ABD6|$06:$ABC6:60 RTS ; copy save data from save data buffer at $7000 to system RAM; update Don Mahone quest status if applicable ; from $0F:$C6F9 via $8006 ; control flow target (from $AA5B) ; indirect control flow target (via $8006) 0x01ABD7|$06:$ABC7:AD 00 70 LDA $7000 ; 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), SRAM buffer 0x01ABDA|$06:$ABCA:85 CA STA $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) 0x01ABDC|$06:$ABCC:AD 01 70 LDA $7001 ; Don Mahone quest status (#$00 = not started, #$01 = ingredients delivered, #$03 = game loaded after ingredients delivered), SRAM buffer 0x01ABDF|$06:$ABCF:F0 02 BEQ $ABD3 0x01ABE1|$06:$ABD1:A9 03 LDA #$03 ; control flow target (from $ABCF) 0x01ABE3|$06:$ABD3:85 CD STA $CD ; Don Mahone quest status (#$00 = not started, #$01 = ingredients delivered, #$03 = game loaded after ingredients delivered) 0x01ABE5|$06:$ABD5:AD 02 70 LDA $7002 ; Tuhn Watergate open flag (#$00 = closed, #$01 = open), SRAM buffer 0x01ABE8|$06:$ABD8:85 CE STA $CE ; Tuhn Watergate open flag (#$00 = closed, #$01 = open) 0x01ABEA|$06:$ABDA:AD 03 70 LDA $7003 ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x01ABED|$06:$ABDD:85 CF STA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x01ABEF|$06:$ABDF:AD 04 70 LDA $7004 ; Sea Cave shoal status (#$00 = shoals up, others = shoals down), SRAM buffer 0x01ABF2|$06:$ABE2:8D F8 05 STA $05F8 ; Sea Cave shoal status (#$00 = shoals up, others = shoals down) 0x01ABF5|$06:$ABE5:AD 05 70 LDA $7005 ; Crests found bit field, SRAM buffer 0x01ABF8|$06:$ABE8:8D 12 01 STA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x01ABFB|$06:$ABEB:AD 06 70 LDA $7006 ; last save point ID, SRAM buffer 0x01ABFE|$06:$ABEE:8D 48 00 STA $0048 ; last save point ID 0x01AC01|$06:$ABF1:AD 07 70 LDA $7007 ; party gold, low byte, SRAM buffer 0x01AC04|$06:$ABF4:8D 24 06 STA $0624 ; party gold, low byte 0x01AC07|$06:$ABF7:AD 08 70 LDA $7008 ; party gold, high byte, SRAM buffer 0x01AC0A|$06:$ABFA:8D 25 06 STA $0625 ; party gold, high byte 0x01AC0D|$06:$ABFD:A2 35 LDX #$35 ; control flow target (from $AC06) 0x01AC0F|$06:$ABFF:BD 15 70 LDA $7015,X ; hero data from $062D, SRAM buffer 0x01AC12|$06:$AC02:9D 2D 06 STA $062D,X ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01AC15|$06:$AC05:CA DEX 0x01AC16|$06:$AC06:10 F7 BPL $ABFF 0x01AC18|$06:$AC08:A2 17 LDX #$17 ; control flow target (from $AC11) 0x01AC1A|$06:$AC0A:BD 4B 70 LDA $704B,X ; party inventory, SRAM buffer 0x01AC1D|$06:$AC0D:9D 00 06 STA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x01AC20|$06:$AC10:CA DEX 0x01AC21|$06:$AC11:10 F7 BPL $AC0A 0x01AC23|$06:$AC13:A2 03 LDX #$03 ; control flow target (from $AC28) 0x01AC25|$06:$AC15:BD 09 70 LDA $7009,X ; Midenhall name bytes 0-3, SRAM buffer 0x01AC28|$06:$AC18:9D 13 01 STA $0113,X ; Midenhall name bytes 0-3 + terminator 0x01AC2B|$06:$AC1B:BD 0D 70 LDA $700D,X ; Cannock name bytes 0-3, SRAM buffer 0x01AC2E|$06:$AC1E:9D 18 01 STA $0118,X ; Cannock name bytes 0-3 + terminator 0x01AC31|$06:$AC21:BD 11 70 LDA $7011,X ; Moonbrooke name bytes 0-3, SRAM buffer 0x01AC34|$06:$AC24:9D 1D 01 STA $011D,X ; Moonbrooke name bytes 0-3 + terminator 0x01AC37|$06:$AC27:CA DEX 0x01AC38|$06:$AC28:10 EB BPL $AC15 0x01AC3A|$06:$AC2A:A2 0B LDX #$0B ; control flow target (from $AC33) 0x01AC3C|$06:$AC2C:BD 63 70 LDA $7063,X ; party names, bytes 4-7, SRAM buffer 0x01AC3F|$06:$AC2F:9D 86 01 STA $0186,X ; Midenhall name bytes 4-7 0x01AC42|$06:$AC32:CA DEX 0x01AC43|$06:$AC33:10 F7 BPL $AC2C 0x01AC45|$06:$AC35:AD 6F 70 LDA $706F ; current battle message delay, SRAM buffer 0x01AC48|$06:$AC38:8D 2C 06 STA $062C ; current battle message delay 0x01AC4B|$06:$AC3B:60 RTS ; copy save data from system RAM to $7000-$706F ; control flow target (from $A885) 0x01AC4C|$06:$AC3C: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) 0x01AC4E|$06:$AC3E:8D 00 70 STA $7000 ; 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), SRAM buffer 0x01AC51|$06:$AC41:A5 CD LDA $CD ; Don Mahone quest status (#$00 = not started, #$01 = ingredients delivered, #$03 = game loaded after ingredients delivered) 0x01AC53|$06:$AC43:8D 01 70 STA $7001 ; Don Mahone quest status (#$00 = not started, #$01 = ingredients delivered, #$03 = game loaded after ingredients delivered), SRAM buffer 0x01AC56|$06:$AC46:A5 CE LDA $CE ; Tuhn Watergate open flag (#$00 = closed, #$01 = open) 0x01AC58|$06:$AC48:8D 02 70 STA $7002 ; Tuhn Watergate open flag (#$00 = closed, #$01 = open), SRAM buffer 0x01AC5B|$06:$AC4B:A5 CF LDA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x01AC5D|$06:$AC4D:8D 03 70 STA $7003 ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x01AC60|$06:$AC50:AD F8 05 LDA $05F8 ; Sea Cave shoal status (#$00 = shoals up, others = shoals down) 0x01AC63|$06:$AC53:8D 04 70 STA $7004 ; Sea Cave shoal status (#$00 = shoals up, others = shoals down), SRAM buffer 0x01AC66|$06:$AC56:AD 12 01 LDA $0112 ; Crests found bit field (#$10 = Life, #$80 = Water, #$04 = Moon, #$02 = Stars, #$01 = Sun) 0x01AC69|$06:$AC59:8D 05 70 STA $7005 ; Crests found bit field, SRAM buffer 0x01AC6C|$06:$AC5C:AD 48 00 LDA $0048 ; last save point ID 0x01AC6F|$06:$AC5F:8D 06 70 STA $7006 ; last save point ID, SRAM buffer 0x01AC72|$06:$AC62:AD 24 06 LDA $0624 ; party gold, low byte 0x01AC75|$06:$AC65:8D 07 70 STA $7007 ; party gold, low byte, SRAM buffer 0x01AC78|$06:$AC68:AD 25 06 LDA $0625 ; party gold, high byte 0x01AC7B|$06:$AC6B:8D 08 70 STA $7008 ; party gold, high byte, SRAM buffer 0x01AC7E|$06:$AC6E:A2 35 LDX #$35 ; control flow target (from $AC77) 0x01AC80|$06:$AC70:BD 2D 06 LDA $062D,X ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01AC83|$06:$AC73:9D 15 70 STA $7015,X ; hero data from $062D, SRAM buffer 0x01AC86|$06:$AC76:CA DEX 0x01AC87|$06:$AC77:10 F7 BPL $AC70 0x01AC89|$06:$AC79:A2 17 LDX #$17 ; control flow target (from $AC82) 0x01AC8B|$06:$AC7B:BD 00 06 LDA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x01AC8E|$06:$AC7E:9D 4B 70 STA $704B,X ; party inventory, SRAM buffer 0x01AC91|$06:$AC81:CA DEX 0x01AC92|$06:$AC82:10 F7 BPL $AC7B 0x01AC94|$06:$AC84:A2 03 LDX #$03 ; control flow target (from $AC99) 0x01AC96|$06:$AC86:BD 13 01 LDA $0113,X ; Midenhall name bytes 0-3 + terminator 0x01AC99|$06:$AC89:9D 09 70 STA $7009,X ; Midenhall name bytes 0-3, SRAM buffer 0x01AC9C|$06:$AC8C:BD 18 01 LDA $0118,X ; Cannock name bytes 0-3 + terminator 0x01AC9F|$06:$AC8F:9D 0D 70 STA $700D,X ; Cannock name bytes 0-3, SRAM buffer 0x01ACA2|$06:$AC92:BD 1D 01 LDA $011D,X ; Moonbrooke name bytes 0-3 + terminator 0x01ACA5|$06:$AC95:9D 11 70 STA $7011,X ; Moonbrooke name bytes 0-3, SRAM buffer 0x01ACA8|$06:$AC98:CA DEX 0x01ACA9|$06:$AC99:10 EB BPL $AC86 0x01ACAB|$06:$AC9B:A2 0B LDX #$0B ; control flow target (from $ACA4) 0x01ACAD|$06:$AC9D:BD 86 01 LDA $0186,X ; Midenhall name bytes 4-7 0x01ACB0|$06:$ACA0:9D 63 70 STA $7063,X ; party names, bytes 4-7, SRAM buffer 0x01ACB3|$06:$ACA3:CA DEX 0x01ACB4|$06:$ACA4:10 F7 BPL $AC9D 0x01ACB6|$06:$ACA6:AD 2C 06 LDA $062C ; current battle message delay 0x01ACB9|$06:$ACA9:8D 6F 70 STA $706F ; current battle message delay, SRAM buffer 0x01ACBC|$06:$ACAC:60 RTS ; initialize the RNG based on 71 passes using SRAM data $7000-$7070 and save resulting seed to $7071-$7072 ; control flow target (from $A888, $AA87, $AAB4) 0x01ACBD|$06:$ACAD:20 BB AC JSR $ACBB ; initialize the RNG based on 71 passes using SRAM data $7000-$7070 0x01ACC0|$06:$ACB0:A5 32 LDA $32 ; RNG byte 0 0x01ACC2|$06:$ACB2:8D 71 70 STA $7071 ; RNG byte 0, SRAM buffer 0x01ACC5|$06:$ACB5:A5 33 LDA $33 ; RNG byte 1 0x01ACC7|$06:$ACB7:8D 72 70 STA $7072 ; RNG byte 1, SRAM buffer 0x01ACCA|$06:$ACBA:60 RTS ; initialize the RNG based on 71 passes using SRAM data $7000-$7070 ; control flow target (from $AB56, $ACAD) 0x01ACCB|$06:$ACBB:A2 70 LDX #$70 0x01ACCD|$06:$ACBD:86 32 STX $32 ; RNG byte 0 0x01ACCF|$06:$ACBF:86 33 STX $33 ; RNG byte 1 ; control flow target (from $ACCA) 0x01ACD1|$06:$ACC1:BD 00 70 LDA $7000,X ; 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), SRAM buffer 0x01ACD4|$06:$ACC4:85 0C STA $0C ; call to code in a different bank ($0F:$C3B6) 0x01ACD6|$06:$ACC6:20 B6 C3 JSR $C3B6 ; generate a random number and store it in $32-$33 (one pass) 0x01ACD9|$06:$ACC9:CA DEX 0x01ACDA|$06:$ACCA:10 F5 BPL $ACC1 0x01ACDC|$06:$ACCC:60 RTS ; control flow target (from $AA9B) 0x01ACDD|$06:$ACCD:20 86 AE JSR $AE86 0x01ACE0|$06:$ACD0:A2 03 LDX #$03 ; save Midenhall's name ; control flow target (from $ACE5) 0x01ACE2|$06:$ACD2:BD 04 01 LDA $0104,X 0x01ACE5|$06:$ACD5:9D 63 70 STA $7063,X ; party names, bytes 4-7, SRAM buffer 0x01ACE8|$06:$ACD8:9D 86 01 STA $0186,X ; Midenhall name bytes 4-7 0x01ACEB|$06:$ACDB:BD 00 01 LDA $0100,X ; string copy buffer start (often referenced as $00FF,X) 0x01ACEE|$06:$ACDE:9D 09 70 STA $7009,X ; Midenhall name bytes 0-3, SRAM buffer 0x01ACF1|$06:$ACE1:9D 13 01 STA $0113,X ; Midenhall name bytes 0-3 + terminator 0x01ACF4|$06:$ACE4:CA DEX 0x01ACF5|$06:$ACE5:10 EB BPL $ACD2 0x01ACF7|$06:$ACE7:20 EB AC JSR $ACEB ; generate and save Cannock/Moonbrooke's names 0x01ACFA|$06:$ACEA:60 RTS ; generate and save Cannock/Moonbrooke's names ; control flow target (from $ACE7) 0x01ACFB|$06:$ACEB:A9 00 LDA #$00 0x01ACFD|$06:$ACED:A2 03 LDX #$03 0x01ACFF|$06:$ACEF:18 CLC ; control flow target (from $ACF7) 0x01AD00|$06:$ACF0:7D 09 70 ADC $7009,X ; Midenhall name bytes 0-3, SRAM buffer; first 4 characters of Midenhall's name 0x01AD03|$06:$ACF3:7D 63 70 ADC $7063,X ; party names, bytes 4-7, SRAM buffer; last 4 characters of Midenhall's name 0x01AD06|$06:$ACF6:CA DEX 0x01AD07|$06:$ACF7:10 F7 BPL $ACF0 0x01AD09|$06:$ACF9:48 PHA 0x01AD0A|$06:$ACFA:29 07 AND #$07 ; Cannock's name is based on bits 0-2 of the sum of Midenhall's name 0x01AD0C|$06:$ACFC:0A ASL ; << 3 since names are 8 bytes long 0x01AD0D|$06:$ACFD:0A ASL 0x01AD0E|$06:$ACFE:0A ASL 0x01AD0F|$06:$ACFF:AA TAX 0x01AD10|$06:$AD00:A0 00 LDY #$00 ; save Cannock's name ; control flow target (from $AD18) 0x01AD12|$06:$AD02:BD 39 AD LDA $AD39,X ; Prince of Cannock Names, first 4 bytes; pointer to list of Cannock names, starting at 0th byte 0x01AD15|$06:$AD05:99 0D 70 STA $700D,Y ; Cannock name bytes 0-3, SRAM buffer; store the first 4 characters in SRAM 0x01AD18|$06:$AD08:99 18 01 STA $0118,Y ; Cannock name bytes 0-3 + terminator; store the first 4 characters in RAM 0x01AD1B|$06:$AD0B:BD 3D AD LDA $AD3D,X ; Prince of Cannock Names, last 4 bytes; pointer to list of Cannock names, starting at 4th byte 0x01AD1E|$06:$AD0E:99 67 70 STA $7067,Y ; store the last 4 characters in SRAM 0x01AD21|$06:$AD11:99 8A 01 STA $018A,Y ; Cannock name bytes 4-7; store the last 4 characters in RAM 0x01AD24|$06:$AD14:E8 INX 0x01AD25|$06:$AD15:C8 INY 0x01AD26|$06:$AD16:C0 04 CPY #$04 0x01AD28|$06:$AD18:D0 E8 BNE $AD02 0x01AD2A|$06:$AD1A:68 PLA 0x01AD2B|$06:$AD1B:29 38 AND #$38 ; Moonbrooke's name is based on bits 3-6 of the sum of Midenhall's name 0x01AD2D|$06:$AD1D:AA TAX 0x01AD2E|$06:$AD1E:A0 00 LDY #$00 ; save Moonbrooke's name ; control flow target (from $AD36) 0x01AD30|$06:$AD20:BD 79 AD LDA $AD79,X ; Princess of Moonbrooke Names, first 4 bytes; pointer to list of Moonbrooke names, starting at 0th byte 0x01AD33|$06:$AD23:99 11 70 STA $7011,Y ; Moonbrooke name bytes 0-3, SRAM buffer; store the first 4 characters in SRAM 0x01AD36|$06:$AD26:99 1D 01 STA $011D,Y ; Moonbrooke name bytes 0-3 + terminator; store the first 4 characters in RAM 0x01AD39|$06:$AD29:BD 7D AD LDA $AD7D,X ; Princess of Moonbrooke Names, last 4 bytes; pointer to list of Moonbrooke names, starting at 0th byte 0x01AD3C|$06:$AD2C:99 6B 70 STA $706B,Y ; store the last 4 characters in SRAM 0x01AD3F|$06:$AD2F:99 8E 01 STA $018E,Y ; Moonbrooke name bytes 4-7; store the last 4 characters in RAM 0x01AD42|$06:$AD32:E8 INX 0x01AD43|$06:$AD33:C8 INY 0x01AD44|$06:$AD34:C0 04 CPY #$04 0x01AD46|$06:$AD36:D0 E8 BNE $AD20 0x01AD48|$06:$AD38:60 RTS ; code -> data ; Prince of Cannock Names, first 4 bytes ; indexed data load target (from $AD02) 0x01AD49|$06:$AD39:25 1B 0A 17 ; Prince of Cannock Names, last 4 bytes ; indexed data load target (from $AD0B) 0x01AD4D|$06:$AD3D: 5F 5F 5F 5F ; "Bran " 0x01AD51|$06:$AD41:2A 15 22 17 17 5F 5F 5F ; "Glynn " 0x01AD59|$06:$AD49:37 0A 15 12 17 1D 5F 5F ; "Talint " 0x01AD61|$06:$AD51:31 1E 16 18 1B 5F 5F 5F ; "Numor " 0x01AD69|$06:$AD59:2F 0A 1B 1C 5F 5F 5F 5F ; "Lars " 0x01AD71|$06:$AD61:32 1B 0F 0E 18 5F 5F 5F ; "Orfeo " 0x01AD79|$06:$AD69:24 1B 1D 11 18 5F 5F 5F ; "Artho " 0x01AD81|$06:$AD71:28 1C 10 0A 1B 5F 5F 5F ; "Esgar " ; Princess of Moonbrooke Names, first 4 bytes ; indexed data load target (from $AD20) 0x01AD89|$06:$AD79:39 0A 1B 12 ; Princess of Moonbrooke Names, last 4 bytes ; indexed data load target (from $AD29) 0x01AD8D|$06:$AD7D: 0A 5F 5F 5F ; "Varia " 0x01AD91|$06:$AD81:28 15 0A 17 12 5F 5F 5F ; "Elani " 0x01AD99|$06:$AD89:32 15 15 12 1C 0A 5F 5F ; "Ollisa " 0x01ADA1|$06:$AD91:35 18 23 5F 5F 5F 5F 5F ; "Roz " 0x01ADA9|$06:$AD99:2E 0A 12 15 12 17 5F 5F ; "Kailin " 0x01ADB1|$06:$ADA1:33 0E 1D 0A 5F 5F 5F 5F ; "Peta " 0x01ADB9|$06:$ADA9:2C 15 15 22 1D 11 5F 5F ; "Illyth " 0x01ADC1|$06:$ADB1:2A 20 0E 17 5F 5F 5F 5F ; "Gwen " ; indexed data load target (from $A8CC, $A91B) 0x01ADC9|$06:$ADB9:44 51 32 55 53 41 ; battle message delays (frames between prints; higher = slower) ; indexed data load target (from $AA7E) 0x01ADCF|$06:$ADBF:28 ; 40 frames 0x01ADD0|$06:$ADC0:46 ; 70 frames 0x01ADD1|$06:$ADC1:FF ; 255 frames ; lookup table for save game slot based on save game slot selection type + menu selection index ; only slot 0 ; indexed data load target (from $AB28) 0x01ADD2|$06:$ADC2:00 ; slot 0 0x01ADD3|$06:$ADC3:00 ; (impossible) 0x01ADD4|$06:$ADC4:00 ; (impossible) ; only slot 1 0x01ADD5|$06:$ADC5:01 ; slot 1 0x01ADD6|$06:$ADC6:00 ; (impossible) 0x01ADD7|$06:$ADC7:00 ; (impossible) ; slots 0 and 1 0x01ADD8|$06:$ADC8:00 ; slot 0 0x01ADD9|$06:$ADC9:01 ; slot 1 0x01ADDA|$06:$ADCA:00 ; (impossible) ; only slot 2 0x01ADDB|$06:$ADCB:02 ; slot 2 0x01ADDC|$06:$ADCC:00 ; (impossible) 0x01ADDD|$06:$ADCD:00 ; (impossible) ; slots 0 and 2 0x01ADDE|$06:$ADCE:00 ; slot 0 0x01ADDF|$06:$ADCF:02 ; slot 2 0x01ADE0|$06:$ADD0:00 ; (impossible) ; slots 1 and 2 0x01ADE1|$06:$ADD1:01 ; slot 1 0x01ADE2|$06:$ADD2:02 ; slot 2 0x01ADE3|$06:$ADD3:00 ; (impossible) ; all 3 slots 0x01ADE4|$06:$ADD4:00 ; slot 0 0x01ADE5|$06:$ADD5:01 ; slot 1 0x01ADE6|$06:$ADD6:02 ; slot 2 ; index into jump table at $ADE2 ; indexed data load target (from $A9D4) 0x01ADE7|$06:$ADD7:00 ; CONTINUE A QUEST 0x01ADE8|$06:$ADD8:01 ; CHANGE MESSAGE SPEED 0x01ADE9|$06:$ADD9:04 ; ERASE A QUEST 0x01ADEA|$06:$ADDA:00 ; (impossible) 0x01ADEB|$06:$ADDB:00 ; (impossible) 0x01ADEC|$06:$ADDC:00 ; CONTINUE A QUEST 0x01ADED|$06:$ADDD:01 ; CHANGE MESSAGE SPEED 0x01ADEE|$06:$ADDE:02 ; BEGIN A NEW QUEST 0x01ADEF|$06:$ADDF:03 ; COPY A QUEST 0x01ADF0|$06:$ADE0:04 ; ERASE A QUEST 0x01ADF1|$06:$ADE1:02 ; BEGIN A NEW QUEST ; jump table for main game menu handlers ; indexed data load target (from $A9D9) 0x01ADF2|$06:$ADE2:55 ; indexed data load target (from $A9DE) 0x01ADF3|$06:$ADE3: AA ; $06:$AA55; CONTINUE A QUEST handler 0x01ADF4|$06:$ADE4:64 AA ; $06:$AA64; CHANGE MESSAGE SPEED handler 0x01ADF6|$06:$ADE6:93 AA ; $06:$AA93; BEGIN A NEW QUEST handler 0x01ADF8|$06:$ADE8:CA AA ; $06:$AACA; COPY A QUEST handler 0x01ADFA|$06:$ADEA:DD AA ; $06:$AADD; ERASE A QUEST handler ; pointer to start of current game save data buffer ; data load target (from $AB9F) 0x01ADFC|$06:$ADEC:00 ; data load target (from $ABA4) 0x01ADFD|$06:$ADED: 70 ; $7000; 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), SRAM buffer ; pointers to start of per-game save data ; indexed data load target (from $AB95) 0x01ADFE|$06:$ADEE:73 ; indexed data load target (from $AB9A) 0x01ADFF|$06:$ADEF: 70 ; $7073; start of save game 1 backup #1 0x01AE00|$06:$ADF0:E6 70 ; $70E6; start of save game 1 backup #2 0x01AE02|$06:$ADF2:59 71 ; $7159; start of save game 1 backup #3 ; data load target (from $A8E3) 0x01AE04|$06:$ADF4:64 ; data load target (from $A8E9) 0x01AE05|$06:$ADF5: 75 ; $7564 ; indexed data load target (from $A9F7) 0x01AE06|$06:$ADF6:DC ; indexed data load target (from $A9FC) 0x01AE07|$06:$ADF7: 75 ; $75DC 0x01AE08|$06:$ADF8:E6 75 ; $75E6 0x01AE0A|$06:$ADFA:F0 75 ; $75F0 ; data -> code ; 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 ; from $0F:$F4E6, $0F:$F5E4, $0F:$F614 via $8010 ; indirect control flow target (via $8010) 0x01AE0C|$06:$ADFC:C9 FE CMP #$FE 0x01AE0E|$06:$ADFE:B0 2F BCS $AE2F ; A >= #$FE => just RTS 0x01AE10|$06:$AE00:8E 9D 60 STX $609D ; menu function parameter 0x01AE13|$06:$AE03:85 10 STA $10 ; selected item index ; call to code in a different bank ($0F:$F1B0) 0x01AE15|$06:$AE05: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 0x01AE18|$06:$AE08:A0 08 LDY #$08 0x01AE1A|$06:$AE0A:8C AA 60 STY $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 $AE1E) 0x01AE1D|$06:$AE0D:BD 00 06 LDA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) ; call to code in a different bank ($0F:$F1D6) 0x01AE20|$06:$AE10: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) 0x01AE23|$06:$AE13:CD 9D 60 CMP $609D ; menu function parameter 0x01AE26|$06:$AE16:D0 04 BNE $AE1C ; if it's not the right type of item, it doesn't count 0x01AE28|$06:$AE18:C6 10 DEC $10 ; otherwise it does! 0x01AE2A|$06:$AE1A:30 08 BMI $AE24 ; branch if we've found the right item ; control flow target (from $AE16) 0x01AE2C|$06:$AE1C:E8 INX ; increment inventory index 0x01AE2D|$06:$AE1D:88 DEY ; decrement inventory counter 0x01AE2E|$06:$AE1E:D0 ED BNE $AE0D ; if more inventory slots to check, check them 0x01AE30|$06:$AE20:A9 00 LDA #$00 ; if item not found, set A = X = #$00 0x01AE32|$06:$AE22:AA TAX 0x01AE33|$06:$AE23:60 RTS ; control flow target (from $AE1A) 0x01AE34|$06:$AE24:BD 00 06 LDA $0600,X ; Midenhall inventory item 1 (| #$40 if equipped) 0x01AE37|$06:$AE27:48 PHA 0x01AE38|$06:$AE28:8A TXA ; X = X mod 8 0x01AE39|$06:$AE29:29 07 AND #$07 0x01AE3B|$06:$AE2B:AA TAX 0x01AE3C|$06:$AE2C:68 PLA 0x01AE3D|$06:$AE2D:29 3F AND #$3F ; strip off the equipped bit ; control flow target (from $ADFE) 0x01AE3F|$06:$AE2F:60 RTS ; given hero ID - 1 in $4A and field spell menu selection index in A, return spell ID in A ; from $0F:$F5FA via $8012 ; indirect control flow target (via $8012) 0x01AE40|$06:$AE30:06 4A ASL $4A ; convert hero ID - 1 to spell list start index; 8 spells per hero 0x01AE42|$06:$AE32:06 4A ASL $4A 0x01AE44|$06:$AE34:06 4A ASL $4A ; add list start offset to spell menu selection index 0x01AE46|$06:$AE36:65 4A ADC $4A 0x01AE48|$06:$AE38:AA TAX 0x01AE49|$06:$AE39:BD 66 AE LDA $AE66,X ; Cannock field spell list 0x01AE4C|$06:$AE3C:60 RTS ; given hero ID - 1 in $4A and battle spell menu selection index in A, return spell ID in A ; from $0F:$F4AC via $8014 ; indirect control flow target (via $8014) 0x01AE4D|$06:$AE3D:06 4A ASL $4A ; convert hero ID - 1 to spell list start index; 8 spells per hero 0x01AE4F|$06:$AE3F:06 4A ASL $4A 0x01AE51|$06:$AE41:06 4A ASL $4A ; add list start offset to spell menu selection index 0x01AE53|$06:$AE43:65 4A ADC $4A 0x01AE55|$06:$AE45:AA TAX 0x01AE56|$06:$AE46:BD 76 AE LDA $AE76,X ; Cannock battle spell list 0x01AE59|$06:$AE49:60 RTS ; given spell ID in A, set A to spell name index ; from $02:$BEA4 via $8020 ; indirect control flow target (via $8020) 0x01AE5A|$06:$AE4A:AA TAX 0x01AE5B|$06:$AE4B:BD 4E AE LDA $AE4E,X ; indexed data load target (from $AE4B) 0x01AE5E|$06:$AE4E:60 RTS ; code -> data ; spell ID -> spell name index (built in offset from $AE4F) 0x01AE5F|$06:$AE4F:00 ; Spell ID #$00: (no spell) 0x01AE60|$06:$AE50:10 ; Spell ID #$01: Firebal 0x01AE61|$06:$AE51:04 ; Spell ID #$02: Sleep 0x01AE62|$06:$AE52:06 ; Spell ID #$03: Firebane 0x01AE63|$06:$AE53:12 ; Spell ID #$04: Defeat 0x01AE64|$06:$AE54:02 ; Spell ID #$05: Infernos 0x01AE65|$06:$AE55:14 ; Spell ID #$06: Stopspell 0x01AE66|$06:$AE56:13 ; Spell ID #$07: Surround 0x01AE67|$06:$AE57:08 ; Spell ID #$08: Defence 0x01AE68|$06:$AE58:05 ; Spell ID #$09: Heal 0x01AE69|$06:$AE59:18 ; Spell ID #$0A: Increase 0x01AE6A|$06:$AE5A:07 ; Spell ID #$0B: Healmore 0x01AE6B|$06:$AE5B:1B ; Spell ID #$0C: Sacrifice 0x01AE6C|$06:$AE5C:16 ; Spell ID #$0D: Healall 0x01AE6D|$06:$AE5D:17 ; Spell ID #$0E: Explodet 0x01AE6E|$06:$AE5E:1A ; Spell ID #$0F: Chance 0x01AE6F|$06:$AE5F:08 ; Spell ID #$10: Antidote 0x01AE70|$06:$AE60:1C ; Spell ID #$11: Heal (not used by heroes) 0x01AE71|$06:$AE61:19 ; Spell ID #$12: Outside 0x01AE72|$06:$AE62:0A ; Spell ID #$13: Repel 0x01AE73|$06:$AE63:1E ; Spell ID #$14: Return 0x01AE74|$06:$AE64:0D ; Spell ID #$15: Open 0x01AE75|$06:$AE65:0E ; Cannock field spell list ; indexed data load target (from $AE39) 0x01AE76|$06:$AE66:09 ; Spell ID #$09: Heal 0x01AE77|$06:$AE67:10 ; Spell ID #$10: Antidote 0x01AE78|$06:$AE68:14 ; Spell ID #$14: Return 0x01AE79|$06:$AE69:12 ; Spell ID #$12: Outside 0x01AE7A|$06:$AE6A:0B ; Spell ID #$0B: Healmore 0x01AE7B|$06:$AE6B:16 ; Spell ID #$16: Stepguard 0x01AE7C|$06:$AE6C:17 ; Spell ID #$17: Revive 0x01AE7D|$06:$AE6D:00 ; Spell ID #$00: (no spell) ; Moonbrooke field spell list 0x01AE7E|$06:$AE6E:0B ; Spell ID #$0B: Healmore 0x01AE7F|$06:$AE6F:13 ; Spell ID #$13: Repel 0x01AE80|$06:$AE70:10 ; Spell ID #$10: Antidote 0x01AE81|$06:$AE71:0D ; Spell ID #$0D: Healall 0x01AE82|$06:$AE72:12 ; Spell ID #$12: Outside 0x01AE83|$06:$AE73:16 ; Spell ID #$16: Stepguard 0x01AE84|$06:$AE74:15 ; Spell ID #$15: Open 0x01AE85|$06:$AE75:00 ; Spell ID #$00: (no spell) ; Cannock battle spell list ; indexed data load target (from $AE46) 0x01AE86|$06:$AE76:01 ; Spell ID #$01: Firebal 0x01AE87|$06:$AE77:09 ; Spell ID #$09: Heal 0x01AE88|$06:$AE78:06 ; Spell ID #$06: Stopspell 0x01AE89|$06:$AE79:0B ; Spell ID #$0B: Healmore 0x01AE8A|$06:$AE7A:03 ; Spell ID #$03: Firebane 0x01AE8B|$06:$AE7B:0A ; Spell ID #$0A: Increase 0x01AE8C|$06:$AE7C:04 ; Spell ID #$04: Defeat 0x01AE8D|$06:$AE7D:0C ; Spell ID #$0C: Sacrifice ; Moonbrooke battle spell list 0x01AE8E|$06:$AE7E:02 ; Spell ID #$02: Sleep 0x01AE8F|$06:$AE7F:0B ; Spell ID #$0B: Healmore 0x01AE90|$06:$AE80:05 ; Spell ID #$05: Infernos 0x01AE91|$06:$AE81:08 ; Spell ID #$08: Defence 0x01AE92|$06:$AE82:07 ; Spell ID #$07: Surround 0x01AE93|$06:$AE83:0D ; Spell ID #$0D: Healall 0x01AE94|$06:$AE84:0E ; Spell ID #$0E: Explodet 0x01AE95|$06:$AE85:0F ; Spell ID #$0F: Chance ; data -> code ; control flow target (from $ACCD) ; indirect control flow target (via $8016) 0x01AE96|$06:$AE86:20 9E AE JSR $AE9E 0x01AE99|$06:$AE89:20 56 AF JSR $AF56 0x01AE9C|$06:$AE8C:20 7F AF JSR $AF7F ; control flow target (from $AE9A) 0x01AE9F|$06:$AE8F:20 CC AE JSR $AECC 0x01AEA2|$06:$AE92:20 30 AF JSR $AF30 0x01AEA5|$06:$AE95:B0 06 BCS $AE9D 0x01AEA7|$06:$AE97:20 8E AF JSR $AF8E 0x01AEAA|$06:$AE9A:4C 8F AE JMP $AE8F ; control flow target (from $AE95) 0x01AEAD|$06:$AE9D:60 RTS ; control flow target (from $AE86) 0x01AEAE|$06:$AE9E:A9 FF LDA #$FF 0x01AEB0|$06:$AEA0:85 8E STA $8E ; flag for in battle or not (#$FF)? 0x01AEB2|$06:$AEA2:A9 00 LDA #$00 0x01AEB4|$06:$AEA4:8D C2 60 STA $60C2 0x01AEB7|$06:$AEA7:8D C3 60 STA $60C3 0x01AEBA|$06:$AEAA:A9 47 LDA #$47 ; Menu ID #$47: Game menu: new game name entry display ; call to code in a different bank ($0F:$EB89) 0x01AEBC|$06:$AEAC:20 89 EB JSR $EB89 ; open menu specified by A 0x01AEBF|$06:$AEAF:A9 44 LDA #$44 ; Menu ID #$44: Game menu: new game name input area ; call to code in a different bank ($0F:$EB89) 0x01AEC1|$06:$AEB1:20 89 EB JSR $EB89 ; open menu specified by A ; call to code in a different bank ($0F:$C22C) 0x01AEC4|$06:$AEB4:20 2C C2 JSR $C22C 0x01AEC7|$06:$AEB7:A9 12 LDA #$12 0x01AEC9|$06:$AEB9:8D A5 60 STA $60A5 ; menu cursor second column X-offset (from left edge of menu) 0x01AECC|$06:$AEBC:A9 21 LDA #$21 0x01AECE|$06:$AEBE:8D A9 60 STA $60A9 ; menu cursor initial position (from ROM; X-pos = low nybble, Y-pos = high nybble) 0x01AED1|$06:$AEC1:A9 60 LDA #$60 0x01AED3|$06:$AEC3:A2 0C LDX #$0C ; control flow target (from $AEC9) 0x01AED5|$06:$AEC5:9D 00 01 STA $0100,X ; string copy buffer start (often referenced as $00FF,X) 0x01AED8|$06:$AEC8:CA DEX 0x01AED9|$06:$AEC9:10 FA BPL $AEC5 0x01AEDB|$06:$AECB:60 RTS ; control flow target (from $AE8F) 0x01AEDC|$06:$AECC:C9 FF CMP #$FF 0x01AEDE|$06:$AECE:F0 35 BEQ $AF05 0x01AEE0|$06:$AED0:C9 1A CMP #$1A 0x01AEE2|$06:$AED2:90 1B BCC $AEEF 0x01AEE4|$06:$AED4:C9 21 CMP #$21 0x01AEE6|$06:$AED6:90 21 BCC $AEF9 0x01AEE8|$06:$AED8:C9 3B CMP #$3B 0x01AEEA|$06:$AEDA:90 18 BCC $AEF4 0x01AEEC|$06:$AEDC:C9 3D CMP #$3D 0x01AEEE|$06:$AEDE:90 1F BCC $AEFF 0x01AEF0|$06:$AEE0:C9 3D CMP #$3D 0x01AEF2|$06:$AEE2:F0 21 BEQ $AF05 0x01AEF4|$06:$AEE4:20 46 AF JSR $AF46 ; CLC if $0100-$0103 are all #$60, SEC otherwise 0x01AEF7|$06:$AEE7:90 05 BCC $AEEE 0x01AEF9|$06:$AEE9:A9 08 LDA #$08 0x01AEFB|$06:$AEEB:8D C2 60 STA $60C2 ; control flow target (from $AEE7) 0x01AEFE|$06:$AEEE:60 RTS ; control flow target (from $AED2) 0x01AEFF|$06:$AEEF:18 CLC 0x01AF00|$06:$AEF0:69 24 ADC #$24 0x01AF02|$06:$AEF2:D0 20 BNE $AF14 ; control flow target (from $AEDA) 0x01AF04|$06:$AEF4:38 SEC 0x01AF05|$06:$AEF5:E9 17 SBC #$17 0x01AF07|$06:$AEF7:D0 1B BNE $AF14 ; control flow target (from $AED6) 0x01AF09|$06:$AEF9:AA TAX 0x01AF0A|$06:$AEFA:BD 5C AF LDA $AF5C,X 0x01AF0D|$06:$AEFD:D0 15 BNE $AF14 ; control flow target (from $AEDE) 0x01AF0F|$06:$AEFF:AA TAX ; A is either #$3B or #$3C 0x01AF10|$06:$AF00:BD 42 AF LDA $AF42,X ; $AF7D or $AF7E 0x01AF13|$06:$AF03:D0 0F BNE $AF14 ; control flow target (from $AECE, $AEE2) 0x01AF15|$06:$AF05:AD C2 60 LDA $60C2 0x01AF18|$06:$AF08:F0 09 BEQ $AF13 0x01AF1A|$06:$AF0A:20 5A AF JSR $AF5A 0x01AF1D|$06:$AF0D:CE C2 60 DEC $60C2 0x01AF20|$06:$AF10:20 56 AF JSR $AF56 ; control flow target (from $AF08) 0x01AF23|$06:$AF13:60 RTS ; control flow target (from $AEF2, $AEF7, $AEFD, $AF03) 0x01AF24|$06:$AF14:48 PHA 0x01AF25|$06:$AF15:20 5A AF JSR $AF5A 0x01AF28|$06:$AF18:68 PLA 0x01AF29|$06:$AF19:AE C2 60 LDX $60C2 0x01AF2C|$06:$AF1C:9D 00 01 STA $0100,X ; string copy buffer start (often referenced as $00FF,X) 0x01AF2F|$06:$AF1F:20 60 AF JSR $AF60 0x01AF32|$06:$AF22:EE C2 60 INC $60C2 0x01AF35|$06:$AF25:AD C2 60 LDA $60C2 0x01AF38|$06:$AF28:C9 08 CMP #$08 0x01AF3A|$06:$AF2A:B0 03 BCS $AF2F 0x01AF3C|$06:$AF2C:20 56 AF JSR $AF56 ; control flow target (from $AF2A) 0x01AF3F|$06:$AF2F:60 RTS ; control flow target (from $AE92) 0x01AF40|$06:$AF30:AD C2 60 LDA $60C2 0x01AF43|$06:$AF33:C9 08 CMP #$08 0x01AF45|$06:$AF35:90 0E BCC $AF45 0x01AF47|$06:$AF37:20 46 AF JSR $AF46 ; CLC if $0100-$0103 are all #$60, SEC otherwise 0x01AF4A|$06:$AF3A:B0 09 BCS $AF45 ; branch if we have something != #$60 0x01AF4C|$06:$AF3C:A9 07 LDA #$07 0x01AF4E|$06:$AF3E:8D C2 60 STA $60C2 0x01AF51|$06:$AF41:20 ; actual target is $AF7D/$AF7E ; indexed data load target (from $AF00) 0x01AF52|$06:$AF42: 56 AF JSR $AF56 0x01AF54|$06:$AF44:18 CLC ; control flow target (from $AF35, $AF3A) 0x01AF55|$06:$AF45:60 RTS ; CLC if $0100-$0103 are all #$60, SEC otherwise ; control flow target (from $AEE4, $AF37) 0x01AF56|$06:$AF46:A2 03 LDX #$03 ; control flow target (from $AF50) 0x01AF58|$06:$AF48:BD 00 01 LDA $0100,X ; string copy buffer start (often referenced as $00FF,X) 0x01AF5B|$06:$AF4B:C9 60 CMP #$60 0x01AF5D|$06:$AF4D:D0 05 BNE $AF54 0x01AF5F|$06:$AF4F:CA DEX 0x01AF60|$06:$AF50:10 F6 BPL $AF48 0x01AF62|$06:$AF52:18 CLC ; entire string is #$60 0x01AF63|$06:$AF53:60 RTS ; control flow target (from $AF4D) 0x01AF64|$06:$AF54:38 SEC ; not entire string is #$60 0x01AF65|$06:$AF55:60 RTS ; control flow target (from $AE89, $AF10, $AF2C, $AF41) 0x01AF66|$06:$AF56:A9 77 LDA #$77 0x01AF68|$06:$AF58:D0 02 BNE $AF5C ; control flow target (from $AF0A, $AF15) 0x01AF6A|$06:$AF5A:A9 5F LDA #$5F ; control flow target (from $AF58) ; indexed data load target (from $AEFA) 0x01AF6C|$06:$AF5C:A2 07 LDX #$07 0x01AF6E|$06:$AF5E:D0 02 BNE $AF62 ; control flow target (from $AF1F) 0x01AF70|$06:$AF60:A2 06 LDX #$06 ; control flow target (from $AF5E) 0x01AF72|$06:$AF62:8E 8C 60 STX $608C 0x01AF75|$06:$AF65:85 09 STA $09 0x01AF77|$06:$AF67:AD C2 60 LDA $60C2 0x01AF7A|$06:$AF6A:18 CLC 0x01AF7B|$06:$AF6B:69 0C ADC #$0C 0x01AF7D|$06:$AF6D:8D 8B 60 STA $608B 0x01AF80|$06:$AF70:20 09 A8 JSR $A809 ; call to code in a different bank ($0F:$C1FA) 0x01AF83|$06:$AF73: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 0x01AF86|$06:$AF76:67 0x01AF87|$06:$AF77:69 0x01AF88|$06:$AF78:6B 0x01AF89|$06:$AF79:70 0x01AF8A|$06:$AF7A:75 0x01AF8B|$06:$AF7B:63 0x01AF8C|$06:$AF7C:60 0x01AF8D|$06:$AF7D:6F 0x01AF8E|$06:$AF7E:6E ; data -> code ; from $0F:$F0BF via $8018 ; control flow target (from $AE8C) ; indirect control flow target (via $8018) 0x01AF8F|$06:$AF7F:AD B4 60 LDA $60B4 ; menu phase (1 = first, 0 = second) 0x01AF92|$06:$AF82:D0 0D BNE $AF91 0x01AF94|$06:$AF84:20 C6 AF JSR $AFC6 0x01AF97|$06:$AF87:A9 80 LDA #$80 0x01AF99|$06:$AF89:8D C5 60 STA $60C5 0x01AF9C|$06:$AF8C:85 2F STA $2F ; joypad 1 data ; control flow target (from $AE97) ; indirect control flow target (via $801A) 0x01AF9E|$06:$AF8E:20 92 AF JSR $AF92 ; control flow target (from $AF82) 0x01AFA1|$06:$AF91:60 RTS ; control flow target (from $AF8E, $AF98) 0x01AFA2|$06:$AF92:20 9B AF JSR $AF9B 0x01AFA5|$06:$AF95:20 AC B0 JSR $B0AC 0x01AFA8|$06:$AF98:4C 92 AF JMP $AF92 ; control flow target (from $AF92, $AFB4, $AFC3) ; call to code in a different bank ($0F:$C1DC) 0x01AFAB|$06:$AF9B:20 DC C1 JSR $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF 0x01AFAE|$06:$AF9E:20 85 B0 JSR $B085 0x01AFB1|$06:$AFA1:A5 2F LDA $2F ; joypad 1 data 0x01AFB3|$06:$AFA3:F0 06 BEQ $AFAB 0x01AFB5|$06:$AFA5:A5 03 LDA $03 ; game clock? 0x01AFB7|$06:$AFA7:29 0F AND #$0F 0x01AFB9|$06:$AFA9:D0 03 BNE $AFAE ; control flow target (from $AFA3) 0x01AFBB|$06:$AFAB:8D C5 60 STA $60C5 ; control flow target (from $AFA9) ; call to code in a different bank ($0F:$C476) 0x01AFBE|$06:$AFAE:20 76 C4 JSR $C476 ; read joypad 1 data into $2F 0x01AFC1|$06:$AFB1:AD C5 60 LDA $60C5 0x01AFC4|$06:$AFB4:D0 E5 BNE $AF9B 0x01AFC6|$06:$AFB6:AD C5 60 LDA $60C5 0x01AFC9|$06:$AFB9:25 2F AND $2F ; joypad 1 data 0x01AFCB|$06:$AFBB:8D C5 60 STA $60C5 0x01AFCE|$06:$AFBE:45 2F EOR $2F ; joypad 1 data 0x01AFD0|$06:$AFC0:8D 8D 60 STA $608D 0x01AFD3|$06:$AFC3:F0 D6 BEQ $AF9B 0x01AFD5|$06:$AFC5:60 RTS ; control flow target (from $AF84) 0x01AFD6|$06:$AFC6:A9 00 LDA #$00 0x01AFD8|$06:$AFC8:85 82 STA $82 0x01AFDA|$06:$AFCA:85 83 STA $83 0x01AFDC|$06:$AFCC:85 81 STA $81 0x01AFDE|$06:$AFCE:8D B0 60 STA $60B0 0x01AFE1|$06:$AFD1:8D B1 60 STA $60B1 0x01AFE4|$06:$AFD4:8D C5 60 STA $60C5 0x01AFE7|$06:$AFD7:AD A5 60 LDA $60A5 ; menu cursor second column X-offset (from left edge of menu) 0x01AFEA|$06:$AFDA:4A LSR 0x01AFEB|$06:$AFDB:4A LSR 0x01AFEC|$06:$AFDC:4A LSR 0x01AFED|$06:$AFDD:4A LSR 0x01AFEE|$06:$AFDE:AA TAX 0x01AFEF|$06:$AFDF:BD C8 B2 LDA $B2C8,X 0x01AFF2|$06:$AFE2:8D C4 60 STA $60C4 0x01AFF5|$06:$AFE5:A5 59 LDA $59 ; menu ID 0x01AFF7|$06:$AFE7:C9 13 CMP #$13 ; Menu ID #$13: Main menu: equip weapon 0x01AFF9|$06:$AFE9:F0 58 BEQ $B043 0x01AFFB|$06:$AFEB:C9 2D CMP #$2D ; Menu ID #$2D: Main menu: equip armour 0x01AFFD|$06:$AFED:F0 54 BEQ $B043 0x01AFFF|$06:$AFEF:C9 2E CMP #$2E ; Menu ID #$2E: Main menu: equip shield 0x01B001|$06:$AFF1:F0 50 BEQ $B043 0x01B003|$06:$AFF3:C9 2F CMP #$2F ; Menu ID #$2F: Main menu: equip helmet 0x01B005|$06:$AFF5:F0 4C BEQ $B043 0x01B007|$06:$AFF7:C9 45 CMP #$45 ; Menu ID #$45: Game menu: select message speed 0x01B009|$06:$AFF9:F0 07 BEQ $B002 0x01B00B|$06:$AFFB:C9 07 CMP #$07 ; Menu ID #$07: Battle menu: spell list 0x01B00D|$06:$AFFD:F0 1C BEQ $B01B 0x01B00F|$06:$AFFF:4C 60 B0 JMP $B060 ; control flow target (from $AFF9) 0x01B012|$06:$B002:A2 00 LDX #$00 0x01B014|$06:$B004:AD 2C 06 LDA $062C ; current battle message delay 0x01B017|$06:$B007:C9 32 CMP #$32 0x01B019|$06:$B009:90 06 BCC $B011 0x01B01B|$06:$B00B:E8 INX 0x01B01C|$06:$B00C:C9 64 CMP #$64 0x01B01E|$06:$B00E:90 01 BCC $B011 0x01B020|$06:$B010:E8 INX ; control flow target (from $B009, $B00E) 0x01B021|$06:$B011:86 83 STX $83 0x01B023|$06:$B013:8A TXA 0x01B024|$06:$B014:0A ASL 0x01B025|$06:$B015:8D B1 60 STA $60B1 0x01B028|$06:$B018:4C 60 B0 JMP $B060 ; control flow target (from $AFFD) 0x01B02B|$06:$B01B:A2 00 LDX #$00 ; control flow target (from $B025) 0x01B02D|$06:$B01D:BD BA 60 LDA $60BA,X 0x01B030|$06:$B020:D0 07 BNE $B029 0x01B032|$06:$B022:E8 INX 0x01B033|$06:$B023:E0 08 CPX #$08 0x01B035|$06:$B025:D0 F6 BNE $B01D 0x01B037|$06:$B027:A2 00 LDX #$00 ; control flow target (from $B020) 0x01B039|$06:$B029:8A TXA 0x01B03A|$06:$B02A:29 01 AND #$01 0x01B03C|$06:$B02C:85 82 STA $82 0x01B03E|$06:$B02E:F0 08 BEQ $B038 0x01B040|$06:$B030:AD A5 60 LDA $60A5 ; menu cursor second column X-offset (from left edge of menu) 0x01B043|$06:$B033:29 0F AND #$0F 0x01B045|$06:$B035:8D B0 60 STA $60B0 ; control flow target (from $B02E) 0x01B048|$06:$B038:8A TXA 0x01B049|$06:$B039:4A LSR 0x01B04A|$06:$B03A:85 83 STA $83 0x01B04C|$06:$B03C:0A ASL 0x01B04D|$06:$B03D:8D B1 60 STA $60B1 0x01B050|$06:$B040:4C 60 B0 JMP $B060 ; control flow target (from $AFE9, $AFED, $AFF1, $AFF5) 0x01B053|$06:$B043:AD B9 60 LDA $60B9 0x01B056|$06:$B046:C9 FF CMP #$FF 0x01B058|$06:$B048:F0 09 BEQ $B053 0x01B05A|$06:$B04A:85 83 STA $83 0x01B05C|$06:$B04C:0A ASL 0x01B05D|$06:$B04D:8D B1 60 STA $60B1 0x01B060|$06:$B050:4C 60 B0 JMP $B060 ; control flow target (from $B048) 0x01B063|$06:$B053:38 SEC 0x01B064|$06:$B054:AD A3 60 LDA $60A3 ; menu window height (ROM value * 2) 0x01B067|$06:$B057:E9 03 SBC #$03 0x01B069|$06:$B059:4A LSR 0x01B06A|$06:$B05A:85 83 STA $83 0x01B06C|$06:$B05C:0A ASL 0x01B06D|$06:$B05D:8D B1 60 STA $60B1 ; control flow target (from $AFFF, $B018, $B040, $B050) 0x01B070|$06:$B060:AD A9 60 LDA $60A9 ; menu cursor initial position (from ROM; X-pos = low nybble, Y-pos = high nybble) 0x01B073|$06:$B063:48 PHA 0x01B074|$06:$B064:29 0F AND #$0F 0x01B076|$06:$B066:8D B2 60 STA $60B2 0x01B079|$06:$B069:18 CLC 0x01B07A|$06:$B06A:6D B0 60 ADC $60B0 0x01B07D|$06:$B06D:8D B0 60 STA $60B0 0x01B080|$06:$B070:68 PLA 0x01B081|$06:$B071:29 F0 AND #$F0 0x01B083|$06:$B073:4A LSR 0x01B084|$06:$B074:4A LSR 0x01B085|$06:$B075:4A LSR 0x01B086|$06:$B076:4A LSR 0x01B087|$06:$B077:8D B3 60 STA $60B3 0x01B08A|$06:$B07A:6D B1 60 ADC $60B1 0x01B08D|$06:$B07D:8D B1 60 STA $60B1 0x01B090|$06:$B080:A9 05 LDA #$05 0x01B092|$06:$B082:85 03 STA $03 ; game clock? 0x01B094|$06:$B084:60 RTS ; control flow target (from $AF9E) 0x01B095|$06:$B085:A2 5F LDX #$5F 0x01B097|$06:$B087:A5 03 LDA $03 ; game clock? 0x01B099|$06:$B089:29 1F AND #$1F 0x01B09B|$06:$B08B:C9 10 CMP #$10 0x01B09D|$06:$B08D:B0 02 BCS $B091 ; control flow target (from $B218) 0x01B09F|$06:$B08F:A2 72 LDX #$72 ; control flow target (from $B08D, $B211) 0x01B0A1|$06:$B091:86 09 STX $09 0x01B0A3|$06:$B093:A5 4D LDA $4D 0x01B0A5|$06:$B095:18 CLC 0x01B0A6|$06:$B096:6D B0 60 ADC $60B0 0x01B0A9|$06:$B099:8D 8B 60 STA $608B 0x01B0AC|$06:$B09C:A5 4E LDA $4E 0x01B0AE|$06:$B09E:18 CLC 0x01B0AF|$06:$B09F:6D B1 60 ADC $60B1 0x01B0B2|$06:$B0A2:8D 8C 60 STA $608C ; call to code in a different bank ($0F:$FE97) 0x01B0B5|$06:$B0A5: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 0x01B0B8|$06:$B0A8:C1 ; $06:$8002 ; data -> code ; call to code in a different bank ($0F:$C1FA) 0x01B0B9|$06:$B0A9: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 ; control flow target (from $AF95) 0x01B0BC|$06:$B0AC:AD 8D 60 LDA $608D 0x01B0BF|$06:$B0AF:4A LSR 0x01B0C0|$06:$B0B0:B0 17 BCS $B0C9 0x01B0C2|$06:$B0B2:4A LSR 0x01B0C3|$06:$B0B3:B0 31 BCS $B0E6 0x01B0C5|$06:$B0B5:4A LSR 0x01B0C6|$06:$B0B6:4A LSR 0x01B0C7|$06:$B0B7:4A LSR 0x01B0C8|$06:$B0B8:B0 39 BCS $B0F3 0x01B0CA|$06:$B0BA:4A LSR 0x01B0CB|$06:$B0BB:B0 63 BCS $B120 0x01B0CD|$06:$B0BD:4A LSR 0x01B0CE|$06:$B0BE:B0 06 BCS $B0C6 0x01B0D0|$06:$B0C0:4A LSR 0x01B0D1|$06:$B0C1:90 47 BCC $B10A 0x01B0D3|$06:$B0C3:4C BE B1 JMP $B1BE ; control flow target (from $B0BE) 0x01B0D6|$06:$B0C6:4C 74 B1 JMP $B174 ; control flow target (from $B0B0) 0x01B0D9|$06:$B0C9:A9 01 LDA #$01 0x01B0DB|$06:$B0CB:8D C5 60 STA $60C5 0x01B0DE|$06:$B0CE:20 14 B2 JSR $B214 0x01B0E1|$06:$B0D1:A9 85 LDA #$85 ; Music ID #$85: single beep SFX ; call to code in a different bank ($0F:$C561) 0x01B0E3|$06:$B0D3:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x01B0E6|$06:$B0D6:A5 82 LDA $82 0x01B0E8|$06:$B0D8:85 12 STA $12 0x01B0EA|$06:$B0DA:A5 83 LDA $83 0x01B0EC|$06:$B0DC:85 13 STA $13 0x01B0EE|$06:$B0DE:20 94 B2 JSR $B294 0x01B0F1|$06:$B0E1:68 PLA 0x01B0F2|$06:$B0E2:68 PLA 0x01B0F3|$06:$B0E3:A5 81 LDA $81 0x01B0F5|$06:$B0E5:60 RTS ; control flow target (from $B0B3) 0x01B0F6|$06:$B0E6:A9 02 LDA #$02 0x01B0F8|$06:$B0E8:8D C5 60 STA $60C5 0x01B0FB|$06:$B0EB:20 14 B2 JSR $B214 0x01B0FE|$06:$B0EE:68 PLA 0x01B0FF|$06:$B0EF:68 PLA 0x01B100|$06:$B0F0:A9 FF LDA #$FF 0x01B102|$06:$B0F2:60 RTS ; control flow target (from $B0B8) 0x01B103|$06:$B0F3:A9 10 LDA #$10 0x01B105|$06:$B0F5:8D C5 60 STA $60C5 0x01B108|$06:$B0F8: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) 0x01B10B|$06:$B0FB:70 0E BVS $B10B ; control flow target (from $B112) 0x01B10D|$06:$B0FD:A5 83 LDA $83 0x01B10F|$06:$B0FF:F0 09 BEQ $B10A 0x01B111|$06:$B101:20 0F B2 JSR $B20F 0x01B114|$06:$B104:20 BC B2 JSR $B2BC 0x01B117|$06:$B107:20 14 B2 JSR $B214 ; control flow target (from $B0C1, $B0FF, $B10E) 0x01B11A|$06:$B10A:60 RTS ; control flow target (from $B0FB) 0x01B11B|$06:$B10B:AD B1 60 LDA $60B1 0x01B11E|$06:$B10E:F0 FA BEQ $B10A 0x01B120|$06:$B110:A5 83 LDA $83 0x01B122|$06:$B112:D0 E9 BNE $B0FD 0x01B124|$06:$B114:20 0F B2 JSR $B20F 0x01B127|$06:$B117:A9 00 LDA #$00 0x01B129|$06:$B119:8D B1 60 STA $60B1 0x01B12C|$06:$B11C:20 14 B2 JSR $B214 0x01B12F|$06:$B11F:60 RTS ; control flow target (from $B0BB) 0x01B130|$06:$B120:A9 20 LDA #$20 0x01B132|$06:$B122:8D C5 60 STA $60C5 0x01B135|$06:$B125:A5 59 LDA $59 ; menu ID 0x01B137|$06:$B127:C9 45 CMP #$45 ; Menu ID #$45: Game menu: select message speed 0x01B139|$06:$B129:D0 06 BNE $B131 0x01B13B|$06:$B12B:A5 83 LDA $83 0x01B13D|$06:$B12D:C9 02 CMP #$02 0x01B13F|$06:$B12F:F0 42 BEQ $B173 ; control flow target (from $B129) 0x01B141|$06:$B131:38 SEC 0x01B142|$06:$B132:AD A3 60 LDA $60A3 ; menu window height (ROM value * 2) 0x01B145|$06:$B135:E9 03 SBC #$03 0x01B147|$06:$B137:4A LSR 0x01B148|$06:$B138:C5 83 CMP $83 0x01B14A|$06:$B13A:F0 37 BEQ $B173 0x01B14C|$06:$B13C:20 0F B2 JSR $B20F 0x01B14F|$06:$B13F:A5 59 LDA $59 ; menu ID 0x01B151|$06:$B141:C9 44 CMP #$44 ; Menu ID #$44: Game menu: new game name input area 0x01B153|$06:$B143:F0 13 BEQ $B158 0x01B155|$06:$B145:C9 07 CMP #$07 ; Menu ID #$07: Battle menu: spell list 0x01B157|$06:$B147:F0 08 BEQ $B151 0x01B159|$06:$B149:C9 08 CMP #$08 ; Menu ID #$08: Battle menu: item list window 1 0x01B15B|$06:$B14B:F0 04 BEQ $B151 0x01B15D|$06:$B14D:C9 22 CMP #$22 ; Menu ID #$22: Battle menu: item list window 2 0x01B15F|$06:$B14F:D0 0A BNE $B15B ; control flow target (from $B147, $B14B) 0x01B161|$06:$B151:20 43 B2 JSR $B243 0x01B164|$06:$B154:90 1D BCC $B173 0x01B166|$06:$B156:B0 03 BCS $B15B ; control flow target (from $B143) 0x01B168|$06:$B158:20 1E B2 JSR $B21E ; control flow target (from $B14F, $B156) 0x01B16B|$06:$B15B:AD B1 60 LDA $60B1 0x01B16E|$06:$B15E:D0 08 BNE $B168 0x01B170|$06:$B160:AD B3 60 LDA $60B3 0x01B173|$06:$B163:8D B1 60 STA $60B1 0x01B176|$06:$B166:D0 08 BNE $B170 ; control flow target (from $B15E) 0x01B178|$06:$B168:18 CLC 0x01B179|$06:$B169:69 02 ADC #$02 0x01B17B|$06:$B16B:8D B1 60 STA $60B1 0x01B17E|$06:$B16E:E6 83 INC $83 ; control flow target (from $B166) 0x01B180|$06:$B170:20 14 B2 JSR $B214 ; control flow target (from $B12F, $B13A, $B154) 0x01B183|$06:$B173:60 RTS ; control flow target (from $B0C6) 0x01B184|$06:$B174:A9 40 LDA #$40 0x01B186|$06:$B176:8D C5 60 STA $60C5 0x01B189|$06:$B179:A5 82 LDA $82 0x01B18B|$06:$B17B:F0 40 BEQ $B1BD 0x01B18D|$06:$B17D:A5 59 LDA $59 ; menu ID 0x01B18F|$06:$B17F:C9 44 CMP #$44 ; Menu ID #$44: Game menu: new game name input area 0x01B191|$06:$B181:F0 0B BEQ $B18E 0x01B193|$06:$B183:C9 07 CMP #$07 ; Menu ID #$07: Battle menu: spell list 0x01B195|$06:$B185:D0 1E BNE $B1A5 0x01B197|$06:$B187:20 52 B2 JSR $B252 0x01B19A|$06:$B18A:90 31 BCC $B1BD 0x01B19C|$06:$B18C:B0 17 BCS $B1A5 ; control flow target (from $B181) 0x01B19E|$06:$B18E:A5 83 LDA $83 0x01B1A0|$06:$B190:C9 05 CMP #$05 0x01B1A2|$06:$B192:D0 11 BNE $B1A5 0x01B1A4|$06:$B194:A5 82 LDA $82 0x01B1A6|$06:$B196:C9 09 CMP #$09 0x01B1A8|$06:$B198:D0 0B BNE $B1A5 0x01B1AA|$06:$B19A:A9 06 LDA #$06 0x01B1AC|$06:$B19C:85 82 STA $82 0x01B1AE|$06:$B19E:20 0F B2 JSR $B20F 0x01B1B1|$06:$B1A1:A9 0D LDA #$0D 0x01B1B3|$06:$B1A3:D0 12 BNE $B1B7 ; control flow target (from $B185, $B18C, $B192, $B198) 0x01B1B5|$06:$B1A5:20 0F B2 JSR $B20F 0x01B1B8|$06:$B1A8:C6 82 DEC $82 0x01B1BA|$06:$B1AA:AD A5 60 LDA $60A5 ; menu cursor second column X-offset (from left edge of menu) 0x01B1BD|$06:$B1AD:29 0F AND #$0F 0x01B1BF|$06:$B1AF:85 10 STA $10 0x01B1C1|$06:$B1B1:AD B0 60 LDA $60B0 0x01B1C4|$06:$B1B4:38 SEC 0x01B1C5|$06:$B1B5:E5 10 SBC $10 ; control flow target (from $B1A3) 0x01B1C7|$06:$B1B7:8D B0 60 STA $60B0 0x01B1CA|$06:$B1BA:20 14 B2 JSR $B214 ; control flow target (from $B17B, $B18A) 0x01B1CD|$06:$B1BD:60 RTS ; control flow target (from $B0C3) 0x01B1CE|$06:$B1BE:A9 80 LDA #$80 0x01B1D0|$06:$B1C0:8D C5 60 STA $60C5 0x01B1D3|$06:$B1C3:AD A5 60 LDA $60A5 ; menu cursor second column X-offset (from left edge of menu) 0x01B1D6|$06:$B1C6:F0 46 BEQ $B20E 0x01B1D8|$06:$B1C8:A5 59 LDA $59 ; menu ID 0x01B1DA|$06:$B1CA:C9 44 CMP #$44 ; Menu ID #$44: Game menu: new game name input area 0x01B1DC|$06:$B1CC:F0 0B BEQ $B1D9 0x01B1DE|$06:$B1CE:C9 07 CMP #$07 ; Menu ID #$07: Battle menu: spell list 0x01B1E0|$06:$B1D0:D0 20 BNE $B1F2 0x01B1E2|$06:$B1D2:20 5A B2 JSR $B25A 0x01B1E5|$06:$B1D5:90 37 BCC $B20E 0x01B1E7|$06:$B1D7:B0 19 BCS $B1F2 ; control flow target (from $B1CC) 0x01B1E9|$06:$B1D9:A5 83 LDA $83 0x01B1EB|$06:$B1DB:C9 05 CMP #$05 0x01B1ED|$06:$B1DD:D0 13 BNE $B1F2 0x01B1EF|$06:$B1DF:A5 82 LDA $82 0x01B1F1|$06:$B1E1:C9 06 CMP #$06 0x01B1F3|$06:$B1E3:90 0D BCC $B1F2 0x01B1F5|$06:$B1E5:D0 27 BNE $B20E 0x01B1F7|$06:$B1E7:20 0F B2 JSR $B20F 0x01B1FA|$06:$B1EA:A9 09 LDA #$09 0x01B1FC|$06:$B1EC:85 82 STA $82 0x01B1FE|$06:$B1EE:A9 13 LDA #$13 0x01B200|$06:$B1F0:D0 16 BNE $B208 ; control flow target (from $B1D0, $B1D7, $B1DD, $B1E3) 0x01B202|$06:$B1F2:AE C4 60 LDX $60C4 0x01B205|$06:$B1F5:CA DEX 0x01B206|$06:$B1F6:E4 82 CPX $82 0x01B208|$06:$B1F8:F0 14 BEQ $B20E 0x01B20A|$06:$B1FA:20 0F B2 JSR $B20F 0x01B20D|$06:$B1FD:E6 82 INC $82 0x01B20F|$06:$B1FF:AD A5 60 LDA $60A5 ; menu cursor second column X-offset (from left edge of menu) 0x01B212|$06:$B202:29 0F AND #$0F 0x01B214|$06:$B204:18 CLC 0x01B215|$06:$B205:6D B0 60 ADC $60B0 ; control flow target (from $B1F0) 0x01B218|$06:$B208:8D B0 60 STA $60B0 0x01B21B|$06:$B20B:20 14 B2 JSR $B214 ; control flow target (from $B1C6, $B1D5, $B1E5, $B1F8) 0x01B21E|$06:$B20E:60 RTS ; control flow target (from $B101, $B114, $B13C, $B19E, $B1A5, $B1E7, $B1FA, $B276, $B27F) 0x01B21F|$06:$B20F:A2 5F LDX #$5F 0x01B221|$06:$B211:4C 91 B0 JMP $B091 ; control flow target (from $B0CE, $B0EB, $B107, $B11C, $B170, $B1BA, $B20B) 0x01B224|$06:$B214:A9 05 LDA #$05 0x01B226|$06:$B216:85 03 STA $03 ; game clock? 0x01B228|$06:$B218:20 8F B0 JSR $B08F ; call to code in a different bank ($0F:$C1DC) 0x01B22B|$06:$B21B:4C DC C1 JMP $C1DC ; set $6007 = #$00, set $00 = #$01, wait for interrupt, set $00 = #$FF ; control flow target (from $B158) 0x01B22E|$06:$B21E:A5 83 LDA $83 0x01B230|$06:$B220:C9 04 CMP #$04 0x01B232|$06:$B222:D0 1E BNE $B242 0x01B234|$06:$B224:A5 82 LDA $82 0x01B236|$06:$B226:C9 07 CMP #$07 0x01B238|$06:$B228:F0 0F BEQ $B239 0x01B23A|$06:$B22A:C9 08 CMP #$08 0x01B23C|$06:$B22C:90 14 BCC $B242 0x01B23E|$06:$B22E:A9 09 LDA #$09 0x01B240|$06:$B230:85 82 STA $82 0x01B242|$06:$B232:A9 13 LDA #$13 0x01B244|$06:$B234:8D B0 60 STA $60B0 0x01B247|$06:$B237:D0 09 BNE $B242 ; control flow target (from $B228) 0x01B249|$06:$B239:A9 06 LDA #$06 0x01B24B|$06:$B23B:85 82 STA $82 0x01B24D|$06:$B23D:A9 0D LDA #$0D 0x01B24F|$06:$B23F:8D B0 60 STA $60B0 ; control flow target (from $B222, $B22C, $B237) 0x01B252|$06:$B242:60 RTS ; control flow target (from $B151) 0x01B253|$06:$B243:20 B3 B2 JSR $B2B3 ; copy $82-$83 to $12-$13 0x01B256|$06:$B246:E6 13 INC $13 0x01B258|$06:$B248:AD B1 60 LDA $60B1 0x01B25B|$06:$B24B:F0 03 BEQ $B250 0x01B25D|$06:$B24D:4C 87 B2 JMP $B287 ; control flow target (from $B24B) 0x01B260|$06:$B250:38 SEC 0x01B261|$06:$B251:60 RTS ; control flow target (from $B187) 0x01B262|$06:$B252:20 B3 B2 JSR $B2B3 ; copy $82-$83 to $12-$13 0x01B265|$06:$B255:C6 12 DEC $12 0x01B267|$06:$B257:4C 5F B2 JMP $B25F ; control flow target (from $B1D2) 0x01B26A|$06:$B25A:20 B3 B2 JSR $B2B3 ; copy $82-$83 to $12-$13 0x01B26D|$06:$B25D:E6 12 INC $12 ; control flow target (from $B257) 0x01B26F|$06:$B25F:20 87 B2 JSR $B287 0x01B272|$06:$B262:B0 22 BCS $B286 0x01B274|$06:$B264:C6 13 DEC $13 0x01B276|$06:$B266:30 1E BMI $B286 0x01B278|$06:$B268:20 87 B2 JSR $B287 0x01B27B|$06:$B26B:B0 12 BCS $B27F 0x01B27D|$06:$B26D:C6 13 DEC $13 0x01B27F|$06:$B26F:30 15 BMI $B286 0x01B281|$06:$B271:20 87 B2 JSR $B287 0x01B284|$06:$B274:90 10 BCC $B286 0x01B286|$06:$B276:20 0F B2 JSR $B20F 0x01B289|$06:$B279:20 BC B2 JSR $B2BC 0x01B28C|$06:$B27C:4C 82 B2 JMP $B282 ; control flow target (from $B26B) 0x01B28F|$06:$B27F:20 0F B2 JSR $B20F ; control flow target (from $B27C) 0x01B292|$06:$B282:20 BC B2 JSR $B2BC 0x01B295|$06:$B285:38 SEC ; control flow target (from $B262, $B266, $B26F, $B274) 0x01B296|$06:$B286:60 RTS ; control flow target (from $B24D, $B25F, $B268, $B271) 0x01B297|$06:$B287:20 94 B2 JSR $B294 0x01B29A|$06:$B28A:AA TAX 0x01B29B|$06:$B28B:BD BA 60 LDA $60BA,X 0x01B29E|$06:$B28E:F0 02 BEQ $B292 0x01B2A0|$06:$B290:38 SEC 0x01B2A1|$06:$B291:60 RTS ; control flow target (from $B28E) 0x01B2A2|$06:$B292:18 CLC 0x01B2A3|$06:$B293:60 RTS ; control flow target (from $B0DE, $B287) 0x01B2A4|$06:$B294:A5 13 LDA $13 0x01B2A6|$06:$B296:AE A5 60 LDX $60A5 ; menu cursor second column X-offset (from left edge of menu) 0x01B2A9|$06:$B299:F0 15 BEQ $B2B0 0x01B2AB|$06:$B29B:29 0F AND #$0F 0x01B2AD|$06:$B29D:85 10 STA $10 0x01B2AF|$06:$B29F:A9 00 LDA #$00 0x01B2B1|$06:$B2A1:85 11 STA $11 0x01B2B3|$06:$B2A3:A2 10 LDX #$10 0x01B2B5|$06:$B2A5:AD C4 60 LDA $60C4 ; call to code in a different bank ($0F:$F0F4) 0x01B2B8|$06:$B2A8:20 F4 F0 JSR $F0F4 ; 16-bit multiplication: set 16-bit ($00,X-$01,X) = ($00,X-$01,X) * A 0x01B2BB|$06:$B2AB:A5 10 LDA $10 0x01B2BD|$06:$B2AD:18 CLC 0x01B2BE|$06:$B2AE:65 12 ADC $12 ; control flow target (from $B299) 0x01B2C0|$06:$B2B0:85 81 STA $81 0x01B2C2|$06:$B2B2:60 RTS ; copy $82-$83 to $12-$13 ; control flow target (from $B243, $B252, $B25A) 0x01B2C3|$06:$B2B3:A5 82 LDA $82 0x01B2C5|$06:$B2B5:85 12 STA $12 0x01B2C7|$06:$B2B7:A5 83 LDA $83 0x01B2C9|$06:$B2B9:85 13 STA $13 0x01B2CB|$06:$B2BB:60 RTS ; control flow target (from $B104, $B279, $B282) 0x01B2CC|$06:$B2BC:AD B1 60 LDA $60B1 0x01B2CF|$06:$B2BF:38 SEC 0x01B2D0|$06:$B2C0:E9 02 SBC #$02 0x01B2D2|$06:$B2C2:8D B1 60 STA $60B1 0x01B2D5|$06:$B2C5:C6 83 DEC $83 0x01B2D7|$06:$B2C7:60 RTS ; code -> data ; indexed data load target (from $AFDF) 0x01B2D8|$06:$B2C8:02 0x01B2D9|$06:$B2C9:0B ; Item list part 1, line 1 ; indirect data load target (via $8022) 0x01B2DA|$06:$B2CA:25 0A 16 0B 18 18 FF ; Bamboo[end-FF] 0x01B2E1|$06:$B2D1:30 0A 10 12 0C FF ; Magic[end-FF] 0x01B2E7|$06:$B2D7:3A 12 23 0A 1B 0D 67 1C FF ; Wizard's[end-FF] 0x01B2F0|$06:$B2E0:36 1D 0A 0F 0F 5F 18 0F FF ; Staff of[end-FF] 0x01B2F9|$06:$B2E9:26 15 1E 0B FF ; Club[end-FF] 0x01B2FE|$06:$B2EE:26 18 19 19 0E 1B FF ; Copper[end-FF] 0x01B305|$06:$B2F5:26 11 0A 12 17 FF ; Chain[end-FF] 0x01B30B|$06:$B2FB:2C 1B 18 17 FF ; Iron[end-FF] 0x01B310|$06:$B300:29 0A 15 0C 18 17 FF ; Falcon[end-FF] 0x01B317|$06:$B307:25 1B 18 0A 0D FF ; Broad[end-FF] 0x01B31D|$06:$B30D:2A 12 0A 17 1D FF ; Giant[end-FF] 0x01B323|$06:$B313:36 20 18 1B 0D 5F 18 0F FF ; Sword of[end-FF] 0x01B32C|$06:$B31C:27 1B 0A 10 18 17 FF ; Dragon[end-FF] 0x01B333|$06:$B323:2F 12 10 11 1D FF ; Light[end-FF] 0x01B339|$06:$B329:36 20 18 1B 0D 5F 18 0F FF ; Sword of[end-FF] 0x01B342|$06:$B332:37 11 1E 17 0D 0E 1B FF ; Thunder[end-FF] 0x01B34A|$06:$B33A:26 15 18 1D 11 0E 1C FF ; Clothes[end-FF] 0x01B352|$06:$B342:26 15 18 1D 11 0E 1C FF ; Clothes[end-FF] 0x01B35A|$06:$B34A:3A 0A 1D 0E 1B 5F 29 15 22 12 17 10 FF ; Water Flying[end-FF] 0x01B367|$06:$B357:30 12 17 14 FF ; Mink[end-FF] 0x01B36C|$06:$B35C:2F 0E 0A 1D 11 0E 1B FF ; Leather[end-FF] 0x01B374|$06:$B364:26 11 0A 12 17 FF ; Chain[end-FF] 0x01B37A|$06:$B36A:2A 1B 0E 16 15 12 17 67 1C FF ; Gremlin's[end-FF] 0x01B384|$06:$B374:30 0A 10 12 0C FF ; Magic[end-FF] 0x01B38A|$06:$B37A:29 1E 15 15 5F 33 15 0A 1D 0E FF ; Full Plate[end-FF] 0x01B395|$06:$B385:24 1B 16 18 1B 5F 18 0F FF ; Armor of[end-FF] 0x01B39E|$06:$B38E:24 1B 16 18 1B 5F 18 0F FF ; Armor of[end-FF] 0x01B3A7|$06:$B397:2F 0E 0A 1D 11 0E 1B FF ; Leather[end-FF] 0x01B3AF|$06:$B39F:36 11 12 0E 15 0D 5F 18 0F FF ; Shield of[end-FF] 0x01B3B9|$06:$B3A9:36 1D 0E 0E 15 FF ; Steel[end-FF] 0x01B3BF|$06:$B3AF:28 1F 12 15 FF ; Evil[end-FF] 0x01B3C4|$06:$B3B4:36 11 12 0E 15 0D 5F 18 0F FF ; Shield of[end-FF] ; Item list part 2, line 1 ; indirect data load target (via $8030) 0x01B3CE|$06:$B3BE:30 22 1C 1D 0E 1B 12 18 1E 1C FF ; Mysterious[end-FF] 0x01B3D9|$06:$B3C9:2C 1B 18 17 FF ; Iron[end-FF] 0x01B3DE|$06:$B3CE:2B 0E 15 16 0E 1D 5F 18 0F FF ; Helmet of[end-FF] 0x01B3E8|$06:$B3D8:37 18 14 0E 17 5F 18 0F FF ; Token of[end-FF] 0x01B3F1|$06:$B3E1:37 1B 0E 1C 1E 1B 0E 1C FF ; Tresures[end-FF] 0x01B3FA|$06:$B3EA:30 18 18 17 FF ; Moon[end-FF] 0x01B3FF|$06:$B3EF:26 11 0A 1B 16 5F 18 0F FF ; Charm of[end-FF] 0x01B408|$06:$B3F8:28 22 0E 5F 18 0F FF ; Eye of[end-FF] 0x01B40F|$06:$B3FF:2F 0E 0A 0F 5F 18 0F 5F 37 11 0E FF ; Leaf of The[end-FF] 0x01B41B|$06:$B40B:28 0C 11 18 12 17 10 FF ; Echoing[end-FF] 0x01B423|$06:$B413:30 12 1B 1B 18 1B 5F 18 0F FF ; Mirror of[end-FF] 0x01B42D|$06:$B41D:27 0E 20 67 1C FF ; Dew's[end-FF] 0x01B433|$06:$B423:30 0A 10 12 0C FF ; Magic[end-FF] 0x01B439|$06:$B429:26 15 18 0A 14 5F 18 0F FF ; Cloak of[end-FF] 0x01B442|$06:$B432:2A 1B 0E 16 15 12 17 67 1C FF ; Gremlin's[end-FF] 0x01B44C|$06:$B43C:27 1B 0A 10 18 17 67 1C FF ; Dragon's[end-FF] 0x01B455|$06:$B445:27 1B 0A 10 18 17 67 1C FF ; Dragon's[end-FF] 0x01B45E|$06:$B44E:2A 18 15 0D 0E 17 FF ; Golden[end-FF] 0x01B465|$06:$B455:2F 18 1D 1D 0E 1B 22 FF ; Lottery[end-FF] 0x01B46D|$06:$B45D:29 0A 12 1B 22 FF ; Fairy[end-FF] 0x01B473|$06:$B463:3A 12 17 10 5F 18 0F FF ; Wing of[end-FF] 0x01B47B|$06:$B46B:FF ; [end-FF] 0x01B47C|$06:$B46C:2A 18 15 0D 0E 17 FF ; Golden[end-FF] 0x01B483|$06:$B473:36 12 15 1F 0E 1B FF ; Silver[end-FF] 0x01B48A|$06:$B47A:2D 0A 12 15 18 1B 67 1C FF ; Jailor's[end-FF] 0x01B493|$06:$B483:3A 0A 1D 0E 1B 10 0A 1D 0E FF ; Watergate[end-FF] 0x01B49D|$06:$B48D:24 17 1D 12 0D 18 1D 0E FF ; Antidote[end-FF] 0x01B4A6|$06:$B496:30 0E 0D 12 0C 0A 15 FF ; Medical[end-FF] 0x01B4AE|$06:$B49E:3A 12 23 0A 1B 0D 67 1C FF ; Wizard's[end-FF] 0x01B4B7|$06:$B4A7:33 0E 1B 12 15 18 1E 1C FF ; Perilous[end-FF] 0x01B4C0|$06:$B4B0:FF ; [end-FF] 0x01B4C1|$06:$B4B1:FF ; [end-FF] ; Item list part 1, line 2 ; indirect data load target (via $8024) 0x01B4C2|$06:$B4B2:36 1D 12 0C 14 FF ; Stick[end-FF] 0x01B4C8|$06:$B4B8:2E 17 12 0F 0E FF ; Knife[end-FF] 0x01B4CE|$06:$B4BE:3A 0A 17 0D FF ; Wand[end-FF] 0x01B4D3|$06:$B4C3:37 11 1E 17 0D 0E 1B FF ; Thunder[end-FF] 0x01B4DB|$06:$B4CB:FF ; [end-FF] 0x01B4DC|$06:$B4CC:36 20 18 1B 0D FF ; Sword[end-FF] 0x01B4E2|$06:$B4D2:36 12 0C 14 15 0E FF ; Sickle[end-FF] 0x01B4E9|$06:$B4D9:36 19 0E 0A 1B FF ; Spear[end-FF] 0x01B4EF|$06:$B4DF:36 20 18 1B 0D FF ; Sword[end-FF] 0x01B4F5|$06:$B4E5:36 20 18 1B 0D FF ; Sword[end-FF] 0x01B4FB|$06:$B4EB:2B 0A 16 16 0E 1B FF ; Hammer[end-FF] 0x01B502|$06:$B4F2:27 0E 1C 1D 1B 1E 0C 1D 12 18 17 FF ; Destruction[end-FF] 0x01B50E|$06:$B4FE:2E 12 15 15 0E 1B FF ; Killer[end-FF] 0x01B515|$06:$B505:36 20 18 1B 0D FF ; Sword[end-FF] 0x01B51B|$06:$B50B:28 1B 0D 1B 12 0C 14 FF ; Erdrick[end-FF] 0x01B523|$06:$B513:36 20 18 1B 0D FF ; Sword[end-FF] 0x01B529|$06:$B519:FF ; [end-FF] 0x01B52A|$06:$B51A:2B 12 0D 12 17 10 FF ; Hiding[end-FF] 0x01B531|$06:$B521:26 15 18 1D 11 FF ; Cloth[end-FF] 0x01B537|$06:$B527:26 18 0A 1D FF ; Coat[end-FF] 0x01B53C|$06:$B52C:24 1B 16 18 1B FF ; Armor[end-FF] 0x01B542|$06:$B532:30 0A 12 15 FF ; Mail[end-FF] 0x01B547|$06:$B537:24 1B 16 18 1B FF ; Armor[end-FF] 0x01B54D|$06:$B53D:24 1B 16 18 1B FF ; Armor[end-FF] 0x01B553|$06:$B543:24 1B 16 18 1B FF ; Armor[end-FF] 0x01B559|$06:$B549:2A 0A 12 0A FF ; Gaia[end-FF] 0x01B55E|$06:$B54E:28 1B 0D 1B 12 0C 14 FF ; Erdrick[end-FF] 0x01B566|$06:$B556:36 11 12 0E 15 0D FF ; Shield[end-FF] 0x01B56D|$06:$B55D:36 1D 1B 0E 17 10 1D 11 FF ; Strength[end-FF] 0x01B576|$06:$B566:36 11 12 0E 15 0D FF ; Shield[end-FF] 0x01B57D|$06:$B56D:36 11 12 0E 15 0D FF ; Shield[end-FF] 0x01B584|$06:$B574:28 1B 0D 1B 12 0C 14 FF ; Erdrick[end-FF] ; Item list part 2, line 2 ; indirect data load target (via $8032) 0x01B58C|$06:$B57C:2B 0A 1D FF ; Hat[end-FF] 0x01B590|$06:$B580:2B 0E 15 16 0E 1D FF ; Helmet[end-FF] 0x01B597|$06:$B587:28 1B 0D 1B 12 0C 14 FF ; Erdrick[end-FF] 0x01B59F|$06:$B58F:28 1B 0D 1B 12 0C 14 FF ; Erdrick[end-FF] 0x01B5A7|$06:$B597:FF ; [end-FF] 0x01B5A8|$06:$B598:29 1B 0A 10 16 0E 17 1D FF ; Fragment[end-FF] 0x01B5B1|$06:$B5A1:35 1E 0B 12 1C 1C FF ; Rubiss[end-FF] 0x01B5B8|$06:$B5A8:30 0A 15 1B 18 1D 11 FF ; Malroth[end-FF] 0x01B5C0|$06:$B5B0:3A 18 1B 15 0D 5F 37 1B 0E 0E FF ; World Tree[end-FF] 0x01B5CB|$06:$B5BB:29 15 1E 1D 0E FF ; Flute[end-FF] 0x01B5D1|$06:$B5C1:35 0A FF ; Ra[end-FF] 0x01B5D4|$06:$B5C4:3C 0A 1B 17 FF ; Yarn[end-FF] 0x01B5D9|$06:$B5C9:2F 18 18 16 FF ; Loom[end-FF] 0x01B5DE|$06:$B5CE:3A 12 17 0D FF ; Wind[end-FF] 0x01B5E3|$06:$B5D3:37 0A 12 15 FF ; Tail[end-FF] 0x01B5E8|$06:$B5D8:25 0A 17 0E FF ; Bane[end-FF] 0x01B5ED|$06:$B5DD:33 18 1D 12 18 17 FF ; Potion[end-FF] 0x01B5F4|$06:$B5E4:26 0A 1B 0D FF ; Card[end-FF] 0x01B5F9|$06:$B5E9:37 12 0C 14 0E 1D FF ; Ticket[end-FF] 0x01B600|$06:$B5F0:3A 0A 1D 0E 1B FF ; Water[end-FF] 0x01B606|$06:$B5F6:1D 11 0E 5F 3A 22 1F 0E 1B 17 FF ; the Wyvern[end-FF] 0x01B611|$06:$B601:FF ; [end-FF] 0x01B612|$06:$B602:2E 0E 22 FF ; Key[end-FF] 0x01B616|$06:$B606:2E 0E 22 FF ; Key[end-FF] 0x01B61A|$06:$B60A:2E 0E 22 FF ; Key[end-FF] 0x01B61E|$06:$B60E:2E 0E 22 FF ; Key[end-FF] 0x01B622|$06:$B612:2B 0E 1B 0B FF ; Herb[end-FF] 0x01B627|$06:$B617:2B 0E 1B 0B FF ; Herb[end-FF] 0x01B62C|$06:$B61C:35 12 17 10 FF ; Ring[end-FF] 0x01B631|$06:$B621:FF ; [end-FF] 0x01B632|$06:$B622:FF ; [end-FF] 0x01B633|$06:$B623:FF ; [end-FF] ; Spell name list ; indirect data load target (via $8026) 0x01B634|$06:$B624:29 12 1B 0E 0B 0A 15 FF ; Firebal[end-FF] 0x01B63C|$06:$B62C:2B 0E 0A 15 FF ; Heal[end-FF] 0x01B641|$06:$B631:36 1D 18 19 1C 19 0E 15 15 FF ; Stopspell[end-FF] 0x01B64B|$06:$B63B:2B 0E 0A 15 16 18 1B 0E FF ; Healmore[end-FF] 0x01B654|$06:$B644:29 12 1B 0E 0B 0A 17 0E FF ; Firebane[end-FF] 0x01B65D|$06:$B64D:2C 17 0C 1B 0E 0A 1C 0E FF ; Increase[end-FF] 0x01B666|$06:$B656:27 0E 0F 0E 0A 1D FF ; Defeat[end-FF] 0x01B66D|$06:$B65D:36 0A 0C 1B 12 0F 12 0C 0E FF ; Sacrifice[end-FF] 0x01B677|$06:$B667:2B 0E 0A 15 FF ; Heal[end-FF] 0x01B67C|$06:$B66C:24 17 1D 12 0D 18 1D 0E FF ; Antidote[end-FF] 0x01B685|$06:$B675:35 0E 1D 1E 1B 17 FF ; Return[end-FF] 0x01B68C|$06:$B67C:32 1E 1D 1C 12 0D 0E FF ; Outside[end-FF] 0x01B694|$06:$B684:2B 0E 0A 15 16 18 1B 0E FF ; Healmore[end-FF] 0x01B69D|$06:$B68D:36 1D 0E 19 10 1E 0A 1B 0D FF ; Stepguard[end-FF] 0x01B6A7|$06:$B697:35 0E 1F 12 1F 0E FF ; Revive[end-FF] 0x01B6AE|$06:$B69E:FF ; [end-FF] 0x01B6AF|$06:$B69F:36 15 0E 0E 19 FF ; Sleep[end-FF] 0x01B6B5|$06:$B6A5:2B 0E 0A 15 16 18 1B 0E FF ; Healmore[end-FF] 0x01B6BE|$06:$B6AE:2C 17 0F 0E 1B 17 18 1C FF ; Infernos[end-FF] 0x01B6C7|$06:$B6B7:27 0E 0F 0E 17 0C 0E FF ; Defence[end-FF] 0x01B6CF|$06:$B6BF:36 1E 1B 1B 18 1E 17 0D FF ; Surround[end-FF] 0x01B6D8|$06:$B6C8:2B 0E 0A 15 0A 15 15 FF ; Healall[end-FF] 0x01B6E0|$06:$B6D0:28 21 19 15 18 0D 0E 1D FF ; Explodet[end-FF] 0x01B6E9|$06:$B6D9:26 11 0A 17 0C 0E FF ; Chance[end-FF] 0x01B6F0|$06:$B6E0:2B 0E 0A 15 16 18 1B 0E FF ; Healmore[end-FF] 0x01B6F9|$06:$B6E9:35 0E 19 0E 15 FF ; Repel[end-FF] 0x01B6FF|$06:$B6EF:24 17 1D 12 0D 18 1D 0E FF ; Antidote[end-FF] 0x01B708|$06:$B6F8:2B 0E 0A 15 0A 15 15 FF ; Healall[end-FF] 0x01B710|$06:$B700:32 1E 1D 1C 12 0D 0E FF ; Outside[end-FF] 0x01B718|$06:$B708:36 1D 0E 19 10 1E 0A 1B 0D FF ; Stepguard[end-FF] 0x01B722|$06:$B712:32 19 0E 17 FF ; Open[end-FF] 0x01B727|$06:$B717:FF ; [end-FF] ; Monster list part 1, line 1 ; indirect data load target (via $8028) 0x01B728|$06:$B718:36 15 12 16 0E FF ; Slime[end-FF] 0x01B72E|$06:$B71E:25 12 10 FF ; Big[end-FF] 0x01B732|$06:$B722:2C 1B 18 17 FF ; Iron[end-FF] 0x01B737|$06:$B727:27 1B 0A 14 0E 0E FF ; Drakee[end-FF] 0x01B73E|$06:$B72E:3A 12 15 0D FF ; Wild[end-FF] 0x01B743|$06:$B733:2B 0E 0A 15 0E 1B FF ; Healer[end-FF] 0x01B74A|$06:$B73A:2A 11 18 1C 1D FF ; Ghost[end-FF] 0x01B750|$06:$B740:25 0A 0B 0B 15 0E FF ; Babble[end-FF] 0x01B757|$06:$B747:24 1B 16 22 FF ; Army[end-FF] 0x01B75C|$06:$B74C:30 0A 10 12 0C 12 0A 17 FF ; Magician[end-FF] 0x01B765|$06:$B755:25 12 10 FF ; Big[end-FF] 0x01B769|$06:$B759:25 12 10 FF ; Big[end-FF] 0x01B76D|$06:$B75D:30 0A 10 12 0C FF ; Magic[end-FF] 0x01B773|$06:$B763:30 0A 10 12 0D 1B 0A 14 0E 0E FF ; Magidrakee[end-FF] 0x01B77E|$06:$B76E:26 0E 17 1D 12 19 18 0D FF ; Centipod[end-FF] 0x01B787|$06:$B777:30 0A 17 5F 32 67 FF ; Man O'[end-FF] 0x01B78E|$06:$B77E:2F 12 23 0A 1B 0D FF ; Lizard[end-FF] 0x01B795|$06:$B785:3D 18 16 0B 12 0E FF ; Zombie[end-FF] 0x01B79C|$06:$B78C:36 16 18 14 0E FF ; Smoke[end-FF] 0x01B7A2|$06:$B792:2A 11 18 1C 1D FF ; Ghost[end-FF] 0x01B7A8|$06:$B798:25 0A 0B 18 18 17 FF ; Baboon[end-FF] 0x01B7AF|$06:$B79F:26 0A 1B 17 12 1F 18 10 FF ; Carnivog[end-FF] 0x01B7B8|$06:$B7A8:30 0E 10 0A 19 0E 0D 0E FF ; Megapede[end-FF] 0x01B7C1|$06:$B7B1:36 0E 0A FF ; Sea[end-FF] 0x01B7C5|$06:$B7B5:30 0E 0D 1E 1C 0A FF ; Medusa[end-FF] 0x01B7CC|$06:$B7BC:28 17 0C 11 0A 17 1D 0E 1B FF ; Enchanter[end-FF] 0x01B7D6|$06:$B7C6:30 1E 0D FF ; Mud[end-FF] 0x01B7DA|$06:$B7CA:30 0A 10 12 0C FF ; Magic[end-FF] 0x01B7E0|$06:$B7D0:27 0E 16 12 10 11 18 1C 1D FF ; Demighost[end-FF] 0x01B7EA|$06:$B7DA:2A 1B 0E 16 15 12 17 FF ; Gremlin[end-FF] 0x01B7F2|$06:$B7E2:33 18 12 1C 18 17 FF ; Poison[end-FF] 0x01B7F9|$06:$B7E9:30 1E 16 16 22 FF ; Mummy[end-FF] 0x01B7FF|$06:$B7EF:2A 18 1B 10 18 17 FF ; Gorgon[end-FF] 0x01B806|$06:$B7F6:36 0A 0B 0E 1B FF ; Saber[end-FF] 0x01B80C|$06:$B7FC:27 1B 0A 10 18 17 FF ; Dragon[end-FF] 0x01B813|$06:$B803:37 12 1D 0A 17 FF ; Titan[end-FF] 0x01B819|$06:$B809:38 17 0D 0E 0A 0D FF ; Undead[end-FF] 0x01B820|$06:$B810:25 0A 1C 12 15 12 1C 14 FF ; Basilisk[end-FF] 0x01B829|$06:$B819:2A 18 18 19 12 FF ; Goopi[end-FF] 0x01B82F|$06:$B81F:32 1B 0C FF ; Orc[end-FF] 0x01B833|$06:$B823:33 1E 19 19 0E 1D FF ; Puppet[end-FF] 0x01B83A|$06:$B82A:30 1E 16 16 22 FF ; Mummy[end-FF] 0x01B840|$06:$B830:28 1F 12 15 FF ; Evil[end-FF] 0x01B845|$06:$B835:2A 0A 1C FF ; Gas[end-FF] 0x01B849|$06:$B839:2B 18 1B 14 FF ; Hork[end-FF] 0x01B84E|$06:$B83E:2B 0A 20 14 FF ; Hawk[end-FF] 0x01B853|$06:$B843:36 18 1B 0C 0E 1B 0E 1B FF ; Sorcerer[end-FF] 0x01B85C|$06:$B84C:30 0E 1D 0A 15 FF ; Metal[end-FF] 0x01B862|$06:$B852:2B 1E 17 1D 0E 1B FF ; Hunter[end-FF] 0x01B869|$06:$B859:28 1F 12 15 FF ; Evil[end-FF] ; Monster list part 2, line 1 ; indirect data load target (via $8034) 0x01B86E|$06:$B85E:2B 12 0B 0A 0B 0A 17 10 18 FF ; Hibabango[end-FF] 0x01B878|$06:$B868:2A 1B 0A 0B 18 18 19 12 FF ; Graboopi[end-FF] 0x01B881|$06:$B871:2A 18 15 0D FF ; Gold[end-FF] 0x01B886|$06:$B876:28 1F 12 15 FF ; Evil[end-FF] 0x01B88B|$06:$B87B:2A 11 18 1E 15 FF ; Ghoul[end-FF] 0x01B891|$06:$B881:39 0A 16 19 12 1B 1E 1C FF ; Vampirus[end-FF] 0x01B89A|$06:$B88A:30 0E 10 0A FF ; Mega[end-FF] 0x01B89F|$06:$B88F:36 0A 0B 0E 1B FF ; Saber[end-FF] 0x01B8A5|$06:$B895:30 0E 1D 0A 15 FF ; Metal[end-FF] 0x01B8AB|$06:$B89B:32 23 20 0A 1B 10 FF ; Ozwarg[end-FF] 0x01B8B2|$06:$B8A2:27 0A 1B 14 FF ; Dark[end-FF] 0x01B8B7|$06:$B8A7:2A 0A 1B 10 18 22 15 0E FF ; Gargoyle[end-FF] 0x01B8C0|$06:$B8B0:32 1B 0C FF ; Orc[end-FF] 0x01B8C4|$06:$B8B4:30 0A 10 12 0C FF ; Magic[end-FF] 0x01B8CA|$06:$B8BA:25 0E 1B 1C 0E 1B 14 0E 1B FF ; Berserker[end-FF] 0x01B8D4|$06:$B8C4:30 0E 1D 0A 15 FF ; Metal[end-FF] 0x01B8DA|$06:$B8CA:2B 0A 1B 10 18 17 67 1C FF ; Hargon's[end-FF] 0x01B8E3|$06:$B8D3:26 22 0C 15 18 19 1C FF ; Cyclops[end-FF] 0x01B8EB|$06:$B8DB:24 1D 1D 0A 0C 14 0B 18 1D FF ; Attackbot[end-FF] 0x01B8F5|$06:$B8E5:2A 1B 0E 0E 17 FF ; Green[end-FF] 0x01B8FB|$06:$B8EB:30 0A 0C 0E FF ; Mace[end-FF] 0x01B900|$06:$B8F0:29 15 0A 16 0E FF ; Flame[end-FF] 0x01B906|$06:$B8F6:36 12 15 1F 0E 1B FF ; Silver[end-FF] 0x01B90D|$06:$B8FD:25 15 12 23 23 0A 1B 0D FF ; Blizzard[end-FF] 0x01B916|$06:$B906:2A 12 0A 17 1D FF ; Giant[end-FF] 0x01B91C|$06:$B90C:2A 18 15 0D FF ; Gold[end-FF] 0x01B921|$06:$B911:25 1E 15 15 20 18 17 10 FF ; Bullwong[end-FF] 0x01B92A|$06:$B91A:24 1D 15 0A 1C FF ; Atlas[end-FF] 0x01B930|$06:$B920:25 0A 23 1E 23 1E FF ; Bazuzu[end-FF] 0x01B937|$06:$B927:3D 0A 1B 15 18 21 FF ; Zarlox[end-FF] 0x01B93E|$06:$B92E:2B 0A 1B 10 18 17 FF ; Hargon[end-FF] 0x01B945|$06:$B935:30 0A 15 1B 18 1D 11 FF ; Malroth[end-FF] 0x01B94D|$06:$B93D:28 17 0E 16 12 0E 1C FF ; Enemies[end-FF] ; Monster list part 1, line 2 ; indirect data load target (via $802A) 0x01B955|$06:$B945:FF ; [end-FF] 0x01B956|$06:$B946:36 15 1E 10 FF ; Slug[end-FF] 0x01B95B|$06:$B94B:24 17 1D FF ; Ant[end-FF] 0x01B95F|$06:$B94F:FF ; [end-FF] 0x01B960|$06:$B950:30 18 1E 1C 0E FF ; Mouse[end-FF] 0x01B966|$06:$B956:FF ; [end-FF] 0x01B967|$06:$B957:30 18 1E 1C 0E FF ; Mouse[end-FF] 0x01B96D|$06:$B95D:FF ; [end-FF] 0x01B96E|$06:$B95E:24 17 1D FF ; Ant[end-FF] 0x01B972|$06:$B962:FF ; [end-FF] 0x01B973|$06:$B963:35 0A 1D FF ; Rat[end-FF] 0x01B977|$06:$B967:26 18 0B 1B 0A FF ; Cobra[end-FF] 0x01B97D|$06:$B96D:24 17 1D FF ; Ant[end-FF] 0x01B981|$06:$B971:FF ; [end-FF] 0x01B982|$06:$B972:FF ; [end-FF] 0x01B983|$06:$B973:3A 0A 1B FF ; War[end-FF] 0x01B987|$06:$B977:29 15 22 FF ; Fly[end-FF] 0x01B98B|$06:$B97B:FF ; [end-FF] 0x01B98C|$06:$B97C:FF ; [end-FF] 0x01B98D|$06:$B97D:35 0A 1D FF ; Rat[end-FF] 0x01B991|$06:$B981:FF ; [end-FF] 0x01B992|$06:$B982:FF ; [end-FF] 0x01B993|$06:$B983:FF ; [end-FF] 0x01B994|$06:$B984:36 15 1E 10 FF ; Slug[end-FF] 0x01B999|$06:$B989:25 0A 15 15 FF ; Ball[end-FF] 0x01B99E|$06:$B98E:FF ; [end-FF] 0x01B99F|$06:$B98F:30 0A 17 FF ; Man[end-FF] 0x01B9A3|$06:$B993:25 0A 0B 18 18 17 FF ; Baboon[end-FF] 0x01B9AA|$06:$B99A:FF ; [end-FF] 0x01B9AB|$06:$B99B:FF ; [end-FF] 0x01B9AC|$06:$B99C:2F 12 15 22 FF ; Lily[end-FF] 0x01B9B1|$06:$B9A1:30 0A 17 FF ; Man[end-FF] 0x01B9B5|$06:$B9A5:FF ; [end-FF] 0x01B9B6|$06:$B9A6:37 12 10 0E 1B FF ; Tiger[end-FF] 0x01B9BC|$06:$B9AC:29 15 22 FF ; Fly[end-FF] 0x01B9C0|$06:$B9B0:37 1B 0E 0E FF ; Tree[end-FF] 0x01B9C5|$06:$B9B5:FF ; [end-FF] 0x01B9C6|$06:$B9B6:FF ; [end-FF] 0x01B9C7|$06:$B9B7:FF ; [end-FF] 0x01B9C8|$06:$B9B8:FF ; [end-FF] 0x01B9C9|$06:$B9B9:30 0A 17 FF ; Man[end-FF] 0x01B9CD|$06:$B9BD:FF ; [end-FF] 0x01B9CE|$06:$B9BE:37 1B 0E 0E FF ; Tree[end-FF] 0x01B9D3|$06:$B9C3:FF ; [end-FF] 0x01B9D4|$06:$B9C4:FF ; [end-FF] 0x01B9D5|$06:$B9C5:30 0A 17 FF ; Man[end-FF] 0x01B9D9|$06:$B9C9:FF ; [end-FF] 0x01B9DA|$06:$B9CA:36 15 12 16 0E FF ; Slime[end-FF] 0x01B9E0|$06:$B9D0:FF ; [end-FF] 0x01B9E1|$06:$B9D1:28 22 0E FF ; Eye[end-FF] ; Monster list part 2, line 2 ; indirect data load target (via $8036) 0x01B9E5|$06:$B9D5:FF ; [end-FF] 0x01B9E6|$06:$B9D6:FF ; [end-FF] 0x01B9E7|$06:$B9D7:32 1B 0C FF ; Orc[end-FF] 0x01B9EB|$06:$B9DB:26 15 18 20 17 FF ; Clown[end-FF] 0x01B9F1|$06:$B9E1:FF ; [end-FF] 0x01B9F2|$06:$B9E2:FF ; [end-FF] 0x01B9F3|$06:$B9E3:2E 17 12 10 11 1D FF ; Knight[end-FF] 0x01B9FA|$06:$B9EA:2F 12 18 17 FF ; Lion[end-FF] 0x01B9FF|$06:$B9EF:2B 1E 17 1D 0E 1B FF ; Hunter[end-FF] 0x01BA06|$06:$B9F6:FF ; [end-FF] 0x01BA07|$06:$B9F7:28 22 0E FF ; Eye[end-FF] 0x01BA0B|$06:$B9FB:FF ; [end-FF] 0x01BA0C|$06:$B9FC:2E 12 17 10 FF ; King[end-FF] 0x01BA11|$06:$BA01:39 0A 16 19 12 1B 1E 1C FF ; Vampirus[end-FF] 0x01BA1A|$06:$BA0A:FF ; [end-FF] 0x01BA1B|$06:$BA0B:25 0A 0B 0B 15 0E FF ; Babble[end-FF] 0x01BA22|$06:$BA12:2E 17 12 10 11 1D FF ; Knight[end-FF] 0x01BA29|$06:$BA19:FF ; [end-FF] 0x01BA2A|$06:$BA1A:FF ; [end-FF] 0x01BA2B|$06:$BA1B:27 1B 0A 10 18 17 FF ; Dragon[end-FF] 0x01BA32|$06:$BA22:30 0A 1C 1D 0E 1B FF ; Master[end-FF] 0x01BA39|$06:$BA29:FF ; [end-FF] 0x01BA3A|$06:$BA2A:25 0A 1D 0B 18 18 17 FF ; Batboon[end-FF] 0x01BA42|$06:$BA32:FF ; [end-FF] 0x01BA43|$06:$BA33:FF ; [end-FF] 0x01BA44|$06:$BA34:25 0A 1D 0B 18 18 17 FF ; Batboon[end-FF] 0x01BA4C|$06:$BA3C:FF ; [end-FF] 0x01BA4D|$06:$BA3D:FF ; [end-FF] 0x01BA4E|$06:$BA3E:FF ; [end-FF] 0x01BA4F|$06:$BA3F:FF ; [end-FF] 0x01BA50|$06:$BA40:FF ; [end-FF] 0x01BA51|$06:$BA41:FF ; [end-FF] 0x01BA52|$06:$BA42:FF ; [end-FF] ; 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 during battle where there is no main COMMAND menu ; completely useless? ; indirect data load target (via $802C) 0x01BA53|$06:$BA43:24 31 5F 5F 0x01BA57|$06:$BA47:27 77 5F 5F 0x01BA5B|$06:$BA4B:77 77 5F 5F 0x01BA5F|$06:$BA4F:77 7C 5F 5F 0x01BA63|$06:$BA53:5F 5F 5F 5F 0x01BA67|$06:$BA57:36 33 5F 5F 0x01BA6B|$06:$BA5B:28 2F 5F 5F 0x01BA6F|$06:$BA5F:2F 7B 5F 7B 0x01BA73|$06:$BA63:5F 5F 5F 5F 0x01BA77|$06:$BA67:2C 37 5F 5F 0x01BA7B|$06:$BA6B:28 30 5F 5F 0x01BA7F|$06:$BA6F:5F 7B 5F 7B 0x01BA83|$06:$BA73:5F 5F 7D 7D 0x01BA87|$06:$BA77:28 34 7D 7D 0x01BA8B|$06:$BA7B:38 2C 7D 7D 0x01BA8F|$06:$BA7F:33 7B 7D 7E ; indirect data load target (via $802E) 0x01BA93|$06:$BA83:77 77 77 77 0x01BA97|$06:$BA87:77 77 77 7C 0x01BA9B|$06:$BA8B:79 77 77 77 0x01BA9F|$06:$BA8F:77 77 7C 7B 0x01BAA3|$06:$BA93:76 5F 5F 5F 0x01BAA7|$06:$BA97:5F 5F 7B 7B 0x01BAAB|$06:$BA9B:7A 7D 7D 7D 0x01BAAF|$06:$BA9F:7D 7D 7E 7B ; data -> code ; indirect control flow target (via $803A) 0x01BAB3|$06:$BAA3:A9 05 LDA #$05 0x01BAB5|$06:$BAA5:85 94 STA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus 0x01BAB7|$06:$BAA7:A5 31 LDA $31 ; current map ID 0x01BAB9|$06:$BAA9:C9 03 CMP #$03 ; Map ID #$03: Midenhall 1F 0x01BABB|$06:$BAAB:F0 01 BEQ $BAAE ; control flow target (from $BAB3, $BAB9, $BABF, $BAC3) 0x01BABD|$06:$BAAD:60 RTS ; control flow target (from $BAAB) 0x01BABE|$06:$BAAE:AD 49 05 LDA $0549 ; NPC #$01 sprite ID 0x01BAC1|$06:$BAB1:C9 FF CMP #$FF 0x01BAC3|$06:$BAB3:F0 F8 BEQ $BAAD 0x01BAC5|$06:$BAB5:A5 17 LDA $17 ; current map Y-pos (1) 0x01BAC7|$06:$BAB7:C9 05 CMP #$05 0x01BAC9|$06:$BAB9:D0 F2 BNE $BAAD 0x01BACB|$06:$BABB:A5 16 LDA $16 ; current map X-pos (1) 0x01BACD|$06:$BABD:C9 0E CMP #$0E 0x01BACF|$06:$BABF:90 EC BCC $BAAD 0x01BAD1|$06:$BAC1:C9 11 CMP #$11 0x01BAD3|$06:$BAC3:B0 E8 BCS $BAAD 0x01BAD5|$06:$BAC5:AD 4B 05 LDA $054B ; NPC #$01 scripted motion high byte 0x01BAD8|$06:$BAC8:C9 7F CMP #$7F 0x01BADA|$06:$BACA:D0 09 BNE $BAD5 ; call to code in a different bank ($0F:$CCF1) 0x01BADC|$06:$BACC: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 0x01BADF|$06:$BACF:82 ; indirect data load target 0x01BAE0|$06:$BAD0:21 ; indirect data load target 0x01BAE1|$06:$BAD1:D5 80 ; $07:$80D5; motion script for Moonbrooke, ending part 1 (turned) ; data -> code 0x01BAE3|$06:$BAD3:90 0A BCC $BADF ; control flow target (from $BACA) ; call to code in a different bank ($0F:$CCF1) 0x01BAE5|$06:$BAD5: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 0x01BAE8|$06:$BAD8:82 ; indirect data load target 0x01BAE9|$06:$BAD9:21 ; indirect data load target 0x01BAEA|$06:$BADA:DB 80 ; $07:$80DB; motion script for Cannock, ending part 1 ; data -> code 0x01BAEC|$06:$BADC:EE 65 05 INC $0565 ; NPC #$05 Y-pos ; control flow target (from $BAD3) ; call to code in a different bank ($0F:$CCF1) 0x01BAEF|$06:$BADF: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 0x01BAF2|$06:$BAE2:81 ; indirect data load target 0x01BAF3|$06:$BAE3:21 ; indirect data load target 0x01BAF4|$06:$BAE4:CF 80 ; $07:$80CF; motion script for Moonbrooke, ending part 1 (not turned) ; data -> code 0x01BAF6|$06:$BAE6:A5 16 LDA $16 ; current map X-pos (1) 0x01BAF8|$06:$BAE8:C9 0E CMP #$0E 0x01BAFA|$06:$BAEA:D0 08 BNE $BAF4 0x01BAFC|$06:$BAEC:EE 5A 05 INC $055A ; NPC #$03 scripted motion low byte 0x01BAFF|$06:$BAEF:CE 5C 05 DEC $055C ; NPC #$04 X-pos 0x01BB02|$06:$BAF2:D0 0A BNE $BAFE ; control flow target (from $BAEA) 0x01BB04|$06:$BAF4:C9 10 CMP #$10 0x01BB06|$06:$BAF6:D0 06 BNE $BAFE 0x01BB08|$06:$BAF8:CE 5A 05 DEC $055A ; NPC #$03 scripted motion low byte 0x01BB0B|$06:$BAFB:EE 5C 05 INC $055C ; NPC #$04 X-pos ; control flow target (from $BAF2, $BAF6) 0x01BB0E|$06:$BAFE:A5 16 LDA $16 ; current map X-pos (1) 0x01BB10|$06:$BB00:18 CLC 0x01BB11|$06:$BB01:6D 44 05 ADC $0544 ; NPC #$01 ? 0x01BB14|$06:$BB04:18 CLC 0x01BB15|$06:$BB05:6D 4C 05 ADC $054C ; NPC #$02 ? 0x01BB18|$06:$BB08:C9 0E CMP #$0E 0x01BB1A|$06:$BB0A:D0 08 BNE $BB14 0x01BB1C|$06:$BB0C:CE 62 05 DEC $0562 ; NPC #$04 scripted motion low byte 0x01BB1F|$06:$BB0F:CE 64 05 DEC $0564 ; NPC #$05 X-pos 0x01BB22|$06:$BB12:D0 0A BNE $BB1E ; control flow target (from $BB0A) 0x01BB24|$06:$BB14:C9 10 CMP #$10 0x01BB26|$06:$BB16:D0 06 BNE $BB1E 0x01BB28|$06:$BB18:EE 62 05 INC $0562 ; NPC #$04 scripted motion low byte 0x01BB2B|$06:$BB1B:EE 64 05 INC $0564 ; NPC #$05 X-pos ; control flow target (from $BB12, $BB16) 0x01BB2E|$06:$BB1E:A9 00 LDA #$00 0x01BB30|$06:$BB20:A8 TAY ; control flow target (from $BB27) 0x01BB31|$06:$BB21:99 42 05 STA $0542,Y ; NPC #$00 ? 0x01BB34|$06:$BB24:C8 INY 0x01BB35|$06:$BB25:C0 10 CPY #$10 0x01BB37|$06:$BB27:D0 F8 BNE $BB21 0x01BB39|$06:$BB29:A9 FF LDA #$FF 0x01BB3B|$06:$BB2B:8D 49 05 STA $0549 ; NPC #$01 sprite ID 0x01BB3E|$06:$BB2E:8D 51 05 STA $0551 ; NPC #$02 sprite ID 0x01BB41|$06:$BB31:A2 01 LDX #$01 0x01BB43|$06:$BB33:8E 61 05 STX $0561 ; NPC #$04 sprite ID 0x01BB46|$06:$BB36:E8 INX 0x01BB47|$06:$BB37:8E 69 05 STX $0569 ; NPC #$05 sprite ID ; call to code in a different bank ($0F:$CCD2) 0x01BB4A|$06:$BB3A:4C D2 CC JMP $CCD2 ; execute scripted motion ; indirect control flow target (via $8038) ; call to code in a different bank ($0F:$CD26) 0x01BB4D|$06:$BB3D: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 0x01BB50|$06:$BB40:0F ; indirect data load target 0x01BB51|$06:$BB41:03 ; data -> code 0x01BB52|$06:$BB42:F0 01 BEQ $BB45 0x01BB54|$06:$BB44:60 RTS ; control flow target (from $BB42) 0x01BB55|$06:$BB45:A9 FF LDA #$FF 0x01BB57|$06:$BB47:85 35 STA $35 ; flag indicating whether any menu is currently open 0x01BB59|$06:$BB49:A9 46 LDA #$46 0x01BB5B|$06:$BB4B:8D 2C 06 STA $062C ; current battle message delay ; call to code in a different bank ($0F:$EB76) 0x01BB5E|$06:$BB4E:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x01BB61|$06:$BB51:04 ; Menu ID #$04: Dialogue window ; data -> code 0x01BB62|$06:$BB52:A9 00 LDA #$00 ; call to code in a different bank ($0F:$FC50) 0x01BB64|$06:$BB54:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01BB67|$06:$BB57:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01BB6A|$06:$BB5A:B5 ; String ID #$01B5: ‘[name], thou art of the line of Erdrick and have proven thy heritage by thy deeds[.’][wait][end-FC] ; data -> code ; control flow target (from $BB6B) ; call to code in a different bank ($0F:$FA2E) 0x01BB6B|$06:$BB5B:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01BB6E|$06:$BB5E:B6 ; String ID #$01B6: ‘Now is the time for thee to take the throne. Will it be so?’[FD][FD][end-FC] ; data -> code ; call to code in a different bank ($0F:$EB76) 0x01BB6F|$06:$BB5F:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x01BB72|$06:$BB62:19 ; Menu ID #$19: General menu: YES/NO ; data -> code 0x01BB73|$06:$BB63:C9 00 CMP #$00 0x01BB75|$06:$BB65:F0 07 BEQ $BB6E ; call to code in a different bank ($0F:$FA2E) 0x01BB77|$06:$BB67:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01BB7A|$06:$BB6A:B7 ; String ID #$01B7: ‘Be careful, [name]. Do not be selfish[.’][wait][end-FC] ; data -> code 0x01BB7B|$06:$BB6B:4C 5B BB JMP $BB5B ; control flow target (from $BB65) 0x01BB7E|$06:$BB6E:A9 01 LDA #$01 ; call to code in a different bank ($0F:$FC50) 0x01BB80|$06:$BB70:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01BB83|$06:$BB73:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01BB86|$06:$BB76:B8 ; String ID #$01B8: ‘Hail all to the new monarch of Midenhall!’[wait][line]‘Now, [name], Prince of Cannock, come forth[.’][wait][end-FC] ; data -> code 0x01BB87|$06:$BB77:A9 02 LDA #$02 ; call to code in a different bank ($0F:$FC50) 0x01BB89|$06:$BB79:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01BB8C|$06:$BB7C:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01BB8F|$06:$BB7F:BC ; String ID #$01BC: ‘[name], Princess of Moonbrooke, come forth[.’][end-FC] ; data -> code ; call to code in a different bank ($0F:$D0F5) 0x01BB90|$06:$BB80:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 ; call to code in a different bank ($0F:$CCF1) 0x01BB93|$06:$BB83: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 0x01BB96|$06:$BB86:85 ; indirect data load target 0x01BB97|$06:$BB87:20 ; indirect data load target 0x01BB98|$06:$BB88:BE 80 ; $07:$80BE; motion script for top 2 guards, ending part 2 ; data -> code ; call to code in a different bank ($0F:$CCF1) 0x01BB9A|$06:$BB8A: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 0x01BB9D|$06:$BB8D:84 ; indirect data load target 0x01BB9E|$06:$BB8E:20 ; indirect data load target 0x01BB9F|$06:$BB8F:BE 80 ; $07:$80BE; motion script for top 2 guards, ending part 2 ; data -> code ; call to code in a different bank ($0F:$CCE7) 0x01BBA1|$06:$BB91:20 E7 CC JSR $CCE7 0x01BBA4|$06:$BB94:20 38 BC JSR $BC38 ; call to code in a different bank ($0F:$CCF1) 0x01BBA7|$06:$BB97: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 0x01BBAA|$06:$BB9A:82 ; indirect data load target 0x01BBAB|$06:$BB9B:20 ; indirect data load target 0x01BBAC|$06:$BB9C:55 80 ; $07:$8055; motion script for Cannock and Moonbrooke, ending part 3, dog in Zahan, triggered from right ; data -> code ; call to code in a different bank ($0F:$CCF1) 0x01BBAE|$06:$BB9E: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 0x01BBB1|$06:$BBA1:81 ; indirect data load target 0x01BBB2|$06:$BBA2:20 ; indirect data load target 0x01BBB3|$06:$BBA3:55 80 ; $07:$8055; motion script for Cannock and Moonbrooke, ending part 3, dog in Zahan, triggered from right ; data -> code ; call to code in a different bank ($0F:$CCE7) 0x01BBB5|$06:$BBA5:20 E7 CC JSR $CCE7 0x01BBB8|$06:$BBA8:20 38 BC JSR $BC38 ; call to code in a different bank ($0F:$EB76) 0x01BBBB|$06:$BBAB:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x01BBBE|$06:$BBAE:04 ; Menu ID #$04: Dialogue window ; data -> code ; call to code in a different bank ($0F:$FA2E) 0x01BBBF|$06:$BBAF:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01BBC2|$06:$BBB2:B9 ; String ID #$01B9: ‘This charge I lay on the three heroes, that for evermore they guard against evil[.’][end-FC] ; data -> code ; call to code in a different bank ($0F:$D0F5) 0x01BBC3|$06:$BBB3:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x01BBC6|$06:$BBB6:A0 38 LDY #$38 ; control flow target (from $BBC2) 0x01BBC8|$06:$BBB8:A9 02 LDA #$02 0x01BBCA|$06:$BBBA:99 78 05 STA $0578,Y ; NPC #$07 motion nybble + direction nybble 0x01BBCD|$06:$BBBD:98 TYA 0x01BBCE|$06:$BBBE:38 SEC 0x01BBCF|$06:$BBBF:E9 08 SBC #$08 0x01BBD1|$06:$BBC1:A8 TAY 0x01BBD2|$06:$BBC2:10 F4 BPL $BBB8 ; call to code in a different bank ($0F:$CF64) 0x01BBD4|$06:$BBC4:20 64 CF JSR $CF64 0x01BBD7|$06:$BBC7:20 38 BC JSR $BC38 ; call to code in a different bank ($0F:$EB76) 0x01BBDA|$06:$BBCA:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x01BBDD|$06:$BBCD:04 ; Menu ID #$04: Dialogue window ; data -> code 0x01BBDE|$06:$BBCE:A9 00 LDA #$00 ; call to code in a different bank ($0F:$FC50) 0x01BBE0|$06:$BBD0:20 50 FC JSR $FC50 ; print name of hero given by low 2 bits of A to $6119, terminated by #$FA ; call to code in a different bank ($0F:$FA2E) 0x01BBE3|$06:$BBD3:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01BBE6|$06:$BBD6:BA ; String ID #$01BA: ‘Three cheers for the new monarch of Midenhall![line]Hip-hip-hooray!’[end-FC] ; data -> code ; call to code in a different bank ($0F:$D0F5) 0x01BBE7|$06:$BBD7:20 F5 D0 JSR $D0F5 ; wait for a while and then wipe menu regions #$03, #$00, and #$01 0x01BBEA|$06:$BBDA:A9 01 LDA #$01 0x01BBEC|$06:$BBDC:8D 68 05 STA $0568 ; NPC #$05 motion nybble + direction nybble 0x01BBEF|$06:$BBDF:20 2D BC JSR $BC2D 0x01BBF2|$06:$BBE2:A9 02 LDA #$02 0x01BBF4|$06:$BBE4:8D 68 05 STA $0568 ; NPC #$05 motion nybble + direction nybble 0x01BBF7|$06:$BBE7:20 2D BC JSR $BC2D 0x01BBFA|$06:$BBEA:A2 0A LDX #$0A ; call to code in a different bank ($0F:$C1EE) 0x01BBFC|$06:$BBEC:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x01BBFF|$06:$BBEF:A9 03 LDA #$03 0x01BC01|$06:$BBF1:8D 60 05 STA $0560 ; NPC #$04 motion nybble + direction nybble 0x01BC04|$06:$BBF4:20 2D BC JSR $BC2D 0x01BC07|$06:$BBF7:A9 02 LDA #$02 0x01BC09|$06:$BBF9:8D 60 05 STA $0560 ; NPC #$04 motion nybble + direction nybble 0x01BC0C|$06:$BBFC:20 2D BC JSR $BC2D 0x01BC0F|$06:$BBFF:20 34 BC JSR $BC34 0x01BC12|$06:$BC02:A9 01 LDA #$01 0x01BC14|$06:$BC04:8D 40 05 STA $0540 ; NPC #$00 ? + direction nybble 0x01BC17|$06:$BC07:20 2D BC JSR $BC2D 0x01BC1A|$06:$BC0A:A9 02 LDA #$02 0x01BC1C|$06:$BC0C:8D 40 05 STA $0540 ; NPC #$00 ? + direction nybble 0x01BC1F|$06:$BC0F:20 2D BC JSR $BC2D 0x01BC22|$06:$BC12:20 34 BC JSR $BC34 0x01BC25|$06:$BC15:A9 19 LDA #$19 ; Music ID #$19: end credits BGM ; call to code in a different bank ($0F:$C561) 0x01BC27|$06:$BC17:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) 0x01BC2A|$06:$BC1A:20 38 BC JSR $BC38 0x01BC2D|$06:$BC1D:A9 FF LDA #$FF ; SLOW 0x01BC2F|$06:$BC1F:8D 2C 06 STA $062C ; current battle message delay ; call to code in a different bank ($0F:$EB76) 0x01BC32|$06:$BC22:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x01BC35|$06:$BC25:04 ; Menu ID #$04: Dialogue window ; data -> code ; call to code in a different bank ($0F:$FA2E) 0x01BC36|$06:$BC26:20 2E FA JSR $FA2E ; display string ID specified by next byte + #$0100 ; code -> data ; indirect data load target 0x01BC39|$06:$BC29:93 ; String ID #$0193: ‘Then peace returned[.’][end-FC] ; data -> code ; call to code in a different bank ($0F:$D343) 0x01BC3A|$06:$BC2A:4C 43 D3 JMP $D343 ; control flow target (from $BBDF, $BBE7, $BBF4, $BBFC, $BC07, $BC0F) ; call to code in a different bank ($0F:$CF64) 0x01BC3D|$06:$BC2D:20 64 CF JSR $CF64 0x01BC40|$06:$BC30:A2 0A LDX #$0A 0x01BC42|$06:$BC32:D0 06 BNE $BC3A ; control flow target (from $BBFF, $BC12) 0x01BC44|$06:$BC34:A2 1E LDX #$1E 0x01BC46|$06:$BC36:D0 02 BNE $BC3A ; control flow target (from $BB94, $BBA8, $BBC7, $BC1A) 0x01BC48|$06:$BC38:A2 3C LDX #$3C ; control flow target (from $BC32, $BC36) ; call to code in a different bank ($0F:$C1EE) 0x01BC4A|$06:$BC3A:4C EE C1 JMP $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF ; indirect control flow target (via $803E) 0x01BC4D|$06:$BC3D:A2 3D LDX #$3D ; control flow target (from $BC46) 0x01BC4F|$06:$BC3F:BD 4F BC LDA $BC4F,X ; code copied to and executed in RAM 0x01BC52|$06:$BC42:9D 00 04 STA $0400,X ; menu-based palette overrides start 0x01BC55|$06:$BC45:CA DEX 0x01BC56|$06:$BC46:10 F7 BPL $BC3F 0x01BC58|$06:$BC48:AD F6 05 LDA $05F6 ; current bank 0x01BC5B|$06:$BC4B:48 PHA ; call to code in RAM 0x01BC5C|$06:$BC4C:4C 33 04 JMP $0433 ; code copied to and executed in RAM ; control flow target (from $BC8B) ; indexed data load target (from $BC3F) 0x01BC5F|$06:$BC4F:AC F6 05 LDY $05F6 ; current bank 0x01BC62|$06:$BC52:C8 INY 0x01BC63|$06:$BC53:98 TYA 0x01BC64|$06:$BC54:29 07 AND #$07 0x01BC66|$06:$BC56:48 PHA 0x01BC67|$06:$BC57:A6 43 LDX $43 0x01BC69|$06:$BC59:E0 03 CPX #$03 0x01BC6B|$06:$BC5B:D0 09 BNE $BC66 ; call to code in a different bank ($0F:$C476) 0x01BC6D|$06:$BC5D:20 76 C4 JSR $C476 ; read joypad 1 data into $2F 0x01BC70|$06:$BC60:46 2F LSR $2F ; joypad 1 data 0x01BC72|$06:$BC62:A6 43 LDX $43 0x01BC74|$06:$BC64:90 1E BCC $BC84 ; control flow target (from $BC5B) 0x01BC76|$06:$BC66:E8 INX 0x01BC77|$06:$BC67:E0 14 CPX #$14 0x01BC79|$06:$BC69:90 19 BCC $BC84 ; call to code in a different bank ($0F:$C3AB) 0x01BC7B|$06:$BC6B:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x01BC7E|$06:$BC6E:A5 32 LDA $32 ; RNG byte 0 0x01BC80|$06:$BC70:29 24 AND #$24 0x01BC82|$06:$BC72:D0 10 BNE $BC84 ; control flow target (from $BC79) ; call to code in a different bank ($0F:$C476) 0x01BC84|$06:$BC74:20 76 C4 JSR $C476 ; read joypad 1 data into $2F 0x01BC87|$06:$BC77:46 2F LSR $2F ; joypad 1 data 0x01BC89|$06:$BC79:90 F9 BCC $BC74 ; control flow target (from $BC80) ; call to code in a different bank ($0F:$C476) 0x01BC8B|$06:$BC7B:20 76 C4 JSR $C476 ; read joypad 1 data into $2F 0x01BC8E|$06:$BC7E:46 2F LSR $2F ; joypad 1 data 0x01BC90|$06:$BC80:B0 F9 BCS $BC7B 0x01BC92|$06:$BC82:A2 03 LDX #$03 ; control flow target (from $BC64, $BC69, $BC72) 0x01BC94|$06:$BC84:68 PLA ; call to code in a different bank ($0F:$C3D5) 0x01BC95|$06:$BC85: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 ($0F:$C1EE) 0x01BC98|$06:$BC88:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x01BC9B|$06:$BC8B:F0 C2 BEQ $BC4F ; code copied to and executed in RAM ; indirect control flow target (via $8040) 0x01BC9D|$06:$BC8D:A5 17 LDA $17 ; current map Y-pos (1) 0x01BC9F|$06:$BC8F:C9 07 CMP #$07 0x01BCA1|$06:$BC91:F0 01 BEQ $BC94 0x01BCA3|$06:$BC93:60 RTS ; control flow target (from $BC91) 0x01BCA4|$06:$BC94:A0 50 LDY #$50 0x01BCA6|$06:$BC96:A9 00 LDA #$00 ; control flow target (from $BC9E) 0x01BCA8|$06:$BC98:99 3A 05 STA $053A,Y 0x01BCAB|$06:$BC9B:C8 INY 0x01BCAC|$06:$BC9C:C0 68 CPY #$68 0x01BCAE|$06:$BC9E:D0 F8 BNE $BC98 0x01BCB0|$06:$BCA0:A9 FF LDA #$FF 0x01BCB2|$06:$BCA2:8D 91 05 STA $0591 ; NPC #$0A sprite ID 0x01BCB5|$06:$BCA5:8D 99 05 STA $0599 ; NPC #$0B sprite ID 0x01BCB8|$06:$BCA8:8D A1 05 STA $05A1 ; NPC #$0C sprite ID 0x01BCBB|$06:$BCAB:A5 16 LDA $16 ; current map X-pos (1) 0x01BCBD|$06:$BCAD:8D 8C 05 STA $058C ; NPC #$0A X-pos 0x01BCC0|$06:$BCB0:8D 94 05 STA $0594 ; NPC #$0B X-pos 0x01BCC3|$06:$BCB3:CE 94 05 DEC $0594 ; NPC #$0B X-pos 0x01BCC6|$06:$BCB6:8D 9C 05 STA $059C ; NPC #$0C X-pos 0x01BCC9|$06:$BCB9:EE 9C 05 INC $059C ; NPC #$0C X-pos 0x01BCCC|$06:$BCBC:A5 17 LDA $17 ; current map Y-pos (1) 0x01BCCE|$06:$BCBE:8D 8D 05 STA $058D ; NPC #$0A Y-pos 0x01BCD1|$06:$BCC1:EE 8D 05 INC $058D ; NPC #$0A Y-pos 0x01BCD4|$06:$BCC4:8D 95 05 STA $0595 ; NPC #$0B Y-pos 0x01BCD7|$06:$BCC7:8D 9D 05 STA $059D ; NPC #$0C Y-pos 0x01BCDA|$06:$BCCA:A9 04 LDA #$04 0x01BCDC|$06:$BCCC:8D 91 05 STA $0591 ; NPC #$0A sprite ID 0x01BCDF|$06:$BCCF:20 6C BD JSR $BD6C 0x01BCE2|$06:$BCD2:8D 99 05 STA $0599 ; NPC #$0B sprite ID 0x01BCE5|$06:$BCD5:20 6C BD JSR $BD6C 0x01BCE8|$06:$BCD8:8D A1 05 STA $05A1 ; NPC #$0C sprite ID 0x01BCEB|$06:$BCDB:20 6C BD JSR $BD6C 0x01BCEE|$06:$BCDE:20 7C BD JSR $BD7C 0x01BCF1|$06:$BCE1:20 7C BD JSR $BD7C 0x01BCF4|$06:$BCE4:A9 0A LDA #$0A 0x01BCF6|$06:$BCE6:85 D0 STA $D0 ; Malroth status flag (#$FF = defeated, #$00 = alive, others = countdown to battle) ; control flow target (from $BD23) ; call to code in a different bank ($0F:$C3AB) 0x01BCF8|$06:$BCE8:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x01BCFB|$06:$BCEB:A5 32 LDA $32 ; RNG byte 0 0x01BCFD|$06:$BCED:29 0E AND #$0E 0x01BCFF|$06:$BCEF:38 SEC 0x01BD00|$06:$BCF0:E9 08 SBC #$08 0x01BD02|$06:$BCF2:85 18 STA $18 ; call to code in a different bank ($0F:$C3AB) 0x01BD04|$06:$BCF4:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x01BD07|$06:$BCF7:A5 32 LDA $32 ; RNG byte 0 0x01BD09|$06:$BCF9:29 0E AND #$0E 0x01BD0B|$06:$BCFB:38 SEC 0x01BD0C|$06:$BCFC:E9 08 SBC #$08 0x01BD0E|$06:$BCFE:85 19 STA $19 0x01BD10|$06:$BD00:A9 00 LDA #$00 0x01BD12|$06:$BD02:85 1C STA $1C 0x01BD14|$06:$BD04:85 1E STA $1E 0x01BD16|$06:$BD06:A9 87 LDA #$87 ; Music ID #$87: hit 2 SFX ; call to code in a different bank ($0F:$C561) 0x01BD18|$06:$BD08:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) ; call to code in a different bank ($0F:$D325) 0x01BD1B|$06:$BD0B:20 25 D3 JSR $D325 ; call to code in a different bank ($0F:$C3AB) 0x01BD1E|$06:$BD0E:20 AB C3 JSR $C3AB ; generate a random number and store it in $32-$33 (two passes) 0x01BD21|$06:$BD11:A5 32 LDA $32 ; RNG byte 0 0x01BD23|$06:$BD13:29 07 AND #$07 0x01BD25|$06:$BD15:D0 06 BNE $BD1D ; call to code in a different bank ($0F:$C511) 0x01BD27|$06:$BD17:20 11 C5 JSR $C511 ; flash screen 5 times 0x01BD2A|$06:$BD1A:4C 21 BD JMP $BD21 ; control flow target (from $BD15) 0x01BD2D|$06:$BD1D:AA TAX ; call to code in a different bank ($0F:$C1EE) 0x01BD2E|$06:$BD1E:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF ; control flow target (from $BD1A) 0x01BD31|$06:$BD21:C6 D0 DEC $D0 ; Malroth status flag (#$FF = defeated, #$00 = alive, others = countdown to battle) 0x01BD33|$06:$BD23:D0 C3 BNE $BCE8 ; control flow target (from $BD31) 0x01BD35|$06:$BD25:A9 94 LDA #$94 ; Music ID #$94: burning SFX ; call to code in a different bank ($0F:$C561) 0x01BD37|$06:$BD27:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) ; call to code in a different bank ($0F:$D200) 0x01BD3A|$06:$BD2A:20 00 D2 JSR $D200 0x01BD3D|$06:$BD2D:A5 98 LDA $98 ; outcome of last fight? 0x01BD3F|$06:$BD2F:C9 FE CMP #$FE 0x01BD41|$06:$BD31:90 F2 BCC $BD25 0x01BD43|$06:$BD33:A9 06 LDA #$06 0x01BD45|$06:$BD35:85 94 STA $94 ; return bank for various function calls, doubles as index of selected option for multiple-choice menus ; call to code in a different bank ($0F:$FA32) 0x01BD47|$06:$BD37:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01BD4A|$06:$BD3A:E8 ; String ID #$02E8: [wait]‘Thou hast delivered the world from Malroth's evil[.’][wait][line]‘Great is the victory and greater the rewards[.’][wait][line]‘I, Rubiss, have watched thy struggles and I am proud of thee[.’][end-FC] ; data -> code ; call to code in a different bank ($0F:$C515) 0x01BD4B|$06:$BD3B:20 15 C5 JSR $C515 ; flash screen 10 times ; call to code in a different bank ($0F:$C515) 0x01BD4E|$06:$BD3E:20 15 C5 JSR $C515 ; flash screen 10 times 0x01BD51|$06:$BD41:A9 84 LDA #$84 0x01BD53|$06:$BD43:8D 2D 06 STA $062D ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01BD56|$06:$BD46:8D 3F 06 STA $063F ; Cannock status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01BD59|$06:$BD49:8D 51 06 STA $0651 ; Moonbrooke status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) ; call to code in a different bank ($0F:$C77B) 0x01BD5C|$06:$BD4C:20 7B C7 JSR $C77B ; restore full HP/MP to all living party members ; call to code in a different bank ($0F:$EB76) 0x01BD5F|$06:$BD4F:20 76 EB JSR $EB76 ; open menu specified by next byte ; code -> data ; indirect data load target 0x01BD62|$06:$BD52:01 ; Menu ID #$04: Mini status window, top ; data -> code ; call to code in a different bank ($0F:$C22C) 0x01BD63|$06:$BD53:20 2C C2 JSR $C22C ; call to code in a different bank ($0F:$FA32) 0x01BD66|$06:$BD56:20 32 FA JSR $FA32 ; display string ID specified by next byte + #$0200 ; code -> data ; indirect data load target 0x01BD69|$06:$BD59:E9 ; String ID #$02E9: [wait]‘Go now!’[end-FC] ; data -> code 0x01BD6A|$06:$BD5A:A9 FF LDA #$FF 0x01BD6C|$06:$BD5C:85 D0 STA $D0 ; Malroth status flag (#$FF = defeated, #$00 = alive, others = countdown to battle) 0x01BD6E|$06:$BD5E: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) 0x01BD70|$06:$BD60:A2 01 LDX #$01 ; call to code in a different bank ($0F:$D2F1) 0x01BD72|$06:$BD62:20 F1 D2 JSR $D2F1 0x01BD75|$06:$BD65:A9 00 LDA #$00 0x01BD77|$06:$BD67:85 8E STA $8E ; flag for in battle or not (#$FF)? ; call to code in a different bank ($0F:$D88F) 0x01BD79|$06:$BD69:4C 8F D8 JMP $D88F ; warp to warp point given by ($0C) ; control flow target (from $BCCF, $BCD5, $BCDB) 0x01BD7C|$06:$BD6C:A9 91 LDA #$91 ; Music ID #$91: swamp SFX ; call to code in a different bank ($0F:$C561) 0x01BD7E|$06:$BD6E:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) ; call to code in a different bank ($0F:$D32E) 0x01BD81|$06:$BD71:20 2E D3 JSR $D32E 0x01BD84|$06:$BD74:A2 28 LDX #$28 ; call to code in a different bank ($0F:$C1EE) 0x01BD86|$06:$BD76:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x01BD89|$06:$BD79:A9 04 LDA #$04 0x01BD8B|$06:$BD7B:60 RTS ; control flow target (from $BCDE, $BCE1) 0x01BD8C|$06:$BD7C:A9 94 LDA #$94 ; Music ID #$94: burning SFX ; call to code in a different bank ($0F:$C561) 0x01BD8E|$06:$BD7E:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) ; call to code in a different bank ($0F:$C511) 0x01BD91|$06:$BD81:20 11 C5 JSR $C511 ; flash screen 5 times 0x01BD94|$06:$BD84:A2 11 LDX #$11 ; call to code in a different bank ($0F:$C1EE) 0x01BD96|$06:$BD86:20 EE C1 JSR $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF 0x01BD99|$06:$BD89:A9 94 LDA #$94 ; Music ID #$94: burning SFX ; call to code in a different bank ($0F:$C561) 0x01BD9B|$06:$BD8B:20 61 C5 JSR $C561 ; play PCM specified by A (>= #$80 = sound effect [SFX], < #$80 = background music [BGM]) ; call to code in a different bank ($0F:$C511) 0x01BD9E|$06:$BD8E:20 11 C5 JSR $C511 ; flash screen 5 times 0x01BDA1|$06:$BD91:A2 32 LDX #$32 ; call to code in a different bank ($0F:$C1EE) 0x01BDA3|$06:$BD93:4C EE C1 JMP $C1EE ; set $6007 = #$00, set $00 = #$01, wait for X interrupts, set $00 = #$FF ; indirect control flow target (via $8044) 0x01BDA6|$06:$BD96:AD AD 61 LDA $61AD 0x01BDA9|$06:$BD99:D0 51 BNE $BDEC 0x01BDAB|$06:$BD9B:A9 FF LDA #$FF 0x01BDAD|$06:$BD9D:8D 41 05 STA $0541 ; NPC #$00 sprite ID 0x01BDB0|$06:$BDA0:8D 49 05 STA $0549 ; NPC #$01 sprite ID 0x01BDB3|$06:$BDA3:8D 51 05 STA $0551 ; NPC #$02 sprite ID 0x01BDB6|$06:$BDA6:A5 CF LDA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x01BDB8|$06:$BDA8:29 04 AND #$04 0x01BDBA|$06:$BDAA:F0 07 BEQ $BDB3 0x01BDBC|$06:$BDAC:A9 05 LDA #$05 0x01BDBE|$06:$BDAE:8D 41 05 STA $0541 ; NPC #$00 sprite ID 0x01BDC1|$06:$BDB1:D0 13 BNE $BDC6 ; control flow target (from $BDAA) 0x01BDC3|$06:$BDB3:A2 07 LDX #$07 0x01BDC5|$06:$BDB5:A9 84 LDA #$84 0x01BDC7|$06:$BDB7:85 0E STA $0E 0x01BDC9|$06:$BDB9:20 ED BD JSR $BDED 0x01BDCC|$06:$BDBC:A9 04 LDA #$04 0x01BDCE|$06:$BDBE:85 0E STA $0E 0x01BDD0|$06:$BDC0:20 ED BD JSR $BDED 0x01BDD3|$06:$BDC3:20 10 BE JSR $BE10 ; control flow target (from $BDB1) 0x01BDD6|$06:$BDC6:A0 00 LDY #$00 ; control flow target (from $BDEA) 0x01BDD8|$06:$BDC8:B9 41 05 LDA $0541,Y ; NPC #$00 sprite ID 0x01BDDB|$06:$BDCB:C9 FF CMP #$FF 0x01BDDD|$06:$BDCD:D0 14 BNE $BDE3 0x01BDDF|$06:$BDCF:A9 00 LDA #$00 0x01BDE1|$06:$BDD1:99 3A 05 STA $053A,Y 0x01BDE4|$06:$BDD4:99 3B 05 STA $053B,Y 0x01BDE7|$06:$BDD7:99 3C 05 STA $053C,Y ; NPC #$00 ? 0x01BDEA|$06:$BDDA:99 3D 05 STA $053D,Y ; NPC #$00 ? 0x01BDED|$06:$BDDD:99 3E 05 STA $053E,Y ; NPC #$00 ? 0x01BDF0|$06:$BDE0:99 3F 05 STA $053F,Y ; NPC #$00 ? ; control flow target (from $BDCD) 0x01BDF3|$06:$BDE3:98 TYA 0x01BDF4|$06:$BDE4:18 CLC 0x01BDF5|$06:$BDE5:69 08 ADC #$08 0x01BDF7|$06:$BDE7:A8 TAY 0x01BDF8|$06:$BDE8:C9 18 CMP #$18 0x01BDFA|$06:$BDEA:D0 DC BNE $BDC8 ; control flow target (from $BD99) 0x01BDFC|$06:$BDEC:60 RTS ; control flow target (from $BDB9, $BDC0) 0x01BDFD|$06:$BDED:A0 00 LDY #$00 0x01BDFF|$06:$BDEF:84 0C STY $0C ; control flow target (from $BE0D) 0x01BE01|$06:$BDF1:B9 2D 06 LDA $062D,Y ; Midenhall status (80 = Alive, 40 = Sleep, 20 = Poison, 10 = ?, 08 = ?, 04 = In Party, 02 = Surround, 01 = Silence) 0x01BE04|$06:$BDF4:29 84 AND #$84 0x01BE06|$06:$BDF6:C5 0E CMP $0E 0x01BE08|$06:$BDF8:D0 0A BNE $BE04 0x01BE0A|$06:$BDFA:A5 0C LDA $0C 0x01BE0C|$06:$BDFC:9D 3A 05 STA $053A,X 0x01BE0F|$06:$BDFF:8A TXA 0x01BE10|$06:$BE00:18 CLC 0x01BE11|$06:$BE01:69 08 ADC #$08 0x01BE13|$06:$BE03:AA TAX ; control flow target (from $BDF8) 0x01BE14|$06:$BE04:E6 0C INC $0C 0x01BE16|$06:$BE06:98 TYA 0x01BE17|$06:$BE07:18 CLC 0x01BE18|$06:$BE08:69 12 ADC #$12 0x01BE1A|$06:$BE0A:A8 TAY 0x01BE1B|$06:$BE0B:C9 36 CMP #$36 0x01BE1D|$06:$BE0D:D0 E2 BNE $BDF1 0x01BE1F|$06:$BE0F:60 RTS ; control flow target (from $BDC3) 0x01BE20|$06:$BE10:A5 45 LDA $45 0x01BE22|$06:$BE12:C9 FF CMP #$FF 0x01BE24|$06:$BE14:D0 01 BNE $BE17 0x01BE26|$06:$BE16:60 RTS ; control flow target (from $BE14) 0x01BE27|$06:$BE17:C9 00 CMP #$00 0x01BE29|$06:$BE19:D0 08 BNE $BE23 0x01BE2B|$06:$BE1B:A9 02 LDA #$02 ; control flow target (from $BE57, $BE5F, $BE67, $BE6F) 0x01BE2D|$06:$BE1D:8D 40 05 STA $0540 ; NPC #$00 ? + direction nybble 0x01BE30|$06:$BE20:4C 27 BE JMP $BE27 ; control flow target (from $BE19) 0x01BE33|$06:$BE23:C9 01 CMP #$01 0x01BE35|$06:$BE25:D0 2A BNE $BE51 ; control flow target (from $BE20) 0x01BE37|$06:$BE27:AD 3A 05 LDA $053A 0x01BE3A|$06:$BE2A:8D 42 05 STA $0542 ; NPC #$00 ? 0x01BE3D|$06:$BE2D:8D 4A 05 STA $054A ; NPC #$01 scripted motion low byte 0x01BE40|$06:$BE30:AD 3B 05 LDA $053B 0x01BE43|$06:$BE33:8D 43 05 STA $0543 ; NPC #$00 ? 0x01BE46|$06:$BE36:8D 4B 05 STA $054B ; NPC #$01 scripted motion high byte 0x01BE49|$06:$BE39:AD 40 05 LDA $0540 ; NPC #$00 ? + direction nybble 0x01BE4C|$06:$BE3C:8D 48 05 STA $0548 ; NPC #$01 ? + direction nybble 0x01BE4F|$06:$BE3F:8D 50 05 STA $0550 ; NPC #$02 ? + direction nybble 0x01BE52|$06:$BE42:A9 00 LDA #$00 0x01BE54|$06:$BE44:8D 44 05 STA $0544 ; NPC #$01 ? 0x01BE57|$06:$BE47:8D 45 05 STA $0545 ; NPC #$01 ? 0x01BE5A|$06:$BE4A:8D 4C 05 STA $054C ; NPC #$02 ? 0x01BE5D|$06:$BE4D:8D 4D 05 STA $054D ; NPC #$02 ? 0x01BE60|$06:$BE50:60 RTS ; control flow target (from $BE25) 0x01BE61|$06:$BE51:C9 03 CMP #$03 0x01BE63|$06:$BE53:D0 04 BNE $BE59 0x01BE65|$06:$BE55:A9 03 LDA #$03 0x01BE67|$06:$BE57:D0 C4 BNE $BE1D ; control flow target (from $BE53) 0x01BE69|$06:$BE59:C9 04 CMP #$04 0x01BE6B|$06:$BE5B:D0 04 BNE $BE61 0x01BE6D|$06:$BE5D:A9 01 LDA #$01 0x01BE6F|$06:$BE5F:D0 BC BNE $BE1D ; control flow target (from $BE5B) 0x01BE71|$06:$BE61:C9 09 CMP #$09 0x01BE73|$06:$BE63:D0 04 BNE $BE69 0x01BE75|$06:$BE65:A9 00 LDA #$00 0x01BE77|$06:$BE67:F0 B4 BEQ $BE1D ; control flow target (from $BE63) 0x01BE79|$06:$BE69:C9 0A CMP #$0A 0x01BE7B|$06:$BE6B:D0 04 BNE $BE71 0x01BE7D|$06:$BE6D:A9 02 LDA #$02 0x01BE7F|$06:$BE6F:D0 AC BNE $BE1D ; control flow target (from $BE6B) 0x01BE81|$06:$BE71:C9 02 CMP #$02 0x01BE83|$06:$BE73:D0 47 BNE $BEBC 0x01BE85|$06:$BE75:A5 17 LDA $17 ; current map Y-pos (1) 0x01BE87|$06:$BE77:D0 04 BNE $BE7D ; control flow target (from $BEC6) 0x01BE89|$06:$BE79:A9 02 LDA #$02 0x01BE8B|$06:$BE7B:D0 16 BNE $BE93 ; control flow target (from $BE77) 0x01BE8D|$06:$BE7D:A5 16 LDA $16 ; current map X-pos (1) 0x01BE8F|$06:$BE7F:C5 21 CMP $21 ; map width 0x01BE91|$06:$BE81:D0 04 BNE $BE87 ; control flow target (from $BECA) 0x01BE93|$06:$BE83:A9 03 LDA #$03 0x01BE95|$06:$BE85:D0 0C BNE $BE93 ; control flow target (from $BE81) 0x01BE97|$06:$BE87:A5 16 LDA $16 ; current map X-pos (1) 0x01BE99|$06:$BE89:D0 04 BNE $BE8F ; control flow target (from $BEC2) 0x01BE9B|$06:$BE8B:A9 01 LDA #$01 0x01BE9D|$06:$BE8D:D0 04 BNE $BE93 ; control flow target (from $BE89, $BEBE) 0x01BE9F|$06:$BE8F:A9 00 LDA #$00 0x01BEA1|$06:$BE91:F0 00 BEQ $BE93 ; useless op ; control flow target (from $BE7B, $BE85, $BE8D, $BE91) 0x01BEA3|$06:$BE93:8D 40 05 STA $0540 ; NPC #$00 ? + direction nybble 0x01BEA6|$06:$BE96:8D 48 05 STA $0548 ; NPC #$01 ? + direction nybble 0x01BEA9|$06:$BE99:8D 50 05 STA $0550 ; NPC #$02 ? + direction nybble 0x01BEAC|$06:$BE9C:0A ASL 0x01BEAD|$06:$BE9D:0A ASL 0x01BEAE|$06:$BE9E:0A ASL 0x01BEAF|$06:$BE9F:AA TAX 0x01BEB0|$06:$BEA0:A0 08 LDY #$08 ; control flow target (from $BEB9) 0x01BEB2|$06:$BEA2:A9 04 LDA #$04 0x01BEB4|$06:$BEA4:85 2E STA $2E ; control flow target (from $BEB0) 0x01BEB6|$06:$BEA6:BD CD BE LDA $BECD,X 0x01BEB9|$06:$BEA9:99 3A 05 STA $053A,Y 0x01BEBC|$06:$BEAC:C8 INY 0x01BEBD|$06:$BEAD:E8 INX 0x01BEBE|$06:$BEAE:C6 2E DEC $2E 0x01BEC0|$06:$BEB0:D0 F4 BNE $BEA6 0x01BEC2|$06:$BEB2:98 TYA 0x01BEC3|$06:$BEB3:18 CLC 0x01BEC4|$06:$BEB4:69 04 ADC #$04 0x01BEC6|$06:$BEB6:A8 TAY 0x01BEC7|$06:$BEB7:C9 18 CMP #$18 0x01BEC9|$06:$BEB9:D0 E7 BNE $BEA2 0x01BECB|$06:$BEBB:60 RTS ; control flow target (from $BE73) 0x01BECC|$06:$BEBC:C9 05 CMP #$05 0x01BECE|$06:$BEBE:F0 CF BEQ $BE8F 0x01BED0|$06:$BEC0:C9 06 CMP #$06 0x01BED2|$06:$BEC2:F0 C7 BEQ $BE8B 0x01BED4|$06:$BEC4:C9 07 CMP #$07 0x01BED6|$06:$BEC6:F0 B1 BEQ $BE79 0x01BED8|$06:$BEC8:C9 08 CMP #$08 0x01BEDA|$06:$BECA:F0 B7 BEQ $BE83 0x01BEDC|$06:$BECC:60 RTS ; code -> data ; indexed data load target (from $BEA6) 0x01BEDD|$06:$BECD:80 7F 00 01 0x01BEE1|$06:$BED1:80 8F 00 01 0x01BEE5|$06:$BED5:70 6F FF 00 0x01BEE9|$06:$BED9:60 6F FF 00 0x01BEED|$06:$BEDD:80 5F 00 FF 0x01BEF1|$06:$BEE1:80 4F 00 FF ; indirect data load target 0x01BEF5|$06:$BEE5:90 6F 01 00 0x01BEF9|$06:$BEE9:A0 6F 01 00 ; data -> code ; 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 ; indirect control flow target (via $8046) 0x01BEFD|$06:$BEED:CA DEX 0x01BEFE|$06:$BEEE:F0 08 BEQ $BEF8 ; CLC and update $0C-$0D to warp point data to use if Outside allowed from current map 0x01BF00|$06:$BEF0:CA DEX 0x01BF01|$06:$BEF1:F0 47 BEQ $BF3A ; CLC and update $0C-$0D to warp point data to use if Return allowed from current map 0x01BF03|$06:$BEF3:CA DEX 0x01BF04|$06:$BEF4:F0 69 BEQ $BF5F ; disembark from ship and update ship position based on last save point ID $48 0x01BF06|$06:$BEF6:38 SEC 0x01BF07|$06:$BEF7:60 RTS ; CLC and update $0C-$0D to warp point data to use if Outside allowed from current map ; control flow target (from $BEEE) 0x01BF08|$06:$BEF8:A5 31 LDA $31 ; current map ID 0x01BF0A|$06:$BEFA:C9 17 CMP #$17 ; Map ID #$17: Hargon's Castle 7F 0x01BF0C|$06:$BEFC:D0 11 BNE $BF0F ; Hargon's Castle 7F is special: after defeating Hargon, you can't escape before defeating Malroth 0x01BF0E|$06:$BEFE:A5 D0 LDA $D0 ; Malroth status flag (#$FF = defeated, #$00 = alive, others = countdown to battle) 0x01BF10|$06:$BF00:30 07 BMI $BF09 ; Outside from Hargon's Castle 7F is okay 0x01BF12|$06:$BF02:AD 61 05 LDA $0561 ; NPC #$04 sprite ID; #$FF if Hargon defeated 0x01BF15|$06:$BF05:C9 FF CMP #$FF 0x01BF17|$06:$BF07:F0 1A BEQ $BF23 ; SEC to flag Outside not allowed for calling code ; Outside from Hargon's Castle 7F is okay ; control flow target (from $BF00) 0x01BF19|$06:$BF09:A9 44 LDA #$44 ; Map ID #$44: Hargon's Castle 2F 0x01BF1B|$06:$BF0B:A0 07 LDY #$07 ; first floor index for Map ID #$44: Hargon's Castle 2F 0x01BF1D|$06:$BF0D:D0 16 BNE $BF25 ; Outside is allowed ; control flow target (from $BEFC) 0x01BF1F|$06:$BF0F:C9 18 CMP #$18 ; Map ID #$18: Charlock Castle B8 0x01BF21|$06:$BF11:D0 06 BNE $BF19 ; Charlock Castle B8 is not considered a dungeon, so handle it specially 0x01BF23|$06:$BF13:A9 34 LDA #$34 ; Map ID #$34: Charlock Castle B1/B2 0x01BF25|$06:$BF15:A0 03 LDY #$03 ; first floor index for Map ID #$34: Charlock Castle B1/B2 0x01BF27|$06:$BF17:D0 0C BNE $BF25 ; Outside is allowed ; control flow target (from $BF11) 0x01BF29|$06:$BF19:A0 0C LDY #$0C ; for everything else, start scanning the first floor list ; control flow target (from $BF21) 0x01BF2B|$06:$BF1B:D9 82 BF CMP $BF82,Y ; dungeon first floors 0x01BF2E|$06:$BF1E:B0 05 BCS $BF25 ; Outside is allowed 0x01BF30|$06:$BF20:88 DEY 0x01BF31|$06:$BF21:10 F8 BPL $BF1B ; if more first floors to check, check them ; SEC to flag Outside not allowed for calling code ; control flow target (from $BF07) 0x01BF33|$06:$BF23:38 SEC 0x01BF34|$06:$BF24:60 RTS ; Outside is allowed ; control flow target (from $BF0D, $BF17, $BF1E) 0x01BF35|$06:$BF25:38 SEC 0x01BF36|$06:$BF26:F9 82 BF SBC $BF82,Y ; dungeon first floors 0x01BF39|$06:$BF29:85 0E STA $0E ; floor number 0x01BF3B|$06:$BF2B:98 TYA 0x01BF3C|$06:$BF2C:0A ASL 0x01BF3D|$06:$BF2D:A8 TAY 0x01BF3E|$06:$BF2E:B9 8F BF LDA $BF8F,Y ; pointer to warp point data used when casting Outside 0x01BF41|$06:$BF31:85 0C STA $0C 0x01BF43|$06:$BF33:B9 90 BF LDA $BF90,Y 0x01BF46|$06:$BF36:85 0D STA $0D 0x01BF48|$06:$BF38:18 CLC 0x01BF49|$06:$BF39:60 RTS ; CLC and update $0C-$0D to warp point data to use if Return allowed from current map ; control flow target (from $BEF1) 0x01BF4A|$06:$BF3A:A5 31 LDA $31 ; current map ID 0x01BF4C|$06:$BF3C:F0 1F BEQ $BF5D ; SEC to flag Return disallowed for calling code; Map ID #$00: Fake Midenhall 0x01BF4E|$06:$BF3E:C9 2B CMP #$2B ; map IDs >= #$2B are dungeon maps 0x01BF50|$06:$BF40:B0 1B BCS $BF5D ; SEC to flag Return disallowed for calling code 0x01BF52|$06:$BF42:C9 17 CMP #$17 ; Map ID #$17: Hargon's Castle 7F 0x01BF54|$06:$BF44:F0 17 BEQ $BF5D ; SEC to flag Return disallowed for calling code 0x01BF56|$06:$BF46:C9 18 CMP #$18 ; Map ID #$18: Charlock Castle B8 0x01BF58|$06:$BF48:F0 13 BEQ $BF5D ; SEC to flag Return disallowed for calling code 0x01BF5A|$06:$BF4A:20 5F BF JSR $BF5F ; disembark from ship and update ship position based on last save point ID $48 0x01BF5D|$06:$BF4D:A5 48 LDA $48 ; last save point ID 0x01BF5F|$06:$BF4F:0A ASL 0x01BF60|$06:$BF50:A8 TAY 0x01BF61|$06:$BF51:B9 A9 BF LDA $BFA9,Y ; pointer to warp point data used when casting Return 0x01BF64|$06:$BF54:85 0C STA $0C 0x01BF66|$06:$BF56:B9 AA BF LDA $BFAA,Y 0x01BF69|$06:$BF59:85 0D STA $0D 0x01BF6B|$06:$BF5B:18 CLC ; CLC to flag Return allowed for calling code 0x01BF6C|$06:$BF5C:60 RTS ; SEC to flag Return disallowed for calling code ; control flow target (from $BF3C, $BF40, $BF44, $BF48) 0x01BF6D|$06:$BF5D:38 SEC 0x01BF6E|$06:$BF5E:60 RTS ; disembark from ship and update ship position based on last save point ID $48 ; control flow target (from $BEF4, $BF4A) 0x01BF6F|$06:$BF5F:A5 CF LDA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x01BF71|$06:$BF61:29 03 AND #$03 0x01BF73|$06:$BF63:85 CF STA $CF ; ship status (#$04 = on ship, #$02 = own ship, #$01 = beat Lianport Gremlins) 0x01BF75|$06:$BF65:A5 48 LDA $48 ; last save point ID 0x01BF77|$06:$BF67:0A ASL 0x01BF78|$06:$BF68:A8 TAY 0x01BF79|$06:$BF69:B9 74 BF LDA $BF74,Y ; ship X-pos after warp 0x01BF7C|$06:$BF6C:85 D2 STA $D2 ; ship X-pos (when you aren't on it) 0x01BF7E|$06:$BF6E:B9 75 BF LDA $BF75,Y ; ship Y-pos after warp 0x01BF81|$06:$BF71:85 D3 STA $D3 ; ship Y-pos (when you aren't on it) 0x01BF83|$06:$BF73:60 RTS ; code -> data ; ship X-pos after warp ; indexed data load target (from $BF69) 0x01BF84|$06:$BF74:D4 ; ship Y-pos after warp ; indexed data load target (from $BF6E) 0x01BF85|$06:$BF75: 3C ; Save Point ID #$00: Midenhall 2F 0x01BF86|$06:$BF76:A4 09 ; Save Point ID #$01: Cannock ; indirect data load target 0x01BF88|$06:$BF78:3B 2E ; Save Point ID #$02: Tantegel 0x01BF8A|$06:$BF7A:DA 91 ; Save Point ID #$03: Osterfair 0x01BF8C|$06:$BF7C:1F C5 ; Save Point ID #$04: Beran 0x01BF8E|$06:$BF7E:1F C5 ; Save Point ID #$05: Rhone Shrine 0x01BF90|$06:$BF80:78 58 ; Save Point ID #$06: Hamlin ; dungeon first floors ; indexed data load target (from $BF1B, $BF26) 0x01BF92|$06:$BF82:2B ; Map ID #$2B: Cave to Hamlin 0x01BF93|$06:$BF83:2C ; Map ID #$2C: Lake Cave B1 0x01BF94|$06:$BF84:2E ; Map ID #$2E: Sea Cave B1 0x01BF95|$06:$BF85:34 ; Map ID #$34: Charlock Castle B1/B2 0x01BF96|$06:$BF86:37 ; Map ID #$37: Cave to Rhone B1 0x01BF97|$06:$BF87:40 ; Map ID #$40: Spring of Bravery 0x01BF98|$06:$BF88:43 ; Map ID #$43: Cave to Rimuldar 0x01BF99|$06:$BF89:44 ; Map ID #$44: Hargon's Castle 2F 0x01BF9A|$06:$BF8A:49 ; Map ID #$49: Moon Tower 1F 0x01BF9B|$06:$BF8B:50 ; Map ID #$50: Lighthouse 1F 0x01BF9C|$06:$BF8C:58 ; Map ID #$58: Wind Tower 1F 0x01BF9D|$06:$BF8D:60 ; Map ID #$60: Dragon Horn South 1F 0x01BF9E|$06:$BF8E:66 ; Map ID #$66: Dragon Horn North 1F ; pointer to warp point data used when casting Outside ; indexed data load target (from $BF2E) ; indirect data load target 0x01BF9F|$06:$BF8F:A8 ; indexed data load target (from $BF33) 0x01BFA0|$06:$BF90: A2 ; $02:$A2A8; Map ID #$2B: Cave to Hamlin 0x01BFA1|$06:$BF91:CF A2 ; $02:$A2CF; Map ID #$2C: Lake Cave B1 0x01BFA3|$06:$BF93:D2 A2 ; $02:$A2D2; Map ID #$2E: Sea Cave B1 0x01BFA5|$06:$BF95:D8 A2 ; $02:$A2D8; Map ID #$34: Charlock Castle B1/B2 0x01BFA7|$06:$BF97:DE A2 ; $02:$A2DE; Map ID #$37: Cave to Rhone B1 0x01BFA9|$06:$BF99:ED A2 ; $02:$A2ED; Map ID #$40: Spring of Bravery 0x01BFAB|$06:$BF9B:EA A2 ; $02:$A2EA; Map ID #$43: Cave to Rimuldar 0x01BFAD|$06:$BF9D:A2 A2 ; $02:$A2A2; Map ID #$44: Hargon's Castle 2F 0x01BFAF|$06:$BF9F:E1 A2 ; $02:$A2E1; Map ID #$49: Moon Tower 1F 0x01BFB1|$06:$BFA1:DB A2 ; $02:$A2DB; Map ID #$50: Lighthouse 1F 0x01BFB3|$06:$BFA3:D5 A2 ; $02:$A2D5; Map ID #$58: Wind Tower 1F 0x01BFB5|$06:$BFA5:E4 A2 ; $02:$A2E4; Map ID #$60: Dragon Horn South 1F 0x01BFB7|$06:$BFA7:E7 A2 ; $02:$A2E7; Map ID #$66: Dragon Horn North 1F ; pointer to warp point data used when casting Return ; indexed data load target (from $BF51) ; indirect data load target 0x01BFB9|$06:$BFA9:69 ; indexed data load target (from $BF56) 0x01BFBA|$06:$BFAA: A2 ; $02:$A269; warp point data (map ID, X-pos, Y-pos) used when casting Return; Save Point ID #$00: Midenhall 2F 0x01BFBB|$06:$BFAB:6C A2 ; $02:$A26C; Save Point ID #$01: Cannock 0x01BFBD|$06:$BFAD:6F A2 ; $02:$A26F; Save Point ID #$02: Tantegel 0x01BFBF|$06:$BFAF:72 A2 ; $02:$A272; Save Point ID #$03: Osterfair 0x01BFC1|$06:$BFB1:75 A2 ; $02:$A275; Save Point ID #$04: Beran 0x01BFC3|$06:$BFB3:78 A2 ; $02:$A278; Save Point ID #$05: Rhone Shrine 0x01BFC5|$06:$BFB5:7B A2 ; $02:$A27B; Save Point ID #$06: Hamlin ; data -> free ; indirect data load target 0x01BFC7|$06:$BFB7:FF ; ... skipping $1F FF bytes ; indirect data load target 0x01BFE7|$06:$BFD7:FF ; free -> unknown 0x01BFE8|$06:$BFD8:78 ; SEI 0x01BFE9|$06:$BFD9:EE DF BF ; INC $BFDF 0x01BFEA|$06:$BFDA:DF ; INVALID OPCODE 0x01BFEB|$06:$BFDB:BF ; INVALID OPCODE 0x01BFEC|$06:$BFDC:4C 86 FF ; JMP $FF86 0x01BFED|$06:$BFDD:86 FF ; STX $FF 0x01BFEE|$06:$BFDE:FF ; INVALID OPCODE 0x01BFEF|$06:$BFDF:80 ; INVALID OPCODE 0x01BFF0|$06:$BFE0:44 ; INVALID OPCODE 0x01BFF1|$06:$BFE1:52 ; INVALID OPCODE 0x01BFF2|$06:$BFE2:41 47 ; EOR ($47,X) 0x01BFF3|$06:$BFE3:47 ; INVALID OPCODE 0x01BFF4|$06:$BFE4:4F ; INVALID OPCODE 0x01BFF5|$06:$BFE5:4E 20 57 ; LSR $5720 0x01BFF6|$06:$BFE6:20 57 41 ; JSR $4157 0x01BFF7|$06:$BFE7:57 ; INVALID OPCODE 0x01BFF8|$06:$BFE8:41 52 ; EOR ($52,X) 0x01BFF9|$06:$BFE9:52 ; INVALID OPCODE 0x01BFFA|$06:$BFEA:52 ; INVALID OPCODE 0x01BFFB|$06:$BFEB:49 4F ; EOR #$4F 0x01BFFC|$06:$BFEC:4F ; INVALID OPCODE 0x01BFFD|$06:$BFED:52 ; INVALID OPCODE 0x01BFFE|$06:$BFEE:53 ; INVALID OPCODE 0x01BFFF|$06:$BFEF:32 ; INVALID OPCODE 0x01C000|$06:$BFF0:FF ; INVALID OPCODE 0x01C001|$06:$BFF1:FF ; INVALID OPCODE 0x01C002|$06:$BFF2:00 ; BRK 0x01C003|$06:$BFF3:00 ; BRK 0x01C004|$06:$BFF4:48 ; PHA 0x01C005|$06:$BFF5:04 ; INVALID OPCODE 0x01C006|$06:$BFF6:01 0F ; ORA ($0F,X) 0x01C007|$06:$BFF7:0F ; INVALID OPCODE 0x01C008|$06:$BFF8:07 ; INVALID OPCODE 0x01C009|$06:$BFF9:9D D8 BF ; STA $BFD8,X 0x01C00A|$06:$BFFA:D8 ; CLD 0x01C00B|$06:$BFFB:BF ; INVALID OPCODE 0x01C00C|$06:$BFFC:D8 ; CLD 0x01C00D|$06:$BFFD:BF ; INVALID OPCODE 0x01C00E|$06:$BFFE:D8 ; CLD 0x01C00F|$06:$BFFF:BF ; INVALID OPCODE