TITLE MICRO CODE ASSEMBLER ; TOM EGGERS/JSL 30 APRIL, 75 ; modified for ITS OCTOBER 1975. ;4/21/79 Moon .SEQADR ;June 1984 Moon KS10 support: ; New format field descriptions ; Macros with arguments ; .BIN, .NOBIN, .WIDTH, .PAGELENGTH ; New multipass PC assignment ; .RAMFILE pseudo-op writes RAM file for KS10 ;-------------------------------------------------- ;Remaining to be done: ; Test whether .SEQADR still works ; Test whether KL10 microcode still assembles ;-------------------------------------------------- ;CUSTVR==0 ;CUSTOMER VERSION ;DECVER==20 ;MAJOR VERSION ;DECMVR==0 ;MINOR VERSION ;DECEVR==156 ;EDIT NUMBER ;LOC <.JBVER==:137> ; BYTE (3) CUSTVR (9) DECVER (6) DECMVR (18) DECEVR DEFINE SUBTTL A/ TERMIN ;AC DEFINITIONS F==0 ;FLAG REGISTER T1=1 ;GLOBAL TEMP T2=T1+1 ;DITTO T3=T2+1 T4=T3+1 RAM=7 ;CONTAINS RAM NUMBER CURRENTLY BEING ASSEMBLED UCODE==0 DISP==1 ;BITS WITHIN AC RAM FPNT=10 ;POINTS TO CURRENT FIELD NAME IN SYM TABLE SPNT=11 ;POINTS TO CURRENT SYMBOL NAME IN SYM TABLE C=12 ;HOLDS LAST CHARACTER READ FOR INPUT C1=C+1 N=14 ;GLOBAL AC FOR PASSING ARGS N1=N+1 ;DITTO PM=16 ;STACK FOR MACROS AND RESCANS P=17 ;PUSH DOWN POINTER ;IN AC F (RIGHT HALF) REREAD==1 ;REREAD LAST INPUT CHARACTER SUPP==2 ;SUPPRESS ASSEMBLY BINF==200 ;BINARY WORD HAS BEEN STARTED PASS2==400 ;0 FOR PASS1, 1 FOR PASS2 ERROR==1000 ;ERROR FOUND ON LINE NOHDR==2000 ;SUPPRESS PRINTING TOP-OF-PAGE HEADERS NOBINF==4000 ;.NOBIN FLAG BLKF==10000 ;ASSIGNING LOCATION BLOCKS LOOSF==20000 ;ASSIGNING UNCONSTRAINED LOCATIONS LOCF==40000 ;PC KNOWN FLAG DEFINE SWSET VAR,VAL IFNDEF VAR,VAR==VAL IF2,[ IFN VAR,[ PRINTX \SWITCH VAR IS ON \] IFE VAR,[ PRINTX \SWITCH VAR IS OFF \]] TERMIN SWSET FTCOIN,0 ;1 TO CREF ALL LINES OF ONE WORD TOGETHER SWSET FTMAP,1 ;1 TO PRINT MAP OF LINE #'S BY LOCATION SWSET FTECHR,0 ;1 TO PRINT LAST CHAR ON ERROR SWSET FTIF,1 ;1 TO ENABLE CONDITIONAL ASSEMBLY LOGIC ;DEFINE IO CHANNELS OUTCHN==0 INCHN==1 TYIC==2 TYOC==3 ERRC==4 DEFINE MSG [A,B] 1000,,[[ASCIZ @B@],,A] TERMIN OUTSTR=2000,,0 HALT=3000,,0 ;THESE CRETINOUS BAG CHOMPERS STORE DATA IN THE RH OF HALT EXIT=.BREAK 16,040000 DEFINE PINDEX SIZ,ADR REPEAT 36./, POINT SIZ,ADR,<.RPCNT+1>*-1 TERMIN DEFINE POINT (SIZ,ADR,POS=-1 <<43'-<.RADIX 10.,>>_36'+<.RADIX 10.,>_30'+ADR>TERMIN DEFINE IOWD (A,B) -,,-1 TERMIN ;STRUCTURE DEFINITIONS MICMXB==144. ;MAX NUMBER OF BITS IN A MICRO WORD MICMXW==MICMXB/36. ;MAX NUMBER OF WORDS FOR A MICRO WORD NCHARS==20. ;MAX NUM OF CHARS IN A SYMBOL NWORDS==/5 ;MAX NUMBER OF WORDS TO HOLD A SYMBOL NARGWD==16. ;UP TO 80 CHARACTERS OF MACRO ARGUMENTS MAXPC==2047. ;MAXIMUM AMOUNT OF MICRO CODE-1 MAXDSP==512. ;MAX SIZE OF DISPATCH LLOCTB==MAXPC*3 ;NUMBER OF LOCTAB ENTRIES ;STRUCTURE OF A SYMBOL TABLE ENTRY OFFSET -. SYMLNK::BLOCK 1 ;LEFT HALF CHAINS SYMBOLS WITHIN A FIELD TOGETHER ;RIGHT HALF CHAINS FIELDS TOGETHER ;POINTER TO 1ST FIELD IS IN FLDPNT SYMMAC==SYMLNK ;FOR MACRO SYMBOLS, RIGHT HALF ;POINTS TO 1ST CHAR OF MACRO EXPANSION SYMPSO==SYMLNK ;FOR PSEUDO OPS, RH IS HANDLER ADDR SYMEQL==SYMLNK ;RH LINKS EQUAL TAGS IN J FIELD SYMTXT::BLOCK NWORDS ;1ST WORD WITH ASCIZ TEXT FOR NAME SYMVAL::BLOCK 1 ;CONTAINS VALUES FOR A SYMBOL SYMCRF::BLOCK 1 ;LEFT IS POINTER TO LAST ITEM IN CREF LIST ;RIGHT IS POINTER TO 1ST ITEM SYMLST==.-1 ;LAST LOCATION IN BLOCK SYMLEN==.-SYMLNK ;# OF WORDS IN A SYMBOL BLOCK OFFSET 0 ;FLAGS IN SYMBOL FLAG FIELD MULF==1 ;TWO-SEGMENT FROBBERY HGHSEG==700000 ;HIGH SEG STARTS HERE %%HIGH==HGHSEG %%LOW==100 %%PURE==0 DEFINE PURE IFN %%PURE,.ERR TWO `PURE'S IN A ROW .ELSE %%LOW==. %%PURE==1 LOC %%HIGH TERMIN DEFINE IMPURE IFE %%PURE,.ERR TWO `IMPURE'S IN A ROW .ELSE %%HIGH==. %%PURE==0 LOC %%LOW TERMIN SUBTTL INITIALIZATION PURE MICRO: .OPEN TYIC,[.UAI,,'TTY] .LOSE %LSFIL .OPEN TYOC,[%TJDIS+.UAO,,'TTY] .LOSE %LSFIL .SUSET [.RRUNT,,N] ;GET STARTING RUNTIME MOVE T1,[-NZERPG,,/2000] .CALL [ SETZ 'CORBLK MOVEI %CBRED+%CBNDR+%CBWRT+%CBNDW MOVEI %JSELF MOVE T1 SETZI %JSNEW ] .LOSE %LSSYS SETZM GOBLT MOVE T1,[GOBLT,,GOBLT+1] BLT T1,ENDBLT-1 ;ZERO STORAGE AREA MOVEM N,STTIME ;SAVE STARTING TIME .CALL [ SETZ ? 'CNSGET ? MOVEI TYOC ? REPEAT 4,[MOVEM T1 ? ] SETZM T1 ] MOVEI T1,0 SETZM DISTTY TLNE T1,%TOERS SETOM DISTTY MOVEI 17,1 MOVEI 0,0 BLT 17,17 ;ZERO THE AC'S MOVE P,[IOWD PDLEND-PDL-1,PDL] MOVE PM,[IOWD PMEND-PMDL-1,PMDL] .SUSET [.SMASK,,[%PIPDL]] ;DIE IF PDL OVERFLOW .SUSET [.SDF1,,[%PIPDL]] MOVE T1,[PUSHJ P,UUOH] MOVEM T1,41 PUSHJ P,FNR. ;READ COMMAND LINE ;SETUP IO SKIPN O.DEV MSG [EXIT], NO OUTPUT FILE SPECIFIED .CALL [ SETZ SIXBIT/OPEN/ [.BAO,,OUTCHN] O.DEV O.NAM O.EXT SETZ O.PPN ] PUSHJ P,OFOPER ;CAN'T OPEN MOVE T1,[OUTCHN,,RCHST] .RCHST T1, MOVE T1,RCHST+1 MOVEM T1,OUTFIL+F.NAM MOVE T1,RCHST+2 MOVEM T1,OUTFIL+F.EXT MOVE T1,RCHST+3 MOVEM T1,OUTFIL+F.PPN MOVE T1,O.DEV ;RCHST SCREWS DEVICE MOVEM T1,OUTFIL+F.DEV .CALL [ SETZ 'RQDATE SETZM OUTFIL+F.TIM ] .LOSE %LSFIL PUSHJ P,PNTINI ;INIT OUTPUT LISTING HRROI T1,1 ;START AT PAGE 1, NEED A HEADER MOVEM T1,PAGNUM MOVSI T1,-LLOCTB MOVEM T1,LOCAOB BEGPAS: SETZM STATE ;INIT STATE FOR SYNTAX ANALYSIS SETZM PC+UCODE SETZM PC+DISP MOVE T1,LOCAOB MOVEM T1,LOCPNT MOVE T1,MAXPS1 ;INIT MAXPOS TO MAXPOS SEEN ON PREVIOUS PASS MOVEM T1,MAXPOS MOVE T1,MAXPS1+1 MOVEM T1,MAXPOS+1 MOVEI RAM,UCODE ;START WITH UCODE ASSEMBLY MOVEI T1,1 MOVEM T1,LINNUM ;INIT LINE NUMBER TO 1 PUSHJ P,BEGIO ;INIT INPUT IO MSG [EXIT], NO INPUT FILES SETZM USAGE MOVE T1,[USAGE,,USAGE+1] BLT T1,USGEND-1 ;CLEAR USAGE TABLE ANDI F,PASS2 SUBTTL TOP LEVEL ASSEMBLY LOOP STATLP: SKIPE STATE JRST STAT1 TRZ F,BINF\ERROR ;ONLY CLEARED IN STATE 0 SETZM VALUE MOVE T1,[VALUE,,VALUE+1] BLT T1,VALEND-1 MOVE T1,LINNUM HRRZM T1,CRFLIN' ;CREF LINE # CHANGES ONLY ON MICRO WORDS STAT1: PUSHJ P,TOKEN ;SCAN NEXT TOKEN LSH N,.SZTRM ;MOVE TOKEN TYPE OVER LDB T1,STAPNT ;GET TERM CHARACTER TYPE IOR T1,N ;COMBINE STATE, TOKEN TYPE, AND TERM TYPE IOR T1,STATE IDIVI T1,36./<.SZDSP+.SZSTA> LDB T1,STAMTB(T1+1) ;GET DISPATCH AND NEW STATE DPB T1,[POINT .SZSTA,STATE,35.-.SZTOK-.SZTRM] LSH T1,-.SZSTA STAXCT: XCT STDISP(T1) ;DISPATCH TO HANDLE FIELD AND TERM SKIPN STATE PUSHJ P,PNTBIN ;BINARY PRINTED IFF PASS2 & STATE=0 & BINARY ASSEMBLED CAIN C,"; PUSHJ P,SCNEND ;FLUSH A COMMENT CAIE C,12 JRST STATLP ;AND START ALL OVER AGAIN PUSHJ P,PNTLIN ;FINISH END OF LINE SKIPN ENDFIL ;END-OF-FILE? JRST STATLP ;NO TRON F,PASS2 JRST START2 ;GO BEGIN PASS 2 SKIPGE LOCPNT MSG STOP,!! PASS 2 DIDN'T READ ALL OF LOCTAB !! DONE: PUSHJ P,FINLST PUSHJ P,OUTCLS .CLOSE OUTCHN, SKIPE RAMFIL PUSHJ P,WRAMFL EXIT ;MICRO ASSEMBLY COMPLETELY DONE SCND1: PUSHJ P,GETCHR SCNEND: CAIE C,12 ;SEARCH FOR END OF LINE JRST SCND1 POPJ P, SUBTTL STATE TABLE DISPATCH STDISP: PUSHJ P,ILLFOR ;FOR ANY UNDEFINED FORMAT DLBLK: PUSHJ P,LOCBLK DTAG: PUSHJ P,TAG DLSET: PUSHJ P,LOCSET ;"NUMBER:" DCFLD: PUSHJ P,CFSPC ;COND ASSY OR FIELD DFLD: PUSHJ P,FLDSPC ;FIELD/ DMDEF: PUSHJ P,DEFMAC DSUDO: PUSHJ P,PSEUDO DMAC: PUSHJ P,BEGMAC DNOP: JFCL DDEFF: PUSHJ P,DEFFLD DDEFS: PUSHJ P,DEFSYM DFSYM: PUSHJ P,FLDSYM DFNUM: PUSHJ P,FLDNUM DCMNT: PUSHJ P,SCNEND ILLFOR: MSG SCNEND, ILLEGAL FORMAT SUBTTL START PASS 2 ;HERE TO START PASS 2 BY LISTING TABLE OF CONTENTS, IF ANY START2: SKIPE N,TTLPNT ;IS THERE A TITLE? OUTSTR (N) ;YES, SEND TO TTY OUTSTR [ASCIZ / /] SKIPN TOCPNT ;ANYTHING FOR TABLE OF CONTENTS? JRST TOCEND ;NO MOVEI C,[ASCIZ /TABLE OF CONTENTS/] PUSHJ P,SETHDR ;SETUP SPECIAL HEADER HLRZ N,TOCPNT ;BEGIN SCAN OF TOC LIST TOCLUP: PUSH P,N ;SAVE ADDR OF THIS ENTRY PUSHJ P,PRINT ASCIZ /; / ;OUTPUT AS COMMENT MOVE N,0(P) ;PICK UP ENTRY ADDR HRRZ C,0(N) ;LINE NUMBER OF DEFINITION PUSHJ P,PNTDEC ;IN DECIMAL PUSHJ P,TAB MOVE N,0(P) ;ENTRY ADDR AGAIN MOVEI N,1(N) ;POINT TO TEXT PUSHJ P,PRINT0 ;PRINT IT PUSHJ P,NEWLIN POP P,N ;PICK UP LINK HLRZ N,0(N) ;GET ADDR OF NEXT ENTRY JUMPN N,TOCLUP ;PRINT IT IF IT EXISTS PUSHJ P,PRINT ASCIZ \; CROSS REFERENCE INDEX ; DCODE LOCATION / LINE # INDEX ; UCODE LOCATION / LINE # INDEX \ SETZM HDRPNT ;TURN OFF SPECIAL HEADERS TOCEND: PUSHJ P,FORM ;THROW A PAGE ;SET SIZE OF LOCTAB MOVN T1,LOCPNT ;NUMBER OF WORDS USED, NEGATIVE HRLZM T1,LOCAOB ;SET UP AOBJN POINTER TO THEM JUMPE T1,BEGPAS ;NO INSTRUCTIONS GENERATED MOVEI RAM,UCODE TRZ F,BLKF+LOOSF ;ASSIGN INSTRUCTIONS WITH ABSOLUTE LOCATIONS PUSHJ P,ASGPCS TRO F,BLKF ;ASSIGN INSTRUCTIONS IN LOCATION BLOCKS PUSHJ P,ASGPCS TRC F,BLKF+LOOSF ;ASSIGN UNCONSTRAINED INSTRUCTIONS PUSHJ P,ASGPCS ;DROPS THROUGH ;DROPS IN ;FINALLY, FILL IN UTABL MOVEI C,40 MOVE N,LOCAOB FUTAB1: LDB T1,[%%LCOP,,LOCTAB(N)] XCT FUTAB2(T1) AOBJN N,FUTAB1 JRST BEGPAS FUTAB2: PUSHJ P,FUTAB7 ;%LCTAG MOVEI C,": ;%LCABS PUSHJ P,FUTAB3 ;%LCUCD PUSHJ P,FUTAB4 ;%LCEQL JFCL ;%LCERR MSG STOP,BAD VALUE IN LOCTAB ;5 MSG STOP,BAD VALUE IN LOCTAB ;6 MSG STOP,BAD VALUE IN LOCTAB ;7 FUTAB3: MOVSI T1,%LCLOC TDNN T1,LOCTAB(N) MSG STOP, !! INSTRUCTION FAILED TO GET LOCATED !! LDB T1,[%%LCPC,,LOCTAB(N)] MOVE T2,LOCTAB(N) ;LINE NUMBER HRL T2,C ;CHARACTER MOVEM T2,UTABL(T1) CAIN C,"= JRST FUTAB6 FUTB3A: MOVEI C,40 POPJ P, FUTAB4: LDB T1,[%%LCPT,,LOCTAB(N)] LDB T2,[%%LCAS,,LOCTAB(N)] LDB T3,[%%LCNB,,LOCTAB(N)] JUMPE T3,FUTB3A ;PC UNRESTRICTED MOVEI T4,1 LSH T4,(T3) CAIN C,"= CAMLE T4,FRECNT JRST FUTAB5 MOVE T3,FRECNT SUB T3,LOCCNT ;CURRENT RELATIVE PC ANDCM T3,T2 ;MASK OUT DON'T CARE BITS ANDI T3,-1(T4) ;MASK OUT BITS OFF LEFT END OF PATTERN SUB T3,T1 ;NEGATIVE AMOUNT PC HAS TO ADVANCE ADDM T3,LOCCNT ;ADVANCE IT POPJ P, FUTAB5: MOVEM T1,LOCPAT MOVEM T2,LOCAST MOVEM T4,FRECNT SUB T4,T1 MOVEM T4,LOCCNT MOVEI C,"= POPJ P, FUTAB6: MOVE T2,T1 ;SAVE CURRENT PC IOR T1,LOCAST ;PROPAGATE CARRIES THROUGH * BITS ADDI T1,1 ;NEXT PC IN BLOCK SUB T2,T1 ADDB T2,LOCCNT ;NUMBER OF LOCS REMAINING IN BLOCK SKIPG T2 MOVEI C,40 ;SWITCH BACK TO UNCONSTRAINED POPJ P, FUTAB7: MOVSI T1,%LCLOC TDNN T1,LOCTAB(N) MSG STOP, !! TAG FAILED TO GET LOCATED !! POPJ P, ;ITERATE THROUGH LOCTAB ASSIGNING LOCATIONS TO MICROCODE, TAGS ASGPCS: TRZ F,LOCF ;PC NOT KNOWN YET SETZM LOCCNT MOVE C,LOCAOB ;C AOBJN POINTER TO LOCTAB MOVSI C1,-MAXPC/36.-1 ;C1 AOBJN POINTER TO USAGE TABLE ASGPC1: MOVE SPNT,LOCTAB(C) LDB T1,[%%LCOP,,SPNT] XCT ASGPCT(T1) AOBJN C,ASGPC1 POPJ P, ASGPCT: PUSHJ P,ASGPC3 ;%LCTAG PUSHJ P,ASGPC2 ;%LCABS PUSHJ P,ASGPC4 ;%LCUCD PUSHJ P,ASGPC6 ;%LCEQL JFCL ;%LCERR MSG STOP,BAD VALUE IN LOCTAB ;5 MSG STOP,BAD VALUE IN LOCTAB ;6 MSG STOP,BAD VALUE IN LOCTAB ;7 ASGPC2: HRRZ N,SPNT ;SET PC TO ABS LOCATION TRO F,LOCF SETZM LOCCNT ;NOT IN A BLOCK, THOUGH POPJ P, ASGPC3: PUSHJ P,ASGPC ;GET PC FOR TAG IN N POPJ P, DPB N,DEFVAL ;LOCATE TAG ASGPC9: DPB N,[%%LCPC,,SPNT] ;AND REMEMBER LOCATION IN LOCTAB TLO SPNT,%LCLOC MOVEM SPNT,LOCTAB(C) POPJ P, ASGPC4: PUSHJ P,ASGPC ;GET PC FOR INSTRUCTION IN N JRST ASGP4A ;DON'T ALLOCATE THIS INST THIS TIME PUSHJ P,ASGPC9 ;SAVE THIS PC MOVE T1,N ;FIND BIT IN USAGE TABLE IDIVI T1,36. MOVNS T2 ;NEGATE REMAINDER FOR RIGHT SHIFTS MOVSI T3,(SETZ) LSH T3,(T2) ;NEXT TWO LINES ARE A TEMPORARY DEBUG CHECK TDNE T3,USAGE(T1) .VALUE [ASCIZ/: MICRO WORD USED TWICE AT ASGPC4 /] IORM T3,USAGE(T1) ;INCREMENT PC FOR NEXT INSTRUCTION ASGP4A: SKIPG T4,LOCCNT ;IN LOCATION BLOCK? JRST ASGPC5 ;NO, FORGET PC ADD T4,N ;END OF BLOCK MOVE T2,N ;FIND BITS IN PC THAT AND T2,LOCAST ; SHOULD NOT CHANGE IOR N,LOCAST ;INSERT BITS TO PROPOGATE CARRIES ADDI N,1 ;NEXT PATTERN VALUE IOR N,LOCPAT ;RE-INSERT BITS THAT MUST BE 1'S ANDCM N,LOCAST ;MAKE ROOM FOR PC BITS THAT MUST NOT IOR N,T2 ; CHANGE, AND INSERT THEM SUB T4,N ;SPACE REMAINING IN BLOCK MOVEM T4,LOCCNT SKIPG T4 ;BLOCK EXHAUSTED? ASGPC5: TRZ F,LOCF ;PC NOT KNOWN ANYMORE POPJ P, ASGPC6: LDB T1,[%%LCPT,,SPNT] ;LOCATION BLOCK SPECIFIED LDB T2,[%%LCAS,,SPNT] LDB T3,[%%LCNB,,SPNT] JUMPE T3,ASGP6A ;PC UNRESTRICTED MOVEI T4,1 LSH T4,(T3) ;SIZE OF THIS BLOCK SKIPLE LOCCNT ;IF CURRENTLY IN A BLOCK CAMLE T4,FRECNT ;AND IT'S BIGGER JRST ASGPC7 ;THEN DON'T MAKE A NEW BLOCK MOVE T3,FRECNT SUB T3,LOCCNT ;CURRENT RELATIVE PC ANDCM T3,T2 ;MASK OUT DON'T CARE BITS ANDI T3,-1(T4) ;MASK OUT BITS OFF LEFT END OF PATTERN SUB T3,T1 ;NEGATIVE AMOUNT PC HAS TO ADVANCE ADDM T3,LOCCNT ;ADVANCE IT SUB N,T3 POPJ P, ASGP6A: SETZM LOCCNT ;PC BECOMES UNRESTRICTED JRST ASGPC5 ASGPC7: MOVEM T1,LOCPAT ;FIND A NEW BLOCK WITH THESE PARAMETERS MOVEM T2,LOCAST MOVEM T4,FRECNT SUB T4,T1 MOVEM T4,LOCCNT TRNN F,BLKF JRST ASGPC5 ;DON'T DO BLOCKS THIS TIME PUSHJ P,FREWRD JRST ASGPC8 ;CAN'T ALLOCATE HRRZS N ;DON'T WANT COUNT IN LH TRO F,LOCF POPJ P, ;--- DOES THIS ACTUALLY WORK, OR DOES IT BARF AND DIE ;--- BEFORE THE USER SEES THE ERROR MESSAGE? ASGPC8: MOVE T1,[%LCERR_15.,,[ASCIZ/NO SUCH REQUIRED MICRO WORD ADDRESS PATTERN/]] MOVEM T1,LOCTAB(C) ;SAVE ERROR MESSAGE FOR PASS 2 JRST ASGPC5 ;GET PC FOR TAG OR INSTRUCTION INTO N ;SKIP IF SUPPOSED TO DO THIS GUY THIS TIME ASGPC: TLNE SPNT,%LCLOC ;TAG/INST ALREADY LOCATED? POPJ P, ;YES, SKIP WHOLE THING TRNE F,LOCF ;CURRENT PC KNOWN? JRST CPOPJ1 ;YES, OKAY TRNN F,LOOSF ;SUPPOSED TO ASSIGN? POPJ P, ;NO, SKIP WHOLE THING THIS TIME ;YES, SEARCH FOR NEXT FREE WORD ASGFR0: SETCM T1,USAGE(C1) ;GET 1'S FOR FREE PC BITS JFFO T1,ASGFR1 ;IF ANY FREE HERE, XFER AOBJN C1,ASGFR0 ;KEEP LOOKING UNTIL ALL GONE MSG STOP,CRAM FULL--CANNOT ASSIGN UNCONSTRAINED PCS ASGFR1: HRRZ N,C1 ;N GETS PC FOR THIS BIT IMULI N,36. ADD N,T2 TRO F,LOCF ;PC IS KNOWN NOW SETZM LOCCNT ;NOT IN A BLOCK, THOUGH JRST CPOPJ1 SUBTTL PROCESS "FIELD/" AND CONDITIONALS ;FIELD/ SCANNED. COULD BE CONDITIONAL ASSEMBLY CFSPC: IFN FTIF,[ MOVEI FPNT,PSUDF% ;PSEUDO FIELD TABLE PUSHJ P,SRCSY1 ;IS IT A DEFINED PSEUDO-FIELD? JRST CFSPC1 ;NO, TRY FOR NORMAL FIELD MOVE T1,SYMPSO(SPNT) ;YES, GET HANDLER ADDR JRST 0(T1) ;GO TO IT $DEFLT: MOVEI T1,1 ;SET SWITCH IF NOT DEFINED JRST SWT $SET: TDZA T1,T1 ;ERROR IF SWITCH PREVIOUSLY DEFINED $CHNG: SETO T1, ;ERROR IF SWITCH NOT DEFINED SWT: MOVEM T1,SWTFLG' TRNE F,SUPP ;ALREADY SUPPRESSED? JRST SCNEND ;YES, IGNORE THIS PUSH P,RAM ;SWITCHES ARE NOT RAM-SPECIFIC MOVEI RAM,0 SKIPE FPNT,SWTPNT ;IS THE SWITCH% FIELD DEFINED? JRST SWT1 ;YES, AVOID SEARCH MOVE T1,[SWTCH,,FIELD] BLT T1,FIELD+NWORDS-1 PUSHJ P,MAKFLD ;CREATE INTIAL SWITCH FIELD MSG STOP, !!CAN'T DEFINE "SWITCH%"!! MOVEM FPNT,SWTPNT SWT1: MOVE T1,[NAME,,FIELD] BLT T1,FIELD+NWORDS-1 PUSHJ P,TOKEN ;GO GET SWITCH NAME CAIE N,.TKS ;IT MUST BE SYMBOLIC MSG SWT99, NO SYMBOL IN CONDITIONAL ASSEMBLY DEFINITION PUSHJ P,SRCSYM ;GO LOOK FOR SYMBOL JRST SWT2 ;NOT FOUND SKIPLE SWTFLG ;FOUND. IS THIS A DEFAULT? JRST SWT99 ;YES -- DEFAULT HAS BEEN PREVIOUSLY SET TRNN F,PASS2 ;IS IT PASS1? SKIPE SWTFLG ; AND A SET? JRST SWT3 ;NO, GO CHANGE VALUE MSG SWT3, SWITCH SET TWICE SWT2: SKIPGE SWTFLG ;IS THIS A CHANGE? MSG .+1, SWITCH CHANGED WITHOUT SET OR DEFAULT PUSHJ P,MAKS1 ;FILL IN SYMBOL ENTRY JRST SWT99 ;CAN'T CREATE IT SWT3: CAIE C,"= ;DID SWITCH NAME TERMINATE WITH EQUAL? MSG SWT99, FORMAT ERROR ON SWITCH SPECIFICATION PUSHJ P,TOKEN ;GO GET SWITCH VALUE CAIE N,.TKN MSG SWT99, SWITCH VALUE MUST BE NUMERIC MOVE N,NUMBER ;GET SWITCH VALUE DPB N,DEFVAL ;PUT INTO VALUE OF SYMBOL SWT99: POP P,RAM ;RESTORE CURRENT RAM SWT100: SETZM STATE SETZM FIELD JRST SCNEND ;IGNORE REST OF LINE ;HERE FOR CONDITIONAL ASSEMBLY TEST PSEUDO-OPS $ENDIF: MOVEI T1,1 JRST AIF1 $IF: TDZA T1,T1 $IFNOT: MOVNI T1,1 AIF1: MOVEM T1,SWTFLG ;FLAG TO INVERT ASSEMBLY SENSE PUSHJ P,TOKEN CAIE N,.TKS ;SWITCH MUST BE SYMBOLIC MSG SCNEND, SWITCH MUST BE SYMBOLIC SKIPE FPNT,SWTPNT PUSHJ P,SRCSYM ;GO LOOK FOR SWITCH SYMBOL MSG SCNEND, SWITCH NOT DEFINED TRNN F,SUPP ;CURRENTLY SUPPRESSED? JRST IF3 ;NO CAME SPNT,SUPSYM ;IS THIS THE SYMBOL WHICH SUPPRESSED? JRST SCNEND ;NO, IGNORE IF3: MOVEM SPNT,SUPSYM ;SAVE SUPPRESSION SYMBOL LDB T1,DEFVAL ;GET SWITCH VALUE SKIPG SWTFLG ;VALUE IRRELEVANT ON ENDIF SKIPE T1 ;SWITCH SET? TRZA F,SUPP TRO F,SUPP ;SUPPRESS ASSY SKIPGE SWTFLG ;INVERT SENSE? TRC F,SUPP MOVEI T1,0 TRNE F,SUPP ;NOW...ARE WE SUPPRESSED? MOVEI T1,4_<.SZTOK+.SZTRM> MOVEM T1,STATE ;STATE 0 IF ASSEMBLING, 4 IF SUPPRESSED JRST SCNEND CFSPC1: TRNE F,SUPP ;IN SUPPRESSED ASSEMBLY? JRST SCNEND ;YES, AND NOT END OF COND. COMMENT ];END IFN FTIF FLDSPC: MOVE T1,[NAME,,FIELD] BLT T1,FIELD+NWORDS-1 ;MOVE NAME TO FIELD POPJ P, $WIDTH: PUSHJ P,TOKN10 ;GET WIDTH OF MICROWORD CAIE N,.TKN ;MUST BE NUMERIC AND DECIMAL MSG SWT100,.WIDTH IS SUPPOSED TO BE FOLLOWED BY A DECIMAL NUMBER SOS N,NUMBER ;HIGHEST BIT NUMBER TO PRINT MOVEM N,MAXPOS(RAM) JRST SWT100 $PAGEL: PUSHJ P,TOKN10 ;GET LISTING LINES PER PAGE CAIE N,.TKN ;MUST BE NUMERIC AND DECIMAL MSG SWT100,.PAGELENGTH IS SUPPOSED TO BE FOLLOWED BY A DECIMAL NUMBER MOVE N,NUMBER MOVEM N,LPPAG JRST SWT100 ;FIELD/NUMBER SCANNED, INSERT VALUE INTO MICRO WORD FLDNUM: PUSHJ P,STRTWD TRNN F,PASS2 JRST ZFPOPJ PUSHJ P,SRCFLD JRST FLDS1 LDB T2,DEFSIZ ;GET SIZE OF FIELD SETOM T1 ;1S INTO T1 LSH T1,(T2) ;0S ON RIGHT EQUAL TO BYTE LENGTH MOVE N,NUMBER MOVM T2,N ;SAVE POS VAL OF NUMBER TDZ N,T1 ;MASK NUMBER TO CORRECT SIZE TDNE T2,T1 ;WILL NUMBER FIT IN FIELD? MSG FLDN2, NUMBER TOO BIG FOR FIELD PUSHJ P,BITS1 ;NUMBER ALWAYS GOES INTO FIELD FLDN2: PUSHJ P,MAKCRF ;PUT FIELD INTO CREF LISTING JRST ZFPOPJ ;FIELD/SYMBOL SCANNED, INSERT VALUE INTO MICRO WORD FLDSYM: PUSHJ P,STRTWD TRNN F,PASS2 JRST ZFPOPJ PUSHJ P,SRCFLD FLDS1: MSG ZFPOPJ, FIELD NOT DEFINED PUSHJ P,SRCSYM TRCA RAM,DISP\UCODE ;NOT FOUND, LOOK IN OTHER TABLE JRST FLDS3 ;FOUND PUSH P,FPNT ;SAVE FIELD POINTER PUSHJ P,SRCFLD ;FIND OTHER FIELD, IF ANY JRST FLDLUZ ;NONE PUSHJ P,SRCSYM JRST FLDLUZ ;NO SYMBOL IN OTHER FIELD EITHER POP P,FPNT ;GET CORRECT FIELD BACK TRC RAM,DISP\UCODE ;PUT MODE BACK FLDS3: LDB T1,DEFTM1 ;GET 1ST TIME ADDM T1,TIME1 ;ACCUMULATE SUM LDB T1,DEFTM2 ;SAME FOR 2ND TIME ADDM T1,TIME2 LDB T1,DEFFNC MOVE T1,DEFTAB(T1) PUSHJ P,(T1) ;DISPATCH ON FUNCTION ZFPOPJ: SETZM FIELD ;NO CARRY OVER OF FIELD NAMES POPJ P, FLDLUZ: POP P,FPNT ;ADJUST STACK TRC RAM,DISP\UCODE ;PUT MODE BACK MSG ZFPOPJ, SYMBOL NOT DEFINED STRTWD: TROE F,BINF ;START BUILDING BINARY WORD? POPJ P, ;ALREADY STARTED TRNE F,NOBINF ;YES MSG .+1,BINARY WORD GENERATED WHILE IN .NOBIN MODE JUMPN RAM,CPOPJ MOVE N,LINNUM ;PUT INSTRUCTION INTO LOCTAB MOVEI T1,%LCUCD PUSHJ P,ADDLOC TRNE F,PASS2 MOVEM N,PC(RAM) POPJ P, SUBTTL .RAMFILE PSEUDO-OP $RAMFL: SKIPE RAM MSG STOP,[.RAMFILE ONLY WORKS FOR UCODE, FOR NOW] ;PARSE FIELDS SETZM BITNO' ;NO BITS SEEN YET RAMFL1: PUSHJ P,TOKN10 ;PARSE FIELD NAME, 0, OR NBITS/0 CAIN N,.TKN JRST RAMFL2 ;NUMBER IS PADDING CAIE N,.TKS ;SYMBOL IS FIELD NAME JRST RAMFL7 ;SKIP COMMENT CAIN C,"< JRST RAMFP1 ;PARITY SPEC TRNN F,PASS2 JRST RAMFL8 ;IGNORE ON PASS 1 PUSHJ P,FLDSPC PUSHJ P,SRCFLD MSG RAMFL8,FIELD NOT DEFINED LDB T1,DEFPOS IDIVI T1,36. ADDI T1,VALUE LDB T4,DEFSIZ CAIG T4,1(T2) ;SKIP IF CROSSES WORD BOUNDARY JRST RAMFL5 SUBI T1,1 ;HANDLE FIRST WORD FIRST SUBI T4,1(T2) ;NUMBER OF BITS IN FIRST WORD DPB T4,[300600,,T1] PUSHJ P,RAMFL4 LDB T1,DEFPOS ;NOW HANDLE SECOND WORD IDIVI T1,36. ADDI T1,VALUE MOVEI T4,1(T2) ;NUMBER OF BITS IN SECOND WORD RAMFL5: MOVEI T3,35. SUB T3,T2 DPB T3,[360600,,T1] ;BYTE POSITION DPB T4,[300600,,T1] PUSHJ P,RAMFL4 JRST RAMFL8 RAMFL2: MOVEI N,1 CAIE C,"/ ;MULTIPLE BIT FIELD? JRST RAMFL3 PUSH P,NUMBER PUSHJ P,TOKEN CAIE N,.TKN JRST ILLFOR POP P,N ;NUMBER OF BITS OF PADDING RAMFL3: SKIPE NUMBER MSG .+1, YOU CAN ONLY PAD WITH ZERO MOVEI T1,[0] DPB N,[300600,,T1] ;SET BYTE SIZE TRNE F,PASS2 ;IGNORE ON PASS 1 PUSHJ P,RAMFL4 ;SAVE THAT FIELD RAMFL8: CAIN C,", JRST RAMFL1 ;JUMP IF MORE FIELDS CAIE C,"; ;MAKE SURE TERMINATION IS LEGAL CAIN C,12 JRST RAMFL9 MSG RAMFL9,ILLEGAL CHARACTER IN .RAMFILE RAMFL9: TRNN F,PASS2 JRST SWT100 MOVE N,BITNO IDIVI N,36. SKIPE N1 MSG .+1,BITS PER LOCATION IN RAM FILE MUST BE A MULTIPLE OF 36 MOVEM N,RFLNWD IMULI N,MAXPC+1 ;NUMBER OF WORDS IN RAMFILE BUFFER PUSHJ P,GETWRD ;ALLOCATE STORAGE MOVEM N,RAMFIL MOVN T1,RFLDPT ;NUMBER OF FIELDS HRLZM T1,RFLDPT ;CONVERT TO AOBJN POINTER JRST SWT100 ;SAVE FIELD IN T1 RAMFL4: MOVE T3,BITNO IDIVI T3,36. MOVEI T3,36. SUB T3,T4 ;NUMBER OF BITS LEFT IN WORD LDB N,[300600,,T1] ;BYTE SIZE OF SOURCE CAMLE N,T3 ;SKIP IF NOT ENOUGH BITS MSG .+1,DESTINATION BYTE CROSSES WORD BOUNDARY--WON'T WORK AOS T2,RFLDPT ;FIELD NUMBER+1 MOVEM T1,RFLDS-1(T2) ;SAVE SOURCE BYTE POINTER MOVSI T1,C ;COMPUTE DESTINATION BITS DPB N,[300600,,T1] ADDB N,BITNO SUBI N,1 ;ENDING BIT POSITION IDIVI N,36. HRR T1,N ;WORD OFFSET MOVEI T3,35. SUB T3,N1 DPB T3,[360600,,T1] ;BIT POSITION MOVEM T1,RFLDD-1(T2) POPJ P, ;PARSE RAMFILE PARITY SPECIFICATION RAMFP1: MOVE T1,NAME MOVE T2,NAME+1 CAMN T1,[ASCII/ODD P/] CAME T2,[ASCII/ARITY/] JRST RAMFP3 PUSH P,[0] RAMFP2: PUSHJ P,TOKN10 ;FIRST BIT CAIN N,.TKN CAIE C,": MSG .+1,ILLEGAL FORMAT IN FIRST BIT OF PARITY COMPUTATION PUSH P,NUMBER PUSHJ P,TOKN10 ;LAST BIT CAIE N,.TKN MSG .+1,ILLEGAL FORMAT IN LAST BIT OF PARITY COMPUTATION POP P,T2 AOS T1,NUMBER SUB T1,T2 ;NUMBER OF BITS DPB T2,[POINT 9,T1,26] ;FIRST BIT HRL T1,BITNO ;WHERE TO STORE THE PARITY BIT IOR T1,(P) ;COMPLEMENT FOR EVEN PARITY SETZM (P) ;IN CASE OF MULTIPLE FIELDS MOVEI T2,RFLPAR ;FILL IN NEXT PARITY SPEC SKIPE (T2) AOJA T2,.-1 CAIL T2,RAMFIL MSG STOP,TOO MANY PARITY SPECIFICATIONS TRNE F,PASS2 ;DON'T STORE UNTIL PASS 2 MOVEM T1,(T2) CAIN C,", JRST RAMFP2 ;GO BACK FOR MORE FIELDS SUB P,[1,,1] ;FLUSH EVEN/ODD CAIE C,"> MSG .+1,MISSING RIGHT ANGLE BRACKET AFTER PARITY SPEC AOS BITNO PUSHJ P,GETCHR ;PRESUMED COMMA JRST RAMFL8 RAMFP3: CAMN T1,[ASCII/EVEN /] CAME T2,[ASCII/PARIT/] MSG .+1,UNRECOGNIZED PARITY SPECIFICATION PUSH P,[SETZ] ;COMPLEMENT PARITY BIT JRST RAMFP2 ;WRITE OUT THE RAM FILE WRAMFL: .CALL [ SETZ SIXBIT/OPEN/ [.BIO,,OUTCHN] O.DEV O.NAM [SIXBIT/RAM/] SETZ O.PPN ] PUSHJ P,OFOPER ;CAN'T OPEN MOVN N,RFLNWD IMULI N,MAXPC+1 ;-NUMBER OF WORDS IN RAMFILE BUFFER HRLZ N,N HRR N,RAMFIL .IOT OUTCHN,N .CLOSE OUTCHN, POPJ P, RAMFL7: CAIN C,12 ;CONTINUATION LINE JRST RAMF7B CAIE C,"; ;COMMENT FOLLOWED BY CONTINUATION LINE JRST ILLFOR RAMF7A: PUSHJ P,GETCHR CAIE C,12 JRST RAMF7A RAMF7B: PUSHJ P,GETCHR CAIN C,40 JRST RAMF7B TRO F,REREAD JRST RAMFL1 SUBTTL PSEUDO INSTRUCTIONS (INCL MACROS) PSEUDO: MOVEI FPNT,PSUDO% ;PSEUDO SYMBOL TABLE PUSHJ P,SRCSY1 ;IS IT A DEFINED PSEUDO OP? JRST BEGMAC ;NO, SEE IF IT'S A MACRO MOVE T1,SYMPSO(SPNT) ;YES, GET HANDLER ADDR JRST 0(T1) ;GO TO IT $DCODE: MOVEI RAM,DISP POPJ P, $UCODE: MOVEI RAM,UCODE POPJ P, $SEQAD: SETOM SEQADR POPJ P, $BIN: TRZ F,NOBINF POPJ P, $NOBIN: TRO F,NOBINF POPJ P, ; MACRO CALL SCANNED ;COMMENTED LINES BUMMED OUT FOR SPEED BEGMAC: ;OUGHT TO SUPPRESS ON PASS1, CAN'T DUE TO ;STATE PROCESSING TROUBLES ; MOVE T1,[MACRO,,FIELD] ;LOOK FOR MACRO DEF ; BLT T1,FIELD+NWORDS-1 ; PUSHJ P,SRCFLD ; MSG ZFPOPJ, NO MACROS DEFINED SETZM FIELD SKIPE FPNT,MACPNT(RAM) ;AVOID FIELD SEARCH PUSHJ P,SRCSYM ;LOOK FOR DEFINITION MSG MACLUZ, MACRO NAME NOT DEFINED MOVSI N,(POINT 7,0) HRR N,SYMMAC(SPNT) ;GET POINTER TO MACRO PUSHJ P,SAVE MOVEI C,", ;MACRO MUST NOT INVOKE END-OF-LINE ACTIONS JRST ZFPOPJ MACLUZ: LDB T1,STAPNT ;GET CHAR TYPE CAIN T1,EOL ;END OF LINE? SETZM STATE ;YES, RETURN TO STATE ZERO JRST ZFPOPJ SUBTTL "SYMBOL:" DEFINE ADDRESS TAG TAG: SKIPE FPNT,JPNT(RAM) ;DO WE KNOW WHERE J FIELD IS DEFINED? JRST TAG2 ;YES, DO NOT SEARCH MOVSI T1,(ASCII /J/) MOVEM T1,FIELD SETZM FIELD+1 MOVE T1,[FIELD+1,,FIELD+2] BLT T1,FIELD+NWORDS-1 PUSHJ P,SRCFLD MSG ZFPOPJ, CAN'T FIND J FIELD MOVEM FPNT,JPNT(RAM) ;REMEMBER FOR FUTURE TAG2: PUSHJ P,MAKSYM JFCL HRRZ N,PC(RAM) JUMPN RAM,TAG3 ;DCODE ASSIGNS LOCATIONS RIGHT AWAY MOVE N,SPNT ;PUT TAG IN LOCTAB MOVEI T1,%LCTAG PUSHJ P,ADDLOC TRNN F,PASS2 JRST ZFPOPJ ;PASS 1 - LOCATION NOT KNOWN YET TAG3: PUSHJ P,DEFCHK HALT DEFVAL JRST ZFPOPJ ; NUMBER: SET LOCATION COUNTER LOCSET: SKIPGE N,NUMBER MSG ZFPOPJ, LOCATION NEGATIVE CAMLE N,[MAXPC ? MAXDSP](RAM) MSG ZFPOPJ, LOCATION TOO LARGE HRROM N,PC(RAM) ;STORE AWAY NEW PC VALUE JUMPN RAM,ZFPOPJ SETZM FRECNT ;END ANY LOCATION DEFAULTING SETZM LOCPAT SETZM LOCAST MOVEI T1,%LCABS ;SAVE IN LOCTAB PUSHJ P,ADDLOC JRST ZFPOPJ SUBTTL EQUAL SIGN - SET LOCATION COUNTER FOR LEADING BIT PATTERN LOCBLK: SETZB N,BLDPAT' ;INIT COUNT, INIT PATTERN FOR 1'S SETZM BLDAST' ;INIT PATTERN FOR *'S LOCB1: PUSHJ P,GETCHR CAIN C,40 JRST LOCB1 CAIN C,"0 SOJA N,LOCB1 ;COUNT DIGITS MOVSI T1,(SETZ) ;GET BIT INTO POSITION FOR PATTERNS LSH T1,(N) CAIN C,"1 JRST [ IORM T1,BLDPAT SOJA N,LOCB1 ] CAIN C,"* JRST [ IORM T1,BLDAST SOJA N,LOCB1 ] MOVNS N ;GET POSITIVE POSITION COUNT CAIE C,12 TRO F,REREAD ;ONLY BACK UP IF NOT END-OF-LINE LOCB2: MOVEI T1,1 ;FIND HOW MANY CONSECUTIVE WORDS LSH T1,(N) ;WORDS=2**NUMBER OF BITS MOVE T2,BLDPAT ;GET BIT PATTERN ROT T2,(N) ;MOVE TO LOW ORDER MOVEM T2,BLDPAT MOVE T4,BLDAST ;GET * PATTERN ROT T4,(N) MOVEM T4,BLDAST JUMPN RAM,LOCB3 MOVEM N,BLDNB' ;SAVE NUMBER OF BITS JUMPE N,LOCB6 ;IF NO BITS, PC IS UNRESTRICTED SKIPGE N,PC(RAM) ;GET CURRENT PC CAMLE T1,FRECNT ;IS NEW BLOCK LARGER? JRST LOCB6 ;YES, OR PC NOT RESTRICTED ;MERGE WITH PREVIOUS BLOCK MOVEI T3,-1(T1) ;GET 1S FOR BITS SPECIFIED ANDCM T3,BLDAST ;CLEAR * POSITIONS TDNE T3,LOCAST ;CHECK FOR 1S OR 0S WHERE *S GIVEN IN MASTER JRST LOCB5 ;YES, PATTERN IS ILLEGAL LOCB4: MOVE T3,N ANDCM T3,BLDAST ;CLEAR DON'T-CARE BITS ANDI T3,-1(T1) ;MASK PC TO NEW BLOCK SIZE CAMN T3,BLDPAT ;DOES PC MATCH NEW PATTERN? JRST LOCB8 ;YES, USE IT MOVE T3,N ;GET PC AGAIN AND T3,LOCAST ;SAVE STATE OF * BITS IOR N,LOCAST ;THEN FORCE THEM TO CARRY AOBJP N,.+1 ;PICK NEXT PC IN BLOCK IOR N,LOCPAT ;RESET BIT CARRIED OUT OF ANDCM N,LOCAST ;CLEAR OUT DON'T CARE BITS IOR N,T3 ;SET ANY WHICH WERE SET BEFORE JUMPL N,LOCB4 ;LOOP IF ANY MORE IN THIS BLOCK LOCB5: MOVEM T1,FRECNT ;SAVE NEW PARAMETERS MOVEM T2,LOCPAT MOVEM T4,LOCAST MSG LOCB7, NO SUCH MICRO WORD ADR PATTERN IN CURRENT BLOCK LOCB6: MOVEM T1,FRECNT ;STORE NEW BLOCK SIZE AWAY MOVEM T2,LOCPAT ; ALSO BIT PATTERN MOVEM T4,LOCAST ; AND * PATTERN LOCB7: MOVE T3,LOCPAT ;FAKE FIRST PC IN BLOCK PUSHJ P,BLKCNT ;GET RIGHT VALUE IN LH(N) HALT LOCB8: MOVEM N,PC(RAM) ;SET UP FAKE FIRST WORD ADDRESS MOVE N,BLDPAT ;SAVE = COMMAND AWAY IN LOCTAB MOVE T1,BLDAST DPB T1,[%%LCAS,,N] MOVE T1,BLDNB DPB T1,[%%LCNB,,N] MOVEI T1,%LCEQL JRST ADDLOC LOCB3: MOVE N,PC(RAM) ;GET CURRENT PC ANDI N,-1(T1) ;MASK PC TO RELEVANT BITS SUB T2,N ;HOW FAR OFF? JUMPE T2,CPOPJ ;XFER IF RIGHT ON SKIPGE T2 ADD T2,T1 ;GET POS VAL, MOD BLOCK SIZE ADD N,T2 ;ADJUST PC MOVEM N,PC(RAM) POPJ P, SUBTTL "FIELD/=" ;FIELD/= HAS BEEN SCANNED. SO, A MICRO FIELD DEFINITION IS IN PROGRESS. DEFSYM: PUSHJ P,SRCFLD ;FIND THE FIELD MSG SCNEND, UNDEFINED FIELD IN SYMBOL DEFINITION PUSHJ P,MAKSYM ;GO MAKE THE SYMBOL JFCL ;DO CONSISTENCY CHECK PUSHJ P,TOKEN CAIE N,.TKN ;SKIP IF TOKEN NUMERIC MSG DEFS99, VALUE REQUIRED IN SYMBOL DEFINITION MOVE N,NUMBER PUSHJ P,DEFCHK HALT DEFVAL PUSHJ P,DEFSLS CAIE C,", JRST SCNEND PUSHJ P,TOKN10 MOVE N,NUMBER PUSHJ P,DEFCHK HALT DEFTM1 ;FIRST TIME VALUE CAIE C,", JRST SCNEND PUSHJ P,TOKN10 MOVE N,NUMBER PUSHJ P,DEFCHK HALT DEFTM2 ;SECOND TIME VALUE DEFS99: JRST SCNEND SUBTTL DEFINE A FIELD DEFFLD: PUSHJ P,MAKFLD JRST SCNEND PUSHJ P,GETARG ;SCANNED FIELD/=, GET ARGS MSG CPOPJ, VALUE REQUIRED FOR FIELD DEFINITION MSG CPOPJ, SIZE REQUIRED FOR FIELD DEFINITION MSG CPOPJ, POSITION REQUIRED FOR FIELD DEFINITION JRST CPOPJ PUSHJ P,DEFSLF JRST SCNEND DEFSLF: DEFSLS: LDB T1,DEFPOS CAILE T1,MICMXB MSG .+1, POSITION TOO LARGE FOR MICRO WORD LDB T2,DEFSIZ ADDI T1,1 CAMGE T1,T2 MSG .+1, SIZE TOO LARGE FOR POSITION LDB T1,DEFVAL MOVEI N,1 LSH N,(T2) LDB T2,DEFFNC HRRZ T2,DEFTAB(T2) CAMG N,T1 CAIN T2,DFLOTH POPJ P, MSG CPOPJ,DEFAULT VALUE TOO LARGE FOR FIELD SUBTTL DEFINE A MACRO DEFMAC: MOVEI FPNT,PSUDM% ;FIRST CHECK FOR PSEUDO-MACRO PUSHJ P,SRCSY1 ;IS IT ONE OF THOSE NAMES? JRST DEFM0 ;NO, DEFINE A REAL MACRO HRRZ T1,SYMPSO(SPNT) ;YES, GET ADDR OF HANDLER JRST 0(T1) $TITLE: TRNE F,PASS2 JRST SCNEND ;TREAT AS COMMENT ON PASS 2 SKIPE TTLPNT ;DO WE ALREADY HAVE A TITLE MSG SCNEND, TITLE MULTIPLY DEFINED MOVEI N,1 PUSHJ P,GETWRD HRRZM N,TTLPNT ;SAVE ADDRESS INTO WHICH IT IS STORED JRST DEFM2 ;GO COLLECT IT $TOC: TRNE F,PASS2 ;ENTIRELY DIFFERENT FUNCTION ON PASS2 JRST TOC2 MOVEI N,2 ;LINK WORD + ONE FOR STRING PUSHJ P,GETWRD SKIPN T1,TOCPNT ;TOC INITIALIZED? MOVEI T1,TOCPNT ;NO, POINT TO IT HRLM N,0(T1) ;LINK THIS ONE TO LAST ON LIST HRRM N,TOCPNT ;AND NOTE THIS IS NOW LAST MOVE T1,LINNUM HRRZM T1,0(N) ;STUFF LINE # INTO ENTRY AOJA N,DEFM2 ;NOW COLLECT THE STRING TOC2: HLRZ N,TOCPNT ;TRY TO FIND THIS ON LIST TOC3: HRRZ T1,0(N) ;GET LINE # OF DEFINITION CAMLE T1,LINNUM ;IS IT OLD FOR THIS LINE? MSG STOP, !!TOC LST FOULED UP !! CAMN T1,LINNUM ;IS THIS WHERE WE DEFINED IT? JRST SCNEND ;YES, IT WILL PRINT AS SUBTTL HLRZ N,0(N) ;NO, LOOK AT NEXT HRLM N,TOCPNT JRST TOC3 ;DEFINE A MACRO DEFM0: SKIPE FPNT,MACPNT(RAM) ;IS THE "MACRO%" FIELD DEFINED? JRST DEFM1 ;YES, AVOID SEARCH MOVE T1,[MACRO,,FIELD] ;FORCE FIELD NAME BLT T1,FIELD+NWORDS-1 PUSHJ P,MAKFLD ;MAKE INITIAL FIELD FOR MACROS MSG STOP, !!CAN'T DEFINE "MACRO%"!! SETZM FIELD MOVEM FPNT,MACPNT(RAM) ;REMEMBER FOR FUTURE DEFM1: PUSHJ P,MAKSYM JRST SCNEND MOVEI N,1 PUSHJ P,GETWRD ;GET 1 WORD OF SPACE HRRM N,SYMMAC(SPNT) ; AND SAVE AS 1ST WORD OF MACRO DEFM2: PUSHJ P,COPMAC ;COPY TEXT INTO SYMBOL TABLE JRST SCNEND ;SUBR TO COPY QUOTED TEXT INTO SYMBOL TABLE COPMAC: HRLI N,(POINT 7,) ;MAKE ADDR OF SPACE INTO BYTE POINTER PUSH P,N ;CREATE TEMP FOR IT CMAC1: PUSHJ P,GETCHR CAIN C,12 ;EOL? MSG CMAC99, MISSING TERMINAL QUOTE CAIN C,42 ;TERMINAL QUOTE? MOVEI C,0 ;YES, TERMINATE WITH IT MOVE T1,0(P) ;PICK UP POINTER TLNN T1,760000 ;AT END OF WORD? JRST CMAC2 ;NO MOVEI N,1 ;YES, GET ANOTHER PUSHJ P,GETWRD CMAC2: IDPB C,0(P) ;STORE THIS CHAR JUMPN C,CMAC1 ; COLLECT ASCIZ STRING CMAC99: POP P,N ;RESTORE STACK POPJ P, SUBTTL GETARG ;SEARCH ARGUMENT LIST AND RE-CALL CALLING ROUTINE ;FOR MISSING ARGS ;CALLING SEQUENCE: ; PUSHJ P,GETARG ; ;GETARG PUSHJ'S TO HERE IF 1ST ARG IS MISSING ; ;TO HERE IF 2ND ARG IS MISSING ; ;3RD ARG ; ;4TH ARG ; FINAL RETURN GETARG: PUSHJ P,TOKEN ;GET 1ST ARG CAIN N,.TKB CAIE C,"< ;LEADING LESS-THAN FOR BYTE SPEC CAIA JRST NGETA1 ;NEW-STYLE FIELD DEFINITION HANDLED DIFFERENTLY CAIE N,.TKN PUSHJ P,@(P) ;1ST ARG MISSING, CALL CALL SITE+1 MOVE N,NUMBER PUSHJ P,DEFCHK ;CHECK THAT VALUE FITS FIELD HALT DEFVAL AOS (P) ;1ST ARG SCAN COMPLETED CAIN C,", ;POSSIBLE 2ND ARG? PUSHJ P,TOKN10 ;YES, GO SCAN CAIE N,.TKN PUSHJ P,@(P) ;NO POSSIBLE ARG, OR WASN'T THERE MOVE N,NUMBER PUSHJ P,DEFCHK HALT DEFSIZ AOS (P) ;2ND ARG SCAN COMPLETED CAIN C,", ;CHECK FOR POSSIBLE THIRD ARG PUSHJ P,TOKN10 CAIE N,.TKN PUSHJ P,@(P) MOVE N,NUMBER PUSHJ P,DEFCHK HALT DEFPOS CAML N,MAXPS1(RAM) MOVEM N,MAXPS1(RAM) ;KEEP TRACK OF MICRO WORD SIZE AOS (P) ;3RD ARG SCAN COMPLETED CAIE C,", JRST GETA4 GETA2: PUSHJ P,GETCHR ;4TH ARG IS SINGLE CHAR CAIN C,40 JRST GETA2 ; BUT FLUSH SPACES MOVSI N,DEFTAB-DEFTND GETA3: HLRZ T1,DEFTAB(N) ;SEARCH TABLE FOR CHARACTER CAMN T1,C JRST GETA5 AOBJN N,GETA3 MSG .+1, UNDEFINED SPECIAL FUNCTION CHARACTER GETA4: PUSHJ P,@(P) JRST GETA6 GETA5: HRRZS N PUSHJ P,DEFCHK HALT DEFFNC GETA6: JRST CPOPJ1 ;LESS-THAN THAT INTRODUCES NEW-STYLE FIELD DEFINITION HAS BEEN READ NGETA1: PUSHJ P,TOKN10 ;GET LEFT BIT POSITION CAIE N,.TKN MSG .+1,LEFT BIT POSITION MISSING IN FIELD DEFINITION PUSH P,NUMBER ;SAVE IT FOR THE MOMENT CAIN C,"> ;SINGLE BIT FIELD? JRST NGETA4 CAIE C,": MSG .+1,COLON MISSING BETWEEN LEFT AND RIGHT BIT POSITIONS PUSHJ P,TOKN10 ;GET RIGHT BIT POSITION CAIE N,.TKN MSG .+1,LEFT BIT POSITION MISSING IN FIELD DEFINITION CAIE C,"> MSG .+1,RIGHT ANGLE-BRACKET MISSING AFTER FIELD BYTE SPEC NGETA4: MOVE N,NUMBER ;RIGHT BIT POSITION CAML N,MAXPS1(RAM) MOVEM N,MAXPS1(RAM) ;KEEP TRACK OF MICRO WORD SIZE PUSHJ P,DEFCHK ;STORE BYTE POSITION HALT DEFPOS POP P,T1 SUB N,T1 AOS N ;BIT POSITIONS ARE INCLUSIVE PUSHJ P,DEFCHK ;STORE BYTE SIZE HALT DEFSIZ PUSHJ P,GETCHR ;MODE ARG IS SINGLE CHAR MOVSI N,DEFTAB-DEFTND NGETA3: HLRZ T1,DEFTAB(N) ;SEARCH TABLE FOR CHARACTER CAMN T1,C JRST NGETA5 AOBJN N,NGETA3 TRO F,REREAD ;IGNORE IF UNRECOGNIZED CHARACTER SETZ C, ;NO, PINHEAD, I DIDN'T READ THIS CHAR YET NGETA6: POP P,T1 ;AND RETURN SKIPPING 4 GUBBISH RETURNS JRST 4(T1) NGETA5: HRRZS N ;SAVE SPECIAL FUNCTION CHARACTER PUSHJ P,DEFCHK HALT DEFFNC JRST @NDFTAB(N) ;GET ANY ADDITIONAL ARGUMENTS ;D SPEC NGETA7: PUSHJ P,NGETAT CAIE N,.TKN PUSHJ P,@(P) ;FIELD VALUE MISSING MOVE N,NUMBER NGETA9: PUSHJ P,DEFCHK ;SAVE DEFAULT HALT DEFVAL JRST NGETA6 ;F SPEC NGETA8: PUSHJ P,NGETAT CAIE N,.TKS MSG NGETA6,FIELD NAME MISSING AFTER F MODE CHAR PUSH P,FPNT ;SAVE FIELD BEING DEFINED REPEAT NWORDS,PUSH P,FIELD+.RPCNT PUSHJ P,FLDSPC ;COPY NAME INTO FIELD PUSHJ P,SRCFLD ;FIND OTHER FIELD MSG .+1,FIELD TO DEFAULT TO NOT DEFINED YET REPEAT NWORDS,POP P,FIELD+NWORDS-.RPCNT-1 POP P,FPNT MOVE SPNT,FPNT JRST NGETA9 NGETAT: PUSHJ P,GETCHR ;SKIP COMMA CAIE C,", MSG .+1,COMMA MISSING BETWEEN MODE CHAR AND ITS ARGUMENT JRST TOKEN ;GET DEFAULT FIELD VALUE SUBTTL VALUE INSERTION ;CHECK TO SEE THAT VALUE FITS IN THE BYTE FIELD ALLOWED ;AND THEN STUFF IT THERE DEFCHK: LDB T1,DEFFLG ;FIRST CHECK FOR MULTIPLE DEFINITION TRNE T1,MULF ;IF SET, WE'VE ALREADY OBJECTED JRST CPOPJ1 ;CAN'T EXPECT THAT TO BE CONSISTENT HRRZ T1,@(P) TRNN F,PASS2 JRST DEFC2 LDB N1,(T1) ;GET PASS1 DEFINITION CAME N,N1 MSG STOP, PASS1 AND PASS2 DEFINITIONS DIFFER JRST CPOPJ1 DEFC2: DPB N,(T1) LDB N1,(T1) CAME N,N1 MSG .+1, NUMBER TOO BIG FOR FIELD JRST CPOPJ1 TIMSET: MOVE N,TIME1 ;DEFAULT TIME INSERTION CAMGE N,TIME2 ;GET MAX MOVE N,TIME2 LDB T2,DEFVAL ;GET DEFAULT MINIMUM TIME CAMGE N,T2 MOVE N,T2 ;DEFAULT TIME .GT. MAX(T1,T2) JRST BITS1 PCINC: SKIPE RAM MSG STOP, NOT SUPPOSED TO GET TO PCINC FOR DCODE MOVE N,LOCPNT ;FIND NEXT LOCATED INSTRUCTION PCINC1: LDB T1,[%%LCOP,,LOCTAB(N)] CAIE T1,%LCUCD AOBJN N,PCINC1 SKIPL N MSG .+1, NO SUCCESSOR INSTRUCTION TO THIS ONE FOUND LDB N,[%%LCPC,,LOCTAB(N)] JRST BITS1 BITSET: LDB N,DEFVAL ;VALUE INSERTION INTO MICRO FIELD BITS1: PUSH P,N ;SAVE VALUE PUSHJ P,FLDTST ;FIELD ALREADY LOADED? JRST BITS3 ;NO MOVE T1,0(P) ;YES...CHECK FOR CONFLICTING OVERLAP MOVEI T2,0 LSHC T1,(N1) SKIPE N XOR T1,VALUE-1(N) XOR T2,VALUE(N) ;GET DIFFERENCE FROM PREVIOUS VALUES SKIPE N AND T1,VALSET-1(N) AND T2,VALSET(N) ;LIMIT DIFF TO FIELDS ALREADY SET TDNN T1,T3 TDNE T2,T4 ;ANY SUCH DIFFERENCES IN THIS FIELD? MSG NPOPJ, MICRO FIELD SET WITH CONFLICTING VALUES ;NO, SET THIS VALUE INTO MICROWORD BITS3: POP P,T1 MOVEI T2,0 LSHC T1,(N1) ;PUSH VALUE INTO PLACE SETCA T3, ;MAKE UNUSED FIELDS BE 1S SETCA T4, TDNN T1,T3 ;IF VALUE EXTENDS OUTSIDE FIELD, TDNE T2,T4 ; THEN THERE IS AN ERROR MSG CPOPJ, VALUE TOO LARGE FOR FIELD SKIPE N IORM T1,VALUE-1(N) IORM T2,VALUE(N) SKIPE N ORCAM T3,VALSET-1(N) ;MARK MICRO WORD FIELD AS USED ORCAM T4,VALSET(N) POPJ P, DFLOTH: LDB FPNT,DEFVAL ;POINTER TO FIELD TO DEFAULT TO LDB T4,DEFSIZ ;FIND THAT FIELD LDB T2,DEFPOS MOVE FPNT,SPNT ;RESTORE TO CURRENT FIELD ADDI T2,1 ;FIND DEFAULT IN VALUE WORD IDIVI T2,36. SKIPN T2 TDZA N,N MOVE N,VALUE-1(T2) MOVE N1,VALUE(T2) LSHC N,(T3) ;RIGHT-JUSTIFY FIELD IN N SETZ T1, SETO T2, LSHC T1,(T4) ;MASK FOR FIELD IN T1 AND N,T1 JRST BITS1 ;GO STORE VALUE ;SKIP IF SOME FIELDS MATCH THIS ONE ;NO SKIP IF FIELD VIRGIN ;ON RETURN, LEAVE MASK FOR THIS FIELD IN T3,T4 ;LEAVE SHIFT POSITION AND TABLE INDEX IN N1,N FLDTST: MOVEI T3,0 MOVNI T4,1 LDB T1,DEFSIZ LSHC T3,(T1) MOVEI T4,0 LDB N,DEFPOS ADDI N,1 IDIVI N,36. MOVNS N1 LSHC T3,(N1) SKIPE N TDNN T3,VALSET-1(N) TDNE T4,VALSET(N) AOS (P) POPJ P, ;CODE TO SEARCH FIELD DEFINITION LIST AND INSERT DEFAULTS DEFALT: MOVEI FPNT,FLDPNT ;START OF LIST DFLT2: HRRZ FPNT,SYMLNK(FPNT) JUMPE FPNT,CPOPJ ;STOP AT END OF LIST MOVE SPNT,FPNT LDB T1,DEFTYP ;GET "UCODE" OR "DISP" TYPE CAME T1,RAM ;MATCH CURRENT MODE? JRST DFLT4 ;NO PUSHJ P,FLDTST ;IS FIELD VIRGIN? SKIPA ;YES JRST DFLT4 ;NO LDB T1,DEFFNC JUMPE T1,DFLT4 ;0 FUNCTION MEANS NO DEFAULT MOVE T1,DEFTAB(T1) PUSHJ P,(T1) ;DISPATCH ON FUNCTION DFLT4: JRST DFLT2 PARITY: POP P,T1 ;GET RETURN ADR PUSH P,FPNT ; SAVE FPNT TO PARITY FIELD PUSHJ P,(T1) ; AND MAKE "CALLER" BE "CALLEE" POP P,FPNT ;SET UP PARITY FIELD POINTERS MOVE SPNT,FPNT MOVEI T1,0 ;INIT PARITY MOVSI T2,-MICMXW ;COUNT THRU ALL OF MICRO WORD XOR T1,VALUE(T2) ;COMPUTE TABLE PARITY AOBJN T2,.-1 TSC T1,T1 ;REDUCE TO 18 BITS MOVEI N,0 PARLUP: JUMPN T1,[ANDI T1,-1(T1) ;REMOVE 1 BIT AOJA N,PARLUP ] TRNE N,1 ;IF PARITY ALREADY ODD, POPJ P, ; THEN OK AS IS MOVEI N,1 ;GET A PARITY BIT LDB T2,DEFSIZ ;GET PARITY FIELD SIZE JUMPN T2,BITS1 ;PUT PARITY BIT INTO FIELD MOVSI T1,-MICMXW ;MINUS TABLE LENGTH OF MICRO WORD PAR3: SETCM T2,VALSET(T1) ;GET BIT USAGE JFFO T2,[MOVSI N,(SETZ) ;BIT TO SHIFT MOVNS T3 ;GET RIGHT SHIFT COUNT LSH N,(T3) ; AND SHIFT PARITY BIT TO FREE PLACE IORM N,VALUE(T1) IORM N,VALSET(T1) JRST PAR5 ] AOBJN T1,PAR3 ;CONTINUE LOOKING FOR PLACE FOR BIT PAR5: HLRES T1 ;GET # WORDS REMAINING ADDI T1,MICMXW ;GET WHICH WORD HAD FREE BIT IMULI T1,36. SUB T1,T3 ;CONVERT TO BIT NUMBER CAMLE T1,MAXPOS(RAM) ;WAS THERE ROOM FOR PARITY BIT? MSG .+1, NO ROOM FOR PARITY BIT POPJ P, SUBTTL SYMBOL TABLE ROUTINES ;SUBROUTINE TO FIND A FIELD OR MAKE ONE IF IT DOESN'T EXIST. ; NO SKIP IF IT ALREADY EXISTS. SKIP IF NEWLY MADE. ; RETURNS POINTER TO FIELD BLOCK IN SPNT AND FPNT. MAKFLD: PUSHJ P,SRCFLD JRST MAKF1 ;NOT FOUND TRNN F,PASS2 ;ONLY ONCE PER PASS, PLEASE JRST MULFLD PUSHJ P,BEGCRF ;PUT DEFINITION IN THE CREF LDB T1,DEFFLG ;CHECK FOR MULTIPLY DEFINED TRNE T1,MULF MSG CPOPJ, MULTIPLY DEFINED FIELD POPJ P, ;AND RETURN FOUND MAKF1: SKIPN FIELD MSG CPOPJ, CAN'T DEFINE A NULL FIELD TRNE F,PASS2 ;BETTER BE PASS 1 MSG STOP, !!FIELD UNDEFINED ON PASS 2!! PUSH P,N PUSHJ P,GETROM MOVE FPNT,N ;SAVE POINTER TO NEW FIELD MOVE SPNT,N POP P,N1 ;GET POINTER TO PREVIOUS FIELD HRRZ N,SYMLNK(N1) ;GET POINTER FROM PREVIOUS FIELD HRRZM N,SYMLNK(FPNT) ;AND CONTINUE FROM NEW FIELD HRRM FPNT,SYMLNK(N1) ;LINK LIST STRUCTURE MOVSI T1,FIELD HRRI T1,SYMTXT(FPNT) BLT T1,SYMTXT+NWORDS-1(FPNT) ;COPY NAME TEXT INTO DEFINITION SETZM SYMVAL(FPNT) ;ZERO DEFINITION WORD SETZM SYMVAL+1(FPNT) DPB RAM,DEFTYP SETZM SYMCRF(SPNT) ;INIT CREF LIST STRUCTURE JRST CPOPJ1 MULSYM: MULFLD: LDB T1,DEFFLG ;PICK UP FLAGS IORI T1,MULF ;NOTE MULTIPLE DEFINITION DPB T1,DEFFLG MSG CPOPJ, MULTIPLE DEFINITION ;SUBROUTINE TO MAKE A SYMBOL DEFINITION (IF ONE DOESN' EXIST) ;SIMILAR TO MAKFLD ABOVE ; CALLED WITH POINTER TO FIELD IN FPNT ; SKIPS IF NEWLY MADE. RETURNS POINTER IN SPNT. ; NO SKIP IF ALREADY DEFINED. ; POINTER IN SPNT TO PRESENT DEFINITION. MAKSYM: PUSHJ P,SRCSY1 ;LOOK FOR SYMBOL, BUT DON'T CREF YET JRST MAKS1 ;NOT FOUND TRNN F,PASS2 ;DISALLOW MULTIPLE DEFINITION JRST MULSYM PUSHJ P,BEGCRF ;NOTE DEFINITION IN CREF LDB T1,DEFFLG ;LOOK AT FLAGS TRNE T1,MULF ;IS THIS MULTIPLY DEFINED? MSG CPOPJ, MULTIPLY DEFINED SYMBOL POPJ P, MAKS1: SKIPN NAME ;NO DEFINED YET MSG CPOPJ, CAN'T DEFINE NULL SYMBOL TRNE F,PASS2 MSG STOP, !!SYMBOL UNDEFINED ON PASS2!! PUSH P,N PUSHJ P,GETROM HRRZM N,SPNT POP P,N1 HLRZ N,SYMLNK(N1) HRLZM N,SYMLNK(SPNT) ;LINK TO NEXT SYMBOL HRLM SPNT,SYMLNK(N1) MOVSI T1,NAME HRRI T1,SYMTXT(SPNT) BLT T1,SYMTXT+NWORDS-1(SPNT) SETZM SYMVAL(SPNT) SETZM SYMVAL+1(SPNT) DPB RAM,DEFTYP SETZM SYMCRF(SPNT) ;INIT CREF LIST STRUCTURE JRST CPOPJ1 SRCFLD: MOVEI N,FLDPNT SRCF2: MOVEI N1,(N) ;SAVE POINTER TO LAST LOWER FIELD HRRZ N,SYMLNK(N) JUMPE N,SRCX ;QUIT IF END OF LIST REPEAT NWORDS,[ MOVE T1,FIELD+.RPCNT CAMLE T1,.RPCNT+SYMTXT(N) JRST SRCF2 CAME T1,.RPCNT+SYMTXT(N) JRST SRCX ;NO MATCH, RETURN PTR TO SMALLER FLD ] HRRZ FPNT,N HRRZ SPNT,N LDB T1,DEFTYP CAIE T1,(RAM) ;DOES FIELD TYPE MATCH CURRENT MODE? JRST SRCF2 ;NO, LOOK SOME MORE JRST CPOPJ1 ;YES, SKIP RETURN SRCX: MOVEI N,(N1) ;GET POINTER TO SMALLER FIELD POPJ P, ;RETURN NO MATCH SRCSYM: PUSHJ P,SRCSY1 ;LOOK FOR SYMBOL POPJ P, ;WASN'T THERE PUSHJ P,MAKCRF ;WAS, CREF THE REFERENCE JRST CPOPJ1 SRCSY1: MOVEI N,(FPNT) SRCS2: MOVEI N1,(N) HLRZ N,SYMLNK(N) JUMPE N,SRCX ;END OF LIST, RETURN NO MATCH REPEAT NWORDS,[ MOVE T1,NAME+.RPCNT CAMLE T1,.RPCNT+SYMTXT(N) JRST SRCS2 ;TRY NEXT ENTRY, THIS IS TOO SMALL CAME T1,.RPCNT+SYMTXT(N) JRST SRCX ;NO CAN FIND ] MOVEI SPNT,(N) ;THIS IS THE SYMBOL JRST CPOPJ1 MAKCRF: TRNN F,PASS2 POPJ P, ;BUILD CREF ON PASS2 TDZA N1,N1 ;CLEAR DEFINE FLAG BEGCRF: MOVEI N1,400000 ;FLAG AS DEFINITION MOVEI N,1 ;GET 1 WORD FOR CREF REFERENCE PUSHJ P,GETWRD HLRZ T1,SYMCRF(SPNT) ;GET LAST ADR IN LIST HRLM N,SYMCRF(SPNT) ;MAKE NEW WORD LAST ADR SKIPN T1 ;IF OLD LAST ADR IS ZERO, THEN MOVEI T1,SYMCRF(SPNT) ; LAST ADR IS IN SYMBOL BLOCK HRRM N,(T1) ;PUT THIS WORD ONTO END OF LIST IFN FTCOIN, HRRZ T1,CRFLIN ;GET LINE # AT WHICH THIS WORD STARTED IFE FTCOIN, HRRZ T1,LINNUM ;GET CURRENT LINE NUMBER IOR T1,N1 ;PUT DEFINE FLAG, IF ANY, IN HRLZM T1,(N) ; STUFF INTO WORD NOW ON LIST END ; AND MAKE POINTER TO NEXT BE 0 POPJ P, GETROM: MOVEI N,SYMLEN ;GET ROOM FOR NEW SYM TABLE ENTRY GETWRD: PUSH P,.JBFF ADDB N,.JBFF CAMGE N,.JBREL JRST GETW2 CAIL N,HGHSEG MSG STOP,VIRTUAL MEMORY FULL LSH N,-10. .CALL [ SETZ ;GET FRESH PAGE 'CORBLK MOVEI %CBRED+%CBWRT+%CBNDW+%CBNDR MOVEI %JSELF MOVEI (N) SETZI %JSNEW ] .LOSE %LSSYS MOVEI N,2000 ADDM N,.JBREL GETW2: NPOPJ: POP P,N POPJ P, SUBTTL LEXICAL ANALYZER ;SUBROUTINE TO BUILD A SYMBOLIC OR NUMERIC TOKEN ; ENTRY TOKEN - BUILD SYMBOL, OCTAL NUMBER, OR DECIMAL NUMBER ; ENTRY TOKN10 - BUILD SYMBOL, OR DECIMAL NUMBER ;OCTAL NUMBERS ARE OF FORM <+,-, > ; AN 8 OR 9 OR A DECIMAL POINT MAKES NUMBER DECIMAL ;DECIMAL NUMBERS ARE OF FORM <+,-, > ; AN 8 OR 9 OR A FINAL DECIMAL POINT IS REQUIRED ;A SYMBOL IS ANYTHING THAT IS NOT A LEGAL NUMBER ; RETURN .TKB - BLANK TOKEN ; RETURN .TKN - SIGNED NUMERIC TOKEN WITH VALUE IN "NUMBER" ; RETURN .TKS - SYMBOL TOKEN WITH ASCIZ TEXT IN "NAME" TABLE .TKB==0 ;BLANK (OR NULL) TOKEN .TKN==1 ;NUMERIC TOKEN .TKS==2 ;SYMBOLIC TOKEN TOKEN: TDZA T1,T1 ;ENTRY FOR SYM,OCT#,DEC# START WITH STATE 0 TOKN10: MOVEI T1,5_3 ;ENTRY FOR SYM,DEC# START WITH STATE 5 MOVEM T1,TOKSTA' ;INIT STATE TABLE SETZM TKZER MOVE T1,[TKZER,,TKZER+1] BLT T1,TKZEND-1 ;INITIALIZE TOKEN VALUES MOVE T1,[POINT 7,NAME] MOVEM T1,TOKPNT' ;INIT SYMBOL BUILD POINTER MOVE T1,[POINT 7,TKARGB-1,35] MOVEM T1,TKAPNT' ;INITIALIZE ARGUMENT BUFFER POINTER TOK2: PUSHJ P,GETCHM ;GET NEXT CHARACTER MOVE T1,TOKSTA ;GET OLD STATE ANDI T1,170 ;AND EXTRACT STATE BITS LDB T2,TOKTYP ;GET CHARACTER TYPE IOR T1,T2 ; AND COMBINE WITH OLD STATE IDIVI T1,4 ;GET NEXT STATE, 4 ENTRIES/WORD LDB T1,TOKNXT(T1+1) MOVEM T1,TOKSTA ;SAVE NEW STATE ANDI T1,7 ; AND EXTRACT DISPATCH ADDRESS XCT TOKXCT(T1) ;PROCESS CURRENT CARACTER JRST TOK3 ;INCLUDE IN SYMBOL JRST TOK2 ;GO GET NEXT CHARACTER TOK3: MOVE T1,TOKPNT ;GET SYMBOL BUILD POINTER CAME T1,[POINT 7,NAME+NWORDS-1,34-7] IDPB C,TOKPNT ;ROOM FOR CHAR, STORE AWAY CAIE C,"[ ;IF MACRO CALL, STASH ARGUMENT JRST TOK2 ;OTHERWISE GO GET NEXT CHARACTER TKA1: PUSHJ P,GETCHM ;LOOP STASHING MACRO ARGUMENT CHARACTERS CAIN C,"] JRST TKA2 ;END OF ARGUMENT MOVE T1,TKAPNT CAMN T1,[POINT 7,TKARGB+NARGWD-1,34-7] MSG TKA1,MACRO ARGUMENTS TOO LONG IDPB C,TKAPNT JRST TKA1 TKA2: MOVE T1,TKAPNT ;TERMINATE ARGUMENT CAMN T1,[POINT 7,TKARGB+NARGWD-1,34-7] MSG TKA1,MACRO ARGUMENTS TOO LONG MOVEI T1,0 IDPB T1,TKAPNT JRST TOK3 ;CLOSE BRACKET IS PART OF ARGUMENT ; EXECUTE TABLE TOKXCT: SKIPA ; 0 IGNORE CHARACTER JFCL ; 1 INCLUDE IN SYMBOL ONLY SETOM TOKMIN ; 2 SET MINUS FLAG PUSHJ P,TOKDIG ; 3 PROCESS 0-9 JRST TOK5 ; 4 RETURN .TKB - NO TOKEN JRST TOK6 ; 5 RETURN .TKS - SYMBOL JRST TOK7 ; 6 RETURN .TKN - DECIMAL NUMBER JRST TOK8 ; 7 RETURN .TKN - OCTAL NUMBER ;MARGINAL INDEX TABLE INTO TOKTAB TOKNXT: PINDEX 9,TOKTAB(T1) DEFINE BYTE A,B,C,D,E,F,G,H .BYTE 9 A ? B ? C ? D ? E ? F ? G ? H .BYTE TERMIN ;STATE TABLE. THE ROWS ARE INDEXED BY STATE; COLUMNS BY CHAR TYPE. ; EACH ENTRY CONSISTS OF 2 DIGITS- 2ND IS INDEX INTO TOKXCT, 1ST ; IS THE NEW STATE NUMBER. TOKTAB: ;TERM, " ", ".", "+", "-", 0-7, 8-9,OTHER LEGAL SYM CHAR BYTE 04, 00, 11, 21, 22, 23, 33, 11 ;STATE #0 BYTE 05, 61, 11, 11, 11, 11, 11, 11 ;STATE #1 BYTE 07, 71, 41, 11, 11, 23, 33, 11 ;STATE #2 BYTE 06, 101, 41, 11, 11, 33, 33, 11 ;STATE #3 BYTE 06, 111, 11, 11, 11, 11, 11, 11 ;STATE #4 BYTE 54, 50, 11, 31, 32, 33, 33, 11 ;STATE #5 BYTE 05, 60, 11, 11, 11, 11, 11, 11 ;STATE #6 BYTE 07, 70, 41, 11, 11, 23, 33, 11 ;STATE #7 BYTE 06, 100, 41, 11, 11, 33, 33, 11 ;STATE #10 BYTE 06, 110, 11, 11, 11, 11, 11, 11 ;STATE #11 ;STATE #0 - FLUSHES SPACES, ALLOWS + OR - FOR NUMBERS ;STATES #1,6 - BUILDS SYMBOLS, A CHARACTER WAS ILLEGAL FOR A NUMBER ;STATES #2,7 - BUILDS OCTAL NUMBER UNTIL 8,9, OR (.) SEEN ;STATES #3,10 - BUILDS DECIMAL NUMBER ;STATES #4,11 - A (.) SEEN AFTER A NUMBER, GO TO #1 FOR ANYTHING OTHER ; THAN SPACE OR TERM. ;STATE #5 - SAME AS #0 EXCEPT ANY NUMBER IS FORCED DECIMAL ; STATES #6-11 FLUSH MULTIPLE SPACES EXPUNGE BYTE TOKDIG: MOVEI T1,-"0(C) ;EXTRACT DIGIT FORM ASCII CHAR MOVEI T2,8. IMULM T2,TOKOCT ;BUILD OCTAL NUMBER ADDM T1,TOKOCT ; AND ADD IN NEXT DIGIT MOVEI T2,10. IMULM T2,TOKDEC ;BUILD DECIMAL NUMBER ADDM T1,TOKDEC ; AND ADD IN NEXT DIGIT POPJ P, TOK5: MOVEI N,.TKB JRST TOK99 TOK6: MOVEI T1,0 ;TRAILING SPACE FLUSHER FOR SYMBOLS LDB T2,TOKPNT ;GET LAST CHAR IN SYMBOL CAIN T2,40 DPB T1,TOKPNT ;REPLACE A TRAILING SPACE WITH NULL MOVEI N,.TKS JRST TOK99 TOK7: SKIPA N,TOKDEC ;PICK UP DECIMAL NUMBER TOK8: MOVE N,TOKOCT ;PICK UP OCTAL NUMBER SKIPGE TOKMIN MOVNS N ;NEGATE IF MINUS FLAG SET MOVEM N,NUMBER MOVEI N,.TKN TOK99: POPJ P, SUBTTL GETCHR - GET A CHARACTER ;LOWEST LEVEL ROUTINE TO GET A CHARACTER ; IF REREAD FLAG SET, RETURNS LAST CHARACTER READ GETCHR: TRZE F,REREAD JRST [ MOVE C,LASTC POPJ P, ] GETC1: SKIPE CHRPNT ;RESCANNING ANYTHING? JRST [ ILDB C,CHRPNT ;YES, GET CHARACTER JUMPN C,GETC9 PUSHJ P,RESTOR ;BUT NOTHING LEFT, POP MACRO STACK JUMPN C,GETC9 ;TAKE SAVED CHARACTER IF ANY JRST GETC1 ] ;NO SAVED CHARACTER, READ AGAIN SOSGE INCNT JRST GETC7 ILDB C,INPNT ;GET CHAR FROM INPUT FILE GETC8: LDB C1,GETPNT ;TRANSLATE INPUT CHARACTER JUMPE C1,GETC1 PNTLST: MOVEM C,EOLCHR ;SAVE LAST CHAR TO FIND WHAT ENDED LINE CAIE C1,12 ;DON'T SAVE 12,13, OR 14 SOSG PNTCNT ;ROOM IN LISTING FILE (LEAVE 1 CHAR ROOM) JRST .+2 ;NO IDPB C,PNTPNT ;YES, SAVE INPUT CHAR IN OUTPUT LISTING MOVE C,C1 ;SEND TRANSLATED CHAR TO CALLER GETC9: MOVEM C,LASTC' ;SAVE CHAR FOR POSSIBLE RE-READS POPJ P, GETC7: MOVE C,[440700,,INBUF] ;REFILL BUFFER MOVEM C,INPNT MOVE C,[-BUFL,,INBUF] .IOT INCHN,C MOVEI C,-INBUF(C) IMULI C,5 ;NUMBER OF CHARS READ MOVEM C,INCNT JUMPN C,GETC1 PUSHJ P,NXTFIL SKIPA C,[12] ;END-OF-FILE RETURNS LINE-FEED MOVEI C,14 ;START NEW FILE WITH FORM FEED JRST GETC8 ;BEGIN EXPANDING A MACRO SAVE: PUSH PM,C ;SAVE DELIMITER AFTER MACRO NAME PUSH PM,CHRPNT ;SAVE INPUT POINTER MOVEM N,CHRPNT ;SET NEW INPUT POINTER MOVN C,MARGSZ ;SAVE MACRO ARGUMENTS IF ANY JUMPE C,SAVE2 HRLZ C,C SAVE1: PUSH PM,MARGPT(C) AOBJN C,SAVE1 SAVE2: PUSH PM,MARGSZ ;SAVE MACRO ARGUMENT BLOCK'S SIZE MOVE C,TKAPNT ;SET UP NEW MACRO ARGUMENTS SUBI C,TKARGB-1 HRRZM C,MARGSZ ;SIZE OF ARGS NOT INCLUDING POINTER TRNN C,-1 POPJ P, ;NO ARGUMENTS AOS MARGSZ MOVE C,[POINT 7,MARGBF] MOVEM C,MARGPT MOVE C,[TKARGB,,MARGBF] BLT C,MARGBF+NARGWD-1 POPJ P, ;FINISH EXPANDING A MACRO RESTOR: POP PM,MARGSZ ;RESTORE MACRO ARGUMENTS SKIPN C,MARGSZ JRST RESTO2 RESTO1: POP PM,MARGPT-1(C) SOJG C,RESTO1 RESTO2: POP PM,CHRPNT ;RESTORE INPUT POINTER POP PM,C ;RESTORE LAST CHARACTER READ POPJ P, ;GETCHR HACKING MACRO ARGUMENTS GETCHM: PUSHJ P,GETCHR CAIN C,"@ SKIPN CHRPNT POPJ P, PUSHJ P,GETCHR ;SEEN @ WHILE EXPANDING A MACRO CAIL C,"1 CAILE C,"9 MSG CPOPJ,MACRO ARGUMENT NUMBER OUT OF RANGE SUBI C,"1 PUSH P,N MOVE N,MARGPT ;DEVELOP POINTER TO ARG JUMPE C,GETCM2 GETCM1: ILDB C1,N JUMPN C1,GETCM1 SOJG C,GETCM1 GETCM2: PUSHJ P,SAVE ;START READING FROM ARG POP P,N JRST GETCHM SUBTTL LISTING GENERATION PNTLIN: PUSH P,C TRNN F,PASS2\ERROR JRST PNTL2 ;NO LIST ON PASS1, RE-INIT LISTING TRNE F,NOBINF JRST PNTLN0 MOVE N,MAXPOS+UCODE ;GET # BITS IN RAM CAMGE N,MAXPOS+DISP MOVE N,MAXPOS+DISP ;FIND LONGEST RAM LENGTH ADDI N,11. ;RAM #S START AT 0, FORCE ROUNDUP IDIVI N,12. ;GET HOW MANY DIGIT GROUPS IMULI N,5 ;5 CHARACTERS PER GROUP ADDI N,7 ;PLUS 7 EXTRA CHARACTERS PUSHJ P,TABTON ;TAB OUT TO THERE PNTLN0: PUSHJ P,PRINT ;PRINT SOURCE LINE ASCIZ /; / HRRZ C,LINNUM PUSHJ P,PNTDEC PUSHJ P,TAB MOVEI C,0 IDPB C,PNTPNT MOVEI N,PNTBUF PUSHJ P,PRINT0 MOVE C,EOLCHR CAIN C,14 JRST PNTL3 PUSHJ P,NEWLIN ;END LINE WITH 15,14 JRST PNTL2 PNTL3: MOVEI C,15 PUSHJ P,PUT MOVEI C,14 ;END LINE WITH 15,14 PUSHJ P,PUT PNTL2: AOS LINNUM ;INDEX LINE NUMBER POP P,C PNTINI: MOVE T1,[POINT 7,PNTBUF] ;INIT OUTPUT LIST LINE BUFFER MOVEM T1,PNTPNT ;INIT OUTPUT BUFFER BYTE POINTER MOVEI T1,PNTMAX MOVEM T1,PNTCNT ;INIT OUTPUT BUFFER CHAR COUNT POPJ P, PNTBIN: TRNN F,BINF ;SKIP IF THERE IS A BINARY WORD ON THIS LINE POPJ P, PUSH P,C HRRZ N,PC(RAM) CAMLE N,HIGHPC(RAM) ;IS THIS THE HIGHEST PC USED SO FAR? MOVEM N,HIGHPC(RAM) ;YES, SAVE FOR LOC'N LISTING TRNE F,PASS2 PUSHJ P,DEFALT ;PUT IN PASS2 DEFAULTS TRNN F,PASS2 JUMPE RAM,PNTB1 ;UCODE LOCATIONS NOT KNOWN ON PASS 1 PUSHJ P,USEDPC ;LOOK TO SEE IF THIS PC USED MSG .+1, MICRO WORD USED TWICE PNTB1: TRNN F,PASS2 JRST PNTB99 AOS WRDCNT(RAM) ;COUNT MICRO WORDS USED MOVEI N,[ASCII /U / ASCII /D /](RAM) PUSHJ P,PRINT0 HRRZ C,PC(RAM) PUSHJ P,PNTOC4 MOVE T1,[POINT 12,VALUE] MOVEM T1,MICPNT' SETZM MICCNT' PUSHJ P,PRINT ASCIZ /, / JRST PNTB3 PNTB2: MOVEI C,", PUSHJ P,PUT PNTB3: ILDB C,MICPNT PUSHJ P,PNTOC4 MOVEI T1,12. ADDB T1,MICCNT CAMG T1,MAXPOS(RAM) JRST PNTB2 JUMPN RAM,PNTB99 SKIPN C,RAMFIL ;MOVE THIS WORD INTO RAMFILE BUFFER JRST PNTB99 ;NO RAMFILE HRRZ T1,PC(RAM) IMUL T1,RFLNWD ADD C,T1 ;C IS DESIRED WORD IN BUFFER MOVE T2,RFLDPT ;T2 IS AOBJN POINTER TO FIELD BYTE POINTERS PNTB90: LDB T1,RFLDS(T2) ;GET A FIELD DPB T1,RFLDD(T2) ;DEPOSIT INTO RAMFILE BUFFER AOBJN T2,PNTB90 MOVEI N,RFLPAR ;PARITY COMPUTATIONS PNTB91: SKIPN T1,(N) JRST PNTB99 LDB T2,[POINT 9,T1,26] ;FIRST BIT IDIVI T2,36. MOVEI T4,36. SUB T4,T3 HRLI T2,000100+C DPB T4,[POINT 6,T2,5] ;ILDB POINTER TO FIRST BIT IN PARITY COMP ANDI T1,777 ;NUMBER OF BITS LDB T3,[POINT 1,(N),0] ;INITIALIZE PARITY ACCUMULATOR PNTB92: ILDB T4,T2 XOR T3,T4 SOJG T1,PNTB92 LDB T1,[POINT 9,(N),17] ;BIT POSITION TO STORE RESULT INTO IDIVI T1,36. ADD T1,C MOVNS T2 ;RIGHT ROTATION ROT T3,-1(T2) ;ALIGN PARITY BIT XORM T3,(T1) ;STORE IT CAIGE N,RAMFIL-1 AOJA N,PNTB91 PNTB99: PUSHJ P,PCNEXT ;GET NEXT PC SET UP POP P,C POPJ P, FINLST: TRO F,ERROR\NOHDR ;FORCE NEXT MSG TO TTY, SUPPRESS HEADERS PUSHJ P,PRINT ASCIZ / ; Number of Micro Words used: ; D Words= / MOVE C,WRDCNT+DISP PUSHJ P,PNTDEC PUSHJ P,PRINT ASCIZ / ; U Words= / MOVE C,WRDCNT+UCODE PUSHJ P,PNTDEC PUSHJ P,CRLF TRZ F,ERROR ;"END" DOESN'T GO TO TTY CONSOLE PUSHJ P,PRINT ASCIZ / END / TRZ F,NOHDR ;DROPS THROUGH ;DROPS IN ;START CREF LISTING MOVEI C,[ASCIZ /CROSS REFERENCE LISTING/] PUSHJ P,SETHDR MOVEI FPNT,FLDPNT ;GET START OF SYM TABLE CRFLUP: HRRZ FPNT,(FPNT) ;GET NEXT FIELD JUMPE FPNT,CRFEND ;STOP AT END MOVE SPNT,FPNT LDB RAM,DEFTYP ;GET "UCODE" OR "DISP" NUMBER MOVEI N,[ASCII /(U) / ASCII /(D) / ] (RAM) PUSHJ P,PRINT0 MOVEI N,SYMTXT(FPNT) ;GET TEXT ADDRESS PUSHJ P,PRINT0 ; AND PRINT FIELD NAME PUSHJ P,CRFLST ;LIST CREF FOR FIELD CRSLUP: HLRZ SPNT,SYMLNK(SPNT) ;GET NEXT JUMPE SPNT,CRFLUP ;GET NEXT FIELD IF NULL MOVE T1,SYMTXT(SPNT) PUSHJ P,TAB MOVEI N,SYMTXT(SPNT) ;GET ADR OF SYMBOL PUSHJ P,PRINT0 PUSHJ P,CRFLST JRST CRSLUP ;HERE TO PRINT CREF FOR ONE SYMBOL CRFLST: HRRZ N,SYMCRF(SPNT) ;GET POINTER TO 1ST ITEM CRILUP: HRRZS N JUMPE N,NEWLIN ;EXITS WITH POPJ PUSH P,(N) ;SAVE LIST ITEM MOVE T1,HORPOS ;GET HORIZONTAL POSITION CAILE T1,120.+1 ;ROOM FOR ANOTHER ITEM? PUSHJ P,NEWLIN ;NO CRILP2: PUSHJ P,TAB ;TAB BEFORE EACH ITEM MOVE T1,HORPOS CAIGE T1,NCHARS+8 ;SPACED OVER SYMBOLS? JRST CRILP2 ;NO, ANOTHER TAB NEEDED HLRZ C,(P) ;GET LINE NUMBER TRZ C,400000 ;CLEAR DEFINITION FLAG PUSHJ P,PNTDEC SKIPL 0(P) ;IS DEFINITION FLAG SET? JRST CRILP3 ;NO PUSHJ P,PRINT ;YES, FLAG IT ASCIZ / #/ CRILP3: POP P,N JRST CRILUP ;START LOCATION/LINE LISTING CRFEND: IFN FTMAP,[ MOVEI C,[ASCIZ \LOCATION / LINE NUMBER INDEX ; DCODE LOC'N 0 1 2 3 4 5 6 7\] PUSHJ P,SETHDR HRLO FPNT,HIGHPC+1 ;GET HIGHEST LOC'N IN DRAM USED SETCA FPNT, ;USE AS LIMIT ON AOBJN POINTER JRST DLOCST DLCLUP: TRNE FPNT,7 ;TIME FOR A NEW LINE? JRST DLOCL1 ;NO PUSHJ P,NEWLIN ;YES TRNN FPNT,70 PUSHJ P,NEWLIN ;DOUBLE SPACE AFTER 100 DLOCST: PUSHJ P,PRINT ASCIZ /D / ;MARK AS DCODE LOC MOVEI C,(FPNT) ;GET LOCATION PUSHJ P,PNTOC4 ;PRINT IN OCTAL, 4 DIGITS PUSHJ P,TAB DLOCL1: PUSHJ P,TAB ;SPACE OVER MOVEI C,(FPNT) ;COPY LOC'N ROT C,-1 ;PREPARE INDEX INTO DTABL SKIPGE C ;RIGHT OR LEFT? SKIPA C,DTABL(C) ;RIGHT MOVS C,DTABL(C) ;LEFT TLZ C,-1 ;CLEAR OTHER HALF SKIPE C ;IF USED, PUSHJ P,PNTDEC ; PRINT IT AOBJN FPNT,DLCLUP ;GO TO NEXT PUSHJ P,CRLF ;RETURN TO LEFT MARGIN MOVEI C,[ASCIZ \LOCATION / LINE NUMBER INDEX ; UCODE LOC'N 0 1 2 3 4 5 6 7\] PUSHJ P,SETHDR HRLO FPNT,HIGHPC ;GET HIGHEST LOC'N USED SETCA FPNT, ;USE AS LIMIT ON AOBJN POINTER JRST LOCST LOCLUP: TRNE FPNT,7 ;TIME FOR A NEW LINE? JRST LOCL1 ;NO PUSHJ P,NEWLIN ;YES TRNN FPNT,70 ;DOUBLE SPACE AFTER 100 LOC'S PUSHJ P,NEWLIN LOCST: PUSHJ P,PRINT ASCIZ /U / ;MARK AS U LOC MOVEI C,(FPNT) ;GET LOCATION PUSHJ P,PNTOC4 ;PRINT IN OCTAL, 4 DIGITS PUSHJ P,TAB LOCL1: PUSHJ P,TAB ;SPACE OVER HRRZ C,UTABL(FPNT) ;GET LINE # FOR THIS LOCATION JUMPE C,LOCL2 ;LOCATION NOT USED PUSHJ P,PNTDEC ; PRINT IT HLRZ C,UTABL(FPNT) ;GET CHARACTER (REASON FOR LOC) PUSHJ P,PUT LOCL2: AOBJN FPNT,LOCLUP ;GO TO NEXT PUSHJ P,CRLF ;RETURN TO LEFT MARGIN ];END IFN FTMAP ;HERE WHEN LISTING FINISHED TRO F,ERROR\NOHDR ;FORCE NEXT MESSAGE TO TTY SKIPN ERRCNT ;ANY ERRORS? SKIPA N,[[ASCIZ / NO/]] MOVEI N,[ASCIZ / ? /] PUSHJ P,PRINT0 SKIPE C,ERRCNT PUSHJ P,PNTDEC ;NUMBER OF ERRORS IF ANY PUSHJ P,PRINT ASCIZ / ERROR/ MOVEI C,"S ;PLURAL MOVE N,ERRCNT CAIE N,1 ;IS IT PLURAL? PUSHJ P,PUT ;YES PUSHJ P,PRINT ASCIZ / DETECTED END OF MICRO CODE ASSEMBLY USED / .SUSET [.RRUNT,,C] ;GET FINAL RUNTIME SUB C,STTIME ;GET USED RUNTIME (MS) IDIVI C,250. ;GET MILLISECONDS ADDI C,5 ;ROUND TO HUNDREDTH OF SEC IDIVI C,10. IDIVI C,100. ;GET HUNDREDTHS OF SEC PUSH P,C+1 ;SAVE FRACTION PUSHJ P,PNTDEC ;PRINT SECONDS MOVEI C,". PUSHJ P,PUT POP P,C ;RECOVER FRACTION PUSHJ P,PNTDC2 PUSHJ P,PRINT ASCIZ / SECONDS / POPJ P, ;LISTING FINISHED PRINT: POP P,N ;PRINT IN-LINE ASCIZ PUSHJ P,PRINT0 JRST 1(N) CRLF: MOVEI N,[ASCIZ / /] PRINT0: HRLI N,440700 ;PRINT ASCIZ N -> PRINT1: ILDB C,N JUMPE C,CPOPJ PUSHJ P,PUT JRST PRINT1 PNTSX0: HRLI N,440600 ;SIXBIT PRINTER PNTSX1: TLNN N,770000 POPJ P, ILDB C,N JUMPE C,CPOPJ ADDI C,40 ;CONVERT TO ASCII PUSHJ P,PUT JRST PNTSX1 PNTOCT: TDZA T1,T1 PNTOC4: MOVEI T1,4 PNTOC2: PUSHJ P,SGNCHK PNTOC3: IDIVI C,8 HRLM C+1,(P) SOSG T1 SKIPE C PUSHJ P,PNTOC3 JRST PNTDC4 PNTDEC: TDZA T1,T1 PNTDC2: MOVEI T1,2 PUSHJ P,SGNCHK PNTDC3: IDIVI C,10. HRLM C+1,(P) SOSG T1 SKIPE C PUSHJ P,PNTDC3 PNTDC4: HLRE C,(P) MOVMS C ADDI C,"0 JRST PUT SGNCHK: JUMPGE C,CPOPJ PUSH P,C MOVEI C,"- PUSHJ P,PUT POP P,C MOVMS C POPJ P, NEWLIN: PUSHJ P,CRLF ;SEND END OF LINE MOVE N,VERPOS ;HOW FAR DOWN PAGE CAMGE N,LPPAG ;COMPARE LINES PER PAGE LIMIT POPJ P, JRST FORM ;EJECT & PRINT NEW HEADER SETHDR: HRRZM C,HDRPNT ;SAVE ADDR OF NEW SUBHEADER FORM: SKIPN VERPOS ;ALREADY AT TOP OF PAGE? POPJ P, ;YES, DON'T BE REDUNDANT SKIPA C,[14] ;AND GET NEW PAGE TAB: MOVEI C,11 ; JRST PUT PUT: SKIPGE PAGNUM ;IS PAGE HEADER FLAG SET? PUSHJ P,HEADER ;NEW HEADER FOR NEW PAGE SOSG OUTCNT PUSHJ P,OUTRFL IDPB C,OUTPNT CAIE C,^L ;DON'T FORMFEED THE TERMINAL JRST [ TRNE F,ERROR .IOT TYOC,C JRST .+1 ] TRNN C,140 ;SPACING CHARACTER? JRST PUT2 ;NO AOS HORPOS ;INDEX HORIZONTAL LINE POSITION POPJ P, PUT2: CAIN C,14 JRST [ AOS PAGNUM HRROS PAGNUM ;SET HEADER FLAG SETZM VERPOS POPJ P, ] CAIN C,15 SETZM HORPOS ;ZERO POSITION FOR CARRIAGE RETURN CAIN C,12 ;LF? AOS VERPOS ;YES, COUNT NEW LINE CAIE C,11 POPJ P, ;NOT HORIZONTAL TAB EXCH C,HORPOS IORI C,7 ADDI C,1 EXCH C,HORPOS POPJ P, TABTON: PUSHJ P,TAB CAMLE N,HORPOS JRST TABTON POPJ P, ;OUTPUT LAST BUFFERFULL OUTCLS: MOVE T1,OUTPNT ;FILL LAST WORD WITH EOF CHRS MOVEI C,^C IDPB C,T1 TLNE T1,760000 JRST .-2 ;THEN FALL INTO OUTRFL ;OUTPUT BUFFER REFILL OUTRFL: PUSH P,C SKIPN C,OUTPNT ;GET NUMBER OF WORDS GENERATED SO FAR JRST OUTRF1 HRLOI C,-OUTBUF(C) ;AND MAKE AOBJN POINTER (ASSUMING NO PARTIAL WORDS) EQVI C,OUTBUF .IOT OUTCHN,C JUMPGE C,OUTRF1 .VALUE ;FAILED TO TRANSMIT ALL THE CRUFT? OUTRF1: MOVE C,[440700,,OUTBUF] MOVEM C,OUTPNT MOVEI C,5*BUFL MOVEM C,OUTCNT POP P,C POPJ P, ;PRINT HEADER ROUTINE HEADER: HRRZS PAGNUM TRNN F,NOHDR ;HEADERS SUPPRESSED? TRNN F,PASS2 POPJ P, PUSH P,16 ;SAVE AC'S 0-16 MOVEI 16,1(P) BLT 16,16(P) ADD P,[16,,16] TRZ F,ERROR ;DON'T SEND HEADER TO TTY ; WILL BE RESTORED WITH AC'S PUSHJ P,PRINT ASCIZ /; / MOVEI N,OUTFIL ;GET ADR OF OUTPUT FILE DESCRIPTOR PUSHJ P,HEDNAM ;AND PRINT THE DESCRIPTOR MOVEI N,32. PUSHJ P,TABTON ;POSITION THE VERSION STUFF PUSHJ P,PRINT ASCIZ /MICRO / MOVEI N,[.FNAM2] PUSHJ P,PNTSX0 MOVEI N,48. ;SPACE OVER TO TITLE PUSHJ P,TABTON SKIPN N,TTLPNT ;IS THERE A TITLE? MOVEI N,[ASCIZ /MICROCODE FILE/] PUSHJ P,PRINT0 ;PRINT A TITLE ;HERE TO DO PAGE # & 2ND LINE OF HEADER PUSHJ P,PRINT ASCIZ / PAGE / HRRZ C,PAGNUM PUSHJ P,PNTDEC ;PRINT PAGE NUMBER PUSHJ P,PRINT ASCIZ / ; / SKIPE N,HDRPNT ;SPECIAL HEADER? JRST HEAD5 ;YES MOVEI N,INFILE ;GET CURRENT INPUT FILE DESCRIPTOR PUSHJ P,HEDNAM MOVEI N,48. PUSHJ P,TABTON ;TAB OVER FOR SUBTITLE HLRZ N,TOCPNT ;GET SUBTTL STRING ADDR JUMPE N,HEAD6 ;MAKE SURE THERE'S SOMETHING TO PRINT MOVEI N,1(N) ;POINT TO TEXT STRING HEAD5: PUSHJ P,PRINT0 ;PRINT SUBTTL OR SPECIAL HEADER HEAD6: PUSHJ P,CRLF PUSHJ P,CRLF SUB P,[16,,16] MOVSI 16,1(P) BLT 16,15 POP P,16 POPJ P, ;SUBR TO PRINT FILENAME, TIME, AND DATE HEDNAM: PUSH P,N ;SAVE DESCRIPTOR POINTER ADDI N,F.DEV PUSHJ P,PNTSX0 MOVEI C,": PUSHJ P,PUT MOVEI C,40 PUSHJ P,PUT MOVE N,(P) ADDI N,F.PPN PUSHJ P,PNTSX0 MOVEI C,"; PUSHJ P,PUT MOVEI C,40 PUSHJ P,PUT MOVE N,(P) ADDI N,F.NAM ;POINT TO FILE NAME PUSHJ P,PNTSX0 MOVEI C,40 PUSHJ P,PUT MOVE N,(P) ADDI N,F.EXT PUSHJ P,PNTSX0 PUSHJ P,TAB POP P,N ;GET POINTER TO BLOCK BACK MOVE C,F.TIM(N) LSH C,-2 ASH C,-2 AOJE C,CPOPJ ;SUPPRESS DATE/TIME IF "-" HRRZ C,F.TIM(N) ;GET 1/2 SECONDS SINCE MIDNIGHT LSH C,-1 IDIVI C,3600. PUSH P,C1 PUSHJ P,PNTDC2 ;HOURS MOVEI C,": PUSHJ P,PUT POP P,C IDIVI C,60. PUSH P,C1 PUSHJ P,PNTDC2 ;MINUTES MOVEI C,": PUSHJ P,PUT POP P,C PUSHJ P,PNTDC2 ;SECONDS MOVEI C,40 PUSHJ P,PUT LDB C,[.BP (37),F.TIM(N)] PUSHJ P,PNTDEC ;DAY LDB C,[.BP (740),F.TIM(N)] PUSH P,N MOVEI N,[SIXBIT /-JAN-/ SIXBIT /-FEB-/ SIXBIT /-MAR-/ SIXBIT /-APR-/ SIXBIT /-MAY-/ SIXBIT /-JUNE-/ SIXBIT /-JULY-/ SIXBIT /-AUG-/ SIXBIT /-SEPT-/ SIXBIT /-OCT-/ SIXBIT /-NOV-/ SIXBIT /-DEC-/ ]-1(C) ;INDEX INTO TABLE BY MONTH PUSHJ P,PNTSX0 POP P,N LDB C,[.BP (177000),F.TIM(N)] PUSHJ P,PNTDEC ;YEAR POPJ P, SUBTTL MICRO-LOCATION ASSIGNMENT ;ADD LOCTAB ENTRY ;N HAS DESIRED WORD, EXCEPT T1 HAS %%LCOP FIELD ;ON PASS 2, PC IS RETURNED IN N FOR OPS THAT GET A PC ADDLOC: DPB T1,[%%LCOP,,N] ;COMPLETE DESIRED WORD SKIPL T1,LOCPNT JRST ADDLC9 ;AOBJN POINTER COUNTED OUT LAST TIME ADD T1,[1,,1] MOVEM T1,LOCPNT TRNE F,PASS2 JRST ADDLC2 MOVEM N,LOCTAB-1(T1) ;PASS 1 - JUST ADD TO TABLE POPJ P, ADDLC2: XOR N,LOCTAB-1(T1) ;PASS 2 - VERIFY AGAINST TABLE TLZ N,077777 ;CLEAR %LCLOC, %%LCPC JUMPN N,ADDLC3 ;VALUES DON'T AGREE LDB N,[%%LCPC,,LOCTAB-1(T1)] POPJ P, ADDLC3: LDB N,[%%LCOP,LOCTAB-1(T1)] ;MAYBE A SAVED ERROR MESSAGE CAIN N,%LCERR MSG CPOPJ,!! LOCTAB PHASE ERROR !! MOVS N,LOCTAB-1(T1) ;MSG COMES FROM RH OF LOCTAB ENTRY HRRI N,CPOPJ ;EXIT ACTION IS JUST RETURN 1000,,N ;COMPLAIN ADDLC9: TRNN F,PASS2 MSG STOP,!! LOCTAB NOT BIG ENOUGH !! MSG STOP,!! PASS 2 READ PAST END OF LOCTAB !! ;SEARCH FOR FREE MICRO WORDS. ; LOCPAT CONTAINS THE 1'S PATTERN ; LOCAST CONTAINS THE ASTERISK "DON'T CARE" PATTERN ; FRECNT CONTAINS THE SIZE OF THE BLOCK WITHIN WHICH ; THE PATTERN OF LOCPAT EXISTS. FRECNT IS ALWAYS ; A SINGLE BIT. ;SUBROUTINE RETURNS THE 1ST LOCATION MEETING CRITERIA AND SKIPS. ;IF CRITERIA CANNOT BE MET WITH ANY LOCATION, THEN NO SKIP ;*** TEMPORARY HACK: *** ; IF THE PATTERN IS MORE THAN 5 BITS WIDE, MATCH IT, ; BUT DO NOT LOOK FOR FREE WORDS OUTSIDE A 32-WORD BLOCK, ; AND RESTRICT PC DEFAULT PROGRESSION TO 32-WORD BLOCK. FREWRD: JUMPN RAM,STOP MOVE T1,LOCPAT ;GET PATTERN TO MATCH IOR T1,LOCAST ;COUNT IN THE *'S ANDI T1,FRESIZ-1 ;*** LOOK ONLY AT LOW BITS *** MOVE T1,FRETAB(T1) ;GET LIST OF WORDS FITTING PATTERN MOVEI T2,FRESIZ ;TABLE IS BUILT FOR 32 WORDS SUB T2,FRECNT ;GET # OF WORDS TO THROW AWAY SKIPL T2 ;*** NO SHIFT IF NEGATIVE *** LSH T1,(T2) ; AND THROW THEM AWAY MOVEM T1,FREMSK' ;SAVE PATTERN FOR MATCHING MOVSI N,-MAXPC/36. ;SET UP TABLE LENGTH FREE2: SETCM T1,USAGE(N) ;GET 1'S FOR FREE PC BITS FREE3: JFFO T1,FREE5 ;IF ANY FREE HERE, XFER AOBJN N,FREE2 ;KEEP LOOKING UNTIL ALL GONE POPJ P, ;NO SUCH STRING FREE5: HRRZ N1,T1+1 ;GET LEFT MOST BIT # TO BETTER PLACE SETCM T1+1,USAGE+1(N) ;GET FREE BITS FROM NEXT WORD LSHC T1,(N1) ;PUT 1ST FREE BIT INTO BIT 0 MOVE T2,T1 ;COPY AND T2,FREMSK ;LOOK ONLY FOR REQUIRED STRING HRRZ T3,N ;GET PC FOR THIS BIT IMULI T3,36. ADD T3,N1 MOVE T4,FRECNT ;GET MASK FOR PC ZEROS SUBI T4,1 ;POWER OF 2 CHANGED TO STRING OF 1'S AND T4,T3 ;GET PC BITS TO TEST ANDCM T4,LOCAST ;IGNORE PLACES WHERE *'S ARE IN PATTERN CAMN T2,FREMSK ;PC BITS FREE? CAME T4,LOCPAT ;CORRECT BIT PATTERN? JRST FREE6 ;NO OR NO BLKCNT: MOVN T1,FRECNT ;COUNT WORDS IMPLIED BY FRECNT ORCMI T1,FRESIZ-1 ;*** IF FRECNT .GT. FRESIZ, USE FRESIZ *** ANDCB T1,LOCPAT ; AND LOCPAT ANDCM T1,LOCAST ;*'S DON'T COUNT MOVSI N,-1 BLKC2: JUMPN T1,[ANDI T1,-1(T1) ASH N,1 JRST BLKC2 ] HRR N,T3 ;INSERT PC JRST CPOPJ1 FREE6: MOVEI T4,1 ;THROW AWAY 1 FREE WORD LSH T1,(T4) ; AND WIPE OUT THAT MANY BITS ADD N1,T4 ;CALC TOTAL # OF SHIFT PLACES MOVNS N1 LSH T1,(N1) ; AND SHIFT PC BITS BACK TO PLACE JRST FREE3 ;GO LOOK SOME MORE FRESIZ==32. ;TABLE IS 32 WORDS OF 32 BITS FRETAB: .BYTE 1 REPEAT 32.,[ .WALGN XB==.RPCNT REPEAT 32., IFE .RPCNT&XB,[1]+0 ] .BYTE PCNEXT: JUMPN RAM,PCNXT1 ;DRAM JUST INCREMENTS MOVE N,PC(RAM) JUMPGE N,PCNXT1 ;IF NOT IN ADR BLOCK, IS UNCONSTRAINED MOVE T2,N ;FIND BITS IN PC THAT AND T2,LOCAST ; SHOULD NOT CHANGE IOR N,LOCAST ;INSERT BITS TO PROPOGATE CARRIES AOBJP N,PCNXT1 ;IF .GE. 0, ADR BLOCK ENDED IOR N,LOCPAT ;RE-INSERT BITS THAT MUST BE 1'S ANDCM N,LOCAST ;MAKE ROOM FOR PC BITS THAT MUST NOT IOR N,T2 ; CHANGE, AND INSERT THEM MOVEM N,PC(RAM) POPJ P, ;NEXT PC WHEN UNCONSTRAINED ;IF NOT SEQUENTIAL ADDRESS MODE, THIS PC+1 WILL GET CLOBBERED LATER PCNXT1: HRRZS PC(RAM) ;CLEAR ADR BLOCK FLAG AOS N,PC(RAM) POPJ P, ;TEST PC LOCATION FOR PREVIOUS USAGE ; IF USED, NO SKIP ;IF NOT USED, SKIP USEDPC: HRRZ N,PC(RAM) JUMPN RAM,USED1 ;DIFFERENT IF DISPATCH CAIN N,-1 JRST CPOPJ1 ;PC NOT KNOWN YET IDIVI N,36. MOVN T1,N1 ;NEGATE REMAINDER FOR RIGHT SHIFTS MOVSI N1,(SETZ) LSH N1,(T1) TDNN N1,USAGE(N) AOS (P) IORM N1,USAGE(N) POPJ P, USED1: TRNN F,PASS2 ;COLLECT THIS ON PASS 2 ONLY JRST CPOPJ1 ROT N,-1 ;DIVIDE BY 2 JUMPL N,USED2 ;ODD, USE RH HLRZ N1,DTABL(N) ;PREVIOUS CONTENTS JUMPN N1,CPOPJ ;ERROR IF ALREADY SET MOVE N1,LINNUM ;ELSE GET THIS LINE # HRLM N1,DTABL(N) ;AND RECORD IT JRST CPOPJ1 ;OK RETURN USED2: HRRZ N1,DTABL(N) JUMPN N1,CPOPJ MOVE N1,LINNUM HRRM N1,DTABL(N) JRST CPOPJ1 SUBTTL UUO HANDLER - ERROR MESSAGE PRINTER UUOH: PUSH P,C LDB C,[331100,,40] ;GET OPCODE CAIN C,1 JRST UUOHM ;MSG CAIE C,2 .VALUE ;ILUUO - E.G. HALT MOVE C,40 ;OUTSTR HRLI C,440700 PUSH P,N UUOHOS: ILDB N,C JUMPE N,UUOHSX .IOT TYOC,N JRST UUOHOS UUOHSX: POP P,N POP P,C POPJ P, ;HERE TO PRINT ERROR MESSAGE ;CALLED BY LUUO UUOHM: TRO F,ERROR AOS ERRCNT EXCH N,40 HRRZ T1,(N) MOVEM T1,-1(P) ;SAVE RETURN PUSH P,40 ;SAVE N SKIPN OUTFIL+F.DEV ;IS THERE A FILE ONTO WHICH TO PUT MESSAGE? JRST NOEFIL ;NOPE, JUST TTY ;FIRST LINE -- MESSAGE TEXT AS SPECIFIED BY CALLER .IOT TYOC,[15] ;BLANK LINE ON TTY FOR READABILITY .IOT TYOC,[12] MOVEI C,"; ;PUT ERROR COMMENT PUSHJ P,PUT HLRZ N,(N) ;GET ADR OF MSG PUSHJ P,PRINT0 ;SECOND LINE -- CONTEXT OF ERROR PUSHJ P,PRINT ASCIZ / ; / SKIPN RAM TRNE F,PASS2 CAIA JRST UUOHM1 ;UCODE PC NOT KNOWN ON PASS 1 MOVEI N,[ ASCII /U= / ASCII /D= / ](RAM) PUSHJ P,PRINT0 HRRZ C,PC(RAM) PUSHJ P,PNTOC4 MOVEI N,[ASCIZ /, /] UUOHM1: SKIPN NAME SKIPE FIELD PUSHJ P,PRINT0 ;GIVE COMMA SPACE IF FIELD OR NAME TO BE PRINTED MOVEI N,FIELD PUSHJ P,PRINT0 MOVEI C,"/ SKIPE FIELD PUSHJ P,PUT MOVEI N,NAME PUSHJ P,PRINT0 MOVE N,I.MAXC ;# OF SOURCE FILES CAIG N,1 ; MORE THAN ONE? JRST UUOHP ;NO. NO NEED TO IDENTIFY WHICH PUSHJ P,PRINT ;YES. IDENTIFY IT ASCIZ /, FILE= / MOVEI N,INFILE+F.DEV PUSHJ P,PNTSX0 PUSHJ P,PRINT ASCIZ/: / MOVEI N,INFILE+F.PPN PUSHJ P,PNTSX0 PUSHJ P,PRINT ASCIZ/; / MOVEI N,INFILE+F.NAM ;ADDR OF CURRENT INPUT NAME PUSHJ P,PNTSX0 ;PRINT IT MOVEI C,40 PUSHJ P,PUT MOVEI N,INFILE+F.EXT PUSHJ P,PNTSX0 UUOHP: TRNN F,PASS2 JRST UUOHL ;PAGE # MEANINGLESS ON PASS 1 PUSHJ P,PRINT ASCIZ /, PAGE= / HRRZ C,PAGNUM PUSHJ P,PNTDEC UUOHL: PUSHJ P,PRINT ASCIZ /, LINE= / HRRZ C,LINNUM PUSHJ P,PNTDEC IFN FTECHR,[ PUSHJ P,PRINT ASCIZ /, CHAR= / MOVE C,-1(P) ;GET C BACK MOVEI T1,3 ;TYPE 3 OCTAL DIGITS PUSHJ P,PNTOC2 ];END IFN FTECHR PUSHJ P,CRLF MOVEI C,"? PUSHJ P,PNTLST POP P,N POP P,C POPJ P, NOEFIL: HLRZ N,(N) ;ADDR OF MESSAGE .IOT TYOC,["?] ;MAKE IT ERROR-FORM OUTSTR (N) ;TYPE MESSAGE OUTSTR [ASCIZ / /] EXIT STOP: REPEAT 16.,MOVEM .RPCNT,SAVACS+.RPCNT MSG .+1,[ INTERNAL ERROR, "SAVE" CORE IMAGE AND (DON'T REALLY!) CALL JUD LEONARD, MARLBORO, X6104] .VALUE SUBTTL OPEN INPUT FILE BEGIO: MOVE T1,I.MAXC ;START LOOKING AT 1ST FILE MOVNM T1,I.CNT ;INIT COUNTER TO NUMBER OF FILES NXTFIL: SETOM ENDFIL ;SET END-OF-FILE INDICATOR SKIPL I.CNT POPJ P, ;NO FILES LEFT MOVE C,I.MAXC ;GET NEXT INPUT FILE DESCRIPTOR ADD C,I.CNT ;C HAS FILE NUMBER IMULI C,I.LEN ADDI C,I.STG ;NOW C -> FILE DESC .CALL [ SETZ SIXBIT/OPEN/ [.BAI,,INCHN] I.DEV(C) I.NAM(C) I.EXT(C) SETZ I.PPN(C) ] PUSHJ P,IFOPER MOVE C,I.DEV(C) ;.RCHST SCREWS DEVICE NAME MOVEM C,INFILE+F.DEV MOVE C,[INCHN,,RCHST] .RCHST C, MOVE C,RCHST+1 MOVEM C,INFILE+F.NAM MOVE C,RCHST+2 MOVEM C,INFILE+F.EXT MOVE C,RCHST+3 MOVEM C,INFILE+F.PPN SETO C, .CALL [ SETZ 'RFDATE MOVEI INCHN SETZM INFILE+F.TIM ] PUSHJ P,IFOPER AOS I.CNT ;NEXT FILE SETZM ENDFIL ;CLEAR END-OF-FILE INDICATOR CPOPJ1: AOSA (P) ;FILE FOUND, SKIP RETURN POP1J: SUB P,[1,,1] CPOPJ: POPJ P, .TNEWL==CPOPJ ;??? ;FILE SYSTEM ERROR HANDLING OFOPER: MOVEI C,O.DEV IFOPER: PUSH P,T1 PUSH P,T2 .IOT TYOC,[^M] .IOT TYOC,["?] .IOT TYOC,[" ] .OPEN ERRC,[.UAI,,'ERR ? 1] .LOSE %LSFIL IFOPE1: .IOT ERRC,T1 CAIGE T1,40 JRST IFOPE2 .IOT TYOC,T1 JRST IFOPE1 IFOPE2: .CLOSE ERRC, SKIPGE C EXIT .IOT TYOC,[40] .IOT TYOC,["-] .IOT TYOC,[40] MOVE T2,I.DEV(C) PUSHJ P,IFOPE3 .IOT TYOC,[":] MOVE T2,I.PPN(C) PUSHJ P,IFOPE3 .IOT TYOC,[";] MOVE T2,I.NAM(C) PUSHJ P,IFOPE3 .IOT TYOC,[40] MOVE T2,I.EXT(C) PUSHJ P,IFOPE3 .IOT TYOC,[15] PUSH P,FPNT PUSH P,SPNT PUSH P,T3 PUSH P,T4 OUTSTR [ASCIZ/USE WHAT FILENAME INSTEAD? /] PUSHJ P,FNR."RLINE SETOM 1FLFLG MOVE FPNT,C PUSHJ P,FNR."FNRAA IRPS R,,T4 T3 SPNT FPNT T2 T1 POP P,R TERMIN SOS (P) SOS (P) POPJ P, ;RETRY THE .CALL IFOPE3: MOVEI T1,0 LSHC T1,6 ADDI T1,40 .IOT TYOC,T1 JUMPN T2,IFOPE3 POPJ P, SUBTTL MOOOOBY TABLES DEFTAB: 0,,BITSET ;TABLE OF SPECIAL DEFINE FUNCTIONS "+,,PCINC ;PUT PC INTO VALUE FIELD "D,,BITSET ;DEFAULT FUNCTION FOR FIELDS "T,,TIMSET ;DEFAULT FUNCTION FOR TIME FIELD "P,,PARITY ;PARITY DEFAULT FUNCTION "F,,DFLOTH ;DEFAULT TO OTHER FIELD DEFTND: NDFTAB: NGETA6 NGETA6 NGETA7 ;D NGETA6 NGETA6 NGETA8 ;F DEFTYP: POINT 1,SYMVAL(SPNT),0 ;"UCODE" OR "DISP" NUMBER DEFFLG: POINT 1,SYMVAL(SPNT),1 ;FLAGS FOR A SYMBOL DEFTM1: POINT 4,SYMVAL(SPNT),5 ;TIME VALUE #1 DEFTM2: POINT 4,SYMVAL(SPNT),9 ;TIME VALUE #2 DEFPOS: POINT 8,SYMVAL(FPNT),9 ;MICRO WORD POSITION DEFSIZ: POINT 5,SYMVAL(FPNT),14 ;MICRO WORD FIELD SIZE DEFFNC: POINT 3,SYMVAL(SPNT),17 ;FUNCTION TO EXECUTE DEFVAL: POINT 18,SYMVAL(SPNT),35 ;VALUE OF SYMBOL (RH OF SYMVAL) ;FIELD NAME FOR MACRO DEFINITIONS MACRO: ASCIZ /MACRO%/ REPEAT NWORDS-2,0 SWTCH: ASCIZ /SWITCH%/ REPEAT NWORDS-2,0 ;CHARACTER TABLES COL==1 COM==2 EOL==3 EQL==4 QOT==5 SLSH==6 TOKTYP: POINT 3,CHRTAB(C),2 ;GET CHARACTER TYPE FOR TOKEN BUILDER STAPNT: POINT .SZTRM,CHRTAB(C),2+.SZTRM ;TERM TYPE FOR TOP LEVEL STATE GETPNT: POINT 7,CHRTAB(C),35 ;CHARACTER TRANSLATION IF2 .SHTRM==41-.SZTRM DEFINE BYTS A,B,C _41+_.SHTRM+ TERMIN CHRTAB: ;CHARACTER LOOK UP TABLE ;FIRST PARAMETER IS CHARACTER TYPE ;SECOND IS TERMINATOR SUB-TYPE ;THIRD IS TRANSLATED VALUE BYTS ,,0 ; NUL BYTS 7,,1 ; DOWN ARROW BYTS 7,,2 ; ALPHA BYTS ,,0 ; EOF CHARACTER (MUST IGNORE) BYTS 7,,4 ; LOGICAL AND BYTS 7,,5 ; LOGICAL NOT BYTS 7,,6 ; EPSILON BYTS 7,,7 ; PI BYTS ,,10 ; BACKSPACE BYTS ,,40 ; TAB BYTS ,EOL,12 ; LF BYTS ,EOL,12 ; VT BYTS ,EOL,12 ; FF BYTS ,,00 ; CR BYTS 7,,16 ; INFINITY BYTS 7,,17 ; PARTIAL DERIVATIVE BYTS 7,,20 ; LEFT LUMP BYTS 7,,21 ; RIGHT LUMP BYTS 7,,22 ; UP LUMP BYTS 7,,23 ; DOWN LUMP BYTS 7,,24 ; FOR ALL BYTS 7,,25 ; THERE EXISTS BYTS 7,,26 ; WHEEL BYTS 7,,27 ; LEFT-RIGHT ARROW BYTS 7,,30 ; LEFT ARROW BYTS 7,,31 ; RIGHT ARROW BYTS 7,,32 ; NOT EQUAL BYTS 7,,33 ; ALTMODE BYTS 7,,34 ; LESS OR EQUAL BYTS 7,,35 ; GREATER OR EQUAL BYTS 7,,36 ; EQUIVALENCE BYTS 7,,37 ; LOGICAL OR BYTS 1,,040 ; SP BYTS 7,,041 ; ! BYTS ,QOT,042 ; " BYTS 7,,"# ; # BYTS ,,"$ ; $ BYTS ,,"% ; % BYTS ,,"& ; & BYTS ,,"' ; ' BYTS 7,,"( ; ( BYTS 7,,") ; ) BYTS 7,,"* ; * BYTS 3,,"+ ; + BYTS ,COM,[",] ; , BYTS 4,,"- ; - BYTS 2,,". ; . BYTS ,SLSH,"/ ; / BYTS 5,,"0 ; 0 BYTS 5,,"1 ; 1 BYTS 5,,"2 ; 2 BYTS 5,,"3 ; 3 BYTS 5,,"4 ; 4 BYTS 5,,"5 ; 5 BYTS 5,,"6 ; 6 BYTS 5,,"7 ; 7 BYTS 6,,"8 ; 8 BYTS 6,,"9 ; 9 BYTS ,COL,": ; : BYTS ,EOL,073 ; ; BYTS ,,074 ; < BYTS ,EQL,"= ; = BYTS ,,076 ; > BYTS ,,"? ; ? BYTS ,,"@ ; @ BYTS 7,,"A ; A BYTS 7,,"B ; B BYTS 7,,"C ; C BYTS 7,,"D ; D BYTS 7,,"E ; E BYTS 7,,"F ; F BYTS 7,,"G ; G BYTS 7,,"H ; H BYTS 7,,"I ; I BYTS 7,,"J ; J BYTS 7,,"K ; K BYTS 7,,"L ; L BYTS 7,,"M ; M BYTS 7,,"N ; N BYTS 7,,"O ; O BYTS 7,,"P ; P BYTS 7,,"Q ; Q BYTS 7,,"R ; R BYTS 7,,"S ; S BYTS 7,,"T ; T BYTS 7,,"U ; U BYTS 7,,"V ; V BYTS 7,,"W ; W BYTS 7,,"X ; X BYTS 7,,"Y ; Y BYTS 7,,"Z ; Z BYTS 7,,133 ; [ BYTS ,,"\ ; \ BYTS 7,,135 ; ] BYTS ,,"^ ; ^ BYTS 7,,"_ ; _ BYTS ,,140 ; ` BYTS 7,,"A ; A (LOWER CASE) BYTS 7,,"B ; B BYTS 7,,"C ; C BYTS 7,,"D ; D BYTS 7,,"E ; E BYTS 7,,"F ; F BYTS 7,,"G ; G BYTS 7,,"H ; H BYTS 7,,"I ; I BYTS 7,,"J ; J BYTS 7,,"K ; K BYTS 7,,"L ; L BYTS 7,,"M ; M BYTS 7,,"N ; N BYTS 7,,"O ; O BYTS 7,,"P ; P BYTS 7,,"Q ; Q BYTS 7,,"R ; R BYTS 7,,"S ; S BYTS 7,,"T ; T BYTS 7,,"U ; U BYTS 7,,"V ; V BYTS 7,,"W ; W BYTS 7,,"X ; X BYTS 7,,"Y ; Y BYTS 7,,"Z ; Z BYTS ,,173 ; { BYTS ,,174 ; | BYTS ,,175 ; } BYTS ,,176 ; ~ BYTS ,,000 ; DEL IFN .-CHRTAB-128.,.ERR CHARACTER TABLE MESSED UP IF1,[ .MXSTA==0 .MXTOK==0 .MXTRM==0 .MXDSP==0 DEFINE ITEM STATE,.TOKTYP,.TRMTYP,.DISP,.NSTATE IRPS TOKTYP,,[.TOKTYP]TRMTYP,,[.TRMTYP]DISP,,[.DISP]NSTATE,,[.NSTATE] IFG STATE-.MXSTA,.MXSTA==STATE IFG TOKTYP-.MXTOK,.MXTOK==TOKTYP IFG TRMTYP-.MXTRM,.MXTRM==TRMTYP IFG DISP-STDISP-.MXDSP,.MXDSP==DISP-STDISP IFG NSTATE-.MXSTA,.MXSTA==NSTATE .STOP TERMIN TERMIN ;END OF DEFINE ITEM DEFINE EXPAND N BLOCK 1 TERMIN ;END OF DEFINE EXPAND ];END OF IF1 IF2,[ DEFINE ITEM STATE,.TOKTYP,.TRMTYP,.DISP,.NSTATE IRPS TOKTYP,,[.TOKTYP]TRMTYP,,[.TRMTYP]DISP,,[.DISP]NSTATE,,[.NSTATE] .XE==_.SZTRM+TRMTYP .XN==36./<.SZDSP+.SZSTA> .XV==_.SZSTA+NSTATE INSERT \<.XE/.XN>,\<.XE-.XE/.XN*.XN> .STOP TERMIN TERMIN ;END OF DEFINE ITEM DEFINE INSERT Q,R IFNDEF .ENT!Q,.ENT!Q==0 .ENT!Q==.ENT!Q+.XV_<36.-*<.SZDSP+.SZSTA>> TERMIN ;END OF DEFINE INSERT DEFINE EXPAND N IFNDEF .ENT!N,.ENT!N==0 .ENT!N TERMIN ;END OF DEFINE EXPAND ];END OF IF2 ; OLD STATE TOKEN TERM DISP NEW STATE ITEM 0, .TKB, EQL, DLBLK, 0 ITEM 0, .TKS, COL, DTAG, 0 ITEM 0, .TKN, COL, DLSET, 0 ITEM 0, .TKS, EQL, DDEFS, 0 ITEM 0, .TKS, SLSH, DCFLD, 1 ITEM 0, .TKS, QOT, DMDEF, 0 ITEM 0, .TKS, EOL, DSUDO, 0 ITEM 0, .TKS, COM, DMAC, 0 ITEM 0, .TKB, EOL, DNOP, 0 ;?? ITEM 1, .TKS, EQL, DDEFS, 0 ITEM 1, .TKB, EQL, DDEFF, 0 ITEM 1, .TKS, COM, DFSYM, 2 ITEM 1, .TKS, EOL, DFSYM, 0 ITEM 1, .TKN, COM, DFNUM, 2 ITEM 1, .TKN, EOL, DFNUM, 0 ITEM 2, .TKS, SLSH, DFLD, 3 ITEM 2, .TKS, COM, DMAC, 2 ITEM 2, .TKS, EOL, DMAC, 2 ITEM 2, .TKB, EOL, DNOP, 2 ITEM 3, .TKS, COM, DFSYM, 2 ITEM 3, .TKS, EOL, DFSYM, 0 ITEM 3, .TKN, COM, DFNUM, 2 ITEM 3, .TKN, EOL, DFNUM, 0 IFN FTIF,[ ;CONDITIONAL ASSEMBLY STATES ITEM 4, .TKB, EQL, DCMNT, 4 ITEM 4, .TKS, COL, DNOP, 4 ITEM 4, .TKN, COL, DNOP, 4 ITEM 4, .TKS, EQL, DCMNT, 4 ITEM 4, .TKS, SLSH, DCFLD, 4 ITEM 4, .TKS, QOT, DCMNT, 4 ITEM 4, .TKS, EOL, DCMNT, 4 ITEM 4, .TKS, COM, DCMNT, 4 ITEM 4, .TKB, EOL, DCMNT, 4 ];END IFN FTIF ;STATE MEANING ; 0 START OF LINE/MICROWORD ; 1 SYMBOL/ SCANNED AT START OF LINE/MICROWORD ; 2 COMMA SEEN, SO IN MIDDLE OF MICROWORD ; 3 SYMBOL/ SCANNED IN MIDDLE OF MICROWORD ; 4 ASSEMBLY SUPPRESSED DEFINE LOG2 AA,B IRPS A,,[AA] A==0 REPEAT 35.,IFGE B-1_A,A==A+1 TERMIN TERMIN ;END OF DEFINE LOG2 LOG2 .SZTOK=,.MXTOK LOG2 .SZSTA=,.MXSTA LOG2 .SZTRM=,.MXTRM LOG2 .SZDSP=,.MXDSP STAMTB: PINDEX .SZDSP+.SZSTA,STATAB(T1) STATAB: ;EXPANSION OF STATE TABLE REPEAT 1+<1_<.SZSTA+.SZTOK+.SZTRM>/<36./<.SZDSP+.SZSTA>>>,[ EXPAND \.RPCNT ] ;FAKED SYMBOL TABLE ENTRIES FOR PSEUDO OPS PSUDO%: XWD ..DCD,0 ;FIELD NODE ..DCD: XWD ..UCD,$DCODE ;SYMBOL NODE ASCII /DISPATCH/ REPEAT NWORDS-2,0 ..UCD: XWD .BIN,$UCODE ASCII /UCODE/ REPEAT NWORDS-1,0 .BIN: XWD .DCODE,$BIN ASCII /.BIN/ REPEAT NWORDS-1,0 .DCODE: XWD .NOBIN,$DCODE ;SYMBOL NODE ASCII /.DCODE/ REPEAT NWORDS-2,0 .NOBIN: XWD .SEQAD,$NOBIN ASCII /.NOBIN/ REPEAT NWORDS-2,0 .SEQAD: XWD .UCODE,$SEQAD ASCII /.SEQADR/ REPEAT NWORDS-2,0 .UCODE: XWD 0,$UCODE ;END OF PSEUDO-OP TABLE ASCII /.UCODE/ REPEAT NWORDS-2,0 PSUDM%: XWD .TITLE,0 ;FIELD NODE FOR PSEUDO-MACROS .TITLE: XWD .TOC,$TITLE ASCII /.TITLE/ REPEAT NWORDS-2,0 .TOC: XWD 0,$TOC ASCII /.TOC/ REPEAT NWORDS-1,0 ;FAKED SYMBOL TABLE ENTRIES FOR CONDITIONAL ASSEMBLY OPERATORS IFN FTIF,[ PSUDF%: XWD .CHNG,0 ;FIELD NODE FOR PSEUDO-FIELDS .CHNG: XWD .DEFLT,$CHNG ASCII /.CHANGE/ REPEAT NWORDS-2,0 .DEFLT: XWD .ENDIF,$DEFLT ASCII /.DEFAULT/ REPEAT NWORDS-2,0 .ENDIF: XWD .IF,$ENDIF ASCII /.ENDIF/ REPEAT NWORDS-2,0 .IF: XWD .IFNOT,$IF ASCII /.IF/ REPEAT NWORDS-1,0 .IFNOT: XWD .PAGEL,$IFNOT ASCII /.IFNOT/ REPEAT NWORDS-2,0 .PAGEL: XWD .RAMFL,$PAGEL ASCII /.PAGELENGTH/ REPEAT NWORDS-3,0 .RAMFL: XWD .SET,$RAMFL ASCII /.RAMFILE/ REPEAT NWORDS-2,0 .SET: XWD .WIDTH,$SET ASCII /.SET/ REPEAT NWORDS-1,0 .WIDTH: XWD 0,$WIDTH ASCII /.WIDTH/ REPEAT NWORDS-2,0 ];END IFN FTIF IMPURE .JBFF: HGHIMP ;FIRST FREE LOCATION IN IMPURE .JBREL: &<-2000> ;FIRST LOCATION IN NXM ABOVE IMPURE PAT: PATCH: BLOCK 40 ;PATCH SPACE, INTENTIONALLY NOT ZERO'D LPPAG: 95. ;LINES PER PAGE (LPT6 ON DOVER) GOBLT:: ;START OF BLT TO ZERO MEMORY VARIABLES VERPOS: BLOCK 1 ;LINE NUMBER ON PAGE HORPOS: BLOCK 1 ;COLUMN NEXT OUTPUT CHARACTER WILL GO INTO FLDPNT: BLOCK 1 ;POINTS TO BEGINNING OF SYMBOL TABLE MAXPOS: BLOCK 2 ;LARGEST BIT POSITION DEFINED FOR MICRO CODE MAXPS1: BLOCK 2 ;LARGEST BIT POSITION SEEN ON PASS 1 VALUE: BLOCK MICMXW ;HOLDS BINARY MICRO CODE UNDER CONSTRUCTION VALSET: BLOCK MICMXW ;1S IN ALL FIELDS WHERE ITEMS INSERTED INTO "VALUE" TIME1: BLOCK 1 ;TIME VALUE #1 MAXIMUM TIME2: BLOCK 1 ;TIME VALUE #2 MAXIMUM VALEND:: ;END OF BLT TO INIT A MICRO WORD TKZER:: ;BLOCK TO ZERO FOR EACH TOKEN SCAN TOKMIN: BLOCK 1 ;FLAG NUMERIC TOKEN IS NEGATIVE TOKOCT: BLOCK 1 ;BUILDING OCTAL VALUE TOKDEC: BLOCK 1 ; DECIMAL TOKEN VALUE NUMBER: BLOCK 1 ;NUMERIC RESULT OF TOKEN SCANNER NAME: BLOCK NWORDS ;ASCII TEXT FOR SYMBOL NAME TKARGB: BLOCK NARGWD ;TOKEN MACRO ARGUMENTS BUFFER TKZEND:: ;END OF BLT TO INIT A TOKEN FIELD: BLOCK NWORDS ;ASCII TEXT FOR FIELD NAME PC: BLOCK 2 ;MICRO WORD LOCATION COUNTER SEQADR: 0 ;NON-ZERO MEANS USE SEQUENTIAL ADDRESSES STATE: BLOCK 1 ;SYNTAX SCANNER STATE ENDFIL: BLOCK 1 ;NON-0 INDICATES END OF ALL INPUT DATA CHRPNT: BLOCK 1 ;HOLDS 0, OR BYTE POINTER FOR RESCANS INPNT: BLOCK 1 ;BYTE POINTER FOR INPUT FILE INCNT: BLOCK 1 ;BYTE COUNTER FOR INPUT FILE OUTPNT: BLOCK 1 ;BYTE POINTER FOR OUTPUT FILE OUTCNT: BLOCK 1 ;BYTE COUNTER FOR OUTPUT FILE PDL: BLOCK 100 ;PUSH DOWN LIST PDLEND:: PMDL: BLOCK 1000 ;STACK FOR RECURSING ON RESCANS PMEND:: MARGSZ: BLOCK 1 ;MACRO ARGUMENTS SIZE MARGPT: BLOCK 1 ;MACRO ARGUMENT POINTER MARGBF: BLOCK NARGWD ;MACRO ARGUMENT BUFFER STTIME: BLOCK 1 ;RUNTIME AT START SAVACS: BLOCK 16. ;AC STORAGE DURING FATAL ERRORS PNTBUF: BLOCK 100./5 ;BUFFER FOR HOLDING LISTING TEXT PNTMAX==<.-PNTBUF>*5-1 EOLCHR: BLOCK 1 ;HOLDS LAST CHAR IN PRINT LINE ERRCNT: BLOCK 1 ;COUNTS MSG UUOS FOR ERRORS PAGNUM: BLOCK 1 ;SOURCE PAGE NUMBER IN RIGHT HALF ;-1 IN LEFT IS FLAG TO PRINT HEADER TTLPNT: BLOCK 1 ;ADDRESS OF TITLE TEXT TOCPNT: BLOCK 1 ;LIST POINTER TO TABLE OF CONTENTS HDRPNT: BLOCK 1 ;ADDRESS OF HEADER TEXT LINNUM: BLOCK 1 ;SOURCE LINE NUMBER FRECNT: BLOCK 1 ;COUNT OF REQUIRED CONSECUTIVE MICRO WORDS LOCPAT: BLOCK 1 ;BIT PATTERN FOR LOCATION ASSIGNMENTS LOCAST: BLOCK 1 ;BIT PATTERN FOR *'S IN LOCATION PATTERN LOCCNT: BLOCK 1 ;NUMBER OF LOCS REMAINING IN BLOCK PNTCNT: BLOCK 1 ;COUNT OF NUMBER OF CHARS IN PNTBUF PNTPNT: BLOCK 1 ;BYTE POINTER INTO PNTBUF FOR LISTING WRDCNT: BLOCK 2 ;COUNT OF MICRO WORDS USED HIGHPC: BLOCK 2 ;HIGHEST LOCATION ASSIGNED MACPNT: BLOCK 2 ;ADDRESSES OF "MACRO%" FIELD HEADERS JPNT: BLOCK 2 ;ADDRESSES OF "J" FIELD HEADERS SWTPNT: BLOCK 1 ;ADDRESS OF "SWITCH%" FIELD HEADER SUPSYM: BLOCK 1 ;ADDRESS OF SYMBOL TABLE ENTRY FOR ;SYMBOL WHICH TURNED OFF ASSY USAGE: BLOCK MAXPC/36.+1 ;HOLDS 1S FOR EVERY MICRO WORD USED USGEND:: DTABL: BLOCK MAXDSP/2 ;EACH HALF,LINE # AT WHICH WORD DEFINED UTABL: BLOCK MAXPC ;CHARACTER,,LINE NUMBER (ZERO IF LOC UNUSED) LOCPNT: BLOCK 1 ;AOBJN POINTER TO NEXT LOCTAB ENTRY LOCAOB: BLOCK 1 ;AFTER PASS 1, AOBJN POINTER TO WHOLE LOCTAB LOCTAB: BLOCK LLOCTB ;TABLE WITH ONE WORD FOR EACH OPERATION ; RELEVANT TO LOCATION ASSIGNMENT %%LCOP==410300 ;4.9-4.7 OPERATION CODE %LCTAG==0 ;SET TAG HERE, RH IS SYMBOL %LCABS==1 ;ABSOLUTE LOCATION SETTING, RH IS VALUE %LCUCD==2 ;MICRO CODE, RH IS LINE NUMBER %LCEQL==3 ;EQUAL SIGN, ADDITIONAL BYTES: %%LCPT==001600 ;PATTERN BIT MASK %%LCAS==161600 ;ASTERISK BIT MASK %%LCNB==340500 ;NUMBER OF BITS %LCERR==4 ;ERROR, RH IS STRING %LCLOC==040000 ;4.6 PC KNOWN FLAG (NOT IN %LCEQL) %%LCPC==221600 ;4.5-3.1 PC WHEN KNOWN RFLDPT: BLOCK 1 ;AOBJN POINTER TO RFLDS, RFLDD RFLDS: BLOCK MICMXB ;TABLE OF BYTE POINTERS TO SOURCE FIELDS RFLDD: BLOCK MICMXB ;TABLE OF BYTE POINTERS TO DESTINATION FIELDS RFLPAR: BLOCK 8 ;PARITY SPECIFICATIONS ;4.9 EVEN PARITY ;3.9-3.1 WHERE TO STORE IT ;2.9-2.1 LEFTMOST BIT ;1.9-1.1 NUMBER OF BITS RAMFIL: BLOCK 1 ;ZERO OR POINTER TO RAMFILE BUFFER RFLNWD: BLOCK 1 ;NUMBER OF WORDS PER ENTRY JCL: BLOCK 100./5 ;JCL BUFFER JCLE: 0 JCLFNC: -1 ;FENCE DISTTY: 0 ;-1 IF %TOERS I.MAXC: BLOCK 1 ;COUNT OF NUMBER OF INPUT FILES I.CNT: BLOCK 1 ;FILE COUNTER USED BY ALLIN 1FLFLG: 0 ;NON-ZERO FNR READING ONLY ONE FILE O.DEV: BLOCK 1 O.NAM: BLOCK 1 O.EXT: BLOCK 1 O.PPN: BLOCK 1 O.LEN==.-O.DEV I.DEV==0 ;INPUT DEVICE I.NAM==1 ;INPUT FILE NAME/MASK I.EXT==2 ;INPUT EXTENSION I.PPN==3 ;INPUT PPN I.LEN==4 ;LENGTH OF INPUT FILE DESCRIPTOR BLOCK I.STG: BLOCK 20.*I.LEN ;INPUT FILE DESCRIPS BUFL==200 INBUF: BLOCK BUFL OUTBUF: BLOCK BUFL OUTFIL: BLOCK 5 ;SAVED STUFF FOR OUTPUT FILE INFILE: BLOCK 5 ;SAVED STUFF FOR CURRENT INPUT FILE F.DEV==0 ;DEVICE NAME F.NAM==1 ;FILE NAME F.EXT==2 ;FILE NAME 2 F.TIM==3 ;FILE DATE ITS FORMAT F.PPN==4 ;FILE DIRECTORY RCHST: BLOCK 10. ;FOR .RCHST ENDBLT: ;END OF BLT TO ZERO MEMORY SUBTTL COMMAND LINE SCANNER PURE FNR.: .BEGIN A=1 B=2 C=3 D=4 SETZM JCL MOVE A,[JCL,,JCL+1] BLT A,JCLE SETOM JCLFNC .SUSET [.ROPTION,,A] TLNE A,OPTCMD .BREAK 12,[5,,JCL] PUSHJ P,FNRLIN ;PROCESS COMMAND LINE SKIPN I.MAXC ;SEE IF GOT ANYTHING SKIPE O.DEV POPJ P, ;YUP, OK .IOT TYOC,["*] PUSHJ P,RLINE ;NO, READ A LINE FROM TTY PUSHJ P,FNRLIN SKIPN I.MAXC SKIPE O.DEV POPJ P, EXIT ;NOTHING FROM TTY, EXIT ; READ A LINE FROM TTY INTO JCL RLINE: MOVE D,[010700,,JCL-1] RLINE0: .IOT TYIC,A CAIE A,177 JRST RLINE1 CAMN D,[010700,,JCL-1] JRST [ .IOT TYOC,[15] ? JRST RLINE0 ] LDB A,D MOVEI B,0 DPB B,D ADD D,[070000,,] SKIPGE D SUB D,[430000,,1] SKIPN DISTTY JRST [ .IOT TYOC,A ? JRST RLINE0 ] .IOT TYOC,[^P] .IOT TYOC,["X] JRST RLINE0 RLINE1: CAIE A,^L JRST RLINE2 .IOT TYOC,[15] MOVE C,[010700,,JCL-1] RLIN1A: CAMN C,D JRST RLINE0 ILDB A,C .IOT TYOC,A JRST RLIN1A RLINE2: CAIE A,^M CAIN A,^C CAIA JUMPN A,RLINE3 MOVEI A,0 IDPB A,D ;END HERE POPJ P, RLINE3: IDPB A,D JRST RLINE0 ;GET OUTPUT AND INPUT FILE SPECS FROM JCL FNRLIN: SETZB FPNT,I.MAXC ;FPNT INDEX INTO I.STG ADDI FPNT,I.STG ;WELL I REALLY WANTED A POINTER I GUESS SETZM O.DEV SETZM O.NAM SETZM O.EXT SETZM O.PPN FNRAA: MOVE SPNT,[000700,,JCL-1] ;SPNT BP TO JCL FNR0: SETZM I.DEV(FPNT) ;HERE FOR NEXT FILE SETZM I.NAM(FPNT) SETZM I.EXT(FPNT) SETZM I.PPN(FPNT) FNR1: SETZM D ;HERE FOR NEXT SYLLABLE MOVE C,[440600,,D] FNR2: ILDB A,SPNT ;HERE FOR NEXT CHARACTER CAIGE A,40 JRST FNREND CAIN A,"; JRST FNRSEM CAIN A,": JRST FNRCOL CAIN A,", JRST FNRSEP CAIN A," JRST FNRSPC CAIE A,"= CAIN A,"_ JRST FNROUT CAIGE A,140 SUBI A,40 TLNE C,770000 IDPB A,C JRST FNR2 FNRSEM: MOVEM D,I.PPN(FPNT) JRST FNR1 FNRCOL: MOVEM D,I.DEV(FPNT) JRST FNR1 FNRSPC: MOVEM D,I.NAM(FPNT) JRST FNR1 FNREND: MOVEI A,400000 JRST FNRSEP FNROUT: SETOM A CAIE FPNT,I.STG MSG [EXIT],OUTPUT FILE MUST COME FIRST FNRSEP: JUMPE D,FNRSP1 SKIPN I.NAM(FPNT) JRST [ MOVEM D,I.NAM(FPNT) JRST FNRSP1 ] MOVEM D,I.EXT(FPNT) FNRSP1: MOVSI D,(SIXBIT/>/) ;APPLY DEFAULTS SKIPGE A MOVSI D,(SIXBIT/MCR/) SKIPN I.EXT(FPNT) MOVEM D,I.EXT(FPNT) MOVSI D,(SIXBIT/DSK/) CAIE FPNT,I.STG MOVE D,I.DEV-I.LEN(FPNT) SKIPN I.DEV(FPNT) MOVEM D,I.DEV(FPNT) CAIE FPNT,I.STG SKIPA D,I.PPN-I.LEN(FPNT) .SUSET [.RSNAM,,D] SKIPN I.PPN(FPNT) MOVEM D,I.PPN(FPNT) SKIPE 1FLFLG POPJ P, JUMPL A,FNROU1 SKIPE I.NAM(FPNT) ;SKIP IF BLANK LINE AOS I.MAXC CAIN A,400000 JRST FNREN1 ;END OF LINE ADDI FPNT,I.LEN CAIGE FPNT,I.STG+20.*I.LEN JRST FNR0 MSG [EXIT],ONLY 20. INPUT FILES ALLOWED FNROU1: IRPS SYL,,[DEV NAM EXT PPN] MOVE D,I.!SYL(FPNT) MOVEM D,O.!SYL TERMIN JRST FNR0 FNREN1: POPJ P, .END FNR. ;PURIFICATION CODE PURIFY: MOVE T1,[-NPURPG,,] .CALL [ SETZ 'CORBLK MOVEI %CBRED+%CBNDR MOVEI %JSELF MOVE T1 SETZI %JSELF ] .LOSE %LSSYS MOVE T1,[-NNXMPG,,/2000] .CALL [ SETZ 'CORBLK MOVEI 0 MOVEI %JSELF SETZ T1 ] .LOSE %LSSYS .VALUE [ASCIZ/:PDUMP TS MICRO/] LIT..: CONSTANTS IMPURE VARIABLES PURE IMPURE IF1,[ DEFINE INFORM A,B PRINTX\A=B \ TERMIN INFORM HIGHEST IMPURE USED,\%%LOW INFORM HIGHEST PURE USED,\%%HIGH ] HGHIMP=%%LOW NPURPG==<%%HIGH-HGHSEG+1777>/2000 ;NUMBER OF PURE PAGES NNXMPG==-/2000 ;NUMBER OF NXM PAGES BETWEEN LOW AND HIGH NZERPG==/2000-/2000 ;NUMBER OF INITIAL ZERO PAGES END MICRO