perm filename SAIPTY.FAI[S,AIL]1 blob
sn#102586 filedate 1974-05-22 generic text, type T, neo UTF8
COMPIL(PTY,<PTYGET,PTYREL,PTIFRE,PTOCNT,PTCHRW,PTCHRS
ENTINT <PTOCHS,PTOCHW,PTOSTR,BACKUP,LODED,PTYALL,PTYSTR,PTYIN>
ENTINT <PTYSTL,PTYGTL>>
,<SAVE,RESTR,X11,X22,X33,INSET,CAT,STRNGC,GOGTAB,BRKMSK,.SKIP.>
,<PTY ROUTINES>)
OPDEF PTYUUO [711B8]
HERE (PTYGET)
SETOM .SKIP.
MOVEI A,0
PTYUUO A
SETZM .SKIP.
POPJ P,
HERE (PTYREL)
POP P,(P)
EXCH A,(P)
PTYUUO 1,A
POP P,A
JRST @2(P)
HERE (PTYGTL) PUSH P,(P) ;ANOTHER COPY OF RETURN ADDRESS.
PTYUUO 13,-2(P);POINT AT PTY LINE NUMBER
MOVE A,-1(P) ;RESULT.
SUB P,X33
JRST @3(P) ;AND RETURN.
HERE (PTYSTL) PTYUUO 14,-2(P);POINTED AT LINE NUMBER!
SUB P,X33
JRST @3(P)
HERE (PTIFRE)
MOVE TEMP,[PTYUUO 2,0]
JRST %PTY1
HERE (PTOCNT)
SKIPA TEMP,[PTYUUO 3,0]
HERE (PTCHRW)
MOVE TEMP,[PTYUUO 5,0]
%PTY1: POP P,(P)
EXCH 0,(P)
XCT TEMP
POP P,0
JRST @2(P)
HERE (PTCHRS)
POP P,(P)
EXCH 0,(P)
PTYUUO 4,0
MOVNI A,1
POP P,0
JRST @2(P)
HERE (PTOCHS)
SKIPA TEMP,[PTYUUO 6,0]
HERE (PTOCHW)
MOVE TEMP,[PTYUUO 7,0]
SETOM .SKIP.
POP P,(P)
EXCH A,(P)
EXCH 0,-1(P)
XCT TEMP
SETZM .SKIP.
POP P,A
POP P,0
JRST @3(P)
HERE (LODED)
MOVEI TEMP,0
EXCH TEMP,(P)
PUSH P,TEMP
SKIPA TEMP,[PTYUUO 15,-1(SP)]
HERE (PTOSTR)
MOVE TEMP,[PTYUUO 11,-1(SP)]
PUSH P,TEMP
MOVE USER,GOGTAB
PUSHJ P,INSET
PUSH SP,[1]
PUSH SP,[POINT 7,[0]]
PUSHJ P,CAT
POP P,TEMP
POP P,(P)
POP P,-1(SP)
XCT TEMP
SUB SP,X22
JRST @2(P)
HERE (BACKUP)
TTYUUO 10,
POPJ P,
HERE (PTYALL)
PUSHJ P,SAVE
MOVE 0,-1(P) ;LINE NUMBER
PTYUUO 3,0
JUMPE A,[PUSH SP,[0]
PUSH SP,[0]
JRST ALLQ]
MOVEI A,=450
ADDM A,REMCHR(USER)
SKIPL REMCHR(USER)
PUSHJ P,STRNGC
PUSHJ P,INSET
PUSH SP,-1(P) ;PTY LINE NUMBER
PUSH SP,TOPBYTE(USER) ;AND BYTE POINTER.
PTYUUO 10,-1(SP) ;AND ASK FOR ALL THAT IS THERE.
MOVEI B,0
MOVE C,(SP) ;BYTE POINTER.
SOMMOR: MOVE LPSA,C ;LAG BY ONE #IN#
ILDB 0,C ;GET CHAR
JUMPE 0,ALLDUN
AOJA B,SOMMOR
ALLDUN: CAILE B,=445
ERR <PTYALL OVERFLOW -- IT JUST CAN'T HAPPEN!!!!>
HRROM B,-1(SP) ;SAVE AS RESULT.
MOVEM LPSA,TOPBYTE(USER);THIS IS WHERE TO START ENXT ITEM. #IN#
SUBI B,=156 ;-ESTIMATE
ADDM B,REMCHR(USER) ;AND UPDATE FREE COUTN.
ALLQ: MOVE LPSA,X22
JRST RESTR
%REDSTR:SKIPE SGLIGN(USER)
PUSHJ P,INSET
MOVEI A,=100
ADDM A,REMCHR(USER)
SKIPLE REMCHR(USER)
PUSHJ P,STRNGC
MOVNI A,=100
PUSH SP,[0] ;NULL STRING IF NOTHING DONE
PUSH SP,TOPBYTE(USER)
POPJ P,
%FINSTR: CAIN TEMP,15 ;REMOVE LFD IF CR BROKE IT
PTYUUO 5,C ;HE USED TO SAY CDB
%FINS1: ADDM A,REMCHR(USER) ;NUMBER NOT USED
ADDI A,=100 ;NUMBER USED
HRROM A,-1(SP) ; AND TO STRING COUNT WORD
JRST RESTR
HERE (PTYSTR)
PUSHJ P,SAVE
PUSHJ P,%REDSTR
MOVE C,-2(P)
MOVE B,-1(P) ;BREAK CHAR
MOVE LPSA,X33 ;# TO REMOVE
%INS1: PTYUUO 5,C ;NEXT CHAR
%INS2: CAMN D,B ;BREAK?
JRST %FINSTR ; YES, ALL DONE
IDPB D,TOPBYTE(USER) ;PUT IT AWAY AND
AOJA A,%INS1 ; GO BACK FOR MORE
JRST %INS2
HERE (PTYIN) PUSHJ P,SAVE
MOVE C,-3(P)
PTYUUO 5,C
%TYIN: PUSHJ P,%REDSTR ;PREPARE STACK,A,STRNGC FOR A STRING
MOVE LPSA,[XWD 4,4] ;PREPARE TO RETURN
%TYIN1: SETZM @-1(P) ;ASSUME NO BREAK CHAR
SKIPL T,-2(P) ;TABLE # (INTO AC 11)
CAILE T,=18
ERR <PTYIN: there are only 18 break tables>
HRRZ TEMP,USER
ADD TEMP,T ;TABLE NO(USER)
MOVEI Z,1 ;FOR TESTING LINE NUMBERS
SKIPN LINTBL(TEMP) ;DON'T LET TEST SUCCEED IF
MOVEI Z,0 ;WE'RE TO LET LINE NUMBERS THRU
MOVE FF,BRKMSK(T) ;GET MASK FOR THIS TABLE
HRRZ Y,USER
ADD Y,[XWD D,BRKTBL] ;BRKTBL+RLC(USER)
JRST %TTYN1
%TTYN: PTYUUO 5,C
%TTYN1: TDNE FF,@Y ;BREAK OR OMIT?
JRST %TTYSPC ; YES, FIND OUT WHICH
%TTYC: IDPB D,TOPBYTE(USER) ;PUT IT AWAY
AOJL A,%TTYN ;COUNT AND CONTINUE
JRST %FINS1 ;DONE
%TTYSPC: HLLZ TEMP,@Y ;WHICH?
TDNN TEMP,FF
JRST %TTYN ;OMIT
MOVEM D,@-1(P)
MOVE Y,-2(P) ;WHAT TO DO WITH IT
ADD Y,USER
SKIPN Y,DSPTBL(Y)
JRST %FINS1 ;DONE, NO SAVE
JUMPL Y,%TTYAPP ;APPEND
ERR <PTYIN: cannot retain break char>,1,%FINS1
%TTYAPP: IDPB D,TOPBYTE(USER) ;COUNT THE BREAK CHAR
ADDI A,1 ;ONE MORE HAPPY CHAR
JRST %FINS1
ENDCOM(PTY)