*20 PAGE EXPR, 0 /GET EXPRESSION DCA EXPVAL /ZERO EXPR VALUE DCA EXPVAL+1 DCA EXPVAL+2 DCA EXPTYP /AND TYPE CLA IAC /SET EXPR SWITCH TO NO EXPR DCA EXPSW CLA IAC /SET LASTOP TO + DCA LASTOP JMS I [CHKLIT /GO CHECK FOR LITERAL JMS I [GETCHR /LOOK FOR UNARY+ - JMP I EXPR /NO EXPRESSION TAD (-255 /IS IT - SNA ISZ LASTOP /SET LAST OPER8R TO - SZA TAD (255-253 /IS IT + OR - SZA CLA JMS I [BACK1 /NO, PUT CHAR BACK SYMBOL, JMS I [GETNAM /NOW PICK UP NAME JMP NOSYM /NONE, TRY OTHER JMS I [LOOKUP /LOOK IT UP JMP DEFSYM /NEW SYMBOL TAD (-5 /CHECK FOR BADDIES SMA JMP BAD /BAD EXPRESSION TAD SYMTYP DCA .+1 /STORE JUMP 0 /JUMP THRU TABLE SYMTYP, JMP I .+6 PUNDEF, UNDEF /UNDEFINED ADR /USER ADDRESS LADR /*LINC ADDR BAD /*** ONE /PDP-8 OPERATE OKEXP, ISZ EXPR /GOOD EXPR, BUMP RETURN BAD, CLA JMP I EXPR /RETURN NOSYM, TAD CHRPTR /NO NAME, SAVE CHAR POS DCA EXTMP TAD NCHARS DCA EXTMP2 JMS I (NUMBER /LOOK FOR A NUMBER JMP NOTNUM /NO NUMBER JMP ADREXP /GO USE IT NOTNUM, JMS I [GETCHR /NOT A NUMBER, GET A CHAR JMP I (ENDEXP+1 /NONE LEFT, END TAD [-256 /IS IT "." ? SZA CLA JMP I (ENDEXP /NO, END EXPR JMS I [GETCHR /LOOK AT NEXT CHAR JMP ISDOT /NO NEXT CHAR, ITS LOC SYMBOL TAD [-272 /IS NEXT CHAR A DIGIT SMA JMP ISDOT-1 /NO TAD [12 SMA CLA JMP BAD /*** /FOR ".N" CASE JMS I [BACK1 /OTHERWISE PUT IT BACK ISDOT, TAD LOCTR1 /THIS WAS LOC SYMBOL DCA WORD1 /PUT VALUE INTO WORD1,2 TAD LOCTR2 DCA WORD2 JMP ADREXP /AND USE VALUE ADR, TAD I X10 /*GET FIRST WORD OF VALUE ONE, DCA WORD1 /IF SINGLE WORD, HIGH=0 NOTR, CMA DCA MTEMP /*SET NON-LMODE SWITCH JMP W2 LADR, DCA MTEMP /*SET LMODE SWITCH TAD I X10 DCA WORD1 TAD MODE SMA CLA JMP NOTR W2, TAD I X10 ISZ MTEMP /LMODE DEFINED SYMBOL? AND (1777 /*YUP DCA WORD2 CDF FLD0 /FIX FIELD ADREXP, TAD EXPSW /FIRST TIME THROUGH ? SZA /IF SO THEN SET TYPE TO ADDR DCA EXPTYP /OTHERWISE LEAVE IT ALONE / CLL CMA RAL / TAD EXPTYP /CHECK FOR TYPE CONFLICT / SMA CLA / JMP MXDTYP /NOT - MEANS FP OR DP DCA EXPSW /KILL FIRST TIME SWITCH TAD LASTOP /PICK UP LAST OPERATOR TAD ADROP /MAKE A JMP I DCA .+1 0 /DO IT ADROP, JMP I . ADRADD ADRSUB ADRMUL BAD /INTEGER DIVIDE NOT IMPLEMENTED ADRAND ADROR / MTEMP, 0 / /MXDTYP, JMS I [ERMSG /MIXED TYPES / 1524 /*MT* / JMP I [OPR8R DEFSYM, DCA I NEXT /NEW SYMBOL, ALLOCATE 2 WORDS DCA I NEXT JMP I PUNDEF /THEN TREAT LIKE UNDEFINED / /CODE FOR LINC ADD ? SUBTRACT (ONES COMPLEMENT!) /NOTE THAT THIS CODE MUST BE ORIGINED IN SEGMNT 0 LADD, CLL LINC LMODE ADD EXPVAL+2 ADD WORD2 STC EXPVAL+2 ROL I 1 /GET LINK ADD WORD1 LMOUT, STC EXPVAL+1 PDP PMODE JMP I [OPR8R LSUB, TAD WORD2 CLL CMA CML LINC LMODE ADD EXPVAL+2 STC EXPVAL+2 ROL I 1 /GET LINK COM ADD EXPVAL+1 JMP LMOUT /NOTE THAT THIS CLOBBERS LOC. 0 PMODE PAGE UNDEF, DCA EXPTYP /SET TYPE TO UNDEFINED CDF FLD0 /FIX FIELD DCA EXPSW /KILL FIRST TIME SWITCH CLL CMA RAL /-2 TAD PASSNO /IF > PASS 1, UNDEFINED ERROR SPA CLA JMP OPR8R /UNDEFINED HAS VALUE 0 JMS I [ERMSG 2523 /*US* OPR8R, TAD (OPR8RS-1 /SET POINTER DCA X11 /TO OPERATOR TABLE DCA LASTOP /ZERO LASTOP JMS I [GETCHR /GET CHAR JMP I (ENDEXP+1 /NONE, DONE DCA EXTMP /SAVE IT FINDOP, TAD I X11 /GET NEXT LIST ENTRY SNA JMP I (ENDEXP /ZERO IS END OF LIST TAD EXTMP /COMPARE SNA CLA JMP GOTOP /THIS IS THE OPERATOR ISZ X11 /NO, BUMP PTR JMP FINDOP /LOOP GOTOP, TAD I X11 /PICK UP OTHER VALUE DCA LASTOP /SAVE IN "LASTOP" JMP I (SYMBOL /LOOK FOR OPERAND ADRADD, TAD MODE /SEE IF LINC MODE SPA CLA JMP I (LADD /YES TAD EXPVAL+2 /ADD FOR 15 BIT ADDRESS CLL /ZERO LINK TAD WORD2 /ADD LOW WORDS DCA EXPVAL+2 /SAVE RESULT RAL /PUT CARRY INTO BIT 11 TAD EXPVAL+1 /ADD HIGH TAD WORD1 /ORDER WORDS DCA EXPVAL+1 /SAVE RESULTT JMP OPR8R /LOOK FOR OPERATOR ADRSUB, TAD MODE /SEE IF LINC MODE SPA CLA JMP I (LSUB /YES TAD WORD2 /SUBTRACT LOW 12 BITS CLL CML CIA TAD EXPVAL+2 DCA EXPVAL+2 /SAVE LOW HALF RAL TAD WORD1 /SUBTRACT HIGH HALF CIA TAD EXPVAL+1 DCA EXPVAL+1 /SAVE HIGH HALF JMP OPR8R /GET OPERATOR ADRAND, TAD WORD1 /AND AND EXPVAL+1 /HIGH DCA EXPVAL+1 /HALF TAD WORD2 /THEN AND EXPVAL+2 /LOW DCA EXPVAL+2 /HALF JMP OPR8R /THEN COOL IT ADROR, TAD WORD1 /OR IS THE SAME AS CMA /SETTING THE BITS AND EXPVAL+1 /THAT ARE ON IN B AND NOT ON IN A TAD WORD1 /AND THEN SETTING THE BITS DCA EXPVAL+1 /THAT ARE ON IN A TAD WORD2 CMA AND EXPVAL+2 TAD WORD2 DCA EXPVAL+2 JMP OPR8R /LOOK FOR OPERATOR ADRMUL, DCA SIGNX /ZERO SWITCH TAD EXPVAL+1 /IS EXPR NEG