Trailing-Edge
-
PDP-10 Archives
-
cust_sup_cusp_bb-x130c-sb
-
10,7/unscsp/dump/dump.mac
There are 7 other files named dump.mac in the archive. Click here to see a list.
TITLE DUMP - PROGRAM TO DUMP ARBITRARY FILES IN PRINTABLE FORMAT
SUBTTL DON BLACK/DAL - VERSION 4 - 12 AUGUST 1972
;COPYRIGHT (C) 1974,1978,1979 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
VWHO==0 ;WHO LAST EDITED THIS PROGRAM
VDUMP==4 ;VERSION OF DUMP
VPATCH==0 ;PATCH LETTER
VEDIT==232 ;EDIT NUMBER
LOC 137
BYTE (3)VWHO(9)VDUMP(6)VPATCH(18)VEDIT
XALL
TWOSEG
RELOC 400000
;AC'S
SF=0 ;SCANER FLAGS
T1=1 ;TEMP AC'S
T2=2 ; ..
T3=3 ; ..
T4=4 ; ..
P1=5 ;PRESERVED AC'S
P2=6 ; ..
N=7 ;HOLDS A NUMBER
C=10 ;HOLD A CHARACTOR
M=11 ;MESSAGE POINTER
F=12 ;FLAGS
FM=13 ;SCAN STORES MASKS IN HERE
DL=14 ;ANOTHER WORD OF FLAGS (NONE SET BY COMMAND SCANER)
P=17 ;PUSH DOWN POINTER
;I/O CHANNELS
IC==6 ;INPUT FILE
OC==7 ;OUTPUT CHANNEL
;EXTERNALS IN COMMAND SCANNER
EXTERNAL .FILIN,.GTSPC,.ISCAN,.MKPJN,.POPJ1,.SAVE2,.SAVE4
EXTERNAL .SIXSW,.TIALT,.TIAUC,.VSCAN,E.UKK
EXTERNAL .SWDPB,.NAME
SEARCH C,SCNMAC
SUBTTL LOADING INSTRUCTIONS
REPEAT 0,<
IF YOU HAVE MACRO 47:
.R PIP
*T.MAC=TTY:
%.C==-3
^Z
.LOAD T.MAC+<C.MAC,SCNMAC.MAC>,DUMP.MAC,SCAN.REL,HELPER.REL
IF YOU HAVE MACRO 50 (OR LATER):
.LOAD C.UNV+SCNMAC.UNV+DUMP.MAC,SCAN.REL,HELPER.REL
>
SUBTTL REVISION HISTORY
;EDITS 2 THRU 157 IN NO SPECIAL ORDER:
;
;A) AC'S WERE CHANGED AS FOLLOWS:
; F WAS MOVED FROM 7 TO 12
; V WAS ELIMINATED
; N WAS MOVED FROM 14 TO 7
; M WAS MOVED FROM 15 TO 11
; C WAS MOVED FROM 16 TO 10
; FM WAS ADDED AS 13
; DL WAS ADDED AS 14
;
;B) ASCII AND SIXBIT OUTPUT MODES WERE REDEFINED AS FOLLOWS:
; ASCII IS A SINGLE RIGHT JUSTIFIED CHARACTER IF
; BITS 0 TO 28 ARE ALL ZERO. IT IS 5 LEFT JUSTIFIED
; CHARACTERS IF BITS 0 TO 28 ARE NON-ZERO. CONTROL
; CHARACTERS PRINT AS BLANKS.
; SIXBIT IS A SINGLE RIGHT ADJUSTED CHARACTER IF BITS 0
; TO 29 ARE ZERO. IF BITS 0 TO 29 ARE NOT ZERO
; IT IS TREATED AS 6 SIXBIT CHARACTERS.
;
;C) THE TDUMP COMMAND HAS BEEN IMPLEMENTED TO DUMP TO BOTH TTY: AND
; OUTPUT FILE.
;
;D) DEFINITION OF DOUBLE QUOTE HAS BEEN CORRECTED. IT WAS DEFINED AS
; 41 SHOULD BE 42.
;
;E) MACRO DEFINITIONS WERE MOVED FROM DUMP.MAC TO SCNMAC.MAC.
;
;F) THE FOLLOWING SINGLE LETTERS WERE MADE TO MATCH COMMANDS:
; D IS UNIQUE FOR DUMP
; I INPUT
; M MODE
; O OUTPUT
; T TDUMP
;
;G) TABLES AND CALLS WERE MODIFIED TO USE SCAN NOT SCANNER.
;
;H) A TABLE OF ABSENT DEFAULTS WAS BUILT FOR PRE-SETTING SWITCHES.
;
;I) THE FOLLOWING BUILT IN SYMBOLS HAVE BEEN CREATED:
; . THE ADDRESS OF THE LAST WORD TYPED OUT.
; $ THE LAST BYTE TYPED OUT
; % THE LAST VALUE THE EXPRESSION EVALUATOR RETURNED.
;
;J) DUMP NOW LOOKS FOR CCL FILES IN TMPCOR PRIOR TO LOOKING ON DISK.
;
;K) SCAN IS USED INSTEAD OF SCANNER
;L) THE /TYPE SWITCH APPLIES TO EACH INPUT FILE SPECIFIED (INPUT
; FILE AND SYMBOL FILE)
;
;M) NUMBERS WERE CHANGED TO SYMBOLIC DEFINITIONS. SOME SYMBOLS
; ARE DEFINED IN C.MAC.
;
;N) THE TITLE COMMAND WAS MADE TO WORK
;
;O) POOR AND NON-WORKING CODE USED FOR STORING LISTS WAS CORRECTED.
;
;P) THE INPUT CHARACTER AC (C) HAS THE FOLLOWING POSSIBLE STATES:
; -2 END OF FILE
; -1 END OF LINE (LF-VT-FF)
; 0 ESCAPE
; 1-177 ASCII CHARACTER
;
;Q) A CASE WHERE DUMP WOULD LOOP FOREVER HAS BEEN CORRECTED. THIS WAS
; CAUSED BY THE INDEX OVERFLOWING.
;
;R) WIDTH, JUSTIFY, AND MODE LISTS WERE IMPLEMENTED.
;
;S) SPECIAL PATTERNS IN STRINGS NOW WORK CORRECTLY.
;
;T) QUOTED STRINGS NOW WORK CORRECTLY. THE FOLLOWING FIXES WERE INVOLVED:
; 1) END OF LINE GETS YOU OUT OF QUOTED STRING MODE.
; 2) ; HAS NO EFFECT IN A QUOTED STRING
; 3) MULTIPLE SPACES AND TABS ARE PRESERVED
;
;U) " HAS BEEN ADDED AS AN OPERATOR MEANING TAKE THE LEFT HALF WORD
; AND MOVE IT TO THE RIGHT HALF EXTENDING THE SIGN BIT.
;
;V) CPOPJ HAS BEEN CHANGED TO .POPJ AND CPOPJ1 HAS BEEN CHANGED TO
; .POPJ1. BOTH ROUTINES HAVE BEEN MOVED TO SCAN.
;
;W) THE NUMERIC INPUT ROUTINE HAS BEEN FIXED TO WORK FOR NUMBER WHICH
; FILL ALL 36 BITS. PRIOR TO THIS FIX 777777777777(8) WAS
; CHANGED TO 377777777777(8) DURING OCTAL INPUT
;
;X) THE INPUT ROUTINES WERE CONVERTED TO READ A SYMBOL FILE.
;
;Y) FULL SUB-FILE DIRECTORY SUPPORT HAS BEEN ADDED.
;
;Z) JOBDAT SYMBOLS HAVE BEEN CHANGED FROM JOBXXX TO .JBXXX
;AA) THE FILE READING ROUTINES READ THE FIRST BLOCK OF
; THE FILE. PRIOR TO THIS FIX IF THE FIRST WORD OF THE FILE
; WAS REQUESTED THE READ-IN ROUTINES WOULD THINK THE BLOCK
; WAS IN CORE AND RETURN ZERO.
;
;BB) THE OUTPUT FORMATTER HAS BEEN REWRITTEN TO FIX SEVERAL BUGS. IN ADDITION
; THE FOLLOWING EXTERNAL CHANGES HAVE BEEN MADE:
; 1 "WORD NOT IN FILE" PRINTS INSTEAD OF "\\\\".
; 2. NEGATIVE ADDRESSES LIST AS SUCH.
; 3 AFTER ATTEMPTING TO PRINT NXM A REFERANCE
; TO AN EXISTANT LOCATION MUST BE MADE TO TURN PRINTING
; BACK ON.
; 4 RADIX 50 IS NOW A SUPPORTED MODE
; 5 OCTAL NOW PRINTS IN FIXED FORMAT OF XXXXXX,XXXXXX
; 6 A LINE IS NEVER SPLIT BETWEEN THE MINUS SIGN AND
; THE NUMBER.
; 7 LOCATIONS MAY BE PRINTED OUT AS SYMBOLIC INSTRUCTIONS.
;
;CC) NEGATIVE NUMBERS PRINT OUT AS -NUMBER AND NOT A SEQUENCE OF SPECIAL
; CHARACTERS.
;
;DD) ADDRESS ARE NOW FOLLOWED BY /<TAB> NOT /<SPACE>
;
;EE) THE SYFILE COMMAND SPECIFIES A FILE FOR A SYMBOL TABLE.
;
;FF) THE XTRACT COMMAND READS THE SYMBOL FILE LOOKING FOR DDT'S
; SYMBOL TABLE POINTER AND EXTRACTING THE SYMBOL TABLE.
;
;GG) SYMBOLS ARE NOW ACCEPTED ON TYPE-IN. IF THE SYMBOL IS
; MULTIPLY DEFINED IT MUST BE PRECEDED BY A PROGRAM NAME.
; E.G. DUMP:EXPSYM
;
;HH) SYMBOLS ARE AVAILABLE FOR TYPE OUT IN SYMBOLIC INSTRUCTIONS.
;
;II) A PERMUTATION VECTOR IS COMPUTED FOR THE SYMBOL TABLE. THIS ALLOWS
; A BINARY SEARCH OF THE SYMBOL TABLE WHEN LOOKING FOR A SYMBOL
; MATCHING A VALUE.
;
;EDITS NOT SPECIFICALY LISTED ARE PART OF THE EDIT NUMBER PRIOR TO
; THEM. E.G. EDIT CLOSED OUT IN MIDDLE TO RELOAD THE MONITOR
; USES 2 EDIT NUMBERS. THE EDIT NUMBER IS INCREMENTED EVERY
; TIME THE FILE IS EDITED.
;EDITS AFTER 157:
;160) ADD REVISION HISTORY
;161) FIX LCHR TO HANDLE <TAB> CORRECTLY. PRIOR TO THIS EDIT IT
; CONSIDERED <TAB> A SINGLE PRINT POSITION.
;162) MAKE 20 THRU 24 ILLEGAL IN A LISTING FILE. ONLY END OF LINE
; NOW VALID ARE FORM FEED, LINE FEED AND VERTICAL TAB.
;163) MAKE FNDADR RETURN NXM IF ADDRESS IS NEGATIVE
;164) REMOVE JUNK AFTER THE NOT IN FILE MESSAGE
;165) SCAN SYMBOL TABLE FOR OPCODES AFTER TRYING BUILT
; IN TABLE
;166) RELOAD T1 AFTER CALL TO VAL2SY IF WE WANT NUMERIC OUTPUT.
;167) DO NOT OUTPUT NULLS
;170) REMOVE LOC/ FROM BLANK LINES.
;171) CLEAN UP LISTING
;172) IMPROVE FNDDAE TO:
; 1. RETURN NXM IF ADDRESS IS .GT. 777777
; 2. RETURN NXM IF ADDRESS IS BETWEEN LOW AND HIGH SEGS
; 3. REMEMBER FIRST 200 WORDS OF CORE IMAGE
;173) MORE OF 172
;174) ADD CODE TO MAKE LOOKING FOR A DAEMON CATEGORY INDEPENDENT
; OF THE ORDER IN WHICH THE CATEGORIES ARE WRITTEN
;200) CLEANUP NXM MESSAGE, FIX BAD LOGIC, RANDOM FIXES
; TO THE LISTING.
;203) AC'S DO NOT CONTAIN THE RIGHT VALUES. BUFFER IS REMEMBERED FROM
; SYMBOL FILE WHICH IS NOT RIGHT. FIX: DO NOT LOAD BUFFER DURING
; XTRACT COMMAND.
;204) ILL MEM REF AT CMPRED CAUSED BY CALLING CMPRED WRONG. FIX:
; CALL CORRECTLY AND FIX THE COMMENTS ON CMPRED.
;205) PART OF LISTING MISSING. ADD A LIST PSEUDO-OP
;206) THE PRESENT DEFAULTS HAVE BEEN CHANGED FOR SEVERAL
; COMMANDS. THE NEW PRESENT DEFAULTS ARE:
; ADDRESS ON
; AUTOFORMAT ON
; NUMPAGE 1
; NOTE: A PRESENT DEFAULT IS THE DEFAULT WHEN
; THE SWITCH IS GIVEN WITHOUT AN ARGUMENT.
;207) INPUT, OUTPUT, SYFILE ETC. WITHOUT AN ARGUMENT
; ARE NOW IGNORED. PRIO TO THIS EDIT THEY
; CAUSED A HALT.
;210) THE CLOSE COMMAND NOW CLEARS THE FILE OPEN BIT. IT
; ALSO FORCES APPEND MODE.
;211) THE ALL COMMAND CAN NOW BE TERMINATED BY AN <ESC>
;212) FIX .HGH AND .SHR FILES TO DUMP CORRECTLY. THIS INVOLVES
; STARTING THE /ALL SWITCH AT THE RIGHT PLACE AND MAKING
; ALL ADDRESSES BELOW THE HISEG NXM.
;214) " OPERATOR GIVEN MORE PRECEDENCE. ALSO HRL CHANGED
; TO HLR AS INTENDED.
;215) DATRED NOW LOOKS FOR ERRORS
;216) SOMETIMES THE NUMBERS DO NOT LINE UP. CRLF GETS OUTPUT
; IN PAD FIELD. CURE: SEE IF CRLF NEEDED AND
; PUT OUT FIRST IF IT IS REQUIRED AT ALL.
;217) IF AN INPUT COMMAND IS GIVEN PRIOR TO A SYFILE
; COMMAND THE INPUT FILE NAME IS USED AS THE
; DEFAULT FOR XTRACT.
;220) 1B0 DOES NOT GET OUTPUT CORRECTLY. FIX: MAKE RADIX
; PRINTER ADD ONE SO MOVM WILL RETURN
; A POSITIVE NUMBER.
;221) TITLES DO NOT WORK QUITE RIGHT. FIX: MAKE THE
; SPECIAL PATTERN <FF> CALL NEWPAG.
;222) CALL OSCAN TO READ USER SPECIFIC DEFAULTS. THIS IS A FILE
; IN THE USERS AREA CALLED SWITCH.INI WHICH CONTAINS A LIST
; OF SWITCHES ON A LINE BEGINING WITH DUMP:
;223) IGNORE SPACES NEXT TO &
;224) IF A LINE ENDS IN THE MIDDLE OF A QUOTED STRING ^? SOMETIMES
; GETS PRINTED. FIX: TEST FOR END OF LINE MORE OFTEN.
; ***NOTE: A WELL FORMED STRING MUST END WITH A QUOTE.
;225) CALLI'S DO NOT PRINT CORRECTLY. FIX: ADD DEVSTS TO TABLE.
;226) IF AN I/O ERROR TOOK PLACE ON A CLOSE COMMAND USER GOT THE WRONG
; ERROR MESSAGE. FIX: TEST RIGHT HALF OF STATUS
;227) ANY FILE WHICH IS LESS THAN 8 BLOCKS LONG AND IS NOT IN COMPRESSED
; FORMAT LOOKED ZERO WHEN THE FIRST WORD WAS EXAMINED. FIX: LOAD
; T1 WITH WORD FROM BUFFER PRIOR TO LOOKING FOR ERRORS. IF AN
; ERROR TOOK PLACE IT WILL NOT CAUSE WRONG TYPEOUT.
;230) THE XTRACT COMMAND DID NOT WORK CORRECTLY WITH MORE THAN 1 INPUT
; FILE. FIX: ADD CURRENT SIZE OF SYMBOL TABLE WHEN ASKING FOR
; CORE.
;231) LEFTMARGIN WORKS ON TTY: NOT ON LPT:. DIAGNOSIS: LINE FEED COMES
; OUT AFTER SPACES. FIX: PUT OUT LINE FEED FIRST.
;232) CHANGE MODE TO MODES IN COMMAND TABLE. REMOVE LISTAB.
;REV::
SUBTTL PARAMETERS AND DEFAULTS
;BIT POSITIONS FOR FLAGS WHICH MUST BE IN BYTE PTRS
FP.ADDR==0 ;BIT 0 IF ADDRESSES TO BE INCLUDED IN OUTPUT
FP.APP==1 ;BIT 1 IF TO APPEND TO OUTPUT
FP.AUTO==2 ;BIT 2 IF AUTOFORMATTING ON
FP.INST==3 ;BIT 3 IF INSTRUCTION MODE SELECTED
FP.PROG==4 ;BIT 4 IF PROGSYM ON
FP.SUBT==5 ;BIT 5 IF SUBTITLES REQUESTED
;FLAGS LH F
L.ADDR==(1B<FP.ADDR>) ;SET IF ADDRESSES TO BE OUTPUT
L.APP==(1B<FP.APP>) ;SET IF APPEND TO OUTPUT FILE, CLEAR IF SUPERSEDE
L.AUTO==(1B<FP.AUTO>) ;SET IF AUTOFORMATTING ON
L.INST==(1B<FP.INST>) ;SET IF INSTRUCTION MODE SELECTED
L.PROG==(1B<FP.PROG>) ;SET IF PROGSYM ON
L.SUBT==(1B<FP.SUBT>) ;SET IF SUBTITLES REQUESTED
L.TITL==(1B6) ;SET IF TITLE SPECIFIED
L.IOPN==(1B7) ;SET IF INPUT FILE OPEN
L.OOPN==(1B10) ;SET IF OUTPUT FILE OPEN
L.IEOF==(1B8) ;SET IF EOF ON INPUT FILE
;L.NAS==(1B9) ;SET IF OUTPUT NOT ASCII ONLY OR SIXBIT ONLY
;L.ASCO==(1B11) ;SET IF OUTPUT IS ASCII
;L.SIXO==(1B12) ;SET IF OUTPUT IS SIXBIT
L.SYM==(1B13) ;SET IF AN OUTPUT MODE REQUIRES SYMBOL LOOKUP
L.NXM==(1B14) ;SET IF TRIED TO FIND NON-EXISTENT LOCATION IN INPUT FILE
L.ALLD==(1B15) ;SET IF DUMPING ALL OF INPUT FILE
L.OTTY==(1B16) ;SET IF OUTPUT DEVICE IS A TTY
L.TDMP==(1B17) ;SET IF OUTPUT TO TTY AND OUTPUT DEVICE
;FLAGS RH F
R.CON1==1B18 ;SET IF DUMPING CONTENTS, NOT JUST ADDR
R.ANY==1B19 ;SET IF ANYTHING FOUND IN EXPEVA
R.CMAL==1B20 ;SET IF COMMA LEGAL (LEFT ANGLE BRACKET SEEN)
R.CONB==1B21 ;SET IF BYTE DESCRIPTOR WAS CONTENTS, NOT JUST ADDR
R.RPN==1B22 ;SET IN EXPRESSION EVALUATOR FOR RIGHT PAREN, ETC.
R.CNT==1B23 ;SET IF ONLY COUNTING CHARS, NOT OUTPUTTING
R.SCNT==1B24 ;SAVE COUNT BIT IN FORMAT SUBROUTINE
R.OVR==R.CONB ;SET IF OUTPUT LINE OVERFLOWS RIGHT MARGIN
R.LFD==R.CMAL ;SET IF LEADING LF LISTED IN OUTPUT SUBROUTINE
R.FFD==R.RPN ;SET IF LEADING FF LISTED IN OUTPUT SUBROUTINE
R.LKF==R.OVR ;USED IN OPEN OUTPUT ROUTINE
R.LTAB==1B25 ;USED IN LISTING TABS
R.NORE==1B26 ;SET IN FORMAT ROUTINE TO PREVENT RECURSION
R.PHED==1B27 ;SET IF TO OUTPUT PAGE HEADER BEFORE NEXT CHAR
R.LHED==1B28 ;SET IF TO OUTPUT LINE HEADER BEFORE NEXT CHAR
R.MARS==1B29 ;SET IF TO OUTPUT SPACES FOR LEFT MARGIN
R.RLH==1B30 ;REMEMBERS R.HED IN PAGE HEADER SUBROUTINE
;FLAGS IN LH OF DL
DL.JUS==(1B1) ;SET IF END OF JUSTIFY LIST NOT YET SEEN
DL.WID==(1B2) ;SET IF END OF WIDTH LIST NOT YET SEEN
DL.SYM==(1B3) ;SET IF READING SYMBOL FILE NOT SAVE FILE
DL.FBR==(1B4) ;SET IF WE NEED TO SORT SYMBOL TABLE
DL.PNF==(1B5) ;USED TO SCAN SYMBOL TABLE WHEN GOING
DL.MDL==(1B6) ; FROM SYMBOLIC TO BINARY
DL.SNF==(1B7) ;FLAG SET WHEN DOING BINARY SCAN AND SYMBOL
; IS NOT FOUND (USED TO PREVENT LOOP)
DL.NBR==(1B8) ;FLAG SET IF LAST CALL TO VALUE SYMBOL CONVERTER
; (VAL2SY) GAVE ERROR RETURN.
DL.NXM==(1B9) ;<NXM> OUTPUT
DL.TR5==(1B10) ;SET TO 1 WHEN SCANING SYMBOL TABLE AND AN
; UNDEFINED SYMBOL IS SEEN. IT CAUSES RADIX50
; GENERATOR TO OUTPUT TO TTY:.
DL.XCT==(1B11) ;SET TO 1 IF ONLY AN EXACT MATCH WILL DO
; WHEN TYPING OUT SYMBOLS
DL.ANXM==(1B12) ;SET IF USER DID A CORE ZERO, DCORE.
DL.SYF==(1B13) ;SET BY SYFILE
;MISC
ND PDLEN,200
ND LN.DRB,6
ND WINSIZ,2000
ND FBMTIM,5
ND EC.FBM,3
ND POSSHF,^D30
PHLINS==4 ;NUMBER OF LINES OUTPUT IN PAGE HEADER
ND MINLPG,PHLINS ;MINIMUM NUMBER OF LINES PER PAGE
IFL MINLPG-PHLINS-1,<MINLPG==PHLINS+1 ;MUST NOT BE LESS THAN LINES IN PAGE HEADER+1>
;DAEMON CATEGORIES
CA.JOB==1 ;JOB INFORMATION
CA.CNF==2 ;CONFIGURATION TABLE
CA.DDB==3 ;DDB'S
CA.COR==4 ;USER'S CORE
ND CA.MAX,4
;DEVCHR BITS
DV.TTY==(1B5) ;TTY
DV.DIR==(1B15) ;DIRECTORY DEVICE
;FLAGS IN RADIX50 SYMBOLS
ST.SPD==(1B0) ;IF 1 DO NOT TYPE OUT THIS SYMBOL
ST.SPI==(1B1) ;IF 1 DO NOT MATCH ON INPUT
ST.LCL==(1B2) ;IF 1 THIS IS A LOCAL
ST.GLB==(1B3) ;IF 1 THIS IS A GLOBAL
ST.PGM==(17B3) ;IF ALL 4 BITS ARE ZERO THIS IS A PROGRAM NAME
ST.SIN==(5B3) ;GLOBAL WICH DOES NOT TYPE OUT
ST.KIL==(14B3) ;TYPE $$K TO DDT ON THIS SYMBOL
;ASCII CHARS
C.LF==12 ;LINE FEED
C.VT==13 ;VERTICAL TAB
C.FF==14 ;FORM FEED
C.CR==15 ;CARRIAGE RETURN
C.ALT==33 ;ALTMODE
C.DQ==42 ;DOUBLE QUOTE
;DEFAULTS FOR VERB TABLES
DM ADR,ONOFOF,ONOFON,ONOFON
DM CAT,CA.MAX,CA.COR,CA.COR
DM INS,1,1,1
DM IRX,^D10,^D10,^D10
DM LMG,0,0,0
DM LNP,0,^D50,^D50
DM NPG,10000,0,1
DM ORX,^D10,^D8,^D8
DM PGL,0,^D50,^D50
DM RMG,0,^D60,^D60
ND AD.TYP,T.DATA
;JUSTIFY KEYS
J.LFT==0 ;LEFT JUSTIFY
J.CEN==1 ;CENTER JUSTIFY
J.RHT==2 ;RIGHT JUSTIFY
J.END==<1_J.S>-1 ;END OF LIST MARKER
J.S==2 ;NUMBER OF BITS IN JUSTIFY FIELDS
;MODES KEYS
DEFINE MODXM<
MODXMC <NULL,ASCII,SIXBIT,RADIX5,OCTAL,SOCTAL,DECIMA,FLOAT,SYMBOL,SMART,NUMERI,ALL>
>
DEFINE MODXMC(A)<
ZZ==-1
IRP A,<
M.'A==<ZZ==ZZ+1>
>>
MODXM
M.END==<1_M.S>-1 ;END OF LIST MARKER
M.S==4 ;NUMBER OF BITS IN MODES FIELD
;SUBTITLE KEYS
SUBT.S==7 ;STANDARD ASCII CHARACTER SIZE
SUBT.E==0 ;END OF SUBTITLE CHARACTER
;TITLE KEYS
TIT.S==7 ;STANDARD ASCII CHARACTER SIZE
TIT.EN==0 ;END OF TITLE CHARACTER
;TYPE KEYS FOR FILE TYPE
DEFINE TYPXM<
TYPXMC <TMP,DAE,SHR,SAV,HGH,LOW,XPN,DMP,SDSK,DDIR,DECT,DATA>
>
DEFINE TYPXMC(A)<
ZZ==0
IRP A,<T.'A==<ZZ==ZZ+1>>>
;DEFINE TYPES
TYPXM
T.EEND==T.DMP ;END OF EXTENSIONS WHICH ARE ALSO TYPES
;WIDTH KEYS
W.END==<1_W.S>-1 ;END OF LIST MARKER
W.S==9 ;NUMBER OF BITS IN WIDTH FIELDS
DEFINE VERBSW<
SP ADDRESS,<POINT 1,F,FP.ADDR>,ADDRST,ADR
SP *ALL,,ALLDMP
SS APPEND,<POINT 1,F,FP.APP>,1
SP AUTOFORM,<POINT 1,F,FP.AUTO>,AUTOST,ADR
SP BEGIN,,BEGIN
SP CATEGORY,CATNUM,CATRED,CAT
SP CLOSE,,CLSFIL
SP COFILE,C.ZER,CGTFIL
SP COMPARE,,CMPDMP
SP DELSYM,,DELSYM
SP DO,,DOPROC
SP *DUMP,,DMPBYT
SP EJECT,,EJECT
SP END,,ENDPRC
SP EXIT,,XIT
SP IF,,IFPROC
SP INDEX,,E.NIMP
SP *INPUT,I.ZER,IGTFIL
SP IOFFSET,,IOFPRC
SP INSTRUCTION,<POINT 1,F,FP.INST>,INSTST,INS
SP IRADIX,IRADIX,.SWDEC##,IRX
SP JUSTIFY,,JUSPRC
SP LEFTMARGIN,LMARGN,EXPSTO,LMG
SP LINEPAGE,LINPAG,LINPGS,LNP
;SP LISTAB,,LISPRC
SP *MODES,,MODPRC
SP NUMPAGE,PAGNUM,EXPSTO,NPG
SP OOFFSET,,OOFPRC
SP ORADIX,ORADIX,.SWDEC##,ORX
SP *OUTPUT,O.ZER,OGTFIL
SP PAGELIMIT,PAGLIM,EXPSTO,PGL
SP POP,,POPPRC
SL PROGSYM,<POINT 1,F,FP.PROG>,ONOF,1
SP PUSH,,PUSHPR
SP RIGHTMARGIN,RMARGN,EXPSTO,RMG
SP SKPBLOCKS,SBLOCK,EXPSTO
SP SKPFILES,SFILES,EXPSTO
SP SORT,,E.NIMP
SS SUBTITLE,<POINT 1,F,FP.SUBT>,1
SS SUPERSEDE,<POINT 1,F,FP.APP>,0
SP SYMBOL,,SYMPRC
SP SYFILE,S.ZER,SGTFIL
SP TABSYM,,TSYMPR
SP TCOMPARE,,TCMDMP
SP *TDUMP,,TDMBYT
SP TSORT,,E.NIMP
SP TITLE,,TITPRC
SL TYPE,F.ZER+%TYP,TYPE
SP WIDTH,,WIDPRC
SP XTRACT,,XPROC
> ;END SWTCHS MACRO
DEFINE SWTCHS,<VERBSW>
DOSCAN(VERB)
RELOC
IBUF: BLOCK 200 ;INPUT BUFFER (MUST BE HERE SO WE CAN PHASE CODE
; INTO IT)
RELOC
;TABLE OF SWITCHES WHICH ARE LEGAL IN SWITCH.INI
; THIS SWITCHES MAY BE PLACED IN A FILE ON THE USERS AREA WHICH
; WILL SET HIS USERS SPECIFIC DEFAULTS.
DEFINE SWTCHS<
SP ADDRESS,<POINT 1,F,FP.ADDR>,ADDRST,ADR
SS APPEND,<POINT 1,F,FP.APP>,1
SP AUTOFORM,<POINT 1,F,FP.AUTO>,AUTOST,ADR
SP CATEGORY,CATNUM,CATRED,CAT
SP INSTRUCTION,<POINT 1,F,FP.INST>,INSTST,INS
SP IRADIX,IRADIX,.SWDEC##,IRX
SP JUSTIFY,,JUSPRC
SP LEFTMARGIN,LMARGN,.SWDEC##,LMG
SP LINEPAGE,LINPAG,LINPGS,LNP
SP *MODES,,MODPRC
SP NUMPAGE,PAGNUM,.SWDEC##,NPG
SP ORADIX,ORADIX,.SWDEC##,ORX
SP PAGELIMIT,PAGLIM,.SWDEC##,PGL
SL PROGSYM,<POINT 1,F,FP.PROG>,ONOF,1
SP RIGHTMARGIN,RMARGN,.SWDEC##,RMG
SS SUPERSEDE,<POINT 1,F,FP.APP>,0
SL TYPE,F.ZER+%TYP,TYPE
SP WIDTH,,WIDPRC
> ;END SWTCHS MACRO
XALL
DOSCAN (OPTN)
XALL
;SPECIAL TABLE OF ABSENT DEFAULTS
DEFINE SL(A,B,C,D)<
EXP D ;DEFAULT FOR /'A
>
DEFINE SP(A,B,C,D)<
EXP AD.'D ;DEFAULT FOR /'A
>
DEFINE SS(A,B,C)<
EXP 0 ;DEFAULT FOR /'A
>
AD.==0
XALL
ABSTAB: VERBSW
DEFINE SL(NAME,RESULT,TABLE,DEFAULT),<
X NAME,TABLE'.T-1,<RESULT>,DEFAULT,-TABLE'.L
>
DEFINE SP(NAME,RESULT,PROCESSOR,ABBR),<
X NAME,PROCESSOR,<RESULT>,PD.'ABBR,MX.'ABBR
>
DEFINE SS(NAME,RESULT,VALUE),<
X NAME,0,<RESULT>,VALUE,0
>
;AND FINALLY, THE KEY-WORD VALUES
KEYS ONOF,<ON,OFF>
KEYS CATM,<JOB,CONFIG,DDB,CORE>
KEYS DENS,<0,2,5,8>
KEYS JUST,<LEFT,CENTER,RIGHT>
KEYS PARI,<,ODD,EVEN>
DEFINE TYPXMC(A)<
XLIST
IRP A,<SIXBIT \A\>
LIST>
TYPE.T: TYPXM
TYPE.L==.-TYPE.T
DEFINE MODXMC(A)<
XLIST
IRP A,<SIXBIT \A\>
LIST>
MODE.T: MODXM
MODE.L==.-MODE.T
SUBTTL BUILT-IN SYMBOLS
;THIS IS A TABLE OF SPECIAL BUILT IN SYMBOLS. THE USERS SYMBOL TABLE
; IS SEARCHED FOR THE SYMBOL AND IF IT IS NOT FOUND THE BUILT-IN TABLE
; IS TRIED. THE S MACRO HAS 2 ARGUMENTS: THE FIRST IS THE SYMBOL AND
; THE SECOND IS THE LOCATION WITHIN DUMP CONTAINING THE VALUE OF THAT
; SYMBOL.
DEFINE MSYM,<
S <.>,SAVE4. ;THE ADDRESS OF THE LAST WORD TYPED OUT
; THIS IS THE LOCATION COUNTER.
S <$>,SAVE4$ ;THE LAST BYTE TYPED OUT.
S <%>,SAVEXP ;THE LAST THE THE EXPERSSION EVALUATOR
; RETURNED. THIS IS A SORT OF . IMMEDIATE
; SO D UUOCON:UCLJMP&%+100 IS THE SAME AS
; D UUOCON:UCLJMP&UUOCON:UCLJMP+100
>
XALL
DEFINE S(A,B),<
RADIX50 0,A ;A IN RADIX50
>
MSYMTB: MSYM ;BUILT-IN SYMBOL TABLE
L.MSYM==.-MSYMTB
DEFINE S(A,B)<
EXP B ;POINTER TO VALUE OF A
>
MSYMAD: MSYM
SUBTTL ROUTINE TO HANDLE EXPRESSION VALUED SWITCHES
;SUBROUTINE TO GET AN EXPRESSION AND STORE
;ARGS P1=INDEX IN VERB TABLE
EXPSTO: HRRZ T1,VERBD(P1) ;PICK UP DEFAULT
SKIPE T2,VERBP(P1) ;PICK UP STORAGE LOCATION
DPB T1,T2 ;STOR DEFAULT IF WE KNOW WHERE
PUSHJ P,EXPEVA ;EVALUATE THE EXPRESSION
HLRZ T2,VERBM(P1) ;GET MAX LEGAL VALUE
JUMPE T2,EXPST1 ;JUMP IF NO MAX
CAMLE T1,T2 ;SKIP IF VALUE SPECIFIED .LE. MAX
JRST E.MAX ;NO. ERROR.
EXPST1: SKIPN T2,VERBP(P1) ;GET THE POINTER
POPJ P, ;NONE.
MOVE N,T1 ;N=VALUE TO BE STORED
MOVEI P2,[0
VERBP(P1)]
PJRST .SWDPB## ;STORE THE VALUE
SUBTTL INITIALIZE
;REPEAT FOR EACH SUPPORTED
; ENTRY POINT.
DUMP: REPEAT 2,<JSP T3,DUMPGO> ;T3 _ ADDRESS OF ENTRY
DUMPGO: SUBI T3,DUMP+1 ;CONVERT TO OFFSET
HRRZM T3,SAOFST# ;STORE FOR SCAN TO LOOK AT
RESET
MOVE P,PDL ;SET UP PUSH DOWN LIST POINTER
;HERE TO CLEAR CORE
SETZB F,ZER ;CLEAR FLAGS AND FIRST LOC OF CORE
MOVE T1,[XWD ZER,ZER+1]
BLT T1,EZER
;HERE TO INIT SCANNER
MOVE 1,[3,,[0
SAOFST,,'DMP'
0]]
PUSHJ P,.ISCAN ;CALL SCAN
;HERE TO SCAN SWITCH.INI FOR USER SPECIFIC DEFAULTS
SETZM FM ;CLEAR THE MASK WORD
MOVSI P1,-OPTNL ;LENGTH OF OPTION TABLE
OPTSET: HLRZ T1,OPTNP(P1) ;GET THE POINTER TYPE
CAIN T1,004400 ;FULL WORD VALUE?
SETOM @OPTNP(P1) ;YES-- -1 IS FLAG FOR UNKNOWN
AOBJN P1,OPTSET ;LOOP OVER THAT TABLE
MOVE 1,[4,,[IOWD OPTNL,OPTNN
XWD OPTND,OPTNM
XWD 0,OPTNP
EXP -1]]
PUSHJ P,.OSCAN## ;SCAN THE FILE
;HERE TO STORE ABSENT DEFAULTS
MOVSI P1,-VERBL ;MINUS LENGTH OF VERB TABLES
ABDEFS: SKIPN T1,VERBP(P1) ;GET THE POINTER
JRST ABDEF1 ;IF NONE SKIP SWITCH
MOVE T3,@T1 ;GET THE WORD WITH THE BYTE
HLRZ T2,T1 ;GET THE SIZE PART
CAIN T2,004400 ;IS IT A FULL WORD
JRST [AOJN T3,ABDEF1 ;YES--JUMP IF KNOWN ALREADY
JRST ABDEF2] ; ELSE FILL IN DEFAULT
AOS T1 ;BYTES HAVE A MASK WORD
LDB T1,T1 ;GET THE MASK
JUMPN T1,ABDEF1 ;SKIP IF FILLED IN
ABDEF2: MOVE T1,ABSTAB(P1) ;ABSENT DEFAULT
PUSHJ P,EXPST1 ;STORE DEFAULT
ABDEF1: AOBJN P1,ABDEFS
;HERE TO SET UP TABLES
MOVSI T2,-LSTTAB-1
MOVE T1,.JBFF ;FIRST AVAILABLE LOCATION
MOVEM T1,TABVEC(T2) ;STORE AS ORIGIN OF EACH TABLE
AOBJN T2,.-1
;HERE TO SET UP IOWD'S
MOVE T1,[IOWD 200,IBUF]
MOVEM T1,INPLST
MOVE T1,[IOWD WINSIZ,WINDOW]
MOVEM T1,WINLST
;HERE TO SET UP DEFAULTS
OTDEFS: TLO F,L.ADDR+L.APP+L.AUTO+L.INST+L.PROG
MOVE P1,M.Y ;BYTE POINTER FOR MODES LIST
PUSHJ P,MKPNTR
MOVEI P2,MODNDX
MOVEI T1,M.OCTA ;OCTAL
PUSHJ P,STOBYT
MOVEI T1,M.END ;END OF LIST
PUSHJ P,STOBYT
MOVE P1,J.Y ;BYTE POINTER FOR JUSTIFY LIST
PUSHJ P,MKPNTR
MOVEI P2,JUSNDX
MOVEI T1,J.END ;START WITH NULL LIST
PUSHJ P,STOBYT
MOVE P1,W.Y ;BYTE POINTER FOR WIDTH LIST
PUSHJ P,MKPNTR
MOVEI P2,WIDNDX
MOVEI T1,W.END
PUSHJ P,STOBYT
MOVSI T1,(SIXBIT .LPT.) ;DEFAULT OUTPUT DEVICE
MOVEM T1,O.DEV
MOVSI T1,(SIXBIT .DSK.)
MOVEM T1,I.DEV ;INPUT DEFAULT IS DSK
MOVEM T1,S.DEV
MOVEM T1,C.DEV
PJOB T1, ;GET JOB NUMBER
PUSHJ P,.MKPJN ;CONVERT TO SIXBIT IN LH
MOVS T4,T1 ;GET JOB NUMBER
HRRI T4,(SIXBIT .DAE.)
MOVEM T4,O.NAM ;DEFAULT OUTPUT NAME
MOVEM T4,I.NAM ;DEFAULT INPUT NAME
MOVEM T4,S.NAM ;DEFAULT SYMBOL NAME
MOVEM T4,C.NAM ;DEFAULT COMPARISON FILE NAME
MOVSI T1,(SIXBIT .LSD.)
MOVEM T1,O.EXT ;DEFAULT OUTPUT EXTENSION
SUBTTL MAIN LOOP
;HERE FOR MAIN LOOP - CALL COMMAND SCANNER
MOVE 1,[6,,[IOWD VERBL,VERBN
XWD VERBD,VERBM
XWD 0,VERBP
EXP -1
XWD FAREAL,FAREA
XWD 0,PAREA]]
MOVEI DL,I.ZER
PUSHJ P,.VSCAN
JRST XIT
SUBTTL VERB PROCESSORS
;SUBROUTINE TO READ FILE SPECIFIER AND STORE IN APPROPRIATE BLOCK
IGTFIL: TLZ F,L.IOPN!L.IEOF ;NOTE INPUT NOT OPEN
SETZM I.DEV+%TYP ;ALLOW NEW TYP SPECIFICATION
PUSHJ P,GETFIL ;GO GET THE SPEC
MOVEI T2,S.ZER ;LOAD THE ADDRESS OF SYFILE BLOCK
TLNN DL,DL.SYF ;SYFILE COMMAND GIVEN?
PJRST CPYSPC ;NO--NEW DEFAULT
POPJ P, ;YES--NO CHANGE
OGTFIL: PUSHJ P,CLSFIL ;CLOSE CURRENT OUTPUT FILE
TLZ F,L.OOPN!L.OTTY ;NOTE OUTPUT FILE NOT OPEN
SETZM LINNUM ;START AT TOP OF PAGE
JRST GETFIL
SGTFIL: TLO DL,DL.SYF ;FLAG SYFILE GIVEN
CGTFIL:
GETFIL: JUMPLE C,.POPJ ;RETURN IF NULL SPEC
PUSHJ P,.FILIN ;READ FILE SPECIFIER
MOVEI T1,F.ZER ;POINT TO BLANK SPEC
MOVEI T2,F.LEN ;LENGTH OF SAME
PUSHJ P,.GTSPC ;BLT THE SPEC FROM SCAN
HRRZ T2,VERBP(P1) ;ADDR OF BLOCK TO STORE RESULT
CPYSPC: SKIPE T1,F.ZER+%DEV ;SKIP IF NO DEVICE SPECIFIED
MOVEM T1,%DEV(T2) ;STORE DEVICE IN BLOCK
SKIPE T1,F.ZER+%NAM ;SKIP IF NO NAME SPECIFIED
MOVEM T1,%NAM(T2) ;STORE NAME IF BLOCK
SKIPE T1,F.ZER+%EXT ;SKIP IF NO EXT SPECIFIED
MOVEM T1,%EXT(T2)
SKIPE T1,F.ZER+%DIR ;SKIP IF DIRECTORY SPECIFIED
MOVEM T1,%DIR(T2)
SKIPE T1,F.ZER+%MOD
MOVEM T1,%MOD(T2)
SKIPE T1,%TYP+F.ZER
MOVEM T1,%TYP(T2)
POPJ P,
INSTST:
AUTOST:
ADDRST: SKIPA T1,[IOWD ONOF.L,ONOF.T] ;PTR TO LIST FOR ON OR OFF
CATRED: MOVE T1,[IOWD CATM.LT,CATM.T] ;PTR TO LIST OF CATEGORIES
; PJRST LSTSTO ;FALL INTO LSTSTO
;SUBROUTINE TO FIND A SWITCH VALUE IN A LIST
;ARGS T1=IOWD PTR TO LIST OF LEGAL SWITCHES
LSTSTO: MOVEM T1,KEYPTR ;SAVE IOWD PTR TO LIST OF LEGAL VALUES
HRRZ T1,VERBD(P1) ;GET DEFAULT
SKIPE T2,VERBP(P1) ;SKIP IF NO STORAGE PTR
DPB T1,T2 ;STORE DEFAULT FIRST
JUMPLE C,.POPJ ;EXIT IF NO VALUE SPECIFIED
PUSHJ P,KLOOK ;FIND VALUE SPECIFIED IN LIST
AOJA T1,EXPST1 ;+1 FOR INTERNAL FORM AND STORE
;SUBROUTINE TO EXIT TO MONITOR - CLOSES OUTPUT FIRST
XIT: PUSHJ P,CLSFIL ;CLOSE OUTPUT FILE
EXIT 1 ;EXIT TO MONITOR
EXIT
;SUBROUTINE TO CLOSE OUTPUT FILE
CLSFIL: TLZN F,L.OOPN ;SKIP IF OUTPUT FILE OPEN
POPJ P, ;NOOP IF NOT OPEN
TLO F,L.APP ;FORCE APPEND MODE
CLOSE OC,
GETSTS OC,N ;GET STATUS
RELEAS OC, ;GIVE UP THE DDB
TRNN N,IO.ERR ;SKIP IF ANY ERRORS
POPJ P,
M.FAIO <ERROR CLOSING OUTPUT FILE, STATUS =>
;SUBROUTINE TO STORE LINES PER PAGE AND WORRY ABOUT MINIMUM
LINPGS: PUSHJ P,EXPSTO ;STORE LINES PER PAGE AS SPECIFIED
MOVEI T1,MINLPG ;GET MINIMUM
CAMLE T1,LINPAG ;SKIP IF SPECIFIED GE MINIMUM
MOVEM T1,LINPAG ;NO, STORE MINIMUM
POPJ P,
GETSPC: MOVEI T1,F.ZER
MOVEI T2,F.LEN
PUSHJ P,.GTSPC
MOVE T1,F.ZER+%TYP
MOVEM T1,%TYP(P1)
POPJ P,
;SUBROUTINE TO ACCEPT A TITLE
TITPRC: PUSHJ P,.SAVE4
TLO F,L.TITL ;NOTE PRESENCE OF TITLE
MOVEI P2,TITNDX ;INDEX IN TABLE VECTOR
MOVE P1,TIT.Y ;BYTE POINTER FOR TITLE
PUSHJ P,MKPNTR ;MAKE A REAL POINTER
TITPR1: JUMPLE C,TITPRX ;EXIT AT END OF LINE
PUSHJ P,.TIALT ;READ NEXT CHAR
MOVE T1,C
PUSHJ P,STOBYT ;STORE IN TITLE TABLE
JRST TITPR1 ;AND LOOP TILL END OF LINE
TITPRX: MOVEI T1,TIT.EN ;MARK END OF TITLE
PJRST STOBYT
;SUBROUTINE TO EVALUATE MODES LIST
MODPRC: MOVE P1,M.Y ;BYTE POINTER FOR MODES LIST
PUSHJ P,MKPNTR ;CLEAR THE INDIRECT BIT
MOVEI P2,MODNDX ;INDEX IN TABLE VECTOR
MOVE T1,[IOWD MODE.L,MODE.T]
PJRST TABPRC ;PROCESS LIST
;SUBROUTINE TO EVALUATE JUSTIFY LIST
JUSPRC: MOVE P1,J.Y ;BYTE POINTER FOR JUSTIFY LIST
PUSHJ P,MKPNTR ;CLEAR INDIRECT BIT IN POINTER
MOVEI P2,JUSNDX ;INDEX IN TABLE VECTOR
MOVEI T1,J.END ;START WITH EMPTY LIST
PUSHJ P,STOBYT ;STORE END OF LIST
MOVE P1,J.Y
PUSHJ P,MKPNTR ;CLEAR INDIRECT BIT IN POINTER
MOVE T1,[IOWD JUST.LT,JUST.T]
; PJRST TABPRC ;PROCESS LIST
;SUBROUTINE TO READ TTY AND STORE A SERIES OF BYTES FOR KEY WORDS
;ARGS T1=AOBJN PTR TO LIST OF KEY WORDS
; P1=BYTE POINTER (TO BE INCREMENTED)
; P2=INDEX IN TABLE VECTOR OF TABLE
TABPRC: MOVEM T1,KEYPTR ;SAVE POINTER TO LIST OF KEYWORDS
TABPR1: JUMPLE C,TABPR2 ;EXIT AT END OF LINE
PUSHJ P,KLOOK ;FIND KEY WORD IN LIST
PUSHJ P,STOBYT ;STORE VALUE
JRST TABPR1
TABPR2: SETO T1, ;END OF LIST FLAG
PJRST STOBYT ;STORE IT
;SUBROUTINE TO LOOK UP A KEY WORD IN A LIST
;ARGS KEYPTR=IOWD PTR TO LIST OF LEGAL VALUES
;VALUES T1=INDEX IN LIST IF FOUND
KLOOK: PUSHJ P,.SIXSW ;GET KEYWORD
MOVE T1,KEYPTR ;PTR TO LIST OF KEY WORDS
PUSHJ P,.NAME ;LOOK IT UP
JRST E.UKK ;UNKNOWN KEY WORD
HRRZ T2,KEYPTR ;ADDR OF BEGINNING OF LIST
MOVEI T1,-1(T1)
SUB T1,T2 ;INDEX IN LIST IS VALUE
POPJ P,
;SUBROUTINE TO EVALUATE WIDTH LIST
WIDPRC: MOVE P1,W.Y ;BYTE POINTER FOR WIDTH LIST
PUSHJ P,MKPNTR ;CLEAR INDIRECT BIT IN POINTER
MOVEI P2,WIDNDX ;INDEX IN TABLE VECTOR
MOVEI T1,W.END ;START WITH EMPTGY LIST
PUSHJ P,STOBYT ;STORE END OF LIST
MOVE P1,W.Y
PUSHJ P,MKPNTR ;CLEAR INDIRECT BIT IN POINTER
WIDPR1: JUMPLE C,WIDPR2 ;EXIT AT END OF LINE
PUSHJ P,EXPEVA ;EVALUATE EXPRESSION
PUSHJ P,STOBYT ;STORE IT
JRST WIDPR1
WIDPR2: MOVEI T1,W.END ;MARK END OF LIST
PJRST STOBYT ; AND STORE IT
EJECT: PUSHJ P,OPNOUT ;MAKE SURE OUTPUT FILE OPEN
PJRST NEWPAG ;OUTPUT PAGE EJECT AND PAGE HEADER
;SUBROUTINE TO DUMP ALL OF FILE
ALLDMP: JUMPG C,E.EXP
PUSH P,C ;SAVE LAST CHAR INPUT
SETZM SAVADR ;START AT LOCATION 0
SETZM SAVPOS ;START OF WORD
MOVEI T1,^D36 ;36 BIT BYTES
MOVEM T1,SAVSIZ
HRLOI T1,377777 ;GO TO END OF FILE
MOVEM T1,TRMADR
SETZM TRMPOS
MOVEI T1,1 ;INCREMENT BY 1 WORD
MOVEM T1,INCADR
SETZM INCPOS
PUSHJ P,OPNOUT ;MAKE SURE OUTPUT FILE OPEN
PUSHJ P,NEWLIN
SETZB T1,INCSIZ
TRO F,R.CON1 ;NOTE DUMPING CONTENTS
PUSHJ P,FNDADR ;GET CONTENTS OF ZERO
TLNN F,L.NXM ;SKIP IF NXM ALREADY
PUSHJ P,OUTPT ;OUTPUT LOCATION 0
MOVE T1,%TYP(DL) ;TYPE OF INPUT FILE
MOVE T2,CATNUM ;CATEGORY IN CASE ITS DAEMON FILE
CAIN T1,T.DAE ;SKIP IF NOT A DAEMON FILE
CAIE T2,CA.COR ;SKIP IF CORE CATEGORY
JRST ALLDM1 ;NO, JUST GO AHEAD
TRO F,R.CON1 ;SET CONTENTS BIT
MOVEI T1,.JBREL ;ADDR OF .JBREL
PUSHJ P,FNDADR ;RETRIEVE .JBREL
MOVEM T1,LOWREL ;SAVE FOR LATER
ALLDM1: TLO F,L.ALLD ;NOTE DUMPING WHOLE FILE
MOVE T2,HGHOFF ;GET OFFSET FOR HISEG
CAIE T1,T.HGH ;IS THIS A HIGH SEG
CAIN T1,T.SHR ; OR A .SHR SEG?
MOVEM T2,SAVADR ;YES--START AT 400000
PJRST DMPXC0
;SUBROUTINE TO EXECUTE A DUMP REQUEST
DMPBYT: TLZA F,L.TDMP ;DO NOT DUMP ON TTY
TDMBYT: TLO F,L.TDMP ;ALSO DUMP ON TTY:
JUMPLE C,.POPJ ;GIVE UP IF NOTHING TO DO
TLZ DL,DL.NXM ;CAUSE ANOTHER MESSAGE
PUSHJ P,OPNOUT ;MAKE SURE OUTPUT FILE OPEN
PUSH P,C ;SAVE BREAK
PUSHJ P,NEWLIN ;START DUMP ON NEW LINE
POP P,C ;RESTORE C
MOVE T2,SAVADR ;GET LAST ADDRESS TYPED OUT
MOVEM T2,SAVE4. ;SAVE FOR .
MOVE T2,OUTVAL ;GET LAST BYTE TYPED OUT
MOVEM T2,SAVE4$ ;SAVE FOR $
DMPBYS: TRZ F,R.CON1 ;CLEAR CONTENTS FLAG
PUSHJ P,EXPEV0 ;EVALUATE FIRST EXPRESSION
MOVEM T1,SAVEXP ;STORE FOR %
CAIN C," " ;SEE IF DELIMITER IS A SPACE AND
PUSHJ P,.TIAUC## ; IF SO GET ANOTHER CHAR.
CAIN C,"'" ;SKIP IF NOT A STRING COMING
TRNE F,R.ANY ;SKIP IF STRING AND NO DUMP DESC.
JRST DMPBY1 ;DO BYTE FIRST
JRST DMPEXA ;NOTHING TO DUMP
DMPBY1: MOVE T2,POSTMP ;POSITION SPECIFIED
MOVEM T2,SAVPOS
MOVE T2,SIZTMP
MOVEM T2,SAVSIZ
PUSH P,C ;SAVE LAST CHAR INPUT
MOVEM T1,SAVADR ;ASSUME VALUE ONLY, SAVE AS ADDRESS
TRNN F,R.CONB ;SKIP IF ACTUALLY CONTENTS OF ADDRESS
JRST DMPBY2
TRO F,R.CON1 ;NOTE DUMPING CONTENTS
MOVE T2,ADRTMP ;ADDRESS FETCHED
MOVEM T2,SAVADR ;IS ADDRESS TO SAVE
DMPBY2: PUSHJ P,OUTPT ;OUTPUT VALUE OF FIRST BYTE
SETZM INCSIZ ;DEFAULT SIZE INCREMENT
MOVEI T1,1 ;DEFAULT POSITION=0(+1 FOR OFFSET)
MOVEM T1,INCPOS ;STORE DEFAULT POSITION INCREMENT
MOVEM T1,INCADR ;STORE DEFAULT ADDRESS INCREMENT
MOVEI T1,^D37 ;DEFAULT END AT END OF THIS WORD
MOVEM T1,TRMPOS
MOVE T1,SAVADR ;ADDRESS OF THIS WORD
MOVEM T1,TRMADR
SKIPLE C,(P) ;RESTORE LAST CHAR INPUT, SKIP IF END OF LINE
CAIE C,"&" ;SKIP IF TERMINATING BYTE SPECIFIED
JRST DMPXC0 ;END OF THAT BYTE DESCRIPTOR, GET NEXT
SETZM POSTMP
SETZM SIZTMP
PUSHJ P,EXPEVA ;EVALUATE TERMINATING BYTE SPECIFIER
CAIN C," " ;IGNORE TRAILINGE SPACES
PUSHJ P,.TIAUC## ; ..
MOVEM T1,TRMADR ;SAVE TERMINATING ADDRESS
SKIPN T1,POSTMP ;POSITION VALUE, SKIP IF SPECIFIED
MOVEI T1,1 ;0 (+1 FOR OFFSET) IS DEFAULT
MOVEM T1,TRMPOS
CAIE C,"&" ;SKIP IF INCREMENT SPECIFIED
JRST DMPXCT ;NO, USE DEFAULT INCREMENT
SETZM POSTMP
SETZM SIZTMP
PUSHJ P,EXPEVA ;EVALUATE INCREMENT
MOVEM T1,INCADR ;SAVE INCREMENT ADDRESS
MOVE T1,POSTMP ;POSITION INCREMENT
MOVEM T1,INCPOS
MOVE T1,SIZTMP ;SIZE INCREMENT
MOVEM T1,INCSIZ
DMPXCT: MOVEM C,(P) ;SAVE LAST CHAR INPUT
DMPXC0: MOVE T1,SAVADR ;ADDR OF LAST BYTE OUTPUT
MOVE T2,SAVPOS ;POSITION LAST OUTPUT
LSH T2,POSSHF
ADD T2,SAVSIZ ;MAKE POSITION, SIZE WORD
MOVE T3,INCADR ;INCREMENT ADDRESS
MOVE T4,INCPOS ;INCREMENT POSITION
LSH T4,POSSHF
ADD T4,INCSIZ ;MAKE INCREMENT POSITION,SIZE WORD
PUSHJ P,ADDBYT ;INCREMENT BYTE
JOV DMPEX ;IF WE WENT FROM +INF TO -INF DO NOT
; LOOP FOR EVER.
CAMLE T1,TRMADR ;SKIP IF NOT YET UP TO TERMINATING ADDRESS
JRST DMPEX
MOVEM T1,SAVADR ;SAVE NEW ADDR
LDB T1,[POINT 36-POSSHF,T2,35-POSSHF] ;GET NEW POSITION
MOVEM T1,SAVPOS
MOVE T1,SAVADR
CAME T1,TRMADR ;SKIP IF IN LAST WORD
JRST DMPXC1 ;NO, GO AHEAD WITH DUMP
MOVE T1,SAVPOS ;POSITION
CAMLE T1,TRMPOS ;SKIP IF NOT YET PAST LAST BYTE IN WORD
JRST DMPEX ;ALL DONE, EXIT
DMPXC1: TLNN DL,DL.WID ;SKIP IF WE CONTROL OUR OWN WIDTHS
PUSHJ P,LSPC3 ;ELSE OUTPUT 3 SPACES
MOVE T1,SAVADR
TRNE F,R.CON1 ;SKIP IF ONLY ADDRESSES ARE VALUES DUMPED
PUSHJ P,FNDBYT ;FIND CONTENTS OF ADDRESS
TLNN F,L.ALLD ;SKIP IF DUMPING WHOLE FILE
JRST DMPXC2 ;NO, GO AHEAD
TLNE F,L.NXM ;NO SKIP IF END OF FILE
JRST DMPEX ;YES, END AT NXM
MOVE T2,%TYP(DL) ;TYPE OF INPUT FILE
MOVE T3,CATNUM ;CATEGORY IN CASE ITS A DAEMON FILE
CAIN T2,T.DAE ;SKIP IF NOT A DAEMON FILE
CAIE T3,CA.COR ;YES, SKIP IF CORE CATEGORY
JRST DMPXC2 ;NO, GO AHEAD
MOVE T2,LOWREL ;SIZE OF LOW SEGMENT
CAMLE T2,SAVADR ;SKIP IF ADDR PAST END OF LOW SEGMENT
JRST DMPXC2 ;NO, GO AHEAD WITH LOW SEGMENT ADDR
ADDI T2,1 ;POSSIBLE BEGINNING OF HIGH SEG
CAIGE T2,400000 ;SKIP IF LOW SEG GT 400000
MOVEI T2,400000 ;NO, HIGH SEG STARTS AT 400000
CAMG T2,SAVADR ;SKIP IF ADDR BETWEEN SEGMENTS
JRST DMPXC2 ;NO, GO AHEAD WITH HIGH SEG ADR
MOVEM T2,SAVADR ;MOVE UP TO BEGINNING OF HIGH SEG
JRST DMPXC0 ;AND START UP HIGH SEG
DMPXC2: PUSHJ P,OUTPT ;OUTPUT IT
JRST DMPXC0 ;AND LOOP FOR ALL BYTES REQUESTED
DMPEX: POP P,C ;RESTORE LAST CHAR INPUT
DMPEXA: JUMPLE C,DMPENX ;EXIT IF END OF LINE
CAIE C,"'" ;SKIP IF STRING COMING
JRST DMPBYS ;NO, GET NEXT DUMP DESCRIPTOR
PUSHJ P,OPNOUT ;MAKE SURE OUTPUT FILE OPEN
DMPEX1: JSP T2,DMPTTG ;GET NEXT CHAR OF STRING
DMPEX2: CAIE C,C.DQ ;SKIP IF DOUBLE QUOTE
JRST DMPEX3 ;NO, LOOK FOR SPECIAL PATTERN
JSP T2,DMPTTG ;YES, TAKE NEXT CHAR LITERALLY
JRST DMPEX8 ;AND OUTPUT IT
DMPEX3: CAIN C,"'" ;SKIP IF NOT END OF STRING
JRST DMPEXX ;ALL DONE, GET NEXT DUMP DESCRIPTOR
CAIN C,"^" ;SKIP IF NOT CONTROL-LETTER
JRST DMPEX6
CAIN C,"\" ;SKIP IF NOT LOWER-CASE
JRST DMPEX7
CAIE C,"<" ;SKIP IF START OF SPECIAL PATTERN
JRST DMPEX8 ;NO, JUST OUTPUT IT STRAIGHT
PUSHJ P,.SIXSW ;GET NEXT GROUP OF ALPHNUMERICS
CAIE C,">" ;SKIP IF REAL PATTERN
JRST DMPEX5 ;NO, OUTPUT AS CHARS SEEN
MOVSI T2,-LSPCHR
MOVE M,N ;COPY SIXBIT VALUE
HRR M,SPCHAR(T2) ;MAKE RH MATCH
CAME M,SPCHAR(T2) ;SKIP IF MATCH PATTERN
AOBJN T2,.-2 ;NO, TRY ALL LEGAL PATTERNS
JUMPGE T2,DMPEX4 ;JUMP IF NOT LEGAL PATTERN
HRRZ M,SPCHAR(T2) ;M=ADDR OF STRING ACTUALLY WANTED
PUSH P,C ;SAVE C
CAIN M,SPS.FF ;IS THIS A FORM FEED?
JRST [PUSHJ P,NEWPAG ;YES--DO ALL THE CORRECT THINGS
JRST .+2] ; AND SKIP OUTPUT
PUSHJ P,LSTR ;OUTPUT THAT
POP P,C ;PUT C BACK. IT SHOULD BE SUFFICIENT
; TO DO A MOVEI C," " HERE BUT WHY
; NOT DO IT RIGHT.
JRST DMPEX1
DMPEX4: MOVEI C,">" ;END WITH RIGHT ANGLE BRACKET
DMPEX5: PUSH P,C ;SAVE TERMINATING CHAR
MOVEI C,"<" ;WE KNOW THERE WAS A LEFT ANGLE BRACKET
PUSHJ P,LCHR
MOVE T2,N ;ALPHA CHARS WE READ
PUSHJ P,LSIX ;TYPE THEM
POP P,C ;NOW THE LAST CHAR
JUMPLE C,DMPENX ;HANDLE UNEXPECTED EOL
JRST DMPEX2 ;AND INVESTIGATE THAT
DMPEX6: JSP T2,DMPTTG ;GET NEXT CHAR
HRRZI C,-100(C) ;MAKE CONTROL LETTER
CAIE C,"'"-100 ;SKIP IF END OF STRING
JRST DMPEX8
MOVEI C,"^" ;OUTPUT TERMINAL ^
PUSHJ P,LCHR
JRST DMPEXX ;AND EXIT
DMPEX7: JSP T2,DMPTTG ;GET NEXT CHAR
ADDI C,40 ;MAKE UPPER CASE
CAIE C,"'"+40 ;SKIP IF END OF STRING
JRST DMPEX8
MOVEI C,"\" ;OUTPUT TERMINAL \
PUSHJ P,LCHR
DMPEXX: JSP T2,DMPTTG ;GT NEXT CHAR
JUMPG C,DMPBYS ;KEEP GOING IF NOT END OF INPUT LINE
DMPENX: TLNN F,L.OTTY ;SKIP IF OUTPUT DEVICE IS A TTY
PJRST LCRLF ;NO, EXIT
PUSHJ P,LCRLF ;YES, FINISH OFF LINE
PJRST CLSFIL ;AND CLOSE TO GET THE OUTPUT TO THE USER NOW
DMPEX8: PUSHJ P,LCHR ;OUTPUT THE CHAR
JRST DMPEX1 ;AND LOOK AT NEXT CHAR
;ROUTINE TO GET NEXT CHAR IN A STRING
DMPTTG: JUMPLE C,DMPENX ;EXIT IF EOL
PUSHJ P,.TICHE## ;GET A BYTE BUT DO NOT PRE-PROCESS
JUMPG C,(T2) ;RETURN WITH REAL BYTE
JRST DMPENX ;EOL--EXIT
DEFINE SPCTM(A)<IRP A,<XWD SIXBIT \ A\,SPS.'A>>
SPCHAR: SPCTM <EL,VT,FF,AL,HT>
LSPCHR==.-SPCHAR
SPS.EL: ASCIZ .
.
SPS.VT: <C.VT_^D29>
SPS.FF: <C.FF_^D29>
SPS.AL: <C.ALT_^D29>
SPS.HT: ASCIZ . .
BEGIN:
CMPDMP:
DELSYM:
DOPROC:
ENDPRC:
IFPROC:
IOFPRC:
LISPRC:
OOFPRC:
POPPRC:
PUSHPR:
SYMPRC:
TCMDMP:
TSYMPR:
JRST E.NIMP
SUBTTL EVALUATE EXPRESSION
;SUBROUTINE TO EVALUATE AN EXPRESSION
EXPEVA: PUSHJ P,EXPEV0 ;EVALUATE EXPRESSION
MOVEM T1,SAVEXP ;STORE FOR %
TLNN F,L.NXM ;EVALUATE OK?
POPJ P, ;RETURN
HRLZ N,ADRTMP ;PICK UP ADDRESS
M.FAIO <NXM at> ;GIVE MESSAGE
EXPEV0: TRZ F,R.CONB!R.ANY ;NOTE NOT YET REQUIRED TO SEARCH FILE
TLZ F,L.NXM ;CLEAR NXM FLAG
JUMPLE C,.POPJ ;EXIT IF END OF LINE
PUSHJ P,.SAVE2 ;PRESERVE P1 AND P2
HRRZ P1,OPRTAB ;SET UP PTR TO OPERATOR STACK
HRRZ P2,OPNTAB ;AND OPERAND STACK
SUBI P1,1 ;MAKE PUSH DOWN PTR
SUBI P2,1 ;MAKE PUSH DOWN PTR
EXPEV1: PUSHJ P,EXPSYM ;GET NEXT SYMBOL
JUMPE T1,EXPE2A ;ASSUME 0 IF A UNARY OPERATOR
EXPEV2: TRNE F,R.RPN ;SKIP IF NOT AFTER RIGHT PAREN
JRST E.EXP ;RIGHT PAREN MUST BE FOLLOWED BY UNARY OPERATOR
TRO F,R.ANY ;NOTE SOMETHING FOUND
EXPE2A: SETZ T2,
TRZN F,R.RPN ;RIGHT PAREN SHOULD NOT PUSH 0
PUSHJ P,PSHOPN ;PUT VALUE ON OPERAND STACK
MOVSI T2,-LPRECL ;MINUS LENGTH OF PRECEDENCE TABLE
CAIN C," " ;IF IT IS A BLANK TRY TO
PUSHJ P,.TIAUC## ; GET A BETTER OPERATOR.
CAIN C,C.DQ ;IS IT A DOUBLE QUOTE?
MOVEI C,"W" ;YES--CONVERT TO DOUBLE-U
CAIN C,"<" ;CONVERT LEFT ANGLE BRACKET TO "X" FOR
MOVEI C,"X" ;INTERNAL EASE
CAIN C,">" ;AND RIGHT ANGLE BRACKET TO "Y"
MOVEI C,"Y"
CAIE C,"," ; AND COMMA TO "Z" - SKIP IF COMMA SPECIFIED
JRST EXPEV4 ;NO, GO AHEAD
MOVEI C,"Z"
TRZN F,R.CMAL ;SKIP IF COMMA LEGAL
JRST EXPEOX ;NO, END OF EXPRESSION
EXPEV4: HLL C,PRECLS(T2) ;LH C=PRECEDENCE OF NEXT SYMBOL ON LIST
CAME C,PRECLS(T2) ;SKIP IF FOUND CHAR IN LIST
AOBJN T2,EXPEV4 ;NO, TRY NEXT
JUMPGE T2,EXPEOX ;EXIT IF TERMINATOR NOT OPERAND
HRR C,T2 ;RH C=INDEX IN EXECUTION TABLE FOR THIS OPERAND
HLLZ T2,C ;T2=PRECEDENCE ONLY
EXPEV5: TLNE P1,-1 ;SKIP IF OPERATOR STACK EMPTY
CAMLE T2,(P1) ;SKIP IF NEW OPERATOR LE STACK
JRST NOUNST ;NO, DONT UNSTACK
HLLZ T1,(P1) ;T1=PRECEDENCE OF OPERAND ON STACK
CAML T2,T1 ;SKIP IF NEW LT STACK (NOT EQUAL)
JRST EXPEV6 ;NEW EQ STACK
CAMN T1,[XWD LPNPRE,0] ;SKIP IF STACK NOT LEFT PAREN
CAMN T2,[XWD RPNPRE,0] ;SKIP IF NEW NOT RIGHT PAREN
JRST EXPEV7 ;UNSTACK LEFT PAREN IF RIGHT PAREN
JRST NOUNST ;ELSE DONT UNSTACK LEFT PAREN
EXPEV6: CAME T2,[XWD LPNPRE,0] ;LEFT PAREN DOESN'T UNSTACK OTHER LEFT PAREN
CAMN T2,[XWD FUNPRE,0] ;NOR DO FUNNIES UNSTACK EACH OTHER
JRST NOUNST ;OTHERWISE EQUALS UNSTACK EACH OTHER
EXPEV7: PUSHJ P,UNSTAK ;UNSTAK LAST OPERATOR ON STACK
TLNE F,L.NXM ;NO SKIP IF NXM
JRST EXPEX1 ;GIVE UP IF NXM
TRNE F,R.RPN ;SKIP IF NOT RIGHT PAREN
JRST EXPEV1 ;ALL DONE IF RIGHT PAREN
JRST EXPEV5 ;AND LOOP TILL DONT UNSTACK
NOUNST: HLRZ T2,C ;T2=PRECEDENCE OF NEW OPERATOR
CAIN T2,RBKPRE ;SKIP IF NOT RIGHT ANGLE BRACKET
TRO F,R.CMAL ;NOTE COMMA IS LEGAL AFTER ANGLE BRACKET
HLRZ T1,P1 ;LENGTH OF OPERATOR STACK
ADDI T1,1 ;+1=LENGTH NEEDED
SUB T1,OPRLEN ;NEEDED-LENGTH=WORDS NEEDED TO ADD
JUMPLE T1,NOUNS1 ;JUMP IF ALREADY LONG ENOUGH
PUSH P,P2 ;SAVE P2
MOVEI P2,OPRNDX ;INDEX IN TABLE VECTOR FOR OPERATOR STACK TABLE
ADDI T1,4 ;GET SOME MORE ROOM
ADDM T1,(P) ;FIX UP OTHER PUSH DOWN POINTER
PUSHJ P,GETCOR ;EXPAND TABLE
POP P,P2
NOUNS1: PUSH P1,C ;PUT OPERATOR ON OPERATOR STACK
JRST EXPEV1 ;AND GET NEXT OPERAND
EXPEOX: TLNN P1,-1 ;SKIP IF MORE OPERATORS ON OPERATOR STACK
JRST EXPEX1 ;NO MORE TO UNSTACK
PUSHJ P,UNSTAK ;UNSTACK LAST OPERATOR
TLNN F,L.NXM ;SKIP IF NXM
JRST EXPEOX ;LOOP TILL ALL UNSTACKED
EXPEX1: MOVE P1,P2
MOVE T1,OPRLEN
SUBI T1,4 ;KEEP MINIMAL LENGTH
MOVEI P2,OPRNDX
JUMPLE T1,EXPEX2 ;JUMP IF DONT HAVE ENOUGH TO GIVE SOME BACK
SUBM T1,P1 ;FIX UP PUSH DOWN PTR
MOVNS P1
PUSHJ P,GIVCOR ;GIVE BACK EXCESS CORE
EXPEX2: HRRES C ;RESTORE C TO ITS NATURAL SELF
MOVE T1,OPNLEN
SUBI T1,4
MOVEI P2,OPNNDX
CAILE T1,0 ;SKIP IF DONT HAVE MUCH
PUSHJ P,GIVCOR ;GIVE BACK EXCESS CORE
TLNE F,L.NXM ;NO SKIP IF NXM
POPJ P,
HLRZ T1,P1 ;LENGTH OF OPERAND STACK
SUBI T1,2
JUMPN T1,E.EXP ;JUMP IF NOT EXACTLY 1 ITEM ON STACK
POP P1,T1 ;T1=VALUE
POP P1,T2 ;T2=POSITION,SIZE WORD
POPJ P,
;SUBROUTINE TO PUSH AN OPERAND ON THE OPERAND STACK
;ARGS T1=VALUE
; T2 BITS 0-5=POSITION+1
; T2 BITS 6-35=SIZE
PSHOPN: PUSH P,T1
PUSH P,T2
HLRZ T1,P2 ;CURRENT LENGTH OF OPERAND STACK
ADDI T1,2 ;LENGTH NEEDED
CAMGE T1,OPNLEN ;SKIP IF TABLE NOT BIG ENOUGH
JRST PSHOP1 ;OK
PUSH P,P2
MOVEI P2,OPNNDX ;INDEX IN TABLE VECTOR
ADDI T1,10 ;MAKE IT BIGGER
PUSHJ P,GETCOR ;EXPAND TABLE
POP P,P2
PSHOP1: POP P,T2 ;RESTORE VALUE OF OPERAND
POP P,T1
PUSH P2,T2 ;PUSH OPERAND ON OPERAND STACK
PUSH P2,T1 ;FIRST POSITION,SIZE, THEN VALUE
POPJ P,
;SUBROUTINE TO UNSTACK THE OPERATOR ON TOP OF THE OPERATOR STACK
UNSTAK: TLNN P2,-2 ;SKIP IF SOMETHING ON THE OPERAND STACK
JRST E.EXP ;SIGH
PUSH P,T2 ;SAVE T2
POP P2,T1 ;LAST OPERAND
POP P2,T2 ;POSITION,SIZE WORD
HRRZ T3,(P1) ;INDEX IN INSTRUCTION TABLE
XCT OPER(T3) ;EXECUTE INSTRUCTION FOR OPERATOR
POP P1,T1 ;THROW AWAY OPERATOR
POP P,T2 ;RESTORE T2
POPJ P,
DEFINE PRECMC<
ZZ==1
RPNPRE==ZZ
X <)>
X <+,->
X <*,/>
X <^>
X <W>
FUNPRE==ZZ
X <[,@,\>
RBKPRE==ZZ
X <X,Y>
X <Z>
LPNPRE==ZZ
X <(>
>
DEFINE X(A)<
IRP A,<
XWD ZZ,"A">
ZZ==ZZ+1
>
PRECLS: PRECMC
LPRECL==.-PRECLS
DEFINE X(A)<
ZZ==ZZ+1
IRP A,<
IFIDN <A> <+>,<
PUSHJ P,EXPADD>
IFIDN <A> <->,<
PUSHJ P,EXPSUB>
IFIDN <A> <*>,<
IMULM T1,(P2)>
IFIDN <A> </>,<
PUSHJ P,EXPDIV>
IFIDN <A> <^>,<
PUSHJ P,EXPON>
IFIDN <A> <[>,<
PUSHJ P,CONT36>
IFIDN <A> <@>,<
PUSHJ P,CONT23>
IFIDN <A> <\>,<
PUSHJ P,CONT18>
IFIDN <A> <(>,<
PUSHJ P,EXPRPN>
IFIDN <A> <)>,<
JRST E.EXP>
IFIDN <A> <W>,<
HLREM T1,(P2)>
IFIDN <A> <X>,<
PUSHJ P,EXPRBK>
IFIDN <A> <Z>,<
PUSHJ P,EXPCMA>
IFIDN <A> <Y>,<
JRST E.EXP>
>>
OPER: PRECMC
EXPADD: POP P2,T3 ;POP NEXT TO LAST OPERAND
POP P2,T4
PUSHJ P,ADDBYT ;ADD THE LAST TWO
PUSH P2,T2 ;AND PUT THAT ON THE STACK
PUSH P2,T1
POPJ P,
EXPSUB: EXCH T1,(P2) ;LAST OPERAND ON STACK
SUBM T1,(P2) ;SUBTRACT FROM NEXT TO LAST AND STORE ON STACK
POPJ P,
EXPDIV: EXCH T1,(P2) ;LAST OPERAND ON STACK
IDIVM T1,(P2) ;DIVIDE NEXT TO LAST BY LAST AND STORE ON STACK
POPJ P,
EXPON: JUMPG T1,EXPON1 ;JUMP IF POSITIVE POWER
MOVEI T1,1 ;ANYTHING TO NEGATIVE POWER IS 1
SKIPE (P2) ;EXCEPT 0 WHICH IS 0
MOVEM T1,(P2)
POPJ P,
EXPON1: MOVE T2,(P2) ;NUMBER TO BE RAISED TO A POWER
EXPON2: SOJLE T1,.POPJ ;JUMP IF RAISED TO POWER DESIRED
IMULM T2,(P2) ;RAISE TO ANOTHER POWER
JRST EXPON2 ;AND LOOP TILL DONE
EXPCMA: TLNN P2,-2 ;SKIP IF SOMETHING ON OPERAND STACK
JRST E.EXP ;ERROR IF OPERAND STACK EMPTY
MOVEM T1,-1(P2) ;STORE SIZE
MOVE T1,(P2) ;GET LAST OPERAND ON STACK=POSITION
MOVEM T1,SIZTMP ;SAVE AS SIZE
ADDI T1,1 ;MAKE LAST OPERAND=POSITION NON-ZERO
LSH T1,POSSHF
ORM T1,-1(P2) ;AND STORE AS POSITION OF OPERAND ON TOP OF STACK
POPJ P,
EXPRBK: TRZN F,R.CMAL ;SKIP IF NO COMMA SEEN
JRST EXPRB1 ;THIS IS A SIZE FIELD
ADDI T1,1 ;IT IS POSITION, MAKE NON-ZERO
LSH T1,POSSHF
MOVE T2,T1 ;T2=POSITION, 0 FOR SIZE
EXPRB1: MOVEM T2,-1(P2) ;STORE POSITION, SIZE FOR TOP OF STACK
LSH T2,-POSSHF ;SHIFT BACK
MOVEM T2,POSTMP ;STORE FOR LATER
JRST EXPRP1 ;AND GET RID OF LEFT ANGLE BRACKET
EXPRPN: MOVEM T2,-1(P2) ;STORE OPERAND ON TOP OF 0 PUSHED FOR UNARY (
MOVEM T1,(P2)
EXPRP1: TRO F,R.RPN ;SET RIGHT PAREN BIT
POPJ P,
CONT18: PUSHJ P,FNDBYT ;GET CONTENTS OF WORD SPECIFIED
TLZ T1,-1
JRST CONTEX ;AND EXTRACT PROPER BYTE
CONT23: PUSHJ P,FNDBYT
CON23A: TLNN T1,17 ;SKIP IF ANY INDEX SPECIFIED
JRST NOINDX ;NO
PUSH P,T1
LDB T1,[POINT 4,T1,17] ;GET INDEX REGISTER
PUSHJ P,FNDADR ;GET CONTENTS OF INDEX REGISTER
POP P,T2
TLNE F,L.NXM ;NO SKIP IF NXM
JRST CONTEX
EXCH T1,T2 ;T2=CONTENTS OF INDEX REGISTER
ADDI T1,(T2)
INDBTS=(@) ;INDIRECT BITS
NOINDX: SETZ T2, ;CLEAR POSITION WORD IN CASE NO MORE INDIRECT
TLZ T1,-1-INDBTS ;CLEAR ALL BUT INDIRECT BITS
TLZN T1,(@) ;SKIP IF INDIRECT SPECIFIED
JRST CONT36 ;ALL DONE IF NO MORE INDIRECTING
MOVEM T1,ADRTMP ;NEW CURRENT ADDRESS
PUSHJ P,FNDADR ;GET CONTENTS OF THAT LOCATION
TLNN F,L.NXM ;SKIP IF NXM
JRST CON23A ;AND LOOP TILL DONE
JRST CONTEX
CONT36: PUSHJ P,FNDBYT ;GET CONTENTS OF WORD SPECIFIED
CONTEX: MOVEM T1,(P2) ;STORE ON TOP OF ZERO PUSHED
TRO F,R.CONB ;NOTE USED CONTENTS
POPJ P,
;SUBROUTINE TO ADD TWO BYTE DESCRIPTORS
;ARGS T1,T2=BYTE DESCRIPTOR 1
; T3,T4=BYTE DESCRIPTOR 2
;VALUES T1,T2=BYTE DESCRIPTOR 1 + BYTE DESCRIPTOR 2
;BYTE DESCRIPTOR ADDITION IS DEFINED BY:
; ADDING ADDRESSES, THEN
; ADDING POSITION; IF OVERFLOWS THE WORD, TAKE PARTIAL BYTE FROM
; BOTH WORDS, THEN
; ADD SIZE INCREMENT TO POSITION; IF OVERFLOWS, RESET TO BEGINNING OF
; NEXT WORD, LIKE THE HARDWARE INCREMENTS BYTE POINTERS
ADDBYT: JOV .+1 ;CLEAR OVERFLOW
ADD T1,T3 ;ADDRESSES ADD
JUMPE T4,.POPJ ;NO CHANGE IF INCREMENT POS, SIZE=0
PUSH P,T1
LDB T1,[POINT 36-POSSHF,T2,35-POSSHF] ;GET POSITION
LDB T3,[POINT 36-POSSHF,T4,35-POSSHF] ;GET POSITION INCREMENT
ADD T1,T3 ;T1=NEW POSITION
SUBI T1,1 ;BOTH WERE +1, SO MAKE NEW +1
ADDBY1: CAIGE T1,^D37 ;SKIP IF OVERFLOWED THE WORD
JRST ADDBY2 ;NO, GO ADD SIZE
AOS (P) ;BUMP ADDRESS TO NEXT WORD
SUBI T1,^D36 ;AND MOVE POSITION BACK 36 BITS
JRST ADDBY1 ;AND SEE IF INTO LAST WORD
ADDBY2: TLZ T4,770000 ;CLEAR OUT POSITION FIELD
ADD T1,T4 ;ADD INCREMENT SIZE TO POSITION
MOVNS T4 ;-SIZE + BEGINNING OF NEXT
ADDI T4,^D37 ;IS POSITION WHERE BYTE WILL OVERFLOW
CAMG T1,T4 ;SKIP IF NEXT BYTE WILL OVERFLOW WORD
JRST ADDBY3 ;NO, ALL SET
MOVEI T1,1 ;RESET TO BEGINNING OF NEXT WORD
AOS (P) ;BUMP ADDR
ADDBY3: DPB T1,[POINT 36-POSSHF,T2,35-POSSHF] ;STORE NEW POSITION
POP P,T1 ;POP FINAL ADDDRESS
POPJ P,
;SUBROUTINE TO READ A SYMBOL
; T1=NUMBER IF NUMBER, RADIX50 SYMBOL IF SYMBOL
;RETURN .POPJ IF NUMBER
; .POPJ1 IF SYMBOL
REDSYM: SETZ T1,
JUMPLE C,.POPJ1 ;EXIT IF END OF LINE
PUSHJ P,.TIAUC ;GET NEXT CHAR
CAIN C," " ;IGNORE BLANKS BEFORE A SYMBOL
PUSHJ P,.TIAUC## ; TO MAKE DUMP EASIER TO USE.
CAIL C,"0" ;SKIP IF NOT A NUMBER
CAILE C,"9" ;SKIP IF A NUMBER
JRST SYMIN ;ASSUME SYMBOL
JRST RDXIN ;NUMBER, READ IN CURRENT INPUT RADIX
SYMIN: CAIN C,"%" ;SKIP IF NOT PERCENT
JRST SYMPER ;PERCENT IS LEGAL RADIX50 SYMBOL
CAIN C,"$"
JRST SYMDOL ;DOLLAR SIGN IS LEGAL RADIX50
CAIN C,"."
JRST SYMDOT ;AS IS DOT
CAIL C,"A" ;SKIP IF NOT A LETTER
CAILE C,"Z" ;SKIP IF LETTER
JRST .+2
JRST SYMLET ;LETTTER
CAIL C,"0" ;SKIP IF NOT A NUMBER
CAILE C,"9" ;SKIP IF A NUMBER
JRST .POPJ1 ;NOT A RADIX50 SYMBOL, EXIT
SYMNUM: SUBI C,"0"-1 ;"0" IS 1 IN RADIX50
JRST SYMRD5 ;C=RADIX50 VALUE
SYMPER: SKIPA C,[47] ;47 IS RADIX50 FOR PERCENT
SYMDOL: MOVEI C,46 ;46 IS RADIX50 FOR DOLLAR SIGN
JRST SYMRD5
SYMDOT: SKIPA C,[45] ;45 IS RADIX50 FOR PERIOD
SYMLET: SUBI C,"A"-13 ;"A" IS 13 IN RADIX50
SYMRD5: IMULI T1,50
ADD T1,C
PUSHJ P,.TIAUC ;GET NEXT CHAR
JRST SYMIN
RDXIN: SETZ T1, ;CLEAR THE AC
JOV RDXIN1 ;CLEAR THE OVERFLOW FLAG
RDXIN1: SUBI C,"0"
CAIL C,0 ;SEE IF IN RADIX
CAML C,IRADIX ;SKIP IF A NUMBER IN CURRENT RADIX
JRST RDXMUL ;END OF NUMBER
IMUL T1,IRADIX ;MULTIPLY PREVIOUS BY CURRENT RADIX
ADD T1,C ;+ THIS NUMBER
JOV [TLO T1,(1B0) ;OVERFLOW DOES NOT TAKE PLACE
JRST .+1] ; SO SET BIT ZERO TO MAKE IT HAPPEN
ADDI C,"0" ;FIX CHAR BACK UP FOR CONKLIN
PUSHJ P,.TIAUC ;GET NEXT CHAR
JRST RDXIN1 ;AND LOOP
RDXMUL: ADDI C,"0" ;RESET CHAR
POPJ P,
SUBTTL GET BYTE FROM INPUT FILE
;SUBROUTINE TO EXTRACT A BYTE FROM THE INPUT FILE
;ARGS T1=ADDRESS OF WORD DESIRED
; T2=POSITION, SIZE DESIRED
FNDBYT: PUSHJ P,.SAVE2 ;SAVE P1,P2
MOVEM T1,ADRTMP ;SAVE ADDRESS
LDB T1,[POINT 36-POSSHF,T2,35-POSSHF] ;GET POSITION
CAIN T1,0 ;SKIP IF SPECIFIED
MOVEI T1,1 ;NO, ASSUME 0 (+OFFSET)
MOVEM T1,POSTMP ;SAVE POSITION
TLZ T2,770000
MOVEI T1,^D36 ;DEFAULT IS FULL WORD
CAIN T2,0 ;SKIP IF SIZE SPECIFIED
MOVE T2,T1 ;USE DEFAULT
MOVEM T2,SIZTMP
MOVEI P2,BYTNDX ;INDEX IN TABLE VECTOR FOR BYTE TABLE
MOVE T1,T2 ;T1=SIZE IN BITS
ADDI T1,^D35
IDIVI T1,^D36 ;CONVERT TO WORDS
SUB T1,BYTLEN ;SEE IF TABLE LONG ENOUGH
JUMPLE T1,FNDBY1 ;JUMP IF BIG ENOUGH, GET RID OF EXCESS
PUSHJ P,GETCOR ;EXPAND TABLE
JRST FNDBY2
FNDBY1: JUMPE T1,FNDBY2 ;JUMP IF EXACTLY RIGHT SIZE
MOVNS T1 ;T1=EXCESS
PUSHJ P,GIVCOR ;GIVE BACK EXCESS
FNDBY2: MOVE P1,BYT.Y ;BYTE POINTER FOR STORING BYTE
PUSHJ P,MKPNTR ;CLEAR INDIRECT BIT IN POINTER
MOVE T1,ADRTMP ;ADDRESS OF WORD TO FETCH
PUSHJ P,FNDADR ;GET FIRST WORD
TLNE F,L.NXM ;NO SKIP IF NXM
POPJ P,
MOVE T2,POSTMP ;POSITION
ADD T2,SIZTMP ;+SIZE
CAILE T2,^D37 ;SKIP IF LE 1 WORD
JRST FNDBY3 ;OVERFLOWS THE WORD
;HERE IF ALL IN THIS WORD
MOVE T3,POSTMP ;POSITION
LSH T1,-1(T3) ;BITS TO TOP OF T1
SUBI T2,^D36(T3) ;BITS TO SHIFT RIGHT=36-SIZE
LSH T1,(T2) ;NOW TO BOTTOM
JRST FNDBYX ;STORE LAST WORD AND EXIT
;HERE IF SPLIT OVER WORD BOUNDARY
FNDBY3: MOVE T2,SIZTMP ;GET SIZE
CAILE T2,^D36 ;SKIP IF BYTE FITS IN 1 WORD
JRST FNDBY4 ;MORE THAN 36 BITS REQUIRED
PUSH P,T1 ;SAVE FIRST WORD
AOS T1,ADRTMP ;ADDR OF NEXT WORD
PUSHJ P,FNDADR ;GET SECOND WORD
POP P,T2 ;RESTORE FIRST WORD
MOVE T3,POSTMP ;POSITION
LSHC T1,^D36(T3) ;SHIFT TO TOP OF T1
MOVE T3,SIZTMP ;SIZE
SUBI T3,^D36 ;-36=BITS TO SHIFT RIGHT
LSH T1,(T3) ;SHIFT TO BOTTOM OF T1
SOS ADRTMP ;RESTORE REAL ADDRESS
JRST FNDBYX ;STORE BYTE AND EXIT
;HERE IF MORE THAN 36 BITS REQUIRED
FNDBY4: PUSH P,SIZTMP ;SAVE SIZE
PUSH P,ADRTMP ;AND ADDRESS
FNDBY5: PUSH P,T1 ;SAVE CURRENT 36 BITS
AOS T1,ADRTMP ;ADDRESS OF NEXT WORD
PUSHJ P,FNDADR ;GET NEXT 36 BITS
POP P,T2 ;RESTORE PREVIOUS 36 BITS
TLNE F,L.NXM ;NO SKIP IF NXM
POPJ P,
MOVE T3,POSTMP ;POSITION
LSHC T1,^D36(T3) ;SHIFT TO TOP OF T1
MOVE T4,SIZTMP ;SIZE
SUBI T4,^D36 ;MINUS THESE 36 BITS
JUMPG T4,FNDBY6 ;JUMP IF MORE TO COME
POP P,ADRTMP ;THIS IS THE LAST, RESTORE ADDRESS
POP P,SIZTMP
JRST FNDBYX ;STORE LAST WORD AND EXIT
FNDBY6: MOVEM T4,SIZTMP ;STORE BITS LEFT TO GET
PUSHJ P,STOBYT ;STORE THESE 36 BITS
MOVNS T3 ;MINUS POSITION
ADDI T3,^D36 ;+36=BITS TO SHIFT TO SAVE REST OF SECOND WORD
LSHC T1,(T3) ;SAVE PART OF SECOND WORD NOT YET USED
JRST FNDBY5 ;LOOP TILL LAST WORD
FNDBYX: PUSHJ P,STOBYT ;STORE LAST BYTE
MOVE P1,BYT.Y
PUSHJ P,MKPNTR ;CLEAR INDIRECT BIT IN POINTER
ILDB T1,P1 ;GET FIRST 36 BITS
POPJ P,
;SUBROUTINE TO GET A WORD FROM THE INPUT FILE
;ARGS T1=ADDRESS OF WORD DESIRED
;VALUES T1=CONTENTS OF WORD DESIRED
; BIT L.NXM OF F SET IF NXM
FNDADR: JUMPL T1,RETNXM ;NEGATIVE ADDRESSES ARE NOT IN FILE
PUSHJ P,.SAVE2 ;SAVE P1,P2
TLNN DL,DL.SYM ;SKIP IF READING SYMBOLS
PUSHJ P,CMPOFF ;OFFSET IF NECESSARY THE ADDRESS TO FIND
MOVEM T1,TEMPAD ;ACTUAL ADDRESS TO FETCH
TLZ F,L.NXM ;CLEAR NXM FLAG
FNDAD1: SKIPG T1,%TYP(DL) ;SKIP IF TYPE OF INPUT FILE KNOWN
JRST NOTYP ;NO, TRY TO FIND OUT
SUBI T1,1
HLLZS %EXT(DL) ;CLEAR MASK
SKIPN T2,%EXT(DL) ;SKIP IF NO EXT KNOWN YET
HLLZ T2,I.DEX(T1) ;NO, GET DEFAULT
MOVEM T2,%EXT(DL)
ROT T1,-1 ;DIVIDE BY 2
MOVE T2,TYPVEC(T1) ;DISPATCH ADDRESS
CAIL T1,0 ;SKIP IF WANT RIGHT HALF
MOVSS T2 ;NO, WANT ADDR IN LH
JRST (T2) ;CALL ROUTINE TO FIND WORD
;HERE IF TYPE OF INPUT FILE NOT KNOWN, TRY TO FIND OUT BY ITS EXTENSION
NOTYP: PUSHJ P,.SAVE1 ;SAVE P1
MOVEI P1,(DL) ;POINTER TO FILE SPEC
PUSHJ P,GETSPC ;PICK UP STICKY DEFAULTS
MOVE T1,%DEV(DL) ;INPUT DEVICE
DEVCHR T1,
TLNN T1,DV.DIR ;SKIP IF A DIRECTORY DEVICE
JRST NOTYPD ;NO, USE DEFAULT
MOVEI T1,17 ;DIRECTORY DEVICE, LOOK FOR EXTENSIONS
MOVE T2,%DEV(DL)
SETZ T3,
OPEN IC,T1
JRST E.LKO ;CANT OPEN INPUT DEVICE
SKIPE T2,%EXT(DL) ;SKIP IF NO EXT SPECIFIED
JRST EXTTYP ;LOOK AT EXT SPECIFIED
MOVSI P1,-I.LDEX
MOVE T1,%NAM(DL) ;NAME OF INPUT FILE
SETZ T3,
NOTYP1: HLLZ T2,I.DEX(P1) ;NEXT EXT TO TRY
PUSHJ P,SETPTH ;SET UP PATH OR PPN IN T4
LOOKUP IC,T1
AOBJN P1,NOTYP1 ;NO SUCH FILE, TRY NEXT
JUMPGE P1,E.NSFI ;JUMP IF CANT FIND ANY FILES
HLLM T2,%EXT(DL) ;STORE EXT USED
HRROI T1,1(P1) ;T1=TYPE
JRST EXTTY2 ;GO STORE TYPE
;HERE IF EXTENSION SPECIFIED
EXTTYP: MOVE T1,%NAM(DL)
SETZ T3,
PUSHJ P,SETPTH ;SET UP PATH OR PPN IN T4
LOOKUP IC,T1
JRST E.NSFI
HLLM T2,%EXT(DL)
MOVSI T1,-I.LDEX
EXTTY1: HRR T2,I.DEX(T1) ;LOOK FOR EXTENSION ON LIST
CAME T2,I.DEX(T1) ;SKIP IF FOUND IT
AOBJN T1,EXTTY1
ADDI T1,1
EXTTY2: MOVEI T2,T.TMP
CAIN T2,(T1) ;SKIP IF NOT TMP FILE
HRRZ T2,%NAM(DL) ;TYPE FROM NAME OF FILE
CAIN T2,(SIXBIT .DAE.) ;SKIP IF NOT DAEMON FILE
HRROI T1,T.DAE ;NNNDAE.TMP IS A DAEMON FILE
CAIL T1,0 ;SKIP IF FOUND ONE
NOTYPD: MOVEI T1,AD.TYP ;DEFAULT
HRRZM T1,%TYP(DL)
JRST FNDAD1
;SUBROUTINE TO FIND A WORD IN A DAEMON FILE
FNDDAE: TLNN F,L.IOPN ;INPUT OPEN?
PUSHJ P,OPNDAE ;NO--GO SET UP FILE
FNDDA0: PUSHJ P,.SAVE1 ;SAVE P1
MOVE T1,CATNUM ;CATEGORY DESIRED FOR THIS BYTE
EXCH T1,DAECCT ;STORE AS CURRENT CATEGORY AND SAVE LAST
CAMN T1,DAECCT ;SKIP IF WAS NOT AT THAT CATEGORY
JRST FNDDA5 ;ALREADY IN THE CATEGORY
SETZM CATBLK ;REWIND THE DAEMON FILE AND SCAN
SETZM CATWRD ; FROM THE START.
FNDDA3: AOS T1,CATBLK ;SET BEGINNING OF CATEGORY TO BLOCK 1 OF FILE
MOVEM T1,DAECBK ;REMEMBER CURRENT BLOCK
USETI IC,(T1) ;START AT THAT BLOCK
INPUT IC,INPLST ;READ THE BLOCK
SETZB T2,DAECWD ;CLEAR CURRENT WORD IN BLOCK
PUSHJ P,CATRW1 ;SET UP BEGINNING OF CATEGORY
MOVE T2,DMHEAD ;T2=ADDRESS OF NEXT WORD IN INPUT BUFFER
MOVE T1,(T2) ;GET CATEGORY NUMBER
FNDDA1: CAMN T1,DAECCT ;SKIP IF NOT CATEGORY DESIRED
JRST FNDDA2 ;POSITIONED AT BEGINNING OF CATEGORY
PUSHJ P,READDM ;GET LENGTH
TLNE F,L.IEOF ;END OF FILE
PJRST RETNXM ;YES--RETURN NXM
MOVE P1,T1
FNDDA4: PUSHJ P,READDM
SOJGE P1,FNDDA4 ;READ PAST CATEGORY
JRST FNDDA1
FNDDA2: PUSHJ P,READDM ;READ LENGTH OF CATEGORY
MOVE T2,DAECBK ;CURRENT BLOCK NUMBER
IMULI T2,WINSIZ ;CONVERTED TO WORDS
ADD T2,DAECWD ;PLUS CURRENT WORD NUMBER
SUBI T2,WINSIZ-1 ;- ONE BLOCK+1=OFFSET FROM BEGINNING OF FILE
ADD T1,T2 ;PLUS LENGTH OF CAT=OFFSET OF LAST WORD OF CAT+1
MOVEM T1,CATLEN ;STORE LAST WORD OF CATEGORY
MOVNM T2,HGHOFF ;AND OFFSET FOR BEGINNING OF CATEGORY
MOVEI T1,CATBLK-1
PUSH T1,DAECBK
PUSH T1,DAECWD
;HERE WHEN SOMEWHERE IN CATEGORY
FNDDA5: MOVE T1,TEMPAD ;ADDRESS DESIRED
MOVE T2,CATNUM ;CATEGORY
CAIN T2,CA.COR ;CORE??
JRST FNDDA6 ;YES--GO DO IT
CAMGE T1,WINADR ;IN THIS WINDOW?
PUSHJ P,CATREW ;NO--REWIND
JRST DATRED ;READ AS DATA
;HERE IF CORE
FNDDA6: TLNE T1,-1 ;BITS IN LEFT HALF?
JRST RETNXM ;YES--NOT IN FILE
TLNE DL,DL.ANXM ;DO AC'S EXIST
JRST RETNXM ;NO--DUMB DUMP
TLNN F,L.IOPN ;INPUT SETUP?
JRST FNDDA7 ;NO--CAN NOT TRUST JOBDAT
TRNN T1,777600 ;LESS THAN 200(8)
TLNE DL,DL.SYM ;READING SYMBOLS?
JRST FNDDA7 ;YES--DO NOT USE BUFFER IT IS WRONG
JRST [MOVE T1,JOBDAT(T1) ;YES--RETURN DATA FROM BUFFER
POPJ P,] ; ..
MOVEI T2,.JBREL## ;DUMB LOADER
CAMG T1,JOBDAT(T2) ;SKIP IF NOT IN LOWSEG
JRST FNDDA7 ;IN LOWSEG GO READ
CAIL T1,400000 ;SKIP IF IN HISEG
JRST RETNXM ;BETWEEN SEGMENTS RETURN NXM
FNDDA7: CAMGE T1,WINADR ;BELOW THIS WINDOW
PUSHJ P,CATREW ;YES--REWIND FILE
JRST CMPRED ;READ CORE IMAGE
;HERE TO SET UP DAEMON FILE
OPNDAE: PUSHJ P,OPNDMP ;OPEN THE FILE
TLNE DL,DL.SYM ;READING THE SYMBOL FILE
POPJ P, ;YES--RETURN WITHOUT BUFFERING
TLZ F,L.IOPN ;CLEAR THE BIT FOR NOW
TLZ DL,DL.ANXM ;CLEAR CORE 0 BIT
PUSHJ P,.SAVE1## ;SAVE P1
PUSH P,CATNUM ;SAVE CATEGORY
PUSH P,TEMPAD ;SAVE ADDRESS
MOVEI T1,CA.COR ;MAKE IT LOOK LIKE CORE
MOVEM T1,CATNUM ; ..
MOVSI P1,-200 ;SIZE OF JOBDAT BUFFER
SETZM TEMPAD ;CLEAR TEMP POINTER
SETZM DAECCT ;CLEAR ALL RECOLECTIONS OF
SETZM CATBLK ; LIFE IN THE PAST.
SETZM CATWRD
HRLOI T1,377777 ;CAUSE THE WINDOW TO BE
MOVEM T1,WINADR ; WASHED.
OPNDA1: PUSHJ P,FNDDA0 ;GET THE WORD
MOVEM T1,JOBDAT(P1) ;STORE
TLNE F,L.NXM ;NXM??
TLO DL,DL.ANXM ;YES -- NO CORE ASSIGNED
AOS TEMPAD ;ADVANCE POINTER
AOBJN P1,OPNDA1 ;LOOP FOR MORE
POP P,TEMPAD ;RESTORE LOCALS
POP P,CATNUM ; ..
TLO F,L.IOPN ;OPEN NOW
POPJ P, ;RETURN
;SUBROUTINE TO FIND A WORD IN AN EXPANDED FILE
FNDXPN:
;SUBROUTINE TO FIND A WORD IN A DATA FILE
FNDTMP:
FNDDAT: SETZM HGHOFF ;OFFSET=ZERO
PUSHJ P,OPNDMP ;OPEN INPUT FILE IN DUMP MODE
PJRST DATRED ;AND FIND WORD
;SUBROUTINE TO FIND A WORD IN A HIGH SEGMENT FILE
FNDHGH:
FNDSHR: TLNE F,L.IOPN ;SKIP IF INPUT NOT YET OPEN
PJRST DATRED
PUSHJ P,OPNDMP ;OPEN INPUT FILE IN DUMP MODE
MOVEI T2,.JBHCR ;WORD WHICH CONTAINS LOW SEG SIZE
PUSHJ P,READDM ;READ UP TO .JBHCR
SOJGE T2,.-1
HRRZS T1 ;RH=SIZE OF LOW SEGMENT
ADDI T1,1777
TRZ T1,1777 ;ROUND UP TO NEXT K
CAIGE T1,400000 ;WHICH IS START OF HIGH SEG
MOVEI T1,400000 ;BUT MUST BE AT LEAST 400000
MOVEM T1,HGHOFF ;OFFSET FOR HIGH SEGMENT
;HERE WHEN INPUT FILE OPEN AND OFFSET KNOWN
; PJRST DATRED
;SUBROUTINE TO READ A WORD FROM A DATA FILE
;ARGS TEMPAD=ADDRESS OF WORD TO GET
; HGHOFF=ADDRESS OFFSET FOR FIRST WORD OF FILE
;VALUES T1=CONTENTS OF WORD DESIRED
DATRED: MOVE T1,TEMPAD ;ADDRESS DESIRED
SUB T1,HGHOFF ;-OFFSET=WORD NUMBER IN FILE
JUMPL T1,RETNXM ;RETURN NXM IF NOT THERE
CAML T1,CATLEN ;SKIP IF NOT PAST END OF FILE
PJRST DATRD1 ;NXM
SUB T1,WINADR ;SUBTRACT ADDRESS OF BEGINNING OF WINDOW
JUMPL T1,DATRD2 ;JUMP IF WINDOW PAST LOCATION
CAIL T1,WINSIZ ;SKIP IF IN CURRENT BLOCK
JRST DATRD2 ;NO, READ UP TO IT
SKIPA T1,WINDOW(T1) ;GET WORD
DATRD1: TLO F,L.IEOF!L.NXM ;END OF FILE
POPJ P, ;AND EXIT
DATRD2: ADD T1,WINADR ;ADDRESS DESIRED
LSH T1,-7 ;CONVERT TO BLOCK NUMBER
USETI IC,1(T1) ;SET TO READ THAT BLOCK
LSH T1,7 ;RESET TO WORD ADDRESS OF BEGINNING OF BLOCK
MOVEM T1,WINADR ;AND REMEMBER THAT AS THE START OF THE WINDOW
IN IC,WINLST
JRST DATRED
PUSHJ P,DATRED ;T1 _ WORD (MAY BE JUNK)
JRST READDE
;SUBROUTINE TO FIND A WORD IN A LOW OR SAVE FILE
FNDLOW:
FNDSAV: TLNE F,L.IOPN ;SKIP IF INPUT FILE NOT YET OPEN
JRST FNDSV1
PUSHJ P,OPNDMP ;OPEN INPUT FILE IN DUMP MODE
PUSHJ P,CATRW2 ;SET UP FOR READING
FNDSV1: MOVE T1,TEMPAD ;ADDRESS DESIRED
CAMGE T1,WINADR ;SKIP IF NOT YET TO ADDR
PUSHJ P,SAVREW ;REWIND SAVE FILE
; PJRST CMPRED ;READ WORD FROM COMPRESSED FILE
;SUBROUTINE TO FIND A WORD IN A COMPRESSED FILE
;ARGS T1=TEMPAD=ADDRESS OF WORD
;VALUES T1=CONTENTS OF WORD
; L.NXM BIT OF F SET IF NXM
;NOTE: CALL WITH T1 .GE. WINADR. CALL SAVREW OR CATREW AS NEEDED
; TO MEET THIS RESTRICTION.
CMPRED: SUB T1,WINADR ;INDEX OF WORD RELATIVE TO CURRENT WINDOW
CAIGE T1,WINSIZ ;SKIP IF NOT IN WINDOW
JRST CMPRD1 ;THE DESIRED WORD IS IN THE WINDOW
PUSHJ P,REDWIN ;READ NEXT WINDOW
MOVE T1,TEMPAD ;RESTORE ADDRESS DESIRED
TLNN F,L.IEOF ;SKIP IF NXM
JRST CMPRED ;LOOP TILL FIND PROPER WINDOW
SUB T1,WINADR ;INDEX OF WORD IN WINDOW
CMPRD1: CAMLE T1,WINLEN ;SKIP IF WORD REALLY CONTAINS DATA
RETNXM: TLOA F,L.NXM ;NO, PAST END OF DATA
MOVE T1,WINDOW(T1) ;RETURN WORD DESIRED
POPJ P,
FNDDDI:
FNDDEC:
FNDDMP:
FNDSDS:
POPJ P,
;SUBROUTINE TO FILL NEXT WINDOW
REDWIN: MOVEI T2,WINSIZ ;SIZE OF WINDOW
MOVEM T2,WINLEN ;ASSUME FULL WINDOW TO BE STORED
ADDB T2,WINADR ;NEW ADDRESS OF BEGINNING OF WINDOW
SETZM WINDOW
MOVE T1,[XWD WINDOW,WINDOW+1]
BLT T1,WINDOW+WINSIZ-1 ;CLEAR WINDOW TO START
REDWN1: SKIPGE T3,CURIOW ;SKIP IF OLD IOWD EXHAUSTED
JRST REDWN2
PUSHJ P,READDM ;READ NEXT IOWD
MOVEM T1,CURIOW ;SAVE IOWD
JUMPL T1,REDWN1 ;JUMP IF REAL IOWD
SUB T2,WINADR ;T2=ADDR IN WINDOW OF LAST WORD STORED
MOVEM T2,WINLEN
TLO F,L.IEOF ;NOTE END OF INPUT FILE
POPJ P,
REDWN2: MOVEI T1,1(T3) ;T1=ADDR OF NEXT PIECE FROM FILE
HRRZ T2,T3
CAIE T2,-1 ;SKIP IF ADDR = -1
JRST REDWN5 ;OK
AOSN T3 ;AOBJP WORKS FUNNY BECAUSE OF OVERFLOW
SOSA T3 ;BUT IF WAS -1 POP LOSES
POP T3,T2 ;SO MAKE IT COME OUT RIGHT AFTER FIRST
REDWN5: MOVE T2,WINADR ;ADDRESS OF FIRST LOCATION IN WINDOW
SUBM T1,T2 ;T2=INDEX INTO WINDOW
CAIL T2,WINSIZ ;SKIP IF PIECE STARTS IN THIS WINDOW
POPJ P, ;NO, WINDOW IS BETWEEN PIECES, ALL ZERO
HRLI T2,-WINSIZ(T2)
REDWN3: PUSHJ P,READDM
MOVEM T1,WINDOW(T2) ;STORE NEXT WORD
AOBJP T3,REDWN4 ;EXIT IF END OF PIECE FROM INPUT FILE
AOBJN T2,REDWN3 ;LOOP TILL WINDOW FULL
MOVEM T3,CURIOW ;SAVE IOWD FOR REST OF PIECE FROM FILE
POPJ P,
REDWN4: HRRZ T2,T3 ;T2=LAST ADDRESS STORED
SETZM CURIOW ;NOTE IOWD EXHAUSTED
JRST REDWN1 ;GET NEXT PIECE
;SUBROUTINE TO REWIND A SAVE FILE
;SAVES T1
SAVREW: MOVEM T1,CURIOW ;SAVE T1, CURIOW CLOBBERED HERE ANYWAY
USETI IC,1 ;SET TO READ FIRST BLOCK OF FILE
SETZM DMHEAD ;SET TO RECOMPUTE HEADER
JRST CATRW2 ;FINISH UP
;SUBROUTINE TO REWIND THE CURRENT CATEGORY FOR DAEMON FILES
CATREW: MOVEM T1,CURIOW ;SAVE T1, CURIOW CLOBBERRED HERE ANYWAY
MOVE T1,CATBLK ;BLOCK OF BEGINNING OF CATEGORY
MOVEM T1,DAECBK ;REMEMBER CURRENT BLOCK
USETI IC,(T1)
INPUT IC,INPLST
HRRZ T2,CATWRD
MOVEM T2,DAECWD ;REMEMBER CURRENT WORD IN BLOCK
CATRW1: HRLS T2
ADD T2,[XWD -200,IBUF]
MOVEM T2,DMHEAD
CATRW2: MOVNI T1,WINSIZ
MOVEM T1,WINADR
MOVE T1,CURIOW ;RESTORE T1
SETZM CURIOW ;NOTE NO IOWD READY
TLZ F,L.IEOF ;CLEAR EOF FLAG
POPJ P,
;SUBROUTINE TO READ NEXT WORD FROM INPUT FILE IN DUMP MODE
READDM: TLNE F,L.IEOF ;SKIP IF END OF FILE
POPJ P,
AOS DAECWD ;COUNT WORDS READ
MOVE T1,DMHEAD
AOBJN T1,READD1
INPUT IC,INPLST
STATZ IC,760000 ;SKIP IF NO ERRORS
JRST READDE
AOS DAECBK
SETZM DAECWD
MOVE T1,[XWD -200,IBUF]
READD1: MOVEM T1,DMHEAD
MOVE T1,(T1)
POPJ P,
READDE: GETSTS IC,N
TRNE N,IO.EOF ;SKIP IF NOT END OF FILE
JRST READEO
M.FAIO <INPUT ERROR STATUS =>
READEO: TLO F,L.IEOF
POPJ P,
;SUBROUTINE TO OPEN THE INPUT FILE IN DUMP MODE
OPNDMP: TLNE F,L.IOPN ;SKIP IF NOT YET OPEN
POPJ P, ;ALREADY OPEN
PUSHJ P,.SAVE1## ;SAVE P1
MOVE P1,(DL) ;POINT TO SPEC
PUSHJ P,GETSPC ;GET STICKEY DEFAULTS
MOVEI T1,17 ;DUMP MODE
MOVE T2,%DEV(DL) ;INPUT DEVICE
SETZ T3,
OPEN IC,T1
JRST E.LKO ;NO SUCH DEVICE
MOVE T1,%NAM(DL) ;NAME OF INPUT FILE
SETZB T3,DMHEAD
OPNDM1: MOVE T2,%EXT(DL) ;EXTENSION
PUSHJ P,SETPTH ;SET UP PATH OR PPN IN T4
LOOKUP IC,T1
JRST OPNDM2 ;TRY NULL EXTENSION IF NONE SPECIFIED
HLRE T1,T4 ;T1=LENGTH OF FILE
JUMPLE T1,.+2 ;JUMP IF WORDS
LSH T1,7 ;CONVERT BLOCKS TO WORDS
MOVMM T1,CATLEN ;STORE +LENGTH OF FILE IN WORDS
TLO F,L.IOPN ;NOTE INPUT FILE OPEN
HRLOI T1,377777 ;WE HAVE NEVER READ THE WINDOW
MOVEM T1,WINADR ; SO CAUSE US TO READ ON THE NEXT
; TRY.
POPJ P, ;AND EXIT
OPNDM2: MOVE T4,%EXT(DL)
TRNE T4,-1 ;SKIP IF NO EXT WAS SPECIFIED
JRST E.NSFI ;THERE WAS, CANT FIND FILE SPECIFIED
HRLOM T4,%EXT(DL)
JRST OPNDM1 ;TRY NULL
;SUBROUTINE TO COMPUTE OFFSET FOR AN ADDRESS
;ARGS T1=ADDRESS
;VALUES T1=ADDRESS AFTER OFFSET
CMPOFF: MOVN T2,OFFLEN ;MINUS LENGTH OF OFFSET TABLE
JUMPGE T2,.POPJ ;NO CHANGE IF NO OFFSETS
HRLZS T2
HRR T2,OFFTAB ;MAKE AOBJN PTR TO OFFSET TABLE
CMPOF1: HLRZ T3,(T2) ;BEGINNING OF THIS OFFSET REGION
HRRZ T4,(T2) ;ENDING OF THIS REGION
CAML T1,T3 ;SKIP IF ADDRESS NOT IN THIS REGION
CAMLE T1,T4 ;SKIP IF ADDRESS IS IN THIS REGION
JRST CMPOF2 ;NOT IN THIS REGION
ADD T1,1(T2) ;ADDRESS IS IN THIS REGION, OFFSET
POPJ P, ;EXIT
CMPOF2: AOBJP T2,.POPJ ;LOOK FOR NEXT REGION, EXIT IF NO MORE
AOBJN T2,CMPOF1 ;JUMP IF MORE OFFSETS SPECIFIED
POPJ P,
;SUBROUTINE TO STORE A VALUE IN A TABLE
;ARGS T1=VALUE
; P1=BYTE POINTER TO BE INCREMENTED
; P2=INDEX IN TABLE VECTOR
STOBYT: PUSH P,T1 ;SAVE VALUE
IBP P1 ;READY BYTE POINTER FOR STORING
TLNE P1,(@) ;IS INDIRECT BIT ON?
HALT . ;YES--BUG
MOVEI T1,(P1) ;ADDR TO STORE INTO
SUB T1,TABVEC(P2) ;-BEGINNING OF TABLE
CAML T1,LENVEC(P2) ;CURRENT LENGTH OF TABLE
PUSHJ P,TABEXP ;EXPAND TABLE
POP P,T1 ;RESTORE VALUE
DPB T1,P1 ;STORE VALUE
POPJ P, ;AND EXIT
;SUBROUTINE TO EXPAND TABLE TO BE BIG ENOUGH TO STORE VALUE
;ARGS T1=SIZE NEEDED - 1
; P2=INDEX IN TABLE VECTOR
TABEXP: SUB T1,LENVEC(P2) ;SUBTRACT CURRENT SIZE=NUM WORDS NEEDED-1
AOJA T1,GETCOR ;EXPAND CORE
;SUBROUTINE TO CLEAR INDIRECT BIT IN A BYTE POINTER
; NEEDED BECAUSE HARDWARE INCREMENTS THE ADDRESS IN THE
; POINTER AND WE WANT TO INCREMENT THE ADDRESS IT IS
; POINTING TO.
;ARGS: P1=BYTE POINTER
;VALUE: P1=BYTE POINTER (FOR SHORT USE)
;USES NO ACS
;
MKPNTR: PUSH P,P1 ;SAVE OLD POINTER
MOVEI P1,@P1 ;COMPUTE REAL ADDRESS
HLL P1,(P) ;GET POINTER PART
TLZ P1,37 ;CLEAR INDEX AND INDIRECT
POP P,(P) ;CLEAR STACK
POPJ P, ;RETURN
SUBTTL SUBROUTINES FOR LISTING OUTPUT
;SUBROUTINE TO OUTPUT A VALUE
;ARGS T1=VALUE
; TABLES INCLUDE MODES, WIDTHS, JUSTIFY, ETC.
OUTPT: MOVEM T1,OUTVAL ;SAVE VALUE TO OUTPUT
PUSHJ P,OPNOUT ;MAKE SURE OUTPUT FILE OPEN
SETZM PADCNT ;CLEAR COUNT OF PAD BYTES
TRZ F,R.OVR!R.CNT!R.LFD!R.FFD ;CLEAR COUNT AND OVERFLOW BITS
TLNE F,L.AUTO ;SKIP IF AUTOFORM OFF
TRO F,R.CNT ;NOTE COUNTING
HRLM F,(P) ;SAVE HEADER BITS
OUTPTS: PUSH P,PAGNUM ;SAVE CURRENT PAGE NUMBER
PUSH P,CURCHR ;AND CHARACTER COUNTER
PUSH P,LINNUM ;AND LINE COUNTER, I.E. CURRENT CHAR POSITION
PUSHJ P,SETWJL ;SET UP WIDTH AND JUSTIFY LISTS
TLNE F,L.NXM ;NO SKIP IF NXM
JRST OUTNXM
TLZ DL,DL.NXM ;NO LONGER IN NXM.
MOVE P1,[POINT W.S,LPAD] ;POINTER TO TEMP LIST
MOVEM P1,LPAD.Y ;STORE FOR LATER
MOVE P1,M.Y ;BYTE POINTER FOR MODES LIST
PUSHJ P,MKPNTR ;CLEAR INDIRECT BIT IN POINTER
ILDB T1,P1 ;GET FIRST MODE
CAIN T1,M.END ;SKIP IF NOT END OF LIST
JRST OUTPTX ;END OF OUTPUT
CAIE T1,M.ALL ;SKIP IF ALL MODES REQUESTED
JRST OUTPT1 ;OUTPUT VALUE IN THIS MODE
MOVE P1,[POINT M.S,MODLAL] ;POINTER TO LIST OF ALL MODES
ILDB T1,P1 ;FIRST MODE
OUTPT1: CAIN T1,M.ALL
JRST OUTPTN ;DONT DO "ALL" HERE
ROT T1,-1
MOVE T2,MODADR(T1) ;GET ADDRESS OF ROUTINE FOR THIS MODE
CAIL T1,0 ;SKIP IF ADDR IN RIGHT HALF
MOVSS T2 ;ADDR IN LEFT HALF
TLNE DL,DL.WID ;SKIP IF NO MORE WIDTH SPECS
TLNN F,L.AUTO ;SKIP IF AUTO-FORMAT ON
JRST OTPT1A ;JUMP IF NOT AUTOFORMATTING WIDTHS
ILDB T4,WIDTMP ;GET A WIDTH SPEC.
CAIN T4,W.END ;SKIP IF NOT DONE
JRST OTPT1A ;DONE--NO MORE SPECS
ADD T4,CURCHR ;ADD IN CURRENT POSITION
CAMLE T4,RMARGN ;SKIP IF THIS WILL FIT
TRO F,R.OVR ;PUT WHOLE FIELD ON NEW LINE
OTPT1A: TRNE F,R.CNT ;ARE WE JUST COUNTING?
JRST OUTPT6 ;YES--LIST IS EMPTY
TRZE F,R.OVR ;DO WE NEED A CRLF?
PUSHJ P,NEWLIN ;YES--GO DO IT PRIOR TO BLANKS
MOVEI C," " ;NO--SET UP A BLANK
SOSL T4,PADCNT ;SKIP IF NO COUNTS LEFT
ILDB T4,LPAD.Y ;T4 GETS NUMBER OF BLANKS TO STICK
; ON THE FRONT OF THE BYTE TO LINE
; IT UP IN THE FIELD.
JUMPLE T4,OUTPT6 ;JUMP IF NONE REQUIRED
PUSHJ P,LCHR ;LIST A BLANK
SOJG T4,.-1 ;LOOP FOR ALL WE NEED
OUTPT6: PUSHJ P,(T2) ;CALL ROUTINE TO OUTPUT VALUE IN THIS MODE
TLNN DL,DL.WID ;ARE THERE ANY WIDTH SPECS LEFT?
JRST OUTPT4 ;NO--SKIP THE CHECKS
LDB T2,WIDTMP ;GET THE WIDTH
CAIN T2,W.END ;IS THIS THE END?
JRST [TLZ DL,DL.WID ;YES--CLEAR THE BIT
JRST OUTPT4] ;AND PUNT
MOVE T1,SAVCCH ;LOAD T1 WITH THE NUMBER OF CHARS
; USED FOR DATA WHEN THAT FIELD WAS
; PRINTED. THIS VALUE IS COMPUTED
; IN ROUTINE FORMAT.
SUB T2,T1 ; LESS WIDTH IS NUMBER OF BLANKS
; TO ADD-ON
TLNN DL,DL.JUS ;ANY JUSTIFY KEYS LEFT?
SKIPA T1,[J.LFT] ;NO--ASSUME LEFT
ILDB T1,JUSTMP ;YES--GET THE KEY
CAIN T1,J.END ;IS THIS THE END
JRST [MOVEI T1,J.LFT ;YES--ASSUME LEFT
TLZ DL,DL.JUS;CLEAR THE "WE HAVE A BYTE" BIT
JRST .+1] ;CONTINUE
JUMPLE T2,OUTPT4 ;JUMP IF NEED NO FILLERS
TRNE F,R.CNT ;ONLY COUNTING?
JRST OUTPT5 ;YES--GE STORE FIXUP
CAIN T1,J.RHT ;NO--IS THIS RIGHT JUSTIFIED?
JRST OUTPT4 ;YES--WE DID THAT
CAIN T1,J.CEN ;IS THIS CENTERED
LSH T2,-1 ;YES--CENTER IT
MOVEI C," " ;SET UP A BLANK
PUSHJ P,LCHR ;PRINT IT
SOJG T2,.-1 ;LOOP FOR AS MANY BLANKS AS WE NEED
JRST OUTPT4 ;CONTINUE
OUTPT5: CAIN T1,J.LFT ;LEFT JUSTIFICATION?
SETZ T2, ;YES--NO LEADING BLANKS
CAIN T1,J.CEN ;IF WE NEED AN ODD NUMPER OF PADS
AOS T2 ; CENTERING A FIELD PUT THE FREE
; SPACE IN FRONT.
CAIN T1,J.CEN ;CENTER IT
LSH T2,-1 ;YES--HALF LEAD ; HALF TRAIL
IDPB T2,LPAD.Y ;STORE AWAY
AOS PADCNT ;COUNT THE BYTE
OUTPT4:
OUTPTN: ILDB T1,P1 ;NEXT MODE
CAIN T1,M.END ;SKIP IF NOT END OF MODES LIST
JRST OUTPTX ;END OF OUTPUT
TLNN DL,DL.WID ;IF WE HAVE A WIDTH LIST DO ADD SPACES
PUSHJ P,LSPC3 ;OUTPUT 3 SPACES BETWEEN MODES
JRST OUTPT1
OUTNXM: TLOE DL,DL.NXM ;FLAG NXM
JRST OUTPTX ;STILL SAME BLOCK OF NXM
MOVEI M,[ASCIZ .<word is not in file>.]
PUSHJ P,LSTR ;OUTPUT NXM INDICATOR
TRO F,R.OVR ;NOTE LINE OVERFLOW
TRNE F,R.CNT ;ARE WE COUNTING?
TLZ DL,DL.NXM ;YES--CAUSE OUTPUT TO HAPPEN AGAIN
; FOR REAL PRINTING
OUTPTX: TRZN F,R.CNT ;SKIP IF WERE COUNTING, NOT OUTPUTTING
JRST OUTPT3 ;ACTUALLY OUTPUT, ALMOST DONE
OUTPT2: POP P,LINNUM ;RESET BEGINNING CHARACTER POSITION
POP P,CURCHR
POP P,PAGNUM
MOVSI T1,R.LHED ;RESTORE LINE HEADER BIT
TDNE T1,(P)
TRO F,R.LHED
TRZ F,R.OVR ;CLEAR OVERFLOW FLAG
JRST OUTPTS ;AND START OVER ACTUALLY OUTPUTTING
OUTPT3: POP P,T1 ;IGNORE EARLIER CHAR POSITION
POP P,T1
POP P,T1
TLNE F,L.AUTO ;IF AUTOFORMAT OFF
TRNN F,R.OVR ;OR NO OVERFLOW,
POPJ P, ;ALL DONE
PJRST NEWLIN ;IF OVERFLOW AND AUTOFORMAT ON, CRLF
;SUBROUTINE TO SET UP WIDTH AND JUSTIFY LISTS
SETWJL: PUSHJ P,.SAVE2 ;SAVE P1 AND P2
TLO DL,DL.WID!DL.JUS;TRY TO FILL AND JUSTIFY
MOVE P1,J.Y ;BYTE POINTER TO JUSTIFY LIST
PUSHJ P,MKPNTR ;FIX @ BIT
MOVEM P1,JUSTMP ;SAVE FOR ILDB'ING
MOVE P1,W.Y ;BYTE POINTER TO WIDTH LIST
PUSHJ P,MKPNTR ;FIX @ BIT
MOVEM P1,WIDTMP ;SAVE FOR LATER
POPJ P,
MODALL==.POPJ
MODNUL==.POPJ
MODASC: JSP T4,FORMAT ;CHECK FOR LINE OVERFLOW
MOVE C,OUTVAL ;OUTPUT ASCII CHARACTER
MOVEI M,OUTVAL ;POINT TO OUTPUT VALUE
TDNN C,[<-1>_7] ;IS IT A SINGLE BYTE
JRST MODAS1 ;YES PRINT AS ONE
HRLI M,440700 ;NO--SET UP A POINTER
MOVEI T1,5 ; FOR 5 CHARS
ILDB C,M ;GET A CHAR
PUSHJ P,MODAS1 ;TYPE IT
SOJG T1,.-2 ;LOOP FOR WHOLE WORD
POPJ P, ;RETURN
MODAS1: CAIG C,40 ;CONTROL CHAR?
MOVEI C," " ;YES--PRINT A BLANK INSTAED
PJRST LCHR
MODSIX: JSP T4,FORMAT ;FORMAT THE LINE
MOVE T1,OUTVAL ;OUTPUT SIXBIT CHARACTER
TDNN T1,[<-1>_6] ;ONLY 1 CHAR?
PJRST LCHRS ;YES--LIST 1 CHAR
MOVEI T3,6
MOVE T2,T1 ;NO--LIST AS SIX SIXBIT
PJRST LSIXC ; LETTERS.
;OUTPUT OUTVAL AS A RADIX 50 SYMBOL
MODRAD: JSP T4,FORMAT ;LINE UP THE OUTPUT
LDB T1,[POINT 4,OUTVAL,3] ;GET PREFIX
PUSHJ P,$LOCT
PUSHJ P,LSPC
MOVE T1,OUTVAL ;GET THE RADIX 50 SYMBOL
$LRAD: TLZ T1,(17B3) ;CLEAR THE CODE BITS
MODR51: IDIVI T1,50 ;WHY THEY CALL IT RADIX 50
HRLM T2,(P) ;SAVE REMAINDER
JUMPE T1,MODR52 ;JUMP IF DONE
PUSHJ P,MODR51 ;ELSE LOOP BACK
MODR52: HLRZ C,(P) ;GET A CHAR
JUMPE C,.POPJ ;PUNT IF NULL
ADDI C,257 ;FIX UP
CAILE C,271
ADDI C,7
CAILE C,332
SUBI C,70
CAIN C,243
MOVEI C,256
TLNN DL,DL.TR5
PJRST LCHR
MOVE T1,C
PJRST .TCHAR##
MODOCT: MOVE T1,OUTVAL ;OUTPUT AS L,R
PJRST LXWD
MODDEC: SKIPA T2,[$LDEC]
MODSOC: MOVEI T2,$LOCT
JSP T4,FORMAT ;DON'T LET THE MINUS BE SPLIT
; OVER LINE BOUNDARIES.
MOVEI C,"-" ;MINUS SIGN IN CASE NEGATIVE
SKIPGE OUTVAL ;SKIP IF POSITIVE
PUSHJ P,LCHR ;OUTPUT MINUS SIGN
MOVM T1,OUTVAL ;GET POSITIVE VALUE
PJRST (T2) ;AND OUTPUT IN PROPER RADIX
MODFLO: MOVE T1,OUTVAL ;OUTPUT FLOATING POINT NUMBER
PJRST LFLT
MODSYM: TLNN F,L.INST ;INSTRUCTION FORMAT?
PJRST MODOCT ;NO--DUMP AS OCTAL ***TEMP***
JSP T4,FORMAT ;MAKE LOOK NICE
MOVE T1,OUTVAL ;PUT IN WORD
PUSHJ P,OPDEC ;LOOKUP IN TABLE
PUSHJ P,INVOP ;MAKE SOME OPCODE
MOVE T2,N ;COPY OPCODE
MOVEI T3,6 ;INCLUDE SPACES
PUSHJ P,LSIXC ;LIST THE OPCODE
PNTAC: PUSHJ P,LSPC ;LIST A SPACE
MOVEI FM,1 ;HISTORIC CODE
TLO DL,DL.XCT ;EXACT MATCH
LDB T1,[POINT 4,OUTVAL,12] ;GET THE OPCODE
LDB T2,[POINT 3,OUTVAL,2] ;GET FIRST OCTAL DIGIT
CAIN T2,7 ;SKIP IF NOT I/O
LDB T1,[POINT 9,OUTVAL,11] ;GET I/O DEVICE CODE
CAIN T2,7 ;IS IT AN I/O INSTRUCTION
TRZ T1,3 ;YES--CLEAR 2 JUNK BITS
JUMPE T1,ZEROAC ;IS AC=0?
PUSHJ P,$LSYM ;NO--LIST AS SYMBOL
PUSHJ P,LCOMMA ; FOLLOWED BY A COMMA
ZEROAC: MOVSI T1,(@) ;GET AN INDIRECT BIT
MOVEI C,"@" ; AND ITS SYMBOL
TDNE T1,OUTVAL ;IS @ BIT SET
PUSHJ P,LCHR ;YES--PRINT @
HRRZ T1,OUTVAL ;GET Y-ADDRESS
MOVEI FM,2 ;HISTOY TABLE INDEX
TLZ DL,DL.XCT ;ALLOW OFFSET
PUSHJ P,$LSYM ;LIST AS SYMBOL
LDB T1,[POINT 4,OUTVAL,17] ;GET INDEX REG.
JUMPE T1,.POPJ ;JUMP IF ZERO
MOVEI FM,3 ;CODE
TLO DL,DL.XCT ;LIGHT THE EXACT MATCH BIT
MOVEI C,"(" ;ELSE PRINT IN (
PUSHJ P,LCHR ;GO LIST
PUSHJ P,$LSYM ;AND SYMBOL
MOVEI C,")" ;ADD )
PJRST LCHR ;GO ADD IT--THEN POPJ
INVOP: MOVE T1,OUTVAL ;GET THEWORD TO OUTPUT
TDZ T1,[777,,-1] ;CLEAR OUT JUNK
JUMPE T1,ZEROP ;GIVE A Z IF ZERO
CAMN T1,OLDVAL ;SAME AS OLD VALUE?
JRST OLDOP ;YES--REMEMBER THAT BACK
MOVEM T1,OLDVAL ;RECALL LAST ARGUMENT
PUSHJ P,VAL2SY ;SCAN THE SYMBOL TABLE
TLOA T2,(1B0) ;NO MATCH
MOVEM T1,OLDSYM ;SAVE THE SYMBOL
MOVEM T2,SYMOFF ;SAVE THE OFFSET
OLDOP: MOVE T1,SYMOFF ;GET THE OLD OFFSET
JUMPN T1,ZEROP ;JUMP IF NOT EXACT
MOVE T1,OLDSYM ;FETCH SYMBOL
MOVEI N,PNTAC ;HERE WE DO A NONO AND FUDGE THE STACK
MOVEM N,(P) ;SO WE CAN PRINT THE AC AND RETURN TO
PJRST $LRAD ;OP DECODER.
ZEROP: LDB T1,[POINT 9,OUTVAL,8] ;GET OPCODE
MOVSI N,'Z ' ;ASSUME ZERO
JUMPE T1,.POPJ ;JUMP IF GOOD GUESS
LDB T1,[POINT 3,OUTVAL,2]
IORI N,20(T1) ;FILL IN OCTAL DIGIT
LSH N,6 ;GET READY FOR NEXT
LDB T1,[POINT 3,OUTVAL,5]
IORI N,20(T1) ;FILL IN NEXT DIGIT
LSH N,6 ;GET READY FOR LAST
LDB T1,[POINT 3,OUTVAL,8]
IORI N,20(T1) ;PUT IN DIGIT 3
HRLI N,'UUO' ;ADD UUO
POPJ P,0 ;RETURN
;$LSYM -- PRINT A SYMBOL
;CALL WITH:
; T1=VALUE TO PRINT
;RETURNS NON-SKIP HAVING PRINTED SOMETHING
$LSYM: JUMPE T1,.POPJ ;DO NOT TYPE ZEROS
CAMN T1,OLDVAL(FM) ;SAME ARGUMENT?
JRST LSYM2 ;YES--GIVE SAME ANSWER
MOVEM T1,OLDVAL(FM) ;NO--SAVE FOR NEXT TRY
PUSHJ P,VAL2SY ;CONVERT VALUE
TLOA T2,(1B00) ;IT IS A NUMBER
TLZ T2,(1B00) ;IT IS A SYMBOL
MOVEM T1,OLDSYM(FM) ;STORE ANSWER
JUMPE T2,LSYM1 ;JUMP IF EXACT MATCH
TLNE DL,DL.XCT ;DO WE NEED AN EXACT MATCH
TLO T2,(1B0) ;YES--FORCE NUMERIC MODE
LSYM1: MOVEM T2,SYMOFF(FM) ;SYMBOL ERROR
LSYM2: SKIPGE T2,SYMOFF(FM) ;SKIP IF SYMBOLIC
JRST [MOVE T1,OLDVAL(FM) ;RELOAD THE NUMERIC VALUE
JRST $LNBR] ;LIST AS A NUMBER
MOVE T1,OLDSYM(FM) ;GET LAST ANSWER
PUSHJ P,$LRAD ;NO-PRINT SYMBOL
SKIPN T1,SYMOFF(FM) ;IS THERE AN OFFSET
POPJ P, ;NO--ALL DONE
MOVEI C,"+" ;NO--PRINT A PLUS
PUSHJ P,LCHR ; ..
PJRST $LNBR ;TYPE IN O RADIX
MODSMA: ;IF INSTRUCTION, ELSE ...
POPJ P,
MODNUM: MOVE T1,OUTVAL ;PICK UP VALUE TO BE OUTPUT
PJRST LRDX ; AND LIST IN CURRENT RADIX
;SUBROUTINE TO START NEW LINE FOR OUTPUT
;ARGS R.CON1 BIT OF F=1 IF DUMPING CONTENTS
;SAVES T1
NEWLIN: PUSHJ P,LCRLF ;NEW LINE
PJRST NEWPGX
;SUBROUTINE TO OUTPUT PAGE EJECT AND REQUEST PAGE HEADER
NEWPAG: PUSHJ P,LEJECT ;OUTPUT PAGE EJECT
TRO F,R.PHED ;REQUEST PAGE HEADER
NEWPGX: TRO F,R.LHED ;REQUEST ADDRESS TO BE TYPED
POPJ P,
SUBTTL OUTPUT SUBROUTINES
;SUBROUTINE TO OPEN OUTPUT FILE
OPNOUT: TLNE F,L.OOPN ;SKIP IF OUTPUT FILE NOT YET OPEN
POPJ P,
PUSHJ P,.SAVE1 ;SAVE P1
MOVEI P1,O.DEV ;POINT TO OUTPUT SPEC
PUSHJ P,GETSPC ;COPY STICKEY DEFAULTS
SETZM LINNUM ;CLEAR LINE COUNT
SETZ T1, ;ASCII MODE
MOVE T2,O.DEV ;OUTPUT DEVICE
MOVE T4,T2 ;REMEMBER OUTPUT DEVICE FOR DEVCHR
MOVSI T3,B.OC ;BUFFER HEADER
OPEN OC,T1 ;OPEN OUTPUT DEVICE
JRST E.LKO ;CANT OPEN OUTPUT
DEVCHR T4, ;GET CHARACTERISTICS OF OUTPUT DEVICE
TLNE T4,DV.TTY ;SKIP IF NOT A TTY
TLO F,L.OTTY ;NOTE TTY SO WILL CLOSE AFTER EACH DUMP
PUSH P,.JBFF ;SAVE CURRENT .JBFF
MOVEI T1,OBUF
MOVEM T1,.JBFF
OUTBUF OC,1 ;DECLARE 1 OUTPUT BUFFER
POP P,.JBFF ;AND RESET .JBFF
PUSH P,P1
MOVEI P1,FBMTIM ;TIMES TO RETRY IF FILE BEING MODIFIED
PUSH P,DL ;SAVE DL ON STACK
OPNOU1: MOVE T1,O.NAM ;OUTPUT FILE
HLLZ T2,O.EXT ;EXT
SETZ T3, ;STANDARD PROTECTION
HRRI DL,O.DEV ;POINT TO OUTPUT SPEC
PUSHJ P,SETPTH ;SET UP PATH OR PPN IN T4
TRO F,R.LKF ;ASSUME LOOKUP WILL FAIL
TLNE F,L.APP ;SKIP IF SUPERSEDE, NOT IF APPEND
LOOKUP OC,T1 ;APPEND, TRY LOOKUP
JRST OAPP1 ;SUPERSEDE OR LOOKUP FAILED
TRZ F,R.LKF ;LOOKUP OK
OAPP1: PUSHJ P,SETPTH ;SET UP PATH OR PPN IN T4
OSUPER: ENTER OC,T1
JRST OSUPE
HRR DL,(P) ;RESTORE RH(DL)
POP P,P1 ;FIX STACK
POP P,P1 ;RESTORE P1
HLRE T1,T4 ;CURRENT LENGTH OF OUTPUT FILE
JUMPGE T1,OSUP1 ;JUMP IF BLOCKS
MOVNS T1 ;MAKE POSITIVE WORDS
ADDI T1,177
LSH T1,-7 ;CONVERT TO BLOCKS
OSUP1: TRNN F,R.LKF ;SKIP IF SUPERSEDE OR LOOKUP FAILED
USETO OC,1(T1) ;SET TO START WRITING
TLO F,L.OOPN ;NOTE OUTPUT FILE OPEN
POPJ P,
OSUPE: SOJLE P1,E.NSFO ;EXIT IF STILL BUSY
HRRZ T4,T2 ;ERROR CODE
CAIE T4,EC.FBM ;SKIP IF FILE BEING MODIFIED
JRST E.NSFO ;NO, SOME OTHER PROBLEM
MOVEI T4,1
SLEEP T4, ;SLEEP 1 SECOND
JRST OPNOU1 ;AND TRY AGAIN
;SUBROUTINE TO SET UP T4 AS A PPN IF NO SFD SPECIFIED OR A POINTER
; TO THE PATH IF NEEDED.
;USES NO ACS
IFG LN.DRB-1,< ;IF WE HAVE SFD'S
SETPTH: MOVE T4,%DIR(DL) ;SET UP T4 IN CASE
SKIPN %DIR+2(DL) ;NEED A PATH?
POPJ P, ;NO--RETURN
PUSHJ P,.SAVE2 ;SAVE P1-P2
MOVSI P1,-LN.DRB*2 ;NUMBER OF BIWORDS
MOVEI P2,PATH+1 ;WHERE TO PUT PATH
STPTH1: MOVE T4,(P1) ;PICH UP DIRECTORY WORD
PUSH P2,T4 ;STORE IN PATH
AOBJP P2,.+2 ;SKIP OVER THE MASK
AOBJN P2,STPTH1 ;LOOP FOR MORE
MOVEI T4,PATH ;POINT TO PATH
POPJ P, ;RETURN
>
IFLE LN.DRB-1,<
MOVE T4,%DIR(DL) ;GET PPN
POPJ P, ;RETURN
>
;LFLT -- LIST WORD AS FLOATING POINT NUMBER
;CALL: MOVE T1,WORD
; PUSHJ P,LFLT
LFLT: POPJ P,
;LXWD -- LIST WORD IN XWD FORMAT (N,N)
;CALL: MOVE T1,WORD
; PUSHJ P,LXWD
;USES T1, T2, T3, C
LXWD: JSP T4,FORMAT ;LINE UP THE OUTPUT
MOVE T2,[POINT 3,T1] ;BYTE POINTER TO NUMBER
MOVEI T3,^D12 ;12 DIGITS IN A WORD
LXWD1: ILDB C,T2 ;GET A DIGIT
ADDI C,60 ;MAKE ASCII
PUSHJ P,LCHR ;TYPE THE DIGIT
CAIN T3,7 ;HALF WAY POINT?
PUSHJ P,LCOMMA ;TYPE A COMMA
SOJG T3,LXWD1 ;LOOP FOR WHOLE WORD
POPJ P, ;RETURN
;LDATE -- OUTPUT DATE IN FORM DD-MMM-YY
;CALL: MOVE T4,DATE IN SYSTEM FORMAT
; PUSHJ P,LDATE
;USES T1, T2, T3, T4, M, C
LDATE: PUSH P,T4+1
IDIVI T4,^D31 ;GET DAY
MOVEI T1,1(T4+1)
PUSHJ P,LDEC2
IDIVI T4,^D12 ;GET MONTH
MOVE T1,[ASCII /-Jan--Feb--Mar--Apr--May--Jun--Jul--Aug--Sep--Oct--Nov--Dec-/](T4+1)
POP P,T4+1
MOVEI T2,0
MOVEI M,T1
PUSHJ P,LSTR
MOVEI T1,^D64(T4) ;GET YEAR
PJRST LDEC2Z ;OUTPUT YEAR AND RETURN
;LTIME -- OUTPUT TIME IN FORM HH:MM
;CALL: MOVE T4,TIME IN MINUTES
; PUSHJ P,LTIME
;USES T1, T2, T3, T4, T5, C
LTIME: PUSH P,T4+1 ;SAVE T5 (WHICH IS P1)
IDIVI T4,^D60 ;GET HOURS
MOVE T1,T4
PUSHJ P,LDEC2 ;LIST HOURS
MOVEI C,":"
PUSHJ P,LCHR
MOVE T1,T4 ;LIST MINUTES
POP P,T4+1 ;RESTORE T5
;FALL INTO LDEC2Z
;LDEC2Z -- LIST DECIMAL AT LEAST 2 DIGITS WITH LEADING ZERO
;CALL: MOVEI T1,NUMBER
; PUSHJ P,LDEC2Z
;USES T1, T2, T3, C
LDEC2Z: MOVEI C,"0" ;SETUP TO PRINT 0 IN CASE NEEDED
CAIGE T1,^D10 ;TEST TO SEE IF NEEDED
PUSHJ P,LCHR ;YES--SEND IT
PJRST LDEC ;GO FINISH WORK
;LSTDC2 -- LIST MESSAGE, DECIMAL NUMBER, AND TWO SPACES
;CALL: MOVEI M,MESSAGE
; MOVE T1,NUMBER
; PUSHJ P,LSTDC2
;USES T1, T2, T3, M, C
LSTDC2: PUSHJ P,LSTR ;LIST THE MESSAGE
PUSHJ P,LDEC ;LIST THE DECIMAL NUMBER
PJRST LSPC2 ;LIST THE TWO SPACES AND RETURN
;LDEC4 -- LIST DECIMAL AT LEAST FOUR DIGITS
;LDEC3 -- LIST DECIMAL AT LEAST THREE DIGITS
;LDEC2 -- LIST DECIMAL AT LEAST TWO DIGITS
;CALL: MOVEI T1,NUMBER
; PUSHJ P,LDEC2
;USES T1, T2, T3, C
LDEC4: CAIGE T1,^D1000 ;SEE IF NEEDED
PUSHJ P,LSPC
LDEC3: CAIGE T1,^D100
PUSHJ P,LSPC
LDEC2: CAIGE T1,^D10
PUSHJ P,LSPC ;YES
;FALL INTO LDEC
;LDEC -- LIST DECIMAL NUMBER
;LOCT -- LIST OCTAL NUMBER
;LRDX -- LIST VIA PRESET RADIX
;CALL: MOVEI T1,NUMBER
; (MOVEI T3,RADIX LRDX ONLY)
; PUSHJ P,LDEC/LOCT/LRDX
;USES T1, T2, T3, C
LDEC: MOVEI T3,^D10 ;INITIALIZE FOR DECIMAL RADIX
JRST LRDX1
LRDX: SKIPA T3,ORADIX ;INITIALIZE FOR CURRENT OUTPUT RADIX
LOCT: MOVEI T3,10 ;INITIALIZE FOR OCTAL RADIX
LRDX1: JSP T4,FORMAT ;TAKE CARE OF FORMATING
JRST $LRDX ;OUTPUT
$LNBR: MOVE T3,ORADIX ;PICK UP OUTPUT RADIX
JRST $LRDX ;PRINT
$LDEC: SKIPA T3,[^D10] ;INITIALIZE FOR DECIMAL
$LOCT: MOVEI T3,10 ;INITIALIZE FOR OCTAL RADIX
$LRDX: MOVEI C,"-" ;IN CASE -VE
SKIPGE T1 ;SKIP IF POSITIVE
PUSHJ P,LCHR ;ELSE PRINT THE MINUS
CAMN T1,[1B0] ;JUST THE SIGN BIT?
AOS T1 ;YES--MAKE LARGER
MOVM T1,T1 ;MAKE T1 POSITIVE
$LRDX1: IDIV T1,T3 ;DIVIDE BY RADIX
HRLM T2,(P) ;SAVE REMAINDER
SKIPE T1 ;SEE IF ANYTHING LEFT
PUSHJ P,$LRDX1 ;YES--LOOP BACK WITH PD LIST
HLRZ C,(P) ;GET BACK A DIGIT
ADDI C,"0" ;CONVERT TO ASCII
PJRST LCHR ;GO LIST IT
;LCRLF3 - LIST END OF LINE AND 2 BLANKS
;LCRLF2 - LIST END OF LINE AND 1 BLANK LINE
LCRLF3: PUSH P,LMARGN ;SAVE LEFT MARGIN FOR NOW
SETZM LMARGN ;CLEAR SO WONT WRITE SPACES
PUSHJ P,LCRLF ;NEW LINE
JRST LCRL2A ;AND ANOTHER NEW LINE
LCRLF2: PUSH P,LMARGN ;SAVE LEFT MARGIN FOR NOW
SETZM LMARGN ;;CLEAR SO WONT WRITE SPACES
LCRL2A: PUSHJ P,LCRLF ;NEW LINE
POP P,LMARGN ;RESTORE LEFT MARGIN
;LCRLF - LIST END OF LINE
;CALL: PUSHJ P,LCRLF
;USES M, C
LCRLF: TRZ F,R.LTAB ;CLEAR TAB MEMORY
MOVEI M,[ASCIZ /
/]
JRST $LSTR
;LSTR - LIST ASCII STRING
;CALL: MOVEI M,STRING (END WITH 0 BYTE)
; PUSHJ P,LSTR
;USES M, C
LSTR: JSP T4,FORMAT
$LSTR: TLOA M,440700 ;CONVERT TO BYTE POINTER
LSTR1: PUSHJ P,LCHR ;OUTPUT CHARACTER
ILDB C,M ;GET NEXT CHARACTER
JUMPN C,LSTR1 ;LOOP UNLESS NULL
POPJ P, ;RETURN
;LSIXT -- LIST SIXBIT WORD FOLLOWED BY TAB
;CALL: MOVE T2,WORD
; PUSHJ P,LSIXT
;USES T1, T2, C
LSIXT: PUSHJ P,LSIXN ;OUTPUT WORD
PJRST LTAB ;GO OUTPUT TAB AND RETURN
;LSIX -- LIST SIXBIT WORD (AT LEAST ONE SPACE)
;LSIXN -- SAME EXCEPT 0 GIVES NO SPACES
;CALL: MOVE T2,WORD
; PUSHJ P,LSIX/LSIXN
;USES T1, T2, C
LSIX: MOVEI T1,0 ;CLEAR NEXT CHARACTER
LSHC T1,6 ;FETCH NEXT CHAR
PUSHJ P,LCHRS ;LIST IT IN SIXBIT
LSIXN: JUMPN T2,LSIX ;LOOP UNTIL ONLY BLANKS LEFT
POPJ P, ;RETURN
;LSIXC -- LIST SIXBIT WORD FIXED NUMBER OF CHARACTERS
;CALL: MOVE T2,WORD
; MOVEI T3,NUM CHARS TO PRINT
; PUSHJ P,LSIXC
;USES T1, T2, T3, C
LSIXC: MOVEI T1,0 ;CLEAR NEXT CHAR
LSHC T1,6 ;GET NEXT CHAR
PUSHJ P,LCHRS ;LIST IT IN SIXBIT
SOJG T3,LSIXC ;LOOP UNTIL DONE
POPJ P, ;RETURN
;LSPC3 -- LIST THREE SPACES
;LSPC2 -- LIST TWO SPACES
;CALL: PUSHJ P,LSPC2
;USES C
LSPC3: PUSHJ P,LSPC ;DO ONE
LSPC2: PUSHJ P,LSPC ;DO ONE
PJRST LSPC ;DO ANOTHER AND RETURN
;SUBROUTINE TO TAKE CARE OF OVERFLOWING LINE OR PAGE
;SAVES P1, P2
FORMAT: TROE F,R.NORE ;SKIP IF NOT ALREADY IN THIS SUBROUTINE
JRST (T4) ;DONT RECURSE, JUST PASS THROUGH
MOVEM M,SAVEM ;SAVE AC'S
MOVE M,[XWD T1,SAVET1]
MOVEM F,SAVEF ;SAVE F
BLT M,SAVEP2
TRZ F,R.SCNT ;ASSUME COUNT BIT OFF
TROE F,R.CNT ;SAVE OLD COUNT BIT, SET IT FOR NOW
TRO F,R.SCNT ;COUNT BIT WAS ON
MOVE P2,SAVEP2
PUSH P,PAGNUM ;SAVE CURRENT CHARACTER POSITION
PUSH P,LINNUM
PUSH P,CURCHR
PUSHJ P,FORMT2 ;MAKE WIDTH AND JUSTIFY WORK
MOVN M,CURCHR ;STORE THE CURRENT CHAR. POSITION
MOVEM M,SAVCCH ; NEGATED, IN SAVCCH
MOVE M,SAVEM ;RESTORE M
PUSHJ P,(T4) ;CALL ROUTINE TO COUNT CHARS TO BE OUTPUT
MOVEI T2,NEWLIN
MOVE T1,CURCHR ;NEW CHARACTER POSITION
ADDM T1,SAVCCH ;SAVCCH := WIDTH OF PRINTED FIELD
CAMLE T1,RMARGN ;SKIP IF NOT YET PAST RIGHT MARGIN
PUSHJ P,FORMFX ;OUTPUT CRLF FIRST
MOVEI T2,NEWPAG
MOVE T1,LINNUM ;NEW LINE NUMBER
CAMLE T1,LINPAG ;SKIP IF NOT YET PAST END OF PAGE
PUSHJ P,FORMFX ;OUTPUT PAGE EJECT FIRST
POP P,CURCHR
POP P,LINNUM
POP P,PAGNUM
MOVE T1,SAVEF
ANDI T1,R.LHED!R.PHED ;REMEMBER HEADER BITS
IOR F,T1
TRZE F,R.SCNT ;SKIP IF WAS SUPPOSED TO OUTPUT
JRST FORMT1 ;NO, JUST COUNT CHARS, LEAVE COUNT BIT ON
TRZ F,R.CNT ;YES, TURN OFF COUNT BIT
PUSHJ P,FORMF1 ;OUTPUT IT
FORMT1: MOVE P1,SAVEP1 ;RESTORE P1-P2
MOVE P2,SAVEP2
TRZ F,R.NORE
POPJ P, ;EXIT
FORMT2: TRNN F,R.LHED!R.PHED ;DO WE WANT TO PRINT HEADERS
POPJ P, ;NO--RETURN
MOVEI C,200 ;FLAG TO GENERATE HEADER
PJRST LCHR ;GO DO IT
FORMFX: TRNN F,R.SCNT ;SKIP IF ONLY COUNTING
TRZ F,R.CNT ;NO, CLEAR COUNT BIT
POP P,T1 ;SAVE RETURN FROM SUBROUTINE
POP P,CURCHR ;RESTORE ORIGINAL CHARACTER POSITION
POP P,LINNUM
POP P,PAGNUM
PUSH P,T1 ;RESTORE RETURN FROM SUBROUTINE
TRZ F,R.LHED!R.PHED ;DONT WANT LINE OR PAGE HEADER HERE
PUSHJ P,(T2) ;CALL APPROPRIATE ROUTINE
MOVE T1,F ;REMEMBER HEADER BITS
ANDI T1,R.PHED!R.LHED
IORM T1,SAVEF ;SAVE FOR ROUTINE EXIT
TRO F,R.CNT
POP P,T1 ;SAVE RETURN FROM SUBROUTINE
PUSH P,PAGNUM
PUSH P,LINNUM
PUSH P,CURCHR
PUSH P,T1 ;RESTORE RETURN FROM SUBROUTINE
FORMF1: MOVE M,[XWD SAVET1,T1]
BLT M,P2 ;RESTORE ORIGINAL AC'S
MOVE M,SAVEM
PJRST (T4) ;CALL OUTPUT ROUTINE
LEJECT: MOVEI C,C.FF
PJRST LCHR
;LCRT -- LIST A CARRAGE RETURN
;LTAB -- LIST TAB
;LSPC -- LIST SPACE
;LCHR -- LIST CHARACTER
;LCHRS-- LIST SIXBIT CHARACTER
;CALL: (MOVEI C,CHARACTER IF LCHR)
; (MOVEI T1,CHARACTER IF LCHRS)
; PUSHJ P,LTAB/LSPC/LCHR
;USES C EXCEPT LCHR USES NO AC'S
LCRT: MOVEI C,.CHCRT
PJRST LCHR1
LCOMMA: SKIPA C,[","] ;LOAD A COMMA
LCHRS: MOVEI C," "-' '(T1) ;CONVERT TO ASCII AND MOVE TO C
LCHR: JUMPE C,.POPJ ;DO NOT PRINT NULLS
CAIE C," " ;SEE IF A TAB
JRST LCHR1 ;NO--GO SEND IT
LTAB: TRON F,R.LTAB ;SET/TEST TAB
POPJ P, ;RETURN IF NOT TWO IN A ROW
LTAB1: SKIPA C,[" "] ;GET THE TAB
LSPC: MOVEI C," " ;GET THE SPACE
LCHR1: TRZE F,R.LTAB ;CLEAR TAB MEMORY
JRST LCHR3 ;IF SET, GO ISSUE ONE
TRZE F,R.PHED ;SKIP IF DONT WANT PAGE HEADER
PUSHJ P,PHEAD ;OUTPUT PAGE HEADER
TRZE F,R.MARS ;SKIP IF DONT NEED LEFT MARGIN SPACES
PUSHJ P,MARSPC ;OUTPUT SPACES FOR LEFT MARGIN
TRZE F,R.LHED ;SKIP IF DONT WANT ADDR TYPED
PUSHJ P,LHEAD ;OUTPUT ADDR AS LINE HEADER
TRZE F,R.LTAB ;SEE IF LHEAD GOT US INTO A BAD STATE
JRST LCHR3 ; AND IF IT DID CLEAN UP.
CAIN C,200 ;SPECIAL FLAG?
POPJ P, ;YES--QUIT NOW
JUMPE C,LCHR6 ;JUMP IF NULL
CAIL C,40 ;SKIP IF NON-GRAPHIC
JRST LCHR5 ;OK
PUSH P,T1
MOVEI T1,7 ;PREPARE FOR POSSIBLE TAB
CAIN T1,.CHTAB ;IS IT A TAB
IORM T1,CURCHR ;YES--FORCE TO A TAB STOP
MOVEI T1,1
LSH T1,-1(C) ;POSITON BIT FOR CHAR
TDNE T1,FORMCH ;SKIP IF NOT LEGAL FORM CHAR
JRST LCHR4 ;OK, OUTPUT CHAR AS IS
PUSH P,C ;SAVE CHAR
MOVEI C,"^" ;NO, FLAG AS CONTROL LETTER
PUSHJ P,LCHR
POP P,C
ADDI C,100 ;AND MAKE GRAPHIC
LCHR4: POP P,T1
LCHR5: AOS CURCHR ;COUNT CHARS ON THIS LINE
LCHR6: TRNE F,R.CNT ;SKIP IF ACTUALLY OUTPUTTING
JRST LNOWRT ;NO, ONLY COUNTING, DONT OUTPUT
SOSG B.OC+2 ;SEE IF ROOM IN THE BUFFER
JRST LCHRW ;NO--GO WRITE THIS BUFFER
LCHR2: TLNE F,L.OTTY ;IS OUTPUT TO TTY: ?
TLZ F,L.TDMP ;YES--MAKE TDUMP=DUMP
TLNE F,L.TDMP ;DOES HE WANT IT ON HIS TTY ALSO?
OUTCHR C ;YES--DO THAT TOO
IDPB C,B.OC+1 ;YES--SEND CHARACTER
LNOWRT: CAIL C,C.LF ;SKIP IF NOT END OF LINE CHAR
CAILE C,C.CR ;SKIP IF END OF LINE CHAR
POPJ P,
TRO F,R.MARS ;NOTE NEED FOR SPACES FOR LEFT MARGIN
SETZM CURCHR ;RESTART CHAR COUNTER
CAIN C,C.LF ;SKIP IF NOT LINE FEED
AOS LINNUM ;YES, COUNT 1 LINE
CAIN C,C.FF ;SKIP IF NOT PAGE EJECT
SETZM LINNUM
MOVEI T1, ;INCREMENT FOR VT
CAIN C,C.VT ;SKIP IF VERTICAL TAB
ADDM T1,LINNUM
POPJ P, ;RETURN
LCHR3: PUSH P,C ;SAVE REQUESTED CHARACTER
PUSHJ P,LTAB1 ;SEND A TAB
POP P,C ;RESTORE CHARACTER
JRST LCHR1 ;PROCEED
PHEAD: SKIPE LINNUM ;TOP OF FORM?
POPJ P, ;NO--SHOULD NOT GET HERE
PUSHJ P,SAVHED ;SAVE AC'S FOR HEADER SUBROUTINES
TRZE F,R.LHED ;SKIP IF LINE HEADER NOT NEEDED
TRO F,R.RLH ;REMEMBER THAT BIT
PUSHJ P,LCRT ;LIST THE <CR>
SKIPE T1,PAGNUM ;SKIP IF NOT NUMBERING PAGES
JRST NEWPG1 ;NUMBERING, T1=CURRENT PAGE NUMBER
TLNN F,L.TITL ;SKIP IF TITLE SPECIFIED
JRST NEWPG6 ;NO TITLE LINE
NEWPG1: MOVEI C,1
IDIVI T1,^D10
JUMPE T1,.+2
AOJA C,.-2 ;COUNT CHARS FOR PAGE NUMBER
ADDI C,7 ;PLUS <SPACE>PAGE<SPACE><SPACE>
MOVE T1,RMARGN ;RIGHT MARGIN
SUB T1,LMARGN ;MINUS LEFT MARGIN=CHARS LEFT FOR TITLE+PAGE NUM
SUB T1,C ;MINUS CHARS FOR PAGE NUM=CHARS FOR TITLE
JUMPLE T1,NEWPG5 ;JUMP IF NO ROOM FOR TITLE
SKIPN TITLEN ;SKIP IF NON-NULL TITLE
JRST NEWPG4 ;NO TITLE
MOVE P1,TIT.Y ;BYTE POINTER FOR TITLE
PUSHJ P,MKPNTR ;CLEAR INDIRECT BIT IN POINTER
NEWPG3: ILDB C,P1 ;NEXT CHAR OF TITLE
CAIN C,TIT.EN ;SKIP IF NOT END OF TITLE
JRST NEWPG4
PUSHJ P,LCHR ;OUTPUT THE CHAR
SOJG T1,NEWPG3 ;LOOP FOR NUMBER OF CHARS ALLOWED FOR TITLE
JRST NEWPG5 ;NO MORE ROOM
NEWPG4: SKIPN PAGNUM ;NO NEED FOR SPACES IF NOT NUMBERING PAGES
JRST NEWPG6
PUSHJ P,LSPC ;FINISHED TITLE, FILL OUT WITH SPACES
SOJG T1,.-1
NEWPG5: SKIPN PAGNUM ;SKIP IF NUMBERING PAGES
JRST NEWPG6 ;END OF TITLE LINE
MOVEI M,[ASCIZ . PAGE .]
PUSHJ P,$LSTR
MOVE T1,PAGNUM ;CURRENT PAGE NUMBER
PUSHJ P,$LDEC ;OUTPUT PAGE NUMBER
AOS PAGNUM ;AND BUMP COUNT
NEWPG6: PUSHJ P,LCRLF ;END OF TITLE LINE
TLNN F,L.SUBT ;SKIP IF WANT SUBTITLE
JRST NEWPGE ;NO, ALL DONE
MOVE T1,RMARGN ;RIGHT MARGIN
SUB T1,LMARGN ;MINUS LEFT MARGINCHARS FOR SUBTITLE
JUMPLE T1,NEWPGE ;NO ROOM
MOVE P1,SUBT.Y ;BYTE POINTER FOR SUBTITLE
PUSHJ P,MKPNTR ;CLEAR INDIRECT BIT IN POINTER
NEWPG7: ILDB C,P1 ;GET NEXT CHAR OF SUBTITLE
CAIN C,SUBT.E ;SKIP IF NOT END OF SUBTITLE
JRST NEWPGE
PUSHJ P,LCHR ;OUTPUT THE CHAR
SOJG T1,NEWPG7
NEWPGE: SKIPE LINNUM ;DO NOT NEED BLANK LINES
; IF NO TITLE GIVEN.
PUSHJ P,LCRLF3 ;2 BLANK LINES AFTER SUBTITLE
TRZE F,R.RLH ;SKIP IF LINE HEADER WAS NOT REQUESTED
TRO F,R.LHED ;TURN REQUEST BACK ON
POPJ P,
LHEAD: TLNE F,L.ADDR ;SKIP IF ADDR IS OFF
TRNN F,R.CON1 ;SKIP IF DUMPING CONTENTS
POPJ P, ;NO HEADER
CAIGE C,40 ;REAL CHARACTER?
JRST [TRO F,R.LHED ;NO--HOLD OFF
POPJ P,0] ; UNTILL SOMETHING IS SEEN.
PUSHJ P,SAVHED ;SAVE AC'S FOR HEADER SUBROUTINES
MOVE T1,SAVADR ;ADDRESS
PUSHJ P,$LOCT ;OUTPUT ADDRESS
MOVEI M,[ASCIZ ./ .]
PJRST $LSTR
MARSPC: PUSHJ P,SAVHED ;SAVE AC'S FOR HEADER SUBROUTINES
SKIPN T1,LMARGN ;SKIP IF NEED SPACES FOR LEFT MARGIN
POPJ P, ;NO SPACES NEEDED
PUSHJ P,LSPC ;OUTPUT SPACES OVER TO LEFT MARGIN
SOJG T1,.-1
POPJ P,
;SUBROUTINE TO SAVE AC'S FOR HEADER SUBROUTINES
SAVHED: EXCH T1,(P) ;SAVE T1 AND RETRIEVE RETURN
PUSH P,T2
PUSH P,T3
PUSH P,C
PUSH P,M
PUSH P,P1
PUSHJ P,(T1) ;CALL CALLING SUBROUTINE
POP P,P1
POP P,M
POP P,C
POP P,T3
POP P,T2
PJRST T1POPJ
;HERE TO WRITE ONE BUFFER
LCHRW: OUT OC, ;OUTPUT BUFFER
JRST LCHR2 ;OK--GO DO CHARACTER NOW
PUSH P,T1 ;ERROR--SAVE SOME ACS
PUSH P,T2 ; ..
PUSH P,T3 ; ..
GETSTS OC,T1 ;GET ERROR STATUS
MOVE T2,T1 ;PREPARE TO CLEAR
ANDI T2,37777 ; BY PRESERVING JUST
SETSTS OC,(T2) ; THE CONTROL BITS
OUTSTR [ASCIZ /
% Listing device output error, status /]
MOVE T3,[POINT 3,T1,17] ;SETUP FOR OCTAL TYPEOUT
LCHRWE: ILDB T2,T3 ;GET DIGIT
ADDI T2,"0" ;CONVERT TO ASCII
OUTCHR T2 ;TYPE IT
TLNE T3,(77B5) ;SEE IF DONE YET
JRST LCHRWE ;NO--LOOP
OUTSTR [ASCIZ /
/] ;NOTE--ALL THIS DONE HERE IN CASE
; WRONG SEGMENT IN CORE
POP P,T3 ;RESTORE ACS
POP P,T2 ; ..
POP P,T1 ; ..
JRST LCHR2 ;AND WRITE NEXT CHARACTER
SUBTTL SYMBOL TABLE LOGIC -- SYMBOL COMMANDS
;XTRACT -- PULL SYMBOL TABLE FROM .SAV, .SHR, .DAE, .HGH, AND SO ON
XPROC: PUSHJ P,GIVSYM ;GIVE BACK PREMUTATION VECTOR
TLZ F,L.IOPN ;CAUSE INPUT FILE TO LOOK CLOSED
HRRI DL,S.ZER ;POINT TO SYFILE
MOVEI T1,.JBSYM ;LOOK FOR SYMBOL TABLE POINTER
TLO DL,DL.SYM ;NOTE WE ARE READING SYMBOL TABLE
PUSHJ P,FNDADR ;GO FIND THE POINTER
TLNN F,L.NXM ;WAS THERE A POINTER?
SKIPL T1 ;WITH SOMETHING IN IT
JRST TRYHSM ;NO--GO LOOK IN .JBHSM
MOVEM T1,SYMPTR ;SAVE SYMBOL TABLE POINTER
PUSHJ P,GETST ;GO READ IN THE SYMBOL TABLE
TRYHSM: MOVEI T1,.JBHSM+1B18 ;POINT TO HISEG POINTER
PUSHJ P,FNDADR ;GO GRAB IT
TLNN F,L.NXM ;DOES IT EXIST?
SKIPL T1 ;AND IS IT VALID?
JRST FINXPR ;NO--GO AWAY
CAMN T1,SYMPTR ;IS IT THE SAME AS .JBSYM
JRST FINXPR ;YES--GO AWAY
MOVEM T1,SYMPTR ;SAVE FOR LATER
PUSHJ P,GETST ;READ HISEG POINTER
FINXPR: TLZ F,L.IOPN ;INPUT NO LONGER OPEN
TLZ DL,DL.SYM ;WE ARE NO LONGER READING SYMBOL TABLE
TLO DL,DL.FBR ;SET DL.FBR SO FIXSYM WILL GENERATE
; POINTERS.
PUSHJ P,FIXSYM ;***TEMP*** FIX UP POINTERS NOW
HRRI DL,I.ZER ;POINT BACK TO INPUT
MOVSI T1,1 ;CAUSE NEW WIDOW TO BE READ
MOVEM T1,WINADR ; ..
PUSHJ P,.TCRLF## ;TYPE A CRLF
MOVE T1,SYMLEN ;GET LENGTH OF SYMBOL TABLE
LSH T1,-1 ;DIVIDE BY TWO
PUSHJ P,.TDECW## ;TYPE THE DECIMAL WORD
MOVEI T1,[ASCIZ / symbols eXTRACTed
/]
PJRST .TSTRG## ;LIST THE STRING AND RETURN
SUBTTL SYMBOL TABLE LOGIC -- SUBROUTINES
;READ SYMBOL TABLE FROM FILE
GETST: PUSHJ P,.SAVE2 ;SAVE P1 AND P2
HLRE T1,SYMPTR ;GET POSITIVE WC
MOVM T1,T1 ; IN T1
ADD T1,SYMLEN ;INCLUDE CURRENT SIZE
MOVEI P2,SYMNDX ;GET INDEX
PUSHJ P,GETCOR ;GET THE CORE FROM THE MONITOR
MOVEI P1,@SYMTAB ;POINT TO SYMTAB
MOVE P2,SYMPTR ;POINT TO IT IN IMAGE FILE
SOS P1 ;THE PUSH WILL ADD THEN STORE
GETST1: HRRZ T1,P2 ;GET ADDRESS OF WORD
PUSHJ P,FNDADR ;GET THE WORD
TLNE F,L.NXM ;WAS IT THERE?
JRST GETST2 ;NO--NO MORE CORE
PUSH P1,T1 ;STORE THE WORD
AOBJN P2,GETST1 ;LOOP FOR WHOLE TABLE
POPJ P, ;RETURN
;HERE IF NOT ALL OF S.T. IN CORE IMAGE FILE
GETST2: HLRZ P1,P1 ;GET THE NUMBER OF PUSHES
MOVE T1,SYMLEN ;GET THE LENGTH OF THE SYMBOL TABLE
SUB T1,P1 ;GET THE NUMBER OF WORDS TO GIVE BACK
MOVEI P2,SYMNDX ;POINT TO S.T.
PJRST GIVCOR ;RETURN EXCESS
;EVALUATE A SYMBOL -- CALLED FROM EXPRESSION EVALUATER
EXPSYM: PUSHJ P,REDSYM ;READ A SYMBOL
POPJ P, ;RETURN -- IT WAS A NUMBER
JUMPE T1,.POPJ ;ZERO IS NOT A SYMBOL
SETZ T3, ;ASSUME JUST A SYMBOL
CAIE C,":" ;WAS IT A ST NAME
JRST EXPSY1 ;NO--JUST LOOKUP
PUSH P,T1 ;YES--SAVE NAME
PUSHJ P,REDSYM ;GO READ A RADIX 50 SYMBOL
JRST E.SYMF ;CANT BE A NUMBER
MOVN T2,SYNLEN ;T2 := -(LENGTH OF ST NAMES)
MOVSI T2,(T2) ;SWAP SO IT IS XWD -LENGTH,0
HRRI T2,@SYNTAB ;GET POINTER TO S.T. NAMES
EXCH T1,(P) ;GET BACK S.T. NAME
CAME T1,(T2) ;SCAN TABLE FOR MATCH
AOBJN T2,.-1 ; ..
JUMPGE T2,E.STNU ;IF NO MATCH S.T. NAME IS UNDEFINED
SUBI T2,@SYNTAB ;GET BACK INDEX
ADDI T2,@SYPTAB ;POINT TO VALUE
MOVE T3,(T2) ;PICK UP S.T. POINTER
POP P,T1 ;RESTORE T1 (SYMBOL TO LOOK FOR)
EXPSY1: PUSHJ P,SY2VAL ;CONVERT SYMBOL NAME TO VALUE
SKIPA T2,[-L.MSYM,,0] ;UNDEFINED SEE IF BUILT-IN
POPJ P, ;RETURN VALUE IN T1
CAME T1,MSYMTB(T2) ;IS THIS IT?
AOBJN T2,.-1 ;NO--LOOP OVER ALL
JUMPG T2,E.SYMU ;UNDEFINED
MOVE T1,@MSYMAD(T2) ;PICK UP VALUE
POPJ P, ;RETURN
;SUBROUTINE TO CONVERT SYMBOL TO VALUE
SY2VAL: SETZM SYMPTR ;CLEAR POINTER
TLZ DL,DL.PNF!DL.MDL;CLEAR STATUS BITS
SKIPN T2,SYMLEN ;GET SIZE OF SYMBOL TABLE
POPJ P, ;EMPTY
LSH T2,-1 ;DIVIDE BY 2
MOVN T4,SYMLEN ;PICK UP -VE LENGTH OF S.T.
SKIPN T3 ;SKIP IF WE HAVE POINTER
HRL T3,T4 ;WE DON'T -- COPY THIS POINTER
ADDI T3,@SYMTAB ;POINT TO REAL S.T.
SY2VL3: MOVE T4,(T3) ;GET SYMBOL
TLZN T4,ST.PGM ;IS THIS A PROGRAM NAME
JRST [JUMPE T4,SY2VL4;IGNORE ZEROS
TLO DL,DL.PNF;SET FLAG
JRST .+1] ;BACK TO MAIN LOOP
CAMN T4,T1 ;IS THIS A HIT
JRST SY2VL6 ;YES--WE WIN (MAYBE)
SY2VL4: AOBJN T3,.+1 ;ADD 2 TO POINTER
AOBJN T3,.+2 ; AND SEE IF END OF TABLE
MOVE T3,S2VPTR ;END--POINT BACK TO START
SOJG T2,SY2VL3 ;LOOP FOR WHOLE S.T.
SKIPE T3,SYMPTR ;SKIP IF NO S.T. SPECIFIED
TLNE DL,DL.MDL ;SKIP IF NOT MULTIPLY DEFINED
POPJ P, ;SORRY YOU DO NOT WIN TODAY
SY2VL5: MOVE T1,1(T3) ;GET VALUE
JRST .POPJ1 ;SKIP RETURN
SY2VL6: MOVE T4,(T3) ;GET SYMBOL BACK
TLNE T4,ST.SPI ;CAN WE USE IT?
JRST SY2VL4 ;NO--KEEP LOOKING
TLNN T4,ST.GLB ;IS IT A GLOBAL?
TLNN DL,DL.PNF ;OR IN S.T. WE NAMED?
JRST SY2VL5 ;YES--WE WIN
SKIPN T4,SYMPTR ;SKIP IF LOCAL FOUND BEFORE
JRST SY2VL7 ;NONE. STORE THIS AS VALUE
MOVE T4,1(T4) ;GET THIS VALUE
CAME T4,1(T3) ;SAME AS OLD VALUE
TLO DL,DL.MDL ;NO--MUL DEFINED LCL
SY2VL7: HRRZM T3,SYMPTR ;STOR POINTER
JRST SY2VL4 ;KEEP LOOKING
;SUBROUTINE TO CONVERT A VALUE TO A SYMBOL
;ARGS: T1=VALUE
;VALUE: T1=RADIX50 SYMBOL (WITH FLAGS STILL SET)
; T2=OFFSET FROM CORRECT SYMBOL
VAL2SY: JUMPE T1,.POPJ ;ZERO IS NOT A SYMBOL
SKIPE SYVLEN ;IS SYVTAB SETUP
JRST VL2SY2 ;YES--SKIP THE SORT
PUSH P,T1 ;SAVE T1
PUSHJ P,SYMSRT ;NO--GO SORT SYMBOL TABLE
POP P,T1 ;GET T1 BACK
VL2SY2: MOVE T2,SYVLEN ;T2 IS CURRENT POINTER IN SYVTAB
JUMPE T2,.POPJ ;NOT FOUND IF NO SYMBOLS
MOVE T3,T2 ;T3 IS AMOUNT TO ADJUST T2 BY
PUSHJ P,.SAVE4 ;SAVE P1 AND P2
MOVEI P1,@SYMTAB ;GET THE POINTERS
MOVEI P2,@SYVTAB ; TO SAVE FUTURE TIME
TLZ DL,DL.SNF ;CAUSE FULL SCAN
VL2SY1: AOS T3 ;TAKE CEIL(T3/2)
LSH T3,-1 ;CUT INC IN HALF (BINARY SEARCH)
JUMPE T3,NOSYMB ;DONE IF CUT DOWN TO ZERO
PUSHJ P,FNSYMV ;FIND POINTER TO SYMBOL VALUE
MOVE T4,(C) ;PICK UP VALUE
CAMLE T4,T1 ;IS THIS .GT. WHAT WE WANT?
JRST VL2BIG ;YES--VALUE TOO BIG
CAMN T1,T4 ;IS THIS THE RIGHT VALUE
JRST VL2HIT ;YES--RETURN
ADD T2,T3 ;LOOK FOR BIGGER VALUE
JRST VL2SY3 ; ..
VL2BIG: SUB T2,T3 ;LOOK FOR SMALLER VALUE
SKIPGE T2 ;DEFENSIVE
MOVEI T2,0 ; ..
VL2SY3: CAIE T3,1 ;LAST 2 WORDS?
JRST VL2SY1 ; ..
TLON DL,DL.SNF ;WERE WE HERE BEFORE?
JRST VL2SY1 ;NO--TRY ONE MORE TIME
AOJA T2,NOSYMB ;COUNTERACT EXTRA BUMP
NOSYMB: CAMGE T1,(C) ;IS VALUE OF SYMBOL SMALLER THAN
; WHAT WE WANT?
SOJA T2,[JUMPL T2,.POPJ ;NO--BACK UP SOME
PUSHJ P,FNSYMV ;GET VALUE AND
JRST .-1] ;RETRY
SKIPG (C) ;SKIP IF STILL POSITIVE
POPJ P, ;NO--THE NO MATCH
MOVE T2,T1 ;COPY VALUE WE WANTED
SUB T2,(C) ;SUBTRACT WHAT WE FOUND
MOVE T1,-1(C) ;PICK UP SYMBOL
CAIGE T2,100 ;TOO BIG?
AOS (P) ;NO--GIVE SKIP RETURN
POPJ P, ;YES-- FAIL
VL2HIT: MOVE T1,-1(C) ;GET THE SYMBOL
SETZ T2,0 ;CLEAR OFFSET
JRST .POPJ1 ;SKIP RETURN
FNSYMV: MOVE C,T2 ;GET INDEX TO VECTOR
LSH C,-1 ;MAKE SMALLER (HALF WORD ADDRESS)
ADD C,P2 ;ADD IN START OF PERMUTATION VECTOR
MOVE T4,(C) ;GET POINTER TO S.T.
TRNN T2,1 ;ODD POINTER?
MOVS T4,T4 ;NO--SWAP HALVS
MOVEI C,1(P1) ;GET POINTER TO VALUES
ADDI C,(T4) ;ADD IN OFFSET
POPJ P, ;RETURN
;ROUTINE TO FIX UP POINTERS TO LOCAL S.T. WITHIN SYMBOL TABLE
FIXSYM: TLZN DL,DL.FBR ;IS SYMBOL TABLE O.K. ?
POPJ P, ;YES--RETURN
PUSHJ P,.SAVE2 ;SAVE SOME AC'S
MOVN T1,SYMLEN ;GET -VE LENGTH OF S.T.
HRLZ T1,T1 ;PUT IN L.H.
HRRI T1,@SYMTAB ;PUT IN POINTER TO TABLE
MOVEM T1,S2VPTR ;SAVE FOR LATER
MOVEI T1,^D100 ;NUMBER OF LOCAL S.T.
MOVEI P2,SYNNDX ;GET INDEX
PUSHJ P,GETCOR
MOVEI T1,^D100 ;NUMBER OF LOCAL S.T.
MOVEI P2,SYPNDX ;EXPAND LOCAL S.T.
PUSHJ P,GETCOR ; ..
MOVEI P1,@SYNTAB ;POINTER TO NAME TABLE
MOVEI P2,@SYPTAB ;POINTER TOPOINTER TABLE
SOS P1 ;FIX P1 AND P2 SO THEY
SOS P2 ; CAN BE USED AS PUSH DOWN POINTERS
MOVE T4,S2VPTR ;POINTER TO S.T.
HLLZ T2,T4 ;COPY INDEX TO START OF S.T.
PUSH P2,T2 ; AND STORE AS FIRST POINTER
FXSYM1: MOVE T1,(T4) ;GET SYMBOL
TLNN T1,ST.PGM ;IS IT A PROGRAM NAME
CAIN T1,0 ; ..
JRST FXSYM2 ;NO--SCAN OVER MORE SYMBOLS
PUSH P1,T1 ;SAVE NAME
MOVE T2,T4 ;COPY POINTER
SUBI T2,@SYMTAB ;CONVERT BACK TO RELATIVE POINTER
ADD T2,[2,,2] ;POINT PAST PROGRAM NAME
SKIPGE T2 ;SKIP IF WE ARE NOW DONE
PUSH P2,T2 ;SAVE INDEX
FXSYM2: AOBJN T4,.+1 ;BUMP POINTER
AOBJN T4,FXSYM1 ;LOOP FOR ALL SYMBOLS
HLRZ P1,P1 ;GET SIZE OF TABLE
CAIL P1,^D100 ;TOO BIG?
JRST [M.FAIL <TOO MANY PROGRAMS LOADED>
]
MOVE T1,SYPLEN ;GET LENGTH OF POINTERS
CAME T1,SYNLEN ;COMPARE WITH NAMES
JRST [M.FAIL <BAD SYMBOL TABLE>
]
MOVEI T1,^D100 ;ORIGINAL SIZE
SUBB T1,P1 ;NUMBER OF FREE WORDS
MOVEI P2,SYNNDX ;GET INDEX TO TABLE
PUSHJ P,GIVCOR ;RETURN CORE
MOVE T1,P1 ;GET SIZE AGAIN
MOVEI P2,SYPNDX ;GET POINTER TO OTHER TABLE
PJRST GIVCOR ;RETURN
;HERE TO GIVE BACK SYMBOL TABLE OVERHEAD LISTS
GIVSYM: TLO DL,DL.FBR ;NOTE ST POINTERS ARE JUNK
PUSHJ P,.SAVE2 ;SAVE P1 AND P2
MOVE T1,SYVLEN ;GET LENGTH OF PERMUTATION VECTOR
MOVEI P2,SYVNDX ;GET INDEX
PUSHJ P,GIVCOR ;GIVE BACK CORE
MOVEI P2,SYPNDX ;GIVE BACK POINTER TABLE
MOVE T1,SYPLEN ; ..
PUSHJ P,GIVCOR ; ..
MOVEI P2,SYNNDX ;GIVE BACK NAME TABLE
MOVE T1,SYNLEN ; ..
PJRST GIVCOR ; ..
SUBTTL SYMBOL TABLE LOGIC -- SORT ROUTINE
;THIS IS A PERMUTATION VECTOR SORT FIRST DESCRIBED BY
; LUTHER WOODRUM IN VOL. 8 NO. 3 OF THE IBM SYSTEMS
; JOURNAL. THIS VERSION WAS DERIVED FROM A FORTRAN
; SUBROUTINE WRITTEN BY TIM TOMASELLI, VICTOR TRIOLO
; AND CLIVE DAWSON. THE ORIGINAL VERSION WAS WRITTEN
; IN APL.
APLSRT: PHASE IBUF ;IMPURE CODE
A=123456 ;UNIQUE NUMBER TO PATCH TO BE @SYMTAB
V=707070 ;UNIQUE NUMBER TO PATCH TO BE @SYVTAB
SETZ P1, ;GLOBAL POINTER TO FIRST UNPROCESSED
; ELEMENT.
MOVE N,SYMLEN ;N _ SIZE OF S.T.
LSH N,-1 ;FIX TO ALLOW FOR 2 WORD ENTRIES
JUMPE N,.POPJ ;CAN NOT SORT ZERO LENGTH S.T.
PUSHJ P,MP ;SORT IT
POP P,T2 ;GET HEADER TO LIST
SETZ T3, ;CLEAR ITEM NUMBER
A7:! MOVE T1,T2 ;COPY LINK
MOVE T2,V(T1) ;GET NEXT ITEM
MOVEM T3,V(T1) ;STORE INDEX IN ITEM
CAME T1,T2 ;DONE (LAST LINK POINTS TO SELF)
AOJA T3,A7 ;NO--KEEP UNLINKING
MOVN T3,SYVLEN ;GET -VE SIZE
HRLZS T1,T3 ;FLIP POINTER AROUND
I1:! MOVE T4,V(T3) ;SET V[V[I]] _ I
HRLM T3,V(T4) ; WITHOUT DISTURBING V[I]
AOBJN T3,I1 ;LOOP FOR WHOLE ARRAY
MOVSI P2,(POINT 18,0) ;BYTE POINTER TO
ADDI P2,V ; PERMUTATION VECTOR.
MOVE T2,[A,,V] ;VERY RARE SYMBOL VALUE TO INIT
MOVEM T2,SAVSYM ; MEMORY WORD.
I2:! HLRZ T2,V(T1) ;GET INDEX INTO SYMTAB
LSH T2,1 ;EXPAND BACK AGAIN
;ISSPD: IS USED TO GET AT SYMBOL
; IT POINTS TO THE PASSIVE PART
; OF THE DATA(SYMBOL) IT IS 1 LESS
; THAN ALL THE OTHER "A"'S WHICH
; POINT TO THE VALUE.
ISSPD:! MOVE T4,A(T2) ;GET SYMBOL
TLNE T4,ST.PGM ;PROGRAM NAME?
TLNE T4,ST.SPD ;SPD FLAG ON?
JRST I3 ;YES--PROGRAM NAME ON KILLED ON OUTPUT
MOVE T4,A(T2) ;GET SYMBOL VALUE
CAMN T4,SAVSYM ;SAME VALUE?
JRST I3 ;YES--LOOP FOR NEXT ***TEMP***
MOVEM T4,SAVSYM ;NO--THIS IS NE LAST SYMBOL
IDPB T2,P2 ;ELSE STORE IN VECTOR
I3:! AOBJN T1,I2 ;LOOP OVER WHOLE TABLE
IDPB T2,P2 ;STORE A PAD BYTE IF NEEDED
MOVEI T1,1(P2) ;GET SIZE OF FINAL VECTOR
SUBI T1,V ;GET BACK TO RELATIVE ADDRESS
MOVNS T1 ;MAKE CURRENT LENGTH -VE
ADD T1,SYVLEN ;ADD IN OLD LENGTH SO RESULT IS
; AMOUNT TO GIVE BACK.
MOVEI P2,SYVNDX ;GET ITS INDEX
PJRST GIVCOR ;RETURN WHAT WE DO NOT NEED
MP: CAIN N,1 ;CAN THIS LINK BE FORMED?
JRST BOTTOM ;YES - JUMP OUT
PUSH P,N ;SAVE 'N' FOR LATER
ASH N,-1 ;FLOOR(N/2)
PUSHJ P,MP ;SOME RECURSION IS GOOD FOR THE SOUL
POP P,N ;GET 'N' BACK
EXCH N,(P)
ADDI N,1 ;CIELING OF (N/2)
ASH N,-1 ; ..
PUSHJ P,MP ;MORE RECURSION
JRST MERGE ;MERGE ANY CHAINS THAT EXIST
BOTTOM:!MOVEM P1,V(P1) ;V[P1] _ P1 (LINK TO SELF)
PUSH P,(P) ;THERE MUST BE A REASON FOR
MOVEM P1,-1(P) ; THESE 2 INSTRUCTIONS.
AOJA P1,.POPJ ;P1_P1+1 AND RETURN
MERGE:! POP P,T1 ;M1.
POP P,T2
MOVE C,T2 ;COPY INDEX
LSH C,1 ;POINT TO VALUE
MOVE T3,A(C) ;SEE IF A[J] < A[I]
MOVE C,T1 ;COPY INDEX
LSH C,1 ;POINT TO VALUE
CAMGE T3,A(C) ;SEE WHICH IS BIGGER
EXCH T1,T2 ;EXCHANGE THE INDICIES
PUSH P,(P) ;STORE T1 ON
MOVEM T1,-1(P) ; STACK
M2:! CAME T1,V(T1) ;M2. [END OF CHAIN] IF P[T1] = T1
JRST M3 ;NO--KEEP DOING
MOVEM T2,V(T1) ;SET V[T1] _ T2
POPJ P, ;RETURN
M3:! MOVE T4,T1 ;M3. [ADVANCE] SET T4 _ T1
MOVE T1,V(T1) ;I _ V[I]
MOVE T3,T1 ;GET INDEX
LSH T3,1 ;FIX FOR TABLE SIZE
MOVE T3,A(T3) ;SEE IF STIILL IN ORDER
MOVE C,T2
LSH C,1
CAMGE T3,A(C) ;IF A[T1] < A[T2]
JRST M2 ;GOTO M2
M4:! MOVEM T2,V(T4) ;M4. SET V[T4] _ T2
EXCH T1,T2 ;SWAP AROUND INDICIES
JRST M2
SAVSYM:!BLOCK 1
DEPHASE
APLSIZ==.-APLSRT
SYMSRT: PUSHJ P,.SAVE2 ;SAVE P1 AND P2
MOVE T1,SYMLEN ;GET SIZE OF SYMBOL TABLE
LSH T1,-1 ;CUT IN HALF
MOVEI P2,SYVNDX ;INDEX TO TABEL VECTOR
PUSHJ P,GETCOR ;GO GET THE CORE WE NEED
MOVE T1,[APLSRT,,IBUF];BLT POINTER
BLT T1,IBUF+APLSIZ ;COPY THE CODE
MOVEI T1,@SYMTAB ;POINTER TO SYMBOLS
ADDI T1,1 ;CAUSE TO POINT TO VALUE WORD
MOVEI T2,@SYVTAB ;POINTER TO PERMUTATION VECTOR
MOVE T3,[-APLSIZ,,IBUF] ;AOBJN POINTER
SYNSR1: HRRZ T4,(T3) ;GET Y ADDRESS
CAIN T4,V ;ADDRESS IN PERMUTATION VECTOR
MOVEI T4,(T2) ;YES--FIX POINTER
CAIN T4,A ;ADDRESS IN SYMBOL TABLE?
MOVEI T4,(T1) ;YES--DO THAT TOO
HRRM T4,(T3) ;STORE BACK
AOBJN T3,SYNSR1 ;LOOP FOR ALL CODE BLTED
SOS ISSPD ;FIX THE ONE LOOSER
JRST IBUF ;GO DO THE SORT
SUBTTL OP DECODER
;DESCRIPTION OF OP DECODER FOR DUMP:
;
; THE ENTIRE INSTRUCTION SET FOR THE PDP-10 CAN BE COMPACTED INTO
;A SPACE MUCH SMALLER THAN ONE REGISTER FOR EVERY SYMBOL. THIS OCCURS
;BECAUSE OF THE MACHINE ORGANIZATION AND INSTRUCTION MNEMONICS CHOSEN
;FOR THE PDP-10. FOR EXAMPLE, IF BITS (0-2) OF AN INSTRUCTION EQUAL
;101(2) THE INSTRUCTION IS A HALF WORD INSTRUCTION AND AN "H" MAY
;BE ASSUMED. "T" MAY BE ASSUMED FOR ALL TEST INSTRUCTIONS (WHICH
;BEGIN WITH 110(2).
;
; THE TABLE TBL IN DUMP CONSISTS OF 9 BIT BYTES, 4 TO A WORD.
;THE NUMBERS IN THE BYTES HAVE THE FOLLOWING SIGNIFICANCE:
;0-37(8): THIS IS A DISPATCH COMMAND FOR THE OP-DECODER INTERPRETER.
; LET THE RIGHT MOST TWO BITS EQUAL N; LET THE NEXT 3 BITS
; EQUAL P.
;
; THE CONTENTS OF P2 (INSTRUCTION) CONTAIN IN THE RIGHT
; MOST NINE BITS THE BINARY FOR THE MACHINE INSTRUCTION.
; P AND N REFER TO THE CONTENTS OF P2, AND THE OP DECODER
; WILL PRODUCE AN ANSWER D GIVEN P, N, AND THE CONTENTS
; OF P2X N+1 GIVES THE NUMBER OF BITS IN P2; P GIVES THE
; POSITION (FROM THE RIGHT EDGE) OF THE N+1 BITS.
;
; EXAMPLE: P = 6
; N = 2
;
;; C(P2) = .010 101 100(2)
;
; THE RESULT = D = 010(2) = 2(8)
;
; D IS USED AS A DISPATCH ON THE NEXT BYTES IN THE TABLE.
; IF D = 5, 5 BYTES IN THE TABLE (DON'T COUNT THE BYTES WHICH
; PRINT TEXT OR ARE THE EXTEND BYTE, 41-73(8))
; ARE SKIPPED OVER AND THE 6TH BYTE RESUMES
; THE INTERPRETATION.
;
;40(8) THIS IS A STOP CODE; WHEN THIS IS REACHED INTERPRETATION
; IS FINISHED.
;41(8)-72(8) THE ALPHABET IS ENCODED INTO THIS RANGE.
; 41- A
; 42- B
; 72- Z
; WHEN A BYTE IN THIS RANGE IS REACHED, ITS CORRESPONDING
; LETTER IS TYPED.
;73(8) THIS IS THE "EXTEND" BYTE. THE NEXT BYTE IN THE TABLE
; IS A TRANSFER BYTE BUT MUST HAVE THE ADDRESS EXTENDED
; BY <1000-74*2+FIR.> FIRST.
;
;74(8)-777(8) THIS IS A TRANSFER BYTE. IF THE BYTE IN THIS RANGE IS
; CONSIDERED TO BE A, TRANSFER INTERPRETATION TO THE
; <A-74(8)+FIR.>RD BYTE IN THE TABLE.
;
DEFINE BYT9 (A) <IRP A,<
A>>
IF1,<
DEFINE .ADR (A) <
%'A== CLOC
FIR.== CLOC
DEFINE .ADR (B) <
%'B== CLOC
LASTB==CLOC+74-FIR.>>
DEFINE .TRA (A)<CLOC==CLOC+1>
DEFINE .TRAX (A)<CLOC==CLOC+2>
SYN .TRA, .DIS
DEFINE .TXT (A) <
IFNB <A>, <IRPC A,<CLOC==CLOC+1>>>
DEFINE .END (A) <
IFNB <A>, <IRPC A,<CLOC==CLOC+1>>
CLOC== CLOC+1>
> ;END OF IF1
IF2,<
DEFINE .ADR (A)<IFN %'A-CLOC,<PRINTX PHASE ERR AT: %'A>>
DEFINE .TRA (A) <OUTP %'A+74-FIR.>
DEFINE .TRAX (A),<OUTP 73
OUTP 74+<Z1==%'A-FIR.-1000+74>
IFL Z1,<PRINTX "A" TOO SMALL FOR .TRAX>>
DEFINE .DIS (A) <OUTP A&70/2+A&7-1>
DEFINE .TXT (A) <IFNB <A>,<IRPC A,<OUTP "A"-40>>>
DEFINE .END (A) <
IFNB <A>, <IRPC A,<OUTP "A"-40>>
OUTP 40>
DEFINE OUTP (A)<
IFGE <A>-1000,<PRINTX OPTABLE BYTE "A" TOO BIG>
IFE <BINC==BINC-9>-^D27,<BINR1==A>
IFE BINC-^D18,<BINR2==A>
IFE BINC-9,<BINR3==A>
IFE BINC,< BYTE (9) BINR1,BINR2,BINR3,<A>
BINC==^D36>
CLOC==CLOC+1 >
>
TBL: ;OPDECODER BYTE TABLE
XALL
IFDEF .XCREF <.XCREF>
CLOC== 0 ;SET BYTE LOCATION COUNTER TO 0
BINC== ^D36 ;INIT BYTES/WORD COUNTER
IF1,< DEFINE BYTABL,<
XLIST
;**********THE ARGUMENT FOR THE FOLLOWING "BYT9" MACRO
;**************TERMINATES AT THE NEXT COMMENT WITH: **************
BYT9 <
LIST
.DIS 63,.TRA UUO,.TRA FLO,.TRA HAK,.TRA ACCP,.TRA BOOLE
.TXT H,.TRA HWT,.TXT T,.TRA ACBM
;IO INSTRUCTIONS
.DIS 21,.TRA BD,.TXT CON,.DIS 11,.TRA OI,.TXT S,.DIS 01,.TRA Z,.TRA O
.ADR BD,.DIS 01,.TXT BLK,.TRA IO,.TXT DATA,.ADR IO,.DIS 11,.TRA I,.TRA O
.ADR OI,.DIS 01,.TRA O,.TRA I
;UUOS
.ADR UUO,.DIS 51,.END,.TXT,.DIS 32,.TRA U40,.TRAX U50,.TRA U60
.DIS 21,.TRAX U703,.DIS 11,.TRA USET,.DIS 01
.TXT LOOKU,.TRA P,.TXT ENTE,.TRA R,.ADR USET,.TXT USET,.DIS 01,.TRA I,.TRA O
.ADR U40,.DIS 03,.TRAX CAL,.TXT INI,.TRA T,.END,.END,.END,.END,.END,.TXT CALL,.TRA I
.ADR U60,.DIS 21,.TRA U603,.DIS 01,.TXT IN,.TRA BPUT,.TXT OUT
.ADR BPUT,.DIS 11,.TXT BU,.ADR F,.END F,.TXT,.TXT PU,.TRA T
.ADR U603,.DIS 01,.TRA U6062,.TXT STAT,.DIS 11,.ADR O,.END O,.TXT,.ADR Z,.END Z,.TXT
.ADR U6062,.DIS 11,.TXT S,.TRA U62,.TXT G,.ADR U62,.TXT ETST,.TRA S
;BYTE AND FLOATING INSTRUCTIONS
.ADR FLO,.DIS 51,.TRA BYTE,.TXT F,.DIS 32,.TXT,.TXT AD,.TRA A,.TXT SB
.TRA A,.TXT MP,.TRA A,.TXT DV,.ADR A
.DIS 21,.TRA LMB,.TXT R,.TRA IMB,.ADR LMB,.DIS 02,.END,.TXT
.ADR L,.END L,.TXT,.ADR M,.END M,.TXT
.ADR B,.END B,.TXT,.ADR BYTE,.DIS 32,.END,.TRAX I110,.TRA I120,.TXT
.DIS 03,.TXT UF,.TRA PA,.TXT DF,.TRA N
.TXT FS,.TRA CTYP,.TXT IB,.ADR P,.END P,.TXT,.TXT I,.TRA LD
.ADR LD,.TXT LD,.TRA B,.TXT I,.TRA DP,.ADR DP,.TXT DP,.TRA B
;FWT-FIXED POINT ARITH-MISC
.ADR HAK,.DIS 33,.TRA MV,.ADR MV,.TXT MOV,.TRA MO,.TRA ML,.TRA DV
.TRA SH,.TRA H1,.TRA JP
.DIS 21,.TXT ADD,.TRA IMB,.TXT SU,.ADR BIMB,.TXT B,.ADR IMB,.DIS 02,.END,.TXT
.ADR I,.END I,.TXT,.TRA M,.TRA B,.ADR MO,.DIS 22
.ADR EIMS,.TXT E,.TRA IMS,.TXT S,.TRA IMS,.TXT N,.TRA IMS,.TXT M
.ADR IMS,.DIS 02,.END,.TXT,.TRA I,.TRA M,.ADR S,.END S,.TXT
.ADR ML,.DIS 21,.TXT I,.TRA ML1,.ADR ML1,.TXT MUL,.TRA IMB
.ADR DV,.DIS 21,.TXT I,.TRA DV1
.ADR DV1,.TXT DI,.ADR DV2,.TXT V,.TRA IMB,.ADR H1,.DIS 03,.TXT EXC,.TRA S3,.TXT BL
.ADR T,.END T,.TXT,.TRA AO,.ADR AO,.TXT AOBJ
.TRA AOB,.TXT JRS,.TRA T,.TXT JFC,.TRA L,.TXT XC,.TRA T,.TXT MA,.TRA P
.ADR AOB,.DIS 01,.TRA P,.TRA N
.ADR JP,.DIS 03,.TRA PU,.ADR PU,.TXT PUSH,.TRA PUS,.TRA PO
.ADR PO,.TXT POP,.TRA POP,.TXT JS,.ADR R,.END R,.TXT
.TXT JS,.TRA P,.TXT JS,.ADR PA,.END A,.TXT,.TXT JR,.TRA PA
.ADR PUS,.DIS 01,.ADR J,.END J,.END,.TXT,.ADR POP
.DIS 01,.END,.TXT,.TRA J,.ADR SH,.DIS 02,.TXT A,.TRA S2,.TXT ROT,.TRA S1,.TXT L
.ADR S2,.TXT S,.ADR S3,.TXT H,.TRA S1,.DIS 21,.TXT JFF,.TRA O,.END
.ADR S1,.DIS 21,.END,.TXT,.ADR CTYP,.END C,.TXT
;ARITH COMP-SKIP-JUMP
.ADR ACCP,.DIS 42,.TXT CA,.TRA CA1,.TRA SJ,.TXT A,.TRA JS,.TXT S
.ADR JS,.TXT O,.DIS 31
.TXT J,.TRA COMP,.TXT S,.TRA COMP,.ADR CA1,.DIS 31,.TXT I,.TRA COMP,.TXT M,.TRA COMP
.ADR SJ,.DIS 31,.TXT JUM,.TRA PSJ,.TXT SKI,.ADR PSJ,.TXT P,.ADR COMP
.DIS 03,.END,.TXT,.TRA L,.ADR E,.END E,.TXT,.TXT L,.TRA E,.TRA PA,.TXT G,.TRA E
.ADR N,.END N,.TXT,.END G,.TXT
;HALF WORDS
.ADR HWT,.DIS 51,.TRA HW1,.DIS 21,.TXT R,.TRA HW2,.TXT L,.ADR HW2,.TXT R,.TRA HW3
.ADR HW1,.DIS 21,.TXT L,.TRA HW4,.TXT R,.ADR HW4,.TXT L
.ADR HW3,.DIS 32,.TRA IMS,.TXT Z,.TRA IMS,.TXT O,.TRA IMS,.TRA EIMS
;TEST INSTRUCTIONS
.ADR ACBM,.DIS 31,.TRA AC1,.DIS 01,.TXT D,.TRA AC2,.TXT S,.TRA AC2
.ADR AC1,.DIS 01,.TXT R,.TRA AC2,.TXT L
.ADR AC2,.DIS 42,.TXT N,.TRA EAN,.TXT Z,.TRA EAN,.TXT C,.TRA EAN,.TXT O
.ADR EAN,.DIS 12,.END,.TXT,.TRA E,.TRA PA,.TRA N
;BOOLEAN
.ADR BOOLE,.DIS 24,.TRA ST,.ADR AN,.TXT AND,.TRA B2,.TRA AN,.TRA ST,.TRA AN,.TRA ST
.TXT X,.ADR OR,.TXT OR,.TRA B2,.TXT I,.TRA OR,.TRA AN,.TXT EQ
.TRA DV2,.TRA ST,.TRA OR,.TRA ST,.TRA OR,.TRA OR
.ADR ST,.TXT SET,.ADR B2,.DIS 24,.TXT Z,.TRA IMB,.TRA IMB
.ADR CA,.TXT C,.TRA TA,.ADR TM,.TXT M,.TRA IMB
.ADR CM,.TXT C,.TRA TM,.ADR TA,.TXT A,.TRA IMB,.TRA IMB,.TRA IMB
.ADR CB,.TXT C,.TRA BIMB,.TRA IMB,.TRA CA
.TRA CA,.TRA CM,.TRA CM,.TRA CB,.TXT O,.TRA IMB
;INSTRUCTION GROUP 120
.ADR I120,.DIS 11,.TRA DMOV,.DIS 01,.TXT FIX,.TRA FIX2,.DIS 21,.END
.TXT FLT,.ADR FIX2,.DIS 21,.END,.TRA R
.ADR DMOV,.TXT DMOV,.DIS 01,.TXT E,.TRAX EM,.TXT N
.ADR EM,.DIS 21,.END,.TRA M
;MORE UUO'S
.ADR U50,.DIS 03,.TXT OPE,.TRA N,.TXT TT,.ADR CAL,.TXT CAL,.TRA L,.END,.END,.END
.TXT,.TXT RENAM,.TRA E,.TXT I,.TRA N,.TXT OU,.TRA T
.ADR U703,.DIS 02,.TXT CLOS,.TRA E,.TXT RELEA,.TRA S
.TXT MTAP,.TRA E,.TXT UGET,.TRA F
;INSTRUCTION GROUP 110 - DF ARITHMETIC
.ADR I110,.DIS 21,.TXT DF,.TRAX DF,.END,.ADR DF,.DIS 02
.END AD,.END SB,.TXT M,.TRA P,.END DV
;**********THIS TERMINATES THE "BYT9" MACRO ARGUMENT******
>>>
BYTABL
IF1,< BLOCK <CLOC+3>/4>
IF2,< IFN BINC-^D36,<BYTE (9) BINR1,BINR2,BINR3,0> >
IFNDEF CLOC.,<CLOC.==CLOC>
IFN CLOC.-CLOC,<PRINTX PHASE ERROR IN OPTABLE>
IF2,<
DEFINE .ADR (A) <
PURGE %'A
>
DEFINE .DIS (A)<>
DEFINE LIST <>
DEFINE .TRA (A)<>
DEFINE .TRAX (A)<>
DEFINE .TXT (A)<>
DEFINE .END (A)<>
BYTABL
PURGE LIST
LIST
PURGE BINR1,BINR2,BINR3,OUTP,CLOC,CLOC.,BINC,Z1
PURGE .TRA,.TRAX,.TXT,.END,BYT9,BYTABL
> ;END IF2
IFDEF .CREF <.CREF>
;CALLI NAMES
DEFINE S(A)<
IRP A,<
XLIST
<SIXBIT /A/>
LIST
>>
MAXNCI==.-CITAB
S <LIGHTS>;
CITAB: S <RESET,DDTIN,SETDDT,DDTOUT,DEVCHR,DDTGT>; ;0 TO 5
S <GETCHR,DDTRL,WAIT,CORE,EXIT,UTPCLR,DATE>; ;6 TO 14
S <LOGIN,APRENB,LOGOUT,SWITCH,REASSI,TIMER>; ;15 TO 22
S <MSTIME,GETPPN,TRPSET,TRPJEN,RUNTIM,PJOB>; ;23 TO 30
S <SLEEP,SETPOV,PEEK,GETLIN,RUN,SETUWP,REMAP>; ;31 T0 37
S <GETSEG,GETTAB,SPY,SETNAM,TMPCOR,DSKCHR>; ;40 TO 45
;END OF 4.72 CALLIS
S <SYSSTR,JOBSTR,STRUUO,SYSPHY,FRECHN,DEVTYP>; ;46 TO 53
S <DEVTYP,DEVPPN,SEEK>; ;54 AND 55
;END OF 5.01 CALLIS
S <RTTRP,LOCK,JOBSTS,LOCATE,WHERE,DEVNAM,CTLJOB>; ;56 TO 65
S <GOBSTR,ACTIVA,DEACTI>; ;66 TO 70
;END OF 5.02 CALLIS
S <HPQ,HIBER,WAKE,CHGPPN,SETUUO,DEVGEN,OTHUSR>;;71 TO 77
S <CHKACC,DEVSIZ,DAEMON,JOBPEK,ATTACH,DAEFIN>; ;100 TO 105
S <FRCUUO,DEVLNM>; ;106 TO 107
;END OF 5.03 CALLIS
S <PATH.,METER.,MTCHR.,JBSET.,POKE.,TRMNO.>; ;110 TO 115
S <TRMOP.,RESDV.,UNLOK.>; ;116 TO 120
;END OF 5.04 CALLIS
S <DISK.,DVRST.,DVURS.>
MAXCAL==.-CITAB-1
BTAB: POINT 9,TBL ;TABLE USED TO GET NEXT BYTE POINTER
POINT 9,TBL,8 ;FOR TRANSFER BYTE
POINT 9,TBL,17
POINT 9,TBL,26
;SUBROUTINE TO LOOKUP AN OPCODE IN THE TABLE AND RETURN ITS
; SIXBIT NAME
;ARG: T1=BINARY WORD
;VALUE: N=SIXBIT VALUE
;
; SKIP RETURNS IF VALID OPCODE ELSE JUST POPJ RETURN
;
OPDEC: PUSHJ P,.SAVE2 ;SAVE P1 AND P2
MOVE N,LASTOP ;GET LAST OPCODE
CAMN T1,LASBIN ;IS THIS THE SAME
JRST DCODEX ;YES--GIVE SAME ANSWER
MOVEM T1,LASBIN ;STORE FOR NEXT TIME
MOVEI P1,P2 ;POINT TO OPCODE
MOVE P2,T1 ;PLACE OPCODE SOMEPLACE SAFE
LSH P2,-33 ;JUST WANT OPCODE
CAIE P2,47 ;IS THIS A CALLI?
JRST NTCALL ;NO--LOOK UP IN TBL:
HRREI T1,(T1) ;GET ACT VALUE
CAML T1,[MAXNCI] ;SMALLER THAN MIN.
CAILE T1,MAXCAL ;BIGGER THAN MAX.
JRST NTCALL ;YES--JUST SAY CALLI
MOVE N,CITAB(T1) ;NO--GET REAL NAME
MOVEM N,LASTOP ;REMEMBER THIS FOR NEXT TIME
PJRST .POPJ1 ;RETURN
NTCALL: SETZ N, ;CLEAR ANSWER
MOVE C,[POINT 6,N] ;POINTER TO ANSWER
SETZB T2,T3 ;CLEAR TEMP AC'S
MOVE T4,BTAB ;POINT TO TABLE
DCODE1: ILDB T1,T4 ;GET A BYTE
CAILE T1,40 ;SKIP IF 0-40 (DISPATCH OR STOP CODE)
CAIL T1,74 ;SKIP IF TRANSFER BYTE
SOJGE T2,DCODE1 ;0-40 OR TRANSFER BYTE LOOP FOR
; C(T2) MORE BYTES.
JUMPG T2,DCODE1 ;JUMP IF DISPATCH AND T2 .GT. 0
SUBI T1,40 ;KNOCK DOWN CODE BY 40.
JUMPE T1,DCODEX ;JUMP IF STOP CODE
JUMPG T1,DCODE2 ;JUMP IF LETTER OR TRANSFER
DPB T1,[POINT 5,P1,7];MAKE P1 POINT TO NEXT
TRZ T1,-4 ; GROUP OF BITS IN
AOS T1 ; THE OPCODE FIELD.
DPB T1,[POINT 6,P1,11]
LDB T2,P1 ;GET THE BITS
JRST DCODE1 ;LOOP FOR THIS PART OF OPCODE
DCODE2: HRREI T1,-33(T1) ;TOTAL SUBTRACTED IS NOW 73.
JUMPL T1,DECT ;SO -VE NUMBERS ARE LETTERS.
JUMPG T1,DCODE3 ;AND POSITIVE NUMBERS ARE TRANSFERS.
ILDB T1,T4 ;ZERO(73) IS SPECIAL HACK TO LET US
MOVEI T1,611(T1) ; GET MORE INTO TABLE FOR KI-10.
DCODE3: MOVEI T3,FIR.-1(T1) ;FIR. IS FIRST BYTE WE NEED TO "GOTO"
; SO ALL ADDRESSES ARE KEYED OFF FIR.
IDIVI T3,4 ;9-BIT BYTES. 4 BYTES/WORD.
MOVE T4,BTAB(T4) ;BYTE POINTER TO WHERE WE JUST JRSTED
ADDI T4,(T3) ;ADD IN WORD ADDRESS (OFFSET)
JRST DCODE1 ;LOOP TO LOOK AT THAT BYTE.
DECT: MOVEI T1,73(T1) ;CONVERT BACK TO SIXBIT
IDPB T1,C ;STORE IN N
JRST DCODE1 ;LOOP BACK FOR REST.
DCODEX: MOVEM N,LASTOP ;SAVE FOR NEXT TIME
SKIPE N ;DONE. DID WE STORE ANYTHING?
AOS (P) ;YES--SKIP RETURN
POPJ P, ;NO--PLAIN RETURN
SUBTTL CORE MANAGEMENT SUBROUTINES
;SUBROUTINE TO EXPAND A TABLE
;ARGS T1=WORDS TO GET
; P2=INDEX IN TABLE VECTOR
GETCOR: JUMPE T1,.POPJ ;JUMP IF NO CHANGE
PUSH P,T1 ;SAVE INCREMENT
ADDM T1,LENVEC(P2) ;INCREMENT SIZE OF TABLE
ADDB T1,.JBFF ;AND END OF TABLES
CAMG T1,.JBREL ;SKIP IF MUST EXPAND CORE
JRST GETCR1 ;ALREADY HAVE ENOUGH
CORE T1, ;TRY TO EXPAND CORE
JRST E.NCOR ;CANT GET ENOUGH CORE
GETCR1: CAIN P2,LSTTAB ;SKIP IF NOT LAST TABLE
JRST T1POPJ
MOVE T1,(P) ;RESET INCREMENT
PUSH P,T2
PUSH P,T3
MOVE T2,.JBFF ;T2=NEW LAST ADDRESS OF TABLES
SUB T1,T2 ;T1=-OLD LAST ADDRESS
MOVNS T1 ;T1=OLD LAST ADDRESS
HRLI T1,-1 ;MAKE PUSH DOWN PTR SUITABLE FOR POPS
MOVE T3,TABVEC+1(P2) ;OLD LAST ADDRESS OF NEXT TABLE
GETCR2: POP T1,(T2) ;OLD TO NEW LOCATION
CAIG T3,(T1) ;SKIP IF JUST MOVED FIRST LOC OF TABLE PAST EXPANDED
SOJA T2,GETCR2 ;LOOP TILL DONE
MOVEI T2,1(P2) ;INDEX OF NEXT TABLE
MOVE T1,-2(P) ;RESET INCREMENT
GETCR3: ADDM T1,TABVEC(T2) ;INCREMENT THE START ADDR OF TABLES THAT FOLLOW
CAIE T2,LSTTAB ;SKIP IF INCREMENTED LAST TABLE
AOJA T2,GETCR3 ;LOOP FOR THE REST OF THE TABLES
POP P,T3
POP P,T2
T1POPJ: POP P,T1
POPJ P,
;SUBROUTINE TO CONTRACT A TABLE
;ARGS T1=WORDS TO GIVE BACK
; P2=INDEX IN TABLE VECTOR
GIVCOR: CAMG T1,LENVEC(P2) ;SKIP IF GIVING BACK TOO MUCH
JRST GIVCR1 ;OK
PUSH P,LENVEC(P2) ;SAVE CURRENT LENGTH OF TABLE
MOVEI T1,[ASCIZ .GIVING BACK TOO MUCH CORE .]
PUSHJ P,LSTR
;TYPE HOW MUCH, CURRENT LENGTH
POP P,T1 ;RESTORE LENGTH TO GIVE BACK=CURRENT LENGTH
GIVCR1: JUMPE T1,.POPJ ;EXIT IF NO CHANGE
MOVNS T1 ;T1=MINUS WORDS TO GIVE BACK
ADDM T1,LENVEC(P2) ;DECREMENT LENGTH OF TABLE
ADDM T1,.JBFF ;AND END OF TABLES
CAIN P2,LSTTAB ;SKIP IF NOT LAST TABLE
JRST GIVCRE ;NO SHUFFLING NEEDED
PUSH P,T2
MOVE T2,TABVEC+1(P2) ;START ADDR OF NEXT TABLE
HRLS T2 ;IN BOTH HALVES
ADD T2,T1 ;RIGHT HALF=NEW START ADDR
BLT T2,@.JBFF ;MOVE UP TABLES PAST THIS TABLE
MOVEI T2,1(P2) ;INDEX OF NEXT TABLE
GIVCR2: ADDM T1,TABVEC(T2) ;DECREMENET START ADDR OF REST OF TABLES
CAIE T2,LSTTAB ;SKIP IF DECREMENTED LAST TABLE
AOJA T2,GIVCR2
POP P,T2
GIVCRE: MOVE T1,.JBREL ;TOTAL SIZE OF CORE
SUB T1,.JBFF ;MINUS LENGTH NEEDED
CAIGE T1,4000 ;SKIP IF MORE THAN 2K EXCESS
POPJ P, ;OK, DONT WORRY
MOVNI T1,2000 ;-1K
ADD T1,.JBREL
CORE T1, ;GIVE BACK 1 K
JFCL
.POPJ: POPJ P,
SUBTTL ERRORS
;HERE FOR VARIOUS ERRORS
E.NIMP: MOVE N,VERBN(P1) ;NAME OF VERB
M.FAIN <NOT CODED>
E.NCOR: MOVE N,TABNAM(P2) ;NAME OF TABLE THAT WANTED TO EXPAND
M.FAIN <CANT EXPAND TABLE>
E.EXP: M.FAIL <SYNTAX ERROR>
E.MAX: HRLZ N,T1 ;SET MAXIMUM
M.FAIO <MAX =>
E.NSFI: MOVEI N,(DL)
M.FAIF <CANT FIND INPUT FILE - ERROR CODE=>
E.NSFO: MOVEI N,O.ZER
M.FAIF <CANT ENTER OUTPUT FILE>
E.LKO: MOVE N,T2
M.FAIN <OPEN failure for device>
E.LKL: HRLZ N,T2 ;COPY ERROR CODE
M.FAIO <LOOKUP failure for input device - code>
E.STNU: PUSHJ P,TRDX5 ;TYPE IN RADIX 50
MOVEI T1,[ASCIZ / is a undefined symbol table name
/]
PUSHJ P,.TSTRG##
PJRST .FMSGE##
E.SYMF: M.FAIL <Wrong format for symbol (: must be followed by a symbol)>
E.SYMU: PUSHJ P,TRDX5
TLNE DL,DL.MDL
JRST E.SMDL
MOVEI T1,[ASCIZ / is an undefined symbol
/]
pushj p,.tstrg##
pjrst .fmsge##
e.smdl: movei t1,[asciz / is a multiply defined local
/]
PUSHJ P,.TSTRG##
PJRST .FMSGE##
;SUBROUTINE TO TYPE A RADIX 50 SYMBOL IN CASE WE NEED IT IN AN ERROR
TRDX5: CLRBFI ;PREPARE TO TYPE A ?
PUSH P,T1
MOVEI T1,[ASCIZ /
? /]
PUSHJ P,.TSTRG##
TLO DL,DL.TR5 ;FLAG OUTPUT TO TTY
POP P,T1
PUSHJ P,$LRAD ;LIST THE SYMBOL
TLZ DL,DL.TR5 ;CLEAR THE FLAG
POPJ P, ;RETURN
SUBTTL LISTS
;LIST OF EXTENSIONS TO TRY IF NOT KNOWN
DEFINE DEFSYM(A)<
XLIST
IRP A,<SIXBIT \A\>
LIST>
C.DEX: DEFSYM <DAE,SAV,SHR,HGH,LOW,XPN,DMP>
C.LDEX==.-C.DEX
S.DEX==C.DEX
S.LDEX==C.LDEX
DEFINE TYPXMC(A)<
XLIST
ZZ==0
IRP A,<
IFL ZZ-T.EEND,<
XWD SIXBIT \ A\,T.'A
>
ZZ==ZZ+1
>
LIST>
;CALLED BY TYPXM MACRO - DEFINE DEFAULT INPUT EXTENSIONS
I.DEX: TYPXM
I.LDEX==.-I.DEX
DEFINE TYPXMC(A)<
XLIST
ZZ==0
IRP A,<
IFE ZZ&1,<
DEFINE X(B)<
XWD FND'A,FND'B
>>
IFN ZZ&1,<
X A
>
ZZ==ZZ+1
>
LIST>
TYPVEC: TYPXM
DEFINE MODXMC(A)<
XLIST
ZZ==0
IRP A,<
IFE ZZ&1,<
DEFINE X(B)<
XWD MOD'A,MOD'B>>
IFN ZZ&1,<
X A>
ZZ==ZZ+1>
LIST>
MODADR: MODXM
DEFINE MODXMC(A)<
XLIST
IRP A,<
IFE ^D36-YY*M.S,<
EXP ZZ
ZZ==0
YY==0
>
ZZ==<ZZ_M.S>+M.'A
YY==YY+1
>
LIST>
ZZ==0
YY==0
MODLAL: MODXM
MODXMC (END)
ZZ==<ZZ_<^D36-YY*M.S>>
EXP ZZ
SUBTTL BYTE POINTERS
;BYTE POINTERS
J.Y: POINT J.S,@JUSTAB
M.Y: POINT M.S,@MODTAB
W.Y: POINT W.S,@WIDTAB
TIT.Y: POINT TIT.S,@TITTAB
BYT.Y: POINT 36,@BYTTAB
SUBT.Y: POINT SUBT.S,@SUBTAB
VRBPTR: IOWD VERBL,VERBN
PDL: IOWD PDLEN,PDLIST
DEFINE FORMMC(A)<
ZZ==0
IRP A,<
ZZ==ZZ!<1_<A-1>>>>
FORMMC <11,12,13,14,15>
FORMCH: EXP ZZ
;LITERALS AND VARIABLES
XLIST
LIT:: LIT
LIST
SUBTTL TABLE POINTERS
DEFINE TABLES<
T SYM, ;SYMBOL TABLE
T JUS, ;JUSTIFY KEYS
T MOD, ;MODE KEYS
T WID, ;WIDTH KEYS
T TIT, ;TITLE LINE
T SUB, ;SUBTITLE
T OFF, ;OFFSET LIST
T SYP, ;POINTERS FROM START OF S.T. TO
; A SPECIFIC PROGRAMS S.T.
T SYN, ;NAMES OF PROGRAMS IN S.T.
T SYV, ;LIST OF 1/2 WORD BYTES WHICH GIVE
; INDEX FROM START OF S.T. TO NEXT
; LARGER VALUE.
T OPR, ;OPERATOR STACK
T OPN, ;OPERAND STACK
T BYT, ;BYTE TABLE
>
DEFINE T(A)<
SIXBIT /A'TAB/
>
TABNAM: TABLES
RELOC
DEFINE T(A)<
A'TAB: BLOCK 1
A'NDX==.-TABVEC-1>
ZER:!
TABVEC:!TABLES
LSTTAB==.-TABVEC-1
DEFINE T(A) <
A'LEN: BLOCK 1>
LENVEC:!TABLES
SUBTTL DATA AND STORAGE LOCATIONS
;BLOCK TO GET FILE SPECS FROM SCAN
F.ZER: PHASE 0
%DEV:! BLOCK 1 ;DEVICE NAME IN SIXBIT
%NAM:! BLOCK 1 ;FILE NAME IN SIXBIT
%NAMM:! BLOCK 1 ;MASK WITH A 1 FOR EACH NON WILD BIT
; IN FILE NAME. NOT USED BY DUMP.
%EXT:! BLOCK 1 ;EXTENSION IN LEFT HALF AND EXTENSION
; MASK IN RH
%MOD:! BLOCK 1 ;SWITCH WORD
%MODM:! BLOCK 1 ;MASK FOR SWITCH WORD
%DIR:! BLOCK 2*LN.DRB ;PATH TO FILE. FIRST WORD IS PPN
; THEN PPN MASK. FOLLOWD BY SFD/SFD MASK
; PAIRS.
F.LEN:! ;AMOUNT TO GET FROM SCANS F AREA
FAREA:!
%TYP:! BLOCK 1 ;TYPE OF FILE
FAREAL==.-FAREA ;SIZE OF EXTERNAL F AREA
DEPHASE
;INPUT SPEC
I.ZER:!
I.DEV: BLOCK 1
I.NAM: BLOCK 1
I.NAMM: BLOCK 1
I.EXT: BLOCK 1
I.MOD: BLOCK 1
I.MODM: BLOCK 1
I.DIR: BLOCK 2*LN.DRB
I.TYP: BLOCK 1
;COMPARISON FILE
C.ZER:!
C.DEV: BLOCK 1
C.NAM: BLOCK 1
C.NAMM: BLOCK 1
C.EXT: BLOCK 1
C.MOD: BLOCK 1
C.MODM: BLOCK 1
C.DIR: BLOCK 2*LN.DRB
C.TYP: BLOCK 1
;OUTPUT FILE
O.ZER:!
O.DEV: BLOCK 1
O.NAM: BLOCK 1
O.NAMM: BLOCK 1
O.EXT: BLOCK 1
O.MOD: BLOCK 1
O.MODM: BLOCK 1
O.DIR: BLOCK 2*LN.DRB
O.TYP: BLOCK 1
S.ZER:!
S.DEV: BLOCK 1
S.NAM: BLOCK 1
S.NAMM: BLOCK 1
S.EXT: BLOCK 1
S.MOD: BLOCK 1
S.MODM: BLOCK 1
S.DIR: BLOCK 2*LN.DRB
S.TYP: BLOCK 1
PAREA: BLOCK FAREAL
ADRTMP: BLOCK 1 ;ADDRESS OF WORD IN INPUT FILE
B.OC: BLOCK 3 ;BUFFER HEADER FOR OUTPUT FILE
;THE NEXT 2 WORDS MUST GO TOGETHER
CATBLK: BLOCK 1 ;BEGINNING BLOCK OF CURRENT CATEGORY
CATWRD: BLOCK 1 ;BEGINNING WORD OF CURRENT CATEGORY
CATLEN: BLOCK 1 ;LENGTH OF CURRENT CATEGORY
CATNUM: BLOCK 1 ;CURRENT CATEGORY NUMBER
CURCHR: BLOCK 1 ;CURRENT CHARACTER NUMBER ON LINE
CURIOW: BLOCK 1 ;CURRENT IOWD FOR COMPRESSED FILES
DAECCT: BLOCK 1 ;CURRENT CATEGORY
DAECBK: BLOCK 1 ;CURRENT BLOCK IN DAEMON FILE
DAECWD: BLOCK 1 ;CURRENT WORD IN BLOCK IN DAEMON FILE
DMHEAD: BLOCK 1 ;AOBJN POINTER FOR DUMP MODE INPUT
HGHOFF: BLOCK 1 ;OFFSET FOR HIGH SEGMENT
INCADR: BLOCK 1 ;INCREMENT ADDRESS FOR DUMP
INCPOS: BLOCK 1 ;INCREMENT POSITION
INCSIZ: BLOCK 1 ;INCREMENT SIZE
INPLST: BLOCK 2
IRADIX: BLOCK 1 ;INPUT RADIX
KEYPTR: BLOCK 1 ;POINTER TO LIST OF KEY WORDS FOR JUSTIFY OR MODES
LINNUM: BLOCK 1 ;LINE NUMBER ON CURRENT PAGE
LINPAG: BLOCK 1 ;LINES PER PAGE
LMARGN: BLOCK 1 ;LEFT MARGIN
LOWREL: BLOCK 1 ;LENGTH OF LOW SEGMENT FOR DAEMON CORE CATEGORY
MAGWRD: BLOCK 1 ;MAGTAPE PARAMETERS
OBUF: BLOCK 203
ORADIX: BLOCK 1 ;OUTPUT RADIX
OUTVAL: BLOCK 1 ;VALUE TO BE OUTPUT
PAGLIM: BLOCK 1 ;PAGE LIMIT FOR OUTPUT
PAGNUM: BLOCK 1 ;CURRENT PAGE NUMBER IF COUNTING
PDLIST: BLOCK PDLEN ;PUSH DOWN LIST
POSTMP: BLOCK 1 ;POSITION WORD
RMARGN: BLOCK 1 ;RIGHT MARGIN
;THE FOLLOWING BLOCK MUST STAY TOGETHER
SAVET1: BLOCK 1
SAVET2: BLOCK 1
SAVET3: BLOCK 1
SAVET4: BLOCK 1
SAVEP1: BLOCK 1
SAVEP2: BLOCK 1
SAVEF: BLOCK 1
SAVEM: BLOCK 1
;END BLOCK
SAVADR: BLOCK 1 ;CURRENT ADDRESS FOR DUMP
SAVPOS: BLOCK 1 ;CURRENT POSITION FOR DUMP
SAVSIZ: BLOCK 1 ;CURRENT SIZE FOR DUMP
SBLOCK: BLOCK 1 ;BLOCKS TO SKIP ON INPUT
SFILES: BLOCK 1 ;FILES TO SKIP ON INPUT
SIZTMP: BLOCK 1 ;SIZE WORD
TEMPAD: BLOCK 1
TRMADR: BLOCK 1 ;TERMINATING ADDRESS FOR DUMP
TRMPOS: BLOCK 1 ;TERMINATING SIZE FOR DUMP
WINADR: BLOCK 1 ;ADDRESS OF FIRST WORD IN WINDOW
WINLEN: BLOCK 1
WINLST: BLOCK 2
JOBDAT: BLOCK 200 ;BUFFER FOR FIRST PART OF CORE IMAGE
;5 TEMPS USED TO FILL AND JUSTIFY OUTPUT (ROUTINE OUTPT:)
PADCNT: BLOCK 1
SAVCCH: BLOCK 1
LPAD.Y: BLOCK 1
WIDTMP: BLOCK 1
JUSTMP: BLOCK 1
LPAD: BLOCK 12 ;LIST OF 9-BIT BYTES USED TO REMEMBER HOW
; MANY BLANKS TO PREFIX A MESSAGE WITH SUCH
; THAT THE RESULT IS CENTERED OR RIGHT
; JUSTIFIED.
S2VPTR: BLOCK 1 ;POINTER TO SYMBOL TABLE USED
; WHEN GOING FROM SYMBOL TO VALUE
SYMPTR: BLOCK 1 ;TEMP USED BY SYMBOL TABLE LOGIC
LASBIN: BLOCK 1 ;THE LAST ARGUMENT TO OP DECODER
LASTOP: BLOCK 1 ;THE SYMBOL FOR THAT OPCODE
OLDVAL: BLOCK 4 ;LAST ARGUMERT TO SYMBOL ENCODER
OLDSYM: BLOCK 4 ;THE ANSWER FOR THAT VALUE
SYMOFF: BLOCK 4 ;THE OFFSET FOR THAT VALUE
SAVE4.: BLOCK 1 ;VALUE OF 1
SAVE4$: BLOCK 1 ;VALUE OF $
SAVEXP: BLOCK 1 ;VALUE OF %
PATH: BLOCK 11 ;SFD PATH
EZER=.-1
WINDOW: BLOCK WINSIZ
PATCH:
PAT: BLOCK 20 ;FOR USE WITH DDT
FRECOR::
DMPEND: END DUMP