1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-31 03:32:04 +00:00
Files
PDP-10.its/src/muds54/reader.306
Adam Sampson a209c97ec1 Add reconstructed Muddle 54, for running old Muddle images.
This source was reconstructed to match MUDSAV; TS MUD54 from 1977-07-02,
using a combination of all the surviving Muddle source files. The memory
layout and pure code is the same.

No AGC MUD54 has survived, so the AGC code was adjusted to match the
TOPS-20 agc.mud104 from Chicago that Rich Alderson provided (the only
ITS conditional is the page size). There's a one-instruction difference
in the symbol positions, which I've converted into a patch at the end of
the code to maintain the original layout on ITS.

The INITM code, which doesn't appear in the final executable, is
a best guess but it's probably fairly close, since it generates objects
in the right order and locations, and the symbol locations match the
original.

The 1977 executable has a very large number of patches, which I've
replicated in MUD54 INIT. The code that the patches were replacing --
marked with "XXX patched" in the source -- is also a best guess.

I haven't checked that the TOPS-20 code is correct; it could be adjusted
to match mdl104.exe in the future. It would need STENEX, which could be
linked from MUDSYS;.
2020-09-14 11:28:51 +01:00

2204 lines
47 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE READER FOR MUDDLE
;C. REEVE DEC. 1970
RELOCA
READER==1 ;TELL MUDDLE > TO USE SOME SPECIAL HACKS
FRMSIN==1 ;FLAG SAYING WHETHER OR "." AND "'" HACKS EXIST
KILTV==1 ;FLAG SAYING THAT SHOULD BE REMOVED (MUDDLE 54 ONLY)
.INSRT MUDDLE >
.GLOBAL CONS,VECTOR,NXTCHR,RLOOKU,CRADIX,SPTIME,QUOTE,TENTAB,CHMAK,FLUSCH,ITENTB
.GLOBAL SETDEV,OPNCHN,ILVAL,RADX,IDVAL,LSTCH,EVECTOR,EUVECTOR,CHUNW
.GLOBAL CHRWRD,EOFCND,DIRECT,ACCESS,IOINS,ROOT,DIRECT,DOIOTI,DOACCS,IGVAL,BYTDOP
.GLOBAL ICONS,INCONS,IEVECT,IEUVEC,BUFSTR,TYPFND,SQUTOA,IBLOCK,GRB
.GLOBAL BADCHN,WRONGD,CHNCLS,FNFFL,IPUT,IGET,ILOC,RXCT,WXCT,IUNWIN,UNWIN2
.GLOBAL CNXTCH,CREADC,MPOPJ,CREDC1,CNXTC1,IREMAS,CBYTES,PVSTOR,SPSTOR,DSTORE
BUFLNT==100
FF=0 ;FALG REGISTER DURING NUMBER CONVERSION
;FLAGS USED (RIGHT HALF)
NOTNUM==1 ;NOT A NUMBER
NFIRST==2 ;NOT FIRST CHARACTER BEING READ
DECFRC==4 ;FORCE DECIMAL CONVERSION
NEGF==10 ;NEGATE THIS THING
NUMWIN==20 ;DIGIT(S) SEEN
INSTRN==40 ;IN QUOTED CHARACTER STRING
FLONUM==100 ;NUMBER IS FLOOATING POINT
DOTSEN==200 ;. SEEN IN IMPUT STREAM
EFLG==400 ;E SEEN FOR EXPONENT
IFN FRMSIN,[
FRSDOT==1000 ;. CAME FIRST
USEAGN==2000 ;SPECIAL DOT HACK
]
OCTWIN==4000
OCTSTR==10000
OVFLEW==40000
;TEMPORARY OFFSETS
VCNT==0 ;NUMBER OF ELEMENTS IN CURRENT VECTOR
ONUM==1 ;CURRENT NUMBER IN OCTAL
DNUM==3 ;CURRENT NUMBER IN DECIMAL
FNUM==5 ;CURRENTLY UNUSED
CNUM==7 ;IN CURRENT RADIX
NDIGS==11 ;NUMBER OF DIGITS
ENUM==13 ;EXPONENT
; TEXT FILE LOADING PROGRAM
MFUNCTION MLOAD,SUBR,[LOAD]
ENTRY
HLRZ A,AB ;GET NO. OF ARGS
CAIE A,-4 ;IS IT 2
JRST TRY2 ;NO, TRY ANOTHER
GETYP A,2(AB) ;GET TYPE
CAIE A,TOBLS ;IS IT OBLIST
CAIN A,TLIST ; OR LIST THEREOF?
JRST CHECK1
JRST WTYP2
TRY2: CAIE A,-2 ;IS ONE SUPPLIED
JRST WNA
CHECK1: GETYP A,(AB) ;GET TYPE
CAIE A,TCHAN ;IS IT A CHANNEL
JRST WTYP1
LOAD1: HLRZ A,TB ;GET CURRENT TIME
PUSH TP,$TTIME ;AND SAVE IT
PUSH TP,A
MOVEI C,CLSNGO ; LOCATION OF FUNNY CLOSER
PUSHJ P,IUNWIN ; SET UP AS UNWINDER
LOAD2: PUSH TP,(AB) ;USE SUPPLIED CHANNEL
PUSH TP,1(AB)
PUSH TP,(TB) ;USE TIME AS EOF ARG
PUSH TP,1(TB)
CAML AB,[-2,,0] ;CHECK FOR 2ND ARG
JRST LOAD3 ;NONE
PUSH TP,2(AB) ;PUSH ON 2ND ARG
PUSH TP,3(AB)
MCALL 3,READ
JRST CHKRET ;CHECK FOR EOF RET
LOAD3: MCALL 2,READ
CHKRET: CAMN A,(TB) ;IS TYPE EOF HACK
CAME B,1(TB) ;AND IS VALUE
JRST EVALIT ;NO, GO EVAL RESULT
PUSH TP,(AB)
PUSH TP,1(AB)
MCALL 1,FCLOSE
MOVE A,$TCHSTR
MOVE B,CHQUOTE DONE
JRST FINIS
CLSNGO: PUSH TP,$TCHAN
PUSH TP,1(AB)
MCALL 1,FCLOSE
JRST UNWIN2 ; CONTINUE UNWINDING
EVALIT: PUSH TP,A
PUSH TP,B
MCALL 1,EVAL
JRST LOAD2
; OTHER FILE LOADING PROGRAM
MFUNCTION FLOAD,SUBR
ENTRY
MOVEI C,1 ;INITIALIZE OPEN'S ARG COUNT
PUSH TP,$TAB ;SLOT FOR SAVED AB
PUSH TP,[0] ;EMPTY FOR NOW
PUSH TP,$TCHSTR ;PUT IN FIRST ARG
PUSH TP,CHQUOTE READ
MOVE A,AB ;COPY OF ARGUMENT POINTER
FARGS: JUMPGE A,CALOPN ;DONE? IF SO CALL OPEN
GETYP B,(A) ;NO, CHECK TYPE OF THIS ARG
CAIE B,TOBLS ;OBLIST?
CAIN B,TLIST ; OR LIST THEREOF
JRST OBLSV ;YES, GO SAVE IT
PUSH TP,(A) ;SAVE THESE ARGS
PUSH TP,1(A)
ADD A,[2,,2] ;BUMP A
AOJA C,FARGS ;COUNT AND GO
OBLSV: MOVEM A,1(TB) ;SAVE THE AB
CALOPN: ACALL C,FOPEN ;OPEN THE FILE
JUMPGE B,FNFFL ;FILE MUST NO EXIST
EXCH A,(TB) ;PLACE CHANNEL ON STACK
EXCH B,1(TB) ;OBTAINING POSSIBLE OBLIST
JUMPN B,2ARGS ;OBLIST SUOPPLIED?
MCALL 1,MLOAD ;NO, JUST CALL
JRST FINIS
2ARGS: PUSH TP,(B) ;PUSH THE OBLIST
PUSH TP,1(B)
MCALL 2,MLOAD
JRST FINIS
FNFFL: PUSH TP,$TATOM
PUSH TP,EQUOTE FILE-SYSTEM-ERROR
JUMPE B,CALER1
PUSH TP,A
PUSH TP,B
MOVEI A,2
JRST CALER
MFUNCTION READ,SUBR
ENTRY
PUSH P,[IREAD1] ;WHERE TO GO AFTER BINDING
READ0: PUSH TP,$TTP ;SLOT FOR LAST THING READ (TYPE IS UNREADABLE)
PUSH TP,[0]
PUSH TP,$TFIX ;SLOT FOR RADIX
PUSH TP,[0]
PUSH TP,$TCHAN ;AND SLOT FOR CHANNEL
PUSH TP,[0]
PUSH TP,[0] ; USER DISP SLOT
PUSH TP,[0]
PUSH TP,$TSPLICE
PUSH TP,[0] ;SEGMENT FOR SPLICING MACROS
JUMPGE AB,READ1 ;NO ARGS, NO BINDING
GETYP C,(AB) ;ISOLATE TYPE
CAIN C,TUNBOU
JRST WTYP1
PUSH TP,[TATOM,,-1] ;PUSH THE ATOMS
PUSH TP,IMQUOTE INCHAN
PUSH TP,(AB) ;PUSH ARGS
PUSH TP,1(AB)
PUSH TP,[0] ;DUMMY
PUSH TP,[0]
MOVE B,1(AB) ;GET CHANNEL POINTER
ADD AB,[2,,2] ;AND ARG POINTER
JUMPGE AB,BINDEM ;MORE?
PUSH TP,[TVEC,,-1]
ADD B,[EOFCND-1,,EOFCND-1]
PUSH TP,B
PUSH TP,(AB)
PUSH TP,1(AB)
ADD AB,[2,,2]
JUMPGE AB,BINDEM ;IF ANY MORE ARGS GO PROCESS AND BIND THEM
GETYP C,(AB) ;ISOLATE TYPE
CAIE C,TLIST
CAIN C,TOBLS
SKIPA
JRST WTYP3
PUSH TP,[TATOM,,-1] ;PUSH THE ATOMS
PUSH TP,IMQUOTE OBLIST
PUSH TP,(AB) ;PUSH ARGS
PUSH TP,1(AB)
PUSH TP,[0] ;DUMMY
PUSH TP,[0]
ADD AB,[2,,2] ;AND ARG POINTER
JUMPGE AB,BINDEM ; ALL DONE, BIND ATOMS
GETYP 0,(AB) ; GET TYPE OF TABLE
CAIE 0,TVEC ; SKIP IF BAD TYPE
JRST WTYP ; ELSE COMPLAIN
PUSH TP,[TATOM,,-1]
PUSH TP,IMQUOTE READ-TABLE
PUSH TP,(AB)
PUSH TP,1(AB)
PUSH TP,[0]
PUSH TP,[0]
ADD AB,[2,,2] ; BUMP TO NEXT ARG
JUMPL AB,TMA ;MORE ?, ERROR
BINDEM: PUSHJ P,SPECBIND
JRST READ1
MFUNCTION RREADC,SUBR,READCHR
ENTRY
PUSH P,[IREADC]
JRST READC0 ;GO BIND VARIABLES
MFUNCTION NXTRDC,SUBR,NEXTCHR
ENTRY
PUSH P,[INXTRD]
READC0: CAMGE AB,[-5,,]
JRST TMA
PUSH TP,(AB)
PUSH TP,1(AB)
JUMPL AB,READC1
MOVE B,IMQUOTE INCHAN
PUSHJ P,IDVAL
GETYP 0,A
CAIE 0,TCHAN
JRST BADCHN
MOVEM A,-1(TP)
MOVEM B,(TP)
READC1: PUSHJ P,@(P)
JRST .+2
JRST FINIS
PUSH TP,-1(TP)
PUSH TP,-1(TP)
MCALL 1,FCLOSE
MOVE A,EOFCND-1(B)
MOVE B,EOFCND(B)
CAML AB,[-3,,]
JRST .+3
MOVE A,2(AB)
MOVE B,3(AB)
PUSH TP,A
PUSH TP,B
MCALL 1,EVAL
JRST FINIS
MFUNCTION PARSE,SUBR
ENTRY
PUSHJ P,GAPRS ;GET ARGS FOR PARSES
PUSHJ P,GPT ;GET THE PARSE TABLE
PUSHJ P,NXTCH ; GET A CHAR TO TEST FOR ! ALT
SKIPN 11.(TB) ; EOF HIT, COMPLAIN TO LOOSER
JRST NOPRS
MOVEI A,33 ; CHANGE IT TO AN ALT, SNEAKY HUH?
CAIN B,MANYT ; TYPE OF MULTIPLE CLOSE, I.E. ! ALT
MOVEM A,5(TB)
PUSHJ P,IREAD1 ;GO DO THE READING
JRST .+2
JRST LPSRET ;PROPER EXIT
NOPRS: ERRUUO EQUOTE CAN'T-PARSE
MFUNCTION LPARSE,SUBR
ENTRY
PUSHJ P,GAPRS ;GET THE ARGS TO THE PARSE
JRST LPRS1
GAPRS: PUSH TP,$TTP
PUSH TP,[0]
PUSH TP,$TFIX
PUSH TP,[10.]
PUSH TP,$TFIX
PUSH TP,[0] ; LETTER SAVE
PUSH TP,[0]
PUSH TP,[0] ; PARSE TABLE MAYBE?
PUSH TP,$TSPLICE
PUSH TP,[0] ;SEGMENT FOR SPLICING MACROS
PUSH TP,[0] ;SLOT FOR LOCATIVE TO STRING
PUSH TP,[0]
JUMPGE AB,USPSTR
PUSH TP,[TATOM,,-1]
PUSH TP,IMQUOTE PARSE-STRING
PUSH TP,(AB)
PUSH TP,1(AB) ; BIND OLD PARSE-STRING
PUSH TP,[0]
PUSH TP,[0]
PUSHJ P,SPECBIND
ADD AB,[2,,2]
JUMPGE AB,USPSTR
GETYP 0,(AB)
CAIE 0,TFIX
JRST WTYP2
MOVE 0,1(AB)
MOVEM 0,3(TB)
ADD AB,[2,,2]
JUMPGE AB,USPSTR
GETYP 0,(AB)
CAIE 0,TLIST
CAIN 0,TOBLS
SKIPA
JRST WTYP3
PUSH TP,[TATOM,,-1]
PUSH TP,IMQUOTE OBLIST
PUSH TP,(AB)
PUSH TP,1(AB) ; HE WANTS HIS OWN OBLIST
PUSH TP,[0]
PUSH TP,[0]
PUSHJ P,SPECBIND
ADD AB,[2,,2]
JUMPGE AB,USPSTR
GETYP 0,(AB)
CAIE 0,TVEC
JRST WTYP
PUSH TP,[TATOM,,-1]
PUSH TP,IMQUOTE PARSE-TABLE
PUSH TP,(AB)
PUSH TP,1(AB)
PUSH TP,[0]
PUSH TP,[0]
PUSHJ P,SPECBIND
ADD AB,[2,,2]
JUMPGE AB,USPSTR
GETYP 0,(AB)
CAIE 0,TCHRS
JRST WTYP
MOVE 0,1(AB)
MOVEM 0,5(TB) ; STUFF IN A LOOK-AHEAD CHARACTER IF HE WANTS
ADD AB,[2,,2]
JUMPL AB,TMA
USPSTR: MOVE B,IMQUOTE PARSE-STRING
PUSHJ P,ILOC ; GET A LOCATIVE TO THE STRING, WHEREVER
GETYP 0,A
CAIN 0,TUNBOUND ; NONEXISTANT
JRST BDPSTR
GETYP 0,(B) ; IT IS POINTING TO A STRING
CAIE 0,TCHSTR
JRST BDPSTR
MOVEM A,10.(TB)
MOVEM B,11.(TB)
POPJ P,
LPRS1: PUSHJ P,GPT ; GET THE VALUE OF PARSE-TABLE IN SLOT
PUSH TP,$TLIST
PUSH TP,[0] ; HERE WE ARE MAKE PLACE TO SAVE GOODIES
PUSH TP,$TLIST
PUSH TP,[0]
LPRS2: PUSHJ P,IREAD1
JRST LPRSDN ; IF WE ARE DONE, WE ARE THROUGH
MOVE C,A
MOVE D,B
PUSHJ P,INCONS
SKIPN -2(TP)
MOVEM B,-2(TP) ; SAVE THE BEGINNING ON FIRST
SKIPE C,(TP)
HRRM B,(C) ; PUTREST INTO IT
MOVEM B,(TP)
JRST LPRS2
LPRSDN: MOVSI A,TLIST
MOVE B,-2(TP)
LPSRET: SKIPLE C,5(TB) ; EXIT FOR PARSE AND LPARSE
CAIN C,400033 ; SEE IF NO PEEK AHEAD OR IF ! ALTMODE
JRST FINIS ; IF SO NO NEED TO BACK STRING ONE
SKIPN C,11.(TB)
JRST FINIS ; IF ATE WHOLE STRING, DONT GIVE BACK ANY
BUPRS: MOVEI D,1
ADDM D,(C) ; AOS THE COUNT OF STRING LENGTH
SKIPG D,1(C) ; SEXIER THAN CLR'S CODE FOR DECREMENTING
SUB D,[430000,,1] ; A BYTE POINTER
ADD D,[70000,,0]
MOVEM D,1(C)
HRRZ E,2(TB)
JUMPE E,FINIS ; SEE IF WE NEED TO BACK UP TWO
HLLZS 2(TB) ; CLEAR OUT DOUBLE CHR LOOKY FLAG
JRST BUPRS ; AND BACK UP PARSE STRING A LITTLE MORE
; ARGUMENTS ARE BOUND, NOW GET THE VALUES OF THINGS
GRT: MOVE B,IMQUOTE READ-TABLE
SKIPA ; HERE TO GET TABLE FOR READ
GPT: MOVE B,IMQUOTE PARSE-TABLE
MOVSI A,TATOM ; TO FILL SLOT WITH PARSE TABLE
PUSHJ P,ILVAL
GETYP 0,A
CAIN 0,TUNBOUND
POPJ P,
CAIE 0,TVEC
JRST BADPTB
MOVEM A,6(TB)
MOVEM B,7(TB)
POPJ P,
READ1: PUSHJ P,GRT
MOVE B,IMQUOTE INCHAN
MOVSI A,TATOM
PUSHJ P,IDVAL ;NOW GOBBLE THE REAL CHANNEL
TLZ A,TYPMSK#777777
HLLZS A ; INCASE OF FUNNY BUG
CAME A,$TCHAN ;IS IT A CHANNEL
JRST BADCHN
MOVEM A,4(TB) ; STORE CHANNEL
MOVEM B,5(TB)
HRRZ A,-2(B)
TRNN A,C.OPN
JRST CHNCLS
TRNN A,C.READ
JRST WRONGD
HLLOS 4(TB)
TRNE A,C.BIN ; SKIP IF NOT BIN
JRST BREAD ; CHECK FOR BUFFER
HLLZS 4(TB)
GETIOA: MOVE B,5(TB)
GETIO: MOVE A,IOINS(B) ;GOBBLE THE I/O INSTRUCTION
JUMPE A,OPNFIL ;GO REALLY OPEN THE CROCK
MOVE A,RADX(B) ;GET RADIX
MOVEM A,3(TB)
MOVEM B,5(TB) ;SAVE CHANNEL
REREAD: HRRZ D,LSTCH(B) ;ANY CHARS AROUND?
MOVEI 0,33
CAIN D,400033 ;FLUSH THE TERMINATOR HACK
HRRM 0,LSTCH(B) ; MAKE ! ALT INTO JUST ALT IF IT IS STILL AROUND
PUSHJ P,@(P) ;CALL INTERNAL READER
JRST BADTRM ;LOST
RFINIS: SUB P,[1,,1] ;POP OFF LOSER
PUSH TP,A
PUSH TP,B
JUMPE C,FLSCOM ; FLUSH TOP LEVEL COMMENT
PUSH TP,C
PUSH TP,D
MOVE A,4(TB)
MOVE B,5(TB) ; GET CHANNEL
MOVSI C,TATOM
MOVE D,MQUOTE COMMENT
PUSHJ P,IPUT
RFINI1: POP TP,B
POP TP,A
JRST FINIS
FLSCOM: MOVE A,4(TB)
MOVE B,5(TB)
MOVSI C,TATOM
MOVE D,MQUOTE COMMENT
PUSHJ P,IREMAS
JRST RFINI1
BADTRM: MOVE C,5(TB) ; GET CHANNEL
JUMPGE B,CHLSTC ;NO, MUST BE UNMATCHED PARENS
SETZM LSTCH(C) ; DONT REUSE EOF CHR
PUSH TP,4(TB) ;CLOSE THE CHANNEL
PUSH TP,5(TB)
MCALL 1,FCLOSE
PUSH TP,EOFCND-1(B)
PUSH TP,EOFCND(B)
MCALL 1,EVAL ;AND EVAL IT
SETZB C,D
GETYP 0,A ; CHECK FOR FUNNY ACT
CAIE 0,TREADA
JRST RFINIS ; AND RETURN
PUSHJ P,CHUNW ; UNWIND TO POINT
MOVSI A,TREADA ; SEND MESSAGE BACK
JRST CONTIN
;HERE TO ATTEMPT TO OPEN A CLOSED CHANNEL
OPNFIL: PUSHJ P,OPNCHN ;GO DO THE OPEN
JUMPGE B,FNFFL ;LOSE IC B IS 0
JRST GETIO
CHLSTC: MOVE B,5(TB) ;GET CHANNEL BACK
JRST REREAD
BREAD: MOVE B,5(TB) ; GET CHANNEL
SKIPE BUFSTR(B)
JRST GETIO
MOVEI A,BUFLNT ; GET A BUFFER
PUSHJ P,IBLOCK
MOVEI C,BUFLNT(B) ; POINT TO END
HRLI C,440700
MOVE B,5(TB) ; CHANNEL BACK
MOVEI 0,C.BUF
IORM 0,-2(B)
MOVEM C,BUFSTR(B)
MOVSI C,TCHSTR+.VECT.
MOVEM C,BUFSTR-1(B)
JRST GETIO
;MAIN ENTRY TO READER
NIREAD: PUSHJ P,LSTCHR
NIREA1: PUSH P,[-1] ; DONT GOBBLE COMMENTS
JRST IREAD2
IREAD:
PUSHJ P,LSTCHR ;DON'T REREAD LAST CHARACTER
IREAD1: PUSH P,[0] ; FLAG SAYING SNARF COMMENTS
IREAD2: INTGO
BDLP: SKIPE C,9.(TB) ;HAVE WE GOT A SPLICING MACRO LEFT
JRST SPLMAC ;IF SO GIVE HIM SOME OF IT
PUSHJ P,NXTCH ;GOBBLE CHAR IN A AND TYPE IN D
MOVMS B ; FOR SPECIAL NEG HACK OF MACRO TABLES
CAIG B,ENTYPE
JUMPN B,@DTBL-1(B) ;ERROR ON ZERO TYPE OR FUNNY TYPE
JRST BADCHR
SPLMAC: HRRZ D,(C) ;GET THE REST OF THE SEGMENT
MOVEM D,9.(TB) ;AND PUT BACK IN PLACE
GETYP D,(C) ;SEE IF DEFERMENT NEEDED
CAIN D,TDEFER
MOVE C,1(C) ;IF SO, DO DEFEREMENT
MOVE A,(C)
MOVE B,1(C) ;GET THE GOODIE
AOS -1(P) ;ALWAYS A SKIP RETURN
POP P,(P) ;DONT WORRY ABOUT COMMENT SEARCHAGE
SETZB C,D ;MAKE SURE HE DOESNT THINK WE GOT COMMENT
POPJ P, ;GIVE HIM WHAT HE DESERVES
DTBL: NUMLET ;HERE IF NUMBER OR LETTER
NUMLET ;NUMBER
NUMCOD==.-DTBL
NUMLET ;+-
PLUMIN==.-DTBL
NUMLET ;.
DOTTYP==.-DTBL
NUMLET ;E
NONSPC==.-DTBL ;NUMBER OF NON-SPECIAL CHARACTERS
SPACE ;SPACING CHAR CR,LF,SP,TAB ETC.
SPATYP==.-DTBL ;TYPE FOR SPACE CHARS
;THE FOLLOWING ENTRIES ARE VARIOUS PUNCTUATION CROCKS
LPAREN ;( - BEGIN LIST
RPAREN ;) - END CURRENT LEVEL OF INPUT
LBRACK ;[ -BEGIN ARRAY
LBRTYP==.-DTBL
RBRACK ;] - END OF ARRAY
QUOTIT ;' - QUOTE THE FOLLOWING GOODIE
QUOTYP==.-DTBL
MACCAL ;% - INVOKE A READ TIME MACRO
MACTYP==.-DTBL
CSTRING ;" - CHARACTER STRING
CSTYP==.-DTBL
NUMLET ;\ - ESCAPE,BEGIN ATOM
ESCTYP==.-DTBL ;TYPE OF ESCAPE CHARACTER
SPECTY ;# - SPECIAL TYPE TO BE READ
SPCTYP==.-DTBL
OPNANG ;< - BEGIN ELEMENT CALL
SLMNT==.-DTBL ;TYPE OF START OF SEGMENT
CLSANG ;> - END ELEMENT CALL
EOFCHR ;^C - END OF FILE
COMNT ;; - BEGIN COMMENT
COMTYP==.-DTBL ;TYPE OF START OF COMMENT
GLOVAL ;, - GET GLOBAL VALUE
GLMNT==.-DTBL
ILLSQG ;{ - START TEMPLATE STRUCTURE
TMPTYP==.-DTBL
CLSBRA ;} - END TEMPLATE STRUCTURE
NTYPES==.-DTBL
; EXTENDED TABLE FOR ! HACKS
NUMLET ; !! FAKE OUT
SEGDOT ;!. - CALL TO LVAL (SEG)
DOTEXT==.-DTBL
UVECIN ;![ - INPUT UNIFORM VECTOR ]
LBREXT==.-DTBL
QUOSEG ;!' - SEG CALL TO QUOTE
QUOEXT==.-DTBL
SINCHR ;!" - INPUT ONE CHARACTER
CSEXT==.-DTBL
SEGIN ;!< - SEG CALL
SLMEXT==.-DTBL
GLOSEG ;!, - SEG CALL TO GVAL
GLMEXT==.-DTBL
LOSPATH ;!- - PATH NAME SEPARATOR
PATHTY==.-DTBL
TERM ;!$ - (EXCAL-ALT MODE) PUT ALL CLOSES
MANYT==.-DTBL
USRDS1 ; DISPATCH FOR USER TABLE (NO !)
USTYP1==.-DTBL
USRDS2 ; " " " " (WITH !)
USTYP2==.-DTBL
ENTYPE==.-DTBL
SPACE: PUSHJ P,LSTCHR ;DONT REREAD SPACER
JRST BDLP
USRDS1: SKIPA B,A ; GET CHAR IN B
USRDS2: MOVEI B,200(A) ; ! CHAR, DISP 200 FURTHER
ASH B,1
ADD B,7(TB) ; POINT TO TABLE ENTRY
GETYP 0,(B)
CAIN 0,TLIST
MOVE B,1(B) ; IF LIST, USE FIRST ITEM-SPECIAL NO BREAK HACK
SKIPL C,5(TB) ; GET CHANNEL POINTER (IF ANY)
JRST USRDS3
ADD C,[EOFCND-1,,EOFCND-1]
PUSH TP,$TBVL
MOVE SP,SPSTOR+1
HRRM SP,(TP) ; BUILD A TBVL
MOVE SP,TP
MOVEM SP,SPSTOR+1
PUSH TP,C
PUSH TP,(C)
PUSH TP,1(C)
MOVE PVP,PVSTOR+1
MOVEI D,PVLNT*2+1(PVP)
HRLI D,TREADA
MOVEM D,(C)
MOVEI D,(TB)
HLL D,OTBSAV(TB)
MOVEM D,1(C)
USRDS3: PUSH TP,(B) ; APPLIER
PUSH TP,1(B)
PUSH TP,$TCHRS ; APPLY TO CHARACTER
PUSH TP,A
PUSHJ P,LSTCHR ; FLUSH CHAR
MCALL 2,APPLY ; GO TO USER GOODIE
SKIPL 5(TB)
JRST USRDS9
MOVE SP,SPSTOR+1
HRRZ E,1(SP) ; POINT TO EOFCND SLOT
HRRZ SP,(SP) ; UNBIND MANUALLY
MOVEI D,(TP)
SUBI D,(SP)
MOVSI D,(D)
HLL SP,TP
SUB SP,D
MOVEM SP,SPSTOR+1
POP TP,1(E)
POP TP,(E)
SUB TP,[2,,2] ; FLUSH TP CRAP
USRDS9: GETYP 0,A ; CHECK FOR DISMISS?
CAIN 0,TSPLICE
JRST GOTSPL ; RETURN OF SEGMENT INDICATES SPLICAGE
CAIN 0,TREADA ; FUNNY?
JRST DOEOF
CAIE 0,TDISMI
JRST RET ; NO, RETURN FROM IREAD
JRST BDLP ; YES, IGNORE RETURN
GOTSPL: MOVEM B,9.(TB) ; STICK IN THE SPLICAGE SLOT SO IREADS WILL GET HIM
JRST BDLP ; GO BACK AND READ FROM OUR SPLICE, OK?
;HERE ON NUMBER OR LETTER, START ATOM
NUMLET: PUSHJ P,GOBBLE ;READ IN THE ATOM AND PUT PNTR ON ARG PDL
JRST RET ;NO SKIP RETURN I.E. NON NIL
;HERE TO START BUILDING A CHARACTER STRING GOODIE
CSTRING: PUSHJ P,GOBBL1 ;READ IN STRING
JRST RET
;ARRIVE HERE TO INVOKE A READ TIME MACRO FUNCTION
MACCAL: PUSHJ P,NXTCH1 ;READ ONE MORE CHARACTER
CAIE B,MACTYP ;IS IT ANOTHER MACRO CHAR
JRST MACAL2 ;NO, CALL MACRO AND USE VALUE
PUSHJ P,LSTCHR ;DONT REREAD %
PUSHJ P,MACAL1 ;OTHERWISE, USE SIDE EFFECCT, BUT NOT VALUE
JRST IREAD2
MACAL2: PUSH P,CRET
MACAL1: PUSHJ P,IREAD1 ;READ FUNCTION NAME
PUSHJ P,RETERR
PUSH TP,C
PUSH TP,D ; SAVE COMMENT IF ANY
PUSH TP,A ;SAVE THE RESULT
PUSH TP,B ;AND USE IT AS AN ARGUMENT
MCALL 1,EVAL
POP TP,D
POP TP,C ; RESTORE COMMENT IF ANY...
CRET: POPJ P,RET12
;CALL GOBBLE TO FIND THE TYPE AND THEN IREAD TO READ IT
SPECTY: PUSHJ P,NIREAD ; READ THE TYPES NAME (SHOULD BE AN ATOM)
PUSHJ P,RETERR
PUSH TP,A
PUSH TP,B
GETYP A,A
CAIN A,TFIX
JRST BYTIN
PUSHJ P,NXTCH ; GET NEXT CHAR
CAIN B,TMPTYP ; SKIP IF NOT TEMPLATE START
JRST RDTMPL
SETZB A,B
EXCH A,-1(TP)
EXCH B,(TP)
PUSH TP,A ;BEGIN SETTING UP CHTYPE CALL
PUSH TP,B
PUSHJ P,IREAD1 ;NOW READ STRUCTURE
PUSHJ P,RETERR
MOVEM C,-3(TP) ; SAVE COMMENT
MOVEM D,-2(TP)
EXCH A,-1(TP) ;USE AS FIRST ARG
EXCH B,(TP)
PUSH TP,A ;USE OTHER AS 2D ARG
PUSH TP,B
MCALL 2,CHTYPE ;ATTEMPT TO MUNG
RET13: POP TP,D
POP TP,C ; RESTORE COMMENT
RET12: SETOM (P) ; DONT LOOOK FOR MORE!
JRST RET
RDTMPL: PUSH P,["}] ; SET UP TERMINATE TEST
MOVE B,(TP)
PUSHJ P,IGVAL
MOVEM A,-1(TP)
MOVEM B,(TP)
PUSH P,[BLDTMP] ; FLAG FOR VECTOR READING CODE
JRST LBRAK2
BLDTMP: ADDI A,1 ; 1 MORE ARGUMENT
ACALL A,APPLY ; DO IT TO IT
POPJ P,
BYTIN: PUSHJ P,NXTCH ; CHECK FOR OPENR
CAIN B,SPATYP
PUSHJ P,SPACEQ
JRST .+3
PUSHJ P,LSTCHR
JRST BYTIN
CAIE B,TMPTYP
ERRUUO EQUOTE BAD-USE-OF-BYTE-STRING
PUSH P,["}]
PUSH P,[CBYTE1]
JRST LBRAK2
CBYTE1: AOJA A,CBYTES
RETERR: SKIPL A,5(TB)
MOVEI A,5(TB)-LSTCH ;NO CHANNEL, USE SLOT
HRRM B,LSTCH(A) ; RESTORE LAST CHAR
PUSHJ P,ERRPAR
SOS (P)
SOS (P)
POPJ P,
;THIS CODE CALLS IREAD RECURSIVELY TO READ THAT WHICH IS
;BETWEEN (), ARRIVED AT WHEN ( IS READ
SEGIN: PUSH TP,$TSEG
JRST OPNAN1
OPNANG: PUSH TP,$TFORM ;SAVE TYPE
OPNAN1: PUSH P,[">]
JRST LPARN1
LPAREN: PUSH P,[")]
PUSH TP,$TLIST ;START BY ASSUMING NIL
LPARN1: PUSH TP,[0]
PUSHJ P,LSTCHR ;DON'T REREAD PARENS
LLPLOP: PUSHJ P,IREAD1 ;READ IT
JRST LDONE ;HIT TERMINATOR
;HERE WHEN MUST ADD CAR TO CURRENT WINNER
GENCAR: PUSH TP,C ; SAVE COMMENT
PUSH TP,D
MOVE C,A ; SET UP CALL
MOVE D,B
PUSHJ P,INCONS ; CONS ON TO NIL
POP TP,D
POP TP,C
POP TP,E ;GET CDR
JUMPN E,CDRIN ;IF STACKED GOODIE NOT NIL SKIP
PUSH TP,B ;AND USE AS TOTAL VALUE
PUSH TP,$TLIST ;SAVE THIS AS FIRSST THING ON LIST
MOVE A,-2(TP) ; GET REAL TYPE
JRST .+2 ;SKIP CDR SETTING
CDRIN: HRRM B,(E)
PUSH TP,B ;CLOBBER IN NEW PARTIAL GOODIE
JUMPE C,LLPLOP ; JUMP IF NO COMMENT
PUSH TP,C
PUSH TP,D
MOVSI C,TATOM
MOVE D,MQUOTE COMMENT
PUSHJ P,IPUT
JRST LLPLOP ;AND CONTINUE
; HERE TO RAP UP LIST
LDONE: CAME B,(P) ;CHECK VALIDITY OF CHARACTER
PUSHJ P,MISMAT ;REPORT MISMATCH
SUB P, [1,,1]
POP TP,B ;GET VALUE OF PARTIAL RESULT
POP TP,A ;AND TYPE OF SAME
JUMPE B,RET ;VALUE IS NIL, DON'T POP AGAIN
POP TP,B ;POP FIRST LIST ELEMENT
POP TP,A ;AND TYPE
JRST RET
;THIS CODE IS SIMILAR TO LIST GENERATING CODE BUT IS FOR VECTORS
OPNBRA: PUSH P,["}] ; SAVE TERMINATOR
UVECIN: PUSH P,[135] ; CLOSE SQUARE BRACKET
PUSH P,[IEUVECTOR] ;PUSH NAME OF U VECT HACKER
JRST LBRAK2 ;AND GO
LBRACK: PUSH P,[135] ; SAVE TERMINATE
PUSH P,[IEVECTOR] ;PUSH GEN VECTOR HACKER
LBRAK2: PUSHJ P,LSTCHR ;FORCE READING NEW CHAR
PUSH P,[0] ; COUNT ELEMENTS
PUSH TP,$TLIST ; AND SLOT FOR GOODIES
PUSH TP,[0]
LBRAK1: PUSHJ P,IREAD1 ;RECURSIVELY READ ELEMENTS OF ARRAY
JRST LBDONE ;RAP UP ON TERMINATOR
STAKIT: EXCH A,-1(TP) ; STORE RESULT AND GET CURRENT LIST
EXCH B,(TP)
AOS (P) ; COUNT ELEMENTS
JUMPE C,LBRAK3 ; IF NO COMMENT, GO ON
MOVEI E,(B) ; GET CDR
PUSHJ P,ICONS ; CONS IT ON
MOVEI E,(B) ; SAVE RS
MOVSI C,TFIX ; AND GET FIXED NUM
MOVE D,(P)
PUSHJ P,ICONS
LBRAK3: PUSH TP,A ; SAVE CURRENT COMMENT LIST
PUSH TP,B
JRST LBRAK1
; HERE TO RAP UP VECTOR
LBDONE: CAME B,-2(P) ; FINISHED RETURN (WAS THE RIGHT STOP USED?)
PUSHJ P,MISMAB ; WARN USER
POP TP,1(TB) ; REMOVE COMMENT LIST
POP TP,(TB)
MOVE A,(P) ; COUNT TO A
PUSHJ P,-1@(P) ; MAKE THE VECTOR
SUB P,[3,,3]
; PUT COMMENTS ON VECTOR (OR UVECTOR)
MOVNI C,1 ; INDICATE TEMPLATE HACK
CAMN A,$TVEC
MOVEI C,1
CAMN A,$TUVEC ; SKIP IF UVECTOR
MOVEI C,0
PUSH P,C ; SAVE
PUSH TP,A ; SAVE VECTOR/UVECTOR
PUSH TP,B
VECCOM: SKIPN C,1(TB) ; ANY LEFT?
JRST RETVEC ; NO, LEAVE
MOVE A,1(C) ; ASSUME WINNING TYPES
SUBI A,1
HRRZ C,(C) ; CDR THE LIST
HRRZ E,(C) ; AGAIN
MOVEM E,1(TB) ; SAVE CDR
GETYP E,(C) ; CHECK DEFFERED
MOVSI D,(E)
CAIN E,TDEFER ; SKIP IF NOT DEFERRED
MOVE C,1(C)
CAIN E,TDEFER
GETYPF D,(C) ; GET REAL TYPE
MOVE B,(TP) ; GET VECTOR POINTER
SKIPGE (P) ; SKIP IF NOT TEMPLATE
JRST TMPCOM
HRLI A,(A) ; COUNTER
LSH A,@(P) ; MAYBE SHIFT IT
ADD B,A
MOVE A,-1(TP) ; TYPE
TMPCO1: PUSH TP,D
PUSH TP,1(C) ; PUSH THE COMMENT
MOVSI C,TATOM
MOVE D,MQUOTE COMMENT
PUSHJ P,IPUT
JRST VECCOM
TMPCOM: MOVSI A,(A)
ADD B,A
MOVSI A,TTMPLT
JRST TMPCO1
RETVEC: SUB P,[1,,1]
POP TP,B
POP TP,A
JRST RET
; BUILD A SINGLE CHARACTER ITEM
SINCHR: PUSHJ P,NXTC1 ;FORCE READ NEXT
CAIN B,ESCTYP ;ESCAPE?
PUSHJ P,NXTC1 ;RETRY
MOVEI B,(A)
MOVSI A,TCHRS
JRST RETCL
; HERE ON RIGHT PAREN, BRACKET, ANGLE BRACKET OR CTL C
CLSBRA:
CLSANG: ;CLOSE ANGLE BRACKETS
RBRACK: ;COMMON RETURN FOR END OF ARRAY ALSO
RPAREN: PUSHJ P,LSTCHR ;DON'T REREAD
EOFCH1: MOVE B,A ;GETCHAR IN B
MOVSI A,TCHRS ;AND TYPE IN A
RET1: SUB P,[1,,1]
POPJ P,
EOFCHR: SETZB C,D
JUMPL A,EOFCH1 ; JUMP ON REAL EOF
JRST RRSUBR ; MAYBE A BINARY RSUBR
DOEOF: MOVE A,[-1,,3]
SETZB C,D
JRST EOFCH1
; NORMAL RETURN FROM IREAD/IREAD1
RETCL: PUSHJ P,LSTCHR ;DONT REREAD
RET: AOS -1(P) ;SKIP
POP P,E ; POP FLAG
RETC: JUMPL E,RET2 ; DONT LOOK FOR COMMENTS
PUSH TP,A ; SAVE ITEM
PUSH TP,B
CHCOMN: PUSHJ P,NXTCH ; READ A CHARACTER
CAIE B,COMTYP ; SKIP IF COMMENT
JRST CHSPA
PUSHJ P,IREAD ; READ THE COMMENT
JRST POPAJ
MOVE C,A
MOVE D,B
JRST .+2
POPAJ: SETZB C,D
POP TP,B
POP TP,A
RET2: POPJ P,
CHSPA: CAIN B,SPATYP
PUSHJ P,SPACEQ ; IS IT A REAL SPACE
JRST POPAJ
PUSHJ P,LSTCHR ; FLUSH THE SPACE
JRST CHCOMN
;RANDOM MINI-SUBROUTINES USED BY THE READER
;READ A CHAR INTO A AND TYPE CODE INTO D
NXTC1: SKIPL B,5(TB) ;GET CHANNEL
JRST NXTPR1 ;NO CHANNEL, GO READ STRING
SKIPE LSTCH(B)
PUSHJ P,CNTACC ; COUNT ON ACCESS POINTER
JRST NXTC2
NXTC: SKIPL B,5(TB) ;GET CHANNEL
JRST NXTPRS ;NO CHANNEL, GO READ STRING
SKIPE A,LSTCH(B) ;CHAR IN A IF REUSE
JRST PRSRET
NXTC2: PUSHJ P,RXCT ;GET CHAR FROM INPUT
TLO A,200000 ; BIT TO AVOID ^@ LOSSAGE
HLLZS 2(TB) ;FLAG INDICATING ONE CHAR LOOK AHEAD
MOVEM A,LSTCH(B) ;SAVE THE CHARACTER
PRSRET: TLZ A,200000
TRZE A,400000 ;DONT SKIP IF SPECIAL
JRST RETYPE ;GO HACK SPECIALLY
GETCTP: CAILE A,177 ; CHECK RANGE
JRST BADCHR
PUSH P,A ;AND SAVE FROM DIVISION
ANDI A,177
IDIVI A,CHRWD ;YIELDS WORD AND CHAR NUMBER
LDB B,BYTPNT(B) ;GOBBLE TYPE CODE
POP P,A
POPJ P,
NXTPRS: SKIPE A,5(TB) ;GET OLD CHARACTER IF ONE EXISTS
JRST PRSRET
NXTPR1: MOVEI A,400033
PUSH P,C
MOVE C,11.(TB)
HRRZ B,(C) ;GET THE STRING
SOJL B,NXTPR3
HRRM B,(C)
ILDB A,1(C) ;GET THE CHARACTER FROM THE STRING
NXTPR2: MOVEM A,5(TB) ;SAVE IT
POP P,C
JRST PRSRET ;CONTINUE
NXTPR3: SETZM 8.(TB)
SETZM 9.(TB) ;CLEAR OUT LOCATIVE, AT END OF STRING
JRST NXTPR2
; NXTCH AND NXTCH1 ARE SAME AS NXTC AND NXTC1 EXCEPT THEY CHECK !
; HACKS
NXTCH1: PUSHJ P,NXTC1 ;READ CHAR
JRST .+2
NXTCH: PUSHJ P,NXTC ;READ CHAR
CAIGE B,NTYPES+1 ;IF 1 > THAN MAX, MUST BE SPECIAL
JRST CHKUS1 ; CHECK FOR USER DISPATCH
CAIN B,NTYPES+1 ;FOR OBSCURE BUG FOUND BY MSG
PUSHJ P,NXTC1 ;READ NEXT ONE
HLLOS 2(TB) ;FLAG FOR TWO CHAR LOOK AHEAD
RETYP1: CAIN A,". ;!.
MOVEI B,DOTEXT ;YES, GET EXTENDED TYPE
CAIN A,"[
MOVEI B,LBREXT
CAIN A,"'
MOVEI B,QUOEXT
CAIN A,"\
MOVEI B,CSEXT
CAIN A,""
MOVEI B,CSEXT
CAIN A,"-
MOVEI B,PATHTY
CAIN A,"<
MOVEI B,SLMEXT
CAIN A,",
MOVEI B,GLMEXT
CAIN A,33
MOVEI B,MANYT ;! ALTMODE
CRMLST: ADDI A,400000 ;CLOBBER LASTCHR
PUSH P,B
SKIPL B,5(TB) ;POINT TO CHANNEL
MOVEI B,5(TB)-LSTCH ;NO CHANNEL, POINT AT SLOT
HRRM A,LSTCH(B)
SUBI A,400000 ;DECREASE CHAR
POP P,B
CHKUS2: SKIPN 7(TB) ; SKIP IF USER TABLE
JRST UPLO
PUSH P,A
ADDI A,200
ASH A,1 ; POINT TO SLOT
HRLS A
ADD A,7(TB)
SKIPL A ;IS THERE VECTOR ENOUGH?
JRST CHKUS4
SKIPN 1(A) ; NON-ZERO==>USER FCN EXISTS
JRST CHKUS4 ; HOPE HE APPRECIATES THIS
MOVEI B,USTYP2
CHKRDO: PUSH P,0 ; CHECK FOR REDOING IF CHAR IN TABLE
GETYP 0,(A)
CAIE 0,TCHRS
JRST CHKUS5
POP P,0 ;WE ARE TRANSMOGRIFYING
POP P,(P) ;FLUSH OLD CHAR
MOVE A,1(A) ;GET NEW CHARACTER
PUSH P,7(TB)
PUSH P,2(TB) ; FLAGS FOR NUM OF CHRS IN LOOK AHEAD
PUSH P,5(TB) ; TO AVOID SMASHING LSTCHR
SETZM 5(TB) ; CLEAR OUT CHANNEL
SETZM 7(TB) ;CLEAR OUT TABLE
TRZE A,200 ; ! HACK
TRO A,400000 ; TURN ON PROPER BIT
PUSHJ P,PRSRET
POP P,5(TB) ; GET BACK CHANNEL
POP P,2(TB)
POP P,7(TB) ;GET BACK OLD PARSE TABLE
POPJ P,
CHKUS5: CAIE 0,TLIST
JRST .+4 ; SPECIAL NON-BREAK TYPE HACK
MOVNS -1(P) ; INDICATE BY NEGATIVE
MOVE A,1(A) ; GET <1 LIST>
GETYP 0,(A) ; AND GET THE TYPE OF THAT
CAIE 0,TFIX ; SEE IF HE WANTS SAME CHAR WITH DIFF TYPE
JRST CHKUS6 ; JUST A VANILLA HACK
MOVE A,1(A) ; PRETEND IT IS SAME TYPE AS NEW CHAR
PUSH P,7(TB) ; CLEAR OUT TRANSLATE TABLE
PUSH P,2(TB) ; FLAGS FOR # OF CHRS IN LOOK AHEAD
SETZM 7(TB)
TRZE A,200
TRO A,400000 ; TURN ON PROPER BIT IF ! HACK
PUSHJ P,PRSRET ; REGET TYPE
POP P,2(TB)
POP P,7(TB) ; PUT TRANSLATE TABLE BACK
CHKUS6: SKIPGE -1(P) ; SEE IF A SPECIAL NON-BREAK
MOVNS B ; SEXY, HUH?
POP P,0
POP P,A
MOVMS A ; FIX UP A POSITIVE CHARACTER
POPJ P,
CHKUS4: POP P,A
JRST UPLO
CHKUS1: SKIPN 7(TB) ; USER CHECK FOR NOT ! CASE
POPJ P,
PUSH P,A
ASH A,1
HRLS A
ADD A,7(TB)
SKIPL A
JRST CHKUS3
SKIPN 1(A)
JRST CHKUS3
MOVEI B,USTYP1
JRST CHKRDO ; TRANSMOGRIFY CHARACTER?
CHKUS3: POP P,A
POPJ P,
UPLO: POPJ P, ; LETS NOT AND SAY WE USED TO
; AVOID STRANGE ! BLECHAGE
RETYPE: PUSHJ P,GETCTP ;GET TYPE OF CHAR
JRST RETYP1
NXTCS: PUSHJ P,NXTC
PUSH P,A ; HACK TO NOT TRANSLATE CHAR
PUSHJ P,CHKUS1 ; BUT DO TRANSLATION OF TYPE IF HE WANTS
POP P,A ; USED TO BUILD UP STRINGS
POPJ P,
CHKALT: CAIN A,33 ;ALT?
MOVEI B,MANYT
JRST CRMLST
TERM: MOVEI B,0 ;RETURN A 0
JRST RET1
;AND RETURN
CHKMIN: CAIN A,"- ; IF CHAR IS -, WINNER
MOVEI B,PATHTY
JRST CRMLST
LOSPAT: PUSHJ P,LSTCHR ; FIX RECURSIVE LOSAGE
ERRUUO EQUOTE UNATTACHED-PATH-NAME-SEPARATOR
; HERE TO SEE IF READING RSUBR
RRSUBR: PUSHJ P,LSTCHR ; FLUSH JUST READ CHAR
SKIPL B,5(TB) ; SKIP IF A CHANNEL EXISTS
JRST SPACE ; ELSE LIKE A SPACE
MOVE C,@BUFSTR(B) ; SEE IF FLAG SAYS START OF RSUBR
TRNN C,1 ; SKIP IF REAL RSUBR
JRST EOFCH2 ; NO, IGNORE FOR NOW
; REALLY ARE READING AN RSUBR
HRRZ 0,4(TB) ; GET READ/READB INDICATOR
MOVE C,ACCESS(B) ; GET CURRENT ACCESS
JUMPN 0,.+3 ; ALREADY WORDS, NO NEED TO DIVIDE
ADDI C,4 ; ROUND UP
IDIVI C,5
PUSH P,C ; SAVE WORD ACCESS
MOVEI A,(C) ; COPY IT FOR CALL
JUMPN 0,.+3
IMULI C,5
MOVEM C,ACCESS(B) ; FIXUP ACCESS
HLLZS ACCESS-1(B) ; FOR READB LOSER
PUSHJ P,DOACCS ; AND GO THERE
PUSH P,[0] ; FOR READ IN
HRROI A,(P) ; PREPARE TO READ LENGTH
PUSHJ P,DOIOTI ; READ IT
POP P,C ; GET READ GOODIE
JUMPGE A,.+4 ; JUMP IF WON
SUB P,[1,,1]
EOFCH2: HRROI A,3
JRST EOFCH1
MOVEI A,(C) ; COPY FOR GETTING BLOCK
ADDI C,1 ; COUNT COUNT WORD
ADDM C,(P)
PUSH TP,$TUVEC ; WILL HOLD UVECTOR OF FIXUPS IF THEY STAY
PUSH TP,[0]
PUSHJ P,IBLOCK ; GET A BLOCK
PUSH TP,$TUVEC
PUSH TP,B ; AND SAVE
MOVE A,B ; READY TO IOT IT IN
MOVE B,5(TB) ; GET CHANNEL BACK
MOVSI 0,TUVEC ; SETUP A'S TYPE
MOVE PVP,PVSTOR+1
MOVEM 0,ASTO(PVP)
PUSHJ P,DOIOTI ; IN COMES THE WHOLE BLOCK
MOVE PVP,PVSTOR+1
SETZM ASTO(PVP) ; A NO LONGER SPECIAL
MOVEI C,BUFSTR-1(B) ; NO RESET BUFFER
PUSHJ P,BYTDOP ; A POINTS TO DOPW WORD
SUBI A,2
HRLI A,010700 ; SETUP BYTE POINTER TO END
HLLZS BUFSTR-1(B) ; ZERO CHAR COUNNT
MOVEM A,BUFSTR(B)
HRRZ A,4(TB) ; READ/READB FLG
MOVE C,(P) ; ACCESS IN WORDS
SKIPN A ; SKIP FOR ASCII
IMULI C,5 ; BUMP
MOVEM C,ACCESS(B) ; UPDATE ACCESS
PUSHJ P,NIREAD ; READ RSUBR VECTOR
JRST BRSUBR ; LOSER
GETYP A,A ; VERIFY A LITTLE
CAIE A,TVEC ; DONT SKIP IF BAD
JRST BRSUBR ; NOT A GOOD FILE
PUSHJ P,LSTCHR ; FLUSH REREAD CHAR
MOVE C,(TP) ; CODE VECTOR BACK
MOVSI A,TCODE
HLR A,B ; FUNNY COUNT
MOVEM A,(B) ; CLOBBER
MOVEM C,1(B)
PUSH TP,$TRSUBR ; MAKE RSUBR
PUSH TP,B
; NOW LOOK OVER FIXUPS
MOVE B,5(TB) ; GET CHANNEL
MOVE C,ACCESS(B)
HLLZS ACCESS-1(B) ; FOR READB LOSER
HRRZ 0,4(TB) ; READ/READB FLG
JUMPN 0,RSUB1
ADDI C,4 ; ROUND UP
IDIVI C,5 ; TO WORDS
MOVEI D,(C) ; FIXUP ACCESS
IMULI D,5
MOVEM D,ACCESS(B) ; AND STORE
RSUB1: ADDI C,1 ; ACCOUNT FOR EXTRA COUNTERS
MOVEM C,(P) ; SAVE FOR LATER
MOVEI A,-1(C) ; FOR DOACS
MOVEI C,2 ; UPDATE REAL ACCESS
SKIPN 0 ; SKIP FOR READB CASE
MOVEI C,10.
ADDM C,ACCESS(B)
PUSHJ P,DOACCS ; DO THE ACCESS
PUSH TP,$TUVEC ; SLOT FOR FIXUP BUFFER
PUSH TP,[0]
; FOUND OUT IF FIXUPS STAY
MOVE B,MQUOTE KEEP-FIXUPS
PUSHJ P,ILVAL ; GET VALUE
GETYP 0,A
MOVE B,5(TB) ; CHANNEL BACK TO B
CAIE 0,TUNBOU
CAIN 0,TFALSE
JRST RSUB4 ; NO, NOT KEEPING FIXUPS
PUSH P,[0] ; SLOT TO READ INTO
HRROI A,(P) ; GET LENGTH OF SAME
PUSHJ P,DOIOTI
POP P,C
MOVEI A,(C) ; GET UVECTOR FOR KEEPING
ADDM C,(P) ; ACCESS TO END
PUSH P,C ; SAVE LENGTH OF FIXUPS
PUSHJ P,IBLOCK
MOVEM B,-6(TP) ; AND SAVE
MOVE A,B ; FOR IOTING THEM IN
ADD B,[1,,1] ; POINT PAST VERS #
MOVEM B,(TP)
MOVSI C,TUVEC
MOVE PVP,PVSTOR+1
MOVEM C,ASTO(PVP)
MOVE B,5(TB) ; AND CHANNEL
PUSHJ P,DOIOTI ; GET THEM
MOVE PVP,PVSTOR+1
SETZM ASTO(PVP)
MOVE A,(TP) ; GET VERS
PUSH P,-1(A) ; AND PUSH IT
JRST RSUB5
RSUB4: PUSH P,[0]
PUSH P,[0] ; 2 SLOTS FOR READING
MOVEI A,-1(P)
HRLI A,-2
PUSHJ P,DOIOTI
MOVE C,-1(P)
MOVE D,(P)
ADDM C,-2(P) ; NOW -2(P) IS ACCESS TO END OF FIXUPS
RSUB5: MOVEI C,BUFSTR-1(B) ; FIXUP BUFFER
PUSHJ P,BYTDOP
SUBI A,2 ; POINT BEFORE D.W.
HRLI A,10700
MOVEM A,BUFSTR(B)
HLLZS BUFSTR-1(B)
SKIPE -6(TP)
JRST RSUB2A
SUBI A,BUFLNT-1 ; ALSO MAKE AN IOT FLAVOR BUFFER
HRLI A,-BUFLNT
MOVEM A,(TP)
MOVSI C,TUVEC
MOVE PVP,PVSTOR+1
MOVEM C,ASTO(PVP)
PUSHJ P,DOIOTI
MOVE PVP,PVSTOR+1
SETZM ASTO(PVP)
RSUB2A: PUSH P,-1(P) ; ANOTHER COPY OF LENGTH OF FIXUPS
; LOOP FIXING UP NEW TYPES
RSUB2: PUSHJ P,WRDIN ; SEE WHAT NEXT THING IS
JRST RSUB3 ; NO MORE, DONE
JUMPL E,STSQ ; MUST BE FIRST SQUOZE
MOVNI 0,(E) ; TO UPDATE AMNT OF FIXUPS
ADDB 0,(P)
HRLI E,(E) ; IS LENGTH OF STRING IN WORDS
ADD E,(TP) ; FIXUP BUFFER POINTER
JUMPL E,.+3
SUB E,[BUFLNT,,BUFLNT]
JUMPGE E,.-1 ; STILL NOT RIGHT
EXCH E,(TP) ; FIX UP SLOT
HLRE C,E ; FIX BYTE POINTER ALSO
IMUL C,[-5] ; + CHARS LEFT
MOVE B,5(TB) ; CHANNEL
PUSH TP,BUFSTR-1(B)
PUSH TP,BUFSTR(B)
HRRM C,BUFSTR-1(B)
HRLI E,440700 ; AND BYTE POINTER
MOVEM E,BUFSTR(B)
PUSHJ P,NIREAD ; READ ATOM NAME OF TYPE
TDZA 0,0 ; FLAG LOSSAGE
MOVEI 0,1 ; WINNAGE
MOVE C,5(TB) ; RESET BUFFER
POP TP,BUFSTR(C)
POP TP,BUFSTR-1(C)
JUMPE 0,BRSUBR ; BAD READ OF RSUBR
GETYP A,A ; A LITTLE CHECKING
CAIE A,TATOM
JRST BRSUBR
PUSHJ P,LSTCHR ; FLUSH REREAD CHAR
HRRZ 0,4(TB) ; FIXUP ACCESS PNTR
MOVE C,5(TB)
MOVE D,ACCESS(C)
HLLZS ACCESS-1(C) ; FOR READB HACKER
ADDI D,4
IDIVI D,5
IMULI D,5
SKIPN 0
MOVEM D,ACCESS(C) ; RESET
TYFIXE: PUSHJ P,TYPFND ; SEE IF A LEGAL TYPE NAME
JRST TYPFIX ; GO SEE USER ABOUT THIS
PUSHJ P,FIXCOD ; GO FIX UP THE CODE
JRST RSUB2
; NOW FIX UP SUBRS ETC. IF NECESSARY
STSQ: MOVE B,MQUOTE MUDDLE
PUSHJ P,IGVAL ; GET CURRENT VERS
CAME B,-1(P) ; SKIP IF NO FIXUPS NEEDED
JRST DOFIX0 ; MUST DO THEM
; ALL DONE, ACCESS PAST FIXUPS AND RETURN
RSUB3: MOVE A,-3(P)
MOVE B,5(TB)
MOVEI C,(A) ; UPDATE CHANNEL ACCESS IN CASE SKIPPING
HRRZ 0,4(TB) ; READ/READB FLAG
SKIPN 0
IMULI C,5
MOVEM C,ACCESS(B) ; INTO ACCESS SLOT
HLLZS ACCESS-1(B)
PUSHJ P,DOACCS ; ACCESSED
MOVEI C,BUFSTR-1(B) ; FIX UP BUFFER
PUSHJ P,BYTDOP
SUBI A,2
HRLI A,10700
MOVEM A,BUFSTR(B)
HLLZS BUFSTR-1(B)
SKIPN A,-6(TP) ; SKIP IF KEEPING FIXUPS
JRST RSUB6
PUSH TP,$TUVEC
PUSH TP,A
MOVSI A,TRSUBR
MOVE B,-4(TP)
MOVSI C,TATOM
MOVE D,MQUOTE RSUBR
PUSHJ P,IPUT ; DO THE ASSOCIATION
RSUB6: MOVE B,-2(TP) ; GET RSUBR
MOVSI A,TRSUBR
SUB P,[4,,4] ; FLUSH P CRUFT
SUB TP,[10,,10]
JRST RET
; FIXUP SUBRS ETC.
DOFIX0: SKIPN C,-6(TP) ; GET BUFFER IF KEEPING
JRST DOFIXE
MOVEM B,(C) ; CLOBBER
JRST DOFIXE
FIXUPL: PUSHJ P,WRDIN
JRST RSUB3
DOFIXE: JUMPGE E,BRSUBR
TLZ E,740000 ; KILL BITS
IFN KILTV,[
CAME E,[SQUOZE 0,DSTO]
JRST NOOPV
MOVE E,[SQUOZE 40,DSTORE]
MOVE A,(TP) ; XXX patched
MOVEM E,-1(A) ; XXX patched
JRST .+3
NOOPV:
]
PUSHJ P,SQUTOA ; LOOK IT UP
JRST BRSUBR
MOVEI D,(E) ; FOR FIXCOD
PUSHJ P,FIXCOD ; FIX 'EM UP
JRST FIXUPL
; ROUTINE TO FIXUP ACTUAL CODE
FIXCOD: MOVEI E,0 ; FOR HWRDIN
PUSH P,D ; NEW VALUE
PUSHJ P,HWRDIN ; GET HW NEEDED
MOVE D,(P) ; GET NEW VAL
MOVE A,(TP) ; AND BUFFER POINTER
SKIPE -6(TP) ; SAVING?
HRLM D,-1(A) ; YES, CLOBBER
SUB C,(P) ; DIFFERENCE
MOVN D,C
FIXLP: PUSHJ P,HWRDIN ; GET AN OFFSET
JUMPE C,FIXED
HRRES C ; MAKE NEG IF NEC
JUMPL C,LHFXUP
ADD C,-4(TP) ; POINT INTO CODE
IFN KILTV,[
LDB 0,[220400,,-1(C)] ; GET INDEX FIELD
CAIE 0,7
JRST NOTV
KIND: MOVEI 0,0
DPB 0,[220400,,-1(C)]
JRST DONTV
NOTV: CAIE 0,6 ; IS IT PVP
JRST DONTV
HRRZ 0,-1(C)
CAIE 0,12 ; OLD DSTO
JRST DONTV
MOVEI 0,33.
ADDM 0,-1(C)
JRST KIND
DONTV:
]
ADDM D,-1(C)
JRST FIXLP
LHFXUP: MOVMS C
ADD C,-4(TP)
MOVSI 0,(D)
ADDM 0,-1(C)
JRST FIXLP
FIXED: SUB P,[1,,1]
POPJ P,
; ROUTINE TO READ A WORD FROM BUFFER
WRDIN: PUSH P,A
PUSH P,B
SOSG -3(P) ; COUNT IT DOWN
JRST WRDIN1
AOS -2(P) ; SKIP RETURN
MOVE B,5(TB) ; CHANNEL
HRRZ A,4(TB) ; READ/READB SW
MOVEI E,5
SKIPE A
MOVEI E,1
ADDM E,ACCESS(B)
MOVE A,(TP) ; BUFFER
MOVE E,(A)
AOBJP A,WRDIN2 ; NEED NEW BUFFER
MOVEM A,(TP)
WRDIN1: POP P,B
POP P,A
POPJ P,
WRDIN2: MOVE B,-3(P) ; IS THIS LAST WORD?
SOJLE B,WRDIN1 ; YES, DONT RE-IOT
SUB A,[BUFLNT,,BUFLNT]
MOVEM A,(TP)
MOVSI B,TUVEC
MOVE PVP,PVSTOR+1
MOVEM B,ASTO(PVP)
MOVE B,5(TB)
PUSHJ P,DOIOTI
MOVE PVP,PVSTOR+1
SETZM ASTO(PVP)
JRST WRDIN1
; READ IN NEXT HALF WORD
HWRDIN: JUMPN E,NOIOT ; USE EXISTING WORD
PUSH P,-3(P) ; FAKE OUT WRDIN IF NEC.
PUSHJ P,WRDIN
JRST BRSUBR
POP P,-4(P) ; RESET COUNTER
HLRZ C,E ; RET LH
POPJ P,
NOIOT: HRRZ C,E
MOVEI E,0
POPJ P,
TYPFIX: PUSH TP,$TATOM
PUSH TP,EQUOTE BAD-TYPE-NAME
PUSH TP,$TATOM
PUSH TP,B
PUSH TP,$TATOM
PUSH TP,EQUOTE ERRET-TYPE-NAME-DESIRED
MCALL 3,ERROR
JRST TYFIXE
BRSUBR: ERRUUO EQUOTE RSUBR-IN-BAD-FORMAT
;TABLE OF BYTE POINTERS FOR GETTING CHARS
BYTPNT": 350700,,CHTBL(A)
260700,,CHTBL(A)
170700,,CHTBL(A)
100700,,CHTBL(A)
010700,,CHTBL(A)
;HERE ARE THE TABLES OF CHXRACTERS (NOTE EVERYTHING NOT SPECIFIED IS
;IN THE NUMBER LETTER CATAGORY)
SETCHR 2,[0123456789]
SETCHR 3,[+-]
SETCHR 4,[.]
SETCHR 5,[Ee]
SETCOD 6,[0,15,12,11,14,40,33] ;ALL ARE TYPE 2 (SPACING - FF,TAB,SPACE,ALT-MODE)
INCRCH 7,[()[]'%"\#<>] ;GIVE THESE INCREASRNG CODES FROM 3
SETCOD 22,[3] ;^C - EOF CHARACTER
INCRCH 23,[;,{}!] ;COMMENT AND GLOBAL VALUE AND SPECIAL
CHTBL:
OUTTBL ;OUTPUT THE TABLE RIGHT HERE
; THIS CODE FLUSHES WANDERING COMMENTS
COMNT: PUSHJ P,IREAD
JRST COMNT2
JRST BDLP
COMNT2: SKIPL A,5(TB) ; RESTORE CHANNEL
MOVEI A,5(TB)-LSTCH ;NO CHANNEL, POINT AT SLOT
HRRM B,LSTCH(A) ; CLOBBER IN CHAR
PUSHJ P,ERRPAR
JRST BDLP
;SUBROUTINE TO READ CHARS ONTO STACK
GOBBL1: MOVEI FF,0 ;KILL ALL FLAGS
PUSHJ P,LSTCHR ;DON'T REREAD "
TROA FF,NOTNUM+INSTRN ;SURPRESS NUMBER CONVERSION
GOBBLE: MOVEI FF,0 ;FLAGS CONCERRNING CURRENT GOODIE IN HERE
MOVE A,TP ;GOBBLE CURRENT TP TO BE PUSHED
MOVEI C,6 ;NOW PUSH 6 0'S ON TO STACK
PUSH TP,$TFIX ;TYPE IS FIXED
PUSH TP,FF ;AND VALUE IS 0
SOJG C,.-2 ;FOUR OF THEM
PUSH TP,$TTP ;NOW SAVE OLD TP
ADD A,[1,,1] ;MAKE IT LOOK LIKE A TB
PUSH TP,A
MOVEI D,0 ;ZERO OUT CHARACTER COUNT
GOB1: MOVSI C,(<440700,,(P)>) ;SET UP FIRST WORD OF CHARS
PUSH P,[0] ;BYTE POINTER
GOB2: PUSH P,FF ;SAVE FLAG REGISTER
INTGO ; IN CASE P OVERFLOWS
MOVEI A,NXTCH
TRNE FF,INSTRN
MOVEI A,NXTCS ; HACK TO GET MAYBE NEW TYPE WITHOUT CHANGE
PUSHJ P,(A)
POP P,FF ;AND RESTORE FLAG REGISTER
CAIN B,ESCTYP ;IS IT A CHARACTER TO BE ESCAPED
JRST ESCHK ;GOBBLE THE ESCAPED CHARACTER
TRNE FF,INSTRN ;ARE WE BUILDING A CHAR STRING
JRST ADSTRN ;YES, GO READ IN
CAILE B,NONSPC ;IS IT SPECIAL
JRST DONEG ;YES, RAP THIS UP
TRNE FF,NOTNUM+OCTWIN ;IS NUMERIC STILL WINNING
JRST SYMB ;NO, ONLY DO CHARACTER HACKING
CAIL A,60 ;CHECK FOR DIGIT
CAILE A,71
JRST SYMB1 ;NOT A DIGIT
JRST CNV ;GO CONVERT TO NUMBER
CNV:
;ARRIVE HERE IF STILL BUILDING A NUMBER
CNV: MOVE B,(TP) ;GOBBLE POINTER TO TEMPS
TRO FF,NUMWIN ;SAY DIGITSSEEN
SUBI A,60 ;CONVERT TO A NUMBER
TRNE FF,EFLG ;HAS E BEEN SEEN
JRST ECNV ;YES, CONVERT EXPONENT
TRNE FF,DOTSEN ;HAS A DOT BEEN SEEN
JRST DECNV ;YES, THIS IS A FLOATING NUMBER
MOVE E,ONUM(B) ; OCTAL CONVERT
LSH E,3
ADDI E,(A)
MOVEM E,ONUM(B)
TRNE FF,OCTSTR ; SKIP OTHER CONVERSIONS IF OCTAL FORCE
JRST CNV1
JFCL 17,.+1 ;KILL ALL FLAGS
MOVE E,CNUM(B) ;COMPUTE CURRENT RADIX
IMUL E,3(TB)
ADD E,A ;ADD IN CURRENT DIGIT
JFCL 10,.+3
MOVEM E,CNUM(B)
JRST DECNV1
MOVE E,3(TB) ; SEE IF CURRENT RADIX DECIMAL
CAIE E,10.
JRST DECNV ; YES, FORCE FLOAT
TROA FF,OVFLEW
DECNV: TRO FF,FLONUM ;SET FLOATING FLAG
DECNV1: JFCL 17,.+1 ;CLEAR ALL FLAGS
MOVE E,DNUM(B) ;GET DECIMAL NUMBER
IMULI E,10.
JFCL 10,CNV2 ;JUMP IF OVERFLOW
ADD E,A ;ADD IN DIGIT
MOVEM E,DNUM(B)
TRNE FF,FLONUM ;IS THIS FRACTION?
SOS NDIGS(B) ;YES, DECREASE EXPONENT BY ONE
CNV1: PUSHJ P,NXTCH ;RE-GOBBLE CHARACTER
JRST SYMB2 ;ALSO DEPOSIT INTO SYMBOL BEING MADE
CNV2: ;OVERFLOW IN DECIMAL NUMBER
TRNE FF,DOTSEN ;IS THIS FRACTION PART?
JRST CNV1 ;YES,IGNORE DIGIT
AOS NDIGS(B) ;NO, INCREASE IMPLICIT EXPONENT BY ONE
TRO FF,FLONUM ;SET FLOATING FLAG BUT
JRST CNV1 ;DO NOT FORCE DECIMAL(DECFRC)
ECNV: ;CONVERT A DECIMAL EXPONENT
HRRZ E,ENUM(B) ;GET EXPONENT
IMULI E,10.
ADD E,A ;ADD IN DIGIT
TLNN E,777777 ;IF OVERFLOW INTO LEFT HALF
HRRM E,ENUM(B) ;DO NOT STORE(CATCH ERROR LATER)
JRST CNV1
JRST SYMB2 ;ALSO DEPOSIT INTO SYMBOL BEING MADE
;HERE TO PUT INTO IDENTIFIER BEING BUILT
ESCHK: PUSHJ P,NXTC1 ;GOBBLE NEXT CHAR
SYMB: MOVE B,(TP) ;GET BACK TEM POINTER
TRZE FF,EFLG ;IF E FLAG SET
HLRZ FF,ENUM(B) ;RESTORE SAVED FLAGS
TRO FF,NOTNUM ;SET NOT NUMBER FLAG
SYMB2: TRO FF,NFIRST ;NOT FIRST IN WORLD
SYMB3: IDPB A,C ;INSERT IT
PUSHJ P,LSTCHR ;READ NEW CHARACTER
TLNE C,760000 ;WORD FULL?
AOJA D,GOB2 ;NO, KEEP TRYING
AOJA D,GOB1 ;COUNT WORD AND GO
;HERE TO CHECK FOR +,-,. IN NUMBER
SYMB1: TRNE FF,NFIRST ;IS THIS THE FIRST CHARACTER
JRST CHECK. ;NO, ONLY LOOK AT DOT
CAIE A,"- ;IS IT MINUS
JRST .+3 ;NO CHECK PLUS
TRO FF,NEGF ;YES, NEGATE AT THE END
JRST SYMB2
CAIN A,"+ ;IS IT +
JRST SYMB2 ;ESSENTIALLY IGNORE IT
CAIE A,"* ; FUNNY OCTAL CROCK?
JRST CHECK.
TRO FF,OCTSTR
JRST SYMB2
;COULD BE .
CHECK.: PUSHJ P,LSTCHR ;FLUSH LAST CHARACTER
MOVEI E,0
TRNN FF,DOTSEN+EFLG ;IF ONE ALREADY SEEN
CAIE A,".
JRST CHECKE ;GO LOOK FOR E
IFN FRMSIN,[
TRNN FF,NFIRST ;IS IT THE FIRST
JRST DOT1 ;YES, COULD MEAN EVALUATE A VARIABLE
]
CHCK.1: TRO FF,DECFRC+DOTSEN ;FORCE DECIMAL
IFN FRMSIN, TRNN FF,FRSDOT ;IF NOT FIRST ., PUT IN CHAR STRING
JRST SYMB2 ;ENTER INTO SYMBOL
IFN FRMSIN, JRST GOB2 ;IGNORE THE "."
IFN FRMSIN,[
;HERE TO SET UP FOR .FOO ..FOO OR.<ABC>
DOT1: PUSH P,FF ;SAVE FLAGS
PUSHJ P,NXTCH1 ;GOBBLE A NEW CHARACTER
POP P,FF ;RESTORE FLAGS
TRO FF,FRSDOT ;SET FLAG IN CASE
CAIN B,NUMCOD ;SKIP IF NOT NUMERIC
JRST CHCK.1 ;NUMERIC, COULD BE FLONUM
; CODE TO HANDLE ALL IMPLICIT CALLS I.E. QUOTE, LVAL, GVAL
MOVSI B,TFORM ;LVAL
MOVE A,MQUOTE LVAL
SUB P,[2,,2] ;POP OFF BYTE POINTER AND GOBBLE CALL
POP TP,TP
SUB TP,[1,,1] ;REMOVE TP JUNK
JRST IMPCA1
GLOSEG: SKIPA B,$TSEG ;SEG CALL TO GVAL
GLOVAL: MOVSI B,TFORM ;FORM CALL TO SAME
MOVE A,MQUOTE GVAL
JRST IMPCAL
QUOSEG: SKIPA B,$TSEG ;SEG CALL TO QUOTE
QUOTIT: MOVSI B,TFORM
MOVE A,MQUOTE QUOTE
JRST IMPCAL
SEGDOT: MOVSI B,TSEG ;SEG CALL TO LVAL
MOVE A,MQUOTE LVAL
IMPCAL: PUSHJ P,LSTCHR ;FLUSH LAST CHAR EXCEPT
IMPCA1: PUSH TP,$TATOM ;FOR .FOO FLAVOR
PUSH TP,A ;PUSH ARGS
PUSH P,B ;SAVE TYPE
PUSHJ P,IREAD1 ;READ
JRST USENIL ; IF NO ARG, USE NIL
IMPCA2: PUSH TP,C
PUSH TP,D
MOVE C,A ; GET READ THING
MOVE D,B
PUSHJ P,INCONS ; CONS TO NIL
MOVEI E,(B) ; PREPARE TON CONS ON
POPARE: POP TP,D ; GET ATOM BACK
POP TP,C
EXCH C,-1(TP) ; SAVE THAT COMMENT
EXCH D,(TP)
PUSHJ P,ICONS
POP P,A ;GET FINAL TYPE
JRST RET13 ;AND RETURN
USENIL: PUSH TP,C
PUSH TP,D
SKIPL A,5(TB) ; RESTOR LAST CHR
MOVEI A,5(TB)-LSTCH ;NO CHANNEL, POINT AT SLOT
HRRM B,LSTCH(A)
MOVEI E,0
JRST POPARE
;HERE AFTER READING ATOM TO CALL VALUE
.SET: SUB P,[1,,1] ;FLUSH GOBBLE CALL
PUSH P,$TFORM ;GET WINNING TYPE
MOVE E,(P)
PUSHJ P,RETC ; CHECK FOR POSSIBLE COMMENT
PUSH TP,$TATOM
PUSH TP,MQUOTE LVAL
JRST IMPCA2 ;GO CONS LIST
]
;HERE TO CHECK FOR "E" FLAVOR OF EXPONENT
CHECKE: CAIN A,"* ; CHECK FOR FINAL *
JRST SYMB4
TRNN FF,EFLG ;HAS ONE BEEN SEEN
CAIE B,NONSPC ;IF NOT, IS THIS ONE
JRST SYMB ;NO, ENTER AS SYMBOL KILL NUMERIC WIN
TRNN FF,NUMWIN ;HAVE DIGITS BEEN SEEN?
JRST SYMB ;NO, NOT A NUMBER
MOVE B,(TP) ;GET POINTER TO TEMPS
HRLM FF,ENUM(B) ;SAVE FLAGS
HRRI FF,DECFRC+DOTSEN+EFLG ;SET NEW FLAGS
JRST SYMB3 ;ENTER SYMBOL
SYMB4: TRNE FF,NUMWIN ; IF NO DIGITS YET, THIS IS AN ATOM
TRZN FF,OCTSTR
JRST SYMB
TRZN FF,OCTWIN ; ALREADY WON?
TROA FF,OCTWIN ; IF NOT DO IT NOW
JRST SYMB
JRST SYMB2
;HERE ON READING CHARACTER STRING
ADSTRN: SKIPL A ; EOF?
CAIN B,MANYT ;TERMINATE?
JRST DONEG ;YES
CAIE B,CSTYP
JRST SYMB2 ;NO JUST INSERT IT
ADSTN1: PUSHJ P,LSTCHR ;DON'T REREAD """
;HERE TO FINISH THIS CROCK
DONEG: TRNN FF,OCTSTR ; IF START OCTAL BUT NOT FINISH..
TRNN FF,NUMWIN ;HAVE DIGITS BEEN SEEN?
TRO FF,NOTNUM ;NO,SET NOT NUMBER FLAG
SKIPGE C ; SKIP IF STUFF IN TOP WORD
SUB P,[1,,1]
PUSH P,D
TRNN FF,NOTNUM ;NUMERIC?
JRST NUMHAK ;IS NUMERIC, GO TO IT
IFN FRMSIN,[
MOVE A,(TP) ;GET POINTER TO TEMPS
MOVEM FF,NDIGS(A) ;USE TO HOLD FLAGS
]
TRNE FF,INSTRN ;ARE WE BUILDING A STRING
JRST MAKSTR ;YES, GO COMPLETE SAME
LOOPAT: PUSHJ P,NXTCH ; CHECK FOR TRAILER
CAIN B,PATHTY ; PATH BEGINNER
JRST PATH0 ; YES, GO PROCESS
CAIN B,SPATYP ; SPACER?
PUSHJ P,SPACEQ ; CHECK FOR REAL SPACE
JRST PATH2
PUSHJ P,LSTCHR ; FLUSH IT AND RETRY
JRST LOOPAT
PATH0: PUSHJ P,NXTCH1 ; READ FORCED NEXT
CAIE B,SPCTYP ; DO #FALSE () HACK
CAIN B,ESCTYP
JRST PATH4
CAIL B,SPATYP ; SPACER?
JRST PATH3 ; YES, USE THE ROOT OBLIST
PATH4: PUSHJ P,NIREA1 ; READ NEXT ITEM
PUSHJ P,ERRPAR ; LOSER
CAME A,$TATOM ; ONLY ALLOW ATOMS
JRST BADPAT
PUSH TP,A
PUSH TP,B
PUSH TP,A
PUSH TP,B
PUSH TP,$TATOM
PUSH TP,IMQUOTE OBLIST
MCALL 2,GET ; GET THE OBLIST
CAMN A,$TOBLS ; IF NOT OBLIST, MAKE ONE
JRST PATH6
MCALL 1,MOBLIS ; MAKE ONE
JRST PATH1
PATH6: SUB TP,[2,,2]
JRST PATH1
PATH3: MOVE B,ROOT+1 ; GET ROOT OBLIST
MOVSI A,TOBLS
PATH1: PUSHJ P,RLOOKU ; AND LOOK IT UP
IFN FRMSIN,[
MOVE C,(TP) ;SET TO REGOBBLE FLAGS
MOVE FF,NDIGS(C)
]
JRST FINID
SPACEQ: ANDI A,-1
CAIE A,33
CAIN A,400033
POPJ P,
CAIE A,3
AOS (P)
POPJ P,
;HERE TO RAP UP CHAR STRING ITEM
MAKSTR: MOVE C,D ;SETUP TO CALL CHMAK
PUSHJ P,CHMAK ;GO MAKE SAME
JRST FINID
NUMHAK: MOVE C,(TP) ;REGOBBLETEMP POINTER
POP P,D ;POP OFF STACK TOP
ADDI D,4
IDIVI D,5
HRLI D,(D) ;TOO BOTH HALVES
SUB P,D ;REMOVE CHAR STRING
MOVE D,3(TB) ; IS RADIX 10?
CAIE D,10.
TRNE FF,DECFRC
TRNN FF,FLONUM+EFLG ;IS IT A FLOATING POINT NUMBER
TRNE FF,EFLG
JRST FLOATIT ;YES, GO MAKE IT WIN
TRNE FF,OVFLEW
JRST FOOR
MOVE B,CNUM(C)
TRNE FF,DECFRC
MOVE B,DNUM(C) ;GRAB FIXED GOODIE
TRNE FF,OCTWIN ; SKIP IF NOT OCTAL
MOVE B,ONUM(C) ; USE OCTAL VALUE
FINID2: MOVSI A,TFIX ;SAY FIXED POINT
FINID1: TRNE FF,NEGF ;NEGATE
MOVNS B ;YES
FINID: POP TP,TP ;RESTORE OLD TP
SUB TP,[1,,1] ;FINISH HACK
IFN FRMSIN,[
TRNE FF,FRSDOT ;DID . START IT
JRST .SET ;YES, GO HACK
]
POPJ P, ;AND RETURN
PATH2: MOVE B,IMQUOTE OBLIST
PUSHJ P,IDVAL
JRST PATH1
BADPAT: ERRUUO EQUOTE NON-ATOMIC-OBLIST-NAME
FLOATIT:<3A> JFCL 17,.+1 ;CLEAR ALL ARITHMETIC FLAGS
TRNE FF,EFLG ;"E" SEEN?
JRST EXPDO ;YES, DO EXPONENT
MOVE D,NDIGS(C) ;GET IMPLICIT EXPONENT
FLOATE: MOVE A,DNUM(C) ;GET DECIMAL NUMBER
IDIVI A,400000 ;SPLIT
FSC A,254 ;CONVERT MOST SIGNIFICANT
FSC B,233 ; AND LEAST SIGNIFICANT
FADR B,A ;COMBINE
MOVM A,D ;GET MAGNITUDE OF EXPONENT
MOVSI E,(1.0)
CAIG A,38. ;HOW BIG?
JRST .+3 ;TOO BIG-FLOATING OUT OF RANGE
MOVE E,[10.0^38]
SUBI A,38.
JUMPGE D,FLOAT1 ;JUMP IF EXPONENT POSITIVE
FDVR B,E
FDVR B,TENTAB(A) ;DIVIDE BY TEN TO THE EXPONENT
JRST SETFLO
FLOAT1: FMPR B,E
FMPR B,TENTAB(A) ;SCALE UP
SETFLO: JFCL 10,FOOR ;FLOATING OUT OF RANGE ON OVERFLOW
MOVSI A,TFLOAT
IFN FRMSIN, TRZ FF,FRSDOT ;FLOATING NUMBER NOT VALUE
JRST FINID1
EXPDO:
HRRZ D,ENUM(C) ;GET EXPONENT
TRNE FF,NEGF ;IS EXPONENT NEGATIVE?
MOVNS D ;YES
ADD D,NDIGS(C) ;ADD IMPLICIT EXPONENT
HLR FF,ENUM(C) ;RESTORE FLAGS
JUMPL D,FLOATE ;FLOATING IF EXPONENT NEGATIVE
CAIG D,10. ;OR IF EXPONENT TOO LARGE
TRNE FF,FLONUM ;OR IF FLAG SET
JRST FLOATE
MOVE B,DNUM(C) ;
IMUL B,ITENTB(D)
JFCL 10,FLOATE ;IF OVERFLOW, MAKE FLOATING
JRST FINID2 ;GO MAKE FIXED NUMBER
; HERE TO READ ONE CHARACTER FOR USER.
CREDC1: SUBM M,(P)
PUSH TP,A
PUSH TP,B
PUSHJ P,IREADC
JRST CRDEO1
JRST RMPOPJ
CNXTC1: SUBM M,(P)
PUSH TP,A
PUSH TP,B
PUSHJ P,INXTRD
JRST CRDEO1
JRST RMPOPJ
CRDEO1: MOVE B,(TP)
PUSH TP,EOFCND-1(B)
PUSH TP,EOFCND(B)
PUSH TP,$TCHAN
PUSH TP,B
MCALL 1,FCLOSE
MCALL 1,EVAL
JRST RMPOPJ
CREADC: SUBM M,(P)
PUSH TP,A
PUSH TP,B
PUSHJ P,IREADC
JRST CRDEOF
SOS (P)
JRST RMPOPJ
CNXTCH: SUBM M,(P)
PUSH TP,A
PUSH TP,B
PUSHJ P,INXTRD
JRST CRDEOF
SOS (P)
RMPOPJ: SUB TP,[2,,2]
JRST MPOPJ
CRDEOF: .MCALL 1,FCLOSE
MOVSI A,TCHRS
HRROI B,3
JRST MPOPJ
INXTRD: TDZA E,E
IREADC: MOVEI E,1
MOVE B,(TP) ; CHANNEL
HRRZ A,-2(B) ; GET BLESS BITS
TRNE A,C.BIN
TRNE A,C.BUF
JRST .+3
PUSHJ P,GRB
HRRZ A,-2(B)
TRC A,C.OPN+C.READ
TRNE A,C.OPN+C.READ
JRST BADCHN
SKIPN A,LSTCH(B)
PUSHJ P,RXCT
TLO A,200000
MOVEM A,LSTCH(B) ; SAVE CHAR
CAMN A,[-1] ; SPECIAL PSEUDO TTY HACK?
JRST PSEUDO ; YES, RET AS FIX
; ANDI A,-1
TLZ A,200000
TRZN A,400000 ; UNDO ! HACK
JRST NOEXCL
SKIPE E
MOVEM A,LSTCH(B)
MOVEI A,"! ; RETURN AN !
NOEXC1: SKIPGE B,A ; CHECK EOF
SOS (P) ; DO EOF RETURN
MOVE B,A ; CHAR TO B
MOVSI A,TCHRS
PSEUD1: AOS (P)
POPJ P,
PSEUDO: SKIPE E
PUSHJ P,LSTCH2
MOVE B,A
MOVSI A,TFIX
JRST PSEUD1
NOEXCL: SKIPE E
PUSHJ P,LSTCH2
JRST NOEXC1
; READER ERRORS COME HERE
ERRPAR: PUSH TP,$TCHRS ;DO THE OFFENDER
PUSH TP,B
PUSH TP,$TCHRS
PUSH TP,[40] ;SPACE
PUSH TP,$TCHSTR
PUSH TP,CHQUOT UNEXPECTED
JRST MISMA1
;COMPLAIN ABOUT MISMATCHED CLOSINGS
MISMAB: SKIPA A,["]]
MISMAT: MOVE A,-1(P) ;GOBBLE THE DESIRED CHARACTER
JUMPE B,CPOPJ ;IGNORE UNIVERSAL CLOSE
PUSH TP,$TCHRS
PUSH TP,B
PUSH TP,$TCHSTR
PUSH TP,CHQUOT [ INSTEAD-OF ]
PUSH TP,$TCHRS
PUSH TP,A
MISMA1: MCALL 3,STRING
PUSH TP,$TATOM
PUSH TP,EQUOTE READER-SYNTAX-ERROR-ERRET-ANYTHING-TO-GO-ON
PUSH TP,A
PUSH TP,B
PUSH TP,$TATOM
PUSH TP,MQUOTE READ
MCALL 3,ERROR
CPOPJ: POPJ P,
; HERE ON BAD INPUT CHARACTER
BADCHR: ERRUUO EQUOTE BAD-ASCII-CHARACTER
; HERE ON YUCKY PARSE TABLE
BADPTB: ERRUUO EQUOTE BAD-MACRO-TABLE
BDPSTR: ERRUUO EQUOTE BAD-PARSE-STRING
ILLSQG: PUSHJ P,LSTCHR ; DON'T MESS WITH IT AGAIN
ERRUUO EQUOTE BAD-USE-OF-SQUIGGLY-BRACKETS
;FLOATING POINT NUMBER TOO LARGE OR SMALL
FOOR: ERRUUO EQUOTE NUMBER-OUT-OF-RANGE
NILSXP: 0,,0
LSTCHR: PUSH P,B
SKIPL B,5(TB) ;GET CHANNEL
JRST LSTCH1 ;NO CHANNEL, POINT AT SLOT
PUSHJ P,LSTCH2
POP P,B
POPJ P,
LSTCH2: SKIPE LSTCH(B) ;ARE WE REALLY FLUSHING A REUSE CHARACTER ?
PUSHJ P,CNTACC
SETZM LSTCH(B)
POPJ P,
LSTCH1: SETZM 5(TB) ;ZERO THE LETTER AND RETURN
POP P,B
POPJ P,
CNTACC: PUSH P,A
HRRZ A,-2(B) ; GET BITS
TRNE A,C.BIN
JRST CNTBIN
AOS ACCESS(B)
CNTDON: POP P,A
POPJ P,
CNTBIN: AOS A,ACCESS-1(B)
CAMN A,[TFIX,,1]
AOS ACCESS(B)
CAMN A,[TFIX,,5]
HLLZS ACCESS-1(B)
JRST CNTDON
;TABLE OF NAMES OF ARGS AND ALLOWED TYPES
ARGS:
IRP A,,[[[CAIN C,TUNBOU]],[[CAIE C,TCHAN],INCHAN],[[PUSHJ P,CHOBL],OBLIST]]
IRP B,C,[A]
B
IFSN [C],IMQUOTE C
.ISTOP
TERMIN
TERMIN
CHOBL: CAIE C,TLIST ;A LIST OR AN OBLIST
CAIN C,TOBLS
AOS (P)
POPJ P,
END