File MACMAC.MA (MACREL macro assembler source file)

Directory of image this file is from
This file as a plain text file

/9 MACRO DIRECTIVES OVERLAYS FOR MACREL	POST V0A
	.INCLUDE MGLOB.MA
	.ASECT MACM1,LEVEL=2,OVERLAY=5
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1977 BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/

.EXTERNAL ASEMLV,BACKUP,BRANCH,CREF,CRLF,DPRINT,ENTER,EOS,ERROR,EXPR .EXTERNAL FSCHEK,GETCHR,GETKAR,GETSYM,LETTER,LISTER,LOOKUP,ORIG,OUT,PARSYM .EXTERNAL PASS3,POP,PUSH,PUNBIT,PUTBIT,PUTSYM,PUXBIN,READLN,ROTL6,SCAN .EXTERNAL NM,SKSEP,SYMBOL,TSTEND,NEXTLINE,PART2R,FINI .EXTERNAL BSLXXX,DOLXXX,STORMS,FINMS,MACEND,LINBUF,RESCAN .EXTERNAL CREATE,INITMS,DIGIT,STREAM,MARGS,MLOW,MHIGH .EXTERNAL EXPSTK .EXTERNAL LOAD,BACKL .GLOBAL $MACRO,$REPT,$MEXIT .GLOBAL TXTS FT=EXPSTK+1 FIELD 4 .GLOBAL ER101,ER102,ER201,ER202,ER110,ER111,ER112,ER113 .GLOBAL PART2,MC .GLOBAL ER114,ER115,ER116,ER200 .EXTERNAL AT / PRODUCES OVERLAYS V,W, AND X (26,27,30) /TO DO .IMACR: /1. STORE MACRO JUST LIKE ORDINARY EXCEPT DIFFERENT EOMB CODE /2. CALL IS ORDINARY /3. EXPANSION IS ORDIANRY /4. AT END, SHIFT ARGS DOWN 1, DECR COUNT AND RE-INVOKE /REMOVE AND RESTORE $ ABD \ TESTS FROM PARSYM / MUST BE ASSEMBLED WITH THE /W SWITCH / .GLOBAL MACRY / OVERLAYS PRODUCED: /NUM NAME LOC CONTENTS /26 OVRV 03000 MACRO DEFINITION HEADER /27 OVRW 03400 MACRO DEFINITION BODY + .REPT /30 OVRX 04000 MACRO CALLS /SPECIAL CHARACTER DEFINITIONS ARG=4000 /ARGUMENT CHAR TRQUOT=2042 /"TRANSPARENT QUOTE" EOMB=7770 /END-OF-MACRO-BODY EOA=7771 /END-OF-ARGUMENT EORR=7772 /END-OF-REPEAT-RANGE ARGEXP=7773 ARGVAR=7774 MKEYS=3304 RKEYS=3313 .ENABLE 7BIT
*2000 KEYFLD=10 26 /OVERLAY V /1. MACRO DIRECTIVE /1.1 PROCESS MACRO NAME $MACRO, JMS I QQSCAN /IGNORE BLANKS JMS I QQLETTER /SKIP IF LETTER JMP ER113 JMS I QQPARSYM /GET A SYMBOL NAME JMS I QQLOOKUP /LOOK UP NAME JMS I QQENTER /ENTER IT IF NOT THERE JMS I QQGETSYM /GET INFO ABOUT SYMBOL TAD FLAG /LOOK AT FLAG WORD SZA /IS SYMBOL DEFINED? JMS UNDFMC /YES, DELETE OLD COPY TAD FLAG /GET BACK FLAG WORD AND (3700 /SAVE OTHER BITS TAD (4001 /MARK AS DEFINED USER MACRO DCA FLAG JMS I QQPUTSYM TAD SYMNUM DCA I (MACSAV /SAVE PTR TO THIS ELEMENT /HANDLE FORMAL ARGUMENTS /1.2 PROCESS FORMAL ARGUMENTS /1.2.1 INITIALIZE STORAGE INTO FORMAL ARG TABLE (FT) /ENTRY POINT FOR FORMAL ARGUMENT PROCESSOR /CODE INSERTED AT THIS POINT TO SAVE THE /MACRO NAME SO IT CAN BE CHECKED LATER. /TRANSFER SYMBOL TO 'NM' TAD (NM-1 /INITIALIZE TRANSFER OF NAME DCA XR2 JMS TRANSF /TRANSFER THE SYMBOL. /NAME HAS NOW BEEN SAVED. /CONTINUE MACRO DEFINITION PROCESSING. /END OF INSERTION. TAD (FT-1 /POINT INDEX REG TO FT DCA XR2 TAD (-MAXRGS) /SET COUNTER FOR MAX NR OF ARGS DCA FA1 /CURRENT CHAR IS CHAR FOLLOWING MACRO NAME JMS I QQSCAN /SR FIRST PARAMETER MUST BE PRECEDED BY SPACES ONLY SKP /SR /1.2.2 STORE FORMAL ARGS INTO FT FA10, JMS I (SKSEP /SKIP SEPARATOR CHAR(S). JMS I (SYMBOL /TEST FOR SYMBOL AND PARSE IT. JMP FA11 /NO SYMBOL: END OF FORMAL ARG LIST. JMS TRANSF /SYMBOL FOUND: STORE INTO FT. ISZ FA1 /COUNT FORMAL ARGS STORED JMP FA10 /CONTINUE STORING ARGS UNTIL MAXIMUM FOUND /MAXIMUM ARGS STORED, FT IS FULL. /END OF FORMAL ARG LIST. /1.2.3 TERMINATE FT STORAGE FA11, CDF KEYFLD DCA I XR2 /TERMINATE FT AS A KEYWORD LIST FOR "MATCH". CDF 0 JMS I (TSTEND /TEST FOR LEGAL END-OF-LINE. JMS I (NEXTLINE /READ NEXT LINE. JMP ER110 /NOTHING THERE! JMP I (PART2R /MUST BE IN ROOT FA1, 0 /FORMAL ARGUMENT COUNTER ER113, JMS I QQERROR /NOT A MACRO NAME JMS I (IGNORE JMP I (BYEB
/SUBROUTINE TO TRANSFER SYMBOL AND STORE IN KEYWORD LIST /NOTE: XR2=DESTINATION ADDR - 1 IN FIELD 'KEYFLD' TRANSF, 0 CDF KEYFLD TAD NAME1 CIA DCA I XR2 TAD NAME2 CIA DCA I XR2 TAD NAME3 CIA DCA I XR2 CDF 0 JMP I TRANSF /DONE. UNDFMC, 0 /RESTORE OLD STUFF TO MACRO SPACE AND QQ7 /LOOK AT TYPE BITS TAD (-1 SZA CLA /WAS IT A USER MACRO? JMP NOTMAC /NO TAD TXTEND /YES JMS I (CNVADR /DELETE MACRO FROM MACRO SPACE DCA TEMP TAD FREEPTR DCA I TEMP TAD TXTSTRT CDF 0 DCA FREEPTR JMP I UNDFMC NOTMAC, ER114, JMS I QQERROR JMP I (BYEB ER110, JMS I QQERROR /EOF AFTER .MACRO DIRECTIVE JMP I (FINI /ABORT PASS PAGE
.ASECT MACM2,LEVEL=2,OVERLAY=6 FIELD 4 *2000 27 /OVERLAY W /1.3 STORE MACRO BODY INTO MACRO SPACE /1.3.1 INITIALIZE MACRO BODY STORAGE TXTS, 0 PART2, STA /SET NESTED DEF COUNTER FOR FIRST LEVEL (COUNTS DCA MB1 /NUMBER OF NESTED ".MACRO" DIRECTIVES). /DID THIS IN ROOT / JMS I (CREATE /GET A CELL FROM THE FREE LIST /THIS CELL WILL BE FIRST FOR STORAGE /ALSO SAVE POINTER FOR LATER STORAGE / DCA TXTS /IN SYMBOL TABLE. TAD TAGLOC DCA TAGSAV CLA IAC /PRETEND WE'RE WITHIN A LSB DCA TAGLOC /SO AS NOT TO FLAG SYMBOLS ENDING WITH $ /DID THIS IN ROOT / JMS I (INITMS /INITIALIZE STORAGE INTO FIRST CELL TAD (SKP CLA DCA I (BSLXXX /NO \ EVALUATED IN MACRO BODY YET TAD (SKP CLA DCA I (DOLXXX /DON'T ALLOW $'A TO TERMINATE ASSEMBLY /1.3.2 PROCESS AND STORE THE MACRO BODY MB10, JMS I QQSCAN /SKIP ANY INITIAL BLANKS. JMS I (SYMBOL /READ THE FIRST SYMBOL ON EACH LINE JMP MB14 /NO SYMBOL FOUND: STORE LINE IN MACRO SPACE. JMS MATCH /SYMBOL: TEST FOR ".MACRO" OR ".ENDM" DIRECTIVES MKEYS-1 /ADDR OF KEYWORD LIST FOR "MATCH" JMP MB14 /NO MATCH FOUND /MATCH FOUND: PROCESS DIRECTIVES / EMBEDDED IN MACRO BODY. TAD SS3 /WHICH DIRECTIVE IN KEYWORD LIST MATCHED? SZA CLA JMP MB13 /ENTRY #1: ".ENDM" /ENTRY #0: ".MACRO" /PROCESS EMBEDDED ".MACRO" CLL STA RAL /COUNT NESTED DEFINITION TAD MB1 /-2 DCA MB1 /EFFECTIVELY WE ARE SUBTRACTING 1 FROM MB1 /GO STORE THE LINE /PROCESS ".ENDM" MB13, ISZ MB1 /FINISHED OUTER DEF LEVEL? JMP MB14 /NO: GO STORE THE LINE /YES: TERMINATE MACRO DEFINITION. /CHECK MACRO NAME FOR CORRECTNESS. JMS I QQSCAN /ALLOWING BLANKS, JMS I (SYMBOL /READ THE NEXT SYMBOL, IF ANY. JMP MB13A /NO SYMBOL: FINISH UP DEFINITION STORAGE. /SYMBOL CAME: MUST MATCH MACRO NAME. JMS MATCH /SEE IF NAME MATCHES. NM-1 /ARG FOR "MATCH" - ADDR OF KEYWORD LIST /NO MATCH: DECLARE ERROR: / "MACRO NAME DOES NOT MATCH". ER111, JMS I QQERROR /NAME ON .ENDM DOES NOT MATCH /FINISH UP MACRO DEFINITION STORAGE. MB13A, JMS I (TSTEND /TEST FOR LEGAL END-OF-LINE SYNTAX. TAD (EOMB) /TERMINATE STORAGE IN MACRO SPACE. JMS I (STORMS /STORE END-OF-MACRO-BODY CHAR JMS I (FINMS /STORE 0 LINKAGE WORD TAD TAGSAV DCA TAGLOC /RESTORE CONTEXT OF WHETHER WE'RE IN A LSB TAD SNACLA DCA I (BSLXXX /RESTORE PARSYM TO ITS ORIGINAL BEAUTY TAD SNACLA DCA I (DOLXXX JMP I (MACEND /SR END OF MACRO DIRECTIVE TAGSAV, 0 /HOLDS PRIOR CONTENTS OF PREVIOUS TAG
/STORE THE LINE IN MACRO SPACE, SUBSTITUTING MARKERS / ("ARG N" CHARS) FOR FORMAL ARGUMENTS. MB14, TAD (LINBUF-1 /START AT BEGINNING OF LINE. DCA LINPTR MB17, JMS I QQGETCHR MB15, JMS I (SYMBOL /TEST FOR SYMBOL AND PARSE IT. JMP MB16 /NO SYMBOL: STORE CURRENT CHAR. JMS MATCH /SYMBOL: DOES IT MATCH ONE OF THE CURRENT FT-1 /FORMAL ARGS? JMP MB18 /NO: STORE SYMBOL NORMALLY. JMS I (BLARG /CHECK FOR [M:N] TAD SS3 /YES: SUBSTITUTE MARKER CHAR FOR TAD (ARG) /THE FORMAL ARG. JMS I (STORMS /STORE THE MARKER. JMP MB20 /STRIP ANY DELIMITING APOSTROPHE /AND CONTINUE TESTING AND STORING. MB16, TAD CHAR /STORE CURRENT CHAR INTO MACRO SPACE. JMS I (STORMS /STORE AC INTO MACRO SPACE. TAD CHAR /HAVE WE JUST STORED AN EOL (0)? SZA CLA JMP MB17 /NO: GO ON TO NEXT CHAR. JMS I (NEXTLINE /YES: GO ON TO NEXT LINE. JMP ER112 /EOF JMP MB10 /AND GO PROCESS IT. MB18, JMS I (RESCAN /RESCAN THE SYMBOL, STORING ITS CHARS. MB19, TAD CHAR /GET CURRENT CHAR. JMS I (STORMS /STORE IT. JMS I QQGETCHR /LOOK AT NEXT CHAR. ISZ SMCOUNT /FINISHED SCANNING SYMBOL? JMP MB19 /NO: STORE NEXT CHAR. MB20, TAD CHAR /YES: SKIP ANY APOSTROPHE. /NOTE: THIS IMPLEMENTS (') /AS CONCATENATION CHARACTER. TAD (-"' SNACLA, SNA CLA JMS I QQGETCHR /FOUND: SKIP IT. /NOT FOUND: JMP MB15 /CONTINUE TESTING AND STORING.
MB1, 0 / - DEFINITION LEVEL ER112, JMS I QQERROR /EOF BEFORE MATCHING .ENDM JMP MB13 /PRETEND SAW .ENDM
/ M A T C H /GENERALIZED SYMBOL-MATCHING / CALL: JMS I (MATCH / A-1 /ADDR OF KEYWORD LIST - 1 / ... /RETURN: NO MATCH OCCURRED / ... /RETURN: MATCH OCCURRED /NOTE: KEYWORD LIST CONSISTS OF NEGATIVE 6-BIT-ASCII 6-CHARACTER /STRINGS (3 WDS EACH). EXAMPLE: "ABCDEF" IS THE 6-BIT STRING /010203040506 (WORDS: 0102; 0304; 0506), WHICH, WHEN /NEGATED, BECOMES THE WORDS 7676; 7474; 7272. KEYWORD LIST IS /TERMINATED BY 0 WORD. /KEYWORD LIST IS IN FIELD 'KEYFLD' MATCH, 0 DCA SS3 /CLEAR INDEX COUNT TAD I MATCH /GET ARG, ADDR OF KEYWORDS - 1 ISZ MATCH /SKIP OVER ARG MA1, DCA SS1 /INITIALIZE SCAN OF KEYWORD LIST TAD SS1 /INITIALIZE SCAN OF CURRENT KEYWORD DCA XR0 TAD (SYM-1) /LOCATION OF SYMBOL TO MATCH DCA XR1 CLL STA RTL /COMPARE 3 WORDS DCA KNT CDF KEYFLD TAD I XR0 /GET FIRST WORD OF KEYWORD SZA /END OF LIST? JMP MA2A /NO: COMPARE WORDS CDF 0 JMP I MATCH /YES: TAKE 'NO MATCH' RETURN /PERFORM COMPARISON MA2, CDF KEYFLD TAD I XR0 /READ NEXT WORD OF KEYWORD MA2A, CDF 0 TAD I XR1 /SUBTRACT FROM "SYM" (THE PARSED SYMBOL) SNA CLA JMP MA4 /IT MATCHES SO FAR TAD (3) /MISMATCH: SET UP NEXT KEYWORD TAD SS1 ISZ SS3 /INCREMENT TRIAL COUNT JMP MA1 /GO COMPARE IT /WORDS ARE MATCHING SO FAR MA4, ISZ KNT /HAVE ALL 3 WORDS MATCHED? JMP MA2 /NO: COMPARE NEXT WORD OF THIS ENTRY ISZ MATCH /YES: TAKE THE 'MATCH' RETURN JMP I MATCH /DATA FOR "MATCH" SS1, 0 /KEYWORD LIST ADDR IN FIELD KEYFLD PAGE
/ .GLOBAL REPTY / .REPT DIRECTIVE $REPT, JMS I QQSCAN /IGNORE BLANKS JMS I QQBACKUP /GET READY TO CALL 'EXPR' JMS I QQEXPR /PARSE AN EXPRESSION DCA BINARY /SAVE RESULT WHERE IT WILL GET PRINTED IN BIN FIELD ISZ PCFLAG /BUT NO PC TO PRINT JMS I QQOUT /PRINT LINE JMS I QQREADLN /READ NEXT LINE FOR MACRO CODE JMP ER115 TAD BINARY /PUT COUNT IN AC /3. REPEAT DIRECTIVE /3.1 READ ARGUMENTS /3.1.1 PARSE EXPRESSION TO GET REPEAT VALUE RE, /SR REPEAT PROCESSOR DCA RS1 /VALUE IS UNSIGNED INTEGER, 0 TO 7777 OCTAL. /3.2 STORE RANGE IN MACRO SPACE /3.2.1 INITIALIZE RANGE STORAGE STA /SET NESTED REPEAT COUNT FOR FIRST (OUTER) LEVEL. DCA RS2 JMS I (CREATE /GET A CELL FROM THE FREE LIST /THIS WILL BE FIRST CELL FOR STORAGE OF /REPEAT RANGE. DCA RS3 /SAVE FOR LATER PASSING TO "RGET". JMS I (INITMS /INITIALIZE STORAGE INTO FIRST CELL JMS I QQGETCHR /INITIALIZE CURRENT CHAR AS FIRST CHAR /OF REPEAT RANGE. /3.2.2 PROCESS AND STORE THE RANGE RE2, JMS I QQSCAN /SKIP ANY INITIAL BLANKS ON EACH LINE. JMS I (SYMBOL /READ THE FIRST SYMBOL OF EACH LINE JMP RE6 /NO SYMBOL: STORE THE LINE. JMS I (MATCH /SYMBOL: TEST FOR REPEAT DIRECTIVES RKEYS-1 /ADDR OF KEYWORD LIST FOR "MATCH" JMP RE6 /NO MATCH: CONTINUE STORING /MATCH: PROCESS DIRECTIVES /EMBEDDED IN REPEAT RANGE. TAD SS3 /WHICH DIRECTIVE IN KEYWORD LIST MATCHED? SZA CLA JMP RE5 /ENTRY #1: ".ENDR" STA /ENTRY #0: ".REPT" TAD RS2 /COUNT NESTED REPEAT RANGE DCA RS2 JMP RE6 /GO STORE THIS LINE ER115, JMS I QQERROR /EOF AFTER .REPT JMP I (FINI /TERMINATE PASS
/PROCESS ".ENDR" KEYWORD RE5, ISZ RS2 /FINISHED STORING OUTER REPEAT RANGE? JMP RE6 /NO: STORE THIS LINE TAD (EORR) /YES: TERMINATE STORAGE IN MACRO SPACE WITH JMS I (STORMS /AN END-OF-REPEAT-RANGE CHAR. JMS I (FINMS /STORE 0 IN LINKAGE WORD JMS I (TSTEND /TEST FOR LEGAL END-OF-LINE SYNTAX. CIF 10 JMS I (SWITCH /SWITCH TO STREAM COROUTINE "RGET" TO RGET /BEGIN ASSEMBLING REPEAT RANGE. TAD RS3 /SET UP RGET PARAMETERS - FIRST CELL OF RANGE CDF 10 /STREAM COROUTINES ARE IN FIELD 1 DCA I (R TAD MS1 /LAST CELL OF RANGE DCA I (S TAD RS1 /REPEAT VALUE DCA I (V CDF 0 /SR JMP I (BYEB /SR END OF REPEAT DIRECTIVE /STORE THE LINE IN MACRO SPACE RE6, TAD (LINBUF-1 /START AT BEGINNING OF SAME LINE DCA LINPTR RE7, JMS I QQGETCHR /NEXT CHAR ON THE LINE. TAD CHAR /GET THE CHAR JMS I (STORMS /AND STORE IT IN MACRO SPACE. TAD CHAR /IS IT EOL? SZA CLA JMP RE7 /NO: CONTINUE STORING. JMS I (NEXTLINE /YES: READ IN THE NEXT LINE SKP JMP RE2 /AND PROCESS IT. ER116, JMS I QQERROR /EOF BEFORE MATCHING .ENDR JMP RE5 /PRETEND SAW .ENDR /DATA FOR REPEAT DIRECTIVE RS1, 0 /INITIAL REPEAT VALUE RS2, 0 / - REPEAT RANGE LEVEL RS3, 0 /FIRST CELL OF REPEAT RANGE
BLARG, 0 /CHECK FOR [M:N] TAD CHAR TAD (-133 /QQ SZA CLA JMP I BLARG /NO QQ JMS ARGY /GET FIRST ARGUMENT JMS I QQBRANCH -72;COLON MBR, -135;CLOBR /] 0 ER200, JMS I QQERROR CLOBR, JMS I QQGETCHR /PASS UP CHARACTER JMP I BLARG COLON, JMS ARGY TAD CHAR TAD MBR SZA CLA JMP ER200 /NO ] AT END JMP CLOBR
ARGY, 0 JMS I QQGETCHR /PASS UP DELIMITER JMS I (DIGIT JMP NOTD /NOT A DIGIT JMS I QQBACKUP /DIGIT, PREPARE TO PARSE EXPRESSION JMS I QQEXPR DCA SYMNUM /SAVE ABSOLUTE PART OF EXPRESSION /*** LOCAL SYMBOLS? TAD (ARGEXP-ARGVAR /SIGNAL SPECIAL EXPRESSION ARGUMENT JMP ARGY2 NOTD, JMS I QQLETTER JMP ER200 /NOT LETTER OR DIGIT JMS I QQPARSYM /GET IDENTIFIER (WHAT ABOUT LOCAL SYMBOLS?) JMS I QQLOOKUP JMS I QQENTER ARGY2, TAD (ARGVAR /SIGNAL SPECIAL SYMBOL JMS I (STORMS TAD SYMNUM JMS I (STORMS JMP I ARGY PAGE
.ASECT MACM3,LEVEL=2,OVERLAY=7 FIELD 4 *2000 30 /OVERLAY X /2. MACRO CALL /2.1 PROCESS ACTUAL ARGUMENTS /2.1.1 INITIALIZE STORING ARG POINTERS INTO NEXT LEVEL OF A.T. MC, 0 /SR ENTRY POINT FOR MACRO CALL PROCESSOR JMS I (PRCALL SIZELV=MAXRGS^2 /SIZE OF EACH A.T. LEVEL LASTLV=MAXLVS-1^SIZELV+AT /ADDR OF LAST LEVEL IN A.T. TAD AT1 /ARE WE AT MAXIMUM NESTING LEVEL? TAD MLASTLV SZA JMP MC0 /NO. /YES: DECLARE ERROR, "TOO MANY LEVELS OF / NESTED MACRO CALLS." ER101, JMS I QQERROR /MACRO NESTING TOO DEEP ISZ OV1 /COUNT NR OF OVERFLOWED LEVELS. TAD (-SIZELV) /SET TO LAST LEVEL UPON OVERFLOW. MC0, TAD (LASTLV+SIZELV) /LOCATES TO NEXT A.T. LEVEL. DCA AT2 /POINTER FOR STORING ARG CELL POINTERS INTO A.T. TAD AT2 /ALSO SAVE FOR LATER USE IN PUSHING THE A.T. DCA AT4 TAD (-MAXRGS) /INITIALIZE COUNTER FOR STORING INTO A.T. DCA AT3 DCA NARGS /CURRENT CHAR IS DELIMITER FOLLOWING MACRO NAME /2.1.2 STORE NEXT ACTUAL ARG INTO MACRO SPACE, FIRST CELL AND / LAST CELL POINTERS INTO A.T. JMS I QQSCAN /NO COMMA ALLOWED AFTER MACRO NAME SKP MC1, JMS I (SKSEP /SKIP SEPARATOR (BLANKS AND/OR COMMA), / IF ANY. JMS I QQEOS /ARE WE AT A TERMINATOR? JMP TE2A /YES: END A.T. STORAGE. /STORE ARG INTO MACRO SPACE AND A.T. /INITIALIZE STORAGE /GET A CELL FROM THE FREE LIST JMS I (CREATE /SAVE POINTER AS INITIAL CELL FOR STORAGE /IN BOTH MS1 AND IN A.T. CDF ATFLD DCA I AT2 CDF 0 ISZ AT2 /INITIALIZE STORAGE INTO FIRST CELL JMS I (INITMS JMS I QQBRANCH -"";MC4A /" -"<;MC8A /OPEN ANGLE BRACKET -"\;MC7 /\ 0 REG, TAD BITS /REGULAR TYPE STORAGE AND (3020 SZA CLA JMP TE1 /SPACE, TAB, COMMA, OR EOS JMS MCPUT /CHAR IS NOT A DELIMITER. STORE IT. JMP REG
MC4A, JMS I QQGETCHR /SKIP INITIAL QUOTE MC4, TAD CHAR /QUOTE MODE: AT END-OF-LINE? SZA CLA JMP MC5 /NO: MORE TESTS. /YES: DECLARE BAD SYNTAX ERROR. ER102, JMS I QQERROR /END OF LINE BEFORE MATCHING " FOUND JMP TE1 /THEN TERMINATE THE ARG. MC5, JMS I (TSTQUOTE /EMBEDDED QUOTE? JMP MC6 /NO: STORE THE CHAR. JMS I QQGETCHR /YES: LOOK AT FOLLOWING CHAR. JMS I (TSTQUOTE /IS IT A QUOTE? JMP TE1 /NO: TERMINATE THE ARG. TAD (TRQUOTE) /YES: SUBSTITUTE "TRANSPARENT QUOTE" CHAR. MC6, JMS MCPUT JMP MC4 /AND PROCESS IT LIKEWISE.
MCPUT, 0 SNA TAD CHAR /STORE CURRENT CHAR. JMS I (STORMS /STORE AC INTO MACRO SPACE. JMS I QQGETCHR /LOOK AT NEXT CHAR. JMP I MCPUT MC8A, JMS I QQGETCHR /PASS UP OPEN ANGLE BRACKET CLA IAC DCA ANGCNT MC8, TAD CHAR SNA JMP ER201 /NO MATCHING CLOSE ANGLE BRACKET JMS I QQBRANCH -"<;OPA /OPEN ANGLE BRACKET -">;CLO /CLOSE ANGLE BRACKET 0 SKP OPA, ISZ ANGCNT MC8B, JMS MCPUT JMP MC8 ANGCNT, 0 ER201, JMS I QQERROR CLO, STA TAD ANGCNT SNA JMP TE1X /TERMINATE ARGUMENT DCA ANGCNT JMP MC8B TE1X, JMS I QQGETCHR /A REAL SEPARATOR CHAR CAME: TERMINATE THIS ACTUAL ARGUMENT TE1, TAD (EOA) /END-OF-ARGUMENT CHAR JMS I (STORMS /STORE IT TO TERMINATE ARG JMS I (FINMS /STORE 0 IN LINKAGE WORD /STORE LAST CELL POINTER IN A.T. /NOTE: THIS IS DONE SO THAT THE ENTIRE ARGUMENT CAN BE DELETED FROM /MACRO SPACE IN ONE OPERATION (BY SUBROUTINE "DELETE"). TAD MS1 /CURRENT CELL CDF ATFLD DCA I AT2 /INTO A.T. CDF 0 ISZ AT2 ISZ NARGS ISZ AT3 /COUNT THE ARGUMENT. JMP MC1 /OKAY: READ NEXT ARGUMENT. /ENTIRE A.T. LEVEL IS FILLED - /THIS MEANS THAT MAXIMUM ARGS HAVE BEEN /STORED: IGNORE ANY REMAINING ARGS JMP TE3 /AND EXPAND THE MACRO.
/2.1.3 TERMINATE ARGUMENT STORAGE /TERMINATOR CAME OUTSIDE OF ARG STORAGE: ZERO REST OF THIS LEVEL OF A.T. TE2A, CDF ATFLD TE2, DCA I AT2 /STORE INTO A.T. ISZ AT2 DCA I AT2 /LAST CELL = 0 ISZ AT2 ISZ AT3 /COUNT THIS ENTRY INTO A.T. JMP TE2 /MORE SLOTS: ZERO THEM CDF 0 TE3, JMS I (TSTEND /DONE: TEST FOR LEGAL END-OF-LINE SYNTAX. JMS I (TE3A JMP I MC AT3, 0 /ARG STORAGE COUNTER NARGS, 0 /ACTUAL NUMBER OF ARGUMENTS MLASTLV,-LASTLV PAGE
/ T S T Q U O T E /IF CURRENT CHAR IS QUOTE ("), SKIP THE NEXT INSTRUCTION. TSTQUO, 0 TAD CHAR TAD (-"" SNA CLA ISZ TSTQUO JMP I TSTQUO $MEXIT, CDF 10 TAD I (STREAM CDF 0 TAD (-MGET SZA CLA ER202, JMS I QQERROR /CURRENT STREAM IS NOT 'MGET' TAD (MGT4 CDF 10 DCA I (MRET CDF 0 JMP I (PSEUDB
/2.2 EXPAND MACRO /2.2.1 PUSH A.T. TO NEXT LEVEL TE3A, 0 TAD AT4 /ADDR OF NEXT LEVEL DCA AT1 /2.2.2 SWITCH STREAM TO MGET /NOTE: MGET IS STREAM COROUTINE WHICH GETS CHARS FROM MACRO SPACE CIF 10 JMS I (SWITCH MGET /2.2.3 START MGET AT PRESENT MACRO BODY TAD I (NARGS CDF 10 DCA I (MARGS TAD 0 /SR PICK UP 15-BIT PTR TO START OF MACRO BODY /******** TEMPORARY DCA I (MG1 /SR STORE IT WHERE WE NEED IT DCA I (MLOW DCA I (MHIGH CDF 0 /2.2.4 END OF MACRO CALL JMP I TE3A /SR LEAVE MACRO CALL PROCESSOR
MC7, JMS I (LOAD AUXOVR+32 JMS I (BACKL /HANDLE BACKSLASH STORMS JMP I (TE1 PRCALL, 0 ISZ PCFLAG ISZ BNFLAG TAD I (LISTWD AND (100 SNA CLA JMS I QQOUT /PRINT MACRO CALL JMP I PRCALL PAGE



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search