;DAVISGW C1p_Dos65MonitorSP 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
;DOS/65 BOOT LOADER
LF800 LDX #$FF
TXS
CLD
SEI
LDX #$04 ;erase 1K screen
LDA #$D3
STA $01
LDY #$00
STY $00
LDA #$20
LF811 STA ($00),Y
INY
BNE LF811
INC $01
DEX
BNE LF811
LF81B LDA LF8BD,X ;displays 'DOS/65 V2.0' on screen
STA $D385,X
INX
CPX #$0B
BNE LF81B
LDA #$40
LDY #$00
LDX #$04
STY $C001 ;initialize DISK PIA
STA $C000
STX $C001
STA $C000
STY $C003
DEY
STY $C002
STX $C003
STY $C002
JSR SF8CE
JSR SF93C ;look for start of track header
BNE LF8AB ;branch to ERROR abort
LF84D JSR SF977 ;Disk IN
CMP #$76 ;look for start of sector marker
BNE LF84D
JSR SF977 ;Disk IN
CMP #$01 ;look for sector 1
BNE LF8AB
JSR SF977 ;Disk IN
CMP #$08 ;look for 8 page sector
BNE LF8AB
LDX #$00
LF864 LDA #$01
LF866 BIT $C010 ;[read disk data to $00-$ff]
BEQ LF866
LDA $C011
BVS LF8AB ;On Parity ERROR, abort
STA $00,X
INX
BPL LF864
LF875 JSR SF99E ;[read 8page track data into memory @ 0300]
BCS LF8AB ;on error abort
LF87A JSR SF981
LDY #$00 ;move data in memory
LF87F LDA ($07),Y
STA ($00),Y
INY
BPL LF87F
CLC
TYA
ADC $00
STA $00
BCC LF890
INC $01
LF890 DEC $04
BEQ LF8A8
INC $06
LDA $06
CMP $05
BEQ LF87A
BCC LF87A
LDA #$01
STA $06
JSR SF8ED
JMP LF875
LF8A8 JMP ($0002)
LF8AB JSR SF933 ;unload head
LDX #$00
LF8B0 LDA LF8C8,X ;display ERROR! on screen
STA $D385,X
INX
CPX #$06
BNE LF8B0
LF8BB BEQ LF8BB ;endless loop
LF8BD .BYTE 'DOS/65 V2.0'
LF8C8 .BYTE 'ERROR!'
SF8CE JSR SF8ED
JSR SF91B
LF8D4 LDA #$02 ;test for TRACK 0
BIT $C000
BNE LF8E0
LDA #$00
STA $0B ;set track countr to 0
RTS
LF8E0 JSR SF8E6
JMP LF8D4
SF8E6 LDA $C002 ;step down towards track 0
ORA #$04
BNE LF8F4
SF8ED INC $0B ;inc track counter
LDA $C002 ;step up
AND #$FB
LF8F4 STA $C002
JSR SF916 ;delay
AND #$F7
STA $C002 ;step on
JSR SF917 ;short delay
ORA #$08
STA $C002 ;step off
LDX #$05 ;5000 cycle delay
JMP LF91D
SF90C JSR SF914 ;delay routine ~1ms @ 1MHz
DEY
BNE SF90C
NOP
RTS
SF914 BNE SF916
SF916 RTS
SF917 JSR SF916
RTS
SF91B LDX #$0C ;delay 12000 cycles
LF91D LDY #$31 ;delay X*1000 cycles (x*1ms)
JSR SF90C
DEX
BNE LF91D
RTS
SF926 LDA #$7F ;load head
AND $C002
STA $C002
LDX #$28 ;delay 40,000 cycles
JMP LF91D
SF933 LDA #$80 ;unload head
ORA $C002
STA $C002
RTS
SF93C JSR SF926
SEI
LF940 LDA $C000
BMI LF940 ;wait for index start
LF945 LDA $C000
BPL LF945 ;wait for index end
LDA #$03
STA $C010 ;reset disk ACIA
LDA #$58
STA $C010 ;/1 RTS hi, no irq
LF954 LDA $C000
BPL LF974 ;found index end?
JSR SF977 ;DISK IN
LF95C CMP #$43 ;look for 'C'
BNE LF954
JSR SF977 ;disk IN
CMP #$57 ;look for 'W'
BNE LF95C
JSR SF977 ;disk IN
CMP $0B
BNE LF973 ;look for desired track #
JSR SF977 ;disk IN
CMP #$58 ;look for 'X'
LF973 RTS
LF974 LDA #$01
RTS
SF977 LDA $C010 ;read byte from disk
LSR A
BCC SF977
LDA $C011
RTS
SF981 LDA $06
SEC
SBC #$01
LDY #$00
STY $08
LDY #$07
LF98C ASL A
ROL $08
DEY
BNE LF98C
CLC
ADC #$00
STA $07
LDA $08
ADC #$03
STA $08
RTS
SF99E LDA #$00
LDY #$03
STA $09 ;set target address to $0300
STY $0A
JSR SF93C ;look for start of track header
BNE LF9DC
LF9AB JSR SF977
CMP #$76 ;look for start of sector marker
BNE LF9AB
JSR SF977
CMP #$01 ;look for sector #1
BNE LF9DC
JSR SF977
CMP #$08 ;look for 8 pages
BNE LF9DC
TAX
LDY #$00
LF9C3 LDA #$01
LF9C5 BIT $C010 ;read from disk into memory @ ($09),y X# pages, Carry Set if parity error detected
BEQ LF9C5
LDA $C011
BVS LF9DC
STA ($09),Y
INY
BNE LF9C3
INC $0A
DEX
BNE LF9C3
CLC
BCC LF9DD
LF9DC SEC
LF9DD JMP SF933 ;unload head
.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
;custom boot menu
LFA00 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
LFA24 LDY #$FF
LFA26 INY
LDA LFA63,Y ;display menu
BMI LFA37
LFA2C JSR $BF2D ;(BASIC screen print)
CMP #$0D
BNE LFA26 ;write <LF> after <CR>
LDA #$0A
BNE LFA2C
LFA37 JSR SFFBA ;get input (usually keyboard)
STA $20
LDY #$00
LDX #$31
LFA40 CPX $20
BEQ LFA4D ;match digit entered to menu index
CPY #$10 ;y/2 entries
BEQ LFA24 ;invalid entry, start over
INX
INY
INY ;Y+2
BNE LFA40
LFA4D LDA LFA57,Y ;load routine start address HI & LO-1
PHA
INY
LDA LFA57,Y ;push onto stack
PHA
RTS ;execute via RTS
LFA57 .DBYTE $0000-1, $BD11-1,$FC00-1,$FE00-1,$E000-1,$F800-1
LFA63 .BYTE $D,'System Menu',$D
.BYTE '1 - Warmstart',$D
.BYTE '2 - BASIC',$D
.BYTE '3 - DOS',$D
.BYTE '4 - Monitor',$D
.BYTE '5 - Ext. Monitor',$D
.BYTE '6 - DOS/65',$D
.BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
LFAC0 PHA
LDX #$05
LFAC3 LDY #$FF
LFAC5 DEY
BNE LFAC5
DEX
BNE LFAC3
TSX
PLA
PLA
CMP #$F0
BNE LFAEF
PLA
CMP #$04
BNE LFAEF
PLA
CMP $D8
BCS LFAEF
LDA $C000
AND #$02
BNE LFAEF
LDA $D8
BPL LFAEB
LDA #$80
BMI LFAED
LFAEB LDA #$00
LFAED STA $D8
LFAEF TXS
PLA
LDX #$00
LDY #$00
RTS
.BYTE $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
SFFB8=$FFB8
; 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 LFAC0
.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 LFA00
LFF38 JMP $BF2D
SFF3B JMP $BF2D
.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