1 TITLE READER FOR MUDDLE
\r
7 READER==1 ;TELL MUDDLE > TO USE SOME SPECIAL HACKS
\r
8 FRMSIN==1 ;FLAG SAYING WHETHER OR "." AND "'" HACKS EXIST
\r
12 .GLOBAL CONS,VECTOR,NXTCHR,RLOOKU,CRADIX,SPTIME,QUOTE,TENTAB,CHMAK,FLUSCH,ITENTB
\r
13 .GLOBAL SETDEV,OPNCHN,ILVAL,RADX,IDVAL,LSTCH,EVECTOR,EUVECTOR,CHUNW
\r
14 .GLOBAL CHRWRD,EOFCND,DIRECT,ACCESS,IOINS,ROOT,DIRECT,DOIOTI,DOACCS,IGVAL,BYTDOP
\r
15 .GLOBAL ICONS,INCONS,IEVECT,IEUVEC,BUFSTR,TYPFND,SQUTOA,IBLOCK,GRB
\r
16 .GLOBAL BADCHN,WRONGD,CHNCLS,FNFFL,IPUT,IGET,ILOC,RXCT,WXCT,IUNWIN,UNWIN2
\r
17 .GLOBAL CNXTCH,CREADC,MPOPJ,CREDC1,CNXTC1,IREMAS
\r
21 FF=0 ;FALG REGISTER DURING NUMBER CONVERSION
\r
23 ;FLAGS USED (RIGHT HALF)
\r
25 NOTNUM==1 ;NOT A NUMBER
\r
26 NFIRST==2 ;NOT FIRST CHARACTER BEING READ
\r
27 DECFRC==4 ;FORCE DECIMAL CONVERSION
\r
28 NEGF==10 ;NEGATE THIS THING
\r
29 NUMWIN==20 ;DIGIT(S) SEEN
\r
30 INSTRN==40 ;IN QUOTED CHARACTER STRING
\r
31 FLONUM==100 ;NUMBER IS FLOOATING POINT
\r
32 DOTSEN==200 ;. SEEN IN IMPUT STREAM
\r
33 EFLG==400 ;E SEEN FOR EXPONENT
\r
35 FRSDOT==1000 ;. CAME FIRST
\r
36 USEAGN==2000 ;SPECIAL DOT HACK
\r
43 VCNT==0 ;NUMBER OF ELEMENTS IN CURRENT VECTOR
\r
44 ONUM==1 ;CURRENT NUMBER IN OCTAL
\r
45 DNUM==3 ;CURRENT NUMBER IN DECIMAL
\r
46 FNUM==5 ;CURRENTLY UNUSED
\r
47 CNUM==7 ;IN CURRENT RADIX
\r
48 NDIGS==11 ;NUMBER OF DIGITS
\r
52 \f; TEXT FILE LOADING PROGRAM
\r
54 MFUNCTION MLOAD,SUBR,[LOAD]
\r
58 HLRZ A,AB ;GET NO. OF ARGS
\r
60 JRST TRY2 ;NO, TRY ANOTHER
\r
61 GETYP A,2(AB) ;GET TYPE
\r
62 CAIE A,TOBLS ;IS IT OBLIST
\r
63 CAIN A,TLIST ; OR LIST THEREOF?
\r
67 TRY2: CAIE A,-2 ;IS ONE SUPPLIED
\r
70 CHECK1: GETYP A,(AB) ;GET TYPE
\r
71 CAIE A,TCHAN ;IS IT A CHANNEL
\r
74 LOAD1: HLRZ A,TB ;GET CURRENT TIME
\r
75 PUSH TP,$TTIME ;AND SAVE IT
\r
78 MOVEI C,CLSNGO ; LOCATION OF FUNNY CLOSER
\r
79 PUSHJ P,IUNWIN ; SET UP AS UNWINDER
\r
81 LOAD2: PUSH TP,(AB) ;USE SUPPLIED CHANNEL
\r
83 PUSH TP,(TB) ;USE TIME AS EOF ARG
\r
85 CAML AB,[-2,,0] ;CHECK FOR 2ND ARG
\r
87 PUSH TP,2(AB) ;PUSH ON 2ND ARG
\r
90 JRST CHKRET ;CHECK FOR EOF RET
\r
93 CHKRET: CAMN A,(TB) ;IS TYPE EOF HACK
\r
94 CAME B,1(TB) ;AND IS VALUE
\r
95 JRST EVALIT ;NO, GO EVAL RESULT
\r
100 MOVE B,CHQUOTE DONE
\r
103 CLSNGO: PUSH TP,$TCHAN
\r
106 JRST UNWIN2 ; CONTINUE UNWINDING
\r
115 ; OTHER FILE LOADING PROGRAM
\r
119 MFUNCTION FLOAD,SUBR
\r
123 MOVEI C,1 ;INITIALIZE OPEN'S ARG COUNT
\r
124 PUSH TP,$TAB ;SLOT FOR SAVED AB
\r
125 PUSH TP,[0] ;EMPTY FOR NOW
\r
126 PUSH TP,$TCHSTR ;PUT IN FIRST ARG
\r
127 PUSH TP,CHQUOTE READ
\r
128 MOVE A,AB ;COPY OF ARGUMENT POINTER
\r
130 FARGS: JUMPGE A,CALOPN ;DONE? IF SO CALL OPEN
\r
131 GETYP B,(A) ;NO, CHECK TYPE OF THIS ARG
\r
132 CAIE B,TOBLS ;OBLIST?
\r
133 CAIN B,TLIST ; OR LIST THEREOF
\r
134 JRST OBLSV ;YES, GO SAVE IT
\r
136 PUSH TP,(A) ;SAVE THESE ARGS
\r
138 ADD A,[2,,2] ;BUMP A
\r
139 AOJA C,FARGS ;COUNT AND GO
\r
141 OBLSV: MOVEM A,1(TB) ;SAVE THE AB
\r
143 CALOPN: ACALL C,FOPEN ;OPEN THE FILE
\r
145 JUMPGE B,FNFFL ;FILE MUST NO EXIST
\r
146 EXCH A,(TB) ;PLACE CHANNEL ON STACK
\r
147 EXCH B,1(TB) ;OBTAINING POSSIBLE OBLIST
\r
148 JUMPN B,2ARGS ;OBLIST SUOPPLIED?
\r
150 MCALL 1,MLOAD ;NO, JUST CALL
\r
154 2ARGS: PUSH TP,(B) ;PUSH THE OBLIST
\r
160 FNFFL: PUSH TP,$TATOM
\r
161 PUSH TP,EQUOTE FILE-SYSTEM-ERROR
\r
168 \fMFUNCTION READ,SUBR
\r
172 PUSH P,[IREAD1] ;WHERE TO GO AFTER BINDING
\r
173 READ0: PUSH TP,$TTP ;SLOT FOR LAST THING READ (TYPE IS UNREADABLE)
\r
175 PUSH TP,$TFIX ;SLOT FOR RADIX
\r
177 PUSH TP,$TCHAN ;AND SLOT FOR CHANNEL
\r
179 PUSH TP,[0] ; USER DISP SLOT
\r
182 PUSH TP,[0] ;SEGMENT FOR SPLICING MACROS
\r
183 JUMPGE AB,READ1 ;NO ARGS, NO BINDING
\r
184 GETYP C,(AB) ;ISOLATE TYPE
\r
187 PUSH TP,[TATOM,,-1] ;PUSH THE ATOMS
\r
188 PUSH TP,IMQUOTE INCHAN
\r
189 PUSH TP,(AB) ;PUSH ARGS
\r
193 MOVE B,1(AB) ;GET CHANNEL POINTER
\r
194 ADD AB,[2,,2] ;AND ARG POINTER
\r
195 JUMPGE AB,BINDEM ;MORE?
\r
197 ADD B,[EOFCND-1,,EOFCND-1]
\r
202 JUMPGE AB,BINDEM ;IF ANY MORE ARGS GO PROCESS AND BIND THEM
\r
203 GETYP C,(AB) ;ISOLATE TYPE
\r
208 PUSH TP,[TATOM,,-1] ;PUSH THE ATOMS
\r
209 PUSH TP,IMQUOTE OBLIST
\r
210 PUSH TP,(AB) ;PUSH ARGS
\r
214 ADD AB,[2,,2] ;AND ARG POINTER
\r
215 JUMPGE AB,BINDEM ; ALL DONE, BIND ATOMS
\r
216 GETYP 0,(AB) ; GET TYPE OF TABLE
\r
217 CAIE 0,TVEC ; SKIP IF BAD TYPE
\r
218 JRST WTYP ; ELSE COMPLAIN
\r
219 PUSH TP,[TATOM,,-1]
\r
220 PUSH TP,IMQUOTE READ-TABLE
\r
225 ADD AB,[2,,2] ; BUMP TO NEXT ARG
\r
226 JUMPL AB,TMA ;MORE ?, ERROR
\r
227 BINDEM: PUSHJ P,SPECBIND
\r
230 MFUNCTION RREADC,SUBR,READCHR
\r
234 JRST READC0 ;GO BIND VARIABLES
\r
236 MFUNCTION NXTRDC,SUBR,NEXTCHR
\r
241 READC0: CAMGE AB,[-5,,]
\r
246 MOVE B,IMQUOTE INCHAN
\r
253 READC1: PUSHJ P,@(P)
\r
272 MFUNCTION PARSE,SUBR
\r
276 PUSHJ P,GAPRS ;GET ARGS FOR PARSES
\r
277 PUSHJ P,GPT ;GET THE PARSE TABLE
\r
278 PUSHJ P,NXTCH ; GET A CHAR TO TEST FOR ! ALT
\r
279 SKIPN 11.(TB) ; EOF HIT, COMPLAIN TO LOOSER
\r
281 MOVEI A,33 ; CHANGE IT TO AN ALT, SNEAKY HUH?
\r
282 CAIN B,MANYT ; TYPE OF MULTIPLE CLOSE, I.E. ! ALT
\r
284 PUSHJ P,IREAD1 ;GO DO THE READING
\r
286 JRST LPSRET ;PROPER EXIT
\r
287 NOPRS: PUSH TP,$TATOM
\r
288 PUSH TP,EQUOTE CAN'T-PARSE
\r
291 MFUNCTION LPARSE,SUBR
\r
295 PUSHJ P,GAPRS ;GET THE ARGS TO THE PARSE
\r
298 GAPRS: PUSH TP,$TTP
\r
303 PUSH TP,[0] ; LETTER SAVE
\r
305 PUSH TP,[0] ; PARSE TABLE MAYBE?
\r
307 PUSH TP,[0] ;SEGMENT FOR SPLICING MACROS
\r
308 PUSH TP,[0] ;SLOT FOR LOCATIVE TO STRING
\r
311 PUSH TP,[TATOM,,-1]
\r
312 PUSH TP,IMQUOTE PARSE-STRING
\r
314 PUSH TP,1(AB) ; BIND OLD PARSE-STRING
\r
332 PUSH TP,[TATOM,,-1]
\r
333 PUSH TP,IMQUOTE OBLIST
\r
335 PUSH TP,1(AB) ; HE WANTS HIS OWN OBLIST
\r
344 PUSH TP,[TATOM,,-1]
\r
345 PUSH TP,IMQUOTE PARSE-TABLE
\r
357 MOVEM 0,5(TB) ; STUFF IN A LOOK-AHEAD CHARACTER IF HE WANTS
\r
360 USPSTR: MOVE B,IMQUOTE PARSE-STRING
\r
361 PUSHJ P,ILOC ; GET A LOCATIVE TO THE STRING, WHEREVER
\r
363 CAIN 0,TUNBOUND ; NONEXISTANT
\r
365 GETYP 0,(B) ; IT IS POINTING TO A STRING
\r
372 LPRS1: PUSHJ P,GPT ; GET THE VALUE OF PARSE-TABLE IN SLOT
\r
374 PUSH TP,[0] ; HERE WE ARE MAKE PLACE TO SAVE GOODIES
\r
377 LPRS2: PUSHJ P,IREAD1
\r
378 JRST LPRSDN ; IF WE ARE DONE, WE ARE THROUGH
\r
383 MOVEM B,-2(TP) ; SAVE THE BEGINNING ON FIRST
\r
385 HRRM B,(C) ; PUTREST INTO IT
\r
388 LPRSDN: MOVSI A,TLIST
\r
390 LPSRET: SKIPLE C,5(TB) ; EXIT FOR PARSE AND LPARSE
\r
391 CAIN C,400033 ; SEE IF NO PEEK AHEAD OR IF ! ALTMODE
\r
392 JRST FINIS ; IF SO NO NEED TO BACK STRING ONE
\r
394 JRST FINIS ; IF ATE WHOLE STRING, DONT GIVE BACK ANY
\r
396 ADDM D,(C) ; AOS THE COUNT OF STRING LENGTH
\r
397 SKIPG D,1(C) ; SEXIER THAN CLR'S CODE FOR DECREMENTING
\r
398 SUB D,[430000,,1] ; A BYTE POINTER
\r
402 JUMPE E,FINIS ; SEE IF WE NEED TO BACK UP TWO
\r
403 HLLZS 2(TB) ; CLEAR OUT DOUBLE CHR LOOKY FLAG
\r
404 JRST BUPRS ; AND BACK UP PARSE STRING A LITTLE MORE
\r
406 \f; ARGUMENTS ARE BOUND, NOW GET THE VALUES OF THINGS
\r
409 GRT: MOVE B,IMQUOTE READ-TABLE
\r
410 SKIPA ; HERE TO GET TABLE FOR READ
\r
411 GPT: MOVE B,IMQUOTE PARSE-TABLE
\r
412 MOVSI A,TATOM ; TO FILL SLOT WITH PARSE TABLE
\r
424 MOVE B,IMQUOTE INCHAN
\r
426 PUSHJ P,IDVAL ;NOW GOBBLE THE REAL CHANNEL
\r
427 TLZ A,TYPMSK#777777
\r
428 HLLZS A ; INCASE OF FUNNY BUG
\r
429 CAME A,$TCHAN ;IS IT A CHANNEL
\r
431 MOVEM A,4(TB) ; STORE CHANNEL
\r
435 TRNE A,C.OPN+C.READ
\r
438 TRNE A,C.BIN ; SKIP IF NOT BIN
\r
439 JRST BREAD ; CHECK FOR BUFFER
\r
441 GETIOA: MOVE B,5(TB)
\r
442 GETIO: MOVE A,IOINS(B) ;GOBBLE THE I/O INSTRUCTION
\r
443 JUMPE A,OPNFIL ;GO REALLY OPEN THE CROCK
\r
444 MOVE A,RADX(B) ;GET RADIX
\r
446 MOVEM B,5(TB) ;SAVE CHANNEL
\r
447 REREAD: MOVE D,LSTCH(B) ;ANY CHARS AROUND?
\r
449 CAIN D,400033 ;FLUSH THE TERMINATOR HACK
\r
450 MOVEM 0,LSTCH(B) ; MAKE ! ALT INTO JUST ALT IF IT IS STILL AROUND
\r
452 PUSHJ P,@(P) ;CALL INTERNAL READER
\r
454 RFINIS: SUB P,[1,,1] ;POP OFF LOSER
\r
457 JUMPE C,FLSCOM ; FLUSH TOP LEVEL COMMENT
\r
461 MOVE B,5(TB) ; GET CHANNEL
\r
463 MOVE D,MQUOTE COMMENT
\r
469 FLSCOM: MOVE A,4(TB)
\r
472 MOVE D,MQUOTE COMMENT
\r
476 BADTRM: MOVE C,5(TB) ; GET CHANNEL
\r
477 JUMPGE B,CHLSTC ;NO, MUST BE UNMATCHED PARENS
\r
478 SETZM LSTCH(C) ; DONT REUSE EOF CHR
\r
479 PUSH TP,4(TB) ;CLOSE THE CHANNEL
\r
482 PUSH TP,EOFCND-1(B)
\r
484 MCALL 1,EVAL ;AND EVAL IT
\r
486 GETYP 0,A ; CHECK FOR FUNNY ACT
\r
488 JRST RFINIS ; AND RETURN
\r
490 PUSHJ P,CHUNW ; UNWIND TO POINT
\r
491 MOVSI A,TREADA ; SEND MESSAGE BACK
\r
494 ;HERE TO ATTEMPT TO OPEN A CLOSED CHANNEL
\r
496 OPNFIL: PUSHJ P,OPNCHN ;GO DO THE OPEN
\r
497 JUMPGE B,FNFFL ;LOSE IC B IS 0
\r
501 CHLSTC: MOVE B,5(TB) ;GET CHANNEL BACK
\r
505 BREAD: MOVE B,5(TB) ; GET CHANNEL
\r
508 MOVEI A,BUFLNT ; GET A BUFFER
\r
510 MOVEI C,BUFLNT(B) ; POINT TO END
\r
512 MOVE B,5(TB) ; CHANNEL BACK
\r
516 MOVSI C,TCHSTR+.VECT.
\r
517 MOVEM C,BUFSTR-1(B)
\r
519 \f;MAIN ENTRY TO READER
\r
521 NIREAD: PUSHJ P,LSTCHR
\r
522 NIREA1: PUSH P,[-1] ; DONT GOBBLE COMMENTS
\r
526 PUSHJ P,LSTCHR ;DON'T REREAD LAST CHARACTER
\r
527 IREAD1: PUSH P,[0] ; FLAG SAYING SNARF COMMENTS
\r
529 BDLP: SKIPE C,9.(TB) ;HAVE WE GOT A SPLICING MACRO LEFT
\r
530 JRST SPLMAC ;IF SO GIVE HIM SOME OF IT
\r
531 PUSHJ P,NXTCH ;GOBBLE CHAR IN A AND TYPE IN D
\r
532 MOVMS B ; FOR SPECIAL NEG HACK OF MACRO TABLES
\r
534 JUMPN B,@DTBL-1(B) ;ERROR ON ZERO TYPE OR FUNNY TYPE
\r
538 SPLMAC: HRRZ D,(C) ;GET THE REST OF THE SEGMENT
\r
539 MOVEM D,9.(TB) ;AND PUT BACK IN PLACE
\r
540 GETYP D,(C) ;SEE IF DEFERMENT NEEDED
\r
542 MOVE C,1(C) ;IF SO, DO DEFEREMENT
\r
544 MOVE B,1(C) ;GET THE GOODIE
\r
545 AOS -1(P) ;ALWAYS A SKIP RETURN
\r
546 POP P,(P) ;DONT WORRY ABOUT COMMENT SEARCHAGE
\r
547 SETZB C,D ;MAKE SURE HE DOESNT THINK WE GOT COMMENT
\r
548 POPJ P, ;GIVE HIM WHAT HE DESERVES
\r
550 DTBL: NUMLET ;HERE IF NUMBER OR LETTER
\r
558 NONSPC==.-DTBL ;NUMBER OF NON-SPECIAL CHARACTERS
\r
559 SPACE ;SPACING CHAR CR,LF,SP,TAB ETC.
\r
560 SPATYP==.-DTBL ;TYPE FOR SPACE CHARS
\r
563 ;THE FOLLOWING ENTRIES ARE VARIOUS PUNCTUATION CROCKS
\r
565 LPAREN ;( - BEGIN LIST
\r
566 RPAREN ;) - END CURRENT LEVEL OF INPUT
\r
567 LBRACK ;[ -BEGIN ARRAY
\r
569 RBRACK ;] - END OF ARRAY
\r
570 QUOTIT ;' - QUOTE THE FOLLOWING GOODIE
\r
573 MACCAL ;% - INVOKE A READ TIME MACRO
\r
575 CSTRING ;" - CHARACTER STRING
\r
577 NUMLET ;\ - ESCAPE,BEGIN ATOM
\r
579 ESCTYP==.-DTBL ;TYPE OF ESCAPE CHARACTER
\r
581 SPECTY ;# - SPECIAL TYPE TO BE READ
\r
583 OPNANG ;< - BEGIN ELEMENT CALL
\r
585 SLMNT==.-DTBL ;TYPE OF START OF SEGMENT
\r
587 CLSANG ;> - END ELEMENT CALL
\r
590 EOFCHR ;^C - END OF FILE
\r
592 COMNT ;; - BEGIN COMMENT
\r
593 COMTYP==.-DTBL ;TYPE OF START OF COMMENT
\r
595 GLOVAL ;, - GET GLOBAL VALUE
\r
597 ILLSQG ;{ - START TEMPLATE STRUCTURE
\r
599 CLSBRA ;} - END TEMPLATE STRUCTURE
\r
605 ; EXTENDED TABLE FOR ! HACKS
\r
607 NUMLET ; !! FAKE OUT
\r
608 SEGDOT ;!. - CALL TO LVAL (SEG)
\r
610 UVECIN ;![ - INPUT UNIFORM VECTOR ]
\r
612 QUOSEG ;!' - SEG CALL TO QUOTE
\r
614 SINCHR ;!" - INPUT ONE CHARACTER
\r
616 SEGIN ;!< - SEG CALL
\r
618 GLOSEG ;!, - SEG CALL TO GVAL
\r
620 LOSPATH ;!- - PATH NAME SEPARATOR
\r
622 TERM ;!$ - (EXCAL-ALT MODE) PUT ALL CLOSES
\r
624 USRDS1 ; DISPATCH FOR USER TABLE (NO !)
\r
626 USRDS2 ; " " " " (WITH !)
\r
632 SPACE: PUSHJ P,LSTCHR ;DONT REREAD SPACER
\r
635 USRDS1: SKIPA B,A ; GET CHAR IN B
\r
636 USRDS2: MOVEI B,200(A) ; ! CHAR, DISP 200 FURTHER
\r
638 ADD B,7(TB) ; POINT TO TABLE ENTRY
\r
641 MOVE B,1(B) ; IF LIST, USE FIRST ITEM-SPECIAL NO BREAK HACK
\r
642 SKIPL C,5(TB) ; GET CHANNEL POINTER (IF ANY)
\r
644 ADD C,[EOFCND-1,,EOFCND-1]
\r
646 HRRM SP,(TP) ; BUILD A TBVL
\r
651 MOVEI D,PVLNT*2+1(PVP)
\r
657 USRDS3: PUSH TP,(B) ; APPLIER
\r
659 PUSH TP,$TCHRS ; APPLY TO CHARACTER
\r
661 PUSHJ P,LSTCHR ; FLUSH CHAR
\r
662 MCALL 2,APPLY ; GO TO USER GOODIE
\r
663 HRRZ SP,(SP) ; UNBIND MANUALLY
\r
669 SUB TP,[4,,4] ; FLUSH TP CRAP
\r
670 GETYP 0,A ; CHECK FOR DISMISS?
\r
672 JRST GOTSPL ; RETURN OF SEGMENT INDICATES SPLICAGE
\r
673 CAIN 0,TREADA ; FUNNY?
\r
676 JRST RET ; NO, RETURN FROM IREAD
\r
677 JRST BDLP ; YES, IGNORE RETURN
\r
679 GOTSPL: MOVEM B,9.(TB) ; STICK IN THE SPLICAGE SLOT SO IREADS WILL GET HIM
\r
680 JRST BDLP ; GO BACK AND READ FROM OUR SPLICE, OK?
\r
683 ;HERE ON NUMBER OR LETTER, START ATOM
\r
685 NUMLET: PUSHJ P,GOBBLE ;READ IN THE ATOM AND PUT PNTR ON ARG PDL
\r
686 JRST RET ;NO SKIP RETURN I.E. NON NIL
\r
688 ;HERE TO START BUILDING A CHARACTER STRING GOODIE
\r
690 CSTRING: PUSHJ P,GOBBL1 ;READ IN STRING
\r
693 ;ARRIVE HERE TO INVOKE A READ TIME MACRO FUNCTION
\r
695 MACCAL: PUSHJ P,NXTCH1 ;READ ONE MORE CHARACTER
\r
696 CAIE B,MACTYP ;IS IT ANOTHER MACRO CHAR
\r
698 JRST MACAL2 ;NO, CALL MACRO AND USE VALUE
\r
699 PUSHJ P,LSTCHR ;DONT REREAD %
\r
700 PUSHJ P,MACAL1 ;OTHERWISE, USE SIDE EFFECCT, BUT NOT VALUE
\r
703 MACAL2: PUSH P,CRET
\r
704 MACAL1: PUSHJ P,IREAD1 ;READ FUNCTION NAME
\r
707 PUSH TP,D ; SAVE COMMENT IF ANY
\r
708 PUSH TP,A ;SAVE THE RESULT
\r
709 PUSH TP,B ;AND USE IT AS AN ARGUMENT
\r
712 POP TP,C ; RESTORE COMMENT IF ANY...
\r
715 ;CALL GOBBLE TO FIND THE TYPE AND THEN IREAD TO READ IT
\r
717 SPECTY: PUSHJ P,NIREAD ; READ THE TYPES NAME (SHOULD BE AN ATOM)
\r
721 PUSHJ P,NXTCH ; GET NEXT CHAR
\r
722 CAIN B,TMPTYP ; SKIP IF NOT TEMPLATE START
\r
727 PUSH TP,A ;BEGIN SETTING UP CHTYPE CALL
\r
729 PUSHJ P,IREAD1 ;NOW READ STRUCTURE
\r
731 MOVEM C,-3(TP) ; SAVE COMMENT
\r
733 EXCH A,-1(TP) ;USE AS FIRST ARG
\r
735 PUSH TP,A ;USE OTHER AS 2D ARG
\r
737 MCALL 2,CHTYPE ;ATTEMPT TO MUNG
\r
739 POP TP,C ; RESTORE COMMENT
\r
740 RET12: SETOM (P) ; DONT LOOOK FOR MORE!
\r
743 RDTMPL: PUSH P,["}] ; SET UP TERMINATE TEST
\r
748 PUSH P,[BLDTMP] ; FLAG FOR VECTOR READING CODE
\r
751 BLDTMP: ADDI A,1 ; 1 MORE ARGUMENT
\r
752 ACALL A,APPLY ; DO IT TO IT
\r
755 RETER1: SUB TP,[2,,2]
\r
756 RETERR: SKIPL A,5(TB)
\r
757 MOVEI A,5(TB)-LSTCH ;NO CHANNEL, USE SLOT
\r
758 MOVEM B,LSTCH(A) ; RESTORE LAST CHAR
\r
762 ;THIS CODE CALLS IREAD RECURSIVELY TO READ THAT WHICH IS
\r
763 ;BETWEEN (), ARRIVED AT WHEN ( IS READ
\r
765 SEGIN: PUSH TP,$TSEG
\r
768 OPNANG: PUSH TP,$TFORM ;SAVE TYPE
\r
769 OPNAN1: PUSH P,[">]
\r
772 LPAREN: PUSH P,[")]
\r
773 PUSH TP,$TLIST ;START BY ASSUMING NIL
\r
774 LPARN1: PUSH TP,[0]
\r
775 PUSHJ P,LSTCHR ;DON'T REREAD PARENS
\r
776 LLPLOP: PUSHJ P,IREAD1 ;READ IT
\r
777 JRST LDONE ;HIT TERMINATOR
\r
779 ;HERE WHEN MUST ADD CAR TO CURRENT WINNER
\r
781 GENCAR: PUSH TP,C ; SAVE COMMENT
\r
783 MOVE C,A ; SET UP CALL
\r
785 PUSHJ P,INCONS ; CONS ON TO NIL
\r
789 JUMPN E,CDRIN ;IF STACKED GOODIE NOT NIL SKIP
\r
790 PUSH TP,B ;AND USE AS TOTAL VALUE
\r
791 PUSH TP,$TLIST ;SAVE THIS AS FIRSST THING ON LIST
\r
792 MOVE A,-2(TP) ; GET REAL TYPE
\r
793 JRST .+2 ;SKIP CDR SETTING
\r
795 PUSH TP,B ;CLOBBER IN NEW PARTIAL GOODIE
\r
796 JUMPE C,LLPLOP ; JUMP IF NO COMMENT
\r
800 MOVE D,MQUOTE COMMENT
\r
802 JRST LLPLOP ;AND CONTINUE
\r
804 ; HERE TO RAP UP LIST
\r
806 LDONE: CAME B,(P) ;CHECK VALIDITY OF CHARACTER
\r
807 PUSHJ P,MISMAT ;REPORT MISMATCH
\r
809 POP TP,B ;GET VALUE OF PARTIAL RESULT
\r
810 POP TP,A ;AND TYPE OF SAME
\r
811 JUMPE B,RET ;VALUE IS NIL, DON'T POP AGAIN
\r
812 POP TP,B ;POP FIRST LIST ELEMENT
\r
816 ;THIS CODE IS SIMILAR TO LIST GENERATING CODE BUT IS FOR VECTORS
\r
817 OPNBRA: PUSH P,["}] ; SAVE TERMINATOR
\r
818 UVECIN: PUSH P,[135] ; CLOSE SQUARE BRACKET
\r
819 PUSH P,[IEUVECTOR] ;PUSH NAME OF U VECT HACKER
\r
820 JRST LBRAK2 ;AND GO
\r
822 LBRACK: PUSH P,[135] ; SAVE TERMINATE
\r
823 PUSH P,[IEVECTOR] ;PUSH GEN VECTOR HACKER
\r
824 LBRAK2: PUSHJ P,LSTCHR ;FORCE READING NEW CHAR
\r
825 PUSH P,[0] ; COUNT ELEMENTS
\r
826 PUSH TP,$TLIST ; AND SLOT FOR GOODIES
\r
829 LBRAK1: PUSHJ P,IREAD1 ;RECURSIVELY READ ELEMENTS OF ARRAY
\r
830 JRST LBDONE ;RAP UP ON TERMINATOR
\r
832 STAKIT: EXCH A,-1(TP) ; STORE RESULT AND GET CURRENT LIST
\r
834 AOS (P) ; COUNT ELEMENTS
\r
835 JUMPE C,LBRAK3 ; IF NO COMMENT, GO ON
\r
836 MOVEI E,(B) ; GET CDR
\r
837 PUSHJ P,ICONS ; CONS IT ON
\r
838 MOVEI E,(B) ; SAVE RS
\r
839 MOVSI C,TFIX ; AND GET FIXED NUM
\r
842 LBRAK3: PUSH TP,A ; SAVE CURRENT COMMENT LIST
\r
846 ; HERE TO RAP UP VECTOR
\r
848 LBDONE: CAME B,-2(P) ; FINISHED RETURN (WAS THE RIGHT STOP USED?)
\r
849 PUSHJ P,MISMAB ; WARN USER
\r
850 POP TP,1(TB) ; REMOVE COMMENT LIST
\r
852 MOVE A,(P) ; COUNT TO A
\r
853 PUSHJ P,-1@(P) ; MAKE THE VECTOR
\r
856 ; PUT COMMENTS ON VECTOR (OR UVECTOR)
\r
858 MOVNI C,1 ; INDICATE TEMPLATE HACK
\r
861 CAMN A,$TUVEC ; SKIP IF UVECTOR
\r
864 PUSH TP,A ; SAVE VECTOR/UVECTOR
\r
867 VECCOM: SKIPN C,1(TB) ; ANY LEFT?
\r
868 JRST RETVEC ; NO, LEAVE
\r
869 MOVE A,1(C) ; ASSUME WINNING TYPES
\r
871 HRRZ C,(C) ; CDR THE LIST
\r
873 MOVEM E,1(TB) ; SAVE CDR
\r
874 GETYP E,(C) ; CHECK DEFFERED
\r
876 CAIN E,TDEFER ; SKIP IF NOT DEFERRED
\r
879 GETYPF D,(C) ; GET REAL TYPE
\r
880 MOVE B,(TP) ; GET VECTOR POINTER
\r
881 SKIPGE (P) ; SKIP IF NOT TEMPLATE
\r
883 HRLI A,(A) ; COUNTER
\r
884 LSH A,@(P) ; MAYBE SHIFT IT
\r
886 MOVE A,-1(TP) ; TYPE
\r
888 PUSH TP,1(C) ; PUSH THE COMMENT
\r
890 MOVE D,MQUOTE COMMENT
\r
894 TMPCOM: MOVSI A,(A)
\r
899 RETVEC: SUB P,[1,,1]
\r
904 ; BUILD A SINGLE CHARACTER ITEM
\r
906 SINCHR: PUSHJ P,NXTC1 ;FORCE READ NEXT
\r
907 CAIN B,ESCTYP ;ESCAPE?
\r
908 PUSHJ P,NXTC1 ;RETRY
\r
914 ; HERE ON RIGHT PAREN, BRACKET, ANGLE BRACKET OR CTL C
\r
917 CLSANG: ;CLOSE ANGLE BRACKETS
\r
918 RBRACK: ;COMMON RETURN FOR END OF ARRAY ALSO
\r
919 RPAREN: PUSHJ P,LSTCHR ;DON'T REREAD
\r
920 EOFCH1: MOVE B,A ;GETCHAR IN B
\r
921 MOVSI A,TCHRS ;AND TYPE IN A
\r
926 JUMPL A,EOFCH1 ; JUMP ON REAL EOF
\r
927 JRST RRSUBR ; MAYBE A BINARY RSUBR
\r
929 DOEOF: MOVE A,[-1,,3]
\r
934 ; NORMAL RETURN FROM IREAD/IREAD1
\r
936 RETCL: PUSHJ P,LSTCHR ;DONT REREAD
\r
937 RET: AOS -1(P) ;SKIP
\r
939 RETC: JUMPL E,RET2 ; DONT LOOK FOR COMMENTS
\r
940 PUSH TP,A ; SAVE ITEM
\r
942 CHCOMN: PUSHJ P,NXTCH ; READ A CHARACTER
\r
943 CAIE B,COMTYP ; SKIP IF COMMENT
\r
945 PUSHJ P,IREAD ; READ THE COMMENT
\r
955 CHSPA: CAIN B,SPATYP
\r
956 PUSHJ P,SPACEQ ; IS IT A REAL SPACE
\r
958 PUSHJ P,LSTCHR ; FLUSH THE SPACE
\r
961 ;RANDOM MINI-SUBROUTINES USED BY THE READER
\r
963 ;READ A CHAR INTO A AND TYPE CODE INTO D
\r
965 NXTC1: SKIPL B,5(TB) ;GET CHANNEL
\r
966 JRST NXTPR1 ;NO CHANNEL, GO READ STRING
\r
968 PUSHJ P,CNTACC ; COUNT ON ACCESS POINTER
\r
970 NXTC: SKIPL B,5(TB) ;GET CHANNEL
\r
971 JRST NXTPRS ;NO CHANNEL, GO READ STRING
\r
972 SKIPE A,LSTCH(B) ;CHAR IN A IF REUSE
\r
974 NXTC2: PUSHJ P,RXCT ;GET CHAR FROM INPUT
\r
975 HLLZS 2(TB) ;FLAG INDICATING ONE CHAR LOOK AHEAD
\r
976 MOVEM A,LSTCH(B) ;SAVE THE CHARACTER
\r
977 PRSRET: TRZE A,400000 ;DONT SKIP IF SPECIAL
\r
978 JRST RETYPE ;GO HACK SPECIALLY
\r
979 GETCTP: CAILE A,177 ; CHECK RANGE
\r
981 PUSH P,A ;AND SAVE FROM DIVISION
\r
983 IDIVI A,CHRWD ;YIELDS WORD AND CHAR NUMBER
\r
984 LDB B,BYTPNT(B) ;GOBBLE TYPE CODE
\r
988 NXTPRS: SKIPE A,5(TB) ;GET OLD CHARACTER IF ONE EXISTS
\r
990 NXTPR1: MOVEI A,400033
\r
993 HRRZ B,(C) ;GET THE STRING
\r
996 ILDB A,1(C) ;GET THE CHARACTER FROM THE STRING
\r
997 NXTPR2: MOVEM A,5(TB) ;SAVE IT
\r
999 JRST PRSRET ;CONTINUE
\r
1000 NXTPR3: SETZM 8.(TB)
\r
1001 SETZM 9.(TB) ;CLEAR OUT LOCATIVE, AT END OF STRING
\r
1004 ; NXTCH AND NXTCH1 ARE SAME AS NXTC AND NXTC1 EXCEPT THEY CHECK !
\r
1007 NXTCH1: PUSHJ P,NXTC1 ;READ CHAR
\r
1009 NXTCH: PUSHJ P,NXTC ;READ CHAR
\r
1010 CAIGE B,NTYPES+1 ;IF 1 > THAN MAX, MUST BE SPECIAL
\r
1011 JRST CHKUS1 ; CHECK FOR USER DISPATCH
\r
1013 CAIN B,NTYPES+1 ;FOR OBSCURE BUG FOUND BY MSG
\r
1014 PUSHJ P,NXTC1 ;READ NEXT ONE
\r
1015 HLLOS 2(TB) ;FLAG FOR TWO CHAR LOOK AHEAD
\r
1017 RETYP1: CAIN A,". ;!.
\r
1018 MOVEI B,DOTEXT ;YES, GET EXTENDED TYPE
\r
1032 MOVEI B,MANYT ;! ALTMODE
\r
1034 CRMLST: ADDI A,400000 ;CLOBBER LASTCHR
\r
1036 SKIPL B,5(TB) ;POINT TO CHANNEL
\r
1037 MOVEI B,5(TB)-LSTCH ;NO CHANNEL, POINT AT SLOT
\r
1039 SUBI A,400000 ;DECREASE CHAR
\r
1042 CHKUS2: SKIPN 7(TB) ; SKIP IF USER TABLE
\r
1046 ASH A,1 ; POINT TO SLOT
\r
1049 SKIPL A ;IS THERE VECTOR ENOUGH?
\r
1051 SKIPN 1(A) ; NON-ZERO==>USER FCN EXISTS
\r
1052 JRST CHKUS4 ; HOPE HE APPRECIATES THIS
\r
1054 CHKRDO: PUSH P,0 ; CHECK FOR REDOING IF CHAR IN TABLE
\r
1058 POP P,0 ;WE ARE TRANSMOGRIFYING
\r
1059 POP P,(P) ;FLUSH OLD CHAR
\r
1060 MOVE A,1(A) ;GET NEW CHARACTER
\r
1062 PUSH P,2(TB) ; FLAGS FOR NUM OF CHRS IN LOOK AHEAD
\r
1063 PUSH P,5(TB) ; TO AVOID SMASHING LSTCHR
\r
1064 SETZM 5(TB) ; CLEAR OUT CHANNEL
\r
1065 SETZM 7(TB) ;CLEAR OUT TABLE
\r
1066 TRZE A,200 ; ! HACK
\r
1067 TRO A,400000 ; TURN ON PROPER BIT
\r
1069 POP P,5(TB) ; GET BACK CHANNEL
\r
1071 POP P,7(TB) ;GET BACK OLD PARSE TABLE
\r
1074 CHKUS5: CAIE 0,TLIST
\r
1075 JRST .+4 ; SPECIAL NON-BREAK TYPE HACK
\r
1076 MOVNS -1(P) ; INDICATE BY NEGATIVE
\r
1077 MOVE A,1(A) ; GET <1 LIST>
\r
1078 GETYP 0,(A) ; AND GET THE TYPE OF THAT
\r
1079 CAIE 0,TFIX ; SEE IF HE WANTS SAME CHAR WITH DIFF TYPE
\r
1080 JRST CHKUS6 ; JUST A VANILLA HACK
\r
1081 MOVE A,1(A) ; PRETEND IT IS SAME TYPE AS NEW CHAR
\r
1082 PUSH P,7(TB) ; CLEAR OUT TRANSLATE TABLE
\r
1083 PUSH P,2(TB) ; FLAGS FOR # OF CHRS IN LOOK AHEAD
\r
1086 TRO A,400000 ; TURN ON PROPER BIT IF ! HACK
\r
1087 PUSHJ P,PRSRET ; REGET TYPE
\r
1089 POP P,7(TB) ; PUT TRANSLATE TABLE BACK
\r
1090 CHKUS6: SKIPGE -1(P) ; SEE IF A SPECIAL NON-BREAK
\r
1091 MOVNS B ; SEXY, HUH?
\r
1094 MOVMS A ; FIX UP A POSITIVE CHARACTER
\r
1100 CHKUS1: SKIPN 7(TB) ; USER CHECK FOR NOT ! CASE
\r
1111 JRST CHKRDO ; TRANSMOGRIFY CHARACTER?
\r
1116 UPLO: POPJ P, ; LETS NOT AND SAY WE USED TO
\r
1117 ; AVOID STRANGE ! BLECHAGE
\r
1119 RETYPE: PUSHJ P,GETCTP ;GET TYPE OF CHAR
\r
1122 NXTCS: PUSHJ P,NXTC
\r
1123 PUSH P,A ; HACK TO NOT TRANSLATE CHAR
\r
1124 PUSHJ P,CHKUS1 ; BUT DO TRANSLATION OF TYPE IF HE WANTS
\r
1125 POP P,A ; USED TO BUILD UP STRINGS
\r
1128 CHKALT: CAIN A,33 ;ALT?
\r
1133 TERM: MOVEI B,0 ;RETURN A 0
\r
1137 CHKMIN: CAIN A,"- ; IF CHAR IS -, WINNER
\r
1141 LOSPAT: PUSHJ P,LSTCHR ; FIX RECURSIVE LOSAGE
\r
1143 PUSH TP,EQUOTE UNATTACHED-PATH-NAME-SEPARATOR
\r
1147 ; HERE TO SEE IF READING RSUBR
\r
1149 RRSUBR: PUSHJ P,LSTCHR ; FLUSH JUST READ CHAR
\r
1150 SKIPL B,5(TB) ; SKIP IF A CHANNEL EXISTS
\r
1151 JRST SPACE ; ELSE LIKE A SPACE
\r
1152 MOVE C,@BUFSTR(B) ; SEE IF FLAG SAYS START OF RSUBR
\r
1153 TRNN C,1 ; SKIP IF REAL RSUBR
\r
1154 JRST SPACE ; NO, IGNORE FOR NOW
\r
1156 ; REALLY ARE READING AN RSUBR
\r
1158 HRRZ 0,4(TB) ; GET READ/READB INDICATOR
\r
1159 MOVE C,ACCESS(B) ; GET CURRENT ACCESS
\r
1160 JUMPN 0,.+3 ; ALREADY WORDS, NO NEED TO DIVIDE
\r
1161 ADDI C,4 ; ROUND UP
\r
1163 PUSH P,C ; SAVE WORD ACCESS
\r
1164 MOVEI A,(C) ; COPY IT FOR CALL
\r
1167 MOVEM C,ACCESS(B) ; FIXUP ACCESS
\r
1168 HLLZS ACCESS-1(B) ; FOR READB LOSER
\r
1169 PUSHJ P,DOACCS ; AND GO THERE
\r
1170 PUSH P,[0] ; FOR READ IN
\r
1171 HRROI A,(P) ; PREPARE TO READ LENGTH
\r
1172 PUSHJ P,DOIOTI ; READ IT
\r
1173 POP P,C ; GET READ GOODIE
\r
1174 MOVEI A,(C) ; COPY FOR GETTING BLOCK
\r
1175 ADDI C,1 ; COUNT COUNT WORD
\r
1177 PUSH TP,$TUVEC ; WILL HOLD UVECTOR OF FIXUPS IF THEY STAY
\r
1179 PUSHJ P,IBLOCK ; GET A BLOCK
\r
1181 PUSH TP,B ; AND SAVE
\r
1182 MOVE A,B ; READY TO IOT IT IN
\r
1183 MOVE B,5(TB) ; GET CHANNEL BACK
\r
1184 MOVSI 0,TUVEC ; SETUP A'S TYPE
\r
1186 PUSHJ P,DOIOTI ; IN COMES THE WHOLE BLOCK
\r
1187 SETZM ASTO(PVP) ; A NO LONGER SPECIAL
\r
1188 MOVEI C,BUFSTR-1(B) ; NO RESET BUFFER
\r
1189 PUSHJ P,BYTDOP ; A POINTS TO DOPW WORD
\r
1191 HRLI A,010700 ; SETUP BYTE POINTER TO END
\r
1192 HLLZS BUFSTR-1(B) ; ZERO CHAR COUNNT
\r
1194 HRRZ A,4(TB) ; READ/READB FLG
\r
1195 MOVE C,(P) ; ACCESS IN WORDS
\r
1196 SKIPN A ; SKIP FOR ASCII
\r
1198 MOVEM C,ACCESS(B) ; UPDATE ACCESS
\r
1199 PUSHJ P,NIREAD ; READ RSUBR VECTOR
\r
1200 JRST BRSUBR ; LOSER
\r
1201 GETYP A,A ; VERIFY A LITTLE
\r
1202 CAIE A,TVEC ; DONT SKIP IF BAD
\r
1203 JRST BRSUBR ; NOT A GOOD FILE
\r
1204 PUSHJ P,LSTCHR ; FLUSH REREAD CHAR
\r
1205 MOVE C,(TP) ; CODE VECTOR BACK
\r
1207 HLR A,B ; FUNNY COUNT
\r
1208 MOVEM A,(B) ; CLOBBER
\r
1210 PUSH TP,$TRSUBR ; MAKE RSUBR
\r
1213 ; NOW LOOK OVER FIXUPS
\r
1215 MOVE B,5(TB) ; GET CHANNEL
\r
1217 HLLZS ACCESS-1(B) ; FOR READB LOSER
\r
1218 HRRZ 0,4(TB) ; READ/READB FLG
\r
1220 ADDI C,4 ; ROUND UP
\r
1221 IDIVI C,5 ; TO WORDS
\r
1222 MOVEI D,(C) ; FIXUP ACCESS
\r
1224 MOVEM D,ACCESS(B) ; AND STORE
\r
1225 RSUB1: ADDI C,1 ; ACCOUNT FOR EXTRA COUNTERS
\r
1226 MOVEM C,(P) ; SAVE FOR LATER
\r
1227 MOVEI A,-1(C) ; FOR DOACS
\r
1228 MOVEI C,2 ; UPDATE REAL ACCESS
\r
1229 SKIPN 0 ; SKIP FOR READB CASE
\r
1232 PUSHJ P,DOACCS ; DO THE ACCESS
\r
1233 PUSH TP,$TUVEC ; SLOT FOR FIXUP BUFFER
\r
1236 ; FOUND OUT IF FIXUPS STAY
\r
1238 MOVE B,MQUOTE KEEP-FIXUPS
\r
1239 PUSHJ P,ILVAL ; GET VALUE
\r
1241 MOVE B,5(TB) ; CHANNEL BACK TO B
\r
1244 JRST RSUB4 ; NO, NOT KEEPING FIXUPS
\r
1245 PUSH P,[0] ; SLOT TO READ INTO
\r
1246 HRROI A,(P) ; GET LENGTH OF SAME
\r
1249 MOVEI A,(C) ; GET UVECTOR FOR KEEPING
\r
1250 ADDM C,(P) ; ACCESS TO END
\r
1251 PUSH P,C ; SAVE LENGTH OF FIXUPS
\r
1253 MOVEM B,-6(TP) ; AND SAVE
\r
1254 MOVE A,B ; FOR IOTING THEM IN
\r
1255 ADD B,[1,,1] ; POINT PAST VERS #
\r
1259 MOVE B,5(TB) ; AND CHANNEL
\r
1260 PUSHJ P,DOIOTI ; GET THEM
\r
1262 MOVE A,(TP) ; GET VERS
\r
1263 PUSH P,-1(A) ; AND PUSH IT
\r
1267 PUSH P,[0] ; 2 SLOTS FOR READING
\r
1273 ADDM C,-2(P) ; NOW -2(P) IS ACCESS TO END OF FIXUPS
\r
1274 RSUB5: MOVEI C,BUFSTR-1(B) ; FIXUP BUFFER
\r
1276 SUBI A,2 ; POINT BEFORE D.W.
\r
1282 SUBI A,BUFLNT-1 ; ALSO MAKE AN IOT FLAVOR BUFFER
\r
1289 RSUB2A: PUSH P,-1(P) ; ANOTHER COPY OF LENGTH OF FIXUPS
\r
1291 ; LOOP FIXING UP NEW TYPES
\r
1293 RSUB2: PUSHJ P,WRDIN ; SEE WHAT NEXT THING IS
\r
1294 JRST RSUB3 ; NO MORE, DONE
\r
1295 JUMPL E,STSQ ; MUST BE FIRST SQUOZE
\r
1296 MOVNI 0,(E) ; TO UPDATE AMNT OF FIXUPS
\r
1298 HRLI E,(E) ; IS LENGTH OF STRING IN WORDS
\r
1299 ADD E,(TP) ; FIXUP BUFFER POINTER
\r
1301 SUB E,[BUFLNT,,BUFLNT]
\r
1302 JUMPGE E,.-1 ; STILL NOT RIGHT
\r
1303 EXCH E,(TP) ; FIX UP SLOT
\r
1304 HLRE C,E ; FIX BYTE POINTER ALSO
\r
1305 IMUL C,[-5] ; + CHARS LEFT
\r
1306 MOVE B,5(TB) ; CHANNEL
\r
1307 PUSH TP,BUFSTR-1(B)
\r
1309 HRRM C,BUFSTR-1(B)
\r
1310 HRLI E,440700 ; AND BYTE POINTER
\r
1312 PUSHJ P,NIREAD ; READ ATOM NAME OF TYPE
\r
1313 TDZA 0,0 ; FLAG LOSSAGE
\r
1314 MOVEI 0,1 ; WINNAGE
\r
1315 MOVE C,5(TB) ; RESET BUFFER
\r
1317 POP TP,BUFSTR-1(C)
\r
1318 JUMPE 0,BRSUBR ; BAD READ OF RSUBR
\r
1319 GETYP A,A ; A LITTLE CHECKING
\r
1322 PUSHJ P,LSTCHR ; FLUSH REREAD CHAR
\r
1323 HRRZ 0,4(TB) ; FIXUP ACCESS PNTR
\r
1326 HLLZS ACCESS-1(C) ; FOR READB HACKER
\r
1331 MOVEM D,ACCESS(C) ; RESET
\r
1332 TYFIXE: PUSHJ P,TYPFND ; SEE IF A LEGAL TYPE NAME
\r
1333 JRST TYPFIX ; GO SEE USER ABOUT THIS
\r
1334 PUSHJ P,FIXCOD ; GO FIX UP THE CODE
\r
1337 ; NOW FIX UP SUBRS ETC. IF NECESSARY
\r
1339 STSQ: MOVE B,MQUOTE MUDDLE
\r
1340 PUSHJ P,IGVAL ; GET CURRENT VERS
\r
1341 CAME B,-1(P) ; SKIP IF NO FIXUPS NEEDED
\r
1342 JRST DOFIX0 ; MUST DO THEM
\r
1344 ; ALL DONE, ACCESS PAST FIXUPS AND RETURN
\r
1346 RSUB3: MOVE A,-3(P)
\r
1348 MOVEI C,(A) ; UPDATE CHANNEL ACCESS IN CASE SKIPPING
\r
1349 HRRZ 0,4(TB) ; READ/READB FLAG
\r
1352 MOVEM C,ACCESS(B) ; INTO ACCESS SLOT
\r
1354 PUSHJ P,DOACCS ; ACCESSED
\r
1355 MOVEI C,BUFSTR-1(B) ; FIX UP BUFFER
\r
1361 SKIPN A,-6(TP) ; SKIP IF KEEPING FIXUPS
\r
1368 MOVE D,MQUOTE RSUBR
\r
1369 PUSHJ P,IPUT ; DO THE ASSOCIATION
\r
1371 RSUB6: MOVE B,-2(TP) ; GET RSUBR
\r
1373 SUB P,[4,,4] ; FLUSH P CRUFT
\r
1377 ; FIXUP SUBRS ETC.
\r
1379 DOFIX0: SKIPN C,-6(TP) ; GET BUFFER IF KEEPING
\r
1381 MOVEM B,(C) ; CLOBBER
\r
1384 FIXUPL: PUSHJ P,WRDIN
\r
1386 DOFIXE: JUMPGE E,BRSUBR
\r
1387 TLZ E,740000 ; KILL BITS
\r
1388 PUSHJ P,SQUTOA ; LOOK IT UP
\r
1390 MOVEI D,(E) ; FOR FIXCOD
\r
1391 PUSHJ P,FIXCOD ; FIX 'EM UP
\r
1394 ; ROUTINE TO FIXUP ACTUAL CODE
\r
1396 FIXCOD: MOVEI E,0 ; FOR HWRDIN
\r
1397 PUSH P,D ; NEW VALUE
\r
1398 PUSHJ P,HWRDIN ; GET HW NEEDED
\r
1399 MOVE D,(P) ; GET NEW VAL
\r
1400 MOVE A,(TP) ; AND BUFFER POINTER
\r
1401 SKIPE -6(TP) ; SAVING?
\r
1402 HRLM D,-1(A) ; YES, CLOBBER
\r
1403 SUB C,(P) ; DIFFERENCE
\r
1406 FIXLP: PUSHJ P,HWRDIN ; GET AN OFFSET
\r
1408 HRRES C ; MAKE NEG IF NEC
\r
1410 ADD C,-4(TP) ; POINT INTO CODE
\r
1420 FIXED: SUB P,[1,,1]
\r
1423 ; ROUTINE TO READ A WORD FROM BUFFER
\r
1427 SOSG -3(P) ; COUNT IT DOWN
\r
1429 AOS -2(P) ; SKIP RETURN
\r
1430 MOVE B,5(TB) ; CHANNEL
\r
1431 HRRZ A,4(TB) ; READ/READB SW
\r
1436 MOVE A,(TP) ; BUFFER
\r
1438 AOBJP A,WRDIN2 ; NEED NEW BUFFER
\r
1444 WRDIN2: MOVE B,-3(P) ; IS THIS LAST WORD?
\r
1445 SOJLE B,WRDIN1 ; YES, DONT RE-IOT
\r
1446 SUB A,[BUFLNT,,BUFLNT]
\r
1455 ; READ IN NEXT HALF WORD
\r
1457 HWRDIN: JUMPN E,NOIOT ; USE EXISTING WORD
\r
1458 PUSH P,-3(P) ; FAKE OUT WRDIN IF NEC.
\r
1461 POP P,-4(P) ; RESET COUNTER
\r
1462 HLRZ C,E ; RET LH
\r
1469 TYPFIX: PUSH TP,$TATOM
\r
1470 PUSH TP,EQUOTE BAD-TYPE-NAME
\r
1474 PUSH TP,EQUOTE ERRET-TYPE-NAME-DESIRED
\r
1478 BRSUBR: PUSH TP,$TATOM
\r
1479 PUSH TP,EQUOTE RSUBR-IN-BAD-FORMAT
\r
1484 ;TABLE OF BYTE POINTERS FOR GETTING CHARS
\r
1486 BYTPNT": 350700,,CHTBL(A)
\r
1492 ;HERE ARE THE TABLES OF CHXRACTERS (NOTE EVERYTHING NOT SPECIFIED IS
\r
1493 ;IN THE NUMBER LETTER CATAGORY)
\r
1495 SETCHR 2,[0123456789]
\r
1503 SETCOD 6,[15,12,11,14,40,33] ;ALL ARE TYPE 2 (SPACING - FF,TAB,SPACE,ALT-MODE)
\r
1505 INCRCH 7,[()[]'%"\#<>] ;GIVE THESE INCREASRNG CODES FROM 3
\r
1507 SETCOD 22,[3] ;^C - EOF CHARACTER
\r
1509 INCRCH 23,[;,{}!] ;COMMENT AND GLOBAL VALUE AND SPECIAL
\r
1512 OUTTBL ;OUTPUT THE TABLE RIGHT HERE
\r
1515 \f; THIS CODE FLUSHES WANDERING COMMENTS
\r
1517 COMNT: PUSHJ P,IREAD
\r
1521 COMNT2: SKIPL A,5(TB) ; RESTORE CHANNEL
\r
1522 MOVEI A,5(TB)-LSTCH ;NO CHANNEL, POINT AT SLOT
\r
1523 MOVEM B,LSTCH(A) ; CLOBBER IN CHAR
\r
1527 ;SUBROUTINE TO READ CHARS ONTO STACK
\r
1529 GOBBL1: MOVEI FF,0 ;KILL ALL FLAGS
\r
1530 PUSHJ P,LSTCHR ;DON'T REREAD "
\r
1531 TROA FF,NOTNUM+INSTRN ;SURPRESS NUMBER CONVERSION
\r
1532 GOBBLE: MOVEI FF,0 ;FLAGS CONCERRNING CURRENT GOODIE IN HERE
\r
1533 MOVE A,TP ;GOBBLE CURRENT TP TO BE PUSHED
\r
1534 MOVEI C,6 ;NOW PUSH 6 0'S ON TO STACK
\r
1535 PUSH TP,$TFIX ;TYPE IS FIXED
\r
1536 PUSH TP,FF ;AND VALUE IS 0
\r
1537 SOJG C,.-2 ;FOUR OF THEM
\r
1538 PUSH TP,$TTP ;NOW SAVE OLD TP
\r
1539 ADD A,[1,,1] ;MAKE IT LOOK LIKE A TB
\r
1541 MOVEI D,0 ;ZERO OUT CHARACTER COUNT
\r
1542 GOB1: MOVSI C,(<440700,,(P)>) ;SET UP FIRST WORD OF CHARS
\r
1543 PUSH P,[0] ;BYTE POINTER
\r
1544 GOB2: PUSH P,FF ;SAVE FLAG REGISTER
\r
1545 INTGO ; IN CASE P OVERFLOWS
\r
1548 MOVEI A,NXTCS ; HACK TO GET MAYBE NEW TYPE WITHOUT CHANGE
\r
1550 POP P,FF ;AND RESTORE FLAG REGISTER
\r
1551 CAIN B,ESCTYP ;IS IT A CHARACTER TO BE ESCAPED
\r
1552 JRST ESCHK ;GOBBLE THE ESCAPED CHARACTER
\r
1553 TRNE FF,INSTRN ;ARE WE BUILDING A CHAR STRING
\r
1554 JRST ADSTRN ;YES, GO READ IN
\r
1555 CAILE B,NONSPC ;IS IT SPECIAL
\r
1556 JRST DONEG ;YES, RAP THIS UP
\r
1558 TRNE FF,NOTNUM ;IS NUMERIC STILL WINNING
\r
1559 JRST SYMB2 ;NO, ONLY DO CHARACTER HACKING
\r
1560 CAIL A,60 ;CHECK FOR DIGIT
\r
1562 JRST SYMB1 ;NOT A DIGIT
\r
1563 JRST CNV ;GO CONVERT TO NUMBER
\r
1566 ;ARRIVE HERE IF STILL BUILDING A NUMBER
\r
1567 CNV: MOVE B,(TP) ;GOBBLE POINTER TO TEMPS
\r
1568 TRO FF,NUMWIN ;SAY DIGITSSEEN
\r
1569 SUBI A,60 ;CONVERT TO A NUMBER
\r
1570 TRNE FF,EFLG ;HAS E BEEN SEEN
\r
1571 JRST ECNV ;YES, CONVERT EXPONENT
\r
1572 TRNE FF,DOTSEN ;HAS A DOT BEEN SEEN
\r
1574 JRST DECNV ;YES, THIS IS A FLOATING NUMBER
\r
1576 MOVE E,ONUM(B) ; OCTAL CONVERT
\r
1580 TRNE FF,OCTSTR ; SKIP OTHER CONVERSIONS IF OCTAL FORCE
\r
1583 JFCL 17,.+1 ;KILL ALL FLAGS
\r
1584 MOVE E,CNUM(B) ;COMPUTE CURRENT RADIX
\r
1586 ADD E,A ;ADD IN CURRENT DIGIT
\r
1588 MOVEM E,CNUM(B) ;AND SAVE IT
\r
1592 ;INSERT OCTAL AND CRADIX CROCK HERE IF NECESSSARY
\r
1593 JRST DECNV1 ;CONVERT TO DECIMAL(FIXED)
\r
1596 DECNV: TRO FF,FLONUM ;SET FLOATING FLAG
\r
1597 DECNV1: JFCL 17,.+1 ;CLEAR ALL FLAGS
\r
1598 MOVE E,DNUM(B) ;GET DECIMAL NUMBER
\r
1600 JFCL 10,CNV2 ;JUMP IF OVERFLOW
\r
1601 ADD E,A ;ADD IN DIGIT
\r
1603 TRNE FF,FLONUM ;IS THIS FRACTION?
\r
1604 SOS NDIGS(B) ;YES, DECREASE EXPONENT BY ONE
\r
1606 CNV1: PUSHJ P,NXTCH ;RE-GOBBLE CHARACTER
\r
1607 JRST SYMB2 ;ALSO DEPOSIT INTO SYMBOL BEING MADE
\r
1608 CNV2: ;OVERFLOW IN DECIMAL NUMBER
\r
1609 TRNE FF,DOTSEN ;IS THIS FRACTION PART?
\r
1610 JRST CNV1 ;YES,IGNORE DIGIT
\r
1611 AOS NDIGS(B) ;NO, INCREASE IMPLICIT EXPONENT BY ONE
\r
1612 TRO FF,FLONUM ;SET FLOATING FLAG BUT
\r
1613 JRST CNV1 ;DO NOT FORCE DECIMAL(DECFRC)
\r
1615 ECNV: ;CONVERT A DECIMAL EXPONENT
\r
1616 HRRZ E,ENUM(B) ;GET EXPONENT
\r
1618 ADD E,A ;ADD IN DIGIT
\r
1619 TLNN E,777777 ;IF OVERFLOW INTO LEFT HALF
\r
1620 HRRM E,ENUM(B) ;DO NOT STORE(CATCH ERROR LATER)
\r
1622 JRST SYMB2 ;ALSO DEPOSIT INTO SYMBOL BEING MADE
\r
1625 ;HERE TO PUT INTO IDENTIFIER BEING BUILT
\r
1627 ESCHK: PUSHJ P,NXTC1 ;GOBBLE NEXT CHAR
\r
1628 SYMB: MOVE B,(TP) ;GET BACK TEM POINTER
\r
1629 TRNE FF,EFLG ;IF E FLAG SET
\r
1630 HLRZ FF,ENUM(B) ;RESTORE SAVED FLAGS
\r
1631 TRO FF,NOTNUM ;SET NOT NUMBER FLAG
\r
1632 SYMB2: TRO FF,NFIRST ;NOT FIRST IN WORLD
\r
1633 SYMB3: IDPB A,C ;INSERT IT
\r
1634 PUSHJ P,LSTCHR ;READ NEW CHARACTER
\r
1635 TLNE C,760000 ;WORD FULL?
\r
1636 AOJA D,GOB2 ;NO, KEEP TRYING
\r
1637 AOJA D,GOB1 ;COUNT WORD AND GO
\r
1639 ;HERE TO CHECK FOR +,-,. IN NUMBER
\r
1641 SYMB1: TRNE FF,NFIRST ;IS THIS THE FIRST CHARACTER
\r
1642 JRST CHECK. ;NO, ONLY LOOK AT DOT
\r
1643 CAIE A,"- ;IS IT MINUS
\r
1644 JRST .+3 ;NO CHECK PLUS
\r
1645 TRO FF,NEGF ;YES, NEGATE AT THE END
\r
1647 CAIN A,"+ ;IS IT +
\r
1648 JRST SYMB2 ;ESSENTIALLY IGNORE IT
\r
1649 CAIE A,"* ; FUNNY OCTAL CROCK?
\r
1657 CHECK.: PUSHJ P,LSTCHR ;FLUSH LAST CHARACTER
\r
1659 TRNN FF,DOTSEN+EFLG ;IF ONE ALREADY SEEN
\r
1661 JRST CHECKE ;GO LOOK FOR E
\r
1664 TRNN FF,NFIRST ;IS IT THE FIRST
\r
1665 JRST DOT1 ;YES, COULD MEAN EVALUATE A VARIABLE
\r
1668 CHCK.1: TRO FF,DECFRC+DOTSEN ;FORCE DECIMAL
\r
1669 IFN FRMSIN, TRNN FF,FRSDOT ;IF NOT FIRST ., PUT IN CHAR STRING
\r
1670 JRST SYMB2 ;ENTER INTO SYMBOL
\r
1671 IFN FRMSIN, JRST GOB2 ;IGNORE THE "."
\r
1677 ;HERE TO SET UP FOR .FOO ..FOO OR.<ABC>
\r
1679 DOT1: PUSH P,FF ;SAVE FLAGS
\r
1680 PUSHJ P,NXTCH1 ;GOBBLE A NEW CHARACTER
\r
1681 POP P,FF ;RESTORE FLAGS
\r
1682 TRO FF,FRSDOT ;SET FLAG IN CASE
\r
1683 CAIN B,NUMCOD ;SKIP IF NOT NUMERIC
\r
1684 JRST CHCK.1 ;NUMERIC, COULD BE FLONUM
\r
1686 ; CODE TO HANDLE ALL IMPLICIT CALLS I.E. QUOTE, LVAL, GVAL
\r
1688 MOVSI B,TFORM ;LVAL
\r
1689 MOVE A,MQUOTE LVAL
\r
1690 SUB P,[2,,2] ;POP OFF BYTE POINTER AND GOBBLE CALL
\r
1692 SUB TP,[1,,1] ;REMOVE TP JUNK
\r
1695 GLOSEG: SKIPA B,$TSEG ;SEG CALL TO GVAL
\r
1696 GLOVAL: MOVSI B,TFORM ;FORM CALL TO SAME
\r
1697 MOVE A,MQUOTE GVAL
\r
1700 QUOSEG: SKIPA B,$TSEG ;SEG CALL TO QUOTE
\r
1701 QUOTIT: MOVSI B,TFORM
\r
1702 MOVE A,MQUOTE QUOTE
\r
1705 SEGDOT: MOVSI B,TSEG ;SEG CALL TO LVAL
\r
1706 MOVE A,MQUOTE LVAL
\r
1707 IMPCAL: PUSHJ P,LSTCHR ;FLUSH LAST CHAR EXCEPT
\r
1708 IMPCA1: PUSH TP,$TATOM ;FOR .FOO FLAVOR
\r
1709 PUSH TP,A ;PUSH ARGS
\r
1710 PUSH P,B ;SAVE TYPE
\r
1711 PUSHJ P,IREAD1 ;READ
\r
1712 JRST USENIL ; IF NO ARG, USE NIL
\r
1715 MOVE C,A ; GET READ THING
\r
1717 PUSHJ P,INCONS ; CONS TO NIL
\r
1718 MOVEI E,(B) ; PREPARE TON CONS ON
\r
1719 POPARE: POP TP,D ; GET ATOM BACK
\r
1721 EXCH C,-1(TP) ; SAVE THAT COMMENT
\r
1724 POP P,A ;GET FINAL TYPE
\r
1725 JRST RET13 ;AND RETURN
\r
1730 SKIPL A,5(TB) ; RESTOR LAST CHR
\r
1731 MOVEI A,5(TB)-LSTCH ;NO CHANNEL, POINT AT SLOT
\r
1736 ;HERE AFTER READING ATOM TO CALL VALUE
\r
1738 .SET: SUB P,[1,,1] ;FLUSH GOBBLE CALL
\r
1739 PUSH P,$TFORM ;GET WINNING TYPE
\r
1741 PUSHJ P,RETC ; CHECK FOR POSSIBLE COMMENT
\r
1743 PUSH TP,MQUOTE LVAL
\r
1744 JRST IMPCA2 ;GO CONS LIST
\r
1748 ;HERE TO CHECK FOR "E" FLAVOR OF EXPONENT
\r
1750 CHECKE: CAIN A,"* ; CHECK FOR FINAL *
\r
1752 TRNN FF,EFLG ;HAS ONE BEEN SEEN
\r
1753 CAIE B,NONSPC ;IF NOT, IS THIS ONE
\r
1754 JRST SYMB ;NO, ENTER AS SYMBOL KILL NUMERIC WIN
\r
1756 TRNN FF,NUMWIN ;HAVE DIGITS BEEN SEEN?
\r
1757 JRST SYMB ;NO, NOT A NUMBER
\r
1758 MOVE B,(TP) ;GET POINTER TO TEMPS
\r
1759 HRLM FF,ENUM(B) ;SAVE FLAGS
\r
1760 HRRI FF,DECFRC+DOTSEN+EFLG ;SET NEW FLAGS
\r
1761 JRST SYMB3 ;ENTER SYMBOL
\r
1764 SYMB4: TRZN FF,OCTSTR
\r
1766 TRZN FF,OCTWIN ; ALREADY WON?
\r
1767 TROA FF,OCTWIN ; IF NOT DO IT NOW
\r
1771 ;HERE ON READING CHARACTER STRING
\r
1773 ADSTRN: SKIPL A ; EOF?
\r
1774 CAIN B,MANYT ;TERMINATE?
\r
1777 JRST SYMB2 ;NO JUST INSERT IT
\r
1778 ADSTN1: PUSHJ P,LSTCHR ;DON'T REREAD """
\r
1781 ;HERE TO FINISH THIS CROCK
\r
1783 DONEG: TRNN FF,OCTSTR ; IF START OCTAL BUT NOT FINISH..
\r
1784 TRNN FF,NUMWIN ;HAVE DIGITS BEEN SEEN?
\r
1785 TRO FF,NOTNUM ;NO,SET NOT NUMBER FLAG
\r
1786 SKIPGE C ; SKIP IF STUFF IN TOP WORD
\r
1789 TRNN FF,NOTNUM ;NUMERIC?
\r
1790 JRST NUMHAK ;IS NUMERIC, GO TO IT
\r
1793 MOVE A,(TP) ;GET POINTER TO TEMPS
\r
1794 MOVEM FF,NDIGS(A) ;USE TO HOLD FLAGS
\r
1796 TRNE FF,INSTRN ;ARE WE BUILDING A STRING
\r
1797 JRST MAKSTR ;YES, GO COMPLETE SAME
\r
1798 LOOPAT: PUSHJ P,NXTCH ; CHECK FOR TRAILER
\r
1799 CAIN B,PATHTY ; PATH BEGINNER
\r
1800 JRST PATH0 ; YES, GO PROCESS
\r
1801 CAIN B,SPATYP ; SPACER?
\r
1802 PUSHJ P,SPACEQ ; CHECK FOR REAL SPACE
\r
1804 PUSHJ P,LSTCHR ; FLUSH IT AND RETRY
\r
1806 PATH0: PUSHJ P,NXTCH1 ; READ FORCED NEXT
\r
1807 CAIE B,SPCTYP ; DO #FALSE () HACK
\r
1810 CAIL B,SPATYP ; SPACER?
\r
1811 JRST PATH3 ; YES, USE THE ROOT OBLIST
\r
1812 PATH4: PUSHJ P,NIREA1 ; READ NEXT ITEM
\r
1813 PUSHJ P,ERRPAR ; LOSER
\r
1814 CAME A,$TATOM ; ONLY ALLOW ATOMS
\r
1822 PUSH TP,IMQUOTE OBLIST
\r
1823 MCALL 2,GET ; GET THE OBLIST
\r
1824 CAMN A,$TOBLS ; IF NOT OBLIST, MAKE ONE
\r
1826 MCALL 1,MOBLIS ; MAKE ONE
\r
1829 PATH6: SUB TP,[2,,2]
\r
1833 PATH3: MOVE B,ROOT+1(TVP) ; GET ROOT OBLIST
\r
1835 PATH1: PUSHJ P,RLOOKU ; AND LOOK IT UP
\r
1838 MOVE C,(TP) ;SET TO REGOBBLE FLAGS
\r
1852 ;HERE TO RAP UP CHAR STRING ITEM
\r
1854 MAKSTR: MOVE C,D ;SETUP TO CALL CHMAK
\r
1855 PUSHJ P,CHMAK ;GO MAKE SAME
\r
1859 NUMHAK: MOVE C,(TP) ;REGOBBLETEMP POINTER
\r
1860 POP P,D ;POP OFF STACK TOP
\r
1863 HRLI D,(D) ;TOO BOTH HALVES
\r
1864 SUB P,D ;REMOVE CHAR STRING
\r
1865 TRNE FF,FLONUM+EFLG ;IS IT A FLOATING POINT NUMBER
\r
1866 JRST FLOATIT ;YES, GO MAKE IT WIN
\r
1869 MOVE B,DNUM(C) ;GRAB FIXED GOODIE
\r
1870 TRNE FF,OCTWIN ; SKIP IF NOT OCTAL
\r
1871 MOVE B,ONUM(C) ; USE OCTAL VALUE
\r
1873 FINID2: MOVSI A,TFIX ;SAY FIXED POINT
\r
1874 FINID1: TRNE FF,NEGF ;NEGATE
\r
1876 FINID: POP TP,TP ;RESTORE OLD TP
\r
1877 SUB TP,[1,,1] ;FINISH HACK
\r
1879 TRNE FF,FRSDOT ;DID . START IT
\r
1880 JRST .SET ;YES, GO HACK
\r
1882 POPJ P, ;AND RETURN
\r
1887 PATH2: MOVE B,IMQUOTE OBLIST
\r
1891 BADPAT: PUSH TP,$TATOM
\r
1892 PUSH TP,EQUOTE NON-ATOMIC-OBLIST-NAME
\r
1897 JFCL 17,.+1 ;CLEAR ALL ARITHMETIC FLAGS
\r
1899 TRNE FF,EFLG ;"E" SEEN?
\r
1900 JRST EXPDO ;YES, DO EXPONENT
\r
1901 MOVE D,NDIGS(C) ;GET IMPLICIT EXPONENT
\r
1903 FLOATE: MOVE A,DNUM(C) ;GET DECIMAL NUMBER
\r
1904 IDIVI A,400000 ;SPLIT
\r
1905 FSC A,254 ;CONVERT MOST SIGNIFICANT
\r
1906 FSC B,233 ; AND LEAST SIGNIFICANT
\r
1909 MOVM A,D ;GET MAGNITUDE OF EXPONENT
\r
1910 CAILE A,37. ;HOW BIG?
\r
1911 JRST FOOR ;TOO BIG-FLOATING OUT OF RANGE
\r
1912 JUMPGE D,FLOAT1 ;JUMP IF EXPONENT POSITIVE
\r
1913 FDVR B,TENTAB(A) ;DIVIDE BY TEN TO THE EXPONENT
\r
1916 FLOAT1: FMPR B,TENTAB(A) ;SCALE UP
\r
1918 SETFLO: JFCL 10,FOOR ;FLOATING OUT OF RANGE ON OVERFLOW
\r
1920 IFN FRMSIN, TRZ FF,FRSDOT ;FLOATING NUMBER NOT VALUE
\r
1924 HRRZ D,ENUM(C) ;GET EXPONENT
\r
1925 TRNE FF,NEGF ;IS EXPONENT NEGATIVE?
\r
1927 ADD D,NDIGS(C) ;ADD IMPLICIT EXPONENT
\r
1928 HLR FF,ENUM(C) ;RESTORE FLAGS
\r
1929 JUMPL D,FLOATE ;FLOATING IF EXPONENT NEGATIVE
\r
1930 CAIG D,10. ;OR IF EXPONENT TOO LARGE
\r
1931 TRNE FF,FLONUM ;OR IF FLAG SET
\r
1935 JFCL 10,FLOATE ;IF OVERFLOW, MAKE FLOATING
\r
1936 JRST FINID2 ;GO MAKE FIXED NUMBER
\r
1938 ; HERE TO READ ONE CHARACTER FOR USER.
\r
1940 CREDC1: SUBM M,(P)
\r
1947 CNXTC1: SUBM M,(P)
\r
1954 CREADC: SUBM M,(P)
\r
1962 CNXTCH: SUBM M,(P)
\r
1968 RMPOPJ: SUB TP,[2,,2]
\r
1973 MOVE B,(TP) ; CHANNEL
\r
1974 HRRZ A,-4(B) ; GET BLESS BITS
\r
1980 TRC A,C.OPN+C.READ
\r
1981 TRNE A,C.OPN+C.READ
\r
1985 MOVEM A,LSTCH(B) ; SAVE CHAR
\r
1986 CAMN A,[-1] ; SPECIAL PSEUDO TTY HACK?
\r
1987 JRST PSEUDO ; YES, RET AS FIX
\r
1988 TRZN A,400000 ; UNDO ! HACK
\r
1992 MOVEI A,"! ; RETURN AN !
\r
1993 NOEXC1: SKIPGE B,A ; CHECK EOF
\r
1994 SOS (P) ; DO EOF RETURN
\r
1995 MOVE B,A ; CHAR TO B
\r
2010 ; READER ERRORS COME HERE
\r
2012 ERRPAR: PUSH TP,$TCHRS ;DO THE OFFENDER
\r
2015 PUSH TP,[40] ;SPACE
\r
2017 PUSH TP,CHQUOT UNEXPECTED
\r
2020 ;COMPLAIN ABOUT MISMATCHED CLOSINGS
\r
2022 MISMAB: SKIPA A,["]]
\r
2023 MISMAT: MOVE A,-1(P) ;GOBBLE THE DESIRED CHARACTER
\r
2024 JUMPE B,CPOPJ ;IGNORE UNIVERSAL CLOSE
\r
2028 PUSH TP,CHQUOT [ INSTEAD-OF ]
\r
2031 MISMA1: MCALL 3,STRING
\r
2033 PUSH TP,EQUOTE READER-SYNTAX-ERROR-ERRET-ANYTHING-TO-GO-ON
\r
2037 PUSH TP,MQUOTE READ
\r
2041 ; HERE ON BAD INPUT CHARACTER
\r
2043 BADCHR: PUSH TP,$TATOM
\r
2044 PUSH TP,EQUOTE BAD-ASCII-CHARACTER
\r
2047 ; HERE ON YUCKY PARSE TABLE
\r
2049 BADPTB: PUSH TP,$TATOM
\r
2050 PUSH TP,EQUOTE BAD-MACRO-TABLE
\r
2053 BDPSTR: PUSH TP,$TATOM
\r
2054 PUSH TP,EQUOTE BAD-PARSE-STRING
\r
2057 ILLSQG: PUSHJ P,LSTCHR ; DON'T MESS WITH IT AGAIN
\r
2059 PUSH TP,EQUOTE BAD-USE-OF-SQUIGGLY-BRACKETS
\r
2063 ;FLOATING POINT NUMBER TOO LARGE OR SMALL
\r
2064 FOOR: PUSH TP,$TATOM
\r
2065 PUSH TP,EQUOTE NUMBER-OUT-OF-RANGE
\r
2072 SKIPL B,5(TB) ;GET CHANNEL
\r
2073 JRST LSTCH1 ;NO CHANNEL, POINT AT SLOT
\r
2078 LSTCH2: SKIPE LSTCH(B) ;ARE WE REALLY FLUSHING A REUSE CHARACTER ?
\r
2083 LSTCH1: SETZM 5(TB) ;ZERO THE LETTER AND RETURN
\r
2088 HRRZ A,-4(B) ; GET BITS
\r
2095 CNTBIN: AOS A,ACCESS-1(B)
\r
2103 ;TABLE OF NAMES OF ARGS AND ALLOWED TYPES
\r
2106 IRP A,,[[[CAIN C,TUNBOU]],[[CAIE C,TCHAN],INCHAN],[[PUSHJ P,CHOBL],OBLIST]]
\r
2109 IFSN [C],IMQUOTE C
\r
2114 CHOBL: CAIE C,TLIST ;A LIST OR AN OBLIST
\r