mirror of
https://github.com/PDP-10/its.git
synced 2026-03-01 01:39:15 +00:00
Looking at the backup dates for files in <mdl.int>, mdl106.exe is from 20th January 1981, whereas some of the source files are from a couple of years later. Revert to the last version prior to 20th January 1981 -- in every case, this was the earliest revision that was kept in <mdl.int>. This undoes the changes that we'd previously made to these files, many of which are no longer necessary now that we're using MIDAS 73.
4211 lines
82 KiB
Plaintext
4211 lines
82 KiB
Plaintext
TITLE EVAL -- MUDDLE EVALUATOR
|
||
|
||
RELOCATABLE
|
||
|
||
; GERALD JAY SUSSMAN, 1971. REWRITTEN MANY TIMES SINCE C. REEVE (1972--1974)
|
||
|
||
|
||
.GLOBAL BINDID,LPROG,GLOBSP,GLOBASE,SPBASE,TPBASE,PTIME,SWAP,CHFRAM
|
||
.GLOBAL IGVAL,CHKARG,NXTDCL,TPOVFL,CHFRM,PROCHK,CHFSWP,VECBOT,TYPSGR
|
||
.GLOBAL ILVAL,ER1ARG,SPECBIND,MAKACT,SPECSTORE,MAKTUP,TPALOC,IBIND,SSPECS
|
||
.GLOBAL IDVAL,EVECTO,EUVECT,CHARGS,BCKTRK,CELL,ILOC,IGLOC,CHKDCL,SSPEC1
|
||
.GLOBAL PDLBUF,MESS,FACTI,CHKARG,MAKENV,PSTAT,BNDV,UNBOU,UNAS,IGDECL
|
||
.GLOBAL 1STEPR,SEGMNT,SEGLST,NAPT,EVTYPE,EVATYP,APTYPE,APLTYP,APLQ,IDVAL1
|
||
.GLOBAL TESTR,VALG,TYPG,INCR1,TMATCH,TYPMIS,SAT,MAKACT,NTPALO,SPECBND
|
||
.GLOBAL TPGROW,CHKAB,TYPSEG,NXTLM,MONCH0,CHFINI,RMONC0,IMPURIFY,ICONS,INCONS
|
||
.GLOBAL CILVAL,CISET,CIGVAL,CSETG,MAPPLY,CLLOC,CGLOC,CASSQ,CGASSQ,CBOUND
|
||
.GLOBAL IIGLOC,CHUNW,IUNWIN,UNWIN2,SPCCHK,CURFCN,TMPLNT,TD.LNT,TBINIT
|
||
.GLOBAL SPECBE,BSETG,GLOTOP,CANDP,CORP,TFA,TMA,DSTORE,PVSTOR,SPSTOR
|
||
.GLOBAL AGC,GVLINC,LVLINC,CGBOUN,IEVECT,MAKTU2,STOSTR,HIBOT,POPUNW,ISTRUC
|
||
|
||
.INSRT MUDDLE >
|
||
|
||
MONITOR
|
||
|
||
|
||
; ENTRY TO EXPAND A MACRO
|
||
|
||
MFUNCTION EXPAND,SUBR
|
||
|
||
ENTRY 1
|
||
|
||
MOVE PVP,PVSTOR+1
|
||
MOVEI A,PVLNT*2+1(PVP)
|
||
HRLI A,TFRAME
|
||
MOVE B,TBINIT+1(PVP)
|
||
HLL B,OTBSAV(B)
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVEI B,-1(TP)
|
||
JRST AEVAL2
|
||
|
||
; MAIN EVAL ENTRANCE
|
||
|
||
IMFUNCTION EVAL,SUBR
|
||
|
||
ENTRY
|
||
|
||
MOVE PVP,PVSTOR+1
|
||
SKIPE C,1STEPR+1(PVP) ; BEING 1 STEPPED?
|
||
JRST 1STEPI ; YES HANDLE
|
||
EVALON: HLRZ A,AB ;GET NUMBER OF ARGS
|
||
CAIE A,-2 ;EXACTLY 1?
|
||
JRST AEVAL ;EVAL WITH AN ALIST
|
||
SEVAL: GETYP A,(AB) ;GET TYPE OF ARG
|
||
SKIPE C,EVATYP+1 ; USER TYPE TABLE?
|
||
JRST EVDISP
|
||
SEVAL1: CAIG A,NUMPRI ;PRIMITIVE?
|
||
JRST SEVAL2 ;YES-DISPATCH
|
||
|
||
SELF: MOVE A,(AB) ;TYPES WHICH EVALUATE
|
||
MOVE B,1(AB)
|
||
JRST EFINIS ;TO SELF-EG NUMBERS
|
||
|
||
SEVAL2: HRRO A,EVTYPE(A)
|
||
JRST (A)
|
||
|
||
; HERE FOR USER EVAL DISPATCH
|
||
|
||
EVDISP: ADDI C,(A) ; POINT TO SLOT
|
||
ADDI C,(A)
|
||
SKIPE (C) ; SKIP EITHER A LOSER OR JRST DISP
|
||
JRST EVDIS1 ; APPLY EVALUATOR
|
||
SKIPN C,1(C) ; GET ADDR OR GO TO PURE DISP
|
||
JRST SEVAL1
|
||
JRST (C)
|
||
|
||
EVDIS1: PUSH TP,(C)
|
||
PUSH TP,1(C)
|
||
PUSH TP,(AB)
|
||
PUSH TP,1(AB)
|
||
MCALL 2,APPLY ; APPLY HACKER TO OBJECT
|
||
JRST EFINIS
|
||
|
||
|
||
; EVAL DISPATCH TABLE
|
||
|
||
IF2,SELFS==400000,,SELF
|
||
|
||
DISTBL EVTYPE,SELFS,[[TFORM,EVFORM],[TLIST,EVLIST],[TVEC,EVECT],[TUVEC,EUVEC]
|
||
[TSEG,ILLSEG]]
|
||
|
||
|
||
;WATCH FOR SUBTLE BUG 43 LERR,LPROG OR BINDID
|
||
AEVAL:
|
||
CAIE A,-4 ;EXACTLY 2 ARGS?
|
||
JRST WNA ;NO-ERROR
|
||
GETYP A,2(AB) ;CHECK THAT WE HAVE A FRAME
|
||
CAIE A,TACT
|
||
CAIN A,TFRAME
|
||
JRST .+3
|
||
CAIE A,TENV
|
||
JRST TRYPRO ; COULD BE PROCESS
|
||
MOVEI B,2(AB) ; POINT TO FRAME
|
||
AEVAL2: PUSHJ P,CHENV ; HACK ENVIRONMENT CHANGE
|
||
AEVAL1: PUSH TP,(AB)
|
||
PUSH TP,1(AB)
|
||
MCALL 1,EVAL
|
||
AEVAL3: HRRZ 0,FSAV(TB)
|
||
CAIN 0,EVAL
|
||
JRST EFINIS
|
||
JRST FINIS
|
||
|
||
TRYPRO: CAIE A,TPVP ; SKIP IF IT IS A PROCESS
|
||
JRST WTYP2
|
||
MOVE C,3(AB) ; GET PROCESS
|
||
CAMN C,PVSTOR ; DIFFERENT FROM ME?
|
||
JRST SEVAL ; NO, NORMAL EVAL WINS
|
||
MOVE B,SPSTO+1(C) ; GET SP FOR PROCESS
|
||
MOVE D,TBSTO+1(C) ; GET TOP FRAME
|
||
HLL D,OTBSAV(D) ; TIME IT
|
||
MOVEI C,PVLNT*2+1(C) ; CONS UP POINTER TO PROC DOPE WORD
|
||
HRLI C,TFRAME ; LOOK LIK E A FRAME
|
||
PUSHJ P,SWITSP ; SPLICE ENVIRONMENT
|
||
JRST AEVAL1
|
||
|
||
; ROUTINE TO CHANGE LOOK UP PATH FOR BINDINGS
|
||
|
||
CHENV: PUSHJ P,CHFRM ; CHECK OUT FRAME
|
||
MOVE C,(B) ; POINT TO PROCESS
|
||
MOVE D,1(B) ; GET TB POINTER FROM FRAME
|
||
CAMN SP,SPSAV(D) ; CHANGE?
|
||
POPJ P, ; NO, JUST RET
|
||
MOVE B,SPSAV(D) ; GET SP OF INTEREST
|
||
SWITSP: MOVSI 0,TSKIP ; SET UP SKIP
|
||
HRRI 0,1(TP) ; POINT TO UNBIND PATH
|
||
MOVE A,PVSTOR+1
|
||
ADD A,[BINDID,,BINDID] ; BIND THE BINDING ID
|
||
PUSH TP,BNDV
|
||
PUSH TP,A
|
||
PUSH TP,$TFIX
|
||
AOS A,PTIME ; NEW ID
|
||
PUSH TP,A
|
||
MOVE E,TP ; FOR SPECBIND
|
||
PUSH TP,0
|
||
PUSH TP,B
|
||
PUSH TP,C ; SAVE PROCESS
|
||
PUSH TP,D
|
||
PUSHJ P,SPECBE ; BIND BINDID
|
||
MOVE SP,TP ; GET NEW SP
|
||
SUB SP,[3,,3] ; SET UP SP FORK
|
||
MOVEM SP,SPSTOR+1
|
||
POPJ P,
|
||
|
||
|
||
; HERE TO EVALUATE A FORM (99% OF EVAL'S WORK)
|
||
|
||
EVFORM: SKIPN C,1(AB) ; EMPTY FORM, RETURN FALSE
|
||
JRST EFALSE
|
||
GETYP A,(C) ; 1ST ELEMENT OF FORM
|
||
CAIE A,TATOM ; ATOM?
|
||
JRST EV0 ; NO, EVALUATE IT
|
||
MOVE B,1(C) ; GET ATOM
|
||
PUSHJ P,IGVAL ; GET ITS GLOBAL VALUE
|
||
|
||
; SPECIAL HACK TO SPEED UP LVAL AND GVAL CALLS
|
||
|
||
CAIE B,LVAL
|
||
CAIN B,GVAL
|
||
JRST ATMVAL ; FAST ATOM VALUE
|
||
|
||
GETYP 0,A
|
||
CAIE 0,TUNBOU ; BOUND?
|
||
JRST IAPPLY ; YES APPLY IT
|
||
|
||
MOVE C,1(AB) ; LOOK FOR LOCAL
|
||
MOVE B,1(C)
|
||
PUSHJ P,ILVAL
|
||
GETYP 0,A
|
||
CAIE 0,TUNBOU
|
||
JRST IAPPLY ; WIN, GO APPLY IT
|
||
|
||
PUSH TP,$TATOM
|
||
PUSH TP,EQUOTE UNBOUND-VARIABLE
|
||
PUSH TP,$TATOM
|
||
MOVE C,1(AB) ; FORM BACK
|
||
PUSH TP,1(C)
|
||
PUSH TP,$TATOM
|
||
PUSH TP,IMQUOTE VALUE
|
||
MCALL 3,ERROR ; REPORT THE ERROR
|
||
JRST IAPPLY
|
||
|
||
EFALSE: MOVSI A,TFALSE ; SPECIAL FALSE FOR EVAL OF EMPTY FORM
|
||
MOVEI B,0
|
||
JRST EFINIS
|
||
|
||
ATMVAL: HRRZ D,(C) ; CDR THE FORM
|
||
HRRZ 0,(D) ; AND AGAIN
|
||
JUMPN 0,IAPPLY
|
||
GETYP 0,(D) ; MAKE SURE APPLYING TO ATOM
|
||
CAIE 0,TATOM
|
||
JRST IAPPLY
|
||
MOVEI E,IGVAL ; ASSUME GLOBAAL
|
||
CAIE B,GVAL ; SKIP IF OK
|
||
MOVEI E,ILVAL ; ELSE USE LOCAL
|
||
PUSH P,B ; SAVE SUBR
|
||
MOVE B,(D)+1 ; CLR BUG #1637 (GET THE ATOM FOR THE SUBR)
|
||
PUSHJ P,(E) ; AND GET VALUE
|
||
CAME A,$TUNBOU
|
||
JRST EFINIS ; RETURN FROM EVAL
|
||
POP P,B
|
||
MOVSI A,TSUBR ; CAUSE REAL SUBR TO GET EROR
|
||
JRST IAPPLY
|
||
|
||
; HERE FOR 1ST ELEMENT NOT A FORM
|
||
|
||
EV0: PUSHJ P,FASTEV ; EVAL IT
|
||
|
||
; HERE TO APPLY THINGS IN FORMS
|
||
|
||
IAPPLY: PUSH TP,(AB) ; SAVE THE FORM
|
||
PUSH TP,1(AB)
|
||
PUSH TP,A
|
||
PUSH TP,B ; SAVE THE APPLIER
|
||
PUSH TP,$TFIX ; AND THE ARG GETTER
|
||
PUSH TP,[ARGCDR]
|
||
PUSHJ P,APLDIS ; GO TO INTERNAL APPLIER
|
||
JRST EFINIS ; LEAVE EVAL
|
||
|
||
; HERE TO EVAL 1ST ELEMENT OF A FORM
|
||
|
||
FASTEV: MOVE PVP,PVSTOR+1
|
||
SKIPE 1STEPR+1(PVP) ; BEING 1 STEPPED?
|
||
JRST EV02 ; YES, LET LOSER SEE THIS EVAL
|
||
GETYP A,(C) ; GET TYPE
|
||
SKIPE D,EVATYP+1 ; USER TABLE?
|
||
JRST EV01 ; YES, HACK IT
|
||
EV03: CAIG A,NUMPRI ; SKIP IF SELF
|
||
SKIPA A,EVTYPE(A) ; GET DISPATCH
|
||
MOVEI A,SELF ; USE SLEF
|
||
|
||
EV04: CAIE A,SELF ; IF EVAL'S TO SELF, JUST USE IT
|
||
JRST EV02
|
||
MOVSI A,TLIST
|
||
MOVE PVP,PVSTOR+1
|
||
MOVEM A,CSTO(PVP)
|
||
INTGO
|
||
SETZM CSTO(PVP)
|
||
HLLZ A,(C) ; GET IT
|
||
MOVE B,1(C)
|
||
JSP E,CHKAB ; CHECK DEFERS
|
||
POPJ P, ; AND RETURN
|
||
|
||
EV01: ADDI D,(A) ; POINT TO SLOT OF USER EVAL TABLE
|
||
ADDI D,(A)
|
||
SKIPE (D) ; EITHER NOT GIVEN OR SIMPLE
|
||
JRST EV02
|
||
SKIPN 1(D) ; SKIP IF SIMPLE
|
||
JRST EV03 ; NOT GIVEN
|
||
MOVE A,1(D)
|
||
JRST EV04
|
||
|
||
EV02: PUSH TP,(C)
|
||
HLLZS (TP) ; FIX UP LH
|
||
PUSH TP,1(C)
|
||
JSP E,CHKARG
|
||
MCALL 1,EVAL
|
||
POPJ P,
|
||
|
||
|
||
; MAPF/MAPR CALL TO APPLY
|
||
|
||
IMQUOTE APPLY
|
||
|
||
MAPPLY: JRST APPLY
|
||
|
||
; APPLY, FALLS INTO EVAL'S APPLY CODE AT APLDIS
|
||
|
||
IMFUNCTION APPLY,SUBR
|
||
|
||
ENTRY
|
||
|
||
JUMPGE AB,TFA ; MUST BE AT LEAST 1 ARGUMENT
|
||
MOVE A,AB
|
||
ADD A,[2,,2]
|
||
PUSH TP,$TAB
|
||
PUSH TP,A
|
||
PUSH TP,(AB) ; SAVE FCN
|
||
PUSH TP,1(AB)
|
||
PUSH TP,$TFIX ; AND ARG GETTER
|
||
PUSH TP,[SETZ APLARG]
|
||
PUSHJ P,APLDIS
|
||
JRST FINIS
|
||
|
||
; STACKFROM, ALSO FALLS INTO EVAL'S APPLIER AT APLDIS
|
||
|
||
IMFUNCTION STACKFORM,FSUBR
|
||
|
||
ENTRY 1
|
||
|
||
GETYP A,(AB)
|
||
CAIE A,TLIST
|
||
JRST WTYP1
|
||
MOVEI A,3 ; CHECK ALL GOODIES SUPPLIED
|
||
HRRZ B,1(AB)
|
||
|
||
JUMPE B,TFA
|
||
HRRZ B,(B) ; CDR IT
|
||
SOJG A,.-2
|
||
|
||
HRRZ C,1(AB) ; GET LIST BACK
|
||
PUSHJ P,FASTEV ; DO A FAST EVALUATION
|
||
PUSH TP,(AB)
|
||
HRRZ C,@1(AB) ; POINT TO ARG GETTING FORMS
|
||
PUSH TP,C
|
||
PUSH TP,A ; AND FCN
|
||
PUSH TP,B
|
||
PUSH TP,$TFIX
|
||
PUSH TP,[SETZ EVALRG]
|
||
PUSHJ P,APLDIS
|
||
JRST FINIS
|
||
|
||
|
||
; OFFSETS FOR TEMPORARIES ETC. USED IN APPLYING STUFF
|
||
|
||
E.FRM==0 ; POINTS TO FORM BEING EVALED (OR ARGS FOR APPLY STACKFORM)
|
||
E.FCN==2 ; FUNCTION/SUBR/RSUBR BEING APPLIED
|
||
E.ARG==4 ; POINTS TO ARG GETTING ROUTINE (<0 => MUST EVAL ARGS)
|
||
E.EXTR==6 ; CONTAINS 1ST ARG IN USER APPLY CASE
|
||
E.SEG==10 ; POINTS TO SEGMENT IN FORM BEING HACKED
|
||
E.CNT==12 ; COUNTER FOR TUPLES OF ARGS
|
||
E.DECL==14 ; POINTS TO DECLARATION LIST IN FUNCTIONS
|
||
E.ARGL==16 ; POINTS TO ARG LIST IN FUNCTIONS
|
||
E.HEW==20 ; POINTS TO HEWITT ATOM IF IT EXISTS
|
||
|
||
E.VAL==E.ARGL ; VALUE TYPE FOR RSUBRS
|
||
|
||
MINTM==E.EXTR+2 ; MIN # OF TEMPS EVER ALLOCATED
|
||
E.TSUB==E.CNT+2 ; # OF TEMPS FOR SUBR/NUMBER APPLICATION
|
||
XP.TMP==E.HEW-E.EXTR ; # EXTRA TEMPS FOR FUNCTION APPLICATION
|
||
R.TMP==4 ; TEMPS AFTER ARGS ARE BOUND
|
||
TM.OFF==E.HEW+2-R.TMP ; TEMPS TO FLUSH AFTER BIND OF ARGS
|
||
|
||
RE.FCN==0 ; AFTER BINDING CONTAINS FCN BODY
|
||
RE.ARG==2 ; ARG LIST AFTER BINDING
|
||
|
||
; GENERAL THING APPLYER
|
||
|
||
APLDIS: PUSH TP,[0] ; SLOT USED FOR USER APPLYERS
|
||
PUSH TP,[0]
|
||
APLDIX: GETYP A,E.FCN(TB) ; GET TYPE
|
||
|
||
APLDI: SKIPE D,APLTYP+1 ; USER TABLE EXISTS?
|
||
JRST APLDI1 ; YES, USE IT
|
||
APLDI2: CAILE A,NUMPRI ; SKIP IF NOT PRIM
|
||
JRST NAPT
|
||
HRRO A,APTYPE(A)
|
||
JRST (A)
|
||
|
||
APLDI1: ADDI D,(A) ; POINT TO SLOT
|
||
ADDI D,(A)
|
||
SKIPE (D) ; SKIP IF NOT GIVEN OR STANDARD
|
||
JRST APLDI3
|
||
APLDI4: SKIPE D,1(D) ; GET DISP
|
||
JRST (D)
|
||
JRST APLDI2 ; USE SYSTEM DISPATCH
|
||
|
||
APLDI3: SKIPE E.EXTR+1(TB) ; SKIP IF HAVEN'T BEEN HERE BEFORE
|
||
JRST APLDI4
|
||
MOVE A,(D) ; GET ITS HANDLER
|
||
EXCH A,E.FCN(TB) ; AND USE AS FCN
|
||
MOVEM A,E.EXTR(TB) ; SAVE
|
||
MOVE A,1(D)
|
||
EXCH A,E.FCN+1(TB)
|
||
MOVEM A,E.EXTR+1(TB) ; STASH OLD FCN AS EXTRG
|
||
GETYP A,(D) ; GET TYPE
|
||
JRST APLDI
|
||
|
||
|
||
; APPLY DISPATCH TABLE
|
||
|
||
DISTBL APTYPE,<SETZ NAPTL>,[[TSUBR,APSUBR],[TFSUBR,APFSUB],[TRSUBR,APRSUB],[TFIX,APNUM]
|
||
[TEXPR,APEXPR],[TFUNAR,APFUNARG],[TENTER,APENTR],[TMACRO,APMACR],[TOFFS,APNUM]]
|
||
|
||
; SUBR TO SAY IF TYPE IS APPLICABLE
|
||
|
||
MFUNCTION APPLIC,SUBR,[APPLICABLE?]
|
||
|
||
ENTRY 1
|
||
|
||
GETYP A,(AB)
|
||
PUSHJ P,APLQ
|
||
JRST IFALSE
|
||
JRST TRUTH
|
||
|
||
; HERE TO DETERMINE IF A TYPE IS APPLICABLE
|
||
|
||
APLQ: PUSH P,B
|
||
SKIPN B,APLTYP+1
|
||
JRST USEPUR ; USE PURE TABLE
|
||
ADDI B,(A)
|
||
ADDI B,(A) ; POINT TO SLOT
|
||
SKIPG 1(B) ; SKIP IF WINNER
|
||
SKIPE (B) ; SKIP IF POTENIAL LOSER
|
||
JRST CPPJ1B ; WIN
|
||
SKIPE 1(B) ; SKIP IF MUST USE PURE TABBLE
|
||
JRST CPOPJB
|
||
USEPUR: CAILE A,NUMPRI ; SKIP IF NOT PRIM
|
||
JRST CPOPJB
|
||
SKIPL APTYPE(A) ; SKIP IF APLLICABLE
|
||
CPPJ1B: AOS -1(P)
|
||
CPOPJB: POP P,B
|
||
POPJ P,
|
||
|
||
; FSUBR APPLYER
|
||
|
||
APFSUBR:
|
||
SKIPN E.EXTR(TB) ; IF EXTRA ARG
|
||
SKIPGE E.ARG+1(TB) ; OR APPLY/STACKFORM, LOSE
|
||
JRST BADFSB
|
||
MOVE A,E.FCN+1(TB) ; GET FCN
|
||
HRRZ C,@E.FRM+1(TB) ; GET ARG LIST
|
||
SUB TP,[MINTM,,MINTM] ; FLUSH UNWANTED TEMPS
|
||
PUSH TP,$TLIST
|
||
PUSH TP,C ; ARG TO STACK
|
||
.MCALL 1,(A) ; AND CALL
|
||
POPJ P, ; AND LEAVE
|
||
|
||
; SUBR APPLYER
|
||
|
||
APSUBR:
|
||
PUSHJ P,PSH4ZR ; SET UP ZEROED SLOTS
|
||
SKIPG E.ARG+1(TB)
|
||
AOS E.CNT(TB) ; INDICATES IF MUST EVAL ARGS
|
||
MOVSI A,400000 ; MAKE SURE OF GOOD INDIRECT
|
||
IORM A,E.ARG+1(TB)
|
||
SKIPN A,E.EXTR(TB) ; FUNNY ARGS
|
||
JRST APSUB1 ; NO, GO
|
||
MOVE B,E.EXTR+1(TB) ; YES , GET VAL
|
||
JRST APSUB2 ; AND FALL IN
|
||
|
||
APSUB1: PUSHJ P,@E.ARG+1(TB) ; EAT AN ARG
|
||
JRST APSUBD ; DONE
|
||
APSUB2: PUSH TP,A
|
||
PUSH TP,B
|
||
AOS E.CNT+1(TB) ; COUNT IT
|
||
JRST APSUB1
|
||
|
||
APSUBD: MOVE A,E.CNT+1(TB) ; FINISHED, GET COUNT
|
||
MOVE B,E.FCN+1(TB) ; AND SUBR
|
||
GETYP 0,E.FCN(TB)
|
||
CAIN 0,TENTER
|
||
JRST APENDN
|
||
PUSHJ P,BLTDN ; FLUSH CRUFT
|
||
.ACALL A,(B)
|
||
POPJ P,
|
||
|
||
BLTDN: MOVEI C,(TB) ; POINT TO DEST
|
||
HRLI C,E.TSUB(C) ; AND SOURCE
|
||
BLT C,-E.TSUB(TP) ;BL..............T
|
||
SUB TP,[E.TSUB,,E.TSUB]
|
||
POPJ P,
|
||
|
||
APENDN: PUSHJ P,BLTDN
|
||
APNDN1: .ECALL A,(B)
|
||
POPJ P,
|
||
|
||
; FLAGS FOR RSUBR HACKER
|
||
|
||
F.STR==1
|
||
F.OPT==2
|
||
F.QUO==4
|
||
F.NFST==10
|
||
|
||
; APPLY OBJECTS OF TYPE RSUBR
|
||
|
||
APENTR:
|
||
APRSUBR:
|
||
MOVE C,E.FCN+1(TB) ; GET THE RSUBR
|
||
CAML C,[-5,,] ; IS IT LONG ENOUGH FOR DECLS
|
||
JRST APSUBR ; NO TREAT AS A SUBR
|
||
GETYP 0,4(C) ; GET TYPE OF 3D ELEMENT
|
||
CAIE 0,TDECL ; DECLARATION?
|
||
JRST APSUBR ; NO, TREAT AS SUBR
|
||
PUSHJ P,PSH4ZR ; ALLOCATE SOME EXTRA ROOM
|
||
PUSH TP,$TDECL ; PUSH UP THE DECLS
|
||
PUSH TP,5(C)
|
||
PUSH TP,$TLOSE ; SAVE ROOM FOR VAL DECL
|
||
PUSH TP,[0]
|
||
SKIPG E.ARG+1(TB)
|
||
AOS E.CNT(TB) ; INDICATES IF MUST EVAL ARGS
|
||
MOVSI A,400000 ; MAKE SURE OF GOOD INDIRECT
|
||
IORM A,E.ARG+1(TB)
|
||
|
||
SKIPN E.EXTR(TB) ; "EXTRA" ARG?
|
||
JRST APRSU1 ; NO,
|
||
MOVE 0,[SETZ EXTRGT] ; CHANGE THE ACCESS FCN
|
||
EXCH 0,E.ARG+1(TB)
|
||
HRRM 0,E.ARG(TB) ; REMEMBER IT
|
||
|
||
APRSU1: MOVEI 0,0 ; INIT FLAG REGISTER
|
||
PUSH P,0 ; SAVE
|
||
|
||
APRSU2: HRRZ A,E.DECL+1(TB) ; GET DECL LIST
|
||
JUMPE A,APRSU3 ; DONE!
|
||
HRRZ B,(A) ; CDR IT
|
||
MOVEM B,E.DECL+1(TB)
|
||
PUSHJ P,NXTDCL ; IS NEXT THING A STRING?
|
||
JRST APRSU4 ; NO, BETTER BE A TYPE
|
||
CAMN B,[ASCII /VALUE/]
|
||
JRST RSBVAL ; SAVE VAL DECL
|
||
TRON 0,F.NFST ; IF NOT FIRST, LOSE
|
||
CAME B,[ASCII /CALL/] ; CALL DECL
|
||
JRST APRSU7
|
||
SKIPE E.CNT(TB) ; LEGAL?
|
||
JRST MPD
|
||
MOVE C,E.FRM(TB)
|
||
MOVE D,E.FRM+1(TB) ; GET FORM
|
||
JRST APRS10 ; HACK IT
|
||
|
||
APRSU5: TROE 0,F.STR ; STRING STRING?
|
||
JRST MPD ; LOSER
|
||
CAMN B,[<ASCII /OPT/>]
|
||
JRST .+3
|
||
CAME B,[<ASCII /OPTIO/>+1] ; OPTIONA?
|
||
JRST APRSU8
|
||
TROE 0,F.OPT ; CHECK AND SET
|
||
JRST MPD ; OPTINAL OPTIONAL LOSES
|
||
JRST APRSU2 ; TO MAIN LOOP
|
||
|
||
APRSU7: CAME B,[ASCII /QUOTE/]
|
||
JRST APRSU5
|
||
TRO 0,F.STR
|
||
TROE 0,F.QUO ; TURN ON AND CHECK QUOTE
|
||
JRST MPD ; QUOTE QUOTE LOSES
|
||
JRST APRSU2 ; GO TO END OF LOOP
|
||
|
||
|
||
APRSU8: CAME B,[ASCII /ARGS/]
|
||
JRST APRSU9
|
||
SKIPE E.CNT(TB) ; SKIP IF LEGAL
|
||
JRST MPD
|
||
HRRZ D,@E.FRM+1(TB) ; GET ARG LIST
|
||
MOVSI C,TLIST
|
||
|
||
APRS10: HRRZ A,(A) ; GET THE DECL
|
||
MOVEM A,E.DECL+1(TB) ; CLOBBER
|
||
HRRZ B,(A) ; CHECK FOR TOO MUCH
|
||
JUMPN B,MPD
|
||
MOVE B,1(A) ; GET DECL
|
||
HLLZ A,(A) ; GOT THE DECL
|
||
MOVEM 0,(P) ; SAVE FLAGS
|
||
JSP E,CHKAB ; CHECK DEFER
|
||
PUSH TP,C
|
||
PUSH TP,D ; SAVE
|
||
PUSHJ P,TMATCH
|
||
JRST WTYP
|
||
AOS E.CNT+1(TB) ; COUNT ARG
|
||
JRST APRDON ; GO CALL RSUBR
|
||
|
||
RSBVAL: HRRZ A,E.DECL+1(TB) ; GET DECL
|
||
JUMPE A,MPD
|
||
HRRZ B,(A) ; POINT TO DECL
|
||
MOVEM B,E.DECL+1(TB) ; SAVE NEW DECL POINTER
|
||
PUSHJ P,NXTDCL
|
||
JRST .+2
|
||
JRST MPD
|
||
MOVEM A,E.VAL+1(TB) ; SAVE VAL DECL
|
||
MOVSI A,TDCLI
|
||
MOVEM A,E.VAL(TB) ; SET ITS TYPE
|
||
JRST APRSU2
|
||
|
||
|
||
APRSU9: CAME B,[ASCII /TUPLE/]
|
||
JRST MPD
|
||
MOVEM 0,(P) ; SAVE FLAGS
|
||
HRRZ A,(A) ; CDR DECLS
|
||
MOVEM A,E.DECL+1(TB)
|
||
HRRZ B,(A)
|
||
JUMPN B,MPD ; LOSER
|
||
PUSH P,[0] ; COUNT ELEMENTS IN TUPLE
|
||
|
||
APRTUP: PUSHJ P,@E.ARG+1(TB) ; GOBBLE ARGS
|
||
JRST APRTPD ; DONE
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
AOS (P) ; COUNT IT
|
||
JRST APRTUP ; AND GO
|
||
|
||
APRTPD: POP P,C ; GET COUNT
|
||
ADDM C,E.CNT+1(TB) ; UPDATE MAIN COUNT
|
||
ASH C,1 ; # OF WORDS
|
||
HRLI C,TINFO ; BUILD FENCE POST
|
||
PUSH TP,C
|
||
PUSHJ P,TBTOTP ; GEN REL OFFSET TO TOP
|
||
PUSH TP,D
|
||
HRROI D,-1(TP) ; POINT TO TOP
|
||
SUBI D,(C) ; TO BASE
|
||
TLC D,-1(C)
|
||
MOVSI C,TARGS ; BUILD TYPE WORD
|
||
HLR C,OTBSAV(TB)
|
||
MOVE A,E.DECL+1(TB)
|
||
MOVE B,1(A)
|
||
HLLZ A,(A) ; TYPE/VAL
|
||
JSP E,CHKAB ; CHECK
|
||
PUSHJ P,TMATCH ; GOTO TYPE CHECKER
|
||
JRST WTYP
|
||
|
||
SUB TP,[2,,2] ; REMOVE FENCE POST
|
||
|
||
APRDON: SUB P,[1,,1] ; FLUSH CRUFT
|
||
MOVE A,E.CNT+1(TB) ; GET # OF ARGS
|
||
MOVE B,E.FCN+1(TB)
|
||
GETYP 0,E.FCN(TB) ; COULD BE ENTRY
|
||
MOVEI C,(TB) ; PREPARE TO BLT DOWN
|
||
HRLI C,E.TSUB+2(C)
|
||
BLT C,-E.TSUB+2(TP)
|
||
SUB TP,[E.TSUB+2,,E.TSUB+2]
|
||
CAIE 0,TRSUBR
|
||
JRST APNDNX
|
||
.ACALL A,(B) ; CALL THE RSUBR
|
||
JRST PFINIS
|
||
|
||
APNDNX: .ECALL A,(B)
|
||
JRST PFINIS
|
||
|
||
|
||
|
||
|
||
APRSU4: MOVEM 0,(P) ; SAVE FLAGS
|
||
MOVE B,1(A) ; GET DECL
|
||
HLLZ A,(A)
|
||
JSP E,CHKAB
|
||
MOVE 0,(P) ; RESTORE FLAGS
|
||
PUSH TP,A
|
||
PUSH TP,B ; AND SAVE
|
||
SKIPE E.CNT(TB) ; ALREADY EVAL'D
|
||
JRST APREV0
|
||
TRZN 0,F.QUO
|
||
JRST APREVA ; MUST EVAL ARG
|
||
MOVEM 0,(P)
|
||
HRRZ C,@E.FRM+1(TB) ; GET ARG?
|
||
TRNE 0,F.OPT ; OPTIONAL
|
||
JUMPE C,APRDN
|
||
JUMPE C,TFA ; NO, TOO FEW ARGS
|
||
MOVEM C,E.FRM+1(TB)
|
||
HLLZ A,(C) ; GET ARG
|
||
MOVE B,1(C)
|
||
JSP E,CHKAB ; CHECK THEM
|
||
|
||
APRTYC: MOVE C,A ; SET UP FOR TMATCH
|
||
MOVE D,B
|
||
EXCH B,(TP)
|
||
EXCH A,-1(TP) ; SAVE STUFF
|
||
APRS11: PUSHJ P,TMATCH ; CHECK TYPE
|
||
JRST WTYP
|
||
|
||
MOVE 0,(P) ; RESTORE FLAGS
|
||
TRZ 0,F.STR
|
||
AOS E.CNT+1(TB)
|
||
JRST APRSU2 ; AND GO ON
|
||
|
||
APREV0: TRNE 0,F.QUO ; ATTEMPT TO QUOTE ALREADY EVAL'D ARG ?
|
||
JRST MPD ; YES, LOSE
|
||
APREVA: PUSHJ P,@E.ARG+1(TB) ; EVAL ONE
|
||
TDZA C,C ; C=0 ==> NONE LEFT
|
||
MOVEI C,1
|
||
MOVE 0,(P) ; FLAGS
|
||
JUMPN C,APRTYC ; GO CHECK TYPE
|
||
APRDN: SUB TP,[2,,2] ; FLUSH DECL
|
||
TRNE 0,F.OPT ; OPTIONAL?
|
||
JRST APRDON ; ALL DONE
|
||
JRST TFA
|
||
|
||
APRSU3: TRNE 0,F.STR ; END IN STRING?
|
||
JRST MPD
|
||
PUSHJ P,@E.ARG+1(TB) ; SEE IF ANYMORE ARGS
|
||
JRST APRDON
|
||
JRST TMA
|
||
|
||
|
||
; STANDARD ARGUMENT GETTERS USED IN APPLYING THINGS
|
||
|
||
ARGCDR: HRRZ C,@E.FRM+1(TB) ; POINT TO ARGLIST (NOTE: POINTS 1 BEFORE WHERE ARG IS)
|
||
JUMPE C,CPOPJ ; LEAVE IF DONE
|
||
MOVEM C,E.FRM+1(TB)
|
||
GETYP 0,(C) ; GET TYPE OF ARG
|
||
CAIN 0,TSEG
|
||
JRST ARGCD1 ; SEG MENT HACK
|
||
PUSHJ P,FASTEV
|
||
JRST CPOPJ1
|
||
|
||
ARGCD1: PUSH TP,$TFORM ; PRETEND WE ARE A FORM
|
||
PUSH TP,1(C)
|
||
MCALL 1,EVAL
|
||
MOVEM A,E.SEG(TB)
|
||
MOVEM B,E.SEG+1(TB)
|
||
PUSHJ P,TYPSEG ; GET SEG TYPE CODE
|
||
HRRM C,E.ARG(TB) ; SAVE IT IN OBSCCURE PLACE
|
||
MOVE C,DSTORE ; FIX FOR TEMPLATE
|
||
MOVEM C,E.SEG(TB)
|
||
MOVE C,[SETZ SGARG]
|
||
MOVEM C,E.ARG+1(TB) ; SET NEW ARG GETTER
|
||
|
||
; FALL INTO SEGARG
|
||
|
||
SGARG: INTGO
|
||
HRRZ C,E.ARG(TB) ; SEG CODE TO C
|
||
MOVE D,E.SEG+1(TB)
|
||
MOVE A,E.SEG(TB)
|
||
MOVEM A,DSTORE
|
||
PUSHJ P,NXTLM ; GET NEXT ELEMENT
|
||
JRST SEGRG1 ; DONE
|
||
MOVEM D,E.SEG+1(TB)
|
||
MOVE D,DSTORE ; KEEP TYPE WINNING
|
||
MOVEM D,E.SEG(TB)
|
||
SETZM DSTORE
|
||
JRST CPOPJ1 ; RETURN
|
||
|
||
SEGRG1: SETZM DSTORE
|
||
MOVEI C,ARGCDR
|
||
HRRM C,E.ARG+1(TB) ; RESET ARG GETTER
|
||
JRST ARGCDR
|
||
|
||
; ARGUMENT GETTER FOR APPLY
|
||
|
||
APLARG: INTGO
|
||
SKIPL A,E.FRM+1(TB) ; ANY ARGS LEFT
|
||
POPJ P, ; NO, EXIT IMMEDIATELY
|
||
ADD A,[2,,2]
|
||
MOVEM A,E.FRM+1(TB)
|
||
MOVE B,-1(A) ; RET NEXT ARG
|
||
MOVE A,-2(A)
|
||
JRST CPOPJ1
|
||
|
||
; STACKFORM ARG GETTER
|
||
|
||
EVALRG: SKIPN C,@E.FRM+1(TB) ; ANY FORM?
|
||
POPJ P,
|
||
PUSHJ P,FASTEV
|
||
GETYP A,A ; CHECK FOR FALSE
|
||
CAIN A,TFALSE
|
||
POPJ P,
|
||
MOVE C,E.FRM+1(TB) ; GET OTHER FORM
|
||
PUSHJ P,FASTEV
|
||
JRST CPOPJ1
|
||
|
||
|
||
; HERE TO APPLY NUMBERS
|
||
|
||
APNUM: PUSHJ P,PSH4ZR ; TP SLOTS
|
||
SKIPN A,E.EXTR(TB) ; FUNNY ARG?
|
||
JRST APNUM1 ; NOPE
|
||
MOVE B,E.EXTR+1(TB) ; GET ARG
|
||
JRST APNUM2
|
||
|
||
APNUM1: PUSHJ P,@E.ARG+1(TB) ; GET ARG
|
||
JRST TFA
|
||
APNUM2: PUSH TP,A
|
||
PUSH TP,B
|
||
PUSH TP,E.FCN(TB)
|
||
PUSH TP,E.FCN+1(TB)
|
||
PUSHJ P,@E.ARG+1(TB)
|
||
JRST .+2
|
||
JRST APNUM3
|
||
PUSHJ P,BLTDN ; FLUSH JUNK
|
||
MCALL 2,NTH
|
||
POPJ P,
|
||
; HACK FOR TURNING <3 .FOO .BAR> INTO <PUT .FOO 3 .BAR>
|
||
APNUM3: PUSH TP,A
|
||
PUSH TP,B
|
||
PUSHJ P,@E.ARG+1(TB)
|
||
JRST .+2
|
||
JRST TMA
|
||
PUSHJ P,BLTDN
|
||
GETYP A,-5(TP)
|
||
PUSHJ P,ISTRUC ; STRUCTURED FIRST ARG?
|
||
JRST WTYP1
|
||
MCALL 3,PUT
|
||
POPJ P,
|
||
|
||
; HERE TO APPLY SUSSMAN FUNARGS
|
||
|
||
APFUNARG:
|
||
|
||
SKIPN C,E.FCN+1(TB)
|
||
JRST FUNERR
|
||
HRRZ D,(C) ; MUST BE AT LEAST 2 LONG
|
||
JUMPE D,FUNERR
|
||
GETYP 0,(D) ; CHECK FOR LIST
|
||
CAIE 0,TLIST
|
||
JRST FUNERR
|
||
HRRZ 0,(D) ; SHOULD BE END
|
||
JUMPN 0,FUNERR
|
||
GETYP 0,(C) ; 1ST MUST BE FCN
|
||
CAIE 0,TEXPR
|
||
JRST FUNERR
|
||
SKIPN C,1(C)
|
||
JRST NOBODY
|
||
PUSHJ P,APEXPF ; BIND THE ARGS AND AUX'S
|
||
HRRZ C,RE.FCN+1(TB) ; GET BODY OF FUNARG
|
||
MOVE B,1(C) ; GET FCN
|
||
MOVEM B,RE.FCN+1(TB) ; AND SAVE
|
||
HRRZ C,(C) ; CDR FUNARG BODY
|
||
MOVE C,1(C)
|
||
MOVSI 0,TLIST ; SET UP TYPE
|
||
MOVE PVP,PVSTOR+1
|
||
MOVEM 0,CSTO(PVP) ; FOR INTS TO WIN
|
||
|
||
FUNLP: INTGO
|
||
JUMPE C,DOF ; RUN IT
|
||
GETYP 0,(C)
|
||
CAIE 0,TLIST ; BETTER BE LIST
|
||
JRST FUNERR
|
||
PUSH TP,$TLIST
|
||
PUSH TP,C
|
||
PUSHJ P,NEXTDC ; GET POSSIBILITY
|
||
JRST FUNERR ; LOSER
|
||
CAIE A,2
|
||
JRST FUNERR
|
||
HRRZ B,(B) ; GET TO VALUE
|
||
MOVE C,(TP)
|
||
SUB TP,[2,,2]
|
||
PUSH TP,BNDA
|
||
PUSH TP,E
|
||
HLLZ A,(B) ; GET VAL
|
||
MOVE B,1(B)
|
||
JSP E,CHKAB ; HACK DEFER
|
||
PUSHJ P,PSHAB4 ; PUT VAL IN
|
||
HRRZ C,(C) ; CDR
|
||
JUMPN C,FUNLP
|
||
|
||
; HERE TO RUN FUNARG
|
||
|
||
DOF: MOVE PVP,PVSTOR+1
|
||
SETZM CSTO(PVP) ; DONT CONFUSE GC
|
||
PUSHJ P,SPECBIND ; BIND 'EM UP
|
||
JRST RUNFUN
|
||
|
||
|
||
|
||
; HERE TO DO MACROS
|
||
|
||
APMACR: HRRZ E,OTBSAV(TB)
|
||
HRRZ D,PCSAV(E) ; SEE WHERE FROM
|
||
CAIE D,EFCALL+1 ; 1STEP
|
||
JRST .+3
|
||
HRRZ E,OTBSAV(E)
|
||
HRRZ D,PCSAV(E)
|
||
CAIN D,AEVAL3 ; SKIP IF NOT RIGHT
|
||
JRST APMAC1
|
||
SKIPG E.ARG+1(TB) ; SKIP IF REAL FORM EXISTS
|
||
JRST BADMAC
|
||
MOVE A,E.FRM(TB)
|
||
MOVE B,E.FRM+1(TB)
|
||
SUB TP,[E.EXTR+2,,E.EXTR+2] ; FLUSH JUNK
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MCALL 1,EXPAND ; EXPAND THE MACRO
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MCALL 1,EVAL ; EVAL THE RESULT
|
||
POPJ P,
|
||
|
||
APMAC1: MOVE C,E.FCN+1(TB) ; GET MACRO BODY
|
||
GETYP A,(C)
|
||
MOVE B,1(C)
|
||
MOVSI A,(A)
|
||
JSP E,CHKAB ; FIX DEFERS
|
||
MOVEM A,E.FCN(TB)
|
||
MOVEM B,E.FCN+1(TB)
|
||
JRST APLDIX
|
||
|
||
; HERE TO APPLY EXPRS (FUNCTIONS)
|
||
|
||
APEXPR: PUSHJ P,APEXP ; BIND ARGS AND AUX'S
|
||
RUNFUN: HRRZ A,RE.FCN(TB) ; AMOUNT OF FCN TO SKIP
|
||
MOVEI C,RE.FCN+1(TB) ; POINT TO FCN
|
||
HRRZ C,(C) ; SKIP SOMETHING
|
||
SOJGE A,.-1 ; UNTIL 1ST FORM
|
||
MOVEM C,RE.FCN+1(TB) ; AND STORE
|
||
JRST DOPROG ; GO RUN PROGRAM
|
||
|
||
APEXP: SKIPN C,E.FCN+1(TB) ; CHECK FRO BODY
|
||
JRST NOBODY
|
||
APEXPF: PUSH P,[0] ; COUNT INIT CRAP
|
||
ADD TP,[XP.TMP,,XP.TMP] ; SLOTS FOR HACKING
|
||
SKIPL TP
|
||
PUSHJ P,TPOVFL
|
||
SETZM 1-XP.TMP(TP) ; ZERO OUT
|
||
MOVEI A,-XP.TMP+2(TP)
|
||
HRLI A,-1(A)
|
||
BLT A,(TP) ; ZERO SLOTS
|
||
SKIPG E.ARG+1(TB)
|
||
AOS E.CNT(TB) ; INDICATES IF MUST EVAL ARGS
|
||
MOVSI A,400000 ; MAKE E.ARG BE NEG FOR SAFE @ING
|
||
IORM A,E.ARG+1(TB)
|
||
PUSHJ P,CARATC ; SEE IF HEWITT ATOM EXISTS
|
||
JRST APEXP1 ; NO, GO LOOK FOR ARGLIST
|
||
MOVEM E,E.HEW+1(TB) ; SAVE ATOM
|
||
MOVSM 0,E.HEW(TB) ; AND TYPE
|
||
AOS (P) ; COUNT HEWITT ATOM
|
||
APEXP1: GETYP 0,(C) ; LOOK AT NEXT THING
|
||
CAIE 0,TLIST ; BETTER BE LIST!!!
|
||
JRST MPD.0 ; LOSE
|
||
MOVE B,1(C) ; GET LIST
|
||
MOVEM B,E.ARGL+1(TB) ; SAVE
|
||
MOVSM 0,E.ARGL(TB) ; WITH TYPE
|
||
HRRZ C,(C) ; CDR THE FCN
|
||
JUMPE C,NOBODY ; BODYLESS FCN
|
||
GETYP 0,(C) ; SEE IF DCL LIST SUPPLIED
|
||
CAIE 0,TDECL
|
||
JRST APEXP2 ; NO, START PROCESSING ARGS
|
||
AOS (P) ; COUNT DCL
|
||
MOVE B,1(C)
|
||
MOVEM B,E.DECL+1(TB)
|
||
MOVSM 0,E.DECL(TB)
|
||
HRRZ C,(C) ; CDR ON
|
||
JUMPE C,NOBODY
|
||
|
||
; CHECK FOR EXISTANCE OF EXTRA ARG
|
||
|
||
APEXP2: POP P,A ; GET COUNT
|
||
HRRM A,E.FCN(TB) ; AND SAVE
|
||
SKIPN E.EXTR(TB) ; SKIP IF FUNNY EXTRA ARG EXISTS
|
||
JRST APEXP3
|
||
MOVE 0,[SETZ EXTRGT]
|
||
EXCH 0,E.ARG+1(TB)
|
||
HRRM 0,E.ARG(TB) ; SAVE OLD GETTER AROUND
|
||
AOS E.CNT(TB)
|
||
|
||
; FALL THROUGH
|
||
|
||
; LOOK FOR "BIND" DECLARATION
|
||
|
||
APEXP3: PUSHJ P,UNPROG ; UNASSIGN LPROG IF NEC
|
||
APXP3A: SKIPN A,E.ARGL+1(TB) ; GET ARGLIST
|
||
JRST APEXP4 ; NONE, VERIFY NONE WERE GIVEN
|
||
PUSHJ P,NXTDCL ; SEE IF A DECL IS THERE
|
||
JRST BNDRG ; NO, GO BIND NORMAL ARGS
|
||
HRRZ C,(A) ; CDR THE DCLS
|
||
CAME B,[ASCII /BIND/]
|
||
JRST CH.CAL ; GO LOOK FOR "CALL"
|
||
PUSHJ P,CARTMC ; MUST BE AN ATOM
|
||
MOVEM C,E.ARGL+1(TB) ; AND SAVE CDR'D ARGS
|
||
PUSHJ P,MAKENV ; GENERATE AN ENVIRONMENT
|
||
PUSHJ P,PSBND1 ; PUSH THE BINDING AND CHECK THE DCL
|
||
JRST APXP3A ; IN CASE <"BIND" B "BIND" C......
|
||
|
||
|
||
; LOOK FOR "CALL" DCL
|
||
|
||
CH.CAL: CAME B,[ASCII /CALL/]
|
||
JRST CHOPT ; TRY SOMETHING ELSE
|
||
; SKIPG E.ARG+1(TB) ; DONT SKIP IF CANT WIN
|
||
SKIPE E.CNT(TB)
|
||
JRST MPD.2
|
||
PUSHJ P,CARTMC ; BETTER BE AN ATOM
|
||
MOVEM C,E.ARGL+1(TB)
|
||
MOVE A,E.FRM(TB) ; RETURN FORM
|
||
MOVE B,E.FRM+1(TB)
|
||
PUSHJ P,PSBND1 ; BIND AND CHECK
|
||
JRST APEXP5
|
||
|
||
; BIND NORMAL ARGS BY CALLING BNDEM1, RETURNS WHEN ALL DONE
|
||
|
||
BNDRG: PUSHJ P,BNDEM1 ; GO BIND THEM UP
|
||
TRNN A,4 ; SKIP IF HIT A DCL
|
||
JRST APEXP4 ; NOT A DCL, MUST BE DONE
|
||
|
||
; LOOK FOR "OPTIONAL" DECLARATION
|
||
|
||
CHOPT: CAMN B,[<ASCII /OPT/>]
|
||
JRST .+3
|
||
CAME B,[<ASCII /OPTIO/>+1]
|
||
JRST CHREST ; TRY TUPLE/ARGS
|
||
MOVEM C,E.ARGL+1(TB) ; SAVE RESTED ARGLIST
|
||
PUSHJ P,BNDEM2 ; DO ALL SUPPLIED OPTIONALS
|
||
TRNN A,4 ; SKIP IF NEW DCL READ
|
||
JRST APEXP4
|
||
|
||
; CHECK FOR "ARGS" DCL
|
||
|
||
CHREST: CAME B,[ASCII /ARGS/]
|
||
JRST CHRST1 ; GO LOOK FOR "TUPLE"
|
||
; SKIPGE E.ARG+1(TB) ; SKIP IF LEGAL
|
||
SKIPE E.CNT(TB)
|
||
JRST MPD.3
|
||
PUSHJ P,CARTMC ; GOBBLE ATOM
|
||
MOVEM C,E.ARGL+1(TB) ; SAVE CDR'D ARG
|
||
HRRZ B,@E.FRM+1(TB) ; GET ARG LIST
|
||
MOVSI A,TLIST ; GET TYPE
|
||
PUSHJ P,PSBND1
|
||
JRST APEXP5
|
||
|
||
; HERE TO CHECK FOR "TUPLE"
|
||
|
||
CHRST1: CAME B,[ASCII /TUPLE/]
|
||
JRST APXP10
|
||
PUSHJ P,CARTMC ; GOBBLE ATOM
|
||
MOVEM C,E.ARGL+1(TB)
|
||
SETZB A,B
|
||
PUSHJ P,PSHBND ; SET UP BINDING
|
||
SETZM E.CNT+1(TB) ; ZERO ARG COUNTER
|
||
|
||
TUPLP: PUSHJ P,@E.ARG+1(TB) ; GET AN ARG
|
||
JRST TUPDON ; FINIS
|
||
AOS E.CNT+1(TB)
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
JRST TUPLP
|
||
|
||
TUPDON: PUSHJ P,MAKINF ; MAKE INFO CELL
|
||
PUSH TP,$TINFO ; FENCE POST TUPLE
|
||
PUSHJ P,TBTOTP
|
||
ADDI D,TM.OFF ; COMPENSATE FOR MOVEMENT
|
||
PUSH TP,D
|
||
MOVE C,E.CNT+1(TB) ; GET COUNT
|
||
ASH C,1 ; TO WORDS
|
||
HRRM C,-1(TP) ; INTO FENCE POST
|
||
MOVEI B,-TM.OFF-1(TP) ; SETUP ARG POINTER
|
||
SUBI B,(C) ; POINT TO BASE OF TUPLE
|
||
MOVNS C ; FOR AOBJN POINTER
|
||
HRLI B,(C) ; GOOD ARGS POINTER
|
||
MOVEM A,TM.OFF-4(B) ; STORE
|
||
MOVEM B,TM.OFF-3(B)
|
||
|
||
|
||
; CHECK FOR VALID ENDING TO ARGS
|
||
|
||
APEXP5: PUSHJ P,NEXTD ; READ NEXT THING IN ARGLIST
|
||
JRST APEXP8 ; DONE
|
||
TRNN A,4 ; SKIP IF DCL
|
||
JRST MPD.4 ; LOSER
|
||
APEXP7: MOVSI A,-NWINS ; CHECK FOR A WINNER
|
||
CAME B,WINRS(A)
|
||
AOBJN A,.-1
|
||
JUMPGE A,MPD.6 ; NOT A WINNER
|
||
|
||
; HERE TO BLT THE WORLD DOWN ON TOP OF ALL THE USELESS TEMPS
|
||
|
||
APEXP8: MOVE 0,E.HEW+1(TB) ; GET HEWITT ATOM
|
||
MOVE E,E.FCN(TB) ; SAVE COUNTER
|
||
MOVE C,E.FCN+1(TB) ; FCN
|
||
MOVE B,E.ARGL+1(TB) ; ARG LIST
|
||
MOVE D,E.DECL+1(TB) ; AND DCLS
|
||
MOVEI A,R.TMP(TB) ; SET UP BLT
|
||
HRLI A,TM.OFF(A)
|
||
BLT A,-TM.OFF(TP) ; BLLLLLLLLLLLLLT
|
||
SUB TP,[TM.OFF,,TM.OFF] ; FLUSH CRUFT
|
||
MOVEM E,RE.FCN(TB)
|
||
MOVEM C,RE.FCN+1(TB)
|
||
MOVEM B,RE.ARGL+1(TB)
|
||
MOVE E,TP
|
||
PUSH TP,$TATOM
|
||
PUSH TP,0
|
||
PUSH TP,$TDECL
|
||
PUSH TP,D
|
||
GETYP A,-5(TP) ; TUPLE ON TOP?
|
||
CAIE A,TINFO ; SKIP IF YES
|
||
JRST APEXP9
|
||
HRRZ A,-5(TP) ; GET SIZE
|
||
ADDI A,2
|
||
HRLI A,(A)
|
||
SUB E,A ; POINT TO BINDINGS
|
||
SKIPE C,(TP) ; IF DCL
|
||
PUSHJ P,CHKDCL ; CHECK TYPE SPEC ON TUPLE
|
||
APEXP9: PUSHJ P,USPCBE ; DO ACTUAL BINDING
|
||
|
||
MOVE E,-2(TP) ; RESTORE HEWITT ATOM
|
||
MOVE D,(TP) ; AND DCLS
|
||
SUB TP,[4,,4]
|
||
|
||
JRST AUXBND ; GO BIND AUX'S
|
||
|
||
; HERE TO VERIFY CHECK IF ANY ARGS LEFT
|
||
|
||
APEXP4: PUSHJ P,@E.ARG+1(TB)
|
||
JRST APEXP8 ; WIN
|
||
JRST TMA ; TOO MANY ARGS
|
||
|
||
APXP10: PUSH P,B
|
||
PUSHJ P,@E.ARG+1(TB)
|
||
JRST .+2
|
||
JRST TMA
|
||
POP P,B
|
||
JRST APEXP7
|
||
|
||
; LIST OF POSSIBLE TERMINATING NAMES
|
||
|
||
WINRS:
|
||
AS.ACT: ASCII /ACT/
|
||
AS.NAM: ASCII /NAME/
|
||
AS.AUX: ASCII /AUX/
|
||
AS.EXT: ASCII /EXTRA/
|
||
NWINS==.-WINRS
|
||
|
||
|
||
; HERE TO BIND AUX VARIABLES FOR PROGS AND FCNS
|
||
|
||
AUXBND: PUSH P,E ; SAVE HEWITT ATOM ( WILL PUT ON MARKED STACK
|
||
; WHEN NECESSARY)
|
||
PUSH P,D ; SAME WITH DCL LIST
|
||
PUSH P,[-1] ; FLAG SAYING WE ARE FCN
|
||
SKIPN C,RE.ARG+1(TB) ; GET ARG LIST
|
||
JRST AUXDON
|
||
GETYP 0,(C) ; GET TYPE
|
||
CAIE 0,TDEFER ; SKIP IF CHSTR
|
||
MOVMS (P) ; SAY WE ARE IN OPTIONALS
|
||
JRST AUXB1
|
||
|
||
PRGBND: PUSH P,E
|
||
PUSH P,D
|
||
PUSH P,[0] ; WE ARE IN AUXS
|
||
|
||
AUXB1: HRRZ C,RE.ARG+1(TB) ; POINT TO ARGLIST
|
||
PUSHJ P,NEXTDC ; GET NEXT THING OFF OF ARG LIST
|
||
JRST AUXDON
|
||
TRNE A,4 ; SKIP IF SOME KIND OF ATOM
|
||
JRST TRYDCL ; COUDL BE DCL
|
||
TRNN A,1 ; SKIP IF QUOTED
|
||
JRST AUXB2
|
||
SKIPN (P) ; SKIP IF QUOTED OK
|
||
JRST MPD.11
|
||
AUXB2: PUSHJ P,PSHBND ; SET UP BINDING
|
||
PUSH TP,$TDECL ; SAVE HEWITT ATOM
|
||
PUSH TP,-1(P)
|
||
PUSH TP,$TATOM ; AND DECLS
|
||
PUSH TP,-2(P)
|
||
TRNN A,2 ; SKIP IF INIT VAL EXISTS
|
||
JRST AUXB3 ; NO, USE UNBOUND
|
||
|
||
; EVALUATE EXPRESSION
|
||
|
||
HRRZ C,(B) ; CDR ATOM OFF
|
||
|
||
; CHECK FOR SPECIAL FORMS <TUPLE ...> <ITUPLE ...>
|
||
|
||
GETYP 0,(C) ; GET TYPE OF GOODIE
|
||
CAIE 0,TFORM ; SMELLS LIKE A FORM
|
||
JRST AUXB13
|
||
HRRZ D,1(C) ; GET 1ST ELEMENT
|
||
GETYP 0,(D) ; AND ITS VAL
|
||
CAIE 0,TATOM ; FEELS LIKE THE RIGHT FORM
|
||
JRST AUXB13
|
||
|
||
MOVE 0,1(D) ; GET THE ATOM
|
||
CAME 0,IMQUOTE TUPLE
|
||
CAMN 0,MQUOTE ITUPLE
|
||
JRST DOTUPL ; SURE GLAD I DIDN'T STEP IN THAT FORM
|
||
|
||
|
||
AUXB13: PUSHJ P,FASTEV
|
||
AUXB14: MOVE E,TP
|
||
AUXB4: MOVEM A,-7(E) ; STORE VAL IN BINDING
|
||
MOVEM B,-6(E)
|
||
|
||
; HERE TO CHECK AGAINST DECLARATIONS AND COMPLETE THE BINDING
|
||
|
||
AUXB5: SUB E,[4,,4] ; POINT TO BINDING TOP
|
||
SKIPE C,-2(TP) ; POINT TO DECLARATINS
|
||
PUSHJ P,CHKDCL ; CHECK IT
|
||
PUSHJ P,USPCBE ; AND BIND UP
|
||
SKIPE C,RE.ARG+1(TB) ; CDR DCLS
|
||
HRRZ C,(C) ; IF ANY TO CDR
|
||
MOVEM C,RE.ARG+1(TB)
|
||
MOVE A,(TP) ; NOW PUT HEWITT ATOM AND DCL AWAY
|
||
MOVEM A,-2(P)
|
||
MOVE A,-2(TP)
|
||
MOVEM A,-1(P)
|
||
SUB TP,[4,,4] ; FLUSH SLOTS
|
||
JRST AUXB1
|
||
|
||
|
||
AUXB3: MOVNI B,1
|
||
MOVSI A,TUNBOU
|
||
JRST AUXB14
|
||
|
||
|
||
|
||
; HERE TO HANDLE "CALLS" TO TUPLE AND ITUPLE
|
||
|
||
DOTUPL: SKIPE E,(P) ; SKIP IF IN AUX LIST
|
||
JRST TUPLE
|
||
PUSH TP,$TLIST ; SAVE THE MAGIC FORM
|
||
PUSH TP,D
|
||
CAME 0,IMQUOTE TUPLE
|
||
JRST DOITUP ; DO AN ITUPLE
|
||
|
||
; FALL INTO A TUPLE PUSHING LOOP
|
||
|
||
DOTUP1: HRRZ C,@(TP) ; CDR THE FORM
|
||
JUMPE C,ATUPDN ; FINISHED
|
||
MOVEM C,(TP) ; SAVE CDR'D RESULT
|
||
GETYP 0,(C) ; CHECK FOR SEGMENT
|
||
CAIN 0,TSEG
|
||
JRST DTPSEG ; GO PULL IT APART
|
||
PUSHJ P,FASTEV ; EVAL IT
|
||
PUSHJ P,CNTARG ; PUSH IT UP AND COUNT THEM
|
||
JRST DOTUP1
|
||
|
||
; HERE WHEN WE FINISH
|
||
|
||
ATUPDN: SUB TP,[2,,2] ; FLUSH THE LIST
|
||
ASH E,1 ; E HAS # OF ARGS DOUBLE IT
|
||
MOVEI D,(TP) ; FIND BASE OF STACK AREA
|
||
SUBI D,(E)
|
||
MOVSI C,-3(D) ; PREPARE BLT POINTER
|
||
BLT C,C ; HEWITT ATOM AND DECL TO 0,A,B,C
|
||
|
||
; NOW PREPEARE TO BLT TUPLE DOWN
|
||
|
||
MOVEI D,-3(D) ; NEW DEST
|
||
HRLI D,4(D) ; SOURCE
|
||
BLT D,-4(TP) ; SLURP THEM DOWN
|
||
|
||
HRLI E,TINFO ; SET UP FENCE POST
|
||
MOVEM E,-3(TP) ; AND STORE
|
||
PUSHJ P,TBTOTP ; GET OFFSET
|
||
ADDI D,3 ; FUDGE FOR NOT AT TOP OF STACK
|
||
MOVEM D,-2(TP)
|
||
MOVEM 0,-1(TP) ; RESTORE HEW ATOM AND DECLS
|
||
MOVEM A,(TP)
|
||
PUSH TP,B
|
||
PUSH TP,C
|
||
|
||
PUSHJ P,MAKINF ; MAKE 1ST WORD OF FUNNYS
|
||
|
||
HRRZ E,-5(TP) ; RESTORE WORDS OF TUPLE
|
||
HRROI B,-5(TP) ; POINT TO TOP OF TUPLE
|
||
SUBI B,(E) ; NOW BASE
|
||
TLC B,-1(E) ; FIX UP AOBJN PNTR
|
||
ADDI E,2 ; COPNESATE FOR FENCE PST
|
||
HRLI E,(E)
|
||
SUBM TP,E ; E POINT TO BINDING
|
||
JRST AUXB4 ; GO CLOBBER IT IN
|
||
|
||
|
||
; HERE TO HANDLE SEGMENTS IN THESE FUNNY FORMS
|
||
|
||
DTPSEG: PUSH TP,$TFORM ; SAVE THE HACKER
|
||
PUSH TP,1(C)
|
||
MCALL 1,EVAL ; AND EVALUATE IT
|
||
MOVE D,B ; GET READY FOR A SEG LOOP
|
||
MOVEM A,DSTORE
|
||
PUSHJ P,TYPSEG ; TYPE AND CHECK IT
|
||
|
||
DTPSG1: INTGO ; DONT BLOW YOUR STACK
|
||
PUSHJ P,NXTLM ; ELEMENT TO A AND B
|
||
JRST DTPSG2 ; DONE
|
||
PUSHJ P,CNTARG ; PUSH AND COUNT
|
||
JRST DTPSG1
|
||
|
||
DTPSG2: SETZM DSTORE
|
||
HRRZ E,-1(TP) ; GET COUNT IN CASE END
|
||
JRST DOTUP1 ; REST OF ARGS STILL TO DO
|
||
|
||
; HERE TO HACK <ITUPLE .....>
|
||
|
||
DOITUP: HRRZ C,@(TP) ; GET COUNT FILED
|
||
JUMPE C,TFA
|
||
MOVEM C,(TP)
|
||
PUSHJ P,FASTEV ; EVAL IT
|
||
GETYP 0,A
|
||
CAIE 0,TFIX
|
||
JRST WTY1TP
|
||
|
||
JUMPL B,BADNUM
|
||
|
||
HRRZ C,@(TP) ; GET EXP TO EVAL
|
||
MOVEI 0,0 ; DONT LOSE IN 1 ARG CASE
|
||
HRRZ 0,(C) ; VERIFY WINNAGE
|
||
JUMPN 0,TMA ; TOO MANY
|
||
|
||
JUMPE B,DOIDON
|
||
PUSH P,B ; SAVE COUNT
|
||
PUSH P,B
|
||
JUMPE C,DOILOS
|
||
PUSHJ P,FASTEV ; EVAL IT ONCE
|
||
MOVEM A,-1(TP)
|
||
MOVEM B,(TP)
|
||
|
||
DOILP: INTGO
|
||
PUSH TP,-1(TP)
|
||
PUSH TP,-1(TP)
|
||
MCALL 1,EVAL
|
||
PUSHJ P,CNTRG
|
||
SOSLE (P)
|
||
JRST DOILP
|
||
|
||
DOIDO1: MOVE B,-1(P) ; RESTORE COUNT
|
||
SUB P,[2,,2]
|
||
|
||
DOIDON: MOVEI E,(B)
|
||
JRST ATUPDN
|
||
|
||
; FOR CASE OF NO EVALE
|
||
|
||
DOILOS: SUB TP,[2,,2]
|
||
DOILLP: INTGO
|
||
PUSH TP,[0]
|
||
PUSH TP,[0]
|
||
SOSL (P)
|
||
JRST DOILLP
|
||
JRST DOIDO1
|
||
|
||
; ROUTINE TO PUSH NEXT TUPLE ELEMENT
|
||
|
||
CNTARG: AOS E,-1(TP) ; KEEP ARG COUNT UP TO DATE IN E
|
||
CNTRG: EXCH A,-1(TP) ; STORE ELEM AND GET SAVED
|
||
EXCH B,(TP)
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
POPJ P,
|
||
|
||
|
||
; DUMMY TUPLE AND ITUPLE
|
||
|
||
IMFUNCTION TUPLE,SUBR
|
||
|
||
ENTRY
|
||
ERRUUO EQUOTE NOT-IN-AUX-LIST
|
||
|
||
MFUNCTIO ITUPLE,SUBR
|
||
JRST TUPLE
|
||
|
||
|
||
; PROCESS A DCL IN THE AUX VAR LISTS
|
||
|
||
TRYDCL: SKIPN (P) ; SKIP IF NOT IN AUX'S
|
||
JRST AUXB7
|
||
CAME B,AS.AUX ; "AUX" ?
|
||
CAMN B,AS.EXT ; OR "EXTRA"
|
||
JRST AUXB9 ; YES
|
||
CAME B,[ASCII /TUPLE/]
|
||
JRST AUXB10
|
||
PUSHJ P,MAKINF ; BUILD EMPTY TUPLE
|
||
MOVEI B,1(TP)
|
||
PUSH TP,$TINFO ; FENCE POST
|
||
PUSHJ P,TBTOTP
|
||
PUSH TP,D
|
||
AUXB6: HRRZ C,(C) ; CDR PAST DCL
|
||
MOVEM C,RE.ARG+1(TB)
|
||
AUXB8: PUSHJ P,CARTMC ; GET ATOM
|
||
AUXB12: PUSHJ P,PSHBND ; UP GOES THE BINDING
|
||
PUSH TP,$TATOM ; HIDE HEWITT ATOM AND DCL
|
||
PUSH TP,-1(P)
|
||
PUSH TP,$TDECL
|
||
PUSH TP,-2(P)
|
||
MOVE E,TP
|
||
JRST AUXB5
|
||
|
||
; CHECK FOR ARGS
|
||
|
||
AUXB10: CAME B,[ASCII /ARGS/]
|
||
JRST AUXB7
|
||
MOVEI B,0 ; NULL ARG LIST
|
||
MOVSI A,TLIST
|
||
JRST AUXB6 ; GO BIND
|
||
|
||
AUXB9: SETZM (P) ; NOW READING AUX
|
||
HRRZ C,(C)
|
||
MOVEM C,RE.ARG+1(TB)
|
||
JRST AUXB1
|
||
|
||
; CHECK FOR NAME/ACT
|
||
|
||
AUXB7: CAME B,AS.NAM
|
||
CAMN B,AS.ACT
|
||
JRST .+2
|
||
JRST MPD.12 ; LOSER
|
||
HRRZ C,(C) ; CDR ON
|
||
HRRZ 0,(C) ; BETTER BE END
|
||
JUMPN 0,MPD.13
|
||
PUSHJ P,CARTMC ; FORCE ATOM READ
|
||
SETZM RE.ARG+1(TB)
|
||
AUXB11: PUSHJ P,MAKACT ; MAKE ACTIVATION
|
||
JRST AUXB12 ; AND BIND IT
|
||
|
||
|
||
; DONE BIND HEWITT ATOM IF NECESARY
|
||
|
||
AUXDON: SKIPN E,-2(P)
|
||
JRST AUXD1
|
||
SETZM -2(P)
|
||
JRST AUXB11
|
||
|
||
; FINISHED, RETURN
|
||
|
||
AUXD1: SUB P,[3,,3]
|
||
POPJ P,
|
||
|
||
|
||
; MAKE AN ACTIVATION OR ENVIRONMNENT
|
||
|
||
MAKACT: MOVEI B,(TB)
|
||
MOVSI A,TACT
|
||
MAKAC1: MOVE PVP,PVSTOR+1
|
||
HRRI A,PVLNT*2+1(PVP) ; POINT TO PROCESS
|
||
HLL B,OTBSAV(B) ; GET TIME
|
||
POPJ P,
|
||
|
||
MAKENV: MOVSI A,TENV
|
||
HRRZ B,OTBSAV(TB)
|
||
JRST MAKAC1
|
||
|
||
; SEVERAL USEFUL LITTLE ROUTINES FOR HACKING THIS STUFF
|
||
|
||
; CARAT/CARATC/CARATM/CARTMC ALL LOOK FOR THE NEXT ATOM
|
||
|
||
CARAT: HRRZ C,E.ARGL+1(TB) ; PICK UP ARGLIST
|
||
CARATC: JUMPE C,CPOPJ ; FOUND
|
||
GETYP 0,(C) ; GET ITS TYPE
|
||
CAIE 0,TATOM
|
||
CPOPJ: POPJ P, ; RETURN, NOT ATOM
|
||
MOVE E,1(C) ; GET ATOM
|
||
HRRZ C,(C) ; CDR DCLS
|
||
JRST CPOPJ1
|
||
|
||
CARATM: HRRZ C,E.ARGL+1(TB)
|
||
CARTMC: PUSHJ P,CARATC
|
||
JRST MPD.7 ; REALLY LOSE
|
||
POPJ P,
|
||
|
||
|
||
; SUBROUTINES TO PUSH BINDINGS ETC. UP ON THE STACK
|
||
|
||
PSBND1: PUSHJ P,PSHBND ; PUSH THEBINDING
|
||
JRST CHDCL ; NOW CHECK IT AGAINST DECLARATION
|
||
|
||
PSHBND: SKIPGE SPCCHK ; SKIP IF NORMAL SPECIAL
|
||
PUSH TP,BNDA1 ; ATOM IN E
|
||
SKIPL SPCCHK ; SKIP IF NORMAL UNSPEC OR NO CHECK
|
||
PUSH TP,BNDA
|
||
PUSH TP,E ; PUSH IT
|
||
PSHAB4: PUSH TP,A
|
||
PUSH TP,B
|
||
PUSH TP,[0]
|
||
PUSH TP,[0]
|
||
POPJ P,
|
||
|
||
; ROUTINE TO PUSH 4 0'S
|
||
|
||
PSH4ZR: SETZB A,B
|
||
JRST PSHAB4
|
||
|
||
|
||
; EXTRRA ARG GOBBLER
|
||
|
||
EXTRGT: HRRZ A,E.ARG(TB) ; RESET SLOT
|
||
SETZM E.CNT(TB)
|
||
CAIE A,ARGCDR ; IF NOT ARGCDR
|
||
AOS E.CNT(TB)
|
||
TLO A,400000 ; SET FLAG
|
||
MOVEM A,E.ARG+1(TB)
|
||
MOVE A,E.EXTR(TB) ; RET ARG
|
||
MOVE B,E.EXTR+1(TB)
|
||
JRST CPOPJ1
|
||
|
||
; CHECK A/B FOR DEFER
|
||
|
||
CHKAB: GETYP 0,A
|
||
CAIE 0,TDEFER ; SKIP IF DEFER
|
||
JRST (E)
|
||
MOVE A,(B)
|
||
MOVE B,1(B) ; GET REAL THING
|
||
JRST (E)
|
||
; IF DECLARATIONS EXIST, DO THEM
|
||
|
||
CHDCL: MOVE E,TP
|
||
CHDCLE: SKIPN C,E.DECL+1(TB)
|
||
POPJ P,
|
||
JRST CHKDCL
|
||
|
||
; ROUTINE TO READ NEXT THING FROM ARGLIST
|
||
|
||
NEXTD: HRRZ C,E.ARGL+1(TB) ; GET ARG LIST
|
||
NEXTDC: MOVEI A,0
|
||
JUMPE C,CPOPJ
|
||
PUSHJ P,CARATC ; TRY FOR AN ATOM
|
||
JRST NEXTD1 ; NO
|
||
JRST CPOPJ1
|
||
|
||
NEXTD1: CAIE 0,TFORM ; FORM?
|
||
JRST NXT.L ; COULD BE LIST
|
||
PUSHJ P,CHQT ; VERIFY 'ATOM
|
||
MOVEI A,1
|
||
JRST CPOPJ1
|
||
|
||
NXT.L: CAIE 0,TLIST ; COULD BE (A <EXPRESS>) OR ('A <EXPRESS>)
|
||
JRST NXT.S ; BETTER BE A DCL
|
||
PUSHJ P,LNT.2 ; VERIFY LENGTH IS 2
|
||
JRST MPD.8
|
||
CAIE 0,TATOM ; TYPE OF 1ST RET IN 0
|
||
JRST LST.QT ; MAY BE 'ATOM
|
||
MOVE E,1(B) ; GET ATOM
|
||
MOVEI A,2
|
||
JRST CPOPJ1
|
||
LST.QT: CAIE 0,TFORM ; FORM?
|
||
JRST MPD.9 ; LOSE
|
||
PUSH P,C
|
||
MOVEI C,(B) ; VERIFY 'ATOM
|
||
PUSHJ P,CHQT
|
||
MOVEI B,(C) ; POINT BACK TO LIST
|
||
POP P,C
|
||
MOVEI A,3 ; CODE
|
||
JRST CPOPJ1
|
||
|
||
NXT.S: MOVEI A,(C) ; LET NXTDCL FIND OUT
|
||
PUSHJ P,NXTDCL
|
||
JRST MPD.3 ; LOSER
|
||
MOVEI A,4 ; SET DCL READ FLAG
|
||
JRST CPOPJ1
|
||
|
||
; ROUTINE TO CHECK LENGTH OF LIST/FORM FOR BEING 2
|
||
|
||
LNT.2: HRRZ B,1(C) ; GET LIST/FORM
|
||
JUMPE B,CPOPJ
|
||
HRRZ B,(B)
|
||
JUMPE B,CPOPJ
|
||
HRRZ B,(B) ; BETTER END HERE
|
||
JUMPN B,CPOPJ
|
||
HRRZ B,1(C) ; LIST BACK
|
||
GETYP 0,(B) ; TYPE OF 1ST ELEMENT
|
||
JRST CPOPJ1
|
||
|
||
; ROUTINE TO VERIFY FORM IS 'ATOM AND RET ATOM
|
||
|
||
CHQT: PUSHJ P,LNT.2 ; 1ST LENGTH CHECK
|
||
JRST MPD.5
|
||
CAIE 0,TATOM
|
||
JRST MPD.5
|
||
MOVE 0,1(B)
|
||
CAME 0,IMQUOTE QUOTE
|
||
JRST MPD.5 ; BETTER BE QUOTE
|
||
HRRZ E,(B) ; CDR
|
||
GETYP 0,(E) ; TYPE
|
||
CAIE 0,TATOM
|
||
JRST MPD.5
|
||
MOVE E,1(E) ; GET QUOTED ATOM
|
||
POPJ P,
|
||
|
||
; ARG BINDER FOR REGULAR ARGS AND OPTIONALS
|
||
|
||
BNDEM1: PUSH P,[0] ; REGULAR FLAG
|
||
JRST .+2
|
||
BNDEM2: PUSH P,[1]
|
||
BNDEM: PUSHJ P,NEXTD ; GET NEXT THING
|
||
JRST CCPOPJ ; END OF THINGS
|
||
TRNE A,4 ; CHECK FOR DCL
|
||
JRST BNDEM4
|
||
TRNE A,2 ; SKIP IF NOT (ATM ..) OR ('ATM ...)
|
||
SKIPE (P) ; SKIP IF REG ARGS
|
||
JRST .+2 ; WINNER, GO ON
|
||
JRST MPD.6 ; LOSER
|
||
SKIPGE SPCCHK
|
||
PUSH TP,BNDA1 ; SAVE ATOM
|
||
SKIPL SPCCHK
|
||
PUSH TP,BNDA
|
||
PUSH TP,E
|
||
; SKIPGE E.ARG+1(TB) ; ALREADY EVAL'D ARG?
|
||
SKIPE E.CNT(TB)
|
||
JRST RGLAR0
|
||
TRNN A,1 ; SKIP IF ARG QUOTED
|
||
JRST RGLARG
|
||
HRRZ D,@E.FRM+1(TB) ; GET AND CDR ARG
|
||
JUMPE D,TFACHK ; OH OH MAYBE TOO FEW ARGS
|
||
MOVEM D,E.FRM+1(TB) ; STORE WINNER
|
||
HLLZ A,(D) ; GET ARG
|
||
MOVE B,1(D)
|
||
JSP E,CHKAB ; HACK DEFER
|
||
JRST BNDEM3 ; AND GO ON
|
||
|
||
RGLAR0: TRNE A,1 ; ATTEMPT TO QUOTE ALREADY EVAL'D ARG ?
|
||
JRST MPD ; YES, LOSE
|
||
RGLARG: PUSH P,A ; SAVE FLAGS
|
||
PUSHJ P,@E.ARG+1(TB)
|
||
JRST TFACH1 ; MAY GE TOO FEW
|
||
SUB P,[1,,1]
|
||
BNDEM3: HRRZ C,@E.ARGL+1(TB) ; CDR THHE ARGS
|
||
MOVEM C,E.ARGL+1(TB)
|
||
PUSHJ P,PSHAB4 ; PUSH VALUE AND SLOTS
|
||
PUSHJ P,CHDCL ; CHECK DCLS
|
||
JRST BNDEM ; AND BIND ON!
|
||
|
||
; HERE WHEN ARGS RUN OUT, IF NOT OPTIONAL, GIVE TFA
|
||
|
||
TFACH1: POP P,A
|
||
TFACHK: SUB TP,[2,,2] ; FLUSH ATOM
|
||
SKIPN (P) ; SKIP IF OPTIONALS
|
||
JRST TFA
|
||
CCPOPJ: SUB P,[1,,1]
|
||
POPJ P,
|
||
|
||
BNDEM4: HRRZ C,@E.ARGL+1(TB) ; POINT TO REST OF ARGL
|
||
JRST CCPOPJ
|
||
|
||
|
||
; EVALUATE LISTS, VECTORS, UNIFROM VECTORS
|
||
|
||
EVLIST: PUSH P,[-1] ;-1 -- THIS IS A LIST
|
||
JRST EVL1 ;GO TO HACKER
|
||
|
||
EVECT: PUSH P,[0] ;0 -- THIS IS A GENERAL VECTOR
|
||
JRST EVL1
|
||
|
||
EUVEC: PUSH P,[1] ;1 -- THIS IS A UNIFORM VECTOR
|
||
|
||
EVL1: PUSH P,[0] ;PUSH A COUNTER
|
||
GETYPF A,(AB) ;GET FULL TYPE
|
||
PUSH TP,A
|
||
PUSH TP,1(AB) ;AND VALUE
|
||
|
||
EVL2: INTGO ;CHECK INTERRUPTS
|
||
SKIPN A,1(TB) ;ANYMORE
|
||
JRST EVL3 ;NO, QUIT
|
||
SKIPL -1(P) ;SKIP IF LIST
|
||
JUMPG A,EVL3 ;JUMP IF VECTOR EMPTY
|
||
GETYPF B,(A) ;GET FULL TYPE
|
||
SKIPGE C,-1(P) ;SKIP IF NOT LIST
|
||
HLLZS B ;CLOBBER CDR FIELD
|
||
JUMPG C,EVL7 ;HACK UNIFORM VECS
|
||
EVL8: PUSH P,B ;SAVE TYPE WORD ON P
|
||
CAMN B,$TSEG ;SEGMENT?
|
||
MOVSI B,TFORM ;FAKE OUT EVAL
|
||
PUSH TP,B ;PUSH TYPE
|
||
PUSH TP,1(A) ;AND VALUE
|
||
JSP E,CHKARG ; CHECK DEFER
|
||
MCALL 1,EVAL ;AND EVAL IT
|
||
POP P,C ;AND RESTORE REAL TYPE
|
||
CAMN C,$TSEG ;SEGMENT?
|
||
JRST DOSEG ;YES, HACK IT
|
||
AOS (P) ;COUNT ELEMENT
|
||
PUSH TP,A ;AND PUSH IT
|
||
PUSH TP,B
|
||
EVL6: SKIPGE A,-1(P) ;DONT SKIP IF LIST
|
||
HRRZ B,@1(TB) ;CDR IT
|
||
JUMPL A,ASTOTB ;AND STORE IT
|
||
MOVE B,1(TB) ;GET VECTOR POINTER
|
||
ADD B,AMNT(A) ;INCR BY APPROPRIATE AMOUNT
|
||
ASTOTB: MOVEM B,1(TB) ;AND STORE BACK
|
||
JRST EVL2 ;AND LOOP BACK
|
||
|
||
AMNT: 2,,2 ;INCR FOR GENERAL VECTOR
|
||
1,,1 ;SAME FOR UNIFORM VECTOR
|
||
|
||
CHKARG: GETYP A,-1(TP)
|
||
CAIE A,TDEFER
|
||
JRST (E)
|
||
HRRZS (TP) ;MAKE SURE INDIRECT WINS
|
||
MOVE A,@(TP)
|
||
MOVEM A,-1(TP) ;CLOBBER IN TYPE SLOT
|
||
MOVE A,(TP) ;NOW GET POINTER
|
||
MOVE A,1(A) ;GET VALUE
|
||
MOVEM A,(TP) ;CLOBBER IN
|
||
JRST (E)
|
||
|
||
|
||
|
||
EVL7: HLRE C,A ; FIND TYPE OF UVECTOR
|
||
SUBM A,C ;C POINTS TO DOPE WORD
|
||
GETYP B,(C) ;GET TYPE
|
||
MOVSI B,(B) ;TO LH NOW
|
||
SOJA A,EVL8 ;AND RETURN TO DO EVAL
|
||
|
||
EVL3: SKIPL -1(P) ;SKIP IF LIST
|
||
JRST EVL4 ;EITHER VECTOR OR UVECTOR
|
||
|
||
MOVEI B,0 ;GET A NIL
|
||
EVL9: MOVSI A,TLIST ;MAKE TYPE WIN
|
||
EVL5: SOSGE (P) ;COUNT DOWN
|
||
JRST EVL10 ;DONE, RETURN
|
||
PUSH TP,$TLIST ;SET TO CALL CONS
|
||
PUSH TP,B
|
||
MCALL 2,CONS
|
||
JRST EVL5 ;LOOP TIL DONE
|
||
|
||
|
||
EVL4: MOVEI B,EUVECT ;UNIFORM CASE
|
||
SKIPG -1(P) ;SKIP IF UNIFORM CASE
|
||
MOVEI B,EVECTO ;NO, GENERAL CASE
|
||
POP P,A ;GET COUNT
|
||
.ACALL A,(B) ;CALL CREATOR
|
||
EVL10: GETYPF A,(AB) ; USE SENT TYPE
|
||
JRST EFINIS
|
||
|
||
|
||
; PROCESS SEGMENTS FOR THESE HACKS
|
||
|
||
DOSEG: PUSHJ P,TYPSEG ; FIND WHAT IS BEING SEGMENTED
|
||
JUMPE C,LSTSEG ; CHECK END SPLICE IF LIST
|
||
|
||
SEG3: PUSHJ P,NXTELM ; GET THE NEXTE ELEMT
|
||
JRST SEG4 ; RETURN TO CALLER
|
||
AOS (P) ; COUNT
|
||
JRST SEG3 ; TRY AGAIN
|
||
SEG4: SETZM DSTORE
|
||
JRST EVL6
|
||
|
||
TYPSEG: PUSHJ P,TYPSGR
|
||
JRST ILLSEG
|
||
POPJ P,
|
||
|
||
TYPSGR: MOVE E,A ; SAVE TYPE
|
||
GETYP A,A ; TYPE TO RH
|
||
PUSHJ P,SAT ;GET STORAGE TYPE
|
||
MOVE D,B ; GOODIE TO D
|
||
|
||
MOVNI C,1 ; C <0 IF ILLEGAL
|
||
CAIN A,S2WORD ;LIST?
|
||
MOVEI C,0
|
||
CAIN A,S2NWORD ;GENERAL VECTOR?
|
||
MOVEI C,1
|
||
CAIN A,SNWORD ;UNIFORM VECTOR?
|
||
MOVEI C,2
|
||
CAIN A,SCHSTR
|
||
MOVEI C,3
|
||
CAIN A,SBYTE
|
||
MOVEI C,5
|
||
CAIN A,SSTORE ;SPECIAL AFREE STORAGE ?
|
||
MOVEI C,4 ;TREAT LIKE A UVECTOR
|
||
CAIN A,SARGS ;ARGS TUPLE?
|
||
JRST SEGARG ;NO, ERROR
|
||
CAILE A,NUMSAT ; SKIP IF NOT TEMPLATE
|
||
JRST SEGTMP
|
||
MOVE A,PTYPS(C)
|
||
CAIN A,4
|
||
MOVEI A,2 ; NOW TREAT LIKE A UVECTOR
|
||
HLL E,A
|
||
MSTOR1: JUMPL C,CPOPJ
|
||
|
||
MDSTOR: MOVEM E,DSTORE
|
||
JRST CPOPJ1
|
||
|
||
SEGTMP: MOVEI C,4
|
||
HRRI E,(A)
|
||
JRST MSTOR1
|
||
|
||
SEGARG: MOVSI A,TARGS
|
||
HRRI A,(E)
|
||
PUSH TP,A ;PREPARE TO CHECK ARGS
|
||
PUSH TP,D
|
||
MOVEI B,-1(TP) ;POINT TO SAVED COPY
|
||
PUSHJ P,CHARGS ;CHECK ARG POINTER
|
||
POP TP,D ;AND RESTORE WINNER
|
||
POP TP,E ;AND TYPE AND FALL INTO VECTOR CODE
|
||
MOVEI C,1
|
||
JRST MSTOR1
|
||
|
||
LSTSEG: SKIPL -1(P) ;SKIP IF IN A LIST
|
||
JRST SEG3 ;ELSE JOIN COMMON CODE
|
||
HRRZ A,@1(TB) ;CHECK FOR END OF LIST
|
||
JUMPN A,SEG3 ;NO, JOIN COMMON CODE
|
||
SETZM DSTORE ;CLOBBER SAVED GOODIES
|
||
JRST EVL9 ;AND FINISH UP
|
||
|
||
NXTELM: INTGO
|
||
PUSHJ P,NXTLM ; GOODIE TO A AND B
|
||
POPJ P, ; DONE
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
JRST CPOPJ1
|
||
NXTLM: XCT TESTR(C) ; SKIP IF MORE IN SEGEMNT
|
||
POPJ P,
|
||
XCT TYPG(C) ; GET THE TYPE
|
||
XCT VALG(C) ; AND VALUE
|
||
JSP E,CHKAB ; CHECK DEFERRED
|
||
XCT INCR1(C) ; AND INCREMENT TO NEXT
|
||
CPOPJ1: AOS (P) ; SKIP RETURN
|
||
POPJ P,
|
||
|
||
; TABLES FOR SEGMENT OPERATIONS (0->LIST, 1->VECTOR/ARGS, 2->UVEC, 3->STRING)
|
||
|
||
PTYPS: TLIST,,
|
||
TVEC,,
|
||
TUVEC,,
|
||
TCHSTR,,
|
||
TSTORA,,
|
||
TBYTE,,
|
||
|
||
TESTR: SKIPN D
|
||
SKIPL D
|
||
SKIPL D
|
||
PUSHJ P,CHRDON
|
||
PUSHJ P,TM1
|
||
PUSHJ P,CHRDON
|
||
|
||
TYPG: PUSHJ P,LISTYP
|
||
GETYPF A,(D)
|
||
PUSHJ P,UTYPE
|
||
MOVSI A,TCHRS
|
||
PUSHJ P,TM2
|
||
MOVSI A,TFIX
|
||
|
||
VALG: MOVE B,1(D)
|
||
MOVE B,1(D)
|
||
MOVE B,(D)
|
||
PUSHJ P,1CHGT
|
||
PUSHJ P,TM3
|
||
PUSHJ P,1CHGT
|
||
|
||
INCR1: HRRZ D,(D)
|
||
ADD D,[2,,2]
|
||
ADD D,[1,,1]
|
||
PUSHJ P,1CHINC
|
||
ADD D,[1,,]
|
||
PUSHJ P,1CHINC
|
||
|
||
TM1: HRRZ A,DSTORE
|
||
SKIPE DSTORE
|
||
HRRZ A,DSTORE ; GET SAT
|
||
SUBI A,NUMSAT+1
|
||
ADD A,TD.LNT+1
|
||
EXCH C,D
|
||
XCT (A)
|
||
HLRZ 0,C ; GET AMNT RESTED
|
||
SUB B,0
|
||
EXCH C,D
|
||
TRNE B,-1
|
||
AOS (P)
|
||
POPJ P,
|
||
|
||
TM3:
|
||
TM2: HRRZ 0,DSTORE
|
||
SKIPE DSTORE
|
||
HRRZ 0,DSTORE
|
||
PUSH P,C
|
||
PUSH P,D
|
||
PUSH P,E
|
||
MOVE B,D
|
||
MOVEI C,0 ; GET "1ST ELEMENT"
|
||
PUSHJ P,TMPLNT ; GET NTH IN A AND B
|
||
POP P,E
|
||
POP P,D
|
||
POP P,C
|
||
POPJ P,
|
||
|
||
CHRDON: HRRZ B,DSTORE
|
||
SKIPE DSTORE
|
||
HRRZ B,DSTORE ; POIT TO DOPE WORD
|
||
JUMPE B,CHRFIN
|
||
AOS (P)
|
||
CHRFIN: POPJ P,
|
||
|
||
LISTYP: GETYP A,(D)
|
||
MOVSI A,(A)
|
||
POPJ P,
|
||
1CHGT: MOVE B,D
|
||
ILDB B,B
|
||
POPJ P,
|
||
|
||
1CHINC: IBP D
|
||
SKIPN DSTORE
|
||
JRST 1CHIN1
|
||
SOS DSTORE
|
||
POPJ P,
|
||
|
||
1CHIN1: SOS DSTORE
|
||
POPJ P,
|
||
|
||
UTYPE: HLRE A,D
|
||
SUBM D,A
|
||
GETYP A,(A)
|
||
MOVSI A,(A)
|
||
POPJ P,
|
||
|
||
|
||
;COMPILER's CALL TO DOSEG
|
||
SEGMNT: PUSHJ P,TYPSEG
|
||
SEGLP1: SETZB A,B
|
||
SEGLOP: PUSHJ P,NXTELM
|
||
JRST SEGRET
|
||
AOS (P)-2 ; INCREMENT COMPILER'S COUNT
|
||
JRST SEGLOP
|
||
|
||
SEGRET: SETZM DSTORE
|
||
POPJ P,
|
||
|
||
SEGLST: PUSHJ P,TYPSEG
|
||
JUMPN C,SEGLS2
|
||
SEGLS3: SETZM DSTORE
|
||
MOVSI A,TLIST
|
||
SEGLS1: SOSGE -2(P) ; START COUNT DOWN
|
||
POPJ P,
|
||
MOVEI E,(B)
|
||
POP TP,D
|
||
POP TP,C
|
||
PUSHJ P,ICONS
|
||
JRST SEGLS1
|
||
|
||
SEGLS2: PUSHJ P,NXTELM
|
||
JRST SEGLS4
|
||
AOS -2(P)
|
||
JRST SEGLS2
|
||
|
||
SEGLS4: MOVEI B,0
|
||
JRST SEGLS3
|
||
|
||
|
||
;SPECBIND BINDS IDENTIFIERS. IT IS CALLED BY PUSHJ P,SPECBIND.
|
||
;SPECBIND IS PROVIDED WITH A CONTIGUOUS SET OF TRIPLETS ON TP.
|
||
;EACH TRIPLET IS AS FOLLOWS:
|
||
;THE FIRST ELEMENT IS THE IDENTIFIER TO BE BOUND, ITS TYPE WORD IS [TATOM,,-1],
|
||
;THE SECOND IS THE VALUE TO WHICH IT IS TO BE ASSIGNED,
|
||
;AND THE THIRD IS A PAIR OF ZEROES.
|
||
|
||
BNDA1: TATOM,,-2
|
||
BNDA: TATOM,,-1
|
||
BNDV: TVEC,,-1
|
||
|
||
USPECBIND:
|
||
MOVE E,TP
|
||
USPCBE: PUSH P,$TUBIND
|
||
JRST .+3
|
||
|
||
SPECBIND:
|
||
MOVE E,TP ;GET THE POINTER TO TOP
|
||
SPECBE: PUSH P,$TBIND
|
||
ADD E,[1,,1] ;BUMP POINTER ONCE
|
||
SETZB 0,D ;CLEAR TEMPS
|
||
PUSH P,0
|
||
MOVEI 0,(TB) ; FOR CHECKS
|
||
|
||
BINDLP: MOVE A,-4(E) ; CHECK FOR VEC BIND
|
||
CAMN A,BNDV
|
||
JRST NONID
|
||
MOVE A,-6(E) ;GET TYPE
|
||
CAME A,BNDA1 ; FOR UNSPECIAL
|
||
CAMN A,BNDA ;NORMAL ID BIND?
|
||
CAILE 0,-6(E) ; MAKE SURE NOT GOING UNDER FRAME
|
||
JRST SPECBD
|
||
SUB E,[6,,6] ;MOVE PTR
|
||
SKIPE D ;LINK?
|
||
HRRM E,(D) ;YES -- LOBBER
|
||
SKIPN (P) ;UPDATED?
|
||
MOVEM E,(P) ;NO -- DO IT
|
||
|
||
MOVE A,0(E) ;GET ATOM PTR
|
||
MOVE B,1(E)
|
||
PUSHJ P,SILOC ;GET LAST BINDING
|
||
MOVS A,OTBSAV (TB) ;GET TIME
|
||
HRL A,5(E) ; GET DECL POINTER
|
||
MOVEM A,4(E) ;CLOBBER IT AWAY
|
||
MOVE A,(E) ; SEE IF SPEC/UNSPEC
|
||
TRNN A,1 ; SKIP, ALWAYS SPEC
|
||
SKIPA A,-1(P) ; USE SUPPLIED
|
||
MOVSI A,TBIND
|
||
MOVEM A,(E) ;IDENTIFY AS BIND BLOCK
|
||
JUMPE B,SPEB10
|
||
MOVE PVP,PVSTOR+1
|
||
HRRZ C,SPBASE(PVP) ; CHECK FOR CROSS OF PROC
|
||
MOVEI A,(TP)
|
||
CAIL A,(B) ; LOSER
|
||
CAILE C,(B) ; SKIP IFF WINNER
|
||
MOVEI B,1
|
||
SPEB10: MOVEM B,5(E) ;IN RESTORE CELLS
|
||
|
||
MOVE C,1(E) ;GET ATOM PTR
|
||
SKIPE (C)
|
||
JUMPE B,.-4
|
||
MOVEI A,(C)
|
||
MOVEI B,0 ; FOR SPCUNP
|
||
CAIL A,HIBOT ; SKIP IF IMPURE ATOM
|
||
PUSHJ P,SPCUNP
|
||
MOVE PVP,PVSTOR+1
|
||
HRRZ A,BINDID+1(PVP) ;GET PROCESS NUMBER
|
||
HRLI A,TLOCI ;MAKE LOC PTR
|
||
MOVE B,E ;TO NEW VALUE
|
||
ADD B,[2,,2]
|
||
MOVEM A,(C) ;CLOBBER ITS VALUE
|
||
MOVEM B,1(C) ;CELL
|
||
MOVE D,E ;REMEMBER LINK
|
||
JRST BINDLP ;DO NEXT
|
||
|
||
NONID: CAILE 0,-4(E)
|
||
JRST SPECBD
|
||
SUB E,[4,,4]
|
||
SKIPE D
|
||
HRRM E,(D)
|
||
SKIPN (P)
|
||
MOVEM E,(P)
|
||
|
||
MOVE D,1(E) ;GET PTR TO VECTOR
|
||
MOVE C,(D) ;EXCHANGE TYPES
|
||
EXCH C,2(E)
|
||
MOVEM C,(D)
|
||
|
||
MOVE C,1(D) ;EXCHANGE DATUMS
|
||
EXCH C,3(E)
|
||
MOVEM C,1(D)
|
||
|
||
MOVEI A,TBVL
|
||
HRLM A,(E) ;IDENTIFY BIND BLOCK
|
||
MOVE D,E ;REMEMBER LINK
|
||
JRST BINDLP
|
||
|
||
SPECBD: SKIPE D
|
||
MOVE SP,SPSTOR+1
|
||
HRRM SP,(D)
|
||
SKIPE D,(P)
|
||
MOVEM D,SPSTOR+1
|
||
SUB P,[2,,2]
|
||
POPJ P,
|
||
|
||
|
||
; HERE TO IMPURIFY THE ATOM
|
||
|
||
SPCUNP: PUSH TP,$TSP
|
||
PUSH TP,E
|
||
PUSH TP,$TSP
|
||
PUSH TP,-1(P) ; LINK BACK IS AN SP
|
||
PUSH TP,$TSP
|
||
PUSH TP,B
|
||
CAIN B,1
|
||
SETZM -1(TP) ; FIXUP SOME FUNNYNESS
|
||
MOVE B,C
|
||
PUSHJ P,IMPURIFY
|
||
MOVE 0,-2(TP) ; RESTORE LINK BACK POINTER
|
||
MOVEM 0,-1(P)
|
||
MOVE E,-4(TP)
|
||
MOVE C,B
|
||
MOVE B,(TP)
|
||
SUB TP,[6,,6]
|
||
MOVEI 0,(TB)
|
||
POPJ P,
|
||
|
||
; ENTRY FROM COMPILER TO SET UP A BINDING
|
||
|
||
IBIND: MOVE SP,SPSTOR+1
|
||
SUBI E,-5(SP) ; CHANGE TO PDL POINTER
|
||
HRLI E,(E)
|
||
ADD E,SP
|
||
MOVEM C,-4(E)
|
||
MOVEM A,-3(E)
|
||
MOVEM B,-2(E)
|
||
HRLOI A,TATOM
|
||
MOVEM A,-5(E)
|
||
MOVSI A,TLIST
|
||
MOVEM A,-1(E)
|
||
MOVEM D,(E)
|
||
JRST SPECB1 ; NOW BIND IT
|
||
|
||
; "FAST CALL TO SPECBIND"
|
||
|
||
|
||
|
||
; Compiler's call to SPECBIND all atom bindings, no TBVLs etc.
|
||
|
||
SPECBND:
|
||
MOVE E,TP ; POINT TO BINDING WITH E
|
||
SPECB1: PUSH P,[0] ; SLOTS OF INTEREST
|
||
PUSH P,[0]
|
||
SUBM M,-2(P)
|
||
|
||
SPECB2: MOVEI 0,(TB) ; FOR FRAME CHECK
|
||
MOVE A,-5(E) ; LOOK AT FIRST THING
|
||
CAMN A,BNDA ; SKIP IF LOSER
|
||
CAILE 0,-5(E) ; SKIP IF REAL WINNER
|
||
JRST SPECB3
|
||
|
||
SUB E,[5,,5] ; POINT TO BINDING
|
||
SKIPE A,(P) ; LINK?
|
||
HRRM E,(A) ; YES DO IT
|
||
SKIPN -1(P) ; FIRST ONE?
|
||
MOVEM E,-1(P) ; THIS IS IT
|
||
|
||
MOVE A,1(E) ; POINT TO ATOM
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE 0,BINDID+1(PVP) ; QUICK CHECK
|
||
HRLI 0,TLOCI
|
||
CAMN 0,(A) ; WINNERE?
|
||
JRST SPECB4 ; YES, GO ON
|
||
|
||
PUSH P,B ; SAVE REST OF ACS
|
||
PUSH P,C
|
||
PUSH P,D
|
||
MOVE B,A ; FOR ILOC TO WORK
|
||
PUSHJ P,SILOC ; GO LOOK IT UP
|
||
JUMPE B,SPECB9
|
||
MOVE PVP,PVSTOR+1
|
||
HRRZ C,SPBASE+1(PVP)
|
||
MOVEI A,(TP)
|
||
CAIL A,(B) ; SKIP IF LOSER
|
||
CAILE C,(B) ; SKIP IF WINNER
|
||
MOVEI B,1 ; SAY NO BACK POINTER
|
||
SPECB9: MOVE C,1(E) ; POINT TO ATOM
|
||
SKIPE (C) ; IF GLOBALLY BOUND, MAKE SURE OK
|
||
JUMPE B,.-3
|
||
MOVEI A,(C) ; PURE ATOM?
|
||
CAIGE A,HIBOT ; SKIP IF OK
|
||
JRST .+4
|
||
PUSH P,-4(P) ; MAKE HAPPINESS
|
||
PUSHJ P,SPCUNP ; IMPURIFY
|
||
POP P,-5(P)
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE A,BINDID+1(PVP)
|
||
HRLI A,TLOCI
|
||
MOVEM A,(C) ; STOR POINTER INDICATOR
|
||
MOVE A,B
|
||
POP P,D
|
||
POP P,C
|
||
POP P,B
|
||
JRST SPECB5
|
||
|
||
SPECB4: MOVE A,1(A) ; GET LOCATIVE
|
||
SPECB5: EXCH A,5(E) ; CLOBBER INTO REBIND SLOT (GET DECL)
|
||
HLL A,OTBSAV(TB) ; TIME IT
|
||
MOVSM A,4(E) ; SAVE DECL AND TIME
|
||
MOVEI A,TBIND
|
||
HRLM A,(E) ; CHANGE TO A BINDING
|
||
MOVE A,1(E) ; POINT TO ATOM
|
||
MOVEM E,(P) ; REMEMBER THIS GUY
|
||
ADD E,[2,,2] ; POINT TO VAL CELL
|
||
MOVEM E,1(A) ; INTO ATOM SLOT
|
||
SUB E,[3,,3] ; POINT TO NEXT ONE
|
||
JRST SPECB2
|
||
|
||
SPECB3: SKIPE A,(P)
|
||
MOVE SP,SPSTOR+1
|
||
HRRM SP,(A) ; LINK OLD STUFF
|
||
SKIPE A,-1(P) ; NEW SP?
|
||
MOVEM A,SPSTOR+1
|
||
SUB P,[2,,2]
|
||
INTGO ; IN CASE BLEW STACK
|
||
SUBM M,(P)
|
||
POPJ P,
|
||
|
||
|
||
;SPECSTORE RESTORES THE BINDINGS SP TO THE ENVIRONMENT POINTER IN
|
||
;SPSAV (TB). IT IS CALLED BY PUSHJ P,SPECSTORE.
|
||
|
||
SPECSTORE:
|
||
PUSH P,E
|
||
HRRZ E,SPSAV (TB) ;GET TARGET POINTER
|
||
PUSHJ P,STLOOP
|
||
POP P,E
|
||
MOVE SP,SPSAV(TB) ; GET NEW SP
|
||
MOVEM SP,SPSTOR+1
|
||
POPJ P,
|
||
|
||
STLOOP: MOVE SP,SPSTOR+1
|
||
PUSH P,D
|
||
PUSH P,C
|
||
|
||
STLOO1: CAIL E,(SP) ;ARE WE DONE?
|
||
JRST STLOO2
|
||
HLRZ C,(SP) ;GET TYPE OF BIND
|
||
CAIN C,TUBIND
|
||
JRST .+3
|
||
CAIE C,TBIND ;NORMAL IDENTIFIER?
|
||
JRST ISTORE ;NO -- SPECIAL HACK
|
||
|
||
|
||
MOVE C,1(SP) ;GET TOP ATOM
|
||
MOVSI 0,TLOCI ; MAYBE LOCI OR UNBOUND
|
||
SKIPL D,5(SP)
|
||
MOVSI 0,TUNBOU
|
||
MOVE PVP,PVSTOR+1
|
||
HRR 0,BINDID+1(PVP) ;STORE SIGNATURE
|
||
SKIPN 5(SP)
|
||
MOVEI 0,0 ; TOTALLY UNBOUND IN ALL CASES
|
||
MOVEM 0,(C) ;CLOBBER INTO ATOM
|
||
MOVEM D,1(C)
|
||
SETZM 4(SP)
|
||
SPLP: HRRZ SP,(SP) ;FOLOW LINK
|
||
JUMPN SP,STLOO1 ;IF MORE
|
||
SKIPE E ; OK IF E=0
|
||
FATAL SP OVERPOP
|
||
STLOO2: MOVEM SP,SPSTOR+1
|
||
POP P,C
|
||
POP P,D
|
||
POPJ P,
|
||
|
||
ISTORE: CAIE C,TBVL
|
||
JRST CHSKIP
|
||
MOVE C,1(SP)
|
||
MOVE D,2(SP)
|
||
MOVEM D,(C)
|
||
MOVE D,3(SP)
|
||
MOVEM D,1(C)
|
||
JRST SPLP
|
||
|
||
CHSKIP: CAIN C,TSKIP
|
||
JRST SPLP
|
||
CAIE C,TUNWIN ; UNWIND HACK
|
||
FATAL BAD SP
|
||
HRRZ C,-2(P) ; WHERE FROM?
|
||
CAIE C,CHUNPC
|
||
JRST SPLP ; IGNORE
|
||
MOVEI E,(TP) ; FIXUP SP
|
||
SUBI E,(SP)
|
||
MOVSI E,(E)
|
||
HLL SP,TP
|
||
SUB SP,E
|
||
POP P,C
|
||
POP P,D
|
||
AOS (P)
|
||
POPJ P,
|
||
|
||
; ENTRY FOR FUNNY COMPILER UNBIND (1)
|
||
|
||
SSPECS: PUSH P,E
|
||
MOVEI E,(TP)
|
||
PUSHJ P,STLOOP
|
||
SSPEC2: SUBI E,(SP) ; MAKE SP BE AOBJN
|
||
MOVSI E,(E)
|
||
HLL SP,TP
|
||
SUB SP,E
|
||
MOVEM SP,SPSTOR+1
|
||
POP P,E
|
||
POPJ P,
|
||
|
||
; ENTRY FOR FUNNY COMPILER UNBIND (2)
|
||
|
||
SSPEC1: PUSH P,E
|
||
SUBI E,1 ; MAKE SURE GET CURRENT BINDING
|
||
PUSHJ P,STLOOP ; UNBIND
|
||
MOVEI E,(TP) ; NOW RESET SP
|
||
JRST SSPEC2
|
||
|
||
EFINIS: MOVE PVP,PVSTOR+1
|
||
SKIPN C,1STEPR+1(PVP) ; SKIP NIF BEING ONE PROCEEDED
|
||
JRST FINIS
|
||
PUSH TP,$TATOM
|
||
PUSH TP,MQUOTE EVLOUT
|
||
PUSH TP,A ;SAVE EVAL RESULTS
|
||
PUSH TP,B
|
||
PUSH TP,[TINFO,,2] ; FENCE POST
|
||
PUSHJ P,TBTOTP
|
||
PUSH TP,D
|
||
PUSHJ P,MAKINF ; MAKE ARG BLOCK INFO
|
||
PUSH TP,A
|
||
MOVEI B,-6(TP)
|
||
HRLI B,-4 ; AOBJN TO ARGS BLOCK
|
||
PUSH TP,B
|
||
MOVE PVP,PVSTOR+1
|
||
PUSH TP,1STEPR(PVP)
|
||
PUSH TP,1STEPR+1(PVP) ; PROCESS DOING THE 1STEPPING
|
||
MCALL 2,RESUME
|
||
MOVE A,-3(TP) ; GET BACK EVAL VALUE
|
||
MOVE B,-2(TP)
|
||
JRST FINIS
|
||
|
||
1STEPI: PUSH TP,$TATOM
|
||
PUSH TP,MQUOTE EVLIN
|
||
PUSH TP,$TAB ; PUSH EVALS ARGGS
|
||
PUSH TP,AB
|
||
PUSHJ P,MAKINF ; TURN INTO ARGS BLOCK
|
||
MOVEM A,-1(TP) ; AND CLOBBER
|
||
PUSH TP,[TINFO,,2] ; FENCE POST 2D TUPLE
|
||
PUSHJ P,TBTOTP
|
||
PUSH TP,D
|
||
PUSHJ P,MAKINF ; TURN IT INTO ARGS BLOCK
|
||
PUSH TP,A
|
||
MOVEI B,-6(TP) ; SETUP TUPLE
|
||
HRLI B,-4
|
||
PUSH TP,B
|
||
MOVE PVP,PVSTOR+1
|
||
PUSH TP,1STEPR(PVP)
|
||
PUSH TP,1STEPR+1(PVP)
|
||
MCALL 2,RESUME ; START UP 1STEPERR
|
||
SUB TP,[6,,6] ; REMOVE CRUD
|
||
GETYP A,A ; GET 1STEPPERS TYPE
|
||
CAIE A,TDISMI ; IF DISMISS, STOP 1 STEPPING
|
||
JRST EVALON
|
||
|
||
; HERE TO PUSH DOWN THE 1 STEP STATE AND RUN
|
||
|
||
MOVE D,PVP
|
||
ADD D,[1STEPR,,1STEPR] ; POINT TO 1 STEP SLOT
|
||
PUSH TP,$TSP ; SAVE CURRENT SP
|
||
PUSH TP,SPSTOR+1
|
||
PUSH TP,BNDV
|
||
PUSH TP,D ; BIND IT
|
||
PUSH TP,$TPVP
|
||
PUSH TP,[0] ; NO 1 STEPPER UNTIL POPJ
|
||
PUSHJ P,SPECBIND
|
||
|
||
; NOW PUSH THE ARGS UP TO RE-CALL EVAL
|
||
|
||
MOVEI A,0
|
||
EFARGL: JUMPGE AB,EFCALL
|
||
PUSH TP,(AB)
|
||
PUSH TP,1(AB)
|
||
ADD AB,[2,,2]
|
||
AOJA A,EFARGL
|
||
|
||
EFCALL: ACALL A,EVAL ; NOW DO THE EVAL
|
||
MOVE C,(TP) ; PRE-UNBIND
|
||
MOVE PVP,PVSTOR+1
|
||
MOVEM C,1STEPR+1(PVP)
|
||
MOVE SP,-4(TP) ; AVOID THE UNBIND
|
||
MOVEM SP,SPSTOR+1
|
||
SUB TP,[6,,6] ; AND FLUSH LOSERS
|
||
JRST EFINIS ; AND TRY TO FINISH UP
|
||
|
||
MAKINF: HLRZ A,OTBSAV(TB) ; TIME IT
|
||
HRLI A,TARGS
|
||
POPJ P,
|
||
|
||
|
||
TBTOTP: MOVEI D,(TB) ; COMPUTE REL DIST FROM TP TO TB
|
||
SUBI D,(TP)
|
||
POPJ P,
|
||
; ARRIVE HERE TO COMPLETE A COMPILER GENERATED TUPLE
|
||
; D/ LENGTH OF THE TUPLE IN WORDS
|
||
|
||
MAKTU2: MOVE D,-1(P) ; GET LENGTH
|
||
ASH D,1
|
||
PUSHJ P,MAKTUP
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
POPJ P,
|
||
|
||
MAKTUP: HRLI D,TINFO ; FIRST WORD OF FENCE POST
|
||
PUSH TP,D
|
||
HRROI B,(TP) ; TOP OF TUPLE
|
||
SUBI B,(D)
|
||
TLC B,-1(D) ; AOBJN IT
|
||
PUSHJ P,TBTOTP
|
||
PUSH TP,D
|
||
HLRZ A,OTBSAV(TB) ; TIME IT
|
||
HRLI A,TARGS
|
||
POPJ P,
|
||
|
||
; HERE TO ALLOCATE SLOTS FOR COMPILER (AMNT IN A)
|
||
|
||
TPALOC: SUBM M,(P)
|
||
;Once here ==>ADDI A,1 Bug???
|
||
HRLI A,(A)
|
||
ADD TP,A
|
||
PUSH P,A
|
||
SKIPL TP
|
||
PUSHJ P,TPOVFL ; IN CASE IT LOST
|
||
INTGO ; TAKE THE GC IF NEC
|
||
HRRI A,2(TP)
|
||
SUB A,(P)
|
||
SETZM -1(A)
|
||
HRLI A,-1(A)
|
||
BLT A,(TP)
|
||
SUB P,[1,,1]
|
||
JRST POPJM
|
||
|
||
|
||
NTPALO: PUSH TP,[0]
|
||
SOJG 0,.-1
|
||
POPJ P,
|
||
|
||
;EVALUATES A IDENTIFIER -- GETS LOCAL VALUE IF THERE IS ONE, OTHERWISE GLOBAL.
|
||
|
||
IMFUNCTION VALUE,SUBR
|
||
JSP E,CHKAT
|
||
PUSHJ P,IDVAL
|
||
JRST FINIS
|
||
|
||
IDVAL: PUSHJ P,IDVAL1
|
||
CAMN A,$TUNBOU
|
||
JRST UNBOU
|
||
POPJ P,
|
||
|
||
IDVAL1: PUSH TP,A
|
||
PUSH TP,B ;SAVE ARG IN CASE NEED TO CHECK GLOBAL VALUE
|
||
PUSHJ P,ILVAL ;LOCAL VALUE FINDER
|
||
CAME A,$TUNBOUND ;IF NOT UNBOUND OR UNASSIGNED
|
||
JRST RIDVAL ;DONE - CLEAN UP AND RETURN
|
||
POP TP,B ;GET ARG BACK
|
||
POP TP,A
|
||
JRST IGVAL
|
||
RIDVAL: SUB TP,[2,,2]
|
||
POPJ P,
|
||
|
||
;GETS THE LOCAL VALUE OF AN IDENTIFIER
|
||
|
||
IMFUNCTION LVAL,SUBR
|
||
JSP E,CHKAT
|
||
PUSHJ P,AILVAL
|
||
CAME A,$TUNBOUND
|
||
JRST FINIS
|
||
JUMPN B,UNAS
|
||
JRST UNBOU
|
||
|
||
; MAKE AN ATOM UNASSIGNED
|
||
|
||
MFUNCTION UNASSIGN,SUBR
|
||
JSP E,CHKAT ; GET ATOM ARG
|
||
PUSHJ P,AILOC
|
||
UNASIT: CAMN A,$TUNBOU ; IF UNBOUND
|
||
JRST RETATM
|
||
MOVSI A,TUNBOU
|
||
MOVEM A,(B)
|
||
SETOM 1(B) ; MAKE SURE
|
||
RETATM: MOVE B,1(AB)
|
||
MOVE A,(AB)
|
||
JRST FINIS
|
||
|
||
; UNASSIGN GLOBALLY
|
||
|
||
MFUNCTION GUNASSIGN,SUBR
|
||
JSP E,CHKAT2
|
||
PUSHJ P,IGLOC
|
||
CAMN A,$TUNBOU
|
||
JRST RETATM
|
||
MOVE B,1(AB) ; ATOM BACK
|
||
MOVEI 0,(B)
|
||
CAIL 0,HIBOT ; SKIP IF IMPURE
|
||
PUSHJ P,IMPURIFY ; YES, MAKE IT IMPURE
|
||
PUSHJ P,IGLOC ; RESTORE LOCATIVE
|
||
HRRZ 0,-2(B) ; SEE IF MANIFEST
|
||
GETYP A,(B) ; AND CURRENT TYPE
|
||
CAIN 0,-1
|
||
CAIN A,TUNBOU
|
||
JRST UNASIT
|
||
SKIPE IGDECL
|
||
JRST UNASIT
|
||
MOVE D,B
|
||
JRST MANILO
|
||
|
||
; GETS A LOCATIVE TO THE LOCAL VALUE OF AN IDENTIFIER.
|
||
|
||
MFUNCTION LLOC,SUBR
|
||
JSP E,CHKAT
|
||
PUSHJ P,AILOC
|
||
CAMN A,$TUNBOUND
|
||
JRST UNBOU
|
||
MOVSI A,TLOCD
|
||
HRR A,2(B)
|
||
JRST FINIS
|
||
|
||
;TESTS TO SEE IF AN IDENTIFIER IS LOCALLY BOUND
|
||
|
||
MFUNCTION BOUND,SUBR,[BOUND?]
|
||
JSP E,CHKAT
|
||
PUSHJ P,AILVAL
|
||
CAMN A,$TUNBOUND
|
||
JUMPE B,IFALSE
|
||
JRST TRUTH
|
||
|
||
;TESTS TO SEE IF AN IDENTIFIER IS LOCALLY ASSIGNED
|
||
|
||
MFUNCTION ASSIGP,SUBR,[ASSIGNED?]
|
||
JSP E,CHKAT
|
||
PUSHJ P,AILVAL
|
||
CAME A,$TUNBOUND
|
||
JRST TRUTH
|
||
; JUMPE B,UNBOU
|
||
JRST IFALSE
|
||
|
||
;GETS THE GLOBAL VALUE OF AN IDENTIFIER
|
||
|
||
IMFUNCTION GVAL,SUBR
|
||
JSP E,CHKAT2
|
||
PUSHJ P,IGVAL
|
||
CAMN A,$TUNBOUND
|
||
JRST UNAS
|
||
JRST FINIS
|
||
|
||
;GETS A LOCATIVE TO THE GLOBAL VALUE OF AN IDENTIFIER
|
||
|
||
MFUNCTION RGLOC,SUBR
|
||
|
||
JRST GLOC
|
||
|
||
MFUNCTION GLOC,SUBR
|
||
|
||
JUMPGE AB,TFA
|
||
CAMGE AB,[-5,,]
|
||
JRST TMA
|
||
JSP E,CHKAT1
|
||
MOVEI E,IGLOC
|
||
CAML AB,[-2,,]
|
||
JRST .+4
|
||
GETYP 0,2(AB)
|
||
CAIE 0,TFALSE
|
||
MOVEI E,IIGLOC
|
||
PUSHJ P,(E)
|
||
CAMN A,$TUNBOUND
|
||
JRST UNAS
|
||
MOVSI A,TLOCD
|
||
HRRZ 0,FSAV(TB)
|
||
CAIE 0,GLOC
|
||
MOVSI A,TLOCR
|
||
CAIE 0,GLOC
|
||
SUB B,GLOTOP+1
|
||
MOVE C,1(AB) ; GE ATOM
|
||
MOVEI 0,(C)
|
||
CAIGE 0,HIBOT ; SKIP IF PURE ATOM
|
||
JRST FINIS
|
||
|
||
; MAKE ATOM AND VALUE IMPURE IF GETTING GLOC TO IT
|
||
|
||
MOVE B,C ; ATOM TO B
|
||
PUSHJ P,IMPURIFY
|
||
JRST GLOC ; AND TRY AGAIN
|
||
|
||
;TESTS TO SEE IF AN IDENTIFIER IS GLOBALLY ASSIGNED
|
||
|
||
MFUNCTION GASSIG,SUBR,[GASSIGNED?]
|
||
JSP E,CHKAT2
|
||
PUSHJ P,IGVAL
|
||
CAMN A,$TUNBOUND
|
||
JRST IFALSE
|
||
JRST TRUTH
|
||
|
||
; TEST FOR GLOBALLY BOUND
|
||
|
||
MFUNCTION GBOUND,SUBR,[GBOUND?]
|
||
|
||
JSP E,CHKAT2
|
||
PUSHJ P,IGLOC
|
||
JUMPE B,IFALSE
|
||
JRST TRUTH
|
||
|
||
|
||
|
||
CHKAT2: ENTRY 1
|
||
CHKAT1: GETYP A,(AB)
|
||
MOVSI A,(A)
|
||
CAME A,$TATOM
|
||
JRST NONATM
|
||
MOVE B,1(AB)
|
||
JRST (E)
|
||
|
||
CHKAT: HLRE A,AB ; - # OF ARGS
|
||
ASH A,-1 ; TO ACTUAL WORDS
|
||
JUMPGE AB,TFA
|
||
MOVE C,SPSTOR+1 ; FOR BINDING LOOKUPS
|
||
AOJE A,CHKAT1 ; ONLY ONE ARG, NO ENVIRONMENT
|
||
AOJL A,TMA ; TOO MANY
|
||
GETYP A,2(AB) ; MAKE SURE OF TENV OR TFRAME
|
||
CAIE A,TFRAME
|
||
CAIN A,TENV
|
||
JRST CHKAT3
|
||
CAIN A,TACT ; FOR PFISTERS LOSSAGE
|
||
JRST CHKAT3
|
||
CAIE A,TPVP ; OR PROCESS
|
||
JRST WTYP2
|
||
MOVE B,3(AB) ; GET PROCESS
|
||
MOVE C,SPSTOR+1 ; IN CASE ITS ME
|
||
CAME B,PVSTOR+1 ; SKIP IF DIFFERENT
|
||
MOVE C,SPSTO+1(B) ; GET ITS SP
|
||
JRST CHKAT1
|
||
CHKAT3: MOVEI B,2(AB) ; POINT TO FRAME POINTER
|
||
PUSHJ P,CHFRM ; VALIDITY CHECK
|
||
MOVE B,3(AB) ; GET TB FROM FRAME
|
||
MOVE C,SPSAV(B) ; GET ENVIRONMENT POINTER
|
||
JRST CHKAT1
|
||
|
||
|
||
; SILOC--CALLS ILOC IGNORING SPECIAL CHECKING
|
||
|
||
SILOC: JFCL
|
||
|
||
;ILOC RETURNS IN A AND B A LOCATIVE TO THE LOCAL VALUE OF THE IDENTIFIER
|
||
; PASSED TO IT IN A AND B. IF THE IDENTIFIER IS LOCALLY UNBOUND IT RETURNS
|
||
; $TUNBOUND IN A AND 0 IN B, IT IS CALLED BY PUSHJ P,ILOC.
|
||
|
||
ILOC: MOVE C,SPSTOR+1 ; SETUP SEARCH START
|
||
AILOC: SKIPN (B) ; ANY KIND OF VALUE AT ALL?
|
||
JUMPN B,FUNPJ
|
||
MOVSI A,TLOCI ;MAKE A LOCATIVE TYPE CELL
|
||
PUSH P,E
|
||
PUSH P,D
|
||
MOVEI E,0 ; FLAG TO CLOBBER ATOM
|
||
JUMPE B,SCHSP ; IF LOOKING FOR SLOT, SEARCH NOW
|
||
CAME C,SPSTOR+1 ; ENVIRONMENT CHANGE?
|
||
JRST SCHSP ; YES, MUST SEARCH
|
||
MOVE PVP,PVSTOR+1
|
||
HRR A,BINDID+1(PVP) ;FOR THE CURRENT PROCESS
|
||
CAME A,(B) ;IS THERE ONE IN THE VALUE CELL?
|
||
JRST SCHLP ;NO -- SEARCH THE LOCAL BINDINGS
|
||
MOVE B,1(B) ;YES -- GET LOCATIVE POINTER
|
||
MOVE C,PVP
|
||
ILCPJ: MOVE E,SPCCHK
|
||
TRNN E,1 ; SKIP IF DOING SPEC UNSPEC CHECK
|
||
JRST ILOCPJ
|
||
HRRZ E,-2(P) ; IF IGNORING, IGNORE
|
||
HRRZ E,-1(E)
|
||
CAIN E,SILOC
|
||
JRST ILOCPJ
|
||
HLRZ E,-2(B)
|
||
CAIE E,TUBIND
|
||
JRST ILOCPJ
|
||
CAMGE B,CURFCN+1(PVP)
|
||
JRST SCHLPX
|
||
MOVEI D,-2(B)
|
||
HRRZ SP,SPSTOR+1
|
||
CAIG D,(SP)
|
||
CAMGE B,SPBASE+1(PVP)
|
||
JRST SCHLPX
|
||
MOVE C,PVSTOR+1
|
||
ILOCPJ: POP P,D
|
||
POP P,E
|
||
POPJ P, ;FROM THE VALUE CELL
|
||
|
||
SCHLPX: MOVEI E,1
|
||
MOVE C,SPSTOR+1
|
||
MOVE B,-1(B)
|
||
JRST SCHLP
|
||
|
||
|
||
SCHLP5: SETOM (P)
|
||
JRST SCHLP2
|
||
|
||
SCHLP: MOVEI D,(B)
|
||
CAIL D,HIBOT ; SKIP IF IMPURE ATOM
|
||
SCHSP: MOVEI E,1 ; DONT STORE LOCATIVE
|
||
|
||
PUSH P,E ; PUSH SWITCH
|
||
MOVE E,PVSTOR+1 ; GET PROC
|
||
SCHLP1: JUMPE C,UNPJ ;IF NO MORE -- LOSE
|
||
CAMN B,1(C) ;ARE WE POINTING AT THE WINNER?
|
||
JRST SCHFND ;YES
|
||
GETYP D,(C) ; CHECK SKIP
|
||
CAIE D,TSKIP
|
||
JRST SCHLP2
|
||
PUSH P,B ; CHECK DETOUR
|
||
MOVEI B,2(C)
|
||
PUSHJ P,CHFRAM ; NON-FATAL FRAME CHECKER
|
||
HRRZ E,2(C) ; CONS UP PROCESS
|
||
SUBI E,PVLNT*2+1
|
||
HRLI E,-2*PVLNT
|
||
JUMPE B,SCHLP3 ; LOSER, FIX IT
|
||
POP P,B
|
||
MOVEI C,1(C) ; FOLLOW LOOKUP CHAIN
|
||
SCHLP2: HRRZ C,(C) ;FOLLOW LINK
|
||
JRST SCHLP1
|
||
|
||
SCHLP3: POP P,B
|
||
HRRZ SP,SPSTOR+1
|
||
MOVEI C,(SP) ; *** NDR'S BUG ***
|
||
CAME E,PVSTOR+1 ; USE IF CURRENT PROCESS
|
||
HRRZ C,SPSTO+1(E) ; USE CURRENT SP FOR PROC
|
||
JRST SCHLP1
|
||
|
||
SCHFND: MOVE D,SPCCHK
|
||
TRNN D,1 ; SKIP IF DOING SPEC UNSPEC CHECK
|
||
JRST SCHFN1
|
||
HRRZ D,-2(P) ; IF IGNORING, IGNORE
|
||
HRRZ D,-1(D)
|
||
CAIN D,SILOC
|
||
JRST ILOCPJ
|
||
HLRZ D,(C)
|
||
CAIE D,TUBIND
|
||
JRST SCHFN1
|
||
HRRZ D,CURFCN+1(PVP)
|
||
CAIL D,(C)
|
||
JRST SCHLP5
|
||
HRRZ SP,SPSTOR+1
|
||
HRRZ D,SPBASE+1(PVP)
|
||
CAIL SP,(C)
|
||
CAIL D,(C)
|
||
JRST SCHLP5
|
||
|
||
SCHFN1: EXCH B,C ;SAVE THE ATOM PTR IN C
|
||
MOVEI B,2(B) ;MAKE UP THE LOCATIVE
|
||
SUB B,TPBASE+1(E)
|
||
HRLI B,(B)
|
||
ADD B,TPBASE+1(E)
|
||
EXCH C,E ; RET PROCESS IN C
|
||
POP P,D ; RESTORE SWITCH
|
||
|
||
JUMPN D,ILOCPJ ; DONT CLOBBER ATOM
|
||
MOVEM A,(E) ;CLOBBER IT AWAY INTO THE
|
||
MOVE D,1(E) ; GET OLD POINTER
|
||
MOVEM B,1(E) ;ATOM'S VALUE CELL
|
||
JUMPE D,ILOCPJ ; IF POINTS TO GLOBAL OR OTHER PROCES
|
||
; MAKE SURE BINDING SO INDICATES
|
||
MOVE D,B ; POINT TO BINDING
|
||
SKIPL E,3(D) ; GO TO FIRST ONE, JUST IN CASE
|
||
JRST .+3
|
||
MOVE D,E
|
||
JRST .-3 ; LOOP THROUGH
|
||
MOVEI E,1
|
||
MOVEM E,3(D) ; MAGIC INDICATION
|
||
JRST ILOCPJ
|
||
|
||
UNPJ: SUB P,[1,,1] ; FLUSH CRUFT
|
||
UNPJ1: MOVE C,E ; RET PROCESS ANYWAY
|
||
UNPJ11: POP P,D
|
||
POP P,E
|
||
UNPOPJ: MOVSI A,TUNBOUND
|
||
MOVEI B,0
|
||
POPJ P,
|
||
|
||
FUNPJ: MOVE C,PVSTOR+1
|
||
JRST UNPOPJ
|
||
|
||
;IGLOC RETURNS IN A AND B A LOCATIVE TO THE GLOBAL VALUE OF THE
|
||
;IDENTIFIER PASSED TO IT IN A AND B. IF THE IDENTIFIER IS GLOBALLY
|
||
;UNBPOUND IT RETURNS $TUNBOUND IN A AND 0 IN B. IT IS CALLED BY PUSHJ P,IGLOC.
|
||
|
||
IGLOC: MOVSI A,TLOCI ;DO WE HAVE A LOCATIVE TO
|
||
CAME A,(B) ;A PROCESS #0 VALUE?
|
||
JRST SCHGSP ;NO -- SEARCH
|
||
MOVE B,1(B) ;YES -- GET VALUE CELL
|
||
POPJ P,
|
||
|
||
SCHGSP: SKIPN (B)
|
||
JRST UNPOPJ
|
||
MOVE D,GLOBSP+1 ;GET GLOBAL SP PTR
|
||
|
||
SCHG1: JUMPGE D,UNPOPJ ;IF NO MORE, LEAVE
|
||
CAMN B,1(D) ;ARE WE FOUND?
|
||
JRST GLOCFOUND ;YES
|
||
ADD D,[4,,4] ;NO -- TRY NEXT
|
||
JRST SCHG1
|
||
|
||
GLOCFOUND:
|
||
EXCH B,D ;SAVE ATOM PTR
|
||
ADD B,[2,,2] ;MAKE LOCATIVE
|
||
MOVEI 0,(D)
|
||
CAIL 0,HIBOT
|
||
POPJ P,
|
||
MOVEM A,(D) ;CLOBBER IT AWAY
|
||
MOVEM B,1(D)
|
||
POPJ P,
|
||
|
||
IIGLOC: PUSH TP,$TATOM
|
||
PUSH TP,B
|
||
PUSHJ P,IGLOC
|
||
MOVE C,(TP)
|
||
SUB TP,[2,,2]
|
||
GETYP 0,A
|
||
CAIE 0,TUNBOU
|
||
POPJ P,
|
||
PUSH TP,$TATOM
|
||
PUSH TP,C
|
||
MOVEI 0,(C)
|
||
MOVE B,C
|
||
CAIL 0,$TLOSE
|
||
PUSHJ P,IMPURI ; IMPURIFY THE POOR ATOM
|
||
PUSHJ P,BSETG ; MAKE A SLOT
|
||
SETOM 1(B) ; UNBOUNDIFY IT
|
||
MOVSI A,TLOCD
|
||
MOVSI 0,TUNBOU
|
||
MOVEM 0,(B)
|
||
SUB TP,[2,,2]
|
||
POPJ P,
|
||
|
||
|
||
|
||
;ILVAL RETURNS IN A AND B THE LOCAL VALUE OF THE IDENTIFIER PASSED TO IT IN A AND B
|
||
;IF THE IDENTIFIER IS UNBOUND ITS VALUE IS $TUNBOUND IN A AND 0 IN B. IF
|
||
;IT IS UNASSIGNED ITS VALUE IS $TUNBOUND IN A AND -1 IN B. CALL - PUSHJ P,IVAL
|
||
|
||
AILVAL:
|
||
PUSHJ P,AILOC ; USE SUPPLIED SP
|
||
JRST CHVAL
|
||
ILVAL:
|
||
PUSHJ P,ILOC ;GET LOCATIVE TO VALUE
|
||
CHVAL: CAMN A,$TUNBOUND ;BOUND
|
||
POPJ P, ;NO -- RETURN
|
||
MOVSI A,TLOCD ; GET GOOD TYPE
|
||
HRR A,2(B) ; SHOULD BE TIME OR 0
|
||
PUSH P,0
|
||
PUSHJ P,RMONC0 ; CHECK READ MONITOR
|
||
POP P,0
|
||
MOVE A,(B) ;GET THE TYPE OF THE VALUE
|
||
MOVE B,1(B) ;GET DATUM
|
||
POPJ P,
|
||
|
||
;IGVAL -- LIKE ILVAL EXCEPT FOR GLOBAL VALUES
|
||
|
||
IGVAL: PUSHJ P,IGLOC
|
||
JRST CHVAL
|
||
|
||
|
||
|
||
; COMPILERS INTERFACE TO LVAL/GVAL/SETG/SET
|
||
|
||
CILVAL: MOVE PVP,PVSTOR+1
|
||
MOVE 0,BINDID+1(PVP) ; CURRENT BIND
|
||
HRLI 0,TLOCI
|
||
CAME 0,(B) ; HURRAY FOR SPEED
|
||
JRST CILVA1 ; TOO BAD
|
||
MOVE C,1(B) ; POINTER
|
||
MOVE A,(C) ; VAL TYPE
|
||
TLNE A,.RDMON ; MONITORS?
|
||
JRST CILVA1
|
||
GETYP 0,A
|
||
CAIN 0,TUNBOU
|
||
JRST CUNAS ; COMPILER ERROR
|
||
MOVE B,1(C) ; GOT VAL
|
||
MOVE 0,SPCCHK
|
||
TRNN 0,1
|
||
POPJ P,
|
||
HLRZ 0,-2(C) ; SPECIAL CHECK
|
||
CAIE 0,TUBIND
|
||
POPJ P, ; RETURN
|
||
MOVE PVP,PVSTOR+1
|
||
CAMGE C,CURFCN+1(PVP)
|
||
JRST CUNAS
|
||
POPJ P,
|
||
|
||
CUNAS:
|
||
CILVA1: SUBM M,(P) ; FIX (P)
|
||
PUSH TP,$TATOM ; SAVE ATOM
|
||
PUSH TP,B
|
||
MCALL 1,LVAL ; GET ERROR/MONITOR
|
||
|
||
POPJM: SUBM M,(P) ; REPAIR DAMAGE
|
||
POPJ P,
|
||
|
||
; COMPILERS INTERFACE TO SET C/ ATOM A,B/ NEW VALUE
|
||
|
||
CISET: MOVE PVP,PVSTOR+1
|
||
MOVE 0,BINDID+1(PVP) ; CURRENT BINDING ENVIRONMENT
|
||
HRLI 0,TLOCI
|
||
CAME 0,(C) ; CAN WE WIN?
|
||
JRST CISET1 ; NO, MORE HAIR
|
||
MOVE D,1(C) ; POINT TO SLOT
|
||
CISET3: HLLZ 0,(D) ; MON CHECK
|
||
TLNE 0,.WRMON
|
||
JRST CISET4 ; YES, LOSE
|
||
TLZ 0,TYPMSK
|
||
IOR A,0 ; LEAVE MONITOR ON
|
||
MOVE 0,SPCCHK
|
||
TRNE 0,1
|
||
JRST CISET5 ; SPEC/UNSPEC CHECK
|
||
CISET6: MOVEM A,(D) ; STORE
|
||
MOVEM B,1(D)
|
||
POPJ P,
|
||
|
||
CISET5: HLRZ 0,-2(D)
|
||
CAIE 0,TUBIND
|
||
JRST CISET6
|
||
MOVE PVP,PVSTOR+1
|
||
CAMGE D,CURFCN+1(PVP)
|
||
JRST CISET4
|
||
JRST CISET6
|
||
|
||
CISET1: SUBM M,(P) ; FIX ADDR
|
||
PUSH TP,$TATOM ; SAVE ATOM
|
||
PUSH TP,C
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVE B,C ; GET ATOM
|
||
PUSHJ P,ILOC ; SEARCH
|
||
MOVE D,B ; POSSIBLE POINTER
|
||
GETYP E,A
|
||
MOVE 0,A
|
||
MOVE A,-1(TP) ; VAL BACK
|
||
MOVE B,(TP)
|
||
CAIE E,TUNBOU ; SKIP IF WIN
|
||
JRST CISET2 ; GO CLOBBER IT IN
|
||
MCALL 2,SET
|
||
JRST POPJM
|
||
|
||
CISET2: MOVE C,-2(TP) ; ATOM BACK
|
||
SUBM M,(P) ; RESET (P)
|
||
SUB TP,[4,,4]
|
||
JRST CISET3
|
||
|
||
; HERE TO DO A MONITORED SET
|
||
|
||
CISET4: SUBM M,(P) ; AGAIN FIX (P)
|
||
PUSH TP,$TATOM
|
||
PUSH TP,C
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MCALL 2,SET
|
||
JRST POPJM
|
||
|
||
; COMPILER LLOC
|
||
|
||
CLLOC: MOVE PVP,PVSTOR+1
|
||
MOVE 0,BINDID+1(PVP) ; GET CURRENT LOCATIVE
|
||
HRLI 0,TLOCI
|
||
CAME 0,(B) ; WIN?
|
||
JRST CLLOC1
|
||
MOVE B,1(B)
|
||
MOVE 0,SPCCHK
|
||
TRNE 0,1 ; SKIP IF NOT CHECKING
|
||
JRST CLLOC9
|
||
CLLOC3: MOVSI A,TLOCD
|
||
HRR A,2(B) ; GET BIND TIME
|
||
POPJ P,
|
||
|
||
CLLOC1: SUBM M,(P)
|
||
PUSH TP,$TATOM
|
||
PUSH TP,B
|
||
PUSHJ P,ILOC ; LOOK IT UP
|
||
JUMPE B,CLLOC2
|
||
SUB TP,[2,,2]
|
||
CLLOC4: SUBM M,(P)
|
||
JRST CLLOC3
|
||
|
||
CLLOC2: MCALL 1,LLOC
|
||
JRST CLLOC4
|
||
|
||
CLLOC9: HLRZ 0,-2(B)
|
||
CAIE 0,TUBIND
|
||
JRST CLLOC3
|
||
MOVE PVP,PVSTOR+1
|
||
CAMGE B,CURFCN+1(PVP)
|
||
JRST CLLOC2
|
||
JRST CLLOC3
|
||
|
||
; COMPILER BOUND?
|
||
|
||
CBOUND: SUBM M,(P)
|
||
PUSHJ P,ILOC
|
||
JUMPE B,PJFALS ; IF UNBOUND RET FALSE AND NO SSKIP
|
||
PJT1: SOS (P)
|
||
MOVSI A,TATOM
|
||
MOVE B,IMQUOTE T
|
||
JRST POPJM
|
||
|
||
PJFALS: MOVEI B,0
|
||
MOVSI A,TFALSE
|
||
JRST POPJM
|
||
|
||
; COMPILER ASSIGNED?
|
||
|
||
CASSQ: SUBM M,(P)
|
||
PUSHJ P,ILOC
|
||
JUMPE B,PJFALS
|
||
GETYP 0,(B)
|
||
CAIE 0,TUNBOU
|
||
JRST PJT1
|
||
JRST PJFALS
|
||
|
||
|
||
; COMPILER GVAL B/ ATOM
|
||
|
||
CIGVAL: MOVE 0,(B) ; GLOBAL VAL HERE?
|
||
CAME 0,$TLOCI ; TIME=0 ,TYPE=TLOCI => GLOB VAL
|
||
JRST CIGVA1 ; NO, GO LOOK
|
||
MOVE C,1(B) ; POINT TO SLOT
|
||
MOVE A,(C) ; GET TYPE
|
||
TLNE A,.RDMON
|
||
JRST CIGVA1
|
||
GETYP 0,A ; CHECK FOR UNBOUND
|
||
CAIN 0,TUNBOU ; SKIP IF WINNER
|
||
JRST CGUNAS
|
||
MOVE B,1(C)
|
||
POPJ P,
|
||
|
||
CGUNAS:
|
||
CIGVA1: SUBM M,(P)
|
||
PUSH TP,$TATOM
|
||
PUSH TP,B
|
||
.MCALL 1,GVAL ; GET ERROR/MONITOR
|
||
JRST POPJM
|
||
|
||
; COMPILER INTERFACET TO SETG
|
||
|
||
CSETG: MOVE 0,(C) ; GET V CELL
|
||
CAME 0,$TLOCI ; SKIP IF FAST
|
||
JRST CSETG1
|
||
HRRZ D,1(C) ; POINT TO SLOT
|
||
MOVE 0,(D) ; OLD VAL
|
||
CSETG3: CAIG D,HIBOT ; SKIP IF PURE ATOM
|
||
TLNE 0,.WRMON ; MONITOR
|
||
JRST CSETG2
|
||
MOVEM A,(D)
|
||
MOVEM B,1(D)
|
||
POPJ P,
|
||
|
||
CSETG1: SUBM M,(P) ; FIX UP P
|
||
PUSH TP,$TATOM
|
||
PUSH TP,C
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVE B,C
|
||
PUSHJ P,IGLOC ; FIND GLOB LOCATIVE
|
||
GETYP E,A
|
||
MOVE 0,A
|
||
MOVEI D,(B) ; SETUP TO RESTORE NEW VAL
|
||
MOVE A,-1(TP)
|
||
MOVE B,(TP)
|
||
CAIE E,TUNBOU
|
||
JRST CSETG4
|
||
MCALL 2,SETG
|
||
JRST POPJM
|
||
|
||
CSETG4: MOVE C,-2(TP) ; ATOM BACK
|
||
SUBM M,(P) ; RESET (P)
|
||
SUB TP,[4,,4]
|
||
JRST CSETG3
|
||
|
||
CSETG2: SUBM M,(P)
|
||
PUSH TP,$TATOM ; CAUSE A SETG MONITOR
|
||
PUSH TP,C
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MCALL 2,SETG
|
||
JRST POPJM
|
||
|
||
; COMPILER GLOC
|
||
|
||
CGLOC: MOVE 0,(B) ; GET CURRENT GUY
|
||
CAME 0,$TLOCI ; WIN?
|
||
JRST CGLOC1 ; NOPE
|
||
HRRZ D,1(B) ; POINT TO SLOT
|
||
CAILE D,HIBOT ; PURE?
|
||
JRST CGLOC1
|
||
MOVE A,$TLOCD
|
||
MOVE B,1(B)
|
||
POPJ P,
|
||
|
||
CGLOC1: SUBM M,(P)
|
||
PUSH TP,$TATOM
|
||
PUSH TP,B
|
||
MCALL 1,GLOC
|
||
JRST POPJM
|
||
|
||
; COMPILERS GASSIGNED?
|
||
|
||
CGASSQ: MOVE 0,(B)
|
||
SUBM M,(P)
|
||
CAMN 0,$TLOCD
|
||
JRST PJT1
|
||
PUSHJ P,IGLOC
|
||
JUMPE B,PJFALS
|
||
GETYP 0,(B)
|
||
CAIE 0,TUNBOU
|
||
JRST PJT1
|
||
JRST PJFALS
|
||
|
||
; COMPILERS GBOUND?
|
||
|
||
CGBOUN: MOVE 0,(B)
|
||
SUBM M,(P)
|
||
CAMN 0,$TLOCD
|
||
JRST PJT1
|
||
PUSHJ P,IGLOC
|
||
JUMPE B,PJFALS
|
||
JRST PJT1
|
||
|
||
|
||
IMFUNCTION REP,FSUBR,[REPEAT]
|
||
JRST PROG
|
||
MFUNCTION BIND,FSUBR
|
||
JRST PROG
|
||
IMFUNCTION PROG,FSUBR
|
||
ENTRY 1
|
||
GETYP A,(AB) ;GET ARG TYPE
|
||
CAIE A,TLIST ;IS IT A LIST?
|
||
JRST WRONGT ;WRONG TYPE
|
||
SKIPN C,1(AB) ;GET AND CHECK ARGUMENT
|
||
JRST TFA ;TOO FEW ARGS
|
||
SETZB E,D ; INIT HEWITT ATOM AND DECL
|
||
PUSHJ P,CARATC ; IS 1ST THING AN ATOM
|
||
JFCL
|
||
PUSHJ P,RSATY1 ; CDR AND GET TYPE
|
||
CAIE 0,TLIST ; MUST BE LIST
|
||
JRST MPD.13
|
||
MOVE B,1(C) ; GET ARG LIST
|
||
PUSH TP,$TLIST
|
||
PUSH TP,C
|
||
PUSHJ P,RSATYP
|
||
CAIE 0,TDECL
|
||
JRST NOP.DC ; JUMP IF NO DCL
|
||
MOVE D,1(C)
|
||
MOVEM C,(TP)
|
||
PUSHJ P,RSATYP ; CDR ON
|
||
NOP.DC: PUSH TP,$TLIST
|
||
PUSH TP,B ; AND ARG LIST
|
||
PUSHJ P,PRGBND ; BIND AUX VARS
|
||
HRRZ E,FSAV(TB)
|
||
CAIE E,BIND
|
||
SKIPA E,IMQUOTE LPROG,[LPROG ]INTRUP
|
||
JRST .+3
|
||
PUSHJ P,MAKACT ; MAKE ACTIVATION
|
||
PUSHJ P,PSHBND ; BIND AND CHECK
|
||
PUSHJ P,SPECBI ; NAD BIND IT
|
||
|
||
; HERE TO RUN PROGS FUNCTIONS ETC.
|
||
|
||
DOPROG: MOVEI A,REPROG
|
||
HRLI A,TDCLI ; FLAG AS FUNNY
|
||
MOVEM A,(TB) ; WHERE TO AGAIN TO
|
||
MOVE C,1(TB)
|
||
MOVEM C,3(TB) ; RESTART POINTER
|
||
JRST .+2 ; START BY SKIPPING DECL
|
||
|
||
DOPRG1: PUSHJ P,FASTEV
|
||
HRRZ C,@1(TB) ;GET THE REST OF THE BODY
|
||
DOPRG2: MOVEM C,1(TB)
|
||
JUMPN C,DOPRG1
|
||
ENDPROG:
|
||
HRRZ C,FSAV(TB)
|
||
CAIN C,REP
|
||
REPROG: SKIPN C,@3(TB)
|
||
JRST PFINIS
|
||
HRRZM C,1(TB)
|
||
INTGO
|
||
MOVE C,1(TB)
|
||
JRST DOPRG1
|
||
|
||
|
||
PFINIS: GETYP 0,(TB)
|
||
CAIE 0,TDCLI ; DECL'D ?
|
||
JRST PFINI1
|
||
HRRZ 0,(TB) ; SEE IF RSUBR
|
||
JUMPE 0,RSBVCK ; CHECK RSUBR VALUE
|
||
HRRZ C,3(TB) ; GET START OF FCN
|
||
GETYP 0,(C) ; CHECK FOR DECL
|
||
CAIE 0,TDECL
|
||
JRST PFINI1 ; NO, JUST RETURN
|
||
MOVE E,IMQUOTE VALUE
|
||
PUSHJ P,PSHBND ; BUILD FAKE BINDING
|
||
MOVE C,1(C) ; GET DECL LIST
|
||
MOVE E,TP
|
||
PUSHJ P,CHKDCL ; AND CHECK IT
|
||
MOVE A,-3(TP) ; GET VAL BAKC
|
||
MOVE B,-2(TP)
|
||
SUB TP,[6,,6]
|
||
|
||
PFINI1: HRRZ C,FSAV(TB)
|
||
CAIE C,EVAL
|
||
JRST FINIS
|
||
JRST EFINIS
|
||
|
||
RSATYP: HRRZ C,(C)
|
||
RSATY1: JUMPE C,TFA
|
||
GETYP 0,(C)
|
||
POPJ P,
|
||
|
||
; HERE TO CHECK RSUBR VALUE
|
||
|
||
RSBVCK: PUSH TP,A
|
||
PUSH TP,B
|
||
MOVE C,A
|
||
MOVE D,B
|
||
MOVE A,1(TB) ; GET DECL
|
||
MOVE B,1(A)
|
||
HLLZ A,(A)
|
||
PUSHJ P,TMATCH
|
||
JRST RSBVC1
|
||
POP TP,B
|
||
POP TP,A
|
||
POPJ P,
|
||
|
||
RSBVC1: MOVE C,1(TB)
|
||
POP TP,B
|
||
POP TP,D
|
||
MOVE A,IMQUOTE VALUE
|
||
JRST TYPMIS
|
||
|
||
|
||
MFUNCTION MRETUR,SUBR,[RETURN]
|
||
ENTRY
|
||
HLRE A,AB ; GET # OF ARGS
|
||
ASH A,-1 ; TO NUMBER
|
||
AOJL A,RET2 ; 2 OR MORE ARGS
|
||
PUSHJ P,PROGCH ;CHECK IN A PROG
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVEI B,-1(TP) ; VERIFY IT
|
||
COMRET: PUSHJ P,CHFSWP
|
||
SKIPL C ; ARGS?
|
||
MOVEI C,0 ; REAL NONE
|
||
PUSHJ P,CHUNW
|
||
JUMPN A,CHFINI ; WINNER
|
||
MOVSI A,TATOM
|
||
MOVE B,IMQUOTE T
|
||
|
||
; SEE IF MUST CHECK RETURNS TYPE
|
||
|
||
CHFINI: GETYP 0,(TB) ; SPECIAL TYPE IF SO
|
||
CAIE 0,TDCLI
|
||
JRST FINIS ; NO, JUST FINIS
|
||
MOVEI 0,PFINIS ; CAUSE TO FALL INTO FUNCTION CODE
|
||
HRRM 0,PCSAV(TB)
|
||
JRST CONTIN
|
||
|
||
|
||
RET2: AOJL A,TMA
|
||
GETYP A,(AB)+2
|
||
CAIE A,TACT ; AS FOR "EXIT" SHOULD BE ACTIVATION
|
||
JRST WTYP2
|
||
MOVEI B,(AB)+2 ; ADDRESS OF FRAME POINTER
|
||
JRST COMRET
|
||
|
||
|
||
|
||
MFUNCTION AGAIN,SUBR
|
||
ENTRY
|
||
HLRZ A,AB ;GET # OF ARGS
|
||
CAIN A,-2 ;1 ARG?
|
||
JRST NLCLA ;YES
|
||
JUMPN A,TMA ;0 ARGS?
|
||
PUSHJ P,PROGCH ;CHECK FOR IN A PROG
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
JRST AGAD
|
||
NLCLA: GETYP A,(AB)
|
||
CAIE A,TACT
|
||
JRST WTYP1
|
||
PUSH TP,(AB)
|
||
PUSH TP,1(AB)
|
||
AGAD: MOVEI B,-1(TP) ; POINT TO FRAME
|
||
PUSHJ P,CHFSWP
|
||
HRRZ C,(B) ; GET RET POINT
|
||
GOJOIN: PUSH TP,$TFIX
|
||
PUSH TP,C
|
||
MOVEI C,-1(TP)
|
||
PUSHJ P,CHUNW ; RESTORE FRAME, UNWIND IF NEC.
|
||
HRRM B,PCSAV(TB)
|
||
HRRZ 0,FSAV(TB) ; CHECK FOR RSUBR
|
||
CAIGE 0,HIBOT
|
||
CAIGE 0,STOSTR
|
||
JRST CONTIN
|
||
HRRZ E,1(TB)
|
||
PUSH TP,$TFIX
|
||
PUSH TP,B
|
||
MOVEI C,-1(TP)
|
||
MOVEI B,(TB)
|
||
PUSHJ P,CHUNW1
|
||
MOVE TP,1(TB)
|
||
MOVE SP,SPSTOR+1
|
||
MOVEM SP,SPSAV(TB)
|
||
MOVEM TP,TPSAV(TB)
|
||
MOVE C,OTBSAV(TB) ; AND RESTORE P FROM FATHER
|
||
MOVE P,PSAV(C)
|
||
MOVEM P,PSAV(TB)
|
||
SKIPGE PCSAV(TB)
|
||
HRLI B,400000+M
|
||
MOVEM B,PCSAV(TB)
|
||
JRST CONTIN
|
||
|
||
MFUNCTION GO,SUBR
|
||
ENTRY 1
|
||
GETYP A,(AB)
|
||
CAIE A,TATOM
|
||
JRST NLCLGO
|
||
PUSHJ P,PROGCH ;CHECK FOR A PROG
|
||
PUSH TP,A ;SAVE
|
||
PUSH TP,B
|
||
MOVEI B,-1(TP)
|
||
PUSHJ P,CHFSWP
|
||
PUSH TP,$TATOM
|
||
PUSH TP,1(C)
|
||
PUSH TP,2(B)
|
||
PUSH TP,3(B)
|
||
MCALL 2,MEMQ ;DOES IT HAVE THIS TAG?
|
||
JUMPE B,NXTAG ;NO -- ERROR
|
||
FNDGO: EXCH B,(TP) ;SAVE PLACE TO GO
|
||
MOVSI D,TLIST
|
||
MOVEM D,-1(TP)
|
||
JRST GODON
|
||
|
||
NLCLGO: CAIE A,TTAG ;CHECK TYPE
|
||
JRST WTYP1
|
||
MOVE B,1(AB)
|
||
MOVEI B,2(B) ; POINT TO SLOT
|
||
PUSHJ P,CHFSWP
|
||
MOVE A,1(C)
|
||
GETYP 0,(A) ; SEE IF COMPILED
|
||
CAIE 0,TFIX
|
||
JRST GODON1
|
||
MOVE C,1(A)
|
||
JRST GOJOIN
|
||
|
||
GODON1: PUSH TP,(A) ;SAVE BODY
|
||
PUSH TP,1(A)
|
||
GODON: MOVEI C,0
|
||
PUSHJ P,CHUNW ;GO BACK TO CORRECT FRAME
|
||
MOVE B,(TP) ;RESTORE ITERATION MARKER
|
||
MOVEM B,1(TB)
|
||
MOVSI A,TATOM
|
||
MOVE B,1(B)
|
||
JRST CONTIN
|
||
|
||
|
||
|
||
|
||
MFUNCTION TAG,SUBR
|
||
ENTRY
|
||
JUMPGE AB,TFA
|
||
HLRZ 0,AB
|
||
GETYP A,(AB) ;GET TYPE OF ARGUMENT
|
||
CAIE A,TFIX ; FIX ==> COMPILED
|
||
JRST ATOTAG
|
||
CAIE 0,-4
|
||
JRST WNA
|
||
GETYP A,2(AB)
|
||
CAIE A,TACT
|
||
JRST WTYP2
|
||
PUSH TP,(AB)
|
||
PUSH TP,1(AB)
|
||
PUSH TP,2(AB)
|
||
PUSH TP,3(AB)
|
||
JRST GENTV
|
||
ATOTAG: CAIE A,TATOM ;CHECK THAT IT IS AN ATOM
|
||
JRST WTYP1
|
||
CAIE 0,-2
|
||
JRST TMA
|
||
PUSHJ P,PROGCH ;CHECK PROG
|
||
PUSH TP,A ;SAVE VAL
|
||
PUSH TP,B
|
||
PUSH TP,$TATOM
|
||
PUSH TP,1(AB)
|
||
PUSH TP,2(B)
|
||
PUSH TP,3(B)
|
||
MCALL 2,MEMQ
|
||
JUMPE B,NXTAG ;IF NOT FOUND -- ERROR
|
||
EXCH A,-1(TP) ;SAVE PLACE
|
||
EXCH B,(TP)
|
||
HRLI A,TFRAME
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
GENTV: MOVEI A,2
|
||
PUSHJ P,IEVECT
|
||
MOVSI A,TTAG
|
||
JRST FINIS
|
||
|
||
PROGCH: MOVE B,IMQUOTE LPROG,[LPROG ]INTRUP
|
||
PUSHJ P,ILVAL ;GET VALUE
|
||
GETYP 0,A
|
||
CAIE 0,TACT
|
||
JRST NXPRG
|
||
POPJ P,
|
||
|
||
; HERE TO UNASSIGN LPROG IF NEC
|
||
|
||
UNPROG: MOVE B,IMQUOTE LPROG,[LPROG ]INTRUP
|
||
PUSHJ P,ILVAL
|
||
GETYP 0,A
|
||
CAIE 0,TACT ; SKIP IF MUST UNBIND
|
||
JRST UNMAP
|
||
MOVSI A,TUNBOU
|
||
MOVNI B,1
|
||
MOVE E,IMQUOTE LPROG,[LPROG ]INTRUP
|
||
PUSHJ P,PSHBND
|
||
UNMAP: HRRZ 0,FSAV(TB) ; CHECK FOR FUNNY
|
||
CAIN 0,MAPPLY ; SKIP IF NOT
|
||
POPJ P,
|
||
MOVE B,IMQUOTE LMAP,[LMAP ]INTRUP
|
||
PUSHJ P,ILVAL
|
||
GETYP 0,A
|
||
CAIE 0,TFRAME
|
||
JRST UNSPEC
|
||
MOVSI A,TUNBOU
|
||
MOVNI B,1
|
||
MOVE E,IMQUOTE LMAP,[LMAP ]INTRUP
|
||
PUSHJ P,PSHBND
|
||
UNSPEC: PUSH TP,BNDV
|
||
MOVE B,PVSTOR+1
|
||
ADD B,[CURFCN,,CURFCN]
|
||
PUSH TP,B
|
||
PUSH TP,$TSP
|
||
MOVE E,SPSTOR+1
|
||
ADD E,[3,,3]
|
||
PUSH TP,E
|
||
POPJ P,
|
||
|
||
REPEAT 0,[
|
||
MFUNCTION MEXIT,SUBR,[EXIT]
|
||
ENTRY 2
|
||
GETYP A,(AB)
|
||
CAIE A,TACT
|
||
JRST WTYP1
|
||
MOVEI B,(AB)
|
||
PUSHJ P,CHFSWP
|
||
ADD C,[2,,2]
|
||
PUSHJ P,CHUNW ;RESTORE FRAME
|
||
JRST CHFINI ; CHECK FOR WINNING VALUE
|
||
]
|
||
|
||
MFUNCTION COND,FSUBR
|
||
ENTRY 1
|
||
GETYP A,(AB)
|
||
CAIE A,TLIST
|
||
JRST WRONGT
|
||
PUSH TP,(AB)
|
||
PUSH TP,1(AB) ;CREATE UNNAMED TEMP
|
||
MOVEI B,0 ; SET TO FALSE IN CASE
|
||
|
||
CLSLUP: SKIPN C,1(TB) ;IS THE CLAUSELIST NIL?
|
||
JRST IFALS1 ;YES -- RETURN NIL
|
||
GETYP A,(C) ;NO -- GET TYPE OF CAR
|
||
CAIE A,TLIST ;IS IT A LIST?
|
||
JRST BADCLS ;
|
||
MOVE A,1(C) ;YES -- GET CLAUSE
|
||
JUMPE A,BADCLS
|
||
GETYPF B,(A)
|
||
PUSH TP,B ; EVALUATION OF
|
||
HLLZS (TP)
|
||
PUSH TP,1(A) ;THE PREDICATE
|
||
JSP E,CHKARG
|
||
MCALL 1,EVAL
|
||
GETYP 0,A
|
||
CAIN 0,TFALSE
|
||
JRST NXTCLS ;FALSE TRY NEXT CLAUSE
|
||
MOVE C,1(TB) ;IF NOT, DO FIRST CLAUSE
|
||
MOVE C,1(C)
|
||
HRRZ C,(C)
|
||
JUMPE C,FINIS ;(UNLESS DONE WITH IT)
|
||
JRST DOPRG2 ;AS THOUGH IT WERE A PROG
|
||
NXTCLS: HRRZ C,@1(TB) ;SET THE CLAUSLIST
|
||
HRRZM C,1(TB) ;TO CDR OF THE CLAUSLIST
|
||
JRST CLSLUP
|
||
|
||
IFALSE:
|
||
MOVEI B,0
|
||
IFALS1: MOVSI A,TFALSE ;RETURN FALSE
|
||
JRST FINIS
|
||
|
||
|
||
|
||
MFUNCTION UNWIND,FSUBR
|
||
|
||
ENTRY 1
|
||
|
||
GETYP 0,(AB) ; CHECK THE ARGS FOR WINNAGE
|
||
SKIPN A,1(AB) ; NONE?
|
||
JRST TFA
|
||
HRRZ B,(A) ; CHECK FOR 2D
|
||
JUMPE B,TFA
|
||
HRRZ 0,(B) ; 3D?
|
||
JUMPN 0,TMA
|
||
|
||
; Unbind LPROG and LMAPF so that nothing cute happens
|
||
|
||
PUSHJ P,UNPROG
|
||
|
||
; Push thing to do upon UNWINDing
|
||
|
||
PUSH TP,$TLIST
|
||
PUSH TP,[0]
|
||
|
||
MOVEI C,UNWIN1
|
||
PUSHJ P,IUNWIN ; GOT TO INTERNAL SET UP
|
||
|
||
; Now EVAL the first form
|
||
|
||
MOVE A,1(AB)
|
||
HRRZ 0,(A) ; SAVE POINTER TO OTHER GUY
|
||
MOVEM 0,-12(TP)
|
||
MOVE B,1(A)
|
||
GETYP A,(A)
|
||
MOVSI A,(A)
|
||
JSP E,CHKAB ; DEFER?
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MCALL 1,EVAL ; EVAL THE LOSER
|
||
|
||
JRST FINIS
|
||
|
||
; Now push slots to hold undo info on the way down
|
||
|
||
IUNWIN: JUMPE M,NOUNRE
|
||
HLRE 0,M ; CHECK BOUNDS
|
||
SUBM M,0
|
||
ANDI 0,-1
|
||
CAIL C,(M)
|
||
CAML C,0
|
||
JRST .+2
|
||
SUBI C,(M)
|
||
|
||
NOUNRE: PUSH TP,$TTB ; DESTINATION FRAME
|
||
PUSH TP,[0]
|
||
PUSH TP,[0] ; ARGS TO WHOEVER IS DOING IT
|
||
PUSH TP,[0]
|
||
|
||
; Now bind UNWIND word
|
||
|
||
PUSH TP,$TUNWIN ; FIRST WORD OF IT
|
||
MOVE SP,SPSTOR+1
|
||
HRRM SP,(TP) ; CHAIN
|
||
MOVEM TP,SPSTOR+1
|
||
PUSH TP,TB ; AND POINT TO HERE
|
||
PUSH TP,$TTP
|
||
PUSH TP,[0]
|
||
HRLI C,TPDL
|
||
PUSH TP,C
|
||
PUSH TP,P ; SAVE PDL ALSO
|
||
MOVEM TP,-2(TP) ; SAVE FOR LATER
|
||
POPJ P,
|
||
|
||
; Do a non-local return with UNWIND checking
|
||
|
||
CHUNW: HRRZ E,SPSAV(B) ; GET DESTINATION FRAME
|
||
CHUNW1: PUSH TP,(C) ; FINAL VAL
|
||
PUSH TP,1(C)
|
||
JUMPN C,.+3 ; WAS THERE REALLY ANYTHING
|
||
SETZM (TP)
|
||
SETZM -1(TP)
|
||
PUSHJ P,STLOOP ; UNBIND
|
||
CHUNPC: SKIPA ; WILL NOT SKIP UNLESS UNWIND FOUND
|
||
JRST GOTUND
|
||
MOVEI A,(TP)
|
||
SUBI A,(SP)
|
||
MOVSI A,(A)
|
||
HLL SP,TP
|
||
SUB SP,A
|
||
MOVEM SP,SPSTOR+1
|
||
HRRI TB,(B) ; UPDATE TB
|
||
PUSHJ P,UNWFRMS
|
||
POP TP,B
|
||
POP TP,A
|
||
POPJ P,
|
||
|
||
POPUNW: MOVE SP,SPSTOR+1
|
||
HRRZ SP,(SP)
|
||
MOVEI E,(TP)
|
||
SUBI E,(SP)
|
||
MOVSI E,(E)
|
||
HLL SP,TP
|
||
SUB SP,E
|
||
MOVEM SP,SPSTOR+1
|
||
POPJ P,
|
||
|
||
|
||
UNWFRM: JUMPE FRM,CPOPJ
|
||
MOVE B,FRM
|
||
UNWFR2: JUMPE B,UNWFR1
|
||
CAMG B,TPSAV(TB)
|
||
JRST UNWFR1
|
||
MOVE B,(B)
|
||
JRST UNWFR2
|
||
|
||
UNWFR1: MOVE FRM,B
|
||
POPJ P,
|
||
|
||
; Here if an UNDO found
|
||
|
||
GOTUND: MOVE TB,1(SP) ; GET FRAME OF UNDO
|
||
MOVE A,-1(TP) ; GET FUNNY ARG FOR PASS ON
|
||
MOVE C,(TP)
|
||
MOVE TP,3(SP) ; GET FUTURE TP
|
||
MOVEM C,-6(TP) ; SAVE ARG
|
||
MOVEM A,-7(TP)
|
||
MOVE C,(TP) ; SAVED P
|
||
SUB C,[1,,1]
|
||
MOVEM C,PSAV(TB) ; MAKE CONTIN WIN
|
||
MOVEM TP,TPSAV(TB)
|
||
MOVEM SP,SPSAV(TB)
|
||
HRRZ C,(P) ; PC OF CHUNW CALLER
|
||
HRRM C,-11(TP) ; SAVE ALSO AND GET WHERE TO GO PC
|
||
MOVEM B,-10(TP) ; AND DESTINATION FRAME
|
||
HRRZ C,-1(TP) ; WHERE TO UNWIND PC
|
||
HRRZ 0,FSAV(TB) ; RSUBR?
|
||
CAIGE 0,HIBOT
|
||
CAIGE 0,STOSTR
|
||
JRST .+3
|
||
SKIPGE PCSAV(TB)
|
||
HRLI C,400000+M
|
||
MOVEM C,PCSAV(TB)
|
||
JRST CONTIN
|
||
|
||
UNWIN1: MOVE B,-12(TP) ; POINT TO THING TO DO UNWINDING
|
||
GETYP A,(B)
|
||
MOVSI A,(A)
|
||
MOVE B,1(B)
|
||
JSP E,CHKAB
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MCALL 1,EVAL
|
||
UNWIN2: MOVEI C,-7(TP) ; POINT TO SAVED RET VALS
|
||
MOVE B,-10(TP)
|
||
HRRZ E,-11(TP)
|
||
PUSH P,E
|
||
MOVE SP,SPSTOR+1
|
||
HRRZ SP,(SP) ; UNBIND THIS GUY
|
||
MOVEI E,(TP) ; AND FIXUP SP
|
||
SUBI E,(SP)
|
||
MOVSI E,(E)
|
||
HLL SP,TP
|
||
SUB SP,E
|
||
MOVEM SP,SPSTOR+1
|
||
JRST CHUNW ; ANY MORE TO UNWIND?
|
||
|
||
|
||
; CHFSWP - CHECK FRAMES VALIDITY AND SWAP PROCESS IF NECESSARY.
|
||
; CALLED BY ALL CONTROL FLOW
|
||
; ROUTINES (GO,RETURN,EXIT,AGAIN,ERRET...)
|
||
|
||
CHFSWP: PUSHJ P,CHFRM ; CHECK FOR VALID FRAME
|
||
HRRZ D,(B) ; PROCESS VECTOR DOPE WD
|
||
HLRZ C,(D) ; LENGTH
|
||
SUBI D,-1(C) ; POINT TO TOP
|
||
MOVNS C ; NEGATE COUNT
|
||
HRLI D,2(C) ; BUILD PVP
|
||
MOVE E,PVSTOR+1
|
||
MOVE C,AB
|
||
MOVE A,(B) ; GET FRAME
|
||
MOVE B,1(B)
|
||
CAMN E,D ; SKIP IF SWAP NEEDED
|
||
POPJ P,
|
||
PUSH TP,A ; SAVE FRAME
|
||
PUSH TP,B
|
||
MOVE B,D
|
||
PUSHJ P,PROCHK ; FIX UP PROCESS LISTS
|
||
MOVE A,PSTAT+1(B) ; GET STATE
|
||
CAIE A,RESMBL
|
||
JRST NOTRES
|
||
MOVE D,B ; PREPARE TO SWAP
|
||
POP P,0 ; RET ADDR
|
||
POP TP,B
|
||
POP TP,A
|
||
JSP C,SWAP ; SWAP IN
|
||
MOVE C,ABSTO+1(E) ; GET OLD ARRGS
|
||
MOVEI A,RUNING ; FIX STATES
|
||
MOVE PVP,PVSTOR+1
|
||
MOVEM A,PSTAT+1(PVP)
|
||
MOVEI A,RESMBL
|
||
MOVEM A,PSTAT+1(E)
|
||
JRST @0
|
||
|
||
NOTRES: ERRUUO EQUOTE PROCESS-NOT-RESUMABLE
|
||
|
||
|
||
;SETG IS USED TO SET THE GLOBAL VALUE OF ITS FIRST ARGUMENT,
|
||
;AN IDENTIFIER, TO THE VALUE OF ITS SECOND ARGUMENT. ITS VALUE IS
|
||
; ITS SECOND ARGUMENT.
|
||
|
||
IMFUNCTION SETG,SUBR
|
||
ENTRY 2
|
||
GETYP A,(AB) ;GET TYPE OF FIRST ARGUMENT
|
||
CAIE A,TATOM ;CHECK THAT IT IS AN ATOM
|
||
JRST NONATM ;IF NOT -- ERROR
|
||
MOVE B,1(AB) ;GET POINTER TO ATOM
|
||
PUSH TP,$TATOM
|
||
PUSH TP,B
|
||
MOVEI 0,(B)
|
||
CAIL 0,HIBOT ; PURE ATOM?
|
||
PUSHJ P,IMPURIFY ; YES IMPURIFY
|
||
PUSHJ P,IGLOC ;GET LOCATIVE TO VALUE
|
||
CAMN A,$TUNBOUND ;IF BOUND
|
||
PUSHJ P,BSETG ;IF NOT -- BIND IT
|
||
MOVE C,2(AB) ; GET PROPOSED VVAL
|
||
MOVE D,3(AB)
|
||
MOVSI A,TLOCD ; MAKE SURE MONCH WINS
|
||
PUSHJ P,MONCH0 ; WOULD YOU BELIEVE MONITORS!!!!
|
||
EXCH D,B ;SAVE PTR
|
||
MOVE A,C
|
||
HRRZ E,-2(D) ; POINT TO POSSIBLE GDECL (OR MAINIFEST)
|
||
JUMPE E,OKSETG ; NONE ,OK
|
||
CAIE E,-1 ; MANIFEST?
|
||
JRST SETGTY
|
||
GETYP 0,(D) ; IF UNBOUND, LET IT HAPPEN
|
||
SKIPN IGDECL
|
||
CAIN 0,TUNBOU
|
||
JRST OKSETG
|
||
MANILO: GETYP C,(D)
|
||
GETYP 0,2(AB)
|
||
CAIN 0,(C)
|
||
CAME B,1(D)
|
||
JRST .+2
|
||
JRST OKSETG
|
||
PUSH TP,$TVEC
|
||
PUSH TP,D
|
||
MOVE B,IMQUOTE REDEFINE
|
||
PUSHJ P,ILVAL ; SEE IF REDEFINE OK
|
||
GETYP A,A
|
||
CAIE A,TUNBOU
|
||
CAIN A,TFALSE
|
||
JRST .+2
|
||
JRST OKSTG
|
||
PUSH TP,$TATOM
|
||
PUSH TP,EQUOTE ATTEMPT-TO-CHANGE-MANIFEST-VARIABLE
|
||
PUSH TP,$TATOM
|
||
PUSH TP,1(AB)
|
||
MOVEI A,2
|
||
JRST CALER
|
||
|
||
SETGTY: PUSH TP,$TVEC
|
||
PUSH TP,D
|
||
MOVE C,A
|
||
MOVE D,B
|
||
GETYP A,(E)
|
||
MOVSI A,(A)
|
||
MOVE B,1(E)
|
||
JSP E,CHKAB
|
||
PUSHJ P,TMATCH
|
||
JRST TYPMI3
|
||
|
||
OKSTG: MOVE D,(TP)
|
||
MOVE A,2(AB)
|
||
MOVE B,3(AB)
|
||
|
||
OKSETG: MOVEM A,(D) ;DEPOSIT INTO THE
|
||
MOVEM B,1(D) ;INDICATED VALUE CELL
|
||
JRST FINIS
|
||
|
||
TYPMI3: MOVE C,(TP)
|
||
HRRZ C,-2(C)
|
||
MOVE D,2(AB)
|
||
MOVE B,3(AB)
|
||
MOVE 0,(AB)
|
||
MOVE A,1(AB)
|
||
JRST TYPMIS
|
||
|
||
BSETG: HRRZ A,GLOBASE+1
|
||
HRRZ B,GLOBSP+1
|
||
SUB B,A
|
||
CAIL B,6
|
||
JRST SETGIT
|
||
MOVEI B,0 ; MAKE SURE OF NO EMPTY SLOTS
|
||
PUSHJ P,IGLOC
|
||
CAMN A,$TUNBOU ; SKIP IF SLOT FOUND
|
||
JRST BSETG1
|
||
MOVE C,(TP) ; GET ATOM
|
||
MOVEM C,-1(B) ; CLOBBER ATOM SLOT
|
||
HLLZS -2(B) ; CLOBBER OLD DECL
|
||
JRST BSETGX
|
||
; BSETG1: PUSH TP,GLOBASE ; MUST REALLY GROW STACK
|
||
; PUSH TP,GLOBASE+1
|
||
; PUSH TP,$TFIX
|
||
; PUSH TP,[0]
|
||
; PUSH TP,$TFIX
|
||
; PUSH TP,[100]
|
||
; MCALL 3,GROW
|
||
BSETG1: PUSH P,0
|
||
PUSH P,C
|
||
MOVE C,GLOBASE+1
|
||
HLRE B,C
|
||
SUB C,B
|
||
MOVE B,GVLINC ; GROW BY INDICATED GVAL SLOTS
|
||
DPB B,[001100,,(C)]
|
||
; MOVEM A,GLOBASE
|
||
MOVE C,[6,,4] ; INDICATOR FOR AGC
|
||
PUSHJ P,AGC
|
||
MOVE B,GLOBASE+1
|
||
MOVE 0,GVLINC ; ADJUST GLOBAL SPBASE
|
||
ASH 0,6
|
||
SUB B,0
|
||
HRLZS 0
|
||
SUB B,0
|
||
MOVEM B,GLOBASE+1
|
||
; MOVEM B,GLOBASE+1
|
||
POP P,0
|
||
POP P,C
|
||
SETGIT:
|
||
MOVE B,GLOBSP+1
|
||
SUB B,[4,,4]
|
||
MOVSI C,TGATOM
|
||
MOVEM C,(B)
|
||
MOVE C,(TP)
|
||
MOVEM C,1(B)
|
||
MOVEM B,GLOBSP+1
|
||
ADD B,[2,,2]
|
||
BSETGX: MOVSI A,TLOCI
|
||
PUSHJ P,PATSCH ; FIXUP SCHLPAGE
|
||
MOVEM A,(C)
|
||
MOVEM B,1(C)
|
||
POPJ P,
|
||
|
||
PATSCH: GETYP 0,(C)
|
||
CAIN 0,TLOCI
|
||
SKIPL D,1(C)
|
||
POPJ P,
|
||
|
||
PATL: SKIPL E,3(D) ; SKIP IF NEXT EXISTS
|
||
JRST PATL1
|
||
MOVE D,E
|
||
JRST PATL
|
||
|
||
PATL1: MOVEI E,1
|
||
MOVEM E,3(D) ; SAY GVAL ETC. EXISTS IF WE UNBIND
|
||
POPJ P,
|
||
|
||
|
||
IMFUNCTION DEFMAC,FSUBR
|
||
|
||
ENTRY 1
|
||
|
||
PUSH P,.
|
||
JRST DFNE2
|
||
|
||
IMFUNCTION DFNE,FSUBR,[DEFINE]
|
||
|
||
ENTRY 1
|
||
|
||
PUSH P,[0]
|
||
DFNE2: GETYP A,(AB)
|
||
CAIE A,TLIST
|
||
JRST WRONGT
|
||
SKIPN B,1(AB) ; GET ATOM
|
||
JRST TFA
|
||
GETYP A,(B) ; MAKE SURE ATOM
|
||
MOVSI A,(A)
|
||
PUSH TP,A
|
||
PUSH TP,1(B)
|
||
JSP E,CHKARG
|
||
MCALL 1,EVAL ; EVAL IT TO AN ATOM
|
||
CAME A,$TATOM
|
||
JRST NONATM
|
||
PUSH TP,A ; SAVE TWO COPIES
|
||
PUSH TP,B
|
||
PUSHJ P,IGVAL ; SEE IF A VALUE EXISTS
|
||
CAMN A,$TUNBOU ; SKIP IF A WINNER
|
||
JRST .+3
|
||
PUSHJ P,ASKUSR ; CHECK WITH USER
|
||
JRST DFNE1
|
||
PUSH TP,$TATOM
|
||
PUSH TP,-1(TP)
|
||
MOVE B,1(AB)
|
||
HRRZ B,(B)
|
||
MOVSI A,TEXPR
|
||
SKIPN (P) ; SKIP IF MACRO
|
||
JRST DFNE3
|
||
MOVEI D,(B) ; READY TO CONS
|
||
MOVSI C,TEXPR
|
||
PUSHJ P,INCONS
|
||
MOVSI A,TMACRO
|
||
DFNE3: PUSH TP,A
|
||
PUSH TP,B
|
||
MCALL 2,SETG
|
||
DFNE1: POP TP,B ; RETURN ATOM
|
||
POP TP,A
|
||
JRST FINIS
|
||
|
||
|
||
ASKUSR: MOVE B,IMQUOTE REDEFINE
|
||
PUSHJ P,ILVAL ; SEE IF REDEFINE OK
|
||
GETYP A,A
|
||
CAIE A,TUNBOU
|
||
CAIN A,TFALSE
|
||
JRST ASKUS1
|
||
JRST ASKUS2
|
||
ASKUS1: PUSH TP,$TATOM
|
||
PUSH TP,-1(TP)
|
||
PUSH TP,$TATOM
|
||
PUSH TP,EQUOTE ALREADY-DEFINED-ERRET-NON-FALSE-TO-REDEFINE
|
||
MCALL 2,ERROR
|
||
GETYP 0,A
|
||
CAIE 0,TFALSE
|
||
ASKUS2: AOS (P)
|
||
MOVE B,1(AB)
|
||
POPJ P,
|
||
|
||
|
||
|
||
;SET CLOBBERS THE LOCAL VALUE OF THE IDENTIFIER GIVEN BY ITS
|
||
;FIRST ARGUMENT TO THE SECOND ARG. ITS VALUE IS ITS SECOND ARGUMENT.
|
||
|
||
IMFUNCTION SET,SUBR
|
||
HLRE D,AB ; 2 TIMES # OF ARGS TO D
|
||
ASH D,-1 ; - # OF ARGS
|
||
ADDI D,2
|
||
JUMPG D,TFA ; NOT ENOUGH
|
||
MOVE B,PVSTOR+1
|
||
MOVE C,SPSTOR+1
|
||
JUMPE D,SET1 ; NO ENVIRONMENT
|
||
AOJL D,TMA ; TOO MANY
|
||
GETYP A,4(AB) ; CHECK ARG IS A FRAME OR PROCESS
|
||
CAIE A,TFRAME
|
||
CAIN A,TENV
|
||
JRST SET2 ; WINNING ENVIRONMENT/FRAME
|
||
CAIN A,TACT
|
||
JRST SET2 ; TO MAKE PFISTER HAPPY
|
||
CAIE A,TPVP
|
||
JRST WTYP2
|
||
MOVE B,5(AB) ; GET PROCESS
|
||
MOVE C,SPSTO+1(B)
|
||
JRST SET1
|
||
SET2: MOVEI B,4(AB) ; POINT TO FRAME
|
||
PUSHJ P,CHFRM ; CHECK IT OUT
|
||
MOVE B,5(AB) ; GET IT BACK
|
||
MOVE C,SPSAV(B) ; GET BINDING POINTER
|
||
HRRZ B,4(AB) ; POINT TO PROCESS
|
||
HLRZ A,(B) ; GET LENGTH
|
||
SUBI B,-1(A) ; POINT TO START THEREOF
|
||
HLL B,PVSTOR+1 ; GET -LNTRH, (ALL PROCESS VECS SAME LENGTH)
|
||
SET1: PUSH TP,$TPVP ; SAVE PROCESS
|
||
PUSH TP,B
|
||
PUSH TP,$TSP ; SAVE PATH POINTER
|
||
PUSH TP,C
|
||
GETYP A,(AB) ;GET TYPE OF FIRST
|
||
CAIE A,TATOM ;ARGUMENT --
|
||
JRST WTYP1 ;BETTER BE AN ATOM
|
||
MOVE B,1(AB) ;GET PTR TO IT
|
||
MOVEI 0,(B)
|
||
CAIL 0,HIBOT
|
||
PUSHJ P,IMPURIFY
|
||
MOVE C,(TP)
|
||
PUSHJ P,AILOC ;GET LOCATIVE TO VALUE
|
||
GOTLOC: CAMN A,$TUNBOUND ;BOUND?
|
||
PUSHJ P, BSET ;BIND IT
|
||
MOVE C,2(AB) ; GET NEW VAL
|
||
MOVE D,3(AB)
|
||
MOVSI A,TLOCD ; FOR MONCH
|
||
HRR A,2(B)
|
||
PUSHJ P,MONCH0 ; HURRAY FOR MONITORS!!!!!
|
||
MOVE E,B
|
||
HLRZ A,2(E) ; GET DECLS
|
||
JUMPE A,SET3 ; NONE, GO
|
||
PUSH TP,$TSP
|
||
PUSH TP,E
|
||
MOVE B,1(A)
|
||
HLLZ A,(A) ; GET PATTERN
|
||
PUSHJ P,TMATCH ; MATCH TMEM
|
||
JRST TYPMI2 ; LOSES
|
||
MOVE E,(TP)
|
||
SUB TP,[2,,2]
|
||
MOVE C,2(AB)
|
||
MOVE D,3(AB)
|
||
SET3: MOVEM C,(E) ;CLOBBER IDENTIFIER
|
||
MOVEM D,1(E)
|
||
MOVE A,C
|
||
MOVE B,D
|
||
MOVE C,-2(TP) ; GET PROC
|
||
HRRZ C,BINDID+1(C)
|
||
HRLI C,TLOCI
|
||
|
||
; HERE WE NOTE THAT EFFICIENCY CAN SOMETIMES GET IN THE WAY OF CORRECTNESS
|
||
; BY SETTING THE SHALLOW BINDING WE MANAGE TO CLOBBER THE TOP LEVEL LVAL
|
||
; EVEN IF WE ARE SETTING WITH RESPECT TO A DIFFERENT FRAME. TO CORRECT
|
||
; THIS GLITCH THIS ACTIVITY WILL ONLY TAKE PLACE IF THE ATOM ALREADY POINTS
|
||
; TO A BINDING
|
||
|
||
MOVE D,1(AB)
|
||
SKIPE (D)
|
||
JRST NSHALL
|
||
MOVEM C,(D)
|
||
MOVEM E,1(D)
|
||
NSHALL: SUB TP,[4,,4]
|
||
JRST FINIS
|
||
BSET:
|
||
MOVE PVP,PVSTOR+1
|
||
CAMN PVP,-2(TP) ; SKIP IF PROC DIFFERS
|
||
MOVEM C,-2(TP) ; ELSE USE RESULT FROM LOC SEARCH
|
||
MOVE B,-2(TP) ; GET PROCESS
|
||
HRRZ A,TPBASE+1(B) ;GET ACTUAL STACK BASE
|
||
HRRZ B,SPBASE+1(B) ;AND FIRST BINDING
|
||
SUB B,A ;ARE THERE 6
|
||
CAIL B,6 ;CELLS AVAILABLE?
|
||
JRST SETIT ;YES
|
||
MOVE C,(TP) ; GET POINTER BACK
|
||
MOVEI B,0 ; LOOK FOR EMPTY SLOT
|
||
PUSHJ P,AILOC
|
||
CAMN A,$TUNBOUND ; SKIP IF FOUND
|
||
JRST BSET1
|
||
MOVE E,1(AB) ; GET ATOM
|
||
MOVEM E,-1(B) ; AND STORE
|
||
JRST BSET2
|
||
BSET1: MOVE B,-2(TP) ; GET PROCESS
|
||
; PUSH TP,TPBASE(B) ;NO -- GROW THE TP
|
||
; PUSH TP,TPBASE+1(B) ;AT THE BASE END
|
||
; PUSH TP,$TFIX
|
||
; PUSH TP,[0]
|
||
; PUSH TP,$TFIX
|
||
; PUSH TP,[100]
|
||
; MCALL 3,GROW
|
||
; MOVE C,-2(TP) ; GET PROCESS
|
||
; MOVEM A,TPBASE(C) ;SAVE RESULT
|
||
PUSH P,0 ; MANUALLY GROW VECTOR
|
||
PUSH P,C
|
||
MOVE C,TPBASE+1(B)
|
||
HLRE B,C
|
||
SUB C,B
|
||
MOVEI C,1(C)
|
||
CAME C,TPGROW
|
||
ADDI C,PDLBUF
|
||
MOVE D,LVLINC
|
||
DPB D,[001100,,-1(C)]
|
||
MOVE C,[5,,3] ; SET UP INDICATORS FOR AGC
|
||
PUSHJ P,AGC
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE B,TPBASE+1(PVP) ; MODIFY POINTER
|
||
MOVE 0,LVLINC ; ADJUST SPBASE POINTER
|
||
ASH 0,6
|
||
SUB B,0
|
||
HRLZS 0
|
||
SUB B,0
|
||
MOVEM B,TPBASE+1(PVP)
|
||
POP P,C
|
||
POP P,0
|
||
; MOVEM B,TPBASE+1(C)
|
||
SETIT: MOVE C,-2(TP) ; GET PROCESS
|
||
MOVE B,SPBASE+1(C)
|
||
MOVEI A,-6(B) ;MAKE UP BINDING
|
||
HRRM A,(B) ;LINK PREVIOUS BIND BLOCK
|
||
MOVSI A,TBIND
|
||
MOVEM A,-6(B)
|
||
MOVE A,1(AB)
|
||
MOVEM A,-5(B)
|
||
SUB B,[6,,6]
|
||
MOVEM B,SPBASE+1(C)
|
||
ADD B,[2,,2]
|
||
BSET2: MOVE C,-2(TP) ; GET PROC
|
||
MOVSI A,TLOCI
|
||
HRR A,BINDID+1(C)
|
||
HLRZ D,OTBSAV(TB) ; TIME IT
|
||
MOVEM D,2(B) ; AND FIX IT
|
||
POPJ P,
|
||
|
||
; HERE TO ELABORATE ON TYPE MISMATCH
|
||
|
||
TYPMI2: MOVE C,(TP) ; FIND DECLS
|
||
HLRZ C,2(C)
|
||
MOVE D,2(AB)
|
||
MOVE B,3(AB)
|
||
MOVE 0,(AB) ; GET ATOM
|
||
MOVE A,1(AB)
|
||
JRST TYPMIS
|
||
|
||
|
||
|
||
MFUNCTION NOT,SUBR
|
||
ENTRY 1
|
||
GETYP A,(AB) ; GET TYPE
|
||
CAIE A,TFALSE ;IS IT FALSE?
|
||
JRST IFALSE ;NO -- RETURN FALSE
|
||
|
||
TRUTH:
|
||
MOVSI A,TATOM ;RETURN T (VERITAS)
|
||
MOVE B,IMQUOTE T
|
||
JRST FINIS
|
||
|
||
IMFUNCTION OR,FSUBR
|
||
|
||
PUSH P,[0]
|
||
JRST ANDOR
|
||
|
||
MFUNCTION ANDA,FSUBR,AND
|
||
|
||
PUSH P,[1]
|
||
ANDOR: ENTRY 1
|
||
GETYP A,(AB)
|
||
CAIE A,TLIST
|
||
JRST WRONGT ;IF ARG DOESN'T CHECK OUT
|
||
MOVE E,(P)
|
||
SKIPN C,1(AB) ;IF NIL
|
||
JRST TF(E) ;RETURN TRUTH
|
||
PUSH TP,$TLIST ;CREATE UNNAMED TEMP
|
||
PUSH TP,C
|
||
ANDLP:
|
||
MOVE E,(P)
|
||
JUMPE C,TFI(E) ;ANY MORE ARGS?
|
||
MOVEM C,1(TB) ;STORE CRUFT
|
||
GETYP A,(C)
|
||
MOVSI A,(A)
|
||
PUSH TP,A
|
||
PUSH TP,1(C) ;ARGUMENT
|
||
JSP E,CHKARG
|
||
MCALL 1,EVAL
|
||
GETYP 0,A
|
||
MOVE E,(P)
|
||
XCT TFSKP(E)
|
||
JRST FINIS ;IF FALSE -- RETURN
|
||
HRRZ C,@1(TB) ;GET CDR OF ARGLIST
|
||
JRST ANDLP
|
||
|
||
TF: JRST IFALSE
|
||
JRST TRUTH
|
||
|
||
TFI: JRST IFALS1
|
||
JRST FINIS
|
||
|
||
TFSKP: CAIE 0,TFALSE
|
||
CAIN 0,TFALSE
|
||
|
||
IMFUNCTION FUNCTION,FSUBR
|
||
|
||
ENTRY 1
|
||
|
||
MOVSI A,TEXPR
|
||
MOVE B,1(AB)
|
||
JRST FINIS
|
||
|
||
;SUBR VERSIONS OF AND/OR
|
||
|
||
MFUNCTION ANDP,SUBR,[AND?]
|
||
JUMPGE AB,TRUTH
|
||
MOVE C,[CAIN 0,TFALSE]
|
||
JRST BOOL
|
||
|
||
MFUNCTION ORP,SUBR,[OR?]
|
||
JUMPGE AB,IFALSE
|
||
MOVE C,[CAIE 0,TFALSE]
|
||
BOOL: HLRE A,AB ; GET ARG COUNTER
|
||
MOVMS A
|
||
ASH A,-1 ; DIVIDES BY 2
|
||
MOVE D,AB
|
||
PUSHJ P,CBOOL
|
||
JRST FINIS
|
||
|
||
CANDP: SKIPA C,[CAIN 0,TFALSE]
|
||
CORP: MOVE C,[CAIE 0,TFALSE]
|
||
JUMPE A,CNOARG
|
||
MOVEI D,(A)
|
||
ASH D,1 ; TIMES 2
|
||
HRLI D,(D)
|
||
SUBB TP,D ; POINT TO ARGS & FIXUP TP PTR
|
||
AOBJP D,.+1 ; FIXUP ARG PTR AND FALL INTO CBOOL
|
||
|
||
CBOOL: GETYP 0,(D)
|
||
XCT C ; WINNER ?
|
||
JRST CBOOL1 ; YES RETURN IT
|
||
ADD D,[2,,2]
|
||
SOJG A,CBOOL ; ANY MORE ?
|
||
SUB D,[2,,2] ; NO, USE LAST
|
||
CBOOL1: MOVE A,(D)
|
||
MOVE B,(D)+1
|
||
POPJ P,
|
||
|
||
|
||
CNOARG: MOVSI 0,TFALSE
|
||
XCT C
|
||
JRST CNOAND
|
||
MOVSI A,TFALSE
|
||
MOVEI B,0
|
||
POPJ P,
|
||
CNOAND: MOVSI A,TATOM
|
||
MOVE B,IMQUOTE T
|
||
POPJ P,
|
||
|
||
|
||
MFUNCTION CLOSURE,SUBR
|
||
ENTRY
|
||
SKIPL A,AB ;ANY ARGS
|
||
JRST TFA ;NO -- LOSE
|
||
ADD A,[2,,2] ;POINT AT IDS
|
||
PUSH TP,$TAB
|
||
PUSH TP,A
|
||
PUSH P,[0] ;MAKE COUNTER
|
||
|
||
CLOLP: SKIPL A,1(TB) ;ANY MORE IDS?
|
||
JRST CLODON ;NO -- LOSE
|
||
PUSH TP,(A) ;SAVE ID
|
||
PUSH TP,1(A)
|
||
PUSH TP,(A) ;GET ITS VALUE
|
||
PUSH TP,1(A)
|
||
ADD A,[2,,2] ;BUMP POINTER
|
||
MOVEM A,1(TB)
|
||
AOS (P)
|
||
MCALL 1,VALUE
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MCALL 2,LIST ;MAKE PAIR
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
JRST CLOLP
|
||
|
||
CLODON: POP P,A
|
||
ACALL A,LIST ;MAKE UP LIST
|
||
PUSH TP,(AB) ;GET FUNCTION
|
||
PUSH TP,1(AB)
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MCALL 2,LIST ;MAKE LIST
|
||
MOVSI A,TFUNARG
|
||
JRST FINIS
|
||
|
||
|
||
|
||
;ERROR COMMENTS FOR EVAL
|
||
|
||
BADNUM: ERRUUO EQUOTE NEGATIVE-ARGUMENT
|
||
|
||
WTY1TP: ERRUUO EQUOTE FIRST-ARG-WRONG-TYPE
|
||
|
||
UNBOU: PUSH TP,$TATOM
|
||
PUSH TP,EQUOTE UNBOUND-VARIABLE
|
||
JRST ER1ARG
|
||
|
||
UNAS: PUSH TP,$TATOM
|
||
PUSH TP,EQUOTE UNASSIGNED-VARIABLE
|
||
JRST ER1ARG
|
||
|
||
BADENV:
|
||
ERRUUO EQUOTE BAD-ENVIRONMENT
|
||
|
||
FUNERR:
|
||
ERRUUO EQUOTE BAD-FUNARG
|
||
|
||
|
||
MPD.0:
|
||
MPD.1:
|
||
MPD.2:
|
||
MPD.3:
|
||
MPD.4:
|
||
MPD.5:
|
||
MPD.6:
|
||
MPD.7:
|
||
MPD.8:
|
||
MPD.9:
|
||
MPD.10:
|
||
MPD.11:
|
||
MPD.12:
|
||
MPD.13:
|
||
MPD: ERRUUO EQUOTE MEANINGLESS-PARAMETER-DECLARATION
|
||
|
||
NOBODY: ERRUUO EQUOTE HAS-EMPTY-BODY
|
||
|
||
BADCLS: ERRUUO EQUOTE BAD-CLAUSE
|
||
|
||
NXTAG: ERRUUO EQUOTE NON-EXISTENT-TAG
|
||
|
||
NXPRG: ERRUUO EQUOTE NOT-IN-PROG
|
||
|
||
NAPTL:
|
||
NAPT: ERRUUO EQUOTE NON-APPLICABLE-TYPE
|
||
|
||
NONEVT: ERRUUO EQUOTE NON-EVALUATEABLE-TYPE
|
||
|
||
|
||
NONATM: ERRUUO EQUOTE NON-ATOMIC-ARGUMENT
|
||
|
||
|
||
ILLFRA: ERRUUO EQUOTE FRAME-NO-LONGER-EXISTS
|
||
|
||
ILLSEG: ERRUUO EQUOTE ILLEGAL-SEGMENT
|
||
|
||
BADMAC: ERRUUO EQUOTE BAD-USE-OF-MACRO
|
||
|
||
BADFSB: ERRUUO EQUOTE APPLY-OR-STACKFORM-OF-FSUBR
|
||
|
||
|
||
ER1ARG: PUSH TP,(AB)
|
||
PUSH TP,1(AB)
|
||
MOVEI A,2
|
||
JRST CALER
|
||
|
||
END
|
||
|