**** 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