mirror of
https://github.com/PDP-10/its.git
synced 2026-01-14 23:55:40 +00:00
MIDAS and Muddle source get version numbers (as in the 1973 Muddle source); the build files don't.
2711 lines
59 KiB
Plaintext
2711 lines
59 KiB
Plaintext
TITLE PRINTER ROUTINE FOR MUDDLE
|
||
|
||
RELOCATABLE
|
||
|
||
.INSRT DSK:MUDDLE >
|
||
|
||
.GLOBAL IPNAME,MTYO,RLOOKU,RADX,INAME,INTFCN,LINLN,DOIOTO,BFCLS1,ATOSQ,IGVAL
|
||
.GLOBAL BYTPNT,OPNCHN,CHRWRD,IDVAL,CHARGS,CHFRM,CHLOCI,PRNTYP,PRTYPE,IBLOCK,WXCT
|
||
.GLOBAL VECBOT,VAL,ITEM,INDIC,IOINS,DIRECT,TYPVEC,CHRPOS,LINPOS,ACCESS,PAGLN,ROOT,PROCID
|
||
.GLOBAL BADCHN,WRONGD,CHNCLS,IGET,FNFFL,ILLCHO,BUFSTR,BYTDOP,6TOCHS,PURVEC,STBL,RXCT
|
||
.GLOBAL TMPLNT,TD.LNT,BADTPL,MPOPJ,SSPEC1,GLOTOP,GTLPOS,SPSTOR,PVSTOR
|
||
.GLOBAL CIPRIN,CIPRNC,CIPRN1,CPATM,CP1ATM,CPCATM,CPSTR,CP1STR,CPCSTR
|
||
.GLOBAL CIFLTZ,CITERP,CIUPRS,CPCH,CPCH1,CICRLF,NONSPC
|
||
|
||
BUFLNT==100 ; BUFFER LENGTH IN WORDS
|
||
|
||
FLAGS==0 ;REGISTER USED TO STORE FLAGS
|
||
CARRET==15 ;CARRIAGE RETURN CHARACTER
|
||
ESCHAR=="\ ;ESCAPE CHARACTER
|
||
SPACE==40 ;SPACE CHARACTER
|
||
ATMBIT==200000 ;BIT SWITCH FOR ATOM-NAME PRINT
|
||
NOQBIT==020000 ;SWITCH FOR NO ESCAPING OF OUTPUT (PRINC)
|
||
SEGBIT==010000 ;SWITCH TO INDICATE PRINTING A SEGMENT
|
||
SPCBIT==004000 ;SWITCH TO INDICATE "PRINT" CALL (PUT A SPACE AFTER)
|
||
FLTBIT==002000 ;SWITCH TO INDICATE "FLATSIZE" CALL
|
||
HSHBIT==001000 ;SWITCH TO INDICATE "PHASH" CALL
|
||
TERBIT==000400 ;SWITCH TO INDICATE "TERPRI" CALL
|
||
UNPRSE==000200 ;SWITCH TO INDICATE "UNPARSE" CALL
|
||
ASCBIT==000100 ;SWITCH TO INDICATE USING A "PRINT" CHANNEL
|
||
BINBIT==000040 ;SWITCH TO INDICATE USING A "PRINTB" CHANNEL
|
||
CNTLPC==000020 ;SWITCH TO INDICATE USING ^P CODE IOT
|
||
PJBIT==400000
|
||
C.BUF==1
|
||
C.PRIN==2
|
||
C.BIN==4
|
||
C.OPN==10
|
||
C.READ==40
|
||
|
||
|
||
MFUNCTION FLATSIZE,SUBR
|
||
DEFINE FLTMAX
|
||
4(B) TERMIN
|
||
DEFINE FLTSIZ
|
||
2(B)TERMIN
|
||
;FLATSIZE TAKES TWO OR THREE ARGUMENTS: THE FIRST IS AN OBJECT THE SECOND
|
||
;IS THE MAXIMUM SIZE BEFORE IT GIVES UP AN RETURNS FALSE
|
||
;THE THIRD (OPTIONAL) ARGUMENT IS A RADIX
|
||
ENTRY
|
||
CAMG AB,[-2,,0] ;CHECK NUMBER OF ARGS
|
||
CAMG AB,[-6,,0]
|
||
JRST WNA
|
||
PUSH P,3(AB)
|
||
|
||
GETYP A,2(AB)
|
||
CAIE A,TFIX
|
||
JRST WTYP2 ;SECOND ARG NOT FIX THEN LOSE
|
||
|
||
CAMG AB,[-4,,0] ;SEE IF THERE IS A RADIX ARGUMENT
|
||
JRST .+3 ; RADIX SUPPLIED
|
||
PUSHJ P,GTRADX ; GET THE RADIX FROM OUTCHAN
|
||
JRST FLTGO
|
||
GETYP A,4(AB) ;CHECK TO SEE THAT RADIX IS FIX
|
||
CAIE A,TFIX
|
||
JRST WTYP ;ERROR THIRD ARGUMENT WRONG TYPE
|
||
MOVE C,5(AB)
|
||
PUSHJ P,GETARG ; GET ARGS INTO A AND B
|
||
FLTGO: POP P,D ; RESTORE FLATSIZE MAXIMUM
|
||
PUSHJ P,CIFLTZ
|
||
JFCL
|
||
JRST FINIS
|
||
|
||
|
||
|
||
MFUNCTION UNPARSE,SUBR
|
||
DEFINE UPB
|
||
0(B) TERMIN
|
||
|
||
ENTRY
|
||
|
||
JUMPGE AB,TFA
|
||
MOVE E,TP ;SAVE TP POINTER
|
||
|
||
|
||
|
||
;TURN ON FLTBIT TO AVOID PRINTING LOSSAGE
|
||
;TURN ON UNPRSE TO CAUSE CHARS TO BE STASHED
|
||
CAMG AB,[-2,,0] ;SKIP IF RADIX SUPPLIED
|
||
JRST .+3
|
||
PUSHJ P,GTRADX ;GET THE RADIX FROM OUTCHAN
|
||
JRST UNPRGO
|
||
CAMGE AB,[-5,,0] ;CHECK FOR TOO MANY
|
||
JRST TMA
|
||
GETYP 0,2(AB)
|
||
CAIE 0,TFIX ;SEE IF RADIX IS FIXED
|
||
JRST WTYP2
|
||
MOVE C,3(AB) ;GET RADIX
|
||
PUSHJ P,GETARG ;GET ARGS INTO A AND B
|
||
UNPRGO: PUSHJ P,CIUPRS
|
||
JRST FINIS
|
||
JRST FINIS
|
||
|
||
|
||
GTRADX: MOVE B,IMQUOTE OUTCHAN
|
||
PUSH P,0 ;SAVE FLAGS
|
||
PUSHJ P,IDVAL ;GET VALUE FOR OUTCHAN
|
||
POP P,0
|
||
GETYP A,A ;CHECK TYPE OF CHANNEL
|
||
CAIE A,TCHAN
|
||
JRST FUNCH1-1 ;IT IS A TP-POINTER
|
||
MOVE C,RADX(B) ;GET RADIX FROM OUTCHAN
|
||
JRST FUNCH1
|
||
MOVE C,(B)+6 ;GET RADIX FROM STACK
|
||
|
||
FUNCH1: CAIG C,1 ;CHECK FOR STRANGE RADIX
|
||
MOVEI C,10. ;DEFAULT IF THIS IS THE CASE
|
||
GETARG: MOVE A,(AB)
|
||
MOVE B,1(AB)
|
||
POPJ P,
|
||
|
||
|
||
IMFUNCTION PRINT,SUBR
|
||
ENTRY
|
||
PUSHJ P,AGET ; GET ARGS
|
||
PUSHJ P,CIPRIN
|
||
JRST FINIS
|
||
|
||
MFUNCTION PRINC,SUBR
|
||
ENTRY
|
||
PUSHJ P,AGET ; GET ARGS
|
||
PUSHJ P,CIPRNC
|
||
JRST FINIS
|
||
|
||
MFUNCTION PRIN1,SUBR
|
||
ENTRY
|
||
PUSHJ P,AGET
|
||
PUSHJ P,CIPRN1
|
||
JRST FINIS
|
||
|
||
|
||
MFUNCTION CRLF,SUBR
|
||
ENTRY
|
||
PUSHJ P,AGET1
|
||
PUSHJ P,CICRLF
|
||
JRST FINIS
|
||
|
||
MFUNCTION TERPRI,SUBR
|
||
ENTRY
|
||
PUSHJ P,AGET1
|
||
PUSHJ P,CITERP
|
||
JRST FINIS
|
||
|
||
|
||
CICRLF: SKIPA E,.
|
||
CITERP: MOVEI E,0
|
||
SUBM M,(P)
|
||
MOVSI 0,TERBIT+SPCBIT ; SET UP FLAGS
|
||
PUSH P,E
|
||
PUSHJ P,TESTR ; TEST FOR GOOD CHANNEL
|
||
MOVEI A,CARRET ; MOVE IN CARRIAGE-RETURN
|
||
PUSHJ P,PITYO ; PRINT IT OUT
|
||
MOVEI A,12 ; LINE-FEED
|
||
PUSHJ P,PITYO
|
||
POP P,0
|
||
JUMPN 0,.+4
|
||
MOVSI A,TFALSE ; RETURN A FALSE
|
||
MOVEI B,0
|
||
JRST MPOPJ ; RETURN
|
||
|
||
MOVSI A,TATOM
|
||
MOVE B,IMQUOTE T
|
||
JRST MPOPJ
|
||
|
||
TESTR: GETYP E,A
|
||
CAIN E,TCHAN ; CHANNEL?
|
||
JRST TESTR1 ; OK?
|
||
CAIE E,TTP
|
||
JRST BADCHN
|
||
HLRZS 0
|
||
IOR 0,A ; RESTORE FLAGS
|
||
HRLZS 0
|
||
POPJ P,
|
||
TESTR1: HRRZ E,-2(B) ; GET IN FLAGS FROM CHANNEL
|
||
SKIPN IOINS(B)
|
||
PUSHJ P,OPENIT
|
||
TRNN E,C.OPN ; SKIP IF OPEN
|
||
JRST CHNCLS
|
||
TRC E,C.PRIN+C.OPN ; CHECK TO SEE THAT CHANNEL IS GOOD
|
||
TRNE E,C.PRIN+C.OPN
|
||
JRST BADCHN ; ITS A LOSER
|
||
TRNE E,C.BIN
|
||
JRST PSHNDL ; DON'T HANDLE BINARY
|
||
TLO ASCBIT ; ITS ASCII
|
||
POPJ P, ; ITS A WINNER
|
||
|
||
PSHNDL: PUSH TP,C ; SAVE ARGS
|
||
PUSH TP,D
|
||
PUSH TP,A ; PUSH CHANNEL ONTO STACK
|
||
PUSH TP,B
|
||
PUSHJ P,BPRINT ; CHECK BUFFER
|
||
POP TP,B
|
||
POP TP,A
|
||
POP TP,D
|
||
POP TP,C
|
||
POPJ P,
|
||
|
||
|
||
;CIUPRS NEEDS A RADIX IN C AND A TYPE-OBJECT PAIR IN A,B
|
||
|
||
CIUPRS: SUBM M,(P) ; MODIFY M-POINTER
|
||
MOVE E,TP ; SAVE TP-POINTER
|
||
PUSH TP,[0] ; SLOT FOR FIRST STRING COPY
|
||
PUSH TP,[0]
|
||
PUSH TP,[0] ; AND SECOND STRING
|
||
PUSH TP,[0]
|
||
PUSH TP,A ; SAVE OBJECTS
|
||
PUSH TP,B
|
||
PUSH TP,$TTP ; SAVE TP POINTER
|
||
PUSH TP,E
|
||
PUSH P,C
|
||
MOVE D,[377777,,-1] ; MOVE IN MAXIMUM NUMBER FOR FLATSIZE
|
||
PUSHJ P,CIFLTZ ; FIND LENGTH OF STRING
|
||
FATAL UNPARSE BLEW IT
|
||
MOVEI A,4(B)
|
||
PUSH P,B
|
||
IDIVI A,5
|
||
PUSHJ P,IBLOCK ; GET A BLOCK
|
||
POP P,A
|
||
HRLI A,TCHSTR
|
||
HRLI B,010700
|
||
SUBI B,1
|
||
POP TP,E ; RESTORE TP-POINTER
|
||
SUB TP,[1,,1] ;GET RID OF TYPE WORD
|
||
MOVEM A,1(E) ; SAVE RESULTS
|
||
MOVEM A,3(E)
|
||
MOVEM B,2(E)
|
||
MOVEM B,4(E)
|
||
POP TP,B ; RESTORE THE WORLD
|
||
POP TP,A
|
||
POP P,C
|
||
MOVSI 0,FLTBIT+UNPRSE ; SET UP FLAGS
|
||
PUSHJ P,CUSET
|
||
JRST MPOPJ ; RETURN
|
||
|
||
|
||
|
||
; FOR CIFLTZ C CONTAINS THE RADIX, D THE MAXIMUM NUMBER OF CHARACTERS,
|
||
; A,B THE TYPE-OBJECT PAIR
|
||
|
||
CIFLTZ: SUBM M,(P)
|
||
MOVE E,TP ; SAVE POINTER
|
||
PUSH TP,$TFIX ; PUSH ON FLATSIZE COUNT
|
||
PUSH TP,[0]
|
||
PUSH TP,$TFIX ; PUSH ON FLATSIZE MAXIMUM
|
||
PUSH TP,D
|
||
MOVSI 0,FLTBIT ; MOVE ON FLATSIZE FLAG
|
||
PUSHJ P,CUSET ; CONTINUE
|
||
JRST MPOPJ
|
||
SOS (P) ; SKIP RETURN
|
||
JRST MPOPJ ; RETURN
|
||
|
||
; CUSET IS THE ROUTINE USED BY FLATSIZE AND UNPARSE TO DO THE PUSHING,POPING AND CALLING
|
||
; NEEDED TO GET A RESULT.
|
||
|
||
CUSET: PUSH TP,$TFIX ; PUSH ON RADIX
|
||
PUSH TP,C
|
||
PUSH TP,$TPDL
|
||
PUSH TP,P ; PUSH ON RETURN POINTER IN CASE FLATSIZE GETS A FALSE
|
||
PUSH TP,A ; SAVE OBJECTS
|
||
PUSH TP,B
|
||
MOVSI C,TTP ; CONSTRUCT TP-POINTER
|
||
HLR C,FLAGS ; SAVE FLAGS IN TP-POINTER
|
||
MOVE D,E
|
||
PUSH TP,C ; PUSH ON CHANNEL
|
||
PUSH TP,D
|
||
PUSHJ P,IPRINT ; GO TO INTERNAL PRINTER
|
||
POP TP,B ; GET IN TP POINTER
|
||
MOVE TP,B ; RESTORE POINTER
|
||
TLNN FLAGS,UNPRSE ; SEE IF UNPARSE CALL
|
||
JRST FLTGEN ; ITS A FLATSIZE
|
||
MOVE A,UPB+3 ; RETURN STRING
|
||
MOVE B,UPB+4
|
||
POPJ P, ; DONE
|
||
FLTGEN: MOVE A,FLTSIZ-1 ; GET IN COUNT
|
||
MOVE B,FLTSIZ
|
||
AOS (P)
|
||
POPJ P, ; EXIT
|
||
|
||
|
||
; CIPRIN,CIPRNC,CIPRN1,CPATM,CP1ATM,CPCATM,CPSTR,CP1STR,CPCSTR ALL ASSUME
|
||
; THAT C,D CONTAIN THE OBJECT AND A AND B CONTAIN THE CHANNEL
|
||
|
||
CIPRIN: SUBM M,(P)
|
||
MOVSI 0,SPCBIT ; SET UP FLAGS
|
||
PUSHJ P,TPRT ; PRINT INITIALIZATION
|
||
PUSHJ P,IPRINT
|
||
JRST TPRTE ; EXIT
|
||
|
||
CIPRN1: SUBM M,(P)
|
||
MOVEI FLAGS,0 ; SET UP FLAGS
|
||
PUSHJ P,TPR1 ; INITIALIZATION
|
||
PUSHJ P,IPRINT ; PRINT IT OUT
|
||
JRST TPR1E ; EXIT
|
||
|
||
CIPRNC: SUBM M,(P)
|
||
MOVSI FLAGS,NOQBIT ; SET UP FLAGS
|
||
PUSHJ P,TPR1 ; INITIALIZATION
|
||
PUSHJ P,IPRINT
|
||
JRST TPR1E ; EXIT
|
||
|
||
; INITIALIZATION FOR PRINT ROUTINES
|
||
|
||
TPRT: PUSHJ P,TESTR ; SEE IF CHANNEL IS OK
|
||
PUSH TP,C ; SAVE ARGUMENTS
|
||
PUSH TP,D
|
||
PUSH TP,A ; SAVE CHANNEL
|
||
PUSH TP,B
|
||
MOVEI A,CARRET ; PRINT CARRIAGE RETURN
|
||
PUSHJ P,PITYO
|
||
MOVEI A,12 ; AND LF
|
||
PUSHJ P,PITYO
|
||
MOVE A,-3(TP) ; MOVE IN ARGS
|
||
MOVE B,-2(TP)
|
||
POPJ P,
|
||
|
||
; EXIT FOR PRINT ROUTINES
|
||
|
||
TPRTE: POP TP,B ; RESTORE CHANNEL
|
||
MOVEI A,SPACE ; PRINT TRAILING SPACE
|
||
PUSHJ P,PITYO
|
||
SUB TP,[1,,1] ; GET RID OF CHANNEL TYPE-WORD
|
||
POP TP,B ; RETURN WHAT WAS PASSED
|
||
POP TP,A
|
||
JRST MPOPJ ; EXIT
|
||
|
||
; INITIALIZATION FOR PRIN1 AND PRINC ROUTINES
|
||
|
||
TPR1: PUSHJ P,TESTR ; SEE IF CHANNEL IS OK
|
||
PUSH TP,C ; SAVE ARGS
|
||
PUSH TP,D
|
||
PUSH TP,A ; SAVE CHANNEL
|
||
PUSH TP,B
|
||
MOVE A,-3(TP) ; GET ARGS
|
||
MOVE B,-2(TP)
|
||
POPJ P,
|
||
|
||
; EXIT FOR PRIN1 AND PRINC ROUTINES
|
||
|
||
TPR1E: SUB TP,[2,,2] ; REMOVE CHANNEL
|
||
POP TP,B ; RETURN ARGUMENTS THAT WERE GIVEN
|
||
POP TP,A
|
||
JRST MPOPJ ; EXIT
|
||
|
||
|
||
|
||
CPATM: SUBM M,(P)
|
||
MOVSI C,TATOM ; GET TYPE FOR BINARY
|
||
MOVEI 0,SPCBIT ; SET UP FLAGS
|
||
PUSHJ P,TPRT ; PRINT INITIALIZATION
|
||
PUSHJ P,CPATOM ; PRINT IT OUT
|
||
JRST TPRTE ; EXIT
|
||
|
||
CP1ATM: SUBM M,(P)
|
||
MOVE C,$TATOM
|
||
MOVEI FLAGS,0 ; SET UP FLAGS
|
||
PUSHJ P,TPR1 ; INITIALIZATION
|
||
PUSHJ P,CPATOM ; PRINT IT OUT
|
||
JRST TPR1E ; EXIT
|
||
|
||
CPCATM: SUBM M,(P)
|
||
MOVE C,$TATOM
|
||
MOVSI FLAGS,NOQBIT ; SET UP FLAGS
|
||
PUSHJ P,TPR1 ; INITIALIZATION
|
||
PUSHJ P,CPATOM ; PRINT IT OUT
|
||
JRST TPR1E ; EXIT
|
||
|
||
|
||
; THIS ROUTINE IS USD TO PRINT ONE CHARACTER. THE CHANNEL IS IN A AND B THE
|
||
; CHARACTER IS IN C.
|
||
CPCH1: TDZA 0,0
|
||
CPCH: MOVEI 0,1
|
||
SUBM M,(P)
|
||
PUSH P,0
|
||
MOVSI FLAGS,NOQBIT
|
||
MOVE C,$TCHRS
|
||
PUSHJ P,TESTR ; SEE IF CHANNEL IS GOOD
|
||
EXCH D,(P) ; CHAR TO STACK, IND TO D
|
||
MOVE A,(P) ; MOVE IN CHARACTER FOR PITYO
|
||
JUMPE D,.+3
|
||
PUSHJ P,PRETIF
|
||
JRST .+2
|
||
PUSHJ P,PITYO
|
||
MOVE A,$TCHRST ; RETURN THE CHARACTER
|
||
POP P,B
|
||
JRST MPOPJ
|
||
|
||
|
||
|
||
|
||
CPSTR: SUBM M,(P)
|
||
HRLI C,TCHSTR
|
||
MOVSI 0,SPCBIT ; SET UP FLAGS
|
||
PUSHJ P,TPRT ; PRINT INITIALIZATION
|
||
PUSHJ P,CPCHST ; PRINT IT OUT
|
||
JRST TPRTE ; EXIT
|
||
|
||
CP1STR: SUBM M,(P)
|
||
HRLI C,TCHSTR
|
||
MOVEI FLAGS,0 ; SET UP FLAGS
|
||
PUSHJ P,TPR1 ; INITIALIZATION
|
||
PUSHJ P,CPCHST ; PRINT IT OUT
|
||
JRST TPR1E ; EXIT
|
||
|
||
CPCSTR: SUBM M,(P)
|
||
HRLI C,TCHSTR
|
||
MOVSI FLAGS,NOQBIT ; SET UP FLAGS
|
||
PUSHJ P,TPR1 ; INITIALIZATION
|
||
PUSHJ P,CPCHST ; PRINT IT OUT
|
||
JRST TPR1E ; EXIT
|
||
|
||
|
||
CPATOM: PUSH TP,A ; COPY ARGS FOR INTERNAL SAKE
|
||
PUSH TP,B
|
||
PUSH P,0 ; ATOM CALLER ROUTINE
|
||
PUSH P,C
|
||
SKIPN C,PRNTYP+1
|
||
JRST PATOM
|
||
ADDI C,TATOM+TATOM
|
||
SKIPE (C) ; SKIP IF UNCHANGED PRINT TYPE OR DISPATCH
|
||
JRST PRDIS1
|
||
SKIPN C,1(C)
|
||
JRST PATOM
|
||
JRST (C)
|
||
|
||
CPCHST: PUSH TP,A ; COPY ARGS FOR INTERNAL SAKE
|
||
PUSH TP,B
|
||
PUSH P,C ; STRING CALLER ROUTINE
|
||
PUSH P,FLAGS
|
||
SKIPN C,PRNTYP+1
|
||
JRST PATOM
|
||
ADDI C,TCHSTR+TCHSTR
|
||
SKIPE (C) ; SKIP IF UNCHANGED PRINT TYPE OR DISPATCH
|
||
JRST PRDIS1
|
||
SKIPN C,1(C)
|
||
JRST PCHSTR
|
||
JRST (C)
|
||
|
||
|
||
|
||
AGET: MOVEI FLAGS,0
|
||
SKIPL E,AB ; COPY ARG POINTER
|
||
JRST TFA ;NO ARGS IS AN ERROR
|
||
ADD E,[2,,2] ;POINT AT POSSIBLE CHANNEL
|
||
JRST COMPT
|
||
AGET1: MOVE E,AB ; GET COPY OF AB
|
||
MOVSI FLAGS,TERBIT
|
||
|
||
COMPT: PUSH TP,$TFIX ;LEAVE ROOM ON STACK FOR ONE CHANNEL
|
||
PUSH TP,[0]
|
||
JUMPGE E,DEFCHN ;IF NO CHANNEL ARGUMENT, USE CURRENT BINDING
|
||
CAMG E,[-2,,0] ;IF MORE ARGS THEN ERROR
|
||
JRST TMA
|
||
MOVE A,(E) ;GET CHANNEL
|
||
MOVE B,(E)+1
|
||
JRST NEWCHN
|
||
|
||
DEFCHN: MOVE B,IMQUOTE OUTCHAN
|
||
MOVSI A,TATOM
|
||
PUSH P,FLAGS ;SAVE FLAGS
|
||
PUSHJ P,IDVAL ;GET VALUE OF OUTCHAN
|
||
POP P,0
|
||
|
||
NEWCHN: TLNE FLAGS,TERBIT ; SEE IF TERPRI
|
||
POPJ P,
|
||
MOVE C,(AB) ; GET ARGS
|
||
MOVE D,1(AB)
|
||
POPJ P,
|
||
|
||
; HERE IF USING A PRINTB CHANNEL
|
||
|
||
BPRINT: TLO FLAGS,BINBIT
|
||
SKIPE BUFSTR(B) ; ANY OUTPUT BUFFER?
|
||
POPJ P,
|
||
|
||
; HERE TO GENERATE A STRING BUFFER
|
||
|
||
PUSH P,FLAGS
|
||
MOVEI A,BUFLNT ; GET BUFFER LENGTH
|
||
PUSHJ P,IBLOCK ; MAKE A BUFFER
|
||
MOVSI 0,TWORD+.VECT. ; CLOBBER U TYPE
|
||
MOVEM 0,BUFLNT(B)
|
||
SETOM (B) ; -1 THE BUFFER
|
||
MOVEI C,1(B)
|
||
HRLI C,(B)
|
||
BLT C,BUFLNT-1(B)
|
||
HRLI B,010700
|
||
SUBI B,1
|
||
MOVE C,(TP)
|
||
MOVEM B,BUFSTR(C) ; STOR BYTE POINTER
|
||
MOVE 0,[TCHSTR,,BUFLNT*5]
|
||
MOVEM 0,BUFSTR-1(C)
|
||
POP P,FLAGS
|
||
MOVE B,(TP)
|
||
POPJ P,
|
||
|
||
|
||
IPRINT: PUSH P,C ; SAVE C
|
||
PUSH P,FLAGS ;SAVE PREVIOUS FLAGS
|
||
PUSH TP,A ;SAVE ARGUMENT ON TP-STACK
|
||
PUSH TP,B
|
||
|
||
INTGO ;ALLOW INTERRUPTS HERE
|
||
|
||
GETYP A,-1(TP) ;GET THE TYPE CODE OF THE ITEM
|
||
SKIPE C,PRNTYP+1 ; USER TYPE TABLE?
|
||
JRST PRDISP
|
||
NORMAL: CAILE A,NUMPRI ;PRIMITIVE?
|
||
JRST PUNK ;JUMP TO ERROR ROUTINE IF CODE TOO GREAT
|
||
HRRO A,PRTYPE(A) ;YES-DISPATCH
|
||
JRST (A)
|
||
|
||
; HERE FOR USER PRINT DISPATCH
|
||
|
||
PRDISP: ADDI C,(A) ; POINT TO SLOT
|
||
ADDI C,(A)
|
||
SKIPE (C) ; SKIP EITHER A LOSER OR JRST DISP
|
||
JRST PRDIS1 ; APPLY EVALUATOR
|
||
SKIPN C,1(C) ; GET ADDR OR GO TO PURE DISP
|
||
JRST NORMAL
|
||
JRST (C)
|
||
|
||
PRDIS1: SUB C,PRNTYP+1
|
||
PUSH P,C
|
||
PUSH TP,[TATOM,,-1] ; PUSH ON OUTCHAN FOR SPECBIND
|
||
PUSH TP,IMQUOTE OUTCHAN
|
||
PUSH TP,-5(TP)
|
||
PUSH TP,-5(TP)
|
||
PUSH TP,[0]
|
||
PUSH TP,[0]
|
||
PUSHJ P,SPECBIND
|
||
POP P,C ; RESTORE C
|
||
ADD C,PRNTYP+1 ; RESTORE C
|
||
PUSH TP,(C) ; PUSH ARGS FOR APPLY
|
||
PUSH TP,1(C)
|
||
PUSH TP,-9(TP)
|
||
PUSH TP,-9(TP)
|
||
MCALL 2,APPLY ; APPLY HACKER TO OBJECT
|
||
MOVEI E,-8(TP)
|
||
PUSHJ P,SSPEC1 ;UNBIND OUTCHAN
|
||
SUB TP,[6,,6] ; POP OFF STACK
|
||
JRST PNEXT
|
||
|
||
; PRINT DISPATCH TABLE
|
||
|
||
IF2,PUNKS==400000,,PUNK
|
||
|
||
DISTBL PRTYPE,PUNKS,[[TATOM,PATOM],[TFORM,PFORM],[TSEG,PSEG],[TFIX,PFIX]
|
||
[TFLOAT,PFLOAT],[TLIST,PLIST],[TVEC,PVEC],[TCHRS,PCHRS],[TCHSTR,PCHSTR]
|
||
[TARGS,PARGS],[TUVEC,PUVEC],[TDEFER,PDEFER],[TINTH,PINTH],[THAND,PHAND]
|
||
[TILLEG,ILLCH],[TRSUBR,PRSUBR],[TENTER,PENTRY],[TPCODE,PPCODE],[TTYPEW,PTYPEW]
|
||
[TTYPEC,PTYPEC],[TTMPLT,TMPRNT],[TLOCD,LOCPT1],[TLOCR,LOCRPT],[TQRSUB,PRSUBR]
|
||
[TQENT,PENTRY],[TSATC,PSATC],[TBYTE,PBYTE]
|
||
[TOFFS,POFFSE]]
|
||
|
||
PUNK: MOVE C,TYPVEC+1 ; GET AOBJN-POINTER TO VECTOR OF TYPE ATOMS
|
||
GETYP B,-1(TP) ; GET THE TYPE CODE INTO REG B
|
||
LSH B,1 ; MULTIPLY BY TWO
|
||
HRL B,B ; DUPLICATE IT IN THE LEFT HALF
|
||
ADD C,B ; INCREMENT THE AOBJN-POINTER
|
||
JUMPGE C,PRERR ; IF POSITIVE, INDEX > VECTOR SIZE
|
||
|
||
MOVE B,-2(TP) ; MOVE IN CHANNEL
|
||
PUSH TP,$TVEC ; SAVE ALLTYPES VECTOR
|
||
PUSH TP,C
|
||
PUSHJ P,RETIF1 ; START NEW LINE IF NO ROOM
|
||
MOVEI A,"# ; INDICATE TYPE-NAME FOLLOWS
|
||
PUSHJ P,PITYO
|
||
POP TP,C
|
||
SUB TP,[1,,1]
|
||
MOVE A,(C) ; GET TYPE-ATOM
|
||
MOVE B,1(C)
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ; PRINT ATOM-NAME
|
||
SUB TP,[2,,2] ; POP STACK
|
||
MOVE B,-2(TP) ; MOVE IN CHANNEL
|
||
PUSHJ P,SPACEQ ; MAYBE SPACE
|
||
MOVE B,(B) ; RESET THE REAL ARGUMENT POINTER
|
||
HRRZ A,(C) ; GET THE STORAGE-TYPE
|
||
ANDI A,SATMSK
|
||
CAILE A,NUMSAT ; SKIP IF TEMPLATE
|
||
JRST TMPRNT ; PRINT TEMPLATED DATA STRUCTURE
|
||
HRRO A,UKTBL(A) ; USE DISPATCH TABLE ON STORAGE TYPE
|
||
JRST (A)
|
||
|
||
DISTBS UKTBL,POCTAL,[[S2WORD,PLIST],[S2NWORD,PVEC],[SNWORD,PUVEC],[SATOM,PATOM]
|
||
[SCHSTR,PCHSTR],[SFRAME,PFRAME],[SARGS,PARGS],[SPVP,PPVP],[SLOCID,LOCPT],[SLOCA,LOCP]
|
||
[SLOCV,LOCP],[SLOCU,LOCP],[SLOCS,LOCP],[SLOCL,LOCP],[SLOCN,LOCP],[SASOC,ASSPNT]
|
||
[SLOCT,LOCP],[SLOCB,LOCP],[SBYTE,PBYTE],[SOFFS,POFFSE]]
|
||
; SELECK AN ILLEGAL
|
||
|
||
ILLCH: MOVEI B,-1(TP)
|
||
JRST ILLCHO
|
||
|
||
; PRINT INTERRUPT HANDLER
|
||
|
||
PHAND: MOVE B,-2(TP) ; MOVE CHANNEL INTO B
|
||
PUSHJ P,RETIF1
|
||
MOVEI A,"#
|
||
PUSHJ P,PITYO ; SAY "FUNNY TYPE"
|
||
MOVSI A,TATOM
|
||
MOVE B,MQUOTE HANDLER
|
||
PUSH TP,-3(TP) ; PUSH CHANNEL ON FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ; PRINT THE TYPE NAME
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
MOVE B,-2(TP) ; GET CHANNEL
|
||
PUSHJ P,SPACEQ ; SPACE MAYBE
|
||
SKIPN B,(TP) ; GET ARG BACK
|
||
JRST PNEXT
|
||
MOVE A,INTFCN(B) ; PRINT FUNCTION FOR NOW
|
||
MOVE B,INTFCN+1(B)
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ; PRINT THE INT FUNCTION
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF
|
||
JRST PNEXT
|
||
|
||
; PRINT INT HEADER
|
||
|
||
PINTH: MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF1
|
||
MOVEI A,"#
|
||
PUSHJ P,PITYO
|
||
MOVSI A,TATOM ; AND NAME
|
||
MOVE B,MQUOTE IHEADER
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
MOVE B,-4(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,SPACEQ ; MAYBE SPACE
|
||
SKIPN B,-2(TP) ; INT HEADER BACK
|
||
JRST PINTH1
|
||
MOVE A,INAME(B) ; GET NAME
|
||
MOVE B,INAME+1(B)
|
||
PUSHJ P,IPRINT
|
||
PINTH1: SUB TP,[2,,2] ; CLEAN OFF STACK
|
||
JRST PNEXT
|
||
|
||
|
||
; PRINT ASSOCIATION BLOCK
|
||
|
||
ASSPNT: MOVEI A,"( ; MAKE IT BE (ITEN INDIC VAL)
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,PRETIF ; MAKE ROOM AND PRINT
|
||
SKIPA C,[-3,,0] ; # OF FIELDS
|
||
ASSLP: PUSHJ P,SPACEQ
|
||
MOVE D,(TP) ; RESTORE GOODIE
|
||
ADD D,ASSOFF(C) ; POINT TO FIELD
|
||
MOVE A,(D) ; GET IT
|
||
MOVE B,1(D)
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ; AND PRINT IT
|
||
SUB TP,[2,,2] ; POP OFF CHANNEL
|
||
MOVE B,-2(TP) ; GET CHANNEL
|
||
AOBJN C,ASSLP
|
||
|
||
MOVEI A,")
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,PRETIF ; CLOSE IT
|
||
JRST PNEXT
|
||
|
||
ASSOFF: ITEM
|
||
INDIC
|
||
VAL
|
||
; PRINT TYPE-C AND TYPE-W
|
||
|
||
PTYPEW: HRRZ A,(TP) ; POSSIBLE RH
|
||
HLRZ B,(TP)
|
||
MOVE C,MQUOTE TYPE-W
|
||
JRST PTYPEX
|
||
|
||
PTYPEC: HRRZ B,(TP)
|
||
MOVEI A,0
|
||
MOVE C,MQUOTE TYPE-C
|
||
|
||
PTYPEX: PUSH P,B
|
||
PUSH P,A
|
||
PUSH TP,$TATOM
|
||
PUSH TP,C
|
||
MOVEI A,2
|
||
MOVE B,-4(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF ; ROOM TO START?
|
||
MOVEI A,"%
|
||
PUSHJ P,PITYO
|
||
MOVEI A,"<
|
||
PUSHJ P,PITYO
|
||
POP TP,B ; GET NAME
|
||
POP TP,A
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ; AND PRINT IT AS 1ST ELEMENT
|
||
SUB TP,[2,,2] ; POP OFF CHANNEL
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,SPACEQ ; MAYBE SPACE
|
||
MOVE A,-1(P) ; TYPE CODE
|
||
ASH A,1
|
||
HRLI A,(A) ; MAKE SURE WINS
|
||
ADD A,TYPVEC+1
|
||
JUMPL A,PTYPX1 ; JUMP FOR A WINNER
|
||
ERRUUO EQUOTE BAD-TYPE-CODE
|
||
|
||
PTYPX1: MOVE B,1(A) ; GET TYPE NAME
|
||
HRRZ A,(A) ; AND SAT
|
||
ANDI A,SATMSK
|
||
MOVEM A,-1(P) ; AND SAVE IT
|
||
MOVSI A,TATOM
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ; OUT IT GOES
|
||
SUB TP,[2,,2] ; POP OFF CHANNEL
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,SPACEQ ; MAYBE SPACE
|
||
MOVE A,-1(P) ; GET SAT BACK
|
||
MOVE B,IMQUOTE TEMPLATE
|
||
CAIGE A,NUMSAT
|
||
MOVE B,@STBL(A)
|
||
MOVSI A,TATOM ; AND PRINT IT
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2] ; POP OFF STACK
|
||
SKIPN B,(P) ; ANY EXTRA CRAP?
|
||
JRST PTYPX2
|
||
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,SPACEQ
|
||
MOVE B,(P)
|
||
MOVSI A,TFIX
|
||
PUSH TP,-3(TP) ; PUSH CHANNELS FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ; PRINT EXTRA
|
||
SUB TP,[2,,2] ; POP OFF CHANNEL
|
||
|
||
PTYPX2: MOVEI A,">
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,PRETIF
|
||
SUB P,[2,,2] ; FLUSH CRUFT
|
||
JRST PNEXT
|
||
|
||
; PRIMTYPE CODE
|
||
|
||
; PRINT PURE CODE POINTER
|
||
|
||
PSATC: MOVEI A,2
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF
|
||
MOVEI A,"%
|
||
PUSHJ P,PITYO
|
||
MOVEI A,"<
|
||
PUSHJ P,PITYO
|
||
MOVSI A,TATOM ; PRINT SUBR CALL
|
||
MOVE B,MQUOTE PRIMTYPE-C
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
MOVE B,-4(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,SPACEQ ; MAYBE SPACE?
|
||
MOVE A,-2(TP)
|
||
CAILE A,NUMSAT
|
||
JRST TMPPTY
|
||
|
||
MOVE B,@STBL(A)
|
||
JRST PSATC1
|
||
|
||
TMPPTY: MOVE B,TYPVEC+1
|
||
PSATC3: HRRZ C,(B)
|
||
ANDI C,SATMSK
|
||
CAIN A,(C)
|
||
JRST PSATC2
|
||
ADD B,[2,,2]
|
||
JUMPL B,PSATC3
|
||
|
||
ERRUUO EQUOTE BAD-PRIMTYPEC
|
||
|
||
PSATC2: MOVE B,1(B)
|
||
PSATC1: MOVSI A,TATOM
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2]
|
||
MOVEI A,">
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,PRETIF ; CLOSE THE FORM
|
||
JRST PNEXT
|
||
|
||
|
||
PPCODE: MOVEI A,2
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF
|
||
MOVEI A,"%
|
||
PUSHJ P,PITYO
|
||
MOVEI A,"<
|
||
PUSHJ P,PITYO
|
||
MOVSI A,TATOM ; PRINT SUBR CALL
|
||
MOVE B,MQUOTE PCODE
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
MOVE B,-4(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,SPACEQ ; MAYBE SPACE?
|
||
HLRZ A,-2(TP) ; OFFSET TO VECTOR
|
||
ADD A,PURVEC+1 ; SLOT TO A
|
||
MOVE A,(A) ; SIXBIT NAME
|
||
PUSH P,FLAGS
|
||
PUSHJ P,6TOCHS ; TO A STRING
|
||
POP P,FLAGS
|
||
PUSHJ P,IPRINT
|
||
MOVE B,-4(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,SPACEQ
|
||
HRRZ B,-2(TP) ; GET OFFSET
|
||
MOVSI A,TFIX
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
MOVEI A,">
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,PRETIF ; CLOSE THE FORM
|
||
JRST PNEXT
|
||
|
||
|
||
; PRINT SUB-ENTRY TO RSUBR
|
||
|
||
PENTRY: MOVE B,(TP) ; GET BLOCK
|
||
GETYP A,(B) ; TYPE OF 1ST ELEMENT
|
||
CAIE A,TRSUBR ; RSUBR, OK
|
||
JRST PENT1
|
||
PENT2: MOVEI A,2 ; CHECK ROOM
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF
|
||
MOVEI A,"% ; SETUP READ TIME MACRO
|
||
PUSHJ P,PITYO
|
||
MOVEI A,"<
|
||
PUSHJ P,PITYO
|
||
MOVSI A,TATOM
|
||
MOVE B,IMQUOTE RSUBR-ENTRY
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
MOVE B,-4(TP)
|
||
PUSHJ P,SPACEQ ; MAYBE SPACE
|
||
MOVEI A,"' ; QUOTE TO AVOID EVALING IT
|
||
PUSHJ P,PRETIF
|
||
MOVEI A,"[ ; OPEN SQUARE BRAKET
|
||
PUSHJ P,PRETIF
|
||
MOVE B,-2(TP)
|
||
GETYP A,(B)
|
||
CAIN A,TRSUBR
|
||
JRST PENT3
|
||
MOVE A,(B)
|
||
MOVE B,1(B)
|
||
PUSHJ P,IPRINT
|
||
MOVE B,-4(TP) ; MOVE IN CHANNEL
|
||
JRST PENT4
|
||
PENT3: MOVE A,1(B)
|
||
MOVE B,3(A)
|
||
MOVSI A,TATOM ; FOOL EVERYBODY AND SEND OUT ATOM
|
||
PUSHJ P,IPRINT
|
||
MOVE B,-4(TP) ; PRINT SPACE
|
||
PENT4: PUSHJ P,SPACEQ
|
||
MOVE B,-2(TP) ; GET PTR BACK TO VECTOR
|
||
MOVE A,2(B) ; THE NAME OF THE ENTRY
|
||
MOVE B,3(B)
|
||
PUSHJ P,IPRINT ; OUT IT GOES
|
||
HLRZ B,-2(TP)
|
||
CAIL B,-4 ; SEE IF DONE
|
||
JRST EXPEN
|
||
MOVE B,-4(TP) ; PRINT SPACE
|
||
PUSHJ P,SPACEQ
|
||
MOVE B,-2(TP) ; GET POINTER
|
||
MOVE A,4(B) ; DECL
|
||
MOVE B,5(B)
|
||
PUSHJ P,IPRINT
|
||
EXPEN: MOVE B,-4(TP) ; GET CHANNEL INTO B
|
||
MOVEI A,"] ; CLOSE SQUARE BRAKET
|
||
PUSHJ P,PRETIF
|
||
MOVE B,-4(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,SPACEQ
|
||
MOVE B,-2(TP)
|
||
HRRZ B,2(B)
|
||
MOVSI A,TFIX
|
||
PUSHJ P,IPRINT
|
||
MOVEI A,">
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,PRETIF
|
||
JRST PNEXT
|
||
|
||
PENT1: CAIN A,TATOM
|
||
JRST PENT2
|
||
ERRUUO EQUOTE BAD-ENTRY-BLOCK
|
||
|
||
; HERE TO PRINT TEMPLATED DATA STRUCTURE
|
||
|
||
TMPRNT: PUSH P,FLAGS ; SAVE FLAGS
|
||
MOVE A,(TP) ; GET POINTER
|
||
GETYP A,(A) ; GET SAT
|
||
PUSH P,A ; AND SAVE IT
|
||
MOVEI A,"{ ; OPEN SQUIGGLE
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,PRETIF ; PRINT WITH CHECKING
|
||
HLRZ A,(TP) ; GET AMOUNT RESTED OFF
|
||
SUBI A,1
|
||
PUSH P,A ; AND SAVE IT
|
||
MOVE A,-1(P) ; GET SAT
|
||
SUBI A,NUMSAT+1 ; FIXIT UP
|
||
HRLI A,(A)
|
||
ADD A,TD.LNT+1 ; CHECK FOR WINNAGE
|
||
JUMPGE A,BADTPL ; COMPLAIN
|
||
HRRZS C,(TP) ; GET LENGTH
|
||
XCT (A) ; INTO B
|
||
SUB B,(P) ; FUDGE FOR RESTS
|
||
MOVEI B,-1(B) ; FUDGE IT
|
||
PUSH P,B ; AND SAVE IT
|
||
|
||
TMPRN1: AOS C,-1(P) ; GET ELEMENT OF INTEREST
|
||
SOSGE (P) ; CHECK FOR ANY LEFT
|
||
JRST TMPRN2 ; ALL DONE
|
||
|
||
MOVE B,(TP) ; POINTER
|
||
HRRZ 0,-2(P) ; SAT
|
||
PUSHJ P,TMPLNT ; GET THE ITEM
|
||
MOVE FLAGS,-3(P) ; RESTORE FLAGS
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ; PRINT THIS ELEMENT
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
SKIPE (P) ; IF NOT LAST ONE THEN
|
||
PUSHJ P,SPACEQ ; SEPARATE WITH A SPACE
|
||
JRST TMPRN1
|
||
|
||
TMPRN2: SUB P,[4,,4]
|
||
MOVE B,-2(TP)
|
||
MOVEI A,"} ; CLOSE THIS GUY
|
||
PUSHJ P,PRETIF
|
||
JRST PNEXT
|
||
|
||
|
||
; RSUBR PRINTING ROUTINES. ON PRINTB CHANNELS, WRITES OUT
|
||
; COMPACT BINARY. ON PRINT CHANNELS ALL IS ASCII
|
||
|
||
PRSUBR: MOVE A,(TP) ; GET RSUBR IN QUESTION
|
||
GETYP A,(A) ; CHECK FOR PURE RSUBR
|
||
CAIN A,TPCODE
|
||
JRST PRSBRP ; PRINT IT SPECIAL WAY
|
||
|
||
TLNN FLAGS,BINBIT ; SKIP IF BINARY OUTPUT
|
||
JRST ARSUBR
|
||
|
||
PUSH P,FLAGS
|
||
MOVSI A,TRSUBR ; FIND FIXUPS
|
||
MOVE B,(TP)
|
||
HLRE D,1(B) ; -LENGTH OF CODE VEC
|
||
PUSH P,D ; SAVE SAME
|
||
MOVSI C,TATOM
|
||
MOVE D,IMQUOTE RSUBR
|
||
PUSHJ P,IGET ; GO GET THEM
|
||
JUMPE B,RCANT ; NO FIXUPS, BINARY LOSES
|
||
PUSH TP,A ; SAVE FIXUP LIST
|
||
PUSH TP,B
|
||
|
||
MOVNI A,1 ; USE ^C AS MARKER FOR RSUBR
|
||
MOVE FLAGS,-1(P) ; RESTORE FLAGS
|
||
MOVE B,-4(TP) ; GET CHANNEL FOR PITYO
|
||
PUSHJ P,PITYO ; OUT IT GOES
|
||
|
||
PRSBR1: MOVE B,-4(TP)
|
||
PUSHJ P,BFCLS1 ; FLUSH OUT CURRENT BUFFER
|
||
|
||
MOVE B,-4(TP) ; CHANNEL BACK
|
||
MOVN E,(P) ; LENGTH OF CODE
|
||
PUSH P,E
|
||
HRROI A,(P) ; POINT TO SAME
|
||
PUSHJ P,DOIOTO ; OUT GOES COUNT
|
||
MOVSI C,TCODE
|
||
MOVE PVP,PVSTOR+1
|
||
MOVEM C,ASTO(PVP) ; FOR IOT INTERRUPTS
|
||
MOVE A,-2(TP) ; GET POINTER TO CODE
|
||
MOVE A,1(A)
|
||
PUSHJ P,DOIOTO ; IOT IT OUT
|
||
POP P,E
|
||
ADDI E,1 ; UPDATE ACCESS
|
||
ADDM E,ACCESS(B)
|
||
MOVE PVP,PVSTOR+1
|
||
SETZM ASTO(PVP) ; UNSCREW A
|
||
|
||
; NOW PRINT OUT NORMAL RSUBR VECTOR
|
||
|
||
MOVE FLAGS,-1(P) ; RESTORE FLAGS
|
||
SUB P,[1,,1]
|
||
MOVE B,-2(TP) ; GET RSUBR VECTOR
|
||
PUSHJ P,PRBODY ; PRINT ITS BODY
|
||
|
||
; HERE TO PRINT BINARY FIXUPS
|
||
|
||
MOVEI E,0 ; 1ST COMPUTE LENGTH OF FIXUPS
|
||
SKIPN A,(TP) ; LIST TO A
|
||
JRST PRSBR5 ; EMPTY, DONE
|
||
JUMPL A,UFIXES ; JUMP IF FIXUPS IN UVECTOR FORM
|
||
ADDI E,1 ; FOR VERS
|
||
|
||
PRSBR6: HRRZ A,(A) ; NEXT?
|
||
JUMPE A,PRSBR5
|
||
GETYP B,(A)
|
||
CAIE B,TDEFER ; POSSIBLE STRING
|
||
JRST PRSBR7 ; COULD BE ATOM
|
||
MOVE B,1(A) ; POSSIBLE STRINGER
|
||
GETYP C,(B)
|
||
CAIE C,TCHSTR ; YES!!!
|
||
JRST BADFXU ; LOSING FIXUPS
|
||
HRRZ C,(B) ; # OF CHARS TO C
|
||
ADDI C,5+5 ; ROUND AND ADD FOR COUNT
|
||
IDIVI C,5 ; TO WORDS
|
||
ADDI E,(C)
|
||
JRST FIXLST ; COUNT FOR USE LIST ETC.
|
||
|
||
PRSBR7: GETYP B,(A) ; GET TYPE
|
||
CAIE B,TATOM
|
||
JRST BADFXU
|
||
ADDI E,1
|
||
|
||
FIXLST: HRRZ A,(A) ; REST IT TO OLD VAL
|
||
JUMPE A,BADFXU
|
||
GETYP B,(A) ; FIX?
|
||
CAIE B,TFIX
|
||
JRST BADFXU
|
||
MOVEI D,1
|
||
HRRZ A,(A) ; TO USE LIST
|
||
JUMPE A,BADFXU
|
||
GETYP B,(A)
|
||
CAIE B,TLIST
|
||
JRST BADFXU ; LOSER
|
||
MOVE C,1(A) ; GET LIST
|
||
|
||
PRSBR8: JUMPE C,PRSBR9
|
||
GETYP B,(C) ; TYPE OK?
|
||
CAIE B,TFIX
|
||
JRST BADFXU
|
||
HRRZ C,(C)
|
||
AOJA D,PRSBR8 ; LOOP
|
||
|
||
PRSBR9: ADDI D,2 ; ROUND UP
|
||
ASH D,-1 ; DIV BY 2 FOR TWO GOODIES PER HWORD
|
||
ADDI E,(D)
|
||
JRST PRSBR6
|
||
|
||
PRSBR5: PUSH P,E ; SAVE LENGTH OF FIXUPS
|
||
PUSH TP,$TUVEC ; SLOT FOR BUFFER POINTER
|
||
PUSH TP,[0]
|
||
|
||
PFIXU1: MOVE B,-6(TP) ; START LOOPING THROUGH CHANNELS
|
||
PUSHJ P,BFCLS1 ; FLUSH BUFFER
|
||
MOVE B,-6(TP) ; CHANNEL BACK
|
||
MOVEI C,BUFSTR-1(B) ; SETUP BUFFER
|
||
PUSHJ P,BYTDOP ; FIND D.W.
|
||
SUBI A,BUFLNT+1
|
||
HRLI A,-BUFLNT
|
||
MOVEM A,(TP)
|
||
MOVE E,(P) ; LENGTH OF FIXUPS
|
||
SETZB C,D ; FOR EOUT
|
||
PUSHJ P,EOUT
|
||
MOVE C,-2(TP) ; FIXUP LIST
|
||
MOVE E,1(C) ; HAVE VERS
|
||
PUSHJ P,EOUT ; OUT IT GOES
|
||
|
||
PFIXU2: HRRZ C,(C) ; FIRST THING
|
||
JUMPE C,PFIXU3 ; DONE?
|
||
GETYP A,(C) ; STRING OR ATOM
|
||
CAIN A,TATOM ; MUST BE STRING
|
||
JRST PFIXU4
|
||
MOVE A,1(C) ; POINT TO POINTER
|
||
HRRZ D,(A) ; LENGTH
|
||
IDIVI D,5
|
||
PUSH P,E ; SAVE REMAINDER
|
||
MOVEI E,1(D)
|
||
MOVNI D,(D)
|
||
MOVSI D,(D)
|
||
PUSH P,D
|
||
PUSHJ P,EOUT
|
||
MOVEI D,0
|
||
PFXU1A: MOVE A,1(C) ; RESTORE POINTER
|
||
HRRZ A,1(A) ; BYTE POINTER
|
||
ADD A,(P)
|
||
MOVE E,(A)
|
||
PUSHJ P,EOUT
|
||
MOVE A,[1,,1]
|
||
ADDB A,(P)
|
||
JUMPL A,PFXU1A
|
||
MOVE D,-1(P) ; LAST WORD
|
||
MOVE A,1(C)
|
||
HRRZ A,1(A)
|
||
ADD A,(P)
|
||
SKIPE E,D
|
||
MOVE E,(A) ; LAST WORD OF CHARS
|
||
IOR E,PADS(D)
|
||
PUSHJ P,EOUT ; OUT
|
||
SUB P,[1,,1]
|
||
JRST PFIXU5
|
||
|
||
PADS: ASCII /#####/
|
||
ASCII /####/
|
||
ASCII /###/
|
||
ASCII /##/
|
||
ASCII /#/
|
||
|
||
PFIXU4: HRRZ E,(C) ; GET CURRENT VAL
|
||
MOVE E,1(E)
|
||
MOVEM C,-2(TP)
|
||
PUSHJ P,ATOSQ ; GET SQUOZE
|
||
JRST BADFXU
|
||
TLO E,400000 ; USE TO DIFFERENTIATE BETWEEN STRING
|
||
PUSHJ P,EOUT
|
||
MOVE C,-2(TP)
|
||
|
||
; HERE TO WRITE OUT LISTS
|
||
|
||
PFIXU5: HRRZ C,(C) ; POINT TO CURRENT VALUE
|
||
HRLZ E,1(C)
|
||
HRRZ C,(C) ; POINT TO USES LIST
|
||
HRRZ D,1(C) ; GET IT
|
||
MOVEM C,-2(TP)
|
||
|
||
PFIXU6: TLCE D,400000 ; SKIP FOR RH
|
||
HRLZ E,1(D) ; SETUP LH
|
||
JUMPG D,.+3
|
||
HRR E,1(D)
|
||
PUSHJ P,EOUT ; WRITE IT OUT
|
||
HRR D,(D)
|
||
TRNE D,-1 ; SKIP IF DONE
|
||
JRST PFIXU6
|
||
|
||
TRNE E,-1 ; SKIP IF ZERO BYTE EXISTS
|
||
MOVEI E,0
|
||
PUSHJ P,EOUT
|
||
MOVE C,-2(TP)
|
||
JRST PFIXU2 ; DO NEXT
|
||
|
||
PFIXU3: HLRE C,(TP) ; -AMNT LEFT IN BUFFER
|
||
MOVN D,C ; PLUS SAME
|
||
ADDI C,BUFLNT ; WORDS USED TO C
|
||
JUMPE C,PFIXU7 ; NONE USED, LEAVE
|
||
MOVSS C ; START SETTING UP BTB
|
||
MOVN A,C ; ALSO FINAL IOT POINTER
|
||
HRR C,(TP) ; PDL POINTER PART OF BTB
|
||
SUBI C,1
|
||
HRLI D,400000+C ; CONTINUE SETTING UP BTB (400000 IS FOR MULTI
|
||
; SEGS
|
||
POP C,@D ; MOVE 'EM DOWN
|
||
TLNE C,-1
|
||
JRST .-2
|
||
HRRI A,@D ; OUTPUT POINTER
|
||
ADDI A,1
|
||
MOVSI B,TUVEC
|
||
MOVE PVP,PVSTOR+1
|
||
MOVEM B,ASTO(PVP)
|
||
MOVE B,-6(TP)
|
||
PUSHJ P,DOIOTO ; WRITE IT OUT
|
||
MOVE PVP,PVSTOR+1
|
||
SETZM ASTO(PVP)
|
||
|
||
PFIXU7: SUB TP,[4,,4]
|
||
SUB P,[2,,2]
|
||
JRST PNEXT
|
||
|
||
; ROUTINE TO OUTPUT CONTENTS OF E
|
||
|
||
EOUT: MOVE B,-6(TP) ; CHANNEL
|
||
AOS ACCESS(B)
|
||
MOVE A,(TP) ; BUFFER POINTER
|
||
MOVEM E,(A)
|
||
AOBJP A,.+3 ; COUNT AND GO
|
||
MOVEM A,(TP)
|
||
POPJ P,
|
||
|
||
SUBI A,BUFLNT ; SET UP IOT POINTER
|
||
HRLI A,-BUFLNT
|
||
MOVEM A,(TP) ; RESET SAVED POINTER
|
||
MOVSI 0,TUVEC
|
||
MOVE PVP,PVSTOR+1
|
||
MOVEM 0,ASTO(PVP)
|
||
MOVSI 0,TLIST
|
||
MOVEM 0,DSTO(PVP)
|
||
MOVEM 0,CSTO(PVP)
|
||
PUSHJ P,DOIOTO ; OUT IT GOES
|
||
MOVE PVP,PVSTOR+1
|
||
SETZM ASTO(PVP)
|
||
SETZM CSTO(PVP)
|
||
SETZM DSTO(PVP)
|
||
POPJ P,
|
||
|
||
; HERE IF UVECOR FORM OF FIXUPS
|
||
|
||
UFIXES: PUSH TP,$TUVEC
|
||
PUSH TP,A ; SAVE IT
|
||
|
||
UFIX1: MOVE B,-6(TP) ; GET SAME
|
||
PUSHJ P,BFCLS1 ; FLUSH OUT BUFFER
|
||
HLRE C,(TP) ; GET LENGTH
|
||
MOVMS C
|
||
PUSH P,C
|
||
HRROI A,(P) ; READY TO ZAP IT OUT
|
||
PUSHJ P,DOIOTO ; ZAP!
|
||
SUB P,[1,,1]
|
||
HLRE C,(TP) ; LENGTH BACK
|
||
MOVMS C
|
||
ADDI C,1
|
||
ADDM C,ACCESS(B) ; UPDATE ACCESS
|
||
MOVE A,(TP) ; NOW THE UVECTOR
|
||
MOVSI C,TUVEC
|
||
MOVE PVP,PVSTOR+1
|
||
MOVEM C,ASTO(PVP)
|
||
PUSHJ P,DOIOTO ; GO
|
||
MOVE PVP,PVSTOR+1
|
||
SETZM ASTO(PVP)
|
||
SUB P,[1,,1]
|
||
SUB TP,[4,,4]
|
||
JRST PNEXT
|
||
|
||
RCANT: ERRUUO EQUOTE RSUBR-LACKS-FIXUPS
|
||
|
||
|
||
BADFXU: ERRUUO EQUOTE BAD-FIXUPS
|
||
|
||
PRBODY: TDZA C,C ; FLAG SAYING FLUSH CODE
|
||
PRBOD1: MOVEI C,1 ; PRINT CODE ALSO
|
||
PUSH P,FLAGS
|
||
PUSH TP,$TRSUBR
|
||
PUSH TP,B
|
||
PUSH P,C
|
||
MOVEI A,"[ ; START VECTOR TEXT
|
||
MOVE B,-6(TP) ; GET CHANNEL FOR PITYO
|
||
PUSHJ P,PITYO
|
||
POP P,C
|
||
MOVE B,(TP) ; RSUBR BACK
|
||
JUMPN C,PRSON ; GO START PRINTING
|
||
MOVEI A,"0 ; PLACE SAVER FOR CODE VEC
|
||
MOVE B,-6(TP) ; GET CHANNEL FOR PITYO
|
||
PUSHJ P,PITYO
|
||
|
||
PRSBR2: MOVE B,[2,,2] ; BUMP VECTOR
|
||
ADDB B,(TP)
|
||
JUMPGE B,PRSBR3 ; NO SPACE IF LAST
|
||
MOVE B,-6(TP) ; GET CHANNEL FOR SPACEQ
|
||
PUSHJ P,SPACEQ
|
||
SKIPA B,(TP) ; GET BACK POINTER
|
||
PRSON: JUMPGE B,PRSBR3
|
||
GETYP 0,(B) ; SEE IF RSUBR POINTED TO
|
||
CAIE 0,TQENT
|
||
CAIN 0,TENTER
|
||
JRST .+5 ; JUMP IF RSUBR ENTRY
|
||
CAIN 0,TQRSUB
|
||
JRST .+3
|
||
CAIE 0,TRSUBR ; YES!
|
||
JRST PRSB10 ; COULD BE SUBR/FSUBR
|
||
MOVE C,1(B) ; GET RSUBR
|
||
PUSH P,0 ; SAVE TYPE FOUND
|
||
GETYP 0,2(C) ; SEE IF ATOM
|
||
CAIE 0,TATOM
|
||
JRST PRSBR4
|
||
MOVE B,3(C) ; GET ATOM NAME
|
||
PUSHJ P,IGVAL ; GO LOOK
|
||
MOVE C,(TP) ; ORIG RSUBR BACK
|
||
GETYP A,A
|
||
POP P,0 ; DESIRED TYPE
|
||
CAIE 0,(A) ; SAME TYPE
|
||
JRST PRSBR4
|
||
MOVE D,1(C)
|
||
MOVE 0,3(D) ; NAME OF RSUBR IN QUESTION
|
||
CAME 0,3(B) ; WIN?
|
||
JRST PRSBR4
|
||
HRRZ E,C
|
||
MOVSI A,TATOM
|
||
MOVE B,0 ; GET ATOM
|
||
MOVE FLAGS,(P)
|
||
JRST PRS101
|
||
|
||
PRSBR4: MOVE FLAGS,(P) ; RESTORE FLAGS
|
||
MOVE B,(TP)
|
||
MOVE A,(B)
|
||
MOVE B,1(B) ; PRINT IT
|
||
PRS101: PUSH TP,-7(TP) ; PUSH CHANNEL FOR IPRINT
|
||
PUSH TP,-7(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2] ; POP OFF CHANNEL
|
||
MOVE B,-2(TP) ; MOVE IN CHANNEL
|
||
JRST PRSBR2
|
||
|
||
PRSB10: CAIE 0,TSUBR ; SUBR?
|
||
CAIN 0,TFSUBR
|
||
JRST .+2
|
||
JRST PRSBR4
|
||
MOVE C,1(B) ; GET LOCN OF SUBR OR FSUBR
|
||
MOVE B,@-1(C) ; NAME OF IT
|
||
MOVSI A,TATOM ; AND TYPE
|
||
JRST PRS101
|
||
|
||
PRSBR3: MOVEI A,"]
|
||
MOVE B,-6(TP)
|
||
PUSHJ P,PRETIF ; CLOSE IT UP
|
||
SUB TP,[2,,2] ; FLUSH CRAP
|
||
POP P,FLAGS
|
||
POPJ P,
|
||
|
||
|
||
; HERE TO PRINT PURE RSUBRS
|
||
|
||
PRSBRP: MOVEI A,2 ; WILL "%<" FIT?
|
||
MOVE B,-2(TP) ; GET CHANNEL FOR RETIF
|
||
PUSHJ P,RETIF
|
||
MOVEI A,"%
|
||
PUSHJ P,PITYO
|
||
MOVEI A,"<
|
||
PUSHJ P,PITYO
|
||
MOVSI A,TATOM
|
||
MOVE B,IMQUOTE RSUBR
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ; PRINT IT OUT
|
||
SUB TP,[2,,2] ; POP OFF CHANNEL
|
||
MOVE B,-2(TP)
|
||
PUSHJ P,SPACEQ ; MAYBE SPACE
|
||
MOVEI A,"' ; QUOTE THE VECCTOR
|
||
PUSHJ P,PRETIF
|
||
MOVE B,(TP) ; GET RSUBR BODY BACK
|
||
PUSH TP,$TFIX ; STUFF THE STACK
|
||
PUSH TP,[0]
|
||
PUSHJ P,PRBOD1 ; PRINT AND UNLINK
|
||
SUB TP,[2,,2] ; GET JUNK OFF STACK
|
||
MOVE B,-2(TP) ; GET CHANNEL FOR RETIF
|
||
MOVEI A,">
|
||
PUSHJ P,PRETIF
|
||
JRST PNEXT
|
||
|
||
; HERE TO PRINT ASCII RSUBRS
|
||
|
||
ARSUBR: PUSH P,FLAGS ; SAVE FROM GET
|
||
MOVSI A,TRSUBR
|
||
MOVE B,(TP)
|
||
MOVSI C,TATOM
|
||
MOVE D,IMQUOTE RSUBR
|
||
PUSHJ P,IGET ; TRY TO GET FIXUPS
|
||
POP P,FLAGS
|
||
JUMPE B,PUNK ; NO FIXUPS LOSE
|
||
GETYP A,A
|
||
CAIE A,TLIST ; ARE FIXUPS A LIST?
|
||
JRST PUNK ; NO, AGAIN LOSE
|
||
PUSH TP,$TLIST
|
||
PUSH TP,B ; SAVE FIXUPS
|
||
MOVEI A,17.
|
||
MOVE B,-4(TP)
|
||
PUSHJ P,RETIF
|
||
PUSH P,[440700,,[ASCIZ /%<FIXUP!-RSUBRS!-/]]
|
||
|
||
AL1: ILDB A,(P) ; GET CHAR
|
||
JUMPE A,.+3
|
||
PUSHJ P,PITYO
|
||
JRST AL1
|
||
|
||
SUB P,[1,,1]
|
||
PUSHJ P,SPACEQ
|
||
|
||
MOVEI A,"'
|
||
PUSHJ P,PRETIF ; QUOTE TO AVOID ADDITIONAL EVAL
|
||
MOVE B,-2(TP) ; PRINT ACTUAL KLUDGE
|
||
PUSHJ P,PRBOD1
|
||
MOVE B,-4(TP) ; GET CHANNEL FOR SPACEQ
|
||
PUSHJ P,SPACEQ
|
||
MOVEI A,"' ; DONT EVAL FIXUPS EITHER
|
||
PUSHJ P,PRETIF
|
||
POP TP,B
|
||
POP TP,A
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
MOVEI A,">
|
||
PUSHJ P,PRETIF
|
||
JRST PNEXT
|
||
|
||
; HERE TO DO OFFSETS: %<OFFSET N '<VECTOR FIX FLOAT>>
|
||
|
||
POFFSE: MOVEI A,2
|
||
MOVE B,-2(TP)
|
||
PUSHJ P,RETIF
|
||
MOVEI A,"%
|
||
PUSHJ P,PITYO
|
||
MOVEI A,"<
|
||
PUSHJ P,PITYO
|
||
MOVSI A,TATOM
|
||
MOVE B,MQUOTE OFFSET
|
||
PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2]
|
||
MOVE B,-2(TP) ; RESTORE CHANNEL
|
||
PUSHJ P,SPACEQ
|
||
MOVSI A,TFIX
|
||
HRRE B,(TP) ; PICK UPTHE FIX
|
||
PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2]
|
||
MOVE B,-2(TP) ; RESTORE CHANNEL
|
||
PUSHJ P,SPACEQ
|
||
HLRZ A,(TP)
|
||
JUMPE A,POFFS2
|
||
GETYP B,(A)
|
||
CAIE B,TFORM ; FORMS HAVE TO BE QUOTED
|
||
JRST POFFS1
|
||
MOVEI A,"'
|
||
MOVE B,-2(TP)
|
||
PUSHJ P,PRETIF
|
||
POFFS1: HLRZ B,(TP)
|
||
MOVE A,(B)
|
||
MOVE B,1(B)
|
||
POFFPT: PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2]
|
||
MOVE B,-2(TP) ; RESTORE CHANNEL
|
||
MOVEI A,">
|
||
PUSHJ P,PRETIF
|
||
JRST PNEXT
|
||
; PRINT 'ANY' IF 0
|
||
POFFS2: MOVSI A,TATOM
|
||
MOVE B,IMQUOTE ANY
|
||
JRST POFFPT
|
||
|
||
; HERE TO DO LOCATIVES (PRINT CONTENTS THEREOF)
|
||
|
||
LOCP: PUSH TP,-1(TP)
|
||
PUSH TP,-1(TP)
|
||
PUSH P,0
|
||
MCALL 1,IN ; GET ITS CONTENTS FROM "IN"
|
||
POP P,0
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ; PRINT IT
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
JRST PNEXT
|
||
;INTERNAL SUBROUTINE TO HANDLE CHARACTER OUTPUT
|
||
;B CONTAINS CHANNEL
|
||
;PRINTER ITYO USED FOR FLATSIZE FAKE OUT
|
||
PITYO: TLNN FLAGS,FLTBIT
|
||
JRST ITYO
|
||
PITYO1: PUSH TP,[TTP,,0] ; PUSH ON TP POINTER
|
||
PUSH TP,B
|
||
TLNE FLAGS,UNPRSE ;SKIPS UNPRSE NOT SET
|
||
JRST ITYO+2
|
||
AOS FLTSIZ ;FLATSIZE DOESN'T PRINT
|
||
;INSTEAD IT COUNTS THE CHARACTERS THAT WOULD BE OUTPUT
|
||
SOSGE FLTMAX ;UNLESS THE MAXIMUM IS EXCEEDED
|
||
JRST .+4
|
||
POP TP,B ; GET CHANNEL BACK
|
||
SUB TP,[1,,1]
|
||
POPJ P,
|
||
MOVEI E,(B) ; GET POINTER FOR UNBINDING
|
||
PUSHJ P,SSPEC1
|
||
MOVE P,UPB+8 ; RESTORE P
|
||
POP TP,B ; GET BACK TP POINTER
|
||
PUSH P,0 ; SAVE FLAGS
|
||
MOVE TP,B ; RESTORE TP
|
||
MOVEI C,(TB) ; SEE IF TB IS CORRECT
|
||
CAIG C,1(TP) ; SKIP IF NEEDS UNWINDING
|
||
JRST PITYO4
|
||
PITYO3: MOVEI C,(TB)
|
||
CAILE C,1(TP)
|
||
JRST PITYO2
|
||
MOVEI A,PITYO4 ; SET UP PARAMETERS TO BE RESTORED BY FINIS
|
||
HRRM A,PCSAV(C)
|
||
MOVEM TP,TPSAV(C)
|
||
MOVE SP,SPSTOR+1
|
||
MOVEM SP,SPSAV(C)
|
||
MOVEM P,PSAV(C)
|
||
MOVE TB,D ; SET TB TO ONE FRAME AHEAD
|
||
JRST FINIS
|
||
PITYO4: POP P,0 ; RESTORE FLAGS
|
||
MOVSI A,TFALSE ;IN WHICH CASE IT IMMEDIATELY GIVES UP AND RETURNS FALSE
|
||
MOVEI B,0
|
||
POPJ P,
|
||
|
||
PITYO2: MOVE D,TB ; SAVE ONE FRAME AHEAD
|
||
HRR TB,OTBSAV(TB) ; RESTORE TB
|
||
JRST PITYO3
|
||
|
||
|
||
;THE REAL THING
|
||
;NOTE THAT THE FOLLOWING CODE HAS BUGS IF IT IS PRINTING OUT LONG
|
||
;CHARACTER STRINGS
|
||
; (NOTE THAT THE ABOVE COMMENT, IF TRUE, SHOULD NOT BE ADMITTED.)
|
||
ITYO: PUSH TP,$TCHAN
|
||
PUSH TP,B
|
||
PUSH P,FLAGS ;SAVE STUFF
|
||
PUSH P,C
|
||
PUSH P,A ;SAVE OUTPUT CHARACTER
|
||
|
||
|
||
TLNE FLAGS,UNPRSE ;SKIPS UNPRSE NOT SET
|
||
JRST UNPROUT ;IF FROM UNPRSE, STASH IN STRING
|
||
CAIN A,^J
|
||
PUSHJ P,INTCHK
|
||
PUSH P,A
|
||
PUSHJ P,WXCT
|
||
POP P,A
|
||
CAIE A,^L ;SKIP IF THIS IS A FORM-FEED
|
||
JRST NOTFF
|
||
SETZM LINPOS(B) ;ZERO THE LINE NUMBER
|
||
JRST ITYXT
|
||
|
||
NOTFF: CAIE A,15 ;SKIP IF IT IS A CR
|
||
JRST NOTCR
|
||
SETZM CHRPOS(B) ;ZERO THE CHARACTER POSITION
|
||
PUSHJ P,AOSACC ; BUMP COUNT
|
||
JRST ITYXT1
|
||
|
||
NOTCR: CAIN A,^I ;SKIP IF NOT TAB
|
||
JRST TABCNT
|
||
CAIE A,10 ; BACK SPACE
|
||
JRST .+3
|
||
SOS CHRPOS(B) ; BACK UP ONE
|
||
JRST ITYXT
|
||
CAIE A,^J ;SKIP IF LINE FEED
|
||
JRST NOTLF
|
||
AOS C,LINPOS(B) ;ADD ONE TO THE LINE NUMBER
|
||
CAMLE C,PAGLN(B) ;SKIP IF THIS DOESN'T TAKES US PAST PAGE END
|
||
SETZM LINPOS(B)
|
||
MOVE FLAGS,-2(P)
|
||
JRST ITYXT
|
||
|
||
INTCHK: HRRZ 0,-2(B) ; GET CHANNELS FLAGS
|
||
TRNN 0,C.INTL ; LOSER INTERESTED IN LFS?
|
||
POPJ P, ; LEAVE IF NOTHING TO DO
|
||
PUSH TP,$TCHAN
|
||
PUSH TP,B ; SAVE CHANNEL
|
||
PUSH P,C
|
||
PUSH P,E
|
||
PUSHJ P,GTLPOS ; READ SYSTEMS VERSION OF LINE #
|
||
PUSH TP,$TATOM
|
||
PUSH TP,MQUOTE CHAR,CHAR,INTRUP
|
||
PUSH TP,$TFIX
|
||
PUSH TP,A
|
||
PUSH TP,$TCHAN
|
||
PUSH TP,B
|
||
MCALL 3,INTERRUPT
|
||
POP P,E ; RESTORE POSSIBLE COUNTS
|
||
POP P,C
|
||
POP TP,B ; RESTORE CHANNEL
|
||
SUB TP,[1,,1]
|
||
MOVEI A,^J
|
||
POPJ P,
|
||
|
||
NOTLF: CAIGE A,40
|
||
AOS CHRPOS(B) ; FOR CONTROL CHARS THAT NEED 2 SPACES
|
||
AOS CHRPOS(B) ;ADD TO CHARACTER NUMBER
|
||
|
||
ITYXT: PUSHJ P,AOSACC ; BUMP ACCESS
|
||
ITYXT1: POP P,A ;RESTORE THE ORIGINAL CHARACTER
|
||
|
||
ITYRET: POP P,C ;RESTORE REGS & RETURN
|
||
POP P,FLAGS
|
||
POP TP,B ; GET CHANNEL BACK
|
||
SUB TP,[1,,1]
|
||
POPJ P,
|
||
|
||
TABCNT: PUSH P,D
|
||
MOVE C,CHRPOS(B)
|
||
ADDI C,8. ;INCREMENT COUNT BY EIGHT (MOD EIGHT)
|
||
IDIVI C,8.
|
||
IMULI C,8.
|
||
MOVEM C,CHRPOS(B) ;REPLACE COUNT
|
||
POP P,D
|
||
JRST ITYXT
|
||
|
||
UNPROUT: POP P,A ;GET BACK THE ORIG CHAR
|
||
IDPB A,UPB+2 ;DEPOSIT USING BYTE POINTER I PUSHED LONG AGO
|
||
SOS UPB+1
|
||
JRST ITYRET ;RETURN
|
||
|
||
AOSACC: TLNN FLAGS,BINBIT
|
||
JRST NRMACC
|
||
AOS C,ACCESS-1(B) ; COUNT CHARS IN WORD
|
||
CAMN C,[TFIX,,1]
|
||
AOS ACCESS(B)
|
||
CAMN C,[TFIX,,5]
|
||
HLLZS ACCESS-1(B)
|
||
POPJ P,
|
||
|
||
NRMACC: AOS ACCESS(B)
|
||
POPJ P,
|
||
|
||
SPACEQ: MOVEI A,40
|
||
TLNE FLAGS,FLTBIT+BINBIT
|
||
JRST PITYO ; JUST OUTPUT THE SPACE
|
||
PUSH P,[1] ; PRINT SPACE IF NOT END OF LINE
|
||
MOVEI A,1
|
||
JRST RETIF2
|
||
|
||
RETIF1: MOVEI A,1
|
||
|
||
RETIF: PUSH P,[0]
|
||
TLNE FLAGS,FLTBIT+BINBIT
|
||
JRST SPOPJ ; IF WE ARE IN FLATSIZE THEN ESCAPE
|
||
RETIF2: PUSH P,FLAGS
|
||
RETCH: PUSH P,A
|
||
|
||
RETCH1: ADD A,CHRPOS(B) ;ADD THE CHARACTER POSITION
|
||
SKIPN CHRPOS(B) ; IF JUST RESET, DONT DO IT AGAIN
|
||
JRST RETXT
|
||
CAMG A,LINLN(B) ;SKIP IF GREATER THAN LINE LENGTH
|
||
JRST RETXT1
|
||
|
||
MOVEI A,^M ;FORCE A CARRIAGE RETURN
|
||
SETZM CHRPOS(B)
|
||
PUSHJ P,WXCT
|
||
PUSHJ P,AOSACC ; BUMP CHAR COUNT
|
||
MOVEI A,^J ;AND FORCE A LINE FEED
|
||
PUSHJ P,INTCHK ; CHECK FOR ^J INTERRUPTS
|
||
PUSHJ P,WXCT
|
||
PUSHJ P,AOSACC ; BUMP CHAR COUNT
|
||
AOS A,LINPOS(B)
|
||
CAMG A,PAGLN(B) ;AT THE END OF THE PAGE ?
|
||
JRST RETXT
|
||
; MOVEI A,^L ;IF SO FORCE A FORM FEED
|
||
; PUSHJ P,WXCT
|
||
; PUSHJ P,AOSACC ; BUMP CHAR COUNT
|
||
SETZM LINPOS(B)
|
||
|
||
RETXT: POP P,A
|
||
|
||
POP P,FLAGS
|
||
SPOPJ: SUB P,[1,,1]
|
||
POPJ P, ;RETURN
|
||
|
||
PRETIF: PUSH P,A ;SAVE CHAR
|
||
PUSHJ P,RETIF1
|
||
POP P,A
|
||
JRST PITYO
|
||
|
||
RETIF3: TLNE FLAGS,FLTBIT ; NOTHING ON FLATSIZE
|
||
POPJ P,
|
||
PUSH P,[0]
|
||
PUSH P,FLAGS
|
||
HRRI FLAGS,2 ; PRETEND ONLY 1 CHANNEL
|
||
PUSH P,A
|
||
JRST RETCH1
|
||
|
||
RETXT1: SKIPN -2(P) ; SKIP IF SPACE HACK
|
||
JRST RETXT
|
||
MOVEI A,40
|
||
PUSHJ P,WXCT
|
||
AOS CHRPOS(B)
|
||
PUSH P,C
|
||
PUSHJ P,AOSACC
|
||
POP P,C
|
||
JRST RETXT
|
||
|
||
;THIS IS CODE TO HANDLE UNKNOWN DATA TYPES.
|
||
;IT PRINTS "*XXXXXX*XXXXXXXXXXXX*", WHERE THE FIRST NUMBER IS THE
|
||
;TYPE CODE IN OCTAL, THE SECOND IS THE VALUE FIELD IN OCTAL.
|
||
PRERR: MOVEI A,21. ;CHECK FOR 21. SPACES LEFT ON PRINT LINE
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF ;INSERT CARRIAGE RETURN IF NOT ENOUGH
|
||
MOVEI A,"* ;JUNK TO INDICATE ERROR PRINTOUT IN OCTAL
|
||
PUSHJ P,PITYO ;TYPE IT
|
||
|
||
MOVE E,[000300,,-2(TP)] ;GET POINTER INDEXED OFF TP SO THAT
|
||
;TYPE CODE MAY BE OBTAINED FOR PRINTING.
|
||
MOVEI D,6 ;# OF OCTAL DIGITS IN HALF WORD
|
||
OCTLP1: ILDB A,E ;GET NEXT 3-BIT BYTE OF TYPE CODE
|
||
IORI A,60 ;OR-IN 60 FOR ASCII DIGIT
|
||
PUSHJ P,PITYO ;PRINT IT
|
||
SOJG D,OCTLP1 ;REPEAT FOR SIX CHARACTERS
|
||
|
||
PRE01: MOVEI A,"* ;DELIMIT TYPE CODE FROM VALUE FIELD
|
||
PUSHJ P,PITYO
|
||
|
||
HRLZI E,(410300,,(TP)) ;BYTE POINTER TO SECOND WORD
|
||
;INDEXED OFF TP
|
||
MOVEI D,12. ;# OF OCTAL DIGITS IN A WORD
|
||
OCTLP2: LDB A,E ;GET 3 BITS
|
||
IORI A,60 ;CONVERT TO ASCII
|
||
PUSHJ P,PITYO ;PRINT IT
|
||
IBP E ;INCREMENT POINTER TO NEXT BYTE
|
||
SOJG D,OCTLP2 ;REPEAT FOR 12. CHARS
|
||
|
||
MOVEI A,"* ;DELIMIT END OF ERROR TYPEOUT
|
||
PUSHJ P,PITYO ;REPRINT IT
|
||
|
||
JRST PNEXT ;RESTORE REGS & POP UP ONE LEVEL TO CALLER
|
||
|
||
POCTAL: MOVEI A,14. ;RETURN TO NEW LINE IF 14. SPACES NOT LEFT
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF
|
||
JRST PRE01 ;PRINT VALUE AS "*XXXXXXXXXXXX*"
|
||
|
||
;PRINT BINARY INTEGERS IN DECIMAL.
|
||
;
|
||
PFIX: MOVM E,(TP) ; GET # (MAFNITUDE)
|
||
JUMPL E,POCTAL ; IF ABS VAL IS NEG, MUST BE SETZ
|
||
PUSH P,FLAGS
|
||
|
||
PFIX1: MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PFIX2: MOVE D,UPB+6 ; IF UNPARSE, THIS IS RADIX
|
||
TLNE FLAGS,UNPRSE+FLTBIT ;SKIPS IF NOT FROM UNPARSE OR FLATSIZE
|
||
JRST PFIXU
|
||
MOVE D,RADX(B) ; GET OUTPUT RADIX
|
||
PFIXU: CAIG D,1 ; DONT ALLOW FUNNY RADIX
|
||
MOVEI D,10. ; IF IN DOUBT USE 10.
|
||
PUSH P,D
|
||
MOVEI A,1 ; START A COUNTER
|
||
SKIPGE B,(TP) ; CHECK SIGN
|
||
MOVEI A,2 ; NEG, NEED CHAR FOR SIGN
|
||
|
||
IDIV B,D ; START COUNTING
|
||
JUMPE B,.+2
|
||
AOJA A,.-2
|
||
|
||
MOVE B,-2(TP) ; CHANNEL TO B
|
||
TLNN FLAGS,FLTBIT+BINBIT
|
||
PUSHJ P,RETIF3 ; CHECK FOR C.R.
|
||
MOVE B,-2(TP) ; RESTORE CHANNEL
|
||
MOVEI A,"- ; GET SIGN
|
||
SKIPGE (TP) ; SKIP IF NOT NEEDED
|
||
PUSHJ P,PITYO
|
||
MOVM C,(TP) ; GET MAGNITUDE OF #
|
||
MOVE B,-2(TP) ; RESTORE CHANNEL
|
||
POP P,E ; RESTORE RADIX
|
||
PUSHJ P,FIXTYO ; WRITE OUT THE #
|
||
MOVE FLAGS,-1(P)
|
||
SUB P,[1,,1] ; FLUSH P STUFF
|
||
JRST PNEXT
|
||
|
||
FIXTYO: IDIV C,E
|
||
PUSH P,D ; SAVE REMAINDER
|
||
SKIPE C
|
||
PUSHJ P,FIXTYO
|
||
POP P,A ; START GETTING #'S BACK
|
||
ADDI A,60
|
||
MOVE B,-2(TP) ; CHANNEL BACK
|
||
JRST PITYO
|
||
|
||
;PRINT SINGLE-PRECISION FLOATING POINT NUMBERS IN DECIMAL.
|
||
;
|
||
PFLOAT: SKIPN A,(TP) ; SKIP IF NUMBER IS NON-ZERO
|
||
; SPECIAL HACK FOR ZERO)
|
||
JRST PFLT0 ; HACK THAT ZERO
|
||
MOVM E,A ; CHECK FOR NORMALIZED
|
||
TLNN E,400 ; NORMALIZED
|
||
JRST PUNK
|
||
MOVE E,[SETZ FLOATB] ;ADDRESS OF FLOATING POINT CONVERSION ROUTINE
|
||
MOVE D,[6,,6] ;# WORDS TO GET FROM STACK
|
||
|
||
PNUMB: HRLI A,1(P) ; LH(A) TO CONTAIN ADDRESS OF RETURN AREA
|
||
; ON STACK
|
||
HRR A,TP ; RH(A) TO CONTAIN ADDRESS OF DATA ITEM
|
||
HLRZ B,A ; SAVE RETURN AREA ADDRESS IN REG B
|
||
ADD P,D ; ADD # WORDS OF RETURN AREA TO BOTH HALVES OF
|
||
; SP
|
||
JUMPGE P,PDLERR ; PLUS OR ZERO STACK POINTER IS OVERFLOW
|
||
PDLWIN: PUSHJ P,(E) ; CALL ROUTINE WHOSE ADDRESS IS IN REG E
|
||
|
||
MOVE C,(B) ; GET COUNT 0F # CHARS RETURNED
|
||
PFLT1: MOVE A,B
|
||
HRR B,P ; GET PSTACK POINTER AND PRODUCE RELATAVIZED
|
||
SUB A,B
|
||
HRLS A ; ADD TO AOBJN
|
||
ADD A,P ; PRODUCE PDL POINTER
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSH TP,$TPDL ; PUSH PDL POINTER
|
||
PUSH TP,A
|
||
MOVE A,C ; MAKE SURE THAT # WILL FIT ON PRINT LINE
|
||
PUSH P,D ; WATCH THAT MCALL
|
||
PUSHJ P,RETIF ; START NEW LINE IF IT WON'T
|
||
POP P,D
|
||
POP TP,B ; RESTORE B
|
||
SUB TP,[1,,1] ; CLEAN OFF STACK
|
||
|
||
HRLI B,000700 ;MAKE REG B INTO BYTE POINTER TO FIRST CHAR
|
||
; LESS ONE
|
||
PNUM01: ILDB A,B ; GET NEXT BYTE
|
||
PUSH P,B ; SAVE B
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,PITYO ; PRINT IT
|
||
POP P,B ; RESTORE B
|
||
SOJG C,PNUM01 ; DECREMENT CHAR COUNT: LOOP IF NON-ZERO
|
||
|
||
SUB P,D ;SUBTRACT # WORDS USED ON STACK FOR RETURN
|
||
JRST PNEXT ;STORE REGS & POP UP ONE LEVEL TO CALLER
|
||
|
||
|
||
PFLT0: MOVEI A,9. ; WIDTH OF 0.0000000
|
||
MOVEI C,9. ; SEE ABOVE
|
||
MOVEI D,0 ; WE'RE GONNA TEST D SOON...SO WILL DO RIGHT THING
|
||
MOVEI B,[ASCII /0.0000000/]
|
||
SOJA B,PFLT1 ; PT TO 1 BELOW CONST, THEN REJOIN CODE
|
||
|
||
|
||
|
||
|
||
PDLERR: SUB P,D ;REST STACK POINTER
|
||
REPEAT 6,PUSH P,[0]
|
||
JRST PDLWIN
|
||
|
||
; FLOATING POINT PRINTER STOLEN FROM DDT
|
||
|
||
F==E+1
|
||
G==F+1
|
||
H==G+1
|
||
I==H+1
|
||
J==I+1
|
||
TEM1==I
|
||
|
||
FLOATB: PUSH P,B
|
||
PUSH P,C
|
||
PUSH P,D
|
||
PUSH P,F
|
||
PUSH P,G
|
||
PUSH P,H
|
||
PUSH P,I
|
||
PUSH P,0
|
||
PUSH P,J
|
||
MOVSI 0,440700 ; BUILD BYTEPNTR
|
||
HLRZ J,A ; POINT TO BUFFER
|
||
HRRI 0,1(J)
|
||
ANDI A,-1
|
||
MOVE A,(A) ; GET NUMBER
|
||
MOVE D,A
|
||
SETZM (J) ; Clear counter
|
||
PUSHJ P,NFLOT
|
||
POP P,J
|
||
POP P,0
|
||
POP P,I
|
||
POP P,H
|
||
POP P,G
|
||
POP P,F
|
||
POP P,D
|
||
POP P,C
|
||
POP P,B
|
||
POPJ P,
|
||
|
||
; at this point we enter code abstracted from DDT.
|
||
NFLOT: JUMPG A,TFL1
|
||
JUMPE A,FP1A
|
||
MOVNS A
|
||
PUSH P,A
|
||
MOVEI A,"-
|
||
PUSHJ P,CHRO
|
||
POP P,A
|
||
TLZE A,400000
|
||
JRST FP1A
|
||
|
||
TFL1: MOVEI B,0
|
||
TFLX: CAMGE A,FT01
|
||
JRST FP4
|
||
CAML A,FT8
|
||
AOJA B,FP4
|
||
FP1A:
|
||
FP3: SETZB C,TEM1 ; CLEAR DIGIT CNTR, C TO RECEIVE FRACTION
|
||
MULI A,400
|
||
ASHC B,-243(A)
|
||
MOVE A,B
|
||
PUSHJ P,FP7
|
||
PUSH P,A
|
||
MOVEI A,".
|
||
PUSHJ P,CHRO
|
||
POP P,A
|
||
MOVNI A,10
|
||
ADD A,TEM1
|
||
MOVE E,C
|
||
FP3A: MOVE D,E
|
||
MULI D,12
|
||
PUSHJ P,FP7B
|
||
SKIPE E
|
||
AOJL A,FP3A
|
||
POPJ P, ; ONE return from OFLT here
|
||
|
||
FP4: MOVNI C,6
|
||
MOVEI F,0
|
||
FP4A: ADDI F,1(F)
|
||
XCT FCP(B)
|
||
SOSA F
|
||
FMPR A,@FXP+1(B)
|
||
AOJN C,FP4A
|
||
PUSH P,EXPSGN(B)
|
||
PUSHJ P,FP3
|
||
PUSH P,A
|
||
MOVEI A,"E
|
||
PUSHJ P,CHRO
|
||
POP P,A
|
||
POP P,D
|
||
PUSHJ P,FDIGIT
|
||
MOVE A,F
|
||
|
||
FP7: SKIPE A ; AVOID AOSING TEM1, NOT SIGNIFICANT DIGIT
|
||
AOS TEM1
|
||
IDIVI A,12
|
||
PUSH P,B
|
||
JUMPE A,FP7A1
|
||
PUSHJ P,FP7
|
||
|
||
FP7A1: POP P,D
|
||
FP7B: ADDI D,"0
|
||
|
||
; type digit
|
||
FDIGIT: PUSH P,A
|
||
MOVE A,D
|
||
PUSHJ P,CHRO
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
CHRO: AOS (J) ; COUNT CHAR
|
||
IDPB A,0 ; STUFF CHAR
|
||
POPJ P,
|
||
|
||
; constants
|
||
1.0^32.
|
||
1.0^16.
|
||
FT8: 1.0^8
|
||
1.0^4
|
||
1.0^2
|
||
1.0^1
|
||
FT: 1.0^0
|
||
1.0^-32.
|
||
1.0^-16.
|
||
1.0^-8
|
||
1.0^-4
|
||
1.0^-2
|
||
FT01: 1.0^-1
|
||
FT0=FT01+1
|
||
|
||
; instructions
|
||
FCP: CAMLE A, FT0(C)
|
||
CAMGE A, FT(C)
|
||
0, FT0(C)
|
||
FXP: SETZ FT0(C)
|
||
SETZ FT(C)
|
||
SETZ FT0(C)
|
||
EXPSGN: "-
|
||
"+
|
||
|
||
|
||
;PRINT SHORT (ONE WORD) CHARACTER STRINGS
|
||
|
||
PCHRS: MOVEI A,3 ;MAX # CHARS PLUS 2 (LESS ESCAPES)
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
TLNE FLAGS,NOQBIT ;SKIP IF QUOTES WILL BE USED
|
||
MOVEI A,1 ;ELSE, JUST ONE CHARACTER POSSIBLE
|
||
PUSHJ P,RETIF ;NEW LINE IF INSUFFICIENT SPACE
|
||
TLNE FLAGS,NOQBIT ;DON'T QUOTE IF IN PRINC MODE
|
||
JRST PCASIS
|
||
MOVEI A,"! ;TYPE A EXCL
|
||
PUSHJ P,PITYO
|
||
MOVEI A,"\ ;AND A BACK SLASH
|
||
PUSHJ P,PITYO
|
||
|
||
PCASIS: MOVE A,(TP) ;GET NEXT BYTE FROM WORD
|
||
TLNE FLAGS,NOQBIT ;SKIP IF WE ARE NOT IN PRINC MODE (NOQBIT=0)
|
||
JRST PCPRNT ;IF BIT IS ON, PRINT WITHOUT ESCAPING
|
||
CAIE A,ESCHAR ;SKIP IF NOT THE ESCAPE CHARACTER
|
||
JRST PCPRNT ;ESCAPE THE ESCAPE CHARACTER
|
||
|
||
ESCPRT: MOVEI A,ESCHAR ;TYPE THE ESCAPE CHARACTER
|
||
PUSHJ P,PITYO
|
||
PCPRNT: MOVE A,(TP) ;GET THE CHARACTER AGAIN
|
||
TLNE FLAGS,NOQBIT ;SKIP IF WE ARE NOT IN PRINC MODE (NOQBIT=0)
|
||
TLO FLAGS,CNTLPC ;SWITCH ON ^P MODE TEMPORARY
|
||
PUSHJ P,PITYO ;PRINT IT
|
||
TLZ FLAGS,CNTLPC ;SWITCH OFF ^P MODE
|
||
JRST PNEXT
|
||
|
||
|
||
;PRINT DEFERED (INVISIBLE) ITEMS. (PRINTED AS THE THING POINTED TO)
|
||
;
|
||
PDEFER: MOVE A,(B) ;GET FIRST WORD OF ITEM
|
||
MOVE B,1(B) ;GET SECOND
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ;PRINT IT
|
||
SUB TP,[2,,2] ; POP OFF CHANNEL
|
||
JRST PNEXT ;GO EXIT
|
||
|
||
|
||
; Print an ATOM. TRAILERS are added if the atom is not in the current
|
||
; lexical path. Also escaping of charactets is performed to allow READ
|
||
; to win.
|
||
|
||
PATOM: PUSH P,[440700,,D] ; PUSH BYE POINTER TO FINAL STRING
|
||
SETZB D,E ; SET CHARCOUNT AD DESTINATION TO 0
|
||
HLLZS -1(TP) ; RH OF TATOM,, WILL COUNT ATOMS IN PATH
|
||
|
||
PATOM0: PUSH TP,$TPDL ; SAVE CURRENT STAKC FOR \ LOGIC
|
||
PUSH TP,P
|
||
LDB A,[301400,,(P)] ; GET BYTE PTR POSITION
|
||
DPB A,[301400,,E] ; SAVE IN E
|
||
MOVE C,-2(TP) ; GET ATOM POINTER
|
||
ADD C,[3,,3] ; POINT TO PNAME
|
||
JUMPGE C,BADPNM ; NO PNAME, ERROR
|
||
HLRE A,C ; -# WORDS TO A
|
||
PUSH P,A ; PUSH THAT FOR "AOSE"
|
||
MOVEI A,177 ; PUT RUBOUT WHERE \ MIGHT GO
|
||
JSP B,DOIDPB
|
||
HRLI C,440700 ; BUILD BYTE POINTER
|
||
ILDB A,C ; GET FIRST BYTE
|
||
JUMPE A,BADPNM ; NULL PNAME, ERROR
|
||
SKIPA
|
||
PATOM1: ILDB A,C ; GET A CHAR
|
||
JUMPE A,PATDON ; END OF PNAME?
|
||
TLNN C,760000 ; SKIP IF NOT WORD BOUNDARY
|
||
AOS (P) ; COUNT WORD
|
||
JRST PENTCH ; ENTER THE CHAR INTO OUTPUT
|
||
|
||
PATDON: LDB A,[220600,,E] ; GET "STATE"
|
||
LDB A,STABYT+NONSPC+1 ; SIMULATE "END" CHARACTER
|
||
DPB A,[220600,,E] ; AND STORE
|
||
MOVE B,E ; SETUP BYTE POINTER TO 1ST CHAR
|
||
TLZ B,77
|
||
HRR B,(TP) ; POINT
|
||
SUB TP,[2,,2] ; FLUSH SAVED PDL
|
||
MOVE C,-1(P) ; GET BYE POINTER
|
||
SUB P,[2,,2] ; FLUSH
|
||
PUSH P,D
|
||
MOVEI A,0
|
||
IDPB A,B
|
||
AOS -1(TP) ; COUNT ATOMS
|
||
TLNE FLAGS,NOQBIT ; SKIP IF NOT "PRINC"
|
||
JRST NOLEX4 ; NEEDS NO LEXICAL TRAILERS
|
||
MOVEI A,"\ ; GET QUOTER
|
||
TLNN E,2 ; SKIP IF NEEDED
|
||
JRST PATDO1
|
||
SOS -1(TP) ; DONT COUNT BECAUSE OF SLASH
|
||
DPB A,B ; CLOBBER
|
||
PATDO1: MOVEI E,(E) ; CLEAR LH(E)
|
||
PUSH P,C ; SAVE BYTER
|
||
PUSH P,E ; ALSO CHAR COUNT
|
||
|
||
MOVE B,IMQUOTE OBLIST
|
||
PUSH P,FLAGS
|
||
PUSHJ P,IDVAL ; GET LOCAL/GLOBAL VALUE
|
||
POP P,FLAGS ; AND RESTORES FLAGS
|
||
MOVE C,(TP) ; GET ATOM BACK
|
||
HRRZ C,2(C) ; GET ITS OBLIST
|
||
SKIPN C
|
||
AOJA A,NOOBL1 ; NONE, USE FALSE
|
||
CAMG C,VECBOT ; JUMP IF REAL OBLIST
|
||
MOVE C,(C)
|
||
HRROS C
|
||
CAME A,$TLIST ; SKIP IF A LIST
|
||
CAMN A,$TOBLS ; SKIP IF UNREASONABLE VALUE
|
||
JRST CHOBL ; WINS, NOW LOCATE IT
|
||
|
||
CHROOT: CAME C,ROOT+1 ; IS THIS ROOT?
|
||
JRST FNDOBL ; MUST FIND THE PATH NAME
|
||
POP P,E ; RESTORE CHAR COUNT
|
||
MOVE D,(P) ; AND PARTIAL WORD
|
||
EXCH D,-1(P) ; STORE BYTE POINTER AND GET PARTIAL WORD
|
||
MOVEI A,"! ; PUT OUT MAGIC
|
||
JSP B,DOIDPB ; INTO BUFFER
|
||
MOVEI A,"-
|
||
JSP B,DOIDPB
|
||
MOVEI A,40
|
||
JSP B,DOIDPB
|
||
|
||
NOLEX0: SUB P,[2,,2] ; REMOVE COUNTER AND BYTE POINTER
|
||
PUSH P,D ; PUSH NEXT WORD IF ANY
|
||
JRST NOLEX4
|
||
|
||
NOLEX: MOVE E,(P) ; GET COUNT
|
||
SUB P,[2,,2]
|
||
NOLEX4: MOVEI E,(E) ; CLOBBER LH(E)
|
||
MOVE A,E ; COUNT TO A
|
||
SKIPN (P) ; FLUSH 0 WORD
|
||
SUB P,[1,,1]
|
||
HRRZ C,-1(TP) ; GET # OF ATOMS
|
||
SUBI A,(C) ; FIX COUNT
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF ; MAY NEED C.R.
|
||
MOVEI C,-1(E) ; COMPUTE WORDS-1
|
||
IDIVI C,5 ; WORDS-1 TO C
|
||
HRLI C,(C)
|
||
MOVE D,P
|
||
SUB D,C ; POINTS TO 1ST WORD OF CHARS
|
||
MOVSI C,440700+D ; BYTEPOINTER TO STRING
|
||
PUSH TP,$TPDL ; SAVE FROM GC
|
||
PUSH TP,D
|
||
|
||
PATOUT: ILDB A,C ; READ A CHAR
|
||
SKIPE A ; IGNORE NULS
|
||
PUSHJ P,PITYO ; PRINT IT
|
||
MOVE D,(TP) ; RESTORE POINTER
|
||
SOJG E,PATOUT
|
||
|
||
NOLEXD: SUB TP,[2,,2] ; FLUSH TP JUNK
|
||
MOVE P,D ; RESTORE P
|
||
SUB P,[1,,1]
|
||
JRST PNEXT
|
||
|
||
|
||
PENTCH: TLNE FLAGS,NOQBIT ; "PRINC"?
|
||
JRST PENTC1 ; YES, AVOID SLASHING
|
||
IDIVI A,CHRWD ; GET CHARS TYPE
|
||
LDB B,BYTPNT(B)
|
||
CAILE B,NONSPC ; SKIP IF NOT SPECIAL
|
||
JRST PENTC2 ; SLASH IMMEDIATE
|
||
LDB A,[220600,,E] ; GET "STATE"
|
||
LDB A,STABYT-1(B) ; GET NEW STATE
|
||
DPB A,[220600,,E] ; AND SAVE IT
|
||
PENTC3: LDB A,C ; RESTORE CHARACTER
|
||
PENTC1: JSP B,DOIDPB
|
||
SKIPGE (P) ; SKIP IF DONE
|
||
JRST PATOM1 ; CONTINUE
|
||
JRST PATDON
|
||
|
||
PENTC2: MOVEI A,"\ ; GET CHAR QUOTER
|
||
JSP B,DOIDPB ; NEEDED, DO IT
|
||
MOVEI A,4 ; PATCH FOR ATOMS ALREADY BACKSLASHED
|
||
JRST PENTC3-1
|
||
|
||
; ROUTINE TO PUT ONE CHAR ON STACK BUFFER
|
||
|
||
DOIDPB: IDPB A,-1(P) ; DEPOSIT
|
||
TRNN D,377 ; SKIP IF D FULL
|
||
AOJA E,(B)
|
||
PUSH P,(P) ; MOVE TOP OF STACK UP
|
||
MOVEM D,-2(P) ; SAVE WORDS
|
||
MOVE D,[440700,,D]
|
||
MOVEM D,-1(P)
|
||
MOVEI D,0
|
||
AOJA E,(B)
|
||
|
||
; CHECK FOR UNIQUENESS LOOKING INTO PATH
|
||
|
||
CHOBL: CAME A,$TOBLS ; SINGLE OBLIST?
|
||
JRST LSTOBL ; NO, AL LIST THEREOF
|
||
CAME B,C ; THE RIGTH ONE?
|
||
JRST CHROOT ; NO, CHECK ROOT
|
||
JRST NOLEX ; WINNER, NO TRAILERS!
|
||
|
||
LSTOBL: PUSH TP,A ; SCAN A LIST OF OBLISTS
|
||
PUSH TP,B
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
PUSH TP,$TOBLS
|
||
PUSH TP,C
|
||
|
||
NXTOB2: INTGO ; LIST LOOP, PREVENT LOSSAGE
|
||
SKIPN C,-2(TP) ; SKIP IF NOT DONE
|
||
JRST CHROO1 ; EMPTY, CHECK ROOT
|
||
MOVE B,1(C) ; GET ONE
|
||
CAME B,(TP) ; WINNER?
|
||
JRST NXTOBL ; NO KEEP LOOKING
|
||
CAMN C,-4(TP) ; SKIP IF NOT FIRST ON LIST
|
||
JRST NOLEX1
|
||
MOVE A,-6(TP) ; GET ATOM BACK
|
||
MOVEI D,0
|
||
ADD A,[3,,3] ; POINT TO PNAME
|
||
PUSH P,0 ; SAVE FROM RLOOKU
|
||
PUSH P,(A)
|
||
ADDI D,5
|
||
AOBJN A,.-2 ; PUSH THE PNAME
|
||
PUSH P,D ; AND CHAR COUNT
|
||
MOVSI A,TLIST ; TELL RLOOKU WE WIN
|
||
MOVE B,-4(TP) ; GET BACK OBLIST LIST
|
||
SUB TP,[6,,6] ; FLUSH CRAP
|
||
PUSHJ P,RLOOKU ; FIND IT
|
||
POP P,0
|
||
CAMN B,(TP) ; SKIP IF NON UNIQUE
|
||
JRST NOLEX ; UNIQUE , NO TRAILER!!
|
||
JRST CHROO2 ; CHECK ROOT
|
||
|
||
NXTOBL: HRRZ B,@-2(TP) ; STEP THE LIST
|
||
MOVEM B,-2(TP)
|
||
JRST NXTOB2
|
||
|
||
|
||
FNDOBL: MOVE C,(TP) ; GET ATOM
|
||
MOVSI A,TOBLS
|
||
HRRZ B,2(C)
|
||
CAMG B,VECBOT
|
||
MOVE B,(B)
|
||
HRLI B,-1
|
||
MOVSI C,TATOM
|
||
MOVE D,IMQUOTE OBLIST
|
||
PUSH P,0
|
||
PUSHJ P,IGET
|
||
POP P,0
|
||
NOOBL1: POP P,E ; RESTORE CHAR COUNT
|
||
MOVE D,(P) ; GET PARTIAL WORD
|
||
EXCH D,-1(P) ; AND BYTE POINTER
|
||
CAME A,$TATOM ; IF NOT ATOM, USE FALSE
|
||
JRST NOOBL
|
||
MOVEM B,(TP) ; STORE IN ATOM SLOT
|
||
MOVEI A,"!
|
||
JSP B,DOIDPB ; WRITE IT OUT
|
||
MOVEI A,"-
|
||
JSP B,DOIDPB
|
||
SUB P,[1,,1]
|
||
JRST PATOM0 ; AND LOOP
|
||
|
||
NOOBL: MOVE C,[440700,,[ASCIZ /!-#FALSE ()/]]
|
||
ILDB A,C
|
||
JUMPE A,NOLEX0
|
||
JSP B,DOIDPB
|
||
JRST .-3
|
||
|
||
|
||
NOLEX1: SUB TP,[6,,6] ; FLUSH STUFF
|
||
JRST NOLEX
|
||
|
||
CHROO1: SUB TP,[6,,6]
|
||
CHROO2: MOVE C,(TP) ; GET ATOM
|
||
HRRZ C,2(C) ; AND ITS OBLIST
|
||
CAMG C,VECBOT
|
||
MOVE C,(C)
|
||
HRROS C
|
||
JRST CHROOT
|
||
BADPNM: ERRUUO EQUOTE BAD-PNAME
|
||
|
||
|
||
; STATE TABLES FOR \ OF FIRST CHAR
|
||
; Each word is a state and each 4 bit byte tells where to go based on the input
|
||
; type. The types are defined in READER >. The input type selects a byte pointer
|
||
; into the table which is indexed by the current state.
|
||
|
||
RADIX 16.
|
||
|
||
STATS: 431192440 ; INITIAL STATE (0)
|
||
434444444 ; HERE ON INIT +- (1)
|
||
222222242 ; HERE ON INIT . (2)
|
||
434445642 ; HERE ON INIT DIGIT (3)
|
||
444444444 ; HERE IF NO \ NEEDE (4)
|
||
454444642 ; HERE ON DDDD. (5)
|
||
487744444 ; HERE ON E (6)
|
||
484444444 ; HERE ON E+- (7)
|
||
484444442 ; HERE ON E+-DDD (8)
|
||
494444444+<1_28.> ; HERE ON * (HACK IS TO GET A 10 IN THERE) (9)
|
||
494494444+<1_28.>+<2_16.> ; HERE ON *DDDDD (10)
|
||
444444442
|
||
|
||
RADIX 8.
|
||
|
||
STABYT: 400400,,STATS(A) ; LETTERS
|
||
340400,,STATS(A) ; NUMBERS
|
||
300400,,STATS(A) ; PLUS SIGN +
|
||
240400,,STATS(A) ; MINUS SIGN -
|
||
200400,,STATS(A) ; asterick *
|
||
140400,,STATS(A) ; PERIOD .
|
||
100400,,STATS(A) ; LETTER E
|
||
040400,,STATS(A) ; extra
|
||
000400,,STATS(A) ; HERE ON RAP UP
|
||
|
||
;PRINT LONG CHARACTER STRINGS.
|
||
;
|
||
PCHSTR: MOVE B,(TP)
|
||
TLZ FLAGS,ATMBIT ;WE ARE NOT USING ATOM-NAME TYPE ESCAPING
|
||
MOVE D,[AOS E] ;GET INSTRUCTION TO COUNT CHARACTERS
|
||
SETZM E ;ZERO COUNT
|
||
PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP) ;GIVE PCHRST SOME GOODIES TO PLAY WITH
|
||
PUSHJ P,PCHRST ;GO THROUGH STRING, ESCAPING, ETC. AND COUNTING
|
||
SUB TP,[4,,4] ;FLUSH MUNGED GOODIES
|
||
MOVE A,E ;PUT COUNT RETURNED IN REG A
|
||
TLNN FLAGS,NOQBIT ;SKIP (NO QUOTES) IF IN PRINC (BIT ON)
|
||
ADDI A,2 ;PLUS TWO FOR QUOTES
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF ;START NEW LINE IF NO SPACE
|
||
TLNE FLAGS,NOQBIT ;SKIP (PRINT ") IF BIT IS OFF (NOT PRINC)
|
||
JRST PCHS01 ;OTHERWISE, DON'T QUOTE
|
||
MOVEI A,"" ;PRINT A DOUBLE QUOTE
|
||
MOVE B,-2(TP)
|
||
PUSHJ P,PITYO
|
||
|
||
PCHS01: MOVE D,[PUSHJ P,PITYO] ;OUTPUT INSTRUCTION
|
||
PUSHJ P,PCHRST ;TYPE STRING
|
||
|
||
TLNE FLAGS,NOQBIT ;AGAIN, SKIP IF DOUBLE-QUOTING TO BE DONE
|
||
JRST PNEXT ;RESTORE REGS & POP UP ONE LEVEL TO CALLER
|
||
MOVEI A,"" ;PRINT A DOUBLE QUOTE
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,PITYO
|
||
JRST PNEXT
|
||
|
||
|
||
;INTERNAL ROUTINE USED TO COUNT OR OUTPUT CHARACTER STRINGS.
|
||
;THE APPROPRIATE ESCAPING CONVENTIONS ARE USED AS DETERMINED BY THE FLAG BITS.
|
||
PCHRST: PUSH P,A ;SAVE REGS
|
||
PUSH P,B
|
||
PUSH P,C
|
||
PUSH P,D
|
||
|
||
PCHR02: INTGO ; IN CASE VERY LONG STRING
|
||
HRRZ C,-1(TP) ;GET COUNT
|
||
SOJL C,PCSOUT ; DONE?
|
||
HRRM C,-1(TP)
|
||
ILDB A,(TP) ; GET CHAR
|
||
|
||
TLNE FLAGS,NOQBIT ;SKIP IF WE ARE NOT IN PRINC MODE (NOQBIT=0)
|
||
JRST PCSPRT ;IF BIT IS ON, PRINT WITHOUT ESCAPING
|
||
CAIN A,ESCHAR ;SKIP IF NOT THE ESCAPE CHARACTER
|
||
JRST ESCPRN ;ESCAPE THE ESCAPE CHARACTER
|
||
CAIN A,"" ;SKIP IF NOT A DOUBLE QUOTE
|
||
JRST ESCPRN ;OTHERWISE, ESCAPE THE """
|
||
IDIVI A,CHRWD ;CODE HERE FINDS CHARACTER TYPE
|
||
LDB B,BYTPNT(B) ; "
|
||
CAIG B,NONSPC ;SKIP IF NOT A NUMBER/LETTER
|
||
JRST PCSPRT ;OTHERWISE, PRINT IT
|
||
TLNN FLAGS,ATMBIT ;SKIP IF PRINTING AN ATOM-NAME (UNQUOTED)
|
||
JRST PCSPRT ;OTHERWISE, NO OTHER CHARS TO ESCAPE
|
||
|
||
ESCPRN: MOVEI A,ESCHAR ;TYPE THE ESCAPE CHARACTER
|
||
PUSH P,B ; SAVE B
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
XCT (P)-1
|
||
POP P,B ; RESTORE B
|
||
|
||
PCSPRT: LDB A,(TP) ;GET THE CHARACTER AGAIN
|
||
PUSH P,B ; SAVE B
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
TLNE FLAGS,NOQBIT ; SKIP IF WE ARE NOT IN PRINC MODE (NOQBIT=0)
|
||
TLO FLAGS,CNTLPC ; SWITCH ON TEMPORARY ^P MODE
|
||
XCT (P)-1 ;PRINT IT
|
||
TLZ FLAGS,CNTLPC ; SWITCH OFF ^P MODE
|
||
POP P,B ; RESTORE B
|
||
JRST PCHR02 ;LOOP THROUGH STRING
|
||
|
||
PCSOUT: POP P,D
|
||
POP P,C ;RESTORE REGS & RETURN
|
||
POP P,B
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
|
||
|
||
; PRINT AN ARBITRARY BYTE STRING
|
||
|
||
PBYTE: PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
MOVEI A,"#
|
||
MOVE B,(TP)
|
||
PUSHJ P,PRETIF
|
||
LDB B,[300600,,-2(TP)]
|
||
MOVSI A,TFIX
|
||
PUSHJ P,IPRINT
|
||
MOVE B,(TP)
|
||
PUSHJ P,SPACEQ
|
||
MOVEI A,"{
|
||
MOVE B,(TP)
|
||
PUSHJ P,PRETIF
|
||
HRRZ A,-3(TP) ; CHAR COUNT
|
||
JUMPE A,CLSBYT
|
||
|
||
BYTLP: SOS -3(TP)
|
||
ILDB B,-2(TP) ; GET A BYTE
|
||
MOVSI A,TFIX
|
||
PUSHJ P,IPRINT
|
||
HRRZ A,-3(TP)
|
||
JUMPE A,CLSBYT
|
||
MOVE B,(TP)
|
||
PUSHJ P,SPACEQ
|
||
JRST BYTLP
|
||
|
||
CLSBYT: MOVEI A,"}
|
||
MOVE B,(TP)
|
||
PUSHJ P,PRETIF
|
||
SUB TP,[2,,2]
|
||
JRST PNEXT
|
||
|
||
|
||
;PRINT AN ARGUMENT LIST
|
||
;CHECK FOR TIME ERRORS
|
||
|
||
PARGS: MOVEI B,-1(TP) ;POINT TO ARGS POINTER
|
||
PUSHJ P,CHARGS ;AND CHECK THEM
|
||
JRST PVEC ; CHEAT TEMPORARILY
|
||
|
||
|
||
|
||
;PRINT A FRAME
|
||
PFRAME: MOVEI B,-1(TP) ;POINT TO FRAME POINTER
|
||
PUSHJ P,CHFRM
|
||
HRRZ B,(TP) ;POINT TO FRAME ITSELF
|
||
HRRZ B,FSAV(B) ;GET POINTER TO SUBROUTINE
|
||
CAIL B,HIBOT
|
||
SKIPA B,@-1(B) ; SUBRS AND FSUBRS
|
||
MOVE B,3(B) ; FOR RSUBRS
|
||
MOVSI A,TATOM
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ;PRINT FUNCTION NAME
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
JRST PNEXT
|
||
|
||
PPVP: MOVE B,(TP) ; PROCESS TO B
|
||
MOVSI A,TFIX
|
||
JUMPE B,.+3
|
||
MOVE A,PROCID(B)
|
||
MOVE B,PROCID+1(B) ;GET ID
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
JRST PNEXT
|
||
|
||
; HERE TO PRINT LOCATIVES
|
||
|
||
LOCPT1: HRRZ A,-1(TP)
|
||
JUMPN A,PUNK
|
||
LOCPT: MOVEI B,-1(TP) ; VALIDITY CHECK
|
||
PUSHJ P,CHLOCI
|
||
HRRZ A,-1(TP)
|
||
JUMPE A,GLOCPT
|
||
MOVE B,(TP)
|
||
MOVE A,(B)
|
||
MOVE B,1(B)
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
JRST PNEXT
|
||
|
||
GLOCPT: MOVEI A,2
|
||
MOVE B,-2(TP) ; GET CHANNEL
|
||
PUSHJ P,RETIF
|
||
MOVEI A,"%
|
||
PUSHJ P,PITYO
|
||
MOVEI A,"<
|
||
PUSHJ P,PITYO
|
||
MOVSI A,TATOM
|
||
MOVE B,MQUOTE GLOC
|
||
PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2]
|
||
MOVE B,-2(TP) ; MOVE IN CHANNEL
|
||
PUSHJ P,SPACEQ
|
||
MOVE B,(TP)
|
||
MOVSI A,TATOM
|
||
MOVE B,-1(B)
|
||
PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2]
|
||
MOVE B,-2(TP) ; MOVE IN CHANNEL
|
||
PUSHJ P,SPACEQ
|
||
MOVSI A,TATOM
|
||
MOVE B,IMQUOTE T
|
||
PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2]
|
||
MOVE B,-2(TP) ; MOVE IN CHANNEL
|
||
MOVEI A,">
|
||
PUSHJ P,PRETIF
|
||
JRST PNEXT
|
||
|
||
LOCRPT: MOVEI A,2
|
||
MOVE B,-2(TP) ; GET CHANNEL
|
||
PUSHJ P,RETIF
|
||
MOVEI A,"%
|
||
PUSHJ P,PITYO
|
||
MOVEI A,"<
|
||
PUSHJ P,PITYO
|
||
MOVSI A,TATOM
|
||
MOVE B,MQUOTE RGLOC
|
||
PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2]
|
||
MOVE B,-2(TP) ; MOVE IN CHANNEL
|
||
PUSHJ P,SPACEQ
|
||
MOVE B,(TP)
|
||
MOVSI A,TATOM
|
||
ADD B,GLOTOP+1 ; GET TO REAL ATOM
|
||
MOVE B,-1(B)
|
||
PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2]
|
||
MOVE B,-2(TP) ; MOVE IN CHANNEL
|
||
PUSHJ P,SPACEQ
|
||
MOVSI A,TATOM
|
||
MOVE B,IMQUOTE T
|
||
PUSH TP,-3(TP)
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2]
|
||
MOVE B,-2(TP) ; MOVE IN CHANNEL
|
||
MOVEI A,">
|
||
PUSHJ P,PRETIF
|
||
JRST PNEXT
|
||
|
||
;PRINT UNIFORM VECTORS.
|
||
;
|
||
PUVEC: MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
MOVEI A,2 ; ROOM FOR ! AND SQ BRACK?
|
||
PUSHJ P,RETIF
|
||
MOVEI A,"! ;TYPE AN ! AND OPEN SQUARE BRACKET
|
||
PUSHJ P,PITYO
|
||
MOVEI A,"[
|
||
PUSHJ P,PITYO
|
||
|
||
MOVE C,(TP) ;GET AOBJN POINTER TO VECTOR
|
||
TLNN C,777777 ;SKIP ONLY IF COUNT IS NOT ZERO
|
||
JRST NULVEC ;ELSE, VECTOR IS EMPTY
|
||
|
||
HLRE A,C ;GET NEG COUNT
|
||
MOVEI D,(C) ;COPY POINTER
|
||
SUB D,A ;POINT TO DOPE WORD
|
||
HLLZ A,(D) ;GET TYPE
|
||
PUSH P,A ;AND SAVE IT
|
||
|
||
PUVE02: MOVE A,(P) ;PUT TYPE CODE IN REG A
|
||
MOVE B,(C) ;PUT DATUM INTO REG B
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ;TYPE IT
|
||
SUB TP,[2,,2] ; POP CHANNEL OF STACK
|
||
MOVE C,(TP) ;GET AOBJN POINTER
|
||
AOBJP C,NULVE1 ;JUMP IF COUNT IS ZERO
|
||
MOVEM C,(TP) ;PUT POINTER BACK ONTO STACK
|
||
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,SPACEQ
|
||
MOVE C,(TP)
|
||
JRST PUVE02 ;LOOP THROUGH VECTOR
|
||
|
||
NULVE1: SUB P,[1,,1] ;REMOVE STACK CRAP
|
||
NULVEC: MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
MOVEI A,"! ;TYPE CLOSE BRACKET
|
||
PUSHJ P,PRETIF
|
||
MOVEI A,"]
|
||
PUSHJ P,PRETIF
|
||
JRST PNEXT
|
||
|
||
;PRINT A GENERALIZED VECTOR
|
||
;
|
||
PVEC: MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF1 ;NEW LINE IF NO ROOM FOR [
|
||
MOVEI A,"[ ;PRINT A LEFT-BRACKET
|
||
PUSHJ P,PITYO
|
||
|
||
MOVE C,(TP) ;GET AOBJN POINTER TO VECTOR
|
||
TLNN C,777777 ;SKIP IF POINTER-COUNT IS NON-ZERO
|
||
JRST PVCEND ;ELSE, FINISHED WITH VECTOR
|
||
PVCR01: MOVE A,(C) ;PUT FIRST WORD OF NEXT ELEMENT INTO REG A
|
||
MOVE B,1(C) ;SECOND WORD OF LIST INTO REG B
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ;PRINT THAT ELEMENT
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
|
||
MOVE C,(TP) ;GET AOBJN POINTER FROM TP-STACK
|
||
AOBJP C,PVCEND ;POSITIVE HERE SERIOUS ERROR! (THOUGH NOT PDL)
|
||
AOBJN C,.+2 ;SKIP AND CONTINUE LOOP IF COUNT NOT ZERO
|
||
JRST PVCEND ;ELSE, FINISHED WITH VECTOR
|
||
MOVEM C,(TP) ;PUT INCREMENTED POINTER BACK ON TP-STACK
|
||
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,SPACEQ
|
||
MOVE C,(TP) ; RESTORE REGISTER C
|
||
JRST PVCR01 ;CONTINUE LOOPING THROUGH OBJECTS ON VECTOR
|
||
|
||
PVCEND: MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF1 ;NEW LINE IF NO ROOM FOR ]
|
||
MOVEI A,"] ; PRINT A RIGHT-BRACKET
|
||
PUSHJ P,PITYO
|
||
JRST PNEXT
|
||
|
||
;PRINT A LIST.
|
||
;
|
||
PLIST: MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF1 ;NEW LINE IF NO SPACE LEFT FOR "("
|
||
MOVEI A,"( ;TYPE AN OPEN PAREN
|
||
PUSHJ P,PITYO
|
||
PUSHJ P,LSTPRT ;PRINT THE INSIDES
|
||
MOVE B,-2(TP) ; RESTORE CHANNEL TO B
|
||
PUSHJ P,RETIF1 ;NEW LINE IF NO ROOM FOR THE CLOSE PAREN
|
||
MOVEI A,") ;TYPE A CLOSE PAREN
|
||
PUSHJ P,PITYO
|
||
JRST PNEXT
|
||
|
||
PSEG: TLOA FLAGS,SEGBIT ;PRINT A SEGMENT (& SKIP)
|
||
|
||
PFORM: TLZ FLAGS,SEGBIT ;PRINT AN ELEMENT
|
||
|
||
PLMNT3: MOVE C,(TP)
|
||
JUMPE C,PLMNT1 ;IF THE CALL IS EMPTY GO AWAY
|
||
MOVE B,1(C)
|
||
MOVEI D,0
|
||
CAMN B,IMQUOTE LVAL
|
||
MOVEI D,".
|
||
CAMN B,IMQUOTE GVAL
|
||
MOVEI D,",
|
||
CAMN B,IMQUOTE QUOTE
|
||
MOVEI D,"'
|
||
JUMPE D,PLMNT1 ;NEITHER, LEAVE
|
||
|
||
;ITS A SPECIAL HACK
|
||
HRRZ C,(C)
|
||
JUMPE C,PLMNT1 ;NIL BODY?
|
||
|
||
;ITS VALUE OF AN ATOM
|
||
HLLZ A,(C)
|
||
MOVE B,1(C)
|
||
HRRZ C,(C)
|
||
JUMPN C,PLMNT1 ;IF TERE ARE EXTRA ARGS GO AWAY
|
||
|
||
PUSH P,D ;PUSH THE CHAR
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
TLNN FLAGS,SEGBIT ;SKIP (CONTINUE) IF THIS IS A SEGMENT
|
||
JRST PLMNT4 ;ELSE DON'T PRINT THE "."
|
||
|
||
;ITS A SEGMENT CALL
|
||
MOVE B,-4(TP) ; GET CHANNEL INTO B
|
||
MOVEI A,2 ; ROOM FOR ! AND . OR ,
|
||
PUSHJ P,RETIF
|
||
MOVEI A,"!
|
||
PUSHJ P,PITYO
|
||
|
||
PLMNT4: MOVE B,-4(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,RETIF1
|
||
POP P,A ;RESTORE CHAR
|
||
PUSHJ P,PITYO
|
||
POP TP,B
|
||
POP TP,A
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
JRST PNEXT
|
||
|
||
|
||
PLMNT1: TLNN FLAGS,SEGBIT ;SKIP IF THIS IS A SEGMENT
|
||
JRST PLMNT5 ;ELSE DON'T TYPE THE "!"
|
||
|
||
;ITS A SEGMENT CALL
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
MOVEI A,2 ; ROOM FOR ! AND <
|
||
PUSHJ P,RETIF
|
||
MOVEI A,"!
|
||
PUSHJ P,PITYO
|
||
|
||
PLMNT5: MOVE B,-2(TP) ; GET CHANNEL FOR B
|
||
PUSHJ P,RETIF1
|
||
MOVEI A,"<
|
||
PUSHJ P,PITYO
|
||
PUSHJ P,LSTPRT
|
||
MOVEI A,"!
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
TLNE FLAGS,SEGBIT ;SKIP IF NOT SEGEMNT
|
||
PUSHJ P,PRETIF
|
||
MOVEI A,">
|
||
PUSHJ P,PRETIF
|
||
JRST PNEXT
|
||
|
||
|
||
|
||
LSTPRT: SKIPN C,(TP)
|
||
POPJ P,
|
||
HLLZ A,(C) ;GET NEXT ELEMENT
|
||
MOVE B,1(C)
|
||
HRRZ C,(C) ;CHOP THE LIST
|
||
JUMPN C,PLIST1
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ;PRINT THE LAST ELEMENT
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
POPJ P,
|
||
|
||
PLIST1: MOVEM C,(TP)
|
||
PUSH TP,-3(TP) ; GET CHANNEL FOR IPRINT
|
||
PUSH TP,-3(TP)
|
||
PUSHJ P,IPRINT ;PRINT THE NEXT ELEMENT
|
||
SUB TP,[2,,2] ; POP CHANNEL OFF STACK
|
||
MOVE B,-2(TP) ; GET CHANNEL INTO B
|
||
PUSHJ P,SPACEQ
|
||
JRST LSTPRT ;REPEAT
|
||
|
||
PNEXT: POP P,FLAGS ;RESTORE PREVIOUS FLAG BITS
|
||
SUB TP,[2,,2] ;REMOVE INPUT ELEMENT FROM TP-STACK
|
||
POP P,C ;RESTORE REG C
|
||
POPJ P,
|
||
|
||
OPENIT: PUSH P,A
|
||
PUSH P,B
|
||
PUSH P,C
|
||
PUSH P,D
|
||
PUSH P,FLAGS
|
||
PUSHJ P,OPNCHN
|
||
POP P,FLAGS
|
||
POP P,D
|
||
POP P,C
|
||
POP P,B
|
||
POP P,A
|
||
JUMPGE B,FNFFL ;ERROR IF IT CANNOT BE OPENED
|
||
HRRZ E,-2(B)
|
||
POPJ P,
|
||
|
||
|
||
END
|
||
|