;DAVISGW ROM Disassembly ;Reassemble with A65 at https://osi.marks-lab.com/software/tools.html ; RAM locations used by BASIC ROM & system ROM ;$200 - cursor pos ;$201 - save char under cursor ;$202 - temp storage for char to be printed ;$203 - load flag $80 = serial ;$204 - (temp) ;$205 - save flag $0 = NOT save mode ;$206 - repeat rate for CRT routine ;$207-$20E part of scroll routine (video dependent) LDA $D700,Y STA $D700,Y INY RTS ;$20F - $211 not used ;$212 - ctrl-c flag ;$213 = temp storage for KB calculations ;$214 = debounce/repeat counter ;$215 = current key pressed ;$216 = last key pressed *=$F800 SFFB8=$FFB8 ; RAM at $F400+ LF400=$F400 ;Something at $D400,$D401 ;possible line editor code follows LF800 CPY LF400+$E BEQ LF819 STY LF400 STY LF400+$E LDY $D400 STY LF400+$F CPY LF400+$F BEQ LF819 LDY #$00 RTS LF819 PHA STY $0200 LDY $E0 STY LF400+$2 ;store $E0,$E1 @ F402+ LDY $E1 STY LF400+$3 LDY LF400+$8 ;replace $E0,E1 with F408+ STY $E0 LDY LF400+$9 STY $E1 LDX #$C2 CPX $08F4 ;? test $08F4,08F5 for $BFC2 BNE LF83F ; probably meant to be $F408, F409 LDX #$BF CPX $08F5 ;? BEQ LF84C LF83F TAX LDA LF400 AND #$DF STA LF400 TXA JMP LF8B2 LF84C LDX #$FE STX $DF00 ;select row 0 LDX $DF00 CPX #$DE ;test shiftlock+ESC BNE LF877 CMP #$5F ;'_ BEQ LF8A2 LDA LF400+$1 STA $0202 LDY #$01 LDA ($E0),Y STA LF400+$1 LDA #$0C JSR SF95D LDY #$00 LDA $0202 STA ($E0),Y BNE LF8A2 LF877 LDX #$BF STX $DF00 ;select row 6 LDX $DF00 CPX #$FB ;test for RUB OUT BNE LF8B2 CMP #$5F ;'_ BEQ LF8A2 LDA LF400+$1 STA $0202 DEC $E0 LDY #$00 LDA ($E0),Y STA LF400+$1 LDA #$08 JSR SF95D LDY #$01 LDA $0202 STA ($E0),Y LF8A2 LDA LF400+$1 STA $0201 LDA LF400 ORA #$20 STA LF400 BNE LF924 LF8B2 CMP #$5F BEQ LF924 CMP $0202 BNE LF8C7 LDA $0201 CMP $0202 BEQ LF8C7 CMP #$20 BEQ LF924 LF8C7 LDA #$0D CMP $0202 BNE LF8E2 LDY LF400 BMI LF91C JSR SF95D LDA LF400 AND #$40 ORA #$80 STA LF400 BMI LF924 LF8E2 LDA #$0A CMP $0202 BNE LF8FB BIT LF400 BVS LF91C JSR SF95D LDA LF400 ORA #$40 STA LF400 BNE LF924 LF8FB LDA LF400 AND #$20 BEQ LF90E LDY #$01 LDA ($E0),Y STA LF400+$1 STA $0201 BNE LF916 LF90E LDA #$20 STA $0201 STA LF400+$1 LF916 LDA $0202 JSR SF95D LF91C LDA LF400 AND #$20 STA LF400 LF924 LDA LF400+$2 STA $E0 LDA LF400+$3 STA $E1 PLA TAX LDA LF400 AND #$20 BNE LF953 TSX LF938 INX LDY $0100,X DEY DEY LDA $BF00,Y CMP #$20 BNE LF94E INX LDA $0100,X CMP #$BF BEQ LF938 DEX LF94E DEX TXS JMP $BF6D ;(pulls Y,X,A from stack & RTS) LF953 PLA PLA TXA LDX $0200 ;current cursor pos LDY $FFE2 ;0=1K, 1=2K video RTS SF95D STA $D401 JSR SFF3B ;(jmp $E000?) LDX #$0A LF965 LDY #$FF LF967 DEY BNE LF967 LDA $F40F ROL A BMI LF979 LDA $D400 ROL A BPL LF979 DEX BNE LF965 LF979 RTS .BYTE $FF, $FF, $FF, $FF, $FF, $FF LF980 LDA #$00 ;init DISK PIA STA $C001 STA $C003 LDA #$40 STA $C000 LDA #$FF STA $C002 LDA #$04 STA $C001 STA $C003 LDA #$03 ;Init Disk ACIA STA $C010 LDA #$58 STA $C010 LF9A4 LDY #$FF LF9A6 INY LDA LF9E9,Y ;display start menu BMI LF9B7 LF9AC JSR $BF2D ;BASIC screen print CMP #$0D BNE LF9A6 ;write <LF> after <CR> LDA #$0A BNE LF9AC LF9B7 JSR SFFBA ;get input (usually keyboard) STA $20 LDY #$00 LDX #$30 LF9C0 CPX $20 BEQ LF9CD ;match digit entered to menu index CPY #$10 ;y/2 entries BEQ LF9A4 ;invalid entry, start over INX INY ;Y+2 INY BNE LF9C0 LF9CD LDA LF9D7,Y ;load routine start address HI & LO-1 PHA INY LDA LF9D7,Y ;push onto stack PHA RTS ;execute via RTS LF9D7 ;entry points for menu items -1 ; Warm Start, Cold Start, WP6502?, Disk Boot, 65V Mon, Exmon?, EpromW?, MemTest?, DOS/65? .DBYTE $FFFF, $BD11-1, $97B4-1, $FC00-1, $FE00-1, $E800-1, $E150-1,$E200-1,$E340-1 LF9E9 .BYTE $0D .BYTE 'System Menu',$0D .BYTE '0 - Warmstart',$0D .BYTE '1 - BASIC',$0D .BYTE '2 - WP6502',$0D .BYTE '3 - Boot DOS',$0D .BYTE '4 - Monitor',$0D .BYTE '5 - Ext. Monitor',$0D .BYTE '6 - EPROM Writer',$0D .BYTE '7 - Mem. Test',$0D .BYTE '8 - DOS/65',$0D .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF LFA80 PHA LDX #$05 LFA83 LDY #$FF LFA85 DEY BNE LFA85 DEX BNE LFA83 TSX PLA PLA CMP #$F0 BNE LFAAF PLA CMP #$04 BNE LFAAF PLA CMP $D8 BCS LFAAF LDA $C000 AND #$02 BNE LFAAF LDA $D8 BPL LFAAB LDA #$80 BMI LFAAD LFAAB LDA #$00 LFAAD STA $D8 LFAAF TXS PLA LDX #$00 LDY #$00 RTS .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ; originally $FF00 page ROM routine for a C2/C4 540 Video & cassette system LFB00 CLD LDX #$28 TXS JSR $BF22 ;init ACIA 8N2/16 irq set in BASIC ROM LDY #$00 STY $0212 STY $0203 STY $0205 STY $0206 LDA $FFE0 STA $0200 LDA #$20 ;erase 2K screen LFB1D STA $D700,Y STA $D600,Y STA $D500,Y STA $D400,Y STA $D300,Y STA $D200,Y STA $D100,Y STA $D000,Y INY BNE LFB1D LFB38 LDA $FF5F,Y ;display "C/W/M ?" prompt BEQ LFB43 JSR $BF2D ;BASIC Screen print routine INY BNE LFB38 LFB43 JSR SFFB8 CMP #$4D BNE LFB4D JMP LFE00 LFB4D CMP #$57 ;'W BNE LFB54 JMP $0000 ;Warmstart vector LFB54 CMP #$43 ;'C BNE LFB00 LDA #$00 TAX TAY JMP $BD11 ;BASIC cold start entry .BYTE 'C/W/M ?',0 LFB67 JSR $BF2D ;BASIC Screen print routine PHA LDA $0205 ;test save flag BEQ LFB92 PLA JSR $BF15 ;send to C2 ACIA CMP #$0D BNE LFB93 PHA ;during save on output of <CR> write 10 NULs padding TXA PHA LDX #$0A LDA #$00 LFB7F JSR $BF15 DEX BNE LFB7F PLA TAX PLA RTS LFB89 PHA DEC $0203 LDA #$00 ;disable save flag LFB8F STA $0205 LFB92 PLA LFB93 RTS LFB94 PHA LDA #$01 BNE LFB8F LDA $0212 BNE LFBB7 LDA #$01 STA $DF00 ;select row 0 on C2 keyboard BIT $DF00 BVC LFBB7 ;test for CTRL keypress LDA #$04 STA $DF00 ;select row 3 on keyboard BIT $DF00 BVC LFBB7 ;Test for 'C' keypress LDA #$03 ;CTRL-C detected! JMP $A636 LFBB7 RTS LFBB8 BIT $0203 BPL LFBD6 LFBBD LDA #$02 ;select row 2 on C2 keyboard STA $DF00 LDA #$10 ;test for space bar pressed BIT $DF00 ;branch if pressed BNE LFBD3 ;test for character ready from C2ACIA LDA LFC00 LSR A BCC LFBBD ;load character from C2 ACIA LDA LFC00+1 RTS LFBD3 INC $0203 LFBD6 JMP LFEED .BYTE 00,00,00,00,00,00,00 LFBE0 .BYTE $40,$3F,$01 ;cursor start @ $40, line len-1 $3F, 01 = 2K video flag .BYTE $00,$03 ;default BASIC workspace lower bounds .BYTE $FF,$3F ;default BASIC workspace upper bounds .BYTE $00,$03 ;variable workspace lower bounds .BYTE $FF,$3F ;variable workspace upper bounds LFBEB JMP SFFB8 ;input vector LFBEE JMP LFF67 ;output vector LFBF1 JMP LFF99 ;control-C check vector LFBF4 JMP LFF89 ;load vector LFBF7 JMP LFF94 ;save vector .BYTE $30,$01 ;<NMI> .BYTE $00,$FF ;<RESET> .BYTE $C0,$01 ;<IRQ> ;C1P Disk Boot Routine at $FC00 LFC00 JSR SFC0C ;load track 0 from disk at specified address (usually $2200 JMP ($00FD) ;execute loaded track LFC06 JSR SFC0C ;load track 0 from disk JMP LFE00 ;jump to monitor SFC0C LDY #$00 ;init disk controller STY $C001 ;select DDRA. STY $C000 ;0's in DDRA indicate input. LDX #$04 STX $C001 ;select PORTA STY $C003 ;select DDRB DEY STY $C002 ;1's in DDRB indicate output. STX $C003 ;select PORT B STY $C002 ;make all outputs high LDA #$FB BNE LFC33 ;step to track +1 LFC2A LDA #$02 BIT $C000 ;track 0 enabled? BEQ LFC4D LDA #$FF ;step down to 0 LFC33 STA $C002 JSR SFCA5 ;(short delay) AND #$F7 ;step on STA $C002 JSR SFCA5 ;(short delay) ORA #$08 STA $C002 ;step off LDX #$18 JSR SFC91 ;delay BEQ LFC2A LFC4D LDX #$7F ;load head STX $C002 JSR SFC91 ;delay LFC55 LDA $C000 BMI LFC55 ;wait for index start LFC5A LDA $C000 BPL LFC5A ;wait for index end LDA #$03 STA $C010 ;reset disk ACIA LDA #$58 STA $C010 ;/1 RTS hi, no irq JSR SFC9C STA $FE ;read start addr hi TAX JSR SFC9C STA $FD ;read start addr lo JSR SFC9C STA $FF ;read num pages LDY #$00 LFC7B JSR SFC9C STA ($FD),Y ;read the specified num pages INY BNE LFC7B INC $FE DEC $FF BNE LFC7B STX $FE LDA #$FF STA $C002 ;disable drive RTS SFC91 JMP LFA80 ;loop for delay .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF SFC9C LDA $C010 ;read byte from disk LSR A BCC SFC9C LDA $C011 SFCA5 RTS SFCA6 LDA #$03 STA $F000 ;put ACIA in RESET state JMP LFCD5 ; LFCAE NOP ; NOP NOP SFCB1 PHA ;wait & output to ACIA LFCB2 LDA $F000 ;ACIA @ $F000 LSR A LSR A BCC LFCB2 PLA STA $F001 RTS SFCBE EOR #$FF ;Set KB ROW STA $DF00 EOR #$FF RTS SFCC6 PHA ;read keyboard, return value in X, preserve other registers JSR SFCCF TAX PLA DEX INX RTS SFCCF LDA $DF00 ;load KB Col EOR #$FF RTS LFCD5 ;test ACIA CTS line, if set set baud to 4800? if clear, set to 300bps LDA $F000 LSR A LSR A LSR A LSR A BCC LFCE4 ;test for CTS LDA #$10 ;8N2 /1 RTSNOIRQ LFCE0 STA $F000 RTS LFCE4 LDA #$11 ;8N2 /16 RTSNOIRQ BNE LFCE0 .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF LFD00 TXA PHA TYA PHA LFD04 LDA #$01 ;recheck for keypress LFD06 JSR SFCBE ;invert & store value for C1P key row JSR SFCC6 ;read and invert C1P value, return in X BNE LFD13 ;branch if key detected LFD0E ASL A BNE LFD06 ;shift row until done BEQ LFD66 ;branch because no key pressed LFD13 LSR A BCC LFD1F ;was this row 0? branch if not ROL A ;restore row in A CPX #$21 ;was this ESC key? BNE LFD0E LDA #$1B ;yup set ESC key value BNE LFD40 ;branch to key set LFD1F JSR SFDC8 ;convert bit set in A to value 0-7 in Y TYA STA $0213 ASL A ;multiply by 8 ASL A ASL A SEC SBC $0213 ;subtract 1 (= *7) STA $0213 ;store row*7 in 0213 TXA LSR A JSR SFDC8 ;get key position index in Y BNE LFD66 ;if more than 1 key pressed pretend no key pressed CLC TYA ADC $0213 ;add col index to row*7 value TAY LDA LFDCF,Y ;load key value from table LFD40 CMP $0215 ;same as last time? BNE LFD6B ;branch if not DEC $0214 ;still counting down? BEQ LFD75 ;branch if done LDY #$05 ;loop for a while LFD4C LDX #$C8 ;eating CPU cycles LFD4E DEX BNE LFD4E ;loop DEY BNE LFD4C ;loop BEQ LFD04 ;done with delay loop, branch always to retest keypress LFD56 CMP #$01 BEQ LFD8F LDY #$00 CMP #$02 BEQ LFDA7 ;branch if left shift LDY #$C0 CMP #$20 BEQ LFDA7 LFD66 LDA #$00 ;clear previous keypress STA $0216 LFD6B STA $0215 ;new keypress detected LDA #$02 ;short debounce retest STA $0214 BNE LFD04 LFD75 LDX #$96 ;done waiting, longer autorepeat delay value CMP $0216 ;test flag: is auto repeat engaged? BNE LFD7E LDX #$14 ;yes, short autorepeat delay LFD7E STX $0214 STA $0216 ;current key store LDA #$01 JSR SFCBE ;select row 0 JSR SFCCF ;read row LFD8C LSR A ;shift value down to test bit 0 BCC LFDC2 ;is capslock set? branch if not LFD8F TAX ;save row 0 value in X AND #$03 BEQ LFD9F ;any shift keys pressed? if not, branch LDY #$10 ;apply shift key LDA $0215 BPL LFDA7 ;was the keyboard key a shiftable key (hi bit set?) LDY #$F0 ;yes subtract $10 ($31+$F0=$21 "1"->"!") BNE LFDA7 LFD9F LDY #$00 ;no shifted value CPX #$20 ;was row0 key CTRL? BNE LFDA7 LDY #$C0 ;apply CTRL modifier LFDA7 LDA $0215 AND #$7F CMP #$20 BEQ LFDB7 ;no modifier for spacebar STY $0213 CLC ADC $0213 ;apply key modifier LFDB7 STA $0213 PLA ;restore Y & X TAY PLA TAX LDA $0213 ;reload key value RTS ;exit with current keypress LFDC2 BNE LFD56 LDY #$20 BNE LFDA7 SFDC8 LDY #$08 LFDCA DEY ASL A BCC LFDCA RTS ;keyboard key lookup table 7x7 (row 0 contains mostly modifier keys, no lookup) LFDCF .BYTE $D0,$BB,'/ ZAQ' ;row 1 .BYTE ',MNBVCX' ;row 2 .BYTE 'KJHGFDS' ;row 3 .BYTE 'IUYTREW' ;row 4 .BYTE $00,$00,$0D,$0A,'OL.' ;row 5 .BYTE $00,$FF,$2D,$BA,$30,$B9,$B8 ;row 6 .BYTE $B7,$B6,$B5,$B4,$B3,$B2,$B1 ;row 7 ;$FE00 Standard 65V monitor for C1 ;$FB = load flag 0=input from keyboard ;$FC = current value ;$FD = not written but temporarily hex value copied to screen between addr & value ;$FE = current address low ;$FF = current address high LFE00 LDX #$28 TXS CLD NOP NOP NOP NOP NOP NOP NOP NOP LDX #$D4 ;end page of screen clear LDA #$D0 ;start page of screen clear STA $FF LDA #$00 STA $FE STA $FB TAY LDA #$20 LFE1B STA ($FE),Y ;erase screen INY BNE LFE1B INC $FF CPX $FF BNE LFE1B ;loop until done STY $FF ;set initial address to 0000 BEQ LFE43 LFE2A JSR SFEE9 ;get key from input (KB or ACIA) CMP #'/ BEQ LFE4F CMP #'G BEQ LFE4C CMP #'L BEQ LFE7C ;set load flag JSR SFE93 BMI LFE2A LDX #$02 JSR SFEDA LFE43 LDA ($FE),Y STA $FC JSR SFEAC BNE LFE2A LFE4C JMP ($00FE) ;monitor "GO" command LFE4F JSR SFEE9 CMP #$2E BEQ LFE2A CMP #$0D BNE LFE69 INC $FE BNE LFE60 INC $FF LFE60 LDY #$00 LDA ($FE),Y ;read value from memory STA $FC JMP LFE77 LFE69 JSR SFE93 BMI LFE4F LDX #$00 JSR SFEDA LDA $FC STA ($FE),Y LFE77 JSR SFEAC BNE LFE4F LFE7C STA $FB ;(load flag for monitor) BEQ LFE4F LFE80 LDA $F000 ;wait for character from ACIA LSR A BCC LFE80 LDA $F001 ;input from ACIA NOP NOP NOP AND #$7F ;mask hi bit RTS .BYTE $00,$00,$00,$00 SFE93 CMP #$30 ;convert HEX to binary nibble lo or $80 on err BMI LFEA9 CMP #$3A ;': BMI LFEA6 CMP #$41 ;'A BMI LFEA9 CMP #$47 ;'G BPL LFEA9 SEC SBC #$07 LFEA6 AND #$0F RTS LFEA9 LDA #$80 RTS SFEAC LDX #$03 ;display hex address to screen LDY #$00 ;y=starting position offset on screen LFEB0 LDA $FC,X ;write hex byte to screen * 4 in reverse order LSR A LSR A LSR A LSR A JSR SFECA ;lo nibble hex out on screen (hi part 1st) LDA $FC,X JSR SFECA ;lo nibble hex out on screen DEX BPL LFEB0 LDA #$20 ; (blank out 2 characters after address) STA $D0CA STA $D0CB RTS SFECA AND #$0F ;display low nibble of A as hex in next position on screen ORA #$30 CMP #$3A BMI LFED5 CLC ADC #$07 LFED5 STA $D0C6,Y ;address of screen memory for display INY RTS SFEDA LDY #$04 ;shift in low nibble as address on screen ASL A ASL A ASL A ASL A ;shift nibble down LFEE0 ROL A ROL $FC,X ;shift in bits of current address ROL $FD,X DEY BNE LFEE0 ;*4 bits RTS SFEE9 LDA $FB ;flag load from keyboard or serial BNE LFE80 LFEED JMP LFD00 ;BASIC I/O init table for $0218+ C1P I/O vectors INITTBL .WORD SFFBA ;$FFBA (input routine) .WORD LFF69 ;$FF69 (output routine) .WORD LFF9B ;$FF9B (ctrl-c check routine) .WORD LFF8B ;$FF8B (LOAD routine) .WORD LFF96 ;$FF96 (SAVE routine) .BYTE $30, $01 ; IRQ when mapped to $FFxx .BYTE $00, $FE ; RESET when mapped to $FFxx .BYTE $C0, $01 ; NMI when mapped to $FFxx LFF00 ;C1P RESET_HANDLER CLD LDX #$28 TXS LDY #$0A LFF06 LDA INITTBL-1,Y ;$FEEF,Y STA $0217,Y ;initialize BASIC I/O vectors $0218-$0220 DEY BNE LFF06 JSR SFCA6 ;reset ACIA STY $0212 ;ctrl-c check flag STY $0203 ;load flag $FF = input from serial STY $0205 ;save flag $0 = NOT save mode STY $0206 ;delay for CRT routine LDA $FFE0 STA $0200 ;start column for basic screen print LDA #$20 LFF26 STA $D300,Y ;erase 1K screen STA $D200,Y STA $D100,Y STA $D000,Y INY BNE LFF26 JMP LF980 LFF38 JMP LF800 SFF3B JMP $E000 .BYTE $FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF LFF67 .BYTE $FF,$00 LFF69 JSR $BF2D ;BASIC screen print PHA LDA $0205 ;save flag $0 = NOT save mode BEQ LFF94 PLA JSR SFCB1 ;output to ACIA CMP #$0D ;test for <CR> BNE LFF95 PHA TXA PHA LDX #$0A ;write 10 NULs LDA #$00 LFF81 JSR SFCB1 ;output to ACIA DEX BNE LFF81 PLA TAX LFF89 PLA RTS LFF8B PHA DEC $0203 LDA #$00 LFF91 STA $0205 LFF94 PLA LFF95 RTS LFF96 PHA LDA #$01 LFF99 BNE LFF91 LFF9B LDA $0212 ;test CTRL-C check disabled? BNE LFFB9 LDA #$FE STA $DF00 ;sel row 0 BIT $DF00 ;test for CTRL key pressed BVS LFFB9 ;not pressed, branch LDA #$FB STA $DF00 ;sel row 2 BIT $DF00 ;test for 'C' key? BVS LFFB9 ;not pressed, branch LDA #$03 JMP $A636 LFFB9 RTS SFFBA BIT $0203 ;test input from serial? BPL LFFD8 ;no, branch LFFBF LDA #$FD STA $DF00 ;sel row 1 LDA #$10 BIT $DF00 ;test for space-bar BEQ LFFD5 LDA $F000 ;wait for ACIA char LSR A BCC LFFBF LDA $F001 ;load from ACIA RTS LFFD5 INC $0203 ;disable load from serial flag LFFD8 JMP LFD00 ;jump to keyboard scan .BYTE $FF, $FF, $FF, $FF, $FF LFFE0 .BYTE $65, $17, $00 ;cursor start @ $65, line len-1 $17, 0 = 1K video flag .BYTE $00, $03 ;default BASIC workspace lower bounds ($0079,$7A) .BYTE $FF, $9F ;default BASIC workspace upper bounds ($0085,$86) .BYTE $00, $03 ;variable workspace lower bounds .BYTE $FF, $9F ;variable workspace upper bounds LFFEB JMP ($0218) ;input vector LFFEE JMP ($021A) ;output vector LFFF1 JMP ($021C) ;control-C check vector LFFF4 JMP ($021E) ;load vector LFFF7 JMP ($0220) ;save vector .BYTE $30, $01 ;NMI .WORD LFF00 ;RESET .BYTE $C0, $01 ;IRQ