--- /dev/null
+
+TITLE DECLARATION PROCESSOR
+
+RELOCA
+
+.INSRT MUDDLE >
+
+.GLOBAL STBL,TYPFND,TYPSGR,CHKDCL,TESTR,VALG,INCR1,TYPG,ISTRUC,TMATCH,SAT
+.GLOBAL TYPMIS,CHKAB,CHKARG,IGDECL,LOCQQ,APLQ,CALER,IEQUAL,IIGLOC,IGLOC
+.GLOBAL CHLOCI,INCONS,SPCCHK,OUTRNG,WTYP1,FLGSET,IGET,PVSTOR,SPSTOR,DSTORE
+.GLOBAL NOATMS,NOSET,NOSETG
+; Subr to allow user to access the DECL checking code
+
+MFUNCTION CHECKD,SUBR,[DECL?]
+
+ ENTRY 2
+
+ MOVE C,(AB)
+ MOVE D,1(AB)
+ MOVE A,2(AB)
+ MOVE B,3(AB)
+ PUSHJ P,TMATCX ; CHECK THEM
+ JRST IFALS
+
+RETT: MOVSI A,TATOM
+ MOVE B,IMQUOTE T
+ JRST FINIS
+
+RETF:
+IFALS: MOVEI B,0
+ MOVSI A,TFALSE
+ JRST FINIS
+
+; Subr to turn DECL checking on and off.
+
+MFUNCTION %DECL,SUBR,[DECL-CHECK]
+
+ ENTRY
+
+ HRROI E,IGDECL
+ JRST FLGSET
+
+; Subr to turn on and off allowing new atoms
+
+MFUNCTION %NEWAT,SUBR,[ALLOW-NEW-ATOMS]
+
+ ENTRY
+
+ MOVEI E,NOATMS
+ JRST FLGSET
+
+; Subr to turn on and off allowing new GVALS
+
+MFUNCTION %NEWGV,SUBR,[ALLOW-NEW-GVALS]
+
+ ENTRY
+
+ MOVEI E,NOSETG
+ JRST FLGSET
+
+; Subr to turn on and off allowing new LVALs
+
+MFUNCTION %NEWLV,SUBR,[ALLOW-NEW-LVALS]
+
+ ENTRY
+
+ MOVEI E,NOSET
+ JRST FLGSET
+
+; Change special unspecial normal mode
+
+MFUNCTION SPECM%,SUBR,[SPECIAL-MODE]
+
+ ENTRY
+
+ CAMGE AB,[-3,,]
+ JRST TMA
+ MOVE C,SPCCHK ; GET CURRENT
+ JUMPGE AB,MODER ; RET CURRENT
+ GETYP 0,(AB) ; CHECK IT IS ATOM
+ CAIE 0,TATOM
+ JRST WTYP1
+ MOVE 0,1(AB)
+ MOVEI A,1
+ CAMN 0,MQUOTE UNSPECIAL
+ MOVSI A,(SETZ)
+ CAMN 0,MQUOTE SPECIAL
+ MOVEI A,0
+ JUMPG A,WTYP1
+ HLLM A,SPCCHK
+
+MODER: MOVSI A,TATOM
+ MOVE B,MQUOTE SPECIAL
+ SKIPGE C
+ MOVE B,MQUOTE UNSPECIAL
+ JRST FINIS
+
+; Function to turn special checking on and of
+
+MFUNCTION SPECC%,SUBR,[SPECIAL-CHECK]
+
+ ENTRY
+ CAMGE AB,[-3,,]
+ JRST TMA
+
+ MOVE C,SPCCHK
+ JUMPGE AB,SCHEK1
+
+ MOVEI A,0
+ GETYP 0,(AB)
+ CAIE 0,TFALSE
+ MOVEI A,1
+ HRRM A,SPCCHK
+
+SCHEK1: TRNN C,1
+ JRST IFALS
+ JRST RETT
+
+; Finction to set decls for GLOBAL values.
+
+MFUNCTION GDECL,FSUBR
+
+ ENTRY 1
+
+ GETYP 0,(AB)
+ CAIE 0,TLIST
+ JRST WTYP1
+
+ PUSH TP,$TLIST
+ PUSH TP,1(AB)
+ PUSH TP,$TLIST
+ PUSH TP,[0]
+ PUSH TP,$TLIST
+ PUSH TP,[0]
+
+GDECL1: INTGO
+ SKIPN C,1(TB)
+ JRST RETT
+ HRRZ D,(C) ; MAKE SURE PAIRS
+ JUMPE D,GDECLL ; LOSER, GO AWAY
+ GETYP 0,(C)
+ CAIE 0,TLIST
+ JRST GDECLL
+ HRRZ 0,(D)
+ MOVEM 0,1(TB) ; READY FOR NEXT CALL
+ MOVE C,1(C) ; SAVE ATOM LIST
+ MOVEM C,5(TB)
+ MOVEM D,3(TB)
+
+GDECL2: INTGO
+ SKIPN C,5(TB)
+ JRST GDECL1 ; OUT OF ATOMS
+ GETYP 0,(C) ; IS THIS AN ATOM
+ CAIE 0,TATOM
+ JRST GDECLL ; NO, LOSE
+ MOVE B,1(C)
+ HRRZ C,(C)
+ MOVEM C,5(TB)
+ PUSHJ P,IIGLOC ; GET ITS VAL (OR MAKE ONE)
+ GETYP 0,(B) ; UNBOUND?
+ CAIE 0,TUNBOU
+ JRST CHKCUR ; CHECK CURRENT VALUE
+ MOVE C,3(TB) ; GET DECL
+ HRRM C,-2(B)
+ JRST GDECL2
+
+CHKCUR: HRRZ D,3(TB)
+ GETYP A,(D)
+ MOVSI A,(A)
+ MOVE E,B
+ MOVE B,1(D)
+ MOVE C,(E)
+ MOVE D,1(E)
+ PUSH TP,$TVEC
+ PUSH TP,E
+ JSP E,CHKAB
+ PUSHJ P,TMATCH
+ JRST TYPMI3
+ MOVE E,(TP)
+ SUB TP,[2,,2]
+ MOVE D,3(TB)
+ HRRM D,-2(E)
+ JRST GDECL2
+
+TYPMI3: MOVE E,(TP) ; POINT BACK TO SLOT
+ MOVE A,-1(E) ; ATOM TO A
+ MOVE B,1(E)
+ MOVE D,(E) ; GET OLD VALUE
+ MOVE C,3(TB)
+ JRST TYPMIS ; GO COMPLAIN
+
+GDECLL: ERRUUO EQUOTE BAD-ARGUMENT-LIST
+
+MFUNCTION UNMANIFEST,SUBR
+
+ ENTRY
+
+ PUSH P,[HLLZS -2(B)]
+ JRST MANLP
+
+MFUNCTION MANIFEST,SUBR
+
+ ENTRY
+
+ PUSH P,[HLLOS -2(B)]
+MANLP: JUMPGE AB,RETT
+ GETYP 0,(AB)
+ CAIE 0,TATOM
+ JRST WTYP
+ MOVE B,1(AB)
+ PUSHJ P,IIGLOC
+ XCT (P)
+ ADD AB,[2,,2]
+ JRST MANLP
+
+MFUNCTION MANIFQ,SUBR,[MANIFEST?]
+
+ ENTRY 1
+
+ GETYP 0,(AB)
+ CAIE 0,TATOM
+ JRST WTYP1
+
+ MOVE B,1(AB)
+ PUSHJ P,IGLOC ; GET POINTER IF ANY
+ GETYP 0,A
+ CAIN 0,TUNBOU
+ JRST RETF
+ HRRZ 0,-2(B)
+ CAIE 0,-1
+ JRST RETF
+ JRST RETT
+
+MFUNCTION GETDECL,SUBR,[GET-DECL]
+
+ ENTRY 1
+
+ GETYP 0,(AB)
+ CAIN 0,TOFFS
+ JRST GETDOF
+ PUSHJ P,GTLOC
+ JRST GTLOCA
+
+ HRRZ C,-2(B) ; GET GLOBAL DECL
+GETD1: JUMPE C,RETF
+ CAIN C,-1
+ JRST RETMAN
+ GETYP A,(C)
+ MOVSI A,(A)
+ MOVE B,1(C)
+ JSP E,CHKAB
+ JRST FINIS
+GETDOF: HLRZ B,1(AB)
+ JUMPE B,GETDO1
+ MOVE A,(B)
+ MOVE B,1(B)
+ JRST FINIS
+GETDO1: MOVSI A,TATOM
+ MOVE B,IMQUOTE ANY
+ JRST FINIS
+
+RETMAN: MOVSI A,TATOM
+ MOVE B,MQUOTE MANIFEST
+ JRST FINIS
+
+GTLOCA: HLRZ C,2(B) ; LOCAL DECL
+ JRST GETD1
+
+MFUNCTION PUTDECL,SUBR,[PUT-DECL]
+
+ ENTRY 2
+
+ GETYP 0,(AB)
+ CAIN 0,TOFFS
+ JRST PUTDOF ; MAKE OFFSET WITH NEW DECL
+ PUSHJ P,GTLOC
+ SKIPA E,[HRLM B,2(C)]
+ MOVE E,[HRRM B,-2(C)]
+ PUSH P,E
+ GETYP 0,(B) ; ANY VALUE
+ CAIN 0,TUNBOU
+ JRST PUTD1
+ MOVE C,(B) ; GET CURRENT VALUE
+ MOVE D,1(B)
+ MOVE A,2(AB)
+ MOVE B,3(AB)
+ PUSHJ P,TMATCH
+ JRST TYPMI4
+PUTD1: MOVE C,2(AB) ; GET DECL BACK
+ MOVE D,3(AB)
+ PUSHJ P,INCONS ; CONS IT UP
+ MOVE C,1(AB) ; LOCATIVE BACK
+ XCT (P) ; CLOBBER
+ MOVE A,(AB)
+ MOVE B,1(AB)
+ JRST FINIS
+
+TYPMI4: MOVE E,1(AB) ; GET LOCATIVE
+ MOVE A,-1(E) ; NOW ATOM
+ MOVEI C,2(AB) ; POINT TO DECL
+ MOVE D,(E) ; AND CURRENT VAL
+ MOVE B,1(E)
+ JRST TYPMIS
+
+GTLOC: GETYP 0,(AB)
+ CAIE 0,TLOCD
+ JRST WTYP1
+ MOVEI B,(AB)
+ PUSHJ P,CHLOCI
+ HRRZ 0,(AB) ; LOCAL OR GLOBAL
+ SKIPN 0
+ AOS (P)
+ MOVE B,1(AB) ; RETURN LOCATIVE IN B
+ POPJ P,
+
+; MAKE OFFSET WITH SUPPLIED DECL
+PUTDOF: MOVE D,3(AB)
+ GETYP 0,2(AB)
+ CAIN TATOM
+ CAME D,IMQUOTE ANY
+ JRST PUTDO1
+ MOVSI A,TOFFS
+ HRRZ B,1(AB)
+ JRST FINIS
+PUTDO1: MOVE C,2(AB)
+ PUSHJ P,INCONS ; BUILD A LIST
+ MOVSI A,TOFFS
+ HRLS B
+ HRR B,1(AB) ; SET UP OFFSET
+ JRST FINIS
+
+; BUILD AN OFFSET--TAKES FIX AND DECL (OR ATOM FORM)
+; JUMPS INTO PUT-DECL CODE FOR OFFSETS.
+ MFUNCTION COFFSET,SUBR,[OFFSET]
+
+ ENTRY 2
+ GETYP 0,(AB)
+ CAIE 0,TFIX
+ JRST WTYP1
+ SKIPG 1(AB)
+ JRST OUTRNG ; CAN'T HAVE NEGATIVE OFFSETS
+ GETYP 0,2(AB)
+ CAIE 0,TATOM
+ CAIN 0,TFORM
+ JRST PUTDOF
+ JRST WTYP2
+
+; GET FIX PART OF OFFSET
+ MFUNCTION INDEX,SUBR
+
+ ENTRY 1
+ GETYP 0,(AB)
+ CAIE 0,TOFFS
+ JRST WTYP1
+ MOVSI A,TFIX
+ HRRE B,1(AB)
+ JRST FINIS
+\f
+; Interface between EVAL and declaration processor.
+; E points into stack at a binding and C points to decl list.
+
+CHKDCL: SKIPE IGDECL ; IGNORING DECLS?
+ POPJ P, ; YUP, JUST LEAVE
+
+ PUSH TP,$TTP ; SAVE BINDING
+ PUSH TP,E
+ MOVE A,-4(E) ; GET ATOM
+ MOVSI 0,TLIST ; SETUP FOR INTERRUPTABLE
+ MOVE PVP,PVSTOR+1
+ MOVEM 0,CSTO(PVP)
+ MOVEM 0,BSTO(PVP)
+ MOVSI 0,TATOM
+ MOVEM 0,ASTO(PVP)
+ SETZB B,0 ; CLOBBER FOR INTGO
+
+DCL2: INTGO
+ HRRZ D,(C) ; MAKE SURE EVEN ELEMENTS
+ JUMPE D,BADCL
+ GETYP B,(C) ; MUST BE LIST OF ATOMS
+ CAIE B,TLIST
+ JRST BADCL
+ MOVE B,1(C) ; GET LIST
+
+DCL1: INTGO
+ CAMN A,1(B) ; SKIP IF NOT WINNER
+ JRST DCLQ ; MAY BE WINNER
+DCL3: HRRZ B,(B) ; CDR ON
+ JUMPN B,DCL1 ; JUMP IF MORE
+
+ HRRZ C,(D) ; CDR MAIN LIST
+ JUMPN C,DCL2 ; AND JUMP IF WINNING
+
+ PUSHJ P,E.GET ; GET BINDING BACK
+ SUB TP,[2,,2] ; POP OF JUNK
+ POPJ P,
+
+DCLQ: GETYP C,(B) ; CHECK ATOMIC
+ CAIE C,TATOM
+ JRST BADCL ; LOSER
+ PUSHJ P,E.GET ; GOT IT
+ PUSH TP,$TLIST ; SAVE PATTERN
+ PUSH TP,D
+ MOVE B,1(D) ; GET PATTERN
+ HLLZ A,(D)
+ MOVE C,-3(E) ; PROPOSED VALUE
+ MOVE D,-2(E)
+ PUSHJ P,TMATCH ; MATCH TYPE
+ JRST TYPMI1 ; LOSER
+DCLQ1: MOVE E,-2(TP)
+ MOVE C,-5(E) ; CHECK FOR SPEC CHANGE
+ SKIPE 0 ; MAKE SURE NON ZERO IS -1
+ MOVNI 0,1
+ SKIPL SPCCHK ; SKIP IF NORMAL UNSPECIAL
+ SETCM 0 ; COMPLEMENT
+ ANDI 0,1 ; ONE BIT
+ CAMN C,[TATOM,,-1]
+ JRST .+3
+ CAME C,[TATOM,,-2]
+ JRST .+3
+ ANDCMI C,1
+ IOR C,0 ; MUNG BIT
+ MOVEM C,-5(E)
+ HRRZ C,(TP)
+ SUB TP,[4,,4]
+ MOVEM C,(E) ; STORE DECLS
+ MOVSI C,TLIST
+ MOVEM C,-1(E)
+ POPJ P,
+
+TYPMI1: MOVE E,-2(TP)
+ GETYP C,-3(E)
+ CAIN C,TUNBOU
+ JRST DCLQ1
+ MOVE E,-2(TP) ; GET POINTER TO BIND
+ MOVE D,-3(E) ; GET VAL
+ MOVE B,-2(E)
+ HRRZ C,(TP) ; DCL LIST
+ MOVE A,-4(E) ; GET ATOM
+ SUB TP,[4,,4]
+TYPMIS: PUSH TP,$TATOM
+ PUSH TP,EQUOTE TYPE-MISMATCH
+ PUSH TP,$TATOM
+ PUSH TP,A
+ PUSH TP,(C)
+ HLLZS (TP)
+ PUSH TP,1(C)
+ JSP E,CHKARG ; HACK DEFER
+ PUSH TP,D
+ PUSH TP,B
+ MOVEI A,4 ; 3 ERROR ARGS
+ JRST CALER
+
+BADCL: PUSHJ P,E.GET
+ ERRUUO EQUOTE BAD-DECLARATION-LIST
+
+; ROUTINE TO RESSET INT STUFF
+
+E.GET: MOVE E,(TP)
+ MOVE PVP,PVSTOR+1
+ SETZM ASTO(PVP)
+ SETZM BSTO(PVP)
+ SETZM CSTO(PVP)
+ POPJ P,
+
+; Declarations processor for MUDDLE type declarations.
+; Receives a pattern in a and B and an object in C and D.
+; It skip returns if the object fits otherwise it doesn't.
+; Declaration syntax errors are caught and sent to ERROR.
+
+TMATCH: MOVEI 0,1 ; RET SPECIAL INDICATOR
+ SKIPE IGDECL ; IGNORING DECLS?
+ JRST CPOPJ1 ; YUP, ACT LIKE THEY WON
+
+TMATCX: GETYP 0,A ; GET PATTERNS TYPE
+ CAIE 0,TSEG
+ CAIN 0,TFORM ; MUST BE FORM OR ATOM
+ JRST TMAT1
+ CAIE 0,TATOM
+ JRST TERR1 ; WRONG TYPE FOR A DCL
+
+; SIMPLE TYPE MATCHER
+
+TYPMAT: GETYP E,C ; OBJECTS TYPE TO E
+ PUSH P,E ; SAVE IT
+ PUSH TP,C
+ PUSH TP,D
+ PUSHJ P,TYPFND ; CONVERT TYPE NAME TO CODE
+ JRST SPECS ; NOT A TYPE NAME, TRY SPECIALS
+ SUB TP,[2,,2]
+ POP P,E ; RESTORE TYPE OF OBJECT
+ MOVEI 0,0 ; SPECIAL INDICATOR
+ CAIN E,(D) ; SKIP IF LOSERS
+CPOPJ1: AOS (P) ; GOOD RETURN
+CPOPJ: POPJ P,
+
+SPECS: POP P,A ; RESTORE OBJECTS TYPE
+ POP TP,D
+ POP TP,C
+ CAMN B,IMQUOTE ANY
+ JRST CPOPJ1 ; RETURN IMMEDIATELY IF ANYTHING WINS
+ CAMN B,IMQUOTE STRUCTURED
+ JRST ISTRUC ; LET ISTRUC DO THE WORK
+ CAMN B,IMQUOTE APPLICABLE
+ JRST APLQ
+ CAMN B,IMQUOTE LOCATIVE
+ JRST LOCQQ
+ PUSH TP,$TATOM
+ PUSH TP,B
+ PUSH TP,C
+ PUSH TP,D
+ MOVSI A,TATOM
+ MOVSI C,TATOM
+ MOVE D,IMQUOTE DECL
+ PUSHJ P,IGET
+ JUMPE B,TERR2X
+ MOVEM A,-3(TP)
+ MOVEM B,-2(TP)
+ INTGO
+ POP TP,D
+ POP TP,C
+ POP TP,B
+ POP TP,A
+ JRST TMATCX
+
+; ARRIVE HERE FOR A FORM IN THE DCLS
+
+TMAT1: JUMPE B,TERR3 ; EMPTY FORM LOSES
+ HRRZ E,(B) ; CDR IT
+ JUMPE E,TMAT3 ; CANT BE SPECIAL/UNSPECIAL, LEAVE
+ PUSHJ P,0ATGET ; GET POSSIBLE ATOM IN 0
+ JRST TEXP1 ; NOT ATOM
+ CAME 0,MQUOTE SPECIAL
+ CAMN 0,MQUOTE UNSPECIAL
+ JRST TMAT2 ; IGNORE SPECIAL/UNSPECIAL
+TMAT3: PUSHJ P,TEXP1
+ JRST .+2
+ AOS (P)
+ MOVEI 0,0 ; RET UNSPECIAL INDICATION
+ POPJ P,
+
+TEXP1: JUMPE B,TERR3 ; EMPTY FORM
+ GETYP E,A ; CHECK CURRENT TYPE
+ CAIN E,TATOM ; IF ATOM,
+ JRST TYPMA1 ; SIMPLE MATCH
+ CAIN E,TSEG
+ JRST .+3
+ CAIE E,TFORM
+ JRST TERR4
+ GETYP 0,(B) ; WHAT IS FIRST ELEMEMT
+ CAIE 0,TFORM ; FORM=> <<OR ..>....> OR <<PRIMTYPE FOO>....>
+ JRST TEXP12
+ PUSH TP,$TLIST ; SAVE LIST
+ PUSH TP,B
+ MOVE B,1(B) ; GET FORM
+ PUSH TP,C
+ PUSH TP,D
+ PUSH P,E
+ PUSHJ P,ACTRT1
+ TDZA 0,0 ; REMEMBER LACK OF SKIP
+ MOVEI 0,1
+ POP P,E
+ POP TP,D
+ POP TP,C
+ MOVE B,(TP) ; GET BACK SAVED LIST
+ SUB TP,[2,,2]
+ JUMPE 0,CPOPJ ; LOSERS EXIT IMMEDIATELY
+ HRRZ B,(B) ; OTHERWISE REST THE LIST AND FALL INTO ELETYPE
+
+; CHECKS TYPES OF ELEMENTS OF STRUCTURES
+
+ELETYP: CAIE E,TSEG ; MUST BE EXAXT?
+ JUMPE B,CPOPJ1 ; EMPTY=> WON
+ PUSH TP,$TLIST ; SAVE DCL LIST
+ PUSH TP,B
+ MOVE A,C ; GET OBJ IN A AND B
+ MOVE B,D
+ CAIE E,TSEG
+ TDZA E,E
+ MOVNI E,1
+ PUSH P,E
+ PUSHJ P,TYPSGR ; GET REST/NTH CODE
+ JRST ELETYL ; LOSER
+ CAIN C,5 ; BYTE STRING COMES HERE
+ JRST ELEBYT ; HACK IT
+ PUSH TP,DSTORE
+ PUSH TP,D
+ PUSH P,C ; SAVE CODE
+ PUSH TP,[0] ; AND SLOTS
+ PUSH TP,[0]
+
+; MAIN ELEMENT SCANNING LOOP
+
+ELETY1: XCT TESTR(C) ; SKIP IF OBJ NOT EMPTY
+ JRST ELETY2 ; CHEK EMPTY WINNER
+ SKIPN -4(TP)
+ JRST ELETY4
+ XCT TYPG(C) ; GET ELEMENT
+ XCT VALG(C)
+ JSP E,CHKAB ; CHECK OUT DEFER
+ MOVEM A,-1(TP) ; AND SAVE IT
+ MOVEM B,(TP)
+ MOVE C,A
+ MOVE D,B ; FOR OTHER MATCHERS
+ MOVE B,-4(TP) ; GET PATTERN
+ MOVE A,(B)
+ GETYP 0,(B) ; GET TYPE OF <1 pattern>
+ MOVE B,1(B) ; GET ATOM OR WHATEVER
+ CAIE 0,TATOM ; ATOM ... SIMPLE TYPE
+ JRST ELETY3
+ PUSHJ P,TYPMAT ; DO SIMPLE TYPE MATCH
+ JRST ELETY4 ; LOSER
+
+; HERE TO REST EVERYTHING AND GO ON BACK
+
+ELETY6: MOVE D,-2(TP) ; GET OBJ POINTER
+ MOVE C,(P) ; GET INCREMENT CODE
+ XCT INCR1(C)
+ MOVEM D,-2(TP) ; SAVED INCREMENTED GOODIR
+ MOVE 0,DSTORE
+ MOVEM 0,-3(TP)
+
+ELETY9: HRRZ B,@-4(TP) ; CDR IT
+ MOVEM B,-4(TP)
+ JUMPN B,ELETY1
+
+ SKIPN -1(P) ; SKIP IF EXACT REQUIRED
+ JRST ELETY8
+ XCT TESTR(C)
+ JRST ELETY8
+ JRST ELETY4
+
+
+; HERE IF PATTERN EMPTY
+
+ELETY8: AOS -2(P) ; SKIP RETURN
+ELETY4: SETZM DSTORE
+ SUB P,[2,,2]
+ SUB TP,[6,,6]
+ POPJ P,
+
+ELETYL: SUB P,[1,,1]
+ SUB TP,[2,,2]
+ POPJ P,
+
+; HERE TO HANDLE EMPTY OBJECT
+
+ELETY2: MOVE B,-4(TP) ; GET PATTERN
+ JUMPE B,ELETY8
+ GETYP 0,(B) ; CHECK FOR [REST ...]
+ SETZM DSTORE
+ CAIE 0,TVEC
+ JRST ELETY4 ; LOSER
+ HLRZ 0,1(B) ; SIZE OF IT
+ CAILE 0,-4 ; MUST BE 2
+ JRST ELETY4
+ MOVE B,1(B) ; GET IT
+ PUSHJ P,0ATGET ; LOOK FOR REST
+ JRST ELETY4
+ CAMN 0,MQUOTE OPTIONAL
+ JRST ELETY8
+ CAME 0,MQUOTE OPT
+ CAMN 0,IMQUOTE REST
+ JRST ELETY8 ; WINNER!!!!
+ JRST ELETY4 ; LOSER
+
+; HERE TO CHECK OUT A FORM ELEMNT
+
+ELETY3: CAIN 0,TSEG
+ JRST ELGO
+ CAIE 0,TFORM
+ JRST ELETY7
+ELGO: SETZM DSTORE
+ PUSHJ P,TEXP1 ; AND ANALYSE IT
+ JRST ELETY4 ; LOSER
+ MOVE 0,-3(TP) ; RESET DSTO
+ MOVEM 0,DSTORE
+ JRST ELETY6 ; WINNER
+
+; CHECK FOR VECTOR IN PATTERN
+
+ELETY7: CAIE 0,TVEC ; SKIP IF WINNER
+ JRST TERR12 ; YET ANOTHER ERROR
+ HLRE C,B ; CHECK LEENGTH
+ CAMLE C,[-4] ; MUST BE 2 LONG
+ JRST TERR13
+ PUSHJ P,0ATGET ; 1ST ELEMENT ATOM?
+ JRST ELET71 ; COULD BE FORM
+ CAME 0,MQUOTE OPT
+ CAMN 0,MQUOTE OPTIONAL
+ JRST ELET72
+ CAME 0,IMQUOTE REST
+ JRST TERR14
+ MOVE 0,(P) ; GET STRUC CODE
+ CAIN 0,2
+ CAME C,[-4]
+ JRST ELNUVE
+
+ GETYP 0,2(B) ; SEE IF UVECTOR REST SIMPLE TYPE
+ CAIE 0,TATOM
+ JRST ELNUVE
+
+ MOVE C,3(B) ; GET ATOM
+ HLRE 0,C
+ SUB C,0 ; POINT TO DOPE WDS
+ HRRE 0,(C)
+ JUMPE 0,ELNUVE
+ MOVSI A,TATOM
+ MOVE B,3(B)
+ MOVE C,-2(TP)
+ HLRE D,C
+ SUB C,D
+ GETYP C,(C)
+ MOVSI C,(C)
+ PUSHJ P,TMATCX
+ JRST ELETY4
+ JRST ELETY8
+
+ELNUVE: TDOA 0,[-1]
+ELET72: MOVSI 0,(SETZ) ; FLAG USED IN RESTIT
+ PUSH P,0
+ PUSHJ P,RESTIT ; CHECK REST OF STRUCTUR
+ JRST ELET41
+ POP P,0
+ TRNE 0,-1
+ JRST ELETY8 ; WIN AND DONE
+ JRST ELET81
+
+ELET41: SUB P,[1,,1]
+ JRST ELETY4
+
+; CHECK FOR [fix .... ]
+
+ELET71: CAIE 0,TFIX
+ JRST TERR15
+ MOVNS C
+ ASH C,-1
+ MOVE 0,1(B) ; GET NUMBER
+ IMULI 0,-1(C) ; COUNT MORE
+ PUSH P,0
+ PUSHJ P,RESTIT ; AND CHECK FIX NUM OF ELEMENTS
+ TDZA 0,0
+ MOVEI 0,1
+ SUB P,[1,,1]
+ JUMPE 0,ELETY4
+ELET81: MOVE D,-2(TP) ; GET OBJECT BACK
+ MOVE 0,-3(TP) ; RESET DSTO
+ MOVEM 0,DSTORE
+ MOVE C,(P) ; RESTORE CODE FOR RESTING ETC.
+ JRST ELETY9
+
+
+; HERE TO DO A TASTEFUL TYPMAT
+
+TYPMA1: PUSH TP,C
+ PUSH TP,D
+ PUSHJ P,TYPMAT
+ TDZA 0,0 ; REMEMBER LOSSAGE
+ MOVEI 0,1 ; OR WINNAGE
+ POP TP,D
+ POP TP,C ; RESTORE OBJECT
+ JUMPN 0,CPOPJ1 ; SKIPPED BEFORE, SKIP AGAIN
+ POPJ P,
+
+; HERE TO SKIP SPECIAL/UNSPECIAL
+
+TMAT2: CAME 0,MQUOTE SPECIAL
+ TDZA 0,0
+ MOVEI 0,1
+ PUSH P,0 ; SAVE INDICATOR
+ HRRZ A,(E) ; CHECK FOR EXACT LENGTH
+ JUMPN A,TERR16
+ GETYP A,(E) ; TYPE OF NEW PAT
+ MOVE B,1(E) ; VALUE
+ MOVSI A,(A)
+ PUSHJ P,TEXP1
+ JRST .+2
+ AOS -1(P)
+ POP P,0
+ POPJ P,
+
+; LOOK FOR <OR... OR <PRIMTYPE....
+
+TEXP12: CAIE 0,TATOM
+ JRST TERR5
+ MOVE 0,1(B) ; GET ATOM
+ CAMN 0,IMQUOTE QUOTE
+ JRST MQUOT ; MATCH A QUOTED OBJECT
+ CAME 0,IMQUOTE OR
+ CAMN 0,IMQUOTE PRIMTYPE
+ JRST ACTORT ; FALL INTO ACTOR HACKER
+ PUSH TP,$TLIST
+ PUSH TP,B
+ MOVE B,0 ; GET ATOM
+ PUSH TP,C ; SAVE OBJ
+ PUSH TP,D
+ PUSH P,E
+ PUSHJ P,TYPMAT
+ TDZA 0,0
+ MOVEI 0,1
+ POP P,E
+ MOVE C,-1(TP)
+ MOVE D,(TP)
+ MOVE B,-2(TP)
+ JUMPN 0,.+3 ; TO ELETYP IF WON
+ SUB TP,[4,,4]
+ POPJ P, ; ELSE LOSE
+
+ HRRZ 0,(B)
+ MOVSI A,TFORM
+ JUMPE 0,TERR3
+ MOVE B,0
+ PUSHJ P,ELETYP
+FOOPC: TDZA 0,0
+ MOVEI 0,1
+POPPIT: POP TP,D
+ POP TP,C
+ POP TP,B
+ POP TP,A
+ JUMPN 0,CPOPJ1
+ POPJ P,
+
+; THIS CODE HANDLES ORs AND PRIMTYPEs
+ACTRT1: SKIPA E,[SETZ PACT]
+
+ACTORT: MOVE E,[SETZ TEXP1]
+ JUMPE B,TERR6 ; EMPTY, LOSE
+ PUSHJ P,0ATGET ; ATOM TO 0
+ JRST PACT
+ CAME 0,IMQUOTE OR
+ JRST PACT2
+ HRRZ 0,(B) ; REST IT FLUSHING OR
+ JUMPE 0,TERR7
+ PUSH TP,$TLIST ; SAVE LSIT
+ PUSH TP,0
+ PUSH P,E ; SAVE ELEMENT CHECKER
+
+ORLP: SKIPN B,(TP) ; ANY LEFT?
+ JRST ORDON ; NOPE, LOSE
+ HRRZ 0,(B) ; SAVE THE REST
+ MOVEM 0,(TP)
+ GETYP 0,(B) ; WHAT ARE WE ORing
+ MOVE A,(B) ; TYPE WORD
+ MOVE B,1(B) ; AND ITEM
+ PUSH TP,C
+ PUSH TP,D
+ PUSHJ P,@(P) ; EITHER PACT OR TEXP1
+ TDZA 0,0
+ MOVEI 0,1
+ POP TP,D
+ POP TP,C
+ JUMPE 0,ORLP
+ AOS -1(P) ; SKIP RETURN FOR WINNER
+
+ORDON: SUB TP,[2,,2] ; FLUSH TEMP
+ SUB P,[1,,1]
+ POPJ P,
+
+; HERE TO PRIMTYPE ACTORS
+
+PACT: CAIE 0,TFORM
+ JRST PACT1
+ JUMPE B,TERR6 ; EMPTY FORM
+ MOVE 0,1(B) ; FIRST ELEMENT MUST BE PRIMTYPE
+PACT2: CAME 0,IMQUOTE PRIMTYPE
+ JRST TERR7
+ HRRZ A,(B) ; GET PRIMTYPE
+ JUMPE A,TERR7
+ HRRZ 0,(A)
+ JUMPN 0,TERR18
+ MOVEI B,(A)
+ GETYP A,C ; GET OBJ TYPE
+ GETYP 0,(B) ; GET PATTERN TYPE
+ CAIE 0,TATOM ; BETTER BE ATOM
+ JRST TERR8
+ PUSH TP,$TLIST ; SAVE DCL LIST
+ PUSH TP,B
+ PUSH TP,C
+ PUSH TP,D
+ PUSHJ P,SAT ; GET STORAGE TYPE
+ CAILE A,NUMSAT
+ JRST PTEMP
+ MOVE B,@STBL(A) ; GET PRIM NAME
+ PUSHJ P,TYPFND
+ JFCL ; MUST EXIST
+ MOVSI C,(D) ; FAKE OUT TYPMAT
+ MOVE B,-2(TP)
+ MOVE B,1(B)
+ PUSHJ P,TYPMAT
+ JRST .+2
+ AOS (P)
+ MOVE C,-1(TP)
+ MOVE D,(TP)
+ SUB TP,[4,,4]
+ POPJ P,
+
+PACT1: CAIE 0,TATOM
+ JRST TERR4
+ JRST TYPMAT
+
+PTEMP: MOVE B,-2(TP)
+ MOVE B,1(B)
+ CAMN B,IMQUOTE TEMPLATE
+ AOS (P)
+ SUB TP,[4,,4]
+ POPJ P,
+
+; RESTIT - TYPE CHECK SELECTED NUMBER OF ELEMENTS IN STRUCTURE
+
+RESTIT: PUSH TP,$TVEC ; SAVE TYPE
+ ADD B,[2,,2] ; SKIP OVER CRUFT
+ PUSH TP,B ; AND VAL
+ PUSH TP,$TVEC
+ PUSH TP,B
+RESTI1: PUSH P,A ; SAVE DISP HACK
+ PUSH P,0 ; AND COUNT HACK
+RESTI4: SKIPL (P) ; SKIP IF DOING ALL
+ SOSL (P) ; SKIP IF DONE
+ JRST RESTI6
+ AOS -2(P) ; SKIP RET
+RESTI5: SUB P,[2,,2] ; POP JUNK
+ SUB TP,[4,,4]
+ POPJ P,
+RESTI6: SKIPGE (TP)
+ JRST RESTX1
+ HLRZ 0,(P)
+ CAIN 0,(SETZ)
+ JRST RESTI2
+RESTX1: MOVE C,-4(P) ; REST CODE
+ MOVE D,-6(TP) ; SET UP FOR REST
+ MOVE E,-7(TP) ; DONT FORGET DSTO
+ MOVEM E,DSTORE
+ XCT TESTR(C) ; DONE?
+ JRST RESTI2 ; YES, CHECK WINNAGE
+ XCT TYPG(C)
+ XCT VALG(C) ; GET VAL ANDTYPE
+ JSP E,CHKAB ; CHECK DEFER
+ XCT INCR1(C) ; REST IT
+ MOVEM D,-6(TP) ; SAVE LIST
+ MOVE E,DSTORE
+ MOVEM E,-7(TP) ; FIXUP
+ SETZM DSTORE
+ MOVE C,A
+ MOVE D,B
+ SKIPL A,(TP) ; ANY MORE?
+ MOVE A,-2(TP) ; NO RECYCLE
+ ADD A,[2,,2] ; BUMP
+ MOVEM A,(TP) ; AND SAVE
+ MOVE B,-1(A) ; GET ELEMENT
+ MOVE A,-2(A)
+ GETYP 0,A
+ MOVEI E,TERR15
+ CAIN 0,TATOM
+ MOVEI E,TYPMAT ; ATOM --> SIMPLE TYPE
+ CAIE 0,TSEG
+ CAIN 0,TFORM ; FORM--> HAIRY PATTERN
+ MOVEI E,TEXP1
+ TLO E,400000
+ PUSHJ P,(E) ; DO IT
+ JRST RESTI5
+ JRST RESTI4
+
+RESTI2: SKIPGE (P) ; SKIP IF WON
+ AOS -2(P) ; COUNTERACT CPOPJ1
+ JRST RESTI5
+
+RESTI3: TEXP1
+ TYPMAT
+
+; HERE TO MATHC A QUOTED OBJ
+; B/ FORM QUOTE... C,D/ OBJECT TO MATCH AGAINST
+
+MQUOT: HRRZ B,(B) ; LOOK AT NEXT
+ JUMPE B,TERR7
+ GETYP A,(B) ; GET TYPE
+ MOVSI A,(A)
+ MOVE B,1(B) ; AND VALUE
+ JSP E,CHKAB ; HACK DEFER
+ PUSH TP,A
+ PUSH TP,B
+ PUSH TP,C
+ PUSH TP,D
+ MOVEI D,-3(TP)
+ MOVEI C,-1(TP)
+ PUSHJ P,IEQUAL
+ TDZA 0,0
+ MOVEI 0,1
+ JRST POPPIT
+
+; HERE TO HANDLE SPECIAL BYTE STRING HAIR
+
+ELEBYT: MOVE B,(TP) ; GET DECL LIST BACK
+ POP P,E ; EXACTNESS FLAG
+ JUMPE B,ELEBY2
+ GETYP 0,(B)
+ CAIE 0,TFIX
+ JRST TERR17
+ MOVE A,1(B)
+ HRRZ B,(B)
+ HRRZ 0,(B)
+ SKIPE B
+ JUMPN 0,TERR17
+ LDB C,[300600,,D] ; GET BYTE SIZE
+ CAIE A,(C)
+ JRST ELEBY3
+ HRRZ C,DSTORE
+ELEBY2: MOVEI A,0
+ JUMPE B,ELEBY4
+ GETYP 0,(B)
+ CAIE 0,TFIX
+ JRST TERR17
+ MOVE A,1(B)
+ELEBY4: CAIGE C,(A)
+ JRST ELEBY3
+ CAIE A,(C)
+ JUMPN E,ELEBY3
+ AOS (P)
+ELEBY3: SETZM DSTORE
+ SUB TP,[2,,2]
+ POPJ P,
+
+
+
+; GET ATOM IN AC 0
+
+0ATGET: GETYP 0,(B)
+ CAIE 0,TATOM ; SKIP IF ATOM
+ POPJ P,
+ MOVE 0,1(B) ; GET ATOM
+ JRST CPOPJ1
+
+TERR17: MOVE B,-2(TP)
+ MOVE B,1(B)
+ HRRZ 0,(P)
+ CAIN 0,FOOPC
+ MOVE B,-4(TP)
+ MOVSI A,TFORM
+ MOVE E,EQUOTE BAD-BYTES-DECL
+ SETZM DSTORE
+ JRST TERRD
+
+TERR18: SKIPA E,EQUOTE TOO-MANY-ARGS-TO-PRIMTYPE-DECL
+TERR16: MOVE E,EQUOTE TOO-MANY-ARGS-TO-SPECIAL-UNSPECIAL-DECL
+ MOVSI A,TFORM
+ JRST TERRD
+
+TERR9: MOVS A,0 ; TYPE TO A
+TERR4:
+TERR5:
+TERR15:
+TERR1: MOVE E,EQUOTE DECL-ELEMENT-NOT-FORM-OR-ATOM
+ JRST TERRD
+
+TERR2X: SUB TP,[2,,2]
+ POP TP,B
+ POP TP,A
+
+TERR2: MOVSI A,TATOM
+ MOVE E,EQUOTE ATOM-NOT-TYPE-NAME-OR-SPECIAL-SYMBOL
+ JRST TERRD
+TERR6:
+TERR3: MOVE E,EQUOTE EMPTY-FORM-IN-DECL
+ JRST TERRD
+TERR7: MOVE E,EQUOTE EMPTY-OR/PRIMTYPE-FORM
+ JRST TERRD
+
+TERR8: MOVS A,0 ; TYPE TO A
+ MOVE E,EQUOTE NON-TYPE-FOR-PRIMTYPE-ARG
+ JRST TERRD
+TERR12: MOVE E,EQUOTE ELEMENT-TYPE-NOT-ATOM-FORM-OR-VECTOR
+ JRST TERRD
+TERR13: MOVE E,EQUOTE VECTOR-LESS-THAN-2-ELEMENTS
+ JRST TERRD
+TERR14: MOVE E,EQUOTE FIRST-VECTOR-ELEMENT-NOT-REST-OR-A-FIX
+
+TERRD: PUSH TP,$TATOM
+ PUSH TP,EQUOTE BAD-TYPE-SPECIFICATION
+ PUSH TP,$TATOM
+ PUSH TP,E
+ PUSH TP,A
+ PUSH TP,B
+ MOVEI A,3
+ JRST CALER
+
+IMPURE
+
+IGDECL: 0
+
+PURE
+
+END
+\f\f
\ No newline at end of file