TITLE MACRO %50A(441) SUBTTL RPG/CMF/JF/PMH/DMN/JNT/RKH/JBC/ILG 1-Jul-76 ;COPYRIGHT 1968,1969,1970,1971,1972,1973,1974,1975,1976 DIGITAL EQUIPMENT CORP., MAYNARD, MASS. VMACRO==50 ;VERSION NUMBER VUPDATE==1 ;DEC UPDATE LEVEL VEDIT==441 ;EDIT NUMBER VCUSTOM==2 ;NON-DEC UPDATE LEVEL LOC <.JBVER==137> B2+B11+B17+VEDIT RELOC COMMENT * ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO) SWITCHES ON (NON-ZERO) IN DEC VERSION PURESW GIVES TWO SEGMENT MACRO CCLSW GIVES RAPID PROGRAM GENERATION FEATURE TEMP TMPCOR UUO IS TO BE USED FORMSW USE MORE READABLE FORMATS FOR LISTING (ICCSW) DFRMSW DEFAULT CONDITION OF FORMAT PRINTING (MULTI-FORM IF ON) KI10 GIVES KI10 OP-CODES KL10 GIVES KL10 OP-CODES SWITCHES OFF (ZERO) IN DEC VERSION STANSW GIVES STANFORD FEATURES LNSSW GIVES LNS VERSION IIISW GIVES III FEATURES OPHSH GIVES HASH SEARCH OF OPCODES TENEX GIVES BBN TENEX FEATURES POLISH GIVES EXTERNAL ARITHMETIC EXPRESSIONS AND PSECT MULTIPLE RELOCATION COUNTERS TSTCD GIVES LINK DEBUGGING AND DEVELOPMENT DIRECTIVES * SUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS IFNDEF FT.U01, IFNDEF PURESW, IFNDEF STANSW, IFN STANSW, IFNDEF LNSSW, IFNDEF CCLSW, IFNDEF TEMP, IFNDEF IIISW, IFN IIISW,< IFNDEF DFRMSW,> IFNDEF DFRMSW, IFN DFRMSW, IFNDEF FORMSW, IFNDEF OPHSH, IFNDEF KI10, IFNDEF KL10, IFN KL10, IFNDEF TENEX, IFNDEF POLISH, IFNDEF TSTCD, SUBTTL REVISION HISTORY ;START OF 50 ;114 (6113) TIDY UP SYMBOL TABLE LISTING ;115 IMPLEMENT BINARY UNIVERSAL FILES ;116 (6272) CORRECT LISTING OF CERTAIN BYTE FIELDS ;117 (6321) MINOR FIX FOR I.S.C. ;120 (6245) LABEL IN LITERAL ;121 ADD PSEUDO-OP .COMMON ;122 ADD PSEUDO-OPS .REQUIRE AND .REQUEST ;123 ADD ^! (XOR) AND ^- (NOT) OPERATORS ;124 (6350) V ERRORS ON PASS 1 ;125 (6483) X ERRORS ON PASS 1 ;126 SOME SLIGHT SPEEDUPS IN BYPASS ROUTINE (NOW A MACRO) ;127 FREE A FLAG BIT FOR POLISH FIXUPS (FUTURE) ;130 (6482) GENERATE MULTIPLE CREF NO. FOR EXP 1,2,3,,ETC. ;131 (6476) REMOVE BLANKS AT END OF COMMAND STRING ;132 (6477) INCORRECT DEFAULT EXT FOR @ FILES ;133 (6475) MISSING MACRO LISTING WITH SALL ;134 (6506) FIX BUG IN HASHED OPCODES ;135 (6764) MAKE OPDEF PRINT VALUE LIKE = ;136 (6803) ADD SYMBOL .CPU. FOR HOST CPU TYPE ;137 (6765) BETTER HANDLING OF () IN MACRO CALLS ;140 (6708) DON'T NEED <> FOR SINGLE LINE CONDITIONALS ;141 (6629) DON'T CREF .XCREF ;142 (6509) COUNT PAGES CORRECTLY ON PRGEND ;143 (6698) GIVE "Q" ERROR IF MORE THAN 18 BIT VALUES IN XWD ;144 CHANGE EOL CHAR TO LF, QIVE "Q" ERROR ON FREE CR ;145 MAKE "Q" ERRORS PRINT AS WARNINGS INSTEAD OF ERRORS ;146 CALL HELPER TO PRINT HELP TEXT ;147 ADD NEW I/O DEVICE CODES AND NEW UUOS ;150 (6894) FIX LOCATION COUNTER IN PHASE CODE ;151 ADD FAIL COMPATIBLE PSEUDO-OP .LINK (LINK), .LNKEND (LNKEND), .ORG (ORG) ;152 (7063) COUNT <> IN CHARACTER LOOKAHEAD ;153 (6981) VERY LONG SEQUENCED LINES DON'T PRINT CORRECTLY ;154 (7018) 87 CHAR LONG LINE GET EXTRA CR-LF IN LISTING ;155 (7005) LABEL IN LITERALS AGAIN ;156 (7116) SUPERSEDED BY 225 ;157 (7027) PRINT SEQUENCED BLANK LINE ;160 (7078) GARBAGE IN BITS 0-3 OF RADIX-50 IN SOME MACROS ;161 (7373) MAKE PAGE PSEUDO-OP INCREASE PAGE INCREMENT NO. ONLY ;162 ADD SFD LOGIC ;163 (7435) SUPERSEDED BY 204 ;164 ADD POLISH EXPRESSIONS (NOT SUPPORTED) ;165 REMOVE 0 LISTED ON FIRST LINE AFTER PRGEND ;167 (7462) ADD ! TO SUPPRESS SYMBOLS ;170 (7638) FIX ILL MEM REFS ON PRGEND ;171 (8374) TEST AND GIVE ERROR IF EXP AFTER \ IN MACRO CALL IS A MACRO ;173 (8264) SAVE AND RESTORE ACCS IN SYN ROUTINE IF CORE EXPANSION IS REQUIRED ;175 (8606) ONLY USE ASCII 37 AS CONTINUATION CHARACTER IF AT END OF LINE ;176 (8633) CORRECTLY HANDLE <> IN COMMENTS IN MACROS AFTER ;; ;200 MAKE DEFAULT NUMBER OF BUFFERS BE 5 ;201 ADD DATE75 HACK ;202 ADD PSEUDO-OP .DIRECTIVE ;203 (10071) FIX TWOSEG & PRGEND INTERACTION SO LOAD FORLIB IN LOW SEG ;204 (11044) CLEAR PNTF IF 18 BIT VALUE (UNLESS EXTERN) AT INSRT4 ;205 (10820) FIX #154 INCASE IN MACROS ;206 ADD TENEX FEATURES ;207 FORCE END STATEMENT IF END NOT SEEN ;210 ADD EXTERNAL START ADDRESS ON END STATEMENT ;211 ALLOW <> IN COMMAND TO BE SAME AS [] ;212 PUT ERROR MESSAGES IN STANDARD FORM ;213 PUT ASSEMBLY ERRORS IN CREF TABLE ;214 OUTPUT COMPILER TYPE IN HEADER BLOCK (TYPE 6) ;215 (9810) DON'T LIST COMMENT BEFORE MACRO EXPANSION IF IN REPEAT ;216 MAKE DEFAULT [DIRECTORY] WORK ;217 (9996) TURN ON SALL IN LITERALS SO MACRO CALLS DON'T EXPAND ;220 (9633) MAKE .XCREF APPLY TO SPECIFIC SYMBOLS ;221 (9508) IF NEXT LINE AFTER TAPE PSEUDO-OP IS FF OR VT LIST IT ;222 (9499) MORE OF #124 ;223 (10393) FIX ILL MEM REF ON END MACRO ;224 (S-033) MINOR VERSION NUMBER DECODE LOGIC WRONG ;225 (11907) REDEFINING MACROS IN PRGENDS ;226 (11929) MORE OF ABOVE, WHEN A UNIVERSAL FILE HAS BEEN READ ;227 (S-034) ADD SWITCH /nnL TO GIVE LINES/PAGE, ALSO MAKE 2 LARGER ;230 DON'T SEARCH UNIVERSAL FILE ON LABEL & ASSIGNMENT DEFINITIONS ;231 EXPAND CORE TO HOLD BOTH COPIES IN UNIVERSAL AND PRGEND ;232 ADD .TEXT PSEUDO-OP TO GENERATE ASCIZ BLOCK TYPE FOR LINK-10 ;233 CHECK FOR INVALID ARG TO BLOCK PSEUDO-OP ;234 OUTPUT CPU TIME TAKEN FOR ASSEMBLY ;235 ADD .DIRECTIVE KA10,KI10 TO SET BIT IN BLOCK TYPE 6 ;236 FIX SALL/XLIST BUG, MAKE XALL ONLY TURN OFF SALL ;237 (12493) GIVE U ERROR ON LABEL DEFINED AND USED IN SAME LITERAL ;240 (12631) ENHANCEMENTS TO BINARY UNIVERSALS ;241 (13033) INCORRECT CHECKING OF ACC "C" AGAINST ASCII AT STMNT2+13 ;242 (13034) SAVE AC0 (AND SOME OTHERS) AT OUTPL1 ;243 (13402) MAKE LOWER CASE WORK WITH SINGLE QUOTES ;244 EXTEND EDIT #210 TO ALLOW EXTERNAL + CONSTANT ;245 (13047) FLAG QUESTIONABLE USE OF SINGLE QUOTE WITH "Q" ERROR ;246 (13119) WRITE CREF FILE IN DEFAULT PATH ;247 (12803) FLAG QUESTIONABLE USE OF # AND ## ON SAME SYMBOL ;250 (13032) CLEAR MORE ERROR BITS ON PASS1 IN MULTI-LINE LITERAL ;251 FIX PROGRAM BREAK IF LIT STATEMENT IN PRGEND ;252 DON'T GIVE "Q" ERROR ON EXTRA "CR" (SEE EDIT #144) ;253 DON'T PRINT GARBAGE ON PASS1 ERROR IN MULTI-LINE LIT ;254 USE ALL AVAILABLE PRINTING SPACES FOR LONG LINES ;255 FIX UNARY MINUS BUG IN EDIT #164 ;256 (13664) HANDLE SPECIAL EXTERN IN UNIVERSAL CORRECTLY ;257 HANDLE VERTICAL TABS CORRECTLY ;260 FIX BUG IN #140, THROW AWAY JUNK BEFORE COMMA ;261 HANDLE SOS PAGE MARK CORRECTLY ;262 TRAP ILL MEM REF CAUSED BY MISSING CLOSE PAREN IN MACRO ARG LIST (#137) ;263 DON'T DESTROY ACC RC IN LONG LINE OF ASCIZ TEXT ;264 FIX BUG IN #175 CAUSING EXTRA CR-LF ;265 ADD PSECT CODE UNDER POLISH SWITCH, THIS IS VERSION 51 ONLY ;266 FIX LOOP CAUSED BY MISSING ")" IN SEARCH MODS (#240) ;267 DON'T PASS DEFINITION FLAG TO CREF ON ## ;270 DOUBLE SIZE OF BASIC PUSHDOWN STACK ;271 ADD .IF PSEUDO-OP ;272 FIX LOOP CAUSED BY #260 IF EOL ENCOUNTERED ;VERSION 50 (272) RELEASED NOV-74 ;273 ADD BYPASS TO FIX ERROR WITH PPN SPEC FOR .REQUIRE & .REQUEST ;274 (14734) FIX PROBLEM WITH .IF CONDITIONALS ;275 (14723) FIX SPURIOUS MONRET WITH STICKY PPNS ;276 (14811) CAUSE * AND / TO GIVE N ERRORS WHEN THEY OVERFLOW ;277 ALLOW ALTMODES TO TERMINATE COMMAND STRINGS AGAIN ;EDITS 300 THROUGH 317 WERE USED FOR MACRO 51 ;320 (Q3086) FIX MCRNES MESSAGE IN DEFINE AFTER SIXBIT// ;321 (Q3085) FIX LITERALS NOT LISTING IN MACROS AND SOME BOGUS V ERRORS WHEN NOT LALL ;322 CHANGE RADIX50 TO GIVE Q ERROR ON CODE NOT 74 BITS ;323 (14943) FIX TO MAKE EXTERNALS REFERENCED IN UNIVERSALS WORK ;324 (14957) FIX FOR E ERRORS WHEN OPDEF REFERENCES EXTERNAL OF SAME NAME ;325 (15043) CHANGE 152 & 176 TO NOT PRINT ANGLE BRACKETS OR 1 ; AFTER ;; ;326 (15218) CHANGE MCRNEC MESSAGE TO GIVE UP ASSEMBLY ;327 FIX THE CRLF'S WHEN LALL IS USED IN A MACRO UNDER SALL ;330 (15277) CORRECT VALUE OF SYMBOL .CPU. FOR KA-10 ;331 (15279) CORRECT OUTPUT OF .TEXT BLOCKS GENERATING MORE THAN 18 WORDS ;332 CORRECTION TO 325 WHEN ;;> IS END OF MACRO ;333 (15280) ^ IS SOMETIMES SWALLOWED WHEN NOT FOLLOWED BY ! OR - ;334 (15293) DEFAULT MACRO ARGUMENTS ARE NOT SAVED IN BINARY UNIVERSALS ;335 (15406) SCAN .REQUIRE,.REQUEST WITH FILE SPEC SCANNER, NOT GETSYM ;336 (15485) CLEAN UP 323 TO MAKE IT THE SAME AS PUBLISHED 256 ;337 FIX EDIT 333 TO MAKE ^! ^- WORK AGAIN ;340 (15682) CHECK FOR FORWARD DEFINED ENTRIES BEFORE MAKING UNDEFINES EXTERNAL ;341 FIX ERRORS WITH DEFAULT ARGUMENTS ;342 (15680) ADD PORTAL OPCODE ;343 (15683) DON'T SEARCH UNIVERSALS WHEN DEFINING INTERN,EXTERN,ETC ;344 LIST MOVE [CONO] CORRECTLY ;345 (16130) CORRECT EDIT 335 TO BYPASS EXTRA TABS AND SPACES ;346 (16130) PREVENT RELOC FROM OPERATING ACROSS PRGEND'S ;347 (16250) FIX EDITS 325 AND 332 TO HANDLE MACROS TERMINATING ; ON THE SAME LINE ;350 (16471) EDIT 345 BREAKS SCANNING OF .REQU??? TYPE ITEM BECAUSE ; BYPASS MACRO EATS FIRST CHARACTER OF SPEC. ;351 (16335) WHEN AN OPEN ANGLE BRACKET IS MISSING AFTER IRPC, ; DON'T CRASH WHILE SEARCHING FOR IT. ;352 (16589) FIX '[DEVICE] NOT AVAILABLE' ERROR MESSAGE TYPEOUT ;353 REMOVE EDIT 343 ;354 (16804) FIX EDIT 351 TO ALLOW COMMA BEFORE OPEN BRACKET IN IRP,IRPC ; ADD 'MISSING OPEN BRACKET' ERROR MESSAGE FOR IRP ;355 (16878) CHECK ENOUGH CORE ALLOTTED FOR UNIVERSAL FILES WITH PRGEND ;356 (16883) GIVE ERROR MESSAGE IF UNABLE TO WRITE UNIVERSAL FILE ;357 (17041) FIX EDITS 333,337 TO MAKE ^!,^- WORK IN A MACRO ;360 (16690) FIX '[SYMBOL] UNASSIGNED, DEFINED AS IF EXTERNAL' ERROR ; MESSAGE TYPEOUT ;361 (17046) FIX EDITS 351,354 TO ALLOW ) BEFORE OPEN ANGLE BRACKET ;362 ADD .DIRECTIVES .OKOVL,.EROVL TO ALLOW * OR / OVERFLOW ;363 (16988) INSERT UNDEFINED SYMBOL PRECEDED BY UNARY MINUS IN UNDEFINED SYMBOL TABLE ;364 (17147) ADD SEPARATE 'UNIVERSAL VERSION SKEW' ERROR MESSAGE ;365 (17143) FIX .CREF,.XCREF FOR MULTIPLY-ENTERED SYMBOLS ;366 (17256) FIX HANDLING OF FIRST LEVEL ANGLE BRACKETS INSIDE MACROS ;367 (16559) FIX ERROR HANDLING IN LITERALS ;370 (17387) FIX .TEXT FLAG HANDLING ;371 (16710) CORRECT DECREMENTING OF MACROS DEFINED IN UNIVERSALS BELOW 1 ;372 (17912) FIX .XTABM FOR SPECIAL CASES ;373 (17913) ADD ERROR MESSAGE FOR MISSING < IN REPEAT ;374 (17993) FIX HANDLING OF RELOCATABLE ARGUMENTS WITH ^L ;375 (17994) FIX PREVIOUS EDITS TO ^- AND ^! OPERATORS ;376 (18280) CORRECT EDIT 367, IT BROKE ERRORS IN SINGLE LINE LITERALS ;377 ADD MCRPGE (PRGEND ERROR) MNEMONIC ;400 PRESERVE OLD .REL FILE AND PRODUCE PARTIAL LISTING AFTER ; MRCNEC OR MRCPDL ERROR ;401 DON'T ALLOW SHIFT TO DELETE RELOCATION FACTOR ;402 (17904) FIX "LABEL + OFFSET" FOR LABELS IN LITERALS ;403 REPLACE MCREWU,MCRERU ERROR MESSAGES WITH EXISTING I/O MESSAGES ;404 (18768) FIX CHECK FOR ! AFTER SYMBOL IN INTERN,EXTERN,SUPRESS,ETC. ;405 (18282) CHECK FOR DEFAULT PPN SUCH AS [,NNNN] OR [NNNN,] ;406 (18894) DON'T ALLOW SEMI-INFINITE LOOP IN ASSIGNMENT STATEMENT ;407 EDIT 401 IS A GOOD IDEA,BUT IT BROKE OLD PROGRAMS ;410 GENERAL CLEANUP IN PREPARATION FOR RELEASE. ;411 (18828) /N SHOULDN'T SUPRESS %....X SYMBOLS IN CREF ;412 CLEAR HISNSW AT PRGEND FOR NEXT PROGRAM ;413 ADD .DIRECTIVE KL10, MAKE IT OK TO HAVE MULTIPLE CPUS ;414 ADD .DIRECTIVES .TCDON/.TCDOFF FOR TESTING NEW LINK CODES ;415 SUPERSEDE EDITS 367,376 FOR CLARITY ;416 (Q0320) FIX ^- AGAIN. EDITS 375,333 SUPERSEDED. ;417 (Q0316) EDIT 221 BROKE TAPE PSEUDO-OP WHEN EOF FOLLOWS ;420 (Q0322) RESET TITLE TO ".MAIN" AT PRGEND ;421 (Q0328) CLEAN UP THE .DIRECTIVE CODE, ADD .DIRECTIVE NO ;422 (Q0363) FIX DEFAULT ARG READ-IN FOR DEFINES IN MACROS ;423 MAKE .LINK PSEUDO-OP READ 3RD ARGUMENT CORRECTLY. ;424 (18893) CHECK FOR ILLEGAL CHARACTERS AT ASTERISK LEVEL. ;425 (19585) REWORK EDIT 373 ;426 CLEAN UP EDITS 351,354,361 ;427 (Q0390) ALLOW NULL EXTENSIONS IN SOURCE SPECIFICATIONS ;430 (20036) IMPLEMENT "%MCRSOC STATEMENT OUT OF ORDER .COMMON [SYMBOL]" MESSAGE ;431 CLEAN UP UNIVERSAL I/O ERROR MESSAGES ;432 FURTHER CLEANUP FOR RELEASE ;; MACRO 50A RELEASE IN FALL, 1976 ;440 FIX "R" ERRORS (WITH EXTERNAL SYMBOLS) CAUSED BY EDIT 324 ;441 FIX "P" ERRORS WHEN SYMBOL FORWARD-REFERENCED ACROSS LITERAL ; ;*****CUSTOMER REVISION HISTORY***** ;1 IMPLEMENT USER PUSHDOWN LIST--FEATURE TEST FT.U01 ;2 CLEAR USER PDP ON PRGEND AND END, CHECK FOR STACK UNDERFLOW ;******************* END OF REVISION HISTORY ******************* SUBTTL OTHER PARAMETERS IFN FT.U01,<$USRLN==^D50> ;LENGTH OF USER PUSH DOWN LIST .PDP== ^D100 ;[270] BASIC PUSH-DOWN POINTER IFNDEF LPTWID, ;DEFAULT WIDTH OF PRINTER .LPTWD==8* ;USEFUL WIDTH IN MAIN LISTING .CPL== .LPTWD-^D32 ;WIDTH AVAILABLE FOR TEXT WHEN ;BINARY IS IN HALFWORD FORMAT .CPLX==LPTWID-.LPTWD ;[254] EXCESS SPACE IN LAST TAB STOP IFNDEF .LPP,< ;[227] IFE STANSW,<.LPP==^D57 ;LINES/PAGE> IFN STANSW,<.LPP==^D52 ;LINES/PAGE> > .STP== ^D40 ;STOW SIZE .TBUF== ^D80 ;TITLE BUFFER .SBUF== ^D80 ;SUB-TITLE BUFFER .IFBLK==^D20 ;IFIDN COMPARISON BLOCK SIZE .R1B==^D18 .UNIV==^D10 ;NUMBER OF UNIVERSAL SYMBOL TABLES ALLOWED .LEAF==4 ;SIZE OF BLOCKS IN MACRO TREE .UVER==5 ;[334] VERSION # OF UNV FILE .SFDLN==5 ;[162] NUMBER OF SFD'S ALLOWED NCOLS==LPTWID/^D32 ;NUMBER OF COLUMNS IN SYMBOL TABLE SGNSGS==^D64 ;MAX # OF DISTINCT PSECTS ALLOWED ;IN ONE ASSEMBLY SGNDEP==^D16 ;MAX PSECT DEPTH ALLOWED IFN CCLSW,> IFN OPHSH,> IFNDEF NUMBUF, ;[200] NUMBER OF INPUT BUFFERS EXTERN .JBREL,.JBFF,.JBAPR,.JBSA,.JBERR EXTERN .HELPR IFDEF .REQUEST,<.REQUEST REL:HELPER > ;[122] LOWL:! ;START OF LOW SEGMENT IFN PURESW, SALL ;SUPPRESS ALL MACROS ;SOME ASCII CHARACTERS HT==11 LF==12 VT==13 FF==14 CR==15 CZ==32 EOL==33 CLA==37 ;ACCUMULATORS AC0== 0 AC1= AC0+1 AC2= AC1+1 SDEL= 3 ;SEARCH INCREMENT SX= SDEL+1 ;SEARCH INDEX ARG= 5 ;ARGUMENT V= 6 ;VALUE C= 7 ;CURRENT CHARACTER CS= C+1 ;CHARACTER STATUS BITS RC= 11 ;RELOCATION BITS MWP= 12 ;MACRO WRITE POINTER MRP= 13 ;MACRO READ POINTER IO= 14 ;IO REGISTER (LEFT) ER== IO ;ERROR REGISTER (RIGHT) FR= 15 ;FLAG REGISTER (LEFT) RX== FR ;CURRENT RADIX (RIGHT) MP= 16 ;MACRO PUSHDOWN POINTER PP= 17 ;BASIC PUSHDOWN POINTER %OP== 3 %MAC== 5 %DSYM== 2 %SYM== 1 %DMAC== %MAC+1 %ERR==%MAC OPDEF RESET [CALLI 0] OPDEF SETDDT [CALLI 2] OPDEF DDTOUT [CALLI 3] OPDEF DEVCHR [CALLI 4] OPDEF CORE [CALLI 11] OPDEF EXIT [CALLI 12] OPDEF UTPCLR [CALLI 13] OPDEF DATE [CALLI 14] OPDEF APRENB [CALLI 16] OPDEF MSTIME [CALLI 23] OPDEF PJOB [CALLI 30] OPDEF RUN [CALLI 35] OPDEF TMPCOR [CALLI 44] OPDEF MTWAT. [MTAPE 0] OPDEF MTREW. [MTAPE 1] OPDEF MTEOT. [MTAPE 10] OPDEF MTSKF. [MTAPE 16] OPDEF MTBSF. [MTAPE 17] ;FR FLAG REGISTER (FR/RX) IOSCR== 000001 ;NO CR AFTER LINE POLSW== 000002 ;[164] DOING POLISH ON GLOBALS MTAPSW==000004 ;MAG TAPE ERRQSW==000010 ;IGNORE Q ERRORS LOADSW==000020 ;END OF PASS1 & NO EOF YET DCFSW== 000040 ;DECIMAL FRACTION RIM1SW==000100 ;RIM10 MODE NEGSW== 000200 ;NEGATIVE ATOM RIMSW== 000400 ;RIM OUTPUT PNCHSW==001000 ;RIM/BIN OUTPUT WANTED CREFSW==002000 R1BSW== 004000 ;RIM10 BINARY OUTPUT TMPSW== 010000 ;EVALUATE CURRENT ATOM INDSW== 020000 ;INDIRECT ADDRESSING WANTED RADXSW==040000 ;RADIX ERROR SWITCH FSNSW== 100000 ;NON BLANK FIELD SEEN MWLFLG==200000 ;ON FOR DON'T ALLOW MULTI-WORD LITERALS P1== 400000 ;PASS1 ;IO FLAG REGISTER (IO/ER) FLDSW== 400000 ;ADDRESS FIELD IOMSTR==200000 ARPGSW==100000 ;ALLOW RAPID PROGRAM GENERATION IOPROG==040000 ;SUPRESS LISTING (LIST/XLIST PSEUDO OP) NUMSW== 020000 IOMAC== 010000 ;MACRO EXPANSION IN PROGRESS IOPALL==004000 ;SUPRESS LISTING OF MACRO EXPANSIONS IONCRF==002000 ;SUPRESS OUTPUT OF CREF INFORMATION CRPGSW==001000 ;CURRENTLY IN PROGRESS ON RPG IOCREF==000400 ;WE ARE NOW OUTPUTTING CREF INFO IOENDL==000200 ;BEEN TO STOUT IOPAGE==000100 DEFCRS==000040 ;THIS IS A DEFINING OCCURANCE (MACROS) IOIOPF==000020 ;IOP INSTRUCTION SEEN MFLSW== 000010 ;MULTI-FILE MODE,PRGEND SEEN IORPTC==000004 ;REPEAT CURRENT CHARACTER RSASSW==000002 ;[265] REFERENCE IS TO A SYMBOL IN ANOTHER PSECT IOSALL==000001 ;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED OPDEF JUMP1 [JUMPL FR, ] ;JUMP IF PASS 1 OPDEF JUMP2 [JUMPGE FR, ] ;JUMP IF PASS 2 OPDEF JUMPOC [JUMPGE IO, ] ;JUMP IF IN OP-CODE FIELD OPDEF JUMPAD [JUMPL IO, ] ;JUMP IF IN ADDRESS FIELD OPDEF JUMPCM [JUMPL CS, ] ;JUMP IF CURRENT CHAR IS COMMA OPDEF JUMPNC [JUMPGE CS, ] ;JUMP IF CURRENT CHAR IS NON-COMMA OPDEF PJRST [JRST] ;JUMP TO POPJ PP, ;RETURN OPDEF HALT [HALT] ;TO PUT IN CREF TABLE ;ER ERROR REGISTERS (IO/ER) ERRS== 000010 ;[265] ILLEGAL PSECT USAGE ERRM== 000020 ;MULTIPLY DEFINED SYMBOL ERRE== 000040 ;ILLEGAL USE OF EXTERNAL ERRP== 000100 ;PHASE DISCREPANCY ERRO== 000200 ;UNDEFINED OP CODE ERRN== 000400 ;NUMBER ERROR ERRV== 001000 ;VALUE PREVIOUSLY UNDEFINED ERRU== 002000 ;UNDEFINED SYMBOL ERRR== 004000 ;RELOCATION ERROR ERRL== 010000 ;LITERAL ERROR ERRD== 020000 ;REFERENCE TO MULTIPLY DEFINED SYMBOL ERRA== 040000 ;PECULIAR ARGUMENT ERRX== 100000 ;MACRO DEFINITION ERROR ERRQ== 200000 ;QUESTIONABLE, NON-FATAL ERROR ERROR1==ERRP!ERRM!ERRV!ERRX ;[125] ERRORS THAT PRINT ON PASS 1 ERRORS==777760 LPTSW== 000002 TTYSW== 000001 ;SYMBOL TABLE FLAGS SYMF== 400000 ;SYMBOL TAGF== 200000 ;TAG NOOUTF==100000 ;NO DDT OUTPUT WFW SYNF== 040000 ;SYNONYM MACF== SYNF_-1 ;MACRO OPDF== SYNF_-2 ;OPDEF PNTF== 004000 ;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE UNDF== 002000 ;UNDEFINED EXTF== 001000 ;EXTERNAL INTF== 000400 ;INTERNAL ENTF== 000200 ;ENTRY VARF== 000100 ;VARIABLE NCRF== 000040 ;[220] DO NOT CREF THIS SYMBOL MDFF== 000020 ;MULTIPLY DEFINED SPTR== 000010 ;SPECIAL EXTERNAL POINTER SUPRBT==000004 ;SUPRESS OUTPUT TO REL AND LISTING LELF== 000002 ;LEFT HAND RELOCATABLE RELF== 000001 ;RIGHT HAND RELOCATABLE LITF== 200000 ;FLAG FOR PSEUDO-OPS INVALID IN LIT'S ADDF== 100000 ;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES TNODE== 200000 ;TERMINAL NODE FOR EVALEX ;USEFUL MACROS DEFINE FORERR(AC,ABC)< MOVE AC,[PAGENO,,ABC'PG] BLT AC,ABC'PG+3 > ;MACRO TO BYPASS LEADING TABS AND SPACES DEFINE BYPASS < PUSHJ PP,GETCHR JUMPE C,.-1 > SUBTTL START ASSEMBLING ASSEMB: PUSHJ PP,INZ ;INITIALIZE FOR PASS SKIPA AC1,.+1 ;LOCALIZED CODE ASCII /.MAIN/ MOVEM AC1,TBUF SETZM TBUF+1 ;SIGNAL NOT YET SEEN A TITLE MOVEI SBUF HRRM SUBTTX ASSEM1: PUSHJ PP,CHARAC ;TEST FOR FORM FEED SKIPGE LIMBO ;CRLF FLAG? JRST ASSEM1 ;YES ,IGNORE LF CAIN C,14 SKIPE SEQNO JRST ASSEM2 PUSHJ PP,OUTFF1 PUSHJ PP,OUTLI JRST ASSEM1 ASSEM2: AOS TAGINC CAIN C,"\" ;BACK-SLASH? TLZA IO,IOMAC ;YES, LIST IF IN MACRO TLO IO,IORPTC PUSHJ PP,STMNT ;OFF WE GO TLZN IO,IOENDL ;WAS STOUT PRE-EMPTED? PUSHJ PP,STOUT ;NO, POLISH OFF LINE JRST ASSEM1 SUBTTL STATEMENT PROCESSOR STMNT: TLZ FR,INDSW!FSNSW SETZM UPARROW ;[375]CLEAR SPECIAL REPEAT CHARACTER TLZA IO,FLDSW STMNT1: PUSHJ PP,LABEL STMNT2: PUSHJ PP,ATOM ;GET THE FIRST ATOM CAIN C,'=' ;"="? JRST ASSIGN ;YES CAIN C,':' ;":"? JRST STMNT1 ;YES JUMPAD STMNT7 ;NUMERIC EXPRESSION JUMPN AC0,STMN2A ;JUMP IF NON NULL FIELD SKIPN LITLVL ;ALLOW COMMA IN LITERALS CAIE C,',' ;NULL, COMMA? CAIN C,EOL ;OR END OF LINE? POPJ PP, ;YES,EXIT CAIN C,']' ;[241] CLOSING LITERAL? POPJ PP, ;YES JRST STMNT9 ;NO,AT LEAST SKIP ALL THIS NONSENSE STMN2A: JUMPE C,.+2 TLO IO,IORPTC PUSHJ PP,MSRCH ;SEARCH FOR MACRO/OPDEF/SYN JRST STMNT3 ;NOT FOUND, TRY OP CODE LDB SDEL,[POINT 3,ARG,5] JUMPE SDEL,ERRAX ;ERROR IF NO FLAGS SOJE SDEL,OPD1 ;OPDEF IF 1 SOJE SDEL,CALLM ;MACRO IF 2 JRST STMNT4 ;SYNONYM, PROCESS WITH OP-CODES STMNT3: PUSHJ PP,OPTSCH ;SEARCH OP CODE TABLE JRST STMNT5 ;NOT FOUND STMNT4: HLLZ AC0,V ;PUT CODE IN AC0 TRZ V,ADDF ;CLEAR ADDRESS NON-VALID FLAG TRZE V,LITF ;VALID IN LITERAL? SKIPN LITLVL ;NO, ARE WE IN A LITERAL? JRST 0(V) ;NO, GO TO APPROPRIATE PROCESSOR POPJ PP, ;YES,EXIT STMNT5: PUSHJ PP,SSRCH ;TRY SYMBOLS JRST STMNT8 ;NOT FOUND TLNN ARG,EXTF!UNDF ;EXTERNAL OR UNDEFINED? TDNE RC,[-2,,-2] ;CHECK FOR EXTERNAL JRST STMNT7 ;YES, PROCESS IN EVALEX MOVE AC0,V ;FOUND, PUT VALUE IN AC0 TLO IO,NUMSW ;FLAG AS NUMERIC STMNT7: TLZ IO,IORPTC STMNT9: PUSHJ PP,EVALHA ;EVALUATE EXPRESSION IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM> TLNE FR,FSNSW ;FIELD SEEN? JRST STOW ;YES,STOW THE CODE AND EXIT CAIE C,']' ;CLOSING LITERAL? TRO ER,ERRQ ;NO, GIVE "Q" ERROR POPJ PP, ;EXIT STMNT8: MOVEI V,0 ;ALWAYS START SCAN WITH 0 CAIL V,CALNTH ;END OF TABLE? JRST STMN8C ;YES, TRY TTCALLS CAME AC0,CALTBL(V) ;FOUND IT? AOJA V,.-3 ;NO,TRY AGAIN SUBI V,NEGCAL ;CALLI'S START AT -1 HRLI V,(CALLI) ;PUT IN UUO STMN8D: MOVSI ARG,OPDF ;SET FLAG FOR OPDEF STMN8B: PUSHJ PP,INSERT ;PUT OPDEF IN TABLE JRST OPD ;AND TREAT AS OPDEF STMN8C: SETZ V, ;START WITH ZERO CAIL V,TTCLTH ;END OF TABLE? JRST STMN8E ;TRY MTAPES CAME AC0,TTCTBL(V) ;MATCH? AOJA V,.-3 ;NO, KEEP TRYING LSH V,5 ;PUT IN AC FIELD (RIGHT HALF) HRLZI V,<(TTCALL)>(V) ;PUT UUO IN LEFT HALF JRST STMN8D ;SET OPDEF FLAG STMN8E: SETZ V, ;START AT ZERO CAIL V,MTALTH ;END OF TABLE? JRST STMN8A ;YES, ERROR CAME AC0,MTATBL(V) ;MATCH AOJA V,.-3 ;NOT YET PUSH PP,AC0 ;SAVE IT MOVE AC0,[POINT 9,MTACOD] IBP AC0 ;GET TO RIGHT ONE SOJGE V,.-1 ;EVENTUALLY LDB V,AC0 ;GET FUNCTION HRLI V,(MTAPE) ;FILL IN OPCODE POP PP,AC0 JRST STMN8D STMN8A: SETZB V,RC ;CLEAR VALUE AND RELOCATION TRO ER,ERRO ;FLAG AS UNDEFINED OP-CODE JUMP1 OPD ;TREAT AS STANDARD OP ON PASS1 MOVSI ARG,OPDF!UNDF!EXTF ;SET A FEW FLAGS JRST STMN8B ;TO FORCE OUT A MESSAGE SUBTTL LABEL PROCESSOR LABEL: JUMPAD LABEL4 ;COMPARE IF NON-SYMBOLIC JUMPE AC0,LABEL5 ;ERROR IF BLANK TLO IO,DEFCRS ;THIS IS A DEFINITION SKIPN LITLVL ;[402] LABEL IN LITERAL? JRST LABL10 ;[402] NO SETOM LBLFLG ;[402] SET FLAG EXCH AC0,STPX ;[402] MOVEM AC0,LTGINC ;[402] SET MARKER EXCH AC0,STPX ;[402] LABL10: PUSH PP,UNISCH+1 ;[402] SAVE SEARCH LIST SETZM UNISCH+1 ;BUT DISALLOW PUSHJ PP,SSRCH ;SEARCH FOR OPERAND MOVSI ARG,SYMF!UNDF!TAGF ;NOT FOUND POP PP,UNISCH+1 ;RESTORE STATUS TLNN ARG,EXTF ;OPERAND FOUND (SKIP EXIT) JRST LABEL0 JUMP1 LABEL3 ;ERROR ON PASS1 TLNN ARG,UNDF ;UNDEFINED ON PASS1 JRST LABEL3 ;NO, FLAG ERROR TLZ ARG,EXTF!PNTF ;TURN OFF EXT FLAG NOW JUMPE V,LABEL0 ;NOTHING TO CHAIN IF 0 MOVE RC,LOCAL ;GET CURENT POINTER MOVEM RC,1(ARG) ;STORE OVER NAME HRRM ARG,LOCAL ;LINK INTO CHAIN MOVE RC,LOCA ;GET CURRENT LOCATION HRLM RC,(ARG) ;STORE BUT SWAPPED LSH V,-^D17 ;SHIFT RELOCATION TO BIT 34 IOR V,MODA ;CURRENT RELOCATION HRLM V,1(ARG) ;STORE IT LABEL0: TLZN ARG,UNDF!VARF ;WAS IT PREVIOUSLY DEFINED? JRST LABEL2 ;YES, CHECK EQUALITY MOVE V,LOCA ;WFW MOVE RC,MODA TLO ARG,TAGF PUSHJ PP,PEEK ;GET NEXT CHAR. CAIE C,":" ;SPECIAL CHECK FOR :: JRST LABEL1 ;NO MATCH TLO ARG,INTF ;MAKE IT INTERNAL PUSHJ PP,GETCHR ;PROCESS NEXT CHAR. PUSHJ PP,PEEK ;PREVIEW NEXT CHAR. LABEL1: CAIE C,"!" ;HALF-KILL SIGN JRST LABEL6 ;NO TLO ARG,NOOUTF ;YES, SUPPRESS IT PUSHJ PP,GETCHR ;AND GET RID OF IT LABEL6: MOVEM AC0,TAG ;SAVE FOR PASS 1 ERRORS HLLZS TAGINC ;ZERO INCREMENT JRST INSERT ;INSERT/UPDATE AND EXIT LABEL2: HRLOM V,LOCBLK ;SAVE LIST LOCATION IFN POLISH,< CAMLE SX,SGSBOT ;IS IT IN THE CAMLE SX,SGSTOP ; CURRENT PSECT JRST LABEL3> ;NO, FLAG ERROR CAMN V,LOCA ;DOES IT COMPARE WITH PREVIOUS? WFW CAME RC,MODA LABEL3: TLOA ARG,MDFF ;NO, FLAG MULTIPLY DEFINED AND SKIP JRST LABEL7 ;YES, GET RID OF EXTRA CHARS. TRO ER,ERRM ;FLAG MULTIPLY DEFINED ERROR JRST UPDATE ;UPDATE AND EXIT LABEL4: CAMN AC0,LOCA ;DO THEY COMPARE? CAME RC,MODA LABEL5: TRO ER,ERRP ;NO, FLAG PHASE ERROR POPJ PP, LABEL7: SKIPN LITLVL ;[155] LABEL IN A LITERAL? JRST LABEL8 ;[155] NO MOVEM AC0,LITLBL ;[155] YES, SAVE LABEL NAME FOR LATER MOVE AC0,STPX ;[155] CURRENT DEPTH SUB AC0,STPY ;[155] MINUS START MOVEM AC0,LITLBL+1 ;[155] STORE DEPTH IN LIT MOVE AC0,LITLBL ;[155] RESTORE 0 TLO ARG,UNDF ;[237] PUT BACK U FLAG IORM ARG,0(SX) ;[237] INCASE REFERENCED IN SAME LITERAL JRST LABEL9 ;DON'T STORE LABEL IN LIT LABEL8: MOVEM AC0,TAG ;SAVE FOR ERRORS HLLZS TAGINC LABEL9: PUSHJ PP,PEEK ;INSPECT A CHAR. CAIN C,":" ;COLON? PUSHJ PP,GETCHR ;YES, DISPOSE OF IT PUSHJ PP,PEEK ;EXAMINE ONE MORE CHAR. CAIN C,"!" ;EXCLAMATION? JRST GETCHR ;YES, INDEED POPJ PP, SUBTTL ATOM PROCESSOR ATOM: PUSHJ PP,CELL ;GET FIRST CELL TLNE IO,NUMSW ;IF NON-NUMERIC ATOM1: CAIE C,42 ;OR NOT A BINARY SHIFT, POPJ PP, ;EXIT PUSH PP,AC0 ;STACK REGISTERS, ITS A BINARY SHIFT PUSH PP,AC1 PUSH PP,RC PUSH PP,RX HRRI RX,^D10 ;COMPUTE SHIFT RADIX 10 PUSHJ PP,CELLSF ;GET SHIFT MOVE ARG,RC ;SAVE RELOCATION POP PP,RX ;RESTORE REGISTERS POP PP,RC POP PP,AC1 MOVN SX,AC0 ;USE NEGATIVE OF SHIFT POP PP,AC0 JUMPN ARG,NUMER2 ;IF NOT ABSOLUTE TLNN IO,NUMSW ;AND NUMERIC, JRST NUMER2 ;FLAG ERROR LSHC AC0,^D35(SX) LSH RC,^D35(SX) JRST ATOM1 ;TEST FOR ANOTHER CELLSF: TLO IO,FLDSW CELL: SETZB AC0,RC ;CLEAR RESULT AND RELOCATION SETZB AC1,AC2 ;CLEAR WORK REGISTERS MOVEM PP,PPTEMP ;SAVE PUSHDOWN POINTER TLZ IO,NUMSW TLZA FR,NEGSW!DCFSW!RADXSW CELL1: TLO IO,FLDSW AOSLE UPARRO ;[333] SKIP GETCHR IF RE-EATING ^ BYPASS LDB V,[POINT 4,CSTAT(C),14] ;GET CODE XCT .+1(V) ;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE JRST CELL1 ;0; BLANK, (TAB OR "+") JRST LETTER ;1; LETTER ] $ % ( ) , ; > TLC FR,NEGSW ;2; "-" TLO FR,INDSW ;3; "@" JRST NUM1 ;4; NUMERIC 0 - 9 JRST ANGLB ;5; "<" JRST SQBRK ;6; "[" JRST QUOTES ;7; ""","'" JRST QUAL ;10; "^" JRST PERIOD ;11; "." TROA ER,ERRQ ;12; ERROR, FLAG AND TREAT AS DELIMITER ;12; ! # & * / : = ? \ _ LETTER: TLOA AC2,(POINT 6,AC0,) ;SET BYTE POINTER LETTE1: PUSHJ PP,GETCHR ;GET CHARACTER TLNN CS,6 ;ALPHA-NUMERIC? JRST LETTE3 ;NO,TEST FOR VARIABLE TLNE AC2,770000 ;STORE ONLY SIX BYTES LETTE2: IDPB C,AC2 ;RETURN FROM PERIOD JRST LETTE1 LETTE3: CAIE C,03 ;"#"? POPJ PP, JUMPE AC0,POPOUT ;TEST FOR NULL PUSHJ PP,PEEK ;PEEK AT NEXT CHAR. CAIN C,"#" ;IS IT 2ND #? JRST LETTE4 ;YES, THEN IT'S AN EXTERN TLO IO,DEFCRS PUSHJ PP,SSRCH ;YES, SEARCH FOR SYMBOL (OPERAND) MOVSI ARG,SYMF!UNDF ;NOT FOUND, FLAG AS UNDEFINED SYM. TLNN ARG,UNDF ;UNDEFINED? JRST LETTE5 ;[247] NO, BUT SEE IF ALREADY DEFINED AS EXTERNAL TLO ARG,VARF ;YES, FLAG AS A VARIABLE TRO ER,ERRU ;SET UNDEFINED ERROR FLAG PUSHJ PP,INSERZ ;INSERT IT WITH A ZERO VALUE JRST GETDEL LETTE4: PUSHJ PP,GETCHR ;AND SCAN PAST IT TLZ IO,DEFCRS ;[267] MAKE SURE NOT A DEFINITION PUSHJ PP,EXTER5 ;[267] PUT IN SYMBOL TABLE JRST GETCHR ;GET RID OF # LETTE5: TLNE ARG,EXTF ;[247] EXTERNAL TRO ER,ERRQ ;[247] YES, FLAG WITH "Q" ERROR JRST GETCHR ;[247] GET NEXT CHAR AND RETURN NUMER1: SETZB AC0,RC ;RETURN ZERO NUMER2: TRO ER,ERRN ;FLAG ERROR GETDEL: PUSHJ PP,GETCHR GETDE1: JUMPE C,.-1 MOVEI AC1,0 GETDE3: TLO IO,NUMSW!FLDSW ;FLAG NUMERIC TLNN FR,NEGSW ;IS ATOM NEGATIVE? POPJ PP, ;NO, EXIT JUMPE AC1,GETDE2 MOVNS AC1 TDCA AC0,[-1] GETDE2: MOVNS AC0 ;YES, NEGATE VALUE MOVNS RC ;AND RELOCATION POPOUT: POPJ PP, ;EXIT QUOTES: CAIE C,"'"-40 ;IS IT "'" JRST QUOTE ;NO MUST BE """ JRST SQUOTE ;YES QUOTE0: TLNE AC0,376000 ;5 CHARACTERS STORED ALREADY? TRO ER,ERRQ ;YES, GIVE WARNING ASH AC0,7 IOR AC0,C QUOTE: PUSHJ PP,CHARAC ;GET 7-BIT ASCII CAIG C,15 ;TEST FOR LF, VT, FF OR CR CAIGE C,12 JRST .+2 ;NO, SO ALL IS WELL JRST QUOTE2 ;ESCAPE WITH Q ERROR CAIE C,42 JRST QUOTE0 PUSHJ PP,PEEK ;LOOK AT NEXT CHAR. CAIE C,42 JRST QUOTE1 ;RESTORE REPEAT LEVEL AND QUIT PUSHJ PP,CHARAC ;GET NEXT CHAR. JRST QUOTE0 ;USE IT QUOTE2: TRO ER,ERRQ ;SET Q ERROR QUOTE1: JRST GETDEL SQUOT0: CAIL C,"a" ;[243] TEST FOR LOWER CASE CAILE C,"z" ;[243] ... JRST .+2 ;[243] NO SUBI C," " ;[243] TLNE AC0,770000 ;SIX CHARS. STORED ALREADY ? TRO ER,ERRQ ;YES LSH AC0,6 IORI AC0,-40(C) ;OR IN SIXBIT CHAR. SQUOTE: PUSHJ PP,CHARAC CAIG C,CR CAIGE C,LF JRST .+2 JRST QUOTE2 ;[245] FLAG WITH "Q" ERROR CAIE C,"'" JRST SQUOT0 PUSHJ PP,PEEK CAIE C,"'" JRST QUOTE1 PUSHJ PP,CHARAC JRST SQUOT0 QUAL: BYPASS ;SKIP BLANKS, GET NEXT CHARACTER CAIN C,'B' ;"B"? JRST QUAL2 ;YES, RADIX=D2 CAIN C,'O' ;"O"? JRST QUAL8 ;YES, RADIX=D8 CAIN C,'F' ;"F"? JRST NUMDF ;YES, PROCESS DECIMAL FRACTION CAIN C,'L' ;"L"? JRST QUALL ;YES CAIN C,'-' ;[123] "^-" IS NOT JRST QUALN ;[123] CAIE C,'D' ;"D"? JRST NUMER1 ;NO, FLAG NUMERIC ERROR ADDI AC2,2 QUAL8: ADDI AC2,6 QUAL2: ADDI AC2,2 PUSH PP,RX HRR RX,AC2 PUSHJ PP,CELLSF QUAL2A: POP PP,RX TLNN IO,NUMSW JRST NUMER1 JRST GETDE1 QUALL: PUSH PP,FR PUSHJ PP,CELLSF MOVE AC2,AC0 MOVEI AC0,^D36 SETZ RC, ;[374] IN CASE ARG IS RELOCATABLE JUMPE AC2,QUAL2A LSH AC2,-1 SOJA AC0,.-2 QUALN: MOVE CS,CSTATN ;[416]GET CHARACTERISTICS FOR "^-" JRST GETDE1 ;[416]THEN GET DELIMITER SUBTTL LITERAL PROCESSOR SQBRK: PUSH PP,TAG ;[402] SAVE CURRENT TAG PUSH PP,TAGINC ;[402] AND OFFSET PUSH PP,FR PUSH PP,EXTPNT ;ALLOW EXTERN TO PRECEDE LIT IN XWD IFN FORMSW,< PUSH PP,IOSEEN ;[344] SAVE I/O INSTRUCTION SEEN VALUE> SETZM EXTPNT SKIPE LITLVL ;SAVE SEQNO AND PAGE IF NOT IN LIT ALREADY JRST SQB5 FORERR (C,LIT) SQB5: JSP AC2,SVSTOW PUSH PP,[0] ;[217] STACK A ZERO TLNE IO,IOPALL ;[217] LEAVE ALONE IF LALL ON TLNN IO,IOSALL ;[321] TEST IF SALL ALREADY ON SETOM (PP) ;[217] SIGNAL NOT BY -1 PUSH PP,LITERR ;[415]SAVE LITERR FROM PREVIOUS LEVEL SETZM LITERR ;[415]CLEAR IT FOR THIS LEVEL SQB3: PUSHJ PP,STMNT IORM ER,LITERR ;[415]GET CUMMULATIVE ERRORS FOR LEVEL CAIN C,75 ;CHECK FOR ] JRST SQB1 TLO IO,IORPTC TLNE FR,MWLFLG ;CALL IT ] IF NOT MULTI-WORD FLAG JRST SQB2 ;BUT REPEAT LAST CHARACTER BYPASS CAIN C,EOL TLOA IO,IORPTC TRO ER,ERRQ SQB4: PUSHJ PP,CHARAC CAIN C,";" ;COMMENT? JRST SQB6 ;YES, IGNORE SQUARE BRACKETS CAIN C,"]" ;LOOK FOR TERMINAL SQB TRNN ER,ERRORS ;IN CASE OF ERROR IN LITERAL JRST .+2 ;NO ALL IS WELL JRST SQB1 ;FINISH THE LITERAL NOW!! CAIG C,FF ;LOOK FOR END OF LINE CAIN C,HT JRST SQB4 SQB4A: PUSHJ PP,OUTIML ;DUMP PUSHJ PP,CHARAC ;GET ANOTHER CHAR. SKIPL LIMBO ;CRLF FLAG TLO IO,IORPTC ;NO REPEAT JRST SQB3 SQB6: PUSHJ PP,CHARAC ;GET A CHARACTER CAIG C,CR CAIN C,HT ;LOOK FOR END OF LINE CHAR. JRST SQB6 ;NOT YET JRST SQB4A ;GOT IT SQB1: TLZ IO,IORPTC SQB2: PUSHJ PP,STOLIT POP PP,LITERR ;[415]RESTORE LITERR FOR NEXT LEVEL SKIPE (PP) ;[217] WAS SALL ORIGINALLY ON? TLZ IO,IOSALL ;[217] NO, SO TURN IT OFF POP PP,(PP) ;[217] GET STACK RIGHT JSP AC2,GTSTOW SKIPE LITLBL ;NEED TO FIXUP A LABEL? PUSHJ PP,RELBLE ;YES, USE LOC OF LITERAL IFN POLISH,< SKIPE POLITS ;[265] NEED TO FIXUP ANY POLISH? PUSHJ PP,SQBPOL ;[265] YES > IFN FORMSW,< POP PP,IOSEEN ;[344] RESTORE IOSEEN FOR LISTING> POP PP,EXTPNT POP PP,FR POP PP,TAGINC ;[402] RESTORE PREVIOUS OFFSET POP PP,TAG ;[402] AND LABEL SETZM LBLFLG ;[402] ZERO 'LABEL-IN-LITERAL' FLAG SETZM LTGINC ;[402] AND MARKER SKIPE LITLVL ;WERE WE NESTED? JUMP1 NUMER2 ;YES, FORCE ERROR IF PASS 1 JUMP2 GETDEL ;[120] USE VALUE GIVEN IF PASS 2 TRO ER,ERRU ;[120] VALUE IS UNDEFINED ON PASS 1 SETZ AC0, ;[120] SO SET IT TO 0 JRST GETDEL ;[120] RELBLE: PUSH PP,AC0 ;SAVE LOCATION COUNTER PUSH PP,RC ;AND RELOCATION MOVE AC0,LITLBL ;SYMBOL WE NEED SETZM LITLBL ;ZERO INDICATOR PUSHJ PP,SSRCH ;SEARCH FOR OPERAND JRST RELBL1 ;SHOULD NEVER HAPPEN TLNN ARG,TAGF ;IT BETTER BE A LABEL JRST RELBL1 ;IT WASN'T , GIVE UP BEFORE SOME HARM IS DONE TLZ ARG,UNDF!EXTF!PNTF ;CLEAR FLAGS NOW POP PP,RC ;GET LITERAL RELOCATION MOVE V,(PP) ;GET VALUE (LOC COUNTER) ADD V,LITLBL+1 ;[155] PLUS DEPTH IN LITERAL PUSHJ PP,UPDATE ;UPDATE VALUE POP PP,AC0 ;RESTORE LITERAL COUNT POPJ PP, ;RETURN RELBL1: POP PP,RC ;RESTORE RC POP PP,AC0 ;AND AC0 POPJ PP, ;JUST RETURN IFN POLISH,< ;[265] ;HERE TO FIXUP POLISH EXPRESSIONS INSIDE CURRENT LIT ;AS EACH ONE IS FIXED MOVE IT TO POLIST SQBPOL: PUSH PP,CS ;GET SOME FREE ACCS PUSH PP,AC0 ;SAVE LOC SQBPL1: MOVE CS,@POLITS ;GET A BLOCK POINTER EXCH CS,POLITS ;SET FOR NEXT TIME MOVE AC0,CS ;GET A COPY EXCH AC0,POLIST ;STORE IN LIST OF "GOOD" POLISH MOVEM AC0,(CS) ;LINK IN SQBPL2: ADDI CS,1 ;FIRST WORD MOVE AC0,(CS) ;GET SOMETHING JUMPL AC0,SQBPL5 ;THIS IS AN OPERATOR JUMPE AC0,SQBPL4 ;18 BIT VALUE SOJE AC0,SQBPL3 ;36 BIT VALUE AOJA CS,SQBPL2 ;SYMBOL SQBPL3: ADDI CS,1 ;SKIP OVER 2 WORDS SQBPL4: AOJA CS,SQBPL2 ;GET NEXT SQBPL5: HRRZ AC0,AC0 ;GET OPERATOR ONLY CAIGE AC0,-6 ;[265] CHECK FOR STORE OP JRST SQBPL2 ;ITS NOT MOVE AC0,0(PP) ;GET ADDRESS ADDM AC0,1(CS) ;ADD TO OFFSET HRLM RC,1(CS) ;SET RELOCATION SKIPE POLITS ;MORE TO DO? JRST SQBPL1 ;YES POP PP,AC0 ;RESTORE LOC POP PP,CS ;AND SAVED AC POPJ PP, > SUBTTL NUMBER PROCESSOR ANGLB: PUSH PP,FR TLZ FR,INDSW PUSHJ PP,ATOM TLNN IO,NUMSW CAIE C,35 JRST ANGLB1 PUSHJ PP,ASSIG1 MOVE AC0,V JRST ANGLB2 ANGLB1: PUSHJ PP,EVALHA ANGLB2: POP PP,FR CAIE C,36 TRO ER,ERRN JRST GETDEL PERIOD: PUSHJ PP,GETCHR ;LOOK AT NEXT CHARACTER TLNN CS,2 ;ALPHABETIC? JRST PERNUM ;NO, TEST NUMERIC MOVSI AC0,'. ' ;YES, PUT PERIOD IN AC0 MOVSI AC2,(POINT 6,AC0,5) ;SET BYTE POINTER JRST LETTE2 ;AND TREAT AS SYMBOL PERNUM: TLNE CS,4 ;IS IT A NUMBER JRST NUM32 ;YES MOVE AC0,LOCA ;NO. CURRENT LOC SYMBOL (.) MOVE RC,MODA ;SET TO CURRENT ASSEMBLY MODE JRST GETDE1 ;GET DELIMITER NUMDF: TLO FR,DCFSW ;SET DECIMAL FRACTION FLAG NUM: PUSHJ PP,GETCHR ;GET A CHARACTER TLNN CS,4 ;NUMERIC? JRST NUM10 ;NO NUM1: SUBI C,20 ;CONVERT TO OCTAL PUSH PP,C ;STACK FOR FLOATING POINT SKIPE AC0 ;ARE WE ABOUT TO LOSE SOME DATA? TRO ER,ERRQ ;YES, AT LEAST WARN USER MOVE AC0,AC1 MULI AC0,0(RX) ADD AC1,C ;ADD IN LAST VALUE CAIL C,0(RX) ;IS NUMBER LESS THAN CURRENT RADIX? TLO FR,RADXSW ;NO, SET FLAG AOJA AC2,NUM ;YES, AC2=NO. OF DECIMAL PLACES NUM10: CAIE C,'.' ;PERIOD? TLNE FR,DCFSW ;OR DECIMAL FRACTION? JRST NUM30 ;YES, PROCESS FLOATING POINT SETZ CS, ;AND CLEAR IT CAIN C,'K' ;SEE IF SUFFIX THERE MOVEI CS,3 CAIN C,'M' MOVEI CS,6 CAIN C,'G' MOVEI CS,9 JUMPE CS,NUM12 ;NO SUFFIX? MOVE AC0,AC1 ;SCALE THE NUMBER MULI AC0,(RX) SOJG CS,.-2 PUSHJ PP,GETCHR ;SKIP THE SUFFIX NUM12: MOVE CS,CSTAT(C) ;RESTORE STATUS LSH AC1,1 ;NO, CLEAR THE SIGN BIT LSHC AC0,^D35 ;AND SHIFT INTO AC0 MOVE PP,PPTEMP ;RESTORE PP SOJE AC2,GETDE1 ;NO RADIX ERROR TEST IF ONE DIGIT TLNE FR,RADXSW ;WAS ILLEGAL NUMBER ENCOUNTERED? TRO ER,ERRN ;YES, FLAG N ERROR JRST GETDE1 NUM30: CAIE C,'B' ;IF "B" THEN MISSING "." NUM31: PUSHJ PP,GETCHR TLNN CS,4 ;NUMERIC? JRST NUM40 ;NO NUM32: SUBI C,20 PUSH PP,C JRST NUM31 NUM40: PUSH PP,FR ;STACK VALUES HRRI RX,^D10 PUSH PP,AC2 PUSH PP,PPTEMP CAIN C,45 ;"E"? JRST [PUSHJ PP,PEEK ;GET NEXT CHAR PUSH PP,C ;SAVE NEXT CHAR PUSHJ PP,CELL ;YES, GET EXPONENT POP PP,C ;GET FIRST CHAR. AFTER E CAIN V,4 ;MUST HAVE NUMERICAL STATUS JRST .+2 ;SKIP RETURN CAIN C,"<" ;ALLOW JRST .+2 ;SKIP RETURN SKIPN AC0 ;ERROR IF NON-ZERO EXPRESSION TROA ER,ERRQ ;ALLOW E+,E- SETOM RC ;FORCE NUMERICAL ERROR JRST .+2] ;SKIP RETURN MOVEI AC0,0 ;NO, ZERO EXPONENT POP PP,PPTEMP POP PP,SX POP PP,FR HRRZ V,PP MOVE PP,PPTEMP JUMPN RC,NUMER1 ;EXPONENT MUST BE ABSOLUTE ADD SX,AC0 HRRZ ARG,PP ADD SX,ARG SETZB AC0,AC2 TLNE FR,DCFSW JRST NUM60 JOV NUM50 ;CLEAR OVERFLOW FLAG NUM50: JSP SDEL,NUMUP ;FLOATING POINT JRST NUM52 ;END OF WHOLE NUMBERS FMPR AC0,[10.0] ;MULTIPLY BY 10 TLO AC1,233000 ;CONVERT TO FLOATING POINT FADR AC0,AC1 ;ADD IT IN JRST NUM50 NUM52: JSP SDEL,NUMDN ;PROCESS FRACTION FADR AC0,AC2 JOV NUMER1 ;TEST FOR OVERFLOW JRST GETDE1 TLO AC1,233000 TRNE AC1,-1 FADR AC2,AC1 ;ACCUMULATE FRACTION FDVR AC2,[10.0] JRST NUM52 NUM60: JSP SDEL,NUMUP JRST NUM62 IMULI AC0,^D10 ADD AC0,AC1 JRST NUM60 NUM62: LSHC AC1,-^D36 JSP SDEL,NUMDN LSHC AC1,^D37 PUSHJ PP,BYPAS2 JRST GETDE3 DIVI AC1,^D10 JRST NUM62 NUMUP: MOVEI AC1,0 CAML ARG,SX JRST 0(SDEL) CAMGE ARG,V MOVE AC1,1(ARG) AOJA ARG,1(SDEL) NUMDN: MOVEI AC1,0 CAMG V,SX JRST 0(SDEL) CAMLE V,ARG MOVE AC1,0(V) SOJA V,3(SDEL) SUBTTL GETSYM GETSYM: MOVEI AC0,0 ;CLEAR AC0 MOVSI AC1,(POINT 6,AC0) ;PUT POINTER IN AC1 BYPASS ;SKIP LEADING BLANKS TLNN CS,2 ;ALPHABETIC? JRST GETSY1 ;NO, ERROR CAIE C,16 ;PERIOD? JRST GETSY2 ;NO, A VALID SYMBOL IDPB C,AC1 ;STORE THE CHARACTER PUSHJ PP,GETCHR ;YES, TEST NEXT CHARACTER TLNN CS,2 ;ALPHABETIC? GETSY1: TROA ER,ERRA GETSY2: AOS 0(PP) ;YES, SET SKIP EXIT GETSY3: TLNN CS,6 ;ALPHA-NUMERIC? JRST BYPAS2 ;NO, GET DELIMITER TLNE AC1,770000 ;YES, HAVE WE STORED SIX? IDPB C,AC1 ;NO, STORE IT PUSHJ PP,GETCHR JRST GETSY3 SUBTTL EXPRESSION EVALUATOR CV== AC0 ;CURRENT VALUE PV== AC1 ;PREVIOUS VALUE RC== RC ;CURRENT RELOCATABILITY PR== AC2 ;PREVIOUS RELOCATABILITY CS= CS ;CURRENT STATUS PS== SDEL ;PREVIOUS STATUS EVALHA: TLO FR,TMPSW EVALCM: PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION PUSH PP,[0] ;MARK PDL JUMPCM EVALC3 ;JUMP IF COMMA TLO IO,IORPTC ;IT'S NOT,SO REPEAT JRST OP ;PROCESS IN OP EVALC3: IFN FORMSW, PUSH PP,[0] ;STORE ZERO'S ON PDL PUSH PP,[0] ;....... MOVSI AC2,(POINT 4,(PP),12) JRST OP1B ;PROCESS IN OP EVALEX: TLO IO,FLDSW IFN POLISH,< TLZ FR,POLSW ;[164] CLEAR EVALUATING POLISH FLAG > PUSH PP,[TNODE,,0] ;MARK THE LIST 200000,,0 TLZN FR,TMPSW EVATOM: PUSHJ PP,ATOM ;GET THE NEXT ATOM JUMPE AC0,EVGETD ;TEST FOR NULL/ZERO TLOE IO,NUMSW ;SET NUMERIC, WAS IT PREVIOUSLY? JRST EVGETD+1 ;YES, TREAT ACCORDINGLY PUSHJ PP,SEARCH ;SEARCH FOR MACRO OR SYMBOL JRST EVOP ;NOT FOUND, TRY FOR OP-CODE JUMPL ARG,.+2 ;SKIP IF OPERAND PUSHJ PP,SSRCH1 ;OPERATOR, TRY FOR SYMBOL (OPERAND) PUSHJ PP,QSRCH ;PERFORM CROSS-REFERENCE JUMPG ARG,EVMAC ;BRANCH IF OPERATOR MOVE AC0,V ;SYMBOL, SET VALUE JRST EVTSTS ;TEST STATUS EVMAC: TLNE FR,NEGSW ;UNARY MINUS? JRST EVERRZ ;YES, INVALID BEFORE OPERATOR LDB SDEL,[POINT 3,ARG,5] ;GET MACF/OPDF/SYNF SOJL SDEL,EVERRZ ;ERROR IF NO FLAGS JUMPE C,.+2 ;NON-BLANK? TLO IO,IORPTC ;YES, REPEAT CHARACTER SOJE SDEL,EVMAC1 ;MACRO IF 2 JUMPG SDEL,EVOPS ;SYNONYM IF 4 MOVE AC0,V ;OPDEF MOVEI V,OP ;SET TRANSFER VECTOR JRST EVOPD EVMAC1: SKIPL MACENL ;ALREADY IN CALLM? JRST CALLM ;NO, EVALUATE MACRO SETZB RC,AC0 ;ZERO VALUE TRO ER,ERRA ;SET "A" ERROR JRST EVGETD ;CONTINUE EVALUATION EVOP: PUSHJ PP,OPTSCH ;[363] SEARCH OP TABLE JRST EVOPX ;[363] NOT FOUND TLNE FR,NEGSW ;[363] OPCODE, UNARY MINUS? JRST EVERRZ ;[363] YES, ERROR EVOPS: TRZ V,LITF ;CLEAR LIT INVALID FLAG TRZE V,ADDF ;SYNONYM JRST EVOPX ;PSEUDO-OP THAT GENERATES NO DATA JUMPS HLLZ AC0,V EVOPD: JUMPE C,.+2 ;OPDEF, NON-BLANK DELIMITER? TLO IO,IORPTC ;YES, REPEAT CHARACTER JSP AC2,SVSTOW PUSHJ PP,0(V) PUSHJ PP,DSTOW JSP AC2,GTSTOW TRNE RC,-2 HRRM RC,EXTPNT TLNE RC,-2 HLLM RC,EXTPNT JRST EVNUM EVOPX: MOVSI ARG,SYMF!UNDF PUSHJ PP,INSERZ EVERRZ: SETZB AC0,RC ;CLEAR CODE AND RELOCATION EVERRU: TRO ER,ERRU JRST EVGETD EVTSTS: TLNE ARG,UNDF JRST [TRO ER,ERRU ;SET UNDEF ERROR JUMP1 EVGETD ;TREAT AS UNDF ON PASS1 JRST .+1] ;TREAT AS EXTERNAL ON PASS2 TLNN ARG,EXTF JRST EVTSTR HRRZ RC,ARG ;GET ADRES WFW HRRZ ARG,EXTPNT ;SAVE IT WFW HRRM RC,EXTPNT ;WFW IFE POLISH,< ;[164] NOT NEEDED SINCE POLISH WILL TAKE CARE OF EXTERNS TRNE ARG,-1 ;WFW TRO ER,ERRE > SETZB AC0,ARG EVTSTR: TLNE ARG,MDFF ;MULTIPLY DEFINED? TRO ER,ERRD ;YES, FLAG IT TLNN FR,NEGSW ;[255] NEGATIVE ATOM? JRST EVGETD ;[255] NO IFN POLISH,< TDNE RC,[-2,,-2] ;[255] EXTERNALS? JRST NEGEXT ;[255] YES, MUST BE UNARY MINUS > PUSHJ PP,GETDE2 ;[255] NO, JUST NEGATE EVGETD: TLNE IO,NUMSW ;NON BLANK FIELD TLO FR,FSNSW ;YES,SET FLAG PUSHJ PP,BYPAS2 TLNE CS,6 ;ALPHA-NUMERIC? TLO IO,IORPTC ;YES, REPEAT IT CAIN C,'^' ;[123] IS THIS THE SPECIAL ESCAPE CHAR? JRST EVUPAR ;[123] YES, SEE WHAT FOLLOWS EVUPAT: ;[333] LABEL FOR RETURN FROM ^ IFN POLISH,< TLZN IO,RSASSW ;INTER-PSECT REFERENCE? JRST EVNUM ;NO PUSH PP,SGWFND ;INX OF PSECT REFERRED TO PUSH PP,[-1] ;DUMMY RELOCATION PUSH PP,CSTATP> ;ADDITIVE PSECT OPERATION EVNUM: POP PP,PS ;POP THE PREVIOUS DELIMITER/TNODE TLO PS,4000 IFN POLISH,< TLC PS,110000 ;TEST FOR BITS 2 AND 5 TLCN PS,110000 ; BOTH ON - MEANS ADDITIVE JRST EVXCT> ; PSECT OPERATION CAMGE PS,CS ;OPERATION REQUIRED? JRST EVPUSH ;NO, PUT VALUES BACK ON STACK TLNN PS,TNODE ;YES, HAVE WE REACHED TERMINAL NODE? JRST EVXCT ;NO, EXECUTION REQUIRED TLNE CS,170000 ;[123] YES, ARE WE POINTING AT DEL? (& ! * / + - _) JRST EVPUSH ;[123] NO,FALL INTO EVPUSH IFN POLISH,< TLNE FR,POLSW ;[164] BEEN RESOLVING POLISH? JRST POLPOP ;[164] YES, OUTPUT IT > POPJ PP, ;NO, EXIT ;HERE TO HANDLE "^!" EVUPAR: SETZM UPARRO ;[333] CLEAR ^ COUNTER ONCE IN A WHILE PUSHJ PP,PEEK ;[333] SEE WHAT CHARACTER AFTER ^ IS SETZ CS, ;[333] AND CHECK FOR ! AFTER IT CAIN C,"!" ;[333] IS IT ! FOR ^! SKIPA CS,CSTATX ;[333] YES, GET SPECIAL POINTER JRST EVUPAN ;[416]NOT ^! TLZ IO,IORPTC ;[337] CLEAR REREAD SKIPE MRP ;[357] IF IN A MACRO PUSHJ PP,MREAD ;[357] BETTER DO THIS SUBI C,40 ;[333] YES, CHANGE TO SIXBIT JRST EVNUM ;[333] AND EVALUATE EVUPAN: MOVEI C,'^' ;[333] RESTORE C MOVE CS,CSTAT(C) ;[333] AND CS SETOM UPARRO ;[333] SET FLAG FOR CELL1 TO RE-EAT ^ JRST EVUPAT ;[333] AND CONTINUE FROM ^ EVPUSH: PUSH PP,PS ;STACK VALUES PUSH PP,CV PUSH PP,RC PUSH PP,CS JRST EVATOM ;GET NEXT ATOM EVXCT: POP PP,PR ;POP PREVIOUS RELOCATABILITY POP PP,PV ;AND PREVIOUS VALUE LDB PS,[POINT 4,PS,29] ;[123] TYPE OF OPERATION TO PS IFE POLISH,< XCT EVTAB(PS) ;[123] PERFORM PROPER OPERATION JUMPN RC,.+2 ;COMMON RELOCATION TEST EVXCT1: JUMPE PR,EVNUM TRO ER,ERRR ;BOTH MUST BE FIXED JRST EVNUM ;GO TRY AGAIN EVTAB: JRST ASSEM1 ;0; SHOULD NEVER GET HERE ;DMN JRST XMUL ;1; JRST XDIV ;2; JRST XADD ;3; JRST XSUB ;4; JRST XLRW ;5; "_" IOR CV,PV ;6; MERGE PV INTO CV AND CV,PV ;7; AND PV INTO CV XOR CV,PV ;10; XOR PV INTO CV SETCM CV,CV ;11;[416] NOT (ONE'S COMPLIMENT) REPEAT 6, ;12-17;[416] JUST INCASE > IFN POLISH,< CAILE PS,11 ;[265] OPS 12 AND 13 JRST POLPSH ;[265] REQUIRE POLISH FIXUPS TDNN RC,[-2,,-2] ;CHECK FOR EXTERNALS TDNE PR,[-2,,-2] ;IN EITHER OPERAND JUMP2 POLPSH ;CAN NOT DO IT HERE XCT PRTAB(PS) ;TEST PREVIOUS RELOCATION XCT RCTAB(PS) ;AND THIS RELOCATION EVXCT1: JFCL 17,.+1 ;[276] CLEAR OVERFLOW FOR * AND / XCT EVTAB(PS) ;[276] PERFORM PROPER OPERATION SKIPL OKOVFL ;[362] OVERFLOW OK? JOV .+2 ;[276] SKIP IF * OR / OVERFLOWED SKIPA ;[276] IT'S OK TRO ER,ERRN ;[276] SET N ERROR FOR OVERFLOW JRST EVNUM ;GO TRY AGAIN EVTAB: JRST ASSEM1 ;0; SHOULD NEVER GET HERE ;DMN IMULM PV,CV ;1; IDIVM PV,CV ;2; JRST XADD ;3; JRST XSUB ;4; JRST XLRW ;5; "_" IOR CV,PV ;6; MERGE PV INTO CV AND CV,PV ;7; AND PV INTO CV XOR CV,PV ;10; XOR PV INTO CV SETCM CV,CV ;11; NOT (ONE'S COMPLIMENT) MOVN CV,CV ;12; NEGATE (TWO'S COMPLEMENT) JFCL ;13;[265] ADDITIVE PSECT OPERATION REPEAT 4, ;14-17; JUST INCASE NEGEXT: MOVE PS,(PP) ;[255] GET DELIMITER OFF STACK CAME PS,[TNODE,,0] ;[255] NOTHING ON YET? JRST EVGETD ;[255] NO? MOVSI PS,4000 ;[255] FAKE UP EVPUSH OF ADDM PS,(PP) ;[255] PS PUSH PP,[0] ;[255] CV PUSH PP,[0] ;[255] RC PUSH PP,CSTAT+'-' ;[255] CS TLZ FR,NEGSW ;[255] CLEAR FLAG JRST EVGETD ;[255] NOW EVALUATE PRTAB: JFCL ;0 JUMPN PR,POLPSH ;1 JUMPN PR,POLPSH ;2 SKIPE PR ;3 SKIPE PR ;4 REPEAT 4, ;5, 6, 7, 10 JFCL ;11 RCTAB: JFCL ;0 JUMPN RC,POLPSH ;1 JUMPN RC,POLPSH ;2 JUMPN RC,POLPSH ;3 JUMPE RC,POLPSH ;4 REPEAT 4, ;5, 6, 7, 10 JFCL ;11 > XSUB: SUBM PV,CV SUBM PR,RC JRST EVNUM XADD: ADDM PV,CV ADDM PR,RC JRST EVNUM IFE POLISH,< XDIV: IDIV PR,CV ;CORRECT RELOCATABILITY JFCL 17,.+1 ;[276] CLEAR OVERFLOW IDIVM PV,CV SKIPL OKOVFL ;[362] SKIP IF OVERFLOW OK JOV .+2 ;[276] SEE IF OVERFLOWED SKIPA ;[276] NO TRO ER,ERRN ;[276] YES, SET N ERROR XDIV1: EXCH PR,RC ;TAKE RELOCATION OF NUMERATOR JRST EVXCT1 XMUL: JUMPE PR,XMUL1 ;AT LEAST ONE OPERAND JUMPE RC,XMUL1 ;MUST BE FIXED TRO ER,ERRR XMUL1: IORM PR,RC ;GET RELOCATION TO RC CAMGE PV,CV ;FIND THE GREATER EXCH PV,CV ;FIX IN CASE CV=0,OR 1 IMULM PV,RC JFCL 17,.+1 ;[276] CLEAR OVERFLOW IMULM PV,CV SKIPL OKOVFL ;[362] SKIP IF OVERFLOW OK JOV .+2 ;[276] SEE IF OVERFLOW SKIPA ;[276] NO TRO ER,ERRN ;[276] YES, SET N ERROR JRST EVNUM XLRW: EXCH PV,CV ;[401][407] LSH CV,0(PV) LSH PR,0(PV) JRST XDIV1 > IFN POLISH,< XLRW: EXCH PV,CV LSH CV,0(PV) JRST EVNUM > IFN POLISH,< ;[164] ;HERE FOR EXTERNAL ARITHMETIC ;CONVERS TO POLISH BLOCK TYPE 11 POLPSH: JUMP1 EVXCT1 ;ONLY SAVE POLISH ON PASS2 PUSH PP,POLSTK ;SAVE STACK POINTER EXCH PP,POLSTK ;SAVE PP AND SET UP POLISH STACK TLO FR,POLSW ;SIGNAL STORING POLISH PUSH PP,POLTBL-1(PS) ;STACK OPERATOR PUSH PP,PR ;STACK PREVIOUS RELOCATION PUSH PP,PV ;AND VALUE PUSH PP,RC ;STACK CURRENT PUSH PP,CV EXCH PP,POLSTK ;GET PP BACK POP PP,CV ;USE STACK POINTER FOR VALUE MOVE RC,CV ;AND RELOCATION (ENSURES EXTERNAL) JRST EVNUM ;TRY NEXT ITEM ;HERE TO STORE THE POLISH LIST ;RC (AND CV) HAVE POINTER TO TOP ITEM IN PUSHDOWN STACK POLPOP: MOVE PV,FREE ;GET NEXT FREE LOCATION EXCH PV,POLIST ;SWAP STACK POINTER PUSHJ PP,POLSTR ;STORE POINTER TO NEXT POLISH BLOCK PUSHJ PP,POLOPF ;STORE FIRST OPERATOR PUSHJ PP,POLFST ;STORE FIRST PART PUSHJ PP,POLSND ;STORE SECOND PART SKIPE PV,POLTYP ;USE PRESET TYPE JRST POLOCT ;IF SET SETO PV, ;STORE OPERATOR OF -1 JUMPNC POLOCT ;FOR RIGHT HALF FIXUP SUBI PV,1 ;-2 FOR LEFT HALF POLOCT: XCT 3+[SETZM EXTPNT ;FULL WORD HRRZS EXTPNT ;LEFT HALF HLLZS EXTPNT](PV) ;RIGHT HALF SKIPE INASGN ;DEFINING A SYMBOL? JRST [SUBI PV,3 ;DIFFERENT STORE OPERATOR PUSHJ PP,POLSTR ;STORE IT MOVE CV,HDAS ;GET FLAGS MOVEI ARG,10 ;ASSUME LOCAL TLNE CV,INTF ;IS IT GLOBAL? MOVEI ARG,4 ;YES, MAKE GLOBAL MOVE CV,INASGN ;GET SIXBIT SYMBOL PUSHJ PP,SQOZE ;RADIX50 MOVE PV,AC0 ;CORRECT ACC JRST POLPOR] ;STORE IT PUSHJ PP,POLSTR ;[265] STORE IT MOVE PV,LOCA ;LOCATION HRL PV,MODA ;AND MODE SKIPN LITLVL ;[265] HOWEVER IF IN A LITERAL? JRST POLPOR ;[265] NOT MOVE PV,POLIST ;[265] WE CAN NOT SUPPLY THE STORE ADDRESS YET MOVE CV,(PV) ;[265] SO PUT IN A SPECIAL LIST MOVEM CV,POLIST ;[265] REMOVE FROM REGULAR LIST EXCH PV,POLITS ;[265] STORE IN POLIST LIT LIST MOVEM PV,@POLITS ;[265] LINK TOGETHER MOVE PV,STPX ;[265] STORE DEPTH IN THIS LIT SUB PV,STPY ;[265] WITH NO RELOCATION YET POLPOR: PUSHJ PP,POLSTR SETZB RC,CV ;USE ZERO VALUE AND RELOCATION POLRET: MOVE PV,POLPTR ;RESET INITIAL POLISH POINTER MOVEM PV,POLSTK POPJ PP, ;RETURN ;THIS IS A KLUDGE TO PRODUCE ADDITIVE GLOBALS FOR THE FEW CASES THAT THEY ;CAN HANDLE. I.E. K+GLOBAL, GLOBAL+K, GLOBAL-K ;SO THAT OLD PROGRAMS WILL COMPIL THE SAME WAY AND LOAD WITH THE ;OLD LOADER WITHOUT THE FAILSW CODE ;APART FROM ADDITIVE SYMBOL FIXUPS POLISH BLOCKS ARE MORE POWERFULL ;***** REMOVE SOMEDAY POLOPF: HRRZ PS,1(RC) ;GET FIRST OPERATOR CAIE PS,3 ;CAN ONLY HANDLE ADD CAIN PS,4 ;AND SUBTRACT JRST POLOP2 ;ITS ONE OF THOSE GIVE IT A TRY ;***** POLOPX: SKIPN SGNMAX ;[265] PSECTS USED? JRST POLOPR ;[265] NO PUSH PP,PV ;[265] SAVE FIRST OP HRRO PV,SGNCUR ;[265] GET CUR PSECT INX TRO PV,400000 ;[265] MAKE POLISH OP PUSHJ PP,POLSTR ;[265] STORE IT POP PP,PV ;[265] GET FIRST OP POLOPR: HRRZ PV,1(RC) ;[265] GET OPERATOR CAIE PV,15 ;[265] ADDITIVE PSECT OPERATION? JRST POLOPS ;[265] NO AOS 0(PP) ;[265] SKIP FIRST OPERAND HRRO PV,3(RC) ;[265] GET PSECT INX TROA PV,400000 ;[265] MAKE POLISH OP POLOPS: HRRO PV,1(RC) ;[265] GET OPERATOR AND FLAG IT JRST POLSTR ;STORE IT AND EXIT ;***** MORE OF THIS KLUDGE POLOP2: SUBI PS,3 ;MAKES LIFE EASIER MOVE CV,4(RC) ;GET 2ND OPERAND JUMPL CV,POLOPX ;ITS A POINTER, THEREFORE TOO COMPLEX MOVE PV,2(RC) ;AND 1ST OPERAND JUMPL PV,POLOPX ;THIS IS A POINTER TDNN CV,[-2,,-2] ;TEST FOR EXTERN JRST [TRNE CV,1 ;TEST FOR BOTH RELOCATABLE TRNN PV,1 JRST POLOP3 ;THIS IS NOT EXTERN SO OTHER CAN BE JRST POLOPX] ;CANNOT HANDLE HERE, USE POLISH JUMPN PS,POLOPX ;CAN NOT HANDLE -GLOBAL TDNE PV,[-2,,-2] ;TEST FOR EXTERN HERE JRST POLOPX ;GLOBAL+GLOBAL TOO COMPLEX POLOP3: SOS FREE ;BACKUP FREE COUNTER MOVE PV,@FREE ;GET LAST POINTER MOVEM PV,POLIST ;SET POINTER BACK POP PP,PV ;POP RETURN OFF STACK TLZ FR,POLSW ;CLEAR FLAG JUST IN CASE ;RELOAD RC, CV, PV, AND PR FROM STACK ;AND EXECUTE OPERATOR MOVE PR,2(RC) ; MOVE PV,3(RC) MOVE CV,5(RC) MOVE RC,4(RC) ;THIS ONE LAST OF COURSE JUMPN PS,POLOP5 ;DO MINUS ADDM PV,CV ADDM PR,RC JRST POLRET ;RESTORE STACK AND RETURN POLOP5: SUBM PV,CV SUBM PR,RC JRST POLRET ;***** END OF THIS KLUDGE ;HERE TO HANDLE FIRST OPERAND ;HIGHLY RECURSIVE POLFST: MOVE PV,2(RC) ;GET RELOCATION JUMPL PV,POLFSR ;THIS IS ANOTHER POINTER TDNE PV,[-2,,-2] ;IS IT EXTERNAL? JRST POLFS2 ;YES MOVE CV,3(RC) ;GET VALUE POLFS4: TLNN PV,-1 ;CHECK FOR LEFT HALF VALUE TLNE CV,-1 JRST POLFS1 ;YES, NEED FULL WORD HRL CV,PV ;XWD RELOC ,, VALUE SETZ PV, ;OPERAND IS 0 FOR 18 BIT VALUE PUSHJ PP,POLSTR MOVE PV,CV JRST POLSTR ;STORE AND EXIT POLFS1: MOVEI PV,1 ;OPERAND IS 1 FOR 36 BIT VALUE PUSHJ PP,POLSTR MOVE PV,2(RC) ;RELOCATION PUSHJ PP,POLSTR MOVE PV,CV ;VALUE JRST POLSTR POLSN2: POLFS2: MOVE CV,1(PV) ;GET SIXBIT SYMBOL INTO AC0 MOVEI PV,2 ;OPERAND IN 2 FOR SYMBOL PUSHJ PP,POLSTR MOVEI ARG,4 ;MAKE GLOBAL REQUEST PUSHJ PP,SQOZE ;TO RADIX-50 MOVE PV,CV ;PUT IN RIGHT ACC JRST POLSTR ;STORE IT POLFSR: CAME PV,3(RC) ;CHECK TO MAKE SURE IT REALLY IS A POINTER JRST POLFSN ;NO, ITS A NEGATIVE GLOBAL PUSH PP,RC ;SAVE THIS POINTER MOVE RC,PV ;GET NEXT POINTER PUSHJ PP,POLOPR ;GET OPERATOR PUSHJ PP,POLFST ;GET FIRST OPERAND PUSHJ PP,POLSND ;GET SECOND OPERAND POP PP,RC ;GET BACK PREVIOUS POINTER POPJ PP, ;RETURN TO PREVIOUS LEVEL POLFSN: HRROI PV,14 ;TWO'S COMPLIMENT NEGATIVE PUSHJ PP,POLSTR ;STORE OPERATOR MOVN PV,2(RC) ;GET RELOCATION TDNE PV,[-2,,-2] ;CHECK FOR EXTERN JRST POLFS2 ;IT IS, CONVERT TO RADIX-50 MOVN CV,3(RC) ;GET VALUE JRST POLFS4 ;AND STORE IT ;HERE TO HANDLE 2ND OPERAND, ALSO RECURSIVE POLSNR: CAME PV,5(RC) ;MAKE SURE IT REALLY IS JRST POLSNN ;ITS A NEGATIVE GLOBAL MOVE RC,PV ;GET NEXT POINTER PUSHJ PP,POLOPR ;STORE OPERATOR PUSHJ PP,POLFST ;GET 1ST OPERAND ;AND GET SECOND OPERAND POLSND: MOVE PV,4(RC) ;GET RELOCATION JUMPL PV,POLSNR ;THIS IS A POINTER TDNE PV,[-2,,-2] ;IS IT EXTERNAL? JRST POLSN2 ;YES MOVE CV,5(RC) ;GET VALUE POLSN4: TLNN PV,-1 ;CHECK FOR LEFT HALF VALUE TLNE CV,-1 JRST POLSN1 ;YES, NEED FULL WORD HRL CV,PV ;XWD RELOC ,, VALUE SETZ PV, ;OPERAND IS 0 FOR 18 BIT VALUE PUSHJ PP,POLSTR MOVE PV,CV JRST POLSTR ;STORE AND EXIT POLSNN: HRROI PV,14 ;TWO'S COMPLIMENT NEGATIVE PUSHJ PP,POLSTR ;STORE OPERATOR MOVN PV,4(RC) ;GET RELOCATION TDNE PV,[-2,,-2] ;CHECK FOR EXTERN JRST POLSN2 ;IT IS, CONVERT TO RADIX-50 MOVN CV,5(RC) ;GET VALUE JRST POLSN4 ;AND STORE IT POLSN1: MOVEI PV,1 ;OPERAND IS 1 FOR 36 BIT VALUE PUSHJ PP,POLSTR MOVE PV,4(RC) ;RELOCATION PUSHJ PP,POLSTR MOVE PV,CV ;VALUE ; JRST POLSTR POLSTR: AOS SDEL,FREE ;GET A FREE WORD CAML SDEL,SYMBOL ;ENOUGH? PUSHJ PP,XCEED ;NO MOVEM PV,-1(SDEL) ;STORE ONE WORD POPJ PP, ;TABLE OF CORRESPONDENCE BETWEEN MACRO-10 OPERATORS AND BLOCK 11 OPERATORS POLTBL: ;POLISH VALUE MACRO-10 OPERATOR 5 ;1 MULTIPLY 6 ;2 DIVIDE 3 ;3 ADD 4 ;4 SUBTRACT 11 ;5 LEFT SHIFT 10 ;6 LOGICAL IOR 7 ;7 LOGICAL AND 12 ;10 LOGICAL XOR 13 ;11 NOT 14 ;12 NEGATE 15 ;13 ADDITIVE PSECT OPERATION >;END OF IFN POLISH SUBTTL LITERAL STORAGE HANDLER STOLER: IFE FORMSW,< SETZB AC0,RC ;ERROR, NO CODE STORED PUSHJ PP,STOW ;STOW ZERO> IFN FORMSW,< MOVEI AC0,0 PUSHJ PP,STOWZ1> TRO ER,ERRL ;AND FLAG THE ERROR STOLIT: MOVE SDEL,STPX SUB SDEL,STPY ;COMPUTE NUMBER OF WORDS JUMPE SDEL,STOLER ;ERROR IF NONE STORED MOVE SX,LITERR ;[415]GET TOTAL ERRORS FOR LEVEL TRNN FR,ERRQSW ;[415]IGNORING Q ERRORS? TRZ SX,ERRQ ;[415]YES,SO TURN IT OFF TRNN SX,ERRORS ;[415]DOES LITERAL HAVE ERROR? JRST STOL06 ;NO ;**;[441] INSERT 2L,CHANGE COMMENT @STOLIT+8 JBC 21-SEP-76 TRNE SX,ERRU ;[441] YES,NO SEARCH IF UNDF SYMBOL ON JRST STOL22 ;[441] PASS1, BRANCH JUMP2 STOL22 ;[441] BRANCH IF PASS2 ADDM SDEL,LITCNT ;PASS ONE, UPDATE COUNT JRST STOWI ;INITIALIZE STOW STOL06: MOVEI SX,LITAB ;PREPARE FOR SEARCH MOVE ARG,STPX ;SAVE IN THE EVENT OF MULTIPLE-WORD HRL ARG,STPY MOVE AC2,LITNUM MOVEI SDEL,0 STOL08: PUSHJ PP,DSTOW ;GET VALUE WFW STOL10: SOJL AC2,STOL24 ;TEST FOR END MOVE SX,0(SX) ;NO, GET NEXT STORAGE CELL MOVE V,-1(SX) ;GET RELOCATION BITS WFW CAMN AC0,-2(SX) ;DO CODES COMPARE? WFW CAME RC,V ;YES, HOW ABOUT RELOCATION? AOJA SDEL,STOL10 ;NO, TRY AGAIN SKIPGE STPX ;YES, MULTI-WORD? JRST STOL13 ;NO, JUST RETURN LOCATION MOVEM AC2,SAVBLK+AC2 ;YES, SAVE STARTING INFO MOVEM SX,SAVBLK+SX STOL12: SOJL AC2,STOL23 ;TEST FOR END PUSHJ PP,DSTOW ;GET NEXT WORD WFW MOVE SX,0(SX) ;UPDATE POINTER MOVE V,-1(SX) ;GET RELOCATION WFW CAMN AC0,-2(SX) ;COMPARE VALUE WFW CAME RC,V ;AND RELOCATION JRST STOL14 ;NO MATCH, TRY AGAIN SKIPL STPX ;MATCH, HAVE WE FINISHED SEARCH? JRST STOL12 ;NO, TRY NEXT WORD STOL13: ;YES, RETURN LOCATION IFN POLISH,< SETZM POLITS ;CLEAR ANY POLISH PENDING > JRST STOL26 STOL14: MOVE AC2,SAVBLK+AC2 ;RESTORE STOW POINTERS MOVE SX,SAVBLK+SX HRREM ARG,STPX HLREM ARG,STPY AOJA SDEL,STOL08 ;BETTER LUCK NEXT TIME STOL22: MOVE SDEL,LITNUM STOL23: PUSHJ PP,DSTOW ;DSTOW AND CONVERT STOL24: MOVE SX,LITABX ;GET CURRENT STORAGE PUSHJ PP,GETTOP ;GET NEXT CELL MOVEM AC0,-2(SX) ;STORE CODE WFW MOVEM RC,-1(SX) ;WFW IFN FORMSW,< MOVE AC0,FORM MOVEM AC0,-3(SX)> MOVEM SX,LITABX ;SET POINTER TO CURRENT CELL AOS LITNUM ;INCREMENT NUMBER STORED AOS LITCNT ;INCREMENT NUMBER RESERVED SKIPL STPX ;ANY MORE CODE? JRST STOL23 ;YES STOL26: JUMP1 POPOUT ;EXIT IF PASS ONE MOVE SX,LITHDX ;GET HEADER BLOCK HLRZ RC,-1(SX) ;GET BLOCK RELOCATION HRRZ AC0,-1(SX) ADDI AC0,0(SDEL) ;COMPUTE ACTUAL LOCATION POPJ PP, ;EXIT SUBTTL INPUT ROUTINES GETCHR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER CAIL C,"A"+40 ;CHECK FOR LOWER CASE CAILE C,"Z"+40 JRST .+2 ;NOT LOWER CASE IFN STANSW,< SUBI C,40 CAIN C,32 MOVEI C,136 ;^ CAIN C,30 MOVEI C,137 ;_ CAIN C,176 MOVEI C,134 ;~ CAIN C,140 MOVEI C,100 ;@> IFE STANSW,< TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT> SUBI C,40 ;CONVERT TO SIXBIT CAIG C,77 ;CHAR GREATER THAN SIXBIT? JUMPGE C,GETCS ;TEST FOR VALID SIXBIT ADDI C,40 ;BACK TO ASCII CAIN C,HT ;CHECK FOR TAB JRST GETCS2 ;MAKE IT LOOK LIKE SPACE CAIG C,CR ;GREATER THAN CR CAIG C,HT ;GREATER THAN TAB JRST GETCS1 ;IS NOT FF,VT,LF OR CR MOVEI C,EOL ;LINE OR FORM FEED OR V TAB TLOA IO,IORPTC ;REPEAT CHARACTER GETCS2: MOVEI C,0 ;BUT TREAT AS BLANK GETCS: MOVE CS,CSTAT(C) ;GET STATUS BITS POPJ PP, ;EXIT GETCS1: JUMPE C,GETCS ;IGNORE NULS TRC C,100 ;MAKE CHAR. VISIBLE MOVEI CS,"^" DPB CS,LBUFP ;PUT ^ IN OUTPUT PUSHJ PP,RSW2 ;ALSO MODIFIED CHAR. TRO ER,ERRQ ;FLAG Q ERROR JRST GETCHR ;BUT IGNORE CHAR. CHARAC: TLZE IO,IORPTC ;REPEAT REQUESTED? JRST CHARAX ;YES RSW0: JUMPN MRP,MREAD ;BRANCH IF TREE POINTER SET PUSHJ PP,READ RSW1: SKIPE RPOLVL ;ARE WE IN "REPEAT ONCE"? JRST REPO1 ;YES RSW2: CAIN C,LF ;LF? JRST RSW4 ;YES, SEE IF LAST CHAR WAS A CR MOVEM C,LIMBO ;STORE THIS CHAR. FOR RPTC RSW3: TLNE IO,IOSALL ;MACRO SUPPRESS ALL? JUMPN MRP,CPOPJ ;YES,DON'T LIST IN MACRO SOSG CPL ;ANY ROOM IN THE IMAGE BUFFER? PUSHJ PP,RSW5 ;[254] NO, BUT SEE IF ANY EXCESS WE CAN USE IDPB C,LBUFP ;YES, STORE IN PRINT AREA CAIE C,HT ;TAB? POPJ PP, ;NO, EXIT MOVEI CS,7 ;TAB COUNT MASK ANDCAM CS,CPL ;MASK TO TAB STOP POPJ PP, RSW4: MOVE CS,LIMBO ;GET LAST CHAR. MOVEM C,LIMBO ;STORE THIS CHAR. FOR RPTC CAIE CS,CR ;LAST CHAR. A CR? JRST RSW3 ;NO HRROS LIMBO ;YES,FLAG POPJ PP, ;AND EXIT RSW5: PUSH PP,C ;[254] NEED AN ACC MOVNI C,.CPLX ;[254] GET EXCESS SPACE CAMGE C,CPL ;[254] ANY ROOM? JRST [POP PP,C ;[254] YES POPJ PP,] ;[254] JUST RETURN POP PP,C ;[254] NO JRST OUTPL ;[254] OUTPUT THE PARTIAL LINE CHARAX: HRRZ C,LIMBO ;GET LAST CHARACTER POPJ PP, ;EXIT CHARL: PUSHJ PP,CHARAC ;GET AND TEST 7-BIT ASCII CAIG C,FF ;LINE OR FORM FEED OR VT? CAIGE C,LF POPJ PP, ;NO,EXIT SKIPE LITLVL ;IN LITERAL? JRST OUTIML ;YES CHARL1: PUSHJ PP,SAVEXS ;SAVE REGISTERS PUSHJ PP,OUTLIN ;DUMP THE LINE JRST RSTRXS ;RESTORE REGISTERS AND EXIT ;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT) ;UNTIL A LINE TERMINATOR IS SEEN. STOUTS: TLOA IO,IOENDL!IORPTC STOUT: TLO IO,IORPTC BYPASS CAIE C,EOL ;MOST LIKELY A ; OR EOL CH JRST STOUT2 ;IT WASN'T, SEE WHY! HRRZ C,LIMBO ;GET CHARACTER INCASE EOL TLZN IO,IORPTC ;IT WAS , SKIP NEXT GET STOUT1: PUSHJ PP,RSW0 CAIN C,CR ;NEED SPECIAL TEST FOR CR JRST STOUT3 ;INCASE NOT FOLLOWED BY LF CAIG C,FF CAIGE C,LF JRST STOUT1 JRST OUTLIN ;OUTPUT THE LINE (BIN AND LST) STOUT2: CAIN C,14 ;COMMA? SKIPL STPX ;YES, ERROR IF CODE STORED TRO ER,ERRQ JRST STOUT1 ;PASS OUT TIL END OF LINE STOUT3: PUSHJ PP,RSW0 ;GET NEXT CHAR. CAIG C,FF ;GENUINE EOL CHARACTER? CAIGE C,LF TLOA IO,IORPTC ;NO, SO REPEAT IT JRST OUTLIN ;AND DUMP LINE IN ANY CASE REPEAT 0,< ;[252] DON'T FLAG IT TRO ER,ERRQ ;[144] FLAG EXTRA WITH "Q" ERROR > SETZ C, DPB C,LBUFP ;CLEAR LOOK-AHEAD CHAR OUT OF BUFFER PUSHJ PP,OUTLIN ;DUMP UPTO CR AS LINE HRRZ C,LIMBO ;GET C BACK JRST RSW3 ;AND PUT CHAR IN NEW BUFFER SUBTTL CHARACTER STATUS TABLE DEFINE GENCS (OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO) ;OPLVL PRIORITY OF BINARY OPERATORS ;ATOM INDEX TO JUMP TABLE AT CELL1 ;AN TYPE OF CHARACTER ; 1=OTHER, 2=ALPHA, 4=NUMERIC ;SQUOZ VALUE IN RADIX 50 ;OPTYPE INDEX TO JUMP TABLE AT EVXCT ;SEQNO VALUE IN SIXBIT CSTAT: GENCS 00,00,1,00,00,00 ; ' ' GENCS 04,12,1,00,06,01 ; '!' GENCS 00,07,1,00,00,02 ; '"' GENCS 00,12,1,00,00,03 ; '#' GENCS 00,01,2,46,00,04 ; '$' GENCS 00,01,2,47,00,05 ; '%' GENCS 04,12,1,00,07,06 ; '&' GENCS 00,07,1,00,00,07 ; ''' GENCS 00,01,1,00,00,10 ; '(' GENCS 00,01,1,00,00,11 ; ')' GENCS 02,12,1,00,01,12 ; '*' GENCS 01,00,1,00,03,13 ; '+' GENCS 40,01,1,00,00,14 ; ',' GENCS 01,02,1,00,04,15 ; '-' GENCS 00,11,2,45,00,16 ; '.' GENCS 02,12,1,00,02,17 ; '/' GENCS 00,04,4,01,00,20 ; '0' GENCS 00,04,4,02,00,21 ; '1' GENCS 00,04,4,03,00,22 ; '2' GENCS 00,04,4,04,00,23 ; '3' GENCS 00,04,4,05,00,24 ; '4' GENCS 00,04,4,06,00,25 ; '5' GENCS 00,04,4,07,00,26 ; '6' GENCS 00,04,4,10,00,27 ; '7' GENCS 00,04,4,11,00,30 ; '8' GENCS 00,04,4,12,00,31 ; '9' GENCS 00,12,1,00,00,32 ; ':' GENCS 00,01,1,00,00,33 ; ';' GENCS 00,05,1,00,00,34 ; '<' GENCS 00,12,1,00,00,35 ; '=' GENCS 00,01,1,00,00,36 ; '>' GENCS 00,12,1,00,00,37 ; '?' GENCS 00,03,1,00,00,40 ; '@' GENCS 00,01,2,13,00,41 ; 'A' GENCS 00,01,2,14,00,42 ; 'B' GENCS 00,01,2,15,00,43 ; 'C' GENCS 00,01,2,16,00,44 ; 'D' GENCS 00,01,2,17,00,45 ; 'E' GENCS 00,01,2,20,00,46 ; 'F' GENCS 00,01,2,21,00,47 ; 'G' GENCS 00,01,2,22,00,50 ; 'H' GENCS 00,01,2,23,00,51 ; 'I' GENCS 00,01,2,24,00,52 ; 'J' GENCS 00,01,2,25,00,53 ; 'K' GENCS 00,01,2,26,00,54 ; 'L' GENCS 00,01,2,27,00,55 ; 'M' GENCS 00,01,2,30,00,56 ; 'N' GENCS 00,01,2,31,00,57 ; 'O' GENCS 00,01,2,32,00,60 ; 'P' GENCS 00,01,2,33,00,61 ; 'Q' GENCS 00,01,2,34,00,62 ; 'R' GENCS 00,01,2,35,00,63 ; 'S' GENCS 00,01,2,36,00,64 ; 'T' GENCS 00,01,2,37,00,65 ; 'U' GENCS 00,01,2,40,00,66 ; 'V' GENCS 00,01,2,41,00,67 ; 'W' GENCS 00,01,2,42,00,70 ; 'X' GENCS 00,01,2,43,00,71 ; 'Y' GENCS 00,01,2,44,00,72 ; 'Z' GENCS 00,06,1,00,00,73 ; '[' GENCS 00,12,1,00,00,74 ; '\' GENCS 00,01,1,00,00,75 ; ']' GENCS 00,10,1,00,00,76 ; '^' GENCS 10,12,1,00,05,77 ; '_' CSTATX: GENCS 04,12,1,00,10,01 ;[123] '^!' CSTATN: GENCS 04,12,1,00,11,15 ;[123][416] '^-' IFN POLISH,< CSTATP: GENCS 11,12,1,00,13,13 ;ADDITIVE PSECT OPERATION > SUBTTL LISTING ROUTINES OUTLIN: TRNN ER,ERRORS-ERRQ ;ANY ERRORS? TLNE FR,ERRQSW ;NO, IGNORE Q ERRORS? TRZ ER,ERRQ ;YES, YES, ZERO THE Q ERROR HRLZ AC0,ER ;PUT ERROR FLAGS IN AC0 LEFT TDZ ER,TYPERR JUMP1 OUTL30 ;BRANCH IF PASS ONE JUMPN AC0,OUTL02 ;JUMP IF ANY ERRORS TO FORCE PRINTING SKIPL STPX ;SKIP IF NO CODE, OTHERWISE JRST OUTL01 ;NO TLNN IO,IOSALL ;YES,SUPPRESS ALL? JRST OUTL03 ;NO JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO LDB C,[XWD 350700,LBUF] CAIE C,15 ;FIRST CHAR CR? OUTL01: TLZ IO,IOMAC ;FORCE MACRO PRINTING OUTL03: TLNN IO,IOMSTR!IOPROG!IOMAC OUTL02: IOR ER,OUTSW ;FORCE IT. IDPB AC0,LBUFP ;STORE ZERO TERMINATOR AFTER ASCII SRC LINE TSO ER,AC0 ;[411]RE-FLAG THE ERRORS FOR %....X TLNN FR,CREFSW ;CREF? PUSHJ PP,CLSCRF ;YES, WRITE END OF CREF DATA (177,003) MOVE C,TYPERR ;[411]NOW RESTORE FLAGS AS ANDI C,ERRORS ;[411]THEY WERE SO TTY LISTING IS TDZ ER,C ;[411]WHAT THEY ASKED FOR JUMPE AC0,OUTL20 ;BRANCH IF NO ERRORS TLZE AC0,ERRM ;M ERROR? TLO AC0,ERRP ;M ERROR SET - SET P ERROR. PUSHJ PP,OUTLER ;PROCESS ERRORS OUTL20: SKIPN C,ASGBLK ;[263] SKIPE CS,LOCBLK ; SKIPL STPX ;ANY BINARY? JRST OUTL23 ;YES, JUMP JUMPE C,OUTL22 ;[263] SEQUENCE BREAK AND NO BINARY JUMPS ILDB C,TABP ;ASSIGNMENT FALLS THROUGH PUSHJ PP,OUTL ;OUTPUT A TAB. ILDB C,TABP ;OUTPUT 2ND TAB, LOCATION FIELD PUSHJ PP,OUTC ;NEXT IS BINARY LISTING FIELD HLLO CS,LOCBLK ;LEFT HALF OF A 36BIT VALUE SKIPL ASGBLK ;[263] SKIP IF LEFT HALF IS NOT RELOC TRZA CS,1 ;IT IS, SET THE FLAG TLNE CS,-1 ;SKIP IF ITS A 18BIT VALUE, OTHERWISE PUSHJ PP,ONC1 ;PRINT LH OF A 36 BIT VALUE IN CS HRLO CS,LOCBLK ;PICK UP THE RIGHT HALF (18BIT VALUE) MOVE C,ASGBLK ;[263] GET RIGHT HALF RELOCATION TRZ CS,0(C) ;[263] PUSHJ PP,ONC ;PRINT IT JRST OUTL23 ;SKIP SINGLE QUOTE TEST OUTL22: PUSHJ PP,ONC ;TAB TO RH AND PRINT IT MOVEI C,"'" SKIPE MODA PUSHJ PP,OUTC OUTL23: SKIPL STPX ;ANY BINARY? PUSHJ PP,BOUT ;YES, DUMP IT MOVE CS,@OUTLI2 ;[POINT 7,LBUF] OUTL24: ILDB C,CS CAILE C," " ;[157] JRST OUTL28 ;[157] FOUND A PRINTING CHARACTER JUMPN C,OUTL24 ;[157] TRY AGAIN UNLESS TERMINAL 0 SKIPN SEQNO ;[157] SEQUENCE NO. ARE WORTH PRINTING JRST OUTL25 ;[157] BUT JUST TABS AREN'T OUTL28: MOVE CS,TABP PUSHJ PP,OUTASC ;OUTPUT TABS & SEQ. NO. OUTL25: MOVEI CS,LBUF PUSHJ PP,OUTAS0 ;DUMP THE LINE TLNE IO,IOSALL ;SUPPRESSING ALL JUMPN MRP,OUTL27 ;YES,EXTRA CR IF IN MACRO OUTL26: SKIPGE STPX ;ANY BINARY? JRST OUTLI ;NO, CLEAN UP AND EXIT PUSHJ PP,OUTLI2 ;YES, INITIALIZE FOR NEXT LINE TLNN FR,CREFSW ;[130] CREF REQUESTED? TLNE IO,IOPROG ;[130] YES, THEN IS XLIST ON? JRST .+2 ;[130] CREF NOT BEING PRINTED PUSHJ PP,CLSCRF ;[130] CLOSE OUT THIS CREF LINE PUSHJ PP,BOUT ;YES, DUMP IT OUTL27: PUSHJ PP,OUTCR ;OUTPUT CARRIAGE RETURN JRST OUTL26 ;TEST FOR MORE BINARY OUTPL: SKIPN LITLVL ;IF IN LITERAL SKIPL STPX ;OR CODE GENERATED JRST OUTIM ;JUST OUTPUT THE IMAGE SKIPE ASGBLK ;[205] JRST OUTPL1 ;[205] JUMP IF AN ASSIGNMENT SKIPE LOCBLK ;[205] OR A BLOCK RESERVATION SKIPE MACENL ;[205] STILL IN "CALLM"? JRST OUTIM ;[205] OTHERWISE OUTPUT IMAGE JUMPN MRP,OUTIM ;[205] ALSO IF IN A MACRO OUTPL1: PUSHJ PP,SAVEXS ;[242] SAVE AC0 AND C MOVEI C,CR IDPB C,LBUFP MOVEI C,LF IDPB C,LBUFP ;FINISH WITH CRLF PUSHJ PP,OUTLIN ;OUTPUT PARTIAL LINE PUSHJ PP,RSTRXS ;[242] RESTORE ACS JRST OUTLI2 ;INITIALISE REST OF LINE OUTL30: AOS CS,STPX ;PASS ONE CAIN C,FF ;FORM FEED? PUSHJ PP,OUTFF2 ;YES, COUNT PAGES FOR PASS1 ERROR ADDM CS,LOCO ;INCREMENT OUTPUT LOCATION PUSHJ PP,STOWI ;INITIALIZE STOW TLZ AC0,ERRORS-ERROR1 ;[125] JUMPN AC0,OUTL32 ;JUMP IF ERRORS TLNE IO,IOSALL ;SUPPRESSING ALL JUMPN MRP,CPOPJ ;YES,EXIT JRST OUTLI1 ;NO,INIT LINE OUTL32: IDPB AC0,LBUFP ;ZERO TERNIMATOR IOR ER,OUTSW ;LIST ERRORS MOVE CS,TAG PUSHJ PP,OUTSY1 MOVEI CS,[SIXBIT / +@/] PUSHJ PP,OUTSIX ;OUTPUT TAG HRRZ C,TAGINC PUSHJ PP,DNC ;CONVERT INCREMENT TO DECIMAL PUSHJ PP,OUTTAB ;OUTPUT TAB PUSHJ PP,OUTLER ;OUTPUT ERROR FLAGS PUSHJ PP,OUTTAB MOVEI CS,SEQNO ;ADDRESS OF SEQUENCE NO. SKIPE SEQNO ;FILE NOT SEQUENCED PUSHJ PP,OUTAS0 ;OUTPUT IT JRST OUTL25 ;OUTPUT BASIC LINE OUTLER: SETZM LITERR ;[415]CLEAR ACCUMULATED LITERAL ERRORS PUSH PP,ER ;SAVE LISTING SWITCHES FOR LATER TRNE ER,TTYSW ;IF THIS IS ON, LISTING IS ON TTY TRZ ER,ERRORS ;SO SUPPRESS ON TTY TDZ ER,OUTSW ;BUT THIS SHOULD ONLY GO TO THE TTY MOVE CS,INDIR ;GET FILE NAME CAME CS,LSTFIL ;AND SEE IF SAME JRST [MOVEM CS,LSTFIL ;SAVE AS LAST ONE MOVEI CS,LSTFIL PUSHJ PP,OUTSIX ;LIST NAME MOVEI C," " PUSHJ PP,OUTL MOVE CS,PAGENO ;PRINT PAGE NUMBER TOO JRST OUTLE8] MOVE CS,PAGENO ;NOW CHECK PAGE NUMBER CAME CS,LSTPGN OUTLE8: JRST [MOVEM CS,LSTPGN MOVEI CS,[ASCIZ /PAGE /] PUSHJ PP,OUTAS0 MOVE C,PAGENO PUSHJ PP,DNC PUSHJ PP,OUTCR ;AND NOW FOR THE ERROR LINE JRST .+1] HLLM ER,(PP) ;RESTORE ER BUT NOT IO (LEFT HALF OF AC) POP PP,ER MOVE CS,[POINT 7,[ASCII / QXADLRUVNOPEMS/]] OUTLE2: ILDB C,CS ;GET ERROR MNEMONIC JUMPGE AC0,OUTLE4 ;BRANCH IF NOT FLAGGED CAIN C,"Q" ;"Q" ERROR? AOSA QERRS ;YES, JUST COUNT AS WARNING AOS ERRCNT ;INCREMENT ERROR COUNT PUSHJ PP,OUTL ;OUTPUT THE CHARACTER OUTLE4: LSH AC0,1 ;SHIFT NEXT FLAG INTO SIGN BIT JUMPN AC0,OUTLE2 ;TEST FOR END POPJ PP, ;EXIT OUTIM1: TLOA FR,IOSCR ;SUPPRESS CRLF AFTER LINE OUTIM: TLZ FR,IOSCR ;DON'T FOR PARTIAL LINE TLNE IO,IOSALL ;SUPPRESSING ALL? JUMPN MRP,CPOPJ ;YES ,EXIT IF IN MACRO JUMP1 OUTLI1 ;BYPASS IF PASS ONE PUSH PP,ER TDZ ER,TYPERR TLNN IO,IOMSTR!IOPROG!IOMAC IOR ER,OUTSW PUSH PP,C ;OUTPUT IMAGE TLNN FR,CREFSW PUSHJ PP,CLSCRF OUTIM2: MOVE CS,TABP PUSHJ PP,OUTASC ;OUTPUT TABS IDPB C,LBUFP ;STORE ZERO TERMINATOR MOVEI CS,LBUF PUSHJ PP,OUTAS0 ;OUTPUT THE IMAGE TLZN FR,IOSCR ;CRLF SUPPRESS? PUSHJ PP,OUTCR ;NO,OUTPUT POP PP,C HLLM ER,0(PP) POP PP,ER JRST OUTLI2 OUTLI: TLNE IO,IOSALL ;SUPPRESSING ALL JUMPN MRP,OUTLI3 ;YES,SET FLAG IN REPEATS ALSO TLNE IO,IOPALL ;MACRO EXPANSION SUPRESS REQUESTED? SKIPN MACLVL ;YES, ARE WE IN MACRO? TLZA IO,IOMAC ;NO, CLEAR MAC FLAG OUTLI3: TLO IO,IOMAC ;YES, SET FLAG OUTLI1: TRZ ER,ERRORS!LPTSW!TTYSW OUTLI2: MOVE CS,[POINT 7,LBUF] ;INITIALIZE BUFFERS MOVEM CS,LBUFP IFN FORMSW, MOVE CS,[POINT 7,TABI,6] MOVEM CS,TABP MOVEI CS,.CPL IFN FORMSW, SKIPE SEQNO ;[153] A SEQUENCED FILE? SUBI CS,8 ;[153] YES, SEQ NO TAKES UP SPACE MOVEM CS,CPL MOVSI CS,(ASCII / /) SKIPE SEQNO ;HAVE WE SEQUENCE NUMBERS? MOVEM CS,SEQNO ;YES, STORE TAB IN CASE OF MACRO MOVEM CS,SEQNO+1 ;STORE TAB AND TERMINATOR SETZM ASGBLK SETZM LOCBLK POPJ PP, OUTIML: TLNE IO,IOSALL ;SUPPRESSING ALL? JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO TRNN ER,ERRORS-ERRQ ;FOR LITERALS (MULIT-LINE) OUTPUT ERRORS TLNE FR,ERRQSW TRZ ER,ERRQ HRLZ CS,ER JUMP1 OUTML1 ;CHECK PASS1 ERRORS TDZ ER,TYPERR JUMPE CS,OUTIM1 PUSH PP,[0] ;ERRORS SHOULD BE ZEROED PUSH PP,C PUSH PP,AC0 ;SAVE AC0 IN CASE CALLED FROM ASCII MOVE AC0,CS ;ERROR ROUTINE WANTS FLAGS IN AC0 IOR ER,OUTSW TLNN FR,CREFSW PUSHJ PP,CLSCRF ;FIX CREF TLZE AC0,ERRM TLO AC0,ERRP PUSHJ PP,OUTLER ;OUTPUT THEM POP PP,AC0 JRST OUTIM2 ;AND LINE OUTML1: TLZ CS,ERRORS-ERROR1-ERRL ;[250] ANY ERRORS TO PRINT ON PASS1? JUMPE CS,[TRZ ER,ERRORS!LPTSW!TTYSW-ERRN ;[250] NONE JRST OUTLI2] ;[250] BUT "N" IS FOR MULTI-LINE LITS TRZ ER,ERRORS!LPTSW!TTYSW ;[250] TRO ER,ERRL PUSH PP,ER ;SAVE PUSH PP,C ;SAVE THIS PUSH PP,AC0 ;AS ABOVE MOVE AC0,CS ;... TDZ ER,TYPERR IOR ER,OUTSW MOVE CS,TAG PUSHJ PP,OUTSY1 MOVEI CS,[SIXBIT / +@/] PUSHJ PP,OUTSIX SKIPN LBLFLG ;[402] HAS A LABEL OCCURRED IN THIS LITERAL? JRST [HRRZ C,TAGINC ;[402] NO, GET NORMAL INC JRST OUTML2] ;[402] MOVE C,STPX ;[402] GET CURRENT DEPTH SUB C,LTGINC ;[402] SUBTRACT DEPTH OF LABEL OUTML2: PUSHJ PP,DNC ;[402] PUSHJ PP,OUTTAB PUSHJ PP,OUTLER ;DO NOT FORGET ERRORS PUSHJ PP,OUTTAB SETZ AC0, ;[253] SET A ZERO TERMINATOR IDPB AC0,LBUFP ;[253] IN THE OUTPUT BUFFER MOVEI CS,LBUF ;PRINT REST OF LINE PUSHJ PP,SOUT20 POP PP,AC0 POP PP,C POP PP,ER JRST OUTLI2 SUBTTL OUTPUT ROUTINES UOUT: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN TRNN ARG,PNTF ;WFW TRNN ARG,UNDF JRST UOUT13 ;TEST FOR UNDF!EXTF!PNTF ON PASS2 JUMP2 UOUT10 TLNN IO,IOIOPF ;ANY IOP'S SEEN JRST UOUT12 ;NO,MAKE EXTERNAL MOVSI CS,PRMTBL-PRMEND;YES LOOKUP IN TABLE UOUT1: CAME AC0,PRMTBL(CS) ;HAVE WE A MATCH? AOBJN CS,UOUT2 ;NO,INCREMENT AND JUMP MOVE ARG,PRMTBL+1(CS);YES,GET VALUE MOVEM ARG,(SX) ;UPDATE SYMBOL TABLE POPJ PP, ;EXIT UOUT2: AOBJN CS,UOUT1 ;TEST FOR END UOUT12: TRNE ARG,ENTF ;[340] SEE IF FORWARD DEFINED POPJ PP, ;[340] YES, THEN DON'T EXTERNAL IT PUSHJ PP,EXTER2 ;MAKE IT EXTERNAL MOVSI ARG,UNDF ;BUT PUT UNDF BACK ON IORM ARG,(SX) ;SO MESSAGE WILL COME OUT POPJ PP, ;GET NEXT SYMBOL UOUT13: JUMP1 CPOPJ ;RECYCLE ON PASS1 TRC ARG,UNDF!EXTF!PNTF ;CHECK FOR ALL THREE ON TRCE ARG,UNDF!EXTF!PNTF ;ARE THEY? POPJ PP, ;NO, RECYCLE UOUT10: PUSHJ PP,OUTSYM ;OUTPUT THE SYMBOL MOVEI CS,[SIXBIT /UNASSIGNED, DEFINED AS IF EXTERNAL @/] PUSHJ PP,OUTSIX ;[360] JRST OUTCR ;[360] POPJ FOR NEXT SYMBOL ;OUTPUT THE ENTRIES EOUT: MOVEI C,0 ;INITIALIZE THE COUNT MOVE SX,SYMBOL MOVE SDEL,0(SX) EOUT1: SOJL SDEL,EOUT2 ;TEST FOR END ADDI SX,2 HLRZ ARG,0(SX) ANDCAI ARG,SYMF!INTF!ENTF JUMPN ARG,EOUT1 ;IF INVALID, DON'T COUNT AOJA C,EOUT1 ;BUMP COUNT EOUT2: HRLI C,4 ;BLOCK TYPE 4 PUSHJ PP,OUTBIN SETZB C,ARG PUSHJ PP,OUTBIN MOVE SX,SYMBOL MOVE SDEL,0(SX) MOVEI V,^D18 EOUT3: SOJL SDEL,POPOUT ADDI SX,2 HLRZ C,0(SX) ANDCAI C,SYMF!INTF!ENTF JUMPN C,EOUT3 SOJGE V,EOUT4 ;TEST END OF BLOCK PUSHJ PP,OUTBIN MOVEI V,^D17 ;WFW EOUT4: MOVE AC0,-1(SX) PUSHJ PP,SQOZE MOVE C,AC0 PUSHJ PP,OUTBIN JRST EOUT3 LSOUT: SKIPN C,LOCAL ;ANY LOCAL FIXUPS REQUIRED? POPJ PP, ;NO MOVS AC0,(C) ;GET VALUE RIGHT WAY ROUND MOVS RC,1(C) ;AND RELOCATION HLRZM RC,LOCAL ;STORE NEXT POINTER PUSHJ PP,COUT ;OUTPUT THIS WORD JRST LSOUT ;LOOK FOR MORE ;OUTPUT THE SYMBOLS SOUT: SKIPN IONSYM ;SKIP IF NOSYM SEEN TRNN ER,LPTSW!TTYSW ;A LISTING REQUIRED? JRST SOUT2 ;NO MOVEI [ASCIZ /SYMBOL TABLE/] HRRM SUBTTX ;SET NEW SUB-TITLE MOVEI ARG,NCOLS ;SET UP FOR NCOLS ACROSS SYMBOL TABLE TRNE ER,TTYSW ;IS TTY LISTING DEVICE? MOVEI ARG,2 ;YES,ONLY 2 COLLUMNS MOVEM ARG,NCOLLS ;STORE ANSWER IFE POLISH,< MOVE SX,SYMBOL ;START OF TABLE MOVE SDEL,(SX) ;COUNT OF SYMBOLS > IFN POLISH,< MOVE SX,SGSBOT ;START OF TABLE MOVE SDEL,SGNCUR ;CUR PSECT INX JUMPE SDEL,SOUTBS ;IS THIS THE BLANK PSECT? MOVE ARG,[XWD SGTTLB,SGLIST] BLT ARG,SGTTLE-SGTTLB+SGLIST-1 ;MOVE SUBTTL MOVE AC1,SGTTLE ;'TO' POINTER MOVE AC2,SGTTLF ;'FROM' POINTER SGTTLL: ILDB AC0,AC2 ;GET A SIXBIT CHAR ADDI AC0,40 ;FORM ASCII IDPB AC0,AC1 ;PUT IN SUBTTL TLNE AC2,770000 ;DONE SIX CHARS? JRST SGTTLL ;NOT DONE YET SETZ AC0, ;TERMINATE SUBTTL IDPB AC0,AC1 ; WITH NULL BYTE MOVEI AC0,SGLIST ;POINTER TO HRRM AC0,SUBTTX ; NEW SUBTTL SOUTBS: HRRZ SDEL,SGSCNT(SDEL) ;COUNT OF SYMBOLS > ADDI SX,2 ;SKIP COUNT MOVEM SX,SXSV ;SAVE PLACE MOVEM SDEL,SDELSV MOVE SX,SPAGNO ;GET LAST SYMBOL PAGE NUMBER EXCH SX,PAGENO ;SWAP WITH OUTPUT PAGE NUMBER MOVEM SX,SPAGNO ;AND STORE IT MOVE SX,[BYTE (7) 0,0,<"S">,<"-">,0] IORM SX,DBUF+4 ;FIXUP TITLE SOUT0: PUSHJ PP,SOUTP ;GET PAGE SET UP JRST SOUT1 ;NOTHING TO OUTPUT PUSHJ PP,SOUTF ;DUMP ONE PAGE JRST SOUT1 ;DIDN'T FILL PAGE-DONE JRST SOUT0 IFN POLISH,< SGTTLB: ASCII /SYMBOL TABLE FOR PSECT / SGTTLE: POINT 7,SGTTLE-SGTTLB+SGLIST SGTTLF: POINT 6,SGNAME(SDEL) > SOUTT: MOVE ARG,(SX) ;GET FLAGS TLNE ARG,SUPRBT ;SURPRESSED? POPJ PP, ;YES TLNN ARG,SYMF ;SYMBOL IS OK TLNN ARG,SYNF!MACF ;BUT MACRO OR SYNONYM AREN'T AOS (PP) POPJ PP, SOUTP: MOVE AC1,NCOLLS ;GET COLUMN COUNT MOVE SX,SXSV ;GET POSITION MOVE SDEL,SDELSV ;AND COUNT SOUTP0: MOVEM SX,SYMBLK(AC1) HRLM SDEL,SYMBLK(AC1) ;SAVE IN TABLE MOVE AC0,..LPP ;[227] LINE COUNT SOUTP1: JUMPE SDEL,SOUTP2 ;IF NONE LEFT, GO ELSEWHERE PUSHJ PP,SOUTT ;SYMBOL OK? TDZA RC,RC ;NO SETO RC, ;YES ADDI SX,2 ;SET UP FOR NEXT NOW SUBI SDEL,1 JUMPGE RC,SOUTP1 ;SKIP SYMBOL SOJG AC0,SOUTP1 ;COUNT IN SYMBOL SOJG AC1,SOUTP0 ;START NEXT COLUMN MOVEM SX,SXSV ;SAVE POSITION MOVEM SDEL,SDELSV AOS (PP) POPJ PP, SOUTP2: CLEARM SDELSV ;FLAG DONE CAME AC1,NCOLLS ;IF ON 1ST COLUMN JRST .+3 CAMN AC0,..LPP ;[227] AND FIRST LINE POPJ PP, ;THEN SKIP PRINTING SOJLE AC1,CPOPJ1 ;ALREADY GOT THIS LINE CLEARM SYMBLK(AC1) SOJG AC1,.-1 ;ZERO ALL OTHERS JRST CPOPJ1 SOUTF: PUSHJ PP,OUTFF ;GET TO TOP OF PAGE MOVE AC1,..LPP ;[227] MOVEM AC1,COLSIZ SOUTF1: PUSHJ PP,SOUTL ;DUMP ONE LINE JRST CPOPJ ;WAS BLANK SOSLE COLSIZ ;ONE MORE DONE JRST SOUTF1 ;MORE TO GO SOUTF2: JRST CPOPJ1 SOUTL: MOVE AC1,NCOLLS ;SET COLUME COUNT SOUTL0: HRRZ SX,SYMBLK(AC1) HLRZ SDEL,SYMBLK(AC1);GET POSITION IN TABLE JUMPE SDEL,SOUTL3 ;NOTHING THERE SOUTL1: PUSHJ PP,SOUTT ;SYMBLE PRINTABLE? JRST SOUTL2 ;CENCOR!! PUSHJ PP,SOUTE ;DUMP OUT ENTRY ADDI SX,2 SUBI SDEL,1 ;UP TP NEXT ONE HRL SX,SDEL ;SAVE OUR PLACE MOVEM SX,SYMBLK(AC1) SOJG AC1,SOUTL0 ;NEXT! AOS (PP) JRST OUTCR ;POLISH OFF LINE SOUTL2: ADDI SX,2 SOJG SDEL,SOUTL1 ;KEEP SEARCHING SOUTL3: CAME AC1,NCOLLS ;BLANK LINE? AOS (PP) ;NO JRST OUTCR SOUTE: MOVE AC0,-1(SX) PUSHJ PP,OUTSYM ;DUMP SYMBOL OUT PUSHJ PP,SRCH7 ;GET VALUE TLNN ARG,EXTF ;EXTERNAL? JRST .+5 HLRZ RC,V ;YES, NEED FIXUP TRNE RC,-2 MOVS RC,(RC) HLL V,RC HLLO CS,V TLNE RC,-1 TRZ CS,1 TLNE RC,-2 TRZ CS,EXTF TLNN V,-1 TLNE RC,-1 PUSHJ PP,ONC1 PUSHJ PP,OUTTAB HRLO CS,V TRNE RC,-1 TRZ CS,1 TRNE RC,-2 TRZ CS,EXTF PUSHJ PP,ONC1 PUSHJ PP,OUTTAB ;AND TAB, OF COURSE PUSHJ PP,SOUTE8 ;ABBREVIATION FOR TYPE JRST OUTTAB ;FINAL TAB SOUTE8: TLNN ARG,INTF!EXTF!ENTF!UNDF!NOOUTF POPJ PP, ;SKIP JUNK FOR SIMPLE STUFF SETZ CS, TLNE ARG,INTF ;INTERNAL MOVEI CS,1 TLNE ARG,EXTF ;EXTERNAL MOVEI CS,-1 TLNE ARG,ENTF ;ENTRY MOVEI CS,-5 TLNE ARG,NOOUTF ;DDT SURPRESSED ADDI CS,3 TLNE ARG,UNDF ;UNDEFINED MOVEI CS,-3 ;SET FOR UDF MOVEI CS,SOUTC(CS) ;GET ABREVIATION JRST OUTAS0 SOUT1: MOVE SX,PAGENO ;GET LAST SYMBOL PAGE NUMBER EXCH SX,SPAGNO ;SWAP WITH OUTPUT PAGE NUMBER MOVEM SX,PAGENO ;AND STORE IT MOVE SX,[BYTE (7) 0,0,<"S">,<"-">,0] ANDCAM SX,DBUF+4 ;FIXUP TITLE SOUT2: PUSHJ PP,SGLKUP ;[265] SET FOR TABLE SCAN TRNN ARG,SYMF TRNN ARG,MACF!SYNF TDZA MRP,MRP ;SKIP AND CLEAR MRP POPJ PP, ;NO, TRY AGAIN TRNE ARG,INTF MOVEI MRP,1 TRNE ARG,EXTF MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL TRNE ARG,SYNF ;SYNONYM? JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL TRNE ARG,SUPRBT ;IF SUPRESSED POPJ PP, ;DO NOT OUTPUT JUMPGE MRP,SOUT10 ;BRANCH IF NOT EXTERNAL HLRZ RC,V ;PUT POINTER/FLAGS IN RC TRNE RC,-2 ;POINTER? MOVS RC,0(RC) ;YES HLL V,RC ;STORE LEFT VALUE SOUT10: PUSH PP,RC ;SAVE FOR LATER MOVEI AC1,0 JUMPLE MRP,SOUT15 ;SET DEFFERRED BITS IF INTERN=EXTERN TDNE RC,[-2,,-2] ;CHECK FOR INTERN=EXTERN TRZ ARG,NOOUTF ;YES, SO CLEAR SUPPRESS FLAG TLNE RC,-2 ;CHECK FOR LEFT FIXUP IORI AC1,40 ;AND SET BITS TRNE RC,-2 ;CHECK FOR RIGHT FIXUP IORI AC1,20 ;AND SET BITS SOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL HRRZS RC TRNE RC,-2 HLLZS RC TLZE RC,-1 TRO RC,2 HRL MRP,RC MOVEI RC,0 TRNE ARG,ENTF ;ENTRY DMN HRRI MRP,-5 TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW ADDI MRP,3 ;YES WFW TRNE ARG,UNDF ;UNDEFINED IS EXTERNAL HRRI MRP,2 ;SO FLAG AS UDF IOR AC1,SOUTC(MRP) MOVE ARG,AC1 PUSHJ PP,NOUT2 ;SQUOZE AND DUMP THE SYMBOL MOVEM AC0,SVSYM ;SAVE IT MOVE AC0,V ;GET THE VALUE HLRZ RC,MRP ;AND THE RELOCATION PUSHJ PP,COUT POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL TRNN RC,-2 ;IS IT? JRST SOUT50 ;NO MOVE AC0,1(RC) ;GET NAME MOVEI ARG,60 ;EXTERNAL REQ PUSHJ PP,SQOZE HLLZS RC ;NO RELOC PUSHJ PP,COUT ;OUTPUT IT MOVE AC0,SVSYM ;GET SYMBOL NAME TLO AC0,500000 ;SET AS ADDITIVE SYMBOL TLZ AC0,200000 ;BUT NOT LEFT HALF ETC PUSHJ PP,COUT SOUT50: MOVSS RC ;CHECK LEFT HALF TRNN RC,-2 POPJ PP, MOVE AC0,1(RC) MOVEI ARG,60 PUSHJ PP,SQOZE MOVEI RC,0 PUSHJ PP,COUT MOVE AC0,SVSYM TLO AC0,700000 JRST COUT SOUT20: PUSHJ PP,OUTAS0 JRST OUTCR !04 ;DMN 0 !60 ;UNDEFINED EXTERNAL !44 ;SUPRESSED ENTRY !60 SOUTC: EXP 10 !04 !60 ;SUPPRESSED EXTERNAL (NOT USED YET) !50 !44 ;DMN ;OUTPUT THE BINARY BOUT: HRRZ CS,LOCA ;[150] PICKUP THE LOCATION SUB CS,STPX ;[150] MINUS START ADD CS,STPY ;[150] PLUS END HRLO CS,CS ;[150] TO GET ASSEMBLY LOCATION PUSHJ PP,ONC ;OUTPUT IT TO THE LISTING FILE MOVEI C,"'" SKIPE MODA ;[150] IF MODE IS NOT ABSOLUTE PUSHJ PP,OUTC ;PRINT A SINGLE QUOTE PUSHJ PP,DSTOW ;GET THE CODE PUSH PP,RC ;SAVE RELOC PUSH PP,RC ;AND AGAIN TLNE RC,-2 ;CHECK LEFT EXTERNAL HRRZS RC ;MAKE LEFT NON-RELOC TRNN RC,-2 ;RIGHT EXT? JRST BOUT30 ;NO HRRZ AC1,AC0 ;YES JUMPE AC1,BOUT20 ;PROCESS IF ZERO CODE THERE HLLZS RC ;MAKE NON-RELOC JRST BOUT30 ;PROCESS BOUT20: HRRM AC1,-1(PP) ;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0) HRR AC0,0(RC) ;NO, SET ADDRESS LINK MOVE AC1,LOCO ;GET CURRENT LOCATION HRRM AC1,0(RC) ;SET NEW LINK HLRZ AC1,0(RC) ;GET FLAGS/POINTER TRNN AC1,-2 ;POINTER? HRR AC1,RC ;NO, SET TO FLAGS HLR RC,0(AC1) ;PUT FLAGS IN RC HRL AC1,MODO ;GET CURRENT MODE TRZE RC,-2 ;LEFT HALF RELOCATABLE+ TLO AC1,2 ;YES, SET FLAG HLLM AC1,0(AC1) ;STORE NEW FLAGS BOUT30: HLLO CS,AC0 TLZE RC,1 ;PACK RELOCATION BITS TRO RC,2 TRNE RC,2 ;LEFT HALF RELOCATABLE? TRZ CS,1 ;YES, RESET BIT PUSH PP,AC0 ;NEED AN AC HLRZ AC0,-1(PP) ;AC0 = LEFT RELOCATION CAILE AC0,1 ;EXTERNAL? XORI CS,EXTF!1 ;YES, SET SWITCH IFN FORMSW,< OR AC0,HWFMT JUMPN AC0,BOUT3H ;EDIT IN HALF WORD FORMAT IF NOT 0 MOVE AC0,FORM ;GET FORM WORD MOVEI C,0 ;ZERO FIELD SIZE BOUT3A: JFFO AC0,BOUT3B ;AC1 = FIELD SIZE -1 JRST BOUT3C ;NO FIELDS LEFT, JUMP BOUT3B: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD MOVEI AC1,6(AC1) IDIVI AC1,3 ;AC1 = COLUMNS USED + 1 ADDI C,(AC1) ;INCREMENT FIELD SIZE CAIG C,^D23 ;IS FIELD SIZE GTR 23? JRST BOUT3A ;NO. CONTINUE MOVE AC1,HWFORM ;USE STANDARD FORM MOVEM AC1,FORM MOVEI C,^D13 ;SET FIELD SIZE TO 13 BOUT3C: MOVEM C,FLDSIZ ;STORE FIELD SIZE MOVE AC0,FORM ;AC0 = FORM WORD TRNN RC,2 ;IS LEFT HALF RELOCATED? CAMN AC0,HWFORM ;NO. IS FORM HALF WORD? JRST BOUT3H ;YES. EDIT IN OLD WAY IBP TABP CAIL C,^D16 IBP TABP ILDB C,TABP ;GET A TAB PUSHJ PP,OUTL ;OUTPUT IT MOVE AC2,(PP) ;AC2 = INFO TO BE EDITED PUSH PP,CS ;SAVE CS = C+1 BOUT3D: JFFO AC0,BOUT3E ;AC1 = FIELD LENGTH - 1 BOUT3E: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD MOVEI C,3(AC1) MOVEI AC1,0 LSHC AC1,-2(C) ;AC1 = FIELD INFO IDIVI C,3 ;C = # OF OCTAL DIGITS MOVE C+1,AC0 ;SAVE AC0 SKIPE IOSEEN ;IS THIS A I/O INST. PUSHJ PP,BOUT3J ;YES,SET FIELDS CORRECTLY MOVNS C ROT AC1,(C) ROT AC1,(C) ROT AC1,(C) MOVNS C BOUT3F: MOVEI AC0,6 ;EDIT A DIGIT LSHC AC0,3 EXCH AC0,C PUSHJ PP,OUTC ;OUTPUT IT MOVE C,AC0 SOJG C,BOUT3F ;IF MORE DIGITS, GO BACK JUMPE C+1,BOUT3G ;JUMP IF END OF WORD MOVE AC0,C+1 ;RESTORE AC0 MOVEI C," " PUSHJ PP,OUTC ;OUTPUT A SPACE JRST BOUT3D ;PROCESS NEXT FIELD BOUT3G: POP PP,CS ;RESTORE CS = C+1 MOVEI C," " TRNE RC,1 ;RELOCATABLE? MOVEI C,"'" ;YES HRRZ AC0,-1(PP) ;AC0 = RIGHT RELOCATION CAILE AC0,1 ;EXTERNAL? MOVEI C,"*" ;YES PUSHJ PP,ONC2 ;STORE POSSIBLE INDICATOR POP PP,AC0 JRST BOUT3I ;CONTINUE BOUT3H: MOVEI C,^D15 ;SET SIZE TO 15 MOVEM C,FLDSIZ ;[116] SETZM IOSEEN ;CLEAR INCASE HWFMT WAS SET > POP PP,AC0 ;RESTORE PUSHJ PP,ONC HRLO CS,AC0 TDZ CS,RC ;SET RELOCATION HRRZ C,(PP) ;C = RIGHT RELOCATION CAILE C,1 ;EXTERNAL XORI CS,EXTF!1 ;YES, SET SWITCH PUSHJ PP,ONC BOUT3I: POP PP,CS ;GET RID OF ENTRY ON STACK HRRZ CS,LOCO TLNE FR,RIMSW!RIM1SW!R1BSW ;RIM OUTPUT? JRST ROUT ;YES, GO PROCESS HRL CS,MODO CAME CS,MODLOC ;SEQUENCE OR RELOCATION BREAK? PUSHJ PP,COUTD ;YES, DUMP THE BUFFER SKIPL COUTX ;NEW BUFFER? JRST BOUT40 ;NO, STORE CODE AND EXIT MOVEM CS,MODLOC ;YES, STORE NEW VALUES EXCH AC0,LOCO EXCH RC,MODO PUSHJ PP,COUT ;STORE BLOCK LOCATION AND MODE EXCH RC,MODO ;RESTORE CURRENT VALUES EXCH AC0,LOCO BOUT40: PUSHJ PP,COUT ;EMIT CODE POP PP,RC ;RETRIEVE EXTERNAL BITS TRNN RC,-2 ;RIGHT EXTERNAL? JRST BOUT50 ;TRY FOR LEFT PUSHJ PP,COUTD PUSH PP,BLKTYP ;TERMINATE TYPE AND SAVE MOVEI AC0,2 ;BLOCK TYPE 2 MOVEM AC0,BLKTYP MOVE AC0,1(RC) ;GET SYMBOL MOVEI ARG,60 ;CODE BITS PUSHJ PP,SQOZE ;CONVERT TO RADIX 50 HLLZS RC ;SYMBOL HAS NO RELOCATION PUSHJ PP,COUT ;EMIT MOVE AC0,LOCO ;GET CURRENT LOC HRLI AC0,400000 ;ADDITIVE REQ HRR RC,MODO ;CURRENT MODE PUSHJ PP,COUT ;EMIT MOVSS RC ;NOW FOR LEFT TRNN RC,-2 JRST BOUT60 JRST BOUT70 BOUT50: MOVSS RC ;CHECK OTHER HALF TRNN RC,-2 ;LEFT HALF EXTERNAL? JRST BOUT80 ;NO, FALSE ALARM PUSHJ PP,COUTD ;CHANGE MODE PUSH PP,BLKTYP MOVEI AC0,2 MOVEM AC0,BLKTYP BOUT70: MOVE AC0,1(RC) MOVEI ARG,60 PUSHJ PP,SQOZE HLLZS RC PUSHJ PP,COUT MOVE AC0,LOCO HRLI AC0,600000 ;LEFT HALF ADD HRR RC,MODO PUSHJ PP,COUT ;EMIT BOUT60: PUSHJ PP,COUTD ;CHANGE MODE POP PP,BLKTYP ;TO OLD ONE BOUT80: AOS LOCO AOS MODLOC POPJ PP, IFN FORMSW,< BOUT3J: MOVSS IOSEEN ;SWAP SKIPGE IOSEEN ;SKIP IF NOT FIRST FIELD JRST [HLLZS IOSEEN ;CLEAR RIGHT HALF POPJ PP,] ;AND RETURN MOVSS IOSEEN ;SWAP BACK LSH AC1,2 ;CORRECT MNEMONIC AND OP CODE CAIE C,1 ;IS IT OP CODE? POPJ PP, ;NO,JUST RETURN MOVEI C,2 ;TWO CHAR. WIDE NOW SETZM IOSEEN ;DON'T COME AGAIN POPJ PP, ;RETURN > NOUT: MOVE V,[POINT 7,TBUF] ;POINTER TO ASCII LINE MOVSI CS,(POINT 6,AC0) ;POINTER TO SIXBIT AC0 SETZB ARG,AC0 NOUT1: ILDB C,V ;GET ASCII CAIL C,"A"+40 CAILE C,"Z"+40 JRST .+2 TRZA C,100 ;LOWER CASE TO SIXBIT SUBI C,40 ;CONVERT TO SIXBIT JUMPLE C,NOUT3 ;TEST FORM NON-SIXBIT CAILE C,77 ;AND NOT GREATER THAN SIXBIT JRST NOUT3 ;... IDPB C,CS ;DEPOSIT IN AC0 TLNE CS,770000 ;TEST FOR SIX CHARACTERS JRST NOUT1 ;NO, GET ANOTHER NOUT3: SKIPGE UNIVSN ;IF A UNIVERSAL PROG POPJ PP, ;RETURN TO PUT IT IN THE TABLE IFN CCLSW, PUSHJ PP,NOUT2 ;[214] DUMP NAME MOVSI AC0,11 ;[214] TYPE MARKER IOR AC0,CPUTYP ;[235] CPU TYPE PJRST COUT ;[214] DUMP AND EXIT NOUT2: PUSHJ PP,SQOZE ;CONVERT TO SIXBIT JRST COUT ;DUMP AND EXIT HOUT: IFN POLISH,< SETZ AC0, ;[265] FORCE TO PSECT 0 SKIPE SGNMAX ;[265] NO PSECTS PUSHJ PP,SGOUTN ;[265] PUT IT OUT > MOVEI RC,1 ;RELOCATABLE MOVE AC0,HHIGH ;GET HIGH SEG IF TWO SEGMENTS JUMPE AC0,.+2 ;NOT TWO SEGMENTS PUSHJ PP,COUT ;OUTPUT IT MOVE AC0,SGATTR ;[265] SKIPE HHIGH ;ANY TWOSEG HIGH STUFF JRST COUT ;YES,SO NO ABS. PUSHJ PP,COUT ;OUTPUT THE HIGHEST LOCATION MOVE AC0,ABSHI ;PUT OUT ABS PORTION OF PROGRAM BREAK SOJA RC,COUT ;OUTPUT A WORD OF ZERO AND EXIT IFN POLISH,< ;[164] ;HERE TO OUTPUT BLOCK TYPE 11 POUT: SKIPN POLIST ;ANY POLISH TO OUTPUT? POPJ PP, ;NO TLO FR,POLSW ;SET FLAG PUSHJ PP,COUTD ;DUMP BUFFER UNLESS EMPTY MOVE CS,@POLIST ;GET A BLOCK POINTER EXCH CS,POLIST ;SET FOR NEXT TIME POUTA: ADDI CS,1 ;FIRST WORD MOVE AC0,(CS) ;GET SOMETHING SETZ RC, ;CLEAR RELOCATION JUMPL AC0,POUTOP ;THIS IS AN OPERATOR PUSHJ PP,PCOUT ;STORE THIS HALF WORD JUMPE AC0,POUT0 ;18 BIT VALUE SOJE AC0,POUT1 ;36 BIT VALUE HLRZ AC0,1(CS) ;GET HALF OF SYMBOL PUSHJ PP,PCOUT HRRZ AC0,1(CS) ;GET OTHER HALF PUSHJ PP,PCOUT AOJA CS,POUTA POUT0: HLRZ RC,1(CS) ;GET RELOCATION HRRZ AC0,1(CS) ;AND VALUE PUSHJ PP,PCOUT AOJA CS,POUTA ;GET NEXT POUT1: HLRZ RC,1(CS) ;GET LEFT HALF HLRZ AC0,2(CS) PUSHJ PP,PCOUT HRRZ RC,1(CS) ;RIGHT HALF HRRZ AC0,2(CS) PUSHJ PP,PCOUT ADDI CS,2 ;SKIP OVER 2 WORDS JRST POUTA POUTOP: HRRZ AC0,AC0 ;GET OPERATOR ONLY PUSHJ PP,PCOUT ;OUTPUT CAIGE AC0,-6 ;[265] CHECK FOR STORE OP JRST POUTA ;ITS NOT CAIGE AC0,-3 ;CHECK FOR SYMBOL FIXUP JRST POUTSY ;IT IS HLRZ RC,1(CS) ;GET RELOCATION HRRZ AC0,1(CS) ;AND STORE ADDRESS POUTOQ: PUSHJ PP,PCOUT TLZ FR,POLSW ;CLEAR FLAG INCASE END JRST POUT ;SEE IF MORE TO GO POUTSY: HLRZ AC0,1(CS) ;GET LHS SYMBOL SETZ RC, ;NO RELOCATION PUSHJ PP,PCOUT ;OUTPUT IT HRRZ AC0,1(CS) ;GET RHS PUSHJ PP,COUT JFFO PP,POUTOQ ;FOLLOW WITH 0 FOR BLOCK LEVEL (FAIL COMPATIBLE) PCOUT: MOVE C,COUTP ;GET POINTER TLNE C,010000 ;LEFT OR RIGHT HALF? JRST PCOUTR ;JUST THE RIGHT HALF AOS C,COUTX ;INCREMENT INDEX HRLZM AC0,COUTDB(C) ;STORE LEFT HALF IDPB RC,COUTP ;AND RELOCATION POPJ PP, PCOUTR: MOVE C,COUTX ;GET CURRENT INDEX HRRM AC0,COUTDB(C) ;STORE RIGHT HALF IDPB RC,COUTP ;AND RELOCATION CAIE C,^D17 ;IS THE BUFFER FULL POPJ PP, ;NO JRST COUTD ;YES, DUMP IT ;HERE TO OUTPUT BLOCK TYPE 22 - PSECT NAME SGOUTN: PUSHJ PP,COUTD ;FINISH OFF CURRENT BLOCK PUSH PP,BLKTYP ;SAVE CURRENT BLOCK TYPE MOVEI AC0,22 ;BLOCK TYPE 22 IS A MOVEM AC0,BLKTYP ; PSECT NAME MOVE C,SGNCUR ;GET CUR PSECT INX MOVE AC0,SGNAME(C) ;GET PSECT NAME SETZ RC, ;CLEAR RELOCATION PUSHJ PP,COUT ;OUTPUT THE BLOCK MOVE C,SGNCUR ;INDEX AGAIN HRRZ AC0,SGORIG(C) ;GET ORIGIN IF SPECIFIED SKIPE AC0 ;NOT PUSHJ PP,COUT PUSHJ PP,COUTD ;FINISH IT OFF POP PP,BLKTYP ;RESTORE CURRENT BLOCK TYPE POPJ PP, ;RETURN ;HERE TO OUTPUT BLOCK TYPE 23 - PSECT LENGTH AND ATTRIBUTES SGOUTL: PUSHJ PP,COUTD ;FINISH OFF CURRENT BLOCK PUSH PP,BLKTYP ;SAVE CURRENT BLOCK TYPE MOVEI AC0,23 ;BLOCK TYPE 23 IS A MOVEM AC0,BLKTYP ; PSECT LENGTH MOVE RC,SGNCUR ;GET CUR PSECT INX MOVE AC0,SGNAME(RC) ;GET PSECT NAME SETZ RC, ;CLEAR RELOCATION PUSHJ PP,COUT ;OUTPUT THE NAME MOVE RC,SGNCUR ;GET CUR PSECT INX MOVE AC0,SGATTR(RC) ;GET PSECT LENGTH AND ATTRS MOVEI RC,1 ;BREAK IS RELOCATED PUSHJ PP,COUT ;OUTPUT THE LENGTH AND ATTRS PUSHJ PP,COUTD ;FINISH IT OFF POP PP,BLKTYP ;RESTORE CURRENT BLOCK TYPE POPJ PP, ;RETURN > HSOUT: SETZM HISNSW ;CLEAR FOR PASS2 MOVE AC0,SVTYP3 ;GET HISEG ARG JUMPGE AC0,.+4 ;JUMP IF ONLY HISEG HRL AC0,HIGH1 ;GET BREAK FROM PASS 1 JUMPL AC0,.+2 ;OK IF GREATER THAN 400000 HRLS AC0 ;SIGNAL TWO SEGMENT TO LOADER MOVEI RC,1 ;ASSUME RELOCATABLE JRST COUT ;OUTPUT THE WORD VOUT: SKIPN RC,VECREL ;IS VECTOR ABSOLUTE ZERO? SKIPE VECTOR ;ALSO CHECK RELOCATION JRST .+3 ;[244] SKIPN VECSYM ;[244] SEE IF SYMBOLIC POPJ PP, ;YES, EXIT IFN POLISH,< MOVE AC0,VECFND ;GET START ADR PSECT INX MOVEM AC0,SGNCUR ;POINT CUR PSECT THERE SKIPE SGNMAX ;IF PSECTS WERE USED PUSHJ PP,SGOUTN ; THEN PUT OUT PSECT BLOCK MOVE RC,VECREL> ;GET RELOCATION MOVE AC0,VECTOR ;AC0 SHOULD BE FLAGS SKIPN VECSYM ;[244] 2 WORDS IF SYMBOLIC JRST COUT PUSHJ PP,COUT ;OUTPUT CONSTANT MOVE AC0,VECSYM ;[244] GET SYMBOL MOVEI ARG,60 ;[210] MAKE REQUEST PUSHJ PP,SQOZE ;[210] IN RADIX-50 SETZ RC, ;[240] COUT: AOS C,COUTX ;INCREMENT INDEX MOVEM AC0,COUTDB(C) ;STORE CODE IDPB RC,COUTP ;STORE RELOCATION BITS CAIE C,^D17 ;IS THE BUFFER FULL? POPJ PP, ;NO, EXIT COUTD: AOSG C,COUTX ;DUMP THE BUFFER JRST COUTI ;BUFFER WAS EMPTY HRL C,BLKTYP ;SET BLOCK TYPE COUTT: ;[232] ENTER FROM .TEXT PSEUDO-OP PUSHJ PP,OUTBIN ;OUTPUT COUNT AND TYPE SETOB C,COUTY ;INITIALIZE INDEX COUTD2: MOVE C,COUTDB(C) ;GET RELOCATION BITS/CODE CAMN SDEL,[XWD 440000,0] ;[331] IF .TEXT, ONLY OUTPUT THE RELOCATION TRZN C,1 ;[331] WORD IF IT HAS DATA OR IS NEEDED ;[331] FOR A NULL STRING TERMINATOR PUSHJ PP,OUTBIN ;DUMP IT AOS C,COUTY ;INCREMENT INDEX CAMGE C,COUTX ;TEST FOR END JRST COUTD2 ;NO, GET NEXT WORD COUTI: SETOM COUTX ;INITIALIZE BUFFER INDEX SETZM COUTRB ;ZERO RELOCATION BITS IFN POLISH,< HRRZ C,BLKTYP ;[164] IF WE ARE OUTPUTING CAIN C,11 ;[164] POLISH BLOCK TYPE 11 SKIPA C,[POINT 1,COUTRB] ;[164] USE HALF WORDS > MOVE C,[POINT 2,COUTRB] MOVEM C,COUTP ;INITIALIZE BIT POINTER POPJ PP, ;EXIT STOWZ1: IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM> STOWZ: MOVEI RC,0 STOW: IFN FORMSW,< MOVEM AC1,FORM ;STORE FORM WORD> IFN TSTCD,< SKIPE TCDFLG ;[414]TESTING NEW LINK CODES? JRST STOWTC ;[414]YES. > ; NFI TSTCD ;[414] JUMP1 STOW20 ;SKIP TEST IF PASS ONE TRNE RC,-2 ;RIGHT HALF ZERO OR 1? PUSHJ PP,STOWT ;NO, HANDLE EXTERNAL TLNN RC,-2 ;LEFT HALF ZERO OR 1? WFW JRST STOW10 ;YES, SKIP TEST MOVSS RC ;SWAP HALVES PUSHJ PP,STOWT1 ;HANDLE EXTERNAL WFW MOVSS RC ;RESTORE VALUES STOW10: SKIPE EXTPNT ;ANY EXTERNALS REMAINING? TRO ER,ERRE ;YES, SET EXTERNAL ERROR FLAG STOW20: AOS AC1,STPX ;INCREMENT POINTER MOVEM AC0,STCODE(AC1) ;STOW CODE MOVEM RC,STOWRC(AC1) ;STOW RELOCATION BITS IFN FORMSW,< PUSH PP,FORM POP PP,STFORM(AC1) ;STORE FORM WORD > SKIPN LITLVL ;ARE WE IN LITERAL? AOS LOCA ;NO, INCREMENT ASSEMBLY LOCATION CAIGE AC1,.STP-1 ;OVERFLOW? POPJ PP, ;NO, EXIT SKIPE LITLVL ;ARE WE IN A LITERAL? TROA ER,ERRL ;YES, FLAG ERROR BUT DON'T DUMP JRST CHARL1 ;NO, SAVE REGISTERS AND DUMP THE BUFFER JRST STOWI ;INITIALIZE BUFFER DSTOW: AOS AC1,STPY ;INCREMENT POINTER MOVE AC0,STCODE(AC1) ;FETCH CODE MOVE RC,STOWRC(AC1) ;FETCH RELOCATION BITS IFN FORMSW,< PUSH PP,STFORM(AC1) POP PP,FORM ;GET FORM WORD > CAMGE AC1,STPX ;IS THIS THE END? POPJ PP, ;NO, EXIT STOWI: SETOM STPX ;INITIALIZE FOR INPUT SETOM STPY ;INITIALIZE FOR OUTPUT SETZM EXTPNT POPJ PP, ;EXIT SVSTOW: AOS LITLVL ;NESTED LITERALS PUSH PP,STPX ;MAKE ROOM FOR ANOTHER PUSH PP,STPY MOVE AC1,STPX MOVEM AC1,STPY JRST 0(AC2) GTSTOW: POP PP,STPY ;BACK UP A LEVEL POP PP,STPX SOS LITLVL JRST 0(AC2) ;EXTERNAL RIGHT STOWT: HRRZ AC1,EXTPNT ;GET RIGHT POINTER CAIE AC1,(RC) ;DOES IT MATCH PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR HLLZS EXTPNT POPJ PP, ;EXIT ;EXTERNAL LEFT STOWT1: HLRZ AC1,EXTPNT ;GET LEFT HALF CAIE AC1,(RC) ;SEE ABOVE PUSHJ PP,QEXT HRRZS EXTPNT POPJ PP, ;EXIT IFN TSTCD,< STOWTC: SKIPE RC ;[414]RELOCATABLE OR EXTERNAL? PUSHJ PP,QEXT ;[414]YES,FLAG ERROR JUMP1 CPOPJ ;[414]IF PASS 1, RETURN MOVE C,AC0 ;[414]GET VALUE JRST OUTBIN ;[414]DEPOSIT INTO REL FILE AND RETURN > ; NFI TSTCD ONC: ILDB C,TABP ;ENTRY TO ADVANCE TAB POINTER PUSHJ PP,OUTL ;OUTPUT A TAB ;OUTPUT 6 OCT NUMBERS FROM CS LEFT ONC1: MOVEI C,6 ;CONVERT TO ASCII LSHC C,3 ;SHIFT IN OCTAL PUSHJ PP,OUTL ;OUTPUT ASCII FROM C TRNE CS,-1 ;ARE WE THROUGH? JRST ONC1 ;NO, GET ANOTHER MOVEI C,0 ;CLEAR C TLNN CS,1 ;RELOCATABLE? MOVEI C,"'" ;YES TLNN CS,EXTF ;OR EXTERNAL MOVEI C,"*" ;YES ONC2: JUMPN C,OUTC ;OUTPUT IF EXTERN OR RELOCATABLE IFN FORMSW,< SOS FLDSIZ ;DECREMENT FIELD SIZE> POPJ PP, ;EXIT DNC: IDIVI C,^D10 HRLM CS,0(PP) JUMPE C,.+2 PUSHJ PP,DNC ;RECURSE IF NON-ZERO HLRZ C,0(PP) ADDI C,"0" ;FORM ASCII JRST PRINT ;DUMP AND TEST FOR END OUTAS0: HRLI CS,(POINT 7,,) ;ENTRY TO SET POINTER OUTASC: ILDB C,CS ;GET NEXT BYTE JUMPE C,POPOUT ;EXIT ON ZERO DELIMITER PUSHJ PP,PRINT JRST OUTASC OUTSIX: HRLI CS,(POINT 6,,) ;OUTPUT SIXBIT ILDB C,CS ;GET SIXBIT CAIN C,40 ;"@" DELIMITER? POPJ PP, ;YES, EXIT ADDI C,40 ;NO, FORM ASCII PUSHJ PP,OUTL ;OUTPUT ASCII CHAR FROM C JRST OUTSIX+1 OUTSYM: MOVE CS,AC0 ;PLACE NAME IN CS OUTSY1: MOVEI C,0 ;CLEAR C LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN JUMPE C,OUTTAB ;TEST FOR END ADDI C,40 ;CONVERT TO ASCII PUSHJ PP,OUTL ;OUTPUT JRST OUTSY1 ;LOOP OUTSET: AOS SX,0(PP) ;GET RETURN LOCATION MOVE SX,-1(SX) ;GET XWD CODE HLRM SX,BLKTYP ;SET BLOCK TYPE SETZB ARG,RC PUSHJ PP,0(SX) ;GO TO PRESCRIBED ROUTINE JRST COUTD ;TERMINATE BLOCK AND EXIT ;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE LOOKUP: POP PP,LOOKX ;INTERCEPT RETURN POP MOVE SX,SYMBOL IFE POLISH,< MOVE SDEL,0(SX) ;SET FOR TABLE SCAN LOOKL: SOJL SDEL,POPOUT ;TEST FOR END > IFN POLISH,< PUSH PP,0(SX) ;SET FOR TABLE SCAN LOOKL: SOSGE 0(PP) ;TEST FOR END JRST LOOKXT ;DONE, EXIT > ADDI SX,2 MOVE AC0,-1(SX) PUSHJ PP,SRCH7 ;LOAD REGISTERS HLRZS ARG PUSHJ PP,@LOOKX ;RETURN TO CALLING ROUTINE JRST LOOKL ;TRY AGAIN IFE POLISH, IFN POLISH,< LOOKXT: POP PP,AC0 ;THROW AWAY COUNTER POPJ PP, SGLKUP: POP PP,LOOKX ;INTERCEPT RETURN POP MOVE SX,SGNCUR ;GET CUR PSECT INX PUSH PP,SGSCNT(SX) ;SAVE SYM CNT HRRZS 0(PP) ;DON'T WANT LEFT HALF MOVE SX,SGSBOT ;GET INIT SYM TAB PTR JRST LOOKL ;REST IS SAME AS FOR FULL CASE > END0: IFN FT.U01,< MOVE V,[IOWD $USRLN,$USSTK] ; RESET USER STACK MOVEM V,$USRPD ; SO DO IT >; END OF FT.U01 IFN POLISH,< HRROS SGNCUR ;[265] FORCE EVALUATION IN ITS OWN PSECT > PUSHJ PP,EVALCM ;GET A WORD IFN POLISH,< HRRZS SGNCUR ;[265] BACK TO NORMAL > SKIPN V,AC0 ;NON-ZERO? JUMPE RC,.+2 ;OR RELOC? PUSHJ PP,ASSIG7 ;YES, LIST THE VALUE SETZM VECSYM ;[240] INCASE NOT SYMBOLIC SKIPN EXTPNT ;[210] EXTERNAL? JRST END00 ;[210] NO CAME RC,EXTPNT ;[210] MAKE SURE SAME JRST [SETZB AC0,VECSYM ;[244] NO, CLEAR TRO ER,ERRE ;[210] FLAG ERROR JRST .+3] ;[244] MOVE RC,1(RC) ;[244] GET SIXBIT NAME MOVEM RC,VECSYM ;[244] STORE SYMBOL NAME SETZB RC,EXTPNT ;[210] AND CLEAR RELOC END00: MOVEM AC0,VECTOR MOVEM RC,VECREL IFN POLISH,< MOVE AC1,SGWFND ;[265] GET START ADR PSECT INX MOVEM AC1,VECFND ;[265] SAVE IT > PUSHJ PP,STOUTS ;DUMP THE LINE END01: SETZ MRP, ;[223] SHOULDN'T BE IN A MACRO BY NOW IFN POLISH,< MOVE AC1,SGNMAX ;[265] GET HIGHEST PSECT USED PUSH PP,AC1 ;[265] SAVE IT END02: CAME AC1,SGNCUR ;[265] IF NOT CURRENT PUSHJ PP,%SWSEG ;[265] SWAP IT > PUSHJ PP,VARA ;FILL OUT SELF-DEFINED VARIABLES IFE IIISW, PUSHJ PP,LIT1 IFE IIISW, IFN POLISH,< SOSL AC1,0(PP) ;[265] DONE YET? JRST END02 ;[265] NO POP PP,AC1 ;[265] GET JUNK OFF STACK > JUMP2 ENDP2 MOVE HHIGH ;GET HIGH SEG BREAK MOVEM HIGH1 ;SAVE FOR TWOSEG/HISEG BLOCK TYPE 3 PUSHJ PP,UOUT TLNN IO,MFLSW ;SKIP IF ONLY PSEND PUSHJ PP,REC2 MOVE INDIR ;SET UP FIRST AS LAST MOVEM LSTFIL ;PRINTED SETZM LSTPGN PUSHJ PP,INZ1 ;[234] TLNE IO,MFLSW ;IF PSEND POPJ PP, ;BACK TO PSEND0 SKIPE PRGPTR ;HAVE ANY PRGEND'S BEEN SEEN PUSHJ PP,PSEND3 ;YES,GO SET UP AGAIN PASS20: SETZM CTLSAV PUSHJ PP,COUTI PUSHJ PP,EOUT ;OUTPUT THE ENTRIES PUSHJ PP,OUTSET XWD 6,NOUT ;OUTPUT THE NAME (BLKTYP-6) SKIPN HISNSW ;PUT OUT BLOCK TYPE 3? JRST PASS21 ;NO PUSHJ PP,OUTSET XWD 3,HSOUT ;OUTPUT THE HISEG BLOCK PASS21: MOVEI 1 HRRM BLKTYP ;SET FOR TYPE 1 BLOCK TLZ FR,P1 ;SET FOR PASS 2 AND TURN OFF FLAG TLO IO,IOPALL ;PUT THESE BACK TLZ IO,IOPROG!IOCREF!DEFCRS!IONCRF ;[141] SO LISTINGS WILL BE THE WAY THEY SHOULD TLNN FR,R1BSW JRST STOWI MOVE CS,[XWD $ST-1-$CKSM,R1BLDR] MOVE C,0(CS) PUSHJ PP,PTPBIN AOBJN CS,.-2 PUSHJ PP,R1BI JRST STOWI R1BLDR: PHASE 0 IOWD $ADR,$ST $ST: CONO PTR,60 HRRI $A,$RD+1 $RD: CONSO PTR,10 JRST .-1 DATAI PTR,@$TBL1-$RD+1($A) XCT $TBL1-$RD+1($A) XCT $TBL2-$RD+1($A) $A: SOJA $A, $TBL1: CAME $CKSM,$ADR ADD $CKSM,1($ADR) SKIPL $CKSM,$ADR $TBL2: JRST 4,$ST AOBJN $ADR,$RD $ADR: JRST $ST+1 $CKSM: DEPHASE IF2,< PURGE $ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM> ENDP2: PUSHJ PP,COUTD ;DUMP THE BUFFER MOVE AC0,LOCO ;CHECK TO SEE IF LIT DIFFERED SKIPN MODO ;AND USE SMALLER SINCE AT END JRST [CAMN AC0,ABSHI HRRZM AC2,ABSHI JRST ENDP2W] SKIPE HHIGH ;SKIP IF NOT TWO SEGMENTS JRST [CAMN AC0,HHIGH HRRZM AC2,HHIGH JRST ENDP2W] CAMN AC0,HIGH HRRZM AC2,HIGH ENDP2W: IFN POLISH,< MOVE AC1,SGNCUR CAMN AC0,HIGH HRRM AC2,SGATTR(AC1) > REPEAT 1, REPEAT 0, ;NEEDS FIX TO CREF PUSHJ PP,CLSCR2 ;CLOSE IT UP ENDP2Q: HRR ER,OUTSW ;SET OUTPUT SWITCH SKIPN TYPERR TRO ER,TTYSW PUSHJ PP,UOUT ;OUTPUT UNDEFINEDS TRO ER,TTYSW OUTPUT CTL, ;CLEAR JUNK OUT OF BUFFER SKPINC C ;SEE IF WE CAN INPUT A CHAR. JFCL ;BUT ONLY TO DEFEAT ^O SKIPG C,QERRS ;ANY Q ERRORS SEEN? JRST ENDPER ;NO, TRY REAL ERRORS PUSHJ PP,OUTCR ;NEW LINE MOVEI C,"%" ;WARNING CHARACTER PUSHJ PP,OUTL MOVE C,QERRS ;GET COUNT CAIN C,1 ;1 IS SPECIAL JRST ONERQ PUSHJ PP,DNC ;OUTPUT IT SKIPA CS,[EXP ERRMQ2] ONERQ: MOVEI CS,ERRMQ1 PUSHJ PP,OUTSIX ENDPER: SKIPG C,ERRCNT ;GET ERROR COUNT AND CHECK FOR POSITIVE JRST NOERW ;PRINT NO ERROR MESSAGE IFN CCLSW, PUSHJ PP,OUTCR MOVEI C,"?" ;? FOR BATCH PUSHJ PP,OUTL ;... MOVE C,ERRCNT ;PRINT NUMBER OF ERRORS CAIN C,1 ;1 IS A SPECIAL CASE JRST ONERW ;PRINT MESSAGE PUSHJ PP,DNC SKIPA CS,[EXP ERRMS1] ;LOAD TO PRINT ONERW: MOVEI CS,ERRMS2 ;ONE ERROR DETECTED ONERW1: PUSHJ PP,OUTSIX ;PRINT JRST ENDP2A NOERW: SKIPE QERRS ;IF "Q" ERRORS PUSHJ PP,OUTCR ;CLOSE LINE NOW MOVEI CS,ERRMS3 IFN CCLSW, IFE CCLSW, TRZ ER,TTYSW ;NO TTY OUTPUT IOR ER,OUTSW ;UNLESS NEEDED FOR LISTING SKIPN QERRS ;ALREADY DONE PUSHJ PP,OUTCR JRST ONERW1 ENDP2A: PUSHJ PP,OUTCR TLNN IO,MFLSW ;IN A MULTI-PROG FILE? JRST ENDP2D ;NO SKIPN QERRS ;ANY WARNINGS? SKIPE ERRCNT ;ANY ERROR? PUSHJ PP,[MOVEI CS,[ASCIZ /PROGRAM /] PUSHJ PP,OUTAS0 ;YES,SO PRINT MESSAGE MOVEI CS,TBUF ;AND TITLE PUSHJ PP,OUTAS0 ;FOR IDENTIFICATION JRST OUTCR] ;AND A CR-LF TRZA ER,TTYSW ;NO MORE OUTPUT NOW ENDP2D: IFN CCLSW, IFE CCLSW,< SKIPA ;SO PRGEND CODE CAN WORK> IOR ER,OUTSW ;... PUSHJ PP,OUTCR MOVEI CS,[SIXBIT /HI-SEG. BREAK IS @/] SKIPN HHIGH ;DON'T PRINT IF ZERO JRST ENDP2C ;IT WAS PUSHJ PP,OUTSIX HRLO CS,HHIGH ;GET THE BREAK PUSHJ PP,ONC1 PUSHJ PP,OUTCR ENDP2C: MOVEI CS,[SIXBIT /PROGRAM BREAK IS @/] PUSHJ PP,OUTSIX ;OUTPUT PROGRAM BREAK HRLO CS,SGATTR ;GET PROGRAM BREAK PUSHJ PP,ONC1 PUSHJ PP,OUTCR IFN POLISH,< SKIPN AC1,SGNMAX ;GET PSECT CNT JRST ENDP2E ;PSECTS NOT USED? MOVEI AC2,1 ENDP2F: MOVEI CS,[SIXBIT /PSECT BREAK IS @/] PUSHJ PP,OUTSIX ;OUTPUT PSECT BREAK HRLO CS,SGATTR(AC2) ;GET PSECT BRK PUSHJ PP,ONC1 MOVE CS,[SIXBIT / FOR /] MOVEM CS,SGLIST MOVE CS,SGNAME(AC2) ;GET PSECT NAME MOVEM CS,SGLIST+1 MOVSI CS,SIXBIT/ @ / MOVEM CS,SGLIST+2 MOVEI CS,SGLIST PUSHJ PP,OUTSIX PUSHJ PP,OUTCR AOS AC2 SOJG AC1,ENDP2F ;LOOP THRU PSECT.S ENDP2E:> HRRZ CS,ABSHI ;GET ABS. BREAK CAIG CS,140 ;ANY ABS. CODE JRST ENDP2B ;NO, SO DON'T PRINT MOVEI CS,[SIXBIT /ABSLUTE BREAK IS @/] PUSHJ PP,OUTSIX HRLO CS,ABSHI PUSHJ PP,ONC1 PUSHJ PP,OUTCR ENDP2B: MOVEI CS,[SIXBIT /CPU TIME USED @/] PUSHJ PP,OUTSIX ;[234] PRINT THE TIME IT TOOK TO ASSEMBLE SETZ C, ;[234] SO AS TO GET THE RIGHT TIME RUNTIM C, ;[234] GET THE TIME NOW SUB C,RTIME ;[234] MINUS TIME WHEN STARTED IDIVI C,^D1000 ;[234] GET MS. PUSH PP,C+1 ;[234] SAVE IDIVI C,^D60 ;[234] GET SEC. IN C+1, MIN. IN C PUSH PP,C+1 ;[234] SAVE SECONDS IDIVI C,^D60 ;[234] GET HOURS IN C, MINS. IN C+1 PUSH PP,C+1 ;[234] SAVE MINS JUMPE C,NOHOUR ;[234] SKIP IF LESS THAN 1 HOUR PUSHJ PP,DNC ;[234] PRINT HOURS MOVEI C,":" ;[234] SEPARATOR PUSHJ PP,OUTC ;[234] NOHOUR: POP PP,CS ;[234] GET MINS PUSHJ PP,DECPT2 ;[234] PRINT THEM MOVEI C,":" ;[234] PUSHJ PP,OUTC ;[234] POP PP,CS ;[234] A LITTLE DIFFERENT FOR MS PUSHJ PP,DECPT2 ;[234] PRINT SECONDS MOVEI C,"." ;[234] A POINT FOR MS. PUSHJ PP,OUTC ;[234] POP PP,CS ;[234] GET MS. PUSHJ PP,DECPT3 ;[234] PRINT MS. PUSHJ PP,OUTCR ;[234] AND A CRLF TLNE FR,RIMSW!R1BSW ;RIM MODE? PUSHJ PP,RIMFIN ;YES, FINISH IT IFN CCLSW, IFE CCLSW, TRO ER,TTYSW ;PRINT SIZE PUSHJ PP,OUTCR MOVE C,.JBREL IFN TENEX,< SUB C,SYMBOL ;[206] ONLY COUNT WHATS REALLY IN USE ADD C,FREE ;[206] EITHER SYMBOLS OR STORAGE LSH C,-9 ;[206] IN PAGES > IFE TENEX,< LSH C,-^D10 > ADDI C,1 PUSHJ PP,DNC IFE TENEX,< MOVEI CS,[SIXBIT /K CORE USED@/] > IFN TENEX,< MOVEI CS,[SIXBIT / PAGES USED@/] > PUSHJ PP,OUTSIX PUSHJ PP,OUTCR HRR ER,OUTSW PUSHJ PP,OUTSET XWD 10,LSOUT ;OUTPUT THE LOCALS (..-10) IFN POLISH,< SETZM SGNCUR ;SET TO BLANK PSECT SKIPN SGNMAX ;WERE PSECTS USED? JRST ENDP2H ;NO ENDP2G: PUSHJ PP,SRCHI ;SET UP SRCHX,SGSBOT,SGSTOP PUSHJ PP,SGOUTL ;OUTPUT PSECT LENGTH BLOCK ENDP2H: > PUSHJ PP,OUTSET XWD 2,SOUT ;OUTPUT THE SYMBOLS (BLKTYP-2) IFN POLISH,< AOS SX,SGNCUR ;INCR PSECT INX CAMG SX,SGNMAX ;LAST PSECT DONE? JRST ENDP2G ;NO, DO NEXT PSECT SETZM SGNCUR ;SET TO BLANK PSECT PUSHJ PP,OUTSET ;[164] XWD 11,POUT ;[164] OUTPUT THE POLISH (..-11) MOVSI SX,(POINT 2) ;[164] RESET BYTE COUNT HLLM SX,COUTP ;[164] AFTER END OF POLISH > PUSHJ PP,OUTSET XWD 7,VOUT ;OUTPUT TRANSFER VECTOR (..-7) PUSHJ PP,OUTSET XWD 5,HOUT ;OUTPUT HIGHEST RELOCATABLE (..-5) PUSHJ PP,COUTD TLNN IO,MFLSW ;IS IT PRGEND? JRST FINIS ;ALAS, FINISHED MOVEI CS,SBUF ;RESET SBUF POINTER HRRM CS,SUBTTX ;TO SUBTTL SETZM PASS2I ;CLEAR PASS2 VARIABLES MOVE [XWD PASS2I,PASS2I+1] PUSH PP,PAGENO ;SAVE PAGE NUMBER IN CASE PRGEND BLT PASS2Z-1 ;BUT NOT ALL OF VARIABLES POP PP,PAGENO ;RESTORE IT ; JRST INZ ;RE-INITIALIZE FOR NEXT PROG ; FALL THROUGH SUBTTL PASS INITIALIZE INZ: SETZ C, ;[234] GET CURRENT JOB NUMBER RUNTIM C, ;[234] GET RUNTIME FOR LATER MOVEM C,RTIME ;[234] SAVE INZ1: AOS MODA AOS MODO IFN POLISH,< MOVE AC1,SGNMAX MOVSI AC0,1 MOVEM AC0,SGRELC(AC1) SOJGE AC1,.-1 MOVE AC1,SGNMAX ;[265] GET HIGHEST PSECT USED PUSH PP,AC1 ;[265] SAVE IT INZ2: CAME AC1,SGNCUR ;[265] IF NOT CURRENT PUSHJ PP,%SWSEG ;[265] SWAP IT > MOVEI VARHD MOVEM VARHDX MOVEI LITHD MOVEM LITHDX PUSHJ PP,LITI IFN POLISH,< SOSL AC1,0(PP) ;[265] DONE YET? JRST INZ2 ;[265] NO POP PP,AC1 ;[265] GET JUNK OFF STACK > SETZM SEQNO HRRI RX,^D8 PUSHJ PP,STOWI IFN FORMSW,< HRRES HWFMT ;SET DEFAULT VALUE BACK> JRST OUTLI RCPNTR: POINT 1,ARG,^L-18 ;POINT 1,ARG,22 ;[234] ROUTINE TO PRINT CPU TIME USED DECPT3: MOVEI C,"0" ;[234] FILL WITH ZERO CAIG CS,^D99 ;[234] 3 DIGITS? PUSHJ PP,OUTC ;[234] NO DECPT2: MOVEI C,"0" ;[234] FILL WITH ZERO CAIG CS,^D9 ;[234] 2 DIGITS? PUSHJ PP,OUTC ;[234] NO MOVE C,CS ;[234] GET VALUE PJRST DNC ;[234] OUTPUT IN DECIMAL AND RETURN RIMFIN: TLNE FR,R1BSW PUSHJ PP,R1BDMP SKIPN C,VECTOR MOVSI C,(JRST 4,) TLNN C,777000 TLO C,(JRST) PUSHJ PP,PTPBIN MOVEI C,0 JRST PTPBIN SUBTTL PSEUDO-OP HANDLERS IFN FT.U01,< ;USER PUSH-DOWN LIST $PDUSR: PUSH PP,AC0 ;SAVE INSTR FOR LATER PUSHJ PP,GETSYM ;GET SIXBIT SYMBOL TO PUSH/POP JRST [TRO ER,ERRA ;NO SYMBOL--FLAKY STATEMENT POP PP,AC0 ;KEEP THE STACK HONEST POPJ PP,] ;GIVE UP WITH ERROR FLAG SET PUSHJ PP,SSRCH ;LOOKUP THE SYMBOL JRST [TRO ER,ERRU ;SYMBOL MUST BE DEFINED TO PUSH IT POP PP,AC0 ;CLEAR PDL POPJ PP,] ;GIVE UP POP PP,AC0 ;RESTORE INSTR TLNN AC0,(1B7) ; POP? JRST $PDUS1 ; NOPE, DON'T CHECK FOR UNDERFLOW HRRZ AC1,$USRPD ; GET CURRENT STACK POINTER CAIGE AC1,$USSTK ; IS THE STACK EMPTY? JRST [TRO ER,ERRA ;YES GIVE AN ERROR POPJ PP,] ; GIVE UP WITH AN ERROR $PDUS1: MOVE AC1,$USRPD ;PICK UP USER PDP TLO AC0,(B12) ;PUT LOCATION OF PDP IN INSTR HRRI AC0,V ;SET LOCATION OF DATA XCT AC0 ;PUSH/POP THE SYMBOL MOVEM AC1,$USRPD ;SAVE PDP FOR LATER TLNE AC0,(1B7) ;WAS THIS A PUSH? PUSHJ PP,UPDATE ;NO--RESET VALUE OF SYMBOL CAIN C,',' ;ANOTHER SYMBOL COMING? JRST $PDUSR ;YES--GO HANDLE IT POPJ PP, ;NO--GET NEXT STATEMENT >;END IFN FT.U01 TAPE0: PUSHJ PP,STOUTS ;FINISH THIS LINE SETZM EOFFLG ;[417]CLEAR END OF FILE FLAG PUSHJ PP,PEEK ;[221] LOOK AT NEXT CHARACTER CAIE C,VT ;[221] PRINT IF V TAB CAIN C,FF ;[221] OR FORM FEED PUSHJ PP,STOUTS ;[221] TLZ IO,IORPTC ;[221] CLEAR CHARACTER FROM LOOK-AHEAD PUSHJ PP,OUTLI2 ;[221] AND FROM LINE BUFFER SKIPE EOFFLG ;[417]IF EOF SEEN DURING PEEKING POPJ PP, ;[417]DON'T SKIP ANOTHER FILE, ELSE JRST GOTEND ;IGNORE THE REST OF THIS FILE %NOBIN: TLZE FR,PNCHSW ;IS REL FILE OPEN? CLOSE BIN,40 ;YES, GET RID OF IT POPJ PP, RADIX0: PUSHJ PP,EVAL10 ;EVALUATE RADIX D10 CAIG AC0,^D10 ;IF GREATER THAN 10 CAIG AC0,1 ;OR LESS THAN 2, ERRAX: TROA ER,ERRA ;FLAG ERROR AND SKIP HRR RX,AC0 ;SET NEW RADIX POPJ PP, XALL0: JUMP1 POPOUT ;IGNORE ON PASS 1 TLZN IO,IOSALL ;TURN OFF MACRO SUPPRESS ALL JRST IOSET ;NOT SALL ON SO NOTHING TO WORRY ABOUT CAIE C,EOL ;END OF LINE SEEN? JRST XALL1 ;NO LDB C,LBUFP ;GET LAST CHARACTER CAIN C,CR ;UNDER SPECIAL CIRCUMSTANCES IT GETS REMOVED JRST XALL1 ;[236] NO, ALL IS WELL SOSG CPL ;ANY ROOM? PUSHJ PP,RSW5 ;[254] NO, SEE IF ANY EXCESS IN IT MOVEI C,CR ;NOW FOR TERMINAYOR IDPB C,LBUFP ;WILL GET REMOVED LATER XALL1: PUSHJ PP,IOSET ;[236] FINISH OFF LINE TRNN SX,IOPALL ;[236] WAS IT XALL OR XLIST? TLO IO,IOSALL ;[236] IT WAS XLIST POPJ PP, ;[236] IOSET: JUMP1 POPOUT ;NOSYM (IONSYM), XALL (IOPALL), XLIST (IOPROG) HLRZ SX,AC0 ;STORE FLAGS PUSHJ PP,STOUTS ;POLISH OFF LINE TLO IO,0(SX) ;NOW SUPRESS PRINTING POPJ PP, IORSET: TDZ IO,AC0 ;RESET FLAG IOPALL/IOPROG POPJ PP, IOLSET: JUMP1 POPOUT ;[327] SPECIAL FOR LALL, TO SEE IF IN MACRO UNDER SALL TLNE IO,IOSALL ;[327] SEE IF SALL JUMPN MRP,IOLSE1 ;[327] AND IN MACRO TDZ IO,AC0 ;[327] NO, CHANGE TO LALL POPJ PP, ;[327] AND RETURN IOLSE1: PUSHJ PP,STOUTS ;[327] LALL UNDER MACRO, CLEAR REST OF LINE TLZ IO,IOSALL!IOPALL ;[327] ****** SET TO LALL PUSHJ PP,OUTIM ;[327] FORCE A CRLF POPJ PP, ;[327] AND RETURN BLOCK0: PUSHJ PP,HIGHQ PUSHJ PP,EVALEX ;EVALUATE TLNE AC0,-1 ;[233] SEE IF VALID ARG TYPE JRST ERRAX ;[233] NO, GIVE ERROR TRZE RC,-1 ;EXTERNAL OR RELOCATABLE? PUSHJ PP,QEXT ;YES, DETERMINE TYPE ADDM AC0,LOCO ;UPDATE ASSEMBLY LOCATION BLOCK1: EXCH AC0,LOCA ;SAVE START OF BLOCK ADDM AC0,LOCA ;UPDATE OUTPUT LOCATION BLOCK2: HRLOM AC0,LOCBLK JUMP2 POPOUT TRNE ER,ERRU TRO ER,ERRV POPJ PP, PRNTX0: TRO ER,TTYSW ;SET OUTPUT TO TTY JUMP2 PRNTX2 ;PASS1? TDOA ER,OUTSW ;YES,OUTPUT TO LSTDEV ALSO PRNTX2: ANDCM ER,OUTSW ;NO,DON'T OUTPUT TO TTY IF IT IS LSTDEV BYPASS ;GET FIRST CHAR. TLOA IO,IORPTC ;REPEAT IT AND SKIP PRNTX4: PUSHJ PP,PRINT ;PRINT THE CHAR. PUSHJ PP,CHARAC ;GET ASCII CHAR. CAIG C,CR ;IF GREATER THAN CR CAIG C,HT ;OR LESS THAN LF JRST PRNTX4 ;THEN CONTINUE PUSHJ PP,OUTCR ;OUTPUT A CRLF TRZA ER,TTYSW!LPTSW ;TURN OF OUTPUT CPOPJ1: AOS (PP) ;USEFUL TAG HAS TO GO SOMEWHERE CPOPJ: POPJ PP, ;EXIT REMAR0: PUSHJ PP,GETCHR ;GET A CHARACTER REMAR1: CAIE C,EOL JRST REMAR0 POPJ PP, ;EXIT PAGE0: PUSHJ PP,STOUTS ;[161] PAGE PSEUDO-OP PAGE1: TLNE IO,IOCREF ;[161] CURRENTLY DOING CREF? TLNE IO,IOPROG ;[161] AND NOT XLISTED? JRST PAGE2 ;[161] NO HRR ER,OUTSW ;[161] PUSHJ PP,CLSCRF ;[161] PUSHJ PP,OUTCR HRRI ER,0 ;[161] PAGE2: TLO IO,IOPAGE ;[161] POPJ PP, ;[161] LIT0: PUSHJ PP,BLOCK1 PUSHJ PP,STOUTS LIT1: JUMP2 LIT20 ;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR MOVE AC0,LITCNT MOVE SX,LITHDX HRLM AC0,0(SX) MOVE V,LOCA HRL V,MODA MOVEM V,-1(SX) JRST LIT24 LIT20: PUSH PP,LOCA PUSH PP,LOCO SKIPN LITNUM JRST LIT20A MOVE SX,LITHDX HRRZ AC0,-1(SX) CAME AC0,LOCA TRO ER,ERRP LIT20A: MOVE SX,LITAB LIT21: SOSGE LITNUM JRST LIT22 IFN FORMSW,< MOVE AC0,-3(SX) MOVEM AC0,FORM > MOVE AC0,-2(SX) ;WFW MOVE RC,-1(SX) ;WFW MOVE SX,(SX) ;WFW POINTER TO THE NEXT LIT PUSHJ PP,STOW20 ;STOW CODE MOVEI C,12 ;SET LINE FEED IDPB C,LBUFP PUSHJ PP,OUTLIN ;OUTPUT THE LINE JRST LIT21 LIT22: HRRZ AC2,LOCO POP PP,LOCO POP PP,LOCA MOVE SX,LITHDX HLRZ AC0,0(SX) SUB AC2,LOCO ;COMPUTE LENGTH USED CAMGE AC0,AC2 ;USE LARGER MOVE AC0,AC2 ADD AC2,LOCO LIT24: ADDM AC0,LOCA ADDM AC0,LOCO PUSHJ PP,GETTOP HRRM SX,LITHDX LITI: SETZM LITCNT SETZM LITNUM MOVEI LITAB MOVEM LITABX JRST HIGHQ GETTOP: HRRZ AC1,SX ;VARHD HRRZ SX,0(SX) JUMPN SX,POPOUT IFE FORMSW,< MOVEI SX,3 ;WFW> IFN FORMSW,< MOVEI SX,4 ;ICC> ADDB SX,FREE CAML SX,SYMBOL PUSHJ PP,XCEED SUBI SX,1 ;MAKE SX POINT TO LINK SETZM 0(SX) ;CLEAR FORWARD LINK HRRM SX,0(AC1) ;STORE ADDRESS IN LAST LINK POPJ PP, VAR0: PUSHJ PP,BLOCK1 ;PRINT LOCATION PUSHJ PP,VARA JRST STOUTS VARA: MOVE SX,VARHDX MOVE AC0,LOCA ;GET LOCATION FOR CHECK JUMP1 VARB ;DO NOT CHECK START ON PASS 1 CAME AC0,-1(SX) ;CHECK START OF VAR AREA TRO ER,ERRP ;AND GIVE ERROR VARB: MOVEM AC0,-1(SX) ;SAVE START FOR PASS 2 HLRZ AC0,0(SX) ADDM AC0,LOCA ADDM AC0,LOCO PUSHJ PP,GETTOP HRRM SX,VARHDX JUMP2 POPOUT PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN TRZN ARG,VARF POPJ PP, ;NO, EXIT TRZ ARG,UNDF ;TURN OFF FLAG NOW MOVSI AC0,1(V) ;NUMBER TO ADD TO ADDM AC0,0(AC1) ;UPDATE COUNT VARA1: ADDI V,1 ;GET LENGTH OF DESIRED BLOCK ADDM V,LOCO EXCH V,LOCA ADDM V,LOCA HRL ARG,V ;GET STARTING LOCATION AND UPDAT PCS IOR ARG,MODA ;SET TO ASSEMBLY MODE MOVSM ARG,0(SX) ;UPDATE 2ND WRD OF SYM TAB ENTRY JRST HIGHQ1 IF: PUSH PP,AC0 ;SAVE AC0 PUSH PP,IO PUSHJ PP,EVALXQ ;EVALUATE AND TEST EXTERNAL POP PP,AC1 IORI ER,(AC1) ;[124] RESTORE PREVIOUS ERROR FLAGS JUMPL AC1,IFPOP TLZ IO,FLDSW IFPOP: POP PP,AC1 ;RETRIEVE SKIP INSTRUCTION IFSET: TLO IO,IORPTC ;REPEAT CHARACTER IFXCT: XCT AC1 ;EXECUTE INSTRUCTION IFXF: TDZA AC0,AC0 ;FALSE IFXT: MOVEI AC0,1 ;TRUE IFEXIT: SETZM EXTPNT ;JUST IN CASE IFN POLISH,< TLZ IO,RSASSW ;[265] ... > JUMPOC IFDO ;[140] BRANCH IF IN OP-CODE FIELD IFEX1: PUSHJ PP,GETCHR ;SEARCH FOR "<" CAIN C,EOL ;ERROR IF END OF LINE JRST ERRAX CAIE C,'<' JRST IFEX1 JUMPE AC0,IFEX2 ;TEST FOR 0 TLO IO,IORPTC ;NO, PROCESS AS CELL PUSHJ PP,CELL IFN FORMSW, SETZM INCND ;NOT ANY MORE JRST STOW ;STOW CODE AND EXIT IFDO: BYPASS ;[140] GET NEXT NON-3LANK CAIN C,EOL ;[272] AT EOL? JRST REPEA1 ;[272] YES, USE OLD METHOD CAIE C,',' ;[260] ARE WE AT THE COMMA? CAIN C,'<' ;[260] OR START OF CONDITIONAL? CAIA ;[260] YES JRST IFDO ;[260] NOT YET AT COMMA OR ANGLE BRKT CAIN C,',' ;[260] IGNORE THE COMMA PUSHJ PP,BYPAS1 ;[140] AND GET SOMETHING ELSE TLO IO,IORPTC ;[140] REPEAT LAST CHAR. CAIE C,'<' ;[140] OLD METHOD USED ANGLES CAIN C,EOL ;[140] ALSO OLD IF NEW LINE SEEN JRST REPEA1 ;[140] ASSEMBLE CODE BETWEEN ANGLES JUMPLE AC0,REMAR0 ;[140] FALSE, TREAT AS COMMENT JRST STMNT ;[140] TRUE, ASSEMBLE IT IFPASS: HRRI AC0,P1 ;MAKE IT TLNX IO,P1 MOVE AC1,AC0 ;PLACE IT IN AC1 JRST IFSET ;EXECUTE INSTRUCTION IFB0: HLLO AC1,AC0 ;FORM AND STORE TEST INSTRUCTION IFB1: PUSHJ PP,CHARL ;GET FIRST NON-BLANK CAIE C," " CAIN C," " JRST IFB1 ;SKIP BLANKS AND TABS CAIG C,CR ;CHECK FOR CARRET AS DELIM. CAIGE C,LF CAIA JRST ERRAX FORERR (SX,CND) SETOM INCND ;SAVE INFO. FOR PASS 1 ERRORS CAIN C,"<" ;LEFT BRACKET? SETZB C,RC ;YES, PREPARE FOR OLD FORMAT SKIPA SX,C ;SAVE FOR COMPARISON IFB3: TRO AC0,1 ;SET FLAG IFB2: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST CAMN C,SX ;TEST FOR DELIMITER JRST IFXCT ;FOUND CAIE C," " ;BLANK? CAIN C," " ;OR TAB? JRST IFB2 ;YES JUMPN SX,IFB3 ;JUMP IF NEW FORMAT CAIN C,"<" ;" ;>? SOJL RC,IFXCT ;YES, DECREMENT AND EXIT IF DONE JRST IFB3 ;GET NEXT CHARACTER IFDEF0: HRRI AC0,UNDF ;MAKE IT TLNX ARG,UNDF PUSH PP,AC0 ;STACK IT PUSHJ PP,GETSYM ;TAKES SKIP RETURN IF SYM NAME IS LEGAL TROA ER,ERRA ;ILLEGAL! PUSHJ PP,SEARCH JRST [PUSHJ PP,OPTSCH TLO ARG,UNDF JRST .+1] PUSHJ PP,SSRCH3 ;EMIT TO CREF ANYWAY JRST IFPOP ;POP AND EXECUTE INSTRUCTION IFIDN0: HLRZS AC0 MOVEI V,2*.IFBLK-1 SETZM IFBLK(V) ;CLEAR COMPARISON BLOCK SOJGE V,.-1 SETZM .TEMP ;CLEAR STORED DELIMETER MOVEI RC,IFBLK ;SET FOR FIRST BLOCK PUSHJ PP,IFCL ;GET FIRST STRING MOVEI RC,IFBLKA PUSHJ PP,IFCL ;GET SECOND STRING MOVEI V,.IFBLK-1 MOVE SX,IFBLK(V) ;GET WORD FROM FIRST STRING CAMN SX,IFBLKA(V) ;COMPARE WITH SECOND STRING SOJGE V,.-2 ;EQUAL, TRY NEXT WORD JUMPL V,IFEXIT ;DID WE FINISH STRING XORI AC0,1 ;NO, TOGGLE REQUEST JRST IFEXIT ;DO NOT TURN ON IORPTC WFW IFCL: PUSHJ PP,CHARAC ;GET AND LIST CHARACTER CAIE C," " ;SKIP SPACES CAIG C,CR ;ALSO SKIP CR-LF CAIGE C,HT ;AND TAB JRST .+2 ;NOT ONE OF THEM JRST IFCL ;SO LONG COMPARISONS WILL WORK ;*** A CROCK SO THAT IFIDN ,, WILL WORK *** CAIE C,"," ;IS IT A COMMA? JRST .+3 ;NO SKIPN .TEMP ;YES, WAS PREVIOUS FIELD OLD METHOD? JRST IFCL ;YES, IGNORE COMMA AND SPACES ; *** CAIN C,"<" ;WAS IT LEFT BRACKET? SETO C, ;SIGNAL OLD METHOD, LOOK FOR RIGHT BRACKET MOVEM C,.TEMP ;STORE TERMINATOR FOR COMPARISON MOVEI SX,5*.IFBLK-1 ;LIMIT SEARCH HRLI RC,(POINT 7,,) ;SET UP BYTE IN RC IFCLR: PUSHJ PP,CHARAC SKIPLE .TEMP ;NEW METHOD? JRST IFCLR1 ;YES, IGNORE ANGLE BRACKET COUNTING CAIN C,"<" ;ANOTHER LEFT ANGLE? SOS .TEMP ;YES, KEEP COUNT CAIN C,">" ;CLOSING ANGLE AOSGE .TEMP ;MATCHING COUNT? IFCLR1: CAMN C,.TEMP ;TEST FOR DELIMITER POPJ PP, ;EXIT ON RIGHT DELIMITER SOJG SX,.+2 ;ANY ROOM IN COMPARISON BLOCK? TROA ER,ERRA ;NO, FLAG ERROR BUT KEEP ON GOING IDPB C,RC ;DEPOSIT BYTE JRST IFCLR IFEX2: PUSHJ PP,GETCHR CAIN C,EOL ;EXIT WITH ERROR IF END OF LINE JRST ERRAX CAIN C,34 ;"<"? AOJA AC0,IFEX2 ;YES, INCREMENT COUNT CAIE C,36 ;">"? JRST IFEX2 ;NO, TRY AGAIN SOJGE AC0,IFEX2 ;YES, TEST FOR MATCH BYPASS ;YES, MOVE TO NEXT DELIMITER SETZM INCND ;OUT OF CONDITIONAL NOW AOJA AC0,STOWZ1 ;STOW ZERO INTER0: HLLZM AC0,INTENT ;AC0 CONTAINS INTF/ENTF FLAGS INTER1: PUSHJ PP,GETSYM ;GET A SYMBOL JRST INTER3 ;INVALID, SKIP PUSHJ PP,SSRCH ;SEARCH THE TABLE MOVSI ARG,SYMF!INTF!UNDF PUSHJ PP,SUPSYM ;[167] SEE IF "!" SEEN TLNN ARG,UNDF ;ALLOW FORWARD REFERENCE TLNN ARG,SYNF!EXTF TDOA ARG,INTENT ;SET APPROPRIATE FLAGS INTER3: TROA ER,ERRA ;FLAG ARG EROR AND SKIP PUSHJ PP,INSERQ ;INSERT/UPDATE JUMPCM INTER1 SETZM EXTPNT ;JUST IN CASE, SO AS NOT TO CONFUSE WORLD IFN POLISH,< TLZ IO,RSASSW ;[265] ... > POPJ PP, ;NO, EXIT ;.IF SYMBOL ATTRIBUTE %IF: PUSHJ PP,GETSYM ;[271] GET THE SYMBOL JRST %IFNUMERIC ;[271] MIGHT WANT THIS ATTRIBUTE PUSHJ PP,SEARCH ;[271] GENERAL SEARCH JRST IFXF ;[271] FAILED IF NOT IN TABLE TLO IO,IORPTC ;[271] GET FIRST CHAR PUSHJ PP,GETSYM ;[271] GET ATTRIBUTE JRST ERRAX ;[271] MUST BE A SYMBOL SETO AC1, ;[271] MASK IFLOOP: MOVSI AC2,-IFLEN ;[271] AOBJN PTR MOVE SDEL,IFATAB(AC2);[271] GET NAME AND SDEL,AC1 ;[271] MASK CAMN AC0,SDEL ;[271] MATCH JRST IFOUND ;[271] GOT IT AOBJN AC2,IFLOOP+1 ;[271] LOOP JUMPGE AC1,ERRAX ;[271] NOT IN TABLE TDNN AC0,AC1 ;[271] SET MASK JRST IFLOOP ;[271] SET LSH AC1,-6 ;[271] TRY NEXT CHAR JUMPN AC1,.-3 ;[271] TRY AGAIN HALT ;[271] ? IFOUND: XCT IFJTAB(AC2) ;[274] JRST IFXF ;[271] FALSE JRST IFXT ;[271] TRUE DEFINE IFATRIB < XX SYMBOL, XX SYNONYM, XX MACRO, XX OPDEF, XX EXTERNAL XX ENTRY, XX INTERNAL XX GLOBAL XX LOCAL XX LABEL, XX ASSIGNMENT XX ABSOLUTE, XX RELOCATABLE, XX LRELOCATABLE, XX RRELOCATABLE, XX NUMERIC,JFCL > DEFINE XX (A,B)< > IFATAB: IFATRIB IFLEN==.-IFATAB DEFINE XX (A,B)< IFB ,< PUSHJ PP,%IF'A > IFNB ,< B >> IFJTAB: IFATRIB %IFEXTERNAL: TLNE ARG,EXTF ;[271] ENTERNAL? AOS (PP) ;[271] YES POPJ PP, %IFINTERNAL: TLNN ARG,EXTF!SPTR ;[271] EXTERN? AOS (PP) POPJ PP, %IFGLOBAL: TLNE ARG,EXTF!INTF!ENTF AOS (PP) POPJ PP, %IFLOCAL: TLNN ARG,EXTF!SPTR AOS (PP) POPJ PP, %IFASSIGNMENT: TLNE ARG,SYMF TLNE ARG,TAGF POPJ PP, JRST CPOPJ1 %IFNUMERIC: TLNE IO,NUMSW ;[271] MUST BE NUMERIC PUSHJ PP,GETSYM ;[271] GET ATTRIBUTE JRST ERRAX ;[271] ERROR SETO AC1, ;[271] MASK TDNN AC0,AC1 ;[271] SET IT UP JRST .+3 ;[271] DONE LSH AC1,-6 JRST .-3 ;[271] TRY AGAIN MOVE SDEL,['NUMERI'] ;[271] ONLY VALID ONE AND SDEL,AC1 ;[271] MASK OUT ONES WE DON'T CARE ABOUT CAMN AC0,SDEL ;[271] MATCH? AOS (PP) ;[271] TRUE POPJ PP, ;ASSIGN PSEUDO-OP FOR TENEX ;ASSIGN SYM1,SYM2,INCR ASGN: PUSHJ PP,COUTD ;DUMP BUFFER PUSH PP,BLKTYP ;SAVE BLOCK TYPE MOVEI AC0,100 ;ASSIGN BLOCK TYPE MOVEM AC0,BLKTYP PUSHJ PP,GETSYM ;HERE TO ASGN6 COPIED FROM EXTERN JRST ASGN2 TLO IO,DEFCRS ;FLAG AS DEFINITION PUSHJ PP,SSRCH JRST ASGN1 TLNN ARG,EXTF!VARF!UNDF JRST ASGN2 TLNE ARG,EXTF JRST [JUMP1 ASGN6 TLZN ARG,UNDF JRST ASGN6 ANDM ARG,(SX) JRST ASGN1] ASGN1: MOVEI V,2 ADDB V,FREE CAML V,SYMBOL PUSHJ PP,XCEEDS SUBI V,2 SETZB RC,0(V) MOVSI ARG,SYMF!EXTF PUSHJ PP,INSERT MOVSI ARG,PNTF IORM ARG,0(SX) MOVE AC0,-1(SX) MOVEM AC0,1(V) ASGN6: MOVE AC0,-1(SX) SETZ ARG, PUSHJ PP,SQOZE ;CONVERT TO SQUOZE PUSHJ PP,COUT ;OUTPUT FIRST SYMBOL JUMPNC ASGN2 ;MUST BE COMMA HERE PUSHJ PP,GETSYM ;SECOND SYMBOL JRST ASGN2 MOVEI SDEL,%SYM ;OUTPUT TO CREF PUSHJ PP,CREF SETZ ARG, PUSHJ PP,SQOZE ;CONVERT TO SQUOZE PUSHJ PP,COUT JUMPNC ASGN3 ;COMMA? PUSHJ PP,EVALXQ ;YES, EVALUATE INCREMENT ASGN4: PUSHJ PP,COUT JUMP1 ASGN7 ;DON'T OUTPUT IF PASS1 PUSHJ PP,COUTD ;OUTPUT 3 WORDS ASGN5: POP PP,BLKTYP ;RESTORE BLOCK TYPE POPJ PP, ASGN3: MOVEI AC0,1 ;INCREMENT IS 1 IF NOT SPECIFIED JRST ASGN4 ASGN2: TRO ER,ERRE ;INDICATE ASGN7: PUSHJ PP,COUTI ;CLEAR OUTPUT BUFFER JRST ASGN5 EXTER0: PUSHJ PP,GETSYM ;GET A SYMBOL JRST EXTER4 ;INVALID, ERROR EXTER1: TLO IO,DEFCRS ;FLAG THIS AS A DEFINITION EXTER5: PUSHJ PP,SSRCH ;[267] OK, SEARCH SYMBOL TABLE JRST EXTER2 ;NOT THERE, INSERT IT TLNN ARG,EXTF!VARF!UNDF TROA ER,ERRE ;FLAG ERROR AND BYPASS TLNE ARG,EXTF ;VALID, ALREADY DEFINED? JRST [JUMP1 EXTER3 ;YES, BYPASS TLZN ARG,UNDF ;SKIP IF UNDEFINED ALSO JRST EXTER3 ;CONTINUE ANDM ARG,(SX) ;CLEAR UNDF ON PASS 2 JRST EXTER2] ;SET UP EXTERNAL NOW EXTER2: MOVEI V,2 ;NO, GET 2 CELLS FROM THE TREE ADDB V,FREE CAML V,SYMBOL ;HAVE WE RUN OUT OF CORE? PUSHJ PP,XCEEDS ;YES, TRY TO BORROW SOME MORE SUBI V,2 ;GET RIGHT CELL FOR POINTER SETZB RC,0(V) ;ALL SET, ZERO VALUES MOVSI ARG,SYMF!EXTF PUSHJ PP,SUPSYM ;[167] SEE IF "!" SEEN PUSHJ PP,INSERT ;INSERT/UPDATE IT MOVSI ARG,PNTF IORM ARG,0(SX) SKIPA ARG,-1(SX) ;GET THE SIXBIT FOR THE NAME EXTER4: TROA ER,ERRA ;FLAG AS ERROR MOVEM ARG,1(V) ;AND STORE IT FOR ADDITIVE GLOBAL FIXUPS EXTER3: PUSHJ PP,SUPSYM ;[167] SEE IF "!" SEEN JUMPCM EXTER0 POPJ PP, ;NO, EXIT EVAL10: PUSH PP,RX HRRI RX,^D10 PUSHJ PP,EVALEX ;EVALUATE POP PP,RX ;RESET RADIX JUMPE RC,POPOUT ;EXIT IF ABSOLUTE QEXT: IFN POLISH,< TLNE FR,POLSW ;[164] ANY POLISH EXTERNAL EXPRESSIONS JRST QPOL ;[164] YES, REMOVE AND FLAG ERROR > SKIPE EXTPNT ;ANY POSSIBILITIES? TROA ER,ERRE ;YES, FLAG EXTERNAL ERROR TRO ER,ERRR ;NO, FLAG RELOCATION ERROR HLLZS RC ;CLEAR RELOCATION/EXTERNAL POPJ PP, IFN POLISH,< QPOL: TRO ER,ERRE ;[164] FLAG EXTERNAL ERROR PUSH PP,AC1 ;[164] GET AN AC MOVE AC1,POLIST ;[164] GET LAST ITEM IN LIST MOVEM AC1,FREE ;[164] RESET FREE CORE POINTER MOVE AC1,(AC1) ;[164] GET PREVIOUS ITEM MOVEM AC1,POLIST ;[164] MAKE IT TOP OF LIST POP PP,AC1 ;[164] POPJ PP, ;[164] > EVALXQ: PUSH PP,IO ;[222] SAVE ERROR STATUS TRZ ER,-1 ;[222] START AFRESH PUSHJ PP,EVALQ ;[222] EVALUATE EXPRESSION TRNE ER,ERRU ;[222] TEST FOR UNDEF TRO ER,ERRV ;[222] FLAG "V" ERROR HLLM IO,(PP) ;[222] STORE STATUS FLAGS IORM ER,(PP) ;[222] COMPOUND ERRORS POP PP,IO ;[222] RESTORE THEM POPJ PP, ;[222] EVALQ: PUSHJ PP,EVALEX ;EVALUATE EXPRESSION TDZE RC,[-2,,-2] ;WAS AN EXTERNAL FOUND? TRO ER,ERRE ;YES, FLAG ERROR POPJ PP, ;RETURN OPDEF0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL POPJ PP, ;ERROR IF INVALID SYMBOL CAIE C,73 ;"["? JRST ERRAX ;NO, ERROR PUSH PP,AC0 ;STACK MNEMONIC AOS LITLVL ;SHORT OUT LOCATION INCREMENT PUSHJ PP,STMNT ;EVALUATE STATEMENT SKIPGE STPX ;CODE STORED? TROA ER,ERRA ;NO,"A" ERROR PUSHJ PP,DSTOW ;GET AND DECODE VALUE SOS LITLVL EXCH AC0,0(PP) ;EXCHANGE VALUE FOR MNEMONIC PUSH PP,RC ;STACK RELOCATION TLO IO,DEFCRS ;SAY WE ARE DEFINING IT PUSHJ PP,MSRCH ;SEARCH SYMBOL TABLE MOVSI ARG,OPDF ;NOT FOUND POP PP,RC ;RESTORE VALUES POP PP,V TLNE ARG,SYNF!MACF TRO ER,ERRA ;YES "A" ERROR TRNN ER,ERRA ;ERROR? PUSHJ PP,INSERT ;NO, INSERT/UPDATE PUSHJ PP,ASSIG7 ;[135] LIST VALUE LIKE = TLZ IO,DEFCRS ;JUST IN CASE BYPASS JRST STOWI ;BE SURE STOW IS RESET DEPHA0: MOVE AC0,LOCO SKIPA RC,MODO ;SET TO OUTPUT VALUES AND SKIP PHASE0: PUSHJ PP,EVALXQ ;EVALUATE AND CHECK FOR EXTERNAL MOVEM AC0,LOCA ;SET ASSEMBLY LOCATION COUNTER MOVEM RC,MODA JRST BLOCK2 ASSIGN: JUMPAD ERRAX ;NO, ERROR PUSHJ PP,ASSIG1 TLNE IO,IOSALL ;SUPPRESS ALL? JUMPN MRP,CPOPJ ;IF IN MACRO ASSIG7: MOVEM RC,ASGBLK TRNE RC,-2 ;EXTERNAL HLLZS ASGBLK ;YES,CLEAR RELOCATION TLNE RC,1 ;LEFT HALF NOT RELOC? TLNE RC,-2 ;... HRROS ASGBLK ;YES, SET FLAG MOVEM V,LOCBLK POPJ PP, ASSIG1: PUSH PP,AC0 ;SAVE SYMBOL MOVEM AC0,INASGN ;[164] INCASE POLISH FIXUP REQUIRED SETZB AC0,EXTPNT ;SPECIAL CHECK FOR == WFW ASSIG4: PUSHJ PP,PEEK ;IS THE NEXT ON = CAIE C,"=" CAIN C,"!" CAIA ;[406]WANT TO SUPRESS SYMBOL JRST ASSIG5 ;[406]NOT "=" OR "!",SO SEE IF COLON TLOE AC0,NOOUTF ;[406]TURN ON "NO-OUTPUT" FLAG TRO ER,ERRQ ;[406]IF ALREADY ON, GIVE ERROR PUSHJ PP,GETCHR ;PROCESS THE CHAR. PUSHJ PP,PEEK ;CHECK FOR ==: DMN ASSIG5: CAIE C,":" ;IS IT JRST ASSIG6 ;NO TLOE AC0,INTF ;[406]FLAG AS INTERNAL TRO ER,ERRQ ;[406]IF ALREADY ON, ITS AN ERROR PUSHJ PP,GETCHR ;REPEAT IT JRST ASSIG4 ;TRY AGAIN (MIGHT BE =:!) ASSIG6: MOVEM AC0,HDAS ;STORE THESE BITS WFW PUSHJ PP,EVALCM ;EVALUATE EXPRESSION SETZM INASGN ;[164] FINISHED WITH POLISH BY NOW EXCH AC0,0(PP) ;SWAP VALUE FOR SYMBOL PUSH PP,RC TRNN RC,-2 ;CHECK EXTERNAL AGREEMENT JRST ASSIG2 HRRZS RC HRRZ ARG,EXTPNT CAME RC,ARG PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR ASSIG2: HLRZ RC,(PP) TRNN RC,-2 JRST ASSIG3 HLRZ ARG,EXTPNT CAME RC,ARG PUSHJ PP,QEXT ASSIG3: TLO IO,DEFCRS PUSH PP,UNISCH+1 ;SAVE SEARCH LIST SETZM UNISCH+1 ;BUT DISALLOW PUSHJ PP,SSRCH MOVSI ARG,SYMF POP PP,UNISCH+1 ;RESTORE STATUS IOR ARG,HDAS ;WFW TLNE ARG,UNDF ;WAS IT UNDEFINED TLZ ARG,EXTF!PNTF ;YES,CLEAR EXTF NOW TLZ ARG,UNDF!VARF ;CANCEL UNDEFINED AND VARIABLE FLAGS SETZM EXTPNT ;FOR REST OF WORLD IFN POLISH,< TLZ IO,RSASSW ;[265] ... > POP PP,RC TRNE ER,ERRORS-ERRQ SETZ RC, ;CLEAR RELOCATION POP PP,V TRNE ER,ERRU ;WAS VALUE UNDEFINED? TLO ARG,UNDF ;YES,SO TURN UNDF ON TLNE ARG,TAGF!EXTF JRST ERRAX JRST INSERT ;LOC, RELOC, AND ORG COME HERE %ORG: PUSH PP,AC0 ;SAVE TYPE PUSHJ PP,HIGHQ ;GET LATEST PC BYPASS ;SKIP BLANKS TLO IO,IORPTC ;REPEAT LAST CAIN C,EOL ;USE PREVIOUS VALUE IF NULL ARGUMENT JRST ORG03 PUSHJ PP,EVALXQ ;GET EXPRESSION AND TEST EXTERNAL SKIPGE (PP) ;ORG? HRLM RC,(PP) ;YES, SAVE RELOC OF ARG ORG01: HRRM AC0,(PP) ;STORE NEW VALUE IFE POLISH,< HLRZ AC1,(PP) ;GET MODE HRRZ AC0,LOCO ;PC OF OUTPUT CAMN AC1,MODO ;MODE SAME? JRST [MOVEM AC0,@REL1P(AC1) ;SAVE NEW VALUE JRST ORG02] MOVEM AC0,@ABS1P(AC1) ;SAVE NEW VALUE ORG02: MOVE AC0,MODO ;SAVE OLD MODE MOVEM AC0,ORGMOD > IFN POLISH,< HRRZ AC0,LOCO ;PC OF OUTPUT MOVE AC1,MODO ;OLD MODE MOVEM AC0,@REL1P(AC1) ;SAVE OLD VALUE MOVE AC0,MODO ;SAVE OLD MODE MOVEM AC0,ORGMOD MOVE AC1,SGNCUR ;CURRENT PSECT INDEX MOVE AC0,HIGH ;SAVE PSECT BREAK HRRM AC0,SGATTR(AC1) HRR AC0,RELLOC ;SAVE PSECT REL PC HRL AC0,ORGMOD ;SAVE PSECT MODE MOVEM AC0,SGRELC(AC1) > POP PP,AC0 ;GET RESULT ORG2A: HLRZM AC0,MODA ;SET MODES HLRZM AC0,MODO HRRZM AC0,LOCA ;AND LOCATIONS HRRZM AC0,LOCO JRST BLOCK2 ORG03: HRRZ AC0,ORGMOD ;GET PREV MODE SKIPGE (PP) ;ORG? HRLM AC0,(PP) ;YES, SAVE IT HLRZ AC1,(PP) ;NEW MODE MOVE AC0,@REL1P(AC1) ;GET PREV VALUE JRST ORG01 REL1P: EXP ABSLOC ABS1P: EXP RELLOC EXP ABSLOC ; .PSECT NAME /ATTRIB,ORIGIN IFN POLISH,< %SEGME: SKIPN HISNSW ;CAN'T HAVE PSECTS WITH SKIPE UNIVSN ; HISEG, TWOSEG OR JRST ERRSX ; UNIVERSAL MOVE AC2,SGDMAX ;CHECK IF MAX PSECT CAILE AC2,SGNDEP-1 ; NESTING DEPTH EXCEEDED JRST ERRSX ;YES PUSHJ PP,GETSYM ;GET PSECT NAME PUSHJ PP,[SETZ AC0, ;NONE SPECIFIED, BLANK NAME TRZ ER,ERRA ;UNDO GETSYM'S ERR FLAG POPJ PP,] MOVE AC1,SGNMAX ;GET PSECT COUNT %SEGM1: CAMN AC0,SGNAME(AC1) ;SEEN THIS NAME BEFORE? JRST %SEGM2 ;YES SOJGE AC1,%SEGM1 ;LOOP THRU KNOWN NAMES MOVE AC1,SGNMAX ;CHECK IF MAX DISTINCT PSECT CAILE AC1,SGNSGS-1 ; LIMIT EXCEEDED JRST ERRSX ;YES AOS AC1,SGNMAX ;INCR PSECT COUNT MOVEM AC0,SGNAME(AC1) ;STORE PSECT NAME MOVSI AC2,1 ;SET MODE TO RELOC MOVEM AC2,SGRELC(AC1) ; AND PC TO ZERO HRRZS SGORIG ;INCASE NOT GIVEN %SEGM4: MOVE SDEL,SYMBOL ;ROOM TO INIT SUBI SDEL,LENGTH ; SYM TAB CAMLE SDEL,FREE ; FOR NEW PSECT? JRST %SEGM3 ;YES PUSHJ PP,XCEEDS ;TRY FOR MORE CORE JRST %SEGM4 ;START OVER %SEGM3: MOVEM SDEL,SYMBOL ;NEW SYM TAB BOT HRLI SDEL,LENGTH(SDEL) ;OLD SYM TAB BOT MOVE SX,SYMTOP ;SYM TAB TOP BLT SDEL,-LENGTH(SX) ;MOVE SYM TAB DOWN HRLI SDEL,SYMNUM+1 ;PTR TO PERM SYM TAB HRRI SDEL,1-LENGTH(SX) ;PERM SYMS GO HERE BLT SDEL,0(SX) ;MOVE PERM SYMS TO NEW PSECT MOVE AC2,SYMNUM ;PERM SYM CNT MOVEM AC2,SGSCNT(AC1) ;SET SYM CNT SETZM SGATTR(AC1) ;ZERO PSECT BRK AND ATTRS ADDM AC2,@SYMBOL ;ADJUST TOTAL SYM CNT %SEGM2: AOS AC2,SGDMAX ;INCR PSECT DEPTH MOVEM AC0,SGLIST(AC2) ;STORE PSECT NAME %SEGM5: CAIE C,'/' ;ATTRIBUTES SPECIFIED? JRST %SEGM9 ;NO, TRY VALUE PUSH PP,AC1 ;SAVE PSECT INX PUSHJ PP,GETSYM ;GET ATTRIBUTE JRST %SEGM8 ;TOO BAD ; THE BELOW ATTRIBUTES ARE PAIRED; A CONFLICT IS ; FLAGGED IF BOTH OF ANY PAIR ARE SEEN (CUMMULATIVELY) MOVE AC1,AC0 ;ATRIB NAME SETO AC2, ;MASK LSH AC1,6 ;SHIFT UP 1 CHAR AT A TIME LSH AC2,6 ;SAME FOR MASK JUMPN AC1,.-2 ;UNTIL CHAR ALL GONE, MASK LEFT MOVSI AC1,-%SGTLN ;AOBJN WORD %SEGM6: CAMN AC0,%SGTBL(AC1) ;ATTRIBUTE FOUND? JRST %SEGM7 ;YES, PROCESS IT XOR AC0,%SGTBL(AC1) ;BUT SEE IF WHAT WE HAVE MATCHES TDNN AC0,AC2 ;TRUE IF MASKED BITS ARE 0 JRST %SEGM7 ;YES, IT MATCHES XOR AC0,%SGTBL(AC1) ;PUT NAME BACK AOBJN AC1,%SEGM6 ;NO, CHECK NEXT SETZ AC2, ;CLEAR ATTR FLAG TRO ER,ERRQ ;FLAG WARNING %SEGM7: MOVEI AC2,1 ;SET ATRIB BIT LSH AC2,-1(AC1) ; IN AC2 MOVE AC1,0(PP) ;GET PSECT INX HLRZ AC0,SGATTR(AC1) ;GET PREV ATTRS ANDI AC0,525252 ;SELECT LEFT OPTIONS LSH AC0,-1 ;SHIFT THEM RIGHT AND AC0,AC2 ;COMPARE NEW AND PREVIOUS JUMPE AC0,.+3 ;CONFLICTING ATTRIBUTE? TRO ER,ERRQ ;YES, FLAG WARNING SETZ AC2, ; AND IGNORE IT HLRZ AC0,SGATTR(AC1) ;GET PREV ATTRS ANDI AC0,252525 ;SELECT RIGHT OPTIONS LSH AC0,1 ;SHIFT THEM LEFT AND AC0,AC2 ;COMPARE NEW AND PREVIOUS JUMPE AC0,.+3 ;CONFLICTING ATTRIBUTE? TRO ER,ERRQ ;YES, FLAG WARNING SETZ AC2, ; AND IGNORE IT HRLZS AC2 ;MOVE TO LEFT HALF IORM AC2,SGATTR(AC1) ;MERGE ATTRIBUTES %SEGM8: POP PP,AC1 ;RESTORE PSECT INX JUMPCM %SEGM5 ;LOOP IF MORE ATTRS JRST %SWSEG ;SWAP PC AND MODE %SEGM9: JUMPNC %SWSEG ;NO VALUE PUSH PP,AC1 ;SAVE INDEX PUSHJ PP,EVALCM ;GET IT POP PP,AC1 ;RESTORE INDEX HRRM AC0,SGORIG(AC1) ;STORE IT JRST %SWSEG ;SWAP PC AND MODE %SGTBL: %SGTLN==.-%SGTBL %ENDSE: SKIPN HISNSW ;CAN'T HAVE PSECTS WITH SKIPE UNIVSN ; HISEG, TWOSEG OR JRST ERRSX ; UNIVERSAL MOVE AC2,SGDMAX ;IF DEPTH IS ALREADY ZERO JUMPE AC2,ERRSX ; THEN .ENDPS IS ILLEGAL PUSHJ PP,GETSYM ;GET PSECT NAME JRST %ENDS1 ;NONE SPECIFIED, IGNORE CHECK CAME AC0,SGLIST(AC2) ;DOES IT MATCH CORRES .PSECT NAME TRO ER,ERRQ ;NO, FLAG WARN AND DO IT ANYWAY %ENDS1: TRZ ER,ERRA ;UNDO GETSYM'S ERR FLAG SOS AC2,SGDMAX ;DECR PSECT DEPTH MOVE AC0,SGLIST(AC2) ;NAME OF PSECT TO RESUME MOVE AC1,SGNMAX ;GET PSECT COUNT CAME AC0,SGNAME(AC1) ;NAME MATCH? SOJGE AC1,.-1 ;NO, TRY NEXT ;HERE TO SWAP TO NEW PSECT ;ENTER WITH OLD PSECR IN SGNCUR ;NEW PSECT IN AC1 %SWSEG: PUSH PP,AC1 ;SAVE NEW PSECT INX MOVE AC2,SGNCUR ;GET OLD PSECT INX HLRZ SDEL,SGORIG(AC2) ;ALREADY SETUP LIT/VAR BLOCK JUMPN SDEL,%SWSG1 ;YES MOVEI SDEL,.SGLVL+1 ;NO ADDB SDEL,FREE ;TRY TO GET IT CAML SDEL,SYMBOL ;WILL IT FIT? PUSHJ PP,XCEED ;NO, XPAND SUBI SDEL,.SGLVL+1 ;GET ORIGIN HRLM SDEL,SGORIG(AC2) ;NOW STORE IT %SWSG1: MOVSI AC0,.SGLVZ ;START OF LIT/VAR AREA HRRI AC0,1(SDEL) ;SAVE AREA BLT AC0,.SGLVL(SDEL);STORE IT MOVE AC0,LITLVL ;GET LITLVL MOVEM AC0,(SDEL) ;STORE IT HLLZ AC0,SGORIG(AC1) ;RESTORE NEW LIT/VAR JUMPE AC0,[MOVE AC0,[.SGLVZ,,.SGLVZ+1] ;NOT YET SETUP SETZM .SGLVZ ;CLEAR FIRST WORD BLT AC0,.SGLVZ+.SGLVL ;PLUS REST MOVEI AC0,VARHD ;SET UP AREA MOVEM AC0,VARHDX MOVEI AC0,LITHD MOVEM AC0,LITHDX SETZM LITLVL PUSHJ PP,LITI JRST %SWSG2] ;JOIN COMMON CODE AOBJP AC0,.+1 ;BYPASS FIRST WORD HRRI AC0,.SGLVZ ;TO LIT/VAR AREA BLT AC0,.SGLVZ+.SGLVL-1 HLRZ SDEL,SGORIG(AC1) ;POINTER TO LIT INFO MOVE AC0,(SDEL) ;GET LITLVL MOVEM AC0,LITLVL ;WE ARE NOW IN PUSHJ PP,HIGHQ ;SET CURRENT PROG BRK %SWSG2: MOVE AC0,SGRELC(AC1) ;GET OLD MODE AND PC PUSH PP,AC0 ;SAVE SAME HLRZ RC,AC0 ;GET OLD MODE SKIPN RC ;IF ABS MODE MOVE AC0,ABSLOC ; THEN GET ABS PC HRRM AC0,(PP) ;STORE NEW VALUE HRRZ AC0,LOCO ;PC OF OUTPUT MOVE AC1,MODO ;OLD MODE MOVEM AC0,@REL1P(AC1) ;SAVE OLD VALUE MOVE AC0,MODO ;SAVE OLD MODE MOVEM AC0,ORGMOD MOVE AC1,SGNCUR ;CURRENT PSECT INDEX MOVE AC0,HIGH ;SAVE PSECT BREAK HRRM AC0,SGATTR(AC1) HRR AC0,RELLOC ;SAVE PSECT REL PC HRL AC0,ORGMOD ;SAVE PSECT MODE MOVEM AC0,SGRELC(AC1) MOVE AC0,-1(PP) ;GET NEW PSECT INX MOVEM AC0,SGNCUR ;SET SGNCUR TO IT JUMP1 .+2 ;IF PASS 2 THEN PUSHJ PP,SGOUTN ; OUTPUT PSECT NAME BLOCK POP PP,AC0 ;GET RESULT HLRZM AC0,MODA ;SET MODES HLRZM AC0,MODO HRRZM AC0,LOCA ;AND LOCATIONS HRRZM AC0,LOCO POP PP,SGNCUR ;STORE NEW PSECT INX MOVE AC1,SGNCUR ;NEW PSECT INX HRRZ AC0,SGATTR(AC1) ;GET PSECT BRK MOVEM AC0,HIGH ;RESTORE IT PUSHJ PP,SRCHI ;SET UP SRCHX POPJ PP, ;DONE ERRSX: TRO ER,ERRS ;FLAG PSECT USAGE ERROR POPJ PP, ;DONE > HISEG1: IFN POLISH,< SKIPE SGNMAX ;IF PSECTS USED THEN CAN'T USE JRST ERRSX ; HISEG OR TWOSEG > PUSHJ PP,HIGHQ ;SET CURRENT PROGRAM BREAK PUSHJ PP,COUTD ;DUMP CURRENT TYPE OF BLOCK SKIPN HISNSW ;IF WE HAVE SEEN IT BEFORE SKIPE HIGH ;OR ANY RELOC CODE PUT OUT TRO ER,ERRQ ;FLAG AS AN ERROR BYPASS ;GO GET EXPRESSION TLO IO,IORPTC PUSHJ PP,EVALXQ ;CHECK FOR EXTERNAL ANDCMI AC0,1777 ;ONLY ALLOWED TO START ON NEW K BOUND HRRZM AC0,LOCA ;SET LOC COUNTERS HRRZM AC0,LOCO MOVEI RC,1 ;ASSUME RELOCATABLE POPJ PP, TWSEG0: PUSHJ PP,HISEG1 ;COMMON CODE JUMPN AC0,.+2 ;ARGUMENT SEEN MOVEI AC0,400000 ;ASSUME 400000 HRRZM AC0,HMIN ;SET OFSET OF HIGH SEG. HRRZM AC0,HHIGH ;INCASE NO HISEG CODE TLOA AC0,(1B0) ;SIGNAL TWO SEGMENTS AND SKIP HISEG0: PUSHJ PP,HISEG1 ;COMMON CODE HISEG2: MOVEM AC0,SVTYP3 ;SAVE THE HISEG ARG MOVEM RC,MODA ;SET MODES MOVEM RC,MODO SETOM HISNSW ;WE HAVE ALREADY PUT ONE OUT JRST BLOCK2 ;MAKE LISTING HAPPEN RIGHT IFN FORMSW,< ONFORM: HRRES HWFMT ;ALLOW MULTI-FORMAT LISTING POPJ PP, OFFORM: HRROS HWFMT ;HALF-WORD FORMAT ONLY POPJ PP, > IFE FORMSW,< SYN CPOPJ,ONFORM SYN CPOPJ,OFFORM> HIGHQ: HIGHQ1: MOVE V,LOCO ;GET ASSEMBLY LOCATION SKIPN MODO ;IF ASSEMBLY MODE IS ABSOLUTE JRST [CAMLE V,ABSHI ;RECORED ABS HIGHEST ALSO MOVEM V,ABSHI POPJ PP,] SKIPE HMIN ;IS IT A TWO SEGMENT PROGRAM? JRST [CAMGE V,HMIN ;YES,IS THIS HIGH SEG.? JRST .+1 ;NO,STORE LOW SEGMENT CAMLE V,HHIGH ;YES,IS IT GREATER THAN "HHIGH"? MOVEM V,HHIGH ;YES,REPLACE WITH LARGER VALUE POPJ PP,] CAMLE V,HIGH ;IS IT GREATER THAN "HIGH"? MOVEM V,HIGH ;YES, REPLACE WITH LARGER VALUE POPJ PP, ONML: TLZA FR,MWLFLG ;MULTI-WORD LITERALS OK OFFML: TLO FR,MWLFLG ;NO POPJ PP, OFFSYM: SETOM IONSYM ;SUPRESS SYMBOL TABLE LISTING POPJ PP, SUPRE0: PUSHJ PP,GETSYM ;GET A SYMBOL TO SUPRES JRST SUPRE1 ;ERROR PUSHJ PP,SSRCH ;SYMBOL ONLY JRST SUPRE1 ;GIVE ERROR MESSAGE PUSHJ PP,SUPSYM ;[167] SEE IF "!" SEEN TLOA ARG,SUPRBT ;SET THE SUPRESS BIT SUPRE1: TROA ER,ERRA IORM ARG,(SX) ;PUT BACK JUMPCM SUPRE0 ;ANY MORE? JRST SUPRS1 SUPRSA: PUSHJ PP,LOOKUP ;SUPRESS ALL MOVSI ARG,SUPRBT IORM ARG,(SX) SUPRS1: SETZM EXTPNT ;JUST IN CASE WE LOOKED ONE UP IFN POLISH,< TLZ IO,RSASSW ;[265] ... > POPJ PP, XPUNG0: JUMP1 POPOUT PUSHJ PP,LOOKUP MOVE ARG,(SX) ;GET SYMBOL FLAGS TLNN ARG,INTF!ENTF!EXTF!SPTR TLOA ARG,SUPRBT ;LOCAL SYMBOL,SO SUPPRESS IT SETZM EXTPNT IFN POLISH,< TLZ IO,RSASSW ;[265] ... > MOVEM ARG,(SX) ;RESTORE FLAGS POPJ PP, NODDT0: PUSHJ PP,GETSYM ;GET A SYMBOL TO SUPRES JRST NODDT1 ;ERROR PUSHJ PP,SSRCH ;SYMBOL ONLY JRST NODDT1 ;GIVE ERROR MESSAGE PUSHJ PP,SUPSYM ;SEE IF "!" SEEN TLOA ARG,NOOUTF ;SET THE NO-DDT BIT NODDT1: TROA ER,ERRA IORM ARG,(SX) ;PUT BACK JUMPCM NODDT0 ;ANY MORE? JRST SUPRS1 SUPSYM: CAIE C,'!' ;[404][167] WANT NO DDT OUTPUT FOR THIS SYMBOL? POPJ PP, ;[167] NO TLO ARG,NOOUTF ;[167] YES, SET FLAG PJRST BYPAS1 ;[167] SKIP "!" AND RETURN ;[220] .CREF SYMBOL,SYMBOL,ETC ONCRF: PUSHJ PP,GETSYM ;SEE IF A SYMBOL SPECIFIED JRST [MOVSI AC0,IONCRF ;NO, PUT FLAG BACK TRZ ER,ERRA ;CLEAR "A" ERROR TLZ IO,DEFCRS ;CLEAR ANY WAITING DEFINING OCCURENCES JRST IORSET] ONCRF0: PUSHJ PP,SEARCH ;[365] GENERAL SEARCH JRST ONCRFE ;[365] ERROR MOVSI ARG,NCRF ;[365] NO CREF FLAG IN ARG ANDCAM ARG,(SX) ;[365] TURN OFF NO CREF BIT CAMN AC0,1(SX) ;[365] OTHER ENTRY IN SYMBOL TABLE? ANDCAM ARG,2(SX) ;[365] TURN OFF NCRF CAMN AC0,-3(SX) ;[365] OTHER ENTRY IN SYMBOL TABLE? ANDCAM ARG,-2(SX) ;[365] TURN OFF NCRF CAIA ;[365] ONCRFE: TRO ER,ERRA ;[365] SET ERROR CONDITION JUMPNC SUPRS1 ;GIVE UP IF NO MORE PUSHJ PP,GETSYM ;GET NEXT SYMBOL JRST ONCRFE ;ERROR JRST ONCRF0 ;[220] .XCREF SYMBOL,SYMBOL,ETC OFFCRF: PUSHJ PP,GETSYM ;SEE IF A SYMBOL SPECIFIED JRST [MOVSI AC0,IONCRF ;PUT FLAG BACK TRZ ER,ERRA ;CLEAR "A" ERROR JRST IOSET] OFCRF0: PUSHJ PP,SEARCH ;[365] GENERAL SEARCH JRST OFCRFE ;[365] ERROR MOVSI ARG,NCRF ;[365] NO CREF FLAG IN ARG IORM ARG,(SX) ;[365] SET NO CREF BIT CAMN AC0,1(SX) ;[365] OTHER ENTRY IN SYMBOL TABLE? IORM ARG,2(SX) ;[365] SET BIT CAMN AC0,-3(SX) ;[365] OTHER ENTRY IN SYMBOL TABLE? IORM ARG,-2(SX) ;[365] SET BIT CAIA ;[365] OFCRFE: TRO ER,ERRA ;[365] FLAG ERROR JUMPNC SUPRS1 ;GIVE UP IF NO MORE SYMBOLS PUSHJ PP,GETSYM ;GET NEXT SYMBOL JRST OFCRFE ;ERROR JRST OFCRF0 TITLE0: JUMP2 REMAR0 SKIPE TBUF+1 ;IS THIS THE FIRST TITLE? JRST [TRO ER,ERRM ;NO, FLAG AS ERROR JRST REMAR0] ;AND IGNORE MOVEI SX,.TBUF HRRI AC0,TBUF PUSHJ PP,SUBTT1 ;GO READ IT MOVEM SX,TCNT ;SAVE COUNT OF CHARS. WRITTEN SKIPE UNIVSN ;WAS IT A UNIVERSAL? PUSHJ PP,ADDUNV ;YES ADD TO TABLE SKIPN TBUF+1 ;2ND WORD NON-ZERO SIGNALS TITLE SEEN AOS TBUF+1 ;MAKE IT SO IFN CCLSW, IFE CCLSW, SUBTT0: SKIPE SBUF ;STORE FIRST SUBTTL ON PASS1 JUMP1 REMAR0 ;OTHERWISE EXIT IF PASS ONE MOVEI SX,.SBUF HRRI AC0,SBUF SUBTT1: BYPASS ;BYPASS LEADING BLANKS TLO IO,IORPTC SUBTT3: PUSHJ PP,CHARAC ;GET ASCII CHARACTER IDPB C,AC0 ;STORE IN BLOCK CAIGE C,40 ;TEST FOR TERMINATOR CAIN C,HT SOJG SX,SUBTT3 ;TEST FOR BUFFER FULL DPB RC,AC0 ;END, STORE TERMINATOR SOJA SX,REMAR1 ;COUNT NULL AND EAT UP ANY REMAINING CHARS. IFN CCLSW,< PRNAM: TLNN IO,CRPGSW ;NOT IF NOT RPG POPJ PP, PUSH PP,AC0 ;SAVE AC0 DMN PUSH PP,RC ;AND RC MOVE AC0,[POINT 7,TBUF] MOVE SX,[POINT 7,OTBUF] MOVEI RC,6 ;MAX OF SIX CHRS MOVEI C,HT ;START WITH A TAB IDPB C,SX PN1: ILDB C,AC0 CAILE C," " ;CHECK FOR LEGAL CAILE C,"Z"+40 ;CHECK AGAINST LOWER CASE Z JRST PN2 IDPB C,SX ;PUT IN OUTPUT BUFFER SOJG RC,PN1 ;GET MORE PN2: MOVEI C,CR ;END WITH CR-LF IDPB C,SX MOVEI C,LF IDPB C,SX SETZ C, ;TERMINATOR IDPB C,SX TTCALL 3,OTBUF POP PP,RC POP PP,AC0 ;RESTORE AC0 DMN POPJ PP, > SYN0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL JRST ERRAX ;ERROR, EXIT PUSHJ PP,MSRCH ;TRY FOR MACRO/OPDEF JRST SYN3 ;NO, TRY FOR OPERAND SYN1: MOVEI SX,MSRCH ;YES, SET FLAG SYN2: JUMPNC ERRAX ;[173] ERROR IF NO COMMA PUSH PP,ARG ;[173] SAVE SOME REGISTERS PUSH PP,RC ;[173] PUSH PP,V ;[173] PUSH PP,SX ;[173] SAVE SEARCH ROUTINE PUSHJ PP,GETSYM ;[173] GET THE SECOND SYMBOL JRST [SUB PP,[4,,4] ;[173] PUT STACK BACK POPJ PP,] ;[173] AND GIVE UP POP PP,SX ;[173] RESTORE SEARCH ROUTINE PUSHJ PP,@SX ;[173] SEARCH FOR SECOND SYMBOL JFCL ;[173] POP PP,V ;[173] RESTORE VALUES POP PP,RC ;[173] POP PP,ARG ;[173] TLNE ARG,MACF ;MACRO? PUSHJ PP,REFINC ;YES, INCREMENT REFERENCE JRST INSERT ;INSERT AND EXIT SYN3: PUSHJ PP,SSRCH ;SEARCH FOR OPERAND JRST SYN4 ;NOT FOUND, TRY OP CODE TLO ARG,SYNF ;FLAG AS SYNONYM TLNE ARG,EXTF ;EXTERNAL? HRRZ V,ARG ;YES, RELPACE WITH POINTER MOVEI SX,SSRCH ;SET FLAG TLNN ARG,VARF ;DO NOT LET HIM SYN A VARIABLE JRST SYN2 JRST ERRAX SYN4: PUSHJ PP,OPTSCH ;SEARCH FOR OP-CODE JRST ERRAX ;NOT FOUND, EXIT WITH ERROR MOVSI ARG,SYNF ;FLAG AS SYNONYM JRST SYN1 PURGE0: PUSHJ PP,GETSYM ;GET A MNEMONIC JRST [TRZ ER,ERRA ;CLEAR ERROR POPJ PP,] ;AND RETURN PUSHJ PP,MSRCH ;SEARCH MACRO SYMBOL TABLE JRST PURGE2 ;NOT FOUND, TRY SYMBOLS PUSH PP,CS ;SAVE CS AS IT MAY GET GARBAGED TLNE ARG,MACF ;MACRO? PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE POP PP,CS JRST PURGE4 ;REMOVE SYMBOL FROM TABLE PURGE2: PUSHJ PP,SSRCH ;TRY OPERAND SYMBOL TABLE JRST PURGE5 ;NOT FOUND GET NEXT SYMBOL TDNE RC,[-2,,-2] ;CHECK COMPLEX EXTERNAL TLNE ARG,SYNF JRST .+2 JRST PURGE3 TLNE ARG,EXTF!UNDF ;ERROR IF EXTERNAL OR UNDEFINED TLNE ARG,SYNF ;BUT NOT A SYNONYM JRST PURGE4 PURGE3: TROA ER,ERRA ;NOT FOUND, ERROR PURGE4: PUSHJ PP,REMOVE ;REMOVE FROM THE SYMBOL TABLE PURGE5: JUMPCM PURGE0 POPJ PP, ;EXIT OPD1: TLNE ARG,UNDF ;IF OPDEF IS UNDEFINED TRO ER,ERRO ;GIVE "O" ERROR OPD: MOVE AC0,V ;PUT VALUE IN AC0 JRST OP IOP: MOVSI AC2,(POINT 9,0(PP),11) IFE FORMSW,< TLOA IO,IOIOPF ;SET "IOP SEEN" AND SKIP> IFN FORMSW,< PUSH PP,IOFORM ;USE I/O FORM JUMPAD .+2 ;[344] IF IN ADDRESS FIELD, DON'T CHANGE IOSEEN SETOM IOSEEN ;[116] SIGNAL FOR BOUT TO ADJUST FIELDS TLO IO,IOIOPF ;SET "IOP" SEEN JRST OP+2> OP: MOVSI AC2,(POINT 4,0(PP),12) IFN FORMSW,< PUSH PP,INFORM ;USE INST. FORM> PUSH PP,RC PUSH PP,AC0 ;STACK CODE PUSH PP,AC2 PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION POP PP,AC2 JUMPNC OP2 OP1B: PUSHJ PP,GETCHR ;GET A CHARACTER IFE FORMSW, IFN FORMSW, TLO IO,IORPTC ;NOT A COMMA,REPEAT IT LDB AC1,AC2 ADD AC1,AC0 DPB AC1,AC2 IFN POLISH,< TLNN FR,POLSW ;[164] DON'T ALLOW EXTERNAL ACS > JUMPE RC,OP1A ;EXTERNAL OR RELOCATABLE? PUSHJ PP,QEXT ;YES, DETERMINE WHICH AND FLAG AN ERROR OP1A: PUSHJ PP,EVALEX ;GET ADDRESS PART OP2: PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS OP3: POP PP,AC0 ;PUT IN AC0 POP PP,RC IFN FORMSW,< POP PP,AC1 ;GET FORM WORD> SKIPE (PP) ;CAME FROM EVALCM? JRST STOW ;NO,STOW CODE AND EXIT POP PP,AC1 ;YES,EXIT IMMEDIATELY POPJ PP, EVADR: ;EVALUATE STANDARD ADDRESS IFE IIISW, ADD AC0,-1(PP) ;ADD ADDRESS PORTIONS HLL AC0,-1(PP) ;GET LEFT HALF TLZE FR,INDSW ;INDIRECT BIT? TLO AC0,(Z @) ;YES, PUT IT IN MOVEM AC0,-1(PP) ;RE-STACK CODE ADD RC,-2(PP) ;UPDATE RELOCATION HRRM RC,-2(PP) ;USE HALF WORD ADD CAIE C,10 ;"("? POPJ PP, ;NO, EXIT MOVSS EXTPNT ;WFW PUSHJ PP,EVALCM ;EVALUATE MOVSS EXTPNT ;WFW MOVSS V,AC0 ;SWAP HALVES IFE IIISW, IFN IIISW, ADD V,-1(PP) ;ADD RIGHT HALVES ADD ARG,-2(PP) HRRM V,-1(PP) ;UPDATE WITHOUT CARRY HRRM ARG,-2(PP) HLLZS AC0 ;PREPARE LEFT HALVES HLLZS RC IFE IIISW, ADDM AC0,-1(PP) ;MERGE WITH PREVIOUS VALUE ADDM RC,-2(PP) CAIE C,11 ;")"? JRST ERRAX ;NO, FLAG ERROR ;YES, BYPASS PARENTHESIS BYPAS1: PUSHJ PP,GETCHR BYPAS2: JUMPE C,.-1 ;SKIP TRAILING BLANKS POPJ PP, ;EXIT IFE IIISW,< OP2A1: EXCH RC,-2(PP) ;GET STORED CODE TLNN RC,-1 ;OK IF ALL ZERO JRST OP2A2 ;OK SO RETURN TLC RC,-1 ;CHANGE ALL ONES TO ZEROS TLCE RC,-1 ;OK IF ALL ONES TRO ER,ERRQ ;OTHERWISE A "Q" ERROR OP2A2: EXCH RC,-2(PP) ;GET RC,BACK POPJ PP, ;AND RETURN> EXPRES: HRLZ AC0,RX ;FUDGE FOR OCT0 OCT0: PUSH PP,RX HLR RX,AC0 IFN POLISH,< MOVNI AC0,3 ;[164] PRESET POLISH TYPE SINCE WE MOVEM AC0,POLTYP ;[164] NEED FULL WORD FIXUPS IF POLISH > OCT1: PUSHJ PP,EVALEX ;EVALUATE IFN POLISH,< TDNE RC,[-2,,-2] ;[164] TEST FOR EXTERNAL PUSHJ PP,OCTFW ;[164] YES, NEEDS FULL WORD FIXUP > IFN FORMSW,< MOVE AC1,HWFORM> PUSHJ PP,STOW ;STOW CODE JUMPCM OCT1 POP PP,RX ;YES, RESTORE RADIX IFN POLISH,< SETZM POLTYP ;[164] CLEAR FLAG > POPJ PP, ;EXIT IFN POLISH,< ;HERE TO GENERATE FULL WORD FIXUPS FOR EXP EXTERN ;NOTE THIS GENERATES BLOCK TYPE 11 POLISH FIXUPS ;THESE CANNOT BE LOADER BY LOADER UNLESS FAILSW IS ON OCTFW: MOVE PV,FREE ;[164] COPY CODE FROM POLPOP EXCH PV,POLIST ;[164] TO SET UP A NEW BLOCK PUSHJ PP,POLSTR ;[164] STORE POINTER TO LAST MOVE PV,EXTPNT ;[164] GET POINTER TO EXTERNAL SYMBOL PUSHJ PP,POLFS2 ;[164] STORE EXTERNAL JRST POLOCT ;[164] AND FIXUP ADDRESS, AND RETURN > SIXB10: MOVSI RC,(POINT 6,AC0) ;SET UP POINTER MOVEI AC0,0 ;CLEAR WORD SIXB20: PUSHJ PP,CHARL ;GET NEXT CHARACTER CAMN C,SX ;IS THIS PRESET DELIMITER? IFE FORMSW,< JRST ASC60 ;YES> IFN FORMSW,< JRST [PUSHJ PP,BYPAS1 ANDCM RC,STPX MOVE AC1,SXFORM SETZM INTXT ;[320] NO LONGER IN TEXT JUMPGE RC,STOWZ POPJ PP,]> CAIL C,"A"+40 CAILE C,"Z"+40 JRST .+2 TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT SUBI C,40 ;CONVERT TO SIXBIT JUMPL C,ASC55 ;TEST FOR INVALID CHARACTER IDPB C,RC ;NO, DEPOSIT THE BYTE TLNE RC,770000 ;IS THE WORD FULL? JRST SIXB20 ;NO, GET NEXT CHARACTER IFN FORMSW,< MOVE AC1,SXFORM ;SIXBIT FORM> PUSHJ PP,STOWZ ;YES, STORE JRST SIXB10 ;GET NEXT WORD %TEXT1: TLC AC0,240000 ;[232] CONVERT .TEXT TO COMMENT ON PASS1 ASCII0: HLLZ SDEL,AC0 ;STORE ASCII/ASCIZ FLAG ASC10: PUSHJ PP,CHARL ;GET FIRST NON-BLANK CAIE C," " CAIN C,HT JRST ASC10 CAIG C,CR ;CHECK FOR CRRET AS DELIM CAIGE C,LF CAIA JRST ERRAX FORERR (SX,TXT) SETOM INTXT MOVE SX,C ;SAVE FOR COMPARISON JUMPG SDEL,SIXB10 ;BRANCH IF SIXBIT ASC20: MOVSI RC,(POINT 7,AC0) ;SET UP POINTER TLNE SDEL,200000 ;THIS BIT (AND BIT0) IN FOR COMMENT MOVSI RC,440000 ;SO NOTHING WILL BE DEPOSITED IFE IIISW, IFN IIISW, ASC30: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST CAMN C,SX ;TEST FOR DELIMITER JRST ASC50 ;FOUND IDPB C,RC ;DEPOSIT BYTE TLNE RC,760000 ;HAVE WE FINISHED WORD? JRST ASC30 ;NO,GET NEXT CHARACTER IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD> TLNE SDEL,040000 ;.TEXT ? JRST [PUSHJ PP,STOTXT ;YES, STORE IN REL FILE JRST ASC20] ;CONTINUE PUSHJ PP,STOWZ ;YES, STOW IT JRST ASC20 ;GET NEXT WORD ASC55: TDZA CS,CS ;ZERO CS IN CASE NESTED ASC50: TDZA RC,SDEL ;TEST FOR ASCIIZ TROA ER,ERRA ;SIXBIT ERROR EXIT ASC60: PUSHJ PP,BYPAS1 ;POLISH OFF TERMINATOR SETZM INTXT ;WE ARE OUT OF IT IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD> IFN IIISW, ANDCM RC,STPX ;STORE AT LEAST ONE WORD TLNN SDEL,200000 ;GET OUT WITHOUT STORING JUMPGE RC,[TLNN SDEL,040000 ;.TEXT? JRST STOWZ ;NO, STOW JRST STOTXT] ;YES, STORE IN REL FILE POPJ PP, ;ASCII, NO BYTES STORED, SO EXIT ;[232] .TEXT PSEUDO-OP %TEXT0: JUMP1 %TEXT1 ;IGNORE ON PASS1 PUSH PP,BLKTYP ;SAVE CURRENT TYPE PUSHJ PP,COUTD ;[370] DUMP CURRENT BLOCK HLLZ SDEL,AC0 ;[370] FLAG BITS FOR ASCII SETZM BLKTYP ;DON'T KNOW IT YET PUSHJ PP,ASC10 ;START PROCESSING PUSHJ PP,STOTXD ;FINISH BLOCK POP PP,BLKTYP ;RESTORE PREVIOUS POPJ PP, STOTXT: SKIPN BLKTYP ;FIRST WORD? JRST [MOVEM AC0,BLKTYP POPJ PP,] ;SAVE AS BLOCK TYPE SKIPN COUTRB ;2ND WORD JRST [MOVEM AC0,COUTRB POPJ PP,] AOS C,COUTX ;NO, JUST STORE AS NORMAL MOVEM AC0,COUTDB(C) CAIE C,^D17 ;BUFFER FULL? POPJ PP, ;NO STOTXD: SKIPN C,BLKTYP ;[331] SEE IF ANY TEXT TO OUTPUT JRST COUTI ;[331] NO JUST CLEAR COUNTS AOS COUTX ;[331] ACCOUNT FOR STARTING FROM -1 SETZM BLKTYP ;[331] CLEAR BLOCKTYPE WORD FOR NEXT BLOCK TRNN C,177_1 ;[331] SEE IF RELOCATION WORD IS NEEDED AOS COUTRB ;[331] FIRST WORD OF BLOCK WAS NOT FULL, ;[331] 2ND WAS 0, PUT THE LSN BIT ON FOR ;[331] COUTD2 TO CHECK SO THERE WON'T BE ;[331] AN EXTRA 0 WORD IN THE FILE JRST COUTT ;DUMP BLOCK POINT0: IFN FORMSW,< PUSH PP,BPFORM ;USE BYTE POINTER FORM WORD> PUSH PP,RC ;STACK REGISTERS PUSH PP,AC0 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10 DPB AC0,[POINT 6,0(PP),11] ;STORE BYTE SIZE JUMPNC POINT2 IFN POLISH,< SETOM POLTYP ;[164] FORCE RIGHT-HALF FIXUP IF POLISH > PUSHJ PP,EVALEX ;NO, GET ADDRESS PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS IFN POLISH,< SETZM POLTYP ;[164] BACK TO NORMAL > JUMPNC POINT2 PUSHJ PP,EVAL10 ;EVALUATE RADIX 10 TLNE IO,NUMSW ;IF NUMERIC TDCA AC0,[-1] ;POSITION=D35-RHB POINT2: MOVEI AC0,0 ;OTHERWISE SET TO D36 ADDI AC0,^D36 LSH AC0,^D30 ADDM AC0,0(PP) ;UPDATE VALUE JRST OP3 XWD0: IFN FORMSW,< PUSH PP,HWFORM ;USE HALF WORD FORM> PUSH PP,RC PUSH PP,AC0 ;STORE ZERO ON STACK PUSHJ PP,EVALEX ;EVALUATE EXPRESSION JUMPNC OP2 XWD5: SKIPN (PP) ;ANY CODE YET? JRST XWD10 ;NO,USE VALUE IN AC0 JUMPE AC0,.+2 ;ANYTHING IN AC0? TRO ER,ERRQ ;YES,FLAG "Q"ERROR MOVE AC0,(PP) ;USE PREVIOUS VALUE MOVE RC,-1(PP) ;AND RELOCATION XWD10: TLNN AC0,-1 ;[143] LEFT HALF SHOULD BE ZERO JRST XWD11 ;[143] IT IS TLC AC0,-1 ;[143] OR AT LEST ALL ONES TLCE AC0,-1 ;[143] FOR XWD -1,-2 ETC TRO ER,ERRQ ;[143] NO, WARN USER XWD11: HRLZM AC0,0(PP) ;SET LEFT HALF HRLZM RC,-1(PP) MOVSS EXTPNT ;WFW JRST OP1A ;EXIT THROUGH OP IOWD0: PUSHJ PP,EVALQ ;[222] EVALUATE AND TEST FOR EXTERNAL CAIE C,14 ;","? JRST [SKIPN AC0 ;IF NZERO AND NO "," SEEN TRO ER,ERRQ ;TREAT AS Q ERROR IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM> SOJA AC0,STOW] ;NO, TREAT AS RIGHT HALF PUSH PP,AC0 ;YES, STACK LEFT HALF PUSHJ PP,EVALEX ;WFW SUBI AC0,1 POP PP,AC1 ;RETRIEVE LEFT HALF MOVNS AC1 HRL AC0,AC1 IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM> JRST STOW ;STOW CODE AND EXIT BYTE0: PUSHJ PP,BYPAS1 ;GET FIRST NON-BLANK CAIE C,10 ;"("? JRST ERRAX ;NO, FLAG ERROR AND EXIT IFN FORMSW,< PUSH PP,[1] MOVEI AC0,0 > PUSH PP,RC PUSH PP,AC0 ;INITIALIZE STACK TO ZERO MOVSI ARG,(POINT -1,(PP)) BYTE1: PUSH PP,ARG PUSHJ PP,EVAL10 ;EVALUATE RADIX 10 POP PP,ARG CAIG AC0,^D36 ;TEST SIZE JUMPGE AC0,.+2 TRO ER,ERRA DPB AC0,[POINT 6,ARG,11] ;STORE BYTE SIZE BYTE2: IBP ARG ;INCREMENT BYTE TRZN ARG,-1 ;OVERFLOW? JRST BYTE3 ;NO SETZB AC0,RC ;YES EXCH AC0,0(PP) ;GET CURRENT VALUES EXCH RC,-1(PP) ;AND STACK ZEROS IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM EXCH AC1,-2(PP) ;GET FORM WORD > PUSHJ PP,STOW ;STOW FULL WORD BYTE3: PUSH PP,ARG PUSHJ PP,EVALEX ;COMPUTE NEXT BYTE POP PP,ARG DPB AC0,ARG ;STORE BYTE HLLO AC0,ARG DPB RC,AC0 ;STORE RELOCATION IFN FORMSW,< MOVEI AC0,1 HRRI ARG,-2 DPB AC0,ARG ;STORE FORM BYTE HRRI ARG,0 > JUMPCM BYTE2 CAIN C,10 ;"("? JRST BYTE1 ;YES, GET NEW BYTE SIZE JRST OP3 ;NO, EXIT RADX50: PUSHJ PP,EVALEX ;EVALUATE CODE JUMPN RC,ERRAX ;ERROR IF NOT ABSOLUTE JUMPNC ERRAX TDZE AC0,[EXP ^-74] ;[322] MAKE SURE ONLY 74 BITS ON TRO ER,ERRQ ;[322] NOPE, LIGHT Q ERROR PUSH PP,AC0 ;[160] SAVE CODE BITS PUSHJ PP,GETSYM ;YES, GET SYMBOL TRZ ER,ERRA ;CLEAR ERROR POP PP,ARG ;[160] PUT CODE INTO ARG PUSHJ PP,SQOZE ;SQUOZE SIXBIT AND ADD CODE IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM> JRST STOW ;STOW CODE AND EXIT SQOZE: MOVE AC1+1,AC0 ;PUT SIXBIT IN AC1+1 MOVEI AC0,0 ;CLEAR RESULT SQOZ1: MOVEI AC1,0 LSHC AC1,6 ;PUT 6-BIT CHARACTER IN AC1 LDB AC1,[POINT 6,CSTAT(AC1),23] ;CONVERT TO RADIX50 IMULI AC0,50 ;MULTIPLY PREVIOUS RESULT ADD AC0,AC1 ;ADD NEW CHARACTER JUMPN AC1+1,SQOZ1 ;TEST FOR END LSH ARG,^D30 ;LEFT-JUSTIFY CODE IOR AC0,ARG ;MERGE WITH RESULT POPJ PP, ; .LINK PSEUDO OP. FORM IS ; ; .LINK LNKNO, LNKLOC, LNKNXT ; ;WHERE LNKNO IS THE LINK NUMBER, LNKLOC IS THE LOCATION INTO WHICH ;LINK SHOULD STORE THE CURRENT VALUE OF THE LINK POINTER, AND ;LNKNXT IS AN OPTIONAL ARGUMENT WHICH LINK WILL ACCEPT AS THE ;NEW VALUE OF THE LINK POINTER (IF LNKNXT ABSENT THEN LNKLOC IS ;THE NEW POINTER VALUE). %LINK: PUSH PP,BLKTYP ;SAVE BLOCK TYPE PUSH PP,AC0 JUMP1 LINK1 ;SKIP CODE GEN IF P1 PUSHJ PP,COUTD MOVEI AC0,12 ;LINK TYPE MOVEM AC0,BLKTYP LINK1: PUSHJ PP,EVALEX ;EVAL CHECK EXT POP PP,AC1 ;GET BITS BACK JUMPN RC,LNKERR ;MUST BE ABS JUMPNC LNKERR ;GRNTEE COMMA TLNE AC1,400000 ;LNKEND? MOVN AC0,AC0 ;YES, NEGATE RESULT JUMP1 LINK2 ;SKIP IF P1 PUSHJ PP,COUT LINK2: PUSHJ PP,EVALXQ ;NO EXTERNALS JUMPNC LINK2A ;[423] THIRD ARGUMENT SPECIFIED? HRL AC0,RC ;[423] YES - MUST FIRST SAVE THE PUSH PP,AC0 ;[423] OLD VALUES OF RC, AC0 PUSHJ PP,EVALXQ ;[423] READ IN THIRD ARGUMENT MOVS AC0,AC0 ;[423] LINK EXPECTS LNKNXT IN THE MOVS RC,RC ;[423] LEFT HALF OF SECOND WORD HRR AC0,(PP) ;[423] RESTORE LNKLOC VALUE HLR RC,(PP) ;[423] AND ITS RELOCATION BIT TLNE RC,1 ;[423] LNKNXT RELOCATABLE??? TRO RC,2 ;[423] YES - SET FOR COUT TO DEPOSIT SUB PP,[1,,1] ;[423] "POP" BOGUS WORD OFF STACK LINK2A: JUMP1 LINK3 PUSHJ PP,COUT ;DUMP LOC PUSHJ PP,COUTD ;FINISH BLOCK LINK3: POP PP,BLKTYP ;RESTORE BLKTYP POPJ PP, LNKERR: POP PP,BLKTYP ;RESTORE BLOCK TYPE PJRST ERRAX ;GIVE ERROR RETURN %INTEG: PUSHJ PP,GETSYM ;GET A SYMBOL JRST INTG2 ;BAD SYMBOL ERROR TLO IO,DEFCRS ;THIS IS A DEFINTION PUSHJ PP,SSRCH ;SEE IF THERE MOVSI ARG,SYMF!UNDF ;SET SYMBOL AND UNDEFINED IF NOT TLNN ARG,UNDF ;IF ALREADY DEFINED JRST INTG1 ;JUST IGNORE TLOA ARG,VARF ;SET VARIABLE FLAG INTG2: TROA ER,ERRA ;SYMBOL ERROR PUSHJ PP,INSERZ ;PUT IN WITH ZERO VALUE (LENGTH OF 1) INTG1: JUMPCM %INTEG POPJ PP, %ARAY: MOVEM PP,ARAYP ;SAVE PUSHDOW POINTER ARAY2: PUSHJ PP,GETSYM JRST ARAY1 ;BAD SYMBOL GIVE ERROR AND ABORT PUSH PP,AC0 ;SAVE NAME JUMPCM ARAY2 ;AND GO ON IF A COMMA CAIE C,"["-40 ;MUST BE A [ JRST ARAY1 BYPASS ;OH, WELL TLO IO,IORPTC PUSHJ PP,EVALXQ ;GET A SIZE CAIE C,"]"-40 ;MUST END RIGHT JRST ARAY1 BYPASS ;?? HRRZ V,AC0 ;GET VALUE SUBI V,1 NXTVAL: POP PP,AC0 PUSH PP,V ;SAVE OVER SEARCH TLO IO,DEFCRS PUSHJ PP,SSRCH ;FIND IT MOVSI ARG,SYMF!UNDF POP PP,V ;GET VALUE BACK TLNN ARG,UNDF JRST ARAY3 TLO ARG,VARF MOVEI RC,0 ;NO RELOC PUSHJ PP,INSERT ARAY3: CAME PP,ARAYP JRST NXTVAL ;STILL NAMES STACKED JUMPCM ARAY2 POPJ PP, ARAY1: TRO ER,ERRA ;ERROR EXIT MOVE PP,ARAYP POPJ PP, ;RESET PDL AND GO ;[121] .COMMON SYMBOL [SIZE] SYN ARAYP,COMMP ;SAVE SPACE COMM0: JUMP1 COMM1 ;WASTE OF TIME ON PASS1 PUSHJ PP,COUTD ;DUMP CURRENT BLOCK PUSH PP,BLKTYP ;SAVE TYPE MOVEI AC0,20 ;COMMON BLOCK TYPE MOVEM AC0,BLKTYP ;SET NEW COMM1: MOVEM PP,COMMP ;SAVE PUSHDOWN POINTER COMM2: PUSHJ PP,GETSYM ;GET A 6-BIT SYMBOL NAME JRST COMM7 ;BAD SYMBOL, GIVE UP PUSH PP,AC0 ;SAVE SYMBOL NAME JUMPCM COMM2 ;AND GET ANOTHER IF COMMA CAIE C,'[' ;MUST BE A [ JRST COMM7 ;YOU LOSE BYPASS ;SKIP ANY LEADING SPACES TLO IO,IORPTC ;BUT NOT LAST CHAR PUSHJ PP,EVALXQ ;GET SIZE OF COMMON CAIE C,']' ;MUST END RIGHT JRST COMM7 HRRZ V,AC0 ;GET VALUE ;PUSHDOWN STACK IS IN WRONG ORDER, REVERSE IT HRRZ RC,PP ;TOP ITEM HRRZ ARG,COMMP ;BOTTOM ITEM ADDI ARG,1 ;WELL ALMOST COMM6: CAIG RC,(ARG) ;ANYTHING TO MOVE? JRST COMM3 ;NO MOVE 0,(RC) ;MOVE TOP EXCH 0,(ARG) ;TO BOTTOM MOVEM 0,(RC) SUBI RC,1 ;DECREMENT AOJA ARG,COMM6 ;AND TRY AGAIN COMM3: JUMP1 [MOVE AC0,0(PP) ;[430] GET SYMBOL PUSHJ PP,SEARCH ;[430] PERFORM GENERAL SEARCH JRST COMM3A ;[430] NOT FOUND, GOOD JUMPL ARG,CMNERR ;[430] FOUND, OPERAND, WARN CAME AC0,-3(SX) ;[430] MACRO, LOOK ONE SLOT BELOW JRST COMM3A ;[430] NOT FOUND, CONTINUE JRST CMNERR ;[430] WARNING ] COMM3A: POP PP,AC0 ;GET SYMBOL OFF STACK JUMP1 .+2 ;IGNORE V ON PASS 1 PUSH PP,V ;SAVE VALUE PUSHJ PP,EXTER1 ;DEFINE AS EXTERNAL ;NOTE, CS IS NOT ON A COMMA, SO WILL RETURN JUMP1 COMM4 ;ALL DONE IF PASS1 SETZ RC, ;NO RELOCATION MOVEI ARG,4 ;FORM RADIX50 04,SYMBOL PUSHJ PP,SQOZE ;IN AC0 PUSHJ PP,COUT ;OUTPUT SYMBOL POP PP,V ;GET VALUE BACK MOVE AC0,V ;AND INTO AC0 PUSHJ PP,COUT ;SECOND PART OF PAIR COMM4: CAME PP,COMMP ;FINISHED WITH STACKED SYMBOLS JRST COMM3 ;NO MORE TO GO BYPASS ;GET NEXT DELIMITER JUMPCM COMM2 ;MORE TO GO IF COMMA NEXT COMM5: JUMP1 CPOPJ PUSHJ PP,COUTD ;DUMP THIS BLOCK POP PP,BLKTYP ;RESTORE LAST POPJ PP, COMM7: TRO ER,ERRA ;FLAG ERROR MOVE PP,COMMP ;RESET PUSHDOWN POINTER JRST COMM5 ;RESTORE BLKTYP AND EXIT CMNERR: PUSHJ PP,EWARN ;[430] WARNING MOVSI RC,[SIXBIT /SOC STATEMENT OUT OF ORDER .COMMON@/] ;[430] SYMBOL IN AC0 PUSHJ PP,TYPMSG ;[430] AOS QERRS ;[430] COUNT AS WARNING JRST COMM3A ;[430] CONTINUE ;[122] .REQUEST DEV:FILENAME[PPN] REQUIR: SKIPA CS,[16] ;BLOCK TYPE 16 REQUES: MOVEI CS,17 ;BLOCK TYPE 17 JUMP1 REMAR0 ;IGNORE ON PASS 1 PUSHJ PP,COUTD ;DUMP CURRENT PUSH PP,BLKTYP ;SAVE LAST BLOCK TYPE MOVEM CS,BLKTYP ;SET NEW REQU0: REPEAT 3, ;STACK A NULL SPEC INCASE OF ERROR BYPASS ;[345] FLUSH EXTRA TABS AND SPACES TLO IO,IORPTC ;[350]BACK OFF BECAUSE SCHGET ;[350]WILL TRY TO GET THIS CHARACTER PUSHJ PP,SCHGET ;[335] GET PART OF A FILE SPEC JUMPE AC0,REQUER ;[335] ERROR IF NOTHING CAIE C,':' ;WAS THERE A DEVICE JRST REQU1 ;NO, GOOD GUESS MOVEM AC0,-2(PP) ;SAVE DEVICE PUSHJ PP,SCHGET ;[335] GET THE FILE NAME JUMPE AC0,REQUER ;[335] ERROR IF NOTHING REQU1: MOVEM AC0,(PP) ;STORE FILE NAME CAIN C,'.' ;[335] SEE IF AN EXTENSION GIVEN JRST REQU4 ;[335] YES, GO SKIP IT AND MAKE SURE IT'S REQU3: ;[335] A .REL FILE, CAUSE THAT'S ALL IT CAN BE CAIE C,'[' ;WAS THERE A PPN JRST REQU2 ;NO, AS EXPECTED BYPASS ;SKIP ANY BLANKS TLO IO,IORPTC PUSHJ PP,EVALXQ ;GET HALF A PPN HRLM AC0,-1(PP) ;STORE IT PUSHJ PP,EVALXQ ;GET OTHER HALF HRRM AC0,-1(PP) ;STORE IT CAIE C,']' ;MUST END ON ] JRST REQUER ;IT DIDN'T BYPASS ;[273]HANDLE PPN CORRECTLY REQU2: SETZ RC, ;NO RELOCATION POP PP,AC0 ;GET FILE NAME PUSHJ PP,COUT POP PP,AC0 ;AND PPN PUSHJ PP,COUT POP PP,AC0 ;FINALLY DEVICE PUSHJ PP,COUT JUMPCM REQU0 ;MORE TO COME PUSHJ PP,COUTD ;DUMP BLOCK POP PP,BLKTYP ;RESTORE BLOCK TYPE POPJ PP, ;NO REQU4: PUSHJ PP,SCHGET ;[335] GO SCAN OUT EXTENSION HLRZ AC0,AC0 ;[335] SWAP FOR CAIE CAIE AC0,'REL' ;[335] SEE IF IT'S FOR .REL TRO ER,ERRQ ;[335] NOPE, TELL HIM ABOUT IT JRST REQU3 ;[335] BACK TO LOOK FOR PPN REQUER: SUB PP,[3,,3] ;REMOVE THE THREE ITEMS POP PP,BLKTYP ;RESTORE BLOCK TYPE JRST ERRAX ;AND GIVE UP ;[202] NEW .DIRECTIVE PSEUDO-OP ;[202] ARGS ARE FUNCTIONS TO BE DONE ;[421] CLEAN UP DIRECTIVE CODE ;[421] ADD .DIRECTIVE NO XXXX WHICH NEGATES EFFECT %DIREC: SETZM NOFLG ;START W/POSITIVE DIRECTIVE DIREC1: PUSHJ PP,GETSYM ;GET SYMBOL JRST ERRAX ;MISSING, GIVE ERROR CAMN AC0,[SIXBIT /NO/];IS IT "NO" JRST [ SKIPE NOFLG ;IS NEGATIVE FLAG OFF? TROA ER,ERRQ;NO. DONT ALLOW .DIRECT NO NO XXXX SETOM NOFLG ;SET AS NEGATIVE DIRECTIVE TLO IO,IORPTC ;REGET THE DELIMITER JRST DIREC1] ;AND GET NEXT SYMBOL MOVSI ARG,-DIRLEN ;AOBJN WORD CAMN AC0,DIRARG(ARG) ;LOOK FOR MATCH JRST DIRFND ;GOT IT AOBJN ARG,.-2 ;LOOP FOR ALL OF TABLE JRST ERRAX ;NOT FOUND, GIVE ERROR DIRFND: SKIPE NOFLG ;IS THIS A NEGATIVE DIRECTIVE? JRST DIRNDO ;YES,GO PROCESS IT XCT DIPXCT(ARG) ;EXECUTE THE INSTRUCTION JRST DIREND ;SEE IF MORE TO DO DIRNDO: ;HERE FOR NEGATIVE DIRECTIVE SKIPN DINXCT(ARG) ;ANYTHING THERE TO DO? TROA ER,ERRA ;NO, NOTHING TO DO XCT DINXCT(ARG) ;ELSE DO IT DIREND: JUMPCM %DIREC ;GET NEXT SYMBOL IF COMMA FOLLOWS POPJ PP, ;ELSE RETURN ; TABLES FOR DIRECTIVE PROCESSOR ;[421] ; THE DIRMAK MACRO DEFINES THE ARGUMENTS FOR THE .DIRECTIVE PSEUDO-OP ; THE FIRST ENTRY IS THE NAME OF THE PARTICULAR DIRECTIVE ; THE SECOND ENTRY IS THE INSTRUCTION TO EXECUTE IF THE CASE IS ; .DIRECTIVE XXXXXX ; THE THIRD ARGUMENT IS THE INSTRUCTION TO EXECUTE IF THE CASE IS ; .DIRECTIVE NO XXXXXX ; IF THERE IS NO LOGICAL NEGATIVE FOR THIS DIRECTIVE, IT SHOULD ; BE LEFT BLANK. ; THE THREE TABLES CREATED ARE DIRARG, DIPXCT, DINXCT DEFINE DIRMAK, < XLIST X (.NOBIN,) ;;DONT GENERATE REL FILE X (.ITABM,,);;INCLUDE TABS IN MACRO ARGS X (.XTABM,,);;EXCLUDE "" " "" X (KA10,) ;;SET PROCESSOR TYPE KA X (KI10,) ;;SET PROCESSOR TYPE KI X (KL10,) ;;SET PROCESSOR TYPE KL X (.OKOVL,,);;ALLOW /,* OVERFLOW X (.EROVL,,);;DONT ALLOW /,* OVERFLOW IFN TSTCD,< X (.TCDON,) ;;DEBUG NEW CODE TYPES X (.TCDOF,) ;; "" "" "" "" > ; END OF IFN TSTCD CONDITIONAL LIST > ; END OF DIRMAK DEFINITION ; DEFINE TABLE OF DIRECTIVE ARGUMENTS DEFINE X($A,$B,$C)< SIXBIT \$A\> DIRARG: DIRMAK DIRLEN==.-DIRARG ; DEFINE TABLE OF POSITIVE DIRECTIVE ACTIONS DEFINE X($A,$B,$C)< $B> DIPXCT: DIRMAK ; DEFINE TABLE OF NEGATIVE DIRECTIVE ACTIONS DEFINE X($A,$B,$C)< IFB <$C>, IFNB <$C>, <$C> > DINXCT: DIRMAK ; [421] SET THE VARIOUS FLAVORS OF CPU FOR LINK TO CHECK SETKA: SKIPA ARG,[1B5] ;[235] SETKI: MOVSI ARG,(2B5) ;[235] SKIPA ;[413]SET FOR KI OR KA SETKL: MOVSI ARG,(4B5) ;[413] KA=1 KI=2 KL=4 IORM ARG,CPUTYP ;[413]MAKE INCLUSIVE WITH WHAT IS THERE POPJ PP, ;[413]THEN RETURN ; [421] SET TEST CODE UP FOR DEBUGGING NEW LINK TYPES IFN TSTCD,< TCDSET: SETOM TCDFLG ;[414]SET FLAG ON PUSHJ PP,COUTD ;[414]BIND OFF LAST BLOCK POPJ PP, ;[414] > ; NFI TSTCD [414] ; PSEUDO-END STATEMENT FOR MULTI-FILE CAPABILITY ; HERE IF PRGEND (PASS 1) PSEND0: TLO IO,MFLSW ;PSEND SEEN PUSHJ PP,END0 ;AS IF END STATEMENT HLLZS IO ;CLEAR ER(RH) SETZM ERRCNT ;CLEAR ERROR COUNT FOR EACH PROG. SETZM QERRS ;[145] ... JUMP2 PSEND2 ;DIFFERENT ON PASS2 SKIPE UNIVSN ;SEEN A UNIVERSAL PUSHJ PP,UNISYM ;YES, STORE SYMBOLS PUSHJ PP,PSEND4 ;SAVE SYMBOLS, POINTERS AND TITLE MOVE AC0,[ASCII /.MAIN/] ;[420] GET DEFAULT TITLE MOVEM AC0,TBUF ;[420]AND MAKE IT CURRENT TITLE SETZM TBUF+1 ;CLEAR TITLE SEEN FLAG SETZM RELLOC ;[346] CLEAR TO PREVENT EFFECTS ACROSS PRGEND PSEND1: TLZ IO,MFLSW ;FOR NEXT FILE SETZM UNISCH ;CLEAR UNIVERSAL SEARCH TABLE MOVE AC0,[UNISCH,,UNISCH+1] BLT AC0,UNISCH+.UNIV-1 TLO IO,IOPAGE ;[142] SIGNAL NEW PAGE BUT DON'T CHANGE NUMBER MOVSI AC0,1 ;SET SO RELOC 0 WORKS HRRZM AC0,LOCA ;[165] SET ASSEMBLY LOCATION HRRZM AC0,LOCO ;[165] AND OUTPUT LOCATION HLRZM AC0,MODA ;[165] SET MODE HLRZM AC0,MODO ;[165] POPJ PP, ;[165] ; HERE IF PRGEND (PASS 2) PSEND2: SETZM SBUF ;SO SUBTTL IS NOT WRONG SETZM UNIVSN ;[226] IN CASE IN UNIVERSAL PUSHJ PP,PSEND5 ;PUT TITLE BACK PUSHJ PP,PSEND1 ;COMMON CODE JRST PASS20 ;OUTPUT THE ENTRIES ; HERE IF END (PASS 1) PSEND3: PUSHJ PP,PSEND4 ;SAVE LAST PROGRAM HLRS PRGPTR ;REINITIALIZE POINTER PJRST PSEND5 ;READ BACK FIRST PROGRAM ;HERE TO SAVE AND RESTORE SYMBOL TABLE, TITLE AND OTHER USEFUL LOCATIONS XTRA==7 ;NUMBER OF OTHER LOCATIONS TO SAVE PSEND4: MOVE V,FREE ;GET NEXT FREE LOCATION ADDI V,LENGTH+.TBUF/5+XTRA IFN POLISH,< ADD V,SGNMAX ADD V,SGNMAX ADD V,SGNMAX ADD V,SGNMAX > CAML V,SYMBOL ;WILL WORST CASE FIT? PUSHJ PP,XCEED ;NO, EXPAND MOVS V,FREE HRR V,PRGPTR ;LAST PRGEND BLOCK HLRM V,(V) ;LINK THIS BLOCK SKIPN PRGPTR ;IF FIRST TIME HLLZM V,PRGPTR ;SET LINK TO START OF CHAIN HLRM V,PRGPTR ;POINTER TO IT SETZM @FREE ;CLEAR LINK WORD AOS FREE ;THIS LOCATION USED NOW MOVS AC0,SYMBOL ;BOTTOM OF SYMBOL TABLE HRR AC0,FREE ;FREE SPACE MOVE V,@SYMBOL ;GET NUMBER OF SYMBOLS ASH V,1 ;TWO WORDS PER SYMBOL ADDI V,1 ;ONE MORE FOR COUNT ADDB V,FREE ;END OF TABLE WHEN MOVED BLT AC0,(V) ;MOVE TABLE HRRZ AC0,.JBREL ;TOP OF CORE SUBI AC0,1 MOVEM AC0,SYMTOP ;FOR NEXT SYMBOL TABLE SUBI AC0,LENGTH ;LENGTH OF INITIAL SYMBOLS MOVEM AC0,SYMBOL ;SET POINTER TO COUNT OF SYMBOLS HRLI AC0,SYMNUM ;BLT POINTER BLT AC0,@SYMTOP ;SET UP INITIAL SYMBOL TABLE PUSHJ PP,SRCHI ;SET UP SEARCH POINTER MOVEI AC0,.TBUF ;MAX NUMBER OF CHARS. IN TITLE SUB AC0,TCNT ;ACTUAL NUMBER IDIVI AC0,5 ;NUMBER OF WORDS SKIPE AC1 ;REMAINDER? ADDI AC0,1 ;YES MOVEM AC0,@FREE ;STORE COUNT AOS FREE ;THIS LOCATION USED NOW EXCH AC0,FREE ;SET UP AC0 FOR BLT ADDM AC0,FREE ;WILL BE AFTER TITLE MOVES HRLI AC0,TBUF ;BLT POINTER BLT AC0,@FREE ;MOVE TITLE IFN POLISH,< MOVE AC2,SGNMAX ;PSECT COUNT MOVE AC0,AC2 PUSHJ PP,STORIT ;SAVE PSECT COUNT MOVE AC0,SGNAME(AC2) PUSHJ PP,STORIT ;SAVE PSECT NAME MOVE AC0,SGRELC(AC2) PUSHJ PP,STORIT ;SAVE MODE AND PC MOVE AC0,SGSCNT(AC2) PUSHJ PP,STORIT ;SAVE SYM CNT MOVE AC0,SGATTR(AC2) PUSHJ PP,STORIT ;SAVE BREAK AND ATTRS SOJGE AC2,.-10 SETZM SGNMAX ;ZERO PSECT CNT SETZM SGNAME ;BLANK PSECT NAME MOVSI AC0,1 ;SET RELOCATION MOVEM AC0,SGRELC ; TO RELATIVE ZERO MOVE AC0,@SYMBOL ;GET SYM CNT MOVEM AC0,SGSCNT ;SAVE PSECT SYM CNT PUSHJ PP,SRCHI ;SET UP SEARCH POINTER > MOVE AC0,LITHD ;[251] LENGTH ,, START PUSHJ PP,STORIT ;[251] MOVE AC2,LITHDX ;POINTER TO LIT INFO. MOVE AC0,-1(AC2) ;SIZE OF PASS1 LOCO PUSHJ PP,STORIT ;SAVE IT IN SYMBOL TABLE MOVE AC2,VARHDX ;SAME FOR VARS MOVE AC0,-1(AC2) PUSHJ PP,STORIT MOVE AC0,(AC2) PUSHJ PP,STORIT SETZM (AC2) ;CLEAR NUMBER OF VARIABLES SEEN MOVE AC0,HISNSW ;GET TWOSEG/HISEG FLAG HRR AC0,HIGH1 ;AND PASS1 BREAK PUSHJ PP,STORIT SETZM HISNSW ;[412] CLEAR HISEG FLAG FOR NEXT PROGRAM JUMPGE AC0,PSEND6 ;NOT TWOSEG MOVE AC0,SVTYP3 ;HIGH SEGMENT OFFSET PUSHJ PP,STORIT ;SAVE IT ALSO PSEND6: MOVE AC0,FREE ;GET NEXT FREE LOCATION SUBI AC0,1 ;LAST ONE USED HRRZ V,PRGPTR ;POINTER TO START OF DATA BLOCK HRLM AC0,(V) ;LINK TO END OF BLOCK POPJ PP, ;RETURN PSENDX: PUSHJ PP,XCEED ;NEED TO EXPAND CORE FIRST PSEND5: HRRZ V,.JBREL ;[170] GET TOP OF CORE SETZM (V) ;[170] CLEAR OR GET ILL MEM REF MOVEI AC0,-1(V) ;[170] MOVEM AC0,SYMTOP ;TOP OF NEW SYMBOL TABLE HRRZ V,PRGPTR ;ADDRESS OF THIS BLOCK JUMPE V,PSNDER ;ERROR LINK NOT SET UP MOVE AC1,(V) ;NEXT LINK MOVE V,1(V) ;GET ITS SYMBOL COUNT ASH V,1 ;NUMBER OF WORDS ADDI V,1 ;PLUS ONE FOR COUNT SUBI AC0,(V) ;START OF NEW SYMBOL TABLE CAMG AC0,FREE ;WILL IT FIT JRST PSENDX ;NO, NEED TO EXPAND AND RESET AC0 ADD V,PRGPTR ;POINT TO END OF SYMBOL TABLE MOVEI V,1(V) ;THEN TO BEG OF TITLE MOVEM AC0,SYMBOL ;BOTTOM OF NEW TABLE HRL AC0,PRGPTR ;ADDRESS OF FIRST WORD OF BLOCK ADD AC0,[1,,0] ;MAKE BLT POINTER HRRM AC1,PRGPTR ;POINT TO NEXT BLOCK BLT AC0,@SYMTOP ;MOVE TABLE PUSHJ PP,SRCHI ;SET UP POINTER MOVE AC1,(V) ;NUMBER OF WORDS OF TITLE MOVEI AC0,1(V) ;START OF STORED TITLE ADD V,AC1 ;INCREMENT PAST TITLE ADDI AC1,TBUF-1 ;END OF TITLE HRLI AC0,TBUF ;WHERE TO PUT IT MOVSS AC0 ;BLT POINTER BLT AC0,(AC1) ;MOVE TITLE IFN POLISH,< PUSHJ PP,GETIT ;GET PSECT COUNT MOVE AC2,AC0 MOVEM AC2,SGNMAX PUSHJ PP,GETIT ;GET PSECT NAME MOVEM AC0,SGNAME(AC2) PUSHJ PP,GETIT ;GET MODE AND PC MOVEM AC0,SGRELC(AC2) PUSHJ PP,GETIT ;GET SYM CNT MOVEM AC0,SGSCNT(AC2) PUSHJ PP,GETIT ;GET BREAK AND ATTRS MOVEM AC0,SGATTR(AC2) SOJGE AC2,.-10 SETZM SGNCUR ;SET TO BLANK PSECT PUSHJ PP,SRCHI ;SET UP POINTER > SKIPN TBUF+1 ;CHECK TITLE SEEN FLAG AOS TBUF+1 ;AND SET IT NON-ZERO PUSHJ PP,GETIT ;[251] MOVEM AC0,LITHD ;[251] MOVE AC2,LITHDX ;INVERSE OF ABOVE PUSHJ PP,GETIT MOVEM AC0,-1(AC2) MOVE AC2,VARHDX ;SAME FOR VARS PUSHJ PP,GETIT MOVEM AC0,-1(AC2) PUSHJ PP,GETIT MOVEM AC0,(AC2) ;RESTORE COUNT OF VARS PUSHJ PP,GETIT ;GET TWO HALF WORDS HRRZM AC0,HIGH1 ;PASS1 BREAK HLLEM AC0,HISNSW ;TWOSEG/HISEG FLAG JUMPGE AC0,CPOPJ ;NOT TWOSEG PUSHJ PP,GETIT MOVEM AC0,SVTYP3 ;BLOCK 3 WORD POPJ PP, STORIT: MOVEM AC0,@FREE ;STORE IT IN DATA BLOCK AOS FREE ;ADVANCE POINTER POPJ PP, GETIT: MOVE AC0,1(V) ;FILL AC0 OUT OF PRGEND BLOCK AOJA V,CPOPJ ;INCREMENT AND RETURN PSNDER: HRROI RC,[SIXBIT /PGE PRGEND ERROR @/] ;[377] JRST ERRFIN ;MULTIPLE SYMBOL TABLE FEATURE PSEUDO-OPS UNIV0: JUMP2 UNIV2 ;[226] DO PROPER PASS2 STUFF HRRZ SX,UNIVNO ;GET NUMBER OF UNIVERSALS SEEN CAIL SX,.UNIV ;ALLOW ONE MORE? JRST UNVERR ;NO, GIVE FATAL ERROR SETOM UNIVSN ;AND SET SEEN A UNIVERSAL JRST TITLE0 ;CONTINUE AS IF TITLE UNIV2: HLLOS UNIVSN ;[226] ENSURE SET UP FOR UNIVERSAL JRST REMAR0 ;[226] AND IGNORE LINE ADDUNV: PUSH PP,RC ;AN AC TO USE PUSHJ PP,NOUT ;CONVERT TO SIXBIT HRRZ RC,UNIVNO ;GET ENTRY INDEX MOVEM AC0,UNITBL+1(RC) ;STORE SIXBIT NAME IN TABLE MOVEM AC0,UNVDIR ;AND FOR ENTER LATER HRRZS UNIVSN ;ONLY DO IT ONCE POP PP,RC ;RESTORE RC POPJ PP, ;AND RETURN UNVERR: HRROI RC,[SIXBIT /TMU TOO MANY UNIVERSALS@/] JRST ERRFIN UNISYM: PUSHJ PP,SUPRSA ;TURN ON SUPPRESS BIT SKIPN UNVSKP ;SKIP IF /U SEEN PUSHJ PP,UNVOUT ;OUTPUT SYMBOL TABLE TLNN IO,MFLSW ;[231] ALSO IN PRGEND? JRST UNISYN ;[231] NO MOVE AC0,@SYMBOL ;[231] GET NO. OF SYMBOLS LSH AC0,1 ;[231] 2 WORDS EACH ADDI AC0,1 ;[231] PLUS COUNT ADD AC0,FREE ;[231] HOW MUCH WE WILL NEED CAML AC0,SYMBOL ;[231] WILL IT FIT IN WHAT WE HAVE UNISYK: PUSHJ PP,XCEED ;[355] [231] NO, EXPAND CAML AC0,SYMBOL ;[355] ENOUGH? JRST UNISYK ;[355] NO,EXPAND UNISYN: PUSH PP,SYMBOL ;NEED TO SAVE INCASE PRGEND MOVE AC0,SYMTOP ;TOP OF TABLE SUB AC0,SYMBOL ;GET LENGTH OF TABLE HRL ARG,SYMBOL ;BOTTOM OF TABLE HRR ARG,FREE ;WHERE TO GO HRRZ RC,UNIVNO ;GET TABLE INDEX HRRM ARG,SYMBOL ;WILL BE THERE SOON HRRZM ARG,UNIPTR+1(RC) ;STORE IN CORRESPONDING PLACE ADDB AC0,FREE ;WHERE TO END HRLM AC0,UNIPTR+1(RC) ;SAVE NEW SYMTOP BLT ARG,@FREE ;MOVE TABLE HRRZM AC0,UNITOP ;SAVE TOP OF TABLES+1 CAMLE AC0,MACSIZ ;IN CASE OVER A K BOUND MOVEM AC0,MACSIZ ;DON'T REDUCE SO FAR NOW MOVE AC0,SRCHX ;SAVE OLD SEARCH POINTER PUSHJ PP,SRCHI ;GET SEARCH POINTER EXCH AC0,SRCHX MOVEM AC0,UNISHX+1(RC) ;SAVE IT POP PP,SYMBOL ;RESTORE OLD VALUE SETZM UNIVSN ;CLEAR FLAG INCASE PRGEND AOS UNIVNO ;SIGNAL ANOTHER UNIVERSAL SAVED POPJ PP, ;RETURN SERCH0: PUSHJ PP,GETSYM ;GET A SYMBOL JRST ERRAX ;ERROR IF NOT VALID MOVE RC,UNIVNO ;NUMBER OF UNIVERSALS AVAILABLE JUMPE RC,UNVINP ;TRY TO READ SYMBOLS FROM DSK CAME AC0,UNITBL(RC) ;LOOK FOR MATCH SOJA RC,.-2 ;NOT FOUND YET SERCH1: MOVE AC0,RC ;STORE TABLE ENTRY NUMBER MOVEI RC,1 ;START AT ENTRY ONE CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR JRST SCHERR ;SHOULD NEVER HAPPEN!! SKIPE UNISCH(RC) ;LOOK FOR AN EMPTY SLOT AOJA RC,.-3 ;NOT FOUND YET MOVEM AC0,UNISCH(RC) ;STORE INDEX IN TABLE CAIE C,'(' ;[240] GIVING FILE SPEC? JRST SERCH4 ;[240] NO SERCH2: PUSHJ PP,GETCHR ;[240] YES, GET RID OF IT CAIN C,')' ;[266] LOOK FOR END JRST SERCH3 ;[266] FOUND IT CAIE C,EOL ;[266] REACHED END OF LINE? JRST SERCH2 ;[266] NO, KEEP LOOKING TROA ER,ERRQ ;[266] GIVE UP AND FLAG ERROR SERCH3: PUSHJ PP,GETCHR ;[240] GET NEXT CHAR SERCH4: JUMPCM SERCH0 ;[240] LOOK FOR MORE NAMES POPJ PP, ;FINISHED VERSKW: MOVSI RC,[SIXBIT /UVS UNIVERSAL VERSION SKEW, REASSEMBLE UNIVERSAL@/] ;[364] JRST ERRFIN ;[364] NAME IN AC0 SCHERR: MOVSI RC,[SIXBIT /CFU CANNOT FIND UNIVERSAL@/] JRST ERRFIN ;NAME IN AC0 ;MESSAGE FOR CASE WHERE FILES AFTER UNIVERSAL USED MORE BUFFER SPACE THAN FIRST UNIVERSAL UNIERR: HRROI RC,[SIXBIT /USS UNIVERSAL PROGRAM(S) MUST HAVE SAME OUTPUT SPECIFICATION AS OTHER FILES@/] JRST ERRFIN SCHGET: SETZ AC0, ;[240] INITIALIZE MOVSI AC1,(POINT 6,AC0) ;[240] SCHGNX: PUSHJ PP,GETCHR ;[240] GET NEXT CHARACTER CAIE C,'.' ;[240] SPECIAL TEST FOR END OF NAME TLNN CS,6 ;[240] OR ANY NON-ALPHANUMERIC PJRST BYPAS2 ;[240] SKIP ALL SPACES AND QUIT TLNE AC1,770000 ;[240] ALL SIX IN YET? IDPB C,AC1 ;[240] NO, STORE THIS ONE JRST SCHGNX ;[240] GET NEXT SCHOCT: SETZ AC0, ;[240] INITIALIZE SCHONX: PUSHJ PP,GETCHR ;[240] GET NEXT CHAR TLNN CS,4 ;[240] NUMBER PJRST BYPAS2 ;[240] NO, SKIP TRAILING SPACES LSH AC0,3 ;[240] MAKE SPACE ADDI AC0,-'0'(C) ;[240] AND STOW DIGIT JRST SCHONX ;[240] GET NEXT SUBTTL MACRO/REPEAT HANDLERS REPEA0: PUSHJ PP,EVALXQ ;EVALUATE REPEAT EXP, EXTERNS ARE ILL. JUMPNC ERRAX REPEA1: SETZM COMSW ;[425] SET COMMENT SWITCH JUMPLE AC0,REPZ ;PASS THE EXP., DONT PROCESS SOJE AC0,REPO ;REPEAT ONCE REPEA2: PUSHJ PP,GCHARQ ;GET STARTING "<" PUSHJ PP,COMTST ;[425] IGNORE COMMENTS SKIPN COMSW ;[425] INSIDE A COMMENT? CAIG C," " ;[373] TEXT FORMATTING CHARACTER? JRST REPEA2 ;[373] YES, GET NEXT CAIE C,"<" ;[373] "<"? JRST REPMAB ;[373] NO, ERROR PUSHJ PP,SKELI1 ;INITIALIZE SKELETON PUSH MP,REPEXP MOVEM AC0,REPEXP PUSH MP,REPPNT ;STACK PREVIOUS REPEAT POINTER MOVEM ARG,REPPNT ;STORE NEW POINTER TDZA SDEL,SDEL ;YES, INITIALIZE BRACKET COUNT AND SKIP REPEA4: PUSHJ PP,WCHARQ ;WRITE A CHARACTER PUSHJ PP,GCHARQ ;GET A CHARACTER CAIN C,"<" ;"<"? AOJA SDEL,REPEA4 ;YES, INCREMENT AND WRITE CAIE C,">" ;">"? JRST REPEA4 ;NO, WRITE THE CHARACTER SOJGE SDEL,REPEA4 ;YES, WRITE IF NON-NEGATIVE COUNT MOVSI CS,(BYTE (7) 177,3) ;SET "REPEAT" END PUSHJ PP,WWRXE ;WRITE END SKIPN LITLVL ;LITERAL MIGHT END ON LINE SKIPE MACLVL ;IF IN MACRO DARE NOT PROCESS JRST REPEA5 ;REST OF LINE SINCE MACRO MIGHT END ON IT BYPASS PUSHJ PP,STOUTS ;POLISH OF LINE BEFORE PROCESSING REPEAT REPEA5: PUSH MP,MRP ;STACK PREVIOUS READ POINTER PUSH MP,RCOUNT ;SAVE WORD COUNT HRRZ MRP,REPPNT ;SET UP READ POINTER SKIPN MACLVL ;IF IN MACRO GIVE CR-LF FIRST SKIPE LITLVL ;SAME FOR LITERAL JRST REPEA7 AOJA MRP,POPOUT ;BYPASS ARG COUNT REPEA7: HRRZ MRP,REPPNT ;SET UP READ POINTER ADDI MRP,1 ;BYPASS ARG COUNT REPEA8: MOVEI C,LF JRST RSW2 REPEND: SOSL REPEXP JRST REPEA7 HRRZ V,REPPNT ;GET START OF TREE PUSHJ PP,REFDEC ;DECREMENT REFERENCE POP MP,RCOUNT POP MP,MRP POP MP,REPPNT POP MP,REPEXP SKIPN LITLVL ;IF IN LITERAL OR SKIPE MACLVL ;IF IN MACRO JRST RSW0 ;FINISH OF LINE NOW JRST REPEA8 REPMAB: HRROI RC,[SIXBIT /MBR MISSING OPEN ANGLE BRACKET FOR REPEAT@/] ;[373] JUMP1 .+2 ;[373] ONLY COUNT ERROR ON PASS 2 AOS ERRCNT ;[373] INCREMENT ERROR COUNT JRST ERRNE0 ;[373] COMMON MESSAGE REPZ: FORERR (SDEL,REP) SETOM INREP REPZ0: PUSHJ PP,GCHAR ;[425] GET STARTING < PUSHJ PP,COMTST ;[425] IGNORE COMMENTS SKIPN COMSW ;[425] INSIDE A COMMENT? CAIG C," " ;[425] TEXT-FORMATTING CHARACTER? JRST REPZ0 ;[425] YES, GET NEXT CAIE C,"<" ;[425] < ? JRST CORMAB ;[425] NO, ERROR MOVEI SDEL,1 ;[425] SET COUNT REPZ1: PUSHJ PP,GCHAR ;GET NEXT CHARACTER CAIN C,"<" ;"<"? AOJA SDEL,REPZ1 ;YES, INCREMENT COUNT CAIN C,">" ;">"? SOJLE SDEL,REPZ2 ;YES, EXIT IF MATCHING JRST REPZ1 ;NO, RECYCLE REPZ2: SETZM INREP ;FLAG OUT OF IT SETZM INCND ;AND CONDITIONAL ALSO JRST STMNT ;AND EXIT REPO: PUSHJ PP,GCHAR ;GET "<" PUSHJ PP,COMTST ;[425] IGNORE COMMENTS SKIPN COMSW ;[425] INSIDE A COMMENT? CAIG C," " ;[425] TEXT-FORMATTING CHARACTER? JRST REPO ;[425] YES, GET NEXT CAIE C,"<" ;[425] < ? JRST CORMAB ;[425] NO, ERROR SKIPE RPOLVL ;ARE WE NESTED? AOS RPOLVL ;YES, DECREMENT CURRENT PUSH MP,RPOLVL SETOM RPOLVL JRST STMNT REPO1: CAIN C,"<" SOS RPOLVL CAIN C,">" AOSE RPOLVL JRST RSW2 POP MP,RPOLVL PUSHJ PP,RSW2 JRST RSW0 CORMAB: HRROI RC,[SIXBIT /MBC MISSING OPEN ANGLE BRACKET FOR CONDITIONAL OR REPEAT@/] ;[425] JUMP1 .+2 ;[425] ONLY COUNT ERROR ON PASS 2 AOS ERRCNT ;[425] INCREMENT ERROR COUNT JRST ERRNE0 ;[425] COMMON MESSAGE COMTST: CAIG C,FF ;[425] SEARCH FOR END OF LINE CAIGE C,LF ;[425] LF, VT OR FF? JRST .+2 ;[425] WASN'T ANY OF THEM SETZM COMSW ;[425] RESET COMMENT SWITCH CAIN C,";" ;[425] COMMENT? SETOM COMSW ;[425] YES, SET COMMENT SWITCH POPJ PP, ;[425] CONTINUE DEFIN0: PUSHJ PP,GETSYM ;GET MACRO NAME JRST ERRAX ;EXIT ON ERROR MOVEM PP,PPTMP1 ;SAVE POINTER MOVEM AC0,PPTMP2 ;SAVE NAME TLO IO,IORPTC FORERR (SX,DEF) SETOM INDEF ;AND FLAG IN DEFINE SETZB SX,.TEMP ;[425] SET ARGUMENT AND REFERENCE COUNT SETZM COMSW ;[425] AND COMMENT SWITCH DEF02: PUSHJ PP,GCHAR ;SEARCH FOR "(" OR "<" PUSHJ PP,COMTST ;[425] IGNORE COMMENTS SKIPE COMSW ;INSIDE A COMMENT? JRST DEF02 ;YES, IGNORE CHARACTER CAIN C,"<" ;"<"? JRST DEF20 ;YES CAIE C,"(" ;"("? JRST DEF02 ;NO DEF10: PUSHJ PP,GETSYM ;YES, GET DUMMY SYMBOL TRO ER,ERRA ;FLAG ERROR ADDI SX,1 ;INCREMENT ARG COUNT PUSH PP,AC0 ;STACK IT CAIN C,'<' ;A DEFAULT ARGUMENT COMING UP? JRST DEF80 ;YES, STORE IT AWAY CAIE C,11 ;")"? JRST DEF10 ;NO, GET NEXT DUMMY SYMBOL DEF12: PUSHJ PP,GCHAR PUSHJ PP,COMTST ;[425] IGNORE COMMENTS SKIPN COMSW ;[425] SKIP IF INSIDE COMMENT CAIE C,"<" ;"<"? JRST DEF12 ;NO DEF20: PUSH PP,[0] ;YES, MARK THE LIST LSH SX,9 ;SHIFT ARG COUNT AOS ARG,SX PUSHJ PP,SKELI ;INITIALIZE MACRO SKELETON MOVE AC0,PPTMP2 ;GET NAME TLO IO,DEFCRS PUSH PP,UNISCH+1 ;MUST NOT SEARCH UNIVERSALS AT THIS POINT SETZM UNISCH+1 ;OTHERWISE ORIGINAL DEFINITION WILL BE LOST PUSHJ PP,MSRCH ;SEARCH THE TABLE JRST DEF24 ;NOT FOUND TLNN ARG,MACF ;FOUND, IS IT A MACRO? TROA ER,ERRX ;NO, FLAG ERROR AND SKIP PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE DEF24: POP PP,UNISCH+1 ;BACK AS IT WAS HRRZ V,WWRXX ;GET START OF TREE SKIPN .TEMP ;ANY DEFAULT ARGUMENTS TO TAKE CARE OF? JRST DEF25 ;NO HRRZ C,1(V) ;GET SHIFTED ARG COUNT LSH C,-9 ;GET ARG COUNT BACK ADDI C,1 ;ONE MORE FOR TERMINAL ZERO ADD C,.TEMP ;NUMBER OF ITEMS IN STACK HRLS C ;MAKE XWD MOVE SDEL,.TEMP ;NUMBER OF WORDS NEEDED ADDI SDEL,1 ;[341] PLUS THE 0 AT THE END ADDB SDEL,FREE ;FROM FREE CORE CAML SDEL,SYMBOL ;MORE CORE NEEDED PUSHJ PP,XCEEDS ;YES, TRY TO GET IT SUB SDEL,.TEMP ;FORM POINTER SUBI SDEL,1 ;[341] MINUS THE 0 SUB PP,C ;[341] BACK UP STACK TO START OF ARGS HRLM SDEL,1(V) ;STORE IT WITH ARG COUNT IN MACRO SUBI SDEL,1 ;TO USE FOR PUSHING POINTER INTO STORAGE MOVEI C,1(PP) ;POINT TO START OF STACK DEF26: MOVE ARG,(C) ;GET AN ITEM OFF STACK TLNN ARG,-40 ;A POINTER? JUMPN ARG,[PUSH SDEL,ARG ;YES, STORE IT AOJA C,DEF26] ;GET NEXT PUSH PP,ARG ;RESTACK ARGUMENT SKIPE ARG ;FINISHED IF ZERO AOJA C,DEF26 ;GET NEXT PUSH SDEL,ARG ;STORE ZERO IN DEFAULT LIST ALSO DEF25: MOVSI ARG,MACF MOVEM PP,PPTMP2 ;STORE TEMP STORAGE POINTER PUSHJ PP,INSERT ;INSERT/UPDATE TLZ IO,DEFCRS ;JUST IN CASE SETZM ARGF ;NO ARGUMENT SEEN SETZM SQFLG ;AND NO ' SEEN TDZA SDEL,SDEL ;CLEAR BRACKET COUNT DEF30: PUSHJ PP,WCHAR ;WRITE CHARACTER DEF31: PUSHJ PP,GCHAR ;GET A CHARACTER DEF32: MOVE CS,C ;GET A COPY CAIN C,";" ;IS IT A COMMENT JRST CPEEK ;YES CHECK FOR ;; DEF33: CAIG CS,"Z"+40 ;CONVERT LOWER CASE CAIGE CS,"A"+40 JRST .+2 SUBI CS,40 CAIGE CS,40 ;TEST FOR CONTROL CHAR. JRST [SKIPN SQFLG ;HAS SINGLE QUOTE BEEN SEEN? JRST DEF30 ;NO, OUTPUT THIS CHAR. PUSH PP,C ;YES, SAVE CURRENT CHAR MOVEI C,47 ;SET UP QUOTE PUSHJ PP,WCHAR ;WRITE IT POP PP,C ;GET BACK CURRENT CHAR. SETZM SQFLG ;RESET FLAG JRST DEF30] ;AND CONTINUE CAILE CS,77+40 JRST DEF30 ;TEST FOR SPECIAL MOVE CS,CSTAT-40(CS) ;GET STATUS BITS TLNE CS,6 ;ALPHA-NUMERIC? JRST DEF40 ;YES SKIPN SQFLG ;WAS A ' SEEN? JRST DEF36 ;NO, PROCESH PUSH PP,C ;YES, SAVE CURRENT CHARACTER MOVEI C,47 ;AND PUT IN A ' PUSHJ PP,WCHAR ;... POP PP,C ;RESTORE CURRENT CHARACTER SETZM SQFLG ;AND RESET FLAG DEF36: CAIE C,47 ;IS THIS A '? JRST DEF35 ;NOPE SKIPN ARGF ;YES, WAS LAST THING SEEN AN ARG? SETOM SQFLG ;IF NOT, SET SNGL QUOT FLAG SETZM ARGF ;BUT NOT ARGUMENT IN ANY CASE JRST DEF31 ;GO GET NEXT CHARACTER DEF35: SETZM ARGF ;THIS IS NOT AN ARGUMENT CAIN C,"<" ;"<"? AOJA SDEL,DEF30 ;YES, INCREMENT COUNT AND WRITE CAIN C,">" ;">"? SOJL SDEL,DEF70 ;YES, TEST FOR END JRST DEF30 ;NO, WRITE IT CPEEK: TLNN IO,IOPALL ;IF LALL IS ON JRST DEF33 ;JUST RETURN PUSH PP,CS ;NEED TO SAVE CS, SINCE CHARAC MAY DESTROY IT PUSHJ PP,PEEK ;LOOK AT NEXT CHAR. POP PP,CS ;RESTORE CS CAIN C,";" ;IS IT ;;? JRST CPEEK0 ;[325] YES, GO SCAN LINE MATCHING ANGLE BRAKETS MOVE C,CS ;RESTORE C JRST DEF33 ;AND RETURN CPEEK0: SETZM CPEEKC ;[325] CLEAR MATCHING ANGLE COUNTER CPEEK1: PUSHJ PP,GCHAR ;[325] GET A CHARACTER CAIN C,"<" ;[325] SEE IF LEFT ANGLE AOJA SDEL,CPEEKL ;[325] YES, GO ADD TO COUNT CAIN C,">" ;[325] SEE IF RIGHT ANGLE SOJA SDEL,CPEEKR ;[325] YES, GO SUBTRACT FROM COUNT CAIG C,CR ;[325] SEE IF AN CAIGE C,LF ;[325] END OF LINE CHARACTER JRST CPEEK1 ;[325] NO, CONTINUE CPEK1A: SKIPL CPEEKC ;[347] YES, SEE IF UNMATCHED ANGLES JRST CPEEK3 ;[332] NO, GO SEE IF END OF MACRO PUSH PP,C ;[325] SAVE EOL CHARACTER CPEEK2: MOVEI C,">" ;[325] SET TO PUT IN SOME RIGHTS PUSHJ PP,WCHAR ;[325] GO DO ONE AOSGE CPEEKC ;[325] SEE IF ENOUGH JRST CPEEK2 ;[325] NO, LOOP POP PP,C ;[325] RECOVER EOL CHARACTER CPEEK3: JUMPL SDEL,DEF70 ;[332] IF END OF MACRO, LEAVE COMPLETELY JRST DEF32 ;[325] AND GET OUT OF LINE CPEEKL: AOS CPEEKC ;[325] ADD IN LEFT ANGLE BRACKET JRST CPEEK1 ;[325] TO NEXT CHARACTER CPEEKR: JUMPL SDEL,CPEK1A ;[366] JUMP IF END OF MACRO SOS CPEEKC ;[325],[347]SUBTRACT OUT RIGHT BRACKET JRST CPEEK1 ;[347]CONTINUE DEF40: MOVEI AC0,0 ;CLEAR ATOM MOVSI AC1,(POINT 6,AC0) ;SET POINTER DEF42: PUSH PP,C ;STACK CHARACTER TLNE AC1,770000 ;HAVE WE STORED 6? IDPB CS,AC1 ;NO, STORE IN ATOM PUSHJ PP,GCHAR ;GET NEXT CHARACTER MOVE CS,C CAIG CS,"Z"+40 CAIGE CS,"A"+40 JRST .+2 SUBI CS,40 ;CONVERT LOWER TO UPPER CAIL CS,40 CAILE CS,77+40 JRST DEF44 ;TEST SPECIAL MOVE CS,CSTAT-40(CS) ;GET STATUS TLNE CS,6 ;ALPHA-NUMERIC? JRST DEF42 ;YES, GET ANOTHER DEF44: PUSH PP,[0] ;NO, MARK THE LIST MOVE SX,PPTMP1 ;GET POINTER TO TOP DEF46: SKIPN 1(SX) ;END OF LIST? JRST DEF50 ;YES CAME AC0,1(SX) ;NO, DO THEY COMPARE? AOJA SX,DEF46 ;NO, TRY AGAIN SUB SX,PPTMP1 ;YES, GET DUMMY SYMBOL NUMBER LSH SX,4 MOVSI CS,<(BYTE (7) 177,101)>(SX) ;SET ESCAPE CODE MACEND LSH AC0,-^D30 CAIN AC0,5 ;"%"? TLO CS,1000 ;YES, SET CRESYM FLAG PUSHJ PP,WWORD ;WRITE THE WORD SETOM ARGF ;SET ARGUMENT SEEN FLAG SETZM SQFLG ;AND IGNORE ANY ' WAITING TO GET INTO STRING DEF48: MOVE PP,PPTMP2 ;RESET PUSHDOWN POINTER TLO IO,IORPTC ;ECHO LAST CHARACTER JRST DEF31 ;RECYCLE DEF50: SKIPN SQFLG ;HAVE WE SEEN A '? JRST DEF51 ;NOPE MOVEI C,47 ;YES, PUT IT IN PUSHJ PP,WCHAR ;... SETZM SQFLG ;AND CLEAR FLAG DEF51: MOVE C,2(SX) ;GET CHARACTER JUMPE C,DEF48 ;CLEAN UP IF END PUSHJ PP,WCHAR ;WRITE THE CHARACTER AOJA SX,DEF51 ;GET NEXT DEF70: MOVE PP,PPTMP1 ;RESTORE PUSHDOWN POINTER MOVSI CS,(BYTE (7) 177,1) PUSHJ PP,WWRXE ;WRITE END SETZM INDEF ;OUT OF IT JRST BYPAS1 ; HERE TO STORE DEFAULT ARGUMENTS DEF80: AOS .TEMP ;COUNT ONE MORE PUSHJ PP,SKELI1 ;INITIALIZE SKELETON HRL V,SX ;SYMBOL NUMBER PUSH PP,V ;STORE POINTER TDZA SDEL,SDEL ;ZERO BRACKET COUNT DEF81: PUSHJ PP,WCHARQ ;WRITE A CHARACTER PUSHJ PP,GCHAR ;[422] GET A CHARACTER CAIN C,"<" ;ANOTHER "<"? AOJA SDEL,DEF81 ;YES, INCREMENT AND WRITE CAIE C,">" ;CLOSING ANGLE? JRST DEF81 ;NO, JUST WRITE THE CHAR. SOJGE SDEL,DEF81 ;YES, WRITE IF NOT END MOVSI CS,(BYTE (7) 177,2) PUSHJ PP,WWRXE ;WRITE END OF DUMMY ARGUMENT PUSHJ PP,GCHAR ;READ AT NEXT CHAR. CAIE C,")" ;END OF ARGUMENT LIST? JRST DEF10 ;NO, GET NEXT SYMBOL JRST DEF12 ;YES, LOOK FOR "<" SUBTTL MACRO CALL PROCESSOR CALLM: SKIPGE MACENL ;ARE WE TRYING TO RE-ENTER? JRST ERRAX ;YES, BOMB OUT WITH ERROR HRROS MACENL ;FLAG "CALLM IN PROGRESS" EXCH MP,RP PUSH MP,V ;STACK FOR REFDEC EXCH MP,RP MOVEM AC0,CALNAM ;SAVE MACRO NAME INCASE OF ERROR FORERR (SDEL,CAL) ADDI V,1 ;POINT TO DUMMY SYMBOL COUNT AOS SDEL,0(V) ;INCREMENT ARG COUNT HLLZM SDEL,.TEMP ;DEFAULT ARG POINTER IF NON-ZERO LSHC SDEL,-^D<9+36> ;ZERO SDEL, GET ARG COUNT IN SX ANDI SX,777 ;MASK OUT ANYTHING ELSE SKIPE .TEMP ;IF AT LEAST ONE DEFAULT ARG HRRM SX,.TEMP ;STORE COUNT OF ARGS PUSH PP,V ;STACK FOR MRP PUSH PP,RP ;STACK FOR MACPNT JUMPE SX,MAC20 ;TEST FOR NO ARGS PUSHJ PP,CHARAC CAIE C,"(" ;"(" TLOA SDEL,-1 ;[137] NO, FUDGE PAREN COUNT AND SKIP MAC10: PUSHJ PP,GCHAR ;GET A CHARACTER, LOOK FOR AN ARG JUMPE SDEL,MAC11 ;[137] SKIP TEST IF IN () CAIG C,CR CAIGE C,LF CAIN C,";" ;";"? JRST MAC21 ;YES, END OF ARGUMENT STRING MAC11: IFE TENEX,< SKIPN DECTAB ;[372] TREAT LEADING TAB UNDER .XTABM AS SPECIAL CASE JRST MAC11A ;[372] > CAIN C,11 ;[372] FLUSH TABS JRST MAC10 ;[372] MAC11A: SKIPLE SX ;[372] [137] SKIP IF NO ARGS LEFT PUSHJ PP,SKELI1 ;NO, INITIALIZE SKELETON CAIN C,"<" ;"<"? JRST MAC30 ;YES, PROCESS AS SPECIAL CAIE C,176 CAIN C,134 ;"\" JRST MAC40 ;YES, PROCESS SYMBOL MAC14: CAIN C,"," ;","? JRST MAC16 ;YES; NULL SYMBOL IFE TENEX,< SKIPN DECTAB ;DO TABS DEC'S WAY? JRST .+3 ;YES > CAIN C,11 ;FLUSH TABS JRST MAC14A JUMPL SDEL,MAC14B ;[137] IGNORE TEST FOR () IF NOT INSIDE () CAIN C,"(" ;"("? ADDI SDEL,1 ;YES, INCREMENT COUNT CAIN C,")" ;")"? SOJL SDEL,MAC16 ;YES, TEST FOR END MAC14B: SKIPLE SX ;[137] IGNORE IF NO ARGS LEFT PUSHJ PP,WCHAR ;WRITE INTO SKELETON MAC14A: PUSHJ PP,CHARAC ;GET NEXT CHARACTER MAC14E: ;[262] INCASE WE REACHED MACEND JUMPG SDEL,MAC14 ;[137] IGNORE TEST IF IN () CAIG C,CR CAIGE C,LF JRST .+2 JRST MAC15 ;TEST FOR END OF LINE CAIE C,";" ;";"? JRST MAC14 ;NO ;YES, END OF LINE MAC15: TLO IO,IORPTC MAC16: JUMPLE SX,MAC17 ;[137] SKIP IF NO ARGS LEFT MOVSI CS,(BYTE (7) 177,2) PUSHJ PP,WWRXE ;WRITE END EXCH MP,RP PUSH MP,WWRXX EXCH MP,RP MAC17: SUBI SX,1 ;[137] DECREMENT ARG COUNT JUMPGE SDEL,MAC10 ;[137] IF IN () KEEP LOOKING TRNN SDEL,(1B0) ;[205] SKIP LOOKING IF SEEN ")" JUMPG SX,MAC10 ;[137] NO, BUT MORE ARGS TO COME MAC20: TLZN IO,IORPTC PUSHJ PP,CHARAC MAC21: EXCH MP,RP JUMPE SX,MAC21B ;NO MISSING ARGS MAC21A: PUSH MP,[-1] ;FILL IN MISSING ARGS SKIPN .TEMP ;ANY DEFAULT ARGS? JRST MAC21C ;NO HRRZ C,.TEMP ;GET ARG COUNT SUBI C,-1(SX) ;ACCOUNT FOR THOSE GIVEN HRLZS C ;PUT IN LEFT HALF HLRZ SDEL,.TEMP ;ADDRESS OF TABLE MAC21D: SKIPN (SDEL) ;END OF LIST JRST MAC21C ;YES XOR C,(SDEL) ;TEST FOR CORRECT ARG TLNN C,-1 ;WAS IT? JRST MAC21E ;YES XOR C,(SDEL) ;BACK THE WAY IT WAS AOJA SDEL,MAC21D ;AND TRY AGAIN MAC21E: MOVEM C,(MP) ;REPLACE -1 WITH TREE POINTER AOS 1(C) ;INCREMENT REFERENCE MAC21C: SOJG SX,MAC21A MAC21B: PUSH MP,[0] ;SET TERMINAL HRRZ C,LIMBO TLNN IO,IOSALL ;SUPPRESSING ALL? JRST MAC23 ;NO JUMPN MRP,MAC27 ;IN MACRO? PUSHJ PP,SEMSRC ;CHECK FOR IMMEDIATE COMMENT JRST MAC26 ;NOT FOUND, CONTINUE MAC22: PUSHJ PP,CHARAC ;YES,GET IT INTO THE LBUF CAIG C,CR ;LESS THAN CR? CAIGE C,LF ;AND GREATER THAN LF? JRST MAC22 ;NO GET ANOTHER MAC26: PUSHJ PP,DECLBP ;DECREMENT LINE BUFFER POINTER MAC27: HRLI C,-1 ;SET FLAG JRST MAC25 MAC23: MOVEI SX,"^" DPB SX,LBUFP ;SET ^ INTO LINE BUFFER JUMPAD MAC25 ;BRANCH IF ADDRESS FIELD JUMPN MRP,MAC25 ;BRANCH IF ALREADY IN A MACRO SKIPN LITLVL ;[215] BRANCH IF WITHIN A LITERAL SKIPE RPOLVL ;[215] OR IN A REPEAT JRST MAC25 PUSHJ PP,RSW3 ;OUTPUT C AGAIN (OVERWRITTEN BY "^") PUSHJ PP,SEMSRC ;LOOK FOR A COMMENT JRST MAC24 ;NO COMMENT CONTINUE PUSHJ PP,STOUT ;LIST COMMENT OR CR-LF TLNE IO,IOPALL ;MACRO EXPANSION SUPPRESSION? TLO IO,IOMAC ; NO, SET TEMP BIT TDOA C,[-1] ;FLAG LAST CHARACTER MAC24: PUSHJ PP,DECLBP ;DECREMENT BYTE POINTER MAC25: PUSH MP,MACPNT POP PP,MACPNT PUSH MP,C PUSH MP,RCOUNT ;STACK WORD COUNT PUSH MP,MRP ;STACK MACRO POINTER POP PP,MRP ;SET NEW READ POINTER EXCH MP,RP AOS MACLVL HRRZS MACENL ;RESET "CALLM IN PROGRESS" JUMPOC STMNT2 ;OP-CODE FIELD JRST EVATOM ;ADDRESS FIELD ;ROUTINE TO LOOK FOR A SEMICOLON, IGNORING SPACES AND TABS ; SKIP IF FOUND PUSHJ PP,CHARAC ;FETCH ANOTHER CHARACTER SEMSRC: CAIE C," " ;SPACE? CAIN C," " ;OR TAB? JRST .-3 ;YES, GET ANOTHER CHARACTER CAIN C,";" ;NO, SEMICOLON? AOS (PP) ;YES, SKIP RETURN POPJ PP, ;ROUTINE TO DEVREMENT BYTE POINTER LBUFP DECLBP: HRLZI SX,70000 ;INCREASE P FIELD BY 1 BYTE ADDB SX,LBUFP JUMPGE SX,CPOPJ ;RETURN IF NO OVERFLOW HRLOI SX,347777 ;OVERFLOW, BACKUP ONE WORD ADDM SX,LBUFP POPJ PP, MAC30: MOVEI AC0,0 ;INITIALIZE BRACKET COUNTER MAC31: PUSHJ PP,GCHAR ;GET A CHARACTER CAIN C,"<" ;"<"? ADDI AC0,1 ;YES, INCREMENT COUNT CAIN C,">" ;">"? SOJL AC0,MAC14A ;YES, EXIT IF MATCHING SKIPLE SX ;[137] IGNORE IF NO ARGS LEFT PUSHJ PP,WCHAR ;WRITE INTO SKELETON JRST MAC31 ;GO BACK FOR ANOTHER MAC40: PUSH PP,SX ;STACK REGISTERS PUSH PP,SDEL HLLM IO,TAGINC ;SAVE IO FLAGS PUSHJ PP,CELL ;GET AN ATOM MOVE V,AC0 ;ASSUME NUMERIC TLNE IO,NUMSW ;GOOD GUESS? JRST MAC41 ;YES PUSHJ PP,SSRCH ;SEARCH THE SYMBOL TABLE TROA ER,ERRX ;NOT FOUND, ERROR MAC41: PUSHJ PP,MAC42 ;FORM ASCII STRING HLL IO,TAGINC ;RESTORE IO FLAGS POP PP,SDEL POP PP,SX TLO IO,IORPTC ;REPEAT LAST CHARACTER JRST MAC14A ;RETURN TO MAIN SCAN MAC42: JUMPLE SX,CPOPJ ;[137] NO ARGS LEFT MOVE C,V MAC44: LSHC C,-^D35 LSH CS,-1 DIVI C,0(RX) ;DIVIDE BY CURRENT RADIX HRLM CS,0(PP) JUMPE C,.+2 ;TEST FOR END PUSHJ PP,MAC44 HLRZ C,0(PP) ADDI C,"0" ;FORM TEXT JRST WCHAR ;WRITE INTO SKELETON MACEN0: SOS MACENL MACEND: HRRZ C,0(PP) ;[262] GET TOP ADDRESS CAIN C,MAC14E ;[262] WERE WE LOOKING FOR CLOSE PAREN? JUMPGE SDEL,MPAERR ;[262] YES, GIVE USEFUL ERROR MESSAGE SKIPGE C,MACENL ;TEST "CALLM IN PROGRESS" AOS MACENL ;INCREMENT END LEVEL AND EXIT JUMPL C,REPEA8 EXCH MP,RP POP MP,MRP ;RETRIEVE READ POINTER POP MP,RCOUNT ;AND WORD COUNT MOVEI C,"^" SKIPL 0(MP) ;TEST FLAG PUSHJ PP,RSW2 ;MARK END OF SUBSTITUTION POP MP,C POP MP,ARG SKIPA MP,MACPNT ;RESET MP AND SKIP MACEN1: PUSHJ PP,REFDEC ;DECREMENT REFERENCE MACEN2: AOS V,MACPNT ;GET POINTER MOVE V,0(V) JUMPG V,MACEN1 ;IF >0, DECREMENT REFERENCE JUMPL V,MACEN2 ;IF <0, BYPASS POP MP,V ;IF=0, RETRIEVE POINTER PUSHJ PP,REFDEC ;DECREMENT REFERENCE MOVEM ARG,MACPNT EXCH MP,RP SOS MACLVL SKIPN MACENL ;CHECK UNPROCESSED END LEVEL JRST MACEN3 ;NONE TO PROCESS TRNN MRP,-1 ;MRP AT END OF TEXT JRST MACEN0 ;THEN POP THE MACRO STACK NOW MACEN3: TRNN C,77400 ;SALL FLAG? HRLI C,0 ;YES,TURN IT OFF JUMPL C,REPEA8 ;IF FLAG SET SUBSTITUTE JRST RSW2 IRP0: SKIPN MACLVL ;ARE WE IN A MACRO? JRST ERRAX ;NO, BOMB OUT IRP10: PUSHJ PP,MREADS ;YES, GET DATA SPEC CAIE C,40 ;SKIP LEADING BLANKS CAIN C,"(" ;"("? JRST IRP10 ;YES, BYPASS CAIN C,11 JRST IRP10 CAIE C,177 ;NO, IS IT SPECIAL? JRST ERRAX ;NO, ERROR PUSHJ PP,MREADS ;YES TRZN C,100 ;CREATED? JRST ERRAX CAIL C,40 ;TOO BIG? JRST ERRAX ADD C,MACPNT ;NO, FORM POINTER TO STACK PUSH MP,IRPCF ;STACK PREVIOUS POINTERS PUSH MP,IRPSW PUSH MP,IRPARP PUSH MP,IRPARG PUSH MP,IRPCNT PUSH MP,0(C) PUSH MP,IRPPOI HRRZM C,IRPARP MOVEM AC0,IRPCF ;IRPC FLAG FOUND IN AC0 SETOM IRPSW ;RESET IRP SWITCH MOVE CS,0(C) MOVEM CS,IRPARG IRP15: PUSHJ PP,MREADS ;[351] GET A CHARACTER LOOKING FOR "<" CAIE C,"<" ;"<"? JRST [CAIE C,"," ;[426] IGNORE COMMA CAIG C," " ;[351] IGNORE TEXT-FORMATTING CHARACTERS JRST IRP15 ;[351] CAIE C,")" ;[361] IGNORE CLOSE PARENTHESIS CAIN C,">" ;[426] IGNORE RIGHT ANGLE BRACKET JRST IRP15 ;[354] GO BACK FOR ANOTHER JRST IRPMBI] ;[351] CAN'T FIND BRACKET (OR ILL CHAR) PUSHJ PP,SKELI1 ;INITIALIZE NEW STRING MOVEM ARG,IRPPOI ;SET NEW POINTER TDZA SDEL,SDEL ;ZERO BRACKET COUNT AND SKIP IRP20: PUSHJ PP,WCHAR1 PUSHJ PP,MREADS CAIN C,"<" ;"<"? AOJA SDEL,IRP20 ;YES, INCREMENT COUNT AND WRITE CAIE C,">" ;">"? JRST IRP20 ;NO, JUST WRITE IT SOJGE SDEL,IRP20 ;YES, WRITE IF NOT MATCHING MOVE CS,[BYTE (7) 15,177,4] PUSHJ PP,WWRXE ;WRITE END PUSH MP,MRP ;STACK PREVIOUS READ POINTER PUSH MP,RCOUNT ;AND WORD COUNT SKIPG CS,IRPARG JRST IRPPOP ;EXIT IF NOT VALID ARGUMENT MOVEI C,1(CS) ;INITIALIZE POINTER MOVEM C,IRPARG IRPSET: EXCH MRP,IRPARG ;SWAP READ POINTERS MOVE SX,RCOUNT ;SWAP COUNT OF WORDS TO READ EXCH SX,IRPCNT MOVEM SX,RCOUNT PUSHJ PP,SKELI1 ;INITIALIZE SKELETON FOR DATA HRRZM ARG,@IRPARP ;STORE NEW DS POINTER SETZB SX,SDEL ;ZERO FOUND FLAG AND BRACKET COUNT LDB C,MRP ;GET LAST CHAR CAIN C,"," SKIPE IRPCF ;IN IRPC JRST IRPSE1 ;NO MOVEI SX,1 ;FORCE ARGUMENT IRPSE1: PUSHJ PP,MREADS CAIE C,177 ;SPECIAL? AOJA SX,IRPSE2 ;NO, FLAG AS FOUND PUSHJ PP,PEEKM ;LOOK AT NEXT CHARACTER SETZM IRPSW ;SET IRP SWITCH JUMPG SX,IRPSE4 ;IF ARG FOUND, PROCESS IT JRST IRPPOP ;NO, CLEAN UP AND EXIT IRPSE2: SKIPE IRPCF ;IRPC? JRST IRPSE3 ;YES, WRITE IT CAIN C,"," ;NO, IS IT A COMMA? JUMPE SDEL,IRPSE4 ;YES, EXIT IF NOT NESTED CAIN C,"<" ;"<"? ADDI SDEL,1 ;YES, INCREMENT COUNT CAIN C,">" ;">"? SUBI SDEL,1 ;YES, DECREMENT COUNT IRPSE3: PUSHJ PP,WCHAR SKIPN IRPCF ;IRPC? JRST IRPSE1 ;NO, GET NEXT CHARACTER IRPSE4: MOVSI CS,(BYTE (7) 177,2) PUSHJ PP,WWRXE ;WRITE END MOVEM MRP,IRPARG ;SAVE POINTER MOVE MRP,RCOUNT ;SAVE COUNT MOVEM MRP,IRPCNT HRRZ MRP,IRPPOI ;SET FOR NEW SCAN AOJA MRP,REPEA8 ;ON ARG COUNT IRPMBI: PUSHJ PP,EFATAL ;[351]FATAL ERROR,TYPE ?MCR MOVE AC0,CALNAM ;[351]FETCH MACRO NAME SKIPN IRPCF ;[354] IRPC? JRST [MOVSI RC,[SIXBIT/MBI MISSING OPEN BRACKET FOR IRP INSIDE MACRO@/] ;[354] NO JRST IRPERR] ;[354] MOVSI RC,[SIXBIT/MBI MISSING OPEN BRACKET FOR IRPC INSIDE MACRO@/] ;[351] IRPERR: PUSHJ PP,TYPMSG ;[354] [351]OUTPUT MESSAGE JUMP1 .+2 ;[351]ONLY COUNT ERROR ONCE AOS ERRCNT ;[351]DO DURING PASS2 JRST ERRNE2 ;[351]COMMON MESSAGE STOPI0: SKIPN IRPARP ;IRP IN PROGRESS? JRST ERRAX ;NO, ERROR SETZM IRPSW ;YES, SET SWITCH POPJ PP, IRPEND: MOVE V,@IRPARP PUSHJ PP,REFDEC SKIPE IRPSW ;MORE TO COME? JRST IRPSET ;YES IRPPOP: MOVE V,IRPPOI PUSHJ PP,REFDEC ;DECREMENT REFERENCE POP MP,RCOUNT POP MP,MRP ;RESTORE CELLS POP MP,IRPPOI POP MP,@IRPARP POP MP,IRPCNT POP MP,IRPARG POP MP,IRPARP POP MP,IRPSW POP MP,IRPCF JRST REPEA8 GETDS: ;GET DUMMY SYMBOL NUMBER MOVE CS,C ;USE CS FOR WORK REGISTER ANDI CS,37 ;MASK ADD CS,MACPNT ;ADD BASE ADDRESS MOVE V,0(CS) ;GET POINTER FLAG JUMPG V,GETDS1 ;BRANCH IF POINTER TRNN C,40 ;NOT POINTER, SHOULD WE CREATE? JRST RSW0 ;NO, FORGET THIS ARG PUSH PP,WWRXX PUSH PP,MWP ;STACK MACRO WRITE POINTER PUSH PP,WCOUNT ;SAVE WORD COUNT PUSHJ PP,SKELI1 ;INITIALIZE SKELETON MOVEM ARG,0(CS) ;STORE POINTER MOVE CS,[BYTE (7) 0,170,170,170,171] ;CREATE A SYMBOL ADD CS,LSTSYM ;LSTSYM= # OF LAST CREATED TDZ CS,[BYTE (7) 0,170,170,170,170] MOVEM CS,LSTSYM IOR CS,[ASCII /.0000/] MOVEI C,"." PUSHJ PP,WCHAR PUSHJ PP,WWORD ;WRITE INTO SKELETON MOVSI CS,(BYTE (7) 177,2) PUSHJ PP,WWRXE ;WRITE END CODE POP PP,WCOUNT ;RESTORE WORD COUNT POP PP,MWP ;RESTORE MACRO WRITE POINTER POP PP,WWRXX MOVE V,ARG ;SET UP FOR REFINC GETDS1: PUSHJ PP,REFINC ;INCREMENT REFERENCE HRL V,RCOUNT ;SAVE WORD COUNT PUSH MP,V ;STACK V FOR DECREMENT PUSH MP,MRP ;STACK READ POINTER MOVEI MRP,1(V) ;FORM READ POINTER JRST RSW0 ;EXIT DSEND: POP MP,MRP POP MP,V HLREM V,RCOUNT ;RESTORE WORD COUNT HRRZS V ;CLEAR COUNT PUSHJ PP,REFDEC ;DECREMENT REFERENCE JRST RSW0 ;EXIT SKELI1: MOVEI ARG,1 ;ENTRY FOR SINGLE ARG SKELI: SETZ MWP, ;SIGNAL FIRST TIME THROUGH PUSHJ PP,SKELWL ;GET POINTER WORD HRRZM MWP,WWRXX ;SAVE FIRST ADDRESS HRRZM MWP,LADR ;SAVE START OF LINKED LIST HRRZM ARG,1(MWP) ;STORE COUNT SOS WCOUNT ;ACCOUNT FOR WORD HRRZ ARG,WWRXX ;SET FIRST ADDRESS ADDI MWP,2 ;BUMP POINTER HRLI MWP,(POINT 7) ;SET FOR 5 ASCII BYTES ;SKELW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT) SKELW: SOSLE WCOUNT ;STILL SOME SPACE IN LEAF? POPJ PP, ;YES, RETURN SKELWL: SKIPE V,NEXT ;GET FIRST FREE ADDRESS JRST SKELW1 ;IF NON-ZERO, UPDATE FREE MOVE V,FREE ;GET FREE ADDI V,.LEAF ;INCREMENT BY LEAF SIZE CAML V,SYMBOL ;OVERFLOW? PUSHJ PP,XCEED ;YES, BOMB OUT EXCH V,FREE ;UPDATE FREE SETZM (V) ;CLEAR LINK SKELW1: HLL V,0(V) ;GET ADDRESS HLRM V,NEXT ;UPDATE NEXT SKIPE MWP ;IF FIRST TIME HRLM V,1-.LEAF(MWP) ;STORE LINK IN FIRST WORD OF LEAF MOVEI MWP,.LEAF ;SIZE OF LEAF MOVEM MWP,WCOUNT ;STORE FOR COUNT DOWN MOVEI MWP,(V) ;SET UP WRITE POINTER TLO MWP,(POINT 7,,20) ;2 ASCII CHARS POPJ PP, ;WWRXX POINTS TO END OF TREE ;MWP IDPB POINTER TO NEXT HOLE ;NEXT FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES) ;FREE POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE ;LADR POINTS TO BEG OF LINKED PORTION. GCHARQ: JUMPN MRP,MREADS ;IF GETTING CHAR. FROM TREE GCHAR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER CAIG C,FF ;TEST FOR LF, VT OR FF CAIGE C,LF POPJ PP, ;NO JRST OUTIM1 ;YES, LIST IT WCHARQ: WCHAR: WCHAR1: TLNN MWP,760000 ;END OF WORD? PUSHJ PP,SKELW ;YES, GET ANOTHER IDPB C,MWP ;STORE CHARACTER POPJ PP, WWORD: LSHC C,7 ;MOVE ASCII INTO C PUSHJ PP,WCHAR1 ;STORE IT JUMPN CS,WWORD ;TEST FOR END POPJ PP, ;YES, EXIT WWRXE: PUSHJ PP,WWORD ;WRITE LAST WORD ADD MWP,WCOUNT ;GET TO END OF LEAF SUBI MWP,.LEAF ;NOW POINT TO START OF IT HRRZS (MWP) ;ZERO LEFT HALF OF LAST LEAF HRRM MWP,@WWRXX ;SET POINTER TO END POPJ PP, MREAD: PUSHJ PP,MREADS ;READ ONE CHARACTER CAIE C,177 ;SPECIAL? JRST RSW1 ;NO, EXIT PUSHJ PP,MREADS ;YES, GET CODE WORD TRZE C,100 ;SYMBOL? JRST GETDS ;YES CAILE C,4 ;POSSIBLY ILLEGAL JRST ERRAX ;YUP HRRI MRP,0 ;NO, SIGNAL END OF TEXT JRST .+1(C) PUSHJ PP,XCEED JRST MACEND ;1; END OF MACRO JRST DSEND ;2; END OF DUMMY SYMBOL JRST REPEND ;3; END OF REPEAT JRST IRPEND ;4; END OF IRP MREADI: HRLI MRP,700 ;SET UP BYTE POINTER MOVEI C,.LEAF-1 ;NUMBER OF WORDS MOVEM C,RCOUNT MREADS: TLNN MRP,-1 ;FIRST TIME HERE? JRST MREADI ;YES, SET UP MRP AND RCOUNT TLNN MRP,760000 ;HAVE WE FINISHED WORD? SOSLE RCOUNT ;YES, STILL ROOM IN LEAF? JRST MREADC ;STILL CHAR. IN LEAF HLRZ MRP,1-.LEAF(MRP);YES, GET LINK HRLI MRP,(POINT 7,,20) ;SET POINTER MOVEI C,.LEAF ;RESET COUNT MOVEM C,RCOUNT MREADC: ILDB C,MRP ;GET CHARACTER POPJ PP, PEEK: JUMPN MRP,PEEKM ;THIS IS A MACRO READ PUSHJ PP,CHARAC ;READ AN ASCII CHAR. TLO IO,IORPTC ;REPEAT FOR NEXT POPJ PP, ;AND RETURN PEEKM: PUSH PP,MRP ;SAVE MACRO READ POINTER PUSH PP,RCOUNT ;SAVE WORD COUNT PUSHJ PP,MREADS ;READ IN A CHAR. POP PP,RCOUNT ;RESTORE WORD COUNT POP PP,MRP ;RESET READ POINTER POPJ PP, ;IORPTC IS NOT SET REFINC: AOS 1(V) ;INCREMENT REFERENCE POPJ PP, REFDEC: JUMPLE V,DECERR ;CATASTROPHIC ERROR SOMEWHERE SOS CS,1(V) ;DECREMENT REFERENCE TRNE CS,000777 ;IS IT ZERO? POPJ PP, ;NO, EXIT CAMGE V,UNITOP ;[225] IS THIS IN UNIV AREA? JRST [AOS 1(V) ;[371][225] YES, PUT IT BACK TO DEFINING REFERENCE COUNT POPJ PP,] ;[371] AND DO NOT DELETE IT HRRZ CS,0(V) ;YES, GET POINTER TO END HRL CS,NEXT ;GET POINTER TO NEXT RE-USABLE HLLM CS,0(CS) ;SET LINK HRRM V,NEXT ;RESET NEXT POPJ PP, DECERR: PUSHJ PP,EFATAL ;OUTPUT CR-LF ? MCR MOVE AC0,CALNAM ;GET MACRO NAME MOVSI RC,[SIXBIT /EWE ERROR WHILE EXPANDING@/] PUSHJ PP,TYPMSG JRST ERRNE2 ;COMMON MESSAGE MPAERR: PUSHJ PP,EFATAL ;OUTPUT CR-LF ? MCR MOVE AC0,CALNAM ;GET MACRO NAME MOVSI RC,[SIXBIT /MPA MISSING CLOSE PAREN AROUND ARG LIST OF@/] PUSHJ PP,TYPMSG JRST ERRNE2 ;COMMON MESSAGE A== 0 ;ASCII MODE AL== 1 ;ASCII LINE MODE IB== 13 ;IMAGE BINARY MODE B== 14 ;BINARY MODE ; == 0 ;USED BY HELPER AND GETSEGS CTL== 1 ;CONTROL DEVICE NUMBER IFN CCLSW, BIN== 2 ;BINARY DEVICE NUMBER CHAR== 3 ;INPUT DEVICE NUMBER LST== 4 ;LISTING DEVICE NUMBER UNV== 6 ;SYMBOL TABLE FILE (UNIVERSAL) ; COMMAND STRING ACCUMULATORS ACDEV== 1 ;DEVICE ACFILE==2 ;FILE ACEXT== 3 ;EXTENSION ACPPN== 4 ;PPN ACDEL== 4 ;DELIMITER ACPNTR==5 ;BYTE POINTER TIO== 6 TIORW== 1000 TIOLE== 2000 TIOCLD==20000 DIRBIT==4 ;DIRECTORY DEVICE TTYBIT==10 ;TTY MTABIT==20 ;MTA DTABIT==100 ;DTA DISBIT==2000 ;DISPLAY CONBIT==20000 ;CONTROLING TTY LPTBIT==40000 ;LPT DSKBIT==200000 ;DSK ;GETSTS ERROR BITS IOIMPM==400000 ;IMPROPER MODE (WRITE LOCK) IODERR==200000 ;DEVICE DATA ERROR IODTER==100000 ;CHECKSUM OR PARITY ERROR IOBKTL== 40000 ;BLOCK TOO LARGE ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL SYN .TEMP,PPN SUBTTL I/O ROUTINES BEG: IFN CCLSW, IFN PURESW,< MOVE MRP,[XWD LOWL,LOWL+1] ;START OF DATA SETZM LOWL ;ZERO FIRST WORD BLT MRP,LOWEND ;AND THE REST MOVE MRP,[XWD LOWH,LOWL] ;PHASED CODE BLT MRP,LOWL+LENLOW ;MOVE IT IN> HRRZ MRP,.JBREL ;GET LOWSEG SIZE IFN TENEX,< CAIL MRP,377777 ;[206] DO WE HAVE ALL OF CORE? JRST .+4 ;[206] YES MOVEI MRP,377777 ;[206] NO, MAY AS WELL GET IT CORE MRP, ;[206] IT WILL SAVE EXPANSION LATER JFCL ;[206] TOO BAD HRRZ MRP,.JBREL ;[206] GET HIGHEST LOC > MOVEM MRP,MACSIZ ;SAVE CORE SIZE ;DECODE VERSION NUMBER MOVEI PP,JOBFFI ;TEMP PUSH DOWN STACK PUSH PP,[0] ;MARK BOTTOM OF STACK LDB 0,[POINT 3,.JBVER,2] ;GET USER BITS JUMPE 0,GETE ;NOT SET IF ZERO ADDI 0,"0" ;FORM NUMBER PUSH PP,0 ;STACK IT MOVEI 0,"-" ;SEPARATE BY HYPHEN PUSH PP,0 ;STACK IT ALSO GETE: HRRZ 0,.JBVER ;GET EDIT NUMBER JUMPE 0,GETU ;SKIP ALL THIS IF ZERO MOVEI 1,")" ;ENCLOSE IN PARENS. PUSH PP,1 GETED: IDIVI 0,8 ;GET OCTAL DIGITS ADDI 1,"0" ;MAKE ASCII PUSH PP,1 ;STACK IT JUMPN 0,GETED ;LOOP TIL DONE MOVEI 0,"(" ;OTHER PAREN. PUSH PP,0 GETU: LDB 0,[POINT 6,.JBVER,17] ;UPDATE NUMBER JUMPE 0,GETV ;SKIP IF ZERO IDIVI 0,^D26 ;[224] MIGHT BE TWO DIGITS ADDI 1,"@" ;FORM ALPHA PUSH PP,1 JUMPN 0,GETU+1 ;LOOP IF NOT DONE GETV: LDB 0,[POINT 9,.JBVER,11] ;GET VERSION NUMBER IDIVI 0,8 ;GET DIGIT ADDI 1,"0" ;TO ASCII PUSH PP,1 ;STACK JUMPN 0,GETV+1 ;LOOP MOVE 1,[POINT 7,VBUF+1,20] ;POINTER TO DEPOSIT IN VBUF POP PP,0 ;GET CHARACTER IDPB 0,1 ;DEPOSIT IT JUMPN 0,.-2 ;KEEP GOING IF NOT ZERO IFN FORMSW,> IFN CCLSW,< TLZA IO,CRPGSW ;SET TO INIT NEW COMMAND FILE M: TLNN IO,CRPGSW ;CURRENTLY DOING RPG?> IFE CCLSW, RESET ;INITIALIZE PROGRAM SETZM BINDEV ;CLEAR INCASE NOT USED NEXT TIME SETZM LSTDEV ;SAME REASON SETZM INDEV ;INCASE OF ERROR HRRZ MRP,MACSIZ ;GET INITIAL SIZE CORE MRP, ;BACK TO ORIGINAL SIZE JFCL ;SHOULD NEVER FAIL SETZB MRP,PASS1I MOVE [XWD PASS1I,PASS1I+1] BLT PASS2X-1 ;ZERO THE PASS1 AND PASS2 VARIABLES MOVEI PP,JOBFFI ;SET TEMP PUSH-DOWN POINTER IFN FORMSW,< MOVE CS,PHWFMT ;GET DEFAULT VALUE (PERMANENT) MOVEM CS,HWFMT ;SET IT (TEMP) > MOVE CS,[POINT 7,DBUF,6] ;INITIALIZE FOR DATE MSTIME 2, ;GET TIME FROM MONITOR PUSHJ PP,TIMOUT ;TIME FORMAT OUTPUT DATE 1, ;GET DATE IBP CS ;PASS OVER PRESET SPACE PUSHJ PP,DATOUT ;DATE FORMAT OUTPUT MOVSI FR,P1!CREFSW IFN CCLSW, IFE CCLSW, MOVSI IO,IOPALL ;ZERO FLAGS INIT CTL,AL ;INITIALIZE USER CONSOLE SIXBIT /TTY/ XWD CTOBUF,CTIBUF EXIT ;NO TTY, NO ASSEMBLY MOVSI C,'TTY' DEVCHR C, ;GET CHARACTERISTICS TLNN C,10 ;IS IT REALLY A TTY EXIT ;NO INBUF CTL,1 ;INITIALIZE SINGLE CONTROL OUTBUF CTL,1 ;BUFFERS PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED MOVEI C,"*" IDPB C,CTOBUF+1 OUTPUT CTL, MOVE AC1,[POINT 7,CTLBUF] ;BYTE POINTER TO STORE COMMAND MOVEI AC2,1 ;[277] INITIALIZE CHARACTER COUNT CTLS2: SOSGE CTIBUF+2 ;USUAL SOSG LOOP ON TTY INPUT INPUT CTL, ;GET NEXT BUFFER ILDB 0,CTIBUF+1 ;GET CHARACTER CAIL AC2,CTLSIZ ;NUMBER OF CHARS. ALLOWED JRST COMERR ;COMMAND LINE TOO LONG CAIN 0,CZ ;TEST FOR ^Z JRST CZSTOP ;MONRET TYPE EXIT IDPB 0,AC1 ;STORE CHAR. CAIE 0,33 ;TEST FOR ALTMODE CAIG 0,FF ;TEST FOR EOL CHAR CAIGE 0,LF ;ONE OF FF, VT, OR LF AOJA AC2,CTLS2 ;NOT END OF LINE YET MOVEM AC2,CTIBUF+2 ;RESET CHAR. COUNT MOVE AC1,[POINT 7,CTLBUF] ;BYTE POINTER TO STORE COMMAND MOVEM AC1,CTIBUF+1 ;RESET BYTE POINTER IFN CCLSW, INIT CTL2,AL ;LOOK FOR DISK SIXBIT /DSK/ ;... XWD 0,CTLBLK ;... JRST CTLSET ;DSK NOT THERE HRLZI 3,'MAC' ;###MAC MOVEI 3 ;COUNT PJOB AC1, ;RETURNS JOB NO. TO AC1 RPGLUP: IDIVI AC1,12 ;CONVERT ADDI AC2,"0"-40 ;SIXBITIZE IT LSHC AC2,-6 ; SOJG 0,RPGLUP ;3 TIMES MOVEM 3,CTLBUF ;###MAC HRLZI 'TMP' ; MOVEM CTLBUF+1 ;TMP SETZM CTLBUF+3 ;PROG-PRO LOOKUP CTL2,CTLBUF ;COMMAND FILE JRST CTLSET ;NOT THERE HLRM EXTMP ;SAVE THE EXTENSION RPGS2: INBUF CTL2,1 ;SINGLE BUFFERED RPGS2A: INIT CTL,AL ;TTY FOR CONSOLE MESSAGES SIXBIT /TTY/ ;... XWD CTOBUF,0 ;... EXIT ;NO TTY, NO ASSEMBLY OUTBUF CTL,1 ;SINGLE BUFFERED MOVE .JBFF ;REMEMBER WHERE BINARY BUFFERS BEGIN MOVEM SAVFF ;... HRRZ .JBREL ;TOP OF CORE CAMLE MACSIZ ;SEE IF IT HAS GROWN MOVEM MACSIZ ;PREVENTS ADDRESS CHECK ON EXIT TLNE IO,CRPGSW ;ARE WE ALREADY IN RPG MODE? JRST M ;MUST HAVE COME FROM @ COMMAND, RESET GOSET: MOVSI IO,IOPALL!CRPGSW ;SET INITIAL FLAGS MOVEI CS,CTLSIZ ;MAXIMUM CHARS IN A LINE MOVE AC1,CTLBLK+2 ;NUMBER OF CHARACTERS MOVEM AC1,CTIBUF+2 ;SAVE FOR PASS 2 MOVE AC1,[POINT 7,CTLBUF] ;WHERE TO STASH CHARS MOVEM AC1,CTIBUF+1 ;... GOSET1: SOSG CTLBLK+2 ;ANY MORE CHARS? PUSHJ PP,[IFN TEMP, IN CTL2, ;READ ANOTHER BUFFERFUL POPJ PP, ;EVERYTHING OK, RETURN STATO CTL2,20000 ;EOF? JRST [HRROI RC,[SIXBIT /ECF ERROR READING COMMAND FILE@/] JRST ERRFIN] ;GO COMPLAIN PUSHJ PP,DELETE ;CMD FILE EXIT] ;EOF AND FINISHED ILDB C,CTLBLK+1 ;GET NEXT CHAR MOVE RC,@CTLBLK+1 ;CHECK FOR SEQUENCE NUMBERS TRNE RC,1 ;... JRST [AOS CTLBLK+1 ;SKIP OVER ANOTHER 5 CHARS MOVNI RC,5 ;... ADDM RC,CTLBLK+2 ;... JRST GOSET1 ] ;GO READ ANOTHER CHAR JUMPE C,GOSET1 ;IGNORE NULLS CAIE C," " ;[131] IGNORE SPACES CAIN C," " ;[131] AND TABS JRST GOSET1 ;[131] ALSO, SAVES SPACE AND COMMAND ERROR IDPB C,CTIBUF+1 ;STASH AWAY AOS CTIBUF+2 ;INCREMENT CHAR. COUNT CAIE C,12 ;LINE FEED OR CAIN C,175 ;ALTMODE? JRST GOSET2 ;YES, FINISHED WITH COMMAND CAIE C,176 CAIN C,33 JRST GOSET2 ;ALTMODE. SOJG CS,GOSET1 ;GO READ ANOTHER JRST COMERR ;GO COMPLAIN GOSET2: MOVEI C,12 ;MAKE SURE THERE'S A LF IDPB C,CTIBUF+1 ;... MOVEM AC1,CTIBUF+1 ;SET POINTER TO BEGINNING AOS CTIBUF+2 ;ADD I TO COUNT MOVE SAVFF ;RESET JOBFF FOR NEW BINARY MOVEM .JBFF ;... JRST BINSET RPGS1: PUSHJ PP,DELETE ;DELETE COMMAND FILE MOVEM ACDEV,RPGDEV ;GET SET TO INIT OPEN CTL2,RPGINI ;DO IT JRST EINIT ;ERROR MOVEM ACFILE,INDIR ;USE INPUT BLOCK MOVEM ACPPN,INDIR+3 ;SET PPN HLLZM ACEXT,INDIR+1 ;SET FILE EXTENSION JUMPN ACEXT,RPGS1A ;[132] EXPLICIT EXTENSION GIVEN, USE IT IFE STANSW, IFN STANSW, HLLZM ACEXT,INDIR+1 ;[132] STORE DEFAULT EXT LOOKUP CTL2,INDIR ;[132] SKIPA ACEXT,INDIR+1 ;[132] FAILED, PICKUP EXT AND ERROR CODE JRST RPGS1B ;[132] SUCCESS TRNE ACEXT,-1 ;[132] CHECK FOR ERROR CODE OTHER THAN 0 JRST RPGLOS ;[132] YES, YOU LOSE SETZB ACEXT,INDIR+1 ;[132] TRY NULL EXT RPGS1A: LOOKUP CTL2,INDIR ;[132] JRST RPGLOS ;[132] TOTAL FAILURE RPGS1B: HLRM ACEXT,EXTMP ;[132] SAVE THE EXTENSION HLRZ .JBSA ;RESET JOBFF TO ORIGINAL MOVEM .JBFF TLO IO,CRPGSW ;TURN ON SWITCH SO WE RESET WORLD JRST RPGS2 ;AND GO RPGLOS: RELEAS CTL2,0 TLZ IO,CRPGSW ;STOPS IO TO UNASGD CHAN JRST ERRCF ;NO FILE FOUND > BINSET: PUSHJ PP,NAME1 ;GET FIRST NAME JRST BINSE3 ;NO FILE HERE HLLZ ACEXT,ACEXT ;[427] DISALLOW NULL EXTENSIONS IFN CCLSW, TLNN FR,CREFSW ;CROSS REF REQUESTED? JRST LSTSE1 ;YES, SKIP BINARY CAIN C,"," ;COMMA? JUMPE ACDEV,LSTSET ;YES, SKIP BINARY IF NO DEVICE SPECIFIED CAIN C,"_" ;LEFT ARROW? JUMPE ACDEV,LSTSE1 ;YES, SKIP BINARY IF NO DEVICE SPECIFIED JUMPE ACDEV,M ;IGNORE IF JUST TLO FR,PNCHSW ;OK, SET SWITCH MOVEM ACDEV,BINDEV ;STORE DEVICE NAME MOVEM ACFILE,BINDIR ;STORE FILE NAME IN DIRECTORY JUMPN ACEXT,.+2 ;EXTENSION SPECIFIED? MOVSI ACEXT,'REL' ;NO, ASSUME RELOCATABLE BINARY MOVEM ACEXT,BINDIR+1 ;STORE IN DIRECTORY MOVEM ACPPN,BINDIR+3 ;SET PPN OPEN BIN,BININI ;INITIALIZE BINARY JRST EINIT ;ERROR TLZE TIO,TIOLE ;SKIP TO EOT MTEOT. BIN, TLZE TIO,TIORW ;REWIND REQUESTED? MTREW. BIN, ;YES JUMPGE CS,BINSE2 ;BRANCH IF NO BACK-SPACE MTBSF. BIN, ;BACK-SPACE A FILE AOJL CS,.-1 ;TEST FOR END MTWAT. BIN, STATO BIN,1B24 ;LOAD POINT? MTSKF. BIN, ;NO, GO FORWARD ONE BINSE2: SOJG CS,.-1 ;TEST FORWARD SPACING TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED? UTPCLR BIN, ;YES, CLEAR IT OUTBUF BIN,2 ;SET UP TWO RING BUFFER BINSE3: CAIN C,"_" JRST GETSET ;NO LISTING LSTSET: PUSHJ PP,NAME1 ;GET NEXT DEVICE JRST GETSET ;NO FILE HERE HLLZ ACEXT,ACEXT HLLZ ACEXT,ACEXT ;[427] DISALLOW NULL EXTENSIONS LSTSE1: CAIE C,"_" JRST ERRCM TLNE FR,CREFSW ;CROSS-REF REQUESTED? JRST LSTSE2 ;NO, BRANCH JUMPN ACDEV,.+2 ;YES, WAS DEVICE SPECIFIED? MOVSI ACDEV,'DSK' ;NO, ASSUME DSK JUMPN ACFILE,.+2 MOVE ACFILE,[SIXBIT /CREF/] JUMPN ACEXT,.+2 MOVSI ACEXT,'CRF' LSTSE2: JUMPE ACDEV,GETSET ;FORGET LISTING IF NO DEVICE SPECIFIED MOVE AC0,ACDEV DEVCHR AC0, ;GET CHARACTERISTICS TLNE AC0,LPTBIT!DISBIT!TTYBIT TLNE FR,CREFSW ; WAS CROSS-REF REQUESTED? AOSA OUTSW+0*TTYSW ;NO, ASSUME TTY JRST ERRCM ;YES, ERROR - CREF DEV MUST NOT BE LPT, DIS, OR TTY TLNE AC0,CONBIT ;CONTROLING TELETYPE LISTING? JRST GETSET ;YES, BUFFER ALREADY SET MOVEM ACDEV,LSTDEV ;STORE DEVICE NAME AOS OUTSW+0*LPTSW ;SET FOR LPT MOVEM ACFILE,LSTDIR ;STORE FILE NAME JUMPN ACEXT,.+2 MOVSI ACEXT,'LST' MOVEM ACEXT,LSTDIR+1 MOVEM ACPPN,LSTDIR+3 ;SET PPN OPEN LST,LSTINI ;INITIALIZE LISTING OUTPUT JRST EINIT ;ERROR TLZE TIO,TIOLE MTEOT. LST, TLZE TIO,TIORW ;REWIND REQUESTED? MTREW. LST, ;YES JUMPGE CS,LSTSE3 MTBSF. LST, AOJL CS,.-1 MTWAT. LST, STATO LST,1B24 MTSKF. LST, LSTSE3: SOJG CS,.-1 TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED? UTPCLR LST, ;YES, CLEAR IT OUTBUF LST,2 ;SET UP A TWO RING BUFFER GETSET: IFN FT.U01,< MOVE 3,[IOWD $USRLN,$USSTK] ; RESET THE USER PUSH DOWN STACK MOVEM 3,$USRPD ; SO DO IT >;END OF FT.U01 MOVEI 3,PDPERR HRRM 3,.JBAPR ;SET TRAP LOCATION MOVEI 3,1B19 ;SET FOR PUSH-DOWN OVERFLOW APRENB 3, SOS 3,PDP ;GET PDP REQUEST MINUS 1 IMULI 3,.PDP ;COMPUTE SIZE (50*) HRLZ MP,3 HRR MP,.JBFF ;SET BASIC POINTER MOVE PP,MP SUB PP,3 MOVEM PP,RP ;SET RP MOVEM PP,SAVERP SUB PP,3 IFN POLISH,< MOVEM PP,POLSTK ;[164] SAVE INITIAL POLISH FIXUP STACK MOVEM PP,POLPTR ;[164] ONLY CHANGE IF STACK MOVES SUB PP,3 ;[164] > ASH 3,1 ;DOUBLE SIZE OF BASIC POINTER HRL PP,3 MOVEM PP,SAVEPP MOVEM MP,SAVEMP SUBM PP,3 ;COMPUTE TOP LOCATION SKIPN UNITOP ;IF ANY UNIVERSALS HAVE BEEN SEEN JRST GETSE0 ;NO HRRZS 3 ;GET TOP OF BUFFERS AND STACKS CAMLE 3,UNISIZ ;HOPE ITS NOT BIGGER THAN UNIVERSAL ONE JRST UNIERR ;IT WAS, YOU LOSE SKIPA 3,UNITOP ;DON'T LOSE THEM GETSE0: HRRZM 3,UNISIZ ;STORE UNTIL A UNIVERSAL IS SEEN HRRZM 3,LADR ;SET START OF MACRO TREE HRRZM 3,FREE GETSE1: HRRZ .JBREL SUBI 1 MOVEM SYMTOP ;SET TOP OF SYMBOL TABLE SUBI LENGTH ;SET POINTER FOR INITIAL SYMBOLS CAMLE LADR ;HAVE WE ROOM? JRST GETSE2 ;YES HRRZ 2,.JBREL ;NO, TRY FOR MORE CORE ADDI 2,2000 CORE 2, JRST XCEED2 ;NO MORE, INFORM USER JRST GETSE1 ;TRY AGAIN GETSE2: MOVEM SYMBOL ;SET START OF SYMBOL TABLE HRLI SYMNUM BLT @SYMTOP ;STORE SYMBOLS IFN POLISH,< MOVE @SYMBOL ;SYMBOL COUNT MOVEM SGSCNT ; FOR THIS PSECT > PUSHJ PP,SRCHI ;INITIALIZE TABLE ;HERE TO TEST FOR CPU AND SET VALUE IN .CPU. ;PDP-6 = 1 ;KA-10 = 2 ;KI-10 = 3 ;KL-10 = 4 MOVEI V,1 ;SET VALUE TO .PDP6. FOR STARTERS JFCL 1,.+1 ;CLEAR PC CHANGE FLAG JRST .+1 ;THEN CHANGE PC JFCL 1,.PDP6. ;IF FLAG ON, ITS A PDP6 HRLOI 1,-2 ;CHECK FOR KA-10 AOBJP 1,.KA10. ;CHECK CARRY BETWEEN HALVES SETZ 1, ;CLEAR AC BLT 1,0 ;AND TRY BLT, KI WILL BE 0 AND JUMPE 1,.KI10. ;KL WILL HAVE 1,,1 ; JRST .KL10. .KL10.: AOS V .KI10.: AOS V .KA10.: AOS V .PDP6.: MOVE AC0,['.CPU. '] PUSHJ PP,SSRCH ;SEE IF THERE ALREADY AND IF NOT PUSHJ PP,[MOVSI ARG,SYMF!NOOUTF!SUPRBT SETZ RC, JRST INSERT] ;PUT IT IN TABLE GETPPN V, ;[405]GET LOGGED IN PPN JFCL ;[405]ALT. RETURN MOVEM V,MYPPN ;[405]AND REMEMBER IT IFN POLISH,< SETZM SGNMAX ;INIT TO ONE .PSECT SETZM SGNCUR ;IT IS THE CURRENT .PSECT SETZM SGNAME ;IT IS THE BLANK .PSECT MOVSI 1 MOVEM SGRELC ;SET THE RELOCATION COUNTER SETZM SGATTR ;ZERO PSECT BRK AND ATTRS SETZM SGDMAX ;ONE .PSECT DEEP SETZM SGLIST ;IT IS THE BLANK .PSECT > MOVE [XWD CTIBUF+1,CTLSAV] ;SAVE CONTROL INPUT BUFFER BLT CTLS1 ;FOR RESCAN ON PASS 2 MOVSI 'DSK' ;SET INPUT TO TAKE DSK AS DEV MOVEM ACDEVX PUSHJ PP,COUTI ;INIT OUTPUT JUST IN CASE PUSHJ PP,INSET ;GET FIRST INPUT FILE JRST GETSE3 ;ERROR IFN CCLSW, MOVE CS,INDIR ;SET UP NAME OF FIRST FILE MOVEM CS,LSTFIL ;AS LAST PRINTED SETZM LSTPGN JRST ASSEMB ;START ASSEMBLY GETSE3: PUSHJ PP,ERRNE JRST ERRFIN FINIS: CLOSE BIN, ;DUMP BUFFER TLNE FR,PNCHSW ;PUNCH REQUESTED? PUSHJ PP,TSTBIN ;YES, TEST FOR ERRORS RELEAS BIN, CLOSE LST, SOSLE OUTSW+0*LPTSW ;LPT TYPE OUTPUT? PUSHJ PP,TSTLST ;YES, TEST FOR ERRORS RELEAS LST, RELEAS CHAR, OUTPUT CTL,0 ;FLUSH TTY OUTPUT SKIPE UNIVSN ;SKIP IF NOT ASSEMBLING UNIVERSAL PUSHJ PP,UNISYM ;STORE SYMBOLS ETC. FIRST JRST M ;RETURN FOR NEXT ASSEMBLY IFN CCLSW,< NUNSET: JUMPN ACDEV,.+2 MOVSI ACDEV,'SYS' ;USE SYS IF NONE SPECIFIED MOVEM ACDEV,RUNDEV MOVEM ACFILE,RUNFIL ;STORE FILE NAME SKIPN SFDADD ;ANY SFD'S? JRST NUNPP ;NO HRLI ACPPN,RUNSFD ;FORM BLT WORD MOVSS ACPPN ;BUT WRONG WAY ROUND BLT ACPPN,RUNSFD+2+.SFDLN MOVEI ACPPN,RUNSFD ;SET UP ADDRESS AGAIN NUNPP: MOVEM ACPPN,RUNPP ;IN PPN PUSHJ PP,DELETE ;COMMAND FILE SETZM RUNFIL+1 ;LET MONITOR CHOOSE EXT SETZM RUNFIL+2 ;CLEAR ALSO SETZM RUNPP+1 ;ZERO CORE ARG MOVEI 16,RUNDEV ;XWD 0,RUNDEV TLNE IO,CRPGSW ;WAS RPG IN PROGRESS? HRLI 16,1 ;YES. START NEXT AT C(.JBSA)+1 ;REDUCE THE LOW SEGMENT TO 1K AND DELETE THE HIGH ;BEFORE THE RUN UUO, SAVES CORE AND TIME MOVE 1,[1,,RUNEND-1] ;DELETE HIGH & LOW MOVE 2,[RUNHI,,RUNLO] BLT 2,RUNDEV-1 ;BLT CODE DOWN JRST RUNLO ;GO TO IT RUNHI: PHASE LOWL RUNLO:! CORE 1, ;CUT DOWN TO 1K JFCL ;TOO BAD RUN 16, ;DO "RUN DEV:NAME" HALT ;SHOULDN'T RETURN. HALT IF IT DOES RUNDEV:! BLOCK 1 RUNFIL:! BLOCK 3 RUNPP:! BLOCK 2 RUNSFD:! BLOCK 3+.SFDLN RUNEND:! DEPHASE DELETE: HRRZ EXTMP ;IF THE EXTENSION CAIE 'TMP' ;IS .TMP POPJ PP, ;RETURN. CLOSE CTL2, ;DELETE SETZB 4,5 ;THE COMMAND FILE. SETZB 6,7 RENAME CTL2,4 ; JFCL POPJ PP, > INSET: MOVEI JOBFFI ;POINTER TO INPUT BUFFER HRRM .JBFF ;INFORM SYSTEM OF BUFFER AREA PUSHJ PP,NAME2 ;GET NEXT COMMAND NAME POPJ PP, ;ERROR RETURN IF NONE LEFT AOS (PP) ;SUCCESS MOVEM ACDEV,INDEV ;STORE DEVICE MOVEM ACFILE,INDIR ;STORE FILE IN DIRECTORY MOVEM ACPPN,INDIR+3 ;STORE PPN BEFORE WE LOSE IT OPEN CHAR,INDEVI JRST EINIT ;ERROR DEVCHR ACDEV, ;TEST CHARACTERISTICS TLNN ACDEV,MTABIT ;MAG TAPE? JRST INSET3 ;NO TLZN FR,MTAPSW ;FIRST MAG TAPE IN PASS 2? JRST INSET1 ;NO TLNN TIO,TIORW ;YES, REWIND REQUESTED? SUB CS,RECCNT ;NO, PREPARE TO BACK-SPACE TAPE INSET1: AOS RECCNT ;INCREMENT FILE COUNTER ADDM CS,RECCNT ;UPDATE COUNT TLZE TIO,TIOLE MTEOT. CHAR, TLZE TIO,TIORW ;REWIND? MTREW. CHAR, ;YES JUMPGE CS,INSET2 MTBSF. CHAR, MTBSF. CHAR, AOJL CS,.-1 MTWAT. CHAR, STATO CHAR,1B24 MTSKF. CHAR, INSET2: SOJGE CS,.-1 INSET3: INBUF CHAR,1 MOVEI ACPNTR,JOBFFI EXCH ACPNTR,.JBFF SUBI ACPNTR,JOBFFI MOVEI ACDEL,NUMBUF*203+1 IDIV ACDEL,ACPNTR INBUF CHAR,(ACDEL) JUMPN ACEXT,INSET4 ;TAKE USER'S EXTENSION IF NON-BLANK MOVSI ACEXT,'MAC' ;BLANK, TRY .MAC FIRST PUSHJ PP,INSETI INSET4: PUSHJ PP,INSETI JUMPE ACEXT,ERRCF ;ERROR IF ZERO TLNE ACDEV,TTYBIT ;TELETYPE? SETSTS CHAR,AL ;YES, CHANGE TO ASCII LINE ;DO ALL ENTERS HERE FOR LEVEL D SKIPE ENTERS ;HAVE ENTERS BEEN DONE ALREADY? JRST ENTRDN ;YES, DON'T DO TWICE SKIPN ACEXT,LSTDEV ;IS THERE A LIST DEVICE? JRST LSTSE6 ;NO SO DON'T DO ENTER SKIPN ACFILE,LSTDIR ;GET FILE NAME INCASE OF ERROR JRST [DEVCHR ACEXT, TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY? JRST LSTSE4 ;YES, GIVE UP BEFORE HARM IS DONE SKIPE ACFILE,INDIR ;USE INPUT FILE NAME MOVEM ACFILE,LSTDIR ;TOO BAD IF ZERO ALSO JRST LSTSE4] HLLZS ACEXT,LSTDIR+1 ;EXT ALSO MOVE ACPPN,LSTDIR+3 ;SAVE PPN LOOKUP LST,LSTDIR ;PREVIOUS ONE STILL THERE JRST LSTSE4 ;NO SETZM LSTDIR ;YES,CLEAR NAME HLLZS LSTDIR+1 MOVEM ACPPN,LSTDIR+3 ;RESET PPN RENAME LST,LSTDIR CLOSE LST, ;IGNORE FAILURE MOVEM ACFILE,LSTDIR ;RESTORE NAME SETZM LSTDIR+2 ;CLEAR PROTECTION AND DATE LSTSE4: MOVEM ACPPN,LSTDIR+3 ;[246] SET PPN AGAIN HLLZS LSTDIR+1 ;ZERO RIGHT HALF OF EXTENSION WORD ENTER LST,LSTDIR ;SET UP DIRECTORY JRST ERRCL ;ERROR LSTSE6: SKIPN ACEXT,BINDEV ;A BINARY DEVICE THEN ? JRST ENTRDN ;NO SKIPN ACFILE,BINDIR ;INCASE OF ERROR JRST [DEVCHR ACEXT, TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY? JRST .+1 ;YES, GIVE UP BEFORE HARM IS DONE SKIPE ACFILE,INDIR ;USE INPUT FILE NAME MOVEM ACFILE,BINDIR ;TOO BAD IF ZERO ALSO JRST .+1] HLLZS ACEXT,BINDIR+1 ENTER BIN,BINDIR ;ENTER FILE NAME JRST ERRCB ;ERROR ENTRDN: SETOM ENTERS ;MAKE SURE ONLY DONE ONCE MOVE CS,[POINT 7,DEVBUF] PUSH PP,1 ;SAVE THE ACCS PUSH PP,2 PUSH PP,3 SKIPN 2,INDIR ;GET INPUT NAME JRST FINDEV ;FINISHED WITH DEVICE SETZ 1, ;CLEAR FOR RECEIVING LSHC 1,6 ;SHIFT ONE CHAR. IN ADDI 1,40 ;FORM ASCII IDPB 1,CS ;STORE CHAR. JUMPN 2,.-4 ;MORE TO DO? MOVEI 1," " ;SEPARATE BY TAB IDPB 1,CS HLLZ 2,INDIR+1 ;GET EXT JUMPE 2,FINEXT ;NO EXT SETZ 1, LSHC 1,6 ;SAME LOOP AS ABOVE ADDI 1,40 IDPB 1,CS JUMPN 2,.-4 MOVEI 1," " IDPB 1,CS ;SEPARATE BY TAB FINEXT: LDB 1,[POINT 12,INDIR+2,35] ;GET LOW 12 BITS OF DATE LDB 2,[POINT 3,INDIR+1,20] ;GET HIGH 3 BITS OF DATE DPB 2,[POINT 3,1,23] ;MERGE TO BITS JUMPE 1,FINDEV ;NO DATE? PUSHJ PP,DATOUT ;STORE IT LDB 2,[POINT 11,INDIR+2,23] ;GET CREATION TIME JUMPE 2,FINDEV ;NO TIME (DECTAPE) MOVEI 1," " ;SEPARATE BY SPACE IDPB 1,CS PUSHJ PP,TIMOU1 ;STORE TIME FINDEV: SETZ 1, MOVEI 2," " ;FINAL TAB IDPB 2,CS IDPB 1,CS ;TERMINATE FOR NOW POP PP,3 ;RESTORE ACCS POP PP,2 POP PP,1 SKIPN PAGENO ;IF FIRST TIME THRU JRST OUTFF ;START NEW PAGE SETZM PAGENO ;ON NEW FILE, RESET PAGES JRST OUTFF2 ;DON'T START NEW PAGE UNLESS FF INSETI: HLLZM ACEXT,INDIR+1 ;STORE EXTENSION MOVE ACPPN,INDIR+3 ;SAVE PPN LOOKUP CHAR,INDIR SKIPA ACEXT,INDIR+1 ;GET ERROR CODE JRST CPOPJ1 ;SKIP-RETURN IF FOUND TRNE ACEXT,-1 ;ERROR CODE OF 0 IS FILE NOT FOUND JRST ERRCF ;FILE THERE BUT NOT READABLE SETZ ACEXT, ;CLEAR EXT AND TRY AGAIN MOVEM ACPPN,INDIR+3 ;RESTORE PPN POPJ PP, REC2: MOVS [CTIBUF+1,,CTLSAV] ;RESCAN CONTROL (FROM PASS1 END STMNT) BLT CTIBUF+2 ;INPUT BUFFER MOVEI "_" HRLM ACDELX ;FUDGE PREVIOUS DELIMITER SETZM PASS2I MOVE [XWD PASS2I,PASS2I+1] BLT PASS2X-1 ;ZERO PASS2 VARIABLES TLO FR,MTAPSW!LOADSW ;SET FLAGS GOTEND: MOVE INDEV ;GET LAST DEVICE DEVCHR ;GET ITS CHARACTERISTICS TLNE 4 ;TEST FOR DIRECTORY (DSK OR DTA) JRST EOT ;YES, SO DON'T WASTE TIME JRST .+3 ;NO, INPUT BUFFER BY BUFFER IN CHAR, JRST .-1 ;NO ERRORS STATO CHAR,1B22 ;TEST FOR EOF JRST .-3 ;IGNORE ERRORS EOT: PUSHJ PP,SAVEXS ;SAVE REGISTERS SETOM EOFFLG ;[417]GOING THRU EOF PROCEDURE PUSHJ PP,INSET ;GET THE NEXT INPUT DEVICE JRST EOT0 ;ERROR HRROI RC,[SIXBIT /EP1 END OF PASS 1]@/] ;ASSUME END OF PASS TLZN FR,LOADSW ;ZERO ONLY ON END OF PASS 1 HRROI RC,[SIXBIT /LNF LOAD THE NEXT FILE]@/] ;NOT END OF PASS TLNE ACDEV,(1B13!1B15) ;WAS ALL THAT WORK NECESSARY? JRST RSTRXS ;NO PUSHJ PP,EINFO ;CR-LF [ PUSHJ PP,TYPMSG ;YES RSTRXS: MOVSI RC,SAVBLK ;SET POINTER BLT RC,RC-1 ;RESTORE REGISTERS MOVE RC,SAVERC ;RESTORE RC POPJ PP, ;EXIT SAVEXS: MOVEM RC,SAVERC ;SAVE RC MOVEI RC,SAVBLK ;SET POINTER BLT RC,SAVBLK+RC-1 ;BLT ALL REGISTERS BELOW RC POPJ PP, ;EXIT EOT0: JUMP1 [TLON FR,LOADSW ;PRINT MESSAGE ONCE PUSHJ PP,ERRNE ;ON PASS1 JRST EOT1] AOS ERRCNT ;COUNT AS ERROR TLO FR,LOADSW ;USED TO SIGNAL POPJ RET FROM ERRNE PUSHJ PP,ERRNE ;PRINT ERROR MESSAGE EOT1: TLZ IO,IORPTC MOVE PP,SAVEPP ;RESTORE STACKS MOVE MP,SAVERP MOVEM MP,SAVERP MOVE MP,SAVEMP AOBJN PP,END01 ;FAKE END SEEN NAME1: SETZM ACDEVX ;ENTRY FOR DESTINATION NAME2: SETZB ACDEV,INDIR+2 ;ENTRY FOR SOURCE SETZB ACFILE,PPN ;CLEAR FILE AND PPN HLRZ ACDEL,ACDELX ;GET PREVIOUS DELIMITER SETZB TIO,CS SETZB ACEXT,INDIR+3 ;RESET EXTENSION AND PROGRAM-NUMBER PAIR SETZM SFDADD ;CLEAR FIRST WORD OF SFD BLOCK MOVE AC0,[SFDADD,,SFDADD+1] BLT AC0,SFDADD+2+.SFDLN ;AND REST OF IT NAME3: MOVSI ACPNTR,(POINT 6,AC0) ;SET POINTER TDZA AC0,AC0 ;CLEAR SYMBOL SLASH: PUSHJ PP,SW0 GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER CAIN C,"/" JRST SLASH CAIN C,"(" JRST SWITCH CAIN C,":" JRST DEVICE CAIN C,"." JRST NAME IFN CCLSW, CAIE C,33 ;CHECK FOR THREE FLAVORS OF ALT-MODE CAIN C,176 ;... JRST TERM ;... CAIG C,CR ;LESS THAN CR? CAIGE C,LF ;AND GREATER THAN LF? CAIN C,175 ;OR 3RD ALTMOD JRST TERM ;YES CAIE C,"<" ;NEW ALT FORM OF DIRECTORY CAIN C,"[" JRST PROGNP ;GET PROGRAMER NUMBER PAIR CAIN C,"=" ;EQUALS IS SAME AS LEFT ARROW TRCA C,142 ;SO MAKE IT A "_" AND SKIP CAIE C,"," CAIN C,"_" JRST TERM JUMPL C,TERME ;ERROR RETURN FROM TTYIN? CAIGE C,40 ;VALID AS SIXBIT? JRST [CAIN C,CZ ;NO,IS IT ^Z JRST CZSTOP ;YES,EXIT FOR BATCH JRST GETIOC] ;JUST IGNORE CAIL C,"0" ;[424] ERROR IF NOT ALPHANUMERIC CAILE C,"Z" ;[424] JRST ERRCM ;[424] CAILE C,"9" ;[424] CAIL C,"A" ;[424] CAIA ;[424] JRST ERRCM ;[424] SUBI C,40 ;CONVERT TO 6-BIT TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES? IDPB C,ACPNTR ;NO, STORE IT JRST GETIOC ;GET NEXT CHARACTER DEVICE: JUMPN ACDEV,ERRCM ;ERROR IF ALREADY SET MOVE ACDEV,AC0 ;DEVICE NAME JRST DEVNAM ;COMMON CODE NAME: JUMPN ACFILE,ERRCM ;ERROR IF ALREADY SET MOVE ACFILE,AC0 ;FILE NAME DEVNAM: MOVE ACDEL,C ;SET DELIMITER JRST NAME3 ;GET NEXT SYMBOL TERME: TLZA C,-1 ;MAKE INTO 33 BUT GIVE ERROR RET TERM: AOS (PP) ;GIVE SKIP RETURN ON VALID TERMINATOR JUMPE ACDEL,TERM1 ;IF NO PREVIOUS TERMINATOR, THEN FILENAME CAIN ACDEL,"_" ;... JRST TERM1 ;... CAIE ACDEL,":" ;IF PREVIOUS DELIMITER CAIN ACDEL,"," ;WAS COLON OR COMMA TERM1: MOVE ACFILE,AC0 ;SET FILE CAIN ACDEL,"." ;IF PERIOD, HLLO ACEXT,AC0 ;[427] SET EXTENSION HRLM C,ACDELX ;SAVE PREVIOUS DELIMITER JUMPN ACDEV,.+2 ;IF DEVICE SET USE IT SKIPA ACDEV,ACDEVX ;OTHERWISE USE LAST DEVICE MOVEM ACDEV,ACDEVX ;AND DEVICE SKIPN ACPPN,PPN ;[216] PUT PPN IN RIGHT PLACE SKIPN PPPN ;[216] DO WE HAVE A DEFAULT? JRST TERM2 ;[216] PPN IS SETUP MOVE ACPPN,[PSFD,,SFDADD] ;[216] MOVE DEFAULT SFD BLT ACPPN,SFDE ;[216] MOVE ACPPN,PPPN ;[216] AND PPN TERM2: CAIN C,"!" ;IMPERATIVE? POPJ PP, ;YES, DON'T ASSUME DEV JUMPE ACFILE,CPOPJ ;IF THERE IS A FILE, JUMPN ACDEV,.+2 ;BUT NO DEVICE MOVSI ACDEV,'DSK' ;THEN ASSUME DISK POPJ PP, ;EXIT CZSTOP: EXIT 1, ;[275]MONRET JRST M ;[275]CONTINUE ERRCM: HRROI RC,[SIXBIT /CME COMMAND ERROR@/] JRST ERRFIN PROGNP: PUSHJ PP,GETOCT ;GET AN OCTAL NUMBER IN RC SKIPN RC ;[405] IF ITS 0, USE HLRZ RC,MYPPN ;[405]USE LOGGED IN PROJECT NUMBER HRLZM RC,PPN ;STORE IT CAIE C,"," ;MORE? JRST PPNTST ;[216] NO, GIVE UP PUSHJ PP,GETOCT ;GET AN OCTAL NUMBER SKIPN RC ;[405] IF ITS 0, USE HRRZ RC,MYPPN ;[405]MY PROGRAMMER NUMBER HRRM RC,PPN ;STORE IT CAIE C,"," ;SFD'S? JRST PPNTST ;[216] NO MOVEI C,SFDADD ;POINT TO DDDSFD BLOCK EXCH C,PPN ;SWAP WITH PPN MOVEM C,SFDADD+2 ;STORE IT MOVEI RC,SFDADD+3 ;START OF SFD AREA SFD1: HRRZS RC ;CLEAR BYTE POINTER CAILE RC,SFDADD+2+.SFDLN JRST ERRCM ;PATH TOO LONG HRLI RC,(POINT 6) ;BYTE POINTER SETUP SFD2: PUSHJ PP,TTYIN ;GET CHAR CAIE C,">" ;ALT FORM CAIN C,"]" ;END? JRST PPNTST ;[216] YES CAIN C,"," ;NEXT SFD AOJA RC,SFD1 ;YES, INCREMENT STORE ADDRESS SUBI C,40 ;CONVERT TO SIXBIT JUMPL C,ERRCM ;ERROR TLNE RC,770000 ;SPACE IN WORD IDPB C,RC ;YES, STORE CHAR. JRST SFD2 ;GET NEXT CHAR GETOCT: SETZ RC, ;START WITH ZERO GETOC1: PUSHJ PP,TTYIN CAIE C,"," ;TEST FOR COMMA CAIN C,"]" ;AND CLOSE SQB POPJ PP, ;YES, WEVE GOT SOMETHING CAIN C,">" ;ALSO ALT FORM POPJ PP, IFE STANSW,< CAIL C,"0" ;CHECK FOR VALID NUMBERS CAILE C,"7" JRST ERRCM ;NOT VALID LSH RC,3 ;SHIFT PREVIOUS RESULT ADDI RC,-"0"(C) ;ADD IN NEW NUMBER> IFN STANSW, JRST GETOC1 ;GET NEXT CHARACTER ;[216] HERE TO TEST FOR DEFAULT PPN PPNTST: SKIPN ACFILE ;SEEN FILE NAME YET? SKIPE AC0 ;OR PENDING JRST GETIOC ;NO PUSH PP,AC0 ;GET AN AC MOVE AC0,PPN ;GET PPN MOVEM AC0,PPPN ;MAKE IT PERMANENT MOVE AC0,[SFDADD,,PSFD] BLT AC0,PSFDE ;SAME FOR SFDS POP PP,AC0 JRST GETIOC ;[216] END OF EDIT SWITC0: PUSHJ PP,SW1 ;PROCESS CHARACTER SWITCH: PUSHJ PP,TTYIN ;GET NEXT CHARACTER CAIE C,")" ;END OF STRING? JRST SWITC0 ;NO JRST GETIOC ;YES SW0: PUSHJ PP,TTYIN SW1: HRREI C,-"A"(C) ;[227] CONVERT FROM ASCII TO NUMERIC JUMPL C,SEELPP ;[227] NUMERIC VALUE MAYBE? CAILE C,"Z"-"A" ;WITHIN BOUNDS? (IS IT ALPHA?) JRST ERRCM ;[227] NO, LT. Z, ERROR MOVE RC,[POINT 5,BYTAB] IBP RC SOJGE C,.-1 ;MOVE TO PROPER BYTE LDB C,RC ;PICK UP BYTE JUMPE C,ERRCM ;TEST FOR VALID SWITCH CAIG C,SWTABT-SWTAB ;LEGAL ON SOURCE? JUMPL PP,ERRCM ;NO, TEST FOR SOURCE LDB RC,[POINT 4,SWTAB-1(C),12] CAIN RC,IO SKIPN CTLSAV ;IF PASS2 OR IO SWITCH, XCT SWTAB-1(C) ;EXECUTE INSTRUCTION POPJ PP, ;EXIT TLZ IO,IOSALL ;TAKE CARE OF /X POPJ PP, HELP: PUSH PP,.JBFF ;SAVE REAL .JBFF MOVE 1,.JBREL ;USE JOBREL MOVEM 1,.JBFF ;SO HELPER DOESN'T DESTROY SYMBOL TABLE MOVE 1,['MACRO '] ;GET MACRO.HLP PUSHJ PP,.HELPR ;CALL HELPER POP PP,.JBFF ;RESTORE JOBFF INCASE CCL MODE JRST M ;RESTART ;[227] HERE FOR /nnL SWITCH TO SET LINES/PAGE SEELPP: ADDI C,"A"-"0" ;TO NUMERIC RANGE CAIG C,9 ;IS IT JUMPGE C,.+2 JRST ERRCM ;NO, BARF MOVE RC,C ;MOVE VALUE SEELP1: PUSHJ PP,TTYIN ;GET NEXT CAIG C,"9" ;IS IT NUMERIC CAIGE C,"0" ;... JRST SEELP2 ;NO, CHECK END IMULI RC,^D10 ;MAKE SPACE ADDI RC,-"0"(C) ;AND PUT DIGIT JRST SEELP1 ;AND CONTINUE SEELP2: CAIE C,"L" ;END PROPERLY? JRST ERRCM ;NO, BARF SUBI RC,4 ;EASIER FOR SYMBOL OUTPUT ROUTINES MOVEM RC,..LPP ;SAVE IN "READ-ONLY" POPJ PP, ;ALL DONE DEFINE SETSW (LETTER,INSTRUCTION) < INSTRUCTION J= <"LETTER"-"A">-7*/7> SETCOD \I,J> DEFINE SETCOD (I,J) B<5*J+4>> BYTAB0= 0 ;INITIALIZE TABLE BYTAB1= 0 BYTAB2= 0 BYTAB3= 0 SWTAB: SETSW Z, SETSW C, SETSW P, SWTABT: ;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY SETSW A, SETSW B, SETSW E, IFN FORMSW,< SETSW F, SETSW G,> SETSW H, SETSW L, SETSW M, SETSW N, SETSW O, SETSW Q, SETSW S, SETSW T, SETSW U, SETSW W, SETSW X, IFG .-SWTAB-37, BYTAB: ;BYTAB CONTAINS AN INDEX TO SWTAB ;IT CONSIST OF 7 5BIT BYTES/WORD ;OR ONE BYTE FOR EACH LETTER +BYTAB0 ;A-G BYTE = 1 THROUGH 17 = INDEX +BYTAB1 ;H-N BYTE = 0 = COMMAND ERROR +BYTAB2 ;O-U +BYTAB3 ;V-Z IF2, TTYIN: SOSGE CTIBUF+2 ;ENUF CHAR.? JRST TTYERR ;NO ILDB C,CTIBUF+1 ;GET CHARACTER CAIE C," " ;SKIP BLANKS CAIN C,HT ;AND TABS JRST TTYIN CAIN C,15 ;CR? SETZM CTIBUF+2 ;YES,IGNORE REST OF LINE CAIG C,"Z"+40 ;CHECK FOR LOWER CASE CAIGE C,"A"+40 POPJ PP, ;NO,EXIT SUBI C,40 POPJ PP, ;YES, EXIT COMERR: HRROI RC,[SIXBIT /CTL COMMAND LINE TOO LONG@/] JRST ERRFIN TTYERR: SKIPN INDEV ;INPUT DEVICE SEEN? JRST ERRCM ;NO, SO MISSING "_" HRROI C,EOL ;SIGNAL ERROR POPJ PP, ;AND RETURN ERRNE: HRROI RC,[SIXBIT /NES NO END STATEMENT ENCOUNTERED ON INPUT FILE@/] ERRNE0: PUSHJ PP,EFATAL ;OUTPUT CR-LF ?MCR PUSHJ PP,TYPMSG ;OUTPUT IT SKIPE LITLVL ;SEE IF IN LITERAL SKIPN LITPG ;PAGE 0 MEANS NOT IN A LITERAL REALLY JRST ERRNE1 ;NO, TRY OTHERS MOVE V,[XWD [SIXBIT /IN LITERAL@/],LITPG] PUSHJ PP,PRNUM ;GO PRINT INFORMATION ERRNE1: MOVEI V,0 ;CHECK FOR OTHER PLACES SKIPE INDEF MOVE V,[XWD [SIXBIT /IN DEFINE@/],DEFPG] SKIPE INTXT MOVE V,[XWD [SIXBIT /IN TEXT@/],TXTPG] SKIPE INREP MOVE V,[XWD [SIXBIT /IN CONDITIONAL OR REPEAT@/],REPPG] SKIPE INCND MOVE V,[XWD [SIXBIT /IN CONDITIONAL@/],CNDPG] SKIPGE MACENL ERRNE2: MOVE V,[XWD [SIXBIT /IN MACRO CALL@/],CALPG] JUMPN V,ERRNE3 MOVE V,[XWD [SIXBIT /@/],PAGENO] ;BETTER THAN NOTHING SKIPE LITLVL ;HAD ONE PAGE NUMBER ALREADY POPJ PP, ERRNE3: PUSHJ PP,PRNUM TLNE FR,LOADSW ;SEEN END OF FILE YET? POPJ PP, ;YES MOVE PP,SAVEPP ;NO RESET STACK MOVE MP,SAVERP MOVEM MP,RP MOVE MP,SAVEMP SETZ MRP, JRST ASSEM2 ;AND CONTINUE ERRMS1: SIXBIT / ERRORS DETECTED@/ ERRMS2: SIXBIT /1 ERROR DETECTED@/ ERRMS3: SIXBIT /NO ERRORS DETECTED@/ ERRMQ1: SIXBIT /1 WARNING GIVEN@/ ERRMQ2: SIXBIT / WARNINGS GIVEN@/ EINIT: PUSHJ PP,EFATAL ;[352] ?MCR MOVSI CS,'DNA' ;[352] PUSHJ PP,TYPSYM ;[352] DNA MOVEI C," " ;[352] PUSHJ PP,TYO ;[352] SPACE MOVE RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE@/]] ;[352] JRST ERRFN1 ;[352] REST OF MESSAGE ERRCL: HRRZ RC,LSTDIR+1 ;GET LST DEV ERROR CODE JRST .+2 ;GET ERROR MESSAGE ERRCB: HRRZ RC,BINDIR+1 ;GET BIN DEV ERROR CODE JUMPN RC,ERRTYP SOJA RC,ERRTYP ;SPECIAL CASE IF ERROR CODE 0 ERRCF: HRRZ RC,INDIR+1 ;GET INPUT DEV ERROR CODE HLLZ ACEXT,INDIR+1 ;SET UP EXT ERRTYP: CAIL RC,TABLND-TABLE ;IS ERROR CODE LEGAL? SKIPA RC,TABLND ;NO, GIVE CATCH ALL MESSAGE MOVE RC,TABLE(RC) ;YES, PICK UP MESSAGE PUSHJ PP,EFATAL ;PUT OUT CR-LF ?MCR MOVSI CS,'LRE' ;LOOKUP-RENAME-ENTER TYPE PUSHJ PP,TYPSYM CAIA ;SKIP CALL TO EFATAL NOW ERRFIN: PUSHJ PP,EFATAL ERRFN1: PUSHJ PP,TYPMSG ;[352] CLOSE LST, ;GIVE USER A PARTIAL LISTING CLOSE BIN,40 ;BUT NEVER A BUM REL FILE JRST M EFATAL: PUSHJ PP,OCRLF MOVEI C,"?" PUSHJ PP,TYO MOVSI CS,'MCR' ;IDENTIFY CUSP IFN CCLSW, PJRST TYPSYM ;AND RETURN EWARN: PUSHJ PP,OCRLF MOVEI C,"%" PUSHJ PP,TYO MOVSI CS,'MCR' ;IDENTIFY CUSP PJRST TYPSYM ;AND RETURN EINFO: PUSHJ PP,OCRLF MOVEI C,"[" PUSHJ PP,TYO MOVSI CS,'MCR' ;IDENTIFY CUSP PJRST TYPSYM ;AND RETURN OCRLF: SKPINC C ;SEE IN WE CAN INPUT A CHAR. JFCL ;BUT ONLY TO DEFEAT ^O PJRST CRLF [SIXBIT /(0) ILLEGAL FILE NAME@/],,ACFILE TABLE: [SIXBIT /(0) FILE WAS NOT FOUND@/],,ACFILE [SIXBIT /(1) NO DIRECTORY FOR PROJECT-PROGRAMMER NUMBER@/],,ACFILE [SIXBIT /(2) PROTECTION FAILURE@/],,ACFILE [SIXBIT /(3) FILE WAS BEING MODIFIED@/],,ACFILE [SIXBIT /(4) RENAME FILE NAME ALREADY EXISTS@/],,ACFILE [SIXBIT /(5) ILLEGAL SEQUENCE OF UUOS@/],,ACFILE [SIXBIT /(6) BAD UFD OR BAD RIB@/],,ACFILE [SIXBIT /(7) NOT A SAV FILE@/],,ACFILE [SIXBIT /(10) NOT ENOUGH CORE@/],,ACFILE [SIXBIT /(11) DEVICE NOT AVAILABLE@/],,ACFILE [SIXBIT /(12) NO SUCH DEVICE@/],,ACFILE [SIXBIT /(13) NOT TWO RELOC REG. CAPABILITY@/],,ACFILE [SIXBIT /(14) NO ROOM OR QUOTA EXCEEDED@/],,ACFILE [SIXBIT /(15) WRITE LOCK ERROR@/],,ACFILE [SIXBIT /(16) NOT ENOUGH MONITOR TABLE SPACE@/],,ACFILE [SIXBIT /(17) PARTIAL ALLOCATION ONLY@/],,ACFILE [SIXBIT /(20) BLOCK NOT FREE ON ALLOCATION@/],,ACFILE [SIXBIT /(21) CAN'T SUPERSEDE (ENTER) AN EXISTING DIRECTORY@/],,ACFILE [SIXBIT /(22) CAN'T DELETE (RENAME) A NON-EMPTY DIRECTORY@/],,ACFILE [SIXBIT /(23) SFD NOT FOUND@/],,ACFILE [SIXBIT /(24) SEARCH LIST EMPTY@/],,ACFILE [SIXBIT /(25) SFD NESTED TOO DEEPLY@/],,ACFILE [SIXBIT /(26) NO-CREATE ON FOR SPECIFIED PATH@/],,ACFILE TABLND: [SIXBIT /(?) LOOKUP, ENTER, OR RENAME ERROR@/],,ACFILE TYPMSG: HLRZ CS,RC ;GET FIRST MESSAGE CAIE CS,-1 ;SKIP IF MINUS ONE PUSHJ PP,TYPM2 ;TYPE MESSAGE HRRZ CS,RC ;GET SECOND HALF PUSHJ PP,TYPM2 CRLF: MOVEI C,CR ;OUTPUT CARRIAGE RETURN PUSHJ PP,TYO MOVEI C,LF ;AND LINE FEED TYO: SOSG CTOBUF+2 ;BUFFER FULL? OUTPUT CTL,0 ;YES, DUMP IT IDPB C,CTOBUF+1 ;STORE BYTE CAIG C,FF ;FORM FEED? CAIGE C,LF ;V TAB OR LINE FEED? POPJ PP, ;NO OUTPUT CTL,0 ;YES POPJ PP, ;AND EXIT TYPM2: MOVSI C,(1B0) ;ANTICIPATE REGISTER WORD CAIN CS,ACFILE ;FILE NAME ? JRST [JUMPE ACEXT,.+1 ;YES, TEST FOR EXT LSH ACEXT,-6 ;MAKE SPACE FOR "." IOR ACEXT,[SIXBIT /. @/] JRST TYPM2A] CAIG CS,17 ;IS IT? MOVEM C,1(CS) TYPM2A: HRLI CS,(POINT 6,,) ;FORM BYTE POINTER TYPM3: ILDB C,CS ;GET A SIXBIT BYTE CAIN C,40 ;"@"? JRST TYO ;YES, TYPE SPACE AND EXIT ADDI C,40 ;NO, FORM 7-BIT ASCII PUSHJ PP,TYO ;OUTPUT CHARACTER JRST TYPM3 TYPSYM: MOVEI C,0 ;CLEAR C LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN JUMPE C,CPOPJ ;TEST FOR END ADDI C,40 ;CONVERT TO ASCII PUSHJ PP,TYO ;OUTPUT JRST TYPSYM ;LOOP XCEEDS: ADDI SX,2000 ;ADJUST SYMBOL POINTER XCEED: PUSHJ PP,SAVEXS ;SAVE THE REGISTERS HRRZ 1,.JBREL ;GET CURRENT TOP MOVEI 0,2000(1) CORE 0, ;REQUEST MORE CORE JRST XCEED2 ;ERROR, BOMB OUT HRRZ 2,.JBREL ;GET NEW TOP XCEED1: MOVE 0,0(1) ;GET ORIGIONAL MOVEM 0,0(2) ;STORE IN NEW LOCATION SUBI 2,1 ;DECREMENT UPPER CAMLE 1,SYMBOL ;HAVE WE ARRIVED? SOJA 1,XCEED1 ;NO, GET ANOTHER MOVEI 1,2000 ADDM 1,SYMBOL ADDM 1,SYMTOP PUSHJ PP,SRCHI ;RE-INITIALIZE SYMBOL TABLE JRST RSTRXS ;RESTORE REGISTERS AND EXIT XCEED2: HRROI RC,[SIXBIT /NEC INSUFFICIENT CORE@/] XCEED3: TLO FR,LOADSW ;[326] MAKE SURE IT COMES BACK PUSHJ PP,ERRNE0 ;[326] GO PRINT WHERE CLOSE LST, ;[400] GIVE USER A PARTIAL LISTING CLOSE BIN,40 ;[400] BUT NEVER A BUM REL FILE JRST M ;[326] START ANOTHER ASSEMBLY PDPERR: HRROI RC,[SIXBIT .PDL PDP OVERFLOW, TRY /P@.] MOVE PP,[IOWD $USRLN,$USSTK] ; RESET BOTH TYPES OF STACKS MOVEM PP,$USRPD ; INCLUDING USER TYPE MOVE PP,SAVEPP ;GET A VALID STACK POINTER JRST XCEED3 ;[326] DON'T CONTINUE ASSEMBLY PRNUM: HLRZ CS,V ;GET MESSAGE PUSHJ PP,TYPM2 MOVEI CS,[SIXBIT /ON PAGE@/] PUSHJ PP,TYPM2 MOVE AC0,(V) ;GET PAGE PUSHJ PP,DP1 ;PRINT NUMBER MOVEI C,40 PUSHJ PP,TYO SKIPN AC1,1(V) ;GET SEQ NUM IF THERE JRST PRNUM1 ;NO, TRY FOR TAG MOVEM AC1,OUTSQ MOVEI CS,[SIXBIT /LINE@/] PUSHJ PP,TYPM2 OUTPUT CTL,0 ;TO MAKE THINGS PRINT IN RIGHT ORDER OUTSTR OUTSQ ;PRINT SEQUENCE NUMBER MOVEI C," " ;ADD SPACE PUSHJ PP,TYO PRNUM1: MOVEI CS,[SIXBIT /AT@/] PUSHJ PP,TYPM2 MOVE CS,2(V) PUSHJ PP,TYPSYM ;PRINT TAG MOVEI CS,[SIXBIT / +@/] PUSHJ PP,TYPM2 HRRZ AC0,3(V) PUSHJ PP,DP1 ;PRINT DECIMAL INCREMENT PJRST CRLF ;END LINE DP1: IDIVI AC0,^D10 HRLM AC1,(PP) JUMPE AC0,.+2 PUSHJ PP,DP1 HLRZ C,(PP) ADDI C,"0" JRST TYO RIM0: TDO FR,AC0 ;SET RIM/RIM10 FLAG TLNE FR,PNCHSW ;FORGET IT IF PUNCH RESET SETSTS BIN,IB ;SET TO IMAGE BINARY MODE POPJ PP, ROUT: EXCH CS,RIMLOC SUB PP,[XWD 1,1] ;CLEAR OUT STACK WFW TLNE FR,R1BSW JRST ROUT6 TLNN FR,RIM1SW JRST ROUT1 JUMPE CS,ROUT1 ;RIM10 OUTPUT SUB CS,RIMLOC JUMPE CS,ROUT1 JUMPG CS,ERRAX MOVEI C,0 PUSHJ PP,PTPBIN AOJL CS,.-1 ROUT1: MOVSI C,(DATAI PTR,) ;RIM OUTPUT HRR C,LOCO ;GET ADDRESS TLNE FR,RIM1SW ;NO DATAI IF RIM10 AOSA RIMLOC PUSHJ PP,PTPBIN ;OUTPUT MOVE C,AC0 ;CODE AOSA LOCO ;INCREMENT CURRENT LOCATION OUTBIN: TLNN FR,RIMSW!RIM1SW!R1BSW ;EXIT IF RIM MODE PTPBIN: TLNN FR,PNCHSW ;EXIT IF PUNCH NOT REQUESTED POPJ PP, SOSG BINBUF+2 ;TEST FOR BUFFER FULL PUSHJ PP,DMPBIN ;YES, DUMP IT IDPB C,BINBUF+1 ;DEPOSIT BYTE POPJ PP, ;EXIT DMPBIN: OUT BIN,0 ;DUMP THE BUFFER POPJ PP, ;NO ERRORS TSTBIN: GETSTS BIN,C ;GET STSTUS BITS TRNN C,ERRBIT ;ERROR? POPJ PP, ;NO, EXIT MOVE AC0,BINDEV ;YES, GET TAG JRST ERRLST ;TYPE MESSAGE AND ABORT DMPLST: OUT LST,0 ;OUTPUT BUFFER POPJ PP, ;NO ERRORS TSTLST: GETSTS LST,C ;ANY ERRORS? TRNN C,ERRBIT POPJ PP, ;NO, EXIT MOVE AC0,LSTDEV ERRLST: MOVSI RC,[SIXBIT /WLE OUTPUT WRITE-LOCK ERROR DEVICE@/] TRNE C,IOIMPM ;IMPROPER MODE? JRST ERRFIN ;YES MOVSI RC,[SIXBIT /ODE OUTPUT DATA ERROR DEVICE@/] TRNE C,IODERR ;DEVICE DATA ERROR? JRST ERRFIN ;YES MOVSI RC,[SIXBIT /OCP OUTPUT CHECKSUM OR PARITY ERROR DEVICE@/] TRNE C,IODTER ;IS IT JRST ERRFIN ;YES MOVE CS,AC0 ;GET DEVICE DEVCHR CS, ;FIND OUT WHAT IT IS MOVSI RC,[SIXBIT /OQE OUTPUT QUOTA EXCEEDED ON DEVICE@/] TLNN CS,DSKBIT ;SKIP IF DSK OUTPUT MOVSI RC,[SIXBIT /OBL OUTPUT BLOCK TOO LARGE DEVICE@/] JRST ERRFIN R1BDMP: SETCM CS,R1BCNT JUMPE CS,R1BI HRLZS C,CS HRR C,R1BLOC HRRI C,-1(C) MOVEM C,R1BCHK PUSHJ PP,PTPBIN HRRI CS,R1BBLK R1BDM1: MOVE C,0(CS) ADDM C,R1BCHK PUSHJ PP,PTPBIN AOBJN CS,R1BDM1 MOVE C,R1BCHK PUSHJ PP,PTPBIN R1BI: SETOM R1BCNT PUSH PP,LOCO POP PP,R1BLOC POPJ PP, ROUT6: CAME CS,RIMLOC PUSHJ PP,R1BDMP AOS C,R1BCNT MOVEM AC0,R1BBLK(C) AOS LOCO CAIN C,.R1B-1 PUSHJ PP,R1BDMP AOS RIMLOC POPJ PP, READ0: PUSHJ PP,EOT ;END OF TAPE READ: SOSGE IBUF+2 ;BUFFER EMPTY? JRST READ3 ;YES READ1: ILDB C,IBUF+1 ;PLACE CHARACTER IN C MOVE CS,@IBUF+1 ;CHECK FOR SEQUENCE NUMBER TRNN CS,1 JRST READ1A CAMN CS,[+1] ;[261] HOWEVER IF AN SOS PAGE MARK SETZ CS, ;[261] CLEAR SEQ NO. SO LINE NOT COUNTED MOVEM CS,SEQNO MOVEM CS,SEQNO2 MOVNI CS,4 ADDM CS,IBUF+2 ;ADJUST WORD COUNT REPEAT 4,< IBP IBUF+1> ;SKIP SEQ NO PUSHJ PP,READ ;AND THE TAB JRST READ ;GET NEXT CHARACTER READ1A: JUMPE C,READ ;IGNORE NULL CAIN C,CZ ;IF IT'S A "^Z" MOVEI C,LF ;TREAT IT AS A "LF" CAIE C,CLA ;CONTROL _ POPJ PP, MOVEI C,"^" ;MAKE CONTROL _ VISIBLE PUSHJ PP,RSW2 MOVEI C,"_" PUSHJ PP,RSW2 PUSHJ PP,PEEK ;[175] LOOK AT NEXT CHAR CAIG C,CR ;[175] IF IT IS END OF LINE CAIGE C,LF ;[175] JRST [POP PP,CS ;[175] GET RETURN ADDRESS PUSH PP,LIMBO ;[175] SAVE NEXT CHAR,RSW1 DESTROYS IT MOVEI C,CLA ;[175] RETORE ^_ PUSHJ PP,(CS) ;[175] RETURN TO LIST CHAR ETC POP PP,LIMBO ;[175] SAFE TO STORE NOW POPJ PP,] ;[175] RETURN TO PROGRAM TLZ IO,IORPTC ;[264] USE THE CHAR IN C NOW JRST READ2A ;[264] BUT DON'T LIST TWICE READ2: PUSHJ PP,READ ;YES, TEST FOR LINE FEED PUSHJ PP,RSW2 ;LIST IN ANY EVENT READ2A: CAIG C,FF ;[264] IS IT ONE OF CAIGE C,LF ;LF, VT, OR FF? JRST READ2 ;NO PUSHJ PP,OUTIM1 ;YES, DUMP THE LINE JRST READ ;RETURN NEXT CHARACTER READ3: IN CHAR,0 ;GET NEXT BUFFER JRST READ ;NO ERRORS GETSTS CHAR,C TRNN C,ERRBIT!2000 ;ERRORS? JRST READ0 ;EOF MOVE AC0,INDEV READ4: MOVSI RC,[SIXBIT/PET INPUT PHYSICAL END OF TAPE DEVICE@/] ;[403] TRNE C,2000 JRST ERRFIN ;E-O-T MOVSI RC,[SIXBIT /MDE MONITOR DETECTED SOFTWARE INPUT ERROR DEVICE@/] TRNE C,IOIMPM ;IMPROPER MODE? JRST ERRFIN ;YES MOVSI RC,[SIXBIT /IDE INPUT DATA ERROR DEVICE@/] TRNE C,IODERR ;DEVICE DATA ERROR? JRST ERRFIN ;YES MOVSI RC,[SIXBIT /ICP INPUT CHECKSUM OR PARITY ERROR DEVICE@/] TRNN C,IODTER MOVSI RC,[SIXBIT /IBL INPUT BLOCK TOO LARGE DEVICE@/] JRST ERRFIN OUTAB2: PUSHJ PP,OUTTAB ;PRINT TWO TABS OUTTAB: MOVEI C,HT PRINT: CAIE C,CR ;IS THIS A CR? CAIN C,LF ;OR LF? JRST OUTCR ;YES, GO PROCESS CAIN C,VT ;[257] VERT TAB? JRST OUTVT ;[257] YES CAIN C,FF ;FORM FEED? JRST OUTFF ;YES, FORCE NEW PAGE JRST OUTL OUTVT: PUSH PP,C+1 ;[257] NEED ADJACENT ACC MOVEI C,.LPP ;[257] NO. OF LINES WE STARTED WITH SUB C,LPP ;[257] MINUS NO. OF LINES LEFT IDIVI C,^D20 ;[257] HOW MANY WILL VT TAKE SUBI C+1,^D20 ;[257] TO GET TO NEXT TAB STOP ADDM C+1,LPP ;[257] ACCOUNT FOR THEM POP PP,C+1 ;[257] MOVEI C,VT ;[257] PUT CHAR BACK SKIPLE LPP ;[257] DID WE END PAGE? JRST OUTL ;[257] NO, OUTPUT IT TLO IO,IOPAGE ;[257] YES, NEXT TIME JRST OUTC ;[257] OUTPUT IT OUTCR: TRNN ER,ERRORS!LPTSW!TTYSW POPJ PP, MOVEI C,CR ;CARRIAGE RETURN, LINE FEED PUSHJ PP,OUTL SOSGE LPP ;END OF PAGE? TLO IO,IOPAGE ;YES, SET FLAG TRCA C,7 ;FORM LINE FEED AND SKIP OUTL: TLZN IO,IOPAGE ;NEW PAGE REQUESTED? JRST OUTC ;NO JUMP1 OUTC ;YES, BYPASS IF PASS ONE PUSH PP,C ;SAVE C AND CS PUSH PP,CS PUSH PP,ER TLNN IO,IOMSTR!IOPROG HRR ER,OUTSW TLNE IO,IOCREF ;IF DOING CREF OUTPUT NOW TLNE FR,CREFSW ;AND CREFFING (JUST IN CASE) JRST .+2 PUSHJ PP,CLSC3 ;CLOSE IT OUT HLLM IO,(PP) ;SAVE THIS NEW STATE OF IO MOVE C,..LPP ;[227] ADDI C,2 ;[227] PUT BACK THE 2 LINES MOVEM C,LPP ;SET NEW COUNTER MOVEI C,CR PUSHJ PP,OUTC MOVEI C,FF PUSHJ PP,OUTC ;OUTPUT FORM FEED MOVEI CS,TBUF PUSHJ PP,OUTAS0 ;OUTPUT TITLE MOVEI CS,VBUF PUSHJ PP,OUTAS0 ;OUTPUT VERSION MOVEI CS,DBUF PUSHJ PP,OUTAS0 ; AND DATE MOVE C,PAGENO PUSHJ PP,DNC ;OUTPUT PAGE NUMBER AOSG PAGEN. ;FIRST PAGE OF THIS NUMBER? JRST OUTL1 ;YES MOVEI C,"-" ;NO, PUT OUT MODIFIER PUSHJ PP,OUTC MOVE C,PAGEN. PUSHJ PP,DNC OUTL1: PUSHJ PP,OUTCR MOVEI CS,DEVBUF PUSHJ PP,OUTAS0 HRRZ CS,SUBTTX ;SWITCH FOR SUB-TITLE SKIPE 0(CS) ;IS THERE A SUB-TITLE? PUSHJ PP,OUTTAB ;YES, OUTPUT A TAB PUSHJ PP,SOUT20 ;OUTPUT ASCII WITH CARRIAGE RETURN PUSHJ PP,OUTCR POP PP,ER POP PP,CS ;RESTORE REGISTERS POP PP,C OUTC: TRNE ER,ERRORS!TTYSW PUSHJ PP,TYO TRNN ER,LPTSW POPJ PP, OUTLST: SOSG LSTBUF+2 ;BUFFER FULL? PUSHJ PP,DMPLST ;YES, DUMP IT IFN STANSW,< CAIN C,"@" MOVEI C,140 CAIN C,"_" MOVEI C,30 CAIN C,"^" MOVEI C,32 CAIE C,"\" JRST OUTLSS MOVEI C,177 IDPB C,LSTBUF+1 JRST OUTLST OUTLSS: > IDPB C,LSTBUF+1 ;STORE BYTE POPJ PP, ;EXIT OUTFF: TLOA IO,IOPAGE ;[161] OUTFF1: PUSHJ PP,PAGE1 ;[161] CLOSE CREF OUTFF2: SETOM PAGEN. ;[161] AOS PAGENO ;[161] POPJ PP, ;[161] TIMOUT: IDIVI 2,^D60*^D1000 TIMOU1: IDIVI 2,^D60 PUSH PP,3 ;SAVE MINUTES PUSHJ PP,OTOD ;STORE HOURS MOVEI 3,":" ;SEPARATE BY COLON IDPB 3,CS POP PP,2 ;STORE MINUTES OTOD: IDIVI 2,^D10 ADDI 2,60 ;FORM ASCII IDPB 2,CS ADDI 3,60 IDPB 3,CS POPJ PP, DATOUT: IDIVI 1,^D31 ;GET DAY ADDI 2,1 CAIG 2,^D9 ;TWO DIGITS? ADDI 2,7760*^D10 ;NO, PUT IN SPACE PUSHJ PP,OTOD ;STORE DAY IDIVI 1,^D12 ;GET MONTH MOVE 2,DTAB(2) ;GET MNEMONIC IDPB 2,CS ;DEPOSIT RIGHT MOST 7 BITS LSH 2,-7 ;SHIFT NEXT IN JUMPN 2,.-2 ;DEPOSIT IFIT EXISTS MOVEI 2,^D64(1) ;GET YEAR JRST OTOD ;STORE IT DTAB: "-NAJ-" "-BEF-" "-RAM-" "-RPA-" "-YAM-" "-NUJ-" "-LUJ-" "-GUA-" "-PES-" "-TCO-" "-VON-" "-CED-" ;[115] BINARY UNIVERSALS ;HERE TO WRITE OUT UNIVERSAL SYMBOL FILE ;SYMBOL TABLE PLUS MACROS UNVOUT: HRRZ AC0,FREE ;GET HIGHEST FREE LOCATION MOVEM AC0,.JBFF ;INTO JOBFF INIT UNV,B ;INIT DSK FOR OUTPUT SIXBIT /DSK/ XWD UNVBUF,0 ;OUTPUT ONLY JRST UNVINT ;[431] ERROR MOVSI AC0,'UNV' ;STANDARD EXT MOVEM AC0,UNVDIR+1 SETZM UNVDIR+2 SETZM UNVDIR+3 ;CLEAR PPN ENTER UNV,UNVDIR ;ENTER FILE JRST UNVENT ;[431] ERROR MOVEI SDEL,2*203 ;STANDARD DOUBLE BUFFERING ADD SDEL,FREE ;FROM FREE CORE CAML SDEL,SYMBOL ;MORE CORE NEEDED? PUSHJ PP,XCEED ;YES SUBI SDEL,2*203 ;BACK TO START OF BUFFER MOVEM SDEL,.JBFF ;SETUP FOR BUFFERS OUTBUF UNV,2 ;SET THEM UP MOVSI AC1,777 ;SPECIAL MARKER FIRST WORD HRRI AC1,.UVER ;STORE VERSION NUMBER PUSHJ PP,UNVBIN ;LOADER BLOCK 777? MOVE AC1,@SYMBOL ;GET NUMBER OF SYMBOLS MOVN SDEL,AC1 HRLZS SDEL HRR SDEL,SYMBOL ;FORM AOBJN POINTER PUSHJ PP,UNVBIN ;OUTPUT NUMBER OF SYMBOLS ADDI SDEL,1 ;BYPASS COUNT UNVLUP: MOVE AC1,(SDEL) ;GET SYMBOL PUSHJ PP,UNVBIN ADDI SDEL,1 MOVE AC1,(SDEL) ;GET VALUE TLNE AC1,SPTR ;SPECIAL EXTERNAL POINTER? JRST UNVSPT ;YES TLNE AC1,EXTF ;EXTERNAL (BUT NOT SPTR)? JRST UNVEXT ;YES, OUTPUT 2 WORDS TLNE AC1,MACF ;MACRO JRST UNVMAC ;YES, SAVE MACRO TEXT ALSO TLNE AC1,PNTF ;ONLY A POINTER TO VALUE? JRST UNVPTF ;YES PUSHJ PP,UNVBIN ;OUTPUT VALUE UNVNXT: AOBJN SDEL,UNVLUP ;FOR ALL SYMBOLS RELEASE UNV, POPJ PP, UNVINT: PUSHJ PP,EWARN ;[431] NOT FATAL AOS QERRS ;[431] INCREMENT WARNING COUNT MOVE AC0,UNVDIR ;[431] FILENAME IN AC0 MOVSI RC,[SIXBIT /UWU UNABLE TO WRITE UNIVERSAL FILE@/] ;[431] PJRST TYPMSG ;[431] TYPE MESSAGE AND EXIT UNVENT: PUSHJ PP,EWARN ;[431] NOT FATAL AOS QERRS ;[431] INCREMENT WARNING COUNT MOVSI CS,'EFU' ;[431] ENTER FAILED UNIVERSAL MNEMONIC PUSHJ PP,TYPSYM ;[431] MOVEI C," " ;[431] THROW IN A SPACE PUSHJ PP,TYO ;[431] HRRZ RC,UNVDIR+1 ;[431] GET ERROR BITS SKIPN RC ;[431] SOS RC ;[431] =0 SPECIAL CASE CAIL RC,TABLND-TABLE ;[431] WITHIN BOUNDS? JRST [HLRZ CS,TABLND ;[431] CATCH-ALL ERR MESS JRST .+2] ;[431] HLRZ CS,TABLE(RC) ;[431] REFERENCE TABLE PUSHJ PP,TYPM2 ;[431] GIVE APPROPRIATE MESSAGE MOVE AC0,UNVDIR ;[431] FILE NAME MOVSI RC,[SIXBIT /UNIVERSAL FILE@/] ;[431] PJRST TYPMSG ;[431] FINISH OFF AND EXIT ;HERE FOR EXTERNAL (NOT SPTR) UNVEXT: MOVE AC2,AC1 ;GET POINTER HLLZ AC1,AC1 ;CLEAR POINTER PUSHJ PP,UNVBIN ;OUTPUT FLAGS MOVE AC1,0(AC2) ;GET FIRST WORD (VALUE) PUSHJ PP,UNVBIN MOVE AC1,1(AC2) ;GET SECOND WORD (SYMBOL) PUSHJ PP,UNVBIN JRST UNVNXT ;HERE FOR 36 BIT VALUE UNVPTF: MOVE AC2,AC1 ;GET COPY HLLZ AC1,AC1 ;CLEAR POINTER PUSHJ PP,UNVBIN ;OUTPUT FLAGS MOVE AC1,(AC2) ;GET VALUE PUSHJ PP,UNVBIN ;OUTPUT IT JRST UNVNXT ;HERE FOR SPECIAL EXTERNAL SYMBOL UNVSPT: MOVE AC2,AC1 ;COPY POINTER HLLZ AC1,AC1 ;CLEAR POINTER PUSHJ PP,UNVBIN ;OUTPUT FLAGS MOVE AC1,(AC2) ;GET FIRST WORD PUSHJ PP,UNVBIN ;STORE VALUE MOVE AC1,1(AC2) ;GET RELOCATION WORD MOVE AC2,AC1 ;COPY IT PUSHJ PP,UNVBIN TRNN AC2,-1 ;RIGHT HALF RELOCATION? JRST .+5 ;NO MOVE AC1,(AC2) ;GET VALUE PUSHJ PP,UNVBIN MOVE AC1,1(AC2) ;EXTERNAL SYMBOL PUSHJ PP,UNVBIN TLNN AC2,-1 ;LEFT HALF RELOCATION? JRST UNVNXT ;NO HLRZS AC2 ;YES, SWAP JRST .-7 ;AND OUTPUT ;HERE FOR MACRO UNVMAC: MOVE AC2,AC1 ;GET POINTER TO TEXT HLLZ AC1,AC1 ;CLEAR POINTER PUSHJ PP,UNVBIN ;OUTPUT FLAGS HLRZ AC1,1(AC2) ;[334] GET DEFAULT VALUES, IF ANY MOVEM AC1,UNVDFA ;[334] SAVE STARTING ADDRESS PUSHJ PP,UNVMCP ;[334] GO DUMP MACRO ITSELF SKIPN AC2,UNVDFA ;[334] SEE IF ANY DEFAULT VALUES (LEFT) JRST UNVNXT ;[334] NO, CONTINUE WITH NEXT SYMBOL HRROI AC1,(AC2) ;[334] SET UP AOBJP POINTER FOR # OF DEFAULTS SKIPE (AC1) ;[334] ARE THERE ANY MORE? AOBJP AC1,.-1 ;[334] YES, COUNT AND TRY NEXT PUSHJ PP,UNVBIN ;[334] OUTPUT COUNT WORD UNVMC1: HLRZ AC1,(AC2) ;[334] GET THE AGUMENT # OF THIS DEFAULT PUSHJ PP,UNVBIN ;[334] OUTPUT THE ARGUMENT NUMBER MOVE AC2,(AC2) ;[334] GET ADDRESS OF DEFAULT PUSHJ PP,UNVMCP ;[334] GO OUTPUT, IT LOOKS LIKE MACRO AOS AC2,UNVDFA ;[334] UP POINTER TO DEFAULT BLOCK SKIPE (AC2) ;[334] SEE IF ANY MORE JRST UNVMC1 ;[334] YES, GO WRITE THEM OUT JRST UNVNXT ;[334] NO, GO DO NEXT SYMBOL UNVMCP: HLL AC2,(AC2) ;[334] PUT ADDRESS OF NEXT BLOCK IN LEFT QQ==0 REPEAT .LEAF,< MOVE AC1,QQ(AC2) PUSHJ PP,UNVBIN QQ==QQ+1> HLRZS AC2 JUMPN AC2,UNVMCP ;[334] MORE LEAFS TO PROCESS POPJ PP, ;[334] RETURN UNVBIN: SOSG UNVBUF+2 PUSHJ PP,DMPUNV IDPB AC1,UNVBUF+1 POPJ PP, DMPUNV: OUT UNV,0 POPJ PP, GETSTS UNV,C ;[403] GET STATUS BITS TRNN C,ERRBIT ;[403] ERRORS? POPJ PP, ;[403] NO, EXIT MOVSI AC0,'DSK' ;[431] DEVICE ALWAYS DSK JRST ERRLST ;[403] GIVE ERROR MESSAGE ;HERE TO READ IN UNIVERSAL SYMBOL TABLE UNVINP: MOVEM AC0,UNVDIR ;FILE WE NEED PUSH PP,AC0 ;[240] SAVE REAL NAME OF UNV MOVSI AC1,'DSK' ;[240] DEFAULT DEVICE MOVEM AC1,UNVDEV ;[240] MOVSI AC1,'UNV' ;REQUIRED EXT MOVEM AC1,UNVDIR+1 SETZM UNVDIR+2 SETZM UNVDIR+3 CAIE C,'(' ;[240] SEE IF USER SUPPLIED FILE SPEC JRST UNVOPN ;[240] NO, USE DEFAULT PUSHJ PP,SCHGET ;[240] GET A NAME CAIE C,':' ;[240] IS IT A DEVICE? JRST UNVCKN ;[240] NO TRY NAME MOVEM AC0,UNVDEV ;[240] YES, SAVE DEVICE PUSHJ PP,SCHGET ;[240] TRY NEXT NAME UNVCKN: MOVEM AC0,UNVDIR ;[240] SAVE NAME CAIE C,'.' ;[240] DOES EXT FOLLOW? JRST .+3 ;[240] NO PUSHJ PP,SCHGET ;[240] YES, GET IT MOVEM AC0,UNVDIR+1 ;[240] AND STORE IT CAIE C,'[' ;[240] A DIRECTORY SPECIFIED? JRST SCHCLP ;[240] NO PUSHJ PP,SCHOCT ;[240] GET PPN HRLZM AC0,UNVDIR+3 ;[240] AND SAVE IT CAIE C,',' ;[240] CHECK PROG NO. TROA ER,ERRQ ;[240] WARN USER PUSHJ PP,SCHOCT ;[240] GRT IT HRRM AC0,UNVDIR+3 ;[240] CAIE C,',' ;[240] AN SFD GIVEN? JRST SCHCLB ;[240] NO MOVEI AC0,UNVPTH ;GET PATH PTR EXCH AC0,UNVDIR+3 ;[240] SWAP WITH PPN MOVEM AC0,UNVPTH+2 ;[240] AND PUT IN PATH MOVSI RC,-.SFDLN ;[240] AOBJN PTR FOR SFDS SCHSFD: PUSHJ PP,SCHGET ;[240] GET SFD NAME AOBJP RC,SCHCLB+1 ;[240] SEE IF ENOUGH ROOM MOVEM AC0,UNVPTH+2(RC) ;[240] YES, STORE CAIN C,',' ;[240] DOES PATH CONTINUE ON? JRST SCHSFD ;[240] YES SCHCLB: CAIE C,']' ;[240] DOES PATH FINISH PROPERLY? TROA ER,ERRQ ;[240] NO PUSHJ PP,BYPAS1 ;[240] EAT UP THE "]" SCHCLP: CAIE C,')' ;[240] FILE SPEC END PROPERLY? TROA ER,ERRQ ;[240] NO PUSHJ PP,BYPAS1 ;[240] EAT IT UNVOPN: POP PP,AC0 ;[240] UNV NAME BACK IN 0 OPEN UNV,UNVINI ;[240] TRY USER SPECIFICATION JRST UNVUNV ;FAILED LOOKUP UNV,UNVDIR ;SEE IF THERE JRST UNVUNV ;TRY UNV: MOVEM AC0,UNVDIR ;[240] RESTORE NAME OF UNV UNVFND: AOS RC,UNIVNO ;BUMP COUNT OF UNIVERSALS CAILE RC,.UNIV ;SEE IF ROOM IN TABLES JRST UNVERR ;NO, GIVE ERROR SKIPN UNIVSN ;IS CURRENT PROG A UNIVERSAL JRST UNVNOT ;NO CAIL RC,.UNIV ;YES, ROOM FOR IT AS WELL? JRST UNVERR ;NO MOVE AC1,UNITBL(RC) ;GET CURRENT NAME MOVEM AC1,UNITBL+1(RC) ;STORE IT IN NEXT SLOT UNVNOT: MOVEM AC0,UNITBL(RC) ;STORE NAME HLRE SDEL,UNVDIR+3 ;GET SIZE OF FILE MOVMS SDEL ;IN WORDS ADD SDEL,FREE ;AT TOP OF FREE CORE HRRZM SDEL,UNIPTR(RC) ;SAVE NEW SYMTOP (IN WRONG HALF) ADDI SDEL,2*203 ;PLUS 2 BUFFERS CAML SDEL,SYMBOL ;WILL IT FIT? PUSHJ PP,XCEED ;NO, TRY FOR MORE CAML SDEL,SYMBOL ;DID WE GET ENOUGH? JRST .-2 ;NO TRY AGAIN SUBI SDEL,2*203 ;START OF BUFFERS MOVEM SDEL,.JBFF INBUF UNV,2 ;STANDARD DOUBLE BUFFERING PUSHJ PP,UNVREAD ;READ AND IGNORE FIRST WORD (777 MARKER) HRRZS AC1 ;GET UNV VERSION # SETOM UNVER% ;[334] KLUDGE SWITCH TO ALLOW VERSION 4 CAIE AC1,4 ;[334] SEE IF 4 (MIGHT BOMB DEFAULT ARGUMENTS) AOSA UNVER% ;[334] NO, UNVER% IS 0 FOR GOOD FILES AOS AC1 ;[334] VERSION 4 NEEDS FUDGING CAIE AC1,.UVER ;BETTER MATCH JRST VERSKW ;[364] YOU LOSE PUSHJ PP,UNVREAD ;READ SYMBOL COUNT (SECOND WORD) MOVE SDEL,AC1 ;GET COPY LSH SDEL,1 ;TWO WORDS PER SYMBOL ADDI SDEL,1 ;PLUS ONE FOR COUNT MOVNS SDEL ;NEGATE MOVE AC2,SDEL ;STORE IT ADD AC2,UNIPTR(RC) ;ADD SYMTOP HRLM AC2,UNIPTR(RC) ;TO FORM SYMBOL MOVSS UNIPTR(RC) ;NOW PUT IN CORRECT HALVES MOVN SDEL,AC1 ;GET NO. OF SYMBOLS HRLZ SDEL,SDEL ;TO FORM AOBJN POINTER HRR SDEL,AC2 ;POINT TO WHERE TO STORE THEM MOVEM AC1,(SDEL) ;STORE COUNT ADDI SDEL,1 ;AND GET PAST IT UNVRLO: PUSHJ PP,UNVREAD ;GET A SYMBOL MOVEM AC1,(SDEL) ;STORE IT ADDI SDEL,1 ;INCREMENT PAST IT PUSHJ PP,UNVREAD ;GET VALUE MOVEM AC1,(SDEL) ;STORE IT TLNE AC1,SPTR ;SPECIAL EXTERNAL POINTER? JRST UNVRSP ;YES TLNE AC1,EXTF ;EXTERNAL (NOT SPTR)? JRST UNVREX ;YES TLNE AC1,MACF ;MACRO? JRST UNVRMC ;YES TLNE AC1,PNTF ;36 BIT VALUE JRST UNVRPT ;YES UNVRNX: AOBJN SDEL,UNVRLO ;GET NEXT RELEASE UNV, MOVE RC,UNIVNO ;POINT TO LAST ENTRY MOVE AC1,UNITBL+1(RC) ;GET NAME INCASE IN UNIV NOW SKIPE UNIVSN ;ARE WE? MOVEM AC1,UNVDIR ;YES, RESET NAME OF OUTPUT FILE IFN POLISH,< PUSH PP,SGSBOT PUSH PP,SGSTOP PUSH PP,SGSCNT PUSH PP,SGNCUR > PUSH PP,SYMBOL PUSH PP,SYMTOP ;SAVE EXISTING VALUES PUSH PP,SRCHX MOVE AC1,UNIPTR(RC) ;GET SYMTOP,,SYMBOL HLRZM AC1,SYMTOP HLRZM AC1,FREE ;DON'T FORGET TO SET FREE BEYOND SYMTOP HRRZM AC1,SYMBOL HLRZ AC1,AC1 ;TOP LOCATION MOVEM AC1,UNITOP ;SAVE NEW TOP FOR UNIVERSALS CAMLE AC1,MACSIZ ;HAVE WE INCREASED? MOVEM AC1,MACSIZ ;YES, STOP ILL MEM REFS IFN POLISH,< SETZM SGNCUR MOVE AC0,@SYMBOL MOVEM AC0,SGSCNT > PUSHJ PP,SRCHI ;SETUP SEARCH POINTER MOVE AC1,SRCHX ;LOAD IT MOVEM AC1,UNISHX(RC) ;SAVE IT POP PP,SRCHX ;RESTORE POP PP,SYMTOP POP PP,SYMBOL IFN POLISH,< POP PP,SGNCUR POP PP,SGSCNT POP PP,SGSTOP POP PP,SGSBOT > JRST SERCH1 ;AND RETURN ;HERE FOR 36 BIT VALUE UNVRPT: PUSHJ PP,UNVREAD AOS AC2,FREE ;GET A FREE LOC SUBI AC2,1 MOVEM AC1,(AC2) ;STORE IT HRRM AC2,(SDEL) ;FIXUP SYMBOL POINTER JRST UNVRNX ;GET NEXT ;HERE FOR EXTERNAL (NOT SPTR) UNVREX: MOVEI AC2,2 ;NEED 2 LOCS ADDB AC2,FREE SUBI AC2,2 ;POINT TO START OF 2 WORDS PUSHJ PP,UNVREAD ;GET VALUE MOVEM AC1,0(AC2) ;MOST LIKELY 0 PUSHJ PP,UNVREAD ;GET NAME MOVEM AC1,1(AC2) HRRM AC2,(SDEL) ;POINT TO VALUE JRST UNVRNX ;GET NEXT ;HERE FOR SPECIAL EXTERNAL SYMBOL UNVRSP: MOVEI AC2,2 ;GET 2 LOCATIONS ADDB AC2,FREE ;FROM FREE CORE SUBI AC2,2 ;POINT TO START OF 2 WORDS PUSHJ PP,UNVREAD ;GET VALUE MOVEM AC1,(AC2) PUSHJ PP,UNVREAD ;GET RELOCATION HRRM AC2,(SDEL) ;STORE POINTER MOVEI RC,1(AC2) ;POINT TO RELOCATION WORD SETZM (RC) ;CLEAR RELOCATION MOVE AC2,AC1 ;STORE PREVIOUS RELOCATION TRNN AC2,-1 ;RIGHT HALF RELOCATION? JRST UNVRS2 ;NO HRR AC2,FREE ;POINT TO NEXT 2 WORD BLOCK HRRM AC2,(RC) ;POINT TO BLOCK (RELOCATION) UNVRS1: PUSHJ PP,UNVREAD ;GET VALUE MOVEM AC1,(AC2) PUSHJ PP,UNVREAD ;GET EXTERNAL SYMBOL MOVEM AC1,1(AC2) HRRI AC2,2(AC2) ;INCREMENT RIGHT HALF BY 2 WORDS USED HRRZM AC2,FREE ;INCREMENT FREE UNVRS2: TLZN AC2,-1 ;LEFT HALF RELOCATION? JRST UNVRNX ;NO, GET NEXT SYMBOL HRLM AC2,(RC) ;FIX LEFT RELOCATION JRST UNVRS1 ;AND FILL IN VALUE ;HERE FOR MACRO UNVRMC: MOVE AC2,FREE ;FREE LOC COUNTER HRRM AC2,(SDEL) ;IS WHERE MACRO STARTS MOVEM AC2,UNVDFA ;[334] SAVE STARTING ADDRESS OF MACRO PUSHJ PP,UNVRML ;[334] GO READ IN MACRO DEFINITION MOVE AC1,UNVDFA ;[334] GET STARTING ADDRESS BACK HLRZ AC2,1(AC1) ;[334] GET POINTER FOR ANY DEFAULTS JUMPE AC2,UNVRNX ;[334] NONE, GO DO NEXT SYMBOL SKIPE UNVER% ;[334] MAKE SURE WE WROTE THEM ON DISK JRST UNVRER ;[334] NO, TELL USER PUSH PP,SDEL ;[334] SAVE AOBJN POINTER MOVE AC2,FREE ;[334] GET NEXT FREE ADDRESS HRLM AC2,1(AC1) ;[334] POINT TO IT IN MACRO BODY PUSHJ PP,UNVREAD ;[334] GO READ COUNT OF DEFAULTS MOVN SDEL,AC1 ;[334] COPY COUNT TO AOBJN POINTER HRRI SDEL,(AC2) ;[334] SET AOBJN ADDRESS INTO SDEL HLRZ AC2,AC1 ;[334] GET COUNT-1 OF DEFAULTS ADDI AC2,2 ;[334] CHANGE TO COUNT+1 (+0 WORD) ADDB AC2,FREE ;[334] BUMP FREE BY DEFAULT POINTER BLOCK LENGTH UNVRM1: PUSHJ PP,UNVREAD ;[334] GO READ ARGUMENT NUMBER HRLM AC1,(SDEL) ;[334] SAVE IN POINTER BLOCK HRRM AC2,(SDEL) ;[334] SAVE START OF VALUE (MAY BE SET UP BY UNVRML) PUSHJ PP,UNVRML ;[334] GO COPY DEFAULT VALUE AOBJN SDEL,UNVRM1 ;[334] DO ALL DEFAULTS SETZM (SDEL) ;[334] CLEAR END OF BLOCK WORD POP PP,SDEL ;[334] RESTORE BIG AOBJN WORD JRST UNVRNX ;[334] GO DO NEXT SYMBOL UNVRML: QQ==0 REPEAT .LEAF,< PUSHJ PP,UNVREAD MOVEM AC1,QQ(AC2) ;STORE QQ==QQ+1> MOVE AC1,(AC2) ;SEE WHAT FIRST WORD WAS TLNN AC1,-1 ;IF ZERO THEN FINISHED JRST UNVRMF ;SET LAST BLOCK POINTER MOVEI AC1,.LEAF(AC2) ;POINT TO NEXT BLOCK HRLM AC1,(AC2) ;FILL IT IN ADDI AC2,.LEAF ;POINT TO IT JRST UNVRML ;AND LOOP UNVRMF: MOVE AC1,(SDEL) ;GET FIRST BLOCK HRRM AC2,(AC1) ;POINT TO LAST ADDI AC2,.LEAF ;POINT TO NEXT FREE MOVEM AC2,FREE POPJ PP, ;[334] RETURN UNVRER: MOVSI RC,[SIXBIT /OUF UNIVERSAL FILE DEFAULT ARGUMENTS LOST, REASSEMBLE@/];[334] JRST ERRFIN ;[334] PRINT THAT HAD DEFAULTS WHICH WERE LOST UNVREA: SOSG UNVBUF+2 PUSHJ PP,UNVRIN ILDB AC1,UNVBUF+1 POPJ PP, UNVRIN: IN UNV, POPJ PP, GETSTS UNV,C ;[403] GET STATUS BITS TRNN C,ERRBIT!2000 ;[403] ERRORS? JRST UNVRN1 ;[431] E-O-F MOVE AC0,UNVDEV ;[403] GET DEVICE JRST READ4 ;[403] GIVE I/O ERROR MESSAGE UNVRN1: MOVSI RC,[SIXBIT /ERU UNEXPECTED END-OF-FILE READING UNIVERSAL FILE@/] ;[431] NAME IN AC0 JRST ERRFIN ;[431] GIVE ERROR MESSAGE UNVUNV: MOVEM AC0,UNVDIR ;[240] RESTORE REAL NAME MOVSI AC1,'UNV' ;[240] AND DEFAULT EXT MOVEM AC1,UNVDIR+1 ;[240] SETZM UNVDIR+2 ;[240] SETZM UNVDIR+3 ;[240] DEFAULT PATH INIT UNV,B SIXBIT /UNV/ UNVBUF JRST UNVSYS LOOKUP UNV,UNVDIR JRST UNVSYS JRST UNVFND UNVSYS: INIT UNV,B SIXBIT /SYS/ UNVBUF JRST SCHERR LOOKUP UNV,UNVDIR ;SEE IF THERE JRST SCHERR ;NO JRST UNVFND ;GOT IT SUBTTL MACHINE INSTRUCTION SEARCH ROUTINES IFE OPHSH,< OPTSCH: MOVEI RC,0 MOVEI ARG,1B^L ;SET UP INDEX MOVEI V,1B^L/2 ;SET UP INCREMENT OPT1A: CAMN AC0,OP1TOP(ARG) ;ARE WE POINTING AT SYMBOL? JRST OPT1D ;YES, GET THE CODE JUMPE V,POPOUT ;TEST FOR END CAML AC0,OP1TOP(ARG) ;NO, SHOULD WE MOVE DOWN? TDOA ARG,V ;NO, INCREMENT OPT1B: SUB ARG,V ;YES, DECREMENT ASH V,-1 ;HALVE INCREMENT CAIG ARG,OP1END-OP1TOP ;ARE WE OUT OF BOUNDS? JRST OPT1A ;NO, TRY AGAIN JRST OPT1B ;YES, BRING IT DOWN A PEG > IFN OPHSH,< OPTSCH: MOVE ARG,AC0 ;GET SIXBIT NAME TLZ ARG,400000 ;CLEAR SIGN BIT IDIVI ARG,PRIME ;REM. GOES IN V CAMN AC0,OP1TOP(V) ;ARE WE POINTING AT SYMBOL? JRST OPT1D ;YES SKIPN OP1TOP(V) ;TEST FOR END JRST OPT1B ;SYMBOL NOT FOUND HLRZ RC,ARG ;SAVE LHS OF QUOTIENT SKIPA ARG,RC ;GET IT BACK OPT1A: ADDI ARG,(RC) ;INCREMENT ARG ADDI V,(ARG) ;QUADRATIC INCREASE TO V CAIL V,PRIME ;V IS MODULO PRIME JRST [SUBI V,PRIME JRST .-1] CAMN AC0,OP1TOP(V) ;IS THIS IT? JRST OPT1D ;YES SKIPE OP1TOP(V) ;END? JRST OPT1A ;TRY AGAIN OPT1B: SETZ RC, ;[134] CLEAR RELOCATION INCASE IMPLICIT OPDEF POPJ PP, ;FAILED > OPT1D: IFN OPHSH,< SETZ RC, ;CLEAR RELOCATION MOVE ARG,V ;GET INDEX IN RIGHT ACC.> IDIVI ARG,4 ;ARG HAS INDEX USED IN OPTTAB LDB V,OPTTAB(V) ;V HAS INDEX TO OPTTAB CAIL V,700 ;PSEUDO-OP OR IO INSTRUCTION? JRST OPT1G ;YES ROT V,-^D9 ;LEFT JUSTIFY HRRI V,OP ;POINT TO BASIC FORMAT OPT1F: AOS 0(PP) ;SET FOR SKIP EXIT MOVEI SDEL,%OP ;SET OP-CODE CROSS-REF FLAG JRST CREF ;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE OPT1G: JUMPG AC0,[CAME AC0,['.XCREF'] ;[141] DON'T CREF .XCREF JRST .+3 ;IF ".","$",OR "%" USE TABLE 1 MOVE V,OP1TAB-700(V) ;[217] USE TABLE 1 JRST CPOPJ1] ;[217] AND BYPASS CREF TLNN AC0,200000 ;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE SKIPA V,OP2TAB-700(V) ;2ND TABLE, FIRST LETTER IS "A" TO "O" MOVE V,OP1TAB-700(V) ;1ST TABLE, ..."P" TO "Z" JRST OPT1F ;EXIT OPTTAB: IFE OPHSH,< POINT 9,OP1COD-1(ARG),35> POINT 9,OP1COD (ARG), 8 POINT 9,OP1COD (ARG),17 POINT 9,OP1COD (ARG),26 IFN OPHSH,< POINT 9,OP1COD (ARG),35> .XCREF ;DON'T CREF THIS MESS IFE OPHSH,< RELOC .-1 OP1TOP: RELOC IF1, < N1=0 LSYM== SIXBIT /ADD/ DEFINE $FAIL(SYMBOL)< PRINTX ? SYMBOL -BAD OPCODE ORDER> DEFINE X (SYMBOL,CODE)< IFL ,< $FAIL(SYMBOL)> LSYM== N1=N1+1>> IF2, < N2=^D36 CC=0 RELOC OP1COD RELOC DEFINE X (SYMBOL,CODE) IFE N2, > DEFINE OUTLIT < RELOC +CC RELOC N2=^D36+>> SYN X,XX ;JUST THE SAME MACRO> IFN OPHSH,< DEFINE XX (SB,CD)<> ;A NUL MACRO OP1TOP: IF1,< BLOCK PRIME> IF1,> IF2,< DEFINE OPSTOR (RM)<.$'RM=.$'RM+>>> DEFINE X (SB,CD)< SXB= Q=SXB&-1_-1/PRIME R=SXB&-1_-1-Q*PRIME H=Q_-22&777 TRY=1 OPCODE=CD ITEM Q,\R IFL PRIME-TRY,> DEFINE ITEM (QT,RM)< IFN .%'RM, H=H+Q_-22&777 IFGE PRIME-,> IFE .%'RM,<.%'RM=SXB OPSTOR \>>> IF1,< DEFINE GETSYM (N)<.%'N=0> N=0 XLIST REPEAT PRIME, DEFINE GETSYM (N)<.$'N=0> N=0 REPEAT , > LIST> ;MACRO TO HANDLE KI10 OP-CODES IFE KI10,< DEFINE XK (SB,CD) <> ;NUL MACRO> IFN KI10, ; MACRO TO HANDLE KL10 OP-CODES IFE KL10,< DEFINE XKK (SB,CD) <> > IFN KL10, IFN OPHSH,< ;PUT THE MOST USED OP CODES FIRST X JRST , 254 X PUSHJ , 260 X POPJ , 263 X PUSH , 261 X POP , 262 X AOS , 350 X ASCIZ , 701 X CALLI , 047 X EXTERN, 724 X INTERN, 744 X JFCL , 255 X JSP , 265 X MOVE , 200 X MOVEI , 201 X MOVEM , 202 X SETZM , 402 X SIXBIT, 717 X SOS , 370 X TLNE , 603 X TLNN , 607 X TLO , 661 X TLZ , 621 X TLZA , 625 X TLZE , 623 X TLZN , 627 X TRNE , 602 X TRNN , 606 X TRZ , 620 > X ADD , 270 X ADDB , 273 X ADDI , 271 X ADDM , 272 XKK ADJBP , 133 XKK ADJSP , 105 X AND , 404 X ANDB , 407 X ANDCA , 410 X ANDCAB, 413 X ANDCAI, 411 X ANDCAM, 412 X ANDCB , 440 X ANDCBB, 443 X ANDCBI, 441 X ANDCBM, 442 X ANDCM , 420 X ANDCMB, 423 X ANDCMI, 421 X ANDCMM, 422 X ANDI , 405 X ANDM , 406 X AOBJN , 253 X AOBJP , 252 X AOJ , 340 X AOJA , 344 X AOJE , 342 X AOJG , 347 X AOJGE , 345 X AOJL , 341 X AOJLE , 343 X AOJN , 346 XX AOS , 350 X AOSA , 354 X AOSE , 352 X AOSG , 357 X AOSGE , 355 X AOSL , 351 X AOSLE , 353 X AOSN , 356 X ARG , 320 X ARRAY , 771 IFN IIISW, X ASCII , 700 XX ASCIZ , 701 X ASH , 240 X ASHC , 244 X ASUPPR, 705 X BLKI , 702 X BLKO , 703 X BLOCK , 704 X BLT , 251 X BYTE , 707 XX CAI , 300 X CAIA , 304 X CAIE , 302 X CAIG , 307 X CAIGE , 305 X CAIL , 301 X CAILE , 303 X CAIN , 306 X CALL , 040 XX CALLI , 047 XX CAM , 310 X CAMA , 314 X CAME , 312 X CAMG , 317 X CAMGE , 315 X CAML , 311 X CAMLE , 313 X CAMN , 316 XX CLEAR , 400 XX CLEARB, 403 XX CLEARI, 401 XX CLEARM, 402 X CLOSE , 070 XKK CMPSE , 002 XKK CMPSG , 007 XKK CMPSGE, 005 XKK CMPSL , 001 XKK CMPSLE, 003 XKK CMPSN , 006 X COMMEN, 770 X CONI , 710 X CONO , 711 IFN STANSW, X CONSO , 712 X CONSZ , 713 XKK CVTBDO, 012 XKK CVTBDT, 013 XKK CVTDBO, 010 XKK CVTDBT, 011 XKK DADD , 114 XX DATA. , 020 X DATAI , 714 X DATAO , 715 XKK DDIV , 117 X DEC , 716 X DEFINE, 717 X DEPHAS, 720 XK DFAD , 110 XK DFDV , 113 XK DFMP , 112 X DFN , 131 XK DFSB , 111 X DIV , 234 X DIVB , 237 X DIVI , 235 X DIVM , 236 XK DMOVE , 120 XK DMOVEM, 124 XK DMOVN , 121 XK DMOVNM, 125 XKK DMUL , 116 X DPB , 137 XKK DSUB , 115 XKK EBLT , 020 XKK EDIT , 004 X END , 721 X ENTER , 077 X ENTRY , 722 X EQV , 444 X EQVB , 447 X EQVI , 445 X EQVM , 446 X EXCH , 250 X EXP , 723 XKK EXTEND, 123 XX EXTERN, 724 X FAD , 140 X FADB , 143 X FADL , 141 X FADM , 142 X FADR , 144 X FADRB , 147 X FADRI , 145 X FADRM , 146 X FDV , 170 X FDVB , 173 X FDVL , 171 X FDVM , 172 X FDVR , 174 X FDVRB , 177 X FDVRI , 175 X FDVRM , 176 XX FIN. , 021 IFN STANSW, IFE STANSW, XK FIXR , 126 XK FLTR , 127 X FMP , 160 X FMPB , 163 X FMPL , 161 X FMPM , 162 X FMPR , 164 X FMPRB , 167 X FMPRI , 165 X FMPRM , 166 X FSB , 150 X FSBB , 153 X FSBL , 151 X FSBM , 152 X FSBR , 154 X FSBRB , 157 X FSBRI , 155 X FSBRM , 156 X FSC , 132 X GETSTS, 062 X HALT , 725 X HISEG , 706 X HLL , 500 X HLLE , 530 X HLLEI , 531 X HLLEM , 532 X HLLES , 533 X HLLI , 501 X HLLM , 502 X HLLO , 520 X HLLOI , 521 X HLLOM , 522 X HLLOS , 523 X HLLS , 503 X HLLZ , 510 X HLLZI , 511 X HLLZM , 512 X HLLZS , 513 X HLR , 544 X HLRE , 574 X HLREI , 575 X HLREM , 576 X HLRES , 577 X HLRI , 545 X HLRM , 546 X HLRO , 564 X HLROI , 565 X HLROM , 566 X HLROS , 567 X HLRS , 547 X HLRZ , 554 X HLRZI , 555 X HLRZM , 556 X HLRZS , 557 X HRL , 504 X HRLE , 534 X HRLEI , 535 X HRLEM , 536 X HRLES , 537 X HRLI , 505 X HRLM , 506 X HRLO , 524 X HRLOI , 525 X HRLOM , 526 X HRLOS , 527 X HRLS , 507 X HRLZ , 514 X HRLZI , 515 X HRLZM , 516 X HRLZS , 517 X HRR , 540 X HRRE , 570 X HRREI , 571 X HRREM , 572 X HRRES , 573 X HRRI , 541 X HRRM , 542 X HRRO , 560 X HRROI , 561 X HRROM , 562 X HRROS , 563 X HRRS , 543 X HRRZ , 550 X HRRZI , 551 X HRRZM , 552 X HRRZS , 553 X IBP , 133 X IDIV , 230 X IDIVB , 233 X IDIVI , 231 X IDIVM , 232 X IDPB , 136 X IF1 , 726 X IF2 , 727 X IFB , 730 X IFDEF , 731 X IFDIF , 732 X IFE , 733 X IFG , 734 X IFGE , 735 X IFIDN , 736 X IFL , 737 X IFLE , 740 X IFN , 741 X IFNB , 742 X IFNDEF, 743 X ILDB , 134 X IMUL , 220 X IMULB , 223 X IMULI , 221 X IMULM , 222 X IN , 056 XX IN. , 016 X INBUF , 064 XX INF. , 026 X INIT , 041 X INPUT , 066 X INTEGE, 772 XX INTERN, 744 X IOR , 434 X IORB , 437 X IORI , 435 X IORM , 436 X IOWD , 745 X IRP , 746 X IRPC , 747 X JCRY , 750 X JCRY0 , 751 X JCRY1 , 752 X JEN , 753 XX JFCL , 255 X JFFO , 243 X JFOV , 765 X JOV , 754 X JRA , 267 XX JRST , 254 X JRSTF , 755 X JSA , 266 XX JSP , 265 X JSR , 264 X JSYS , 104 XX JUMP , 320 XX JUMPA , 324 X JUMPE , 322 X JUMPG , 327 X JUMPGE, 325 X JUMPL , 321 X JUMPLE, 323 X JUMPN , 326 X LALL , 756 X LDB , 135 X LIST , 757 X LIT , 760 X LOC , 761 X LOOKUP, 076 X LSH , 242 X LSHC , 246 XK MAP , 257 X MLOFF , 767 X MLON , 766 XX MOVE , 200 XX MOVEI , 201 XX MOVEM , 202 X MOVES , 203 X MOVM , 214 X MOVMI , 215 X MOVMM , 216 X MOVMS , 217 X MOVN , 210 X MOVNI , 211 X MOVNM , 212 X MOVNS , 213 X MOVS , 204 X MOVSI , 205 XKK MOVSLJ, 016 X MOVSM , 206 XKK MOVSO , 014 XKK MOVSRJ, 017 X MOVSS , 207 XKK MOVST , 015 X MTAPE , 072 XX MTOP. , 024 X MUL , 224 X MULB , 227 X MULI , 225 X MULM , 226 XX NLI. , 031 XX NLO. , 032 X NOSYM , 762 X OCT , 763 X OPDEF , 764 X OPEN , 050 X OR , 434 X ORB , 437 X ORCA , 454 X ORCAB , 457 X ORCAI , 455 X ORCAM , 456 X ORCB , 470 X ORCBB , 473 X ORCBI , 471 X ORCBM , 472 X ORCM , 464 X ORCMB , 467 X ORCMI , 465 X ORCMM , 466 X ORI , 435 X ORM , 436 X OUT , 057 XX OUT. , 017 X OUTBUF, 065 XX OUTF. , 027 X OUTPUT, 067 X PAGE , 700 X PASS2 , 701 X PHASE , 702 X POINT , 703 XX POP , 262 XX POPJ , 263 X PORTAL, 757 X PRGEND, 714 X PRINTX, 704 X PURGE , 705 XX PUSH , 261 XX PUSHJ , 260 X RADIX , 706 X RADIX5, 707 X RELEAS, 071 X RELOC , 710 X REMARK, 711 X RENAME, 055 X REPEAT, 712 XX RESET., 015 X RIM , 715 X RIM10 , 735 X RIM10B, 736 X ROT , 241 X ROTC , 245 X RSW , 716 XX RTB. , 022 X SALL , 720 X SEARCH, 721 X SETA , 424 X SETAB , 427 X SETAI , 425 X SETAM , 426 X SETCA , 450 X SETCAB, 453 X SETCAI, 451 X SETCAM, 452 X SETCM , 460 X SETCMB, 463 X SETCMI, 461 X SETCMM, 462 X SETM , 414 X SETMB , 417 X SETMI , 415 X SETMM , 416 X SETO , 474 X SETOB , 477 X SETOI , 475 X SETOM , 476 X SETSTS, 060 X SETZ , 400 X SETZB , 403 X SETZI , 401 XX SETZM , 402 XX SIXBIT, 717 XX SKIP , 330 X SKIPA , 334 X SKIPE , 332 X SKIPG , 337 X SKIPGE, 335 X SKIPL , 331 X SKIPLE, 333 X SKIPN , 336 XX SLIST., 025 X SOJ , 360 X SOJA , 364 X SOJE , 362 X SOJG , 367 X SOJGE , 365 X SOJL , 361 X SOJLE , 363 X SOJN , 366 XX SOS , 370 X SOSA , 374 X SOSE , 372 X SOSG , 377 X SOSGE , 375 X SOSL , 371 X SOSLE , 373 X SOSN , 376 IFN STANSW, X SQUOZE, 707 X STATO , 061 X STATUS, 062 X STATZ , 063 X STOPI , 722 X SUB , 274 X SUBB , 277 X SUBI , 275 X SUBM , 276 IF2,> X SUBTTL, 723 X SUPPRE, 713 X SYN , 724 X TAPE , 725 X TDC , 650 X TDCA , 654 X TDCE , 652 X TDCN , 656 X TDN , 610 X TDNA , 614 X TDNE , 612 X TDNN , 616 X TDO , 670 X TDOA , 674 X TDOE , 672 X TDON , 676 X TDZ , 630 X TDZA , 634 X TDZE , 632 X TDZN , 636 X TITLE , 726 X TLC , 641 X TLCA , 645 X TLCE , 643 X TLCN , 647 X TLN , 601 X TLNA , 605 XX TLNE , 603 XX TLNN , 607 XX TLO , 661 X TLOA , 665 X TLOE , 663 X TLON , 667 XX TLZ , 621 XX TLZA , 625 XX TLZE , 623 XX TLZN , 627 X TRC , 640 X TRCA , 644 X TRCE , 642 X TRCN , 646 X TRN , 600 X TRNA , 604 XX TRNE , 602 XX TRNN , 606 X TRO , 660 X TROA , 664 X TROE , 662 X TRON , 666 XX TRZ , 620 X TRZA , 624 X TRZE , 622 X TRZN , 626 X TSC , 651 X TSCA , 655 X TSCE , 653 X TSCN , 657 X TSN , 611 X TSNA , 615 X TSNE , 613 X TSNN , 617 X TSO , 671 X TSOA , 675 X TSOE , 673 X TSON , 677 X TSZ , 631 X TSZA , 635 X TSZE , 633 X TSZN , 637 X TTCALL, 051 X TWOSEG, 731 X UFA , 130 X UGETF , 073 X UJEN , 100 IFN TENEX,< X UMOVE , 100 X UMOVEI, 101 X UMOVEM, 102 X UMOVES, 103 > X UNIVER, 737 X USETI , 074 X USETO , 075 X VAR , 727 XX WTB. , 023 X XALL , 732 X XCT , 256 X XLIST , 733 X XOR , 430 X XORB , 433 X XORI , 431 X XORM , 432 X XPUNGE, 730 X XWD , 734 X Z , 000 IFN FT.U01,< IFN POLISH,<$BEG==762> IFE POLISH,<$BEG==760> X $POP , $BEG X $PUSH , <$BEG+1> >;END IFN FT.U01 X .ASSIG, 751 X .COMMO, 747 X .CREF , 740 X .DIREC, 750 IFN POLISH,< X .ENDPS, 761 > X .HWFRM, 742 X .IF , 756 X .LINK , 753 X .LNKEN, 754 X .MFRMT, 743 X .NODDT, 746 X .ORG , 752 IFN POLISH,< X .PSECT, 760 > X .REQUE, 744 X .REQUI, 745 X .TEXT , 755 X .XCREF, 741 IFN OPHSH,< ;NO-OPS, OLD MNEMONICS,F4 UUOS X CAI , 300 X CAM , 310 X CLEAR , 400 X CLEARB, 403 X CLEARI, 401 X CLEARM, 402 X JUMP , 320 X JUMPA , 324 X SKIP , 330 X RESET., 015 X IN. , 016 X OUT. , 017 X DATA. , 020 X FIN. , 021 X RTB. , 022 X WTB. , 023 X MTOP. , 024 X SLIST., 025 X INF. , 026 X OUTF. , 027 X NLI. , 031 X NLO. , 032 > IFE OPHSH,< IF1, < BLOCK N1> OP1END: -1B36 OP1COD: BLOCK N1/4 CC IF2,< PURGE N1,N2> > IFN OPHSH,< IF2,< DEFINE SETVAL (N) N=0 XLIST REPEAT PRIME, LIST > OP1COD: IF1,< BLOCK > IF2,< DEFINE SETVAL (N) N=0 XLIST REPEAT , > LIST> .CREF ;START CREFFING AGAIN SUBTTL PERMANENT SYMBOLS SYMNUM: EXP LENGTH/2 ;NUMBER OF PERMANENT SYMBOLS DEFINE P (A,B)< XLIST SIXBIT /A/ XWD SYMF!NOOUTF,B LIST> P @, 0(SUPRBT) P ??????, 0(SUPRBT) LENGTH= .-SYMNUM-1 ;LENGTH OF INITIAL SYMBOLS PRMTBL: ;PERMANENT SYMBOLS P ADC, 24 P ADC2, 30 P APR, 0 P CCI, 14 P CDP, 110 P CDR, 114 P CLK, 70 P CLK2, 74 P CPA, 0 P CR, 150 P CR2, 154 P DC, 200 P DC2, 204 P DCSA, 300 P DCSB, 304 P DDC, 270 P DDC2, 274 P DF, 270 P DIS, 130 P DIS2, 134 P DLB, 60 P DLB2, 160 P DLC, 64 P DLC2, 164 P DLS, 240 P DLS2, 244 P DPC, 250 P DPC2, 254 P DPC3, 260 P DPC4, 264 P DSI, 464 P DSI2, 474 P DSK, 170 P DSK2, 174 P DSS, 460 P DSS2, 470 P DTC, 320 P DTC2, 330 P DTS, 324 P DTS2, 334 P LPT, 124 P LPT2, 234 P MDF, 260 P MDF2, 264 P MTC, 220 P MTM, 230 P MTS, 224 P PAG, 10 P PI, 4 P PLT, 140 P PLT2, 144 P PTP, 100 P PTR, 104 P TMC, 340 P TMC2, 350 P TMS, 344 P TMS2, 354 P TTY, 120 P UTC, 210 P UTS, 214 IFE LNSSW,< XLIST > IFN LNSSW,< ;SPECIAL DEVICES FOR PEPR P .A,550 P .AB,434 P .ANG,440 P .B,554 P .BITE,470 P .FA,564 P .GAIN,520 P .GATE,444 P .IA,560 P .INC,514 P .LC,474 P .LG,570 P .PEPR,400 P .RG,574 P .SCON,430 P .STAT,410 P .TC,500 P .TED,540 P .THR,544 P .TRK,404 P .VIEW,524> LIST PRMEND: ;END OF PERMANENT SYMBOLS OPDEF ZL [Z LITF] ;INVALID IN LITERALS OPDEF ZA [Z ADDF] ;INVALID IN ADDRESSES OPDEF ZAL [Z ADDF!LITF] OP1TAB: ZA PAGE0 ;PAGE ZAL PASS20 ;PASS2 ZAL PHASE0 ;PHASE Z POINT0 ;POINT ZA PRNTX0 ;PRINTX ZA PURGE0 ;PURGE ZA RADIX0 ;RADIX Z RADX50 ;RADIX50,SQUOZE ZAL %ORG (1) ;RELOC ZAL REMAR0 ;REMARK ZA REPEA0 ;REPEAT ZA SUPRE0 ;SUPRESS ZAL PSEND0 ;PRGEND ZAL RIM0 (RIMSW) ;RIM DATAI 0,IOP ;RSW Z ASCII0 (1) ;SIXBIT ZAL IOSET (IOPALL!IOSALL) ;SALL ZAL SERCH0 ;SEARCH ZA STOPI0 ;STOPI ZA SUBTT0 (Z (POINT 7,,)) ;SUBTTL ZA SYN0 ;SYN ZAL TAPE0 ;TAPE ZA TITLE0 (Z (POINT 7,,)) ;TITLE ZAL VAR0 ;VAR Z XPUNG0 ;XPUNGE ZAL TWSEG0 ;TWOSEGMENTS ZAL XALL0 (IOPALL) ;XALL ZAL XALL0 (IOPROG) ;XLIST Z XWD0 ;XWD ZAL RIM0 (RIM1SW) ;RIM10 ZAL RIM0 (R1BSW) ;RIM10B ZA UNIV0 (Z (POINT 7,,)) ;UNIVERSAL ZAL ONCRF (IONCRF) ;.CREF ZAL OFFCRF (IONCRF) ;.XCREF ZA OFFORM ;.HWFRMT ZA ONFORM ;.MFRMT ZAL REQUEST ;.REQUEST ZAL REQUIRE ;.REQUIRE ZA NODDT0 ;.NODDT ZAL COMM0 ;.COMMON ZAL %DIREC ;.DIRECTIVE ZA ASGN ;.ASSIGN ZAL %ORG (1B18) ;.ORG ZAL %LINK (0) ;.LINK ZAL %LINK (1B18) ;.LNKEND Z %TEXT0 (1B18+1B21) ;.TEXT Z %IF ;.IF JRST 1,OP ;[342] PORTAL IFN POLISH,< ZA %SEGME ;.PSECT ZA %ENDSE ;.ENDPS > IFN FT.U01,< POP $PDUSR ;$POP PUSH $PDUSR ;$PUSH >;END IFN FT.U01 OP2TAB: Z ASCII0 (0) ;ASCII Z ASCII0 (1B18) ;ASCIZ BLKI IOP ;BLKI BLKO IOP ;BLKO ZAL BLOCK0 ;BLOCK ZA SUPRSA ;ASUPPRESS ZAL HISEG0 ;HISEG Z BYTE0 ;BYTE CONI IOP ;CONI CONO IOP ;CONO CONSO IOP ;CONSO CONSZ IOP ;CONSZ DATAI IOP ;DATAI DATAO IOP ;DATAO Z OCT0 (^D10) ;DEC ZA DEFIN0 ;DEFINE ZAL DEPHA0 ;DEPHASE ZAL END0 ;END ZA INTER0 (INTF!ENTF) ;ENTRY Z EXPRES ;EXP ZA EXTER0 ;EXTERN JRST 4,OP ;HALT TLNN FR,IFPASS ;IF1 TLNE FR,IFPASS ;IF2 TRNE AC0,IFB0 ;IFB TLNE ARG,IFDEF0 ;IFDEF Z IFIDN0 (0) ;IFDIF SKIPE IF ;IFE SKIPG IF ;IFG SKIPGE IF ;IFGE Z IFIDN0 (1) ;IFIDN SKIPL IF ;IFL SKIPLE IF ;IFLE SKIPN IF ;IFN TRNN AC0,IFB0 ;IFNB TLNN ARG,IFDEF0 ;IFNDEF ZA INTER0 (INTF) ;INTERN Z IOWD0 ;IOWD Z IRP0 (0) ;IRP Z IRP0 (400000) ;IRPC JFCL 6,OP ;JCRY JFCL 4,OP ;JCRY0 JFCL 2,OP ;JCRY1 JRST 12,OP ;JEN JFCL 10,OP ;JOV JRST 2,OP ;JRSTF ZAL IOLSET (IOPALL!IOSALL) ;[327] LALL, SEE ***** AT IOLSE1+1 IF CHANGED ZAL IORSET (IOPROG) ;LIST ZAL LIT0 ;LIT ZAL %ORG (0) ;LOC ZA OFFSYM ;NOSYM Z OCT0 (^D8) ;OCT ZA OPDEF0 ;OPDEF JFCL 1,OP ;JFOV ZA ONML ;MLON ZA OFFML ;MLOFF Z ASCII0 (3B19) ;COMMENT ZAL %ARAY ;ARRAY ZAL %INTEG ;INTEGER ZAL %LINK (0) ;LINK ZAL %LINK (1B18) ;LNKEND ZAL %ORG (1B18) ;ORG ZA ASGN ;ASSIGN IFN IIISW,< Z ASCII0 (5B20) ;ASCID> CALTBL: ;USER DEFINED CALLI'S GO HERE SIXBIT /LIGHTS/ ;-1 CALLI0: SIXBIT /RESET/ ; 0 SIXBIT /DDTIN/ ; 1 SIXBIT /SETDDT/ ; 2 SIXBIT /DDTOUT/ ; 3 SIXBIT /DEVCHR/ ; 4 SIXBIT /DDTGT/ ; 5 SIXBIT /GETCHR/ ; 6 SIXBIT /DDTRL/ ; 7 SIXBIT /WAIT/ ;10 SIXBIT /CORE/ ;11 SIXBIT /EXIT/ ;12 SIXBIT /UTPCLR/ ;13 SIXBIT /DATE/ ;14 SIXBIT /LOGIN/ ;15 SIXBIT /APRENB/ ;16 SIXBIT /LOGOUT/ ;17 SIXBIT /SWITCH/ ;20 SIXBIT /REASSI/ ;21 SIXBIT /TIMER/ ;22 SIXBIT /MSTIME/ ;23 SIXBIT /GETPPN/ ;24 SIXBIT /TRPSET/ ;25 SIXBIT /TRPJEN/ ;26 SIXBIT /RUNTIM/ ;27 SIXBIT /PJOB/ ;30 SIXBIT /SLEEP/ ;31 SIXBIT /SETPOV/ ;32 SIXBIT /PEEK/ ;33 SIXBIT /GETLIN/ ;34 SIXBIT /RUN/ ;35 SIXBIT /SETUWP/ ;36 SIXBIT /REMAP/ ;37 SIXBIT /GETSEG/ ;40 SIXBIT /GETTAB/ ;41 SIXBIT /SPY/ ;42 SIXBIT /SETNAM/ ;43 SIXBIT /TMPCOR/ ;44 SIXBIT /DSKCHR/ ;45 SIXBIT /SYSSTR/ ;46 SIXBIT /JOBSTR/ ;47 SIXBIT /STRUUO/ ;50 SIXBIT /SYSPHY/ ;51 SIXBIT /FRECHN/ ;52 SIXBIT /DEVTYP/ ;53 SIXBIT /DEVSTS/ ;54 SIXBIT /DEVPPN/ ;55 SIXBIT /SEEK/ ;56 SIXBIT /RTTRP/ ;57 SIXBIT /LOCK/ ;60 SIXBIT /JOBSTS/ ;61 SIXBIT /LOCATE/ ;62 SIXBIT /WHERE/ ;63 SIXBIT /DEVNAM/ ;64 SIXBIT /CTLJOB/ ;65 SIXBIT /GOBSTR/ ;66 0 ;67 0 ;70 SIXBIT /HPQ/ ;71 SIXBIT /HIBER/ ;72 SIXBIT /WAKE/ ;73 SIXBIT /CHGPPN/ ;74 SIXBIT /SETUUO/ ;75 SIXBIT /DEVGEN/ ;76 SIXBIT /OTHUSR/ ;77 SIXBIT /CHKACC/ ;100 SIXBIT /DEVSIZ/ ;101 SIXBIT /DAEMON/ ;102 SIXBIT /JOBPEK/ ;103 SIXBIT /ATTACH/ ;104 SIXBIT /DAEFIN/ ;105 SIXBIT /FRCUUO/ ;106 SIXBIT /DEVLNM/ ;107 SIXBIT /PATH./ ;110 SIXBIT /METER./ ;111 SIXBIT /MTCHR./ ;112 SIXBIT /JBSET./ ;113 SIXBIT /POKE./ ;114 SIXBIT /TRMNO./ ;115 SIXBIT /TRMOP./ ;116 SIXBIT /RESDV./ ;117 SIXBIT /UNLOK./ ;120 SIXBIT /DISK./ ;121 SIXBIT /DVRST./ ;122 SIXBIT /DVURS./ ;123 SIXBIT /XTTSK./ ;124 SIXBIT /CAL11./ ;125 SIXBIT /MTAID./ ;126 SIXBIT /IONDX./ ;127 SIXBIT /CNECT./ ;130 SIXBIT /MVHDR./ ;131 SIXBIT /ERLST./ ;132 SIXBIT /SENSE./ ;133 SIXBIT /CLRST./ ;134 SIXBIT /PIINI./ ;135 SIXBIT /PISYS./ ;136 SIXBIT /DEBRK./ ;137 SIXBIT /PISAV./ ;140 SIXBIT /PIRST./ ;141 SIXBIT /IPCFR./ ;142 SIXBIT /IPCFS./ ;143 SIXBIT /IPCFQ./ ;144 SIXBIT /PAGE./ ;145 SIXBIT /SUSET./ ;146 SIXBIT /COMPT./ ;147 SIXBIT /SCHED./ ;150 SIXBIT /ENQ./ ;151 SIXBIT /DEQ./ ;152 SIXBIT /ENQC./ ;153 SIXBIT /TAPOP./ ;154 SIXBIT /FILOP./ ;155 SIXBIT /CAL78./ ;156 SIXBIT /NODE./ ;157 SIXBIT /ERRPT./ ;160 SIXBIT /ALLOC./ ;161 SIXBIT /PERF./ ;162 CALNTH==.-CALTBL NEGCAL==CALLI0-CALTBL ;NUMBER OF NEGATIVE CALLI'S TTCTBL: SIXBIT /INCHRW/ ; 0 INPUT A CHAR. AND WAIT SIXBIT /OUTCHR/ ; 1 OUTPUT A CHAR. SIXBIT /INCHRS/ ; 2 INPUT A CHAR. AND SKIP SIXBIT /OUTSTR/ ; 3 OUTPUT A STRING SIXBIT /INCHWL/ ; 4 INPUT CHAR., WAIT, LINE MODE SIXBIT /INCHSL/ ; 5 INPUT CHAR., SKIP, LINE MODE SIXBIT /GETLCH/ ; 6 GET LINE CHARACTERISTICS SIXBIT /SETLCH/ ; 7 SET LINE CHARACTERISTICS SIXBIT /RESCAN/ ;10 RESET INPUT STREAM TO COMMAND SIXBIT /CLRBFI/ ;11 CLEAR TYPEIN BUFFER SIXBIT /CLRBFO/ ;12 CLEAR TYPEOUT BUFFER SIXBIT /SKPINC/ ;13 SKIPS IF A CHAR. CAN BE INPUT SIXBIT /SKPINL/ ;14 SKIPS IF A LINE CAN BE INPUT SIXBIT /IONEOU/ ;15 OUTPUT AS AN IMAGE CHAR. TTCLTH==.-TTCTBL MTATBL: SIXBIT /MTWAT./ ; 0 SIXBIT /MTREW./ ; 1 SIXBIT /MTEOF./ ; 3 SIXBIT /MTSKR./ ; 6 SIXBIT /MTBSR./ ; 7 SIXBIT /MTEOT./ ; 10 SIXBIT /MTUNL./ ; 11 SIXBIT /MTBLK./ ; 13 SIXBIT /MTSKF./ ; 16 SIXBIT /MTBSF./ ; 17 SIXBIT /MTDEC./ ;100 SIXBIT /MTIND./ ;101 MTALTH==.-MTATBL MTACOD: BYTE (9) 0,1,3,6 BYTE (9) 7,10,11,13 BYTE (9) 16,17,100,101 SUBTTL USER-DEFINED SYMBOL SEARCH ROUTINES MSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH POPJ PP, ;NOT FOUND, EXIT JUMPG ARG,MSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND CAME AC0,1(SX) ;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE POPJ PP, ;NO, EXIT ADDI SX,2 ;YES, POINT TO IT ;**;[440] DELETE 1 INSTR @MSRCH+6 JBC 3-SEP-76 ;** SETZM EXTPNT ;[324] RESET EXTERNAL POINTERS WORD PUSHJ PP,SRCH5 ;LOAD REGISTERS MSRCH2: AOSA 0(PP) ;SET SKIP-EXIT QSRCH: JUMPL ARG,SSRCH3 ;BRANCH IF OPERAND MOVEI SDEL,%MAC ;SET OPERATOR FLAG TLZE IO,DEFCRS ;IS IT A DEFINITION? MOVEI SDEL,%DMAC ;YES JRST CREF ;CROSS-REF AND EXIT SSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH POPJ PP, ;NOT FOUND, EXIT JUMPL ARG,SSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND SSRCH1: CAME AC0,-3(SX) ;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW POPJ PP, ;NO DICE, EXIT SUBI SX,2 ;YES, POINT TO IT ;**;[440] INSERT 1 INSTR @SSRCH1+3 JBC 3-SEP-76 TLNE ARG,OPDF ;[440] IF IN OPDEF SETZM EXTPNT ;[324] RESET EXTERNAL POINTERS WORD PUSHJ PP,SRCH5 ;LOAD REGISTERS SSRCH2: AOS 0(PP) ;SET FOR SKIP-EXIT SSRCH3: MOVEI SDEL,%SYM ;SET OPERAND FLAG CREF: TLNE ARG,NCRF ;[220] .XCREF SEEN? JRST [TLZ IO,DEFCRS ;[220] CLEAR DEFINITION FLAG POPJ PP,] ;[220] AND DON'T CREF TLNN IO,IONCRF ;NO CREFFING FOR THIS SYMBOL? TLNE FR,P1!CREFSW ;PASS ONE OR CROSS-REF SUPPRESSION? POPJ PP, ;YES, EXIT EXCH SDEL,C ;PUT FLAG IN C, SACE C PUSH PP,CS TLNE IO,IOCREF ;HAVE WE PUT OUT THE 177,102 JRST CREF3 ;YES PUSH PP,C ;START OF CREF DATA REPEAT 0,< ;NEEDS CHANGE TO CREF MOVEI C,177 PUSHJ PP,OUTLST MOVEI C,102 PUSHJ PP,OUTLST TLO IO,IOCREF ;WE NOW ARE IN THAT STATE POP PP,C ;WE HAVE NOW CREF3: JUMPE C,NOFLG ;JUST CLOSE IT PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM) MOVSI CS,770000 ;COUNT CHRS TDZA C,C ;STARTING AT 0 LSH CS,-6 ;TRY NEXT TDNE AC0,CS ;IS THAT ONE THERE? AOJA C,.-2 ;YES PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS MOVE CS,AC0 CREF2: MOVEI C,0 LSHC C,6 ADDI C,40 PUSHJ PP,OUTLST ;THE ASCII SYMBOL JUMPN CS,CREF2 MOVEI C,%DSYM TLZE IO,DEFCRS PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE NOFLG: MOVE C,SDEL POP PP,CS POPJ PP, CLSCRF: TRNN ER,LPTSW POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING CLSCR2: MOVEI C,177 PUSHJ PP,PRINT TLZE IO,IOCREF ;WAS IT OPEN? JRST CLSCR1 ;YES, JUST CLOSE IT MOVEI C,102 ;NO, OPEN IT FIRST PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA MOVEI C,177 PUSHJ PP,OUTLST CLSCR1: MOVEI C,103 JRST OUTLST ;MARK END OF CREF DATA CLSC3: TLZ IO,IOCREF MOVEI C,177 PUSHJ PP,OUTLST MOVEI C,104 JRST OUTLST ;177,104 CLOSES IT FOR NOW > ;END OF REPEAT 0 REPEAT 1,< ;WORKS WITH EXISTING CREF TLNE IO,IOPAGE PUSHJ PP,CRFHDR ;GET CORRECT SUBTTL MOVEI C,177 PUSHJ PP,OUTLST MOVEI C,102 PUSHJ PP,OUTLST TLO IO,IOCREF ;WE NOW ARE IN THAT STATE POP PP,C ;WE HAVE NOW CREF3: PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM) MOVSI CS,770000 ;COUNT CHRS TDZA C,C ;STARTING AT 0 LSH CS,-6 ;TRY NEXT TDNE AC0,CS ;IS THAT ONE THERE? AOJA C,.-2 ;YES PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS MOVE CS,AC0 CREF2: MOVEI C,0 LSHC C,6 ADDI C,40 PUSHJ PP,OUTLST ;THE ASCII SYMBOL JUMPN CS,CREF2 MOVEI C,%DSYM TLZE IO,DEFCRS PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE MOVE C,SDEL POP PP,CS POPJ PP, IFN OPHSH,< SUBTL: SIXBIT /SUBTTL/> CRFHDR: CAME AC0,SUBTL ;IS FIRST SYMBOL "SUBTTL" JRST CRFHD1 ;NO HLLZ AC0,V PUSHJ PP,SUBTT0 ;UPDATE SUBTTL MOVE AC0,SUBTL ;RESTORE ARG. MOVEI V,CPOPJ CRFHD1: MOVEI C,0 JRST OUTL CLSC3: CLSCRF: TRNN ER,LPTSW POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING CLSCR2: TLZE IO,IOCREF ;FINISH UP LINE JRST CLSCR1 MOVEI C,0 TLNE IO,IOPAGE ;NEW PAGE? PUSHJ PP,OUTL ;YES,GIVE IT A ROUSING SENDOFF! MOVEI C,177 PUSHJ PP,OUTLST MOVEI C,102 PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA CLSCR1: TRNN ER,ERRORS ;ANY ERRORS TO CREF JRST CLSCR6 ;NO, JUST CLOSE OUT MOVE C,[POINT 6,[SIXBIT /QXADLRUVNOPEMS/]] PUSH PP,ER ;SAVE ANDI ER,ERRORS ;ONLY LOOK AT THESE HRLZ ER,ER ;PUT FLAGS IN LEFT HALF CLSCR4: ILDB CS,C ;GET NEXT ERROR CODE LSH ER,1 ;SHIFT FLAG IN JUMPE ER,CLSCR5 ;FINISHED JUMPG ER,CLSCR4 ;NOT YET PUSH PP,C ;SAVE BYTE POINTER TDO CS,['%.... '] ;MAGIC SYMBOL MOVEI C,%ERR ;TYPE PUSHJ PP,OUTLST MOVEI C,6 ;NO OF CHARS. PUSHJ PP,OUTLST SETZ C, ;CLEAR RECEIVING ACC LSHC C,6 ;SHIFT IN CHAR ADDI C,40 ;TO ASCII PUSHJ PP,OUTLST JUMPN CS,.-4 ;MORE TO DO POP PP,C ;BYTE POINTER BACK JUMPN ER,CLSCR4 ;GET NEXT CLSCR5: POP PP,ER ;RESTORE ER CLSCR6: MOVEI C,177 PUSHJ PP,OUTLST MOVEI C,103 JRST OUTLST ;MARK END OF CREF DATA > ;END OF REPEAT 1 IFE POLISH,< SEARCH: HLRZ SX,SRCHX HRRZ SDEL,SRCHX SRCH1: CAML AC0,-1(SX) JRST SRCH3 SRCH2: SUB SX,SDEL LSH SDEL,-1 CAMG SX,SYMTOP JUMPN SDEL,SRCH1 JUMPN SDEL,SRCH2 SOJA SX,SRCHNO ;NOT FOUND SRCH3: CAMN AC0,-1(SX) JRST SRCH4 ;NORMAL / FOUND EXIT ADD SX,SDEL LSH SDEL,-1 CAMG SX,SYMTOP JUMPN SDEL,SRCH1 JUMPN SDEL,SRCH2 SOJA SX,SRCHNO ;NOT FOUND SRCH4: AOS 0(PP) ;SET FOR SKIP EXIT SRCH5: MOVSI ARG,SUPRBT ;HE IS USING IT, TURN OFF BIT ANDCAM ARG,(SX) ; IN THE TABLE SRCH7: MOVE ARG,0(SX) ;FLAG AND VALUE TO ARG LDB RC,RCPNTR ;POINT 1,ARG,17 TLNE ARG,LELF ;CHECK LEFT RELOCATE TLO RC,1 HRRZ V,ARG TLNE ARG,SPTR ;CHECK SPECIAL EXTESN POINTER JRST SRCH6 TLNE ARG,PNTF MOVE V,0(ARG) ;36BIT VALUE TO V JRST SRCHOK SRCH6: MOVE V,0(ARG) ;VALUE MOVE RC,1(ARG) ;AND RELOC TLNE RC,-2 ;CHECK AND SET EXTPNT HLLM RC,EXTPNT TRNE RC,-2 HRRM RC,EXTPNT JRST SRCHOK SRCHNO: SKIPN UNISCH+1 ;ALLOWED TO SEARCH OTHER TABLES POPJ PP, ;NO, JUST RETURN AOS V,UNISCH ;GET NEXT INDEX TO TABLE CAIE V,1 ;FIRST TIME IN JRST SRCHN1 ;YES, SAVE SYMBOL INFO HRLM SX,UNISCH ;SAVE SX AND SET FLAG MOVE ARG,SRCHX ;SEARCH POINTER MOVEM ARG,UNISHX ;TO A SAFE PLACE HRR ARG,SYMBOL HRL ARG,SYMTOP MOVEM ARG,UNIPTR ;STORE ALSO SRCHN1: MOVE V,UNISCH(V) ;GET TRUE INDEX JUMPE V,SRCHKO ;IF ZERO ALL TABLE SCANNED MOVE ARG,UNISHX(V) ;NEW SRCHX MOVEM ARG,SRCHX ;SET IT UP MOVE ARG,UNIPTR(V) ;SYMTOP,,SYMBOL HRRZM ARG,SYMBOL HLRZM ARG,SYMTOP JRST SEARCH ;TRY AGAIN > IFN POLISH,< SEARCH: PUSHJ PP,SRCHI ;SET UP SRCHX TLZ IO,RSASSW ;CLR INTER-PSECT REF SWITCH HRRZ AC1,SGNCUR ;GET CUR PSECT INX MOVEM AC1,SGWFND ;SET PSECT WHERE FOUND PUSHJ PP,SRCH ;SEARCH CURRENT PSECT JRST SRCHSG ;NOPE, TRY OTHER PSECT.S JRST SRCH4S ;COMMON SUCCESSFUL EXIT SRCHSG: PUSH PP,SX ;SAVE SX VALUE PUSH PP,SGNCUR ;SAVE SGNCUR PUSH PP,SGNMAX ;INIT PSECT INX SRCHSL: MOVE V,0(PP) ;GET PSECT INX CAMN V,-1(PP) ;DON'T SEARCH CURRENT JRST SRCHSC ; PSECT AGAIN MOVEM V,SGNCUR ;FUDGE CUR PSECT PUSHJ PP,SRCHI ;SET UP SRCHX PUSHJ PP,SRCH ;SEARCH THIS PSECT JRST SRCHSC ;NOT HERE EITHER MOVE AC1,SGNCUR ;GET RELEVANT PSECT INX MOVEM AC1,SGWFND ;SET PSECT WHERE FOUND SKIPGE -1(PP) ;WANT TO EVALUATE IN THIS PSECT? JRST SRCH4 ;YES, JUST EXIT MOVE ARG,0(SX) ;GET FLAGS TLNN ARG,EXTF ;EXTERNAL? JRST .+3 ;NO TLNN ARG,SPTR ;BUT NOT SPECIAL JRST SRCHEX ;YES, MUST STOR IN REQUESTING PSECT TLNE ARG,LELF!RELF ;IF RELOCATABLE THEN TLO IO,RSASSW ; SET INTER-PSECT REF SWITCH JRST SRCH4 ;COMMON SUCCESSFUL EXIT SRCHEX: POP PP,AC1 ;INDEX POP PP,SGNCUR ;RESTORE POP PP,SX ;WHERE IT SHOULD BE MOVEI SDEL,2 ;NEEDS 2 WORDS ADDB SDEL,FREE CAML SDEL,SYMBOL ;WILL IT FIT? PUSHJ PP,XCEEDS ;NO SETZM -2(SDEL) ;VALUE MOVEM AC0,-1(SDEL) ;NAME MOVEI V,-2(SDEL) ;POINTER MOVSI ARG,SYMF!EXTF!PNTF ;FLAGS WE NEED PUSHJ PP,INSERT ;PUT IT IN JRST SEARCH ;TRY AGAIN SRCHSC: SOS V,0(PP) ;BUMP PSECT INX JUMPGE V,SRCHSL ;LOOP IF MORE PSECTS POP PP,AC1 ;THROW AWAY PSECT INX POP PP,SGNCUR ;RESTORE SGNCUR PUSHJ PP,SRCHI ;RESET SRCHX POP PP,SX ;RESTORE SX VALUE SKIPN UNISCH+1 ;ALLOWED TO SEARCH OTHER TABLES POPJ PP, ;NO, JUST RETURN HRLM SX,UNISCH ;SAVE SX AND SET FLAG MOVE ARG,SRCHX ;SEARCH POINTER MOVEM ARG,UNISHX ;TO A SAFE PLACE HRR ARG,SGSBOT HRL ARG,SGSTOP MOVEM ARG,UNIPTR ;STORE ALSO SRCHUL: AOS V,UNISCH ;GET NEXT INDEX TO TABLE MOVE V,UNISCH(V) ;GET TRUE INDEX JUMPE V,SRCHKO ;IF ZERO ALL TABLE SCANNED MOVE ARG,UNISHX(V) ;NEW SRCHX MOVEM ARG,SRCHX ;SET IT UP MOVE ARG,UNIPTR(V) ;SGSTOP,,SGSBOT HRRZM ARG,SGSBOT HLRZM ARG,SGSTOP PUSHJ PP,SRCH ;SEARCH UNIV SYM TAB JRST SRCHUL ;NOPE, TRY NEXT ONE JRST SRCH4S ;COMMON SUCCESSFUL EXIT SRCH4: POP PP,AC1 ;THROW AWAY PSECT INX POP PP,SGNCUR ;RESTORE SGNCUR POP PP,AC1 ;THROW AWAY SX VALUE SRCH4S: AOS 0(PP) ;SET FOR SKIP EXIT SRCH5: MOVSI ARG,SUPRBT ;HE IS USING IT, TURN OFF BIT ANDCAM ARG,(SX) ; IN THE TABLE SRCH7: MOVE ARG,0(SX) ;FLAG AND VALUE TO ARG LDB RC,RCPNTR ;POINT 1,ARG,17 TLNE ARG,LELF ;CHECK LEFT RELOCATE TLO RC,1 HRRZ V,ARG TLNE ARG,SPTR ;CHECK SPECIAL EXTESN POINTER JRST SRCH6 TLNE ARG,PNTF MOVE V,0(ARG) ;36BIT VALUE TO V JRST SRCHOK SRCH6: MOVE V,0(ARG) ;VALUE MOVE RC,1(ARG) ;AND RELOC TLNE RC,-2 ;CHECK AND SET EXTPNT HLLM RC,EXTPNT TRNE RC,-2 HRRM RC,EXTPNT JRST SRCHOK > SRCHKO: SETZ ARG, ;CLEAR ARG SO ZERO STORED SRCHOK: SKIPN UNISCH ;HAVE WE SEARCH OTHER TABLES POPJ PP, ;NO, JUST RETURN SYMBCK: HLRZ SX,UNISCH ;RESTORE SX SETZM UNISCH ;CLEAR SYMBCK FLAG MOVE SDEL,UNISHX ;SRCHX MOVEM SDEL,SRCHX ;RESTORE ORIGINAL IFE POLISH,< MOVE SDEL,UNIPTR ;SYMTOP,,SYMBOL HRRZM SDEL,SYMBOL HLRZM SDEL,SYMTOP JUMPE ARG,CPOPJ ;TOTALLY UNDEFINED > IFN POLISH,< MOVE SDEL,UNIPTR ;SGSTOP,,SGSBOT HRRZM SDEL,SGSBOT HLRZM SDEL,SGSTOP JUMPE ARG,CPOPJ ;TOTALLY UNDEFINED PUSH PP,SGNCUR ;SAVE CUR PSECT SETZM SGNCUR ;SET TO BLANK PSECT SETZM SGWFND ;SET PSECT WHERE FOUND PUSHJ PP,SRCHI ;SET UP SRCHX PUSHJ PP,SRCH ;SET UP SX JFCL > TLNE ARG,SPTR ;[256] SPECIAL EXTERNAL? JRST SYMBKS ;[256] YES TLNE ARG,EXTF ;EXTERNAL? JRST SYMBKX ;YES, NEED 2 MORE CELLS TLNN ARG,PNTF ;36 BIT VALUE FLAG SET? JRST .+3 ;[265] NO, PUT IN TABLE AND RETURN TLNN V,-1 ;BUT IS IT ONLY 18 BIT VALUE? TLZ ARG,PNTF ;YES, SO ONLY USE 18 BITS IFE POLISH,< JRST INSERT SYN CPOPJ,SYMBKR > IFN POLISH,< PUSHJ PP,INSERT ;[265] STILL HAVE 0 PSECT SYMBKR: POP PP,SGNCUR ;[265] RESTORE CUR PSECT POPJ PP, ;[265] > SYMBKX: PUSH PP,[EXP SYMBKR] ;[265] RETURN ADDRESS PUSH PP,1(ARG) ;SAVE SIXBIT NAME MOVSI ARG,SYMF!EXTF!PNTF ;SET ONLY THE REQUIRED FLAGS ;[265] PUT 2 WORDS IN CORE SYMBKY: PUSHJ PP,INSERZ ;[256] INSERT SYMBOL IN TABLE MOVEI SDEL,2 ;GET 2 CELLS FROM FREE CORE ADDB SDEL,FREE CAML SDEL,SYMBOL ;MORE CORE NEEDED? PUSHJ PP,XCEEDS ;YES HRRI ARG,-2(SDEL) ;POINTER TO VALUE SETZM (ARG) ;AND CLEAR IT POP PP,1(ARG) ;STORE SIXBIT VALUE MOVEM ARG,(SX) ;SET FLAGS AND VALUE AS IT SHOULD BE POPJ PP, ;RETURN SYMBKS: PUSH PP,V ;[256] SAVE ADDITIVE VALUE PUSH PP,[Z SYMBKZ] ;[336] SET UP RETURN ADDRESS FOR PJRST PUSH PP,ARG ;[323] SAVE SYMBOL'S FLAGS PUSH PP,UNISCH+1 ;[256] ONLY SEARCH MAIN TABLE SETZM UNISCH+1 ;[256] ... PUSH PP,AC0 ;[256] SAVE SYMBOL WE REALLY WANT MOVE ARG,1(ARG) ;[256] GET POINTER TO DEFINING SYMBOL MOVE AC0,1(ARG) ;[256] AND FINALLY SYMBOL PUSHJ PP,SEARCH ;[256] SEE IF DEFINING GLOBAL IS IN TABLE PUSHJ PP,[PUSH PP,1(ARG) ;SAVE SIXBIT NAME MOVSI ARG,SYMF!EXTF!PNTF ;SET ONLY THE REQUIRED FLAGS JRST SYMBKY] ;[256] NO, PUT IN SYMBOL TABLE POP PP,AC0 ;[256] GET SYMBOL BACK PUSHJ PP,SEARCH ;[256] SETUP SX AGAIN JFCL ;[256] WILL ALWAYS FAIL POP PP,UNISCH+1 ;[256] BACK TO MULTIPLE SEARCHES HLL ARG,0(PP) ;[256] RECOVER FLAGS HRRZM ARG,0(PP) ;[256] STACK POINTER TO GLOBAL JRST SYMBKY ;[323] AND DO DUMMY PUSHJ SYMBKZ: ;[323] FAKE RETURN ADDRESS POP PP,V ;[256] GET OFFSET MOVEM V,0(ARG) ;[256] STORE OFFSET JRST SYMBKR ;[265] RETURN IFN POLISH,< SRCH: HLRZ SX,SRCHX HRRZ SDEL,SRCHX SRCH1: CAML AC0,-1(SX) JRST SRCH3 SRCH2: SUB SX,SDEL LSH SDEL,-1 CAMG SX,SGSTOP JUMPN SDEL,SRCH1 JUMPN SDEL,SRCH2 SOJA SX,SRCHNO ;NOT FOUND SRCH3: CAMN AC0,-1(SX) JRST SRCHYE ;NORMAL / FOUND EXIT ADD SX,SDEL LSH SDEL,-1 CAMG SX,SGSTOP JUMPN SDEL,SRCH1 JUMPN SDEL,SRCH2 SOJA SX,SRCHNO ;NOT FOUND SYN CPOPJ1,SRCHYE ;SKIP RETURN SYN CPOPJ,SRCHNO ;NON-SKIP RETURN > INSERQ: TLNE ARG,UNDF!VARF INSERZ: SETZB RC,V INSERT: CAME AC0,-1(SX) ;ARE WE LOOKING AT MATCHING MNEMONIC? JRST INSRT2 ;NO, JUST INSERT JUMPL ARG,INSRT1 ;YES, BRANCH IF OPERAND SKIPL 0(SX) ;OPERATOR, ARE WE LOOKING AT ONE? JRST UPDATE ;YES, UPDATE JRST INSRT2 ;NO, INSERT INSRT1: SKIPG 0(SX) ;OPERAND, ARE WE LOOKING AT ONE? JRST UPDATE ;YES, UPDATE SUBI SX,2 ;NO, MOVE UNDER OPERATOR AND INSERT INSRT2: MOVE SDEL,SYMBOL SUBI SDEL,2 CAMLE SDEL,FREE JRST INSRT3 PUSHJ PP,XCEEDS ADDI SDEL,2000 INSRT3: MOVEM SDEL,SYMBOL ;MAKE ROOM FOR A TWO WORD ENTRY HRLI SDEL,2(SDEL) BLT SDEL,-2(SX) ;PUSH EVERYONE DOWN TWO LOACTIONS IFN POLISH,< MOVE AC1,SGNCUR ;CURRENT PSECT INDEX AOS SGSCNT(AC1) ;INCREMENT PSECT SYM COUNT > AOS @SYMBOL ;INCREMENT THE SYMBOL COUNT TDNE RC,[-2,,-2] ;SPECIAL LEFT OR RIGHT EXTERNAL? JRST INSRT5 ;YES, JUMP TLNN V,-1 ;SKIP IF V IS A 36BIT VALUE JRST INSRT4 ;JUMP, ITS A 18BIT VALUE AOS SDEL,FREE ;36BIT, SO GET A CELL FROM FREE CORE CAML SDEL,SYMBOL ;MORE CORE NEEDED? PUSHJ PP,XCEEDS ;YES HRRI ARG,-1(SDEL) ;POINTER TO ARG MOVEM V,0(ARG) ;36BIT VALUE TO FREE CORE TLO ARG,PNTF ;[204] NOTE THAT ARG IS APOINTER, NOT A 18BIT VALUE JRST INSRT7 ;[204] STORE SYMBOL INSRT4: HRR ARG,V ;18 BIT VALUE ARG TLNN ARG,EXTF ;[204] POSSIBLE TO BE EXT WITH 0 RELOC SO DON'T TLZ ARG,PNTF ;[204] CLEAR POINTER FLAG INCASE SET INSRT7: DPB RC,RCPNTR ;FIX RIGHT RELOCATION TLNE RC,1 TLO ARG,LELF ;FIX LEFT RELOCATION INSRT6: MOVEM ARG,0(SX) ;INSERT FLAGS AND VALUE. MOVEM AC0,-1(SX) ;INSERT SYMBOL NAME. PUSHJ PP,SRCHI ;INITILIAZE SRCHX JRST QSRCH ;EXIT THROUGH CREF INSRT5: MOVEI SDEL,2 ;GET TWO CELLS FROM FREE CORE ADDB SDEL,FREE CAML SDEL,SYMBOL ;MORE CORE NEEDED? PUSHJ PP,XCEEDS ;YES MOVEM RC,-1(SDEL) HRRI ARG,-2(SDEL) ;POINTER TO ARG MOVEM V,0(ARG) TLO ARG,SPTR ;SET SPECIAL POINTER, POINTS TO TWO CELLS JRST INSRT6 REMOVE: IFN POLISH,< MOVEI AC2,0(SX) ;ADDRESS OF THE SYMBOL SUB AC2,SYMBOL ; - BASE OF SYMBOL TABLE LSH AC2,-1 ; / 2 = SYMBOL ORDINAL TDZA AC1,AC1 ;INIT PSECT INDEX ADDI AC1,1 ;INCREMENT PSECT INDEX HRRZ AC0,SGSCNT(AC1) ;WITHIN THIS PSECT? SUB AC2,AC0 JUMPG AC2,.-3 ;TRY NEXT PSECT IF NOT SOS SGSCNT(AC1) ;DECREMENT PSECT SYM COUNT > SUBI SX,2 ;MOVE EVERYONE UP TWO LOCATIONS REMOV1: MOVE 0(SX) MOVEM 2(SX) ;OVERWRITE THE DELETED SYMBOL CAME SX,SYMBOL ;SKIP WHEN DONE SOJA SX,REMOV1 ADDI SX,2 MOVEM SX,SYMBOL SOS 0(SX) ;DECREMENT THE SYMBOL COUNT SRCHI: MOVEI AC2,0 ;THIS CODE SETS UP SRCHX IFE POLISH,< FAD AC2,@SYMBOL > IFN POLISH,< HRRZ AC1,SGNCUR HRRZ AC1,SGSCNT(AC1) FAD AC2,AC1 > LSH AC2,-^D27 MOVEI AC1,1000 LSH AC1,-357(AC2) HRRM AC1,SRCHX LSH AC1,1 IFE POLISH,< ADD AC1,SYMBOL HRLM AC1,SRCHX > IFN POLISH,< HRLM AC1,SRCHX MOVE AC1,SYMBOL MOVEM AC1,SGSBOT HRRZ AC2,SGNCUR JUMPE AC2,SRCHI2 SRCHI1: HRRZ AC1,SGSCNT-1(AC2) LSH AC1,1 ADDB AC1,SGSBOT SOJG AC2,SRCHI1 SRCHI2: MOVS AC2,AC1 ADDM AC2,SRCHX MOVE AC2,SGNCUR SRCHI3: HRRZ AC1,SGSCNT(AC2) LSH AC1,1 ADD AC1,SGSBOT MOVEM AC1,SGSTOP > POPJ PP, ;SRCHX=XWD ,LENGTH/4 UPDATE: DPB RC,RCPNTR ;FIX RIGHT RELOCATION TLNE ARG,SPTR ;SKIP IF THERE IS NO SPECIAL POINTER JRST UPDAT4 ;YES, USE THE TWO CELLS TDNE RC,[-2,,-2] ;NEED TO CHANGE ANY CURRENT EXTERNS JRST UPDAT5 ;YES ,JUMP TLZ ARG,LELF ;CLEAR LELF TLNE RC,1 ;LEFT RELOCATABLE? TLO ARG,LELF ;YES, SET THE FLAG TLNE ARG,PNTF ;WAS THERE A 36BIT VALUE? JRST UPDAT2 ;YES, USE IT. TLNE V,-1 ;NO,IS THERE A 36BIT VALUE? JRST UPDAT1 ;YES, GET A CELL HRR ARG,V ;NO, USE RH OF ARG UPDAT3: MOVEM ARG,0(SX) ;OVERWRITE THE ONE IN THE TABLE IFE POLISH,< POPJ PP, ;AND EXIT > IFN POLISH,< JRST UPDAT6 ;AND EXIT > UPDAT1: AOS SDEL,FREE ;GET ONE CELL CAML SDEL,SYMBOL ;NEED MORE CORE? PUSHJ PP,XCEEDS ;YES HRRI ARG,-1(SDEL) ;POINTER TO ARG TLO ARG,PNTF ;AND NOTE IT. UPDAT2: TLNE ARG,EXTF ;IS THERE A EXTERNAL? JRST UPDAT3 ;YES, - JUST SAVE A LOCATION MOVEM ARG,0(SX) ;NO, OVERWRITE THE POINTER IN THE TABLE MOVEM V,0(ARG) ;STORE VALUE AS A 36BIT VALUE IFE POLISH,< POPJ PP, ;AND EXIT > IFN POLISH,< JRST UPDAT6 ;AND EXIT > UPDAT4: MOVEM ARG,0(SX) ;WE HAVE TWO CELLS, WE USE THEM MOVEM V,0(ARG) ;SAVE AS 36BIT VALUE MOVEM RC,1(ARG) ;SAVE RELOCATION BITS POPJ PP, ;AND EXIT UPDAT5: MOVEI SDEL,2 ;THERE IS A EXTERNAL ADDB SDEL,FREE ;SO WE NEED TWO LOACTIONS CAML SDEL,SYMBOL ;NEED MORE CORE? PUSHJ PP,XCEEDS ;YES MOVEM RC,-1(SDEL) ;SAVE RELOCATION BITS HRRI ARG,-2(SDEL) ;SAVE THE POINTER IN ARG MOVEM V,0(ARG) ;SAVE A 36BIT VALUE TLO ARG,SPTR ;SET SPECIAL PNTR FLAG TLZ ARG,PNTF ;CLEAR POINTER FLAG JRST UPDAT3 ;SAVE THE POINTER AND EXIT IFN POLISH,< UPDAT6: TLNN IO,DEFCRS ;DEFINING OCCURANCE? POPJ PP, ;NO, RETURN TLNE ARG,EXTF ;EXTERNAL? POPJ PP, ;YES, RETURN MOVE SDEL,SYMBOL ;GET START OF SYM TAB SETZ AC1, ;ZERO PSECT INX UPDAT7: HRRZ AC2,SGSCNT(AC1) ;PSECT SYM CNT LSH AC2,1 ;DOUBLE IT ADD SDEL,AC2 ;END OF PSECT CAMGE SDEL,SX ;SYM IN THIS PSECT? AOJA AC1,UPDAT7 ;NO, TRY NEXT PSECT CAMN AC1,SGNCUR ;IF IT'S IN THE CUR PSECT POPJ PP, ; THEN RETURN PUSH PP,AC1 ;SAVE PRESENT PSECT INX PUSH PP,0(SX) ;SAVE SYMBOL STUFF PUSH PP,-1(SX) ; AND NAME PUSH PP,SX ;SAVE PRESENT SYM INX PUSHJ PP,SRCHI ;SET UP SRCHX PUSHJ PP,SRCH ;SET UP NEW SX JFCL POP PP,SDEL ;RESTORE PRESENT SYM INX MOVE AC1,-2(PP) ;GET PRESENT PSECT INX CAMG AC1,SGNCUR ;WHICH WAY TO MOVE? JRST UPDAT9 ;DOWN ADDI SX,2 ;MUST MOVE THIS ONE ALSO UPDAT8: MOVE AC2,-2(SDEL) ;MOVE PART OF MOVEM AC2,0(SDEL) ; SYMBOL TABLE CAILE SDEL,0(SX) ;ENOUGH MOVED? SOJA SDEL,UPDAT8 ;NO JRST UPDT10 ;COMMON EXIT UPDAT9: HRLI AC2,1(SDEL) ;FROM HERE HRRI AC2,-1(SDEL) ; TO HERE BLT AC2,-2(SX) ; UNTIL HERE, MOVE! UPDT10: POP PP,-1(SX) ;RESTORE SYMBOL NAME POP PP,0(SX) ; AND STUFF POP PP,AC1 ;OLD PSECT INX SOS SGSCNT(AC1) ;DECR ITS SYM CNT MOVE AC1,SGNCUR ;CUR PSECT INX AOS SGSCNT(AC1) ;INCR ITS SYM CNT PUSHJ PP,SRCHI ;SET UP SRCHX POPJ PP, ;RETURN > SUBTTL CONSTANTS IFN FORMSW,< HWFORM: BYTE (18) 1,1 INFORM: BYTE (9) 1 (4) 1 (1) 1 (4) 1 (18) 1 IOFORM: BYTE (3) 1 (7) 1 (3) 1 (1) 1 (4) 1 (18) 1 BPFORM: BYTE (6) 1,1 (2) 1 (4) 1 (18) 1 ASCIIF: BYTE (7) 1,1,1,1,1 SXFORM: BYTE (6) 1,1,1,1,1,1 > SUBTTL PHASED CODE IFN PURESW, IFN FT.U01,< $USRPD: IOWD $USRLN,$USSTK >;END IFN FT.U01 IFN TEMP, LSTFIL: BLOCK 1 SIXBIT /@/ ;SYMBOL TO STOP PRINTING TABI: IFE FORMSW,< BYTE (7) 0, 11, 11, 11, 11> IFN FORMSW,< BYTE (7) 11,11, 11, 11, 11> SEQNO: BLOCK 1 ASCIZ / / BININI: EXP B BINDEV: BLOCK 1 XWD BINBUF,0 LSTINI: EXP AL LSTDEV: BLOCK 1 XWD LSTBUF,0 IFN CCLSW,< RPGINI: EXP AL RPGDEV: BLOCK 1 XWD 0,CTLBLK > INDEVI: EXP A INDEV: BLOCK 1 XWD 0,IBUF UNVINI: EXP B ;[240] OPEN BLOCK FOR BINARY UNV UNVDEV: BLOCK 1 ;[240] SO USER CAN SPECIFY EXP UNVBUF ;[240] ..LPP: EXP .LPP-2 ;[227] "READ-ONLY" LINES/PAGE DBUF: ASCIZ / TI:ME DY-MON-YR PAGE / VBUF: ASCIZ / MACRO %/ ;MUST BE LAST LOCATIONS IN BLOCK IFE PURESW,< BLOCK 3 ;ALLOW FOR LONG TITLE> IFN PURESW,< DEPHASE LENLOW==.-LOWH> SUBTTL STORAGE CELLS IFN PURESW,< RELOC LOWL LOWL: BLOCK LENLOW+3 > PASS1I: RP: BLOCK 1 IFN POLISH,< POLSTK: BLOCK 1 ;[164] POLPTR: BLOCK 1 ;[164] > CTLBUF: BLOCK /5 LSTBUF: BLOCK 3 BINBUF: BLOCK 3 IBUF: BLOCK 3 UNVBUF: BLOCK 3 LSTDIR: BLOCK 4 BINDIR: BLOCK 4 INDIR: BLOCK 4 UNVDIR: BLOCK 4 UNVPTH: BLOCK 2+.SFDLN ;[240] PATH FOR UNV LOOKUP MYPPN: BLOCK 1 ;[405]LOGGED IN PPN ACDELX: ;LEFT HALF BLKTYP: BLOCK 1 ;RIGHT HALF COUTX: BLOCK 1 COUTY: BLOCK 1 COUTP: BLOCK 1 COUTRB: BLOCK 1 COUTDB: BLOCK ^D18 UPARRO: BLOCK 1 ;[333] SWITCH WORD FOR RE-EATING ^ IF NOT FOLLOWED BY - OR ! OKOVFL: BLOCK 1 ;[362] -1 == * OR / OVERFLOW OK DECTAB: BLOCK 1 ;[206] -1 == TABS NOT INCLUDED IN MACRO ARGS IFN TSTCD,< TCDFLG: BLOCK 1 ;[414]-1 MEANS TEST MODE, 0 REGULAR MODE > ; NFI TSTCD ERRCNT: BLOCK 1 EOFFLG: BLOCK 1 ;[417]END OF FILE SEEN,NEXT FILE OPENED NOFLG: BLOCK 1 ;0=DIRECTIVE XXX -1=DIRECT NO XXXX QERRS: BLOCK 1 ;COUNT OF "Q" ERRORS FREE: BLOCK 1 HIGH1: BLOCK 1 HISNSW: BLOCK 1 SVTYP3: BLOCK 1 HMIN: BLOCK 1 ;START OF HIGH SEG. IN TWO SEG. PROG. SXSV: BLOCK 1 SDELSV: BLOCK 1 COLSIZ: BLOCK 1 SYMBLK: BLOCK 1 IFBLK: BLOCK .IFBLK IFBLKA: BLOCK .IFBLK LADR: BLOCK 1 NCOLLS: BLOCK 1 LIMBO: BLOCK 1 LBUFP: BLOCK 1 LBUF: BLOCK <.CPL+5>/5 .SGLVZ==. ;[264] START OF LIT /VAR AREA BLOCK 1 VARHD: BLOCK 1 VARHDX: BLOCK 1 LITAB: BLOCK 1 LITABX: BLOCK 1 BLOCK 1 LITHD: BLOCK 1 LITHDX: BLOCK 1 LITCNT: BLOCK 1 LITNUM: BLOCK 1 .SGLVL==.-.SGLVZ ;[264] LENGTH OF LIT/VAR AREA LITERR: BLOCK 1 ;[415] LOOKX: BLOCK 1 NEXT: BLOCK 1 OUTSW: BLOCK 1 PDP: BLOCK 1 RECCNT: BLOCK 1 SAVBLK: BLOCK RC SAVERC: BLOCK 1 SBUF: BLOCK .SBUF/5 SRCHX: BLOCK 1 SUBTTX: BLOCK 1 SVSYM: BLOCK 1 SYMBOL: BLOCK 1 SYMTOP: BLOCK 1 SYMCNT: BLOCK 1 IFN POLISH,< SGNMAX: BLOCK 1 SGNAME: BLOCK SGNSGS+1 SGRELC: BLOCK SGNSGS+1 SGSCNT: BLOCK SGNSGS+1 SGATTR: BLOCK SGNSGS+1 SGORIG: BLOCK SGNSGS+1 ;[264] LIT/VAR AREA ,, ORIGIN OF PSECT SGSBOT: BLOCK 1 SGSTOP: BLOCK 1 SGWFND: BLOCK 1 > STPX: BLOCK 1 STPY: BLOCK 1 STCODE: BLOCK .STP STOWRC: BLOCK .STP IFN FORMSW,< STFORM: BLOCK .STP FORM: BLOCK 1 HWFMT: BLOCK 1 FLDSIZ: BLOCK 1 IOSEEN: BLOCK 1 > TABP: BLOCK 1 TCNT: BLOCK 1 ;COUNT OF CHARS. LEFT IN TBUF TBUF: BLOCK .TBUF/5 DEVBUF: BLOCK 6 ;STORE NAME.EXT CREATION DATE AND TIME TYPERR: BLOCK 1 PRGPTR: BLOCK 1 ;POINTER TO CHAIN OF PRGEND BLOCKS ENTERS: BLOCK 1 ;-1 WHEN ENTERS HAVE BEEN DONE UNIVSN: BLOCK 1 ;-1 WHEN A UNIVERSAL SEEN UNVSKP: BLOCK 1 ;-1 IF /U SEEN (DON'T SAVE UNIV) CPUTYP: BLOCK 1 ;[235] CPU TYPE FOR HEADER BLOCK IFN FT.U01,< $USSTK: BLOCK $USRLN ;USER PUSH-DOWN STACK >;END IFN FT.U01 PASS2I: ABSHI: BLOCK 1 HIGH: BLOCK 1 HHIGH: BLOCK 1 ;SAVE BREAK OF HIGH SEG. IN TWO SEG PROG. IFN POLISH,< SGNCUR: BLOCK 1 SGDMAX: BLOCK 1 SGLIST: BLOCK SGNDEP+1 > ACDEVX: BLOCK 1 CPL: BLOCK 1 CTLSAV: BLOCK 1 CTLS1: BLOCK 1 EXTPNT: BLOCK 1 INTENT: BLOCK 1 INREP: BLOCK 1 INDEF: BLOCK 1 INTXT: BLOCK 1 INCND: BLOCK 1 CALNAM: BLOCK 1 COMSW: BLOCK 1 ;[425] -1 IF IN COMMENT WHILE LOOKING FOR ANG.BRKT. ;DO NOT SPLIT THIS BLOCK OF 4 WORDS PAGENO: BLOCK 1 SEQNO2: BLOCK 1 TAG: BLOCK 1 TAGINC: BLOCK 1 CALPG: BLOCK 4 DEFPG: BLOCK 4 LITPG: BLOCK 4 REPPG: BLOCK 4 TXTPG: BLOCK 4 CNDPG: BLOCK 4 IRPCNT: BLOCK 1 IRPARG: BLOCK 1 IRPARP: BLOCK 1 IRPCF: BLOCK 1 IRPPOI: BLOCK 1 IRPSW: BLOCK 1 LITLVL: BLOCK 1 LBLFLG: BLOCK 1 ;[402] -1 IF LABEL HAS OCCURRED INSIDE CURRENT LITERAL LTGINC: BLOCK 1 ;[402] DEPTH OF LABEL IN LITERAL LITLBL: BLOCK 2 ;[155] NAME OF LABEL DEFINED INSIDE A LITERAL + VALUE ASGBLK: BLOCK 1 LOCBLK: BLOCK 1 LOCA: BLOCK 1 LOCO: BLOCK 1 RELLOC: BLOCK 1 ABSLOC: BLOCK 1 LPP: BLOCK 1 ORGMOD: BLOCK 1 MODA: BLOCK 1 MODLOC: BLOCK 1 MODO: BLOCK 1 IFN CCLSW, OUTSQ: BLOCK 2 PAGEN.: BLOCK 1 PPTEMP: BLOCK 1 PPTMP1: BLOCK 1 PPTMP2: BLOCK 1 REPCNT: BLOCK 1 REPEXP: BLOCK 1 REPPNT: BLOCK 1 RPOLVL: BLOCK 1 R1BCNT: BLOCK 1 R1BCHK: BLOCK 1 R1BBLK: BLOCK .R1B R1BLOC: BLOCK 1 RIMLOC: BLOCK 1 VECREL: BLOCK 1 VECTOR: BLOCK 1 VECSYM: BLOCK 1 ;[244] GLOBAL SYMBOLIC START ADDRESS IFN POLISH,< VECFND: BLOCK 1 > .TEMP: BLOCK 1 ;TEMPORARY STORAGE UNISCH: BLOCK .UNIV+1 ;SEARCH TABLE FOR UNIVERSALS SQFLG: BLOCK 1 ARGF: BLOCK 1 CPEEKC: BLOCK 1 ;[325] ANGLE COUNT AFTER ;; IN MACRO MACENL: BLOCK 1 MACLVL: BLOCK 1 MACPNT: BLOCK 1 WWRXX: BLOCK 1 RCOUNT: BLOCK 1 ;COUNT OF WORDS STILL TO READ IN LEAF WCOUNT: BLOCK 1 ;COUNT OF WORDS STILL FREE IN LEAF IONSYM: BLOCK 1 ;-1 SUPRESS LISTING OF SYMBOLS LOCAL: BLOCK 1 ;LINKED LIST OF LOCAL FIXUPS IFN POLISH,< POLTYP: BLOCK 1 ;[164] PRESET IF POLISH FIXUP TYPE KNOWN POLIST: BLOCK 1 ;[164] LINKED LIST OF POLISH FIXUP BLOCKS POLITS: BLOCK 1 ;[265] LINKED LIST OF POLISH FIXUPS TO LITS (TEMP) > INASGN: BLOCK 1 ;[267] HOLDS SYMBOL NAME DURING ASSIGN INCASE NEEDS POLISH SFDADD: BLOCK 3+.SFDLN ;FOR LOOKUP/ENTER OF SFD PATH SFDE==.-1 ;[216] END OF SFD PPPN: BLOCK 1 ;[216] DEFAULT PPN PSFD: BLOCK 3*.SFDLN ;[216] DEFAULT SFD PSFDE==.-1 ;[216] LAST ADDRESS IN SFD PASS2Z: ;ONLY CLEAR TO HERE ON PRGEND LSTSYM: BLOCK 1 SPAGNO: BLOCK 1 ;PAGE NUMBER FOR SYMBOL TABLES PASS2X: SUBTTL MULTI-ASSEMBLY STORAGE CELLS SAVEPP: BLOCK 1 ;SAVE PP INCASE NO END STATEMENT SAVEMP: BLOCK 1 ;MACRO PNTR FOR SAME REASOM SAVERP: BLOCK 1 ;MACRO READ POINTER LSTPGN: BLOCK 1 ARAYP: BLOCK 1 HDAS: BLOCK 1 IFN CCLSW, CTLBLK: BLOCK 3 CTIBUF: BLOCK 3 CTOBUF: BLOCK 3 IFN TEMP, IFN FORMSW, MACSIZ: BLOCK 1 ;INITIAL SIZE OF LOW SEG UNISIZ: BLOCK 1 ;TOP OF BUFFERS AND STACKS UNITOP: BLOCK 1 ;TOP OF UNIVERSAL SYMBOL TABLE UNIVNO: BLOCK 1 ;NUMBER OF UNIVERSALS SEEN UNITBL: BLOCK .UNIV+1 ;TABLE OF UNIVERSAL NAMES UNIPTR: BLOCK .UNIV+1 ;TABLE OF SYMBOL POINTERS UNISHX: BLOCK .UNIV+1 ;TABLE OF SRCHX POINTERS UNVDFA: BLOCK 1 ;[334] DEFAULT ARGUMENT POINTER FOR UNIVERSAL I/O UNVER%: BLOCK 1 ;[334] OLD UNIVERSAL FILE IF -1, MAY HAVE LOST DEFAULT ARGS RTIME: BLOCK 1 ;[234] CPU TIME AT START OF PASS1 VAR ;CLEAR VARIABLES IFE POLISH, JOBFFI: BLOCK 203*NUMBUF+1 ;INPUT BUFFER PLUS ONE IFN PURESW, END BEG