**** STRINGS **** DF0C DB ')C)',0 ; Copyright string match **** COMMMANDS **** ; Command Address Call goes to DF10 DB '.',E0,31,05 ; *. &E031, A=5 FSCV, XY=>String DF14 DB 'FX',E3,42,FF ; *FX &E342, A=&FF Number paramters DF19 DB 'BASIC',E0,18,00 ; *BASIC &E018, A=0 XY=>String DF21 DB 'CAT',E0,31,05 ; *CAT &E031, A=5 FSCV, XY=>String DF27 DB 'CODE',E3,48,88 ; *CODE &E348, A=&88 OSBYTE &88 DF2E DB 'EXEC',F6,8D,00 ; *EXEC &F68D, A=0 XY=>String DF35 DB 'HELP',F0,B9,FF ; *HELP &F0B9, A=&FF F2/3=>String DF3C DB 'KEY',E3,27,FF ; *KEY &E327, A=&FF F2/3=>String DF42 DB 'LOAD',E2,3C,00 ; *LOAD &E23C, A=0 XY=>String DF49 DB 'LINE',E6,59,01 ; *LINE &E659, A=1 USERV, XY=>String DF50 DB 'MOTOR',E3,48,89 ; *MOTOR &E348, A=&89 OSBYTE DF58 DB 'OPT',E3,48,8B ; *OPT &E348, A=&8B OSBYTE DF5E DB 'RUN',E0,31,04 ; *RUN &E031, A=4 FSCV, XY=>String DF64 DB 'ROM',E3,48,8D ; *ROM &E348, A=&8D OSBYTE DF6A DB 'SAVE',E2,3E,00 ; *SAVE &E23E, A=0 XY=>String DF70 DB 'SPOOL',E2,81,00 ; *SPOOL &E281, A=0 XY=>String DF79 DB 'TAPE',E3,48,8C ; *TAPE &E348, A=&8C OSBYTE DF80 DB 'TV',E3,48,90 ; *TV &E348, A=&90 OSBYTE DF85 DB E0 ; Table end marker ; Command routines are entered with XY=>command tail, A=table parameter, ; &F2/3,&E6=>start of command string ; If table parameter if <&80, F2/3,Y converted to XY before entering DF86 31 03 1. AND (&03),Y DF88 00 . BRK ************************************************************************* * * * CLI - COMMAND LINE INTERPRETER * * * * ENTRY: XY=>Command line * * EXIT: All registers corrupted * * [ A=13 - unterminated string ] ************************************************************************* ; DF89 STX &F2 ; Store XY in &F2/3 DF8B STY &F3 DF8D LDA #&08 DF8F JSR &E031 ; Inform filing system CLI being processed DF92 LDY #&00 ; Check the line is correctly terminated DF94 LDA (&F2),Y DF96 CMP #&0D ; Loop until CR is found DF98 BEQ &DF9E DF9A INY ; Move to next character DF9B BNE &DF94 ; Loop back if less than 256 bytes long DF9D RTS ; Exit if string > 255 characters ; String is terminated - skip prepended spaces and '*'s DF9E LDY #&FF DFA0 JSR &E039 ; Skip any spaces DFA3 BEQ &E017 ; Exit if at CR DFA5 CMP #&2A ; Is this character '*'? DFA7 BEQ &DFA0 ; Loop back to skip it, and check for spaces again DFA9 JSR &E03A ; Skip any more spaces DFAC BEQ &E017 ; Exit if at CR DFAE CMP #&7C ; Is it '|' - a comment? DFB0 BEQ &E017 ; Exit if so DFB2 CMP #&2F ; Is it '/' - pass straight to filing system? DFB4 BNE &DFBE ; Jump forward if not DFB6 INY ; Move past the '/' DFB7 JSR &E009 ; Convert &F2/3,Y->XY, ignore returned A DFBA LDA #&02 ; 2=RunSlashCommand DFBC BNE &E031 ; Jump to pass to FSCV ; ; Look command up in command table DFBE 84 E6 .æ STY &E6 ; Store offset to start of command DFC0 A2 00 ¢. LDX #&00 DFC2 F0 13 ð. BEQ &DFD7 ; DFC4 5D 10 DF ].ß EOR &DF10,X DFC7 29 DF )ß AND #&DF DFC9 D0 17 Ð. BNE &DFE2 DFCB C8 È INY DFCC 18 . CLC ; DFCD B0 25 °% BCS &DFF4 DFCF E8 è INX DFD0 B1 F2 ±ò LDA (&F2),Y DFD2 20 E3 E4 ãä JSR &E4E3 DFD5 90 ED .í BCC &DFC4 ; DFD7 BD 10 DF ½.ß LDA &DF10,X DFDA 30 16 0. BMI &DFF2 DFDC B1 F2 ±ò LDA (&F2),Y DFDE C9 2E É. CMP #&2E DFE0 F0 04 ð. BEQ &DFE6 DFE2 18 . CLC DFE3 A4 E6 ¤æ LDY &E6 DFE5 88 . DEY DFE6 C8 È INY DFE7 E8 è INX DFE8 E8 è INX DFE9 BD 0E DF ½.ß LDA &DF0E,X DFEC F0 33 ð3 BEQ &E021 DFEE 10 F8 .ø BPL &DFE8 DFF0 30 DB 0Û BMI &DFCD ; DFF2 E8 è INX DFF3 E8 è INX ; DFF4 CA Ê DEX DFF5 CA Ê DEX DFF6 48 H PHA DFF7 BD 11 DF ½.ß LDA &DF11,X DFFA 48 H PHA DFFB 20 3A E0 :à JSR &E03A DFFE 18 . CLC DFFF 08 . PHP E000 20 04 E0 .à JSR &E004 E003 40 @ RTI ; Jump to routine E004 LDA &DF12,X ; Get table parameter E007 BMI &E017 ; If >=&80, number follow ; ; else string follows E009 TYA ; Pass Y line offset to A for later E00A LDY &DF12,X ; Get looked-up parameter from table ; Convert &F2/3,A to XY, put Y in A E00D 18 . CLC E00E 65 F2 eò ADC &F2 E010 AA ª TAX E011 98 . TYA ; Pass supplied Y into A E012 A4 F3 ¤ó LDY &F3 E014 90 01 .. BCC &E017 E016 C8 È INY ; E017 60 ` RTS ; *BASIC E018 LDX &024B ; Get Basic rom number E01B BMI &E021 ; If none set, jump to pass command on E01D SEC ; Set Carry = not entering from RESET E01E JMP &DBE7 ; Enter language rom in X ; Pass command on to other roms and to filing system E021 LDY &E6 ; Restore pointer to start of command E023 LDX #&04 ; 4=UnknownCommand E025 JSR &F168 ; Pass to sideways roms E028 BEQ &E017 ; If claimed, exit E02A LDA &E6 ; Restore pointer to start of command E02C JSR &E00D ; Convert &F2/3,A to XY, ignore returned A E02F LDA #&03 ; 3=PassCommandToFilingSystem ; Pass to current filing system E031 JMP (&021E) E034 0A . ASL A E035 29 01 ). AND #&01 E037 10 F8 .ø BPL &E031 ; Skip spaces E039 C8 È INY E03A B1 F2 ±ò LDA (&F2),Y E03C C9 20 É CMP #&20 E03E F0 F9 ðù BEQ &E039 E040 C9 0D É. CMP #&0D E042 60 ` RTS ; E043 90 F5 .õ BCC &E03A E045 20 3A E0 :à JSR &E03A E048 C9 2C É, CMP #&2C E04A D0 F4 Ðô BNE &E040 E04C C8 È INY E04D 60 ` RTS ; E04E 20 3A E0 :à JSR &E03A E051 20 7D E0 }à JSR &E07D E054 90 37 .7 BCC &E08D E056 85 E6 .æ STA &E6 E058 20 7C E0 |à JSR &E07C E05B 90 19 .. BCC &E076 E05D AA ª TAX E05E A5 E6 ¥æ LDA &E6 E060 0A . ASL A E061 B0 2A °* BCS &E08D E063 0A . ASL A E064 B0 27 °' BCS &E08D E066 65 E6 eæ ADC &E6 E068 B0 23 °# BCS &E08D E06A 0A . ASL A E06B B0 20 ° BCS &E08D E06D 85 E6 .æ STA &E6 E06F 8A . TXA E070 65 E6 eæ ADC &E6 E072 B0 19 °. BCS &E08D E074 90 E0 .à BCC &E056 E076 A6 E6 ¦æ LDX &E6 E078 C9 0D É. CMP #&0D E07A 38 8 SEC E07B 60 ` RTS E07C C8 È INY E07D B1 F2 ±ò LDA (&F2),Y E07F C9 3A É: CMP #&3A E081 B0 0A °. BCS &E08D E083 C9 30 É0 CMP #&30 E085 90 06 .. BCC &E08D E087 29 0F ). AND #&0F E089 60 ` RTS E08A 20 45 E0 Eà JSR &E045 E08D 18 . CLC E08E 60 ` RTS E08F 20 7D E0 }à JSR &E07D E092 B0 0E °. BCS &E0A2 E094 29 DF )ß AND #&DF E096 C9 47 ÉG CMP #&47 E098 B0 F0 °ð BCS &E08A E09A C9 41 ÉA CMP #&41 E09C 90 EC .ì BCC &E08A E09E 08 . PHP E09F E9 37 é7 SBC #&37 E0A1 28 ( PLP E0A2 C8 È INY E0A3 60 ` RTS ; WRCH control routine ; ==================== E0A4 48 H PHA ; Save all registers E0A5 8A . TXA E0A6 48 H PHA E0A7 98 . TYA E0A8 48 H PHA E0A9 BA º TSX E0AA BD 03 01 ½.. LDA &0103,X ; Get A back from stack E0AD 48 H PHA ; Save A E0AE 2C 60 02 ,`. BIT &0260 ; Check OSWRCH interception flag E0B1 10 08 .. BPL &E0BB ; Not set, skip interception call E0B3 A8 ¨ TAY ; Pass character to Y E0B4 A9 04 ©. LDA #&04 ; A=4 for OSWRCH call E0B6 20 7E E5 ~å JSR &E57E ; Call interception code E0B9 B0 52 °R BCS &E10D ; If claimed, jump past to exit E0BB 18 . CLC ; Prepare to not send this to printer E0BC A9 02 ©. LDA #&02 ; Check output destination E0BE 2C 7C 02 ,|. BIT &027C ; Is VDU driver disabled? E0C1 D0 05 Ð. BNE &E0C8 ; Yes, skip past VDU driver E0C3 68 h PLA ; Get character back E0C4 48 H PHA ; Resave character E0C5 20 C0 C4 ÀÄ JSR &C4C0 ; Call VDU driver ; On exit, C=1 if character to be sent to printer E0C8 A9 08 ©. LDA #&08 ; Check output destination E0CA 2C 7C 02 ,|. BIT &027C ; Is printer seperately enabled? E0CD D0 02 Ð. BNE &E0D1 ; Yes, jump to call printer driver E0CF 90 05 .. BCC &E0D6 ; Carry clear, don't sent to printer E0D1 68 h PLA ; Get character back E0D2 48 H PHA ; Resave character E0D3 20 14 E1 .á JSR &E114 ; Call printer driver E0D6 AD 7C 02 ­|. LDA &027C ; Check output destination E0D9 6A j ROR A ; Is serial output enabled? E0DA 90 1B .. BCC &E0F7 ; No, skip past serial output E0DC A4 EA ¤ê LDY &EA ; Get serial timout counter E0DE 88 . DEY ; Decrease counter E0DF 10 16 .. BPL &E0F7 ; Timed out, skip past serial code E0E1 68 h PLA ; Get character back E0E2 48 H PHA ; Resace character E0E3 08 . PHP ; Save IRQs E0E4 78 x SEI ; Disable IRQs E0E5 A2 02 ¢. LDX #&02 ; X=2 for serial output buffer E0E7 48 H PHA ; Save character E0E8 20 5B E4 [ä JSR &E45B ; Examine serial output buffer E0EB 90 03 .. BCC &E0F0 ; Buffer not full, jump to send character E0ED 20 70 E1 pá JSR &E170 ; Wait for buffer to empty a bit E0F0 68 h PLA ; Get character back E0F1 A2 02 ¢. LDX #&02 ; X=2 for serial output buffer E0F3 20 F8 E1 øá JSR &E1F8 ; Send character to serial output buffer E0F6 28 ( PLP ; Restore IRQs E0F7 A9 10 ©. LDA #&10 ; Check output destination E0F9 2C 7C 02 ,|. BIT &027C ; Is SPOOL output disabled? E0FC D0 0F Ð. BNE &E10D ; Yes, skip past SPOOL output E0FE AC 57 02 ¬W. LDY &0257 ; Get SPOOL handle E101 F0 0A ð. BEQ &E10D ; If not open, skip past SPOOL output E103 68 h PLA ; Get character back E104 48 H PHA ; Resave character E105 38 8 SEC E106 66 EB fë ROR &EB ; Set RFS/CFS's 'spooling' flag E108 20 D4 FF Ô. JSR &FFD4 ; Write character to SPOOL channel E10B 46 EB Fë LSR &EB ; Reset RFS/CFS's 'spooling' flag E10D 68 h PLA ; Restore all registers E10E 68 h PLA E10F A8 ¨ TAY E110 68 h PLA E111 AA ª TAX E112 68 h PLA E113 60 ` RTS ; Exit ************************************************************************* * * * PRINTER DRIVER * * * ************************************************************************* ;A=character to print E114 BIT &027C ;if bit 6 of VDU byte =1 printer is disabled E117 BVS &E139 ;so E139 E119 CMP &0286 ;compare with printer ignore character E11C BEQ &E139 ;if the same E139 E11E PHP ;else save flags E11F SEI ;bar interrupts E120 TAX ;X=A E121 LDA #&04 ;A=4 E123 BIT &027C ;read bit 2 'disable printer driver' E126 BNE &E138 ;if set printer is disabled so exit E138 E128 TXA ;else A=X E129 LDX #&03 ;X=3 E12B JSR &E1F8 ;and put character in printer buffer E12E BCS &E138 ;if carry set on return exit, buffer not full (empty?) E130 BIT &02D2 ;else check buffer busy flag if 0 E133 BPL &E138 ;then E138 to exit E135 JSR &E13A ;else E13A to open printer cahnnel E138 PLP ;get back flags E139 RTS ;and exit E13A LDA &0285 ;check printer destination E13D BEQ &E1AD ;if 0 then E1AD clear printer buffer and exit E13F CMP #&01 ;if parallel printer not selected E141 BNE &E164 ;E164 E143 JSR &E460 ;else read a byte from the printer buffer E146 ROR &02D2 ;if carry is set then 2d2 is -ve E149 BMI &E190 ;so return via E190 E14B LDY #&82 ;else enable interrupt 1 of the external VIA E14D STY &FE6E ; E150 STA &FE61 ;pass code to centronics port E153 LDA &FE6C ;pulse CA2 line to generate STROBE signal E156 AND #&F1 ;to advise printer that E158 ORA #&0C ;valid data is E15A STA &FE6C ;waiting E15D ORA #&0E ; E15F STA &FE6C ; E162 BNE &E190 ;then exit *********:serial printer ********************************************* E164 CMP #&02 ;is it Serial printer?? E166 BNE &E191 ;if not E191 E168 LDY &EA ;else is RS423 in use by cassette?? E16A DEY ; E16B BPL &E1AD ;if so E1AD to flush buffer E16D LSR &02D2 ;else clear buffer busy flag E170 LSR &024F ;and RS423 busy flag E173 JSR &E741 ;count buffer if C is clear on return E176 BCC &E190 ;no room in buffer so exit E178 LDX #&20 ;else E17A LDY #&9F ; ************************************************************************* * * * OSBYTE 156 update ACIA setting and RAM copy * * * ************************************************************************* ;on entry E17C PHP ;push flags E17D SEI ;bar interrupts E17E TYA ;A=Y E17F STX &FA ;&FA=X E181 AND &0250 ;A=old value AND Y EOR X E184 EOR &FA ; E186 LDX &0250 ;get old value in X E189 STA &0250 ;put new value in E18C STA &FE08 ;and store to ACIA control register E18F PLP ;get back flags E190 RTS ;and exit ************ printer is neither serial or parallel so its user type ***** E191 CLC ;clear carry E192 LDA #&01 ;A=1 E194 JSR &E1A2 ; ************************************************************************* * * * OSBYTE 123 Warn printer driver going dormant * * * ************************************************************************* E197 ROR &02D2 ;mark printer buffer empty for osbyte E19A RTS ;and exit E19B BIT &02D2 ;if bit 7 is set buffer is empty E19E BMI &E19A ;so exit E1A0 LDA #&00 ;else A=0 E1A2 LDX #&03 ;X=3 E1A4 LDY &0285 ;Y=printer destination E1A7 JSR &E57E ;to JMP (NETV) E1AA JMP (&0222) ;jump to PRINT VECTOR for special routines *************** Buffer handling ***************************************** ;X=buffer number ;Buffer number Address Flag Out pointer In pointer ;0=Keyboard 3E0-3FF 2CF 2D8 2E1 ;1=RS423 Input A00-AFF 2D0 2D9 2E2 ;2=RS423 output 900-9BF 2D1 2DA 2E3 ;3=printer 880-8BF 2D2 2DB 2E4 ;4=sound0 840-84F 2D3 2DC 2E5 ;5=sound1 850-85F 2D4 2DD 2E6 ;6=sound2 860-86F 2D5 2DE 2E7 ;7=sound3 870-87F 2D6 2DF 2E8 ;8=speech 8C0-8FF 2D7 2E0 2E9 E1AD CLC ;clear carry E1AE PHA ;save A E1AF PHP ;save flags E1B0 SEI ;set interrupts E1B1 BCS &E1BB ;if carry set on entry then E1BB E1B3 LDA &E9AD,X ;else get byte from baud rate/sound data table E1B6 BPL &E1BB ;if +ve the E1BB E1B8 JSR &ECA2 ;else clear sound data E1BB SEC ;set carry E1BC ROR &02CF,X ;rotate buffer flag to show buffer empty E1BF CPX #&02 ;if X>1 then its not an input buffer E1C1 BCS &E1CB ;so E1CB E1C3 LDA #&00 ;else Input buffer so A=0 E1C5 STA &0268 ;store as length of key string E1C8 STA &026A ;and length of VDU queque E1CB JSR &E73B ;then enter via count purge vector any user routines E1CE PLP ;restore flags E1CF PLA ;restore A E1D0 RTS ;and exit ************************************************************************* * * * COUNT PURGE VECTOR DEFAULT ENTRY * * * * * ************************************************************************* ;on entry if V set clear buffer ; if C set get space left ; else get bytes used E1D1 BVC &E1DA ;if bit 6 is set then E1DA E1D3 LDA &02D8,X ;else start of buffer=end of buffer E1D6 STA &02E1,X ; E1D9 RTS ;and exit E1DA PHP ;push flags E1DB SEI ;bar interrupts E1DC PHP ;push flags E1DD SEC ;set carry E1DE LDA &02E1,X ;get end of buffer E1E1 SBC &02D8,X ;subtract start of buffer E1E4 BCS &E1EA ;if carry caused E1EA E1E6 SEC ;set carry E1E7 SBC &E447,X ;subtract buffer start offset (i.e. add buffer length) E1EA PLP ;pull flags E1EB BCC &E1F3 ;if carry clear E1F3 to exit E1ED CLC ;clear carry E1EE ADC &E447,X ;adc to get bytes used E1F1 EOR #&FF ;and invert to get space left E1F3 LDY #&00 ;Y=0 E1F5 TAX ;X=A E1F6 PLP ;get back flags E1F7 RTS ;and exit ********** enter byte in buffer, wait and flash lights if full ********** E1F8 SEI ;prevent interrupts E1F9 JSR &E4B0 ;entera byte in buffer X E1FC BCC &E20D ;if successful exit E1FE JSR &E9EA ;else switch on both keyboard lights E201 PHP ;push p E202 PHA ;push A E203 JSR &EEEB ;switch off unselected LEDs E206 PLA ;get back A E207 PLP ;and flags E208 BMI &E20D ;if return is -ve Escape pressed so exit E20A CLI ;else allow interrupts E20B BCS &E1F8 ;if byte didn't enter buffer go and try it again E20D RTS ;then return