+++ /dev/null
-TITLE MACRO V.46(52) \r
-SUBTTL RPG/CMF/JF/PMH/DMN 7-SEPT-71\r
-;COPYRIGHT 1968,1969,1970,1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.\r
-\r
- VMACRO==36 ;VERSION NUMBER\r
- VUPDATE==0 ;DEC UPDATE LEVEL\r
- VEDIT==0 ;EDIT NUMBER\r
- VCUSTOM==0 ;NON-DEC UPDATE LEVEL\r
-\r
-\r
- LOC <JOBVER==137>\r
- <VCUSTOM>B2+<VMACRO>B11+<VUPDATE>B17+VEDIT\r
- RELOC\r
- MLON\r
-\r
-COMMENT * ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)\r
-\r
- SWITCHES ON (NON-ZERO) IN DEC VERSION\r
-SEG2SW GIVES TWO SEGMENT MACRO\r
-PURESW GIVES VARIABLES IN LOW SEGMENT\r
-CCLSW GIVES RAPID PROGRAM GENERATION FEATURE\r
-FTDISK GIVES DISK FEATURES\r
-RUNSW USE RUN UUO FOR "DEV:NAME!"\r
-TEMP TMPCOR UUO IS TO BE USED\r
-RENTSW ASSEMBLE REENTRANT PROGRAMS\r
-FORMSW USE MORE READABLE FORMATS FOR LISTING (ICCSW)\r
-DFRMSW DEFAULT CONDITION OF FORMAT PRINTING (MULTI-FORM IF ON)\r
-\r
- SWITCHES OFF (ZERO) IN DEC VERSION\r
-STANSW GIVES STANFORD FEATURES\r
-LNSSW GIVES LNS VERSION\r
-WFWSW GIVES ARRAY, INTEGER AND LVAR FEATURES\r
-IIISW GIVES III FEATURES\r
-OPHSH GIVES HASH SEARCH OF OPCODES\r
-KI10 GIVES KI10 OP-CODES\r
-*\r
-\fSUBTTL DEFAULT ASSEMBLY SWITCH SETTINGS\r
-\r
-IFDEF TWOSEG,<IFNDEF SEG2SW,<SEG2SW==1>>\r
-IFNDEF SEG2SW,<SEG2SW==0>\r
-IFN SEG2SW,<PURESW==1>\r
-\r
-IFNDEF PURESW,<PURESW==1>\r
-\r
-IFNDEF STANSW,<STANSW==0>\r
-\r
-IFNDEF RENTSW,<RENTSW==1>\r
-\r
-IFNDEF LNSSW,<LNSSW==0>\r
-IFN LNSSW,<FTDISK==0>\r
-\r
-IFNDEF RUNSW,<RUNSW==0>\r
-\r
-IFNDEF CCLSW,<CCLSW==1>\r
-IFN CCLSW,<FTDISK==1>\r
-\r
-IFNDEF TEMP,<TEMP==0>\r
-\r
-IFNDEF WFWSW,<WFWSW==0>\r
-\r
-\r
-IFNDEF FTDISK,<FTDISK==0>\r
-IFNDEF DFRMSW,<DFRMSW==0>\r
-IFN DFRMSW,<FORMSW==0>\r
-IFDEF ICCSW,<FORMSW==ICCSW> ;SAME SWITCH\r
-IFNDEF FORMSW,<FORMSW==0>\r
-\r
-IFNDEF IIISW,<IIISW==0>\r
-\r
-IFNDEF OPHSH,<OPHSH==0>\r
-\r
-IFNDEF KI10,<KI10==0>\r
-\fSUBTTL OTHER PARAMETERS\r
-\r
-.PDP== ^D50 ;BASIC PUSH-DOWN POINTER\r
-IFNDEF LPTWID,<LPTWID==^D120> ;DEFAULT WIDTH OF PRINTER\r
-.LPTWD==8*<LPTWID/8> ;USEFUL WIDTH IN MAIN LISTING\r
-.CPL== .LPTWD-^D32 ;WIDTH AVAIABLE FOR TEXT WHEN\r
- ;BINARY IS IN HALFWORD FORMAT\r
-IFE STANSW,<.LPP==^D55 ;LINES/PAGE>\r
-IFN STANSW,<.LPP==^D52 ;LINES/PAGE>\r
-.STP== ^D40 ;STOW SIZE\r
-.TBUF== ^D80 ;TITLE BUFFER\r
-.SBUF== ^D80 ;SUB-TITLE BUFFER\r
-.IFBLK==^D20 ;IFIDN COMPARISON BLOCK SIZE\r
-.R1B==^D18\r
-.UNIV==^D10 ;NUMBER OF UNIVERSAL DEFINITIONS\r
-.LEAF==4 ;SIZE OF BLOCKS IN MACRO TREE\r
-\r
-NCOLS==LPTWID/^D32 ;NUMBER OF COLUMNS IN SYMBOL TABLE\r
-IFN CCLSW,<IFNDEF CTLSIZ,<CTLSIZ==^D200>>\r
-IFN OPHSH,<IFNDEF PRIME,<PRIME==^D701>>\r
-IFNDEF NUMBUF,<\r
-IFE STANSW!LNSSW,<NUMBUF==2 ;NUMBER OF INPUT BUFFERS>\r
-IFN STANSW,<NUMBUF==5 ;NUMBER OF INPUT BUFFERS>\r
-IFN LNSSW,<NUMBUF==4 ;DOUBLE BUFFER FOR DOUBLE SIZE DEVICES>\r
->\r
-\r
-EXTERN JOBREL,JOBSYM,JOBDDT,JOBFF,JOBAPR,JOBSA\r
-IFN CCLSW,< EXTERN JOBERR>\r
-\r
-IFN PURESW,<\r
-IFE SEG2SW,<HISEG>\r
-IFN SEG2SW,<TWOSEGMENTS\r
-LOWL: ;START OF LOW SEGMENT\r
- RELOC 400000>>\r
-\r
- SALL ;SUPPRESS ALL MACROS\r
-\r
-;SOME ASCII CHARACTERS\r
-\r
-HT==11\r
-LF==12\r
-VT==13\r
-FF==14\r
-CR==15\r
-EOL==33\r
-\f ;ACCUMULATORS\r
-AC0== 0\r
-AC1= AC0+1\r
-AC2= AC1+1\r
-SDEL= 3 ;SEARCH INCREMENT\r
-SX= SDEL+1 ;SEARCH INDEX\r
-ARG= 5 ;ARGUMENT\r
-V= 6 ;VALUE\r
-C= 7 ;CURRENT CHARACTER\r
-CS= C+1 ;CHARACTER STATUS BITS\r
-RC= 11 ;RELOCATION BITS\r
-MWP= 12 ;MACRO WRITE POINTER\r
-MRP= 13 ;MACRO READ POINTER\r
-IO= 14 ;IO REGISTER (LEFT)\r
-ER== IO ;ERROR REGISTER (RIGHT)\r
-FR= 15 ;FLAG REGISTER (LEFT)\r
-RX== FR ;CURRENT RADIX (RIGHT)\r
-MP= 16 ;MACRO PUSHDOWN POINTER\r
-PP= 17 ;BASIC PUSHDOWN POINTER\r
-\r
-%OP== 3\r
-%MAC== 5\r
-%DSYM== 2\r
-%SYM== 1\r
-%DMAC== %MAC+1\r
-\r
-OPDEF RESET [CALLI 0]\r
-OPDEF SETDDT [CALLI 2]\r
-OPDEF DDTOUT [CALLI 3]\r
-OPDEF DEVCHR [CALLI 4]\r
-OPDEF WAIT [MTAPE 0]\r
-OPDEF CORE [CALLI 11]\r
-OPDEF EXIT [CALLI 12]\r
-OPDEF UTPCLR [CALLI 13]\r
-OPDEF DATE [CALLI 14]\r
-OPDEF APRENB [CALLI 16]\r
-OPDEF MSTIME [CALLI 23]\r
-OPDEF PJOB [CALLI 30]\r
-OPDEF RUN [CALLI 35]\r
-OPDEF TMPCOR [CALLI 44]\r
-\r
-IFN STANSW,< OPDEF SWAP [CALLI 400004] >\r
-\f ;FR FLAG REGISTER (FR/RX)\r
-IOSCR== 000001 ;NO CR AFTER LINE\r
-MTAPSW==000004 ;MAG TAPE\r
-ERRQSW==000010 ;IGNORE Q ERRORS\r
-LOADSW==000020 ;END OF PASS1 & NO EOF YET\r
-DCFSW== 000040 ;DECIMAL FRACTION\r
-RIM1SW==000100 ;RIM10 MODE\r
-NEGSW== 000200 ;NEGATIVE ATOM\r
-RIMSW== 000400 ;RIM OUTPUT\r
-PNCHSW==001000 ;RIM/BIN OUTPUT WANTED\r
-CREFSW==002000\r
-R1BSW== 004000 ;RIM10 BINARY OUTPUT\r
-TMPSW== 010000 ;EVALUATE CURRENT ATOM\r
-INDSW== 020000 ;INDIRECT ADDRESSING WANTED\r
-RADXSW==040000 ;RADIX ERROR SWITCH\r
-FSNSW== 100000 ;NON BLANK FIELD SEEN\r
-MWLFLG==200000 ;ON FOR DON'T ALLOW MULTI-WORD LITERALS\r
-P1== 400000 ;PASS1\r
-\r
- ;IO FLAG REGISTER (IO/ER)\r
-FLDSW== 400000 ;ADDRESS FIELD\r
-IOMSTR==200000\r
-ARPGSW==100000 ;ALLOW RAPID PROGRAM GENERATION\r
-IOPROG==040000 ;SUPRESS LISTING (LIST/XLIST PSEUDO OP)\r
-NUMSW== 020000\r
-IOMAC== 010000 ;MACRO EXPANSION IN PROGRESS\r
-IOPALL==004000 ;SUPRESS LISTING OF MACRO EXPANSIONS\r
-IONCRF==002000 ;SUPRESS OUTPUT OF CREF INFORMATION\r
-CRPGSW==001000 ;CURRENTLY IN PROGRESS ON RPG\r
-IOCREF==000400 ;WE ARE NOW OUTPUTTING CREF INFO\r
-IOENDL==000200 ;BEEN TO STOUT\r
-IOPAGE==000100\r
-DEFCRS==000040 ;THIS IS A DEFINING OCCURANCE (MACROS)\r
-IOIOPF==000020 ;IOP INSTRUCTION SEEN\r
-MFLSW== 000010 ;MULTI-FILE MODE,PRGEND SEEN\r
-IORPTC==000004 ;REPEAT CURRENT CHARACTER\r
-IOTLSN==000002 ;TITLE SEEN\r
-IOSALL==000001 ;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED\r
-\r
-OPDEF JUMP1 [JUMPL FR, ] ;JUMP IF PASS 1\r
-OPDEF JUMP2 [JUMPGE FR, ] ;JUMP IF PASS 2\r
-\r
-OPDEF JUMPOC [JUMPGE IO, ] ;JUMP IF IN OP-CODE FIELD\r
-OPDEF JUMPAD [JUMPL IO, ] ;JUMP IF IN ADDRESS FIELD\r
-\r
-OPDEF JUMPCM [JUMPL CS, ] ;JUMP IF CURRENT CHAR IS COMMA\r
-OPDEF JUMPNC [JUMPGE CS, ] ;JUMP IF CURRENT CHAR IS NON-COMMA\r
-\r
-\f ;ER ERROR REGISTERS (IO/ER)\r
-ERRM== 000020 ;MULTIPLY DEFINED SYMBOL\r
-ERRE== 000040 ;ILLEGAL USE OF EXTERNAL\r
-ERRP== 000100 ;PHASE DISCREPANCY\r
-ERRO== 000200 ;UNDEFINED OP CODE\r
-ERRN== 000400 ;NUMBER ERROR\r
-ERRV== 001000 ;VALUE PREVIOUSLY UNDEFINED\r
-ERRU== 002000 ;UNDEFINED SYMBOL\r
-ERRR== 004000 ;RELOCATION ERROR\r
-ERRL== 010000 ;LITERAL ERROR\r
-ERRD== 020000 ;REFERENCE TO MULTIPLY DEFINED SYMBOL\r
-ERRA== 040000 ;PECULIAR ARGUMENT\r
-ERRX== 100000 ;MACRO DEFINITION ERROR\r
-ERRQ== 200000 ;QUESTIONABLE, NON-FATAL ERROR\r
-ERRORS==777760\r
-LPTSW== 000002\r
-TTYSW== 000001\r
-\r
- ;SYMBOL TABLE FLAGS\r
-SYMF== 400000 ;SYMBOL\r
-TAGF== 200000 ;TAG\r
-NOOUTF==100000 ;NO DDT OUTPUT WFW\r
-SYNF== 040000 ;SYNONYM\r
-MACF== SYNF_-1 ;MACRO\r
-OPDF== SYNF_-2 ;OPDEF\r
-PNTF== 004000 ;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE\r
-UNDF== 002000 ;UNDEFINED\r
-EXTF== 001000 ;EXTERNAL\r
-INTF== 000400 ;INTERNAL\r
-ENTF== 000200 ;ENTRY\r
-VARF== 000100 ;VARIABLE\r
-MDFF== 000020 ;MULTIPLY DEFINED\r
-SPTR== 000010 ;SPECIAL EXTERNAL POINTER\r
-SUPRBT==000004 ;SUPRESS OUTPUT TO DDT\r
-LELF== 000002 ;LEFT HAND RELOCATABLE\r
-RELF== 000001 ;RIGHT HAND RELOCATABLE\r
-\r
-LITF== 200000 ;FLAG FOR PSEUDO-OPS INVALID IN LIT'S\r
-ADDF== 100000 ;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES\r
-\r
-TNODE== 200000 ;TERMINAL NODE FOR EVALEX\r
-\fSUBTTL RUN UUO\r
-\r
-IFN CCLSW,<\r
-IFN RUNSW,< XLIST >\r
-IFE RUNSW,<\r
-;THIS CODE MUST BE IN FIRST 1K TO ALLOW MAXIMUM SPACE\r
-; FOR OVERWRITING\r
-; 74 APPEARS BECAUSE ONLY LOCS 74 AND BEYOND ARE SAVED BY "SAVE"\r
-\r
-IFN CCLSW,<NUNCOM: IOWD 0,INHERE ;WHERE TO DO IO\r
- 0 ;TERMINATE COMMAND LIST\r
-NUNGO2: IN BIN,NUNCOM ;READ FILE\r
- JRST NUNGO3 ;THERE ARE NO ERRORS\r
-NUNERR: DDTOUT NUNPNT, ;COMPLAIN\r
- EXIT ;GIVE UP\r
-NUNERM: ASCIZ /?LINKAGE ERROR/\r
-NUNGO3: SKIPE 12,INHERE+133-74 ;LOOK AT JOBCOR\r
- ;DOES JOB WANT TO RUN IN MORE CORE?\r
- CAMG 12,JOBREL ;MORE CORE THAN CURRENTLY USED?\r
- JRST NUNGO4 ;NO, GO BLT PROG\r
- CORE 12, ;ASK FOR MORE CORE\r
- JRST NUNERR ;NOT AVAILABLE\r
- JRST NUNGO4 ;GO BLT PROGRAM\r
-INHERE:\r
-\f;THIS CODE MUST BE IN FIRST 1K\r
-NUNSET: JUMPN ACDEV,.+2 ;DEVICE SPECIFIED?\r
- MOVSI ACDEV,(SIXBIT /SYS/) ;NO, USE SYSTEM DEVICE\r
- JUMPN ACEXT,.+2 ;EXT SPECIFIED?\r
- MOVSI ACEXT,(SIXBIT /SAV/) ;NO, USE "SAV"\r
- MOVEM ACDEV,NUNDEV ;DEVICE NAME TO USE\r
- OPEN BIN,NUNINI ;INIT THE DEVICE\r
- JRST EINIT ;ERROR\r
- MOVEM ACFILE,NUNDIR ;IS THE FILE AVAILABLE?\r
- HLLZM ACEXT,NUNDIR+1 ;STASH EXTENSION\r
- SETZM NUNDIR+3 ;CLEAR PPN\r
- LOOKUP BIN,NUNDIR ;LOOK FOR FILE\r
- JRST [HLRZ ACEXT,NUNDIR+1 ;WAS EXTENSION "SAV"?\r
- CAIE ACEXT,(SIXBIT /SAV/) ;...\r
- JRST ERRCF ;GO COMPLAIN\r
- MOVSI ACEXT,(SIXBIT /DMP/) ;TRY "DMP" EXTENSION\r
- JRST .-3 ] ;TRA -3,4\r
- PUSHJ PP,DELETE ;COMMAND FILE\r
- MOVE 15,NUNDIR ;GET THE NAME\r
- CALLI 15,43 ;TELL SYSTEM "SETNAM"\r
- HLRO 15,NUNDIR+3 ;GET WORD COUNT\r
- HRLM 15,NUNCOM ;STASH COUNT\r
- MOVNS 15 ;NEGATIVE COUNT\r
- MOVEI 16,73(15) ;WHERE TO STOP BLT\r
- ADDI 15,INHERE ;HOW BIG TO MAKE CORE\r
- IORI 15,1777 ;AN EVEN MULTIPLE OF 1K\r
- CORE 15, ;ASK TS EXEC FOR CORE\r
- JRST [HRROI RC,[SIXBIT /NOT ENUF CORE FOR LINKAGE@/]\r
- JRST ERRFIN ];GO COMPLAIN\r
- MOVSI NUNTOP,NUNAC\r
- BLT NUNTOP,NUNTOP ;SET ACS\r
- HRR NUNBLT,16 ;...\r
- TLNN IO,CRPGSW ;WAS RPG IN PROGRESS?\r
- TLZ NUNAOS,577000 ;NO, DON'T MAKE NEXT AN RPG\r
- JRST NUNGO2\r
-\r
-NUNAC: PHASE 0\r
-NUNGO4: MOVE NUNLAC,INHERE+74-74 ;SETUP FOR NEW DDT\r
- SETDDT NUNLAC, ;...\r
-INTERN JOBS41\r
-JOBS41=122 ;LOADER WILL GIVE MUL. DEF. GLOBAL IF CHANGED\r
-\r
-EXTERN JOB41\r
- MOVE NUNLAC,JOBS41+INHERE-74 ;RESTORE LOC 41\r
- MOVEM NUNLAC,JOB41 ;...\r
-NUNBLT: BLT NUNTOP,.-. ;MOVE PRGM TO WHERE IT BELONGS\r
- RESET ;RESET ALL I/O\r
-NUNAOS: AOS 1,JOBSA ;GET STARTING ADDR FOR RPG\r
- JRST 0(1) ;GET ON WITH THE GAME\r
-NUNPNT: NUNERM ;ERROR MESSAGE POINTER\r
-NUNTOP: XWD INHERE+1,75\r
-NUNLAC=.\r
- DEPHASE\r
-> >\r
- LIST\r
-\r
-\fIFN RUNSW,< ;ASSEMBLE IF RUN UUO IMPLEMENTED\r
-NUNSET: JUMPN ACDEV,.+2\r
- MOVSI ACDEV,(SIXBIT /SYS/) ;USE SYS IF NONE SPECIFIED\r
- MOVEM ACDEV,RUNDEV\r
-IFE STANSW,<\r
- MOVEM ACFILE,RUNFIL ;STORE FILE NAME\r
- PUSHJ PP,DELETE ;COMMAND FILE\r
- SETZM RUNPP\r
- MOVEI 16,RUNDEV ;XWD 0,RUNDEV\r
- TLNE IO,CRPGSW ;WAS RPG IN PROGRESS?\r
- HRLI 16,1 ;YES. START NEXT AT C(JOBSA)+1\r
- RUN 16, ;DO "RUN DEV:NAME"\r
-> ;IFE STANSW,\r
-IFN STANSW,<\r
- MOVEM ACFILE,RUNDEV+1\r
- SETZM RUNDEV+2\r
- SETZM RUNDEV+3\r
- SETZM RUNDEV+4\r
- TLNE IO,CRPGSW ;ARE WE DOING RPG?\r
- AOS RUNDEV+3 ;YES SET STARTING ADDRESS INCREMENT\r
- MOVEI 16,RUNDEV ;ADDRESS OF SWAPBLOCK\r
- SWAP 16,\r
-> ;IFN STANSW\r
- HALT ;SHOULDN'T RETURN. HALT IF IT DOES\r
->\r
-\r
-DELETE: HRRZ EXTMP ;IF THE EXTENSION\r
- CAIE (SIXBIT/TMP/) ;IS .TMP\r
- POPJ PP, ;RETURN.\r
- CLOSE CTL2, ;DELETE\r
- SETZB 4,5 ;THE COMMAND FILE.\r
- SETZB 6,7\r
- RENAME CTL2,4 ;\r
- JFCL\r
- POPJ PP,\r
->\r
-\fSUBTTL START ASSEMBLING\r
-\r
-ASSEMB: PUSHJ PP,INZ ;INITIALIZE FOR PASS\r
- MOVE [ASCII /.MAIN/]\r
- MOVEM TBUF\r
- MOVEI SBUF\r
- HRRM SUBTTX\r
-\r
-ASSEM1: PUSHJ PP,CHARAC ;TEST FOR FORM FEED\r
- SKIPGE LIMBO ;CRLF FLAG?\r
- JRST ASSEM1 ;YES ,IGNORE LF\r
- CAIN C,14\r
- SKIPE SEQNO\r
- JRST ASSEM2\r
- PUSHJ PP,OUTFF1\r
- PUSHJ PP,OUTLI\r
- JRST ASSEM1\r
-\r
-ASSEM2: AOS TAGINC\r
- CAIN C,"\" ;BACK-SLASH?\r
- TLZA IO,IOMAC ;YES, LIST IF IN MACRO\r
- TLO IO,IORPTC\r
- PUSHJ PP,STMNT ;OFF WE GO\r
- TLZN IO,IOENDL ;WAS STOUT PRE-EMPTED?\r
- PUSHJ PP,STOUT ;NO, POLISH OFF LINE\r
- JRST ASSEM1\r
-\r
-\fSUBTTL STATEMENT PROCESSOR\r
-\r
-STMNT: TLZ FR,INDSW!FSNSW\r
- TLZA IO,FLDSW\r
-STMNT1: PUSHJ PP,LABEL\r
-STMNT2: PUSHJ PP,ATOM ;GET THE FIRST ATOM\r
- CAIN C,35 ;"="?\r
- JRST ASSIGN ;YES\r
- CAIN C,32 ;":"?\r
- JRST STMNT1 ;YES\r
- JUMPAD STMNT7 ;NUMERIC EXPRESSION\r
- JUMPN AC0,STMN2A ;JUMP IF NON NULL FIELD\r
- SKIPN LITLVL ;ALLOW COMMA IN LITERALS\r
- CAIE C,14 ;NULL, COMMA?\r
- CAIN C,EOL ;OR END OF LINE?\r
- POPJ PP, ;YES,EXIT\r
- CAIN C,"]" ;CLOSING LITERAL?\r
- POPJ PP, ;YES\r
- JRST STMNT9 ;NO,AT LEAST SKIP ALL THIS NONSENSE\r
-\r
-STMN2A: JUMPE C,.+2\r
- TLO IO,IORPTC\r
- PUSHJ PP,MSRCH ;SEARCH FOR MACRO/OPDEF/SYN\r
- JRST STMNT3 ;NOT FOUND, TRY OP CODE\r
- LDB SDEL,[POINT 3,ARG,5]\r
- JUMPE SDEL,ERRAX ;ERROR IF NO FLAGS\r
- SOJE SDEL,OPD1 ;OPDEF IF 1\r
- SOJE SDEL,CALLM ;MACRO IF 2\r
- JRST STMNT4 ;SYNONYM, PROCESS WITH OP-CODES\r
-\r
-STMNT3: PUSHJ PP,OPTSCH ;SEARCH OP CODE TABLE\r
- JRST STMNT5 ;NOT FOUND\r
-STMNT4: HLLZ AC0,V ;PUT CODE IN AC0\r
- TRZ V,ADDF ;CLEAR ADDRESS NON-VALID FLAG\r
- TRZE V,LITF ;VALID IN LITERAL?\r
- SKIPN LITLVL ;NO, ARE WE IN A LITERAL?\r
- JRST 0(V) ;NO, GO TO APPROPRIATE PROCESSOR\r
- POPJ PP, ;YES,EXIT\r
-\r
-STMNT5: PUSHJ PP,SSRCH ;TRY SYMBOLS\r
- JRST STMNT8 ;NOT FOUND\r
- TLNE ARG,EXTF!UNDF ;EXTERNAL OR UNDEFINED?\r
- JRST STMNT7 ;YES, PROCESS IN EVALEX\r
- TLNN RC,-2 ;CHECK FOR EXTERNAL\r
- TRNE RC,-2\r
- JRST STMNT7\r
- MOVE AC0,V ;FOUND, PUT VALUE IN AC0\r
- TLO IO,NUMSW ;FLAG AS NUMERIC\r
-STMNT7: TLZ IO,IORPTC\r
-STMNT9: PUSHJ PP,EVALHA ;EVALUATE EXPRESSION\r
-IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>\r
- TLNE FR,FSNSW ;FIELD SEEN?\r
- JRST STOW ;YES,STOW THE CODE AND EXIT\r
- CAIE C,"]"-40 ;CLOSING LITERAL?\r
- TRO ER,ERRQ ;NO, GIVE "Q" ERROR\r
- POPJ PP, ;EXIT\r
-\r
-\fSTMNT8: MOVEI V,0 ;ALWAYS START SCAN WITH 0\r
- CAIL V,CALNTH ;END OF TABLE?\r
- JRST STMN8C ;YES, TRY TTCALLS\r
- CAME AC0,CALTBL(V) ;FOUND IT?\r
- AOJA V,.-3 ;NO,TRY AGAIN\r
- SUBI V,NEGCAL ;CALLI'S START AT -1\r
- HRLI V,(CALLI) ;PUT IN UUO\r
-STMN8D: MOVSI ARG,OPDF ;SET FLAG FOR OPDEF\r
-STMN8B: PUSHJ PP,INSERT ;PUT OPDEF IN TABLE\r
- JRST OPD ;AND TREAT AS OPDEF\r
-\r
-STMN8C: SETZ V, ;START WITH ZERO\r
- CAIL V,TTCLTH ;END OF TABLE?\r
- JRST STMN8A ;YES, ERROR\r
- CAME AC0,TTCTBL(V) ;MATCH?\r
- AOJA V,.-3 ;NO, KEEP TRYING\r
- LSH V,5 ;PUT IN AC FIELD (RIGHT HALF)\r
- HRLZI V,<(TTCALL)>(V) ;PUT UUO IN LEFT HALF\r
- JRST STMN8D ;SET OPDEF FLAG\r
-\r
-STMN8A: SETZB V,RC ;CLEAR VALUE AND RELOCATION\r
- TRO ER,ERRO ;FLAG AS UNDEFINED OP-CODE\r
- JUMP1 OPD ;TREAT AS STANDARD OP ON PASS1\r
- MOVSI ARG,OPDF!UNDF!EXTF ;SET A FEW FLAGS\r
- JRST STMN8B ;TO FORCE OUT A MESSAGE\r
-\r
- ;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT)\r
- ;UNTIL A LINE TERMINATOR IS SEEN.\r
-STOUTS: TLOA IO,IOENDL!IORPTC\r
-STOUT: TLO IO,IORPTC\r
- PUSHJ PP,BYPAS1\r
- CAIN C,14 ;COMMA?\r
- SKIPL STPX ;YES, ERROR IF CODE STORED\r
- CAIN C,EOL\r
- TLOA IO,IORPTC\r
- TRO ER,ERRQ\r
-STOUT1: PUSHJ PP,CHARAC\r
- CAIG C,CR\r
- CAIG C,HT\r
- JRST STOUT1\r
- JRST OUTLIN ;OUTPUT THE LINE (BIN AND LST)\r
-\f SUBTTL LABEL PROCESSOR\r
- \r
-LABEL: JUMPAD LABEL4 ;COMPARE IF NON-SYMBOLIC\r
- JUMPE AC0,LABEL5 ;ERROR IF BLANK\r
- TLO IO,DEFCRS ;THIS IS A DEFINITION\r
- PUSHJ PP,SSRCH ;SEARCH FOR OPERAND\r
- MOVSI ARG,SYMF!UNDF!TAGF ;NOT FOUND\r
- TLNN ARG,EXTF ;OPERAND FOUND (SKIP EXIT)\r
- JRST LABEL0\r
- JUMP1 LABEL3 ;ERROR ON PASS1\r
- TLNN ARG,UNDF ;UNDEFINED ON PASS1\r
- JRST LABEL3 ;NO, FLAG ERROR\r
- TLZ ARG,EXTF!PNTF ;TURN OFF EXT FLAG NOW\r
-LABEL0: TLZN ARG,UNDF!VARF ;WAS IT PREVIOUSLY DEFINED?\r
- JRST LABEL2 ;YES, CHECK EQUALITY\r
- MOVE V,LOCA ;WFW\r
- MOVE RC,MODA\r
- TLO ARG,TAGF\r
- PUSHJ PP,PEEK ;GET NEXT CHAR.\r
- CAIE C,":" ;SPECIAL CHECK FOR ::\r
- JRST LABEL1 ;NO MATCH\r
- TLO ARG,INTF ;MAKE IT INTERNAL\r
- PUSHJ PP,GETCHR ;PROCESS NEXT CHAR.\r
- PUSHJ PP,PEEK ;PREVIEW NEXT CHAR.\r
-LABEL1: CAIE C,"!" ;HALF-KILL SIGN\r
- JRST LABEL6 ;NO\r
- TLO ARG,NOOUTF ;YES, SUPPRESS IT\r
- PUSHJ PP,GETCHR ;AND GET RID OF IT\r
-LABEL6: MOVEM AC0,TAG ;SAVE FOR PASS 1 ERRORS\r
- HLLZS TAGINC ;ZERO INCREMENT\r
- JRST INSERT ;INSERT/UPDATE AND EXIT\r
-\r
-LABEL2: HRLOM V,LOCBLK ;SAVE LIST LOCATION\r
- CAMN V,LOCA ;DOES IT COMPARE WITH PREVIOUS? WFW\r
- CAME RC,MODA\r
-LABEL3: TLOA ARG,MDFF ;NO, FLAG MULTIPLY DEFINED AND SKIP\r
- JRST LABEL7 ;YES, GET RID OF EXTRA CHARS.\r
- TRO ER,ERRM ;FLAG MULTIPLY DEFINED ERROR \r
- JRST UPDATE ;UPDATE AND EXIT\r
-\r
-LABEL4: CAMN AC0,LOCA ;DO THEY COMPARE?\r
- CAME RC,MODA\r
-LABEL5: TRO ER,ERRP ;NO, FLAG PHASE ERROR\r
- POPJ PP,\r
-\r
-LABEL7: SKIPE LITLVL ;LABEL IN A LITERAL?\r
- MOVEM AC0,LITLBL ;YES, SAVE LABEL NAME FOR LATER\r
- PUSHJ PP,PEEK ;INSPECT A CHAR.\r
- CAIN C,":" ;COLON?\r
- PUSHJ PP,GETCHR ;YES, DISPOSE OF IT\r
- PUSHJ PP,PEEK ;EXAMINE ONE MORE CHAR.\r
- CAIN C,"!" ;EXCLAMATION?\r
- JRST GETCHR ;YES, INDEED\r
-\f POPJ PP,\r
-\fSUBTTL ATOM PROCESSOR\r
-ATOM: PUSHJ PP,CELL ;GET FIRST CELL\r
- TLNE IO,NUMSW ;IF NON-NUMERIC\r
-ATOM1: CAIE C,42 ;OR NOT A BINARY SHIFT,\r
- POPJ PP, ;EXIT\r
-\r
- PUSH PP,AC0 ;STACK REGISTERS, ITS A BINARY SHIFT\r
- PUSH PP,AC1\r
- PUSH PP,RC\r
- PUSH PP,RX\r
- HRRI RX,^D10 ;COMPUTE SHIFT RADIX 10\r
- PUSHJ PP,CELLSF ;GET SHIFT\r
- MOVE ARG,RC ;SAVE RELOCATION\r
- POP PP,RX ;RESTORE REGISTERS\r
- POP PP,RC\r
- POP PP,AC1\r
- MOVN SX,AC0 ;USE NEGATIVE OF SHIFT\r
- POP PP,AC0\r
- JUMPN ARG,NUMER2 ;IF NOT ABSOLUTE\r
- TLNN IO,NUMSW ;AND NUMERIC,\r
- JRST NUMER2 ;FLAG ERROR\r
- LSHC AC0,^D35(SX)\r
- LSH RC,^D35(SX)\r
- JRST ATOM1 ;TEST FOR ANOTHER\r
-\fCELLSF: TLO IO,FLDSW\r
-CELL: SETZB AC0,RC ;CLEAR RESULT AND RELOCATION\r
- SETZB AC1,AC2 ;CLEAR WORK REGISTERS\r
- MOVEM PP,PPTEMP ;SAVE PUSHDOWN POINTER\r
- TLZ IO,NUMSW\r
- TLZA FR,NEGSW!DCFSW!RADXSW\r
-\r
-CELL1: TLO IO,FLDSW\r
- PUSHJ PP,BYPASS\r
- LDB V,[POINT 4,CSTAT(C),14] ;GET CODE\r
- XCT .+1(V) ;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE\r
- JRST CELL1 ;0; BLANK, (TAB OR "+")\r
- JRST LETTER ;1; LETTER ] $ % ( ) , ; >\r
- TLC FR,NEGSW ;2; "-"\r
- TLO FR,INDSW ;3; "@"\r
- JRST NUM1 ;4; NUMERIC 0 - 9\r
- JRST ANGLB ;5; "<"\r
- JRST SQBRK ;6; "["\r
- JRST QUOTES ;7; ""","'" \r
- JRST QUAL ;10; "^"\r
- JRST PERIOD ;11; "."\r
- TROA ER,ERRQ ;12; ERROR, FLAG AND TREAT AS DELIMITER\r
- ;12; ! # & * / : = ? \ _\r
-\fLETTER: TLOA AC2,(POINT 6,AC0,) ;SET BYTE POINTER\r
-LETTE1: PUSHJ PP,GETCHR ;GET CHARACTER\r
- TLNN CS,6 ;ALPHA-NUMERIC?\r
- JRST LETTE3 ;NO,TEST FOR VARIABLE\r
- TLNE AC2,770000 ;STORE ONLY SIX BYTES\r
-LETTE2: IDPB C,AC2 ;RETURN FROM PERIOD\r
- JRST LETTE1\r
-\r
-LETTE3: CAIE C,03 ;"#"?\r
- POPJ PP,\r
- JUMPE AC0,POPOUT ;TEST FOR NULL\r
- PUSHJ PP,PEEK ;PEEK AT NEXT CHAR.\r
- CAIN C,"#" ;IS IT 2ND #?\r
- JRST LETTE4 ;YES, THEN IT'S AN EXTERN\r
- TLO IO,DEFCRS\r
- PUSHJ PP,SSRCH ;YES, SEARCH FOR SYMBOL (OPERAND)\r
- MOVSI ARG,SYMF!UNDF ;NOT FOUND, FLAGAS UNDEFINED SYM.\r
- TLNN ARG,UNDF ;UNDEFINED?\r
- JRST GETCHR ;NO, GET NEXT CHAR AND RETURN\r
- TLO ARG,VARF ;YES, FLAG AS A VARIABLE\r
- TRO ER,ERRU ;SET UNDEFINED ERROR FLAG\r
- PUSHJ PP,INSERZ ;INSERT IT WITH A ZERO VALUE\r
- JRST GETDEL\r
-\r
-LETTE4: PUSHJ PP,GETCHR ;AND SCAN PAST IT\r
- PUSHJ PP,GETCHR ;GET RID OF #\r
- JRST EXTER1 ;PUT IN SYMBOL TABLE\r
-\r
-NUMER1: SETZB AC0,RC ;RETURN ZERO\r
-NUMER2: TRO ER,ERRN ;FLAG ERROR\r
-\r
-GETDEL: PUSHJ PP,BYPASS\r
-GETDE1: JUMPE C,.-1\r
- MOVEI AC1,0\r
-GETDE3: TLO IO,NUMSW!FLDSW ;FLAG NUMERIC\r
- TLNN FR,NEGSW ;IS ATOM NEGATIVE?\r
- POPJ PP, ;NO, EXIT\r
- JUMPE AC1,GETDE2\r
- MOVNS AC1\r
- TDCA AC0,[-1]\r
-GETDE2: MOVNS AC0 ;YES, NEGATE VALUE\r
- MOVNS RC ;AND RELOCATION\r
-POPOUT: POPJ PP, ;EXIT\r
-\fQUOTES: CAIE C,"'"-40 ;IS IT "'"\r
- JRST QUOTE ;NO MUST BE """\r
- JRST SQUOTE ;YES\r
-\r
-QUOTE0: TLNE AC0,376000 ;5 CHARACTERS STORED ALREADY?\r
- TRO ER,ERRQ ;YES, GIVE WARNING\r
- ASH AC0,7\r
- IOR AC0,C\r
-QUOTE: PUSHJ PP,CHARAC ;GET 7-BIT ASCII\r
- CAIG C,15 ;TEST FOR LF, VT, FF OR CR\r
- CAIGE C,12\r
- JRST .+2 ;NO, SO ALL IS WELL\r
- JRST QUOTE2 ;ESCAPE WITH Q ERROR\r
- CAIE C,42\r
- JRST QUOTE0\r
- PUSHJ PP,PEEK ;LOOK AT NEXT CHAR.\r
- CAIE C,42\r
- JRST QUOTE1 ;RESTORE REPEAT LEVEL AND QUIT\r
- PUSHJ PP,CHARAC ;GET NEXT CHAR.\r
- JRST QUOTE0 ;USE IT\r
-\r
-QUOTE2: TRO ER,ERRQ ;SET Q ERROR\r
-QUOTE1: JRST GETDEL\r
-\r
-SQUOT0: TLNE AC0,770000 ;SIX CHARS. STORED ALREADY ?\r
- TRO ER,ERRQ ;YES\r
- LSH AC0,6\r
- IORI AC0,-40(C) ;OR IN SIXBIT CHAR.\r
-\r
-SQUOTE: PUSHJ PP,CHARAC\r
- CAIG C,CR\r
- CAIGE C,LF\r
- JRST .+2\r
- JRST QUOTE1\r
- CAIE C,"'"\r
- JRST SQUOT0\r
- PUSHJ PP,PEEK\r
- CAIE C,"'"\r
- JRST QUOTE1\r
- PUSHJ PP,CHARAC\r
- JRST SQUOT0\r
-\r
-\fQUAL: PUSHJ PP,BYPAS1 ;SKIP BLANKS, GET NEXT CHARACTER\r
- CAIN C,42 ;"B"?\r
- JRST QUAL2 ;YES, RADIX=D2\r
- CAIN C,57 ;"O"?\r
- JRST QUAL8 ;YES, RADIX=D8\r
- CAIN C,46 ;"F"?\r
- JRST NUMDF ;YES, PROCESS DECIMAL FRACTION\r
- CAIN C,54 ;"L"?\r
- JRST QUALL ;YES\r
- CAIE C,44 ;"D"?\r
- JRST NUMER1 ;NO, FLAG NUMERIC ERROR\r
- ADDI AC2,2\r
-QUAL8: ADDI AC2,6\r
-QUAL2: ADDI AC2,2\r
- PUSH PP,RX\r
- HRR RX,AC2\r
- PUSHJ PP,CELLSF\r
-QUAL2A: POP PP,RX\r
- TLNN IO,NUMSW\r
- JRST NUMER1\r
- JRST GETDE1\r
-\r
-QUALL: PUSH PP,FR\r
- PUSHJ PP,CELLSF\r
- MOVE AC2,AC0\r
- MOVEI AC0,^D36\r
- JUMPE AC2,QUAL2A\r
- LSH AC2,-1\r
- SOJA AC0,.-2\r
-\fSUBTTL LITERAL PROCESSOR\r
-\r
-SQBRK: PUSH PP,FR\r
- PUSH PP,EXTPNT ;ALLOW EXTERN TO PRECEDE LIT IN XWD\r
- SETZM EXTPNT\r
- SKIPE LITLVL ;SAVE SEQNO AND PAGE IF NOT IN LIT ALREADY\r
- JRST SQB5\r
- MOVE C,SEQNO2\r
- MOVEM C,LITSEQ\r
- MOVE C,PAGENO\r
- MOVEM C,LITPG\r
-SQB5: JSP AC2,SVSTOW\r
-SQB3: PUSHJ PP,STMNT\r
- CAIN C,75 ;CHECK FOR ]\r
- JRST SQB1\r
- TLO IO,IORPTC\r
- TLNE FR,MWLFLG ;CALL IT ] IF NOT MULTI-WORD FLAG\r
- JRST SQB2 ;BUT REPEAT LAST CHARACTER\r
- PUSHJ PP,BYPAS1\r
- CAIN C,EOL\r
- TLOA IO,IORPTC\r
- TRO ER,ERRQ\r
-SQB4: PUSHJ PP,CHARAC\r
- CAIN C,";" ;COMMENT?\r
- JRST SQB6 ;YES, IGNORE SQUARE BRACKETS\r
- CAIN C,"]" ;LOOK FOR TERMINAL SQB\r
- TRNN ER,ERRORS ;IN CASE OF ERROR IN LITERAL\r
- JRST .+2 ;NO ALL IS WELL\r
- JRST SQB1 ;FINISH THE LITERAL NOW!!\r
- CAIG C,CR ;LOOK FOR END OF LINE\r
- CAIN C,HT\r
- JRST SQB4\r
-SQB4A: PUSHJ PP,OUTIML ;DUMP\r
- PUSHJ PP,CHARAC ;GET ANOTHER CHAR.\r
- SKIPL LIMBO ;CRLF FLAG\r
- TLO IO,IORPTC ;NO REPEAT\r
- JRST SQB3\r
-\r
-SQB6: PUSHJ PP,CHARAC ;GET A CHARACTER\r
- CAIG C,CR\r
- CAIN C,HT ;LOOK FOR END OF LINE CHAR.\r
- JRST SQB6 ;NOT YET\r
- JRST SQB4A ;GOT IT\r
-\r
-SQB1: TLZ IO,IORPTC\r
-SQB2: PUSHJ PP,STOLIT\r
- JSP AC2,GTSTOW\r
- SKIPE LITLBL ;NEED TO FIXUP A LABEL?\r
- PUSHJ PP,RELBLE ;YES, USE LOC OF LITERAL\r
- POP PP,EXTPNT\r
- POP PP,FR\r
- SKIPE LITLVL ;WERE WE NESTED?\r
- JUMP1 NUMER2 ;YES, FORCE ERROR IF PASS 1\r
- JRST GETDEL\r
-\r
-RELBLE: PUSH PP,AC0 ;SAVE LOCATION COUNTER\r
- PUSH PP,RC ;AND RELOCATION\r
- MOVE AC0,LITLBL ;SYMBOL WE NEED\r
- SETZM LITLBL ;ZERO INDICATOR\r
- PUSHJ PP,SSRCH ;SEARCH FOR OPERAND\r
- JRST RELBL1 ;SHOULD NEVER HAPPEN\r
- TLNN ARG,TAGF ;IT BETTER BE A LABEL\r
- JRST RELBL1 ;IT WASN'T , GIVE UP BEFORE SOME HARM IS DONE\r
- TLZ ARG,UNDF!EXTF!PNTF ;CLEAR FLAGS NOW\r
- POP PP,RC ;GET LITERAL RELOCATION\r
- MOVE V,(PP) ;GET VALUE (LOC COUNTER)\r
- PUSHJ PP,UPDATE ;UPDATE VALUE\r
- POP PP,AC0 ;RESTORE LITERAL COUNT\r
- POPJ PP, ;RETURN\r
- \r
-RELBL1: POP PP,RC ;RESTORE RC\r
- POP PP,AC0 ;AND AC0\r
- POPJ PP, ;JUST RETURN\r
-\fANGLB: PUSH PP,FR\r
- TLZ FR,INDSW\r
- PUSHJ PP,ATOM\r
- TLNN IO,NUMSW\r
- CAIE C,35\r
- JRST ANGLB1\r
- PUSHJ PP,ASSIG1\r
- MOVE AC0,V\r
- JRST ANGLB2\r
-\r
-ANGLB1: PUSHJ PP,EVALHA\r
-ANGLB2: POP PP,FR\r
- CAIE C,36\r
- TRO ER,ERRN\r
- JRST GETDEL\r
-\r
-PERIOD: PUSHJ PP,GETCHR ;LOOK AT NEXT CHARACTER\r
- TLNN CS,2 ;ALPHABETIC?\r
- JRST PERNUM ;NO, TEST NUMERIC\r
- MOVSI AC0,(SIXBIT /./) ;YES, PUT PERIOD IN AC0\r
- MOVSI AC2,(POINT 6,AC0,5) ;SET BYTE POINTER\r
- JRST LETTE2 ;AND TREAT AS SYMBOL\r
-\r
-PERNUM: TLNE CS,4 ;IS IT A NUMBER\r
- JRST NUM32 ;YES\r
- MOVE AC0,LOCA ;NO. CURRENT LOC SYMBOL (.)\r
- MOVE RC,MODA ;SET TO CURRENT ASSEMBLY MODE\r
- JRST GETDE1 ;GET DELIMITER\r
-NUMDF: TLO FR,DCFSW ;SET DECIMAL FRACTION FLAG\r
-NUM: PUSHJ PP,GETCHR ;GET A CHARACTER\r
- TLNN CS,4 ;NUMERIC?\r
- JRST NUM10 ;NO\r
-NUM1: SUBI C,20 ;CONVERT TO OCTAL\r
- PUSH PP,C ;STACK FOR FLOATING POINT\r
- MOVE AC0,AC1\r
- MULI AC0,0(RX)\r
- ADD AC1,C ;ADD IN LAST VALUE\r
- CAIL C,0(RX) ;IS NUMBER LESS THAN CURRENT RADIX?\r
- TLO FR,RADXSW ;NO, SET FLAG\r
- AOJA AC2,NUM ;YES, AC2=NO. OF DECIMAL PLACES\r
-\r
-\fNUM10: CAIE C,16 ;PERIOD?\r
- TLNE FR,DCFSW ;OR DECIMAL FRACTION?\r
- JRST NUM30 ;YES, PROCESS FLOATING POINT\r
- LSH AC1,1 ;NO, CLEAR THE SIGN BIT\r
- LSHC AC0,^D35 ;AND SHIFT INTO AC0\r
- MOVE PP,PPTEMP ;RESTORE PP\r
- SOJE AC2,GETDE1 ;NO RADIX ERROR TEST IF ONE DIGIT\r
- TLNE FR,RADXSW ;WAS ILLEGAL NUMBER ENCOUNTERED?\r
- TRO ER,ERRN ;YES, FLAG N ERROR\r
- JRST GETDE1\r
-\r
-NUM30: CAIE C,"B"-40 ;IF "B" THEN MISSING "."\r
-NUM31: PUSHJ PP,GETCHR\r
- TLNN CS,4 ;NUMERIC?\r
- JRST NUM40 ;NO\r
-NUM32: SUBI C,20\r
- PUSH PP,C\r
- JRST NUM31\r
-\r
-NUM40: PUSH PP,FR ;STACK VALUES\r
- HRRI RX,^D10\r
- PUSH PP,AC2\r
- PUSH PP,PPTEMP\r
- CAIN C,45 ;"E"?\r
- JRST [PUSHJ PP,PEEK ;GET NEXT CHAR\r
- PUSH PP,C ;SAVE NEXT CHAR\r
- PUSHJ PP,CELL ;YES, GET EXPONENT\r
- POP PP,C ;GET FIRST CHAR. AFTER E\r
- CAIN V,4 ;MUST HAVE NUMERICAL STATUS\r
- JRST .+2 ;SKIP RETURN\r
- CAIN C,"<" ;ALLOW <EXP>\r
- JRST .+2 ;SKIP RETURN\r
- SKIPN AC0 ;ERROR IF NON-ZERO EXPRESSION\r
- TROA ER,ERRQ ;ALLOW E+,E-\r
- SETOM RC ;FORCE NUMERICAL ERROR\r
- JRST .+2] ;SKIP RETURN\r
- MOVEI AC0,0 ;NO, ZERO EXPONENT\r
- POP PP,PPTEMP\r
- POP PP,SX\r
- POP PP,FR\r
- HRRZ V,PP\r
- MOVE PP,PPTEMP\r
- JUMPN RC,NUMER1 ;EXPONENT MUST BE ABSOLUTE\r
- ADD SX,AC0\r
- HRRZ ARG,PP\r
- ADD SX,ARG\r
- SETZB AC0,AC2\r
- TLNE FR,DCFSW\r
- JRST NUM60\r
- JOV NUM50 ;CLEAR OVERFLOW FLAG\r
-\f\r
-NUM50: JSP SDEL,NUMUP ;FLOATING POINT\r
- JRST NUM52 ;END OF WHOLE NUMBERS\r
- FMPR AC0,[10.0] ;MULTIPLY BY 10\r
- TLO AC1,233000 ;CONVERT TO FLOATING POINT\r
- FADR AC0,AC1 ;ADD IT IN\r
- JRST NUM50\r
-\r
-NUM52: JSP SDEL,NUMDN ;PROCESS FRACTION\r
- FADR AC0,AC2\r
- JOV NUMER1 ;TEST FOR OVERFLOW\r
- JRST GETDE1\r
-\r
- TLO AC1,233000\r
- TRNE AC1,-1\r
- FADR AC2,AC1 ;ACCUMULATE FRACTION\r
- FDVR AC2,[10.0]\r
- JRST NUM52\r
-\r
-NUM60: JSP SDEL,NUMUP\r
- JRST NUM62\r
- IMULI AC0,^D10\r
- ADD AC0,AC1\r
- JRST NUM60\r
-\r
-NUM62: LSHC AC1,-^D36\r
- JSP SDEL,NUMDN\r
- LSHC AC1,^D37\r
- PUSHJ PP,BYPAS2\r
- JRST GETDE3\r
-\r
- DIVI AC1,^D10\r
- JRST NUM62\r
-\r
-NUMUP: MOVEI AC1,0\r
- CAML ARG,SX\r
- JRST 0(SDEL)\r
- CAMGE ARG,V\r
- MOVE AC1,1(ARG)\r
- AOJA ARG,1(SDEL)\r
-\r
-NUMDN: MOVEI AC1,0\r
- CAMG V,SX\r
- JRST 0(SDEL)\r
- CAMLE V,ARG\r
- MOVE AC1,0(V)\r
- SOJA V,3(SDEL)\r
-\fSUBTTL GETSYM\r
-GETSYM: MOVEI AC0,0 ;CLEAR AC0\r
- MOVSI AC1,(POINT 6,AC0) ;PUT POINTER IN AC1\r
- PUSHJ PP,BYPASS ;SKIP LEADING BLANKS\r
- TLNN CS,2 ;ALPHABETIC?\r
- JRST GETSY1 ;NO, ERROR\r
- CAIE C,16 ;PERIOD?\r
- JRST GETSY2 ;NO, A VALID SYMBOL\r
- IDPB C,AC1 ;STORE THE CHARACTER\r
- PUSHJ PP,GETCHR ;YES, TEST NEXT CHARACTER\r
- TLNN CS,2 ;ALPHABETIC?\r
-GETSY1: TROA ER,ERRA\r
-GETSY2: AOS 0(PP) ;YES, SET SKIP EXIT\r
-GETSY3: TLNN CS,6 ;ALPHA-NUMERIC?\r
- JRST BYPAS2 ;NO, GET DELIMITER\r
- TLNE AC1,770000 ;YES, HAVE WE STORED SIX?\r
- IDPB C,AC1 ;NO, STORE IT\r
- PUSHJ PP,GETCHR\r
- JRST GETSY3\r
-\r
-\fSUBTTL EXPRESSION EVALUATOR\r
-CV== AC0 ;CURRENT VALUE\r
-PV== AC1 ;PREVIOUS VALUE\r
-RC== RC ;CURRENT RELOCATABILITY\r
-PR== AC2 ;PREVIOUS RELOCATABILITY\r
-CS= CS ;CURRENT STATUS\r
-PS== SDEL ;PREVIOUS STATUS\r
-\r
-EVALHA: TLO FR,TMPSW\r
-EVALCM: PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION\r
- PUSH PP,[0] ;MARK PDL\r
- JUMPCM EVALC3 ;JUMP IF COMMA\r
- TLO IO,IORPTC ;IT'S NOT,SO REPEAT\r
- JRST OP ;PROCESS IN OP\r
-EVALC3:\r
-IFN FORMSW,<PUSH PP,INFORM ;PUT FORM WORD ON STACK>\r
- PUSH PP,[0] ;STORE ZERO'S ON PDL\r
- PUSH PP,[0] ;.......\r
- MOVSI AC2,(POINT 4,(PP),12)\r
- JRST OP1B ;PROCESS IN OP\r
-\r
-EVALEX: TLO IO,FLDSW\r
- PUSH PP,[XWD TNODE,0] ;MARK THE LIST 200000,,0\r
- TLZN FR,TMPSW\r
-EVATOM: PUSHJ PP,ATOM ;GET THE NEXT ATOM\r
- JUMPE AC0,EVGETD ;TEST FOR NULL/ZERO\r
- TLOE IO,NUMSW ;SET NUMERIC, WAS IT PREVIOUSLY?\r
- JRST EVGETD+1 ;YES, TREAT ACCORDINGLY\r
- PUSHJ PP,SEARCH ;SEARCH FOR MACRO OR SYMBOL\r
- JRST EVOP ;NOT FOUND, TRY FOR OP-CODE\r
- JUMPL ARG,.+2 ;SKIP IF OPERAND\r
- PUSHJ PP,SSRCH1 ;OPERATOR, TRY FOR SYMBOL (OPERAND)\r
- PUSHJ PP,QSRCH ;PERFORM CROSS-REFERENCE\r
- JUMPG ARG,EVMAC ;BRANCH IF OPERATOR\r
- MOVE AC0,V ;SYMBOL, SET VALUE\r
- JRST EVTSTS ;TEST STATUS\r
-\r
-EVMAC: TLNE FR,NEGSW ;UNARY MINUS?\r
- JRST EVERRZ ;YES, INVALID BEFORE OPERATOR\r
- LDB SDEL,[POINT 3,ARG,5] ;GET MACF/OPDF/SYNF\r
- SOJL SDEL,EVERRZ ;ERROR IF NO FLAGS\r
-\r
- JUMPE C,.+2 ;NON-BLANK?\r
- TLO IO,IORPTC ;YES, REPEAT CHARACTER\r
- SOJE SDEL,CALLM ;MACRO IF 2\r
- JUMPG SDEL,EVOPS ;SYNONYM IF 4\r
-\r
- MOVE AC0,V ;OPDEF\r
- MOVEI V,OP ;SET TRANSFER VECTOR\r
- JRST EVOPD\r
-\fEVOP: TLNE FR,NEGSW ;OPCODE, UNARY MINUS?\r
- JRST EVERRZ ;YES, ERROR\r
-\r
- PUSHJ PP,OPTSCH ;SEARCH SYMBOL TABLE\r
- JRST EVOPX ;NOT FOUND\r
-EVOPS: TRZ V,LITF ;CLEAR LIT INVALID FLAG\r
- TRZE V,ADDF ;SYNONYM\r
- JRST EVOPX ;PSEUDO-OP THAT GENERATES NO DATA JUMPS\r
- HLLZ AC0,V\r
-EVOPD: JUMPE C,.+2 ;OPDEF, NON-BLANK DELIMITER?\r
- TLO IO,IORPTC ;YES, REPEAT CHARACTER\r
- JSP AC2,SVSTOW\r
- PUSHJ PP,0(V)\r
- PUSHJ PP,DSTOW\r
- JSP AC2,GTSTOW\r
- TRNE RC,-2\r
- HRRM RC,EXTPNT\r
- TLNE RC,-2\r
- HLLM RC,EXTPNT\r
- JRST EVNUM\r
-\r
-EVOPX: MOVSI ARG,SYMF!UNDF\r
- PUSHJ PP,INSERZ\r
-EVERRZ: SETZB AC0,RC ;CLEAR CODE AND RELOCATION\r
-EVERRU: TRO ER,ERRU\r
- JRST EVGETD\r
-\fEVTSTS: TLNE ARG,UNDF\r
- JRST [TRO ER,ERRU ;SET UNDEF ERROR\r
- JUMP1 EVGETD ;TREAT AS UNDF ON PASS1\r
- JRST .+1] ;TREAT AS EXTERNAL ON PASS2\r
- TLNN ARG,EXTF\r
- JRST EVTSTR\r
- HRRZ RC,ARG ;GET ADRES WFW\r
- HRRZ ARG,EXTPNT ;SAVE IT WFW\r
- HRRM RC,EXTPNT ;WFW\r
- TRNE ARG,-1 ;WFW\r
- TRO ER,ERRE\r
- SETZB AC0,ARG\r
-\r
-EVTSTR: TLNE ARG,MDFF ;MULTIPLY DEFINED?\r
- TRO ER,ERRD ;YES, FLAG IT\r
- TLNE FR,NEGSW ;NEGATIVE ATOM?\r
- PUSHJ PP,GETDE2 ;YES, NEGATE AC0 AND RC\r
-\r
-EVGETD: TLNE IO,NUMSW ;NON BLANK FIELD\r
- TLO FR,FSNSW ;YES,SET FLAG\r
- PUSHJ PP,BYPAS2\r
- TLNE CS,6 ;ALPHA-NUMERIC?\r
- TLO IO,IORPTC ;YES, REPEAT IT\r
-EVNUM: POP PP,PS ;POP THE PREVIOUS DELIMITER/TNODE\r
- TLO PS,4000\r
- CAMGE PS,CS ;OPERATION REQUIRED?\r
- JRST EVPUSH ;NO, PUT VALUES BACK ON STACK\r
- TLNN PS,TNODE ;YES, HAVE WE REACHED TERMINAL NODE?\r
- JRST EVXCT ;NO, EXECUTION REQUIRED\r
- TLNN CS,170000 ;YES, ARE WE POINTING AT DEL? (& ! * / + - _)\r
- POPJ PP, ;YES, EXIT\r
- ;NO,FALL INTO EVPUSH\r
-\r
-\fEVPUSH: PUSH PP,PS ;STACK VALUES\r
- PUSH PP,CV\r
- PUSH PP,RC\r
- PUSH PP,CS\r
- JRST EVATOM ;GET NEXT ATOM\r
-\r
-EVXCT: POP PP,PR ;POP PREVIOUS RELOCATABILITY\r
- POP PP,PV ;AND PREVIOUS VALUE\r
- LDB PS,[POINT 3,PS,29] ;TYPE OF OPERATION TO PS\r
- JRST .+1(PS) ;PERFORM PROPER OPERATION\r
- JRST ASSEM1 ;0; SHOULD NEVER GET HERE ;DMN\r
- JRST XMUL ;1;\r
- JRST XDIV ;2;\r
- JRST XADD ;3;\r
- JRST XSUB ;4;\r
- JRST XLRW ;5; "_"\r
- TDOA CV,PV ;6; MERGE PV INTO CV\r
- AND CV,PV ;7; AND PV INTO CV\r
- JUMPN RC,.+2 ;COMMON RELOCATION TEST\r
-EVXCT1: JUMPE PR,EVNUM\r
- TRO ER,ERRR ;BOTH MUST BE FIXED\r
- JRST EVNUM ;GO TRY AGAIN\r
-\r
-XSUB: SUBM PV,CV\r
- SUBM PR,RC\r
- JRST EVNUM\r
-\r
-XADD: ADDM PV,CV\r
- ADDM PR,RC\r
- JRST EVNUM\r
-\r
-XDIV: IDIV PR,CV ;CORRECT RELOCATABILITY\r
- IDIVM PV,CV\r
-XDIV1: EXCH PR,RC ;TAKE RELOCATION OF NUMERATOR\r
- JRST EVXCT1\r
-\r
-XMUL: JUMPE PR,XMUL1 ;AT LEAST ONE OPERAND\r
- JUMPE RC,XMUL1 ;MUST BE FIXED\r
- TRO ER,ERRR\r
-XMUL1: IORM PR,RC ;GET RELOCATION TO RC\r
- CAMGE PV,CV ;FIND THE GREATER\r
- EXCH PV,CV ;FIX IN CASE CV=0,OR 1\r
- IMULM PV,RC\r
- IMULM PV,CV\r
- JRST EVNUM\r
-XLRW: EXCH PV,CV\r
- LSH CV,0(PV)\r
- LSH PR,0(PV)\r
- JRST XDIV1\r
-\f SUBTTL LITERAL STORAGE HANDLER\r
- \r
-STOLER:\r
-IFE FORMSW,< SETZB AC0,RC ;ERROR, NO CODE STORED\r
- PUSHJ PP,STOW ;STOW ZERO>\r
-IFN FORMSW,< MOVEI AC0,0\r
- PUSHJ PP,STOWZ1>\r
- TRO ER,ERRL ;AND FLAG THE ERROR\r
-\r
-STOLIT: MOVE SDEL,STPX\r
- SUB SDEL,STPY ;COMPUTE NUMBER OF WORDS\r
- JUMPE SDEL,STOLER ;ERROR IF NONE STORED\r
- TRNN ER,ERRORS ;ANY ERRORS?\r
- JRST STOL06 ;NO\r
- JUMP2 STOL22 ;YES, NO SEARCH. BRANCH IF PASS2\r
- ADDM SDEL,LITCNT ;PASS ONE, UPDATE COUNT\r
- JRST STOWI ;INITIALIZE STOW\r
-\r
-STOL06: MOVEI SX,LITAB ;PREPARE FOR SEARCH\r
- MOVE ARG,STPX ;SAVE IN THE EVENT OF MULTIPLE-WORD\r
- HRL ARG,STPY\r
- MOVE AC2,LITNUM\r
- MOVEI SDEL,0\r
-STOL08: PUSHJ PP,DSTOW ;GET VALUE WFW\r
-\r
-STOL10: SOJL AC2,STOL24 ;TEST FOR END\r
- MOVE SX,0(SX) ;NO, GET NEXT STORAGE CELL\r
- MOVE V,-1(SX) ;GET RELOCATION BITS WFW\r
- CAMN AC0,-2(SX) ;DO CODES COMPARE? WFW\r
- CAME RC,V ;YES, HOW ABOUT RELOCATION?\r
- AOJA SDEL,STOL10 ;NO, TRY AGAIN\r
- SKIPGE STPX ;YES, MULTI-WORD?\r
- JRST STOL26 ;NO, JUST RETURN LOCATION\r
- MOVEM AC2,SAVBLK+AC2 ;YES, SAVE STARTING INFO\r
- MOVEM SX,SAVBLK+SX\r
-\r
-STOL12: SOJL AC2,STOL23 ;TEST FOR END\r
- PUSHJ PP,DSTOW ;GET NEXT WORD WFW\r
- MOVE SX,0(SX) ;UPDATE POINTER\r
- MOVE V,-1(SX) ;GET RELOCATION WFW\r
- CAMN AC0,-2(SX) ;COMPARE VALUE WFW\r
- CAME RC,V ;AND RELOCATION\r
- JRST STOL14 ;NO MATCH, TRY AGAIN\r
- SKIPL STPX ;MATCH, HAVE WE FINISHED SEARCH?\r
- JRST STOL12 ;NO, TRY NEXT WORD\r
- JRST STOL26 ;YES, RETURN LOCATION\r
-\r
-STOL14: MOVE AC2,SAVBLK+AC2 ;RESTORE STOW POINTERS\r
- MOVE SX,SAVBLK+SX\r
- HRREM ARG,STPX\r
- HLREM ARG,STPY\r
- AOJA SDEL,STOL08 ;BETTER LUCK NEXT TIME\r
-\f\r
-STOL22: MOVE SDEL,LITNUM\r
-STOL23: PUSHJ PP,DSTOW ;DSTOW AND CONVERT\r
-STOL24: MOVE SX,LITABX ;GET CURRENT STORAGE\r
- PUSHJ PP,GETTOP ;GET NEXT CELL\r
- MOVEM AC0,-2(SX) ;STORE CODE WFW\r
- MOVEM RC,-1(SX) ;WFW\r
-IFN FORMSW,<\r
- MOVE AC0,FORM\r
- MOVEM AC0,-3(SX)>\r
- MOVEM SX,LITABX ;SET POINTER TO CURRENT CELL\r
- AOS LITNUM ;INCREMENT NUMBER STORED\r
- AOS LITCNT ;INCREMENT NUMBER RESERVED\r
- SKIPL STPX ;ANY MORE CODE?\r
- JRST STOL23 ;YES\r
-STOL26: JUMP1 POPOUT ;EXIT IF PASS ONE\r
- MOVE SX,LITHDX ;GET HEADER BLOCK\r
- HLRZ RC,-1(SX) ;GET BLOCK RELOCATION\r
- HRRZ AC0,-1(SX)\r
- ADDI AC0,0(SDEL) ;COMPUTE ACTUAL LOCATION\r
- POPJ PP, ;EXIT\r
-\r
-\fSUBTTL INPUT ROUTINES\r
-GETCHR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER\r
- CAIL C,"A"+40 ;CHECK FOR LOWER CASE\r
- CAILE C,"Z"+40\r
- JRST .+2 ;NOT LOWER CASE\r
-IFN STANSW,<\r
- SUBI C,40\r
- CAIN C,32\r
- MOVEI C,136 ;^\r
- CAIN C,30\r
- MOVEI C,137 ;_\r
- CAIN C,176\r
- MOVEI C,134 ;}\r
- CAIN C,140\r
- MOVEI C,100 ;@>\r
-IFE STANSW,<\r
- TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT>\r
- SUBI C,40 ;CONVERT TO SIXBIT\r
- CAIG C,77 ;CHAR GREATER THAN SIXBIT?\r
- JUMPGE C,GETCS ;TEST FOR VALID SIXBIT\r
- ADDI C,40 ;BACK TO ASCII\r
- CAIN C,HT ;CHECK FOR TAB\r
- JRST GETCS2 ;MAKE IT LOOK LIKE SPACE\r
- CAIG C,CR ;GREATER THAN CR\r
- CAIG C,HT ;GREATER THAN TAB\r
- JRST GETCS1 ;IS NOT FF,VT,LF OR CR\r
- MOVEI C,EOL ;LINE OR FORM FEED OR V TAB\r
- TLOA IO,IORPTC ;REPEAT CHARACTER\r
-GETCS2: MOVEI C,0 ;BUT TREAT AS BLANK\r
-GETCS: MOVE CS,CSTAT(C) ;GET STATUS BITS\r
- POPJ PP, ;EXIT\r
-\r
-GETCS1: JUMPE C,GETCS ;IGNORE NULS\r
- TRC C,100 ;MAKE CHAR. VISIBLE\r
- MOVEI CS,"^"\r
- DPB CS,LBUFP ;PUT ^ IN OUTPUT\r
- PUSHJ PP,RSW2 ;ALSO MODIFIED CHAR.\r
- TRO ER,ERRQ ;FLAG Q ERROR\r
- JRST GETCHR ;BUT IGNORE CHAR.\r
-\f\r
-CHARAC: TLZE IO,IORPTC ;REPEAT REQUESTED?\r
- JRST CHARAX ;YES\r
-RSW0: JUMPN MRP,MREAD ;BRANCH IF TREE POINTER SET\r
- PUSHJ PP,READ\r
-RSW1: SKIPE RPOLVL ;ARE WE IN "REPEAT ONCE"?\r
- JRST REPO1 ;YES\r
-RSW2: MOVE CS,LIMBO ;GET LAST CHAR.\r
- MOVEM C,LIMBO ;STORE THIS CHAR. FOR RPTC\r
- CAIN C,LF ;LF?\r
- CAIE CS,CR ;YES,LAST CHAR. A CR?\r
- JRST RSW3 ;NO\r
- HRROS LIMBO ;YES,FLAG\r
- POPJ PP, ;AND EXIT\r
-\r
-RSW3: TLNE IO,IOSALL ;MACRO SUPPRESS ALL?\r
- JUMPN MRP,CPOPJ ;YES,DON'T LIST IN MACRO\r
- SOSG CPL ;ANY ROOM IN THE IMAGE BUFFER?\r
- PUSHJ PP,OUTPL ;NO, OUTPUT THE PARTIAL LINE\r
- IDPB C,LBUFP ;YES, STORE IN PRINT AREA\r
- CAIE C,HT ;TAB?\r
- POPJ PP, ;NO, EXIT\r
- MOVEI C,7\r
- ANDCAM C,CPL ;MASK\r
-CHARAX: HRRZ C,LIMBO ;GET LAST CHARACTER\r
- POPJ PP, ;EXIT\r
-\r
-CHARL: PUSHJ PP,CHARAC ;GET AND TEST 7-BIT ASCII\r
- CAIG C,FF ;LINE OR FORM FEED OR VT?\r
- CAIGE C,LF\r
- POPJ PP, ;NO,EXIT\r
- SKIPE LITLVL ;IN LITERAL?\r
- JRST OUTIML ;YES\r
-CHARL1: PUSHJ PP,SAVEXS ;SAVE REGISTERS\r
- PUSHJ PP,OUTLIN ;DUMP THE LINE\r
- JRST RSTRXS ;RESTORE REGISTERS AND EXIT\r
-\fSUBTTL CHARACTER STATUS TABLE\r
-\r
- DEFINE GENCS (OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO)\r
-<BYTE (6)OPLVL (9)ATOM (3)AN (6)SQUOZ,OPTYPE,SEQNO>\r
-\r
- ;OPLVL PRIORITY OF BINARY OPERATORS\r
- ;ATOM INDEX TO JUMP TABLE AT CELL1\r
- ;AN TYPE OF CHARACTER\r
- ; 1=OTHER, 2=ALPHA, 4=NUMERIC\r
- ;SQUOZ VALUE IN RADIX 50\r
- ;OPTYPE INDEX TO JUMP TABLE AT EVXCT\r
- ;SEQNO VALUE IN SIXBIT\r
-CSTAT:\r
- GENCS 00,00,1,00,00,00 ; ' '\r
- GENCS 04,12,1,00,06,01 ; '!'\r
- GENCS 00,07,1,00,00,02 ; '"'\r
- GENCS 00,12,1,00,00,03 ; '#'\r
- GENCS 00,01,2,46,00,04 ; '$'\r
- GENCS 00,01,2,47,00,05 ; '%'\r
- GENCS 04,12,1,00,07,06 ; '&'\r
- GENCS 00,07,1,00,00,07 ; '''\r
-\r
- GENCS 00,01,1,00,00,10 ; '('\r
- GENCS 00,01,1,00,00,11 ; ')'\r
- GENCS 02,12,1,00,01,12 ; '*'\r
- GENCS 01,00,1,00,03,13 ; '+'\r
- GENCS 40,01,1,00,00,14 ; ','\r
- GENCS 01,02,1,00,04,15 ; '-'\r
- GENCS 00,11,2,45,00,16 ; '.'\r
- GENCS 02,12,1,00,02,17 ; '/'\r
-\r
- GENCS 00,04,4,01,00,20 ; '0'\r
- GENCS 00,04,4,02,00,21 ; '1'\r
- GENCS 00,04,4,03,00,22 ; '2'\r
- GENCS 00,04,4,04,00,23 ; '3'\r
- GENCS 00,04,4,05,00,24 ; '4'\r
- GENCS 00,04,4,06,00,25 ; '5'\r
- GENCS 00,04,4,07,00,26 ; '6'\r
- GENCS 00,04,4,10,00,27 ; '7'\r
-\r
- GENCS 00,04,4,11,00,30 ; '8'\r
- GENCS 00,04,4,12,00,31 ; '9'\r
- GENCS 00,12,1,00,00,32 ; ':'\r
- GENCS 00,01,1,00,00,33 ; ';'\r
- GENCS 00,05,1,00,00,34 ; '<'\r
- GENCS 00,12,1,00,00,35 ; '='\r
- GENCS 00,01,1,00,00,36 ; '>'\r
- GENCS 00,12,1,00,00,37 ; '?'\r
-\f GENCS 00,03,1,00,00,40 ; '@'\r
- GENCS 00,01,2,13,00,41 ; 'A'\r
- GENCS 00,01,2,14,00,42 ; 'B'\r
- GENCS 00,01,2,15,00,43 ; 'C'\r
- GENCS 00,01,2,16,00,44 ; 'D'\r
- GENCS 00,01,2,17,00,45 ; 'E'\r
- GENCS 00,01,2,20,00,46 ; 'F'\r
- GENCS 00,01,2,21,00,47 ; 'G'\r
-\r
- GENCS 00,01,2,22,00,50 ; 'H'\r
- GENCS 00,01,2,23,00,51 ; 'I'\r
- GENCS 00,01,2,24,00,52 ; 'J'\r
- GENCS 00,01,2,25,00,53 ; 'K'\r
- GENCS 00,01,2,26,00,54 ; 'L'\r
- GENCS 00,01,2,27,00,55 ; 'M'\r
- GENCS 00,01,2,30,00,56 ; 'N'\r
- GENCS 00,01,2,31,00,57 ; 'O'\r
-\r
- GENCS 00,01,2,32,00,60 ; 'P'\r
- GENCS 00,01,2,33,00,61 ; 'Q'\r
- GENCS 00,01,2,34,00,62 ; 'R'\r
- GENCS 00,01,2,35,00,63 ; 'S'\r
- GENCS 00,01,2,36,00,64 ; 'T'\r
- GENCS 00,01,2,37,00,65 ; 'U'\r
- GENCS 00,01,2,40,00,66 ; 'V'\r
- GENCS 00,01,2,41,00,67 ; 'W'\r
-\r
- GENCS 00,01,2,42,00,70 ; 'X'\r
- GENCS 00,01,2,43,00,71 ; 'Y'\r
- GENCS 00,01,2,44,00,72 ; 'Z'\r
- GENCS 00,06,1,00,00,73 ; '['\r
- GENCS 00,12,1,00,00,74 ; '\'\r
- GENCS 00,01,1,00,00,75 ; ']'\r
- GENCS 00,10,1,00,00,76 ; '^'\r
- GENCS 10,12,1,00,05,77 ; '_'\r
-\fSUBTTL LISTING ROUTINES\r
-\r
-OUTLIN: TRNN ER,ERRORS-ERRQ ;ANY ERRORS?\r
- TLNE FR,ERRQSW ;NO, IGNORE Q ERRORS?\r
- TRZ ER,ERRQ ;YES, YES, ZERO THE Q ERROR\r
- HRLZ AC0,ER ;PUT ERROR FLAGS IN AC0 LEFT\r
- TDZ ER,TYPERR\r
- JUMP1 OUTL30 ;BRANCH IF PASS ONE\r
- JUMPN AC0,OUTL02 ;JUMP IF ANY ERRORS TO FORCE PRINTING\r
- SKIPL STPX ;SKIP IF NO CODE, OTHERWISE\r
- JRST OUTL01 ;NO\r
- TLNN IO,IOSALL ;YES,SUPPRESS ALL?\r
- JRST OUTL03 ;NO\r
- JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO\r
- LDB C,[XWD 350700,LBUF]\r
- CAIE C,15 ;FIRST CHAR CR?\r
-OUTL01: TLZ IO,IOMAC ;FORCE MACRO PRINTING\r
-OUTL03: TLNN IO,IOMSTR!IOPROG!IOMAC\r
-OUTL02: IOR ER,OUTSW ;FORCE IT.\r
- IDPB AC0,LBUFP ;STORE ZERO TERMINATOR AFTER ASCII SRC LINE\r
- TLNN FR,CREFSW ;CREF?\r
- PUSHJ PP,CLSCRF ;YES, WRITE END OF CREF DATA (177,003)\r
- JUMPE AC0,OUTL20 ;BRANCH IF NO ERRORS\r
- TLZE AC0,ERRM ;M ERROR?\r
- TLO AC0,ERRP ;M ERROR SET - SET P ERROR.\r
- PUSHJ PP,OUTLER ;PROCESS ERRORS\r
-\r
-OUTL20: SKIPN RC,ASGBLK\r
- SKIPE CS,LOCBLK ;\r
- SKIPL STPX ;ANY BINARY?\r
- JRST OUTL23 ;YES, JUMP\r
- JUMPE RC,OUTL22 ;SEQUENCE BREAK AND NO BINARY JUMPS\r
- ILDB C,TABP ;ASSIGNMENT FALLS THROUGH\r
- PUSHJ PP,OUTL ;OUTPUT A TAB.\r
- ILDB C,TABP ;OUTPUT 2ND TAB, LOCATION FIELD\r
- PUSHJ PP,OUTC ;NEXT IS BINARY LISTING FIELD\r
- HLLO CS,LOCBLK ;LEFT HALF OF A 36BIT VALUE\r
- JUMPL RC,.+2 ;SKIP IF LEFT HALF IS NOT RELOC\r
- TRZA CS,1 ;IT IS, SET THE FLAG\r
- TLNE CS,-1 ;SKIP IF ITS A 18BIT VALUE, OTHERWISE\r
- PUSHJ PP,ONC1 ;PRINT LH OF A 36 BIT VALUE IN CS\r
- HRLO CS,LOCBLK ;PICK UP THE RIGHT HALF (18BIT VALUE)\r
- TRZ CS,0(RC) ;\r
- PUSHJ PP,ONC ;PRINT IT\r
- JRST OUTL23 ;SKIP SINGLE QUOTE TEST\r
-\fOUTL22: PUSHJ PP,ONC ;TAB TO RH AND PRINT IT\r
- MOVEI C,"'"\r
- SKIPE MODA\r
- PUSHJ PP,OUTC\r
-OUTL23: SKIPL STPX ;ANY BINARY?\r
- PUSHJ PP,BOUT ;YES, DUMP IT\r
- MOVE CS,@OUTLI2 ;[POINT 7,LBUF]\r
-OUTL24: ILDB C,CS\r
- JUMPE C,OUTL25\r
- CAIG C," "\r
- JRST OUTL24\r
- MOVE CS,TABP\r
- PUSHJ PP,OUTASC ;OUTPUT TABS\r
-OUTL25: MOVEI CS,LBUF\r
- PUSHJ PP,OUTAS0 ;DUMP THE LINE\r
- TLNE IO,IOSALL ;SUPPRESSING ALL\r
- JUMPN MRP,OUTL27 ;YES,EXTRA CR IF IN MACRO\r
-OUTL26: SKIPGE STPX ;ANY BINARY?\r
- JRST OUTLI ;NO, CLEAN UP AND EXIT\r
- PUSHJ PP,OUTLI2 ;YES, INITIALIZE FOR NEXT LINE\r
- PUSHJ PP,BOUT ;YES, DUMP IT\r
-OUTL27: PUSHJ PP,OUTCR ;OUTPUT CARRIAGE RETURN\r
- JRST OUTL26 ;TEST FOR MORE BINARY\r
-\r
-OUTPL: SKIPN LITLVL ;IF IN LITERAL\r
- SKIPL STPX ;OR CODE GENERATED\r
- JRST OUTIM ;JUST OUTPUT THE IMAGE\r
- SKIPN ASGBLK ;SKIP IF AN ASSIGNMENT\r
- JRST OUTIM ;OTHERWISE OUTPUT IMAGE\r
- PUSH PP,C ;SAVE CHAR.\r
- MOVEI C,CR\r
- IDPB C,LBUFP\r
- MOVEI C,LF\r
- IDPB C,LBUFP ;FINISH WITH CRLF\r
- PUSHJ PP,OUTLIN ;OUTPUT PARTIAL LINE\r
- POP PP,C ;RESTORE CHAR.\r
- JRST OUTLI2 ;INITIALISE REST OF LINE\r
-\fOUTL30: AOS CS,STPX ;PASS ONE\r
- ADDM CS,LOCO ;INCREMENT OUTPUT LOCATION\r
- PUSHJ PP,STOWI ;INITIALIZE STOW\r
- TLZ AC0,ERRORS-ERRM-ERRP-ERRV\r
- JUMPN AC0,OUTL32 ;JUMP IF ERRORS\r
- TLNE IO,IOSALL ;SUPPRESSING ALL/\r
- JUMPN MRP,CPOPJ ;YES,EXIT\r
- JRST OUTLI1 ;NO,INIT LINE\r
-\r
-OUTL32: IDPB AC0,LBUFP ;ZERO TERNIMATOR\r
- IOR ER,OUTSW ;LIST ERRORS\r
- MOVEI CS,TAG\r
- PUSHJ PP,OUTSIX ;OUTPUT TAG\r
- HRRZ C,TAGINC\r
- PUSHJ PP,DNC ;CONVERT INCREMENT TO DECIMAL\r
- PUSHJ PP,OUTTAB ;OUTPUT TAB\r
- PUSHJ PP,OUTLER ;OUTPUT ERROR FLAGS\r
- PUSHJ PP,OUTTAB\r
- MOVEI CS,SEQNO ;ADDRESS OF SEQUENCE NO.\r
- SKIPE SEQNO ;FILE NOT SEQUENCED\r
- PUSHJ PP,OUTAS0 ;OUTPUT IT\r
- JRST OUTL25 ;OUTPUT BASIC LINE\r
-\r
-OUTLER: PUSH PP,ER ;SAVE LISTING SWITCHES FOR LATER\r
- TRNE ER,TTYSW ;IF THIS IS ON, LISTING IS ON TTY\r
- TRZ ER,ERRORS ;SO SUPPRESS ON TTY\r
- TDZ ER,OUTSW ;BUT THIS SHOULD ONLY GO TO THE TTY\r
- MOVE CS,INDIR ;GET FILE NAME\r
- CAME CS,LSTFIL ;AND SEE IF SAME\r
- JRST [MOVEM CS,LSTFIL ;SAVE AS LAST ONE\r
- MOVEI CS,LSTFIL\r
- PUSHJ PP,OUTSIX ;LIST NAME\r
- MOVEI C," "\r
- PUSHJ PP,OUTL\r
- MOVE CS,PAGENO ;PRINT PAGE NUMBER TOO\r
- JRST OUTLE8]\r
- MOVE CS,PAGENO ;NOW CHECK PAGE NUMBER\r
- CAME CS,LSTPGN\r
-OUTLE8: JRST [MOVEM CS,LSTPGN\r
- MOVEI CS,[ASCIZ /PAGE /]\r
- PUSHJ PP,OUTAS0\r
- MOVE C,PAGENO\r
- PUSHJ PP,DNC\r
- PUSHJ PP,OUTCR ;AND NOW FOR THE ERROR LINE\r
- JRST .+1]\r
- HLLM ER,(PP) ;RESTORE ER BUT NOT IO (LEFT HALF OF AC)\r
- POP PP,ER\r
- MOVE CS,[POINT 7,[ASCII / QXADLRUVNOPEM/]]\r
-OUTLE2: ILDB C,CS ;GET ERROR MNEMONIC\r
- JUMPGE AC0,OUTLE4 ;BRANCH IF NOT FLAGGED\r
- PUSHJ PP,OUTL ;OUTPUT THE CHARACTER\r
- AOS ERRCNT ;INCREMENT ERROR COUNT\r
-OUTLE4: LSH AC0,1 ;SHIFT NEXT FLAG INTO SIGN BIT\r
-\f JUMPN AC0,OUTLE2 ;TEST FOR END\r
- POPJ PP, ;EXIT\r
-\fOUTIM1: TLOA FR,IOSCR ;SUPPRESS CRLF AFTER LINE\r
-OUTIM: TLZ FR,IOSCR ;DON'T FOR PARTIAL LINE\r
- TLNE IO,IOSALL ;SUPPRESSING ALL?\r
- JUMPN MRP,CPOPJ ;YES ,EXIT IF IN MACRO\r
- JUMP1 OUTLI1 ;BYPASS IF PASS ONE\r
- PUSH PP,ER\r
- TDZ ER,TYPERR\r
- TLNN IO,IOMSTR!IOPROG!IOMAC\r
- IOR ER,OUTSW\r
- PUSH PP,C ;OUTPUT IMAGE\r
- TLNN FR,CREFSW\r
- PUSHJ PP,CLSCRF\r
-OUTIM2: MOVE CS,TABP\r
- PUSHJ PP,OUTASC ;OUTPUT TABS\r
- IDPB C,LBUFP ;STORE ZERO TERMINATOR\r
- MOVEI CS,LBUF\r
- PUSHJ PP,OUTAS0 ;OUTPUT THE IMAGE\r
- TLZN FR,IOSCR ;CRLF SUPPRESS?\r
- PUSHJ PP,OUTCR ;NO,OUTPUT\r
- POP PP,C\r
- HLLM ER,0(PP)\r
- POP PP,ER\r
- JRST OUTLI2\r
-\r
-OUTLI: TLNE IO,IOSALL ;SUPPRESSING ALL\r
- JUMPN MRP,OUTLI3 ;YES,SET FLAG IN REPEATS ALSO\r
- TLNE IO,IOPALL ;MACRO EXPANSION SUPRESS REQUESTED?\r
- SKIPN MACLVL ;YES, ARE WE IN MACRO?\r
- TLZA IO,IOMAC ;NO, CLEAR MAC FLAG\r
-OUTLI3: TLO IO,IOMAC ;YES, SET FLAG\r
-\r
-OUTLI1: TRZ ER,ERRORS!LPTSW!TTYSW\r
-OUTLI2: MOVE CS,[POINT 7,LBUF] ;INITIALIZE BUFFERS\r
- MOVEM CS,LBUFP\r
-IFN FORMSW,<MOVE CS,[POINT 7,TABI]\r
- MOVSS HWFMT ;PUT FLAG IN LEFT HALF\r
- SKIPGE HWFMT ;BUT IF ONLY HALF-WORD FORMAT>\r
- MOVE CS,[POINT 7,TABI,6]\r
- MOVEM CS,TABP\r
- MOVEI CS,.CPL\r
-IFN FORMSW,<SKIPL HWFMT ;IF MULTI-FORMAT\r
- SUBI CS,8 ;LINE IS ONE TAB SHORTER\r
- MOVSS HWFMT ;BACK AS IT WAS>\r
- MOVEM CS,CPL\r
- MOVSI CS,(ASCII / /)\r
- SKIPE SEQNO ;HAVE WE SEQUENCE NUMBERS?\r
- MOVEM CS,SEQNO ;YES, STORE TAB IN CASE OF MACRO\r
- MOVEM CS,SEQNO+1 ;STORE TAB AND TERMINATOR\r
- SETZM ASGBLK\r
- SETZM LOCBLK\r
- POPJ PP,\r
-\fOUTIML: TLNE IO,IOSALL ;SUPPRESSING ALL?\r
- JUMPN MRP,CPOPJ ;YES,EXIT IF IN MACRO\r
- TRNN ER,ERRORS-ERRQ ;FOR LITERALS (MULIT-LINE) OUTPUT ERRORS\r
- TLNE FR,ERRQSW\r
- TRZ ER,ERRQ\r
- HRLZ CS,ER\r
- JUMP1 OUTML1 ;CHECK PASS1 ERRORS\r
- TDZ ER,TYPERR\r
- JUMPE CS,OUTIM1\r
- PUSH PP,[0] ;ERRORS SHOULD BE ZEROED\r
- PUSH PP,C\r
- PUSH PP,AC0 ;SAVE AC0 IN CASE CALLED FROM ASCII\r
- MOVE AC0,CS ;ERROR ROUTINE WANTS FLAGS IN AC0\r
- IOR ER,OUTSW\r
- TLNN FR,CREFSW\r
- PUSHJ PP,CLSCRF ;FIX CREF\r
- TLZE AC0,ERRM\r
- TLO AC0,ERRP\r
- PUSHJ PP,OUTLER ;OUTPUT THEM\r
- POP PP,AC0\r
- JRST OUTIM2 ;AND LINE\r
- \r
-OUTML1: TLZ CS,ERRORS-ERRM-ERRP-ERRV\r
- JUMPE CS,OUTLI2 ;NONE\r
- TRZ ER,ERRM!ERRP!ERRV\r
- TRO ER,ERRL\r
- PUSH PP,ER ;SAVE\r
- PUSH PP,C ;SAVE THIS\r
- PUSH PP,AC0 ;AS ABOVE\r
- MOVE AC0,CS ;...\r
- TDZ ER,TYPERR\r
- IOR ER,OUTSW\r
- MOVEI CS,TAG\r
- PUSHJ PP,OUTSIX\r
- HRRZ C,TAGINC\r
- PUSHJ PP,DNC\r
- PUSHJ PP,OUTTAB\r
- PUSHJ PP,OUTLER ;DO NOT FORGET ERRORS\r
- PUSHJ PP,OUTTAB\r
- MOVEI CS,LBUF ;PRINT REST OF LINE\r
- PUSHJ PP,SOUT20\r
- POP PP,AC0\r
- POP PP,C\r
- POP PP,ER\r
- JRST OUTLI2\r
-\fSUBTTL OUTPUT ROUTINES\r
-UOUT: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN\r
- TRNN ARG,PNTF ;WFW\r
- TRNN ARG,UNDF\r
- JRST UOUT13 ;TEST FOR UNDF!EXTF!PNTF ON PASS2\r
- JUMP2 UOUT10\r
- TLNN IO,IOIOPF ;ANY IOP'S SEEN\r
- JRST UOUT12 ;NO,MAKE EXTERNAL\r
- MOVSI CS,PRMTBL-PRMEND;YES LOOKUP IN TABLE\r
-UOUT1: CAME AC0,PRMTBL(CS) ;HAVE WE A MATCH?\r
- AOBJN CS,UOUT2 ;NO,INCREMENT AND JUMP\r
- MOVE ARG,PRMTBL+1(CS);YES,GET VALUE\r
- MOVEM ARG,(SX) ;UPDATE SYMBOL TABLE\r
- POPJ PP, ;EXIT\r
-UOUT2: AOBJN CS,UOUT1 ;TEST FOR END\r
-\r
-UOUT12: PUSHJ PP,EXTER2 ;MAKE IT EXTERNAL\r
- MOVSI ARG,UNDF ;BUT PUT UNDF BACK ON\r
- IORM ARG,(SX) ;SO MESSAGE WILL COME OUT\r
- POPJ PP, ;GET NEXT SYMBOL\r
-\r
-UOUT13: JUMP1 CPOPJ ;RECYCLE ON PASS1\r
- TRC ARG,UNDF!EXTF!PNTF ;CHECK FOR ALL THREE ON\r
- TRCE ARG,UNDF!EXTF!PNTF ;ARE THEY?\r
- POPJ PP, ;NO, RECYCLE\r
-UOUT10: PUSHJ PP,OUTCR\r
- PUSHJ PP,OUTSYM ;OUTPUT THE SYMBOL\r
- MOVEI CS,[SIXBIT /UNASSIGNED, DEFINED AS IF EXTERNAL @/]\r
- JRST OUTSIX ;POPJ FOR NEXT SYMBOL\r
-\r
-UOUT30: PUSHJ PP,ONC1 ;OUTPUT THE LOCATION\r
- JRST HIGHQ ;EXIT THROUGH HIGHQ\r
-\f ;OUTPUT THE ENTRIES\r
-\r
-EOUT: MOVEI C,0 ;INITIALIZE THE COUNT\r
- MOVE SX,SYMBOL\r
- MOVE SDEL,0(SX)\r
-EOUT1: SOJL SDEL,EOUT2 ;TEST FOR END\r
- ADDI SX,2\r
- HLRZ ARG,0(SX)\r
- ANDCAI ARG,SYMF!INTF!ENTF\r
- JUMPN ARG,EOUT1 ;IF INVALID, DON'T COUNT\r
- AOJA C,EOUT1 ;BUMP COUNT\r
-\r
-EOUT2: HRLI C,4 ;BLOCK TYPE 4\r
- PUSHJ PP,OUTBIN\r
- SETZB C,ARG\r
- PUSHJ PP,OUTBIN\r
- MOVE SX,SYMBOL\r
- MOVE SDEL,0(SX)\r
- MOVEI V,^D18\r
-\r
-EOUT3: SOJL SDEL,POPOUT\r
- ADDI SX,2\r
- HLRZ C,0(SX)\r
- ANDCAI C,SYMF!INTF!ENTF\r
- JUMPN C,EOUT3\r
- SOJGE V,EOUT4 ;TEST END OF BLOCK\r
- PUSHJ PP,OUTBIN\r
- MOVEI V,^D17 ;WFW\r
-EOUT4: MOVE AC0,-1(SX)\r
- PUSHJ PP,SQOZE\r
- MOVE C,AC0\r
- PUSHJ PP,OUTBIN\r
- JRST EOUT3\r
-\f ;OUTPUT THE SYMBOLS\r
-\r
-SOUT: SKIPN IONSYM ;SKIP IF NOSYM SEEN\r
- TRNN ER,LPTSW!TTYSW ;A LISTING REQUIRED?\r
- JRST SOUT1 ;NO\r
- MOVEI [ASCIZ /SYMBOL TABLE/]\r
- HRRM SUBTTX ;SET NEW SUB-TITLE\r
- PUSHJ PP,OUTFF ;FORCE NEW PAGE\r
- MOVEI ARG,NCOLS ;SET UP FOR NCOLS ACROSS SYMBOL TABLE\r
- TRNE ER,TTYSW ;IS TTY LISTING DEVICE?\r
- MOVEI ARG,2 ;YES,ONLY 2 COLLUMNS\r
- MOVEM ARG,NCOLLS ;STORE ANSWER\r
- MOVEM ARG,SYMCNT\r
- PUSHJ PP,LOUT1 ;OUTPUT THEM\r
- MOVE ARG,SYMCNT ;SEE IF WE ENDED EVEN\r
- CAME ARG,NCOLLS\r
- PUSHJ PP,OUTCR ;NO, NEED CR\r
- JRST SOUT1 ;NOW FOR BLOCK TYPE 2\r
-\r
-LOUT1: PUSHJ PP,LLUKUP ;SET FOR TABLE SCAN\r
- TRNN ARG,SYMF\r
- TRNN ARG,MACF!SYNF\r
- TDZA MRP,MRP ;SKIP AND CLEAR MRP\r
- POPJ PP, ;NO, TRY AGAIN\r
- TRNE ARG,INTF\r
- MOVEI MRP,1\r
- TRNE ARG,EXTF\r
- MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL\r
- TRNE ARG,SYNF ;SYNONYM?\r
- JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL\r
- TRNE ARG,SUPRBT ;IF SUPRESSED\r
-; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL\r
- POPJ PP, ;DO NOT OUTPUT\r
- AOS (PP) ;SET FOR SKIP RETURN IF SYMBOL IS PRINTED\r
- JUMPGE MRP,LOUT10 ;BRANCH IF NOT EXTERNAL\r
- HLRZ RC,V ;PUT POINTER/FLAGS IN RC\r
- TRNE RC,-2 ;POINTER?\r
- MOVS RC,0(RC) ;YES\r
- HLL V,RC ;STORE LEFT VALUE\r
-\r
-LOUT10: PUSH PP,RC ;SAVE FOR LATER\r
- PUSHJ PP,OUTSYM ;OUTPUT THE NAME\r
- MOVE RC,(PP) ;GET COPY\r
- MOVEI AC1,0\r
- JUMPLE MRP,LOUT15 ;SET DEFFERRED BITS IF EXTERNAL\r
- TLNE RC,-2 ;CHECK FOR LEFT FIXUP\r
- IORI AC1,40 ;AND SET BITS\r
- TRNE RC,-2 ;CHECK FOR RIGHT FIXUP\r
- IORI AC1,20 ;AND SET BITS\r
-LOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL\r
- HRRZS RC\r
- TRNE RC,-2\r
- HLLZS RC\r
- TLZE RC,-1\r
- TRO RC,2\r
- HRL MRP,RC\r
- MOVEI RC,0\r
- TRNE ARG,ENTF ;ENTRY DMN\r
- HRRI MRP,-5\r
- TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW\r
- ADDI MRP,3 ;YES WFW\r
- TRNE ARG,UNDF ;UNDEFINED IS EXTERNAL\r
- HRRI MRP,2 ;SO FLAG AS UXT\r
- IOR AC1,SOUTC(MRP)\r
- MOVE ARG,AC1\r
- MOVEM AC0,SVSYM ;SAVE IT\r
- MOVE AC0,V ;GET THE VALUE\r
- HLRZ RC,MRP ;AND THE RELOCATION\r
- HLLO CS,V\r
- TRNE RC,2 ;LEFT HALF RELOCATABLE?\r
- TRZA CS,1 ;NO, FLAG AND PRINT\r
- TLNE CS,-1 ;IS THE LEFT HALF ZERO?\r
- PUSHJ PP,ONC1 ;NO, OUTPUT IT\r
-LOUT11: PUSHJ PP,OUTTAB\r
-LOUT30: HRLO CS,V\r
- TDZ CS,RC ;SET RELOCATION\r
- PUSHJ PP,ONC1\r
- PUSHJ PP,OUTTAB\r
- POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL\r
-LOUT60: MOVEI CS,SOUTC(MRP)\r
- PUSHJ PP,OUTAS0 ;EXT/INT\r
- SOSLE SYMCNT ;SEE IF WE HAVE RUN OUT\r
- JRST OUTTAB ;NOT YET, PRINT ONE TAB\r
-LOUT64: MOVE CS,NCOLLS ;YES, RESET\r
-\f MOVEM CS,SYMCNT\r
- JRST OUTCR ;CARRIAGE RETURN AND TRY FOR ANOTHER\r
-\r
-\r
-\f SYN IFBLK,SYMBLK ;SOMEWHERE TO STORE THE POINTERS\r
-\r
-LLUKUP: POP PP,LOOKX ;INTERCEPT RETURN POP\r
- MOVE SX,SYMBOL\r
- MOVE SDEL,(SX)\r
- ADDI SX,2 ;SKIP COUNT OF SYMBOLS\r
-LLUKP2: HRLI SX,-<.LPP-1> ;LENGTH OF PAGE\r
- MOVE V,ARG ;COPY OF ARG\r
- MOVEM SX,SYMBLK(V) ;STORE SYMBOL POINTER IN TABLE\r
- ADDI SX,2*<.LPP-2> ;SYMBOLS PER PAGE\r
- SOJG V,.-2 ;FOR ALL COLUMNS\r
- MOVE V,SYMCNT\r
- HRRZ SX,SYMBLK(V)\r
- CAMGE SX,SYMTOP\r
- SOJG V,.-2\r
- ADDI V,1\r
- MOVEM V,SYMBLK\r
- JRST LLUKP7 ;ENTER LOOP\r
-\r
-LLUKP1: MOVEM SX,SYMBLK(ARG) ;SAVE IT \r
- MOVE AC0,-1(SX)\r
- PUSHJ PP,SRCH7\r
- HLRZS ARG\r
- PUSHJ PP,@LOOKX\r
- JRST [MOVE ARG,SYMCNT\r
- MOVEM SX,SYMBLK(ARG)\r
- JRST .+1]\r
-LLUKP7: SOJL SDEL,POPOUT ;TEST FOR END\r
-LLUKP3: MOVE ARG,SYMCNT ;GET PAGE POSITION\r
- MOVE SX,SYMBLK(ARG) ;GET NEXT POINTER\r
- AOBJP SX,LLUKP4\r
- HRRZ V,SX\r
- CAMG V,SYMTOP\r
- AOJA SX,LLUKP1\r
-LLUKP6: PUSHJ PP,LOUT64 ;RESET SYMCNT\r
- JUMPE SDEL,POPOUT ;EXIT IF ALL DONE\r
- JRST LLUKP3\r
-\r
-LLUKP4: AOJ SX,\r
- MOVEM SX,SYMBLK(ARG)\r
- MOVE V,NCOLLS\r
- SKIPGE SYMBLK(V) ;TEST IF ALL FINISHED\r
- JRST LLUKP5 ;NO\r
- SOJG V,.-2 ;KEEP GOING\r
- MOVE SX,SYMBLK\r
- MOVE SX,SYMBLK(SX)\r
- HLRZ V,SX ;GET NUMBER ADVANCED\r
- LSH V,1 ;2 WORDS PER SYMBOL\r
- SUBI SX,2(V) ;BACK UP ONE SYMBOL\r
- SKIPGE LPP ;IF PAGE FULL\r
- JRST .+3 ;DON'T FINISH WITH EXTRA CR-LF\r
- SETZM LPP ;ENSURE END OF PAGE\r
- PUSHJ PP,LOUT64\r
- MOVE ARG,NCOLLS\r
- MOVEM ARG,SYMCNT ;JUST IN CASE\r
- JRST LLUKP2\r
-\r
-LLUKP5: SOSG SYMCNT ;ON LAST COL?\r
- JRST LLUKP6\r
- SKIPGE LPP ;IF PAGE FULL\r
- JRST LLUKP3 ;NO MORE OUTPUT \r
-REPEAT 2,<PUSHJ PP,OUTAB2> ;NO, TAB OUT TO NEXT COLUMN\r
- JRST LLUKP3\r
-\fSOUT1: PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN\r
- TRNN ARG,SYMF\r
- TRNN ARG,MACF!SYNF\r
- TDZA MRP,MRP ;SKIP AND CLEAR MRP\r
- POPJ PP, ;NO, TRY AGAIN\r
- TRNE ARG,INTF\r
- MOVEI MRP,1\r
-IFN WFWSW,<TRNE ARG,VARF ;IF THIS FLAG IS ON SHOULD GO IN LOW SEG\r
- JRST SOUT1W >\r
- TRNE ARG,EXTF\r
- MOVNI MRP,1 ;MRP=-1 FOR EXTERNAL\r
- TRNE ARG,SYNF ;SYNONYM?\r
- JUMPL MRP,POPOUT ;YES, DON'T OUTPUT IF EXTERNAL\r
- TRNE ARG,SUPRBT ;IF SUPRESSED\r
-; JUMPGE MRP,POPOUT ;DO NOT OUTPUT UNLESS EXTERNAL\r
- POPJ PP, ;DO NOT OUTPUT\r
- JUMPGE MRP,SOUT10 ;BRANCH IF NOT EXTERNAL\r
- HLRZ RC,V ;PUT POINTER/FLAGS IN RC\r
- TRNE RC,-2 ;POINTER?\r
- MOVS RC,0(RC) ;YES\r
- HLL V,RC ;STORE LEFT VALUE\r
-\r
-SOUT10: PUSH PP,RC ;SAVE FOR LATER\r
- MOVEI AC1,0\r
- JUMPLE MRP,SOUT15 ;SET DEFFERRED BITS IF EXTERNAL\r
- TLNE RC,-2 ;CHECK FOR LEFT FIXUP\r
- IORI AC1,40 ;AND SET BITS\r
- TRNE RC,-2 ;CHECK FOR RIGHT FIXUP\r
- IORI AC1,20 ;AND SET BITS\r
-IFN WFWSW,<TRNE ARG,VARF ;IF SO THEN DEFERD\r
- IORI AC1,20>\r
-SOUT15: TLNE RC,-2 ;FIX RELOC AS 0 IF EXTERNAL\r
- HRRZS RC\r
- TRNE RC,-2\r
- HLLZS RC\r
- TLZE RC,-1\r
- TRO RC,2\r
- HRL MRP,RC\r
- MOVEI RC,0\r
- TRNE ARG,ENTF ;ENTRY DMN\r
- HRRI MRP,-5\r
- TRNE ARG,NOOUTF ;SUPRESS OUTPUT? WFW\r
- ADDI MRP,3 ;YES WFW\r
- IOR AC1,SOUTC(MRP)\r
- MOVE ARG,AC1\r
- PUSHJ PP,NOUT2 ;SQUOZE AND DUMP THE SYMBOL\r
- MOVEM AC0,SVSYM ;SAVE IT\r
- MOVE AC0,V ;GET THE VALUE\r
- HLRZ RC,MRP ;AND THE RELOCATION\r
- PUSHJ PP,COUT\r
- POP PP,RC ;GET BACK RELOC AND CHECK EXTERNAL\r
- TRNN RC,-2 ;IS IT?\r
- JRST SOUT50 ;NO\r
- MOVE AC0,1(RC) ;GET NAME\r
-IFN WFWSW,<JUMPE AC0,[MOVSI AC0,200000 ;RIGHT DEFERED\r
- PUSHJ PP,INVRSF ;INSERT IN SYMBOL INFORMATION\r
- JRST SOUT50]>\r
- MOVEI ARG,60 ;EXTERNAL REQ\r
- PUSHJ PP,SQOZE\r
- HLLZS RC ;NO RELOC\r
- PUSHJ PP,COUT ;OUTPUT IT\r
- MOVE AC0,SVSYM ;GET SYMBOL NAME\r
- TLO AC0,500000 ;SET AS ADDITIVE SYMBOL\r
- TLZ AC0,200000 ;BUT NOT LEFT HALF ETC\r
- PUSHJ PP,COUT\r
-SOUT50: MOVSS RC ;CHECK LEFT HALF\r
- TRNN RC,-2\r
- JRST SOUT60\r
- MOVE AC0,1(RC)\r
-IFN WFWSW,<JUMPE AC0,[MOVSI AC0,600000 ;LEFT DEFERED\r
- PUSHJ PP,INVRSF\r
- JRST SOUT60]>\r
- MOVEI ARG,60\r
- PUSHJ PP,SQOZE\r
- MOVEI RC,0\r
- PUSHJ PP,COUT\r
- MOVE AC0,SVSYM\r
- TLO AC0,700000\r
- PUSHJ PP,COUT\r
-SOUT60: POPJ PP,\r
-\r
-SOUT20: PUSHJ PP,OUTAS0\r
- JRST OUTCR\r
-\r
- <ASCII /ENT/>!04 ;DMN\r
- Z\r
- Z\r
- <ASCII /SEN/>!44 ;SUPRESSED ENTRY\r
- <ASCII /EXT/>!60\r
-SOUTC: EXP 10\r
- <ASCII /INT/>!04\r
- <ASCII /UXT/>!60 ;UNDEFINED EXTERNAL\r
- <ASCII /SPD/>!50\r
- <ASCII /SIN/>!44 ;DMN\r
-\fIFN WFWSW,<\r
-INVRSF: MOVEI ARG,3 ;GET A BLOCK\r
- ADDB ARG,FREE\r
- CAML ARG,SYMBOL\r
- PUSHJ PP,XCEEDS\r
- MOVEM AC0,(ARG) ;SAVE WHICH HALF INFO\r
- MOVE AC0,SVSYM ;GET SYMBOL NAME\r
- TLZ AC0,740000 ;GET RID OF CODE BITS\r
- MOVEM AC0,-1(ARG) ;SAVE IT\r
- HLRZ AC0,(RC) ;SYMBOL TABLE FIXUP POINTER\r
- MOVEM AC0,-2(ARG) ;LINK IN THIS BLOCK\r
- SUBI ARG,2 ;POINT TO START OF BLOCK\r
- HRLM ARG,(RC)\r
- POPJ PP,\r
-\r
-SOUT1W: HLRZS V ;GET THE SYMBOL TABLE POINTER\r
- MOVEI RC,3 ;SET UP A NEW BLOCK FOR THIS SYMBOL\r
- ADDB RC,FREE\r
- CAML RC,SYMBOL\r
- PUSHJ PP,XCEEDS ;CHECK ON OUT OF ROOM\r
- PUSH PP,ARG ;SAVE ARG AND ACO\r
- PUSH PP,AC0\r
- MOVEI ARG,0 ;NO CODE BITS\r
- PUSHJ PP,SQOZE ;CONVERT TO RAD50\r
- MOVEM AC0,-1(RC) ;SYMBOL NAME\r
- POP PP,AC0\r
- POP PP,ARG ;RESTORE\r
- HRRZM V,-2(RC) ;LINK TO NEXT BLOCK\r
- MOVSI V,200000 ;FLAG AS SYMBOL TABLE FIXUP\r
- MOVEM V,(RC)\r
- HRRZ V,(SX) ;GET POINTER TO HEADER BLOCK\r
- SUBI RC,2 ;POINT TO HEAD OF BLOCK\r
- HRLM RC,(V) ;PUT IN LINK TO NEW BLOCK\r
- MOVE RC,FIXLNK ;ADD SYMBOL TO CHAIN OF ONES TO DO\r
- MOVEM SX,FIXLNK ;CHAIN THROUGH SYMBOL ENTRY\r
- MOVEM RC,-1(SX) ;WHICH IS NO LONGER NEEDED\r
- SETZB RC,V ;PUT OUT 0 FOR SYMBOL VALUE\r
- JRST SOUT10>\r
-\f ;OUTPUT THE BINARY\r
-\r
-BOUT: HRLO CS,LOCO ;PICKUP THE LOCATION\r
- PUSHJ PP,ONC ;OUTPUT IT TO THE LISTING FILE\r
- MOVEI C,"'"\r
- SKIPE MODO ;IF MODE IS NOT ABSOLUTE\r
- PUSHJ PP,OUTC ;PRINT A SINGLE QUOTE\r
- PUSHJ PP,DSTOW ;GET THE CODE\r
- PUSH PP,RC ;SAVE RELOC\r
- PUSH PP,RC ;AND AGAIN\r
-IFE WFWSW,<TLNE RC,-2 ;CHECK LEFT EXTERNAL\r
- HRRZS RC ;MAKE LEFT NON-RELOC>\r
-IFN WFWSW,<TLNE FR,RIMSW!RIM1SW!R1BSW ;CHECK FOR SPECIAL BIN OUT\r
- JRST BOUT30 ;AND LET HIM DISCOVER THE HORROR\r
- TLNN RC,-2 ;LEFT HALF EXTERNAL??\r
- JRST BOUT11 ;NO\r
- HLRZ AC1,RC ;GET POINTER\r
- SKIPE 1(AC1) ;IS IT SPECIAL LVAR KIND (NAME IS 0)\r
- JRST [HRRZS RC\r
- JRST BOUT11] ;IGNORE FOR NOW\r
- PUSH PP,AC0 ;SAVE WORD\r
- HLRZS AC0 ;GET OFFSET\r
- PUSHJ PP,INCSRC ;FIND A MATCH OR INSERT NEW BLOCK\r
- ADDI AC1,1 ;POINT ONE FURTHER IN BLOCK\r
- PUSHJ PP,LVLINK ;AND SET INFORMATION\r
- POP PP,AC0\r
- HRLM RC,AC0 ;THE LINK\r
- HLLM RC,-1(PP) ;AND ITS RELOC\r
- MOVE RC,-1(PP) ;GET RELOC BACK\r
-BOUT11:>\r
- TRNN RC,-2 ;RIGHT EXT?\r
- JRST BOUT30 ;NO\r
-IFN WFWSW,<HRRZ AC1,RC ;GET POINTER\r
- SKIPE 1(AC1)\r
- JRST [HRRZ AC1,AC0 ;ORDINARY EXTERNAL, HANDLE\r
- JUMPE AC1,BOUT20\r
- HLLZS RC ;ADD EXTERNAL\r
- JRST BOUT30]\r
- PUSH PP,AC0 ;SAVE WORD\r
- HRRZS AC0 ;GET OFFSET\r
- PUSHJ PP,INCSRC\r
- PUSHJ PP,LVLINK\r
- POP PP,AC0\r
- HRRM RC,AC0\r
- HLRM RC,-1(PP)\r
- MOVE RC,-1(PP)>\r
-IFE WFWSW,<HRRZ AC1,AC0 ;YES\r
- JUMPE AC1,BOUT20 ;PROCESS IF ZERO CODE THERE\r
- HLLZS RC ;MAKE NON-RELOC>\r
- JRST BOUT30 ;PROCESS\r
-\r
-\fBOUT20:\r
- HRRM AC1,-1(PP) ;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0)\r
- HRR AC0,0(RC) ;NO, SET ADDRESS LINK\r
- MOVE AC1,LOCO ;GET CURRENT LOCATION\r
- HRRM AC1,0(RC) ;SET NEW LINK\r
- HLRZ AC1,0(RC) ;GET FLAGS/POINTER\r
- TRNN AC1,-2 ;POINTER?\r
- HRR AC1,RC ;NO, SET TO FLAGS\r
- HLR RC,0(AC1) ;PUT FLAGS IN RC\r
- HRL AC1,MODO ;GET CURRENT MODE\r
- TRZE RC,-2 ;LEFT HALF RELOCATABLE+\r
- TLO AC1,2 ;YES, SET FLAG\r
- HLLM AC1,0(AC1) ;STORE NEW FLAGS\r
-BOUT30: HLLO CS,AC0\r
- TLZE RC,1 ;PACK RELOCATION BITS\r
- TRO RC,2\r
- TRNE RC,2 ;LEFT HALF RELOCATABLE?\r
- TRZ CS,1 ;YES, RESET BIT\r
- PUSH PP,AC0 ;NEED AN AC\r
- HLRZ AC0,-1(PP) ;AC0 = LEFT RELOCATION\r
- CAILE AC0,1 ;EXTERNAL?\r
- XORI CS,EXTF!1 ;YES, SET SWITCH\r
-\fIFN FORMSW,<\r
- OR AC0,HWFMT\r
- JUMPN AC0,BOUT3H ;EDIT IN HALF WORD FORMAT IF NOT 0\r
- MOVE AC0,FORM ;GET FORM WORD\r
- MOVEI C,0 ;ZERO FIELD SIZE\r
-BOUT3A: JFFO AC0,BOUT3B ;AC1 = FIELD SIZE -1\r
- JRST BOUT3C ;NO FIELDS LEFT, JUMP\r
-BOUT3B: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD\r
- MOVEI AC1,6(AC1)\r
- IDIVI AC1,3 ;AC1 = COLUMNS USED + 1\r
- ADDI C,(AC1) ;INCREMENT FIELD SIZE\r
- CAIG C,^D23 ;IS FIELD SIZE GTR 23?\r
- JRST BOUT3A ;NO. CONTINUE\r
- MOVE AC1,HWFORM ;USE STANDARD FORM\r
- MOVEM AC1,FORM\r
- MOVEI C,^D13 ;SET FIELD SIZE TO 13\r
-BOUT3C: MOVEM C,FLDSIZ ;STORE FIELD SIZE\r
- MOVE AC0,FORM ;AC0 = FORM WORD\r
- TRNN RC,2 ;IS LEFT HALF RELOCATED?\r
- CAMN AC0,HWFORM ;NO. IS FORM HALF WORD?\r
- JRST BOUT3H ;YES. EDIT IN OLD WAY\r
- CAMN AC0,IOFORM ;IS IT I/O WORD\r
- SETOM IOSEEN ;YES,NEED MORE WORK\r
- IBP TABP\r
- CAIL C,^D16\r
- IBP TABP\r
- ILDB C,TABP ;GET A TAB\r
- PUSHJ PP,OUTL ;OUTPUT IT\r
- MOVE AC2,(PP) ;AC2 = INFO TO BE EDITED\r
- PUSH PP,CS ;SAVE CS = C+1\r
-BOUT3D: JFFO AC0,BOUT3E ;AC1 = FIELD LENGTH - 1\r
-BOUT3E: LSH AC0,1(AC1) ;SHIFT OFF FORM FIELD\r
- MOVEI C,3(AC1)\r
- MOVEI AC1,0\r
- LSHC AC1,-2(C) ;AC1 = FIELD INFO\r
- IDIVI C,3 ;C = # OF OCTAL DIGITS\r
- MOVE C+1,AC0 ;SAVE AC0\r
- SKIPE IOSEEN ;IS THIS A I/O INST.\r
- PUSHJ PP,BOUT3J ;YES,SET FIELDS CORRECTLY\r
- MOVNS C\r
- ROT AC1,(C)\r
- ROT AC1,(C)\r
- ROT AC1,(C)\r
- MOVNS C\r
-\fBOUT3F: MOVEI AC0,6 ;EDIT A DIGIT\r
- LSHC AC0,3\r
- EXCH AC0,C\r
- PUSHJ PP,OUTC ;OUTPUT IT\r
- MOVE C,AC0\r
- SOJG C,BOUT3F ;IF MORE DIGITS, GO BACK\r
- JUMPE C+1,BOUT3G ;JUMP IF END OF WORD\r
- MOVE AC0,C+1 ;RESTORE AC0\r
- MOVEI C," "\r
- PUSHJ PP,OUTC ;OUTPUT A SPACE\r
- JRST BOUT3D ;PROCESS NEXT FIELD\r
-\r
-BOUT3G: POP PP,CS ;RESTORE CS = C+1\r
- MOVEI C,0\r
- TRNE RC,1 ;RELOCATABLE?\r
- MOVEI C,"'" ;YES\r
- HRRZ AC0,-1(PP) ;AC0 = RIGHT RELOCATION\r
- CAILE AC0,1 ;EXTERNAL?\r
- MOVEI C,"*" ;YES\r
- PUSHJ PP,ONC2 ;STORE POSSIBLE INDICATOR\r
- POP PP,AC0\r
- JRST BOUT3I ;CONTINUE\r
-\r
-BOUT3H: MOVEI C,^D15 ;SET SIZE TO 15\r
- MOVEM C,FLDSIZ\r
->\r
- POP PP,AC0 ;RESTORE\r
- PUSHJ PP,ONC\r
- HRLO CS,AC0\r
- TDZ CS,RC ;SET RELOCATION\r
- HRRZ C,(PP) ;C = RIGHT RELOCATION\r
- CAILE C,1 ;EXTERNAL\r
- XORI CS,EXTF!1 ;YES, SET SWITCH\r
- PUSHJ PP,ONC\r
-BOUT3I: POP PP,CS ;GET RID OF ENTRY ON STACK\r
- HRRZ CS,LOCO\r
- TLNE FR,RIMSW!RIM1SW!R1BSW ;RIM OUTPUT?\r
- JRST ROUT ;YES, GO PROCESS\r
-\r
- HRL CS,MODO\r
- CAME CS,MODLOC ;SEQUENCE OR RELOCATION BREAK?\r
- PUSHJ PP,COUTD ;YES, DUMP THE BUFFER\r
- SKIPL COUTX ;NEW BUFFER?\r
- JRST BOUT40 ;NO, STORE CODE AND EXIT\r
- MOVEM CS,MODLOC ;YES, STORE NEW VALUES\r
- EXCH AC0,LOCO\r
- EXCH RC,MODO\r
- PUSHJ PP,COUT ;STORE BLOCK LOCATION AND MODE\r
- EXCH RC,MODO ;RESTORE CURRENT VALUES\r
- EXCH AC0,LOCO\r
-\r
-\fBOUT40: PUSHJ PP,COUT ;EMIT CODE\r
- POP PP,RC ;RETRIEVE EXTERNAL BITS\r
- TRNN RC,-2 ;RIGHT EXTERNAL?\r
- JRST BOUT50 ;TRY FOR LEFT\r
- PUSHJ PP,COUTD\r
- PUSH PP,BLKTYP ;TERMINATE TYPE AND SAVE\r
- MOVEI AC0,2 ;BLOCK TYPE 2\r
- MOVEM AC0,BLKTYP\r
- MOVE AC0,1(RC) ;GET SYMBOL\r
- MOVEI ARG,60 ;CODE BITS\r
- PUSHJ PP,SQOZE ;CONVERT TO RADIX 50\r
- HLLZS RC ;SYMBOL HAS NO RELOCATION\r
- PUSHJ PP,COUT ;EMIT\r
- MOVE AC0,LOCO ;GET CURRENT LOC\r
- HRLI AC0,400000 ;ADDITIVE REQ\r
- HRR RC,MODO ;CURRENT MODE\r
- PUSHJ PP,COUT ;EMIT\r
- MOVSS RC ;NOW FOR LEFT\r
- TRNN RC,-2\r
- JRST BOUT60\r
- JRST BOUT70\r
-BOUT50: MOVSS RC ;CHECK OTHER HALF\r
- TRNN RC,-2 ;LEFT HALF EXTERNAL?\r
- JRST BOUT80 ;NO, FALSE ALARM\r
- PUSHJ PP,COUTD ;CHANGE MODE\r
- PUSH PP,BLKTYP\r
- MOVEI AC0,2\r
- MOVEM AC0,BLKTYP\r
-BOUT70: MOVE AC0,1(RC)\r
- MOVEI ARG,60\r
- PUSHJ PP,SQOZE\r
- HLLZS RC\r
- PUSHJ PP,COUT\r
- MOVE AC0,LOCO\r
- HRLI AC0,600000 ;LEFT HALF ADD\r
- HRR RC,MODO\r
- PUSHJ PP,COUT ;EMIT\r
-BOUT60: PUSHJ PP,COUTD ;CHANGE MODE\r
- POP PP,BLKTYP ;TO OLD ONE\r
-BOUT80: AOS LOCO\r
- AOS MODLOC\r
- POPJ PP,\r
-\fIFN WFWSW,<\r
-INCSC1: HLRZ RC,(AC1) ;GET OFFSET OF NEXT BLOCK\r
- CAMN RC,AC0 ;IS IT THE SAME??\r
- POPJ PP, ;YES, RETURN AC1 POINTS TO BLOCK\r
-INCSRC: MOVE RC,AC1 ;CURRENT POINTER\r
- HRRZ AC1,(AC1) ;IN CASE THIS COMES UP 0\r
- JUMPN AC1,INCSC1 ;SINCE 0 IS END OF CHAIN. ANY MORE??\r
- MOVEI AC1,3 ;NO, GET A NEW BLOCK\r
- ADDB AC1,FREE\r
- CAML AC1,SYMBOL\r
- PUSHJ PP,XCEED\r
- SUBI AC1,2 ;WE MUST BE POINTING RIGHT WHEN WE GET OUT\r
- HRRM AC1,(RC) ;INSERT WHERE END OF CHAIN WAS\r
- HRLZM AC0,(AC1) ;SET OFFSET AND END OF CHAIN\r
- SETZM 1(AC1)\r
- SETZM 2(AC1) ;NO LEFT OR RIGHT HALF FIXUPS\r
- POPJ PP, ;DONE\r
-\r
-LVLINK: MOVE RC,LOCO ;GET CURRENT LOCATION\r
- HRL RC,MODO ;AND MODE\r
- EXCH RC,1(AC1) ;PUT IN AND GET PLACE TO LINK TO\r
- POPJ PP,>\r
-\r
-IFN FORMSW,<\r
-BOUT3J: MOVSS IOSEEN ;SWAP\r
- SKIPGE IOSEEN ;SKIP IF NOT FIRST FIELD\r
- JRST [HLLZS IOSEEN ;CLEAR RIGHT HALF\r
- POPJ PP,] ;AND RETURN\r
- MOVSS IOSEEN ;SWAP BACK\r
- LSH AC1,2 ;CORRECT MNEMONIC AND OP CODE\r
- CAIE C,1 ;IS IT OP CODE?\r
- POPJ PP, ;NO,JUST RETURN\r
- MOVEI C,2 ;TWO CHAR. WIDE NOW\r
- SETZM IOSEEN ;DON'T COME AGAIN\r
- POPJ PP, ;RETURN\r
->\r
-\fNOUT: MOVE V,[POINT 7,TBUF] ;POINTER TO ASCII LINE\r
- MOVSI CS,(POINT 6,AC0) ;POINTER TO SIXBIT AC0\r
- SETZB ARG,AC0\r
-NOUT1: ILDB C,V ;GET ASCII\r
- CAIL C,"A"+40\r
- CAILE C,"Z"+40\r
- JRST .+2\r
- TRZA C,100 ;LOWER CASE TO SIXBIT\r
- SUBI C,40 ;CONVERT TO SIXBIT\r
- JUMPLE C,NOUT3 ;TEST FORM NON-SIXBIT\r
- CAILE C,77 ;AND NOT GREATER THAN SIXBIT\r
- JRST NOUT3 ;...\r
- IDPB C,CS ;DEPOSIT IN AC0\r
- TLNE CS,770000 ;TEST FOR SIX CHARACTERS\r
- JRST NOUT1 ;NO, GET ANOTHER\r
-NOUT3: SKIPGE UNIVSN ;IF A UNIVERSAL PROG\r
- POPJ PP, ;RETURN TO PUT IT IN THE TABLE\r
-\r
-IFN CCLSW,< TLNN IO,IOTLSN ;AND IF WE HAVE NOT SEEN A TITLE\r
- PUSHJ PP,PRNAM ;THEN PRINT THE NAME>\r
-NOUT2: PUSHJ PP,SQOZE ;CONVERT TO SIXBIT\r
- JRST COUT ;DUMP AND EXIT\r
-\r
-HOUT:\r
- MOVEI RC,1 ;RELOCATABLE\r
-IFN RENTSW,<\r
- MOVE AC0,HHIGH ;GET HIGH SEG IF TWO SEGMENTS\r
- JUMPE AC0,.+2 ;NOT TWO SEGMENTS\r
- PUSHJ PP,COUT ;OUTPUT IT >\r
- MOVE AC0,HIGH\r
-IFN RENTSW,<\r
- SKIPE HHIGH ;ANY TWOSEG HIGH STUFF\r
- JRST COUT ;YES,SO NO ABS.>\r
- PUSHJ PP,COUT ;OUTPUT THE HIGHEST LOCATION\r
- MOVE AC0,ABSHI\r
- ;PUT OUT ABS PORTION OF PROGRAM BREAK\r
- SOJA RC,COUT ;OUTPUT A WORD OF ZERO AND EXIT\r
-\r
-\fIFN RENTSW,<\r
-HSOUT: SETZM HISNSW ;CLEAR FOR PASS2\r
- MOVE AC0,SVTYP3 ;GET HISEG ARG\r
- JUMPGE AC0,.+4 ;JUMP IF ONLY HISEG\r
- HRL AC0,HIGH1 ;GET BREAK FROM PASS 1\r
- JUMPL AC0,.+2 ;OK IF GREATER THAN 400000\r
- HRLS AC0 ;SIGNAL TWO SEGMENT TO LOADER\r
- MOVEI RC,1 ;ASSUME RELOCATABLE\r
- JRST COUT ;OUTPUT THE WORD>\r
-\r
-VOUT: SKIPN RC,VECREL ;IS VECTOR ABSOLUTE ZERO?\r
- SKIPE VECTOR ;ALSO CHECK RELOCATION\r
- JRST .+2\r
- POPJ PP, ;YES, EXIT\r
- MOVE AC0,VECTOR ;AC0 SHOULD BE FLAGS\r
-\r
-COUT: AOS C,COUTX ;INCREMENT INDEX\r
- MOVEM AC0,COUTDB(C) ;STORE CODE\r
- IDPB RC,COUTP ;STORE RELOCATION BITS\r
- CAIE C,^D17 ;IS THE BUFFER FULL?\r
- POPJ PP, ;NO, EXIT\r
-\r
-COUTD: AOSG C,COUTX ;DUMP THE BUFFER\r
- JRST COUTI ;BUFFER WAS EMPTY\r
- HRL C,BLKTYP ;SET BLOCK TYPE\r
- PUSHJ PP,OUTBIN ;OUTPUT COUNT AND TYPE\r
- SETOB C,COUTY ;INITIALIZE INDEX\r
-\r
-COUTD2: MOVE C,COUTDB(C) ;GET RELOCATION BITS/CODE\r
- PUSHJ PP,OUTBIN ;DUMP IT\r
- AOS C,COUTY ;INCREMENT INDEX\r
- CAMGE C,COUTX ;TEST FOR END\r
- JRST COUTD2 ;NO, GET NEXT WORD\r
-\r
-COUTI: SETOM COUTX ;INITIALIZE BUFFER INDEX\r
- SETZM COUTRB ;ZERO RELOCATION BITS\r
- MOVE C,[POINT 2,COUTRB]\r
- MOVEM C,COUTP ;INITIALIZE BIT POINTER\r
- POPJ PP, ;EXIT\r
-\fSTOWZ1:\r
-IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>\r
-STOWZ: MOVEI RC,0\r
-STOW:\r
-IFN FORMSW,< MOVEM AC1,FORM ;STORE FORM WORD>\r
- JUMP1 STOW20 ;SKIP TEST IF PASS ONE\r
- TRNE RC,-2 ;RIGHT HALF ZERO OR 1?\r
- PUSHJ PP,STOWT ;NO, HANDLE EXTERNAL\r
- TLNN RC,-2 ;LEFT HALF ZERO OR 1? WFW\r
- JRST STOW10 ;YES, SKIP TEST\r
- MOVSS RC ;SWAP HALVES\r
- PUSHJ PP,STOWT1 ;HANDLE EXTERNAL WFW\r
- MOVSS RC ;RESTORE VALUES\r
-\r
-STOW10: SKIPE EXTPNT ;ANY EXTERNALS REMAINING?\r
- TRO ER,ERRE ;YES, SET EXTERNAL ERROR FLAG\r
-\r
-STOW20: AOS AC1,STPX ;INCREMENT POINTER\r
- MOVEM AC0,STCODE(AC1) ;STOW CODE\r
- MOVEM RC,STOWRC(AC1) ;STOW RELOCATION BITS\r
-IFN FORMSW,<\r
- PUSH PP,FORM\r
- POP PP,STFORM(AC1) ;STORE FORM WORD\r
->\r
- SKIPN LITLVL ;ARE WE IN LITERAL?\r
- AOS LOCA ;NO, INCREMENT ASSEMBLY LOCATION\r
- CAIGE AC1,.STP-1 ;OVERFLOW?\r
- POPJ PP, ;NO, EXIT\r
-\r
- SKIPE LITLVL ;ARE WE IN A LITERAL?\r
- TROA ER,ERRL ;YES, FLAG ERROR BUT DON'T DUMP\r
- JRST CHARL1 ;NO, SAVE REGISTERS AND DUMP THE BUFFER\r
- JRST STOWI ;INITIALIZE BUFFER\r
-\r
-DSTOW: AOS AC1,STPY ;INCREMENT POINTER\r
- MOVE AC0,STCODE(AC1) ;FETCH CODE\r
- MOVE RC,STOWRC(AC1) ;FETCH RELOCATION BITS\r
-IFN FORMSW,<\r
- PUSH PP,STFORM(AC1)\r
- POP PP,FORM ;GET FORM WORD\r
->\r
- CAMGE AC1,STPX ;IS THIS THE END?\r
- POPJ PP, ;NO, EXIT\r
-\r
-STOWI: SETOM STPX ;INITIALIZE FOR INPUT\r
- SETOM STPY ;INITIALIZE FOR OUTPUT\r
- SETZM EXTPNT\r
- POPJ PP, ;EXIT\r
-\fSVSTOW: AOS LITLVL ;NESTED LITERALS\r
- PUSH PP,STPX ;MAKE ROOM FOR ANOTHER\r
- PUSH PP,STPY\r
- MOVE AC1,STPX\r
- MOVEM AC1,STPY\r
- JRST 0(AC2)\r
-\r
-GTSTOW: POP PP,STPY ;BACK UP A LEVEL\r
- POP PP,STPX\r
- SOS LITLVL\r
- JRST 0(AC2)\r
-\r
- ;EXTERNAL RIGHT\r
-STOWT: HRRZ AC1,EXTPNT ;GET RIGHT POINTER\r
- CAIE AC1,(RC) ;DOES IT MATCH \r
- PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR\r
- HLLZS EXTPNT\r
- POPJ PP, ;EXIT\r
-\r
- ;EXTERNAL LEFT\r
-STOWT1: HLRZ AC1,EXTPNT ;GET LEFT HALF\r
- CAIE AC1,(RC) ;SEE ABOVE\r
- PUSHJ PP,QEXT\r
- HRRZS EXTPNT\r
- POPJ PP, ;EXIT\r
-\fONC: ILDB C,TABP ;ENTRY TO ADVANCE TAB POINTER\r
- PUSHJ PP,OUTL ;OUTPUT A TAB\r
- ;OUTPUT 6 OCT NUMBERS FROM CS LEFT\r
-ONC1: MOVEI C,6 ;CONVERT TO ASCII\r
- LSHC C,3 ;SHIFT IN OCTAL\r
- PUSHJ PP,OUTL ;OUTPUT ASCII FROM C\r
- TRNE CS,-1 ;ARE WE THROUGH?\r
- JRST ONC1 ;NO, GET ANOTHER\r
- MOVEI C,0 ;CLEAR C\r
- TLNN CS,1 ;RELOCATABLE?\r
- MOVEI C,"'" ;YES\r
- TLNN CS,EXTF ;OR EXTERNAL\r
- MOVEI C,"*" ;YES\r
-ONC2: JUMPN C,OUTC ;OUTPUT IF EXTERN OR RELOCATABLE\r
-IFN FORMSW,< SOS FLDSIZ ;DECREMENT FIELD SIZE>\r
- POPJ PP, ;EXIT\r
-\r
-DNC: IDIVI C,^D10\r
- HRLM CS,0(PP)\r
- JUMPE C,.+2\r
- PUSHJ PP,DNC ;RECURSE IF NON-ZERO\r
- HLRZ C,0(PP)\r
- ADDI C,"0" ;FORM ASCII\r
- JRST PRINT ;DUMP AND TEST FOR END\r
-\r
-OUTAS0: HRLI CS,(POINT 7,,) ;ENTRY TO SET POINTER\r
-OUTASC: ILDB C,CS ;GET NEXT BYTE\r
- JUMPE C,POPOUT ;EXIT ON ZERO DELIMITER\r
- PUSHJ PP,PRINT\r
- JRST OUTASC\r
-\r
-OUTSIX: HRLI CS,(POINT 6,,) ;OUTPUT SIXBIT\r
- ILDB C,CS ;GET SIXBIT\r
- CAIN C,40 ;"@" DELIMITER?\r
- POPJ PP, ;YES, EXIT\r
- ADDI C,40 ;NO, FORM ASCII\r
- PUSHJ PP,OUTL ;OUTPUT ASCII CHAR FROM C\r
- JRST OUTSIX+1\r
-\r
-OUTSYM: MOVE CS,AC0 ;PLACE NAME IN CS\r
-OUTSY1: MOVEI C,0 ;CLEAR C\r
- LSHC C,6 ;MOVE NEXT SIXBIT CHARACTER IN\r
- JUMPE C,OUTTAB ;TEST FOR END\r
- ADDI C,40 ;CONVERT TO ASCII\r
- PUSHJ PP,OUTL ;OUTPUT\r
- JRST OUTSY1 ;LOOP\r
-\fOUTSET: AOS SX,0(PP) ;GET RETURN LOCATION\r
- MOVE SX,-1(SX) ;GET XWD CODE\r
- HLRM SX,BLKTYP ;SET BLOCK TYPE\r
- SETZB ARG,RC\r
- PUSHJ PP,0(SX) ;GO TO PRESCRIBED ROUTINE\r
- JRST COUTD ;TERMINATE BLOCK AND EXIT\r
-\r
- ;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE\r
-\r
-LOOKUP: POP PP,LOOKX ;INTERCEPT RETURN POP\r
- MOVE SX,SYMBOL\r
- MOVE SDEL,0(SX) ;SET FOR TABLE SCAN\r
-LOOKL: SOJL SDEL,POPOUT ;TEST FOR END\r
- ADDI SX,2\r
- MOVE AC0,-1(SX)\r
- PUSHJ PP,SRCH7 ;LOAD REGISTERS\r
- HLRZS ARG\r
- PUSHJ PP,@LOOKX ;RETURN TO CALLING ROUTINE\r
- JRST LOOKL ;TRY AGAIN\r
-\fEND0: PUSHJ PP,EVALCM ;GET A WORD\r
- SKIPE EXTPNT ;ANY EXTERNALS?\r
- TRO ER,ERRE ;YES, ERROR\r
- SKIPN V,AC0 ;NON-ZERO?\r
- JUMPE RC,.+2 ;OR RELOC?\r
- PUSHJ PP,ASSIG7 ;YES, LIST THE VALUE\r
- MOVEM AC0,VECTOR\r
- MOVEM RC,VECREL\r
- PUSHJ PP,VARA ;FILL OUT SELF-DEFINED VARIABLES\r
- PUSHJ PP,STOUTS ;DUMP THE LINE\r
-; PUSH PP,IO ;SAVE FLAGS\r
-; TLO IO,IOPROG ;XLIST LITS\r
- PUSHJ PP,LIT1\r
-; POP PP,IO ;GET FLAG BACK\r
- JUMP2 ENDP2\r
-\r
- PUSHJ PP,UOUT\r
- TLNN IO,MFLSW ;SKIP IF ONLY PSEND\r
- PUSHJ PP,REC2\r
- MOVE INDIR ;SET UP FIRST AS LAST\r
- MOVEM LSTFIL ;PRINTED\r
- SETZM LSTPGN\r
- PUSHJ PP,INZ\r
- TLNE IO,MFLSW ;IF PSEND\r
- POPJ PP, ;BACK TO PSEND0\r
- SKIPE PRGPTR ;HAVE ANY PRGEND'S BEEN SEEN\r
- JRST PSEND3 ;YES,GO SET UP AGAIN\r
-\r
-PASS20: SETZM CTLSAV\r
- PUSHJ PP,COUTI\r
- PUSHJ PP,EOUT ;OUTPUT THE ENTRIES\r
- PUSHJ PP,OUTSET\r
- XWD 6,NOUT ;OUTPUT THE NAME (BLKTYP-6)\r
-IFN RENTSW,<\r
- SKIPN HISNSW ;PUT OUT BLOCK TYPE 3?\r
- JRST PASS21 ;NO\r
- PUSHJ PP,OUTSET\r
- XWD 3,HSOUT ;OUTPUT THE HISEG BLOCK\r
-PASS21: >\r
- MOVEI 1\r
- HRRM BLKTYP ;SET FOR TYPE 1 BLOCK\r
- TLZ FR,P1 ;SET FOR PASS 2 AND TURN OFF FLAG\r
- TLO IO,IOPALL ;PUT THESE BACK\r
- TLZ IO,IOPROG!IOCREF!DEFCRS ;SO LISTINGS WILL BE THE WAY THEY SHOULD\r
- TLNN FR,R1BSW\r
- JRST STOWI\r
- \r
- MOVE CS,[XWD $ST-1-$CKSM,R1BLDR]\r
- MOVE C,0(CS)\r
- PUSHJ PP,PTPBIN\r
- AOBJN CS,.-2\r
- PUSHJ PP,R1BI\r
- JRST STOWI\r
-\f \r
-R1BLDR:\r
- PHASE 0\r
- IOWD $ADR,$ST\r
-$ST: CONO PTR,60\r
- HRRI $A,$RD+1\r
-$RD: CONSO PTR,10\r
- JRST .-1\r
- DATAI PTR,@$TBL1-$RD+1($A)\r
- XCT $TBL1-$RD+1($A)\r
- XCT $TBL2-$RD+1($A)\r
-$A: SOJA $A,\r
-$TBL1: CAME $CKSM,$ADR\r
- ADD $CKSM,1($ADR)\r
- SKIPL $CKSM,$ADR\r
-$TBL2: JRST 4,$ST\r
- AOBJN $ADR,$RD\r
-$ADR: JRST $ST+1\r
-$CKSM: \r
- DEPHASE\r
-\r
-IF2,< PURGE $ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM>\r
-\fENDP2: PUSHJ PP,COUTD ;DUMP THE BUFFER\r
- MOVE AC0,LOCO ;CHECK TO SEE IF LIT DIFFERED\r
- SKIPN MODO ;AND USE SMALLER SINCE AT END\r
- JRST [CAMN AC0,ABSHI\r
- HRRZM AC2,ABSHI\r
- JRST ENDP2W]\r
-IFN RENTSW,<SKIPE HHIGH ;SKIP IF NOT TWO SEGMENTS\r
- JRST [CAMN AC0,HHIGH\r
- HRRZM AC2,HHIGH\r
- JRST ENDP2W]>\r
- CAMN AC0,HIGH\r
- HRRZM AC2,HIGH\r
-ENDP2W:\r
-REPEAT 1,<TLNE IO,IOCREF ;CLOSE CREF IF NECESSARY>\r
-REPEAT 0,<TLNE FR,CREFSW ;IF CREFFING\r
- JRST ENDP2Q\r
- MOVEI SDEL,0\r
- PUSH PP,DBUF+3 ;SO NO PAGE INFO\r
- DPB SDEL,[POINT 7,DBUF+3,13]\r
- IOR ER,OUTSW ;MAKE SURE OF OUTPUT\r
- PUSHJ PP,CREF\r
- MOVEI C,20 ;CODE FOR TITLE\r
- PUSHJ PP,OUTLST\r
- PUSH PP,IO ;SAVE THIS\r
- TLZ IO,IOPAGE ;AND PREVENT PAGE DURING TITLE\r
- MOVEI CS,TBUF\r
- PUSHJ PP,OUTAS0\r
- MOVEI CS,VBUF\r
- PUSHJ PP,OUTAS0\r
- POP PP,IO ;RESTORE THE IO WORD\r
- POP PP,DBUF+3 > ;NEEDS FIX TO CREF\r
- PUSHJ PP,CLSCR2 ;CLOSE IT UP\r
-ENDP2Q: HRR ER,OUTSW ;SET OUTPUT SWITCH\r
- SKIPN TYPERR\r
- TRO ER,TTYSW\r
- PUSHJ PP,UOUT ;OUTPUT UNDEFINEDS\r
- TRO ER,TTYSW\r
- SKPINC C ;SEE IF WE CAN INPUT A CHAR.\r
- JFCL ;BUT ONLY TO DEFEAT ^O\r
- SKIPG C,ERRCNT ;GET ERROR COUNT AND CHECK FOR POSITIVE\r
- JRST NOERW ;PRINT NO ERROR MESSAGE\r
-IFN CCLSW,<ADDM C,JOBERR ;REMEMBER ERROR COUNT FOR EXECUTION DELETION>\r
- PUSHJ PP,OUTCR\r
- MOVE C,ERRCNT\r
- CAIN C,1 ;1 IS A SPECIAL CASE\r
- JRST ONERW ;PRINT MESSAGE\r
- MOVEI C,"?" ;? FOR BATCH\r
- PUSHJ PP,OUTL ;...\r
- MOVE C,ERRCNT ;PRINT NUMBER OF ERRORS\r
- PUSHJ PP,DNC\r
- SKIPA CS,[EXP ERRMS1] ;LOAD TO PRINT\r
-ONERW: MOVEI CS,ERRMS2 ;ONE ERROR DETECTED\r
-ONERW1: PUSHJ PP,OUTSIX ;PRINT\r
- JRST ENDP2A\r
-NOERW: MOVEI CS,ERRMS3\r
-IFN CCLSW,<TLNE IO,CRPGSW!MFLSW ;IF RPG, DON'T PRINT MESSAGE>\r
-IFE CCLSW,<TLNE IO,MFLSW ;NOR IF MULTI-FILE MODE>\r
- TRZ ER,TTYSW ;NO TTY OUTPUT\r
- IOR ER,OUTSW ;UNLESS NEEDED FOR LISTING\r
- PUSHJ PP,OUTCR\r
- JRST ONERW1\r
-\r
-\fENDP2A: PUSHJ PP,OUTCR\r
- TLNN IO,MFLSW ;IN A MULTI-PROG FILE?\r
- JRST ENDP2D ;NO\r
- SKIPE ERRCNT ;ANY ERROR?\r
- PUSHJ PP,[MOVEI CS,[ASCIZ /PROGRAM /]\r
- PUSHJ PP,OUTAS0 ;YES,SO PRINT MESSAGE\r
- MOVEI CS,TBUF ;AND TITLE\r
- PUSHJ PP,OUTAS0 ;FOR IDENTIFICATION\r
- JRST OUTCR] ;AND A CR-LF\r
- TRZA ER,TTYSW ;NO MORE OUTPUT NOW\r
-ENDP2D:\r
-IFN CCLSW,<TLNE IO,CRPGSW ;IF RPG, DON'T PRINT PGM BREAK\r
- TRZ ER,TTYSW ;...>\r
-IFE CCLSW,< SKIPA ;SO PRGEND CODE CAN WORK>\r
- IOR ER,OUTSW ;...\r
- PUSHJ PP,OUTCR\r
-IFN RENTSW,<\r
- MOVEI CS,[SIXBIT /HI-SEG. BREAK IS @/]\r
- SKIPN HHIGH ;DON'T PRINT IF ZERO\r
- JRST ENDP2C ;IT WAS\r
- PUSHJ PP,OUTSIX\r
- HRLO CS,HHIGH ;GET THE BREAK\r
- PUSHJ PP,ONC1\r
- PUSHJ PP,OUTCR\r
-ENDP2C:>\r
- MOVEI CS,[SIXBIT /PROGRAM BREAK IS @/]\r
- PUSHJ PP,OUTSIX ;OUTPUT PROGRAM BREAK\r
- HRRZ CS,ABSHI ;GET ABS. BREAK\r
- CAIG CS,140 ;ANY ABS. CODE\r
- JRST [HRLO CS,HIGH ;NO\r
- JRST ENDP2B] ;SO DON'T PRINT\r
- HRLO CS,HIGH ;GET PROGRAM BREAK\r
- PUSHJ PP,ONC1\r
- PUSHJ PP,OUTCR\r
- MOVEI CS,[SIXBIT /ABSLUTE BREAK IS @/]\r
- PUSHJ PP,OUTSIX\r
- HRLO CS,ABSHI\r
-ENDP2B: PUSHJ PP,ONC1\r
- PUSHJ PP,OUTCR\r
- TLNE FR,RIMSW!R1BSW ;RIM MODE?\r
- PUSHJ PP,RIMFIN ;YES, FINISH IT\r
-IFN CCLSW,<TLNN IO,CRPGSW!MFLSW ;IF NOT IN CCL MODE>\r
-IFE CCLSW,<TLNN IO,MFLSW ;NOR IF IN MULTI-FILE MODE>\r
- TRO ER,TTYSW ;PRINT SIZE\r
- PUSHJ PP,OUTCR\r
- MOVE C,JOBREL\r
- LSH C,-^D10\r
- ADDI C,1\r
- PUSHJ PP,DNC\r
- MOVEI CS,[SIXBIT /K CORE USED@/]\r
- PUSHJ PP,OUTSIX\r
- PUSHJ PP,OUTCR \r
- HRR ER,OUTSW\r
- PUSHJ PP,OUTSET\r
- XWD 2,SOUT ;OUTPUT THE SYMBOLS (BLKTYP-2)\r
- PUSHJ PP,OUTSET\r
- XWD 7,VOUT ;OUTPUT TRANSFER VECTOR (..-7)\r
-IFN WFWSW,<PUSHJ PP,OUTSET ;OUTPUT THE LVAR FIXUPS\r
- XWD 13,OUTB12>\r
- PUSHJ PP,OUTSET\r
- XWD 5,HOUT ;OUTPUT HIGHEST RELOCATABLE (..-5)\r
- PUSHJ PP,COUTD\r
- TLNN IO,MFLSW ;IS IT PRGEND?\r
- JRST FINIS ;ALAS, FINISHED\r
- MOVEI CS,SBUF ;RESET SBUF POINTER\r
- HRRM CS,SUBTTX ;TO SUBTTL\r
- SETZM PASS2I ;CLEAR PASS2 VARIABLES\r
- MOVE [XWD PASS2I,PASS2I+1]\r
- BLT PASS2Z-1 ;BUT NOT ALL OF VARIABLES\r
- JRST INZ ;RE-INITIALIZE FOR NEXT PROG\r
-\fIFN WFWSW,<\r
-OUTB12: SKIPN ARG,FIXLNK ;WERE THERE ANY??\r
- POPJ PP, ;JUST GO AWAY\r
-OUTB19: HRRZ SX,(ARG) ;POINTER TO HEADER BLOCK NOW IN SX\r
- HRRZ AC1,(SX) ;NOW AC1 HAS POINTER TO CODE FIXUPS\r
- JUMPE AC1,OUTB13 ;NONE THERE\r
-OUTB16: HLRZ AC0,(AC1) ;GET LOCATION OFFSET\r
- ADD AC0,2(SX) ;ADD BASE LOCATION\r
- SKIPN 1(AC1) ;AND RIGHT HALF??\r
- JRST OUTB14 ;NO\r
- PUSH PP,AC0 ;SAVE FIXUP VALUE\r
- SETZB AC0,RC\r
- PUSHJ PP,OUTBWD ;OUTPUT A Z (SAYS RIGHT HALF CODE)\r
- POP PP,AC0 ;GET VALUE BACK\r
- HLRZ RC,1(AC1) ;GET RELOC OF FIXUP CHAIN\r
- LSH RC,1 ;GOES IN LEFT HALF\r
- HRL AC0,1(AC1) ;LOCATION OF CHAIN\r
- PUSHJ PP,OUTBWD ;LEFT HALF LOCATION, RIGHT HALF VALUE\r
-OUTB14: SKIPN 2(AC1) ;ANY LEFT HALF??\r
- JRST OUTB15 ;NO, GO LOOK FOR NEXT BLOCK\r
- PUSH PP,AC0 ;SAVE VALUE\r
- MOVEI RC,0\r
- MOVSI AC0,400000 ;INDICATE LEFT HALF\r
- PUSHJ PP,OUTBWD\r
- POP PP,AC0\r
- HLRZ RC,2(AC1) ;GET RELOC FOR LEFT HALF\r
- LSH RC,1\r
- HRL AC0,2(AC1)\r
- PUSHJ PP,OUTBWD\r
-OUTB15: HRRZ AC1,(AC1) ;NEXT LINK IN CHAIN\r
- JUMPN AC1,OUTB16 ;IF NOT END, PROCESS\r
-OUTB13: HLRZ AC1,(SX) ;POINTER TO SYMBOL TABLE FIXUP CHAIN\r
- JUMPE AC1,OUTB17 ;CHACK FOR SOME THERE\r
-OUTB18: MOVE AC0,2(AC1) ;FLAGS\r
- HRR AC0,2(SX) ;VALUE IN RH\r
- MOVEI RC,0 ;NO RELCO ON IT\r
- PUSHJ PP,OUTBWD\r
- MOVE AC0,1(AC1) ;THE SYMBOL NAME\r
- PUSHJ PP,OUTBWD\r
- HRRZ AC1,(AC1) ;FOOLOW CHAIN\r
- JUMPN AC1,OUTB18\r
-OUTB17: HRRZ ARG,-1(ARG) ;DONE WITH THIS SYMBOL GET NEXT\r
- JUMPN ARG,OUTB19\r
- POPJ PP, ;ALL DONE\r
-\f\r
-OUTBWD: SKIPL COUTX ;IF WE ARE AT THE START\r
- JRST COUT ;NO PUT OUT\r
- PUSH PP,AC0 ;WE NEED TO PUT NEW RELOC AND VAR LENGTH\r
- PUSH PP,RC ;AS FIRST TWO WORDS\r
- MOVE AC0,HIGH\r
- MOVEI RC,1 ;IT IS RELOC\r
- PUSHJ PP,COUT\r
- MOVE AC0,LVARLC ;THE LENGTH\r
- MOVEI RC,0\r
- PUSHJ PP,COUT\r
- POP PP,RC\r
- POP PP,AC0\r
- JRST COUT ;NOW PUT OUT THE ONE WE WANTED TO\r
->\r
-\r
-RIMFIN: TLNE FR,R1BSW\r
- PUSHJ PP,R1BDMP\r
- SKIPN C,VECTOR\r
- MOVSI C,(JRST 4,)\r
- TLNN C,777000\r
- TLO C,(JRST)\r
- PUSHJ PP,PTPBIN\r
- MOVEI C,0\r
- JRST PTPBIN\r
-\fSUBTTL PASS INITIALIZE\r
-INZ: AOS MODA\r
- AOS MODO\r
- SETZM SEQNO\r
- SETZM TAG\r
- HRRI RX,^D8\r
- MOVEI VARHD\r
- MOVEM VARHDX\r
- MOVEI LITHD\r
- MOVEM LITHDX\r
- PUSHJ PP,LITI\r
- PUSHJ PP,STOWI\r
-IFN FORMSW,<\r
- HRRES HWFMT ;SET DEFAULT VALUE BACK>\r
- JRST OUTLI\r
-\r
-RCPNTR: POINT 1,ARG,^L<RELF>-18 ;POINT 1,ARG,22\r
-\fSUBTTL PSEUDO-OP HANDLERS\r
-\r
-TAPE0: PUSHJ PP,STOUTS ;FINISH THIS LINE\r
- JRST GOTEND ;AND IGNORE THE REST OF THIS FILE\r
-\r
-RADIX0: PUSHJ PP,EVAL10 ;EVALUATE RADIX D10\r
- CAIG AC0,^D10 ;IF GREATER THAN 10\r
- CAIG AC0,1 ;OR LESS THAN 2,\r
-ERRAX: TROA ER,ERRA ;FLAG ERROR AND SKIP\r
- HRR RX,AC0 ;SET NEW RADIX\r
- POPJ PP,\r
-\r
-\r
-XALL0: TLZ IO,IOSALL ;TURN OFF MACRO SUPPRESS ALL\r
-IOSET: JUMP1 POPOUT ;NOSYM (IONSYM), XALL (IOPALL), XLIST (IOPROG)\r
- HLRZ SX,AC0 ;STORE FLAGS\r
- PUSHJ PP,STOUTS ;POLISH OFF LINE\r
- TLO IO,0(SX) ;NOW SUPRESS PRINTING\r
- POPJ PP,\r
-\r
-IORSET: TDZ IO,AC0 ;RESET FLAG IOPALL/IOPROG\r
- TLNE AC0,IONCRF ;RESTORING CREFFING?\r
- TLZ IO,DEFCRS ;YES, CLEAR ANY WAITING DEFINING OCCURENCES\r
- POPJ PP,\r
-\r
-BLOCK0: PUSHJ PP,HIGHQ\r
- PUSHJ PP,EVALEX ;EVALUATE\r
- TRZE RC,-1 ;EXTERNAL OR RELOCATABLE?\r
- PUSHJ PP,QEXT ;YES, DETERMINE TYPE\r
- ADDM AC0,LOCO ;UPDATE ASSEMBLY LOCATION\r
-BLOCK1: EXCH AC0,LOCA ;SAVE START OF BLOCK\r
- ADDM AC0,LOCA ;UPDATE OUTPUT LOCATION\r
-BLOCK2: HRLOM AC0,LOCBLK\r
- JUMP2 POPOUT\r
- TRNE ER,ERRU\r
- TRO ER,ERRV\r
- POPJ PP,\r
-\f\r
-PRNTX0: TRO ER,TTYSW ;SET OUTPUT TO TTY\r
- JUMP2 PRNTX2 ;PASS1?\r
- TDOA ER,OUTSW ;YES,OUTPUT TO LSTDEV ALSO\r
-PRNTX2: ANDCM ER,OUTSW ;NO,DON'T OUTPUT TO TTY IF IT IS LSTDEV\r
- PUSHJ PP,BYPASS ;GET FIRST CHAR.\r
- TLOA IO,IORPTC ;REPEAT IT AND SKIP\r
-PRNTX4: PUSHJ PP,PRINT ;PRINT THE CHAR.\r
- PUSHJ PP,CHARAC ;GET ASCII CHAR.\r
- CAIG C,CR ;IF GREATER THAN CR\r
- CAIG C,HT ;OR LESS THAN LF\r
- JRST PRNTX4 ;THEN CONTINUE\r
- PUSHJ PP,OUTCR ;OUTPUT A CRLF\r
- TRZA ER,TTYSW!LPTSW ;TURN OF OUTPUT\r
-CPOPJ1: AOS (PP) ;USEFUL TAG HAS TO GO SOMEWHERE\r
-CPOPJ: POPJ PP, ;EXIT\r
-\r
-REMAR0: PUSHJ PP,GETCHR ;GET A CHARACTER\r
- CAIE C,EOL\r
- JRST REMAR0\r
- POPJ PP, ;EXIT\r
-\fLIT0: PUSHJ PP,BLOCK1\r
- PUSHJ PP,STOUTS\r
-LIT1: JUMP2 LIT20\r
-\r
-;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR\r
-\r
- MOVE AC0,LITCNT\r
- MOVE SX,LITHDX\r
- HRLM AC0,0(SX)\r
- MOVE V,LOCA\r
- HRL V,MODA\r
- MOVEM V,-1(SX)\r
- JRST LIT24\r
-\r
-LIT20: PUSH PP,LOCA\r
- PUSH PP,LOCO\r
- SKIPN LITNUM\r
- JRST LIT20A\r
- MOVE SX,LITHDX\r
- HRRZ AC0,-1(SX)\r
- CAME AC0,LOCA\r
- TRO ER,ERRP\r
-LIT20A: MOVE SX,LITAB\r
-LIT21: SOSGE LITNUM\r
- JRST LIT22\r
-IFN FORMSW,<\r
- MOVE AC0,-3(SX)\r
- MOVEM AC0,FORM\r
->\r
- MOVE AC0,-2(SX) ;WFW\r
- MOVE RC,-1(SX) ;WFW\r
- MOVE SX,(SX) ;WFW POINTER TO THE NEXT LIT\r
- PUSHJ PP,STOW20 ;STOW CODE\r
- MOVEI C,12 ;SET LINE FEED\r
- IDPB C,LBUFP\r
- PUSHJ PP,OUTLIN ;OUTPUT THE LINE\r
- JRST LIT21\r
-\fLIT22: HRRZ AC2,LOCO\r
- POP PP,LOCO\r
- POP PP,LOCA\r
- MOVE SX,LITHDX\r
- HLRZ AC0,0(SX)\r
- SUB AC2,LOCO ;COMPUTE LENGTH USED\r
- CAMGE AC0,AC2 ;USE LARGER\r
- MOVE AC0,AC2\r
- ADD AC2,LOCO\r
-LIT24: ADDM AC0,LOCA\r
- ADDM AC0,LOCO\r
- PUSHJ PP,GETTOP\r
- HRRM SX,LITHDX\r
-LITI: SETZM LITCNT\r
- SETZM LITNUM\r
- MOVEI LITAB\r
- MOVEM LITABX\r
- JRST HIGHQ\r
-\r
-GETTOP: HRRZ AC1,SX ;VARHD\r
- HRRZ SX,0(SX)\r
- JUMPN SX,POPOUT\r
-IFE FORMSW,< MOVEI SX,3 ;WFW>\r
-IFN FORMSW,< MOVEI SX,4 ;ICC>\r
- ADDB SX,FREE\r
- CAML SX,SYMBOL\r
- PUSHJ PP,XCEED\r
- SUBI SX,1 ;MAKE SX POINT TO LINK\r
- SETZM 0(SX) ;CLEAR FORWARD LINK\r
- HRRM SX,0(AC1) ;STORE ADDRESS IN LAST LINK\r
- POPJ PP,\r
-\fVAR0: PUSHJ PP,BLOCK1 ;PRINT LOCATION\r
- PUSHJ PP,VARA\r
- JRST STOUTS\r
-\r
-VARA: MOVE SX,VARHDX\r
- MOVE AC0,LOCA ;GET LOCATION FOR CHECK\r
- JUMP1 VARB ;DO NOT CHECK START ON PASS 1\r
- CAME AC0,-1(SX) ;CHECK START OF VAR AREA\r
- TRO ER,ERRP ;AND GIVE ERROR\r
-VARB: MOVEM AC0,-1(SX) ;SAVE START FOR PASS 2\r
- HLRZ AC0,0(SX)\r
- ADDM AC0,LOCA\r
- ADDM AC0,LOCO\r
- PUSHJ PP,GETTOP\r
- HRRM SX,VARHDX\r
- JUMP2 POPOUT\r
-\r
- PUSHJ PP,LOOKUP ;SET FOR TABLE SCAN\r
-IFN WFWSW,<TRNN ARG,EXTF ;IN CASE LVAR HAS BEEN THROUGH>\r
- TRZN ARG,VARF\r
- POPJ PP, ;NO, EXIT\r
- TRZ ARG,UNDF ;TURN OFF FLAG NOW\r
-IFN WFWSW,<MOVSI AC0,1(V) ;NUMBER TO ADD TO>\r
-IFE WFWSW,<MOVSI AC0,1 ;ADD 1>\r
- ADDM AC0,0(AC1) ;UPDATE COUNT\r
-IFN WFWSW,<\r
-VARA1: ADDI V,1 ;GET LENGTH OF DESIRED BLOCK\r
- ADDM V,LOCO\r
- EXCH V,LOCA\r
- ADDM V,LOCA\r
- HRL ARG,V ;GET STARTING LOCATION AND UPDAT PCS\r
->\r
-\r
- IOR ARG,MODA ;SET TO ASSEMBLY MODE\r
-IFE WFWSW,<HRL ARG,LOCA>\r
- MOVSM ARG,0(SX) ;UPDATE 2ND WRD OF SYM TAB ENTRY\r
-IFE WFWSW,<AOS LOCA\r
- AOS LOCO>\r
- JRST HIGHQ1\r
-\fIF: PUSH PP,AC0 ;SAVE AC0\r
- PUSH PP,IO\r
- PUSHJ PP,EVALXQ ;EVALUATE AND TEST EXTERNAL\r
- POP PP,AC1\r
- JUMPL AC1,IFPOP\r
- TLZ IO,FLDSW\r
-IFPOP: POP PP,AC1 ;RETRIEVE SKIP INSTRUCTION\r
-IFSET: TLO IO,IORPTC ;REPEAT CHARACTER\r
-IFXCT: XCT AC1 ;EXECUTE INSTRUCTION\r
- TDZA AC0,AC0 ;FALSE\r
- MOVEI AC0,1 ;TRUE\r
-IFEXIT: JUMPOC REPEA1 ;BRANCH IF IN OP-CODE FIELD\r
-IFEX1: PUSHJ PP,GETCHR ;SEARCH FOR "<"\r
- CAIN C,EOL ;ERROR IF END OF LINE\r
- JRST ERRAX\r
- CAIE C,34\r
- JRST IFEX1\r
- JUMPE AC0,IFEX2 ;TEST FOR 0\r
- TLO IO,IORPTC ;NO, PROCESS AS CELL\r
- PUSHJ PP,CELL\r
-IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>\r
- SETZM INCND ;NOT ANY MORE\r
- JRST STOW ;STOW CODE AND EXIT\r
-\r
-IFPASS: HRRI AC0,P1 ;MAKE IT TLNX IO,P1\r
- MOVE AC1,AC0 ;PLACE IT IN AC1\r
- JRST IFSET ;EXECUTE INSTRUCTION\r
-\r
-IFB0: HLLO AC1,AC0 ;FORM AND STORE TEST INSTRUCTION\r
-IFB1: PUSHJ PP,CHARL ;GET FIRST NON-BLANK\r
- CAIE C," "\r
- CAIN C," "\r
- JRST IFB1 ;SKIP BLANKS AND TABS\r
- CAIG C,CR ;CHECK FOR CARRET AS DELIM.\r
- CAIGE C,LF\r
- SKIPA SX,SEQNO2\r
- JRST ERRAX\r
- MOVEM SX,CNDSEQ\r
- MOVE SX,PAGENO\r
- MOVEM SX,CNDPG\r
- SETOM INCND ;SAVE INFO. FOR PASS 1 ERRORS\r
- CAIN C,"<" ;LEFT BRACKET?\r
- SETZB C,RC ;YES, PREPARE FOR OLD FORMAT\r
- SKIPA SX,C ;SAVE FOR COMPARISON\r
-IFB3: TRO AC0,1 ;SET FLAG\r
-IFB2: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST\r
- CAMN C,SX ;TEST FOR DELIMITER\r
- JRST IFXCT ;FOUND\r
- CAIE C," " ;BLANK?\r
- CAIN C," " ;OR TAB?\r
- JRST IFB2 ;YES\r
- JUMPN SX,IFB3 ;JUMP IF NEW FORMAT\r
- CAIN C,"<" ;<?\r
- AOJA RC,IFB2 ;YES, INCREMENT COUNT\r
- CAIN C,">" ;>?\r
- SOJL RC,IFXCT ;YES, DECREMENT AND EXIT IF DONE\r
- JRST IFB3 ;GET NEXT CHARACTER\r
-\r
-\fIFDEF0: HRRI AC0,UNDF ;MAKE IT TLNX ARG,UNDF\r
- PUSH PP,AC0 ;STACK IT\r
- PUSHJ PP,GETSYM ;TAKES SKIP RETURN IF SYM NAME IS LEGAL\r
- TROA ER,ERRA ;ILLEGAL!\r
- PUSHJ PP,SEARCH\r
- JRST [PUSHJ PP,OPTSCH\r
- TLO ARG,UNDF\r
- JRST .+1]\r
- PUSHJ PP,SSRCH3 ;EMIT TO CREF ANYWAY\r
- JRST IFPOP ;POP AND EXECUTE INSTRUCTION\r
-\r
-\fIFIDN0: HLRZS AC0\r
- MOVEI V,2*.IFBLK-1\r
- SETZM IFBLK(V) ;CLEAR COMPARISON BLOCK\r
- SOJGE V,.-1\r
- SETZM .TEMP ;CLEAR STORED DELIMETER\r
- MOVEI RC,IFBLK ;SET FOR FIRST BLOCK\r
- PUSHJ PP,IFCL ;GET FIRST STRING\r
- MOVEI RC,IFBLKA\r
- PUSHJ PP,IFCL ;GET SECOND STRING\r
- MOVEI V,.IFBLK-1\r
- MOVE SX,IFBLK(V) ;GET WORD FROM FIRST STRING\r
- CAMN SX,IFBLKA(V) ;COMPARE WITH SECOND STRING\r
- SOJGE V,.-2 ;EQUAL, TRY NEXT WORD\r
- JUMPL V,IFEXIT ;DID WE FINISH STRING\r
- XORI AC0,1 ;NO, TOGGLE REQUEST\r
- JRST IFEXIT ;DO NOT TURN ON IORPTC WFW\r
-\r
-IFCL: PUSHJ PP,CHARAC ;GET AND LIST CHARACTER\r
- CAIE C," " ;SKIP SPACES\r
- CAIG C,CR ;ALSO SKIP CR-LF\r
- CAIGE C,HT ;AND TAB\r
- JRST .+2 ;NOT ONE OF THEM\r
- JRST IFCL ;SO LONG COMPARISONS WILL WORK\r
-;*** A CROCK SO THAT IFIDN <X>,<X>,<INST.> WILL WORK ***\r
- CAIE C,"," ;IS IT A COMMA?\r
- JRST .+3 ;NO\r
- SKIPN .TEMP ;YES, WAS PREVIOUS FIELD OLD METHOD?\r
- JRST IFCL ;YES, IGNORE COMMA AND SPACES\r
-; ***\r
- CAIN C,"<" ;WAS IT LEFT BRACKET?\r
- SETO C, ;SIGNAL OLD METHOD, LOOK FOR RIGHT BRACKET\r
- MOVEM C,.TEMP ;STORE TERMINATOR FOR COMPARISON\r
- MOVEI SX,5*.IFBLK-1 ;LIMIT SEARCH\r
- HRLI RC,(POINT 7,,) ;SET UP BYTE IN RC\r
-IFCLR: PUSHJ PP,CHARAC\r
- SKIPLE .TEMP ;NEW METHOD?\r
- JRST IFCLR1 ;YES, IGNORE ANGLE BRACKET COUNTING\r
- CAIN C,"<" ;ANOTHER LEFT ANGLE?\r
- SOS .TEMP ;YES, KEEP COUNT\r
- CAIN C,">" ;CLOSING ANGLE\r
- AOSGE .TEMP ;MATCHING COUNT?\r
-IFCLR1: CAMN C,.TEMP ;TEST FOR DELIMITER\r
- POPJ PP, ;EXIT ON RIGHT DELIMITER\r
- SOJG SX,.+2 ;ANY ROOM IN COMPARISON BLOCK?\r
- TROA ER,ERRA ;NO, FLAG ERROR BUT KEEP ON GOING\r
- IDPB C,RC ;DEPOSIT BYTE\r
- JRST IFCLR\r
-\r
-\f\r
-IFEX2: PUSHJ PP,GETCHR\r
- CAIN C,EOL ;EXIT WITH ERROR IF END OF LINE\r
- JRST ERRAX\r
- CAIN C,34 ;"<"?\r
- AOJA AC0,IFEX2 ;YES, INCREMENT COUNT\r
- CAIE C,36 ;">"?\r
- JRST IFEX2 ;NO, TRY AGAIN\r
- SOJGE AC0,IFEX2 ;YES, TEST FOR MATCH\r
- PUSHJ PP,BYPASS ;YES, MOVE TO NEXT DELIMITER\r
- SETZM INCND ;OUT OF CONDITIONAL NOW\r
- AOJA AC0,STOWZ1 ;STOW ZERO\r
-\r
-\r
-INTER0: HLLZM AC0,INTENT ;AC0 CONTAINS INTF/ENTF FLAGS\r
-\r
-INTER1: PUSHJ PP,GETSYM ;GET A SYMBOL\r
- JRST INTER3 ;INVALID, SKIP\r
- PUSHJ PP,SSRCH ;SEARCH THE TABLE\r
- MOVSI ARG,SYMF!INTF!UNDF\r
- TLNE ARG,UNDF ;UNDEFINED?\r
- TRO ER,ERRA ;YES, FLAG ERROR\r
-IFN WFWSW,<TLNN ARG,VARF ;LET HIM MAKE INTERNAL EVEN IF EXTF ON>\r
- TLNN ARG,SYNF!EXTF\r
- TDOA ARG,INTENT ;SET APPROPRIATE FLAGS\r
-INTER3: TROA ER,ERRA ;FLAG ARG EROR AND SKIP\r
- PUSHJ PP,INSERQ ;INSERT/UPDATE\r
- JUMPCM INTER1\r
- SETZM EXTPNT ;JUST IN CASE, SO AS NOT TO CONFUSE WORLD\r
- POPJ PP, ;NO, EXIT\r
-\fEXTER0: PUSHJ PP,GETSYM ;GET A SYMBOL\r
- JRST EXTER4 ;INVALID, ERROR\r
-EXTER1: TLO IO,DEFCRS ;FLAG THIS AS A DEFINITION\r
- PUSHJ PP,SSRCH ;OK, SEARCH SYMBOL TABLE\r
- JRST EXTER2 ;NOT THERE, INSERT IT\r
- TLNN ARG,EXTF!VARF!UNDF\r
- TROA ER,ERRE ;FLAG ERROR AND BYPASS\r
- TLNE ARG,EXTF ;VALID, ALREADY DEFINED?\r
- JRST [JUMP1 EXTER3 ;YES, BYPASS\r
- TLZN ARG,UNDF ;SKIP IF UNDEFINED ALSO\r
- JRST EXTER3 ;CONTINUE\r
- ANDM ARG,(SX) ;CLEAR UNDF ON PASS 2\r
- JRST EXTER2] ;SET UP EXTERNAL NOW\r
-EXTER2: MOVEI V,2 ;NO, GET 2 CELLS FROM THE TREE\r
- ADDB V,FREE\r
- CAML V,SYMBOL ;HAVE WE RUN OUT OF CORE?\r
- PUSHJ PP,XCEEDS ;YES, TRY TO BORROW SOME MORE\r
- SUBI V,2 ;GET RIGHT CELL FOR POINTER\r
- SETZB RC,0(V) ;ALL SET, ZERO VALUES\r
- MOVSI ARG,SYMF!EXTF\r
- PUSHJ PP,INSERT ;INSERT/UPDATE IT\r
- MOVSI ARG,PNTF\r
- IORM ARG,0(SX)\r
- SKIPA ARG,-1(SX) ;GET THE SIXBIT FOR THE NAME\r
-EXTER4: TROA ER,ERRA ;FLAG AS ERROR\r
- MOVEM ARG,1(V) ;AND STORE THAT IN CASE SYMBOL TABLE MOVES\r
-EXTER3: JUMPCM EXTER0\r
- POPJ PP, ;NO, EXIT\r
-\fEVAL10: PUSH PP,RX\r
- HRRI RX,^D10\r
- PUSHJ PP,EVALEX ;EVALUATE\r
- POP PP,RX ;RESET RADIX\r
- JUMPE RC,POPOUT ;EXIT IF ABSOLUTE\r
-\r
-QEXT: SKIPE EXTPNT ;ANY POSSIBILITIES?\r
- TROA ER,ERRE ;YES, FLAG EXTERNAL ERROR\r
- TRO ER,ERRR ;NO, FLAG RELOCATION ERROR\r
- HLLZS RC ;CLEAR RELOCATION/EXTERNAL\r
- POPJ PP,\r
-\r
-EVALXQ: PUSHJ PP,EVALEX ;EVALUATE EXPRESSION\r
- TLZN RC,-2 ;LEFT HALF EXTERNAL\r
- TRZE RC,-2 ;WAS AN EXTERNAL FOUND?\r
- TRO ER,ERRE ;YES, FLAG ERROR\r
- POPJ PP, ;RETURN\r
-\fOPDEF0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL\r
- POPJ PP, ;ERROR IF INVALID SYMBOL\r
- CAIE C,73 ;"["?\r
- JRST ERRAX ;NO, ERROR\r
- PUSH PP,AC0 ;STACK MNEMONIC\r
- AOS LITLVL ;SHORT OUT LOCATION INCREMENT\r
- PUSHJ PP,STMNT ;EVALUATE STATEMENT\r
- SKIPGE STPX ;CODE STORED?\r
- TROA ER,ERRA ;NO,"A" ERROR\r
- PUSHJ PP,DSTOW ;GET AND DECODE VALUE\r
- SOS LITLVL\r
- EXCH AC0,0(PP) ;EXCHANGE VALUE FOR MNEMONIC\r
- PUSH PP,RC ;STACK RELOCATION\r
- TLO IO,DEFCRS ;SAY WE ARE DEFINING IT\r
- PUSHJ PP,MSRCH ;SEARCH SYMBOL TABLE\r
- MOVSI ARG,OPDF ;NOT FOUND\r
- POP PP,RC ;RESTORE VALUES\r
- POP PP,V\r
- TLNE ARG,SYNF!MACF\r
- TRO ER,ERRA ;YES "A" ERROR\r
- TRNN ER,ERRA ;ERROR?\r
- PUSHJ PP,INSERT ;NO, INSERT/UPDATE\r
- TLZ IO,DEFCRS ;JUST IN CASE\r
- PUSHJ PP,BYPASS\r
- JRST STOWI ;BE SURE STOW IS RESET\r
-\r
-\r
-DEPHA0: MOVE AC0,LOCO\r
- SKIPA RC,MODO ;SET TO OUTPUT VALUES AND SKIP\r
-PHASE0: PUSHJ PP,EVALXQ ;EVALUATE AND CHECK FOR EXTERNAL\r
- MOVEM AC0,LOCA ;SET ASSEMBLY LOCATION COUNTER\r
- MOVEM RC,MODA\r
- JRST BLOCK2\r
-\fASSIGN: JUMPAD ERRAX ;NO, ERROR\r
- PUSHJ PP,ASSIG1\r
- TLNE IO,IOSALL ;SUPPRESS ALL?\r
- JUMPN MRP,CPOPJ ;IF IN MACRO\r
-ASSIG7: MOVEM RC,ASGBLK\r
- TRNE RC,-2 ;EXTERNAL\r
- HLLZS ASGBLK ;YES,CLEAR RELOCATION\r
- TLNE RC,1 ;LEFT HALF NOT RELOC?\r
- TLNE RC,-2 ;...\r
- HRROS ASGBLK ;YES, SET FLAG\r
- MOVEM V,LOCBLK\r
- POPJ PP,\r
-\r
-ASSIG1: PUSH PP,AC0 ;SAVE SYMBOL\r
- SETZB AC0,EXTPNT ;SPECIAL CHECK FOR == WFW\r
- PUSHJ PP,PEEK ;IS THE NEXT ON =\r
- CAIE C,"="\r
- JRST ASSIG5\r
- TLO AC0,NOOUTF ;YES, NOT OUT TO DDT WFW\r
- PUSHJ PP,GETCHR ;PROCESS THE CHAR.\r
- PUSHJ PP,PEEK ;CHECK FOR ==: DMN\r
-ASSIG5: CAIE C,":" ;IS IT\r
- JRST ASSIG6 ;NO\r
- TLO AC0,INTF ;MAKE INTERNAL\r
- PUSHJ PP,GETCHR ;REPEAT IT\r
-ASSIG6: MOVEM AC0,HDAS ;STORE THESE BITS WFW\r
- PUSHJ PP,EVALCM ;EVALUATE EXPRESSION\r
- EXCH AC0,0(PP) ;SWAP VALUE FOR SYMBOL\r
- PUSH PP,RC\r
- TRNN RC,-2 ;CHECK EXTERNAL AGREEMENT\r
- JRST ASSIG2\r
- HRRZS RC\r
- HRRZ ARG,EXTPNT\r
- CAME RC,ARG\r
- PUSHJ PP,QEXT ;EXTERNAL OR RELOCATION ERROR\r
-ASSIG2: HLRZ RC,(PP)\r
- TRNN RC,-2\r
- JRST ASSIG3\r
- HLRZ ARG,EXTPNT\r
- CAME RC,ARG\r
- PUSHJ PP,QEXT\r
-ASSIG3: TLO IO,DEFCRS\r
- PUSHJ PP,SSRCH\r
- MOVSI ARG,SYMF\r
- IOR ARG,HDAS ;WFW\r
- TLNE ARG,UNDF ;WAS IT UNDEFINED\r
- TLZ ARG,EXTF!PNTF ;YES,CLEAR EXTF NOW\r
- TLZ ARG,UNDF!VARF ;CANCEL UNDEFINED AND VARIABLE FLAGS\r
- SETZM EXTPNT ;FOR REST OF WORLD\r
- POP PP,RC\r
- TRNE ER,ERRORS-ERRQ\r
- SETZ RC, ;CLEAR RELOCATION\r
- POP PP,V\r
- TRNE ER,ERRU ;WAS VALUE UNDEFINED?\r
- TLO ARG,UNDF ;YES,SO TURN UNDF ON\r
- TLNE ARG,TAGF!EXTF\r
- JRST ERRAX\r
- JRST INSERT\r
-\r
-\fLOC0: PUSHJ PP,HIGHQ ;AC0=0,0\r
- PUSH PP,AC0 ;SAVE MODE REQUESTED\r
- HLRZS AC0 ;PUT MODE IN RIGHT HALF\r
- JUMPN AC0,RELOC0 ;RELOC PSEUDO-OP\r
- CAMN AC0,MODO ;SAME AS PRESENT MODE?\r
- JRST [HRRZ AC0,LOCO ;YES\r
- EXCH AC0,ABSLOC ;EXCH VALUES\r
- JRST LOC01]\r
- HRRZ AC0,LOCO ;NO, GET CURRENT VALUE\r
- MOVEM AC0,RELLOC ;SAVE IT\r
- MOVE AC0,ABSLOC ;GET LAST RELOC VALUE\r
-LOC01: PUSHJ PP,BYPASS ;SKIP BLANKS\r
- TLO IO,IORPTC\r
- CAIE C,EOL ;USE PREVIOUS VALUE IF NULL ARGUMENT\r
- PUSHJ PP,EVALXQ ;GET EXPRESSION AND TEST EXTERNAL\r
- HRRM AC0,(PP) ;STORE NEW VALUE\r
- POP PP,AC0 ;RETRIEVE STORED MODE AND VALUE\r
-LOC10: HRRZM AC0,LOCA ;SET ASSEMBLY LOCATION\r
- HRRZM AC0,LOCO ;AND OUTPUT LOCATION\r
- HLRZM AC0,MODA ;SET MODE\r
- HLRZM AC0,MODO\r
- JRST BLOCK2\r
-\r
-RELOC0: CAMN AC0,MODO\r
- JRST [HRRZ AC0,LOCO\r
- EXCH AC0,RELLOC\r
- JRST LOC01]\r
- HRRZ AC0,LOCO\r
- MOVEM AC0,ABSLOC\r
- MOVE AC0,RELLOC\r
- JRST LOC01\r
-\r
-\fIFN RENTSW,<\r
-HISEG1: PUSHJ PP,HIGHQ ;SET CURRENT PROGRAM BREAK\r
- PUSHJ PP,COUTD ;DUMP CURRENT TYPE OF BLOCK\r
- SKIPN HISNSW ;IF WE HAVE SEEN IT BEFORE\r
- SKIPE HIGH ;OR ANY RELOC CODE PUT OUT\r
- TRO ER,ERRQ ;FLAG AS AN ERROR\r
- PUSHJ PP,BYPASS ;GO GET EXPRESSION\r
- TLO IO,IORPTC\r
- PUSHJ PP,EVALXQ ;CHECK FOR EXTERNAL\r
- ANDCMI AC0,1777 ;ONLY ALLOWED TO START ON NEW K BOUND\r
- HRRZM AC0,LOCA ;SET LOC COUNTERS\r
- HRRZM AC0,LOCO\r
- MOVEI RC,1 ;ASSUME RELOCATABLE\r
- POPJ PP,\r
-\r
-TWSEG0: PUSHJ PP,HISEG1 ;COMMON CODE\r
- JUMPN AC0,.+2 ;ARGUMENT SEEN\r
- MOVEI AC0,400000 ;ASSUME 400000\r
- HRRZM AC0,HMIN ;SET OFSET OF HIGH SEG.\r
- HRRZM AC0,HHIGH ;INCASE NO HISEG CODE\r
- TLOA AC0,(1B0) ;SIGNAL TWO SEGMENTS AND SKIP\r
-\r
-HISEG0: PUSHJ PP,HISEG1 ;COMMON CODE\r
-HISEG2: MOVEM AC0,SVTYP3 ;SAVE THE HISEG ARG\r
- MOVEM RC,MODA ;SET MODES\r
- MOVEM RC,MODO\r
- SETOM HISNSW ;WE HAVE ALREADY PUT ONE OUT\r
- JRST BLOCK2 ;MAKE LISTING HAPPEN RIGHT>\r
-\r
-IFE RENTSW,<\r
- SYN CPOPJ,HISEG0\r
- SYN CPOPJ,TWSEG0>\r
-\r
-IFN FORMSW,<\r
-ONFORM: HRRES HWFMT ;ALLOW MULTI-FORMAT LISTING\r
- POPJ PP,\r
-OFFORM: HRROS HWFMT ;HALF-WORD FORMAT ONLY\r
- POPJ PP, >\r
-\r
-IFE FORMSW,<\r
- SYN CPOPJ,ONFORM\r
- SYN CPOPJ,OFFORM>\r
-\fHIGHQ:\r
-HIGHQ1: MOVE V,LOCO ;GET ASSEMBLY LOCATION\r
- SKIPN MODO ;IF ASSEMBLY MODE IS ABSOLUTE\r
- JRST [CAMLE V,ABSHI ;RECORED ABS HIGHEST ALSO\r
- MOVEM V,ABSHI\r
- POPJ PP,]\r
-IFN RENTSW,<SKIPE HMIN ;IS IT A TWO SEGMENT PROGRAM?\r
- JRST [CAMGE V,HMIN ;YES,IS THIS HIGH SEG.?\r
- JRST .+1 ;NO,STORE LOW SEGMENT\r
- CAMLE V,HHIGH ;YES,IS IT GREATER THAN "HHIGH"?\r
- MOVEM V,HHIGH ;YES,REPLACE WITH LARGER VALUE\r
- POPJ PP,]>\r
- CAMLE V,HIGH ;IS IT GREATER THAN "HIGH"?\r
- MOVEM V,HIGH ;YES, REPLACE WITH LARGER VALUE\r
- POPJ PP,\r
- \r
-ONML: TLZA FR,MWLFLG ;MULTI-WORD LITERALS OK\r
-OFFML: TLO FR,MWLFLG ;NO\r
- POPJ PP,\r
-\r
-OFFSYM: SETOM IONSYM ;SUPRESS SYMBOL TABLE LISTING\r
- POPJ PP,\r
-\r
-SUPRE0: PUSHJ PP,GETSYM ;GET A SYMBOL TO SUPRES\r
- JRST SUPRE1 ;ERROR\r
- PUSHJ PP,SSRCH ;SYMBOL ONLY\r
- JRST SUPRE1 ;GIVE ERROR MESSAGE\r
- TLOA ARG,SUPRBT ;SET THE SUPRESS BIT\r
-SUPRE1: TROA ER,ERRA\r
- IORM ARG,(SX) ;PUT BACK\r
- JUMPCM SUPRE0 ;ANY MORE?\r
- JRST SUPRS1\r
-\r
-SUPRSA: PUSHJ PP,LOOKUP ;SUPRESS ALL\r
- MOVSI ARG,SUPRBT\r
- IORM ARG,(SX)\r
-SUPRS1: SETZM EXTPNT ;JUST IN CASE WE LOOKED ONE UP\r
- POPJ PP,\r
-\r
-XPUNG0: JUMP1 POPOUT\r
- PUSHJ PP,LOOKUP\r
- MOVE ARG,(SX) ;GET SYMBOL FLAGS\r
- TLNN ARG,INTF!ENTF!EXTF!SPTR\r
- TLOA ARG,SUPRBT ;LOCAL SYMBOL,SO SUPPRESS IT\r
- SETZM EXTPNT\r
- MOVEM ARG,(SX) ;RESTORE FLAGS\r
- POPJ PP,\r
-\fTITLE0: JUMP2 REMAR0\r
- MOVEI SX,.TBUF\r
- HRRI AC0,TBUF\r
- PUSHJ PP,SUBTT1 ;GO READ IT\r
- MOVEM SX,TCNT ;SAVE COUNT OF CHARS. WRITTEN\r
- SKIPE UNIVSN ;WAS IT A UNIVERSAL?\r
- PUSHJ PP,ADDUNV ;YES ADD TO TABLE\r
- TLOE IO,IOTLSN ;HAVE WE SEEN ONE\r
-IFE CCLSW,<TRO ER,ERRM ;YES, COMPLAIN>\r
-IFN CCLSW,<TROA ER,ERRM ;YES, MESSAGE\r
- JRST PRNAM ;PRINT NAME IF FIRST ONE>\r
- POPJ PP, ;EXIT OTHERWISE\r
-\r
-SUBTT0: SKIPE SBUF ;STORE FIRST SUBTTL ON PASS1\r
- JUMP1 REMAR0 ;OTHERWISE EXIT IF PASS ONE\r
- MOVEI SX,.SBUF\r
- HRRI AC0,SBUF\r
-\r
-SUBTT1: PUSHJ PP,BYPASS ;BYPASS LEADING BLANKS\r
- TLO IO,IORPTC\r
-SUBTT3: PUSHJ PP,CHARAC ;GET ASCII CHARACTER\r
- IDPB C,AC0 ;STORE IN BLOCK\r
- CAIGE C,40 ;TEST FOR TERMINATOR\r
- CAIN C,HT\r
- SOJG SX,SUBTT3 ;TEST FOR BUFFER FULL\r
- DPB RC,AC0 ;END, STORE TERMINATOR\r
- SOJA SX,CPOPJ ;COUNT NUL AND EXIT\r
-\r
-IFN CCLSW,<\r
-PRNAM: TLNN IO,CRPGSW ;NOT IF NOT RPG\r
- POPJ PP,\r
- PUSH PP,AC0 ;SAVE AC0 DMN\r
- PUSH PP,RC ;AND RC\r
- MOVE AC0,[POINT 7,TBUF]\r
- MOVE SX,[POINT 7,OTBUF]\r
- MOVEI RC,6 ;MAX OF SIX CHRS\r
-PN1: ILDB C,AC0\r
- CAILE C," " ;CHECK FOR LEGAL\r
- CAILE C,"Z"+40 ;CHECK AGAINST LOWER CASE Z\r
- JRST PN2\r
- IDPB C,SX ;PUT IN OUTPUT BUFFER\r
- SOJG RC,PN1 ;GET MORE\r
-PN2: MOVEI C,0\r
- IDPB C,SX ;TERMINATOR\r
- TTCALL 3,OTBUF\r
- TTCALL 3,[ASCIZ /\r
-/]\r
- POP PP,RC\r
- POP PP,AC0 ;RESTORE AC0 DMN\r
- POPJ PP,\r
->\r
-\fSYN0: PUSHJ PP,GETSYM ;GET THE FIRST SYMBOL\r
- JRST ERRAX ;ERROR, EXIT\r
- PUSHJ PP,MSRCH ;TRY FOR MACRO/OPDEF\r
- JRST SYN3 ;NO,0THRY FOR OPERAND\r
-SYN1: MOVEI SX,MSRCH ;YES, SET FLAG\r
-SYN2: PUSHJ PP,SAVEXS ;SAVE REGISTERS\r
- JUMPNC ERRAX ;ERROR IF NO COMMA\r
- PUSHJ PP,GETSYM ;GET THE SECOND SYMBOL\r
- POPJ PP,\r
- PUSHJ PP,@SAVBLK+SX ;SEARCH FOR SECOND SYMBOL\r
- JFCL\r
- MOVE ARG,SAVBLK+ARG ;GET VALUES\r
- MOVE RC,SAVBLK+RC\r
- MOVE V,SAVBLK+V\r
- TLNE ARG,MACF ;MACRO?\r
- PUSHJ PP,REFINC ;YES, INCREMENT REFERENCE\r
- JRST INSERT ;INSERT AND EXIT\r
-\r
-SYN3: PUSHJ PP,SSRCH ;SEARCH FOR OPERAND\r
- JRST SYN4 ;NOT FOUND, TRY OP CODE\r
- TLO ARG,SYNF ;FLAG AS SYNONYM\r
- TLNE ARG,EXTF ;EXTERNAL?\r
- HRRZ V,ARG ;YES, RELPACE WITH POINTER\r
- MOVEI SX,SSRCH ;SET FLAG\r
- TLNN ARG,VARF ;DO NOT LET HIM SYN A VARIABLE\r
- JRST SYN2\r
- JRST ERRAX\r
-\r
-SYN4: PUSHJ PP,OPTSCH ;SEARCH FOR OP-CODE\r
- JRST ERRAX ;NOT FOUND, EXIT WITH ERROR\r
- MOVSI ARG,SYNF ;FLAG AS SYNONYM\r
- JRST SYN1\r
-\fPURGE0: PUSHJ PP,GETSYM ;GET A MNEMONIC\r
- JRST [TRZ ER,ERRA ;CLEAR ERROR\r
- POPJ PP,] ;AND RETURN\r
- PUSHJ PP,MSRCH ;SEARCH MACRO SYMBOL TABLE\r
- JRST PURGE2 ;NOT FOUND, TRY SYMBOLS\r
- PUSH PP,CS ;SAVE CS AS IT MAY GET GARBAGED\r
- TLNE ARG,MACF ;MACRO?\r
- PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE\r
- POP PP,CS\r
- JRST PURGE4 ;REMOVE SYMBOL FROM TABLE\r
-\r
-PURGE2: PUSHJ PP,SSRCH ;TRY OPERAND SYMBOL TABLE\r
- JRST PURGE5 ;NOT FOUND GET NEXT SYMBOL\r
- TRNN RC,-2 ;CHECK COMPLEX EXTERNAL\r
- TLNE RC,-2\r
- TLNE ARG,SYNF\r
- JRST .+2\r
- JRST PURGE3\r
- TLNE ARG,EXTF!UNDF ;ERROR IF EXTERNAL OR UNDEFINED\r
- TLNE ARG,SYNF ;BUT NOT A SYNONYM\r
- JRST PURGE4\r
-PURGE3: TROA ER,ERRA ;NOT FOUND, ERROR\r
-PURGE4: PUSHJ PP,REMOVE ;REMOVE FROM THE SYMBOL TABLE\r
-PURGE5: JUMPCM PURGE0\r
- POPJ PP, ;EXIT\r
-\fOPD1: TLNE ARG,UNDF ;IF OPDEF IS UNDEFINED\r
- TRO ER,ERRO ;GIVE "O" ERROR\r
-OPD: MOVE AC0,V ;PUT VALUE IN AC0\r
- JRST OP\r
-IOP: MOVSI AC2,(POINT 9,0(PP),11)\r
-IFE FORMSW,< TLOA IO,IOIOPF ;SET "IOP SEEN" AND SKIP>\r
-IFN FORMSW,< PUSH PP,IOFORM ;USE I/O FORM\r
- TLO IO,IOIOPF ;SET "IOP" SEEN\r
- JRST OP+2>\r
-OP: MOVSI AC2,(POINT 4,0(PP),12)\r
-IFN FORMSW,< PUSH PP,INFORM ;USE INST. FORM>\r
- PUSH PP,RC\r
- PUSH PP,AC0 ;STACK CODE \r
- PUSH PP,AC2\r
- PUSHJ PP,EVALEX ;EVALUATE FIRST EXPRESSION\r
- POP PP,AC2\r
- JUMPNC OP2\r
-OP1B: PUSHJ PP,GETCHR ;GET A CHARACTER\r
-IFE FORMSW,<JUMPCM XWD5 ;PROCESS COMMA COMMA IN XWD>\r
-IFN FORMSW,<JUMPNC .+4 ;JUMP IF NO COMMA\r
- MOVE AC2,HWFORM ;GET FORM WORD FOR XWD\r
- MOVEM AC2,-2(PP) ;REPLACE INSTRUCTION FORM\r
- JRST XWD5 ;PROCESS COMMA COMMA IN XWD>\r
- TLO IO,IORPTC ;NOT A COMMA,REPEAT IT\r
- LDB AC1,AC2\r
- ADD AC1,AC0\r
- DPB AC1,AC2\r
- JUMPE RC,OP1A ;EXTERNAL OR RELOCATABLE?\r
- PUSHJ PP,QEXT ;YES, DETERMINE WHICH AND FLAG AN ERROR\r
-\r
-OP1A: PUSHJ PP,EVALEX ;GET ADDRESS PART\r
-OP2: PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS\r
-OP3: POP PP,AC0 ;PUT IN AC0\r
- POP PP,RC\r
-IFN FORMSW,< POP PP,AC1 ;GET FORM WORD>\r
- SKIPE (PP) ;CAME FROM EVALCM?\r
- JRST STOW ;NO,STOW CODE AND EXIT\r
- POP PP,AC1 ;YES,EXIT IMMEDIATELY\r
- POPJ PP,\r
-\r
-\fEVADR: ;EVALUATE STANDARD ADDRESS\r
-IFE IIISW,<TLNN AC0,-1 ;OK IF ALL 0'S\r
- JRST .+4 ;IT WAS\r
- TLC AC0,-1 ;CHANGE ALL ONES TO ZEROS\r
- TLCE AC0,-1 ;OK IF ALL 1'S\r
- TRO ER,ERRQ ;NO,FLAG Q ERROR>\r
- ADD AC0,-1(PP) ;ADD ADDRESS PORTIONS\r
- HLL AC0,-1(PP) ;GET LEFT HALF\r
- TLZE FR,INDSW ;INDIRECT BIT?\r
- TLO AC0,(Z @) ;YES, PUT IT IN\r
- MOVEM AC0,-1(PP) ;RE-STACK CODE\r
- ADD RC,-2(PP) ;UPDATE RELOCATION\r
- HRRM RC,-2(PP) ;USE HALF WORD ADD\r
- CAIE C,10 ;"("?\r
- POPJ PP, ;NO, EXIT\r
-\r
- MOVSS EXTPNT ;WFW\r
- PUSHJ PP,EVALCM ;EVALUATE\r
- MOVSS EXTPNT ;WFW\r
- MOVSS V,AC0 ;SWAP HALVES\r
-IFE IIISW,<MOVSS SX,RC\r
- IOR SX,V ;MERGE RELOCATION\r
- TRNN SX,-1 ;RIGHT HALF ZERO?\r
- JRST OP2A ;YES, DO SIMPLE ADD\r
- MOVE ARG,RC ;NO, SWAP RC INTO ARG>\r
-IFN IIISW,<MOVSS ARG,RC>\r
- ADD V,-1(PP) ;ADD RIGHT HALVES\r
- ADD ARG,-2(PP)\r
- HRRM V,-1(PP) ;UPDATE WITHOUT CARRY\r
- HRRM ARG,-2(PP)\r
- HLLZS AC0 ;PREPARE LEFT HALVES\r
- HLLZS RC\r
-IFE IIISW,<TLNE SX,-1 ;IS LEFT HALF ZERO?\r
- TRO ER,ERRQ ;NO FLAG FORMAT ERROR\r
-OP2A: TLNE RC,-1 ;RELOCATION FOR LEFT HALF?\r
- PUSHJ PP,OP2A1 ;YES,IS IT LEGAL?\r
- TLNE AC0,777000 ;OP CODE FIELD USED?\r
- JRST [EXCH AC0,-1(PP);YES, GET STORED CODE\r
- TLNE AC0,777000 ;OP CODE FIELD BEEN SET?\r
- TRO ER,ERRQ ;YES, MOST LIKELY AN ERROR\r
- EXCH AC0,-1(PP)\r
- JRST .+1] ;RETURN TO ADD >\r
- ADDM AC0,-1(PP) ;MERGE WITH PREVIOUS VALUE\r
- ADDM RC,-2(PP)\r
- CAIE C,11 ;")"?\r
- JRST ERRAX ;NO, FLAG ERROR\r
- ;YES, BYPASS PARENTHESIS\r
-BYPASS:\r
-BYPAS1: PUSHJ PP,GETCHR\r
-BYPAS2: JUMPE C,.-1 ;SKIP TRAILING BLANKS\r
- POPJ PP, ;EXIT\r
-\r
-\fIFE IIISW,<\r
-OP2A1: EXCH RC,-2(PP) ;GET STORED CODE\r
- TLNN RC,-1 ;OK IF ALL ZERO\r
- JRST OP2A2 ;OK SO RETURN\r
- TLC RC,-1 ;CHANGE ALL ONES TO ZEROS\r
- TLCE RC,-1 ;OK IF ALL ONES\r
- TRO ER,ERRQ ;OTHERWISE A "Q" ERROR\r
-OP2A2: EXCH RC,-2(PP) ;GET RC,BACK\r
- POPJ PP, ;AND RETURN>\r
-\r
-\r
-EXPRES: HRLZ AC0,RX ;FUDGE FOR OCT0\r
-\r
-OCT0: PUSH PP,RX\r
- HLR RX,AC0\r
-OCT1: PUSHJ PP,EVALEX ;EVALUATE\r
-IFN FORMSW,< MOVE AC1,HWFORM>\r
- PUSHJ PP,STOW ;STOW CODE\r
- JUMPCM OCT1\r
- POP PP,RX ;YES, RESTORE RADIX\r
- POPJ PP, ;EXIT\r
-\fSIXB10: MOVSI RC,(POINT 6,AC0) ;SET UP POINTER\r
- MOVEI AC0,0 ;CLEAR WORD\r
-\r
-SIXB20: PUSHJ PP,CHARL ;GET NEXT CHARACTER\r
- CAMN C,SX ;IS THIS PRESET DELIMITER?\r
-IFE FORMSW,< JRST ASC60 ;YES>\r
-IFN FORMSW,<\r
- JRST [PUSHJ PP,BYPAS1\r
- ANDCM RC,STPX\r
- MOVE AC1,SXFORM\r
- JUMPGE RC,STOWZ\r
- POPJ PP,]>\r
- CAIL C,"A"+40\r
- CAILE C,"Z"+40\r
- JRST .+2\r
- TRZA C,100 ;CONVERT LOWER CASE TO SIXBIT\r
- SUBI C,40 ;CONVERT TO SIXBIT\r
- JUMPL C,ASC55 ;TEST FOR INVALID CHARACTER\r
- IDPB C,RC ;NO, DEPOSIT THE BYTE\r
- TLNE RC,770000 ;IS THE WORD FULL?\r
- JRST SIXB20 ;NO, GET NEXT CHARACTER\r
-IFN FORMSW,< MOVE AC1,SXFORM ;SIXBIT FORM>\r
- PUSHJ PP,STOWZ ;YES, STORE\r
- JRST SIXB10 ;GET NEXT WORD\r
-\fASCII0: HLLZ SDEL,AC0 ;STORE ASCII/ASCIZ FLAG\r
-ASC10: PUSHJ PP,CHARL ;GET FIRST NON-BLANK\r
- CAIE C," "\r
- CAIN C,HT\r
- JRST ASC10\r
- CAIG C,CR ;CHECK FOR CRRET AS DELIM\r
- CAIGE C,LF\r
- SKIPA SX,SEQNO2\r
- JRST ERRAX\r
- MOVEM SX,TXTSEQ ;SAVE SEQ AND PAGE\r
- MOVE SX,PAGENO\r
- MOVEM SX,TXTPG\r
- SETOM INTXT\r
- MOVE SX,C ;SAVE FOR COMPARISON\r
- JUMPG SDEL,SIXB10 ;BRANCH IF SIXBIT\r
-\r
-ASC20: MOVSI RC,(POINT 7,AC0) ;SET UP POINTER\r
- TLNE SDEL,200000 ;THIS BIT (AND BIT0) IN FOR COMMENT\r
- MOVSI RC,440000 ;SO NOTHING WILL BE DEPOSITED\r
-IFE IIISW,<MOVEI AC0,0 ;CLEAR WORD>\r
-IFN IIISW,<TLNE SDEL,100000 ;ASCID?\r
- TLZA SDEL,400000 ;YES, ZERO ASCIZ BIT\r
- TDZA AC0,AC0 ;NO, ZERO WORD\r
- MOVE AC0,[BYTE (7) 10,10,10,10,10 (1) 1] ;YES, A WORD FULL OF BACKSPACES>\r
-ASC30: PUSHJ PP,CHARL ;GET ASCII CHARACTER AND LIST\r
- CAMN C,SX ;TEST FOR DELIMITER\r
- JRST ASC50 ;FOUND\r
- IDPB C,RC ;DEPOSIT BYTE\r
- TLNE RC,760000 ;HAVE WE FINISHED WORD?\r
- JRST ASC30 ;NO,GET NEXT CHARACTER\r
-IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD>\r
- PUSHJ PP,STOWZ ;YES, STOW IT\r
- JRST ASC20 ;GET NEXT WORD\r
-\r
-ASC55: TDZA CS,CS ;ZERO CS IN CASE NESTED\r
-ASC50: TDZA RC,SDEL ;TEST FOR ASCIIZ\r
- TROA ER,ERRA ;SIXBIT ERROR EXIT\r
-ASC60: PUSHJ PP,BYPAS1 ;POLISH OFF TERMINATOR\r
- SETZM INTXT ;WE ARE OUT OF IT\r
-IFN FORMSW,< MOVE AC1,ASCIIF ;USE ASCII FORM WORD>\r
-IFN IIISW,<TLNN SDEL,100000 ;NO EXTRA WORDS FOR ASCID>\r
- ANDCM RC,STPX ;STORE AT LEAST ONE WORD\r
- TLNN SDEL,200000 ;GET OUT WITHOUT STORING\r
- JUMPGE RC,STOWZ ;STOW\r
- POPJ PP, ;ASCII, NO BYTES STORED, SO EXIT\r
-\fPOINT0:\r
-IFN FORMSW,< PUSH PP,BPFORM ;USE BYTE POINTER FORM WORD>\r
- PUSH PP,RC ;STACK REGISTERS\r
- PUSH PP,AC0\r
- PUSHJ PP,EVAL10 ;EVALUATE RADIX 10\r
- DPB AC0,[POINT 6,0(PP),11] ;STORE BYTE SIZE\r
- JUMPNC POINT2\r
- PUSHJ PP,EVALEX ;NO, GET ADDRESS\r
- PUSHJ PP,EVADR ;EVALUATE STANDARD ADDRESS\r
- JUMPNC POINT2\r
- PUSHJ PP,EVAL10 ;EVALUATE RADIX 10\r
- TLNE IO,NUMSW ;IF NUMERIC\r
- TDCA AC0,[-1] ;POSITION=D35-RHB\r
-POINT2: MOVEI AC0,0 ;OTHERWISE SET TO D36\r
- ADDI AC0,^D36\r
- LSH AC0,^D30\r
- ADDM AC0,0(PP) ;UPDATE VALUE\r
- JRST OP3\r
-\fXWD0:\r
-IFN FORMSW,< PUSH PP,HWFORM ;USE HALF WORD FORM>\r
- PUSH PP,RC\r
- PUSH PP,AC0 ;STORE ZERO ON STACK\r
- PUSHJ PP,EVALEX ;EVALUATE EXPRESSION\r
- JUMPNC OP2\r
-XWD5: SKIPN (PP) ;ANY CODE YET?\r
- JRST XWD10 ;NO,USE VALUE IN AC0\r
- JUMPE AC0,.+2 ;ANYTHING IN AC0?\r
- TRO ER,ERRQ ;YES,FLAG "Q"ERROR\r
- MOVE AC0,(PP) ;USE PREVIOUS VALUE\r
- MOVE RC,-1(PP) ;AND RELOCATION\r
-XWD10: HRLZM AC0,0(PP) ;SET LEFT HALF\r
- HRLZM RC,-1(PP)\r
- MOVSS EXTPNT ;WFW\r
- JRST OP1A ;EXIT THROUGH OP\r
-\r
-IOWD0: PUSHJ PP,EVALXQ ;EVALUATE AND TEST FOR EXTERNAL\r
- CAIE C,14 ;","?\r
- JRST [SKIPN AC0 ;IF NZERO AND NO "," SEEN\r
- TRO ER,ERRQ ;TREAT AS Q ERROR\r
-IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM>\r
- SOJA AC0,STOW] ;NO, TREAT AS RIGHT HALF\r
- PUSH PP,AC0 ;YES, STACK LEFT HALF\r
- PUSHJ PP,EVALEX ;WFW\r
- SUBI AC0,1\r
- POP PP,AC1 ;RETRIEVE LEFT HALF\r
- MOVNS AC1\r
- HRL AC0,AC1\r
-IFN FORMSW,< MOVE AC1,HWFORM ;USE HALF WORD FORM>\r
- JRST STOW ;STOW CODE AND EXIT\r
-\fBYTE0: PUSHJ PP,BYPASS ;GET FIRST NON-BLANK\r
- CAIE C,10 ;"("?\r
- JRST ERRAX ;NO, FLAG ERROR AND EXIT\r
-IFN FORMSW,<\r
- PUSH PP,[1]\r
- MOVEI AC0,0\r
->\r
- PUSH PP,RC\r
- PUSH PP,AC0 ;INITIALIZE STACK TO ZERO\r
- MOVSI ARG,(POINT -1,(PP))\r
-\r
-BYTE1: PUSH PP,ARG\r
- PUSHJ PP,EVAL10 ;EVALUATE RADIX 10\r
- POP PP,ARG\r
- CAIG AC0,^D36 ;TEST SIZE\r
- JUMPGE AC0,.+2\r
- TRO ER,ERRA\r
- DPB AC0,[POINT 6,ARG,11] ;STORE BYTE SIZE\r
-\r
-BYTE2: IBP ARG ;INCREMENT BYTE\r
- TRZN ARG,-1 ;OVERFLOW?\r
- JRST BYTE3 ;NO\r
- SETZB AC0,RC ;YES\r
- EXCH AC0,0(PP) ;GET CURRENT VALUES\r
- EXCH RC,-1(PP) ;AND STACK ZEROS\r
-IFN FORMSW,<\r
- MOVE AC1,HWFORM ;USE STANDARD FORM\r
- EXCH AC1,-2(PP) ;GET FORM WORD\r
->\r
- PUSHJ PP,STOW ;STOW FULL WORD\r
-\r
-BYTE3: PUSH PP,ARG\r
- PUSHJ PP,EVALEX ;COMPUTE NEXT BYTE\r
- POP PP,ARG\r
- DPB AC0,ARG ;STORE BYTE\r
- HLLO AC0,ARG\r
- DPB RC,AC0 ;STORE RELOCATION\r
-\r
-IFN FORMSW,<\r
- MOVEI AC0,1\r
- HRRI ARG,-2\r
- DPB AC0,ARG ;STORE FORM BYTE\r
- HRRI ARG,0\r
->\r
- JUMPCM BYTE2\r
- CAIN C,10 ;"("?\r
- JRST BYTE1 ;YES, GET NEW BYTE SIZE\r
- JRST OP3 ;NO, EXIT\r
-\fRADX50: PUSHJ PP,EVALEX ;EVALUATE CODE\r
- JUMPN RC,ERRAX ;ERROR IF NOT ABSOLUTE\r
- MOVE ARG,AC0\r
- JUMPNC ERRAX\r
- PUSHJ PP,GETSYM ;YES, GET SYMBOL\r
- TRZ ER,ERRA ;CLEAR ERROR\r
- PUSHJ PP,SQOZE ;SQUOZE SIXBIT AND ADD CODE\r
-IFN FORMSW,< MOVE AC1,HWFORM ;USE STANDARD FORM>\r
- JRST STOW ;STOW CODE AND EXIT\r
-\r
-\r
-SQOZE: MOVE AC1+1,AC0 ;PUT SIXBIT IN AC1+1\r
- MOVEI AC0,0 ;CLEAR RESULT\r
-SQOZ1: MOVEI AC1,0\r
- LSHC AC1,6 ;PUT 6-BIT CHARACTER IN AC1\r
- LDB AC1,[POINT 6,CSTAT(AC1),23] ;CONVERT TO RADIX50\r
- IMULI AC0,50 ;MULTIPLY PREVIOUS RESULT\r
- ADD AC0,AC1 ;ADD NEW CHARACTER\r
- JUMPN AC1+1,SQOZ1 ;TEST FOR END\r
- LSH ARG,^D30 ;LEFT-JUSTIFY CODE\r
- IOR AC0,ARG ;MERGE WITH RESULT\r
- POPJ PP,\r
-\fREPEAT 0,< EXPLANATION OF ARRAY AND LVAR FEATURES\r
-\r
-WHEN A VARIABLE IS SEEN EITHER BY #, INTEGER OR ARRAY\r
-THE VALUE PORTION OF THE SYMBOL TABLE ENTRY (RH OF 2ND WORD)\r
-IS USE TO HOLD THE DESIRED SIZE-1. THE CORRECT VALUE IS\r
-ASSIGNED BY THE VAR PSEUDO OP.\r
-\r
-WHEN LVAR IS SEEN, A SEARCH OF THE SYMBOL TABLE IS MADE\r
-FOR ALL VARIABLES. THE VARF (VARIABLE) FLAG IS\r
-LEFT ON AND EXTF AND PNTF ARE TURNED ON SO THAT THE\r
-VARIABLE LOOKS LIKE AN EXTERNAL. THE POINTER\r
-(RH OF 2ND WORD OF THE SYMBOL TABLE ENTRY) POINTS\r
-TO THE HEADER BLOCK. THE HEADER BLOCK IS FORMATTED AS FOLLOWS:\r
-WORD 1: LEFT HALF IS A POINTER TO SYMBOL TABLE FIXUP BLOCKS\r
- RIGHT HALF IS A POINTER TO CODE FIXUP BLOCKS\r
-WORD 2: 0 THIS IS USED TO DISTINGUISH IT FROM NORMAL EXTERNALS\r
- WHICH HAVE THE SYMBOL NAME HERE\r
-WORD 3: THE LOCATION RELATIVE TO THE START OF THE LOW CORE\r
- VARIABLES\r
-\r
-CORE FIXUP BLOCKS ARE SET UP BY BOUT\r
-\r
-WORD1: RH LINK TO NEXT CORE FIXUP BLOCK 0 IF END OF CHAIN\r
- LH OFFSET. NUMBER TO BE ADDED TO SYMBOL VALUE BEFORE\r
- FIXUP IS DONE\r
-WORD 2: POINTER TO A FIXUP CHAIN FOR RIGHT HALVES\r
- LEFT HALF IS RELOCATION RH IS ADDRESS\r
-WORD 3: SAME AS WORD 2 BUT FOR LEFT HALF FIXUPS\r
-\r
-NOTE ALL THESE FIXUPS ARE CHAINED EVEN IF IN LEFT HALF.\r
-SIMILARY ALL REFERENCES TO SAY A+1 ARE CHAINED\r
-\r
-SYMBOL TABLE FIXUP BLOCKS. THESE ARE GENERATED BY SOUT\r
-AS THE SYMBOL TABLE IS PUT OUT. THESE FIXUPS ARE ADDITIVE\r
-NOT CHAINED.\r
-\r
-WORD 1: RH LINK TO NEXT BLOCK\r
- LH 0\r
-WORD 2: RADIX50 FOR THE SYMBOL\r
-WORD 3: 200000,,0 IF RH FIXUP\r
- 600000,,0 IF LH FIXUP\r
-\r
-SOUT ALSO SETS UP FIXLNK. FIXLNK POINTS TO THE CHAIN OF\r
-ALL LVAR FIXUPS TO BE DONE. IT POINTS TO THE SECOND WORD\r
-\fOF A 2 WORD BLOCK\r
-\r
-WORD 1: LINK TO 2ND WORD OF NEXT BLOCK 0 IF END\r
-WORD 2: RH POINTER TO A HEADER BLOCK\r
- LH GARBAGE\r
-\r
-FIXUPS ARE BLOCK TYPE 13 AS FOLLOWS\r
-WORD 1: THE PROGRAM BREAK (AS BLOCK TYPE 5)\r
-WORD 2: THE NUMBER OF LOCATION USED FOR VARIABLES IN THE\r
- LOW SEGMENT+1\r
-\r
-REMAINING WORDS COME IN PAIRS AS FOLLOWS:\r
-1ST WORD BIT 0=0 RH FIXUP\r
- BIT 0=1 LH FIXUP\r
- BIT 1=0 CORE FIXUP\r
- WORD 2 LH POINTER TO CHAIN\r
- WORD 2 RH VALUE\r
- BIT 1=1 SYMBOL FIXUP\r
- WORD 1 RH VALUE\r
- WORD 2 SYMBOL\r
->\r
-\r
-REPEAT 0,< EXPLANATION OF ICC FEATURES\r
-\r
- IF FORMSW IS SET NON ZERO THE FORM OF THE OCTAL LISTING OUTPUT\r
- IS CHANGED FROM STANDARD HALF WORD FORM TO THE FOLLOWING:-\r
-\r
- IF INSTRUCTION BYTE 9,4,1,4,18\r
- IF I/O INSTRUCTION BYTE 3,7,3,1,4,18\r
- IF BYTE POINTER BYTE 6,6,2,4,18\r
- IF ASCII BYTE 7,7,7,7,7\r
- IF SIXBIT BYTE 6,6,6,6,6,6\r
-\r
- ALL OTHERS ARE STANDARD HALF WORD\r
-\r
- THIS FEATURE CAN BE OVER RIDDEN BY USE OF /H SWITCH\r
- STANDARD HALF WORD FORM IS THEN USED.\r
- HOWEVER BECAUSE OF EXTRA SPACING THE OUTPUT IS PUSHED MORE\r
- TO THE RIGHT AND LONG COMMENTS OVERFLOW THE LINE\r
- >\r
-\fIFN WFWSW,<\r
-%INTEG: PUSHJ PP,GETSYM ;GET A SYMBOL\r
- JRST INTG2 ;BAD SYMBOL ERROR\r
- TLO IO,DEFCRS ;THIS IS A DEFINTION\r
- PUSHJ PP,SSRCH ;SEE IF THERE\r
- MOVSI ARG,SYMF!UNDF ;SET SYMBOL AND UNDEFINED IF NOT\r
- TLNN ARG,UNDF ;IF ALREADY DEFINED\r
- JRST INTG1 ;JUST IGNORE\r
- TLOA ARG,VARF ;SET VARIABLE FLAG\r
-INTG2: TROA ER,ERRA ;SYMBOL ERROR\r
- PUSHJ PP,INSERZ ;PUT IN WITH ZERO VALUE (LENGTH OF 1)\r
-INTG1: JUMPCM %INTEG\r
- POPJ PP,\r
-\r
-%ARAY: MOVEM PP,ARAYP ;SAVE PUSHDOW POINTER\r
-ARAY2: PUSHJ PP,GETSYM\r
- JRST ARAY1 ;BAD SYMBOL GIVE ERROR AND ABORT\r
- PUSH PP,AC0 ;SAVE NAME\r
- JUMPCM ARAY2 ;AND GO ON IF A COMMA\r
- CAIE C,"["-40 ;MUST BE A [\r
- JRST ARAY1\r
- PUSHJ PP,BYPASS ;OH, WELL\r
- TLO IO,IORPTC\r
- PUSHJ PP,EVALXQ ;GET A SIZE\r
- CAIE C,"]"-40 ;MUST END RIGHT\r
- JRST ARAY1\r
- PUSHJ PP,BYPASS ;??\r
- HRRZ V,AC0 ;GET VALUE\r
- SUBI V,1\r
-NXTVAL: POP PP,AC0\r
- PUSH PP,V ;SAVE OVER SEARCH\r
- TLO IO,DEFCRS\r
- PUSHJ PP,SSRCH ;FIND IT\r
- MOVSI ARG,SYMF!UNDF\r
- POP PP,V ;GET VALUE BACK\r
- TLNN ARG,UNDF\r
- JRST ARAY3\r
- TLO ARG,VARF\r
- MOVEI RC,0 ;NO RELOC\r
- PUSHJ PP,INSERT\r
-ARAY3: CAME PP,ARAYP\r
- JRST NXTVAL ;STILL NAMES STACKED\r
- JUMPCM ARAY2\r
- POPJ PP,\r
-\r
-ARAY1: TRO ER,ERRA ;ERROR EXIT\r
- MOVE PP,ARAYP\r
- POPJ PP, ;RESET PDL AND GO\r
->\r
-\fIFN WFWSW,<\r
-%LVAR: JUMP2 POPOUT ;IGNORE ON PASS2\r
- PUSHJ PP,LOOKUP ;SCAN SYMBOL TABLE\r
- TRNN ARG,EXTF ;THESE ARE LVARS WE HAVE DONE ONCE\r
- TRNN ARG,VARF ;FOR VARIABLES\r
- POPJ PP, ;IGNORE ALL OTHERS\r
- TRZ ARG,UNDF ;SET AS DEFINED\r
- MOVEI RC,3\r
- ADDB RC,FREE\r
- CAML RC,SYMBOL ;GET BLOCK\r
- PUSHJ PP,XCEEDS\r
- SUBI RC,2 ;POINT TO START OF BLOCK\r
- ADDI V,1\r
- EXCH V,LVARLC ;GET CORRECT VARIABLE LOCATION\r
- MOVEM V,2(RC) ;SAVE IT\r
- ADDM V,LVARLC ;AND UPDATE BASE\r
- SETZM (RC)\r
- SETZM 1(RC) ;NO NAME TO IDENT AN LVAR AND NO FIXUPS\r
- HRL ARG,RC ;POINTER\r
- TRO ARG,EXTF!PNTF ;FLAG AS EXTERNAL AND POINTER\r
- MOVSM ARG,(SX) ;PUT IT AWAY\r
- POPJ PP,\r
->\r
-\f; PSEUDO-END STATEMENT FOR MULTI-FILE CAPABILITY\r
-\r
-; HERE IF PRGEND (PASS 1)\r
-PSEND0: TLO IO,MFLSW ;PSEND SEEN\r
- PUSHJ PP,END0 ;AS IF END STATEMENT\r
- HLLZS IO ;CLEAR ER(RH)\r
- SETZM ERRCNT ;CLEAR ERROR COUNT FOR EACH PROG.\r
- JUMP2 PSEND2 ;DIFFERENT ON PASS2\r
- SKIPE UNIVSN ;SEEN A UNIVERSAL\r
- PUSHJ PP,UNISYM ;YES, STORE SYMBOLS\r
- PUSHJ PP,PSEND4 ;SAVE SYMBOLS, POINTERS AND TITLE\r
- TLZ IO,IOTLSN ;CLEAR TITLE SEEN FLAG\r
-PSEND1: TLZ IO,MFLSW ;FOR NEXT FILE\r
- SETZM UNISCH ;CLEAR UNIVERSAL SEARCH TABLE\r
- MOVE AC0,[UNISCH,,UNISCH+1]\r
- BLT AC0,UNISCH+.UNIV-1\r
- PUSHJ PP,OUTFF ;RESET PAGE COUNT\r
- MOVSI AC0,1 ;SET SO RELOC 0 WORKS\r
- JRST LOC10 ;FOR RELOC 0\r
-\r
-; HERE IF PRGEND (PASS 2)\r
-PSEND2: SETZM SBUF ;SO SUBTTL IS NOT WRONG\r
- PUSHJ PP,PSEND5 ;PUT TITLE BACK\r
- PUSHJ PP,PSEND1 ;COMMON CODE\r
- JRST PASS20 ;OUTPUT THE ENTRIES\r
-\r
-; HERE IF END (PASS 1)\r
-PSEND3: PUSHJ PP,PSEND4 ;SAVE LAST PROGRAM \r
- HLRS PRGPTR ;REINITIALIZE POINTER\r
- PUSHJ PP,PSEND5 ;READ BACK FIRST PROGRAM\r
- JRST PASS20\r
-\f;HERE TO SAVE AND RESTORE SYMBOL TABLE, TITLE AND OTHER USEFUL LOCATIONS\r
- XTRA==4 ;NUMBER OF OTHER LOCATIONS TO SAVE\r
-\r
-PSEND4: MOVE V,FREE ;GET NEXT FREE LOCATION\r
- ADDI V,LENGTH+.TBUF/5+XTRA\r
- CAML V,SYMBOL ;WILL WORST CASE FIT?\r
- PUSHJ PP,XCEED ;NO, EXPAND\r
- MOVS V,FREE\r
- HRR V,PRGPTR ;LAST PRGEND BLOCK\r
- HLRM V,(V) ;LINK THIS BLOCK\r
- SKIPN PRGPTR ;IF FIRST TIME\r
- HLLZM V,PRGPTR ;SET LINK TO START OF CHAIN\r
- HLRM V,PRGPTR ;POINTER TO IT\r
- SETZM @FREE ;CLEAR LINK WORD\r
- AOS FREE ;THIS LOCATION USED NOW\r
- MOVS AC0,SYMBOL ;BOTTOM OF SYMBOL TABLE\r
- HRR AC0,FREE ;FREE SPACE\r
- MOVE V,@SYMBOL ;GET NUMBER OF SYMBOLS\r
- ASH V,1 ;TWO WORDS PER SYMBOL\r
- ADDI V,1 ;ONE MORE FOR COUNT\r
- ADDB V,FREE ;END OF TABLE WHEN MOVED\r
- BLT AC0,(V) ;MOVE TABLE\r
- HRRZ AC0,JOBREL ;TOP OF CORE\r
- SUBI AC0,1\r
- MOVEM AC0,SYMTOP ;FOR NEXT SYMBOL TABLE\r
- SUBI AC0,LENGTH ;LENGTH OF INITIAL SYMBOLS\r
- MOVEM AC0,SYMBOL ;SET POINTER TO COUNT OF SYMBOLS\r
- HRLI AC0,SYMNUM ;BLT POINTER\r
- BLT AC0,@SYMTOP ;SET UP INITIAL SYMBOL TABLE\r
- PUSHJ PP,SRCHI ;SET UP SEARCH POINTER\r
- MOVEI AC0,.TBUF ;MAX NUMBER OF CHARS. IN TITLE\r
- SUB AC0,TCNT ;ACTUAL NUMBER\r
- IDIVI AC0,5 ;NUMBER OF WORDS\r
- SKIPE AC1 ;REMAINDER?\r
- ADDI AC0,1 ;YES\r
- MOVEM AC0,@FREE ;STORE COUNT\r
- AOS FREE ;THIS LOCATION USED NOW\r
- EXCH AC0,FREE ;SET UP AC0 FOR BLT\r
- ADDM AC0,FREE ;WILL BE AFTER TITLE MOVES\r
- HRLI AC0,TBUF ;BLT POINTER\r
- BLT AC0,@FREE ;MOVE TITLE\r
- MOVE AC2,LITHDX ;POINTER TO LIT INFO.\r
- MOVE AC0,-1(AC2) ;SIZE OF PASS1 LOCO\r
- PUSHJ PP,STORIT ;SAVE IT IN SYMBOL TABLE\r
- MOVE AC2,VARHDX ;SAME FOR VARS\r
- MOVE AC0,-1(AC2)\r
- PUSHJ PP,STORIT\r
-IFN RENTSW,<\r
- MOVE AC0,HISNSW ;GET TWOSEG/HISEG FLAG\r
- HRR AC0,HIGH1 ;AND PASS1 BREAK\r
- PUSHJ PP,STORIT\r
- JUMPGE AC0,PSEND6 ;NOT TWOSEG\r
- MOVE AC0,SVTYP3 ;HIGH SEGMENT OFFSET\r
- PUSHJ PP,STORIT ;SAVE IT ALSO>\r
-PSEND6: MOVE AC0,FREE ;GET NEXT FREE LOCATION\r
- SUBI AC0,1 ;LAST ONE USED\r
- HRRZ V,PRGPTR ;POINTER TO START OF DATA BLOCK\r
- HRLM AC0,(V) ;LINK TO END OF BLOCK\r
- POPJ PP, ;RETURN\r
-\r
-\fPSENDX: PUSHJ PP,XCEED ;NEED TO EXPAND CORE FIRST\r
-PSEND5: HRRZ AC0,JOBREL ;GET TOP OF CORE\r
- SUBI AC0,1\r
- MOVEM AC0,SYMTOP ;TOP OF NEW SYMBOL TABLE\r
- HRRZ V,PRGPTR ;ADDRESS OF THIS BLOCK\r
- JUMPE V,PSNDER ;ERROR LINK NOT SET UP\r
- MOVE AC1,(V) ;NEXT LINK\r
- MOVE V,1(V) ;GET ITS SYMBOL COUNT\r
- ASH V,1 ;NUMBER OF WORDS\r
- ADDI V,1 ;PLUS ONE FOR COUNT\r
- SUBI AC0,(V) ;START OF NEW SYMBOL TABLE\r
- CAMG AC0,FREE ;WILL IT FIT\r
- JRST PSENDX ;NO, NEED TO EXPAND AND RESET AC0\r
- ADD V,PRGPTR ;POINT TO END OF SYMBOL TABLE\r
- MOVEI V,1(V) ;THEN TO BEG OF TITLE\r
- MOVEM AC0,SYMBOL ;BOTTOM OF NEW TABLE\r
- HRL AC0,PRGPTR ;ADDRESS OF FIRST WORD OF BLOCK\r
- ADD AC0,[1,,0] ;MAKE BLT POINTER\r
- HRRM AC1,PRGPTR ;POINT TO NEXT BLOCK\r
- BLT AC0,@SYMTOP ;MOVE TABLE\r
- PUSHJ PP,SRCHI ;SET UP POINTER\r
- MOVE AC1,(V) ;NUMBER OF WORDS OF TITLE\r
- MOVEI AC0,1(V) ;START OF STORED TITLE\r
- ADD V,AC1 ;INCREMENT PAST TITLE\r
- ADDI AC1,TBUF-1 ;END OF TITLE\r
- HRLI AC0,TBUF ;WHERE TO PUT IT\r
- MOVSS AC0 ;BLT POINTER\r
- BLT AC0,(AC1) ;MOVE TITLE\r
- TLO IO,IOTLSN ;SET AS IF TITLE SEEN\r
- MOVE AC2,LITHDX ;INVERSE OF ABOVE\r
- PUSHJ PP,GETIT\r
- MOVEM AC0,-1(AC2)\r
- MOVE AC2,VARHDX ;SAME FOR VARS\r
- PUSHJ PP,GETIT\r
- MOVEM AC0,-1(AC2)\r
-IFN RENTSW,<\r
- PUSHJ PP,GETIT ;GET TWO HALF WORDS\r
- HRRZM AC0,HIGH1 ;PASS1 BREAK\r
- HLLEM AC0,HISNSW ;TWOSEG/HISEG FLAG\r
- JUMPGE AC0,CPOPJ ;NOT TWOSEG\r
- PUSHJ PP,GETIT\r
- MOVEM AC0,SVTYP3 ;BLOCK 3 WORD>\r
- POPJ PP,\r
-\r
-STORIT: MOVEM AC0,@FREE ;STORE IT IN DATA BLOCK\r
- AOS FREE ;ADVANCE POINTER\r
- POPJ PP,\r
-\r
-GETIT: MOVE AC0,1(V) ;FILL AC0 OUT OF PRGEND BLOCK\r
- AOJA V,CPOPJ ;INCREMENT AND RETURN\r
-\r
-PSNDER: HRROI RC,[SIXBIT /PRGEND ERROR @/]\r
- JRST ERRFIN\r
-\f;MULTIPLE SYMBOL TABLE FEATURE PSEUDO-OPS\r
-\r
-UNIV0: JUMP2 TITLE0 ;DO IT ALL ON PASS 1\r
- HRRZ SX,UNIVNO ;GET NUMBER OF UNIVERSALS SEEN\r
- CAIL SX,.UNIV ;ALLOW ONE MORE?\r
- JRST UNVERR ;NO, GIVE FATAL ERROR\r
- AOS UNIVNO ;ONE MORE NOW\r
- SETOM UNIVSN ;AND SET SEEN A UNIVERSAL\r
- JRST TITLE0 ;CONTINUE AS IF TITLE\r
-\r
-\r
-ADDUNV: PUSH PP,RC ;AN AC TO USE\r
- PUSHJ PP,NOUT ;CONVERT TO SIXBIT\r
- HRRZ RC,UNIVNO ;GET ENTRY INDEX\r
- MOVEM AC0,UNITBL(RC) ;STORE SIXBIT NAME IN TABLE\r
- HRRZS UNIVSN ;ONLY DO IT ONCE\r
- POP PP,RC ;RESTORE RC\r
- POPJ PP, ;AND RETURN\r
-\r
-UNVERR: HRROI RC,[SIXBIT /TOO MANY UNIVERSALS@/]\r
- JRST ERRFIN\r
-\r
-UNISYM: HRRZ AC0,FREE ;GET HIGHEST FREE LOCATION\r
- MOVEM AC0,JOBFF ;INTO JOBFF\r
- PUSHJ PP,SUPRSA ;TURN ON SUPPRESS BIT\r
- PUSH PP,SYMBOL ;NEED TO SAVE INCASE PRGEND\r
- MOVE AC0,SYMTOP ;TOP OF TABLE\r
- SUB AC0,SYMBOL ;GET LENGTH OF TABLE\r
- HRL ARG,SYMBOL ;BOTTOM OF TABLE\r
- HRR ARG,JOBFF ;WHERE TO GO\r
- HRRZ RC,UNIVNO ;GET TABLE INDEX\r
- HRRM ARG,SYMBOL ;WILL BE THERE SOON\r
- HRRZM ARG,UNIPTR(RC) ;STORE IN CORRESPONDING PLACE\r
- ADDB AC0,JOBFF ;WHERE TO END\r
- HRLM AC0,UNIPTR(RC) ;SAVE NEW SYMTOP\r
- BLT ARG,@JOBFF ;MOVE TABLE\r
- HRRZM AC0,UNITOP ;SAVE TOP OF TABLES+1\r
- CAMLE AC0,MACSIZ ;IN CASE OVER A K BOUND\r
- MOVEM AC0,MACSIZ ;DON'T REDUCE SO FAR NOW\r
- MOVEM AC0,FREE ;JUST IN CASE IN MACRO\r
- MOVE AC0,SRCHX ;SAVE OLD SEARCH POINTER\r
- PUSHJ PP,SRCHI ;GET SEARCH POINTER\r
- EXCH AC0,SRCHX\r
- MOVEM AC0,UNISHX(RC) ;SAVE IT\r
- SETZM UNIVSN ;CLEAR FLAG INCASE PRGEND\r
- POP PP,SYMBOL ;RESTORE OLD VALUE\r
- POPJ PP, ;RETURN\r
-\r
-\fSERCH0: PUSHJ PP,GETSYM ;GET A SYMBOL\r
- JRST ERRAX ;ERROR IF NOT VALID\r
- MOVEI RC,1 ;START AT ENTRY ONE\r
- CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR\r
- JRST SCHERR ;CANNOT FIND THIS ONE\r
- CAME AC0,UNITBL(RC) ;LOOK FOR MATCH\r
- AOJA RC,.-3 ;NOT FOUND YET\r
- MOVE AC0,RC ;STORE TABLE ENTRY NUMBER\r
- MOVEI RC,1 ;START AT ENTRY ONE\r
- CAIL RC,.UNIV ;CHECK FOR CONSISTENCY ERROR\r
- JRST SCHERR ;SHOULD NEVER HAPPEN!!\r
- SKIPE UNISCH(RC) ;LOOK FOR AN EMPTY SLOT\r
- AOJA RC,.-3 ;NOT FOUND YET\r
- MOVEM AC0,UNISCH(RC) ;STORE INDEX IN TABLE\r
- JUMPCM SERCH0 ;LOOK FOR MORE NAMES\r
- POPJ PP, ;FINISHED\r
-\r
-SCHERR: MOVSI RC,[SIXBIT /CANNOT FIND UNIVERSAL@/]\r
- JRST ERRFIN ;NAME IN AC0\r
-\r
-;MESSAGE FOR CASE WHERE FILES AFTER UNIVERSAL USED MORE BUFFER SPACE THAN FIRST UNIVERSAL\r
-UNIERR: HRROI RC,[SIXBIT /UNIVERSAL PROGRAM(S) MUST HAVE SAME OUTPUT SPECIFICATION AS OTHER FILES@/]\r
- JRST ERRFIN\r
-\fSUBTTL MACRO/REPEAT HANDLERS\r
-\r
-REPEA0: PUSHJ PP,EVALXQ ;EVALUATE REPEAT EXP, EXTERNS ARE ILL.\r
- JUMPNC ERRAX\r
-\r
-REPEA1: JUMPLE AC0,REPZ ;PASS THE EXP., DONT PROCESS\r
- SOJE AC0,REPO ;REPEAT ONCE\r
-REPEA2: PUSHJ PP,GCHARQ ;GET STARTING "<"\r
- CAIE C,"<"\r
- JRST REPEA2\r
- PUSHJ PP,SKELI1 ;INITIALIZE SKELETON\r
- PUSH MP,REPEXP\r
- MOVEM AC0,REPEXP\r
- PUSH MP,REPPNT ;STACK PREVIOUS REPEAT POINTER\r
- MOVEM ARG,REPPNT ;STORE NEW POINTER\r
- TDZA SDEL,SDEL ;YES, INITIALIZE BRACKET COUNT AND SKIP\r
-\r
-REPEA4: PUSHJ PP,WCHARQ ;WRITE A CHARACTER\r
- PUSHJ PP,GCHARQ ;GET A CHARACTER\r
- CAIN C,"<" ;"<"?\r
- AOJA SDEL,REPEA4 ;YES, INCREMENT AND WRITE\r
- CAIE C,">" ;">"?\r
- JRST REPEA4 ;NO, WRITE THE CHARACTER\r
- SOJGE SDEL,REPEA4 ;YES, WRITE IF NON-NEGATIVE COUNT\r
- MOVSI CS,(BYTE (7) 177,3) ;SET "REPEAT" END\r
- PUSHJ PP,WWRXE ;WRITE END\r
- SKIPN LITLVL ;LITERAL MIGHT END ON LINE\r
- SKIPE MACLVL ;IF IN MACRO DARE NOT PROCESS\r
- JRST .+3 ;REST OF LINE SINCE MACRO MIGHT END ON IT\r
- PUSHJ PP,BYPASS ;BYPASS\r
- PUSHJ PP,STOUTS ;POLISH OF LINE BEFORE PROCESSING REPEAT\r
- PUSH MP,MRP ;STACK PREVIOUS READ POINTER\r
- PUSH MP,RCOUNT ;SAVE WORD COUNT\r
- HRRZ MRP,REPPNT ;SET UP READ POINTER\r
- SKIPN MACLVL ;IF IN MACRO GIVE CR-LF FIRST\r
- SKIPE LITLVL ;SAME FOR LITERAL\r
- JRST REPEA7\r
- AOJA MRP,POPOUT ;BYPASS ARG COUNT\r
-\r
-REPEA7: HRRZ MRP,REPPNT ;SET UP READ POINTER\r
- ADDI MRP,1 ;BYPASS ARG COUNT\r
-REPEA8: MOVEI C,CR\r
- JRST RSW1\r
-\r
-REPEND: SOSL REPEXP\r
- JRST REPEA7\r
- HRRZ V,REPPNT ;GET START OF TREE\r
- PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
- POP MP,RCOUNT\r
- POP MP,MRP\r
- POP MP,REPPNT\r
- POP MP,REPEXP\r
- SKIPN LITLVL ;IF IN LITERAL OR\r
- SKIPE MACLVL ;IF IN MACRO\r
- JRST RSW0 ;FINISH OF LINE NOW\r
- JRST REPEA8\r
-\r
-\fREPZ: MOVE SDEL,SEQNO2 ;SAVE IN CASE OF END OF FILE\r
- MOVEM SDEL,REPSEQ\r
- MOVE SDEL,PAGENO\r
- MOVEM SDEL,REPPG\r
- SETOM INREP\r
- MOVEI SDEL,0 ;SET COUNT\r
-REPZ1: PUSHJ PP,GCHAR ;GET NEXT CHARACTER\r
- CAIN C,"<" ;"<"?\r
- AOJA SDEL,REPZ1 ;YES, INCREMENT COUNT\r
- CAIN C,">" ;">"?\r
- SOJLE SDEL,REPZ2 ;YES, EXIT IF MATCHING\r
- JRST REPZ1 ;NO, RECYCLE\r
-REPZ2: SETZM INREP ;FLAG OUT OF IT\r
- SETZM INCND ;AND CONDITIONAL ALSO\r
- JRST STMNT ;AND EXIT\r
-\r
-REPO: PUSHJ PP,GCHAR ;GET "<"\r
- CAIE C,"<"\r
- JRST REPO\r
- SKIPE RPOLVL ;ARE WE NESTED?\r
- AOS RPOLVL ;YES, DECREMENT CURRENT\r
- PUSH MP,RPOLVL\r
- SETOM RPOLVL\r
- JRST STMNT\r
-\r
-REPO1: CAIN C,"<"\r
- SOS RPOLVL\r
- CAIN C,">"\r
- AOSE RPOLVL\r
- JRST RSW2\r
- POP MP,RPOLVL\r
- PUSHJ PP,RSW2\r
- JRST RSW0\r
-\fDEFIN0: PUSHJ PP,GETSYM ;GET MACRO NAME\r
- JRST ERRAX ;EXIT ON ERROR\r
- MOVEM PP,PPTMP1 ;SAVE POINTER\r
- MOVEM AC0,PPTMP2 ;SAVE NAME\r
- TLO IO,IORPTC\r
- MOVE SX,SEQNO2 ;SAVE IN CASE OF EOF\r
- MOVEM SX,DEFSEQ\r
- MOVE SX,PAGENO\r
- MOVEM SX,DEFPG\r
- SETOM INDEF ;AND FLAG IN DEFINE\r
- SYN .TEMP,COMSW ;SAVE SPACE\r
- SETZB SX,COMSW ;SET ARGUMENT AND REFERENCE COUNT AND COMMENT SWITCH\r
-DEF02: PUSHJ PP,GCHAR ;SEARCH FOR "(" OR "<"\r
- CAIG C,FF ;SEARCH FOR END OF LINE\r
- CAIGE C,LF ;LF,VT, OR FF\r
- JRST .+2 ;WASN'T ANY OF THEM\r
- SETZM COMSW ;RESET COMMENT SWITCH\r
- CAIN C,";" ;COMMENT?\r
- SETOM COMSW ;YES, SET COMMENT SWITCH\r
- SKIPE COMSW ;INSIDE A COMMENT?\r
- JRST DEF02 ;YES, IGNORE CHARACTER\r
- CAIN C,"<" ;"<"?\r
- JRST DEF20 ;YES\r
- CAIE C,"(" ;"("?\r
- JRST DEF02 ;NO\r
-DEF10: PUSHJ PP,GETSYM ;YES, GET DUMMY SYMBOL\r
- TRO ER,ERRA ;FLAG ERROR\r
- ADDI SX,1 ;INCREMENT ARG COUNT\r
- PUSH PP,AC0 ;STACK IT\r
- CAIN C,'<' ;A DEFAULT ARGUMENT COMING UP?\r
- JRST DEF80 ;YES, STORE IT AWAY\r
- CAIE C,11 ;")"?\r
- JRST DEF10 ;NO, GET NEXT DUMMY SYMBOL\r
-DEF12: PUSHJ PP,GCHAR\r
- CAIE C,"<" ;"<"?\r
- JRST DEF12 ;NO\r
-DEF20: PUSH PP,[0] ;YES, MARK THE LIST\r
- LSH SX,9 ;SHIFT ARG COUNT\r
- AOS ARG,SX\r
- PUSHJ PP,SKELI ;INITIALIZE MACRO SKELETON\r
- MOVE AC0,PPTMP2 ;GET NAME\r
- TLO IO,DEFCRS\r
- PUSHJ PP,MSRCH ;SEARCH THE TABLE\r
- JRST DEF24 ;NOT FOUND\r
- TLNN ARG,MACF ;FOUND, IS IT A MACRO?\r
- TROA ER,ERRX ;NO, FLAG ERROR AND SKIP\r
- PUSHJ PP,REFDEC ;YES, DECREMENT THE REFERENCE\r
-DEF24: HRRZ V,WWRXX ;GET START OF TREE\r
- SKIPN .TEMP ;ANY DEFAULT ARGUMENTS TO TAKE CARE OF?\r
- JRST DEF25 ;NO\r
- HRRZ C,1(V) ;GET SHIFTED ARG COUNT\r
- LSH C,-9 ;GET ARG COUNT BACK\r
- ADDI C,1 ;ONE MORE FOR TERMINAL ZERO\r
- ADD C,.TEMP ;NUMBER OF ITEMS IN STACK\r
- HRLS C ;MAKE XWD\r
- SUB PP,C ;BACK UP STACK\r
- MOVE SDEL,.TEMP ;NUMBER OF WORDS NEEDED\r
- ADDB SDEL,FREE ;FROM FREE CORE\r
- CAML SDEL,SYMBOL ;MORE CORE NEEDED\r
- PUSHJ PP,XCEEDS ;YES, TRY TO GET IT\r
- SUB SDEL,.TEMP ;FORM POINTER\r
- HRLM SDEL,1(V) ;STORE IT WITH ARG COUNT IN MACRO\r
- SUBI SDEL,1 ;TO USE FOR PUSHING POINTER INTO STORAGE\r
- MOVEI C,1(PP) ;POINT TO START OF STACK\r
-DEF26: MOVE ARG,(C) ;GET AN ITEM OFF STACK\r
- TLNN ARG,-40 ;A POINTER?\r
- JUMPN ARG,[PUSH SDEL,ARG ;YES, STORE IT\r
-\f AOJA C,DEF26] ;GET NEXT\r
- PUSH PP,ARG ;RESTACK ARGUMENT\r
- SKIPE ARG ;FINISHED IF ZERO\r
- AOJA C,DEF26 ;GET NEXT\r
- PUSH SDEL,ARG ;STORE ZERO IN DEFAULT LIST ALSO\r
-\fDEF25: MOVSI ARG,MACF\r
- MOVEM PP,PPTMP2 ;STORE TEMP STORAGE POINTER\r
- PUSHJ PP,INSERT ;INSERT/UPDATE\r
- TLZ IO,DEFCRS ;JUST IN CASE\r
- SETZM ARGF ;NO ARGUMENT SEEN\r
- SETZM SQFLG ;AND NO ' SEEN\r
- TDZA SDEL,SDEL ;CLEAR BRACKET COUNT\r
-DEF30: PUSHJ PP,WCHAR ;WRITE CHARACTER\r
-DEF31: PUSHJ PP,GCHAR ;GET A CHARACTER\r
-DEF32: MOVE CS,C ;GET A COPY\r
- CAIN C,";" ;IS IT A COMMENT\r
- JRST CPEEK ;YES CHECK FOR ;;\r
-DEF33: CAIG CS,"Z"+40 ;CONVERT LOWER CASE\r
- CAIGE CS,"A"+40\r
- JRST .+2\r
- SUBI CS,40\r
-\f CAIGE CS,40 ;TEST FOR CONTROL CHAR.\r
- JRST [SKIPN SQFLG ;HAS SINGLE QUOTE BEEN SEEN?\r
- JRST DEF30 ;NO, OUTPUT THIS CHAR.\r
- PUSH PP,C ;YES, SAVE CURRENT CHAR\r
- MOVEI C,47 ;SET UP QUOTE\r
- PUSHJ PP,WCHAR;WRITE IT\r
- POP PP,C ;GET BACK CURRENT CHAR.\r
- SETZM SQFLG ;RESET FLAG\r
- JRST DEF30] ;AND CONTINUE \r
- CAILE CS,77+40\r
- JRST DEF30 ;TEST FOR SPECIAL\r
- MOVE CS,CSTAT-40(CS) ;GET STATUS BITS\r
-\f TLNE CS,6 ;ALPHA-NUMERIC?\r
- JRST DEF40 ;YES\r
- SKIPN SQFLG ;WAS A ' SEEN?\r
- JRST DEF36 ;NO, PROCESH\r
- PUSH PP,C ;YES, SAVE CURRENT CHARACTER\r
- MOVEI C,47 ;AND PUT IN A '\r
- PUSHJ PP,WCHAR ;...\r
- POP PP,C ;RESTORE CURRENT CHARACTER\r
- SETZM SQFLG ;AND RESET FLAG\r
-DEF36: CAIE C,47 ;IS THIS A '?\r
- JRST DEF35 ;NOPE\r
- SKIPN ARGF ;YES, WAS LAST THING SEEN AN ARG?\r
- SETOM SQFLG ;IF NOT, SET SNGL QUOT FLAG\r
- SETZM ARGF ;BUT NOT ARGUMENT IN ANY CASE\r
- JRST DEF31 ;GO GET NEXT CHARACTER\r
-\fDEF35: SETZM ARGF ;THIS IS NOT AN ARGUMENT\r
- CAIN C,"<" ;"<"?\r
- AOJA SDEL,DEF30 ;YES, INCREMENT COUNT AND WRITE\r
- CAIN C,">" ;">"?\r
- SOJL SDEL,DEF70 ;YES, TEST FOR END\r
- JRST DEF30 ;NO, WRITE IT\r
-\r
-CPEEK: TLNN IO,IOPALL ;IF LALL IS ON\r
- JRST DEF33 ;JUST RETURN\r
- PUSHJ PP,PEEK ;LOOK AT NEXT CHAR.\r
- CAIN C,";" ;IS IT ;;?\r
- JRST CPEEK1 ;YES\r
- MOVE C,CS ;RESTORE C\r
- JRST DEF33 ;AND RETURN\r
-\r
-CPEEK1: PUSHJ PP,GCHAR ;GET THE CHAR.\r
- CAIE C,">" ;RETURN IF END OF MACRO\r
- CAIG C,CR ;IS CHAR ONE OF\r
- CAIGE C,LF ;LF,VT,FF,CR\r
- JRST CPEEK1 ;NO,SO GET NEXT CHAR.\r
- JRST DEF32 ;YES,RETURN AND STORE\r
-\fDEF40: MOVEI AC0,0 ;CLEAR ATOM\r
- MOVSI AC1,(POINT 6,AC0) ;SET POINTER\r
-DEF42: PUSH PP,C ;STACK CHARACTER\r
- TLNE AC1,770000 ;HAVE WE STORED 6?\r
- IDPB CS,AC1 ;NO, STORE IN ATOM\r
- PUSHJ PP,GCHAR ;GET NEXT CHARACTER\r
- MOVE CS,C\r
- CAIG CS,"Z"+40\r
- CAIGE CS,"A"+40\r
- JRST .+2\r
- SUBI CS,40 ;CONVERT LOWER TO UPPER\r
- CAIL CS,40\r
- CAILE CS,77+40\r
- JRST DEF44 ;TEST SPECIAL\r
- MOVE CS,CSTAT-40(CS) ;GET STATUS\r
- TLNE CS,6 ;ALPHA-NUMERIC?\r
- JRST DEF42 ;YES, GET ANOTHER\r
-DEF44: PUSH PP,[0] ;NO, MARK THE LIST\r
- MOVE SX,PPTMP1 ;GET POINTER TO TOP\r
-\r
-DEF46: SKIPN 1(SX) ;END OF LIST?\r
- JRST DEF50 ;YES\r
- CAME AC0,1(SX) ;NO, DO THEY COMPARE?\r
- AOJA SX,DEF46 ;NO, TRY AGAIN\r
- SUB SX,PPTMP1 ;YES, GET DUMMY SYMBOL NUMBER\r
- LSH SX,4\r
- MOVSI CS,<(BYTE (7) 177,101)>(SX) ;SET ESCAPE CODE MACEND\r
- LSH AC0,-^D30\r
- CAIN AC0,5 ;"%"?\r
- TLO CS,1000 ;YES, SET CRESYM FLAG\r
- PUSHJ PP,WWORD ;WRITE THE WORD\r
- SETOM ARGF ;SET ARGUMENT SEEN FLAG\r
- SETZM SQFLG ;AND IGNORE ANY ' WAITING TO GET INTO STRING\r
-DEF48: MOVE PP,PPTMP2 ;RESET PUSHDOWN POINTER\r
- TLO IO,IORPTC ;ECHO LAST CHARACTER\r
- JRST DEF31 ;RECYCLE\r
-\r
-DEF50:\r
- SKIPN SQFLG ;HAVE WE SEEN A '?\r
- JRST DEF51 ;NOPE\r
- MOVEI C,47 ;YES, PUT IT IN\r
- PUSHJ PP,WCHAR ;...\r
- SETZM SQFLG ;AND CLEAR FLAG\r
-DEF51: MOVE C,2(SX) ;GET CHARACTER\r
- JUMPE C,DEF48 ;CLEAN UP IF END\r
- PUSHJ PP,WCHAR ;WRITE THE CHARACTER\r
- AOJA SX,DEF51 ;GET NEXT\r
-\r
-DEF70: MOVE PP,PPTMP1 ;RESTORE PUSHDOWN POINTER\r
- MOVSI CS,(BYTE (7) 177,1)\r
- PUSHJ PP,WWRXE ;WRITE END\r
- SETZM INDEF ;OUT OF IT\r
- JRST BYPASS\r
-\f; HERE TO STORE DEFAULT ARGUMENTS\r
-\r
-DEF80: AOS .TEMP ;COUNT ONE MORE\r
- PUSHJ PP,SKELI1 ;INITIALIZE SKELETON\r
- HRL V,SX ;SYMBOL NUMBER\r
- PUSH PP,V ;STORE POINTER\r
- TDZA SDEL,SDEL ;ZERO BRACKET COUNT\r
-DEF81: PUSHJ PP,WCHARQ ;WRITE A CHARACTER\r
- PUSHJ PP,GCHARQ ;GET A CHARACTER\r
- CAIN C,"<" ;ANOTHER "<"?\r
- AOJA SDEL,DEF81 ;YES, INCREMENT AND WRITE\r
- CAIE C,">" ;CLOSING ANGLE?\r
- JRST DEF81 ;NO, JUST WRITE THE CHAR.\r
- SOJGE SDEL,DEF81 ;YES, WRITE IF NOT END\r
- MOVSI CS,(BYTE (7) 177,2)\r
- PUSHJ PP,WWRXE ;WRITE END OF DUMMY ARGUMENT\r
- PUSHJ PP,GCHAR ;READ AT NEXT CHAR.\r
- CAIE C,")" ;END OF ARGUMENT LIST?\r
- JRST DEF10 ;NO, GET NEXT SYMBOL\r
- JRST DEF12 ;YES, LOOK FOR "<"\r
-\fSUBTTL MACRO CALL PROCESSOR\r
-CALLM: SKIPGE MACENL ;ARE WE TRYING TO RE-ENTER?\r
- JRST ERRAX ;YES, BOMB OUT WITH ERROR\r
- HRROS MACENL ;FLAG "CALLM IN PROGRESS"\r
- EXCH MP,RP\r
- PUSH MP,V ;STACK FOR REFDEC\r
- EXCH MP,RP\r
- MOVEM AC0,CALNAM ;SAVE MACRO NAME INCASE OF ERROR\r
- MOVE SDEL,SEQNO2 ;SAVE IN CASE OF EOF\r
- MOVEM SDEL,CALSEQ\r
- MOVE SDEL,PAGENO\r
- MOVEM SDEL,CALPG\r
- ADDI V,1 ;POINT TO DUMMY SYMBOL COUNT\r
- AOS SDEL,0(V) ;INCREMENT ARG COUNT\r
- HLLZM SDEL,.TEMP ;DEFAULT ARG POINTER IF NON-ZERO\r
- LSHC SDEL,-^D<9+36> ;ZERO SDEL, GET ARG COUNT IN SX\r
- ANDI SX,777 ;MASK\r
- SKIPE .TEMP ;IF AT LEAST ONE DEFAULT ARG\r
- HRRM SX,.TEMP ;STORE COUNT OF ARGS\r
- PUSH PP,V ;STACK FOR MRP\r
- PUSH PP,RP ;STACK FOR MACPNT\r
- JUMPE SX,MAC20 ;TEST FOR NO ARGS\r
- PUSHJ PP,CHARAC\r
- CAIE C,"(" ;"("\r
- TROA SDEL,-1 ;NO, FUDGE PAREN COUNT AND SKIP\r
-\r
-MAC10: PUSHJ PP,GCHAR ;GET A CHARACTER, LOOK FOR AN ARG\r
- CAIG C,CR\r
- CAIGE C,LF\r
- CAIN C,";" ;";"?\r
- JRST MAC21 ;YES, END OF ARGUMENT STRING\r
-\r
- PUSHJ PP,SKELI1 ;NO, INITIALIZE SKELETON\r
- CAIN C,"<" ;"<"?\r
- JRST MAC30 ;YES, PROCESS AS SPECIAL\r
- CAIE C,176\r
- CAIN C,134 ;"\"\r
- JRST MAC40 ;YES, PROCESS SYMBOL\r
-\r
-MAC14: CAIN C,"," ;","?\r
- JRST MAC16 ;YES; NULL SYMBOL\r
- CAIN C,"(" ;"("?\r
- ADDI SDEL,1 ;YES, INCREMENT COUNT\r
- CAIN C,")" ;")"?\r
- SOJL SDEL,MAC16 ;YES, TEST FOR END\r
- PUSHJ PP,WCHAR ;WRITE INTO SKELETON\r
-MAC14A: PUSHJ PP,CHARAC ;GET NEXT CHARACTER\r
- CAIG C,CR\r
- CAIGE C,LF\r
- JRST .+2\r
- JRST MAC15 ;TEST FOR END OF LINE\r
- CAIE C,";" ;";"?\r
- JRST MAC14 ;YES, END OF LINE\r
-\r
-MAC15: TLO IO,IORPTC\r
-MAC16: MOVSI CS,(BYTE (7) 177,2)\r
- PUSHJ PP,WWRXE ;WRITE END\r
- EXCH MP,RP\r
- PUSH MP,WWRXX\r
- EXCH MP,RP\r
- SOJLE SX,MAC20 ;BRANCH IF NO MORE ARGS\r
- JUMPGE SDEL,MAC10 ;HAVEN'T SEEN TERMINAL ")" YET\r
-\fMAC20: TLZN IO,IORPTC\r
- PUSHJ PP,CHARAC\r
-MAC21: EXCH MP,RP\r
- JUMPE SX,MAC21B ;NO MISSING ARGS\r
-MAC21A: PUSH MP,[-1] ;FILL IN MISSING ARGS\r
- SKIPN .TEMP ;ANY DEFAULT ARGS?\r
- JRST MAC21C ;NO\r
- HRRZ C,.TEMP ;GET ARG COUNT\r
- SUBI C,-1(SX) ;ACCOUNT FOR THOSE GIVEN\r
- HRLZS C ;PUT IN LEFT HALF\r
- HLRZ SDEL,.TEMP ;ADDRESS OF TABLE\r
-MAC21D: SKIPN (SDEL) ;END OF LIST\r
- JRST MAC21C ;YES\r
- XOR C,(SDEL) ;TEST FOR CORRECT ARG\r
- TLNN C,-1 ;WAS IT?\r
- JRST MAC21E ;YES\r
- XOR C,(SDEL) ;BACK THE WAY IT WAS\r
- AOJA SDEL,MAC21D ;AND TRY AGAIN\r
-\r
-MAC21E: MOVEM C,(MP) ;REPLACE -1 WITH TREE POINTER\r
- AOS 1(C) ;INCREMENT REFERENCE\r
-MAC21C: SOJG SX,MAC21A\r
-MAC21B: PUSH MP,[0] ;SET TERMINAL\r
- HRRZ C,LIMBO\r
- TLNN IO,IOSALL ;SUPPRESSING ALL?\r
- JRST MAC23 ;NO\r
- JUMPN MRP,MAC27 ;IN MACRO?\r
- CAIE C,";" ;NO,IN COMMENT?\r
- JRST MAC26 ;NO\r
-MAC22: PUSHJ PP,CHARAC ;YES,GET IT INTO THE LBUF\r
- CAIG C,CR ;LESS THAN CR?\r
- CAIGE C,LF ;AND GREATER THAN LF?\r
- JRST MAC22 ;NO GET ANOTHER\r
-MAC26: HRLZI SX,70000 ;DECREMENT BYTE POINTER\r
- ADDB SX,LBUFP\r
- JUMPGE SX,MAC27\r
- HRLOI SX,347777\r
- ADDM SX,LBUFP\r
-MAC27: HRLI C,-1 ;SET FLAG\r
- JRST MAC25\r
-\r
-MAC23: MOVEI SX,"^"\r
- JUMPAD MAC24 ;BRANCH IF ADDRESS FIELD\r
- CAIN C,";" ;IF SEMI-COLON\r
- SKIPE LITLVL ;AND NOT IN A LITERAL\r
- JRST MAC24 ;NOT BOTH TRUE\r
- JUMPN MRP,MAC24 ;OR IN A MACRO\r
- PUSHJ PP,STOUT ;LIST COMMENT OR CR-LF\r
- TLNE IO,IOPALL ;MACRO EXPANSION SUPPRESSION?\r
- TLO IO,IOMAC ; NO, SET TEMP BIT\r
- TDOA C,[-1] ;FLAG LAST CHARACTER\r
-MAC24: DPB SX,LBUFP ;SET ^ INTO LINE BUFFER\r
-MAC25: PUSH MP,MACPNT\r
- POP PP,MACPNT\r
- PUSH MP,C\r
- PUSH MP,RCOUNT ;STACK WORD COUNT\r
- PUSH MP,MRP ;STACK MACRO POINTER\r
- POP PP,MRP ;SET NEW READ POINTER\r
- EXCH MP,RP\r
- AOS MACLVL\r
- HRRZS MACENL ;RESET "CALLM IN PROGRESS"\r
- JUMPOC STMNT2 ;OP-CODE FIELD\r
- JRST EVATOM ;ADDRESS FIELD\r
-\r
-\fMAC30: MOVEI AC0,0 ;INITIALIZE BRACKET COUNTER\r
-MAC31: PUSHJ PP,GCHAR ;GET A CHARACTER\r
- CAIN C,"<" ;"<"?\r
- ADDI AC0,1 ;YES, INCREMENT COUNT\r
- CAIN C,">" ;">"?\r
- SOJL AC0,MAC14A ;YES, EXIT IF MATCHING\r
- PUSHJ PP,WCHAR ;WRITE INTO SKELETON\r
- JRST MAC31 ;GO BACK FOR ANOTHER\r
-\r
-MAC40: PUSH PP,SX ;STACK REGISTERS\r
- PUSH PP,SDEL\r
- HLLM IO,TAGINC ;SAVE IO FLAGS\r
- PUSHJ PP,CELL ;GET AN ATOM\r
- MOVE V,AC0 ;ASSUME NUMERIC\r
- TLNE IO,NUMSW ;GOOD GUESS?\r
- JRST MAC41 ;YES\r
- PUSHJ PP,SSRCH ;SEARCH THE SYMBOL TABLE\r
- TROA ER,ERRX ;NOT FOUND, ERROR\r
-MAC41: PUSHJ PP,MAC42 ;FORM ASCII STRING\r
- HLL IO,TAGINC ;RESTORE IO FLAGS\r
- POP PP,SDEL\r
- POP PP,SX\r
- TLO IO,IORPTC ;REPEAT LAST CHARACTER\r
- JRST MAC14A ;RETURN TO MAIN SCAN\r
-\r
-MAC42: MOVE C,V\r
-MAC44: LSHC C,-^D35\r
- LSH CS,-1\r
- DIVI C,0(RX) ;DIVIDE BY CURRENT RADIX\r
- HRLM CS,0(PP)\r
- JUMPE C,.+2 ;TEST FOR END\r
- PUSHJ PP,MAC44\r
- HLRZ C,0(PP)\r
- ADDI C,"0" ;FORM TEXT\r
- JRST WCHAR ;WRITE INTO SKELETON\r
-\fMACEN0: SOS MACENL\r
-MACEND: SKIPGE C,MACENL ;TEST "CALLM IN PROGRESS"\r
- AOS MACENL ;INCREMENT END LEVEL AND EXIT\r
- JUMPL C,REPEA8\r
- EXCH MP,RP\r
- POP MP,MRP ;RETRIEVE READ POINTER\r
- POP MP,RCOUNT ;AND WORD COUNT\r
- MOVEI C,"^"\r
- SKIPL 0(MP) ;TEST FLAG\r
- PUSHJ PP,RSW2 ;MARK END OF SUBSTITUTION\r
- POP MP,C\r
- POP MP,ARG\r
- SKIPA MP,MACPNT ;RESET MP AND SKIP\r
-MACEN1: PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
-MACEN2: AOS V,MACPNT ;GET POINTER\r
- MOVE V,0(V)\r
- JUMPG V,MACEN1 ;IF >0, DECREMENT REFERENCE\r
- JUMPL V,MACEN2 ;IF <0, BYPASS\r
- POP MP,V ;IF=0, RETRIEVE POINTER\r
- PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
- MOVEM ARG,MACPNT\r
- EXCH MP,RP\r
- SOS MACLVL\r
- SKIPN MACENL ;CHECK UNPROCESSED END LEVEL\r
- JRST MACEN3 ;NONE TO PROCESS\r
- TRNN MRP,-1 ;MRP AT END OF TEXT\r
- JRST MACEN0 ;THEN POP THE MACRO STACK NOW\r
-MACEN3: TRNN C,77400 ;SALL FLAG?\r
- HRLI C,0 ;YES,TURN IT OFF\r
- JUMPL C,REPEA8 ;IF FLAG SET SUBSTITUTE\r
- JRST RSW1\r
-\fIRP0: SKIPN MACLVL ;ARE WE IN A MACRO?\r
- JRST ERRAX ;NO, BOMB OUT\r
-IRP10: PUSHJ PP,MREADS ;YES, GET DATA SPEC\r
- CAIE C,40 ;SKIP LEADING BLANKS\r
- CAIN C,"(" ;"("?\r
- JRST IRP10 ;YES, BYPASS\r
- CAIN C,11\r
- JRST IRP10\r
- CAIE C,177 ;NO, IS IT SPECIAL?\r
- JRST ERRAX ;NO, ERROR\r
- PUSHJ PP,MREADS ;YES\r
- TRZN C,100 ;CREATED?\r
- JRST ERRAX\r
- CAIL C,40 ;TOO BIG?\r
- JRST ERRAX\r
- ADD C,MACPNT ;NO, FORM POINTER TO STACK\r
- PUSH MP,IRPCF ;STACK PREVIOUS POINTERS\r
- PUSH MP,IRPSW\r
- PUSH MP,IRPARP\r
- PUSH MP,IRPARG\r
- PUSH MP,IRPCNT\r
- PUSH MP,0(C)\r
- PUSH MP,IRPPOI\r
-\r
- HRRZM C,IRPARP\r
- MOVEM AC0,IRPCF ;IRPC FLAG FOUND IN AC0\r
- SETOM IRPSW ;RESET IRP SWITCH\r
- MOVE CS,0(C)\r
- MOVEM CS,IRPARG\r
-\r
- PUSHJ PP,MREADS\r
- CAIE C,"<" ;"<"?\r
- JRST .-2 ;NO, SEARCH UNTIL FOUND\r
- PUSHJ PP,SKELI1 ;INITIALIZE NEW STRING\r
- MOVEM ARG,IRPPOI ;SET NEW POINTER\r
-\r
- TDZA SDEL,SDEL ;ZERO BRACKET COUNT AND SKIP\r
-IRP20: PUSHJ PP,WCHAR1\r
- PUSHJ PP,MREADS\r
- CAIN C,"<" ;"<"?\r
- AOJA SDEL,IRP20 ;YES, INCREMENT COUNT AND WRITE\r
- CAIE C,">" ;">"?\r
- JRST IRP20 ;NO, JUST WRITE IT\r
- SOJGE SDEL,IRP20 ;YES, WRITE IF NOT MATCHING\r
- MOVE CS,[BYTE (7) 15,177,4]\r
- PUSHJ PP,WWRXE ;WRITE END\r
- PUSH MP,MRP ;STACK PREVIOUS READ POINTER\r
- PUSH MP,RCOUNT ;AND WORD COUNT\r
- SKIPG CS,IRPARG\r
- JRST IRPPOP ;EXIT IF NOT VALID ARGUMENT\r
- MOVEI C,1(CS) ;INITIALIZE POINTER\r
- MOVEM C,IRPARG\r
-\fIRPSET: EXCH MRP,IRPARG ;SWAP READ POINTERS\r
- MOVE SX,RCOUNT ;SWAP COUNT OF WORDS TO READ\r
- EXCH SX,IRPCNT\r
- MOVEM SX,RCOUNT\r
- PUSHJ PP,SKELI1 ;INITIALIZE SKELETON FOR DATA\r
- HRRZM ARG,@IRPARP ;STORE NEW DS POINTER\r
- SETZB SX,SDEL ;ZERO FOUND FLAG AND BRACKET COUNT\r
- LDB C,MRP ;GET LAST CHAR\r
- CAIN C,","\r
- SKIPE IRPCF ;IN IRPC\r
- JRST IRPSE1 ;NO\r
- MOVEI SX,1 ;FORCE ARGUMENT\r
-IRPSE1: PUSHJ PP,MREADS\r
- CAIE C,177 ;SPECIAL?\r
- AOJA SX,IRPSE2 ;NO, FLAG AS FOUND\r
- PUSHJ PP,PEEKM ;LOOK AT NEXT CHARACTER\r
- SETZM IRPSW ;SET IRP SWITCH\r
- JUMPG SX,IRPSE4 ;IF ARG FOUND, PROCESS IT\r
- JRST IRPPOP ;NO, CLEAN UP AND EXIT\r
-\r
-IRPSE2: SKIPE IRPCF ;IRPC?\r
- JRST IRPSE3 ;YES, WRITE IT\r
- CAIN C,"," ;NO, IS IT A COMMA?\r
- JUMPE SDEL,IRPSE4 ;YES, EXIT IF NOT NESTED\r
- CAIN C,"<" ;"<"?\r
- ADDI SDEL,1 ;YES, INCREMENT COUNT\r
- CAIN C,">" ;">"?\r
- SUBI SDEL,1 ;YES, DECREMENT COUNT\r
-\r
-IRPSE3: PUSHJ PP,WCHAR\r
- SKIPN IRPCF ;IRPC?\r
- JRST IRPSE1 ;NO, GET NEXT CHARACTER\r
-\r
-IRPSE4: MOVSI CS,(BYTE (7) 177,2)\r
- PUSHJ PP,WWRXE ;WRITE END\r
- MOVEM MRP,IRPARG ;SAVE POINTER\r
- MOVE MRP,RCOUNT ;SAVE COUNT\r
- MOVEM MRP,IRPCNT\r
- HRRZ MRP,IRPPOI ;SET FOR NEW SCAN\r
- AOJA MRP,REPEA8 ;ON ARG COUNT\r
-\fSTOPI0: SKIPN IRPARP ;IRP IN PROGRESS?\r
- JRST ERRAX ;NO, ERROR\r
- SETZM IRPSW ;YES, SET SWITCH\r
- POPJ PP,\r
-\r
-IRPEND: MOVE V,@IRPARP\r
- PUSHJ PP,REFDEC\r
- SKIPE IRPSW ;MORE TO COME?\r
- JRST IRPSET ;YES\r
-\r
-IRPPOP: MOVE V,IRPPOI\r
- PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
- POP MP,RCOUNT\r
- POP MP,MRP ;RESTORE CELLS\r
- POP MP,IRPPOI\r
- POP MP,@IRPARP\r
- POP MP,IRPCNT\r
- POP MP,IRPARG\r
- POP MP,IRPARP\r
- POP MP,IRPSW\r
- POP MP,IRPCF\r
- JRST REPEA8\r
-\fGETDS: ;GET DUMMY SYMBOL NUMBER\r
- MOVE CS,C ;USE CS FOR WORK REGISTER\r
- ANDI CS,37 ;MASK\r
- ADD CS,MACPNT ;ADD BASE ADDRESS\r
- MOVE V,0(CS) ;GET POINTER FLAG\r
- JUMPG V,GETDS1 ;BRANCH IF POINTER\r
- TRNN C,40 ;NOT POINTER, SHOULD WE CREATE?\r
- JRST RSW0 ;NO, FORGET THIS ARG\r
- PUSH PP,WWRXX\r
- PUSH PP,MWP ;STACK MACRO WRITE POINTER\r
- PUSH PP,WCOUNT ;SAVE WORD COUNT\r
- PUSHJ PP,SKELI1 ;INITIALIZE SKELETON\r
- MOVEM ARG,0(CS) ;STORE POINTER\r
- MOVE CS,[BYTE (7) 0,170,170,170,171] ;CREATE A SYMBOL\r
- ADD CS,LSTSYM ;LSTSYM= # OF LAST CREATED\r
- TDZ CS,[BYTE (7) 0,170,170,170,170]\r
- MOVEM CS,LSTSYM\r
- IOR CS,[ASCII /.0000/]\r
- MOVEI C,"."\r
- PUSHJ PP,WCHAR\r
- PUSHJ PP,WWORD ;WRITE INTO SKELETON\r
- MOVSI CS,(BYTE (7) 177,2)\r
- PUSHJ PP,WWRXE ;WRITE END CODE\r
- POP PP,WCOUNT ;RESTORE WORD COUNT\r
- POP PP,MWP ;RESTORE MACRO WRITE POINTER\r
- POP PP,WWRXX\r
- MOVE V,ARG ;SET UP FOR REFINC\r
-\r
-GETDS1: PUSHJ PP,REFINC ;INCREMENT REFERENCE\r
- HRL V,RCOUNT ;SAVE WORD COUNT\r
- PUSH MP,V ;STACK V FOR DECREMENT\r
- PUSH MP,MRP ;STACK READ POINTER\r
- MOVEI MRP,1(V) ;FORM READ POINTER\r
- JRST RSW0 ;EXIT\r
-\r
-DSEND: POP MP,MRP\r
- POP MP,V\r
- HLREM V,RCOUNT ;RESTORE WORD COUNT\r
- HRRZS V ;CLEAR COUNT\r
- PUSHJ PP,REFDEC ;DECREMENT REFERENCE\r
- JRST RSW0 ;EXIT\r
-\fSKELI1: MOVEI ARG,1 ;ENTRY FOR SINGLE ARG\r
-SKELI: SETZ MWP, ;SIGNAL FIRST TIME THROUGH\r
- PUSHJ PP,SKELWL ;GET POINTER WORD\r
- HRRZM MWP,WWRXX ;SAVE FIRST ADDRESS\r
- HRRZM MWP,LADR ;SAVE START OF LINKED LIST\r
- HRRZM ARG,1(MWP) ;STORE COUNT\r
- SOS WCOUNT ;ACCOUNT FOR WORD\r
- HRRZ ARG,WWRXX ;SET FIRST ADDRESS\r
- ADDI MWP,2 ;BUMP POINTER\r
- HRLI MWP,(POINT 7) ;SET FOR 5 ASCII BYTES\r
- ;SKELW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT)\r
-\r
-SKELW: SOSLE WCOUNT ;STILL SOME SPACE IN LEAF?\r
- POPJ PP, ;YES, RETURN\r
-SKELWL: SKIPE V,NEXT ;GET FIRST FREE ADDRESS\r
- JRST SKELW1 ;IF NON-ZERO, UPDATE FREE\r
- MOVE V,FREE ;GET FREE\r
- ADDI V,.LEAF ;INCREMENT BY LEAF SIZE\r
- CAML V,SYMBOL ;OVERFLOW?\r
- PUSHJ PP,XCEED ;YES, BOMB OUT\r
- EXCH V,FREE ;UPDATE FREE\r
- SETZM (V) ;CLEAR LINK\r
-\r
-SKELW1: HLL V,0(V) ;GET ADDRESS\r
- HLRM V,NEXT ;UPDATE NEXT\r
- SKIPE MWP ;IF FIRST TIME\r
- HRLM V,1-.LEAF(MWP) ;STORE LINK IN FIRST WORD OF LEAF\r
- MOVEI MWP,.LEAF ;SIZE OF LEAF\r
- MOVEM MWP,WCOUNT ;STORE FOR COUNT DOWN\r
- MOVEI MWP,(V) ;SET UP WRITE POINTER\r
- TLO MWP,(POINT 7,,21) ;2 ASCII CHARS\r
- POPJ PP,\r
-\r
- ;WWRXX POINTS TO END OF TREE\r
- ;MWP IDPB POINTER TO NEXT HOLE\r
- ;NEXT FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES)\r
- ;FREE POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE\r
- ;LADR POINTS TO BEG OF LINKED PORTION.\r
-\fGCHARQ: JUMPN MRP,MREADS ;IF GETTING CHAR. FROM TREE\r
-GCHAR: PUSHJ PP,CHARAC ;GET ASCII CHARACTER\r
- CAIG C,FF ;TEST FOR LF, VT OR FF\r
- CAIGE C,LF\r
- POPJ PP, ;NO\r
- JRST OUTIM1 ;YES, LIST IT\r
-\r
-WCHARQ:\r
-WCHAR: \r
-WCHAR1: TLNN MWP,760000 ;END OF WORD?\r
- PUSHJ PP,SKELW ;YES, GET ANOTHER\r
- IDPB C,MWP ;STORE CHARACTER\r
- POPJ PP,\r
-\r
-WWORD: LSHC C,7 ;MOVE ASCII INTO C\r
- PUSHJ PP,WCHAR1 ;STORE IT\r
- JUMPN CS,WWORD ;TEST FOR END\r
- POPJ PP, ;YES, EXIT\r
-\r
-WWRXE: PUSHJ PP,WWORD ;WRITE LAST WORD\r
- ADD MWP,WCOUNT ;GET TO END OF LEAF\r
- SUBI MWP,.LEAF ;NOW POINT TO START OF IT\r
- HRRZS (MWP) ;ZERO LEFT HALF OF LAST LEAF\r
- HRRM MWP,@WWRXX ;SET POINTER TO END\r
- POPJ PP,\r
-\fMREAD: PUSHJ PP,MREADS ;READ ONE CHARACTER\r
- CAIE C,177 ;SPECIAL?\r
- JRST RSW1 ;NO, EXIT\r
- PUSHJ PP,MREADS ;YES, GET CODE WORD\r
- TRZE C,100 ;SYMBOL?\r
- JRST GETDS ;YES\r
- CAILE C,4 ;POSSIBLY ILLEGAL\r
- JRST ERRAX ;YUP\r
- HRRI MRP,0 ;NO, SIGNAL END OF TEXT\r
- JRST .+1(C)\r
- PUSHJ PP,XCEED\r
- JRST MACEND ;1; END OF MACRO\r
- JRST DSEND ;2; END OF DUMMY SYMBOL\r
- JRST REPEND ;3; END OF REPEAT\r
- JRST IRPEND ;4; END OF IRP\r
-\r
-MREADI: HRLI MRP,700 ;SET UP BYTE POINTER\r
- MOVEI C,.LEAF-1 ;NUMBER OF WORDS\r
- MOVEM C,RCOUNT\r
-MREADS: TLNN MRP,-1 ;FIRST TIME HERE?\r
- JRST MREADI ;YES, SET UP MRP AND RCOUNT\r
- TLNN MRP,760000 ;HAVE WE FINISHED WORD?\r
- SOSLE RCOUNT ;YES, STILL ROOM IN LEAF?\r
- JRST MREADC ;STILL CHAR. IN LEAF\r
- HLRZ MRP,1-.LEAF(MRP);YES, GET LINK\r
- HRLI MRP,(POINT 7,,21) ;SET POINTER\r
- MOVEI C,.LEAF ;RESET COUNT\r
- MOVEM C,RCOUNT\r
-MREADC: ILDB C,MRP ;GET CHARACTER\r
- POPJ PP,\r
-\r
-PEEK: JUMPN MRP,PEEKM ;THIS IS A MACRO READ\r
- PUSHJ PP,CHARAC ;READ AN ASCII CHAR.\r
- TLO IO,IORPTC ;REPEAT FOR NEXT\r
- POPJ PP, ;AND RETURN\r
-\r
-PEEKM: PUSH PP,MRP ;SAVE MACRO READ POINTER\r
- PUSH PP,RCOUNT ;SAVE WORD COUNT\r
- PUSHJ PP,MREADS ;READ IN A CHAR.\r
- POP PP,RCOUNT ;RESTORE WORD COUNT\r
- POP PP,MRP ;RESET READ POINTER\r
- POPJ PP, ;IORPTC IS NOT SET\r
-\fREFINC: MOVEI CS,1(V) ;GET POINTER TO TREE\r
- AOS 0(CS) ;INCREMENT REFERENCE\r
- POPJ PP,\r
-\r
-REFDEC: JUMPLE V,DECERR ;CATASTROPHIC ERROR SOMEWHERE\r
- MOVEI CS,1(V) ;GET POINTER TO TREE\r
- SOS CS,0(CS) ;DECREMENT REFERENCE\r
- TRNE CS,000777 ;IS IT ZERO?\r
- POPJ PP, ;NO, EXIT\r
- HRRZ CS,0(V) ;YES, GET POINTER TO END\r
- HRL CS,NEXT ;GET POINTER TO NEXT RE-USABLE\r
- HLLM CS,0(CS) ;SET LINK\r
- HRRM V,NEXT ;RESET NEXT\r
- POPJ PP,\r
-\r
-DECERR: MOVE AC0,CALNAM ;GET MACRO NAME\r
- MOVSI RC,[SIXBIT /ERROR WHILE EXPANDING@/]\r
- PUSHJ PP,TYPMSG\r
- JRST ERRNE2 ;COMMON MESSAGE\r
-\fA== 0 ;ASCII MODE\r
-AL== 1 ;ASCII LINE MODE\r
-IB== 13 ;IMAGE BINARY MODE\r
-B== 14 ;BINARY MODE\r
-IFE RUNSW,<DMP==16 ;DUMP MODE>\r
-\r
-CTL== 0 ;CONTROL DEVICE NUMBER\r
-IFN CCLSW,<CTL2==4 ;INPUT DEV FOR CCL FILE>\r
-BIN== 1 ;BINARY DEVICE NUMBER\r
-CHAR== 2 ;INPUT DEVICE NUMBER\r
-LST== 3 ;LISTING DEVICE NUMBER\r
-\r
-; COMMAND STRING ACCUMULATORS\r
-\r
-ACDEV== 1 ;DEVICE\r
-ACFILE==2 ;FILE\r
-ACEXT== 3 ;EXTENSION\r
-ACPPN== 4 ;PPN\r
-ACDEL== 4 ;DELIMITER\r
-ACPNTR==5 ;BYTE POINTER\r
-\r
-TIO== 6\r
-\r
-TIORW== 1000\r
-TIOLE== 2000\r
-TIOCLD==20000\r
-\r
-DIRBIT==4 ;DIRECTORY DEVICE\r
-TTYBIT==10 ;TTY\r
-MTABIT==20 ;MTA\r
-DTABIT==100 ;DTA\r
-DISBIT==2000 ;DISPLAY\r
-CONBIT==20000 ;CONTROLING TTY\r
-LPTBIT==40000 ;LPT\r
-DSKBIT==200000 ;DSK\r
-\r
-;GETSTS ERROR BITS\r
-\r
-IOIMPM==400000 ;IMPROPER MODE (WRITE LOCK)\r
-IODERR==200000 ;DEVICE DATA ERROR\r
-IODTER==100000 ;CHECKSUM OR PARITY ERROR\r
-IOBKTL== 40000 ;BLOCK TOO LARGE\r
-ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL\r
-\r
-SYN .TEMP,PPN\r
-\fSUBTTL I/O ROUTINES\r
-BEG:\r
-IFN CCLSW,<TLZA IO,ARPGSW ;DON'T ALLOW RAPID PROGRAM GENERATION\r
- TLO IO,ARPGSW ;ALLOW RAPID PROGRAM GENERATION>\r
-IFN PURESW,<\r
- MOVE MRP,[XWD LOWL,LOWL+1] ;START OF DATA\r
- SETZM LOWL ;ZERO FIRST WORD\r
- BLT MRP,LOWEND ;AND THE REST\r
- MOVE MRP,[XWD LOWH,LOWL] ;PHASED CODE\r
- BLT MRP,LOWL+LENLOW ;MOVE IT IN>\r
- HRRZ MRP,JOBREL ;GET LOWSEG SIZE\r
- MOVEM MRP,MACSIZ ;SAVE CORE SIZE\r
- ;DECODE VERSION NUMBER\r
- MOVEI PP,JOBFFI ;TEMP PUSH DOWN STACK\r
- PUSH PP,[0] ;MARK BOTTOM OF STACK\r
- LDB 0,[POINT 3,JOBVER,2] ;GET USER BITS\r
- JUMPE 0,GETE ;NOT SET IF ZERO\r
- ADDI 0,"0" ;FORM NUMBER\r
- PUSH PP,0 ;STACK IT\r
- MOVEI 0,"-" ;SEPARATE BY HYPHEN\r
- PUSH PP,0 ;STACK IT ALSO\r
-GETE: HRRZ 0,JOBVER ;GET EDIT NUMBER\r
- JUMPE 0,GETU ;SKIP ALL THIS IF ZERO\r
- MOVEI 1,")" ;ENCLOSE IN PARENS.\r
- PUSH PP,1\r
-GETED: IDIVI 0,8 ;GET OCTAL DIGITS\r
- ADDI 1,"0" ;MAKE ASCII\r
- PUSH PP,1 ;STACK IT\r
- JUMPN 0,GETED ;LOOP TIL DONE\r
- MOVEI 0,"(" ;OTHER PAREN.\r
- PUSH PP,0\r
-GETU: LDB 0,[POINT 6,JOBVER,17] ;UPDATE NUMBER\r
- JUMPE 0,GETV ;SKIP IF ZERO\r
- IDIVI 0,8 ;MIGHT BE TWO DIGITS\r
- ADDI 1,"@" ;FORM ALPHA\r
- PUSH PP,1\r
- JUMPN 0,GETU+1 ;LOOP IF NOT DONE\r
-GETV: LDB 0,[POINT 9,JOBVER,11] ;GET VERSION NUMBER\r
- IDIVI 0,8 ;GET DIGIT\r
- ADDI 1,"0" ;TO ASCII\r
- PUSH PP,1 ;STACK\r
- JUMPN 0,GETV+1 ;LOOP\r
- MOVE 1,[POINT 7,VBUF+1,13] ;POINTER TO DEPOSIT IN VBUF\r
- POP PP,0 ;GET CHARACTER\r
- IDPB 0,1 ;DEPOSIT IT\r
- JUMPN 0,.-2 ;KEEP GOING IF NOT ZERO\r
-IFN FORMSW,<IFE DFRMSW,<\r
- SETOM PHWFMT ;HALF WORD UNLESS CHANGED BY SWITCH>>\r
-\fIFN CCLSW,<\r
- TLZA IO,CRPGSW ;SET TO INIT NEW COMMAND FILE\r
-M: TLNN IO,CRPGSW ;CURRENTLY DOING RPG?>\r
-IFE CCLSW,<M:>\r
- RESET ;INITIALIZE PROGRAM\r
- SETZM BINDEV ;CLEAR INCASE NOT USED NEXT TIME\r
- SETZM LSTDEV ;SAME REASON\r
- SETZM INDEV ;INCASE OF ERROR\r
- HRRZ MRP,MACSIZ ;GET INITIAL SIZE\r
- CORE MRP, ;BACK TO ORIGINAL SIZ4\r
- JFCL ;SHOULD NEVER FAIL\r
- SETZB MRP,PASS1I\r
- MOVE [XWD PASS1I,PASS1I+1]\r
- BLT PASS2X-1 ;ZERO THE PASS1 AND PASS2 VARIABLES\r
- MOVEI PP,JOBFFI ;SET TEMP PUSH-DOWN POINTER\r
- MOVE CS,[POINT 7,DBUF,6] ;INITIALIZE FOR DATE\r
- MSTIME 2, ;GET TIME FROM MONITOR\r
- PUSHJ PP,TIMOUT ;TIME FORMAT OUTPUT\r
- DATE 1, ;GET DATE\r
- IBP CS ;PASS OVER PRESET SPACE\r
- PUSHJ PP,DATOUT ;DATE FORMAT OUTPUT\r
- MOVSI FR,P1!CREFSW\r
-IFN CCLSW,<TLNE IO,CRPGSW ;RPG IN PROGRESS?\r
- JRST GOSET ;YES, GO READ NEXT COMMAND\r
- TLNE IO,ARPGSW ;NO, RPG ALLOWED?\r
- JRST RPGSET ;YES, GO TRY\r
-CTLSET: RELEASE CTL2, ;IN CASE OF LOOKUP FAILURE>\r
-IFE CCLSW,<CTLSET:>\r
- MOVSI IO,IOPALL ;ZERO FLAGS\r
- INIT CTL,AL ;INITIALIZE USER CONSOLE\r
- SIXBIT /TTY/\r
- XWD CTOBUF,CTIBUF\r
- EXIT ;NO TTY, NO ASSEMBLY\r
- MOVSI C,(SIXBIT /TTY/)\r
- DEVCHR C, ;GET CHARACTERISTICS\r
- TLNN C,10 ;IS IT REALLY A TTY\r
- EXIT ;NO\r
- INBUF CTL,1 ;INITIALIZE SINGLE CONTROL\r
- OUTBUF CTL,1 ;BUFFERS\r
- PUSHJ PP,CRLF ;OUTPUT CARRIAGE RETURN - LINE FEED\r
- MOVEI C,"*"\r
- IDPB C,CTOBUF+1\r
- OUTPUT CTL,\r
- INPUT CTL,\r
-\fIFN CCLSW,<JRST BINSET ;BEGIN WITH BINARY FILE\r
-\r
-RPGSET:\r
-IFN TEMP,<HRRZ 3,JOBFF ;GET START OF BUFFER AREA\r
- HRRZ 0,JOBREL ;GET TOP OF CORE\r
- CAIGE 0,200(3) ;WILL BUFFER FIT?\r
- JRST [ADDI 0,200 ;NO, GET ENUF CORE\r
- CORE 0, ;CORE UUO\r
- JRST XCEED2 ;FAILED, SO GIVE UP\r
- JRST .+1] ;CONTINUE\r
- HRRM 3,TMPFIL+1 ;STORE IN TMPCOR UUO IOWD\r
- SOS TMPFIL+1 ;MAKE IT THE PROPER IOWD FORMAT\r
- HRRM 3,CTLBLK+1 ;DUMMY UP BUFFER HEADER\r
- MOVE 0,[XWD 2,TMPFIL] ;SET UP FOR TEMP CORE READ\r
- TMPCOR ;READ AND DELETE FILE "MAC"\r
- JRST RPGTMP ;NO SUCH FILE IN CORE TRY DISK\r
- ADD 3,0 ;CALCULATE END OF BUFFER\r
- MOVEM 3,JOBFF ;FIX JOBFF SO FILE WONT BE KILLED\r
- IMULI 0,5 ;CALCULATE CHARACTER COUNT\r
- ADDI 0,1 ;SINCE SOSG HAPPENS AFTER NOT BEFORE\r
- MOVEM 0,CTLBLK+2 ;SET UP CHAR CNT IN BUFFER HEADER\r
- MOVEI 0,440700 ;SET UP BYTE POINTER IN HEADER\r
- HRLM 0,CTLBLK+1 ;BUFFER HEADER NOW SET UP\r
- SETOM TMPFLG ;MARK THAT A TMPCOR UUO WAS DONE\r
- JRST RPGS2A ;CONTINUE IN MAIN STREAM\r
-RPGTMP: SETZM TMPFLG ;JUST IN CASE>\r
- INIT CTL2,AL ;LOOK FOR DISK\r
- SIXBIT /DSK/ ;...\r
- XWD 0,CTLBLK ;...\r
- JRST CTLSET ;DSK NOT THERE\r
-\r
-IFE STANSW,<\r
- HRLZI 3,(SIXBIT /MAC/) ;###MAC\r
- MOVEI 3 ;COUNT\r
- PJOB AC1, ;RETURNS JOB NO. TO AC1\r
-RPGLUP: IDIVI AC1,12 ;CONVERT\r
- ADDI AC2,"0"-40 ;SIXBITIZE IT\r
- LSHC AC2,-6 ;\r
- SOJG 0,RPGLUP ;3 TIMES\r
- MOVEM 3,CTLBUF ;###MAC\r
- HRLZI (SIXBIT /TMP/) ;\r
->\r
-IFN STANSW,<\r
- MOVE 3,['QQMACR']\r
- MOVEM 3,CTLBUF\r
- MOVSI 0,'RPG'\r
->\r
- MOVEM CTLBUF+1 ;TMP\r
- SETZM CTLBUF+3 ;PROG-PRO\r
- LOOKUP CTL2,CTLBUF ;COMMAND FILE\r
- JRST CTLSET ;NOT THERE\r
- HLRM EXTMP ;SAVE THE EXTENSION\r
-\r
-RPGS2: INBUF CTL2,1 ;SINGLE BUFFERED\r
-RPGS2A: INIT CTL,AL ;TTY FOR CONSOLE MESSAGES\r
- SIXBIT /TTY/ ;...\r
- XWD CTOBUF,0 ;...\r
- EXIT ;NO TTY, NO ASSEMBLY\r
- OUTBUF CTL,1 ;SINGLE BUFFERED\r
- MOVE JOBFF ;REMEMBER WHERE BINARY BUFFERS BEGIN\r
- MOVEM SAVFF ;...\r
- HRRZ JOBREL ;TOP OF CORE\r
- CAMLE MACSIZ ;SEE IF IT HAS GROWN\r
- MOVEM MACSIZ ;PREVENTS ADDRESS CHECK ON EXIT\r
- TLNE IO,CRPGSW ;ARE WE ALREADY IN RPG MODE?\r
- JRST M ;MUST HAVE COME FROM @ COMMAND, RESET\r
-\r
-\fGOSET: MOVSI IO,IOPALL!CRPGSW ;SET INITIAL FLAGS\r
- MOVEI CS,CTLSIZ ;MAXIMUM CHARS IN A LINE\r
- MOVE AC1,CTLBLK+2 ;NUMBER OF CHARACTERS\r
- MOVEM AC1,CTIBUF+2 ;SAVE FOR PASS 2\r
- MOVE AC1,[POINT 7,CTLBUF] ;WHERE TO STASH CHARS\r
- MOVEM AC1,CTIBUF+1 ;...\r
-GOSET1: SOSG CTLBLK+2 ;ANY MORE CHARS?\r
- PUSHJ PP,[IFN TEMP,<SKIPE TMPFLG ;TMPCOR UUO IN PROGRESS?\r
- EXIT ;YES EXIT>\r
- IN CTL2, ;READ ANOTHER BUFFERFUL\r
- POPJ PP, ;EVERYTHING OK, RETURN\r
- STATO CTL2,20000 ;EOF?\r
- JRST [HRROI RC,[SIXBIT /ERROR READING COMMAND FILE@/]\r
- JRST ERRFIN] ;GO COMPLAIN\r
- PUSHJ PP,DELETE ;CMD FILE\r
- EXIT] ;EOF AND FINISHED\r
- ILDB C,CTLBLK+1 ;GET NEXT CHAR\r
- MOVE RC,@CTLBLK+1 ;CHECK FOR SEQUENCE NUMBERS\r
- TRNE RC,1 ;...\r
- JRST [AOS CTLBLK+1 ;SKIP OVER ANOTHER 5 CHARS\r
- MOVNI RC,5 ;...\r
- ADDM RC,CTLBLK+2 ;...\r
- JRST GOSET1 ] ;GO READ ANOTHER CHAR\r
- JUMPE C,GOSET1 ;IGNORE NULLS\r
- IDPB C,CTIBUF+1 ;STASH AWAY\r
- AOS CTIBUF+2 ;INCREMENT CHAR. COUNT\r
- CAIE C,12 ;LINE FEED OR\r
- CAIN C,175 ;ALTMODE?\r
- JRST GOSET2 ;YES, FINISHED WITH COMMAND\r
- CAIE C,176\r
- CAIN C,33\r
- JRST GOSET2 ;ALTMODE.\r
- SOJG CS,GOSET1 ;GO READ ANOTHER\r
- HRROI RC,[SIXBIT /COMMAND LINE TOO LONG@/]\r
- JRST ERRFIN ;GO COMPLAIN\r
-GOSET2: MOVEI C,12 ;MAKE SURE THERE'S A LF\r
- IDPB C,CTIBUF+1 ;...\r
- MOVEM AC1,CTIBUF+1 ;SET POINTER TO BEGINNING\r
- AOS CTIBUF+2 ;ADD I TO COUNT\r
- MOVE SAVFF ;RESET JOBFF FOR NEW BINARY\r
- MOVEM JOBFF ;...\r
- JRST BINSET\r
-\f\r
-RPGS1: PUSHJ PP,DELETE ;DELETE COMMAND FILE\r
- MOVEM ACDEV,RPGDEV ;GET SET TO INIT\r
- OPEN CTL2,RPGINI ;DO IT\r
- JRST EINIT ;ERROR\r
- MOVEM ACFILE,INDIR ;USE INPUT BLOCK\r
- MOVEM ACPPN,INDIR+3 ;SET PPN \r
- MOVEM ACEXT,INDIR+1\r
- LOOKUP CTL2,INDIR\r
- JRST [JUMPN ACEXT,RPGLOS ;GIVE UP ,EXPLICIT EXTENSION\r
-IFE STANSW,< MOVSI ACEXT,(SIXBIT /CCL/) ;IF BLANK TRY CCL>\r
-IFN STANSW,< MOVSI ACEXT,(SIXBIT /RPG/) ;IF BLANK TRY RPG>\r
- JRST .-2 ]\r
- HLRM ACEXT,EXTMP ;SAVE THE EXTENSION\r
- HLRZ JOBSA ;RESET JOBFF TO ORIGINAL\r
- MOVEM JOBFF\r
- TLO IO,CRPGSW ;TURN ON SWITCH SO WE RESET WORLD\r
- JRST RPGS2 ;AND GO\r
-RPGLOS: RELEAS CTL2,0\r
- TLZ IO,CRPGSW ;STOPS IO TO UNASGD CHAN\r
- JRST ERRCF ;NO FILE FOUND\r
->\r
-\fBINSET: PUSHJ PP,NAME1 ;GET FIRST NAME\r
-IFN CCLSW,<CAIN C,"!" ;WAS THIS AN IMPERATIVE?\r
- JRST NUNSET ;GET THEE TO A NUNNERY\r
- CAIN C,"@" ;CHEK FOR A NEW RPG FILE\r
- JRST RPGS1>\r
- TLNN FR,CREFSW ;CROSS REF REQUESTED?\r
- JRST LSTSE1 ;YES, SKIP BINARY\r
- CAIN C,"," ;COMMA?\r
- JUMPE ACDEV,LSTSET ;YES, SKIP BINARY IF NO DEVICE SPECIFIED\r
- CAIN C,"_" ;LEFT ARROW?\r
- JUMPE ACDEV,LSTSE1 ;YES, SKIP BINARY IF NO DEVICE SPECIFIED\r
- JUMPE ACDEV,M ;IGNORE IF JUST <CR-LF>\r
- TLO FR,PNCHSW ;OK, SET SWITCH\r
- MOVEM ACDEV,BINDEV ;STORE DEVICE NAME\r
- MOVEM ACFILE,BINDIR ;STORE FILE NAME IN DIRECTORY\r
- JUMPN ACEXT,.+2 ;EXTENSION SPECIFIED?\r
- MOVSI ACEXT,(SIXBIT /REL/) ;NO, ASSUME RELOCATABLE BINARY\r
- MOVEM ACEXT,BINDIR+1 ;STORE IN DIRECTORY\r
- MOVEM ACPPN,BINDIR+3 ;SET PPN\r
- OPEN BIN,BININI ;INITIALIZE BINARY\r
- JRST EINIT ;ERROR\r
- TLZE TIO,TIOLE ;SKIP TO EOT\r
- MTAPE BIN,10\r
- TLZE TIO,TIORW ;REWIND REQUESTED?\r
- MTAPE BIN,1 ;YES\r
- JUMPGE CS,BINSE2 ;BRANCH IF NO BACK-SPACE\r
- MTAPE BIN,17 ;BACK-SPACE A FILE\r
- AOJL CS,.-1 ;TEST FOR END\r
- WAIT BIN,\r
- STATO BIN,1B24 ;LOAD POINT?\r
- MTAPE BIN,16 ;NO, GO FORWARD ONE\r
-BINSE2: SOJG CS,.-1 ;TEST FORWARD SPACING\r
-\r
- TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?\r
- UTPCLR BIN, ;YES, CLEAR IT\r
- OUTBUF BIN,2 ;SET UP TWO RING BUFFER\r
- CAIN C,"_"\r
- JRST GETSET ;NO LISTING\r
-\fLSTSET: PUSHJ PP,NAME1 ;GET NEXT DEVICE\r
-LSTSE1: CAIE C,"_"\r
- JRST ERRCM\r
- TLNE FR,CREFSW ;CROSS-REF REQUESTED?\r
- JRST LSTSE2 ;NO, BRANCH\r
- JUMPN ACDEV,.+2 ;YES, WAS DEVICE SPECIFIED?\r
- MOVSI ACDEV,(SIXBIT /DSK/) ;NO, ASSUME DSK\r
- JUMPN ACFILE,.+2\r
- MOVE ACFILE,[SIXBIT /CREF/]\r
- JUMPN ACEXT,.+2\r
-IFE STANSW,<MOVSI ACEXT,(SIXBIT /CRF/) >\r
-IFN STANSW,<MOVSI ACEXT,'LST'>\r
-LSTSE2: JUMPE ACDEV,GETSET ;FORGET LISTING IF NO DEVICE SPECIFIED\r
- MOVE AC0,ACDEV\r
- DEVCHR AC0, ;GET CHARACTERISTICS\r
- TLNE AC0,LPTBIT!DISBIT!TTYBIT\r
- TLNE FR,CREFSW ; WAS CROSS-REF REQUESTED?\r
- AOSA OUTSW+0*TTYSW ;NO, ASSUME TTY\r
- JRST ERRCM ;YES, ERROR - CREF DEV MUST NOT BE LPT, DIS, OR TTY\r
- TLNE AC0,CONBIT ;CONTROLING TELETYPE LISTING?\r
- JRST GETSET ;YES, BUFFER ALREADY SET\r
- MOVEM ACDEV,LSTDEV ;STORE DEVICE NAME\r
- AOS OUTSW+0*LPTSW ;SET FOR LPT\r
- MOVEM ACFILE,LSTDIR ;STORE FILE NAME\r
- JUMPN ACEXT,.+2\r
- MOVSI ACEXT,(SIXBIT /LST/)\r
- MOVEM ACEXT,LSTDIR+1\r
- MOVEM ACPPN,LSTDIR+3 ;SET PPN\r
- OPEN LST,LSTINI ;INITIALIZE LISTING OUTPUT\r
- JRST EINIT ;ERROR\r
- TLZE TIO,TIOLE\r
- MTAPE LST,10\r
- TLZE TIO,TIORW ;REWIND REQUESTED?\r
- MTAPE LST,1 ;YES\r
- JUMPGE CS,LSTSE3\r
- MTAPE LST,17\r
- AOJL CS,.-1\r
- WAIT LST,\r
- STATO LST,1B24\r
- MTAPE LST,16\r
-LSTSE3: SOJG CS,.-1\r
- TLNE TIO,TIOCLD ;DIRECTORY CLEAR REQUESTED?\r
- UTPCLR LST, ;YES, CLEAR IT\r
- OUTBUF LST,2 ;SET UP A TWO RING BUFFER\r
-\fGETSET: MOVEI 3,PDPERR\r
- HRRM 3,JOBAPR ;SET TRAP LOCATION\r
- MOVEI 3,1B19 ;SET FOR PUSH-DOWN OVERFLOW\r
- APRENB 3,\r
- SOS 3,PDP ;GET PDP REQUEST MINUS 1\r
- IMULI 3,.PDP ;COMPUTE SIZE (50*<NUMBER OF /P'S +1>)\r
- HRLZ MP,3\r
- HRR MP,JOBFF ;SET BASIC POINTER\r
- MOVE PP,MP\r
- SUB PP,3\r
- MOVEM PP,RP ;SET RP\r
- SUB PP,3\r
- ASH 3,1 ;DOUBLE SIZE OF BASIC POINTER\r
- HRL PP,3\r
- SUBM PP,3 ;COMPUTE TOP LOCATION\r
- SKIPN UNITOP ;IF ANY UNIVERSALS HAVE BEEN SEEN\r
- JRST GETSE0 ;NO\r
- HRRZS 3 ;GET TOP OF BUFFERS AND STACKS\r
- CAMLE 3,UNISIZ ;HOPE ITS NOT BIGGER THAN UNIVERSAL ONE\r
- JRST UNIERR ;IT WAS, YOU LOSE\r
- SKIPA 3,UNITOP ;DON'T LOSE THEM\r
-GETSE0: HRRZM 3,UNISIZ ;STORE UNTIL A UNIVERSAL IS SEEN\r
- HRRZM 3,LADR ;SET START OF MACRO TREE\r
- HRRZM 3,FREE\r
-\r
-GETSE1: HRRZ JOBREL\r
- SUBI 1\r
- MOVEM SYMTOP ;SET TOP OF SYMBOL TABLE\r
- SUBI LENGTH ;SET POINTER FOR INITIAL SYMBOLS\r
- CAMLE LADR ;HAVE WE ROOM?\r
- JRST GETSE2 ;YES\r
-\r
- HRRZ 2,JOBREL ;NO, TRY FOR MORE CORE\r
- ADDI 2,2000\r
- CORE 2,\r
- JRST XCEED2 ;NO MORE, INFORM USER\r
- JRST GETSE1 ;TRY AGAIN\r
-\r
-GETSE2: MOVEM SYMBOL ;SET START OF SYMBOL TABLE\r
- HRLI SYMNUM\r
- BLT @SYMTOP ;STORE SYMBOLS\r
- PUSHJ PP,SRCHI ;INITIALIZE TABLE\r
- MOVE [XWD CTIBUF+1,CTLSAV] ;SAVE CONTROL INPUT BUFFER\r
- BLT CTLS1 ;FOR RESCAN ON PASS 2\r
-IFN FTDISK,<MOVSI (SIXBIT /DSK/) ;SET INPUT TO TAKE DSK AS DEV\r
- MOVEM ACDEVX>\r
- PUSHJ PP,COUTI ;INIT OUTPUT JUST IN CASE\r
- PUSHJ PP,INSET ;GET FIRST INPUT FILE\r
-\r
-IFN CCLSW,<TLNE IO,CRPGSW ;BUT ONLY IF DOING RPG\r
- TTCALL 3,[ASCIZ /MACRO: /] ;PUBLISH COMPILER NAME>\r
- MOVE CS,INDIR ;SET UP NAME OF FIRST FILE\r
- MOVEM CS,LSTFIL ;AS LAST PRINTED\r
- SETZM LSTPGN\r
- JRST ASSEMB ;START ASSEMBLY\r
-\fFINIS: CLOSE BIN, ;DUMP BUFFER\r
- TLNE FR,PNCHSW ;PUNCH REQUESTED?\r
- PUSHJ PP,TSTBIN ;YES, TEST FOR ERRORS\r
- RELEAS BIN,\r
- CLOSE LST,\r
- SOSLE OUTSW+0*LPTSW ;LPT TYPE OUTPUT?\r
- PUSHJ PP,TSTLST ;YES, TEST FOR ERRORS\r
- RELEAS LST,\r
- RELEAS CHAR,\r
- OUTPUT CTL,0 ;FLUSH TTY OUTPUT\r
- SKIPE UNIVSN ;SKIP IF NOT ASSEMBLING UNIVERSAL\r
- PUSHJ PP,UNISYM ;STORE SYMBOLS ETC. FIRST\r
- JRST M ;RETURN FOR NEXT ASSEMBLY\r
-\fINSET: MOVEI JOBFFI ;POINTER TO INPUT BUFFER\r
- HRRM JOBFF ;INFORM SYSTEM OF BUFFER AREA\r
- PUSHJ PP,NAME2 ;GET NEXT COMMAND NAME\r
- JUMPE ACDEV,ERRNE ;ERROR IF NONE LEFT\r
- MOVEM ACDEV,INDEV ;STORE DEVICE\r
- MOVEM ACFILE,INDIR ;STORE FILE IN DIRECTORY\r
- MOVEM ACPPN,INDIR+3 ;STORE PPN BEFORE WE LOSE IT\r
- OPEN CHAR,INDEVI\r
- JRST EINIT ;ERROR\r
- DEVCHR ACDEV, ;TEST CHARACTERISTICS\r
- TLNN ACDEV,MTABIT ;MAG TAPE?\r
- JRST INSET3 ;NO\r
- TLZN FR,MTAPSW ;FIRST MAG TAPE IN PASS 2?\r
- JRST INSET1 ;NO\r
- TLNN TIO,TIORW ;YES, REWIND REQUESTED?\r
- SUB CS,RECCNT ;NO, PREPARE TO BACK-SPACE TAPE\r
-INSET1: AOS RECCNT ;INCREMENT FILE COUNTER\r
- ADDM CS,RECCNT ;UPDATE COUNT\r
- TLZE TIO,TIOLE\r
- MTAPE CHAR,10\r
- TLZE TIO,TIORW ;REWIND?\r
- MTAPE CHAR,1 ;YES\r
- JUMPGE CS,INSET2\r
- MTAPE CHAR,17\r
- MTAPE CHAR,17\r
- AOJL CS,.-1\r
- WAIT CHAR,\r
- STATO CHAR,1B24\r
- MTAPE CHAR,16\r
-INSET2: SOJGE CS,.-1\r
-\r
-INSET3: INBUF CHAR,1\r
- MOVEI ACPNTR,JOBFFI\r
- EXCH ACPNTR,JOBFF\r
- SUBI ACPNTR,JOBFFI\r
- MOVEI ACDEL,NUMBUF*203+1\r
- IDIV ACDEL,ACPNTR\r
- INBUF CHAR,(ACDEL)\r
- JUMPN ACEXT,INSET4 ;TAKE USER'S EXTENSION IF NON-BLANK\r
- MOVSI ACEXT,(SIXBIT /MAC/) ;BLANK, TRY .MAC FIRST\r
- PUSHJ PP,INSETI\r
-INSET4: PUSHJ PP,INSETI\r
- JUMPE ACEXT,ERRCF ;ERROR IF ZERO\r
- TLNE ACDEV,TTYBIT ;TELETYPE?\r
- SETSTS CHAR,AL ;YES, CHANGE TO ASCII LINE\r
-\f ;DO ALL ENTERS HERE FOR LEVEL D\r
- SKIPE ENTERS ;HAVE ENTERS BEEN DONE ALREADY?\r
- JRST ENTRDN ;YES, DON'T DO TWICE\r
- SKIPN ACEXT,LSTDEV ;IS THERE A LIST DEVICE?\r
- JRST LSTSE5 ;NO SO DON'T DO ENTER\r
- SKIPN ACFILE,LSTDIR ;GET FILE NAME INCASE OF ERROR\r
- JRST [DEVCHR ACEXT, \r
- TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?\r
- JRST LSTSE4 ;YES, GIVE UP BEFORE HARM IS DONE\r
- SKIPE ACFILE,INDIR ;USE INPUT FILE NAME\r
- MOVEM ACFILE,LSTDIR ;TOO BAD IF ZERO ALSO\r
- JRST LSTSE4]\r
- HLLZ ACEXT,LSTDIR+1 ;EXT ALSO\r
- MOVE ACPPN,LSTDIR+3 ;SAVE PPN\r
- LOOKUP LST,LSTDIR ;PREVIOUS ONE STILL THERE\r
- JRST LSTSE4 ;NO\r
- SETZM LSTDIR ;YES,CLEAR NAME\r
- MOVEM ACPPN,LSTDIR+3 ;RESET PPN\r
- RENAME LST,LSTDIR\r
- CLOSE LST, ;IGNORE FAILURE\r
- MOVEM ACFILE,LSTDIR ;RESTORE NAME\r
- HLLZS LSTDIR+1 ;BH 11/19/74 FOR DATE75. CLEAR RH.\r
- SETZM LSTDIR+2 ;CLEAR PROTECTION AND DATE\r
- MOVEM ACPPN,LSTDIR+3 ;SET PPN AGAIN\r
-LSTSE4: \r
-IFN STANSW,<\r
- MOVSI ACEXT,400000\r
- MOVEM ACEXT,LSTDIR+2 ;SET DUMP NEVER BIT.\r
->\r
- ENTER LST,LSTDIR ;SET UP DIRECTORY\r
- JRST ERRCL ;ERROR\r
-LSTSE5: SKIPN ACEXT,BINDEV ;A BINARY DEVICE THEN ?\r
- JRST ENTRDN ;NO\r
- SKIPN ACFILE,BINDIR ;INCASE OF ERROR\r
- JRST [DEVCHR ACEXT, \r
- TLNE ACEXT,DIRBIT ;DOES IT HAVE A DIRECTORY?\r
- JRST .+1 ;YES, GIVE UP BEFORE HARM IS DONE\r
- SKIPE ACFILE,INDIR ;USE INPUT FILE NAME\r
- MOVEM ACFILE,BINDIR ;TOO BAD IF ZERO ALSO\r
- JRST .+1]\r
-IFN STANSW,<\r
- MOVSI ACEXT,400000\r
- MOVEM ACEXT,BINDIR+2\r
->\r
- HLLZS ACEXT,BINDIR+1 ;BH 11/19/74 DATE75. WAS HLLZ.\r
- ENTER BIN,BINDIR ;ENTER FILE NAME\r
- JRST ERRCB ;ERROR\r
-\r
-ENTRDN: SETOM ENTERS ;MAKE SURE ONLY DONE ONCE\r
- MOVE CS,[POINT 7,DEVBUF]\r
- PUSH PP,1 ;SAVE THE ACCS\r
- PUSH PP,2\r
- PUSH PP,3\r
- SKIPN 2,INDIR ;GET INPUT NAME\r
- JRST FINDEV ;FINISHED WITH DEVICE\r
- SETZ 1, ;CLEAR FOR RECEIVING\r
- LSHC 1,6 ;SHIFT ONE CHAR. IN\r
- ADDI 1,40 ;FORM ASCII\r
- IDPB 1,CS ;STORE CHAR.\r
- JUMPN 2,.-4 ;MORE TO DO?\r
- MOVEI 1," " ;SEPARATE BY TAB\r
- IDPB 1,CS\r
- HLLZ 2,INDIR+1 ;GET EXT\r
- JUMPE 2,FINEXT ;NO EXT\r
- SETZ 1,\r
- LSHC 1,6 ;SAME LOOP AS ABOVE\r
- ADDI 1,40\r
- IDPB 1,CS\r
- JUMPN 2,.-4\r
-FINEXT: MOVEI 1," "\r
- IDPB 1,CS ;SEPARATE BY TAB\r
- LDB 1,[POINT 12,INDIR+2,35] ;GET DATE\r
- LDB 2,[POINT 3,INDIR+1,20] ;BH 11/19/74 DATE75.\r
- DPB 2,[POINT 3,1,23] ;BH 11/19/74 DATE75.\r
- JUMPE 1,FINDEV ;NO DATE?\r
- PUSHJ PP,DATOUT ;STORE IT\r
- LDB 2,[POINT 11,INDIR+2,23] ;GET CREATION TIME\r
- JUMPE 2,FINDEV ;NO TIME (DECTAPE)\r
- MOVEI 1," " ;SEPARATE BY SPACE\r
- IDPB 1,CS\r
- PUSHJ PP,TIMOU1 ;STORE TIME\r
-FINDEV: SETZ 1,\r
- MOVEI 2," " ;FINAL TAB\r
- IDPB 2,CS\r
- IDPB 1,CS ;TERMINATE FOR NOW\r
- POP PP,3 ;RESTORE ACCS\r
- POP PP,2\r
- POP PP,1\r
- SKIPN PAGENO ;IF FIRST TIME THRU\r
- JRST OUTFF ;START NEW PAGE\r
- SETZM PAGENO ;ON NEW FILE, RESET PAGES\r
- JRST OUTFF2 ;DON'T START NEW PAGE UNLESS FF\r
-\r
-INSETI: HLLZM ACEXT,INDIR+1 ;STORE EXTENSION\r
- MOVE ACPPN,INDIR+3 ;SAVE PPN\r
- LOOKUP CHAR,INDIR\r
- SKIPA ACEXT,INDIR+1 ;GET ERROR CODE\r
- JRST CPOPJ1 ;SKIP-RETURN IF FOUND\r
- TRNE ACEXT,-1 ;ERROR CODE OF 0 IS FILE NOT FOUND\r
- JRST ERRCF ;FILE THERE BUT NOT READABLE\r
- SETZ ACEXT, ;CLEAR EXT AND TRY AGAIN\r
- MOVEM ACPPN,INDIR+3 ;RESTORE PPN\r
- POPJ PP,\r
-\fREC2: MOVS [XWD CTIBUF+1,CTLSAV] ;RESCAN CONTROL (FROM PASS1 END STMNT)\r
- BLT CTIBUF+2 ;INPUT BUFFER\r
- MOVEI "_"\r
- HRLM ACDELX ;FUDGE PREVIOUS DELIMITER\r
-IFN RENTSW,<MOVE HHIGH ;GET HI-SEG BREAK\r
- MOVEM HIGH1 ;SAVE THE ONE WE GOT ON PASS1 (FOR HISEG)>\r
- SETZM PASS2I\r
- MOVE [XWD PASS2I,PASS2I+1]\r
- BLT PASS2X-1 ;ZERO PASS2 VARIABLES\r
- TLO FR,MTAPSW!LOADSW ;SET FLAGS \r
-\r
-GOTEND: MOVE INDEV ;GET LAST DEVICE\r
- DEVCHR ;GET ITS CHARACTERISTICS\r
- TLNE 4 ;TEST FOR DIRECTORY (DSK OR DTA)\r
- JRST EOT ;YES, SO DON'T WASTE TIME\r
- JRST .+3 ;NO, INPUT BUFFER BY BUFFER\r
- IN CHAR,\r
- JRST .-1 ;NO ERRORS\r
- STATO CHAR,1B22 ;TEST FOR EOF\r
- JRST .-3 ;IGNORE ERRORS\r
-\r
-EOT: PUSHJ PP,SAVEXS ;SAVE REGISTERS\r
- PUSHJ PP,INSET ;GET THE NEXT INPUT DEVICE\r
- HRROI RC,[SIXBIT /END OF PASS 1@/] ;ASSUME END OF PASS\r
- TLZN FR,LOADSW ;ZERO ONLY ON END OF PASS 1\r
- HRROI RC,[SIXBIT /LOAD THE NEXT FILE@/] ;NOT END OF PASS\r
- TLNN ACDEV,(1B13!1B15) ;WAS ALL THAT WORK NECESSARY?\r
- PUSHJ PP,TYPMSG ;YES\r
-\r
-RSTRXS: MOVSI RC,SAVBLK ;SET POINTER\r
- BLT RC,RC-1 ;RESTORE REGISTERS\r
- MOVE RC,SAVERC ;RESTORE RC\r
- POPJ PP, ;EXIT\r
-\r
-SAVEXS: MOVEM RC,SAVERC ;SAVE RC\r
- MOVEI RC,SAVBLK ;SET POINTER\r
- BLT RC,SAVBLK+RC-1 ;BLT ALL REGISTERS BELOW RC\r
- POPJ PP, ;EXIT\r
-\fNAME1: SETZM ACDEVX ;ENTRY FOR DESTINATION\r
-NAME2: SETZB ACDEV,INDIR+2 ;ENTRY FOR SOURCE\r
- MOVEI ACFILE,0 ;CLEAR FILE\r
- HLRZ ACDEL,ACDELX ;GET PREVIOUS DELIMITER\r
- SETZB TIO,CS\r
- SETZB ACEXT,INDIR+3 ;RESET EXTENSION AND PROGRAM-NUMBER PAIR\r
- SETZM PPN ;CLEAR PPN\r
-NAME3: MOVSI ACPNTR,(POINT 6,AC0) ;SET POINTER\r
- TDZA AC0,AC0 ;CLEAR SYMBOL\r
-\r
-SLASH: PUSHJ PP,SW0\r
-GETIOC: PUSHJ PP,TTYIN ;GET INPUT CHARACTER\r
- CAIN C,"/"\r
- JRST SLASH\r
- CAIN C,"("\r
- JRST SWITCH\r
- CAIN C,":"\r
- JRST DEVICE\r
- CAIN C,"."\r
- JRST NAME\r
-IFN CCLSW,<CAIE C,"!" ;IS CHAR AN IMPERATIVE?\r
- CAIN C,"@"\r
- JRST TERM ;YES, GO DO IT>\r
- CAIE C,33 ;CHECK FOR THREE FLAVORS OF ALT-MODE\r
- CAIN C,176 ;...\r
- JRST TERM ;...\r
- CAIG C,CR ;LESS THAN CR?\r
- CAIGE C,LF ;AND GREATER THAN LF?\r
- CAIN C,175 ;OR 3RD ALTMOD\r
- JRST TERM ;YES\r
-IFN FTDISK,<CAIN C,"["\r
- JRST PROGNP ;GET PROGRAMER NUMBER PAIR>\r
- CAIN C,"=" ;EQUALS IS SAME AS LEFT ARROW\r
- TRCA C,142 ;SO MAKE IT A "_" AND SKIP\r
- CAIE C,","\r
- CAIN C,"_"\r
- JRST TERM\r
- CAIGE C,40 ;VALID AS SIXBIT?\r
- JRST [CAIN C,"Z"-100 ;NO,IS IT ^Z\r
- EXIT ;YES,EXIT FOR BATCH\r
- JRST GETIOC] ;JUST IGNORE\r
- SUBI C,40 ;CONVERT TO 6-BIT\r
- TLNE ACPNTR,770000 ;HAVE WE STORED SIX BYTES?\r
- IDPB C,ACPNTR ;NO, STORE IT\r
- JRST GETIOC ;GET NEXT CHARACTER\r
-\r
-DEVICE: JUMPN ACDEV,ERRCM ;ERROR IF ALREADY SET\r
- MOVE ACDEV,AC0 ;DEVICE NAME\r
- JRST DEVNAM ;COMMON CODE\r
-\r
-NAME: JUMPN ACFILE,ERRCM ;ERROR IF ALREADY SET\r
- MOVE ACFILE,AC0 ;FILE NAME\r
-DEVNAM: MOVE ACDEL,C ;SET DELIMITER\r
- JRST NAME3 ;GET NEXT SYMBOL\r
-\r
-TERM: JUMPE ACDEL,TERM1 ;IF NO PREVIOUS TERMINATOR, THEN FILENAME\r
- CAIN ACDEL,"_" ;...\r
- JRST TERM1 ;...\r
- CAIE ACDEL,":" ;IF PREVIOUS DELIMITER\r
- CAIN ACDEL,"," ;WAS COLON OR COMMA\r
-TERM1: MOVE ACFILE,AC0 ;SET FILE\r
- CAIN ACDEL,"." ;IF PERIOD,\r
- HLLZ ACEXT,AC0 ;SET EXTENSION\r
- HRLM C,ACDELX ;SAVE PREVIOUS DELIMITER\r
- JUMPN ACDEV,.+2 ;IF DEVICE SET USE IT\r
- SKIPA ACDEV,ACDEVX ;OTHERWISE USE LAST DEVICE\r
- MOVEM ACDEV,ACDEVX ;AND DEVICE\r
- MOVE ACPPN,PPN ;PUT PPN IN RIGHT PLACE\r
-IFN FTDISK,<CAIN C,"!" ;IMPERATIVE?\r
- POPJ PP, ;YES, DON'T ASSUME DEV\r
- JUMPE ACFILE,CPOPJ ;IF THERE IS A FILE,\r
- JUMPN ACDEV,.+2 ;BUT NO DEVICE\r
- MOVSI ACDEV,(SIXBIT /DSK/) ;THEN ASSUME DISK>\r
- POPJ PP, ;EXIT\r
-\fERRCM: HRROI RC,[SIXBIT /COMMAND ERROR@/]\r
- JRST ERRFIN\r
-\r
-IFN FTDISK,<PROGNP:\r
-PROGN1: HRLZM RC,PPN ;COMMA, STORE LEFT HALF\r
-PROGN2: MOVEI RC,0 ;CLEAR AC\r
-PROGN3: PUSHJ PP,TTYIN\r
- CAIN C,","\r
- JRST PROGN1 ;STORE LEFT HALF\r
- HRRM RC,PPN ;ASSUME TERMINAL\r
- CAIN C,"]"\r
- JRST GETIOC ;YES, RETURN TO MAIN SCAN\r
-IFE STANSW,<\r
- CAIL C,"0" ;CHECK FOR VALID NUMBERS\r
- CAILE C,"7"\r
- JRST ERRCM ;NOT VALID\r
- LSH RC,3 ;SHIFT PREVIOUS RESULT\r
- ADDI RC,-"0"(C) ;ADD IN NEW NUMBER>\r
-IFN STANSW,<LSH RC,6 ;SHIFT PREVIOUS RESULT\r
- ADDI RC,-40(C) ;PUT IN NEW CHARACTER>\r
- JRST PROGN3 ;GET NEXT CHARACTER>\r
-\fSWITC0: PUSHJ PP,SW1 ;PROCESS CHARACTER\r
-SWITCH: PUSHJ PP,TTYIN ;GET NEXT CHARACTER\r
- CAIE C,")" ;END OF STRING?\r
- JRST SWITC0 ;NO\r
- JRST GETIOC ;YES\r
-\r
-SW0: PUSHJ PP,TTYIN\r
-SW1: MOVEI C,-"A"(C) ;CONVERT FROM ASCII TO NUMERIC\r
- CAILE C,"Z"-"A" ;WITHIN BOUNDS? (IS IT ALPHA?)\r
- JRST ERRCM ;NO, ERROR\r
- MOVE RC,[POINT 4,BYTAB]\r
- IBP RC\r
- SOJGE C,.-1 ;MOVE TO PROPER BYTE\r
- LDB C,RC ;PICK UP BYTE\r
- JUMPE C,ERRCM ;TEST FOR VALID SWITCH\r
- CAIG C,SWTABT-SWTAB ;LEGAL ON SOURCE?\r
- JUMPL PP,ERRCM ;NO, TEST FOR SOURCE\r
- LDB RC,[POINT 4,SWTAB-1(C),12]\r
- CAIN RC,IO\r
- SKIPN CTLSAV ;IF PASS2 OR IO SWITCH,\r
- XCT SWTAB-1(C) ;EXECUTE INSTRUCTION\r
- POPJ PP, ;EXIT\r
- TLZ IO,IOSALL ;TAKE CARE OF /X\r
- POPJ PP,\r
-\r
-DEFINE HELP (TEXT)<\r
- XLIST\r
- ASCIZ ?TEXT?\r
- LIST>\r
-\r
-HLPMES: HELP <\r
-Switches are :-\r
-/A advance one file\r
-/B backspace one file\r
-/C produce a cref listing\r
-/E list macro expansions (LALL)\r
-/F list in new format (.MFRMT)\r
-/G list in old format (.HWFRMT)\r
-/H type this text\r
-/L reinstate listing (LIST)\r
-/M suppress ascii in macro and repeat expansion (SALL)\r
-/N suppress error printout on tty\r
-/O set MLOFF pseudo-op\r
-/P increase size of the pushdown stack\r
-/Q suppress Q errors on the listing\r
-/S suppress listing (XLIST)\r
-/T rewind device\r
-/X suppress all macro expansions (XALL)\r
-/Z zero the directory\r
-Switches A,B,C,T,W,X, and Z must immediately follow\r
-the device or file to which they refer.\r
->\r
-\f DEFINE SETSW (LETTER,INSTRUCTION) < INSTRUCTION\r
-J= <"LETTER"-"A">-^D9*<I=<"LETTER"-"A">/^D9>\r
- SETCOD \I,J>\r
-\r
- DEFINE SETCOD (I,J)\r
- <BYTAB'I=BYTAB'I!<.-SWTAB>B<4*J+3>>\r
-\r
-BYTAB0= 0 ;INITIALIZE TABLE\r
-BYTAB1= 0\r
-BYTAB2= 0\r
-\r
-SWTAB:\r
- SETSW Z,<TLO TIO,TIOCLD >\r
- SETSW C,<TLZ FR,CREFSW >\r
- SETSW P,<SOS PDP >\r
-SWTABT: ;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY\r
- SETSW A,<ADDI CS,1 >\r
- SETSW B,<SUBI CS,1 >\r
- SETSW E,<TLZ IO,IOPALL!IOSALL >\r
-IFN FORMSW,< SETSW F,<SETZM HWFMT>\r
- SETSW G,<SETOM HWFMT>>\r
- SETSW H,<OUTSTR HLPMES>\r
- SETSW L,<TLZ IO,IOMSTR >\r
- SETSW M,<TLO IO,IOPALL!IOSALL >\r
- SETSW N,<HLLOS TYPERR >\r
- SETSW O,<XCT OFFML >\r
- SETSW Q,<TLO FR,ERRQSW >\r
- SETSW S,<TLO IO,IOMSTR >\r
- SETSW T,<TLO TIO,TIOLE >\r
- SETSW W,<TLO TIO,TIORW >\r
- SETSW X,<TLOA IO,IOPALL >\r
-\r
-BYTAB: ;BYTAB CONTAINS AN INDEX TO SWTAB\r
- ;IT CONSIST OF 9 4BIT BYTES/WORD\r
- ;OR ONE BYTE FOR EACH LETTER\r
-\r
- +BYTAB0 ;A-I BYTE = 1 THROUGH 17 = INDEX\r
- +BYTAB1 ;J-R BYTE = 0 = COMMAND ERROR\r
- +BYTAB2 ;S-Z\r
-\r
-IF2,<PURGE I,J,BYTAB0,BYTAB1,BYTAB2>\r
-\fTTYIN: SOSGE CTIBUF+2 ;ENUF CHAR.?\r
- JRST TTYERR ;NO\r
- ILDB C,CTIBUF+1 ;GET CHARACTER\r
- CAIE C," " ;SKIP BLANKS\r
- CAIN C,HT ;AND TABS\r
- JRST TTYIN\r
- CAIN C,15 ;CR?\r
- SETZM CTIBUF+2 ;YES,IGNORE REST OF LINE\r
- CAIG C,"Z"+40 ;CHECK FOR LOWER CASE\r
- CAIGE C,"A"+40\r
- POPJ PP, ;NO,EXIT\r
- SUBI C,40\r
- POPJ PP, ;YES, EXIT\r
-\r
-TTYERR: SKIPN INDEV ;INPUT DEVICE SEEN?\r
- JRST ERRCM ;NO, SO MISSING "_"\r
-ERRNE: HRROI RC,[SIXBIT /?NO END STATEMENT ENCOUNTERED ON INPUT FILE@/]\r
-ERRNE0: SKPINC V ;SEE IF WE CAN INPUT A CHAR.\r
- JFCL ;BUT ONLY TO DEFEAT ^O\r
- PUSHJ PP,TYPMSG ;OUTPUT IT\r
- SKIPE LITLVL ;SEE IF IN LITERAL\r
- SKIPN LITPG ;PAGE 0 MEANS NOT IN A LITERAL REALY\r
- JRST ERRNE1 ;NO, TRY OTHERS\r
- MOVE V,[XWD [SIXBIT /IN LITERAL@/],LITPG]\r
- PUSHJ PP,PRNUM ;GO PRINT INFORMATION\r
-ERRNE1: MOVEI V,0 ;CHECK FOR OTHER PLACES\r
- SKIPE INDEF\r
- MOVE V,[XWD [SIXBIT /IN DEFINE@/],DEFPG]\r
- SKIPE INTXT\r
- MOVE V,[XWD [SIXBIT /IN TEXT@/],TXTPG]\r
- SKIPE INREP\r
- MOVE V,[XWD [SIXBIT /IN CONDITIONAL OR REPEAT@/],REPPG]\r
- SKIPE INCND\r
- MOVE V,[XWD [SIXBIT /IN CONDITIONAL@/],CNDPG]\r
- SKIPGE MACENL\r
-ERRNE2: MOVE V,[XWD [SIXBIT /IN MACRO CALL@/],CALPG]\r
- JUMPN V,ERRNE3\r
- SKIPN LITLVL ;HAD ONE PAGE NUMBER ALREADY\r
- SKIPA V,[XWD [SIXBIT /@/],PAGENO] ;BETTER THAN NOTHING\r
- JRST .+2\r
-ERRNE3: PUSHJ PP,PRNUM\r
- HRROI RC,[SIXBIT /@/] ;WILL GET A RETURN\r
- JRST ERRFIN\r
-\r
-ERRMS1: SIXBIT / ERRORS DETECTED@/\r
-ERRMS2: SIXBIT /?1 ERROR DETECTED@/\r
-ERRMS3: SIXBIT /NO ERRORS DETECTED@/\r
-EINIT: MOVE RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE@/]]\r
- JRST ERRFIN\r
-\fERRCL: HRRZ RC,LSTDIR+1 ;GET LST DEV ERROR CODE\r
- JRST .+2 ;GET ERROR MESSAGE\r
-ERRCB: HRRZ RC,BINDIR+1 ;GET BIN DEV ERROR CODE\r
- JUMPN RC,ERRTYP\r
- SOJA RC,ERRTYP ;SPECIAL CASE IF ERROR CODE 0\r
-\r
-ERRCF: HRRZ RC,INDIR+1 ;GET INPUT DEV ERROR CODE\r
- HLLZ ACEXT,INDIR+1 ;SET UP EXT\r
-\r
-ERRTYP: CAIL RC,TABLND-TABLE ;IS ERROR CODE LEGAL?\r
- SKIPA RC,TABLND ;NO, GIVE CATCH ALL MESSAGE\r
- MOVE RC,TABLE(RC) ;YES, PICK UP MESSAGE\r
-\r
-ERRFIN: SKPINC C ;SEE IN WE CAN INPUT A CHAR.\r
- JFCL ;BUT ONLY TO DEFEAT ^O\r
- PUSHJ PP,CRLF\r
- MOVEI C,"?"\r
- PUSHJ PP,TYO\r
- PUSHJ PP,TYPMS1\r
- CLOSE LST, ;GIVE USER A PARTIAL LISTING\r
- CLOSE BIN,40 ;BUT NEVER A BUM REL FILE\r
-IFN CCLSW,<AOS JOBERR ;RECORD ERROR SO EXECUTION DELETED>\r
- JRST M\r
-\r
- [SIXBIT /(0) ILLEGAL FILE NAME@/],,ACFILE\r
-TABLE: [SIXBIT /(0) FILE WAS NOT FOUND@/],,ACFILE\r
- [SIXBIT /(1) NO DIRECTORY FOR PROJECT-PROGRAMMER NUMBER@/],,ACFILE\r
- [SIXBIT /(2) PROTECTION FAILURE@/],,ACFILE\r
- [SIXBIT /(3) FILE WAS BEING MODIFIED@/],,ACFILE\r
- [SIXBIT /(4) RENAME FILE NAME ALREADY EXISTS@/],,ACFILE\r
- [SIXBIT /(5) ILLEGAL SEQUENCE OF UUOS@/],,ACFILE\r
- [SIXBIT /(6) BAD UFD OR BAD RIB@/],,ACFILE\r
- [SIXBIT /(7) NOT A SAV FILE@/],,ACFILE\r
- [SIXBIT /(10) NOT ENOUGH CORE@/],,ACFILE\r
- [SIXBIT /(11) DEVICE NOT AVAILABLE@/],,ACFILE\r
- [SIXBIT /(12) NO SUCH DEVICE@/],,ACFILE\r
- [SIXBIT /(13) NOT TWO RELOC REG. CAPABILITY@/],,ACFILE\r
- [SIXBIT /(14) NO ROOM OR QUOTA EXCEEDED@/],,ACFILE\r
- [SIXBIT /(15) WRITE LOCK ERROR@/],,ACFILE\r
- [SIXBIT /(16) NOT ENOUGH MONITOR TABLE SPACE@/],,ACFILE\r
- [SIXBIT /(17) PARTIAL ALLOCATION ONLY@/],,ACFILE\r
- [SIXBIT /(20) BLOCK NOT FREE ON ALLOCATION@/],,ACFILE\r
- [SIXBIT /(21) CAN'T SUPERSEDE (ENTER) AN EXISTING DIRECTORY@/],,ACFILE\r
- [SIXBIT /(22) CAN'T DELETE (RENAME) A NON-EMPTY DIRECTORY@/],,ACFILE\r
- [SIXBIT /(23) SFD NOT FOUND@/],,ACFILE\r
- [SIXBIT /(24) SEARCH LIST EMPTY@/],,ACFILE\r
- [SIXBIT /(25) SFD NESTED TOO DEEPLY@/],,ACFILE\r
- [SIXBIT /(26) NO-CREATE ON FOR SPECIFIED PATH@/],,ACFILE\r
-\r
-TABLND: [SIXBIT /(?) LOOKUP, ENTER, OR RENAME ERROR@/],,ACFILE\r
-\fTYPMSG: PUSHJ PP,CRLF ;MOVE TO NEXT LINE\r
-TYPMS1: HLRZ CS,RC ;GET FIRST MESSAGE\r
- CAIE CS,-1 ;SKIP IF MINUS ONE\r
- PUSHJ PP,TYPM2 ;TYPE MESSAGE\r
- HRRZ CS,RC ;GET SECOND HALF\r
- PUSHJ PP,TYPM2\r
-\r
-CRLF: MOVEI C,CR ;OUTPUT CARRIAGE RETURN\r
- PUSHJ PP,TYO\r
- MOVEI C,LF ;AND LINE FEED\r
-\r
-TYO: SOSG CTOBUF+2 ;BUFFER FULL?\r
- OUTPUT CTL,0 ;YES, DUMP IT\r
- IDPB C,CTOBUF+1 ;STORE BYTE\r
- CAIG C,FF ;FORM FEED?\r
- CAIGE C,LF ;V TAB OR LINE FEED?\r
- POPJ PP, ;NO\r
- OUTPUT CTL,0 ;YES\r
- POPJ PP, ;AND EXIT\r
-\r
-TYPM2: MOVSI C,(1B0) ;ANTICIPATE REGISTER WORD\r
- CAIN CS,ACFILE ;FILE NAME ?\r
- JRST [JUMPE ACEXT,.+1 ;YES, TEST FOR EXT\r
- LSH ACEXT,-6 ;MAKE SPACE FOR "."\r
- IOR ACEXT,[SIXBIT /. @/]\r
- JRST TYPM2A]\r
- CAIG CS,17 ;IS IT?\r
- MOVEM C,1(CS)\r
-TYPM2A: HRLI CS,(POINT 6,,) ;FORM BYTE POINTER\r
-\r
-TYPM3: ILDB C,CS ;GET A SIXBIT BYTE\r
- CAIN C,40 ;"@"?\r
- JRST TYO ;YES, TYPE SPACE AND EXIT\r
- ADDI C,40 ;NO, FORM 7-BIT ASCII\r
- PUSHJ PP,TYO ;OUTPUT CHARACTER\r
- JRST TYPM3\r
-\r
-\fXCEEDS: ADDI SX,2000 ;ADJUST SYMBOL POINTER\r
-XCEED: PUSHJ PP,SAVEXS ;SAVE THE REGISTERS\r
- HRRZ 1,JOBREL ;GET CURRENT TOP\r
- MOVEI 0,2000(1)\r
- CORE 0, ;REQUEST MORE CORE\r
- JRST XCEED2 ;ERROR, BOMB OUT\r
- HRRZ 2,JOBREL ;GET NEW TOP\r
-\r
-XCEED1: MOVE 0,0(1) ;GET ORIGIONAL\r
- MOVEM 0,0(2) ;STORE IN NEW LOCATION\r
- SUBI 2,1 ;DECREMENT UPPER\r
- CAMLE 1,SYMBOL ;HAVE WE ARRIVED?\r
- SOJA 1,XCEED1 ;NO, GET ANOTHER\r
- MOVEI 1,2000\r
- ADDM 1,SYMBOL\r
- ADDM 1,SYMTOP\r
- PUSHJ PP,SRCHI ;RE-INITIALIZE SYMBOL TABLE\r
- JRST RSTRXS ;RESTORE REGISTERS AND EXIT\r
-\r
-XCEED2: HRROI RC,[SIXBIT /INSUFFICIENT CORE@/]\r
- JRST ERRNE0\r
-PDPERR: HRROI RC,[SIXBIT .PDP OVERFLOW, TRY /P@.]\r
- JRST ERRNE0\r
-\r
-PRNUM: HLRZ CS,V ;GET MESSAGE\r
- PUSHJ PP,TYPM2\r
- MOVEI CS,[SIXBIT /ON PAGE@/]\r
- PUSHJ PP,TYPM2\r
- MOVE AC0,(V) ;GET PAGE\r
- PUSHJ PP,DP1 ;PRINT NUMBER\r
- MOVEI C,40\r
- PUSHJ PP,TYO\r
- SKIPN AC1,1(V) ;GET SEQ NUM IF THERE\r
- POPJ PP, ;NO, RETURN\r
- MOVEM AC1,OUTSQ\r
- MOVEI CS,[SIXBIT /LINE@/]\r
- PUSHJ PP,TYPM2\r
- MOVEI AC0,OUTSQ ;PRINT IT\r
- OUTPUT CTL,0 ;TO MAKE THINGS PRINT IN RIGHT ORDER\r
- DDTOUT AC0,\r
- MOVEI C,40\r
- JRST TYO ;AND RETURN\r
-\r
-DP1: IDIVI AC0,^D10\r
- HRLM AC1,(PP)\r
- JUMPE AC0,.+2\r
- PUSHJ PP,DP1\r
- HLRZ C,(PP)\r
- ADDI C,"0"\r
- JRST TYO\r
-\fRIM0: TDO FR,AC0 ;SET RIM/RIM10 FLAG\r
- TLNE FR,PNCHSW ;FORGET IT IF PUNCH RESET\r
- SETSTS BIN,IB ;SET TO IMAGE BINARY MODE\r
- POPJ PP,\r
-\r
-ROUT: EXCH CS,RIMLOC\r
- SUB PP,[XWD 1,1] ;CLEAR OUT STACK WFW\r
- TLNE FR,R1BSW\r
- JRST ROUT6\r
- TLNN FR,RIM1SW\r
- JRST ROUT1\r
- JUMPE CS,ROUT1 ;RIM10 OUTPUT\r
- SUB CS,RIMLOC\r
- JUMPE CS,ROUT1\r
- JUMPG CS,ERRAX\r
- MOVEI C,0\r
- PUSHJ PP,PTPBIN\r
- AOJL CS,.-1\r
-ROUT1: MOVSI C,(DATAI PTR,) ;RIM OUTPUT\r
- HRR C,LOCO ;GET ADDRESS\r
- TLNE FR,RIM1SW ;NO DATAI IF RIM10\r
- AOSA RIMLOC\r
- PUSHJ PP,PTPBIN ;OUTPUT\r
- MOVE C,AC0 ;CODE\r
- AOSA LOCO ;INCREMENT CURRENT LOCATION\r
-\r
-OUTBIN: TLNN FR,RIMSW!RIM1SW!R1BSW ;EXIT IF RIM MODE\r
-PTPBIN: TLNN FR,PNCHSW ;EXIT IF PUNCH NOT REQUESTED\r
- POPJ PP,\r
- SOSG BINBUF+2 ;TEST FOR BUFFER FULL\r
- PUSHJ PP,DMPBIN ;YES, DUMP IT\r
- IDPB C,BINBUF+1 ;DEPOSIT BYTE\r
- POPJ PP, ;EXIT\r
-\r
-\fDMPBIN: OUT BIN,0 ;DUMP THE BUFFER\r
- POPJ PP, ;NO ERRORS\r
-TSTBIN: GETSTS BIN,C ;GET STSTUS BITS\r
- TRNN C,ERRBIT ;ERROR?\r
- POPJ PP, ;NO, EXIT\r
- MOVE AC0,BINDEV ;YES, GET TAG\r
- JRST ERRLST ;TYPE MESSAGE AND ABORT\r
-\r
-DMPLST: OUT LST,0 ;OUTPUT BUFFER\r
- POPJ PP, ;NO ERRORS\r
-TSTLST: GETSTS LST,C ;ANY ERRORS?\r
- TRNN C,ERRBIT\r
- POPJ PP, ;NO, EXIT\r
- MOVE AC0,LSTDEV\r
-ERRLST: MOVSI RC,[SIXBIT /OUTPUT WRITE-LOCK ERROR DEVICE@/]\r
- TRNE C,IOIMPM ;IMPROPER MODE?\r
- JRST ERRFIN ;YES\r
- MOVSI RC,[SIXBIT /OUTPUT DATA ERROR DEVICE@/]\r
- TRNE C,IODERR ;DEVICE DATA ERROR?\r
- JRST ERRFIN ;YES\r
- MOVSI RC,[SIXBIT /OUTPUT CHECKSUM OR PARITY ERROR DEVICE@/]\r
- TRNE C,IODTER ;IS IT\r
- JRST ERRFIN ;YES\r
- MOVE CS,AC0 ;GET DEVICE\r
- DEVCHR CS, ;FIND OUT WHAT IT IS\r
- MOVSI RC,[SIXBIT /OUTPUT QUOTA EXCEEDED ON DEVICE@/]\r
- TLNN CS,DSKBIT ;SKIP IF DSK OUTPUT\r
- MOVSI RC,[SIXBIT /OUTPUT BLOCK TOO LARGE DEVICE@/]\r
- JRST ERRFIN\r
-\f \r
-R1BDMP: SETCM CS,R1BCNT\r
- JUMPE CS,R1BI\r
- HRLZS C,CS\r
- HRR C,R1BLOC\r
- HRRI C,-1(C)\r
- MOVEM C,R1BCHK\r
- PUSHJ PP,PTPBIN\r
- HRRI CS,R1BBLK\r
-R1BDM1: MOVE C,0(CS)\r
- ADDM C,R1BCHK\r
- PUSHJ PP,PTPBIN\r
- AOBJN CS,R1BDM1\r
- MOVE C,R1BCHK\r
- PUSHJ PP,PTPBIN\r
-R1BI: SETOM R1BCNT\r
- PUSH PP,LOCO\r
- POP PP,R1BLOC\r
- POPJ PP,\r
-\r
-ROUT6: CAME CS,RIMLOC\r
- PUSHJ PP,R1BDMP\r
- AOS C,R1BCNT\r
- MOVEM AC0,R1BBLK(C)\r
- AOS LOCO\r
- CAIN C,.R1B-1\r
- PUSHJ PP,R1BDMP\r
- AOS RIMLOC\r
- POPJ PP,\r
- \r
-\r
-\fREAD0: PUSHJ PP,EOT ;END OF TAPE\r
-\r
-READ: SOSGE IBUF+2 ;BUFFER EMPTY?\r
- JRST READ3 ;YES\r
-READ1: ILDB C,IBUF+1 ;PLACE CHARACTER IN C\r
- MOVE CS,@IBUF+1 ;CHECK FOR SEQUENCE NUMBER\r
- TRNN CS,1\r
- JRST READ1A\r
- CAIN CS,1 ;CHECK FOR SPECIAL\r
- MOVE CS,[<ASCII/ />+1]\r
- MOVEM CS,SEQNO\r
- MOVEM CS,SEQNO2\r
- MOVNI CS,4\r
- ADDM CS,IBUF+2 ;ADJUST WORD COUNT\r
-REPEAT 4,< IBP IBUF+1> ;SKIP SEQ NO\r
- PUSHJ PP,READ ;AND THE TAB\r
- JRST READ ;GET NEXT CHARACTER\r
-\r
-READ1A: JUMPE C,READ ;IGNORE NULL\r
- CAIN C,32 ;IF IT'S A "^Z"\r
- MOVEI C,LF ;TREAT IT AS A "LF"\r
- CAIE C,37 ;CONTROL _\r
- POPJ PP,\r
- MOVEI C,"^" ;MAKE CONTROL-SHIFT _ VISIBLE\r
- PUSHJ PP,RSW2\r
- MOVEI C,"_"\r
- PUSHJ PP,RSW2\r
-READ2: PUSHJ PP,READ ;YES, TEST FOR LINE FEED\r
- PUSHJ PP,RSW2 ;LIST IN ANY EVENT\r
- CAIG C,FF ;IS IT ONE OF\r
- CAIGE C,LF ;LF, VT, OR FF?\r
- JRST READ2 ;NO\r
- PUSHJ PP,OUTIM1 ;YES, DUMP THE LINE\r
- JRST READ ;RETURN NEXT CHARACTER\r
-\r
-READ3: IN CHAR,0 ;GET NEXT BUFFER\r
- JRST READ ;NO ERRORS\r
- GETSTS CHAR,C\r
- TRNN C,ERRBIT!2000 ;ERRORS?\r
- JRST READ0 ;EOF\r
- MOVE AC0,INDEV\r
- MOVSI RC,[SIXBIT/ INPUT PHYSICAL END OF TAPE DEVICE@/]\r
- TRNE C,2000\r
- JRST ERRFIN ;E-O-T\r
- MOVSI RC,[SIXBIT /MONITOR DETECTED SOFTWARE INPUT ERROR DEVICE@/]\r
- TRNE C,IOIMPM ;IMPROPER MODE?\r
- JRST ERRFIN ;YES\r
- MOVSI RC,[SIXBIT /INPUT DATA ERROR DEVICE@/]\r
- TRNE C,IODERR ;DEVICE DATA ERROR?\r
- JRST ERRFIN ;YES\r
- MOVSI RC,[SIXBIT /INPUT CHECKSUM OR PARITY ERROR DEVICE@/]\r
- TRNN C,IODTER\r
- MOVSI RC,[SIXBIT /INPUT BLOCK TOO LARGE DEVICE@/]\r
- JRST ERRFIN\r
-\r
-\fOUTAB2: PUSHJ PP,OUTTAB ;PRINT TWO TABS\r
-OUTTAB: MOVEI C,HT\r
-PRINT: CAIE C,CR ;IS THIS A CR?\r
- CAIN C,LF ;OR LF?\r
- JRST OUTCR ;YES, GO PROCESS\r
- CAIN C,FF ;FORM FEED?\r
- JRST OUTFF ;YES, FORCE NEW PAGE\r
- JRST OUTL\r
-\r
-OUTCR: TRNN ER,ERRORS!LPTSW!TTYSW\r
- POPJ PP,\r
- MOVEI C,CR ;CARRIAGE RETURN, LINE FEED\r
- PUSHJ PP,OUTL\r
- SOSGE LPP ;END OF PAGE?\r
- TLO IO,IOPAGE ;YES, SET FLAG\r
- TRCA C,7 ;FORM LINE FEED AND SKIP\r
-\r
-OUTL: TLZN IO,IOPAGE ;NEW PAGE REQUESTED?\r
- JRST OUTC ;NO\r
- JUMP1 OUTC ;YES, BYPASS IF PASS ONE\r
- PUSH PP,C ;SAVE C AND CS\r
- PUSH PP,CS\r
- PUSH PP,ER\r
- TLNN IO,IOMSTR!IOPROG\r
- HRR ER,OUTSW\r
- TLNE IO,IOCREF ;IF DOING CREF OUTPUT NOW\r
- TLNE FR,CREFSW ;AND CREFFING (JUST IN CASE)\r
- JRST .+2\r
- PUSHJ PP,CLSC3 ;CLOSE IT OUT\r
- HLLM IO,(PP) ;SAVE THIS NEW STATE OF IO\r
- MOVEI C,.LPP\r
- MOVEM C,LPP ;SET NEW COUNTER\r
- MOVEI C,CR\r
- PUSHJ PP,OUTC\r
- MOVEI C,FF\r
- PUSHJ PP,OUTC ;OUTPUT FORM FEED\r
- MOVEI CS,TBUF\r
- PUSHJ PP,OUTAS0 ;OUTPUT TITLE\r
- MOVEI CS,VBUF\r
- PUSHJ PP,OUTAS0 ;OUTPUT VERSION\r
- MOVEI CS,DBUF\r
- PUSHJ PP,OUTAS0 ; AND DATE\r
- MOVE C,PAGENO\r
- PUSHJ PP,DNC ;OUTPUT PAGE NUMBER\r
- AOSG PAGEN. ;FIRST PAGE OF THIS NUMBER?\r
- JRST OUTL1 ;YES\r
- MOVEI C,"-" ;NO, PUT OUT MODIFIER\r
- PUSHJ PP,OUTC\r
- MOVE C,PAGEN.\r
- PUSHJ PP,DNC\r
-OUTL1: PUSHJ PP,OUTCR\r
- MOVEI CS,DEVBUF\r
- PUSHJ PP,OUTAS0\r
- HRRZ CS,SUBTTX ;SWITCH FOR SUB-TITLE\r
- SKIPE 0(CS) ;IS THERE A SUB-TITLE?\r
- PUSHJ PP,OUTTAB ;YES, OUTPUT A TAB\r
- PUSHJ PP,SOUT20 ;OUTPUT ASCII WITH CARRIAGE RETURN\r
- PUSHJ PP,OUTCR\r
- POP PP,ER\r
- POP PP,CS ;RESTORE REGISTERS\r
- POP PP,C\r
-\r
-OUTC: TRNE ER,ERRORS!TTYSW\r
- PUSHJ PP,TYO\r
- TRNN ER,LPTSW\r
- POPJ PP,\r
-OUTLST: SOSG LSTBUF+2 ;BUFFER FULL?\r
- PUSHJ PP,DMPLST ;YES, DUMP IT\r
-COMMENT $ REG DOESN'T LIKE THIS FEATURE ANY MORE 9-5-72\r
-IFN STANSW,< CAIN C,"@"\r
- MOVEI C,140\r
- CAIN C,"_"\r
- MOVEI C,30\r
- CAIN C,"^"\r
- MOVEI C,32\r
- CAIE C,"\"\r
- JRST OUTLSS\r
- MOVEI C,177\r
- IDPB C,LSTBUF+1\r
- JRST OUTLST\r
-OUTLSS: >\r
-$\r
- IDPB C,LSTBUF+1 ;STORE BYTE\r
- POPJ PP, ;EXIT\r
-\r
-\fPAGE0: PUSHJ PP,STOUTS ;PAGE PSEUDO-OP\r
-OUTFF1: TLNE IO,IOCREF ;CURRENTLY DOING CREF?\r
- TLNE IO,IOPROG ;AND NOT XLISTED?\r
- JRST OUTFF ;NO\r
- HRR ER,OUTSW\r
- PUSHJ PP,CLSCRF\r
- PUSHJ PP,OUTCR\r
- HRRI ER,0\r
-OUTFF: TLO IO,IOPAGE\r
-OUTFF2: SETOM PAGEN.\r
- AOS PAGENO\r
- POPJ PP,\r
-\r
-TIMOUT: IDIVI 2,^D60*^D1000\r
-TIMOU1: IDIVI 2,^D60\r
- PUSH PP,3 ;SAVE MINUTES\r
- PUSHJ PP,OTOD ;STORE HOURS\r
- MOVEI 3,":" ;SEPARATE BY COLON\r
- IDPB 3,CS\r
- POP PP,2 ;STORE MINUTES\r
-OTOD: IDIVI 2,^D10\r
- ADDI 2,60 ;FORM ASCII\r
- IDPB 2,CS\r
- ADDI 3,60\r
- IDPB 3,CS\r
- POPJ PP,\r
-\r
-DATOUT: IDIVI 1,^D31 ;GET DAY\r
- ADDI 2,1\r
- CAIG 2,^D9 ;TWO DIGITS?\r
- ADDI 2,7760*^D10 ;NO, PUT IN SPACE\r
- PUSHJ PP,OTOD ;STORE DAY\r
- IDIVI 1,^D12 ;GET MONTH\r
- MOVE 2,DTAB(2) ;GET MNEMONIC\r
- IDPB 2,CS ;DEPOSIT RIGHT MOST 7 BITS\r
- LSH 2,-7 ;SHIFT NEXT IN\r
- JUMPN 2,.-2 ;DEPOSIT IFIT EXISTS\r
- MOVEI 2,^D64(1) ;GET YEAR\r
- JRST OTOD ;STORE IT\r
-\r
-DTAB: "-NAJ-"\r
- "-BEF-"\r
- "-RAM-"\r
- "-RPA-"\r
- "-YAM-"\r
- "-NUJ-"\r
- "-LUJ-"\r
- "-GUA-"\r
- "-PES-"\r
- "-TCO-"\r
- "-VON-"\r
- "-CED-"\r
-\fSUBTTL MACHINE INSTRUCTION SEARCH ROUTINES\r
-IFE OPHSH,<\r
-OPTSCH: MOVEI RC,0\r
- MOVEI ARG,1B^L<OP1END-OP1TOP> ;SET UP INDEX\r
- MOVEI V,1B^L<OP1END-OP1TOP>/2 ;SET UP INCREMENT\r
-\r
-OPT1A: CAMN AC0,OP1TOP(ARG) ;ARE WE POINTING AT SYMBOL?\r
- JRST OPT1D ;YES, GET THE CODE\r
- JUMPE V,POPOUT ;TEST FOR END\r
- CAML AC0,OP1TOP(ARG) ;NO, SHOULD WE MOVE DOWN?\r
- TDOA ARG,V ;NO, INCREMENT\r
-OPT1B: SUB ARG,V ;YES, DECREMENT\r
- ASH V,-1 ;HALVE INCREMENT\r
- CAIG ARG,OP1END-OP1TOP ;ARE WE OUT OF BOUNDS?\r
- JRST OPT1A ;NO, TRY AGAIN\r
- JRST OPT1B ;YES, BRING IT DOWN A PEG\r
->\r
-\r
-IFN OPHSH,<\r
-OPTSCH: MOVE ARG,AC0 ;GET SIXBIT NAME\r
- TLZ ARG,400000 ;CLEAR SIGN BIT\r
- IDIVI ARG,PRIME ;REM. GOES IN V\r
- CAMN AC0,OP1TOP(V) ;ARE WE POINTING AT SYMBOL?\r
- JRST OPT1D ;YES\r
- SKIPN OP1TOP(V) ;TEST FOR END\r
- POPJ PP, ;SYMBOL NOT FOUND\r
- HLRZ RC,ARG ;SAVE LHS OF QUOTIENT\r
- SKIPA ARG,RC ;GET IT BACK\r
-OPT1A: ADDI ARG,(RC) ;INCREMENT ARG\r
- ADDI V,(ARG) ;QUADRATIC INCREASE TO V\r
- CAIL V,PRIME ;V IS MODULO PRIME\r
- JRST [SUBI V,PRIME\r
- JRST .-1]\r
- CAMN AC0,OP1TOP(V) ;IS THIS IT?\r
- JRST OPT1D ;YES\r
- SKIPE OP1TOP(V) ;END?\r
- JRST OPT1A ;TRY AGAIN\r
- POPJ PP, ;FAILED\r
->\r
-OPT1D:\r
-IFN OPHSH,< SETZ RC, ;CLEAR RELOCATION\r
- MOVE ARG,V ;GET INDEX IN RIGHT ACC.>\r
- IDIVI ARG,4 ;ARG HAS INDEX USED IN OPTTAB\r
- LDB V,OPTTAB(V) ;V HAS INDEX TO OPTTAB\r
- CAIL V,700 ;PSEUDO-OP OR IO INSTRUCTION?\r
- JRST OPT1G ;YES\r
- ROT V,-^D9 ;LEFT JUSTIFY\r
- HRRI V,OP ;POINT TO BASIC FORMAT\r
-OPT1F: AOS 0(PP) ;SET FOR SKIP EXIT\r
- MOVEI SDEL,%OP ;SET OP-CODE CROSS-REF FLAG\r
- JRST CREF ;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE\r
-\r
-OPT1G: JUMPG AC0,.+3 ;IF ".","$",OR "%" USE TABLE 1\r
- TLNN AC0,200000 ;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE\r
- SKIPA V,OP2TAB-700(V) ;2ND TABLE, FIRST LETTER IS "A" TO "O"\r
- MOVE V,OP1TAB-700(V) ;1ST TABLE, ..."P" TO "Z"\r
- JRST OPT1F ;EXIT\r
-\r
-OPTTAB:\r
-IFE OPHSH,< POINT 9,OP1COD-1(ARG),35>\r
- POINT 9,OP1COD (ARG), 8\r
- POINT 9,OP1COD (ARG),17\r
- POINT 9,OP1COD (ARG),26\r
-IFN OPHSH,< POINT 9,OP1COD (ARG),35>\r
-\r
-\fIFDEF .XCREF,< .XCREF ;DON'T CREF THIS MESS>\r
-IFE OPHSH,<\r
- RELOC .-1\r
-OP1TOP:\r
- RELOC\r
-\r
- IF1,<N1=0\r
- DEFINE X <N1=N1+1 ;>>\r
-\r
- IF2, <\r
- N2=^D36\r
- CC=0\r
- RELOC OP1COD\r
- RELOC\r
-DEFINE X (SYMBOL,CODE) \r
-<SIXBIT /SYMBOL/\r
-CC=CC+CODE_<N2=N2-9>\r
-IFE N2, <OUTLIT>>\r
-\r
-DEFINE OUTLIT <\r
- RELOC\r
- +CC\r
- RELOC\r
-N2=^D36+<CC=0>>>\r
- SYN X,XX ;JUST THE SAME MACRO>\r
-\f\r
-IFN OPHSH,<\r
-DEFINE XX (SB,CD)<> ;A NUL MACRO\r
-OP1TOP: IF1,< BLOCK PRIME>\r
-IF1,<DEFINE X (SB,CD)<>>\r
-IF2,<\r
-DEFINE OPSTOR (RM)<.$'RM=.$'RM+<OPCODE_<9*<3-R&3>>>>\r
-\r
-DEFINE X (SB,CD)<\r
-SXB=<SIXBIT /SB/>\r
-Q=SXB&-1_-1/PRIME\r
-R=SXB&-1_-1-Q*PRIME\r
-H=Q_-22&777\r
-TRY=1\r
-OPCODE=CD\r
-ITEM Q,\R\r
-IFL PRIME-TRY,<PRINTX HASH FAILURE>>\r
-\r
-DEFINE ITEM (QT,RM)<\r
-IFN .%'RM,<R=R+H\r
-IFL PRIME-R,<R=R-R/PRIME*PRIME>\r
-H=H+Q_-22&777\r
-IFGE PRIME-<TRY=TRY+1>,<ITEM Q,\R>>\r
-IFE .%'RM,<.%'RM=SXB\r
-OPSTOR \<R/4>>>>\r
-IF1,<\r
-DEFINE GETSYM (N)<.%'N=0>\r
-\r
-N=0\r
- XLIST\r
-REPEAT PRIME,<GETSYM \N\r
-N=N+1>\r
-DEFINE GETSYM (N)<.$'N=0>\r
-N=0\r
-REPEAT <PRIME/4+1>,<GETSYM \N\r
-N=N+1>\r
->\r
- LIST>\r
-\r
-;MACRO TO HANDLE KI10 OP-CODES\r
-IFE KI10,<\r
-DEFINE XK (SB,CD) <> ;NUL MACRO>\r
-IFN KI10,<SYN X,XK ;USUAL X MACRO>\r
-\fIFN OPHSH,< ;PUT THE MOST USED OP CODES FIRST\r
-X JRST , 254\r
-X PUSHJ , 260\r
-X POPJ , 263\r
-X PUSH , 261\r
-X POP , 262\r
-X AOS , 350\r
-X ASCIZ , 701\r
-X CALLI , 047\r
-X EXTERN, 724\r
-X INTERN, 744\r
-X JFCL , 255\r
-X JSP , 265\r
-X MOVE , 200\r
-X MOVEI , 201\r
-X MOVEM , 202\r
-X SETZM , 402\r
-X SIXBIT, 717\r
-X SOS , 370\r
-X TLNE , 603\r
-X TLNN , 607\r
-X TLO , 661\r
-X TLZ , 621\r
-X TLZA , 625\r
-X TLZE , 623\r
-X TLZN , 627\r
-X TRNE , 602\r
-X TRNN , 606\r
-X TRZ , 620\r
->\r
-\fX ADD , 270\r
-X ADDB , 273\r
-X ADDI , 271\r
-X ADDM , 272\r
-\r
-X AND , 404\r
-X ANDB , 407\r
-X ANDCA , 410\r
-X ANDCAB, 413\r
-X ANDCAI, 411\r
-X ANDCAM, 412\r
-X ANDCB , 440\r
-X ANDCBB, 443\r
-X ANDCBI, 441\r
-X ANDCBM, 442\r
-X ANDCM , 420\r
-X ANDCMB, 423\r
-X ANDCMI, 421\r
-X ANDCMM, 422\r
-X ANDI , 405\r
-X ANDM , 406\r
-\r
-X AOBJN , 253\r
-X AOBJP , 252\r
-\r
-X AOJ , 340\r
-X AOJA , 344\r
-X AOJE , 342\r
-X AOJG , 347\r
-X AOJGE , 345\r
-X AOJL , 341\r
-X AOJLE , 343\r
-X AOJN , 346\r
-\r
-XX AOS , 350\r
-X AOSA , 354\r
-X AOSE , 352\r
-X AOSG , 357\r
-X AOSGE , 355\r
-X AOSL , 351\r
-X AOSLE , 353\r
-X AOSN , 356\r
-X ARG , 320\r
-IFN WFWSW,<X ARRAY , 772>\r
-IFN IIISW,<X ASCID , 771>\r
-X ASCII , 700\r
-XX ASCIZ , 701\r
-\r
-X ASH , 240\r
-X ASHC , 244\r
-\r
-X ASUPPR, 705\r
-X BLKI , 702\r
-X BLKO , 703\r
-X BLOCK , 704\r
-\r
-X BLT , 251\r
-\r
-X BYTE , 707\r
-\r
-XX CAI , 300\r
-X CAIA , 304\r
-X CAIE , 302\r
-X CAIG , 307\r
-X CAIGE , 305\r
-X CAIL , 301\r
-X CAILE , 303\r
-X CAIN , 306\r
-\r
-X CALL , 040\r
-XX CALLI , 047\r
-\r
-XX CAM , 310\r
-X CAMA , 314\r
-X CAME , 312\r
-X CAMG , 317\r
-X CAMGE , 315\r
-X CAML , 311\r
-X CAMLE , 313\r
-X CAMN , 316\r
-\r
-XX CLEAR , 400\r
-XX CLEARB, 403\r
-XX CLEARI, 401\r
-XX CLEARM, 402\r
-\r
-X CLOSE , 070\r
-X COMMEN, 770\r
-\r
-\r
-X CONI , 710\r
-X CONO , 711\r
-IFN STANSW,<X CONS,257>\r
-X CONSO , 712\r
-X CONSZ , 713\r
-\r
-XX DATA. , 020\r
-\r
-X DATAI , 714\r
-X DATAO , 715\r
-X DEC , 716\r
-X DEFINE, 717\r
-X DEPHAS, 720\r
-\r
-XK DFAD , 110\r
-XK DFDV , 113\r
-XK DFMP , 112\r
-X DFN , 131\r
-XK DFSB , 111\r
-\r
-X DIV , 234\r
-X DIVB , 237\r
-X DIVI , 235\r
-X DIVM , 236\r
-\r
-XK DMOVE , 120\r
-XK DMOVEM, 124\r
-XK DMOVN , 121\r
-XK DMOVNM, 125\r
-\r
-X DPB , 137\r
-\r
-X END , 721\r
-\r
-X ENTER , 077\r
-\r
-X ENTRY , 722\r
-\r
-X EQV , 444\r
-X EQVB , 447\r
-X EQVI , 445\r
-X EQVM , 446\r
-\r
-X EXCH , 250\r
-\r
-X EXP , 723\r
-XX EXTERN, 724\r
-\r
-X FAD , 140\r
-X FADB , 143\r
-X FADL , 141\r
-X FADM , 142\r
-\r
-X FADR , 144\r
-X FADRB , 147\r
-X FADRI , 145\r
-X FADRM , 146\r
-\r
-X FDV , 170\r
-X FDVB , 173\r
-X FDVL , 171\r
-X FDVM , 172\r
-\r
-X FDVR , 174\r
-X FDVRB , 177\r
-X FDVRI , 175\r
-X FDVRM , 176\r
-\r
-XX FIN. , 021\r
-\r
-IFN STANSW,<X FIX , 247>\r
-IFE STANSW,<XK FIX , 122>\r
-XK FIXR , 126\r
-XK FLTR , 127\r
-\r
-X FMP , 160\r
-X FMPB , 163\r
-X FMPL , 161\r
-X FMPM , 162\r
-\r
-\fX FMPR , 164\r
-X FMPRB , 167\r
-X FMPRI , 165\r
-X FMPRM , 166\r
-\r
-X FSB , 150\r
-X FSBB , 153\r
-X FSBL , 151\r
-X FSBM , 152\r
-\r
-X FSBR , 154\r
-X FSBRB , 157\r
-X FSBRI , 155\r
-X FSBRM , 156\r
-\r
-X FSC , 132\r
-\r
-X GETSTS, 062\r
-\r
-\fX HALT , 725\r
-X HISEG , 706\r
-\r
-X HLL , 500\r
-X HLLE , 530\r
-X HLLEI , 531\r
-X HLLEM , 532\r
-X HLLES , 533\r
-X HLLI , 501\r
-X HLLM , 502\r
-X HLLO , 520\r
-X HLLOI , 521\r
-X HLLOM , 522\r
-X HLLOS , 523\r
-X HLLS , 503\r
-X HLLZ , 510\r
-X HLLZI , 511\r
-X HLLZM , 512\r
-X HLLZS , 513\r
-\r
-X HLR , 544\r
-X HLRE , 574\r
-X HLREI , 575\r
-X HLREM , 576\r
-X HLRES , 577\r
-X HLRI , 545\r
-X HLRM , 546\r
-X HLRO , 564\r
-X HLROI , 565\r
-X HLROM , 566\r
-X HLROS , 567\r
-X HLRS , 547\r
-X HLRZ , 554\r
-X HLRZI , 555\r
-X HLRZM , 556\r
-X HLRZS , 557\r
-\r
-\fX HRL , 504\r
-X HRLE , 534\r
-X HRLEI , 535\r
-X HRLEM , 536\r
-X HRLES , 537\r
-X HRLI , 505\r
-X HRLM , 506\r
-X HRLO , 524\r
-X HRLOI , 525\r
-X HRLOM , 526\r
-X HRLOS , 527\r
-X HRLS , 507\r
-X HRLZ , 514\r
-X HRLZI , 515\r
-X HRLZM , 516\r
-X HRLZS , 517\r
-\r
-X HRR , 540\r
-X HRRE , 570\r
-X HRREI , 571\r
-X HRREM , 572\r
-X HRRES , 573\r
-X HRRI , 541\r
-X HRRM , 542\r
-X HRRO , 560\r
-X HRROI , 561\r
-X HRROM , 562\r
-X HRROS , 563\r
-X HRRS , 543\r
-X HRRZ , 550\r
-X HRRZI , 551\r
-X HRRZM , 552\r
-X HRRZS , 553\r
-\r
-X IBP , 133\r
-\r
-X IDIV , 230\r
-X IDIVB , 233\r
-X IDIVI , 231\r
-X IDIVM , 232\r
-\r
-X IDPB , 136\r
-\r
-X IF1 , 726\r
-X IF2 , 727\r
-X IFB , 730\r
-X IFDEF , 731\r
-X IFDIF , 732\r
-X IFE , 733\r
-X IFG , 734\r
-X IFGE , 735\r
-X IFIDN , 736\r
-X IFL , 737\r
-X IFLE , 740\r
-X IFN , 741\r
-X IFNB , 742\r
-X IFNDEF, 743\r
-\r
-X ILDB , 134\r
-\r
-X IMUL , 220\r
-X IMULB , 223\r
-X IMULI , 221\r
-X IMULM , 222\r
-\r
-X IN , 056\r
-XX IN. , 016\r
-X INBUF , 064\r
-XX INF. , 026\r
-X INIT , 041\r
-X INPUT , 066\r
-IFN WFWSW,<X INTEGE, 773>\r
-\r
-XX INTERN, 744\r
-\r
-X IOR , 434\r
-X IORB , 437\r
-X IORI , 435\r
-X IORM , 436\r
-\r
-\r
-X IOWD , 745\r
-X IRP , 746\r
-X IRPC , 747\r
-X JCRY , 750\r
-X JCRY0 , 751\r
-X JCRY1 , 752\r
-X JEN , 753\r
-\r
-XX JFCL , 255\r
-\r
-X JFFO , 243\r
-X JFOV , 765\r
-X JOV , 754\r
-\r
-X JRA , 267\r
-XX JRST , 254\r
-\r
-X JRSTF , 755\r
-\r
-X JSA , 266\r
-XX JSP , 265\r
-X JSR , 264\r
-\r
-XX JUMP , 320\r
-XX JUMPA , 324\r
-X JUMPE , 322\r
-X JUMPG , 327\r
-X JUMPGE, 325\r
-X JUMPL , 321\r
-X JUMPLE, 323\r
-X JUMPN , 326\r
-\r
-X LALL , 756\r
-\r
-X LDB , 135\r
-\r
-X LIST , 757\r
-X LIT , 760\r
-X LOC , 761\r
-\r
-X LOOKUP, 076\r
-\r
-X LSH , 242\r
-X LSHC , 246\r
-IFN WFWSW,<X LVAR , 774>\r
-XK MAP , 257\r
-X MLOFF , 767\r
-X MLON , 766\r
-XX MOVE , 200\r
-XX MOVEI , 201\r
-XX MOVEM , 202\r
-X MOVES , 203\r
-X MOVM , 214\r
-X MOVMI , 215\r
-X MOVMM , 216\r
-X MOVMS , 217\r
-X MOVN , 210\r
-X MOVNI , 211\r
-X MOVNM , 212\r
-X MOVNS , 213\r
-X MOVS , 204\r
-X MOVSI , 205\r
-X MOVSM , 206\r
-X MOVSS , 207\r
-\r
-\r
-X MTAPE , 072\r
-XX MTOP. , 024\r
-\r
-X MUL , 224\r
-X MULB , 227\r
-X MULI , 225\r
-X MULM , 226\r
-XX NLI. , 031\r
-XX NLO. , 032\r
-\r
-X NOSYM , 762\r
-\r
-\fX OCT , 763\r
-X OPDEF , 764\r
-\r
-X OPEN , 050\r
-\r
-X OR , 434\r
-X ORB , 437\r
-X ORCA , 454\r
-X ORCAB , 457\r
-X ORCAI , 455\r
-X ORCAM , 456\r
-X ORCB , 470\r
-X ORCBB , 473\r
-\r
-X ORCBI , 471\r
-X ORCBM , 472\r
-X ORCM , 464\r
-X ORCMB , 467\r
-X ORCMI , 465\r
-X ORCMM , 466\r
-X ORI , 435\r
-X ORM , 436\r
-\r
-X OUT , 057\r
-XX OUT. , 017\r
-X OUTBUF, 065\r
-XX OUTF. , 027\r
-X OUTPUT, 067\r
-\r
-\fX PAGE , 700\r
-X PASS2 , 701\r
-X PHASE , 702\r
-X POINT , 703\r
-\r
-XX POP , 262\r
-XX POPJ , 263\r
-\r
-X PRGEND, 714\r
-X PRINTX, 704\r
-X PURGE , 705\r
-\r
-XX PUSH , 261\r
-XX PUSHJ , 260\r
-\r
-X RADIX , 706\r
-X RADIX5, 707\r
-\r
-X RELEAS, 071\r
-\r
-X RELOC , 710\r
-X REMARK, 711\r
-\r
-X RENAME, 055\r
-\r
-X REPEAT, 712\r
-\r
-XX RESET., 015\r
-X RIM , 715\r
-X RIM10 , 735\r
-X RIM10B, 736\r
-\r
-X ROT , 241\r
-X ROTC , 245\r
-\r
-X RSW , 716\r
-XX RTB. , 022\r
-X SALL , 720\r
-X SEARCH, 721\r
-\r
-X SETA , 424\r
-X SETAB , 427\r
-X SETAI , 425\r
-X SETAM , 426\r
-X SETCA , 450\r
-X SETCAB, 453\r
-X SETCAI, 451\r
-X SETCAM, 452\r
-X SETCM , 460\r
-X SETCMB, 463\r
-X SETCMI, 461\r
-X SETCMM, 462\r
-X SETM , 414\r
-X SETMB , 417\r
-X SETMI , 415\r
-X SETMM , 416\r
-X SETO , 474\r
-X SETOB , 477\r
-X SETOI , 475\r
-X SETOM , 476\r
-X SETSTS, 060\r
-X SETZ , 400\r
-X SETZB , 403\r
-X SETZI , 401\r
-XX SETZM , 402\r
-\r
-XX SIXBIT, 717\r
-\r
-XX SKIP , 330\r
-X SKIPA , 334\r
-X SKIPE , 332\r
-X SKIPG , 337\r
-X SKIPGE, 335\r
-X SKIPL , 331\r
-X SKIPLE, 333\r
-X SKIPN , 336\r
-\r
-XX SLIST., 025\r
-\r
-X SOJ , 360\r
-X SOJA , 364\r
-X SOJE , 362\r
-X SOJG , 367\r
-X SOJGE , 365\r
-X SOJL , 361\r
-X SOJLE , 363\r
-X SOJN , 366\r
-\r
-XX SOS , 370\r
-X SOSA , 374\r
-X SOSE , 372\r
-X SOSG , 377\r
-X SOSGE , 375\r
-X SOSL , 371\r
-X SOSLE , 373\r
-X SOSN , 376\r
-\r
-IFN STANSW,<X SPCWAR,43>\r
-X SQUOZE, 707\r
-\r
-X STATO , 061\r
-X STATUS, 062\r
-X STATZ , 063\r
-\r
-X STOPI , 722\r
-\r
-X SUB , 274\r
-X SUBB , 277\r
-X SUBI , 275\r
-X SUBM , 276\r
-\r
-IF2,<IFE OPHSH,<SUBTL:>>\r
-X SUBTTL, 723\r
-X SUPPRE, 713\r
-X SYN , 724\r
-X TAPE , 725\r
-\r
-\fX TDC , 650\r
-X TDCA , 654\r
-X TDCE , 652\r
-X TDCN , 656\r
-X TDN , 610\r
-X TDNA , 614\r
-X TDNE , 612\r
-X TDNN , 616\r
-X TDO , 670\r
-X TDOA , 674\r
-X TDOE , 672\r
-X TDON , 676\r
-X TDZ , 630\r
-X TDZA , 634\r
-X TDZE , 632\r
-X TDZN , 636\r
-\r
-X TITLE , 726\r
-\r
-X TLC , 641\r
-X TLCA , 645\r
-X TLCE , 643\r
-X TLCN , 647\r
-X TLN , 601\r
-X TLNA , 605\r
-XX TLNE , 603\r
-XX TLNN , 607\r
-XX TLO , 661\r
-X TLOA , 665\r
-X TLOE , 663\r
-X TLON , 667\r
-XX TLZ , 621\r
-XX TLZA , 625\r
-XX TLZE , 623\r
-XX TLZN , 627\r
-\r
-\fX TRC , 640\r
-X TRCA , 644\r
-X TRCE , 642\r
-X TRCN , 646\r
-X TRN , 600\r
-X TRNA , 604\r
-XX TRNE , 602\r
-XX TRNN , 606\r
-X TRO , 660\r
-X TROA , 664\r
-X TROE , 662\r
-X TRON , 666\r
-XX TRZ , 620\r
-X TRZA , 624\r
-X TRZE , 622\r
-X TRZN , 626\r
-\r
-X TSC , 651\r
-X TSCA , 655\r
-X TSCE , 653\r
-X TSCN , 657\r
-X TSN , 611\r
-X TSNA , 615\r
-X TSNE , 613\r
-\r
-X TSNN , 617\r
-X TSO , 671\r
-X TSOA , 675\r
-X TSOE , 673\r
-X TSON , 677\r
-X TSZ , 631\r
-X TSZA , 635\r
-X TSZE , 633\r
-X TSZN , 637\r
-X TTCALL, 051\r
-X TWOSEG, 731\r
-X UFA , 130\r
-X UGETF , 073\r
-X UJEN , 100\r
-X UNIVER, 737\r
-X USETI , 074\r
-X USETO , 075\r
-\r
-X VAR , 727\r
-\r
-XX WTB. , 023\r
-\r
-X XALL , 732\r
-\r
-X XCT , 256\r
-\r
-X XLIST , 733\r
-\r
-X XOR , 430\r
-X XORB , 433\r
-X XORI , 431\r
-X XORM , 432\r
-\r
-X XPUNGE, 730\r
-X XWD , 734\r
-\r
-X Z , 000\r
-\r
-X .CREF , 740\r
-X .HWFRM, 742\r
-X .MFRMT, 743\r
-X .XCREF, 741\r
-\r
-\r
-\fIFN OPHSH,< ;NO-OPS, OLD MNEMONICS,F4 UUOS\r
-X CAI , 300\r
-X CAM , 310\r
-X CLEAR , 400\r
-X CLEARB, 403\r
-X CLEARI, 401\r
-X CLEARM, 402\r
-X JUMP , 320\r
-X JUMPA , 324\r
-X SKIP , 330\r
-X RESET., 015\r
-X IN. , 016\r
-X OUT. , 017\r
-X DATA. , 020\r
-X FIN. , 021\r
-X RTB. , 022\r
-X WTB. , 023\r
-X MTOP. , 024\r
-X SLIST., 025\r
-X INF. , 026\r
-X OUTF. , 027\r
-X NLI. , 031\r
-X NLO. , 032\r
->\r
-\fIFE OPHSH,<\r
-IF1, < BLOCK N1>\r
-OP1END: -1B36\r
-OP1COD: BLOCK N1/4\r
- CC>\r
-IFN OPHSH,<\r
-IF2,<\r
-DEFINE SETVAL (N)<EXP .%'N\r
-PURGE .%'N>\r
-N=0\r
-XLIST\r
-REPEAT PRIME,<SETVAL \N\r
-N=N+1>\r
-LIST\r
->\r
-OP1COD: IF1,< BLOCK <PRIME/4+1>>\r
-IF2,<\r
-DEFINE SETVAL (N)<EXP .$'N\r
-PURGE .$'N>\r
-N=0\r
-XLIST\r
-REPEAT <PRIME/4+1>,<SETVAL \N\r
-N=N+1>\r
->\r
-LIST>\r
-\r
-IFDEF .CREF,< .CREF ;START CREFFING AGAIN>\r
-\fSUBTTL PERMANENT SYMBOLS\r
-SYMNUM: EXP LENGTH/2 ;NUMBER OF PERMANENT SYMBOLS\r
-DEFINE P (A,B)<\r
- SIXBIT /A/\r
- XWD SYMF!NOOUTF,B>\r
-\r
-P @, 0(SUPRBT)\r
-P ??????, 0(SUPRBT)\r
-\r
-LENGTH= .-SYMNUM-1 ;LENGTH OF INITIAL SYMBOLS\r
-\r
-PRMTBL: ;PERMANENT SYMBOLS\r
-P ADC, 24\r
-P APR, 0\r
-P CCI, 14\r
-P CDP, 110\r
-P CDR, 114\r
-P CPA, 0\r
-P CR, 150\r
-P DC, 200\r
-P DCSA, 300\r
-P DCSB, 304\r
-P DF, 270\r
-P DIS, 130\r
-P DLS, 240\r
-P DPC, 250\r
-P DSK, 170\r
-P DTC, 320\r
-P DTS, 324\r
-P LPT, 124\r
-P MDF, 260\r
-P MTC, 220\r
-P MTM, 230\r
-P MTS, 224\r
-P PAG, 10\r
-P PI, 4\r
-P PLT, 140\r
-P PTP, 100\r
-P PTR, 104\r
-\r
-P TMC, 340\r
-P TMS, 344\r
-P TTY, 120\r
-P UTC, 210\r
-P UTS, 214\r
-IFE LNSSW,< XLIST >\r
-IFN LNSSW,< ;SPECIAL DEVICES FOR PEPR\r
-P .A,550\r
-P .AB,434\r
-P .ANG,440\r
-P .B,554\r
-P .BITE,470\r
-P .FA,564\r
-P .GAIN,520\r
-P .GATE,444\r
-P .IA,560\r
-P .INC,514\r
-P .LC,474\r
-P .LG,570\r
-P .PEPR,400\r
-P .RG,574\r
-P .SCON,430\r
-P .STAT,410\r
-P .TC,500\r
-P .TED,540\r
-P .THR,544\r
-P .TRK,404\r
-P .VIEW,524>\r
- LIST\r
-PRMEND: ;END OF PERMANENT SYMBOLS\r
-\r
-\f OPDEF ZL [Z LITF] ;INVALID IN LITERALS\r
- OPDEF ZA [Z ADDF] ;INVALID IN ADDRESSES\r
- OPDEF ZAL [Z ADDF!LITF]\r
-\r
-OP1TAB:\r
-\r
- ZA PAGE0 ;PAGE\r
- ZAL PASS20 ;PASS2\r
- ZAL PHASE0 ;PHASE\r
- Z POINT0 ;POINT\r
- ZA PRNTX0 ;PRINTX\r
- ZA PURGE0 ;PURGE\r
- ZA RADIX0 ;RADIX\r
- Z RADX50 ;RADIX50,SQUOZE\r
- ZAL LOC0 (1) ;RELOC\r
- ZAL REMAR0 ;REMARK\r
- ZA REPEA0 ;REPEAT\r
- ZA SUPRE0 ;SUPRESS\r
- ZAL PSEND0 ;PRGEND\r
- ZAL RIM0 (RIMSW) ;RIM\r
- DATAI 0,IOP ;RSW\r
- Z ASCII0 (1) ;SIXBIT\r
- ZAL IOSET (IOPALL!IOSALL) ;SALL\r
- ZAL SERCH0 ;SEARCH\r
- ZA STOPI0 ;STOPI\r
- ZA SUBTT0 (Z (POINT 7,,)) ;SUBTTL\r
- ZA SYN0 ;SYN\r
- ZAL TAPE0 ;TAPE\r
- ZA TITLE0 (Z (POINT 7,,)) ;TITLE\r
- ZAL VAR0 ;VAR\r
-\r
- Z XPUNG0 ;XPUNGE\r
- ZAL TWSEG0 ;TWOSEGMENTS\r
- ZAL XALL0 (IOPALL) ;XALL\r
- ZAL IOSET (IOPROG) ;XLIST\r
- Z XWD0 ;XWD\r
- ZAL RIM0 (RIM1SW) ;RIM10\r
- ZAL RIM0 (R1BSW) ;RIM10B\r
- ZA UNIV0 (Z (POINT 7,,)) ;UNIVERSAL\r
- ZAL IORSET (IONCRF) ;.CREF\r
- ZAL IOSET (IONCRF) ;.XCREF\r
- ZA OFFORM ;.HWFRMT\r
- ZA ONFORM ;.MFRMT\r
-\fOP2TAB:\r
-\r
- Z ASCII0 (0) ;ASCII\r
- Z ASCII0 (1B18) ;ASCIZ\r
- BLKI IOP ;BLKI\r
- BLKO IOP ;BLKO\r
- ZAL BLOCK0 ;BLOCK\r
- ZA SUPRSA ;ASUPPRESS\r
- ZAL HISEG0 ;HISEG\r
- Z BYTE0 ;BYTE\r
- CONI IOP ;CONI\r
- CONO IOP ;CONO\r
- CONSO IOP ;CONSO\r
- CONSZ IOP ;CONSZ\r
- DATAI IOP ;DATAI\r
- DATAO IOP ;DATAO\r
- Z OCT0 (^D10) ;DEC\r
- ZA DEFIN0 ;DEFINE\r
-\r
- ZAL DEPHA0 ;DEPHASE\r
- ZAL END0 ;END\r
- ZA INTER0 (INTF!ENTF) ;ENTRY\r
- Z EXPRES ;EXP\r
- ZA EXTER0 ;EXTERN\r
- JRST 4,OP ;HALT\r
- TLNN FR,IFPASS ;IF1\r
- TLNE FR,IFPASS ;IF2\r
-\r
- TRNE AC0,IFB0 ;IFB\r
- TLNE ARG,IFDEF0 ;IFDEF\r
- Z IFIDN0 (0) ;IFDIF\r
- SKIPE IF ;IFE\r
- SKIPG IF ;IFG\r
- SKIPGE IF ;IFGE\r
- Z IFIDN0 (1) ;IFIDN\r
- SKIPL IF ;IFL\r
-\r
- SKIPLE IF ;IFLE\r
- SKIPN IF ;IFN\r
- TRNN AC0,IFB0 ;IFNB\r
- TLNN ARG,IFDEF0 ;IFNDEF\r
- ZA INTER0 (INTF) ;INTERN\r
- Z IOWD0 ;IOWD\r
- Z IRP0 (0) ;IRP\r
- Z IRP0 (400000) ;IRPC\r
-\r
- JFCL 6,OP ;JCRY\r
- JFCL 4,OP ;JCRY0\r
- JFCL 2,OP ;JCRY1\r
- JRST 12,OP ;JEN\r
- JFCL 10,OP ;JOV\r
- JRST 2,OP ;JRSTF\r
- ZAL IORSET (IOPALL!IOSALL) ;LALL\r
- ZAL IORSET (IOPROG) ;LIST\r
- ZAL LIT0 ;LIT\r
- ZAL LOC0 (0) ;LOC\r
- ZA OFFSYM ;NOSYM\r
- Z OCT0 (^D8) ;OCT\r
- ZA OPDEF0 ;OPDEF\r
- JFCL 1,OP ;JFOV\r
- ZA ONML ;MLON\r
- ZA OFFML ;MLOFF\r
- Z ASCII0 (3B19) ;COMMENT\r
-IFN IIISW!WFWSW,<\r
- Z ASCII0 (5B20) ;ASCID\r
-IFN WFWSW,<\r
- ZAL %ARAY ;ARRAY\r
- ZAL %INTEG ;INTEGER\r
- ZAL %LVAR ;LVAR>>\r
-\f\r
-CALTBL:\r
- ;USER DEFINED CALLI'S GO HERE\r
- SIXBIT /LIGHTS/ ;-1\r
-CALLI0: SIXBIT /RESET/ ; 0\r
- SIXBIT /DDTIN/ ; 1\r
- SIXBIT /SETDDT/ ; 2\r
- SIXBIT /DDTOUT/ ; 3\r
- SIXBIT /DEVCHR/ ; 4\r
- SIXBIT /DDTGT/ ; 5\r
- SIXBIT /GETCHR/ ; 6\r
- SIXBIT /DDTRL/ ; 7\r
- SIXBIT /WAIT/ ;10\r
- SIXBIT /CORE/ ;11\r
- SIXBIT /EXIT/ ;12\r
- SIXBIT /UTPCLR/ ;13\r
- SIXBIT /DATE/ ;14\r
- SIXBIT /LOGIN/ ;15\r
- SIXBIT /APRENB/ ;16\r
- SIXBIT /LOGOUT/ ;17\r
- SIXBIT /SWITCH/ ;20\r
- SIXBIT /REASSI/ ;21\r
- SIXBIT /TIMER/ ;22\r
- SIXBIT /MSTIME/ ;23\r
- SIXBIT /GETPPN/ ;24\r
- SIXBIT /TRPSET/ ;25\r
- SIXBIT /TRPJEN/ ;26\r
- SIXBIT /RUNTIM/ ;27\r
- SIXBIT /PJOB/ ;30\r
- SIXBIT /SLEEP/ ;31\r
- SIXBIT /SETPOV/ ;32\r
- SIXBIT /PEEK/ ;33\r
- SIXBIT /GETLIN/ ;34\r
- SIXBIT /RUN/ ;35\r
- SIXBIT /SETUWP/ ;36\r
- SIXBIT /REMAP/ ;37\r
- SIXBIT /GETSEG/ ;40\r
- SIXBIT /GETTAB/ ;41\r
- SIXBIT /SPY/ ;42\r
- SIXBIT /SETNAM/ ;43\r
- SIXBIT /TMPCOR/ ;44\r
- SIXBIT /DSKCHR/ ;45\r
- SIXBIT /SYSSTR/ ;46\r
- SIXBIT /JOBSTR/ ;47\r
- SIXBIT /STRUUO/ ;50\r
- SIXBIT /SYSPHY/ ;51\r
- SIXBIT /FRECHN/ ;52\r
- SIXBIT /DEVTYP/ ;53\r
- SIXBIT /DEVSTS/ ;54\r
- SIXBIT /DEVPPN/ ;55\r
- SIXBIT /SEEK/ ;56\r
- SIXBIT /RTTRP/ ;57\r
- SIXBIT /LOCK/ ;60\r
- SIXBIT /JOBSTS/ ;61\r
- SIXBIT /LOCATE/ ;62\r
- SIXBIT /WHERE/ ;63\r
- SIXBIT /DEVNAM/ ;64\r
- SIXBIT /CTLJOB/ ;65\r
- SIXBIT /GOBSTR/ ;66\r
- 0 ;67\r
- 0 ;70\r
- SIXBIT /HPQ/ ;71\r
- SIXBIT /HIBER/ ;72\r
- SIXBIT /WAKE/ ;73\r
- SIXBIT /CHGPPN/ ;74\r
- SIXBIT /SETUUO/ ;75\r
- SIXBIT /DEVGEN/ ;76\r
- SIXBIT /OTHUSR/ ;77\r
- SIXBIT /CHKACC/ ;100\r
- SIXBIT /DEVSIZ/ ;101\r
- SIXBIT /DAEMON/ ;102\r
- SIXBIT /JOBPEK/ ;103\r
- SIXBIT /ATTACH/ ;104\r
- SIXBIT /DAEFIN/ ;105\r
- SIXBIT /FRCUUO/ ;106\r
- SIXBIT /DEVLNM/ ;107\r
- SIXBIT /PATH./ ;110\r
-\r
-CALNTH==.-CALTBL\r
-NEGCAL==CALLI0-CALTBL ;NUMBER OF NEGATIVE CALLI'S\r
-\r
-TTCTBL: SIXBIT /INCHRW/ ; 0 INPUT A CHAR. AND WAIT\r
- SIXBIT /OUTCHR/ ; 1 OUTPUT A CHAR.\r
- SIXBIT /INCHRS/ ; 2 INPUT A CHAR. AND SKIP\r
- SIXBIT /OUTSTR/ ; 3 OUTPUT A STRING\r
- SIXBIT /INCHWL/ ; 4 INPUT CHAR., WAIT, LINE MODE\r
- SIXBIT /INCHSL/ ; 5 INPUT CHAR., SKIP, LINE MODE\r
- SIXBIT /GETLCH/ ; 6 GET LINE CHARACTERISTICS\r
- SIXBIT /SETLCH/ ; 7 SET LINE CHARACTERISTICS\r
- SIXBIT /RESCAN/ ;10 RESET INPUT STREAM TO COMMAND\r
- SIXBIT /CLRBFI/ ;11 CLEAR TYPEIN BUFFER\r
- SIXBIT /CLRBFO/ ;12 CLEAR TYPEOUT BUFFER\r
- SIXBIT /SKPINC/ ;13 SKIPS IF A CHAR. CAN BE INPUT\r
- SIXBIT /SKPINL/ ;14 SKIPS IF A LINE CAN BE INPUT\r
- SIXBIT /IONEOU/ ;15 OUTPUT AS AN IMAGE CHAR.\r
-\r
-TTCLTH==.-TTCTBL\r
- SUBTTL USER-DEFINED SYMBOL SEARCH ROUTINES\r
-MSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH\r
- POPJ PP, ;NOT FOUND, EXIT\r
- JUMPG ARG,MSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND\r
- CAME AC0,1(SX) ;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE\r
- POPJ PP, ;NO, EXIT\r
- ADDI SX,2 ;YES, POINT TO IT\r
- PUSHJ PP,SRCH5 ;LOAD REGISTERS\r
-MSRCH2: AOSA 0(PP) ;SET SKIP-EXIT\r
-QSRCH: JUMPL ARG,SSRCH3 ;BRANCH IF OPERAND\r
- MOVEI SDEL,%MAC ;SET OPERATOR FLAG\r
- TLZE IO,DEFCRS ;IS IT A DEFINITION?\r
- MOVEI SDEL,%DMAC ;YES\r
- JRST CREF ;CROSS-REF AND EXIT\r
-\r
-SSRCH: PUSHJ PP,SEARCH ;PERFORM GENERAL SEARCH\r
- POPJ PP, ;NOT FOUND, EXIT\r
- JUMPL ARG,SSRCH2 ;SKIP-EXIT AND CROSS-REF IF FOUND\r
-SSRCH1: CAME AC0,-3(SX) ;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW\r
- POPJ PP, ;NO DICE, EXIT\r
- SUBI SX,2 ;YES, POINT TO IT\r
- PUSHJ PP,SRCH5 ;LOAD REGISTERS\r
-SSRCH2: AOS 0(PP) ;SET FOR SKIP-EXIT\r
-SSRCH3: MOVEI SDEL,%SYM ;SET OPERAND FLAG\r
-\r
-CREF: TLNN IO,IONCRF ;NO CREFFING FOR THIS SYMBOL?\r
- TLNE FR,P1!CREFSW ;PASS ONE OR CROSS-REF SUPPRESSION?\r
- POPJ PP, ;YES, EXIT\r
- EXCH SDEL,C ;PUT FLAG IN C, SACE C\r
- PUSH PP,CS\r
- TLNE IO,IOCREF ;HAVE WE PUT OUT THE 177,102\r
- JRST CREF3 ;YES\r
- PUSH PP,C ;START OF CREF DATA\r
-\r
-\fREPEAT 0,< ;NEEDS CHANGE TO CREF\r
- MOVEI C,177\r
- PUSHJ PP,OUTLST\r
- MOVEI C,102\r
- PUSHJ PP,OUTLST\r
- TLO IO,IOCREF ;WE NOW ARE IN THAT STATE\r
- POP PP,C ;WE HAVE NOW\r
-CREF3: JUMPE C,NOFLG ;JUST CLOSE IT\r
- PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)\r
- MOVSI CS,770000 ;COUNT CHRS\r
- TDZA C,C ;STARTING AT 0\r
- LSH CS,-6 ;TRY NEXT\r
- TDNE AC0,CS ;IS THAT ONE THERE?\r
- AOJA C,.-2 ;YES\r
- PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS\r
- MOVE CS,AC0\r
-\r
-CREF2: MOVEI C,0\r
- LSHC C,6\r
- ADDI C,40\r
- PUSHJ PP,OUTLST ;THE ASCII SYMBOL\r
- JUMPN CS,CREF2\r
- MOVEI C,%DSYM\r
- TLZE IO,DEFCRS\r
- PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE\r
-NOFLG: MOVE C,SDEL\r
- POP PP,CS\r
- POPJ PP,\r
-\r
-CLSCRF: TRNN ER,LPTSW\r
- POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING\r
-CLSCR2: MOVEI C,177\r
- PUSHJ PP,PRINT\r
- TLZE IO,IOCREF ;WAS IT OPEN?\r
- JRST CLSCR1 ;YES, JUST CLOSE IT\r
- MOVEI C,102 ;NO, OPEN IT FIRST\r
- PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA\r
- MOVEI C,177\r
- PUSHJ PP,OUTLST\r
-CLSCR1: MOVEI C,103\r
- JRST OUTLST ;MARK END OF CREF DATA\r
-\r
-CLSC3: TLZ IO,IOCREF\r
- MOVEI C,177\r
- PUSHJ PP,OUTLST\r
- MOVEI C,104\r
- JRST OUTLST ;177,104 CLOSES IT FOR NOW\r
-> ;END OF REPEAT 0\r
-\fREPEAT 1,< ;WORKS WITH EXISTING CREF\r
- TLNE IO,IOPAGE\r
- PUSHJ PP,CRFHDR ;GET CORRECT SUBTTL\r
- MOVEI C,177\r
- PUSHJ PP,OUTLST\r
- MOVEI C,102\r
- PUSHJ PP,OUTLST\r
- TLO IO,IOCREF ;WE NOW ARE IN THAT STATE\r
- POP PP,C ;WE HAVE NOW\r
-CREF3: PUSHJ PP,OUTLST ;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)\r
- MOVSI CS,770000 ;COUNT CHRS\r
- TDZA C,C ;STARTING AT 0\r
- LSH CS,-6 ;TRY NEXT\r
- TDNE AC0,CS ;IS THAT ONE THERE?\r
- AOJA C,.-2 ;YES\r
- PUSHJ PP,OUTLST ;PRINT NUMBER OF SYMBOL CONSTITUENTS\r
- MOVE CS,AC0\r
-\r
-CREF2: MOVEI C,0\r
- LSHC C,6\r
- ADDI C,40\r
- PUSHJ PP,OUTLST ;THE ASCII SYMBOL\r
- JUMPN CS,CREF2\r
- MOVEI C,%DSYM\r
- TLZE IO,DEFCRS\r
- PUSHJ PP,OUTLST ;MARK IT AS A DEFINING OCCURENCE\r
- MOVE C,SDEL\r
- POP PP,CS\r
- POPJ PP,\r
-\r
-IFN OPHSH,<\r
-SUBTL: SIXBIT /SUBTTL/>\r
-CRFHDR: CAME AC0,SUBTL ;IS FIRST SYMBOL "SUBTTL"\r
- JRST CRFHD1 ;NO\r
- HLLZ AC0,V\r
- PUSHJ PP,SUBTT0 ;UPDATE SUBTTL\r
- MOVE AC0,SUBTL ;RESTORE ARG.\r
- MOVEI V,CPOPJ\r
-CRFHD1: MOVEI C,0\r
- JRST OUTL\r
-\r
-CLSC3:\r
-CLSCRF: TRNN ER,LPTSW\r
- POPJ PP, ;LEAVE IF WE SHOULD NOT BE PRINTING\r
-CLSCR2: TLZE IO,IOCREF ;FINISH UP LINE\r
- JRST CLSCR1\r
- MOVEI C,0\r
- TLNE IO,IOPAGE ;NEW PAGE?\r
- PUSHJ PP,OUTL ;YES,GIVE IT A ROUSING SENDOFF!\r
- MOVEI C,177\r
- PUSHJ PP,OUTLST\r
- MOVEI C,102\r
- PUSHJ PP,OUTLST ;MARK BEGINNING OF CREF DATA\r
-CLSCR1: MOVEI C,177\r
- PUSHJ PP,OUTLST\r
- MOVEI C,103\r
- JRST OUTLST ;MARK END OF CREF DATA\r
-> ;END OF REPEAT 1\r
-\fSEARCH: HLRZ SX,SRCHX\r
- HRRZ SDEL,SRCHX\r
-\r
-SRCH1: CAML AC0,-1(SX)\r
- JRST SRCH3\r
-SRCH2: SUB SX,SDEL\r
- LSH SDEL,-1\r
- CAMG SX,SYMTOP\r
- JUMPN SDEL,SRCH1\r
- JUMPN SDEL,SRCH2\r
- SOJA SX,SRCHNO ;NOT FOUND\r
-\r
-SRCH3: CAMN AC0,-1(SX)\r
- JRST SRCH4 ;NORMAL / FOUND EXIT\r
- ADD SX,SDEL\r
- LSH SDEL,-1\r
- CAMG SX,SYMTOP\r
- JUMPN SDEL,SRCH1\r
- JUMPN SDEL,SRCH2\r
- SOJA SX,SRCHNO ;NOT FOUND\r
-\r
-SRCH4: AOS 0(PP) ;SET FOR SKIP EXIT\r
-SRCH5: MOVSI ARG,SUPRBT ;HE IS USING IT, TURN OFF BIT\r
- ANDCAM ARG,(SX) ; IN THE TABLE\r
-SRCH7: MOVE ARG,0(SX) ;FLAG AND VALUE TO ARG\r
- LDB RC,RCPNTR ;POINT 1,ARG,17\r
- TLNE ARG,LELF ;CHECK LEFT RELOCATE\r
- TLO RC,1\r
- HRRZ V,ARG\r
- TLNE ARG,SPTR ;CHECK SPECIAL EXTESN POINTER\r
- JRST SRCH6\r
- TLNE ARG,PNTF\r
- MOVE V,0(ARG) ;36BIT VALUE TO V\r
- JRST SRCHOK\r
- \r
-SRCH6: MOVE V,0(ARG) ;VALUE\r
- MOVE RC,1(ARG) ;AND RELOC\r
- TLNE RC,-2 ;CHECK AND SET EXTPNT\r
- HLLM RC,EXTPNT\r
- TRNE RC,-2 \r
- HRRM RC,EXTPNT\r
- JRST SRCHOK\r
-SRCHNO: SKIPN UNISCH+1 ;ALLOWED TO SEARCH OTHER TABLES\r
- POPJ PP, ;NO, JUST RETURN\r
- AOS V,UNISCH ;GET NEXT INDEX TO TABLE\r
- CAIE V,1 ;FIRST TIME IN\r
- JRST SRCHN1 ;YES, SAVE SYMBOL INFO\r
- HRLM SX,UNISCH ;SAVE SX AND SET FLAG\r
- MOVE ARG,SRCHX ;SEARCH POINTER\r
- MOVEM ARG,UNISHX ;TO A SAFE PLACE\r
- HRR ARG,SYMBOL\r
- HRL ARG,SYMTOP\r
- MOVEM ARG,UNIPTR ;STORE ALSO\r
-SRCHN1: MOVE V,UNISCH(V) ;GET TRUE INDEX\r
- JUMPE V,SRCHKO ;IF ZERO ALL TABLE SCANNED\r
- MOVE ARG,UNISHX(V) ;NEW SRCHX\r
- MOVEM ARG,SRCHX ;SET IT UP\r
- MOVE ARG,UNIPTR(V) ;SYMTOP,,SYMBOL\r
- HRRZM ARG,SYMBOL\r
- HLRZM ARG,SYMTOP\r
- JRST SEARCH ;TRY AGAIN\r
-\r
-SRCHKO: SETZ ARG, ;CLEAR ARG SO ZERO STORED\r
-SRCHOK: SKIPN UNISCH ;HAVE WE SEARCH OTHER TABLES\r
- POPJ PP, ;NO, JUST RETURN\r
-SYMBCK: HLRZ SX,UNISCH ;RESTORE SX\r
- SETZM UNISCH ;CLEAR SYMBCK FLAG\r
- PUSH PP,V ;SAVE AN AC\r
- MOVE V,UNISHX ;SRCHX\r
- MOVEM V,SRCHX ;RESTORE ORIGINAL\r
- MOVE V,UNIPTR ;SYMTOP,,SYMBOL\r
- HRRZM V,SYMBOL\r
- HLRZM V,SYMTOP\r
- JUMPE ARG,SRCHK2 ;TOTALLY UNDEFINED\r
- PUSH PP,RC ;SAVE SOME ACCS\r
- PUSH PP,ARG\r
- PUSH PP,EXTPNT\r
- SETZB ARG,EXTPNT ;CLEAR ALL SYMBOL DATA\r
- SETZB RC,V\r
- PUSHJ PP,INSERT ;INSERT SYMBOL IN TABLE\r
- POP PP,EXTPNT ;RESTORE ACCS ETC.\r
- POP PP,ARG\r
- POP PP,RC\r
- MOVEM ARG,(SX) ;SET FLAGS AND VALUE AS IT SHOULD BE\r
-SRCHK2: POP PP,V\r
- POPJ PP, ;RETURN\r
-\r
-\fINSERQ: TLNE ARG,UNDF!VARF\r
-INSERZ: SETZB RC,V\r
-INSERT: CAME AC0,-1(SX) ;ARE WE LOOKING AT MATCHING MNEMONIC?\r
- JRST INSRT2 ;NO, JUST INSERT\r
- JUMPL ARG,INSRT1 ;YES, BRANCH IF OPERAND\r
- SKIPL 0(SX) ;OPERATOR, ARE WE LOOKING AT ONE?\r
- JRST UPDATE ;YES, UPDATE\r
- JRST INSRT2 ;NO, INSERT\r
-\r
-INSRT1: SKIPG 0(SX) ;OPERAND, ARE WE LOOKING AT ONE?\r
- JRST UPDATE ;YES, UPDATE\r
- SUBI SX,2 ;NO, MOVE UNDER OPERATOR AND INSERT\r
-INSRT2: MOVE SDEL,SYMBOL\r
- SUBI SDEL,2\r
- CAMLE SDEL,FREE\r
- JRST INSRT3\r
- PUSHJ PP,XCEEDS\r
- ADDI SDEL,2000\r
-INSRT3: MOVEM SDEL,SYMBOL ;MAKE ROOM FOR A TWO WORD ENTRY\r
- HRLI SDEL,2(SDEL)\r
- BLT SDEL,-2(SX) ;PUSH EVERYONE DOWN TWO LOACTIONS\r
- AOS @SYMBOL ;INCREMENT THE SYMBOL COUNT\r
- TLNN RC,-2 ;NEED SPECIAL?\r
- TRNE RC,-2 ;LEFT OR RIGHT EXTERNAL?\r
- JRST INSRT5 ;YES, JUMP\r
- TLNN V,-1 ;SKIP IF V IS A 36BIT VALUE\r
- JRST INSRT4 ;JUMP, ITS A 18BIT VALUE\r
- AOS SDEL,FREE ;36BIT, SO GET A CELL FROM FREE CORE\r
- CAML SDEL,SYMBOL ;MORE CORE NEEDED?\r
- PUSHJ PP,XCEEDS ;YES\r
- HRRI ARG,-1(SDEL) ;POINTER TO ARG\r
- MOVEM V,0(ARG) ;36BIT VALUE TO FREE CORE\r
- TLOA ARG,PNTF ;NOTE THAT ARG IS APOINTER, NOT A 18BIT VALUE\r
-\r
-INSRT4: HRR ARG,V ;18BIT VALUE TO ARG\r
- DPB RC,RCPNTR ;FIX RIGHT RELOCATION\r
- TLNE RC,1\r
- TLO ARG,LELF ;FIX LEFT RELOCATION\r
-INSRT6: MOVEM ARG,0(SX) ;INSERT FLAGS AND VALUE.\r
- MOVEM AC0,-1(SX) ;INSERT SYMBOL NAME.\r
- PUSHJ PP,SRCHI ;INITILIAZE SRCHX\r
- JRST QSRCH ;EXIT THROUGH CREF\r
- \r
-INSRT5: MOVEI SDEL,2 ;GET TWO CELLS FROM FREE CORE\r
- ADDB SDEL,FREE\r
- CAML SDEL,SYMBOL;MORE CORE NEEDED?\r
- PUSHJ PP,XCEEDS ;YES\r
- MOVEM RC,-1(SDEL)\r
- HRRI ARG,-2(SDEL) ;POINTER TO ARG\r
- MOVEM V,0(ARG)\r
- TLO ARG,SPTR ;SET SPECIAL POINTER, POINTS TO TWO CELLS\r
- JRST INSRT6\r
-\fREMOVE: SUBI SX,2 ;MOVE EVERYONE UP TWO LOCATIONS\r
-REMOV1: MOVE 0(SX)\r
- MOVEM 2(SX) ;OVERWRITE THE DELETED SYMBOL\r
- CAME SX,SYMBOL ;SKIP WHEN DONE\r
- SOJA SX,REMOV1\r
- ADDI SX,2\r
- MOVEM SX,SYMBOL\r
- SOS 0(SX) ;DECREMENT THE SYMBOL COUNT\r
-\r
-SRCHI: MOVEI AC2,0 ;THIS CODE SETS UP SRCHX\r
- FAD AC2,@SYMBOL\r
- LSH AC2,-^D27\r
- MOVEI AC1,1000\r
- LSH AC1,-357(AC2)\r
- HRRM AC1,SRCHX\r
- LSH AC1,1\r
- ADD AC1,SYMBOL\r
- HRLM AC1,SRCHX\r
- POPJ PP, ;SRCHX=XWD <SYMTBL+LENGTH/2>,LENGTH/4\r
-\r
-\fUPDATE: DPB RC,RCPNTR ;FIX RIGHT RELOCATION\r
- TLNE ARG,SPTR ;SKIP IF THERE IS NO SPECIAL POINTER\r
- JRST UPDAT4 ;YES, USE THE TWO CELLS\r
- TLNN RC,-2 ;NEED TO CHANGE\r
- TRNE RC,-2 ;ANY CURRENT EXTERNS?\r
- JRST UPDAT5 ;YES ,JUMP\r
- TLZ ARG,LELF ;CLEAR LELF\r
- TLNE RC,1 ;LEFT RELOCATABLE?\r
- TLO ARG,LELF ;YES, SET THE FLAG\r
- TLNE ARG,PNTF ;WAS THERE A 36BIT VALUE?\r
- JRST UPDAT2 ;YES, USE IT.\r
- TLNE V,-1 ;NO,IS THERE A 36BIT VALUE?\r
- JRST UPDAT1 ;YES, GET A CELL\r
- HRR ARG,V ;NO, USE RH OF ARG\r
-UPDAT3: MOVEM ARG,0(SX) ;OVERWRITE THE ONE IN THE TABLE\r
- POPJ PP, ;AND EXIT\r
-\r
-UPDAT1: AOS SDEL,FREE ;GET ONE CELL\r
- CAML SDEL,SYMBOL ;NEED MORE CORE?\r
- PUSHJ PP,XCEEDS ;YES\r
- HRRI ARG,-1(SDEL) ;POINTER TO ARG\r
- TLO ARG,PNTF ;AND NOTE IT.\r
-UPDAT2: TLNE ARG,EXTF ;IS THERE A EXTERNAL?\r
- JRST UPDAT3 ;YES, - JUST SAVE A LOCATION\r
- MOVEM ARG,0(SX) ;NO, OVERWRITE THE POINTER IN THE TABLE\r
- MOVEM V,0(ARG) ;STORE VALUE AS A 36BIT VALUE\r
- POPJ PP, ;AND EXIT\r
- \r
-UPDAT4: MOVEM ARG,0(SX) ;WE HAVE TWO CELLS, WE USE THEM\r
- MOVEM V,0(ARG) ;SAVE AS 36BIT VALUE\r
- MOVEM RC,1(ARG) ;SAVE RELOCATION BITS\r
- POPJ PP, ;AND EXIT\r
-\r
-UPDAT5: MOVEI SDEL,2 ;THERE IS A EXTERNAL\r
- ADDB SDEL,FREE ;SO WE NEED TWO LOACTIONS\r
- CAML SDEL,SYMBOL ;NEED MORE CORE?\r
- PUSHJ PP,XCEEDS ;YES\r
- MOVEM RC,-1(SDEL) ;SAVE RELOCATION BITS\r
- HRRI ARG,-2(SDEL) ;SAVE THE POINTER IN ARG\r
- MOVEM V,0(ARG) ;SAVE A 36BIT VALUE\r
- TLO ARG,SPTR ;SET SPECIAL PNTR FLAG\r
- TLZ ARG,PNTF ;CLEAR POINTER FLAG\r
- JRST UPDAT3 ;SAVE THE POINTER AND EXIT\r
-\r
-\f SUBTTL CONSTANTS\r
-\r
-\r
-IFN FORMSW,<\r
-HWFORM: BYTE (18) 1,1\r
-INFORM: BYTE (9) 1 (4) 1 (1) 1 (4) 1 (18) 1\r
-IOFORM: BYTE (3) 1 (7) 1 (3) 1 (1) 1 (4) 1 (18) 1\r
-BPFORM: BYTE (6) 1,1 (2) 1 (4) 1 (18) 1\r
-ASCIIF: BYTE (7) 1,1,1,1,1\r
-SXFORM: BYTE (6) 1,1,1,1,1,1\r
->\r
-\r
-\f SUBTTL PHASED CODE\r
-\r
-IFN PURESW,<LOWH:\r
-IFE SEG2SW,< PHASE 140>\r
-IFN SEG2SW,< PHASE LOWL>\r
->\r
-IFN TEMP,<TMPFIL: SIXBIT /MAC/\r
- XWD -200,0>\r
-LSTFIL: BLOCK 1\r
- SIXBIT /@/ ;SYMBOL TO STOP PRINTING\r
-TAG: BLOCK 1\r
- SIXBIT / + @/\r
-TABI:\r
-IFE FORMSW,< BYTE (7) 0, 11, 11, 11, 11>\r
-IFN FORMSW,< BYTE (7) 11,11, 11, 11, 11>\r
-SEQNO: BLOCK 1\r
- ASCIZ / /\r
-BININI: EXP B\r
-BINDEV: BLOCK 1\r
- XWD BINBUF,0\r
-LSTINI: EXP AL\r
-LSTDEV: BLOCK 1\r
- XWD LSTBUF,0\r
-IFN CCLSW,<\r
-IFE RUNSW,<\r
-NUNINI: EXP DMP\r
-NUNDEV: BLOCK 1\r
- XWD 0,0>\r
-RPGINI: EXP AL\r
-RPGDEV: BLOCK 1\r
- XWD 0,CTLBLK\r
->\r
-INDEVI: EXP A\r
-INDEV: BLOCK 1\r
- XWD 0,IBUF\r
-DBUF: ASCIZ / TI:ME DY-MON-YR PAGE /\r
-VBUF: ASCIZ / MACRO / ;MUST BE LAST LOCATIONS IN BLOCK\r
-IFE PURESW,< BLOCK 3 ;ALLOW FOR LONG TITLE>\r
-IFN PURESW,< DEPHASE\r
- LENLOW==.-LOWH>\r
-\r
-\fSUBTTL STORAGE CELLS\r
-\r
-IFN PURESW,<\r
-IFE SEG2SW,< LOC 140>\r
-IFN SEG2SW,< RELOC LOWL>\r
-LOWL: BLOCK LENLOW+3 >\r
-PASS1I:\r
-\r
-RP: BLOCK 1\r
-\r
-IFE CCLSW,<CTIBUF: BLOCK 3\r
-CTOBUF: BLOCK 3\r
->\r
-IFN CCLSW,<CTLBUF: BLOCK <CTLSIZ+5>/5\r
-IFN RUNSW,<RUNDEV: BLOCK 1\r
-RUNFIL: BLOCK 3\r
-RUNPP: BLOCK 2>>\r
-LSTBUF: BLOCK 3\r
-BINBUF: BLOCK 3\r
-IBUF: BLOCK 3\r
-IFN CCLSW,<IFE RUNSW,<NUNDIR:>>\r
-LSTDIR: BLOCK 4\r
-BINDIR: BLOCK 4\r
-INDIR: BLOCK 4\r
-\r
-ACDELX: ;LEFT HALF\r
-BLKTYP: BLOCK 1 ;RIGHT HALF\r
-\r
-COUTX: BLOCK 1\r
-COUTY: BLOCK 1\r
-COUTP: BLOCK 1\r
-COUTRB: BLOCK 1\r
-COUTDB: BLOCK ^D18\r
-\r
-ERRCNT: BLOCK 1\r
-FREE: BLOCK 1\r
-IFN RENTSW,<HIGH1: BLOCK 1\r
-HISNSW: BLOCK 1\r
-SVTYP3: BLOCK 1\r
-HMIN: BLOCK 1 ;START OF HIGH SEG. IN TWO SEG. PROG.>\r
-IFBLK: BLOCK .IFBLK\r
-IFBLKA: BLOCK .IFBLK\r
-LADR: BLOCK 1\r
-NCOLLS: BLOCK 1\r
-LIMBO: BLOCK 1\r
-LBUFP: BLOCK 1\r
-LBUF: BLOCK <.CPL+5>/5\r
- BLOCK 1\r
-VARHD: BLOCK 1\r
-VARHDX: BLOCK 1\r
-IFN WFWSW,<LVARLC: BLOCK 1>\r
-\r
-LITAB: BLOCK 1\r
-LITABX: BLOCK 1\r
- BLOCK 1\r
-LITHD: BLOCK 1\r
-LITHDX: BLOCK 1\r
-LITCNT: BLOCK 1\r
-LITNUM: BLOCK 1\r
-\r
-LOOKX: BLOCK 1\r
-NEXT: BLOCK 1\r
-OUTSW: BLOCK 1\r
-PDP: BLOCK 1\r
-RECCNT: BLOCK 1\r
-SAVBLK: BLOCK RC\r
-SAVERC: BLOCK 1\r
-SBUF: BLOCK .SBUF/5\r
-SRCHX: BLOCK 1\r
-SUBTTX: BLOCK 1\r
-SVSYM: BLOCK 1\r
-SYMBOL: BLOCK 1\r
-SYMTOP: BLOCK 1\r
-SYMCNT: BLOCK 1\r
-\r
-STPX: BLOCK 1\r
-STPY: BLOCK 1\r
-STCODE: BLOCK .STP\r
-STOWRC: BLOCK .STP\r
-\r
-IFN FORMSW,<\r
-STFORM: BLOCK .STP\r
-FORM: BLOCK 1\r
-HWFMT: BLOCK 1\r
-FLDSIZ: BLOCK 1\r
-IOSEEN: BLOCK 1\r
->\r
-TABP: BLOCK 1\r
-TCNT: BLOCK 1 ;COUNT OF CHARS. LEFT IN TBUF\r
-TBUF: BLOCK .TBUF/5\r
-DEVBUF: BLOCK 6 ;STORE NAME.EXT CREATION DATE AND TIME\r
-TYPERR: BLOCK 1\r
-IONSYM: BLOCK 1 ;-1 SUPRESS LISTING OF SYMBOLS\r
-PRGPTR: BLOCK 1 ;POINTER TO CHAIN OF PRGEND BLOCKS\r
-ENTERS: BLOCK 1 ;-1 WHEN ENTERS HAVE BEEN DONE\r
-UNIVSN: BLOCK 1 ;-1 WHEN A UNIVERSAL SEEN\r
-\r
-\fPASS2I:\r
-\r
-ABSHI: BLOCK 1\r
-HIGH: BLOCK 1\r
-IFN RENTSW,<HHIGH: BLOCK 1 ;SAVE BREAK OF HIGH SEG. IN TWO SEG PROG.>\r
-ACDEVX: BLOCK 1\r
-CPL: BLOCK 1\r
-CTLSAV: BLOCK 1\r
-CTLS1: BLOCK 1\r
-EXTPNT: BLOCK 1\r
-INTENT: BLOCK 1\r
-INREP: BLOCK 1\r
-INDEF: BLOCK 1\r
-INTXT: BLOCK 1\r
-INCND: BLOCK 1\r
-CALNAM: BLOCK 1\r
-CALPG: BLOCK 1\r
-CALSEQ: BLOCK 1\r
-DEFPG: BLOCK 1\r
-DEFSEQ: BLOCK 1\r
-LITPG: BLOCK 1\r
-LITSEQ: BLOCK 1\r
-REPPG: BLOCK 1\r
-REPSEQ: BLOCK 1\r
-TXTPG: BLOCK 1\r
-TXTSEQ: BLOCK 1\r
-CNDPG: BLOCK 1\r
-CNDSEQ: BLOCK 1\r
-IRPCNT: BLOCK 1\r
-IRPARG: BLOCK 1\r
-IRPARP: BLOCK 1\r
-IRPCF: BLOCK 1\r
-IRPPOI: BLOCK 1\r
-IRPSW: BLOCK 1\r
-IFN WFWSW,<FIXLNK: BLOCK 1>\r
-LITLVL: BLOCK 1\r
-LITLBL: BLOCK 1 ;NAME OF LABEL DEFINED INSIDE A LITERAL\r
-\r
-ASGBLK: BLOCK 1\r
-LOCBLK: BLOCK 1\r
-\r
-LOCA: BLOCK 1\r
-LOCO: BLOCK 1\r
-RELLOC: BLOCK 1\r
-ABSLOC: BLOCK 1\r
-LPP: BLOCK 1\r
-MODA: BLOCK 1\r
-MODLOC: BLOCK 1\r
-MODO: BLOCK 1\r
-IFN CCLSW,<OTBUF: BLOCK 2>\r
-OUTSQ: BLOCK 2\r
-PAGEN.: BLOCK 1\r
-PPTEMP: BLOCK 1\r
-PPTMP1: BLOCK 1\r
-PPTMP2: BLOCK 1\r
-\r
-REPCNT: BLOCK 1\r
-REPEXP: BLOCK 1\r
-REPPNT: BLOCK 1\r
-RPOLVL: BLOCK 1\r
-R1BCNT: BLOCK 1\r
-R1BCHK: BLOCK 1\r
-R1BBLK: BLOCK .R1B\r
-R1BLOC: BLOCK 1\r
-RIMLOC: BLOCK 1\r
-TAGINC: BLOCK 1\r
-VECREL: BLOCK 1\r
-VECTOR: BLOCK 1\r
-.TEMP: BLOCK 1 ;TEMPORARY STORAGE\r
-UNISCH: BLOCK .UNIV ;SEARCH TABLE FOR UNIVERSALS\r
-SQFLG: BLOCK 1\r
-ARGF: BLOCK 1\r
-MACENL: BLOCK 1\r
-MACLVL: BLOCK 1\r
-MACPNT: BLOCK 1\r
-WWRXX: BLOCK 1\r
-RCOUNT: BLOCK 1 ;COUNT OF WORDS STILL TO READ IN LEAF\r
-WCOUNT: BLOCK 1 ;COUNT OF WORDS STILL FREE IN LEAF\r
-PASS2Z: ;ONLY CLEAR TO HERE ON PRGEND\r
-LSTSYM: BLOCK 1\r
-PAGENO: BLOCK 1\r
-SEQNO2: BLOCK 1\r
-PASS2X:\r
-\r
-\fSUBTTL MULTI-ASSEMBLY STORAGE CELLS\r
-\r
-LSTPGN: BLOCK 1\r
-IFN WFWSW,<ARAYP: BLOCK 1>\r
-HDAS: BLOCK 1\r
-IFN CCLSW,<EXTMP: BLOCK 1 ;HOLDS EXT OF COMMAND FILE (RH)\r
-SAVFF: BLOCK 1\r
-CTLBLK: BLOCK 3\r
-CTIBUF: BLOCK 3\r
-CTOBUF: BLOCK 3>\r
-IFN TEMP,<TMPFLG: BLOCK 1>\r
-IFN FORMSW,<PHWFMT: BLOCK 1>\r
-MACSIZ: BLOCK 1 ;INITIAL SIZE OF LOW SEG\r
-UNISIZ: BLOCK 1 ;TOP OF BUFFERS AND STACKS\r
-UNITOP: BLOCK 1 ;TOP OF UNIVERSAL SYMBOL TABLE\r
-UNIVNO: BLOCK 1 ;NUMBER OF UNIVERSALS SEEN\r
-UNITBL: BLOCK .UNIV ;TABLE OF UNIVERSAL NAMES\r
-UNIPTR: BLOCK .UNIV ;TABLE OF SYMBOL POINTERS\r
-UNISHX: BLOCK .UNIV ;TABLE OF SRCHX POINTERS\r
- VAR ;CLEAR VARIABLES\r
-\r
-JOBFFI: BLOCK 203*NUMBUF+1 ;INPUT BUFFER PLUS ONE\r
-IFN PURESW,<LOWEND==.-1\r
- RELOC >\r
-\r
- END BEG\r
-\f\r
-\0\0\0\0\r