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 ; 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 ; 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 ; 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 <....> 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 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