From d5ad381a9001e073fbf5604eaa9fe89788aa4072 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Mon, 11 Jun 2018 10:06:26 +0200 Subject: [PATCH] Microcode assembler for KS10. --- build/misc.tcl | 4 + src/kshack/micro.116 | 3530 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3534 insertions(+) create mode 100755 src/kshack/micro.116 diff --git a/build/misc.tcl b/build/misc.tcl index 9c29169f..5e4861f5 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -815,6 +815,10 @@ respond "*" ":link sys1;ts pcnvrt,sysbin;cnvrt bin\r" respond "*" ":link sys1;ts ucnvrt,sysbin;cnvrt bin\r" respond "*" ":link sys1;ts acnvrt,sysbin;cnvrt bin\r" +# KS10 microcode assembler +respond "*" ":midas kshack;ts micro_micro\r" +expect ":KILL" + # XXFILE respond "*" ":midas sysbin;xxfile bin_sysen1;xxfile\r" expect ":KILL" diff --git a/src/kshack/micro.116 b/src/kshack/micro.116 new file mode 100755 index 00000000..d352c9b4 --- /dev/null +++ b/src/kshack/micro.116 @@ -0,0 +1,3530 @@ +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