1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-16 16:28:40 +00:00
PDP-10.its/src/syseng/micro.52
2018-06-12 07:58:19 +02:00

2887 lines
68 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

TITLE MICRO CODE ASSEMBLER
; TOM EGGERS/JSL 30 APRIL, 75
; modified for ITS OCTOBER 1975.
;4/21/79 Moon .SEQADR
;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
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 FTLOOS,0 ;1 TO DISTINGUISH "LOOSE" MICRO-WORDS
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
SWSET FTBB,0 ;1 TO ENABLE KL10 BREADBOARD HACK
IFN FTBB,[
FTLOOS==1
GDWRDS==2000'/36.
BORDER==-1_<35.-<2000'-<<2000'/36.>*36.>-1>>
]
;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
LPPAG==58. ;LINES PER PAGE
EXIT=.BREAK 16,040000
DEFINE PINDEX SIZ,ADR
REPEAT 36./<SIZ>, POINT SIZ,ADR,<.RPCNT+1>*<SIZ>-1
TERMIN
DEFINE POINT (SIZ,ADR,POS=-1
<<43'-<.RADIX 10.,<POS>>>_36'+<.RADIX 10.,<SIZ>>_30'+ADR>TERMIN
DEFINE IOWD (A,B)
-<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==<NCHARS+4>/5 ;MAX NUMBER OF WORDS TO HOLD A SYMBOL
MAXPC==2047. ;MAXIMUM AMOUNT OF MICRO CODE-1
MAXDSP==512. ;MAX SIZE OF DISPATCH
;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
%%HIGH==400000
%%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]
.VALUE
.OPEN TYOC,[%TJDIS+.UAO,,'TTY]
.VALUE
.SUSET [.RRUNT,,N] ;GET STARTING RUNTIME
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]
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 ]
.VALUE
PUSHJ P,PNTINI ;INIT OUTPUT LISTING
HRROI T1,1 ;START AT PAGE 1, NEED A HEADER
MOVEM T1,PAGNUM
BEGPAS: SETZM STATE ;INIT STATE FOR SYNTAX ANALYSIS
SETZM PC+UCODE
SETZM PC+DISP
SETOM PRNTPC+UCODE ;LAST LOC ASSEMBLED WAS -1
SETOM PRNTPC+DISP ; IN BOTH RAMS
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]
IFN FTBB,[
BLT T1,USAGE+GDWRDS-1
MOVE T1,[252525252525]
MOVEM T1,USAGE+GDWRDS+1
TLZ T1,(BORDER)
MOVEM T1,USAGE+GDWRDS
MOVE T1,[USAGE+GDWRDS+1,,USAGE+GDWRDS+2]
];END FTBB
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
PUSHJ P,FINLST
PUSHJ P,OUTCLS
.CLOSE OUTCHN,
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
JRST BEGPAS ;AND DO PASS 2
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
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,
;FIELD/NUMBER SCANNED, INSERT VALUE INTO MICRO WORD
FLDNUM:
IFE FTBB,[
TRNN F,PASS2
JRST FLDS99
]
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 FLDS99
;FIELD/SYMBOL SCANNED, INSERT VALUE INTO MICRO WORD
FLDSYM:
IFE FTBB,[
TRNN F,PASS2
JRST FLDS99
]
PUSHJ P,SRCFLD
FLDS1: MSG FLDS99, 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
FLDS99: TRO F,BINF
ZFPOPJ: SETZM FIELD ;NO CARRY OVER OF FIELD NAMES
POPJ P,
FLDLUZ: POP P,FPNT ;ADJUST STACK
TRC RAM,DISP\UCODE ;PUT MODE BACK
IFN FTBB,[
TRNN F,PASS2
JRST FLDS99
]
MSG FLDS99, SYMBOL NOT DEFINED
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,
; 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: MOVE T1,[ASCII /J/]
MOVEM T1,FIELD
SETZM FIELD+1
MOVE T1,[FIELD+1,,FIELD+2]
BLT T1,FIELD+NWORDS-1
SKIPE FPNT,JPNT(RAM) ;DO WE KNOW WHERE J FIELD IS DEFINED?
JRST TAG2 ;YES, DO NOT SEARCH
PUSHJ P,SRCFLD
MSG ZFPOPJ, CAN'T FIND J FIELD
MOVEM FPNT,JPNT(RAM) ;REMEMBER FOR FUTURE
TAG2: PUSHJ P,MAKSYM
JFCL
IFN FTBB,[
MOVE T1,JEQL ;ADDR OF LIST OF EQUAL TAGS
MOVEM SPNT,JEQL
HRRM T1,SYMEQL(SPNT) ;ADD THIS TO LIST
TRNE F,PASS2
JRST ZFPOPJ
]
HRRZ N,PC(RAM)
PUSHJ P,DEFCHK
HALT DEFVAL
PUSHJ P,DEFSLS
JRST ZFPOPJ
;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,[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
JRST LOCB8
; MSG LOCB8, DISP LOCATION CHECK FAILED
]
JUMPE N,PCNXT1 ;IF 0, FIND FIRST FREE WORD
SKIPGE N,PC(RAM) ;GET CURRENT PC
CAMLE T1,FRECNT ;IS NEW BLOCK LARGER?
JRST LOCB6 ;YES, OR PC NOT RESTRICTED
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: PUSHJ P,FREWRD ;DOESN'T FIT
MSG LOCB99, NO SUCH REQUIRED MICRO WORD ADDRESS PATTERN
LOCB8: MOVEM N,PC(RAM) ;SET UP FIRST WORD ADDRESS
LOCB99: POPJ P,
; NUMBER: SET LOCATION COUNTER
LOCSET: SKIPGE N,NUMBER
MSG LOCS99, LOCATION NEGATIVE
CAMLE N,[MAXPC ? MAXDSP](RAM)
MSG LOCS99, LOCATION TOO LARGE
HRROM N,PC(RAM) ;STORE AWAY NEW PC VALUE
JUMPN RAM,LOCS99
SETZM FRECNT ;END ANY LOCATION DEFAULTING
SETZM LOCPAT
SETZM LOCAST
LOCS99: SETZM FIELD
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)
CAMG N,T1
MSG .+1, VALUE TOO LARGE FOR FIELD
POPJ P,
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
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,",
PUSHJ P,TOKN10
CAIE N,.TKN
PUSHJ P,@(P)
MOVE N,NUMBER
PUSHJ P,DEFCHK
HALT DEFPOS
CAML N,MAXPOS(RAM)
MOVEM N,MAXPOS(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
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: HRRZ N,PC(RAM) ;DEFAULT PC INSERTION
SKIPN N,PCTABL(N) ;GET DEFAULT PC
MSG CPOPJ, NO DEFAULT PC AVAILABLE
TLZA N,-1 ;MASK TO 18 BITS
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,
;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
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)
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
LSH N,-10.
.CALL [ SETZ ;GET FRESH PAGE
'CORBLK
MOVEI %CBRED+%CBWRT+%CBNDW+%CBNDR
MOVEI -1
MOVEI (N)
SETZI 400001 ]
.VALUE
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 <+,-, ><DIGITS 0-7>
; AN 8 OR 9 OR A DECIMAL POINT MAKES NUMBER DECIMAL
;DECIMAL NUMBERS ARE OF FORM <+,-, ><DIGITS 0-9><POINT, >
; 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
TOK2: PUSHJ P,GETCHR ;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 [ MOVE T1,TOKPNT ;GET SYMBOL BUILD POINTER
CAME T1,[POINT 7,NAME+NWORDS-1,34-7]
IDPB C,TOKPNT ;ROOM FOR CHAR, STORE AWAY
JRST TOK2 ]
JRST TOK2 ;GO GET NEXT CHARACTER
; 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
POP PM,CHRPNT ;BUT NOTHING LEFT
POP PM,C ;GET LAST CHAR FROM STACK
JRST GETC9 ]
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
SAVE: PUSH PM,C ;ROUTINE TO START RESCAN
PUSH PM,CHRPNT
MOVEM N,CHRPNT
POPJ P,
SUBTTL LISTING GENERATION
PNTLIN: PUSH P,C
TRNN F,PASS2\ERROR
JRST PNTL2 ;NO LIST ON PASS1, RE-INIT LISTING
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
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
MOVEI C,15
PUSHJ P,PUT
MOVE C,EOLCHR
CAIE C,14
MOVEI C,12 ;END LINE WITH 15,14, OR 15,12
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
POPJ P,
PUSH P,C
IFN FTBB,[
JUMPN RAM,NOMOVE ;NEVER MOVE DISP DATA
SKIPGE PC+UCODE ; OR CONSTRAINED ADDRESS DATA
JRST NOMOVE
MOVSI T1,-MICMXW ;COUNT THRU ALL PIECES OF MICROWORD
MOVE T2,MOVMSK(T1) ;BITS WHICH DON'T EXIST ABOVE 2000
TDNN T2,VALUE(T1) ;ANY SET IN THIS MICROWORD?
AOBJN T1,.-2 ;LOOK AT ALL PIECES
JUMPL T1,NOMOVE ;DON'T MOVE IF ANY NXB SET
MOVE T1,[-<1000/36.>,,<2000/36.>]
SETCM T2,USAGE(T1) ;LOOK FOR UNSET BITS UP THERE
TLZA T2,(BORDER) ;START AT THE BORDER OF 2000
SETCM T2,USAGE(T1) ;TRY NEXT WORD
JFFO T2,MOVUP ;IF FOUND ONE, USE IT
AOBJN T1,.-2 ;NO, LOOK AT NEXT
JRST NOMOVE ;NO FREE BITS, DO NOT MOVE
MOVUP: HRRZS T1 ;COMPUTE ADDRESS FOR THIS BIT
IMULI T1,36.
ADDI T1,(T3)
MOVEM T1,PC+UCODE ;STORE NEW PC FOR THIS WORD
MOVEI SPNT,JEQL-SYMEQL
ADJTAG: HRRZ SPNT,SYMEQL(SPNT)
JUMPE SPNT,NODFLT ;NO MORE
DPB T1,DEFVAL ;REPLACE VALUE
JRST ADJTAG ;ADJUST NEXT TAG
NODFLT: MOVSI T1,-MICMXW
MOVE T2,MOVMSK(T1)
IORM T2,VALSET(T1) ;PREVENT DEFAULT SETTING THESE BITS
AOBJN T1,.-2
NOMOVE:
];END FTBB
MOVE T1,PRNTPC(RAM) ;GET LAST LOCATION ASSEMBLED
MOVE N,PC(RAM) ;GET THIS LOCATION
MOVEM N,PRNTPC(RAM) ;SAVE PRESENT PC FOR NEXT WORD DEFAULT
HRRZS N ;COMPARE RH ONLY
CAMLE N,HIGHPC(RAM) ;IS THIS THE HIGHEST PC USED SO FAR?
MOVEM N,HIGHPC(RAM) ;YES, SAVE FOR LOC'N LISTING
JUMPN RAM,PNTB0 ;PCTABL RELEVANT ONLY FOR UCODE
TRNN F,PASS2
JRST CHNPC ;ON PASS1, CHAIN PC'S TOGETHER
HRRZ T2,PCTABL(T1) ;GET ADDR ASSUMED BY LAST UWORD FOR THIS ONE
CAIE T2,(N) ;IS IT SAME AS THIS PASS?
MSG STOP, !! PHASE ERROR !!
HLRZ T2,PCTABL(N) ;GET LINE OF THIS PC LAST PASS
CAME T2,LINNUM
MSG .+1, LINE NUMBER FOUL UP
JRST PNTB0
CHNPC: HRRM N,PCTABL(T1) ;SAVE THIS PC FOR PASS2 DEFAULTS
MOVE T1,LINNUM ;GET THIS LINE NUMBER
HRLM T1,PCTABL(N) ;ASSOCIATE IT WITH THIS PC
PNTB0: TRNE F,PASS2
PUSHJ P,DEFALT ;PUT IN PASS2 DEFAULTS
PUSHJ P,USEDPC ;LOOK TO SEE IF THIS PC USED
MSG .+1, MICRO WORD USED TWICE
PNTB1: PUSHJ P,PCNEXT ;GET NEXT PC SET UP
SETZM JEQL
TRNN F,PASS2
JRST PNTB99
AOS WRDCNT(RAM) ;COUNT MICRO WORDS USED
IFN FTLOOS,[
SKIPL PRNTPC(RAM)
AOSA LOOSPC(RAM) ;COUNT PC WORDS THAT CAN GO ANYWHERE
];END IFN FTLOOS
SKIPA N,RAM
MOVEI N,2(RAM)
ADDI N,[ASCII /U /
ASCII /D /
ASCII /V /
ASCII /D / ]
PUSHJ P,PRINT0
HRRZ C,PRNTPC(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
PNTB99: 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
IFN FTLOOS,[
PUSHJ P,PRINT
ASCIZ /
; "Loose" U Words= /
MOVE C,LOOSPC+UCODE ;GET # OF U WORDS THAT CAN GO ANYWHERE
PUSHJ P,PNTDEC
];END IFN FTLOOS
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
HLRZ C,PCTABL(FPNT) ;GET LINE # FOR THIS LOCATION
SKIPE C ;IF USED,
PUSHJ P,PNTDEC ; PRINT IT
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
CAIGE 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
;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: MOVE N,PC(RAM)
JUMPN RAM,[AOJA N,PCNX2]
JUMPGE N,PCNXT1 ;IF NOT IN ADR BLOCK, FIND 1ST FREE WORD
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, FIND 1ST FREE WORD
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
PCNX2: MOVEM N,PC(RAM)
POPJ P,
PCNXT1: MOVE N,PC(RAM)
SKIPE SEQADR
AOJA N,PCNX2 ;DON'T USE FIRST FREE, USE NEXT, IF SEQUENTIAL ADDRESS MODE
SETZM LOCPAT ;START ON 000 BOUNDARY
SETZM LOCAST ;* PATTERN IS 0'S
MOVEI T1,1 ;LOOK FOR 1ST FREE WORD
MOVEM T1,FRECNT
PUSHJ P,FREWRD
MSG CPOPJ, NO MORE MICRO WORDS FREE
TLZ N,-1 ;NO ADDRESS RESTRICTIONS
JRST PCNX2
;TEST PC LOCATION FOR PREVIOUS USAGE
; IF USED, NO SKIP ;IF NOT USED, SKIP
; ON RETURN, N,N1 CONTAINS BIT ALIGNED FOR DOING "IORM N1,USAGE(N)"
USEDPC: HRRZ N,PC(RAM)
JUMPN RAM,USED1 ;DIFFERENT IF DISPATCH
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 /
; /
MOVEI N,[ ASCII /U= /
ASCII /D= / ](RAM)
PUSHJ P,PRINT0
HRRZ C,PC(RAM)
PUSHJ P,PNTOC4
MOVEI N,[ASCIZ /, /]
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 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: AOS (P) ;FILE FOUND, SKIP RETURN
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]
.VALUE
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
DEFTND:
DEFTYP: POINT 2,SYMVAL(SPNT),1 ;"UCODE" OR "DISP" NUMBER
DEFTM1: POINT 4,SYMVAL(SPNT),5 ;TIME VALUE #1
DEFTM2: POINT 3,SYMVAL(SPNT),8 ;TIME VALUE #2
DEFPOS: POINT 7,SYMVAL(FPNT),8 ;MICRO WORD POSITION
DEFSIZ: POINT 4,SYMVAL(FPNT),12 ;MICRO WORD FIELD SIZE
DEFVAL: POINT 12,SYMVAL(SPNT),24 ;VALUE OF SYMBOL
DEFFLG: POINT 7,SYMVAL(SPNT),31 ;FLAGS FOR A SYMBOL
DEFFNC: POINT 4,SYMVAL(SPNT),35 ;FUNCTION TO EXECUTE
;FIELD NAME FOR MACRO DEFINITIONS
MACRO: ASCIZ /MACRO%/
REPEAT NWORDS-2,0
SWTCH: ASCIZ /SWITCH%/
REPEAT NWORDS-2,0
IFN FTBB,[
MOVMSK: 1_2 ;FMADR SEL 4
1_32.+3_27.+37 ;SCADA DIS, SCADB, SPEC
0 ? 0
];END FTBB
;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
<A>_41+<B>_.SHTRM+<C>
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 ,,133 ; [
BYTS ,,"\ ; \
BYTS ,,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==<STATE_.SZTOK+TOKTYP>_.SZTRM+TRMTYP
.XN==36./<.SZDSP+.SZSTA>
.XV==<DISP-STDISP>_.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.-<R+1>*<.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 .DCODE,$UCODE
ASCII /UCODE/
REPEAT NWORDS-1,0
.DCODE: XWD .SEQAD,$DCODE ;SYMBOL NODE
ASCII /.DCODE/
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 .SET,$IFNOT
ASCII /.IFNOT/
REPEAT NWORDS-2,0
.SET: XWD 0,$SET
ASCII /.SET/
REPEAT NWORDS-1,0
];END IFN FTIF
IMPURE
.JBFF: HGHIMP ;FIRST FREE LOCATION IN IMPURE
.JBREL: <HGHIMP+1777>&<-2000> ;FIRST LOCATION IN NXM ABOVE IMPURE
PAT:
PATCH: BLOCK 40 ;PATCH SPACE, INTENTIONALLY NOT ZERO'D
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
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
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 100 ;STACK FOR RECURSING ON RESCANS
PMEND::
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
PNTCNT: BLOCK 1 ;COUNT OF NUMBER OF CHARS IN PNTBUF
PNTPNT: BLOCK 1 ;BYTE POINTER INTO PNTBUF FOR LISTING
JEQL: BLOCK 1 ;HOLDS LIST HEADER FOR EQUAL TAGS
PRNTPC: BLOCK 2 ;HOLDS PC FOR ASSEMBLY LISTING
WRDCNT: BLOCK 2 ;COUNT OF MICRO WORDS USED
LOOSPC: BLOCK 2 ;COUNT OF PC WORDS WITH NO ADR RESTRICTIONS
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
BLOCK 1 ;PCTABL-1 FOR CHAINING TO FIRST WORD
PCTABL: BLOCK MAXPC ;LH, LINE # AT WHICH THIS MICRO-WORD DEFINED
;RH, NEXT MICRO-WORD ADDR ASSEMBLED AFTER THIS
; IE, DEFAULT VALUE FOR J FIELD
;ZERO IF THIS LOC'N NOT ASSEMBLED INTO
PCTEND:: ;TABLE FOR DEFAULT PC'S
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.
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
;PUT PURIFICATION CODE IN LOW IMPURE. WIPED OUT BY SYMBOLS.
0
NPURPG==<%%HIGH-400000+1777>/2000 ;NUMBER OF PURE PAGES
IF2, NNXMPG==200-<PURIFE+1777>/2000 ;NUMBER OF NXM PAGES BETWEEN LOW AND HIGH
PURIFY::MOVE T1,[-NPURPG,,200]
.CALL [ SETZ
'CORBLK
MOVEI %CBRED+%CBNDR
MOVEI -1
MOVE T1
SETZI -1 ]
.VALUE
MOVE T1,[-NNXMPG,,<PURIFE+1777>/2000]
.CALL [ SETZ
'CORBLK
MOVEI 0
MOVEI -1
SETZ T1 ]
.VALUE
.VALUE [ASCIZ/:PDUMP TS MICRO/]
CONSTANTS
PURIFE::
END MICRO