TECO for 6502 source
Keith Packard
keith at reed.UUCP
Mon Dec 23 19:05:36 AEST 1985
*** REPLACE THIS LINE WITH YOUR MESSAGE ***
.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<TSEFUCNAVWDR' ; " CHARS
QUODSP .WORD QUOTEG ; "G
.WORD QUOTEG ; ">
.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 TMPTR1+1
DCTM1A DEC TMPTR1
RTS
;
DECSRH SEC
LDA SRHCNT
SBC #1
STA SRHCNT
LDA SRHCNT+1
SBC #0
STA SRHCNT+1
ORA SRHCNT
RTS
;
DECPTR LDA BUFPTR
BNE DCPTR1
DEC BUFPTR+1
DCPTR1 DEC BUFPTR
RTS
;
DECCNT SEC
LDA CHRCNT
SBC #1
STA CHRCNT
LDA CHRCNT+1
SBC #0
STA CHRCNT+1
ORA CHRCNT
RTS
;
FNDESC LDA #$1B ; FIND ESCAPE IN COMMAND
FDESC2 STA ESCHAR
STY CHRCNT
STY CHRCNT+1
LDA GOTAT ; COMMAND OF FORM @I//?
BEQ SAVPTR
JSR GETCHR ; YES- GET DELIMITER
BCC FNDERR
STA ESCHAR
;
SAVPTR LDA CMDPTR ; SAVE POINTER
STA TXTPTR
LDA CMDPTR+1
STA TXTPTR+1
;
FDESC1 JSR GETCHR
BCC FNDERR
CMP ESCHAR
BEQ ESCFND
INC CHRCNT
BNE FDESC1
INC CHRCNT+1
BNE FDESC1
ESCFND RTS
;
FNDERR JMP UTCERR
;
BADCMD TYA ; ?ILL ERROR
JMP ERROR
;
; SEE IF BUFPTR+LSTARG WITHIN RANGE
CKPTR1 CLC
LDA LSTARG
STA CHRCNT
ADC BUFPTR
STA CHRPTR
LDA LSTARG+1
STA CHRCNT+1
ADC BUFPTR+1
STA CHRPTR+1
;
; SEE IF CHRPTR BETWEEN 0,Z
CHKPTR SEC
LDA CHRPTR
SBC BUFST
LDA CHRPTR+1
SBC BUFST+1
BCS LOWOK
LDA BUFST ; <0; POINT TO START
STA ENDLIM
LDA BUFST+1
STA ENDLIM+1
LDA #$FF ; RETURN <0
RTS
;
LOWOK JSR GETEND ; BEYOND END?
SEC
LDA ENDBUF
STA ENDLIM
SBC CHRPTR
LDA ENDBUF+1
STA ENDLIM+1
SBC CHRPTR+1
BCS HIGHOK
LDA #1 ; RETURN >0
RTS
;
HIGHOK LDA CHRPTR
STA ENDLIM
LDA CHRPTR+1
STA ENDLIM+1
TYA ; RETURN =0
RTS
;
TRACE LDA TRCMOD ; ? COMMAND
EOR #$FF
STA TRCMOD
JMP PROCMD
;
DELCMD LDA GOTLO ; M,ND?
BNE KILL ; YES- DO M,NK
JSR CHKARG ; D COMMAND
JSR CKPTR1
BEQ GOTD
DTBERR LDA #10 ; ?DTB ERROR
JMP ERROR
;
GOTD LDA LSTARG+1 ; -ND?
BPL DELTXT
LDA ENDLIM ; YES; DO -NC
STA BUFPTR
LDA ENDLIM+1
STA BUFPTR+1
;
SEC ; NEGATE CHRCNT
TYA
SBC CHRCNT
STA CHRCNT
TYA
SBC CHRCNT+1
STA CHRCNT+1
;
DELTXT JSR DELETE ; DELETE N CHARS
JMP PROCMD
;
KILL JSR CHKARG ; K COMMAND
JSR FNDARG
SEC ; COMPUTE N-M+1
LDA LSTARG
SBC TEMPTR
STA CHRCNT
LDA LSTARG+1
SBC TEMPTR+1
STA CHRCNT+1
BCC DTBERR
;
LDA TEMPTR ; MOVE PTR BACK M CHARS
STA BUFPTR
LDA TEMPTR+1
STA BUFPTR+1
JSR DELETE ; DELETE CHARS M THRU N
JMP PROCMD
;
INSCMD JSR FNDESC ; I COMMAND
LDA GOTHI ; PRECEDED BY ARGUMENT?
BEQ INSTXT
LDA CHRCNT ; YES- MAKE SURE NO TEXT
ORA CHRCNT+1 ; AFTER 'I'
BEQ INSVAL
IIAERR LDA #6 ; NO- ?IIA ERROR
JMP ERROR
;
INSVAL JSR DOOPER ; INSERT CHR$(LSTARG)
LDA LSTARG
STA TEMBUF
JSR VALINS
JMP PROCMD
;
INSTXT JSR INSERT ; INSERT CHARS UP TO ESC
JMP PROCMD
;
TABCMD SEC ; TAB COMMAND
LDA CMDPTR ; INSERT TEXT INCLUDES TAB
SBC #1
STA TXTPTR
LDA CMDPTR+1
SBC #0
STA TXTPTR+1
STY CHRCNT+1 ; ALREADY GOT 1 CHAR
LDA #1
STA CHRCNT
LDA #$1B ; SEARCH FOR ESC
STA TEMP
JSR FDESC1
JMP INSTXT ; INSERT REST OF TEXT
;
VALINS JSR SETEMP ; INSERT CHR$(TEMBUF)
JMP INSERT
;
SETEMP LDA TMPBUF ; INSERT CHR$(TEMBUF)
STA TXTPTR
LDA TMPBUF+1
STA TXTPTR+1
LDA #1
STA CHRCNT
STY CHRCNT+1
RTS
;
BKSLSH LDA GOTHI ; \ COMMAND
BEQ BKSLS1
JSR CVTNUM ; N\ COMMAND
TXA
EOR #$FF ; GET 6-X
CLC
ADC #7
STA CHRCNT
STY CHRCNT+1
CLC ; GET POINTER
TXA
ADC STRPTR
STA TXTPTR
TYA
ADC STRPTR+1
STA TXTPTR+1
JSR INSERT ; INSERT NUMBER STRING
JMP PROCMD
;
BKSLS1 LDA #1 ; ASSEMBLE # AFTER BUFPTR
STA CHRCNT
STY CHRCNT+1
STY HIARG
STY HIARG+1
STY NUMSGN
LDA LSTARG
PHA
LDA LSTARG+1
PHA
;
JSR GETEND
JSR ENDCHK
BCC BKSLDN
LDA RADIX ; SIGNED DECIMAL?
CMP #10
BNE NODCNM
LDA (BUFPTR),Y
CMP #'+
BEQ GOTSGN
CMP #'-
BNE NODCNM
INC NUMSGN
GOTSGN JSR INCPTR
;
NODCNM JSR ENDCHK ; GET DIGIT FROM BUFFER
BCC BKSLDN
LDA (BUFPTR),Y
JSR CHKHEX
BCC BKSLDN
CMP RADIX
BPL BKSLDN
PHA ; YES- GET HIARG*RADIX+DIGIT
LDA RADIX
STA MULNUM
STY MULNUM+1
JSR MULT
CLC
PLA
ADC LSTARG
STA HIARG
TYA
ADC LSTARG+1
STA HIARG+1
JSR INCPTR
JMP NODCNM
;
BKSLDN PLA ; RESTORE LSTARG
STA LSTARG+1
PLA
STA LSTARG
LDA NUMSGN
BEQ BKSLPS
SEC ; NEGATE ARG
TYA
SBC HIARG
STA HIARG
TYA
SBC HIARG+1
STA HIARG+1
BKSLPS JMP VALRTN
;
ITERST JSR ITRADD ; < COMMAND
JMP PROCMD
;
ITRADD TYA ; ADD ITERATION TO PUSHDOWN LIST
JSR PUSH
LDA GOTHI ; ARG GIVEN?
BNE ITRARG
LDA #$FF ; NO- MAKE INFINITE
STA ITRCNT,X
STA ITRCNT+1,X
RTS
;
ITRARG STX TEMPX
JSR DOOPER
LDX TEMPX
LDA LSTARG+1 ; ARG <=0?
BMI ITRNEG ; YES- IGNORE ITERATION
STA ITRCNT+1,X
ORA LSTARG
BEQ ITRNEG
LDA LSTARG ; SAVE COUNT
STA ITRCNT,X
ITREXT RTS
;
ITRNEG DEC PSHCNT ; SKIP TO END OF ITERATION
LDA #'>
JMP SKPCMD
;
ITREND JSR CHKITR ; > COMMAND
BCC BNIERR
LDA ITRCNT+1,X ; INFINITE ITERATION?
BMI NXTITR
SEC
LDA ITRCNT,X
SBC #1
STA ITRCNT,X
LDA ITRCNT+1,X
SBC #0
STA ITRCNT+1,X
ORA ITRCNT,X
BEQ ITRDON
;
NXTITR JSR POP ; POINT TO AFTER <
JMP PROCMD
;
BNIERR LDA #9 ; ?BNI ERROR
JMP ERROR
;
ITRDON DEC PSHCNT ; DONE WITH ITERATION
JMPPRO JMP PROCMD
;
SEMCMD JSR CHKITR ; ; COMMAND
BCS SEMIOK
LDA #15 ; ?SNI ERROR
JMP ERROR
;
SEMIOK LDA GOTHI ; ARGUMENT GIVEN?
BNE SEMOK1
LDA #16 ; NO- ?NAS ERROR
JMP ERROR
;
SEMOK1 JSR DOOPER
LDA LSTARG+1 ; ARG>0?
BMI JMPPRO ; NO- IGNORE
JSR ITRNEG ; YES- EXIT ITERATION
JMP PROCMD
;
; *** PUSH ITERATION/MACRO ON PUSHDOWN LIST ***
; *** A=0 FOR ITERATION, 1 FOR MACRO ***
PUSH PHA
LDA PSHCNT
CMP #16
BNE PUSHOK
LDA #8 ; ?PDO ERROR
JMP ERROR
;
PUSHOK ASL A
TAX
LDA CMDCNT ; SAVE # CHARS LEFT IN COMMAND
STA PSHLST,X
LDA CMDCNT+1
STA PSHLST+1,X
LDA CMDREG
STA PSHREG,X
PLA
STA PSHREG+1,X
INC PSHCNT
RTS
;
; *** POP ITERATION/MACRO FROM PUSHDOWN LIST ***
POP STX TEMPX
LDA PSHLST,X ; GET # CHARS LEFT IN COMMAND
STA CMDCNT
LDA PSHLST+1,X
STA CMDCNT+1
LDA PSHREG,X ; GET COMMAND REG #
STA CMDREG
ASL A
TAX ; COMPUTE COMMAND START
INX
INX
JSR GETQST
SEC
LDA QSTART
SBC CMDCNT
STA CMDPTR
LDA QSTART+1
SBC CMDCNT+1
STA CMDPTR+1
LDX TEMPX
RTS
;
CHKITR LDA PSHCNT ; ITERATION LAST ON STACK?
BEQ BADITR
ASL A
TAX
DEX
DEX
LDA PSHREG+1,X
BNE BADITR
SEC ; YES- RETURN CARRY SET
RTS
;
BADITR CLC ; NO- RETURN CARRY CLEAR
RTS
;
QUOCMD LDA GOTHI ; " COMMAND
BNE QUOCM1
LDA #37 ; ?NAQ ERROR
JMP ERROR
;
QUOCM1 JSR DOOPER
JSR GTCMCH
LDX #15
FNDQUO CMP QUOLST,X
BEQ GOTQUO
DEX
BPL FNDQUO
LDA #38 ; ?IQC ERROR
JMP ERROR
;
GOTQUO TXA
ASL A
TAX
LDA QUODSP,X ; GET JUMP ADDRESS
STA QUOJMP+1
LDA QUODSP+1,X
STA QUOJMP+2
QUOJMP JMP $0000
;
QUOTEG LDA LSTARG+1 ; "G,">
BMI QUOSKP
ORA LSTARG
BNE QUOEXE
;
QUOSKP LDA #'' ; SKIP TO '
JSR SKPCMD
QUOEXE JMP PROCMD
;
QUOTEL LDA LSTARG+1 ; "L,"<,"T,"S
BPL QUOSKP
JMP PROCMD
;
QUOTEE LDA LSTARG ; "E,"F,"U
ORA LSTARG+1
BNE QUOSKP
JMP PROCMD
;
QUOTEC LDA LSTARG ; "C
AND #$7F
CMP #'.
BEQ QUOEXE
CMP #'$
BEQ QUOEXE
QUOTER JSR QUODIG ; 0..9?
BCS QUOEXE
QUOTEA JSR QUOUPC ; A..Z?
BCS QUOEXE
QUOTEV JSR QUOLRC ; a..z?
BCS QUOEXE
JMP QUOSKP
;
QUOTEN LDA LSTARG ; "N
ORA LSTARG+1
BEQ QUOSKP
JMP PROCMD
;
QUOTEW JSR QUOUPC ; "W
BCC QUOSKP
JMP PROCMD
;
QUOTED JSR QUODIG ; "D
BCC QUOSKP
JMP PROCMD
;
QUODIG LDA LSTARG ; RETURN CARRY SET IF LSTARG IN '0..'9
AND #$7F
CMP #'0
BMI QUOCLC
CMP #'9+1
BPL QUOCLC
QUOSEC SEC
RTS
;
QUOUPC LDA LSTARG ; RETURN CARRY SET IF LSTARG IN 'A..'Z
AND #$7F
CMP #'A
BMI QUOCLC
CMP #'Z+1
BMI QUOSEC
QUOCLC CLC
RTS
;
QUOLRC LDA LSTARG ; RETURN CARRY SET IF LSTARG IN 'a..'z
AND #$7F
CMP #97
BMI QUOCLC
CMP #123
BPL QUOCLC
BMI QUOSEC
;
OCMD JSR FNDESC ; O COMMAND
LDA TXTPTR
STA TAGPTR
LDA TXTPTR+1
STA TAGPTR+1
LDA CHRCNT
STA TAGCNT
LDA CHRCNT+1
STA TAGCNT+1
;
LDA PSHCNT ; GET STARTING POINT FOR TAG SEARCH
ASL A
TAX
BNE GETOST
LDA CMDREG
;
OCMD1 ASL A
TAX
JSR GETQST
LDA QSTART
STA CMDPTR
LDA QSTART+1
STA CMDPTR+1
LDA QRGCNT,X
STA CMDCNT
LDA QRGCNT+1,X
STA CMDCNT+1
JMP TAGFND
;
GETOST DEX ; LAST ITERATION/MACRO IN THIS Q REG?
DEX
LDA CMDREG
CMP PSHREG,X
BNE OCMD1
JSR POP ; YES- POP START
;
TAGFND LDA #'! ; FIND TAG
JSR SKPCMD
LDA TAGCNT
STA SRHCNT
LDA TAGCNT+1
STA SRHCNT+1
LDA TAGPTR
STA TEMPTR
LDA TAGPTR+1
STA TEMPTR+1
;
TAGCMP LDA SRHCNT ; ENTIRE LABEL FOUND?
ORA SRHCNT+1
BNE TGCMP1
JSR GETCHR ; YES- THIS MUST BE TAG END
CMP #'!
BNE NOMTCH
JMP PROCMD ; YES- DONE!
;
TGCMP1 JSR GETCHR
BCC BADTAG
CMP #'!
BEQ TAGFND ; SHORTER TAG
CMP (TEMPTR),Y
BNE NOMTCH
JSR INCTEM
LDA SRHCNT ; DEC SRHCNT
BNE TGCMP2
DEC SRHCNT+1
TGCMP2 DEC SRHCNT
JMP TAGCMP
;
NOMTCH JSR TAGSKP ; SKIP TO END OF TAG
JMP TAGFND ; CHECK NEXT
;
TAGSKP JSR GETCHR ; SKIP TO END OF TAG
BCC BADTAG
CMP #'!
BNE TAGSKP
RTS
;
BADTAG LDA #39 ; ?TAG ERROR
JMP ERROR
;
TAGCMD JSR TAGSKP ; ! COMMAND
JMP PROCMD
;
;
; *** SKIP COMMANDS UNTIL CHAR IN A IS FOUND.
SKPCMD STA SKPCHR
LDA PSHCNT
STA SKITCT ; SKIP ITERAION COUNT
STY SKCNCT ; SKIP CONDITIONAL COUNT
LDA TRCMOD ; DISABLE COMMAND ECHO
STA TRCTMP
STY TRCMOD
SKPCM1 STY GOTAT
SKPCM2 JSR GTCMCH
BCC SKPERR
SKPCM3 CMP SKPCHR
BEQ SKPDON
;
LDX #SKPSPC-SKPQLS-1
SKPQCK CMP SKPQLS,X ; Q REG COMMAND?
BEQ GOTQSK
DEX
BPL SKPQCK
;
SKSPCK INX ; SPECIAL CHAR?
CMP SKPSPC,X
BEQ GOTSPC
CPX #SKPTBL-SKPSPC-1
BNE SKSPCK
;
LDX #0
SKESCK CMP SKPESC,X ; SKIP TO ESCAPE?
BEQ SKPCH ; NO- SKIP NEXT COMMAND
INX
CPX #SKECMD-SKPESC
BNE SKESCK
BEQ SKPCM1
;
SKPCH JSR FNDESC ; YES- SKIP TO IT
JMP SKPCM1
;
GOTQSK JSR GTCMCH ; GET Q REG #
BCS SKPCM1
SKPERR JMP UTCERR
;
GOTSPC TXA ; GOT SPECIAL CHAR
ASL A ; GET JMP ADDRESS
TAX
LDA SKPTBL,X
STA SKPJMP+1
LDA SKPTBL+1,X
STA SKPJMP+2
SKPJMP JMP $0000
;
SKPDON CMP #'> ; ITERATIONS MATCH?
BNE CKCNSK
LDX SKITCT
CPX PSHCNT
BNE SKPGTR ; NO- FIND NEXT >
LDX SKCNCT ; CONDITIONALS MATCH?
BEQ SKPRTN
LDA #35 ; NO- ?ICN ERROR
JMP ERROR
;
SKPRTN LDX TRCTMP ; RESTORE TRACE FLAG
STX TRCMOD
BEQ SKPRT1 ; ENABLED?
JSR CONOUT ; YES- ECHO CHAR FOUND
SKPRT1 RTS
;
CKCNSK CMP #'' ; CONDITIONALS MATCH?
BNE SKPRTN
LDX SKCNCT
BNE SKPCND
LDX SKITCT ; ITERATIONS SHOULD MATCH
CPX PSHCNT
BEQ SKPRTN
IINERR LDA #36 ; ?IIN ERROR
JMP ERROR
;
SKPCTA LDA #1 ; FIND CLOSING ^A
JSR FDESC2
SKCNJP JMP SKPCM1
;
SKPQUO INC SKCNCT ; SKIP "CONDITION
JMP GOTQSK
;
SKPTAG JSR TAGSKP ; SKIP TO END OF TAG
JMP SKPCM1
;
SKPCND DEC SKCNCT ; SKIP ' (END CONDITIONAL)
JMP SKPCM1
;
SKPHEX LDX #4 ; SKIP $HEX CONSTANT
SKPHX1 JSR GTCMCH ; SKIP 4 CHARS
BCC SKPERR
DEX
BNE SKPHX1
JMP SKPCM1
;
SKPITR STY GOTHI ; SKIP < ITERATION
JSR ITRADD
JMP SKPCM1
;
SKPGTR JSR CHKITR ; SKIP >
BCC IINERR
DEC PSHCNT
JMP SKPCM1
;
SKPAT INC GOTAT ; SKIP @ COMMAND
JMP SKPCM2
;
SKPE JSR GTCMCH ; SKIP E COMMAND
LDX #SKPEND-SKECMD-1 ; ER$ TYPE COMMAND?
SKPE1 CMP SKECMD,X
BEQ SKCHJP ; YES- SKIP TO ESCAPE
DEX
BPL SKPE1
JMP SKPCM1 ; NO- SKIP NEXT COMMAND
;
SKPF JSR GTCMCH ; SKIP F COMMAND
CMP #'R
BEQ SKCHJP
CMP #'N
BEQ SKPF1
CMP #'S
BEQ SKPF1
SKJMP1 JMP SKPCM1
;
SKPF1 JSR FNDESC ; SKIP FSTEXT$TEXT$
STY GOTAT
SKCHJP JMP SKPCH
;
SKPUP JSR GTCMCH ; SKIP ^
CMP #$40
BMI SKJMP1 ; SHOULD BE ERROR
AND #$1F
JMP SKPCM3
;
INSERT JSR INTEXT ; INSERT TEXT
CLC ; INC BUFFER SIZE
LDA STRSIZ
ADC BUFSIZ
STA BUFSIZ
LDA STRSIZ+1
ADC BUFSIZ+1
STA BUFSIZ+1
INSDON RTS
;
; INSERT CHRCNT CHARS (POINTED TO BY TXTPTR)
; FOLLOWING BUFPTR.
INTEXT LDA CHRCNT ; SAVE LENGTH OF INSERT
STA STRSIZ
LDA CHRCNT+1
STA STRSIZ+1
ORA CHRCNT ; =0?
BEQ INSDON
;
CLC ; COMPUTE NEW SIZE
LDA BUFEND
STA TEMPTR
ADC CHRCNT
STA TMPTR1
LDA BUFEND+1
STA TEMPTR+1
ADC CHRCNT+1
STA TMPTR1+1
;
SEC ; ENOUGH ROOM?
LDA MAXEND
SBC TMPTR1
LDA MAXEND+1
SBC TMPTR1+1
BCS SIZEOK
PLA ; NO- ?MEM ERROR
PLA
LDA #5
JMP ERROR
;
SIZEOK LDA TMPTR1 ; SAVE NEW BUFFER END
STA BUFEND
LDA TMPTR1+1
STA BUFEND+1
;
SEC ; INSERT BEFORE CMDPTR?
LDA CMDPTR
SBC BUFPTR
LDA CMDPTR+1
SBC BUFPTR+1
BCC CKBFPT
CLC ; YES- UPDATE CMDPTR
LDA CMDPTR
ADC CHRCNT
STA CMDPTR
LDA CMDPTR+1
ADC CHRCNT+1
STA CMDPTR+1
;
CKBFPT SEC ; TEXT AFTER BUFPTR?
LDA BUFPTR
SBC TXTPTR
LDA BUFPTR+1
SBC TXTPTR+1
BCS MOVFWD
JSR FIXCMD ; YES- MOVE TXTPTR (BECAUSE TEXT MOVES)
;
MOVFWD LDA TEMPTR ; DONE?
CMP BUFPTR
BNE MVFWD1
LDA TEMPTR+1
CMP BUFPTR+1
BEQ TXTINS
;
MVFWD1 JSR DECTEM ; NO- MOVE TEXT FORWARD
JSR DECTM1
LDA (TEMPTR),Y
STA (TMPTR1),Y
JMP MOVFWD
;
TXTINS LDA (TXTPTR),Y ; NOW INSERT TEXT
STA (BUFPTR),Y
JSR INCPTR
INC TXTPTR
BNE DECNTR
INC TXTPTR+1
DECNTR JSR DECCNT
BNE TXTINS
RTS
;
FIXCMD CLC
LDA TXTPTR
ADC CHRCNT
STA TXTPTR
LDA TXTPTR+1
ADC CHRCNT+1
STA TXTPTR+1
RTS
;
DELETE JSR DLTEXT
SEC ; UPDATE BUFFER SIZE
LDA BUFSIZ
SBC CHRCNT
STA BUFSIZ
LDA BUFSIZ+1
SBC CHRCNT+1
STA BUFSIZ+1
RTS
;
; DELETE CHRCNT CHARS FOLLOWING BUFPTR.
DLTEXT CLC
LDA BUFPTR
STA TMPTR1
ADC CHRCNT
STA TEMPTR
LDA BUFPTR+1
STA TMPTR1+1
ADC CHRCNT+1
STA TEMPTR+1
SEC ; DELETE BEFORE CMDPTR?
LDA CMDPTR
SBC TEMPTR
LDA CMDPTR+1
SBC TEMPTR+1
BCC MVBCK1
SEC ; YES- UPDATE CMDPTR
LDA CMDPTR
SBC CHRCNT
STA CMDPTR
LDA CMDPTR+1
SBC CHRCNT+1
STA CMDPTR+1
;
MVBCK1 LDA TEMPTR ; DONE?
CMP BUFEND
BNE NOTDON
LDA TEMPTR+1
CMP BUFEND+1
BNE NOTDON
;
LDA TMPTR1 ; YES- SET NEW BUFFER END
STA BUFEND
LDA TMPTR1+1
STA BUFEND+1
RTS
;
NOTDON LDA (TEMPTR),Y
STA (TMPTR1),Y
JSR INCTEM
JSR INCTM1
JMP MVBCK1
;
ECMD JSR GTCMCH ; E COMMAND- GET NEXT CHR
CMP #'W
BNE NOTEW
STY EBFLAG ; EW COMMAND
JSR EDITWR
JMP PROCMD
;
NOTEW CMP #'F
BNE NOTEF
JSR CLSOUT ; EF COMMAND
JMP PROCMD
;
NOTEF CMP #'C
BNE NOTEC
JSR CLSALL ; EC COMMAND
PROJMP JMP PROCMD
;
NOTEC CMP #'X
BNE NOTEX
JSR CLSALL ; EX COMMAND
JMP TECOEX
;
NOTEX CMP #'R
BNE NOTER
JSR EDITRD ; ER COMMAND
EDTRTN LDA GOTCLN
BEQ PROJMP
LDA GOTEOF
BNE PROJMP
VALJMP JMP VALRTN ; :ER COMMAND
;
NOTER CMP #'B
BNE NOTEB
LDA CMDCNT
STA TEMP1
LDA CMDCNT+1
STA TEMP1+1
JSR EDITRD
CMP #0 ; LOOKUP FAIL?
BEQ VALJMP ; YES- MUST BE :EB - RETURN 0
;
INC EBFLAG
LDA TXTPTR ; POINT BACK TO NAME FOR
STA CMDPTR ; EDIT WRITE
LDA TXTPTR+1
STA CMDPTR+1
LDA TEMP1
STA CMDCNT
LDA TEMP1+1
STA CMDCNT+1
LDA TRCMOD
STA TRCTMP
STY TRCMOD
JSR EDITWR
LDA TRCTMP
STA TRCMOD
JMP EDTRTN
;
NOTEB CMP #'K
BNE NOTEK
LDA OUTOPN ; EK COMMAND
BEQ EKRTN
JSR DELTMP ; UNDO EW OR EB
STY OUTOPN
EKRTN JMP PROCMD
;
NOTEK CMP #'E
BNE NOTEE
LDA CLSPTR ; EE COMMAND
STA SCNOUT
LDA CLSPTR+1
STA SCNOUT+1
JSR GETFIL ; GET FILE NAME
LDA CLSBUF+12 ; DELETE FILE
ORA #$40
TAX
LDA CLSBUF+11
JSR USR
.BYTE DELET
.WORD CLSBUF
JMP DIRERR
JMP PROCMD
;
NOTEE CMP #'I
BNE NOTEI
LDA EIFPTR ; EI COMMAND
STA SCNOUT
LDA EIFPTR+1
STA SCNOUT+1
JSR GETFIL ; LOOKUP INDIRECT FILE
BCS EICMD0
STY EIOPEN ; EI$
JMP PROCMD
;
EICMD0 LDA EIUNIT
ORA #$40
TAX
LDA EIDEV
JSR USR
.BYTE LOOKUP
.WORD EIFILE
.WORD DIRBUF
JMP FNFERR
;
LDA DIRBUF+$C ; INIT STARTING BLOCK
STA EIPAGE
LDA DIRBUF+$D
STA EIPAGE+1
LDA DIRBUF+$E ; AND LENGTH
STA EILEN
LDA DIRBUF+$F
BEQ EICMD1
JMP STLERR ; FILE TOO BIG
;
EICMD1 LDA EIEND ; EMPTY BUFFER
STA EIPTR
LDA EIEND+1
STA EIPTR+1
INC EIOPEN
JMP PROCMD
;
NOTEI CMP #'Q
BNE NOTEQ
JMP NOTOPN ; EQ COMMAND
;
NOTEQ LDX #EFGCNT-1 ; SEARCH FOR E FLAG
FNDFLG CMP EFLAGS,X
BEQ GOTFLG
DEX
BPL FNDFLG
IECERR LDA #23 ; NOT FOUND- ?IEC ERROR
JMP ERROR
;
GOTFLG STA TEMP
TXA
ASL A
TAX
LDA TEMP
CMP #'O
BEQ FLGVAL ; EO IS READ-ONLY
;
FLGTYP LDA GOTHI ; SET FLAG?
BEQ FLGVAL
LDA LASTOP ; COULD BE n+Ex
BNE FLGVAL
JSR DOOPER ; YES
LDA LSTARG
STA EDFLAG,X
LDA TEMP ; ET?
CMP #'T
BEQ GOTET
LDA LSTARG+1
STA EDFLAG+1,X
JMP PROCMD
;
GOTET LDA LSTARG+1
AND #$F9 ; BITS 9 AND 10 READ ONLY
STA LSTARG+1
LDA ETFLAG+1
AND #6
ORA LSTARG+1
STA ETFLAG+1
LDA LSTARG ; LOWER CASE ALLOWED?
AND #4 ; PUT CONVERSION BIT IN CNSTAI
ASL A
EOR #8
STA TEMP
LDA CNSTAI
AND #$F7
ORA TEMP
STA CNSTAI
JMP PROCMD
;
FLGVAL LDA EDFLAG,X ; NO- GET VALUE
STA HIARG
LDA EDFLAG+1,X
STA HIARG+1
JMP VALRTN
;
CTXCMD LDX #EFGCNT*2 ; ^X COMMAND
BNE FLGTYP
;
PCMD LDA (CMDPTR),Y ; P COMMAND
CMP #'W ; PW COMMAND?
BNE NOTPW
JSR GTCMCH
LDA GOTLO ; YES- M,NPW?
BNE NOTPW
INC FFFLAG ; NO- APPEND FF TO PAGE
;
NOTPW LDA GOTLO ; M,N COMMAND?
BNE NOTCOM
JSR CHKARG ; NO- GET REPETITION CNT
LDA LSTARG
STA TEMP1
LDA LSTARG+1
BEQ NEWPAG
LDA #26 ; ?IPC ERROR
JMP ERROR
;
NEWPAG JSR PAGOUT ; OUTPUT PAGE
JSR YNKPAG ; GET NEXT PAGE
DEC TEMP1
BNE NEWPAG
;
INRTN JSR INUP
JMP PROCMD
;
NOTCOM JSR FNDARG ; M,NP COMMAND
JSR OUTPUT
JMP PROCMD
;
;
YCMD JSR YANK ; Y COMMAND
JMP INRTN
;
ACMD LDA GOTHI ; A COMMAND
BEQ NOAARG ; NA?
JSR DOOPER
JSR CKPTR1 ; YES- GET CHAR AT .+ARG
BEQ AARGOK
LDA #$FF ; RETURN -1
STA HIARG
STA HIARG+1
JMP NEWVAL
;
AARGOK LDA (CHRPTR),Y
STA HIARG
STY HIARG+1
JMP NEWVAL
;
NOAARG LDA GOTCLN ; FLAG IF :A
STA COLONA
JSR APPEND ; NO- APPEND PAGE
JMP INRTN
;
INUP LDA INOPEN ; RAISE HEAD FOR FLOPPY
BEQ IGNORE
LDA INUNIT
ORA #$20
TAX
JSR INHLR
.BYTE 0
NOP ; IGNORE ERRORS
NOP
NOP
IGNORE RTS
;
OUTUP LDA OUTOPN ; RAISE HEAD FOR FLOPPY
BEQ IGNORE
LDA OUTUNT
ORA #$20
TAX
JSR OUTHLR
.BYTE 0
NOP ; IGNORE ERRORS
NOP
NOP
RTS
;
; EDIT WRITE ROUTINE
EDITWR STY FFFLAG
LDA OUTOPN ; FILE ALREADY OPEN?
BEQ WRITOK
LDA #25 ; YES- ?OFO ERROR
JMP ERROR
;
WRITOK LDA OFLPTR ; RETURN DATA IN OUTFIL
STA SCNOUT
LDA OFLPTR+1
STA SCNOUT+1
STY SUPSED
JSR GETFIL ; GET FILE NAME
;
LDA EBFLAG
BNE NOFILE
;
LDA OUTDEV ; LOOKUP FILE
LDX OUTUNT
JSR USR
.BYTE LOOKUP
.WORD OUTFIL
.WORD DIRBUF
JMP NOFILE ; NOT FOUND
;
JSR INUP
LDX #0 ; IT EXISTS- SUPERSEDE?
SUPOUT LDA SUPMES,X ; PRINT 'SUPERSEDE? '
BEQ SUPDON
JSR TTYOUT
INX
BNE SUPOUT
;
SUPDON JSR GETANS ; GET ANSWER
BNE SETSUP
JMP PROCMD ; NO- IGNORE EW
SETSUP INC SUPSED
;
NOFILE LDA OUTUNT ; DELETE ANY EXISTING 'TECO.TMP'
ORA #$40
TAX
STA OUTUUP
LDA OUTDEV
JSR USR
.BYTE DELET
.WORD TMPNAM
NOP ; IGNORE ERRORS
NOP
NOP
;
LDA #$FF ; USE LARGEST EMPTY ENTRY
STA CLSLEN
STA CLSLEN+1
;
LDX OUTUUP ; NOW ENTER IT
LDA OUTDEV
JSR USR
.BYTE ENTER
.WORD TMPNAM
.WORD OUTFIL+17
JMP DIRERR
;
INC OUTOPN
LDA OUTFIL+17 ; INIT STARTING BLOCK
STA OUTPAG
LDA OUTFIL+18
STA OUTPAG+1
LDA OUTST ; INIT STARTING POINTER
STA OUTPTR
LDA OUTST+1
STA OUTPTR+1
RTS
;
DIRERR LDA #22 ; ?DIR ERROR
JMP ERROR
;
; EDIT READ ROUTINE
EDITRD LDA IFLPTR ; RETURN DATA IN INFILE
STA SCNOUT
LDA IFLPTR+1
STA SCNOUT+1
JSR GETFIL ; GET FILENAME & LOOKUP
LDA INUNIT ; FILE
ORA #$40
TAX
LDA INDEV
JSR USR
.BYTE LOOKUP
.WORD INFILE
.WORD DIRBUF
JMP NOINFL ; NOT FOUND
;
RDFND LDA DIRBUF+$C ; INIT STARTING BLOCK
STA INPAGE
LDA DIRBUF+$D
STA INPAGE+1
LDA DIRBUF+$E ; LENGTH
STA INLEN
LDA DIRBUF+$F
STA INLEN+1
LDA OUTST ; EMPTY INPUT BUFFER
STA INPTR
LDA OUTST+1
STA INPTR+1
INC INOPEN
STY GOTEOF
LDA #$FF
CPY GOTCLN ; :ER?
BEQ ERRTS1
ERRTS STA HIARG ; YES- RETURN VALUE
STA HIARG+1
ERRTS1 RTS
;
NOINFL LDA GOTCLN
BEQ FNFERR
TYA ; :ER COMMAND
BEQ ERRTS
;
FNFERR LDA #27 ; ?FNF ERROR
JMP ERROR
;
; YANK PAGE IN
YANK LDA BUFSIZ
ORA BUFSIZ+1 ; BUFFER EMPTY?
BEQ YNKPG1
LDA OUTOPN ; NO- OUTPUT FILE OPEN?
BEQ YNKPAG
LDA EDFLAG ; YES- -1ED?
CMP #$FF
BEQ YNKPAG
LDA #31 ; NO- ?YCA ERROR
JMP ERROR
;
YNKPAG JSR ZERPAG
YNKPG1 JMP APPEND
;
; EXIT TECO
TECOEX LDA OUTOPN ; OUTPUT FILE OPEN?
BEQ NOTOPN
LDX #0
DELCHK LDA DELMES,X ; DELETE TECO.TMP?
BEQ DELDON
JSR TTYOUT
INX
BNE DELCHK
;
DELDON JSR GETANS ; GET ANSWER
BEQ CLOSEX ; NO- CLOSE TECO.TMP
JSR DELTMP
;
NOTOPN LDA TMPSTO ; RESTORE CONSOLE STATUS
STA CNSTAO ; BITS
LDA TMPSTI
STA CNSTAI
JMP MONITR ; GO TO MONITOR
;
CLOSEX JSR CLSTMP ; CLOSE TECO.TMP & EXIT
JMP NOTOPN
;
DELTMP LDA OUTDEV ; YES- DELETE TECO.TMP
LDX OUTUUP
JSR USR
.BYTE DELET
.WORD TMPNAM
JMP OUTERR
RTS
;
; OUTPUT CURRENT PAGE
PAGOUT LDA BUFST ; DO 0,ZP
STA TEMPTR
LDA BUFST+1
STA TEMPTR+1
JSR GETEND
LDA ENDBUF
STA LSTARG
LDA ENDBUF+1
STA LSTARG+1
JSR OUTPUT
LDA FFFLAG ; APPEND FF?
BEQ PAGRTN
LDA #12 ; YES
JSR ADDOUT
PAGRTN RTS
;
; ADD CHARS FROM TEMPTR TO LSTARG TO OUTPUT BUF
OUTPUT LDA OUTOPN ; OUTPUT OPEN?
BNE OUTPT1
NFOERR LDA #24 ; NO- ?NFO ERROR
JMP ERROR
;
OUTPT1 LDA TEMPTR ; DONE?
CMP LSTARG
BNE ADOUT
LDA TEMPTR+1
CMP LSTARG+1
BEQ PAGRTN
;
ADOUT LDA (TEMPTR),Y ; NO- GET CHAR
JSR ADDOUT ; ADD TO OUTPUT BUFFER
INC TEMPTR
BNE OUTPT1
INC TEMPTR+1
BNE OUTPT1
;
;
; ADD CHAR TO OUTPUT BUFFER
ADDOUT STA (OUTPTR),Y
INC OUTPTR
BNE ADOUT1
INC OUTPTR+1
;
ADOUT1 LDA OUTPTR ; OUTPUT BUFFER FULL?
CMP BUFST
BNE OUTRTN
LDA OUTPTR+1
CMP BUFST+1
BNE OUTRTN
;
LDA OUTSIZ
STA OUBLCT
;
OUTBLK SEC ; DEC BLOCK COUNT
LDA OUTFIL+19
SBC OUBLCT
STA OUTFIL+19
LDA OUTFIL+20
SBC #0
STA OUTFIL+20
BCS OUTBL1
JSR OUTUP ; ?FUL ERROR
LDA #34
JMP ERROR
;
OUTBL1 LDA OUTUNT ; WRITE BLOCK
ORA #$80
TAX
JSR OUTHLR
OUBLCT .BYTE 0
OUTST .WORD 0
OUTPAG .WORD 0
JMP OUTERR ; OUTPUT ERROR
;
LDA OUTST ; RESET POINTER
STA OUTPTR
LDA OUTST+1
STA OUTPTR+1
CLC ; INC BLOCK POINTER
LDA OUTPAG
ADC OUBLCT
STA OUTPAG
BCC OUTRTN
INC OUTPAG+1
OUTRTN RTS
;
OUTERR JSR OUTUP ; OUTPUT ERROR
LDA #19
JMP ERROR
;
; WRITE REMAINDER OF INPUT FILE TO OUTPUT FILE
; AND CLOSE BOTH
CLSALL JSR PAGOUT ; OUTPUT CURRENT PAGE
JSR ZERPAG
LDA INOPEN
BEQ NOAPND
LDA GOTEOF ; GOT ALL INPUT?
BEQ DMPAGE
NOAPND JSR CLSOUT ; YES- CLOSE OUTPUT FILE
STY INOPEN
RTS
;
DMPAGE JSR APPEND ; NO- GET NEXT PAGE
JMP CLSALL
;
; CLOSE TECO.TMP
CLSTMP LDA OUTOPN
BNE ADDCTZ
JMP NFOERR
;
ADDCTZ LDA #26 ; ADD ^Z
JSR ADDOUT
NULFIL LDA OUTPTR ; NULL FILL REST
CMP BUFST
BEQ ZERODN
TYA
JSR ADDOUT
JMP NULFIL
;
ZERODN SEC ; # BLOCKS LEFT IN OUTPUT FILE
LDA OUTSIZ
SBC BUFST+1
CLC
ADC OUTPTR+1
STA OUBLCT
BEQ GETCLS ; NOTHING LEFT
JSR OUTBLK ; ADD TO OUTPUT FILE
;
GETCLS SEC ; COMPUTE CLOSING LENGTH
LDA OUTPAG
SBC OUTFIL+17
STA CLSLEN
LDA OUTPAG+1
SBC OUTFIL+18
STA CLSLEN+1
;
LDA OUTDEV ; CLOSE TECO.TMP
LDX OUTUNT
JSR USR
.BYTE CLOSE
.WORD TMPNAM
JMP OUTERR
RTS
;
CLSOUT JSR CLSTMP ; CLOSE OUTPUT FILE
LDA EBFLAG ; WAS THIS AN EB?
BEQ NOTEB1
LDX #0 ; YES- KILL FILE.BAK
BACKUP LDA OUTFIL,X
STA CLSBUF,X
STA CLSBUF+8,X
INX
CPX #8
BNE BACKUP
;
LDA RADBAK
STA CLSBUF+14
LDA RADBAK+1
STA CLSBUF+15
;
LDA OUTDEV
LDX OUTUNT
JSR USR
.BYTE DELET
.WORD CLSBUF+8
NOP ; DIDN'T EXIST ANYWAY
NOP
NOP
;
LDX OUTUNT ; RENAME FILE->FILE.BAK
JSR RENOUT
;
NOTEB1 LDA SUPSED ; SUPERSEDE?
BEQ NOSUP
LDA OUTDEV ; YES
LDX OUTUNT
JSR USR
.BYTE DELET
.WORD OUTFIL
JMP OUTERR
;
NOSUP LDX #0 ; RENAME FILE<TECO.TMP
NEWNAM LDA TMPNAM,X
STA CLSBUF,X
LDA OUTFIL,X
STA CLSBUF+8,X
INX
CPX #8
BNE NEWNAM
;
STY OUTOPN
LDX OUTUUP
;
RENOUT LDA #0 ; DON'T LOCK
STA CLSBUF+16
LDA OUTDEV
JSR USR
.BYTE RENAME
.WORD CLSBUF
JMP OUTERR
RTS
;
; APPEND NEXT PAGE
APPEND STY FFFLAG
LDA INOPEN ; INPUT FILE OPEN?
BNE APPAGE
LDA #28 ; ?NFI ERROR
JMP ERROR
;
APPAGE LDA GOTEOF ; GOT EOF YET?
BEQ NOEOF
EOFERR JSR INUP ; YES- ?EOF ERROR
JSR OUTUP ; RAISE HEADS
LDA #29
JMP ERROR
;
NOEOF STY CHRCNT
STY CHRCNT+1
SEC ; COMPUTE 3/4 THROUGH BUFFER
LDA MAXEND ; T1=MAXEND-BUFST
SBC BUFST
STA BUFTHQ
LDA MAXEND+1
SBC BUFST+1
LSR A ; T1=T1/2
PHA
ROR BUFTHQ
LDX BUFTHQ
LSR A ; T1=(T1/2)+T1
STA BUFTHQ+1
ROR BUFTHQ
TXA
CLC
ADC BUFTHQ
TAX
PLA
ADC BUFTHQ+1
PHA
CLC ; =(MAXEND-BUFST)*3/4+BUFST
TXA
ADC BUFST
STA BUFTHQ
PLA
ADC BUFST+1
STA BUFTHQ+1
;
GETPAG JSR CKINFL ; INPUT BUFFER EMPTY?
BCC GOTPAG
LDA INLEN+1 ; ANYTHING LEFT?
BNE STINSZ
LDA INLEN
BEQ EOFERR ; NO- ?EOF ERROR
CMP INSIZE ; <INSIZE BLOCKS LEFT?
BCC STINCT
STINSZ LDA INSIZE
STINCT STA INBLCT
LDX INUNIT
JSR INHLR
INBLCT .BYTE 0
INST .WORD 0
INPAGE .WORD 0
JMP INERR ; INPUT ERROR
;
SEC
LDA INLEN
SBC INBLCT
STA INLEN
LDA INLEN+1
SBC #0
STA INLEN+1
;
LDA INST ; RESET POINTER
STA INPTR
LDA INST+1
STA INPTR+1
CLC ; INC BLOCK POINTER
LDA INPAGE
ADC INBLCT
STA INPAGE
BCC GOTPAG
INC INPAGE+1
;
GOTPAG LDA (INPTR),Y ; GET CHAR
CMP #26 ; ^Z?
BNE NOTEOF
INC GOTEOF
JMP ADPAGE ; YES- ADD PREVIOUS CHARS
;
NOTEOF CMP #12 ; FORM FEED?
BNE NOTFF
JSR ADPAGE ; YES- ADD PREVIOUS CHRS
INC FFFLAG
JMP INCIN ; IGNORE FF AND RETURN
;
NOTFF STA TEMP1+1
JSR INCCNT
CMP #10
BNE NOTLF
LDA COLONA ; :A?
BNE ADPAGE ; YES- APPEND 1 LINE
;
NOTLF JSR CKINFL ; AT END OF INPUT BUFFER?
BCC NOPGFL
JSR ADPAGE ; YES- ADD TO END OF BUFFER
;
NOPGFL CLC ; COMPUTE # CHARS IN
LDA BUFEND ; BUFFER
ADC CHRCNT
STA TEMP
LDA BUFEND+1
ADC CHRCNT+1
STA TEMP+1
;
SEC ; BUFFER 3/4 FULL?
LDA BUFTHQ
SBC TEMP
LDA BUFTHQ+1
SBC TEMP+1
BCS JPGTPG
;
CKFULL CLC ; YES- COMPLETELY FULL?
LDA MAXEND
SBC TEMP
LDA MAXEND+1
SBC TEMP+1
BCS NOFULL
;
JSR ADPAGE ; YES- FILL UP TO END &
JSR INUP
LDA #5 ; ?MEM ERROR
JMP ERROR
;
NOFULL LDA TEMP1+1 ; NO- WAS CHAR A LF?
CMP #10
BEQ ADPAGE ; YES- END OF PAGE
JPGTPG JMP GETPAG
;
; ADD INPUT BUFFER FROM INPTR, CHRCNT CHARS TO TEXT BUFFER
ADPAGE JSR PTRSAV ; POINT TO END OF BUFFER
JSR GETEND
LDA ENDBUF
STA BUFPTR
LDA ENDBUF+1
STA BUFPTR+1
SEC
LDA INPTR
SBC CHRCNT
STA TXTPTR
LDA INPTR+1
SBC CHRCNT+1
STA TXTPTR+1
JSR INSERT ; INSERT TEXT
JSR RESPTR ; RESTORE POINTER
STY CHRCNT
STY CHRCNT+1
RTS
;
INERR JSR INUP ; ?INP ERROR
LDA #30
JMP ERROR
;
INCCNT INC CHRCNT
BNE INCIN
INC CHRCNT+1
;
INCIN INC INPTR
BNE NCRTRN
INC INPTR+1
NCRTRN RTS
;
; RETURN CARRY SET IF INPUT BUFFER EMPTY
CKINFL SEC
LDA INPTR
SBC OUTST
LDA INPTR+1
SBC OUTST+1
RTS
;
ZERPAG LDA BUFSIZ ; ZERO BUFFER
STA CHRCNT
LDA BUFSIZ+1
STA CHRCNT+1
LDA BUFST
STA BUFPTR
LDA BUFST+1
STA BUFPTR+1
JMP DELETE
;
; SCAN FOLLOWING FILE NAME. SCNOUT POINTS TO
; RETURNED DATA.
GETFIL JSR FNDESC ; DO SCAN
LDA CHRCNT
ORA CHRCNT+1
BNE GTFIL1
CLC ; FLAG NO NAME (En$)
RTS
;
GTFIL1 LDA TXTPTR
STA FNMPTR
LDA TXTPTR+1
STA FNMPTR+1
;
JSR USR
.BYTE SCAN
.WORD FNMPTR
SCNOUT .WORD 0
JMP SCNERR
;
CLC
LDA SCNOUT ; POINT TO NEXT CHAR
STA TEMPTR
ADC #14
STA FETOUT
LDA SCNOUT+1
STA TEMPTR+1
ADC #0
STA FETOUT+1
;
LDY #13 ; WILD CHAR SPECIFIED?
LDA (TEMPTR),Y
BEQ WILDOK
NAMERR LDA #20 ; ?IFN ERROR
JMP ERROR
;
WILDOK LDY #10 ; NEXT CHAR MUST BE ESC
LDA (TEMPTR),Y
CMP CHRCNT
BNE NAMERR
;
INY ; FETCH HANDLER
LDA (TEMPTR),Y
STA FETIN+1
;
JSR USR
.BYTE FETCH
.WORD FETIN
FETOUT .WORD 0
JMP BADHLR ; CAN'T FIND IT
;
JSR SAVNAM ; SET UP FILESPEC BUFFER
LDY #8 ; ZERO NEW POINTER FOR
LDA #0 ; LOOKUP
STA (TEMPTR),Y
INY
STA (TEMPTR),Y
TAY
SEC
RTS
;
SCNERR CMP #0 ; NAME OR DEVICE ERROR?
BEQ NAMERR
BADHLR LDA #21 ; ?DEV ERROR
JMP ERROR
;
SAVNAM LDX #0 ; PUT NAME IN FILESPEC BUFFER
LDY #8 ; PUT DEVICE NAME
JSR ADDRAD
LDY #12
LDA (TEMPTR),Y ; GET UNIT #
CLC
SED
ADC #'0
CLD
STA FILSPC,X
INX
LDA #':
STA FILSPC,X
INX
;
LDY #0 ; AND NAME AND EXTENSION
SAVNM1 JSR ADDRAD
CPY #6
BNE SAVNM2
LDA #'.
STA FILSPC,X
INX
SAVNM2 CPY #8
BNE SAVNM1
;
CPX #6 ; EMPTY FILENAME?
BNE SAVNM3
DEX ; YES- EAT '.'
SAVNM3 STX FSPCSZ ; SAVE SIZE
LDY #0
RTS
;
ADDRAD LDA (TEMPTR),Y ; GET RAD50 WORD
STA RADWRD
INY
LDA (TEMPTR),Y
STA RADWRD+1
INY
JSR USR ; CONVERT TO ASCII
.BYTE RD2ASC
.WORD RADWRD
.WORD CHAR
;
TYA ; ADD 3 CHARS TO BUFFER
PHA
LDY #0
ADDRD1 LDA CHAR,Y
CMP #$20 ; IGNORE BLANKS
BEQ ADDRD2
STA FILSPC,X
INX
ADDRD2 INY
CPY #3
BNE ADDRD1
;
PLA
TAY
RTS
;
GETANS LDX #0 ; GET YES OR NO ANSWER
JSR BINPUT ; GET CHAR
CMP #'Y
BEQ GOTYES
CMP #$79
BNE ANSOUT
GOTYES LDX #3 ; YES
ANSOUT LDA ANSMES,X ; PRINT YES OR NO
BEQ GOTANS
JSR CONOUT
INX
BNE ANSOUT
;
GOTANS JSR CRLF
DEX ; X=0 -> NO ELSE YES
DEX
RTS
;
PTRSAV LDA BUFPTR ; SAVE BUFPTR
STA BUFTMP
LDA BUFPTR+1
STA BUFTMP+1
RTS
;
RESPTR LDA BUFTMP ; RESTORE BUFPTR
STA BUFPTR
LDA BUFTMP+1
STA BUFPTR+1
RTS
;
MCMD JSR GTQREG ; M COMMAND
TXA
PHA
LDA #1
JSR PUSH ; PUSH COMMAND POINTER ON STACK
PLA
TAX
LSR A ; POINT TO NEW COMMAND
STA CMDREG
LDA QRGCNT,X
STA CMDCNT
LDA QRGCNT+1,X
STA CMDCNT+1
JSR GETQST
LDA QSTART
STA CMDPTR
LDA QSTART+1
STA CMDPTR+1
JMP NXTCMD
;
UCMD LDA GOTHI ; U COMMAND
BNE UCMDOK
LDA #32 ; ?NAU ERROR
JMP ERROR
;
UCMDOK JSR DOOPER
JSR GTQREG
LDA LSTARG
STA QVAL,X
LDA LSTARG+1
STA QVAL+1,X
LDA GOTLO ; m,nU?
BNE UCMD1
JMP PROCMD
;
UCMD1 LDA LOARG ; YES- PUT LOARG IN HIARG
STA HIARG
LDA LOARG+1
STA HIARG+1
STY GOTLO
NEWVAL INC GOTHI
JMP PRCMD3
;
QCMD JSR GTQREG ; Q COMMAND
LDA GOTCLN
BNE COLONQ
LDA QVAL,X
STA HIARG
LDA QVAL+1,X
STA HIARG+1
JMP VALRTN
;
COLONQ LDA QRGCNT,X
STA HIARG
LDA QRGCNT+1,X
STA HIARG+1
JMP VALRTN
;
PERCMD JSR CHKARG ; % COMMAND
JSR GTQREG
CLC
LDA QVAL,X
ADC LSTARG
STA QVAL,X
STA HIARG
LDA QVAL+1,X
ADC LSTARG+1
STA QVAL+1,X
STA HIARG+1
JMP NEWVAL
;
CARETE LDA FFFLAG ; ^E COMMAND
BEQ SETVAL
NOTZRO LDA #$FF
SETVAL STA HIARG
STA HIARG+1
JMP VALRTN
;
CARETN LDA GOTEOF ; ^N COMMAND
BEQ SETVAL
BNE NOTZRO
;
CLNCMD INC GOTCLN ; : COMMAND
CLNRTN JSR GTCMCH
BCC CLNDON
JMP EXECMD
CLNDON JMP CMDONE
;
ATCMD INC GOTAT ; @ COMMAND
BNE CLNRTN
;
SRHCMD LDA GOTCLN ; S COMMAND
CMP #2 ; ::S?
BCC SRHCM1
BNE ISAERR
LDA GOTHI ; YES- ARGS SPECIFIED?
BNE ISAERR ; YES- ERROR
LDA #1 ; NO- MAKE 1,1:S
STA LOARG
STA GOTLO
;
SRHCM1 TYA
DOSRCH STA PAGSRH
JSR CHKARG
JSR CHKCLN
JSR SEARCH ; PERFORM SEARCH
PHA
BNE SRHFND ; SUCCEEDED?
SRHEND LDA GOTCLN ; NO- RETURN VALUE?
BNE SRHNXT
JMP SRHERR ; NO- PRINT ?SRH MES
;
SRHFND LDA PSHCNT ; DURING MACRO OR ITERATION?
BNE SHFND1 ; YES
LDA ESFLAG ; NO- CHECK FOR ES
STA VERFLG
LDA ESFLAG+1
STA VERFLG+1
JSR EDTVER
;
SHFND1 LDA GOTCLN
BEQ SRHPRO ; NO VALUE RETURNED
SRHNXT PLA ; :S COMMAND
JMP PRCMD2
SRHPRO JMP PROCMD ; STANDARD SEARCH RETURN
;
ISAERR LDA #12 ; ?ISA ERROR
JMP ERROR
;
NCMD LDA #1 ; N COMMAND
BNE DOSRCH
;
YSRCH LDA #$FF ; _ COMMAND
BNE DOSRCH
;
EDTVER LDA VERFLG ; EDIT VERIFY CHECK
ORA VERFLG+1 ; FOR ES OR EV FLAGS
BEQ EVDONE
STY SRHCNT ; ASSUME 0T
STY SRHCNT+1
LDA VERFLG
AND VERFLG+1
CMP #$FF
PHP
BEQ EDVER0
SEC ; GET -HI BYTE
TYA
SBC VERFLG+1
STA SRHCNT
DEC SRHCNT+1
;
EDVER0 JSR LFFIND ; DO -nT
JSR NEGARG
JSR TYPCHK
;
STY SRHCNT+1 ; ASSUME 1T
LDA #1
STA SRHCNT
PLP ; PRINT POINTER CHAR?
BEQ EDVER2 ; NO
LDA VERFLG ; YES- 1-31?
AND #$7F
CMP #$20
BCS EDVER1 ; NO- CHAR OK
LDA #$0A ; YES- USE LF INSTEAD
;
EDVER1 JSR CONOUT
LDA VERFLG+1 ; DO 1T?
BEQ EDVER2
STA SRHCNT ; NO
INC SRHCNT
;
EDVER2 JSR LFFIND ; DO nT
JSR FNDRG1
JSR TYPCHK
EVDONE RTS
;
CARETU JSR GTQREG ; ^U COMMAND
STX TEMPX
LDA GOTCLN ; :^U?
BEQ NOCLNU
INX ; YES- POINT TO END OF Q
INX ; REG
NOCLNU JSR GETQST
LDX TEMPX
JSR QBFPTR
LDA GOTCLN
BNE NOUZRO
JSR QZERO
;
NOUZRO LDA GOTHI
BEQ CTUINS
JSR GETCHR ; N^U$ COMMAND
CMP #$1B ; NEXT CHAR MUST BE ESC
BEQ CTLUOK
JMP IIAERR
;
CTLUOK JSR DOOPER
LDA LSTARG
STA TEMBUF
JSR SETEMP
JMP INQTXT
;
CTUINS JSR FNDESC ; ^UTEXT$ COMMAND
JMP INQTXT
;
XCMD JSR CHKARG ; X COMMAND
JSR FNDARG
LDA TEMPTR ; SAVE TEMPTR
STA TXTPTR
LDA TEMPTR+1
STA TXTPTR+1
JSR GTQREG
STX TEMPX
LDA GOTCLN ; :X COMMAND?
BEQ NOCLNX
INX ; YES- APPEND TO Q REG
INX
NOCLNX JSR GETQST ; POINT TO Q REG START
LDX TEMPX
JSR QBFPTR
LDA GOTCLN
BNE NOZERO
JSR QZERO
;
NOZERO SEC ; COMPUTE # CHARS
LDA LSTARG
SBC TXTPTR
STA CHRCNT
LDA LSTARG+1
SBC TXTPTR+1
STA CHRCNT+1
INQTXT CLC ; UPDATE Q REG SIZE
LDA QRGCNT,X
ADC CHRCNT
STA QRGCNT,X
LDA QRGCNT+1,X
ADC CHRCNT+1
STA QRGCNT+1,X
JSR INTEXT ; INSERT TEXT
JSR RESPTR ; RESTORE BUF POINTER
JMP PROCMD
;
GCMD JSR GTCMCH ; G COMMAND
JSR GTQRG2 ; GET Q REG # AND START
JSR GTQST0
LDA QRGCNT,X
STA CHRCNT
LDA QRGCNT+1,X
STA CHRCNT+1
;
GCMD3 LDA GOTCLN
BNE QRGOUT
LDA QSTART
STA TXTPTR
LDA QSTART+1
STA TXTPTR+1
JSR INSERT
GDONE JMP PROCMD
;
QRGOUT LDA CHRCNT ; PRINT Q REG N
ORA CHRCNT+1
BEQ GDONE
LDA (QSTART),Y
JSR TTYOUT
INC QSTART
BNE DCOUNT
INC QSTART+1
DCOUNT JSR DECCNT
JMP QRGOUT
;
QBFPTR JSR PTRSAV
LDA QSTART
STA BUFPTR
LDA QSTART+1
STA BUFPTR+1
RTS
;
QZERO LDA QRGCNT,X ; ZERO Q REGISTER
STA CHRCNT
ORA QRGCNT+1,X ; =0?
BEQ NOQZRO
LDA QRGCNT+1,X
STA CHRCNT+1
STA CHRCNT+1
JSR DLTEXT
TYA
STA QRGCNT,X
STA QRGCNT+1,X
NOQZRO RTS
;
; GET START OF Q REGISTER QRGNUM
GTQST0 CPX #74 ; * OR _ Q REGS?
BCC GETQST
LDA FLSPTR-74,X ; YES- GET START OF REG
STA QSTART
LDA FLSPTR-73,X
STA QSTART+1
RTS
;
GETQST STX TEMP
JSR GETEND ; ADD SIZE OF PREVIOUS Q
LDA ENDBUF ; REG'S TO ENDBUF
STA QSTART
LDA ENDBUF+1
STA QSTART+1
;
ADDQST CPX #0
BEQ QSTDON
DEX
DEX
CLC
LDA QSTART
ADC QRGCNT,X
STA QSTART
LDA QSTART+1
ADC QRGCNT+1,X
STA QSTART+1
JMP ADDQST
QSTDON LDX TEMP
RTS
;
; GET Q REGISTER #*2 IN QRGNUM
GTQREG JSR GTCMCH
GTQRG1 JSR DIGCHK ; 0..9?
BCS QREGOK
BMI IQNJMP
SBC #6 ; A..Z?
CMP #10
BCC IQNJMP
CMP #36
BCC QREGOK
IQNJMP JMP IQNERR
;
QREGOK ASL A
TAX
RTS
;
GTQRG2 CMP #'* ; FILE SPEC BUFFER?
BNE GTQRG3
LDX #74 ; YES- CALL IT Q REG 37
RTS
;
GTQRG3 CMP #'_
BNE GTQRG1
LDX #76 ; YES- CALL IT Q REG 38
RTS
;
PUSHQ JSR GTQREG ; [q COMMAND
JSR GETQST
CLC ; COMPUTE # BYTES TO USE
LDA QRGCNT,X
ADC #4
STA TEMP
LDA QRGCNT+1,X
ADC #0
STA TEMP+1
;
SEC ; POINT TO NEW TOP OF STACK
LDA MAXEND
SBC TEMP
STA TMPTR1
LDA MAXEND+1
SBC TEMP+1
STA TMPTR1+1
;
LDA TMPTR1 ; ENOUGH ROOM?
SBC BUFEND
LDA TMPTR1+1
SBC BUFEND+1
BCS PUSHQ1
ERR5 LDA #5 ; NO- ?MEM ERROR
JMP ERROR
;
PUSHQ1 LDA TMPTR1 ; SAVE NEW MAXEND
STA MAXEND
LDA TMPTR1+1
STA MAXEND+1
;
LDA QRGCNT,X ; PUSH LENGTH
JSR PUSHIT
LDA QRGCNT+1,X
JSR PUSHIT
LDA QVAL,X ; PUSH NUMERIC
JSR PUSHIT
LDA QVAL+1,X
JSR PUSHIT
BEQ PSHDON
;
PUSHQ2 LDA (QSTART),Y ; PUSH TEXT
INC QSTART
BNE PUSHQ3
INC QSTART+1
PUSHQ3 JSR PUSHIT
BNE PUSHQ2
;
PSHDON INC QDEPTH
BNE PSHDN1
INC QDEPTH+1
PSHDN1 JMP NXTCMD
;
PUSHIT JSR INCTM1
STA (TMPTR1),Y
SEC ; DEC COUNT
LDA TEMP
SBC #1
STA TEMP
LDA TEMP+1
SBC #0
STA TEMP+1
ORA TEMP
RTS
;
POPQ JSR GTQREG ; ]q COMMAND
LDA QDEPTH ; ANYTHING ON STACK?
ORA QDEPTH+1
BNE POPQ1
LDA GOTCLN ; NO- :]q?
BNE POPRT1 ; YES- RETURN -1
LDA #41 ; NO- ?CPQ ERROR
JMP ERROR
;
POPRT1 TYA
JMP SETVAL
;
POPQ1 JSR GETQST ; FIND START
JSR QBFPTR ; POINT BUFPTR THERE
JSR QZERO ; ZERO IT
;
LDA MAXEND ; POINT TO TOP OF STACK
STA TXTPTR
LDA MAXEND+1
STA TXTPTR+1
;
JSR POPIT ; GET LENGTH
STA CHRCNT
JSR POPIT
STA CHRCNT+1
;
SEC ; ENOUGH ROOM?
LDA MAXEND
SBC CHRCNT
PHA
LDA MAXEND+1
SBC CHRCNT+1
STA TEMP+1
;
PLA
SBC BUFEND
LDA TEMP+1
SBC BUFEND+1
BCS POPQ2
JMP ERR5 ; NO- ERROR
;
POPQ2 JSR POPIT ; YES- POP NUMERIC
STA QVAL,X
JSR POPIT
STA QVAL+1,X
LDA CHRCNT ; INSERT SIZE
STA QRGCNT,X
LDA CHRCNT+1
STA QRGCNT+1,X
;
CLC ; UPDATE MAXEND
LDA TXTPTR
ADC CHRCNT
STA MAXEND
LDA TXTPTR+1
ADC CHRCNT+1
STA MAXEND+1
JSR POPIT ; POINT TXTPTR TO TEXT
SEC ; INTEXT ADDS CHRCNT TO TXTPTR
LDA TXTPTR
SBC CHRCNT
STA TXTPTR
LDA TXTPTR+1
SBC CHRCNT+1
STA TXTPTR+1
;
JSR INTEXT ; INSERT TEXT
JSR RESPTR ; RESTORE POINTER
LDA QDEPTH ; DEC QDEPTH
BNE POPQ3
DEC QDEPTH+1
POPQ3 DEC QDEPTH
;
LDA GOTCLN ; :]q?
BEQ POPQ4
JMP NOTZRO ; YES- RETURN -1
;
POPQ4 JMP NXTCMD ; NO- NO VALUE RETURNED
;
POPIT INC TXTPTR ; POP CHAR FROM STACK
BNE POPIT1
INC TXTPTR+1
POPIT1 LDA (TXTPTR),Y
RTS
;
FCMD JSR GTCMCH ; GET NEXT CHAR
CMP #'R
BNE NOTFR
JSR FRCMD ; FR COMMAND
JSR FNDESC
JSR INSERT
JMP PROCMD
;
NOTFR CMP #'S
BNE NOTFS
TYA
FSCMD STA PAGSRH
JSR CHKARG ; FS COMMAND
JSR FNDESC
JSR SEARCH ; SEARCH FOR STRING
PHA ; SAVE STATUS
STY CHRCNT
STY CHRCNT+1
JSR SAVPTR ; FIND CLOSING $
JSR CHKCL1
PLA ; SUCCEEDED?
PHA
BEQ FSFAIL
LDA CHRCNT
PHA
LDA CHRCNT+1
PHA
JSR FRCMD ; DELETE SEARCHED CHARS
SEC ; FIX TXTPTR
LDA TXTPTR
SBC CHRCNT
STA TXTPTR
LDA TXTPTR+1
SBC CHRCNT+1
STA TXTPTR+1
PLA
STA CHRCNT+1
PLA
STA CHRCNT
JSR INSERT ; NOW INSERT NEW TEXT
JMP SRHFND
;
FSFAIL JMP SRHEND
;
FRCMD SEC ; DO -<STRSIZ>C
LDA BUFPTR
SBC STRSIZ
STA CHRPTR
LDA BUFPTR+1
SBC STRSIZ+1
STA CHRPTR+1
;
JSR CHKPTR
BEQ FROK
JMP DTBERR
FROK LDA ENDLIM
STA BUFPTR
LDA ENDLIM+1
STA BUFPTR+1
LDA STRSIZ ; DO <STRSIZ>D
STA CHRCNT
LDA STRSIZ+1
STA CHRCNT+1
JSR DELETE
RTS
;
NOTFS CMP #'N
BNE NOTFN
LDA #1 ; FN COMMAND
JMP FSCMD
;
NOTFN CMP #'_
BNE IFCERR
LDA #$FF ; F_ COMMAND
JMP FSCMD
;
IFCERR LDA #14 ; ?IFC ERROR
JMP ERROR
;
CHKCLN JSR FNDESC ; CHECK FOR STEXT$;
CHKCL1 LDA (CMDPTR),Y ; NEXT CHAR = ';'?
CMP #';
BNE NOTSEM
INC GOTCLN ; YES- TREAT AS :S CMD
NOTSEM RTS
;
; Takes char in A, saves in TSTCHR and returns in A:
; BIT 7 = Upper case A-Z
; BIT 6 = Lower case A-Z
; BIT 5 = Numeric 0-9
;
CHRTST STA TSTCHR
CMP #'0
BCS CHTST1
CHRTN TYA ; NONE OF ABOVE- RETURN 0
RTS
;
CHTST1 CMP #$3A ; NUMERIC?
BCS CHTST2
LDA #$20 ; YES
RTS
;
CHTST2 CMP #'A ; UPPER CASE ALPHA?
BCC CHRTN
CMP #'[
BCS CHTST3
LDA #$80 ; YES
RTS
;
CHTST3 CMP #'a ; LOWER CASE ALPHA?
BCC CHRTN
CMP #$7B
BCS CHRTN
LDA #$40 ; YES
RTS
;
;
; SEARCH FOR CHRCNT CHARS POINTED TO BY SRHPTR,
; FROM POINTER TO END (BEGINNING) OF BUFFER,
; ABS(LSTARG) TIMES IN SGN(LSTARG) DIRECTION.
SEARCH STY NOFAIL
LDA #$FF
STA BOUNDS
STA BOUNDS+1
LDA GOTLO ; ARGS OF FORM M,N?
BEQ SRHOK
;
LDA LOARG ; YES- 0,NS?
ORA LOARG+1
BNE BNDSRH
LDA BUFPTR ; YES- RESTORE BUFPTR ON
STA OLDPTR ; SEARCH FAILURE
LDA BUFPTR+1
STA OLDPTR+1
INC NOFAIL
BNE SRHOK
;
BNDSRH SEC ; NO- BOUNDED SEARCH
LDA LOARG+1 ; GET ABS(LOARG)-1
BMI NEGBND ; NEGATIVE
STA BOUNDS+1
LDA LOARG
SBC #1
STA BOUNDS
BCS SRHOK
DEC BOUNDS+1
JMP SRHOK
;
NEGBND EOR #$FF
STA BOUNDS+1
LDA LOARG
EOR #$FF
STA BOUNDS
;
SRHOK LDA CHRCNT+1 ; >255 CHARS?
BEQ CNTOK
STLERR LDA #13 ; NO- ?STL ERROR
JMP ERROR
;
CNTOK LDX #0
LDA CHRCNT ; SEARCH STRING GIVEN?
STA SRHLEN ; SAVE LENGTH OF SEARCH
BNE SAVSRH
JMP GOTST1
;
SAVSRH LDA SRHLEN
BNE SAVSR1
GOTST0 JMP GOTSTR
;
SAVSR1 JSR GETSRH ; SAVE SEARCH STRING
CMP #'^ ; CONTROL CHAR CONVERSION?
BNE NOCTL
LDA SRHLEN
BEQ NOCTL1
LDA EDFLAG ; YES IF EDFLAG=0 OR -1
CMP EDFLAG+1
BNE NOCTL1
CMP #0
BEQ MAKCTL
CMP #$FF
BNE NOCTL1
;
MAKCTL LDA (TXTPTR),Y ; CHAR AFTER ^ ALPHA?
JSR CHRTST
STA TEMP+1
LDA TSTCHR
BIT TEMP+1
SEC
BMI MKCTL1 ; YES- UPPER CASE
BVC NOCTL2
;
SBC #$20 ; LOWER CASE
MKCTL1 SBC #$40
INY
DEC SRHLEN
;
NOCTL CMP #$11 ; ^Q?
BNE NOCTL0
CPY SRHLEN ; YES- MAKE SURE CHAR AFTER ^Q
BEQ NOCTL2
JSR GETSRH ; YES- TREAT NEXT CHAR LITERALLY
JMP NOCTL2
;
NOCTL1 LDA #'^
NOCTL0 CMP #5 ; ^E?
BEQ CTRLE
CMP #$16 ; ^V?
BEQ CTRLV
CMP #$17 ; ^W?
BEQ CTRLW
NOCTL2 STA SRHBUF,X ; ADD TO BUFFER
INX
BEQ STLERR
BNE SAVSRH
;
CTRLV LDA #$80 ; CONVERT NEXT CHAR TO LOWER CASE
BNE CVCASE
;
CTRLW LDA #$40 ; CONVERT NEXT CHAR TO UPPER CASE
CVCASE STA TEMP+1
LDA (TXTPTR),Y ; NEXT CHAR PROPER CASE?
JSR CHRTST
AND TEMP+1
BNE CVCAS1
;
LDA #$16 ; NO- CONVERT BACK TO ^V OR ^W
ASL TEMP+1
BCS NOCTL2
ADC #1
BNE NOCTL2
;
CVCAS1 JSR GETSRH
LDA TSTCHR ; YES- CONVERT CASES
EOR #$20
BNE NOCTL2
;
GETSRH LDA (TXTPTR),Y ; GET CHAR FROM SEARCH BUFFER
INY
DEC SRHLEN
RTS
;
CTRLE LDA (TXTPTR),Y ; ^EQn?
CMP #'Q
BEQ CTRLE1
CMP #'q
BEQ CTRLE1
LDA #5 ; NO
BNE NOCTL2
;
CTRLE1 JSR GETSRH ; YES- ADD Q REG n TO
BNE CTRLE0
JMP IQNERR
;
CTRLE0 JSR GETSRH ; SEARCH BUFFER
STX TEMP1
STY TEMP1+1
LDY #0
JSR GTQRG2
JSR GTQST0 ; POINT TO START OF Q REG
LDA QRGCNT+1,X
BNE STLJMP
LDA QRGCNT,X
STA CHRCNT
LDX TEMP1
CMP #0
BEQ CTRLE3
;
CTRLE2 LDA (QSTART),Y
STA SRHBUF,X
INY
INX
BEQ STLJMP
DEC CHRCNT
BNE CTRLE2
;
CTRLE3 LDY TEMP1+1 ; CONTINUE WITH SEARCH STRING
JMP SAVSRH
;
STLJMP JMP STLERR
;
GOTSTR LDY #0
STX LSTCNT
MOVSRH LDA SRHBUF,X ; MOVE SEARCH STRING
STA LSTSRH,X
DEX
BPL MOVSRH
;
GOTST1 LDA LSTCNT
STA STRSIZ
STY STRSIZ+1
BNE GOTST2 ; 0 LENGTH STRING? (^EQn - Qn EMPTY)?
JMP SRHDN1 ; YES- ALWAYS SUCCESS
;
GOTST2 LDA LSTARG
STA SRHCNT
LDA LSTARG+1
STA SRHCNT+1
JSR GETEND
;
LDA SRHCNT+1 ; FORWARD SEARCH?
BMI NEGJMP
ORA SRHCNT ; YES. CHECK FOR 0 ARG
BNE SRHFWD
JMP ISAERR ; YES- ERROR
;
NEGJMP JMP SRHNEG
;
SRHFWD SEC ; CHECK FOR END OF BUF
LDA ENDBUF
SBC BUFPTR
LDA ENDBUF+1
SBC BUFPTR+1
BCC PSFAIL
;
JSR STRCMP ; COMPARE STRINGS
BEQ POSFND ; FOUND MATCH
SRHFD1 SEC ; DEC BOUND COUNT
LDA BOUNDS
SBC #1
STA BOUNDS
LDA BOUNDS+1
SBC #0
BCC PSFAIL
STA BOUNDS+1
;
JSR INCPTR
JMP SRHFWD
;
POSFND SEC ; DONE WITH SEARCH?
LDA SRHCNT
SBC #1
STA SRHCNT
LDA SRHCNT+1
SBC #0
STA SRHCNT+1
ORA SRHCNT
BEQ SRHDON
BNE SRHFD1 ; NO- FIND ANOTHER MATCH
;
PSFAIL LDX PAGSRH ; SEARCH FAILURE- ACROSS PAGES?
BEQ SRFAIL ; NO- SEARCH FAILURE
LDA GOTEOF ; YES- END OF INPUT FILE?
BEQ NXTPAG
SRPGFL JSR SRHUP ; YES- SEARCH FAILURE
;
SRFAIL LDA NOFAIL ; 0,NS?
BNE SRFL1
JSR BPTR ; NO- MOVE TO TOP OF BUFFER
TYA ; SEARCH FAILURE
RTS ; RETURN = 0
;
SRFL1 LDA OLDPTR ; YES- RESTORE BUFPTR
STA BUFPTR
LDA OLDPTR+1
STA BUFPTR+1
TYA
RTS
;
NXTPAG JSR BPTR ; NO- GET NEXT PAGE
DEX
BNE YNKSRH
JSR PAGOUT
JSR ZERPAG
YNKSRH JSR YANK
JSR GETEND ; GET NEW BUFFER END
JMP SRHFWD ; CONTINUE SEARCH
;
SRHDON LDA TMPTR1 ; SEARCH SUCCEEDED-
STA BUFPTR ; SET BUFPTR AND RETURN
LDA TMPTR1+1
STA BUFPTR+1
LDX PAGSRH ; SEARCH ACROSS PAGE?
BEQ SRHDN1
JSR SRHUP ; YES- RAISE HEADS
SRHDN1 LDA #$FF ; YES- RETURN = -1
RTS
;
SRHUP DEX ; RAISE HEADS
BNE YANKUP
JSR OUTUP
YANKUP JMP INUP
;
SRHNEG SEC ; NEGATIVE SEARCH
LDA BUFPTR ; AT START OF BUFFER?
SBC BUFST
LDA BUFPTR+1
SBC BUFST+1
BCC SRFAIL
;
SEC ; DEC BOUNDS COUNT
LDA BOUNDS
SBC #1
STA BOUNDS
BCS SRHNG0
DEC BOUNDS+1
;
SRHNG0 JSR DECPTR
JSR STRCMP ; COMPARE STRINGS
BEQ SRHNG1
;
SRHNG2 LDA BOUNDS
ORA BOUNDS+1
BEQ SRFAIL
BNE SRHNEG
;
SRHNG1 INC SRHCNT ; FOUND MATCH
BNE SRHNG2
INC SRHCNT+1
BNE SRHNG2
BEQ SRHDON
;
ENDCHK SEC ; TMPTR1>ENDBUF?
LDA ENDBUF
SBC TMPTR1
LDA ENDBUF+1
SBC TMPTR1+1
RTS
;
SRHERR LDX #0 ; PRINT ERROR MESSAGE
ERROUT LDA SRHMES,X
BEQ MESDON
JSR TTYOUT
INX
BNE ERROUT
;
MESDON TAX
INC LSTERR
JSR CHKITR ; ERROR DURING ITERATION?
BCC NOTITR
ITRMES LDA SRHMS2,X ; YES- PRINT ITER MSG
BEQ MS2DON
JSR TTYOUT
INX
BNE ITRMES
MS2DON JMP GETCMD
;
NOTITR LDA SRHMS1,X ; NO- PRINT SEARCH STRNG
BEQ OUTSTR
JSR TTYOUT
INX
BNE NOTITR
;
OUTSTR CPY LSTCNT
BEQ OUTST1
LDA LSTSRH,Y
JSR TTYOUT
INY
BNE OUTSTR
;
OUTST1 LDY #0
LDA #'" ; PRINT CLOSING QUOTE
JSR CONOUT
JMP GETCMD
;
; COMPARE LSTCNT CHARS AFTER BUFPTR WITH SEARCH BUFFER.
STRCMP LDA LSTCNT
STA SRHSIZ
LDA BUFPTR
STA TMPTR1
LDA BUFPTR+1
STA TMPTR1+1
LDX #0
;
CHRCMP DEC SRHSIZ
LDA LSTSRH,X ; COMPARE CHARS
CMP #$18 ; ^X?
BNE NOTCTX ; YES- AUTOMATIC MATCH
NXTJMP JMP NXTCMP
;
NOTCTX STY NEGATE
CMP #$0E ; ^N?
BNE NOTCTN
JSR GTSRCH ; YES- NEXT CHAR SPECIAL?
BCC NTCTX1
JMP CHCMP0 ; NO CHAR AFTER ^N!
;
NTCTX1 CMP #$13 ; ^S?
BEQ SPCLN
CMP #5 ; ^E?
BEQ SPCLN
CMP (TMPTR1),Y ; NO- MAKE SURE NO MATCH
BNE NXTJMP
JMP NOTEQL
;
SPCLN DEC NEGATE ; SPECIAL- NEGATE NEXT RESULT
;
NOTCTN CMP #$13 ; ^S?
BNE NOTCTS
LDA (TMPTR1),Y ; YES- SEPARATOR?
JSR CHRTST
BEQ SJMP ; YES
NJMP JMP NMATCH
;
NOTCTS CMP #5 ; ^E?
BNE NOCTLE
JSR GTSRCH ; YES- GET NEXT CHAR
BCC NOCTS1
JMP CHCMP0 ; NO CHAR AFTER ^E!
;
NOCTS1 CMP #'A
BNE NOTEA
LDA #$C0 ; ALPHA?
TYPTST STA TEMP+1
LDA (TMPTR1),Y
JSR CHRTST
AND TEMP+1
BEQ NJMP
SJMP JMP SMATCH
;
NOCTLE STA TSTCHR ; PERFORM COMPARISON
CMP #$60 ; IF XFLAG=0, MAKE BOTH
BCC CASTST ; LOOK UPPER CASE
LDA XFLAG
ORA XFLAG+1
BNE CASTST
LDA TSTCHR ; MAKE UPPER CASE
EOR #$20
STA TSTCHR
;
CASTST LDA (TMPTR1),Y
PHA
CMP #$60
BCC CSTST1
LDA XFLAG
ORA XFLAG+1
BNE CSTST1
PLA ; MAKE UPPER CASE
EOR #$20
PHA
;
CSTST1 PLA ; NOW COMPARE
CMP TSTCHR
JMP CHCMP1
;
NOTEA CMP #'C
BNE NOEC
LDA (TMPTR1),Y ; RAD40?
CMP #'.
BEQ SJMP
CMP #'_
BEQ SJMP
GOTER LDA #$E0
BNE TYPTST
;
NOEC CMP #'D
BNE NOTED
LDA #$20 ; DIGIT?
BNE TYPTST
;
NOTED CMP #'R ; ALPHA OR DIGIT?
BEQ GOTER
;
CMP #'L
BNE NOTEL
LDA (TMPTR1),Y ; LF, VT, FF?
CMP #$0A
BCC NMATCH
CMP #$0D
BCS NMATCH
BCC SMATCH
;
NOTEL CMP #'X
BEQ NXTCMP ; ANY MATCHES
;
CMP #'G
BNE NOTEG
JSR GTSRCH ; ^EGn
BCC GOTEGN
JMP IQNERR ; NO CHAR AFTER ^EG!
;
GOTEGN STX TEMPX
JSR GTQRG2 ; YES- GET n
JSR GTQST0
LDA QRGCNT,X
LDX TEMPX
STA QRGTMP
CMP #0
BEQ NMATCH
;
EGTEST LDA (QSTART),Y ; CHAR IN Q REG?
CMP (TMPTR1),Y
BEQ SMATCH
DEC QRGTMP
BEQ NMATCH
INC QSTART
BNE EGTEST
INC QSTART+1
BNE EGTEST
;
NOTEG CMP #'S
BNE NOTES
STY QRGTMP ; ^ES
GOTES LDA (TMPTR1),Y ; SEARCH FOR STRING OF SPACES
CMP #$20 ; OR TABS
BEQ GOTES1
CMP #9
BNE NOESCH
;
GOTES1 STA QRGTMP ; FLAG WE GOT ONE
JSR INCTM1
JMP GOTES
;
NOTES DEX ; JUST PLAIN ^E
INC SRHSIZ
LDA #5
BNE CHCMP0
;
NOESCH LDA QRGTMP ; DID WE FIND ONE?
BEQ NEGTST ; NO
JSR DECTM1 ; YES- FIX POINTER
;
SMATCH LDA #$FF ; MATCH- CHECK FOR NEGATE
BNE NEGTST
;
NMATCH LDA #0
NEGTST EOR NEGATE
BEQ NOTEQL
BNE NXTCMP
;
CHCMP0 CMP (TMPTR1),Y
CHCMP1 BNE NOTEQL
NXTCMP JSR INCTM1
INX
LDA SRHSIZ
BEQ STREQL
JMP CHRCMP
;
STREQL JSR ENDCHK ; STRINGS EQUAL
BCC NOTEQL ; IF SEARCHED PAST END, NO MATCH
LDY #0 ; RETURN = 0
RTS
;
NOTEQL LDY #0 ; STRINGS NOT EQUAL
LDA #1 ; RETURN <> 0
RTS
;
GTSRCH CPY SRHSIZ ; ANOTHER CHAR IN BUFFER?
BEQ GTSRH2 ; NO
INX ; YES- GET IT
DEC SRHSIZ
LDA LSTSRH,X
CMP #$60 ; LOWER CASE?
BCC GTSRH1
EOR #$20 ; YES- MAKE UPPER
CLC ; FLAG NORMAL RETURN
GTSRH1 RTS
;
GTSRH2 SEC ; NO CHAR AVAILABLE!
RTS
;
TTYIN LDA EIOPEN ; GET CHAR
BNE TTYIN2 ; GET FROM INDIRECT BUFFER
TTYIN0 LDY TINSIZ ; SOMETHING IN BUFFER?
BNE TTYIN1
JMP CONIN ; NO- GET FROM CONSOLE
;
TTYIN1 STX TEMPX1
LDA TINBUF ; GET CHAR FROM BUFFER
PHA
LDX #0
TBFMOV LDA TINBUF+1,X ; MOVE REMAINDER OF BUFFER DOWN
STA TINBUF,X
INX
DEY
BNE TBFMOV
PLA
DEC TINSIZ
LDX TEMPX1
RTS
;
TTYIN2 JSR TINTST ; ANYTHING IN BUFFER?
BCC TTYIN0 ; NO- GET CHAR FROM CONSOLE
LDA (EIPTR),Y ; YES- GET FROM BUFFER
INC EIPTR
BNE TTYIN3
INC EIPTR+1
TTYIN3 RTS
;
TINTST LDA EIPTR ; RETURN CARRY CLEAR IF BUFFER EMPTY
CMP EIEND ; BUFFER EMPTY?
BNE TNTST2
LDA EIPTR+1
CMP EIEND+1
BNE TNTST2
;
LDA EILEN ; YES- ANYTHING LEFT?
BNE TNTST1
TINMT STY EIOPEN ; NO- CLOSE INDIRECT FILE
CLC ; FLAG NOTHING LEFT
RTS
;
TNTST1 CMP EISIZE ; YES- GET UP TO EISIZE BLOCKS
BCC STEISZ
LDA EISIZE
STEISZ STA EIBLCT
LDA EIUNIT
ORA #$40
TAX
JSR EIHLR
EIBLCT .BYTE 0
.WORD EIBUF
EIPAGE .WORD 0
JMP INERR
;
SEC ; UPDATE REMAINDER
LDA EILEN
SBC EIBLCT
STA EILEN
LDA EIST ; RESET POINTER
STA EIPTR
LDA EIST+1
STA EIPTR+1
CLC ; UPDATE CURRENT BLOCK
LDA EIPAGE
ADC EIBLCT
STA EIPAGE
BCC TNTST2
INC EIPAGE+1
;
TNTST2 LDA (EIPTR),Y ; GET CHAR FROM INDIRECT BUFFER
AND #$7F
CMP #26 ; ^Z?
BEQ TINMT ; YES- CLOSE FILE
SEC ; FLAG SOMETHING LEFT
RTS
;
TTYOUT PHA ; OUTPUT CHAR
LDA ETFLAG ; USE IMAGE MODE?
LSR A
PLA
BCC TOUT0
JMP BINOUT ; YES
;
TOUT0 CMP #$40 ; CHECK CASE FOR EU
BCC TOUT3
BIT EUFLAG
BMI TOUT3
CMP #$60 ; UPPER CASE?
BCS TOUT1
CPY EUFLAG
BNE FLGCHR
CPY EUFLAG+1
BEQ TOUT3
FLGCHR PHA
LDA #''
JSR CONOUT
PLA
TOUTUC AND #$5F ; MAKE UPPER CASE
TOUT3 JMP CONOUT
;
TOUT1 CPY EUFLAG
BNE TOUTUC
CPY EUFLAG+1
BNE TOUTUC
BEQ FLGCHR
;
;
; COMMAND DISPATCH TABLE
JMPTBL .WORD BADCMD ; ^@
.WORD CARETA ; ^A
.WORD CARETB ; ^B
.WORD CARETC ; ^C
.WORD DRADIX ; ^D
.WORD CARETE ; ^E
.WORD BADCMD ; ^F
.WORD BADCMD ; ^G
.WORD HRADIX ; ^H
.WORD TABCMD ; TAB
.WORD NXTCMD ; LF
.WORD BADCMD ; ^K
.WORD BADCMD ; ^L
.WORD NXTCMD ; RETURN
.WORD CARETN ; ^N
.WORD ORADIX ; ^O
.WORD BADCMD ; ^P
.WORD CARETQ ; ^Q
.WORD BADCMD ; ^R
.WORD CARETS ; ^S
.WORD CARETT ; ^T
.WORD CARETU ; ^U
.WORD BADCMD ; ^V
.WORD BADCMD ; ^W
.WORD CTXCMD ; ^X
.WORD CARETY ; ^Y
.WORD CARETZ ; ^Z
.WORD PROCMD ; ESCAPE
.WORD BADCMD ; ^\
.WORD BADCMD ; ^]
.WORD ASCCMD ; ^^
.WORD CMPCMD ; ^_
.WORD NXTCMD ; SPACE
.WORD TAGCMD ; !
.WORD QUOCMD ; "
.WORD NEWOP ; #
.WORD HEXCMD ; $
.WORD PERCMD ; %
.WORD NEWOP ; &
.WORD NXTCMD ; '
.WORD LPAR ; (
.WORD RPAR ; )
.WORD NEWOP ; *
.WORD NEWOP ; +
.WORD COMMA ; ,
.WORD NEWOP ; -
.WORD DOTVAL ; .
.WORD NEWOP ; /
.WORD DIGIT ; 0
.WORD DIGIT ; 1
.WORD DIGIT ; 2
.WORD DIGIT ; 3
.WORD DIGIT ; 4
.WORD DIGIT ; 5
.WORD DIGIT ; 6
.WORD DIGIT ; 7
.WORD DIGIT ; 8
.WORD DIGIT ; 9
.WORD CLNCMD ; :
.WORD SEMCMD ; ;
.WORD ITERST ; <
.WORD EQUAL ; =
.WORD ITREND ; >
.WORD TRACE ; ?
.WORD ATCMD ; @
.WORD ACMD ; A
.WORD BVALUE ; B
.WORD CMOVE ; C
.WORD DELCMD ; D
.WORD ECMD ; E
.WORD FCMD ; F
.WORD GCMD ; G
.WORD HVALUE ; H
.WORD INSCMD ; I
.WORD JMOVE ; J
.WORD KILL ; K
.WORD LMOVE ; L
.WORD MCMD ; M
.WORD NCMD ; N
.WORD OCMD ; O
.WORD PCMD ; P
.WORD QCMD ; Q
.WORD RMOVE ; R
.WORD SRHCMD ; S
.WORD TYPE ; T
.WORD UCMD ; U
.WORD VERIFY ; V
.WORD PROCMD ; W
.WORD XCMD ; X
.WORD YCMD ; Y
.WORD ZVALUE ; Z
.WORD PUSHQ ; [
.WORD BKSLSH ; \
.WORD POPQ ; ]
.WORD UPAROW ; ^
.WORD YSRCH ; _
;
; **** ERROR PRINTOUT ROUTINE ***
;
ERROR LDY #0
STY EIOPEN ; STOP ANY INDIRECT FILE
STA TEMP
ASL A
TAX
STY CNCTLO
LDA #'? ; PRINT '?ERR'
JSR CONOUT
LDA ERRTBL,X ; GET RAD40 ERROR MES
STA RADWRD
LDA ERRTBL+1,X
STA RADWRD+1
;
JSR USR ; CONVERT TO ASCII
.BYTE RD2ASC
.WORD RADWRD
.WORD CHAR
;
LDX #0 ; NOW PRINT ERROR MSG
PRTERR LDA CHAR,X
JSR CONOUT
INX
CPX #3
BNE PRTERR
INC LSTERR
;
LDA EHFLAG ; PRINT EXTENDED MESAGE?
BEQ PRTEXT
JMP GETCMD
;
PRTEXT LDA #'- ; PRINT '- 'EXTENDED MSG
JSR CONOUT
LDA #$20
JSR CONOUT
LDA EXTPTR ; FIND EXTENDED MESSAGE
STA TEMPTR
LDA EXTPTR+1
STA TEMPTR+1
LDX TEMP
BEQ EXTFND
;
FNDEXT CLC
LDA (TEMPTR),Y
ADC TEMPTR
STA TEMPTR
BCC NXTEXT
INC TEMPTR+1
;
NXTEXT DEX
BNE FNDEXT
;
EXTFND LDA (TEMPTR),Y ; GET COUNT
TAX
DEX
EXTOUT INY ; PRINT EXTENDED MESSAGE
LDA (TEMPTR),Y
JSR TTYOUT
DEX
BNE EXTOUT
LDY #0
JMP GETCMD
;
EXTPTR .WORD EXTMES
;
ERRTBL .RAD40 'ILL' ; ILLEGAL COMMAND
.RAD40 'ILN' ; ILLEGAL NUMBER
.RAD40 'IEX' ; ILLEGAL EXPRESSION
.RAD40 'NAE' ; NO ARG BEFORE =
.RAD40 'DIV' ; DIVIDE BY 0
.RAD40 'MEM' ; MEMORY OVERFLOW
.RAD40 'IIA' ; ILLEGAL INSERT ARG
.RAD40 'POP' ; POINTER OFF PAGE
.RAD40 'PDO' ; PUSH-DOWN LIST OVERFLOW
.RAD40 'BNI' ; > NOT IN ITERATION
.RAD40 'DTB' ; DELETE TOO BIG
.RAD40 'UTC' ; UNTERMINATED CMD
.RAD40 'ISA' ; ILLEGAL SEARCH ARG
.RAD40 'STL' ; STRING TOO LONG
.RAD40 'IFC' ; ILLEGAL F CHAR
.RAD40 'SNI' ; ; NOT IN ITERATION
.RAD40 'NAS' ; NO ARG BEFORE ;
.RAD40 'IQR' ; ILLEGAL Q REGISTER
.RAD40 'NAC' ; NO ARG BEFORE ,
.RAD40 'OUT' ; OUTPUT ERROR
.RAD40 'IFN' ; ILLEGAL FILE NAME
.RAD40 'DEV' ; ILLEGAL DEVICE
.RAD40 'DIR' ; DIRECTORY ERROR
.RAD40 'IEC' ; ILLEGAL E CHAR
.RAD40 'NFO' ; NO FILE FOR OUTPUT
.RAD40 'OFO' ; OUTPUT FILE OPEN
.RAD40 'IPC' ; ILLEGAL PAGE COUNT
.RAD40 'FNF' ; FILE NOT FOUND
.RAD40 'NFI' ; NO FILE FOR INPUT
.RAD40 'EOF' ; END OF FILE
.RAD40 'INP' ; INPUT ERROR
.RAD40 'YCA' ; Y COMMAND ABORTED
.RAD40 'NAU' ; NO ARG BEFORE U
.RAD40 'XAB' ; EXECUTION ABORTED
.RAD40 'FUL' ; OUTPUT DEVICE FULL
.RAD40 'ICN' ; ILLEGAL CONDITIONAL NESTING
.RAD40 'IIN' ; ILLEGAL ITERATION NESTING
.RAD40 'NAQ' ; NO ARGUMENT BEFORE "
.RAD40 'IQC' ; ILLEGAL CHAR AFTER "
.RAD40 'TAG' ; ILLEGAL TAG
.RAD40 'IHC' ; ILLEGAL HEX CHAR
.RAD40 'CPQ' ; CAN'T POP Q REGISTER
.RAD40 'MRP' ; MISSING )
.RAD40 'ERP' ; EXTRA )
.RAD40 'NAP' ; NO ARG BEFORE )
;
; EXPANDED ERROR MESSAGES
EXTMES .BYTE 16,'Illegal command'
.BYTE 15,'Illegal number'
.BYTE 19,'Illegal expression'
.BYTE 16,'No arg before ='
.BYTE 12,'Divide by 0'
.BYTE 16,'Memory overflow'
.BYTE 19,'Illegal insert arg'
.BYTE 17,'Pointer off page'
.BYTE 24,'Push-down list overflow'
.BYTE 19,'> not in iteration'
.BYTE 15,'Delete too big'
.BYTE 21,'Unterminated command'
.BYTE 19,'Illegal search arg'
.BYTE 16,'String too long'
.BYTE 20,'Illegal F character'
.BYTE 19,'; not in iteration'
.BYTE 16,'No arg before ;'
.BYTE 19,'Illegal Q-register'
.BYTE 16,'No arg before ,'
.BYTE 13,'Output error'
.BYTE 18,'Illegal file name'
.BYTE 15,'Invalid device'
.BYTE 16,'Directory error'
.BYTE 20,'Illegal E character'
.BYTE 19,'No file for output'
.BYTE 25,'Output file already open'
.BYTE 19,'Illegal page count'
.BYTE 15,'File not found'
.BYTE 18,'No file for input'
.BYTE 12,'End of file'
.BYTE 12,'Input error'
.BYTE 18,'Y command aborted'
.BYTE 16,'No arg before U'
.BYTE 18,'Execution aborted'
.BYTE 17,'Output file full'
.BYTE 28,'Illegal conditional nesting'
.BYTE 26,'Illegal iteration nesting'
.BYTE 16,'No arg before "'
.BYTE 21,'Illegal char after "'
.BYTE 12,'Illegal tag'
.BYTE 17,'Illegal hex char'
.BYTE 16,'Can''t pop Q-reg'
.BYTE 10,'Missing )'
.BYTE 8,'Extra )'
.BYTE 16,'No arg before )'
;
TECEND .BYTE 0 ; END OF TECO
.END TECO
More information about the Comp.sources.unix
mailing list