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