diff --git a/build/misc.tcl b/build/misc.tcl index f14f434a..c13dc8a6 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -24,6 +24,12 @@ expect "PURIFIED" respond "*" ":pdump midas; ts 77\r" respond "*" ":kill\r" +# MIDAS 73, bootstrapped from 77. +respond "*" ":midas;77\r" +respond "MIDAS.77" "MIDAS; TS 73_MIDAS; MIDAS 73\r" +respond "*" ":midas;73\r" +respond "MIDAS.73" "MIDAS; TS 73_MIDAS; MIDAS 73\r" + # MACTAP respond "*" ":midas;324 sysbin;_sysen2; mactap\r" expect ":KILL" diff --git a/src/midas/midas.73 b/src/midas/midas.73 new file mode 100644 index 00000000..134f5790 --- /dev/null +++ b/src/midas/midas.73 @@ -0,0 +1,8242 @@ +; Reconstructed 2020 from a MIDAS 73 binary and later source. +; Notes from the reconstruction are marked with XXX below. + +TITLE MIDAS 6 + + ;CONDITIONALS IN FOLLOWING FOR COMPATIBILITY WITH OLD AND NTS VERSIONS OF MIDAS +IFE <17-.TYPE IFNDEF >,[DEFINE IFNDEF NAME +IFE <17-.TYPE NAME >*<3-.TYPE NAME >,TERMIN ;ASSEMBLE IF NAME NOT DEFINED +] +IFNDEF IFDEF,[DEFINE IFDEF NAME +IFN <17-.TYPE NAME >*<3*.TYPE NAME >,TERMIN ;ASSEMBLE IF NAME DEFINED +] + +IFNDEF TS,TS==1 ;NON-ZERO FOR ASSEMBLED VERSION TO RUN IN TIME-SHARING +IFNDEF MOBY,MOBY==1 ;NON-ZERO TO ASSEMBLE MOBY SYMBOL TABLE, ETC. +IFE TS,1PASS +.YSTGW +FOO==. + +LOC 41 + JSR ERROR +IF2,IFN TS,JSR TSINT ;PDL OVERFLOW AND/OR OTHER TS PROBLEMS + +LOC FOO +.NSTGW + +IFNDEF A1PSW,A1PSW==TS ;FOR 1PASS END-OF-PROGRAM AUTO-REASSEMBLY +IFNDEF TSSYMS,TSSYMS==1 ;.UAI, .UAO, .BAI, .BAO, .UII, .UIO, .BII, .BIO - EVER USE THEM? +IFNDEF LISTSW,LISTSW==0 ;LISTING FEATURE FOR MAINT PROGS + +;AC DEFS + +FF"=0 ;FLAGS +P=1 +I=2 ;INDICATOR FLAGS, CONTAIN INFO ON CURRENT SYL, FIELD, WORD; ALSO SEE UNRCHF +AA=3 +A=4 +B=5 +C=6 +D=7 +T=10 ;NOT SO TEMP AS IN MOST PROGS W/ T +TT=11 +SYM=12 ;FREQUENTLY CONTAINS SQUOZE SYM W/ FLAGS CLEAR +LINK=13 +F=14 +CH1=15 ;MACRO PROCESSOR TEMP, CLOBBERED BY CALLS TO RCH +CH2=16 ;" " " +TM=17 ;SUPER TEMPORARY + +;FF FLAGS NOT PUSHED +;LEFT HALF +PPSS=400000 ;ONE IF PUNCHING PASS MUST BE SIGN +INDEFF==200000 ;SET IF LOC OR OFFSET IS INDEF +SKILF==100000 ;ONE IF SYM TO BE SEMI KILLED IN DDT + +VOT=40000 ;ALL RCH S MUST GO THRU RCH + ; IE TYPCTL .NE. POPJ P, (SET/CLEARED BY MDSSET, MDSCLR) +PTPF==20000 ;SET IF (TIME SHARING) OUTPUT DEVICE IS PTP + +OUTF==10000 ;ONE IF OUTPUT HAS OCCURED IN CURRENT MODE (USED BY TS NED LOGIC) + +;FF RIGHT HALF FLAGS + +FIRWD==400000 ;ONE FOR FIRST WORD OF BLOCK +IPSYMS==200000 ;ONE IF SYM PUNCH DESIRED +LOCF==100000 ;ONE BETWEEN ABS LOC ASSIGN AND + ;FIRST BLOCK OUTPUT THEREAFTER (EBLK TO OUTPUT NULL BLOCK SO LINKING LOADER KNOWS $.) + +NPSS=40000 ;ONE IF TWO PASS ASSEMBLY +PSS=20000 ;ONE ON PASS 2 +MACRCH=10000 ;ONE IF CHARS COMING FROM MACRO PROCESSOR, DON'T HACK CPGN/CLNN + +INVTF==4000 ;USED BY PBITS AND OUTPUT TO OUTPUT WORDS OF CODE BITS IN CORRECT ORDER (STEAD LOGICAL) +NLIKF==2000 ;TEMPORARILY SUPPRESS ADR LINKING +GLOLOC==1000 ;ONE IF LOCATION PLUS OFFSET IS GLOBAL + +BITF==400 ;SET IF CURRENT SPEC IS 111 +MRSW=200 ;MACRO PROC TO RETURN TO .GO HACKER W/O READING NEXT CHAR (SEE RCHSAV) +TTYRCH==100 ;ONE IF CHARS FROM SOMEWHERE ELSE BUT NOT HACKING CPGN/CLNN +GLOFFS==40 + + ;INDICATOR REGISTER + +;LEFT HALF +GLI==1 ;SET ON " CLEARED EACH SYL +VAR==2 ;SET ON ' " " " +FLO==4 ;SET ON . " " " +DECP==10 ;DECIMAL PREFER +UARI==20 ;1 => RIGHT OPERAND TO UPARROW BEING READ +LSRET==40 ;RETURN FROM < +MNSFLG==100 ;SET IF LAST OP WAS MINUS +WRDF==400 ;SET IF CURRENT WORD IS NOT NULL RETURNED BY GETWORD +NPRC==1000 ;ONE IF NUMBER ALREADY PROCESSED BY UPARROW +UNRCHF==2000 ;=> RE-INPUT LAST CHARACTER (SEE RCH) +MWRD==4000 ;SET ON MULTIPLE WORD +MWRD1==20000 ;SET BY LBRAK AS SIGNAL TO ITSELF THAT THIS NOT FIRST + ;WORD OF MULTI-WORD CONSTANT + + ;PCNTB STUFF + ;EACH ENTRY 3 WORDS; FIRST WORD SQUOZE, NAME OF AREA IF GLOBAL + ;SECOND WORD RH LOC OF AREA (WITH OFFSET), LH LOC FIRST AFTER AREA (WITHOUT OFFSET) + ;THIRD WORD LH FLAGS + +CGBAL==100000 ;GLOBAL (INCLUDING OFFSET) +CTRL==200000 ;RELOCATED ( " ) +CTDEF==400000 ;DEFINED (MUST BE SIGN) + +;RIGHT HALF + +FLD==1 ;SET IF FLD NOT NULL +SYL==2 ;SET IF L-N SEEN IN CURRENT SYL +LET==4 ;SET IF LET SEEN IN CURRENT SYL +DEF==10 ;SET IF CURRENT EXPR DEFINED +LLET==20 + +COM==40 ;SET IF CURRENT QUAN IS COMMON +PERI==100 ;SET IF PERIOD SEEN IN WHAT IS SO FAR (INCL .) A NUMBER +EQLF==200 ;ONE DURING READING WORD TO RIGHT OF = +AIOWD==400 ;FIRST FIELD OF CURRENT WORD HAS IO INST +CONT==1000 ;SET IF NOT OK TO END BLOCK +PSEUDF==4000 ;SET IF ERROR COMMENTS WILL COME FROM PSEUDO +GMINF==20000 ;SET IF UARI OR BAKARI HAS GOBBLED MINUS +OPFLD==200000 ;SET IF OPERATOR SEEN IN CURRENT FIELD + +IFE TS,[.LIFS .NMAC" +MACL==.NMAC" +.ELDC +.LIFS -.NMAC" +MACL==2000*2 ;LENGTH OF MACTBL +.ELDC +]IFN TS,IFNDEF MACL,MACL==6000 +IFNDEF STRL,STRL==20 ;LENGTH OF STRING STORAGE (USED BY GSYL) +IFNDEF DMDEFL,DMDEFL==20 ;MAX NO OF DMY ARGS IN DEFINE + +IFNDEF DMYAGL,DMYAGL==400 ;MAX NO COMBINED DMYARGS ALL MACROS CURRENTLY EXPANDING OR PUSHED +IFNDEF MPDLL,MPDLL==300 ;MAC PDL LENGTH +IFNDEF DSSIZ,DSSIZ==40 ;MAX # ARGS MACRO WHOSE ARGS BEING SCANNED (SHOULD BE .GE. DMDEFL) +IFNDEF MIDVRS,MIDVRS"=.FNAM2 +.GLOBAL MIDVRS ;IN CASE USER HAS TYPED IT IN + +DEFINE PRINTA A,B,C,D,E,F +IF1,[PRINTC Á!B!C!D!E!F +Ý +TERMIN + +.YSTGW ;SET UP NOW, STORAGE WORDS OK + + ;RANDOM MACRO DEFINITIONS + + ;ASSEMBLE BYTE INSTRUCTION POINTING TO CERTAIN BIT + +DEFINE BYB A,B,C +ZZZ=C +ZZ=43 +REPEAT 35.,[IFGE ZZZ,[ ZZZ=ZZZ_1 + ZZ=ZZ-1 +]] +A,[ZZ*10000+100,,B] +TERMIN + + ;A HAS ADR OF SYM SQUOZE, SKIP IF IT'S IN SYMBOL TABLE + +DEFINE SKPST A + CAIGE A,ST +TERMIN + + ;EXECUTE AN INSTRUCTION WITH VARIOUS ADDRESSES (USUALLY PUSH OR POP) + +DEFINE INSIRP A,B +IRPS %ADR,,[B] +A,%ADR +TERMIN +TERMIN + + ;3RDWRD MANIPULATING MACROS + ;GET 3RDWRD INTO LH("A"), "B" HAS INDEX OF 1STWRD INTO SYMBOL TABLE + +DEFINE 3GET A,B + HRRZ TM,B + ROT TM,-2 + HLLZ A,3RDWRD(TM) + SKIPGE TM + HRLZ A,3RDWRD(TM) + TERMIN + + ;GET 3RDWRD INTO "A", "B" HAS ADR OF 1STWRD + +DEFINE 3GET1 A,B + MOVEI TM,-ST(B) + ROT TM,-2 + HLLZ A,3RDWRD(TM) + SKIPGE TM + HRLZ A,3RDWRD(TM) + TERMIN + + ;PUT "A" INTO 3RDWRD, "B" HAS INDEX OF 1STWRD INTO SYMBOL TABLE + +DEFINE 3PUT A,B + HRRZ TM,B + ROT TM,-2 + SKIPGE TM + HLRM A,3RDWRD(TM) + SKIPL TM + HLLM A,3RDWRD(TM) + TERMIN + + ;PUT "A" INTO 3RDWRD, "B" HAS ADR OF 1STWRD + +DEFINE 3PUT1 A,B + MOVEI TM,-ST(B) + ROT TM,-2 + SKIPGE TM + HLRM A,3RDWRD(TM) + SKIPL TM + HLLM A,3RDWRD(TM) + TERMIN + +;LINK TABLE (GLOTB), ACCUMULATES GLOBAL REFERENCES FOR CURRENT FROB (USUALLY WORD) TO OUTPUT +;GLSP2 POINTS TO (I.E. HAS ADR 1 LESS THAN) BOTTOM OF ACTIVE PART OF TABLE +;GLSP1 POINTS TO TOP (HAS ADR OF LAST ENTRY ACTIVE) + +;ACTUAL ENTRIES IN GLOTB: +;IF ENTIRE WORD ZERO, ENTRY IS NULL, WILL (OR SHOULD) BE IGNORED +;RH ADR OF SQUOZE WITH INTERNAL MIDAS FLAGS (USUALLY IN SYMBOL TABLE, BUT MAY BE ANYWHERE IN CORE) +;LH: RIGHT 10. BITS MULTIPLICATION FACTOR OR 0 => 1 + ;GLOBAL SHOULD BE MULTIPLIED BY IT +;REST OF LH FLAGS: + +;SIGN BIT => THIS NOT PART OF FIELD, DON'T PLAY WITH FLAGS AT GETFLD, INTFD +ACF==40000 ;AC LOW OR HIGH (SWAPF => HIGH) +HFWDF==100000 ;MASK GLOBAL TO HALFWORD +SWAPF==200000 ;SWAP +MINF==20000 ;NEGATIVE OF GLOBAL + +IFNDEF BSIZE,BSIZE==37 ;PREFERRED SIZE BLOCK MAX SIZE-3 +IFNDEF LPDL,LPDL"=500 ;LENGTH OF PDL +IFNDEF LCONTB,IFN MOBY,LCONTB==500*5 ;LENGTH OF CONSTANTS TABLE +IFNDEF LCONTB,IFE MOBY,LCONTB==500 +IFNDEF LCNGLO,LCNGLO==200*3 ;LENGTH OF CONST GLO TAB +IFNDEF NCONS,NCONS==10 ;MAXIMUM NUMBER OF CONSTANTS AREAS +IFNDEF NVARS,NVARS==10 ;MAX # VARIABLES AREAS + +IFNDEF LBRKT,LBRKT=="[ ;LEFT DELIMITER FOR EXPLICITLY GROUPED CONDITIONALS, MACRO ARGS, REPEAT BODY, ETC. +IFNDEF RBRKT,RBRKT=="] ;RIGHT " + +IFNDEF SMK,[ ;SMK MAX # ENTRIES IN SYMBOL TABLE +IFE TS,[.LIFS .NSYMS" +SMK=.NSYMS" +.ELDC +.LIFS -.NSYMS" +SMK=3177*2 ;MAX NO ENTRIES IN SYM TAB +.ELDC +]IFN MOBY,IFN TS,SMK=6177*2 +IFE MOBY,IFN TS,SMK==2177*2 +] +TYPR=(77000) ;UUO, TYPE OUT ASCIZ STRING + +;3RDWRD SYM TAB BITS + +3REL==600000 ;RELOC BITS, DO NOT CHANGE, SOMETIMES REFERENCED BY NUMERIC BYTE POINTERS +3RLR==200000 ;R(RH) +3RLL==400000 ;R(LH) +3RLNK==100000 ;R(LINK) +3INI==40000 ;INITIAL SYM +3LLV==4000 ;LINKING LOADER MUST INSERT VAL +3VP==20000 ;VALUE PUNCHED +3VCNT==1000 ;USED IN CONSTANT +3SKILL==10000 ;SEMI KILL IN DDT +3VAS2==2000 ;VAR SEEN ON PSS TWO WITH ' +3MAS==400 ;MULTIPLE SYMS SAME NAME AT DIFFERENT LEVELS (I.E. KEEP LOOKING + ;AT SYMBOL LOOKUP) + +;CONTROL FLAGS +;LEFT HALF +TRIV==400000 ;1 IF OUT FORM IS FOR TRIVIAL LOADER (ABSOLUTE) +;RIGHT HALF +ARIM==2 ;IF ONE OUT FOR IS RIM +ARIM1==4 +SBLKS==10 ;IF ONE OUT FORM IS SIMPLE BLOCKS +ARIM10==20 ;PDP-10 RIM + +;SQUOZE FLAG DEFINITIONS IN MIDAS SYMBOL TABLE + +CMMN==0 ;COMMON +PSUDO==40000 ;PSEUDO OR MACRO +SYMC==100000 ;SYM +LCUDF==140000 ;LOCAL UNDEF +DEFLVR==200000 ;DEF LOC VAR +UDEFLV==240000 ;UNDEF LOC VAR +DEFGVR==300000 ;DEF GLO VAR +UDEFGV==340000 ;UNDEF GLO VAR +GLOETY==400000 ;GLO ENTRY +GLOEXT==440000 ;GLO EXIT + +;LOADER BLOCK TYPES LINK + +LLDCM==1 ;LOADER COMMAND BLOCK +LABS==2 ;ABSOLUTE +LREL==3 ;RELOCATABLE +LPRGN==4 ;PROG NAME +LLIB==5 ;LIBRARY BLOCK +LCOMLOD==6 ;LOAD INTO COMMON +LGPA==7 ;GLOBAL PARAMETER ASSIGN +LDDSYM==10 ;LOCAL SYMS +LTCP==11 ;LOAD TIME COND ON PRESENCE +ELTCB==12 ;END LOAD TIME COND +LPTRMN==14 +LENTRY==15 +LEXTERN==16 +LTCN==17 + +;LOADER COMMANDS +;IN ADR OF LDCMD BLK +LCJMP==1 ;JUMP +LCGLO==2 ;GLOBAL LOC ASSIGN +LCCMST==3 ;SET COMMON BENCHMARK +LCEGLO==4 ;END OF GLOBAL BLOCK +LDCV==5 ;LOAD TIME COND ON VALUE +LDOFS==6 ;LOADER SET GLOBAL OFFSET +LD.OP==7 ;LOADER .OP +LDROFS==10 + +;LOADER CODEBITS SECOND SPEC AFTER 7 +CDEF==0 ;DEF +CCOMN==1 ;COMMON REL +CLGLO==2 ;LOC-GLO REC +CLIBQ==3 ;LIBREQ +CRDF==4 ;GLO REDEF +CRPT==5 ;REPEAT GLOBAL VALUE +CDEFPT==6 ;DEFINE SYM AS $. + +;VARIABLE STORAGE + +FUNPDL: 0 +CDISP: 0 ;CURRENT DISPATCH CODE +PPRIME: 0 ;PUSH DOWN LIST MARKER (GETFLD) +GLSP1: 0 ;POINTER TO BOT OF LINKAGE TABLE IN USE HIGH ADR +GLSP2: 0 ;POINTER TO TOP OF LINKAGE TABLE IN USE LOW ADR +FORMAT: 0 ;ACCUMULATES FORMAT WORD +FORPNR: 0 ;POINTER INTO FORMAT WORD, SHOULD BE FORMAT+1 SO CLOBBERABLE BY LAST IDPB +WRD: 0 ;ACCUMULATES VALUE OF WORD +WRDRLC: 0 ;RELOC OF WRD +T1: 0 ;TEMP +T2: 0 ;TEMP +LSYL: 0 ;VALUE OF LAST SYL BEFORE OPEN (LSSTH, LEFTP, LBRAK) +LSYLR: 0 ;RELOCATION BITS OF " +FLDCNT: 0 ;NUMBER OF FIELDS PUSHED DOWN IN CURRENT WORD +PBITS1: 0 ;CURRENT CODE BITS +PBITS2: 0 ;NO OF SPECS LEFT IN CURRENT WORD +PBITS4: 0 ;POINTER TO WHERE CURRENT CODE BITS WILL GO +LIMBO: 0 +CLOC: 0 ;PUNCHING LOC +CRLOC: 0 ;PUNCHING RELOC +OFLOC: 0 ;OFSET VAL +OFRLOC: 0 ;OFSET RELOC +;VAL OF PT=CLOC+OFLOC,CRLOC+OFLOC +OPT1: 0 ;POINTER TO BKBUF TAB +OPTT1: 0 +OPTT2: 0 +ESL1: 0 ;LEVEL OF CURRENT SYM,,0 +ESL2: 0 ;3RD WORD CURRENT SYM +SADR: 0 ;SYM TAB ADR (INDEX INTO ST) +CONTRL": 0 ;FLAG REG FOR IO CONTROL ETC, .GE. 0 => RELOCATABLE/1PASS +LEV: 0 ;CURRENT BEGIN END LEVEL,,0 +CDATBC: 0 ;CURRENT DATA BLOCK CODE TYPE +VARCNT: 0 ;NO OF VAR IN CURRENT VAR AREA SO FAR +SCKSUM: 0 ;CKSUM FOR SIMPLE BLOCK FORMAT +NGCS: 3 +IFN A1PSW,[ +PRGC": -1 ;ONE LESS THAN # TIMES END HAS BEEN INCOUNTERED +OUTN1": -1 ;.GE. 0 => OUTPUT HAS OCCURED IN OTHER THAN 1PASS MODE (NOT INITIALIZED) +OUTC": -1 ;.GE. 0 => OUTPUT HAS OCCURED DURING CURRENT ASSEMBLY +] +LIMBO1: 0 ;UNRCH TEMP; SAVES LAST CHARACTER READ IN +SCONT1: 0 +PBCON: 0 ;POINTER INTO PCNTB, HAS ADR OF ENTRY FOR NEXT CONSTA +PLIM: 0 ;POINTER TO TOP OF CONTAB, HAS ADR OF FIRST UNUSED WORD +PBCONL: 0 ;POINTER TO ABSOLUTE TOP OF PCNTB +CSQZ: 0 ;SQUOZE COUNTER +LINKL: 0 ;SAVE LIMIT OF GLOTB GETWRD +CONCNT: 0 ;NUMBER OF TIMES CONSTANTS CAN APPEAR (DECREMENTED BY CONSTA) +CONGOL: 0 ;HAS ADR OF FIRST WORD INACTIVE IN CONGLO +NREPC: 0 +SYLOC: 0 ;VAL OF LAST TAG +SYSYM: 0 ;LAST TAG +SYLOC1: 0 ;VALUE OF NEXT TO LAST TAG +SYSYM1: 0 ;NEXT TO LAST TAG +CONDEP: 0 ;DEPTH IN CONSTANTS (0 TOP LEVEL) +VARPNT: 0 ;POINTER TO CURRENT PLACE IN VARTAB +VARCNR: 0 ;NO OF TIMES VARIABLES MAY APPEAR +GETCNR: 105 ;PRIORITY OF UNARY OPS (AOS'D TO CAUSE RIGHT TO LEFT EVALUATION) +ISYMF": -1 ;-1 IF ISYMS HAVE NOT BEEN SPREAD +PRGNM: 0 ;PROG NAME +GLOBT: 0 ;GLSP1 PUSHED DOWN ONE LEVEL AT GETFLD +BITP: 0 ;BYTE PNTR TO CODE BITS IN CURRENT (RELOC) BLOCK +SCINST: 0 ;STRING CONDITIONAL INSTRUCTION +SCONDF: 0 ;STRING CONDITIONAL FLAG, -1 => IDENTICAL, 0 DIFFERENT +BLOCKF: 0 +AIRPT2: 0 ; " , IRP ONLY, BRACKET COUNT (FOR FLUSHING LIST BRACKETS) +LDCCC: 0 ;DEPTH IN LOADTIME CONDS +PARBIT: 0 ;0 OR 4 FOR : OR = +STGSW: 0 ;NON ZERO GIVES ERROR PRINT ON STORAGE WORDS +VCLOC: 0 ;TEM FOR VARIAB +STARTA: 0 ;STARTING ADDRESS FOR SBLK, RIM +BYTM: 0 ;-1 FOR IN BYTE MODE +BYTMC: 0 ;COUNT CORRESP WITH BYTMP +BYTMP: 0 ;POINTER TO BYTE DESC TABLE +BYTMT: 0 ;TOTAL ACTIVE BYTES IN TABLE +CPGN": 0 ; 1 LESS THAN CURRENT PAGE # IN INPUT FILE +CLNN": 0 ; 1 LESS THAN CURRENT LINE # IN INPUT FILE + +;FORMAT OF BYTE DESC TABLE +;SEVEN BIT BYTES +;1.7=0 ASSEMBLE =1 BLANK +;1.1 - 1.6 NUMBER OF BITS +BYTWP: 440000,,BYTW ;POINTER TO BYTW IDPB TO DEPOSIT CURRENT BYTE +BYTW: 0 ;WORD BEING ASSEMBLED IN BYTE MODE +NBYTS: 0 ;NUMBER BYTES ASSEMBLED (FOR .BYTC) +ISAV: 0 ;I FROM FLD AT AGETFLD + +IFN LISTSW,[ +PNTBP: 0 ;POINTER TO LISTING LINE BUFFER +LISTON": 0 ;-1 IF LISTING ON +PNTSW: 0 ;-1 IF LAST CHR CR OR LF +LISTBF: BLOCK 50. +LISTAD: 0 ;ADDRESS OR -1 NONE 3.1 RELOC +LISTWD: 0 ;WORD +LSTRLC: 0 ;RELOCATION +LISTPF: 0 ;-1 OTHERS CONTAIN SOMETHING +LISTBC: 0 ;BREAK CHR CR LF OR FF OR -1 IF NONE SINCE LAST PNTR +LISTTM: 0 ;TEMP AT AEND +PNTSA: BLOCK 20 ;AC SAVE AREA FOR LISTING FEATURE +] + +TOPP: 0 ;POINTER TO TOP OF DMYAGT ACTIVE, POINTS TO FREE REGISTER +BBASE: 0 ;POINTER TO BEGINNING OF ACTIVE DUMMY LIST (FOR DEEPEST-NESTED MACRO BEING EXPANDED) + ;ADD TO DUMMY # TO GET LOCATION CONTAINING CHAR ADR OF DUMMY + +PTAB: (341000+CH1)MACTAB ;BYTE TABLE + (241000+CH1)MACTAB + (141000+CH1)MACTAB + (41000+CH1)MACTAB + (341000+CH1)MACTAB+1 + +PTAB1: (341000)MACTAB + (241000)MACTAB + (141000)MACTAB + (41000)MACTAB + +MACP: 0 ;MAC PDL POINTER +FREEPT: 0 ;MACRO STG PNTR POINTS TO FREE CHAR +GENSM: 0 ;GENERATED SYM COUNT +STRCNT: 0 ;COUNT OF CHARS READ (INCL. DELIM) BY GSYL +STRPNT: 0 ;TEMP AT GSYL, BYTE POINTER TO STRING STORAGE +CPTRB: -1 +RDWRDP: DSTG ;POINTER TO DSTG, POINTS TO FREE WORD + ;NOTE THAT RDWRDP MUST BE SAVED AND RESTORED SINCE MORE MACROS CAN + ;BE EXPANDED DURING FIELD READ FOR DUMMY +MACNM: 0 ;NAME OF MACRO BEING DEFINED +DCNT: 0 ;USED BY WRQOTE CURRENT DEPTH IN DEFINE-IRP-TERMIN LEVEL +PRCALP: PRCAL ;POINTER INTO PRCALP, POINTS TO LAST ACTIVE ENTRY +DMYTOP: 0 ;POINTER INTO DMYDEF, POINTS TO AVAILABLE WORD + ;SINCE ONLY ONE THING CAN BE DEFINED AT ONCE, IT IS NOT NECESSARY TO SAVE AND RESTORE DMYTOP + +PRSTG: ;BEGIN WORDS GARBAGE COLLECTED: FIRST BYTE POINTERS ILDB'D + +PRSCND: 0 ;CHARACTER ADDRESS OF CURRENT LOCATION IN FIRST STRING OF IFSE,IFSN WHILE COMPARING WITH SECOND +PRSCN1: 0 ;CHAR ADDR BEG OF FIRST STRING IFSE, IFSN +PRREPT: 0 ;CHAR ADR BEG OF BODY OF REPT +PRIRP: 0 ;CHAR ADR BEG OF IRP BODY +PRDEF: 0 ;CHAR ADR BEG OF MACRO BEING DEFINED +CPTR: 0 ;ILDB TO GET NEXT CHAR FROM MACRO OR WHATEVER + +PRCAL: REPEAT 10,0 ;TEMP STORAGE FOR CHAR ADR BEG MACRO BODY, USED TO READ DUMMY SPECS + +EPRSTT: ;END CHAR ADR WORDS GARBAGE COLLECTED + + ;BEGIN GARBAGE COLLECTOR VARIABLES + +SYMSTR: 0 ;PNTR TO CHAIN OF MACRO PNTRS IN SYM TABLE (DURING GC), LINKED THROUGH RH'S OF "VALUE" +REDPT: 0 ;CHAR ADR READING FROM WHEN MOVING STRING DOWN + ;GC WRITES WITH FREEPT/FREPTB +COFST: 0 ;AMOUNT CHARS MOVED DOWN BY, SUBTRACTED FROM CHAR ADR TO RELOCATE +SVF: 0 ;FLAG, .GE. 0 => NO POINTERS FOUND POINTING TO CURRENT STRING +FREPTS: 0 ;-> BEGINNING OF CURRENT STRING BEING COPIED DOWN +GCENDF: 0 ;-1 => END OF LAST STRING FOUND, AFTER RELOCATING POINTERS, MSTG2 SHOULD EXIT +REDPTB: 0 ;REDPT IN BYTE POINTER FORM +FREPTB: 0 ;FREEPT IN BYTE POINTER FORM +FRPTBS: 0 ;FREPTS IN BYTE POINTER FORM + +MDEPTH: 0 ;DEPTH IN MACRO (NOT IRP OR REPEAT) EXPANSIONS +PUTCNT: 0 ;AOS'D BY PUTREL, USED BY CALLING ROUTINE, USUALLY TO COUNT ACTIVE CHARS (DURING DEFINITION) +AIRPT: 0 ;IRP EXPANSION TEMP, -1 => NO NON-NULL DUMMYS YET, ELSE 0 +IRPCR: 0 ;COUNT OF A,B,[LIST] GROUPS IN IRP IRPC IRPS, " " " +GCHI: 0 ;GC HIGH POINTER, CHAR ADR FIRST NOT TO GARBAGE COLLECT +A.QOT2: 0 ;DELIMITER FOR .QUOTE +AIRPT1: 0 ;IRP EXPANSION TEMP, IRPS OR IRPW => (0 => CURRENT DUMMY NOT NULL, -1 => NULL) +CRPTCT: 0 ;COUNT THROUGH CURRENT REPEAT (FOR .RPCNT) +CIRPCT: -1 ;COUNT THOUGH CURRENT IRP (FOR .IRPCNT) + + ;INFO CONVENIENT TO ANYONE GENERATING AN OUT OF TIME-SHARING MIDAS + +;MIDAS OUT OF TIME-SHARING ASSEMBLES INTO A COLLECTION OF SUBROUTINES +;IO IS EXPECTED TO BE HANDLED BY OTHER PROGRAMS. + +;EXITS FROM THE ASSEMBLER: +;TPPB OUTPUT BINARY WORD IN A +;TFEED IF OUTPUT DEVICE IS PTP, PUNCH OUT # FRAMES OF BLANK TAPE + ;SPECIFIED BY B, MAY CLOBBER A AND B +;GO2 RETURN POINT FROM FATAL ERRORS +;TYO TYPE OUT CHARACTER IN A +;TAB TYPE OUT A TAB (MAY CLOBBER A OF COURSE) +;RCHTBL SEE THE RCH ROUTINES + +;ENTRIES + +;PDL, LPDL MAY BE USED BY COMMAND PROCESSOR BUT WILL BE CLOBBERED BY MAIN ROUTINES +;MAIN ROUTINES, CALLED WITH JSP A, , CLOBBER THE WHOLE WORLD (INCLUDING P) +;INIT INITIALIZE +;PS1 PASS 1 +;PLOD IF APPROPRIATE, PUNCH OUT LOADER +;PS2 PASS 2 (DOES ITS OWN PARTIAL INITIALIZATION) +;PSYMS PUNCH OUT SYMBOL TABLE + +;OTHER ENTRIES + +;CONTRL AFTER ASSEMBLY, .GE. 0 => RELOCATABLE, .LT. 0 => ABSOLUTE +;ISYMF -1 IF SYMS HAVE NOT BEEN SPREAD, ELSE DON'T TRY TO ADD TO INITIAL SYMBOL TABLE +;SMSRTF -1 IF SYMTAB HASN'T BEEN SORTED, ELSE SYMTAB CLOBBERED, DON'T RE-ASSEMBLE +;MIDVRS .FNAM2 OF MIDAS ENGLISH + +;SOME FF FLAGS ARE GLOBAL SO COMMAND PROCESSOR CAN KNOW WHAT'S HAPPENED ON RETURN + +;COMMAND PROCESSOR MAY ADD TO INITIAL SYMBOL TABLE BEFORE CALLING INIT THE FIRST TIME +;EISYMT IS THE FIRST LOCATION OK TO DUMP INTO +;EISYMP RH SHOULD BE SET BY COMMAND PROCESSOR TO FIRST LOC NOT DUMPED INTO + +;RCH HAS AN ELABORATE SET OF GLOBALS, WHICH I DON'T FEEL LIKE PUTTING DOWN NOW, BUT THEY INCLUDE +;ARCH (GET CHAR) SEMIC, RRL1, RREOF, SEMIC, TYPCTL, GDTAB, CPGN, CLNN, +;RCHMOD, MDSCLR, MDSSET, RCHSET, POPLMB, PSHLMB +;ALSO RCHTBL ONLY EXIT + +;LISTING FEATURE GLOBALS: +;PILPT PRINT CHAR IN A +;LISTON LISTING ON/OFF FLAG, -1 => ON +;LPTCLS END OF LISTING, PRINT FORM FEED, IF TS THEN CLOSE LPT + +LNKTZ: TDZA C,C +LNKTC1: MOVE T,GLSP2 +LINKTC: CAML T,GLSP1 + POPJ P, + SKIPL 1(T) + XORM B,1(T) + SKIPL 1(T) + IORM C,1(T) + AOJA T,LINKTC + +HFWDAD: HRRM A,.+1 + HRRI A,(B) + MOVSS B + HLRM A,.+1 + HRLI A,(B) + POPJ P, + +SGTSY: PUSH P,I + PUSH P,AA + PUSH P,A + PUSH P,B + PUSHJ P,(LINK) +PERIOD: +SGTSY1: + TLO I,10 + TROE I,100 + TRO I,4 + ADD SYM,%.SQ(D) + TRO I,2 + SOJGE D,RRL2 + AOJA D,RRL2 + +GETFLD: PUSH P,GLSP2 + PUSH P,GLSP2 + PUSH P,PPRIME + PUSH P,GLOBT + MOVE A,GLSP1 + MOVEM A,GLOBT + MOVEM P,PPRIME + TRZ I,FLD+OPFLD +GETFD1: TLNE I,MWRD + JRST .+3 ;MULTIPLE WORD, RE-CALL PSEUDO + PUSHJ P,GETSYL + TRNE I,LET + PUSHJ P,GETVAL ;GET OPERAND (MAYBE SKIPS) +GETFD6: MOVE C,CDISP ;GET INFO ON SYLLABLE TERMINATOR + TLNE C,DFLD + JRST (C) ;FIELD OPERATOR, GO PROCESS +GETFD: MOVEI TT,0 ;NO DISP MEANS FD TERMINATOR + TRNE I,SYL + TRO I,FLD + JSP LINK,GETFD2 ;EVALUATE WHATEVER HASN'T BEEN + SUB P,[4,,4] ;NOW POP OFF CRUFT FROM PDL + POP P,GLOBT + POP P,PPRIME + SUB P,[2,,2] + POPJ P, + + ;JSP LINK,GETFDA ;STORE SPECIFICATIONS OF OPERATOR, OPERAND; + ;MAYBE EVALUATE CRUFT ON LEFT + ;A HAS LEFT OPERAND (IF ANY), B RELOCATION BITS, + ;C ADR OF ROUTINE TO PERFORM OPERATION, TT HAS PRECEDANCE OF OPERATOR + +GETFDA: TRO I,FLD+OPFLD + TRNN I,SYL + AOS TT,GETCNR ;UNARY +GETFD2: CAMN P,PPRIME + JRST GETFD3 ;TOP OF LIST + HLRZ T,(P) ;GET PREC + CAMLE TT,T ;COMPARE TO CURRENT + JRST GETFD3 ;WAIT UNTIL LATER + HRRZ T,(P) + JRST (T) ;GO DO IT NOW (ROUTINE RETURNS TO GETFD4) +GETFD4: SUB P,[4,,4] + JRST GETFD2 + ;PDL AS SEEN BY OPERATOR ROUTINES: +GETFD3: PUSH P,GLSP1 ;-3(P) POINTS TO HIGHEST GLOTB ENTRY OF LEFT OPERAND (ALSO JUST BEFORE RIGHT) + PUSH P,B ;-2(P) HAS RELOCATION BITS OF LEFT OPERAND + PUSH P,A ;-1(P) HAS VALUE OF LEFT OPERAND + HRL C,TT + PUSH P,C ;(P) HAS OF OPERATOR + JRST (LINK) + +PLS: MOVEI C,PLS1 ;PLUS SIGN, PLS1 IS ROUTINE TO PERFORM OPERATION + MOVEI TT,10 ;SET UP PRECEDENCE OF 10 FOR +, - + JSP LINK,GETFDA + JRST GETFD1 + +MINUS1: MOVNS A ;NEGATE VALUE OF RIGHT OPERAND + EQVI B,0 + ADD B,[1,,0] + HRRI B,1(B) + MOVE T,-3(P) + PUSH P,B + HRLZI B,MINF + PUSH P,C + PUSHJ P,LNKTZ ;COMPLEMENT THE MINUS FLAG ON GLOBALS IN RIGHT OPERAND + POP P,C + POP P,B +PLS1: ADD A,-1(P) ;ADD VALUES + PUSH P,A + MOVE A,-3(P) + PUSHJ P,HFWDAD + MOVE B,A + POP P,A + JRST GETFD4 + +MINUS: MOVEI C,MINUS1 + JRST PLS+1 + +MULTP: MOVEI C,MULTP1 ;ASTERISK, MULTP1 ROUTINE TO PERFORM MULTIPLICATION + MOVEI TT,20 ;20 PRECEDENCE OF MULTIPLICATION, DIVISION +CBAK2: JSP LINK,GETFDA + JRST GETFD1 + +MULTP1: JUMPE B,MULTP3 ;JUMP ON RIGHT OPERAND NOT RELOCATED + SKIPE -2(P) + JRST MULTP4 ;BOTH OPERANDS RELOCATED + MOVE T,-1(P) ;GET VALUE OF LEFT OPERAND AND FALL IN + JRST .+3 +MULTP3: MOVE T,A ;RIGHT OPERAND NOT RELOCATED, GET VALUE IN T + MOVE B,-2(P) ;RELOCATION BITS OF LEFT OPERAND + MOVE D,-3(P) ;GLOTB POINTER TO BETWEEN OPERANDS + CAME D,-7(P) + JRST GMUL1 ;LEFT OPERAND HAS GLOBALS + CAME D,GLSP1 + JRST GMUL2 ;RIGHT OPERAND HAS GLOBALS + ;AT THIS POINT, T HAS VALUE OF ABS OPERAND, B RELOC BITS OF OTHER +GMUL4: HRLZ D,B ;MULTIPLY VALUES + IMUL D,T + HLRM D,B + HLLZ D,B + IMUL D,T + HLLM D,B + IMUL A,-1(P) + JRST GETFD4 +MULTP4: (1000+SIXBIT /IRL/) ;ILLEGAL RELOCATION * / + JRST GETFD4 + +DIVID: MOVEI C,DIVID1 + JRST MULTP+1 + +GMUL1: TLNE FF,PPSS ;LEFT OPERAND HAS GLOBALS, CHEK RIGHT OPERAND + CAMN D,GLSP1 + SKIPA CH1,A ;LOOKS OK, GET VALUE IN CH1 + (1000+SIXBIT /IMY/) ;ILLEGAL MPY (BOTH OPERANDS GLOBAL DURING PUNCHING PASS) + SKIPA D,-7(P) ;GET GLOTB POINTER TO BOTTOM OF LEFT OPERAND +GMUL2: MOVE CH1,-1(P) ;GLOBALS IN RIGHT OPERAND ONLY, GET LEFT OPERAND +GMUL3: CAML D,GLSP1 + JRST GMUL4 ;TABLE COUNTED OUT + SKIPGE 1(D) + AOJA D,GMUL3 + JUMPE CH1,GMUL5 ;MULTIPLYING BY ZERO, CLEAR OUT GLOTB ENTRY AND LOOP BACK + LDB CH2,[221200,,1(D)] ;PICK UP MULTIPLICATION FIELD THIS GLOBAL + SKIPN CH2 + MOVEI CH2,1 ;0 => 1 + IMUL CH2,CH1 + DPB CH2,[221200,,1(D)] + AOJA D,GMUL3 + + +GMUL5: CLEARM 1(D) + AOJA D,GMUL3 + +DIVID1: JUMPN B,MULTP4 ;JUMP IF RIGHT OPERAND RELOCATED + SKIPE -2(P) + JRST MULTP4 ;LEFT OPERAND RELOCATED + EXCH A,-1(P) + IDIV A,-1(P) + MOVEI B,0 + JUMPGE FF,GETFD4 + MOVE D,-7(P) + CAME D,GLSP1 + (1000+SIXBIT /IDV/) ;AT LEAST ONE OF DIVISION OPERANDS GLOBAL DURING PUNCHING PASS + JRST GETFD4 + + ;LOGIC OPERATORS & (PREC = 40), # (PREC = 34), \ (PREC = 30) + +IORF: MOVEI C,IORF1 ;\ +LOGIC3: MOVEI TT,30 +LOGIC: JRST CBAK2 + +XORF: MOVEI C,XORF1 ;# + TRNN I,SYL ;IF ABOUT TO BE UNARY, + MOVNI A,1 ;THEN TURN LEFT OPERAND INTO -1 + JRST LOGIC3 + +ANDF: MOVEI C,ANDF1 ;& + MOVEI TT,40 + JRST LOGIC + +XORF1: MOVEI D,(XOR A,(P)) + JRST LOGIC1 +IORF1: MOVEI D,(IOR A,(P)) + JRST LOGIC1 +ANDF1: MOVEI D,(AND A,(P)) + + ;COMMON EXECUTION ROUTINE FOR LOGICAL OPERATORS + +LOGIC1: HRLM D,LOGIC2 + JUMPN B,MULTP4 + SKIPE -2(P) ;NOW CHECK RELOCATION OF LEFT OPERAND + JRST MULTP4 +LOGIC2: 777777 + JRST GETFD4 + +CBAKAR: MOVEI C,CBAK1 ;BACKARROW AS FIELD OPERATOR, PREC = 100 + MOVEI TT,100 + JRST CBAK2 + +CBAK1: JUMPN B,MULTP4 ;NO RELOCATION ALLOWED + MOVE T,A + MOVE A,-1(P) + LSH A,(T) + JRST GETFD4 + + ;SEMICOLON (GET HERE FROM RR8) + +SEMIC": PUSHJ P,RCH ;ILDB A,UREDP ;GET CHAR + CAIE A,15 ;CAIG A,15 ;SEE IF SPECIAL + JRST SEMIC ;XCT RPATAB(A) ;SPECIAL => DO SOMETHING +RRU3: PUSH P,[RRL2A] + JRST RRU1 + +RBRAK: SKIPN CONDEP ;RIGHT BRACKET + JRST RRL2 ;NOT IN CONSTANT => IGNORE + JRST RR10 ;IN CONSTANT => TERMINATE WORD + +BCOMP: SKIPE CH1,CPTR + SOS CH1 + IDIVI CH1,A + MOVE CH2,PTAB1(CH2) + ADD CH2,CH1 + MOVEM CH2,CPTRB + POPJ P, + +RRU: SKIPA A,LIMBO1 ;GET HERE WHEN UNRCHF SET AT RR, RETRIEVE CHARACTER FROM LIMBO1 +RRLM2: PUSHJ P,MRCH2C +RRU1: XCT RRR1 + JRST RRL1B + SKIPG CPTRB + PUSHJ P,BCOMP + JRST RRLM4 + +RR4A: AOS CPGN + SETZM CLNN + AOS CLNN + JRST RR4 + +GETSYL: TDZA I,[UARI+NPRC+DECP,,PERI] +GTSL1: TDZ I,[DECP,,PERI] ;RECURSION POINT FROM UA3 TO GET RIGHT OPERAND TO ^ OR _ + CLEARB SYM,NUMTAB + MOVE AA,[NUMTAB,,NUMTAB+1] + AOSN NTCLF + BLT AA,NUMTAB+10 ;NUMTAB NOT CLEAR, HAVE TO CLEAR IT + MOVEI D,6 ;CHARACTER COUNTER FOR BUILDING UP SYM + TDZ I,[FLO+VAR+GLI+LSRET,,LET+SYL] +RRL2: PUSHJ P,RR ;CALL MAIN LOOP ROUTINE, READ UNTIL NON-SQUOZE CHAR +RRL2A: MOVEM A,LIMBO1 ;SYLLABLE OPERATOR OR TERMINATOR IN A, SAVE + TRNE FF,MACRCH + JRST RR4 + CAIN A,12 + AOS CLNN + CAIN A,14 + JRST RR4A + +RR4: HRRZ A,GDTAB(A) ;NOW GET RIGHT HALF OF POPJ, INDEX INTO DTB + MOVE C,DTB-40(A) ;GET DTB ENTRY (FLAGS,,JUMP ADR) + MOVEM C,CDISP ;STORE AS DISPATCH CODE FOR LAST CHAR (SORT OF AN INTERPRETED LIMBO1) +RR8: TLNE C,DSYL ;NOW SEE IF SYL OPERATOR FLAG SET + JRST (C) ;SET => INTRA-SYLLABLE OPERATOR +RR10: TRNN I,SYL ;NOT SET => SYLLABLE TERMINATOR: SYL? + JRST CABPOP ;NO SYL + TRNE I,LET + POPJ P, ;SYL HAS LETTERS + CAMN SYM,[SQUOZE 0,.] + JRST PT1 ;SYM IS . + ;NUMBER + +RR5: TLNN I,NPRC + PUSHJ P,NUMSL +RR6: TLNN I,FLO + JRST RR9 ;NOT FLOATING POINT + MOVE A,B ;FLOATING, HIGH IN AA,LOW IN A,EXP IN B + ADDI A,306 ;201+105 TO ROUND + ADDI AA,200 ;CAUSE EXPONENT TO BE ACCEPTABLE TO MACHINE + JUMPGE AA,.+3 ;NOW CHECK FOR OVERFLOW ON ROUNDING + LSH AA,-1 ;OVERFLOW, SHIFT BACK ONE + AOS A ;INCREMENT EXPONENT TO COMPENSATE FOR SHIFT + EXCH A,AA ;GET EXPONENT IN AA, REST IN A + ASHC AA,-10 ;SHIFT TO MACHINE FLOATING POINT FORMAT + SKIPE AA ;NOW CHECK HIGH ORDER BITS OF EXPONENT NOT SHIFTED INTO NUMBER + (2000+SIXBIT /EPO/) ;EXPONENT OVERFLOW +RR9: TLZ I,GLI+VAR ;NOT TRYING TO DEFINE NUMBER AS VARIABLE OR GLOBAL + JRST CLBPOP ;CLEAR OUT B (RELOCATION BITS OF VALUE) + +LOWRCS: CAIG A,"z ;MAKE A LOWER CASE + CAIG A,"a-1 + POPJ P, + SUBI A,"a-"A + POPJ P, + +ATSGN: MOVSI A,20 ;ATSIGN + IORM A,WRD + TRO I,SYL ;SET FLD FLAG EVEN THOUGH NOT DIRECTLY RETURNING VALUE + JRST RRL2 ;FALL BACK IN + + ;MAIN LOOP ROUTINE FOR GETSYL, READ SYM OR NUMBER + +RRL1: PUSHJ P,RCH +RRL1B: PUSHJ P,LOWRCS + XCT GDTAB(A) ;GOT CHAR, DO SOMETHING APPROPRIATE (POPJ ON NOT SQUOZE) + TROA I,LLET\LET\SYL ;LETTERS RETURN, JUST UPDATED SYM, SET FLAGS + TRO I,LLET\SYL ;NUMBERS RETURN, SET FEWER FLAGS +RRL1A: SOJGE D,RRL1 ;DECREMENT SYM COUNTER AND LOOP + AOJA D,RRL1 ;COUNTER EXHAUSTED, INCREMENT BACK TO 0 AND LOOP +RR: TLZE I,UNRCHF ;RE-INPUT LAST CHARACTER? + JRST RRU ;YES (SOMETIMES RETURN HERE FROM RREOF) +RRR1: TRNN FF,MACRCH + JRST RRL1 + +RRLM1A: SKIPG CPTRB + PUSHJ P,BCOMP +RRLM1: ILDB A,CPTRB + AOS CPTR + TRZE A,200 + JRST RRLM2 +RRLM4: PUSHJ P,LOWRCS + XCT GDTAB(A) ;GOT CHAR, DO SOMETHING APPROPRIATE (POPJ ON NOT SQUOZE) + TROA I,LLET\LET\SYL ;LETTERS RETURN, JUST UPDATED SYM, SET FLAGS + TRO I,LLET\SYL ;NUMBERS RETURN, SET FEWER FLAGS +RRLM4A: SOJGE D,RRLM1 ;DECREMENT SYM COUNTER AND LOOP + AOJA D,RRLM1 ;COUNTER EXHAUSTED, INCREMENT BACK TO 0 AND LOOP +UT141: PUSHJ P,INCHR3 + JRST RRU1 + +MAKNUM: SETOM NTCLF ;NUMTAB ABOUT TO NOT BE CLEAR, SET FLAG FOR GETSYL TO CLEAR IT OUT NEXT TIME + MOVEI AA,2 ;INDEX INTO NUMTAB ETC., SOJGE'D TO GET ALL RADICES + SKIPGE HIGHPT(AA) + JRST MAKNM3 + MOVE T,LOWPT(AA) + MUL T,ARADIX(AA) + MOVEM TT,CH1 ;SAVE UPDATED LOWPT LESS NEW DIGIT + MOVE TT,HIGHPT(AA) + ADD CH1,A ;ADD DIGIT TO LOW PART + TLZE CH1,400000 + AOS T ;OVERFLOW, INCREMENT SPILLOVER FROM MUL OF LOWPT + JFCL 17,.+1 ;NOW CLEAR OV, ETC. + IMUL TT,ARADIX(AA) ;MULTIPLY HIGHPT BY RADIX + ADD TT,T ;ADD HIGH PARTS + JFCL 10,MAKNM2 ;JUMP ON OVERFLOW FROM IMUL OR ADD + TLNE I,FLO + SOS NUMTAB(AA) ;FLOATING, DECREMENT EXP TO COMPENSATE FOR MULT OF HIGHPT/LOWPT + MOVEM TT,HIGHPT(AA) ;NOW STORE STUFF BACK + MOVEM CH1,LOWPT(AA) +MAKNM4: SOJGE AA,MAKNUM+2 ;NOW DO ALL THIS FOR NEXT RADIX + POPJ P, + +MAKNM2: MOVSI B,400000 ;OVERFLOW FROM UPDATING HIGH PARTS + IORM B,HIGHPT(AA) ;SET SIGN BIT +MAKNM3: TLNN I,FLO + AOS NUMTAB(AA) ;NOT FLOATING, INCREMENT EXP, MAY NOT WANT TRAILING BITS + JRST MAKNM4 + +NUMTAB: 0 ;EXPONENT + 0 + 0 +HIGHPT: 0 ;HIGH PART OF CURRENT NUMBER THIS RADIX + 0 ;4.9 => OVERFLOW, TRAILING DIGITS DROPPED + 0 +LOWPT: 0 ;LOW PART OF CURRENT NUMBER THIS RADIX + 0 ;HIGHPT/LOWPT TAKEN AS 70. BIT POSITIVE INTEGER EXCEPT 4.9(HIGHPT) IS FLAG INSTEAD OF + 0 ;EXPONENTIATE 70. BIT INTEGER BY NUMTAB (WHICH MAY BE NEGATIVE) TO GET ACTUAL VALUE +ARADIX: 10 ;CURRENT RADIX + 12 + 10 + +NTCLF: 0 + + ;DECIPHER A VALUE FROM NUMTABS + ;LEAVES HIGH PART IN AA, LOW PART IN A, BINARY EXPONENT IN B + +NUMSL: CLEARB TT,D ;TT BIT EXPONENT, D INDEX INTO NUMTAB, ETC. + PUSHJ P,RDXSEL ;SELECT RADIX, LEAVE INDEX IN D + MOVE AA,HIGHPT(D) ;AA := HIGH PART + MOVE B,LOWPT(D) ;B := LOW PART + MOVE T,NUMTAB(D) ;T := EXPONENT + TLNN I,FLO + JRST FIX ;NOT FLOATING + TLZ AA,400000 ;FLOATING, DON'T NEED DIGITS LOST ON OVERFLOW +NUMC1: JUMPN AA,.+2 ;ENTRY FROM UPARR + JUMPE B,FIX-1 ;COMPLETELY ZERO => RETURN FIXED ZERO + JUMPL T,NUMSL1 ;JUMP IF EXPONENT NEGATIVE + JUMPE T,NUMSL2 ;JUMP (SKIP FOLLOWING) IF EXPONENT ZERO + ;EXPONENT POSITIVE, DO THE APPROPRIATE THING +NUMSL5: MUL B,ARADIX(D) ;MULTIPLY LOW PART BY RADIX + MUL AA,ARADIX(D) ;MULTIPLY HIGH PART BY RADIX + ADD A,B ;A := LOW PART OF HIGH + HIGH PART OF LOW + TLZE A,400000 + ADDI AA,1 ;OVERFLOW ON ADDITION, INCREMENT HIGH PART OF HIGH + MOVE B,C ;NO LONGER NEED HIGH OF LOW, GET LOW OF LOW IN B +NUMSL3: JUMPE AA,NUMSL4 ;NOW CHECK FOR OVERFLOW INTO HIGH OF HIGH, JUMP ON NONE + ASHC A,-1 ;NEXT THREE INSTRUCTIONS TO DO ASH3 AA,-1 + ASH A,1 + ASHC AA,-1 + AOJA TT,NUMSL3 ;INCREMENT BIT EXPONENT AND TRY AGAIN + +NUMSL4: MOVE AA,A ;FLUSHED OVERFLOW, NOW GET (LOW PART OF) HIGH PART IN AA + SOJG T,NUMSL5 ;COUNT DOWN + +NUMSL2: SKIPA A,B ;EXPONENT NOW ZERO, GET LOW PART OF NUMBER IN A +NUMSL7: ASHC AA,1 ;NOW NORMALIZE + TLNN AA,200000 + SOJA TT,NUMSL7 + SKIPA B,TT ;DONE NORMALIZING, RETURN BINARY EXPONENT IN B +PT1: TRO I,LET + POPJ P, + + TLZ I,FLO +FIX: LSHC A,45 + LSHC AA,-1 + JUMPE AA,.+2 + (2000+SIXBIT /XSG/) ;SIG CHECK + POPJ P, + +RDXS1: MOVEI D,0 ;ENTRY FOR D NOT ALREADY CLEAR OR STRANGE DEFAULT +RDXSEL: TLNE I,DECP ;SELECT A RADIX, LEAVE IN D THE INDEX INTO NUMTABS + MOVEI D,1 ;. => PREFER DECIMAL + TLNE I,VAR + MOVEI D,2 ;' => PREFER OCTAL, WINS OVER . SO FLOATING POINT NUMBER MAY BE OCTAL + TLNE I,GLI + MOVEI D,0 ;" => PREFER CURRENT RADIX, WINS OVER ALL ELSE + POPJ P, + +NUMSL8: LSH B,1 ;EXPONENT NEGATIVE: NORMALIZE NOW + ASH AA,1 + TLZE B,400000 + TRO AA,1 +NUMSL1: TLNN AA,200000 + SOJA TT,NUMSL8 ;NOT NORMALIZED YET + IDIV AA,ARADIX(D) ;DIVIDE HIGH PART BY APPROPRIATE RADIX + ADD B,A + MOVEI A,0 ;NOW TURN A/B INTO DOUBLE PRECISION POSITIVE VERSION OF C(B) + TLZE B,400000 + MOVEI A,1 + DIV A,ARADIX(D) + MOVE B,A + AOJL T,NUMSL1 + JRST NUMSL7+1 + +UPARR: TRON I,SYL + JRST UPCTRC ;"UNARY UPARROW" => GOBBLE CHARS + TRNE I,LET + (2000+SIXBIT /ILF/) ;ILF, LETTERS IN LEFT OPERAND TO UPARROW + PUSHJ P,NUMSL ;DECIPHER NUMTABS + TLO I,UARI ;SET INDICATOR (USED BY BACKARROW) + PUSHJ P,UA3 ;GET RIGHT OPERAND IN T + TLZ I,UARI + MOVE TT,B ;EXPONENT + MOVE B,A ;LOW PART + PUSHJ P,RDXS1 ;SELECT RADIX (I WAS SAVED & RESTORED BY UA3) + PUSHJ P,NUMC1 ;T EXP HIGH IN AA LOW IN B TT BIN EXP + TLNE I,FLO + JRST RR7 ;FLOATING, ALREADY SET UP OK + ASHC AA,(B) ;FIXED, FIX IT NOW + JUMPE AA,.+2 + (2000+SIXBIT /XSG/) ;SIG CHECK + MOVEI B,0 +RR7: MOVE C,CDISP + TLO I,NPRC + JRST RR8 + +UA3: JSP LINK,SGTSY ;PUSH I,AA,A,B + PUSHJ P,RCH + CAIN A,"- + TROA I,GMINF + TLO I,UNRCHF + PUSHJ P,RCH + CAIN A,"< + JRST UAR1 + TLO I,UNRCHF + PUSHJ P,GTSL1 ;GOBBLE SYL, LOOP POINT FOR PSEUDO OR MACRO RETURNED WITHOUT VALUE + TRNN I,LET + TLNE I,FLO + (2000+SIXBIT /ILF/) ;ILF +UAR2: TRZN I,GMINF + SKIPA T,A + MOVN T,A + MOVEI TT,SGTSY1 + JSP LINK,POPLIS + POPJ P, + +UAR1: TLO I,LSRET + PUSHJ P,LSSTH + PUSH P,A + PUSHJ P,RCH + CAIN A,"! + JRST .-2 + HLRZ T,GDTAB(A) + CAIE A,". + CAIE T,(POPJ P,) + (2000+SIXBIT /ILF/) + HRRZ A,GDTAB(A) + MOVE A,DTB-40(A) + MOVEM A,CDISP + POP P,A + JUMPN B,RLCERR ;RELOC ERR + JRST UAR2 + +BAKAR: TLNE I,UARI + JRST RR5 ;RETURN TO UPARROW (WILL COME BACK HERE LATER) + TRNE I,SYL + TRNE I,LET + JRST BAK1 ;NO SYL, OR SYL IS NAME + CAMN SYM,[SQUOZE 0,.] + JRST BAK1 ;. ALSO NAME + TLZN I,NPRC + PUSHJ P,NUMSL + PUSHJ P,UA3 + ADD B,T + ASHC AA,(B) + LSH A,1 + LSHC AA,-1 + CLEARB B,AA + TLZ I,FLO + POPJ P, + +BAK1: MOVE TT,[DFLD,,CBAKAR] + MOVEM TT,CDISP + JRST RR10 + +DQUOTE: TRON I,SYL + JRST DQ1A + TLO I,GLI + JRST RRL2 + +UPCTRC: PUSHJ P,RCH + TRZA A,100 +DQ1A: PUSHJ P,RCH +DQ1: PUSH P,A + PUSHJ P,GETSYL + TROE I,SYL + (2000+SIXBIT /ILF/) + JRST POPAJ + +SQUOTE: TRON I,SYL + JRST .+3 + TLO I,VAR + JRST RRL2 + PUSHJ P,RCH + SUBI A,40 + TRNN A,100 + JUMPGE A,DQ1 + 2000,,(SIXBIT /N6B/) ;NOT SIXBIT + JRST DQ1 + + ;JSP CH2,RR2 => DIGIT (FROM GDTAB) + +RR2: SUBI A,60 ;CONVERT TO VALUE + TRNE I,LET + JRST RR2A ;NAME + TRZE I,PERI + TLO I,FLO ;FLOATING POINT + PUSHJ P,MAKNUM ;UPDATE NUMTABS +RR2A: XCT NSQTB(A) ;UPDATE SYM + JRST 1(CH2) ;SKIP-RETURN + +NSQTB: IRPC Q,,0123456789 + ADD SYM,%!Q!SQ(D) +TERMIN + + ;VARIOUS PUSH AND POP ROUTINES, ALL CALLED W/ JSP LINK, + +SAVWD1: PUSH P,LSYL + PUSH P,LSYLR + +SAVWLD: PUSH P,FORMAT + PUSH P,FORPNR + PUSH P,FLDCNT + PUSH P,GLSP2 + PUSH P,I + PUSH P,WRD + PUSH P,WRDRLC + PUSH P,SYM + PUSHJ P,(LINK) +SAVL1=. + + ;(ALMOST) GENERALIZED POP ROUTINE + +POPLIS: POP P,F ;FIRST ENTRY ON PDL PC STORED BY PUSHJ AT END OF PUSH ROUTINE + CAIE TT,(F) ;TT SHOULD BE INDEPENDENTLY SET UP BY CALLING ROUTINE W/ SAME VALUE + (SIXBIT /IAE/) ;ROUTINE VERIFIES THIS AND KILLS ASSEMBLY IF DISAGREE + +POPLS1: HLRZ F,-2(TT) ;NOW FOR THE ACTUAL POPPING: GET NEXT PREV. INSTRUCTION IN PUSH ROUTINE + CAIE F,(PUSH P,) ;IF NOT PUSH + JRST (LINK) ;THEN DONE, RETURN + POP P,@-2(TT) ;PUSH, POP OFF WORD PUSHED + SOJA TT,POPLS1 + + ;POP OFF WHAT PUSHED BY SAVWLD (FOR WHICH POPLIS DOESN'T WORK) + +USVWLD: POP P,SYM + HRRZS SYM + CAIE SYM,SAVL1 + (SIXBIT /IAE/) + POP P,SYM + POP P,WRDRLC + POP P,WRD + TDZ I,[-1-(WRDF)] + IOR I,(P) + POP P,1(P) + POP P,GLSP2 + POP P,FLDCNT + POP P,FORPNR + POP P,FORMAT + JRST (LINK) + + ;PUSH INPUT STATUS IN FAVOR OF MACRO + ;B HAS RETURN ADR FOR END OF MACRO (OR WHATEVER) + ;SEE ALSO PMACP + +PUSHEM: PUSH P,A + PUSH P,F + MOVE F,MACP ;GET MACRO PDL POINTER + HRR A,CPTR + HRL A,BBASE + PUSH F,A + HRL B,LIMBO1 + TLZE I,UNRCHF + TLO B,400000 + TROE FF,MACRCH + TLO B,200000 + TRZE FF,TTYRCH + TLO B,100000 + PUSH F,B + MOVE A,[254000,,MRCH] + MOVEM A,GETCHR + JRST PSHM1 + + ;UNDO A PUSHEM + ;RETURNS BBASE,,CPTR IN B (CPTR RE-INITIALIZED, BBASE NOT) + +POPEM: PUSH P,A + PUSH P,F + MOVE F,MACP + POP F,A + TLZ I,UNRCHF + TLZE A,400000 + TLO I,2000 + TRZ FF,MACRCH+TTYRCH + TLZE A,200000 + TRO FF,MACRCH + TLZE A,100000 + TRO FF,TTYRCH + HLRZM A,LIMBO1 + TRNN FF,TTYRCH + JRST POPEM2 + MOVE A,[PUSHJ P,RCHA] + MOVEM A,GETCHR + JRST POPEM1 +POPEM2: MOVE A,[PUSHJ P,INCHR] + TRNN FF,MACRCH + MOVEM A,GETCHR +POPEM1: POP F,B + HRRM B,CPTR +PSHM1: SETOM CPTRB + MOVEM F,MACP ;STORE BACK MACRO PDL POINTER +POPFAJ: POP P,F +POPAJ: POP P,A + POPJ P, + + ;READ CHARACTER INTO A FROM INPUT FILE, MACRO, OR WHATEVER (RCH) + +ARCH": +RCH: TLZE I,UNRCHF + JRST RCH1 ;RE-INPUT LAST ONE MAYBE GET HERE FROM GETCHR+2 +GETCHR: PUSHJ P,INCHR + CAIN A,12 + AOS CLNN + CAIN A,14 + JRST RCH3 +RCH2: +RCH4: MOVEM A,LIMBO1 ;GOT CHAR, SAVE AS LAST CHAR GOTTEN +IFN LISTSW,[ + AOSN PNTSW + PUSHJ P,PNTR + CAIG A,15 + JRST RCHL1 +RCHL3: IDPB A,PNTBP +] +TYPCTL": POPJ P, ;OR JRST SOMEWHERE + +IFN LISTSW,[ +RCHL1: CAIE A,15 + CAIN A,12 + JRST RCHL2 + CAIE A,14 + JRST RCHL3 +RCHL2: MOVEM A,LISTBC + SETOM PNTSW + JRST TYPCTL +] + +RCH3: SETZM CLNN + AOS CLNN + AOS CPGN + JRST RCH4 + +RCH1: MOVE A,LIMBO1 +IFN LISTSW,CAILE A,15 + POPJ P, +IFN LISTSW,[CAIE A,15 + CAIN A,12 + JRST RCHL2 + CAIE A,14 + POPJ P, + JRST RCHL2 +] + +MRCHR: POP P,B +MRCH: SKIPG CPTRB + PUSHJ P,BCOMP +MRCH2B: ILDB A,CPTRB + AOS CPTR + TRZN A,200 + JRST RCH4 +MRCH2C: PUSH P,B + CAIN A,176 + JRST MRCHR + CAIE A,177 + CAIN A,175 + JRST MRCH1 + MOVE B,A + ADD B,BBASE + MOVE A,(B) + MOVEI B,RCHSAV + PUSHJ P,PUSHEM + HRRM A,CPTR + MOVE A,TOPP + MOVEM A,BBASE + JRST MRCHR + +MRCH1: MOVE B,MACP + POPJ B, ;RETURN AT END OF STRING EXPANSION + +RCHSV1: SOS MDEPTH ;END OF MACRO EXPANSION, DECREMENT DEPTH IN MACRO EXPANSIONS + PUSH P,A + MOVE B,TOPP +RCHSV3: CAMG B,BBASE + JRST RCHSV2 + HLRZ A,-1(B) + ADD A,-1(B) + MOVEI A,1(A) + CAME A,FREEPT + JRST RCHSV2 + HRRZ A,-1(B) ;GET NEW FREEPT + MOVEM A,FREEPT + SOJA B,RCHSV3 + +RCHSV2: POP P,A + ;RETURN ROUTINE FOR END OF DUMMY +RCHSAV: MOVE B,BBASE + MOVEM B,TOPP + PUSHJ P,POPEM + HLRM B,BBASE +REPT6: TRZE FF,MRSW + POPJ P, ;RETURN TO .GO + POP P,B + JRST RCH + + ;GET IN B THE CHAR WHOSE ADR IS IN A, INCREMENT A + +REDINC: MOVE CH1,A + IDIVI CH1,4 + LDB B,PTAB(CH2) + AOJA A,CPOPJ + +;MACRO PROC FLAGS (IN LH(LINK)) + +SCEND==200 ;SCAN END +GENF==400 ;GENERATED ARGS +LNSCN==1000 ;ACTIVATE LINE SCAN ON LAST LINE +ALNSCN==2000 ;LINE SCAN ACTIVE +;400000 SAYS COMMAS DO NOT BREAK ARG +RDRPTF==4000 ;REPEAT +LCRIND=10000 ;CR SEEN AFTER RIGHT BRACKET + +RDWRDA: PUSHJ P,ADDTR1 + PUSHJ P,RCH ;ENTRY FROM STRING COND, AREPEAT ETC + TLNE LINK,ALNSCN + JRST RDWR3 ;DONT QUIT UNTIL CR OR LF + CAIN A,LBRKT + JRST RDWR1 ;IF FIRST CHAR LBRACK, READ UNTIL MATCHING RBRACK + CAIN A,"\ ;IF FIRST CHAR \ + JUMPGE LINK,RDWR6 ;AND NORM ARG READ, THEN PROCESS FIELD +RDWR3: CAIE A,15 ;ON CR + CAIN A,12 ;OR LF + JRST RDWR2C ;EXIT + CAIN A,"; ;ON SEMI + JUMPGE LINK,RDWR2D ;ON NORMAL SCAN CAUSE SEMI TO BE REINPUT AND RET +REPT5: CAIN A,", ;IF COMMA + JUMPGE LINK,RDWR2 ;END THIS ARG +RDWR5: PUSHJ P,PUTREL ;NOTA, DEPOSIT THIS CHR + PUSHJ P,RCH ;GET NEXT CHR + JRST RDWR3 ;AND LOOP BACK,NOT CHECKING FOR LBRKT OR \ + +RDWR2D: TLO I,UNRCHF + JRST RDWR2C + +RDWR7: MOVE A,LIMBO1 + CAIE A,15 + CAIN A,12 +RDWR2C: TLO LINK,SCEND ;SCAN ENDED +RDWR2: MOVE T,A ;RET LAST CHR IN T + TLNE LINK,RDRPTF ;ON REPEAT, + POPJ P, ;THATS ALL RETURN +RDWR2A: HRL A,PUTCNT ;SAVE COUNT OF LENGTH THIS ARG IN CHRS + HRR A,RDWRDP + HLLM A,-1(A) +STPWR: MOVEI A,375 ;WRITE STOP CODE +PUTREL: MOVE CH1,FREEPT + IDIVI CH1,4 + DPB A,PTAB(CH2) + AOS A,FREEPT + AOS PUTCNT + CAMGE A,MMAXMC + POPJ P, + MOVEM A,GCHI + + ;GARBAGE COLLECT THE MACRO TABLE + +GC: MOVEM 17,GCSV+15 + MOVE 17,[2,,GCSV] + BLT 17,GCSV+14 + SOSE NGCS + JRST NOCORM + .SUSET [.RMEMT,,A] + ASH A,-10. + .CORE 1(A) + JRST NOCORM + MOVEI A,3 + MOVEM A,NGCS + MOVEI A,TEXT8 + ADDM A,MAXMAC + ADDM A,MMAXMC +NOCORM: SETZB T,GCENDF + MOVEI A,3 + MOVEM A,REDPT ;SET UP FOR READING + MOVEM A,FREEPT ;ALSO FOR WRITING + SETOM CPTRB + MOVE A,[141000,,MACTAB] ;ALSO SET UP CORRESPINDING BYTE POINTERS + MOVEM A,FREPTB + MOVEM A,REDPTB +SYMMG: MOVSI A,-SMK ;NOW SET UP MACRO LIST; T INITIALLY HAS 0 => END OF LIST DURING COMPUTATION + ;POINTS TO FIRST MACRO SYMTAB ENTRY ON LIST + LDB B,[400400,,ST(A)] ;GET SQUOZE FLAGS THIS SYM + CAIN B,PSUDO_-14. ;PSEUDO? (=> MAYBE MACRO) + JRST SYMMG1 ;YES, MAYBE PUT ON LIST (RETURNS TO SYMMG2) +SYMMG2: AOS A + AOBJN A,.-4 ;LOOP FOR ENTIRE SYMTAB + MOVEM T,SYMSTR ;STORE INITIAL LIST ENTRY FOR MACROS + ;DROPS THROUGH + ;GC DEALS WITH "UNIT STRINGS", EACH STRING ENDS WITH 375 + ;GENERAL PROCEDURE IS TO COPY A STRING DOWN THEN SEARCH FOR POINTERS TO WHERE STRING USED TO BE + ;IF POINTERS FOUND THEY ARE RELOCATED TO POINT TO COPIED DOWN STRING + ;IF POINTERS ARE NOT FOUND THE STRING IS WIPED OUT + ;DROPS THROUGH + +MSTG: MOVE C,REDPT ;SET UP C TO POINT TO BEG OF STRING BEING READ + ;(FOR EVENTUALLY SEARCHING FOR POINTERS TO STRING, NOTE C STAYS AROUND FOR AWHILE) + MOVE TT,FREEPT + MOVEM TT,FREPTS ;-> BEGINNING OF WRITTEN STRING + MOVE TT,FREPTB + MOVEM TT,FRPTBS ;BYTE POINTER -> BEGINNING OF WRITTEN STRING + PUSHJ P,RDTRNS ;COPY CHARACTER + MOVE TT,B ;SAVE CHARACTER JUST COPIED +MSTG1: CAML LINK,GCHI + JRST GCEND ;JUST READ LAST CHAR IN PART OF MACTAB TO GARBAGE COLLECT => DONE + CAIN B,375 + JRST MSTG2 ;END THIS STRING, NOW SEARCH FOR POINTERS, RETURNS TO MSTG +MSTG1B: PUSHJ P,RDTRNS ;STRING NOT EXHAUSTED, COPY NEXT CHAR + JRST MSTG1 + +ADDTR1: CLEARM PUTCNT +ADDTRN: MOVE A,FREEPT +ADDTR2: MOVEM A,@RDWRDP + AOS A,RDWRDP + CAIL A,DSTG+DSSIZ + (SIXBIT /TMA/) +CRDWR7: POPJ P,RDWR7 + + ;PROCESS FIELD + +RDWR6: SOS RDWRDP ;BACK UP RDWRDP, MAY BE USED BY MACRO IN FIELD + PUSH P,LINK ;SAVE LINK, NEED FLAGS + PUSHJ P,AGETFD ;GET THE FIELD + (1000+SIXBIT/USM/) + POP P,LINK + MOVE CH1,A ;SAVE VALUE OF FIELD FROM CLOBBERAGE + PUSHJ P,ADDTR1 ;RE-GENERATE DUMMY + PUSH P,CRDWR7 ;RETURN TO RDWR7 +RDWR6A: LSHC CH1,-35. ;NOW "TYPE OUT" VALUE OF FIELD IN CURRENT RADIX + LSH CH2,-1 + DIV CH1,ARADIX + HRLM CH2,(P) + JUMPE CH1,.+2 + PUSHJ P,RDWR6A + HLRZ A,(P) + ADDI A,60 + JRST PUTREL ;OUTPUT TO MACTAB STRING BEING DEFINED + +RDWR1: TDZA C,C ;READ UNTIL RIGHT BRACKET +RDWR1A: PUSHJ P,PUTREL + PUSHJ P,RCHCNT + JRST RDWR1A + + TLNE LINK,RDRPTF + JRST RDWR2 ;REPEAT, SKIP FOLLOWING + +RDWR2B: PUSHJ P,RCH + TLO I,UNRCHF + CAIE A,15 + CAIN A,12 + TLO LINK,SCEND+LCRIND ;CR OR LF + JRST RDWR2 + +PUT1: IDIVI CH1,4 + DPB A,PTAB(CH2) + POPJ P, + + ;COPY CHARACTER DOWN (REDPTB -> FREPTB) + ;LEAVE INCREMENTED REDPT IN LINK, FREEPT IN A, CHAR IN B + +RDTRNS: ILDB B,REDPTB + IDPB B,FREPTB + AOS LINK,REDPT + AOS A,FREEPT + CAMG A,MAXMAC + POPJ P, + PUSH P,A +MACCUP: PUSHJ P,EXTCOR + MOVEI A,TEXT8 + ADDM A,MAXMAC + ADDM A,MMAXMC + POP P,A + POPJ P, + +SYMMG1: HRRZ B,ST+1(A) ;PSEUDO FOUND IN SYMTAB, GET "VALUE" + CAIE B,MACCL ;MACCL? (=> MACRO, CHAR ADR OF BODY IN LH) + JRST SYMMG2 ;NO, JUST FALL BACK INTO LOOP + HRRM T,ST+1(A) ;MACRO, REPLACE MACCL PART OF VALUE WITH POINTER TO NEXT + MOVEI T,ST+1(A) ;UPDATE T (INITIAL LIST ENTRY) TO POINT TO WORD JUST CLOBBERED + JRST SYMMG2 + +GCEND: SETOM GCENDF ;DONE READING FROM MACTAB, BUT FIRST HAVE TO RELOCATE POINTERS TO LAST STRING +MSTG2: CLEARM SVF ;NO POINTERS FOUND TO STRING YET + MOVE D,REDPT + SUB D,FREEPT + MOVEM D,COFST ;STORE AMOUNT CHARS COPIED DOWN BY FOR CHAR ADR RELOCATION + MOVE B,REDPT + CAIE TT,374 + JRST MSTG3 ;NOT A MACRO + MOVE T,SYMSTR + JUMPE T,MSTG3 ;JUMP IF NO MACROS ON LIST +MSTG5: HLRZ TT,(T) ;GET CHAR ADR THIS MACRO + CAML TT,C ;SKIP IF POINTS BELOW BEGINNING THIS STRING + CAML TT,B ;SKIP UNLESS POINTS TO OR ABOVE FIRST CHAR NOT YET READ + JRST MSTG4 ;DOESN'T POINT TO THIS STRING + SETOM SVF ;POINTS TO THIS STRING, SET FLAG TO SAVE STRING + SUB TT,COFST ;RELOCATE + HRLM TT,(T) ;STORE BACK UPDATED CHAR ADR THIS MACRO +MSTG4: HRRZ T,(T) ;NOW GET POINTER TO NEXT MACRO + JUMPN T,MSTG5 ;LOOP FOR ALL MACROS ON LIST + +MSTG3: MOVE T,TOPP + MOVEI CH1,DMYAGT + PUSHJ P,MSCN ;RELOCATE POINTERS IN DUMMY ARG TABLE + HRRZ T,MACP + HRROI CH1,MACPDL + PUSHJ P,MSCN ;RELOCATE POINTERS IN MACRO PDL + HRRZ T,PRCALP + AOS T + MOVEI CH1,PRSTG + PUSHJ P,MSCN ;RELOCATE POINTERS IN PRSTG + HRRZ T,RDWRDP + MOVEI CH1,DSTG + PUSHJ P,MSCN ;RELOCATE DUMMY ARGS READ (OR BEING READ) IN BUT NOT YET ACTIVATED +MSTG13: SKIPGE GCENDF + JRST GCEND1 ;EXIT + MOVE TT,FREPTS + SKIPL SVF + MOVEM TT,FREEPT + MOVE TT,FRPTBS + SKIPL SVF + MOVEM TT,FREPTB + JRST MSTG + + ;GET HERE WHEN MSTG2 FINISHES WITH FLAG SET TO EXIT: UNDO INITIALIZATION AND RETURN + +GCEND1: +USYMG: MOVE T,SYMSTR + MOVEI A,MACCL + JUMPE T,USYMG1 + HRRZ TT,(T) ;GET ADR ON LIST + HRRM A,(T) ;CLOBBER RH JUST GOT NEXT POINTER FROM TO MACCL + MOVE T,LDRB + JRST GCEND1+2 + +USYMG1: MOVS 17,[2,,GCSV] + BLT 17,17 + POPJ P, ;EXIT FROM GARBAGE COLLECTOR + + ;GC ROUTINE TO SCAN TABLE AREA FOR POINTERS TO CURRENT STRING + ;CH1 -> BEGINNING OF TABLE, 4.9 => LOOK AT PAIRS SKIPPING SECOND OF EACH PAIR + ;T POINTS TO LAST WORD IN TABLE + 1 + ;RELOCATE POINTERS IN TABLE POINTED TO + ;C POINTS TO BEGINNING OF STRING, B -> END + 1 + +MSCN: CAIG T,(CH1) + POPJ P, ;TABLE EXHAUSTED + HRRZ TT,-1(T) ;GET LAST ENTRY IN TABLE (UPPER POINTER UPDATED TO COUNT DOWN) + CAML TT,C + CAML TT,B + JRST MSCN1 ;DOESN'T POINT TO CURRENT STRING + SUB TT,COFST ;POINTS TO STRING, RELOCATE + HRRM TT,-1(T) ;STORE BACK RELOCATED POINTER + SETOM SVF ;SET FLAG TO SAVE STRING +MSCN1: SKIPGE CH1 + SOS T ;CH1 NEGATIVE => SKIP A WORD + SOJA T,MSCN + +MACCL: MOVSI 17,-14 ;MACRO EXPANSION TIME + PUSH P,2(17) + AOBJN 17,.-1 + AOS PRCALP + AOS MDEPTH + PUSH P,RDWRDP + MOVEI LINK,0 + HLRZ A,B + PUSHJ P,REDINC + CAIE B,374 + (SIXBIT /IAE/) + PUSHJ P,REDINC + SKIPN B + TLO I,UNRCHF ;SAVE CHR FOLLOWING MACRO W/NO ARGUEMENTS + MOVEM A,@PRCALP + MOVE A,LIMBO1 + CAIE A,15 + CAIN A,12 + JRST MAC2A ;NO ARGS SUPPLIED + JUMPE B,MAC4 ;JUMP IF NO DUMMIES IN DEF + TRZE B,200 + TLO LINK,LNSCN +MAC3: PUSH P,B + TLNE LINK,LNSCN + SOJE B,MAC3A +MAC3B: PUSHJ P,RDWRDA + POP P,B + TLNE LINK,SCEND + SOJA B,MAC2 + SOJG B,MAC3 +MAC4: MOVE A,@PRCALP +MAC1: PUSHJ P,REDINC + MOVEM A,@PRCALP + JUMPE B,MAC1A +MAC5: PUSH P,B + TLNE LINK,SCEND + PUSHJ P,GENSYM + TLNN LINK,SCEND + PUSHJ P,RDWRDA + POP P,B + SOJG B,MAC5 +MAC1A: MOVEI B,RCHSV1 ;RETURN TO RCHSV1 ON END OF MACRO + PUSHJ P,PUSHEM ;ENTRY FROM .TTYMAC + MOVE A,@PRCALP + MOVEM A,CPTR + POP P,A + PUSHJ P,DMYTRN + SOS PRCALP +MACC2: MOVSI 17,-13(P) + HRRI 17,2 + BLT 17,15 +MACC1: SUB P,[14,,14] +MACCR: POP P,A + HRRZS A + CAIE A,GETFD6 + (SIXBIT /IAE/) + JRST GETFD1 + +MAC2A: TLO LINK,SCEND ;NO ARGS SUPPLIED TO MACRO + TRZ B,200 +MAC2: SOJL B,MAC4 ;DONE SCANNING ARGS + MOVEI A,0 ;MORE DUMMIES IN DEF, + PUSHJ P,ADDTR2 ;GENERATE NULL DUMMY + JRST MAC2 + +MAC3A: TLO LINK,ALNSCN+400000 + JRST MAC3B + +GENSYM: PUSHJ P,ADDTR1 + MOVEI A,5 + MOVEM A,SCKSUM + MOVEI A,"G + PUSHJ P,PUTREL + PUSH P,[RDWR2A] + AOS A,GENSM + IDIVI A,10 + HRLM B,(P) + SOSLE SCKSUM + PUSHJ P,.-3 + HLRZ A,(P) + ADDI A,60 + JRST PUTREL + + ;ACTIVATE DUMMYS ON TOP OF DSTG TABLE + ;A -> FIRST (LOWEST) DUMMY IN DSTG TO ACTIVATE + +DMYTRN: MOVE B,TOPP + MOVEM B,BBASE + PUSH P,A +DMYTR2: CAML A,RDWRDP + JRST DMYTR1 + MOVE B,(A) + MOVEM B,@TOPP + AOS B,TOPP + CAIL B,DMYAGT+DMYAGL + (SIXBIT /TMD/) + AOJA A,DMYTR2 +DMYTR1: POP P,RDWRDP + POPJ P, + +A.GSYL: MOVNI D,100000 ;GET SYL FOR .GO WHILE LOOKING FOR TAG + MOVEM D,STRCNT ;STRCNT .LT. 0 SIGNAL FOR GSYL TO JRST (F) + TDZA SYM,SYM +GSYL: CLEARB SYM,STRCNT + MOVEI D,6 + MOVE T,[440700,,STRSTO] + MOVEM T,STRPNT +GSYL3: AOSG A,STRCNT + JRST GSYL2 + PUSHJ P,RCH + IDPB A,STRPNT ;STORE CHAR IN STRING EVEN IF DELIMITER (MINIMUM STRCNT = 1) +GSYL2A: PUSHJ P,LOWRCS + CAIN A,". + JRST GSYL1C + HLRZ CH1,GDTAB(A) + CAIN CH1,(JSP CH2,) + JRST GSYL1A ;NUMBER + PUSHJ P,GSYL1B ;RETURN ONLY ON SYL SEP + HRRZ A,GDTAB(A) + MOVE T,LIMBO1 +C%: POPJ P,"% + +GSYL2: ILDB A,A.GST3 + TRZN A,200 + JRST GSYL2A + CAIG A,100 + JRST GSYL2 + HRROI T,(A) + POPJ P, + +GSYL1B: XCT GDTAB(A) ;POPJ FOR SYL SEPS + SUB P,[1,,1] +GSYL1D: SOJGE D,GSYL3 + AOJA D,GSYL3 + +GSYL1C: ADD SYM,%.SQ(D) + JRST GSYL1D + +GSYL1A: XCT NSQTB-60(A) + JRST GSYL1D + +STRTYP: PUSHJ P,REDINC ;DEBUGGING AID ONLY + EXCH A,B + TRZE A,200 + JRST STRTP1 +STRTP2: PUSHJ P,TYO" ;NORMAL CHAR, JUST TYPE OUT + MOVE A,B + JRST STRTYP + +STRTP1: PUSH P,A + MOVEI A,"* ;SPECIAL CHAR, TYPE * + PUSHJ P,TYO + POP P,A + TRNE A,100 + JRST STRTP3 ;CONTROL CHAR + ADDI A,260 ;DUMMY, CONVERT TO # + JRST STRTP2 ;TYPE OUT (SINGLE DIGIT) NUMBER + +STRTP3: CAIN A,175 + SKIPA A,C% ;STOP, TYPE % + MOVEI A,"/ ;SOMETHING ELSE, TYPE / + JRST STRTP2 + +WRTSS: MOVE T,[440700,,STRSTO] ;COPY STRING STORAGE (INCL DELIMITER) INTO MACTAB: GET INPUT POINTER + MOVE B,STRCNT ;GET COUNT + SOJL B,CPOPJ ;DECREMENT COUNT, RETURN IF DONE + ILDB A,T ;GET CHAR FROM STRING + PUSHJ P,PUTREL ;COPY OUT + JRST .-3 + +ADEFINE: MOVEI A,DMYDEF + MOVEM A,DMYTOP + PUSHJ P,GETSYL + JUMPE SYM,.-1 ;KEEP TRYING UNTIL MACRO NAME THERE + MOVEM SYM,MACNM + MOVE A,FREEPT + MOVEM A,PRDEF + CLEARB LINK,B ;B COUNT + MOVEI A,374 + PUSHJ P,PUTREL ;MARK BEGINNING OF MACRO + MOVE T,LIMBO1 +DEFNC: CAIE T,12 + CAIN T,15 + JRST DEFNA ;NO MORE ARGS (DONE WITH LINE) + CAIN T,"\ + JRST DEFNB + CAIN T,"/ + JRST DEFNE +DEFND: PUSHJ P,PDEF + JUMPE SYM,DEFNC ;JUMP IF NO DUMMY DEFINED + AOJA B,DEFNC ;DUMMY NAME THERE, INCREMENT COUNT + +DEFNE: TRO B,200 ;LAST DELIMITER WAS SLASH, SET FLAG +DEFNB: MOVE A,B ;ENTRY FOR LAST DELIM WAS BACKSLASH + PUSHJ P,PUTREL + MOVEI B,0 + TRO LINK,GENF + JRST DEFND + +DEFNA: MOVE A,B ;END OF DEFINE LINE, GET COUNT + PUSHJ P,PUTREL ;DEPOSIT REMAINING COUNT + MOVEI A,0 + TRNN LINK,GENF + PUSHJ P,PUTREL ;DEPOSIT + PUSHJ P,RCH + CAIE A,12 + TLO I,UNRCHF ;CHAR AFTER CR NOT LF + PUSHJ P,WRQOTE ;READ IN BODY + PUSHJ P,STPWR ;WRITE STOP + MOVE SYM,MACNM ;GET MACRO NAME + PUSHJ P,ES ;FIND SLOT IN SYMBOL TABLE FOR IT + JFCL + MOVEI B,MACCL ;RH(VALUE) = MACCL + HRL B,PRDEF ;LH(VALUE) = CHAR ADR OF MACRO + CLEARM PRDEF ;NO LONGER NEED PRDEF + MOVSI C,77 ;LEV = INFINITE + MOVSI T,PSUDO ;SYMBOL TABLE ENTRY LOOKS LIKE PSEUDO + PUSHJ P,VSM2 + JRST ASSEM1 + +PDEF: PUSHJ P,GSYL ;READ IN SYL + CAIE T,", ;IF DELIMITING CHR NOT , + JUMPE SYM,CPOPJ ;AND SYM NULL, RETURN + MOVEM SYM,@DMYTOP ;STORE SYM + AOS A,DMYTOP ;INCR PNTR + CAIL A,DMYDEF+DMDEFL ;CHECK FOR TABLE SIZE EXCEEDED + (SIXBIT /TMD/) ;YES + POPJ P, + + ;READ IN BODY OF MACRO OR WHATEVER + +WRQOTE: CLEARM DCNT ;CLEAR DEFINE/TERMIN LEVEL COUNT + PUSHJ P,GSYL + PUSHJ P,ES + MOVEI A,0 ;NOT SEEN + MOVE TT,A + CAIE A,PSUDO/40000 + JRST WRQOT4 ;NOT PSEUDO + HRRZS B + CAIN B,A.QOTE + JRST A.QOT1 ;.QUOTE +WRQOT4: JUMPE SYM,WRQOT1 ;JUMP ON NO SYM + MOVEI A,DMYDEF ;NOW CHECK FOR DUMMYS + CAML A,DMYTOP + JRST WRQOT2 ;NO MORE DUMMY NAMES TO COMPARE WITH + CAME SYM,(A) + AOJA A,.-3 + SUBI A,DMYDEF ;DUMMY + PUSH P,A + MOVE A,FREEPT + SOS A + PUSHJ P,REDINC + CAIE B,"! ;IF CHAR JUST BEFORE DUMMY NOT EXCLAMATION POINT, + JRST WRQOT5 + SOS FREEPT + SOS PUTCNT +WRQOT5: POP P,A + TRO A,200 + PUSHJ P,PUTREL ;THEN DEPOSIT DUMMY+200 AS NEXT CHAR + MOVE A,T + CAIE A,"! + PUSHJ P,PUTREL ;STORE SYL TERMINATOR + JRST WRQOTE+1 + +WRQOT2: CAIE TT,PSUDO/40000 ;NOT DUMMY, PSEUDO? + JRST WRQOT1 ;NO, COPY INTO MACRO BODY AND LOOP + CAIE B,ADEFINE ;YES, DEFINE? + CAIN B,AIRP ;IRP? + AOS DCNT ;YES + CAIN B,ATERMIN ;TERMIN? + SOSL DCNT ;TERMIN, SKIP IF MATCHING ONE + JRST WRQOT1 ;NOT MATCHING TERMIN, LOOP + POPJ P, + +WRQOT1: PUSHJ P,WRTSS ;COPY STRING + JRST WRQOTE+1 + +A.QOT1: MOVE A,LIMBO1 ;.QUOTE DURING READIN, TAKES ARG LIKE ASCII + CAIN A,40 + PUSHJ P,RCH + MOVEM A,A.QOT2 +A.QOT3: PUSHJ P,RCH + CAMN A,A.QOT2 + JRST WRQOTE+1 + PUSHJ P,PUTREL + JRST A.QOT3 + + ;PDL STRUCTURE FOR REPEAT + ;TWO TWO WORD ENTRIES + ;BBASE,,CPTR + ;LIMBO1 STATUS,,# TIMES LEFT + ;OLD .RPCNT,,BEG OF BODY + ;GARBAGE,,REPT1 + +AREPEAT: + MOVE A,FREEPT + MOVEM A,PRREPT ;CHAR ADR BEGINNING OF REPEAT + PUSHJ P,AGETFD + (1000+SIXBIT /USR/) + JUMPLE A,COND4 ;NO REPEAT PLAY LIKE STRING COND FALSE + CAIN A,1 + JRST COND2 + PUSH P,A + MOVEI A,373 ;CHECK CHAR FOR REPEAT + PUSHJ P,PUTREL ;STORE AS FIRST CHR OF BODY + MOVSI LINK,404000 + PUSHJ P,RDWRDA+1 + MOVEI A,15 + CAIE T,RBRKT + PUSHJ P,PUTREL +SWRET1: PUSHJ P,STPWR ;ALSO RETURN FROM STRING WRITE (.F .I) + POP P,B ;# TIMES TO GO THROUGH + PUSHJ P,PUSHEM + MOVEI B,REPT1 + PUSHJ P,PUSHEM + MOVE A,PRREPT + SETZM PRREPT + MOVE B,MACP ;NOW GET MACRO PDL POINTER FOR PUSH OF SECOND ENTRY + HRRM A,-1(B) + HRRZ A,CRPTCT + HRLM A,-1(B) + SETOM CRPTCT + SETZM CPTR + JRST MACCR + +A.IRPC: SKIPA A,CIRPCT +A.RPCN: MOVE A,CRPTCT + JRST CLBPOP + +AFNM1: SKIPA A,AFNAM1 +AFNM2: MOVE A,AFNAM2 + JRST CLBPOP + +AFN1: SKIPA A,RFNAM1 +AFN2: MOVE A,RFNAM2 + JRST CLBPOP + +AIFN1: SKIPA A,INFN1 +AIFN2: MOVE A,INFN2 + JRST CLBPOP + + ;RECYCLE AROUND REPEAT + +REPT1: PUSH P,A + PUSH P,C + HRRZ A,(B) ;CHAR ADR BEG BODY + MOVEM A,REPTTM + PUSHJ P,REDINC + CAIE B,373 + (SIXBIT /IAE/) ;FIRST CHAR OF REPEAT BODY NOT 373 + HRRZ C,MACP + HRRZ B,-2(C) ;# TIMES LEFT + SOJL B,REPT2 ;JUMP IF LAST TIME THROUGH WAS LAST TIME TO GO THROUGH + AOS CRPTCT + MOVEM A,CPTR + SETOM CPTRB + HRRM B,-2(C) ;STORE UPDATED COUNTDOWN +REPT3: POP P,C + POP P,A + JRST REPT6 + + ;4.9(B) => .STOP ELSE .ISTOP + +A.STOP: HRRZ A,MACP + JUMPL B,A.STP1 + HRRZ B,(A) ;.ISTOP + CAIN B,AIRP4 + HRRZS -1(A) ;IRP TYPE, CLEAR OUT # GROUPS, DON'T ALLOW RECYCLE +A.STP1: SETZM CPTR + SETOM CPTRB + JRST ASSEM1 + +REPTTM: 0 + +REPT2: MOVE B,REPTTM + MOVE A,CPTR + SKIPL CRPTCT + CAMN A,FREEPT + MOVEM B,FREEPT + MOVE A,[-3,,-2] + ADDB A,MACP + HLRZ A,LDRGO(A) + MOVEM A,CRPTCT +REPT4: PUSHJ P,POPEM + JRST REPT3 + + ;GET FIELD FOR PSEUDO + ;FOLLOW PUSHJ WITH INSTR EXECUTED IF SYM NOT FOUND + +BGETFD: SETOM FLDCNT +AGETFD: MOVE CH1,@(P) ;GET ERROR INSTRUCTION + MOVEM CH1,GTVER ;STORE APPROPRIATELY + PUSH P,I ;SAVE I + TRO I,PSEUDF ;SET FLAG TO GETVAL TO EXTCUTE GTVER ON UNDEFINED SYM ON EITHER PASS +AGTFD3: PUSHJ P,GETFLD + MOVE CH1,LIMBO1 + CAIE CH1,12 + CAIN CH1,15 + JRST .+3 + TRNN I,FLD + JRST AGTFD3 + TLNE I,MWRD + JRST AGTFD1 +AGTFD2: MOVEM I,ISAV ;SAVE FLAGS FOR FLD GOTTEN + POP P,I + AOS (P) + POPJ P, +AGTFD1: PUSH P,A ;SOAK UP MULTI-WORD FIELD + PUSHJ P,GETFLD + TLNE I,MWRD + JRST .-2 + POP P,A + JRST AGTFD2 + + ;ARITHMETIC CONDITIONALS (B HAS JUMP A,) + +COND: HRRI B,COND2 ;HRRI IN JUMP ADDRESS, GO TO COND2 IF CONDITIONAL TRUE + PUSH P,B ;SAVE CONDITIONAL JUMP + PUSHJ P,AGETFD ;GET FIELD TO TEST VALUE OF + (1000+SIXBIT /UCD/) ;UNDEFINED SYMBOL IN CONDITIONAL + POP P,T ;RESTORE CONDITIONAL JUMP INSTRUCTION + XCT T ;JUMP IF COND T,ASSEMBLE STRING +COND4: PUSHJ P,RCH ;CONDITION FALSE, EAT UP STRING + CAIN A,LBRKT + JRST COND3 +ANULL: TLO I,UNRCHF + PUSHJ P,RCH + CAIE A,15 + JRST .-2 + JRST ANULL1 + +COND3: MOVEI C,0 ;LEFT BRACKET ENCOUNTERED + PUSHJ P,RCHCNT ;READ UNTIL MATCHING RIGHT BRACKET + JRST .-1 + JRST MACCR + +COND5: JUMPGE COND4 + + ;IF1, IF2 + +COND2: PUSHJ P,RCH ;GET NEXT CHAR + CAIE A,LBRKT ;FLUSH ONLY IF LEFT BRACKET +ANULL1: TLO I,UNRCHF + JRST MACCR +COND1: HRRI B,PSS + XCT B + JRST COND4 ;NO + JRST COND2 ;CONDITION TRUE, ASSEMBLE STRING + + + ;CODING FOR .I, .F + +SWINI: MOVE A,FREEPT ;INITIALIZE, WILL EVENTUALLY PLAY LIKE REPEAT 1 + MOVEM A,PRREPT + MOVEI A,373 + JRST PUTREL + +SWRET: PUSH P,[1] ;REPEAT COUNT + JRST SWRET1 + +SWFLS: MOVE A,PRREPT ;FLUSH RETURN + MOVEM A,FREEPT + JRST MACCR + + ;STRING CONDITIONALS (IFSE, IFSN) + +SCOND: MOVE A,FREEPT + MOVEM A,PRSCND + MOVEM A,PRSCN1 + HRRI B,SCONDF + MOVEM B,SCINST ;STORE TEST INSTRUCTION + MOVEI LINK,0 + PUSHJ P,RDWRDA+1 ;READ IN FIRST STRING + SETOB C,SCONDF + PUSHJ P,RCH ;GET FIRST CHARACTER OF SECOND STRING + CAIN A,LBRKT + MOVEI C,0 ;BRACKETED STRING + SKIPN C +SCND2A: PUSHJ P,RCH +SCOND2: JUMPGE C,SCOND1 ;JUMP IF PROCESSING BRACKETED STRING + CAIN A,", ;NOT BRACKETED, CHECK FOR COMMA + JRST SCOND3 ;END OF SECOND STRING +SCOND6: EXCH A,PRSCND + PUSHJ P,REDINC ;GET COMPARISON CHARACTER + EXCH A,PRSCND + CAMN B,A ;COMPARE CHARACTERS + JRST SCND2A +SCOND4: CLEARM SCONDF ;STRINGS DIFFER +SCOND5: PUSHJ P,RCH + JUMPGE C,SCOND7 + CAIE A,", + JRST SCOND5 +SCOND3: CLEARB A,C ;END OF (SECOND) STRING ARG ENCOUNTERED + EXCH C,PRSCN1 + MOVEM C,FREEPT + EXCH A,PRSCND + PUSHJ P,REDINC + CAIE B,375 + CLEARM SCONDF + XCT SCINST + JRST COND4 + JRST COND2 + +SCOND1: PUSHJ P,QSCNT ;SECOND STRING ARG BRACKETED, CHECK CHAR + JRST SCOND6 ;NOT END + JRST SCOND3 ;RIGHT BRACKET + +SCOND7: PUSHJ P,QSCNT + JRST SCOND5 + JRST SCOND3 + +RCHCNT: PUSHJ P,RCH ;GET CHARACTER +QSCNT: CAIN A,LBRKT ;SKIP IF CHAR IS MATCHING RBRAK + AOJA C,CPOPJ + CAIN A,RBRKT + SOJL C,POPJ1 + POPJ P, + + ;NOW IRP + ;IRP PDL STRUCTURE: + ;TWO TWO WORD ENTRIES + + ;BBASE,,CPTR + ;LIMBO1 STATUS,,OLD .IRPCNT + ;SPEC BITS\# A,B,[LIST] GROUPS,,CHAR ADR BEGINNING OF BODY + ;OLD TOPP,,AIRP4 + +AIRP: MOVSI 17,-14 + PUSH P,2(17) + AOBJN 17,.-1 + PUSH P,RDWRDP + HLLZM B,AIRPT ;SAVE TYPE OF IRP + CLEARB LINK,IRPCR + MOVEI A,DMYDEF + MOVEM A,DMYTOP + ;DROPS THROUGH + + ;DROPS THROUGH + + +AIRP1: PUSHJ P,PDEF + CAIE T,", + JUMPE SYM,AIRP2 ;NO DUMMY SPECIFIED (EXIT FROM LOOP) + PUSHJ P,PDEF ;READ OTHER NAME OF PAIR + MOVEI A,377 + MOVSI TT,200000 + TDNE TT,AIRPT + PUSHJ P,PUTREL +AIRPS6: PUSHJ P,ADDTRN + MOVEI A,377 + PUSHJ P,PUTREL + PUSHJ P,RDWRDA + MOVE A,RDWRDP + SOS -1(A) + MOVSI TT,200000 + TDNE TT,AIRPT + SOS -1(A) ;IRPS, BACK UP CHAR ADR TO POINT TO CHAR FOR SECOND DUMMY'S EXCLUSIVE USE + AOS IRPCR ;ANOTHER GROUP + TLNN LINK,SCEND + JRST AIRP1 + TLNE LINK,LCRIND + TLZ I,UNRCHF ;FLUSH CR +AIRP2: MOVE A,FREEPT + MOVEM A,PRIRP + PUSHJ P,RCH ;IF NEXT CHAR LF, THEN FLUSH IT + CAIE A,12 + TLO I,UNRCHF + PUSHJ P,WRQOTE ;READ BODY OF IRP + PUSHJ P,STPWR ;WRITE STOP + PUSHJ P,PUSHEM ;SAVE WORLD + POP P,A ;RESTORE RDWRDP FROM LONG AGO + PUSH P,TOPP ;NOW SAVE TOPP + PUSHJ P,DMYTRN ;ACTIVATE DUMMYS + MOVE B,MACP ;NOW GET MACRO PDL POINTER + MOVE A,CIRPCT ;GET .IRPCNT + HRRM A,(B) ;CLOBBER "RETURN" ON PDL TO OLD IRPCNT + SETOM CIRPCT ;INITIALIZE IRPCNT + MOVS A,IRPCR ;GET # GROUPS + HRR A,PRIRP ;CHAR ADR OF BEGINNING OF BODY + IOR A,AIRPT ;IOR IN SPECIFICATION BITS + PUSH B,A ;PUSH ,,CHAR ADR BEGINNING + POP P,A ;NOW GET OLD TOPP + HRLS A ;MOVE TO LEFT HALF + HRRI A,AIRP4 ;RETURN TO AIRP4 ON END OF BODY + PUSH B,A ;PUSH OLD TOPP,,AIRP4 + MOVEM B,MACP ;STORE BACK UPDATED MACRO PDL POINTER + SETZM CPTR + JRST MACC2 + + ;RECYCLE THROUGH IRP + + ;AC ALLOCATIONS: +AIRP4: PUSH P,A ;A GETS CHAR ADR LOOKING AT DUMMY + PUSH P,C ;C # GROUPS LEFT + PUSH P,T ;T ADR OF PAIR OF CHAR ADR'S OF DUMMYS + PUSH P,TT ;TT TYPE OF IRP 4.9 => IRPC, 4.8 IRPS, 4.7 IRPW, NONE IRP + AOS CIRPCT ;INCREMENT .IRPCNT + HRRZ A,(B) ;GET CHARACTER ADR BEG BODY FROM PDL + MOVEM A,CPTR + SETOM CPTRB + SETOM AIRPT + TRNE FF,MRSW + JRST AIRP9 ;RETURN TO .GO + HLRZ T,1(B) ;DUMMY TAB ADR + LDB C,[220600,,(B)] ;# GROUPS + JUMPE C,AIRP9 ;JUMP IF NO GROUPS + SKIPGE TT,(B) + JRST AAIRPC ;4.9 => IRPC +AIRP6: SETOM AIRPT1 + HRRZ A,(T) ;GET ADR OF FIRST ARG +AIRP6A: PUSHJ P,REDINC ;GET CHARACTER FROM ARG + CAIN B,375 + JRST AIRP10 ;END OF STRING + CAIE B,377 + JRST AIRP6A ;WAIT FOR 377 (=> END OF PREV) + SETOM AIRPT2 +AIRP7E: MOVEM A,(T) ;STORE NEW CHAR ADR +AIRP7: PUSHJ P,REDINC + CAIN B,375 + JRST AIRP5 + TLNE TT,200000 + JRST AIRPS2 ;IRPS + CLEARM AIRPT + CAIN B,LBRKT + AOSE AIRPT2 + JRST AIRP7A ;NOT NEW LIST +AIRP7C: MOVEI B,376 ;CLOBBER BRACKET IN STRING STORAGE + DPB B,PTAB(CH2) + JRST AIRP7 + +AIRP7A: SKIPL AIRPT2 ;RIGHT BRACKET IN LIST + CAIE B,RBRKT + JRST AIRP7B + SOSGE AIRPT2 ;RIGHT BRACKET IN LIST + JRST AIRP7C ;END OF LIST +AIRP7B: CAIN B,15 + JRST AIRP7D + CAIE B,12 + CAIN B,", + SKIPL AIRPT2 + JRST AIRP7 ;NOT END OF ENTRY + ;DROPS THROUGH + + ;DROPS THROUGH +AIRPS1: MOVEI CH1,-1(A) ;END OF GROUP (ENTRY FROM IRPS, IRPW) + IDIVI CH1,4 + MOVEI B,377 + DPB B,PTAB(CH2) + TLNN TT,200000 + MOVEM A,1(T) ;IRP, STORE CHAR ADR OF REST OF STRING +AIRP8: ADDI T,2 + SOJG C,AIRP6 +AIRP9: POP P,TT ;RETURN FROM AAIRPC + POP P,T + SKIPL AIRPT + JRST REPT3 + MOVE A,[-3,,-2] ;ARGS EXHAUSTED, RETURN + ADDB A,MACP + HRRZ A,(A) + MOVEM A,CIRPCT + POP P,C + POP P,A + JRST RCHSAV + +AIRPS2: CAIL B,"A + CAILE B,"Z + JRST AIRPS3 + +AIRPS4: CLEARM AIRPT ;SQUOZE + CLEARM AIRPT1 + JRST AIRP7 + +AIRPS3: CAIG B,"9 + CAIGE B,"0 + CAIN B,"$ + JRST AIRPS4 + CAIE B,"% + CAIN B,". + JRST AIRPS4 + CAIN B,"! ;BUT ALLOW EXCLAMATION POINT + JRST AIRPS4 ;SQUOZE OR ! + SKIPGE AIRPT1 + JRST AIRP7E ;IGNORE NULL SYLLABLES + HRRZ CH1,1(T) + IDIVI CH1,4 + DPB B,PTAB(CH2) ;DEPOSIT DELIMITER AS SECOND ARG + JRST AIRPS1 + +AIRP7D: SKIPL AIRPT2 + JRST AIRP7 + JRST AIRP7C + +AIRP10: CLEARM (T) ;END OF STRING +AIRP5: CLEARM 1(T) + JRST AIRP8 + +AAIRPC: MOVE A,(T) + PUSHJ P,REDINC + CAIN B,375 + JRST AIRPC3 + CAIE B,377 + JRST AAIRPC+1 ;WAIT FOR 377 (END OF PREV) + MOVEM A,1(T) ;CHAR ADR OF STRING VALUE OF DUMMY + PUSHJ P,REDINC + CAIN B,375 + JRST AIRPC3 + CLEARM AIRPT + MOVEI CH1,-2(A) + MOVEM CH1,(T) + IDIVI CH1,4 + DPB B,PTAB(CH2) + MOVEI B,377 + DPB B,PTAB+1(CH2) + AOS 1(T) + ADDI T,2 +AIRPC2: SOJG C,AAIRPC + JRST AIRP9 +AIRPC3: CLEARM (T) +AIRPC1: CLEARM 1(T) + JRST .-5 + +COLON: TLNN I,WRDF + TRNN I,SYL + (5000+SIXBIT /ILF/) ;COLON WITHIN STORAGE WORD OR NOT PRECEDED BY SYL + TRNN I,OPFLD+PSEUDF + TRNN I,LET + (5000+SIXBIT /ILT/) ;COLON WITHIN FIELD OR PSEUDO, OR SYL NOT NAME + TLNE FF,INDEFF + (5000+SIXBIT /CLI/) ;COLON WHEN LOCATION INDEFINITE + MOVE T,CLOC ;GET CURRENT LOCATION + SKIPGE BYTM + HLL T,BYTWP ;BYTE MODE, SET LEFT HALF OF VALUE TO LEFT HALF OF BYTE POINTER + ADD T,OFLOC ;ADD OFFSET + MOVEM T,WRD ;STORE RESULT AWAY FOR POSSIBLE PUNCHOUT + EXCH T,SYLOC ;NOW SET UP STUFF FOR ERROR PRINTOUT + MOVEM T,SYLOC1 + EXCH SYM,SYSYM + MOVEM SYM,SYSYM1 + MOVE SYM,SYSYM + MOVE A,CRLOC ;SET UP RELOCATION + ADD A,OFRLOC + HRRZM A,WRDRLC + CLEARM PARBIT ;SET FLAG SAYING COLON + SKIPN LDCCC + TRNE FF,GLOLOC+GLOFFS + JRST GCOL1 ;LOCATION VIRTUAL OR IN LOAD TIME CONDITIONAL + PUSHJ P,ES ;TRY FINDING CURRENT ENTRY IN ST + JRST EQL1A ;NOT ALREADY DEFINED + PUSH P,C ;SAVE 3RDWRD + TLZ C,777700 ;MASK TO LEVEL + JUMPE C,COLON5 ;JUMP ON LEVEL = 0, INITIAL SYM + CAME C,[(77)] ;NOW CHECK LEVEL + CAMN C,LEV + JRST COLON1 ;SAME AS CURRENT, OR GLOBAL + JRST COLON2 ;DIFFERENT => WIN + +COLON1: POP P,C ;LEV SAME AS CURRENT, RESTORE 3RDWRD + JRST .+1(A) + (5000+SIXBIT /MDT/) ;COMMON + (5000+SIXBIT /RES/) ;MACRO OR PSEUDO + JRST COLON4 ;SYM + JRST EQL1C ;LOCAL UNDEF + (5000+SIXBIT /MDT/) + (5000+SIXBIT /MDT/) + (5000+SIXBIT /MDT/) + (5000+SIXBIT /MDT/) + JRST EQL1E ;GLOBAL ENTRY + JRST EQL1E ;GLO EXIT + +COLON4: CAME B,WRD + JRST COL4E + PUSHJ P,RCHK + JUMPN C,.+2 + CAME B,WRDRLC +COL4E: (5000+SIXBIT /MDT/) ;MDGS +CASSM1: JRST ASSEM1 + +COLON5: CAIE A,2 ;LEV OF SYM IS ZERO, IS IT SYM? + JRST COLON1 ;NOT SYM + JRST COLON2 ;SYM => WIN (ALLOW OVERDEFINITION) + + ;COLON WHEN LOCATION VIRTUAL, OR IN LOAD TIME CONDITIONAL + +GCOL1: PUSHJ P,ES ;FIND ITS SLOT IN ST + JRST GCOL2 ;NOT ALREADY DEFINED + PUSH P,A ;FOUND, SAVE FLAGS OF SQUOZE + CAIE A,11 + TLNE I,GLI + TLO SYM,40000 ;GLOBAL EXIT, OR DOUBLE QUOTE TYPED, SET GLOBAL BIT IN SQUOZE + PUSHJ P,LKPNRO ;MAYBE PUNCH OUT LINK REQUEST + TLZ SYM,40000 ;NOW CLEAR OUT GLOBAL BIT SGAIN + POP P,A ;GET BACK CURRENT SQUOZE FLAGS + CAIE A,GLOETY_-14. + CAIN A,GLOEXT_-14. + JRST GCOL3 ;GLOBAL ENTRY OR GLOBAL EXIT + TLNN I,GLI + JRST GCOL4 ;SOMETHING ELSE, AND DOUBLE QUOTE NOT TYPED + PUSHJ P,PLOGLO ;DOUBLE QUOTE TYPED, TELL LOADER SYM IS GLOBAL +GCOL3: MOVSI T,GLOETY ;GLOBAL ENTRY + TLOA SYM,40000 ;GLOBAL BIT IN SQUOZE +GCOL4: MOVSI T,LCUDF ;LOCAL UNDEFINED +GCOL5: PUSHJ P,VSM2LV ;PUT SYM IN ST, WITH 3LLV SET + PUSH P,C1ASSEM1 ;CAUSE RETURN TO ASSEM1 + ;DROPS THROUGH + ;PUNCH OUT "DEFINE SYM AS $." + +PDEFPT: PUSHJ P,PBITS7 ;OUTPUT 7 THEN PDEFPT + MOVEI A,CDEFPT + PUSHJ P,PBITS + JRST OUTSM ;OUTPUT SYM, WITHOUT BITS + +C1ASSEM1: +GCOL2: SETZI B,ASSEM1 ;COLON WITH LOCATION GLOBAL AND SYM NOT ALREADY DEFINED + MOVE C,LEV + TLNN I,GLI + JRST GCOL4 ;SYM NOT FOLLOWED BY " + MOVSI C,77 ;FOLLOWED BY ", SET TO GLOBAL LEVEL + JRST GCOL3 + + ;CONSTA + +CNSTNT: PUSH P,CASSM1 ;CAUSE RETURN TO ASSEM1 + SOSGE CONCNT ;ENTRY FROM AEND + (SIXBIT /TCA/) ;TOO MANY CONSTANTS AREAS + MOVE B,CLOC + ADD B,OFLOC + HRRZ T,PBCON + TRNE FF,PSS + JRST CNST2 + HRRM B,1(T) + MOVEI D,0 + MOVE A,CRLOC + ADD A,OFRLOC + TRNE A,777777 + TLO D,200000 + TRNE FF,GLOLOC + TLO D,100000 + IORM D,2(T) + +CNST1: MOVE SYM,(T) ;GET NAME OF AREA + TRNE FF,GLOLOC + PUSHJ P,PDEFPT ;DEFINE SYM FOR BEGINNING OF CONSTANTS AREA +CNST1B: MOVEI A,CONTAB +CNSTH: CAML A,PLIM + JRST CNSTA ;THRU + MOVE TT,(A) + MOVEM TT,WRD + PUSHJ P,CPTMK + LDB F,C ;GET THIS CONSTANT'S RELOCATION BITS + TRZE F,2 + TLO F,1 ;RELOCATE LEFT HALF + MOVEM F,WRDRLC ;STORE RELOCATION + MOVEI D,GLOTB ;AND NOW TO SET UP GLOTB! + MOVEM D,GLSP2 + MOVEI C,CONGLO +CNSTC: CAML C,CONGOL + JRST CNSTB ;END OF CONGLO + CAME A,1(C) ;POINTS TO THIS CONSTANT? + JRST .+4 ;NO + AOS D ;YES, STORE ENTRY IN GLOTB + MOVE B,(C) + MOVEM B,(D) + AOS C + AOJA C,CNSTC + +CNSTB: MOVEM D,GLSP1 ;MARK END OF ACTIVE PART OF GLOTB + PUSH P,A + PUSHJ P,PWRD ;OUTPUT THIS CONSTANT + AOS CLOC ;INCREMENT CLOC TO NEXT + POP P,A ;RESTORE POINTER INTO CONTAB + AOJA A,CNSTH + +CNST2: MOVSI A,100000 + TDZ A,2(T) + TRNE FF,GLOLOC + TLC A,100000 + SKIPN A + (SIXBIT /CVD/) + HRRZ B,1(T) + SUB B,OFLOC + HRRZS B + CAME B,CLOC + (SIXBIT /CLD/) + MOVE B,2(T) + ROT B,2 + XOR B,CRLOC + XOR B,OFRLOC + TRNE B,1 + (SIXBIT /CRD/) + JRST CNST1 + +CNSTA: HRRZ T,PBCON + TRNE FF,GLOLOC + JRST CNSTD ;LOCATION GLOBAL + TRNN FF,NPSS + SKIPGE 2(T) + JRST CNSTDA ;2 PASS ASSEMBLY OR AREA DEFINED + TRO I,CONT ;1PASS AND NOT DEFINED + PUSHJ P,P70 ;DEFINE SYM + MOVE A,(T) + SKIPE CRLOC + TLO A,100000 ;RELOCATE + PUSHJ P,OUTPUT + HRRZ A,1(T) + PUSHJ P,OUTPUT ;OUTPUT VALUE, FIRST LOCATION IN AREA + TRZ I,CONT +CNSTDA: MOVSI A,CTDEF + IORM A,2(T) ;CALL IT DEFINED +CNSTD: TRNE FF,PSS + JRST CNST3 ;PASS 2 + MOVE A,CLOC + HRLM A,1(T) ;MARK END OF AREA + +CNSTE: MOVEI A,CONTAB + MOVEM A,PLIM + MOVEI A,CONGLO + MOVEM A,CONGOL + MOVEI T,3 + ADDB T,PBCON + CAML T,PBCONL + MOVEM T,PBCONL + AOS A,CSQZ + MOVEM A,(T) + POPJ P, + +CNST3: PUSHJ P,EBLK ;END CURRENT BLOCK + HLRZ A,1(T) ;GET POINTER TO TOP OF AREA STORED DURING PASS 1 + MOVEM A,CLOC ;EITHER WAY, SET CLOC TO TOP OF AREA SO WON'T HAVE MDT TROUBLE + JRST CNSTE + + ;DEFINING SYM USED IN CONSTANT, DELETE REFERENCES FROM CONGLO TABLE + +CONBUG: MOVEI A,CONGLO ;B VAL C FLAGS ST(D) SADR + PUSH P,T + PUSH P,C ;SAVE FLAGS +CONBG2: MOVE C,(P) ;GET FLAGS + CAML A,CONGOL ;DONE WITH SCAN? + JRST CONBG1 ;YES + HRRZ F,(A) ;NO, GET CONGLO ENTRY + CAIE F,ST(D) ;POINT TO THIS SYM? + AOJA A,CONBG6 + PUSH P,B ;YES, SAVE VALUE, ABOUT TO WORK WITH B + MOVE T,(A) ;GET ENTIRE CONGLO ENTRY + LDB CH2,[221200,,T] ;GET MULTIPLICATION FIELD + SKIPE CH2 + IMUL B,CH2 ;NON-ZERO => MULTIPLY VALUE OF SYM + TLNE T,MINF + MOVNS B ;NEGATE VALUE + TLNE T,HFWDF + HRRZS B ;TRUNCATE TO HALFWORD + TLNE T,ACF + ANDI B,17 ;AC, MASK TO FOUR BITS + TLNE T,SWAPF + MOVSS B ;SWAP VALUE + TLNE T,ACF + LSH B,5 ;AC, SHIFT FIVE + ADD B,@1(A) ;ADD ABS PART OF VALUE + TLNN T,SWAPF + HRRM B,@1(A) ;NOT SWAPPED, STORE LH + TLNE T,SWAPF + HLLM B,@1(A) ;SWAPPED, STORE LH + TLNN T,HFWDF + MOVEM B,@1(A) ;FULL WORD, STORE VALUE + LDB CH1,[420200+P,,-1] ;GET HIGH BITS OF 3RDWRD, RELOCATION BITS + TLNE T,HFWDF ;NOW TO MAP RELOCATION BITS + TRZ CH1,2 + TLNE T,SWAPF + LSH CH1,1 + TRZE CH1,4 + TRO CH1,1 + PUSH P,A + HRRZ A,1(A) ;GET POINTER INTO CONTAB + PUSHJ P,CPTMK + LDB B,C ;GET RELOCATION BITS + TLNE T,MINF + JRST CONBG8 ;NEGATE + TRNE B,(CH1) + (5000+SIXBIT /CRI/) ;ATTEMPTED MULTIPLE RELOCATION IN CONSTANT + ; ^ ABOVE SHOULD BE REPLACED WITH A $RSET LIKE ROUTINE + ;THAT ALSO SEARCHES CONGLO FOR $R. ALREADY THERE + IOR B,CH1 ;LOOKS OK, IOR IN BITS FOR GLOBAL +CONB8A: DPB B,C ;STORE BACK NEW RELOCATION BITS FOR CONSTANT + POP P,A + CLEARM (A) ;CLEAR OUT CONGLO ENTRY + CLEARM 1(A) + POP P,B + AOS A +CONBG6: AOJA A,CONBG2 ;BACK FOR NEXT CONSTANT, DON'T KNOW HOW MANY THIS SYM USED IN + +CONBG1: MOVEI A,CONGLO + PUSH P,B + MOVEI B,CONGLO +CONBG7: CAML A,CONGOL + JRST CONBG3 + SKIPN C,(A) +CONBG5: AOJA A,CONBG4 + MOVEM C,(B) + MOVE C,1(A) + MOVEM C,1(B) + AOS B + AOJA B,CONBG5 + +CONBG4: AOJA A,CONBG7 +CONBG3: MOVEM B,CONGOL + POP P,B + POP P,C + POP P,T + POPJ P, +CONBG8: XORI B,3 + TRNE B,(CH1) + (5000+SIXBIT /CRI/) + ANDCB B,CH1 + JRST CONB8A + +OPEN: MOVEM A,LSYL ;VALUE OF LAST SYL + MOVEM B,LSYLR ;RELOCATION BITS OF " + PUSH P,D ;ALT ENTRY - CLOSE DELIMITER, SET UP BY CALLING ROUTINE + PUSHJ P,GETWRD ;GET WORD + POP P,D ;RESTORE DELIMITER + CAME D,LIMBO1 ;IF AGREES WITH LAST CHAR READ, + TLNE I,MWRD ;OR IF READING MULTIPLE WORD + POPJ P, ;THEN OK + MOVE D,LIMBO1 ;NEITHER, GET LAST CHAR + CAIE D,15 + CAIN D,12 + POPJ P, ;CR OR LF => OK + (2000+SIXBIT /ILC/) ;ILLEGAL CLOSE + POPJ P, + +LSSTH: MOVEI D,"> + JSP LINK,SAVWD1 + PUSHJ P,OPEN + TLNE I,MWRD + PUSHJ P,IGTXT ;NOT INTERESTED IN MULTI-WORD CRUD +LSSTH3: JSP LINK,USVWLD ;POP OFF ALL BUT LSYL AND LSYLR + TLZE I,LSRET + JRST LSSTHR ;RETURN TO ^ OR _ + +LSSTH2: ADDM A,LSYL + MOVE A,LSYLR + PUSHJ P,HFWDAD + MOVEM A,LSYLR +LSSTH5: MOVE A,LIMBO1 + CAIE A,15 + CAIN A,12 + JRST LSSTH6 ;DELIMITER CR OR LF + PUSHJ P,RCH ;NOT CR OR LF, GET NEXT CHAR + CAIN A,"! ;IGNORE EXCLAMATION POINT + JRST .-2 + TLO I,UNRCHF ;CAUSE IT TO BE RE-INPUT + HLRZ CH1,GDTAB(A) + CAIE A,"_ + CAIN A,"] + JRST LSSTH7 + CAIE CH1,(POPJ P,) + JRST LSSTH4 ;NEXT CHAR NOT BREAK CHAR + HRRZ CH1,GDTAB(A) + MOVE CH1,DTB-40(CH1) + CAIN A,"; + JRST LSSTH7 + TLNE CH1,DSYL + JRST LSSTH4 ;SYLLABLE OPERATOR +LSSTH7: PUSHJ P,GETSYL ;CLOBBER CDISP +LSSTH6: TRO I,SYL + MOVE A,LSYL + MOVE B,LSYLR + POP P,LSYLR + POP P,LSYL + JRST GETFD6 + +LSSTH1: ADDM A,WRD + MOVE A,WRDRLC + PUSHJ P,HFWDAD + MOVEM A,WRDRLC + JRST LSSTH5 + +LSSTH4: SKIPN LSYL + SKIPE LSYLR + (2000+SIXBIT /NOS/) ;IMPROPER +( ... ) + POP P,LSYLR + POP P,LSYL + JRST GETFD1 + + +LSSTHR: POP P,LSYLR + POP P,LSYL + POPJ P, + + ;VARIAB + +AVARIAB: PUSH P,CASSM1 ;RETURN TO ASSEM1 + SOSG VARCNR ;ENTRY FROM AEND + (SIXBIT /TVA/) ;TOO MANY VARIABLE AREAS + MOVSI D,-SMK ;SET UP AOBJN POINTER TO ST + MOVE T,CLOC + MOVEM T,VCLOC ;STORE AS LOCATION OF VARIABLE AREA + ADD T,OFLOC + MOVE C,CRLOC + ADD C,OFRLOC + TRNE FF,PSS + JRST AVAR1 ;PASS 2 + HRL T,VARCNT ;SIZE OF AREA + TRNE C,-1 + TLO T,400000 ;RELOCATED + MOVEM T,@VARPNT + +AVAR2: 3GET C,D + MOVE B,ST+1(D) + MOVE SYM,ST(D) + TLZ SYM,740000 + LDB LINK,[400400,,ST(D)] + CAIE LINK,UDEFLV_-14. + CAIN LINK,UDEFGV_-14. + JRST AVAR3 ;UNDEFINED VARIABLE + CAIE LINK,DEFGVR_-14. + CAIN LINK,DEFLVR_-14. + JRST AVAR4 ;DEFINED VARIABLE +AVAR2A: AOS D + AOBJN D,AVAR2 ;CHECK ENTIRE SYMTAB + HLRZ A,@VARPNT ;NOW GET SIZE OF AREA + TRZ A,400000 ;CLEAR OUT RELOCATION CHECK BIT + ADD A,VCLOC ;ADD LOCATION OF BEGINNING OF VARIABLE AREA + MOVEM A,CLOC ;STORE AS NEW CURRENT LOCATION + PUSHJ P,EBLK + CLEARM VARCNT ;INITIALIZE COUNT OF VARIABLES IN NEXT AREA + AOS VARPNT ;INCREMENT POINTER TO POINT TO NEXT AREA + POPJ P, + + ;UNDEFINED VARIABLE FOUND IN SYMTAB SCAN + +AVAR3: CAIN LINK,UDEFGV_-14. ;GLOBAL? + TLO SYM,40000 ;GLOBAL + PUSHJ P,LKPNRO + MOVSI T,DEFLVR + CAIN LINK,UDEFGV_-14. + MOVSI T,DEFGVR + TRNE FF,GLOLOC + JRST AVAR3A ;LOCATION GLOBAL + MOVEI B,-1(B) + ADD B,VCLOC + ADD B,OFLOC + MOVE TT,CRLOC + ADD TT,OFRLOC + SKIPE TT + TLO C,3RLR + CAIE LINK,UDEFGV_-14. + TLZN C,3VCNT + SKIPA + PUSHJ P,CONBUG + PUSHJ P,VSM2 +AVAR4B: PUSHJ P,OUTDE2 + JRST AVAR2A + +AVAR1: HRRZ A,@VARPNT ;VARIAB DURING PASS 2 + CAIE A,(T) + (SIXBIT /VLD/) + HLRZ A,@VARPNT + TRZE A,400000 + XORI C,1 + TRNE C,-1 + (SIXBIT /VRD/) + SKIPE VARCNT + (SIXBIT /VND/) + JRST AVAR2 + +AVAR4: TLNN C,3VAS2 + JRST AVAR2A + TLOE C,3VP + JRST AVAR2B + CAIN LINK,DEFGVR_-14. + TLO SYM,40000 + PUSHJ P,LKPNRO + TRNN FF,GLOLOC + JRST AVAR4A +AVAR3A: PUSHJ P,VSM2LV + PUSHJ P,PDEFPT + PUSHJ P,PBITSZ + PUSHJ P,OUTPUT +AVAR2B: TRNE FF,GLOLOC + AOS CLOC + JRST AVAR2A + +AVAR4A: CAIN LINK,DEFGVR_-14. + JRST AVAR4B + 3PUT C,D + JRST AVAR2A + +LEFTP: MOVEI D,") + JSP LINK,SAVWD1 + MOVEI C,0 + TRNE I,OPFLD + TRNE I,SYL + TLO C,400000 ;CAUSE IT TO GET ADDED INTO WORD STEAD HAVE VALUE AS SYL + PUSH P,C + PUSHJ P,OPEN + POP P,C + MOVSM A,T1 ;STORE SWAPPED VALUE + MOVSM B,T2 + MOVSI B,200000 + PUSHJ P,LNKTC1 + TLNE I,MWRD + PUSHJ P,IGTXT + JSP LINK,USVWLD + MOVE A,T1 + MOVE B,T2 + JUMPL C,LSSTH1 ;ADD TO WHOLE WORD + JRST LSSTH2 + + ;LEFT-BRACKET ENCOUNTERED; HERE ON DISPATCH FROM GETFD + +LBRAK: TRO I,FLD ;LEFT BRACKET + JSP LINK,SAVWD1 ;SAVE CRUFT +LBRAK1: AOS CONDEP ;ONE DEEPER IN CONSTANTS + MOVEI D,"] + PUSHJ P,OPEN ;READ A WORD +LBRAK3: SOS CONDEP ;POPPED UP ONE LEVEL IN CONSTANT NESTING +LBRAK2: MOVE F,GLSP1 + SUB F,GLSP2 + JUMPE F,SCON ;JUMP IF NOTHING VIRTUAL + MOVEI B,-1(F) + MOVN TT,B + JUMPE B,SCON ;JUMP IF ONLY ONE GLOBAL + ;SORT GLOTB ENTRIES THIS CONSTANT +LSORT: HRL T,TT ;SET UP AOBJN POINTER TO GLOBALS REMAINING + HRR T,GLSP2 + MOVE A,1(T) + CAML A,2(T) + EXCH A,2(T) ;INTERCHANGE + MOVEM A,1(T) + AOBJN T,LSORT+2 ;INNER LOOP POINT + SOJG B,LSORT ;OUTER LOOP + ;DROPS THROUGH + + ;DROPS THROUGH +SCON: PUSHJ P,RCHKMV ;SET UP RELOCATION BITS + ROT T,2 ;ROTATE TO BOTTOM TWO BITS OF T + TLNE I,MWRD+MWRD1 + JRST NOCON ;MULTIPLE WORD, DON'T TRY TO FIND MATCH + MOVEI A,CONTAB +SCON1: CAML A,PLIM ;SEARCH CONTAB TO SEE IF ALREADY THERE + JRST NOCON ;END OF TABLE, NO MATCH + MOVE B,WRD + CAME B,(A) +SCON2: AOJA A,SCON1 ;VAL DISAGREES + PUSHJ P,CPTMK ;GET BP TO CONBIT TABLE IN C + LDB F,C ;GET RELOCATION BITS THIS CONSTANT + CAME F,T + JRST SCON2 ;RLC DIFFRS + MOVEI B,CONGLO ;VALUE AND RELOCATION AGREE, NOW TO CHECK GLOBALS + SKIPA C,GLSP2 + AOS B ;SEARCH FOR GLOBAL POINTING TO CONSTANT WHICH HAS MATCHED SO FAR + CAML B,CONGOL + JRST SCON3 ;GLOBALS MATCH SO FAR + CAME A,1(B) ;SKIP IF ONE FOUND +SCON7: AOJA B,.-4 ;NOT YET + MOVE D,(B) ;FOUND ONE, GET GLOTB ENTRY + CAME D,1(C) ;COMPARE WITH THIS ENTRY IN GLOTB + JRST SCON2 ;NO MATCH, FLUSH THIS CONSTANT + AOJA C,SCON7 ;MATCH, TRY NEXT GLOBAL + +SCON3: CAME C,GLSP1 ;GLOBALS MATCH, BUT ARE WE EXACTLY AT END OF GLOTB? + JRST SCON2 ;NO, BACK TO SEARCH +NOCON4: MOVE C,GLSP2 ;RESET C TO POINT TO BEGINNING OF THIS PART OF GLOTB + MOVE B,PBCON ;BY GOD,THEY MATCH, GET POINTER TO CURRENT CONSTANTS AREA SPEC + SKIPL 2(B) + AOJA C,SCON4 ;CONST AREA UNDEF + MOVEM C,GLSP1 ;DEF, WIPE OUT GLOTB ENTRIES + MOVE C,1(B) + ADDI A,(C) + LDB B,[420100,,2(B)] + JRST SCON6 + +SCON4: TLNE I,MWRD + TLNN I,MWRD1 + JRST .+2 + JRST SCON6A ;BOTH SET + MOVEM C,GLSP1 ;AT LEAST ONE WAS CLEAR + MOVEM B,(C) +SCON6A: MOVEI B,0 +SCON6: SUBI A,CONTAB + TLZE I,MWRD1 + JRST SCOM1 + TLNN I,MWRD + JRST LSSTH3 + PUSH P,A + PUSH P,B + PUSH P,GLSP1 + PUSH P,GLSP2 + PUSHJ P,.+1 +SCOM2: TLO I,MWRD1 + MOVEI D,"] + AOS CONDEP + PUSHJ P,OPEN+2 + JRST LBRAK3 +SCOM1: TLNE I,MWRD + JRST SCOM2 + MOVEI TT,SCOM2 + JSP LINK,POPLIS + JRST LSSTH3 + +NOCON: AOS A,PLIM ;CONSTANT NOT ALREADY IN TABLE + CAIL A,CONTAB+LCONTB+1 + (SIXBIT /TMC/) +NOCON2: MOVE AA,WRD + MOVEM AA,-1(A) + SOS A + PUSHJ P,CPTMK + DPB T,C + MOVE B,GLSP2 +NOCON3: CAML B,GLSP1 + JRST NOCON4 + MOVE C,1(B) + MOVEM C,@CONGOL + HRRZS C + PUSHJ P,NOCON5 + 3GET1 D,C ;IN SYMBOL TABLE + TLO D,3VCNT ;THIS SYM USED IN CONSTANT + MOVEM A,@CONGOL + PUSHJ P,NOCON5 + CAIL C,CONTAB + AOJA B,NOCON3 + 3PUT1 D,C ;UPDATE 3RDWRD TABLE ENTRY + AOJA B,NOCON3 + +CONST3: PUSHJ P,EBLK + HLRZ A,1(T) + MOVEM A,CLOC + JRST CNSTE + +NOCON5: AOS AA,CONGOL + CAIL AA,CONGLO+LCNGLO + (SIXBIT /TMC/) ;TOO MANY CONSTANT GLOBAL REFERENCES + POPJ P, + + ;SET UP BYTE POINTER TO CONBIT TABLE + ;A SHOULD HAVE ADR OF CONTAB ENTRY + ;LEAVES ANSWER IN C + +CPTMK: PUSH P,A + SUBI A,CONTAB + PUSH P,B + IDIVI A,18. + MOVEI C,CONBIT(A) ;SET UP ADDRESS PART + DPB B,[370500,,C] ;STORE POSITION FIELD FROM REMAINDER + TLO C,200 ;SET UP SIZE FIELD + POP P,B + JRST POPAJ + +INIT": HRRM A,RETURN ;INITIALIZATION (BEFORE PASS 1 ONLY) ROUTINE, SAVE RETURN POINT + SKIPGE ISYMF + JRST INIT1 ;SPREAD SYMS (RETURNS TO SP4) + MOVSI A,-SMK ;ALREADY SPREAD, JUST FLUSH ALL BUT INITIAL SYMS +INIT4: SKIPN B,ST(A) + JRST INIT2 + 3GET C,A + TLNN C,3INI ;INITIAL SYM? + CLEARM ST(A) ;NO +INIT2: AOS A + AOBJN A,INIT4 + MOVSI A,<-+1> ;clear CONBIT, CONTAB, PCNTB + SETZM CONBIT(A) + AOBJN A,.-1 + +SP4: PUSH P,CRETN +P1INI: CLEARB I, LDCCC + CLEARM BKBUF + SETZM STGSW + TDZ FF,[-1-VOT-PTPF,,-1] ;INITIALIZE MOST FF FLAGS + CLEARM ISYMF ;ISYMS HAVE BEEN SPREAD + SETZM MDEPTH + MOVEI A,DMYAGT + MOVEM A,TOPP + MOVEM A,BBASE + MOVE A,[-MPDLL,,MACPDL] + MOVEM A,MACP + MOVEI A,3 + MOVEM A,FREEPT ;FORGET ALL STRINGS IN MACTAB + MOVEI A,CONGLO + MOVEM A,CONGOL + MOVEI A,PCNTB + MOVEM A,PBCONL + MOVSI A,2 + MOVEM A,LEV + MOVE A,[SQUOZE 0,.MAIN] + MOVEM A,PRGNM + MOVE A,[PUSHJ P,INCHR] + MOVEM A,GETCHR + +P2INI: MOVEI A,1 + MOVEM A,CPGN + MOVEM A,CLNN + TLZ FF,INDEFF + CLEARM GENSM + MOVEI A,NCONS + MOVEM A,CONCNT + MOVEI A,VARTAB + MOVEM A,VARPNT + MOVEI A,NVARS + MOVEM A,VARCNR + CLEARM OFLOC + CLEARM OFRLOC + CLEARM VARCNT + CLEARM PBITS2 + MOVE A,[440300,,PBITS1] + MOVEM A,BITP + MOVEI A,PBITS4 + HRRZM A,PBITS4 + CLEARB I,PBITS1 + MOVEI A,CONTAB + MOVEM A,PLIM + MOVEI A,PCNTB + MOVEM A,PBCON + MOVE A,[34773600001] + ;XXX Later source has this, which doesn't produce the same result: + ;MOVE A,[(LCUDF)++1] ;< AND > FOR COMPATIBILITY WITH OLD + MOVEM A,PCNTB + AOS A + MOVEM A,CSQZ + MOVEI A,10 + MOVEM A,ARADIX + MOVEI A,100 + MOVEM A,CLOC + CLEARM CRLOC + MOVEI A,BKBUF+1 + MOVEM A,OPT1 + TRO FF,IPSYMS+FIRWD + CLEARM CRPTCT + CLEARM SYLOC + CLEARM SYSYM + CLEARM BYTW ;CLEAR BYTE MODE WORD + MOVE A,[IFORTB,,FORTAB] ;INITIALIZE FORMAT TABLE ON EACH PASS + BLT A,FRTBE +IFN LISTSW,[ + MOVE A,[440700,,LISTBF] + MOVEM A,PNTBP + CLEARM LISTPF + SETOM LISTBC +] +CRETN: POPJ P,RETURN + +A.QOTE: +ASSEM1: TRZ I,FLD+SYL+LET+PSEUDF+COM+CONT+GMINF+OPFLD + TLZ I,GLI+VAR+FLO+DECP+UARI+MNSFLG+WRDF+NPRC + TRO I,DEF + TLZ FF,SKILF + MOVE P,[-LPDL,,PDL"] + HRRZM P,GETCNR ;MAKE SURE PREC OF UNARY OPS FITS IN A HALFWORD DURING LONG ASSEMBLIES + MOVEI A,GLOTB + MOVEM A,GLSP1 + ;GETWRD WILL COPY GLSP1 INTO GLSP2 + TLNE I,MWRD + JRST ASSEM2 ;ASSEMBLING MULTIPLE WORD + PUSHJ P,RCH + CAIG A,40 + JRST .-2 ;FLUSH LEADING GARBAGE + CLEARM PARBIT + TLO I,UNRCHF ;CAUSE NON-GARBAGE CHAR FOUND TO BE RE-INPUT + CLEARM CONDEP ;DEPTH IN CONSTANTS := 0 +ASSEM2: PUSHJ P,GETWRD + TLZN I,WRDF + JRST ASSEM1 ;NO WORD ASSEMBLED,TRY AGAIN + SKIPE STGSW + (1000+SIXBIT /SWD/) ;STORAGE WORD ASSEMBLED + SKIPGE BYTM + JRST PBYTE ;IN BYTE MODE, OUTPUT BYTE INSTEAD OF WORD +ASSEM3: PUSHJ P,PWRD ;NORMAL MODE, OUTPUT WORD + AOS CLOC ;INCREMENT LOCATION COUNTER + HRRZS CLOC ;MAKE SURE LOCATION DOESN'T INCREMENT TO BITS IN LEFT HALF + JRST ASSEM1 + +PSYMS": HRRM A,RETURN ;PUNCH OUT SYMBOL TABLE, CALLED AFTER EVERYTHING ELSE, SAVE RETURN POINT + TRNN FF,IPSYMS + JRST APSYM1 ;NOSYMS, JUST PUNCH PROGRAM NAME + PUSHJ P,SYMDMP ;YESSYMS, PUNCH SYMTAB +RETURN: JRST . ;RH HAS RETURN ADR FOR END OF MAJOR ROUTINE (E.G PASS 2) + +APSYM1: SKIPN CONTRL + PUSHJ P,SYMDA ;PUNCH PROG NAME + JRST RETURN + +EQUAL: CAMN SYM,[SQUOZE 0,.] ;.=FOO, SAME AS LOC FOO + JRST ALOC + TRNN I,OPFLD+PSEUDF + TRNN I,LET + (5000+SIXBIT /IPA/) ;ILLEG ARG EQ + PUSH P,SYM + PUSH P,I + MOVE A,[(1000+SIXBIT /USP/)] + MOVEM A,GTVER + TRO I,PSEUDF+DEF+EQLF + PUSHJ P,RCH + CAIE A,"= + TLOA I,UNRCHF + TLO FF,SKILF + PUSHJ P,GETWRD + MOVEI CH1,CRDF + MOVEM CH1,PARBIT ;SET FLAG TO TELL LOADER TO ALLOW REDEFINITION + TRNN I,DEF + JRST ASEM1A ;UNDEFINED SYMS IN VALUE, IGNORE +IFN LISTSW,[ + SKIPGE LISTPF + PUSHJ P,PNTR + MOVE SYM,WRD + MOVEM SYM,LISTWD + MOVE SYM,WRDRLC + MOVEM SYM,LSTRLC + SETOM LISTAD + SETOM LISTPF +] + TDZ I,[-1-(MWRD)] + IOR I,(P) + POP P,(P) + POP P,SYM + SKIPE LDCCC + JRST EQG1 ;STRANGE RELOCATION OR IN LOAD TIME CONDITIONALS => HAND PROBLEM TO LOADER + MOVE A,GLSP1 + CAMN A,GLSP2 + JRST EQL1 ;NO GLOBALS IN DEFINITION +EQG1: PUSHJ P,ES ;GLOBALS TO RIGHT + JRST EQL2 ;NOT FOUND + JRST .+1(A) + (5000+SIXBIT /IPA/) ;COMMON + (5000+SIXBIT /IPA/) ;PSEUDO OR MACRO + JRST EQL2 ;SYM + JRST EQL2 ;LOCAL UNDEF + (5000+SIXBIT /IPA/) ;DEF LOC VAR + (5000+SIXBIT /IPA/) ;UNDEF LOC VAR + (5000+SIXBIT /IPA/) ;DEF GLO VAR + (5000+SIXBIT /IPA/) ;UNDEF GLO VAR + JRST EQL7 ;GLO ENTRY + ;NOT DONE WITH TABLE YET! + +EQL8: JUMPE B,EQL7 ;GLO EXIT REACHED BY DISP + PUSHJ P,GLKPNR +EQL7: PUSH P,CASM1A +GLOPRA: MOVSI T,GLOETY ;GLOBAL PARA ASSIGN + MOVSI C,3LLV+77 ;VAL MUST BE PUT IN BYLOADER FLAG + MOVEI B,0 + TLO SYM,40000 +LOPRA1: PUSHJ P,VSM2 + JUMPGE FF,CPOPJ ;JUMP ON NOT PUNCHING PASS + TLO C,3VP ;VALUE PUNCHED + 3PUT C,D ;STORE UPDATED 3RDWRD + PUSHJ P,EBLK + MOVEI TT,LGPA + DPB TT,[310700,,BKBUF] + PUSHJ P,OUTSM + PUSHJ P,PWRDA + JRST EBLK + + ;MAYBE PUNCH OUT LINK REQUEST + ;SYM HAS NAME OF SYM TO REQUEST, C 3RDWRD, B ADR OF REQUEST + ;REQUEST WILL BE PUNCHED IF 3RLNK SET IN C OR IF ANYTHING SET IN LH(B) + +GLKPNR: TLO SYM,40000 ;GLO BIT +LKPNRO: TLNN C,3RLNK + TLNE B,-1 + TROA I,CONT + POPJ P, ;DON'T PUNCH REQUEST + MOVEI A,6 + PUSHJ P,PBITS + PUSHJ P,OUTSM ;PUNCH SYM + HLRZ A,B + TLZE C,3RLNK ;RELOC OF LINK PNR + TLO A,100000 + HRRZS B ;CLEAR OUT LH OF B + TRZ I,CONT ;OK TO END BLOCK NOW + JRST OUTPUT ;PUNCH OUT A AND RETURN + + +EQL2: TLNE I,GLI + JRST EQL7 ;MAKE IT GLOBAL + PUSHJ P,LOPRA +CASM1A: JRST ASEM1A + +LOPRA: MOVSI T,LCUDF ;LOCAL UNDEFINED + TLZ C,77 + IOR C,LEV + TLO C,3LLV ;LOADER MUST SUPPLY VALUE + TLNE FF,SKILF + TLO C,3SKILL + JRST LOPRA1 + + + ;NO GLOBALS TO RIGHT OF EQUAL SIGN + +EQL1: PUSHJ P,ES + JRST EQL1A ;NOT FOUND + JRST .+1(A) + (5000+SIXBIT /IPA/) ;COMMON + JRST EQL1B2 ;PSEUDO OR MACRO + JRST EQL1B ;SYM + JRST EQL1C ;LOCAL UNDEF + (5000+SIXBIT /IPA/) ;DEF LOC VAR + (5000+SIXBIT /IPA/) ;UNDEF LOC VAR + (5000+SIXBIT /IPA/) ;DEF GLO VAR + (5000+SIXBIT /IPA/) ;UNDEF GLO VAR + JRST EQL1D ;GLO ENTRY +EQL1E: PUSHJ P,GLKPNR ;GLO EXIT REACHED BY DISP DUMP LINKING POINTER +EQL1D: PUSHJ P,RCHK ;GLO ENTRY +EQLB2: PUSHJ P,RMOVE + TLO C,77 + MOVE B,WRD + HRLZI T,GLOETY + SKIPE LDCCC ;IF IN LOADER CONDITIONAL, + TLO C,3LLV ;THEN LOADER MUST SUPPLY VALUE + PUSHJ P,VSM2 ;DEFINE SYM + TLO SYM,40000 ;SET GLOBAL BIT IN SQUOZE +EQL1CE: JUMPGE FF,ASEM1A + PUSHJ P,OUTDE1 +ASEM1A: TLNE I,MWRD + PUSHJ P,IGTXT +ATERMIN: JRST ASSEM1 + +OUTDE2: MOVEM B,WRD +OUTDE1: TLNE FF,PPSS +OUTD1: TLO C,3VP ;VALUE PUNCHED + 3PUT C,D +OUTDEF: TRO I,CONT + PUSHJ P,P70 ;PUNCH OUT CODE BITS + PUSHJ P,GTVL7B ;SET RELOCATION BITS IN SQUOZE +EQL1CC: PUSHJ P,OUTSM + TRZ I,CONT + JRST OUTWD ;OUTPUT VALUE + +EQL1C: MOVE T,LEV + CAME T,ESL1 + JRST EQL1CD ;LEVELS DIFFER + TLNE I,GLI + JRST EQL1CA ;MAKE GLOBAL +EQL1CB: PUSH P,C + PUSHJ P,LKPNRO ;MAYBE OUTPUT LINK REQUEST + PUSHJ P,RCHKMV ;INITIALIZE 3RDWRD + MOVSI T,SYMC ;SYM + PUSHJ P,EQA2A ;ENTER DEF IN SYMTAB + POP P,AA + TLNE AA,3VCNT ;USED IN CONSTANT + PUSHJ P,CONBUG + JRST EQL1CE + + ;PUNCH OUT CODE BIT PAIR, FIRST OF WHICH IS 7 + +P70: PUSHJ P,PBITS7 ;ENTRY FOR SECOND BITE IN PARBIT, PUNCH OUT THE 7 +PBITSZ: SKIPA A,PARBIT ;GET SECOND BYTE BACK +PBITS7: MOVEI A,7 ;ENTRY TO JUST PUNCH OUT 7 + JRST PBITS + +EQL1CD: TLNN I,GLI + JRST EQL1BA + JRST EQL1E ;MAKE GLOBAL + +EQL1CA: PUSHJ P,PLOGLO + JRST EQL1E +EQA2: PUSH P,CASM1A +EQA2A: IOR C,LEV + TLNE FF,SKILF + TLO C,3SKILL + JRST VSM2W + +EQL1B2: (2000+SIXBIT /QPA/) +EQL1B: PUSHJ P,RCHK + TLNE I,GLI + JRST EQLB2 ;WAS LOCAL, MAKE IT GLOBAL + ;WAS LOCAL, LEAVE IT LOCAL +EQL1B1: MOVE T,LEV + CAME T,ESL1 + JRST EQL1BA ;SYM LEVEL .NE. CURRENT + PUSHJ P,RMOVE ;PUT RELOCATION BITS IN BITS 0 AND 1 OF C (I.E. START SETTING UP 3RDWRD) + MOVSI T,SYMC ;SYM + MOVE C,ESL2 + JRST EQA2 + +COLON2: POP P,C +EQL1BA: MOVNI TT,SMK + PUSHJ P,HASH + MOVE B,ST(C) + TLZ B,740000 + JUMPE B,EQL1BB + CAMN B,SYM + JRST EQL1SM +EQL1SR: ADDI C,2 + CAIL C,2*SMK + MOVEI C,0 + AOJN TT,EQL1BA+2 + (SIXBIT /SCE/) ;SCE +EQL1BB: MOVE D,C +EQL1A1: PUSHJ P,RCHKMV + HRLZI T,SYMC + TLO C,3MAS + JRST EQA2 + +EQL1SM: 3GET D,C + TLO D,3MAS + 3PUT D,C + JRST EQL1SR + + +EQL1A: TLNN I,GLI + JRST EQL1A1 +EQ12: MOVEI C,0 + JRST EQL1D + + ;START SETTING UP 3RDWRD IN C (ALSO T) + +RCHKMV: PUSHJ P,RCHK ;CHECK RELOCATION BITS FOR VALIDITY + JRST RMOVE ;NOW COPY INTO 4.9 (R(LH)) AND 4.8 (R(RH)) OF C AND T + + ;GET VALUE OF SYM + ;SKIPS ON PSEUDO NOT RETURNING VALUE (E.G. MACRO STARTING TO BE EXPANDED) + ;ELSE RETURNS VALUE IN A, RELOCATION BITS IN B + +GETVAL: HLR AA,I + ANDI AA,3 ;MICRO DISP ON GLI+VAR + PUSHJ P,ES + JRST GTVL2 ;NOT FOUND + JRST .+1(A) ;FOUND, DISPATCH ON SQUOZE FLAGS + JRST GTVL1 ;COMMON + JRST GTVPM ;PSEUDO OR MACRO + JRST GTVL3 ;SYM + JRST GTVLE ;LOCAL UNDEF + JRST GTVL6A ;DEF LOC VAR + JRST GTVL6 ;UNDEF LOC VAR + JRST GTVLB ;DEF GLO VAR + JRST GTVLE4 ;UNDEF GLO VAR + JRST GTVL5 ;GLO ENTRY +GTVLD: TLNE I,VAR ;GLO EXIT REACHED BY DISP + JRST GTVLD1 ;MAKE UNDEF GLO VAR + +GTVLD4: +GTVLD2: AOS GLSP1 + MOVEI T,ST(D) +GTVD2A: HRRZM T,@GLSP1 +GTVLZ: JRST CABPOP + +GTVLD1: MOVSI T,UDEFGV ;MAKE UNDEF GLO VAR +GTVL1A: AOS VARCNT + HRR B,VARCNT +GTV2C1: TLO C,77 +GTVLD3: JRST GTVL2D + +GTVL2: MOVE C,LEV ;NOT FOUND + JRST .+1(AA) + JRST GTVL2P ;NEITHER MAKE UNDEF LOCAL + JRST GTVL2C ;GLI MAKE GLO EXIT + SKIPA T,[(UDEFLV)] ;VAR MAKE UNDEF LOC VAR + MOVSI T,UDEFGV ;VAR+GLI MAKE UNDEF GLO VAR + AOS B,VARCNT +GTVL2D: PUSHJ P,VSM2 + JRST GTVLD2 + +GTVL2C: MOVSI T,GLOEXT ;GLO EXIT + JRST GTV2C1 +GTVL2P: PUSHJ P,GETVUN +MLCUDF: MOVSI T,LCUDF ;LOCAL UNDEF + MOVEI B,0 + JRST GTVL2D + + ;PSEUDO OR MACRO + +GTVPM: TLZE I,VAR+GLI + (1000+SIXBIT /ILV/) ;TRYING TO MAKE PSEUDO OR MACRO GLOBAL OR VARIABLE + JRST (B) ;TRANSFER TO PSEUDO ROUTINE (MACRO => MACCL), LEAVE LH(VALUE) IN LH(B) + +GTVL1: TRO I,COM ;COMMON + HRRZ A,B + JRST CLBPOP + +GTVL3: TLZE I,VAR ;SYM + (1000+SIXBIT /MDV/) ;TRYING TO DEFINE SYM AS VARIABLE + TLNE I,GLI + JRST GTVL7 ;MAKE GLO ENTRY +GTVL8: MOVE A,B ;USED IN LBRAK + BYB LDB B,C,\3RLR_18. + TLNE C,3RLL + TLO B,1 + POPJ P, + +GTVL7: HRLZI T,GLOETY ;GLO ENTRY + TLO C,77 + PUSHJ P,VSM2 +GTVL5A: JUMPGE FF,GTVL8G + TLNN C,3LLV + TRNE I,PSEUDF+EQLF + JRST GTVL8G + TLO SYM,40000 + PUSH P,WRD + PUSHJ P,OUTDE2 + POP P,WRD +GTVL8G: TRNN I,EQLF + TRNN I,PSEUDF + TLNN C,3REL +GTVL8L: TLNE C,3LLV +GTVD2: JRST GTVLD4 + JRST GTVL8 + +GTVL6A: PUSHJ P,GTVB1 ;DEFINED LOCAL VARIABLE + TLZN I,GLI + JRST GTVL8L +GTVL6B: PUSHJ P,PLOGLO + HRLZI T,DEFGVR ;DEF GLO VAR + PUSHJ P,VSM2 +GTVLB: PUSH P,GTVD2 ;DEF GLO VAR +GTVB1: TRNE FF,PSS + TLNN I,VAR + POPJ P, + TLO C,3VAS2 + JRST VSM3A + +GTVL6: TLNN I,GLI ;UNDEF LOC VAR + JRST GTVLE4 + PUSHJ P,PLOGLO + HRLZI T,UDEFGV ;UNDEF GLO VAR + JRST GTVL2D + +GTVL5: TLZE I,VAR ;GLOBAL ENTRY + (1000+SIXBIT /MDV/) ;MDGV + TLNE I,GLI + TLNE C,3VP + JRST GTVL8G ;VALUE PUNCHED OR DOUBLE-QUOTE NOT TYPED + JRST GTVL5A ;DOUBLE-QUOTE TYPED AND VALUE NOT PUNCHED + +GTVL7A: TLO SYM,40000 +GTVL7B: TLNE C,3RLL ;R(LH) + TLO SYM,200000 + TLNE C,3RLR ;R(RH) + TLO SYM,100000 + POPJ P, + + ;POINT (.) AS PSEUDO-OP + +GTVLP: TLNE FF,INDEFF + JRST GTVLP1 ;LOCATION INDEFINITE + TRNE FF,GLOLOC+GLOFFS + JRST GTVLP2 ;LOCATION GLOBAL + MOVE B,OFRLOC ;GET RELOCATION OF OFFSET + ADD B,CRLOC ;ADD CURRENT RELOCATION + MOVE A,CLOC ;GET CURRENT LOCATION + SKIPGE BYTM ;IF IN BYTE MODE, + HLL A,BYTWP ;SET LEFT HALF TO BYTE POINTER LEFT HALF FOR ILDB + ADD A,OFLOC ;NOW ADD OFFSET + TLZ I,FLO+DECP+PERI ;CLEAR OUT FLAGS SET WHEN LOOKED LIKE FLOATING POINT NUMBER + POPJ P, + +GTVLP1: TLNE FF,PPSS ;LOCATION INDEFINITE + (1000+SIXBIT /PNI/) + JRST GTVLZ + +GTVLP2: MOVEI T,$.H ;LOCATION GLOBAL + AOS GLSP1 + HRRZM T,@GLSP1 ;PUT $. ON GLOBAL LIST (INCLUDES OFFSET, WHETHER GLOBAL OR NOT) + TRNE FF,GLOFFS + JRST CABPOP + MOVEI A,0 + SKIPGE BYTM ;IN BYTE MODE? + HLL A,BYTWP ;YES, USE LH(BP) AS ABS PART + ADD A,OFLOC + MOVE B,OFRLOC + POPJ P, + +$.H: (GLOETY)+SQUOZE 0,$. ;CURRENT LOCATION + OFFSET IN LOADER + +GTVLE: TLNE C,3LLV ;LOCAL UNDEFINED, SKIP IF PROBLEM HASN'T BEEN GIVEN TO LOADER + JRST GTVLD4 ;GTVD2 -> GTVLD2 FOR PUSH + JRST .+1(AA) ;NOT LOADER'S PROBLEM, SEE IF BEING "DEFINED" RIGHT NOW + JRST GTVLE4 ;NEITHER CONT AS LOCAL UNDEF + JRST GTVLE1 ;GLI + JRST GTVLE2 ;MAKE LOCAL UNDEF VAR + PUSHJ P,PLOGLO + JRST GTVLD1 ;MAKE UNDEF GLO VAR + +GTVLE2: PUSHJ P,GETVUN + HRLZI T,UDEFLV + JRST GTVL1A +GTVLE1: PUSHJ P,PLOGLO + JRST GTVL2C + +GTVLE4: PUSHJ P,GETVUN ;UNDEFINED GLOBAL VARIABLE + JRST GTVLD2 + +GETVUN: TRZ I,DEF ;UNDEFINED (CALLED W/ PUSHJ FROM VARIOUS PLACES), COMPLAIN OR RETURN + TRNE I,PSEUDF + JRST GTVER ;PSEUDO + TRNN FF,PSS + POPJ P, ;PASS 1 + SKIPN CONDEP + (1000+SIXBIT /USW/) + SKIPE CONDEP + (1000+SIXBIT /USC/) +GTVER1: POP P,1(P) + JRST GTVLZ + +GTVER: 0 ;ERROR UUO (OR WHATEVER) TO EXECUTE ON UNDEFINED SYMBOL IN PSEUDO + JRST GTVER1 + + ;PUNCH OUT LOCAL-GLOBAL RECOVERY BITS AND SYM + ;I.E. TELL LOADER THAT SQUOZE IN SYM, FORMERLY CONSIDERED LOCAL, IS REALLY GLOBAL + +PLOGLO: PUSH P,A + PUSHJ P,PBITS7 + MOVEI A,CLGLO + PUSHJ P,PBITS + PUSHJ P,OUTSM + JRST POPAJ + + ;DISPATCH TABLE FOR NON-SQUOZE CHARACTERS + ;REFERENCED AS DTB-40(RH OF POPJ IN GDTAB) + ;DTB ENTRY OF SYL TERMINATOR PUT IN CDISP BY GETSYL + +DSYL==400000 ;SYL OPERATOR, DISPATCH INDEXED BY RH AT GETSYL (MUST BE SIGN) +DFLD==200000 ;FIELD OPERATOR, GETFD +DWRD==100000 ;WORD OP, GETWD +;ALL CLEAR => WORD TERMINATOR, NO DISPATCH + +DTB: DWRD,,SPACE ;40 SP + DSYL,,RRL2 ;EXCLAIM + DSYL,,DQUOTE ;" + DFLD,,XORF ;NUM SIGN + 0 ;DOLLARS + 0 ;PERCNT + DFLD,,ANDF ;AMPERSAND + DSYL,,SQUOTE ;' + DFLD,,LEFTP ;( 50 + 0 ;) + DFLD,,MULTP ; STAR TIMES + DFLD,,PLS ;+ PLUS + DWRD,,COMMA ; , + DFLD,,MINUS ;- + DSYL,,PERIOD ;PERIOD + DFLD,,DIVID ;/ + DSYL,,COLON ;COLON 60 + DSYL,,SEMIC ;SEMI + DFLD,,LSSTH ;< + DSYL,,EQUAL ;= + 0 ;> + 0 ;? + DSYL,,ATSGN ;AT SIGN + DFLD,,LBRAK ;[ + DFLD,,IORF ;BACKSLASH 70 + DSYL,,RBRAK ;] + DSYL,,UPARR ;^ + DSYL,,BAKAR ;BACKARR + 0 ;CR + DWRD,,SPACE ;TAB + 0 ;ALL OTHER + + ;EVALUATE SYMBOL, SQUOZE (FLAGS OFF) IN SYM + ;RETURNS CRUD AS DOCUMENTED IN COMMENTS, SKIPS IF FOUND + +ES: SETOB D,ESL1 ;LH(ESL1) GETS LEVEL OF SYM + MOVNI TT,SMK + MOVE B,SYM ;HASH AWAY + TLZ B,740000 + TSC B,B + MOVMS B + IDIVI B,SMK + ASH C,1 +ES4: SKIPN B,ST(C) ;GET SQUOZE IN THIS ST SLOT + JRST ES2 ;NOTHING WHERE SYM BELONGS, TERM SEARCH + TLZ B,740000 ;CLEAR OUT FLAGS + CAME B,SYM ;COMPARE WITH WANTED + JRST ES3 ;NO MATCH BUT MAYBE KEEP GOING + 3GET A,C ;FOUND SYM, GET 3RDWRD + MOVE TM,A ;SAVE 3RDWRD + TLZ A,777700 ;MASK TO BEGIN/END LEVEL + SKIPN FLDCNT + JUMPE A,ES3B1 + CAMG A,ESL1 + JRST ES3 ;.LE. LEVEL OF LAST ONE FOUND +ES3B: MOVEM TM,ESL2 ;3RDWRD + MOVEM A,ESL1 ;BEGIN/END LEVEL + MOVEM C,SADR + TLNN TM,3MAS + JRST ES2A ;NO MORE SYMS AT DIFFERENT LEVELS, USE HIGHEST-NUMBERED-LEVEL ONE +ES3: JUMPN B,ES5 + SKIPGE D ;EXPUNGED + MOVE D,C ;SAVE SADR OF THIS (IN CASE DEFINING RATHER THAN USING VALUE OF SYM) AND TRY AGAIN +ES5: ADDI C,2 + CAIL C,2*SMK + MOVEI C,0 ;AT END OF ST, RING BACK TO BEGINNING + AOJN TT,ES4 + SKIPL ESL1 ;OOPS! SEARCHED THROUGH ENTIRE SYMTAB + JRST ES2A + JUMPGE D,ES6A + (SIXBIT /SCE/) ;SYMBOL TABLE FULL (STORAGE CAPACITY EXCEEDED) + +ES2: SKIPGE ESL1 + JRST ES6 +ES2A: MOVE D,SADR ;INDEX INTO SYMTAB + MOVE A,ST(D) ;SQUOZE W/ FLAGS + ROT A,4 + ANDI A,17 ;A := SQUOZE FLAGS + MOVE B,ST+1(D) ;B := VALUE OF SYM + MOVE C,ESL2 ;C := 3RDWRD (HALFWORD IN LEFT HALF) + ;D HAS INDEX INTO SYMBOL TABLE +POPJ1: AOS (P) + POPJ P, + +ES3B1: MOVSI A,100 ;TAKE 0 LEVEL SYM IN LEFT MOST FIELD + JRST ES3B + +EXTCOR: .SUSET [.RMEMT,,A] + PUSH P,A + IDIVI A,2000 +RECORE: .CORE 1(A) + JRST MEMERR + POP P,A + POPJ P, +MEMERR: PUSH P,A + TYPR [ASCIZ /NO CORE, TYPE ANY CHARACTER TO RETRY +!/] + PUSHJ P,TYI + POP P,A + JRST RECORE + +ES6: SKIPGE D + MOVE D,C +ES6A: MOVEM D,SADR + POPJ P, + + ;ENTER A SYM IN SYMBOL TABLE + ;B HAS VALUE + ;C HAS 3RDWRD + ;D HAS INDEX INTO ST (PROBABLY SET UP BY ES) + ;T HAS SQUOZE FLAGS (ONLY) IN PLACE FOR IOR OF SQUOZE + ;SYM HAS SQUOZE, FLAGS OF WHICH ARE IGNORED + +VSM2LV: TLOA C,3LLV ;ENTRY FOR LINKING LOADER MUST SUPPLY VALUE +VSM2W: MOVE B,WRD ;ENTRY TO ENTER VALUE OF WRD STEAD B +VSM2: MOVE CH1,SYM + TLZ CH1,740000 + IOR T,CH1 ;T := SQUOZE WITH FLAGS + MOVEM T,ST(D) ;STORE SQUOZE +VSM3: MOVEM B,ST+1(D) ;STORE VALUE +VSM3A: 3PUT C,D ;STORE 3RDWRD + POPJ P, + + +HASH: MOVE B,SYM ;HASH ALGORITHM AS SUBROUTINE (ALSO EXECUTED IN-LINE AT ES) + TLZ B,740000 + TSC B,B + MOVMS B + IDIVI B,SMK + ASH C,1 + POPJ P, + +;FORMAT TABLE(S) +;4.9-4.4 ETC SPECIFY SHIFT +;4.4-3.6 ETC SPECIFY NUMBER BITS +;FIELD SPECS IN REVERSE ORDER + +IFORTB: 2200,, ;NCNCF 13 ,,C + 2200000000 ;NCFSN 14 ,B + 0 ;NCFSF 15 ,B C + 0 ;NCFCN 16 ,B, + 0 ;NCFCF 17 ,B,C + 4400000000 ;FSNSN 20 A + 0 ;FSNSF 21 IMPOS + 0 ;FSNCN 22 IMPOS + 0 ;FSNCF 23 IMPOS + 2200440000 ;FSFSN 24 A B + 2200220044 ;FSFSF 25 A B C + 270400440000 ;FSFCN 26 A B, + 2227040044 ;FSFCF 27 A B,C + 4400000000 ;FCNSN 30 A, + 0 ;FCNSF 31 IMPOS + 22220000 ;FCNCN 32 A,, + 2200002222 ;FCNCF 33 A,,B + 2200440000 ;FCFSN 34 A,B + 0 ;FCFSF 35 A,B C + 0 ;FCFCN 36 A,B, + 0 ;FCFCF 37 A,B,C +FORTAB: BLOCK .-IFORTB ;ACTUAL FORMAT TABLE +FRTBE=.-1 + + ;.FORMAT + +A.FORMAT: PUSHJ P,AGETFD ;GET FIRST FIELD (FORMAT #) + (1000+SIXBIT /UF1/) + PUSH P,A + PUSHJ P,AGETFD ;GET SECOND FIELD (TABLE ENTRY FOR FORMAT NUMBER) + (1000+SIXBIT /UF2/) + POP P,B + MOVEM A,FORTAB-13(B) + JRST ASSEM1 + + ;GETWORD + +GETWRD: MOVE T,GLSP1 + MOVEM T,GLSP2 + CLEARM FORMAT ;CLEAR FORMAT, WILL ACCUMULATE FORMAT NUMBER BY IDPB + CLEARM WRD ;CLEAR WRD, WILL ACCUMULATE ABSOLUTE PART OF WORD + CLEARM WRDRLC ; " RELOCATION BITS, " + TDZ I,[WRDF,,AIOWD] + CLEARM FLDCNT ;NO FIELDS YET + MOVE T,[50100,,FORMAT] ;SET UP BIT POINTER TO FORMAT + MOVEM T,FORPNR +GTWD1: PUSHJ P,GETFLD ;READ NEXT FIELD + MOVEI T,1 ;SET T TO 1, AC FOR IDPB ON ROUTINE DISPATCHED TO + MOVE C,CDISP + TLNE C,DWRD + JRST (C) ;NO DISPATCH MEANS WD TERMINATOR + MOVE C,GLSP1 + MOVEM C,LINKL ;MARK END OF ACTIVE PART OF GLOTB + TRNN I,FLD + JRST GETWD2 ;LAST FIELD NULL, MAYBE HAVE TO POP STUFF OFF + IDPB T,FORPNR ;MARK NON-NULL FIELD IN FORMAT +GTWD4A: TLO I,WRDF ;NON-NULL WORD +GTWD4: MOVE TT,FORMAT + SKIPN TT,FORTAB-13(TT) ;PICK UP BYTE POINTER POSITION/SIZE FIELDS FOR FIELDS IN WORD + (2000+SIXBIT /UFM/) ;UNDEFINED FORMAT + MOVEM TT,FORMAT ;STORE IN FORMAT + MOVE T,[301400,,FORMAT] + MOVEM T,FORPNR + ;AT THIS POINT, FLDCNT HAS 1 LESS THAN # FIELDS; PUT FIELDS TOGETHER TO FORM WORD +GTWD3: LDB T,FORPNR + MOVE D,FLDCNT + CAIG D,2 + IBP FORPNR ;HAVEN'T BACKED UP TO THIRD FIELD YET, INCREMENT TO DESC FOR PREV + PUSHJ P,INTFLD ;PUT FIELD WHERE IT BELONGS + SOSGE FLDCNT + JRST GTWD5 ;THIS WAS LAST (FIRST) FIELD + POP P,GLSP2 ;NOT YET, POP OFF MORE + POP P,GLSP1 + POP P,B + POP P,A + JRST GTWD3 + +GTWD5: MOVE A,WRD + MOVE B,WRDRLC + MOVE C,LINKL + MOVEM C,GLSP1 + TRZ I,AIOWD + POPJ P, + +SPACE2: POP P,A +COMMA: TRNN I,FLD ;FIELD DELIMITER WAS COMMA (T HAS 1) + JRST COMMA1 ;NO FIELD + IDPB T,FORPNR ;MARK NON-NULL FIELD +COMMA4: IDPB T,FORPNR ;MARK FIELD TERMINATOR WAS COMMA +PUSHFD: PUSH P,A ;DONE WITH THIS FIELD, NOW TO GET NEXT + PUSH P,B + PUSH P,GLSP1 + PUSH P,GLSP2 +POPFD1: AOS FLDCNT ;ANOTHER FIELD + MOVE TT,GLSP1 + MOVEM TT,GLSP2 + HRRZ T,FORPNR + CAIN T,FORMAT + JRST GTWD1 + +GTWD6: HRLZI T,440000 + HLLM T,FORPNR + JRST GTWD1 + +GETWD2: SKIPN FORMAT ;LAST FIELD OF WORD IS NULL + POPJ P, ;ENTIRE WORD NULL, RETURN FROM GETWD + SOS FLDCNT + POP P,GLSP2 + POP P,GLSP1 + POP P,B + POP P,A + JRST GTWD4A + +COMMA1: IBP FORPNR ;COMMA TERMINATED NULL FIELD, MARK NULL FIELD IN FORMAT + JRST COMMA4 + + ;FIELD TERMINATOR IS SPACE (T HAS 1) + +SPACE: PUSH P,A + PUSHJ P,RCH ;FLUSH OTHER SPACES, TABS + CAIE A,11 + CAIN A,40 + JRST .-3 + CAIN A,", ;FIRST NON-SPACE CHAR COMMA? + JRST SPACE2 ;YES + POP P,A ;NO, RESTORE A + TLO I,UNRCHF ;CAUSE CHAR TO BE RE-READ NEXT TIME + TRNN I,FLD + JRST GTWD1 ;NO FIELD + IDPB T,FORPNR ;T HAS 1, MARK NON-NULL FIELD IN FORMAT + IBP FORPNR ;MARK FIELD TERMINATOR WAS SPACE + JRST PUSHFD + + ;T HAS DESC BYTE, PUT FIELD IN ITS PLACE + +INTFLD: TRNE I,AIOWD + JRST .+4 ;FIRST FIELD HAS IO INSTRUCTION + MOVE TT,GLSP2 + CAMN TT,GLSP1 + JUMPE B,INTFD1 ;NO GLOBALS, JUMP IF NO RELOCATION + CAIN T,2222 ;LH + JRST INTL + CAIN T,22 ;RH + JRST INTR + CAIN T,44 ;WHOLE WORD + JRST INTW + SKIPE B + (2000+SIXBIT /IRL/) ;RELOCATION ATTEMPTED IN IRRELOCATABLE FIELD + ;(ASSUME) NO RELOCATION, CHECK FOR GLOBAL AC FIELDS + CAIN T,2704 ;HIGH AC + JRST INTACH + CAIN T,504 ;AC LOW + JRST INTACL + JUMPGE FF,INTFD1 ;JUMP ON NOT PUNCHING PASS + CAME TT,GLSP1 + (2000+SIXBIT /IGS/) ;GLOB SYM APPEARS IN ILLEGAL FIELD +INTFD1: MOVEI TT,C_12. + ROTC T,-12. ;SHIFT BYTE POINTER INTO TT + MOVEI C,0 ;INITIALIZE C TO RECEIVE FIELD IN PROPER PLACE + DPB A,TT + MOVE A,C + CAMN TT,[2200,,C] + JRST INTFD2 ;RIGHT HALF, DON'T ALLOW CARRY INTO LH + ADDM A,WRD ;ALLOW CARRY +INTFD3: MOVE A,WRDRLC + PUSHJ P,HFWDAD + MOVEM A,WRDRLC + POPJ P, + +INTFD2: ADD A,WRD ;ADD RIGHT HALVES + HRRM A,WRD + JRST INTFD3 + +INTL: HRLZ D,B ;LH + HRLZI B,SWAPF +INTR1: PUSH P,T + HRLZI C,HFWDF + PUSHJ P,LNKTC1 +PRTCL: MOVE B,D ;GET BACK MAPPED RELOCATION BITS + POP P,T +INTW: MOVE D,GLSP2 ;WHOLE WORD + HRLOI LINK,377777 + CAML D,GLSP1 + JRST INTFD1 + ANDM LINK,1(D) + AOJA D,.-3 + + +INTR: HRRZ D,B ;RH + MOVEI B,0 + JRST INTR1 + +INTACL: TDZA B,B ;AC LOW +INTACH: HRLZI B,SWAPF ;AC HIGH +INTAC1: TRNE I,AIOWD ;IO DEVICE DIDDLE + LSH A,1 + TRNE I,AIOWD + ADDI T,6 + HRLZI C,ACF + PUSH P,T + PUSHJ P,LNKTC1 + MOVEI B,0 + JRST PRTCL+1 + + ;HERE FROM PBITS TO OUTPUT WORD OF CODE BITS + +PBITS3: PUSH P,A + MOVEI A,14 + MOVEM A,PBITS2 ;INITIALIZE PBITS2 FOR COUNTING DOWN THROUGH NEXT SET OF CODE BITS + MOVE A,[440300,,PBITS1] + MOVEM A,BITP ;SET UP BITP FOR RELOADING PBITS1 WITH CODE BITS + MOVE A,PBITS1 ;NOW GET ACCUMULATED WORD OF BITS + MOVEM A,@PBITS4 ;STORE IN BKBUF + AOS A,OPT1 ;RESERVE SPACE FOR NEW WORD + ;IF BITF SET (LAST CALL TO PBITS HAD 7) THEN NEXT WORD OF CODE BITS GOES + ;AFTER NEXT WORD OUTPUT (REALLY!), OTHERWISE BEFORE + TRNN FF,BITF + SOSA A + TRO FF,INVTF + HRRZM A,PBITS4 + POP P,A + CLEARM PBITS1 + ;DROPS THROUGH + ;OUTPUT RELOCATION CODE BITS IN A + +PBITS: SKIPE CONTRL + POPJ P, ;NOT RELOCATABLE + SOSGE PBITS2 + JRST PBITS3 ;NO MORE ROOM IN WORD, OUTPUT IT AND TRY AGAIN + TRZ FF,BITF + CAIN A,7 + TRO FF,BITF + IDPB A,BITP + POPJ P, + + ;FOLLOWING ROUTINES SAVE AC'S EXCEPT FOR A + ;GO TO EBLK IF BKBUF NON-EMPTY OR IF RELOCATABLE ASSEMBLY AND LOADER DOESN'T KNOW $. + +OUTSM: SKIPA A,SYM +OUTWD: MOVE A,WRD +OUTPUT: SKIPE CONTRL ;DIRECTLY PUNCH OUT WORD IN A IN RELOCATABLE ASSEMBLY ONLY + POPJ P, ;DO NOTHING IF ABSOLUTE ASSEMBLY + PUSH P,AA + MOVE AA,OPT1 + TRZN FF,INVTF ;SKIP IF BEING HACKED FROM PBITS3, PUT WORD BEFORE WHERE IT NORMALLY BELONGS + AOS AA + MOVEM A,-1(AA) + MOVE A,CLOC + TRZE FF,FIRWD + HRRM A,BKBUF + POP P,AA + AOS A,OPT1 + CAIL A,BSIZE+BKBUF + TRNE I,CONT + POPJ P, + ;MAY DROP THROUGH + + ;END CURRENT OUTPUT BLOCK + +EBLK: PUSH P,T + PUSH P,TT + PUSH P,A + PUSH P,B + MOVE T,CONTRL + JUMPE T,EBLK3 ;JUMP IF NOT RELOCATABLE ASSEMBLY + TRNN T,SBLKS + TRNE T,ARIM10 + JRST ESBLK + JRST EBLK5 + +EBLK3: MOVE T,PBITS1 + MOVEM T,@PBITS4 + MOVEI T,PBITS4 + MOVEM T,PBITS4 + MOVE T,[440300,,PBITS1] + MOVEM T,BITP + CLEARB TT,PBITS2 + CLEARM PBITS1 + MOVEI T,BKBUF + MOVE B,OPT1 ;GET POINTER TO END OF BLOCK + SUBI B,BKBUF+1 ;CONVERT TO # WORDS IN BLOCK (EXCLUDING HEADER) + DPB B,[220700,,BKBUF] ;SET COUNT FIELD IN HEADER + TRNE FF,FIRWD + JUMPLE B,EBLK4 ;IGNORE NULL BLOCK IF FIRWD HASN'T BEEN CLEARED + TRZ FF,LOCF + PUSHJ P,FEED +EBK1: CAML T,OPT1 ;DONE WITH BLOCK? + JRST EBK2 ;YES + MOVE A,(T) ;NO, GET DATA WORD + JFCL 4,.+1 ;UPDATE CHECKSUM + ADD TT,A + JFCL 4,[AOJA TT,.+1] + PUSHJ P,PPB ;OUTPUT WORD + AOJA T,EBK1 +EBK2: SETCM A,TT ;DONE OUTPUTTING BLOCK, NOW GET CHECKSUM + PUSHJ P,PPB ;OUTPUT CHECKSUM + MOVE T,CDATBC ;GET BLOCK TYPE + DPB T,[310700,,BKBUF] ;SET NE T BLOCK TYPE TO STORAGE WORDS BLOCK TYPE + MOVEI T,BKBUF+1 + MOVEM T,OPT1 +EBLK4: TLO FF,OUTF ;INDICATE THAT OUTPUT HAS OCCURED (FOR 1PASS MULTIPLE-ASSEMBLY HACKING) +EBLK5: TRO FF,FIRWD + POP P,B + POP P,A + POP P,TT + POP P,T + POPJ P, + +ALOC3A: SKIPN FF,CONTRL + TRZN FF,LOCF + POPJ P, + TRZ FF,FIRWD + JRST EBLK + + ;PUNCH OUT WORD OF CODED DATA (E.G. STORAGE WORD); WRD, WRDRLC, GLOTB ENTRIES + +PWRDA: TROA FF,NLIKF ;SUPPRESS ADR LINKING +PWRD: TRZ FF,NLIKF ;PERMIT ADR LINKING + JUMPGE FF,CPOPJ ;IGNORE IF NOT PUNCHING PASS +IFN LISTSW,[ + SKIPGE LISTPF + PUSHJ P,PNTR + SETOM LISTPF + MOVE LINK,WRD + MOVEM LINK,LISTWD + MOVE LINK,WRDRLC + MOVEM LINK,LSTRLC + MOVE LINK,CLOC + MOVEM LINK,LISTAD + MOVE LINK,CRLOC + DPB LINK,[220100,,LISTAD] +] + SKIPE LINK,CONTRL + JRST PWRD1 ;ABSOLUTE ASSEMBLY + ;RELOCATABLE ASSEMBLY + PUSHJ P,RCHK ;CHECK VALIDITY OF RELOCATION, STANDARDIZE IF NON-STANDARD + MOVE A,GLSP2 + CAMN A,GLSP1 + JRST PWRD2 ;NO GLOBALS + + ;NOW TO SEE IF IT'S POSSIBLE OR DESIRABLE TO ADDRESS LINK + + HRLZ B,WRD + HRR B,WRDRLC + JUMPN B,PWRD3 ;JUMP IF RH NON-ZERO + MOVEI T,0 +PWRD4: CAML A,GLSP1 + JRST PWRD5 ;DONE + HRRZ TT,1(A) ;GET GLOTB ENTRY + JUMPE TT,PWRD7A + LDB TT,[400400,,(TT)] ;GET SQUOZE FLAGS FROM SYM + CAIE TT,DEFGVR_-14. + CAIN TT,GLOETY_-14. + JRST PWRD3 ;DEFINED, BUT MUST BE HERE FOR A REASON (SEE $.H) + HLRZ TT,1(A) + TRNN FF,NLIKF+GLOLOC + TRNE TT,1777 + JRST PWRD3 + SKIPN LDCCC + TRNE TT,MINF + JRST PWRD3 + TRNE TT,HFWDF + JRST PWRD7 + TRNE TT,ACF + TRNN TT,SWAPF + JRST PWRD3 ;NOT HIGH AC +PWRD7A: AOJA A,PWRD4 +PWRD7: TRNE TT,SWAPF + AOJA A,PWRD4 ;LEFT HALF + MOVEI D,1(A) ;FIRST GLOBAL, SET UP POINTER TO GLOTB ENTRY + AOS T + AOJA A,PWRD4 + +PWRD5: SOJN T,PWRD3 ;NO GLOBALS LOOK BAD AND THERE AREN'T TOO MANY; JUMP IF NONE IN RH + HRRZ T,(D) ;GET ADR OF SQUOZE + CAIL T,3RDWRD + JRST PWRD3 + PUSH P,T +PWRD5E: CAMLE D,GLSP1 + JRST PWRD5B + MOVE A,1(D) + MOVEM A,(D) + AOJA D,PWRD5E +PWRD5B: SOS GLSP1 + PUSHJ P,PWRD31 ;DUMP OUT THE OTHER GLOBALS + POP P,D ;GET ST ADR OF THIS AGAIN + 3GET1 A,D + BYB LDB A,A,\3RLNK_18. + MOVE B,WRDRLC + TLNE B,1 + TRO A,2 ;RELOCATE LEFT HALF + PUSHJ P,PBITS ;PUNCH OUT APPROPRIATE BITS FOR LINK LIST ENTRY + HLR A,1(D) ;GET ADR OF LAST + HLL A,WRD + PUSHJ P,OUTPUT ;OUTPUT WORD WITH RH = ADR OF LAST RQ FOR SYM TO PUT IN RH'S + MOVE A,CLOC ;NOW UPDATE ST ENTRY + HRLM A,1(D) + MOVE A,CRLOC + 3GET1 B,D + TLZ B,100000 + JUMPE A,.+2 + TLO B,100000 + 3PUT1 B,D + POPJ P, + +PWRD31: MOVE T,GLSP2 ;DUMP ALL GLO S IN GENERAL FORMAT +PWRD3A: CAML T,GLSP1 + POPJ P, + MOVE B,1(T) + TRNN B,-1 + AOJA T,PWRD3A + TLNE B,1777 + JRST RPWRD ;REPEAT +RPWRD1: BYB LDB A,B,\MINF_18. + TRO A,4 + PUSHJ P,PBITS + MOVE A,(B) ;CODEBITS +SQUOZE FOR SYM + HLRZ C,A + TLZ A,740000 + CAIL C,DEFGVR + TLO A,40000 ;SYM IS GLO +PWRD3D: TLNE B,SWAPF + TLO A,400000 + TLNE B,ACF + JRST PWRD3E ;AC HIGH OR LOW + TLNN B,HFWDF + JRST PWRD3F ;ALL THROUGH + TLO A,100000 + TLNE B,SWAPF + TLC A,300000 +PWRD3F: PUSHJ P,OUTPUT + AOJA T,PWRD3A + + + +RPWRD: PUSHJ P,PBITS7 + MOVEI A,CRPT + PUSHJ P,PBITS + LDB A,[221200,,B] + PUSHJ P,OUTPUT + JRST RPWRD1 + +PWRD3E: TLO A,300000 + JRST PWRD3F + +PWRD3: PUSHJ P,PWRD31 +PWRD2: PUSHJ P,RCHK + HRRZ A,B + DPB C,[10100,,A] + PUSHJ P,PBITS + JRST OUTWD + + ;CHECK FOR VALIDITY OF RELOCATION BITS OF CURRENT WORD + ;LEAVE RELOC (RH) IN B, RELOC (LH) IN C + +RCHK: HRRZ B,WRDRLC ;RELOCATION OF RIGHT HALF + HLRZ C,WRDRLC ;RELOCATION OF LEFT HALF (ASSUMING RIGHT HALF OK) + CAIE B,1 ;CHECK RIGHT HALF + JUMPN B,RLCERR + CAIE C,1 ;NOW LEFT HALF + JUMPN C,RLCERR + POPJ P, ;LOOKS OK +RLCERR: (1000+SIXBIT /IRC/) ;RELOCATION OTHER THAN 0 OR 1 ENCOUNTERED WHERE ONLY 0 OR 1 ALLOWED + POPJ P, + +RMOVE: MOVEI T,0 + DPB C,[430100,,T] ;R(LH) + DPB B,[420100,,T] ;R(RH) + MOVE C,T + POPJ P, + + ;PWRD DURING ABSOLUTE ASSEMBLY + +PWRD1: MOVE A,GLSP1 + CAME A,GLSP2 + (2000+SIXBIT /ILA/) ;GLOBALS APPEARING ILLEGALLY + SKIPE WRDRLC + (2000+SIXBIT /IRA/) ;RELOCATION APPEARING ILLEGALLY + TRNE LINK,ARIM + JRST PRIM ;RIM + TRNE LINK,ARIM1 + JRST PRIM1 +SBLKS1: MOVE A,WRD ;SBLK + MOVEM A,@OPT1 ;STORE WRD IN BKBUF + MOVE A,CLOC + TRZE FF,FIRWD + MOVEM A,BKBUF ;FIRST WORD OF BLOCK, SET UP HEADER + AOS A,OPT1 + CAIGE A,BKBUF+BSIZE + POPJ P, ;BKBUF NOT FULL YET + +SBLKS2: SUBI A,BKBUF+1 + JUMPE A,CPOPJ + MOVNS A + HRLM A,BKBUF + PUSHJ P,FEED + MOVEI T,BKBUF + CLEARM SCKSUM +SBLK1: CAML T,OPT1 + JRST SBLK2 + MOVE A,SCKSUM + ROT A,1 + ADD A,(T) + MOVEM A,SCKSUM + MOVE A,(T) + PUSHJ P,PPB + AOJA T,SBLK1 + +SBLK2: TRO FF,FIRWD + MOVEI A,BKBUF+1 + MOVEM A,OPT1 + MOVE A,SCKSUM + JRST PPB + +ESBLK: MOVE A,OPT1 + PUSHJ P,SBLKS2 + JRST EBLK4 + +PRIM: MOVSI A,(DATAI PTR,) + HRR A,CLOC + PUSHJ P,PPB + MOVE A,WRD + JRST PPB + +PRIM1: MOVSI A,(HRRI TM,) + HRR A,WRD + PUSHJ P,PPB + MOVSI A,(HRRM TM,) + HRR A,CLOC + PUSHJ P,PPB + MOVSI A,(HRRI TM,) + HLR A,WRD + PUSHJ P,PPB + MOVSI A,(HRLM TM,) + HRR A,CLOC + JRST PPB + + ;.LIBRA, .LIFS, ETC. + +A.LIFN: MOVEI A,LTCN + JRST LIB9 + +A.LIFS: SKIPA A,[LTCP] +A.LIB: MOVEI A,LLIB +LIB9: HRRM A,LIB3 +LIB4: CLEARM LIBOP ;INITIALIZE SQUOZE FLAGS + PUSHJ P,EBLK ;END CURRENT OUTPUT BLOCK, MAKING SURE LOADER KNOWS $. +LIB1: PUSHJ P,GETSYL ;GET NAME + TRNN I,SYL + JRST LIB2 ;NO SYL, DON'T OUTPUT + IOR SYM,LIBOP + TLO SYM,40000 + PUSHJ P,OUTSM + MOVSI A,400000 + ANDCAM A,LIBOP +LIB2: MOVE B,LIMBO1 + CAIE B,12 + CAIN B,15 + JRST LIB3 ;WORD TERMINATOR => DONE + MOVE A,LIBOP + CAIN B,", + MOVSI A,400000 + CAIN B,"+ + TLZ A,200000 + CAIN B,"- + TLO A,200000 + MOVEM A,LIBOP + JRST LIB1 + +LIB3: MOVEI A,LLIB ;RH OVERWRITTEN ABOVE + DPB A,[310700,,BKBUF] + PUSHJ P,EBLK + CAIN A,LLIB ;.LIBRA? + JRST ARELC1 ;.LIBRA, NOW PLAY LIKE RELOCA PSEUDO + JRST LIB5 ;SOMETHING ELSE (.LIFS), INCREMENT DEPTH IN LOAD TIME CONDITIONALS + +LIBOP: 0 ;TEMP AT A.LIB, HAS SQUOZE BITS + +A.ELDC: PUSHJ P,EBLK + MOVEI A,ELTCB + DPB A,[310700,,BKBUF] + TRZ FF,FIRWD + PUSHJ P,EBLK + SOSGE LDCCC + CLEARM LDCCC ;LOADER CONDITIONAL UNDERFLOW + JRST ASSEM1 + + ;LOADER CONDITIONAL ON VALUE + +A.LDCV: LSH B,-27. + PUSH P,B + PUSHJ P,EBLK + MOVE A,[1000,,(SIXBIT /ULC/)] ;UNDEFINED IN LOADER CONDITIONAL + MOVEM A,GTVER + TRO I,PSEUDF + PUSHJ P,GETWRD + POP P,B + DPB B,[400300,,BKBUF] + MOVEI A,LDCV + PUSHJ P,PLDCM + MOVEI A,0 + DPB A,[400300,,BKBUF] +LIB5: AOS LDCCC +CCASM1: JRST ASSEM1 + +AEND: +IFN LISTSW,[ + MOVE A,[440700,,LISTBF] + EXCH A,PNTBP + MOVEM A,LISTTM +] + PUSHJ P,AVARIA+1 + PUSHJ P,CNSTNT+1 + SKIPN A,CONTRL + PUSHJ P,AEND5 ;RELOCATABLE => .LNKOT +AEND5D: TRNN FF,PSS ;IF PASS 2, + TRNN FF,NPSS ;OR IF 1PASS ASSEMBLY, + JRST AEND1 ;THEN MUCH HAIR, (IF RELOCATABLE THEN EVENTUALLY GOES TO AEND3) +AEND4: PUSHJ P,GETWRD ;OTHERWISE EAT UP WORD, + JRST RETURN ;AND RETURN + + +AEND3: HRRZ A,CLOC + HRRM A,BKBUF ;SET UP PROGRAM BREAK JUST IN CASE OUTPUTTING MORE NULL DATA BLOCKS + TRZ FF,FIRWD + PUSHJ P,EBLK + MOVEI A,LCJMP + PUSHJ P,PLDCM + JRST AEND2 + +PS2": HRRM A,RETURN ;PASS 2 (MAIN ROUTINE, PASS 2 INITIALIZATION NOT ALREADY DONE), SAVE RETURN + JUMPL FF,PA2A ;JUMP IF PASS 1 ENDED IN 1PASS MODE + TDO FF,[PPSS,,PSS] ;SET PUNCHING PASS AND PASS 2 FLAGS + TRZ FF,GLOLOC ;RE-INITIALIZINT CURRENT LOCATION, CLEAR GLOBAL LOCATION FLAG + PUSHJ P,P2INI ;INITIALIZE + JRST ASSEM1 ;START ASSEMBLING + +PA2A: MOVSI A,-SMK ;PASS 2 OF 1PASS ASSEMBLY, CHECK FOR UNDEFINED LOCALS +PA2C: MOVE SYM,ST(A) ;GET SQUOZE THIS SYMTAB ENTRY + LDB B,[400400,,SYM] ;GET FLAGS + CAIE B,LCUDF_-14. ;LOCAL UNDEFINED? + JRST PA2B ;NOT LOCAL UNDEFINED, DON'T COMPLAIN + 3GET C,A ;LOCAL UNDEFINED, GET 3RDWRD ST ENTRY + TLZ SYM,740000 ;CLEAR OUT FLAGS IN SYM IN ANTICIPATION OF TYPING OUT COMPLAINT + TLNN C,3LLV ;PROBLEM HANDED TO LINKING LOADER? + (1000+SIXBIT /USW/) ;NO, JUST PLAIN UNDEFINED +PA2B: AOS A ;NOW GO FOR NEXT ST ENTRY + AOBJN A,PA2C + JRST RETURN + + ;PUNCH OUT COMPLETE LOADER COMMAND, PUNCHING OUT WRD AS ONLY CONTENTS + +PLDCM: TRZ FF,FIRWD + HRRM A,BKBUF + MOVEI A,LLDCM + DPB A,[310700,,BKBUF] + PUSHJ P,PWRDA ;PUNCH OUT THE WORD + JRST EBLK + +PLOD": HRRM A,RETURN ;MAIN ROUTINE TO PUNCH LOADER, CALLED BEFORE PASS 2 (PS2"), SAVE RETURN POINT + PUSHJ P,PLOD1 ;PUNCH LOADER + JRST RETURN ;RETURN + + ;PUNCH OUT THE LOADER + +PLOD1: PUSHJ P,FEED1 ;LEAVE LOTS OF BLANK PAPER TAPE + MOVE B,CONTRL + TRNE B,ARIM10 + JRST PLOD2 ;RIM10 => PUNCH OUT SBLK LOADER FOR PDP10 READIN-MODE READIN + TRNN B,SBLKS + POPJ P, ;NOT SBLK => DON'T PUNCH LOADER +PLOD1A: MOVSI B,SLOAD-SLOADP ;PUNCH SBLK LOADER IN RIM FORMAT + MOVSI C,(DATAI PTR,) +PLOAD1: MOVE A,C + PUSHJ P,PPBA + CAMN C,[DATAI PTR,13] + HRRI C,27 + MOVE A,SLOAD(B) + PUSHJ P,PPBA + AOS C + AOBJN B,PLOAD1 + MOVE A,[JRST 1] + PUSHJ P, PPBA + JRST FEED1 + + ;.SLDR + ;PUNCH OUT SBLK LOADER NOW AND SELECT SBLK FORMAT + +A.SLDR: PUSHJ P,FEED1 ;LEAVE LOTS OF BLANK PAPER TAPE FIRST + PUSHJ P,PLOD1A ;PUNCH OUT LOADER + JRST SIMBLK ;SELECT SBLK FORMAT AND JRST ASSEM1 + +PLOD2: MOVSI C,LDR10-ELDR10 ;PUNCH SBLK LOADER FOR PDP10 READIN +PLOD3: MOVE A,LDR10(C) + PUSHJ P,PPBA + AOBJN C,PLOD3 + JRST FEED1 + +AEND1: PUSHJ P,EBLK +IFN LISTSW,[ + SKIPGE LISTPF + PUSHJ P,PNTR + MOVE A,LISTTM + MOVEM A,PNTBP +] + TRO I,PSEUDF+DEF + MOVE A,[1000,,(SIXBIT /USE/)] ;UNDEFINED SYM IN END + MOVEM A,GTVER + PUSHJ P,GETWRD +IFN LISTSW,[ + MOVEM A,LISTWD + MOVEM B,LSTRLC + SETOM LISTAD + SETOM LISTPF + PUSHJ P,PNTR + PUSHJ P,LPTCLS" ;DONE LISTING +] + SKIPN CONTRL + JRST AEND3 ;RELOCATABLE + TLNN A,777000 ;CHECK INSTRUCTION PART + ADD A,[JRST] ;INSTRUCTION PART 0; HE WANTS JRST + PUSHJ P,PPB + JUMPG A,.+3 + 2000,,(SIXBIT /EWN/) ;END WORD NEGATIVE + HRLI A,(JRST) ;END SYMTAB WITH POSITIVE WORD + MOVEM A,STARTA ;SAVE FOR PUNCHOUT AT END OF SYMTAB + PUSHJ P,FEED1 +AEND2: PUSHJ P,CNARTP + JRST RETURN + +A.LNKOT: PUSH P,CCASM1 + +AEND5: JUMPGE FF,CPOPJ ;IGNORE FOLLOWING ON NOT PUNCHING PASS + MOVSI D,-SMK +AEND5A: MOVE SYM,ST(D) + LDB T,[400400,,SYM] + CAIE T,DEFLVR_-14. + CAIN T,DEFGVR_-14. + JRST AEND5E + CAIE T,LCUDF_-14. + CAIN T,GLOEXT_-14. + JRST AEND5B +AEND5C: AOS D + AOBJN D,AEND5A + POPJ P, + +AEND5E: 3GET C,D + TLNN C,3LLV + JRST AEND5C +AEND5B: HLLZ B,ST+1(D) + 3GET C,D + TLNN C,3RLNK + JUMPE B,AEND5C + TLZ SYM,740000 + CAIE T,LCUDF_-14. + CAIN T,DEFLVR_-14. + SKIPA + TLO SYM,40000 + PUSHJ P,LKPNRO + HRRZS FF,ST+1(D) + TLZ C,3RLNK + 3PUT C,D + JRST AEND5C + + ;LOC, BLOCK, .= + +ALOC: SETZM BLOCKF + TLZ FF,INDEFF + TRO I,PSEUDF+DEF + PUSHJ P,EBLK + MOVE A,[1000,,(SIXBIT /USL/)] ;IF UNDEFINED SYM IN LOC +ABLK1: MOVEM A,GTVER + MOVEI A,", + MOVEM A,LIMBO1 + TLO I,UNRCHF + PUSHJ P,GETWRD + SKIPE BLOCKF + JRST ABLK2 + SETZM SYLOC ;CLEAR OUT LOC OF LAST TAG + SETZM SYSYM ;CLEAR OUT LAST TAG SO ERROR MESSAGES DON'T PRINT OBSCENE INCREMENTS +ABLK3: TRNN I,DEF + JRST ALOC1 + MOVE T,GLSP2 + CAME T,GLSP1 + JRST ALOC3 + TRZE FF,GLOLOC + JRST ALOC5 +ALOC2: TRO FF,LOCF ;INDICATE ABS LOC ASSGT + HRRZM A,CLOC + HRRZM A,BKBUF + TDNE B,[-2] ;NO BITS ALLOWED EXCEPT LOW ORDER + 2000,,(SIXBIT /LAI/) ;ILLEGAL RELOCATION ATTEMPTED IN LOCATION ASSIGNMENT + HRRZM B,CRLOC ;STORE NEW RELOCATION + MOVEI A,2(B) ;LABS OR LREL +ALOC4: DPB A,[310700,,BKBUF] ;STORE NEW BLOCK TYPE + MOVEM A,CDATBC ;ALSO STORE AS NORMAL BLOCK TYPE + JRST ASSEM1 + +ALOC1: TLO FF,INDEFF ;LOCATION := INDEFINITE + MOVE A,[SQUOZE 0,INDEFF] + MOVEM A,SYSYM + MOVE A,CLOC + MOVEM A,SYLOC + TLNE FF,PPSS + 1000,,(SIXBIT /USL/) ;IF UNDEFINED SYM IN LOC + JRST ASSEM1 + +AXWORD: PUSHJ P,GETFLD ;XWD + MOVE C,CDISP + CAIN C,COMMA + JRST .+3 ;FIELD TERMINATOR WAS COMMA + TRNN I,FLD + JRST AXWORD ;NOT COMMA AND NO FIELD, TRY AGAIN + HRLM A,WRD + HRLM B,WRDRLC + MOVSI C,HFWDF + MOVSI B,SWAPF + PUSHJ P,LNKTC1 + PUSH P,GLSP1 + PUSHJ P,GETFLD ;NOW THE SECOND FIELD + TRNN I,FLD ;KEEP TRYING UNTIL A FIELD THERE + JRST .-2 + HRRM A,WRD + HRRM B,WRDRLC + MOVSI C,HFWDF + MOVEI B,0 + POP P,T + PUSHJ P,LINKTC + JRST CABPOP + +ALOC3: PUSHJ P,ALOC3A + MOVEI A,LCGLO + PUSHJ P,PLDCM + SETZM CLOC + MOVEI T,1 + MOVEM T,CRLOC + TRO FF,GLOLOC +AREL1: MOVEI A,LREL + JRST ALOC4 + +ALOC5: PUSH P,A + TRZ FF,FIRWD + MOVEI A,LCEGLO + PUSHJ P,PLDCM + POP P,A + JRST ALOC2 + +A.LENGTH: MOVE A,LIMBO1 + CAIN A,40 + PUSHJ P,RCH + MOVEM A,A.LN1 + MOVEI B,0 + PUSHJ P,RCH + CAME A,A.LN1 + AOJA B,.-2 + MOVE A,B + JRST VALRET +A.LN1: 0 + +ABLOCK: TRO I,PSEUDF+DEF + PUSHJ P,EBLK + MOVE A,[1000,,(SIXBIT /USB/)] ;UNDEFINED SYM IN BLOCK + SETOM BLOCKF + JRST ABLK1 + +ABLK2: TRNE FF,GLOLOC + JRST ABLK4 +ABLK5B: MOVE A,CLOC + ADDB A,WRD + MOVE B,CRLOC + ADDB B,WRDRLC + JRST ABLK3 + +ABLK4: MOVEI T,$.H + AOS GLSP1 + HRRZM T,@GLSP1 + JRST ABLK3 + +ANOSYMS: TRZ FF,IPSYMS + JRST ASSEM1 + +AEXPUNG: + PUSHJ P,GETSYL ;GET NAME + PUSHJ P,ES + JRST .+3 + HRLZI A,400000 ;EXPUNGED ZERO SYM + MOVEM A,ST(D) + MOVE A,LIMBO1 + CAIE A,15 + CAIN A,12 + JRST ASSEM1 + JRST AEXPUNG + + ;UUO HANDLING ROUTINE + ;41 HAS JSR ERROR + +ERROR: 0 + PUSH P,T + LDB T,[331100,,40] ;PICK UP OP CODE + ORCMI T,77 + AOJE T,TYPR1 ;TYPR? + PUSH P,B ;NOT TYPR => ERROR OF SOME KIND + PUSH P,A + HRRZ T,40 + CAIE T,(SIXBIT /MDT/) ;CHECK FOR SPECIAL LOSSAGES AT COLON + CAIN T,(SIXBIT /RES/) + SKIPA T,SYSYM1 + JRST .+4 ;NOT COLON LOSSAGE, SKIP UN-MUNGATUDE + MOVEM T,SYSYM ;COLON LOSSAGE, DE-MUNG TAG WORDS FOR PRINTOUT + MOVE T,SYLOC1 + MOVEM T,SYLOC + MOVE A,SYSYM ;GET LAST TAG DEFINED + JUMPE A,ERR1 ;SKIP PRINTOUT IF NONE THERE + PUSHJ P,SYMTYP ;THERE, TYPE IT OUT + MOVE B,CLOC ;NOW GET CURRENT LOCATION + SUB B,SYLOC ;SUBTRACT VALUE OF LAST TAG + JUMPE B,.+4 ;SKIP NUMERIC PRINTOUT IF RIGHT AT TAG + MOVEI A,"+ ;NOT AT TAG, + PUSHJ P,TYO ;TYPE OUT PLUS SIGN, + PUSHJ P,OCTPNT ;THEN TYPE OUT DIFFERENCE IN OCTAL +ERR1: PUSHJ P,TAB" ;NOW SEPARATE WITH TAB + PUSH P,ERROR ;SAVE RETURN, MAYBE ABOUT TO EXECUTE ANOTHER UUO + PUSH P,40 ;ALSO SAVE UUO, NEED IT LATER + TRNE FF,GLOLOC ;LOCATION GLOBAL? + TYPR [ASCIZ /GLOBAL+!/] ;YES, TYPE OUT SAME + POP P,40 ;NOW RESTORE CRUFT + POP P,ERROR + MOVE B,CLOC ;GET CURRENT LOCATION + PUSHJ P,OCTPNT ;TYPE OUT IN OCTAL + PUSHJ P,TAB ;SEPARATE FROM FOLLOWING WITH TAB + MOVE B,MDEPTH ;NOW DEPTH IN MACRO (NOT IRP, REPEAT, ETC.) EXPANSIONS + PUSHJ P,OCTPNT + PUSHJ P,TAB + MOVE A,CPGN ;CURRENT PAGE NUMBER (FIRST PAGE OF FILE => 0) + PUSHJ P,DPNT ;TYPE IT OUT IN DECIMAL + PUSHJ P,TAB + MOVE A,CLNN ;ALSO CURRENT LINE NUMBER + PUSHJ P,DPNT + PUSHJ P,TAB + ;DROPS THROUGH + + ;DROPS THROUGH + .SUSET [.SPICL,,[-1]] ;PERMIT INTERRUPTS + LDB A,[331100,,40] ;PICK UP OP CODE AGAIN + CAIGE A,7 ;ERROR UUO MAX + JRST .+1(A) + JRST IAE ;0 => NO RECV + JRST ERR2 ;1000 SYM+MESS + JRST ERR3 ;2000 MESS + JRST 4,. ;3000 RH(40) HAS JUMP ADR + JRST ERR4 ;4000 IGNORE LINE RET TO ASSEM1 + JRST ERR5 ;5000 RET TO ASSEM1 + JUMPL ERR2 ;6000 SYM ON PPSS + JRST ERRRET+1 + + ;TYPE OUT SQUOZE (FLAGS OFF) IN A + +SYMTYP: IDIVI A,50 + HRLM B,(P) + JUMPE A,.+2 + PUSHJ P,SYMTYP + HLRZ A,(P) + JUMPE A,CPOPJ + CAIL A,"% + JRST SYMTP1 + CAIL A,13 + ADDI A,7 + ADDI A,257 + JRST TYO +SYMTP1: MOVE A,SYTB-45(A) + JRST TYO + +SYTB: ". + "$ + "% + +DPNT: IDIVI A,10. + HRLM B,(P) + SKIPE A + PUSHJ P,DPNT + JRST DPNT1 + +OCTPNT: HRRZ A,B + IDIVI A,10 + HRLM B,(P) + JUMPE A,.+2 + PUSHJ P,.-3 +DPNT1: HLRZ A,(P) + ADDI A,200+"0 + JRST TYO + + +ERR4: PUSHJ P,RCH ;4000,, => IGNORE LINE, RETURN TO ASSEM1: EAT UP LINE + CAIE A,12 + JRST .-2 + +ERR5: MOVEI A,ASSEM1 ;5000,, => RETURN TO ASSEM1 + MOVEM A,ERROR +ERR2: MOVE A,SYM ;1000,, OR 6000,, ON PPSS; TYPE OUT SYM THEN MESSAGE + PUSHJ P,SYMTYP + PUSHJ P,TAB +ERR3: HRLZ B,40 ;2000,, JUST TYPE OUT MESSAGE + PUSHJ P,SIXTYO +ERRRET: PUSHJ P,CRR + POP P,A ;COMMON RETURN POINT FROM UUOS + POP P,B +TYPR1A: POP P,T + JRST 2,@ERROR + + ;TYPE OUT THE SIXBIT WORD IN B + +SIXTYO: JUMPE B,CPOPJ + MOVEI A,0 + ROTC A,6 + ADDI A,40 + PUSHJ P,TYO + JRST SIXTYO + + ;TYPE CRLF + +CRR: MOVEI A,15 + PUSHJ P,TYO + MOVEI A,12 + JRST TYO + +IAE: HRLZ B,40 ;OP CODE 0 => NO RECOVERY RETURN TO GO2 + PUSHJ P,SIXTYO + PUSHJ P,TAB + SOS B,ERROR ;MAKE OUTPUT POINT TO ERROR INSTRUCTION + PUSHJ P,OCTPNT + JRST GO2" + + ;TYPR [ASCIZ /STRING/] ;TYPE OUT STRING + +TYPR1: HRLZI B,440700 ;CONVERT TO BYTE POINTER + HRR B,40 ;GET ADR OF BEGINNING OF STRING + ILDB A,B ;GET NEXT CHAR + CAIN A,"! + JRST TYPR1A + PUSHJ P,TYO ;NON-ZERO, TYPE IT OUT + JRST .-4 + +PS1": HRRM A,RETURN ;PASS 1, (PASS 1 INITIALIZATION ALREADY DONE), SAVE RETURN +SIMBLK: SKIPA A,[SBLKS] ;ENTRY FROM PS1, A.SLDR SELECT SBLK +SRIM1: MOVEI A,ARIM1 + TRO FF,NPSS + TLO A,TRIV + MOVEM A,CONTRL ;STORE NEW CONTRL +IFN A1PSW,PUSHJ P,OUTUPD + JRST ASSEM1 + +SRIM10: SKIPA A,[ARIM10] +SRIM: MOVEI A,ARIM + JRST SRIM1+1 + +AEXP: TRZ I,SYL+LET ;OLD EXP, OCT ROUTINE +CABPOP: CLEARB A,B + POPJ P, + +ATITLE: MOVEI A,15 + TRNN FF,PSS ;PRECEDE W/ CR ON PASS 1 + PUSHJ P,TYO + PUSHJ P,GSYL + SKIPE SYM + MOVEM SYM,PRGNM + MOVE T,[440700,,STRSTO] +ATIT2: SOSGE STRCNT + JRST ATIT1 + ILDB A,T + PUSHJ P,TYO + JRST ATIT2 +ATIT1: CAIN A,12 + JRST ASSEM1 + PUSHJ P,RCH + PUSHJ P,TYO + JRST ATIT1 + +ASBEG: HRLZI A,1 ;.BEGIN + ADDM A,LEV + JRST ASSEM1 + +ASEND: MOVSI TT,400000 ;.END, PREPARE TO EXPUNGE ALL SYMS ON THIS LEVEL + HRLZI T,-SMK +ASEND2: SKIPE B,ST(T) + TDNN B,[37777,,-1] + JRST ASEND1 ;NAME NULL + 3GET B,T ;NOT NULL, GET 3RDWRD + TLZ B,777700 + CAIN B,77 + JRST ASEND1 + CAMN B,LEV + MOVEM TT,ST(T) +ASEND1: AOS T + AOBJN T,ASEND2 + HRLZI A,-1 + ADDM A,LEV + JRST ASSEM1 + +IOINST: HLLZ A,B ;IO INSTRUCTION, GET WHICH ONE INTO A + SKIPN FLDCNT ;THIS FIRST FIELD OF WORD? + TRO I,AIOWD ;YES +CLBPOP: MOVEI B,0 +CPOPJ: POPJ P, + + ;DUMP OUT THE SYMBOL TABLE + +SYMDMP: MOVEI A,FRSTDS + MOVEI B,LDDSYM +RESYM: HRRM A,DISPT + TRZ I,CONT ;OK TO END BLOCK + CLEARM GLSP1 + CLEARM GLSP2 + CLEARM WRDRLC + MOVE T,CONTRL + MOVEI A,BKBUF+1 + MOVEM A,OPT1 + MOVSI AA,-SMK +SYMD5: CLEARM CLOC + CLEARM BKBUF + JUMPN T,SYMD4 ;JUMP IF NOT RELOCATABLE + DPB B,[310700,,BKBUF] ;SET BLOCK TYPE + MOVEM B,CDATBC +SYMD4: SKIPE B,ST(AA) ;GET SYMTAB ENTRY + TDNN B,[37777,,-1] ;IF SQUOZE IS NULL, + JRST SYMD1 ;THEN TRY AGAIN + MOVEI C,0 + ROTC B,4 ;SHIFT FLAGS INTO C + MOVE D,ST+1(AA) + 3GET CH1,AA + JRST @DISPT + +FRSTDS: JRST SYMD1 + JRST SYMD1 + JRST SYMD6 + JRST SYMD1 + JRST SYMD3 + JRST SYMD1 + JRST SYMD3A + JRST SYMD1 + JRST SYMD2A + JRST SYMD1 + +SYMD3A: JUMPE T,SYMD1 +SYMD3: HRRZS FF,D +SYMD2: TLNE CH1,3LLV ;IF LINKING LOADER MUST INSERT VALUE, + JRST SYMD1 ;THEN IGNORE + ROT B,-4 ;SHIFT SQUOZE BACK TO WHERE IT BELONGS + JUMPE T,SYMD2B + TLO B,40000 + TLNE CH1,3SKILL + TLO B,400000 ;HALF-KILL + MOVEM B,WRD + PUSHJ P,PWRD + MOVEM D,WRD + PUSHJ P,PWRD +SYMD1: AOS AA + AOBJN AA,SYMD4 + PUSHJ P,EBLK + JUMPE T,SYMDA + MOVE A,STARTA + JRST PPB + +SYMD2A: JUMPN T,SYMD2 + JRST SYMD1 + + ;PUNCH OUT LOCAL SYM (RELOCATABLE ASSEMBLY) +SYMD2B: TLNE CH1,3RLL + TLO B,200000 ;RELOCATE LEFT HALF + TLNE CH1,3RLR + TLO B,100000 ;RELOCATE RIGHT HALF + TLNE CH1,3SKILL + TLO B,400000 ;HALF-KILL + MOVE A,B + PUSHJ P,OUTPUT ;OUTPUT SYM + MOVE A,D + PUSHJ P,OUTPUT ;OUTPUT VALUE + JRST SYMD1 + +IFN A1PSW,[ + ;ROUTINE TO SET VARIABLES FOR BENEFIT OF NED LOGIC + ;CALLED BY OUTPUT SELECTING PSEUDOS OTHER THAN 1PASS AND .LIBRA + +OUTUPD: TRNN FF,PSS ;IF PASS 1, + TLZ FF,PPSS ;THEN INDICATE NOT PUNCHING PASS + TROE FF,NPSS + TLNN FF,OUTF + JRST OUTCHK + AOS OUTN1 ;INDICATE "OUTPUT" HAS OCCURED OTHER THAN IN 1PASS MODE +OUTCHK: TLZE FF,OUTF + AOS OUTC ;INDICATE "OUTPUT" HAS OCCURED DURING CURRENT ASSEMBLY + POPJ P, +] + +SYMD6: TLNN CH1,"? + JRST SYMD1 + JRST SYMD2 + +CNARTP: MOVNI D,1 +CNTP1: MOVEI TT,PCNTB + CAML TT,PBCONL + POPJ P, + HRRZ B,1(TT) + HLRZ A,1(TT) + CAMN A,B + JRST CNTP2 + AOSN D + TYPR [ASCIZ /CONSTANTS AREA INCLUSIVE +FROM TO +!/] + BYB LDB B,2(TT),\CGBAL_18. + SKIPE B + TYPR [ASCIZ /GLOBAL+!/] + HRRZ B,1(TT) + PUSHJ P,OCTPNT + PUSHJ P,TAB + HLRZ B,1(TT) + SOS B + PUSHJ P,OCTPNT + PUSHJ P,CRR +CNTP2: ADDI TT,3 + JRST CNTP1+1 + +SYMDA: MOVE B,CDATBC + CAIN B,13 + JRST PTERMN + MOVEI A,LPRGN + DPB A,[310700,,BKBUF] + MOVE A,PRGNM + TLO A,40000 + PUSHJ P,OUTPUT + PUSHJ P,OUTPUT + PUSHJ P,EBLK + MOVEI B,13 + MOVEI A,DISP2 + JRST RESYM + +DISP2: JRST SYMD1 + JRST SYMD1 + JRST CHKLL + JRST HLFKL1 + JRST CHKLL + JRST SYMD1 + JRST SYMD1 + JRST SYMD1 + JRST SYMD1 + JRST SYMD1 + +CHKLL: TLNN CH1,3VP+3LLV + JRST SYMD1 + +HLFKL1: ROT B,-4 + TLZ B,740000 + MOVE A,B + TLNE CH1,3SKILL + PUSHJ P,OUTPUT + JRST SYMD1 + +DISPT: (C) + +PTERMN: MOVEI A,LPTRMN + DPB A,[310700,,BKBUF] + PUSHJ P,OUTPUT + PUSHJ P,OUTPUT + JRST EBLK + +A.OP: PUSHJ P,AGETFD + (1000+SIXBIT /U.0/) ;UNDEFINED SYMBOL IN FIELD 0 + PUSH P,A + PUSHJ P,AGETFD + (1000+SIXBIT /U.1/) ;UNDEFINED SYMBOL IN FIELD 1 + PUSH P,A ;PDL NOW HAS FIELD 0 AND FIELD 1 + PUSHJ P,AGETFD + (1000+SIXBIT /U.2/) ;UNDEFINED SYMBOL IN FIELD 2 + POP P,B ;B NOW HAS FIELD 1, A HAS FIELD 2, PDL HAS FIELD 0 + EXCH A,B + POP P,T ;T HAS FIELD 0, A HAS FIELD 1, B HAS FIELD 2 + TDNN T,[757,,-1] ;DO NOT SUPPLY AC AND ADR FIELDS IF ANY BITS ON + ;IN INTRUCTION'S AC,X,OR ADR FIELDS + IOR T,[0 A,B] + XCT T + JFCL ;DON'T CARE IF IT SKIPS + JRST VALRET + +AASCIZ: TDZA T,T +A.ASCII: MOVEI T,1 + MOVEM T,AASCF1 ;STORE TYPE + MOVE D,[440700,,T] + JRST AASC1 + +ASIXBIT: SKIPA D,[440600,,T] +AASCII: MOVE D,[440700,,T] + SETOM AASCF1 ;INDICATE REGULAR +AASC1: MOVEI T,0 + TLZE I,MWRD + JRST TEXT2 ;MULTIPLE WORD, FALL IN FOR NEXT SET OF CHARS + MOVE A,LIMBO1 + CAIN A,40 + PUSHJ P,RCH ;SPACE, GET NEXT CHAR FOR USE AS DELIMITER + MOVEM A,TEXT4 ;STORE TERMINATOR +TEXT7: PUSHJ P,RCH +AASC8: CAMN A,TEXT4 + JRST AASC1A ;TERMINATOR + TLNN D,760000 + JRST TEXT6 ;WORD FULL +TEXT9: TLNE D,100 ;CHECK BOTTOM BIT OF SIZE FIELD OF BP + JRST AASC2 ;SET => NOT SIXBIT + PUSHJ P,LOWRCS + SUBI A,40 + CAIG A,77 + JUMPGE A,.+2 + (2000+SIXBIT /N6B/) +AASC3: IDPB A,D + TRO I,SYL + JRST TEXT7 + + ;TERMINATOR + +AASC1A: TLNN D,760000 ;SKIP UNLESS END OF WORD + SKIPGE AASCF1 ;SKIP UNLESS REGULAR + JRST TEXT5 ;REGULAR OR NOT END OF WORD + MOVEI CH1,1 ;END OF WORD AND NOT REGULAR + JRST AASC1B ;EXTRA 0 NEED FOR Z FLAVOR + +AASC2: CAIN A,"! + SKIPG AASCF1 + JRST AASC3 ;NOT .ASCII OR NOT EXCL + PUSH P,T ;READ FIELD + PUSH P,D + PUSH P,SYM + MOVE D,[SETOM ASUDS1] ;NOW TO SET UP UNDEFINED SYM CONDITION + TRNN FF,PSS + TRNN FF,NPSS + MOVE D,[(2000+SIXBIT /USA/)] ;PUNCHING PASS, UNDEFINED => REAL ERROR + MOVEM D,AASM1 + CLEARM ASUDS1 + PUSHJ P,AGETFD +AASM1: . ;"UNDEFINED IN .ASCII" ERROR INSTR, ERROR MESSAGE BUT ONLY ON PASS 2 + ;BUT NOTE THAT ON PASS 2 IT MIGHT ASSEMBLE DIFFERENT NUMBER OF WORDS, + ;CAUSING LOSSAGE IF NOT IN CONSTANT + POP P,SYM + POP P,D + POP P,T + SKIPGE ASUDS1 + MOVNI A,1 ;HAD UNDEFINED SYMS SO ASSUME MAX + MOVE CH1,[440700,,AASBF] + MOVEM CH1,ASBP1 + MOVEM CH1,ASBP2 + PUSH P,[AASC5] + MOVE CH1,A +AASC6: LSHC CH1,-35. + LSH CH2,-1 + DIV CH1,ARADIX + HRLM CH2,(P) + JUMPE CH1,.+2 + PUSHJ P,AASC6 + HLRZ A,(P) + ADDI A,"0 + IDPB A,ASBP1 + POPJ P, + +AASC5: MOVEI A,0 + IDPB A,ASBP1 ;END .ASCII NUMBER WITH ZERO +AASC8A: TLNN D,760000 + JRST AASC7 ;END OF WORD + ILDB A,ASBP2 + JUMPE A,AASC9 + IDPB A,D + JRST AASC8A + +AASC9: MOVE A,LIMBO1 + JRST AASC8 + +AASC7: TDZA CH1,CH1 +TEXT6: MOVNI CH1,1 ;WORD FULL +AASC1B: MOVEM CH1,AASCF2 + CLEARM CDISP + MOVEM A,TEXT8 + TLO I,MWRD + MOVE A,T + JRST CLBPOP + +VALRET: MOVE T,A ;ROUTINE TO RETURN VALUE IN A AFTER LAST CHAR GOBBLED BY GETSYL + MOVE B,LIMBO1 + CAIE B,15 + CAIN B,12 + JRST VALR1 ;WORD TERMINATOR +TEXT5: PUSH P,T ;ENTRY FROM TEXT ROUTINES (NLAST CHAR NOT GOBBLED BY GETSYL) TO RETURN VALUE IN T + PUSHJ P,GETSYL ;SEE IF IMMEDIATELY FOLLOWED BY SYL + TRNE I,SYL + 2000,,(SIXBIT /NOS/) ;NO SEPARATOR BETWEEN TWO VALUES + POP P,A ;RESTORE VALUE TO RETURN +VALR1: TRO I,SYL +TEXT10: JRST CLBPOP + + ;GET NEXT WORD + +TEXT2: MOVE A,TEXT8 ;GET NEXT CHAR (ALREADY READ BY RCH) + TRO I,FLD + SKIPGE B,AASCF2 + JRST TEXT9 ;REG OR HAVEN'T READ SECOND DELIMITER, FALL BACK IN + JUMPE B,AASC8A + JRST TEXT5 ;ASCIZ + +AASCF1: 0 ;-1 REG OR SIXBIT, 1 .ASCI 0 ASCIZ +AASCF2: 0 ;MULTIPLE WORD RETURN FLAG -1 REG 0 FINISH ! HACK 1 OUTPUT FILL WORD FOR Z +TEXT4: 0 ;DELIMITER +TEXT8: 0 ;SAVED NEXT CHAR WHILE RETURNING BETWEEN WORDS +ASBP1: 0 ;IDPB TO AASBF ON .ASCII FIELD +ASBP2: 0 ;ILDB FROM AASBF " +AASBF: BLOCK 3 ;ACCUMULATED TYPEOUT OF NUMBER FOR .ASCII +ASUDS1: 0 ;UNDEFINED SYM FLAG FOR .ASCII DURING PASS 1 + +IGTXT: PUSH P,A ;ROUTINE TO EAT UP TEXT OF UNDESIRED MULTIPLE WORD + PUSHJ P,RCH + CAME A,TEXT4 + JRST .-2 + TLZ I,MWRD + JRST POPAJ + +ARDIX: PUSHJ P,GETWRD ;GET WORD ARG + MOVEM A,ARADIX + JRST ASSEM1 + +AEQUAL: PUSHJ P,GETSYL + PUSHJ P,ES + MOVEM SYM,ST(D) + PUSH P,SADR + PUSHJ P,GETSYL + PUSHJ P,ES + (5000+SIXBIT /IEQ/) + POP P,T + DPB A,[(400400) ST(T)] + MOVEM B,ST+1(T) + 3GET B,T + TLNE B,3MAS + TLO C,3MAS + 3PUT C,T + JRST ASSEM1 + +AWORD: PUSHJ P,EBLK + PUSHJ P,GETWRD ;ON UNDEFINED SYM, WYB UNDEFINED SYM IN "WORD"? + PUSHJ P,PPB + JRST ASSEM1 + +A1PASS: IFN A1PSW,PUSHJ P,OUTUPD + TLO FF,PPSS +IFE A1PSW,[ TRZ FF,NPSS +ARELOC:] +IFN A1PSW,[ TRZA FF,NPSS +ARELOC: PUSHJ P,OUTUPD +] +ARELC1: CLEARM CLOC + MOVEI A,1 + MOVEM A,CRLOC + CLEARM CONTRL + JRST AREL1 + +AOFFSET: TRO I,PSEUDF+DEF ;OFFSET + PUSHJ P,EBLK + MOVE A,[1000,,(SIXBIT /USO/)] ;UNDEFINED SYMBOL IN OFFSET + MOVEM A,GTVER + PUSHJ P,GETWRD ;GET ARG + TRNN I,DEF + JRST ALOC1 + MOVE T,GLSP2 + CAME T,GLSP1 + JRST AOFFS1 + TRZE FF,GLOFFS + JRST AOFFS3 +AOFFS2: MOVEM A,OFLOC + MOVEM B,OFRLOC + JRST ASSEM1 + +AOFFS1: PUSHJ P,ALOC3A + MOVEI A,LDOFS + PUSHJ P,PLDCM + TRO FF,GLOFFS + SETZB A,B + JRST AOFFS2 + +AOFFS3: PUSH P,A + TRZ FF,FIRWD + MOVEI A,LDROFS + PUSHJ P,PLDCM + POP P,A + JRST AOFFS2 + +APRNTC: +APRNTX: MOVE A,LIMBO1 + CAIN A,40 + PUSHJ P,RCH +APRTX1: MOVE T,A + PUSHJ P,RCH + CAIN A,"! + JUMPGE B,.-2 + CAMN A,T + JRST ASSEM1 + PUSHJ P,TYO + JRST APRTX1+1 + + ;SBLK LOADER NORMALLY PUNCHED OUT IN RIM FORMAT + +SLOAD: CONO PTR,60 ;0 RESTART POINT (NEW BLOCK) + JSP 14,30 ;1 START POINT, LOOP POINT FOR NEW BLOCK; WAIT FOR DATA WORD READY + DATAI PTR,16 ;GET HEADER + MOVE 15,16 ;INITIALIZE CHECKSUM + JUMPGE 16,16 ;HEADER .GE. 0 => STARTING INSTRUCTION + JSP 14,30 ;5 LOOP POINT FOR NEXT DATA WORD: WAIT FOR READY + DATAI PTR,(16) ;READ IN DATA WORD + ROT 15,1 ;NOW UPDATE CHECKSUM + ADD 15,(16) + AOBJN 16,5 ;LOOP FOR ALL DATA WORDS THIS BLOCK + MOVEI 14,33 ;30 TO RETURN TO 33 + JRST 30 ;WAIT FOR READY THEN GO TO 33 + ;14 JSP AC FOR ROUTINE AT 30 + ;15 CHECKSUM + ;16 AOBJN POINTER (UPDATED HEADER) + CONSO PTR,10 ;30 ROUTINE TO WAIT FOR DATA WORD READY FOR DATAI + JRST 30 + JRST (14) + DATAI PTR,16 ;33 GET CHECKSUM + CAMN 15,16 ;COMPARE WITH CALCULATED + JUMPA 1 ;OK, GO GET NEXT BLOCK (DON'T CHANGE TO JRST OR REAL LOADERS WILL GET CONFUSED) + JRST 4, ;CHECKSUM ERROR +SLOADP=. + +;PDP10 SBLK LOADER +;FOLLOWING CODING ACTUAL WORDS TO BE OUTPUT + ;BY ASSEMBLER, COMPILER, OR WHATEVER +;SHOULD BE EXECUTED BY PDP10 HARDWARE READIN FEATURE +;USES ONLY THE AC'S (BUT ALL OF THEM) + +LDR10: + -17,,0 ;BLKI POINTER FOR READ SWITCH + +LDRC=0 ;CHECKSUM (OK, SO YOU'RE NOT ALLOWED TO LOAD + ;INTO IT DURING HARDWARE READIN, BUT WHO SAYS + ;YOUR PROGRAM CAN'T USE IT?) +OFFSET -.+1 ;BEGIN LOADING INTO 1 AS PER HEADER +LDRGO=. + CONO PTR,60 ;START UP PTR (RESTART POINT) +LDRRD=. + HRRI LDRB,.+2 ;INITIALIZE INDEX +LDRW=. + CONSO PTR,10 ;WAIT FOR WORD TO BE AVAILABLE + JRST .-1 + ROT LDRC,-LDRRD(LDRB) ;BEFORE READING IN HEADER, ROTATE 2 BITS (THEN IGNORE) + ;BEFORE READING IN EACH DATA WORD, ROTATE 1 BIT (FOR UPDATING CHECKSUM) + ;BEFORE READING IN CHECKSUM, ROTATE NOT AT ALL (DON'T ROTATE CALCULATED CHECKSUM) + DATAI PTR,@LDRT1-LDRRD(LDRB) ;READ WORD INTO RIGHT PLACE + ;HEADER => READ INTO C + ;STORAGE WORD => READ INDEXED BY AOBJN POINTER IN A + ;CHECKSUM => READ INTO A FOR COMPARISON WITH C(C) + XCT LDRT1-LDRRD(LDRB) ;EXECUTE RELEVANT T1 ENTRY (MAYBE SKIPS) + XCT LDRT2-LDRRD(LDRB) ;EXECUTE RELEVANT T2 ENTRY (MAYBE JUMPS) +LDRB=. + SOJA ., ;-RD(B) IS 2, 1, AND 0 FOR SUCCESSIVE ENCOUNTERS OF THIS INSTRUCTION + ;USED AS INDEX INTO TABLES, ETC. + + ;TABLE 1 + ;INDIRECTED THROUGH FOR DATAI + ;THEN EXECUTED TO SEE WHAT TO DO WITH READ IN WORD + ;ENTRIES EXECUTED IN REVERSE ORDER + +LDRT1=. + CAME LDRC,LDRA ;COMPARE CHECKSUM WITH CALCULATED, SKIP TO B IF THEY AGREE + ADD LDRC,(LDRA) ;UPDATE CHECKSUM + SKIPL LDRA,LDRC ;INITIALIZE HEADER AND SKIP UNLESS JUMP BLOCK + + ;TABLE 2 + ;EXECUTED IF CORRESPONDING ENTRY IN TABLE 1 DIDN'T SKIP WHEN EXECUTED + +LDRT2=. + JRST 4,LDRGO ;CHECKSUM ERROR + AOBJN LDRA,LDRW ;UPDATE AOBJN POINTER AND GO BACK FOR NEXT STORAGE WORD IF NOT EXHAUSTED +LDRA=. + JRST LDRRD ;WHEN INITIALLY LOADED IS JUMP BLOCK TO THIS LOADER + ;DURING LOADING USED TO HOLD HEADER (AOBJN POINTER), WHICH MAY BE LOADED JUMP BLOCK + +OFFSET 0 +ELDR10=. + +ASQOZ: PUSHJ P,AGETFD + (2000+SIXBIT /USS/) + LSH A,36 + PUSH P,A +ASQOZ3: PUSHJ P,GETSYL + TRNN I,SYL + JRST ASQOZ2 +ASQOZ4: TLZ SYM,740000 + POP P,A + ADD A,SYM + TLO I,UNRCHF + JRST VALRET +ASQOZ2: CAIE A,15 + CAIN A,12 + JRST ASQOZ4 + JRST ASQOZ3 + + ;.LOP + +A.LOP: SKIPE CONTRL + 5000,,(SIXBIT /ILO/) ;.LOP WHEN NOT IN RELOCATABLE OUTPUT FORMAT + PUSHJ P,EBLK ;TERMINATE CURRENT BLOCK +REPEAT 2,[PUSHJ P,GETFLD ;GET THE FIELDS + MOVEM A,WRD + MOVEM B,WRDRLC + PUSHJ P,PWRDA + MOVEI A,GLOTB + MOVEM A,GLSP1 + MOVEM A,GLSP2 +] PUSHJ P,GETFLD + MOVEM A,WRD + MOVEM B,WRDRLC + MOVEI A,LD.OP + PUSHJ P,PLDCM + JRST ASSEM1 + + ;YSTGW, .NSTGW ACCORDING TO WHAT'S IN LH(B) + +STGWS: HLLZM B,STGSW + JRST ASSEM1 + + ;.LIBRQ + +A.LIBRQ: PUSHJ P,GETSYL + TRNN I,SYL + JRST ASSEM1 + PUSHJ P,PBITS7 + MOVEI A,3 + PUSHJ P,PBITS + TLO SYM,40000 + PUSHJ P,OUTSM + JRST A.LIBRQ + + ;.GLOBAL + +A.GLOB: TRO I,PSEUDF +AGLOB1: MOVEI A,GLOTB + MOVEM A,GLSP1 + SETOM FLDCNT + PUSHJ P,GETSYL ;GET NAME + TRNN I,SYL + JRST ASSEM1 ;NO NAME => DONE + TLO I,GLI ;SET DOUBLEQUOTE FLAG + PUSHJ P,GETVAL ;NOW GET VALUE (CLOBBERS SQUOZE FLAGS) + JRST AGLOB1 ;LOOP FOR NEXT SYM + + ;.GSSET, SET GENERATED SYM COUNTER + +A.GSSET: PUSHJ P,AGETFD + 1000,,(SIXBIT /USG/) + MOVEM A,GENSM + JRST ASSEM1 + + ;.TYPE + +A.TYPE: PUSHJ P,GETSYL ;GET NAME + PUSHJ P,ES ;EVALUATE SYM, INTERESTED IN SQUOZE FLAGS RETURNED IN A + MOVEI A,17 ;DIDN'T SKIP, RETURN 17 => UNSEEN + JRST VALRET + + ;PUSHJ P,A.GST SEARCH CURRENT MACRO STRING FOR TAG (IN A.GST4) + ;SKIP IF FOUND, RETURN ON END OF STRING ANYWAY + ;BYTE POINTER (ILDB TO GET FIRST CHARACTER) IN A + +A.GST: PUSHJ P,BCOMPA + MOVEM CH2,A.GST3 ;SAVE BYTE POINTER +A.GST1: ILDB B,A.GST3 ;GET CHAR + CAIL B,300 + POPJ P, ;END OF STRING => STOP + CAIE B,". + JRST A.GST1 ;WAIT FOR POINT + PUSHJ P,A.GSYL ;FOUND POINT, GET REST OF NAME + JUMPL T,CPOPJ ;RETURN ON END OF STRING + CAME SYM,[SQUOZE 0,TAG] ;TAG? + JRST A.GST1 ;NO, KEEP GOING + PUSHJ P,A.GSYL ;GET THE TAG + JUMPL T,CPOPJ ;RETURN ON END OF STRING (THERE MUST BE BREAK CHAR AFTER TAG BEFORE STOP) + CAME SYM,A.GST4 + JRST A.GST1 ;NOT THE ONE BEING LOOKED FOR + MOVE CH2,A.GST3 + PUSHJ P,CCOMP + JRST POPJ1 + +A.ENTRY: + MOVEI A,LENTRY +ENTRY3: PUSH P,A + PUSHJ P,EBLK + TRO I,PSEUDF +ENTRY1: SETOM FLDCNT + PUSHJ P,GETSYL + TRNN I,SYL + JRST ENTRY2 + PUSHJ P,OUTSM + TLO I,GLI + PUSHJ P,GETVAL + MOVEI A,GLOTB + MOVEM A,GLSP1 + JRST ENTRY1 +ENTRY2: POP P,A + DPB A,[310700,,BKBUF] + PUSHJ P,EBLK + JRST ASSEM1 + +A.EXTERN: + MOVEI A,LEXTERN + JRST ENTRY3 + + ;LOOK BACKWARD FOR BEGINNING OF STRING, BYTE POINTER AN A + ;LEAVES POINTER POINTING AT STOP CHAR (NOT BEFORE); ALSO LEAVES STOP CHAR IN B + +AG.SP: LSHC A,-2 + LDB CH1,[420200,,B] ;PICK UP HIGH ORDER BITS OF POSITION FIELD + MOVE B,MACTAB(A) ;GET WORD FROM MACTAB + IMULI CH1,-2 + XOR B,[300_28.+300_20.+300_12.+300_4] ;DO XOR TO ANITIALLY SET UP + JRST AG.SP2(CH1) ;DISPATCH ON POSITION FIELD (-1 SINCE BIT SET IN POSITION FIELD) + +AG.SP3: MOVE B,MACTAB(A) + XOR B,[300_28.+300_20.+300_12.+300_4] + TRNN B,300_4 + JSP CH1,AG.SF + TLNN B,3 + JSP CH1,AG.SF + TLNN B,300_2 + JSP CH1,AG.SF +AG.SP2: TLNN B,300_10. + JSP CH1,AG.SF +AG.SP1: SOJA A,AG.SP3 + +AG.SF: MOVNI CH1,(CH1) + ADDI CH1,AG.SP1 + LSH CH1,-1 + LSH A,I + ADDI A,(CH1) + HRRZS A + POPJ P, + +A.GST4: 0 ;BYTE POINTER FOR ILDB WHILE SEARCHING FOR TAG +A.GST3: 0 ;ON .GO, NAME (IN SQUOZE) OF TAG BEING SEARCHED FOR + +CCOMP: TDZA A,4 +CCOMP1: IBP CH2 + TLNE CH2,700000 + SOJA A,CCOMP1 + SUBI CH2,MACTAB + LSH CH2,2 + ADDI A,4(CH2) + POPJ P, + +BCOMPA: SKIPE CH1,A + SOS CH1 + IDIVI CH1,4 + MOVE CH2,PTAB(CH2) + ADD CH2,CH1 + TLZ CH2,17 + POPJ P, + +A.TAG: PUSHJ P,GSYL + JRST ASSEM1 + +A.GO: PUSHJ P,GSYL ;DOESN'T WORK RELIABLY FROM DUMMY + MOVEM SYM,A.GST4 + +A.GO1: TRNN FF,MACRCH + JRST ASSEM1 ;NOT GETTING CHARS FROM MACRO => STOP + MOVE A,CPTR + PUSHJ P,AG.SP ;BACK TO BEGINNING + PUSHJ P,REDINC + CAIN B,374 + ADDI A,2 + PUSHJ P,A.GST + JRST A.GO2 ;END OF STRING, TRY POPPING UP ONE + MOVEM A,CPTR + SETOM CPTRB + JRST ASSEM1 + +A.GO2: PUSHJ P,PMACP + JRST A.GO1 + +PMACP: MOVE B,MACP ;POP MACRO PDL + HRRZ A,(B) + SUB B,[1,,1] + CAIN A,AIRP4 + JRST A.GO6 ;IRP OR .TTYMAC + CAIN A,REPT1 + JRST A.GO4 ;REPEAT + CAIE A,RCHSV1 ;MACRO + CAIN A,RCHSAV ;ARG + JRST A.GO6 + (SIXBIT /UCP/) ;DON'T HAVE RETURN, + +A.GO4: HRRZS -2(B) ;REPEAT, CLEAR OUT COUNT REMAINING +A.GO6: TRO FF,MRSW ;EVERYTHING ELSE, SET FLAG TO QUIT + JRST (A) + +A.BYTE: CLEARM NBYTS ;# BYTES ASSEMBLED + CLEARM BYTMT ;TOTAL ACTIVE BYTES IN TABLE + MOVE A,[440700,,BYBYT] ;POINTER TO NEW TABLE + MOVEM A,BYTMP +A.BY1: PUSHJ P,AGETFD ;GET FIELD, .GE. 0 => BYTE, .LT. 0 => HOLE + (1000+SIXBIT /UBS/) + MOVE C,ISAV + TRNN C,FLD + JRST A.BY2 ;NO FIELD + MOVM B,A + SKIPGE A + TRO B,100 + IDPB B,BYTMP + AOS BYTMT +A.BY2: CAIE CH1,15 + CAIN CH1,12 + JRST .+2 + JRST A.BY1 ;NOT WORD TERMINATOR + SKIPN BYTMT ;WORD TERMINATOR, ANY FIELDS? + JRST A.BY3 ;NO, DO .WALGN AND RESET TO WORD MODE + SETOM BYTM ;ENTERING BYTE MODE + PUSHJ P,BYSET + JRST ASSEM1 + + ;RESET THE BYTE DESCRIPTOR TABLE POINTERS TO POINT TO NEW WORD + +BYSET: CLEARM BYTMC ;COUNT OF BYTES PROCESSED THIS TABLE SCAN + MOVE A,[440700,,BYBYT] ;POINTER TO DESCRIPTOR TABLE + MOVEM A,BYTMP + ILDB A,BYTMP ;FIRST DESCRIPTOR BYTE + AOS BYTMC + DPB A,[300600,,BYTWP] ;DEPOSIT AS FIRST BYTE SIZE + POPJ P, + +A.BY3: CLEARM BYTM ;NO LONGER IN BYTE MODE + +A.WALGN: LDB A,[360600,,BYTWP] + CAIN A,44 + JRST ASSEM1 ;ALREADY AT BEGINNING OF WORD + MOVEI A,44 + DPB A,[360600,,BYTWP] ;MAKE IT POINT TO BEGINNING OF WORD + PUSHJ P,BYSET + CLEARM T1 + JRST PBY1 + +BYTIN1: CLEARM BYTMC + MOVE A,[440700,,BYBYT] + MOVEM A,BYTMP +BYTINC: AOS A,BYTMC + CAMLE A,BYTMT + JRST BYTIN1 + ILDB A,BYTMP + DPB A,[300600,,BYTWP] + MOVEM A,T1 + HLLZ A,BYTWP + IBP A + TRNN A,-1 + JRST BYTINR + ;NEXT BYTE GOES IN NEXT WORD +PBY1: MOVE A,BYTW + MOVEM A,WRD + CLEARM BYTW + MOVEI A,44 + DPB A,[360600,,BYTWP] + PUSHJ P,PWRD + AOS CLOC +BYTINR: MOVE A,T1 ;CURRENT BYTE SIZE + TRNN A,100 + JRST ASSEM1 + MOVEI A,0 ;ASSEMBLE HOLE (BLANK BYTE) IMMEDIATELY AFTER PREVIOUS BYTE + JRST PBY2 + +PBYTE: AOS NBYTS + MOVE A,WRD +PBY2: IDPB A,BYTWP + JUMPGE FF,BYTINC + SKIPE WRDRLC + (1000+SIXBIT /RIB/) + MOVE A,GLSP1 + CAME A,GLSP2 + (1000+SIXBIT /GIB/) + JRST BYTINC + +IFNDEF LBYBYT,LBYBYT==5 ;LENGTH OF BYBYT +BYBYT: BLOCK LBYBYT ;BYTE DESC TABLE, 7 BITS PER DESC + +A.BYTC: MOVE A,NBYTS + JRST CLBPOP + +; START OF COMPILER PROPER + +OPDL: CH?CH?CH?CH?CH?CH?CH?CH ;COMMUTATOR + CH?SP?CH?CH?CH?CR?CH?CH + CH?CH?CH?CH?CH?CH?CH?CH + CH?CH?CH?CH?CH?CH?CH?CH + SP?CH?CH?CH?DL?CH?CH?CH + LP?RP?TX?PL?CM?MN?CH?DV + CH?CH?CH?CH?CH?CH?CH?CH + CH?CH?CH?KL?LB?EQ?RB?CH + +; CH?CH?CH?CH?CH?CH?CH?CH +; CH?CH?CH?CH?CH?CH?CH?CH +; CH?CH?CH?CH?CH?CH?CH?CH +; CH?CH?CH?CH?CH?CH?UP?CH +; CH?CH?CH?CH?CH?CH?CH?CH +; CH?CH?CH?CH?CH?CH?CH?CH +; CH?CH?CH?CH?CH?CH?CH?CH +; CH?CH?CH?CH?CH?CH?CH?CH + +ENN: 60 ;ACCUMULATOR NUMBER - TROUBLE IF GOES PAST 9 + +BTPNT: 440700,,STRING ;D +STRING: BLOCK 10 ;CHARACTER ASSEMBLY (D) - TROUBLE IF OVERFLOWS + +TPN: 0 +DIRPNT: 440700,,DIROUT ;TPN +DIROUT: BLOCK 40 ;COPY OF LINE IN PROGRESS (TPN) - TROUBLE IF OVERFLOWS + +OPSTKL==40 + 0 +OPSTK: BLOCK OPSTKL ;OPERATOR STACK (R) - TROUBLE IF OVERFLOWS + 0 + + + +ENDSTT: 0 ;ON IF END OF STATEMENT ENCOUNTERED +CHARF: 0 ;LAST WAS NOT OPERATOR +NUMFL: 0 ;STRING IS NUMERIC CONSTANT (NEEDS [ AND ]) +R1SV: 0 ;SAVED A +R2SV: 0 ;SAVED I, CALLED V EARLIER ON + +INTEGR: 0 ;INTEGER ARITHMETIC +WARN: 0 ;ON AFTER ) TO STOP NON-OPERATOR +RANDM: 0 ;DUMP COMMA COUNT HERE +ACSAV: BLOCK 7 + +; 'ALGEBRAIC' CRUFT MARO DEFINITIONS + +DEFINE MOAN ARG/ + MOVEI D,[SIXBIT /ARG!!/] + JRST ERRCON +TERMIN + +DEFINE RETLIN + MOVEI A,15 ;CARRIAGE RETURN + PUSHJ P,PUTREL + MOVEI A,12 ;LINE FEED + PUSHJ P,PUTREL +TERMIN + +DEFINE NUMBER + MOVE A,BTPNT + ILDB I,A + CAIE I,"# + CAIGE I,"@ +TERMIN + +DEFINE RESTOR + MOVE D,BTPNT + SETZM STRING + SETZM STRING+1 + SETZM STRING+2 +TERMIN + + +DEFINE SPECN + POP P,RANDM + MOVE A,ENN + SUB A,RANDM + MOVEM A,ENN +TERMIN + +DEFINE GET + EXCH I,ACSAV+1 + PUSHJ P,RCH + EXCH I,ACSAV+1 +TERMIN + +DEFINE GETT + EXCH I,ACSAV+1 + PUSHJ P,RCH + EXCH I,ACSAV+1 + IDPB A,TPN +TERMIN + +; ENTRANCE TO 'ALGEBRAIC' TRANSLATOR + +A.I: SETOM INTEGR + SKIPA +A.F: SETZM INTEGR + PUSHJ P,SWINI ;INITIALISE PASSAGE TO MIDAS ASSEMBLER + MOVE TM,[P,,ACSAV] + BLT TM,ACSAV+6 + SETZM ENDSTT ;RESET END OF STMNT FLAG + SETZM EQHIT' ;RESET LAST CHAR WAS= FLAG + SETZM WARN ;SET OFF ERROR DETECTOR + MOVEI A,"0 ;INITIALISE POINTERS + MOVEM A,ENN + MOVE A,DIRPNT + MOVEM A,TPN ;POINTER TO SAVED INPUT + MOVE SYM,[-OPSTKL,,OPSTK] + PUSH SYM,[0,,ENDSAT] + PUSH P,[0] ;INITIALISE COMMA-COUNTER + SETZM CHARF +CLSTR: RESTOR +RDITTS: SKIPE ENDSTT + JRST BDEND +RDITA: GETT + CAIGE A,100 ;FOR ABBREVIATED DISPATCH TABLE + JRST @OPDL(A) + CAIN A,"^ + JRST UP + +CH: SETZM EQHIT + SKIPE WARN + JRST CHBRT +CHEY: IDPB A,D + SETOM CHARF ;NON UNARY FLAG + JRST RDITA + +GAMB: RESTOR +COMMT: MOVE I,R2SV + JRST GOPURT + +SHORT: ;DECIDES IF STRING CAN BE USED IN IMMEDIATE TYPE OPS + SETZM IMMED' + SKIPN STRING + POPJ P, ;NO STRING + MOVE A,BTPNT + ILDB I,A + CAIN I,"# + JRST APUPJ ;YEPE HE ASKED FOR IT + SKIPE STRING+1 + POPJ P, ;STRING IS LONG + SKIPA + +TSTSHL: ILDB I,A + JUMPE I,APUPJ ;ITS OK FOUND ONLY NUMBERS + CAILE I,"@ + POPJ P, ;NON-NUMBER IN STRING + CAIE I,". + JRST TSTSHL + ILDB I,A + SKIPN I ;ANYTHING FOLLOW '.' QST +APUPJ: SETOM IMMED' ;INDICATE IMMEDIATE USAGE IS POSSIBLE + POPJ P, + +SZPRT: SETZM CHARF +GOPRT: SETZM WARN +GOPART: MOVEM I,R2SV +GOPURT: HLRZ B,I + HLRZ C,(SYM) + CAMLE B,C + JRST PSOPR ;GO PUSH OPERATOR + SKIPN INTEGR + SETOM IMMED ;FOR ARITH OPS ONLY FIXED WILL DO IMMEDIATE + PUSHJ P,SHORT ;ESTABLISH IF STRING CAN BE IMMEDIFIED + POP SYM,A ;POP AN OPERATOR + JUMPN A,(A) + + MOAN OVERPOPPED OPERATOR STACK + +CHEX: MOVE A,R1SV + JRST CHEY + +RP: SKIPE EQHIT + AOS ENN ;TAKE CARE OF UNSATISFIED = AT END + SKIPN CHARF + JRST RTONOP + SETOM CHARF +BUDDY: SETOM WARN + MOVEI I,RPAR + JRST GOPART + +RTONOP: MOVE I,(SYM) + CAIN I,FUNCT + JRST BUDDY ;NO ARGUMENT FUNCTION + + MOAN ) FOLLOWS OPERATOR + +BDEND: MOAN TOO MANY ('S + +CHBRT: MOAN NON-OPERATOR FOLLOWS ) + + +CR: SKIPE EQHIT + AOS ENN ;HANDLES UNSATISFIED = AT END + SETOM ENDSTT + MOVEI I,RCAR + JRST GOPRT + +LP: SETZM EQHIT + SKIPE WARN + JRST LFRHT + SETZM CHARF + SKIPE STRING + JRST INDX + PUSH P,[0] ;INITIALISE COMMA-COUNTER + PUSH SYM,[0,,LFTPR] + JRST RDITA + +INDX: NUMBER + JRST NUSTRB + GETT + CAIG A,"9 + JRST NMRINX + MOVEI I,"( + IDPB I,D +INDY: IDPB A,D + GETT + CAIN A,"+ ;IS IT COMPOUND SUBSCRIPT + JRST CMPNDN + CAIN A,"- + JRST CMPNDN + CAIE A,") ;SEARCH FOR NEXT RP + JRST INDY + IDPB A,D +CMBAN: SETOM CHARF ;MAKE BELIEVE CHARATER LAST + SETOM WARN ;YET SET ) TRAP + JRST RDITA + +NMRINX: CAIN A,"- ;IS IT A MINUS + JRST INDZ + CAIN A,"+ + JRST INDZ + MOVEI I,"+ ;NUMERICAL SUBSCRIPT + IDPB I,D +INDZ: IDPB A,D + GETT + CAIN A,"+ ;IS IT COMPOUND SUBSCRIPT + JRST CMPNDC + CAIE A,") + JRST INDZ + JRST CMBAN + +CMPNDN: MOVEI I,") + IDPB I,D + JRST INDZ + +CMPNDC: MOVEI I,"( + IDPB I,D + JRST INDY + +LFRHT: MOAN ( FOLLOWS DIRECTLY ON ) + +SP=RDITA ;USE FOR NON ARITH STATS + +CM: MOVE I,[1,,COMMX] + SKIPN CHARF + AOS ENN + JRST SZPRT + +EQ: SETOM EQHIT + SETZM WARN + SKIPN CHARF ;TEST FOR EXISTANCE OF L H S + JRST EQFLOP + NUMBER ;IS L H S A NUMBER + JRST EQNUMB + MOVEI I,EQAAL +EQVAL: SETZM CHARF + PUSH SYM,I + PUSH P,STRING + PUSH P,STRING+1 + PUSH P,STRING+2 + PUSH P,[0] + JRST CLSTR + +PL: MOVE I,[2,,PLUS] + SKIPN CHARF + JRST RDITA ;UNARY PLUS + JRST SZPRT + +MN: MOVE I,[2,,MINUX] + SKIPN CHARF + MOVE I,[5,,UMINU] + JRST SZPRT + +LB: SKIPN CHARF + JRST LP ;TREAT LIKE ( + NUMBER + JRST NUBRST + MOVEI I,FUNCT + JRST EQVAL + +RB=RP + +NUBRST: MOAN '<' FOLLOWS NUMBER + +NUSTRB: MOAN '(' FOLLOWS NUMBER + +EQFLOP: MOAN '=' FOLLOWS OPERATOR + +EQNUMB: MOAN '=' FOLLOWS NUMBER + +TX: MOVE I,[4,,TIMES] + SKIPN CHARF + JRST RDITA ;UNARY TIMES + JRST SZPRT + +DL: GET ;CONTINUE STATEMENT RC + GET ;LF + GET ;. + CAIE A,". ;DOT + JRST BDCONT + GET ;F OR I + GET ;CONTROL I OR SPACE + MOVE A,DIRPNT + MOVEM A,TPN ;RESET SAVED INPUT POINTER TO AVOID FILLING ITS BUFFER + MOVEI A,"$ + IDPB A,TPN + MOVEI A,40 + IDPB A,TPN + JRST RDITA + +ERRCON: TRNE FF,PSS ;NO OUTPUT ON SECOND PASS + JRST CONRBT +;MAY ALSO WANT TO USE STATEMENT PLUS LINE NUMBER TYPE TACTIC + MOVE B,DIRPNT +OUTRR: ILDB A,B + PUSHJ P,TYO + CAME B,TPN + JRST OUTRR + SKIPE ENDSTT + JRST CONERT +DORSTL: MOVEI A,40 + PUSHJ P,TYO + MOVEI A,"? ;POINT AT ERROR + PUSHJ P,TYO + MOVEI A,40 + PUSHJ P,TYO +DORSAL: GET ;COPY UP TO LINE FEED + PUSHJ P,TYO + CAIE A,12 ;LF + JRST DORSAL +CONERT: PUSHJ P,TIPIS + PUSHJ P,CRR +CONRAT: MOVE TM,[ACSAV,,P] + BLT TM,P+6 + JRST SWFLS ;GO BACK AND FLUSH + + +CONRBT: GET + CAIE A,12 ;LF + JRST CONRBT + JRST CONRAT + + +UP: SKIPN STRING ;FOR (NUMBER)^N + JRST ITSEX + MOVEM A,R1SV ;SAVE THE ARROW + NUMBER + JRST CHEX ;ITS PART OF A NUMBER +ITSEX: MOVE I,[6,,STRSTR] + SKIPN CHARF + JRST EXMB + JRST SZPRT + +EXMB: MOAN UNARY ^ + +BDCONT: MOAN BAD CONTINUATION + +KL=CR ;SEMICOLON ACTS LIKE CR IN TERMINATING + +STRSTR: SKIPN STRING + JRST EXLS + NUMBER + SKIPA + JRST EXLS + SUBI I,61 + TDNE I,[-1,,777774] + JRST EXLS + MOVE A,STRING + TDNE A,[3777,,-1] + JRST EXLS + ADDI I,POWR + JRST @(I) + +EXLS: PUSH P,[ASCII !EXPLO!] + PUSH P,[ASCII !G !] + PUSH P,[0] + PUSH P,[1] + SETOM EXRET' + JRST FUNET + +DV: MOVE I,[4,,DIVIX] + SKIPN CHARF + MOVE I,[5,,UDIVI] + JRST SZPRT + +PSOPR: PUSH SYM,I ;PUSH OPERATOR FOR LATER EXCECUTION + SKIPN STRING + JRST RDITTS + PUSHJ P,SHORT ;CAN WE IMMEDIFY + PUSHJ P,MVOI ;AND MOVE OPERAND INTO STACK + JRST CLSTR + + +PRODB: NUMBER ;OUTPUT WHAT IS IN STRING + SKIPE IMMED ;NO [ & ] IF IMMEDIATE USE + JRST OVNM + PUSH P,A + MOVEI A,"[ ;[ FOR CONSTANT + PUSHJ P,PUTREL + POP P,A + SETOM NUMFL +OVNM: CAIN I,"# + JRST PRDOC + + EXCH A,I + PUSHJ P,PUTREL + MOVE A,I +PRDOC: ILDB I,A + JUMPN I,OVNM + SKIPN NUMFL + POPJ P, + MOVEI A,"] ;] FOR CONSTANT + PUSHJ P,PUTREL + SETZM NUMFL + POPJ P, + +PRODC: HRLI A,440700 ;MAKE BYTE POINTER + JRST PRDOC + +LFTPR: SPECN + JRST RDITTS ;IGNORE LP ON STACK + +RCAR: .VALUE ;IMPOSSIBLE FOR THESE TO BE ON STACK +RPAR: .VALUE + +EQAAL: SPECN + SKIPE STRING + PUSHJ P,MVOI + MOVEI A,[ASCIZ ! MOVEM A!] + PUSHJ P,PRODC + POP P,STRING+2 + POP P,STRING+1 + POP P,STRING + MOVE A,ENN + SOS A + PUSHJ P,FINOF + JRST GAMB + +ENDSAT: SPECN + SKIPN ENDSTT + JRST TOEARL + SKIPE STRING + PUSHJ P,MVOI +GETLF: GET + CAIE A,12 ;LF + JRST GETLF + MOVE TM,[ACSAV,,P] + BLT TM,P+6 + JRST SWRET ;GO BACK + +MVOI: MOVEI A,[ASCIZ ! MOVE A!] + SKIPE IMMED + MOVEI A,[ASCIZ ! MOVEI A!] +MVOIK: PUSHJ P,PRODC + MOVE A,ENN + AOS ENN +FINOF: PUSHJ P,PUTREL + MOVEI A,", + PUSHJ P,PUTREL + PUSHJ P,PRODB + RETLIN + POPJ P, + +TOEARL: MOAN TOO MANY )'S + +PLUS: MOVEI A,[ASCIZ ! FADR A!] + SKIPE INTEGR + MOVEI A,[ASCIZ ! ADD A!] + SKIPE IMMED + MOVEI A,[ASCIZ ! ADDI A!] +OPERT: PUSHJ P,PRODC + SKIPE STRING + JRST GAINS + SOS ENN +OPRTE: MOVE A,ENN + SOS A + PUSHJ P,PUTREL + PUSHJ P,COMMAA + MOVE A,ENN + PUSHJ P,PUTREL + RETLIN + JRST COMMT + +COMMAA: MOVEI A,", + PUSHJ P,PUTREL + MOVEI A,"A + JRST PUTREL + +GAINS: MOVE A,ENN + SOS A + PUSHJ P,FINOF + JRST GAMB + +MINUX: MOVEI A,[ASCIZ ! FSBR A!] + SKIPE INTEGR + MOVEI A,[ASCIZ ! SUB A!] + SKIPE IMMED + MOVEI A,[ASCIZ ! SUBI A!] + JRST OPERT + +TIMES: PUSHJ P,TMSTR + SKIPE IMMED + MOVEI A,[ASCIZ ! IMULI A!] + JRST OPERT + +DIVIX: MOVEI A,[ASCIZ ! FDVR A!] + SKIPE INTEGR + MOVEI A,[ASCIZ ! IDIV A!] + SKIPE IMMED + MOVEI A,[ASCIZ ! IDIVI A!] + JRST OPERT + + +UMINU: CAMN B,C + JRST BAKWD ;THESE HAVE TO BE STACKED REVERSE + SKIPE STRING + JRST MOABC + MOVEI A,[ASCIZ ! MOVNS A!] + PUSHJ P,PRODC + MOVE A,ENN + SOS A + PUSHJ P,PUTREL + RETLIN + JRST COMMT + +MOABC: MOVEI A,[ASCIZ ! MOVN A!] + SKIPE IMMED + MOVEI A,[ASCIZ ! MOVNI A!] + PUSHJ P,MVOIK + JRST GAMB + +MVONT: MOVEI A,[ASCIZ ! MOVE A!] + PUSHJ P,PRODC + MOVE A,ENN + JRST ONMVS + +TMSTR: MOVEI A,[ASCIZ ! FMPR A!] + SKIPE INTEGR + MOVEI A,[ASCIZ ! IMUL A!] + POPJ P, + +BAKWD: PUSH SYM,A + JRST PSOPR + +UDIVI: CAMN B,C + JRST BAKWD ;THESE HAVE TO BE STACKED REVERSE + SKIPE INTEGR + JRST UINDV + SKIPN STRING + PUSHJ P,MVONT + MOVEI A,[ASCIZ ! HRLZI A!] + PUSHJ P,PRODC + MOVE A,ENN + SKIPN STRING + SOS A + PUSHJ P,PUTREL + MOVEI A,[ASCIZ !,201400!] + PUSHJ P,PRODC + RETLIN + AOS ENN + JRST DIVIX + +ONTMS: PUSHJ P,TMSTR + PUSHJ P,PRODC + MOVE A,ENN + SOS A +ONMVS: PUSHJ P,PUTREL + PUSHJ P,COMMAA + MOVE A,ENN + SOS A +LSTCHX: PUSHJ P,PUTREL + RETLIN + POPJ P, + +POWR: GAMB?POWR2?POWAA?POWR4 + +POWR4: PUSHJ P,ONTMS +POWR2: PUSHJ P,ONTMS + JRST GAMB + +POWAA: PUSHJ P,MVONT + AOS ENN + PUSHJ P,ONTMS + SOS ENN + PUSHJ P,TMSTR + PUSHJ P,PRODC + RESTOR + JRST OPRTE + +COMMX: AOS (P) + SKIPE STRING + PUSHJ P,MVOI + JRST GAMB + +UINDV: MOAN INTEGER UNARY DIVIDE + +FUNCT: SETZM EXRET +FUNET: SKIPE STRING + PUSHJ P,MVOI + SPECN + PUSHJ P,MORFMC + MOVEI A,[ASCIZ ! PUSHJ P,!] + POP P,STRING+2 + POP P,STRING+1 + POP P,STRING + PUSHJ P,PRODC + PUSHJ P,PRODB + RESTOR + RETLIN + PUSHJ P,MORFNC + SKIPN EXRET + JRST RDITTS ;AS USED FROM FUNCT + JRST COMMT ;AS USED FROM STRSTR + +MORFMC: MOVE A,RANDM + MOVEM A,RANSV' + SKIPN CHARF ;NO ARGUMENTS + AOS ENN + SETOM CHARF + MOVEI A,"1 + CAMN A,ENN ;ARE ARGUMENT ALREADY IN A0 AND UP + POPJ P, + SETZM CORDM +MORYLP: PUSHJ P,ZENBD + AOS CORDM + SOSL RANSV + JRST MORYLP + POPJ P, + +MORFNC: MOVEI A,"1 + CAMN A,ENN + POPJ P, + MOVE A,RANDM + MOVEM A,CORDM' +MORXLP: PUSHJ P,ZENBD + SOSL CORDM + JRST MORXLP + POPJ P, + +ZENBD: MOVEI A,[ASCIZ ! EXCH A!] + PUSHJ P,PRODC + MOVE A,CORDM + ADDI A,"0 + PUSHJ P,PUTREL + PUSHJ P,COMMAA + MOVE A,ENN + SOS A + ADD A,CORDM + JRST LSTCHX + +TIPIS: MOVE A,TEMP + MOVEM A,BYTPNT +MORTP: ILDB A,BYTPNT + CAIN A,1 ;EXCLAMATION + POPJ P, + ADDI A," ;SPACE + PUSHJ P,TYO + JRST MORTP + +TEMP: 440600,,(D) ;INDIRECT VIA D +BYTPNT: 0 + + ;.INSRT FILEDESCRIPTION + ;INSERT FILE HERE + ;TTY: => OK, READS LINE AT A TIME, RUBOUT ALLOWED WITHIN LINE + ;PUSHES MACRO EXPANSION, OTHER .INSRT'S + ;IN FILEDESCRIPTION,  => RESET FILE NAME COUNTER + +;IO CHANNELS +AICF"==13 + +A.INSR: SETOM FFFLG + PUSH P,B + MOVE A,[37,,AFNAM2+41-3] ;Length of AFNAM2 +BLKPSH: MOVE B,(A) + MOVEM B,2(A) + SUB A,[1,,1] + JUMPGE A,BLKPSH + POP P,B + MOVE A,[DNAM,,TDNM] + BLT A,TSNM + SETZM INDDF + SETZM INFNFG +A.IN1: PUSHJ P,GETSBS + CAIN B,": + JRST INCOL + CAIN B,"; + JRST INSEMC + CAIE B,15 + JUMPE SYM,A.IN1 + CAIN B,15 + JUMPE SYM,A.IN2 + SKIPGE FFFLG + MOVEM SYM,TF2 + AOSG FFFLG + JRST A.IN5 + EXCH SYM,TF2 + MOVEM SYM,TF1 +A.IN5: CAIE B,15 + JRST A.IN1 + +A.IN2: SKIPE INDDF + JRST A.IN4 + HRRZ A,TDNM + CAIN A,400000 + JRST INDDV + MOVEI B,0 +A.IN3: MOVE A,TSNM(B) + .SUSET [.SSNAM,,A] + .IOPUSH UTYIC, + MOVE A,TF1(B) + MOVEM A,AFNAM1 + MOVE A,TF2(B) + MOVEM A,AFNAM2 + .OPEN UTYIC,TDNM(B) + JRST INFNF + MOVE A,[UTYIC,,TEMFNM] + .RCHST A, + SKIPN A,TEMFNM+1 + JRST A.IN10 + MOVEM A,INFN1 + MOVE A,TEMFNM+2 + MOVEM A,INFN2 +A.IN10: MOVE B,INPDLP + PUSH B,UTIBED + PUSH B,UREDP + PUSH B,IBUFOF + PUSH B,EOFCH + MOVEM B,INPDLP + MOVEI A,40 ;XXX What constant? + ADDM A,IBUFOF + ADDB A,UTIBED + SOS A + HRLI A,700 + MOVEM A,UREDP + MOVE A,IBUFOF + MOVE B,EOFCH + LSH B,35 + MOVEM B,UTIBE(A) + AOS A,ILEVEL + CAIL A,5 + (SIXBIT /IOV/) + JRST ASSEM1 + +INCOL: JUMPE SYM,A.IN1 + HLRM SYM,TDNM + JRST A.IN1 + +INSEMC: JUMPE SYM,A.IN1 + MOVEM SYM,TSNM + JRST A.IN1 + +GETSBS: MOVEI SYM,0 + PUSHJ P,RCH + PUSHJ P,LOWRCS + SKIPA B,[440600,,SYM] +GTSBS: PUSHJ P,RCH + PUSHJ P,LOWRCS + CAIG A,40 + JRST GTSBS1 + CAIE A,"; + CAIN A,": + JRST GTSBS1 + SUBI A,40 + TLNE B,770000 + IDPB A,B + JRST GTSBS +GTSBS1: MOVE B,A + POPJ P, + +A.IN4: MOVE B,INDDP + SUBI B,4 + MOVE A,[TDNM,,TDNM] + ADD A,B + BLT A,TSNM(B) + PUSHJ P,POPTT + JRST A.IN3 + +INDDV: SETOM INDDF + MOVE B,INDDP +INDVL2: MOVE A,TF1 +INDVL1: CAIG B,4 + JRST INDV1 + SUBI B,10 + CAME A,TF1(B) + JRST INDVL1 + MOVE A,TF2 + CAME A,TF2(B) + JRST INDVL2 + MOVE A,TSNM + CAME A,TSNM(B) + JRST INDVL2 + MOVE A,TDNM + CAME A,TDNM(B) + JRST INDVL2 + ADDI B,4 + JRST A.IN3 + +INDV1: MOVE B,INDDP + CAILE B,BYTM + (SIXBIT /TM@/) + ADDI B,10 + EXCH B,INDDP + SETOM FFFLG + MOVE A,[TDNM,,TDNM] + ADD A,B + BLT A,TSNM(B) + PUSHJ P,GTYIP + AOSN INFNFG + POPJ P, + MOVE A,DNAM + MOVEM A,TDNM + JRST A.IN1 + +INFNF: SETOM FFFLG + .IOPOP UTYIC, + SKIPN INDDF + JRST INFNF2 + PUSHJ P,TYPFIL + TYPR [ASCIZ / NOT FOUND. TRY AGAIN. +!/] + MOVS B,INDDP + SUB B,[7,,0] + PUSHJ P,GTYIP + JRST A.IN1 + +GTYIP: MOVE A,[PUSHJ P,RCHA] + PUSHJ P,PUSHTT + TRO FF,TTYRCH + POPJ P, + +INFNF2: SETOM INFNFG + PUSHJ P,INDDV + (2000+SIXBIT /FNF/) + PUSHJ P,TYPFIL + TYPR [ASCIZ / CORRECTION PLEASE. +!/] + JRST A.IN1 + + + ;TYPE OUT DNAM ETC. AS FILE SPECIFICATION + +TYPFIL: SKIPA SYM,[-4,,] +TYPF2: SKIPA B,TDNM(SYM) + HRLZ B,TDNM(SYM) ;DEVICE NAME + PUSHJ P,SIXTYO ;TYPE OUT NAME + MOVE A,FILSPC(SYM) ;NOW GET DELIMITING CHARACTER + PUSHJ P,TYO ;TYPE OUT + AOBJN SYM,TYPF2 ;LOOP FOR ALL NAMES + POPJ P, + +FILSPC: ": + 40 ;SPACE + 40 + "; + + ;SAVE INTERNAL POINTERS CONCERNING INPUT MODE + +PUSHTT: PUSH P,F + MOVE F,ITTYP ;GET RELEVANT PDL POINTER + PUSH F,GETCHR + MOVEM A,GETCHR + MOVE A,LIMBO1 + TLZE I,UNRCHF + TLO A,1 + TRZE FF,MACRCH + TLO A,2 + TRZE FF,TTYRCH + TLO A,4 + PUSH F,A +POPTT1: MOVEM F,ITTYP + POP P,F + POPJ P, + +POPTT: PUSH P,F + MOVE F,ITTYP + POP F,A + POP F,GETCHR + HRRZM A,LIMBO1 + TRZ FF,MACRCH+TTYRCH + TLNE A,4 + TRO FF,TTYRCH + TLNE A,2 + TRO FF,MACRCH + TLZ I,UNRCHF + TLNE A,1 + TLO I,UNRCHF + JRST POPTT1 + +IFN TS,[ ;BEGIN TS ROUTINES + +IFNDEF MAXIND,MAXIND==20 ;MAXIMUM # @: TABLE ENTRIES FOR .INSRT + +TYIC==1 ;TTY INPUT CHANNEL +TYOC==2 ;TTY OUTPUT CHANNEL +UTYIC==3 ;INPUT FILE +UTYOC==4 ;OUTPUT FILE +LPTC==5 ;LISTING (LPT) + + ;"TTY PDL", STORES INFORMATION ABOUT CURRENT INPUT MODE + ;(SIMILAR TO MACRO PDL BUT NOT GARBAGE COLLECTED) + +IFNDEF LTYPDL,LTYPDL==12 +ITTYP: -LTYPDL,,TTYPDL-1 ;PDL POINTER +TTYPDL: BLOCK LTYPDL + + ;INPUT FILE AND BUFFER VARIABLES + +TDNM: 0 +TF1: 0 +TF2: 0 +TSNM: BLOCK 201 + + ;PDL + +INPDLP: INPDL-1 ;IO PDL POINTER +INPDL: BLOCK 30 ;I(O) PDL + +ILEVEL: 0 +FFFLG: 0 +INDDF: 0 +INDDP: 0 +INFNFG: 0 +TEMFNM: BLOCK 5 +INFN1: 0 +INFN2: 0 + +HINIT: MOVEI A,(SIXBIT \DSK\) + MOVEM A,DNAM + MOVEM A,ONAM + MOVE A,[50,,FNAM1] + BLT A,FNAM2 + MOVE A,50 + MOVEM A,ONAM+1 + MOVEI A,(SIXBIT \BIN\) + MOVSM A,ONAM+2 + JRST GO21 + +TSINT: 0 ;ALL INTERRUPTS (AT PRESENT) ARE CONSIDERED FATAL ERRORS + 0 ;ERROR PROCESSOR RE-ENABLES INTERRUPTS + + MOVEM P,INTSVP ;SAVE P FOR POSSIBLE DEBUGGING + MOVE A,TSINT ;GET INTERRUPT REQUEST WORD + MOVEI B,(SIXBIT /INT/) ;DEFAULT + SOS TSINT+1 ;MAKE IT POINT TO PLACE INTERRUPT CAME FROM + TRNN A,200000 ;PDL OVERFLOW? + JRST TSINT7 ;NO + LDB A,[270400,,@TSINT+1] ;GET AC FIELD OF GUILTY INSTRUCTION + CAIN A,P ;IF P, + MOVE P,[-LPDL,,PDL] ;RESET PDL POINTER + AOSN FUNPDL + JRST BTBHAC + MOVEI B,(SIXBIT /PDL/) +TSINT7: TRNE A,20000 ;MEMORY PROTECTION VIOLATION? + MOVEI B,(SIXBIT /ILM/) ;YES + MOVEM B,40 + AOS A,TSINT+1 ;SO ERROR ROUTINE WILL PRINT OUT PROPERLY + JSA A,ERROR + +INTSVP: 0 ;SAVES P ON INTERRUPT FOR DEBUGGING + +BTBHAC: POP P,TSINT+1 + .DISMIS TSINT+1 + +.IOT=40000,, ;LEAVE HERE SO THAT IT WILL ASSEMBLE OUT OF TS +.OPEN=41000,, +.OPER=42000,, +.CALL=43000,, +.VALUE=.CALL 4, +.CORE=.CALL 6, +.SUSET=.CALL 13, +.CLOSE=.OPER 7 +.IOPUSH=.OPER 13 +.IOPOP=.OPER 14 +.IOPDL=.OPER 57 +.FEED=.OPER 72 +.SMASK==400006 +.RSNAM==16 +.SSNAM==400016 +.SPICL==400017 + +BEG: .SUSET [.RSNAM,,RSYSNM] ;GET SYSTEM NAME + .SUSET [.SMASK,,[220000]] ;PDL OVERFLOW,MEMORY PROTECTION VIOLATION + .SUSET [.SPICL,,[-1]] ;PERMIT INTERRUPTS (IN CASE RESTARTED DURING INTERRUPT) + .SUSET [.RJNAM,,JNAME] + SKIPN 51 + JRST .+3 + MOVEM A,ISYSNM + MOVEM A,OSYSNM + MOVE P,[-LPDL,,PDL] + .CORE /2000 + JRST .-1 + .OPEN TYIC,[30,,SIXBIT / TTYMIDAS INPUT/] + .VALUE + .OPEN TYOC,[1,,SIXBIT / TTYMIDAS OUTPUT/] + .VALUE + ;GOBBLE SYMS FROM SYSTEM + ;TABLE AREA IN SYSTEM: + ;FIRST LOC SYSYMB + ;LAST (AS OPPOSED TO LAST + 1) SYSYME + MOVEI A,EISYMT ;EISYMT FIRST LOC FOR ITS SYMS + MOVE B,[SIXBIT /CALLS/] ;SYSTEM CALLS + .GETSYS A, ;READ IN SYSTEM CALLS (SHOULD SKIP) + .VALUE + HRRM A,SP1 ;MARK END OF SYMS + MOVEI B,EISYMT + MOVEI AA,SYMC_<-18.+4> ;SQUOZE FLAG FOR SYM + DPB AA,[400400,,(B)] + ADDI B,2 + CAIE B,(A) + JRST .-3 + MOVE A,INCHR + MOVEM A,RRL1 + SKIPE 51 + JRST HINIT ;RETURNS TO GO21 + MOVE B,[SIXBIT /MIDAS./] + PUSHJ P,SIXTYO + MOVE B,JNAME ;if invoked as MIDASD, print E&S before version + CAME B,[SIXBIT /MIDASD/] + JRST .+3 + MOVSI B,(SIXBIT/E&S/) + PUSHJ P,SIXTYO + MOVE B,[MIDVRS] + PUSHJ P,SIXTYO +GO2: SETOM PRGC + SETOM OUTC + PUSHJ P,CMD ;GET TYPED IN COMMAND +GO21: PUSHJ P,WINIT ;OPEN OUTPUT FILE + PUSHJ P,OPNRD ;OPEN INPUT FILE + MOVE A,[UTYIC,,A] + .RCHST A, + JUMPN B,GO22 + MOVE B,FNAM1 + MOVE C,FNAM2 +GO22: MOVEM B,RFNAM1 + MOVEM B,INFN1 + MOVEM C,RFNAM2 + MOVEM C,INFN2 +GO3: JSP A,INIT + JSP A,PS1 +IFN A1PSW,[ + AOS PRGC ;INDICATE END STATEMENT ENCOUNTERED + SETOM OUTC ;" " " +] + TRNE FF,NPSS ;IF 2 PASS ASSEMBLY, + PUSHJ P,OPNRD ;THEN RE-OPEN INPUT FILE + JSP A,PLOD + JSP A,PS2 + JSP A,PSYMS +IFN A1PSW,[ + TRNN FF,NPSS ;IF 1 PASS ASSEMBLY, + JRST GO3 ;THEN TRY TO ASSEMBLE ANOTHER PROGRAM +] +RETN2: PUSHJ P,.FILE + .VALUE [ASCIZ /:KILL /] + JRST BEG + + ;GET (JUST TYPED IN) CHAR IN A + +TYI: .IOT TYIC,A + CAIN A,32 + .VALUE + CAIN A,^R + JRST TYO + CAIE A,15 + CAIN A,12 + JRST TYO + POPJ P, + +TAB: MOVEI A,11 +TYO: .IOT TYOC,A ;TYPE OUT CHAR IN A + POPJ P, + + ;EOFCH ENCOUNTERED ON READ, RELOAD AND JUMP BACK FOR NEXT CHAR + +INCHR: +RPA: ILDB A,UREDP +RPAE: CAME A,EOFCH + POPJ P, +INCHR3: HRRZ A,UREDP ;GET BYTE POINTER + CAMN A,UTIBED ;END OF COMPLETELY READ BLOCK? + JRST UTRLD ;YES + SOSL ILEVEL + JRST IFPOP + PUSHJ P,OUTCHK + MOVSI A,-4 + XCT NEDT(A) + AOBJN A,.-1 + JUMPGE A,RETN2 + MOVE A,[70700,,EOFCH] + MOVEM A,UREDP + (SIXBIT /NED/) + +UTRLD: MOVE A,[-,,UTIBUF] + ADD A,IBUFOF + .IOT UTYIC,A + JUMPGE A,UTRLD1 + HRRZM A,RPAT1 + HRLZ A,EOFCH + LSH A,13 + HLLM A,@RPAT1 +UTRLD1: MOVE A,[700,,UTIBUF-1] + ADD A,IBUFOF + MOVEM A,UREDP + JRST INCHR + +IFPOP: PUSH P,B + PUSH P,A + MOVE A,[AFNAM2+1,,AFNAM1] + BLT A,AFNAM2+41-3 ;Length of AFNAM2 + POP P,A + MOVE B,INPDLP + POP B,EOFCH + POP B,IBUFOF + POP B,UREDP + POP B,UTIBED + MOVEM B,INPDLP + MOVE A,IBUFOF + MOVE B,EOFCH + LSH B,35 + MOVEM B,UTIBE(A) + POP P,B + .IOPOP UTYIC, + JRST INCHR + +IFN A1PSW,[ ;HOLLAR "NED" IF ANY OF THE FOLLOWING: +NEDT: SKIPL PRGC ;NO END STATEMENTS HAVE BEEN ENCOUNTERED + SKIPGE OUTC ;OUTPUT HAS OCCURED NOT MATCHED BY AN END STATEMENT + SKIPGE OUTN1 ;OUTPUT HAS OCCURED OTHER THAN IN 1PASS MODE + TRNN FF,PSS ;CURRENTLY IN PASS 2 +LNEDT==.-NEDT ;LENGTH OF TABLE +] + + ;TS OUTPUT ROUTINES + +TPPB: IDPB A,UTYOP ;OUTPUT WORD + AOSGE UTYOCT ;SKIP IF BUFFER FULL + POPJ P, +TPPBF: MOVEM A,UTYOP + MOVE A,[UTOBUF,,-200] ;Length of UTOBUF + SUB A,UTYOCT + MOVSS A + .IOT UTYOC,A + MOVNI A,200 + MOVEM A,UTYOCT + MOVE A,[4400,,UTOBUF-1] + EXCH A,UTYOP + POPJ P, + +.FILE: MOVNI A,1 + PUSHJ P,TPPB ;OUTPUT A -1 SO STINK WILL SEE EOF + PUSHJ P,TPPBF ;OUTPUT THE BUFFER + .CLOSE UTYIC, + .CLOSE UTYOC, + POPJ P, + +WINIT: MOVEI A,7 + HRLM A,ONAM + .SUSET [.SSNAM,,OSYSNM] ;SET SYSTEM NAME + .OPEN UTYOC,ONAM + (SIXBIT /TSL/) + TLZ FF,PTPF ;INITIALLY ASSUME DEVICE NOT PAPER TAPE PUNCH + .STATUS UTYOC,A ;GET STATUS OF OUTPUT CHANNEL + ANDI A,77 ;MASK TO DEVICE CODE + CAIN A,7 ;IF PAPER TAPE PUNCH, + TLO FF,PTPF ;THEN SET PTPF + MOVE A,[4400,,UTOBUF-1] + MOVEM A,UTYOP + MOVNI A,200 + MOVEM A,UTYOCT + MOVEI A,4 + MOVEM A,INDDP + POPJ P, + +TFEED: TLNN FF,PTPF ;IF OUTPUT DEVICE NOT PTP, + POPJ P, ;THEN DO NOTHING + PUSHJ P,TPPBF ;OTHERWISE OUTPUT THE BUFFER, +TFEED1: .FEED UTYOC, ;FEED A LINE, + TLZA FF,PTPF ;IF THIS IS EXECUTED, UTYOC DOESN'T HAVE PTP AFTER ALL + SOJG B,TFEED1 ;FEED THE SPECIFIED NUMBER OF LINES, + POPJ P, ;AND RETURN + + ;TS INPUT ROUTINES + + ;OPEN MAIN INPUT FILE FOR READING + +OPNRD: .IOPDL ;RE-INITIALIZE IO PDL + MOVEI A,2 ;BLOCK ASCII INPUT + HRLM A,DNAM ;SET UP LH(DNAM) FOR MODE SPECIFICATION FOR .OPEN + MOVE A,FNAM1 + MOVEM A,AFNAM1 + MOVE A,FNAM2 + MOVEM A,AFNAM2 + .SUSET [.SSNAM,,ISYSNM] ;SET SYSTEM NAME FOR .OPEN + .OPEN UTYIC,DNAM ;TRY IT + (SIXBIT /FNF/) + MOVEI A,UTYIC + .EOFC A, + MOVEM A,EOFCH + LSH A,35 + MOVEM A,UTIBE + MOVE A,[700,,UTIBE-1] + MOVEM A,UREDP + MOVEI A,UTIBE + MOVEM A,UTIBED + SETZM ILEVEL + SETZM IBUFOF + MOVEI A,INPDLP + MOVEM A,INPDLP + MOVE A,[-LTYPDL,,TTYPDL-1] + MOVEM A,ITTYP + POPJ P, + +EOFCH: 0 +RPAT1: 0 +IBUFOF: 0 +UTIBED: UTIBE + + ;TTY ROUTINES + + ;GET CHARACTER IN A, READ NEW STRING IF OLD EXHAUSTED (USED BY CMD) + +RCHA: ILDB A,CMPTR ;GET CHARACTER + JUMPN A,CPOPJ ;RETURN IF VALID +RCHA1: MOVE B,[10700,,CMBUF-1] + MOVEM B,CMPTR +RCHA2: PUSHJ P,TYI + CAIN A,177 + JRST RCHA3 + IDPB A,B + CAIE A,15 + JRST RCHA2 + MOVEI A,0 + IDPB A,B + JRST RCHA + +RCHA3: CAMN B,[10700,,CMBUF-1] + JRST RCHA4 + LDB A,B + ADD B,[70000,,] + SKIPGE B + SUB B,[430000,,1] + PUSHJ P,TYO + JRST RCHA2 + +RCHA4: PUSHJ P,CRR + JRST RCHA1 + + + ;GET COMMAND + +;FLAGS (IN FF) (LH => INPUT, RH => OUTPUT) +;OTHER AC'S: C HAS COMPLETE NAME, D NAME BEING BUILT UP, TT BYTE POINTER TO C + +SIF==400000 +COLF==200000 +NAMF==100000 +NAM2F==40000 +DEVF==20000 +SCOLF==10000 +SYSNF==4000 + +CMD: PUSHJ P,CRR + MOVSI A,(SIXBIT/>/) + MOVEM A,FNAM2 + SETZB FF,CMPTR +CMDB: SETZM SUBNM ;CLEAR OUT NAME + MOVE TT,[10600,,SUBNM-1] +CMDL: PUSHJ P,RCHA ;READ CHARACTER FROM TTY + CAIN A,^Q + JRST CMDQ + CAIGE A,40 + JRST CMDE + CAIN A,": + JRST CMDCOL + CAIN A,"; + JRST CMDSC + CAIN A,"_ + JRST CMDLA + CAIN A,40 + JRST CMDS +IFN LISTSW,[ + CAIN A,"( + JRST CMDSW +] +CMDL1: SUBI A,40 + PUSHJ P,SYLEND + TLNE TT,770000 + IDPB A,TT + JRST CMDL + +CMDQ: PUSHJ P,RCHA ;CONTROL Q, GET NEXT CHARACTER + JRST CMDL1 ;NOT CR, JUST DEPOSIT IN WORD (DON'T CHECK FOR :, ;, SPACE, ETC.) + +CMDSC: TLOA FF,SCOLF +CMDCOL: TLO FF,COLF +CMDS: CAMN TT,[10600,,SUBNM-1] + JRST CMDL + TLO FF,SIF + MOVE C,SUBNM + JRST CMDB + +SYLEND: TLZN FF,SIF + POPJ P, +SYLE2: TLZE FF,COLF + JRST SYLDV + TLZE FF,SCOLF + JRST SYLSN + TLOE FF,NAMF + JRST NAM2 + MOVEM C,FNAM1 + POPJ P, +NAM2: TLON FF,NAM2F ;NAMES AFTER SECOND GET IGNORED + MOVEM C,FNAM2 + POPJ P, + +SYLSN: TLO FF,SYSNF + MOVEM C,ISYSNM + POPJ P, +SYLDV: TLO FF,DEVF + LDB T,[360600,,C] + CAIG T,'9 + CAIGE T,'0 + JRST SYLDV1 + TLNN C,7777 + MOVSI C,(SIXBIT /UT/+T) +SYLDV1: HLRZM C,DNAM + POPJ P, + +CMDLA: PUSHJ P,SYLE1 + HLRZS FF + MOVE T,[DNAM,,ONAM] + BLT T,ONAM+3 + JRST CMDB + +IFN LISTSW,[ ;IF SWITCHES NEEDED FOR OTHER THAN LISTING, DELETE THIS CONDITIONAL +CMDSW: PUSHJ P,RCHA + CAIN A,") + JRST CMDL +IFN LISTSW,[CAIN A,"L + JRST CMDLST +] JRST CMDSW +] + +IFN LISTSW,[ + + ;PRINTING ROUTINES + + ;L SWITCH TYPED IN DURING COMMAND, SET UP FOR LISTING + +CMDLST: SETOM LISTON + PUSHJ P,MDSSET ;SET UP INSTRUCTIONS TO GO TO RCH +CMDSW1: .OPEN LPTC,[SIXBIT / !LPTWALL PAPER /] + SKIPA A,[30.] + JRST CMDSW + .SLEEP A, + JRST CMDSW1 + + ;PRINT CHARACTER IN A + +PILPT: .IOT LPTC,A + POPJ P, + + ;DONE PRINTING + +LPTCLS: SKIPL LISTON + POPJ P, ;WASN'T PRINTING TO BEGIN WITH + SETZM LISTON ;CLEAR OUT FLAG + MOVEI A,15 ;NOW TO END WITH FOR FEED + PUSHJ P,PILPT + MOVEI A,14 + PUSHJ P,PILPT + .CLOSE LPTC, ;RELEASE PRINTER + POPJ P, +] + + ;CARRIAGE RETURN TYPED + +CMDE: PUSHJ P,SYLE1 + TLNN FF,NAMF + JRST CMDB ;JUST RANDOM CR, TRY AGAIN + ;NOW FILL IN MISSING NAMES + ;DEVICE +CMDE1: MOVEI T,(SIXBIT /DSK/) + TLNN FF,DEVF + MOVEM T,DNAM + ;SYSTEM NAME + MOVE T,RSYSNM + TLNN FF,SYSNF + MOVEM T,ISYSNM ;DEFAULT INPUT SYSTEM NAME IS INITIAL SYSTEM NAME + TRNN FF,SYSNF + MOVEM T,OSYSNM ;DEFAULT OUTPUT SYSTEM NAME IS ALSO INITIAL SYSTEM NAME + ;INPUT FILE NAMES + MOVE T,DNAM + TRNN FF,DEVF + MOVEM T,ONAM + ;OUTPUT FILE NAMES + TRNE FF,NAM2F + POPJ P, ;BOTH OUTPUT FILE NAMES TYPED, RETURN + MOVE T,FNAM1 ;NOT BOTH, + EXCH T,ONAM+1 ;SET FIRST OUTPUT NAME FROM FIRST INPUT NAME + TRNN FF,NAMF ;IF ONE OUTPUT NAME TYPED THEN IT IS THE SECOND + MOVSI T,(SIXBIT/BIN/) + MOVEM T,ONAM+2 + POPJ P, + +SYLE1: CAMN TT,[10600,,SUBNM-1] + JRST SYLEND + MOVE C,SUBNM + JRST SYLE2 + + ;TS VARIABLES + +AFNAM1: 0 +AFNAM2: BLOCK 41 ;XXX Length used in IFPOP and A.INSR +RSYSNM: -1 ;INITIAL SYSTEM NAME +CMBUF: BLOCK 50 ;TYPEIN BUFFER +DNAM: 0 ;DEVICE NAME +FNAM1: 0 ;FILE NAME 1 +FNAM2: 0 ;" " 2 +ISYSNM: -1 +ONAM: BLOCK 3 ;OUTPUT DEVICE/FILENAMES SPECIFIED +OSYSNM: -1 ;SPECIFIED OUTPUT SYSTEM NAME +SUBNM: 0 +CMPTR: 0 ;BYTE POINTER TO CMBUF +UTIBUF: BLOCK 40 ;INPUT BUFFER +UTIBE: BLOCK 241 ;END OF " +UTOBUF: BLOCK 200 ;OUTPUT BUFFER - XXX Length used in TPPBF +UTOBE: ;END OF " +UREDP: 0 ;INPUT BYTE POINTER +UTYOP: 0 ;OUTPUT (36. BIT) BYTE POINTER +UTYOCT: 0 ; - # WORDS LEFT IN UTOBUF +RFNAM1: 0 ;.FNAM1 +RFNAM2: 0 +JNAME: 0 +FEED1: SKIPA B,[40] +FEED: MOVEI B,5 + JRST TFEED" +PPB: JUMPGE FF,CPOPJ +PPBA: JRST TPPB" + +] ;END TS CONDITIONAL + +CONSTANTS + +PATCH": BLOCK 42 ;XXX CONSTANTS emits two extra 0s + + ;NOTE THAT POPJ P, IS VALID TEST FOR SQUOZENESS + ;EXCEPT FOR EOFCH + +GDTAB": REPEAT 3,POPJ P,76 ;(GDTAB GLOBAL SO OUT OF TS, AIO CAN CLOBBER GDTAB+141 WITH JRST RREOF + ;ON OLD FILES) +IFE TS,[POPJ P,76] IFN TS,[JRST UT141] + REPEAT 5,POPJ P,76 + POPJ P,75 ;TAB + POPJ P,74 ;LF + POPJ P,76 ;VERT TAB + POPJ P,76 ;FORM FEED + POPJ P,74 ;CR + REPEAT "!-16-1,POPJ P,76 + POPJ P,40 ;SPACE + POPJ P,41 ;! + POPJ P,42 ;" + POPJ P,43 ;# + ADD SYM,%$SQ(D) ;$ + ADD SYM,%%SQ(D) ;% + POPJ P,46 ;& + POPJ P,47 ;' + POPJ P,50 ;( + POPJ P,51 ;) + POPJ P,52 ;* + POPJ P,53 ;+ + POPJ P,54 ;, + POPJ P,55 ;- + POPJ P,56 ;. + POPJ P,57 ;/ + REPEAT 10.,JSP CH2,RR2 ;DIGITS + POPJ P,60 ;: + POPJ P,61 ;; + POPJ P,62 ;< + POPJ P,63 ;= + POPJ P,64 ;> + POPJ P,65 ;? + POPJ P,66 ;@ +IRPC Q,,ABCDEFGHIJKLMNOPQRSTUVWXYZ + ADD SYM,%!Q!SQ(D) +TERMIN + POPJ P,67 ;[ + POPJ P,70 ;\ + POPJ P,71 ;] + POPJ P,72 ;^ + POPJ P,73 ;_ + + ;NOW LOWER CASE + + POPJ P,76 ;GRAVE ACCENT + JRST UT141 ;A + REPEAT 25.,POPJ P,76 ;B-Z + REPEAT 4,POPJ P,76 ;BRACES, VERT BAR, TILDE + POPJ P,76 ;RUBOUT, LIKE SPACE + IFN .-GDTAB-200,[PRINTX /GDTAB LOSES +/] + +IRPC Q,,ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890$%. +%!Q!SQ: 0 + SQUOZE 0,Q/50/50/50/50/50 + SQUOZE 0,Q/50/50/50/50 + SQUOZE 0,Q/50/50/50 + SQUOZE 0,Q/50/50 + SQUOZE 0,Q/50 + SQUOZE 0,Q + +TERMIN + +IFN TS,[DEFINE .LOP A +.LVAL1=.OP A +TERMIN] + +;MAC PROC TABLES +INIT1: HRLZI A, 2*-SMK-LCONTB-LCONTB/18.-.LVAL1-NCONS*3-LCNGLO + SETZM ST(A) + AOBJN A,.-1 +SPREAD: MOVEI AA,ISYMTB + MOVS F,ISMTBB ;GET SWAPPED VALUE OF FIRST INSTRUCTION +SP3: CAIL AA,EISYM1 + JRST SP1.1 ;DONE WITH INSTRUCTIONS + MOVE SYM,(AA) + JUMPE SYM,SP2 + PUSHJ P,ES ;WON'T SKIP + HRLZI T,SYMC + HRLZ B,F + MOVSI C,3INI + PUSHJ P,VSM2 +SP2: ADDI F,1000 + AOJA AA,SP3 +SP1.1: MOVE B,[SIXBIT /MIDASD/] + CAME B,JNAME + MOVEI AA,AFTES +SP1: CAIL AA,EISYMT + JRST SP4 + MOVE SYM,(AA) + LDB T,[400400,,SYM] + ROT T,-4 + PUSHJ P,ES + MOVE B,1(AA) + MOVSI C,3INI + CAMN T,[GLOEXT,,] ;GLOBAL ENTRIES REALLY EXITS, HACKED TO DEFEAT ADDRESS LINKING + TLO C,3LLV + PUSHJ P,VSM2 + AOS AA + AOJA AA,SP1 + +CONSTANTS + +BKBUF: BLOCK BSIZE+5 ;CURRENT BLOCK TO OUTPUT +GLOTB: BLOCK 20 ;GLOBAL TABLE, EACH ENTRY FLAGS,,ADR OF SQUOZE (SEE COMMENTS NEAR BEGINNING) +PDL": BLOCK LPDL+1 + +ST: BLOCK 2*SMK ;SYMBOL TABLE 2 WORDS/SYM FIRST SQUOZE, SECOND "VALUE" (THIRD EXISTS, SEE 3RDWRD) +.LOP IDIV SMK 2 ;NOTE: ST MUST BE ABOVE CONSTANTS TABLES OR NOCON3 WILL LOSE +3RDWRD: BLOCK .LVAL1 ;THIRD WORD OF SYM LIVES HERE, REALLY A HALFWORD, CONTAINS FLAGS AND LEV + +CONBIT: BLOCK LCONTB/18.+1 ;RELOCATION BITS (SEE CPTMK) +CONTAB: BLOCK LCONTB ;CONSTANTS TABLE, VALUES OF CONSTANTS THIS CONSTANTS AREA +PCNTB: BLOCK NCONS*3 ;CONSTANTS AREAS TABLE +CONGLO: BLOCK LCNGLO ;CONSTANTS GLOBAL TABLE + ;EACH ENTRY TWO WORDS + ;FIRST WORD GLOTB ENTRY + ;SECOND ADR IN CONTAB OF CONSTANT TO WHICH IT REFERS +VARTAB: BLOCK NVARS +STRSTO: BLOCK STRL ;STRING STORAGE FOR GSYL AND FRIENDS + +DMYDEF: BLOCK DMDEFL ;TABLE OF DUMMY NAMES FOR THING BEING DEFINED + +DSTG: BLOCK DSSIZ ;TABLE OF CHAR ADRS OF DUMMIES BEING DEFINED PRIOR TO MACRO EXPANSION + +DMYAGT: BLOCK DMYAGL ;TABLE OF CHAR ADRS OF DUMMYS OF MACROS BEING EXPANDED + ;DMYAGT TRACKS WITH THE MACRO PDL; + ;DMYAGT CAN'T BE COMBINED WITH DSTG SINCE DMYAGT CAN BE SHIFTING AROUND RANDOMLY DURING ARG SCAN + +TOPPP: + +MACPDL: BLOCK MPDLL ;MACRO PDL +GCSV: BLOCK 16 ;AC SAVE AREA FOR GC + +MAXMAC: 27760 ;XXX Calculate? +MMAXMC: 27770 ;XXX Calculate? +MACTAB: 773767750000 ;MACRO CHARACTER STORAGE (FIRST WORD 3 375'S) + +UFA=FSC-(2000) ;ALLOW FOR BOOTSTRAP, EVENTUALLY FLUSH, MAYBE + +ISMTBB: UFA ;FIRST OP. CODE IN ISYMTB + +ISYMTB: + +SQUOZE 10,UFA ;PDP10 INSTRUCTION +SQUOZE 10,DFN ;PDP10 INSTRUCTION +SQUOZE 10,FSC +SQUOZE 10,IBP +SQUOZE 10,ILDB +SQUOZE 10,LDB +SQUOZE 10,IDPB +SQUOZE 10,DPB +SQUOZE 10,FAD +SQUOZE 10,FADL +SQUOZE 10,FADM +SQUOZE 10,FADB +SQUOZE 10,FADR +SQUOZE 10,FADRL +SQUOZE 10,FADRM +SQUOZE 10,FADRB +SQUOZE 10,FSB +SQUOZE 10,FSBL +SQUOZE 10,FSBM +SQUOZE 10,FSBB +SQUOZE 10,FSBR +SQUOZE 10,FSBRL +SQUOZE 10,FSBRM +SQUOZE 10,FSBRB +SQUOZE 10,FMP +SQUOZE 10,FMPL +SQUOZE 10,FMPM +SQUOZE 10,FMPB +SQUOZE 10,FMPR + SQUOZE 10,FMPRL +SQUOZE 10,FMPRM +SQUOZE 10,FMPRB +SQUOZE 10,FDV +SQUOZE 10,FDVL +SQUOZE 10,FDVM +SQUOZE 10,FDVB +SQUOZE 10,FDVR +SQUOZE 10,FDVRL +SQUOZE 10,FDVRM +SQUOZE 10,FDVRB +SQUOZE 10,MOVE +SQUOZE 10,MOVEI +SQUOZE 10,MOVEM +SQUOZE 10,MOVES +SQUOZE 10,MOVS +SQUOZE 10,MOVSI +SQUOZE 10,MOVSM +SQUOZE 10,MOVSS +SQUOZE 10,MOVN +SQUOZE 10,MOVNI +SQUOZE 10,MOVNM +SQUOZE 10,MOVNS +SQUOZE 10,MOVM +SQUOZE 10,MOVMI +SQUOZE 10,MOVMM +SQUOZE 10,MOVMS + +SQUOZE 10,IMUL +SQUOZE 10,IMULI +SQUOZE 10,IMULM +SQUOZE 10,IMULB +SQUOZE 10,MUL +SQUOZE 10,MULI +SQUOZE 10,MULM +SQUOZE 10,MULB +SQUOZE 10,IDIV +SQUOZE 10,IDIVI +SQUOZE 10,IDIVM +SQUOZE 10,IDIVB +SQUOZE 10,DIV +SQUOZE 10,DIVI +SQUOZE 10,DIVM +SQUOZE 10,DIVB +SQUOZE 10,ASH +SQUOZE 10,ROT +SQUOZE 10,LSH +SQUOZE 10,JFFO ;PDP10 INSTRUCTION +SQUOZE 10,ASHC +SQUOZE 10,ROTC +SQUOZE 10,LSHC +0 ;CIRC +SQUOZE 10,EXCH +SQUOZE 10,BLT +SQUOZE 10,AOBJP +SQUOZE 10,AOBJN +SQUOZE 10,JRST +SQUOZE 10,JFCL +SQUOZE 10,XCT +0 + SQUOZE 10,PUSHJ +SQUOZE 10,PUSH +SQUOZE 10,POP +SQUOZE 10,POPJ +SQUOZE 10,JSR +SQUOZE 10,JSP +SQUOZE 10,JSA +SQUOZE 10,JRA +SQUOZE 10,ADD +SQUOZE 10,ADDI +SQUOZE 10,ADDM +SQUOZE 10,ADDB +SQUOZE 10,SUB +SQUOZE 10,SUBI +SQUOZE 10,SUBM +SQUOZE 10,SUBB +SQUOZE 10,CAI +SQUOZE 10,CAIL +SQUOZE 10,CAIE +SQUOZE 10,CAILE +SQUOZE 10,CAIA +SQUOZE 10,CAIGE +SQUOZE 10,CAIN +SQUOZE 10,CAIG + +SQUOZE 10,CAM +SQUOZE 10,CAML +SQUOZE 10,CAME +SQUOZE 10,CAMLE +SQUOZE 10,CAMA +SQUOZE 10,CAMGE +SQUOZE 10,CAMN +SQUOZE 10,CAMG +SQUOZE 10,JUMP +SQUOZE 10,JUMPL +SQUOZE 10,JUMPE +SQUOZE 10,JUMPLE +SQUOZE 10,JUMPA +SQUOZE 10,JUMPGE +SQUOZE 10,JUMPN +SQUOZE 10,JUMPG +SQUOZE 10,SKIP +SQUOZE 10,SKIPL +SQUOZE 10,SKIPE +SQUOZE 10,SKIPLE +SQUOZE 10,SKIPA +SQUOZE 10,SKIPGE +SQUOZE 10,SKIPN +SQUOZE 10,SKIPG +SQUOZE 10,AOJ +SQUOZE 10,AOJL +SQUOZE 10,AOJE +SQUOZE 10,AOJLE +SQUOZE 10,AOJA +SQUOZE 10,AOJGE +SQUOZE 10,AOJN +SQUOZE 10,AOJG +SQUOZE 10,AOS +SQUOZE 10,AOSL +SQUOZE 10,AOSE + SQUOZE 10,AOSLE +SQUOZE 10,AOSA +SQUOZE 10,AOSGE +SQUOZE 10,AOSN +SQUOZE 10,AOSG +SQUOZE 10,SOJ +SQUOZE 10,SOJL +SQUOZE 10,SOJE +SQUOZE 10,SOJLE +SQUOZE 10,SOJA +SQUOZE 10,SOJGE +SQUOZE 10,SOJN +SQUOZE 10,SOJG +SQUOZE 10,SOS +SQUOZE 10,SOSL +SQUOZE 10,SOSE +SQUOZE 10,SOSLE +SQUOZE 10,SOSA +SQUOZE 10,SOSGE +SQUOZE 10,SOSN +SQUOZE 10,SOSG + +SQUOZE 10,SETZ +SQUOZE 10,SETZI +SQUOZE 10,SETZM +SQUOZE 10,SETZB +SQUOZE 10,AND +SQUOZE 10,ANDI +SQUOZE 10,ANDM +SQUOZE 10,ANDB +SQUOZE 10,ANDCA +SQUOZE 10,ANDCAI +SQUOZE 10,ANDCAM +SQUOZE 10,ANDCAB +SQUOZE 10,SETM +SQUOZE 10,SETMI +SQUOZE 10,SETMM +SQUOZE 10,SETMB +SQUOZE 10,ANDCM +SQUOZE 10,ANDCMI +SQUOZE 10,ANDCMM +SQUOZE 10,ANDCMB +SQUOZE 10,SETA +SQUOZE 10,SETAI +SQUOZE 10,SETAM +SQUOZE 10,SETAB +SQUOZE 10,XOR +SQUOZE 10,XORI +SQUOZE 10,XORM +SQUOZE 10,XORB +SQUOZE 10,IOR +SQUOZE 10,IORI +SQUOZE 10,IORM +SQUOZE 10,IORB +SQUOZE 10,ANDCB +SQUOZE 10,ANDCBI +SQUOZE 10,ANDCBM +SQUOZE 10,ANDCBB +SQUOZE 10,EQV +SQUOZE 10,EQVI + SQUOZE 10,EQVM +SQUOZE 10,EQVB +SQUOZE 10,SETCA +SQUOZE 10,SETCAI +SQUOZE 10,SETCAM +SQUOZE 10,SETCAB +SQUOZE 10,ORCA +SQUOZE 10,ORCAI +SQUOZE 10,ORCAM +SQUOZE 10,ORCAB +SQUOZE 10,SETCM +SQUOZE 10,SETCMI +SQUOZE 10,SETCMM +SQUOZE 10,SETCMB + +SQUOZE 10,ORCM +SQUOZE 10,ORCMI +SQUOZE 10,ORCMM +SQUOZE 10,ORCMB +SQUOZE 10,ORCB +SQUOZE 10,ORCBI +SQUOZE 10,ORCBM +SQUOZE 10,ORCBB +SQUOZE 10,SETO +SQUOZE 10,SETOI +SQUOZE 10,SETOM +SQUOZE 10,SETOB +SQUOZE 10,HLL +SQUOZE 10,HLLI +SQUOZE 10,HLLM +SQUOZE 10,HLLS +SQUOZE 10,HRL +SQUOZE 10,HRLI +SQUOZE 10,HRLM +SQUOZE 10,HRLS +SQUOZE 10,HLLZ +SQUOZE 10,HLLZI +SQUOZE 10,HLLZM +SQUOZE 10,HLLZS +SQUOZE 10,HRLZ +SQUOZE 10,HRLZI +SQUOZE 10,HRLZM +SQUOZE 10,HRLZS +SQUOZE 10,HLLO +SQUOZE 10,HLLOI +SQUOZE 10,HLLOM +SQUOZE 10,HLLOS +SQUOZE 10,HRLO +SQUOZE 10,HRLOI +SQUOZE 10,HRLOM +SQUOZE 10,HRLOS +SQUOZE 10,HLLE +SQUOZE 10,HLLEI +SQUOZE 10,HLLEM +SQUOZE 10,HLLES +SQUOZE 10,HRLE +SQUOZE 10,HRLEI +SQUOZE 10,HRLEM +SQUOZE 10,HRLES +SQUOZE 10,HRR + SQUOZE 10,HRRI +SQUOZE 10,HRRM +SQUOZE 10,HRRS +SQUOZE 10,HLR +SQUOZE 10,HLRI +SQUOZE 10,HLRM +SQUOZE 10,HLRS + +SQUOZE 10,HRRZ +SQUOZE 10,HRRZI +SQUOZE 10,HRRZM +SQUOZE 10,HRRZS +SQUOZE 10,HLRZ +SQUOZE 10,HLRZI +SQUOZE 10,HLRZM +SQUOZE 10,HLRZS +SQUOZE 10,HRRO +SQUOZE 10,HRROI +SQUOZE 10,HRROM +SQUOZE 10,HRROS +SQUOZE 10,HLRO +SQUOZE 10,HLROI +SQUOZE 10,HLROM +SQUOZE 10,HLROS +SQUOZE 10,HRRE +SQUOZE 10,HRREI +SQUOZE 10,HRREM +SQUOZE 10,HRRES +SQUOZE 10,HLRE +SQUOZE 10,HLREI +SQUOZE 10,HLREM +SQUOZE 10,HLRES +SQUOZE 10,TRN +SQUOZE 10,TLN +SQUOZE 10,TRNE +SQUOZE 10,TLNE +SQUOZE 10,TRNA +SQUOZE 10,TLNA +SQUOZE 10,TRNN +SQUOZE 10,TLNN +SQUOZE 10,TDN +SQUOZE 10,TSN +SQUOZE 10,TDNE +SQUOZE 10,TSNE +SQUOZE 10,TDNA +SQUOZE 10,TSNA +SQUOZE 10,TDNN +SQUOZE 10,TSNN +SQUOZE 10,TRZ +SQUOZE 10,TLZ +SQUOZE 10,TRZE +SQUOZE 10,TLZE +SQUOZE 10,TRZA +SQUOZE 10,TLZA +SQUOZE 10,TRZN +SQUOZE 10,TLZN +SQUOZE 10,TDZ +SQUOZE 10,TSZ +SQUOZE 10,TDZE +SQUOZE 10,TSZE + +SQUOZE 10,TDZA +SQUOZE 10,TSZA +SQUOZE 10,TDZN +SQUOZE 10,TSZN + +SQUOZE 10,TRC +SQUOZE 10,TLC +SQUOZE 10,TRCE +SQUOZE 10,TLCE +SQUOZE 10,TRCA +SQUOZE 10,TLCA +SQUOZE 10,TRCN +SQUOZE 10,TLCN +SQUOZE 10,TDC +SQUOZE 10,TSC +SQUOZE 10,TDCE +SQUOZE 10,TSCE +SQUOZE 10,TDCA +SQUOZE 10,TSCA +SQUOZE 10,TDCN +SQUOZE 10,TSCN +SQUOZE 10,TRO +SQUOZE 10,TLO +SQUOZE 10,TROE +SQUOZE 10,TLOE +SQUOZE 10,TROA +SQUOZE 10,TLOA +SQUOZE 10,TRON +SQUOZE 10,TLON +SQUOZE 10,TDO +SQUOZE 10,TSO +SQUOZE 10,TDOE +SQUOZE 10,TSOE +SQUOZE 10,TDOA +SQUOZE 10,TSOA +SQUOZE 10,TDON +SQUOZE 10,TSON + +EISYM1: +SQUOZE 10,LIS +20000,,0 +SQUOZE 10,RJMP +20100,,0 +SQUOZE 10,RAR +0 +SQUOZE 10,WAR +1 +SQUOZE 10,PC +2 +SQUOZE 10,SP +3 +SQUOZE 10,P1 +4 +SQUOZE 10,P2 +5 +SQUOZE 10,DSP +6 +SQUOZE 10,UR +7 +SQUOZE 10,RCR +10 +SQUOZE 10,WCR +11 +SQUOZE 10,DIR +12 +SQUOZE 10,RSR +13 +SQUOZE 10,SR +14 +SQUOZE 10,NEXT +17 +SQUOZE 10,XQTM +10 +SQUOZE 10,RPTM +4 +SQUOZE 10,PEELM +2 +SQUOZE 10,PROGM +1 +SQUOZE 10,PF0 +0 +SQUOZE 10,PF1 +1 +SQUOZE 10,PF2 +2 +SQUOZE 10,PF3 +3 +SQUOZE 10,PF4 +4 +SQUOZE 10,PF5 +5 +SQUOZE 10,PF6 +6 +SQUOZE 10,PF7 +7 +SQUOZE 10,RCRN +10 +SQUOZE 10,WCRN +11 +SQUOZE 10,HITF +12 +SQUOZE 10,AICF +13 +SQUOZE 10,PF14 +14 +SQUOZE 10,PF15 +15 +SQUOZE 10,PF16 +16 +SQUOZE 10,STOPF +17 +SQUOZE 10,SAVELB +0 +SQUOZE 10,SAVERT +1 +SQUOZE 10,VIEWLB +2 +SQUOZE 10,VIEWRT +3 +SQUOZE 10,WINDLB +4 +SQUOZE 10,WINDRT +5 +SQUOZE 10,INSTLB +6 +SQUOZE 10,INSTRT +7 +SQUOZE 10,NAME +10 +SQUOZE 10,NAMELB +10 +SQUOZE 10,CDIR +11 +SQUOZE 10,HITANG +12 +SQUOZE 10,SELINT +13 +SQUOZE 10,SAVE +14 +SQUOZE 10,VIEW +15 +SQUOZE 10,WIND +16 +SQUOZE 10,INST +17 +SQUOZE 10,FONT +1 +SQUOZE 10,CHAR +0 +SQUOZE 10,LITS +6 +SQUOZE 10,SWCH +4 +SQUOZE 10,JMMA +100000 +SQUOZE 10,KMMA +40000 +SQUOZE 10,JNO +20000 +SQUOZE 10,KNO +10000 +SQUOZE 10,J3D +4000 +SQUOZE 10,K3D +2000 +SQUOZE 10,JDT +1000 +SQUOZE 10,KDT +400 +SQUOZE 10,JSOH +10 +SQUOZE 10,KSOH +4 +SQUOZE 10,JSOWCR +2 +SQUOZE 10,KSOWCR +1 +SQUOZE 10,STOS +100000,,0 +SQUOZE 10,STOM +40000,,0 +SQUOZE 10,ZTOS +20000,,0 +SQUOZE 10,PTOM +10000,,0 +SQUOZE 10,NTOM +4000,,0 +SQUOZE 10,TTO +2000,,0 +SQUOZE 10,JCURVE +1000,,0 +SQUOZE 10,KCURVE +400,,0 +SQUOZE 10,JMEF +200,,0 +SQUOZE 10,KMEF +100,,0 +SQUOZE 10,JDL +40,,0 +SQUOZE 10,KDL +20,,0 +SQUOZE 10,SELFX +4,,0 +SQUOZE 10,SELFY +2,,0 +SQUOZE 10,TSELF +1,,0 +SQUOZE 10,JMOC +1000,,0 +SQUOZE 10,KMOC +400,,0 +SQUOZE 10,JMOM +200,,0 +SQUOZE 10,KMOM +100,,0 +SQUOZE 10,TM3 +70,,0 +SQUOZE 10,TM2 +60,,0 +SQUOZE 10,TM1 +50,,0 +SQUOZE 10,TM0 +40,,0 +SQUOZE 10,JMCUR +4,,0 +SQUOZE 10,KMCUR +2,,0 +SQUOZE 10,TAKEQ +1,,0 +SQUOZE 10,LI +0,,0 +SQUOZE 10,LIPSH +40000,,0 +SQUOZE 10,LIPSHM +60000,,0 +SQUOZE 10,PSH +40020,,0 +SQUOZE 10,PSHM +60020,,0 +SQUOZE 10,NOP +20,,0 +SQUOZE 10,JMP +100,,0 +SQUOZE 10,JMPPSH +60100,,0 +SQUOZE 10,NWSTK +40140,,0 +SQUOZE 10,NWSTKM +60140,,0 +SQUOZE 10,XQTA +10,,0 +SQUOZE 10,XQT +30,,0 +SQUOZE 10,RPT +24,,0 +SQUOZE 10,PEEL +22,,0 +SQUOZE 10,PROG +21,,0 +SQUOZE 10,LIF +200000,,0 +SQUOZE 10,LIFCL +210000,,0 +SQUOZE 10,LIFST +220000,,0 +SQUOZE 10,LIFCM +230000,,0 +SQUOZE 10,LAL +240000,,0 +SQUOZE 10,LALCL +250000,,0 +SQUOZE 10,LALST +260000,,0 +SQUOZE 10,LALCM +270000,,0 +SQUOZE 10,JIF +200100,,0 +SQUOZE 10,JIFCL +210100,,0 +SQUOZE 10,JIFST +220100,,0 +SQUOZE 10,JIFCM +230100,,0 +SQUOZE 10,JAL +240100,,0 +SQUOZE 10,JALCL +250100,,0 +SQUOZE 10,JALST +260100,,0 +SQUOZE 10,JALCM +270100,,0 +SQUOZE 10,JIFDED +200117,,0 +SQUOZE 10,IJNRCR +220110,,0 +SQUOZE 10,IJNWCR +220111,,0 +SQUOZE 10,IJPRCR +220130,,0 +SQUOZE 10,IJPWCR +220131,,0 +SQUOZE 10,CL +250020,,0 +SQUOZE 10,ST +260020,,0 +SQUOZE 10,CM +270020,,0 +SQUOZE 10,STOP +260037,,0 +SQUOZE 10,LOCLA +300000,,0 +SQUOZE 10,LOCLR +301000,,0 +SQUOZE 10,LOCLSA +302000,,0 +SQUOZE 10,LOCLSR +303000,,0 +SQUOZE 10,STCL +320000,,0 +SQUOZE 10,RTCLA +340020,,0 +SQUOZE 10,RTCLR +341020,,0 +SQUOZE 10,RTCLSA +342020,,0 +SQUOZE 10,RTCLSR +343020,,0 +SQUOZE 10,SKCL +360020,,0 +SQUOZE 10,LOMM +304000,,0 +SQUOZE 10,LOMMR +305000,,0 +SQUOZE 10,LOMMP +306000,,0 +SQUOZE 10,LOMDIR +307001,,0 +SQUOZE 10,STMM +324000,,0 +SQUOZE 10,NOMM +325020,,0 +SQUOZE 10,POPMM +326020,,0 +SQUOZE 10,STMDIR +327001,,0 +SQUOZE 10,RTMM +344020,,0 +SQUOZE 10,RTMMS +345020,,0 +SQUOZE 10,RTMDIR +347021,,0 +SQUOZE 10,SKMM +364020,,0 +SQUOZE 10,SKMMS +365020,,0 +SQUOZE 10,PUSHMM +366020,,0 +SQUOZE 10,SKMDIR +367021,,0 +SQUOZE 10,LOCB +315000,,0 +SQUOZE 10,STCB +335000,,0 +SQUOZE 10,RTCB +355020,,0 +SQUOZE 10,SKCB +375020,,0 +SQUOZE 10,LOSBKL +317000,,0 +SQUOZE 10,STSBKL +337000,,0 +SQUOZE 10,RTSBKL +357020,,0 +SQUOZE 10,SKSBKL +377020,,0 +SQUOZE 10,LOLITS +317301,,0 +SQUOZE 10,STSWCH +337201,,0 +SQUOZE 10,DD +400000,,0 +SQUOZE 10,DI +500000,,0 +SQUOZE 10,DN +600000,,0 +SQUOZE 10,LS +60000,,0 +SQUOZE 10,LT +70000,,0 +SQUOZE 10,PO +30000,,0 +SQUOZE 10,TO +20000,,0 +SQUOZE 10,SS +40000,,0 +SQUOZE 10,FR +50000,,0 +SQUOZE 10,DT +10000,,0 +SQUOZE 10,BX +0,,0 +SQUOZE 10,RX +7000,,0 +SQUOZE 10,AX +6000,,0 +SQUOZE 10,RA +3000,,0 +SQUOZE 10,AB +2000,,0 +SQUOZE 10,AR +4000,,0 +SQUOZE 10,RE +5000,,0 +SQUOZE 10,SL +1000,,0 +SQUOZE 10,SA +0 +SQUOZE 10,SETPTA +462000,,0 +SQUOZE 10,SETPTR +465000,,0 +SQUOZE 10,DRAWTA +422000,,0 +SQUOZE 10,DRAWTR +425000,,0 +SQUOZE 10,DRAWFA +452000,,0 +SQUOZE 10,DRAWFR +455000,,0 +SQUOZE 10,LINAA +462000,,0 +SQUOZE 10,LINAR +466000,,0 +SQUOZE 10,LINRA +467000,,0 +SQUOZE 10,LINRR +465000,,0 +SQUOZE 10,LINIAA +562000,,0 +SQUOZE 10,LINIAR +566000,,0 +SQUOZE 10,LINIRA +567000,,0 +SQUOZE 10,LINIRR +565000,,0 +SQUOZE 10,POLAA +432000,,0 +SQUOZE 10,POLAR +434000,,0 +SQUOZE 10,POLRR +435000,,0 +SQUOZE 10,POLRA +433000,,0 +SQUOZE 10,POLIAA +532000,,0 +SQUOZE 10,POLIAR +534000,,0 +SQUOZE 10,POLIRR +535000,,0 +SQUOZE 10,POLIRA +533000,,0 +SQUOZE 10,STARAA +442000,,0 +SQUOZE 10,STARAR +444000,,0 +SQUOZE 10,STARRR +445000,,0 +SQUOZE 10,STARRA +443000,,0 +SQUOZE 10,DOTSAA +412000,,0 +SQUOZE 10,DOTSAR +414000,,0 +SQUOZE 10,DOTSRR +415000,,0 +SQUOZE 10,DOTSRA +413000,,0 +SQUOZE 10,BOXA +402000,,0 +SQUOZE 10,BOXR +405000,,0 +SQUOZE 10,BOXSA +400000,,0 +SQUOZE 10,BOXSR +401000,,0 +SQUOZE 10,SETCRV +662000,,0 +SQUOZE 10,DRACRV +622000,,0 +SQUOZE 10,POLCRV +632000,,0 +SQUOZE 10,DOTCRV +612000,,0 +SQUOZE 10,NEWCRV +602000,,0 +SQUOZE 10,FRMCRV +642000,,0 +SQUOZE 10,DOCHAR +700000,,0 + +AFTES": +SQUOZE 4,BLKI +BLKI IOINST +SQUOZE 4,DATAI +DATAI IOINST +SQUOZE 4,BLKO +BLKO IOINST +SQUOZE 4,DATAO +DATAO IOINST +SQUOZE 4,CONO +CONO IOINST +SQUOZE 4,CONI +CONI IOINST +SQUOZE 4,CONSZ +CONSZ IOINST +SQUOZE 4,CONSO +CONSO IOINST + +SQUOZE 10,APR +0 +SQUOZE 10,PI +4 +SQUOZE 10,PTP +100 +SQUOZE 10,PTR +104 +SQUOZE 10,TTY +120 +SQUOZE 10,LPT +124 +SQUOZE 10,DIS +130 +SQUOZE 10,DC +200 +SQUOZE 10,UTC +210 +SQUOZE 10,UTS +214 +SQUOZE 10,IBM ;2311 CONTROL +704 + +SQUOZE 10,LDBI ;REALLY ILDB, +LDBI +SQUOZE 10,DPBI ;AND IDPB +DPBI +SQUOZE 10,CLEAR +CLEAR +SQUOZE 10,CLEARI +CLEARI +SQUOZE 10,CLEARM +CLEARM +SQUOZE 10,CLEARB +CLEARB +IRPS INST,,FAD FSB FMP FDV +SQUOZE 10,INST!SI +INST!RL +TERMIN + +SQUOZE 4,END +AEND +SQUOZE 4,LOC +ALOC +SQUOZE 4,XWORD +AXWORD +SQUOZE 4,RIM1 +SRIM1 +SQUOZE 4,RIM10 +SRIM10 +SQUOZE 4,SBLK +SIMBLK +SQUOZE 4,RIM +SRIM +SQUOZE 4,TITLE +ATITLE +SQUOZE 4,SQUOZE +ASQOZ +SQUOZE 4,EXP +AEXP +SQUOZE 4,XWD +AXWORD +SQUOZE 4,.BEGIN +ASBEG +SQUOZE 4,REPEAT +AREPEAT +SQUOZE 4,.END +ASEND +SQUOZE 4,OCT +AEXP +SQUOZE 4,CONSTA +CNSTNT +SQUOZE 4,SIXBIT +ASIXBIT +SQUOZE 4,ASCII +AASCII +SQUOZE 4,RADIX +ARDIX +SQUOZE 4,BLOCK +ABLOCK +SQUOZE 4,NOSYMS +ANOSYMS +SQUOZE 4,EXPUNGE +AEXPUNG +SQUOZE 4,NULL +ANULL +SQUOZE 4,EQUALS +AEQUAL + +SQUOZE 4,DEFINE +ADEFINE +SQUOZE 4,IRP +AIRP +SQUOZE 4,IRPC +AIRP(400000) +SQUOZE 4,IRPS +(200000)AIRP +SQUOZE 4,TERMIN +ATERMIN +SQUOZE 4,.QUOTE +A.QOTE + +SQUOZE 4,WORD +AWORD +SQUOZE 4,RELOCA +ARELOC +SQUOZE 4,1PASS +A1PASS +SQUOZE 4,OFFSET +AOFFSET + + ;CONDITIONALS +SQUOZE 4,IFG +JUMPG A,COND +SQUOZE 4,IFGE +JUMPGE A,COND +SQUOZE 4,IFE +JUMPE A,COND +SQUOZE 4,IFLE +JUMPLE A,COND +SQUOZE 4,IFN +JUMPN A,COND +SQUOZE 4,IFSE +SKIPN SCOND +SQUOZE 4,IFSN +SKIPE SCOND + +SQUOZE 4,IF1 +TRNE FF,COND1 +SQUOZE 4,IF2 +TRNN FF,COND1 +SQUOZE 4,IFP +COND5 +SQUOZE 4,IFL +JUMPL A,COND + +SQUOZE 4,PRINTX +APRNTX +SQUOZE 4,PRINTC +(400000)APRNTC +SQUOZE 4,VARIAB +AVARIAB + +SQUOZE 4,.LIBRA +A.LIB +SQUOZE 4,.LENGTH +A.LENGTH +SQUOZE 4,.LIFS +A.LIFS +SQUOZE 4,.LIFND +A.LIFND +SQUOZE 4,.ENTRY +A.ENTRY +SQUOZE 4,.EXTERN +A.EXTERN +SQUOZE 4,.ELDC +A.ELDC +IRPS A,,E N G LE GE L +SQUOZE 4,.LIF!A +JUMP!A A.LDCV +TERMIN +SQUOZE 4,.SLDR +A.SLDR + +SQUOZE 4,.OP +A.OP +SQUOZE 4,.FORMAT +A.FORMAT +SQUOZE 4,.STOP +(400000)A.STOP +SQUOZE 4,.ISTOP +A.STOP +SQUOZE 4,.RPCNT +A.RPCN +SQUOZE 4,. +GTVLP +SQUOZE 4,.LOP +A.LOP +SQUOZE 44,$. +0 +SQUOZE 44,$R. +0 +SQUOZE 44,.LVAL1 +0 +SQUOZE 44,.LVAL2 +0 +SQUOZE 4,.LNKOT +A.LNKOT +SQUOZE 4,.NSTGW +(1)STGWS +SQUOZE 4,.YSTGW +STGWS +SQUOZE 4,.GSSET +A.GSSET +SQUOZE 4,.TYPE +A.TYPE +SQUOZE 4,.LIBRQ +A.LIBRQ +SQUOZE 4,.GLOBAL +A.GLOB +SQUOZE 4,.GO +A.GO +SQUOZE 4,.TAG +A.TAG +SQUOZE 4,.ASCII +A.ASCII +SQUOZE 4,ASCIZ +AASCIZ + +SQUOZE 4,.BYTC +A.BYTC +SQUOZE 4,.BYTE +A.BYTE +SQUOZE 4,.WALGN +A.WALGN +SQUOZE 4,.IRPCNT +A.IRPC + +IFN TS,[ +SQUOZE 4,.FNAM1 +AFN1 +SQUOZE 4,.FNAM2 +AFN2 +SQUOZE 4,.AFNM1 +AFNM1 +SQUOZE 4,.AFNM2 +AFNM2 +SQUOZE 4,.INSRT +A.INSRT +SQUOZE 4,.IFNM1 +AIFN1 +SQUOZE 4,.IFNM2 +AIFN2 +] +SQUOZE 4,.F +A.F +SQUOZE 4,.I +A.I +IFN TSSYMS,[ +SQUOZE 10,.UAI +0 +SQUOZE 10,.UAO +1 +SQUOZE 10,.UII +4 +SQUOZE 10,.UIO +5 +SQUOZE 10,.BAI +2 +SQUOZE 10,.BAO +3 +SQUOZE 10,.BII +6 +SQUOZE 10,.BIO +7 +] + +TSSYMB": +EISYMT": PRINTA \.-MACTAB-1, WORDS INITIALIZATION CODING. + +LOC MACTAB+MACL + +LSTLOC: -1 ;MAKE SURE CORE THERE + +IFN TS,END BEG ;MUST BE BEFORE RELOCATABLE END STATEMENT, + ;SINCE TS MIDAS NOW TRIES TO DO MULTIPLE 1PASS ASSEMBLIES FROM SAME FILE. + ;PUTTING RELOCABLE END STATEMENT FIRST CAUSES IT TO ENCOUNTER OTHER + ;END STATEMENT IN NEW ASSEMBLY CAUSING CONFUSION + +END 100