--- /dev/null
+TITLE MACRO.V36\r
+SUBTTL RPG/CMF/JF/PMH/DMN 7-SEPT-71\r
+;COPYRIGHT 1968,1969,1970,1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.\r
+\r
+\r
+ LOC <JOBVER==137>\r
+ OCT 37\r
+ RELOC\r
+ MLON\r
+\r
+REPEAT 0,<\r
+ ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)\r
+\r
+ SWITCHES ON (NON-ZERO) IN DEC VERSION\r
+PURESW GIVES VARIABLES IN LOW SEGMENT\r
+CCLSW GIVES RAPID PROGRAM GENERATION FEATURE\r
+FTDISK GIVES DISK FEATURES\r
+RUNSW USE RUN UUO FOR "DEV:NAME!"\r
+TEMP TMPCOR UUO IS TO BE USED\r
+RENTSW ASSEMBLE REENTERANT PROGRAMS\r
+\r
+>\r
+\fSUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS\r
+\r
+IFNDEF PURESW,<PURESW==1>\r
+\r
+IFNDEF RUNSW,<RUNSW==1>\r
+\r
+IFNDEF RENTSW,<RENTSW==1>\r
+\r
+IFNDEF CCLSW,<CCLSW==1>\r
+IFN CCLSW,<FTDISK==1>\r
+\r
+IFNDEF TEMP,<TEMP==1>\r
+\r
+IFNDEF FTDISK,<FTDISK==0>\r
+\r
+\fSUBTTL OTHER PARAMETERS\r
+\r
+.PDP== ^D40 ;BASIC PUSH-DOWN POINTER\r
+IFNDEF LPTWID,<LPTWID==^D132> ;DEFAULT WIDTH OF PRINTER\r
+.LPTWD==8*<LPTWID/8> ;USEFUL WIDTH IN MAIN LISTING\r
+.CPL== .LPTWD-^D40 ;WIDTH AVAIABLE FOR TEXT WHEN\r
+ ;BINARY IS IN HALFWORD FORMAT\r
+.LPP==^D55 ;LINES/PAGE\r
+.STP== ^D40 ;STOW SIZE\r
+.TBUF== ^D80 ;TITLE BUFFER\r
+.SBUF== ^D80 ;SUB-TITLE BUFFER\r
+.IFBLK==^D5 ;IFIDN COMPARISON BLOCK SIZE\r
+.R1B==^D18\r
+.LEAF==4 ;SIZE OF BLOCKS IN MACRO TREE\r
+\r
+NCOLS==LPTWID/^D40 ;NUMBER OF COLUMNS IN SYMBOL TABLE\r
+IFN CCLSW,<IFNDEF CTLSIZ,<CTLSIZ==^D79>>\r
+IFNDEF NUMBUF,<NUMBUF==2 ;NUMBER OF INPUT BUFFERS>\r
+\r
+EXTERN JOBREL,JOBSYM,JOBDDT,JOBFF,JOBAPR,JOBSA\r
+IFN CCLSW,< EXTERN JOBERR>\r
+\r
+IFN PURESW,< HISEG >\r
+\r
+;SOME ASCII CHARACTERS\r
+\r
+HT==11\r
+LF==12\r
+VT==13\r
+FF==14\r
+CR==15\r
+EOL==33\r
+\f ;ACCUMULATORS\r
+AC0== 0\r
+AC1= AC0+1\r
+AC2= AC1+1\r
+SDEL= 3 ;SEARCH INCREMENT\r
+SX= SDEL+1 ;SEARCH INDEX\r
+ARG= 5 ;ARGUMENT\r
+V= 6 ;VALUE\r
+C= 7 ;CURRENT CHARACTER\r
+CS= C+1 ;CHARACTER STATUS BITS\r
+RC= 11 ;RELOCATION BITS\r
+MWP= 12 ;MACRO WRITE POINTER\r
+MRP= 13 ;MACRO READ POINTER\r
+IO= 14 ;IO REGISTER (LEFT)\r
+ER== IO ;ERROR REGISTER (RIGHT)\r
+FR= 15 ;FLAG REGISTER (LEFT)\r
+RX== FR ;CURRENT RADIX (RIGHT)\r
+MP= 16 ;MACRO PUSHDOWN POINTER\r
+PP= 17 ;BASIC PUSHDOWN POINTER\r
+\r
+%OP== 3\r
+%MAC== 5\r
+%DSYM== 2\r
+%SYM== 1\r
+%DMAC== %MAC+1\r
+\r
+OPDEF RESET [CALLI 0]\r
+OPDEF SETDDT [CALLI 2]\r
+OPDEF DDTOUT [CALLI 3]\r
+OPDEF DEVCHR [CALLI 4]\r
+OPDEF CORE [CALLI 11]\r
+OPDEF EXIT [CALLI 12]\r
+OPDEF UTPCLR [CALLI 13]\r
+OPDEF DATE [CALLI 14]\r
+OPDEF APRENB [CALLI 16]\r
+OPDEF MSTIME [CALLI 23]\r
+OPDEF PJOB [CALLI 30]\r
+OPDEF RUN [CALLI 35]\r
+OPDEF TMPCOR [CALLI 44]\r
+OPDEF MTWAT. [MTAPE 0]\r
+OPDEF MTREW. [MTAPE 1]\r
+OPDEF MTEOT. [MTAPE 10]\r
+OPDEF MTSKF. [MTAPE 16]\r
+OPDEF MTBSF. [MTAPE 17]\r
+\r
+\f ;FR FLAG REGISTER (FR/RX)\r
+IOSCR== 000001 ;NO CR AFTER LINE\r
+MTAPSW==000004 ;MAG TAPE\r
+ERRQSW==000010 ;IGNORE Q ERRORS\r
+LOADSW==000020 ;END OF PASS1 & NO EOF YET\r
+DCFSW== 000040 ;DECIMAL FRACTION\r
+RIM1SW==000100 ;RIM10 MODE\r
+NEGSW== 000200 ;NEGATIVE ATOM\r
+RIMSW== 000400 ;RIM OUTPUT\r
+PNCHSW==001000 ;RIM/BIN OUTPUT WANTED\r
+CREFSW==002000\r
+R1BSW== 004000 ;RIM10 BINARY OUTPUT\r
+TMPSW== 010000 ;EVALUATE CURRENT ATOM\r
+INDSW== 020000 ;INDIRECT ADDRESSING WANTED\r
+RADXSW==040000 ;RADIX ERROR SWITCH\r
+FSNSW== 100000 ;NON BLANK FIELD SEEN\r
+MWLFLG==200000 ;ON FOR DON'T ALLOW MULTI-WORD LITERALS\r
+P1== 400000 ;PASS1\r
+\r
+ ;IO FLAG REGISTER (IO/ER)\r
+FLDSW== 400000 ;ADDRESS FIELD\r
+IOMSTR==200000\r
+ARPGSW==100000 ;ALLOW RAPID PROGRAM GENERATION\r
+IOPROG==040000 ;SUPRESS LISTING (LIST/XLIST PSEUDO OP)\r
+NUMSW== 020000\r
+IOMAC== 010000 ;MACRO EXPANSION IN PROGRESS\r
+IOPALL==004000 ;SUPRESS LISTING OF MACRO EXPANSIONS\r
+IONCRF==002000 ;SUPRESS OUTPUT OF CREF INFORMATION\r
+CRPGSW==001000 ;CURRENTLY IN PROGRESS ON RPG\r
+IOCREF==000400 ;WE ARE NOW OUTPUTTING CREF INFO\r
+IOENDL==000200 ;BEEN TO STOUT\r
+IOPAGE==000100\r
+DEFCRS==000040 ;THIS IS A DEFINING OCCURANCE (MACROS)\r
+IOIOPF==000020 ;IOP INSTRUCTION SEEN\r
+MFLSW== 000010 ;MULTI-FILE MODE,PRGEND SEEN\r
+IORPTC==000004 ;REPEAT CURRENT CHARACTER\r
+IOTLSN==000002 ;TITLE SEEN\r
+IOSALL==000001 ;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED\r
+\r
+OPDEF JUMP1 [JUMPL FR, ] ;JUMP IF PASS 1\r
+OPDEF JUMP2 [JUMPGE FR, ] ;JUMP IF PASS 2\r
+\r
+OPDEF JUMPOC [JUMPGE IO, ] ;JUMP IF IN OP-CODE FIELD\r
+OPDEF JUMPAD [JUMPL IO, ] ;JUMP IF IN ADDRESS FIELD\r
+\r
+OPDEF JUMPCM [JUMPL CS, ] ;JUMP IF CURRENT CHAR IS COMMA\r
+OPDEF JUMPNC [JUMPGE CS, ] ;JUMP IF CURRENT CHAR IS NON-COMMA\r
+\r
+\f ;ER ERROR REGISTERS (IO/ER)\r
+ERRM== 000020 ;MULTIPLY DEFINED SYMBOL\r
+ERRE== 000040 ;ILLEGAL USE OF EXTERNAL\r
+ERRP== 000100 ;PHASE DISCREPANCY\r
+ERRO== 000200 ;UNDEFINED OP CODE\r
+ERRN== 000400 ;NUMBER ERROR\r
+ERRV== 001000 ;VALUE PREVIOUSLY UNDEFINED\r
+ERRU== 002000 ;UNDEFINED SYMBOL\r
+ERRR== 004000 ;RELOCATION ERROR\r
+ERRL== 010000 ;LITERAL ERROR\r
+ERRD== 020000 ;REFERENCE TO MULTIPLY DEFINED SYMBOL\r
+ERRA== 040000 ;PECULIAR ARGUMENT\r
+ERRX== 100000 ;MACRO DEFINITION ERROR\r
+ERRQ== 200000 ;QUESTIONABLE, NON-FATAL ERROR\r
+ERRORS==777760\r
+LPTSW== 000002\r
+TTYSW== 000001\r
+\r
+ ;SYMBOL TABLE FLAGS\r
+SYMF== 400000 ;SYMBOL\r
+TAGF== 200000 ;TAG\r
+NOOUTF==100000 ;NO DDT OUTPUT WFW\r
+SYNF== 040000 ;SYNONYM\r
+MACF== SYNF_-1 ;MACRO\r
+OPDF== SYNF_-2 ;OPDEF\r
+PNTF== 004000 ;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE\r
+UNDF== 002000 ;UNDEFINED\r
+EXTF== 001000 ;EXTERNAL\r
+INTF== 000400 ;INTERNAL\r
+ENTF== 000200 ;ENTRY\r
+VARF== 000100 ;VARIABLE\r
+MDFF== 000020 ;MULTIPLY DEFINED\r
+SPTR== 000010 ;SPECIAL EXTERNAL POINTER\r
+SUPRBT==000004 ;SUPRESS OUTPUT TO DDT\r
+LELF== 000002 ;LEFT HAND RELOCATABLE\r
+RELF== 000001 ;RIGHT HAND RELOCATABLE\r
+\r
+LITF== 200000 ;FLAG FOR PSEUDO-OPS INVALID IN LIT'S\r
+ADDF== 100000 ;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES\r
+\r
+TNODE== 200000 ;TERMINAL NODE FOR EVALEX\r
+\f\r
+;USEFUL MACROS\r
+\r
+DEFINE FORERR(AC,ABC)<\r
+ MOVE AC,SEQNO2\r
+ MOVEM AC,ABC'SEQ\r
+ MOVE AC,PAGENO\r
+ MOVEM AC,ABC'PG\r
+>\r
+\r
+\f\r
+IFN CCLSW,< ;ASSEMBLE IF RUN UUO IMPLEMENTED\r
+NUNSET: SKIPN ACDEV\r
+ MOVSI ACDEV,(SIXBIT /SYS/) ;USE SYS IF NONE SPECIFIED\r
+IFN RUNSW,<\r
+ MOVEM ACDEV,RUNDEV\r
+ MOVEM ACFILE,RUNFIL ;STORE FILE NAME\r
+ PUSHJ PP,DELETE ;COMMAND FILE\r
+ SETZM RUNPP\r
+ MOVEI 16,RUNDEV ;XWD 0,RUNDEV\r
+ TLNE IO,CRPGSW ;WAS RPG IN PROGRESS?\r
+ HRLI 16,1 ;YES START NEXT AT C(JOBSA)+1\r
+ RUN 16, ;DO "RUN DEV:NAME"\r
+ HALT ;SHOULD'T RETURN. HALT IF IT DOES\r
+>\r
+IFE RUNSW,<POPJ PP, >\r
+\r
+DELETE: HRRZ EXTMP ;IF THE EXTENSION\r
+ CAIE (SIXBIT /TMP/) ;IS .TMP\r
+ POPJ PP, ;RETURN\r
+ CLOSE CTL2, ;DELETE\r
+ SETZB 4,5 ;THE COMMAND FILE.\r
+ SETZB 6,7\r
+ RENAME CTL2,4 ;\r
+ JFCL\r
+ POPJ PP,\r
+>\r
+\fSUBTTL START ASSEMBLING\r
+\r
+ASSEMB: PUSHJ PP,INZ ;INITIALIZE FOR PASS\r
+ MOVE [ASCII /.MAIN/]\r
+ MOVEM TBUF\r
+ MOVEI SBUF\r
+ HRRM SUBTTX\r
+\r
+ASSEM1: PUSHJ PP,CHARAC ;TEST FOR FORM FEED\r
+ CAIN C,14\r
+ SKIPE SEQNO\r
+ JRST ASSEM2\r
+ PUSHJ PP,OUTFF\r
+ PUSHJ PP,OUTLI\r
+ JRST ASSEM1\r
+\r
+ASSEM2: AOS TAGINC\r
+ CAIN C,15\r
+ JRST ASSEM3\r
+ CAIN C,"\" ;BACK-SLASH?\r
+ TLZA IO,IOMAC ;YES, LIST IF IN MACRO\r
+ TLO IO,IORPTC\r
+ PUSHJ PP,STMNT ;OFF WE GO\r
+ TLZN IO,IOENDL ;WAS STOUT PRE-EMPTED?\r
+ PUSHJ PP,STOUT\r
+ JRST ASSEM1\r
+ASSEM3: PUSHJ PP,STOUT+1\r
+ JRST ASSEM1\r
+\r
+\fSUBTTL STATEMENT PROCESSOR\r
+\r
+STMNT: TLZ FR,INDSW\r
+ TLZA IO,FLDSW\r
+STMNT1: PUSHJ PP,LABEL\r
+STMNT2: PUSHJ PP,ATOM ;GET THE FIRST ATOM\r
+ CAIN C,35 ;"="?\r
+ JRST ASSIGN ;YES\r
+ CAIN C,32 ;":"?\r
+ JRST STMNT1 ;YES\r
+ JUMPAD STMNT7 ;NUMERIC EXPRESSION\r
+ SKIPE C\r
+ TLO IO,IORPTC\r
+ SKIPN AC2,AC0\r
+ POPJ PP,\r
+ PUSHJ PP,MSRCH ;SEARCH FOR MACRO/OPDEF/SYN\r
+ JRST STMNT3 ;NOT FOUND, TRY OP CODE\r
+ LDB SDEL,[POINT 3,ARG,5]\r
+ JUMPE SDEL,ERRAX ;ERROR IF NO FLAG\r
+ SOJE SDEL,OPD1 ;OPDEF IF 1\r
+ SOJE SDEL,CALLM ;MACRO IF 2\r
+ JRST STMNT4 ;SYNONYM, PROCESS WITH OP-CODES\r
+\r
+STMNT3: PUSHJ PP,OPTSCH ;SEARCH OP CODE TABLE\r
+ JRST STMNT5 ;NOT FOUND\r
+STMNT4: HLLZ AC0,V ;PUT CODE IN AC0\r
+ TRZE V,LITF ;VALID IN LITERAL?\r
+ SKIPN LITLVL ;NO, ARE WE IN A LITERAL?\r
+ JRST 0(V) ;NO, GO TO APPRORIATE PROCESSOR\r
+ MOVE AC0,AC2\r
+\r
+STMNT5: PUSHJ PP,SSRCH ;TRY SYMBOLS\r
+ JRST STMNT8 ;NOT FOUND\r
+ TLNE ARG,EXTF!UNDF ;EXTERNAL OR UNDEFINED?\r
+ JRST STMNT7 ;YES, PROCESS IN EVALEX\r
+ TLNN RC,-2 ;CHECK FOR EXTERNAL\r
+ TRNE RC,-2\r
+ JRST STMNT7\r
+ MOVE AC0,V ;FOUND, PUT VALUE IN AC0\r
+ TLO IO,NUMSW ;FLAG AS NUMERIC\r
+STMNT7: TLZ IO,IORPTC\r
+ PUSHJ PP,EVALHA ;EVALUATE EXPRESSION\r
+ JRST STOW ;YES,STOW THE CODE AND EXIT\r
+\r
+\fSTMNT8: SETZB AC0,RC ;CLEAR VALUE AND RELOCATION\r
+ TRO ER,ERRO ;FLAG AS UNDEIFNED OP-CODE\r
+ JRST OPD\r
+\r
+ ;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT)\r
+ ;UNTIL A LINE TERMINATOR IS SEEN.\r
+STOUTS: TLO IO,IOENDL\r
+STOUT: TLO IO,IORPTC\r
+ PUSHJ PP,BYPAS1\r
+ CAIN C,14 ;COMMA?\r
+ SKIPL STPX ;YES, ERROR IF CODE STORED\r
+ CAIN C,33\r
+ TLOA IO,IORPTC\r
+ TRO ER,ERRQ\r
+STOUT1: PUSHJ PP,CHARAC\r
+ CAIGE C,CR\r
+ CAIG C,HT\r
+ JRST STOUT1\r
+ JRST OUTLIN\r
+\f SUBTTL LABEL PROCESSOR\r
+\r
+LABEL: JUMPAD LABEL4 ;COMPARE IF NON-SYMBOLIC\r
+ JUMPE AC0,LABEL5 ;ERROR IF BLANK\r
+ MOVEM AC0,TAG\r
+ HLLZS AC0,TAGINC\r
+ TLO IO,DEFCRS ;THIS IS A DEFINITION\r
+ PUSHJ PP,SSRCH ;SEARCH FOR OPERAND\r
+ MOVSI ARG,SYMF!UNDF!TAGF ;NOT FOUND\r
+ TLNE ARG,EXTF ;UNDEFINED ON PASS1\r
+ JRST LABEL3 ;NO, FLAG ERROR\r
+ TLZN ARG,UNDF!VARF\r
+ JRST LABEL2 ;YES, CHECK EQUALITY\r
+LABEL1: MOVE V,LOCA ;WFW\r
+ MOVE RC,MODA\r
+ TLO ARG,TAGF\r
+ JRST INSERT ;INSERT/UPDATE AND EXIT\r
+\r
+LABEL2: HRLOM V,LOCBLK ;SAVE LIST LOCATION\r
+ TLNE ARG,40\r
+ JRST LABEL6\r
+LABEL0: CAMN V,LOCA ;DOES IT COMPARE WITH PREVIOUS? WFW\r
+ CAME RC,MODA\r
+LABEL3: TLOA ARG,MDFF ;NO, FLAG MULTIPLY DEFINED AND SKIP\r
+ POPJ PP,\r
+ TRO ER,ERRM ;FLAG MULTIPLY DEFINED ERROR\r
+ JRST UPDATE ;UPDATE AND EXIT\r
+\r
+LABEL4: CAMN AC0,LOCA ;DO THEY COMPARE?\r
+ CAME RC,MODA\r
+LABEL5: TRO ER,IOPAGE ;NO, FLAG PHASE ERROR\r
+ POPJ PP,\r
+\r
+LABEL6: JUMP1 LABEL1\r
+ TRO ER,IOMSTR\r
+ TLZ ARG,40\r
+ PUSHJ PP,UPDATE\r
+ JRST LABEL0\r
+\fSUBTTL ATOM PROCESOR\r
+ATOM: PUSHJ PP,CELL ;GET FIRST CELL\r
+ TLNE IO,NUMSW ;IF NON-NUMERIC\r
+ATOM1: CAIE C,42 ;OR NOT A BINARY SHIFT,\r
+ POPJ PP, ;EXIT\r
+\r
+ PUSH PP,AC0 ;STACK REGISTERS, ITS A BINARY SHIFT\r
+ PUSH PP,AC1\r
+ PUSH PP,RC\r
+ PUSH PP,RX\r
+ HRRI RX,^D10 ;COMPUTE SHIFT RADIX 10\r
+ PUSHJ PP,CELLSF ;GET SHIFT\r
+ MOVE ARG,RC ;SAVE RELOCATION\r
+ POP PP,RX ;RESTORE REGISTERS\r
+ POP PP,RC\r
+ POP PP,AC1\r
+ MOVN SX,AC0 ;USE NEGATIVE OF SHIFT\r
+ POP PP,AC0\r
+ SKIPN 0,5\r
+ TLNN IO,NUMSW ;AND NUMERIC,\r
+ JRST NUMER2\r
+ LSHC AC0,^D35(SX)\r
+ LSH RC,^D35(SX)\r
+ JRST ATOM1\r
+\fCELLSF: TLO IO,FLDSW\r
+CELL: SETZB AC0,RC ;CLEAR RESULT AND RELOCATION\r
+ SETZB AC1,AC2 ;CLEAR WORK REGISTERS\r
+ MOVEM PP,PPTEMP ;SAVE PUSHDOWN POINTER\r
+ TLZ IO,NUMSW\r
+ TLZA FR,NEGSW!DCFSW!RADXSW\r
+\r
+CELL1: TLO IO,FLDSW\r
+ PUSHJ PP,BYPAS1\r
+ LDB V,[POINT 4,CSTAT(C),14] ;GET CODE\r
+ XCT .+1(V) ;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE\r
+ JRST CELL1 ;0; BLANK, (TAB OR "+")\r
+ JRST LETTER ;1; LETTER ] $ % ( ) , ; >\r
+ TLC FR,NEGSW ;2; "-"\r
+ TLO FR,INDSW ;3; "@"\r
+ JRST NUM1 ;4; NUMERIC 0 - 9\r
+ JRST ANGLB ;5; "<"\r
+ JRST SQBRK ;6; "["\r
+ JRST QUOTES ;7; """, "'"\r
+ JRST QUAL ;10; "^"\r
+ JRST PERIOD ;11; "."\r
+ TROA ER,ERRQ ;12; ERROR, FLAG AND TREAT AS DELIMITER\r
+ ;12; ! # & * / : = ? \ _\r
+\fLETTER: TLOA AC2,(POINT 6,AC0,) ;SET BYTE POINTER\r
+LETTE1: PUSHJ PP,GETCHR ;GET CHARACTER\r
+ TLNN CS,6 ;ALPHA-NUMERIC\r
+ JRST LETTE3 ;NO,TEST FOR VARIABLE\r
+ TLNE AC2,770000 ;STORE ONLY SIX BYTES\r
+LETTE2: IDPB C,AC2 ;RETURN FROM PERIOD\r
+ JRST LETTE1\r
+\r
+LETTE3: CAIE C,03 ;"#"?\r
+ POPJ PP,\r
+ JUMPE AC0,POPOUT ;TEST FOR NULL\r
+ TLO IO,DEFCRS\r
+ PUSHJ PP,SSRCH ;YES, SEARCH FOR SYMBOL (OPERAND)\r
+ MOVSI ARG,SYMF!UNDF ;NOT FOUND, FLAGAS UNDEFINED SYM.\r
+ TLNN ARG,UNDF ;UNDEFINED?\r
+ JRST GETCHR ;NO, GET NEXT CHAR AND RETURN\r
+ TLO ARG,VARF ;YES, FLAG AS A VARIABLE\r
+ TRO ER,ERRU ;SET UNDEFINED ERROR FLAG\r
+ PUSHJ PP,INSERZ ;INSERT IT WITH A ZERO VALUE\r
+ JRST GETDEL\r
+\r
+LETTE4: PUSHJ PP,GETCHR ;AND SCAN PAST IT\r
+\r
+NUMER1: SETZB AC0,RC ;RETURN ZERO\r
+NUMER2: TRO ER,ERRN ;FLAG ERROR\r
+\r
+GETDEL: PUSHJ PP,BYPAS1\r
+GETDE1: JUMPE C,.-1\r
+ MOVEI AC1,0\r
+GETDE3: TLO IO,NUMSW!FLDSW ;FLAG NUMERIC\r
+ TLNN FR,NEGSW ;IS ATOM NEGATIVE?\r
+ POPJ PP, ;NO, EXIT\r
+ JUMPE AC1,GETDE2\r
+ MOVNS AC0,1\r
+ TDCA AC0,[-1]\r
+GETDE2: MOVNS AC0 ;YES, NEGATE VALUE\r
+ MOVNS RC ;AND RELOCATION\r
+POPOUT: POPJ PP, ;EXIT\r
+\fQUOTE0: ASH AC0,7\r
+ IOR AC0,C\r
+QUOTES: PUSHJ PP,CHARAC\r
+ CAIN C,CR\r
+ JRST QUOTE2\r
+ CAIE C,42\r
+ JRST QUOTE0\r
+ PUSHJ PP,CHARAC ;LOOK AT NEXT CHAR.\r
+ CAIN C,42\r
+ JRST QUOTE0\r
+QUOTE2: TLO IO,IORPTC\r
+ JRST GETDEL\r
+\fQUAL: PUSHJ PP,BYPAS1 ;SKIP BLANKS, GET NEXT CHARACTER\r
+ CAIN C,42 ;"B"?\r
+ JRST QUAL2 ;YES, RADIX=D2\r
+ CAIN C,57 ;"O"?\r
+ JRST QUAL8 ;YES, RADIX=D8\r
+ CAIN C,46 ;"F"?\r
+ JRST NUMDF ;YES, PROCESS DECIMAL FRACTION\r
+ CAIN C,54 ;"L"?\r
+ JRST QUALL ;YES\r
+ CAIE C,44 ;"D"?\r
+ JRST NUMER1 ;NO, FLAG NUMERIC ERROR\r
+ ADDI AC2,2\r
+QUAL8: ADDI AC2,6\r
+QUAL2: ADDI AC2,2\r
+ PUSH PP,RX\r
+ HRR RX,AC2\r
+ PUSHJ PP,CELLSF\r
+QUAL2A: POP PP,RX\r
+ TLNN IO,NUMSW\r
+ JRST NUMER1\r
+ JRST GETDE1\r
+\r
+QUALL: PUSH PP,RX\r
+ PUSHJ PP,CELLSF\r
+ MOVE AC2,AC0\r
+ MOVEI AC0,^D36\r
+ JUMPE AC2,QUAL2A\r
+ LSH AC2,-1\r
+ SOJA AC0,.-2\r
+\fSUBTTL NUMBER PROCESSOR\r
+\r
+ANGLB: PUSH PP,FR\r
+ TLZ FR,INDSW\r
+ PUSHJ PP,ATOM\r
+ TLNN IO,NUMSW\r
+ CAIE C,35\r
+ JRST ANGLB1\r
+ PUSHJ PP,ASSIG1\r
+ MOVE AC0,V\r
+ JRST ANGLB2\r
+\r
+ANGLB1: PUSHJ PP,EVALHA\r
+ANGLB2: POP PP,FR\r
+ CAIE C,36\r
+ TRO ER,ERRN\r
+ JRST GETDEL\r
+\fSUBTTL LITERAL PROCESSOR\r
+\r
+SQBRK: PUSH PP,FR\r
+ PUSH PP,EXTPNT ;ALLOW EXTERN TO PRECEDE LIT IN XWD\r
+ SETZM EXTPNT\r
+ SKIPE LITLVL ;SAVE SEQNO AND PAGE IF NOT IN LIT ALREADY\r
+ JRST SQB5\r
+ FORERR (C,LIT)\r
+SQB5: JSP AC2,SVSTOW\r
+SQB3: PUSHJ PP,STMNT\r
+ TLNE FR,MWLFLG ;CALL IT ] IF NOT MULTI-WORD FLAG\r
+ CAIN C,75 ;CHECK FOR ]\r
+ JRST SQB1\r
+ TLO IO,IORPTC\r
+ PUSHJ PP,BYPAS1\r
+ CAIN C,33 ;COMMENT?\r
+ TLOA IO,IORPTC\r
+ TRO ER,ERRQ\r
+SQB4: PUSHJ PP,CHARAC\r
+ CAIGE C,CR ;LOOK FOR END OF LINE\r
+ CAIN C,HT\r
+ JRST SQB4\r
+ PUSHJ PP,OUTIML ;DUMP\r
+ JRST SQB3\r
+SQB1: TLZ IO,IORPTC\r
+ PUSHJ PP,STOLIT\r
+ JSP AC2,GTSTOW\r
+ POP PP,EXTPNT\r
+ POP PP,FR\r
+ SKIPE LITLVL ;WERE WE NESTED?\r
+ JUMP1 NUMER2 ;YES, FORCE ERROR IF PASS 1\r
+ JRST GETDEL\r
+\r
+PERIOD: PUSHJ PP,GETCHR ;LOOK AT NEXT CHARACTER\r
+ TLNN CS,2 ;ALPHABETIC?\r
+ JRST PERNUM ;NO, TEST NUMERIC\r
+ MOVSI AC0,(SIXBIT /./) ;YES, PUT PERIOD IN AC0\r
+ MOVSI AC2,(POINT 6,AC0,5) ;SET BYTE POINTER\r
+ JRST LETTE2 ;AND TREAT AS SYMBOL\r
+\r
+PERNUM: TLNE CS,4 ;IS IT A NUMBER\r
+ JRST NUM32 ;YES\r
+ MOVE AC0,LOCA ;NO. CURRENT LOC SYMBOL (.)\r
+ MOVE RC,MODA ;SET TO CURRENT ASSEMBLY MODE\r
+ JRST GETDE1 ;GET DELIMITER\r
+NUMDF: TLO FR,DCFSW ;SET DECIMAL FRACTION FLAG\r
+NUM: PUSHJ PP,GETCHR ;GET A CHARACTER\r
+ TLNN CS,4 ;NUMERIC?\r
+ JRST NUM10 ;NO\r
+NUM1: SUBI C,20 ;CONVERT TO OCTAL\r
+ PUSH PP,C ;STACK FOR FLOATING POINT\r
+ MOVE AC0,AC1\r
+ MULI AC0,0(RX)\r
+ ADD AC1,C ;ADD IN LAST VALUE\r
+ CAIL C,0(RX) ;IS NUMBER LESS THAN CURRENT RADIX?\r
+ TLO FR,RADXSW ;NO, SET FLAG\r
+ AOJA AC2,NUM ;YES, AC2=NO. OF DECIMAL PLACES\r
+\r
+\fNUM10: CAIE C,16 ;PERIOD?\r
+ TLNE FR,DCFSW ;OR DECIMAL FRACTION?\r
+ JRST NUM31 ;YES, PROCESS FLOATING POINT\r
+ LSH AC1,1 ;NO, CLEAR THE SIGN BIT\r
+ LSHC AC0,^D35 ;AND SHIFT INTO AC0\r
+ MOVE PP,PPTEMP ;RESTORE PP\r
+ SOJE AC2,GETDE1 ;NO RADIX ERROR TEST IF ONE DIGIT\r
+ TLNE FR,RADXSW ;WAS ILLEGAL NUMBER ENCOUNTERED?\r
+ TRO ER,ERRN ;YES, FLAG N ERROR\r
+ JRST GETDE1\r
+\r
+NUM31: PUSHJ PP,GETCHR\r
+ TLNN CS,4 ;NUMERIC?\r
+ JRST NUM40 ;NO\r
+NUM32: SUBI C,20\r
+ PUSH PP,C\r
+ JRST NUM31\r
+\r
+NUM40: PUSH PP,FR ;STACK VALUES\r
+ HRRI RX,^D10\r
+ PUSH PP,AC2\r
+ PUSH PP,PPTEMP\r
+ CAIE C,45 ;"E"?\r
+ TDZA AC0,AC0\r
+ PUSHJ PP,CELL\r
+ POP PP,PPTEMP\r
+ POP PP,SX\r
+ POP PP,FR\r
+ HRRZ V,PP\r
+ MOVE PP,PPTEMP\r
+ JUMPN RC,NUMER1 ;EXPONENT MUST BE ABSOLUTE\r
+ ADD SX,AC0\r
+ HRRZ ARG,PP\r
+ ADD SX,ARG\r
+ SETZB AC0,AC2\r
+ TLNE FR,DCFSW\r
+ JRST NUM60\r
+ JOV NUM50 ;CLEAR OVERFLOW FLAG\r
+\f\r
+NUM50: JSP SDEL,NUMUP ;FLOATING POINT\r
+ JRST NUM52 ;END OF WHOLE NUMBERS\r
+ FMPR AC0,[10.0] ;MULTIPLY BY 10\r
+ TLO AC1,233000 ;CONVERT TO FLOATING POINT\r
+ FADR AC0,AC1 ;ADD IT IN\r
+ JRST NUM50\r
+\r
+NUM52: JSP SDEL,NUMDN ;PROCESS FRACTION\r
+ FADR AC0,AC2\r
+ JOV NUMER1 ;TEST FOR OVERFLOW\r
+ JRST GETDE1\r
+ TLO AC1,233000\r
+ TRNE AC1,-1\r
+ FADR AC2,AC1 ;ACCUMULATE FRACTION\r
+ FDVR AC2,[10.0]\r
+ JRST NUM52\r
+\r
+NUM60: JSP SDEL,NUMUP\r
+ JRST NUM62\r
+ IMULI AC0,^D10\r
+ ADD AC0,AC1\r
+ JRST NUM60\r
+\r
+NUM62: LSHC AC1,-^D36\r
+ JSP SDEL,NUMDN\r
+ LSHC AC1,^D37\r
+ PUSHJ PP,BYPAS2\r
+ JRST GETDE3\r
+ DIVI AC1,^D10\r
+ JRST NUM62\r
+\r
+NUMUP: MOVEI AC1,0\r
+ CAML ARG,SX\r
+ JRST 0(SDEL)\r
+ CAMGE ARG,V\r
+ MOVE AC1,1(ARG)\r
+ AOJA ARG,1(SDEL)\r
+\r
+NUMDN: MOVEI AC1,0\r
+ CAMG V,SX\r
+ JRST 0(SDEL)\r
+ CAMLE V,ARG\r
+ MOVE AC1,0(V)\r
+ SOJA V,3(SDEL)\r
+\fSUBTTL GETSYM\r
+GETSYM: MOVEI AC0,0 ;CLEAR AC0\r
+ MOVSI AC1,(POINT 6,AC0) ;PUT POINTER IN AC1\r
+ PUSHJ PP,BYPAS1 ;SKIP LEADING BLANKS\r
+ TLNN CS,2 ;ALPHABETIC?\r
+ JRST GETSY1 ;NO, ERROR\r
+ CAIE C,16 ;PERIOD?\r
+ JRST GETSY2 ;NO, A VALID SYMBOL\r
+ IDPB C,AC1 ;STORE THE CHARACTER\r
+ PUSHJ PP,GETCHR ;YES, TEST NEXT CHARACTER\r
+ TLNN CS,2 ;ALPHABETIC?\r
+GETSY1: TROA ER,ERRA\r
+GETSY2: AOS 0(PP) ;YES, SET SKIP EXIT\r
+GETSY3: TLNN CS,6 ;ALPHA-NUMERIC?\r
+ JRST BYPAS2 ;NO, GET DELIMITER\r
+ TLNE AC1,770000 ;YES, HAVE WE STORED SIX?\r
+ IDPB C,AC1 ;NO, STORE IT\r
+ PUSHJ PP,GETCHR\r
+ JRST GETSY3\r
+BYPAS1: PUSHJ PP,GETCHR\r
+BYPAS2: JUMPE C,.-1\r
+ POPJ PP,\r
+\fSUBTTL EXPRESSION EVALUATOR\r
+CV== AC0 ;CURRENT VALUE\r
+PV== AC1 ;PREVIOUS VALUE\r
+RC== RC ;CURRENT RELOCATABILITY\r
+PR== AC2 ;PREVIOUS RELOCATABILITY\r
+CS= CS ;CURRENT STATUS\r
+PS== SDEL ;PREVIOUS STATUS\r
+\r
+EVALHA: TLO FR,TMPSW\r
+EVALEX: TLO IO,FLDSW \r
+ PUSH PP,[XWD TNODE,0] ;MARK THE LIST 200000,,0\r
+ TLZN FR,TMPSW\r
+EVATOM: PUSHJ PP,ATOM ;GET THE NEXT ATOM\r
+ JUMPE AC0,EVGETD ;TEST FOR NULL/ZERO\r
+ TLOE IO,NUMSW ;SET NUMERIC, WAS IT PREVIOUSLY?\r
+ JRST EVGETD ;YES, TREAT ACCORDINGLY\r
+ PUSHJ PP,SEARCH ;SEARCH FOR MACRO OR SYMBOL\r
+ JRST EVOP ;NOT FOUND, TRY FOR OP-CODE\r
+ SKIPL ARG ;SKIP IF OPERAND\r
+ PUSHJ PP,SSRCH1 ;OPERATOR, TRY FOR SYMBOL (OPERAND)\r
+ PUSHJ PP,QSRCH ;PERFORM CROSS-REFERENCE\r
+ JUMPG ARG,EVMAC ;BRANCH IF OPERATOR\r
+ MOVE AC0,V ;SYMBOL, SET VALUE\r
+ JRST EVTSTS ;TEST STATUS\r
+\r
+EVMAC: TLNE FR,NEGSW ;UNARY MINUS?\r
+ JRST EVERRZ ;YES, INVALID BEFORE OPERATOR\r
+ LDB SDEL,[POINT 3,ARG,5] ;GET MACF/OPDF/SYNF\r
+ SOJL SDEL,EVERRZ ;ERROR IF NO FLAGS\r
+\r
+ SKIPE C ;NON-BLANK?\r
+ TLO IO,IORPTC ;YES, REPEAT CHARACTER\r
+ SOJE SDEL,CALLM ;MACRO IF 2\r
+ JUMPG SDEL,EVOPS ;SYNONYM IF 4\r
+\r
+ MOVE AC0,V ;OPDEF\r
+ MOVEI V,OPD ;SET TRANSFER VECTOR\r
+ JRST EVOPD\r
+\fEVOP: TLNE FR,NEGSW ;OPCODE, UNARY MINUS?\r
+ JRST EVERRZ ;YES, ERROR\r
+\r
+ PUSHJ PP,OPTSCH ;SEARCH SYMBOL TABLE\r
+ JRST EVOPX ;NOT FOUND\r
+EVOPS: TRZE V,LITF ;CLEAR LIT INVALID FLAG\r
+ JRST EVOPX ;PSEUDO-OP THAT GENERATES NO DATA JUMPS\r
+ HLLZ AC0,V\r
+EVOPD: SKIPE C ;OPDEF, NON-BLANK DELIMITER?\r
+ TLO IO,IORPTC ;YES, REPEAT CHARACTER\r
+ JSP AC2,SVSTOW\r
+ PUSHJ PP,0(V)\r
+ PUSHJ PP,DSTOW\r
+ JSP AC2,GTSTOW\r
+ TRNE RC,-2\r
+ HRRM RC,EXTPNT\r
+ TLNE RC,-2\r
+ HLLM RC,EXTPNT\r
+ JRST EVNUM\r
+\r
+EVOPX: MOVSI ARG,SYMF!UNDF\r
+ PUSHJ PP,INSERZ\r
+EVERRZ: SETZB AC0,RC ;CLEAR CODE AND RELOCATION\r
+EVERRU: TRO ER,ERRU\r
+ JRST EVGETD\r
+\fEVTSTS: TLNE ARG,UNDF\r
+ JRST EVERRU\r
+ TLNN ARG,EXTF\r
+ JRST EVTSTR\r
+ HRRZ RC,ARG ;GET ADRES WFW\r
+ HRRZ ARG,EXTPNT ;SAVE IT WDW\r
+ HRRM RC,EXTPNT ;WFW\r
+ TRNE ARG,-1 ;WFW\r
+ TRO ER,ERRE\r
+ SETZB AC0,ARG\r
+\r
+EVTSTR: TLNE ARG,MDFF ;MULTIPLY DEFINED?\r
+ TRO ER,ERRD ;YES, FLAG IT\r
+ TLNE FR,NEGSW ;NEGATIVE ATOM?\r
+ PUSHJ PP,GETDE2 ;YES, NEGATIVE AC0 AND RC\r
+\r
+EVGETD: PUSHJ PP,BYPAS2 \r
+ TLNE CS,6 ;NON BLANK FIELD\r
+ TLO IO,IORPTC ;YES,SET FLAG\r
+EVNUM: POP PP,SDEL ;POP THE PREVIOUS DELIMITER/TNODE\r
+ TLO PS,4000\r
+ CAMGE PS,CS ;OPERATION REQUIRED?\r
+ JRST EVPUSH ;NO, PUT VALUES BACK ON STACK\r
+ TLNN PS,TNODE ;YES, HAVE WE REACHED TERMINAL NODE?\r
+ JRST EVXCT ;NO, EXECUTION REQUIRED\r
+ TLNN CS,170000 ;YES, ARE WE POINTING AT DEL (& ! * / + - _)\r
+ POPJ PP, ;YES, EXIT\r
+ ;NO, FALL INTO EVPUSH\r
+\fEVPUSH: PUSH PP,PS ;STACK VALUES\r
+ PUSH PP,CV\r
+ PUSH PP,RC\r
+ PUSH PP,CS\r
+ JRST EVATOM ;GET NEXT ATOM\r
+\r
+EVXCT: POP PP,AC2 ;POP PREVIOUS RELOCATABILITY\r
+ POP PP,AC1 ;AND PREVIOUS VALUE\r
+ LDB PS,[POINT 3,PS,29] ;TYPE OF OPERATION TO PS\r
+ JRST .(PS) ;PREFORM PROPER OPERATION\r
+ JRST XMUL ;1;\r
+ JRST XDIV ;2;\r
+ JRST XADD ;3;\r
+ JRST XSUB ;4;\r
+ JRST XLRW ;5; "_"\r
+ TDOA CV,PV ;6; MERGE PV INTO CV\r
+ AND CV,PV ;7; AND PV INTO CV\r
+ SKIPN RC ;COMMON RELOCATION TEST\r
+ SKIPE AC2\r
+ TRO ER,ERRR ;BOTH MUST BE FIXED\r
+ JRST EVNUM ;GO TRY AGAIN\r
+\r
+XSUB: SUBM PV,CV\r
+ SUBM PR,RC\r
+ JRST EVNUM\r
+\r
+XADD: ADDM PV,CV\r
+ ADDM PR,RC\r
+ JRST EVNUM\r
+\r
+XDIV: IDIV PR,CV ;CORRECT RELOCATABILITY\r
+ IDIVM PV,CV\r
+XDIV1: EXCH PR,RC ;TAKE RELOCATION OF NUMERATOR\r
+ SKIPE PR\r
+ TRO ER,ERRR\r
+ JRST EVNUM\r
+\r
+XMUL: JUMPE PR,XMUL1 ;AT LEAST ONE OPERAND\r
+ JUMPE RC,XMUL1 ;MUST BE FIXED\r
+ TRO ER,ERRR\r
+XMUL1: IORM PR,RC ;GET RELOCATION TO RC\r
+ IMULM PV,RC\r
+ IMULM PV,CV\r
+ JRST EVNUM\r
+XLRW: EXCH PV,CV\r
+ LSH CV,0(PV)\r
+ LSH PR,0(PV)\r
+ JRST XDIV1\r
+\f SUBTTL LITERAL STORAGE HANDLER\r
+\r
+STOLER: SETZB AC0,RC ;ERROR, NO CODE STORED\r
+ PUSHJ PP,STOW ;STOW ZERO\r
+ TRO ER,ERRL ;AND FLAG THE ERROR\r
+\r
+STOLIT: MOVE SDEL,STPX\r
+ SUB SDEL,STPY ;COMPUTE NUMBER OF WORDS\r
+ JUMPE SDEL,STOLER ;ERROR IF NONE STORED\r
+ TRNN ER,ERRORS ;ANY ERRORS?\r
+ JRST STOL06 ;NO\r
+ JUMP2 STOL22 ;YES, NO SEARCH. BRANCH IF PASS2\r
+ ADDM SDEL,LITCNT\r
+ JRST STOWI\r
+\r
+STOL06: MOVEI SX,LITAB\r
+ MOVE ARG,STPX\r
+ HRL ARG,STPY\r
+ MOVE AC2,LITNUM\r
+ MOVEI SDEL,0\r
+STOL08: PUSHJ PP,DSTOW ;GET VALUE WFW\r
+STOL10: SOJL AC2,STOL24 ;TEST FOR END\r
+ MOVE SX,0(SX) ;NO, GET NEXT STORAGE CELL\r
+ MOVE V,-1(SX) ;GET RELOCATION BITS WFW\r
+ CAMN AC0,-2(SX) ;DO CODES COMPARE? WFW\r
+ CAME RC,V ;YES, HOW ABOUT RELOCATION?\r
+ AOJA SDEL,STOL10 ;NO, TRY AGAIN\r
+ SKIPGE STPX ;YES, MULTI-WORD?\r
+ JRST STOL26 ;NO, JUST RETURN LOCATION\r
+ MOVEM AC2,SAVBLK+AC2 ;YES, SAVE STARTING INFO\r
+ MOVEM SX,SAVBLK+SX\r
+\r
+STOL12: SOJL AC2,STOL23 ;TEST FOR END\r
+ PUSHJ PP,DSTOW ;GET NEXT WORD WFW\r
+ MOVE SX,0(SX) ;UPDATE POINTER\r
+ MOVE V,-1(SX) ;GET RELOCATION WFW\r
+ CAMN AC0,-2(SX) ;COMPARE VALUE WFW\r
+ CAME RC,V ;AND RELOCATION\r
+ JRST STOL14 ;NO MATCH, TRY AGAIN \r
+ SKIPL STPX ;MATCH, HAVE WE FINISHED SEARCH?\r
+ JRST STOL12 ;NO, TRY NEXT WORD\r
+ JRST STOL26 ;YES, RETURN LOCATION\r
+\r
+STOL14: MOVE AC2,SAVBLK+AC2 ;RESTORE STOW POINTERS\r
+ MOVE SX,SAVBLK+SX\r
+ HRREM ARG,STPX\r
+ HLREM ARG,STPY\r
+ AOJA SDEL,STOL08 ;BETTER LUCK NEXT TIME\r
+\f\r
+STOL22: MOVE SDEL,LITNUM\r
+STOL23: PUSHJ PP,DSTOW ;DSTOW AND CONVERT\r
+STOL24: MOVE SX,LITABX ;GET CURRENT STORAGE\r
+ PUSHJ PP,GETTOP ;GET NEXT CELL\r
+ MOVEM AC0,-2(SX) ;STORE CODE WFW\r
+ MOVEM RC,-1(SX) ;WFW\r
+ MOVEM SX,LITABX ;SET POINTER TO CURRENT CELL\r
+ AOS LITNUM ;INCREMENT NUMBER STORED\r
+ AOS LITCNT ;INCREMENT NUMBER RESERVED\r
+ SKIPL STPX ;ANY MODE CODE?\r
+ JRST STOL23 ;YES\r
+STOL26: JUMP1 POPOUT ;EXIT IF PASS ONE\r
+ MOVE SX,LITHDX ;GET HEADER BLOCK\r
+ HLRZ RC,-1(SX) ;GET BLOCK RELOCATION\r
+ HRRZ AC0,-1(SX)\r
+ ADDI AC0,0(SDEL) ;COMPUTE ACTUAL LOCATION\r
+ POPJ PP, ;EXIT\r
+\fSUBTTL INPUT ROUTINES\r
+GETCHR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER\r
+ CAIG C,172 ;CHECK FOR LOWER CASE\r
+ CAIGE C,141\r
+ SKIPA ;NOT LOWER CASE\r
+ SUBI C,40 ;CONVERT LOWER CASE TO SIXBIT\r
+ SUBI C,40 ;CONVERT TO SIX BIT\r
+ CAIN C,7\r
+ JRST GETCHR\r
+ CAILE C,77\r
+ JRST GETCS1\r
+ JUMPGE C,GETCS\r
+ ADDI C,27\r
+ JUMPE C,GETCS\r
+ TLOA IO,IORPTC ;REPEAT CHARACTER\r
+\r
+GETCS1: TDO IO,[XWD IORPTC,ERRQ]\r
+ MOVEI C,33\r
+GETCS: MOVE CS,CSTAT(C) ;GET STATUS BITS\r
+ POPJ PP, ;EXIT\r
+\f\r
+CHARAC: TLZE IO,IORPTC ;REPEAT REQUESTED?\r
+ JRST CHARAX ;YES\r
+RSW0: JUMPN MRP,MREAD ;BRANCH IF TREE POINTER SET\r
+ PUSHJ PP,READ\r
+RSW1: SKIPE RPOLVL ;ARE WE IN "REPEAT ONCE"?\r
+ JRST REPO1 ;YES\r
+RSW2: SOSG CPL ;ANY ROOM IN THE IMAGE BUFFER?\r
+ PUSHJ PP,OUTPL ;NO, OUTPUT THE PARTIAL LINE\r
+ IDPB C,LBUFP ;YES, STORE IN PRINT AREA\r
+ CAIE C,HT ;TAB?\r
+ POPJ PP, ;NO, EXIT\r
+ MOVEI CS,7\r
+ ANDCAM CS,CPL ;MASK\r
+ POPJ PP, ;EXIT\r
+\r
+CHARAX: LDB C,LBUFP ;GET LAST CHARACTER\r
+ POPJ PP, ;EXIT\r
+CHARL: PUSHJ PP,CHARAC ;GET AND TEST 7-BIT ASCII\r
+ CAIE C,LF ;LINE OR FORM FEED OR VT?\r
+ CAIN C,FF\r
+ SKIPA CS,LITLVL ;IN LITERAL?\r
+ POPJ PP, ;EXIT\r
+ JUMPN CS,OUTIML ;YES\r
+CHARL1: PUSHJ PP,SAVEXS ;SAVE REGISTERS\r
+ PUSHJ PP,OUTLIN ;DUMP THE LINE\r
+ JRST RSTRXS ;RESTORE REGISTERS AND EXIT\r
+\fSUBTTL CHARACTER STATUS TABLE\r
+\r
+ DEFINE GENCS (OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO)\r
+<BYTE (6)OPLVL (9)ATOM (3)AN (6)SQUOZ,OPTYPE,SEQNO>\r
+\r
+ ;OPLVL PRIORITY OF BINARY OPERATORS\r
+ ;ATOM INDEX TO JUMP TABLE AT CELL1\r
+ ;AN TYPE OF CHARACTER\r
+ ; 1=OTHER, 2=ALPHA, 4=NUMERIC\r
+ ;SQUOZ VALUE IN RADIX 50\r
+ ;OPTYPE INDEX TO JUMP TABLE AT EVXCT\r
+ ;SEQNO VALUE IN SIXBIT\r
+CSTAT:\r
+ GENCS 00,00,1,00,00,00 ; ' '\r
+ GENCS 04,12,1,00,06,01 ; '!'\r
+ GENCS 00,07,1,00,00,02 ; '"'\r
+ GENCS 00,12,1,00,00,03 ; '#'\r
+ GENCS 00,01,2,46,00,04 ; '$'\r
+ GENCS 00,01,2,47,00,05 ; '%'\r
+ GENCS 04,12,1,00,07,06 ; '&'\r
+ GENCS 00,00,1,00,00,07 ; '''\r
+\r
+ GENCS 00,01,1,00,00,10 ; '('\r
+ GENCS 00,01,1,00,00,11 ; ')'\r
+ GENCS 02,12,1,00,01,12 ; '*'\r
+ GENCS 01,00,1,00,03,13 ; '+'\r
+ GENCS 40,01,1,00,00,14 ; ','\r
+ GENCS 01,02,1,00,04,15 ; '-'\r
+ GENCS 00,11,2,45,00,16 ; '.'\r
+ GENCS 02,12,1,00,02,17 ; '/'\r
+\r
+ GENCS 00,04,4,01,00,20 ; '0'\r
+ GENCS 00,04,4,02,00,21 ; '1'\r
+ GENCS 00,04,4,03,00,22 ; '2'\r
+ GENCS 00,04,4,04,00,23 ; '3'\r
+ GENCS 00,04,4,05,00,24 ; '4'\r
+ GENCS 00,04,4,06,00,25 ; '5'\r
+ GENCS 00,04,4,07,00,26 ; '6'\r
+ GENCS 00,04,4,10,00,27 ; '7'\r
+\r
+ GENCS 00,04,4,11,00,30 ; '8'\r
+ GENCS 00,04,4,12,00,31 ; '9'\r
+ GENCS 00,12,1,00,00,32 ; ':'\r
+ GENCS 00,01,1,00,00,33 ; ';'\r
+ GENCS 00,05,1,00,00,34 ; '<'\r
+ GENCS 00,12,1,00,00,35 ; '='\r
+ GENCS 00,01,1,00,00,36 ; '>'\r
+ GENCS 00,12,1,00,00,37 ; '?'\r
+\f GENCS 00,03,1,00,00,40 ; '@'\r
+ GENCS 00,01,2,13,00,41 ; 'A'\r
+ GENCS 00,01,2,14,00,42 ; 'B'\r
+ GENCS 00,01,2,15,00,43 ; 'C'\r
+ GENCS 00,01,2,16,00,44 ; 'D'\r
+ GENCS 00,01,2,17,00,45 ; 'E'\r
+ GENCS 00,01,2,20,00,46 ; 'F'\r
+ GENCS 00,01,2,21,00,47 ; 'G'\r
+\r
+ GENCS 00,01,2,22,00,50 ; 'H'\r
+ GENCS 00,01,2,23,00,51 ; 'I'\r
+ GENCS 00,01,2,24,00,52 ; 'J'\r
+ GENCS 00,01,2,25,00,53 ; 'K'\r
+ GENCS 00,01,2,26,00,54 ; 'L'\r
+ GENCS 00,01,2,27,00,55 ; 'M'\r
+ GENCS 00,01,2,30,00,56 ; 'N'\r
+ GENCS 00,01,2,31,00,57 ; 'O'\r
+\r
+ GENCS 00,01,2,32,00,60 ; 'P'\r
+ GENCS 00,01,2,33,00,61 ; 'Q'\r
+ GENCS 00,01,2,34,00,62 ; 'R'\r
+ GENCS 00,01,2,35,00,63 ; 'S'\r
+ GENCS 00,01,2,36,00,64 ; 'T'\r
+ GENCS 00,01,2,37,00,65 ; 'U'\r
+ GENCS 00,01,2,40,00,66 ; 'V'\r
+ GENCS 00,01,2,41,00,67 ; 'W'\r
+\r
+ GENCS 00,01,2,42,00,70 ; 'X'\r
+ GENCS 00,01,2,43,00,71 ; 'Y'\r
+ GENCS 00,01,2,44,00,72 ; 'Z'\r
+ GENCS 00,06,1,00,00,73 ; '['\r
+ GENCS 00,12,1,00,00,74 ; '\'\r
+ GENCS 00,01,1,00,00,75 ; ']'\r
+ GENCS 00,10,1,00,00,76 ; '^'\r
+ GENCS 10,12,1,00,05,77 ; '_'\r
+\fSUBTTL LISTING ROUTINES\r
+OUTLIN: TRNN ER,ERRORS-ERRQ ;ANY ERRORS?\r
+ TLNE FR,ERRQSW ;NO, IGNORE Q ERRORS?\r
+ TRZ ER,ERRQ ;YES, YES, ZERO THE Q ERROR\r
+ HRLZ AC0,ER ;PUT ERROR FLAGS IN AC0 LEFT\r
+ TDZ ER,TYPERR\r
+ IDPB AC0,LBUFP\r
+ JUMP1 OUTL30 ;BRANCH IF PASS ONE\r
+ JUMPN AC0,OUTL02 ;JUMP IF ANY ERRORS TO FORCE PRINTING\r
+ SKIPL STPX ;SKIP IF NO CODE, OTHERWISE\r
+ TLZ IO,IOMAC ;FORCE MACRO PRINTING\r
+ TLNN IO,IOMSTR!IOPROG!IOMAC\r
+OUTL02: IOR IO,OUTSW ;FORCE IT.\r
+ TLNN FR,CREFSW ;CREF?\r
+ PUSHJ PP,CLSCRF ;YES, WRITE END OF CREF DATA (177,003)\r
+ JUMPE AC0,OUTL20 ;BRANCH IF NO ERRORS\r
+ TLZE AC0,ERRM ;M ERROR?\r
+ TLO AC0,ERRP ;M ERROR SET - SET P ERROR.\r
+ PUSHJ PP,OUTLER ;PROCESS ERRORS\r
+\r
+OUTL20: SKIPN RC,ASGBLK \r
+ SKIPE CS,LOCBLK ;\r
+ SKIPL STPX ;ANY BINARY?\r
+ JRST OUTL23 ;YES, JUMP\r
+ JUMPE RC,OUTL22 ;SEQUENCE BREAK AND NO BINARY JUMPS\r
+ ILDB C,TABP ;ASSIGNMENT FALL THROUGH\r
+ PUSHJ PP,OUTL \r
+ ILDB C,TABP ;OUTPUT 2ND TAB, LOCATION FIELD\r
+ PUSHJ PP,OUTC ;NEXT IS BINARY LISTING FIELD\r
+ HLLO CS,LOCBLK ;LEFT HALF OF A 36BIT VALUE\r
+ TLNE CS,-1 ;SKIP IF ITS A 18BIT VALUE, OTHERWISE\r
+ PUSHJ PP,ONC1 ;PRINT LH OF A 36 BIT VALUE IN CS\r
+ HRLO CS,LOCBLK ;PICK UP THE RIGHT HALF (18BIT VALUE)\r
+ TRZ CS,0(RC) ;\r
+\fOUTL22: PUSHJ PP,ONC ;PRINT IT\r
+OUTL23: SKIPL STPX ;ANY BINARY?\r
+ PUSHJ PP,BOUT ;YES, DUMP IT\r
+ MOVE CS,@OUTLI2 ;[POINT 7,LBUF]\r
+OUTL24: ILDB C,CS\r
+ JUMPE C,OUTL25\r
+ CAIG C," "\r
+ JRST OUTL24\r
+ MOVE CS,TABP\r
+ PUSHJ PP,OUTASC ;OUTPUT TABS\r
+OUTL25: MOVEI CS,LBUF\r
+ PUSHJ PP,OUTAS0 ;DUMP THE LINE\r
+OUTL26: SKIPGE STPX ;ANY BINARY?\r
+ JRST OUTLI ;NO, CLEAN UP AND EXIT\r
+ PUSHJ PP,OUTLI2 ;YES, INITIALIZE FOR NEXT LINE\r
+ PUSHJ PP,BOUT ;YES, DUMP IT\r
+ PUSHJ PP,OUTCR ;OUTPUT CARRIAGE RETURN\r
+ JRST OUTL26 ;TEST FOR MORE BINARY\r
+\r
+\fOUTL30: AOS CS,STPX ;PASS ONE\r
+ ADDM CS,LOCO ;INCREMENT OUTPUT LOCATION\r
+ PUSHJ PP,STOWI ;INITIALIZE STOW\r
+ TLZ AC0,ERRORS-ERRM-ERRP-ERRV-400000\r
+ JUMPE AC0,OUTLI3 ;JUMP IF ERRORS\r
+ IOR ER,OUTSW ;LIST ERRORS\r
+ MOVEI CS,TAG\r
+ PUSHJ PP,OUTSIX ;OUTPUT TAG\r
+ HRRZ C,TAGINC\r
+ PUSHJ PP,DNC ;CONVERT INCREMENT TO DECIMAL\r
+ PUSHJ PP,OUTTAB ;OUTPUT TAB\r
+ PUSHJ PP,OUTLER ;OUTPUT ERROR FLAGS\r
+ PUSHJ PP,OUTTAB\r
+ JRST OUTL25 ;OUTPUT BASIC LINE\r
+\r
+OUTLER: ASH AC0,-4\r
+ MOVE CS,[POINT 6,[SIXBIT /PRINTQXADLRUVNOPEM/]]\r
+OUTLE2: ILDB C,CS ;GET ERROR MNEMONIC\r
+ JUMPGE AC0,OUTLE4 ;BRANCH IF NOT FLAGGED\r
+ ADDI C,40\r
+ PUSHJ PP,OUTL\r
+ AOS ERRCNT ;INCREMENT ERROR COUNT\r
+OUTLE4: LSH AC0,1 ;SHIFT NEXT FLAG INTO SIGN BIT\r
+ JUMPN AC0,OUTLE2 ;TEST FOR END\r
+ POPJ PP, ;EXIT\r
+OUTPL: IBP LBUFP\r
+OUTIM1: JUMP1 OUTLI3\r
+ PUSH PP,IO\r
+ TDZ IO,TYPERR\r
+ TLNN IO,250000\r
+ IOR IO,OUTSW\r
+ PUSH PP,C\r
+ TLNN FR,2000\r
+ PUSHJ PP,CLSCRF\r
+OUTIM2: MOVE CS,TABP\r
+ PUSHJ PP,OUTASC ;OUTPUT TABS\r
+ DPB C,LBUFP\r
+ MOVEI CS,LBUF\r
+ PUSHJ PP,SOUT20\r
+ POP PP,C\r
+ HLLM IO,0(PP)\r
+ POP PP,IO\r
+ JRST OUTLI2\r
+OUTLI: TLNE IO,IOPALL ;SUPRESSING ALL\r
+ SKIPN MACLVL\r
+ TLZA IO,IOMAC ;NO, CLEAR MAC FLAG\r
+ TLO IO,IOMAC ;YES, SET FLAG\r
+OUTLI3: TRZ IO,ERRORS!LPTSW!TTYSW\r
+OUTLI2: MOVE CS,[POINT 7,LBUF] ;INITIALIZE BUFFERS\r
+ MOVEM CS,LBUFP\r
+ MOVEI CS,130\r
+ MOVEM CS,CPL\r
+ MOVE CS,[POINT 7,TABI,6]\r
+ MOVEM CS,TABP\r
+ MOVSI CS,(ASCII / /)\r
+ SKIPE SEQNO ;HAVE WE SEQUENCE NUMBERS?\r
+ MOVEM CS,SEQNO ;YES, STORE TAB IN CASE OF MACRO\r
+ MOVEM CS,SEQNO+1 ;STORE TAB AND TERRMINATOR\r
+ SETZM ASGBLK\r
+ SETZM LOCBLK\r
+ POPJ PP,\r
+\fOUTIML: TRNN ER,ERRORS-ERRQ ;FOR LITERALS (MULIT-LINE) OUTPUT ERRORS\r
+ TLNE FR,ERRQSW\r
+ TRZ ER,ERRQ\r
+ HRLZ CS,ER\r
+ JUMP1 OUTML1 ;CHECK PASS1 ERRORS\r
+ TDZ ER,TYPERR\r
+ JUMPE CS,OUTIM1\r
+ PUSH PP,[0] ;ERRORS SHOULD BE ZEROED\r
+ PUSH PP,C\r
+ PUSH PP,AC0 ;SAVE ACO IN CASE CALLED FROM ASCII\r
+ MOVE AC0,CS ;ERROR ROUTINE WANTS FLAGS IN AC0\r
+ IOR ER,OUTSW\r
+ TLNN FR,CREFSW\r
+ PUSHJ PP,CLSCRF ;FIX CREF\r
+ TLZE AC0,ERRM\r
+ TLO AC0,ERRP\r
+ PUSHJ PP,OUTLER ;OUTPUT THEM\r
+ POP PP,AC0\r
+ JRST OUTIM2\r
+OUTML1: TLZ CS,ERRORS-ERRM-ERRP-ERRV-400000\r
+ JUMPE CS,OUTLI2\r
+ TRZ ER,ERRM!ERRP!ERRV!400000\r
+ TRO ER,ERRL\r
+ PUSH PP,ER ;SAVE\r
+ PUSH PP,C ;SAVE THIS\r
+ PUSH PP,AC0 ;AS ABOVE\r
+ MOVE AC0,CS ;...\r
+ TDZ ER,TYPERR\r
+ IOR ER,OUTSW\r
+ MOVEI CS,TAG\r
+ PUSHJ PP,OUTSIX\r
+ HRRZ C,TAGINC\r
+ PUSHJ PP,DNC\r
+ PUSHJ PP,OUTTAB\r
+ PUSHJ PP,OUTLER ;DO NOT FORGET ERRORS\r
+ PUSHJ PP,OUTTAB\r
+ MOVEI CS,LBUF ;PRINT REST OF LINE\r
+ PUSHJ PP,SOUT20\r
+ POP PP,AC0\r
+ POP PP,C\r
+ POP PP,ER\r
+ JRST OUTLI2\r
+\fSUBTTL OUTPUT ROUTINES\r
+UOUT: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN\r
+ TRNN ARG,PNTF ;WFW\r
+ TRNN ARG,UNDF\r
+ POPJ PP,\r
+ JUMP1 VARA1\r
+ PUSHJ PP,OUTCR\r
+ PUSHJ PP,OUTSYM\r
+ MOVEI CS,[SIXBIT /UNASSIGNED, DEFINED AS @/]\r
+ PUSHJ PP,OUTSIX\r
+ HRLO CS,V\r
+ TDZ CS,RC\r
+UOUT1: PUSHJ PP,ONC1\r
+ JRST HIGHQ\r
+\f ;OUTPUT THE ENTRIES\r
+\r
+EOUT: MOVEI C,0 ;INITIALIZE THE COUNT\r
+ MOVE SX,SYMBOL\r
+ MOVE SDEL,0(SX)\r
+EOUT1: SOJL SDEL,EOUT2\r
+ ADDI SX,2\r
+ HLRZ ARG,0(SX)\r
+ ANDCAI ARG,SYMF!INTF!ENTF\r
+ JUMPN ARG,EOUT1 ;IF INVALID, DON'T COUNT\r
+ AOJA C,EOUT1 ;BUMP COUNT\r
+\r
+EOUT2: HRLI C,4 ;BLOCK TYPE 4\r
+ PUSHJ PP,OUTBIN\r
+ SETZB C,ARG\r
+ PUSHJ PP,OUTBIN\r
+ MOVE SX,SYMBOL\r
+ MOVE SDEL,0(SX)\r
+ MOVEI V,^D18\r
+\r
+EOUT3: SOJL SDEL,POPOUT\r
+ ADDI SX,2\r
+ HLRZ C,0(SX)\r
+ ANDCAI C,SYMF!INTF!ENTF\r
+ JUMPN C,EOUT3\r
+ SOJGE V,EOUT4 ;TEST END OF BLOCK\r
+ PUSHJ PP,OUTBIN\r
+ MOVEI V,^D17 ;WFW\r
+EOUT4: MOVE AC0,-1(SX)\r
+ PUSHJ PP,SQOZE\r
+ MOVE C,AC0\r
+ PUSHJ PP,OUTBIN\r
+ JRST EOUT3\r
+\f ;OUTPUT THE SYMBOLS\r
+\r
+SOUT: MOVEI [ASCIZ /SYMBOL TABLE/]\r
+ HRRM SUBTTX ;SET NEW SUB-TITLE\r
+ PUSHJ PP,OUTFF ;FORCE NEW PAGE\r
+ MOVEI ARG,NCOLS ;SET UP FOR NCOLS ACROSS SYMBOL TABLE\r
+ MOVEM ARG,SYMCNT ;STORE ANSWER\r
+ PUSHJ PP,LOUT1 ;OUTPUT THEM\r
+ MOVE ARG,SYMCNT\r
+ CAIE ARG,NCOLS\r
+ JRST OUTCR ;NO, NEED CR\r
+ POPJ PP,\r
+\r
+LOUT1: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN\r
+ TRNN ARG,SYMF\r
+ TRNN ARG,MACF!SYNF\r
+ TRNE ARG,40 ;SKIP AND CLEAR MRP\r
+ POPJ PP, ;NO, TRY AGAIN\r
+ MOVEI MRP,0\r
+ TRNE ARG,INTF\r
+ MOVEI MRP,1\r
+ TRNE ARG,EXTF\r
+ MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL\r
+ TRNE ARG,SYNF ;SYNONYM?\r
+ JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL\r
+ TRNE ARG,SUPRBT ;IF SUPRESSED\r
+ JUMPGE MRP,POPOUT\r
+ TLNE IO,2000\r
+ JUMPE MRP,POPOUT\r
+ JUMPGE MRP,LOUT10\r
+ HLRZ RC,V ;PUT POINTER/FLAGS IN RC\r
+ TRNE RC,-2 ;POINTER?\r
+ MOVS RC,0(RC) ;YES\r
+ HLL V,RC ;STORE LEFT HALF\r
+\r
+LOUT10: PUSH PP,RC ;SAVE FOR LATER\r
+ PUSHJ PP,OUTSYM ;OUTPUT THE NAME\r
+ MOVE RC,0(PP) ;GET COPY\r
+ MOVEI AC1,0\r
+ JUMPLE MRP,LOUT15 ;SET DEFFERRED BITS IF EXTERNAL\r
+ TLNE RC,-2 ;CHECK FOR LEFT FIXUP\r
+ IORI AC1,40 ;AND SET BITS\r
+ TRNE RC,-2 ;CHECK FOR RIGHT FIXUP\r
+ IORI AC1,20 ;AND SET BITS\r
+LOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL\r
+ HRRZS AC0,RC\r
+ TRNE RC,-2\r
+ HLLZS AC0,RC\r
+ TLZE RC,-1\r
+ TRO RC,2\r
+ HRL MRP,RC\r
+ MOVEI RC,0\r
+ TRNE ARG,NOOUTF ;ENTRY DMN\r
+ ADDI MRP,3 ;YES WFW\r
+ IOR AC1,SOUTC(MRP)\r
+ MOVE ARG,AC1\r
+ PUSHJ PP,NOUT2 ;SQUOZE AND DUMP THE SYMBOL\r
+ MOVEM AC0,SVSYM ;SAVE IT\r
+ MOVE AC0,V ;GET THE VALUE\r
+ HLRZ RC,MRP ;AND THE RELOCATION\r
+ PUSHJ PP,COUT\r
+ HLLO CS,V\r
+ TRNE RC,2 ;LEFT HALF RELOCATABLE?\r
+ TRZA CS,1 ;NO, FLAG AND PRINT\r
+ TLNE CS,-1 ;IS THE LEFT HALF ZERO?\r
+ PUSHJ PP,ONC1 ;NO, OUTPUT IT\r
+ PUSHJ PP,OUTTAB \r
+ HRLO CS,V\r
+ TDZ CS,RC ;SET RELOCATION\r
+ PUSHJ PP,ONC1\r
+ PUSHJ PP,OUTTAB\r
+ POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL\r
+ TRNN RC,-2 ;IS IT?\r
+ JRST SOUT50 ;NO\r
+ MOVE AC0,1(RC) ;GET NAME\r
+ MOVEI ARG,60 ;EXTERNAL REQ\r
+ PUSHJ PP,SQOZE\r
+ HLLZS AC0,RC ;NO RELOC\r
+ PUSHJ PP,COUT ;OUTPUT IT\r
+ MOVE AC0,SVSYM ;GET SYMBOL NAME\r
+ TLO AC0,500000 ;SET AS ADDITIVE SYMBOL\r
+ TLZ AC0,200000 ;BUT NOT LEFT HALF ETC\r
+ PUSHJ PP,COUT\r
+\f\r
+SOUT50: MOVSS RC ;CHECK LEFT HALF\r
+ TRNN RC,-2\r
+ JRST SOUT30\r
+ MOVE AC0,1(RC)\r
+ MOVEI ARG,60\r
+ PUSHJ PP,SQOZE\r
+ MOVEI RC,0\r
+ PUSHJ PP,COUT\r
+ MOVE AC0,SVSYM\r
+ TLO AC0,700000\r
+ PUSHJ PP,COUT\r
+\r
+SOUT30: MOVEI CS,SOUTC(MRP)\r
+ PUSHJ PP,OUTAS0\r
+ SOSLE SYMCNT\r
+ JRST OUTAB2\r
+ MOVEI CS,3\r
+ MOVEM CS,SYMCNT\r
+ JRST OUTCR\r
+\r
+SOUT20: PUSHJ PP,OUTAS0\r
+ JRST OUTCR\r
+\r
+ <ASCII /EXT/>!60 ;DMN\r
+SOUTC: EXP 10\r
+ <ASCII /INT/>!04\r
+ <ASCII /EXT/>!60\r
+ <ASCII /DLD/>!50 \r
+ <ASCII /INT/>!04 ;DMN\r
+\f ;OUTPUT THE BINARY\r
+\r
+BOUT: HRLO CS,LOCO ;PICKUP THE LOCATION\r
+ PUSHJ PP,ONC ;OUTPUT IT TO THE LISTING FILE\r
+ PUSHJ PP,DSTOW ;GET THE CODE\r
+ PUSH PP,RC ;SAVE RELOCATION\r
+ TLNE RC,-2 ;CHECK LEFT EXTERNAL\r
+ HRRZS RC ;MAKE LEFT NON-RELOC\r
+ TRNN RC,-2 ;RIGHT EXT?\r
+ JRST BOUT30 ;NO\r
+ HRRZ AC1,AC0 ;YES\r
+ JUMPE AC1,BOUT20 ;PROCESS IF ZERO CODE THERE\r
+ HLLZS AC0,RC ;MAKE NON-RELOC\r
+ JRST BOUT30 ;PROCESS\r
+ TRNN RC,-2\r
+ JRST BOUT30\r
+\r
+BOUT20: HRRM AC1,0(PP) ;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0)\r
+ HRR AC0,0(RC) ;NO, SET ADDRESS LINK\r
+ MOVE AC1,LOCO ;GET CURRENT LOCATION\r
+ HRRM AC1,0(RC) ;SET NEW LINK\r
+ HLRZ AC1,0(RC) ;GET FLAGS/POINTER\r
+ TRNN AC1,-2 ;POINTER?\r
+ HRR AC1,RC ;NO, SET TO FLAGS\r
+ HLR RC,0(AC1) ;PUT FLAGS IN RC\r
+ HRL AC1,MODO ;GET CURRENT MODE\r
+ TRZE RC,-2 ;LEFT HALF RELOCATABLE+\r
+ TLO AC1,2 ;YES, SET FLAG\r
+ HLLM AC1,0(AC1) ;STORE NEW FLAGS\r
+BOUT30: HLLO CS,AC0\r
+ TLZE RC,1 ;PACK RELOCATION BITS\r
+ TRO RC,2\r
+ TRNE RC,2 ;LEFT HALF RELOCATABLE?\r
+ TRZ CS,1 ;YES, RESET BIT\r
+ PUSHJ PP,ONC\r
+ HRLO CS,AC0\r
+ TDZ CS,RC ;SET RELOCATION\r
+ PUSHJ PP,ONC\r
+ HRRZ CS,LOCO ;CS = RIGHT RELOCATION\r
+ TLNE FR,RIMSW!RIM1SW!R1BSW ;RIM OUTPUT?\r
+ JRST ROUT ;YES, GO PROCESS\r
+\r
+ HRL CS,MODO\r
+ CAME CS,MODLOC ;SEQUENCE OR RELOCATION BREAK?\r
+ PUSHJ PP,COUTD ;YES, DUMP THE BUFFER\r
+ SKIPL COUTX ;NEW BUFFER?\r
+ JRST BOUT40 ;NO, STORE CODE AND EXIT\r
+ MOVEM CS,MODLOC ;YES, STORE NEW VALUES\r
+ EXCH AC0,LOCO\r
+ EXCH RC,MODO\r
+ PUSHJ PP,COUT ;STORE BLOCK LOCATION AND MODE\r
+ EXCH RC,MODO ;RESTORE CURRENT VALUES\r
+ EXCH AC0,LOCO\r
+\fBOUT40: PUSHJ PP,COUT ;EXIT CODE\r
+ POP PP,RC ;RETREIVE EXTERNAL BITS\r
+ TRNN RC,-2 ;RIGHT EXTERNAL?\r
+ JRST BOUT50 ;TRY FOR LEFT\r
+ PUSHJ PP,COUTD\r
+ PUSH PP,BLKTYP ;TERMINATE TYPE AND SAVE\r
+ MOVEI AC0,2 ;BLOCK TYPE 2\r
+ MOVEM AC0,BLKTYP\r
+ MOVE AC0,1(11) ;GET SYMBOL\r
+ MOVEI ARG,60 ;CODE BITS\r
+ PUSHJ PP,SQOZE ;CONVERT TO RADIX 50\r
+ HLLZS RC ;SYMBOL HAS NO RELOCATION\r
+ PUSHJ PP,COUT ;EMIT\r
+ MOVE AC0,LOCO ;GET CURRENT LOC\r
+ HRLI AC0,400000 ;ADDITIVE REQ\r
+ HRR RC,MODO ;CURRENT MODE\r
+ PUSHJ PP,COUT ;EMIT\r
+ MOVSS RC ;NOW FOR LEFT\r
+ TRNN RC,-2\r
+ JRST BOUT60\r
+ JRST BOUT70\r
+BOUT50: MOVSS RC ;CHECK OTHER HALF\r
+ TRNN RC,-2 ;LEFT HALF EXTERNAL?\r
+ JRST BOUT80 ;NO, FALSE ALARM\r
+ PUSHJ PP,COUTD ;CHANGE MODE\r
+ PUSH PP,BLKTYP\r
+ MOVEI AC0,2\r
+ MOVEM AC0,BLKTYP\r
+BOUT70: MOVE AC0,1(RC)\r
+ MOVEI ARG,60\r
+ PUSHJ PP,SQOZE\r
+ HLLZS AC0,RC\r
+ PUSHJ PP,COUT\r
+ MOVE AC0,LOCO\r
+ HRLI AC0,600000 ;LEFT HALF ADD\r
+ HRR RC,MODO\r
+ PUSHJ PP,COUT ;EMIT\r
+BOUT60: PUSHJ PP,COUTD ;CHANGE MODE\r
+ POP PP,BLKTYP ;TO OLD ONE\r
+BOUT80: AOS LOCO\r
+ AOS MODLOC\r
+ POPJ PP,\r
+\fNOUT: MOVE V,[POINT 7,TBUF] ;POINTER TO ASCII LINE\r
+ MOVSI CS,(POINT 6,AC0) ;POINTER TO SIXBIT AC0\r
+ SETZB ARG,AC0\r
+NOUT1: ILDB C,V ;GET ASCII\r
+ CAIL C,"A"+40\r
+ CAILE C,"Z"+40\r
+ SKIPA\r
+ SUBI C,40 ;CONVERT TO LOWER CASE\r
+ SUBI C,40 ;CONVERT TO SIXBIT\r
+ JUMPLE C,NOUT3 ;TEST FORM NON-SIXBIT\r
+ CAILE C,77 ;AND NOT GREATER THAN SIXBIT\r
+ JRST NOUT3 ;...\r
+ IDPB C,CS ;DEPOSIT IN AC0\r
+ TLNE CS,770000 ;TEST FOR SIX CHARACTERS\r
+ JRST NOUT1\r
+NOUT3:\r
+\r
+IFN CCLSW,< TLNN IO,IOTLSN ;AND IF WE HAVE NOT SEEN A TITLE\r
+ PUSHJ PP,PRNAM ;THEN PRINT THE NAME>\r
+NOUT2: PUSHJ PP,SQOZE ;CONVERT TO SIXBIT\r
+ JRST COUT ;DUMP AND EXIT\r
+\r
+IFN RENTSW,<\r
+HOUT:\r
+ MOVE AC0,HHIGH ;GET HIGH SEG IF TWO SEGMENTS\r
+ MOVEI RC,1 ;RELOCATABL\r
+ PUSHJ PP,COUT ;OUTPUT IT\r
+ SETZB AC0,RC\r
+ JRST COUT ;OUTPUT THE HIGHEST LOCATION>\r
+\r
+VOUT: SKIPN RC,VECREL ;IS VECTOR ABSOLUTE ZERO?\r
+ SKIPE VECTOR ;ALSO CHECK RELOCATION\r
+ SKIPA \r
+ POPJ PP, ;YES, EXIT\r
+ MOVE AC0,VECTOR ;ACO SHOULD BE FLAGS\r
+COUT: AOS C,COUTX ;INCREMENT INDEX\r
+ MOVEM AC0,COUTDB(C) ;STORE CODE\r
+ IDPB RC,COUTP ;STORE RELOCATION BITS\r
+ CAIE C,^D17 ;IS THE BUFFER FULL?\r
+ POPJ PP, ;NO, EXIT\r
+\r
+COUTD: AOSG C,COUTX ;DUMP THE BUFFER\r
+ JRST COUTI ;BUFFER WAS EMPTY\r
+ HRL C,BLKTYP ;SET BLOCK TYPE\r
+ PUSHJ PP,OUTBIN ;OUTPUT COUNT AND TYPE\r
+ SETOB C,COUTY ;INITIALIZE INDEX\r
+\r
+COUTD2: MOVE C,COUTDB(C) ;GET RELOCATION BITS/CODE\r
+ PUSHJ PP,OUTBIN ;DUMP IT\r
+ AOS C,COUTY ;INCREMENT INDEX\r
+ CAMGE C,COUTX ;TEST FOR END\r
+ JRST COUTD2 ;NO, GET NEXT WORD\r
+\r
+COUTI: SETOM COUTX ;INITIALIZE BUFFER INDEX\r
+ SETZM COUTRB ;ZERO RELOCATION BITS\r
+ MOVE C,[POINT 2,COUTRB]\r
+ MOVEM C,COUTP ;INITIALIZE BIT POINTER\r
+ POPJ PP, ;EXIT\r
+\fSTOWZ: MOVEI RC,0 ;USE STANDARD FORM\r
+STOW: JUMP1 STOW20 ;SKIP TEST IF PASS ONE\r
+ TRNE RC,-2 ;RIGHT HALF ZERO OR 1?\r
+ PUSHJ PP,STOWT ;NO, HANDLE EXTERNAL\r
+ TLNN RC,-2 ;LEFT HALF ZERO OR 1? WFW\r
+ JRST STOW10 ;YES, SKIP TEST\r
+ MOVSS RC ;SWAP HALVES\r
+ PUSHJ PP,STOWT1 ;HANDLE EXTERNAL WFW\r
+ MOVSS RC ;RESTORE VALUES\r
+\r
+STOW10: SKIPE EXTPNT ;ANY EXTERNALS REMAINING?\r
+ TRO ER,ERRE ;YES, SET EXTERNAL ERROR FLAG\r
+\r
+STOW20: AOS AC1,STPX ;INCREMEMT POINTER\r
+ MOVEM AC0,STCODE(AC1) ;STOW CODE\r
+ MOVEM RC,STOWRC(AC1) ;STOW RELOCATION BITS\r
+ SKIPN LITLVL ;ARE WE IN LITERAL?\r
+ AOS LOCA ;NO, INCREMENT ASSEMBLY LOCATION\r
+ CAIGE AC1,.STP-1 ;OVERFLOW\r
+ POPJ PP, ;NO, EXIT\r
+\r
+ SKIPE LITLVL ;ARE WE IN A LITERAL?\r
+ TROA ER,ERRL ;YES, FLAG ERRRO BUT DON'T DUMP\r
+ JRST CHARL1 ;NO, SAVE REGISTERS AND DUMP THE BUFFER\r
+ JRST STOWI ;INITIALIZE BUFFER\r
+\r
+DSTOW: AOS AC1,STPY ;INCREMENT POINTER\r
+ MOVE AC0,STCODE(AC1) ;FETCH CODE\r
+ MOVE RC,STOWRC(AC1) ;FETCH RELOCATION BITS\r
+ CAMGE AC1,STPX ;IS THIS THE END?\r
+ POPJ PP, ;NO, EXIT\r
+STOWI: SETOM STPX ;INITIALIZE FOR INPUT\r
+ SETOM STPY ;INITIALIZE FOR OUTPUT\r
+ SETZM EXTPNT\r
+ POPJ PP, ;EXIT\r
+\r
+\fSVSTOW: AOS LITLVL ;NESTED LITERALS\r
+ PUSH PP,STPX ;MAKE ROOM FOR ANOTHER\r
+ PUSH PP,STPY\r
+ MOVE AC1,STPX\r
+ MOVEM AC1,STPY\r
+ JRST 0(AC2)\r
+\r
+GTSTOW: POP PP,STPY ;BACK UP A LEVEL\r
+ POP PP,STPX\r
+ SOS LITLVL\r
+ JRST 0(AC2)\r
+\r
+ ;EXTERNAL RIGHT\r
+STOWT: HRRZ AC1,EXTPNT ;GET RIGHT POINTER\r
+ CAIN AC1,0(RC) ;DOES IT MATCH\r
+ JRST STOWT0 ;EXTERNAL OR RELOCATION ERROR\r
+ HRRI RC,0\r
+ TRO ER,ERRE\r
+STOWT0: HLLZS EXTPNT\r
+ POPJ PP, ;EXIT\r
+\r
+ ;EXTERNAL LEFT\r
+STOWT1: HLRZ AC1,EXTPNT ;GET LEFT HALF\r
+ CAIN AC1,0(RC) ;SEE ABOVE\r
+ JRST STOWT2\r
+ HRRI RC,0\r
+ TRO ER,ERRE\r
+STOWT2: HRRZS EXTPNT\r
+ POPJ PP, ;EXIT\r
+\fONC: ILDB C,TABP ;ENTRY TO ADVANCE TAB POINTER\r
+ PUSHJ PP,OUTL ;OUTPUT A TAB\r
+ ;OUTPUT 6 OCT NUMBERS FROM CS LEFT\r
+ONC1: MOVEI C,6 ;CONVERT TO ASCII\r
+ LSHC C,3 ;SHIFT IN OCTAL\r
+ PUSHJ PP,OUTL ;OUTPUT ASCII FROM C\r
+ TRNE CS,-1 ;ARE WE THROUGH?\r
+ JRST ONC1 ;NO, GET ANOTHER\r
+ MOVEI C,"'"\r
+ TLNN CS,1 ;RELOCATABLE?\r
+ PUSHJ PP,OUTC ;OUTPUT IF EXTERN OR RELOCATABLE\r
+ POPJ PP, ;EXIT\r
+\r
+DNC: IDIVI C,^D10\r
+ HRLM CS,0(PP)\r
+ SKIPE C\r
+ PUSHJ PP,DNC ;RECURSE IF NON-ZERO\r
+ HLRZ C,0(PP)\r
+ ADDI C,"0" ;FORM ASCII\r
+ JRST PRINT ;DUMP AND TEST FOR END\r
+\r
+OUTAS0: HRLI CS,(POINT 7,,) ;ENTRY TO SET POINTER\r
+OUTASC: ILDB C,CS ;GET NEXT BYTE\r
+ JUMPE C,POPOUT ;EXIT ON ZERO DELIMITER\r
+ PUSHJ PP,PRINT\r
+ JRST OUTASC\r
+\r
+OUTSIX: HRLI CS,(POINT 6,,) ;OUTPUT SIXBIT\r
+ ILDB C,CS ;GET SIXBIT\r
+ CAIN C,40 ;"@" DELIMITER?\r
+ POPJ PP, ;YES, EXIT\r
+ ADDI C,40 ;NO, FORM ASCII\r
+ PUSHJ PP,OUTL ;OUTPUTASCII CHAR FROM C\r
+ JRST OUTSIX+1\r
+\r
+OUTSYM: MOVE CS,AC0 ;PLACE NAME IN CS\r
+OUTSY1: MOVEI C,0 ;CLEAR C\r
+ LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN\r
+ JUMPE C,OUTTAB ;TEST FOR END\r
+ ADDI C,40 ;CONVERT TO ASCII\r
+ PUSHJ PP,OUTL ;OUTPUT\r
+ JRST OUTSY1 ;LOOP\r
+\fOUTSET: AOS SX,0(PP) ;GET RETURN LOCATION\r
+ MOVE SX,-1(SX) ;GET XWD CODE\r
+ HLRM SX,BLKTYP ;SET BLOCK TYPE\r
+ SETZB ARG,RC \r
+ PUSHJ PP,0(SX) ;GO TO PRESCRIBED ROUTINE\r
+ JRST COUTD ;TERMINATE BLOCK AND EXIT\r
+\r
+ ;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE\r
+\r
+LOOKUP: POP PP,LOOKX ;INTERCEPT RETURN POP\r
+ MOVE SX,SYMBOL\r
+ MOVE SDEL,0(SX) ;SET FOR TABLE SCAN\r
+LOOKL: SOJL SDEL,POPOUT ;TEST FOR END\r
+ ADDI SX,2\r
+ MOVE AC0,-1(SX)\r
+ PUSHJ PP,SRCH7 ;LOAD REGISTERS\r
+ HLRZS ARG\r
+ PUSHJ PP,@LOOKX ;RETURN TO CALLING ROUTINE\r
+ JRST LOOKL ;TRY AGAIN\r
+\fEND0: AOS LITLVL\r
+ PUSHJ PP,STMNT\r
+ SOS LITLVL\r
+ SKIPL STPX\r
+ PUSHJ PP,DSTOW\r
+ TLZN RC,-2\r
+ TRZE RC,-2\r
+ TRO ER,ERRE\r
+ MOVEM AC0,VECTOR\r
+ MOVEM RC,VECREL\r
+ PUSHJ PP,VARA\r
+ PUSHJ PP,LIT1\r
+ JUMP2 ENDP2\r
+ PUSHJ PP,UOUT\r
+ PUSHJ PP,REC2\r
+ PUSHJ PP,INZ\r
+\r
+PASS20: SETZM CTLSAV\r
+ PUSHJ PP,COUTI\r
+ PUSHJ PP,EOUT ;OUTPUT THE ENTRIES\r
+ PUSHJ PP,OUTSET\r
+ XWD 6,NOUT ;OUTPUT THE HISEG BLOCK\r
+PASS21: MOVEI 1\r
+ HRRM BLKTYP ;SET FOR TYPE 1 BLOCK\r
+ TLZ FR,P1!MWLFLG ;SET FOR PASS 2 AND TURN OFF FLAG\r
+ TLO IO,IOPALL ;PUT THESE BACK\r
+ TLZ IO,IOPROG!IOCREF!DEFCRS ;SO LISTINGS WILL BE THE WAY THEY SHOULD\r
+ TLNN FR,R1BSW\r
+ JRST STOWI\r
+ MOVE CS,[XWD $ST-1-$CKSM,R1BLDR]\r
+ MOVE C,0(CS)\r
+ PUSHJ PP,PTPBIN\r
+ AOBJN CS,.-2\r
+ PUSHJ PP,R1BI\r
+ JRST STOWI\r
+\f\r
+R1BLDR:\r
+ PHASE 0\r
+ IOWD $ADR,$ST\r
+$ST: CONO PTR,60\r
+ HRRI $A,$RD+1\r
+$RD: CONSO PTR,10\r
+ JRST .-1\r
+ DATAI PTR,@$TBL1-$RD+1($A)\r
+ XCT $TBL1-$RD+1($A)\r
+ XCT $TBL2-$RD+1($A)\r
+$A: SOJA $A,\r
+$TBL1: CAME $CKSM,$ADR\r
+ ADD $CKSM,1($ADR)\r
+ SKIPL $CKSM,$ADR\r
+$TBL2: JRST 4,$ST\r
+ AOBJN $ADR,$RD\r
+$ADR: JRST $ST+1\r
+$CKSM:\r
+ DEPHASE\r
+\r
+IF2,< PURGE $ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM>\r
+\fENDP2: PUSHJ PP,COUTD ;DUMP THE BUFFER\r
+IFN RENTSW,<\r
+ MOVE AC0,HHIGH\r
+ CAMN AC0,LOCO\r
+ HRRZM AC2,HHIGH\r
+>\r
+ TLNN FR,CREFSW\r
+ TLNN IO,IOCREF ;CLOSE CREF IF NECESSARY\r
+ SKIPA\r
+ PUSHJ PP,CLSCR2 ;CLOSE IT UP\r
+ HRR ER,OUTSW ;SET OUTPUT SWITCH\r
+ SKIPN TYPERR\r
+ TRO ER,TTYSW\r
+ PUSHJ PP,UOUT ;OUTPUT UNDEFINEDS\r
+ TRO ER,TTYSW\r
+ SKIPG C,ERRCNT ;GET ERROR COUNT AND CHECK FOR POSITIVE\r
+ JRST NOERW\r
+IFN CCLSW,<ADDM C,JOBERR ;REMEMBER ERROR COUNT FOR EXECUTION DELETION>\r
+ PUSHJ PP,OUTCR\r
+ MOVE C,ERRCNT\r
+ CAIN C,1 ;1 IS A SPECIAL CASE\r
+ JRST ONERW ;PRINT MESSAGE\r
+ MOVEI C,"?" ;? FOR BATCH\r
+ PUSHJ PP,OUTL ;...\r
+ MOVE C,ERRCNT ;PRINT NUMBER OF ERRORS\r
+ PUSHJ PP,DNC\r
+ SKIPA CS,[EXP ERRMS3] ;LOAD TO PRINT\r
+ONERW: MOVEI CS,ERRMS2 ;ONE ERROR DECTECTED\r
+ONERW1: PUSHJ PP,OUTSIX ;PRINT\r
+ JRST ENDP2D\r
+NOERW: MOVEI CS,ERRMS1\r
+ TLNE IO,CRPGSW ;IF RPG, DON'T PRINT MESSAGE\r
+ TRZ IO,TTYSW ;NO TTY OUTPUT\r
+ IOR IO,OUTSW ;UNLESS NEEDED FOR LISTING\r
+ PUSHJ PP,OUTCR\r
+ JRST ONERW1\r
+ENDP2D: PUSHJ PP,OUTCR\r
+IFN CCLSW,<TLNE IO,CRPGSW ;IF RPG, DON'T PRINT PGM BREAK\r
+ TRZ IO,TTYSW ;...>\r
+IFE CCLSW,< SKIPA ;SO PRGEND CODE CAN WORK>\r
+ IOR IO,OUTSW ;...\r
+ PUSHJ PP,OUTCR\r
+ MOVEI CS,[SIXBIT /PROGRAM BREAK IS @/]\r
+ PUSHJ PP,OUTSIX\r
+IFN RENTSW,<\r
+ HRLO CS,HHIGH ;GET PROGRAM BREAK\r
+ PUSHJ PP,UOUT1>\r
+ PUSHJ PP,OUTCR\r
+ TLNE FR,RIMSW!R1BSW ;RIM MODE?\r
+ PUSHJ PP,RIMFIN ;YES, FINISH IT\r
+ HRR IO,OUTSW\r
+ PUSHJ PP,OUTSET\r
+ XWD 2,SOUT ;OUTPUT THE SYMBOLS (BLKTYP-2)\r
+ PUSHJ PP,OUTSET\r
+ XWD 7,VOUT ;OUTPUT TRANSFER VECTOR (..-7)\r
+IFN RENTSW,<\r
+ PUSHJ PP,OUTSET\r
+ XWD 5,HOUT ;OUTPUT HIGHEST RELOCATABLE (..-5)>\r
+ PUSHJ PP,COUTD\r
+ JRST FINIS\r
+RIMFIN: TLNE FR,R1BSW\r
+ PUSHJ PP,R1BDMP\r
+ SKIPN C,VECTOR\r
+ MOVSI C,(JRST 4,)\r
+ TLNN C,777000\r
+ TLO C,(JRST)\r
+ PUSHJ PP,PTPBIN\r
+ MOVEI C,0\r
+ JRST PTPBIN\r
+\fSUBTTL PASS INITIALIZE\r
+INZ: AOS MODA\r
+ AOS MODO\r
+ PUSHJ PP,OUTFF\r
+ SETZM SEQNO\r
+ SETZM TAG\r
+ HRRI RX,^D8\r
+ MOVEI VARHD\r
+ MOVEM VARHDX\r
+ MOVEI LITHD\r
+ MOVEM LITHDX\r
+ PUSHJ PP,LITI\r
+ PUSHJ PP,STOWI\r
+ JRST OUTLI\r
+RCPNTR: POINT 1,ARG,^L<RELF>-18 ;POINT 1,ARG,22\r
+\fSUBTTL PSEUDO-OP HANDLERS\r
+\r
+TAPE0: PUSHJ PP,STOUTS\r
+ JRST GOTEND\r
+\r
+RADIX0: PUSHJ PP,EVAL10 ;EVALUATE RADIX D10\r
+ CAIG AC0,^D10 ;IF GREATER THAN 10\r
+ CAIG AC0,1 ;OR LESS THAN 2.\r
+ERRAX: TROA ER,ERRA ;FLAG ERROR AND SKIP\r
+ HRR RX,AC0 ;SET NEW RADIX\r
+ POPJ PP,\r
+\r
+IOSET: JUMP1 POPOUT ;NOSYM (IONSYM), XALL (IOPALL), XLIST (IOPROG)\r
+ HLRZ SX,AC0 ;STORE FLAGS\r
+ PUSHJ PP,STOUTS ;POLISH OFF LINE\r
+ TLOA IO,0(SX) ;NOW SUPPRESS PRINTING\r
+IORSET: TDZ IO,AC0 ;RESET FLAG IOPALL/IOPROG\r
+ POPJ PP,\r
+\r
+BLOCK0: PUSHJ PP,HIGHQ \r
+ PUSHJ PP,EVALEX ;EVALUATE\r
+ TRZE RC,-1 ;EXTERNAL OR RELOCATABLE?\r
+ PUSHJ PP,QEXT ;UPDATE ASSEMBLY LOCATION\r
+ ADDM AC0,LOCO ;SAVE START OF BLOCK\r
+BLOCK1: EXCH AC0,LOCA ;UPDATE OUTPUT LOCATION\r
+ ADDM AC0,LOCA\r
+BLOCK2: HRLOM AC0,LOCBLK\r
+ JUMP2 POPOUT\r
+ TRNE ER,ERRU\r
+ TRO ER,ERRV\r
+ POPJ PP,\r
+\f\r
+PRINT0: MOVNI AC0,5\r
+ ADDM AC0,ERRCNT\r
+ TRO ER,400000\r
+ POPJ PP,\r
+\r
+REMAR0: PUSHJ PP,GETCHR\r
+ CAIE C,EOL\r
+ JRST REMAR0\r
+ POPJ PP,\r
+\fLIT0: PUSHJ PP,BLOCK1\r
+LIT1: JUMP2 LIT20\r
+\r
+;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR\r
+\r
+ PUSHJ PP,STOUTS\r
+ MOVE AC0,LITCNT\r
+ MOVE SX,LITHDX\r
+ HRLM AC0,0(SX)\r
+ MOVE V,LOCA\r
+ HRL V,MODA\r
+ MOVEM V,-1(SX)\r
+ JRST LIT24\r
+\r
+LIT20: PUSH PP,LOCA\r
+ PUSH PP,LOCO\r
+ SKIPN LITNUM\r
+ JRST LIT20A\r
+ MOVE SX,LITHDX\r
+ HRRZ AC0,-1(SX)\r
+ CAME AC0,LOCA\r
+ TRO ER,ERRP\r
+LIT20A: PUSHJ PP,STOUTS\r
+ MOVE SX,LITAB\r
+LIT21: SOSGE LITNUM\r
+ JRST LIT22\r
+ MOVE AC0,-2(SX) ;WFW\r
+ MOVE RC,-1(SX) ;WFW\r
+ MOVE SX,0(SX) ;WFW POINTER TO THE NEXT LIT\r
+ PUSHJ PP,STOW20 ;STOW CODE\r
+ MOVEI C,12 ;SET LINE FEED\r
+ IDPB C,LBUFP\r
+ PUSHJ PP,OUTLIN ;OUTPUT THE LINE\r
+ JRST LIT21\r
+\fLIT22: HRRZ AC2,LOCO\r
+ POP PP,LOCO\r
+ POP PP,LOCA\r
+ MOVE SX,LITHDX\r
+ HLRZ AC0,0(SX)\r
+ SUB AC2,LOCO ;COMPUTE LENGTH USED\r
+ CAMGE AC0,AC2 ;USE LARGER\r
+ MOVE AC0,AC2\r
+ ADD AC2,LOCO\r
+LIT24: ADDM AC0,LOCA\r
+ ADDM AC0,LOCO\r
+ PUSHJ PP,GETTOP\r
+ HRRM SX,LITHDX\r
+LITI: SETZM LITCNT\r
+ SETZM LITNUM\r
+ MOVEI LITAB\r
+ MOVEM LITABX\r
+ JRST HIGHQ\r
+GETTOP: HRRZ AC1,SX ;VARHD\r
+ HRRZ SX,0(SX)\r
+ JUMPN SX,POPOUT\r
+ MOVEI SX,3 ;WFW\r
+ ADDB SX,FREE\r
+ CAML SX,SYMBOL\r
+ PUSHJ PP,XCEED\r
+ SETZM 0(SX) ;CLEAR FORWARE LINK\r
+ HRRM SX,0(AC1) ;STORE ADDRESS IN LAST LINK\r
+ POPJ PP,\r
+\fVAR0: PUSHJ PP,BLOCK1 ;PRINT LOCATION\r
+ PUSHJ PP,VARA\r
+ JRST STOUTS\r
+\r
+VARA: MOVE SX,VARHDX\r
+ MOVE AC0,LOCA ;GET LOCATION FOR CHECK\r
+ JUMP1 VARB ;DO NOT CHECK START ON PASS 1\r
+ CAME AC0,-1(SX) ;CHECK START OF VAR AREA\r
+ TRO ER,ERRP ;AND GIVE ERROR\r
+VARB: MOVEM AC0,-1(SX) ;SAVE START FOR PASS 2\r
+ HLRZ AC0,0(SX)\r
+ ADDM AC0,LOCA\r
+ ADDM AC0,LOCO\r
+ PUSHJ PP,GETTOP\r
+ HRRM SX,VARHDX\r
+ JUMP2 POPOUT\r
+\r
+ PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN\r
+ TRZN ARG,VARF\r
+ POPJ PP, ;NO, EXIT\r
+ TRZ ARG,UNDF ;TURN OFF FLAG NOW\r
+ MOVSI V,1 ;NUMBER TO ADD TO\r
+ ADDM V,0(AC1) ;UPDATE COUNT\r
+VARA1: IOR ARG,MODA ;SET TO ASSEMBLY MODE\r
+ HRL ARG,LOCA\r
+\r
+ MOVSM ARG,0(SX) ;UPDATE 2ND WRD OF SYM TAB ENTRY\r
+ AOS LOCA\r
+ AOS LOCO\r
+ JRST HIGHQ1\r
+\fIF: PUSH PP,AC0 ;SAVE AC0\r
+ PUSH PP,IO\r
+ PUSHJ PP,EVALXQ ;EVALUATE AND TEST EXTERNAL\r
+ POP PP,AC1\r
+ SKIPL AC1\r
+ TLZ IO,FLDSW\r
+IFPOP: POP PP,AC1 ;RETRIEVE SKIP INSTRUCTION\r
+IFSET: TLO IO,IORPTC ;REPEAT CHARACTER\r
+IFXCT: XCT AC1 ;EXECUTE INSTRUCTION\r
+ TDZA AC0,AC0 ;FALSE\r
+ MOVEI AC0,1 ;TRUE\r
+IFEXIT: JUMPOC REPEA1 ;BRANCH IF IN OP-CODE FIELD\r
+IFEX1: PUSHJ PP,GETCHR ;SEARCH FOR "<"\r
+ CAIN C,EOL ;ERROR IF END OF LINE\r
+ JRST ERRAX\r
+ CAIE C,34\r
+ JRST IFEX1\r
+ JUMPE AC0,IFEX2 ;TEST FOR 0\r
+ TLO IO,IORPTC ;NO, PROCESS AS CELL\r
+ PUSHJ PP,CELL\r
+ JRST STOW ;STOW CODE AND EXIT\r
+\r
+IFPASS: TLZ 14,4\r
+ HRRI AC0,P1 ;MAKE IT TLNX IO,P1\r
+ MOVE AC1,AC0 ;PLACE IT IN AC1\r
+ JRST IFSET ;EXECUTE INSTRUCTION\r
+\r
+IFB0: HLLO AC1,AC0 ;FORM AND STORE TEST INSTRUCTION\r
+IFB2: PUSHJ PP,CHARAC ;GET FIRST NON-BLANK\r
+ CAIN C,74\r
+ AOJA RC,IFB2\r
+ CAIN C,76\r
+ SOJLE RC,IFXCT\r
+ CAIE C," " ;BLANK\r
+ TRO AC0,0(RC)\r
+ JRST IFB2\r
+\fIFDEF0: HRRI AC0,UNDF ;MAKE IT TLNX ARG,UNDF\r
+ PUSH PP,AC0 ;STACK IT\r
+ PUSHJ PP,GETSYM ;TAKES SKIP RETURN IF SYM NAME IS LEGAL\r
+ TROA ER,ERRA ;ILLEGAL!\r
+ PUSHJ PP,SEARCH\r
+ JRST [PUSHJ PP,OPTSCH\r
+ TLO ARG,UNDF\r
+ JRST .+1]\r
+ PUSHJ PP,SSRCH3 ;EMIT TO CREF ANYWAY\r
+ JRST IFPOP\r
+\r
+\fIFIDN0: HLRZS AC0\r
+ MOVEI V,2*.IFBLK-1\r
+ SETZM IFBLK(V) ;CLEAR COMPARISON BLOCK\r
+ SOJGE V,.-1\r
+ MOVEI RC,IFBLK ;SET FOR FIRST BLOCK\r
+ PUSHJ PP,IFCL ;GET FIRST STRING\r
+ MOVEI RC,IFBLKA\r
+ PUSHJ PP,IFCL ;GET SECOND STRING\r
+ MOVEI V,.IFBLK-1\r
+ MOVE SX,IFBLK(V) ;GET WORD FROM FIRST STRING\r
+ CAMN SX,IFBLKA(V) ;COMPARE WITH SECOND STRING\r
+ SOJGE V,.-2 ;EQUAL, TRY NEXT WORD\r
+ SKIPL V ;DID WE FINISH STRING\r
+ XORI AC0,1 ;NO, TOGGLE REQUEST\r
+ JRST IFEXIT ;DO NOT TURN ON IORPTC WFW\r
+\r
+IFCL: HRLI RC,(POINT 7,,)\r
+IFCL1: PUSHJ PP,CHARAC ;GET AND LIST CHARACTERS\r
+ CAIE C,74 ;SKIP SPACES\r
+ JRST IFCL1\r
+ MOVEI SX,30\r
+IFCL2: PUSHJ PP,CHARAC\r
+ CAIN C,76\r
+ POPJ PP,\r
+ IDPB C,RC\r
+ SOJLE SX,POPOUT\r
+ JRST IFCL2\r
+\f\r
+IFEX2: PUSHJ PP,GETCHR\r
+ CAIN C,EOL ;EXIT WITH ERROR IF END OF LINE\r
+ JRST ERRAX\r
+ CAIN C,34 ;"<"?\r
+ AOJA IFEX2 ;YES, INCREMENT COUNT\r
+ CAIE C,36 ;">"?\r
+ JRST IFEX2 ;NO, TRY AGAIN\r
+ SOJGE IFEX2 ;YES, TEST FOR MATCH\r
+ PUSHJ PP,BYPAS1 ;YES, MOVE TO NEXT DELIMITER\r
+ AOJA AC0,STOWZ ;STOW ZERO\r
+\r
+\r
+INTER0: HLLZM AC0,INTENT ;AC0 CONTAINS INTF/ENTF FLAGS\r
+\r
+INTER1: PUSHJ PP,GETSYM ;GET A SYMBOL\r
+ JRST INTER3 ;INVALID, SKIP\r
+ PUSHJ PP,SSRCH ;SEARCH THE TABLE\r
+ MOVSI ARG,SYMF!INTF!UNDF\r
+ TLNE ARG,UNDF ;ALLOW FORWARD REFERENCE\r
+ TRO ER,ERRA\r
+ TLNN ARG,SYNF!EXTF\r
+ TDOA ARG,INTENT ;SET APPROPRIATE FLAGS\r
+INTER3: TROA ER,ERRA ;FLAG ARG EROR AND SKIP\r
+ PUSHJ PP,INSERQ ;INSERT/UPDATE\r
+ JUMPCM INTER1\r
+ POPJ PP, ;NO, EXIT\r
+\fEXTER0: PUSHJ PP,GETSYM ;GET A SYMBOL\r
+ JRST EXTER3 ;INVALID, ERROR\r
+ PUSHJ PP,SSRCH ;OK, SEARCH SYMBOL TABLE\r
+ JRST EXTER2 ;NOT THER, INSERT IT\r
+ TLNN ARG,EXTF!VARF!UNDF\r
+ TROA ER,ERRE ;FLAG ERROR AND BYPASS\r
+ TLNE ARG,EXTF ;VALID, ALREADY DEFINED\r
+ JRST EXTER3\r
+EXTER2: MOVEI V,2 ;NO, GET 2 CELLS FROM THE TREE\r
+ ADDB V,FREE\r
+ CAML V,SYMBOL ;HAVE WE RUN OUT OF CORE?\r
+ PUSHJ PP,XCEEDS ;YES, TRY TO BORROW SOME MORE\r
+ SUBI V,1 ;GET RIGHT CELL FOR POINTER\r
+ SETZB RC,0(V) ;ALL SET, ZERO VALUES\r
+ MOVSI ARG,SYMF!EXTF\r
+ PUSHJ PP,INSERT ;INSERT/UPDATE IT\r
+ MOVSI ARG,PNTF\r
+ IORM ARG,0(SX)\r
+ MOVE ARG,-1(SX) ;GET THE SIXBIT FOR THE NAME\r
+ MOVEM ARG,1(V) ;AND STORE IT FOR ADDITIVE GLOBAL FIXUPS\r
+EXTER3: JUMPCM EXTER0\r
+ POPJ PP, ;NO EXIT\r
+\fEVAL10: PUSH PP,RX\r
+ HRRI RX,^D10\r
+ PUSHJ PP,EVALEX ;EVALUATE\r
+ POP PP,RX ;RESET RADIX\r
+ JUMPE RC,POPOUT ;EXIT IF ABSOLUTE\r
+\r
+QEXT: SKIPE EXTPNT ;ANY POSSIBILITIES?\r
+ TROA ER,ERRE ;YES, FLAG EXTERNAL ERROR\r
+ TRO ER,ERRR ;NO, FLAG RELOCATION ERROR\r
+ HLLZS RC ;CLEAR RELOCATION/EXTERNAL\r
+ POPJ PP,\r
+\r
+EVALXQ: PUSHJ PP,EVALEX ;EVALUTE EXPRESSION\r
+ TLZN RC,-2 ;WAS AN EXTERNAL FOUND?\r
+ TRZE RC,-2\r
+ TRO ER,ERRE ;YES, FLAG ERROR\r
+ POPJ PP, ;RETURN\r
+\fOPDEF0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL\r
+ POPJ PP, ;ERROR IF INVALID SYMBOL\r
+ CAIE C,73 ;"["?\r
+ JRST ERRAX ;NO, ERROR\r
+ PUSH PP,AC0 ;STACK MNEMONIC\r
+ AOS LITLVL ;SHORT OUT LOCATION INCREMENT\r
+ PUSHJ PP,STMNT ;EVALUATE STATEMENT\r
+ PUSHJ PP,DSTOW ;GET AND DECODE VALUE\r
+ SOS LITLVL\r
+ EXCH AC0,0(PP) ;EXCHANGE VALUE FOR MNEMONIC\r
+ PUSH PP,RC ;STACK RELOCATION\r
+ TLO IO,DEFCRS ;SAY WE ARE DEFINING IT\r
+ PUSHJ PP,MSRCH ;SEARCH SYMBOL TABLE\r
+ MOVSI ARG,OPDF ;NOT FOUND\r
+ POP PP,RC ;RESTORE VALUES\r
+ POP PP,V\r
+ TLNE ARG,SYNF!MACF\r
+ JRST ERRAX ;YES "A" ERROR\r
+ PUSHJ PP,INSERT ;NO, INSERT/UPDATE\r
+ TLZ IO,DEFCRS ;JUST IN CASE\r
+ PUSHJ PP,BYPAS1\r
+ JRST STOWI ;BE SURE STOW IS RESET\r
+\r
+\r
+DEPHA0: MOVE AC0,LOCO\r
+ SKIPA RC,MODO ;SET TO OUTPUT VALUES AND SKIP\r
+PHASE0: PUSHJ PP,EVALXQ ;EVALUATE AND CHECK FOR EXTERNAL\r
+ MOVEM AC0,LOCA ;SET ASSEMBLY LOCATION COUNTER\r
+ MOVEM RC,MODA\r
+ JRST BLOCK2\r
+\fASSIGN: JUMPAD ERRAX ;NO, ERROR\r
+ PUSHJ PP,ASSIG1\r
+ HRROM RC,ASGBLK\r
+ MOVEM V,LOCBLK\r
+ POPJ PP,\r
+\r
+ASSIG1: PUSH PP,AC0\r
+ MOVEI AC0,0\r
+ PUSHJ PP,GETCHR\r
+ CAIN C,35 ;EQUALS?\r
+ TLOA AC0,NOOUTF ;YES, NOT OUT TO DDT WFW\r
+ TLO IO,IORPTC\r
+ MOVEM AC0,HDAS ;STORE THESE BITS WFW\r
+ SETZM EXTPNT\r
+ PUSHJ PP,EVALEX ;EVALUATE EXPRESSION\r
+ EXCH AC0,0(PP) ;SWAP VALUE FOR SYMBOL\r
+ PUSH PP,RC\r
+ TRNN RC,-2 ;CHECK EXTERNAL AGREEMENT\r
+ JRST ASSIG2\r
+ HRRZS RC\r
+ HRRZ ARG,EXTPNT\r
+ CAME RC,ARG\r
+ JRST ASSIG4\r
+ASSIG2: HLRZ RC,0(PP)\r
+ TRNN RC,-2\r
+ JRST ASSIG3\r
+ HLRZ ARG,EXTPNT\r
+ CAME RC,ARG\r
+ JRST ASSIG4\r
+ASSIG3: TLO IO,DEFCRS\r
+ PUSHJ PP,SSRCH\r
+ MOVSI ARG,400000\r
+ IOR ARG,HDAS\r
+ TLZA ARG,UNDF!VARF!40 ;CANCEL UNDEFINED AND VARIABLE FLAGS\r
+ASSIG4: TRO ER,ERRE\r
+ SETZM EXTPNT ;FOR REST OF WORLD\r
+ TRNE ER,ERRORS-ERRQ\r
+ TLO ARG,UNDF ;YES,SO TURN UNDF ON\r
+ POP PP,RC\r
+ POP PP,V\r
+ TLNE ARG,TAGF!EXTF\r
+ JRST ERRAX\r
+ JRST INSERT\r
+\fLOC0: PUSHJ PP,HIGHQ ;AC0=0,0\r
+ HRR AC0,LOCO\r
+ EXCH AC0,RELLOC\r
+ PUSHJ PP,BYPAS1\r
+ TLO IO,IORPTC\r
+ CAIE C,EOL\r
+ PUSHJ PP,EVALXQ\r
+ HLL AC0,RELLOC\r
+ HRRZM AC0,LOCA ;SET ASSEMBLY LOCATION\r
+ HRRZM AC0,LOCO ;AND OUTPUT LOCATION\r
+ HLRZM AC0,MODA ;SET MODE\r
+ HLRZM AC0,MODO\r
+ JRST BLOCK2\r
+\f\r
+IFN RENTSW,<\r
+HISEG0: PUSHJ PP,HIGHQ ;SET CURRENT PROGRAM BREAK\r
+ PUSHJ PP,COUTD ;DUMP CURRENT TYPE OF BLOCK\r
+ PUSH PP,BLKTYP\r
+ MOVEI AC0,3\r
+ MOVEM AC0,BLKTYP\r
+ PUSHJ PP,BYPAS1 ;GO GET EXPRESSION\r
+ TLO IO,IORPTC\r
+ PUSHJ PP,EVALXQ ;CHECK FOR EXTERNAL\r
+ HRRZM AC0,LOCA ;SET LOC COUNTERS\r
+ HRRZM AC0,LOCO\r
+ MOVEI RC,1 ;ASSUME RELOCATABLE\r
+ PUSHJ PP,COUT\r
+ MOVEM RC,MODA ;SET MODES\r
+ MOVEM RC,MODO\r
+ PUSHJ PP,COUTD\r
+ POP PP,BLKTYP\r
+ JRST BLOCK2\r
+\fHIGHQ: JUMP1 POPOUT\r
+HIGHQ1: SKIPN MODO\r
+ POPJ PP,\r
+ MOVE V,LOCO ;GET ASSEMBLY LOCATION\r
+ CAMLE V,HHIGH ;IS IT GREATER THAN "HIGH"?\r
+ MOVEM V,HHIGH ;YES, REPLACE WITH LARGER VALUE\r
+ POPJ PP,>\r
+IFE RENTSW,<\r
+HIGHQ: JUMP1 POPOUT\r
+HIGHQ1: MOVE V,LOCO\r
+ POPJ PP,\r
+>\r
+ONML: TLOA FR,MWLFLG ;MULTI-WORD LITERALS OK\r
+OFFML: TLZ FR,MWLFLG\r
+ POPJ PP,\r
+SUPRE0: PUSHJ PP,GETSYM ;GET A SYMBOL TO SUPRES\r
+ JRST SUPRE1 ;ERROR\r
+ PUSHJ PP,SSRCH ;SYMBOL ONLY\r
+ JRST SUPRE1 ;GIVE ERROR MESSAGE\r
+ TLOA ARG,SUPRBT ;SET THE SUPRESS BIT\r
+SUPRE1: TROA ER,ERRA\r
+ IORM ARG,(SX) ;PUT BACK\r
+ JUMPCM SUPRE0\r
+SUPRS1: SETZM EXTPNT\r
+ POPJ PP,\r
+\r
+SUPRSA: PUSHJ PP,LOOKUP ;SUPRESS ALL\r
+ MOVSI ARG,SUPRBT\r
+ IORM ARG,(SX)\r
+ SETZM EXTPNT ;JUST IN CASE\r
+ POPJ PP,\r
+\r
+\fTITLE0: JUMP2 REMAR0\r
+ MOVEI SX,.TBUF-1\r
+ HRRI AC0,TBUF\r
+ PUSHJ PP,SUBTT1 ;GO READ IT\r
+ TLOE IO,IOTLSN ;HAVE WE SEEN ONE\r
+IFE CCLSW,<TRO ER,ERRM ;YES, COMPLAIN>\r
+IFN CCLSW,<TROA ER,ERRM ;YES, MESSAGE\r
+ JRST PRNAM ;PRINT NAME IF FIRST ONE>\r
+ POPJ PP, ;EXIT OTHERWISE\r
+\r
+SUBTT0: JUMP1 REMAR0 ;OTHERWISE EXIT IF PASS ONE\r
+ MOVEI SX,.SBUF-1\r
+ HRRI SBUF\r
+SUBTT1: PUSHJ PP,BYPAS1 ;BYPASS LEADING BLANKS\r
+ TLO IO,IORPTC\r
+SUBTT3: PUSHJ PP,CHARAC ;GET ASCII CHARACTER\r
+ IDPB C,AC0 ;STORE IN BLOCK\r
+ CAIGE C,40 ;TEST FOR TERMINATOR\r
+ CAIN C,HT\r
+ SOJGE SX,SUBTT3 ;TEST FOR BUFFER FULL\r
+ DPB RC,AC0 ;END, STORE TERMINATOR\r
+ POPJ PP,\r
+IFN CCLSW,<\r
+PRNAM: TLNN IO,CRPGSW ;NOT IF NOT RPG\r
+ POPJ PP,\r
+ MOVE AC0,[POINT 7,TBUF]\r
+ MOVE SX,[POINT 7,OTBUF]\r
+ MOVEI RC,6 ;MAX OF SIX CHRS\r
+PN1: ILDB C,AC0\r
+ CAILE C," " ;CHECK FOR LEGAL\r
+ CAILE C,"Z"+40 ;CHECK AGAINST LOWER CASE Z\r
+ JRST PN2\r
+ IDPB C,SX ;PUT IN OUTPUT BUFFER\r
+ SOJG RC,PN1 ;GET MORE\r
+PN2: MOVEI C,0\r
+ IDPB C,SX ;TERMINATOR\r
+ MOVEI C,OTBUF\r
+ DDTOUT C,\r
+ MOVEI C,[ASCIZ /\r
+/]\r
+ DDTOUT C,\r
+ POPJ PP,\r
+>\r
+\fSYN0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL\r
+ JRST ERRAX ;ERROR, EXIT\r
+ PUSHJ PP,MSRCH ;TRY FOR MACRO/OPDEF\r
+ JRST SYN3 ;NO,0THRY FOR OPERAND\r
+SYN1: MOVEI SX,MSRCH ;YES, SET FLAG\r
+SYN2: PUSHJ PP,SAVEXS ;SAVE REGISTERS\r
+ JUMPNC ERRAX ;ERROR IF NO COMMA\r
+ PUSHJ PP,GETSYM ;GET THE SECOND SYMBOL\r
+ POPJ PP,\r
+ PUSHJ PP,@SAVBLK+SX ;SEARCH FOR SECOND SYMBOL\r
+ JFCL\r
+ MOVE ARG,SAVBLK+ARG ;GET VALUES\r
+ MOVE RC,SAVERC\r
+ MOVE V,SAVBLK+V\r
+ TLNE ARG,MACF ;MACRO?\r
+ PUSHJ PP,REFINC ;YES, INCREMENT REFERENCE\r
+ JRST INSERT ;INSERT AND EXIT\r
+\r
+SYN3: PUSHJ PP,SSRCH ;SEARCH FOR OPERAND\r
+ JRST SYN4 ;NOT FOUND, EXIT WITH ERROR\r
+ TLO ARG,SYNF ;FLAG AS SYNONYM\r
+ TLNE ARG,EXTF ;EXTERNAL?\r
+ HRRZ V,ARG ;YES, RELPACE WITH POINTER\r
+ MOVEI SX,SSRCH ;SET FLAG\r
+ JRST SYN2\r
+\r
+SYN4: PUSHJ PP,OPTSCH ;SEARCH FOR OP-CODE\r
+ JRST ERRAX ;NOT FOUND, EXIT WITH ERROR\r
+ MOVSI ARG,SYNF ;FLAG AS SYNONYM\r
+ JRST SYN1\r
+\fPURGE0: PUSHJ PP,GETSYM ;GET A MNEMONIC\r
+ JRST PURGE5\r
+ PUSHJ PP,MSRCH ;SEARCH MACRO SYMBOL TABLE\r
+ JRST PURGE2 ;NOT FOUND, TRY SYMBOLS\r
+ TLNE ARG,MACF ;MACRO?\r
+ PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE\r
+ JRST PURGE4 ;REMOVE SYMBOL FROM TABLE\r
+\r
+PURGE2: PUSHJ PP,SSRCH ;TRY OPERAND SYMBOL TABLE\r
+ JRST PURGE3 ;NOT FOUND GET NEXT SYMBOL\r
+ TRNN RC,-2 ;CHECK COMPLEX EXTERNAL\r
+ TLNE RC,-2\r
+ TLNE ARG,SYNF\r
+ SKIPA\r
+ JRST PURGE3\r
+ TLNE ARG,EXTF!UNDF ;ERROR IF EXTERNAL OR UNDEFINED\r
+ TLNE ARG,SYNF ;BUT NOT A SYNONYM \r
+ JRST PURGE4\r
+PURGE3: TROA ER,ERRA ;NOT FOUND, ERROR\r
+PURGE4: PUSHJ PP,REMOVE ;REMOVE FROM THE SYMBOL TABLE\r
+PURGE5: JUMPCM PURGE0\r
+ POPJ PP, ;EXIT\r
+\fOPD1: MOVE AC0,V ;PUT VALUE IN AC0\r
+OP:\r
+OPD: SKIPA 2,[POINT 4,0(PP),12]\r
+IOP: MOVSI AC2,(POINT 9,0(PP),11)\r
+ PUSH PP,RC\r
+ PUSH PP,AC0 ;STACK CODE\r
+ PUSH PP,AC2\r
+ PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION\r
+ POP PP,AC2\r
+ JUMPNC OP2\r
+ LDB AC1,AC2\r
+ ADD AC1,AC0\r
+ DPB AC1,AC2\r
+ SKIPE RC ;EXTERNAL OR RELOCATABLE?\r
+ PUSHJ PP,QEXT ;YES, DETERMINE WHICH AND FLAG AN ERROR\r
+OP1A: PUSHJ PP,EVALEX ;GET ADDRESS PART\r
+OP2: PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS\r
+OP3: POP PP,AC0 ;PUT IN AC0\r
+ POP PP,RC\r
+ JRST STOW ;NO,STOW CODE AND EXIT\r
+\fEVADR: TLCE AC0,-1 ;OK IF ALL 0'S\r
+ TLNN AC0,-1\r
+ SKIPA\r
+ TRO ER,ERRQ ;NO,FLAG Q ERROR\r
+ ADD AC0,-1(PP) ;ADD ADDRESS PORTIONS\r
+ HLL AC0,-1(PP) ;GET LEFT HALF\r
+ TLZE FR,INDSW ;INDIRECT BIT?\r
+ TLO AC0,20\r
+ MOVEM AC0,-1(PP) ;RE-STACK CODE\r
+ ADD RC,-2(PP) ;UPDATE RELOCATION\r
+ HRRM RC,-2(PP) ;USE HALF WORD ADD\r
+ CAIE C,10 ;"("?\r
+ POPJ PP, ;NO, EXIT\r
+ MOVSS EXTPNT ;WFW\r
+ PUSHJ PP,EVALEX ;EVALUATE\r
+ MOVSS EXTPNT ;WFW\r
+ MOVSS V,AC0 ;SWAP HALVES\r
+ MOVSS SX,RC\r
+ IOR SX,V ;MERGE RELOCATION\r
+ TRNN SX,-1 ;RIGHT HALF ZERO?\r
+ JRST OP2A ;YES, DO SIMPLE ADD\r
+ MOVE ARG,RC ;NO, SWAP RC INTO ARG\r
+ ADD V,-1(PP) ;ADD RIGHT HALVES\r
+ ADD ARG,-2(PP)\r
+ HRRM V,-1(PP) ;UPDATE WITHOUT CARRY\r
+ HRRM ARG,-2(PP)\r
+ HLLZS AC0 ;PREPARE LEFT HALVES\r
+ HLLZS RC\r
+ TLNE SX,-1 ;IS LEFT HALF ZERO?\r
+ TRO ER,ERRQ ;NO FLAG FORMAT ERROR\r
+OP2A: ADDM AC0,-1(PP) ;MERGE WITH PREVIOUS VALUE\r
+ ADDM RC,-2(PP)\r
+ CAIE C,11 ;")"?\r
+ JRST ERRAX ;NO, FLAG ERROR\r
+ JRST BYPAS1 ;YES, BYPASS PARENTHESIS\r
+\r
+EXPRES: HRLZ AC0,RX ;FUDGE FOR OCT0\r
+\r
+OCT0: PUSH PP,RX\r
+ HLR RX,AC0\r
+OCT1: PUSHJ PP,EVALEX ;EVALUATE\r
+ PUSHJ PP,STOW ;STOW CODE\r
+ JUMPCM OCT1\r
+ POP PP,RX ;YES, RESTORE RADIX\r
+ POPJ PP, ;EXIT\r
+\fSIXB10: MOVSI RC,(POINT 6,AC0);SET UP POINTER\r
+ MOVEI AC0,0 ;CLEAR WORD\r
+\r
+SIXB20: PUSHJ PP,CHARL ;GET NEXT CHARACTER\r
+ CAMN C,SX ;IS THIS PRESET DELIMITER?\r
+ JRST ASC60 ;YES\r
+ CAIL C,"A"+40\r
+ CAILE C,"Z"+40\r
+ SKIPA \r
+ SUBI C,40 ;CONVERT LOWER CASE TO SIXBIT\r
+ SUBI C,40 ;CONVERT TO SIXBIT\r
+ JUMPL C,ASC55 ;TEST FOR INVALID CHARACTER\r
+ IDPB C,RC ;NO, DEPOSIT THE BYTE\r
+ TLNE RC,770000 ;IS THE WORD FULL?\r
+ JRST SIXB20 ;NO, GET NEXT CHARACTER\r
+ PUSHJ PP,STOWZ ;YES, STORE\r
+ JRST SIXB10 ;GET NEXT WORD\r
+\fASCII0: HLLZ SDEL,AC0 ;STORE ASCII/ASCIZ FLAG\r
+ASC10: PUSHJ PP,CHARL ;GET FIRST NON-BLANK\r
+ CAIE C," "\r
+ CAIN C,HT\r
+ JRST ASC10\r
+ CAIG C,CR ;CHECK FOR CRRET AS DELIM\r
+ CAIGE C,LF\r
+ SKIPA\r
+ JRST ERRAX\r
+ MOVE SX,SEQNO2\r
+ MOVEM SX,TXTSEQ\r
+ MOVE SX,PAGENO\r
+ MOVEM SX,TXTPG\r
+ SETOM INTXT\r
+ MOVE SX,C ;SAVE FOR COMPARISON\r
+ JUMPG SDEL,SIXB10 ;BRANCH IF SIXBIT\r
+\r
+ASC20: MOVSI RC,(POINT 7,AC0) ;SET UP POINTER\r
+ MOVEI AC0,0 ;CLEAR WORD\r
+ASC30: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST\r
+ CAMN C,SX ;TEST FOR DELIMITER\r
+ JRST ASC50 ;FOUND\r
+ IDPB C,RC ;DEPOSIT BYTE\r
+ TLNE RC,760000 ;HAVE WE FINISHED WORD?\r
+ JRST ASC30 ;NO,GET NEXT CHARACTER\r
+ PUSHJ PP,STOWZ ;YES, STOW IT\r
+ JRST ASC20 ;GET NEXT WORD\r
+\r
+ASC50: TDZA RC,SDEL ;TEST FOR ASCIIZ\r
+ASC55: TROA ER,ERRA ;SIXBIT FOUND EXIT\r
+ASC60: PUSHJ PP,BYPAS1 ;POLISH OFF TERMINATE\r
+ SETZM INTXT ;WE ARE OUT OF IT\r
+ ANDCM RC,STPX ;STORE AT LEAST ONE WORD\r
+ JUMPGE RC,STOWZ ;STOW\r
+ POPJ PP, ;ASCII, NO BYTES STORED, SO EXIT\r
+\fPOINT0: PUSH PP,RC ;STACK REGISTERS\r
+ PUSH PP,AC0\r
+ PUSHJ PP,EVAL10 ;EVALUATE RADIX 10\r
+ DPB AC0,[POINT 6,0(PP),11] ;STORE BYTE SIZE\r
+ JUMPNC POINT2\r
+ PUSHJ PP,EVALEX ;NO, GET ADDRESS\r
+ PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS\r
+ JUMPNC POINT2\r
+ PUSHJ PP,EVAL10 ;EVALUATE RADIX 10\r
+ TLNE IO,NUMSW ;IF NUMERIC\r
+ TDCA AC0,[-1] ;POSITION=D35-RHB\r
+POINT2: MOVEI AC0,0 ;OTHERWISE SET TO D36\r
+ ADDI AC0,^D36\r
+ LSH AC0,^D30\r
+ ADDM AC0,0(PP) ;UPDATE VALUE\r
+ JRST OP3\r
+\fXWD0: PUSH PP,RC\r
+ PUSH PP,AC0 ;STORE ZERO ON STACK\r
+ PUSHJ PP,EVALEX ;EVALUATE EXPRESSION\r
+ JUMPNC OP2\r
+ HRLM AC0,0(PP) ;SET LEFT HALF\r
+ HRLM RC,-1(PP)\r
+ MOVSS EXTPNT ;WFW\r
+ JRST OP1A ;EXIT THROUGH OP\r
+\r
+IOWD0: PUSHJ PP,EVALXQ ;EVALUATE AND TEST FOR EXTERNAL\r
+ CAIE C,14 ;","?\r
+ SOJA AC0,STOW ;NO, TREAT AS RIGHT HALF\r
+ PUSH PP,AC0 ;YES, STACK LEFT HALF\r
+ PUSHJ PP,EVALEX ;WFW\r
+ SUBI AC0,1\r
+ POP PP,AC1 ;RETRIEVE LEFT HALF\r
+ MOVNS AC1\r
+ HRL AC0,AC1\r
+ JRST STOW ;STOW CODE AND EXIT\r
+\fBYTE0: PUSHJ PP,BYPAS1 ;GET FIRST NON-BLANK\r
+ CAIE C,10 ;"("?\r
+ JRST ERRAX ;NO, FLAG ERROR AND EXIT\r
+ PUSH PP,RC\r
+ PUSH PP,AC0 ;INITIALIZE STACK TO ZERO\r
+ MOVSI ARG,(POINT -1,(PP))\r
+\r
+BYTE1: PUSH PP,ARG\r
+ PUSHJ PP,EVAL10 ;EVALUATE RADIX 10\r
+ POP PP,ARG\r
+ CAIG AC0,^D36 ;TEST SIZE\r
+ CAIGE AC0,0\r
+ TRO ER,ERRA\r
+ DPB AC0,[POINT 6,ARG,11] ;STORE BYTE SIZE\r
+\r
+BYTE2: IBP ARG ;INCREMENT BYTE\r
+ TRZN ARG,-1 ;OVERFLOW?\r
+ JRST BYTE3 ;NO\r
+ SETZB AC0,RC ;YES\r
+ EXCH AC0,0(PP) ;GET CURRENT VALUES\r
+ EXCH RC,-1(PP) ;AND STACK ZEROS\r
+ PUSHJ PP,STOW ;STOW FULL WORD\r
+\r
+BYTE3: PUSH PP,ARG\r
+ PUSHJ PP,EVALEX ;COMPUTE NEXT BYTE\r
+ POP PP,ARG\r
+ DPB AC0,ARG ;STORE BYTE\r
+ HLLO AC0,ARG\r
+ DPB RC,AC0\r
+\r
+ JUMPCM BYTE2\r
+ CAIN C,10 ;"("?\r
+ JRST BYTE1 ;YES, GET NEW BYTE SIZE\r
+ JRST OP3 ;NO, EXIT\r
+\fRADX50: PUSHJ PP,EVALEX ;EVALUATE CODE\r
+ JUMPN RC,ERRAX ;ERROR IF NOT ABSOLUTE\r
+ MOVE ARG,AC0\r
+ JUMPNC ERRAX\r
+ PUSHJ PP,GETSYM ;YET, GET SYMBOL\r
+ POPJ PP,\r
+ PUSHJ PP,SQOZE ;SQUOZE SIXBIT AND ADD CODE\r
+ JRST STOW ;STOW CODE AND EXIT\r
+\r
+\r
+SQOZE: MOVE AC1+1,AC0 ;PUT SIXBIT IN AC1+1\r
+ MOVEI AC0,0 ;CLEAR RESULT\r
+SQOZ1: MOVEI AC1,0\r
+ LSHC AC1,6 ;PUT 6-BIT CHARACTER IN AC1\r
+ LDB AC1,[POINT 6,CSTAT(AC1),23] ;CONVERT TO RADIX50\r
+ IMULI AC0,50 ;MULTIPLY PREVIOUS RESULT\r
+ ADD AC0,AC1 ;ADD NEW CHARACTER\r
+ JUMPN AC1+1,SQOZ1 ;TEST FOR END\r
+ LSH ARG,^D30 ;LEFT-JUSTIFY CODE\r
+ IOR AC0,ARG ;MERGE WITH RESULT\r
+ POPJ PP,\r
+\fSUBTTL MACRO/REPEAT HANDLERS\r
+\r
+REPEA0: PUSHJ PP,EVALXQ ;EVALUATE REPEAT EXP, EXTERNS ARE ILL\r
+ JUMPNC ERRAX\r
+\r
+REPEA1: JUMPLE AC0,REPZ ;PASS THE EXP., DONT PROCESS\r
+ SOJE AC0,REPO ;REPEAT ONCE\r
+REPEA2: PUSHJ PP,GCHARQ ;GET STARTING "<"\r
+ CAIE C,"<"\r
+ JRST REPEA2\r
+ PUSHJ PP,SKELI1 ;INITIALZE SKELETON\r
+ PUSH MP,REPEXP\r
+ MOVEM AC0,REPEXP\r
+ PUSH MP,REPPNT ;STACK PREVIOUS REPEAT POINTER\r
+ MOVEM ARG,REPPNT ;STORE NEW POINTER\r
+ TDZA SDEL,SDEL ;YES, INITIALIZE BRACKET COUNT AND SKIP\r
+\r
+REPEA4: PUSHJ PP,WCHARQ ;WRITE A CHARACTER\r
+ PUSHJ PP,GCHARQ ;GET A CHARACTER\r
+ CAIN C,"<" ;"<"?\r
+ AOJA SDEL,REPEA4 ;YES, INCREMENT AND WRITE\r
+ CAIE C,">" ;">"?\r
+ JRST REPEA4 ;NO, WRITE THE CHARACTER\r
+ SOJGE SDEL,REPEA4 ;YES, WRITE IF NON-NEGATIVE COUNT\r
+ MOVSI CS,(BYTE (7) 177,3) ;SET "REPEAT" END\r
+ PUSHJ PP,WWRXE ;WRITE END\r
+ PUSH MP,MRP ;STACK PREVIOUS READ POINTER\r
+REPEA5: HLRZ MRP,@REPPNT\r
+REPEA8: MOVEI C,LF\r
+ JRST RSW1\r
+\r
+REPEND: SOSL REPEXP\r
+ JRST REPEA5\r
+ HRRZ V,REPPNT ;GET START OF TREE\r
+ PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
+ POP MP,MRP\r
+ POP MP,REPPNT\r
+ POP MP,REPEXP\r
+ JRST RSW0\r
+\fREPZ: MOVE SDEL,SEQNO2\r
+ MOVEM SDEL,REPSEQ\r
+ MOVE SDEL,PAGENO\r
+ MOVEM SDEL,REPPG\r
+ SETOM INREP\r
+ MOVEI SDEL,0 ;SET COUNT\r
+REPZ1: PUSHJ PP,GCHAR ;GET NEXT CHARACTER\r
+ CAIN C,"<" ;"<"?\r
+ AOJA SDEL,REPZ1 ;YES, INCREMENT COUNT\r
+ CAIN C,">" ;">"?\r
+ SOJLE SDEL,REPZ2 ;YES, EXIT IF MATCHING\r
+ JRST REPZ1 ;NO, RECYCLE\r
+REPZ2: SETZM INREP\r
+ JRST GETCHR\r
+\r
+REPO: PUSHJ PP,GCHAR ;GET "<"\r
+ CAIE C,"<"\r
+ JRST REPO\r
+ SKIPE RPOLVL ;ARE WE NESTED?\r
+ AOS RPOLVL ;YES, DECREMENT CURRENT\r
+ PUSH MP,RPOLVL\r
+ SETOM RPOLVL\r
+ JRST STMNT\r
+\r
+REPO1: CAIN C,"<"\r
+ SOS RPOLVL\r
+ CAIN C,">"\r
+ AOSE RPOLVL\r
+ JRST RSW2\r
+ POP MP,RPOLVL\r
+ PUSHJ PP,RSW2\r
+ JRST RSW0\r
+\fDEFIN0: PUSHJ PP,GETSYM ;GET MACRO NAME\r
+ JRST ERRAX ;EXIT ON ERROR\r
+ MOVEM PP,PPTMP1 ;SAVE POINTER\r
+ MOVEM AC0,PPTMP2 ;SAVE NAME\r
+ TLO IO,IORPTC\r
+ MOVE SX,SEQNO2\r
+ MOVEM SX,DEFSEQ\r
+ MOVE SX,PAGENO\r
+ MOVEM SX,DEFPG\r
+ SETOM INDEF\r
+ MOVEI SX,0\r
+DEF02: PUSHJ PP,GCHAR\r
+ CAIN C,74\r
+ JRST DEF20\r
+ CAIE C,50\r
+ JRST DEF02\r
+DEF10: PUSHJ PP,GETSYM ;YES, GET DUMMY SYMBOL\r
+ TRO ER,ERRA ;FLAG ERROR\r
+ ADDI SX,1000 ;INCREMENT ARG COUNT\r
+ PUSH PP,AC0 ;STACK IT\r
+ CAIE C,11 ;")"?\r
+ JRST DEF10 ;NO, GET NEXT DUMMY SYMBOL\r
+DEF12: PUSHJ PP,GCHAR\r
+ CAIE C,"<" ;"<"?\r
+ JRST DEF12 ;NO\r
+DEF20: PUSH PP,[0] ;YES, MARK THE LIST\r
+ AOS ARG,SX\r
+ PUSHJ PP,SKELI ;INITIALIZE MACRO SKELETON\r
+ MOVE AC0,PPTMP2 ;GET NAME\r
+ MOVEM PP,PPTMP2\r
+ TLO IO,DEFCRS\r
+ PUSHJ PP,MSRCH ;SEARCH THE TABLE\r
+ JRST DEF24 ;NOT FOUND\r
+ TLNN ARG,MACF ;FOUND, IS IT A MACRO?\r
+ TROA ER,ERRX ;NO, FLAG ERROR AND SKIP\r
+ PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE\r
+DEF24: HRRZ V,WWRXX ;GET START OF TREE\r
+ MOVSI ARG,MACF\r
+ PUSHJ PP,INSERT ;INSERT/UPDATE\r
+ TLZ IO,DEFCRS ;JUST IN CASE\r
+ TDZA SDEL,SDEL ;CLEAR BRACKET COUNT\r
+\fDEF30: PUSHJ PP,WCHAR ;WRITE CHARACTER\r
+DEF31: PUSHJ PP,GCHAR ;GET A CHARACTER\r
+DEF32: MOVE CS,C ;GET A COPY\r
+ CAIG CS,"Z"+40 ;CONVERT LOWER CASE\r
+ CAIGE CS,"A"+40\r
+ SKIPA \r
+ SUBI CS,40\r
+ CAIL CS,40\r
+ CAILE CS,77+40\r
+ JRST DEF30 ;TEST FOR SPECIAL\r
+ MOVE CS,CSTAT-40(CS) ;GET STATUS BITS\r
+ TLNE CS,6 ;ALPHA-NUMERIC?\r
+ JRST DEF40 ;YES\r
+ CAIN C,74\r
+ AOJA SDEL,DEF30\r
+ CAIN C,76\r
+ SOJL SDEL,DEF70\r
+ CAIE C,47 ;IS THIS A '?\r
+ JRST DEF30\r
+ SKIPE SDEL\r
+CPEEK1: PUSHJ PP,WCHAR\r
+ PUSHJ PP,GCHAR\r
+ CAIE C,47\r
+ JRST DEF32\r
+ JRST CPEEK1\r
+\fDEF40: MOVEI AC0,0 ;CLEAR ATOM\r
+ MOVSI AC1,(POINT 6,AC0) ;SET POINTER\r
+DEF42: PUSH PP,C\r
+ TLNE AC1,770000\r
+ IDPB CS,1\r
+ PUSHJ PP,GCHAR ;GET NEXT CHARACTER\r
+ MOVE CS,C\r
+ CAIG CS,"Z"+40\r
+ CAIGE CS,"A"+40\r
+ SKIPA \r
+ SUBI CS,40 ;CONVERT LOWER TO UPPER\r
+ CAIL CS,40\r
+ CAILE CS,77+40\r
+ JRST DEF44 ;TEST SPECIAL\r
+ MOVE CS,CSTAT-40(CS) ;GET STATUS\r
+ TLNE CS,6 ;ALPHA-NUMERIC?\r
+ JRST DEF42 ;YES, GET ANOTHER\r
+DEF44: PUSH PP,[0] ;NO, MARK THE LIST\r
+ MOVE SX,PPTMP1 ;GET POINTER TO TP\r
+\r
+DEF46: SKIPN 1(SX) ;END OF LIST?\r
+ JRST DEF51 ;YES\r
+ CAME AC0,1(SX) ;NO, DO THEY COMPARE\r
+ AOJA SX,DEF46 ;NO, TRY AGAIN\r
+ SUB SX,PPTMP1 ;YES, GET DUMMY SYMBOL NUMBER\r
+ LSH SX,4\r
+ MOVSI CS,0776020(SX) ;(<BYTE (7) 177,101>)(SX) ;SET ESCAPE CODE MACEND\r
+ LSH AC0,-^D30\r
+ CAIN AC0,5 ;"%"?\r
+ TLO CS,1000 ;YES, SET CRESYM FLAG\r
+ PUSHJ PP,WWORD ;WRITE THE WORD\r
+DEF48: MOVE PP,PPTMP2 ;RESET PUSHDOWN POINTER\r
+ TLO IO,IORPTC ;ECHO LAST CHARACTER\r
+ JRST DEF31\r
+\r
+DEF51: MOVE C,2(SX) ;GET CHARACTER\r
+ JUMPE C,DEF48 ;CLEAN UP IF END\r
+ PUSHJ PP,WCHAR ;WRITE THE CHARACTER\r
+ AOJA SX,DEF51 ;GET NEXT\r
+\r
+DEF70: MOVE PP,PPTMP1 ;RESTORE PUSHDOWN POINTER\r
+ MOVSI CS,(BYTE (7) 177,1)\r
+ PUSHJ PP,WWRXE ;WRITE END\r
+ SETZM INDEF ;OUT OF IT\r
+ JRST BYPAS1\r
+\fSUBTTL MACRO CALL PROCESSOR\r
+CALLM: SKIPGE MACENL ;ARE WE TRYING TO RE-ENTER?\r
+ JRST ERRAX ;YES, BOMB OUT WITH ERROR\r
+ HRROS MACENL ;FLAG "CALLM IN PROGRESS"\r
+ EXCH MP,RP\r
+ PUSH MP,V ;STACK FOR REFDEC\r
+ EXCH MP,RP\r
+ MOVE SDEL,SEQNO2\r
+ MOVEM SDEL,CALSEQ\r
+ MOVE SDEL,PAGENO\r
+ MOVEM SDEL,CALPG\r
+ HLRZ V,0(V)\r
+ AOS SDEL,0(V) ;INCREMENT ARG COUNT\r
+ LSHC SDEL,-^D<9+36> ;ZERO SDEL, GET ARG COUNT IN SX\r
+ ANDI SX,777 ;MASK\r
+ PUSH PP,V ;STORE COUNT OF ARGS\r
+ PUSH PP,RP ;STACK FOR MACPNT\r
+ JUMPE SX,MAC20 ;TEST FOR NO ARGS\r
+ PUSHJ PP,CHARAC\r
+ CAIE C,"(" ;"("\r
+ TROA SDEL,-1 ;YES, END OF ARGUMENT STRING\r
+\r
+MAC10: PUSHJ PP,GCHAR\r
+ CAIG C,CR\r
+ CAIGE C,LF\r
+ SKIPA\r
+ JRST MAC21\r
+ CAIN C,";" ;";"?\r
+ JRST MAC21 ;YES, END OF ARGUMENT STRING\r
+ PUSHJ PP,SKELI1 ;NO, INITIALIZE SKELETON\r
+ CAIN C,"<" ;"<"?\r
+ JRST MAC30 ;YES, PROCESS AS SPECIAL\r
+ CAIE C,176\r
+ CAIN C,134 ;"\"\r
+ JRST MAC40\r
+MAC14: CAIN C,"," ;","?\r
+ JRST MAC16 ;YES, NULL SYMBOL\r
+ CAIN C,"(" ;"("?\r
+ ADDI SDEL,1 ;YES, INCREMENT COUNT\r
+ CAIN C,")" ;")"?\r
+ SOJL SDEL,MAC16 ;YES, TEST FOR END\r
+ PUSHJ PP,WCHAR ;WRITE INTO SKELETON\r
+MAC14A: PUSHJ PP,CHARAC ;GET NEXT CHARACTER\r
+ CAIG C,CR\r
+ CAIGE C,LF\r
+ SKIPA\r
+ JRST MAC15 ;TEST FOR END OF LINE\r
+ CAIE C,";" ;";"?\r
+ JRST MAC14 ;YES, END OF LINE\r
+\r
+MAC15: TLO IO,IORPTC\r
+MAC16: MOVSI CS,(BYTE (7) 177,2)\r
+ PUSHJ PP,WWRXE ;WRITE END\r
+ EXCH MP,RP\r
+ PUSH MP,WWRXX\r
+ EXCH MP,RP\r
+ SOJG SX,MAC10 ;BRANCH IF NO MORE ARGS\r
+\fMAC20: TLZN IO,IORPTC\r
+ PUSHJ PP,CHARAC\r
+MAC21: EXCH MP,RP\r
+MAC21A: PUSH MP,[-1] ;NO MISSING ARGS\r
+ SOJGE SX,MAC21A\r
+ SETZM 0(MP)\r
+ LDB C,LBUFP\r
+ MOVEI SX,"^"\r
+ JUMPAD MAC24\r
+ CAIN C,";"\r
+ SKIPE MRP\r
+ JRST MAC24\r
+ PUSHJ PP,STOUT ;LIST COMMOENT OR CR-LF\r
+ TLNE IO,IOPALL ;MACRO EXPANSION SUPPRESSION?\r
+ TLO IO,IOMAC ; NO, SET TEMP BIT\r
+ TDOA C,[-1] ;FLAG LAST CHARACTER\r
+MAC24: DPB SX,LBUFP\r
+ PUSH MP,MACPNT\r
+ POP PP,MACPNT\r
+ PUSH MP,C\r
+ PUSH MP,MRP ;STACK WORD COUNT\r
+ POP PP,MRP ;STACK MACRO POINTER\r
+ EXCH MP,RP\r
+ AOS MACLVL\r
+ HRRZS MACENL ;RESET "CALLM IN PROGRESS"\r
+ JUMPOC STMNT2 ;OP-CODE FIELD\r
+ JRST EVATOM ;ADDRESS FIELD\r
+\r
+\fMAC30: MOVEI AC0,0 ;INITIALIZE BRACKET COUNTER\r
+MAC31: PUSHJ PP,GCHAR ;GET A CHARACTER\r
+ CAIN C,"<" ;"<"?\r
+ ADDI AC0,1 ;YES, INCREMENT COUNT\r
+ CAIN C,">" ;">"?\r
+ SOJL MAC14A ;YES, EXIT IF MATCHING\r
+ PUSHJ PP,WCHAR ;WRITE INTO SKELETON\r
+ JRST MAC31 ;GO BACK FOR ANOTHER\r
+\r
+MAC40: PUSH PP,SX ;STACK REGISTERS\r
+ PUSH PP,SDEL\r
+ HLLM IO,TAGINC ;SAVE IO FLAGS\r
+ PUSHJ PP,CELL ;GET AN ATOM\r
+ MOVE V,AC0 ;ASSUME NUMERIC\r
+ TLNE IO,NUMSW ;GOOD GUESS?\r
+ JRST MAC41 ;YES\r
+ PUSHJ PP,SSRCH ;SEARCH THE SYMBOL TABLE\r
+ TROA ER,ERRX ;NOT FOUND, ERROR\r
+MAC41: PUSHJ PP,MAC42 ;FORM ASCII STRING\r
+ HLL IO,TAGINC ;RESTORE IO FLAGS\r
+ POP PP,SDEL\r
+ POP PP,SX\r
+ TLO IO,IORPTC ;REPEAT LAST CHARACTER\r
+ JRST MAC14A ;RETURN TO MAIN SCAN\r
+\r
+MAC42: MOVE C,V\r
+MAC44: LSHC C,-^D35\r
+ LSH CS,-1\r
+ DIVI C,0(RX) ;DIVIDE BY CURRENT RADIX\r
+ HRLM CS,0(PP)\r
+ SKIPE C ;TEST FOR END\r
+ PUSHJ PP,MAC44\r
+ HLRZ C,0(PP)\r
+ ADDI C,"0" ;FORM TEXT\r
+ JRST WCHAR ;WRITE INTO SKELETON\r
+\fMACEN0: SOS MACENL\r
+MACEND: SKIPGE C,MACENL ;TEST "CALLM IN PROGRESS"\r
+ AOS MACENL ;INCREMENT END LEVEL AND EXIT\r
+ JUMPL C,REPEA8\r
+ EXCH MP,RP\r
+ POP MP,MRP ;RETRIEVE READ POINTER\r
+ MOVEI C,"^"\r
+ SKIPL 0(MP) ;TEST FLAG\r
+ PUSHJ PP,RSW2 ;MARK END OF SUBSTITUTION\r
+ POP MP,C\r
+ POP MP,ARG\r
+ SKIPA MP,MACPNT ;RESET MP AND SKIP\r
+MACEN1: PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
+MACEN2: AOS V,MACPNT ;GET POINTER\r
+ MOVE V,0(V)\r
+ JUMPG V,MACEN1 ;IF >0, DECREMENT REFERENCE\r
+ JUMPL V,MACEN2 ;IF <0, BYPASS\r
+ POP MP,V ;IF=0, RETRIEVE POINTER\r
+ PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
+ MOVEM ARG,MACPNT\r
+ EXCH MP,RP\r
+ SOS MACLVL\r
+ HLRZ CS,0(MRP)\r
+ SKIPE MACENL ;CHECK UPROCESSED END LEVEL\r
+ JUMPE CS,MACEN0 ;THEN POP THE MACRO STACK NOW\r
+ JUMPL C,REPEA8 ;IF FLAG SET SUBSTITUTE\r
+ JRST RSW1\r
+\fIRP0: SKIPN MACLVL ;ARE WE IN A MACRO\r
+ JRST ERRAX ;NO, BOMB OUT\r
+IRP10: PUSHJ PP,MREADS ;YES, GET DATA SPEC\r
+ CAIE C,40 ;SKIP LEADING BLANKS\r
+ CAIN C,"(" ;"("?\r
+ JRST IRP10 ;YES, BYPASS\r
+ CAIN C,11\r
+ JRST IRP10\r
+ CAIE C,177 ;NO, IS IT SPECIAL?\r
+ JRST ERRAX ;NO, ERROR\r
+ PUSHJ PP,MREADS ;YES\r
+ TRZN C,100 ;CREATED?\r
+ JRST ERRAX\r
+ CAIL C,40 ;TOO BIG?\r
+ JRST ERRAX\r
+ ADD C,MACPNT ;NO, FORM POINTER TO STACK\r
+ PUSH MP,IRPCF ;STACK PREVIOUS POINTERS\r
+ PUSH MP,IRPSW\r
+ PUSH MP,IRPARP\r
+ PUSH MP,IRPARG\r
+ PUSH MP,0(C)\r
+ PUSH MP,IRPPOI\r
+\r
+ HRRZM C,IRPARP\r
+ MOVEM AC0,IRPCF ;IRPC FLAG FOUND IN AC0\r
+ SETOM AC0,IRPSW ;RESET IRP SWITCH\r
+ MOVE CS,0(C)\r
+ MOVEM CS,IRPARG\r
+ PUSHJ PP,MREADS\r
+ CAIE C,"<" ;"<">\r
+ JRST .-2 ;NO, SEARCH UNTIL FOUND\r
+ PUSHJ PP,SKELI1 ;INITIALIZE NEW STRING\r
+ MOVEM ARG,IRPPOI ;SET NEW POINTER\r
+\r
+ TDZA SDEL,SDEL ;ZERO BRACKET COUNT AND SKIP\r
+IRP20: PUSHJ PP,WCHAR\r
+ PUSHJ PP,MREADS\r
+ CAIN C,"<" ;"<"?\r
+ AOJA SDEL,IRP20 ;YES, INCREMENT COUNT AND WRITE\r
+ CAIE C,">" ;">"?\r
+ JRST IRP20 ;NO, JUST WRITE IT\r
+ SOJGE SDEL,IRP20 ;YES, WRITE IF NOT MATCHING\r
+ MOVE CS,[BYTE (7) 15,177,4]\r
+ PUSHJ PP,WWRXE ;WRITE END\r
+ PUSH MP,MRP ;STACK PREVIOUS READ POINTER\r
+ SKIPG CS,IRPARG\r
+ JRST IRPPOP ;EXIT IF NOT VALID ARGUMENT\r
+ HLRZ C,0(CS) ;INITIALIZE POINTER\r
+ MOVEM C,IRPARG\r
+\fIRPSET: EXCH MRP,IRPARG ;SWAP READ POINTERS\r
+ PUSHJ PP,SKELI1 ;INITIALIZE SKELETON FOR DATA\r
+ HRRZM ARG,@IRPARP ;STORE NEW DS POINTER\r
+ SETZB SX,SDEL ;ZERO FOUND FLAG AND BRACKET COUNT\r
+IRPSE1: PUSHJ PP,MREADS\r
+ CAIE C,177 ;SPECIAL?\r
+ AOJA SX,IRPSE2 ;NO, FLAG AS FOUND\r
+ MOVEM MRP,V\r
+ PUSHJ PP,MREADS ;LOOK AT NEXT CHARACTER\r
+ MOVE MRP,V\r
+ SETZM IRPSW ;SET IRP SWITCH\r
+ JUMPG SX,IRPSE4 ;IF ARG FOUND, PROCESS IT\r
+ JRST IRPPOP ;NO, CLEAN UP AND EXIT\r
+\r
+IRPSE2: SKIPE IRPCF ;IRPC?\r
+ JRST IRPSE3 ;YES, WRITE IT\r
+ CAIN C,"," ;NO, IS IT A COMMA?\r
+ JUMPE SDEL,IRPSE4 ;YES, EXIT IF NOT NESTED\r
+ CAIN C,"<" ;"<"?\r
+ ADDI SDEL,1 ;YES, INCREMENT COUNT\r
+ CAIN C,">" ;">"?\r
+ SUBI SDEL,1 ;YES, DECREMENT COUNT\r
+\r
+IRPSE3: PUSHJ PP,WCHAR\r
+ SKIPN IRPCF ;IRPC?\r
+ JRST IRPSE1 ;NO, GET NEXT CHARACTER\r
+\r
+IRPSE4: MOVSI CS,(BYTE (7) 177,2)\r
+ PUSHJ PP,WWRXE ;WRITE END\r
+ MOVEM MRP,IRPARG ;SAVE POINTER\r
+ HLRZ MRP,@IRPPOI ;SET FOR NEW SCAN\r
+ JRST REPEA8 ;ON ARG COUNT\r
+\fSTOPI0: SKIPN IRPARP ;IRP IN PROGRESS?\r
+ JRST ERRAX ;NO, ERROR\r
+ SETZM IRPSW ;YES, SET SWITCH\r
+ POPJ PP,\r
+\r
+IRPEND: MOVE V,@IRPARP\r
+ PUSHJ PP,REFDEC\r
+ SKIPE IRPSW ;MORE TO COME?\r
+ JRST IRPSET ;YES\r
+\r
+IRPPOP: MOVE V,IRPPOI\r
+ PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
+ POP MP,MRP ;RESTORE CELLS\r
+ POP MP,IRPPOI\r
+ POP MP,@IRPARP\r
+ POP MP,IRPARG\r
+ POP MP,IRPARP\r
+ POP MP,IRPSW\r
+ POP MP,IRPCF\r
+ JRST REPEA8\r
+\fGETDS: MOVE CS,C ;USE CS FOR WORK REGISTER\r
+ ANDI CS,37 ;MASK\r
+ ADD CS,MACPNT ;ADD BASE ADDRESS\r
+ MOVE V,0(CS) ;GET POINTER FLAG\r
+ JUMPG V,GETDS1 ;BRANCH IF POINTER\r
+ TRNN C,40 ;NOT POINTER, SHOULD WE CREATE?\r
+ JRST RSW0 ;NO, FORGET THIS ARG\r
+ PUSH PP,WWRXX\r
+ PUSH PP,MWP ;STACK MACRO WRITE POINTER\r
+ PUSHJ PP,SKELI1 ;INITIALIZE SKELETON\r
+ MOVEM ARG,0(CS) ;STORE POINTER\r
+ MOVE CS,[BYTE (7) 0,170,170,170,171] ;CREATE A SYMBOL\r
+ ADD CS,LSTSYM ;LSTSYM= # OF LAST CREATED\r
+ TDZ CS,[BYTE (7) 0,170,170,170,170]\r
+ MOVEM CS,LSTSYM\r
+ IOR CS,[ASCII /.0000/]\r
+ MOVEI C,"."\r
+ PUSHJ PP,WCHAR ;WRITE INTO SKELETON\r
+ PUSHJ PP,WWORD\r
+ MOVSI CS,(BYTE (7) 177,2)\r
+ PUSHJ PP,WWRXE ;WRITE END CODE\r
+ POP PP,MWP ;RESTORE MACRO WRITE POINTER\r
+ POP PP,WWRXX\r
+ MOVE V,ARG ;SET UP FOR REFINC\r
+\r
+GETDS1: PUSHJ PP,REFINC ;INCREMENT REFERENCE\r
+ PUSH MP,V ;STACK V FOR DECREMENT\r
+ PUSH MP,MRP ;STACK READ POINTER\r
+ HLRZ MRP,0(V) ;FORM READ POINTER\r
+ JRST RSW0 ;EXIT\r
+\r
+DSEND: POP MP,MRP\r
+ POP MP,V\r
+ PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
+ JRST RSW0 ;EXIT\r
+\fSKELI1: MOVEI ARG,1 ;ENTRY FOR SINGLE ARG\r
+SKELI: MOVE MWP,LADR\r
+ PUSHJ PP,SKELWL ;GET POINTER WORD\r
+ HRRZM MWP,WWRXX ;SAVE FIRST ADDRESS\r
+ PUSHJ PP,SKELWL\r
+ HRRM ARG,0(MWP) ;STORE COUNT\r
+ HRRZ ARG,WWRXX ;SET FIRST ADDRESS\r
+ ;SKEW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT)\r
+\r
+SKELWL: SKIPE V,NEXT ;GET FIRST FREE ADDRESS\r
+ JRST SKELW1 ;IF NON-ZERO, UPDATE FREE\r
+ AOS V,FREE ;INCREMENT BY LEAF SIZE\r
+ CAML V,SYMBOL ;OVERFLOW?\r
+ PUSHJ PP,XCEED ;YES, BOMB OUT\r
+ SETZM (V) ;CLEAR LINK\r
+\r
+SKELW1: HLL V,0(V) ;GET ADDRESS\r
+ HLRM V,NEXT ;UPDATE NEXT\r
+ HRLM V,0(MWP) ;STORE LINK IN FIRST WORD OF LEAF\r
+ HRRZ MWP,V\r
+ TLO MWP,(POINT 7,,21) ;2 ASCII CHARS\r
+ POPJ PP,\r
+\r
+ ;WWRXX POINTS TO END OF TREE\r
+ ;MWP IDPB POINTER TO NEXT HOLE\r
+ ;NEXT FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES)\r
+ ;FREE POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE\r
+ ;LADR POINTS TO BEG OF LINKED PORTION.\r
+\fGCHARQ: SKIPE MACLVL\r
+ JRST MREADS ;IF GETTING CHAR. FROM TREE\r
+GCHAR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER\r
+ CAIE C,LF ;TEST FOR LF, VT OR FF\r
+ CAIN C,FF\r
+ PUSHJ PP,OUTIM1 ;YES, LIST IT\r
+ POPJ PP,\r
+\r
+WCHARQ: SKIPE MACLVL\r
+ JRST WCHAR\r
+WCHAR: TLNN MWP,770000 ;END OF WORD?\r
+ PUSHJ PP,SKELWL ;YES, GET ANOTHER\r
+ IDPB C,MWP\r
+ POPJ PP,\r
+\r
+WWORD: LSHC C,7 ;MOVE ASCII INTO C\r
+ PUSHJ PP,WCHAR ;STORE IT\r
+ JUMPN CS,WWORD ;TEST FOR END\r
+ POPJ PP, ;YES, EXIT\r
+\r
+WWRXE: PUSHJ PP,WWORD ;WRITE LAST WORD\r
+ HRRZS (MWP) ;ZERO LEFT HALF OF LAST LEAF\r
+ HRRM MWP,@WWRXX ;SET POINTER TO END\r
+ POPJ PP,\r
+\fMREAD: PUSHJ PP,MREADS ;READ ON CHARACTER\r
+ CAIE C,177 ;SPECIAL?\r
+ JRST RSW1 ;NO, EXIT\r
+ PUSHJ PP,MREADS ;YES, GET CODE WORD\r
+ TRZE C,100 ;SYMBOL?\r
+ JRST GETDS ;YES\r
+ CAILE C,4 ;POSSIBLY ILLEGAL\r
+ JRST ERRAX ;YES\r
+ JRST .+1(C)\r
+ PUSHJ PP,XCEED\r
+ JRST MACEND ;1; END OF MACRO\r
+ JRST DSEND ;2; END OF DUMMY SYMBOL\r
+ JRST REPEND ;3; END OF REPEAT\r
+ JRST IRPEND ;4; END OF IRP\r
+\r
+MREADS: TLNE MRP,770000 ;HAVE WE FINISHED WORD?\r
+ JRST MREADC ;STILL CHAR. IN LEAF\r
+ HLRZ MRP,0(MRP) ;YES, GET LINK\r
+ HRLI MRP,(POINT 7,,21) ;SET POINTER\r
+MREADC: ILDB C,MRP ;GET CHARACTER\r
+ POPJ PP,\r
+\r
+\fREFINC: HLRZ CS,0(V) ;GET POINTER TO FREE\r
+ AOS 0(CS) ;INCREMENT REFERENCE\r
+ POPJ PP,\r
+REFDEC: HLRZ CS,0(V) ;GET POINTER TO TREE\r
+ SOS CS,0(CS) ;DECREMENT REFERENCE\r
+ TRNE CS,000777 ;IS IT ZERO?\r
+ POPJ PP, ;NO, EXIT\r
+ HRRZ CS,0(V) ;YES, GET POINTER TO END\r
+ HRL CS,NEXT ;GET POINTER TO NEXT RE-USABLE\r
+ HLLM CS,0(CS) ;SET LINK\r
+ HRRM V,NEXT ;RESET NEXT\r
+ POPJ PP,\r
+\r
+\fA== 0 ;ASCII MODE\r
+AL== 1 ;ASCII LINE MODE\r
+IB== 13 ;IMAGE BINARY MODE\r
+B== 14 ;BINARY MODE\r
+\r
+CTL== 0 ;CONTROL DEVICE NUMBER\r
+IFN CCLSW,<CTL2==4 ;INPUT DEV FOR CCL FILE>\r
+BIN== 1 ;BINARY DEVICE NUMBER\r
+CHAR== 2 ;INPUT DEVICE NUMBER\r
+LST== 3 ;LISTING DEVICE NUMBER\r
+\r
+; COMMAND STRING ACCUMULATORS\r
+\r
+ACDEV== 1 ;DEVICE\r
+ACFILE==2 ;FILE\r
+ACEXT== 3 ;EXTENSION\r
+ACPPN== 4 ;PPN\r
+ACDEL== 4 ;DELIMITER\r
+ACPNTR==5 ;BYTE POINTER\r
+\r
+TIO== 6\r
+\r
+TIORW== 1000\r
+TIOLE== 2000\r
+TIOCLD==20000\r
+\r
+DIRBIT==4 ;DIRECTORY DEVICE\r
+TTYBIT==10 ;TTY\r
+MTABIT==20 ;MTA\r
+DTABIT==100 ;DTA\r
+DISBIT==2000 ;DISPLAY\r
+CONBIT==20000 ;CONTROLING TTY\r
+LPTBIT==40000 ;LPT\r
+DSKBIT==200000 ;DSK\r
+\r
+;GETSTS ERROR BITS\r
+\r
+IOIMPM==400000 ;IMPROPER MODE (WRITE LOCK)\r
+IODERR==200000 ;DEVICE DATA ERROR\r
+IODTER==100000 ;CHECKSUM OR PARITY ERROR\r
+IOBKTL== 40000 ;BLOCK TOO LARGE\r
+ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL\r
+\fSUBTTL I/O ROUTINES\r
+BEG:\r
+IFN CCLSW,<TLZA IO,ARPGSW ;DON'T ALLOW RAPID PROGRAM GENERATION\r
+ TLO IO,ARPGSW ;ALLOW RAPID PROGRAM GENERATION\r
+ TLZA IO,CRPGSW ;SET TO INITI NEW COMMAND FILE\r
+M: TLNN IO,CRPGSW ;CURRENTLY DOING RPG?>\r
+IFE CCLSW,<M:>\r
+ RESET ;INITIALIZE PROGRAM\r
+ SETZB MRP,PASS1I\r
+ MOVE [XWD PASS1I,PASS1I+1]\r
+ BLT PASS2X-1 ;ZERO THE PASS1 AND PASS2 VARIABLE\r
+ MOVEI PP,JOBFFI ;SET TEMP PUSH-DOWN POINTER\r
+ MOVE CS,[POINT 7,DBUF] ;INITIALIZE FOR DATA\r
+ MSTIME 2, ;GET TIME FROM MONITOR\r
+ IDIVI 2,^D60*^D1000\r
+ IDIVI 2,^D60\r
+ PUSH PP,3 ;SAVE MINUTES\r
+ PUSHJ PP,OTOD1\r
+ POP PP,2\r
+ PUSHJ PP,OTOD1\r
+ DATE 1,\r
+ IDIVI 1,^D31 ;GET DAY\r
+ ADDI 2,1\r
+ CAIG 2,^D9 ;TWO DIGITS?\r
+ ADDI 2,7760*^D10 ;NO, PUT IN SPACE\r
+ PUSHJ PP,OTOD1 ;STORE DAY\r
+ IDIVI 1,^D12 ;GET MONTH\r
+ MOVE 2,DTAB(2) ;GET MNEMONIC\r
+ ADDI CS,1\r
+ MOVEM 2,0(CS)\r
+ MOVEI 2,^D64(1) ;GET YEAR\r
+ PUSHJ PP,OTOD ;STORE IT\r
+ MOVSI FR,P1!CREFSW\r
+IFN CCLSW,<TLNE IO,CRPGSW ;RPG IN PROGRESS?\r
+ JRST GOSET ;YES, GO READ NEXT COMMAND\r
+ TLNE IO,ARPGSW ;NO, RPG ALLOWED?\r
+ JRST RPGSET ;YES, GO TRY\r
+CTLSET: RELEAS CTL2, ;IN CASE OF LOOKUP FAILURE>\r
+IFE CCLSW,<CTLSET:>\r
+ MOVSI IO,IOPALL ;ZERO FLAGS\r
+ INIT CTL,AL ;INITIALIZE USER CONSOLE\r
+ SIXBIT /TTY/\r
+ XWD CTOBUF,CTIBUF\r
+ EXIT ;NO TTY, NO ASSEMBLY\r
+ INBUF CTL,1 ;INITIALIZE SINGLE CONTROL\r
+ OUTBUF CTL,1 ;BUFFERS\r
+ PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED\r
+ MOVEI C,"*"\r
+ IDPB C,CTOBUF+1\r
+ OUTPUT CTL,0\r
+ INPUT CTL,0\r
+\fIFN CCLSW,<JRST BINSET ;BEGIN WITH BINARY FILE\r
+RPGSET:\r
+IFN TEMP,<HRRZ 3,JOBFF ;GET START OF BUFFER AREA\r
+ HRRM 3,TMPFIL+1 ;STORE IN TMPCOR UUO IOWD\r
+ SOS TMPFIL+1 ;MAKE IT THE PROPER IOWD FORMAT\r
+ HRRM 3,CTLBLK+1 ;DUMMY UP BUFFER HEADER\r
+ MOVE 0,[XWD 2,TMPFIL] ;SET UP FOR TEMP CORE READ\r
+ TMPCOR ;READ AND DELETE FILE "MAC"\r
+ JRST RPGTMP ;NO SUCH FILE IN CORE TRY DISK\r
+ ADD 3,0 ;CALCULATE END OF BUFFER\r
+ MOVEM 3,JOBFF ;FIX JOBFF SO FILE WONT BE KILLED\r
+ IMULI 0,5 ;CALCULATE CHARACTER COUNT\r
+ MOVEM 0,CTLBLK+2 ;SET UP CHAR CNT IN BUFFER HEADER\r
+ MOVEI 0,440700 ;SET UP BYTE POINTER IN HEADER\r
+ HRLM 0,CTLBLK+1 ;BUUFER HEADER NOW SET UP\r
+ SETOM TMPFLG ;MARK THAT A TMPCOR UUO WAS DONE\r
+ JRST RPGS2A ;CONTINUE IN MAIN STREAM\r
+RPGTMP:>\r
+ INIT CTL2,AL ;LOOK FOR DISK\r
+ SIXBIT /DSK/ ;...\r
+ XWD 0,CTLBLK ;...\r
+ JRST CTLSET ;DSK NOT THERE\r
+\r
+ HRLZI 3,(SIXBIT /MAC/) ;###MAC\r
+ MOVEI 3 ;COUNT\r
+ PJOB AC1, ;RETURNS JOB NO. TO AC1\r
+RPGLUP: IDIVI AC1,12 ;CONVERT\r
+ ADDI AC2,"0"-40 ;SIXBITIZE IT\r
+ LSHC AC2,-6 ;\r
+ SOJG RPGLUP ;3 TIMES\r
+ MOVEM 3,CTLBUF ;###MAC\r
+ HRLZI (SIXBIT /TMP/) ;\r
+ MOVEM CTLBUF+1 ;TMP\r
+ SETZM CTLBUF+3 ;PROG-PRO\r
+ LOOKUP CTL2,CTLBUF ;COMMAND FILE\r
+ JRST CTLSET ;NOT THERE\r
+ HLRM EXTMP ;SAVE THE EXTENSION\r
+RPGS2: INBUF CTL2,1 ;SINGLE BUFFERED\r
+RPGS2A: INIT CTL,AL ;TTY FOR CONSOLE MESSAGES\r
+ SIXBIT /TTY/ ;...\r
+ XWD CTOBUF,0 ;...\r
+ EXIT ;NO TTY, NO ASSEMBLY\r
+ OUTBUF CTL,1 ;SINGLE BUFFERED\r
+ MOVE JOBFF ;REMEMBER WHERE BINARY BUFFERS BEGIN\r
+ MOVEM SAVFF ;...\r
+ TLNE IO,CRPGSW ;ARE WE ALREAD IN RPG MODE?\r
+ JRST M ;MUST HAVE COME FROM @ COMMAND, RESET\r
+\r
+\fGOSET: MOVSI IO,IOPALL!CRPGSW ;SET INITIAL FLAGS\r
+ MOVEI CS,CTLSIZ ;MAXIMUM CHARS IN A LINE\r
+ MOVE AC1,[POINT 7,CTLBUF] ;WHERE TO STASH CHARS\r
+ MOVEM AC1,CTIBUF+1 ;...\r
+GOSET1: SOSG CTLBLK+2 ;ANY MORE CHARS?\r
+ PUSHJ PP,[IFN TEMP,<SKIPE TMPFLG ;TMPCOR UUO IN PROGRESS?\r
+ EXIT ;YES EXIT>\r
+ IN CTL2, ;READ ANOTHER BUFFERFUL\r
+ POPJ PP, ;EVERYTHING OK, RETURN\r
+ STATO CTL2,20000 ;EOF?\r
+ JRST [HRROI RC,[SIXBIT /ERROR READING COMMAND FILE@/]\r
+ JRST ERRNE0] ;GO COMPLAIN\r
+ PUSHJ PP,DELETE ;CMD FILE\r
+ EXIT] ;EOF AND FINISHED\r
+ ILDB C,CTLBLK+1 ;GET NEXT CHAR\r
+ MOVE RC,@CTLBLK+1 ;CHECK FOR SEQUENCE NUMBERS\r
+ TRNE RC,1 ;...\r
+ JRST [AOS CTLBLK+1 ;SKIP OVER ANOTHER 5 CHARS\r
+ MOVNI RC,5 ;...\r
+ ADDM RC,CTLBLK+2 ;...\r
+ JRST GOSET1] ;GO READ ANOTHER CHAR\r
+ JUMPE C,GOSET1 ;IGNORE NULLS\r
+ IDPB C,CTIBUF+1 ;GET NEXT CHAR\r
+ CAIE C,12 ;LINE FEED OR\r
+ CAIN C,175 ;ALTMODE?\r
+ JRST GOSET2 ;YES, FINISHED WITH COMMAND\r
+ CAIE C,176\r
+ CAIN C,33\r
+ JRST GOSET2 ;ALTMODE.\r
+ SOJG CS,GOSET1 ;GO READ ANOTHER\r
+ HRROI RC,[SIXBIT /COMMAND LINE TOO LONG@/]\r
+ JRST ERRNE0 ;GO COMPLAIN\r
+GOSET2: MOVEI C,12 ;MAKE SURE THERE'S A LF\r
+ IDPB C,CTIBUF+1 ;...\r
+ MOVEM AC1,CTIBUF+1 ;SET POINTER TO BEGINNING\r
+ MOVE AC0,SAVFF ;RESET JOBFF FOR NEW BINARY\r
+ MOVEM AC0,JOBFF ;...\r
+ JRST BINSET\r
+\fRPGS1: PUSHJ PP,DELETE ;DELETE COMMAND FILE\r
+ MOVEM ACDEV,RPGDEV ;GET SET TO INIT\r
+ PUSHJ PP,RPGINI\r
+ MOVEM ACFILE,INDIR ;USE INPUT BLOCK\r
+ MOVEM ACEXT,INDIR+1\r
+ LOOKUP CTL2,INDIR\r
+ JRST RPGLOS\r
+ HLRM ACEXT,EXTMP ;SAVE THE EXTENSION\r
+ HLRZ JOBSA ;RESET JOBFF TO ORIGINAL\r
+ MOVEM JOBFF\r
+ TLO IO,CRPGSW ;TURN ON SWITHC SO WE RESET WORLD\r
+ JRST RPGS2 ;AND GO\r
+RPGLOS: RELEAS CTL2,0\r
+ TLZ IO,CRPGSW ;STOPS IO TO UNASGD CHAN\r
+ JRST ERRCF ;NO FILE FOUND\r
+>\r
+\fBINSET: PUSHJ PP,NAME1 ;GET FIRST NAME\r
+IFN CCLSW,<CAIN C,"!" ;CHECK FOR A NEW RPG FILE\r
+ JRST NUNSET\r
+ CAIN C,"@" ;CHEK FOR A NEW RPG FILE\r
+ JRST RPGS1>\r
+ TLNN FR,CREFSW ;CROSS REF REQUESTED?\r
+ JRST LSTSE1 ;YES, SKIP BINARY\r
+ CAIN C,"," ;COMMA?\r
+ JUMPE ACDEV,LSTSET ;YES, SKIP BINARY IF NO DEVICE SPECIFIED\r
+ CAIN C,"_" ;LEFT ARROW?\r
+ JUMPE ACDEV,LSTSE1 ;YES, SKIP BINARY IF NO DEVICE SPECIFIED\r
+ JUMPE ACDEV,ERRCM ;IGNORE IF JUST <CR-LF>\r
+ TLO FR,PNCHSW ;OK, SET SWITCH\r
+ MOVEM ACDEV,BINDEV ;STORE DEVICE NAME\r
+ MOVEM ACFILE,INDIR ;STORE FILE NAME IN DIRECTORY\r
+ SKIPN ACEXT ;EXTENSION SPECIFIED?\r
+ MOVSI ACEXT,(SIXBIT /REL/) ;NO, ASSUME RELOCATABLE BINARY\r
+ MOVEM ACEXT,INDIR+1 ;STORE IN DIRECTORY\r
+ PUSHJ PP,BININI ;INITIALIZE BINARY\r
+ TLZE TIO,TIOLE ;SKIP TO EOT\r
+ MTEOT. BIN,\r
+ TLZE TIO,TIORW ;REWIND REQUESTED?\r
+ MTREW. BIN, ;YES\r
+ JUMPGE CS,BINSE2 ;BRANCH IF NO BACK-SPACE\r
+ MTBSF. BIN, ;BACK-SPACE A FILE\r
+ AOJL CS,.-1 ;TEST FOR END\r
+ MTWAT. BIN,\r
+ STATO BIN,1B24 ;LOAD POINT?\r
+ MTSKF. BIN, ;NO, GO FORWARD ONE\r
+BINSE2: SOJG CS,.-1 ;TEST FORWARD SPACING\r
+\r
+ TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?\r
+ UTPCLR BIN, ;YES, CLEAR IT\r
+ OUTBUF BIN,2 ;SET UP TWO RING BUFFER\r
+ ENTER BIN,INDIR\r
+ JRST ERREF\r
+ CAIN C,"_"\r
+ JRST GETSET ;NO LISTING\r
+\fLSTSET: PUSHJ PP,NAME1 ;GET NEXT DEVICE\r
+LSTSE1: CAIE C,"_"\r
+ JRST ERRCM\r
+ TLNE FR,CREFSW ;CROSS-REF REQUESTED?\r
+ JRST LSTSE2 ;NO, BRANCH\r
+ SKIPN ACDEV ;YES, WAS DEVICE SPECIFIED?\r
+ MOVSI ACDEV,(SIXBIT /DSK/) ;NO, ASSUME DSK\r
+ SKIPN ACFILE\r
+ MOVE ACFILE,[SIXBIT /CREF/]\r
+ SKIPN ACEXT\r
+ MOVSI ACEXT,(SIXBIT /LST/)\r
+LSTSE2: JUMPE ACDEV,GETSET ;FORGET LISTING IF NO DEVICE SPECIFIED\r
+ MOVEM ACDEV,LSTDEV\r
+ MOVE AC0,1\r
+ DEVCHR AC0,\r
+ TLNN AC0,2\r
+ TLNE FR,CREFSW ; WAS CROSS-REF REQUESTED?\r
+ AOSA OUTSW ;NO, ASSUME TTY\r
+ JRST ERRCM ;YES, ERROR - CREF DEV MUST NO TBE LPT, DIS OR TTY\r
+ TLNE AC0,TTYBIT ;CONTROLING TELETYPE LISTING?\r
+ JRST GETSET ;YES, BUFFER ALREADY SET\r
+ AOS OUTSW ;SET FOR LPT\r
+ MOVEM ACFILE,INDIR\r
+ SKIPN ACEXT\r
+ MOVSI ACEXT,(SIXBIT /LST/)\r
+ MOVEM ACEXT,INDIR+1\r
+ PUSHJ PP,LSTINI\r
+ TLZE TIO,TIOLE\r
+ MTEOT. LST,\r
+ TLZE TIO,TIORW\r
+ MTREW. LST,\r
+ JUMPGE CS,LSTSE3\r
+ MTBSF. LST,\r
+ AOJL CS,.-1\r
+ MTWAT. LST,\r
+ STATO LST,1B24\r
+ MTSKF. LST,\r
+LSTSE3: SOJG CS,.-1\r
+ TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?\r
+ UTPCLR LST, ;YES, CLEAR IT\r
+ OUTBUF LST,2 ;SET UP A TWO RING BUFFER\r
+ ENTER LST,INDIR\r
+ JRST ERREF\r
+\fGETSET: MOVEI 3,PDPERR\r
+ HRRM 3,JOBAPR ;SET TRAP LOCATION\r
+ MOVEI 3,1B19 ;SET FOR PUSH-DOWN OVERFLOW\r
+ APRENB 3,\r
+ SOS 3,PDP ;GET PDP REQUEST MINUS 1\r
+ IMULI 3,.PDP ;COMPUTE SIZE (50*<NUMBER OF /P'S +1>)\r
+ HRLZ MP,3\r
+ HRR MP,JOBFF ;SET BASIC POINTER\r
+ MOVE PP,MP\r
+ SUB PP,3\r
+ MOVEM PP,RP ;SET RP\r
+ SUB PP,3\r
+ ASH 3,1 ;DOUBLE SIZE OF BASIC POINTER\r
+ HRL PP,3\r
+ SUBM PP,3 ;COMPUTE TOP LOCATION\r
+ HRRZM 3,LADR ;SET START OF MACRO TREE\r
+ HRRZM 3,FREE\r
+\r
+GETSE1: HRRZ JOBREL\r
+ SKIPE JOBDDT\r
+ HRRZ JOBSYM\r
+ SUBI 1\r
+ MOVEM SYMTOP\r
+ SUBI LENGTH\r
+ CAMLE LADR\r
+ JRST GETSE2\r
+\r
+ HRRZ 2,JOBREL ;NO, TRY FOR MORE CORE\r
+ ADDI 2,2000\r
+ CORE 2,\r
+ JRST XCEED2 ;NO MORE, INFORM USER\r
+ JRST GETSE1 ;TRY AGAIN\r
+\r
+GETSE2: MOVEM SYMBOL ;SET START OF SYMBOL TABLE\r
+ HRLI SYMNUM\r
+ BLT @SYMTOP ;STORE SYMBOLS\r
+ PUSHJ PP,SRCHI\r
+ MOVE AC0,CTIBUF+1\r
+ MOVEM AC0,CTLSAV\r
+ MOVSI AC0,(SIXBIT 'DSK')\r
+ MOVEM AC0,ACDEVX\r
+ PUSHJ PP,INSET\r
+\r
+ MOVEI CS,[ASCIZ /MACRO: /] ;PUBLISH COMPILER NAME\r
+ TLNE IO,CRPGSW ;PUNCH REQUESTED?\r
+ DDTOUT CS,\r
+ JRST ASSEMB\r
+\r
+\fFINIS: CLOSE BIN, ;DUMP BUFFER\r
+ TLNE FR,PNCHSW ;PUNCH REQUESTED?\r
+ PUSHJ PP,TSTBIN ;YES, TEST FOR ERRORS\r
+ RELEAS BIN,\r
+ CLOSE LST,\r
+ SOSLE OUTSW ;LPT TYPE OUTPUT?\r
+ PUSHJ PP,TSTLST ;YES, TEST FOR ERRORS\r
+ RELEAS LST,\r
+ CLOSE CHAR,\r
+ RELEAS CHAR,\r
+ OUTPUT CTL,0 ;FLUSH TTY OUTPUT\r
+ JRST M\r
+\fINSET: MOVEI JOBFFI ;POINTER TO INPUT BUFFER\r
+ HRRM JOBFF ;INFORM SYSTEM OF BUFFER AREA\r
+ PUSHJ PP,NAME2 ;GET NEXT COMMAND NAME\r
+ JUMPE ACDEV,ERRNE ;ERROR IF NONE LEFT\r
+ MOVEM ACDEV,INDEV ;STORE DEVICE\r
+ MOVEM ACFILE,INDIR ;STORE FILE IN DIRECTORY\r
+ PUSHJ PP,INDEVI\r
+ DEVCHR ACDEV, ;TEST CHARACTERISTICS\r
+ TLNN ACDEV,MTABIT ;MAG TAPE?\r
+ JRST INSET3 ;NO\r
+ TLZN FR,MTAPSW ;FIRST MAG TAPE IS PASS 2?\r
+ JRST INSET1 ;NO\r
+ TLNN TIO,TIORW ;YES, REWIND REQUESTED?\r
+ SUB CS,RECCNT ;NO, PREPARE TO BACK-SPACE TAPE\r
+INSET1: AOS RECCNT ;INCREMENT FILE COUNTER\r
+ ADDM CS,RECCNT ;UPDATE COUNT\r
+ TLZE TIO,TIOLE\r
+ MTEOT. CHAR,\r
+ TLZE TIO,TIORW ;REWIND?\r
+ MTREW. CHAR, ;YES\r
+ JUMPGE CS,INSET2\r
+ MTBSF. CHAR,\r
+ MTBSF. CHAR,\r
+ AOJL CS,.-1\r
+ MTWAT. CHAR,\r
+ STATO CHAR,1B24\r
+ MTSKF. CHAR,\r
+INSET2: SOJGE CS,.-1\r
+\r
+INSET3: INBUF CHAR,1\r
+ MOVEI ACPNTR,JOBFFI\r
+ EXCH ACPNTR,JOBFF\r
+ SUBI ACPNTR,JOBFFI\r
+ MOVEI ACDEL,NUMBUF*203+1\r
+ IDIV ACDEL,ACPNTR\r
+ INBUF CHAR,(ACDEL)\r
+ JUMPN SDEL,INSET4 ;TAKE USER'S EXTENSION IF NON-BLANK\r
+ MOVSI SDEL,(SIXBIT /MAC/) ;BLANK, TRY .MAC FIRST\r
+ PUSHJ PP,INSETI\r
+INSET4: PUSHJ PP,INSETI\r
+ JUMPE ACEXT,ERRCF ;ERROR IF ZERO\r
+ TLNE ACDEV,TTYBIT ;TELETYPE?\r
+ SETSTS CHAR,AL ;YES, CHANGE TO ASCII LINE\r
+ POPJ PP,\r
+\r
+INSETI: HLLM ACEXT,INDIR+1 ;STORE EXTENSION\r
+ LOOKUP CHAR,INDIR\r
+ TDZA ACEXT,ACEXT\r
+ AOS 0(PP)\r
+ POPJ PP,\r
+\fREC2: MOVE CTLSAV\r
+ MOVEM CTIBUF+1\r
+ MOVEI "_"\r
+ HRLM BLKTYP\r
+ SETZM ACDEVX\r
+ MOVE [XWD PASS2I,PASS2I+1]\r
+ BLT PASS2X-1 ;ZERO PASS2 VARIABLES\r
+ TLOA FR,MTAPSW!LOADSW ;SET FLAGS\r
+ INPUT CHAR,\r
+\r
+GOTEND: STATO CHAR,1B22 ;TEST FOR EOF\r
+ JRST .-2\r
+\r
+EOT: PUSHJ PP,SAVEXS ;SAVE REGISTERS\r
+ RELEAS CHAR,\r
+ PUSHJ PP,INSET ;GET THE NEXT INPUT DEVICE\r
+ HRROI RC,[SIXBIT /END OF PASS 1@/] ;ASSUME END OF PASS\r
+ TLZN FR,LOADSW ;ZERO ONLY ON END OF PASS 1\r
+ HRROI RC,[SIXBIT /LOAD THE NEXT FILE@/] ;NOT END OF PASS\r
+ TLNN ACDEV,(1B13!1B15) ;WAS ALL THAT WORK NECESSARY?\r
+ PUSHJ PP,TYPMSG ;YES\r
+\r
+RSTRXS: MOVSI RC,SAVBLK ;SET POINTER\r
+ BLT RC,RC-1\r
+ MOVE RC,SAVERC ;RESTORE RC\r
+ POPJ PP,\r
+\r
+SAVEXS: MOVEM RC,SAVERC ;SAVE RC\r
+ MOVEI RC,SAVBLK ;SET POINTER\r
+ BLT RC,SAVBLK+RC-1 ;BLT ALL REGISTERS BELOW EC\r
+ POPJ PP, ;EXIT\r
+\r
+\fNAME2: SKIPA ACDEV,ACDEVX\r
+NAME1: SETZB ACDEV,INDIR+2\r
+ MOVEI ACFILE,0 ;CLEAR FILE\r
+ HLRZ ACDEL,ACDELX ;GET PREVIOUS DELIMITER\r
+ SETZB TIO,CS\r
+ SETZB ACEXT,INDIR+3 ;RESET EXTENSION AND PROGRAM-NUMBER PAIR\r
+NAME3: MOVSI ACPNTR,(POINT 6,AC0) ;SET POINTER\r
+ TDZA AC0,AC0 ;CLEAR SYMBOL\r
+\r
+SLASH: PUSHJ PP,SW0\r
+GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER\r
+ CAIN C,"/"\r
+ JRST SLASH\r
+ CAIN C,"("\r
+ JRST SWITCH\r
+ CAIN C,":"\r
+ JRST DEVICE\r
+ CAIN C,"."\r
+ JRST NAME\r
+IFN CCLSW,<CAIE C,"!" ;IS CHAR AN IMPARTIVE?\r
+ CAIN C,"@"\r
+ JRST TERM ;YES, GO DO IT>\r
+ CAIE C,33 ;CHECK FOR THREE FLAVORS OF ALT-MODE\r
+ CAIN C,176 ;...\r
+ JRST TERM ;...\r
+ CAIE C,175 ;OR 3RD ALTMOD\r
+ CAIN C,CR ;CR?\r
+ JRST TERM\r
+ CAIN C,"["\r
+ JRST PROGNP\r
+ CAIE C,","\r
+ CAIN C,"_"\r
+ JRST TERM\r
+ SUBI C,40 ;CONVERT TO 6-BIT\r
+ TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES?\r
+ IDPB C,ACPNTR ;NO, STORE IT\r
+ JRST GETIOC ;GET NEXT CHARACTER\r
+\r
+DEVICE: SKIPA ACDEV,0 ;ERROR IF ALREADY SET\r
+\r
+NAME: MOVE ACFILE,AC0 ;FILE NAME\r
+ MOVE ACDEL,C ;SET DELIMITER\r
+ JRST NAME3\r
+\r
+TERM: JUMPE ACDEL,TERM1 ;IF NO PREVIOUS TERMINATOR, THEN FILENAME\r
+ CAIN ACDEL,"_" ;...\r
+ JRST TERM1 ;...\r
+ CAIE ACDEL,":" ;IF PREVIOUS DELIMITER\r
+ CAIN ACDEL,"," ;WAS COLON OR COMMA\r
+TERM1: MOVE ACFILE,AC0 ;SET FILE\r
+ CAIN ACDEL,"." ;IF PERIOD\r
+ HLLZ ACEXT,AC0 ;SET EXTENSION\r
+ HRLM C,ACDELX ;SAVE PREVIOUS DELIMITER\r
+ MOVEM ACDEV,ACDEVX ;USE LAST DEVICE\r
+ CAIN C,"!" ;IMPERATIVE?\r
+ POPJ PP, ;YES, DON'T ASSUME DEV\r
+ JUMPE ACFILE,POPOUT ;IF THERE IS A FILE,\r
+ SKIPN ACDEV ;BUT NO DEVICE\r
+ MOVSI ACDEV,(SIXBIT /DSK/) ;THEN ASSUME DISK\r
+ POPJ PP, ;EXIT\r
+\r
+\fPROGNP: JUMPL PP,PROGN2\r
+\r
+ERRCM: HRROI RC,[SIXBIT /COMMAND ERROR@/]\r
+ JRST ERRNE0\r
+\r
+PROGN1: HRLZM RC,INDIR+3\r
+PROGN2: MOVEI RC,0 ;CLEAR AC\r
+PROGN3: PUSHJ PP,TTYIN\r
+ CAIN C,","\r
+ JRST PROGN1 ;STORE LEFT HALF\r
+ HRRM RC,INDIR+3\r
+ CAIN C,135\r
+ JRST GETIOC\r
+ LSH RC,3 ;SHIFT PREVIOUS RESULT\r
+ ADDI RC,-"0"(C) ;ADD IN NEW NUMBER\r
+ JRST PROGN3\r
+\fSWITC0: PUSHJ PP,SW1\r
+SWITCH: PUSHJ PP,TTYIN ;GET NEXT CHARACTER\r
+ CAIE C,")" ;END OF STRING?\r
+ JRST SWITC0 ;NO\r
+ JRST GETIOC ;YES\r
+\r
+SW0: PUSHJ PP,TTYIN\r
+SW1: MOVEI C,-"A"(C) ;CONVERT FROM ASCII TO NUMERIC\r
+ CAILE C,"Z"-"A" ;WITHIN BOUNDS? (IS IT ALPHA?)\r
+ JRST ERRCM ;NO, ERROR\r
+ MOVE RC,[POINT 4,BYTAB]\r
+ IBP RC\r
+ SOJGE C,.-1 ;MOVE TO PROPER BYTE\r
+ LDB C,RC ;PICK UP BYTE\r
+ JUMPE C,ERRCM ;TEST FOR VALID SWITCH\r
+ CAIG C,SWTABT-SWTAB ;LEGAL ON SOURCE?\r
+ JUMPL PP,ERRCM ;NO, TEST FOR SOURCE\r
+ LDB RC,[POINT 4,SWTAB-1(C),12]\r
+ CAIN RC,IO\r
+ SKIPN CTLSAV ;IF PASS2 OR IO SWITCH\r
+ XCT SWTAB-1(C) ;EXECUTE INSTRUCTION\r
+ POPJ PP,\r
+\r
+\f DEFINE SETSW (LETTER,INSTRUCTION) < INSTRUCTION\r
+J= <"LETTER"-"A">-9*<I=<"LETTER"-"A">/9>\r
+ SETCOD \I,J>\r
+\r
+ DEFINE SETCOD (I,J)\r
+ <BYTAB'I=BYTAB'I!<.-SWTAB>B<4*J+3>>\r
+\r
+BYTAB0= 0 ;INITIALIZE TABLE\r
+BYTAB1= 0\r
+BYTAB2= 0\r
+\r
+SWTAB:\r
+ SETSW Z,<TLO TIO,TIOCLD >\r
+ SETSW C,<TLZ FR,CREFSW >\r
+ SETSW P,<SOS PDP >\r
+SWTABT: ;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY\r
+ SETSW A,<ADDI CS,1 >\r
+ SETSW B,<SUBI CS,1 >\r
+ SETSW E,<TLZ IO,IOPALL >\r
+ SETSW L,<TLZ IO,IOMSTR >\r
+ SETSW N,<HLLOS TYPERR >\r
+ SETSW Q,<TLO FR,ERRQSW >\r
+ SETSW S,<TLO IO,IOMSTR >\r
+ SETSW T,<TLO TIO,TIOLE >\r
+ SETSW W,<TLO TIO,TIORW >\r
+ SETSW X,<TLO IO,IOPALL >\r
+IFG .-SWTAB-17,<PRINTX SWITCH TABLE TOO LONG, CHANGE BYTE SIZE>\r
+\r
+BYTAB: ;BYTAB CONTAINS AN INDEX TO SWTAB\r
+ ;IT CONSIST OF 9 4BIT BYTES/WORD\r
+ ;OR ONE BYTE FOR EACH LETTER\r
+\r
+ +BYTAB0 ;A-G BYTE = 1 THROUGH 17 = INDEX\r
+ +BYTAB1 ;H-N BYTE = 0 = COMMAND ERROR\r
+ +BYTAB2 ;O-U\r
+\r
+\fTTYIN: ILDB C,CTIBUF+1 ;GET CHARACTER\r
+ CAIE C," " ;SKIP BLANKS\r
+ CAIN C,HT ;AND TABS\r
+ JRST TTYIN\r
+ CAIE C,LF\r
+ POPJ PP,\r
+\r
+ERRNE: HRROI RC,[SIXBIT /?NO END STATEMENT ENCOUNTERED ON INPUT FILE@/]\r
+ PUSHJ PP,TYPMSG\r
+ SKIPN LITLVL ;SET IF IN LITERAL\r
+ JRST ERRNE1 ;NO, TRY OTHERS\r
+ MOVE V,[XWD [SIXBIT /LITERAL@/],LITPG]\r
+ PUSHJ PP,PRNUM\r
+ERRNE1: MOVEI V,0 ;CHECK FOR OTHER PLACES\r
+ SKIPE INDEF\r
+ MOVE V,[XWD [SIXBIT /DEFINE@/],DEFPG]\r
+ SKIPE INTXT\r
+ MOVE V,[XWD [SIXBIT /TEXT@/],TXTPG]\r
+ SKIPE INREP\r
+ MOVE V,[XWD [SIXBIT /CONDITIONAL OR REPEAT@/],REPPG]\r
+ SKIPGE MACENL\r
+ MOVE V,[XWD [SIXBIT /MACRO CALL@/],CALPG]\r
+ SKIPE V\r
+ PUSHJ PP,PRNUM ;GO PRINT INFORMATION\r
+ HRROI RC,[SIXBIT /@/] ;WILL GET A RETURN\r
+ JRST ERRNE0\r
+\r
+ERRMS3: SIXBIT / ERRORS DETECTED@/\r
+ERRMS2: SIXBIT /?1 ERROR DETECTED@/\r
+ERRMS1: SIXBIT /NO ERRORS DETECTED@/\r
+EINIT: MOVE RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE@/]]\r
+ JRST ERRNE0\r
+\fERREF: SKIPA RC,[XWD [SIXBIT /CANNOT ENTER FILE@/],ACFILE]\r
+ERRCF: MOVE RC,[XWD [SIXBIT /CANNOT FIND@/],ACFILE]\r
+ERRNE0: PUSHJ PP,CRLF\r
+ MOVEI C,77\r
+ PUSHJ PP,TYO\r
+ PUSHJ PP,TYPMS1\r
+ JRST M\r
+\fTYPMSG: PUSHJ PP,CRLF ;MOVE TO NEXT LINE\r
+TYPMS1: HLRZ CS,RC ;GET FIRST MESSAGE\r
+ CAIE CS,-1 ;SKIP IF MINUS ONE\r
+ PUSHJ PP,TYPM2 ;TYPE MESSAGE\r
+ HRRZ CS,RC ;GET SECOND HALF\r
+ PUSHJ PP,TYPM2\r
+\r
+CRLF: MOVEI C,CR ;OUTPUT CARRIAGE RETURN\r
+ PUSHJ PP,TYO\r
+ MOVEI C,LF ;AND LINE FEED\r
+\r
+TYO: SOSG CTOBUF+2 ;BUFFER FULL?\r
+ OUTPUT CTL,0 ;YES, DUMP IT\r
+ IDPB C,CTOBUF+1 ;STORE BYTE\r
+ CAIE C,FF ;FORM FEED?\r
+ CAIN C,LF ;V TAB OR LINE FEED?\r
+ OUTPUT CTL,0 ;YES\r
+ POPJ PP, ;AND EXIT\r
+\r
+TYPM2: MOVSI C,(1B0) ;ANTICIPATE REGISTER WORD\r
+ CAIG CS,17 ;IS IT?\r
+ MOVEM C,1(CS)\r
+ HRLI CS,(POINT 6,,) ;FORM BYTE POINTER\r
+\r
+TYPM3: ILDB C,CS ;GET A SIXBIT BYTE\r
+ CAIN C,40 ;"@"?\r
+ JRST TYO ;YES, TYPE SPACE AND EXIT\r
+ ADDI C,40 ;NO, FORM 7-BIT ASCII\r
+ PUSHJ PP,TYO ;OUTPUT CHARACTER\r
+ JRST TYPM3\r
+\r
+\fXCEEDS: ADDI SX,2000 ;ADJUST SYMBOL POINTER\r
+XCEED: PUSHJ PP,SAVEXS ;SAVE THE REGISTERS\r
+ HRRZ 1,JOBREL ;GET CURRENT TOP\r
+ MOVEI 0,2000(1)\r
+XCEED2: HRROI RC,[SIXBIT /INSUFFICIENT CORE@/]\r
+ CORE 0 ;REQUEST MORE CORE\r
+ JRST ERRNE0 ;ERROR, BOMB OUT\r
+ HRRZ 2,JOBREL ;GET NEW TOP\r
+\r
+XCEED1: MOVE 0,0(1) ;GET ORIGIONAL\r
+ MOVEM 0,0(2) ;STORE IN NEW LOCATION\r
+ SUBI 2,1 ;DECREMENT UPPER\r
+ CAMLE 1,SYMBOL ;HAVE WE ARRIVED?\r
+ SOJA 1,XCEED1 ;NO, GET ANOTHER\r
+ MOVEI 1,2000\r
+ ADDM 1,SYMBOL\r
+ ADDM 1,116\r
+ ADDM 1,SYMTOP\r
+ PUSHJ PP,SRCHI ;RE-INITIALIZE SYMBOL TABLE\r
+ JRST RSTRXS ;RESTORE REGISTERS AND EXIT\r
+\r
+PDPERR: HRROI RC,[SIXBIT .PDP OVERFLOW, TRY /P@.]\r
+ JRST ERRNE0\r
+\r
+PRNUM: HLRZ CS,V ;GET MESSAGE\r
+ PUSHJ PP,TYPM2\r
+ MOVE AC0,(V) ;GET PAGE\r
+ PUSHJ PP,DP1 ;PRINT NUMBER\r
+ MOVEI C,40\r
+ PUSHJ PP,TYO\r
+ SKIPN AC1,1(V) ;GET SEQ NUM IF THERE\r
+ POPJ PP,\r
+ MOVEM AC1,OUTSQ\r
+ MOVEI AC0,OUTSQ\r
+ OUTPUT CTL,0 ;TO MAKE THINGS PRINT IN RIGHT ORDER\r
+ DDTOUT AC0,\r
+ MOVEI C,40\r
+ JRST TYO ;AND RETURN\r
+\r
+DP1: IDIVI AC0,^D10\r
+ HRLM AC1,(PP)\r
+ SKIPE AC0\r
+ PUSHJ PP,DP1\r
+ HLRZ C,(PP)\r
+ ADDI C,"0"\r
+ JRST TYO\r
+\fRIM0: TDO FR,AC0 ;SET RIM/RIM10 FLAG\r
+ TLNE FR,PNCHSW ;FORGET IT IF PUNCH RESET\r
+ SETSTS BIN,IB ;SET TO IMAGE BINARY MODE\r
+ POPJ PP,\r
+\r
+ROUT: EXCH CS,RIMLOC\r
+ SUB PP,[XWD 1,1] ;CLEAR OUT STACK WFW\r
+ TLNE FR,R1BSW\r
+ JRST ROUT6\r
+ TLNN FR,RIM1SW\r
+ JRST ROUT1\r
+ JUMPE CS,ROUT1\r
+ SUB CS,RIMLOC\r
+ JUMPE CS,ROUT1\r
+ JUMPG CS,ERRAX\r
+ MOVEI C,0\r
+ PUSHJ PP,PTPBIN\r
+ AOJL CS,.-1\r
+ROUT1: MOVSI C,(DATAI PTR,) ;RIM OUTPUT\r
+ HRR C,LOCO ;GET ADDRESS\r
+ TLNE FR,RIM1SW ;NO DATAI IF RIM10 \r
+ AOSA RIMLOC\r
+ PUSHJ PP,PTPBIN ;OUTPUT\r
+ MOVE C,AC0 ;CODE\r
+ AOSA LOCO ;INCREMENT CURRENT LOCATION\r
+\r
+OUTBIN: TLNN FR,RIMSW!RIM1SW!R1BSW ;EXIT IF RIM MODE\r
+PTPBIN: TLNN FR,PNCHSW ;EXIT IF PUNCH NOT REQUESTED\r
+ POPJ PP,\r
+ SOSG BINBUF+2 ;TEST FOR BUFFER FULL\r
+ PUSHJ PP,DMPBIN ;YES, DUMP IT\r
+ IDPB C,BINBUF+1 ;DEPOSIT BYTE\r
+ POPJ PP, ;EXIT\r
+\fDMPBIN: OUTPUT BIN,0 ;DUMP THE BUFFER\r
+TSTBIN: STATO BIN,740000 ;GET STATUS BITS\r
+ POPJ PP, ;NO, EXIT\r
+ MOVE AC0,BINDEV ;YES, GET TAG\r
+ JRST ERRLST\r
+\f\r
+R1BDMP: SETCM CS,R1BCNT\r
+ JUMPE CS,R1BI\r
+ HRLZS C,CS\r
+ HRR C,R1BLOC\r
+ HRRI C,-1(C)\r
+ MOVEM C,R1BCHK\r
+ PUSHJ PP,PTPBIN\r
+ HRRI CS,R1BBLK\r
+R1BDM1: MOVE C,0(CS)\r
+ ADDM C,R1BCHK\r
+ PUSHJ PP,PTPBIN\r
+ AOBJN CS,R1BDM1\r
+ MOVE C,R1BCHK\r
+ PUSHJ PP,PTPBIN\r
+R1BI: SETOM R1BCNT\r
+ PUSH PP,LOCO\r
+ POP PP,R1BLOC\r
+ POPJ PP,\r
+\r
+ROUT6: CAME CS,RIMLOC\r
+ PUSHJ PP,R1BDMP\r
+ AOS C,R1BCNT\r
+ MOVEM 0,R1BBLK(C)\r
+ AOS LOCO\r
+ CAIN C,21\r
+ PUSHJ PP,R1BDMP\r
+ AOS RIMLOC\r
+ POPJ PP,\r
+\fREAD0: PUSHJ PP,EOT\r
+READ: SOSG IBUF+2 ;BUFFER EMPTY?\r
+ JRST READ3 ;YES\r
+READ1: ILDB C,IBUF+1 ;PLACE CHARACTER IN C\r
+ MOVE CS,@IBUF+1 ;CHECK FOR SEQUENCE NUMBER\r
+ TRNN CS,1\r
+ JRST READ1A\r
+ CAIN CS,1 ;CHECK FOR SPECIAL\r
+ MOVE CS,[<ASCII/ />+1]\r
+ MOVEM CS,SEQNO\r
+ MOVEM CS,SEQNO2\r
+ MOVNI CS,4\r
+ ADDM CS,IBUF+2 ;ADJUST WORD COUNT\r
+REPEAT 4,< IBP IBUF+1> ;SKIP SEQ NU\r
+ PUSHJ PP,READ ;AND THE TAB\r
+ JRST READ ;GET NEXT CHARACTER\r
+\r
+READ1A: JUMPE C,READ ;IGNORE NULL\r
+ JUMP2 READ1B\r
+ CAIN C,14\r
+ AOS PAGENO\r
+READ1B: CAIN C,32 ;IF IT'S A "^Z"\r
+ MOVEI C,LF ;TREAT IT AS A "LF"\r
+ CAIE C,37 ;CONTROL _\r
+ POPJ PP,\r
+READ2: PUSHJ PP,READ ;YES, TEST FOR LINE FEED\r
+ PUSHJ PP,RSW2 ;LIST IN ANY EVENT\r
+ CAIE C,LF ;IS IT LF\r
+ JRST READ2 ;NO\r
+ PUSHJ PP,OUTIM1 ;YES, DUMP THE LINE\r
+ JRST READ ;RETURN NEXT CHARACTER\r
+\r
+READ3: INPUT CHAR,0 ;GET NEXT BUFFER\r
+ STATO CHAR,762000 ;NO ERRORS\r
+ JRST READ1\r
+ STATO CHAR,742000 ;ERRORS?\r
+ JRST READ0 ;EOF\r
+ MOVE AC0,INDEV\r
+ MOVSI RC,[SIXBIT /INPUT ERROR ON DEVICE@/]\r
+ JRST ERRNE0\r
+\fOUTAB2: PUSHJ PP,OUTTAB ;PRINT TWO TABS\r
+OUTTAB: MOVEI C,HT\r
+PRINT: CAIN C,LF ;IS THIS A LF?\r
+ JRST OUTCR ;YES, GO PROCESS\r
+ CAIN C,CR ;OR CR?\r
+ POPJ PP,\r
+ CAIN C,FF ;FORM FEED?\r
+ JRST OUTFF ;YES FORCE NEW PAGE\r
+ JRST OUTL\r
+\r
+OUTCR: TRNN ER,ERRORS!LPTSW!TTYSW\r
+ POPJ PP,\r
+ MOVEI C,CR ;CARRIAGE RETURN, LINE FEED\r
+ PUSHJ PP,OUTL\r
+ SOSGE LPP ;END OF PAGE?\r
+ TLO IO,IOPAGE ;YES, SET FLAG\r
+ TRCA C,7 ;FORM LINE FEED AND SKIP\r
+\r
+OUTL: TLZN IO,IOPAGE ;NEW PAGE REQUESTED?\r
+ JRST OUTC ;NO\r
+ JUMP1 OUTC ;YES, BYPASS IF PASS ONE\r
+ PUSH PP,C ;SAVE C AND CS\r
+ PUSH PP,CS\r
+ PUSH PP,ER\r
+ TLNN IO,IOMSTR!IOPROG\r
+ HRR ER,OUTSW\r
+ MOVEI C,.LPP \r
+ MOVEM C,LPP ;SET NEW COUNTER\r
+ MOVEI C,CR\r
+ PUSHJ PP,OUTC\r
+ MOVEI C,FF\r
+ PUSHJ PP,OUTC ;OUTPUT FORM FEED\r
+ MOVEI CS,TBUF\r
+ PUSHJ PP,OUTAS0 ;OUTPUT TITLE\r
+ MOVEI CS,VBUF\r
+ PUSHJ PP,OUTAS0 ;OUTPUT VERSION\r
+ MOVE C,PAGENO\r
+ PUSHJ PP,DNC ;OUTPUT PAGE NUMBER\r
+ AOSG PAGEN. ;FIRST PAGE OF THIS NUMBER?\r
+ JRST OUTL1\r
+ MOVEI C,"-" ;NO, PUT OUT MODIFIER\r
+ PUSHJ PP,OUTC\r
+ MOVE C,PAGEN.\r
+ PUSHJ PP,DNC\r
+OUTL1: PUSHJ PP,OUTCR\r
+ HRRZ CS,SUBTTX ;SWITCH FOR SUB-TITLE\r
+ SKIPE 0(CS) ;IS THERE A SUB-TITLE?\r
+ PUSHJ PP,OUTTAB ;YES, OUTPUT A TAB\r
+ PUSHJ PP,SOUT20 ;OUTPUT ASCII WITH CARRIAGE RETURN\r
+ PUSHJ PP,OUTCR\r
+ POP PP,ER\r
+ POP PP,CS\r
+ POP PP,C\r
+\r
+OUTC: TRNE ER,ERRORS!TTYSW\r
+ PUSHJ PP,TYO\r
+ TRNN ER,LPTSW\r
+ POPJ PP,\r
+OUTLST: SOSG LSTBUF+2 ;BUFFER FULL?\r
+ PUSHJ PP,DMPLST ;YES, DUMP IT\r
+ IDPB C,LSTBUF+1 ;STORE BYTE\r
+ POPJ PP,\r
+DMPLST: OUTPUT LST,0 ;OUTPUT BUFFER\r
+TSTLST: STATO LST,740000\r
+ POPJ PP,\r
+ MOVE 0,LSTDEV\r
+ERRLST: MOVSI RC,[SIXBIT /DATA ERROR DEVICE@/]\r
+ JRST ERRNE0\r
+\fPAGE0:\r
+OUTFF: AOS PAGENO\r
+ SETOM PAGEN.\r
+ TLO IO,IOPAGE\r
+ POPJ PP,\r
+\r
+OTOD1: IBP CS\r
+OTOD: IDIVI 2,^D10\r
+ ADDI 2,60 ;FORM ASCII\r
+ IDPB 2,CS\r
+ ADDI 3,60\r
+ IDPB 3,CS\r
+ POPJ PP,\r
+\r
+DTAB: ASCII "JAN-"\r
+ ASCII "FEB-"\r
+ ASCII "MAR-"\r
+ ASCII "APR-"\r
+ ASCII "MAY-"\r
+ ASCII "JUN-"\r
+ ASCII "JUL-"\r
+ ASCII "AUG-"\r
+ ASCII "SEP-"\r
+ ASCII "OCT-"\r
+ ASCII "NOV-"\r
+ ASCII "DEC-"\r
+\fSUBTTL MACHINE INSTRUCTION SEARCH ROUTINES\r
+OPTSCH: MOVEI RC,0\r
+ MOVEI ARG,1B^L<OP1END-OP1TOP> ;SET UP INDEX\r
+ MOVEI V,1B^L<OP1END-OP1TOP>/2 ;SET UP INCREMENT\r
+OPT1A: CAMN AC0,OP1TOP(ARG) ;ARE WE POINTING AT SYMBOL?\r
+ JRST OPT1D ;YES, GET THE CODE\r
+ JUMPE V,POPOUT ;TEST FOR END\r
+ CAML AC0,OP1TOP(ARG) ;NO, SHOULD WE MOVE DOWN?\r
+ TDOA ARG,V ;NO, INCREMENT\r
+OPT1B: SUB ARG,V ;YES, DECREMENT\r
+ ASH V,-1 ;HALVE INCREMENT\r
+ CAIG ARG,OP1END-OP1TOP ;ARE WE OUT OF BOUNDS?\r
+ JRST OPT1A ;NO, TRY AGAIN\r
+ JRST OPT1B ;YES, BRING IT DOWN A PEG\r
+OPT1D: IDIVI ARG,4 ;ARG HAS INDEX USED IN OPTTAB\r
+ LDB V,OPTTAB(V) ;V HAS INDEX TO OPTTAB\r
+ CAIL V,700 ;PSEUDO-OP OR IO INSTRUCTION?\r
+ JRST OPT1G ;YES\r
+ ROT V,-^D9 ;LEFT JUSTIFY\r
+ HRRI V,OPD ;POINT TO BASIC FORMAT\r
+OPT1F: AOS 0(PP) ;SET FOR SKIP EXIT\r
+ MOVEI SDEL,%OP ;SET OP-CODE CROSS-REF FLAG\r
+ JRST CREF ;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE\r
+OPT1G: TLNN AC0,200000 ;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE\r
+ SKIPA V,OP2TAB-700(V) ;2ND TABLE, FIRST LETTER IS "A" TO "O"\r
+ MOVE V,OP1TAB-700(V) ;1ST TABLE, ..."P" TO "Z"\r
+ JRST OPT1F ;EXIT\r
+OPTTAB:\r
+ POINT 9,OP1COD-1(ARG),35\r
+ POINT 9,OP1COD(ARG),8\r
+ POINT 9,OP1COD(ARG),17\r
+ POINT 9,OP1COD(ARG),26\r
+\r
+\fIFDEF .XCREF,< .XCREF ;DON'T CREF THIS MESS>\r
+ RELOC .-1\r
+OP1TOP:\r
+ RELOC\r
+\r
+ IF1,<N1=0\r
+ DEFINE X <N1=N1+1 ;>>\r
+\r
+ IF2, <\r
+ N2=^D36\r
+ CC=0\r
+ RELOC OP1COD\r
+ RELOC\r
+DEFINE X (SYMBOL,CODE) \r
+<SIXBIT /SYMBOL/\r
+CC=CC+CODE_<N2=N2-9>\r
+IFE N2, <OUTLIT>>\r
+\r
+DEFINE OUTLIT <\r
+ RELOC\r
+ +CC\r
+ RELOC\r
+N2=^D36+<CC=0>>>\r
+ SYN X,XX ;JUST THE SAME MACRO\r
+\fX ADD , 270\r
+X ADDB , 273\r
+X ADDI , 271\r
+X ADDM , 272\r
+\r
+X AND , 404\r
+X ANDB , 407\r
+X ANDCA , 410\r
+X ANDCAB, 413\r
+X ANDCAI, 411\r
+X ANDCAM, 412\r
+X ANDCB , 440\r
+X ANDCBB, 443\r
+X ANDCBI, 441\r
+X ANDCBM, 442\r
+X ANDCM , 420\r
+X ANDCMB, 423\r
+X ANDCMI, 421\r
+X ANDCMM, 422\r
+X ANDI , 405\r
+X ANDM , 406\r
+\r
+X AOBJN , 253\r
+X AOBJP , 252\r
+\r
+X AOJ , 340\r
+X AOJA , 344\r
+X AOJE , 342\r
+X AOJG , 347\r
+X AOJGE , 345\r
+X AOJL , 341\r
+X AOJLE , 343\r
+X AOJN , 346\r
+\r
+XX AOS , 350\r
+X AOSA , 354\r
+X AOSE , 352\r
+X AOSG , 357\r
+X AOSGE , 355\r
+X AOSL , 351\r
+X AOSLE , 353\r
+X AOSN , 356\r
+X ARG , 320\r
+X ASCII , 700\r
+XX ASCIZ , 701\r
+\r
+X ASH , 240\r
+X ASHC , 244\r
+\r
+X ASUPPR, 705\r
+X BLKI , 702\r
+X BLKO , 703\r
+X BLOCK , 704\r
+\r
+X BLT , 251\r
+\r
+X BYTE , 707\r
+\r
+XX CAI , 300\r
+X CAIA , 304\r
+X CAIE , 302\r
+X CAIG , 307\r
+X CAIGE , 305\r
+X CAIL , 301\r
+X CAILE , 303\r
+X CAIN , 306\r
+\r
+X CALL , 040\r
+XX CALLI , 047\r
+\r
+XX CAM , 310\r
+X CAMA , 314\r
+X CAME , 312\r
+X CAMG , 317\r
+X CAMGE , 315\r
+X CAML , 311\r
+X CAMLE , 313\r
+X CAMN , 316\r
+\r
+XX CLEAR , 400\r
+XX CLEARB, 403\r
+XX CLEARI, 401\r
+XX CLEARM, 402\r
+\r
+X CLOSE , 070\r
+\r
+\r
+X CONI , 710\r
+X CONO , 711\r
+X CONSO , 712\r
+X CONSZ , 713\r
+\r
+XX DATA. , 020\r
+\r
+X DATAI , 714\r
+X DATAO , 715\r
+X DEC , 716\r
+X DEFINE, 717\r
+X DEPHAS, 720\r
+\r
+X DFN , 131\r
+\r
+X DIV , 234\r
+X DIVB , 237\r
+X DIVI , 235\r
+X DIVM , 236\r
+\r
+X DPB , 137\r
+\r
+X END , 721\r
+\r
+X ENTER , 077\r
+\r
+X ENTRY , 722\r
+\r
+X EQV , 444\r
+X EQVB , 447\r
+X EQVI , 445\r
+X EQVM , 446\r
+\r
+X EXCH , 250\r
+\r
+X EXP , 723\r
+XX EXTERN, 724\r
+\r
+X FAD , 140\r
+X FADB , 143\r
+X FADL , 141\r
+X FADM , 142\r
+\r
+X FADR , 144\r
+X FADRB , 147\r
+X FADRI , 145\r
+X FADRM , 146\r
+\r
+X FDV , 170\r
+X FDVB , 173\r
+X FDVL , 171\r
+X FDVM , 172\r
+\r
+X FDVR , 174\r
+X FDVRB , 177\r
+X FDVRI , 175\r
+X FDVRM , 176\r
+\r
+XX FIN. , 021\r
+\r
+\r
+X FMP , 160\r
+X FMPB , 163\r
+X FMPL , 161\r
+X FMPM , 162\r
+\r
+\fX FMPR , 164\r
+X FMPRB , 167\r
+X FMPRI , 165\r
+X FMPRM , 166\r
+\r
+X FSB , 150\r
+X FSBB , 153\r
+X FSBL , 151\r
+X FSBM , 152\r
+\r
+X FSBR , 154\r
+X FSBRB , 157\r
+X FSBRI , 155\r
+X FSBRM , 156\r
+\r
+X FSC , 132\r
+\r
+X GETSTS, 062\r
+\r
+\fX HALT , 725\r
+IFN RENTSW, <X HISEG , 706>\r
+\r
+X HLL , 500\r
+X HLLE , 530\r
+X HLLEI , 531\r
+X HLLEM , 532\r
+X HLLES , 533\r
+X HLLI , 501\r
+X HLLM , 502\r
+X HLLO , 520\r
+X HLLOI , 521\r
+X HLLOM , 522\r
+X HLLOS , 523\r
+X HLLS , 503\r
+X HLLZ , 510\r
+X HLLZI , 511\r
+X HLLZM , 512\r
+X HLLZS , 513\r
+\r
+X HLR , 544\r
+X HLRE , 574\r
+X HLREI , 575\r
+X HLREM , 576\r
+X HLRES , 577\r
+X HLRI , 545\r
+X HLRM , 546\r
+X HLRO , 564\r
+X HLROI , 565\r
+X HLROM , 566\r
+X HLROS , 567\r
+X HLRS , 547\r
+X HLRZ , 554\r
+X HLRZI , 555\r
+X HLRZM , 556\r
+X HLRZS , 557\r
+\r
+\fX HRL , 504\r
+X HRLE , 534\r
+X HRLEI , 535\r
+X HRLEM , 536\r
+X HRLES , 537\r
+X HRLI , 505\r
+X HRLM , 506\r
+X HRLO , 524\r
+X HRLOI , 525\r
+X HRLOM , 526\r
+X HRLOS , 527\r
+X HRLS , 507\r
+X HRLZ , 514\r
+X HRLZI , 515\r
+X HRLZM , 516\r
+X HRLZS , 517\r
+\r
+X HRR , 540\r
+X HRRE , 570\r
+X HRREI , 571\r
+X HRREM , 572\r
+X HRRES , 573\r
+X HRRI , 541\r
+X HRRM , 542\r
+X HRRO , 560\r
+X HRROI , 561\r
+X HRROM , 562\r
+X HRROS , 563\r
+X HRRS , 543\r
+X HRRZ , 550\r
+X HRRZI , 551\r
+X HRRZM , 552\r
+X HRRZS , 553\r
+\r
+X IBP , 133\r
+\r
+X IDIV , 230\r
+X IDIVB , 233\r
+X IDIVI , 231\r
+X IDIVM , 232\r
+\r
+X IDPB , 136\r
+\r
+X IF1 , 726\r
+X IF2 , 727\r
+X IFB , 730\r
+X IFDEF , 731\r
+X IFDIF , 732\r
+X IFE , 733\r
+X IFG , 734\r
+X IFGE , 735\r
+X IFIDN , 736\r
+X IFL , 737\r
+X IFLE , 740\r
+X IFN , 741\r
+X IFNB , 742\r
+X IFNDEF, 743\r
+\r
+X ILDB , 134\r
+\r
+X IMUL , 220\r
+X IMULB , 223\r
+X IMULI , 221\r
+X IMULM , 222\r
+\r
+X IN , 056\r
+XX IN. , 016\r
+X INBUF , 064\r
+XX INF. , 026\r
+X INIT , 041\r
+X INPUT , 066\r
+\r
+XX INTERN, 744\r
+\r
+X IOR , 434\r
+X IORB , 437\r
+X IORI , 435\r
+X IORM , 436\r
+\r
+\r
+X IOWD , 745\r
+X IRP , 746\r
+X IRPC , 747\r
+X JCRY , 750\r
+X JCRY0 , 751\r
+X JCRY1 , 752\r
+X JEN , 753\r
+\r
+XX JFCL , 255\r
+\r
+X JFFO , 243\r
+X JFOV , 765\r
+X JOV , 754\r
+\r
+X JRA , 267\r
+XX JRST , 254\r
+\r
+X JRSTF , 755\r
+\r
+X JSA , 266\r
+XX JSP , 265\r
+X JSR , 264\r
+\r
+XX JUMP , 320\r
+XX JUMPA , 324\r
+X JUMPE , 322\r
+X JUMPG , 327\r
+X JUMPGE, 325\r
+X JUMPL , 321\r
+X JUMPLE, 323\r
+X JUMPN , 326\r
+\r
+X LALL , 756\r
+\r
+X LDB , 135\r
+\r
+X LIST , 757\r
+X LIT , 760\r
+X LOC , 761\r
+\r
+X LOOKUP, 076\r
+\r
+X LSH , 242\r
+X LSHC , 246\r
+X MLOFF , 767\r
+X MLON , 766\r
+XX MOVE , 200\r
+XX MOVEI , 201\r
+XX MOVEM , 202\r
+X MOVES , 203\r
+X MOVM , 214\r
+X MOVMI , 215\r
+X MOVMM , 216\r
+X MOVMS , 217\r
+X MOVN , 210\r
+X MOVNI , 211\r
+X MOVNM , 212\r
+X MOVNS , 213\r
+X MOVS , 204\r
+X MOVSI , 205\r
+X MOVSM , 206\r
+X MOVSS , 207\r
+\r
+\r
+X MTAPE , 072\r
+XX MTOP. , 024\r
+\r
+X MUL , 224\r
+X MULB , 227\r
+X MULI , 225\r
+X MULM , 226\r
+XX NLI. , 031\r
+XX NLO. , 032\r
+\r
+X NOSYM , 762\r
+\r
+\fX OCT , 763\r
+X OPDEF , 764\r
+\r
+X OPEN , 050\r
+\r
+X OR , 434\r
+X ORB , 437\r
+X ORCA , 454\r
+X ORCAB , 457\r
+X ORCAI , 455\r
+X ORCAM , 456\r
+X ORCB , 470\r
+X ORCBB , 473\r
+\r
+X ORCBI , 471\r
+X ORCBM , 472\r
+X ORCM , 464\r
+X ORCMB , 467\r
+X ORCMI , 465\r
+X ORCMM , 466\r
+X ORI , 435\r
+X ORM , 436\r
+\r
+X OUT , 057\r
+XX OUT. , 017\r
+X OUTBUF, 065\r
+XX OUTF. , 027\r
+X OUTPUT, 067\r
+\r
+\fX PAGE , 700\r
+X PASS2 , 701\r
+X PHASE , 702\r
+X POINT , 703\r
+\r
+XX POP , 262\r
+XX POPJ , 263\r
+\r
+X PRINTX, 704\r
+X PURGE , 705\r
+\r
+XX PUSH , 261\r
+XX PUSHJ , 260\r
+\r
+X RADIX , 706\r
+X RADIX5, 707\r
+\r
+X RELEAS, 071\r
+\r
+X RELOC , 710\r
+X REMARK, 711\r
+\r
+X RENAME, 055\r
+\r
+X REPEAT, 712\r
+\r
+XX RESET., 015\r
+X RIM , 715\r
+X RIM10 , 735\r
+X RIM10B, 736\r
+\r
+X ROT , 241\r
+X ROTC , 245\r
+\r
+X RSW , 716\r
+XX RTB. , 022\r
+\r
+X SETA , 424\r
+X SETAB , 427\r
+X SETAI , 425\r
+X SETAM , 426\r
+X SETCA , 450\r
+X SETCAB, 453\r
+X SETCAI, 451\r
+X SETCAM, 452\r
+X SETCM , 460\r
+X SETCMB, 463\r
+X SETCMI, 461\r
+X SETCMM, 462\r
+X SETM , 414\r
+X SETMB , 417\r
+X SETMI , 415\r
+X SETMM , 416\r
+X SETO , 474\r
+X SETOB , 477\r
+X SETOI , 475\r
+X SETOM , 476\r
+X SETSTS, 060\r
+X SETZ , 400\r
+X SETZB , 403\r
+X SETZI , 401\r
+XX SETZM , 402\r
+\r
+XX SIXBIT, 717\r
+\r
+XX SKIP , 330\r
+X SKIPA , 334\r
+X SKIPE , 332\r
+X SKIPG , 337\r
+X SKIPGE, 335\r
+X SKIPL , 331\r
+X SKIPLE, 333\r
+X SKIPN , 336\r
+\r
+XX SLIST., 025\r
+\r
+X SOJ , 360\r
+X SOJA , 364\r
+X SOJE , 362\r
+X SOJG , 367\r
+X SOJGE , 365\r
+X SOJL , 361\r
+X SOJLE , 363\r
+X SOJN , 366\r
+\r
+XX SOS , 370\r
+X SOSA , 374\r
+X SOSE , 372\r
+X SOSG , 377\r
+X SOSGE , 375\r
+X SOSL , 371\r
+X SOSLE , 373\r
+X SOSN , 376\r
+\r
+X SQUOZE, 707\r
+\r
+X STATO , 061\r
+X STATUS, 062\r
+X STATZ , 063\r
+\r
+X STOPI , 722\r
+\r
+X SUB , 274\r
+X SUBB , 277\r
+X SUBI , 275\r
+X SUBM , 276\r
+\r
+IF2,<SUBTL:>\r
+X SUBTTL, 723\r
+X SUPPRE, 713\r
+X SYN , 724\r
+X TAPE , 725\r
+\r
+\fX TDC , 650\r
+X TDCA , 654\r
+X TDCE , 652\r
+X TDCN , 656\r
+X TDN , 610\r
+X TDNA , 614\r
+X TDNE , 612\r
+X TDNN , 616\r
+X TDO , 670\r
+X TDOA , 674\r
+X TDOE , 672\r
+X TDON , 676\r
+X TDZ , 630\r
+X TDZA , 634\r
+X TDZE , 632\r
+X TDZN , 636\r
+\r
+X TITLE , 726\r
+\r
+X TLC , 641\r
+X TLCA , 645\r
+X TLCE , 643\r
+X TLCN , 647\r
+X TLN , 601\r
+X TLNA , 605\r
+XX TLNE , 603\r
+XX TLNN , 607\r
+XX TLO , 661\r
+X TLOA , 665\r
+X TLOE , 663\r
+X TLON , 667\r
+XX TLZ , 621\r
+XX TLZA , 625\r
+XX TLZE , 623\r
+XX TLZN , 627\r
+\r
+\fX TRC , 640\r
+X TRCA , 644\r
+X TRCE , 642\r
+X TRCN , 646\r
+X TRN , 600\r
+X TRNA , 604\r
+XX TRNE , 602\r
+XX TRNN , 606\r
+X TRO , 660\r
+X TROA , 664\r
+X TROE , 662\r
+X TRON , 666\r
+XX TRZ , 620\r
+X TRZA , 624\r
+X TRZE , 622\r
+X TRZN , 626\r
+\r
+X TSC , 651\r
+X TSCA , 655\r
+X TSCE , 653\r
+X TSCN , 657\r
+X TSN , 611\r
+X TSNA , 615\r
+X TSNE , 613\r
+\r
+X TSNN , 617\r
+X TSO , 671\r
+X TSOA , 675\r
+X TSOE , 673\r
+X TSON , 677\r
+X TSZ , 631\r
+X TSZA , 635\r
+X TSZE , 633\r
+X TSZN , 637\r
+X TTCALL, 051\r
+X UFA , 130\r
+X UGETF , 073\r
+X USETI , 074\r
+X USETO , 075\r
+\r
+X VAR , 727\r
+\r
+XX WTB. , 023\r
+\r
+X XALL , 732\r
+\r
+X XCT , 256\r
+\r
+X XLIST , 733\r
+\r
+X XOR , 430\r
+X XORB , 433\r
+X XORI , 431\r
+X XORM , 432\r
+\r
+X XWD , 734\r
+\r
+X Z , 000\r
+\r
+\r
+\r
+\f\r
+IF1, < BLOCK N1>\r
+OP1END: -1B36\r
+OP1COD: BLOCK N1/4\r
+ CC\r
+\r
+\r
+IFDEF .CREF,< .CREF ;START CREFFING AGAIN\r
+>\r
+\fSUBTTL PERMANENT SYMBOLS\r
+SYMNUM: EXP LENGTH/2 ;NUMBER OF PERMANENT SYMBOLS\r
+DEFINE P (A,B)<\r
+ SIXBIT /A/\r
+ XWD SYMF!40,B>\r
+\r
+P @, 0\r
+PRMTBL: ;PERMANENT SYMBOLS\r
+P APR, 0\r
+P CCI, 14\r
+P CDP, 110\r
+P CDR, 114\r
+P CPA, 0\r
+P CR, 150\r
+P DC, 200\r
+P DCSA, 300\r
+P DCSB, 304\r
+P DF, 270\r
+P DIS, 130\r
+P DLS, 240\r
+P DRUM, 400\r
+P DSK, 170\r
+P DTC, 210\r
+P DTS, 214\r
+P LPT, 124\r
+P MDF, 260\r
+P MTC, 220\r
+P MTM, 230\r
+P MTS, 224\r
+P PI, 4\r
+P PLT, 140\r
+P PTP, 100\r
+P PTR, 104\r
+P TDC, 320\r
+P TDS, 324\r
+P TMC, 340\r
+P TMS, 344\r
+P TTY, 120\r
+P UTC, 210\r
+P UTS, 214\r
+P ??????, 0\r
+PRMEND: ;END OF PERMANENT SYMBOLS\r
+\r
+LENGTH= .-SYMNUM ;LENGTH OF INITIAL SYMBOLS\r
+\r
+\f OPDEF ZL [Z LITF] ;INVALID IN LITERALS\r
+ OPDEF ZA [Z ADDF] ;INVALID IN ADDRESSES\r
+ OPDEF ZAL [Z ADDF!LITF]\r
+\r
+OP1TAB:\r
+\r
+ ZL PAGE0 ;PAGE\r
+ ZL PASS20 ;PASS2\r
+ ZL PHASE0 ;PHASE\r
+ Z POINT0 ;POINT\r
+ ZL PRINT0 ;PRINTX\r
+ ZL PURGE0 ;PURGE\r
+ ZL RADIX0 ;RADIX\r
+ Z RADX50 ;RADIX50,SQUOZE\r
+ ZL LOC0 (1) ;RELOC\r
+ ZL REMAR0 ;REMARK\r
+ ZL REPEA0 ;REPEAT\r
+ ZL SUPRE0 ;SUPRESS\r
+ Z ;?\r
+ ZL RIM0 (RIMSW) ;RIM\r
+ DATAI 0,IOP ;RSW\r
+ Z ASCII0 (1) ;SIXBIT\r
+ Z\r
+ Z\r
+; ZL IOSET (IOPALL!IOSALL) ;SALL\r
+ ZL STOPI0 ;STOPI\r
+ ZL SUBTT0 (Z (POINT 7,,)) ;SUBTTL\r
+ ZL SYN0 ;SYN\r
+ ZL TAPE0 ;TAPE\r
+ ZL TITLE0 (Z (POINT 7,,)) ;TITLE\r
+ ZL VAR0 ;VAR\r
+\r
+ Z\r
+ Z\r
+ ZL IOSET (IOPALL) ;XALL\r
+ ZL IOSET (IOPROG) ;XLIST\r
+ Z XWD0 ;XWD\r
+ ZL RIM0 (RIM1SW) ;RIM10\r
+ ZL RIM0 (R1BSW) ;RIM10B\r
+\fOP2TAB:\r
+\r
+ Z ASCII0 (0) ;ASCII\r
+ Z ASCII0 (1B18) ;ASCIZ\r
+ BLKI IOP ;BLKI\r
+ BLKO IOP ;BLKO\r
+ ZL BLOCK0 ;BLOCK\r
+ ZL SUPRSA ;ASUPPRESS\r
+IFN RENTSW,< ZL HISEG0 ;HISEG>\r
+IFE RENTSW,< Z ;HISEG>\r
+ Z BYTE0 ;BYTE\r
+ CONI IOP ;CONI\r
+ CONO IOP ;CONO\r
+ CONSO IOP ;CONSO\r
+ CONSZ IOP ;CONSZ\r
+ DATAI IOP ;DATAI\r
+ DATAO IOP ;DATAO\r
+ Z OCT0 (^D10) ;DEC\r
+ ZL DEFIN0 ;DEFINE\r
+\r
+ ZL DEPHA0 ;DEPHASE\r
+ ZL END0 ;END\r
+ ZL INTER0 (INTF!ENTF) ;ENTRY\r
+ Z EXPRES ;EXP\r
+ ZL EXTER0 ;EXTERN\r
+ JRST 4,OP ;HALT\r
+ TLNN FR,IFPASS ;IF1\r
+ TLNE FR,IFPASS ;IF2\r
+\r
+ TRNE AC0,IFB0 ;IFB\r
+ TLNE ARG,IFDEF0 ;IFDEF\r
+ Z IFIDN0 (0) ;IFDIF\r
+ SKIPE IF ;IFE\r
+ SKIPG IF ;IFG\r
+ SKIPGE IF ;IFGE\r
+ Z IFIDN0 (1) ;IFIDN\r
+ SKIPL IF ;IFL\r
+\r
+ SKIPLE IF ;IFLE\r
+ SKIPN IF ;IFN\r
+ TRNN AC0,IFB0 ;IFNB\r
+ TLNN ARG,IFDEF0 ;IFNDEF\r
+ ZL INTER0 (INTF) ;INTERN\r
+ Z IOWD0 ;IOWD\r
+ ZL IRP0 (0) ;IRP\r
+ ZL IRP0 (400000) ;IRPC\r
+\r
+ JFCL 6,OP ;JCRY\r
+ JFCL 4,OP ;JCRY0\r
+ JFCL 2,OP ;JCRY1\r
+ JRST 12,OP ;JEN\r
+ JFCL 10,OP ;JOV\r
+ JRST 2,OP ;JRSTF\r
+ ZL IORSET (IOPALL) ;LALL\r
+ ZL IORSET (IOPROG) ;LIST\r
+ ZL LIT0 ;LIT\r
+ ZL LOC0 (0) ;LOC\r
+ ZL IOSET (IONCRF) ;CREF\r
+; ZL OFFSYM ;NOSYM\r
+ Z OCT0 (^D8) ;OCT\r
+ ZL OPDEF0 ;OPDEF\r
+ JFCL 1,OP ;JFOV\r
+ ZL ONML ;MLON\r
+ ZL OFFML ;MLOFF\r
+; TRN ASCII0 (3B19) ;COMMENT\r
+\r
+\f SUBTTL USER-DEFINED SYMBOL SEARCH ROUTINES\r
+MSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH\r
+ POPJ PP, ;NOT FOUND, EXIT\r
+ JUMPG ARG,MSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND\r
+ CAME AC0,1(SX) ;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE\r
+ POPJ PP, ;NO, EXIT\r
+ ADDI SX,2 ;YES, POINT TO IT\r
+ PUSHJ PP,SRCH5 ;LOAD REGISTERS\r
+MSRCH2: AOSA 0(PP) ;SET SKIP-EXIT\r
+QSRCH: JUMPL ARG,SSRCH3 ;BRANCH IF OPERAND\r
+ MOVEI SDEL,%MAC ;SET OPERATOR FLAG\r
+ TLZE IO,DEFCRS ;IS IT A DEFINITION?\r
+ MOVEI SDEL,%DMAC ;YES\r
+ JRST CREF ;CROSS-REF AND EXIT\r
+\r
+SSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH\r
+ POPJ PP, ;NOT FOUND, EXIT\r
+ JUMPL ARG,SSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND\r
+SSRCH1: CAME AC0,-3(SX) ;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW\r
+ POPJ PP, ;NO DICE, EXIT\r
+ SUBI SX,2 ;YES, POINT TO IT\r
+ PUSHJ PP,SRCH5 ;LOAD REGISTERS\r
+SSRCH2: AOS 0(PP) ;SET FOR SKIP-EXIT\r
+SSRCH3: MOVEI SDEL,%SYM ;SET OPERAND FLAG\r
+\r
+CREF: TLNE FR,P1!CREFSW ;PASS ONE OR CROSS-REF SUPPRESSION?\r
+ POPJ PP, ;YES, EXIT\r
+ EXCH SDEL,C ;PUT FLAG IN C, SACE C\r
+ PUSH PP,CS\r
+ TLOE IO,IOCREF ;HAVE WE PUT OUT THE 177,102\r
+ JRST CREF3 ;YES\r
+ PUSH PP,C ;START OF CREF DATA\r
+ MOVEI C,0\r
+REPEAT 0,< ;NEEDS CHANGE TO CREF\r
+ MOVEI C,177\r
+ PUSHJ PP,OUTLST\r
+ MOVEI C,102\r
+ PUSHJ PP,OUTLST\r
+ TLO IO,IOCREF ;WE NOW ARE IN THAT STATE\r
+ POP PP,C ;WE HAVE NOW\r
+CREF3: JUMPE C,NOFLG ;JUST CLOSE IT\r
+ PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)\r
+ MOVSI CS,770000 ;COUNT CHRS\r
+ TDZA C,C ;STARTING AT 0\r
+ LSH CS,-6 ;TRY NEXT\r
+ TDNE AC0,CS ;IS THAT ONE THERE?\r
+ AOJA C,.-2 ;YES\r
+ PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS\r
+ MOVE CS,AC0\r
+\r
+CREF2: MOVEI C,0\r
+ LSHC C,6\r
+ ADDI C,40\r
+ PUSHJ PP,OUTLST ;THE ASCII SYMBOL\r
+ JUMPN CS,CREF2\r
+ MOVEI C,%DSYM\r
+ TLZE IO,DEFCRS\r
+ PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE\r
+NOFLG: MOVE C,SDEL\r
+ POP PP,CS\r
+ POPJ PP,\r
+\r
+CLSCRF: TRNN ER,LPTSW\r
+ POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING\r
+CLSCR2: MOVEI C,177\r
+ PUSHJ PP,PRINT\r
+ TLZE IO,IOCREF ;WAS IT OPEN?\r
+ JRST CLSCR1 ;YES, JUST CLOSE IT\r
+ MOVEI C,102 ;NO, OPEN IT FIRST\r
+ PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA\r
+ MOVEI C,177\r
+ PUSHJ PP,OUTLST\r
+CLSCR1: MOVEI C,103\r
+ JRST OUTLST ;MARK END OF CREF DATA\r
+\r
+CLSC3: TLZ IO,IOCREF\r
+ MOVEI C,177\r
+ PUSHJ PP,OUTLST\r
+ MOVEI C,104\r
+ JRST OUTLST ;177,104 CLOSES IT FOR NOW\r
+> ;END OF REPEAT 0\r
+REPEAT 1,< ;WORKS WITH EXISTING CREF\r
+ TLNE IO,IOPAGE\r
+ PUSHJ PP,OUTL ;GET CORRECT SUBTTL\r
+ MOVEI C,177\r
+ PUSHJ PP,OUTLST\r
+ MOVEI C,102\r
+ PUSHJ PP,OUTLST\r
+ POP PP,C ;WE HAVE NOW\r
+CREF3: PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)\r
+ MOVSI CS,770000 ;COUNT CHRS\r
+ TDZA C,C ;STARTING AT 0\r
+ LSH CS,-6 ;TRY NEXT\r
+ TDNE AC0,CS ;IS THAT ONE THERE?\r
+ AOJA C,.-2 ;YES\r
+ PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS\r
+ MOVE CS,AC0\r
+\r
+CREF2: MOVEI C,0\r
+ LSHC C,6\r
+ ADDI C,40\r
+ PUSHJ PP,OUTLST ;THE ASCII SYMBOL\r
+ JUMPN CS,CREF2\r
+ MOVEI C,%DSYM\r
+ TLZE IO,DEFCRS\r
+ PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE\r
+ MOVE C,SDEL\r
+ POP PP,CS\r
+ POPJ PP,\r
+\r
+CLSCRF: TRNN ER,LPTSW\r
+ POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING\r
+CLSCR2: TLZE IO,IOCREF ;FINISH UP LINE\r
+ JRST CLSCR1\r
+ MOVEI C,177\r
+ PUSHJ PP,PRINT\r
+ MOVEI C,102\r
+ PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA\r
+CLSCR1: MOVEI C,177\r
+ PUSHJ PP,OUTLST\r
+ MOVEI C,103\r
+ JRST OUTLST ;MARK END OF CREF DATA\r
+> ;END OF REPEAT 1\r
+\fSEARCH: HLRZ SX,SRCHX\r
+ HRRZ SDEL,SRCHX\r
+\r
+SRCH1: CAML AC0,-1(SX)\r
+ JRST SRCH3\r
+SRCH2: SUB SX,SDEL\r
+ LSH SDEL,-1\r
+ CAMG SX,SYMTOP\r
+ JUMPN SDEL,SRCH1\r
+ JUMPN SDEL,SRCH2\r
+ SOJA SX,POPOUT ;NOT FOUND\r
+\r
+SRCH3: CAMN AC0,-1(SX)\r
+ JRST SRCH4 ;NORMAL / FOUND EXIT\r
+ ADD SX,SDEL\r
+ LSH SDEL,-1\r
+ CAMG SX,SYMTOP\r
+ JUMPN SDEL,SRCH1\r
+ JUMPN SDEL,SRCH2\r
+ SOJA SX,POPOUT ;NOT FOUND\r
+\r
+SRCH4: AOS 0(PP) ;SET FOR SKIP EXIT\r
+SRCH5: MOVSI ARG,SUPRBT ;HE IS USING IT, TURN OFF BIT\r
+ ANDCAM ARG,0(SX) ; IN THE TABLE\r
+SRCH7: MOVE ARG,0(SX) ;FLAG AND VALUE TO ARG\r
+ LDB RC,RCPNTR ;POINT 1,ARG,17\r
+ TLNE ARG,LELF ;CHECK LEFT RELOCATE\r
+ TLO RC,1\r
+ HRRZ V,ARG\r
+ TLNE ARG,SPTR ;CHECK SPECIAL EXTESN POINTER\r
+ JRST SRCH6\r
+ TLNE ARG,PNTF\r
+ MOVE V,0(ARG) ;36BIT VALUE TO V\r
+ POPJ PP,\r
+\r
+SRCH6: MOVE V,0(ARG) ;VALUE\r
+ MOVE RC,1(ARG) ;AND RELOC\r
+ TLNE RC,-2 ;CHECK AND SET EXTPNT\r
+ HLLM RC,EXTPNT\r
+ TRNE RC,-2\r
+ HRRM RC,EXTPNT\r
+ POPJ PP,\r
+\fINSERQ: TLNE ARG,UNDF!VARF\r
+INSERZ: SETZB RC,V\r
+INSERT: CAME AC0,-1(SX) ;ARE WE LOOKING AT MATCHING MNEMONIC?\r
+ JRST INSRT2 ;NO, JUST INSERT\r
+ JUMPL ARG,INSRT1 ;YES, BRANCH IF OPERAND\r
+ SKIPL 0(SX) ;OPERATOR, ARE WE LOOKING AT ONE?\r
+ JRST UPDATE ;YES, UPDATE\r
+ JRST INSRT2 ;NO, INSERT\r
+\r
+INSRT1: SKIPG 0(SX) ;OPERAND, ARE WE LOOKING AT ONE?\r
+ JRST UPDATE ;YES, UPDATE\r
+ SUBI SX,2 ;NO, MOVE UNDER OPERATOR AND INSERT\r
+INSRT2: MOVE SDEL,SYMBOL\r
+ SUBI SDEL,2\r
+ CAMLE SDEL,FREE\r
+ JRST INSRT3\r
+ PUSHJ PP,XCEED\r
+ ADDI SDEL,2000\r
+ ADDI SX,2000\r
+INSRT3: MOVEM SDEL,SYMBOL ;MAKE ROOM FOR A TWO WORD ENTRY\r
+ HRLI SDEL,2(SDEL)\r
+ BLT SDEL,-2(SX) ;PUSH EVERYONE DOWN TWO LOACTIONS\r
+ AOS @SYMBOL ;INCREMENT THE SYMBOL COUNT\r
+ TLNN RC,-2 ;SPECIAL LEFT OR RIGHT EXTERNAL?\r
+ TRNE RC,-2\r
+ JRST INSRT5 ;YES, JUMP\r
+ TLNN V,-1 ;SKIP IF V IS A 36BIT VALUE\r
+ JRST INSRT4 ;JUMP, ITS A 18BIT VALUE\r
+ AOS SDEL,FREE ;36BIT, SO GET A CELL FROM FREE CORE\r
+ CAML SDEL,SYMBOL ;MORE CORE NEEDED\r
+ PUSHJ PP,XCEEDS ;YES\r
+ HRR ARG,SDEL ;POINT TO ARG\r
+ MOVEM V,0(ARG) ;36BIT VALUE TO FREE CORE\r
+ TLOA ARG,PNTF ;NOTE THAT ARG IS APOINTER, NOT A 18BIT VALUE\r
+\r
+INSRT4: HRR ARG,V ;18BIT VALUE TO ARG\r
+ DPB RC,RCPNTR ;FIX RIGHT RELOCATION\r
+ TLNE RC,1\r
+ TLO ARG,LELF ;FIX LEFT RELOCATION\r
+INSRT6: MOVEM ARG,0(SX) ;INSERT FLAGS AND VALUE.\r
+ MOVEM AC0,-1(SX) ;INSERT SYMBOL NAME.\r
+ PUSHJ PP,SRCHI ;INITILIAZE SRCHX\r
+ JRST QSRCH ;EXIT THROUGH CREF\r
+\r
+INSRT5: MOVEI SDEL,2 ;GET TWO CELLS FROM FREE CORE\r
+ ADDB SDEL,FREE\r
+ CAML SDEL,SYMBOL ;MORE CORE NEEDED?\r
+ PUSHJ PP,XCEEDS ;YES\r
+ MOVEM RC,0(SDEL)\r
+ HRRI ARG,-1(SDEL) ;POINT TO THE ARG\r
+ MOVEM V,0(ARG)\r
+ TLO ARG,SPTR ;SET SPECIAL POINTER, POINTS TO TWO CELLS\r
+ JRST INSRT6\r
+\fREMOVE: SUBI SX,2 ;MOVE EVERYONE UP TWO LOCATIONS\r
+REMOV1: MOVE 0,0(SX)\r
+ MOVEM 0,2(SX) ;OVERWRITE THE DELETED SYMBOL\r
+ CAME SX,SYMBOL ;SKIP WHEN DONE\r
+ SOJA SX,REMOV1\r
+ ADDI SX,2\r
+ MOVEM SX,SYMBOL\r
+ SOS 0,0(SX) ;DECREMENT THE SYMBOL COUNT\r
+\r
+SRCHI: MOVEI AC2,0 ;THIS CODE SETS UP SRCHX\r
+ FAD AC2,@SYMBOL\r
+ LSH AC2,-^D27\r
+ MOVEI AC1,1000\r
+ LSH AC1,-357(AC2)\r
+ HRRM AC1,SRCHX\r
+ LSH AC1,1\r
+ ADD AC1,SYMBOL\r
+ HRLM AC1,SRCHX\r
+ POPJ PP,\r
+\fUPDATE: DPB RC,RCPNTR ;FIX RIGHT RELOCATION\r
+ TLNE ARG,SPTR ;SKIP IF THERE IS NO SPECIAL POINTER\r
+ JRST UPDAT4 ;YES, USE THE TWO CELLS\r
+ TLNN RC,-2 ;NEED TO CHANGE ANY CURRENT EXTERNS\r
+ TRNE RC,-2\r
+ JRST UPDAT5 ;YES, JUMP\r
+ TLZ ARG,LELF ;CLEAR LELF\r
+ TLNE RC,1 ;LEFT RELOCATABLE?\r
+ TLO ARG,LELF ;YES, SET THE FLAG\r
+ TLNE ARG,PNTF ;WAS THERE A 36BIT VALUE?\r
+ JRST UPDAT2 ;YES, USE IT.\r
+ TLNE V,-1 ;NO,IS THERE A 36BIT VALUE?\r
+ JRST UPDAT1 ;YES, GET A CELL\r
+ HRR ARG,V ;NO, USE RH OF ARG\r
+UPDAT3: MOVEM ARG,0(SX) ;OVERWRITE THE ONE IN THE TABLE\r
+ POPJ PP, ;AND EXIT\r
+\r
+UPDAT1: AOS SDEL,FREE ;GET ONE CELL\r
+ CAML SDEL,SYMBOL ;NEED MORE CORE?\r
+ PUSHJ PP,XCEEDS ;YES\r
+ HRR ARG,SDEL ;POINT TO ARG\r
+ TLO ARG,PNTF ;AND NOTE IT.\r
+UPDAT2: TLNE ARG,EXTF ;IS THERE A EXTERNAL?\r
+ JRST UPDAT3 ;YES, - JUST SAVE A LOCATION\r
+ MOVEM ARG,0(SX) ;NO, OVERWRITE THE POINTER IN THE TABLE\r
+ MOVEM V,0(ARG) ;STORE VALUE AS A 36BIT VALUES\r
+ POPJ PP, ;AND EXIT\r
+\r
+UPDAT4: MOVEM ARG,0(SX) ;WE HAVE TWO CELLS, WE USE THEM\r
+ MOVEM V,0(ARG) ;SAVE AS 36BIT VALUE\r
+ MOVEM RC,1(ARG) ;SAVE RELCATION BITS\r
+ POPJ PP, ;AND EXIT\r
+\r
+UPDAT5: MOVEI SDEL,2 ;THERE IS A EXTERNAL\r
+ ADDB SDEL,FREE ;SO WE NEED TWO LOCATIONS\r
+ CAML SDEL,SYMBOL ;NEED MORE CORE?\r
+ PUSHJ PP,XCEEDS ;YES\r
+ MOVEM RC,0(SDEL) ;SAVE RELOCATION BITS\r
+ HRRI ARG,-1(SDEL) ;SAVE THE POINTER IN ARG\r
+ MOVEM V,0(ARG) ;SAVE A 36BIT VALUE\r
+ TLO ARG,SPTR ;SET SPECIAL PNTR FLAG\r
+ TLZ ARG,PNTF ;CLEAR POINTER FLAG\r
+ JRST UPDAT3 ;SAVE THE POINTER AND EXIT\r
+\r
+\fSUBTTL STORAGE CELLS\r
+\r
+IFN PURESW,<\r
+ LOC 140\r
+>\r
+PASS1I:\r
+\r
+RP: BLOCK 1\r
+IFE CCLSW,<CTIBUF: BLOCK 3\r
+CTOBUF: BLOCK 3\r
+>\r
+\r
+IFN CCLSW,<CTLBUF: BLOCK <CTLSIZ+5>/5\r
+IFN RUNSW,<RUNDEV: BLOCK 1\r
+RUNFIL: BLOCK 3\r
+RUNPP: BLOCK 2>>\r
+LSTBUF: BLOCK 3\r
+BINBUF: BLOCK 3\r
+IBUF: BLOCK 3\r
+IFN CCLSW,<IFE RUNSW,<NUNDIR:>>\r
+INDIR: BLOCK 4\r
+\r
+ACDELX: ;LEFT HALF\r
+BLKTYP: BLOCK 1 ;RIGHT HALF\r
+\r
+COUTX: BLOCK 1\r
+COUTY: BLOCK 1\r
+COUTP: BLOCK 1\r
+COUTRB: BLOCK 1\r
+COUTDB: BLOCK ^D18\r
+\r
+ERRCNT: BLOCK 1\r
+FREE: BLOCK 1\r
+IFN RENTSW,<HHIGH: BLOCK 1 ;SAVE BREAK OF HIGH SEG. IN TWO SEG PROG.>\r
+IFBLK: BLOCK .IFBLK\r
+IFBLKA: BLOCK .IFBLK\r
+LADR: BLOCK 1\r
+LBUFP: BLOCK 1\r
+LBUF: BLOCK <.CPL+5>/5\r
+ BLOCK 1\r
+VARHD: BLOCK 1\r
+VARHDX: BLOCK 1\r
+\r
+LITAB: BLOCK 1\r
+LITABX: BLOCK 1\r
+ BLOCK 1\r
+LITHD: BLOCK 1\r
+LITHDX: BLOCK 1\r
+LITCNT: BLOCK 1\r
+LITNUM: BLOCK 1\r
+\r
+LOOKX: BLOCK 1\r
+NEXT: BLOCK 1\r
+OUTSW: BLOCK 1\r
+PDP: BLOCK 1\r
+RECCNT: BLOCK 1\r
+SAVBLK: BLOCK RC\r
+SAVERC: BLOCK 1\r
+SBUF: BLOCK .SBUF/5\r
+SRCHX: BLOCK 1\r
+SUBTTX: BLOCK 1\r
+SVSYM: BLOCK 1\r
+SYMBOL: BLOCK 1\r
+SYMTOP: BLOCK 1\r
+SYMCNT: BLOCK 1 \r
+\r
+STPX: BLOCK 1\r
+STPY: BLOCK 1\r
+STCODE: BLOCK .STP\r
+STOWRC: BLOCK .STP\r
+\r
+TABP: BLOCK 1\r
+TBUF: BLOCK .TBUF/5\r
+TYPERR: BLOCK 1\r
+\r
+\fPASS2I:\r
+\r
+ACDEVX: BLOCK 1\r
+CPL: BLOCK 1\r
+CTLSAV: BLOCK 1\r
+EXTPNT: BLOCK 1\r
+INTENT: BLOCK 1\r
+INREP: BLOCK 1 \r
+INDEF: BLOCK 1 \r
+INTXT: BLOCK 1 \r
+CALPG: BLOCK 1 \r
+CALSEQ: BLOCK 1 \r
+DEFPG: BLOCK 1 \r
+DEFSEQ: BLOCK 1 \r
+LITPG: BLOCK 1 \r
+LITSEQ: BLOCK 1 \r
+REPPG: BLOCK 1 \r
+REPSEQ: BLOCK 1 \r
+TXTPG: BLOCK 1 \r
+TXTSEQ: BLOCK 1 \r
+IRPARG: BLOCK 1\r
+IRPARP: BLOCK 1\r
+IRPCF: BLOCK 1\r
+IRPPOI: BLOCK 1\r
+IRPSW: BLOCK 1\r
+LITLVL: BLOCK 1\r
+\r
+ASGBLK: BLOCK 1\r
+LOCBLK: BLOCK 1\r
+\r
+LOCA: BLOCK 1\r
+LOCO: BLOCK 1\r
+RELLOC: BLOCK 1\r
+LPP: BLOCK 1\r
+LSTSYM: BLOCK 1\r
+MACENL: BLOCK 1\r
+MACLVL: BLOCK 1\r
+MACPNT: BLOCK 1\r
+MODA: BLOCK 1\r
+MODLOC: BLOCK 1\r
+MODO: BLOCK 1\r
+IFN CCLSW,<OTBUF: BLOCK 2 >\r
+OUTSQ: BLOCK 2\r
+PAGENO: BLOCK 1\r
+PAGEN.: BLOCK 1\r
+PPTEMP: BLOCK 1\r
+PPTMP1: BLOCK 1\r
+PPTMP2: BLOCK 1\r
+\r
+REPCNT: BLOCK 1\r
+REPEXP: BLOCK 1\r
+REPPNT: BLOCK 1\r
+RPOLVL: BLOCK 1\r
+R1BCNT: BLOCK 1 \r
+R1BCHK: BLOCK 1 \r
+R1BBLK: BLOCK .R1B\r
+R1BLOC: BLOCK 1 \r
+RIMLOC: BLOCK 1\r
+SEQNO2: BLOCK 1 \r
+TAGINC: BLOCK 1\r
+VECREL: BLOCK 1\r
+VECTOR: BLOCK 1\r
+WWRXX: BLOCK 1\r
+PASS2X: \r
+\fSUBTTL MULTI-ASSEMBLY STORAGE CELLS\r
+\r
+HDAS: BLOCK 1\r
+IFN CCLSW,<EXTMP: BLOCK 1 ;HOLDS EXT OF COMMAND FILE (RH)\r
+SAVFF: BLOCK 1\r
+CTLBLK: BLOCK 3\r
+CTIBUF: BLOCK 3\r
+CTOBUF: BLOCK 3 >\r
+IFN TEMP,<TMPFLG: BLOCK 1>\r
+ VAR ;CLEAR VARIABLES\r
+\r
+\f SUBTTL CONSTANTS\r
+\r
+IFN TEMP,<TMPFIL: SIXBIT /MAC/\r
+ XWD -200,0>\r
+TAG: BLOCK 1\r
+ SIXBIT / + @/\r
+TABI:\r
+ BYTE (7) 0, 11, 11, 11, 11\r
+SEQNO: BLOCK 1\r
+ ASCIZ / /\r
+BININI: INIT 1,B\r
+BINDEV: BLOCK 1\r
+ XWD BINBUF,0\r
+ JRST EINIT\r
+ POPJ PP,\r
+LSTINI: INIT 3,AL\r
+LSTDEV: BLOCK 1\r
+ XWD LSTBUF,0\r
+ JRST EINIT\r
+ POPJ PP,\r
+ INIT 1,16\r
+ BLOCK 2\r
+ JRST EINIT\r
+ POPJ PP,\r
+IFN CCLSW,<\r
+RPGINI: INIT 4,1\r
+RPGDEV: BLOCK 1\r
+ XWD 0,CTLBLK\r
+ JRST EINIT\r
+ POPJ PP,\r
+>\r
+INDEVI: INIT 2,0\r
+INDEV: BLOCK 1\r
+ XWD 0,IBUF\r
+ JRST EINIT\r
+ POPJ PP,\r
+VBUF: ASCII / MACRO.V36/ ;MUST BE LAST LOCATIONS IN BLOCK\r
+DBUF: ASCIZ / TI:ME DY-MON-YR PAGE /\r
+JOBFFI: BLOCK 203*NUMBUF+1 ;INPUT BUFFER PLUS ONES\r
+IFN PURESW,<LOWEND==.-1\r
+ Z\r
+ RELOC>\r
+\r
+ END BEG\r
+\f\r