Batteries Included BusCard U1 ROM -- Annotated 6502 Disassembly ============================================================================== Input image: buscardv0.9-tms2564.bin Size: 8192 bytes ($2000; one TMS2564 8K x 8 EPROM) CRC32: 175e8c96 SHA-1: 8fb4ba7e3d0b58dc01b66ef962955596f1b125b5 SHA-256: c96f1b19aacd3f05fcd539c76dd476613d680c0ef03d7c26725a7e40a99e851a This is a reverse-engineered annotated listing, NOT the original Batteries Included source code. Descriptive labels and comments were inferred from the ROM, the BusCard schematic/hardware, standard C64 memory/KERNAL conventions, MAME's BusCard hardware model, and comparison with published Commodore disassemblies. Where a purpose is not certain, the comments say so rather than inventing an original symbol/name. The image hash exactly matches the ROM called "0.9.u1" in current MAME: CRC 175e8c96, SHA1 8fb4ba7e3d0b58dc01b66ef962955596f1b125b5 Reference material used for interpretation: MAME BusCard model: https://github.com/mamedev/mame/blob/master/src/devices/bus/c64/buscard.cpp C64 KERNAL disassembly (Zimmers): https://www.zimmers.net/anonftp/pub/cbm/src/c64/c64_kernal_disassembly.txt PET BASIC 4.0 disassembly (Zimmers), useful for command-set comparison: https://zimmers.net/anonftp/pub/cbm/src/pet/pet_rom4_disassembly.txt IMPORTANT ADDRESS-MAPPING NOTE ------------------------------------------------------------------------------ U1 is physically linear, but it is NOT used as one simple CPU-address-linear program. The BusCard decode logic gives it two important views: ROM offset CPU address Main contents $0000-$0BFF -> $A000-$ABFF machine-language monitor + I/O drivers $0C00-$0FFF -> $EC00-$EFFF resident C64 KERNAL overlay/dispatch code $1000-$113B -> $B000-$B13B BASIC4 installer/uninstaller + small data $113C-$147A -> $B13C-$B47A zero fill (831 bytes) $147B-$1FFF -> $B47B-$BFFF encoded relocatable BASIC4 extension MAME independently models U1 as always visible at $EC00-$EFFF (physical offsets $0C00-$0FFF) when HIRAM is active, and as selectable over $A000-$BFFF. That hardware fact is essential: blindly disassembling all 8192 bytes as if they lived contiguously at $A000 would give wrong addresses for the resident $EC00-$EFFF code. PUBLIC ENTRYPOINTS ------------------------------------------------------------------------------ SYS 61000 = $EE48 : enable/install BusCard BASIC 4.0 command extension SYS 61003 = $EE4B : disable/uninstall the BASIC 4.0 extension SYS 61006 = $EE4E : enter the BusCard machine-language monitor The BASIC4 extension is not stored as directly executable code in the tail of the EPROM. $B47B-$BFFF is an encoded relocation stream. On a normal stock C64 with MEMSIZ=$A000 the installer expands it downward to $955B-$9FFF (2725 bytes; the stream contains 154 relocation records. It installs four BASIC vectors to its first four JMP stubs. A fully decoded listing of that derived runtime image is appended after the raw ROM. BASIC4 KEYWORDS FOUND IN THE RELOCATED IMAGE ------------------------------------------------------------------------------ CONCAT, DOPEN, DCLOSE, RECORD, HEADER, COLLECT, BACKUP, COPY, APPEND, DSAVE, DLOAD, CATALOG, RENAME, SCRATCH, DIRECTORY MONITOR COMMAND DISPATCH TABLE ------------------------------------------------------------------------------ : $A140 memory-edit line ; $A133 display/edit line helper R $A0C5 register display M $A0EB memory display/modify G $A154 go/execute X $A184 exit monitor L $A1EA load memory S $A207 save memory T $A32F transfer memory F $A383 fill memory H $A3B1 hunt/search D $A424 disassemble P $A542 print disassembly , $A56C assembler/edit continuation helper A $A58E assemble one line 8255 PPI AT $DEC0-$DEC3 (from schematic + MAME hardware model) ------------------------------------------------------------------------------ $DEC0 Port A : IEEE-488 DIO0-DIO7; also Centronics D0-D7; DIP read when selected $DEC1 Port B : PB0/PB1 ROM bank bits; PB3 BASIC-ROM enable; PB6 printer STROBE; PB7 DIP-switch select $DEC2 Port C : PC0 printer BUSY; IEEE DAV/EOI/ATN/NRFD/NDAC and TE control $DEC3 Control: 8255 mode-control and bit-set/reset operations LISTING FORMAT ------------------------------------------------------------------------------ CPUADDR [ROM+offset] bytes label / instruction ; comment Data blocks use .byte/.word/.res. .res is used only for a verified run of identical zero bytes, so every byte of the original 8192-byte image is still represented by the listing. RAW U1 EPROM LISTING ============================================================================== ; ========================================================================== ; U1 physical $0000-$0BFF -> CPU $A000-$ABFF ; Machine-language monitor, then BusCard I/O drivers ; ========================================================================== ; -------------------------------------------------------------------------- ; Machine-language monitor BRK entry. SYS 61006 first installs $ED8B as the ; BRK vector and deliberately executes BRK. The BRK frame plus A/X/Y are ; unwound here into $0239-$023F. The saved PC is reduced by two so the ; monitor reports the address of the BRK instruction rather than the byte after it. ; -------------------------------------------------------------------------- MONITOR_BRK_ENTRY: A000 [ROM+0000] D8 CLD ; 6502 decimal mode off before monitor work A001 [ROM+0001] 58 CLI ; allow IRQs while monitor runs L_A002: A002 [ROM+0002] 68 PLA ; pop Y saved by BRK/KERNAL entry frame A003 [ROM+0003] 8D 3E 02 STA MON_YR ; save Y; monitor saved Y register A006 [ROM+0006] 68 PLA ; pop X A007 [ROM+0007] 8D 3D 02 STA MON_XR ; save X; monitor saved X register A00A [ROM+000A] 68 PLA ; pop accumulator A00B [ROM+000B] 8D 3C 02 STA MON_AC ; save A; monitor saved accumulator A00E [ROM+000E] 68 PLA ; pop processor status A00F [ROM+000F] 8D 3B 02 STA MON_SR ; save SR; monitor saved status register A012 [ROM+0012] 68 PLA ; pop return-PC low byte A013 [ROM+0013] AA TAX A014 [ROM+0014] 68 PLA ; pop return-PC high byte A015 [ROM+0015] A8 TAY A016 [ROM+0016] 38 SEC ; prepare to subtract 2 from BRK return PC A017 [ROM+0017] 8A TXA A018 [ROM+0018] E9 02 SBC #$02 A01A [ROM+001A] 8D 3A 02 STA MON_PC_LO ; save adjusted PC low; monitor saved PC low A01D [ROM+001D] 98 TYA A01E [ROM+001E] E9 00 SBC #$00 A020 [ROM+0020] 8D 39 02 STA MON_PC_HI ; save adjusted PC high; monitor saved PC high A023 [ROM+0023] BA TSX ; capture stack pointer after frame removal A024 [ROM+0024] 8E 3F 02 STX MON_SP ; monitor saved stack pointer A027 [ROM+0027] 20 3D A5 JSR MON_PRINT_CR ; print CR; call/jump to mon print cr A02A [ROM+002A] A2 42 LDX #$42 A02C [ROM+002C] A9 2A LDA #$2A A02E [ROM+002E] 20 4C A2 JSR MON_PRINT_TWO_CHARS ; call/jump to mon print two chars A031 [ROM+0031] A9 52 LDA #$52 ; seed command path with R (register display) A033 [ROM+0033] D0 2A BNE MON_DISPATCH_COMMAND MON_INC_PTR: A035 [ROM+0035] E6 C1 INC $C1 A037 [ROM+0037] D0 06 BNE L_A03F A039 [ROM+0039] E6 C2 INC $C2 A03B [ROM+003B] D0 02 BNE L_A03F A03D [ROM+003D] E6 26 INC $26 L_A03F: A03F [ROM+003F] 60 RTS ; return MON_GET_CHAR: A040 [ROM+0040] 20 CF FF JSR CHRIN ; read one character via KERNAL CHRIN; KERNAL CHRIN A043 [ROM+0043] C9 0D CMP #$0D ; CR ends the current monitor input item A045 [ROM+0045] D0 F8 BNE L_A03F A047 [ROM+0047] 68 PLA ; restore/pull byte from stack A048 [ROM+0048] 68 PLA ; restore/pull byte from stack ; -------------------------------------------------------------------------- ; Interactive monitor command prompt and dispatcher. Commands are matched ; against the table at $A78E and dispatched through an address-minus-one table ; at $A79D using the classic PHA/PHA/RTS computed-call idiom. ; -------------------------------------------------------------------------- MON_COMMAND_LOOP: A049 [ROM+0049] A9 00 LDA #$00 A04B [ROM+004B] 85 26 STA $26 A04D [ROM+004D] A2 0D LDX #$0D ; monitor prompt begins with dot/period A04F [ROM+004F] A9 2E LDA #$2E A051 [ROM+0051] 20 4C A2 JSR MON_PRINT_TWO_CHARS ; call/jump to mon print two chars L_A054: A054 [ROM+0054] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char A057 [ROM+0057] C9 2E CMP #$2E A059 [ROM+0059] F0 F9 BEQ L_A054 A05B [ROM+005B] C9 20 CMP #$20 A05D [ROM+005D] F0 F5 BEQ L_A054 MON_DISPATCH_COMMAND: A05F [ROM+005F] A2 0E LDX #$0E ; start reverse scan of 15 command characters L_A061: A061 [ROM+0061] DD 8E A7 CMP MON_COMMAND_CHARS,X A064 [ROM+0064] D0 0C BNE L_A072 A066 [ROM+0066] 8A TXA A067 [ROM+0067] 0A ASL A A068 [ROM+0068] AA TAX A069 [ROM+0069] BD 9E A7 LDA $A79E,X ; push handler high byte (stored as address-1) A06C [ROM+006C] 48 PHA ; save A on stack A06D [ROM+006D] BD 9D A7 LDA MON_COMMAND_VECTORS_MINUS1,X ; push handler low byte (stored as address-1) A070 [ROM+0070] 48 PHA ; save A on stack A071 [ROM+0071] 60 RTS ; RTS adds one, producing a computed subroutine dispatch L_A072: A072 [ROM+0072] CA DEX A073 [ROM+0073] 10 EC BPL L_A061 A075 [ROM+0075] 4C E2 A2 JMP MON_SYNTAX_ERROR ; call/jump to mon syntax error MON_SAVE_ADDR: A078 [ROM+0078] A5 C1 LDA $C1 A07A [ROM+007A] 8D 3A 02 STA MON_PC_LO ; monitor saved PC low A07D [ROM+007D] A5 C2 LDA $C2 A07F [ROM+007F] 8D 39 02 STA MON_PC_HI ; monitor saved PC high A082 [ROM+0082] 60 RTS ; return MON_DUMP_8_BYTES: A083 [ROM+0083] A9 08 LDA #$08 L_A085: A085 [ROM+0085] 85 1D STA $1D A087 [ROM+0087] A0 00 LDY #$00 L_A089: A089 [ROM+0089] 20 3A A5 JSR MON_PRINT_SPACE ; call/jump to mon print space A08C [ROM+008C] B1 C1 LDA ($C1),Y A08E [ROM+008E] 20 3D A2 JSR MON_PRINT_HEX_BYTE ; call/jump to mon print hex byte A091 [ROM+0091] 20 35 A0 JSR MON_INC_PTR ; call/jump to mon inc ptr A094 [ROM+0094] C6 1D DEC $1D A096 [ROM+0096] D0 F1 BNE L_A089 A098 [ROM+0098] 60 RTS ; return MON_STORE_BYTE: A099 [ROM+0099] 20 7D A2 JSR MON_PARSE_HEX_BYTE ; call/jump to mon parse hex byte A09C [ROM+009C] 90 0B BCC L_A0A9 A09E [ROM+009E] A2 00 LDX #$00 A0A0 [ROM+00A0] 81 C1 STA ($C1,X) A0A2 [ROM+00A2] C1 C1 CMP ($C1,X) A0A4 [ROM+00A4] F0 03 BEQ L_A0A9 A0A6 [ROM+00A6] 4C E2 A2 JMP MON_SYNTAX_ERROR ; call/jump to mon syntax error L_A0A9: A0A9 [ROM+00A9] 20 35 A0 JSR MON_INC_PTR ; call/jump to mon inc ptr A0AC [ROM+00AC] C6 1D DEC $1D A0AE [ROM+00AE] 60 RTS ; return MON_SELECT_SAVED_REGS: A0AF [ROM+00AF] A9 3B LDA #$3B A0B1 [ROM+00B1] 85 C1 STA $C1 A0B3 [ROM+00B3] A9 02 LDA #$02 A0B5 [ROM+00B5] 85 C2 STA $C2 A0B7 [ROM+00B7] A9 05 LDA #$05 A0B9 [ROM+00B9] 60 RTS ; return MON_PRINT_PREFIX: A0BA [ROM+00BA] 98 TYA A0BB [ROM+00BB] 48 PHA ; save A on stack A0BC [ROM+00BC] 20 3D A5 JSR MON_PRINT_CR ; call/jump to mon print cr A0BF [ROM+00BF] 68 PLA ; restore/pull byte from stack A0C0 [ROM+00C0] A2 2E LDX #$2E A0C2 [ROM+00C2] 4C 4C A2 JMP MON_PRINT_TWO_CHARS ; call/jump to mon print two chars ; -------------------------------------------------------------------------- ; Monitor R command: print the saved PC, SR, A, X, Y and SP values. ; -------------------------------------------------------------------------- MON_CMD_R_REGISTERS: A0C5 [ROM+00C5] A2 00 LDX #$00 L_A0C7: A0C7 [ROM+00C7] BD BD A7 LDA MON_REGISTER_HEADER,X ; read register-header character A0CA [ROM+00CA] 20 D2 FF JSR CHROUT ; print it; KERNAL CHROUT A0CD [ROM+00CD] E8 INX A0CE [ROM+00CE] E0 16 CPX #$16 A0D0 [ROM+00D0] D0 F5 BNE L_A0C7 A0D2 [ROM+00D2] A0 3B LDY #$3B A0D4 [ROM+00D4] 20 BA A0 JSR MON_PRINT_PREFIX ; call/jump to mon print prefix A0D7 [ROM+00D7] AD 39 02 LDA MON_PC_HI ; monitor saved PC high A0DA [ROM+00DA] 20 3D A2 JSR MON_PRINT_HEX_BYTE ; call/jump to mon print hex byte A0DD [ROM+00DD] AD 3A 02 LDA MON_PC_LO ; monitor saved PC low A0E0 [ROM+00E0] 20 3D A2 JSR MON_PRINT_HEX_BYTE ; call/jump to mon print hex byte A0E3 [ROM+00E3] 20 AF A0 JSR MON_SELECT_SAVED_REGS ; call/jump to mon select saved regs A0E6 [ROM+00E6] 20 85 A0 JSR L_A085 A0E9 [ROM+00E9] F0 66 BEQ MON_TO_PROMPT ; -------------------------------------------------------------------------- ; Monitor M command: display memory and optionally accept edited hex bytes. ; -------------------------------------------------------------------------- MON_CMD_M_MEMORY: A0EB [ROM+00EB] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char A0EE [ROM+00EE] 20 6E A2 JSR MON_PARSE_HEX_WORD ; call/jump to mon parse hex word A0F1 [ROM+00F1] 90 3D BCC L_A130 A0F3 [ROM+00F3] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A0F6 [ROM+00F6] 20 CF FF JSR CHRIN ; KERNAL CHRIN A0F9 [ROM+00F9] C9 0D CMP #$0D A0FB [ROM+00FB] D0 0B BNE L_A108 A0FD [ROM+00FD] A5 C3 LDA $C3 A0FF [ROM+00FF] 85 C1 STA $C1 A101 [ROM+0101] A5 C4 LDA $C4 A103 [ROM+0103] 85 C2 STA $C2 A105 [ROM+0105] 4C 10 A1 JMP L_A110 L_A108: A108 [ROM+0108] 20 6E A2 JSR MON_PARSE_HEX_WORD ; call/jump to mon parse hex word A10B [ROM+010B] 90 23 BCC L_A130 A10D [ROM+010D] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs L_A110: A110 [ROM+0110] 20 E1 FF JSR STOP ; KERNAL STOP A113 [ROM+0113] F0 3C BEQ MON_TO_PROMPT A115 [ROM+0115] A6 26 LDX $26 A117 [ROM+0117] D0 38 BNE MON_TO_PROMPT A119 [ROM+0119] A5 C3 LDA $C3 A11B [ROM+011B] C5 C1 CMP $C1 A11D [ROM+011D] A5 C4 LDA $C4 A11F [ROM+011F] E5 C2 SBC $C2 A121 [ROM+0121] 90 2E BCC MON_TO_PROMPT A123 [ROM+0123] A0 3A LDY #$3A A125 [ROM+0125] 20 BA A0 JSR MON_PRINT_PREFIX ; call/jump to mon print prefix A128 [ROM+0128] 20 36 A2 JSR MON_PRINT_WORD ; call/jump to mon print word A12B [ROM+012B] 20 83 A0 JSR MON_DUMP_8_BYTES ; call/jump to mon dump 8 bytes A12E [ROM+012E] F0 E0 BEQ L_A110 L_A130: A130 [ROM+0130] 4C E2 A2 JMP MON_SYNTAX_ERROR ; call/jump to mon syntax error ; -------------------------------------------------------------------------- ; Monitor semicolon line handler. It is part of the monitor display/edit syntax; the exact ; original command terminology is not present in the ROM, so the descriptive name is inferred. ; -------------------------------------------------------------------------- MON_CMD_SEMICOLON: A133 [ROM+0133] 20 6E A2 JSR MON_PARSE_HEX_WORD ; call/jump to mon parse hex word A136 [ROM+0136] 90 03 BCC L_A13B A138 [ROM+0138] 20 78 A0 JSR MON_SAVE_ADDR ; call/jump to mon save addr L_A13B: A13B [ROM+013B] 20 AF A0 JSR MON_SELECT_SAVED_REGS ; call/jump to mon select saved regs A13E [ROM+013E] D0 07 BNE L_A147 ; -------------------------------------------------------------------------- ; Monitor colon line handler: accepts hexadecimal byte data for memory modification. ; -------------------------------------------------------------------------- MON_CMD_COLON: A140 [ROM+0140] 20 6E A2 JSR MON_PARSE_HEX_WORD ; call/jump to mon parse hex word A143 [ROM+0143] 90 EB BCC L_A130 A145 [ROM+0145] A9 08 LDA #$08 L_A147: A147 [ROM+0147] 85 1D STA $1D L_A149: A149 [ROM+0149] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char A14C [ROM+014C] 20 99 A0 JSR MON_STORE_BYTE ; call/jump to mon store byte A14F [ROM+014F] D0 F8 BNE L_A149 MON_TO_PROMPT: A151 [ROM+0151] 4C 49 A0 JMP MON_COMMAND_LOOP ; call/jump to mon command loop ; -------------------------------------------------------------------------- ; Monitor G (go) command. Optionally accepts an address, rebuilds the saved ; processor stack frame/registers and exits through $EE6A, which restores the ; normal memory mapping before RTI. ; -------------------------------------------------------------------------- MON_CMD_G_GO: A154 [ROM+0154] 20 CF FF JSR CHRIN ; read remainder of G command line; KERNAL CHRIN A157 [ROM+0157] C9 0D CMP #$0D A159 [ROM+0159] F0 0C BEQ L_A167 A15B [ROM+015B] C9 20 CMP #$20 A15D [ROM+015D] D0 D1 BNE L_A130 A15F [ROM+015F] 20 6E A2 JSR MON_PARSE_HEX_WORD ; call/jump to mon parse hex word A162 [ROM+0162] 90 03 BCC L_A167 A164 [ROM+0164] 20 78 A0 JSR MON_SAVE_ADDR ; call/jump to mon save addr L_A167: A167 [ROM+0167] AE 3F 02 LDX MON_SP ; restore saved monitor stack pointer; monitor saved stack pointer A16A [ROM+016A] 9A TXS A16B [ROM+016B] 78 SEI ; disable IRQs while rebuilding RTI frame A16C [ROM+016C] AD 39 02 LDA MON_PC_HI ; monitor saved PC high A16F [ROM+016F] 48 PHA ; save A on stack A170 [ROM+0170] AD 3A 02 LDA MON_PC_LO ; monitor saved PC low A173 [ROM+0173] 48 PHA ; save A on stack A174 [ROM+0174] AD 3B 02 LDA MON_SR ; monitor saved status register A177 [ROM+0177] 48 PHA ; save A on stack A178 [ROM+0178] AD 3C 02 LDA MON_AC ; monitor saved accumulator A17B [ROM+017B] AE 3D 02 LDX MON_XR ; monitor saved X register A17E [ROM+017E] AC 3E 02 LDY MON_YR ; monitor saved Y register A181 [ROM+0181] 4C 6A EE JMP MONITOR_RTI_RESTORE ; restore mapping then RTI through resident helper; call/jump to monitor rti restore ; -------------------------------------------------------------------------- ; Monitor X command: restore the stack and return to BASIC through $EE42. ; -------------------------------------------------------------------------- MON_CMD_X_EXIT: A184 [ROM+0184] AE 3F 02 LDX MON_SP ; restore saved monitor stack pointer; monitor saved stack pointer A187 [ROM+0187] 9A TXS A188 [ROM+0188] 4C 42 EE JMP RETURN_TO_UNDERLYING_BASIC ; return to BASIC, not to saved BRK context; call/jump to return to underlying basic MON_PARSE_FILENAME_DEVICE: A18B [ROM+018B] A0 01 LDY #$01 A18D [ROM+018D] 84 BA STY FA ; current device number A18F [ROM+018F] 84 B9 STY SA ; secondary address A191 [ROM+0191] 88 DEY A192 [ROM+0192] 84 B7 STY FNLEN ; filename length A194 [ROM+0194] 84 90 STY STATUS ; KERNAL I/O status byte A196 [ROM+0196] 84 93 STY LOAD_VERIFY ; KERNAL LOAD/VERIFY flag A198 [ROM+0198] A9 40 LDA #$40 A19A [ROM+019A] 85 BB STA FNADR_LO ; filename pointer low A19C [ROM+019C] A9 02 LDA #$02 A19E [ROM+019E] 85 BC STA FNADR_HI ; filename pointer high L_A1A0: A1A0 [ROM+01A0] 20 CF FF JSR CHRIN ; KERNAL CHRIN A1A3 [ROM+01A3] C9 20 CMP #$20 A1A5 [ROM+01A5] F0 F9 BEQ L_A1A0 A1A7 [ROM+01A7] C9 0D CMP #$0D A1A9 [ROM+01A9] F0 38 BEQ L_A1E3 A1AB [ROM+01AB] C9 22 CMP #$22 L_A1AD: A1AD [ROM+01AD] D0 14 BNE L_A1C3 L_A1AF: A1AF [ROM+01AF] 20 CF FF JSR CHRIN ; KERNAL CHRIN A1B2 [ROM+01B2] C9 22 CMP #$22 A1B4 [ROM+01B4] F0 10 BEQ L_A1C6 A1B6 [ROM+01B6] C9 0D CMP #$0D A1B8 [ROM+01B8] F0 29 BEQ L_A1E3 A1BA [ROM+01BA] 91 BB STA (FNADR_LO),Y ; filename pointer low A1BC [ROM+01BC] E6 B7 INC FNLEN ; filename length A1BE [ROM+01BE] C8 INY A1BF [ROM+01BF] C0 10 CPY #$10 L_A1C1: A1C1 [ROM+01C1] D0 EC BNE L_A1AF L_A1C3: A1C3 [ROM+01C3] 4C E2 A2 JMP MON_SYNTAX_ERROR ; call/jump to mon syntax error L_A1C6: A1C6 [ROM+01C6] 20 CF FF JSR CHRIN ; KERNAL CHRIN A1C9 [ROM+01C9] C9 0D CMP #$0D A1CB [ROM+01CB] F0 16 BEQ L_A1E3 A1CD [ROM+01CD] C9 2C CMP #$2C A1CF [ROM+01CF] D0 DC BNE L_A1AD A1D1 [ROM+01D1] 20 7D A2 JSR MON_PARSE_HEX_BYTE ; call/jump to mon parse hex byte A1D4 [ROM+01D4] 29 0F AND #$0F A1D6 [ROM+01D6] F0 E9 BEQ L_A1C1 A1D8 [ROM+01D8] C9 03 CMP #$03 A1DA [ROM+01DA] F0 E5 BEQ L_A1C1 A1DC [ROM+01DC] 85 BA STA FA ; current device number A1DE [ROM+01DE] 20 CF FF JSR CHRIN ; KERNAL CHRIN A1E1 [ROM+01E1] C9 0D CMP #$0D L_A1E3: A1E3 [ROM+01E3] 60 RTS ; return MON_CALL_LOAD_VECTOR: A1E4 [ROM+01E4] 6C 30 03 JMP (ILOAD) ; jump through C64 monitor/KERNAL LOAD vector; indirect LOAD vector used by monitor MON_CALL_SAVE_VECTOR: A1E7 [ROM+01E7] 6C 32 03 JMP (ISAVE) ; jump through C64 monitor/KERNAL SAVE vector; indirect SAVE vector used by monitor ; -------------------------------------------------------------------------- ; Monitor L command: parse filename/device/address and invoke the indirect LOAD vector. ; -------------------------------------------------------------------------- MON_CMD_L_LOAD: A1EA [ROM+01EA] 20 8B A1 JSR MON_PARSE_FILENAME_DEVICE ; call/jump to mon parse filename device A1ED [ROM+01ED] F0 0A BEQ L_A1F9 A1EF [ROM+01EF] 20 6E A2 JSR MON_PARSE_HEX_WORD ; call/jump to mon parse hex word A1F2 [ROM+01F2] 90 CF BCC L_A1C3 A1F4 [ROM+01F4] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A1F7 [ROM+01F7] C6 B9 DEC SA ; secondary address L_A1F9: A1F9 [ROM+01F9] A9 00 LDA #$00 A1FB [ROM+01FB] 20 E4 A1 JSR MON_CALL_LOAD_VECTOR ; call/jump to mon call load vector A1FE [ROM+01FE] A5 90 LDA STATUS ; KERNAL I/O status byte A200 [ROM+0200] 29 10 AND #$10 A202 [ROM+0202] D0 BF BNE L_A1C3 A204 [ROM+0204] 4C 49 A0 JMP MON_COMMAND_LOOP ; call/jump to mon command loop ; -------------------------------------------------------------------------- ; Monitor S command: parse filename/device/start/end addresses and invoke SAVE. ; -------------------------------------------------------------------------- MON_CMD_S_SAVE: A207 [ROM+0207] 20 8B A1 JSR MON_PARSE_FILENAME_DEVICE ; call/jump to mon parse filename device A20A [ROM+020A] C9 2C CMP #$2C A20C [ROM+020C] D0 B5 BNE L_A1C3 A20E [ROM+020E] 20 6E A2 JSR MON_PARSE_HEX_WORD ; call/jump to mon parse hex word A211 [ROM+0211] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A214 [ROM+0214] 20 CF FF JSR CHRIN ; KERNAL CHRIN A217 [ROM+0217] C9 2C CMP #$2C A219 [ROM+0219] D0 A8 BNE L_A1C3 A21B [ROM+021B] 20 6E A2 JSR MON_PARSE_HEX_WORD ; call/jump to mon parse hex word A21E [ROM+021E] A5 C1 LDA $C1 A220 [ROM+0220] 85 AE STA $AE A222 [ROM+0222] A5 C2 LDA $C2 A224 [ROM+0224] 85 AF STA $AF A226 [ROM+0226] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A229 [ROM+0229] 20 CF FF JSR CHRIN ; KERNAL CHRIN A22C [ROM+022C] C9 0D CMP #$0D A22E [ROM+022E] D0 93 BNE L_A1C3 A230 [ROM+0230] 20 E7 A1 JSR MON_CALL_SAVE_VECTOR ; call/jump to mon call save vector A233 [ROM+0233] 4C 49 A0 JMP MON_COMMAND_LOOP ; call/jump to mon command loop MON_PRINT_WORD: A236 [ROM+0236] A5 C2 LDA $C2 A238 [ROM+0238] 20 3D A2 JSR MON_PRINT_HEX_BYTE ; call/jump to mon print hex byte A23B [ROM+023B] A5 C1 LDA $C1 MON_PRINT_HEX_BYTE: A23D [ROM+023D] 48 PHA ; preserve byte while printing high nibble A23E [ROM+023E] 4A LSR A A23F [ROM+023F] 4A LSR A A240 [ROM+0240] 4A LSR A A241 [ROM+0241] 4A LSR A A242 [ROM+0242] 20 55 A2 JSR MON_NIBBLE_TO_HEX ; call/jump to mon nibble to hex A245 [ROM+0245] AA TAX A246 [ROM+0246] 68 PLA ; restore/pull byte from stack A247 [ROM+0247] 29 0F AND #$0F A249 [ROM+0249] 20 55 A2 JSR MON_NIBBLE_TO_HEX ; call/jump to mon nibble to hex MON_PRINT_TWO_CHARS: A24C [ROM+024C] 48 PHA ; save A on stack A24D [ROM+024D] 8A TXA A24E [ROM+024E] 20 D2 FF JSR CHROUT ; KERNAL CHROUT A251 [ROM+0251] 68 PLA ; restore/pull byte from stack A252 [ROM+0252] 4C D2 FF JMP CHROUT ; KERNAL CHROUT MON_NIBBLE_TO_HEX: A255 [ROM+0255] 09 30 ORA #$30 ; turn nibble 0-15 into ASCII 0-9/A-F A257 [ROM+0257] C9 3A CMP #$3A A259 [ROM+0259] 90 02 BCC L_A25D A25B [ROM+025B] 69 06 ADC #$06 L_A25D: A25D [ROM+025D] 60 RTS ; return MON_SWAP_ADDR_PAIRS: A25E [ROM+025E] A2 02 LDX #$02 L_A260: A260 [ROM+0260] B5 C0 LDA $C0,X A262 [ROM+0262] 48 PHA ; save A on stack A263 [ROM+0263] B5 C2 LDA $C2,X A265 [ROM+0265] 95 C0 STA $C0,X A267 [ROM+0267] 68 PLA ; restore/pull byte from stack A268 [ROM+0268] 95 C2 STA $C2,X A26A [ROM+026A] CA DEX A26B [ROM+026B] D0 F3 BNE L_A260 A26D [ROM+026D] 60 RTS ; return MON_PARSE_HEX_WORD: A26E [ROM+026E] 20 7D A2 JSR MON_PARSE_HEX_BYTE ; call/jump to mon parse hex byte L_A271: A271 [ROM+0271] 90 02 BCC L_A275 A273 [ROM+0273] 85 C2 STA $C2 L_A275: A275 [ROM+0275] 20 7D A2 JSR MON_PARSE_HEX_BYTE ; call/jump to mon parse hex byte A278 [ROM+0278] 90 02 BCC L_A27C A27A [ROM+027A] 85 C1 STA $C1 L_A27C: A27C [ROM+027C] 60 RTS ; return MON_PARSE_HEX_BYTE: A27D [ROM+027D] A9 00 LDA #$00 A27F [ROM+027F] 85 2A STA $2A A281 [ROM+0281] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char L_A284: A284 [ROM+0284] C9 20 CMP #$20 A286 [ROM+0286] D0 09 BNE L_A291 A288 [ROM+0288] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char A28B [ROM+028B] C9 20 CMP #$20 A28D [ROM+028D] D0 0E BNE L_A29D A28F [ROM+028F] 18 CLC A290 [ROM+0290] 60 RTS ; return L_A291: A291 [ROM+0291] 20 A4 A2 JSR MON_ASCII_HEX_TO_NIBBLE ; call/jump to mon ascii hex to nibble A294 [ROM+0294] 0A ASL A A295 [ROM+0295] 0A ASL A A296 [ROM+0296] 0A ASL A A297 [ROM+0297] 0A ASL A A298 [ROM+0298] 85 2A STA $2A A29A [ROM+029A] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char L_A29D: A29D [ROM+029D] 20 A4 A2 JSR MON_ASCII_HEX_TO_NIBBLE ; call/jump to mon ascii hex to nibble A2A0 [ROM+02A0] 05 2A ORA $2A A2A2 [ROM+02A2] 38 SEC A2A3 [ROM+02A3] 60 RTS ; return MON_ASCII_HEX_TO_NIBBLE: A2A4 [ROM+02A4] C9 3A CMP #$3A A2A6 [ROM+02A6] 90 02 BCC L_A2AA A2A8 [ROM+02A8] 69 08 ADC #$08 L_A2AA: A2AA [ROM+02AA] 29 0F AND #$0F A2AC [ROM+02AC] 60 RTS ; return L_A2AD: A2AD [ROM+02AD] A2 02 LDX #$02 A2AF [ROM+02AF] 2C A2 00 BIT $00A2 A2B2 [ROM+02B2] B4 C1 LDY $C1,X A2B4 [ROM+02B4] D0 08 BNE L_A2BE A2B6 [ROM+02B6] B4 C2 LDY $C2,X A2B8 [ROM+02B8] D0 02 BNE L_A2BC A2BA [ROM+02BA] E6 26 INC $26 L_A2BC: A2BC [ROM+02BC] D6 C2 DEC $C2,X L_A2BE: A2BE [ROM+02BE] D6 C1 DEC $C1,X L_A2C0: A2C0 [ROM+02C0] 60 RTS ; return MON_SKIP_SPACES: A2C1 [ROM+02C1] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char A2C4 [ROM+02C4] C9 20 CMP #$20 A2C6 [ROM+02C6] F0 F9 BEQ MON_SKIP_SPACES A2C8 [ROM+02C8] 60 RTS ; return L_A2C9: A2C9 [ROM+02C9] A9 00 LDA #$00 A2CB [ROM+02CB] 8D 00 01 STA $0100 A2CE [ROM+02CE] 20 C1 A2 JSR MON_SKIP_SPACES ; call/jump to mon skip spaces A2D1 [ROM+02D1] 20 84 A2 JSR L_A284 A2D4 [ROM+02D4] 20 71 A2 JSR L_A271 A2D7 [ROM+02D7] 90 09 BCC MON_SYNTAX_ERROR A2D9 [ROM+02D9] 60 RTS ; return L_A2DA: A2DA [ROM+02DA] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char A2DD [ROM+02DD] 20 6E A2 JSR MON_PARSE_HEX_WORD ; call/jump to mon parse hex word A2E0 [ROM+02E0] B0 DE BCS L_A2C0 MON_SYNTAX_ERROR: A2E2 [ROM+02E2] AE 3F 02 LDX MON_SP ; monitor saved stack pointer A2E5 [ROM+02E5] 9A TXS A2E6 [ROM+02E6] A9 3F LDA #$3F ; print ? for monitor syntax/error indication A2E8 [ROM+02E8] 20 D2 FF JSR CHROUT ; KERNAL CHROUT A2EB [ROM+02EB] 4C 49 A0 JMP MON_COMMAND_LOOP ; call/jump to mon command loop L_A2EE: A2EE [ROM+02EE] 20 3A A5 JSR MON_PRINT_SPACE ; call/jump to mon print space A2F1 [ROM+02F1] CA DEX A2F2 [ROM+02F2] D0 FA BNE L_A2EE A2F4 [ROM+02F4] 60 RTS ; return L_A2F5: A2F5 [ROM+02F5] E6 C3 INC $C3 A2F7 [ROM+02F7] D0 02 BNE L_A2FB A2F9 [ROM+02F9] E6 C4 INC $C4 L_A2FB: A2FB [ROM+02FB] 60 RTS ; return L_A2FC: A2FC [ROM+02FC] A2 02 LDX #$02 L_A2FE: A2FE [ROM+02FE] B5 C0 LDA $C0,X A300 [ROM+0300] 48 PHA ; save A on stack A301 [ROM+0301] B5 27 LDA $27,X A303 [ROM+0303] 95 C0 STA $C0,X A305 [ROM+0305] 68 PLA ; restore/pull byte from stack A306 [ROM+0306] 95 27 STA $27,X A308 [ROM+0308] CA DEX A309 [ROM+0309] D0 F3 BNE L_A2FE A30B [ROM+030B] 60 RTS ; return L_A30C: A30C [ROM+030C] A5 C3 LDA $C3 A30E [ROM+030E] A4 C4 LDY $C4 A310 [ROM+0310] 38 SEC A311 [ROM+0311] E9 02 SBC #$02 A313 [ROM+0313] B0 0E BCS L_A323 A315 [ROM+0315] 88 DEY A316 [ROM+0316] 90 0B BCC L_A323 L_A318: A318 [ROM+0318] A5 28 LDA $28 A31A [ROM+031A] A4 29 LDY $29 A31C [ROM+031C] 4C 23 A3 JMP L_A323 L_A31F: A31F [ROM+031F] A5 C3 LDA $C3 A321 [ROM+0321] A4 C4 LDY $C4 L_A323: A323 [ROM+0323] 38 SEC A324 [ROM+0324] E5 C1 SBC $C1 A326 [ROM+0326] 85 1E STA $1E A328 [ROM+0328] 98 TYA A329 [ROM+0329] E5 C2 SBC $C2 A32B [ROM+032B] A8 TAY A32C [ROM+032C] 05 1E ORA $1E A32E [ROM+032E] 60 RTS ; return ; -------------------------------------------------------------------------- ; Monitor T command: transfer/copy a range of memory. ; -------------------------------------------------------------------------- MON_CMD_T_TRANSFER: A32F [ROM+032F] 20 C9 A2 JSR L_A2C9 A332 [ROM+0332] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A335 [ROM+0335] 20 DA A2 JSR L_A2DA A338 [ROM+0338] 20 FC A2 JSR L_A2FC A33B [ROM+033B] 20 DA A2 JSR L_A2DA A33E [ROM+033E] 20 1F A3 JSR L_A31F A341 [ROM+0341] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A344 [ROM+0344] 90 15 BCC L_A35B L_A346: A346 [ROM+0346] A6 26 LDX $26 A348 [ROM+0348] D0 64 BNE L_A3AE A34A [ROM+034A] 20 18 A3 JSR L_A318 A34D [ROM+034D] 90 5F BCC L_A3AE A34F [ROM+034F] A1 C1 LDA ($C1,X) A351 [ROM+0351] 81 C3 STA ($C3,X) A353 [ROM+0353] 20 F5 A2 JSR L_A2F5 A356 [ROM+0356] 20 35 A0 JSR MON_INC_PTR ; call/jump to mon inc ptr A359 [ROM+0359] D0 EB BNE L_A346 L_A35B: A35B [ROM+035B] 20 18 A3 JSR L_A318 A35E [ROM+035E] 18 CLC A35F [ROM+035F] A5 1E LDA $1E A361 [ROM+0361] 65 C3 ADC $C3 A363 [ROM+0363] 85 C3 STA $C3 A365 [ROM+0365] 98 TYA A366 [ROM+0366] 65 C4 ADC $C4 A368 [ROM+0368] 85 C4 STA $C4 A36A [ROM+036A] 20 FC A2 JSR L_A2FC L_A36D: A36D [ROM+036D] A6 26 LDX $26 A36F [ROM+036F] D0 3D BNE L_A3AE A371 [ROM+0371] A1 C1 LDA ($C1,X) A373 [ROM+0373] 81 C3 STA ($C3,X) A375 [ROM+0375] 20 18 A3 JSR L_A318 A378 [ROM+0378] B0 34 BCS L_A3AE A37A [ROM+037A] 20 AD A2 JSR L_A2AD A37D [ROM+037D] 20 B0 A2 JSR L_A2B0 A380 [ROM+0380] 4C 6D A3 JMP L_A36D ; -------------------------------------------------------------------------- ; Monitor F command: fill a memory range with a byte value. ; -------------------------------------------------------------------------- MON_CMD_F_FILL: A383 [ROM+0383] 20 C9 A2 JSR L_A2C9 A386 [ROM+0386] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A389 [ROM+0389] 20 DA A2 JSR L_A2DA A38C [ROM+038C] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A38F [ROM+038F] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char A392 [ROM+0392] 20 7D A2 JSR MON_PARSE_HEX_BYTE ; call/jump to mon parse hex byte A395 [ROM+0395] 90 14 BCC L_A3AB A397 [ROM+0397] 85 1D STA $1D L_A399: A399 [ROM+0399] A6 26 LDX $26 A39B [ROM+039B] D0 11 BNE L_A3AE A39D [ROM+039D] 20 1F A3 JSR L_A31F A3A0 [ROM+03A0] 90 0C BCC L_A3AE A3A2 [ROM+03A2] A5 1D LDA $1D A3A4 [ROM+03A4] 81 C1 STA ($C1,X) A3A6 [ROM+03A6] 20 35 A0 JSR MON_INC_PTR ; call/jump to mon inc ptr A3A9 [ROM+03A9] D0 EE BNE L_A399 L_A3AB: A3AB [ROM+03AB] 4C E2 A2 JMP MON_SYNTAX_ERROR ; call/jump to mon syntax error L_A3AE: A3AE [ROM+03AE] 4C 49 A0 JMP MON_COMMAND_LOOP ; call/jump to mon command loop ; -------------------------------------------------------------------------- ; Monitor H command: hunt/search memory for a byte sequence. ; -------------------------------------------------------------------------- MON_CMD_H_HUNT: A3B1 [ROM+03B1] 20 C9 A2 JSR L_A2C9 A3B4 [ROM+03B4] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A3B7 [ROM+03B7] 20 DA A2 JSR L_A2DA A3BA [ROM+03BA] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A3BD [ROM+03BD] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char A3C0 [ROM+03C0] A2 00 LDX #$00 A3C2 [ROM+03C2] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char A3C5 [ROM+03C5] C9 27 CMP #$27 A3C7 [ROM+03C7] D0 14 BNE L_A3DD A3C9 [ROM+03C9] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char L_A3CC: A3CC [ROM+03CC] 9D 10 02 STA $0210,X A3CF [ROM+03CF] E8 INX A3D0 [ROM+03D0] 20 CF FF JSR CHRIN ; KERNAL CHRIN A3D3 [ROM+03D3] C9 0D CMP #$0D A3D5 [ROM+03D5] F0 22 BEQ L_A3F9 A3D7 [ROM+03D7] E0 20 CPX #$20 A3D9 [ROM+03D9] D0 F1 BNE L_A3CC A3DB [ROM+03DB] F0 1C BEQ L_A3F9 L_A3DD: A3DD [ROM+03DD] 8E 00 01 STX $0100 A3E0 [ROM+03E0] 20 84 A2 JSR L_A284 A3E3 [ROM+03E3] 90 C6 BCC L_A3AB L_A3E5: A3E5 [ROM+03E5] 9D 10 02 STA $0210,X A3E8 [ROM+03E8] E8 INX A3E9 [ROM+03E9] 20 CF FF JSR CHRIN ; KERNAL CHRIN A3EC [ROM+03EC] C9 0D CMP #$0D A3EE [ROM+03EE] F0 09 BEQ L_A3F9 A3F0 [ROM+03F0] 20 7D A2 JSR MON_PARSE_HEX_BYTE ; call/jump to mon parse hex byte A3F3 [ROM+03F3] 90 B6 BCC L_A3AB A3F5 [ROM+03F5] E0 20 CPX #$20 A3F7 [ROM+03F7] D0 EC BNE L_A3E5 L_A3F9: A3F9 [ROM+03F9] 86 1C STX $1C A3FB [ROM+03FB] 20 3D A5 JSR MON_PRINT_CR ; call/jump to mon print cr L_A3FE: A3FE [ROM+03FE] A2 00 LDX #$00 A400 [ROM+0400] A0 00 LDY #$00 L_A402: A402 [ROM+0402] B1 C1 LDA ($C1),Y A404 [ROM+0404] DD 10 02 CMP $0210,X A407 [ROM+0407] D0 0C BNE L_A415 A409 [ROM+0409] C8 INY A40A [ROM+040A] E8 INX A40B [ROM+040B] E4 1C CPX $1C A40D [ROM+040D] D0 F3 BNE L_A402 A40F [ROM+040F] 20 36 A2 JSR MON_PRINT_WORD ; call/jump to mon print word A412 [ROM+0412] 20 3A A5 JSR MON_PRINT_SPACE ; call/jump to mon print space L_A415: A415 [ROM+0415] 20 35 A0 JSR MON_INC_PTR ; call/jump to mon inc ptr A418 [ROM+0418] A6 26 LDX $26 A41A [ROM+041A] D0 92 BNE L_A3AE A41C [ROM+041C] 20 1F A3 JSR L_A31F A41F [ROM+041F] B0 DD BCS L_A3FE A421 [ROM+0421] 4C 49 A0 JMP MON_COMMAND_LOOP ; call/jump to mon command loop ; -------------------------------------------------------------------------- ; Monitor D command: disassemble 6502 instructions using the compact tables at $A6B0+. ; -------------------------------------------------------------------------- MON_CMD_D_DISASSEMBLE: A424 [ROM+0424] 20 C9 A2 JSR L_A2C9 A427 [ROM+0427] 85 20 STA $20 A429 [ROM+0429] A5 C2 LDA $C2 A42B [ROM+042B] 85 21 STA $21 A42D [ROM+042D] A2 00 LDX #$00 A42F [ROM+042F] 86 28 STX $28 L_A431: A431 [ROM+0431] A9 93 LDA #$93 A433 [ROM+0433] 20 D2 FF JSR CHROUT ; KERNAL CHROUT A436 [ROM+0436] A9 16 LDA #$16 A438 [ROM+0438] 85 1D STA $1D L_A43A: A43A [ROM+043A] 20 50 A4 JSR L_A450 A43D [ROM+043D] 20 B0 A4 JSR L_A4B0 A440 [ROM+0440] 85 C1 STA $C1 A442 [ROM+0442] 84 C2 STY $C2 A444 [ROM+0444] C6 1D DEC $1D A446 [ROM+0446] D0 F2 BNE L_A43A A448 [ROM+0448] A9 91 LDA #$91 A44A [ROM+044A] 20 D2 FF JSR CHROUT ; KERNAL CHROUT A44D [ROM+044D] 4C 49 A0 JMP MON_COMMAND_LOOP ; call/jump to mon command loop L_A450: A450 [ROM+0450] A0 2C LDY #$2C A452 [ROM+0452] 20 BA A0 JSR MON_PRINT_PREFIX ; call/jump to mon print prefix A455 [ROM+0455] 20 3A A5 JSR MON_PRINT_SPACE ; call/jump to mon print space L_A458: A458 [ROM+0458] 20 36 A2 JSR MON_PRINT_WORD ; call/jump to mon print word A45B [ROM+045B] 20 3A A5 JSR MON_PRINT_SPACE ; call/jump to mon print space A45E [ROM+045E] A2 00 LDX #$00 A460 [ROM+0460] A1 C1 LDA ($C1,X) A462 [ROM+0462] 20 BF A4 JSR L_A4BF A465 [ROM+0465] 48 PHA ; save A on stack A466 [ROM+0466] 20 05 A5 JSR L_A505 A469 [ROM+0469] 68 PLA ; restore/pull byte from stack A46A [ROM+046A] 20 1B A5 JSR L_A51B A46D [ROM+046D] A2 06 LDX #$06 L_A46F: A46F [ROM+046F] E0 03 CPX #$03 A471 [ROM+0471] D0 12 BNE L_A485 A473 [ROM+0473] A4 1F LDY $1F A475 [ROM+0475] F0 0E BEQ L_A485 L_A477: A477 [ROM+0477] A5 2A LDA $2A A479 [ROM+0479] C9 E8 CMP #$E8 A47B [ROM+047B] B1 C1 LDA ($C1),Y A47D [ROM+047D] B0 1C BCS L_A49B A47F [ROM+047F] 20 A8 A4 JSR L_A4A8 A482 [ROM+0482] 88 DEY A483 [ROM+0483] D0 F2 BNE L_A477 L_A485: A485 [ROM+0485] 06 2A ASL $2A A487 [ROM+0487] 90 0E BCC L_A497 A489 [ROM+0489] BD 01 A7 LDA MON_FORMAT_CHAR_TABLE,X A48C [ROM+048C] 20 86 A5 JSR L_A586 A48F [ROM+048F] BD 07 A7 LDA $A707,X A492 [ROM+0492] F0 03 BEQ L_A497 A494 [ROM+0494] 20 86 A5 JSR L_A586 L_A497: A497 [ROM+0497] CA DEX A498 [ROM+0498] D0 D5 BNE L_A46F A49A [ROM+049A] 60 RTS ; return L_A49B: A49B [ROM+049B] 20 B3 A4 JSR L_A4B3 A49E [ROM+049E] AA TAX A49F [ROM+049F] E8 INX A4A0 [ROM+04A0] D0 01 BNE L_A4A3 A4A2 [ROM+04A2] C8 INY L_A4A3: A4A3 [ROM+04A3] 98 TYA A4A4 [ROM+04A4] 20 A8 A4 JSR L_A4A8 A4A7 [ROM+04A7] 8A TXA L_A4A8: A4A8 [ROM+04A8] 86 1C STX $1C A4AA [ROM+04AA] 20 3D A2 JSR MON_PRINT_HEX_BYTE ; call/jump to mon print hex byte A4AD [ROM+04AD] A6 1C LDX $1C A4AF [ROM+04AF] 60 RTS ; return L_A4B0: A4B0 [ROM+04B0] A5 1F LDA $1F A4B2 [ROM+04B2] 38 SEC L_A4B3: A4B3 [ROM+04B3] A4 C2 LDY $C2 A4B5 [ROM+04B5] AA TAX A4B6 [ROM+04B6] 10 01 BPL L_A4B9 A4B8 [ROM+04B8] 88 DEY L_A4B9: A4B9 [ROM+04B9] 65 C1 ADC $C1 A4BB [ROM+04BB] 90 01 BCC L_A4BE A4BD [ROM+04BD] C8 INY L_A4BE: A4BE [ROM+04BE] 60 RTS ; return L_A4BF: A4BF [ROM+04BF] A8 TAY A4C0 [ROM+04C0] 4A LSR A A4C1 [ROM+04C1] 90 0B BCC L_A4CE A4C3 [ROM+04C3] 4A LSR A A4C4 [ROM+04C4] B0 17 BCS L_A4DD A4C6 [ROM+04C6] C9 22 CMP #$22 A4C8 [ROM+04C8] F0 13 BEQ L_A4DD A4CA [ROM+04CA] 29 07 AND #$07 A4CC [ROM+04CC] 09 80 ORA #$80 L_A4CE: A4CE [ROM+04CE] 4A LSR A A4CF [ROM+04CF] AA TAX A4D0 [ROM+04D0] BD B0 A6 LDA MON_OPCODE_MODE_TABLE,X A4D3 [ROM+04D3] B0 04 BCS L_A4D9 A4D5 [ROM+04D5] 4A LSR A A4D6 [ROM+04D6] 4A LSR A A4D7 [ROM+04D7] 4A LSR A A4D8 [ROM+04D8] 4A LSR A L_A4D9: A4D9 [ROM+04D9] 29 0F AND #$0F A4DB [ROM+04DB] D0 04 BNE L_A4E1 L_A4DD: A4DD [ROM+04DD] A0 80 LDY #$80 A4DF [ROM+04DF] A9 00 LDA #$00 L_A4E1: A4E1 [ROM+04E1] AA TAX A4E2 [ROM+04E2] BD F4 A6 LDA MON_MODE_FORMAT_TABLE,X A4E5 [ROM+04E5] 85 2A STA $2A A4E7 [ROM+04E7] 29 03 AND #$03 A4E9 [ROM+04E9] 85 1F STA $1F A4EB [ROM+04EB] 98 TYA A4EC [ROM+04EC] 29 8F AND #$8F A4EE [ROM+04EE] AA TAX A4EF [ROM+04EF] 98 TYA A4F0 [ROM+04F0] A0 03 LDY #$03 A4F2 [ROM+04F2] E0 8A CPX #$8A A4F4 [ROM+04F4] F0 0B BEQ L_A501 L_A4F6: A4F6 [ROM+04F6] 4A LSR A A4F7 [ROM+04F7] 90 08 BCC L_A501 A4F9 [ROM+04F9] 4A LSR A L_A4FA: A4FA [ROM+04FA] 4A LSR A A4FB [ROM+04FB] 09 20 ORA #$20 A4FD [ROM+04FD] 88 DEY A4FE [ROM+04FE] D0 FA BNE L_A4FA A500 [ROM+0500] C8 INY L_A501: A501 [ROM+0501] 88 DEY A502 [ROM+0502] D0 F2 BNE L_A4F6 A504 [ROM+0504] 60 RTS ; return L_A505: A505 [ROM+0505] B1 C1 LDA ($C1),Y A507 [ROM+0507] 20 A8 A4 JSR L_A4A8 A50A [ROM+050A] A2 01 LDX #$01 L_A50C: A50C [ROM+050C] 20 EE A2 JSR L_A2EE A50F [ROM+050F] C4 1F CPY $1F A511 [ROM+0511] C8 INY A512 [ROM+0512] 90 F1 BCC L_A505 A514 [ROM+0514] A2 03 LDX #$03 A516 [ROM+0516] C0 04 CPY #$04 A518 [ROM+0518] 90 F2 BCC L_A50C A51A [ROM+051A] 60 RTS ; return L_A51B: A51B [ROM+051B] A8 TAY A51C [ROM+051C] B9 0E A7 LDA MON_PACKED_MNEMONICS,Y A51F [ROM+051F] 85 28 STA $28 A521 [ROM+0521] B9 4E A7 LDA $A74E,Y A524 [ROM+0524] 85 29 STA $29 L_A526: A526 [ROM+0526] A9 00 LDA #$00 A528 [ROM+0528] A0 05 LDY #$05 L_A52A: A52A [ROM+052A] 06 29 ASL $29 A52C [ROM+052C] 26 28 ROL $28 A52E [ROM+052E] 2A ROL A A52F [ROM+052F] 88 DEY A530 [ROM+0530] D0 F8 BNE L_A52A A532 [ROM+0532] 69 3F ADC #$3F A534 [ROM+0534] 20 D2 FF JSR CHROUT ; KERNAL CHROUT A537 [ROM+0537] CA DEX A538 [ROM+0538] D0 EC BNE L_A526 MON_PRINT_SPACE: A53A [ROM+053A] A9 20 LDA #$20 A53C [ROM+053C] 2C A9 0D BIT $0DA9 A53F [ROM+053F] 4C D2 FF JMP CHROUT ; KERNAL CHROUT ; -------------------------------------------------------------------------- ; Monitor P command: send a disassembly listing to the selected output/printing path. ; -------------------------------------------------------------------------- MON_CMD_P_PRINT_DISASSEMBLY: A542 [ROM+0542] 20 C9 A2 JSR L_A2C9 A545 [ROM+0545] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A548 [ROM+0548] 20 DA A2 JSR L_A2DA A54B [ROM+054B] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A54E [ROM+054E] A2 00 LDX #$00 A550 [ROM+0550] 86 28 STX $28 L_A552: A552 [ROM+0552] 20 3D A5 JSR MON_PRINT_CR ; call/jump to mon print cr A555 [ROM+0555] 20 58 A4 JSR L_A458 A558 [ROM+0558] 20 B0 A4 JSR L_A4B0 A55B [ROM+055B] 85 C1 STA $C1 A55D [ROM+055D] 84 C2 STY $C2 A55F [ROM+055F] 20 E1 FF JSR STOP ; KERNAL STOP A562 [ROM+0562] F0 05 BEQ L_A569 A564 [ROM+0564] 20 1F A3 JSR L_A31F A567 [ROM+0567] B0 E9 BCS L_A552 L_A569: A569 [ROM+0569] 4C 49 A0 JMP MON_COMMAND_LOOP ; call/jump to mon command loop MON_CMD_COMMA: A56C [ROM+056C] 20 C9 A2 JSR L_A2C9 A56F [ROM+056F] A9 03 LDA #$03 A571 [ROM+0571] 85 1D STA $1D L_A573: A573 [ROM+0573] 20 40 A0 JSR MON_GET_CHAR ; call/jump to mon get char A576 [ROM+0576] 20 99 A0 JSR MON_STORE_BYTE ; call/jump to mon store byte A579 [ROM+0579] D0 F8 BNE L_A573 A57B [ROM+057B] A5 20 LDA $20 A57D [ROM+057D] 85 C1 STA $C1 A57F [ROM+057F] A5 21 LDA $21 A581 [ROM+0581] 85 C2 STA $C2 A583 [ROM+0583] 4C 31 A4 JMP L_A431 L_A586: A586 [ROM+0586] C5 28 CMP $28 A588 [ROM+0588] F0 03 BEQ L_A58D A58A [ROM+058A] 20 D2 FF JSR CHROUT ; KERNAL CHROUT L_A58D: A58D [ROM+058D] 60 RTS ; return ; -------------------------------------------------------------------------- ; Monitor A command: simple line assembler. Mnemonics/addressing modes are encoded ; using the same compact tables used by the disassembler. ; -------------------------------------------------------------------------- MON_CMD_A_ASSEMBLE: A58E [ROM+058E] 20 C9 A2 JSR L_A2C9 L_A591: A591 [ROM+0591] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A594 [ROM+0594] 8E 11 02 STX $0211 A597 [ROM+0597] A2 03 LDX #$03 L_A599: A599 [ROM+0599] 20 C1 A2 JSR MON_SKIP_SPACES ; call/jump to mon skip spaces A59C [ROM+059C] 48 PHA ; save A on stack A59D [ROM+059D] CA DEX A59E [ROM+059E] D0 F9 BNE L_A599 A5A0 [ROM+05A0] A2 03 LDX #$03 L_A5A2: A5A2 [ROM+05A2] 68 PLA ; restore/pull byte from stack A5A3 [ROM+05A3] 38 SEC A5A4 [ROM+05A4] E9 3F SBC #$3F A5A6 [ROM+05A6] A0 05 LDY #$05 L_A5A8: A5A8 [ROM+05A8] 4A LSR A A5A9 [ROM+05A9] 6E 11 02 ROR $0211 A5AC [ROM+05AC] 6E 10 02 ROR $0210 A5AF [ROM+05AF] 88 DEY A5B0 [ROM+05B0] D0 F6 BNE L_A5A8 A5B2 [ROM+05B2] CA DEX A5B3 [ROM+05B3] D0 ED BNE L_A5A2 A5B5 [ROM+05B5] A2 02 LDX #$02 L_A5B7: A5B7 [ROM+05B7] 20 CF FF JSR CHRIN ; KERNAL CHRIN A5BA [ROM+05BA] C9 0D CMP #$0D A5BC [ROM+05BC] F0 1E BEQ L_A5DC A5BE [ROM+05BE] C9 20 CMP #$20 A5C0 [ROM+05C0] F0 F5 BEQ L_A5B7 A5C2 [ROM+05C2] 20 A7 A6 JSR L_A6A7 A5C5 [ROM+05C5] B0 0F BCS L_A5D6 A5C7 [ROM+05C7] 20 91 A2 JSR L_A291 A5CA [ROM+05CA] A4 C1 LDY $C1 A5CC [ROM+05CC] 84 C2 STY $C2 A5CE [ROM+05CE] 85 C1 STA $C1 A5D0 [ROM+05D0] A9 30 LDA #$30 A5D2 [ROM+05D2] 9D 10 02 STA $0210,X A5D5 [ROM+05D5] E8 INX L_A5D6: A5D6 [ROM+05D6] 9D 10 02 STA $0210,X A5D9 [ROM+05D9] E8 INX A5DA [ROM+05DA] D0 DB BNE L_A5B7 L_A5DC: A5DC [ROM+05DC] 86 28 STX $28 A5DE [ROM+05DE] A2 00 LDX #$00 A5E0 [ROM+05E0] 86 26 STX $26 A5E2 [ROM+05E2] F0 04 BEQ L_A5E8 L_A5E4: A5E4 [ROM+05E4] E6 26 INC $26 A5E6 [ROM+05E6] F0 75 BEQ L_A65D L_A5E8: A5E8 [ROM+05E8] A2 00 LDX #$00 A5EA [ROM+05EA] 86 1D STX $1D A5EC [ROM+05EC] A5 26 LDA $26 A5EE [ROM+05EE] 20 BF A4 JSR L_A4BF A5F1 [ROM+05F1] A6 2A LDX $2A A5F3 [ROM+05F3] 86 29 STX $29 A5F5 [ROM+05F5] AA TAX A5F6 [ROM+05F6] BC 0E A7 LDY MON_PACKED_MNEMONICS,X A5F9 [ROM+05F9] BD 4E A7 LDA $A74E,X A5FC [ROM+05FC] 20 90 A6 JSR L_A690 A5FF [ROM+05FF] D0 E3 BNE L_A5E4 A601 [ROM+0601] A2 06 LDX #$06 L_A603: A603 [ROM+0603] E0 03 CPX #$03 A605 [ROM+0605] D0 19 BNE L_A620 A607 [ROM+0607] A4 1F LDY $1F A609 [ROM+0609] F0 15 BEQ L_A620 L_A60B: A60B [ROM+060B] A5 2A LDA $2A A60D [ROM+060D] C9 E8 CMP #$E8 A60F [ROM+060F] A9 30 LDA #$30 A611 [ROM+0611] B0 21 BCS L_A634 A613 [ROM+0613] 20 96 A6 JSR L_A696 A616 [ROM+0616] D0 CC BNE L_A5E4 A618 [ROM+0618] 20 98 A6 JSR L_A698 A61B [ROM+061B] D0 C7 BNE L_A5E4 A61D [ROM+061D] 88 DEY A61E [ROM+061E] D0 EB BNE L_A60B L_A620: A620 [ROM+0620] 06 2A ASL $2A A622 [ROM+0622] 90 0B BCC L_A62F A624 [ROM+0624] BC 07 A7 LDY $A707,X A627 [ROM+0627] BD 01 A7 LDA MON_FORMAT_CHAR_TABLE,X A62A [ROM+062A] 20 90 A6 JSR L_A690 A62D [ROM+062D] D0 B5 BNE L_A5E4 L_A62F: A62F [ROM+062F] CA DEX A630 [ROM+0630] D0 D1 BNE L_A603 A632 [ROM+0632] F0 0A BEQ L_A63E L_A634: A634 [ROM+0634] 20 8F A6 JSR L_A68F A637 [ROM+0637] D0 AB BNE L_A5E4 A639 [ROM+0639] 20 8F A6 JSR L_A68F A63C [ROM+063C] D0 A6 BNE L_A5E4 L_A63E: A63E [ROM+063E] A5 28 LDA $28 A640 [ROM+0640] C5 1D CMP $1D A642 [ROM+0642] D0 A0 BNE L_A5E4 A644 [ROM+0644] 20 5E A2 JSR MON_SWAP_ADDR_PAIRS ; call/jump to mon swap addr pairs A647 [ROM+0647] A4 1F LDY $1F A649 [ROM+0649] F0 28 BEQ L_A673 A64B [ROM+064B] A5 29 LDA $29 A64D [ROM+064D] C9 9D CMP #$9D A64F [ROM+064F] D0 1A BNE L_A66B A651 [ROM+0651] 20 0C A3 JSR L_A30C A654 [ROM+0654] 90 0A BCC L_A660 A656 [ROM+0656] 98 TYA A657 [ROM+0657] D0 04 BNE L_A65D A659 [ROM+0659] A5 1E LDA $1E A65B [ROM+065B] 10 0A BPL L_A667 L_A65D: A65D [ROM+065D] 4C E2 A2 JMP MON_SYNTAX_ERROR ; call/jump to mon syntax error L_A660: A660 [ROM+0660] C8 INY A661 [ROM+0661] D0 FA BNE L_A65D A663 [ROM+0663] A5 1E LDA $1E A665 [ROM+0665] 10 F6 BPL L_A65D L_A667: A667 [ROM+0667] A4 1F LDY $1F A669 [ROM+0669] D0 03 BNE L_A66E L_A66B: A66B [ROM+066B] B9 C2 00 LDA $00C2,Y L_A66E: A66E [ROM+066E] 91 C1 STA ($C1),Y A670 [ROM+0670] 88 DEY A671 [ROM+0671] D0 F8 BNE L_A66B L_A673: A673 [ROM+0673] A5 26 LDA $26 A675 [ROM+0675] 91 C1 STA ($C1),Y A677 [ROM+0677] 20 B0 A4 JSR L_A4B0 A67A [ROM+067A] 85 C1 STA $C1 A67C [ROM+067C] 84 C2 STY $C2 A67E [ROM+067E] A0 41 LDY #$41 A680 [ROM+0680] 20 BA A0 JSR MON_PRINT_PREFIX ; call/jump to mon print prefix A683 [ROM+0683] 20 3A A5 JSR MON_PRINT_SPACE ; call/jump to mon print space A686 [ROM+0686] 20 36 A2 JSR MON_PRINT_WORD ; call/jump to mon print word A689 [ROM+0689] 20 3A A5 JSR MON_PRINT_SPACE ; call/jump to mon print space A68C [ROM+068C] 4C 91 A5 JMP L_A591 L_A68F: A68F [ROM+068F] A8 TAY L_A690: A690 [ROM+0690] 20 96 A6 JSR L_A696 A693 [ROM+0693] D0 11 BNE L_A6A6 A695 [ROM+0695] 98 TYA L_A696: A696 [ROM+0696] F0 0E BEQ L_A6A6 L_A698: A698 [ROM+0698] 86 1C STX $1C A69A [ROM+069A] A6 1D LDX $1D A69C [ROM+069C] DD 10 02 CMP $0210,X A69F [ROM+069F] 08 PHP A6A0 [ROM+06A0] E8 INX A6A1 [ROM+06A1] 86 1D STX $1D A6A3 [ROM+06A3] A6 1C LDX $1C A6A5 [ROM+06A5] 28 PLP L_A6A6: A6A6 [ROM+06A6] 60 RTS ; return L_A6A7: A6A7 [ROM+06A7] C9 30 CMP #$30 A6A9 [ROM+06A9] 90 03 BCC L_A6AE A6AB [ROM+06AB] C9 47 CMP #$47 A6AD [ROM+06AD] 60 RTS ; return L_A6AE: A6AE [ROM+06AE] 38 SEC A6AF [ROM+06AF] 60 RTS ; return ; -------------------------------------------------------------------------- ; Monitor opcode/addressing-mode table ; DATA, not executable code: compact opcode/addressing-mode decoding tables for ; the monitor assembler/disassembler. The encoding is internal to this monitor. ; -------------------------------------------------------------------------- ; -------------------------------------------------------------------------- ; DATA, not executable code: compact opcode/addressing-mode decoding tables for ; the monitor assembler/disassembler. The encoding is internal to this monitor. ; -------------------------------------------------------------------------- MON_OPCODE_MODE_TABLE: A6B0 [ROM+06B0] 40 02 45 03 D0 08 40 09 30 22 45 33 D0 08 40 09 .byte $40, $02, $45, $03, $D0, $08, $40, $09, $30, $22, $45, $33, $D0, $08, $40, $09 ; @.E...@.0"E3..@. A6C0 [ROM+06C0] 40 02 45 33 D0 08 40 09 40 02 45 B3 D0 08 40 09 .byte $40, $02, $45, $33, $D0, $08, $40, $09, $40, $02, $45, $B3, $D0, $08, $40, $09 ; @.E3..@.@.E...@. A6D0 [ROM+06D0] 00 22 44 33 D0 8C 44 00 11 22 44 33 D0 8C 44 9A .byte $00, $22, $44, $33, $D0, $8C, $44, $00, $11, $22, $44, $33, $D0, $8C, $44, $9A ; ."D3..D.."D3..D. A6E0 [ROM+06E0] 10 22 44 33 D0 08 40 09 10 22 44 33 D0 08 40 09 .byte $10, $22, $44, $33, $D0, $08, $40, $09, $10, $22, $44, $33, $D0, $08, $40, $09 ; ."D3..@.."D3..@. A6F0 [ROM+06F0] 62 13 78 A9 .byte $62, $13, $78, $A9 ; b.x. ; -------------------------------------------------------------------------- ; Monitor mode/format table ; -------------------------------------------------------------------------- MON_MODE_FORMAT_TABLE: A6F4 [ROM+06F4] 00 21 81 82 00 00 59 4D 91 92 86 4A 85 .byte $00, $21, $81, $82, $00, $00, $59, $4D, $91, $92, $86, $4A, $85 ; .!....YM...J. ; -------------------------------------------------------------------------- ; Monitor formatting-character table ; -------------------------------------------------------------------------- MON_FORMAT_CHAR_TABLE: A701 [ROM+0701] 9D 2C 29 2C 23 28 24 59 00 58 24 24 00 .byte $9D, $2C, $29, $2C, $23, $28, $24, $59, $00, $58, $24, $24, $00 ; .,),#($Y.X$$. ; -------------------------------------------------------------------------- ; Packed mnemonic table ; Compact assembler/disassembler mnemonic representation; intentionally left as raw bytes. ; -------------------------------------------------------------------------- MON_PACKED_MNEMONICS: A70E [ROM+070E] 1C 8A 1C 23 5D 8B 1B A1 9D 8A 1D 23 9D 8B 1D A1 .byte $1C, $8A, $1C, $23, $5D, $8B, $1B, $A1, $9D, $8A, $1D, $23, $9D, $8B, $1D, $A1 ; ...#]......#.... A71E [ROM+071E] 00 29 19 AE 69 A8 19 23 24 53 1B 23 24 53 19 A1 .byte $00, $29, $19, $AE, $69, $A8, $19, $23, $24, $53, $1B, $23, $24, $53, $19, $A1 ; .)..i..#$S.#$S.. A72E [ROM+072E] 00 1A 5B 5B A5 69 24 24 AE AE A8 AD 29 00 7C 00 .byte $00, $1A, $5B, $5B, $A5, $69, $24, $24, $AE, $AE, $A8, $AD, $29, $00, $7C, $00 ; ..[[.i$$....).|. A73E [ROM+073E] 15 9C 6D 9C A5 69 29 53 84 13 34 11 A5 69 23 A0 .byte $15, $9C, $6D, $9C, $A5, $69, $29, $53, $84, $13, $34, $11, $A5, $69, $23, $A0 ; ..m..i)S..4..i#. A74E [ROM+074E] D8 62 5A 48 26 62 94 88 54 44 C8 54 68 44 E8 94 .byte $D8, $62, $5A, $48, $26, $62, $94, $88, $54, $44, $C8, $54, $68, $44, $E8, $94 ; .bZH&b..TD.ThD.. A75E [ROM+075E] 00 B4 08 84 74 B4 28 6E 74 F4 CC 4A 72 F2 A4 8A .byte $00, $B4, $08, $84, $74, $B4, $28, $6E, $74, $F4, $CC, $4A, $72, $F2, $A4, $8A ; ....t.(nt..Jr... A76E [ROM+076E] 00 AA A2 A2 74 74 74 72 44 68 B2 32 B2 00 22 00 .byte $00, $AA, $A2, $A2, $74, $74, $74, $72, $44, $68, $B2, $32, $B2, $00, $22, $00 ; ....tttrDh.2..". A77E [ROM+077E] 1A 1A 26 26 72 72 88 C8 C4 CA 26 48 44 44 A2 C8 .byte $1A, $1A, $26, $26, $72, $72, $88, $C8, $C4, $CA, $26, $48, $44, $44, $A2, $C8 ; ..&&rr....&HDD.. ; -------------------------------------------------------------------------- ; Monitor command table and computed-call vectors ; -------------------------------------------------------------------------- ; -------------------------------------------------------------------------- ; DATA: 15 monitor command characters followed by 15 little-endian handler ; addresses stored as (handler-1), then the register display heading. ; -------------------------------------------------------------------------- MON_COMMAND_CHARS: A78E [ROM+078E] 3A 3B 52 4D 47 58 4C 53 54 46 48 44 50 2C 41 .byte $3A, $3B, $52, $4D, $47, $58, $4C, $53, $54, $46, $48, $44, $50, $2C, $41 ; ":;RMGXLSTFHDP,A" MON_COMMAND_VECTORS_MINUS1: A79D [ROM+079D] 3F A1 .word $A13F ; command ':': (MON_CMD_COLON) - 1 A79F [ROM+079F] 32 A1 .word $A132 ; command ';': (MON_CMD_SEMICOLON) - 1 A7A1 [ROM+07A1] C4 A0 .word $A0C4 ; command 'R': (MON_CMD_R_REGISTERS) - 1 A7A3 [ROM+07A3] EA A0 .word $A0EA ; command 'M': (MON_CMD_M_MEMORY) - 1 A7A5 [ROM+07A5] 53 A1 .word $A153 ; command 'G': (MON_CMD_G_GO) - 1 A7A7 [ROM+07A7] 83 A1 .word $A183 ; command 'X': (MON_CMD_X_EXIT) - 1 A7A9 [ROM+07A9] E9 A1 .word $A1E9 ; command 'L': (MON_CMD_L_LOAD) - 1 A7AB [ROM+07AB] 06 A2 .word $A206 ; command 'S': (MON_CMD_S_SAVE) - 1 A7AD [ROM+07AD] 2E A3 .word $A32E ; command 'T': (MON_CMD_T_TRANSFER) - 1 A7AF [ROM+07AF] 82 A3 .word $A382 ; command 'F': (MON_CMD_F_FILL) - 1 A7B1 [ROM+07B1] B0 A3 .word $A3B0 ; command 'H': (MON_CMD_H_HUNT) - 1 A7B3 [ROM+07B3] 23 A4 .word $A423 ; command 'D': (MON_CMD_D_DISASSEMBLE) - 1 A7B5 [ROM+07B5] 41 A5 .word $A541 ; command 'P': (MON_CMD_P_PRINT_DISASSEMBLY) - 1 A7B7 [ROM+07B7] 6B A5 .word $A56B ; command ',': (MON_CMD_COMMA) - 1 A7B9 [ROM+07B9] 8D A5 .word $A58D ; command 'A': (MON_CMD_A_ASSEMBLE) - 1 A7BB [ROM+07BB] 48 A0 .word $A048 ; apparent address-minus-one for $A049; use not proven MON_REGISTER_HEADER: A7BD [ROM+07BD] 0D 20 20 20 50 43 20 20 53 52 20 41 43 20 58 52 20 59 52 20 53 50 .byte $0D, $20, $20, $20, $50, $43, $20, $20, $53, $52, $20, $41, $43, $20, $58, $52, $20, $59, $52, $20, $53, $50 ; Decodes as CR + " PC SR AC XR YR SP". ; -------------------------------------------------------------------------- ; Beginning of the BusCard low-level I/O driver region. These routines service ; IEEE-488, Centronics parallel and normal C64 serial-I/O paths according to the ; DIP-switch/device selection. $DEC0-$DEC3 are the Intel 8255 PPI registers. ; -------------------------------------------------------------------------- BUSCARD_IO_ROUTINE_A7D3: A7D3 [ROM+07D3] 68 PLA ; restore/pull byte from stack A7D4 [ROM+07D4] 20 DA A7 JSR L_A7DA A7D7 [ROM+07D7] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_A7DA: A7DA [ROM+07DA] 48 PHA ; save A on stack A7DB [ROM+07DB] AD C2 DE LDA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A7DE [ROM+07DE] 29 10 AND #$10 A7E0 [ROM+07E0] D0 03 BNE L_A7E5 A7E2 [ROM+07E2] 20 6E EE JSR PPI_SAVE_AND_BSR ; call/jump to ppi save and bsr L_A7E5: A7E5 [ROM+07E5] A9 0F LDA #$0F A7E7 [ROM+07E7] 8D C2 DE STA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A7EA [ROM+07EA] A9 FF LDA #$FF A7EC [ROM+07EC] 8D C0 DE STA PPI_PA ; 8255 port A: IEEE DIO / Centronics data / DIP read A7EF [ROM+07EF] 24 94 BIT $94 A7F1 [ROM+07F1] 10 0F BPL L_A802 A7F3 [ROM+07F3] A9 06 LDA #$06 A7F5 [ROM+07F5] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register A7F8 [ROM+07F8] 20 0A A8 JSR BUSCARD_IO_ROUTINE_A80A ; call/jump to buscard io routine a80a A7FB [ROM+07FB] 46 94 LSR $94 A7FD [ROM+07FD] A9 07 LDA #$07 A7FF [ROM+07FF] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register L_A802: A802 [ROM+0802] 68 PLA ; restore/pull byte from stack A803 [ROM+0803] 85 95 STA $95 A805 [ROM+0805] A9 02 LDA #$02 A807 [ROM+0807] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register BUSCARD_IO_ROUTINE_A80A: A80A [ROM+080A] AD C2 DE LDA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A80D [ROM+080D] 29 C0 AND #$C0 A80F [ROM+080F] C9 C0 CMP #$C0 A811 [ROM+0811] F0 53 BEQ L_A866 A813 [ROM+0813] A5 95 LDA $95 A815 [ROM+0815] 49 FF EOR #$FF A817 [ROM+0817] 8D C0 DE STA PPI_PA ; 8255 port A: IEEE DIO / Centronics data / DIP read L_A81A: A81A [ROM+081A] 2C C2 DE BIT PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A81D [ROM+081D] 50 FB BVC L_A81A A81F [ROM+081F] A9 04 LDA #$04 A821 [ROM+0821] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register L_A824: A824 [ROM+0824] A9 FF LDA #$FF A826 [ROM+0826] 8D 07 DC STA $DC07 A829 [ROM+0829] A9 19 LDA #$19 A82B [ROM+082B] 8D 0F DC STA $DC0F L_A82E: A82E [ROM+082E] AD 07 DC LDA $DC07 A831 [ROM+0831] F0 11 BEQ L_A844 A833 [ROM+0833] 2C C2 DE BIT PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A836 [ROM+0836] 10 F6 BPL L_A82E L_A838: A838 [ROM+0838] A9 05 LDA #$05 A83A [ROM+083A] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register A83D [ROM+083D] A9 FF LDA #$FF A83F [ROM+083F] 8D C0 DE STA PPI_PA ; 8255 port A: IEEE DIO / Centronics data / DIP read A842 [ROM+0842] 18 CLC A843 [ROM+0843] 60 RTS ; return L_A844: A844 [ROM+0844] AD 85 02 LDA $0285 A847 [ROM+0847] 10 16 BPL L_A85F A849 [ROM+0849] 20 92 AA JSR L_AA92 A84C [ROM+084C] D0 D6 BNE L_A824 A84E [ROM+084E] 60 RTS ; return L_A84F: A84F [ROM+084F] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_A852: A852 [ROM+0852] AD 85 02 LDA $0285 A855 [ROM+0855] 10 13 BPL L_A86A A857 [ROM+0857] 20 92 AA JSR L_AA92 A85A [ROM+085A] F0 F3 BEQ L_A84F A85C [ROM+085C] 4C C9 A8 JMP L_A8C9 L_A85F: A85F [ROM+085F] A9 01 LDA #$01 L_A861: A861 [ROM+0861] 20 1C FE JSR $FE1C A864 [ROM+0864] D0 D2 BNE L_A838 L_A866: A866 [ROM+0866] A9 80 LDA #$80 A868 [ROM+0868] 30 F7 BMI L_A861 L_A86A: A86A [ROM+086A] A9 02 LDA #$02 A86C [ROM+086C] 20 1C FE JSR $FE1C A86F [ROM+086F] 20 76 A8 JSR L_A876 A872 [ROM+0872] 18 CLC A873 [ROM+0873] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_A876: A876 [ROM+0876] 20 B6 A8 JSR L_A8B6 A879 [ROM+0879] AD C2 DE LDA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A87C [ROM+087C] 29 3F AND #$3F A87E [ROM+087E] 8D C2 DE STA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A881 [ROM+0881] A9 0D LDA #$0D A883 [ROM+0883] 60 RTS ; return BUSCARD_IO_ROUTINE_A884: A884 [ROM+0884] 20 0A A8 JSR BUSCARD_IO_ROUTINE_A80A ; call/jump to buscard io routine a80a BUSCARD_IO_ROUTINE_A887: A887 [ROM+0887] A9 03 LDA #$03 A889 [ROM+0889] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register A88C [ROM+088C] A9 0B LDA #$0B A88E [ROM+088E] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register A891 [ROM+0891] 60 RTS ; return BUSCARD_IO_ROUTINE_A892: A892 [ROM+0892] 20 0A A8 JSR BUSCARD_IO_ROUTINE_A80A ; call/jump to buscard io routine a80a BUSCARD_IO_ROUTINE_A895: A895 [ROM+0895] 20 76 A8 JSR L_A876 A898 [ROM+0898] 20 87 A8 JSR BUSCARD_IO_ROUTINE_A887 ; call/jump to buscard io routine a887 A89B [ROM+089B] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping BUSCARD_IO_ROUTINE_A89E: A89E [ROM+089E] A9 02 LDA #$02 A8A0 [ROM+08A0] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register A8A3 [ROM+08A3] A9 0A LDA #$0A A8A5 [ROM+08A5] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register A8A8 [ROM+08A8] A9 5F LDA #$5F A8AA [ROM+08AA] 2C A9 3F BIT $3FA9 A8AD [ROM+08AD] 20 DA A7 JSR L_A7DA A8B0 [ROM+08B0] 20 87 A8 JSR BUSCARD_IO_ROUTINE_A887 ; call/jump to buscard io routine a887 A8B3 [ROM+08B3] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_A8B6: A8B6 [ROM+08B6] 20 E8 EF JSR PPI_BSR_HELPER ; call/jump to ppi bsr helper A8B9 [ROM+08B9] A9 00 LDA #$00 A8BB [ROM+08BB] 8D C2 DE STA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A8BE [ROM+08BE] 60 RTS ; return BUSCARD_IO_ROUTINE_A8BF: A8BF [ROM+08BF] AD C2 DE LDA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A8C2 [ROM+08C2] 29 7F AND #$7F A8C4 [ROM+08C4] 09 40 ORA #$40 A8C6 [ROM+08C6] 8D C2 DE STA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input L_A8C9: A8C9 [ROM+08C9] A9 FF LDA #$FF A8CB [ROM+08CB] 8D 07 DC STA $DC07 A8CE [ROM+08CE] A9 19 LDA #$19 A8D0 [ROM+08D0] 8D 0F DC STA $DC0F L_A8D3: A8D3 [ROM+08D3] AD 07 DC LDA $DC07 A8D6 [ROM+08D6] D0 03 BNE L_A8DB A8D8 [ROM+08D8] 4C 52 A8 JMP L_A852 L_A8DB: A8DB [ROM+08DB] AD C2 DE LDA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A8DE [ROM+08DE] 29 04 AND #$04 A8E0 [ROM+08E0] D0 F1 BNE L_A8D3 A8E2 [ROM+08E2] A9 0C LDA #$0C A8E4 [ROM+08E4] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register A8E7 [ROM+08E7] A9 08 LDA #$08 A8E9 [ROM+08E9] 2C C2 DE BIT PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A8EC [ROM+08EC] D0 05 BNE L_A8F3 A8EE [ROM+08EE] A9 40 LDA #$40 A8F0 [ROM+08F0] 20 1C FE JSR $FE1C L_A8F3: A8F3 [ROM+08F3] AD C0 DE LDA PPI_PA ; 8255 port A: IEEE DIO / Centronics data / DIP read A8F6 [ROM+08F6] 49 FF EOR #$FF A8F8 [ROM+08F8] 48 PHA ; save A on stack A8F9 [ROM+08F9] A9 0F LDA #$0F A8FB [ROM+08FB] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register A8FE [ROM+08FE] A9 04 LDA #$04 L_A900: A900 [ROM+0900] 2C C2 DE BIT PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input A903 [ROM+0903] F0 FB BEQ L_A900 A905 [ROM+0905] A9 0E LDA #$0E A907 [ROM+0907] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register A90A [ROM+090A] 68 PLA ; restore/pull byte from stack A90B [ROM+090B] 18 CLC A90C [ROM+090C] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping BUSCARD_IO_ROUTINE_A90F: A90F [ROM+090F] 68 PLA ; restore/pull byte from stack A910 [ROM+0910] 20 1D A9 JSR L_A91D A913 [ROM+0913] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping BUSCARD_IO_ROUTINE_A916: A916 [ROM+0916] 68 PLA ; restore/pull byte from stack A917 [ROM+0917] 20 22 A9 JSR L_A922 A91A [ROM+091A] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_A91D: A91D [ROM+091D] 48 PHA ; save A on stack A91E [ROM+091E] 20 A4 F0 JSR $F0A4 A921 [ROM+0921] 24 48 BIT $48 A923 [ROM+0923] 24 94 BIT $94 A925 [ROM+0925] 10 0A BPL L_A931 A927 [ROM+0927] 38 SEC A928 [ROM+0928] 66 A3 ROR $A3 A92A [ROM+092A] 20 51 A9 JSR BUSCARD_IO_ROUTINE_A951 ; call/jump to buscard io routine a951 A92D [ROM+092D] 46 94 LSR $94 A92F [ROM+092F] 46 A3 LSR $A3 L_A931: A931 [ROM+0931] 68 PLA ; restore/pull byte from stack A932 [ROM+0932] 85 95 STA $95 A934 [ROM+0934] 78 SEI ; disable maskable IRQs A935 [ROM+0935] 20 97 EE JSR CIA2_DATA_LOW_COMPAT ; call/jump to cia2 data low compat A938 [ROM+0938] C9 3F CMP #$3F A93A [ROM+093A] D0 03 BNE L_A93F A93C [ROM+093C] 20 85 EE JSR CIA2_CLK_LOW_COMPAT ; call/jump to cia2 clk low compat L_A93F: A93F [ROM+093F] AD 00 DD LDA CIA2_PRA ; CIA2 port A A942 [ROM+0942] 09 08 ORA #$08 A944 [ROM+0944] 8D 00 DD STA CIA2_PRA ; CIA2 port A BUSCARD_IO_ROUTINE_A947: A947 [ROM+0947] 78 SEI ; disable maskable IRQs A948 [ROM+0948] 20 FB EE JSR CIA2_CLK_HIGH_COMPAT ; call/jump to cia2 clk high compat A94B [ROM+094B] 20 97 EE JSR CIA2_DATA_LOW_COMPAT ; call/jump to cia2 data low compat A94E [ROM+094E] 20 B3 EE JSR SHORT_DELAY ; call/jump to short delay BUSCARD_IO_ROUTINE_A951: A951 [ROM+0951] 78 SEI ; disable maskable IRQs A952 [ROM+0952] 20 97 EE JSR CIA2_DATA_LOW_COMPAT ; call/jump to cia2 data low compat A955 [ROM+0955] 20 A9 EE JSR CIA2_WAIT_STABLE ; call/jump to cia2 wait stable A958 [ROM+0958] B0 64 BCS L_A9BE A95A [ROM+095A] 20 85 EE JSR CIA2_CLK_LOW_COMPAT ; call/jump to cia2 clk low compat A95D [ROM+095D] 24 A3 BIT $A3 A95F [ROM+095F] 10 0A BPL L_A96B L_A961: A961 [ROM+0961] 20 A9 EE JSR CIA2_WAIT_STABLE ; call/jump to cia2 wait stable A964 [ROM+0964] 90 FB BCC L_A961 L_A966: A966 [ROM+0966] 20 A9 EE JSR CIA2_WAIT_STABLE ; call/jump to cia2 wait stable A969 [ROM+0969] B0 FB BCS L_A966 L_A96B: A96B [ROM+096B] 20 A9 EE JSR CIA2_WAIT_STABLE ; call/jump to cia2 wait stable A96E [ROM+096E] 90 FB BCC L_A96B A970 [ROM+0970] 20 FB EE JSR CIA2_CLK_HIGH_COMPAT ; call/jump to cia2 clk high compat A973 [ROM+0973] A9 08 LDA #$08 A975 [ROM+0975] 85 A5 STA $A5 L_A977: A977 [ROM+0977] AD 00 DD LDA CIA2_PRA ; CIA2 port A A97A [ROM+097A] CD 00 DD CMP CIA2_PRA ; CIA2 port A A97D [ROM+097D] D0 F8 BNE L_A977 A97F [ROM+097F] 0A ASL A A980 [ROM+0980] 90 3F BCC L_A9C1 A982 [ROM+0982] 66 95 ROR $95 A984 [ROM+0984] B0 05 BCS L_A98B A986 [ROM+0986] 20 A0 EE JSR CIA2_DATA_HIGH_COMPAT ; call/jump to cia2 data high compat A989 [ROM+0989] D0 03 BNE L_A98E L_A98B: A98B [ROM+098B] 20 97 EE JSR CIA2_DATA_LOW_COMPAT ; call/jump to cia2 data low compat L_A98E: A98E [ROM+098E] 20 85 EE JSR CIA2_CLK_LOW_COMPAT ; call/jump to cia2 clk low compat A991 [ROM+0991] EA NOP A992 [ROM+0992] EA NOP A993 [ROM+0993] EA NOP A994 [ROM+0994] EA NOP A995 [ROM+0995] AD 00 DD LDA CIA2_PRA ; CIA2 port A A998 [ROM+0998] 29 DF AND #$DF A99A [ROM+099A] 09 10 ORA #$10 A99C [ROM+099C] 8D 00 DD STA CIA2_PRA ; CIA2 port A A99F [ROM+099F] C6 A5 DEC $A5 A9A1 [ROM+09A1] D0 D4 BNE L_A977 A9A3 [ROM+09A3] A9 04 LDA #$04 A9A5 [ROM+09A5] 8D 07 DC STA $DC07 A9A8 [ROM+09A8] A9 19 LDA #$19 A9AA [ROM+09AA] 8D 0F DC STA $DC0F A9AD [ROM+09AD] AD 0D DC LDA $DC0D L_A9B0: A9B0 [ROM+09B0] AD 0D DC LDA $DC0D A9B3 [ROM+09B3] 29 02 AND #$02 A9B5 [ROM+09B5] D0 0A BNE L_A9C1 A9B7 [ROM+09B7] 20 A9 EE JSR CIA2_WAIT_STABLE ; call/jump to cia2 wait stable A9BA [ROM+09BA] B0 F4 BCS L_A9B0 A9BC [ROM+09BC] 58 CLI ; enable maskable IRQs A9BD [ROM+09BD] 60 RTS ; return L_A9BE: A9BE [ROM+09BE] A9 80 LDA #$80 A9C0 [ROM+09C0] 2C A9 01 BIT $01A9 L_A9C3: A9C3 [ROM+09C3] 20 1C FE JSR $FE1C A9C6 [ROM+09C6] 58 CLI ; enable maskable IRQs A9C7 [ROM+09C7] 18 CLC A9C8 [ROM+09C8] 90 41 BCC L_AA0B BUSCARD_IO_ROUTINE_A9CA: A9CA [ROM+09CA] 20 47 A9 JSR BUSCARD_IO_ROUTINE_A947 ; call/jump to buscard io routine a947 BUSCARD_IO_ROUTINE_A9CD: A9CD [ROM+09CD] AD 00 DD LDA CIA2_PRA ; CIA2 port A A9D0 [ROM+09D0] 29 F7 AND #$F7 A9D2 [ROM+09D2] 8D 00 DD STA CIA2_PRA ; CIA2 port A A9D5 [ROM+09D5] 60 RTS ; return BUSCARD_IO_ROUTINE_A9D6: A9D6 [ROM+09D6] 20 47 A9 JSR BUSCARD_IO_ROUTINE_A947 ; call/jump to buscard io routine a947 BUSCARD_IO_ROUTINE_A9D9: A9D9 [ROM+09D9] 78 SEI ; disable maskable IRQs A9DA [ROM+09DA] 20 A0 EE JSR CIA2_DATA_HIGH_COMPAT ; call/jump to cia2 data high compat A9DD [ROM+09DD] 20 CD A9 JSR BUSCARD_IO_ROUTINE_A9CD ; call/jump to buscard io routine a9cd A9E0 [ROM+09E0] 20 85 EE JSR CIA2_CLK_LOW_COMPAT ; call/jump to cia2 clk low compat L_A9E3: A9E3 [ROM+09E3] 20 A9 EE JSR CIA2_WAIT_STABLE ; call/jump to cia2 wait stable A9E6 [ROM+09E6] 30 FB BMI L_A9E3 A9E8 [ROM+09E8] 58 CLI ; enable maskable IRQs A9E9 [ROM+09E9] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping BUSCARD_IO_ROUTINE_A9EC: A9EC [ROM+09EC] 78 SEI ; disable maskable IRQs A9ED [ROM+09ED] 20 FB EE JSR CIA2_CLK_HIGH_COMPAT ; call/jump to cia2 clk high compat A9F0 [ROM+09F0] AD 00 DD LDA CIA2_PRA ; CIA2 port A A9F3 [ROM+09F3] 09 08 ORA #$08 A9F5 [ROM+09F5] 8D 00 DD STA CIA2_PRA ; CIA2 port A A9F8 [ROM+09F8] A9 5F LDA #$5F A9FA [ROM+09FA] 20 08 AA JSR L_AA08 A9FD [ROM+09FD] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping BUSCARD_IO_ROUTINE_AA00: AA00 [ROM+0A00] 20 06 AA JSR L_AA06 AA03 [ROM+0A03] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_AA06: AA06 [ROM+0A06] A9 3F LDA #$3F L_AA08: AA08 [ROM+0A08] 20 22 A9 JSR L_A922 L_AA0B: AA0B [ROM+0A0B] 20 CD A9 JSR BUSCARD_IO_ROUTINE_A9CD ; call/jump to buscard io routine a9cd L_AA0E: AA0E [ROM+0A0E] 8A TXA AA0F [ROM+0A0F] A2 0A LDX #$0A L_AA11: AA11 [ROM+0A11] CA DEX AA12 [ROM+0A12] D0 FD BNE L_AA11 AA14 [ROM+0A14] AA TAX AA15 [ROM+0A15] 20 85 EE JSR CIA2_CLK_LOW_COMPAT ; call/jump to cia2 clk low compat AA18 [ROM+0A18] 4C 97 EE JMP CIA2_DATA_LOW_COMPAT ; call/jump to cia2 data low compat BUSCARD_IO_ROUTINE_AA1B: AA1B [ROM+0A1B] 78 SEI ; disable maskable IRQs AA1C [ROM+0A1C] A9 00 LDA #$00 AA1E [ROM+0A1E] 85 A5 STA $A5 AA20 [ROM+0A20] 20 85 EE JSR CIA2_CLK_LOW_COMPAT ; call/jump to cia2 clk low compat L_AA23: AA23 [ROM+0A23] 20 A9 EE JSR CIA2_WAIT_STABLE ; call/jump to cia2 wait stable AA26 [ROM+0A26] 10 FB BPL L_AA23 L_AA28: AA28 [ROM+0A28] A9 01 LDA #$01 AA2A [ROM+0A2A] 8D 07 DC STA $DC07 AA2D [ROM+0A2D] A9 19 LDA #$19 AA2F [ROM+0A2F] 8D 0F DC STA $DC0F AA32 [ROM+0A32] 20 97 EE JSR CIA2_DATA_LOW_COMPAT ; call/jump to cia2 data low compat AA35 [ROM+0A35] AD 0D DC LDA $DC0D L_AA38: AA38 [ROM+0A38] AD 0D DC LDA $DC0D AA3B [ROM+0A3B] 29 02 AND #$02 AA3D [ROM+0A3D] D0 07 BNE L_AA46 AA3F [ROM+0A3F] 20 A9 EE JSR CIA2_WAIT_STABLE ; call/jump to cia2 wait stable AA42 [ROM+0A42] 30 F4 BMI L_AA38 AA44 [ROM+0A44] 10 1B BPL L_AA61 L_AA46: AA46 [ROM+0A46] A5 A5 LDA $A5 AA48 [ROM+0A48] F0 08 BEQ L_AA52 AA4A [ROM+0A4A] A9 02 LDA #$02 AA4C [ROM+0A4C] 20 C3 A9 JSR L_A9C3 AA4F [ROM+0A4F] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_AA52: AA52 [ROM+0A52] 20 A0 EE JSR CIA2_DATA_HIGH_COMPAT ; call/jump to cia2 data high compat AA55 [ROM+0A55] 20 85 EE JSR CIA2_CLK_LOW_COMPAT ; call/jump to cia2 clk low compat AA58 [ROM+0A58] A9 40 LDA #$40 AA5A [ROM+0A5A] 20 1C FE JSR $FE1C AA5D [ROM+0A5D] E6 A5 INC $A5 AA5F [ROM+0A5F] D0 C7 BNE L_AA28 L_AA61: AA61 [ROM+0A61] A9 08 LDA #$08 AA63 [ROM+0A63] 85 A5 STA $A5 L_AA65: AA65 [ROM+0A65] AD 00 DD LDA CIA2_PRA ; CIA2 port A AA68 [ROM+0A68] CD 00 DD CMP CIA2_PRA ; CIA2 port A AA6B [ROM+0A6B] D0 F8 BNE L_AA65 AA6D [ROM+0A6D] 0A ASL A AA6E [ROM+0A6E] 10 F5 BPL L_AA65 AA70 [ROM+0A70] 66 A4 ROR $A4 L_AA72: AA72 [ROM+0A72] AD 00 DD LDA CIA2_PRA ; CIA2 port A AA75 [ROM+0A75] CD 00 DD CMP CIA2_PRA ; CIA2 port A AA78 [ROM+0A78] D0 F8 BNE L_AA72 AA7A [ROM+0A7A] 0A ASL A AA7B [ROM+0A7B] 30 F5 BMI L_AA72 AA7D [ROM+0A7D] C6 A5 DEC $A5 AA7F [ROM+0A7F] D0 E4 BNE L_AA65 AA81 [ROM+0A81] 20 A0 EE JSR CIA2_DATA_HIGH_COMPAT ; call/jump to cia2 data high compat AA84 [ROM+0A84] 24 90 BIT STATUS ; KERNAL I/O status byte AA86 [ROM+0A86] 50 03 BVC L_AA8B AA88 [ROM+0A88] 20 0E AA JSR L_AA0E L_AA8B: AA8B [ROM+0A8B] A5 A4 LDA $A4 AA8D [ROM+0A8D] 58 CLI ; enable maskable IRQs AA8E [ROM+0A8E] 18 CLC AA8F [ROM+0A8F] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_AA92: AA92 [ROM+0A92] A5 91 LDA $91 AA94 [ROM+0A94] C9 7F CMP #$7F AA96 [ROM+0A96] 60 RTS ; return BUSCARD_IO_ROUTINE_AA97: AA97 [ROM+0A97] AD 0B DD LDA CIA2_TODHR ; CIA2 TOD hours register AA9A [ROM+0A9A] 29 02 AND #$02 AA9C [ROM+0A9C] D0 1A BNE L_AAB8 AA9E [ROM+0A9E] A5 95 LDA $95 AAA0 [ROM+0AA0] C9 DB CMP #$DB AAA2 [ROM+0AA2] B0 14 BCS L_AAB8 AAA4 [ROM+0AA4] C9 C1 CMP #$C1 AAA6 [ROM+0AA6] 90 04 BCC L_AAAC AAA8 [ROM+0AA8] 69 7F ADC #$7F AAAA [ROM+0AAA] D0 0A BNE L_AAB6 L_AAAC: AAAC [ROM+0AAC] C9 5B CMP #$5B AAAE [ROM+0AAE] B0 08 BCS L_AAB8 AAB0 [ROM+0AB0] C9 41 CMP #$41 AAB2 [ROM+0AB2] 90 04 BCC L_AAB8 AAB4 [ROM+0AB4] 69 1F ADC #$1F L_AAB6: AAB6 [ROM+0AB6] 85 95 STA $95 L_AAB8: AAB8 [ROM+0AB8] A9 FF LDA #$FF AABA [ROM+0ABA] 8D 07 DC STA $DC07 AABD [ROM+0ABD] A9 19 LDA #$19 AABF [ROM+0ABF] 8D 0F DC STA $DC0F L_AAC2: AAC2 [ROM+0AC2] AD 07 DC LDA $DC07 AAC5 [ROM+0AC5] F0 1C BEQ L_AAE3 AAC7 [ROM+0AC7] AD C2 DE LDA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input AACA [ROM+0ACA] 6A ROR A AACB [ROM+0ACB] B0 F5 BCS L_AAC2 AACD [ROM+0ACD] A5 95 LDA $95 AACF [ROM+0ACF] 8D C0 DE STA PPI_PA ; 8255 port A: IEEE DIO / Centronics data / DIP read AAD2 [ROM+0AD2] AD C1 DE LDA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select AAD5 [ROM+0AD5] 09 40 ORA #$40 AAD7 [ROM+0AD7] 8D C1 DE STA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select AADA [ROM+0ADA] EA NOP AADB [ROM+0ADB] EA NOP AADC [ROM+0ADC] 29 BF AND #$BF AADE [ROM+0ADE] 8D C1 DE STA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select AAE1 [ROM+0AE1] 18 CLC AAE2 [ROM+0AE2] 60 RTS ; return L_AAE3: AAE3 [ROM+0AE3] 20 92 AA JSR L_AA92 AAE6 [ROM+0AE6] D0 D0 BNE L_AAB8 AAE8 [ROM+0AE8] A9 01 LDA #$01 AAEA [ROM+0AEA] 20 1C FE JSR $FE1C AAED [ROM+0AED] 18 CLC AAEE [ROM+0AEE] 60 RTS ; return ; -------------------------------------------------------------------------- ; Central device/interface selector. Callers use its returned flags to choose among ; IEEE-488, parallel-printer and stock serial paths. MAME independently models ; the BusCard DIP switches for devices 4-10 and the same 8255 hardware. ; -------------------------------------------------------------------------- SELECT_DEVICE_INTERFACE: AAEF [ROM+0AEF] 8A TXA AAF0 [ROM+0AF0] 48 PHA ; save A on stack AAF1 [ROM+0AF1] A6 BA LDX FA ; current device number AAF3 [ROM+0AF3] E0 04 CPX #$04 AAF5 [ROM+0AF5] F0 1D BEQ L_AB14 AAF7 [ROM+0AF7] E0 0B CPX #$0B AAF9 [ROM+0AF9] B0 14 BCS L_AB0F AAFB [ROM+0AFB] AD 0A DD LDA CIA2_TODMIN ; CIA2 TOD minutes register AAFE [ROM+0AFE] CA DEX AAFF [ROM+0AFF] CA DEX AB00 [ROM+0B00] CA DEX AB01 [ROM+0B01] CA DEX L_AB02: AB02 [ROM+0B02] 6A ROR A AB03 [ROM+0B03] CA DEX AB04 [ROM+0B04] D0 FC BNE L_AB02 AB06 [ROM+0B06] 6A ROR A AB07 [ROM+0B07] 90 06 BCC L_AB0F L_AB09: AB09 [ROM+0B09] 68 PLA ; restore/pull byte from stack AB0A [ROM+0B0A] AA TAX AB0B [ROM+0B0B] A9 FF LDA #$FF AB0D [ROM+0B0D] 18 CLC AB0E [ROM+0B0E] 60 RTS ; return L_AB0F: AB0F [ROM+0B0F] 68 PLA ; restore/pull byte from stack AB10 [ROM+0B10] AA TAX AB11 [ROM+0B11] A9 00 LDA #$00 AB13 [ROM+0B13] 60 RTS ; return L_AB14: AB14 [ROM+0B14] AD 0B DD LDA CIA2_TODHR ; CIA2 TOD hours register AB17 [ROM+0B17] 6A ROR A AB18 [ROM+0B18] B0 05 BCS L_AB1F AB1A [ROM+0B1A] 6A ROR A AB1B [ROM+0B1B] B0 F2 BCS L_AB0F AB1D [ROM+0B1D] 90 EA BCC L_AB09 L_AB1F: AB1F [ROM+0B1F] 68 PLA ; restore/pull byte from stack AB20 [ROM+0B20] AA TAX AB21 [ROM+0B21] A9 FF LDA #$FF AB23 [ROM+0B23] 38 SEC AB24 [ROM+0B24] 60 RTS ; return BUSCARD_HELPER_AB25: AB25 [ROM+0B25] A5 B4 LDA $B4 AB27 [ROM+0B27] F0 49 BEQ BUSCARD_HELPER_AB72 AB29 [ROM+0B29] 30 41 BMI L_AB6C AB2B [ROM+0B2B] 46 B6 LSR $B6 AB2D [ROM+0B2D] A2 00 LDX #$00 AB2F [ROM+0B2F] 90 01 BCC L_AB32 AB31 [ROM+0B31] CA DEX L_AB32: AB32 [ROM+0B32] 8A TXA AB33 [ROM+0B33] 45 BD EOR $BD AB35 [ROM+0B35] 85 BD STA $BD AB37 [ROM+0B37] C6 B4 DEC $B4 AB39 [ROM+0B39] F0 08 BEQ L_AB43 L_AB3B: AB3B [ROM+0B3B] 8A TXA AB3C [ROM+0B3C] 29 04 AND #$04 AB3E [ROM+0B3E] 85 B5 STA $B5 AB40 [ROM+0B40] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_AB43: AB43 [ROM+0B43] A9 20 LDA #$20 AB45 [ROM+0B45] 2C 94 02 BIT $0294 AB48 [ROM+0B48] F0 14 BEQ L_AB5E AB4A [ROM+0B4A] 30 1C BMI L_AB68 AB4C [ROM+0B4C] 70 14 BVS L_AB62 AB4E [ROM+0B4E] A5 BD LDA $BD AB50 [ROM+0B50] D0 01 BNE L_AB53 L_AB52: AB52 [ROM+0B52] CA DEX L_AB53: AB53 [ROM+0B53] C6 B4 DEC $B4 AB55 [ROM+0B55] AD 93 02 LDA $0293 AB58 [ROM+0B58] 10 E1 BPL L_AB3B AB5A [ROM+0B5A] C6 B4 DEC $B4 AB5C [ROM+0B5C] D0 DD BNE L_AB3B L_AB5E: AB5E [ROM+0B5E] E6 B4 INC $B4 AB60 [ROM+0B60] D0 F0 BNE L_AB52 L_AB62: AB62 [ROM+0B62] A5 BD LDA $BD AB64 [ROM+0B64] F0 ED BEQ L_AB53 AB66 [ROM+0B66] D0 EA BNE L_AB52 L_AB68: AB68 [ROM+0B68] 70 E9 BVS L_AB53 AB6A [ROM+0B6A] 50 E6 BVC L_AB52 L_AB6C: AB6C [ROM+0B6C] E6 B4 INC $B4 AB6E [ROM+0B6E] A2 FF LDX #$FF AB70 [ROM+0B70] D0 C9 BNE L_AB3B BUSCARD_HELPER_AB72: AB72 [ROM+0B72] AD 94 02 LDA $0294 AB75 [ROM+0B75] 4A LSR A AB76 [ROM+0B76] 90 13 BCC L_AB8B AB78 [ROM+0B78] 2C 01 DD BIT CIA2_PRB ; CIA2 port B AB7B [ROM+0B7B] 30 06 BMI L_AB83 AB7D [ROM+0B7D] 20 3E EF JSR L_EF3E AB80 [ROM+0B80] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_AB83: AB83 [ROM+0B83] 70 06 BVS L_AB8B AB85 [ROM+0B85] 20 31 EF JSR L_EF31 AB88 [ROM+0B88] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_AB8B: AB8B [ROM+0B8B] A9 00 LDA #$00 AB8D [ROM+0B8D] 85 BD STA $BD AB8F [ROM+0B8F] 85 B5 STA $B5 AB91 [ROM+0B91] AE 98 02 LDX $0298 AB94 [ROM+0B94] 86 B4 STX $B4 AB96 [ROM+0B96] AC 9D 02 LDY $029D AB99 [ROM+0B99] CC 9E 02 CPY $029E AB9C [ROM+0B9C] D0 06 BNE L_ABA4 AB9E [ROM+0B9E] 20 39 EF JSR L_EF39 ABA1 [ROM+0BA1] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_ABA4: ABA4 [ROM+0BA4] B1 F9 LDA ($F9),Y ABA6 [ROM+0BA6] 85 B6 STA $B6 ABA8 [ROM+0BA8] EE 9D 02 INC $029D ABAB [ROM+0BAB] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping BUSCARD_HELPER_ABAE: ABAE [ROM+0BAE] AC 9B 02 LDY $029B ABB1 [ROM+0BB1] C8 INY ABB2 [ROM+0BB2] CC 9C 02 CPY $029C ABB5 [ROM+0BB5] F0 30 BEQ L_ABE7 ABB7 [ROM+0BB7] 8C 9B 02 STY $029B ABBA [ROM+0BBA] 88 DEY ABBB [ROM+0BBB] A5 AA LDA $AA ABBD [ROM+0BBD] AE 98 02 LDX $0298 L_ABC0: ABC0 [ROM+0BC0] E0 09 CPX #$09 ABC2 [ROM+0BC2] F0 04 BEQ L_ABC8 ABC4 [ROM+0BC4] 4A LSR A ABC5 [ROM+0BC5] E8 INX ABC6 [ROM+0BC6] D0 F8 BNE L_ABC0 L_ABC8: ABC8 [ROM+0BC8] 91 F7 STA ($F7),Y ABCA [ROM+0BCA] A9 20 LDA #$20 ABCC [ROM+0BCC] 2C 94 02 BIT $0294 ABCF [ROM+0BCF] D0 03 BNE L_ABD4 ABD1 [ROM+0BD1] 4C 64 EE JMP L_EE64 L_ABD4: ABD4 [ROM+0BD4] 10 03 BPL L_ABD9 L_ABD6: ABD6 [ROM+0BD6] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_ABD9: ABD9 [ROM+0BD9] A5 A7 LDA $A7 ABDB [ROM+0BDB] 45 AB EOR $AB ABDD [ROM+0BDD] F0 03 BEQ L_ABE2 ABDF [ROM+0BDF] 70 F5 BVS L_ABD6 ABE1 [ROM+0BE1] 2C 50 F2 BIT $F250 ABE4 [ROM+0BE4] A9 01 LDA #$01 ABE6 [ROM+0BE6] 2C A9 04 BIT $04A9 ABE9 [ROM+0BE9] 0D 97 02 ORA $0297 ABEC [ROM+0BEC] 8D 97 02 STA $0297 ABEF [ROM+0BEF] 4C 91 ED JMP KERNAL_COMPAT_WRAPPER_ED91 ; call/jump to kernal compat wrapper ed91 ; $ABF2-$ABFF are 14 zero bytes (unused/padding in U1). ABF2 [ROM+0BF2] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .res 14, $00 ; ========================================================================== ; U1 physical $0C00-$0FFF -> CPU $EC00-$EFFF ; Resident C64 KERNAL overlay / BusCard dispatch layer ; ========================================================================== ; -------------------------------------------------------------------------- ; Stock C64 KERNAL keyboard-table tail / Commodore-key table ; ROM physical offsets $0C00-$0FFF are decoded at CPU $EC00-$EFFF, overlaying ; this part of the C64 KERNAL. $EC00-$ED0D mostly duplicate stock KERNAL ; keyboard/editor tables and code so ordinary KERNAL operation remains compatible. ; -------------------------------------------------------------------------- ; -------------------------------------------------------------------------- ; ROM physical offsets $0C00-$0FFF are decoded at CPU $EC00-$EFFF, overlaying ; this part of the C64 KERNAL. $EC00-$ED0D mostly duplicate stock KERNAL ; keyboard/editor tables and code so ordinary KERNAL operation remains compatible. ; -------------------------------------------------------------------------- EC00 [ROM+0C00] D1 83 FF 94 8D 9D 8C 89 8A 8B 91 96 B3 B0 97 AD .byte $D1, $83, $FF, $94, $8D, $9D, $8C, $89, $8A, $8B, $91, $96, $B3, $B0, $97, $AD ; ................ EC10 [ROM+0C10] AE B1 01 98 B2 AC 99 BC BB A3 BD 9A B7 A5 9B BF .byte $AE, $B1, $01, $98, $B2, $AC, $99, $BC, $BB, $A3, $BD, $9A, $B7, $A5, $9B, $BF ; ................ EC20 [ROM+0C20] B4 B8 BE 29 A2 B5 30 A7 A1 B9 AA A6 AF B6 DC 3E .byte $B4, $B8, $BE, $29, $A2, $B5, $30, $A7, $A1, $B9, $AA, $A6, $AF, $B6, $DC, $3E ; ...)..0........> EC30 [ROM+0C30] 5B A4 3C A8 DF 5D 93 01 3D DE 3F 81 5F 04 95 A0 .byte $5B, $A4, $3C, $A8, $DF, $5D, $93, $01, $3D, $DE, $3F, $81, $5F, $04, $95, $A0 ; [.<..]..=.?._... EC40 [ROM+0C40] 02 AB 83 FF .byte $02, $AB, $83, $FF ; .... ; -------------------------------------------------------------------------- ; Unmodified stock C64 KERNAL routine: handles special PETSCII codes that switch ; the character set and affect Shift/Commodore keyboard handling. ; -------------------------------------------------------------------------- KERNAL_CHECK_SPECIAL_PETSCII: EC44 [ROM+0C44] C9 0E CMP #$0E EC46 [ROM+0C46] D0 07 BNE L_EC4F EC48 [ROM+0C48] AD 18 D0 LDA VIC_D018 ; VIC-II memory/character-set configuration EC4B [ROM+0C4B] 09 02 ORA #$02 EC4D [ROM+0C4D] D0 09 BNE L_EC58 L_EC4F: EC4F [ROM+0C4F] C9 8E CMP #$8E EC51 [ROM+0C51] D0 0B BNE L_EC5E EC53 [ROM+0C53] AD 18 D0 LDA VIC_D018 ; VIC-II memory/character-set configuration EC56 [ROM+0C56] 29 FD AND #$FD L_EC58: EC58 [ROM+0C58] 8D 18 D0 STA VIC_D018 ; VIC-II memory/character-set configuration L_EC5B: EC5B [ROM+0C5B] 4C A8 E6 JMP C64_EDITOR_CONTINUE ; C64 screen editor continuation L_EC5E: EC5E [ROM+0C5E] C9 08 CMP #$08 EC60 [ROM+0C60] D0 07 BNE L_EC69 EC62 [ROM+0C62] A9 80 LDA #$80 EC64 [ROM+0C64] 0D 91 02 ORA KEY_FLAGS ; $0291 keyboard/editor shift-control flags EC67 [ROM+0C67] 30 09 BMI L_EC72 L_EC69: EC69 [ROM+0C69] C9 09 CMP #$09 EC6B [ROM+0C6B] D0 EE BNE L_EC5B EC6D [ROM+0C6D] A9 7F LDA #$7F EC6F [ROM+0C6F] 2D 91 02 AND KEY_FLAGS ; $0291 keyboard/editor shift-control flags L_EC72: EC72 [ROM+0C72] 8D 91 02 STA KEY_FLAGS ; $0291 keyboard/editor shift-control flags EC75 [ROM+0C75] 4C A8 E6 JMP C64_EDITOR_CONTINUE ; C64 screen editor continuation ; -------------------------------------------------------------------------- ; Stock C64 KERNAL control-key table ; Stock C64 KERNAL data begins here: control-key table, VIC-II defaults, LOAD/RUN ; strings, and the low-byte screen-line address table. ; -------------------------------------------------------------------------- ; -------------------------------------------------------------------------- ; Stock C64 KERNAL data begins here: control-key table, VIC-II defaults, LOAD/RUN ; strings, and the low-byte screen-line address table. ; -------------------------------------------------------------------------- KERNAL_CONTROL_KEY_TABLE: EC78 [ROM+0C78] FF FF FF FF FF FF FF FF 1C 17 01 9F 1A 13 05 FF .byte $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $1C, $17, $01, $9F, $1A, $13, $05, $FF ; ................ EC88 [ROM+0C88] 9C 12 04 1E 03 06 14 18 1F 19 07 9E 02 08 15 16 .byte $9C, $12, $04, $1E, $03, $06, $14, $18, $1F, $19, $07, $9E, $02, $08, $15, $16 ; ................ EC98 [ROM+0C98] 12 09 0A 92 0D 0B 0F 0E FF 10 0C FF FF 1B 00 FF .byte $12, $09, $0A, $92, $0D, $0B, $0F, $0E, $FF, $10, $0C, $FF, $FF, $1B, $00, $FF ; ................ ECA8 [ROM+0CA8] 1C FF 1D FF FF 1F 1E FF 90 06 FF 05 FF FF 11 FF .byte $1C, $FF, $1D, $FF, $FF, $1F, $1E, $FF, $90, $06, $FF, $05, $FF, $FF, $11, $FF ; ................ ECB8 [ROM+0CB8] FF .byte $FF ; . ; -------------------------------------------------------------------------- ; Stock C64 VIC-II power-on/default data ; -------------------------------------------------------------------------- KERNAL_VIC_DEFAULTS: ECB9 [ROM+0CB9] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; ................ ECC9 [ROM+0CC9] 00 1B 00 00 00 00 08 00 14 00 00 00 00 00 00 00 .byte $00, $1B, $00, $00, $00, $00, $08, $00, $14, $00, $00, $00, $00, $00, $00, $00 ; ................ ECD9 [ROM+0CD9] 0E 06 01 02 03 04 00 01 02 03 04 05 06 07 .byte $0E, $06, $01, $02, $03, $04, $00, $01, $02, $03, $04, $05, $06, $07 ; .............. ; -------------------------------------------------------------------------- ; Stock KERNAL LOAD text ; -------------------------------------------------------------------------- KERNAL_LOAD_TEXT: ECE7 [ROM+0CE7] 4C 4F 41 44 0D .byte $4C, $4F, $41, $44, $0D ; LOAD. ; -------------------------------------------------------------------------- ; Stock KERNAL RUN text ; -------------------------------------------------------------------------- KERNAL_RUN_TEXT: ECEC [ROM+0CEC] 52 55 4E 0D .byte $52, $55, $4E, $0D ; RUN. ; -------------------------------------------------------------------------- ; Stock KERNAL low-byte screen-line address table ; -------------------------------------------------------------------------- KERNAL_SCREEN_LINE_LO_TABLE: ECF0 [ROM+0CF0] 00 28 50 78 A0 C8 F0 18 40 68 90 B8 E0 08 30 58 .byte $00, $28, $50, $78, $A0, $C8, $F0, $18, $40, $68, $90, $B8, $E0, $08, $30, $58 ; .(Px....@h....0X ED00 [ROM+0D00] 80 A8 D0 F8 20 48 70 98 C0 .byte $80, $A8, $D0, $F8, $20, $48, $70, $98, $C0 ; .... Hp.. ; -------------------------------------------------------------------------- ; These are the normal KERNAL TALK/LISTEN entrypoints. The first bytes match the ; stock KERNAL, but at $ED0E BusCard substitutes JMP $ED23 for the stock call into ; the serial-bus routine, thereby gaining control of device routing. ; -------------------------------------------------------------------------- KERNAL_TALK_PATCH: ED09 [ROM+0D09] 09 40 ORA #$40 ED0B [ROM+0D0B] 2C 09 20 BIT $2009 ED0E [ROM+0D0E] 4C 23 ED JMP BUSCARD_SET_DEVICE_AND_DISPATCH ; BusCard change: dispatch instead of entering stock serial routine at $F0A4; call/jump to buscard set device and dispatch ; -------------------------------------------------------------------------- ; BusCard replacement/dispatch code occupying the KERNAL serial-I/O area. It maps ; U1 as needed, selects an interface, calls the corresponding BusCard driver, and ; falls back to compatible serial routines where appropriate. ; -------------------------------------------------------------------------- BUSCARD_TALK_LISTEN_DISPATCH: ED11 [ROM+0D11] 48 PHA ; save A on stack ED12 [ROM+0D12] 20 7C EE JSR MAP_AND_SELECT_INTERFACE ; call/jump to map and select interface ED15 [ROM+0D15] D0 03 BNE L_ED1A L_ED17: ED17 [ROM+0D17] 4C D3 A7 JMP BUSCARD_IO_ROUTINE_A7D3 ; call/jump to buscard io routine a7d3 L_ED1A: ED1A [ROM+0D1A] B0 03 BCS L_ED1F ED1C [ROM+0D1C] 4C 16 A9 JMP BUSCARD_IO_ROUTINE_A916 ; call/jump to buscard io routine a916 L_ED1F: ED1F [ROM+0D1F] 68 PLA ; restore/pull byte from stack ED20 [ROM+0D20] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping BUSCARD_SET_DEVICE_AND_DISPATCH: ED23 [ROM+0D23] 48 PHA ; save A on stack ED24 [ROM+0D24] 29 1F AND #$1F ED26 [ROM+0D26] 85 BA STA FA ; current device number ED28 [ROM+0D28] 20 7C EE JSR MAP_AND_SELECT_INTERFACE ; call/jump to map and select interface ED2B [ROM+0D2B] F0 EA BEQ L_ED17 ED2D [ROM+0D2D] B0 03 BCS L_ED32 ED2F [ROM+0D2F] 4C 0F A9 JMP BUSCARD_IO_ROUTINE_A90F ; call/jump to buscard io routine a90f L_ED32: ED32 [ROM+0D32] 4C BF EF JMP BUSCARD_LISTEN_TALK_CLEANUP ; call/jump to buscard listen talk cleanup ED35 [ROM+0D35] 00 .res 1, $00 ; unused/dead padding BUSCARD_INTERFACE_DISPATCH_1: ED36 [ROM+0D36] 20 7C EE JSR MAP_AND_SELECT_INTERFACE ; call/jump to map and select interface ED39 [ROM+0D39] F0 0A BEQ L_ED45 ED3B [ROM+0D3B] D0 1C BNE L_ED59 ED3D [ROM+0D3D] 00 00 00 .res 3, $00 ; unused/dead padding BUSCARD_INTERFACE_DISPATCH_2: ED40 [ROM+0D40] 20 7C EE JSR MAP_AND_SELECT_INTERFACE ; call/jump to map and select interface ED43 [ROM+0D43] D0 06 BNE L_ED4B L_ED45: ED45 [ROM+0D45] 20 0A A8 JSR BUSCARD_IO_ROUTINE_A80A ; call/jump to buscard io routine a80a ED48 [ROM+0D48] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_ED4B: ED4B [ROM+0D4B] B0 06 BCS L_ED53 ED4D [ROM+0D4D] 20 51 A9 JSR BUSCARD_IO_ROUTINE_A951 ; call/jump to buscard io routine a951 ED50 [ROM+0D50] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_ED53: ED53 [ROM+0D53] 20 97 AA JSR BUSCARD_IO_ROUTINE_AA97 ; call/jump to buscard io routine aa97 ED56 [ROM+0D56] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_ED59: ED59 [ROM+0D59] B0 F8 BCS L_ED53 ED5B [ROM+0D5B] 20 47 A9 JSR BUSCARD_IO_ROUTINE_A947 ; call/jump to buscard io routine a947 ED5E [ROM+0D5E] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping ; -------------------------------------------------------------------------- ; Internal BASIC4-enable entry reached by SYS 61000 ($EE48). ; -------------------------------------------------------------------------- BASIC4_ENABLE_ENTRY: ED61 [ROM+0D61] 20 75 ED JSR MAP_BUSCARD_ROM ; prepare memory mapping, then enable extension; call/jump to map buscard rom ED64 [ROM+0D64] 4C 36 B0 JMP BASIC4_ENABLE_STUB ; call/jump to basic4 enable stub ; -------------------------------------------------------------------------- ; Internal BASIC4-disable entry reached by SYS 61003 ($EE4B). ; -------------------------------------------------------------------------- BASIC4_DISABLE_ENTRY: ED67 [ROM+0D67] 20 75 ED JSR MAP_BUSCARD_ROM ; prepare memory mapping, then disable extension; call/jump to map buscard rom ED6A [ROM+0D6A] 4C 39 B0 JMP BASIC4_DISABLE_STUB ; call/jump to basic4 disable stub L_ED6D: ED6D [ROM+0D6D] 0D C1 DE ORA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select ED70 [ROM+0D70] 8D C1 DE STA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select ED73 [ROM+0D73] 68 PLA ; restore/pull byte from stack ED74 [ROM+0D74] 60 RTS ; return ; -------------------------------------------------------------------------- ; Temporarily map BusCard ROM/control state while preserving the caller state. ; -------------------------------------------------------------------------- MAP_BUSCARD_ROM: ED75 [ROM+0D75] 48 PHA ; save A on stack ED76 [ROM+0D76] A5 01 LDA CPU_PORT ; $0001 6510 memory-configuration port ED78 [ROM+0D78] 4C B3 ED JMP MAP_BUSCARD_ROM_CONT ; call/jump to map buscard rom cont ; -------------------------------------------------------------------------- ; SYS 61006 path: install $ED8B into the C64 BRK vector, request KERNAL messages, ; and execute BRK so the monitor is entered through the normal BRK-vector mechanism. ; -------------------------------------------------------------------------- INSTALL_MONITOR_BRK_VECTOR: ED7B [ROM+0D7B] A9 8B LDA #$8B ; low byte of BusCard BRK handler address ED7D [ROM+0D7D] 8D 16 03 STA CBINV_LO ; store BRK vector low; BRK vector low ED80 [ROM+0D80] A9 ED LDA #$ED ; high byte of BusCard BRK handler address ED82 [ROM+0D82] 8D 17 03 STA CBINV_HI ; store BRK vector high; BRK vector high ED85 [ROM+0D85] A9 80 LDA #$80 ; enable KERNAL messages ED87 [ROM+0D87] 20 90 FF JSR SETMSG ; KERNAL SETMSG ED8A [ROM+0D8A] 00 BRK ; deliberately trigger BRK to enter monitor ; -------------------------------------------------------------------------- ; BRK-vector handler installed by SYS 61006. Map U1 and jump to monitor $A000. ; -------------------------------------------------------------------------- MONITOR_BRK_VECTOR: ED8B [ROM+0D8B] 20 75 ED JSR MAP_BUSCARD_ROM ; call/jump to map buscard rom ED8E [ROM+0D8E] 4C 00 A0 JMP MONITOR_BRK_ENTRY ; jump into monitor proper; call/jump to monitor brk entry KERNAL_COMPAT_WRAPPER_ED91: ED91 [ROM+0D91] 20 97 ED JSR RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping ED94 [ROM+0D94] 4C 7E EF JMP KERNAL_SERIAL_TIMER_SETUP ; call/jump to kernal serial timer setup ; -------------------------------------------------------------------------- ; Restore the normal C64 memory/PPI state after a BusCard operation. Many patched ; KERNAL entrypoints tail-call this routine before returning to stock code/caller. ; -------------------------------------------------------------------------- RESTORE_MEMORY_MAPPING: ED97 [ROM+0D97] 48 PHA ; save A on stack ED98 [ROM+0D98] AD C1 DE LDA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select ED9B [ROM+0D9B] 29 10 AND #$10 ED9D [ROM+0D9D] D0 04 BNE L_EDA3 ED9F [ROM+0D9F] A9 10 LDA #$10 EDA1 [ROM+0DA1] D0 CA BNE L_ED6D L_EDA3: EDA3 [ROM+0DA3] AD 08 DD LDA CIA2_TOD10 ; CIA2 TOD tenths register EDA6 [ROM+0DA6] AD 0B DD LDA CIA2_TODHR ; CIA2 TOD hours register EDA9 [ROM+0DA9] AD 09 DD LDA CIA2_TODSEC ; CIA2 TOD seconds register EDAC [ROM+0DAC] 85 01 STA CPU_PORT ; $0001 6510 memory-configuration port EDAE [ROM+0DAE] A9 18 LDA #$18 EDB0 [ROM+0DB0] 4C 6D ED JMP L_ED6D MAP_BUSCARD_ROM_CONT: EDB3 [ROM+0DB3] 48 PHA ; save A on stack EDB4 [ROM+0DB4] 09 07 ORA #$07 EDB6 [ROM+0DB6] 4C 0C EF JMP MAP_BUSCARD_AND_CONFIGURE ; call/jump to map buscard and configure KERNAL_SECONDARY_LISTEN_PATCH: EDB9 [ROM+0DB9] 85 95 STA $95 EDBB [ROM+0DBB] 4C 20 EE JMP BUSCARD_SECONDARY_LISTEN_DISPATCH2 ; call/jump to buscard secondary listen dispatch2 BUSCARD_SECONDARY_DISPATCH: EDBE [ROM+0DBE] 20 7C EE JSR MAP_AND_SELECT_INTERFACE ; call/jump to map and select interface EDC1 [ROM+0DC1] 4C 51 EE JMP L_EE51 EDC4 [ROM+0DC4] 00 00 00 .res 3, $00 ; unused/dead padding KERNAL_SECONDARY_TALK_PATCH: EDC7 [ROM+0DC7] 85 95 STA $95 EDC9 [ROM+0DC9] 4C 35 EE JMP BUSCARD_SECONDARY_TALK_DISPATCH2 ; call/jump to buscard secondary talk dispatch2 BUSCARD_SECONDARY_TALK_DISPATCH: EDCC [ROM+0DCC] 20 7C EE JSR MAP_AND_SELECT_INTERFACE ; call/jump to map and select interface EDCF [ROM+0DCF] D0 03 BNE L_EDD4 EDD1 [ROM+0DD1] 4C 95 A8 JMP BUSCARD_IO_ROUTINE_A895 ; call/jump to buscard io routine a895 L_EDD4: EDD4 [ROM+0DD4] B0 54 BCS L_EE2A EDD6 [ROM+0DD6] 4C D9 A9 JMP BUSCARD_IO_ROUTINE_A9D9 ; call/jump to buscard io routine a9d9 EDD9 [ROM+0DD9] 00 00 00 00 .res 4, $00 ; unused/dead padding KERNAL_OUTPUT_BYTE_COMPAT: EDDD [ROM+0DDD] 24 94 BIT $94 EDDF [ROM+0DDF] 30 05 BMI L_EDE6 EDE1 [ROM+0DE1] 38 SEC EDE2 [ROM+0DE2] 66 94 ROR $94 EDE4 [ROM+0DE4] D0 05 BNE L_EDEB L_EDE6: EDE6 [ROM+0DE6] 48 PHA ; save A on stack EDE7 [ROM+0DE7] 20 40 ED JSR BUSCARD_INTERFACE_DISPATCH_2 ; call/jump to buscard interface dispatch 2 EDEA [ROM+0DEA] 68 PLA ; restore/pull byte from stack L_EDEB: EDEB [ROM+0DEB] 85 95 STA $95 EDED [ROM+0DED] 18 CLC EDEE [ROM+0DEE] 60 RTS ; return BUSCARD_TALK_DISPATCH: EDEF [ROM+0DEF] 20 7C EE JSR MAP_AND_SELECT_INTERFACE ; call/jump to map and select interface EDF2 [ROM+0DF2] D0 03 BNE L_EDF7 EDF4 [ROM+0DF4] 4C 9E A8 JMP BUSCARD_IO_ROUTINE_A89E ; call/jump to buscard io routine a89e L_EDF7: EDF7 [ROM+0DF7] B0 31 BCS L_EE2A EDF9 [ROM+0DF9] 4C EC A9 JMP BUSCARD_IO_ROUTINE_A9EC ; call/jump to buscard io routine a9ec EDFC [ROM+0DFC] 00 00 .res 2, $00 ; unused/dead padding BUSCARD_UNLISTEN_DISPATCH: EDFE [ROM+0DFE] 20 7C EE JSR MAP_AND_SELECT_INTERFACE ; call/jump to map and select interface EE01 [ROM+0E01] D0 03 BNE L_EE06 EE03 [ROM+0E03] 4C AB A8 JMP BUSCARD_IO_ROUTINE_A8AB ; call/jump to buscard io routine a8ab L_EE06: EE06 [ROM+0E06] B0 59 BCS L_EE61 EE08 [ROM+0E08] 4C 00 AA JMP BUSCARD_IO_ROUTINE_AA00 ; call/jump to buscard io routine aa00 EE0B [ROM+0E0B] 20 97 ED JSR RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping EE0E [ROM+0E0E] 4C 79 00 JMP CHRGOT ; BASIC CHRGOT routine EE11 [ROM+0E11] 00 00 .res 2, $00 ; unused/dead padding BUSCARD_INPUT_BYTE_DISPATCH: EE13 [ROM+0E13] 20 7C EE JSR MAP_AND_SELECT_INTERFACE ; call/jump to map and select interface EE16 [ROM+0E16] D0 03 BNE L_EE1B EE18 [ROM+0E18] 4C BF A8 JMP BUSCARD_IO_ROUTINE_A8BF ; call/jump to buscard io routine a8bf L_EE1B: EE1B [ROM+0E1B] B0 0D BCS L_EE2A EE1D [ROM+0E1D] 4C 1B AA JMP BUSCARD_IO_ROUTINE_AA1B ; call/jump to buscard io routine aa1b BUSCARD_SECONDARY_LISTEN_DISPATCH2: EE20 [ROM+0E20] 20 7C EE JSR MAP_AND_SELECT_INTERFACE ; call/jump to map and select interface EE23 [ROM+0E23] D0 08 BNE L_EE2D EE25 [ROM+0E25] 20 84 A8 JSR BUSCARD_IO_ROUTINE_A884 ; call/jump to buscard io routine a884 L_EE28: EE28 [ROM+0E28] A9 FF LDA #$FF L_EE2A: EE2A [ROM+0E2A] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_EE2D: EE2D [ROM+0E2D] B0 FB BCS L_EE2A EE2F [ROM+0E2F] 20 CA A9 JSR BUSCARD_IO_ROUTINE_A9CA ; call/jump to buscard io routine a9ca EE32 [ROM+0E32] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping BUSCARD_SECONDARY_TALK_DISPATCH2: EE35 [ROM+0E35] 20 7C EE JSR MAP_AND_SELECT_INTERFACE ; call/jump to map and select interface EE38 [ROM+0E38] D0 03 BNE L_EE3D EE3A [ROM+0E3A] 4C 92 A8 JMP BUSCARD_IO_ROUTINE_A892 ; call/jump to buscard io routine a892 L_EE3D: EE3D [ROM+0E3D] B0 EB BCS L_EE2A EE3F [ROM+0E3F] 4C D6 A9 JMP BUSCARD_IO_ROUTINE_A9D6 ; call/jump to buscard io routine a9d6 ; -------------------------------------------------------------------------- ; Restore normal mapping, then JMP ($A002). Once U1 is removed from $A000-$BFFF, ; this indirect vector is read from the underlying C64 BASIC ROM, providing the ; monitor X-command return path. ; -------------------------------------------------------------------------- RETURN_TO_UNDERLYING_BASIC: EE42 [ROM+0E42] 20 97 ED JSR RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping EE45 [ROM+0E45] 6C 02 A0 JMP (L_A002) ; -------------------------------------------------------------------------- ; Public entrypoint: SYS 61000 (decimal) = $EE48. Enables/installs the BusCard ; BASIC 4.0 command extension. ; -------------------------------------------------------------------------- SYS_61000_ENABLE_BASIC4: EE48 [ROM+0E48] 4C 61 ED JMP BASIC4_ENABLE_ENTRY ; JMP to enable logic; decimal address 61000; call/jump to basic4 enable entry ; -------------------------------------------------------------------------- ; Public entrypoint: SYS 61003 (decimal) = $EE4B. Disables/uninstalls the extension. ; -------------------------------------------------------------------------- SYS_61003_DISABLE_BASIC4: EE4B [ROM+0E4B] 4C 67 ED JMP BASIC4_DISABLE_ENTRY ; JMP to disable logic; decimal address 61003; call/jump to basic4 disable entry ; -------------------------------------------------------------------------- ; Public entrypoint: SYS 61006 (decimal) = $EE4E. Enters the machine-language monitor. ; -------------------------------------------------------------------------- SYS_61006_MONITOR: EE4E [ROM+0E4E] 4C 7B ED JMP INSTALL_MONITOR_BRK_VECTOR ; JMP to monitor setup; decimal address 61006; call/jump to install monitor brk vector L_EE51: EE51 [ROM+0E51] D0 06 BNE L_EE59 EE53 [ROM+0E53] 20 87 A8 JSR BUSCARD_IO_ROUTINE_A887 ; call/jump to buscard io routine a887 EE56 [ROM+0E56] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_EE59: EE59 [ROM+0E59] B0 CD BCS L_EE28 EE5B [ROM+0E5B] 20 CD A9 JSR BUSCARD_IO_ROUTINE_A9CD ; call/jump to buscard io routine a9cd EE5E [ROM+0E5E] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping L_EE61: EE61 [ROM+0E61] 4C 9D EF JMP BUSCARD_IO_CLEANUP ; call/jump to buscard io cleanup L_EE64: EE64 [ROM+0E64] 20 97 ED JSR RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping EE67 [ROM+0E67] 4C 6E EF JMP L_EF6E MONITOR_RTI_RESTORE: EE6A [ROM+0E6A] 20 97 ED JSR RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping EE6D [ROM+0E6D] 40 RTI ; return to saved processor state after monitor G PPI_SAVE_AND_BSR: EE6E [ROM+0E6E] AD C1 DE LDA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EE71 [ROM+0E71] 48 PHA ; save A on stack EE72 [ROM+0E72] A9 88 LDA #$88 EE74 [ROM+0E74] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register EE77 [ROM+0E77] 68 PLA ; restore/pull byte from stack EE78 [ROM+0E78] 8D C1 DE STA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EE7B [ROM+0E7B] 60 RTS ; return ; -------------------------------------------------------------------------- ; Map BusCard state and run the central interface-selection helper at $AAEF. ; -------------------------------------------------------------------------- MAP_AND_SELECT_INTERFACE: EE7C [ROM+0E7C] 20 75 ED JSR MAP_BUSCARD_ROM ; call/jump to map buscard rom EE7F [ROM+0E7F] 4C EF AA JMP SELECT_DEVICE_INTERFACE ; call/jump to select device interface EE82 [ROM+0E82] 00 00 00 .res 3, $00 ; unused/dead padding CIA2_CLK_LOW_COMPAT: EE85 [ROM+0E85] AD 00 DD LDA CIA2_PRA ; CIA2 port A EE88 [ROM+0E88] 29 EF AND #$EF EE8A [ROM+0E8A] 8D 00 DD STA CIA2_PRA ; CIA2 port A EE8D [ROM+0E8D] 60 RTS ; return EE8E [ROM+0E8E] 20 D6 EE JSR L_EED6 EE91 [ROM+0E91] 4C FB EE JMP CIA2_CLK_HIGH_COMPAT ; call/jump to cia2 clk high compat EE94 [ROM+0E94] 00 00 00 .res 3, $00 ; unused/dead padding CIA2_DATA_LOW_COMPAT: EE97 [ROM+0E97] AD 00 DD LDA CIA2_PRA ; CIA2 port A EE9A [ROM+0E9A] 29 DF AND #$DF EE9C [ROM+0E9C] 8D 00 DD STA CIA2_PRA ; CIA2 port A EE9F [ROM+0E9F] 60 RTS ; return CIA2_DATA_HIGH_COMPAT: EEA0 [ROM+0EA0] AD 00 DD LDA CIA2_PRA ; CIA2 port A EEA3 [ROM+0EA3] 09 20 ORA #$20 EEA5 [ROM+0EA5] 8D 00 DD STA CIA2_PRA ; CIA2 port A EEA8 [ROM+0EA8] 60 RTS ; return CIA2_WAIT_STABLE: EEA9 [ROM+0EA9] AD 00 DD LDA CIA2_PRA ; CIA2 port A EEAC [ROM+0EAC] CD 00 DD CMP CIA2_PRA ; CIA2 port A EEAF [ROM+0EAF] D0 F8 BNE CIA2_WAIT_STABLE EEB1 [ROM+0EB1] 0A ASL A EEB2 [ROM+0EB2] 60 RTS ; return SHORT_DELAY: EEB3 [ROM+0EB3] 8A TXA EEB4 [ROM+0EB4] A2 B8 LDX #$B8 L_EEB6: EEB6 [ROM+0EB6] CA DEX EEB7 [ROM+0EB7] D0 FD BNE L_EEB6 EEB9 [ROM+0EB9] AA TAX EEBA [ROM+0EBA] 60 RTS ; return MAP_AND_JUMP_AB25: EEBB [ROM+0EBB] 20 75 ED JSR MAP_BUSCARD_ROM ; call/jump to map buscard rom EEBE [ROM+0EBE] 4C 25 AB JMP BUSCARD_HELPER_AB25 ; call/jump to buscard helper ab25 SAVE_SWITCH_STATE_AND_INIT_PPI: EEC1 [ROM+0EC1] AD 0F DD LDA CIA2_CRB ; CIA2 control register B EEC4 [ROM+0EC4] 29 7F AND #$7F EEC6 [ROM+0EC6] 8D 0F DD STA CIA2_CRB ; CIA2 control register B EEC9 [ROM+0EC9] AD 0B DD LDA CIA2_TODHR ; CIA2 TOD hours register EECC [ROM+0ECC] 8D 0B DD STA CIA2_TODHR ; CIA2 TOD hours register EECF [ROM+0ECF] AD C1 DE LDA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EED2 [ROM+0ED2] 29 20 AND #$20 EED4 [ROM+0ED4] D0 24 BNE L_EEFA L_EED6: EED6 [ROM+0ED6] A9 91 LDA #$91 EED8 [ROM+0ED8] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register EEDB [ROM+0EDB] A9 BB LDA #$BB EEDD [ROM+0EDD] 8D C1 DE STA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EEE0 [ROM+0EE0] A9 EF LDA #$EF EEE2 [ROM+0EE2] 8D C2 DE STA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input EEE5 [ROM+0EE5] 8D 08 DD STA CIA2_TOD10 ; CIA2 TOD tenths register EEE8 [ROM+0EE8] AD 08 DD LDA CIA2_TOD10 ; CIA2 TOD tenths register EEEB [ROM+0EEB] AD C0 DE LDA PPI_PA ; 8255 port A: IEEE DIO / Centronics data / DIP read EEEE [ROM+0EEE] 8D 0B DD STA CIA2_TODHR ; CIA2 TOD hours register EEF1 [ROM+0EF1] 6A ROR A EEF2 [ROM+0EF2] 8D 0A DD STA CIA2_TODMIN ; CIA2 TOD minutes register EEF5 [ROM+0EF5] A9 3B LDA #$3B EEF7 [ROM+0EF7] 8D C1 DE STA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select L_EEFA: EEFA [ROM+0EFA] 60 RTS ; return CIA2_CLK_HIGH_COMPAT: EEFB [ROM+0EFB] AD 00 DD LDA CIA2_PRA ; CIA2 port A EEFE [ROM+0EFE] 09 10 ORA #$10 EF00 [ROM+0F00] 8D 00 DD STA CIA2_PRA ; CIA2 port A EF03 [ROM+0F03] 60 RTS ; return EF04 [ROM+0F04] 00 00 .res 2, $00 ; unused/dead padding MAP_AND_JUMP_AB72: EF06 [ROM+0F06] 20 75 ED JSR MAP_BUSCARD_ROM ; call/jump to map buscard rom EF09 [ROM+0F09] 4C 72 AB JMP BUSCARD_HELPER_AB72 ; call/jump to buscard helper ab72 MAP_BUSCARD_AND_CONFIGURE: EF0C [ROM+0F0C] 85 01 STA CPU_PORT ; $0001 6510 memory-configuration port EF0E [ROM+0F0E] 20 C1 EE JSR SAVE_SWITCH_STATE_AND_INIT_PPI ; call/jump to save switch state and init ppi EF11 [ROM+0F11] AD C1 DE LDA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EF14 [ROM+0F14] 29 08 AND #$08 EF16 [ROM+0F16] D0 04 BNE L_EF1C EF18 [ROM+0F18] A9 E7 LDA #$E7 EF1A [ROM+0F1A] D0 07 BNE L_EF23 L_EF1C: EF1C [ROM+0F1C] 68 PLA ; restore/pull byte from stack EF1D [ROM+0F1D] 48 PHA ; save A on stack EF1E [ROM+0F1E] 8D 09 DD STA CIA2_TODSEC ; CIA2 TOD seconds register EF21 [ROM+0F21] A9 F7 LDA #$F7 L_EF23: EF23 [ROM+0F23] 2D C1 DE AND PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EF26 [ROM+0F26] 8D C1 DE STA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EF29 [ROM+0F29] 68 PLA ; restore/pull byte from stack EF2A [ROM+0F2A] 68 PLA ; restore/pull byte from stack EF2B [ROM+0F2B] 60 RTS ; return EF2C [ROM+0F2C] 00 00 .res 2, $00 ; unused/dead padding KERNAL_TIMER_COMPAT: EF2E [ROM+0F2E] A9 40 LDA #$40 EF30 [ROM+0F30] 2C A9 10 BIT $10A9 EF33 [ROM+0F33] 0D 97 02 ORA $0297 EF36 [ROM+0F36] 8D 97 02 STA $0297 L_EF39: EF39 [ROM+0F39] A9 01 LDA #$01 L_EF3B: EF3B [ROM+0F3B] 8D 0D DD STA CIA2_ICR ; CIA2 interrupt control/status L_EF3E: EF3E [ROM+0F3E] 4D A1 02 EOR $02A1 EF41 [ROM+0F41] 09 80 ORA #$80 EF43 [ROM+0F43] 8D A1 02 STA $02A1 EF46 [ROM+0F46] 8D 0D DD STA CIA2_ICR ; CIA2 interrupt control/status EF49 [ROM+0F49] 60 RTS ; return KERNAL_RS232_PARAM_HELPER: EF4A [ROM+0F4A] A2 09 LDX #$09 EF4C [ROM+0F4C] A9 20 LDA #$20 EF4E [ROM+0F4E] 2C 93 02 BIT $0293 EF51 [ROM+0F51] F0 01 BEQ L_EF54 EF53 [ROM+0F53] CA DEX L_EF54: EF54 [ROM+0F54] 50 02 BVC L_EF58 EF56 [ROM+0F56] CA DEX EF57 [ROM+0F57] CA DEX L_EF58: EF58 [ROM+0F58] 60 RTS ; return KERNAL_SERIAL_TIMING_COMPAT: EF59 [ROM+0F59] A6 A9 LDX $A9 EF5B [ROM+0F5B] D0 33 BNE L_EF90 EF5D [ROM+0F5D] C6 A8 DEC $A8 EF5F [ROM+0F5F] F0 36 BEQ MAP_AND_CALL_ABAE EF61 [ROM+0F61] 30 0D BMI L_EF70 EF63 [ROM+0F63] A5 A7 LDA $A7 EF65 [ROM+0F65] 45 AB EOR $AB EF67 [ROM+0F67] 85 AB STA $AB EF69 [ROM+0F69] 46 A7 LSR $A7 EF6B [ROM+0F6B] 66 AA ROR $AA L_EF6D: EF6D [ROM+0F6D] 60 RTS ; return L_EF6E: EF6E [ROM+0F6E] C6 A8 DEC $A8 L_EF70: EF70 [ROM+0F70] A5 A7 LDA $A7 EF72 [ROM+0F72] F0 67 BEQ L_EFDB EF74 [ROM+0F74] AD 93 02 LDA $0293 EF77 [ROM+0F77] 0A ASL A EF78 [ROM+0F78] A9 01 LDA #$01 EF7A [ROM+0F7A] 65 A8 ADC $A8 EF7C [ROM+0F7C] D0 EF BNE L_EF6D KERNAL_SERIAL_TIMER_SETUP: EF7E [ROM+0F7E] A9 90 LDA #$90 EF80 [ROM+0F80] 8D 0D DD STA CIA2_ICR ; CIA2 interrupt control/status EF83 [ROM+0F83] 0D A1 02 ORA $02A1 EF86 [ROM+0F86] 8D A1 02 STA $02A1 EF89 [ROM+0F89] 85 A9 STA $A9 EF8B [ROM+0F8B] A9 02 LDA #$02 EF8D [ROM+0F8D] 4C 3B EF JMP L_EF3B L_EF90: EF90 [ROM+0F90] A5 A7 LDA $A7 EF92 [ROM+0F92] D0 EA BNE KERNAL_SERIAL_TIMER_SETUP EF94 [ROM+0F94] 85 A9 STA $A9 EF96 [ROM+0F96] 60 RTS ; return MAP_AND_CALL_ABAE: EF97 [ROM+0F97] 20 75 ED JSR MAP_BUSCARD_ROM ; call/jump to map buscard rom EF9A [ROM+0F9A] 20 AE AB JSR BUSCARD_HELPER_ABAE ; call/jump to buscard helper abae BUSCARD_IO_CLEANUP: EF9D [ROM+0F9D] 20 F6 EF JSR SERIAL_BUFFER_FLUSH_COMPAT ; call/jump to serial buffer flush compat EFA0 [ROM+0FA0] AD C1 DE LDA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EFA3 [ROM+0FA3] 48 PHA ; save A on stack EFA4 [ROM+0FA4] 8A TXA EFA5 [ROM+0FA5] A2 FF LDX #$FF L_EFA7: EFA7 [ROM+0FA7] CA DEX EFA8 [ROM+0FA8] D0 FD BNE L_EFA7 EFAA [ROM+0FAA] AA TAX EFAB [ROM+0FAB] 20 6E EE JSR PPI_SAVE_AND_BSR ; call/jump to ppi save and bsr EFAE [ROM+0FAE] A9 0F LDA #$0F EFB0 [ROM+0FB0] 8D C2 DE STA PPI_PC ; 8255 port C: IEEE handshakes/control and printer BUSY input EFB3 [ROM+0FB3] A9 FF LDA #$FF EFB5 [ROM+0FB5] 8D C0 DE STA PPI_PA ; 8255 port A: IEEE DIO / Centronics data / DIP read EFB8 [ROM+0FB8] 68 PLA ; restore/pull byte from stack EFB9 [ROM+0FB9] 8D C1 DE STA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EFBC [ROM+0FBC] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping BUSCARD_LISTEN_TALK_CLEANUP: EFBF [ROM+0FBF] 20 F6 EF JSR SERIAL_BUFFER_FLUSH_COMPAT ; call/jump to serial buffer flush compat EFC2 [ROM+0FC2] 68 PLA ; restore/pull byte from stack EFC3 [ROM+0FC3] 29 E0 AND #$E0 EFC5 [ROM+0FC5] C9 20 CMP #$20 EFC7 [ROM+0FC7] D0 0D BNE L_EFD6 EFC9 [ROM+0FC9] AD C1 DE LDA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EFCC [ROM+0FCC] 48 PHA ; save A on stack L_EFCD: EFCD [ROM+0FCD] A9 89 LDA #$89 EFCF [ROM+0FCF] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register EFD2 [ROM+0FD2] 68 PLA ; restore/pull byte from stack EFD3 [ROM+0FD3] 8D C1 DE STA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select L_EFD6: EFD6 [ROM+0FD6] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping EFD9 [ROM+0FD9] 00 00 .res 2, $00 ; unused/dead padding L_EFDB: EFDB [ROM+0FDB] A5 AA LDA $AA EFDD [ROM+0FDD] D0 F1 BNE L_EFD0 EFDF [ROM+0FDF] F0 EC BEQ L_EFCD MAP_AND_ENTER_B000: EFE1 [ROM+0FE1] 48 PHA ; save A on stack EFE2 [ROM+0FE2] 20 75 ED JSR MAP_BUSCARD_ROM ; call/jump to map buscard rom EFE5 [ROM+0FE5] 4C 00 B0 JMP BUSCARD_REENTRY_B000 ; call/jump to buscard reentry b000 PPI_BSR_HELPER: EFE8 [ROM+0FE8] AD C1 DE LDA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EFEB [ROM+0FEB] 48 PHA ; save A on stack EFEC [ROM+0FEC] A9 91 LDA #$91 EFEE [ROM+0FEE] 8D C3 DE STA PPI_CTRL ; 8255 control / bit-set-reset register EFF1 [ROM+0FF1] 68 PLA ; restore/pull byte from stack EFF2 [ROM+0FF2] 8D C1 DE STA PPI_PB ; 8255 port B: ROM bank/basic enable, printer strobe, DIP select EFF5 [ROM+0FF5] 60 RTS ; return SERIAL_BUFFER_FLUSH_COMPAT: EFF6 [ROM+0FF6] 24 94 BIT $94 EFF8 [ROM+0FF8] 10 05 BPL L_EFFF EFFA [ROM+0FFA] 20 97 AA JSR BUSCARD_IO_ROUTINE_AA97 ; call/jump to buscard io routine aa97 EFFD [ROM+0FFD] 46 94 LSR $94 L_EFFF: EFFF [ROM+0FFF] 60 RTS ; return ; ========================================================================== ; U1 physical $1000-$1FFF -> CPU $B000-$BFFF ; BASIC4 relocation installer, uninstaller and encoded payload ; ========================================================================== ; -------------------------------------------------------------------------- ; Compatibility/re-entry helper reached from the resident $EFxx overlay. This ; block participates in restoring C64 state before returning through $ED97. ; -------------------------------------------------------------------------- BUSCARD_REENTRY_B000: B000 [ROM+1000] 68 PLA ; restore/pull byte from stack B001 [ROM+1001] 85 9A STA DFLTO ; current output device B003 [ROM+1003] AD 94 02 LDA $0294 B006 [ROM+1006] 4A LSR A B007 [ROM+1007] 90 29 BCC L_B032 B009 [ROM+1009] A9 02 LDA #$02 B00B [ROM+100B] 2C 01 DD BIT CIA2_PRB ; CIA2 port B B00E [ROM+100E] 10 1D BPL L_B02D B010 [ROM+1010] D0 20 BNE L_B032 L_B012: B012 [ROM+1012] AD A1 02 LDA $02A1 B015 [ROM+1015] 29 02 AND #$02 B017 [ROM+1017] D0 F9 BNE L_B012 L_B019: B019 [ROM+1019] 2C 01 DD BIT CIA2_PRB ; CIA2 port B B01C [ROM+101C] 70 FB BVS L_B019 B01E [ROM+101E] AD 01 DD LDA CIA2_PRB ; CIA2 port B B021 [ROM+1021] 09 02 ORA #$02 B023 [ROM+1023] 8D 01 DD STA CIA2_PRB ; CIA2 port B L_B026: B026 [ROM+1026] 2C 01 DD BIT CIA2_PRB ; CIA2 port B B029 [ROM+1029] 70 07 BVS L_B032 B02B [ROM+102B] 30 F9 BMI L_B026 L_B02D: B02D [ROM+102D] A9 40 LDA #$40 B02F [ROM+102F] 8D 97 02 STA $0297 L_B032: B032 [ROM+1032] 18 CLC B033 [ROM+1033] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping ; -------------------------------------------------------------------------- ; Enable stub. The resident SYS 61000 path jumps here, then into the relocation installer. ; -------------------------------------------------------------------------- BASIC4_ENABLE_STUB: B036 [ROM+1036] 4C 3C B0 JMP BASIC4_INSTALL_RELOCATE ; call/jump to basic4 install relocate ; -------------------------------------------------------------------------- ; Disable stub. The resident SYS 61003 path jumps here, then into the uninstaller. ; -------------------------------------------------------------------------- BASIC4_DISABLE_STUB: B039 [ROM+1039] 4C E7 B0 JMP BASIC4_UNINSTALL ; call/jump to basic4 uninstall ; -------------------------------------------------------------------------- ; BASIC 4.0 installer/relocator. The extension is stored encoded at $B47B-$BFFF. ; This routine walks the source BACKWARDS from $BFFF toward $B47B while also ; walking BASIC MEMSIZ downward. Nonzero bytes are literals. In the reverse ; stream, 00 00 represents one literal zero; otherwise 00 HIGH LOW represents a ; 16-bit address offset to which the original MEMSIZ is added. This makes the ; extension relocatable below the current BASIC top-of-memory. ; -------------------------------------------------------------------------- BASIC4_INSTALL_RELOCATE: B03C [ROM+103C] A9 00 LDA #$00 ; source pointer low = $00 B03E [ROM+103E] 85 22 STA $22 B040 [ROM+1040] A9 C0 LDA #$C0 ; source pointer high = $C0: start one byte past $BFFF B042 [ROM+1042] 85 23 STA $23 B044 [ROM+1044] A5 37 LDA MEMSIZ_LO ; save original MEMSIZ low; BASIC top-of-memory pointer low B046 [ROM+1046] 8D 35 03 STA B4_OLD_MEMSIZ_LO ; saved pre-install MEMSIZ low B049 [ROM+1049] 85 24 STA $24 B04B [ROM+104B] A5 38 LDA MEMSIZ_HI ; save original MEMSIZ high; BASIC top-of-memory pointer high B04D [ROM+104D] 8D 36 03 STA B4_OLD_MEMSIZ_HI ; saved pre-install MEMSIZ high B050 [ROM+1050] 85 25 STA $25 B052 [ROM+1052] A0 00 LDY #$00 RELOC_NEXT_ITEM: B054 [ROM+1054] A5 22 LDA $22 B056 [ROM+1056] D0 02 BNE L_B05A B058 [ROM+1058] C6 23 DEC $23 L_B05A: B05A [ROM+105A] C6 22 DEC $22 B05C [ROM+105C] B1 22 LDA ($22),Y ; read next encoded byte while walking backward B05E [ROM+105E] D0 2D BNE RELOC_STORE_LOW_OR_LITERAL ; nonzero => ordinary literal byte B060 [ROM+1060] A5 22 LDA $22 B062 [ROM+1062] D0 02 BNE L_B066 B064 [ROM+1064] C6 23 DEC $23 L_B066: B066 [ROM+1066] C6 22 DEC $22 B068 [ROM+1068] B1 22 LDA ($22),Y ; second zero => escaped literal $00; nonzero => relocation high byte B06A [ROM+106A] F0 21 BEQ RELOC_STORE_LOW_OR_LITERAL B06C [ROM+106C] 85 26 STA $26 B06E [ROM+106E] A5 22 LDA $22 B070 [ROM+1070] D0 02 BNE L_B074 B072 [ROM+1072] C6 23 DEC $23 L_B074: B074 [ROM+1074] C6 22 DEC $22 B076 [ROM+1076] B1 22 LDA ($22),Y ; read relocation low byte B078 [ROM+1078] 18 CLC ; add original MEMSIZ to relocation offset B079 [ROM+1079] 65 24 ADC $24 B07B [ROM+107B] AA TAX B07C [ROM+107C] A5 26 LDA $26 B07E [ROM+107E] 65 25 ADC $25 B080 [ROM+1080] 48 PHA ; save A on stack B081 [ROM+1081] A5 37 LDA MEMSIZ_LO ; decrement relocation destination pointer; BASIC top-of-memory pointer low B083 [ROM+1083] D0 02 BNE L_B087 B085 [ROM+1085] C6 38 DEC MEMSIZ_HI ; BASIC top-of-memory pointer high L_B087: B087 [ROM+1087] C6 37 DEC MEMSIZ_LO ; BASIC top-of-memory pointer low B089 [ROM+1089] 68 PLA ; restore/pull byte from stack B08A [ROM+108A] 91 37 STA (MEMSIZ_LO),Y ; BASIC top-of-memory pointer low B08C [ROM+108C] 8A TXA RELOC_STORE_LOW_OR_LITERAL: B08D [ROM+108D] 48 PHA ; save A on stack B08E [ROM+108E] A5 37 LDA MEMSIZ_LO ; BASIC top-of-memory pointer low B090 [ROM+1090] D0 02 BNE L_B094 B092 [ROM+1092] C6 38 DEC MEMSIZ_HI ; BASIC top-of-memory pointer high L_B094: B094 [ROM+1094] C6 37 DEC MEMSIZ_LO ; BASIC top-of-memory pointer low B096 [ROM+1096] 68 PLA ; restore/pull byte from stack B097 [ROM+1097] 91 37 STA (MEMSIZ_LO),Y ; store low/literal byte at new destination; BASIC top-of-memory pointer low B099 [ROM+1099] A5 37 LDA MEMSIZ_LO ; guard against overwriting BASIC variables; BASIC top-of-memory pointer low B09B [ROM+109B] C5 2D CMP VARTAB_LO ; BASIC start-of-variables pointer low B09D [ROM+109D] D0 06 BNE L_B0A5 B09F [ROM+109F] A5 38 LDA MEMSIZ_HI ; BASIC top-of-memory pointer high B0A1 [ROM+10A1] C5 2E CMP VARTAB_HI ; BASIC start-of-variables pointer high B0A3 [ROM+10A3] F0 32 BEQ INSTALL_ABORT_COLLISION L_B0A5: B0A5 [ROM+10A5] A5 22 LDA $22 ; test for source lower bound $B47B B0A7 [ROM+10A7] C9 7B CMP #$7B B0A9 [ROM+10A9] D0 A9 BNE RELOC_NEXT_ITEM B0AB [ROM+10AB] A5 23 LDA $23 B0AD [ROM+10AD] C9 B4 CMP #$B4 B0AF [ROM+10AF] D0 A3 BNE RELOC_NEXT_ITEM ; -------------------------------------------------------------------------- ; After relocation, install four consecutive 3-byte hook vectors at $0304-$030B: ; ICRNCH, IQPLOP, IGONE and IEVAL. They point at relocated base+0,+3,+6,+9. ; -------------------------------------------------------------------------- INSTALL_BASIC_VECTORS: B0B1 [ROM+10B1] A4 38 LDY MEMSIZ_HI ; BASIC top-of-memory pointer high B0B3 [ROM+10B3] A5 37 LDA MEMSIZ_LO ; BASIC top-of-memory pointer low B0B5 [ROM+10B5] A2 00 LDX #$00 L_B0B7: B0B7 [ROM+10B7] 9D 04 03 STA ICRNCH,X ; write hook-vector low byte; BASIC tokenizer/crunch indirect vector B0BA [ROM+10BA] 48 PHA ; save A on stack B0BB [ROM+10BB] 98 TYA B0BC [ROM+10BC] 9D 05 03 STA $0305,X ; write hook-vector high byte B0BF [ROM+10BF] 68 PLA ; restore/pull byte from stack B0C0 [ROM+10C0] E8 INX B0C1 [ROM+10C1] E8 INX B0C2 [ROM+10C2] 18 CLC B0C3 [ROM+10C3] 69 03 ADC #$03 ; next hook lies 3 bytes after previous one B0C5 [ROM+10C5] 90 01 BCC L_B0C8 B0C7 [ROM+10C7] C8 INY L_B0C8: B0C8 [ROM+10C8] E0 08 CPX #$08 B0CA [ROM+10CA] D0 EB BNE L_B0B7 B0CC [ROM+10CC] A9 00 LDA #$00 ; clear extension state byte after successful install B0CE [ROM+10CE] 8D 34 03 STA B4_STATE ; BusCard BASIC4 workspace/state B0D1 [ROM+10D1] 20 15 B1 JSR SYNC_BASIC_MEMORY_POINTERS ; call/jump to sync basic memory pointers B0D4 [ROM+10D4] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping ; -------------------------------------------------------------------------- ; Relocation abort: destination reached VARTAB, so there is not enough free BASIC ; memory. Restore the original MEMSIZ and synchronize BASIC memory pointers. ; -------------------------------------------------------------------------- INSTALL_ABORT_COLLISION: B0D7 [ROM+10D7] AD 35 03 LDA B4_OLD_MEMSIZ_LO ; saved pre-install MEMSIZ low B0DA [ROM+10DA] 85 37 STA MEMSIZ_LO ; BASIC top-of-memory pointer low B0DC [ROM+10DC] AD 36 03 LDA B4_OLD_MEMSIZ_HI ; saved pre-install MEMSIZ high B0DF [ROM+10DF] 85 38 STA MEMSIZ_HI ; BASIC top-of-memory pointer high B0E1 [ROM+10E1] 20 15 B1 JSR SYNC_BASIC_MEMORY_POINTERS ; call/jump to sync basic memory pointers B0E4 [ROM+10E4] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping ; -------------------------------------------------------------------------- ; BASIC 4.0 uninstaller. Restore the stock C64 BASIC indirect vectors, verify the ; "BASIC 4.0" signature in the relocated block, restore saved MEMSIZ, and resync ; BASIC memory pointers. ; -------------------------------------------------------------------------- BASIC4_UNINSTALL: B0E7 [ROM+10E7] A2 00 LDX #$00 L_B0E9: B0E9 [ROM+10E9] BD 2A B1 LDA DEFAULT_BASIC_VECTORS,X ; load stock BASIC-vector byte B0EC [ROM+10EC] 9D 04 03 STA ICRNCH,X ; restore it to $0304-$030B; BASIC tokenizer/crunch indirect vector B0EF [ROM+10EF] E8 INX B0F0 [ROM+10F0] E0 08 CPX #$08 B0F2 [ROM+10F2] D0 F5 BNE L_B0E9 B0F4 [ROM+10F4] A0 0C LDY #$0C ; runtime signature lies 12 bytes above relocated base B0F6 [ROM+10F6] A2 00 LDX #$00 L_B0F8: B0F8 [ROM+10F8] BD 32 B1 LDA BASIC4_SIGNATURE,X ; compare "BASIC 4.0" signature B0FB [ROM+10FB] F0 08 BEQ L_B105 B0FD [ROM+10FD] D1 37 CMP (MEMSIZ_LO),Y ; BASIC top-of-memory pointer low B0FF [ROM+10FF] D0 11 BNE L_B112 B101 [ROM+1101] C8 INY B102 [ROM+1102] E8 INX B103 [ROM+1103] D0 F3 BNE L_B0F8 L_B105: B105 [ROM+1105] AD 35 03 LDA B4_OLD_MEMSIZ_LO ; saved pre-install MEMSIZ low B108 [ROM+1108] 85 37 STA MEMSIZ_LO ; BASIC top-of-memory pointer low B10A [ROM+110A] AD 36 03 LDA B4_OLD_MEMSIZ_HI ; saved pre-install MEMSIZ high B10D [ROM+110D] 85 38 STA MEMSIZ_HI ; BASIC top-of-memory pointer high B10F [ROM+110F] 20 15 B1 JSR SYNC_BASIC_MEMORY_POINTERS ; call/jump to sync basic memory pointers L_B112: B112 [ROM+1112] 4C 97 ED JMP RESTORE_MEMORY_MAPPING ; call/jump to restore memory mapping ; -------------------------------------------------------------------------- ; Synchronize BASIC memory-management pointers after changing MEMSIZ. ; -------------------------------------------------------------------------- SYNC_BASIC_MEMORY_POINTERS: B115 [ROM+1115] A5 37 LDA MEMSIZ_LO ; FRETOP follows new MEMSIZ; BASIC top-of-memory pointer low B117 [ROM+1117] 85 33 STA FRETOP_LO ; BASIC top-of-string-space pointer low B119 [ROM+1119] A5 38 LDA MEMSIZ_HI ; BASIC top-of-memory pointer high B11B [ROM+111B] 85 34 STA FRETOP_HI ; BASIC top-of-string-space pointer high B11D [ROM+111D] A5 2D LDA VARTAB_LO ; copy VARTAB into BASIC array/string boundary pointers; BASIC start-of-variables pointer low B11F [ROM+111F] A6 2E LDX VARTAB_HI ; BASIC start-of-variables pointer high B121 [ROM+1121] 85 2F STA $2F B123 [ROM+1123] 86 30 STX $30 B125 [ROM+1125] 85 31 STA $31 B127 [ROM+1127] 86 32 STX $32 B129 [ROM+1129] 60 RTS ; return DEFAULT_BASIC_VECTORS: B12A [ROM+112A] 7C A5 1A A7 E4 A7 86 AE .word $A57C, $A71A, $A7E4, $AE86 ; Restores ICRNCH=$A57C, IQPLOP=$A71A, IGONE=$A7E4, IEVAL=$AE86. BASIC4_SIGNATURE: B132 [ROM+1132] 42 41 53 49 43 20 34 2E 30 00 .byte $42, $41, $53, $49, $43, $20, $34, $2E, $30, $00 ; "BASIC 4.0",0 ; -------------------------------------------------------------------------- ; 831 bytes of zero fill between installer data and the encoded BASIC4 stream. ; -------------------------------------------------------------------------- B13C [ROM+113C] <831 zero bytes> .res 831, $00 ; through $B47A ; -------------------------------------------------------------------------- ; Encoded relocatable BASIC4 extension stream ; DATA: encoded relocatable BASIC 4.0 extension. Do NOT disassemble this directly: ; its zero escape/relocation records change both byte count and absolute addresses. ; An expanded, derived listing for the normal C64 MEMSIZ=$A000 case follows later. ; -------------------------------------------------------------------------- ; -------------------------------------------------------------------------- ; DATA: encoded relocatable BASIC 4.0 extension. Do NOT disassemble this directly: ; its zero escape/relocation records change both byte count and absolute addresses. ; An expanded, derived listing for the normal C64 MEMSIZ=$A000 case follows later. ; -------------------------------------------------------------------------- BASIC4_RELOCATION_STREAM: B47B [ROM+147B] 4C 71 F5 00 4C F7 F5 00 4C 15 F7 00 .byte $4C, $71, $F5, $00, $4C, $F7, $F5, $00, $4C, $15, $F7, $00 ; Lq..L...L... B487 [ROM+1487] 4C CF F7 00 42 41 53 49 43 20 34 2E .byte $4C, $CF, $F7, $00, $42, $41, $53, $49, $43, $20, $34, $2E ; L...BASIC 4. B493 [ROM+1493] 30 00 00 A6 7A A4 7A BD 00 00 02 99 .byte $30, $00, $00, $A6, $7A, $A4, $7A, $BD, $00, $00, $02, $99 ; 0...z.z..... B49F [ROM+149F] 00 00 02 F0 55 C9 22 D0 12 E8 C8 BD .byte $00, $00, $02, $F0, $55, $C9, $22, $D0, $12, $E8, $C8, $BD ; ....U."..... B4AB [ROM+14AB] 00 00 02 99 00 00 02 F0 47 C9 22 D0 .byte $00, $00, $02, $99, $00, $00, $02, $F0, $47, $C9, $22, $D0 ; ........G.". B4B7 [ROM+14B7] F2 E8 C8 D0 E2 C9 41 90 24 C9 5B B0 .byte $F2, $E8, $C8, $D0, $E2, $C9, $41, $90, $24, $C9, $5B, $B0 ; ......A.$.[. B4C3 [ROM+14C3] 20 84 71 86 97 A0 01 84 0B CA A0 FF .byte $20, $84, $71, $86, $97, $A0, $01, $84, $0B, $CA, $A0, $FF ; .q......... B4CF [ROM+14CF] E8 C8 BD 00 00 02 38 F9 2B F6 00 F0 .byte $E8, $C8, $BD, $00, $00, $02, $38, $F9, $2B, $F6, $00, $F0 ; ......8.+... B4DB [ROM+14DB] F5 0A D0 0B A4 71 A5 0B 99 00 00 02 .byte $F5, $0A, $D0, $0B, $A4, $71, $A5, $0B, $99, $00, $00, $02 ; .....q...... B4E7 [ROM+14E7] E8 C8 D0 B6 A6 97 E6 0B C8 B9 2A F6 .byte $E8, $C8, $D0, $B6, $A6, $97, $E6, $0B, $C8, $B9, $2A, $F6 ; ..........*. B4F3 [ROM+14F3] 00 10 FA B9 2B F6 00 D0 DA A4 71 10 .byte $00, $10, $FA, $B9, $2B, $F6, $00, $D0, $DA, $A4, $71, $10 ; ....+.....q. B4FF [ROM+14FF] E9 20 7C A5 A2 00 00 BD 00 00 02 F0 .byte $E9, $20, $7C, $A5, $A2, $00, $00, $BD, $00, $00, $02, $F0 ; . |......... B50B [ROM+150B] 1A E8 C9 22 D0 0A BD 00 00 02 F0 10 .byte $1A, $E8, $C9, $22, $D0, $0A, $BD, $00, $00, $02, $F0, $10 ; ..."........ B517 [ROM+1517] E8 C9 22 D0 F6 C9 20 B0 E8 69 CB 9D .byte $E8, $C9, $22, $D0, $F6, $C9, $20, $B0, $E8, $69, $CB, $9D ; .."... ..i.. B523 [ROM+1523] FF 01 D0 E1 60 10 2C C9 FF F0 28 24 .byte $FF, $01, $D0, $E1, $60, $10, $2C, $C9, $FF, $F0, $28, $24 ; ....`.,...($ B52F [ROM+152F] 0F 30 24 C9 CC 90 23 E9 CB AA 84 49 .byte $0F, $30, $24, $C9, $CC, $90, $23, $E9, $CB, $AA, $84, $49 ; .0$...#....I B53B [ROM+153B] A0 FF CA F0 08 C8 B9 2B F6 00 10 FA .byte $A0, $FF, $CA, $F0, $08, $C8, $B9, $2B, $F6, $00, $10, $FA ; .......+.... B547 [ROM+1547] 30 F5 C8 B9 2B F6 00 30 05 20 47 AB .byte $30, $F5, $C8, $B9, $2B, $F6, $00, $30, $05, $20, $47, $AB ; 0...+..0. G. B553 [ROM+1553] D0 F5 4C EF A6 4C F3 A6 4C 24 A7 43 .byte $D0, $F5, $4C, $EF, $A6, $4C, $F3, $A6, $4C, $24, $A7, $43 ; ..L..L..L$.C B55F [ROM+155F] 4F 4E 43 41 D4 44 4F 50 45 CE 44 43 .byte $4F, $4E, $43, $41, $D4, $44, $4F, $50, $45, $CE, $44, $43 ; ONCA.DOPE.DC B56B [ROM+156B] 4C 4F 53 C5 52 45 43 4F 52 C4 48 45 .byte $4C, $4F, $53, $C5, $52, $45, $43, $4F, $52, $C4, $48, $45 ; LOS.RECOR.HE B577 [ROM+1577] 41 44 45 D2 43 4F 4C 4C 45 43 D4 42 .byte $41, $44, $45, $D2, $43, $4F, $4C, $4C, $45, $43, $D4, $42 ; ADE.COLLEC.B B583 [ROM+1583] 41 43 4B 55 D0 43 4F 50 D9 41 50 50 .byte $41, $43, $4B, $55, $D0, $43, $4F, $50, $D9, $41, $50, $50 ; ACKU.COP.APP B58F [ROM+158F] 45 4E C4 44 53 41 56 C5 44 4C 4F 41 .byte $45, $4E, $C4, $44, $53, $41, $56, $C5, $44, $4C, $4F, $41 ; EN.DSAV.DLOA B59B [ROM+159B] C4 43 41 54 41 4C 4F C7 52 45 4E 41 .byte $C4, $43, $41, $54, $41, $4C, $4F, $C7, $52, $45, $4E, $41 ; .CATALO.RENA B5A7 [ROM+15A7] 4D C5 53 43 52 41 54 43 C8 44 49 52 .byte $4D, $C5, $53, $43, $52, $41, $54, $43, $C8, $44, $49, $52 ; M.SCRATC.DIR B5B3 [ROM+15B3] 45 43 54 4F 52 D9 00 00 28 FC 00 D0 .byte $45, $43, $54, $4F, $52, $D9, $00, $00, $28, $FC, $00, $D0 ; ECTOR...(... B5BF [ROM+15BF] FA 00 6C FB 00 12 F9 00 2C FB 00 CA .byte $FA, $00, $6C, $FB, $00, $12, $F9, $00, $2C, $FB, $00, $CA ; ..l.....,... B5CB [ROM+15CB] FB 00 E3 FB 00 08 FC 00 12 FB 00 6E .byte $FB, $00, $E3, $FB, $00, $08, $FC, $00, $12, $FB, $00, $6E ; ...........n B5D7 [ROM+15D7] FC 00 9B FC 00 DE F9 00 C6 FC 00 D7 .byte $FC, $00, $9B, $FC, $00, $DE, $F9, $00, $C6, $FC, $00, $D7 ; ............ B5E3 [ROM+15E3] FC 00 DE F9 00 20 AB F6 00 4C B5 AB .byte $FC, $00, $DE, $F9, $00, $20, $AB, $F6, $00, $4C, $B5, $AB ; ..... ...L.. B5EF [ROM+15EF] 20 73 00 00 20 9E B7 F0 05 A9 2C 20 .byte $20, $73, $00, $00, $20, $9E, $B7, $F0, $05, $A9, $2C, $20 ; s.. ....., B5FB [ROM+15FB] FF AE 08 86 13 20 18 E1 20 ED F6 00 .byte $FF, $AE, $08, $86, $13, $20, $18, $E1, $20, $ED, $F6, $00 ; ..... .. ... B607 [ROM+1607] 4C 96 AA 20 DA F6 00 4C B2 AB 20 73 .byte $4C, $96, $AA, $20, $DA, $F6, $00, $4C, $B2, $AB, $20, $73 ; L.. ...L.. s B613 [ROM+1613] 00 00 20 A6 B3 C9 23 D0 03 20 DA F6 .byte $00, $00, $20, $A6, $B3, $C9, $23, $D0, $03, $20, $DA, $F6 ; .. ...#.. .. B61F [ROM+161F] 00 4C 92 AB 20 73 00 00 20 9E B7 A9 .byte $00, $4C, $92, $AB, $20, $73, $00, $00, $20, $9E, $B7, $A9 ; .L.. s.. ... B62B [ROM+162B] 2C 20 FF AE 86 13 20 1E E1 4C ED F6 .byte $2C, $20, $FF, $AE, $86, $13, $20, $1E, $E1, $4C, $ED, $F6 ; , .... ..L.. B637 [ROM+1637] 00 A5 BA C9 04 90 03 20 50 FD 00 60 .byte $00, $A5, $BA, $C9, $04, $90, $03, $20, $50, $FD, $00, $60 ; ....... P..` B643 [ROM+1643] 20 A5 F6 00 4C AE A7 20 AB F6 00 4C .byte $20, $A5, $F6, $00, $4C, $AE, $A7, $20, $AB, $F6, $00, $4C ; ...L.. ...L B64F [ROM+164F] AE A7 20 C4 F6 00 4C AE A7 20 CA F6 .byte $AE, $A7, $20, $C4, $F6, $00, $4C, $AE, $A7, $20, $CA, $F6 ; .. ...L.. .. B65B [ROM+165B] 00 4C AE A7 20 50 FD 00 4C 59 F7 00 .byte $00, $4C, $AE, $A7, $20, $50, $FD, $00, $4C, $59, $F7, $00 ; .L.. P..LY.. B667 [ROM+1667] 20 73 00 00 2C 68 68 20 79 00 00 F0 .byte $20, $73, $00, $00, $2C, $68, $68, $20, $79, $00, $00, $F0 ; s..,hh y... B673 [ROM+1673] 39 C9 98 F0 D3 C9 84 F0 DB C9 A1 F0 .byte $39, $C9, $98, $F0, $D3, $C9, $84, $F0, $DB, $C9, $A1, $F0 ; 9........... B67F [ROM+167F] DD C9 9D F0 CD C9 9C F0 DB C9 A2 F0 .byte $DD, $C9, $9D, $F0, $CD, $C9, $9C, $F0, $DB, $C9, $A2, $F0 ; ............ B68B [ROM+168B] D7 C9 8A F0 D3 C9 93 F0 2C C9 8B D0 .byte $D7, $C9, $8A, $F0, $D3, $C9, $93, $F0, $2C, $C9, $8B, $D0 ; ........,... B697 [ROM+1697] 06 20 AB F7 00 4C AE A7 38 E9 CC 90 .byte $06, $20, $AB, $F7, $00, $4C, $AE, $A7, $38, $E9, $CC, $90 ; . ...L..8... B6A3 [ROM+16A3] 0A C9 0F B0 06 20 5F F7 00 4C AE A7 .byte $0A, $C9, $0F, $B0, $06, $20, $5F, $F7, $00, $4C, $AE, $A7 ; ..... _..L.. B6AF [ROM+16AF] 20 79 00 00 4C E7 A7 0A A8 B9 88 F6 .byte $20, $79, $00, $00, $4C, $E7, $A7, $0A, $A8, $B9, $88, $F6 ; y..L....... B6BB [ROM+16BB] 00 48 B9 87 F6 00 48 4C 73 00 00 A0 .byte $00, $48, $B9, $87, $F6, $00, $48, $4C, $73, $00, $00, $A0 ; .H....HLs... B6C7 [ROM+16C7] 03 B9 77 02 D9 A7 F7 00 D0 27 88 10 .byte $03, $B9, $77, $02, $D9, $A7, $F7, $00, $D0, $27, $88, $10 ; ..w......'.. B6D3 [ROM+16D3] F5 A5 C5 C9 3F D0 1E A5 7B C9 02 D0 .byte $F5, $A5, $C5, $C9, $3F, $D0, $1E, $A5, $7B, $C9, $02, $D0 ; ....?...{... B6DF [ROM+16DF] 18 A9 03 AE A2 F7 00 AC A3 F7 00 20 .byte $18, $A9, $03, $AE, $A2, $F7, $00, $AC, $A3, $F7, $00, $20 ; ........... B6EB [ROM+16EB] BD FF A2 08 A0 00 00 20 BA FF 20 6F .byte $BD, $FF, $A2, $08, $A0, $00, $00, $20, $BA, $FF, $20, $6F ; ....... .. o B6F7 [ROM+16F7] E1 4C AE A7 A9 93 4C 4A F7 00 A4 F7 .byte $E1, $4C, $AE, $A7, $A9, $93, $4C, $4A, $F7, $00, $A4, $F7 ; .L....LJ.... B703 [ROM+1703] 00 30 3A 2A 52 55 4E 0D 20 73 00 00 .byte $00, $30, $3A, $2A, $52, $55, $4E, $0D, $20, $73, $00, $00 ; .0:*RUN. s.. B70F [ROM+170F] 20 9E AD 20 79 00 00 C9 89 F0 05 A9 .byte $20, $9E, $AD, $20, $79, $00, $00, $C9, $89, $F0, $05, $A9 ; .. y....... B71B [ROM+171B] A7 20 FF AE A5 61 F0 0B 20 79 00 00 .byte $A7, $20, $FF, $AE, $A5, $61, $F0, $0B, $20, $79, $00, $00 ; . ...a.. y.. B727 [ROM+1727] 90 03 4C 19 F7 00 4C A0 A8 4C 3B A9 .byte $90, $03, $4C, $19, $F7, $00, $4C, $A0, $A8, $4C, $3B, $A9 ; ..L...L..L;. B733 [ROM+1733] 38 A5 49 E9 02 85 49 A5 4A E9 00 00 .byte $38, $A5, $49, $E9, $02, $85, $49, $A5, $4A, $E9, $00, $00 ; 8.I...I.J... B73F [ROM+173F] 85 4A A0 00 00 B1 49 AA C8 B1 49 A8 .byte $85, $4A, $A0, $00, $00, $B1, $49, $AA, $C8, $B1, $49, $A8 ; .J....I...I. B74B [ROM+174B] 20 00 F9 00 90 03 4C 08 AF 18 A5 49 .byte $20, $00, $F9, $00, $90, $03, $4C, $08, $AF, $18, $A5, $49 ; .....L....I B757 [ROM+1757] 69 02 85 49 A5 4A 69 00 00 85 4A A9 .byte $69, $02, $85, $49, $A5, $4A, $69, $00, $00, $85, $4A, $A9 ; i..I.Ji...J. B763 [ROM+1763] 00 00 85 0D 20 73 00 00 B0 03 4C F3 .byte $00, $00, $85, $0D, $20, $73, $00, $00, $B0, $03, $4C, $F3 ; .... s....L. B76F [ROM+176F] BC 20 13 B1 B0 03 4C 9A AE 2C 34 03 .byte $BC, $20, $13, $B1, $B0, $03, $4C, $9A, $AE, $2C, $34, $03 ; . ....L..,4. B77B [ROM+177B] 30 2F A5 7A 48 A5 7B 48 20 79 00 00 .byte $30, $2F, $A5, $7A, $48, $A5, $7B, $48, $20, $79, $00, $00 ; 0/.zH.{H y.. B787 [ROM+1787] C9 44 D0 1C 20 73 00 00 C9 53 D0 15 .byte $C9, $44, $D0, $1C, $20, $73, $00, $00, $C9, $53, $D0, $15 ; .D.. s...S.. B793 [ROM+1793] 20 73 00 00 90 FB 20 13 B1 B0 F6 C9 .byte $20, $73, $00, $00, $90, $FB, $20, $13, $B1, $B0, $F6, $C9 ; s.... ..... B79F [ROM+179F] 25 F0 07 C9 28 F0 03 20 45 F8 00 68 .byte $25, $F0, $07, $C9, $28, $F0, $03, $20, $45, $F8, $00, $68 ; %...(.. E..h B7AB [ROM+17AB] 85 7B 68 85 7A 4C 28 AF A0 00 00 84 .byte $85, $7B, $68, $85, $7A, $4C, $28, $AF, $A0, $00, $00, $84 ; .{h.zL(..... B7B7 [ROM+17B7] 90 88 8C 34 03 A5 BA C9 04 B0 04 A9 .byte $90, $88, $8C, $34, $03, $A5, $BA, $C9, $04, $B0, $04, $A9 ; ...4........ B7C3 [ROM+17C3] 08 85 BA 20 09 ED A5 90 F0 04 A2 00 .byte $08, $85, $BA, $20, $09, $ED, $A5, $90, $F0, $04, $A2, $00 ; ... ........ B7CF [ROM+17CF] 00 F0 1B A9 6F 20 C7 ED A2 00 00 20 .byte $00, $F0, $1B, $A9, $6F, $20, $C7, $ED, $A2, $00, $00, $20 ; ....o ..... B7DB [ROM+17DB] 13 EE 9D 53 03 E8 E0 29 F0 08 C9 0D .byte $13, $EE, $9D, $53, $03, $E8, $E0, $29, $F0, $08, $C9, $0D ; ...S...).... B7E7 [ROM+17E7] F0 04 A5 90 F0 ED CA A9 00 00 9D 53 .byte $F0, $04, $A5, $90, $F0, $ED, $CA, $A9, $00, $00, $9D, $53 ; ...........S B7F3 [ROM+17F3] 03 8A 48 20 EF ED A9 44 85 45 A9 D3 .byte $03, $8A, $48, $20, $EF, $ED, $A9, $44, $85, $45, $A9, $D3 ; ..H ...D.E.. B7FF [ROM+17FF] 85 46 20 E7 B0 68 48 20 F4 B4 A0 02 .byte $85, $46, $20, $E7, $B0, $68, $48, $20, $F4, $B4, $A0, $02 ; .F ..hH .... B80B [ROM+180B] A5 36 91 47 88 A5 35 91 47 88 68 48 .byte $A5, $36, $91, $47, $88, $A5, $35, $91, $47, $88, $68, $48 ; .6.G..5.G.hH B817 [ROM+1817] 91 47 A8 88 30 07 B9 53 03 91 35 D0 .byte $91, $47, $A8, $88, $30, $07, $B9, $53, $03, $91, $35, $D0 ; .G..0..S..5. B823 [ROM+1823] F6 A9 53 85 7A A9 03 85 7B 68 D0 0E .byte $F6, $A9, $53, $85, $7A, $A9, $03, $85, $7B, $68, $D0, $0E ; ..S.z...{h.. B82F [ROM+182F] A0 31 8C 53 03 88 8C 54 03 A9 00 00 .byte $A0, $31, $8C, $53, $03, $88, $8C, $54, $03, $A9, $00, $00 ; .1.S...T.... B83B [ROM+183B] 8D 55 03 A5 47 48 A5 48 48 A9 53 85 .byte $8D, $55, $03, $A5, $47, $48, $A5, $48, $48, $A9, $53, $85 ; .U..GH.HH.S. B847 [ROM+1847] 46 20 E7 B0 20 9E AD 06 62 46 62 A0 .byte $46, $20, $E7, $B0, $20, $9E, $AD, $06, $62, $46, $62, $A0 ; F .. ...bFb. B853 [ROM+1853] 04 B9 61 00 00 91 47 88 10 F8 68 85 .byte $04, $B9, $61, $00, $00, $91, $47, $88, $10, $F8, $68, $85 ; ..a...G...h. B85F [ROM+185F] 48 68 85 47 60 A5 7A 48 A5 7B 48 20 .byte $48, $68, $85, $47, $60, $A5, $7A, $48, $A5, $7B, $48, $20 ; Hh.G`.zH.{H B86B [ROM+186B] 45 F8 00 68 85 7B 68 85 7A 60 E0 44 .byte $45, $F8, $00, $68, $85, $7B, $68, $85, $7A, $60, $E0, $44 ; E..h.{h.z`.D B877 [ROM+1877] D0 08 C0 53 F0 06 C0 D3 F0 02 18 60 .byte $D0, $08, $C0, $53, $F0, $06, $C0, $D3, $F0, $02, $18, $60 ; ...S.......` B883 [ROM+1883] 38 60 4C 08 AF A9 01 8D 3A 03 20 79 .byte $38, $60, $4C, $08, $AF, $A9, $01, $8D, $3A, $03, $20, $79 ; 8`L.....:. y B88F [ROM+188F] 00 00 A9 23 20 FF AE 20 EC FF 00 E0 .byte $00, $00, $A9, $23, $20, $FF, $AE, $20, $EC, $FF, $00, $E0 ; ...# .. .... B89B [ROM+189B] 00 00 F0 3E 86 B8 20 FD AE F0 E2 90 .byte $00, $00, $F0, $3E, $86, $B8, $20, $FD, $AE, $F0, $E2, $90 ; ...>.. ..... B8A7 [ROM+18A7] 0F 20 FA AE 20 9E AD 20 F7 B7 20 F7 .byte $0F, $20, $FA, $AE, $20, $9E, $AD, $20, $F7, $B7, $20, $F7 ; . .. .. .. . B8B3 [ROM+18B3] AE 4C 45 F9 00 20 9E AD 20 F7 B7 20 .byte $AE, $4C, $45, $F9, $00, $20, $9E, $AD, $20, $F7, $B7, $20 ; .LE.. .. .. B8BF [ROM+18BF] 79 00 00 F0 18 20 FD AE F0 C1 20 EC .byte $79, $00, $00, $F0, $18, $20, $FD, $AE, $F0, $C1, $20, $EC ; y.... .... . B8CB [ROM+18CB] FF 00 E0 00 00 F0 0F E0 FF F0 0B 8E .byte $FF, $00, $E0, $00, $00, $F0, $0F, $E0, $FF, $F0, $0B, $8E ; ............ B8D7 [ROM+18D7] 3A 03 20 79 00 00 D0 AE 4C 97 FB 00 .byte $3A, $03, $20, $79, $00, $00, $D0, $AE, $4C, $97, $FB, $00 ; :. y....L... B8E3 [ROM+18E3] 4C 89 FF 00 29 E6 F0 03 4C 08 AF AD .byte $4C, $89, $FF, $00, $29, $E6, $F0, $03, $4C, $08, $AF, $AD ; L...)...L... B8EF [ROM+18EF] 3E 03 29 01 C9 01 D0 F4 AD 3E 03 60 .byte $3E, $03, $29, $01, $C9, $01, $D0, $F4, $AD, $3E, $03, $60 ; >.)......>.` B8FB [ROM+18FB] 29 E7 D0 EC 60 29 E6 D0 E7 60 29 C4 .byte $29, $E7, $D0, $EC, $60, $29, $E6, $D0, $E7, $60, $29, $C4 ; )...`)...`). B907 [ROM+1907] D0 E2 AD 3E 03 29 03 C9 03 D0 D9 AD .byte $D0, $E2, $AD, $3E, $03, $29, $03, $C9, $03, $D0, $D9, $AD ; ...>.)...... B913 [ROM+1913] 3E 03 60 29 05 C9 05 D0 CF AD 3E 03 .byte $3E, $03, $60, $29, $05, $C9, $05, $D0, $CF, $AD, $3E, $03 ; >.`)......>. B91F [ROM+191F] 60 24 D1 3A F1 24 F1 D1 3A F1 2C E1 .byte $60, $24, $D1, $3A, $F1, $24, $F1, $D1, $3A, $F1, $2C, $E1 ; `$.:.$..:.,. B92B [ROM+192B] 2C E0 D1 3A F1 2C 41 4E D1 3A F1 2C .byte $2C, $E0, $D1, $3A, $F1, $2C, $41, $4E, $D1, $3A, $F1, $2C ; ,..:.,AN.:., B937 [ROM+1937] D0 56 D1 44 D2 3D D1 43 D2 3A F2 3D .byte $D0, $56, $D1, $44, $D2, $3D, $D1, $43, $D2, $3A, $F2, $3D ; .V.D.=.C.:.= B943 [ROM+1943] D1 3A F1 43 D2 3A F2 3D D2 3A F2 2C .byte $D1, $3A, $F1, $43, $D2, $3A, $F2, $3D, $D2, $3A, $F2, $2C ; .:.C.:.=.:., B94F [ROM+194F] D1 3A F1 52 D1 3A F2 3D D1 3A F1 53 .byte $D1, $3A, $F1, $52, $D1, $3A, $F2, $3D, $D1, $3A, $F1, $53 ; .:.R.:.=.:.S B95B [ROM+195B] D1 3A F1 A5 B8 85 AF 20 CA FD 00 20 .byte $D1, $3A, $F1, $A5, $B8, $85, $AF, $20, $CA, $FD, $00, $20 ; .:..... ... B967 [ROM+1967] 81 F9 00 A0 00 00 A2 01 AD 3E 03 29 .byte $81, $F9, $00, $A0, $00, $00, $A2, $01, $AD, $3E, $03, $29 ; .........>.) B973 [ROM+1973] 10 F0 0C E8 AD 3E 03 29 01 F0 0E E8 .byte $10, $F0, $0C, $E8, $AD, $3E, $03, $29, $01, $F0, $0E, $E8 ; .....>.).... B97F [ROM+197F] E8 D0 0A A0 04 AD 3E 03 29 01 F0 01 .byte $E8, $D0, $0A, $A0, $04, $AD, $3E, $03, $29, $01, $F0, $01 ; ......>.)... B98B [ROM+198B] E8 8A 20 5C FD 00 A5 9A 85 AE A9 60 .byte $E8, $8A, $20, $5C, $FD, $00, $A5, $9A, $85, $AE, $A9, $60 ; .. \.......` B997 [ROM+1997] 85 B9 A9 0E 85 B8 20 FE ED 20 C0 FF .byte $85, $B9, $A9, $0E, $85, $B8, $20, $FE, $ED, $20, $C0, $FF ; ...... .. .. B9A3 [ROM+19A3] 90 0A 08 48 20 9F FA 00 68 28 4C D1 .byte $90, $0A, $08, $48, $20, $9F, $FA, $00, $68, $28, $4C, $D1 ; ...H ...h(L. B9AF [ROM+19AF] E1 A9 00 00 85 90 A0 03 84 B7 A2 0E .byte $E1, $A9, $00, $00, $85, $90, $A0, $03, $84, $B7, $A2, $0E ; ............ B9BB [ROM+19BB] 20 C6 FF 20 CF FF 85 FD A4 90 D0 5D .byte $20, $C6, $FF, $20, $CF, $FF, $85, $FD, $A4, $90, $D0, $5D ; .. .......] B9C7 [ROM+19C7] 20 CF FF 85 FE A4 90 D0 54 A4 B7 88 .byte $20, $CF, $FF, $85, $FE, $A4, $90, $D0, $54, $A4, $B7, $88 ; .......T... B9D3 [ROM+19D3] D0 E2 20 CC FF 20 B2 FA 00 A6 FD A5 .byte $D0, $E2, $20, $CC, $FF, $20, $B2, $FA, $00, $A6, $FD, $A5 ; .. .. ...... B9DF [ROM+19DF] FE 20 CD BD A9 20 20 D2 FF 20 CC FF .byte $FE, $20, $CD, $BD, $A9, $20, $20, $D2, $FF, $20, $CC, $FF ; . ... .. .. B9EB [ROM+19EB] A2 0E 20 C6 FF 20 CF FF 48 20 CC FF .byte $A2, $0E, $20, $C6, $FF, $20, $CF, $FF, $48, $20, $CC, $FF ; .. .. ..H .. B9F7 [ROM+19F7] 68 A6 90 D0 29 C9 00 00 F0 18 20 A7 .byte $68, $A6, $90, $D0, $29, $C9, $00, $00, $F0, $18, $20, $A7 ; h...)..... . BA03 [ROM+1A03] FA 00 20 E1 FF F0 1D 20 E4 FF F0 DE .byte $FA, $00, $20, $E1, $FF, $F0, $1D, $20, $E4, $FF, $F0, $DE ; .. .... .... BA0F [ROM+1A0F] C9 20 D0 DA 20 E4 FF F0 FB D0 D3 A9 .byte $C9, $20, $D0, $DA, $20, $E4, $FF, $F0, $FB, $D0, $D3, $A9 ; . .. ....... BA1B [ROM+1A1B] 0D 20 A7 FA 00 20 FE ED A0 02 D0 94 .byte $0D, $20, $A7, $FA, $00, $20, $FE, $ED, $A0, $02, $D0, $94 ; . ... ...... BA27 [ROM+1A27] 68 20 CC FF A9 0E 4C C3 FF 48 20 B2 .byte $68, $20, $CC, $FF, $A9, $0E, $4C, $C3, $FF, $48, $20, $B2 ; h ....L..H . BA33 [ROM+1A33] FA 00 68 20 D2 FF 4C CC FF A6 AE E0 .byte $FA, $00, $68, $20, $D2, $FF, $4C, $CC, $FF, $A6, $AE, $E0 ; ..h ..L..... BA3F [ROM+1A3F] 03 F0 05 A6 AF 20 C9 FF 60 A0 61 C8 .byte $03, $F0, $05, $A6, $AF, $20, $C9, $FF, $60, $A0, $61, $C8 ; ..... ..`.a. BA4B [ROM+1A4B] 98 A6 98 CA 30 07 DD 6D 02 F0 F4 D0 .byte $98, $A6, $98, $CA, $30, $07, $DD, $6D, $02, $F0, $F4, $D0 ; ....0..m.... BA57 [ROM+1A57] F6 84 B9 60 20 CA FD 00 20 97 F9 00 .byte $F6, $84, $B9, $60, $20, $CA, $FD, $00, $20, $97, $F9, $00 ; ...` ... ... BA63 [ROM+1A63] 29 22 F0 03 4C 08 AF 20 BE FA 00 A0 .byte $29, $22, $F0, $03, $4C, $08, $AF, $20, $BE, $FA, $00, $A0 ; )"..L.. .... BA6F [ROM+1A6F] 06 A2 03 AD 3E 03 29 10 D0 04 A0 08 .byte $06, $A2, $03, $AD, $3E, $03, $29, $10, $D0, $04, $A0, $08 ; ....>.)..... BA7B [ROM+1A7B] A2 01 2C 3E 03 50 04 A2 07 A0 06 2C .byte $A2, $01, $2C, $3E, $03, $50, $04, $A2, $07, $A0, $06, $2C ; ..,>.P....., BA87 [ROM+1A87] 3E 03 10 0E A9 40 8D 53 03 8A A2 01 .byte $3E, $03, $10, $0E, $A9, $40, $8D, $53, $03, $8A, $A2, $01 ; >....@.S.... BA93 [ROM+1A93] 20 5E FD 00 4C C1 E1 8A 20 5C FD 00 .byte $20, $5E, $FD, $00, $4C, $C1, $E1, $8A, $20, $5C, $FD, $00 ; ^..L... \.. BA9F [ROM+1A9F] 4C C1 E1 20 CA FD 00 20 97 F9 00 29 .byte $4C, $C1, $E1, $20, $CA, $FD, $00, $20, $97, $F9, $00, $29 ; L.. ... ...) BAAB [ROM+1AAB] E2 F0 03 4C 08 AF 20 BE FA 00 A0 0D .byte $E2, $F0, $03, $4C, $08, $AF, $20, $BE, $FA, $00, $A0, $0D ; ...L.. ..... BAB7 [ROM+1AB7] A9 05 20 5C FD 00 4C C1 E1 20 CA FD .byte $A9, $05, $20, $5C, $FD, $00, $4C, $C1, $E1, $20, $CA, $FD ; .. \..L.. .. BAC3 [ROM+1AC3] 00 20 68 F9 00 29 11 C9 11 F0 03 4C .byte $00, $20, $68, $F9, $00, $29, $11, $C9, $11, $F0, $03, $4C ; . h..).....L BACF [ROM+1ACF] 08 AF 20 81 FB 00 20 0F FD 00 90 01 .byte $08, $AF, $20, $81, $FB, $00, $20, $0F, $FD, $00, $90, $01 ; .. ... ..... BADB [ROM+1ADB] 60 A0 12 A9 04 AE 3F 03 F0 02 A9 06 .byte $60, $A0, $12, $A9, $04, $AE, $3F, $03, $F0, $02, $A9, $06 ; `.....?..... BAE7 [ROM+1AE7] 20 FE FB 00 20 F0 F8 00 AD 53 03 C9 .byte $20, $FE, $FB, $00, $20, $F0, $F8, $00, $AD, $53, $03, $C9 ; ... ....S.. BAF3 [ROM+1AF3] 32 B0 03 60 42 FD 00 AD 5E FB 00 85 .byte $32, $B0, $03, $60, $42, $FD, $00, $AD, $5E, $FB, $00, $85 ; 2..`B...^... BAFF [ROM+1AFF] 22 AD 5F FB 00 85 23 4C 47 A4 20 CA .byte $22, $AD, $5F, $FB, $00, $85, $23, $4C, $47, $A4, $20, $CA ; "._...#LG. . BB0B [ROM+1B0B] FD 00 29 F3 F0 03 4C 08 AF 20 50 FD .byte $FD, $00, $29, $F3, $F0, $03, $4C, $08, $AF, $20, $50, $FD ; ..)...L.. P. BB17 [ROM+1B17] 00 A5 B8 F0 03 4C C3 FF A5 BA A6 98 .byte $00, $A5, $B8, $F0, $03, $4C, $C3, $FF, $A5, $BA, $A6, $98 ; .....L...... BB23 [ROM+1B23] CA 30 0E DD 63 02 D0 F8 BD 59 02 20 .byte $CA, $30, $0E, $DD, $63, $02, $D0, $F8, $BD, $59, $02, $20 ; .0..c....Y. BB2F [ROM+1B2F] C3 FF B8 50 EB 60 A5 B8 20 14 F3 F0 .byte $C3, $FF, $B8, $50, $EB, $60, $A5, $B8, $20, $14, $F3, $F0 ; ...P.`.. ... BB3B [ROM+1B3B] 05 A2 03 4C 37 A4 20 1F F3 20 50 FD .byte $05, $A2, $03, $4C, $37, $A4, $20, $1F, $F3, $20, $50, $FD ; ...L7. .. P. BB47 [ROM+1B47] 00 A9 50 8D 53 03 A5 B9 8D 54 03 A5 .byte $00, $A9, $50, $8D, $53, $03, $A5, $B9, $8D, $54, $03, $A5 ; ..P.S....T.. BB53 [ROM+1B53] 14 8D 55 03 A5 15 8D 56 03 AD 3A 03 .byte $14, $8D, $55, $03, $A5, $15, $8D, $56, $03, $AD, $3A, $03 ; ..U....V..:. BB5F [ROM+1B5F] 8D 57 03 A2 05 20 AE FD 00 4C 01 FC .byte $8D, $57, $03, $A2, $05, $20, $AE, $FD, $00, $4C, $01, $FC ; .W... ...L.. BB6B [ROM+1B6B] 00 20 CA FD 00 20 7C F9 00 20 81 FB .byte $00, $20, $CA, $FD, $00, $20, $7C, $F9, $00, $20, $81, $FB ; . ... |.. .. BB77 [ROM+1B77] 00 A0 18 A2 01 AD 3E 03 29 10 F0 01 .byte $00, $A0, $18, $A2, $01, $AD, $3E, $03, $29, $10, $F0, $01 ; ......>.)... BB83 [ROM+1B83] E8 8A 4C FE FB 00 20 CA FD 00 29 30 .byte $E8, $8A, $4C, $FE, $FB, $00, $20, $CA, $FD, $00, $29, $30 ; ..L... ...)0 BB8F [ROM+1B8F] C9 30 F0 03 4C 08 AF AD 3E 03 29 C7 .byte $C9, $30, $F0, $03, $4C, $08, $AF, $AD, $3E, $03, $29, $C7 ; .0..L...>.). BB9B [ROM+1B9B] D0 F6 20 81 FB 00 A0 1A A9 04 20 5C .byte $D0, $F6, $20, $81, $FB, $00, $A0, $1A, $A9, $04, $20, $5C ; .. ....... \ BBA7 [ROM+1BA7] FD 00 A9 6F 85 B9 20 D5 F3 60 20 CA .byte $FD, $00, $A9, $6F, $85, $B9, $20, $D5, $F3, $60, $20, $CA ; ...o.. ..` . BBB3 [ROM+1BB3] FD 00 29 30 C9 30 D0 07 AD 3E 03 29 .byte $FD, $00, $29, $30, $C9, $30, $D0, $07, $AD, $3E, $03, $29 ; ..)0.0...>.) BBBF [ROM+1BBF] C7 F0 09 AD 3E 03 20 86 F9 00 AD 3E .byte $C7, $F0, $09, $AD, $3E, $03, $20, $86, $F9, $00, $AD, $3E ; ....>. ....> BBCB [ROM+1BCB] 03 A0 1E A9 08 4C FE FB 00 20 CA FD .byte $03, $A0, $1E, $A9, $08, $4C, $FE, $FB, $00, $20, $CA, $FD ; .....L... .. BBD7 [ROM+1BD7] 00 20 86 F9 00 A0 26 A9 0C 4C FE FB .byte $00, $20, $86, $F9, $00, $A0, $26, $A9, $0C, $4C, $FE, $FB ; . ....&..L.. BBE3 [ROM+1BE3] 00 A5 B7 8D 3A 03 A5 BB 85 FD A5 BC .byte $00, $A5, $B7, $8D, $3A, $03, $A5, $BB, $85, $FD, $A5, $BC ; ....:....... BBEF [ROM+1BEF] 85 FE 98 48 AC 3A 03 F0 10 A0 00 00 .byte $85, $FE, $98, $48, $AC, $3A, $03, $F0, $10, $A0, $00, $00 ; ...H.:...... BBFB [ROM+1BFB] B1 FD 9D 53 03 E8 C8 CC 3A 03 D0 F4 .byte $B1, $FD, $9D, $53, $03, $E8, $C8, $CC, $3A, $03, $D0, $F4 ; ...S....:... BC07 [ROM+1C07] F0 01 CA 68 A8 38 60 AD 3F 03 9D 53 .byte $F0, $01, $CA, $68, $A8, $38, $60, $AD, $3F, $03, $9D, $53 ; ...h.8`.?..S BC13 [ROM+1C13] 03 E8 AD 40 03 9D 53 03 E8 8A 60 20 .byte $03, $E8, $AD, $40, $03, $9D, $53, $03, $E8, $8A, $60, $20 ; ...@..S...` BC1F [ROM+1C1F] CA FD 00 20 6F F9 00 29 66 F0 03 4C .byte $CA, $FD, $00, $20, $6F, $F9, $00, $29, $66, $F0, $03, $4C ; ... o..)f..L BC2B [ROM+1C2B] 08 AF A0 06 AD 3E 03 29 80 F0 0F A9 .byte $08, $AF, $A0, $06, $AD, $3E, $03, $29, $80, $F0, $0F, $A9 ; .....>.).... BC37 [ROM+1C37] 40 8D 53 03 A2 01 A9 03 20 5E FD 00 .byte $40, $8D, $53, $03, $A2, $01, $A9, $03, $20, $5E, $FD, $00 ; @.S..... ^.. BC43 [ROM+1C43] 4C 59 E1 A9 03 20 5C FD 00 4C 59 E1 .byte $4C, $59, $E1, $A9, $03, $20, $5C, $FD, $00, $4C, $59, $E1 ; LY... \..LY. BC4F [ROM+1C4F] 20 CA FD 00 20 6F F9 00 29 E6 F0 03 .byte $20, $CA, $FD, $00, $20, $6F, $F9, $00, $29, $E6, $F0, $03 ; ... o..)... BC5B [ROM+1C5B] 4C 08 AF A0 06 A2 03 AD 3E 03 29 10 .byte $4C, $08, $AF, $A0, $06, $A2, $03, $AD, $3E, $03, $29, $10 ; L.......>.). BC67 [ROM+1C67] D0 04 C8 C8 CA CA 8A 20 5C FD 00 A9 .byte $D0, $04, $C8, $C8, $CA, $CA, $8A, $20, $5C, $FD, $00, $A9 ; ....... \... BC73 [ROM+1C73] 00 00 85 93 85 0A 85 B9 4C 6F E1 20 .byte $00, $00, $85, $93, $85, $0A, $85, $B9, $4C, $6F, $E1, $20 ; ........Lo. BC7F [ROM+1C7F] CA FD 00 20 8D F9 00 29 E4 D0 D5 A0 .byte $CA, $FD, $00, $20, $8D, $F9, $00, $29, $E4, $D0, $D5, $A0 ; ... ...).... BC8B [ROM+1C8B] 32 A9 08 4C FE FB 00 20 CA FD 00 20 .byte $32, $A9, $08, $4C, $FE, $FB, $00, $20, $CA, $FD, $00, $20 ; 2..L... ... BC97 [ROM+1C97] 68 F9 00 20 0F FD 00 B0 26 A0 3A A9 .byte $68, $F9, $00, $20, $0F, $FD, $00, $B0, $26, $A0, $3A, $A9 ; h.. ....&.:. BCA3 [ROM+1CA3] 04 20 FE FB 00 20 0A FD 00 D0 1A 20 .byte $04, $20, $FE, $FB, $00, $20, $0A, $FD, $00, $D0, $1A, $20 ; . ... ..... BCAF [ROM+1CAF] F0 F8 00 A9 0D 20 16 E7 A0 00 00 B9 .byte $F0, $F8, $00, $A9, $0D, $20, $16, $E7, $A0, $00, $00, $B9 ; ..... ...... BCBB [ROM+1CBB] 53 03 F0 06 20 16 E7 C8 D0 F5 A9 0D .byte $53, $03, $F0, $06, $20, $16, $E7, $C8, $D0, $F5, $A9, $0D ; S... ....... BCC7 [ROM+1CC7] 20 16 E7 60 A5 7B C9 02 60 20 0A FD .byte $20, $16, $E7, $60, $A5, $7B, $C9, $02, $60, $20, $0A, $FD ; ..`.{..` .. BCD3 [ROM+1CD3] 00 D0 1E A0 00 00 B9 34 FD 00 20 16 .byte $00, $D0, $1E, $A0, $00, $00, $B9, $34, $FD, $00, $20, $16 ; .......4.. . BCDF [ROM+1CDF] E7 C8 C0 0E D0 F5 20 57 F1 48 20 57 .byte $E7, $C8, $C0, $0E, $D0, $F5, $20, $57, $F1, $48, $20, $57 ; ...... W.H W BCEB [ROM+1CEB] F1 C9 0D D0 F9 68 C9 59 38 D0 01 18 .byte $F1, $C9, $0D, $D0, $F9, $68, $C9, $59, $38, $D0, $01, $18 ; .....h.Y8... BCF7 [ROM+1CF7] 60 0D 41 52 45 20 59 4F 55 20 53 55 .byte $60, $0D, $41, $52, $45, $20, $59, $4F, $55, $20, $53, $55 ; `.ARE YOU SU BD03 [ROM+1D03] 52 45 3F 42 41 44 20 44 49 53 CB 20 .byte $52, $45, $3F, $42, $41, $44, $20, $44, $49, $53, $CB, $20 ; RE?BAD DIS. BD0F [ROM+1D0F] 0A FD 00 4C 32 FD 00 98 48 A9 00 00 .byte $0A, $FD, $00, $4C, $32, $FD, $00, $98, $48, $A9, $00, $00 ; ...L2...H... BD1B [ROM+1D1B] 85 90 8D 34 03 68 A8 60 A2 00 00 8D .byte $85, $90, $8D, $34, $03, $68, $A8, $60, $A2, $00, $00, $8D ; ...4.h.`.... BD27 [ROM+1D27] 41 03 20 50 FD 00 CE 41 03 30 45 C8 .byte $41, $03, $20, $50, $FD, $00, $CE, $41, $03, $30, $45, $C8 ; A. P...A.0E. BD33 [ROM+1D33] B9 A0 F9 00 10 39 C9 F1 D0 03 20 36 .byte $B9, $A0, $F9, $00, $10, $39, $C9, $F1, $D0, $03, $20, $36 ; .....9.... 6 BD3F [ROM+1D3F] FC 00 C9 F2 D0 03 20 43 FC 00 C9 E0 .byte $FC, $00, $C9, $F2, $D0, $03, $20, $43, $FC, $00, $C9, $E0 ; ...... C.... BD4B [ROM+1D4B] D0 05 AD 3D 03 D0 22 C9 D0 D0 03 20 .byte $D0, $05, $AD, $3D, $03, $D0, $22, $C9, $D0, $D0, $03, $20 ; ...=..".... BD57 [ROM+1D57] 5F FC 00 C9 E1 D0 05 20 B9 FD 00 D0 .byte $5F, $FC, $00, $C9, $E1, $D0, $05, $20, $B9, $FD, $00, $D0 ; _...... .... BD63 [ROM+1D63] 12 C9 D1 D0 05 AD 3B 03 10 07 C9 D2 .byte $12, $C9, $D1, $D0, $05, $AD, $3B, $03, $10, $07, $C9, $D2 ; ......;..... BD6F [ROM+1D6F] D0 C1 AD 3C 03 09 30 9D 53 03 E8 D0 .byte $D0, $C1, $AD, $3C, $03, $09, $30, $9D, $53, $03, $E8, $D0 ; ...<..0.S... BD7B [ROM+1D7B] B6 86 B7 A9 53 85 BB A9 03 85 BC 60 .byte $B6, $86, $B7, $A9, $53, $85, $BB, $A9, $03, $85, $BC, $60 ; ....S......` BD87 [ROM+1D87] AD 3D 03 F0 04 A9 4C D0 07 A9 53 8D .byte $AD, $3D, $03, $F0, $04, $A9, $4C, $D0, $07, $A9, $53, $8D ; .=....L...S. BD93 [ROM+1D93] 3D 03 A9 57 60 A2 00 00 8E 3E 03 86 .byte $3D, $03, $A9, $57, $60, $A2, $00, $00, $8E, $3E, $03, $86 ; =..W`....>.. BD9F [ROM+1D9F] B8 8E 3D 03 8E 3B 03 8E 3C 03 86 B7 .byte $B8, $8E, $3D, $03, $8E, $3B, $03, $8E, $3C, $03, $86, $B7 ; ..=..;..<... BDAB [ROM+1DAB] 8E 3A 03 8E 3F 03 A2 08 86 BA 20 79 .byte $8E, $3A, $03, $8E, $3F, $03, $A2, $08, $86, $BA, $20, $79 ; .:..?..... y BDB7 [ROM+1DB7] 00 00 F0 7A C9 23 F0 30 C9 57 F0 47 .byte $00, $00, $F0, $7A, $C9, $23, $F0, $30, $C9, $57, $F0, $47 ; ...z.#.0.W.G BDC3 [ROM+1DC3] C9 4C F0 43 C9 52 D0 06 20 73 00 00 .byte $C9, $4C, $F0, $43, $C9, $52, $D0, $06, $20, $73, $00, $00 ; .L.C.R.. s.. BDCF [ROM+1DCF] 4C F8 FE 00 C9 44 F0 72 C9 91 F0 62 .byte $4C, $F8, $FE, $00, $C9, $44, $F0, $72, $C9, $91, $F0, $62 ; L....D.r...b BDDB [ROM+1DDB] C9 55 F0 64 C9 49 D0 03 4C 99 FE 00 .byte $C9, $55, $F0, $64, $C9, $49, $D0, $03, $4C, $99, $FE, $00 ; .U.d.I..L... BDE7 [ROM+1DE7] C9 22 F0 50 C9 28 F0 4C 4C 08 AF AD .byte $C9, $22, $F0, $50, $C9, $28, $F0, $4C, $4C, $08, $AF, $AD ; .".P.(.LL... BDF3 [ROM+1DF3] 3E 03 29 04 D0 F6 20 E9 FF 00 E0 00 .byte $3E, $03, $29, $04, $D0, $F6, $20, $E9, $FF, $00, $E0, $00 ; >.)... ..... BDFF [ROM+1DFF] 00 F0 69 86 B8 AD 3E 03 09 04 8D 3E .byte $00, $F0, $69, $86, $B8, $AD, $3E, $03, $09, $04, $8D, $3E ; ..i...>....> BE0B [ROM+1E0B] 03 4C F8 FE 00 AA AD 3E 03 29 40 D0 .byte $03, $4C, $F8, $FE, $00, $AA, $AD, $3E, $03, $29, $40, $D0 ; .L.....>.)@. BE17 [ROM+1E17] DA E0 57 D0 06 20 73 00 00 4C 5A FE .byte $DA, $E0, $57, $D0, $06, $20, $73, $00, $00, $4C, $5A, $FE ; ..W.. s..LZ. BE23 [ROM+1E23] 00 20 E9 FF 00 E0 00 00 F0 43 E0 FF .byte $00, $20, $E9, $FF, $00, $E0, $00, $00, $F0, $43, $E0, $FF ; . .......C.. BE2F [ROM+1E2F] F0 3F 8E 3D 03 AD 3E 03 09 40 8D 3E .byte $F0, $3F, $8E, $3D, $03, $AD, $3E, $03, $09, $40, $8D, $3E ; .?.=..>..@.> BE3B [ROM+1E3B] 03 4C F8 FE 00 4C 85 FF 00 4C C2 FE .byte $03, $4C, $F8, $FE, $00, $4C, $85, $FF, $00, $4C, $C2, $FE ; .L...L...L.. BE47 [ROM+1E47] 00 20 8E FF 00 4C F8 FE 00 20 95 FF .byte $00, $20, $8E, $FF, $00, $4C, $F8, $FE, $00, $20, $95, $FF ; . ...L... .. BE53 [ROM+1E53] 00 4C F8 FE 00 AD 3E 03 29 10 D0 9E .byte $00, $4C, $F8, $FE, $00, $AD, $3E, $03, $29, $10, $D0, $9E ; .L....>.)... BE5F [ROM+1E5F] 20 E9 FF 00 E0 02 B0 11 8E 3B 03 8E .byte $20, $E9, $FF, $00, $E0, $02, $B0, $11, $8E, $3B, $03, $8E ; ........;.. BE6B [ROM+1E6B] 3C 03 AD 3E 03 09 10 8D 3E 03 4C F8 .byte $3C, $03, $AD, $3E, $03, $09, $10, $8D, $3E, $03, $4C, $F8 ; <..>....>.L. BE77 [ROM+1E77] FE 00 4C 89 FF 00 AD 3D 03 29 FF F0 .byte $FE, $00, $4C, $89, $FF, $00, $AD, $3D, $03, $29, $FF, $F0 ; ..L....=.).. BE83 [ROM+1E83] 03 4C 08 AF A0 00 00 A2 00 00 E6 7A .byte $03, $4C, $08, $AF, $A0, $00, $00, $A2, $00, $00, $E6, $7A ; .L.........z BE8F [ROM+1E8F] D0 02 E6 7B B1 7A 9D 3F 03 E8 E0 02 .byte $D0, $02, $E6, $7B, $B1, $7A, $9D, $3F, $03, $E8, $E0, $02 ; ...{.z.?.... BE9B [ROM+1E9B] 90 F0 A9 FF 8D 3D 03 20 73 00 00 4C .byte $90, $F0, $A9, $FF, $8D, $3D, $03, $20, $73, $00, $00, $4C ; .....=. s..L BEA7 [ROM+1EA7] F8 FE 00 AD 3E 03 29 01 20 AB FF 00 .byte $F8, $FE, $00, $AD, $3E, $03, $29, $01, $20, $AB, $FF, $00 ; ....>.). ... BEB3 [ROM+1EB3] 85 B7 8D 41 03 A9 42 85 BB A9 03 85 .byte $85, $B7, $8D, $41, $03, $A9, $42, $85, $BB, $A9, $03, $85 ; ...A..B..... BEBF [ROM+1EBF] BC A0 00 00 B1 22 C0 00 00 D0 08 C9 .byte $BC, $A0, $00, $00, $B1, $22, $C0, $00, $00, $D0, $08, $C9 ; ....."...... BECB [ROM+1ECB] 40 D0 04 E6 BB C6 B7 99 42 03 C8 CC .byte $40, $D0, $04, $E6, $BB, $C6, $B7, $99, $42, $03, $C8, $CC ; @.......B... BED7 [ROM+1ED7] 41 03 90 E9 AD 3E 03 09 01 8D 3E 03 .byte $41, $03, $90, $E9, $AD, $3E, $03, $09, $01, $8D, $3E, $03 ; A....>....>. BEE3 [ROM+1EE3] 20 79 00 00 D0 03 4C 65 FE 00 C9 2C .byte $20, $79, $00, $00, $D0, $03, $4C, $65, $FE, $00, $C9, $2C ; y....Le..., BEEF [ROM+1EEF] D0 06 20 73 00 00 4C EB FD 00 C9 91 .byte $D0, $06, $20, $73, $00, $00, $4C, $EB, $FD, $00, $C9, $91 ; .. s..L..... BEFB [ROM+1EFB] D0 03 4C 6B FE 00 C9 A4 F0 03 4C 08 .byte $D0, $03, $4C, $6B, $FE, $00, $C9, $A4, $F0, $03, $4C, $08 ; ..Lk......L. BF07 [ROM+1F07] AF 20 73 00 00 C9 44 F0 13 C9 91 F0 .byte $AF, $20, $73, $00, $00, $C9, $44, $F0, $13, $C9, $91, $F0 ; . s...D..... BF13 [ROM+1F13] 2B C9 55 F0 2D C9 22 F0 2F C9 28 F0 .byte $2B, $C9, $55, $F0, $2D, $C9, $22, $F0, $2F, $C9, $28, $F0 ; +.U.-."./.(. BF1F [ROM+1F1F] 2B 4C 08 AF AD 3E 03 29 20 D0 F6 20 .byte $2B, $4C, $08, $AF, $AD, $3E, $03, $29, $20, $D0, $F6, $20 ; +L...>.) .. BF2B [ROM+1F2B] E9 FF 00 E0 02 B0 49 8E 3C 03 AD 3E .byte $E9, $FF, $00, $E0, $02, $B0, $49, $8E, $3C, $03, $AD, $3E ; ......I.<..> BF37 [ROM+1F37] 03 09 20 8D 3E 03 4C 71 FF 00 20 8E .byte $03, $09, $20, $8D, $3E, $03, $4C, $71, $FF, $00, $20, $8E ; .. .>.Lq.. . BF43 [ROM+1F43] FF 00 4C 71 FF 00 20 95 FF 00 4C 71 .byte $FF, $00, $4C, $71, $FF, $00, $20, $95, $FF, $00, $4C, $71 ; ..Lq.. ...Lq BF4F [ROM+1F4F] FF 00 AD 3E 03 29 02 20 AB FF 00 8D .byte $FF, $00, $AD, $3E, $03, $29, $02, $20, $AB, $FF, $00, $8D ; ...>.). .... BF5B [ROM+1F5B] 3A 03 86 FD 84 FE AD 3E 03 09 02 8D .byte $3A, $03, $86, $FD, $84, $FE, $AD, $3E, $03, $09, $02, $8D ; :......>.... BF67 [ROM+1F67] 3E 03 20 79 00 00 F0 0F C9 2C F0 9E .byte $3E, $03, $20, $79, $00, $00, $F0, $0F, $C9, $2C, $F0, $9E ; >. y.....,.. BF73 [ROM+1F73] C9 91 F0 D0 C9 55 F0 D2 4C 08 AF AD .byte $C9, $91, $F0, $D0, $C9, $55, $F0, $D2, $4C, $08, $AF, $AD ; .....U..L... BF7F [ROM+1F7F] 3E 03 60 A2 0E 4C 37 A4 20 73 00 00 .byte $3E, $03, $60, $A2, $0E, $4C, $37, $A4, $20, $73, $00, $00 ; >.`..L7. s.. BF8B [ROM+1F8B] C9 55 D0 ED 20 E9 FF 00 E0 20 B0 ED .byte $C9, $55, $D0, $ED, $20, $E9, $FF, $00, $E0, $20, $B0, $ED ; .U.. .... .. BF97 [ROM+1F97] E0 04 90 E9 86 BA AD 3E 03 09 08 8D .byte $E0, $04, $90, $E9, $86, $BA, $AD, $3E, $03, $09, $08, $8D ; .......>.... BFA3 [ROM+1FA3] 3E 03 60 D0 D5 20 9E AD 20 A3 B6 AA .byte $3E, $03, $60, $D0, $D5, $20, $9E, $AD, $20, $A3, $B6, $AA ; >.`.. .. ... BFAF [ROM+1FAF] C9 00 00 F0 D1 C9 12 B0 1A A0 00 00 .byte $C9, $00, $00, $F0, $D1, $C9, $12, $B0, $1A, $A0, $00, $00 ; ............ BFBB [ROM+1FBB] B1 22 C9 40 D0 0A AD 3E 03 29 80 F0 .byte $B1, $22, $C9, $40, $D0, $0A, $AD, $3E, $03, $29, $80, $F0 ; .".@...>.).. BFC7 [ROM+1FC7] 10 4C 08 AF 8A C9 11 B0 03 4C E4 FF .byte $10, $4C, $08, $AF, $8A, $C9, $11, $B0, $03, $4C, $E4, $FF ; .L.......L.. BFD3 [ROM+1FD3] 00 A2 17 4C 37 A4 AD 3E 03 09 80 8D .byte $00, $A2, $17, $4C, $37, $A4, $AD, $3E, $03, $09, $80, $8D ; ...L7..>.... BFDF [ROM+1FDF] 3E 03 8A A6 22 A4 23 60 20 73 00 00 .byte $3E, $03, $8A, $A6, $22, $A4, $23, $60, $20, $73, $00, $00 ; >...".#` s.. BFEB [ROM+1FEB] D0 03 4C 08 AF 90 09 20 FA AE 20 9E .byte $D0, $03, $4C, $08, $AF, $90, $09, $20, $FA, $AE, $20, $9E ; ..L.... .. . BFF7 [ROM+1FF7] B7 4C F7 AE 4C 9E B7 00 00 .byte $B7, $4C, $F7, $AE, $4C, $9E, $B7, $00, $00 ; .L..L.... DERIVED BASIC 4.0 RUNTIME IMAGE FOR A STOCK C64 (MEMSIZ=$A000) ============================================================================== ; This section is reconstructed by applying the ROM's own relocation encoding to ; $B47B-$BFFF with original MEMSIZ=$A000. It is NOT an extra set of bytes in ; the EPROM. The resulting block occupies $955B-$9FFF and is 2725 bytes long. ; Absolute references embedded in the encoded stream have been relocated by ; adding $A000, exactly as the installer at $B03C does. ; -------------------------------------------------------------------------- ; DERIVED RUNTIME IMAGE (normal stock-C64 MEMSIZ=$A000). These four JMPs are the ; new handlers installed into the BASIC indirect vectors ICRNCH/IQPLOP/IGONE/IEVAL. ; -------------------------------------------------------------------------- BASIC4_CRUNCH_VECTOR: 955B [DERIVED] 4C 71 95 JMP BASIC4_TOKENIZER_HOOK ; hook ICRNCH -> tokenizer extension; call/jump to basic4 tokenizer hook BASIC4_LIST_VECTOR: 955E [DERIVED] 4C F7 95 JMP BASIC4_LIST_HOOK ; hook IQPLOP -> LIST detokenizer extension; call/jump to basic4 list hook BASIC4_GONE_VECTOR: 9561 [DERIVED] 4C 15 97 JMP BASIC4_STATEMENT_HOOK ; hook IGONE -> statement dispatcher; call/jump to basic4 statement hook BASIC4_EVAL_VECTOR: 9564 [DERIVED] 4C CF 97 JMP BASIC4_EVAL_HOOK ; hook IEVAL -> expression hook; call/jump to basic4 eval hook ; -------------------------------------------------------------------------- ; NUL-terminated runtime signature "BASIC 4.0". The uninstaller checks this at ; offset +12 from the relocated base before restoring MEMSIZ. ; -------------------------------------------------------------------------- BASIC4_RUNTIME_SIGNATURE: 9567 [DERIVED] 42 41 53 49 43 20 34 2E 30 00 .byte $42, $41, $53, $49, $43, $20, $34, $2E, $30, $00 ; "BASIC 4.0",0 ; -------------------------------------------------------------------------- ; Tokenizer hook. It scans the BASIC input buffer outside quoted strings, recognizes ; the 15 additional disk keywords, emits extension tokens beginning at $CC, and ; otherwise continues into the stock C64 tokenizer. ; -------------------------------------------------------------------------- BASIC4_TOKENIZER_HOOK: 9571 [DERIVED] A6 7A LDX $7A 9573 [DERIVED] A4 7A LDY $7A L_9575: 9575 [DERIVED] BD 00 02 LDA $0200,X 9578 [DERIVED] 99 00 02 STA $0200,Y 957B [DERIVED] F0 55 BEQ L_95D2 957D [DERIVED] C9 22 CMP #$22 957F [DERIVED] D0 12 BNE L_9593 L_9581: 9581 [DERIVED] E8 INX 9582 [DERIVED] C8 INY 9583 [DERIVED] BD 00 02 LDA $0200,X 9586 [DERIVED] 99 00 02 STA $0200,Y 9589 [DERIVED] F0 47 BEQ L_95D2 958B [DERIVED] C9 22 CMP #$22 958D [DERIVED] D0 F2 BNE L_9581 958F [DERIVED] E8 INX 9590 [DERIVED] C8 INY 9591 [DERIVED] D0 E2 BNE L_9575 L_9593: 9593 [DERIVED] C9 41 CMP #$41 9595 [DERIVED] 90 24 BCC L_95BB 9597 [DERIVED] C9 5B CMP #$5B 9599 [DERIVED] B0 20 BCS L_95BB 959B [DERIVED] 84 71 STY $71 959D [DERIVED] 86 97 STX $97 959F [DERIVED] A0 01 LDY #$01 95A1 [DERIVED] 84 0B STY $0B 95A3 [DERIVED] CA DEX 95A4 [DERIVED] A0 FF LDY #$FF L_95A6: 95A6 [DERIVED] E8 INX 95A7 [DERIVED] C8 INY L_95A8: 95A8 [DERIVED] BD 00 02 LDA $0200,X 95AB [DERIVED] 38 SEC 95AC [DERIVED] F9 2B 96 SBC BASIC4_KEYWORD_TABLE,Y 95AF [DERIVED] F0 F5 BEQ L_95A6 95B1 [DERIVED] 0A ASL A 95B2 [DERIVED] D0 0B BNE L_95BF 95B4 [DERIVED] A4 71 LDY $71 95B6 [DERIVED] A5 0B LDA $0B 95B8 [DERIVED] 99 00 02 STA $0200,Y L_95BB: 95BB [DERIVED] E8 INX 95BC [DERIVED] C8 INY 95BD [DERIVED] D0 B6 BNE L_9575 L_95BF: 95BF [DERIVED] A6 97 LDX $97 95C1 [DERIVED] E6 0B INC $0B L_95C3: 95C3 [DERIVED] C8 INY 95C4 [DERIVED] B9 2A 96 LDA $962A,Y 95C7 [DERIVED] 10 FA BPL L_95C3 95C9 [DERIVED] B9 2B 96 LDA BASIC4_KEYWORD_TABLE,Y 95CC [DERIVED] D0 DA BNE L_95A8 95CE [DERIVED] A4 71 LDY $71 95D0 [DERIVED] 10 E9 BPL L_95BB L_95D2: 95D2 [DERIVED] 20 7C A5 JSR C64_BASIC_CRUNCH ; stock C64 BASIC tokenizer 95D5 [DERIVED] A2 00 LDX #$00 L_95D7: 95D7 [DERIVED] BD 00 02 LDA $0200,X 95DA [DERIVED] F0 1A BEQ L_95F6 95DC [DERIVED] E8 INX 95DD [DERIVED] C9 22 CMP #$22 95DF [DERIVED] D0 0A BNE L_95EB L_95E1: 95E1 [DERIVED] BD 00 02 LDA $0200,X 95E4 [DERIVED] F0 10 BEQ L_95F6 95E6 [DERIVED] E8 INX 95E7 [DERIVED] C9 22 CMP #$22 95E9 [DERIVED] D0 F6 BNE L_95E1 L_95EB: 95EB [DERIVED] C9 20 CMP #$20 95ED [DERIVED] B0 E8 BCS L_95D7 95EF [DERIVED] 69 CB ADC #$CB 95F1 [DERIVED] 9D FF 01 STA $01FF,X 95F4 [DERIVED] D0 E1 BNE L_95D7 L_95F6: 95F6 [DERIVED] 60 RTS ; return ; -------------------------------------------------------------------------- ; LIST/detokenizer hook. Extension tokens are translated back through the keyword ; table; ordinary tokens continue into the stock C64 BASIC LIST machinery. ; -------------------------------------------------------------------------- BASIC4_LIST_HOOK: 95F7 [DERIVED] 10 2C BPL L_9625 95F9 [DERIVED] C9 FF CMP #$FF 95FB [DERIVED] F0 28 BEQ L_9625 95FD [DERIVED] 24 0F BIT $0F 95FF [DERIVED] 30 24 BMI L_9625 9601 [DERIVED] C9 CC CMP #$CC 9603 [DERIVED] 90 23 BCC L_9628 9605 [DERIVED] E9 CB SBC #$CB 9607 [DERIVED] AA TAX 9608 [DERIVED] 84 49 STY $49 960A [DERIVED] A0 FF LDY #$FF L_960C: 960C [DERIVED] CA DEX 960D [DERIVED] F0 08 BEQ L_9617 L_960F: 960F [DERIVED] C8 INY 9610 [DERIVED] B9 2B 96 LDA BASIC4_KEYWORD_TABLE,Y 9613 [DERIVED] 10 FA BPL L_960F 9615 [DERIVED] 30 F5 BMI L_960C L_9617: 9617 [DERIVED] C8 INY 9618 [DERIVED] B9 2B 96 LDA BASIC4_KEYWORD_TABLE,Y 961B [DERIVED] 30 05 BMI L_9622 961D [DERIVED] 20 47 AB JSR $AB47 9620 [DERIVED] D0 F5 BNE L_9617 L_9622: 9622 [DERIVED] 4C EF A6 JMP C64_BASIC_LIST_CONT ; stock C64 BASIC LIST continuation L_9625: 9625 [DERIVED] 4C F3 A6 JMP C64_BASIC_LIST_CONT2 ; stock C64 BASIC LIST continuation L_9628: 9628 [DERIVED] 4C 24 A7 JMP C64_BASIC_LIST_TOKEN ; stock C64 BASIC LIST token output path ; -------------------------------------------------------------------------- ; DATA: extended BASIC disk-command keyword table. The high bit marks the final ; character of each keyword, Commodore-style. A final $00 terminates the table. ; -------------------------------------------------------------------------- BASIC4_KEYWORD_TABLE: 962B [DERIVED] 43 4F 4E 43 41 D4 .byte $43, $4F, $4E, $43, $41, $D4 ; CONCAT (high bit marks last character) 9631 [DERIVED] 44 4F 50 45 CE .byte $44, $4F, $50, $45, $CE ; DOPEN (high bit marks last character) 9636 [DERIVED] 44 43 4C 4F 53 C5 .byte $44, $43, $4C, $4F, $53, $C5 ; DCLOSE (high bit marks last character) 963C [DERIVED] 52 45 43 4F 52 C4 .byte $52, $45, $43, $4F, $52, $C4 ; RECORD (high bit marks last character) 9642 [DERIVED] 48 45 41 44 45 D2 .byte $48, $45, $41, $44, $45, $D2 ; HEADER (high bit marks last character) 9648 [DERIVED] 43 4F 4C 4C 45 43 D4 .byte $43, $4F, $4C, $4C, $45, $43, $D4 ; COLLECT (high bit marks last character) 964F [DERIVED] 42 41 43 4B 55 D0 .byte $42, $41, $43, $4B, $55, $D0 ; BACKUP (high bit marks last character) 9655 [DERIVED] 43 4F 50 D9 .byte $43, $4F, $50, $D9 ; COPY (high bit marks last character) 9659 [DERIVED] 41 50 50 45 4E C4 .byte $41, $50, $50, $45, $4E, $C4 ; APPEND (high bit marks last character) 965F [DERIVED] 44 53 41 56 C5 .byte $44, $53, $41, $56, $C5 ; DSAVE (high bit marks last character) 9664 [DERIVED] 44 4C 4F 41 C4 .byte $44, $4C, $4F, $41, $C4 ; DLOAD (high bit marks last character) 9669 [DERIVED] 43 41 54 41 4C 4F C7 .byte $43, $41, $54, $41, $4C, $4F, $C7 ; CATALOG (high bit marks last character) 9670 [DERIVED] 52 45 4E 41 4D C5 .byte $52, $45, $4E, $41, $4D, $C5 ; RENAME (high bit marks last character) 9676 [DERIVED] 53 43 52 41 54 43 C8 .byte $53, $43, $52, $41, $54, $43, $C8 ; SCRATCH (high bit marks last character) 967D [DERIVED] 44 49 52 45 43 54 4F 52 D9 .byte $44, $49, $52, $45, $43, $54, $4F, $52, $D9 ; DIRECTORY (high bit marks last character) 9686 [DERIVED] 00 .byte $00 ; end of keyword table ; -------------------------------------------------------------------------- ; DATA: one little-endian (handler-1) word per keyword, used with RTS-style dispatch. ; -------------------------------------------------------------------------- BASIC4_HANDLER_TABLE_MINUS1: 9687 [DERIVED] 28 9C .word $9C28 ; CONCAT -> BASIC4_CMD_CONCAT (stored handler-1) 9689 [DERIVED] D0 9A .word $9AD0 ; DOPEN -> BASIC4_CMD_DOPEN (stored handler-1) 968B [DERIVED] 6C 9B .word $9B6C ; DCLOSE -> BASIC4_CMD_DCLOSE (stored handler-1) 968D [DERIVED] 12 99 .word $9912 ; RECORD -> BASIC4_CMD_RECORD (stored handler-1) 968F [DERIVED] 2C 9B .word $9B2C ; HEADER -> BASIC4_CMD_HEADER (stored handler-1) 9691 [DERIVED] CA 9B .word $9BCA ; COLLECT -> BASIC4_CMD_COLLECT (stored handler-1) 9693 [DERIVED] E3 9B .word $9BE3 ; BACKUP -> BASIC4_CMD_BACKUP (stored handler-1) 9695 [DERIVED] 08 9C .word $9C08 ; COPY -> BASIC4_CMD_COPY (stored handler-1) 9697 [DERIVED] 12 9B .word $9B12 ; APPEND -> BASIC4_CMD_APPEND (stored handler-1) 9699 [DERIVED] 6E 9C .word $9C6E ; DSAVE -> BASIC4_CMD_DSAVE (stored handler-1) 969B [DERIVED] 9B 9C .word $9C9B ; DLOAD -> BASIC4_CMD_DLOAD (stored handler-1) 969D [DERIVED] DE 99 .word $99DE ; CATALOG -> BASIC4_CMD_CATALOG_DIRECTORY (stored handler-1) 969F [DERIVED] C6 9C .word $9CC6 ; RENAME -> BASIC4_CMD_RENAME (stored handler-1) 96A1 [DERIVED] D7 9C .word $9CD7 ; SCRATCH -> BASIC4_CMD_SCRATCH (stored handler-1) 96A3 [DERIVED] DE 99 .word $99DE ; DIRECTORY -> BASIC4_CMD_CATALOG_DIRECTORY (stored handler-1) ; -------------------------------------------------------------------------- ; Common extension command-dispatch machinery. ; -------------------------------------------------------------------------- BASIC4_STATEMENT_DISPATCH: 96A5 [DERIVED] 20 AB 96 JSR L_96AB 96A8 [DERIVED] 4C B5 AB JMP $ABB5 L_96AB: 96AB [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 96AE [DERIVED] 20 9E B7 JSR C64_BASIC_GETBYT ; convert BASIC numeric argument to byte 96B1 [DERIVED] F0 05 BEQ L_96B8 96B3 [DERIVED] A9 2C LDA #$2C 96B5 [DERIVED] 20 FF AE JSR $AEFF L_96B8: 96B8 [DERIVED] 08 PHP 96B9 [DERIVED] 86 13 STX $13 96BB [DERIVED] 20 18 E1 JSR $E118 96BE [DERIVED] 20 ED 96 JSR L_96ED 96C1 [DERIVED] 4C 96 AA JMP $AA96 L_96C4: 96C4 [DERIVED] 20 DA 96 JSR L_96DA 96C7 [DERIVED] 4C B2 AB JMP $ABB2 L_96CA: 96CA [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 96CD [DERIVED] 20 A6 B3 JSR $B3A6 96D0 [DERIVED] C9 23 CMP #$23 96D2 [DERIVED] D0 03 BNE L_96D7 96D4 [DERIVED] 20 DA 96 JSR L_96DA L_96D7: 96D7 [DERIVED] 4C 92 AB JMP $AB92 L_96DA: 96DA [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 96DD [DERIVED] 20 9E B7 JSR C64_BASIC_GETBYT ; convert BASIC numeric argument to byte 96E0 [DERIVED] A9 2C LDA #$2C 96E2 [DERIVED] 20 FF AE JSR $AEFF 96E5 [DERIVED] 86 13 STX $13 96E7 [DERIVED] 20 1E E1 JSR $E11E 96EA [DERIVED] 4C ED 96 JMP L_96ED L_96ED: 96ED [DERIVED] A5 BA LDA FA ; current device number 96EF [DERIVED] C9 04 CMP #$04 96F1 [DERIVED] 90 03 BCC L_96F6 96F3 [DERIVED] 20 50 9D JSR BASIC4_CLOSE_HELPER ; call/jump to basic4 close helper L_96F6: 96F6 [DERIVED] 60 RTS ; return L_96F7: 96F7 [DERIVED] 20 A5 96 JSR BASIC4_STATEMENT_DISPATCH ; call/jump to basic4 statement dispatch 96FA [DERIVED] 4C AE A7 JMP $A7AE L_96FD: 96FD [DERIVED] 20 AB 96 JSR L_96AB 9700 [DERIVED] 4C AE A7 JMP $A7AE L_9703: 9703 [DERIVED] 20 C4 96 JSR L_96C4 9706 [DERIVED] 4C AE A7 JMP $A7AE L_9709: 9709 [DERIVED] 20 CA 96 JSR L_96CA 970C [DERIVED] 4C AE A7 JMP $A7AE L_970F: 970F [DERIVED] 20 50 9D JSR BASIC4_CLOSE_HELPER ; call/jump to basic4 close helper 9712 [DERIVED] 4C 59 97 JMP L_9759 ; -------------------------------------------------------------------------- ; Statement-execution hook corresponding to BASIC vector IGONE. Recognizes the ; BusCard extension token range and dispatches the disk commands; otherwise falls ; back to normal C64 BASIC statement execution. ; -------------------------------------------------------------------------- BASIC4_STATEMENT_HOOK: 9715 [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 9718 [DERIVED] 2C 68 68 BIT $6868 971B [DERIVED] 20 79 00 JSR CHRGOT ; BASIC CHRGOT routine 971E [DERIVED] F0 39 BEQ L_9759 9720 [DERIVED] C9 98 CMP #$98 9722 [DERIVED] F0 D3 BEQ L_96F7 9724 [DERIVED] C9 84 CMP #$84 9726 [DERIVED] F0 DB BEQ L_9703 9728 [DERIVED] C9 A1 CMP #$A1 972A [DERIVED] F0 DD BEQ L_9709 972C [DERIVED] C9 9D CMP #$9D 972E [DERIVED] F0 CD BEQ L_96FD 9730 [DERIVED] C9 9C CMP #$9C 9732 [DERIVED] F0 DB BEQ L_970F 9734 [DERIVED] C9 A2 CMP #$A2 9736 [DERIVED] F0 D7 BEQ L_970F 9738 [DERIVED] C9 8A CMP #$8A 973A [DERIVED] F0 D3 BEQ L_970F 973C [DERIVED] C9 93 CMP #$93 973E [DERIVED] F0 2C BEQ L_976C 9740 [DERIVED] C9 8B CMP #$8B 9742 [DERIVED] D0 06 BNE L_974A 9744 [DERIVED] 20 AB 97 JSR L_97AB 9747 [DERIVED] 4C AE A7 JMP $A7AE L_974A: 974A [DERIVED] 38 SEC 974B [DERIVED] E9 CC SBC #$CC 974D [DERIVED] 90 0A BCC L_9759 974F [DERIVED] C9 0F CMP #$0F 9751 [DERIVED] B0 06 BCS L_9759 9753 [DERIVED] 20 5F 97 JSR L_975F 9756 [DERIVED] 4C AE A7 JMP $A7AE L_9759: 9759 [DERIVED] 20 79 00 JSR CHRGOT ; BASIC CHRGOT routine 975C [DERIVED] 4C E7 A7 JMP $A7E7 L_975F: 975F [DERIVED] 0A ASL A 9760 [DERIVED] A8 TAY 9761 [DERIVED] B9 88 96 LDA $9688,Y 9764 [DERIVED] 48 PHA ; save A on stack 9765 [DERIVED] B9 87 96 LDA BASIC4_HANDLER_TABLE_MINUS1,Y 9768 [DERIVED] 48 PHA ; save A on stack 9769 [DERIVED] 4C 73 00 JMP CHRGET ; BASIC CHRGET routine L_976C: 976C [DERIVED] A0 03 LDY #$03 L_976E: 976E [DERIVED] B9 77 02 LDA $0277,Y 9771 [DERIVED] D9 A7 97 CMP BASIC4_RUN_TEXT,Y 9774 [DERIVED] D0 27 BNE L_979D 9776 [DERIVED] 88 DEY 9777 [DERIVED] 10 F5 BPL L_976E 9779 [DERIVED] A5 C5 LDA $C5 977B [DERIVED] C9 3F CMP #$3F 977D [DERIVED] D0 1E BNE L_979D 977F [DERIVED] A5 7B LDA $7B 9781 [DERIVED] C9 02 CMP #$02 9783 [DERIVED] D0 18 BNE L_979D 9785 [DERIVED] A9 03 LDA #$03 9787 [DERIVED] AE A2 97 LDX BASIC4_RUN_FILENAME_POINTER 978A [DERIVED] AC A3 97 LDY $97A3 978D [DERIVED] 20 BD FF JSR SETNAM ; KERNAL SETNAM 9790 [DERIVED] A2 08 LDX #$08 9792 [DERIVED] A0 00 LDY #$00 9794 [DERIVED] 20 BA FF JSR SETLFS ; KERNAL SETLFS 9797 [DERIVED] 20 6F E1 JSR C64_BASIC_LOAD_ROUTE ; C64 BASIC LOAD command route 979A [DERIVED] 4C AE A7 JMP $A7AE L_979D: 979D [DERIVED] A9 93 LDA #$93 979F [DERIVED] 4C 4A 97 JMP L_974A ; -------------------------------------------------------------------------- ; DATA used by the extension LOAD/RUN path: pointer to the string at $97A4, filename ; "0:*", followed by "RUN" and carriage return. ; -------------------------------------------------------------------------- BASIC4_RUN_FILENAME_POINTER: 97A2 [DERIVED] A4 97 .word $97A4 ; pointer to filename string BASIC4_RUN_FILENAME: 97A4 [DERIVED] 30 3A 2A .byte $30, $3A, $2A ; "0:*" BASIC4_RUN_TEXT: 97A7 [DERIVED] 52 55 4E 0D .byte $52, $55, $4E, $0D ; "RUN" + CR L_97AB: 97AB [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 97AE [DERIVED] 20 9E AD JSR C64_BASIC_FRMEVL ; evaluate BASIC expression 97B1 [DERIVED] 20 79 00 JSR CHRGOT ; BASIC CHRGOT routine 97B4 [DERIVED] C9 89 CMP #$89 97B6 [DERIVED] F0 05 BEQ L_97BD 97B8 [DERIVED] A9 A7 LDA #$A7 97BA [DERIVED] 20 FF AE JSR $AEFF L_97BD: 97BD [DERIVED] A5 61 LDA $61 97BF [DERIVED] F0 0B BEQ L_97CC 97C1 [DERIVED] 20 79 00 JSR CHRGOT ; BASIC CHRGOT routine 97C4 [DERIVED] 90 03 BCC L_97C9 97C6 [DERIVED] 4C 19 97 JMP L_9719 L_97C9: 97C9 [DERIVED] 4C A0 A8 JMP $A8A0 L_97CC: 97CC [DERIVED] 4C 3B A9 JMP $A93B ; -------------------------------------------------------------------------- ; Expression-evaluation hook corresponding to IEVAL; preserves normal BASIC ; expression evaluation while accommodating the extension state. ; -------------------------------------------------------------------------- BASIC4_EVAL_HOOK: 97CF [DERIVED] 38 SEC 97D0 [DERIVED] A5 49 LDA $49 97D2 [DERIVED] E9 02 SBC #$02 97D4 [DERIVED] 85 49 STA $49 97D6 [DERIVED] A5 4A LDA $4A 97D8 [DERIVED] E9 00 SBC #$00 97DA [DERIVED] 85 4A STA $4A 97DC [DERIVED] A0 00 LDY #$00 97DE [DERIVED] B1 49 LDA ($49),Y 97E0 [DERIVED] AA TAX 97E1 [DERIVED] C8 INY 97E2 [DERIVED] B1 49 LDA ($49),Y 97E4 [DERIVED] A8 TAY 97E5 [DERIVED] 20 00 99 JSR L_9900 97E8 [DERIVED] 90 03 BCC L_97ED 97EA [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_97ED: 97ED [DERIVED] 18 CLC 97EE [DERIVED] A5 49 LDA $49 97F0 [DERIVED] 69 02 ADC #$02 97F2 [DERIVED] 85 49 STA $49 97F4 [DERIVED] A5 4A LDA $4A 97F6 [DERIVED] 69 00 ADC #$00 97F8 [DERIVED] 85 4A STA $4A 97FA [DERIVED] A9 00 LDA #$00 97FC [DERIVED] 85 0D STA $0D 97FE [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 9801 [DERIVED] B0 03 BCS L_9806 9803 [DERIVED] 4C F3 BC JMP $BCF3 L_9806: 9806 [DERIVED] 20 13 B1 JSR $B113 9809 [DERIVED] B0 03 BCS L_980E 980B [DERIVED] 4C 9A AE JMP $AE9A L_980E: 980E [DERIVED] 2C 34 03 BIT B4_STATE ; BusCard BASIC4 workspace/state 9811 [DERIVED] 30 2F BMI L_9842 9813 [DERIVED] A5 7A LDA $7A 9815 [DERIVED] 48 PHA ; save A on stack 9816 [DERIVED] A5 7B LDA $7B 9818 [DERIVED] 48 PHA ; save A on stack 9819 [DERIVED] 20 79 00 JSR CHRGOT ; BASIC CHRGOT routine 981C [DERIVED] C9 44 CMP #$44 981E [DERIVED] D0 1C BNE L_983C 9820 [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 9823 [DERIVED] C9 53 CMP #$53 9825 [DERIVED] D0 15 BNE L_983C L_9827: 9827 [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 982A [DERIVED] 90 FB BCC L_9827 982C [DERIVED] 20 13 B1 JSR $B113 982F [DERIVED] B0 F6 BCS L_9827 9831 [DERIVED] C9 25 CMP #$25 9833 [DERIVED] F0 07 BEQ L_983C 9835 [DERIVED] C9 28 CMP #$28 9837 [DERIVED] F0 03 BEQ L_983C 9839 [DERIVED] 20 45 98 JSR L_9845 L_983C: 983C [DERIVED] 68 PLA ; restore/pull byte from stack 983D [DERIVED] 85 7B STA $7B 983F [DERIVED] 68 PLA ; restore/pull byte from stack 9840 [DERIVED] 85 7A STA $7A L_9842: 9842 [DERIVED] 4C 28 AF JMP $AF28 L_9845: 9845 [DERIVED] A0 00 LDY #$00 9847 [DERIVED] 84 90 STY STATUS ; KERNAL I/O status byte 9849 [DERIVED] 88 DEY 984A [DERIVED] 8C 34 03 STY B4_STATE ; BusCard BASIC4 workspace/state 984D [DERIVED] A5 BA LDA FA ; current device number 984F [DERIVED] C9 04 CMP #$04 9851 [DERIVED] B0 04 BCS L_9857 9853 [DERIVED] A9 08 LDA #$08 9855 [DERIVED] 85 BA STA FA ; current device number L_9857: 9857 [DERIVED] 20 09 ED JSR KERNAL_TALK_PATCH ; call/jump to kernal talk patch 985A [DERIVED] A5 90 LDA STATUS ; KERNAL I/O status byte 985C [DERIVED] F0 04 BEQ L_9862 985E [DERIVED] A2 00 LDX #$00 9860 [DERIVED] F0 1B BEQ L_987D L_9862: 9862 [DERIVED] A9 6F LDA #$6F 9864 [DERIVED] 20 C7 ED JSR KERNAL_SECONDARY_TALK_PATCH ; call/jump to kernal secondary talk patch 9867 [DERIVED] A2 00 LDX #$00 L_9869: 9869 [DERIVED] 20 13 EE JSR BUSCARD_INPUT_BYTE_DISPATCH ; call/jump to buscard input byte dispatch 986C [DERIVED] 9D 53 03 STA B4_COMMAND_BUFFER,X ; BusCard BASIC4 constructed DOS command buffer 986F [DERIVED] E8 INX 9870 [DERIVED] E0 29 CPX #$29 9872 [DERIVED] F0 08 BEQ L_987C 9874 [DERIVED] C9 0D CMP #$0D 9876 [DERIVED] F0 04 BEQ L_987C 9878 [DERIVED] A5 90 LDA STATUS ; KERNAL I/O status byte 987A [DERIVED] F0 ED BEQ L_9869 L_987C: 987C [DERIVED] CA DEX L_987D: 987D [DERIVED] A9 00 LDA #$00 987F [DERIVED] 9D 53 03 STA B4_COMMAND_BUFFER,X ; BusCard BASIC4 constructed DOS command buffer 9882 [DERIVED] 8A TXA 9883 [DERIVED] 48 PHA ; save A on stack 9884 [DERIVED] 20 EF ED JSR BUSCARD_TALK_DISPATCH ; call/jump to buscard talk dispatch 9887 [DERIVED] A9 44 LDA #$44 9889 [DERIVED] 85 45 STA $45 988B [DERIVED] A9 D3 LDA #$D3 988D [DERIVED] 85 46 STA $46 988F [DERIVED] 20 E7 B0 JSR $B0E7 9892 [DERIVED] 68 PLA ; restore/pull byte from stack 9893 [DERIVED] 48 PHA ; save A on stack 9894 [DERIVED] 20 F4 B4 JSR $B4F4 9897 [DERIVED] A0 02 LDY #$02 9899 [DERIVED] A5 36 LDA $36 989B [DERIVED] 91 47 STA ($47),Y 989D [DERIVED] 88 DEY 989E [DERIVED] A5 35 LDA $35 98A0 [DERIVED] 91 47 STA ($47),Y 98A2 [DERIVED] 88 DEY 98A3 [DERIVED] 68 PLA ; restore/pull byte from stack 98A4 [DERIVED] 48 PHA ; save A on stack 98A5 [DERIVED] 91 47 STA ($47),Y 98A7 [DERIVED] A8 TAY L_98A8: 98A8 [DERIVED] 88 DEY 98A9 [DERIVED] 30 07 BMI L_98B2 98AB [DERIVED] B9 53 03 LDA B4_COMMAND_BUFFER,Y ; BusCard BASIC4 constructed DOS command buffer 98AE [DERIVED] 91 35 STA ($35),Y 98B0 [DERIVED] D0 F6 BNE L_98A8 L_98B2: 98B2 [DERIVED] A9 53 LDA #$53 98B4 [DERIVED] 85 7A STA $7A 98B6 [DERIVED] A9 03 LDA #$03 98B8 [DERIVED] 85 7B STA $7B 98BA [DERIVED] 68 PLA ; restore/pull byte from stack 98BB [DERIVED] D0 0E BNE L_98CB 98BD [DERIVED] A0 31 LDY #$31 98BF [DERIVED] 8C 53 03 STY B4_COMMAND_BUFFER ; BusCard BASIC4 constructed DOS command buffer 98C2 [DERIVED] 88 DEY 98C3 [DERIVED] 8C 54 03 STY $0354 98C6 [DERIVED] A9 00 LDA #$00 98C8 [DERIVED] 8D 55 03 STA $0355 L_98CB: 98CB [DERIVED] A5 47 LDA $47 98CD [DERIVED] 48 PHA ; save A on stack 98CE [DERIVED] A5 48 LDA $48 98D0 [DERIVED] 48 PHA ; save A on stack 98D1 [DERIVED] A9 53 LDA #$53 98D3 [DERIVED] 85 46 STA $46 98D5 [DERIVED] 20 E7 B0 JSR $B0E7 98D8 [DERIVED] 20 9E AD JSR C64_BASIC_FRMEVL ; evaluate BASIC expression 98DB [DERIVED] 06 62 ASL $62 98DD [DERIVED] 46 62 LSR $62 98DF [DERIVED] A0 04 LDY #$04 L_98E1: 98E1 [DERIVED] B9 61 00 LDA $0061,Y 98E4 [DERIVED] 91 47 STA ($47),Y 98E6 [DERIVED] 88 DEY 98E7 [DERIVED] 10 F8 BPL L_98E1 98E9 [DERIVED] 68 PLA ; restore/pull byte from stack 98EA [DERIVED] 85 48 STA $48 98EC [DERIVED] 68 PLA ; restore/pull byte from stack 98ED [DERIVED] 85 47 STA $47 98EF [DERIVED] 60 RTS ; return L_98F0: 98F0 [DERIVED] A5 7A LDA $7A 98F2 [DERIVED] 48 PHA ; save A on stack 98F3 [DERIVED] A5 7B LDA $7B 98F5 [DERIVED] 48 PHA ; save A on stack 98F6 [DERIVED] 20 45 98 JSR L_9845 98F9 [DERIVED] 68 PLA ; restore/pull byte from stack 98FA [DERIVED] 85 7B STA $7B 98FC [DERIVED] 68 PLA ; restore/pull byte from stack 98FD [DERIVED] 85 7A STA $7A 98FF [DERIVED] 60 RTS ; return L_9900: 9900 [DERIVED] E0 44 CPX #$44 9902 [DERIVED] D0 08 BNE L_990C 9904 [DERIVED] C0 53 CPY #$53 9906 [DERIVED] F0 06 BEQ L_990E 9908 [DERIVED] C0 D3 CPY #$D3 990A [DERIVED] F0 02 BEQ L_990E L_990C: 990C [DERIVED] 18 CLC 990D [DERIVED] 60 RTS ; return L_990E: 990E [DERIVED] 38 SEC 990F [DERIVED] 60 RTS ; return L_9910: 9910 [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error ; -------------------------------------------------------------------------- ; RECORD command handler. Parses record/position arguments and routes the resulting ; operation through the BusCard/KERNAL disk-I/O helpers. ; -------------------------------------------------------------------------- BASIC4_CMD_RECORD: 9913 [DERIVED] A9 01 LDA #$01 9915 [DERIVED] 8D 3A 03 STA B4_WORK_033A ; BusCard BASIC4 parser workspace 9918 [DERIVED] 20 79 00 JSR CHRGOT ; BASIC CHRGOT routine 991B [DERIVED] A9 23 LDA #$23 991D [DERIVED] 20 FF AE JSR $AEFF 9920 [DERIVED] 20 EC 9F JSR L_9FEC 9923 [DERIVED] E0 00 CPX #$00 9925 [DERIVED] F0 3E BEQ L_9965 9927 [DERIVED] 86 B8 STX LA ; logical file number 9929 [DERIVED] 20 FD AE JSR $AEFD 992C [DERIVED] F0 E2 BEQ L_9910 992E [DERIVED] 90 0F BCC L_993F 9930 [DERIVED] 20 FA AE JSR $AEFA 9933 [DERIVED] 20 9E AD JSR C64_BASIC_FRMEVL ; evaluate BASIC expression 9936 [DERIVED] 20 F7 B7 JSR C64_BASIC_GETADR ; convert FAC/numeric argument to 16-bit address 9939 [DERIVED] 20 F7 AE JSR $AEF7 993C [DERIVED] 4C 45 99 JMP L_9945 L_993F: 993F [DERIVED] 20 9E AD JSR C64_BASIC_FRMEVL ; evaluate BASIC expression 9942 [DERIVED] 20 F7 B7 JSR C64_BASIC_GETADR ; convert FAC/numeric argument to 16-bit address L_9945: 9945 [DERIVED] 20 79 00 JSR CHRGOT ; BASIC CHRGOT routine 9948 [DERIVED] F0 18 BEQ L_9962 994A [DERIVED] 20 FD AE JSR $AEFD 994D [DERIVED] F0 C1 BEQ L_9910 994F [DERIVED] 20 EC 9F JSR L_9FEC 9952 [DERIVED] E0 00 CPX #$00 9954 [DERIVED] F0 0F BEQ L_9965 9956 [DERIVED] E0 FF CPX #$FF 9958 [DERIVED] F0 0B BEQ L_9965 995A [DERIVED] 8E 3A 03 STX B4_WORK_033A ; BusCard BASIC4 parser workspace 995D [DERIVED] 20 79 00 JSR CHRGOT ; BASIC CHRGOT routine 9960 [DERIVED] D0 AE BNE L_9910 L_9962: 9962 [DERIVED] 4C 97 9B JMP L_9B97 L_9965: 9965 [DERIVED] 4C 89 9F JMP L_9F89 L_9968: 9968 [DERIVED] 29 E6 AND #$E6 996A [DERIVED] F0 03 BEQ L_996F L_996C: 996C [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_996F: 996F [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9972 [DERIVED] 29 01 AND #$01 9974 [DERIVED] C9 01 CMP #$01 9976 [DERIVED] D0 F4 BNE L_996C 9978 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 997B [DERIVED] 60 RTS ; return L_997C: 997C [DERIVED] 29 E7 AND #$E7 997E [DERIVED] D0 EC BNE L_996C 9980 [DERIVED] 60 RTS ; return L_9981: 9981 [DERIVED] 29 E6 AND #$E6 9983 [DERIVED] D0 E7 BNE L_996C 9985 [DERIVED] 60 RTS ; return L_9986: 9986 [DERIVED] 29 C4 AND #$C4 9988 [DERIVED] D0 E2 BNE L_996C 998A [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags L_998D: 998D [DERIVED] 29 03 AND #$03 998F [DERIVED] C9 03 CMP #$03 9991 [DERIVED] D0 D9 BNE L_996C 9993 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9996 [DERIVED] 60 RTS ; return L_9997: 9997 [DERIVED] 29 05 AND #$05 9999 [DERIVED] C9 05 CMP #$05 999B [DERIVED] D0 CF BNE L_996C 999D [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 99A0 [DERIVED] 60 RTS ; return ; -------------------------------------------------------------------------- ; BASIC4 syntax/template bytecode ; DATA: compact syntax/template bytecode used by the BASIC4 disk-command parser. ; It is data, not 6502 instructions. ; -------------------------------------------------------------------------- 99A1 [DERIVED] 24 D1 3A F1 24 F1 D1 3A F1 2C E1 2C .byte $24, $D1, $3A, $F1, $24, $F1, $D1, $3A, $F1, $2C, $E1, $2C 99AD [DERIVED] E0 D1 3A F1 2C 41 4E D1 3A F1 2C D0 .byte $E0, $D1, $3A, $F1, $2C, $41, $4E, $D1, $3A, $F1, $2C, $D0 99B9 [DERIVED] 56 D1 44 D2 3D D1 43 D2 3A F2 3D D1 .byte $56, $D1, $44, $D2, $3D, $D1, $43, $D2, $3A, $F2, $3D, $D1 99C5 [DERIVED] 3A F1 43 D2 3A F2 3D D2 3A F2 2C D1 .byte $3A, $F1, $43, $D2, $3A, $F2, $3D, $D2, $3A, $F2, $2C, $D1 99D1 [DERIVED] 3A F1 52 D1 3A F2 3D D1 3A F1 53 D1 .byte $3A, $F1, $52, $D1, $3A, $F2, $3D, $D1, $3A, $F1, $53, $D1 99DD [DERIVED] 3A F1 .byte $3A, $F1 ; -------------------------------------------------------------------------- ; CATALOG / DIRECTORY handler (both keywords share this routine). Opens/reads the ; directory stream, formats entries, honors STOP/pause handling, and closes channels. ; -------------------------------------------------------------------------- BASIC4_CMD_CATALOG_DIRECTORY: 99DF [DERIVED] A5 B8 LDA LA ; logical file number 99E1 [DERIVED] 85 AF STA $AF 99E3 [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 99E6 [DERIVED] 20 81 99 JSR L_9981 99E9 [DERIVED] A0 00 LDY #$00 99EB [DERIVED] A2 01 LDX #$01 99ED [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 99F0 [DERIVED] 29 10 AND #$10 99F2 [DERIVED] F0 0C BEQ L_9A00 99F4 [DERIVED] E8 INX 99F5 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 99F8 [DERIVED] 29 01 AND #$01 99FA [DERIVED] F0 0E BEQ L_9A0A 99FC [DERIVED] E8 INX 99FD [DERIVED] E8 INX 99FE [DERIVED] D0 0A BNE L_9A0A L_9A00: 9A00 [DERIVED] A0 04 LDY #$04 9A02 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9A05 [DERIVED] 29 01 AND #$01 9A07 [DERIVED] F0 01 BEQ L_9A0A 9A09 [DERIVED] E8 INX L_9A0A: 9A0A [DERIVED] 8A TXA 9A0B [DERIVED] 20 5C 9D JSR L_9D5C 9A0E [DERIVED] A5 9A LDA DFLTO ; current output device 9A10 [DERIVED] 85 AE STA $AE 9A12 [DERIVED] A9 60 LDA #$60 9A14 [DERIVED] 85 B9 STA SA ; secondary address 9A16 [DERIVED] A9 0E LDA #$0E 9A18 [DERIVED] 85 B8 STA LA ; logical file number 9A1A [DERIVED] 20 FE ED JSR BUSCARD_UNLISTEN_DISPATCH ; call/jump to buscard unlisten dispatch 9A1D [DERIVED] 20 C0 FF JSR OPEN ; KERNAL OPEN 9A20 [DERIVED] 90 0A BCC L_9A2C 9A22 [DERIVED] 08 PHP 9A23 [DERIVED] 48 PHA ; save A on stack 9A24 [DERIVED] 20 9F 9A JSR L_9A9F 9A27 [DERIVED] 68 PLA ; restore/pull byte from stack 9A28 [DERIVED] 28 PLP 9A29 [DERIVED] 4C D1 E1 JMP $E1D1 L_9A2C: 9A2C [DERIVED] A9 00 LDA #$00 9A2E [DERIVED] 85 90 STA STATUS ; KERNAL I/O status byte 9A30 [DERIVED] A0 03 LDY #$03 L_9A32: 9A32 [DERIVED] 84 B7 STY FNLEN ; filename length 9A34 [DERIVED] A2 0E LDX #$0E 9A36 [DERIVED] 20 C6 FF JSR CHKIN ; KERNAL CHKIN 9A39 [DERIVED] 20 CF FF JSR CHRIN ; KERNAL CHRIN 9A3C [DERIVED] 85 FD STA $FD 9A3E [DERIVED] A4 90 LDY STATUS ; KERNAL I/O status byte 9A40 [DERIVED] D0 5D BNE L_9A9F 9A42 [DERIVED] 20 CF FF JSR CHRIN ; KERNAL CHRIN 9A45 [DERIVED] 85 FE STA $FE 9A47 [DERIVED] A4 90 LDY STATUS ; KERNAL I/O status byte 9A49 [DERIVED] D0 54 BNE L_9A9F 9A4B [DERIVED] A4 B7 LDY FNLEN ; filename length 9A4D [DERIVED] 88 DEY 9A4E [DERIVED] D0 E2 BNE L_9A32 9A50 [DERIVED] 20 CC FF JSR CLRCHN ; KERNAL CLRCHN 9A53 [DERIVED] 20 B2 9A JSR L_9AB2 9A56 [DERIVED] A6 FD LDX $FD 9A58 [DERIVED] A5 FE LDA $FE 9A5A [DERIVED] 20 CD BD JSR $BDCD 9A5D [DERIVED] A9 20 LDA #$20 9A5F [DERIVED] 20 D2 FF JSR CHROUT ; KERNAL CHROUT 9A62 [DERIVED] 20 CC FF JSR CLRCHN ; KERNAL CLRCHN L_9A65: 9A65 [DERIVED] A2 0E LDX #$0E 9A67 [DERIVED] 20 C6 FF JSR CHKIN ; KERNAL CHKIN 9A6A [DERIVED] 20 CF FF JSR CHRIN ; KERNAL CHRIN 9A6D [DERIVED] 48 PHA ; save A on stack 9A6E [DERIVED] 20 CC FF JSR CLRCHN ; KERNAL CLRCHN 9A71 [DERIVED] 68 PLA ; restore/pull byte from stack 9A72 [DERIVED] A6 90 LDX STATUS ; KERNAL I/O status byte 9A74 [DERIVED] D0 29 BNE L_9A9F 9A76 [DERIVED] C9 00 CMP #$00 9A78 [DERIVED] F0 18 BEQ L_9A92 9A7A [DERIVED] 20 A7 9A JSR L_9AA7 9A7D [DERIVED] 20 E1 FF JSR STOP ; KERNAL STOP 9A80 [DERIVED] F0 1D BEQ L_9A9F 9A82 [DERIVED] 20 E4 FF JSR GETIN ; KERNAL GETIN 9A85 [DERIVED] F0 DE BEQ L_9A65 9A87 [DERIVED] C9 20 CMP #$20 9A89 [DERIVED] D0 DA BNE L_9A65 L_9A8B: 9A8B [DERIVED] 20 E4 FF JSR GETIN ; KERNAL GETIN 9A8E [DERIVED] F0 FB BEQ L_9A8B 9A90 [DERIVED] D0 D3 BNE L_9A65 L_9A92: 9A92 [DERIVED] A9 0D LDA #$0D 9A94 [DERIVED] 20 A7 9A JSR L_9AA7 9A97 [DERIVED] 20 FE ED JSR BUSCARD_UNLISTEN_DISPATCH ; call/jump to buscard unlisten dispatch 9A9A [DERIVED] A0 02 LDY #$02 9A9C [DERIVED] D0 94 BNE L_9A32 9A9E [DERIVED] 68 PLA ; restore/pull byte from stack L_9A9F: 9A9F [DERIVED] 20 CC FF JSR CLRCHN ; KERNAL CLRCHN 9AA2 [DERIVED] A9 0E LDA #$0E 9AA4 [DERIVED] 4C C3 FF JMP CLOSE ; KERNAL CLOSE L_9AA7: 9AA7 [DERIVED] 48 PHA ; save A on stack 9AA8 [DERIVED] 20 B2 9A JSR L_9AB2 9AAB [DERIVED] 68 PLA ; restore/pull byte from stack 9AAC [DERIVED] 20 D2 FF JSR CHROUT ; KERNAL CHROUT 9AAF [DERIVED] 4C CC FF JMP CLRCHN ; KERNAL CLRCHN L_9AB2: 9AB2 [DERIVED] A6 AE LDX $AE 9AB4 [DERIVED] E0 03 CPX #$03 9AB6 [DERIVED] F0 05 BEQ L_9ABD 9AB8 [DERIVED] A6 AF LDX $AF 9ABA [DERIVED] 20 C9 FF JSR CHKOUT ; KERNAL CHKOUT L_9ABD: 9ABD [DERIVED] 60 RTS ; return L_9ABE: 9ABE [DERIVED] A0 61 LDY #$61 L_9AC0: 9AC0 [DERIVED] C8 INY 9AC1 [DERIVED] 98 TYA 9AC2 [DERIVED] A6 98 LDX LDTND ; number of open files L_9AC4: 9AC4 [DERIVED] CA DEX 9AC5 [DERIVED] 30 07 BMI L_9ACE 9AC7 [DERIVED] DD 6D 02 CMP $026D,X 9ACA [DERIVED] F0 F4 BEQ L_9AC0 9ACC [DERIVED] D0 F6 BNE L_9AC4 L_9ACE: 9ACE [DERIVED] 84 B9 STY SA ; secondary address 9AD0 [DERIVED] 60 RTS ; return ; -------------------------------------------------------------------------- ; DOPEN handler: parse arguments, choose/setup logical/secondary addressing and ; enter the C64 OPEN path. ; -------------------------------------------------------------------------- BASIC4_CMD_DOPEN: 9AD1 [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9AD4 [DERIVED] 20 97 99 JSR L_9997 9AD7 [DERIVED] 29 22 AND #$22 9AD9 [DERIVED] F0 03 BEQ L_9ADE 9ADB [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9ADE: 9ADE [DERIVED] 20 BE 9A JSR L_9ABE 9AE1 [DERIVED] A0 06 LDY #$06 9AE3 [DERIVED] A2 03 LDX #$03 9AE5 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9AE8 [DERIVED] 29 10 AND #$10 9AEA [DERIVED] D0 04 BNE L_9AF0 9AEC [DERIVED] A0 08 LDY #$08 9AEE [DERIVED] A2 01 LDX #$01 L_9AF0: 9AF0 [DERIVED] 2C 3E 03 BIT B4_WORK_033E ; BusCard BASIC4 syntax flags 9AF3 [DERIVED] 50 04 BVC L_9AF9 9AF5 [DERIVED] A2 07 LDX #$07 9AF7 [DERIVED] A0 06 LDY #$06 L_9AF9: 9AF9 [DERIVED] 2C 3E 03 BIT B4_WORK_033E ; BusCard BASIC4 syntax flags 9AFC [DERIVED] 10 0E BPL L_9B0C 9AFE [DERIVED] A9 40 LDA #$40 9B00 [DERIVED] 8D 53 03 STA B4_COMMAND_BUFFER ; BusCard BASIC4 constructed DOS command buffer 9B03 [DERIVED] 8A TXA 9B04 [DERIVED] A2 01 LDX #$01 9B06 [DERIVED] 20 5E 9D JSR L_9D5E 9B09 [DERIVED] 4C C1 E1 JMP C64_BASIC_OPEN_ROUTE ; C64 BASIC OPEN command route L_9B0C: 9B0C [DERIVED] 8A TXA 9B0D [DERIVED] 20 5C 9D JSR L_9D5C 9B10 [DERIVED] 4C C1 E1 JMP C64_BASIC_OPEN_ROUTE ; C64 BASIC OPEN command route ; -------------------------------------------------------------------------- ; APPEND handler: build the append/open command and enter the OPEN path. ; -------------------------------------------------------------------------- BASIC4_CMD_APPEND: 9B13 [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9B16 [DERIVED] 20 97 99 JSR L_9997 9B19 [DERIVED] 29 E2 AND #$E2 9B1B [DERIVED] F0 03 BEQ L_9B20 9B1D [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9B20: 9B20 [DERIVED] 20 BE 9A JSR L_9ABE 9B23 [DERIVED] A0 0D LDY #$0D 9B25 [DERIVED] A9 05 LDA #$05 9B27 [DERIVED] 20 5C 9D JSR L_9D5C 9B2A [DERIVED] 4C C1 E1 JMP C64_BASIC_OPEN_ROUTE ; C64 BASIC OPEN command route ; -------------------------------------------------------------------------- ; HEADER handler: parse drive/optional disk ID, build the command and request user ; confirmation before destructive formatting. ; -------------------------------------------------------------------------- BASIC4_CMD_HEADER: 9B2D [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9B30 [DERIVED] 20 68 99 JSR L_9968 9B33 [DERIVED] 29 11 AND #$11 9B35 [DERIVED] C9 11 CMP #$11 9B37 [DERIVED] F0 03 BEQ L_9B3C 9B39 [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9B3C: 9B3C [DERIVED] 20 81 9B JSR L_9B81 9B3F [DERIVED] 20 0F 9D JSR BASIC4_CONFIRM ; call/jump to basic4 confirm 9B42 [DERIVED] 90 01 BCC L_9B45 9B44 [DERIVED] 60 RTS ; return L_9B45: 9B45 [DERIVED] A0 12 LDY #$12 9B47 [DERIVED] A9 04 LDA #$04 9B49 [DERIVED] AE 3F 03 LDX B4_WORK_033F ; BusCard BASIC4 parser workspace 9B4C [DERIVED] F0 02 BEQ L_9B50 9B4E [DERIVED] A9 06 LDA #$06 L_9B50: 9B50 [DERIVED] 20 FE 9B JSR L_9BFE 9B53 [DERIVED] 20 F0 98 JSR L_98F0 9B56 [DERIVED] AD 53 03 LDA B4_COMMAND_BUFFER ; BusCard BASIC4 constructed DOS command buffer 9B59 [DERIVED] C9 32 CMP #$32 9B5B [DERIVED] B0 03 BCS BASIC4_PRINT_BAD_DISK 9B5D [DERIVED] 60 RTS ; return ; -------------------------------------------------------------------------- ; DATA: little-endian pointer $9D42 into the prompt/error string area; execution ; resumes at $9B60. ; -------------------------------------------------------------------------- BASIC4_BAD_DISK_PTR: 9B5E [DERIVED] 42 9D .word $9D42 ; pointer into "BAD DISK" string BASIC4_PRINT_BAD_DISK: 9B60 [DERIVED] AD 5E 9B LDA BASIC4_BAD_DISK_PTR 9B63 [DERIVED] 85 22 STA $22 9B65 [DERIVED] AD 5F 9B LDA $9B5F 9B68 [DERIVED] 85 23 STA $23 9B6A [DERIVED] 4C 47 A4 JMP $A447 ; -------------------------------------------------------------------------- ; DCLOSE handler: close the selected logical file(s)/device channels. ; -------------------------------------------------------------------------- BASIC4_CMD_DCLOSE: 9B6D [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9B70 [DERIVED] 29 F3 AND #$F3 9B72 [DERIVED] F0 03 BEQ L_9B77 9B74 [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9B77: 9B77 [DERIVED] 20 50 9D JSR BASIC4_CLOSE_HELPER ; call/jump to basic4 close helper 9B7A [DERIVED] A5 B8 LDA LA ; logical file number 9B7C [DERIVED] F0 03 BEQ L_9B81 9B7E [DERIVED] 4C C3 FF JMP CLOSE ; KERNAL CLOSE L_9B81: 9B81 [DERIVED] A5 BA LDA FA ; current device number 9B83 [DERIVED] A6 98 LDX LDTND ; number of open files L_9B85: 9B85 [DERIVED] CA DEX 9B86 [DERIVED] 30 0E BMI L_9B96 9B88 [DERIVED] DD 63 02 CMP $0263,X 9B8B [DERIVED] D0 F8 BNE L_9B85 9B8D [DERIVED] BD 59 02 LDA $0259,X 9B90 [DERIVED] 20 C3 FF JSR CLOSE ; KERNAL CLOSE 9B93 [DERIVED] B8 CLV 9B94 [DERIVED] 50 EB BVC L_9B81 L_9B96: 9B96 [DERIVED] 60 RTS ; return L_9B97: 9B97 [DERIVED] A5 B8 LDA LA ; logical file number 9B99 [DERIVED] 20 14 F3 JSR $F314 9B9C [DERIVED] F0 05 BEQ L_9BA3 9B9E [DERIVED] A2 03 LDX #$03 9BA0 [DERIVED] 4C 37 A4 JMP $A437 L_9BA3: 9BA3 [DERIVED] 20 1F F3 JSR $F31F 9BA6 [DERIVED] 20 50 9D JSR BASIC4_CLOSE_HELPER ; call/jump to basic4 close helper 9BA9 [DERIVED] A9 50 LDA #$50 9BAB [DERIVED] 8D 53 03 STA B4_COMMAND_BUFFER ; BusCard BASIC4 constructed DOS command buffer 9BAE [DERIVED] A5 B9 LDA SA ; secondary address 9BB0 [DERIVED] 8D 54 03 STA $0354 9BB3 [DERIVED] A5 14 LDA $14 9BB5 [DERIVED] 8D 55 03 STA $0355 9BB8 [DERIVED] A5 15 LDA $15 9BBA [DERIVED] 8D 56 03 STA $0356 9BBD [DERIVED] AD 3A 03 LDA B4_WORK_033A ; BusCard BASIC4 parser workspace 9BC0 [DERIVED] 8D 57 03 STA $0357 9BC3 [DERIVED] A2 05 LDX #$05 9BC5 [DERIVED] 20 AE 9D JSR L_9DAE 9BC8 [DERIVED] 4C 01 9C JMP L_9C01 ; -------------------------------------------------------------------------- ; COLLECT handler: build and issue the corresponding DOS command. ; -------------------------------------------------------------------------- BASIC4_CMD_COLLECT: 9BCB [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9BCE [DERIVED] 20 7C 99 JSR L_997C 9BD1 [DERIVED] 20 81 9B JSR L_9B81 9BD4 [DERIVED] A0 18 LDY #$18 9BD6 [DERIVED] A2 01 LDX #$01 9BD8 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9BDB [DERIVED] 29 10 AND #$10 9BDD [DERIVED] F0 01 BEQ L_9BE0 9BDF [DERIVED] E8 INX L_9BE0: 9BE0 [DERIVED] 8A TXA 9BE1 [DERIVED] 4C FE 9B JMP L_9BFE ; -------------------------------------------------------------------------- ; BACKUP handler: validate source/destination drive parameters and issue command. ; -------------------------------------------------------------------------- BASIC4_CMD_BACKUP: 9BE4 [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9BE7 [DERIVED] 29 30 AND #$30 9BE9 [DERIVED] C9 30 CMP #$30 9BEB [DERIVED] F0 03 BEQ L_9BF0 L_9BED: 9BED [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9BF0: 9BF0 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9BF3 [DERIVED] 29 C7 AND #$C7 9BF5 [DERIVED] D0 F6 BNE L_9BED 9BF7 [DERIVED] 20 81 9B JSR L_9B81 9BFA [DERIVED] A0 1A LDY #$1A 9BFC [DERIVED] A9 04 LDA #$04 L_9BFE: 9BFE [DERIVED] 20 5C 9D JSR L_9D5C L_9C01: 9C01 [DERIVED] A9 6F LDA #$6F 9C03 [DERIVED] 85 B9 STA SA ; secondary address 9C05 [DERIVED] 20 D5 F3 JSR $F3D5 9C08 [DERIVED] 60 RTS ; return ; -------------------------------------------------------------------------- ; COPY handler: construct and issue the disk COPY command. ; -------------------------------------------------------------------------- BASIC4_CMD_COPY: 9C09 [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9C0C [DERIVED] 29 30 AND #$30 9C0E [DERIVED] C9 30 CMP #$30 9C10 [DERIVED] D0 07 BNE L_9C19 9C12 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9C15 [DERIVED] 29 C7 AND #$C7 9C17 [DERIVED] F0 09 BEQ L_9C22 L_9C19: 9C19 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9C1C [DERIVED] 20 86 99 JSR L_9986 9C1F [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags L_9C22: 9C22 [DERIVED] A0 1E LDY #$1E 9C24 [DERIVED] A9 08 LDA #$08 9C26 [DERIVED] 4C FE 9B JMP L_9BFE ; -------------------------------------------------------------------------- ; CONCAT handler: construct and issue the disk CONCAT command. ; -------------------------------------------------------------------------- BASIC4_CMD_CONCAT: 9C29 [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9C2C [DERIVED] 20 86 99 JSR L_9986 9C2F [DERIVED] A0 26 LDY #$26 9C31 [DERIVED] A9 0C LDA #$0C 9C33 [DERIVED] 4C FE 9B JMP L_9BFE L_9C36: 9C36 [DERIVED] A5 B7 LDA FNLEN ; filename length 9C38 [DERIVED] 8D 3A 03 STA B4_WORK_033A ; BusCard BASIC4 parser workspace 9C3B [DERIVED] A5 BB LDA FNADR_LO ; filename pointer low 9C3D [DERIVED] 85 FD STA $FD 9C3F [DERIVED] A5 BC LDA FNADR_HI ; filename pointer high 9C41 [DERIVED] 85 FE STA $FE L_9C43: 9C43 [DERIVED] 98 TYA 9C44 [DERIVED] 48 PHA ; save A on stack 9C45 [DERIVED] AC 3A 03 LDY B4_WORK_033A ; BusCard BASIC4 parser workspace 9C48 [DERIVED] F0 10 BEQ L_9C5A 9C4A [DERIVED] A0 00 LDY #$00 L_9C4C: 9C4C [DERIVED] B1 FD LDA ($FD),Y 9C4E [DERIVED] 9D 53 03 STA B4_COMMAND_BUFFER,X ; BusCard BASIC4 constructed DOS command buffer 9C51 [DERIVED] E8 INX 9C52 [DERIVED] C8 INY 9C53 [DERIVED] CC 3A 03 CPY B4_WORK_033A ; BusCard BASIC4 parser workspace 9C56 [DERIVED] D0 F4 BNE L_9C4C 9C58 [DERIVED] F0 01 BEQ L_9C5B L_9C5A: 9C5A [DERIVED] CA DEX L_9C5B: 9C5B [DERIVED] 68 PLA ; restore/pull byte from stack 9C5C [DERIVED] A8 TAY 9C5D [DERIVED] 38 SEC 9C5E [DERIVED] 60 RTS ; return L_9C5F: 9C5F [DERIVED] AD 3F 03 LDA B4_WORK_033F ; BusCard BASIC4 parser workspace 9C62 [DERIVED] 9D 53 03 STA B4_COMMAND_BUFFER,X ; BusCard BASIC4 constructed DOS command buffer 9C65 [DERIVED] E8 INX 9C66 [DERIVED] AD 40 03 LDA B4_WORK_0340 ; BusCard BASIC4 parser workspace 9C69 [DERIVED] 9D 53 03 STA B4_COMMAND_BUFFER,X ; BusCard BASIC4 constructed DOS command buffer 9C6C [DERIVED] E8 INX 9C6D [DERIVED] 8A TXA 9C6E [DERIVED] 60 RTS ; return ; -------------------------------------------------------------------------- ; DSAVE handler: construct filename/device parameters and enter C64 BASIC SAVE. ; -------------------------------------------------------------------------- BASIC4_CMD_DSAVE: 9C6F [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9C72 [DERIVED] 20 6F 99 JSR L_996F 9C75 [DERIVED] 29 66 AND #$66 9C77 [DERIVED] F0 03 BEQ L_9C7C 9C79 [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9C7C: 9C7C [DERIVED] A0 06 LDY #$06 9C7E [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9C81 [DERIVED] 29 80 AND #$80 9C83 [DERIVED] F0 0F BEQ L_9C94 9C85 [DERIVED] A9 40 LDA #$40 9C87 [DERIVED] 8D 53 03 STA B4_COMMAND_BUFFER ; BusCard BASIC4 constructed DOS command buffer 9C8A [DERIVED] A2 01 LDX #$01 9C8C [DERIVED] A9 03 LDA #$03 9C8E [DERIVED] 20 5E 9D JSR L_9D5E 9C91 [DERIVED] 4C 59 E1 JMP C64_BASIC_SAVE_ROUTE ; C64 BASIC SAVE command route L_9C94: 9C94 [DERIVED] A9 03 LDA #$03 9C96 [DERIVED] 20 5C 9D JSR L_9D5C 9C99 [DERIVED] 4C 59 E1 JMP C64_BASIC_SAVE_ROUTE ; C64 BASIC SAVE command route ; -------------------------------------------------------------------------- ; DLOAD handler: construct filename/device parameters and enter C64 BASIC LOAD. ; -------------------------------------------------------------------------- BASIC4_CMD_DLOAD: 9C9C [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9C9F [DERIVED] 20 6F 99 JSR L_996F 9CA2 [DERIVED] 29 E6 AND #$E6 9CA4 [DERIVED] F0 03 BEQ L_9CA9 L_9CA6: 9CA6 [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9CA9: 9CA9 [DERIVED] A0 06 LDY #$06 9CAB [DERIVED] A2 03 LDX #$03 9CAD [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9CB0 [DERIVED] 29 10 AND #$10 9CB2 [DERIVED] D0 04 BNE L_9CB8 9CB4 [DERIVED] C8 INY 9CB5 [DERIVED] C8 INY 9CB6 [DERIVED] CA DEX 9CB7 [DERIVED] CA DEX L_9CB8: 9CB8 [DERIVED] 8A TXA 9CB9 [DERIVED] 20 5C 9D JSR L_9D5C 9CBC [DERIVED] A9 00 LDA #$00 9CBE [DERIVED] 85 93 STA LOAD_VERIFY ; KERNAL LOAD/VERIFY flag 9CC0 [DERIVED] 85 0A STA $0A 9CC2 [DERIVED] 85 B9 STA SA ; secondary address 9CC4 [DERIVED] 4C 6F E1 JMP C64_BASIC_LOAD_ROUTE ; C64 BASIC LOAD command route ; -------------------------------------------------------------------------- ; RENAME handler: construct and issue the DOS RENAME command. ; -------------------------------------------------------------------------- BASIC4_CMD_RENAME: 9CC7 [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9CCA [DERIVED] 20 8D 99 JSR L_998D 9CCD [DERIVED] 29 E4 AND #$E4 9CCF [DERIVED] D0 D5 BNE L_9CA6 9CD1 [DERIVED] A0 32 LDY #$32 9CD3 [DERIVED] A9 08 LDA #$08 9CD5 [DERIVED] 4C FE 9B JMP L_9BFE ; -------------------------------------------------------------------------- ; SCRATCH handler: construct the DOS scratch command, ask for confirmation and ; report the resulting drive status. ; -------------------------------------------------------------------------- BASIC4_CMD_SCRATCH: 9CD8 [DERIVED] 20 CA 9D JSR BASIC4_PARSE_DISK_CLAUSES ; call/jump to basic4 parse disk clauses 9CDB [DERIVED] 20 68 99 JSR L_9968 9CDE [DERIVED] 20 0F 9D JSR BASIC4_CONFIRM ; call/jump to basic4 confirm 9CE1 [DERIVED] B0 26 BCS L_9D09 9CE3 [DERIVED] A0 3A LDY #$3A 9CE5 [DERIVED] A9 04 LDA #$04 9CE7 [DERIVED] 20 FE 9B JSR L_9BFE 9CEA [DERIVED] 20 0A 9D JSR L_9D0A 9CED [DERIVED] D0 1A BNE L_9D09 9CEF [DERIVED] 20 F0 98 JSR L_98F0 9CF2 [DERIVED] A9 0D LDA #$0D 9CF4 [DERIVED] 20 16 E7 JSR $E716 9CF7 [DERIVED] A0 00 LDY #$00 L_9CF9: 9CF9 [DERIVED] B9 53 03 LDA B4_COMMAND_BUFFER,Y ; BusCard BASIC4 constructed DOS command buffer 9CFC [DERIVED] F0 06 BEQ L_9D04 9CFE [DERIVED] 20 16 E7 JSR $E716 9D01 [DERIVED] C8 INY 9D02 [DERIVED] D0 F5 BNE L_9CF9 L_9D04: 9D04 [DERIVED] A9 0D LDA #$0D 9D06 [DERIVED] 20 16 E7 JSR $E716 L_9D09: 9D09 [DERIVED] 60 RTS ; return L_9D0A: 9D0A [DERIVED] A5 7B LDA $7B 9D0C [DERIVED] C9 02 CMP #$02 9D0E [DERIVED] 60 RTS ; return ; -------------------------------------------------------------------------- ; Common confirmation routine used before destructive disk operations. ; -------------------------------------------------------------------------- BASIC4_CONFIRM: 9D0F [DERIVED] 20 0A 9D JSR L_9D0A 9D12 [DERIVED] D0 1E BNE L_9D32 9D14 [DERIVED] A0 00 LDY #$00 L_9D16: 9D16 [DERIVED] B9 34 9D LDA BASIC4_PROMPT_STRINGS,Y 9D19 [DERIVED] 20 16 E7 JSR $E716 9D1C [DERIVED] C8 INY 9D1D [DERIVED] C0 0E CPY #$0E 9D1F [DERIVED] D0 F5 BNE L_9D16 9D21 [DERIVED] 20 57 F1 JSR $F157 9D24 [DERIVED] 48 PHA ; save A on stack L_9D25: 9D25 [DERIVED] 20 57 F1 JSR $F157 9D28 [DERIVED] C9 0D CMP #$0D 9D2A [DERIVED] D0 F9 BNE L_9D25 9D2C [DERIVED] 68 PLA ; restore/pull byte from stack 9D2D [DERIVED] C9 59 CMP #$59 9D2F [DERIVED] 38 SEC 9D30 [DERIVED] D0 01 BNE L_9D33 L_9D32: 9D32 [DERIVED] 18 CLC L_9D33: 9D33 [DERIVED] 60 RTS ; return ; -------------------------------------------------------------------------- ; DATA strings: carriage return + "ARE YOU SURE?" followed by "BAD DISK". The ; last K is stored with bit 7 set ($CB), matching the string convention used here. ; -------------------------------------------------------------------------- BASIC4_PROMPT_STRINGS: 9D34 [DERIVED] 0D 41 52 45 20 59 4F 55 20 53 55 52 45 3F 42 41 44 20 44 49 53 CB .byte $0D,"ARE YOU SURE?","BAD DIS",$CB ; $CB = ASCII/PETSCII K with bit 7 set: terminates "BAD DISK". BASIC4_DISK_STATUS_HELPER: 9D4A [DERIVED] 20 0A 9D JSR L_9D0A 9D4D [DERIVED] 4C 32 9D JMP L_9D32 BASIC4_CLOSE_HELPER: 9D50 [DERIVED] 98 TYA 9D51 [DERIVED] 48 PHA ; save A on stack 9D52 [DERIVED] A9 00 LDA #$00 9D54 [DERIVED] 85 90 STA STATUS ; KERNAL I/O status byte 9D56 [DERIVED] 8D 34 03 STA B4_STATE ; BusCard BASIC4 workspace/state 9D59 [DERIVED] 68 PLA ; restore/pull byte from stack 9D5A [DERIVED] A8 TAY 9D5B [DERIVED] 60 RTS ; return L_9D5C: 9D5C [DERIVED] A2 00 LDX #$00 L_9D5E: 9D5E [DERIVED] 8D 41 03 STA B4_WORK_0341 ; BusCard BASIC4 command/template length 9D61 [DERIVED] 20 50 9D JSR BASIC4_CLOSE_HELPER ; call/jump to basic4 close helper L_9D64: 9D64 [DERIVED] CE 41 03 DEC B4_WORK_0341 ; BusCard BASIC4 command/template length 9D67 [DERIVED] 30 45 BMI L_9DAE 9D69 [DERIVED] C8 INY 9D6A [DERIVED] B9 A0 99 LDA $99A0,Y 9D6D [DERIVED] 10 39 BPL L_9DA8 9D6F [DERIVED] C9 F1 CMP #$F1 9D71 [DERIVED] D0 03 BNE L_9D76 9D73 [DERIVED] 20 36 9C JSR L_9C36 L_9D76: 9D76 [DERIVED] C9 F2 CMP #$F2 9D78 [DERIVED] D0 03 BNE L_9D7D 9D7A [DERIVED] 20 43 9C JSR L_9C43 L_9D7D: 9D7D [DERIVED] C9 E0 CMP #$E0 9D7F [DERIVED] D0 05 BNE L_9D86 9D81 [DERIVED] AD 3D 03 LDA B4_WORK_033D ; BusCard BASIC4 parser/mode workspace 9D84 [DERIVED] D0 22 BNE L_9DA8 L_9D86: 9D86 [DERIVED] C9 D0 CMP #$D0 9D88 [DERIVED] D0 03 BNE L_9D8D 9D8A [DERIVED] 20 5F 9C JSR L_9C5F L_9D8D: 9D8D [DERIVED] C9 E1 CMP #$E1 9D8F [DERIVED] D0 05 BNE L_9D96 9D91 [DERIVED] 20 B9 9D JSR L_9DB9 9D94 [DERIVED] D0 12 BNE L_9DA8 L_9D96: 9D96 [DERIVED] C9 D1 CMP #$D1 9D98 [DERIVED] D0 05 BNE L_9D9F 9D9A [DERIVED] AD 3B 03 LDA B4_WORK_033B ; BusCard BASIC4 parser/device workspace 9D9D [DERIVED] 10 07 BPL L_9DA6 L_9D9F: 9D9F [DERIVED] C9 D2 CMP #$D2 9DA1 [DERIVED] D0 C1 BNE L_9D64 9DA3 [DERIVED] AD 3C 03 LDA B4_WORK_033C ; BusCard BASIC4 parser/device workspace L_9DA6: 9DA6 [DERIVED] 09 30 ORA #$30 L_9DA8: 9DA8 [DERIVED] 9D 53 03 STA B4_COMMAND_BUFFER,X ; BusCard BASIC4 constructed DOS command buffer 9DAB [DERIVED] E8 INX 9DAC [DERIVED] D0 B6 BNE L_9D64 L_9DAE: 9DAE [DERIVED] 86 B7 STX FNLEN ; filename length 9DB0 [DERIVED] A9 53 LDA #$53 9DB2 [DERIVED] 85 BB STA FNADR_LO ; filename pointer low 9DB4 [DERIVED] A9 03 LDA #$03 9DB6 [DERIVED] 85 BC STA FNADR_HI ; filename pointer high 9DB8 [DERIVED] 60 RTS ; return L_9DB9: 9DB9 [DERIVED] AD 3D 03 LDA B4_WORK_033D ; BusCard BASIC4 parser/mode workspace 9DBC [DERIVED] F0 04 BEQ L_9DC2 9DBE [DERIVED] A9 4C LDA #$4C 9DC0 [DERIVED] D0 07 BNE L_9DC9 L_9DC2: 9DC2 [DERIVED] A9 53 LDA #$53 9DC4 [DERIVED] 8D 3D 03 STA B4_WORK_033D ; BusCard BASIC4 parser/mode workspace 9DC7 [DERIVED] A9 57 LDA #$57 L_9DC9: 9DC9 [DERIVED] 60 RTS ; return ; -------------------------------------------------------------------------- ; Common parser for BASIC4 disk-command clauses. It records parsed flags, drive/ ; unit fields, disk ID and command text in the $033A-$0357 workspace. ; -------------------------------------------------------------------------- BASIC4_PARSE_DISK_CLAUSES: 9DCA [DERIVED] A2 00 LDX #$00 9DCC [DERIVED] 8E 3E 03 STX B4_WORK_033E ; BusCard BASIC4 syntax flags 9DCF [DERIVED] 86 B8 STX LA ; logical file number 9DD1 [DERIVED] 8E 3D 03 STX B4_WORK_033D ; BusCard BASIC4 parser/mode workspace 9DD4 [DERIVED] 8E 3B 03 STX B4_WORK_033B ; BusCard BASIC4 parser/device workspace 9DD7 [DERIVED] 8E 3C 03 STX B4_WORK_033C ; BusCard BASIC4 parser/device workspace 9DDA [DERIVED] 86 B7 STX FNLEN ; filename length 9DDC [DERIVED] 8E 3A 03 STX B4_WORK_033A ; BusCard BASIC4 parser workspace 9DDF [DERIVED] 8E 3F 03 STX B4_WORK_033F ; BusCard BASIC4 parser workspace 9DE2 [DERIVED] A2 08 LDX #$08 9DE4 [DERIVED] 86 BA STX FA ; current device number 9DE6 [DERIVED] 20 79 00 JSR CHRGOT ; BASIC CHRGOT routine 9DE9 [DERIVED] F0 7A BEQ L_9E65 L_9DEB: 9DEB [DERIVED] C9 23 CMP #$23 9DED [DERIVED] F0 30 BEQ L_9E1F 9DEF [DERIVED] C9 57 CMP #$57 9DF1 [DERIVED] F0 47 BEQ L_9E3A 9DF3 [DERIVED] C9 4C CMP #$4C 9DF5 [DERIVED] F0 43 BEQ L_9E3A 9DF7 [DERIVED] C9 52 CMP #$52 9DF9 [DERIVED] D0 06 BNE L_9E01 9DFB [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 9DFE [DERIVED] 4C F8 9E JMP L_9EF8 L_9E01: 9E01 [DERIVED] C9 44 CMP #$44 9E03 [DERIVED] F0 72 BEQ L_9E77 9E05 [DERIVED] C9 91 CMP #$91 9E07 [DERIVED] F0 62 BEQ L_9E6B 9E09 [DERIVED] C9 55 CMP #$55 9E0B [DERIVED] F0 64 BEQ L_9E71 9E0D [DERIVED] C9 49 CMP #$49 9E0F [DERIVED] D0 03 BNE L_9E14 9E11 [DERIVED] 4C 99 9E JMP L_9E99 L_9E14: 9E14 [DERIVED] C9 22 CMP #$22 9E16 [DERIVED] F0 50 BEQ L_9E68 9E18 [DERIVED] C9 28 CMP #$28 9E1A [DERIVED] F0 4C BEQ L_9E68 L_9E1C: 9E1C [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9E1F: 9E1F [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9E22 [DERIVED] 29 04 AND #$04 9E24 [DERIVED] D0 F6 BNE L_9E1C 9E26 [DERIVED] 20 E9 9F JSR L_9FE9 9E29 [DERIVED] E0 00 CPX #$00 9E2B [DERIVED] F0 69 BEQ L_9E96 9E2D [DERIVED] 86 B8 STX LA ; logical file number 9E2F [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9E32 [DERIVED] 09 04 ORA #$04 9E34 [DERIVED] 8D 3E 03 STA B4_WORK_033E ; BusCard BASIC4 syntax flags 9E37 [DERIVED] 4C F8 9E JMP L_9EF8 L_9E3A: 9E3A [DERIVED] AA TAX 9E3B [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9E3E [DERIVED] 29 40 AND #$40 9E40 [DERIVED] D0 DA BNE L_9E1C 9E42 [DERIVED] E0 57 CPX #$57 9E44 [DERIVED] D0 06 BNE L_9E4C 9E46 [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 9E49 [DERIVED] 4C 5A 9E JMP L_9E5A L_9E4C: 9E4C [DERIVED] 20 E9 9F JSR L_9FE9 9E4F [DERIVED] E0 00 CPX #$00 9E51 [DERIVED] F0 43 BEQ L_9E96 9E53 [DERIVED] E0 FF CPX #$FF 9E55 [DERIVED] F0 3F BEQ L_9E96 9E57 [DERIVED] 8E 3D 03 STX B4_WORK_033D ; BusCard BASIC4 parser/mode workspace L_9E5A: 9E5A [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9E5D [DERIVED] 09 40 ORA #$40 9E5F [DERIVED] 8D 3E 03 STA B4_WORK_033E ; BusCard BASIC4 syntax flags 9E62 [DERIVED] 4C F8 9E JMP L_9EF8 L_9E65: 9E65 [DERIVED] 4C 85 9F JMP L_9F85 L_9E68: 9E68 [DERIVED] 4C C2 9E JMP L_9EC2 L_9E6B: 9E6B [DERIVED] 20 8E 9F JSR L_9F8E 9E6E [DERIVED] 4C F8 9E JMP L_9EF8 L_9E71: 9E71 [DERIVED] 20 95 9F JSR L_9F95 9E74 [DERIVED] 4C F8 9E JMP L_9EF8 L_9E77: 9E77 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9E7A [DERIVED] 29 10 AND #$10 9E7C [DERIVED] D0 9E BNE L_9E1C 9E7E [DERIVED] 20 E9 9F JSR L_9FE9 9E81 [DERIVED] E0 02 CPX #$02 9E83 [DERIVED] B0 11 BCS L_9E96 9E85 [DERIVED] 8E 3B 03 STX B4_WORK_033B ; BusCard BASIC4 parser/device workspace 9E88 [DERIVED] 8E 3C 03 STX B4_WORK_033C ; BusCard BASIC4 parser/device workspace 9E8B [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9E8E [DERIVED] 09 10 ORA #$10 9E90 [DERIVED] 8D 3E 03 STA B4_WORK_033E ; BusCard BASIC4 syntax flags 9E93 [DERIVED] 4C F8 9E JMP L_9EF8 L_9E96: 9E96 [DERIVED] 4C 89 9F JMP L_9F89 L_9E99: 9E99 [DERIVED] AD 3D 03 LDA B4_WORK_033D ; BusCard BASIC4 parser/mode workspace 9E9C [DERIVED] 29 FF AND #$FF 9E9E [DERIVED] F0 03 BEQ L_9EA3 9EA0 [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9EA3: 9EA3 [DERIVED] A0 00 LDY #$00 9EA5 [DERIVED] A2 00 LDX #$00 L_9EA7: 9EA7 [DERIVED] E6 7A INC $7A 9EA9 [DERIVED] D0 02 BNE L_9EAD 9EAB [DERIVED] E6 7B INC $7B L_9EAD: 9EAD [DERIVED] B1 7A LDA ($7A),Y 9EAF [DERIVED] 9D 3F 03 STA B4_WORK_033F,X ; BusCard BASIC4 parser workspace 9EB2 [DERIVED] E8 INX 9EB3 [DERIVED] E0 02 CPX #$02 9EB5 [DERIVED] 90 F0 BCC L_9EA7 9EB7 [DERIVED] A9 FF LDA #$FF 9EB9 [DERIVED] 8D 3D 03 STA B4_WORK_033D ; BusCard BASIC4 parser/mode workspace 9EBC [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 9EBF [DERIVED] 4C F8 9E JMP L_9EF8 L_9EC2: 9EC2 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9EC5 [DERIVED] 29 01 AND #$01 9EC7 [DERIVED] 20 AB 9F JSR L_9FAB 9ECA [DERIVED] 85 B7 STA FNLEN ; filename length 9ECC [DERIVED] 8D 41 03 STA B4_WORK_0341 ; BusCard BASIC4 command/template length 9ECF [DERIVED] A9 42 LDA #$42 9ED1 [DERIVED] 85 BB STA FNADR_LO ; filename pointer low 9ED3 [DERIVED] A9 03 LDA #$03 9ED5 [DERIVED] 85 BC STA FNADR_HI ; filename pointer high 9ED7 [DERIVED] A0 00 LDY #$00 L_9ED9: 9ED9 [DERIVED] B1 22 LDA ($22),Y 9EDB [DERIVED] C0 00 CPY #$00 9EDD [DERIVED] D0 08 BNE L_9EE7 9EDF [DERIVED] C9 40 CMP #$40 9EE1 [DERIVED] D0 04 BNE L_9EE7 9EE3 [DERIVED] E6 BB INC FNADR_LO ; filename pointer low 9EE5 [DERIVED] C6 B7 DEC FNLEN ; filename length L_9EE7: 9EE7 [DERIVED] 99 42 03 STA $0342,Y 9EEA [DERIVED] C8 INY 9EEB [DERIVED] CC 41 03 CPY B4_WORK_0341 ; BusCard BASIC4 command/template length 9EEE [DERIVED] 90 E9 BCC L_9ED9 9EF0 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9EF3 [DERIVED] 09 01 ORA #$01 9EF5 [DERIVED] 8D 3E 03 STA B4_WORK_033E ; BusCard BASIC4 syntax flags L_9EF8: 9EF8 [DERIVED] 20 79 00 JSR CHRGOT ; BASIC CHRGOT routine 9EFB [DERIVED] D0 03 BNE L_9F00 9EFD [DERIVED] 4C 65 9E JMP L_9E65 L_9F00: 9F00 [DERIVED] C9 2C CMP #$2C 9F02 [DERIVED] D0 06 BNE L_9F0A 9F04 [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 9F07 [DERIVED] 4C EB 9D JMP L_9DEB L_9F0A: 9F0A [DERIVED] C9 91 CMP #$91 9F0C [DERIVED] D0 03 BNE L_9F11 9F0E [DERIVED] 4C 6B 9E JMP L_9E6B L_9F11: 9F11 [DERIVED] C9 A4 CMP #$A4 9F13 [DERIVED] F0 03 BEQ L_9F18 9F15 [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9F18: 9F18 [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 9F1B [DERIVED] C9 44 CMP #$44 9F1D [DERIVED] F0 13 BEQ L_9F32 9F1F [DERIVED] C9 91 CMP #$91 9F21 [DERIVED] F0 2B BEQ L_9F4E 9F23 [DERIVED] C9 55 CMP #$55 9F25 [DERIVED] F0 2D BEQ L_9F54 9F27 [DERIVED] C9 22 CMP #$22 9F29 [DERIVED] F0 2F BEQ L_9F5A 9F2B [DERIVED] C9 28 CMP #$28 9F2D [DERIVED] F0 2B BEQ L_9F5A L_9F2F: 9F2F [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9F32: 9F32 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9F35 [DERIVED] 29 20 AND #$20 9F37 [DERIVED] D0 F6 BNE L_9F2F 9F39 [DERIVED] 20 E9 9F JSR L_9FE9 9F3C [DERIVED] E0 02 CPX #$02 9F3E [DERIVED] B0 49 BCS L_9F89 9F40 [DERIVED] 8E 3C 03 STX B4_WORK_033C ; BusCard BASIC4 parser/device workspace 9F43 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9F46 [DERIVED] 09 20 ORA #$20 9F48 [DERIVED] 8D 3E 03 STA B4_WORK_033E ; BusCard BASIC4 syntax flags 9F4B [DERIVED] 4C 71 9F JMP L_9F71 L_9F4E: 9F4E [DERIVED] 20 8E 9F JSR L_9F8E 9F51 [DERIVED] 4C 71 9F JMP L_9F71 L_9F54: 9F54 [DERIVED] 20 95 9F JSR L_9F95 9F57 [DERIVED] 4C 71 9F JMP L_9F71 L_9F5A: 9F5A [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9F5D [DERIVED] 29 02 AND #$02 9F5F [DERIVED] 20 AB 9F JSR L_9FAB 9F62 [DERIVED] 8D 3A 03 STA B4_WORK_033A ; BusCard BASIC4 parser workspace 9F65 [DERIVED] 86 FD STX $FD 9F67 [DERIVED] 84 FE STY $FE 9F69 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9F6C [DERIVED] 09 02 ORA #$02 9F6E [DERIVED] 8D 3E 03 STA B4_WORK_033E ; BusCard BASIC4 syntax flags L_9F71: 9F71 [DERIVED] 20 79 00 JSR CHRGOT ; BASIC CHRGOT routine 9F74 [DERIVED] F0 0F BEQ L_9F85 9F76 [DERIVED] C9 2C CMP #$2C 9F78 [DERIVED] F0 9E BEQ L_9F18 9F7A [DERIVED] C9 91 CMP #$91 9F7C [DERIVED] F0 D0 BEQ L_9F4E 9F7E [DERIVED] C9 55 CMP #$55 9F80 [DERIVED] F0 D2 BEQ L_9F54 L_9F82: 9F82 [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9F85: 9F85 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9F88 [DERIVED] 60 RTS ; return L_9F89: 9F89 [DERIVED] A2 0E LDX #$0E 9F8B [DERIVED] 4C 37 A4 JMP $A437 L_9F8E: 9F8E [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine 9F91 [DERIVED] C9 55 CMP #$55 9F93 [DERIVED] D0 ED BNE L_9F82 L_9F95: 9F95 [DERIVED] 20 E9 9F JSR L_9FE9 9F98 [DERIVED] E0 20 CPX #$20 9F9A [DERIVED] B0 ED BCS L_9F89 9F9C [DERIVED] E0 04 CPX #$04 9F9E [DERIVED] 90 E9 BCC L_9F89 9FA0 [DERIVED] 86 BA STX FA ; current device number 9FA2 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9FA5 [DERIVED] 09 08 ORA #$08 9FA7 [DERIVED] 8D 3E 03 STA B4_WORK_033E ; BusCard BASIC4 syntax flags 9FAA [DERIVED] 60 RTS ; return L_9FAB: 9FAB [DERIVED] D0 D5 BNE L_9F82 9FAD [DERIVED] 20 9E AD JSR C64_BASIC_FRMEVL ; evaluate BASIC expression 9FB0 [DERIVED] 20 A3 B6 JSR $B6A3 9FB3 [DERIVED] AA TAX 9FB4 [DERIVED] C9 00 CMP #$00 9FB6 [DERIVED] F0 D1 BEQ L_9F89 9FB8 [DERIVED] C9 12 CMP #$12 9FBA [DERIVED] B0 1A BCS L_9FD6 9FBC [DERIVED] A0 00 LDY #$00 9FBE [DERIVED] B1 22 LDA ($22),Y 9FC0 [DERIVED] C9 40 CMP #$40 9FC2 [DERIVED] D0 0A BNE L_9FCE 9FC4 [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9FC7 [DERIVED] 29 80 AND #$80 9FC9 [DERIVED] F0 10 BEQ L_9FDB 9FCB [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9FCE: 9FCE [DERIVED] 8A TXA 9FCF [DERIVED] C9 11 CMP #$11 9FD1 [DERIVED] B0 03 BCS L_9FD6 9FD3 [DERIVED] 4C E4 9F JMP L_9FE4 L_9FD6: 9FD6 [DERIVED] A2 17 LDX #$17 9FD8 [DERIVED] 4C 37 A4 JMP $A437 L_9FDB: 9FDB [DERIVED] AD 3E 03 LDA B4_WORK_033E ; BusCard BASIC4 syntax flags 9FDE [DERIVED] 09 80 ORA #$80 9FE0 [DERIVED] 8D 3E 03 STA B4_WORK_033E ; BusCard BASIC4 syntax flags 9FE3 [DERIVED] 8A TXA L_9FE4: 9FE4 [DERIVED] A6 22 LDX $22 9FE6 [DERIVED] A4 23 LDY $23 9FE8 [DERIVED] 60 RTS ; return L_9FE9: 9FE9 [DERIVED] 20 73 00 JSR CHRGET ; BASIC CHRGET routine L_9FEC: 9FEC [DERIVED] D0 03 BNE L_9FF1 9FEE [DERIVED] 4C 08 AF JMP C64_BASIC_SYNTAX_ERROR ; BASIC syntax error L_9FF1: 9FF1 [DERIVED] 90 09 BCC L_9FFC 9FF3 [DERIVED] 20 FA AE JSR $AEFA 9FF6 [DERIVED] 20 9E B7 JSR C64_BASIC_GETBYT ; convert BASIC numeric argument to byte 9FF9 [DERIVED] 4C F7 AE JMP $AEF7 L_9FFC: 9FFC [DERIVED] 4C 9E B7 JMP C64_BASIC_GETBYT ; convert BASIC numeric argument to byte 9FFF [DERIVED] 00 .byte $00 ; final byte of relocated block INTERPRETIVE NOTES / CROSS-REFERENCE ============================================================================== 1. U1 contains three quite distinct things: the monitor/low-level drivers, a resident KERNAL overlay, and a relocatable BASIC command extension. This explains why a naive linear disassembly produces large regions that appear nonsensical. 2. The resident $EC00-$EFFF window deliberately occupies the C64 KERNAL serial I/O area. The ROM retains stock keyboard/editor tables and several stock compatibility routines, but replaces/redirects serial entrypoints so device traffic can be sent through IEEE-488 or the parallel interface according to the BusCard switch selection. 3. The built-in extension is a DOS-wedge/BASIC4-style command set. The presence of these 15 keywords in U1 should not be confused with the separate sockets U13/U14/U15, which the BusCard hardware can bank as an optional 24K ROM set. 4. The keyword set strongly overlaps Commodore PET/CBM BASIC 4.0 disk commands. The Zimmers PET BASIC 4.0 disassembly was used only as a semantic comparison; the code listing here comes from the attached BusCard U1 image itself. 5. Labels such as BUSCARD_IO_ROUTINE_A7D3 are intentionally conservative where the exact original routine name/function cannot be proved solely from the ROM. Hardware register accesses and call relationships are still shown inline so those routines can be refined in a future pass or tested under emulation. End of listing.