;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