;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