1 TITLE MAIN LOOP AND GLOBALLY REFERENCED SUBROUTINES
7 .GLOBAL TBINIT,PIDSTO,PROCID,PTIME,GCPDL,PBASE,TYPTOP,RERR,FRMSTK,EMERGE
8 .GLOBAL PDLBUF,INTINT,START,SWAP,ICR,SPBASE,TPBASE,TPBAS,CURPRI,CHFINI,MKTBS
9 .GLOBAL TOPLEVEL,INTOBL,INITIA,ERROBL,MAINPR,RESFUN,STATUS,TYPVEC,ROOT,TTICHN,TTOCHN
10 .GLOBAL TTYOPE,MOPEN,MCLOSE,MIOT,ILVAL,MESS,ERROR,CHFRM,IGVAL,TYPBOT,ASOVEC
11 .GLOBAL PRINT,PRIN1,PRINC,MUDSTR,VECBOT,CSTACK,IFALSE,TYPLOO,RCALL,SWAPIN,CTMPLT
12 .GLOBAL IDPROC,CHFSWP,ILOC,MAKACT,BNDV,SPECSTORE,BINDID,IGLOC,MTYO,MSGTYP,CAFRE1,CPOPJ
13 .GLOBAL EVATYP,EVTYPE,APLTYP,APTYPE,PRNTYP,PRTYPE,AGC,SGSNAM,NAPT,APLQ,STRTO6
14 .GLOBAL 6TOCHS,TYPFND,STBL,CHNL0,N.CHNS,CLOSAL,%LOGOUT,%SSNAM,%RSNAM,%KILLM,SAT
15 .GLOBAL MAKINF,%VALRET,COMPERR,IPUT,IGET,TMATCH,INITIZ,IPCINI,%UNAM,%JNAM,%RUNAM,%RJNAM,%RXUNA,%RXJNA,%VALFI
16 .GLOBAL NOTTY,DEMFLG,CFRAME,CARGS,CFUNCT,CITYPE,CTYPEQ,CPTYPE,CTYPEP,CUTYPE,
17 .GLOBAL CCHUTY,RTFALS,PGINT,PURCLN,CTYPEC,CTYPEW,IDVAL1,CALLTY,MESSAG,INITFL,WHOAMI
18 .GLOBAL %SLEEP,%HANG,%TOPLQ,ONINT,CHUNW,CURFCN,BUFRIN,TD.LNT,TD.GET,TD.AGC,TD.PUT,MPOPJ
19 .GLOBAL PURVEC,PLOAD,SSPECS,OUTRNG,CVTYPE,FSTART,CKVRS,CPRTYC,PVSTOR,SPSTOR
20 .GLOBAL TYPIC,CISET,LSTUF,IMPURI,REALTV
23 ;MAIN LOOP AND STARTUP
25 START: MOVEI 0,0 ; SET NO HACKS
27 TLNE 0,-1 ; SEE IF CHANNEL
32 PUSHJ P,CKVRS ; CHECK VERSION NUMBERS
34 JRST FSTART ; GO RESTORE
35 START1: MOVEM 0,WHOAMI ; HACK FOR TS FOO linked to TS MUDDLE
36 MOVE PVP,MAINPR ; MAKE SURE WE START IN THE MAIN PROCESS
37 JUMPE 0,INITIZ ; MIGHT BE RESTART
38 MOVE P,PSTO+1(PVP) ; SET UP FOR BOOTSTRAP HACK
40 INITIZ: MOVE PVP,MAINPR
41 SKIPN P ; IF NO CURRENT P
42 MOVE P,PSTO+1(PVP) ; PDL TO GET OFF THE GROUND
43 SKIPN TP ; SAME FOR TP
44 MOVE TP,TPSTO+1(PVP) ; GET A TP TO WORK WITH
45 SETZB R,M ; RESET RSUBR AC'S
49 PUSHJ P,TTYOPE ;OPEN THE TTY
51 SKIPE WHOAMI ; SKIP IF THIS IS MUDDLE
52 JRST NODEMT ; ELSE NO MESSAGE
53 SKIPE DEMFLG ; SKIP IF NOT DEMON
55 SKIPN NOTTY ; IF NO TTY, IGNORE
56 PUSHJ P,MSGTYP ;TYPE OUT TO USER
58 NODEMT: XCT MESSAG ;MAYBE PRINT A MESSAGE
59 PUSHJ P,INTINT ;INITIALIZE INTERRUPT HANDLER
61 PUSHJ P,PURCLN ; CLEAN UP PURE SHARED AREA
62 RESTART: ;RESTART A PROCESS
65 MOVE B,TBINIT+1(PVP) ;POINT INTO STACK AT START
66 PUSHJ P,CHUNW ; LEAVE WHILE DOING UNWIND CHECK
68 MOVEI A,TFALSE ; IN CASE FALLS OFF PROCESS
79 IMFUNCTION LISTEN,SUBR
82 PUSH P,[0] ;FLAG: DON'T PRINT ERROR MSG
85 ; USER SUPPLIED ERROR HANDLER, TEMPORARY KLUDGE
88 ERROR: MOVE B,IMQUOTE ERROR
89 PUSHJ P,IGVAL ; GET VALUE
91 CAIN C,TSUBR ; CHECK FOR NO CHANGE
92 CAIE B,RERR1 ; SKIP IF NOT CHANGED
94 JRST RERR1 ; GO TO THE DEFAULT
95 PUSH TP,A ; SAVE VALUE
98 MOVEI D,1 ; AND COUNTER
99 USER1: PUSH TP,(C) ; PUSH THEM
104 ACALL D,APPLY ; EVAL USERS ERROR
109 IMFUNCTION ERROR%,SUBR,ERROR
113 PUSH TP,MQUOTE ERROR,ERROR,INTRUP
114 PUSHJ P,FRMSTK ; PUT ERROR'S FRAME ON STACK
117 RERR2: JUMPGE C,RERR22
122 RERR22: ACALL D,EMERGENCY
127 PUSH P,[-1] ;PRINT ERROR FLAG
129 ER1: MOVE B,IMQUOTE INCHAN
130 PUSHJ P,ILVAL ; CHECK INPUT CHANNEL IS SOME KIND OF TTY
132 CAIE A,TCHAN ; SKIP IF IT IS A CHANNEL
133 JRST ER2 ; NO, MUST REBIND
136 ER2: MOVE B,IMQUOTE INCHAN
137 MOVEI C,TTICHN ; POINT TO VALU
138 PUSHJ P,PUSH6 ; PUSH THE BINDING
139 MOVE B,TTICHN+1 ; GET IN CHAN
140 NOTINC: SKIPN DEMFLG ; SKIP IF DEMON
147 MCALL 2,TTYECH ; ECHO INPUT
148 NOECHO: MOVE B,IMQUOTE OUTCHAN
149 PUSHJ P,ILVAL ; GET THE VALUE
151 CAIE A,TCHAN ; SKIP IF OK CHANNEL
152 JRST ER3 ; NOT CHANNEL, MUST REBIND
155 ER3: MOVE B,IMQUOTE OUTCHAN
157 PUSHJ P,PUSH6 ; PUSH THE BINDINGS
158 NOTOUT: MOVE B,IMQUOTE OBLIST
159 PUSHJ P,ILVAL ; GET THE VALUE OF OBLIST
160 PUSHJ P,OBCHK ; IS IT A WINNER ?
161 SKIPA A,$TATOM ; NO, SKIP AND CONTINUE
162 JRST NOTOBL ; YES, DO NOT DO REBINDING
163 MOVE B,IMQUOTE OBLIST
167 JRST MAKOB ; NO GLOBAL OBLIST, MAKE ONE
168 MOVEI C,(B) ; COPY ADDRESS
169 MOVE A,(C) ; GET THE GVAL
171 PUSHJ P,OBCHK ; IS IT A WINNER ?
172 JRST MAKOB ; NO, GO MAKE A NEW ONE
173 MOVE B,IMQUOTE OBLIST
176 NOTOBL: PUSH TP,[TATOM,,-1] ;FOR BINDING
177 PUSH TP,IMQUOTE LER,[LERR ]INTRUP
179 HRLI A,TFRAME ; CORRCT TYPE
184 MOVE A,PVSTOR+1 ; GET PROCESS
185 ADD A,[PROCID,,PROCID] ; POINT TO ID (ALSO LEVEL)
189 ADDI A,1 ; BUMP ERROR LEVEL
191 PUSH TP,PROCID+1(PVP)
194 MOVE B,IMQUOTE READ-TABLE
197 PUSH TP,IMQUOTE READ-TABLE
198 GETYP C,A ; TO GVAL OF READ-TABLE ON ERROR AND
199 CAIE C,TVEC ; TOP ERRET'S
209 PUSHJ P,SPECBIND ;BIND THE CRETANS
210 MOVE A,-1(P) ;RESTORE SWITHC
211 JUMPE A,NOERR ;IF 0, DONT PRINT ERROR MESS
213 PUSH TP,EQUOTE *ERROR*
215 MCALL 1,PRINC ;PRINT THE MESSAGE
216 NOERR: MOVE C,AB ;GET A COPY OF AB
218 ERRLP: JUMPGE C,LEVPRT ;IF NONE, RE-ENTER READ-EVAL-PRINT LOOP
222 GETYP A,(C) ; GET ARGS TYPE
225 MOVE A,1(C) ; GET ATOM
227 CAME A,[-1,,ERROBL+1]
228 CAMN A,ERROBL+1 ; DONT SKIP IF IN ERROR OBLIST
229 MOVEI B,PRINC ; DONT PRINT TRAILER
230 ERROK: PUSH P,B ; SAVE ROUTINE POINTER
233 MCALL 0,TERPRI ; CRLF
234 POP P,B ; GET ROUTINE BACK
238 ADD C,[2,,2] ;BUMP SAVED AB
239 JRST ERRLP ;AND CONTINUE
242 LEVPRT: XCT INITFL ;LOAD MUDDLE INIT FILE IF FIRST TIME
245 PUSH TP,EQUOTE [LISTENING-AT-LEVEL ]
246 MCALL 1,PRINC ;PRINT LEVEL
247 PUSH TP,$TFIX ;READY TO PRINT LEVEL
248 HRRZ A,(P) ;GET LEVEL
249 SUB P,[2,,2] ;AND POP STACK
251 MCALL 1,PRIN1 ;PRINT WITHOUT SPACES ETC.
252 PUSH TP,$TATOM ;NOW PROCESS
253 PUSH TP,EQUOTE [ PROCESS ]
254 MCALL 1,PRINC ;DONT SLASHIFY SPACES
256 PUSH TP,PROCID(PVP) ;NOW ID
257 PUSH TP,PROCID+1(PVP)
264 PUSH TP,EQUOTE [ INT-LEVEL ]
267 JRST MAINLP ; FALL INTO MAIN LOOP
269 \f;ROUTINES FOR ERROR-LISTEN
273 JRST CPOPJ1 ; WIN FOR SINGLE OBLIST
274 CAIE 0,TLIST ; IF LIST, MAKE SURE EACH IS AN OBLIST
275 JRST CPOPJ ; ELSE, LOSE
277 JUMPE B,CPOPJ ; NIL ,LOSE
280 PUSH P,[0] ;FLAG FOR DEFAULT CHECKING
281 MOVEI 0,1000 ; VERY BIG NUMBER FOR CIRCULARITY TEST
284 SOJE 0,OBLOSE ; CIRCULARITY TEST
285 HRRZ B,(TP) ; GET LIST POINTER
287 CAIE A,TOBLS ; SKIP IF WINNER
288 JRST DEFCHK ; CHECK FOR SPECIAL ATOM DEFAULT
293 OBLOSE: SUB TP,[2,,2]
297 DEFCHK: SKIPN (P) ; BEEN HERE BEFORE ?
298 CAIE A,TATOM ; OR, NOT AN ATOM ?
299 JRST OBLOSE ; YES, LOSE
301 CAME A,MQUOTE DEFAULT
304 HRRZ B,(B) ; CHECK FOR END OF LIST
306 JUMPN B,OBCHK0 ; NOT THE END, CONTINUE LOOKING
307 JRST OBLOSE ; LOSE FOR DEFAULT AT THE END
311 PUSH6: PUSH TP,[TATOM,,-1]
320 MAKOB: PUSH TP,INITIAL
326 PUSH TP,IMQUOTE OBLIST
331 PUSH TP,IMQUOTE OBLIST
339 ;THIS IS IT FOLKS...THE MAIN LOOP. READ, EVAL, PRINT
341 MAINLP: MOVE A,$TATOM ;KLUDGE BY NDR LIKE ERROR TO LET LOOSER REDEFINE
343 PUSHJ P,ILVAL ;GET ITS LVAL TO SEE IF REDEFINED
347 MOVE A,$TATOM ;SEE IF IT HAS GVAL SINCE NO LVAL
362 MCALL 1,APPLY ;LOOSER HAS REDEFINED SO CALL HIS
364 IREPER: PUSH P,[0] ;INDICATE FALL THROUGH
367 ERRREP: PUSH TP,[TATOM,,-1]
375 PUSH TP,EQUOTE NON-APPLICABLE-REP
384 IMFUNCTION REPER,SUBR,REP
386 PUSH P,[1] ;INDICATE DIRECT CALL
387 REPERF: MCALL 0,TERPRI
392 PUSHJ P,ILVAL ; ASSIGNED?
396 PUSHJ P,LSTTOF ; PUT LAST AS FIRST
399 MOVE C,IMQUOTE LAST-OUT
403 MOVE B,IMQUOTE L-OUTS
404 PUSHJ P,ILVAL ; ASSIGNED?
408 CAME B,(TP) ; DONT STUFF IT INTO ITSELF
409 JRST STUFIT ; STUFF IT IN
411 CAIE 0,TLIST ; IF A LIST THE L-OUTS
412 STUFIT: PUSHJ P,LSTTOF ; PUT LAST AS FIRST
414 POP P,C ;FLAG FOR FALL THROUGH OR CALL
415 JUMPN C,FINIS ;IN CASE LOOSER CALLED REP
423 MOVEI D,(C) ; SAVE PTR TO 2ND ELEMENT
424 MOVEI 0,-1 ; LET THE LOSER LOSE (HA HA HA)
426 LSTTO1: HRRZ C,(C) ; START SCAN
433 CAIE D,(C) ; AVOID CIRCULARITY
441 LSTTO2: MOVSI A,TLIST
446 ;FUNCTION TO RETRY A PREVIOUS FUNCTION CALL
451 JUMPGE AB,RETRY1 ; USE MOST RECENT
454 GETYP A,(AB) ; CHECK TYPE
457 MOVEI B,(AB) ; POINT TO ARG
459 RETRY1: MOVE B,IMQUOTE LER,[LERR ]INTRUP
460 PUSHJ P,ILOC ; LOCATIVE TO FRAME
461 RETRY2: PUSHJ P,CHFSWP ; CHECK VALIDITY AND SWAP IF NECESSARY
462 HRRZ 0,OTBSAV(B) ; CHECK FOR TOP
463 JUMPE 0,RESTAR ; YES RE-ENTER TOP LEVEL
465 PUSH TP,B ; SAVE FRAME
466 MOVE B,OTBSAV(B) ; GET PRVIOUS FOR UNBIND HACK
468 PUSHJ P,CHUNW ; CHECK ANY UNWINDING
469 CAME SP,SPSAV(TB) ; UNBINDING NEEDED?
471 MOVE P,PSAV(TB) ; GET OTHER STUFF
473 HLRE A,AB ; COMPUTE # OF ARGS
474 MOVNI A,-FRAMLN(A) ; MAKE TP POINT PAST FRAME
476 MOVE C,TPSAV(TB) ; COMPUTE TP
479 MOVE TB,B ; FIX UP TB
480 HRRZ C,FSAV(TB) ; GET FUNCTION
483 GETYP 0,(C) ; RSUBR OR ENTRY?
487 MOVS R,(C) ; SET UP R
492 RETRNT: CAIE 0,TRSUBR
495 RETRN4: HRRZ C,2(C) ; OFFSET
501 RETRN5: MOVEI D,(M) ; TOTAL OFFSET
519 RETRN1: HRL C,(C) ; FIX LH
532 RETRN2: ERRUUO EQUOTE CANT-RETRY-ENTRY-GONE
534 RETRER: ERRUUO EQUOTE PURE-LOAD-FAILURE
537 ;FUNCTION TO DO ERROR RETURN
539 IMFUNCTION ERRET,SUBR
542 HLRE A,AB ; -2*# OF ARGS
543 JUMPGE A,STP ; RESTART PROCESS
544 ASH A,-1 ; -# OF ARGS
545 AOJE A,ERRET2 ; NO FRAME SUPPLIED
551 PUSHJ P,CHPROC ; POINT TO FRAME SLOT
553 ERRET2: MOVE B,IMQUOTE LER,[LERR ]INTRUP
554 PUSHJ P,ILVAL ; GET ITS VALUE
558 PUSHJ P,CHFSWP ; CHECK VALIDITY AND SWAP IF NECESSARY
559 HRRZ 0,OTBSAV(B) ; TOP LEVEL?
561 PUSHJ P,CHUNW ; ANY UNWINDING
565 ; FUNCTION TO RETURN LAST ERROR FRAME OR PREVIOUS FRAME
567 IMFUNCTION FRAME,SUBR
570 JUMPGE AB,FRM1 ; DEFAULT CASE
571 CAMG AB,[-3,,0] ; SKIP IF OK ARGS
573 PUSHJ P,OKFRT ; A FRAME OR SIMILAR THING?
576 FRM1: PUSHJ P,CFRAME ; GO TO INTERNAL
579 CFRAME: JUMPN A,FRM2 ; ARG SUPPLIED?
580 MOVE B,IMQUOTE LER,[LERR ]INTRUP
583 FRM2: PUSHJ P,CHPROC ; CHECK FOR PROCESS
586 MOVEI B,-1(TP) ; POINT TO SLOT
587 PUSHJ P,CHFRM ; CHECK IT
588 MOVE C,(TP) ; GET FRAME BACK
589 MOVE B,OTBSAV(C) ;GET PREVIOUS FRAME
591 TRNN B,-1 ; SKIP IF OK
594 FRM3: JUMPN B,FRM4 ; JUMP IF WINNER
595 MOVE B,IMQUOTE THIS-PROCESS
596 PUSHJ P,ILVAL ; GET PROCESS OF INTEREST
599 MOVE B,PVSTOR+1 ; USE CURRENT
600 MOVEI A,PVLNT*2+1(B) ; POINT TO DOPE WORDS
601 MOVE B,TBINIT+1(B) ; AND BASE FRAME
602 FRM4: HLL B,OTBSAV(B) ;TIME
606 OKFRT: AOS (P) ;ASSUME WINNAGE
619 CHPROC: GETYP 0,A ; TYPE
623 CAMN B,PVSTOR+1 ; THIS PROCESS?
628 CHPRO1: MOVE B,OTBSAV(TB)
631 ; FUNCTION TO RETURN ARGS TUPLE FOR A FRAME
635 PUSHJ P,OKFRT ; CHECK FRAME TYPE
640 CARGS: PUSHJ P,CHPROC
643 MOVEI B,-1(TP) ; POINT TO FRAME SLOT
644 PUSHJ P,CHFRM ; AND CHECK FOR VALIDITY
645 MOVE C,(TP) ; FRAME BACK
647 CARGS1: GETYP 0,FSAV(C) ; IS THIS A FUNNY ONE
648 CAIE 0,TCBLK ; SKIP IF FUNNY
650 MOVE C,OTBSAV(C) ; ASSOCIATE WITH PREVIOUS FRAME
652 HLR A,OTBSAV(C) ; TIME IT AND
653 MOVE B,ABSAV(C) ; GET POINTER
654 SUB TP,[2,,2] ; FLUSH CRAP
657 ; FUNCTION TO RETURN FUNCTION ASSOCIATED WITH A FRAME
660 ENTRY 1 ; FRAME ARGUMENT
661 PUSHJ P,OKFRT ; CHECK TYPE
666 CFUNCT: PUSHJ P,CHPROC
670 PUSHJ P,CHFRM ; CHECK IT
671 MOVE C,(TP) ; RESTORE FRAME
672 HRRZ A,FSAV(C) ;FUNCTION POINTER
674 SKIPA B,@-1(A) ;NO, GET SUBR'S NAME POINTER
675 MOVE B,(A)+3 ;YES, GET RSUBR'S NAME ENTRY
681 ERRUUO EQUOTE FRAME-NO-LONGER-EXISTS
685 ERRUUO EQUOTE TOP-LEVEL-FRAME
690 ; ROUTINE TO HANG INDEFINITELY WITH INTERRUPTS ENABLED
696 JUMPGE AB,HANG1 ; NO PREDICATE
702 REHANG: MOVE A,[PUSHJ P,CHKPRH]
703 MOVEM A,ONINT ; CHECK PREDICATE AFTER ANY INTERRUPT
704 HANG1: ENABLE ;LET OURSELVES BE INTERRUPTED OUT
706 DISABLE ;PREVENT INTERRUPTS AT RANDOM TIMES
713 ; ROUTINE TO SLEEP FOR POSITIVE NUMBER OF SECONDS WITH INTERRUPTS ENABLED
714 ; ARGUMENT SHOULD BE OF TYPE FIX OR FLOAT AND NON-NEGATIVE
732 JUMPL B,OUTRNG ;ARG SHOULDNT BE NEGATIVE
733 IMULI B,30. ;CONVERT TO # OF THIRTIETHS OF A SECOND
734 JRST SLEEPR ;GO SLEEP
735 CAIE 0,TFLOAT ;IF IT WASNT FIX MAKE SURE IT IS FLOAT
736 JRST WTYP1 ;WRONG TYPE ARG
738 FMPR B,[30.0] ;CONVERT TO FLOATING # OF THIRTIETHS OF A SECOND
739 MULI B,400 ;KLUDGE TO FIX IT
742 MOVE B,C ;MOVE THE FIXED NUMBER INTO B
743 JUMPL B,OUTRNG ;CHECK TO SEE THAT WE HAVE POSITIVE NUMBER
745 RESLEE: MOVE B,[PUSHJ P,CHKPRS]
763 SETZM ONINT ; TURN OFF FEATURE FOR NOW
767 HANGP: SKIPA B,[REHANG]
768 SLEEPP: MOVEI B,RESLEE
781 MFUNCTION VALRET,SUBR
782 ; SUBR TO VALRET A STRING TO SUPERIOR ITS PROCESS
785 GETYP A,(AB) ; GET TYPE OF ARGUMENT
788 CAIE A,TCHSTR ; IS IT A CHR STRING?
789 JRST WTYP1 ; NO...ERROR WRONG TYPE
790 PUSHJ P,CSTACK ; COPY THE CHR STRING TO THE STACK
791 ; CSTACK IS IN ATOMHK
792 MOVEI B,0 ; ASCIZ TERMINATOR
793 EXCH B,(P) ; STORE AND RETRIEVE COUNT
795 ; CALCULATE THE BEGINNING ADDR OF THE STRING
796 MOVEI A,-1(P) ; GET ADDR OF TOP OF STACK
797 SUBI A,-1(B) ; GET STARTING ADDR
798 PUSHJ P,%VALRE ; PASS UP TO MONITOR
799 JRST IFALSE ; IF HE RETURNS, RETURN FALSE
805 MFUNCTION LOGOUT,SUBR
807 ; SUBR TO DO A .LOGOUT (VALID ONLY AT TOP LEVEL)
809 PUSHJ P,%TOPLQ ; SKIP IF AT TOP LEVEL
812 PUSHJ P,%LOGOUT ; TRY TO FLUSH
813 JRST IFALSE ; COULDN'T DO IT...RETURN FALSE
815 ; FUNCTS TO GET UNAME AND JNAME
817 ; GET XUNAME (REAL UNAME)
818 MFUNCTION XUNAME,SUBR
824 JRST FINIS ; 10X ROUTINES SKIP
835 MFUNCTION XJNAME,SUBR
849 ; FUNCTION TO SET AND READ GLOBAL SNAME
858 GETYP A,(AB) ; ARG MUST BE STRING
868 SNAME1: MOVE B,IMQUOTE SNM
877 RSUJNM: PUSHJ P,6TOCHS ; CONVERT IT
881 SGSNAM: MOVE B,IMQUOTE SNM
895 PUSHJ P,%SSNAM ; SET SNAME IN SYSTEM
900 ;THIS SUBROUTINE ALLOCATES A NEW PROCESS
901 ;TAKES TP-STACK SIZE (2*WORDS) IN A AND P-STACK SIZE (WORDS) IN B
902 ;IS CALLED BY PUSHJ P,. RETURNS IN A AND B A NEW PROCESS.
906 MOVEI A,PVLNT ;SETUP CALL TO VECTOR FOR PVP
907 PUSHJ P,IVECT ;GOBBLE A VECTOR
908 HRLI C,PVBASE ;SETUP A BLT POINTER
909 HRRI C,(B) ;GET INTO ADDRESS
910 BLT C,PVLNT*2-1(B) ;COPY A PROTOTYPE INTO NEW PVP
911 MOVSI C,400000+SPVP+.VECT. ;SET SPECIAL TYPE
912 MOVEM C,PVLNT*2(B) ;CLOBBER IT IN
913 PUSH TP,A ;SAVE THE RESULTS OF VECTOR
916 PUSH TP,$TFIX ;GET A UNIFORM VECTOR
920 ADD B,[PDLBUF-2,,-1] ;FUDGE WITH BUFFER
921 MOVE C,(TP) ;REGOBBLE PROCESS POINTER
922 MOVEM B,PSTO+1(C) ;STORE IN ALL HOMES
926 POP P,A ;PREPARE TO CREATE A TEMPORARY PDL
927 PUSHJ P,IVECT ;GET THE TEMP PDL
928 ADD B,[PDLBUF,,0] ;PDL GROWTH HACK
929 MOVE C,(TP) ;RE-GOBBLE NEW PVP
930 SUB B,[1,,1] ;FIX FOR STACK
933 ;SETUP INITIAL BINDING
936 MOVEM B,SPBASE+1(C) ;SAVE AS BASE OF SP
937 MOVEM B,SPSTO+1(C) ;AND CURRENT THEREOF
938 MOVEM B,CURFCN+1(C) ; AND AS CURRENT FCN FOR SPEC/UNSPEC LOGIC
939 PUSH B,IMQUOTE THIS-PROCESS
940 PUSH B,$TPVP ;GIVE IT PROCESS AS VALUE
942 ADD B,[2,,2] ;FINISH FRAME
943 MOVEM B,TPSTO+1(C) ;MAKE THIS THE CURRENT STACK POINTER
944 MOVEM C,PVPSTO+1(C) ;SAVE THE NEW PVP ITSELF
945 AOS A,IDPROC ;GOBBLE A UNIQUE PROCESS I.D.
946 MOVEM A,PROCID+1(C) ;SAVE THAT ALSO
947 AOS A,PTIME ; GET A UNIQUE BINDING ID
950 MOVSI A,TPVP ;CLOBBER THE TYPE
951 MOVE B,(TP) ;AND POINTER TO PROCESS
955 ;MINI ROUTINE TO CALL VECTOR WITH COUNT IN A
959 MCALL 1,VECTOR ;GOBBLE THE VECTOR
963 ;SUBROUTINE TO SWAP A PROCESS IN
964 ;CALLED WITH JSP A,SWAP AND NEW PVP IN B
966 SWAP: ;FIRST STORE ALL THE ACS
969 MOVE SP,$TSP ; STORE SPSAVE
972 IRP A,,[SP,AB,TB,TP,P,M,R,FRM]
976 SETOM 1(TP) ; FENCE POST MAIN STACK
977 MOVEM TP,TPSAV(TB) ; CORRECT FRAME
978 SETZM PSAV(TB) ; CLEAN UP CURRENT FRAME
982 MOVE E,PVP ;RETURN OLD PROCESS IN E
983 MOVE PVP,D ;AND MAKE NEW ONE BE D
987 ;NOW RESTORE NEW PROCESSES AC'S
990 IRP A,,[AB,TB,SP,TP,P,M,R,FRM]
1001 ;SUBRS ASSOCIATED WITH TYPES
1003 ;TYPE (ITYPE) ARE FUNCTIONS TO RETURN THE ATOMIC NAME OF THE
1004 ;TYPE OF A GOODIE. TYPE TAKES ITS ARGS ON AP AND RETURNS IN A AND B.
1005 ;ITYPE TAKES ITS ARGS IN A AND B AND RETURNS IN SAME (B=0) FOR INVALID
1010 GETYP A,(AB) ;TYPE INTO A
1011 TYPE1: PUSHJ P,ITYPE ;GO TO INTERNAL
1012 JUMPN B,FINIS ;GOOD RETURN
1013 TYPERR: ERRUUO EQUOTE TYPE-UNDEFINED
1015 CITYPE: GETYP A,A ; GET TYPE FOR COMPILER CALL
1016 ITYPE: LSH A,1 ;TIMES 2
1017 HRLS A ;TO BOTH SIDES
1018 ADD A,TYPVEC+1 ;GET ACTUAL LOCATION
1019 JUMPGE A,TYPERR ;LOST, TYPE OUT OF BOUNDS
1020 MOVE B,1(A) ;PICKUP TYPE
1024 ; PREDICATE -- IS OBJECT OF TYPE SPECIFIED
1026 MFUNCTION %TYPEQ,SUBR,[TYPE?]
1030 MOVE D,AB ; GET ARGS
1037 PUSHJ P,ITYPQ ; GO INTERNAL
1041 ITYPQ: GETYP A,A ; OBJECT
1043 TYPEQ0: SOJL C,CIFALS
1045 CAIE 0,TATOM ; Type name must be an atom
1047 CAMN B,1(D) ; Same as the OBJECT?
1048 JRST CPOPJ1 ; Yes, return type name
1050 JRST TYPEQ0 ; No, continue comparing
1056 CTYPEQ: SOJE A,CIFALS ; TREAT NO ARGS AS FALSE
1057 MOVEI D,1(A) ; FIND BASE OF ARGS
1060 SUBM TP,D ; D POINTS TO BASE
1061 MOVE E,D ; SAVE FOR TP RESTORE
1062 ADD D,[3,,3] ; FUDGE
1063 MOVEI C,(A) ; NUMBER OF TYPES
1066 JFCL ; IGNORE SKIP FOR NOW
1067 MOVE TP,E ; SET TP BACK
1068 JUMPL B,CPOPJ1 ; SKIP
1071 ; Entries to get type codes for types for fixing up RSUBRs and assembling
1073 MFUNCTION %TYPEC,SUBR,[TYPE-C]
1082 CAMGE AB,[-3,,0] ; skip if only type name given
1086 TYPEC1: PUSHJ P,CTYPEC ; go to internal
1089 GTPTYP: CAMGE AB,[-5,,0]
1097 CTYPEC: PUSH P,C ; save primtype checker
1098 PUSHJ P,TYPFND ; search type vector
1099 JRST CTPEC2 ; create the poor loser
1103 CAMN B,IMQUOTE TEMPLATE
1119 TCHK: PUSH P,D ; SAVE TYPE
1120 MOVE A,D ; GO TO SAT
1122 CAIG A,NUMSAT ; SKIP IF A TEMPLATE
1124 POP P,D ; RESTORE TYPE
1127 CTPEC2: POP P,C ; GET BACK PRIMTYPE
1135 MCALL 2,NEWTYPE ; CREATE THE POOR GUY
1137 SUBM M,(P) ; UNRELATIVIZE
1140 CTPEC3: HRRZ 0,FSAV(TB)
1148 MFUNCTION %TYPEW,SUBR,[TYPE-W]
1162 CTYPW3: PUSHJ P,CTYPEW
1165 CTYPW1: GETYP 0,2(AB)
1168 CAMGE AB,[-5,,0] ; JUMP IF RH IS GIVEN
1170 CTYPW5: MOVE C,3(AB)
1173 CTYPW2: CAMGE AB,[-7,,0]
1182 PUSHJ P,CTYPEC ; GET CODE IN B
1188 MFUNCTION %VTYPE,SUBR,[VALID-TYPE?]
1201 CVTYPE: PUSHJ P,TYPFND ; LOOK IT UP
1212 ;PRIMTTYPE RETURNS THE TYPE ATOM OF A PRIMITIVE TYPE IN A CLASS
1214 STBL: REPEAT NUMSAT,SETZ MQUOTE INTERNAL-TYPE
1218 IRP A,,[[1WORD,WORD],[2WORD,LIST],[NWORD,UVECTOR],[2NWORD,VECTOR],[STORE,STORAGE]
1219 [ARGS,TUPLE],[FRAME,FRAME],[ATOM,ATOM],[LOCID,LOCD],[CHSTR,STRING],[OFFS,OFFSET,1]
1220 [PVP,PROCESS,1],[ASOC,ASOC,1],[LOCA,LOCA],[LOCS,LOCS],[LOCU,LOCU],[LOCV,LOCV]
1221 [LOCL,LOCL],[LOCN,LOCAS],[LOCT,LOCT,1],[LOCR,LOCR],[LOCB,LOCB,1],[BYTE,BYTES,1]]
1225 IFSE [Y],SETZ IMQUOTE X
1226 IFSN [Y],SETZ MQUOTE X
1237 MFUNCTION TYPEPRIM,SUBR
1247 CTYPEP: PUSHJ P,TYPLOO ; CONVERT ATOM TO CODE
1248 HRRZ A,(A) ; SAT TO A
1252 MFUNCTION PTSATC,SUBR,[PRIMTYPE-C]
1263 CPRTYC: PUSHJ P,TYPLOO
1270 IMFUNCTION PRIMTYPE,SUBR
1274 MOVE A,(AB) ;GET TYPE
1279 PUSHJ P,SAT ;GET SAT
1280 PTYP1: JUMPE A,TYPERR
1281 MOVE B,IMQUOTE TEMPLATE
1282 CAIG A,NUMSAT ; IF BIG SAT, THEN TEMPLATE
1288 ; RSUBR MAKES A VECTOR INTO AN OBJECT OF TYPE RSUBR, ALSO SLIGHTLY MUNGING IT
1290 IMFUNCTION RSUBR,SUBR
1294 CAIE A,TVEC ; MUST BE VECTOR
1296 MOVE B,1(AB) ; GET IT
1297 GETYP A,(B) ; CHECK 1ST ELEMENTS TYPE
1298 CAIN A,TPCODE ; PURE CODE
1302 HLRM B,(B) ; CLOBEER SPECIAL COUNT FIELD
1306 NRSUBR: ERRUUO EQUOTE FIRST-ELEMENT-OF-VECTOR-NOT-CODE
1308 ; ROUTINE TO GENERATE ENTRYY OTHER THAN FIRST TO RSUBRR
1310 IMFUNCTION MENTRY,SUBR,[RSUBR-ENTRY]
1314 GETYP 0,(AB) ; TYPE OF ARG
1315 CAIE 0,TVEC ; BETTER BE VECTOR
1320 MOVE B,1(AB) ; GET VECTOR
1323 GETYP 0,(B) ; FIRST ELEMENT
1326 MENTR2: GETYP 0,2(B)
1330 HRRM C,2(B) ; OFFSET INTO VECTOR
1335 MENTR1: CAIE 0,TATOM
1337 MOVE B,1(B) ; GET ATOM
1338 PUSHJ P,IGVAL ; GET VAL
1342 MOVE C,1(AB) ; RESTORE B
1348 BENTRY: ERRUUO EQUOTE BAD-VECTOR
1350 ; SUBR TO GET ENTRIES OFFSET
1352 MFUNCTION LENTRY,SUBR,[ENTRY-LOC]
1366 RTFALS: MOVSI A,TFALSE
1370 ;SUBROUTINE CALL FOR RSUBRs
1371 RCALL: SUBM M,(P) ;CALCULATE PC's OFFSET IN THE RSUBR
1372 HRLI 0,400000 ; DONT LOSE IN MULTI SEG MODE
1374 PUSHJ P,@0 ;GO TO THE PROPER SUBROUTINE
1375 SUBM M,(P) ;RECONSTITUTE THE RSUBR's PC
1380 ;CHTYPE TAKES TWO ARGUMENTS. ANY GOODIE AND A AN ATOMIC TYPE NAME
1381 ;IT CHECKS THE STORAGE ALLOCATION TYPES OF THE TWO ARE THE SAME AND
1382 ;IF THEY ARE CHANGES THE TYPE OF THE FIRST TO THAT NAME D IN THE SECOND
1384 MFUNCTION CHTYPE,SUBR
1387 GETYP A,2(AB) ;FIRST CHECK THAT ARG 2 IS AN ATOM
1390 MOVE B,3(AB) ;AND TYPE NAME
1391 PUSHJ P,TYPLOO ;GO LOOKUP TYPE
1392 TFOUND: HRRZ B,(A) ;GOBBLE THE SAT
1393 TRNE B,CHBIT ; SKIP IF CHTYPABLE
1395 TRNE B,TMPLBT ; TEMPLAT
1398 GETYP A,(AB) ;NOW GET TYPE TO HACK
1399 PUSHJ P,SAT ;FIND OUT ITS SAT
1400 JUMPE A,TYPERR ;COMPLAIN
1402 JRST CHTMPL ; JUMP IF TEMPLATE DATA
1403 CAIE A,(B) ;DO THEY AGREE?
1404 JRST TYPDIF ;NO, COMPLAIN
1405 CHTMP1: MOVSI A,(D) ;GET NEW TYPE
1406 HRR A,(AB) ; FOR DEFERRED GOODIES
1407 JUMPL B,CHMATC ; CHECK IT
1408 MOVE B,1(AB) ;AND VALUE
1411 CHTMPL: MOVE E,1(AB) ; GET ARG
1414 MOVE 0,3(AB) ; SEE IF TO "TEMPLATE"
1415 CAMN 0,IMQUOTE TEMPLATE
1417 TLNN E,-1 ; SKIP IF RESTED
1423 PUSH TP,1(AB) ; SAVE GOODIE
1428 PUSHJ P,IGET ; FIND THE DECL
1432 MOVE D,1(AB) ; NOW GGO TO MATCH
1448 TYPLOO: PUSHJ P,TYPFND
1449 ERRUUO EQUOTE BAD-TYPE-NAME
1452 TYPFND: HLRE A,B ; FIND DOPE WORDS
1453 SUBM B,A ; A POINTS TO IT
1454 HRRE D,(A) ; TYPE-CODE TO D
1456 ANDI D,TYPMSK ; FLUSH FUNNY BITS
1466 MOVE A,TYPVEC+1 ;GOBBLE DOWN TYPE VECTOR
1467 MOVEI D,0 ;INITIALIZE TYPE COUNTER
1468 TLOOK: CAMN B,1(A) ;CHECK THIS ONE
1470 ADDI D,1 ;BUMP COUNTER
1471 AOBJP A,.+2 ;COUTN DOWN ON VECTOR
1478 TYPDIF: ERRUUO EQUOTE STORAGE-TYPES-DIFFER
1481 TMPLVI: ERRUUO EQUOTE DECL-VIOLATION
1484 ; FUNCTION TO ADD A NEW TYPE TO THE WORLD WITH GIVEN PRIMITIVE TYPE
1486 MFUNCTION NEWTYPE,SUBR
1490 HLRZ 0,AB ; CHEC # OF ARGS
1491 CAILE 0,-4 ; AT LEAST 2
1494 JRST TMA ; NOT MORE THAN 3
1495 GETYP A,(AB) ; GET 1ST ARGS TYPE (SHOULD BE ATOM)
1496 GETYP C,2(AB) ; SAME WITH SECOND
1497 CAIN A,TATOM ; CHECK
1501 MOVE B,3(AB) ; GET PRIM TYPE NAME
1502 PUSHJ P,TYPLOO ; LOOK IT UP
1503 HRRZ A,(A) ; GOBBLE SAT
1505 HRLI A,TATOM ; MAKE NEW TYPE
1507 MOVE B,1(AB) ; SEE IF PREV EXISTED
1509 JRST NEWTOK ; DID NOT EXIST BEFORE
1510 MOVEI B,2(A) ; FOR POSSIBLE TMPLAT BIT
1511 HRRZ A,(A) ; GET SAT
1512 HRRZ 0,(P) ; AND PROPOSED
1515 CAIN 0,(A) ; SKIP IF LOSER
1518 ERRUUO EQUOTE TYPE-ALREADY-EXISTS
1521 MOVE B,1(AB) ; NEWTYPE NAME
1522 PUSHJ P,INSNT ; MUNG IN NEW TYPE
1524 NEWTFN: CAML AB,[-5,,] ; SKIP IF TEMPLAT SUPPLIED
1526 MOVEI 0,TMPLBT ; GET THE BIT
1527 IORM 0,-2(B) ; INTO WORD
1528 MOVE A,(AB) ; GET TYPE NAME
1532 PUSH TP,4(AB) ; GET TEMLAT
1536 MOVE B,1(AB) ; RETURN NAME
1539 ; SET UP GROWTH FIELDS
1541 IGROWT: SKIPA A,[111100,,(C)]
1542 IGROWB: MOVE A,[001100,,(C)]
1544 SUB C,B ; POINT TO DOPE WORD
1545 MOVE B,TYPIC ; INDICATED GROW BLOCK
1550 PUSH TP,B ; SAVE NAME OF NEWTYPE
1551 MOVE C,TYPBOT+1 ; CHECK GROWTH NEED
1553 JRST ADDIT ; STILL ROOM
1554 GAGN: PUSHJ P,IGROWB ; SETUP BOTTOM GROWTH
1556 PUSHJ P,IGROWT ; SET UP TOP GROWTH
1561 MOVE C,[11.,,5] ; SET UP INDICATOR FOR AGC
1562 PUSHJ P,AGC ; GROW THE WORLD
1563 AOJL A,GAGN ; BAD AGC LOSSAGE
1565 ADDM 0,TYPBOT+1 ; FIX UP POINTER
1567 ADDIT: MOVE C,TYPVEC+1
1568 SUB C,[2,,2] ; ALLOCATE ROOM
1570 HLRE B,C ; PREPARE TO BLT
1571 SUBM C,B ; C POINTS DOPE WORD END
1572 HRLI C,2(C) ; GET BLT AC READY
1574 POP TP,-1(B) ; CLOBBER IT IN
1576 HLRE C,TYPVEC+1 ; GET CODE
1580 MOVE D,-1(B) ; B HAS POINTER TO TYPE VECTOR DOPE WORDS
1582 CAIG 0,HIBOT ; IS ATOM PURE?
1583 JRST ADDNOI ; NO, SO NO HACKING REQUIRED
1586 PUSHJ P,IMPURIF ; DO IMPURE OF ATOM
1589 SUBM C,B ; RESTORE B
1591 MOVE D,-1(B) ; RESTORE D
1595 HRRM C,(A) ; INTO "GROWTH" FIELD
1599 ; Interface to interpreter for setting up tables associated with
1600 ; template data structures.
1601 ; A/ <
\b-name of type>
\b-
1602 ; B/ <
\b-length ins>
\b-
1603 ; C/ <
\b-uvector of garbage collector code or 0>
1604 ; D/ <
\b-uvector of GETTERs>
\b-
1605 ; E/ <
\b-uvector of PUTTERs>
\b-
1607 CTMPLT: SUBM M,(P) ; could possibly gc during this stuff
1608 PUSH TP,$TATOM ; save name of type
1610 PUSH P,B ; save length instr
1611 HLRE A,TD.LNT+1 ; check for template slots left?
1613 SUB B,A ; point to dope words
1614 HLRZ B,1(B) ; get real length
1616 JUMPG A,GOODRM ; jump if ok
1618 PUSH TP,$TUVEC ; save getters and putters
1620 PUSH TP,$TUVEC ; save getters and putters
1624 MOVEI A,10-2(B) ; grow it 10 by copying remember d.w. length
1625 PUSH P,A ; save new length
1626 PUSHJ P,CAFRE1 ; get frozen uvector
1627 ADD B,[10,,10] ; rest it down some
1628 HRL C,TD.LNT+1 ; prepare to BLT in
1629 MOVEM B,TD.LNT+1 ; and save as new length vector
1630 HRRI C,(B) ; destination
1631 ADD B,(P) ; final destination address
1633 MOVE A,(P) ; length for new getters
1635 HRL C,TD.GET+1 ; get old for copy
1637 PUSHJ P,DOBLTS ; go fixup new uvector
1638 MOVE A,(P) ; finally putters
1642 PUSHJ P,DOBLTS ; go fixup new uvector
1643 MOVE A,(P) ; finally putters
1647 PUSHJ P,DOBLTS ; go fixup new uvector
1648 SUB P,[1,,1] ; flush stack craft
1651 MOVE C,-4(TP) ;GET TD.AGC
1654 GOODRM: MOVE B,TD.LNT+1 ; move down to fit new guy
1655 SUB B,[1,,1] ; will always win due to prev checks
1660 ADDI A,-1(B) ; A/ final destination
1662 POP P,(A) ; new length ins munged in
1664 MOVNS A ; A/ offset for other guys
1666 ADD A,TD.GET+1 ; point for storing uvs of ins
1670 MOVEM E,-1(A) ; store putter also
1673 MOVEM C,-1(A) ; store putter also
1674 POP P,A ; compute primtype
1677 MOVE B,(TP) ; ready to mung type vector
1679 PUSHJ P,TYPFND ; CHECK TO SEE WHETHER TEMPLATE EXISTS
1684 NOTEM: POP P,A ; RESTORE SAT
1685 HRLI A,TATOM ; GET TYPE
1686 PUSHJ P,INSNT ; INSERT INTO VECTOR
1689 ; this routine copies GET and PUT vectors into new ones
1693 BLT C,-11(B) ; zap those guys in
1694 MOVEI A,TUVEC ; mung in uniform type
1696 MOVEI C,-7(B) ; zero out remainder of uvector
1703 ; FUNCTIONS TO SET UP EVALUATION AND APPLICATION RULES FOR DATA TYPES
1705 MFUNCTION EVALTYPE,SUBR
1709 PUSHJ P,CHKARG ; VERIFY WINNAGE IN ARGS
1710 MOVEI A,EVATYP ; POINT TO TABLE
1711 MOVEI E,EVTYPE ; POINT TO PURE VERSION
1713 TBLCAL: PUSHJ P,TBLSET ; SETUP TABLE ENTRY
1716 MFUNCTION APPLYTYPE,SUBR
1721 MOVEI A,APLTYP ; POINT TO APPLY TABLE
1722 MOVEI E,APTYPE ; PURE TABLE
1727 MFUNCTION PRINTTYPE,SUBR
1732 MOVEI A,PRNTYP ; POINT TO APPLY TABLE
1733 MOVEI E,PRTYPE ; PURE TABLE
1737 ; CHECK ARGS AND SETUP FOR TABLE HACKER
1739 CHKARG: JUMPGE AB,TFA
1742 GETYP A,(AB) ; 1ST MUST BE TYPE NAME
1745 MOVE B,1(AB) ; GET ATOM
1746 PUSHJ P,TYPLOO ; VERIFY THAT IT IS A TYPE
1747 PUSH P,D ; SAVE TYPE NO.
1748 MOVEI D,-1 ; INDICATE FUNNYNESS
1749 CAML AB,[-3,,] ; SKIP IF 2 OR MORE
1751 HRRZ A,(A) ; GET SAT
1754 GETYP A,2(AB) ; GET 2D TYPE
1755 CAIE A,TATOM ; EITHER TYPE OR APPLICABLE
1756 JRST TRYAPL ; TRY APPLICABLE
1757 MOVE B,3(AB) ; VERIFY IT IS A TYPE
1759 HRRZ A,(A) ; GET SAT
1761 POP P,C ; RESTORE SAVED SAT
1762 CAIE A,(C) ; SKIP IF A WINNER
1763 JRST TYPDIF ; REPORT ERROR
1764 TY1AR: POP P,C ; GET SAVED TYPE
1765 MOVEI B,0 ; TELL THAT WE ARE A TYPE
1768 TRYAPL: PUSHJ P,APLQ ; IS THIS APPLICABLE
1771 MOVE B,2(AB) ; RETURN SAME
1777 ; HERE TO PUT ENTRY IN APPROPRIATE TABLE
1780 PUSH TP,D ; SAVE VALUE
1783 PUSH P,C ; SAVE TYPE BEING HACKED
1785 SKIPE B,1(A) ; SKIP IF VECTOR DOESN'T EXIST YET
1787 MOVE B,-2(TP) ; CHECK FOR RETURN IT HACK
1792 HLRE A,TYPBOT+1 ; GET CURRENT TABLE LNTH
1796 PUSHJ P,IVECT ; GET VECTOR
1798 MOVE C,(TP) ; POINT TO RETURN POINT
1799 MOVEM B,1(C) ; SAVE VECTOR
1802 POP P,C ; RESTORE TYPE
1806 JUMPN A,TBLOK1 ; JUMP IF FUNCTION ETC. SUPPLIED
1809 CAILE D,NUMPRI ; SKIP IF ORIGINAL TYPE
1810 MOVNI E,(D) ; CAUSE E TO ENDUP 0
1811 ADDI E,(D) ; POINT TO PURE SLOT
1812 TBLOK1: ADDI C,(C) ; POINT TO VECTOR SLOT
1816 JUMPN A,OK.SET ; OK TO CLOBBER
1817 ADDI B,(D) ; POINT TO TARGET TYPE'S SLOT
1818 ADDI B,(D) ; POINT TO TARGET TYPE'S SLOT
1819 SKIPN A,(B) ; SKIP IF WINNER
1820 SKIPE 1(B) ; SKIP IF LOSER
1821 SKIPA D,1(B) ; SETUP D
1822 JRST CH.PTB ; CHECK PURE TABLE
1824 OK.SET: CAIN 0,(D) ; SKIP ON RESET
1828 RETAR1: MOVE A,(AB) ; RET TYPE
1838 RETPM2: SUB TP,[4,,4]
1856 RETPM3: ADD A,TYPVEC+1
1861 RETPRM: SUBI C,(B) ; UNDO BADNESS
1862 RETPM4: CAIG C,NUMPRI*2
1869 CALLTY: MOVE A,TYPVEC
1873 MFUNCTION ALLTYPES,SUBR
1883 ;FUNCTION TO RETURN TYPE OF ELEMENTS IN A UVECTOR
1885 MFUNCTION UTYPE,SUBR
1889 GETYP A,(AB) ;GET U VECTOR
1893 MOVE B,1(AB) ; GET UVECTOR
1897 CUTYPE: HLRE A,B ;GET -LENGTH
1899 SUB B,A ;POINT TO TYPE WORD
1901 JRST ITYPE ; GET NAME OF TYPE
1903 ; FUNCTION TO CHANGE UNIFORM TYPE OF A VECTOR
1905 MFUNCTION CHUTYPE,SUBR
1909 GETYP A,2(AB) ;GET 2D TYPE
1912 GETYP A,(AB) ; CALL WITH UVECTOR?
1916 MOVE A,1(AB) ; GET UV POINTER
1917 MOVE B,3(AB) ;GET ATOM
1919 MOVE A,(AB) ; RETURN UVECTOR
1923 CCHUTY: PUSH TP,$TUVEC
1925 PUSHJ P,TYPLOO ;LOOK IT UP
1932 HLRE C,(TP) ;-LENGTH
1934 SUB E,C ;POINT TO TYPE
1935 GETYP A,(E) ;GET TYPE
1936 JUMPE A,WIN0 ;ALLOW TYPE "LOSE" TO CHANGE TO ANYTHING
1937 PUSHJ P,SAT ;GET SAT
1942 HRLM D,(E) ;CLOBBER NEW ONE
1947 CANTCH: PUSH TP,$TATOM
1948 PUSH TP,EQUOTE CANT-CHTYPE-INTO
1956 PUSH TP,EQUOTE NON-ATOMIC-ARGUMENT
1964 ; SUBROUTINE TO LEAVE MUDDLE CLOSING ALL CHANNELS ON THE WAY
1971 PUSHJ P,CLOSAL ; DO THE CLOSES
1973 JRST IFALSE ; JUST IN CASE
1975 CLOSAL: MOVEI B,CHNL0+2 ; POINT TO 1ST (NOT INCLUDING TTY I/O)
1977 MOVE TVP,REALTV+1(PVP)
1983 PUSH P,[N.CHNS-1] ; MAX NO. OF CHANS
1989 SKIPN C,-1(B) ; THIS ONE OPEN?
1994 PUSH TP,-2(B) ; PUSH IT
1996 MCALL 1,FCLOSE ; CLOSE IT
1997 CLOSA4: SOSLE (P) ; COUNT DOWN
2004 CLOSA3: SKIPN B,CHNL0+1
2017 WHOAMI: 0 ; SYAYS WHETHER I AM REALLY A MUDDLE OR SOME HACK
2020 ;GARBAGE COLLECTORS PDLS
2023 GCPDL: -GCPLNT,,GCPDL
2030 MUDSTR: ASCII /MUDDLE
\7f\7f\7f/
2034 ASCIZ / IN OPERATION./
2036 ;MARKED PDLS FOR GC PROCESS
2039 ; DUMMY FRAME FOR INITIALIZER CALLS
2049 TPBAS: BLOCK ITPLNT+PDLBUF
2051 ITPLNT+2+PDLBUF+7,,0