.ASECT .TITLE TECO V1.2 29-MAR-82 ;****************************************** ;****** TECO ****** ;****** Copyright 1985 ****** ;****** ****** ;****** Bob Ankeney ****** ;****** 5740 SE 18th Ave ****** ;****** Portland, OR 97202 ****** ;****** ****** ;****** All Rights Reserved ****** ;****** ****** ;****** Permission is granted to ****** ;****** reproduce, without profit, ****** ;****** any portion of this program. ****** ;****************************************** ; ;--------------------------------------------------------------------- ; Modification history ; ; 01/01/84 Added EU, KB buffer. ; 12/28/83 Fixed O command (@O/tag/). ; 12/26/83 Added EI. ; 12/23/83 Added ES and EV. ; 12/18/83 Added ^Z command. ; 12/18/83 Added case comparison (^X) to search. ; 12/14/83 Added search string modifiers. ; 12/11/83 Completed search string building. ; 12/10/83 Added ^Q command. ; 12/10/83 Added G* and G_ search string and filespec. ; 12/09/83 Added := and :==, simplified E flags. ; 12/09/83 Added m,nUxUy capability. ; 12/09/83 Added parenthetical expressions. ; 11/27/83 Added ^EQn to search strings and ^ conversion. ; 11/26/83 Added Q-register push-down list. ; 11/25/83 Added bounded search (m,nStext$, ::Stext$). ; 06/06/83 Rewrote input handler for video terminals. ; ;--------------------------------------------------------------------- ; CONSTANT DEFINITIONS ; VERNUM=29 ; TECO VERSION NUMBER ; USR=$214 DATE=$3C2 ; CURRENT DATE WORD CNISTA=$40C ; CONSOLE INPUT STATUS CONINP=CNISTA+5 ; GET CHAR FROM CONSOLE CONPOS=$420 ; CONSOLE POSITION CNSTAI=CONPOS+3 ; CONSOLE INP STAT BITS CNSTAO=CNSTAI+1 ; CONSOLE OUT STAT BITS CNCTLO=CNSTAO+1 ; =1 IF CTL/O IN EFFECT LEADIN=$426 CURSUP=$428 BACKSP=$42B CTCRTN=$3CB ; ^C RETURN ADDRESS CONIN=$400 BINPUT=CONIN+3 CONOUT=BINPUT+3 BINOUT=CONOUT+3 MONITR=$A00 SRHBUF=$2100 ; SYS DIRECTORY BUFFER USED FOR ; TEMP SEARCH STRING BUILDING LOOKUP=0 ENTER=1 CLOSE=2 DELET=3 RENAME=4 INQUIR=8 FETCH=INQUIR RD2ASC=12 SCAN=15 ; COMPTR=$30 ; COMMAND INPUT POINTER CMDPTR=COMPTR+2 ; COMMAND BUFFER POINTER LASTLF=CMDPTR+2 BUFPTR=LASTLF+2 ; BUFFER POINTER TEMPTR=BUFPTR+2 TMPTR1=TEMPTR+2 TXTPTR=TMPTR1+2 QSTART=TXTPTR+2 ; START OF Q REGISTER N CHRPTR=QSTART+2 INPTR=CHRPTR+2 ; INPUT BUFFER POINTER OUTPTR=INPTR+2 ; OUTPUT BUFFER POINTER EIPTR=OUTPTR+2 ; INDIRECT FILE BUFFER POINTER ; *=$2500 ; TMPSTO .BYTE 0 TMPSTI .BYTE 0 LSTCHR .BYTE 0 INCHAR .BYTE 0 BUFST .WORD 0 ; START OF BUFFER BUFSIZ .WORD 0 ; # CHARS IN BUFFER ENDBUF .WORD 0 ; =BUFST+BUFSIZ BUFTHQ .WORD 0 ; 3/4 THROUGH BUFFER BUFEND .WORD 0 ; LAST CHAR IN BUFFERS CMDST=BUFEND CMDCNT .WORD 0 ; # CHARS LEFT IN COMMAND CMDREG .BYTE 0 ; Q REG OF COMMAND (36 IF COMMAND STRING) MAXEND .WORD $BFFF ; MAXIMUM BUFFER END CHRCNT .WORD 0 LOARG .WORD 0 HIARG .WORD 0 LSTARG .WORD 0 GOTLO .BYTE 0 GOTHI .BYTE 0 NUMASM .BYTE 0 LASTOP .BYTE 0 OPER .BYTE 0 RADIX .BYTE 10 MULNUM .WORD 0 DIVNUM .WORD 0 DIGCNT .BYTE 0 ESCHAR .BYTE 0 ; ESC FOR NORMAL, ELSE / FOR @S/.../ TEMP .WORD 0 TEMP1 .WORD 0 TEMPX .BYTE 0 TEMPX1 .BYTE 0 TMPBUF .WORD TEMBUF TEMBUF .BYTE 0 ENDLIM .WORD 0 STRSIZ .WORD 0 ; LENGTH OF LAST STRING SRHCNT .WORD 0 SRHLEN .BYTE 0 SRHSIZ .BYTE 0 NEGATE .BYTE 0 QRGTMP .BYTE 0 VERFLG .WORD 0 ; FOR ES AND EV ; QDEPTH .WORD 0 ; DEPTH OF Q REGISTER PUSHDOWN LIST PRDPTH .BYTE 0 ; # LEVELS OF PARENS *3 MAXPAR=24 ; MAX 8 LEVELS OF PARENS PARSTK *=*+MAXPAR PSHCNT .BYTE 0 ; # LEVELS ON PUSHDOWN LIST PSHLST *=*+32 ; # CHARS LEFT IN COMMAND PSHREG *=*+32 ; FIRST BYTE = Q REG * OF COMMAND ; SECOND BYTE= 0 -> ITERATION, 1 -> MACRO ITRCNT *=*+32 ; ITERATION COUNT GOTAT .BYTE 0 ; =1 IF LAST CHAR='@' GOTCLN .BYTE 0 ; =1 IF LAST CHAR=';' TRCMOD .BYTE 0 ; TRACE MODE FLAG TRCTMP .BYTE 0 TSTCHR .BYTE 0 ; CHAR TESTED IN CHRTST PAGSRH .BYTE 0 ; SEARCH ACROSS PAGES BOUNDS .WORD 0 ; SEARCH BOUNDS FOR M,NS NOFAIL .BYTE 0 ; FLAG =1 FOR 0,NS OLDPTR .WORD 0 ; TEMP BUFPTR FOR 0,NS ; **** NEXT 4 LINES MUST STAY IN THIS ORDER!! QRGCNT *=*+72 ; SIZE OF Q REGS CMDSIZ .WORD 0 ; SIZE OF COMMAND STRING FSPCSZ .WORD 0 ; SIZE OF FILE SPEC LSTCNT .WORD 0 ; SIZE OF LAST SEARCH STR ; QVAL *=*+72 ; Q REG NUMERICS SRHMES .BYTE '?SEARCH FAILURE ',0 SRHMS1 .BYTE 'FOR "',0 SRHMS2 .BYTE 'IN ITERATION',0 LSTSRH *=*+256 FILSPC *=*+18 ; FILESPEC BUFFER FLSPTR .WORD FILSPC .WORD LSTSRH ; TINBUF *=*+$80 ; KEYBOARD BUFFER TINSIZ .BYTE 0 ; BUFTMP .WORD 0 RADWRD .WORD 0 ; RAD40 WORD CHAR .BYTE 0,0,0 ; 3 ASCII CHARS FRSTCH .BYTE 0 ; =1 IF >1 CHARS TYPED LSTERR .BYTE 0 ; =1 IF LAST CMD GAVE ERR NUMSGN .BYTE 0 NUMSTR .WORD 0,0,0 TAGPTR .WORD 0 ; POINTER TO O TAG TAGCNT .WORD 0 ; # CHARS IN TAG ; EDFLAG .WORD 0 ; ED FLAG (FOR YANK CMD) EHFLAG .WORD 0 ; EH FLAG EOFLAG .WORD 0 ; TECO VERSION # ESFLAG .WORD 0 ; ES FLAG ETFLAG .WORD 0 ; ET FLAG (FOR ^C COMMAND) EUFLAG .WORD 0 ; EU FLAG EVFLAG .WORD 0 ; EV FLAG XFLAG .WORD 0 ; ^X FLAG EFLAGS .BYTE 'DHOSTUV' EFGCNT=*-EFLAGS ; I/O PARAMS DIRBUF *=*+$12 ; DIRECTORY ENTRY OUTFIL *=*+21 OUTHLR=OUTFIL+14 OUTDEV=OUTFIL+11 OUTUNT=OUTFIL+12 OUTUUP .BYTE 0 ; =OUTUNT OR $40 OUTSIZ .BYTE 4 ; SIZE OF OUTPUT BUFFER OUTOPN .BYTE 0 ; >0 IF FILE OPEN CLSBUF *=*+18 ; FOR CLOSE & RENAME ; INFILE *=*+18 INHLR=INFILE+14 INDEV=INFILE+11 INUNIT=INFILE+12 INSIZE .BYTE 4 ; SIZE OF INPUT BUFFER INOPEN .BYTE 0 ; >0 IF INP FILE OPEN INLEN .WORD 0 FFFLAG .BYTE 0 ; FORM FEED FLAG GOTEOF .BYTE 0 ; >0 IF GOT EOF COLONA .BYTE 0 ; :A COMMAND ; EIFILE *=*+18 EIHLR=EIFILE+14 EIDEV=EIFILE+11 EIUNIT=EIFILE+12 EISZ=1 EISIZE .BYTE EISZ ; SIZE OF INDIRECT BUFFER EIOPEN .BYTE 0 ; <>0 IF INDIRECT FILE OPEN EILEN .BYTE 0 ; # BLOCKS LEFT IN FILE EIST .WORD EIBUF EIEND .WORD 0 EIFPTR .WORD EIFILE EIBUF *=256*EISZ+* ; INDIRECT FILE BUFFER ; EBFLAG .BYTE 0 ; >0 IF EB COMMAND SUPSED .BYTE 0 ; >0 TO SUPERSEDE SUPMES .BYTE 'Supersede? ',0 DELMES .BYTE 13,10,'Delete TECO.TMP? ',0 ANSMES .BYTE 'NO',0,'YES',0 TMPNAM .RAD40 'TECO ','TMP' CLSLEN .WORD 0 ; CLOSING OUTPUT LENGTH FETIN .WORD 0 RADBAK .RAD40 'BAK' FNMPTR .WORD 0,0 ENDPTR .WORD TECEND XABPTR .WORD XABERR STRPTR .WORD NUMSTR CLSPTR .WORD CLSBUF IFLPTR .WORD INFILE OFLPTR .WORD OUTFIL ; ; *** INFO FOR " COMMAND *** QUOLST .BYTE 'G>L .WORD QUOTEL ; "L .WORD QUOTEL ; "< .WORD QUOTEL ; "T .WORD QUOTEL ; "S .WORD QUOTEE ; "E .WORD QUOTEE ; "F .WORD QUOTEE ; "U .WORD QUOTEC ; "C .WORD QUOTEN ; "N .WORD QUOTEA ; "A .WORD QUOTEV ; "V .WORD QUOTEW ; "W .WORD QUOTED ; "D .WORD QUOTER ; "R ; ; *** INFO FOR COMMAND SKIPPING *** SKPCHR .BYTE 0 SKITCT .BYTE 0 ; SKIP ITERATION COUNT SKCNCT .BYTE 0 ; SKIP CONDITIONAL COUNT SKPQLS .BYTE 30,'%GMQUX[]' ; Q REGISTER COMMANDS SKPSPC .BYTE 1,'!"$''<>@EF^' ; SPECIAL COMMANDS SKPTBL .WORD SKPCTA ; SPECIAL COMMAND .WORD SKPTAG ; DISPATCH TABLE .WORD SKPQUO .WORD SKPHEX .WORD SKPCND .WORD SKPITR .WORD SKPGTR .WORD SKPAT .WORD SKPE .WORD SKPF .WORD SKPUP SKPESC .BYTE 9,21,'INOS_' ; COMMANDS REQUIRING $ SKECMD .BYTE 'BEGINRW' ; E COMMANDS REQUIRING $ SKPEND=* ; TECO LDA CNSTAO ; SAVE OUTPUT STATUS BITS STA TMPSTO ORA #$24 ; ENABLE UPARROW ON CTRL STA CNSTAO ; CHARS AND $ ON ESCAPE LDA CNSTAI STA TMPSTI ; LDA ENDPTR ; INIT POINTERS STA INST STA OUTST STA BUFST STA BUFEND STA BUFPTR LDA ENDPTR+1 STA INST+1 CLC ADC INSIZE STA OUTST+1 ADC OUTSIZ STA BUFST+1 STA BUFEND+1 STA BUFPTR+1 ; LDA EIST STA EIEND LDA EIST+1 ADC EISIZE STA EIEND+1 ; LDX #71 ; ZERO Q REGISTERS LDA #0 QCLEAR STA QRGCNT,X STA QVAL,X DEX BPL QCLEAR ; LDX #EFLAGS-EDFLAG EFGZRO STA EDFLAG-1,X ; ZERO E FLAGS DEX BNE EFGZRO ; STA CMDSIZ STA CMDSIZ+1 STA BUFSIZ STA BUFSIZ+1 ; STA INOPEN STA OUTOPN STA EIOPEN ; STA LSTERR STA FRSTCH STA QDEPTH STA QDEPTH+1 STA LSTCNT STA FSPCSZ STA TINSIZ ; KB BUFFER EMPTY TAY ; LDA #VERNUM ; INIT VERSION # STA EOFLAG LDA #$FF STA EUFLAG STA EUFLAG+1 LDA #6 STA ETFLAG LDA #2 STA ETFLAG+1 ; JSR INITCM ; GETCMD JSR CRLF GTCMD1 LDA EVFLAG ; CHECK FOR EV STA VERFLG LDA EVFLAG+1 STA VERFLG+1 JSR EDTVER ; GTCMD2 LDA #$FF ; DISABLE ^C TRAPPING STA CTCRTN STA CTCRTN+1 STY LSTCHR ; LAST CHAR TYPED LDY #0 ; STY CNCTLO ; DISABLE ^O FLAG LDA EIOPEN ; INDIRECT FILE OPEN? BEQ GTCMD3 JSR TINTST ; YES- ANYTHING LEFT? BCS GETINP ; YES GTCMD3 LDA #'* ; PRINT PROMPT JSR CONOUT GETINP JSR TTYIN ; GET CHAR FROM CONSOLE CMP #0 BEQ GETINP ; IGNORE NULLS STA INCHAR ; CPY FRSTCH ; FIRST CHAR TYPED YET? BEQ CHKSTR JMP NOFRST ; CHKSTR CPY EIOPEN BEQ CKSTR1 JMP BDFRST ; CKSTR1 CMP #'* ; YES- CHECK FOR *N OR ? BNE CKQUES JSR TTYIN ; PUT LAST CMD IN Q REG JSR GTQRG1 ; GET Q REG NUMBER JSR GETQST JSR QBFPTR JSR QZERO LDA CMDSIZ STA CHRCNT STA QRGCNT,X LDA CMDSIZ+1 STA CHRCNT+1 STA QRGCNT+1,X SEC ; GET COMMAND BUFFER START LDA CMDST SBC CMDSIZ STA TXTPTR LDA CMDST+1 SBC CMDSIZ+1 STA TXTPTR+1 JSR INTEXT JSR RESPTR JMP GETCMD ; CKQUES CMP #'? BNE CHKLF LDX LSTERR BEQ BDFRST LDA CMDREG ASL A TAX JSR GETQST ; CKERND LDA QSTART CMP CMDPTR BNE ERRPRT LDA QSTART+1 CMP CMDPTR+1 BEQ PTERND ; ERRPRT LDA (QSTART),Y JSR TTYOUT INC QSTART BNE CKERND INC QSTART+1 BNE CKERND ; PTERND LDA #'? JSR CONOUT GETJMP JMP GETCMD ; IQNERR LDA #17 ; ?IQN ERROR JMP ERROR ; CHKLF CMP #10 ; LF? BNE CHKBS LDA CURSUP ; YES- EAT LF JSR SPCOUT ; STY SRHCNT+1 ; DO LT$$ LDA #1 SPCMOV STA SRHCNT JSR LMOVE1 ; JSR KILINE ; ERASE INPUT LINE LDA EVFLAG ; NO PRINT IF EV ACTIVE ORA EVFLAG+1 BNE G1JMP STY SRHCNT+1 ; 1T LDA #1 STA SRHCNT JSR LFFIND JSR FNDRG1 JSR TYPCHK G1JMP JMP GTCMD1 ; CHKBS CMP #8 ; BS? BNE BDFRST LDA #$FF ; YES- DO -LT$$ STA SRHCNT+1 BNE SPCMOV ; BDFRST INC FRSTCH PHA JSR INITCM ; INIT COMMAND POINTER PLA ; NOFRST CPY EIOPEN BNE NOCTLU CMP #$7F ; DELETE? BNE CKCTLC STA LSTCHR LDA COMPTR ; YES- AT START OF BUF? CMP CMDST BNE NOBFST LDA COMPTR+1 CMP CMDST+1 BEQ GETJMP ; NOBFST JSR DELCHR ; NO- REMOVE CHAR JMP GETINP ; CKCTLC LDA INCHAR CMP #$03 ; ^C? BNE NOCTLC CMP LSTCHR ; YES- WAS LAST CHAR BNE NOEXIT ; ALSO ^C? JMP TECOEX ; YES- EXIT TECO ; NOEXIT JSR EATBUF ; NO- ERASE INPUT BUF JSR CRLF LDY #3 JMP GTCMD2 ; NOCTLC CMP #$15 ; ^U? BNE NOCTLU JSR KILINE JSR FINDLF ; YES- DELETE UP TO PHP ; SAVE STATUS SEC ; UPDATE CMDSIZ (=CMDSIZ LDA CMDSIZ ; -COMPTR+LASTLF) SBC COMPTR PHA LDA CMDSIZ+1 SBC COMPTR+1 STA TEMP CLC PLA ADC LASTLF STA CMDSIZ LDA TEMP ADC LASTLF+1 STA CMDSIZ+1 ; LDA LASTLF ; LAST LINE FEED STA COMPTR LDA LASTLF+1 STA COMPTR+1 PLP BCS INPJMP JMP GTCMD1 ; BUFFER EMPTY- PRINT * ; NOCTLU CMP #$1B ; ESCAPE? BNE NOTESC CMP LSTCHR ; WAS LAST CHAR ESCAPE? BNE ADDCHR JSR PUTCHR ; YES- ADD TO BUF AND JMP GOTCMD ; PROCESS INPUT BUFFER ; NOTESC CPY EIOPEN BNE ADDCHR LDA LSTCHR ; LAST CHAR ^G? CMP #7 BNE ADDCHR LDA INCHAR ; YES- THIS CHAR ^G? CMP #7 BNE CHKSPC JSR REMCHR ; YES- ALLOW *N STY FRSTCH LDA COMPTR STA BUFEND LDA COMPTR+1 STA BUFEND+1 JMP GETCMD ; YES- EAT BUFFER ; CHKSPC CMP #$20 ; NO- SPACE? BNE NOSPAC JSR REMCHR ; YES- REMOVE ^G FROM BUFFER JSR CRLF JSR REDRAW ; REDRAW CURRENT LINE INPJMP JMP GETINP ; NOSPAC CMP #'* ; ASTERISK? BNE ADDCHR JSR REMCHR ; YES- REMOVE ^G FROM BUFFER LDA CMDST ; PRINT OUT BUFFER STA LASTLF LDA CMDST+1 STA LASTLF+1 JSR CRLF JSR CTLGPR JMP GETINP ; ADDCHR LDA INCHAR STA LSTCHR JSR PUTCHR ; ADD CHAR TO BUFFER BCC JMPINP CPY EIOPEN BNE JMPINP CMP #13 ; CARRIAGE RETURN? BNE JMPINP ; ADDLF LDA #10 ; YES- ADD LF JSR CONOUT JSR PUTCHR JMPINP JMP GETINP ; DELCHR JSR REMCHR ; REMOVE CHAR FROM BUFFER LDA (COMPTR),Y ; GET CHAR FROM BUFFER CMP #$20 ; CONTROL CHAR? BCS ONECHR CMP #$1B ; ESCAPE? BEQ ONECHR ; YES- ERASE '$' CMP #7 ; ^G? BEQ DELRTN ; YES- NON-PRINTING CMP #12 ; FORM FEED? BEQ DELRTN ; YES- NON-PRINTING CMP #9 ; TAB? BNE NOTTAB JSR KILINE ; YES- REDRAW LINE GOTCR JSR REDRAW DELRTN RTS ; NOTTAB CMP #10 ; LF? BNE NOTLFD LDA CURSUP ; YES- CURSOR UP JMP SPCOUT ; NOTLFD CMP #13 ; CR? BEQ GOTCR ; YES- REDRAW LINE ; JSR ERASE ; NO- DELETE ^ + CHAR ONECHR JMP ERASE ; REDRAW JSR FINDLF ; PRINT CURRENT LINE BCS PRTCMD ; CTLGPR LDA #'* JSR CONOUT PRTCMD LDA COMPTR ; DONE WITH LINE? CMP LASTLF BNE CHROUT LDA COMPTR+1 CMP LASTLF+1 BNE CHROUT ; STY LSTCHR RTS ; CHROUT LDA (LASTLF),Y ; PRINT CHAR JSR CONOUT INC LASTLF BNE PRTCMD INC LASTLF+1 BNE PRTCMD ; KILINE LDA CNSTAI ; CRLF OR ERASE LINE? AND #$10 BNE ERALIN JMP CRLF ; ERALIN LDA CONPOS BEQ KILRTN JSR ERASE ; ERASE LAST CHAR JMP ERALIN KILRTN RTS ; ERASE JSR BACK ; BACKSPACE, SPACE, BACKSPACE LDA #$20 JSR CONOUT ; BACK DEC CONPOS ; PRINT BACKSPACE LDA BACKSP SPCOUT BEQ NOSPCL BPL NOLEAD PHA ; NEEDS LEADIN LDA LEADIN JSR BINOUT PLA AND #$7F NOLEAD JSR BINOUT NOSPCL RTS ; PUTCHR PHA SEC ; CHECK FOR FULL BUFFER LDA MAXEND SBC COMPTR STA TEMP LDA MAXEND+1 SBC COMPTR+1 BNE PUTCH1 LDA TEMP ; >10 CHARS LEFT IN BUFFER? CMP #10 BCS PUTCH1 LDA #7 ; NO- PRINT BELL JSR CONOUT LDA TEMP BNE PUTCH1 PLA ; NO ROOM- IGNORE CHAR CLC RTS ; PUTCH1 PLA STA (COMPTR),Y ; ADD CHAR TO BUFFER INC COMPTR BNE INCPSZ INC COMPTR+1 INCPSZ INC CMDSIZ BNE ADDRTN INC CMDSIZ+1 ADDRTN SEC ; ECHO IT RTS ; REMCHR SEC ; REMOVE CHAR FROM BUF LDA COMPTR SBC #1 STA COMPTR LDA COMPTR+1 SBC #0 STA COMPTR+1 SEC LDA CMDSIZ SBC #1 STA CMDSIZ LDA CMDSIZ+1 SBC #0 STA CMDSIZ+1 RTS ; FINDLF LDA COMPTR ; FIND LAST LF IN BUFFER STA LASTLF LDA COMPTR+1 STA LASTLF+1 ; FNDLF1 LDA LASTLF+1 ; AT BEGINNING OF BUF? CMP CMDST+1 BNE NOTBGN LDA LASTLF CMP CMDST BNE NOTBGN CLC ; YES- RETURN CARRY CLR RTS ; NOTBGN SEC ; DEC POINTER LDA LASTLF SBC #1 STA LASTLF LDA LASTLF+1 SBC #0 STA LASTLF+1 ; LDA (LASTLF),Y ; IS CHAR A LF? CMP #10 BNE FNDLF1 INC LASTLF ; YES- INC PTR & RETURN BNE FNDRTN INC LASTLF+1 SEC FNDRTN RTS ; CRLF LDA #13 ; PRINT CR/LF COMBO JSR CONOUT LDA #10 JSR CONOUT RTS ; DIGCHK SEC ; CHECK FOR LEGAL DIGIT SBC #'0 BPL LONMOK DIGERR CLC RTS ; RETURN WITH CARRY CLR ; LONMOK CMP #10 BPL DIGERR SEC RTS ; RETURN CARRY SET ; INITCM SEC ; INIT COMMAND PTR LDA BUFEND SBC CMDSIZ STA BUFEND STA COMPTR LDA BUFEND+1 SBC CMDSIZ+1 STA BUFEND+1 CMDZRO STA COMPTR+1 STY CMDSIZ STY CMDSIZ+1 RTS ; EATBUF SEC ; EAT CURRENT INP BUFFER LDA COMPTR SBC CMDSIZ STA COMPTR LDA COMPTR+1 SBC CMDSIZ+1 JMP CMDZRO ; ; GOTCMD LDX EIOPEN BNE GOTCM1 JSR CRLF ; GOT COMMAND, PROCESS GOTCM1 LDA XABPTR ; ON ^C, JMP XABERR STA CTCRTN LDA XABPTR+1 STA CTCRTN+1 LDA CMDST STA CMDPTR LDA CMDST+1 STA CMDPTR+1 LDA COMPTR STA BUFEND LDA COMPTR+1 STA BUFEND+1 LDA CMDSIZ STA CMDCNT LDA CMDSIZ+1 STA CMDCNT+1 LDA #36 ; COMMAND STRING = Q REG #36 STA CMDREG STY PSHCNT ; PUSH DOWN LEVEL STY FRSTCH STY LSTERR STY TRCMOD STY PRDPTH ; PROCMD LDY #0 STY LOARG STY LOARG+1 STY GOTLO ; PRCMD1 LDA #1 STA NUMASM STY GOTHI TYA ; PRCMD2 STA HIARG STA HIARG+1 PRCMD3 STY LSTARG STY LSTARG+1 STY LASTOP LDA #'+ ; OPERATOR=ADD STA OPER ; NXTCMD JSR CNISTA ; CHAR TYPED? BCC NXTCM1 JSR CONIN ; YES- ^C? CMP #3 BEQ XABERR LDX TINSIZ ; NO- ADD TO KB BUFFER BMI NXTCM1 ; FULL- IGNORE STA TINBUF,X INC TINSIZ BNE NXTCM1 ; XABERR STY TINSIZ LDA CMDREG ; DURING MACRO? CMP #36 BNE XABER1 LDA ETFLAG+1 ; YES- BIT 0 OF ET FLAG SET? BPL XABER1 AND #$7F STA ETFLAG+1 ; YES- RESET & GET NEW COMMAND JMP NXTCM1 ; XABER1 LDA #33 ; ?XAB ERROR JMP ERROR ; NXTCM1 STY GOTAT ; =1 IF LAST CHAR='@' STY GOTCLN ; =1 IF LAST CHAR=':' STY COLONA JSR GTCMCH ; GET CHAR FROM BUFFER BCC CMDONE ; DONE WITH COMMAND ; EXECMD ASL A TAX LDA JMPTBL,X STA CMDJMP+1 LDA JMPTBL+1,X STA CMDJMP+2 CMDJMP JMP $0000 ; EXECUTE COMMAND ; CMDONE LDA PRDPTH ; ANY )'S LEFT? BEQ CMDON1 MRPERR LDA #42 ; YES- ?MRP ERROR JMP ERROR ; CMDON1 LDA PSHCNT ; DONE WITH ITERATIONS/MACROS? BEQ DONEOK JSR CHKITR BCS UTCERR ; ITERATION LEFT ON STACK JSR POP ; MACRO- POP FROM STACK DEC PSHCNT JMP NXTCMD ; UTCERR LDA #11 ; ?UTC ERROR JMP ERROR DONEOK JMP GTCMD1 ; YES- GET NEXT COMMAND ; UPAROW JSR GTCMCH ; UPARROW COMMAND BCC ILLERR CMP #$40 BMI ILLERR AND #$1F ; CONVERT TO CTRL CHAR JMP EXECMD ; ILLERR TYA ; ?ILL ERROR JMP ERROR ; GTCMCH JSR GETCHR ; GET COMMAND CHAR BCC GTCMER AND #$7F CMP #$60 ; LOWER CASE? BMI GTCMDN SBC #$20 ; YES- MAKE UPPER CASE GTCMDN SEC GTCMER RTS ; GETCHR LDA (CMDPTR),Y ; GET CHAR FROM INP BUF STA INCHAR SEC ; AT END OF BUF? LDA CMDCNT SBC #1 STA CMDCNT LDA CMDCNT+1 SBC #0 STA CMDCNT+1 BCC GETRTN ; END OF COMMAND STRING INC CMDPTR BNE CKTRAC INC CMDPTR+1 CKTRAC LDA TRCMOD ; TRACE MODE? BEQ GETRTN LDA INCHAR ; YES- ECHO CHAR JSR CONOUT SEC GETRTN LDA INCHAR RTS ; DIGIT LDA RADIX ; RADIX=8? CMP #8 BNE DIGOK LDA INCHAR ; YES- DIGIT 8 OR 9? CMP #'8 BMI DIGOK LDA #1 ; YES- ?ILN ERROR JMP ERROR ; DIGOK LDA NUMASM ORA LASTOP BNE EXPOK BADEXP LDA #2 ; ?IEX ERROR JMP ERROR ; EXPOK INC NUMASM INC GOTHI LDA RADIX STA MULNUM STY MULNUM+1 STY LASTOP LDA LSTARG ; SAVE LSTARG PHA LDA LSTARG+1 PHA JSR MULT ; MULTIPLY HIVAL*RADIX SEC LDA INCHAR SBC #'0 CLC ADC LSTARG STA HIARG LDA LSTARG+1 ADC #0 STA HIARG+1 PLA ; RESTORE LSTARG STA LSTARG+1 PLA STA LSTARG JMP NXTCMD ; LPAR LDX PRDPTH ; ( COMMAND CPX #MAXPAR ; ROOM LEFT ON STACK? BNE LPAR1 LDA #8 ; NO- ?PDO ERROR JMP ERROR ; LPAR1 LDA LASTOP ; MUST HAVE JUST HAD OPERATION BNE LPAR2 LDA GOTHI BNE BADEXP ; LPAR2 LDA OPER STA PARSTK,X INX LDA LSTARG STA PARSTK,X INX LDA LSTARG+1 STA PARSTK,X INX STX PRDPTH JMP PRCMD1 ; RPAR LDA LASTOP ; ) COMMAND BEQ RPAR1 ; LAST CHAR OP? LDA #44 ; YES- ?NAP ERROR JMP ERROR ; RPAR1 JSR DOOPER LDX PRDPTH BNE RPAR2 LDA #43 ; ?ERP ERROR JMP ERROR ; RPAR2 LDA LSTARG STA HIARG LDA LSTARG+1 STA HIARG+1 DEX LDA PARSTK,X STA LSTARG+1 DEX LDA PARSTK,X STA LSTARG DEX LDA PARSTK,X STA OPER STX PRDPTH STY LASTOP INC NUMASM JMP NXTCMD ; ; ; PERFORM OPERATION DOOPER LDA LASTOP ; LAST CHAR AN OPERATOR? BEQ DOOPR1 JMP BADEXP ; YES- ?IEX ERROR ; DOOPR1 LDA OPER CMP #'+ ; DO OPERATION BNE NOTADD CLC ; ADD LDA LSTARG ADC HIARG STA LSTARG LDA LSTARG+1 ADC HIARG+1 STA LSTARG+1 ; DONEOP STY HIARG STY HIARG+1 STY NUMASM LDA INCHAR STA OPER INC LASTOP RTS ; NOTADD CMP #'- BNE NOTSUB SEC ; SUBTRACT LDA LSTARG SBC HIARG STA LSTARG LDA LSTARG+1 SBC HIARG+1 STA LSTARG+1 JMP DONEOP ; NOTSUB CMP #'* BNE NOTMUL LDA LSTARG STA MULNUM LDA LSTARG+1 STA MULNUM+1 JSR MULT JMP DONEOP ; NOTMUL CMP #'/ BNE NOTDIV LDA HIARG ; DIVIDE STA DIVNUM LDA HIARG+1 STA DIVNUM+1 LDA LSTARG STA HIARG LDA LSTARG+1 STA HIARG+1 JSR DIVIDE JMP DONEOP ; NOTDIV CMP #'& BNE NOTAND LDA LSTARG ; AND AND HIARG STA LSTARG LDA LSTARG+1 AND HIARG+1 STA LSTARG+1 JMP DONEOP ; NOTAND CMP #'# BNE NOTOR LDA LSTARG ; OR ORA HIARG STA LSTARG LDA LSTARG+1 ORA HIARG+1 STA LSTARG+1 JMP DONEOP ; NOTOR JMP BADEXP ; ??? ; NEWOP JSR DOOPER JMP NXTCMD ; CMPCMD LDA HIARG ; UPARROW/BACKSPACE CMD EOR #$FF ; COMPLEMENT LSTARG STA HIARG LDA HIARG+1 EOR #$FF STA HIARG+1 JMP NXTCMD ; ASCCMD JSR GETCHR ; UPARROW/UPARROW CMD ASCRTN STA HIARG STY HIARG+1 VALRTN STY LASTOP INC GOTHI JMP NXTCMD ; CARETT LDA GOTHI ; UPARROW/T COMMAND BEQ GETTCH ; ARGUMENT GIVEN? LDA LASTOP ; COULD BE n+^T BNE GETTCH JSR DOOPER ; YES- PRINT CHR(LSTARG) LDA LSTARG JSR TTYOUT JMP PROCMD ; GETTCH LDA ETFLAG ; READ WITH NO WAIT? AND #$20 BEQ GTTCH1 LDA TINSIZ BNE GTTCH1 JSR CNISTA ; YES- CHAR READY? BCS GTTCH1 JMP NOTZRO ; NO- RETURN -1 ; GTTCH1 JSR TTYIN ; READ CHAR FROM KEYBRD ASCJMP JMP ASCRTN ; CARETQ JSR CHKARG ; ^Q COMMAND LDA LSTARG STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LFFIND SEC LDA TEMPTR SBC BUFPTR STA HIARG LDA TEMPTR+1 SBC BUFPTR+1 STA HIARG+1 JMP NEWVAL ; CARETA LDA #1 ; UPARROW/A COMMAND JSR FDESC2 ; FIND CLOSING ^A LDA CHRCNT ORA CHRCNT+1 BEQ CTLADN ; GETACH LDA (TXTPTR),Y JSR TTYOUT INC TXTPTR BNE NXTCTA INC TXTPTR+1 NXTCTA JSR DECCNT BNE GETACH CTLADN JMP PROCMD ; BVALUE TYA ; B=0 BEQ ASCJMP ; ZVALUE LDA BUFSIZ ; Z=BUFSIZ STA HIARG LDA BUFSIZ+1 STA HIARG+1 JMP VALRTN ; HVALUE STY LOARG ; H=B,Z STY LOARG+1 INC GOTLO BNE ZVALUE ; DOTVAL JSR GETDOT ; . COMMAND JMP VALRTN ; CARETB LDA DATE ; ^B COMMAND STA HIARG LDA DATE+1 STA HIARG+1 INC GOTHI JMP NXTCMD ; CARETC LDA CMDREG ; ^C COMMAND CMP #36 ; DURING MACRO? BEQ CTCEXT JMP GETCMD ; YES- GET NEW COMMAND LINE CTCEXT JMP TECOEX ; NO- EXIT TECO ; COMMA LDA GOTHI ; , COMMAND BNE COMOK LDA #18 ; ?NAC ERROR JMP ERROR ; COMOK JSR DOOPER LDA LSTARG STA LOARG LDA LSTARG+1 STA LOARG+1 INC GOTLO JMP PRCMD1 ; LMOVE JSR CHKARG ; L COMMAND LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LMOVE1 JMP PROCMD ; LMOVE1 JSR LFFIND LDA TEMPTR ; POSITION POINTER THERE STA BUFPTR LDA TEMPTR+1 STA BUFPTR+1 RTS ; CMOVE JSR CHKARG ; C COMMAND CMOVE1 JSR CKPTR1 BEQ GOTC POPERR LDA #7 ; ?POP ERROR JMP ERROR ; GOTC LDA ENDLIM STA BUFPTR LDA ENDLIM+1 STA BUFPTR+1 JMP PROCMD ; JMOVE JSR DOOPER ; J COMMAND JSR BPTR ; RESET POINTER JMP CMOVE1 ; RMOVE JSR CHKARG ; R COMMAND SEC ; = -NC TYA ; NEGATE LSTARG SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JMP CMOVE1 ; TYPE JSR CHKARG ; T COMMAND JSR TYPOUT JMP PROCMD ; VERIFY JSR CHKARG ; V COMMAND LDA LSTARG PHA LDA LSTARG+1 PHA SEC ; DO 1-NT LDA #1 SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JSR TYPOUT ; PLA ; NOW DO NT STA LSTARG+1 PLA STA LSTARG JSR TYPOUT JMP PROCMD ; TYPOUT JSR FNDARG ; = T COMMAND ; TYPCHK SEC ; DONE? LDA TEMPTR SBC LSTARG LDA TEMPTR+1 SBC LSTARG+1 BCS TYPDON ; LDA (TEMPTR),Y JSR TTYOUT JSR INCTEM JMP TYPCHK TYPDON RTS ; GETDOT SEC ; GET VALUE OF . LDA BUFPTR ; .=BUFPTR-BUFST SBC BUFST STA HIARG LDA BUFPTR+1 SBC BUFST+1 STA HIARG+1 RTS ; DRADIX LDA #10 ; UPARROW/D COMMAND RDXRTN STA RADIX ; CHANGE RADIX JMP PROCMD ; ORADIX LDA #8 ; UPARROW/O COMMAND BNE RDXRTN ; HRADIX LDA #16 BNE RDXRTN ; HEXCMD LDX #4 ; $ COMMAND NXTHEX JSR GTCMCH ; GET 4 HEX DIGITS BCC BADHEX JSR CHKHEX BCC BADHEX STA TEMP ; LDY #4 ; MULTIPLY BY 16 LDA HIARG SFTHEX ASL A ROL HIARG+1 DEY BNE SFTHEX ; ORA TEMP ; ADD DIGIT STA HIARG DEX BNE NXTHEX INC GOTHI JMP NXTCMD ; BADHEX LDA #40 ; ?IHC ERROR JMP ERROR ; CHKHEX JSR DIGCHK ; 0..9? BCS HXGOOD BMI HEXBAD SBC #6 ; NO- A..F? CMP #10 BCC HEXBAD CMP #16 BCS HEXBAD HXGOOD SEC ; YES- RETURN CARRY SET RTS ; HEXBAD CLC ; NO- RETURN CARRY CLEAR RTS ; CARETS SEC ; UPARROW/S COMMAND TYA ; RETURN -STRSIZ SBC STRSIZ STA HIARG TYA SBC STRSIZ+1 STA HIARG+1 JMP VALRTN ; CARETY JSR GETDOT ; UPARROW/Y COMMAND SEC ; =.+^S,. LDA HIARG SBC STRSIZ STA LOARG LDA HIARG+1 SBC STRSIZ+1 STA LOARG+1 INC GOTLO JMP VALRTN ; CARETZ LDX #74 ; ^Z COMMAND STY QSTART STY QSTART+1 JSR ADDQST ; # CHARS FOR Q REG/COMMAND LDA QSTART ; STRING STORAGE STA HIARG LDA QSTART+1 STA HIARG+1 JMP VALRTN ; EQUAL LDA GOTHI ; LAST CHAR OPERATOR? BNE EXPROK LDA #3 ; YES- ?NAE ERROR JMP ERROR ; EXPROK LDA RADIX STA TEMP1 LDA (CMDPTR),Y ; :==? CMP #'= BNE EQUAL1 JSR GETCHR LDA #8 ; YES- PRINT IN OCTAL STA RADIX ; EQUAL1 JSR CVTNUM RESOUT LDA NUMSTR,X JSR CONOUT INX CPX #6 BNE RESOUT ; LDA GOTCLN ; :=? BNE EQUAL2 ; YES- NO CRLF JSR CRLF EQUAL2 LDA TEMP1 ; RESTORE RADIX STA RADIX JMP PROCMD ; ; CONVERT NUMBER TO STRING OF CURRENT RADIX CVTNUM JSR DOOPER STY NUMSGN LDA RADIX ; NEGATIVE BASE 10 #? CMP #10 BNE NODCNG LDA LSTARG+1 BPL NODCNG SEC ; YES- NEGATE & FLAG TYA SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 LDA #'- STA NUMSGN ; NODCNG LDX #5 ; CONVERT UP TO 5 DIGITS CVTDIV LDA LSTARG+1 STA TEMP+1 LDA LSTARG STY LSTARG STY LSTARG+1 SEC CVTDV1 SBC RADIX BCC CVTDV3 CVTDV2 INC LSTARG BNE CVTDV1 INC LSTARG+1 BNE CVTDV1 ; CVTDV3 PHA LDA TEMP+1 BEQ CVTDON DEC TEMP+1 PLA SEC BCS CVTDV2 ; CVTDON PLA ; CONVERT REMAINDER TO ASCII DIGIT ADC RADIX SED CLC ADC #'0 CLD STA NUMSTR,X DEX BPL CVTDIV ; INX ; SKIP LEADING ZEROES SKPLD0 LDA NUMSTR,X CMP #'0 BNE GOTCVT INX CPX #5 BNE SKPLD0 ; GOTCVT LDA NUMSGN ; INSERT SIGN? BEQ CVTRTN DEX STA NUMSTR,X CVTRTN RTS ; ; SEARCH FOR SRHCNT LF'S & RETURN IN TEMPTR LFFIND LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 LDA SRHCNT+1 ; NEGATIVE SEARCH? BMI NEGSRH ORA SRHCNT BNE POSRCH ; NEGSRH SEC ; YES- COUNT=-SRHCNT+1 LDA #1 SBC SRHCNT STA SRHCNT TYA SBC SRHCNT+1 STA SRHCNT+1 ; LFIND1 JSR DECTEM SEC ; DONE? LDA TEMPTR SBC BUFST LDA TEMPTR+1 SBC BUFST+1 BCC FNDONM ; YES- RETURN LDA (TEMPTR),Y ; NO- LF? CMP #10 BNE LFIND1 JSR DECSRH BNE LFIND1 ; FNDONM JSR INCTEM FNDONE RTS ; POSRCH JSR GETEND ; POSITIVE SEARCH POSRH1 SEC ; DONE? LDA TEMPTR SBC ENDBUF LDA TEMPTR+1 SBC ENDBUF+1 BCS FNDONE LDA (TEMPTR),Y ; NO- LF? CMP #10 BEQ LFOUND POSRH2 JSR INCTEM ; NO- INC POINTER JMP POSRH1 ; LFOUND JSR DECSRH ; YES- DEC COUNT BNE POSRH2 BEQ FNDONM ; ; MULTIPLY HIARG*MULNUM WITH RESULT IN LSTARG MULT STY LSTARG STY LSTARG+1 ; LDX #16 MULT1 LSR MULNUM+1 ROR MULNUM BCC NXTMUL ; CLC LDA LSTARG ADC HIARG STA LSTARG LDA LSTARG+1 ADC HIARG+1 STA LSTARG+1 ; NXTMUL ASL HIARG ROL HIARG+1 DEX BNE MULT1 MULDON RTS ; ; DIVIDE HIARG/DIVNUM WITH RESULT IN LSTARG DIVIDE LDA DIVNUM ; DIVIDE BY 0? ORA DIVNUM+1 BNE DIVOK PLA ; EAT JSR PLA LDA #4 ; YES- ?DIV ERROR JMP ERROR ; DIVOK STY LSTARG STY LSTARG+1 ; DIV1 SEC LDA HIARG SBC DIVNUM STA HIARG LDA HIARG+1 SBC DIVNUM+1 STA HIARG+1 BCC DIVDON INC LSTARG BNE DIV1 INC LSTARG+1 JMP DIV1 DIVDON RTS ; CHKARG LDA PRDPTH ; MAKE SURE ()'S MATCHED BEQ CKARG1 JMP MRPERR ; CKARG1 LDA GOTHI ; HIARG SPECIFIED? BNE ARGOK LDA #1 ; NO- DEFAULT TO 1 STA GOTHI STA HIARG STY HIARG+1 STY LASTOP ARGOK JSR DOOPER RTS ; ; GET LOW LIMIT IN TEMPTR & HI LIMIT IN LSTARG ; FOR LINE ORIENTED OR M,N TYPE COMMANDS FNDARG LDA GOTLO ; ARGS OF FORM M,N? BNE LOHIOK LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LFFIND LDA LSTARG+1 ; NEGATIVE? BMI NEGARG ORA LSTARG BEQ NEGARG ; FNDRG1 LDA TEMPTR ; NO- DO .,TEMPTR STA LSTARG LDA TEMPTR+1 STA LSTARG+1 LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 RTS ; NEGARG LDA BUFPTR ; YES- DO TEMPTR,. STA LSTARG LDA BUFPTR+1 STA LSTARG+1 RTS ; LOHIOK JSR ADDST ; ADD BUFST TO ARGS LDA TEMPTR ; CHECK FOR LEGAL LIMITS STA CHRPTR LDA TEMPTR+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA TEMPTR LDA ENDLIM+1 STA TEMPTR+1 ; LDA LSTARG STA CHRPTR LDA LSTARG+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA LSTARG LDA ENDLIM+1 STA LSTARG+1 RTS ; BPTR LDA BUFST ; RESET POINTER TO STA BUFPTR ; START OF PAGE LDA BUFST+1 STA BUFPTR+1 RTS ; ADDST CLC ; ADD BUFST TO ARGS LDA LOARG ADC BUFST STA TEMPTR LDA LOARG+1 ADC BUFST+1 STA TEMPTR+1 CLC LDA LSTARG ADC BUFST STA LSTARG LDA LSTARG+1 ADC BUFST+1 STA LSTARG+1 RTS ; GETEND CLC ; COMPUTE BUFFER END LDA BUFST ADC BUFSIZ STA ENDBUF LDA BUFST+1 ADC BUFSIZ+1 STA ENDBUF+1 RTS ; INCTEM INC TEMPTR BNE INCRTN INC TEMPTR+1 INCRTN RTS ; INCTM1 INC TMPTR1 BNE INCRTN INC TMPTR1+1 RTS ; INCPTR INC BUFPTR BNE INCRTN INC BUFPTR+1 RTS ; DECTEM LDA TEMPTR BNE DCTEMA DEC TEMPTR+1 DCTEMA DEC TEMPTR RTS ; DECTM1 LDA TMPTR1 BNE DCTM1A DEC TMPTR1VALRTN ; CARETB LDA DATE ; ^B COMMAND STA HIARG LDA DATE+1 STA HIARG+1 INC GOTHI JMP NXTCMD ; CARETC LDA CMDREG ; ^C COMMAND CMP #36 ; DURING MACRO? BEQ CTCEXT JMP GETCMD ; YES- GET NEW COMMAND LINE CTCEXT JMP TECOEX ; NO- EXIT TECO ; COMMA LDA GOTHI ; , COMMAND BNE COMOK LDA #18 ; ?NAC ERROR JMP ERROR ; COMOK JSR DOOPER LDA LSTARG STA LOARG LDA LSTARG+1 STA LOARG+1 INC GOTLO JMP PRCMD1 ; LMOVE JSR CHKARG ; L COMMAND LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LMOVE1 JMP PROCMD ; LMOVE1 JSR LFFIND LDA TEMPTR ; POSITION POINTER THERE STA BUFPTR LDA TEMPTR+1 STA BUFPTR+1 RTS ; CMOVE JSR CHKARG ; C COMMAND CMOVE1 JSR CKPTR1 BEQ GOTC POPERR LDA #7 ; ?POP ERROR JMP ERROR ; GOTC LDA ENDLIM STA BUFPTR LDA ENDLIM+1 STA BUFPTR+1 JMP PROCMD ; JMOVE JSR DOOPER ; J COMMAND JSR BPTR ; RESET POINTER JMP CMOVE1 ; RMOVE JSR CHKARG ; R COMMAND SEC ; = -NC TYA ; NEGATE LSTARG SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JMP CMOVE1 ; TYPE JSR CHKARG ; T COMMAND JSR TYPOUT JMP PROCMD ; VERIFY JSR CHKARG ; V COMMAND LDA LSTARG PHA LDA LSTARG+1 PHA SEC ; DO 1-NT LDA #1 SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JSR TYPOUT ; PLA ; NOW DO NT STA LSTARG+1 PLA STA LSTARG JSR TYPOUT JMP PROCMD ; TYPOUT JSR FNDARG ; = T COMMAND ; TYPCHK SEC ; DONE? LDA TEMPTR SBC LSTARG LDA TEMPTR+1 SBC LSTARG+1 BCS TYPDON ; LDA (TEMPTR),Y JSR TTYOUT JSR INCTEM JMP TYPCHK TYPDON RTS ; GETDOT SEC ; GET VALUE OF . LDA BUFPTR ; .=BUFPTR-BUFST SBC BUFST STA HIARG LDA BUFPTR+1 SBC BUFST+1 STA HIARG+1 RTS ; DRADIX LDA #10 ; UPARROW/D COMMAND RDXRTN STA RADIX ; CHANGE RADIX JMP PROCMD ; ORADIX LDA #8 ; UPARROW/O COMMAND BNE RDXRTN ; HRADIX LDA #16 BNE RDXRTN ; HEXCMD LDX #4 ; $ COMMAND NXTHEX JSR GTCMCH ; GET 4 HEX DIGITS BCC BADHEX JSR CHKHEX BCC BADHEX STA TEMP ; LDY #4 ; MULTIPLY BY 16 LDA HIARG SFTHEX ASL A ROL HIARG+1 DEY BNE SFTHEX ; ORA TEMP ; ADD DIGIT STA HIARG DEX BNE NXTHEX INC GOTHI JMP NXTCMD ; BADHEX LDA #40 ; ?IHC ERROR JMP ERROR ; CHKHEX JSR DIGCHK ; 0..9? BCS HXGOOD BMI HEXBAD SBC #6 ; NO- A..F? CMP #10 BCC HEXBAD CMP #16 BCS HEXBAD HXGOOD SEC ; YES- RETURN CARRY SET RTS ; HEXBAD CLC ; NO- RETURN CARRY CLEAR RTS ; CARETS SEC ; UPARROW/S COMMAND TYA ; RETURN -STRSIZ SBC STRSIZ STA HIARG TYA SBC STRSIZ+1 STA HIARG+1 JMP VALRTN ; CARETY JSR GETDOT ; UPARROW/Y COMMAND SEC ; =.+^S,. LDA HIARG SBC STRSIZ STA LOARG LDA HIARG+1 SBC STRSIZ+1 STA LOARG+1 INC GOTLO JMP VALRTN ; CARETZ LDX #74 ; ^Z COMMAND STY QSTART STY QSTART+1 JSR ADDQST ; # CHARS FOR Q REG/COMMAND LDA QSTART ; STRING STORAGE STA HIARG LDA QSTART+1 STA HIARG+1 JMP VALRTN ; EQUAL LDA GOTHI ; LAST CHAR OPERATOR? BNE EXPROK LDA #3 ; YES- ?NAE ERROR JMP ERROR ; EXPROK LDA RADIX STA TEMP1 LDA (CMDPTR),Y ; :==? CMP #'= BNE EQUAL1 JSR GETCHR LDA #8 ; YES- PRINT IN OCTAL STA RADIX ; EQUAL1 JSR CVTNUM RESOUT LDA NUMSTR,X JSR CONOUT INX CPX #6 BNE RESOUT ; LDA GOTCLN ; :=? BNE EQUAL2 ; YES- NO CRLF JSR CRLF EQUAL2 LDA TEMP1 ; RESTORE RADIX STA RADIX JMP PROCMD ; ; CONVERT NUMBER TO STRING OF CURRENT RADIX CVTNUM JSR DOOPER STY NUMSGN LDA RADIX ; NEGATIVE BASE 10 #? CMP #10 BNE NODCNG LDA LSTARG+1 BPL NODCNG SEC ; YES- NEGATE & FLAG TYA SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 LDA #'- STA NUMSGN ; NODCNG LDX #5 ; CONVERT UP TO 5 DIGITS CVTDIV LDA LSTARG+1 STA TEMP+1 LDA LSTARG STY LSTARG STY LSTARG+1 SEC CVTDV1 SBC RADIX BCC CVTDV3 CVTDV2 INC LSTARG BNE CVTDV1 INC LSTARG+1 BNE CVTDV1 ; CVTDV3 PHA LDA TEMP+1 BEQ CVTDON DEC TEMP+1 PLA SEC BCS CVTDV2 ; CVTDON PLA ; CONVERT REMAINDER TO ASCII DIGIT ADC RADIX SED CLC ADC #'0 CLD STA NUMSTR,X DEX BPL CVTDIV ; INX ; SKIP LEADING ZEROES SKPLD0 LDA NUMSTR,X CMP #'0 BNE GOTCVT INX CPX #5 BNE SKPLD0 ; GOTCVT LDA NUMSGN ; INSERT SIGN? BEQ CVTRTN DEX STA NUMSTR,X CVTRTN RTS ; ; SEARCH FOR SRHCNT LF'S & RETURN IN TEMPTR LFFIND LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 LDA SRHCNT+1 ; NEGATIVE SEARCH? BMI NEGSRH ORA SRHCNT BNE POSRCH ; NEGSRH SEC ; YES- COUNT=-SRHCNT+1 LDA #1 SBC SRHCNT STA SRHCNT TYA SBC SRHCNT+1 STA SRHCNT+1 ; LFIND1 JSR DECTEM SEC ; DONE? LDA TEMPTR SBC BUFST LDA TEMPTR+1 SBC BUFST+1 BCC FNDONM ; YES- RETURN LDA (TEMPTR),Y ; NO- LF? CMP #10 BNE LFIND1 JSR DECSRH BNE LFIND1 ; FNDONM JSR INCTEM FNDONE RTS ; POSRCH JSR GETEND ; POSITIVE SEARCH POSRH1 SEC ; DONE? LDA TEMPTR SBC ENDBUF LDA TEMPTR+1 SBC ENDBUF+1 BCS FNDONE LDA (TEMPTR),Y ; NO- LF? CMP #10 BEQ LFOUND POSRH2 JSR INCTEM ; NO- INC POINTER JMP POSRH1 ; LFOUND JSR DECSRH ; YES- DEC COUNT BNE POSRH2 BEQ FNDONM ; ; MULTIPLY HIARG*MULNUM WITH RESULT IN LSTARG MULT STY LSTARG STY LSTARG+1 ; LDX #16 MULT1 LSR MULNUM+1 ROR MULNUM BCC NXTMUL ; CLC LDA LSTARG ADC HIARG STA LSTARG LDA LSTARG+1 ADC HIARG+1 STA LSTARG+1 ; NXTMUL ASL HIARG ROL HIARG+1 DEX BNE MULT1 MULDON RTS ; ; DIVIDE HIARG/DIVNUM WITH RESULT IN LSTARG DIVIDE LDA DIVNUM ; DIVIDE BY 0? ORA DIVNUM+1 BNE DIVOK PLA ; EAT JSR PLA LDA #4 ; YES- ?DIV ERROR JMP ERROR ; DIVOK STY LSTARG STY LSTARG+1 ; DIV1 SEC LDA HIARG SBC DIVNUM STA HIARG LDA HIARG+1 SBC DIVNUM+1 STA HIARG+1 BCC DIVDON INC LSTARG BNE DIV1 INC LSTARG+1 JMP DIV1 DIVDON RTS ; CHKARG LDA PRDPTH ; MAKE SURE ()'S MATCHED BEQ CKARG1 JMP MRPERR ; CKARG1 LDA GOTHI ; HIARG SPECIFIED? BNE ARGOK LDA #1 ; NO- DEFAULT TO 1 STA GOTHI STA HIARG STY HIARG+1 STY LASTOP ARGOK JSR DOOPER RTS ; ; GET LOW LIMIT IN TEMPTR & HI LIMIT IN LSTARG ; FOR LINE ORIENTED OR M,N TYPE COMMANDS FNDARG LDA GOTLO ; ARGS OF FORM M,N? BNE LOHIOK LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LFFIND LDA LSTARG+1 ; NEGATIVE? BMI NEGARG ORA LSTARG BEQ NEGARG ; FNDRG1 LDA TEMPTR ; NO- DO .,TEMPTR STA LSTARG LDA TEMPTR+1 STA LSTARG+1 LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 RTS ; NEGARG LDA BUFPTR ; YES- DO TEMPTR,. STA LSTARG LDA BUFPTR+1 STA LSTARG+1 RTS ; LOHIOK JSR ADDST ; ADD BUFST TO ARGS LDA TEMPTR ; CHECK FOR LEGAL LIMITS STA CHRPTR LDA TEMPTR+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA TEMPTR LDA ENDLIM+1 STA TEMPTR+1 ; LDA LSTARG STA CHRPTR LDA LSTARG+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA LSTARG LDA ENDLIM+1 STA LSTARG+1 RTS ; BPTR LDA BUFST ; RESET POINTER TO STA BUFPTR ; START OF PAGE LDA BUFST+1 STA BUFPTR+1 RTS ; ADDST CLC ; ADD BUFST TO ARGS LDA LOARG ADC BUFST STA TEMPTR LDA LOARG+1 ADC BUFST+1 STA TEMPTR+1 CLC LDA LSTARG ADC BUFST STA LSTARG LDA LSTARG+1 ADC BUFST+1 STA LSTARG+1 RTS ; GETEND CLC ; COMPUTE BUFFER END LDA BUFST ADC BUFSIZ STA ENDBUF LDA BUFST+1 ADC BUFSIZ+1 STA ENDBUF+1 RTS ; INCTEM INC TEMPTR BNE INCRTN INC TEMPTR+1 INCRTN RTS ; INCTM1 INC TMPTR1 BNE INCRTN INC TMPTR1+1 RTS ; INCPTR INC BUFPTR BNE INCRTN INC BUFPTR+1 RTS ; DECTEM LDA TEMPTR BNE DCTEMA DEC TEMPTR+1 DCTEMA DEC TEMPTR RTS ; DECTM1 LDA TMPTR1 BNE DCTM1A DEC TMPTR1VALRTN ; CARETB LDA DATE ; ^B COMMAND STA HIARG LDA DATE+1 STA HIARG+1 INC GOTHI JMP NXTCMD ; CARETC LDA CMDREG ; ^C COMMAND CMP #36 ; DURING MACRO? BEQ CTCEXT JMP GETCMD ; YES- GET NEW COMMAND LINE CTCEXT JMP TECOEX ; NO- EXIT TECO ; COMMA LDA GOTHI ; , COMMAND BNE COMOK LDA #18 ; ?NAC ERROR JMP ERROR ; COMOK JSR DOOPER LDA LSTARG STA LOARG LDA LSTARG+1 STA LOARG+1 INC GOTLO JMP PRCMD1 ; LMOVE JSR CHKARG ; L COMMAND LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LMOVE1 JMP PROCMD ; LMOVE1 JSR LFFIND LDA TEMPTR ; POSITION POINTER THERE STA BUFPTR LDA TEMPTR+1 STA BUFPTR+1 RTS ; CMOVE JSR CHKARG ; C COMMAND CMOVE1 JSR CKPTR1 BEQ GOTC POPERR LDA #7 ; ?POP ERROR JMP ERROR ; GOTC LDA ENDLIM STA BUFPTR LDA ENDLIM+1 STA BUFPTR+1 JMP PROCMD ; JMOVE JSR DOOPER ; J COMMAND JSR BPTR ; RESET POINTER JMP CMOVE1 ; RMOVE JSR CHKARG ; R COMMAND SEC ; = -NC TYA ; NEGATE LSTARG SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JMP CMOVE1 ; TYPE JSR CHKARG ; T COMMAND JSR TYPOUT JMP PROCMD ; VERIFY JSR CHKARG ; V COMMAND LDA LSTARG PHA LDA LSTARG+1 PHA SEC ; DO 1-NT LDA #1 SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JSR TYPOUT ; PLA ; NOW DO NT STA LSTARG+1 PLA STA LSTARG JSR TYPOUT JMP PROCMD ; TYPOUT JSR FNDARG ; = T COMMAND ; TYPCHK SEC ; DONE? LDA TEMPTR SBC LSTARG LDA TEMPTR+1 SBC LSTARG+1 BCS TYPDON ; LDA (TEMPTR),Y JSR TTYOUT JSR INCTEM JMP TYPCHK TYPDON RTS ; GETDOT SEC ; GET VALUE OF . LDA BUFPTR ; .=BUFPTR-BUFST SBC BUFST STA HIARG LDA BUFPTR+1 SBC BUFST+1 STA HIARG+1 RTS ; DRADIX LDA #10 ; UPARROW/D COMMAND RDXRTN STA RADIX ; CHANGE RADIX JMP PROCMD ; ORADIX LDA #8 ; UPARROW/O COMMAND BNE RDXRTN ; HRADIX LDA #16 BNE RDXRTN ; HEXCMD LDX #4 ; $ COMMAND NXTHEX JSR GTCMCH ; GET 4 HEX DIGITS BCC BADHEX JSR CHKHEX BCC BADHEX STA TEMP ; LDY #4 ; MULTIPLY BY 16 LDA HIARG SFTHEX ASL A ROL HIARG+1 DEY BNE SFTHEX ; ORA TEMP ; ADD DIGIT STA HIARG DEX BNE NXTHEX INC GOTHI JMP NXTCMD ; BADHEX LDA #40 ; ?IHC ERROR JMP ERROR ; CHKHEX JSR DIGCHK ; 0..9? BCS HXGOOD BMI HEXBAD SBC #6 ; NO- A..F? CMP #10 BCC HEXBAD CMP #16 BCS HEXBAD HXGOOD SEC ; YES- RETURN CARRY SET RTS ; HEXBAD CLC ; NO- RETURN CARRY CLEAR RTS ; CARETS SEC ; UPARROW/S COMMAND TYA ; RETURN -STRSIZ SBC STRSIZ STA HIARG TYA SBC STRSIZ+1 STA HIARG+1 JMP VALRTN ; CARETY JSR GETDOT ; UPARROW/Y COMMAND SEC ; =.+^S,. LDA HIARG SBC STRSIZ STA LOARG LDA HIARG+1 SBC STRSIZ+1 STA LOARG+1 INC GOTLO JMP VALRTN ; CARETZ LDX #74 ; ^Z COMMAND STY QSTART STY QSTART+1 JSR ADDQST ; # CHARS FOR Q REG/COMMAND LDA QSTART ; STRING STORAGE STA HIARG LDA QSTART+1 STA HIARG+1 JMP VALRTN ; EQUAL LDA GOTHI ; LAST CHAR OPERATOR? BNE EXPROK LDA #3 ; YES- ?NAE ERROR JMP ERROR ; EXPROK LDA RADIX STA TEMP1 LDA (CMDPTR),Y ; :==? CMP #'= BNE EQUAL1 JSR GETCHR LDA #8 ; YES- PRINT IN OCTAL STA RADIX ; EQUAL1 JSR CVTNUM RESOUT LDA NUMSTR,X JSR CONOUT INX CPX #6 BNE RESOUT ; LDA GOTCLN ; :=? BNE EQUAL2 ; YES- NO CRLF JSR CRLF EQUAL2 LDA TEMP1 ; RESTORE RADIX STA RADIX JMP PROCMD ; ; CONVERT NUMBER TO STRING OF CURRENT RADIX CVTNUM JSR DOOPER STY NUMSGN LDA RADIX ; NEGATIVE BASE 10 #? CMP #10 BNE NODCNG LDA LSTARG+1 BPL NODCNG SEC ; YES- NEGATE & FLAG TYA SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 LDA #'- STA NUMSGN ; NODCNG LDX #5 ; CONVERT UP TO 5 DIGITS CVTDIV LDA LSTARG+1 STA TEMP+1 LDA LSTARG STY LSTARG STY LSTARG+1 SEC CVTDV1 SBC RADIX BCC CVTDV3 CVTDV2 INC LSTARG BNE CVTDV1 INC LSTARG+1 BNE CVTDV1 ; CVTDV3 PHA LDA TEMP+1 BEQ CVTDON DEC TEMP+1 PLA SEC BCS CVTDV2 ; CVTDON PLA ; CONVERT REMAINDER TO ASCII DIGIT ADC RADIX SED CLC ADC #'0 CLD STA NUMSTR,X DEX BPL CVTDIV ; INX ; SKIP LEADING ZEROES SKPLD0 LDA NUMSTR,X CMP #'0 BNE GOTCVT INX CPX #5 BNE SKPLD0 ; GOTCVT LDA NUMSGN ; INSERT SIGN? BEQ CVTRTN DEX STA NUMSTR,X CVTRTN RTS ; ; SEARCH FOR SRHCNT LF'S & RETURN IN TEMPTR LFFIND LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 LDA SRHCNT+1 ; NEGATIVE SEARCH? BMI NEGSRH ORA SRHCNT BNE POSRCH ; NEGSRH SEC ; YES- COUNT=-SRHCNT+1 LDA #1 SBC SRHCNT STA SRHCNT TYA SBC SRHCNT+1 STA SRHCNT+1 ; LFIND1 JSR DECTEM SEC ; DONE? LDA TEMPTR SBC BUFST LDA TEMPTR+1 SBC BUFST+1 BCC FNDONM ; YES- RETURN LDA (TEMPTR),Y ; NO- LF? CMP #10 BNE LFIND1 JSR DECSRH BNE LFIND1 ; FNDONM JSR INCTEM FNDONE RTS ; POSRCH JSR GETEND ; POSITIVE SEARCH POSRH1 SEC ; DONE? LDA TEMPTR SBC ENDBUF LDA TEMPTR+1 SBC ENDBUF+1 BCS FNDONE LDA (TEMPTR),Y ; NO- LF? CMP #10 BEQ LFOUND POSRH2 JSR INCTEM ; NO- INC POINTER JMP POSRH1 ; LFOUND JSR DECSRH ; YES- DEC COUNT BNE POSRH2 BEQ FNDONM ; ; MULTIPLY HIARG*MULNUM WITH RESULT IN LSTARG MULT STY LSTARG STY LSTARG+1 ; LDX #16 MULT1 LSR MULNUM+1 ROR MULNUM BCC NXTMUL ; CLC LDA LSTARG ADC HIARG STA LSTARG LDA LSTARG+1 ADC HIARG+1 STA LSTARG+1 ; NXTMUL ASL HIARG ROL HIARG+1 DEX BNE MULT1 MULDON RTS ; ; DIVIDE HIARG/DIVNUM WITH RESULT IN LSTARG DIVIDE LDA DIVNUM ; DIVIDE BY 0? ORA DIVNUM+1 BNE DIVOK PLA ; EAT JSR PLA LDA #4 ; YES- ?DIV ERROR JMP ERROR ; DIVOK STY LSTARG STY LSTARG+1 ; DIV1 SEC LDA HIARG SBC DIVNUM STA HIARG LDA HIARG+1 SBC DIVNUM+1 STA HIARG+1 BCC DIVDON INC LSTARG BNE DIV1 INC LSTARG+1 JMP DIV1 DIVDON RTS ; CHKARG LDA PRDPTH ; MAKE SURE ()'S MATCHED BEQ CKARG1 JMP MRPERR ; CKARG1 LDA GOTHI ; HIARG SPECIFIED? BNE ARGOK LDA #1 ; NO- DEFAULT TO 1 STA GOTHI STA HIARG STY HIARG+1 STY LASTOP ARGOK JSR DOOPER RTS ; ; GET LOW LIMIT IN TEMPTR & HI LIMIT IN LSTARG ; FOR LINE ORIENTED OR M,N TYPE COMMANDS FNDARG LDA GOTLO ; ARGS OF FORM M,N? BNE LOHIOK LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LFFIND LDA LSTARG+1 ; NEGATIVE? BMI NEGARG ORA LSTARG BEQ NEGARG ; FNDRG1 LDA TEMPTR ; NO- DO .,TEMPTR STA LSTARG LDA TEMPTR+1 STA LSTARG+1 LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 RTS ; NEGARG LDA BUFPTR ; YES- DO TEMPTR,. STA LSTARG LDA BUFPTR+1 STA LSTARG+1 RTS ; LOHIOK JSR ADDST ; ADD BUFST TO ARGS LDA TEMPTR ; CHECK FOR LEGAL LIMITS STA CHRPTR LDA TEMPTR+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA TEMPTR LDA ENDLIM+1 STA TEMPTR+1 ; LDA LSTARG STA CHRPTR LDA LSTARG+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA LSTARG LDA ENDLIM+1 STA LSTARG+1 RTS ; BPTR LDA BUFST ; RESET POINTER TO STA BUFPTR ; START OF PAGE LDA BUFST+1 STA BUFPTR+1 RTS ; ADDST CLC ; ADD BUFST TO ARGS LDA LOARG ADC BUFST STA TEMPTR LDA LOARG+1 ADC BUFST+1 STA TEMPTR+1 CLC LDA LSTARG ADC BUFST STA LSTARG LDA LSTARG+1 ADC BUFST+1 STA LSTARG+1 RTS ; GETEND CLC ; COMPUTE BUFFER END LDA BUFST ADC BUFSIZ STA ENDBUF LDA BUFST+1 ADC BUFSIZ+1 STA ENDBUF+1 RTS ; INCTEM INC TEMPTR BNE INCRTN INC TEMPTR+1 INCRTN RTS ; INCTM1 INC TMPTR1 BNE INCRTN INC TMPTR1+1 RTS ; INCPTR INC BUFPTR BNE INCRTN INC BUFPTR+1 RTS ; DECTEM LDA TEMPTR BNE DCTEMA DEC TEMPTR+1 DCTEMA DEC TEMPTR RTS ; DECTM1 LDA TMPTR1 BNE DCTM1A DEC TMPTR1VALRTN ; CARETB LDA DATE ; ^B COMMAND STA HIARG LDA DATE+1 STA HIARG+1 INC GOTHI JMP NXTCMD ; CARETC LDA CMDREG ; ^C COMMAND CMP #36 ; DURING MACRO? BEQ CTCEXT JMP GETCMD ; YES- GET NEW COMMAND LINE CTCEXT JMP TECOEX ; NO- EXIT TECO ; COMMA LDA GOTHI ; , COMMAND BNE COMOK LDA #18 ; ?NAC ERROR JMP ERROR ; COMOK JSR DOOPER LDA LSTARG STA LOARG LDA LSTARG+1 STA LOARG+1 INC GOTLO JMP PRCMD1 ; LMOVE JSR CHKARG ; L COMMAND LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LMOVE1 JMP PROCMD ; LMOVE1 JSR LFFIND LDA TEMPTR ; POSITION POINTER THERE STA BUFPTR LDA TEMPTR+1 STA BUFPTR+1 RTS ; CMOVE JSR CHKARG ; C COMMAND CMOVE1 JSR CKPTR1 BEQ GOTC POPERR LDA #7 ; ?POP ERROR JMP ERROR ; GOTC LDA ENDLIM STA BUFPTR LDA ENDLIM+1 STA BUFPTR+1 JMP PROCMD ; JMOVE JSR DOOPER ; J COMMAND JSR BPTR ; RESET POINTER JMP CMOVE1 ; RMOVE JSR CHKARG ; R COMMAND SEC ; = -NC TYA ; NEGATE LSTARG SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JMP CMOVE1 ; TYPE JSR CHKARG ; T COMMAND JSR TYPOUT JMP PROCMD ; VERIFY JSR CHKARG ; V COMMAND LDA LSTARG PHA LDA LSTARG+1 PHA SEC ; DO 1-NT LDA #1 SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JSR TYPOUT ; PLA ; NOW DO NT STA LSTARG+1 PLA STA LSTARG JSR TYPOUT JMP PROCMD ; TYPOUT JSR FNDARG ; = T COMMAND ; TYPCHK SEC ; DONE? LDA TEMPTR SBC LSTARG LDA TEMPTR+1 SBC LSTARG+1 BCS TYPDON ; LDA (TEMPTR),Y JSR TTYOUT JSR INCTEM JMP TYPCHK TYPDON RTS ; GETDOT SEC ; GET VALUE OF . LDA BUFPTR ; .=BUFPTR-BUFST SBC BUFST STA HIARG LDA BUFPTR+1 SBC BUFST+1 STA HIARG+1 RTS ; DRADIX LDA #10 ; UPARROW/D COMMAND RDXRTN STA RADIX ; CHANGE RADIX JMP PROCMD ; ORADIX LDA #8 ; UPARROW/O COMMAND BNE RDXRTN ; HRADIX LDA #16 BNE RDXRTN ; HEXCMD LDX #4 ; $ COMMAND NXTHEX JSR GTCMCH ; GET 4 HEX DIGITS BCC BADHEX JSR CHKHEX BCC BADHEX STA TEMP ; LDY #4 ; MULTIPLY BY 16 LDA HIARG SFTHEX ASL A ROL HIARG+1 DEY BNE SFTHEX ; ORA TEMP ; ADD DIGIT STA HIARG DEX BNE NXTHEX INC GOTHI JMP NXTCMD ; BADHEX LDA #40 ; ?IHC ERROR JMP ERROR ; CHKHEX JSR DIGCHK ; 0..9? BCS HXGOOD BMI HEXBAD SBC #6 ; NO- A..F? CMP #10 BCC HEXBAD CMP #16 BCS HEXBAD HXGOOD SEC ; YES- RETURN CARRY SET RTS ; HEXBAD CLC ; NO- RETURN CARRY CLEAR RTS ; CARETS SEC ; UPARROW/S COMMAND TYA ; RETURN -STRSIZ SBC STRSIZ STA HIARG TYA SBC STRSIZ+1 STA HIARG+1 JMP VALRTN ; CARETY JSR GETDOT ; UPARROW/Y COMMAND SEC ; =.+^S,. LDA HIARG SBC STRSIZ STA LOARG LDA HIARG+1 SBC STRSIZ+1 STA LOARG+1 INC GOTLO JMP VALRTN ; CARETZ LDX #74 ; ^Z COMMAND STY QSTART STY QSTART+1 JSR ADDQST ; # CHARS FOR Q REG/COMMAND LDA QSTART ; STRING STORAGE STA HIARG LDA QSTART+1 STA HIARG+1 JMP VALRTN ; EQUAL LDA GOTHI ; LAST CHAR OPERATOR? BNE EXPROK LDA #3 ; YES- ?NAE ERROR JMP ERROR ; EXPROK LDA RADIX STA TEMP1 LDA (CMDPTR),Y ; :==? CMP #'= BNE EQUAL1 JSR GETCHR LDA #8 ; YES- PRINT IN OCTAL STA RADIX ; EQUAL1 JSR CVTNUM RESOUT LDA NUMSTR,X JSR CONOUT INX CPX #6 BNE RESOUT ; LDA GOTCLN ; :=? BNE EQUAL2 ; YES- NO CRLF JSR CRLF EQUAL2 LDA TEMP1 ; RESTORE RADIX STA RADIX JMP PROCMD ; ; CONVERT NUMBER TO STRING OF CURRENT RADIX CVTNUM JSR DOOPER STY NUMSGN LDA RADIX ; NEGATIVE BASE 10 #? CMP #10 BNE NODCNG LDA LSTARG+1 BPL NODCNG SEC ; YES- NEGATE & FLAG TYA SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 LDA #'- STA NUMSGN ; NODCNG LDX #5 ; CONVERT UP TO 5 DIGITS CVTDIV LDA LSTARG+1 STA TEMP+1 LDA LSTARG STY LSTARG STY LSTARG+1 SEC CVTDV1 SBC RADIX BCC CVTDV3 CVTDV2 INC LSTARG BNE CVTDV1 INC LSTARG+1 BNE CVTDV1 ; CVTDV3 PHA LDA TEMP+1 BEQ CVTDON DEC TEMP+1 PLA SEC BCS CVTDV2 ; CVTDON PLA ; CONVERT REMAINDER TO ASCII DIGIT ADC RADIX SED CLC ADC #'0 CLD STA NUMSTR,X DEX BPL CVTDIV ; INX ; SKIP LEADING ZEROES SKPLD0 LDA NUMSTR,X CMP #'0 BNE GOTCVT INX CPX #5 BNE SKPLD0 ; GOTCVT LDA NUMSGN ; INSERT SIGN? BEQ CVTRTN DEX STA NUMSTR,X CVTRTN RTS ; ; SEARCH FOR SRHCNT LF'S & RETURN IN TEMPTR LFFIND LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 LDA SRHCNT+1 ; NEGATIVE SEARCH? BMI NEGSRH ORA SRHCNT BNE POSRCH ; NEGSRH SEC ; YES- COUNT=-SRHCNT+1 LDA #1 SBC SRHCNT STA SRHCNT TYA SBC SRHCNT+1 STA SRHCNT+1 ; LFIND1 JSR DECTEM SEC ; DONE? LDA TEMPTR SBC BUFST LDA TEMPTR+1 SBC BUFST+1 BCC FNDONM ; YES- RETURN LDA (TEMPTR),Y ; NO- LF? CMP #10 BNE LFIND1 JSR DECSRH BNE LFIND1 ; FNDONM JSR INCTEM FNDONE RTS ; POSRCH JSR GETEND ; POSITIVE SEARCH POSRH1 SEC ; DONE? LDA TEMPTR SBC ENDBUF LDA TEMPTR+1 SBC ENDBUF+1 BCS FNDONE LDA (TEMPTR),Y ; NO- LF? CMP #10 BEQ LFOUND POSRH2 JSR INCTEM ; NO- INC POINTER JMP POSRH1 ; LFOUND JSR DECSRH ; YES- DEC COUNT BNE POSRH2 BEQ FNDONM ; ; MULTIPLY HIARG*MULNUM WITH RESULT IN LSTARG MULT STY LSTARG STY LSTARG+1 ; LDX #16 MULT1 LSR MULNUM+1 ROR MULNUM BCC NXTMUL ; CLC LDA LSTARG ADC HIARG STA LSTARG LDA LSTARG+1 ADC HIARG+1 STA LSTARG+1 ; NXTMUL ASL HIARG ROL HIARG+1 DEX BNE MULT1 MULDON RTS ; ; DIVIDE HIARG/DIVNUM WITH RESULT IN LSTARG DIVIDE LDA DIVNUM ; DIVIDE BY 0? ORA DIVNUM+1 BNE DIVOK PLA ; EAT JSR PLA LDA #4 ; YES- ?DIV ERROR JMP ERROR ; DIVOK STY LSTARG STY LSTARG+1 ; DIV1 SEC LDA HIARG SBC DIVNUM STA HIARG LDA HIARG+1 SBC DIVNUM+1 STA HIARG+1 BCC DIVDON INC LSTARG BNE DIV1 INC LSTARG+1 JMP DIV1 DIVDON RTS ; CHKARG LDA PRDPTH ; MAKE SURE ()'S MATCHED BEQ CKARG1 JMP MRPERR ; CKARG1 LDA GOTHI ; HIARG SPECIFIED? BNE ARGOK LDA #1 ; NO- DEFAULT TO 1 STA GOTHI STA HIARG STY HIARG+1 STY LASTOP ARGOK JSR DOOPER RTS ; ; GET LOW LIMIT IN TEMPTR & HI LIMIT IN LSTARG ; FOR LINE ORIENTED OR M,N TYPE COMMANDS FNDARG LDA GOTLO ; ARGS OF FORM M,N? BNE LOHIOK LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LFFIND LDA LSTARG+1 ; NEGATIVE? BMI NEGARG ORA LSTARG BEQ NEGARG ; FNDRG1 LDA TEMPTR ; NO- DO .,TEMPTR STA LSTARG LDA TEMPTR+1 STA LSTARG+1 LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 RTS ; NEGARG LDA BUFPTR ; YES- DO TEMPTR,. STA LSTARG LDA BUFPTR+1 STA LSTARG+1 RTS ; LOHIOK JSR ADDST ; ADD BUFST TO ARGS LDA TEMPTR ; CHECK FOR LEGAL LIMITS STA CHRPTR LDA TEMPTR+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA TEMPTR LDA ENDLIM+1 STA TEMPTR+1 ; LDA LSTARG STA CHRPTR LDA LSTARG+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA LSTARG LDA ENDLIM+1 STA LSTARG+1 RTS ; BPTR LDA BUFST ; RESET POINTER TO STA BUFPTR ; START OF PAGE LDA BUFST+1 STA BUFPTR+1 RTS ; ADDST CLC ; ADD BUFST TO ARGS LDA LOARG ADC BUFST STA TEMPTR LDA LOARG+1 ADC BUFST+1 STA TEMPTR+1 CLC LDA LSTARG ADC BUFST STA LSTARG LDA LSTARG+1 ADC BUFST+1 STA LSTARG+1 RTS ; GETEND CLC ; COMPUTE BUFFER END LDA BUFST ADC BUFSIZ STA ENDBUF LDA BUFST+1 ADC BUFSIZ+1 STA ENDBUF+1 RTS ; INCTEM INC TEMPTR BNE INCRTN INC TEMPTR+1 INCRTN RTS ; INCTM1 INC TMPTR1 BNE INCRTN INC TMPTR1+1 RTS ; INCPTR INC BUFPTR BNE INCRTN INC BUFPTR+1 RTS ; DECTEM LDA TEMPTR BNE DCTEMA DEC TEMPTR+1 DCTEMA DEC TEMPTR RTS ; DECTM1 LDA TMPTR1 BNE DCTM1A DEC TMPTR1VALRTN ; CARETB LDA DATE ; ^B COMMAND STA HIARG LDA DATE+1 STA HIARG+1 INC GOTHI JMP NXTCMD ; CARETC LDA CMDREG ; ^C COMMAND CMP #36 ; DURING MACRO? BEQ CTCEXT JMP GETCMD ; YES- GET NEW COMMAND LINE CTCEXT JMP TECOEX ; NO- EXIT TECO ; COMMA LDA GOTHI ; , COMMAND BNE COMOK LDA #18 ; ?NAC ERROR JMP ERROR ; COMOK JSR DOOPER LDA LSTARG STA LOARG LDA LSTARG+1 STA LOARG+1 INC GOTLO JMP PRCMD1 ; LMOVE JSR CHKARG ; L COMMAND LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LMOVE1 JMP PROCMD ; LMOVE1 JSR LFFIND LDA TEMPTR ; POSITION POINTER THERE STA BUFPTR LDA TEMPTR+1 STA BUFPTR+1 RTS ; CMOVE JSR CHKARG ; C COMMAND CMOVE1 JSR CKPTR1 BEQ GOTC POPERR LDA #7 ; ?POP ERROR JMP ERROR ; GOTC LDA ENDLIM STA BUFPTR LDA ENDLIM+1 STA BUFPTR+1 JMP PROCMD ; JMOVE JSR DOOPER ; J COMMAND JSR BPTR ; RESET POINTER JMP CMOVE1 ; RMOVE JSR CHKARG ; R COMMAND SEC ; = -NC TYA ; NEGATE LSTARG SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JMP CMOVE1 ; TYPE JSR CHKARG ; T COMMAND JSR TYPOUT JMP PROCMD ; VERIFY JSR CHKARG ; V COMMAND LDA LSTARG PHA LDA LSTARG+1 PHA SEC ; DO 1-NT LDA #1 SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JSR TYPOUT ; PLA ; NOW DO NT STA LSTARG+1 PLA STA LSTARG JSR TYPOUT JMP PROCMD ; TYPOUT JSR FNDARG ; = T COMMAND ; TYPCHK SEC ; DONE? LDA TEMPTR SBC LSTARG LDA TEMPTR+1 SBC LSTARG+1 BCS TYPDON ; LDA (TEMPTR),Y JSR TTYOUT JSR INCTEM JMP TYPCHK TYPDON RTS ; GETDOT SEC ; GET VALUE OF . LDA BUFPTR ; .=BUFPTR-BUFST SBC BUFST STA HIARG LDA BUFPTR+1 SBC BUFST+1 STA HIARG+1 RTS ; DRADIX LDA #10 ; UPARROW/D COMMAND RDXRTN STA RADIX ; CHANGE RADIX JMP PROCMD ; ORADIX LDA #8 ; UPARROW/O COMMAND BNE RDXRTN ; HRADIX LDA #16 BNE RDXRTN ; HEXCMD LDX #4 ; $ COMMAND NXTHEX JSR GTCMCH ; GET 4 HEX DIGITS BCC BADHEX JSR CHKHEX BCC BADHEX STA TEMP ; LDY #4 ; MULTIPLY BY 16 LDA HIARG SFTHEX ASL A ROL HIARG+1 DEY BNE SFTHEX ; ORA TEMP ; ADD DIGIT STA HIARG DEX BNE NXTHEX INC GOTHI JMP NXTCMD ; BADHEX LDA #40 ; ?IHC ERROR JMP ERROR ; CHKHEX JSR DIGCHK ; 0..9? BCS HXGOOD BMI HEXBAD SBC #6 ; NO- A..F? CMP #10 BCC HEXBAD CMP #16 BCS HEXBAD HXGOOD SEC ; YES- RETURN CARRY SET RTS ; HEXBAD CLC ; NO- RETURN CARRY CLEAR RTS ; CARETS SEC ; UPARROW/S COMMAND TYA ; RETURN -STRSIZ SBC STRSIZ STA HIARG TYA SBC STRSIZ+1 STA HIARG+1 JMP VALRTN ; CARETY JSR GETDOT ; UPARROW/Y COMMAND SEC ; =.+^S,. LDA HIARG SBC STRSIZ STA LOARG LDA HIARG+1 SBC STRSIZ+1 STA LOARG+1 INC GOTLO JMP VALRTN ; CARETZ LDX #74 ; ^Z COMMAND STY QSTART STY QSTART+1 JSR ADDQST ; # CHARS FOR Q REG/COMMAND LDA QSTART ; STRING STORAGE STA HIARG LDA QSTART+1 STA HIARG+1 JMP VALRTN ; EQUAL LDA GOTHI ; LAST CHAR OPERATOR? BNE EXPROK LDA #3 ; YES- ?NAE ERROR JMP ERROR ; EXPROK LDA RADIX STA TEMP1 LDA (CMDPTR),Y ; :==? CMP #'= BNE EQUAL1 JSR GETCHR LDA #8 ; YES- PRINT IN OCTAL STA RADIX ; EQUAL1 JSR CVTNUM RESOUT LDA NUMSTR,X JSR CONOUT INX CPX #6 BNE RESOUT ; LDA GOTCLN ; :=? BNE EQUAL2 ; YES- NO CRLF JSR CRLF EQUAL2 LDA TEMP1 ; RESTORE RADIX STA RADIX JMP PROCMD ; ; CONVERT NUMBER TO STRING OF CURRENT RADIX CVTNUM JSR DOOPER STY NUMSGN LDA RADIX ; NEGATIVE BASE 10 #? CMP #10 BNE NODCNG LDA LSTARG+1 BPL NODCNG SEC ; YES- NEGATE & FLAG TYA SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 LDA #'- STA NUMSGN ; NODCNG LDX #5 ; CONVERT UP TO 5 DIGITS CVTDIV LDA LSTARG+1 STA TEMP+1 LDA LSTARG STY LSTARG STY LSTARG+1 SEC CVTDV1 SBC RADIX BCC CVTDV3 CVTDV2 INC LSTARG BNE CVTDV1 INC LSTARG+1 BNE CVTDV1 ; CVTDV3 PHA LDA TEMP+1 BEQ CVTDON DEC TEMP+1 PLA SEC BCS CVTDV2 ; CVTDON PLA ; CONVERT REMAINDER TO ASCII DIGIT ADC RADIX SED CLC ADC #'0 CLD STA NUMSTR,X DEX BPL CVTDIV ; INX ; SKIP LEADING ZEROES SKPLD0 LDA NUMSTR,X CMP #'0 BNE GOTCVT INX CPX #5 BNE SKPLD0 ; GOTCVT LDA NUMSGN ; INSERT SIGN? BEQ CVTRTN DEX STA NUMSTR,X CVTRTN RTS ; ; SEARCH FOR SRHCNT LF'S & RETURN IN TEMPTR LFFIND LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 LDA SRHCNT+1 ; NEGATIVE SEARCH? BMI NEGSRH ORA SRHCNT BNE POSRCH ; NEGSRH SEC ; YES- COUNT=-SRHCNT+1 LDA #1 SBC SRHCNT STA SRHCNT TYA SBC SRHCNT+1 STA SRHCNT+1 ; LFIND1 JSR DECTEM SEC ; DONE? LDA TEMPTR SBC BUFST LDA TEMPTR+1 SBC BUFST+1 BCC FNDONM ; YES- RETURN LDA (TEMPTR),Y ; NO- LF? CMP #10 BNE LFIND1 JSR DECSRH BNE LFIND1 ; FNDONM JSR INCTEM FNDONE RTS ; POSRCH JSR GETEND ; POSITIVE SEARCH POSRH1 SEC ; DONE? LDA TEMPTR SBC ENDBUF LDA TEMPTR+1 SBC ENDBUF+1 BCS FNDONE LDA (TEMPTR),Y ; NO- LF? CMP #10 BEQ LFOUND POSRH2 JSR INCTEM ; NO- INC POINTER JMP POSRH1 ; LFOUND JSR DECSRH ; YES- DEC COUNT BNE POSRH2 BEQ FNDONM ; ; MULTIPLY HIARG*MULNUM WITH RESULT IN LSTARG MULT STY LSTARG STY LSTARG+1 ; LDX #16 MULT1 LSR MULNUM+1 ROR MULNUM BCC NXTMUL ; CLC LDA LSTARG ADC HIARG STA LSTARG LDA LSTARG+1 ADC HIARG+1 STA LSTARG+1 ; NXTMUL ASL HIARG ROL HIARG+1 DEX BNE MULT1 MULDON RTS ; ; DIVIDE HIARG/DIVNUM WITH RESULT IN LSTARG DIVIDE LDA DIVNUM ; DIVIDE BY 0? ORA DIVNUM+1 BNE DIVOK PLA ; EAT JSR PLA LDA #4 ; YES- ?DIV ERROR JMP ERROR ; DIVOK STY LSTARG STY LSTARG+1 ; DIV1 SEC LDA HIARG SBC DIVNUM STA HIARG LDA HIARG+1 SBC DIVNUM+1 STA HIARG+1 BCC DIVDON INC LSTARG BNE DIV1 INC LSTARG+1 JMP DIV1 DIVDON RTS ; CHKARG LDA PRDPTH ; MAKE SURE ()'S MATCHED BEQ CKARG1 JMP MRPERR ; CKARG1 LDA GOTHI ; HIARG SPECIFIED? BNE ARGOK LDA #1 ; NO- DEFAULT TO 1 STA GOTHI STA HIARG STY HIARG+1 STY LASTOP ARGOK JSR DOOPER RTS ; ; GET LOW LIMIT IN TEMPTR & HI LIMIT IN LSTARG ; FOR LINE ORIENTED OR M,N TYPE COMMANDS FNDARG LDA GOTLO ; ARGS OF FORM M,N? BNE LOHIOK LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LFFIND LDA LSTARG+1 ; NEGATIVE? BMI NEGARG ORA LSTARG BEQ NEGARG ; FNDRG1 LDA TEMPTR ; NO- DO .,TEMPTR STA LSTARG LDA TEMPTR+1 STA LSTARG+1 LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 RTS ; NEGARG LDA BUFPTR ; YES- DO TEMPTR,. STA LSTARG LDA BUFPTR+1 STA LSTARG+1 RTS ; LOHIOK JSR ADDST ; ADD BUFST TO ARGS LDA TEMPTR ; CHECK FOR LEGAL LIMITS STA CHRPTR LDA TEMPTR+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA TEMPTR LDA ENDLIM+1 STA TEMPTR+1 ; LDA LSTARG STA CHRPTR LDA LSTARG+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA LSTARG LDA ENDLIM+1 STA LSTARG+1 RTS ; BPTR LDA BUFST ; RESET POINTER TO STA BUFPTR ; START OF PAGE LDA BUFST+1 STA BUFPTR+1 RTS ; ADDST CLC ; ADD BUFST TO ARGS LDA LOARG ADC BUFST STA TEMPTR LDA LOARG+1 ADC BUFST+1 STA TEMPTR+1 CLC LDA LSTARG ADC BUFST STA LSTARG LDA LSTARG+1 ADC BUFST+1 STA LSTARG+1 RTS ; GETEND CLC ; COMPUTE BUFFER END LDA BUFST ADC BUFSIZ STA ENDBUF LDA BUFST+1 ADC BUFSIZ+1 STA ENDBUF+1 RTS ; INCTEM INC TEMPTR BNE INCRTN INC TEMPTR+1 INCRTN RTS ; INCTM1 INC TMPTR1 BNE INCRTN INC TMPTR1+1 RTS ; INCPTR INC BUFPTR BNE INCRTN INC BUFPTR+1 RTS ; DECTEM LDA TEMPTR BNE DCTEMA DEC TEMPTR+1 DCTEMA DEC TEMPTR RTS ; DECTM1 LDA TMPTR1 BNE DCTM1A DEC TMPTR1VALRTN ; CARETB LDA DATE ; ^B COMMAND STA HIARG LDA DATE+1 STA HIARG+1 INC GOTHI JMP NXTCMD ; CARETC LDA CMDREG ; ^C COMMAND CMP #36 ; DURING MACRO? BEQ CTCEXT JMP GETCMD ; YES- GET NEW COMMAND LINE CTCEXT JMP TECOEX ; NO- EXIT TECO ; COMMA LDA GOTHI ; , COMMAND BNE COMOK LDA #18 ; ?NAC ERROR JMP ERROR ; COMOK JSR DOOPER LDA LSTARG STA LOARG LDA LSTARG+1 STA LOARG+1 INC GOTLO JMP PRCMD1 ; LMOVE JSR CHKARG ; L COMMAND LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LMOVE1 JMP PROCMD ; LMOVE1 JSR LFFIND LDA TEMPTR ; POSITION POINTER THERE STA BUFPTR LDA TEMPTR+1 STA BUFPTR+1 RTS ; CMOVE JSR CHKARG ; C COMMAND CMOVE1 JSR CKPTR1 BEQ GOTC POPERR LDA #7 ; ?POP ERROR JMP ERROR ; GOTC LDA ENDLIM STA BUFPTR LDA ENDLIM+1 STA BUFPTR+1 JMP PROCMD ; JMOVE JSR DOOPER ; J COMMAND JSR BPTR ; RESET POINTER JMP CMOVE1 ; RMOVE JSR CHKARG ; R COMMAND SEC ; = -NC TYA ; NEGATE LSTARG SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JMP CMOVE1 ; TYPE JSR CHKARG ; T COMMAND JSR TYPOUT JMP PROCMD ; VERIFY JSR CHKARG ; V COMMAND LDA LSTARG PHA LDA LSTARG+1 PHA SEC ; DO 1-NT LDA #1 SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JSR TYPOUT ; PLA ; NOW DO NT STA LSTARG+1 PLA STA LSTARG JSR TYPOUT JMP PROCMD ; TYPOUT JSR FNDARG ; = T COMMAND ; TYPCHK SEC ; DONE? LDA TEMPTR SBC LSTARG LDA TEMPTR+1 SBC LSTARG+1 BCS TYPDON ; LDA (TEMPTR),Y JSR TTYOUT JSR INCTEM JMP TYPCHK TYPDON RTS ; GETDOT SEC ; GET VALUE OF . LDA BUFPTR ; .=BUFPTR-BUFST SBC BUFST STA HIARG LDA BUFPTR+1 SBC BUFST+1 STA HIARG+1 RTS ; DRADIX LDA #10 ; UPARROW/D COMMAND RDXRTN STA RADIX ; CHANGE RADIX JMP PROCMD ; ORADIX LDA #8 ; UPARROW/O COMMAND BNE RDXRTN ; HRADIX LDA #16 BNE RDXRTN ; HEXCMD LDX #4 ; $ COMMAND NXTHEX JSR GTCMCH ; GET 4 HEX DIGITS BCC BADHEX JSR CHKHEX BCC BADHEX STA TEMP ; LDY #4 ; MULTIPLY BY 16 LDA HIARG SFTHEX ASL A ROL HIARG+1 DEY BNE SFTHEX ; ORA TEMP ; ADD DIGIT STA HIARG DEX BNE NXTHEX INC GOTHI JMP NXTCMD ; BADHEX LDA #40 ; ?IHC ERROR JMP ERROR ; CHKHEX JSR DIGCHK ; 0..9? BCS HXGOOD BMI HEXBAD SBC #6 ; NO- A..F? CMP #10 BCC HEXBAD CMP #16 BCS HEXBAD HXGOOD SEC ; YES- RETURN CARRY SET RTS ; HEXBAD CLC ; NO- RETURN CARRY CLEAR RTS ; CARETS SEC ; UPARROW/S COMMAND TYA ; RETURN -STRSIZ SBC STRSIZ STA HIARG TYA SBC STRSIZ+1 STA HIARG+1 JMP VALRTN ; CARETY JSR GETDOT ; UPARROW/Y COMMAND SEC ; =.+^S,. LDA HIARG SBC STRSIZ STA LOARG LDA HIARG+1 SBC STRSIZ+1 STA LOARG+1 INC GOTLO JMP VALRTN ; CARETZ LDX #74 ; ^Z COMMAND STY QSTART STY QSTART+1 JSR ADDQST ; # CHARS FOR Q REG/COMMAND LDA QSTART ; STRING STORAGE STA HIARG LDA QSTART+1 STA HIARG+1 JMP VALRTN ; EQUAL LDA GOTHI ; LAST CHAR OPERATOR? BNE EXPROK LDA #3 ; YES- ?NAE ERROR JMP ERROR ; EXPROK LDA RADIX STA TEMP1 LDA (CMDPTR),Y ; :==? CMP #'= BNE EQUAL1 JSR GETCHR LDA #8 ; YES- PRINT IN OCTAL STA RADIX ; EQUAL1 JSR CVTNUM RESOUT LDA NUMSTR,X JSR CONOUT INX CPX #6 BNE RESOUT ; LDA GOTCLN ; :=? BNE EQUAL2 ; YES- NO CRLF JSR CRLF EQUAL2 LDA TEMP1 ; RESTORE RADIX STA RADIX JMP PROCMD ; ; CONVERT NUMBER TO STRING OF CURRENT RADIX CVTNUM JSR DOOPER STY NUMSGN LDA RADIX ; NEGATIVE BASE 10 #? CMP #10 BNE NODCNG LDA LSTARG+1 BPL NODCNG SEC ; YES- NEGATE & FLAG TYA SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 LDA #'- STA NUMSGN ; NODCNG LDX #5 ; CONVERT UP TO 5 DIGITS CVTDIV LDA LSTARG+1 STA TEMP+1 LDA LSTARG STY LSTARG STY LSTARG+1 SEC CVTDV1 SBC RADIX BCC CVTDV3 CVTDV2 INC LSTARG BNE CVTDV1 INC LSTARG+1 BNE CVTDV1 ; CVTDV3 PHA LDA TEMP+1 BEQ CVTDON DEC TEMP+1 PLA SEC BCS CVTDV2 ; CVTDON PLA ; CONVERT REMAINDER TO ASCII DIGIT ADC RADIX SED CLC ADC #'0 CLD STA NUMSTR,X DEX BPL CVTDIV ; INX ; SKIP LEADING ZEROES SKPLD0 LDA NUMSTR,X CMP #'0 BNE GOTCVT INX CPX #5 BNE SKPLD0 ; GOTCVT LDA NUMSGN ; INSERT SIGN? BEQ CVTRTN DEX STA NUMSTR,X CVTRTN RTS ; ; SEARCH FOR SRHCNT LF'S & RETURN IN TEMPTR LFFIND LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 LDA SRHCNT+1 ; NEGATIVE SEARCH? BMI NEGSRH ORA SRHCNT BNE POSRCH ; NEGSRH SEC ; YES- COUNT=-SRHCNT+1 LDA #1 SBC SRHCNT STA SRHCNT TYA SBC SRHCNT+1 STA SRHCNT+1 ; LFIND1 JSR DECTEM SEC ; DONE? LDA TEMPTR SBC BUFST LDA TEMPTR+1 SBC BUFST+1 BCC FNDONM ; YES- RETURN LDA (TEMPTR),Y ; NO- LF? CMP #10 BNE LFIND1 JSR DECSRH BNE LFIND1 ; FNDONM JSR INCTEM FNDONE RTS ; POSRCH JSR GETEND ; POSITIVE SEARCH POSRH1 SEC ; DONE? LDA TEMPTR SBC ENDBUF LDA TEMPTR+1 SBC ENDBUF+1 BCS FNDONE LDA (TEMPTR),Y ; NO- LF? CMP #10 BEQ LFOUND POSRH2 JSR INCTEM ; NO- INC POINTER JMP POSRH1 ; LFOUND JSR DECSRH ; YES- DEC COUNT BNE POSRH2 BEQ FNDONM ; ; MULTIPLY HIARG*MULNUM WITH RESULT IN LSTARG MULT STY LSTARG STY LSTARG+1 ; LDX #16 MULT1 LSR MULNUM+1 ROR MULNUM BCC NXTMUL ; CLC LDA LSTARG ADC HIARG STA LSTARG LDA LSTARG+1 ADC HIARG+1 STA LSTARG+1 ; NXTMUL ASL HIARG ROL HIARG+1 DEX BNE MULT1 MULDON RTS ; ; DIVIDE HIARG/DIVNUM WITH RESULT IN LSTARG DIVIDE LDA DIVNUM ; DIVIDE BY 0? ORA DIVNUM+1 BNE DIVOK PLA ; EAT JSR PLA LDA #4 ; YES- ?DIV ERROR JMP ERROR ; DIVOK STY LSTARG STY LSTARG+1 ; DIV1 SEC LDA HIARG SBC DIVNUM STA HIARG LDA HIARG+1 SBC DIVNUM+1 STA HIARG+1 BCC DIVDON INC LSTARG BNE DIV1 INC LSTARG+1 JMP DIV1 DIVDON RTS ; CHKARG LDA PRDPTH ; MAKE SURE ()'S MATCHED BEQ CKARG1 JMP MRPERR ; CKARG1 LDA GOTHI ; HIARG SPECIFIED? BNE ARGOK LDA #1 ; NO- DEFAULT TO 1 STA GOTHI STA HIARG STY HIARG+1 STY LASTOP ARGOK JSR DOOPER RTS ; ; GET LOW LIMIT IN TEMPTR & HI LIMIT IN LSTARG ; FOR LINE ORIENTED OR M,N TYPE COMMANDS FNDARG LDA GOTLO ; ARGS OF FORM M,N? BNE LOHIOK LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LFFIND LDA LSTARG+1 ; NEGATIVE? BMI NEGARG ORA LSTARG BEQ NEGARG ; FNDRG1 LDA TEMPTR ; NO- DO .,TEMPTR STA LSTARG LDA TEMPTR+1 STA LSTARG+1 LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 RTS ; NEGARG LDA BUFPTR ; YES- DO TEMPTR,. STA LSTARG LDA BUFPTR+1 STA LSTARG+1 RTS ; LOHIOK JSR ADDST ; ADD BUFST TO ARGS LDA TEMPTR ; CHECK FOR LEGAL LIMITS STA CHRPTR LDA TEMPTR+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA TEMPTR LDA ENDLIM+1 STA TEMPTR+1 ; LDA LSTARG STA CHRPTR LDA LSTARG+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA LSTARG LDA ENDLIM+1 STA LSTARG+1 RTS ; BPTR LDA BUFST ; RESET POINTER TO STA BUFPTR ; START OF PAGE LDA BUFST+1 STA BUFPTR+1 RTS ; ADDST CLC ; ADD BUFST TO ARGS LDA LOARG ADC BUFST STA TEMPTR LDA LOARG+1 ADC BUFST+1 STA TEMPTR+1 CLC LDA LSTARG ADC BUFST STA LSTARG LDA LSTARG+1 ADC BUFST+1 STA LSTARG+1 RTS ; GETEND CLC ; COMPUTE BUFFER END LDA BUFST ADC BUFSIZ STA ENDBUF LDA BUFST+1 ADC BUFSIZ+1 STA ENDBUF+1 RTS ; INCTEM INC TEMPTR BNE INCRTN INC TEMPTR+1 INCRTN RTS ; INCTM1 INC TMPTR1 BNE INCRTN INC TMPTR1+1 RTS ; INCPTR INC BUFPTR BNE INCRTN INC BUFPTR+1 RTS ; DECTEM LDA TEMPTR BNE DCTEMA DEC TEMPTR+1 DCTEMA DEC TEMPTR RTS ; DECTM1 LDA TMPTR1 BNE DCTM1A DEC TMPTR1VALRTN ; CARETB LDA DATE ; ^B COMMAND STA HIARG LDA DATE+1 STA HIARG+1 INC GOTHI JMP NXTCMD ; CARETC LDA CMDREG ; ^C COMMAND CMP #36 ; DURING MACRO? BEQ CTCEXT JMP GETCMD ; YES- GET NEW COMMAND LINE CTCEXT JMP TECOEX ; NO- EXIT TECO ; COMMA LDA GOTHI ; , COMMAND BNE COMOK LDA #18 ; ?NAC ERROR JMP ERROR ; COMOK JSR DOOPER LDA LSTARG STA LOARG LDA LSTARG+1 STA LOARG+1 INC GOTLO JMP PRCMD1 ; LMOVE JSR CHKARG ; L COMMAND LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LMOVE1 JMP PROCMD ; LMOVE1 JSR LFFIND LDA TEMPTR ; POSITION POINTER THERE STA BUFPTR LDA TEMPTR+1 STA BUFPTR+1 RTS ; CMOVE JSR CHKARG ; C COMMAND CMOVE1 JSR CKPTR1 BEQ GOTC POPERR LDA #7 ; ?POP ERROR JMP ERROR ; GOTC LDA ENDLIM STA BUFPTR LDA ENDLIM+1 STA BUFPTR+1 JMP PROCMD ; JMOVE JSR DOOPER ; J COMMAND JSR BPTR ; RESET POINTER JMP CMOVE1 ; RMOVE JSR CHKARG ; R COMMAND SEC ; = -NC TYA ; NEGATE LSTARG SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JMP CMOVE1 ; TYPE JSR CHKARG ; T COMMAND JSR TYPOUT JMP PROCMD ; VERIFY JSR CHKARG ; V COMMAND LDA LSTARG PHA LDA LSTARG+1 PHA SEC ; DO 1-NT LDA #1 SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JSR TYPOUT ; PLA ; NOW DO NT STA LSTARG+1 PLA STA LSTARG JSR TYPOUT JMP PROCMD ; TYPOUT JSR FNDARG ; = T COMMAND ; TYPCHK SEC ; DONE? LDA TEMPTR SBC LSTARG LDA TEMPTR+1 SBC LSTARG+1 BCS TYPDON ; LDA (TEMPTR),Y JSR TTYOUT JSR INCTEM JMP TYPCHK TYPDON RTS ; GETDOT SEC ; GET VALUE OF . LDA BUFPTR ; .=BUFPTR-BUFST SBC BUFST STA HIARG LDA BUFPTR+1 SBC BUFST+1 STA HIARG+1 RTS ; DRADIX LDA #10 ; UPARROW/D COMMAND RDXRTN STA RADIX ; CHANGE RADIX JMP PROCMD ; ORADIX LDA #8 ; UPARROW/O COMMAND BNE RDXRTN ; HRADIX LDA #16 BNE RDXRTN ; HEXCMD LDX #4 ; $ COMMAND NXTHEX JSR GTCMCH ; GET 4 HEX DIGITS BCC BADHEX JSR CHKHEX BCC BADHEX STA TEMP ; LDY #4 ; MULTIPLY BY 16 LDA HIARG SFTHEX ASL A ROL HIARG+1 DEY BNE SFTHEX ; ORA TEMP ; ADD DIGIT STA HIARG DEX BNE NXTHEX INC GOTHI JMP NXTCMD ; BADHEX LDA #40 ; ?IHC ERROR JMP ERROR ; CHKHEX JSR DIGCHK ; 0..9? BCS HXGOOD BMI HEXBAD SBC #6 ; NO- A..F? CMP #10 BCC HEXBAD CMP #16 BCS HEXBAD HXGOOD SEC ; YES- RETURN CARRY SET RTS ; HEXBAD CLC ; NO- RETURN CARRY CLEAR RTS ; CARETS SEC ; UPARROW/S COMMAND TYA ; RETURN -STRSIZ SBC STRSIZ STA HIARG TYA SBC STRSIZ+1 STA HIARG+1 JMP VALRTN ; CARETY JSR GETDOT ; UPARROW/Y COMMAND SEC ; =.+^S,. LDA HIARG SBC STRSIZ STA LOARG LDA HIARG+1 SBC STRSIZ+1 STA LOARG+1 INC GOTLO JMP VALRTN ; CARETZ LDX #74 ; ^Z COMMAND STY QSTART STY QSTART+1 JSR ADDQST ; # CHARS FOR Q REG/COMMAND LDA QSTART ; STRING STORAGE STA HIARG LDA QSTART+1 STA HIARG+1 JMP VALRTN ; EQUAL LDA GOTHI ; LAST CHAR OPERATOR? BNE EXPROK LDA #3 ; YES- ?NAE ERROR JMP ERROR ; EXPROK LDA RADIX STA TEMP1 LDA (CMDPTR),Y ; :==? CMP #'= BNE EQUAL1 JSR GETCHR LDA #8 ; YES- PRINT IN OCTAL STA RADIX ; EQUAL1 JSR CVTNUM RESOUT LDA NUMSTR,X JSR CONOUT INX CPX #6 BNE RESOUT ; LDA GOTCLN ; :=? BNE EQUAL2 ; YES- NO CRLF JSR CRLF EQUAL2 LDA TEMP1 ; RESTORE RADIX STA RADIX JMP PROCMD ; ; CONVERT NUMBER TO STRING OF CURRENT RADIX CVTNUM JSR DOOPER STY NUMSGN LDA RADIX ; NEGATIVE BASE 10 #? CMP #10 BNE NODCNG LDA LSTARG+1 BPL NODCNG SEC ; YES- NEGATE & FLAG TYA SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 LDA #'- STA NUMSGN ; NODCNG LDX #5 ; CONVERT UP TO 5 DIGITS CVTDIV LDA LSTARG+1 STA TEMP+1 LDA LSTARG STY LSTARG STY LSTARG+1 SEC CVTDV1 SBC RADIX BCC CVTDV3 CVTDV2 INC LSTARG BNE CVTDV1 INC LSTARG+1 BNE CVTDV1 ; CVTDV3 PHA LDA TEMP+1 BEQ CVTDON DEC TEMP+1 PLA SEC BCS CVTDV2 ; CVTDON PLA ; CONVERT REMAINDER TO ASCII DIGIT ADC RADIX SED CLC ADC #'0 CLD STA NUMSTR,X DEX BPL CVTDIV ; INX ; SKIP LEADING ZEROES SKPLD0 LDA NUMSTR,X CMP #'0 BNE GOTCVT INX CPX #5 BNE SKPLD0 ; GOTCVT LDA NUMSGN ; INSERT SIGN? BEQ CVTRTN DEX STA NUMSTR,X CVTRTN RTS ; ; SEARCH FOR SRHCNT LF'S & RETURN IN TEMPTR LFFIND LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 LDA SRHCNT+1 ; NEGATIVE SEARCH? BMI NEGSRH ORA SRHCNT BNE POSRCH ; NEGSRH SEC ; YES- COUNT=-SRHCNT+1 LDA #1 SBC SRHCNT STA SRHCNT TYA SBC SRHCNT+1 STA SRHCNT+1 ; LFIND1 JSR DECTEM SEC ; DONE? LDA TEMPTR SBC BUFST LDA TEMPTR+1 SBC BUFST+1 BCC FNDONM ; YES- RETURN LDA (TEMPTR),Y ; NO- LF? CMP #10 BNE LFIND1 JSR DECSRH BNE LFIND1 ; FNDONM JSR INCTEM FNDONE RTS ; POSRCH JSR GETEND ; POSITIVE SEARCH POSRH1 SEC ; DONE? LDA TEMPTR SBC ENDBUF LDA TEMPTR+1 SBC ENDBUF+1 BCS FNDONE LDA (TEMPTR),Y ; NO- LF? CMP #10 BEQ LFOUND POSRH2 JSR INCTEM ; NO- INC POINTER JMP POSRH1 ; LFOUND JSR DECSRH ; YES- DEC COUNT BNE POSRH2 BEQ FNDONM ; ; MULTIPLY HIARG*MULNUM WITH RESULT IN LSTARG MULT STY LSTARG STY LSTARG+1 ; LDX #16 MULT1 LSR MULNUM+1 ROR MULNUM BCC NXTMUL ; CLC LDA LSTARG ADC HIARG STA LSTARG LDA LSTARG+1 ADC HIARG+1 STA LSTARG+1 ; NXTMUL ASL HIARG ROL HIARG+1 DEX BNE MULT1 MULDON RTS ; ; DIVIDE HIARG/DIVNUM WITH RESULT IN LSTARG DIVIDE LDA DIVNUM ; DIVIDE BY 0? ORA DIVNUM+1 BNE DIVOK PLA ; EAT JSR PLA LDA #4 ; YES- ?DIV ERROR JMP ERROR ; DIVOK STY LSTARG STY LSTARG+1 ; DIV1 SEC LDA HIARG SBC DIVNUM STA HIARG LDA HIARG+1 SBC DIVNUM+1 STA HIARG+1 BCC DIVDON INC LSTARG BNE DIV1 INC LSTARG+1 JMP DIV1 DIVDON RTS ; CHKARG LDA PRDPTH ; MAKE SURE ()'S MATCHED BEQ CKARG1 JMP MRPERR ; CKARG1 LDA GOTHI ; HIARG SPECIFIED? BNE ARGOK LDA #1 ; NO- DEFAULT TO 1 STA GOTHI STA HIARG STY HIARG+1 STY LASTOP ARGOK JSR DOOPER RTS ; ; GET LOW LIMIT IN TEMPTR & HI LIMIT IN LSTARG ; FOR LINE ORIENTED OR M,N TYPE COMMANDS FNDARG LDA GOTLO ; ARGS OF FORM M,N? BNE LOHIOK LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LFFIND LDA LSTARG+1 ; NEGATIVE? BMI NEGARG ORA LSTARG BEQ NEGARG ; FNDRG1 LDA TEMPTR ; NO- DO .,TEMPTR STA LSTARG LDA TEMPTR+1 STA LSTARG+1 LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 RTS ; NEGARG LDA BUFPTR ; YES- DO TEMPTR,. STA LSTARG LDA BUFPTR+1 STA LSTARG+1 RTS ; LOHIOK JSR ADDST ; ADD BUFST TO ARGS LDA TEMPTR ; CHECK FOR LEGAL LIMITS STA CHRPTR LDA TEMPTR+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA TEMPTR LDA ENDLIM+1 STA TEMPTR+1 ; LDA LSTARG STA CHRPTR LDA LSTARG+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA LSTARG LDA ENDLIM+1 STA LSTARG+1 RTS ; BPTR LDA BUFST ; RESET POINTER TO STA BUFPTR ; START OF PAGE LDA BUFST+1 STA BUFPTR+1 RTS ; ADDST CLC ; ADD BUFST TO ARGS LDA LOARG ADC BUFST STA TEMPTR LDA LOARG+1 ADC BUFST+1 STA TEMPTR+1 CLC LDA LSTARG ADC BUFST STA LSTARG LDA LSTARG+1 ADC BUFST+1 STA LSTARG+1 RTS ; GETEND CLC ; COMPUTE BUFFER END LDA BUFST ADC BUFSIZ STA ENDBUF LDA BUFST+1 ADC BUFSIZ+1 STA ENDBUF+1 RTS ; INCTEM INC TEMPTR BNE INCRTN INC TEMPTR+1 INCRTN RTS ; INCTM1 INC TMPTR1 BNE INCRTN INC TMPTR1+1 RTS ; INCPTR INC BUFPTR BNE INCRTN INC BUFPTR+1 RTS ; DECTEM LDA TEMPTR BNE DCTEMA DEC TEMPTR+1 DCTEMA DEC TEMPTR RTS ; DECTM1 LDA TMPTR1 BNE DCTM1A DEC TMPTR1VALRTN ; CARETB LDA DATE ; ^B COMMAND STA HIARG LDA DATE+1 STA HIARG+1 INC GOTHI JMP NXTCMD ; CARETC LDA CMDREG ; ^C COMMAND CMP #36 ; DURING MACRO? BEQ CTCEXT JMP GETCMD ; YES- GET NEW COMMAND LINE CTCEXT JMP TECOEX ; NO- EXIT TECO ; COMMA LDA GOTHI ; , COMMAND BNE COMOK LDA #18 ; ?NAC ERROR JMP ERROR ; COMOK JSR DOOPER LDA LSTARG STA LOARG LDA LSTARG+1 STA LOARG+1 INC GOTLO JMP PRCMD1 ; LMOVE JSR CHKARG ; L COMMAND LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LMOVE1 JMP PROCMD ; LMOVE1 JSR LFFIND LDA TEMPTR ; POSITION POINTER THERE STA BUFPTR LDA TEMPTR+1 STA BUFPTR+1 RTS ; CMOVE JSR CHKARG ; C COMMAND CMOVE1 JSR CKPTR1 BEQ GOTC POPERR LDA #7 ; ?POP ERROR JMP ERROR ; GOTC LDA ENDLIM STA BUFPTR LDA ENDLIM+1 STA BUFPTR+1 JMP PROCMD ; JMOVE JSR DOOPER ; J COMMAND JSR BPTR ; RESET POINTER JMP CMOVE1 ; RMOVE JSR CHKARG ; R COMMAND SEC ; = -NC TYA ; NEGATE LSTARG SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JMP CMOVE1 ; TYPE JSR CHKARG ; T COMMAND JSR TYPOUT JMP PROCMD ; VERIFY JSR CHKARG ; V COMMAND LDA LSTARG PHA LDA LSTARG+1 PHA SEC ; DO 1-NT LDA #1 SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JSR TYPOUT ; PLA ; NOW DO NT STA LSTARG+1 PLA STA LSTARG JSR TYPOUT JMP PROCMD ; TYPOUT JSR FNDARG ; = T COMMAND ; TYPCHK SEC ; DONE? LDA TEMPTR SBC LSTARG LDA TEMPTR+1 SBC LSTARG+1 BCS TYPDON ; LDA (TEMPTR),Y JSR TTYOUT JSR INCTEM JMP TYPCHK TYPDON RTS ; GETDOT SEC ; GET VALUE OF . LDA BUFPTR ; .=BUFPTR-BUFST SBC BUFST STA HIARG LDA BUFPTR+1 SBC BUFST+1 STA HIARG+1 RTS ; DRADIX LDA #10 ; UPARROW/D COMMAND RDXRTN STA RADIX ; CHANGE RADIX JMP PROCMD ; ORADIX LDA #8 ; UPARROW/O COMMAND BNE RDXRTN ; HRADIX LDA #16 BNE RDXRTN ; HEXCMD LDX #4 ; $ COMMAND NXTHEX JSR GTCMCH ; GET 4 HEX DIGITS BCC BADHEX JSR CHKHEX BCC BADHEX STA TEMP ; LDY #4 ; MULTIPLY BY 16 LDA HIARG SFTHEX ASL A ROL HIARG+1 DEY BNE SFTHEX ; ORA TEMP ; ADD DIGIT STA HIARG DEX BNE NXTHEX INC GOTHI JMP NXTCMD ; BADHEX LDA #40 ; ?IHC ERROR JMP ERROR ; CHKHEX JSR DIGCHK ; 0..9? BCS HXGOOD BMI HEXBAD SBC #6 ; NO- A..F? CMP #10 BCC HEXBAD CMP #16 BCS HEXBAD HXGOOD SEC ; YES- RETURN CARRY SET RTS ; HEXBAD CLC ; NO- RETURN CARRY CLEAR RTS ; CARETS SEC ; UPARROW/S COMMAND TYA ; RETURN -STRSIZ SBC STRSIZ STA HIARG TYA SBC STRSIZ+1 STA HIARG+1 JMP VALRTN ; CARETY JSR GETDOT ; UPARROW/Y COMMAND SEC ; =.+^S,. LDA HIARG SBC STRSIZ STA LOARG LDA HIARG+1 SBC STRSIZ+1 STA LOARG+1 INC GOTLO JMP VALRTN ; CARETZ LDX #74 ; ^Z COMMAND STY QSTART STY QSTART+1 JSR ADDQST ; # CHARS FOR Q REG/COMMAND LDA QSTART ; STRING STORAGE STA HIARG LDA QSTART+1 STA HIARG+1 JMP VALRTN ; EQUAL LDA GOTHI ; LAST CHAR OPERATOR? BNE EXPROK LDA #3 ; YES- ?NAE ERROR JMP ERROR ; EXPROK LDA RADIX STA TEMP1 LDA (CMDPTR),Y ; :==? CMP #'= BNE EQUAL1 JSR GETCHR LDA #8 ; YES- PRINT IN OCTAL STA RADIX ; EQUAL1 JSR CVTNUM RESOUT LDA NUMSTR,X JSR CONOUT INX CPX #6 BNE RESOUT ; LDA GOTCLN ; :=? BNE EQUAL2 ; YES- NO CRLF JSR CRLF EQUAL2 LDA TEMP1 ; RESTORE RADIX STA RADIX JMP PROCMD ; ; CONVERT NUMBER TO STRING OF CURRENT RADIX CVTNUM JSR DOOPER STY NUMSGN LDA RADIX ; NEGATIVE BASE 10 #? CMP #10 BNE NODCNG LDA LSTARG+1 BPL NODCNG SEC ; YES- NEGATE & FLAG TYA SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 LDA #'- STA NUMSGN ; NODCNG LDX #5 ; CONVERT UP TO 5 DIGITS CVTDIV LDA LSTARG+1 STA TEMP+1 LDA LSTARG STY LSTARG STY LSTARG+1 SEC CVTDV1 SBC RADIX BCC CVTDV3 CVTDV2 INC LSTARG BNE CVTDV1 INC LSTARG+1 BNE CVTDV1 ; CVTDV3 PHA LDA TEMP+1 BEQ CVTDON DEC TEMP+1 PLA SEC BCS CVTDV2 ; CVTDON PLA ; CONVERT REMAINDER TO ASCII DIGIT ADC RADIX SED CLC ADC #'0 CLD STA NUMSTR,X DEX BPL CVTDIV ; INX ; SKIP LEADING ZEROES SKPLD0 LDA NUMSTR,X CMP #'0 BNE GOTCVT INX CPX #5 BNE SKPLD0 ; GOTCVT LDA NUMSGN ; INSERT SIGN? BEQ CVTRTN DEX STA NUMSTR,X CVTRTN RTS ; ; SEARCH FOR SRHCNT LF'S & RETURN IN TEMPTR LFFIND LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 LDA SRHCNT+1 ; NEGATIVE SEARCH? BMI NEGSRH ORA SRHCNT BNE POSRCH ; NEGSRH SEC ; YES- COUNT=-SRHCNT+1 LDA #1 SBC SRHCNT STA SRHCNT TYA SBC SRHCNT+1 STA SRHCNT+1 ; LFIND1 JSR DECTEM SEC ; DONE? LDA TEMPTR SBC BUFST LDA TEMPTR+1 SBC BUFST+1 BCC FNDONM ; YES- RETURN LDA (TEMPTR),Y ; NO- LF? CMP #10 BNE LFIND1 JSR DECSRH BNE LFIND1 ; FNDONM JSR INCTEM FNDONE RTS ; POSRCH JSR GETEND ; POSITIVE SEARCH POSRH1 SEC ; DONE? LDA TEMPTR SBC ENDBUF LDA TEMPTR+1 SBC ENDBUF+1 BCS FNDONE LDA (TEMPTR),Y ; NO- LF? CMP #10 BEQ LFOUND POSRH2 JSR INCTEM ; NO- INC POINTER JMP POSRH1 ; LFOUND JSR DECSRH ; YES- DEC COUNT BNE POSRH2 BEQ FNDONM ; ; MULTIPLY HIARG*MULNUM WITH RESULT IN LSTARG MULT STY LSTARG STY LSTARG+1 ; LDX #16 MULT1 LSR MULNUM+1 ROR MULNUM BCC NXTMUL ; CLC LDA LSTARG ADC HIARG STA LSTARG LDA LSTARG+1 ADC HIARG+1 STA LSTARG+1 ; NXTMUL ASL HIARG ROL HIARG+1 DEX BNE MULT1 MULDON RTS ; ; DIVIDE HIARG/DIVNUM WITH RESULT IN LSTARG DIVIDE LDA DIVNUM ; DIVIDE BY 0? ORA DIVNUM+1 BNE DIVOK PLA ; EAT JSR PLA LDA #4 ; YES- ?DIV ERROR JMP ERROR ; DIVOK STY LSTARG STY LSTARG+1 ; DIV1 SEC LDA HIARG SBC DIVNUM STA HIARG LDA HIARG+1 SBC DIVNUM+1 STA HIARG+1 BCC DIVDON INC LSTARG BNE DIV1 INC LSTARG+1 JMP DIV1 DIVDON RTS ; CHKARG LDA PRDPTH ; MAKE SURE ()'S MATCHED BEQ CKARG1 JMP MRPERR ; CKARG1 LDA GOTHI ; HIARG SPECIFIED? BNE ARGOK LDA #1 ; NO- DEFAULT TO 1 STA GOTHI STA HIARG STY HIARG+1 STY LASTOP ARGOK JSR DOOPER RTS ; ; GET LOW LIMIT IN TEMPTR & HI LIMIT IN LSTARG ; FOR LINE ORIENTED OR M,N TYPE COMMANDS FNDARG LDA GOTLO ; ARGS OF FORM M,N? BNE LOHIOK LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LFFIND LDA LSTARG+1 ; NEGATIVE? BMI NEGARG ORA LSTARG BEQ NEGARG ; FNDRG1 LDA TEMPTR ; NO- DO .,TEMPTR STA LSTARG LDA TEMPTR+1 STA LSTARG+1 LDA BUFPTR STA TEMPTR LDA BUFPTR+1 STA TEMPTR+1 RTS ; NEGARG LDA BUFPTR ; YES- DO TEMPTR,. STA LSTARG LDA BUFPTR+1 STA LSTARG+1 RTS ; LOHIOK JSR ADDST ; ADD BUFST TO ARGS LDA TEMPTR ; CHECK FOR LEGAL LIMITS STA CHRPTR LDA TEMPTR+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA TEMPTR LDA ENDLIM+1 STA TEMPTR+1 ; LDA LSTARG STA CHRPTR LDA LSTARG+1 STA CHRPTR+1 JSR CHKPTR LDA ENDLIM STA LSTARG LDA ENDLIM+1 STA LSTARG+1 RTS ; BPTR LDA BUFST ; RESET POINTER TO STA BUFPTR ; START OF PAGE LDA BUFST+1 STA BUFPTR+1 RTS ; ADDST CLC ; ADD BUFST TO ARGS LDA LOARG ADC BUFST STA TEMPTR LDA LOARG+1 ADC BUFST+1 STA TEMPTR+1 CLC LDA LSTARG ADC BUFST STA LSTARG LDA LSTARG+1 ADC BUFST+1 STA LSTARG+1 RTS ; GETEND CLC ; COMPUTE BUFFER END LDA BUFST ADC BUFSIZ STA ENDBUF LDA BUFST+1 ADC BUFSIZ+1 STA ENDBUF+1 RTS ; INCTEM INC TEMPTR BNE INCRTN INC TEMPTR+1 INCRTN RTS ; INCTM1 INC TMPTR1 BNE INCRTN INC TMPTR1+1 RTS ; INCPTR INC BUFPTR BNE INCRTN INC BUFPTR+1 RTS ; DECTEM LDA TEMPTR BNE DCTEMA DEC TEMPTR+1 DCTEMA DEC TEMPTR RTS ; DECTM1 LDA TMPTR1 BNE DCTM1A DEC TMPTR1VALRTN ; CARETB LDA DATE ; ^B COMMAND STA HIARG LDA DATE+1 STA HIARG+1 INC GOTHI JMP NXTCMD ; CARETC LDA CMDREG ; ^C COMMAND CMP #36 ; DURING MACRO? BEQ CTCEXT JMP GETCMD ; YES- GET NEW COMMAND LINE CTCEXT JMP TECOEX ; NO- EXIT TECO ; COMMA LDA GOTHI ; , COMMAND BNE COMOK LDA #18 ; ?NAC ERROR JMP ERROR ; COMOK JSR DOOPER LDA LSTARG STA LOARG LDA LSTARG+1 STA LOARG+1 INC GOTLO JMP PRCMD1 ; LMOVE JSR CHKARG ; L COMMAND LDA LSTARG ; SEARCH FOR LF STA SRHCNT LDA LSTARG+1 STA SRHCNT+1 JSR LMOVE1 JMP PROCMD ; LMOVE1 JSR LFFIND LDA TEMPTR ; POSITION POINTER THERE STA BUFPTR LDA TEMPTR+1 STA BUFPTR+1 RTS ; CMOVE JSR CHKARG ; C COMMAND CMOVE1 JSR CKPTR1 BEQ GOTC POPERR LDA #7 ; ?POP ERROR JMP ERROR ; GOTC LDA ENDLIM STA BUFPTR LDA ENDLIM+1 STA BUFPTR+1 JMP PROCMD ; JMOVE JSR DOOPER ; J COMMAND JSR BPTR ; RESET POINTER JMP CMOVE1 ; RMOVE JSR CHKARG ; R COMMAND SEC ; = -NC TYA ; NEGATE LSTARG SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JMP CMOVE1 ; TYPE JSR CHKARG ; T COMMAND JSR TYPOUT JMP PROCMD ; VERIFY JSR CHKARG ; V COMMAND LDA LSTARG PHA LDA LSTARG+1 PHA SEC ; DO 1-NT LDA #1 SBC LSTARG STA LSTARG TYA SBC LSTARG+1 STA LSTARG+1 JSR TYPOUT ; PLA ; NOW DO NT STA LSTARG+1 PLA STA LSTARG JSR TYPOUT JMP PROCMD ; TYPOUT JSR FNDARG ; = T COMMAND ; TYPCHK SEC ; DONE? LDA TEMPTR SBC LSTARG LDA TEMPTR+1 SBC LSTARG+1 BCS TYPDON ; LDA (TEMPTR),Y JSR TTYOUT JSR INCTEM JMP TYPCHK TYPDON RTS ; GETDOT SEC ; GET VALUE OF . LDA BUFPTR ; .=BUFPTR-BUFST SBC BUFST STA HIARG LDA BUFPTR+1 SBC BUFST+1 STA HIARG+1 RTS ; DRADIX LDA #10 ; UPARROW/D COMMAND RDXRTN STA RADIX ; CHANGE RADIX JMP PROCMD ; ORADIX LDA #8 ; UPARROW/O COMMAND BNE RDXRTN ; HRADIX L