1 TITLE EVAL -- MUDDLE EVALUATOR
\r
5 ; GERALD JAY SUSSMAN, 1971. REWRITTEN MANY TIMES SINCE C. REEVE (1972--1974)
\r
8 .GLOBAL BINDID,LPROG,GLOBSP,GLOBASE,SPBASE,TPBASE,PTIME,SWAP,CHFRAM
\r
9 .GLOBAL IGVAL,CHKARG,NXTDCL,TPOVFL,CHFRM,PROCHK,CHFSWP,VECBOT,TYPSGR
\r
10 .GLOBAL ILVAL,ER1ARG,SPECBIND,MAKACT,SPECSTORE,MAKTUP,TPALOC,IBIND,SSPECS
\r
11 .GLOBAL IDVAL,EVECTO,EUVECT,CHARGS,BCKTRK,CELL,ILOC,IGLOC,CHKDCL,SSPEC1
\r
12 .GLOBAL PDLBUF,MESS,FACTI,CHKARG,MAKENV,PSTAT,BNDV,UNBOU,UNAS,IGDECL
\r
13 .GLOBAL 1STEPR,SEGMNT,SEGLST,NAPT,EVTYPE,EVATYP,APTYPE,APLTYP,APLQ,IDVAL1
\r
14 .GLOBAL TESTR,VALG,TYPG,INCR1,TMATCH,TYPMIS,SAT,MAKACT,NTPALO,SPECBND
\r
15 .GLOBAL TPGROW,CHKAB,TYPSEG,NXTLM,MONCH0,CHFINI,RMONC0,IMPURIFY,ICONS,INCONS
\r
16 .GLOBAL CILVAL,CISET,CIGVAL,CSETG,MAPPLY,CLLOC,CGLOC,CASSQ,CGASSQ,CBOUND
\r
17 .GLOBAL IIGLOC,CHUNW,IUNWIN,UNWIN2,SPCCHK,CURFCN,TMPLNT,TD.LNT,TBINIT
\r
19 .GLOBAL AGC,GVLINC,LVLINC,CGBOUN,IEVECT,MAKTU2
\r
26 ; ENTRY TO EXPAND A MACRO
\r
28 MFUNCTION EXPAND,SUBR
\r
32 MOVEI A,PVLNT*2+1(PVP)
\r
34 MOVE B,TBINIT+1(PVP)
\r
41 ; MAIN EVAL ENTRANCE
\r
47 SKIPE C,1STEPR+1(PVP) ; BEING 1 STEPPED?
\r
48 JRST 1STEPI ; YES HANDLE
\r
49 EVALON: HLRZ A,AB ;GET NUMBER OF ARGS
\r
50 CAIE A,-2 ;EXACTLY 1?
\r
51 JRST AEVAL ;EVAL WITH AN ALIST
\r
52 SEVAL: GETYP A,(AB) ;GET TYPE OF ARG
\r
53 SKIPE C,EVATYP+1(TVP) ; USER TYPE TABLE?
\r
55 SEVAL1: CAIG A,NUMPRI ;PRIMITIVE?
\r
56 JRST @EVTYPE(A) ;YES-DISPATCH
\r
58 SELF: MOVE A,(AB) ;TYPES WHICH EVALUATE
\r
60 JRST EFINIS ;TO SELF-EG NUMBERS
\r
62 ; HERE FOR USER EVAL DISPATCH
\r
64 EVDISP: ADDI C,(A) ; POINT TO SLOT
\r
66 SKIPE (C) ; SKIP EITHER A LOSER OR JRST DISP
\r
67 JRST EVDIS1 ; APPLY EVALUATOR
\r
68 SKIPN C,1(C) ; GET ADDR OR GO TO PURE DISP
\r
76 MCALL 2,APPLY ; APPLY HACKER TO OBJECT
\r
80 ; EVAL DISPATCH TABLE
\r
82 DISTBL EVTYPE,SELF,[[TFORM,EVFORM],[TLIST,EVLIST],[TVEC,EVECT],[TUVEC,EUVEC]
\r
86 ;WATCH FOR SUBTLE BUG 43 LERR,LPROG OR BINDID
\r
88 CAIE A,-4 ;EXACTLY 2 ARGS?
\r
90 GETYP A,2(AB) ;CHECK THAT WE HAVE A FRAME
\r
95 JRST TRYPRO ; COULD BE PROCESS
\r
96 MOVEI B,2(AB) ; POINT TO FRAME
\r
97 AEVAL2: PUSHJ P,CHENV ; HACK ENVIRONMENT CHANGE
\r
98 AEVAL1: PUSH TP,(AB)
\r
101 AEVAL3: HRRZ 0,FSAV(TB)
\r
106 TRYPRO: CAIE A,TPVP ; SKIP IF IT IS A PROCESS
\r
108 MOVE C,3(AB) ; GET PROCESS
\r
109 CAMN C,PVP ; DIFFERENT FROM ME?
\r
110 JRST SEVAL ; NO, NORMAL EVAL WINS
\r
111 MOVE B,SPSTO+1(C) ; GET SP FOR PROCESS
\r
112 MOVE D,TBSTO+1(C) ; GET TOP FRAME
\r
113 HLL D,OTBSAV(D) ; TIME IT
\r
114 MOVEI C,PVLNT*2+1(C) ; CONS UP POINTER TO PROC DOPE WORD
\r
115 HRLI C,TFRAME ; LOOK LIK E A FRAME
\r
116 PUSHJ P,SWITSP ; SPLICE ENVIRONMENT
\r
119 ; ROUTINE TO CHANGE LOOK UP PATH FOR BINDINGS
\r
121 CHENV: PUSHJ P,CHFRM ; CHECK OUT FRAME
\r
122 MOVE C,(B) ; POINT TO PROCESS
\r
123 MOVE D,1(B) ; GET TB POINTER FROM FRAME
\r
124 CAMN SP,SPSAV(D) ; CHANGE?
\r
125 POPJ P, ; NO, JUST RET
\r
126 MOVE B,SPSAV(D) ; GET SP OF INTEREST
\r
127 SWITSP: MOVSI 0,TSKIP ; SET UP SKIP
\r
128 HRRI 0,1(TP) ; POINT TO UNBIND PATH
\r
130 ADD A,[BINDID,,BINDID] ; BIND THE BINDING ID
\r
134 AOS A,PTIME ; NEW ID
\r
136 MOVE E,TP ; FOR SPECBIND
\r
139 PUSH TP,C ; SAVE PROCESS
\r
141 PUSHJ P,SPECBE ; BIND BINDID
\r
142 MOVE SP,TP ; GET NEW SP
\r
143 SUB SP,[3,,3] ; SET UP SP FORK
\r
147 ; HERE TO EVALUATE A FORM (99% OF EVAL'S WORK)
\r
149 EVFORM: SKIPN C,1(AB) ; EMPTY FORM, RETURN FALSE
\r
151 GETYP A,(C) ; 1ST ELEMENT OF FORM
\r
152 CAIE A,TATOM ; ATOM?
\r
153 JRST EV0 ; NO, EVALUATE IT
\r
154 MOVE B,1(C) ; GET ATOM
\r
155 PUSHJ P,IGVAL ; GET ITS GLOBAL VALUE
\r
157 ; SPECIAL HACK TO SPEED UP LVAL AND GVAL CALLS
\r
161 JRST ATMVAL ; FAST ATOM VALUE
\r
164 CAIE 0,TUNBOU ; BOUND?
\r
165 JRST IAPPLY ; YES APPLY IT
\r
167 MOVE C,1(AB) ; LOOK FOR LOCAL
\r
172 JRST IAPPLY ; WIN, GO APPLY IT
\r
175 PUSH TP,EQUOTE UNBOUND-VARIABLE
\r
177 MOVE C,1(AB) ; FORM BACK
\r
180 PUSH TP,MQUOTE VALUE
\r
181 MCALL 3,ERROR ; REPORT THE ERROR
\r
184 EFALSE: MOVSI A,TFALSE ; SPECIAL FALSE FOR EVAL OF EMPTY FORM
\r
188 ATMVAL: HRRZ D,(C) ; CDR THE FORM
\r
189 HRRZ 0,(D) ; AND AGAIN
\r
191 GETYP 0,(D) ; MAKE SURE APPLYING TO ATOM
\r
194 MOVEI E,IGVAL ; ASSUME GLOBAAL
\r
195 CAIE B,GVAL ; SKIP IF OK
\r
196 MOVEI E,ILVAL ; ELSE USE LOCAL
\r
197 PUSH P,B ; SAVE SUBR
\r
198 MOVE B,(D)+1 ; CLR BUG #1637 (GET THE ATOM FOR THE SUBR)
\r
199 PUSHJ P,(E) ; AND GET VALUE
\r
201 JRST EFINIS ; RETURN FROM EVAL
\r
203 MOVSI A,TSUBR ; CAUSE REAL SUBR TO GET EROR
\r
206 ; HERE FOR 1ST ELEMENT NOT A FORM
\r
208 EV0: PUSHJ P,FASTEV ; EVAL IT
\r
210 ; HERE TO APPLY THINGS IN FORMS
\r
212 IAPPLY: PUSH TP,(AB) ; SAVE THE FORM
\r
215 PUSH TP,B ; SAVE THE APPLIER
\r
216 PUSH TP,$TFIX ; AND THE ARG GETTER
\r
218 PUSHJ P,APLDIS ; GO TO INTERNAL APPLIER
\r
219 JRST EFINIS ; LEAVE EVAL
\r
221 ; HERE TO EVAL 1ST ELEMENT OF A FORM
\r
223 FASTEV: SKIPE 1STEPR+1(PVP) ; BEING 1 STEPPED?
\r
224 JRST EV02 ; YES, LET LOSER SEE THIS EVAL
\r
225 GETYP A,(C) ; GET TYPE
\r
226 SKIPE D,EVATYP+1(TVP) ; USER TABLE?
\r
227 JRST EV01 ; YES, HACK IT
\r
228 EV03: CAIG A,NUMPRI ; SKIP IF SELF
\r
229 SKIPA A,EVTYPE(A) ; GET DISPATCH
\r
230 MOVEI A,SELF ; USE SLEF
\r
232 EV04: CAIE A,SELF ; IF EVAL'S TO SELF, JUST USE IT
\r
238 HLLZ A,(C) ; GET IT
\r
240 JSP E,CHKAB ; CHECK DEFERS
\r
241 POPJ P, ; AND RETURN
\r
243 EV01: ADDI D,(A) ; POINT TO SLOT OF USER EVAL TABLE
\r
245 SKIPE (D) ; EITHER NOT GIVEN OR SIMPLE
\r
247 SKIPN 1(D) ; SKIP IF SIMPLE
\r
248 JRST EV03 ; NOT GIVEN
\r
253 HLLZS (TP) ; FIX UP LH
\r
260 ; MAPF/MAPR CALL TO APPLY
\r
266 ; APPLY, FALLS INTO EVAL'S APPLY CODE AT APLDIS
\r
268 MFUNCTION APPLY,SUBR
\r
272 JUMPGE AB,TFA ; MUST BE AT LEAST 1 ARGUMENT
\r
277 PUSH TP,(AB) ; SAVE FCN
\r
279 PUSH TP,$TFIX ; AND ARG GETTER
\r
280 PUSH TP,[SETZ APLARG]
\r
284 ; STACKFROM, ALSO FALLS INTO EVAL'S APPLIER AT APLDIS
\r
286 MFUNCTION STACKFORM,FSUBR
\r
293 MOVEI A,3 ; CHECK ALL GOODIES SUPPLIED
\r
297 HRRZ B,(B) ; CDR IT
\r
300 HRRZ C,1(AB) ; GET LIST BACK
\r
301 PUSHJ P,FASTEV ; DO A FAST EVALUATION
\r
303 HRRZ C,@1(AB) ; POINT TO ARG GETTING FORMS
\r
305 PUSH TP,A ; AND FCN
\r
308 PUSH TP,[SETZ EVALRG]
\r
313 ; OFFSETS FOR TEMPORARIES ETC. USED IN APPLYING STUFF
\r
315 E.FRM==0 ; POINTS TO FORM BEING EVALED (OR ARGS FOR APPLY STACKFORM)
\r
316 E.FCN==2 ; FUNCTION/SUBR/RSUBR BEING APPLIED
\r
317 E.ARG==4 ; POINTS TO ARG GETTING ROUTINE (<0 => MUST EVAL ARGS)
\r
318 E.EXTR==6 ; CONTAINS 1ST ARG IN USER APPLY CASE
\r
319 E.SEG==10 ; POINTS TO SEGMENT IN FORM BEING HACKED
\r
320 E.CNT==12 ; COUNTER FOR TUPLES OF ARGS
\r
321 E.DECL==14 ; POINTS TO DECLARATION LIST IN FUNCTIONS
\r
322 E.ARGL==16 ; POINTS TO ARG LIST IN FUNCTIONS
\r
323 E.HEW==20 ; POINTS TO HEWITT ATOM IF IT EXISTS
\r
325 E.VAL==E.ARGL ; VALUE TYPE FOR RSUBRS
\r
327 MINTM==E.EXTR+2 ; MIN # OF TEMPS EVER ALLOCATED
\r
328 E.TSUB==E.CNT+2 ; # OF TEMPS FOR SUBR/NUMBER APPLICATION
\r
329 XP.TMP==E.HEW-E.EXTR ; # EXTRA TEMPS FOR FUNCTION APPLICATION
\r
330 R.TMP==4 ; TEMPS AFTER ARGS ARE BOUND
\r
331 TM.OFF==E.HEW+2-R.TMP ; TEMPS TO FLUSH AFTER BIND OF ARGS
\r
333 RE.FCN==0 ; AFTER BINDING CONTAINS FCN BODY
\r
334 RE.ARG==2 ; ARG LIST AFTER BINDING
\r
336 ; GENERAL THING APPLYER
\r
338 APLDIS: PUSH TP,[0] ; SLOT USED FOR USER APPLYERS
\r
340 APLDIX: GETYP A,E.FCN(TB) ; GET TYPE
\r
342 APLDI: SKIPE D,APLTYP+1(TVP) ; USER TABLE EXISTS?
\r
343 JRST APLDI1 ; YES, USE IT
\r
344 APLDI2: CAIG A,NUMPRI ; SKIP IF NOT PRIM
\r
348 APLDI1: ADDI D,(A) ; POINT TO SLOT
\r
350 SKIPE (D) ; SKIP IF NOT GIVEN OR STANDARD
\r
352 APLDI4: SKIPE D,1(D) ; GET DISP
\r
354 JRST APLDI2 ; USE SYSTEM DISPATCH
\r
356 APLDI3: SKIPE E.EXTR+1(TB) ; SKIP IF HAVEN'T BEEN HERE BEFORE
\r
358 MOVE A,(D) ; GET ITS HANDLER
\r
359 EXCH A,E.FCN(TB) ; AND USE AS FCN
\r
360 MOVEM A,E.EXTR(TB) ; SAVE
\r
363 MOVEM A,E.EXTR+1(TB) ; STASH OLD FCN AS EXTRG
\r
364 GETYP A,(D) ; GET TYPE
\r
368 ; APPLY DISPATCH TABLE
\r
370 DISTBL APTYPE,<SETZ NAPTL>,[[TSUBR,APSUBR],[TFSUBR,APFSUB],[TRSUBR,APRSUB],[TFIX,APNUM]
\r
371 [TEXPR,APEXPR],[TFUNAR,APFUNARG],[TENTER,APENTR],[TMACRO,APMACR]]
\f\r
373 ; SUBR TO SAY IF TYPE IS APPLICABLE
\r
375 MFUNCTION APPLIC,SUBR,[APPLICABLE?]
\r
384 ; HERE TO DETERMINE IF A TYPE IS APPLICABLE
\r
387 SKIPN B,APLTYP+1(TVP)
\r
388 JRST USEPUR ; USE PURE TABLE
\r
390 ADDI B,(A) ; POINT TO SLOT
\r
391 SKIPG 1(B) ; SKIP IF WINNER
\r
392 SKIPE (B) ; SKIP IF POTENIAL LOSER
\r
394 SKIPE 1(B) ; SKIP IF MUST USE PURE TABBLE
\r
396 USEPUR: CAIG A,NUMPRI ; SKIP IF NOT PRIM
\r
397 SKIPL APTYPE(A) ; SKIP IF APLLICABLE
\r
405 SKIPN E.EXTR(TB) ; IF EXTRA ARG
\r
406 SKIPGE E.ARG+1(TB) ; OR APPLY/STACKFORM, LOSE
\r
408 MOVE A,E.FCN+1(TB) ; GET FCN
\r
409 HRRZ C,@E.FRM+1(TB) ; GET ARG LIST
\r
410 SUB TP,[MINTM,,MINTM] ; FLUSH UNWANTED TEMPS
\r
412 PUSH TP,C ; ARG TO STACK
\r
413 .MCALL 1,(A) ; AND CALL
\r
414 POPJ P, ; AND LEAVE
\r
419 PUSHJ P,PSH4ZR ; SET UP ZEROED SLOTS
\r
420 SKIPN A,E.EXTR(TB) ; FUNNY ARGS
\r
421 JRST APSUB1 ; NO, GO
\r
422 MOVE B,E.EXTR+1(TB) ; YES , GET VAL
\r
423 JRST APSUB2 ; AND FALL IN
\r
425 APSUB1: PUSHJ P,@E.ARG+1(TB) ; EAT AN ARG
\r
429 AOS E.CNT+1(TB) ; COUNT IT
\r
432 APSUBD: MOVE A,E.CNT+1(TB) ; FINISHED, GET COUNT
\r
433 MOVE B,E.FCN+1(TB) ; AND SUBR
\r
437 PUSHJ P,BLTDN ; FLUSH CRUFT
\r
441 BLTDN: MOVEI C,(TB) ; POINT TO DEST
\r
442 HRLI C,E.TSUB(C) ; AND SOURCE
\r
443 BLT C,-E.TSUB(TP) ;BL..............T
\r
444 SUB TP,[E.TSUB,,E.TSUB]
\r
447 APENDN: PUSHJ P,BLTDN
\r
448 APNDN1: .ECALL A,(B)
\r
451 ; FLAGS FOR RSUBR HACKER
\r
458 ; APPLY OBJECTS OF TYPE RSUBR
\r
462 MOVE C,E.FCN+1(TB) ; GET THE RSUBR
\r
463 CAML C,[-5,,] ; IS IT LONG ENOUGH FOR DECLS
\r
464 JRST APSUBR ; NO TREAT AS A SUBR
\r
465 GETYP 0,4(C) ; GET TYPE OF 3D ELEMENT
\r
466 CAIE 0,TDECL ; DECLARATION?
\r
467 JRST APSUBR ; NO, TREAT AS SUBR
\r
468 PUSHJ P,PSH4ZR ; ALLOCATE SOME EXTRA ROOM
\r
469 PUSH TP,$TDECL ; PUSH UP THE DECLS
\r
471 PUSH TP,$TLOSE ; SAVE ROOM FOR VAL DECL
\r
474 SKIPN E.EXTR(TB) ; "EXTRA" ARG?
\r
476 MOVE 0,[SETZ EXTRGT] ; CHANGE THE ACCESS FCN
\r
478 HRRM 0,E.ARG(TB) ; REMEMBER IT
\r
480 APRSU1: MOVEI 0,0 ; INIT FLAG REGISTER
\r
483 APRSU2: HRRZ A,E.DECL+1(TB) ; GET DECL LIST
\r
484 JUMPE A,APRSU3 ; DONE!
\r
485 HRRZ B,(A) ; CDR IT
\r
486 MOVEM B,E.DECL+1(TB)
\r
487 PUSHJ P,NXTDCL ; IS NEXT THING A STRING?
\r
488 JRST APRSU4 ; NO, BETTER BE A TYPE
\r
489 CAMN B,[ASCII /VALUE/]
\r
490 JRST RSBVAL ; SAVE VAL DECL
\r
491 TRON 0,F.NFST ; IF NOT FIRST, LOSE
\r
492 CAME B,[ASCII /CALL/] ; CALL DECL
\r
494 SKIPGE E.ARG+1(TB) ; LEGAL?
\r
497 MOVE D,E.FRM+1(TB) ; GET FORM
\r
498 JRST APRS10 ; HACK IT
\r
500 APRSU5: TROE 0,F.STR ; STRING STRING?
\r
502 CAME B,[<ASCII /OPTIO/>+1] ; OPTIONA?
\r
504 TROE 0,F.OPT ; CHECK AND SET
\r
505 JRST MPD ; OPTINAL OPTIONAL LOSES
\r
506 JRST APRSU2 ; TO MAIN LOOP
\r
508 APRSU7: CAME B,[ASCII /QUOTE/]
\r
511 TROE 0,F.QUO ; TURN ON AND CHECK QUOTE
\r
512 JRST MPD ; QUOTE QUOTE LOSES
\r
513 JRST APRSU2 ; GO TO END OF LOOP
\r
516 APRSU8: CAME B,[ASCII /ARGS/]
\r
518 SKIPGE E.ARG+1(TB) ; SKIP IF LEGAL
\r
520 HRRZ D,@E.FRM+1(TB) ; GET ARG LIST
\r
523 APRS10: HRRZ A,(A) ; GET THE DECL
\r
524 MOVEM A,E.DECL+1(TB) ; CLOBBER
\r
525 HRRZ B,(A) ; CHECK FOR TOO MUCH
\r
527 MOVE B,1(A) ; GET DECL
\r
528 HLLZ A,(A) ; GOT THE DECL
\r
529 MOVEM 0,(P) ; SAVE FLAGS
\r
530 JSP E,CHKAB ; CHECK DEFER
\r
535 AOS E.CNT+1(TB) ; COUNT ARG
\r
536 JRST APRDON ; GO CALL RSUBR
\r
538 RSBVAL: HRRZ A,E.DECL+1(TB) ; GET DECL
\r
540 HRRZ B,(A) ; POINT TO DECL
\r
541 MOVEM B,E.DECL+1(TB) ; SAVE NEW DECL POINTER
\r
545 MOVEM A,E.VAL+1(TB) ; SAVE VAL DECL
\r
547 MOVEM A,E.VAL(TB) ; SET ITS TYPE
\r
551 APRSU9: CAME B,[ASCII /TUPLE/]
\r
553 MOVEM 0,(P) ; SAVE FLAGS
\r
554 HRRZ A,(A) ; CDR DECLS
\r
555 MOVEM A,E.DECL+1(TB)
\r
557 JUMPN B,MPD ; LOSER
\r
558 PUSH P,[0] ; COUNT ELEMENTS IN TUPLE
\r
560 APRTUP: PUSHJ P,@E.ARG+1(TB) ; GOBBLE ARGS
\r
565 JRST APRTUP ; AND GO
\r
567 APRTPD: POP P,C ; GET COUNT
\r
568 ADDM C,E.CNT+1(TB) ; UPDATE MAIN COUNT
\r
569 ASH C,1 ; # OF WORDS
\r
570 HRLI C,TINFO ; BUILD FENCE POST
\r
572 PUSHJ P,TBTOTP ; GEN REL OFFSET TO TOP
\r
574 HRROI D,-1(TP) ; POINT TO TOP
\r
575 SUBI D,(C) ; TO BASE
\r
577 MOVSI C,TARGS ; BUILD TYPE WORD
\r
579 MOVE A,E.DECL+1(TB)
\r
581 HLLZ A,(A) ; TYPE/VAL
\r
582 JSP E,CHKAB ; CHECK
\r
583 PUSHJ P,TMATCH ; GOTO TYPE CHECKER
\r
586 SUB TP,[2,,2] ; REMOVE FENCE POST
\r
588 APRDON: SUB P,[1,,1] ; FLUSH CRUFT
\r
589 MOVE A,E.CNT+1(TB) ; GET # OF ARGS
\r
591 GETYP 0,E.FCN(TB) ; COULD BE ENTRY
\r
592 MOVEI C,(TB) ; PREPARE TO BLT DOWN
\r
594 BLT C,-E.TSUB+2(TP)
\r
595 SUB TP,[E.TSUB+2,,E.TSUB+2]
\r
598 .ACALL A,(B) ; CALL THE RSUBR
\r
603 APRSU4: MOVEM 0,(P) ; SAVE FLAGS
\r
604 MOVE B,1(A) ; GET DECL
\r
607 MOVE 0,(P) ; RESTORE FLAGS
\r
609 PUSH TP,B ; AND SAVE
\r
610 SKIPL E.ARG+1(TB) ; ALREADY EVAL'D
\r
612 JRST APREVA ; MUST EVAL ARG
\r
614 HRRZ C,@E.FRM+1(TB) ; GET ARG?
\r
615 TRNE 0,F.OPT ; OPTIONAL
\r
617 JUMPE C,TFA ; NO, TOO FEW ARGS
\r
618 MOVEM C,E.FRM+1(TB)
\r
619 HLLZ A,(C) ; GET ARG
\r
621 JSP E,CHKAB ; CHECK THEM
\r
623 APRTYC: MOVE C,A ; SET UP FOR TMATCH
\r
626 EXCH A,-1(TP) ; SAVE STUFF
\r
627 APRS11: PUSHJ P,TMATCH ; CHECK TYPE
\r
630 MOVE 0,(P) ; RESTORE FLAGS
\r
633 JRST APRSU2 ; AND GO ON
\r
635 APREVA: PUSHJ P,@E.ARG+1(TB) ; EVAL ONE
\r
636 TDZA C,C ; C=0 ==> NONE LEFT
\r
639 JUMPN C,APRTYC ; GO CHECK TYPE
\r
640 APRDN: SUB TP,[2,,2] ; FLUSH DECL
\r
641 TRNE 0,F.OPT ; OPTIONAL?
\r
642 JRST APRDON ; ALL DONE
\r
645 APRSU3: TRNE 0,F.STR ; END IN STRING?
\b \r
647 PUSHJ P,@E.ARG+1(TB) ; SEE IF ANYMORE ARGS
\r
652 ; STANDARD ARGUMENT GETTERS USED IN APPLYING THINGS
\r
654 ARGCDR: HRRZ C,@E.FRM+1(TB) ; POINT TO ARGLIST (NOTE: POINTS 1 BEFORE WHERE ARG IS)
\r
655 JUMPE C,CPOPJ ; LEAVE IF DONE
\r
656 MOVEM C,E.FRM+1(TB)
\r
657 GETYP 0,(C) ; GET TYPE OF ARG
\r
659 JRST ARGCD1 ; SEG MENT HACK
\r
663 ARGCD1: PUSH TP,$TFORM ; PRETEND WE ARE A FORM
\r
667 MOVEM B,E.SEG+1(TB)
\r
668 PUSHJ P,TYPSEG ; GET SEG TYPE CODE
\r
669 HRRM C,E.ARG(TB) ; SAVE IT IN OBSCCURE PLACE
\r
670 MOVE C,[SETZ SGARG]
\r
671 MOVEM C,E.ARG+1(TB) ; SET NEW ARG GETTER
\r
676 HRRZ C,E.ARG(TB) ; SEG CODE TO C
\r
680 PUSHJ P,NXTLM ; GET NEXT ELEMENT
\r
682 MOVEM D,E.SEG+1(TB)
\r
683 MOVE D,DSTO(PVP) ; KEEP TYPE WINNING
\r
686 JRST CPOPJ1 ; RETURN
\r
688 SEGRG1: SETZM DSTO(PVP)
\r
690 MOVEM C,E.ARG+1(TB) ; RESET ARG GETTER
\r
693 ; ARGUMENT GETTER FOR APPLY
\r
696 SKIPL A,E.FRM+1(TB) ; ANY ARGS LEFT
\r
697 POPJ P, ; NO, EXIT IMMEDIATELY
\r
699 MOVEM A,E.FRM+1(TB)
\r
700 MOVE B,-1(A) ; RET NEXT ARG
\r
704 ; STACKFORM ARG GETTER
\r
706 EVALRG: SKIPN C,@E.FRM+1(TB) ; ANY FORM?
\r
709 GETYP A,A ; CHECK FOR FALSE
\r
712 MOVE C,E.FRM+1(TB) ; GET OTHER FORM
\r
717 ; HERE TOO APPLY NUMBERS
\r
719 APNUM: PUSHJ P,PSH4ZR ; TP SLOSTS
\r
720 SKIPN A,E.EXTR(TB) ; FUNNY ARG?
\r
722 MOVE B,E.EXTR+1(TB) ; GET ARG
\r
725 APNUM1: PUSHJ P,@E.ARG+1(TB) ; GET ARG
\r
730 PUSH TP,E.FCN+1(TB)
\r
731 PUSHJ P,@E.ARG+1(TB)
\r
734 PUSHJ P,BLTDN ; FLUSH JUNK
\r
738 ; HERE TO APPLY SUSSMAN FUNARGS
\r
742 SKIPN C,E.FCN+1(TB)
\r
744 HRRZ D,(C) ; MUST BE AT LEAST 2 LONG
\r
746 GETYP 0,(D) ; CHECK FOR LIST
\r
749 HRRZ 0,(D) ; SHOULD BE END
\r
751 GETYP 0,(C) ; 1ST MUST BE FCN
\r
756 PUSHJ P,APEXPF ; BIND THE ARGS AND AUX'S
\r
757 HRRZ C,RE.FCN+1(TB) ; GET BODY OF FUNARG
\r
758 MOVE B,1(C) ; GET FCN
\r
759 MOVEM B,RE.FCN+1(TB) ; AND SAVE
\r
760 HRRZ C,(C) ; CDR FUNARG BODY
\r
762 MOVSI 0,TLIST ; SET UP TYPE
\r
763 MOVEM 0,CSTO(PVP) ; FOR INTS TO WIN
\r
766 JUMPE C,DOF ; RUN IT
\r
768 CAIE 0,TLIST ; BETTER BE LIST
\r
772 PUSHJ P,NEXTDC ; GET POSSIBILITY
\r
773 JRST FUNERR ; LOSER
\r
776 HRRZ B,(B) ; GET TO VALUE
\r
781 HLLZ A,(B) ; GET VAL
\r
783 JSP E,CHKAB ; HACK DEFER
\r
784 PUSHJ P,PSHAB4 ; PUT VAL IN
\r
788 ; HERE TO RUN FUNARG
\r
790 DOF: SETZM CSTO(PVP) ; DONT CONFUSE GC
\r
791 PUSHJ P,SPECBIND ; BIND 'EM UP
\r
796 ; HERE TO DO MACROS
\r
798 APMACR: HRRZ E,OTBSAV(TB)
\r
799 HRRZ E,PCSAV(E) ; SEE WHERE FROM
\r
800 CAIN E,AEVAL3 ; SKIP IF NOT RIGHT
\r
802 SKIPG E.ARG+1(TB) ; SKIP IF REAL FORM EXISTS
\r
806 SUB TP,[E.EXTR+2,,E.EXTR+2] ; FLUSH JUNK
\r
809 MCALL 1,EXPAND ; EXPAND THE MACRO
\r
812 MCALL 1,EVAL ; EVAL THE RESULT
\r
815 APMAC1: MOVE C,E.FCN+1(TB) ; GET MACRO BODY
\r
819 JSP E,CHKAB ; FIX DEFERS
\r
821 MOVEM B,E.FCN+1(TB)
\r
824 ; HERE TO APPLY EXPRS (FUNCTIONS)
\r
826 APEXPR: PUSHJ P,APEXP ; BIND ARGS AND AUX'S
\r
827 RUNFUN: HRRZ A,RE.FCN(TB) ; AMOUNT OF FCN TO SKIP
\r
828 MOVEI C,RE.FCN+1(TB) ; POINT TO FCN
\r
829 HRRZ C,(C) ; SKIP SOMETHING
\r
830 SOJGE A,.-1 ; UNTIL 1ST FORM
\r
831 MOVEM C,RE.FCN+1(TB) ; AND STORE
\r
832 JRST DOPROG ; GO RUN PROGRAM
\r
834 APEXP: SKIPN C,E.FCN+1(TB) ; CHECK FRO BODY
\r
836 APEXPF: PUSH P,[0] ; COUNT INIT CRAP
\r
837 ADD TP,[XP.TMP,,XP.TMP] ; SLOTS FOR HACKING
\r
840 SETZM 1-XP.TMP(TP) ; ZERO OUT
\r
841 MOVEI A,-XP.TMP+2(TP)
\r
843 BLT A,(TP) ; ZERO SLOTS
\r
844 PUSHJ P,CARATC ; SEE IF HEWITT ATOM EXISTS
\r
845 JRST APEXP1 ; NO, GO LOOK FOR ARGLIST
\r
846 MOVEM E,E.HEW+1(TB) ; SAVE ATOM
\r
847 MOVSM 0,E.HEW(TB) ; AND TYPE
\r
848 AOS (P) ; COUNT HEWITT ATOM
\r
849 APEXP1: GETYP 0,(C) ; LOOK AT NEXT THING
\r
850 CAIE 0,TLIST ; BETTER BE LIST!!!
\r
852 MOVE B,1(C) ; GET LIST
\r
853 MOVEM B,E.ARGL+1(TB) ; SAVE
\r
854 MOVSM 0,E.ARGL(TB) ; WITH TYPE
\r
855 HRRZ C,(C) ; CDR THE FCN
\r
856 JUMPE C,NOBODY ; BODYLESS FCN
\r
857 GETYP 0,(C) ; SEE IF DCL LIST SUPPLIED
\r
859 JRST APEXP2 ; NO, START PROCESSING ARGS
\r
860 AOS (P) ; COUNT DCL
\r
862 MOVEM B,E.DECL+1(TB)
\r
864 HRRZ C,(C) ; CDR ON
\r
867 ; CHECK FOR EXISTANCE OF EXTRA ARG
\r
869 APEXP2: POP P,A ; GET COUNT
\r
870 HRRM A,E.FCN(TB) ; AND SAVE
\r
871 SKIPN E.EXTR(TB) ; SKIP IF FUNNY EXTRA ARG EXISTS
\r
873 MOVE 0,[SETZ EXTRGT]
\r
875 HRRM 0,E.ARG(TB) ; SAVE OLD GETTER AROUND
\r
879 ; LOOK FOR "BIND" DECLARATION
\r
881 APEXP3: PUSHJ P,UNPROG ; UNASSIGN LPROG IF NEC
\r
882 APXP3A: SKIPN A,E.ARGL+1(TB) ; GET ARGLIST
\r
883 JRST APEXP4 ; NONE, VERIFY NONE WERE GIVEN
\r
884 PUSHJ P,NXTDCL ; SEE IF A DECL IS THERE
\r
885 JRST BNDRG ; NO, GO BIND NORMAL ARGS
\r
886 HRRZ C,(A) ; CDR THE DCLS
\r
887 CAME B,[ASCII /BIND/]
\r
888 JRST CH.CAL ; GO LOOK FOR "CALL"
\r
889 PUSHJ P,CARTMC ; MUST BE AN ATOM
\r
890 MOVEM C,E.ARGL+1(TB) ; AND SAVE CDR'D ARGS
\r
891 PUSHJ P,MAKENV ; GENERATE AN ENVIRONMENT
\r
892 PUSHJ P,PSBND1 ; PUSH THE BINDING AND CHECK THE DCL
\r
893 JRST APXP3A ; IN CASE <"BIND" B "BIND" C......
\r
896 ; LOOK FOR "CALL" DCL
\r
898 CH.CAL: CAME B,[ASCII /CALL/]
\r
899 JRST CHOPT ; TRY SOMETHING ELSE
\r
900 SKIPG E.ARG+1(TB) ; DONT SKIP IF CANT WIN
\r
902 PUSHJ P,CARTMC ; BETTER BE AN ATOM
\r
903 MOVEM C,E.ARGL+1(TB)
\r
904 MOVE A,E.FRM(TB) ; RETURN FORM
\r
906 PUSHJ P,PSBND1 ; BIND AND CHECK
\r
909 ; BIND NORMAL ARGS BY CALLING BNDEM1, RETURNS WHEN ALL DONE
\r
911 BNDRG: PUSHJ P,BNDEM1 ; GO BIND THEM UP
\r
912 TRNN A,4 ; SKIP IF HIT A DCL
\r
913 JRST APEXP4 ; NOT A DCL, MUST BE DONE
\r
915 ; LOOK FOR "OPTIONAL" DECLARATION
\r
917 CHOPT: CAME B,[<ASCII /OPTIO/>+1]
\r
918 JRST CHREST ; TRY TUPLE/ARGS
\r
919 MOVEM C,E.ARGL+1(TB) ; SAVE RESTED ARGLIST
\r
920 PUSHJ P,BNDEM2 ; DO ALL SUPPLIED OPTIONALS
\r
921 TRNN A,4 ; SKIP IF NEW DCL READ
\r
924 ; CHECK FOR "ARGS" DCL
\r
926 CHREST: CAME B,[ASCII /ARGS/]
\r
927 JRST CHRST1 ; GO LOOK FOR "TUPLE"
\r
928 SKIPGE E.ARG+1(TB) ; SKIP IF LEGAL
\r
930 PUSHJ P,CARTMC ; GOBBLE ATOM
\r
931 MOVEM C,E.ARGL+1(TB) ; SAVE CDR'D ARG
\r
932 HRRZ B,@E.FRM+1(TB) ; GET ARG LIST
\r
933 MOVSI A,TLIST ; GET TYPE
\r
937 ; HERE TO CHECK FOR "TUPLE"
\r
939 CHRST1: CAME B,[ASCII /TUPLE/]
\r
941 PUSHJ P,CARTMC ; GOBBLE ATOM
\r
942 MOVEM C,E.ARGL+1(TB)
\r
944 PUSHJ P,PSHBND ; SET UP BINDING
\r
945 SETZM E.CNT+1(TB) ; ZERO ARG COUNTER
\r
947 TUPLP: PUSHJ P,@E.ARG+1(TB) ; GET AN ARG
\r
948 JRST TUPDON ; FINIS
\r
954 TUPDON: PUSHJ P,MAKINF ; MAKE INFO CELL
\r
955 PUSH TP,$TINFO ; FENCE POST TUPLE
\r
957 ADDI D,TM.OFF ; COMPENSATE FOR MOVEMENT
\r
959 MOVE C,E.CNT+1(TB) ; GET COUNT
\r
961 HRRM C,-1(TP) ; INTO FENCE POST
\r
962 MOVEI B,-TM.OFF-1(TP) ; SETUP ARG POINTER
\r
963 SUBI B,(C) ; POINT TO BASE OF TUPLE
\r
964 MOVNS C ; FOR AOBJN POINTER
\r
965 HRLI B,(C) ; GOOD ARGS POINTER
\r
966 MOVEM A,TM.OFF-4(B) ; STORE
\r
967 MOVEM B,TM.OFF-3(B)
\r
970 ; CHECK FOR VALID ENDING TO ARGS
\r
972 APEXP5: PUSHJ P,NEXTD ; READ NEXT THING IN ARGLIST
\r
974 TRNN A,4 ; SKIP IF DCL
\r
976 APEXP7: MOVSI A,-NWINS ; CHECK FOR A WINNER
\r
979 JUMPE A,MPD.6 ; NOT A WINNER
\r
981 ; HERE TO BLT THE WORLD DOWN ON TOP OF ALL THE USELESS TEMPS
\r
983 APEXP8: MOVE 0,E.HEW+1(TB) ; GET HEWITT ATOM
\r
984 MOVE E,E.FCN(TB) ; SAVE COUNTER
\r
985 MOVE C,E.FCN+1(TB) ; FCN
\r
986 MOVE B,E.ARGL+1(TB) ; ARG LIST
\r
987 MOVE D,E.DECL+1(TB) ; AND DCLS
\r
988 MOVEI A,R.TMP(TB) ; SET UP BLT
\r
990 BLT A,-TM.OFF(TP) ; BLLLLLLLLLLLLLT
\r
991 SUB TP,[TM.OFF,,TM.OFF] ; FLUSH CRUFT
\r
993 MOVEM C,RE.FCN+1(TB)
\r
994 MOVEM B,RE.ARGL+1(TB)
\r
1000 GETYP A,-5(TP) ; TUPLE ON TOP?
\r
1001 CAIE A,TINFO ; SKIP IF YES
\r
1003 HRRZ A,-5(TP) ; GET SIZE
\r
1006 SUB E,A ; POINT TO BINDINGS
\r
1007 SKIPE C,(TP) ; IF DCL
\r
1008 PUSHJ P,CHKDCL ; CHECK TYPE SPEC ON TUPLE
\r
1009 APEXP9: PUSHJ P,USPCBE ; DO ACTUAL BINDING
\r
1011 MOVE E,-2(TP) ; RESTORE HEWITT ATOM
\r
1012 MOVE D,(TP) ; AND DCLS
\r
1015 JRST AUXBND ; GO BIND AUX'S
\r
1017 ; HERE TO VERIFY CHECK IF ANY ARGS LEFT
\r
1019 APEXP4: PUSHJ P,@E.ARG+1(TB)
\r
1021 JRST TMA ; TOO MANY ARGS
\r
1024 PUSHJ P,@E.ARG+1(TB)
\r
1030 ; LIST OF POSSIBLE TERMINATING NAMES
\r
1033 AS.ACT: ASCII /ACT/
\r
1034 AS.NAM: ASCII /NAME/
\r
1035 AS.AUX: ASCII /AUX/
\r
1036 AS.EXT: ASCII /EXTRA/
\r
1040 ; HERE TO BIND AUX VARIABLES FOR PROGS AND FCNS
\r
1042 AUXBND: PUSH P,E ; SAVE HEWITT ATOM ( WILL PUT ON MARKED STACK
\r
1044 PUSH P,D ; SAME WITH DCL LIST
\r
1045 PUSH P,[-1] ; FLAG SAYING WE ARE FCN
\r
1046 SKIPN C,RE.ARG+1(TB) ; GET ARG LIST
\r
1048 GETYP 0,(C) ; GET TYPE
\r
1049 CAIE 0,TDEFER ; SKIP IF CHSTR
\r
1050 MOVMS (P) ; SAY WE ARE IN OPTIONALS
\r
1055 PUSH P,[0] ; WE ARE IN AUXS
\r
1057 AUXB1: HRRZ C,RE.ARG+1(TB) ; POINT TO ARGLIST
\r
1058 PUSHJ P,NEXTDC ; GET NEXT THING OFF OF ARG LIST
\r
1060 TRNE A,4 ; SKIP IF SOME KIND OF ATOM
\r
1061 JRST TRYDCL ; COUDL BE DCL
\r
1062 TRNN A,1 ; SKIP IF QUOTED
\r
1064 SKIPN (P) ; SKIP IF QUOTED OK
\r
1066 AUXB2: PUSHJ P,PSHBND ; SET UP BINDING
\r
1067 PUSH TP,$TDECL ; SAVE HEWITT ATOM
\r
1069 PUSH TP,$TATOM ; AND DECLS
\r
1072 TRNN A,2 ; SKIP IF INIT VAL EXISTS
\r
1073 JRST AUXB3 ; NO, USE UNBOUND
\r
1075 ; EVALUATE EXPRESSION
\r
1077 HRRZ C,(B) ; CDR ATOM OFF
\r
1079 ; CHECK FOR SPECIAL FORMS <TUPLE ...> <ITUPLE ...>
\r
1081 GETYP 0,(C) ; GET TYPE OF GOODIE
\r
1082 CAIE 0,TFORM ; SMELLS LIKE A FORM
\r
1084 HRRZ D,1(C) ; GET 1ST ELEMENT
\r
1085 GETYP 0,(D) ; AND ITS VAL
\r
1086 CAIE 0,TATOM ; FEELS LIKE THE RIGHT FORM
\r
1089 MOVE 0,1(D) ; GET THE ATOM
\r
1090 CAME 0,MQUOTE TUPLE
\r
1091 CAMN 0,MQUOTE ITUPLE
\r
1092 JRST DOTUPL ; SURE GLAD I DIDN'T STEP IN THAT FORM
\r
1095 AUXB13: PUSHJ P,FASTEV
\r
1097 AUXB4: MOVEM A,-7(E) ; STORE VAL IN BINDING
\r
1100 ; HERE TO CHECK AGAINST DECLARATIONS AND COMPLETE THE BINDING
\r
1102 AUXB5: SUB E,[4,,4] ; POINT TO BINDING TOP
\r
1103 SKIPE C,-2(TP) ; POINT TO DECLARATINS
\r
1104 PUSHJ P,CHKDCL ; CHECK IT
\r
1105 PUSHJ P,USPCBE ; AND BIND UP
\r
1106 SKIPE C,RE.ARG+1(TB) ; CDR DCLS
\r
1107 HRRZ C,(C) ; IF ANY TO CDR
\r
1108 MOVEM C,RE.ARG+1(TB)
\r
1109 MOVE A,(TP) ; NOW PUT HEWITT ATOM AND DCL AWAY
\r
1113 SUB TP,[4,,4] ; FLUSH SLOTS
\r
1123 ; HERE TO HANDLE "CALLS" TO TUPLE AND ITUPLE
\r
1125 DOTUPL: PUSH TP,$TLIST ; SAVE THE MAGIC FORM
\r
1127 CAME 0,MQUOTE TUPLE
\r
1128 JRST DOITUP ; DO AN ITUPLE
\r
1130 ; FALL INTO A TUPLE PUSHING LOOP
\r
1132 DOTUP1: HRRZ C,@(TP) ; CDR THE FORM
\r
1133 JUMPE C,ATUPDN ; FINISHED
\r
1134 MOVEM C,(TP) ; SAVE CDR'D RESULT
\r
1135 GETYP 0,(C) ; CHECK FOR SEGMENT
\r
1137 JRST DTPSEG ; GO PULL IT APART
\r
1138 PUSHJ P,FASTEV ; EVAL IT
\r
1139 PUSHJ P,CNTARG ; PUSH IT UP AND COUNT THEM
\r
1142 ; HERE WHEN WE FINISH
\r
1144 ATUPDN: SUB TP,[2,,2] ; FLUSH THE LIST
\r
1145 ASH E,1 ; E HAS # OF ARGS DOUBLE IT
\r
1146 MOVEI D,(TP) ; FIND BASE OF STACK AREA
\r
1148 MOVSI C,-3(D) ; PREPARE BLT POINTER
\r
1149 BLT C,C ; HEWITT ATOM AND DECL TO 0,A,B,C
\r
1151 ; NOW PREPEARE TO BLT TUPLE DOWN
\r
1153 MOVEI D,-3(D) ; NEW DEST
\r
1154 HRLI D,4(D) ; SOURCE
\r
1155 BLT D,-4(TP) ; SLURP THEM DOWN
\r
1157 HRLI E,TINFO ; SET UP FENCE POST
\r
1158 MOVEM E,-3(TP) ; AND STORE
\r
1159 PUSHJ P,TBTOTP ; GET OFFSET
\r
1160 ADDI D,3 ; FUDGE FOR NOT AT TOP OF STACK
\r
1162 MOVEM 0,-1(TP) ; RESTORE HEW ATOM AND DECLS
\r
1167 PUSHJ P,MAKINF ; MAKE 1ST WORD OF FUNNYS
\r
1169 HRRZ E,-5(TP) ; RESTORE WORDS OF TUPLE
\r
1170 HRROI B,-5(TP) ; POINT TO TOP OF TUPLE
\r
1171 SUBI B,(E) ; NOW BASE
\r
1172 TLC B,-1(E) ; FIX UP AOBJN PNTR
\r
1173 ADDI E,2 ; COPNESATE FOR FENCE PST
\r
1175 SUBM TP,E ; E POINT TO BINDING
\r
1176 JRST AUXB4 ; GO CLOBBER IT IN
\r
1179 ; HERE TO HANDLE SEGMENTS IN THESE FUNNY FORMS
\r
1181 DTPSEG: PUSH TP,$TFORM ; SAVE THE HACKER
\r
1183 MCALL 1,EVAL ; AND EVALUATE IT
\r
1184 MOVE D,B ; GET READY FOR A SEG LOOP
\r
1186 PUSHJ P,TYPSEG ; TYPE AND CHECK IT
\r
1188 DTPSG1: INTGO ; DONT BLOW YOUR STACK
\r
1189 PUSHJ P,NXTLM ; ELEMENT TO A AND B
\r
1190 JRST DTPSG2 ; DONE
\r
1191 PUSHJ P,CNTARG ; PUSH AND COUNT
\r
1194 DTPSG2: SETZM DSTO(PVP)
\r
1195 JRST DOTUP1 ; REST OF ARGS STILL TO DO
\r
1197 ; HERE TO HACK <ITUPLE .....>
\r
1199 DOITUP: HRRZ C,@(TP) ; GET COUNT FILED
\r
1202 PUSHJ P,FASTEV ; EVAL IT
\r
1209 HRRZ C,@(TP) ; GET EXP TO EVAL
\r
1210 MOVEI 0,0 ; DONT LOSE IN 1 ARG CASE
\r
1211 HRRZ 0,(C) ; VERIFY WINNAGE
\r
1212 JUMPN 0,TUPTMA ; TOO MANY
\r
1215 PUSH P,B ; SAVE COUNT
\r
1218 PUSHJ P,FASTEV ; EVAL IT ONCE
\r
1230 DOIDO1: MOVE B,-1(P) ; RESTORE COUNT
\r
1233 DOIDON: MOVEI E,(B)
\r
1236 ; FOR CASE OF NO EVALE
\r
1238 DOILOS: SUB TP,[2,,2]
\r
1246 ; ROUTINE TO PUSH NEXT TUPLE ELEMENT
\r
1248 CNTARG: AOS E,-1(TP) ; KEEP ARG COUNT UP TO DATE IN E
\r
1249 CNTRG: EXCH A,-1(TP) ; STORE ELEM AND GET SAVED
\r
1256 ; DUMMY TUPLE AND ITUPLE
\r
1258 MFUNCTION TUPLE,SUBR
\r
1262 PUSH TP,EQUOTE NOT-IN-ARG-LIST
\r
1265 MFUNCTIO ITUPLE,SUBR
\r
1269 ; PROCESS A DCL IN THE AUX VAR LISTS
\r
1271 TRYDCL: SKIPN (P) ; SKIP IF NOT IN AUX'S
\r
1273 CAME B,AS.AUX ; "AUX" ?
\r
1274 CAMN B,AS.EXT ; OR "EXTRA"
\r
1276 CAME B,[ASCII /TUPLE/]
\r
1278 PUSHJ P,MAKINF ; BUILD EMPTY TUPLE
\r
1280 PUSH TP,$TINFO ; FENCE POST
\r
1283 AUXB6: HRRZ C,(C) ; CDR PAST DCL
\r
1284 MOVEM C,RE.ARG+1(TB)
\r
1285 AUXB8: PUSHJ P,CARTMC ; GET ATOM
\r
1286 AUXB12: PUSHJ P,PSHBND ; UP GOES THE BINDING
\r
1287 PUSH TP,$TATOM ; HIDE HEWITT ATOM AND DCL
\r
1296 AUXB10: CAME B,[ASCII /ARGS/]
\r
1298 MOVEI B,0 ; NULL ARG LIST
\r
1300 JRST AUXB6 ; GO BIND
\r
1302 AUXB9: SETZM (P) ; NOW READING AUX
\r
1304 MOVEM C,RE.ARG+1(TB)
\r
1307 ; CHECK FOR NAME/ACT
\r
1309 AUXB7: CAME B,AS.NAM
\r
1312 JRST MPD.12 ; LOSER
\r
1313 HRRZ C,(C) ; CDR ON
\r
1314 HRRZ 0,(C) ; BETTER BE END
\r
1316 PUSHJ P,CARTMC ; FORCE ATOM READ
\r
1317 SETZM RE.ARG+1(TB)
\r
1318 AUXB11: PUSHJ P,MAKACT ; MAKE ACTIVATION
\r
1319 JRST AUXB12 ; AND BIND IT
\r
1322 ; DONE BIND HEWITT ATOM IF NECESARY
\r
1324 AUXDON: SKIPN E,-2(P)
\r
1329 ; FINISHED, RETURN
\r
1331 AUXD1: SUB P,[3,,3]
\r
1335 ; MAKE AN ACTIVATION OR ENVIRONMNENT
\r
1337 MAKACT: MOVEI B,(TB)
\r
1339 MAKAC1: HRRI A,PVLNT*2+1(PVP) ; POINT TO PROCESS
\r
1340 HLL B,OTBSAV(B) ; GET TIME
\r
1343 MAKENV: MOVSI A,TENV
\r
1347 ; SEVERAL USEFUL LITTLE ROUTINES FOR HACKING THIS STUFF
\r
1349 ; CARAT/CARATC/CARATM/CARTMC ALL LOOK FOR THE NEXT ATOM
\r
1351 CARAT: HRRZ C,E.ARGL+1(TB) ; PICK UP ARGLIST
\r
1352 CARATC: JUMPE C,CPOPJ ; FOUND
\r
1353 GETYP 0,(C) ; GET ITS TYPE
\r
1355 CPOPJ: POPJ P, ; RETURN, NOT ATOM
\r
1356 MOVE E,1(C) ; GET ATOM
\r
1357 HRRZ C,(C) ; CDR DCLS
\r
1360 CARATM: HRRZ C,E.ARGL+1(TB)
\r
1361 CARTMC: PUSHJ P,CARATC
\r
1362 JRST MPD.7 ; REALLY LOSE
\r
1366 ; SUBROUTINES TO PUSH BINDINGS ETC. UP ON THE STACK
\r
1368 PSBND1: PUSHJ P,PSHBND ; PUSH THEBINDING
\r
1369 JRST CHDCL ; NOW CHECK IT AGAINST DECLARATION
\r
1371 PSHBND: SKIPGE SPCCHK ; SKIP IF NORMAL SPECIAL
\r
1372 PUSH TP,BNDA1 ; ATOM IN E
\r
1373 SKIPL SPCCHK ; SKIP IF NORMAL UNSPEC OR NO CHECK
\r
1375 PUSH TP,E ; PUSH IT
\r
1382 ; ROUTINE TO PUSH 4 0'S
\r
1388 ; EXTRRA ARG GOBBLER
\r
1390 EXTRGT: HRRZ A,E.ARG(TB) ; RESET SLOT
\r
1391 CAIE A,ARGCDR ; IF NOT ARGCDR
\r
1392 TLO A,400000 ; SET FLAG
\r
1393 MOVEM A,E.ARG+1(TB)
\r
1394 MOVE A,E.EXTR(TB) ; RET ARG
\r
1395 MOVE B,E.EXTR+1(TB)
\r
1398 ; CHECK A/B FOR DEFER
\r
1401 CAIE 0,TDEFER ; SKIP IF DEFER
\r
1404 MOVE B,1(B) ; GET REAL THING
\r
1406 ; IF DECLARATIONS EXIST, DO THEM
\r
1409 CHDCLE: SKIPN C,E.DECL+1(TB)
\r
1413 ; ROUTINE TO READ NEXT THING FROM ARGLIST
\r
1415 NEXTD: HRRZ C,E.ARGL+1(TB) ; GET ARG LIST
\r
1416 NEXTDC: JUMPE C,CPOPJ
\r
1417 PUSHJ P,CARATC ; TRY FOR AN ATOM
\r
1419 MOVEI A,0 ; SET FLAG
\r
1422 NEXTD1: CAIE 0,TFORM ; FORM?
\r
1423 JRST NXT.L ; COULD BE LIST
\r
1424 PUSHJ P,CHQT ; VERIFY 'ATOM
\r
1428 NXT.L: CAIE 0,TLIST ; COULD BE (A <EXPRESS>) OR ('A <EXPRESS>)
\r
1429 JRST NXT.S ; BETTER BE A DCL
\r
1430 PUSHJ P,LNT.2 ; VERIFY LENGTH IS 2
\r
1432 CAIE 0,TATOM ; TYPE OF 1ST RET IN 0
\r
1433 JRST LST.QT ; MAY BE 'ATOM
\r
1434 MOVE E,1(B) ; GET ATOM
\r
1437 LST.QT: CAIE 0,TFORM ; FORM?
\r
1440 MOVEI C,(B) ; VERIFY 'ATOM
\r
1442 MOVEI B,(C) ; POINT BACK TO LIST
\r
1447 NXT.S: MOVEI A,(C) ; LET NXTDCL FIND OUT
\r
1449 JRST MPD.3 ; LOSER
\r
1450 MOVEI A,4 ; SET DCL READ FLAG
\r
1453 ; ROUTINE TO CHECK LENGTH OF LIST/FORM FOR BEING 2
\r
1455 LNT.2: HRRZ B,1(C) ; GET LIST/FORM
\r
1459 HRRZ B,(B) ; BETTER END HERE
\r
1461 HRRZ B,1(C) ; LIST BACK
\r
1462 GETYP 0,(B) ; TYPE OF 1ST ELEMENT
\r
1465 ; ROUTINE TO VERIFY FORM IS 'ATOM AND RET ATOM
\r
1467 CHQT: PUSHJ P,LNT.2 ; 1ST LENGTH CHECK
\r
1472 CAME 0,MQUOTE QUOTE
\r
1473 JRST MPD.5 ; BETTER BE QUOTE
\r
1475 GETYP 0,(E) ; TYPE
\r
1478 MOVE E,1(E) ; GET QUOTED ATOM
\r
1481 ; ARG BINDER FOR REGULAR ARGS AND OPTIONALS
\r
1483 BNDEM1: PUSH P,[0] ; REGULAR FLAG
\r
1485 BNDEM2: PUSH P,[1]
\r
1486 BNDEM: PUSHJ P,NEXTD ; GET NEXT THING
\r
1487 JRST CCPOPJ ; END OF THINGS
\r
1488 TRNE A,4 ; CHECK FOR DCL
\r
1490 TRNE A,2 ; SKIP IF NOT (ATM ..) OR ('ATM ...)
\r
1491 SKIPE (P) ; SKIP IF REG ARGS
\r
1492 JRST .+2 ; WINNER, GO ON
\r
1493 JRST MPD.6 ; LOSER
\r
1495 PUSH TP,BNDA1 ; SAVE ATOM
\r
1499 SKIPL E.ARG+1(TB) ; SKIP IF MUST EVAL ARG
\r
1500 TRNN A,1 ; SKIP IF ARG QUOTED
\r
1502 HRRZ D,@E.FRM+1(TB) ; GET AND CDR ARG
\r
1503 JUMPE D,TFACHK ; OH OH MAYBE TOO FEW ARGS
\r
1504 MOVEM D,E.FRM+1(TB) ; STORE WINNER
\r
1505 HLLZ A,(D) ; GET ARG
\r
1507 JSP E,CHKAB ; HACK DEFER
\r
1508 JRST BNDEM3 ; AND GO ON
\r
1510 RGLARG: PUSH P,A ; SAVE FLAGS
\r
1511 PUSHJ P,@E.ARG+1(TB)
\r
1512 JRST TFACH1 ; MAY GE TOO FEW
\r
1514 BNDEM3: HRRZ C,@E.ARGL+1(TB) ; CDR THHE ARGS
\r
1515 MOVEM C,E.ARGL+1(TB)
\r
1516 PUSHJ P,PSHAB4 ; PUSH VALUE AND SLOTS
\r
1517 PUSHJ P,CHDCL ; CHECK DCLS
\r
1518 JRST BNDEM ; AND BIND ON!
\r
1520 ; HERE WHEN ARGS RUN OUT, IF NOT OPTIONAL, GIVE TFA
\r
1523 TFACHK: SUB TP,[2,,2] ; FLUSH ATOM
\r
1524 SKIPN (P) ; SKIP IF OPTIONALS
\r
1526 CCPOPJ: SUB P,[1,,1]
\r
1529 BNDEM4: HRRZ C,@E.ARGL+1(TB) ; POINT TO REST OF ARGL
\r
1533 ; EVALUATE LISTS, VECTORS, UNIFROM VECTORS
\r
1535 EVLIST: PUSH P,[-1] ;-1 -- THIS IS A LIST
\r
1536 JRST EVL1 ;GO TO HACKER
\r
1538 EVECT: PUSH P,[0] ;0 -- THIS IS A GENERAL VECTOR
\r
1541 EUVEC: PUSH P,[1] ;1 -- THIS IS A UNIFORM VECTOR
\r
1543 EVL1: PUSH P,[0] ;PUSH A COUNTER
\r
1544 GETYPF A,(AB) ;GET FULL TYPE
\r
1546 PUSH TP,1(AB) ;AND VALUE
\r
1548 EVL2: INTGO ;CHECK INTERRUPTS
\r
1549 SKIPN A,1(TB) ;ANYMORE
\r
1550 JRST EVL3 ;NO, QUIT
\r
1551 SKIPL -1(P) ;SKIP IF LIST
\r
1552 JUMPG A,EVL3 ;JUMP IF VECTOR EMPTY
\r
1553 GETYPF B,(A) ;GET FULL TYPE
\r
1554 SKIPGE C,-1(P) ;SKIP IF NOT LIST
\r
1555 HLLZS B ;CLOBBER CDR FIELD
\r
1556 JUMPG C,EVL7 ;HACK UNIFORM VECS
\r
1557 EVL8: PUSH P,B ;SAVE TYPE WORD ON P
\r
1558 CAMN B,$TSEG ;SEGMENT?
\r
1559 MOVSI B,TFORM ;FAKE OUT EVAL
\r
1560 PUSH TP,B ;PUSH TYPE
\r
1561 PUSH TP,1(A) ;AND VALUE
\r
1562 JSP E,CHKARG ; CHECK DEFER
\r
1563 MCALL 1,EVAL ;AND EVAL IT
\r
1564 POP P,C ;AND RESTORE REAL TYPE
\r
1565 CAMN C,$TSEG ;SEGMENT?
\r
1566 JRST DOSEG ;YES, HACK IT
\r
1567 AOS (P) ;COUNT ELEMENT
\r
1568 PUSH TP,A ;AND PUSH IT
\r
1570 EVL6: SKIPGE A,-1(P) ;DONT SKIP IF LIST
\r
1571 HRRZ B,@1(TB) ;CDR IT
\r
1572 JUMPL A,ASTOTB ;AND STORE IT
\r
1573 MOVE B,1(TB) ;GET VECTOR POINTER
\r
1574 ADD B,AMNT(A) ;INCR BY APPROPRIATE AMOUNT
\r
1575 ASTOTB: MOVEM B,1(TB) ;AND STORE BACK
\r
1576 JRST EVL2 ;AND LOOP BACK
\r
1578 AMNT: 2,,2 ;INCR FOR GENERAL VECTOR
\r
1579 1,,1 ;SAME FOR UNIFORM VECTOR
\r
1581 CHKARG: GETYP A,-1(TP)
\r
1584 HRRZS (TP) ;MAKE SURE INDIRECT WINS
\r
1586 MOVEM A,-1(TP) ;CLOBBER IN TYPE SLOT
\r
1587 MOVE A,(TP) ;NOW GET POINTER
\r
1588 MOVE A,1(A) ;GET VALUE
\r
1589 MOVEM A,(TP) ;CLOBBER IN
\r
1594 EVL7: HLRE C,A ; FIND TYPE OF UVECTOR
\r
1595 SUBM A,C ;C POINTS TO DOPE WORD
\r
1596 GETYP B,(C) ;GET TYPE
\r
1597 MOVSI B,(B) ;TO LH NOW
\r
1598 SOJA A,EVL8 ;AND RETURN TO DO EVAL
\r
1600 EVL3: SKIPL -1(P) ;SKIP IF LIST
\r
1601 JRST EVL4 ;EITHER VECTOR OR UVECTOR
\r
1603 MOVEI B,0 ;GET A NIL
\r
1604 EVL9: MOVSI A,TLIST ;MAKE TYPE WIN
\r
1605 EVL5: SOSGE (P) ;COUNT DOWN
\r
1606 JRST EVL10 ;DONE, RETURN
\r
1607 PUSH TP,$TLIST ;SET TO CALL CONS
\r
1610 JRST EVL5 ;LOOP TIL DONE
\r
1613 EVL4: MOVEI B,EUVECT ;UNIFORM CASE
\r
1614 SKIPG -1(P) ;SKIP IF UNIFORM CASE
\r
1615 MOVEI B,EVECTO ;NO, GENERAL CASE
\r
1616 POP P,A ;GET COUNT
\r
1617 .ACALL A,(B) ;CALL CREATOR
\r
1618 EVL10: GETYPF A,(AB) ; USE SENT TYPE
\r
1622 ; PROCESS SEGMENTS FOR THESE HACKS
\r
1624 DOSEG: PUSHJ P,TYPSEG ; FIND WHAT IS BEING SEGMENTED
\r
1625 JUMPE C,LSTSEG ; CHECK END SPLICE IF LIST
\r
1627 SEG3: PUSHJ P,NXTELM ; GET THE NEXTE ELEMT
\r
1628 JRST SEG4 ; RETURN TO CALLER
\r
1630 JRST SEG3 ; TRY AGAIN
\r
1631 SEG4: SETZM DSTO(PVP)
\r
1634 TYPSEG: PUSHJ P,TYPSGR
\r
1638 TYPSGR: MOVEM A,DSTO(PVP) ;WILL BECOME INTERRUPTABLE WITH GOODIE IN D
\r
1639 GETYP A,A ; TYPE TO RH
\r
1640 PUSHJ P,SAT ;GET STORAGE TYPE
\r
1641 MOVE D,B ; GOODIE TO D
\r
1643 MOVNI C,1 ; C <0 IF ILLEGAL
\r
1644 CAIN A,S2WORD ;LIST?
\r
1646 CAIN A,S2NWORD ;GENERAL VECTOR?
\r
1648 CAIN A,SNWORD ;UNIFORM VECTOR?
\r
1652 CAIN A,SSTORE ;SPECIAL AFREE STORAGE ?
\r
1653 MOVEI C,2 ;TREAT LIKE A UVECTOR
\r
1654 CAIN A,SARGS ;ARGS TUPLE?
\r
1655 JRST SEGARG ;NO, ERROR
\r
1656 CAILE A,NUMSAT ; SKIP IF NOT TEMPLATE
\r
1659 SETZM DSTO(PVP) ; DON'T CONFUSE AGC LATER!
\r
1663 HRRM A,DSTO(PVP) ; SAVE FOR HACKERS
\r
1666 SEGARG: PUSH TP,DSTO(PVP) ;PREPARE TO CHECK ARGS
\r
1668 SETZM DSTO(PVP) ;TYPE NOT SPECIAL
\r
1669 MOVEI B,-1(TP) ;POINT TO SAVED COPY
\r
1670 PUSHJ P,CHARGS ;CHECK ARG POINTER
\r
1671 POP TP,D ;AND RESTORE WINNER
\r
1672 POP TP,DSTO(PVP) ;AND TYPE AND FALL INTO VECTOR CODE
\r
1676 LSTSEG: SKIPL -1(P) ;SKIP IF IN A LIST
\r
1677 JRST SEG3 ;ELSE JOIN COMMON CODE
\r
1678 HRRZ A,@1(TB) ;CHECK FOR END OF LIST
\r
1679 JUMPN A,SEG3 ;NO, JOIN COMMON CODE
\r
1680 SETZM DSTO(PVP) ;CLOBBER SAVED GOODIES
\r
1681 JRST EVL9 ;AND FINISH UP
\r
1684 PUSHJ P,NXTLM ; GOODIE TO A AND B
\r
1689 NXTLM: XCT TESTR(C) ; SKIP IF MORE IN SEGEMNT
\r
1691 XCT TYPG(C) ; GET THE TYPE
\r
1692 XCT VALG(C) ; AND VALUE
\r
1693 JSP E,CHKAB ; CHECK DEFERRED
\r
1694 XCT INCR1(C) ; AND INCREMENT TO NEXT
\r
1695 CPOPJ1: AOS (P) ; SKIP RETURN
\r
1698 ; TABLES FOR SEGMENT OPERATIONS (0->LIST, 1->VECTOR/ARGS, 2->UVEC, 3->STRING)
\r
1706 TYPG: PUSHJ P,LISTYP
\r
1724 TM1: HRRZ A,DSTO(PVP) ; GET SAT
\r
1726 ADD A,TD.LNT+1(TVP)
\r
1729 HLRZ 0,C ; GET AMNT RESTED
\r
1737 TM2: HRRZ 0,DSTO(PVP)
\r
1742 MOVEI C,0 ; GET "1ST ELEMENT"
\r
1743 PUSHJ P,TMPLNT ; GET NTH IN A AND B
\r
1750 CHRDON: HRRZ B,DSTO(PVP) ; POIT TO DOPE WORD
\r
1755 LISTYP: GETYP A,(D)
\r
1762 1CHINC: SOS DSTO(PVP)
\r
1773 ;COMPILER's CALL TO DOSEG
\r
1774 SEGMNT: PUSHJ P,TYPSEG
\r
1776 SEGLOP: PUSHJ P,NXTELM
\r
1778 AOS (P)-2 ; INCREMENT COMPILER'S COUNT
\r
1781 SEGRET: SETZM DSTO(PVP)
\r
1784 SEGLST: PUSHJ P,TYPSEG
\r
1786 SEGLS3: SETZM DSTO(PVP)
\r
1788 SEGLS1: SOSGE -2(P) ; START COUNT DOWN
\r
1796 SEGLS2: PUSHJ P,NXTELM
\r
1805 ;SPECBIND BINDS IDENTIFIERS. IT IS CALLED BY PUSHJ P,SPECBIND.
\r
1806 ;SPECBIND IS PROVIDED WITH A CONTIGUOUS SET OF TRIPLETS ON TP.
\r
1807 ;EACH TRIPLET IS AS FOLLOWS:
\r
1808 ;THE FIRST ELEMENT IS THE IDENTIFIER TO BE BOUND, ITS TYPE WORD IS [TATOM,,-1],
\r
1809 ;THE SECOND IS THE VALUE TO WHICH IT IS TO BE ASSIGNED,
\r
1810 ;AND THE THIRD IS A PAIR OF ZEROES.
\r
1818 USPCBE: PUSH P,$TUBIND
\r
1822 MOVE E,TP ;GET THE POINTER TO TOP
\r
1823 SPECBE: PUSH P,$TBIND
\r
1824 ADD E,[1,,1] ;BUMP POINTER ONCE
\r
1825 SETZB 0,D ;CLEAR TEMPS
\r
1827 MOVEI 0,(TB) ; FOR CHECKS
\r
1829 BINDLP: MOVE A,-4(E) ; CHECK FOR VEC BIND
\r
1832 MOVE A,-6(E) ;GET TYPE
\r
1833 CAME A,BNDA1 ; FOR UNSPECIAL
\r
1834 CAMN A,BNDA ;NORMAL ID BIND?
\r
1835 CAILE 0,-6(E) ; MAKE SURE NOT GOING UNDER FRAME
\r
1837 SUB E,[6,,6] ;MOVE PTR
\r
1839 HRRM E,(D) ;YES -- LOBBER
\r
1840 SKIPN (P) ;UPDATED?
\r
1841 MOVEM E,(P) ;NO -- DO IT
\r
1843 MOVE A,0(E) ;GET ATOM PTR
\r
1845 PUSHJ P,ILOC ;GET LAST BINDING
\r
1846 MOVS A,OTBSAV (TB) ;GET TIME
\r
1847 HRL A,5(E) ; GET DECL POINTER
\r
1848 MOVEM A,4(E) ;CLOBBER IT AWAY
\r
1849 MOVE A,(E) ; SEE IF SPEC/UNSPEC
\r
1850 TRNN A,1 ; SKIP, ALWAYS SPEC
\r
1851 SKIPA A,-1(P) ; USE SUPPLIED
\r
1853 MOVEM A,(E) ;IDENTIFY AS BIND BLOCK
\r
1854 HRRZ C,SPBASE(PVP) ; CHECK FOR CROSS OF PROC
\r
1856 CAIL A,(B) ; LOSER
\r
1857 CAILE C,(B) ; SKIP IFF WINNER
\r
1859 MOVEM B,5(E) ;IN RESTORE CELLS
\r
1861 MOVE C,1(E) ;GET ATOM PTR
\r
1863 MOVEI B,0 ; FOR SPCUNP
\r
1864 CAIL A,HIBOT ; SKIP IF IMPURE ATOM
\r
1866 HRRZ A,BINDID+1(PVP) ;GET PROCESS NUMBER
\r
1867 HRLI A,TLOCI ;MAKE LOC PTR
\r
1868 MOVE B,E ;TO NEW VALUE
\r
1870 MOVEM A,(C) ;CLOBBER ITS VALUE
\r
1871 MOVEM B,1(C) ;CELL
\r
1872 MOVE D,E ;REMEMBER LINK
\r
1873 JRST BINDLP ;DO NEXT
\r
1875 NONID: CAILE 0,-4(E)
\r
1883 MOVE D,1(E) ;GET PTR TO VECTOR
\r
1884 MOVE C,(D) ;EXCHANGE TYPES
\r
1888 MOVE C,1(D) ;EXCHANGE DATUMS
\r
1893 HRLM A,(E) ;IDENTIFY BIND BLOCK
\r
1894 MOVE D,E ;REMEMBER LINK
\r
1905 ; HERE TO IMPURIFY THE ATOM
\r
1907 SPCUNP: PUSH TP,$TSP
\r
1910 PUSH TP,-1(P) ; LINK BACK IS AN SP
\r
1915 MOVE 0,-2(TP) ; RESTORE LINK BACK POINTER
\r
1924 ; ENTRY FROM COMPILER TO SET UP A BINDING
\r
1926 IBIND: SUBI E,-5(SP) ; CHANGE TO PDL POINTER
\r
1937 JRST SPECB1 ; NOW BIND IT
\r
1939 ; "FAST CALL TO SPECBIND"
\r
1943 ; Compiler's call to SPECBIND all atom bindings, no TBVLs etc.
\r
1946 MOVE E,TP ; POINT TO BINDING WITH E
\r
1947 SPECB1: PUSH P,[0] ; SLOTS OF INTEREST
\r
1951 SPECB2: MOVEI 0,(TB) ; FOR FRAME CHECK
\r
1952 MOVE A,-5(E) ; LOOK AT FIRST THING
\r
1953 CAMN A,BNDA ; SKIP IF LOSER
\r
1954 CAILE 0,-5(E) ; SKIP IF REAL WINNER
\r
1957 SUB E,[5,,5] ; POINT TO BINDING
\r
1958 SKIPE A,(P) ; LINK?
\r
1959 HRRM E,(A) ; YES DO IT
\r
1960 SKIPN -1(P) ; FIRST ONE?
\r
1961 MOVEM E,-1(P) ; THIS IS IT
\r
1963 MOVE A,1(E) ; POINT TO ATOM
\r
1964 MOVE 0,BINDID+1(PVP) ; QUICK CHECK
\r
1966 CAMN 0,(A) ; WINNERE?
\r
1967 JRST SPECB4 ; YES, GO ON
\r
1969 PUSH P,B ; SAVE REST OF ACS
\r
1972 MOVE B,A ; FOR ILOC TO WORK
\r
1973 PUSHJ P,ILOC ; GO LOOK IT UP
\r
1974 HRRZ C,SPBASE+1(PVP)
\r
1976 CAIL A,(B) ; SKIP IF LOSER
\r
1977 CAILE C,(B) ; SKIP IF WINNER
\r
1978 MOVEI B,0 ; SAY NO BACK POINTER
\r
1979 MOVE C,1(E) ; POINT TO ATOM
\r
1980 MOVEI A,(C) ; PURE ATOM?
\r
1981 CAIGE A,HIBOT ; SKIP IF OK
\r
1983 PUSH P,-4(P) ; MAKE HAPPINESS
\r
1984 PUSHJ P,SPCUNP ; IMPURIFY
\r
1986 MOVE A,BINDID+1(PVP)
\r
1988 MOVEM A,(C) ; STOR POINTER INDICATOR
\r
1995 SPECB4: MOVE A,1(A) ; GET LOCATIVE
\r
1996 SPECB5: EXCH A,5(E) ; CLOBBER INTO REBIND SLOT (GET DECL)
\r
1997 HLL A,OTBSAV(TB) ; TIME IT
\r
1998 MOVSM A,4(E) ; SAVE DECL AND TIME
\r
2000 HRLM A,(E) ; CHANGE TO A BINDING
\r
2001 MOVE A,1(E) ; POINT TO ATOM
\r
2002 MOVEM E,(P) ; REMEMBER THIS GUY
\r
2003 ADD E,[2,,2] ; POINT TO VAL CELL
\r
2004 MOVEM E,1(A) ; INTO ATOM SLOT
\r
2005 SUB E,[3,,3] ; POINT TO NEXT ONE
\r
2008 SPECB3: SKIPE A,(P)
\r
2009 HRRM SP,(A) ; LINK OLD STUFF
\r
2010 SKIPE A,-1(P) ; NEW SP?
\r
2013 INTGO ; IN CASE BLEW STACK
\r
2018 ;SPECSTORE RESTORES THE BINDINGS SP TO THE ENVIRONMENT POINTER IN
\r
2019 ;SPSAV (TB). IT IS CALLED BY PUSHJ P,SPECSTORE.
\r
2023 HRRZ E,SPSAV (TB) ;GET TARGET POINTER
\r
2026 MOVE SP,SPSAV(TB) ; GET NEW SP
\r
2032 STLOO1: CAIL E,(SP) ;ARE WE DONE?
\r
2034 HLRZ C,(SP) ;GET TYPE OF BIND
\r
2037 CAIE C,TBIND ;NORMAL IDENTIFIER?
\r
2038 JRST ISTORE ;NO -- SPECIAL HACK
\r
2041 MOVE C,1(SP) ;GET TOP ATOM
\r
2042 MOVSI 0,TLOCI ; MAYBE LOCI OR UNBOUND
\r
2046 HRR 0,BINDID+1(PVP) ;STORE SIGNATURE
\r
2047 MOVEM 0,(C) ;CLOBBER INTO ATOM
\r
2050 SPLP: HRRZ SP,(SP) ;FOLOW LINK
\r
2051 JUMPN SP,STLOO1 ;IF MORE
\r
2052 SKIPE E ; OK IF E=0
\r
2058 ISTORE: CAIE C,TBVL
\r
2067 CHSKIP: CAIN C,TSKIP
\r
2069 CAIE C,TUNWIN ; UNWIND HACK
\r
2071 HRRZ C,-2(P) ; WHERE FROM?
\r
2073 JRST SPLP ; IGNORE
\r
2074 MOVEI E,(TP) ; FIXUP SP
\r
2084 ; ENTRY FOR FUNNY COMPILER UNBIND (1)
\r
2089 SSPEC2: SUBI E,(SP) ; MAKE SP BE AOBJN
\r
2096 ; ENTRY FOR FUNNY COMPILER UNBIND (2)
\r
2099 SUBI E,1 ; MAKE SURE GET CURRENT BINDING
\r
2100 PUSHJ P,STLOOP ; UNBIND
\r
2101 MOVEI E,(TP) ; NOW RESET SP
\r
2103 \fEFINIS: SKIPN C,1STEPR+1(PVP) ; SKIP NIF BEING ONE PROCEEDED
\r
2106 PUSH TP,MQUOTE EVLOUT
\r
2107 PUSH TP,A ;SAVE EVAL RESULTS
\r
2109 PUSH TP,[TINFO,,2] ; FENCE POST
\r
2112 PUSHJ P,MAKINF ; MAKE ARG BLOCK INFO
\r
2115 HRLI B,-4 ; AOBJN TO ARGS BLOCK
\r
2117 PUSH TP,1STEPR(PVP)
\r
2118 PUSH TP,1STEPR+1(PVP) ; PROCESS DOING THE 1STEPPING
\r
2120 MOVE A,-3(TP) ; GET BACK EVAL VALUE
\r
2124 1STEPI: PUSH TP,$TATOM
\r
2125 PUSH TP,MQUOTE EVLIN
\r
2126 PUSH TP,$TAB ; PUSH EVALS ARGGS
\r
2128 PUSHJ P,MAKINF ; TURN INTO ARGS BLOCK
\r
2129 MOVEM A,-1(TP) ; AND CLOBBER
\r
2130 PUSH TP,[TINFO,,2] ; FENCE POST 2D TUPLE
\r
2133 PUSHJ P,MAKINF ; TURN IT INTO ARGS BLOCK
\r
2135 MOVEI B,-6(TP) ; SETUP TUPLE
\r
2138 PUSH TP,1STEPR(PVP)
\r
2139 PUSH TP,1STEPR+1(PVP)
\r
2140 MCALL 2,RESUME ; START UP 1STEPERR
\r
2141 SUB TP,[6,,6] ; REMOVE CRUD
\r
2142 GETYP A,A ; GET 1STEPPERS TYPE
\r
2143 CAIE A,TDISMI ; IF DISMISS, STOP 1 STEPPING
\r
2146 ; HERE TO PUSH DOWN THE 1 STEP STATE AND RUN
\r
2149 ADD D,[1STEPR,,1STEPR] ; POINT TO 1 STEP SLOT
\r
2150 PUSH TP,$TSP ; SAVE CURRENT SP
\r
2153 PUSH TP,D ; BIND IT
\r
2155 PUSH TP,[0] ; NO 1 STEPPER UNTIL POPJ
\r
2158 ; NOW PUSH THE ARGS UP TO RE-CALL EVAL
\r
2161 EFARGL: JUMPGE AB,EFCALL
\r
2167 EFCALL: ACALL A,EVAL ; NOW DO THE EVAL
\r
2168 MOVE C,(TP) ; PRE-UNBIND
\r
2169 MOVEM C,1STEPR+1(PVP)
\r
2170 MOVE SP,-4(TP) ; AVOID THE UNBIND
\r
2171 SUB TP,[6,,6] ; AND FLUSH LOSERS
\r
2172 JRST EFINIS ; AND TRY TO FINISH UP
\r
2174 MAKINF: HLRZ A,OTBSAV(TB) ; TIME IT
\r
2179 TBTOTP: MOVEI D,(TB) ; COMPUTE REL DIST FROM TP TO TB
\r
2182 ; ARRIVE HERE TO COMPLETE A COMPILER GENERATED TUPLE
\r
2183 ; D/ LENGTH OF THE TUPLE IN WORDS
\r
2185 MAKTU2: MOVE D,-1(P) ; GET LENGTH
\r
2186 MAKTUP: HRLI D,TINFO ; FIRST WORD OF FENCE POST
\r
2188 HRROI B,(TP) ; TOP OF TUPLE
\r
2190 TLC B,-1(D) ; AOBJN IT
\r
2193 HLRZ A,OTBSAV(TB) ; TIME IT
\r
2197 ; HERE TO ALLOCATE SLOTS FOR COMPILER (AMNT IN A)
\r
2199 TPALOC: HRLI A,(A)
\r
2202 PUSHJ P,TPOVFL ; IN CASE IT LOST
\r
2203 INTGO ; TAKE THE GC IF NEC
\r
2213 NTPALO: PUSH TP,[0]
\r
2217 \f;EVALUATES A IDENTIFIER -- GETS LOCAL VALUE IF THERE IS ONE, OTHERWISE GLOBAL.
\r
2219 MFUNCTION VALUE,SUBR
\r
2224 IDVAL: PUSHJ P,IDVAL1
\r
2230 PUSH TP,B ;SAVE ARG IN CASE NEED TO CHECK GLOBAL VALUE
\r
2231 PUSHJ P,ILVAL ;LOCAL VALUE FINDER
\r
2232 CAME A,$TUNBOUND ;IF NOT UNBOUND OR UNASSIGNED
\r
2233 JRST RIDVAL ;DONE - CLEAN UP AND RETURN
\r
2234 POP TP,B ;GET ARG BACK
\r
2237 RIDVAL: SUB TP,[2,,2]
\r
2240 ;GETS THE LOCAL VALUE OF AN IDENTIFIER
\r
2242 MFUNCTION LVAL,SUBR
\r
2250 ; MAKE AN ATOM UNASSIGNED
\r
2252 MFUNCTION UNASSIGN,SUBR
\r
2253 JSP E,CHKAT ; GET ATOM ARG
\r
2255 UNASIT: CAMN A,$TUNBOU ; IF UNBOUND
\r
2259 SETOM 1(B) ; MAKE SURE
\r
2260 RETATM: MOVE B,1(AB)
\r
2264 ; UNASSIGN GLOBALLY
\r
2266 MFUNCTION GUNASSIGN,SUBR
\r
2271 MOVE B,1(AB) ; ATOM BACK
\r
2273 CAIL 0,HIBOT ; SKIP IF IMPURE
\r
2274 PUSHJ P,IMPURIFY ; YES, MAKE IT IMPURE
\r
2275 PUSHJ P,IGLOC ; RESTORE LOCATIVE
\r
2276 HRRZ 0,-2(B) ; SEE IF MANIFEST
\r
2277 GETYP A,(B) ; AND CURRENT TYPE
\r
2286 ; GETS A LOCATIVE TO THE LOCAL VALUE OF AN IDENTIFIER.
\r
2288 MFUNCTION LLOC,SUBR
\r
2297 ;TESTS TO SEE IF AN IDENTIFIER IS LOCALLY BOUND
\r
2299 MFUNCTION BOUND,SUBR,[BOUND?]
\r
2306 ;TESTS TO SEE IF AN IDENTIFIER IS LOCALLY ASSIGNED
\r
2308 MFUNCTION ASSIGP,SUBR,[ASSIGNED?]
\r
2316 ;GETS THE GLOBAL VALUE OF AN IDENTIFIER
\r
2318 MFUNCTION GVAL,SUBR
\r
2325 ;GETS A LOCATIVE TO THE GLOBAL VALUE OF AN IDENTIFIER
\r
2327 MFUNCTION GLOC,SUBR
\r
2343 MOVE C,1(AB) ; GE ATOM
\r
2345 CAIGE 0,HIBOT ; SKIP IF PURE ATOM
\r
2348 ; MAKE ATOM AND VALUE IMPURE IF GETTING GLOC TO IT
\r
2350 MOVE B,C ; ATOM TO B
\r
2352 JRST GLOC ; AND TRY AGAIN
\r
2354 ;TESTS TO SEE IF AN IDENTIFIER IS GLOBALLY ASSIGNED
\r
2356 MFUNCTION GASSIG,SUBR,[GASSIGNED?]
\r
2363 ; TEST FOR GLOBALLY BOUND
\r
2365 MFUNCTION GBOUND,SUBR,[GBOUND?]
\r
2375 CHKAT1: GETYP A,(AB)
\r
2382 CHKAT: HLRE A,AB ; - # OF ARGS
\r
2383 ASH A,-1 ; TO ACTUAL WORDS
\r
2385 MOVE C,SP ; FOR BINDING LOOKUPS
\r
2386 AOJE A,CHKAT1 ; ONLY ONE ARG, NO ENVIRONMENT
\r
2387 AOJL A,TMA ; TOO MANY
\r
2388 GETYP A,2(AB) ; MAKE SURE OF TENV OR TFRAME
\r
2392 CAIN A,TACT ; FOR PFISTERS LOSSAGE
\r
2394 CAIE A,TPVP ; OR PROCESS
\r
2396 MOVE B,3(AB) ; GET PROCESS
\r
2397 MOVE C,SP ; IN CASE ITS ME
\r
2398 CAME B,PVP ; SKIP IF DIFFERENT
\r
2399 MOVE C,SPSTO+1(B) ; GET ITS SP
\r
2401 CHKAT3: MOVEI B,2(AB) ; POINT TO FRAME POINTER
\r
2402 PUSHJ P,CHFRM ; VALIDITY CHECK
\r
2403 MOVE B,3(AB) ; GET TB FROM FRAME
\r
2404 MOVE C,SPSAV(B) ; GET ENVIRONMENT POINTER
\r
2409 ;ILOC RETURNS IN A AND B A LOCATIVE TO THE LOCAL VALUE OF THE IDENTIFIER PASSED TO IT
\r
2410 ;IN A AND B. IF THE IDENTIFIER IS LOCALLY UNBOUND IT RETURNS $TUNBOUND IN A AND 0 IN B,
\r
2411 ; IT IS CALLED BY PUSHJ P,ILOC.
\r
2413 ILOC: MOVE C,SP ; SETUP SEARCH START
\r
2414 AILOC: MOVSI A,TLOCI ;MAKE A LOCATIVE TYPE CELL
\r
2417 MOVEI E,0 ; FLAG TO CLOBBER ATOM
\r
2418 JUMPE B,SCHSP ; IF LOOKING FOR SLOT, SEARCH NOW
\r
2419 CAME C,SP ; ENVIRONMENT CHANGE?
\r
2420 JRST SCHSP ; YES, MUST SEARCH
\r
2421 HRR A,BINDID+1(PVP) ;FOR THE CURRENT PROCESS
\r
2422 CAME A,(B) ;IS THERE ONE IN THE VALUE CELL?
\r
2423 JRST SCHLP ;NO -- SEARCH THE LOCAL BINDINGS
\r
2424 MOVE B,1(B) ;YES -- GET LOCATIVE POINTER
\r
2426 ILCPJ: MOVE E,SPCCHK
\r
2427 TRNN E,1 ; SKIP IF DOING SPEC UNSPEC CHECK
\r
2432 CAMGE B,CURFCN+1(PVP)
\r
2436 CAMGE B,SPBASE+1(PVP)
\r
2440 POPJ P, ;FROM THE VALUE CELL
\r
2442 SCHLP: MOVEI D,(B)
\r
2443 CAIL D,HIBOT ; SKIP IF IMPURE ATOM
\r
2444 SCHSP: MOVEI E,1 ; DONT STORE LOCATIVE
\r
2446 PUSH P,E ; PUSH SWITCH
\r
2447 MOVE E,PVP ; GET PROC
\r
2448 SCHLP1: JUMPE C,UNPJ ;IF NO MORE -- LOSE
\r
2449 CAMN B,1(C) ;ARE WE POINTING AT THE WINNER?
\r
2451 GETYP D,(C) ; CHECK SKIP
\r
2454 PUSH P,B ; CHECK DETOUR
\r
2456 PUSHJ P,CHFRAM ; NON-FATAL FRAME CHECKER
\r
2457 HRRZ E,2(C) ; CONS UP PROCESS
\r
2460 JUMPE B,SCHLP3 ; LOSER, FIX IT
\r
2462 MOVEI C,1(C) ; FOLLOW LOOKUP CHAIN
\r
2463 SCHLP2: HRRZ C,(C) ;FOLLOW LINK
\r
2467 MOVEI C,(SP) ; *** NDR'S BUG ***
\r
2468 CAME E,PVP ; USE IF CURRENT PROCESS
\r
2469 HRRZ C,SPSTO+1(E) ; USE CURRENT SP FOR PROC
\r
2472 SCHFND: EXCH B,C ;SAVE THE ATOM PTR IN C
\r
2473 MOVEI B,2(B) ;MAKE UP THE LOCATIVE
\r
2477 EXCH C,E ; RET PROCESS IN C
\r
2478 POP P,D ; RESTORE SWITCH
\r
2480 JUMPN D,ILOCPJ ; DONT CLOBBER ATOM
\r
2481 MOVEM A,(E) ;CLOBBER IT AWAY INTO THE
\r
2482 MOVEM B,1(E) ;ATOM'S VALUE CELL
\r
2485 UNPJ: SUB P,[1,,1] ; FLUSH CRUFT
\r
2486 UNPJ1: MOVE C,E ; RET PROCESS ANYWAY
\r
2489 UNPOPJ: MOVSI A,TUNBOUND
\r
2493 ;IGLOC RETURNS IN A AND B A LOCATIVE TO THE GLOBAL VALUE OF THE
\r
2494 ;IDENTIFIER PASSED TO IT IN A AND B. IF THE IDENTIFIER IS GLOBALLY
\r
2495 ;UNBPOUND IT RETURNS $TUNBOUND IN A AND 0 IN B. IT IS CALLED BY PUSHJ P,IGLOC.
\r
2498 IGLOC: MOVSI A,TLOCI ;DO WE HAVE A LOCATIVE TO
\r
2499 CAME A,(B) ;A PROCESS #0 VALUE?
\r
2500 JRST SCHGSP ;NO -- SEARCH
\r
2501 MOVE B,1(B) ;YES -- GET VALUE CELL
\r
2504 SCHGSP: MOVE D,GLOBSP+1(TVP) ;GET GLOBAL SP PTR
\r
2506 SCHG1: JUMPGE D,UNPOPJ ;IF NO MORE, LEAVE
\r
2507 CAMN B,1(D) ;ARE WE FOUND?
\r
2508 JRST GLOCFOUND ;YES
\r
2509 ADD D,[4,,4] ;NO -- TRY NEXT
\r
2513 EXCH B,D ;SAVE ATOM PTR
\r
2514 ADD B,[2,,2] ;MAKE LOCATIVE
\r
2518 MOVEM A,(D) ;CLOBBER IT AWAY
\r
2522 IIGLOC: PUSH TP,$TATOM
\r
2532 PUSHJ P,BSETG ; MAKE A SLOT
\r
2533 SETOM 1(B) ; UNBOUNDIFY IT
\r
2542 ;ILVAL RETURNS IN A AND B THE LOCAL VALUE OF THE IDENTIFIER PASSED TO IT IN A AND B
\r
2543 ;IF THE IDENTIFIER IS UNBOUND ITS VALUE IS $TUNBOUND IN A AND 0 IN B. IF
\r
2544 ;IT IS UNASSIGNED ITS VALUE IS $TUNBOUND IN A AND -1 IN B. CALL - PUSHJ P,IVAL
\r
2547 PUSHJ P,AILOC ; USE SUPPLIED SP
\r
2550 PUSHJ P,ILOC ;GET LOCATIVE TO VALUE
\r
2551 CHVAL: CAMN A,$TUNBOUND ;BOUND
\r
2552 POPJ P, ;NO -- RETURN
\r
2553 MOVSI A,TLOCD ; GET GOOD TYPE
\r
2554 HRR A,2(B) ; SHOULD BE TIME OR 0
\r
2556 PUSHJ P,RMONC0 ; CHECK READ MONITOR
\r
2558 MOVE A,(B) ;GET THE TYPE OF THE VALUE
\r
2559 MOVE B,1(B) ;GET DATUM
\r
2562 ;IGVAL -- LIKE ILVAL EXCEPT FOR GLOBAL VALUES
\r
2564 IGVAL: PUSHJ P,IGLOC
\r
2569 ; COMPILERS INTERFACE TO LVAL/GVAL/SETG/SET
\r
2571 CILVAL: MOVE 0,BINDID+1(PVP) ; CURRENT BIND
\r
2573 CAME 0,(B) ; HURRAY FOR SPEED
\r
2574 JRST CILVA1 ; TOO BAD
\r
2575 MOVE C,1(B) ; POINTER
\r
2576 MOVE A,(C) ; VAL TYPE
\r
2577 TLNE A,.RDMON ; MONITORS?
\r
2581 JRST CUNAS ; COMPILER ERROR
\r
2582 MOVE B,1(C) ; GOT VAL
\r
2586 HLRZ 0,-2(C) ; SPECIAL CHECK
\r
2589 CAMGE C,CURFCN+1(PVP)
\r
2594 CILVA1: SUBM M,(P) ; FIX (P)
\r
2595 PUSH TP,$TATOM ; SAVE ATOM
\r
2597 MCALL 1,LVAL ; GET ERROR/MONITOR
\r
2599 POPJM: SUBM M,(P) ; REPAIR DAMAGE
\r
2602 ; COMPILERS INTERFACE TO SET C/ ATOM A,B/ NEW VALUE
\r
2604 CISET: MOVE 0,BINDID+1(PVP) ; CURRENT BINDING ENVIRONMENT
\r
2606 CAME 0,(C) ; CAN WE WIN?
\r
2607 JRST CISET1 ; NO, MORE HAIR
\r
2608 MOVE D,1(C) ; POINT TO SLOT
\r
2609 HLLZ 0,(D) ; MON CHECK
\r
2610 CISET3: TLNE 0,.WRMON
\r
2611 JRST CISET4 ; YES, LOSE
\r
2613 IOR A,0 ; LEAVE MONITOR ON
\r
2616 JRST CISET5 ; SPEC/UNSPEC CHECK
\r
2617 CISET6: MOVEM A,(D) ; STORE
\r
2621 CISET5: HLRZ 0,-2(D)
\r
2624 CAMGE D,CURFCN+1(PVP)
\r
2628 CISET1: SUBM M,(P) ; FIX ADDR
\r
2629 PUSH TP,$TATOM ; SAVE ATOM
\r
2633 MOVE B,C ; GET ATOM
\r
2634 PUSHJ P,ILOC ; SEARCH
\r
2635 MOVE D,B ; POSSIBLE POINTER
\r
2638 MOVE A,-1(TP) ; VAL BACK
\r
2640 CAIE E,TUNBOU ; SKIP IF WIN
\r
2641 JRST CISET2 ; GO CLOBBER IT IN
\r
2645 CISET2: MOVE C,-2(TP) ; ATOM BACK
\r
2646 SUBM M,(P) ; RESET (P)
\r
2650 ; HERE TO DO A MONITORED SET
\r
2652 CISET4: SUBM M,(P) ; AGAIN FIX (P)
\r
2662 CLLOC: MOVE 0,BINDID+1(PVP) ; GET CURRENT LOCATIVE
\r
2668 TRNE 0,1 ; SKIP IF NOT CHECKING
\r
2670 CLLOC3: MOVSI A,TLOCD
\r
2671 HRR A,2(B) ; GET BIND TIME
\r
2674 CLLOC1: SUBM M,(P)
\r
2677 PUSHJ P,ILOC ; LOOK IT UP
\r
2680 CLLOC4: SUBM M,(P)
\r
2683 CLLOC2: MCALL 1,LLOC
\r
2686 CLLOC9: HLRZ 0,-2(B)
\r
2689 CAMGE B,CURFCN+1(PVP)
\r
2695 CBOUND: SUBM M,(P)
\r
2697 JUMPE B,PJFALS ; IF UNBOUND RET FALSE AND NO SSKIP
\r
2707 ; COMPILER ASSIGNED?
\r
2718 ; COMPILER GVAL B/ ATOM
\r
2720 CIGVAL: MOVE 0,(B) ; GLOBAL VAL HERE?
\r
2721 CAME 0,$TLOCI ; TIME=0 ,TYPE=TLOCI => GLOB VAL
\r
2722 JRST CIGVA1 ; NO, GO LOOK
\r
2723 MOVE C,1(B) ; POINT TO SLOT
\r
2724 MOVE A,(C) ; GET TYPE
\r
2727 GETYP 0,A ; CHECK FOR UNBOUND
\r
2728 CAIN 0,TUNBOU ; SKIP IF WINNER
\r
2734 CIGVA1: SUBM M,(P)
\r
2737 .MCALL 1,GVAL ; GET ERROR/MONITOR
\r
2740 ; COMPILER INTERFACET TO SETG
\r
2742 CSETG: MOVE 0,(C) ; GET V CELL
\r
2743 CAME 0,$TLOCI ; SKIP IF FAST
\r
2745 HRRZ D,1(C) ; POINT TO SLOT
\r
2746 MOVE 0,(D) ; OLD VAL
\r
2747 CSETG3: CAIG D,HIBOT ; SKIP IF PURE ATOM
\r
2748 TLNE 0,.WRMON ; MONITOR
\r
2754 CSETG1: SUBM M,(P) ; FIX UP P
\r
2760 PUSHJ P,IGLOC ; FIND GLOB LOCATIVE
\r
2763 MOVEI D,(B) ; SETUP TO RESTORE NEW VAL
\r
2771 CSETG4: MOVE C,-2(TP) ; ATOM BACK
\r
2772 SUBM M,(P) ; RESET (P)
\r
2776 CSETG2: SUBM M,(P)
\r
2777 PUSH TP,$TATOM ; CAUSE A SETG MONITOR
\r
2786 CGLOC: MOVE 0,(B) ; GET CURRENT GUY
\r
2787 CAME 0,$TLOCI ; WIN?
\r
2788 JRST CGLOC1 ; NOPE
\r
2789 HRRZ D,1(B) ; POINT TO SLOT
\r
2790 CAILE D,HIBOT ; PURE?
\r
2796 CGLOC1: SUBM M,(P)
\r
2802 ; COMPILERS GASSIGNED?
\r
2804 CGASSQ: MOVE 0,(B)
\r
2815 ; COMPILERS GBOUND?
\r
2817 CGBOUN: MOVE 0,(B)
\r
2826 MFUNCTION REP,FSUBR,[REPEAT]
\r
2828 MFUNCTION PROG,FSUBR
\r
2830 GETYP A,(AB) ;GET ARG TYPE
\r
2831 CAIE A,TLIST ;IS IT A LIST?
\r
2832 JRST WRONGT ;WRONG TYPE
\r
2833 SKIPN C,1(AB) ;GET AND CHECK ARGUMENT
\r
2834 JRST TFA ;TOO FEW ARGS
\r
2835 SETZB E,D ; INIT HEWITT ATOM AND DECL
\r
2836 PUSHJ P,CARATC ; IS 1ST THING AN ATOM
\r
2838 PUSHJ P,RSATY1 ; CDR AND GET TYPE
\r
2839 CAIE 0,TLIST ; MUST BE LIST
\r
2841 MOVE B,1(C) ; GET ARG LIST
\r
2846 JRST NOP.DC ; JUMP IF NO DCL
\r
2849 PUSHJ P,RSATYP ; CDR ON
\r
2850 NOP.DC: PUSH TP,$TLIST
\r
2851 PUSH TP,B ; AND ARG LIST
\r
2852 PUSHJ P,PRGBND ; BIND AUX VARS
\r
2853 MOVE E,MQUOTE LPROG,[LPROG ]INTRUP
\r
2854 PUSHJ P,MAKACT ; MAKE ACTIVATION
\r
2855 PUSHJ P,PSHBND ; BIND AND CHECK
\r
2856 PUSHJ P,SPECBI ; NAD BIND IT
\r
2858 ; HERE TO RUN PROGS FUNCTIONS ETC.
\r
2860 DOPROG: MOVEI A,REPROG
\r
2861 HRLI A,TDCLI ; FLAG AS FUNNY
\r
2862 MOVEM A,(TB) ; WHERE TO AGAIN TO
\r
2864 MOVEM C,3(TB) ; RESTART POINTER
\r
2865 JRST .+2 ; START BY SKIPPING DECL
\r
2867 DOPRG1: PUSHJ P,FASTEV
\r
2868 HRRZ C,@1(TB) ;GET THE REST OF THE BODY
\r
2869 DOPRG2: MOVEM C,1(TB)
\r
2874 REPROG: SKIPN C,@3(TB)
\r
2882 PFINIS: GETYP 0,(TB)
\r
2883 CAIE 0,TDCLI ; DECL'D ?
\r
2885 HRRZ 0,(TB) ; SEE IF RSUBR
\r
2886 JUMPE 0,RSBVCK ; CHECK RSUBR VALUE
\r
2887 HRRZ C,3(TB) ; GET START OF FCN
\r
2888 GETYP 0,(C) ; CHECK FOR DECL
\r
2890 JRST PFINI1 ; NO, JUST RETURN
\r
2891 MOVE E,MQUOTE VALUE
\r
2892 PUSHJ P,PSHBND ; BUILD FAKE BINDING
\r
2893 MOVE C,1(C) ; GET DECL LIST
\r
2895 PUSHJ P,CHKDCL ; AND CHECK IT
\r
2896 MOVE A,-3(TP) ; GET VAL BAKC
\r
2900 PFINI1: HRRZ C,FSAV(TB)
\r
2905 RSATYP: HRRZ C,(C)
\r
2906 RSATY1: JUMPE C,TFA
\r
2910 ; HERE TO CHECK RSUBR VALUE
\r
2916 MOVE A,1(TB) ; GET DECL
\r
2925 RSBVC1: MOVE C,1(TB)
\r
2928 MOVE A,MQUOTE VALUE
\r
2932 MFUNCTION MRETUR,SUBR,[RETURN]
\r
2934 HLRE A,AB ; GET # OF ARGS
\r
2935 ASH A,-1 ; TO NUMBER
\r
2936 AOJL A,RET2 ; 2 OR MORE ARGS
\r
2937 PUSHJ P,PROGCH ;CHECK IN A PROG
\r
2940 MOVEI B,-1(TP) ; VERIFY IT
\r
2941 COMRET: PUSHJ P,CHFSWP
\r
2943 MOVEI C,0 ; REAL NONE
\r
2945 JUMPN A,CHFINI ; WINNER
\r
2949 ; SEE IF MUST CHECK RETURNS TYPE
\r
2951 CHFINI: GETYP 0,(TB) ; SPECIAL TYPE IF SO
\r
2953 JRST FINIS ; NO, JUST FINIS
\r
2954 MOVEI 0,PFINIS ; CAUSE TO FALL INTO FUNCTION CODE
\r
2961 CAIE A,TACT ; AS FOR "EXIT" SHOULD BE ACTIVATION
\r
2963 MOVEI B,(AB)+2 ; ADDRESS OF FRAME POINTER
\r
2968 MFUNCTION AGAIN,SUBR
\r
2970 HLRZ A,AB ;GET # OF ARGS
\r
2973 JUMPN A,TMA ;0 ARGS?
\r
2974 PUSHJ P,PROGCH ;CHECK FOR IN A PROG
\r
2978 NLCLA: GETYP A,(AB)
\r
2983 AGAD: MOVEI B,-1(TP) ; POINT TO FRAME
\r
2985 HRRZ C,(B) ; GET RET POINT
\r
2986 GOJOIN: PUSH TP,$TFIX
\r
2989 PUSHJ P,CHUNW ; RESTORE FRAME, UNWIND IF NEC.
\r
2991 HRRZ 0,FSAV(TB) ; CHECK FOR RSUBR
\r
3002 MOVEM SP,SPSAV(TB)
\r
3003 MOVEM TP,TPSAV(TB)
\r
3004 MOVE C,OTBSAV(TB) ; AND RESTORE P FROM FATHER
\r
3016 PUSHJ P,PROGCH ;CHECK FOR A PROG
\r
3025 MCALL 2,MEMQ ;DOES IT HAVE THIS TAG?
\r
3026 JUMPE B,NXTAG ;NO -- ERROR
\r
3027 FNDGO: EXCH B,(TP) ;SAVE PLACE TO GO
\r
3032 NLCLGO: CAIE A,TTAG ;CHECK TYPE
\r
3035 MOVEI B,2(B) ; POINT TO SLOT
\r
3038 GETYP 0,(A) ; SEE IF COMPILED
\r
3044 GODON1: PUSH TP,(A) ;SAVE BODY
\r
3047 PUSHJ P,CHUNW ;GO BACK TO CORRECT FRAME
\r
3048 MOVE B,(TP) ;RESTORE ITERATION MARKER
\r
3057 MFUNCTION TAG,SUBR
\r
3061 GETYP A,(AB) ;GET TYPE OF ARGUMENT
\r
3062 CAIE A,TFIX ; FIX ==> COMPILED
\r
3074 ATOTAG: CAIE A,TATOM ;CHECK THAT IT IS AN ATOM
\r
3078 PUSHJ P,PROGCH ;CHECK PROG
\r
3079 PUSH TP,A ;SAVE VAL
\r
3086 JUMPE B,NXTAG ;IF NOT FOUND -- ERROR
\r
3087 EXCH A,-1(TP) ;SAVE PLACE
\r
3097 PROGCH: MOVE B,MQUOTE LPROG,[LPROG ]INTRUP
\r
3098 PUSHJ P,ILVAL ;GET VALUE
\r
3104 ; HERE TO UNASSIGN LPROG IF NEC
\r
3106 UNPROG: MOVE B,MQUOTE LPROG,[LPROG ]INTRUP
\r
3109 CAIE 0,TACT ; SKIP IF MUST UNBIND
\r
3113 MOVE E,MQUOTE LPROG,[LPROG ]INTRUP
\r
3115 UNMAP: HRRZ 0,FSAV(TB) ; CHECK FOR FUNNY
\r
3116 CAIN 0,MAPPLY ; SKIP IF NOT
\r
3118 MOVE B,MQUOTE LMAP,[LMAP ]INTRUP
\r
3125 MOVE E,MQUOTE LMAP,[LMAP ]INTRUP
\r
3127 UNSPEC: PUSH TP,BNDV
\r
3129 ADD B,[CURFCN,,CURFCN]
\r
3138 MFUNCTION MEXIT,SUBR,[EXIT]
\r
3146 PUSHJ P,CHUNW ;RESTORE FRAME
\r
3147 JRST CHFINI ; CHECK FOR WINNING VALUE
\r
3150 MFUNCTION COND,FSUBR
\r
3156 PUSH TP,1(AB) ;CREATE UNNAMED TEMP
\r
3157 MOVEI B,0 ; SET TO FALSE IN CASE
\r
3159 CLSLUP: SKIPN C,1(TB) ;IS THE CLAUSELIST NIL?
\r
3160 JRST IFALS1 ;YES -- RETURN NIL
\r
3161 GETYP A,(C) ;NO -- GET TYPE OF CAR
\r
3162 CAIE A,TLIST ;IS IT A LIST?
\r
3164 MOVE A,1(C) ;YES -- GET CLAUSE
\r
3167 PUSH TP,B ; EVALUATION OF
\r
3169 PUSH TP,1(A) ;THE PREDICATE
\r
3174 JRST NXTCLS ;FALSE TRY NEXT CLAUSE
\r
3175 MOVE C,1(TB) ;IF NOT, DO FIRST CLAUSE
\r
3178 JUMPE C,FINIS ;(UNLESS DONE WITH IT)
\r
3179 JRST DOPRG2 ;AS THOUGH IT WERE A PROG
\r
3180 NXTCLS: HRRZ C,@1(TB) ;SET THE CLAUSLIST
\r
3181 HRRZM C,1(TB) ;TO CDR OF THE CLAUSLIST
\r
3186 IFALS1: MOVSI A,TFALSE ;RETURN FALSE
\r
3191 MFUNCTION UNWIND,FSUBR
\r
3195 GETYP 0,(AB) ; CHECK THE ARGS FOR WINNAGE
\r
3196 SKIPN A,1(AB) ; NONE?
\r
3198 HRRZ B,(A) ; CHECK FOR 2D
\r
3203 ; Unbind LPROG and LMAPF so that nothing cute happens
\r
3207 ; Push thing to do upon UNWINDing
\r
3213 PUSHJ P,IUNWIN ; GOT TO INTERNAL SET UP
\r
3215 ; Now EVAL the first form
\r
3218 HRRZ 0,(A) ; SAVE POINTER TO OTHER GUY
\r
3223 JSP E,CHKAB ; DEFER?
\r
3226 MCALL 1,EVAL ; EVAL THE LOSER
\r
3230 ; Now push slots to hold undo info on the way down
\r
3246 PUSH TP,$TTB ; DESTINATION FRAME
\r
3248 PUSH TP,[0] ; ARGS TO WHOEVER IS DOING IT
\r
3251 ; Now bind UNWIND word
\r
3253 PUSH TP,$TUNWIN ; FIRST WORD OF IT
\r
3254 HRRM SP,(TP) ; CHAIN
\r
3256 PUSH TP,TB ; AND POINT TO HERE
\r
3261 PUSH TP,P ; SAVE PDL ALSO
\r
3262 MOVEM TP,-2(TP) ; SAVE FOR LATER
\r
3265 ; Do a non-local return with UNWIND checking
\r
3267 CHUNW: HRRZ E,SPSAV(B) ; GET DESTINATION FRAME
\r
3268 CHUNW1: PUSH TP,(C) ; FINAL VAL
\r
3270 JUMPN C,.+3 ; WAS THERE REALLY ANYTHING
\r
3273 PUSHJ P,STLOOP ; UNBIND
\r
3274 CHUNPC: SKIPA ; WILL NOT SKIP UNLESS UNWIND FOUND
\r
3281 HRRI TB,(B) ; UPDATE TB
\r
3286 ; Here if an UNDO found
\r
3288 GOTUND: MOVE TB,1(SP) ; GET FRAME OF UNDO
\r
3289 MOVE A,-1(TP) ; GET FUNNY ARG FOR PASS ON
\r
3291 MOVE TP,3(SP) ; GET FUTURE TP
\r
3292 MOVEM C,-6(TP) ; SAVE ARG
\r
3294 MOVE C,(TP) ; SAVED P
\r
3296 MOVEM C,PSAV(TB) ; MAKE CONTIN WIN
\r
3297 MOVEM TP,TPSAV(TB)
\r
3298 MOVEM SP,SPSAV(TB)
\r
3299 HRRZ C,(P) ; PC OF CHUNW CALLER
\r
3300 HRRM C,-11(TP) ; SAVE ALSO AND GET WHERE TO GO PC
\r
3301 MOVEM B,-10(TP) ; AND DESTINATION FRAME
\r
3302 HRRZ C,-1(TP) ; WHERE TO UNWIND PC
\r
3303 HRRZ 0,FSAV(TB) ; RSUBR?
\r
3306 TLZA C,-1 ; 0 LH OF C AND SKIP
\r
3307 HRLI C,M ; RELATIVIZE
\r
3311 UNWIN1: MOVE B,-12(TP) ; POINT TO THING TO DO UNWINDING
\r
3319 UNWIN2: MOVEI C,-7(TP) ; POINT TO SAVED RET VALS
\r
3323 HRRZ SP,(SP) ; UNBIND THIS GUY
\r
3324 MOVEI E,(TP) ; AND FIXUP SP
\r
3329 JRST CHUNW ; ANY MORE TO UNWIND?
\r
3332 ; CHFSWP - CHECK FRAMES VALIDITY AND SWAP PROCESS IF NECESSARY.
\r
3333 ; CALLED BY ALL CONTROL FLOW
\r
3334 ; ROUTINES (GO,RETURN,EXIT,AGAIN,ERRET...)
\r
3336 CHFSWP: PUSHJ P,CHFRM ; CHECK FOR VALID FRAME
\r
3337 HRRZ D,(B) ; PROCESS VECTOR DOPE WD
\r
3338 HLRZ C,(D) ; LENGTH
\r
3339 SUBI D,-1(C) ; POINT TO TOP
\r
3340 MOVNS C ; NEGATE COUNT
\r
3341 HRLI D,2(C) ; BUILD PVP
\r
3344 MOVE A,(B) ; GET FRAME
\r
3346 CAMN E,D ; SKIP IF SWAP NEEDED
\r
3348 PUSH TP,A ; SAVE FRAME
\r
3351 PUSHJ P,PROCHK ; FIX UP PROCESS LISTS
\r
3352 MOVE A,PSTAT+1(B) ; GET STATE
\r
3355 MOVE D,B ; PREPARE TO SWAP
\r
3356 POP P,0 ; RET ADDR
\r
3359 JSP C,SWAP ; SWAP IN
\r
3360 MOVE C,ABSTO+1(E) ; GET OLD ARRGS
\r
3361 MOVEI A,RUNING ; FIX STATES
\r
3362 MOVEM A,PSTAT+1(PVP)
\r
3364 MOVEM A,PSTAT+1(E)
\r
3367 NOTRES: PUSH TP,$TATOM
\r
3368 PUSH TP,EQUOTE PROCESS-NOT-RESUMABLE
\r
3372 ;SETG IS USED TO SET THE GLOBAL VALUE OF ITS FIRST ARGUMENT,
\r
3373 ;AN IDENTIFIER, TO THE VALUE OF ITS SECOND ARGUMENT. ITS VALUE IS
\r
3374 ; ITS SECOND ARGUMENT.
\r
3376 MFUNCTION SETG,SUBR
\r
3378 GETYP A,(AB) ;GET TYPE OF FIRST ARGUMENT
\r
3379 CAIE A,TATOM ;CHECK THAT IT IS AN ATOM
\r
3380 JRST NONATM ;IF NOT -- ERROR
\r
3381 MOVE B,1(AB) ;GET POINTER TO ATOM
\r
3385 CAIL 0,HIBOT ; PURE ATOM?
\r
3386 PUSHJ P,IMPURIFY ; YES IMPURIFY
\r
3387 PUSHJ P,IGLOC ;GET LOCATIVE TO VALUE
\r
3388 CAMN A,$TUNBOUND ;IF BOUND
\r
3389 PUSHJ P,BSETG ;IF NOT -- BIND IT
\r
3390 MOVE C,2(AB) ; GET PROPOSED VVAL
\r
3392 MOVSI A,TLOCD ; MAKE SURE MONCH WINS
\r
3393 PUSHJ P,MONCH0 ; WOULD YOU BELIEVE MONITORS!!!!
\r
3394 EXCH D,B ;SAVE PTR
\r
3396 HRRZ E,-2(D) ; POINT TO POSSIBLE GDECL (OR MAINIFEST)
\r
3397 JUMPE E,OKSETG ; NONE ,OK
\r
3398 CAIE E,-1 ; MANIFEST?
\r
3400 GETYP 0,(D) ; IF UNBOUND, LET IT HAPPEN
\r
3404 MANILO: GETYP C,(D)
\r
3412 MOVE B,MQUOTE REDEFINE
\r
3413 PUSHJ P,ILVAL ; SEE IF REDEFINE OK
\r
3420 PUSH TP,EQUOTE ATTEMPT-TO-CHANGE-MANIFEST-VARIABLE
\r
3426 SETGTY: PUSH TP,$TVEC
\r
3437 OKSTG: MOVE D,(TP)
\r
3441 OKSETG: MOVEM A,(D) ;DEPOSIT INTO THE
\r
3442 MOVEM B,1(D) ;INDICATED VALUE CELL
\r
3445 TYPMI3: MOVE C,(TP)
\r
3453 BSETG: HRRZ A,GLOBASE+1(TVP)
\r
3454 HRRZ B,GLOBSP+1(TVP)
\r
3458 MOVEI B,0 ; MAKE SURE OF NO EMPTY SLOTS
\r
3460 CAMN A,$TUNBOU ; SKIP IF SLOT FOUND
\r
3462 MOVE E,(TP) ; GET ATOM
\r
3463 MOVEM E,-1(B) ; CLOBBER ATOM SLOT
\r
3465 ; BSETG1: PUSH TP,GLOBASE(TVP) ; MUST REALLY GROW STACK
\r
3466 ; PUSH TP,GLOBASE+1 (TVP)
\r
3474 MOVE C,GLOBASE+1(TVP)
\r
3477 MOVE B,GVLINC ; GROW BY INDICATED GVAL SLOTS
\r
3478 DPB B,[001100,,(C)]
\r
3479 ; MOVEM A,GLOBASE(TVP)
\r
3480 MOVE C,[6,,4] ; INDICATOR FOR AGC
\r
3482 MOVE B,GLOBASE+1(TVP)
\r
3483 MOVE 0,GVLINC ; ADJUST GLOBAL SPBASE
\r
3488 MOVEM B,GLOBASE+1(TVP)
\r
3489 ; MOVEM B,GLOBASE+1(TVP)
\r
3493 MOVE B,GLOBSP+1(TVP)
\r
3499 MOVEM B,GLOBSP+1(TVP)
\r
3505 MFUNCTION DEFMAC,FSUBR
\r
3512 MFUNCTION DFNE,FSUBR,[DEFINE]
\r
3517 DFNE2: GETYP A,(AB)
\r
3520 SKIPN B,1(AB) ; GET ATOM
\r
3522 GETYP A,(B) ; MAKE SURE ATOM
\r
3527 MCALL 1,EVAL ; EVAL IT TO AN ATOM
\r
3530 PUSH TP,A ; SAVE TWO COPIES
\r
3532 PUSHJ P,IGVAL ; SEE IF A VALUE EXISTS
\r
3533 CAMN A,$TUNBOU ; SKIP IF A WINNER
\r
3535 PUSHJ P,ASKUSR ; CHECK WITH USER
\r
3542 SKIPN (P) ; SKIP IF MACRO
\r
3544 MOVEI D,(B) ; READY TO CONS
\r
3551 DFNE1: POP TP,B ; RETURN ATOM
\r
3556 ASKUSR: MOVE B,MQUOTE REDEFINE
\r
3557 PUSHJ P,ILVAL ; SEE IF REDEFINE OK
\r
3563 ASKUS1: PUSH TP,$TATOM
\r
3566 PUSH TP,EQUOTE ALREADY-DEFINED-ERRET-NON-FALSE-TO-REDEFINE
\r
3576 ;SET CLOBBERS THE LOCAL VALUE OF THE IDENTIFIER GIVEN BY ITS
\r
3577 ;FIRST ARGUMENT TO THE SECOND ARG. ITS VALUE IS ITS SECOND ARGUMENT.
\r
3579 MFUNCTION SET,SUBR
\r
3580 HLRE D,AB ; 2 TIMES # OF ARGS TO D
\r
3581 ASH D,-1 ; - # OF ARGS
\r
3583 JUMPG D,TFA ; NOT ENOUGH
\r
3586 JUMPE D,SET1 ; NO ENVIRONMENT
\r
3587 AOJL D,TMA ; TOO MANY
\r
3588 GETYP A,4(AB) ; CHECK ARG IS A FRAME OR PROCESS
\r
3591 JRST SET2 ; WINNING ENVIRONMENT/FRAME
\r
3593 JRST SET2 ; TO MAKE PFISTER HAPPY
\r
3596 MOVE B,5(AB) ; GET PROCESS
\r
3599 SET2: MOVEI B,4(AB) ; POINT TO FRAME
\r
3600 PUSHJ P,CHFRM ; CHECK IT OUT
\r
3601 MOVE B,5(AB) ; GET IT BACK
\r
3602 MOVE C,SPSAV(B) ; GET BINDING POINTER
\r
3603 HRRZ B,4(AB) ; POINT TO PROCESS
\r
3604 HLRZ A,(B) ; GET LENGTH
\r
3605 SUBI B,-1(A) ; POINT TO START THEREOF
\r
3606 HLL B,PVP ; GET -LNTRH, (ALL PROCESS VECS SAME LENGTH)
\r
3607 SET1: PUSH TP,$TPVP ; SAVE PROCESS
\r
3609 PUSH TP,$TSP ; SAVE PATH POINTER
\r
3611 GETYP A,(AB) ;GET TYPE OF FIRST
\r
3612 CAIE A,TATOM ;ARGUMENT --
\r
3613 JRST WTYP1 ;BETTER BE AN ATOM
\r
3614 MOVE B,1(AB) ;GET PTR TO IT
\r
3619 PUSHJ P,AILOC ;GET LOCATIVE TO VALUE
\r
3620 GOTLOC: CAMN A,$TUNBOUND ;BOUND?
\r
3621 PUSHJ P, BSET ;BIND IT
\r
3623 MOVE C,2(AB) ; GET NEW VAL
\r
3625 MOVSI A,TLOCD ; FOR MONCH
\r
3627 PUSHJ P,MONCH0 ; HURRAY FOR MONITORS!!!!!
\r
3629 HLRZ A,2(E) ; GET DECLS
\r
3630 JUMPE A,SET3 ; NONE, GO
\r
3634 HLLZ A,(A) ; GET PATTERN
\r
3635 PUSHJ P,TMATCH ; MATCH TMEM
\r
3636 JRST TYPMI2 ; LOSES
\r
3641 SET3: MOVEM C,(E) ;CLOBBER IDENTIFIER
\r
3647 CAMN PVP,-2(TP) ; SKIP IF PROC DIFFERS
\r
3648 MOVEM C,-2(TP) ; ELSE USE RESULT FROM LOC SEARCH
\r
3649 MOVE B,-2(TP) ; GET PROCESS
\r
3650 HRRZ A,TPBASE+1(B) ;GET ACTUAL STACK BASE
\r
3651 HRRZ B,SPBASE+1(B) ;AND FIRST BINDING
\r
3652 SUB B,A ;ARE THERE 6
\r
3653 CAIL B,6 ;CELLS AVAILABLE?
\r
3655 MOVE C,(TP) ; GET POINTER BACK
\r
3656 MOVEI B,0 ; LOOK FOR EMPTY SLOT
\r
3658 CAMN A,$TUNBOUND ; SKIP IF FOUND
\r
3660 MOVE E,1(AB) ; GET ATOM
\r
3661 MOVEM E,-1(B) ; AND STORE
\r
3663 BSET1: MOVE B,-2(TP) ; GET PROCESS
\r
3664 ; PUSH TP,TPBASE(B) ;NO -- GROW THE TP
\r
3665 ; PUSH TP,TPBASE+1(B) ;AT THE BASE END
\r
3671 ; MOVE C,-2(TP) ; GET PROCESS
\r
3672 ; MOVEM A,TPBASE(C) ;SAVE RESULT
\r
3673 PUSH P,0 ; MANUALLY GROW VECTOR
\r
3675 MOVE C,TPBASE+1(B)
\r
3682 DPB D,[001100,,-1(C)]
\r
3683 MOVE C,[5,,3] ; SET UP INDICATORS FOR AGC
\r
3685 MOVE B,TPBASE+1(PVP) ; MODIFY POINTER
\r
3686 MOVE 0,LVLINC ; ADJUST SPBASE POINTER
\r
3691 MOVEM B,TPBASE+1(PVP)
\r
3694 ; MOVEM B,TPBASE+1(C)
\r
3695 SETIT: MOVE C,-2(TP) ; GET PROCESS
\r
3696 MOVE B,SPBASE+1(C)
\r
3697 MOVEI A,-6(B) ;MAKE UP BINDING
\r
3698 HRRM A,(B) ;LINK PREVIOUS BIND BLOCK
\r
3704 MOVEM B,SPBASE+1(C)
\r
3706 BSET2: MOVE C,-2(TP) ; GET PROC
\r
3709 HLRZ D,OTBSAV(TB) ; TIME IT
\r
3710 MOVEM D,2(B) ; AND FIX IT
\r
3713 ; HERE TO ELABORATE ON TYPE MISMATCH
\r
3715 TYPMI2: MOVE C,(TP) ; FIND DECLS
\r
3719 MOVE 0,(AB) ; GET ATOM
\r
3725 MFUNCTION NOT,SUBR
\r
3727 GETYP A,(AB) ; GET TYPE
\r
3728 CAIE A,TFALSE ;IS IT FALSE?
\r
3729 JRST IFALSE ;NO -- RETURN FALSE
\r
3732 MOVSI A,TATOM ;RETURN T (VERITAS)
\r
3736 MFUNCTION OR,FSUBR
\r
3741 MFUNCTION ANDA,FSUBR,AND
\r
3747 JRST WRONGT ;IF ARG DOESN'T CHECK OUT
\r
3749 SKIPN C,1(AB) ;IF NIL
\r
3750 JRST TF(E) ;RETURN TRUTH
\r
3751 PUSH TP,$TLIST ;CREATE UNNAMED TEMP
\r
3755 JUMPE C,TFI(E) ;ANY MORE ARGS?
\r
3756 MOVEM C,1(TB) ;STORE CRUFT
\r
3760 PUSH TP,1(C) ;ARGUMENT
\r
3766 JRST FINIS ;IF FALSE -- RETURN
\r
3767 HRRZ C,@1(TB) ;GET CDR OF ARGLIST
\r
3776 TFSKP: CAIE 0,TFALSE
\r
3779 MFUNCTION FUNCTION,FSUBR
\r
3789 MFUNCTION CLOSURE,SUBR
\r
3791 SKIPL A,AB ;ANY ARGS
\r
3792 JRST TFA ;NO -- LOSE
\r
3793 ADD A,[2,,2] ;POINT AT IDS
\r
3796 PUSH P,[0] ;MAKE COUNTER
\r
3798 CLOLP: SKIPL A,1(TB) ;ANY MORE IDS?
\r
3799 JRST CLODON ;NO -- LOSE
\r
3800 PUSH TP,(A) ;SAVE ID
\r
3802 PUSH TP,(A) ;GET ITS VALUE
\r
3804 ADD A,[2,,2] ;BUMP POINTER
\r
3810 MCALL 2,LIST ;MAKE PAIR
\r
3816 ACALL A,LIST ;MAKE UP LIST
\r
3817 PUSH TP,(AB) ;GET FUNCTION
\r
3821 MCALL 2,LIST ;MAKE LIST
\r
3827 ;ERROR COMMENTS FOR EVAL
\r
3828 TUPTFA: PUSH TP,$TATOM
\r
3829 PUSH TP,EQUOTE TOO-FEW-ARGS-FOR-ITUPLE
\r
3832 TUPTMA: PUSH TP,$TATOM
\r
3833 PUSH TP,EQUOTE TOO-MANY-ARGS-TO-ITUPLE
\r
3836 BADNUM: PUSH TP,$TATOM
\r
3837 PUSH TP,EQUOTE NEGATIVE-ARG-TO-ITUPLE
\r
3840 WTY1TP: PUSH TP,$TATOM
\r
3841 PUSH TP,EQUOTE FIRST-ARG-TO-ITUPLE-NOT-FIX
\r
3844 UNBOU: PUSH TP,$TATOM
\r
3845 PUSH TP,EQUOTE UNBOUND-VARIABLE
\r
3848 UNAS: PUSH TP,$TATOM
\r
3849 PUSH TP,EQUOTE UNASSIGNED-VARIABLE
\r
3854 PUSH TP,EQUOTE BAD-ENVIRONMENT
\r
3859 PUSH TP,EQUOTE BAD-FUNARG
\r
3877 MPD: PUSH TP,$TATOM
\r
3878 PUSH TP,EQUOTE MEANINGLESS-PARAMETER-DECLARATION
\r
3881 NOBODY: PUSH TP,$TATOM
\r
3882 PUSH TP,EQUOTE HAS-EMPTY-BODY
\r
3885 BADCLS: PUSH TP,$TATOM
\r
3886 PUSH TP,EQUOTE BAD-CLAUSE
\r
3889 NXTAG: PUSH TP,$TATOM
\r
3890 PUSH TP,EQUOTE NON-EXISTENT-TAG
\r
3893 NXPRG: PUSH TP,$TATOM
\r
3894 PUSH TP,EQUOTE NOT-IN-PROG
\r
3898 NAPT: PUSH TP,$TATOM
\r
3899 PUSH TP,EQUOTE NON-APPLICABLE-TYPE
\r
3902 NONEVT: PUSH TP,$TATOM
\r
3903 PUSH TP,EQUOTE NON-EVALUATEABLE-TYPE
\r
3907 NONATM: PUSH TP,$TATOM
\r
3908 PUSH TP,EQUOTE NON-ATOMIC-ARGUMENT
\r
3912 ILLFRA: PUSH TP,$TATOM
\r
3913 PUSH TP,EQUOTE FRAME-NO-LONGER-EXISTS
\r
3916 ILLSEG: PUSH TP,$TATOM
\r
3917 PUSH TP,EQUOTE ILLEGAL-SEGMENT
\r
3920 BADMAC: PUSH TP,$TATOM
\r
3921 PUSH TP,EQUOTE BAD-USE-OF-MACRO
\r
3924 BADFSB: PUSH TP,$TATOM
\r
3925 PUSH TP,EQUOTE APPLY-OR-STACKFORM-OF-FSUBR
\r
3929 ER1ARG: PUSH TP,(AB)
\r