Trailing-Edge
-
PDP-10 Archives
-
decuslib20-04
-
decus/20-0132/dumpr.mac
There are 2 other files named dumpr.mac in the archive. Click here to see a list.
SUBTTL B. SCHREIBER - UI HIGH ENERGY PHYSICS GROUP
SEARCH JOBDAT,UUOSYM,MACTEN,SCNMAC
.DIREC .XTABM
SALL
;DUMPR VERSION INFORMATION
DMPVER==5 ;VERSION
DMPEDT==26 ;EDIT
DMPMIN==0 ;MINOR VERSION
DMPWHO==0 ;WHO
DEFINE CTITLE (TEXT,MAJVER,VEREDT)
<TITLE 'TEXT'MAJVER(VEREDT)>
CTITLE (<DUMPR - UTILITY FILE DUMPER %>,\DMPVER,\DMPEDT)
LOC .JBVER
%%DUMP==:VRSN. (DMP) ;FOR LINK-EDIT MAP
EXP %%DUMP
;SHOW UNIVERSAL VERSION
%%JOBD==:%%JOBD ;JOBDAT
%%UUOS==:%%UUOS ;UUOSYM
%%MACT==:%%MACT ;MACTEN
%%SCNM==:%%SCNM ;SCNMAC
;REQUEST REST OF LOADING NOW
IF2,< ;ONLY NEED TO REQUEST LOADING IN PASS 2
IFE FT$SEG,< ;IF LOADING RUNNING PART IN LOWSEG
.REQUE REL:HELPER
IFN FT$WLD,<.REQUE REL:WLD7A>
.TEXT \REL:ALCOR/SEG:LOW/SEARCH\
.TEXT \REL:SCN7B/SEG:LOW/SEARCH/EXCLUD:(.SCAN),REL:SCN7B/SEARCH\
>;END IFE FT$SEG
IFN FT$SEG,< ;IF LOADING IT ALL IN HIGH SEGMENT
.REQUE REL:ALCOR
.REQUE REL:SCN7B
IFN FT$WLD,<.REQUE REL:WLD7A>
.REQUE REL:HELPER
>;END IFN FT$SEG
>;END IF2
SUBTTL REVISION HISTORY
COMMENT \
1(1) 11/1/76 BIRTH
1(2) 11/2/76 RECOVER FROM BLOCK TOO LARGE WITH /FORTRA OR
/IREAD(ON DSK).
1(3) 11/4/76 MAKE DISK IREAD MUCH FASTER. WORD COUNTS FOR
NOT /LINRDX:DEC WILL START AT ZERO, RATHER
THAN ONE.
2(4) 11/4/76 IMPLEMENT /MODE:BYTE:N DUMP. ADD CODE FOR
SKIPPING FORTRAN BINARY ON MAGTAPE.
2(5) 11/5/76 IMPLEMENT /MTBUF AND /ERROR
2(6) 11/7/76 MAKE /MODE:ASCII WORK IF NOT /OMIT.
2(7) 11/10/76 MAKE CONTROL CHARACTERS VISIBLE IF/MODE:ASCII/OMIT.
CORRECT BYTE WIDTH COMPUTATION IF /RADIX ALSO.
2(10) 11/11/76 MAKE /DUMP:F:R WORK IF /SUM. CHANGE JRST DUMP$G
TO JRST DUMP.2 AT DUMP$G+7.
2(11) 11/14/76 MISC. CLEANUPS. IMPLEMENT "I" OPTION FOR IFTYP.
2(12) 11/15/76 SKIPE T3 IS REALLY SKIPE T2 AT GMBWID+6. THIS
FIXES PROBLEM WITH /MODE:BYTE DUMPS
2(13) 12/10/76 READ TTY WIDTH IF TTY DUMP AND NO /WIDTH GIVEN.
FEATURE TEST IREAD STUFF WITH FT$PHX. MISC. CODE
CLEANUPS.
3(14) 12/27/76 ADD WILDCARDING UNDER FT$WLD CONDITIONAL
3(15) 1/2/77 FINISH WILDCARDING (SINGLE INPUT SPEC ONLY). IF SPOOLED
OUTPUT AND WILDCARDS, THEN CLOSE AND REOPEN OUTPUT AFTER
EACH FILE. FIX UP EIGHT-BIT ASCII PRINTOUT TO MAKE
ALL CHARACTERS VISIBLE.
3(16) 1/2/77 FIX BUG AT DUMPEF (NO HISEG PRESENT IF FT$WLD=1)
3(17) 1/3/77 MAKE EBCDIC DUMP WORK. ADD /BLOCK TO SPECIFY
# CHARACTERS IN AN EBCDIC RECORD
4(20) 1/5/77 ADD /POSITION SWITCH.
4(21) 1/6/77 MISC. CLEANUPS
4(22) 1/27/77 ADD [DMPIPT INITIAL POSITION OF TAPE IS FILE N REC M]
TO SHOW WHERE THE TAPE IS INITIALLY
4(23) 1/27/77 SHOW FILE/RECORD POSITION ON INPUT ERRORS. DO A
WAIT WHEN ERROR HAPPENS TO MAKE SURE I/O IS OVER
4(24) 2/3/77 MTWAT BEFORE THE TAPOP. IN DMPINI WILL PROBABLY
CURE SOME OF THE PROBLEMS WITH FUNNY FILE AND
RECORD COUNTS.
4(25) 2/13/77 SEE IF DEVICE IS ALSO TTY IF MTA (IE NULL) AND
ZAP DV.MTA IF SO
5(26) 2/18/77 IMPLEMENT /MODE:HALF AND /MODE:SYMBOL
\;END OF HISTORY
SUBTTL ASSEMBLY / ACCUMULATOR DEFINITIONS
;ASSEMBLY DEFINES
ND LN$PDL,^D200 ;PDL SIZE
ND MY$NAM,'DUMPR ' ;MY NAME
ND MY$PFX,'DMP' ;MESSAGE PREFIX
ND LN$ACT,^D50 ;SIZE OF ACTION LIST
ND LN$CMD,^D20 ;SIZE OF BUFFER TO REMEMBER COMMANDS IN
MX$CMD==<LN$CMD*5>-1 ;MAX # CHARS IN COMMAND (LEAVE NULL ON END)
ND LN$TTL,^D30 ;LENGTH OF TITLE BLOCK (.NMUL IN SCAN IS THIS LONG)
ND DF$BFZ,^D1024 ;DEFAULT BUFFERSIZE IF NONE GIVEN
ND FT$SEG,0 ;1 = ALL EXECUTABLE CODE GOES IN HIGH SEGMENT
;0 = ONLY PUT SCAN IN HIGH SEGMENT AND THROW
; IT AWAY WHEN RUNNING
ND FT$OPT,1 ;1 = SCAN SWITCH.INI FOR SWITCHES ALSO
ND FT$PHX,1 ;1 = INCLUDE /IREAD SWITCH (FOR UI PHYSICS)
ND FT$WLD,1 ;1 = ALLOW INPUT WILDCARDING
ND FT$ISD,1 ;1 = INCLUDE INSTRUCTION SET DUMP
TWOSEG
IFN FT$SEG,<RELOC 400000>
IFE FT$SEG,<RELOC 0>
;DEFINE THE ACCUMULATORS
DEFINE AC$ (X)
<X=ZZ
ZZ==ZZ+1
X=X>
ZZ==0
AC$ (F) ;FLAGS
AC$ (T1) ;T1-4 ARE TEMPORARY
AC$ (T2)
AC$ (T3)
AC$ (T4)
AC$ (P1) ;P1-4 ARE PERMANENT AND MUST BE PRESERVED
AC$ (P2)
AC$ (P3)
AC$ (P4)
AC$ (A) ;ACTION LIST POINTER
AC$ (DC) ;LH=DEVCHR LH FOR INPUT DEVICE
;RH=DEVCHR LH FOR OUTPUT DEVICE
AC$ (W) ;AOBJN PTR TO DATA DURING DUMP
AC$ (M) ;CURRENT DUMP MODE INDEX
AC$ (L) ;# WORDS/LINE IN CURRENT DUMP MODE
AC$ (Q) ;# CHARACTER POSITIONS/WORD IN CURRENT DUMP MODE
P=17 ;PUSHDOWN LIST POINTER
C=P4 ;CHARACTER FROM SCAN
N=P3 ;NUMBER OR WORD FROM SCAN
E1=P3 ;USED IN FLOATING POINT OUTPUT
E2=P4 ;DITTO
E3=A ;MORE
E4=DC ;AND MORE
E5=W ;AND THE LAST
SUBTTL FLAG DEFINITIONS
;FLAGS IN LH OF F
DEFINE FLAG$ (FLG)
<FL$'FLG==ZZ
ZZ==ZZ_-1
FL$'FLG==FL$'FLG>
ZZ==(1B0)
FLAG$ (FOR) ;1 = DO FORTRAN INPUT
$FLFOR==(FL$FOR) ;LEFT HANDED VALUE
IFN FT$PHX,<
FLAG$ (PHY) ;1 = DO IREAD (PHYSIX) INPUT
$FLPHY==(FL$PHY) ;LEFT HANDED VALUE
>;END IFN FT$PHX
IFE FT$PHX,<FL$PHY==0> ;DUMMY DEFINITION IF FEATURE TURNED OFF
FLAG$ (SUM) ;1 = /SUMMARY
$FLSUM==(FL$SUM) ;LEFT HANDED VALUE
FLAG$ (TOT) ;1 = /TOTALS
$FLTOT==(FL$TOT) ;LEFT HANDED VALUE
FLAG$ (OMI) ;1 = OMIT LINE NUMBERS (UNFORMATTED DUMP FOR ASCII)
$FLOMI==(FL$OMI) ;LEFT HANDED VALUE
FLAG$ (ITY) ;1 = /IFTYP
$FLITY==(FL$ITY) ;LEFT HANDED VALUE
FLAG$ (IND) ;1 = /INDUSTRY
$FLIND==(FL$IND) ;LEFT HANDED VALUE
FLAG$ (OUT) ;1 = OUTPUT SPEC HAS BEEN ALLOCATED
FLAG$ (NEG) ;1 = CURRENT # IS NEGATIVE IN INTFMT, FLTFMT
FLAG$ (TMP) ;GENERAL TEMPORARY FLAG (NOT SAVED OVER CALLS)
FLAG$ (MNP) ;1 = DOING FILE POSITIONING IN FORTRA/IREAD MODE
FLAG$ (EOT) ;END-OF-TAPE FLAG (2 EOFS IN A ROW)
FLAG$ (OLY) ;1 = THERE IS A /ONLY IN EFFECT
FLAG$ (FL2) ;TEMPORARY FLAG
FLAG$ (OPN) ;1 = OUTPUT FILE IS OPEN
FLAG$ (RDX) ;1 = A /RADIX WAS GIVEN
FLAG$ (IOF) ;FLAG FOR USE IN XCTIO AND BELOW
FLAG$ (ODN) ;OUTPUT HAS BEEN DONE
FL$SCN==FL$FOR!FL$PHY!FL$SUM!FL$TOT!FL$OMI!FL$IND ;FLAGS TO CLEAR AT CLRANS
FL$SCN==FL$SCN!FL$OUT!FL$ITY!FL$RDX
ZZ==1B18 ;OVER TO THE RIGHT HALF
FLAG$ (POS) ;1 = /POSITION SWITCH
;I/O CHANNELS
;0 USED BY HELPER
INPC==1 ;INPUT CHANNEL
OUTC==2 ;OUTPUT CHANNEL
ATSIGN==(1B13) ;I/O SWITCH FLAG FOR OPENIO
;MISCELLANEOUS BITS AND STUFF
$OKDVI==DV.MTA!DV.DIR ;INPUT CAN BE MTA OR DIRECTORY DEVICE
$OKDVO==DV.MTA!DV.DIR!DV.TTY!DV.LPT ;OUTPUT CAN BE ONE OF THESE
CW$ANY==3000 ;FORTRAN BINARY ANY LSCW PATTERN
CW$1O3==1000 ;FORTRAN BINARY LSCW TYPE 1 OR 3 PATTERN
CW$TY3==2000 ;FORTRAN BINARY LSCW TYPE 3 PATTERN
;FLAGS AND BITS FOR SWTCHS MACRO
FS$XXX==FS.NFS!FS.LRG!FS.NUE!FS.VRQ!FS.OBV!FS.NOS!FS.NCM ;BITS USED BY SCAN
;SEE SCNMAC.MAC FOR DESCRIPTION OF ABOVE BITS
FS$XTR==1B17 ;THIS SWITCH CAN TAKE EXTRA ARGUMENTS (/BACKSP:F:R)
FS$NVL==1B16 ;THIS SWITCH NEVER TAKES A VALUE
FS$INP==1B15 ;THIS SWITCH IS INPUT ONLY
FS$OUT==1B14 ;THIS SWITCH IS OUTPUT ONLY
;DEFINE THE FUNCTIONS
FN$END==-2 ;END OF ALL FUNCTIONS -- TERMINATE DUMP
FN$INP==-1 ;ALL FUNCTIONS FOLLOWING THIS ARE INPUT ONLY
DEFINE FUNCTS
<X (<MOD,ONL,DMP,BSP,SKP,REW,RIB>)>
DEFINE X(A)
<IRP A,<FN$'A==ZZ
ZZ==ZZ+1>>
ZZ==1 ;FUNCTIONS GO FROM 1-HIGHEST
FUNCTS ;DEFINE THE FUNCTIONS
;ALL POSITIONING FUNCTIONS MUST BE BETWEEN BSP AND REW
FN$TP1==FN$BSP ;FIRST LEGAL POSITIONING FUNCTION
FN$TPX==FN$REW ;LAST LEGAL POSITIONING FUNCTION
;OPDEFINES
OPDEF CALL [PUSHJ P,] ;SUBROUTINE CALL
SUBTTL ERROR MACRO DEFINITIONS
;ERROR. ($FLGS,$PFX,$MSG)
;
;$FLGS IS THE COMBINITATION OF THE FOLLOWING BITS:
EF$ERR==0 ;ERROR--PREFIX MSG WITH ?, RETURN CONTROL AFTER CALL
EF$FTL==400 ;FATAL ERROR--ABORT AND RESTART
EF$WRN==200 ;WARNING MESSAGE--CONTINUE
EF$INF==100 ;INFORMATIVE MESSAGE--CONTINUE
EF$NCR==40 ;NO FREE CRLF AFTER MESSAGE
DEFINE ETYP ($TYP)
<ZZ==ZZ+1
EF$'$TYP==ZZ>
ZZ==0 ;TYPE CODES ARE FROM 1-37
ETYP (DEC) ;TYPE T1 IN DECIMAL AT END OF MESSAGE
ETYP (OCT) ;TYPE T1 IN OCTAL AT END OF MESSAGE
ETYP (SIX) ;TYPE T1 IN SIXBIT AT END OF MESSAGE
ETYP (PPN) ;TYPE T1 AS A PPN AT END OF MESSAGE
ETYP (STR) ;T1 PTS TO ASCIZ STR TO TYPE AT END OF MESSAGE
ETYP (FIL) ;T1 PTS TO SCAN FILE BLOCK TO TYPE AT END OF MSG
EF$MAX==ZZ ;MAX ERROR TYPE
IFG ZZ-37,<PRINTX ?TOO MANY ERROR TYPES>
;$PFX IS THE 3-LETTER PREFIX FOR THE MESSAGE
;$MSG IS THE MESSAGE ITSELF
NOOP== (CAI) ;DEFINE NO-MEMORY-REFERENCE RIGHT-HAND NOOP
DEFINE ERROR. ($FLGS,$PFX,$MSG)
<CALL EHNDLR
XWD NOOP+<$FLGS>,[''$PFX'',,[ASCIZ @$MSG@ ] ]
>
;WARN. FLGS,PFX,MSG
DEFINE WARN. ($FLGS,$PFX,$MSG)
<ERROR. EF$WRN!$FLGS,$PFX,$MSG>
;INFO. FLGS,PFX,MSG
DEFINE INFO. ($FLGS,$PFX,$MSG)
<ERROR. EF$INF!$FLGS,$PFX,$MSG>
;SAVE$ SAVES DATA ON THE STACK
DEFINE SAVE$ (X)
<XLIST
IRP X,<PUSH P,X>
LIST>
;RESTR$ RESTORES DATA FROM THE STACK
DEFINE RESTR$ (X)
<XLIST
IRP X,<POP P,X>
LIST>
;MACRO TO ALLOCATE STORAGE IN THE LOW SEGMENT DATA BASE
DEFINE U ($NAME,$WORDS<1>)
<$NAME: BLOCK $WORDS>
;STRNG$ (STRING) SENDS STRING TO OUTPUT THROUGH .TSTRG
DEFINE STRNG$ (S)
<MOVEI T1,[ASCIZ \S\]
CALL .TSTRG##>
;ASCIZ$ (STRING) CREATES XLISTED ASCIZ STRING TO KEEP LISTING PRETTY
DEFINE ASCIZ$ (S)
<XLIST
ASCIZ \S\
LIST>
;HIGH$ SWITCHES TO HIGH SEGMENT IF FT$SEG==0
DEFINE HIGH$
<IFE FT$SEG,<IFE CSEG$,<HILOC$==.
CSEG$==-1
RELOC LOLOC$>>
>
;LOW$ SWITCHES TO LOW SEGMENT IF FT$SEG==0
DEFINE LOW$
<IFE FT$SEG,<IFN CSEG$,<LOLOC$==.
CSEG$==0
RELOC HILOC$>>
>
;RELOC$ SETS UP LOLOC$ AND CSEG$ INITIALLY
DEFINE RELOC$
<IFE FT$SEG,<LOLOC$==400000 ;;POINT LOLOC$ AT HIGH SEGMENT
CSEG$== 0>> ;START OUT IN THE LOW SEGMENT (CSEG$=0)
;LIT$ FORCES OUT LITERALS IN CURRENT SEGMENT
DEFINE LIT$
<XLIST
LIT
LIST>
SUBTTL MAIN PROGRAM
RELOC$
;PROGRAM ENTRY POINT
DUMPR: TDZA T1,T1 ;NOT CCL
MOVEI T1,1 ;CCL
MOVEM T1,OFFSET ;SAVE FOR SCAN
IFE FT$SEG,< ;NEED TO SAVE THIS STUFF
SKIPE SAVRUN ;SAVED UUO ARGS?
JRST RUNSVD ;YES
MOVEM .SGNAM,SGNAM
MOVEM .SGPPN,SGPPN
MOVEM .SGDEV,SGDEV
MOVEM .SGLOW,SGLOW
SETOM SAVRUN
RUNSVD:>;END IFE FT$SEG
RESTRT: STORE 17,0,16,0 ;CLEAR ACS
STORE 17,FW$ZER,LW$ZER,0 ;AND STORAGE
RESET ;STOP ALL I/O
SKIPA P,.+1 ;SETUP PDP
INIPDP: IOWD LN$PDL,PDLIST
CALL .RECOR## ;RESET CORE
IFE FT$SEG,<CALL UPSCN> ;MAKE SURE HISEG IS THERE
MOVE T1,ISCNBL ;BLOCK FOR .ISCAN
CALL .ISCAN## ;INIT THE SCANNER
MOVEM T1,ISCNVL ;SAVE FOR LATER
SKIPN OFFSET ;CCL ENTRY?
SKIPE TLDVER ;TOLD WHO I AM?
JRST FILD.0 ;YES
STRNG$ <DUMPR %>
MOVE T1,.JBVER
CALL .TVERW##
CALL .TCRLF##
SETOM TLDVER
FILD.0: CALL SCNCMD ;SCAN A COMMAND
TRZE F,FL$POS ;WAS /POSITION GIVEN?
JRST MTAPOS ;YES--GO DO IT
SETO P1, ;FLAG OUTPUT NOT OPEN YET
FILD.2: CALL OPNINP ;OPEN INPUT FILE
IFN FT$WLD,<JRST FILD.9> ;WILD SAYS ALL DONE
AOSN P1 ;ONLY OPEN OUTPUT FILE FIRST TIME THRU
CALL OPNOUT ;AND OUTPUT FILE
IFE FT$SEG,<CALL DWNSCN> ;RELEASE HISEG WHILE RUNNING
CALL PROCMD ;PROCESS THE COMMAND
IFE FT$SEG,<CALL UPSCN> ;REGET HISEG IF WE LOST IT
CALL INPCLS ;CLOSE INPUT FILE
IFN FT$WLD,<
SKIPG LKWLFL ;ARE WILD FILES POSSIBLE (DTA/DSK)?
SKIPN .WLDFL## ;YES--AND ARE THERE ANY WILD FILES?
JRST FILD.9 ;NO--GO FINISH UP
MOVE T1,ODVNAM ;YES--GET OUTPUT DEVICE NAME
DEVTYP T1, ;SEE IF IT IS SPOOLED
JRST FILD.2 ;ASSUME NOT
TXNN T1,TY.SPL ;IS IT SPOOLED?
JRST FILD.2 ;NO--JUST GO AHEAD
CALL OUTCLS ;YES--MAKE A NEW FILE
CALL OPNOUT ; ...
JRST FILD.2 ;GO TO IT
>;END IFN FT$WLD
FILD.9: CALL OUTCLS ;CLOSE OUTPUT FILE
FILD.X: CALL .RUNCM## ;HANDLE /RUN IF SPECIFIED
SKIPE OFFSET ;EXIT 1, IF CCL ENTRY
CALL .MONRT## ;
JRST RESTRT ;AND RESTART
IFE FT$SEG,<LIT$> ;FORCE OUT LOW SEGMENT LITERALS
SUBTTL SCAN A COMMAND FROM THE USER
HIGH$ ;TO HIGH SEGMENT IF FT$SEG=0
SCNCMD: MOVE T1,TSCNBL ;FOR .TSCAN
CALL .TSCAN## ;SCAN THE COMMAND
IFN FT$OPT,<
MOVE T1,OSCNBL ;GET OSCAN ARG BLOCK
CALL .OSCAN## ;SCAN SWITCH.INI FOR SOME SWITCHES
>;END IFN FT$OPT
IFN FT$WLD,<
MOVEI T1,INPSPC ;SETUP PTR FOR WILD
MOVEM T1,WLDFIR ;...
>;END IFN FT$WLD
TRNN F,FL$POS ;/POSITION?
PJRST CHKCMD ;CHECK COMMAND FOR GOODNESS
POPJ P, ;YES--WILL CHECK GOODNESS LATER
;ARG BLOCK FOR .ISCAN
ISCNBL: XWD 5, .+1
IOWD N$CMDS,CMDLST
XWD OFFSET,MY$PFX
XWD TTINPT,0 ;MY INPUT SO WE CAN REMEMBER CMD
EXP 0
XWD DOPRMP,0
;ARG BLOCK FOR .TSCAN
TSCNBL: XWD 11, .+1
IOWD SWTL,SWTN
XWD SWTD,SWTM
XWD 0,SWTP
EXP -1
XWD CLRANS,CLRFIL
XWD AIN,AOUT
EXP 0
EXP 0
EXP STOSWT
IFN FT$OPT,<
OSCNBL: XWD 4, .+1
IOWD OPSWL,OPSWN
XWD OPSWD,OPSWM
EXP OPSWP
EXP -1
EXP 0
>;END IFN FT$OPT
;SCAN CALLS HERE TO PROMPT WITH T1 NEGATIVE IF CONTINUATION PROMPT
DOPRMP: SKIPL T1 ;FIRST OR CONT?
SKIPA T1,PRMPTM ;FIRST
MOVSI T1,'# ' ;CONTINUATION
PJRST .TSIXN## ;TYPE IT
PRMPTM: XWD MY$PFX,'> ' ;FIRST MSG
CMDLST: EXP MY$NAM ;MY NAME
N$CMDS==.-CMDLST
;SCAN CALLS HERE TO GET COMMAND CHARACTERS FROM TTY
TTINPT: INCHWL C ;GET A CHARACTER
SOSL SCMDCT ;ROOM TO STORE IT?
IDPB C,SCMDBP ;YES
POPJ P, ;RETURN WITH CHARACTER IN C
SUBTTL CHECK COMMAND FOR GOODNESS
CHKCMD: CALL OUTDFL ;DEFAULT OUTPUT SIDE
CALL INPDFL ;AND INPUT SIDE
SKIPG T1,USERDX ;/RADIX SPECIFIED
SKIPA T1,[EXP ^D8] ;NO--USE BASE 8
TLO F,FL$RDX ;REMEMBER /RADIX WAS SEEN FOR "OCTAL" DUMPING
MOVEM T1,USERDX ;...
TLNN F,FL$RDX ;SPECIFY /RADIX/
JRST CHKC.0 ;NO
CAIL T1,2 ;YES--CHECK LEGALITY
CAILE T1,^D16 ;...
ERROR. EF$ERR!EF$DEC,IAR,<ILLEGAL ARG FOR /RADIX - >
LSH T1,-2 ;DIVIDE BY 4
MOVE T1,WRDRDX(T1) ;GET A WIDTH FOR THE WORD
MOVEM T1,USRWID ;SAVE FOR DUMPING
CHKC.0: SKIPG T1,LINRDX ;WAS A LINE # RADIX SPECIFIED?
MOVEI T1,LRXDEC ;NO--DEFAULT
MOVEM T1,LINRDX ;SET IT IN
MOVE T1,IDVNAM ;GET INPUT REAL NAME
TLNE DC,(DV.MTA) ;MTA?
CAME T1,ODVNAM ;SAME DEVICE?
JRST CHKC.1 ;NO--ONWARD
ERROR. EF$SIX!EF$FTL,CUS,<CAN'T USE SAME MTA FOR INPUT AND OUTPUT - >
CHKC.1:
IFN FT$PHX,<
TLC F,FL$FOR!FL$PHY ;CAN'T HAVE /IREAD AND /FORTRAN
TLCN F,FL$FOR!FL$PHY ;SO MAKE SURE NOW
ERROR. EF$FTL,MSE,<MODE SPECIFICATION ERROR - /IREAD + /FORTRAN>
>;END IFN FT$PHX
TLC F,FL$SUM!FL$TOT ;CAN'T HAVE /SUMMARY AND /TOTALS
TLCN F,FL$SUM!FL$TOT
ERROR. EF$FTL,SWE,<SWITCH ERROR - /SUMMARY + /TOTALS>
POPJ P, ;COMMAND IS SANCTIFIED
WRDRDX: EXP ^D37 ;BASE 2
EXP ^D19 ;BASE 4
EXP ^D13 ;BASE 8
EXP ^D13 ;DUMMY
EXP ^D10 ;BASE 16
;DEFAULT INPUT SPECS
INPDFL: SKIPN T1,INPSPC+.FXDEV;DEFAULT DEVICE
MOVSI T1,'DSK' ;IS DSK
MOVEM T1,INPSPC+.FXDEV
DEVNAM T1, ;SEE WHO IT IS
JRST ILLIDV
MOVEM T1,IDVNAM
DEVCHR T1, ;GET BITS
TLNN T1,($OKDVI) ;CAN I USE IT?
JRST ILLIDV ;NO
HLL DC,T1 ;YES--SAVE DEVCHR BITS
TLNE DC,(DV.MTA) ;IS DEVICE A MAGTAPE?
JRST INPD.1 ;YES--CLEAR FILENAME AND EXTENSION
TLZE F,FL$IND ;NO--CLEAR /INDUSTRY IF GIVEN
WARN. 0,IND,</INDUSTRY NO-OP ON NON-MTA DEVICE>
MOVE T1,[SIXBIT /DUMPIT/] ;DEFAULT NAME
SETO T2,
SKIPN INPSPC+.FXNAM
MOVEM T2,INPSPC+.FXNMM
SKIPN INPSPC+.FXNAM
MOVEM T1,INPSPC+.FXNAM
HRLOI T1,'DAT' ;AND EXTENSION
MOVX T2,FX.NUL ;GET NULL EXTENSION BIT
TDNE T2,INPSPC+.FXMOD;WAS ANYTHING SET FOR EXTENSION?
MOVEM T1,INPSPC+.FXEXT;NO--USE A DEFAULT
POPJ P,
;HERE IF DEVICE SEEMS TO BE A MAGTAPE
INPD.1: TLNE DC,(DV.TTY) ;SEE IF IT IS ALSO A TTY (IE NUL:)
TLZ DC,(DV.MTA) ;YES--MAKE SURE WE DON'T TO MAGTAPE OPS
SETZM INPSPC+.FXNAM ;CLEAR NAME
SETZM INPSPC+.FXNMM ;AND MASK
SETZM INPSPC+.FXEXT ;AND EXTENSION
SETZM INPSPC+.FXDIR ;AND DIRECTORY
POPJ P, ;DONE
ILLODV: SKIPA T1,[EXP OUTSPC] ;ILLEGAL OUTPUT DEVICE
ILLIDV: MOVEI T1,INPSPC ;ILLEGAL INPUT DEVICE
ERROR. EF$FTL!EF$FIL,IDV,<ILLEGAL DEVICE >
;HERE TO DEFAULT OUTPUT SPECIFICATION
OUTDFL: MOVX T2,FX.NDV ;NULL DEVICE FLAG
TDNN T2,OUTSPC+.FXMOD;WAS IT REALLY A NULL DEVICE?
SKIPN T1,OUTSPC+.FXDEV;NO--PICK UP DEVICE IF GIVEN
MOVSI T1,'LPT' ;YES--USE DEFAULT
MOVEM T1,OUTSPC+.FXDEV
DEVNAM T1, ;SEE WHO IT REALLY IS
JRST ILLODV ;NOT ONE I KNOW
MOVEM T1,ODVNAM ;SAVE REAL NAME
DEVCHR T1, ;SEE WHAT SORT OF DEVICE IT IS
TLNN T1,($OKDVO) ;A DEVICE I LIKE?
JRST ILLODV ;NO
HLR DC,T1 ;SAVE DEVICE CHARACTERISTICS
MOVE T1,[SIXBIT /DUMPED/] ;DEFAULT FILENAME
SETO T2, ;AND MASK
SKIPN OUTSPC+.FXNAM ;NAME GIVEN?
MOVEM T2,OUTSPC+.FXNMM;NO--USE MY DEFAULT
SKIPN OUTSPC+.FXNAM
MOVEM T1,OUTSPC+.FXNAM
HRLOI T1,'LPT' ;FINALLY THE EXTENSION
SKIPN OUTSPC+.FXEXT
MOVEM T1,OUTSPC+.FXEXT
POPJ P,
SUBTTL SWITCH TABLE
DEFINE SWTCHS,<
SP *BACKSP,FN$BSP,.SWDEC##,MTN,FS$XTR!FS.VRQ
SP BLOCK,S.BLKF,.SWDEC##,BKF,FS.NUE
SP BUFSIZ,BUFSIZ,.SWDEC##,BFZ,FS.NUE
SP *DUMP,FN$DMP,.SWDEC##,MTN,FS$XTR!FS$INP!FS.VRQ
SL *ERROR,FLERR,ERR,ERRCON,FS.NUE
SS *FORTRA,<POINTR(F,$FLFOR)>,1,FS.NUE
SS IFTYP,<POINTR(F,$FLITY)>,1,FS.NUE
SS INDUST,<POINTR(F,$FLIND)>,1,FS$INP!FS.NUE
IFN FT$PHX,<SS *IREAD,<POINTR(F,$FLPHY)>,1,FS$INP!FS.NUE>
SL LINRDX,LINRDX,LRX,LRXDEC,FS.NUE
SL *MODE,FN$MOD,MOD,MODOCT,FS$XTR!FS$OUT
SP MTBUF,NMTBUF,.SWDEC##,MBF,FS.NUE
SS *NORETR,FLNTRY,1,FS$INP!FS.NUE
SS OMIT,<POINTR(F,$FLOMI)>,1,FS$OUT!FS.NUE
SP *ONLY,FN$ONL,.SWDEC##,ONL,FS$XTR!FS$INP
SS *POSIT,<POINTR(F,FL$POS)>,1,FS.NUE
SP RADIX,USERDX,.SWDEC##,RDX,FS$OUT!FS.NUE
SS *REWIND,FN$REW,FN$REW,FS$NVL
SS RIB,FN$RIB,FN$RIB,FS$NVL
SP *SKIP,FN$SKP,.SWDEC##,MTN,FS$XTR!FS.VRQ
SS SUMMAR,<POINTR(F,$FLSUM)>,1,FS$OUT!FS.NUE
SP TITLE,<POINT ^D65-LN$TTL,TITLEB>,.SWASQ##,,FS.NUE
SS *TOTALS,<POINTR(F,$FLTOT)>,1,FS$OUT!FS.NUE
SP *WIDTH,FLWIDT,.SWDEC##,WID,FS$OUT!FS.NUE
>
DM (BFZ,^D4096,^D2048,^D1024)
DM (BKF,177777,^D80,^D80)
DM (MBF,^D10,^D3,^D3)
DM (MTN,177777,177777,177777)
DM (ONL,177777,0,0)
DM (RDX,^D16,^D8,^D8)
DM (WID,^D132,^D80,^D80)
KEYS (ERR,<CONTIN,IGNORE,QUERY>)
KEYS (MOD,<ASCII,BYTE,EBCDIC,FLOAT,HALF,HEX,INTEGE,OCTAL,SIXBIT,SYMBOL>)
KEYS (LRX,<DECIMA,HEX,OCTAL>)
;NOW EXPAND THE SWITCH TABLE
DOSCAN (SWT)
SUBTTL SWITCH TABLE FOR OPTION SCAN
IFN FT$OPT,<
DEFINE SWTCHS,<
SP BUFSIZ,BUFSIZ,.SWDEC##,BFZ,FS.NUE
SL ERROR,FLERR,ERR,ERRCON,FS.NUE
SS IFTYP,<POINTR(F,$FLITY)>,1,FS.NUE
SL LINRDX,LINRDX,LRX,LRXDEC,FS.NUE
SP MTBUF,NMTBUF,.SWDEC##,MBF,FS.NUE
SP WIDTH,FLWIDT,.SWDEC##,WID,FS.NUE
>
DOSCAN (OPSW)
>;END IFN FT$OPT
SUBTTL COMMAND SCANNING SUBROUTINES
AIN:
SKIPE INPSPC+.FXDEV ;ALREADY BEEN HERE?
ERROR. EF$FTL,MIS,<MULTIPLE INPUT SPECIFICATIONS ILLEGAL>
SKIPN DUMPFL ;SEEN A /DUMP?
CALL HOLDMP ;NO--SET TO DUMP ENTIRE WHATEVER
HRROI T1,FN$END ;SEND END OF LIST
CALL PUTACT ;...
MOVEI T1,INPSPC ;GET ADDRESS
ALEN: MOVEI T2,.FXLEN ;AND SIZE
POPJ P,
AOUT:
SKIPE OUTSPC+.FXDEV ;BEEN HERE?
ERROR. EF$FTL,MOF,<MULTIPLE OUTPUT FILES ILLEGAL>
HRROI T1,FN$INP ;SET END OF OUTPUT FUNCTIONS
CALL PUTACT ;SEND TO LIST
TLO F,FL$OUT ;SET OUTPUT SPEC ALLOCATED
MOVEI T1,OUTSPC
PJRST ALEN
;SCAN CALLS HERE TO CLEAR ALL ANSWERS
CLRANS: SKIPA A,.+1 ;LOAD UP ACTION PTR
INIACT: IOWD LN$ACT,ACTLST
TLZ F,FL$SCN ;CLEAR SCAN FLAGS IN F
STORE T1,SCN$FZ,SCN$LZ,0 ;CLEAR WHAT SHOULD BE ZERO
STORE T1,SCN$FO,SCN$LO,-1 ;MINUS 1 WHAT SHOULD BE MINUS 1
MOVE T1,[POINT 7,CMDBFR] ;INIT PTR TO STORE COMMAND
MOVEM T1,SCMDBP ;...
MOVEI T1,MX$CMD ;AND COUNTER
MOVEM T1,SCMDCT ;...
POPJ P,
;SCAN CALLS HERE TO CLEAR FILE ANSWERS
CLRFIL:
POPJ P,
;CALL TO DUMP WHOLE TAPE
HOLDMP: MOVEI T1,FN$DMP ;FUNCTION
HRLOI T2,777777 ;A RIDICULOUSLY LARGE FILE/RECORD COUNT
;(USE NEG. # SO IF DSK INPUT WE KNOW
; NO /DUMP AND THEN DUMP WHOLE FILE)
PJRST PUTACT ;STOW AWAY AND RETURN
SUBTTL STORE SWITCHES
;SCAN CALLS HERE TO STORE SOME SWITCHES
;N=VALUE, T2=PTR (FN$XXX), T3=FLAGS (FS$XXX), P1=SWITCH INDEX
STOSWT: TLNN T3,(FS$OUT) ;OUTPUT ONLY?
JRST STOSWA ;NO
TLNE F,FL$OUT ;YES--OUTPUT ALLOCATED?
JRST E$$OSI ;NO--BOMB
STOSWA: TLNN T3,(FS$INP) ;INPUT ONLY?
JRST STOSWB ;NO
TLNN F,FL$OUT ;YES--OUTPUT ALLOCATED?
JRST E$$ISO ;NO--BOMB
STOSWB: TLNE T3,(FS$NVL) ;NEVER TAKE A VALUE?
JRST SWTST0 ;YES--THATS CORRECT
CAIN T2,FN$MOD ;THIS /MODE?
JRST STOMOD ;YES--DO DIFFERENTLY
TLNE T3,(FS$XTR) ;TAKE EXTRA ARGS?
CAIE C,":" ;YES--ARE THEY THERE?
JRST SWTST0 ;NO--JUST STORE
SAVE$ <N,T2> ;YES--SAVE VALUE, AND FUNCTION
CALL .DECNW## ;READ SECOND VALUE
RESTR$ <T1,T2> ;GET FUNCTION AND VALUE IN RIGHT ACS
MOVSS T2 ;POSITION FILE COUNT IN LH
HRR T2,N ;AND RECORD COUNT IN RH
PJRST PUTACT ;PUT ON ACTION LIST AND RETURN
SWTS0A: MOVEI N,1 ;NEVER TAKES A VALUE,MAKE SURE IT GETS DONE 1 X
SWTST0: MOVE T1,T2 ;POSITION FUNCTION
HRRZ T2,N ;AND VALUE
; PJRST PUTACT ;STORE PARAMS AND RETURN
;PUTACT -- STORE PARAMETERS IN ACTION LIST
;CALL: MOVE T1,<FUNCTION>
; MOVE T2,<VALUE>
; CALL PUTACT
PUTACT: PUSH A,T1 ;STORE FUNCTION
PUSH A,T2 ;AND VALUE
CAIN T1,FN$DMP ;THIS THE /DUMP?
SETOM DUMPFL ;YES--SAY WE HAVE ONE
POPJ P,
STOMOD: CAIE N,MODBYT ;/MODE:BYTE?
JRST SWTST0 ;NO--DO NORMALLY
CAIE C,":" ;MUST HAVE A VALUE
ERROR. EF$FTL,BRB,</BYTE REQUIRES BYTESIZE>
SAVE$ <N,T2> ;SAVE MODBYT, FN$MOD
CALL .DECNW## ;READ BYTESIZE
RESTR$ <T1,T2> ;FN$MOD IN T1, MODBYT IN T2
CAILE N,0 ;CAN'T VERY WELL HAVE NEGATIVE BYTE SIZES
CAILE N,^D36 ;OR GREATR THAN ONE WORD
JRST E$$IBS ;SO TELL HIM ITS ILLEGAL AND QUIT
HRL T2,N ;PUT BYTESIZE IN LH
PJRST PUTACT ;SET ON ACTION LIST AND RETURN
E$$IBS: MOVE T1,N ;POSITION TO TELL USER WHAT IS ILLEGAL
ERROR. EF$FTL!EF$DEC,IBS,<ILLEGAL BYTE SIZE - >
E$$OSI: MOVE T1,SWTN(P1) ;OUTPUT SWITCH ON INPUT SIDE
ERROR. EF$FTL!EF$SIX,OSI,<OUTPUT SWITCH ILLEGAL ON INPUT - >
E$$ISO: MOVE T1,SWTN(P1) ;INPUT SWITCH ON OUTPUT SIDE
ERROR. EF$FTL!EF$SIX,ISO,<INPUT SWITCH ILLEGAL ON OUTPUT - >
SUBTTL DO /POSITION SWITCH
MTAPOS: CALL CKPOSC ;CHECK FOR ILLEGAL FUNCTIONS, NEVER RETURN IFSO
MOVE T1,INPSPC+.FXDEV;GET INPUT NAME
DEVCHR T1, ;SEE WHAT IT IS
TXNN T1,DV.MTA ;IS IT A MAGTAPE?
JRST ILLIDV ;NO--GO QUIT NOW
CALL INWLDO ;OPEN THE UNIT
JRST RESTRT ;SNH
CALL MNPXCI ;DO MTA MANIPULATIONS
CALL INPCLS ;CLOSE INPUT
JRST FILD.X ;GO DO RUN COMMAND, EXIT 1, OR RESTRT
;ROUTINE TO CHECK FUNCTION LIST FOR BADDIES
CKPOSC: MOVEI T1,ACTLST ;POINT AT THE LIST
CKPS.1: HRRZ T2,(T1) ;GET A FUNC
ADDI T1,2 ;MOVE TO NEXT FUNCTION
CAIN T2,FN$END ;IS THIS THE END?
POPJ P, ;YES
MOVSI T3,-N$MTAF ;SETUP AOBJN
CAME T2,LGLMTF(T3) ;IS THIS IT?
AOBJN T3,.-1 ;NO--CHECK ALL
JUMPL T3,CKPS.1 ;GO CHECK NEXT IF THIS ONE OK
ERROR. EF$FTL,IPF,<ILLEGAL POSITIONING FUNCTION>
;TABLE OF LEGAL POSITIONING FUNCTIONS
LGLMTF: EXP FN$BSP,FN$SKP,FN$REW,FN$DMP ;FN$DMP IS IGNORED LATER
N$MTAF==.-LGLMTF
;ROUTINE TO WHIP THROUGH ACTLST AND EXECUTE MTA FILE POSITIONING ONLY
;THE LIST MUST CONTAIN ONLY FILE POSITIONING COMMANDS AND FN$END
MNPXCI: CALL .SAVE4## ;PRESERVE 4 REGISTERS
MOVEI P1,(Z INPC,) ;SETUP THE CHANNEL
MOVEI P2,ACTLST ;POINT AT THE LIST
MNPX.2: HRRZ T1,(P2) ;GET NEXT THING
CAIN T1,FN$END ;IS THIS THE END?
POPJ P, ;YES--ALL DONE
HLRZ P3,1(P2) ;GET POSSIBLE FILE COUNT
HRRZ P4,1(P2) ;AND POSSIBLE RECORD COUNT
ADDI P2,2 ;MOVE TO NEXT THING
JRST @MNPDSP-FN$BSP(T1) ;DISPATCH
EXP MNPX.2 ;IGNORE /DUMP
MNPDSP: EXP MNP.BS
EXP MNP.SK
EXP MNP.RW
MNP.RW: MOVE T1,[MTREW.] ;SETUP FUNCTION TO EXECUTE
SETZ T3, ;CLEAR COUNT
MNPXDG: CALL MNP.XX ;DO THE REWIND
JRST MNPX.2 ;GO GET NEXT THING
;GET HERE WITH T1 HAVING MTAPE TO DO (MINUS CHAN), AND T3=# TIMES TO DO IT
MNP.XX: TLO T1,(P1) ;SETUP THE CHANNEL
XCT T1 ;DO IT ONE TIME
SOJG T3,.-1 ;DO IT ALL WE NEED TO
POPJ P,
MNP.SK:
MNP.BS: SKIPLE P4 ;ANY RECORDS TO DO?
PUSH P,[EXP <MTBSR.>,<MTSKR.>]-FN$BSP(T1) ;YES--SETUP FOR IT
SKIPLE P3 ;ANY FILES TO DO?
PUSH P,[EXP <MTBSF.>,<MTSKF.>]-FN$BSP(T1) ;YES--
MNP.BF: SKIPG T3,P3 ;CHECK/PICKUP FILE ACTION
JRST MNP.B1 ;NO--CHECK RECORD ACTION
POP P,T1 ;YES--GET MTAPE
CALL MNP.XX ;DO IT
MNP.B1: SKIPG T3,P4 ;CHECK/PICKUP RECORD ACTION
JRST MNPX.2 ;NO--GET NEXT THING
POP P,T1 ;YES--GET MTAPE
JRST MNPXDG ;GO DO IT AND LOOP FOR MORE ACTION
SUBTTL WILD CARD HANDLING FOR INPUT FILE
IFN FT$WLD,<
;ROUTINE TO CALL .LKWLD AND OPEN/LOOKUP THE FILE PRESENTED
;CPOPJ IF NO FILE FOUND
;CPOPJ1 IF OPENED OK
INWLDO: MOVE T1,[XWD SVINOB,OPNBLK] ;RESET OPNBLK IN CASE NOT FIRST TIME
BLT T1,OPNBLK+.OPBUF
INWL.1: MOVE T1,LKWLDB ;GET THE ARG BLOCK
CALL .LKWLD## ;FIND A FILE TO DO
POPJ P, ;CAN'T FIND ANYTHING
MOVEM T2,LKWLFL ;SAVE FLAG FOR LATER (IN CASE MTA)
MOVEI T1,.IOBIN ;USE BINARY MODE
HRRM T1,OPNBLK+.OPMOD
MOVEI T1,IBHR ;SETUP MY BUFFER HEADER ADDRESS
MOVEM T1,OPNBLK+.OPBUF
OPEN INPC,OPNBLK ;OPEN THE DEVICE
JRST [CALL E.DFO## ;REPORT OPEN ERROR
JRST INWL.1] ;KEEP GOING TILL .LKWLD SAYS DONE
SKIPLE LKWLFL ;DO WE NEED TO DO A LOOKUP?
JRST $POPJ1 ;NO--THEN WHY BOTHER (NOT DIR DEVICE)
LOOKUP INPC,LKPBLK ;FIND THE FILE
JRST [CALL E.DFL## ;REPORT ERROR
JRST INWL.1] ;AND KEEP LOOKING
SKIPG INPSPC+.FXFLM ;ENSURE .FXFLM IS RIGHT
SETOM INPSPC+.FXFLM ;SO .CHKTM WILL WORK WRIGHT
CALL .CHKTM## ;CHECK DATE/TIME CONSTRAINTS
JRST INWL.1 ;FAILED--GET NEXT FILE
JRST $POPJ1 ;OK--SKIP BACK WITH THE FILE
LKWLDB: XWD 5,.+1
XWD WLDFIR,0
XWD OPNBLK,LKPBLK
XWD .FXLEN,.RBTIM+1
EXP 1B0+WLDPTR
EXP 0
>;END IFN FT$WLD
IFE FT$SEG,<LIT$>
LOW$ ;TO LOW SEGMENT IF FT$SEG=0
SUBTTL HIGH SEGMENT HANDLERS
IFE FT$SEG,< ;NOT NECESSARY IF LOAD ALL IN HIGH SEGMENT
;CALL DWNSCN TO REMOVE HIGH SEGMENT
DWNSCN: SKIPN .JBHRL ;SEG AROUND?
POPJ P, ;NO--DON'T DO CORE UUO NOW
SAVE$ T1 ;PRESERVE T1
MOVSI T1,1 ;YES--GET RID OF IT
CORE T1, ;BYE/!
JFCL ;SNH
JRST TPOPJ ;RESTORE T1 AND RETURN
;CALL UPSCN TO REGET THE HIGH SEGMENT
UPSCN: SKIPE .JBHRL ;SCAN AROUND?
POPJ P, ;YES--SKIP COSTLY GETSEG
MOVEM 17,SAVAC+17 ;GETSEG DESTROYS ACS
MOVEI 17,SAVAC
BLT 17,SAVAC+16 ;SAVE ALL
SEGAGN: MOVE T1,SGDEV ;SETUP FOR GETSEG
MOVE T2,SGNAM
MOVE T3,SGLOW
SETZB T4,P2
MOVE P1,SGPPN
MOVEI P3,T1 ;POINT AT THE BLOCK
GETSEG P3,
SKIPA T1,P3 ;FAILED!--GET ERROR CODE IN T1
JRST [MOVSI 17,SAVAC
BLT 17,17
POPJ P,]
MOVE P,INIPDP ;RESET PDP (WILL GET RESTORED IF WE GET SEG)
ERROR. EF$OCT!EF$ERR,CGH,<CAN'T GET HIGH SEGMENT, CODE = >
EXIT 1,
JRST SEGAGN ;MAYBE IT WAS JUST LOST?
>;END IFE FT$SEG
SUBTTL OPEN FILES
;CALL HERE TO OPEN INPUT FILE
;ALWAYS RETURN CPOPJ IF FT$WLD=0
;IF FT$WLD=1, IF NO FILE FOUND RETURN CPOPJ, ELSE RETURN CPOPJ1 WITH GOODIES
OPNINP:
IFE FT$WLD,<
MOVEI T1,INPSPC ;POINT AT THE SPEC
CALL OPENIO ;OPEN THE DEVICE (LOOKUP FILE IF NEEDED)
CAI INPC,IBHR(.IOBIN) ;
>;END IFE FT$WLD
IFN FT$WLD,<
CALL INWLDO ;OPEN INPUT FILE
POPJ P, ;CAN'T FIND ANY--ALL DONE
AOS (P) ;SETUP TO SKIP BACK--WE HAVE A FILE
>;END IFN FT$WLD
MOVS T1,[XWD SVINOB,OPNBLK] ;SETUP TO SAVE OPEN/LOOKUP BLOCK
BLT T1,SVINLK+.RBTIM;COPY IT OVER
MOVE T1,LKPBLK+.RBSIZ;GET SIZE OF FILE IN WORDS
LSH T1,-7 ;CVT TO BLOCKS
AOJ T1, ;...
MOVEM T1,IFILSZ ;SAVE FOR LATER (POSITIONING)
OPNI.A: TLNN DC,(DV.MTA) ;INPUT MTA?
JRST OPNI.1 ;NO
CALL .SAVE3## ;YES--SAVE REGISTERS
MOVEI P1,INPSPC ;POINT AT SPEC
MOVEI P2,INPC ;AND CHANNEL
MOVEI P3,INPC ;FOR MTCHR
MTCHR. P3,
SETZ P3, ;SNH
CALL SETCHR ;SET /DENSITY AND /PARITY
TLNE F,FL$IND ;/INDUSTRY?
MTIND. INPC, ;YES--SETUP FOR IT
SKIPLE FLNTRY ;/NORETRY?
JRST [GETSTS INPC,T1 ;YES--GET STATUS
SETSTS INPC,IO.NRC(T1) ;SET NO RETRY
JRST .+1]
OPNI.1: SKIPG T1,BUFSIZ ;/BUFSIZ GIVEN?
MOVEI T1,DF$BFZ ;NO--USE A K
MOVEM T1,BUFSIZ ;SET IN CASE WE DEFAULTED
;NOTE THAT .ALCBF WILL ADJUST BUFFER
;TO 128. FOR DSK OR 127. FOR DTA
HRLI T1,6 ;ASSUME DISK INPUT
TLNN DC,(DV.MTA) ;BUT SEE IF MAGTAPE
JRST OPNI.2 ;NO--SIX IS RIGHT
SKIPG T2,NMTBUF ;DID USER SPECIFY /MTBUF?
MOVEI T2,2 ;NO--USE 2
HRLI T1,(T2) ;SET CORRECT BUFFER COUNT
OPNI.2: SKIPA T2,.+1 ;OTHER ALCBUF ARGWORD
XWD OPNBLK,IBHR
CALL .ALCBF## ;SETUP BUFFERS
TLNN DC,(DV.MTA) ;DSK OR DTA INPUT?
TLNN F,FL$FOR!FL$PHY ;AND /IREAD OR /FORTRAN?
TLNE F,FL$FOR ;BUT IF /FORTRAN ON TAPE
SKIPA T1,BUFSIZ ;YES--NEED TO ALLOCATE FORBUF
POPJ P, ;NO--WE ARE DONE
CALL .ALCOR## ;ALLOCATE FORTRA/IREAD BUFFER
MOVEM T1,FORADR ;SAVE FOR LATER USAGE
POPJ P,
;COME HERE TO CLOSE INPUT DEVICE
INPCLS: CLOSE INPC,
RELEASE INPC,
SKIPE T1,FORADR ;WAS THERE A FORTRA/IREAD ARRAY?
CALL .DECOR## ;YES--MAKE IT GO AWAY
SETZM FORADR ;CLEAR IN CASE
MOVEI T1,IBHR
; PJRST TSTBHR ;FREE UP BUFFERS
;HERE TO FREE BUFFERS IF THEY WERE ALLOCATED
TSTBHR: SKIPN .BFADR(T1) ;USED?
POPJ P, ;NO--QUIT NOW
SAVE$ T1 ;SAVE ADDRESS
CALL .FREBF## ;FREE BUFFERS
RESTR$ T1 ;RESTORE ADDRESS
SETZM .BFADR(T1)
SETZM .BFPTR(T1)
SETZM .BFCTR(T1)
POPJ P,
;HERE TO CLOSE OUTPUT FILE
OUTCLS: TLZE F,FL$ODN ;WAS ANY OUTPUT DONE?
TDZA T1,T1 ;YES--PRESERVE THE FILE
MOVEI T1,CL.RST ;NO--MAKE FILE DISSAPPEAR
CLOSE OUTC,(T1) ;FINISH WRITING THE FILE
RELEASE OUTC,
TLZ F,FL$OPN ;NOT OPEN NOW
MOVEI T1,OBHR
PJRST TSTBHR
;HERE TO OPEN OUTPUT FILE
OPNOUT: MOVEI T1,OUTSPC ;SETUP
CALL OPENIO ;DO IT
CAI OUTC,@OBHR(.IOASC)
TRNE DC,(DV.MTA) ;IS OUTPUT DEVICE MTA?
JRST OPNO.1 ;NO
CALL .SAVE3## ;YES--SAVE P1-3
MOVEI P1,OUTSPC
MOVEI P2,OUTC
MOVEI P3,OUTC
MTCHR. P3,
SETZ P3, ;...SNH
CALL SETCHR ;SET /DENSITY AND /PARITY
OPNO.1: MOVSI T1,6 ;USE 6 BUFFERS
TRNE DC,(DV.MTA) ;UNLESS MTA
MOVSI T1,2 ;IN WHICH CASE USE 2
SKIPA T2,.+1 ;
XWD OPNBLK,OBHR
CALL .ALCBF##
OUTPUT OUTC, ;DO DUMMY OUTPUT
TLO F,FL$OPN ;OUTPUT FILE IS OPEN FOR BUSINESS
TLZ F,FL$ODN ;NO OUTPUT DONE YET, THO
POPJ P,
SUBTTL SET MAGTAPE CHARACTERISTICS
;SETCHR -- SET TAPE CHARACTERISTICS
;CALL: MOVEI P1,<SPEC ADDR>
; MOVEI P2,<CHANNEL>
; MOVE P3,<AC RESULT OF MTCHR. UUO>
; CALL SETCHR
; *RETURN*
SETCHR: LDB T1,[POINTR (.FXMOD(P1),FX.DEN)] ;GET /DENSITY: VALUE
JUMPE T1,SETC.1 ;JUMP IF NONE
XCT SETDEN(T1) ;SET THE DENSITY
MOVE T1,[XWD 3,T2] ;TAPOP. ARG
MOVEI T2,.TFDEN+.TFSET;FUNCTION
MOVE T3,P2 ;CHANNEL
CALL DOTPOP ;DO TAPOP.
SETC.1: LDB T1,[POINTR(.FXMOD(P2),FX.PAR)] ;/PARITY: VALUE
XCT SETPAR(T1) ;SET THE PARITY
POPJ P,
SETDEN: JFCL ;SNH
CALL DEN200 ;200 BPI
CALL DEN556 ;556 BPI
MOVEI T4,.TFD80 ;800 BPI
CALL DEN160 ;1600 BPI
CALL DEN625 ;6250 BPI
MOVE T4,T1 ;(6)
MOVE T4,T1 ;(7)
DEN556:
DEN200: TRNN P3,MT.7TR ;MUST BE 7 TRACK
E$$ID9: ERROR. EF$FTL,ID9,<ILLEGAL DENSITY FOR 9-TRACK>
MOVE T4,T1 ;SETUP DENSITY
POPJ P,
DEN625:
DEN160: TRNE P3,MT.7TR ;CAN'T BE 7 TRACK
E$$ID7: ERROR. EF$FTL,ID7,<ILLEGAL DENSITY FOR 7-TRACK>
MOVE T4,T1
POPJ P,
SETPAR: JFCL ;ODD IS THE DEFAULT
CALL EVNPAR ;SET EVEN
EVNPAR: MOVE T1,[XWD 3,T2] ;ARGWORD
MOVEI T2,.TFPAR+.TFSET;FUNCTION
MOVE T3,P2 ;CHANNEL
MOVEI T4,1 ;EVEN PARITY
; PJRST DOTPOP ;DO AND RETURN
;FALL THROUGH TO DOTPOP
;DOTPOP -- DO A TAPOP WITH ERROR REPORTING
;CALL: MOVE T1,[ARGBLOCK]
; MOVEI T2,<FUNCTION>
; MOVE T3,<TAPNAM,IOCHAN, OR SOMETHING JUST AS GOOD>
; MOVE T4,<ARG>
; CALL DOTPOP
; *RETURN*
DOTPOP: TAPOP. T1, ;DO IT
CAIA ;FAILED--REPORT ERROR
POPJ P, ;OK
ETAPOP: SAVE$ <T4,T3,T2,T1> ;SAVE ON PDL
WARN. EF$OCT!EF$NCR,TUF,<TAPOP. UUO FAILURE--CODE = >
STRNG$ < - FN=>
MOVE T1,-1(P) ;GET FN (WAS IN T2)
CALL .TOCTW##
CALL .TCRLF##
RESTR$ <T1,T2,T3,T4>
POPJ P,
SUBTTL PROCESS THE COMMAND LIST
;THIS IS THE HEART OF THE DUMPR PROGRAM. IT GETS THE FUNCTIONS OFF
;OF THE ACTION (COMMAND) LIST AND PROCESSES THEM.
PROCMD: CALL .SAVE4## ;SAVE P1-4
CALL DMPINI ;INITIALIZE
MOVEI A,ACTLST ;SETUP A TO POINT TO ACTION LIST
TLZA F,FL$OUT ;FLAG WE ARE ON OUTPUT SIDE OF THINGS
DMPINP: TLO F,FL$OUT ;FLAG WE ARE ON INPUT SIDE OF THINGS
DMPLUP: MOVE T1,(A) ;GET A COMMAND
HLRE P1,1(A) ;GET LH OF ARG WORD (USUALLY FILE COUNT)
HRRZ P2,1(A) ;GET RH OF ARG WORD (USUALLY RECORD COUNT)
ADDI A,2 ;MOVE TO NEXT ACTION
JRST @DMPDSP(T1) ;GO TO IT
EXP DMPEND ;(-2) END IT ALL
EXP DMPINP ;(-1) ALL POSITIONING SWITCHES FOLLOWING
; ARE FOR INPUT SIDE
DMPDSP: HALT . ;(0) SHOULD NOT HAPPEN
DEFINE X(A) ;MACRO TO GENERATE REST OF TABLE
<IRP A,<EXP D$'A>>
FUNCTS ;GENERATE REST OF TABLE
;INITIALIZE FOR THE COMMAND PROCESSING
DMPINI: STORE T1,RUN$FZ,RUN$LZ,0 ;CLEAR SOME THINGS
TLNE DC,(DV.MTA) ;IS INPUT MAGTAPE?
TLNE F,FL$FOR ;AND NOT /FORTRAN?
JRST DMPI.1 ;NOT MTA OR MTA AND /FORTRAN
MOVEI T1,.TFSTA ;ATTEMPT TO DIVINE THE TAPE'S LOCATION
MOVEM T1,TAPOBL-3 ;WITH A TAPOP.
MOVEI T1,INPC ;HOPE TAPUUO LIKES CHANNEL ARGS TODAY
MOVEM T1,TAPOBL-2 ;...
MOVE T1,[XWD 5,TAPOBL-3] ;ARGWORD
MTWAT. INPC, ;FIRST MAKE SURE THE TAPE HAS STOPPED MOVING!
TAPOP. T1, ;ASK MONITOR WHERE THE TAPE IS
JFCL ;(IGNORE ERROR)
DMPI.1: SETZB M,W ;DEFAULT IS OCTAL MODE
CALL D$MSET ;SET UP L AND Q
TLZ F,FL$EOT!FL$OLY!FL$MNP ;CERTAINLY NOT END OF TAPE
CALL INIHDR ;OUTPUT INITIAL HEADER MESSAGE
SKIPG T1,S.BLKF ;GET BLOCKING FACTOR IN CASE EBCDIC
MOVEI T1,AD.BKF ;NOT SPECIFIED--GET DEFAULT
MOVEM T1,S.BLKF ;SET IN CASE NEEDED
MOVEM T1,EBCKNT ;AND THE COUNTER ALSO
POPJ P, ;DONE
;DISPATCH TABLE FOR DUMPING WORDS
DMPWRD: EXP FMTOCT ; 0--RADIX 8
EXP O$ASCW ; 1--ASCII
EXP O$BYTW ; 2--BYTE
EXP E$$EIW ; 3--EBCDIC
EXP FMTFLO ; 4--FLOAT
EXP [HALT] ; 6--HALF (SNH)
EXP O$HEXW ; 5--HEX
EXP FMTINT ; 6--INTEGER
EXP FMTOCT ; 7--OCTAL
EXP O$SIXN ;10--SIXBIT
EXP O$SYMW ;11--SYMBOL
E$$EIW: ERROR. EF$FTL,EIW,<EBCDIC ILLEGAL WITHOUT /INDUSTRY>
SUBTTL MAJOR DUMP LOOP
DUMPIT: SOJGE L,DUMP.1 ;ROOM LEFT ON LINE?
CALL D$NEWL ;NO--MAKE NEW LINE
SOJ L, ;DON'T FORGET TO COUNT WORD WE DUMP NOW
DUMP.1: MOVE T1,(W) ;GET A WORD
CALL D$WORD ;DUMP IN PROPER MODE
AOBJN W,DUMPIT ;DO ALL WORDS IN RECORD
DUMP.2: SKIPG P1 ;FILES LEFT?
SOJLE P2,DMPEND ;YES--ANY RECORDS LEFT?
DUMP$G: CALL GETBUF ;NEW BUFFER FULL
JRST DUMPEF ;END OF FILE
TLZ F,FL$EOT ;CLEAR EOT FLAG--WE SAW SOME DATA
CALL CHKTTY ;ATTEND TO TTY IF /IFTYP
JRST DMPEND ;SAID TO KILL IT OFF
CALL RECHDR ;OUTPUT RECORD (BLOCK) HEADER
TLNE F,FL$SUM!FL$TOT ;/SUMMARY OR /TOTAL
JRST DUMP.2 ;YES--DONE WITH THIS RECORD
TLNN F,FL$OLY ;IS THERE A /ONLY IN EFFECT?
JRST DUMPIT ;CONTINUE DUMPING
OLYDMP: MOVE P3,ONLYLO ;GET LOW LIMIT
MOVEI T1,-1(P3) ;ADJUST WRDCNT
ADDM T1,WRDCNT ;TO REFLECT THE WORDS WE SKIPPED
SOJLE P3,OLYD.1 ;JUMP IF WE HAVE SKIPPED ENOUGH
AOBJN W,.-1 ;NO--SKIP MORE, BUT WATCH FOR END OF RECORD
JRST DUMP$G ;RAN OUT OF RECORD BEFORE LOW LIMIT REACHED
OLYD.1: MOVE P3,ONLYHI ;GET UPPER LIMIT
SUB P3,ONLYLO ;COMPUTE # WORDS TO DUMP
SETO L, ;FORCE A NEW LINE FIRST TIME THROUGH
OLYD.2: SOJGE L,OLYD.3 ;TIME FOR NEW LINE?
CALL D$NEWL ;YES
SUBI L,1 ;COUNT WHAT WE DO NOW
OLYD.3: MOVE T1,(W) ;GET A WORD
CALL D$WORD ;DUMP IN PROPER FORMAT
SOJL P3,DUMP.2 ;JUMP IF DUMPED ENOUGH
AOBJN W,OLYD.2 ;JUMP IF MORE WORDS IN RECORD
JRST DUMP.2 ;END OF RECORD
;HERE TO START THE DUMP
D$DMP: TLNE DC,(DV.DIR) ;INPUT A DIRECTORY DEVICE?
JUMPG P1,E$$CDM ;NO FILES ALLOWED ON DIRECTORY DEVICE
TLNN DC,(DV.MTA) ;CHECK FOR MTA INPUT
JRST D$DMP1 ;NO--SKIP MESSAGE
MOVEI T1,[ASCIZ/[DMPIPT INITIAL POSITION OF TAPE IS FILE /]
CALL O$STRG ;SEND IT
MOVE T1,FILE ;GET FILE COUNT
CALL O$DECW ;SEND IIT
MOVEI T1,RECMS2 ;<SP>RECORD<SP>
CALL O$STRG
MOVE T1,RECORD
CALL O$DECW
CALL RBRKNL ;CLOSE INFO
CALL FRCTYO ;MAKE IT SHOW IF TTY OUTPUT....KEEP USER HAPPY
D$DMP1: JUMPGE P1,DUMP$G ;JUMP IF FILE COUNT IS OK
TLNN DC,(DV.MTA) ;NO--SEE IF MTA
TDZA P1,P1 ;NO--MAKE SURE FILE COUNT IS ZERO
HRLOI P1,377777 ;YES--DO WHOLE TAPE (SEE HOLDMP)
JRST DUMP$G ;BEGIN TO DUMP
E$$CDM: ERROR. EF$FTL,CDM,<CANT DUMP MULTIPLE FILES ON DIRECTORY DEVICE>
SUBTTL DUMP WORD ROUTINE
D$WORD: TLNN F,FL$IND ;IN /INDUSTRY MODE?
PJRST @DMPWRD(M) ;NO--JUST GO DUMP THE SUCKER
PJRST @DMPINW(M) ;YES--DO IT THAT WAY
;HERE TO CONVERT IBM 360/370 FLOATING POINT WORD TO PDP10
INDFLO: JUMPE T1,FMTFLO ;ALL DONE IF ZERO
SKIPL T1 ;SET NEGATIVE FLAG IF NEEDED
TDZA T3,T3 ;NO--FLAG POSITIVE
SETO T3, ;YES--REMEMBER THAT
SETZ T2, ;CLEAR T2
ROTC T1,^D8 ;SEPARATE EXPONENT AND MANTISSA
SUBI T2,^D64 ;COMPUTE ACTUAL FRACTION
ASH T2,2 ;MAKE PDP-10 EXPONENT BASE 2
CAMGE T2,[EXP -^D128] ;WAS IT TOO SMALL?
JRST TOOSML ;YES--MAKE IT SMALLEST PDP-10 WORD
CAILE T2,^D127 ;TOO BIG?
JRST TOOBIG ;YES
ADDI T2,^D128 ;ADD PDP EXPONENT BIAS
FLTROT: ROTC T1,-^D9 ;REMAKE THE NUMBER
FADRI T1,(0.0) ;NORMALIZE IT
JUMPE T3,FMTFLO ;ALL DONE IF POSITIVE
EXCH T2,T1 ;NEED TO NEGATE IT
SETZ T1, ;SO SUBTRACT IT FROM ZERO
FSBR T1,T2 ;..
JRST FMTFLO ;DUMP PDP10 FLOATING PT NUMBER
TOOSML: SETZ T1, ;DO ZERO IF TOO SMALL
JRST FMTFLO ;OUTPUT A ZERO
TOOBIG: MOVEI T1,377 ;MAKE LARGEST DEC10 NUMBER
SETO T2, ;...
JRST FLTROT
DMPINW: EXP FMTRDX ;OCTAL
EXP O$IASC ;EIGHT BIT ASCII
EXP O$BYTW ;BYTE
EXP O$EBCW ;EBCDIC
EXP INDFLO ;FLOATING POINT
EXP [HALT] ;HALFWORD (SNH)
EXP O$HEXI ;HEX
EXP [ASH T1,-4 ;INTEGER--POSITION NUMBER
JRST FMTINT] ;AND DO IT
EXP FMTRDX ;OCTAL
EXP E$$SWI ;SIXBIT
EXP E$$SWI ;SYMBOL
E$$SWI: ERROR. EF$FTL,SWI,<SIXBIT/SYMBOL WITH /INDUSTRY ILLEGAL>
;HERE AT END OF FILE
DUMPEF: TLNN DC,(DV.DIR) ;DIRECTORY DEVICE?
TLOE F,FL$EOT ;MTA--SET/CHEK EOT FLAG
JRST DMPEND ;DIRECTORY DEVICE OR EOT
CALL FILEND ;OUTPUT END OF FILE MESSAGE
CALL INPCLS ;CLOSE INPUT FILE
IFN FT$WLD,<
MOVE T1,[XWD SVINOB,OPNBLK] ;RESET OPEN BLOCK
BLT T1,LKPBLK+.RBTIM;(COPY LKPBLK ALSO IN CASE CAN'T REOPEN)
OPEN INPC,OPNBLK ;GET THE DEVICE AGAIN
JRST [IFE FT$SEG,<CALL UPSCN> ;CAN'T--GET HISEG IF NEEDED
CALL E.DFO## ;CAN'T--REPORT ERROR
JRST DMPE.1] ;AND GO FINISH UP
CALL OPNI.A ;SETUP BUFFERS , ETC.
>;END IFN FT$WLD
IFE FT$WLD,<
CALL OPNINP ;REOPEN INPUT FILE
>;END IFE FT$WLD
SOJG P1,DUMP$G ;JUMP IF MORE FILES
JUMPG P2,DUMP$G ;OR MORE RECORDS
JRST DMPE.1 ;END OF DUMP
;HERE AT END OF DUMP
DMPEND:
TLNE F,FL$EOT ;GET HERE WITH END OF TAPE?
JRST DMPE.1 ;YES--DON'T OUTPUT END OF FILE MESSAGE
HRROI T1,FN$END ;GET END FUNCTION
CAME T1,(A) ;IS IT NEXT ON THE LIST
JRST [CALL O$CRLF ;NO--NEW LINE
JRST DMPE.1] ;AND SKIP
CALL FILEND ;YES--OUTPUT END MESSAGE
DMPE.1: MOVEI T1,ENDMS1 ;FIRST PART OF MESSAGE
CALL O$STRG ;SEND IT
MOVE T1,TOTFIL ;GET # FILES DUMPED
JUMPE T1,DMPE.2 ;JUMP IF NONE
CALL O$DECW ;SEND FILES
MOVEI T1,ENDMS2 ;GET MESAGE
CALL O$STRG ;SEND IT
DMPE.2: MOVE T1,TOTREC ;AND RECORDS
CALL O$DECW ;OUTPUT THEM
TLNN DC,(DV.MTA) ;MTA INPUT?
TLNE F,FL$FOR!FL$PHY ;NO--/FORTRA OR /IREAD?
SKIPA T1,[EXP ENDMS3] ;MTA OR /FORTRA OR /IREAD
MOVEI T1,ENDMS4 ;MUST BE STRAIGHT DISK INPUT
CALL O$STRG ;SEND IT
MOVEI T1,ENDMS5 ;FINAL MESSAGE
CALL O$STRG ;SEND IT
CALL FRCTYO ;IF TTY, FORCE OUTPUT OUT TO KEEP USER HAPPY
HRROI T1,FN$END ;GET END FUNCTION
CAME T1,0(A) ;IS IT COMING UP?
JRST DMPLUP ;NO--BACK FOR MORE
MOVEI T1,ENDMSG ;YES--GET END MESSAGE
CALL O$STRG ;END THE WORLD
PJRST FRCTYO ;RETURN, FORCING OUTPUT IF TTY
ENDMS1: ASCIZ$ <[DMPTOT TOTAL OF >
ENDMS2: ASCIZ$ < FILES AND >
ENDMS3: ASCIZ$ < RECORDS>
ENDMS4: ASCIZ$ < BLOCKS>
ENDMS5: ASCIZ$ < IN DUMP]
>
ENDMSG: ASCIZ$ <[DMPERD END OF REQUESTED DUMP]
>
SUBTTL OUTPUT INITIAL HEADER
INIHDR: CALL .SAVE1## ;MIGHT AS WELL
SKIPN TITLEB ;WAS THERE A /TITLE?
JRST INIH.1 ;NO
MOVEI T1,TITLEB ;YES--GET ADDRESS
CALL O$STRG ;SEND IT
CALL O$CRLF ;NEW LINE
INIH.1: CALL O$CRLF ;AND ANOTHER
MOVEI T1,IMES1 ;FIRST PART OF MESSAGE
CALL O$STRG ;PLEASE EXCUSE THE COMMENTS
MOVEI T1,O$CHAR ;BUT THIS CODE IS VERY SELF-EXPLANATORY
CALL .TYOCH## ;SETUP MY OUTPUT ROUTINE WITH SCAN
SAVE$ T1 ;REMEMBER OLD WON
CALL TINSPC ;TYPE OUT THE INPUT FILE SPEC
TLNN DC,(DV.MTA) ;IS INPUT A MAGTAPE?
JRST INIH.4 ;NO
SKIPN REELID ;YES--WAS THERE A REELID ON THE TAPE?
JRST INIH.3 ;NO
MOVEI T1,IMES5 ;GET THE MESSAGE
CALL O$STRG ;SEND IT
MOVE T1,REELID ;GET THE REELID
CALL O$SIXW ;SEND IT
INIH.3: CALL O$SPAC ;SPACE OVER
MOVEI P1,INPC ;GET CHANNEL
MTCHR. P1, ;GET CHARACTERISTICS
SETZ P1, ;SNH
TRNE P1,MT.7TR ;IS IT SEVEN TRACK?
SKIPA T1,[EXP "7"] ;YES--SETUP
MOVEI T1,"9" ;NO--MUST BE 9
CALL O$CHAR ;SEND IT
MOVEI T1,IMES6 ;GET "<SP>TRACK"
CALL O$STRG ;SEND IT
LDB T1,[POINT 3,P1,35] ;GET DENSITY
MOVE T1,DENTBL(T1) ;GET STRING ADDRESS
CALL O$STRG ;TELL DENSITY
MOVEI T1,BPIMES ;TELL WHAT WE JUST TOLD
CALL O$STRG ;TELL IT
INIH.4: MOVEI T1,IMES2
CALL O$STRG
CALL .TDATN## ;ADD THE DATE
MOVEI T1,IMES3
CALL O$STRG
CALL .TTIMN## ;AND THE TIME
CALL RBRKNL ;NEXT LINE
MOVEI T1,IMES4
CALL O$STRG
CALL CMDOUT ;DUMP THE COMMAND
CALL RBRKNL
CALL FRCTYO ;FORCE OUT TO TTY IF IT IS TTY
RESTR$ T1
PJRST .TYOCH## ;GIVE SCAN BACK ITS OUTPUT RTN
IMES1: ASCIZ$ <[DUMP OF >
IMES2: ASCIZ$ < ON >
IMES3: ASCIZ$ < AT >
IMES4: ASCIZ$ <[DMPCMD COMMAND: >
IMES5: ASCIZ$ < - REELID=>
IMES6: ASCIZ$ < TRACK/>
BPIMES: ASCIZ$ < BPI>
DENTBL: [ASCIZ /(DEFAULT)/]
[ASCIZ /200/]
[ASCIZ /556/]
[ASCIZ /800/]
[ASCIZ /1600/]
[ASCIZ /6250/]
[ASCIZ /(6)/]
[ASCIZ /(7)/]
RBRKNL: PJSP T1,O$STRG
ASCIZ .]
.
TINSPC: MOVEI T1,SVINOB ;POINT TO OPEN BLOCK
MOVEI T2,SVINLK ;AND LOOKUP BLOCK
PJRST .TOLEB## ;TYPE INPUT SPEC AND RETURN
SUBTTL DUMP THE COMMAND TO THE DUMP FILE
CMDOUT: MOVE T2,[POINT 7,CMDBFR] ;INIT THE POINTER
SETZ T3, ;CLEAR THE HYPHEN FLAG (CONTINUED COMMANDS)
CMDO.1: ILDB T1,T2 ;GET A CHARACTER
CMDO.3: JUMPE T1,$POPJ ;?? GOT TO END ??
CAIE T1,"-" ;IS THIS A HYPHEN/
JRST CMDO.2 ;NO--CHECK FURTHER
MOVE T1,T2 ;YES--GET NEXT CHARACTER
ILDB T1,T1 ;...
CAIGE T1," " ;.GE. A SPACE (ROUGH APPROX OF EOL)
;THIS WOULD BE LIKE IN A DATE
SOJA T3,CMDO.1 ;PROBABLY EOL--FLAG AND GO
MOVEI T1,"-" ;PROBABLY NOT EOL--RESET HYPHEN
JRST CMDO.4 ;AND GO SEND IT
CMDO.2: CAIE T1,.CHTAB ;IS IT A TAB?
CAIL T1," " ;OR GE SPACE
JRST CMDO.4 ;YES--GO SEND TO DUMP
JUMPE T3,$POPJ ;IF WE HAVEN'T SEEN A "-" THEN THIS IS THE END
SETZ T3, ;CLEAR HYPHEN FLAG AT EOL
CAIE T1,.CHCRT ;IS IT A CARRIAGE RETURN?
JRST CMDO.1 ;NO--MUST BE ALTMODE OR SOME SUCH EOL
ILDB T1,T2 ;YES--GET (POSSIBLE LINEFEED)
CAIN T1,.CHLFD ;IS IT?
JRST CMDO.1 ;YES--GET NEXT CHARACTER
JRST CMDO.3 ;NO--GO PROCESS THIS ONE
CMDO.4: CALL O$CHAR ;OUTPUT CHARACTER
JRST CMDO.1 ;DO MORE
SUBTTL OUTPUT RECORD (BLOCK) HEADER
RECHDR: AOS RECORD ;COUNT THE RECORD
AOS TOTREC ;AND TOTAL RECORDS
TLNE F,FL$TOT ;TOTALS ONLY?
POPJ P, ;YES--DONE
MOVEI T1,1 ;RESET WRDCNT
MOVE T2,LINRDX ;GET /LINRDX: VALUE
CAIE T2,LRXDEC ;IS IT /LINRDX:DEC?
MOVEI T1,0 ;NO--WORDS START AT ZERO
MOVEM T1,WRDCNT ;SO LINE #'S WILL BE RIGHT(IF NOT /OMIT)
TLNN F,FL$SUM ;/SUMMARY?
CALL O$CRLF ;NEW LINE FOR NEW RECORD
CALL O$CRLF ;AND ANOTHER
RECH.1: TLNN DC,(DV.DIR) ;DIRECTORY DEVICE?
JRST RECMTA ;NO--MTA
MOVEI T1,BLKMS1 ;YES--GET MESSAGE
TLNE F,FL$FOR!FL$PHY ;/FORTRA OR /IREAD?
MOVEI T1,BLKMS3 ;YES--DIFFERENT MESSAGE
CALL O$STRG
MOVE T1,RECORD ;GET RECORD #
CALL O$DECW
MOVEI T1,":"
CALL O$CHAR
HLRE T1,W ;GET WORD COUNT
MOVNS T1 ;MAKE POSITIVE
CALL O$DECW
JRST RECH.2 ;REJOIN COD
BLKMS1: ASCIZ$ <[BLOCK >
BLKMS2: ASCIZ$ < WORDS>
BLKMS3: ASCIZ$ <[RECORD >
RECMS1: ASCIZ$ <[FILE >
RECMS2: ASCIZ$ < RECORD >
RECMS3: ASCIZ$ < CHARACTERS>
RECMTA: MOVEI T1,RECMS1
CALL O$STRG
MOVE T1,FILE ;FILE COUNT
CALL O$DECW
MOVEI T1,RECMS2
CALL O$STRG
MOVE T1,RECORD
CALL O$DECW
MOVEI T1,":"
CALL O$CHAR
HLRE T1,W ;WORD COUNT
MOVNS T1
CALL O$DECW
RECH.2: MOVEI T1,BLKMS2
CALL O$STRG ;SEND IT
CAIE M,MODASC ;/MODE:ASCII?
JRST RECH.3 ;NO
CALL O$SPAC ;SPACE ONE
HLRE T1,W ;YES--GET WORDS AGAIN
MOVNS T1
IMULI T1,5 ;CVT TO CHARACTERS
CALL O$DECW ;OUTPUT IT
MOVEI T1,RECMS3 ;MESSAGE
CALL O$STRG
RECH.3: MOVEI T1,"]" ;CLOSE INFO
CALL O$CHAR ;...
TLNE F,FL$OLY!FL$SUM ;ONLY IN EFFECT? (OR /SUMMARY)
PJRST FRCTYO ;YES--NEW LINE STUFF DONE LATER
CAIE M,MODEBC ;MODE EBCDIC?
CAIN M,MODASC ;MODE ASCII?
TLNN F,FL$OMI ;ASCII OR EBCDIC--AND /OMIT?
JRST D$NEWL ;NO--DO NEW LINE THING
PJRST O$CRLF ;YES--NEW LINE AND RETURN
;HERE TO DO WRDCNT AT BEGINNING OF LINE
D$NEWL: CAIE M,MODASC ;IF /MODE:ASCII
CAIN M,MODEBC ;OR /MODE:EBCDIC
TLNN F,FL$OMI ;RIGHT--AND /OMIT?
CALL O$CRLF ;NO--NEW LINE
TLNE F,FL$OMI ;/OMIT?
JRST D$NEW2 ;YES--SKIP A LITTLE
MOVE T1,WRDCNT ;GET THE WORD COUNT
MOVE T3,LINRDX ;GET SPECIFIED LINE # RADIX
MOVE Q,LNOWID-1(T3) ;SETUP Q TO THE WIDTH
MOVE T4,LNORDX-1(T3) ;AND THE RADIX
CALL @LNODSP-1(T3) ;DO LINE NO IN SPECIFIED RADIX
MOVEI T1,"/" ;END THE LINE #
CALL O$CHAR ;(EACH FORMAT DOES A SPACE FIRST)
;(SO WE DON'T NEED ONE AFTER THE SLASH)
D$NEW2: CALL D$MSET ;RESET L AND Q
ADDM L,WRDCNT ;UPDATE WRDCNT FOR NEXT LINE
POPJ P,
;TABLE OF LINE # (WORD COUNT) RADICES
LNORDX: EXP ^D10 ;
EXP ^D16
EXP ^D8
;WIDTHS OF LINE #S IN SPECIFIED RADIX
LNOWID: EXP ^D6
EXP ^D7
EXP ^D8
LNODSP: EXP FMTINT ;INTEGER
EXP FMTR.1 ;HEX
EXP FMTR.1 ;OCTAL
SUBTTL OUTPUT END OF FILE MESSAGE
FILEND:
TLNN F,FL$TOT ;UNLESS /TOTAL
CALL O$CRLF ;NEED NEW LINE
TLNN DC,(DV.MTA) ;IS IT MAGTAPE?
TLNE F,FL$FOR!FL$PHY ;DSK--FORTRAN OR PHYSICS?
SKIPA T1,[FILMS1] ;MTA OR FORTRAN/IREAD
MOVEI T1,FILMS3 ;JUST STRAIGHT DISK INPUT
CALL O$STRG
MOVE T1,RECORD ;RECORDS
CALL O$DECW ;...
TLNN DC,(DV.MTA) ;MTA INPUT?
TLNE F,FL$FOR!FL$PHY ;DSK--IS IT FORTRAN OR IREAD?
SKIPA T1,[FILMS2] ;MTA OR RECORD-ORIENDTED DISK INPUT
MOVEI T1,FILMS4 ;DISK BLOCK ORIENTED
CALL O$STRG
MOVE T1,FILE
CALL O$DECW
MOVEI T1,IMES2 ;"<SP>ON<SP>"
CALL O$STRG
MOVEI T1,O$CHAR
CALL .TYOCH##
SAVE$ T1
CALL TINSPC ;TYPE OUT THE INPUT FILE SPEC.
RESTR$ T1
CALL .TYOCH##
CALL RBRKNL
SETZM RECORD ;MOVING ALONG
TLNN DC,(DV.MTA) ;ONLY MTA HAS MULTIPLE FILES
PJRST FRCTYO ;SO DON'T MESS UP THE TOTALS NOW
AOS FILE
AOS TOTFIL
PJRST FRCTYO ;FORCE OUTPUT IF TTY OUTPUT
FILMS1: ASCIZ$ <[DMPRIF >
FILMS2: ASCIZ$ < RECORDS IN FILE >
FILMS3: ASCIZ$ <[DMPBIF >
FILMS4: ASCIZ$ < BLOCKS IN FILE >
SUBTTL /MODE -- SETUP CHARS/WORD AND WORDS/LINE
D$MOD: MOVE M,P2 ;SET M TO THE MODE
CAIN M,MODBYT ;IS THIS /MODE:BYTE?
JRST D$MBYT ;YES--SET IT UP
CAIN M,MODHAL ;SEE IF /MODE:HALF
JRST D$MHLF ;YES--SETUP
CALL D$MSET ;SETUP L AND Q
JRST DMPLUP ;CONTINUE
;HERE TO SET MODE--CALLED AT END OF LINE TO RESET L AND Q
D$MSET: CAIN M,MODBYT ;/MODE:BYTE?
JRST MSETBY ;YES--DO IT
CALL GETWID ;GET THE WIDTH REQUIRED FOR THE DUMP
TLNE F,FL$IND ;/INDUSTRY?
SKIPA Q,MODTBI(M) ;YES--GET RIGHT SIZE FOR THAT
MOVE Q,MODTBL(M) ;GET WIDTH OF ONE WORDS' WORTH
TLNE F,FL$RDX ;/RADIX IN EFFECT?
MOVE Q,USRWID ;YES--GET COMPUTED WORD WIDTH
IDIVI T1,(Q) ;COMPUTE WORDS/LINE
SKIPN T2 ;IF A ZERO REMAINDER
SUBI T1,1 ;MUST SUBTRACT ONE--80 CPL DOES A FREE CRLF
HRRZ L,T1 ;PUT IN L FOR COUNTING
POPJ P,
MSETBY: MOVE L,BYTBPL ;GET BYTES/LINE
MOVE Q,BYTDPB ;AND DIGITS/BYTE
POPJ P,
GETWID: TRNN DC,(DV.TTY) ;IS DUMP TO THE TTY?
JRST GETW.1 ;NO--
SKIPLE T1,FLWIDT ;WAS /WIDTH GIVEN (OR IS THIS 1ST TIME?)
JRST GETW.2 ;GOT IT--GO AHEAD
MOVE T1,[XWD 2,T2] ;SETUP TO DO A TRMOP
MOVEI T2,.TOWID ;GET THE WIDTH FUNCTION
PJOB T3, ;FIND MY JOB #
TRMNO. T3, ;TO FIND TTY UDX
SKIPA ;CAN'T--JUST USE DEFAULT AD.WID
TRMOP. T1, ;READ TTY WIDTH SETTING
MOVEI T1,AD.WID ;CAN'T FOR SOME REASON--USE A GOOD DEFAULT
MOVEM T1,FLWIDT ;SET FOR LATER USE
JRST GETW.2 ;JUMP IN TO COMMON CODE
GETW.1: SKIPG T1,FLWIDT ;NOT TTY--WAS /WIDTH GIVEN/
MOVEI T1,MX.WID ;NO--USE ^D132
GETW.2: TLNE F,FL$OMI ;OMITTING LINE NUMBERS?
POPJ P, ;YES--DONE
MOVE T2,LINRDX ;NO--GET LINE RADIX
SUB T1,LNOWID-1(T2) ;UNCOUNT WHAT WE WILL EAT FOR WORD COUNT
POPJ P, ;RETURN
MODTBL: EXP ^D13 ;OCTAL
EXP ^D6 ;ASCII
EXP -1 ;BYTYE
EXP ^D5 ;EBCDIC
EXP ^D15 ;FLOAT
EXP -1 ;HALF
EXP ^D10 ;HEX
EXP ^D14 ;INTEGER
EXP ^D13 ;OCTAL
EXP ^D7 ;SIXBIT
EXP ^D24 ;SYMBOL
MODTBI: EXP ^D12 ;OCTAL
EXP ^D5 ;ASCII
EXP -1 ;BYTE
EXP ^D5 ;EBCDIC
EXP ^D15 ;FLOATING POINT
EXP -1 ;HALF
EXP ^D9 ;HEX
EXP ^D12 ;INTEGER
EXP ^D12 ;INTEGER
EXP -1 ;SIXBIT
EXP -1 ;SYMBOL
SUBTTL /MODE -- SETUP FOR /MODE:BYTE
D$MBYT: MOVSI T2,(POINT) ;BEGIN TO FORM BYTE PTR
HRRI T2,P1 ;WILL LOAD FROM P1
DPB P1,[POINT 6,T2,11] ;SET SIZE IN
MOVEM T2,BYTPTR ;SAVE FOR LATER
TLNE F,FL$IND ;/INDUSTRY?
SKIPA T1,[EXP ^D32] ;YES
MOVEI T1,^D36 ;NO--FULL WORD
IDIVI T1,(P1) ;GET BYTES/WORD
MOVEM T1,BYTBPW ;...
MOVEM T2,BYTREM ;SAVE REMAINDER BYTES ALSO
MOVE T1,P1 ;COPY SIZE
CALL GMBWID ;GET THE WIDTH FOR A BYTE
MOVEM T1,BYTDPB ;SAVE FOR LATER
MOVE T1,BYTBPW ;GET BYTES/WORD
IMUL T1,BYTDPB ;TIMES DIGITS/BYTE
ADD T1,BYTBPW ;+ SLASHES AND SPACE
MOVEM T1,BYTWID ;= WIDTH OF WORD OF BYTES
SKIPN T1,BYTREM ;WAS THERE A REMAINDER?
JRST D$MBY1 ;NO
CALL GMBWID ;GET WIDTH OF THAT
AOJ T1, ;COUNT THE COMMA TOO
ADDM T1,BYTWID ;ADD INTO WIDTH
MOVEM T1,BYTRDB ;SAVE FOR LATER USE
D$MBY1: CALL GETWID ;GET THE WIDTH TO USE FOR OUTPUT
IDIV T1,BYTWID ;TO GET WORDS/LINE
MOVEM T1,BYTBPL ;SAVE BYTES/LINE
MOVE L,T1 ;COPY
AOS BYTDPB ;+1 SO FMTRDX WORKS
JRST DMPLUP ;CONTINUE
;HERE WITH T1=BYTE SIZE
;RETURN T1=DIGITS REQUIRED TO DISPLAY IT. USES T2,T3
GMBWID: MOVE T3,USERDX ;GET /RADIX:N OR 8
SETZ T2, ;ZERO POWER OF TWO COUNT
LSH T3,-1 ;DIVIDE BY TWO
SKIPE T3 ;DONE?
AOJA T2,.-2 ;NO--LOOP AROUND
IDIVI T1,(T2) ;YES--COMPUTE DIGITS REQUIRED
JUMPE T2,$POPJ ;JUMP IF ALL IS WELL
AOJA T1,$POPJ ;NO--NEED ONE MORE DIGIT--SO DO IT
;HERE FOR /MODE:HALF SETUP
D$MHLF: MOVEI P1,^D18 ;SETUP THE BYTE SIZE
TLNE F,FL$IND ;SEE IF /INDUSTRY
MOVEI P1,^D16 ;YES--DIFFERENT SIZE
MOVEI M,MODBYT ;SETUP M TO BYTE MODE
JRST D$MBYT ;DO BYTE SETUP
SUBTTL DUMP FILE OUTPUT ROUTINES
;O$CRLF -- OUTPUT CRLF TO DUMP FILE
O$CRLF: MOVEI T1,.CHCRT ;CARRIAGE RETURN
CALL O$CHAR ;DUMP IT
MOVEI T1,.CHLFD ;LINED FEED
;FALL INTO O$CHAR TO SEND LINEFEED
;O$CHAR -- OUTPUT CHARACTER IN T1 TO DUMP FILE
O$CHAR: SOSG OBHR+.BFCTR ;ROOM IN THE BUFFER?
JRST O$BUFR ;NO--MAKE SOME
O$CHR1: IDPB T1,OBHR+.BFPTR ;STORE CHARACTER
TLO F,FL$ODN ;WE HAVE DONE SOME OUTPUT
AOS CHRKNT ;COUNT FOR PEOPLE WHO NEED IT
POPJ P,
O$BUFR: CALL .PSH4T## ;PRESERVE T1-4 (XCTIO USES T2 AT LEAST)
CALL XCTIO ;WRITE A BUFFER
OUT OUTC, ;XCT'D
SKIPA ;?? DEVICE IS FULL OR EOT ??
JRST [PUSHJ P,.POP4T## ;RESTORE REGS
JRST O$CHR1] ;AND CONTINUE
ERROR. EF$ERR,ODF,<OUTPUT DEVICE IS FULL>
CALL OUTCLS ;TRY TO PRESERVE WHAT WE CAN
PJRST ERRFTL ;GO DIE
;O$STRG -- OUTPUTS ASCIZ STRING POINTED TO BY T1 TO DUMP FILE
O$STRG: HRLI T1,(POINT 7) ;FORM PTR
PUSH P,T1 ;SAVE ON PDL
O$STR1: ILDB T1,(P) ;GET CHAR
JUMPE T1,TPOPJ ;JUMP IS END OF STRING
CALL O$CHAR ;WRITE THE CHARACTER
JRST O$STR1 ;LOOP
;O$SPEC -- OUTPUT SPACE IF NOT /OMIT
;O$SPAC -- OUTPUT A SPACE
;O$DOT -- OUTPUT A DOT
;O$SLSH -- OUTPUT A SLASH
;O$TABC -- OUTPUT A TAB
;O$COMA -- OUTPUT A COMMA
O$SPEC: TLNE F,FL$OMI ;/OMIT?
POPJ P, ;YES
O$SPAC: SKIPA T1,[EXP " "] ;DO A SPACE
O$DOT: MOVEI T1,"." ;DO A DOT
PJRST O$CHAR
O$TABC: SKIPA T1,[EXP " "] ;GET A TAB
O$SLSH: MOVEI T1,"/" ;GET ONE
PJRST O$CHAR ;AND SEND IT
O$COMA: MOVEI T1,"," ;GET A COMMA
PJRST O$CHAR ;SEND IT
;O$HEXW --OUTPUT 36 BIT HEX WORD
;O$HEXI -- OUTPUT 32 BIT HEX WORD (INDUSTRY)
O$HEXI: SKIPA T3,[DEC 8] ;8 HEX CHARS
O$HEXW: MOVEI T3,^D9 ;9 HEX CHARS
MOVE T2,T1 ;POSITION NUMBER
CALL O$SPAC ;SPACE OVER A CHARACTER
O$HEX1: SETZ T1, ;CLEAR RESULT
LSHC T1,4 ;GET A HEX DIGIT
CALL O$DIGT ;OUTPUT IT
SOJG T3,O$HEX1 ;DO 8 OR 9
POPJ P,
SUBTTL SYMBOLIC OUTPUT
;HERE TO OUTPUT WORD IN T1 IN SYMBOLIC FORMAT
O$SYMW:
IFE FT$ISD,<
ERROR. EF$FTL,SNI,<SYMBOLIC DUMP NOT IMPLEMENTED>
>;END IFE FT$ISD
IFN FT$ISD,<
CALL .SAVE1## ;SAVE P1
MOVE P1,T1 ;COPY WORD
CALL O$SPAC ;SPACE OVER
SETZM CHRKNT ;CLEAR COUNTER
LDB T1,[POINT 9,P1,8];GET OP CODE
CAIL T1,700 ;SEE IF DIRECT I/O INSTR
JRST DIOIOW ;YES--GO DO IT
CAIGE T1,40 ;SEE IF LUUO
JRST UUOIOW ;YES--GO DO THAT
MOVE T1,MNETBL-40(T1);NO--GET OPCODE
CALL O$SIXW ;SHOW IT
OSYM.2: CALL O$SPAC ;GET A SPACE
CALL O$SPAC ;AND ONE MORE
LDB T1,[POINT 4,P1,12] ;GET AC FIELD
OSYM2A: JUMPE T1,OSYM.4 ;JUMP IF 0
CALL O$OCTW ;SHOW IT
CALL O$COMA ;AND A COMMA
OSYM.4: MOVEI T1,"@" ;IN CASE INDIRECTION NEEDED
TLNE P1,(1B13) ;CHECK IF SO
CALL O$CHAR ;SEND THE INDIRECT BIT
HRRZ T1,P1 ;GET RH 18 BITS
CALL O$OCTW ;SEND IT
LDB T1,[POINT 4,P1,17] ;SEE IF INDEX FIELD
JUMPE T1,OSYM.6 ;JUMP IF NO INDEX
PUSH P,T1 ;SAVE INDEX
MOVEI T1,"(" ;START INDEX FIELD
CALL O$CHAR ;SEND IT
POP P,T1 ;GET INDEX FIELD
CALL O$OCTW ;SEND IT
MOVEI T1,")" ;CLOSE INDEX
CALL O$CHAR ;SEND IT
OSYM.6: MOVE T1,CHRKNT ;GET COUNT TO HERE
SUBI T1,^D23 ;THIS MANY CHARS IN FULL INSTR
JUMPGE T1,$POPJ ;JUMP IF NO PADDING NEEDED
PUSH P,T1 ;NO--SAVE AMT NEEDED
CALL O$SPAC ;SEND ONE
AOSGE (P) ;SEE IF DONE
JRST .-2 ;NO--DO MORE
JRST TPOPJ ;CLEAR PDL AND RETURN
;HERE IF UUO IS 0-40
UUOIOW: JUMPE T1,UUO000 ;JUMP IF ILL UUO
MOVEI T1,[ASCIZ/UUO/]
CALL O$STRG ;SEND UUO
LDB T2,[POINT 9,P1,8] ;GET OP CODE
MOVSS T2 ;MOVE TO LH
LSH T2,^D9 ;PUT TO HIGH 9 BITS
MOVEI T3,3 ;TYPE 3 OCTAL DIGITS
CALL FMTO.1 ;TYPE THEM
JRST OSYM.2 ;CONTINUE
UUO000: MOVSI T1,'Z ' ;GET A SIXBIT "Z"
CALL O$SIXW ;SEND SIXBIT (WILL SEND NULLS AS BLANKS)
PJRST OSYM.2 ;CONTINUE
;HERE FOR DIRECT I/O INSTRS
DIOIOW: LDB T1,[POINT 3,P1,12] ;GET 3 BITS THAT TELL THE TALE
MOVE T1,IOINTB(T1) ;GET THE SIXBIT FOR IT
CALL O$SIXW ;TYPE IT OUT
CALL O$SPAC ;AND THEN TWO SPACES
CALL O$SPAC ;...
LDB T1,[POINT 7,P1,9] ;GET DEVICE CODE
JRST OSYM2A ;GO JUMP INTO THE PROCESSING
SYMXWD: HLRZ T1,P1 ;GET LH
CALL O$OCTW ;SHOW LH
MOVEI T1,[ASCIZ/,,/] ;SOME COMMAS
CALL O$STRG
HRRZ T1,P1 ;GET RH
CALL O$OCTW ;SHOW RH
JRST OSYM.6 ;GO FINISH UP
IOINTB: SIXBIT /BLKI/
SIXBIT /DATAI/
SIXBIT /BLKO/
SIXBIT /DATAO/
SIXBIT /CONO/
SIXBIT /CONI/
SIXBIT /CONSZ/
SIXBIT /CONSO/
;SIXBIT TABLE OF INSTR MNENOMICS
DEFINE X(A)<IRP A,<SIXBIT/A/>>
MNETBL:
X (<CALL ,INIT ,UUO042,UUO043,UUO044,UUO045,UUO046,CALLI ,OPEN ,TTCALL>)
X (<UUO052,UUO053,UUO054,RENAME,IN ,OUT ,SETSTS,STATO ,GETSTS,STATZ >)
X (<INBUF ,OUTBUF,INPUT ,OUTPUT,CLOSE ,RELEAS,MTAPE ,UGETF ,USETI ,USETO >)
X (<LOOKUP,ENTER ,UJEN ,UUO101,UUO102,UUO103,UUO104,UUO105,UUO106,UUO107>)
X (<DFAD ,DFSB ,DFMP ,DFDV ,UUO114,UUO115,UUO116,UUO117,DMOVE ,DMOVN >)
X (<FIX ,UUO123,DMOVEM,DMOVNM,FIXR ,FLTR ,UFA ,DFN ,FSC ,IBP >)
X (<ILDB ,LDB ,IDPB ,DPB ,FAD ,FADL ,FADM ,FADB ,FADR ,FADRI ,FADRM >)
X (<FADRB ,FSB ,FSBL ,FSBM ,FSBB ,FSBR ,FSBRI ,FSBRM ,FSBRB ,FMP >)
X (<FMPL ,FMPM ,FMPB ,FMPR ,FMPRI ,FMPRM ,FMPRB ,FDV ,FDVL ,FDVM >)
X (<FDVB ,FDVR ,FDVRI ,FDVRM ,FDVRB ,MOVE ,MOVEI ,MOVEM ,MOVES ,MOVS >)
X (<MOVSI ,MOVSM ,MOVSS ,MOVN ,MOVNI ,MOVNM ,MOVNS ,MOVM ,MOVMI ,MOVMM >)
X (<MOVMS ,IMUL ,IMULI ,IMULM ,IMULB ,MUL ,MULI ,MULM ,MULB ,IDIV >)
X (<IDIVI ,IDIVM ,IDIVB ,DIV ,DIVI ,DIVM ,DIVB ,ASH ,ROT ,LSH >)
X (<JFFO ,ASHC ,ROTC ,LSHC ,UUO247,EXCH ,BLT ,AOBJP ,AOBJN ,JRST >)
X (<JFCL ,XCT ,MAP ,PUSHJ ,PUSH ,POP ,POPJ ,JSR ,JSP ,JSA >)
X (<JRA ,ADD ,ADDI ,ADDM ,ADDB ,SUB ,SUBI ,SUBM ,SUBB ,CAI >)
X (<CAIL ,CAIE ,CAILE ,CAIA ,CAIGE ,CAIN ,CAIG ,CAM ,CAML ,CAME >)
X (<CAMLE ,CAMA ,CAMGE ,CAMN ,CAMG ,JUMP ,JUMPL ,JUMPE ,JUMPLE,JUMPA >)
X (<JUMPGE,JUMPN ,JUMPG ,SKIP ,SKIPL ,SKIPE ,SKIPLE,SKIPA ,SKIPGE,SKIPN >)
X (<SKIPG ,AOJ ,AOJL ,AOJE ,AOJLE ,AOJA ,AOJGE ,AOJN ,AOJG ,AOS >)
X (<AOSL ,AOSE ,AOSLE ,AOSA ,AOSGE ,AOSN ,AOSG ,SOJ ,SOJL ,SOJE >)
X (<SOJLE ,SOJA ,SOJGE ,SOJN ,SOJG ,SOS ,SOSL ,SOSE ,SOSLE ,SOSA >)
X (<SOSGE ,SOSN ,SOSG ,SETZ ,SETZI ,SETZM ,SETZB ,AND ,ANDI ,ANDM >)
X (<ANDB ,ANDCA ,ANDCAI,ANDCAM,ANDCAB,SETM ,SETMI ,SETMM ,SETMB ,ANDCM >)
X (<ANDCMI,ANDCMM,ANDCMB,SETA ,SETAI ,SETAM ,SETAB ,XOR ,XORI ,XORM >)
X (<XORB ,IOR ,IORI ,IORM ,IORB ,ANDCB ,ANDCBI,ANDCBM,ANDCBB,EQV >)
X (<EQVI ,EQVM ,EQVB ,SETCA ,SETCAI,SETCAM,SETCAB,ORCA ,ORCAI ,ORCAM >)
X (<ORCAB ,SETCM ,SETCMI,SETCMM,SETCMB,ORCM ,ORCMI ,ORCMM ,ORCMB ,ORCB >)
X (<ORCBI ,ORCBM ,ORCBB ,SETO ,SETOI ,SETOM ,SETOB ,HLL ,HLLI ,HLLM >)
X (<HLLS ,HRL ,HRLI ,HRLM ,HRLS ,HLLZ ,HLLZI ,HLLZM ,HLLZS ,HRLZ >)
X (<HRLZI ,HRLZM ,HRLZS ,HLLO ,HLLOI ,HLLOM ,HLLOS ,HRLO ,HRLOI ,HRLOM >)
X (<HRLOS ,HLLE ,HLLEI ,HLLEM ,HLLES ,HRLE ,HRLEI ,HRLEM ,HRLES ,HRR >)
X (<HRRI ,HRRM ,HRRS ,HLR ,HLRI ,HLRM ,HLRS ,HRRZ ,HRRZI ,HRRZM >)
X (<HRRZS ,HLRZ ,HLRZI ,HLRZM ,HLRZS ,HRRO ,HRROI ,HRROM ,HRROS ,HLRO >)
X (<HLROI ,HLROM ,HLROS ,HRRE ,HRREI ,HRREM ,HRRES ,HLRE ,HLREI ,HLREM >)
X (<HLRES ,TRN ,TLN ,TRNE ,TLNE ,TRNA ,TLNA ,TRNN ,TLNN ,TDN >)
X (<TSN ,TDNE ,TSNE ,TDNA ,TSNA ,TDNN ,TSNN ,TRZ ,TLZ ,TRZE >)
X (<TLZE ,TRZA ,TLZA ,TRZN ,TLZN ,TDZ ,TSZ ,TDZE ,TSZE ,TDZA >)
X (<TSZA ,TDZN ,TSZN ,TRC ,TLC ,TRCE ,TLCE ,TRCA ,TLCA ,TRCN >)
X (<TLCN ,TDC ,TSC ,TDCE ,TSCE ,TDCA ,TSCA ,TDCN ,TSCN ,TRO >)
X (<TLO ,TROE ,TLOE ,TROA ,TLOA ,TRON ,TLON ,TDO ,TSO ,TDOE >)
X (<TSOE ,TDOA ,TSOA ,TDON ,TSON >)
>;END IFN FT$ISD
;O$SIXN -- OUTPUT SIXBIT WORD IN T1 TO DUMP FILE
;O$SIXW -- DITTO EXCEPT NO SPACE BEFORE WORD
O$SIXW: MOVE T2,T1 ;POSITION
JRST O$SIX0 ;SKIP THE SPACE
O$SIXN: MOVE T2,T1 ;POSITION
CALL O$SPAC ;SPACE ONE
O$SIX0: MOVEI T3,6 ;LOOP COUNT
O$SIX1: SETZ T1, ;CLEAR
ROTC T1,6 ;PEEL OFF A CHARACTER
ADDI T1," " ;ASCIIIZE IT
CALL O$CHAR ;DUMP IT
SOJG T3,O$SIX1 ;DO ALL
POPJ P,
;O$DECW -- OUTPUT DECIMAL WORD IN T1 TO DUMP FILE
;O$OCTW -- OUTPUT OCTAL WORD IN T1 TO DUMP FILE
;O$RDXW -- OUTPUT WORD IN T1 TO DUMP FILE IN RADIX IN T3
;***THESE ARE UNFORMATTED DUMP ROUTINES
O$OCTW: SKIPA T3,[^D8] ;OCTAL
O$DECW: MOVEI T3,^D10 ;DECIMAL
O$RDXW: JUMPGE T1,ORDXW1 ;JUMP IF POSITIVE
MOVE T2,T1 ;NO--SAVE NUMBER
MOVEI T1,"-"
CALL O$CHAR
MOVE T1,T2
ORDXW1: IDIV T1,T3 ;DIVIDE BY RADIX
MOVMS T2 ;GT MAGNITUDE
HRLM T2,(P) ;SAVE ON PIDDLE LIST
SKIPE T1 ;CHECK DONENESS
CALL ORDXW1 ;RECURSE
HLRZ T1,(P) ;GET DIGIT
O$DIGT: ADDI T1,"0" ;ASCIIIZE IT
CAILE T1,"9" ;SEE IF OVERFLOW INTO ALPHAS
ADDI T1,"A"-"9"-1 ;YES--PUT IT THERE
PJRST O$CHAR ;RECURSE OR RETURN
;O$ASCW -- DUMP WORD IN T1 IN ASCII
O$ASCW: MOVE T2,T1 ;POSITION
CALL O$SPEC ;SPACE IF NOT /OMIT
MOVEI T3,5 ;5 CHARS/WORD
O$ASC1: SETZ T1, ;CLEAR
ROTC T1,7 ;GRAB A CHARACTER
CALL O$ASCC ;DUMP THE CHARACTER
SOJG T3,O$ASC1 ;DO ALL 5
POPJ P, ;DONE
O$ASCC: CAIL T1,.CHTAB ;BETWEEN TAB AND CR?
CAILE T1,.CHCRT ;...
CAIN T1,.CHBEL ;IS IT A BELL?
PJRST O$CHAR ;TAB/LF/VT/FF/CR/BELL--GO PRINT IT
TLNE F,FL$OMI ;/OMIT?
JRST O$ASC5 ;YES--HANDLE SLIGHTLY DIFFERENT
CAIL T1," " ;LT A SPACE?
CAILE T1,"Z"+40 ;AND LE A LOWER CASE Z?
O$AQST: MOVEI T1,"?" ;NO--MAKE IT A QUESTION MARK
O$ASC4: PJRST O$CHAR ;OUTPUT IT AND RETURN
;HERE TO SEE IF CONTROL CHARACTER (1-37, EXCEPT A FEW SPECIAL ONES)
O$ASC5: CAIL T1," " ;MAKE A GROSS CHECK
PJRST O$CHAR ;TO ELIMINATE A LARGE PART OF THE ASCII SET
SAVE$ T1 ;ITS A REAL CONTROL CHARACTER--SAVE IT
MOVEI T1,"^" ;GET AN ARROW
CALL O$CHAR ;ZIP IT OUT
RESTR$ T1 ;GET CHARACTER BACK
MOVEI T1,100(T1) ;BY MAJIK IT BECOMES VISIBLE
PJRST O$CHAR ;GO PRINT IT
;O$IASC -- OUTPUT WORD IN T1 AS EIGHT-BIT ASCII
O$IASC: MOVE T2,T1 ;SEE COMMENTS FOR O$ASCW
CALL O$SPEC
MOVEI T3,4 ;ONLY 4 CHARS WORD
O$IAS1: SETZ T1,
ROTC T1,^D8
ANDI T1,177 ;TRIM TO SEVEN BITS
CALL O$ASCC ;OUTPUT THE CHARACTER
SOJG T3,O$IAS1
POPJ P,
;O$BYTW -- OUTPUT WORD IN BYTE FORMAT
O$BYTW: CALL .SAVE3## ;GET A FEW
MOVE P1,T1 ;POSITION WORD
MOVE P2,BYTPTR ;PTR TO LOAD BYTES
MOVE P3,BYTBPW ;GET # BYTES / WORD
CALL O$SPAC ;SPACE OUT
O$BYT1: ILDB T1,P2 ;GET A BYTE
CALL FMTRDX ;OUTPUT IT
SOJLE P3,O$BYT2 ;DONE?
CALL O$SLSH ;NO--SLASH ONE
JRST O$BYT1 ;DO ANOTHER
O$BYT2: SKIPN T2,BYTREM ;WAS THERE A REMAINDER?
POPJ P, ;NO--DONE
CALL O$SLSH ;DO SLASH
DPB T2,[POINT 6,P2,11] ;SET IN THE SIZE
ILDB T1,P2 ;GET THE BYTE
MOVE Q,BYTRDB ;GET WIDTH OF REMAINDER
CALL FMTRDX ;OUTPUT #
MOVE Q,BYTDPB ;RESET Q
POPJ P,
SUBTTL PRINT EBCDIC WORD
;O$EBCW -- OUTPUT EBCDIC WORD IN T1
O$EBCW: MOVE T2,T1 ;COPY WORD
CALL O$SPEC ;SPACE IF NEEDED
MOVEI T3,4 ;4 CPW
O$EBC1: SETZ T1, ;CLEAR RESULT
ROTC T1,^D8 ;PEEL OFF A CHAR
JUMPE T1,O$EBC3 ;IGNORE NULL CHARACTERS
CALL XLTEBC ;XLATE TO ASCII
CALL O$CHAR ;SEND IT
SOSLE EBCKNT ;HAVE WE DONE A LINE?
JRST O$EBC3 ;NO--SEE IF DONE WITH WORD
MOVE T1,S.BLKF ;RESET BLOCK FACTOR
MOVEM T1,EBCKNT ;...
CALL O$CRLF ;NEW LINE PLEASE
O$EBC3: SOJG T3,O$EBC1 ;JUMP IF MORE CHARS THIS WORD
POPJ P,
XLTEBC: CAIL T1,.CHVTB ;LT A VERT TAB?
JRST XLTE.1 ;NO
CAIN T1,5 ;IS IT A 5 (HORIZ. TAB)?
SKIPA T1,[EXP .CHTAB] ;YES--MAKE IT ONE
XLTQST: MOVEI T1,"?" ;FLAG WE DON'T KNOW IT
POPJ P,
XLTE.1: CAIG T1,.CHCRT ;GT A CR?
POPJ P, ;VERT TAB TO CR
CAIL T1,^D129 ;LT LOWER CASE A?
JRST XLTE.4 ;NO--HANDLE ALPHA NUMERICS
PUSH P,T1 ;YES--SAVE CHARACTER
MOVSI T4,-N$ECHR ;SET LOOP
XLTE.2: HLRZ T1,EBCTAB(T4) ;GET EBCDIC FROM TABLE
CAME T1,(P) ;THIS IT?
AOBJN T4,XLTE.2 ;NO--LOOP TO END OR FIND ONE
POP P,T1 ;CLEAR STACK
JUMPGE T4,XLTQST ;JUMP IF WE DON'T KNOW IT
HRRZ T1,EBCTAB(T4) ;YES--GET ASCII EQUIVALENT
POPJ P,
XLTE.4: PUSH P,T1 ;SAVE CHARACTER ON PDL
MOVSI T4,-N$ECH2 ;GET A LOOPER
XLTE.5: HLRZ T1,EBCTB1(T4) ;GET LOWER LIMIT
CAMLE T1,(P) ;IN RANGE?
JRST XLTE.6 ;NO
HRRZ T1,EBCTB1(T4) ;HIGH LIMIT
CAMGE T1,(P) ;IN RANGE?
XLTE.6: AOBJN T4,XLTE.5 ;NO--LOOP
POP P,T1 ;GET CHARACTER BACK
JUMPGE T4,XLTQST ;NOT IN A GOOD RANGE
ADD T1,EBCTB2(T4) ;CONVERT TO ASCII
POPJ P,
EBCTAB: XWD ^D5,.CHTAB ;5 BECOMES A TAB
XWD ^D64," "
XWD ^D74,"]"
XWD ^D75,"."
XWD ^D76,"<"
XWD ^D77,"("
XWD ^D78,"+"
XWD ^D79,"^"
XWD ^D80,"&"
XWD ^D90,"!"
XWD ^D91,"$"
XWD ^D92,"*"
XWD ^D93,")"
XWD ^D94,";"
XWD ^D95,"["
XWD ^D96,"-"
XWD ^D97,"/"
XWD ^D107,","
XWD ^D108,"%"
XWD ^D109,"_"
XWD ^D110,">"
XWD ^D111,"?"
XWD ^D122,":"
XWD ^D123,"#"
XWD ^D124,"@"
XWD ^D125,"'"
XWD ^D126,"="
XWD ^D127,""""
XWD ^D192,"?"
XWD ^D208,":"
XWD ^D255,"_"
N$ECHR==.-EBCTAB
EBCTB1: XWD ^D129,^D137 ;RANGES FOR ALPHA NUMERICS
XWD ^D145,^D153
XWD ^D162,^D169
XWD ^D193,^D201
XWD ^D209,^D217
XWD ^D226,^D233
XWD ^D240,^D249
N$ECH2==.-EBCTB1
EBCTB2: EXP -^D129+"A"-40 ;LOWER CASE
EXP -^D145+"J"-40
EXP -^D162+"S"-40
EXP -^D193+"A"
EXP -^D209+"J"
EXP -^D226+"S"
EXP -^D240+"0"
SUBTTL FORMATTED INTEGER I/O
FMTINT: CALL .SAVE2## ;PRESERVE P1-2
MOVEI P1,-1(Q) ;CHARACTERS/WORD (-1 SO WE DON'T COUNT SPACE)
SETZ P2, ;CLEAR COUNT OF WHAT WE SEND
MOVE T3,T1 ;COPY NUMBER
SKIPGE T3 ;CHECK NEGATIVE
TLOA F,FL$NEG ;YES--SET FLAG
TLZA F,FL$NEG ;NO--CLEAR IT
MOVNS T3 ;IT WAS NEGATIVE--MAKE IT POSITIVE
FMTI.1: IDIVI T3,^D10 ;GET A DIGIT
ADDI T4,"0" ;MAKES IT ASCII
PUSH P,T4 ;SAVE ON PDL
AOJ P2, ;COUNT THE CHARACTER
JUMPN T3,FMTI.1 ;JUMP IF MORE
SUB P1,P2 ;GET THE DIFFERENCE
MOVEI T1," " ;SET IN CASE WE NEED TO PAD
SOJE P1,FMTSGN ;JUMP IF WE FIT OK
CALL O$CHAR
SOJG P1,.-1 ;PAD THEM ALL
FMTSGN: TLZE F,FL$NEG ;SEE IF NEGATIVE?
MOVEI T1,"-" ;YES--GET ONE (ELSE USE THE SPACE)
CALL O$CHAR ;SEND SPACE OR MINUS SIGN
JUMPLE P2,$POPJ ;JUMP IF WE SENT NO DIGITS?
POP P,T1 ;GET ONE BACK
CALL O$CHAR ;SEND IT
SOJG P2,.-2 ;DO ALL WE LEFT ON PDL
POPJ P, ;DONE
;HERE TO DO (PROBABLY) OCTAL DUMP
;UNLESS /RADIX WAS SEEN THEN USE FMTRDX
FMTOCT: TLNE F,FL$RDX ;SEEN /RADIX?
JRST FMTRDX ;YES--DO IT THE SLOW WAY
MOVEI T3,^D12 ;NO--12 OCTAL DIGITS COMING UP
MOVE T2,T1 ;WORD TO T2
CALL O$SPAC ;SPACE OVER ONE
FMTO.1: SETZ T1, ;CLEAR RESULT
LSHC T1,3 ;PEEL OFF A DIGIT
CALL O$DIGT ;OUTPUT IT
SOJG T3,FMTO.1 ;DO 12
POPJ P,
SUBTTL RADIX FORMATTED OUTPUT
;FMTRDX -- DUMP NUMBER IN T1 IN CURRENT RADIX (UNSIGNED)
;FMTR.1 -- DUMP NUMBER IN T1 IN RADIX IN T4
;THANKS TO ROGER UPHOFF FOR IDEA FROM DUMPER
FMTRDX: MOVE T4,USERDX ;CURRENT RADIX
FMTR.1: CALL .SAVE2## ;THESE MUST BE SACRED
MOVEI P1,-1(Q) ;COPY Q
MOVEI P2,-1(Q) ;A COUPLE OF TIMES
RDXLUP: JUMPL T1,RDXADJ ;SPECIAL IF NEGATIVE
JUMPE T1,RADXZR ;WATCH FOR END
IDIV T1,T4 ;PEEL OFF A DIGIT
RDXCON: ADDI T2,"0" ;MAKE IT ASCII
CAILE T2,"9" ;IS IT A DIGIT?
ADDI T2,"A"-"9"-1 ;NO--MOVE UP TO ALPHABETICS
PUSH P,T2 ;SAVE ON PDL
SOJG P1,RDXLUP ;GO FOR MORE
RADXZR: SUB P2,P1 ;GET # OF GOOD DIGITS
MOVEI T1," " ;SPACE OVER ONE
CAIE M,MODBYT ;UNLESS /MODE:BYTE
CALL O$CHAR
JUMPLE P1,RDXNZR ;DO WE NEED ANY LEADING ZEROES?
MOVEI T1,"0" ;YES--GET ONE
CALL O$CHAR ;SEND IT
SOJG P1,.-1 ;DO ALL NEEDED
RDXNZR: JUMPE P2,$POPJ ;JUMP IF NO CHARS ON PDL (# WAS 0)
POP P,T1 ;GET CHAR OFF PDL
CALL O$CHAR ;SEND IT
SOJG P2,.-2
POPJ P,
;HERE IF NUMBER IS NEGATIVE
RDXADJ: TLZ F,FL$TMP ;CLEAR TEMP FLAG
LSHC T1,-1 ;DIVIDE BY TWO
TLNE T2,(1B0) ;WAS LOW ORDER BIT ON?
TLO F,FL$TMP ;YES--REMEMBER THAT
IDIV T1,T4 ;DIVIDE BY RADIX
LSH T1,1 ;MULTIPLY QUOTIENT BY 2
LSH T2,1 ;SAME FOR REMAINDER
TLZE F,FL$TMP ;DID WE SHIFT OUT A ONE?
AOJ T2, ;INCRMEMENT REMAINDER BY ONE
IDIV T2,T4 ;DIVIDE REMAINDER BY RADIX
SKIPE T2 ;IS THERE A QUOTIENT AGAIN?
AOJ T1, ;YES--ADJUST ORIGINAL QUOTIENT
MOVE T2,T3 ;POSITION REMAINDER
JRST RDXCON ;AND CONTINUE
SUBTTL FORMATTED FLOATING POINT OUTPUT
;THANKS TO ROGER UPHOFF FOR ALGORITHM FROM DUMPER
FMTFLO: CALL SAVACS ;SAVE ACS
TLZ F,FL$TMP!FL$NEG!FL$FL2 ;CLEAR FLAGS
SETZB T4,T2 ;CLEAR EXPONENT
JUMPGE T1,EFMT1 ;NUMBER NEGATIVE?
MOVN T1,T1 ;YES,NEGATE IT
TLOA F,FL$NEG ;SET NEGATIVE FLAG
EFMT1: JUMPE T1,EFMT7 ;ESCAPE IF ZERO
HLRZ E1,T1 ;EXTRACT EXPONENT
LSH E1,-9 ;
TLZ T1,777000 ; GET RID OF EXPONENT
ASH T1,^D8 ;PUT BIN POINT BETWEEN BITS 0 AND 1
EFMT2: HRREI E2,-200+2(E1) ;GET RID OF EXCESS 200
IMULI E2,232 ;DEC EXP=LOG10(2)*BIN EXP=.232(OCTAL)*BIN EXP
ASH E2,-^D9 ;GET RID OF 3 OCTAL FRACTION DIGITS
MOVM E3,E2 ;GET MAGNITUDE OF 10 SCALAR
CAIGE E3,PTLEN ;IS THE POWER OF 10 TABLE LARGE ENOUGH
JRST EFMT3 ;YES
JUMPL E2,.+2 ;NO, SCALE F BY LARGEST ENTRY
SKIPA E2,[PTLEN] ;GET ADDRESS OF LARGST POSITIVE POWER
MOVNI E2,PTLEN ;GET ADDR OF LARGEST NEGATIVE POWER
CALL BINEXP ;GET CORRESPONDING BINARY POWER OF TWO
CALL FLODIV ;SCALE BY A LARGE POWER OF TEN
JRST EFMT2 ;DO SECOND SCALING
BINEXP: MOVE E3,E2 ;COPY DECIMAL POWER
LSHC E3,-2 ;DIVIDE BY 4-- EXP10 HAS 4 ENTRIES/WORD
TLNE E4,(1B0) ;WHICH HALF WORD?
SKIPA E3,EXP10(E3) ;RIGHT HALF
HLRZ E3,EXP10(E3) ;LEFT HALF
TLNN E4,(1B1) ;WHICH QUADRANT?
LSH E3,-^D9 ;1ST OR 3RD
ANDI E3,777 ;MASK TO SIZE
POPJ P, ;DONE
;SCALE SINGLE FRACTION BY A POWER OF TEN
FLODIV: JUMPE E2,$POPJ ;IF EXP IS ZERO RETURN
ADD T4,E2 ;PUT SCALE FACTOR IN T4
SUBI E1,-200-1(E3) ;SUB BIN POWER OF 10 EXP FROM BIN
; FRACTION EXP,REMOVE EXCESS 200;
; -1 ALLOWS FOR ASHC,LH OF E1 IS GARBGE
MOVEI T2,0 ;CLEAR LOW WORD
CAMGE T1,HITEN(E2) ;WILL DIVIDE CAUSE A DIVIDE CHECK?
SOJA E1,.+2 ;NO, ALLOW FOR NOT DOING ASHC
ASHC T1,-1 ;YES, SCALE FRACTION
DIV T1,HITEN(E2) ;SCALE BY A POWER OF TEN
POPJ P, ;RETURN
EFMT3: CALL BINEXP ; GET BIN EXP THAT MATCHES DEC EXP
CAILE E3,(E1) ;IS THIS POWER OF TEN .GT. FRACTION?
JRST EFMT4 ;YES, IN THE EXPONENT
CAIN E3,(E1) ;MAYBE.
CAML T1,HITEN(E2) ;EXPONENTS ARE THE SAME COMPARE FRACT
AOJA E2,EFMT3 ;POWER OF TEN IS ONE TOO SMALL
EFMT4: CALL FLODIV ;POWER OF TEN O.K., DO SCALING
ASH T1,-200(E1) ;SCALE FRACTION RIGHT
EFMT7: PUSH P,T1 ;PRESERVE T1
CALL O$SPAC ;OUTPUT A SPACE
POP P,T1 ;GRAB IT BACK
MOVEI P1,^D14 ;LOAD FIELD WIDTH
MOVEI P2,^D8 ;NO. OF DECIMAL PLACES
MOVE E2,P2 ;
MOVE E1,P ;MARK BOTTOM OF STACK
PUSH P,[0] ;ALLOW FOR POSSIBLE OVERFLOW
SKIPGE E3,E2 ;GET NUMBER OF DIGITS
MOVEI E3,0 ;IF NEGATIVE ADD .5 TO FRACTION
ADD T1,RNDHGH(E3) ;ROUND TO CORRECT NUMBER OF DIGITS
ADDI T1,1 ;ROUND A LITTLE MORE
TLZN T1,(1B0) ;DID CARRY PROPAGATE TO BIT 0
AOS (P) ;YES, PROPAGATE CARRY TO LEADING 0
EFMT11: MULI T1,^D10 ;MULTIPLY BY 10
PUSH P,T1 ;STORE DIGIT ON STACK
MOVE T1,T2 ;SET UP NEW FRACTION
SOJG E3,EFMT11 ;
MOVEI E3,2(E1) ;GET BASE OF STACKED DIGITS
MOVE E4,1(E1) ;
JUMPE E4,EFMT14 ;DID OVERFLOW OCCUR?
SUBI E3,1 ;YES, MOVE BACK BASE POINTER
ADDI T4,1 ;NO, INCREMENT EXPONENT
EFMT14: MOVE E5,P1 ;GET WIDTH
SUBI E5,2(P2) ;SIGN,POINT,AND CHARS FOLLOWING
SUBI E5,4 ;ALLOW FOR E+00
FIT: CAIG E5,1 ;SPACE FOR LEADING BLANKS?
JRST GO2ERF ;NO LEADING BLANKS
CALL O$SPAC ;OUTPUT ONE
SOJA E5,FIT ;UNTIL ENOUGH
GO2ERF: JUMPN E2,.+2 ;CHECK FOR NO SIGNIFICANT DIGITS
TLO F,FL$FL2 ;ENSURE ZEROS WILL BE PRINTED
CALL SIGN ;OUTPUT SIGN
JUMPLE E5,EFORM2 ;NO SPACE LEFT FOR "0"
CALL ZERO ;OUTPUT ZERO
EFORM2: CALL O$DOT ;AND DECIMAL POINT
CALL DIGIT ;OUTPUT FRACTIONAL DIGIT
SOJN E2,.+2 ;TOTAL COUNT EXPIRED?
TLO F,FL$FL2 ;YES, FLAG DIGITS EXHAUSTED
SOJG P2,.-3 ;RETURN IF MORE DIGITS
MOVEI T1,"E" ;
CALL O$CHAR ;OUTPUT E
JUMPGE T4,EFORM5 ;ALWAYS + IF ZERO
TLO F,FL$NEG ;TRANSFER EXPONENT SIGN
EFORM5: CALL PLUS ;PRINT SIGN
MOVEI E5,2 ;AND SET DIGIT COUNT
MOVE P,E1 ;RESTORE STACK POINTER
MOVM T1,T4 ;GET EXPONENT
JRST OUTP1 ;
;OUTPUT
ZERO: MOVEI T1,"0" ;GET A ZERO
PJRST O$CHAR ;PRINT IT
PLUS: SKIPA T1,[EXP "+"] ;LOAD UP A PLUS SIGN
SIGN: MOVEI T1," " ;
SIGN1: TLZE F,FL$NEG ;IS SIGN NEGATIVE?
MOVEI T1,"-" ;YES, SET IT
PJRST O$CHAR ;PRINT IT
DIGIT: MOVEI T1,"0" ;SET DIGIT TO ZERO
TLNE F,FL$FL2 ;DO WE NEED TO PRINT A ZERO?
PJRST O$CHAR ;YES--PRINT IT
MOVE T1,(E3) ;GET A DIGIT
ADDI T1,"0" ;SET TO ASCII
AOJA E3,O$CHAR ;PRINT IT
OUTP1: MOVEI T4,1 ;INITIALIZE DIGIT COUNT
OUTP2: IDIVI T1,^D10 ; DIVIDE FRACTION BY TEN
PUSH P,T2 ;SAVE DIGIT
JUMPE T1,OUTP3 ;IS FRACTION ZERO YET?
AOJA T4,OUTP2 ;NO, DO ALL DIGITS
OUTP3: CAML T4,E5 ;YES, ANY LEADING SPACES?
JRST OUTP4 ;NO
CALL ZERO ;YES, PRINT ONE
SOJA E5,OUTP3 ;FINISH THEM
OUTP4: POP P,T1 ;GET A DIGIT
ADDI T1,"0" ;SET TO ASCII
CALL O$CHAR ;PRINT IT
SOJN T4,OUTP4 ;DO ALL OF THEM
CALL RESACS ;RESTORE ACS
POPJ P, ;DONE
SUBTTL FLOATING POINT OUTPUT TABLES
RNDHGH: 600000,,000000
414631,,463146
401217,,270243
400101,,422335
400006,,433342
400000,,517426
400000,,041433
400000,,003265
400000,,000253
400000,,000021
400000,,000001
400000,,000000
400000,,000000
400000,,000000
400000,,000000
400000,,000000
400000,,000000
400000,,000000
400000,,000000
PTLEN=24
274712,,041444
354074,,451755
223445,,672164
270357,,250621
346453,,122766
220072,,763671
264111,,560650
341134,,115022
214571,,460113
257727,,774136
333715,,773165
211340,,575011
253630,,734214
326577,,123257
206157,,364055
247613,,261070
321556,,135307
203044,,672274
243656,,135307
314631,,463146
HITEN: 200000,,000000
240000,,000000
310000,,000000
372000,,000000
234200,,000000
303240,,000000
364110,,000000
230455,,000000
276570,,200000
356326,,240000
225005,,744000
272207,,355000
350651,,224200
221411,,634520
265714,,203644
343277,,244615
216067,,446770
261505,,360566
336026,,654723
212616,,214044
255361,,657055
076101,,105110
113117,,122125
131134,,137143
146151,,155160
163167,,172175
EXP10: 201204,,207212
216221,,224230
233236,,242245
250254,,257262
266271,,274300
303000,,000000
SUBTTL FILE READING ROUTINES
;CALL GETBUF TO GET NEXT BUFFER
;GETBUF HANDLES THE DIFFERENT MODES AND SETS UP W AS AN AOBJN WORD TO THE
;DATA
GETBUF: TLNE F,FL$FOR ;FORTRAN BINARY?
JRST RDFORT ;YES--GO TO IT
IFN FT$PHX,<
TLNN DC,(DV.MTA) ;MTA INPUT?
TLNN F,FL$PHY ;NO--/IREAD?
CAIA ;MTA OR DIR AND NOT /IREAD
JRST RDPHYX ;DIR DEV AND /IREAD
>;END IFN FT$PHX
CALL XCTIO ;GET A BUFFER FULL
IN INPC, ;
POPJ P, ;END OF FILE
HRRZ W,IBHR+.BFPTR ;START THE AOBJ WORD
MOVEI W,1(W) ;POINT AT DATA
MOVN T1,IBHR+.BFCTR ;GET WORD COUNT
HRL W,T1 ;FINISH W
JRST $POPJ1 ;RETURN
IFN FT$PHX,<
RDPHYX: CALL .SAVE2## ;NEED A COUPLE OF REGISTERS
PHYX.0: CALL INPWRD ;GET IREAD WORD COUNT
POPJ P, ;EOF
JUMPE T1,PHYX.0 ;NO SUCH THING AS ZERO WORD COUNT
TLNE T1,-1 ;OR MORE THAN 2**18 WORDS/RECORD
JRST E$$IFU ;**IREAD FILE IS MESSED UP
CAMLE T1,BUFSIZ ;MUST BE LESS THAN THIS
JRST PHXLRG ;NO--TELL ABOUT LARGE RECORD AND FINISH UP
PHYX.4: MOVNS T1 ;NEGATE IT
HRLZ T2,T1 ;FORM AOBJ WORD
HRR T2,FORADR ;POINT TO THE BUFFER
MOVE W,T2 ;W IS SETUP NOW
MOVN P1,T1 ;GET WORD COUNT AS POSITIVE
HRRZ P2,T2 ;GET BUFFER ADDRESS
PHYX.2: SKIPLE T4,IBHR+.BFCTR ;GET WORD COUNT--ARE ANY WORDS LEFT?
JRST PHYX.3 ;YES--GO USE THEM
CALL XCTIO ;NO--NEED A BUFFER
IN INPC, ;XCT'D
SKIPA ;EOF ALREADY?
JRST PHYX.2 ;PICK UP THE WORD COUNT
ERROR. EF$FTL,EBE,<EOF BEFORE END OF IREAD RECORD>
PHYX.3: CAMLE T4,P1 ;ARE THERE MORE THAN WHAT WE NEED?
MOVE T4,P1 ;YES--ONLY USE WHAT WE NEED
MOVS T1,IBHR+.BFPTR ;BEGIN THE BLT CTL WORD
HRRI T1,-1(P2) ;FORM OTHER HALF (-1 FOR NEXT INSTR)
AOBJP T1,.+1 ;EVERYTHING IS OFF BY ONE
ADDM T4,IBHR+.BFPTR ;INCREMENT PTR TO NEXT FREE WORD
ADDM T4,P2 ;ALSO ADJUST FORADR PTR
MOVNS T4 ;MAKE COUNT NEGATIVE
ADDM T4,P1 ;DECREMENT WORD REQUIRED
ADDM T4,IBHR+.BFCTR ;DECREMENT BUFFER TOTAL
BLT T1,-1(P2) ;XFR THE WORDS
JUMPG P1,PHYX.2 ;JUMP IF NOT FINISHED WITH RECORD
JRST $POPJ1 ;DONE
E$$IFU: ERROR. EF$FTL,IFU,<IREAD FILE MESSED UP>
;HERE WHEN RECORD TOO LARGE READING DISK IREAD FILE
PHXLRG: CALL LRGERR ;TELL USER AND DUMP FILE ABOUT IT
MOVN T2,BUFSIZ ;GET - MAX BUFFER SIZE
ADD T2,T1 ;COMPUTE # WORDS EXTRA IN RECORD
SAVE$ T2 ;SAVE WHILE WE COPY REST OF RECORD
MOVE T1,BUFSIZ ;SETUP T1 TO MAX RECORD SIZE
CALL PHYX.4 ;COPY FIRST PART (FILL FORBUF)
JRST E$$IFU ;SNH
RESTR$ T2 ;COMPUTE # WORDS WE MUST SKIP
PHXL.2: CALL INPWRD ;GET ONE
JRST E$$IFU ;SNH
SOJG T2,PHXL.2 ;EAT THEM ALL
JRST $POPJ1 ;RETURN WITH ALL THAT WE COULD EAT
>;END IFN FT$PHX
;CALL HERE TO REPORT RECORD TOO LARGE TO TTY AND DUMP FILE
;T1 CONTAINS SIZE OF RECORD THAT WAS TOO LARGE
LRGERR: CALL FRCTYO ;FORCE TTY OUTPUT (SO CRLF IS CORRECT)
CALL .TCRLF## ;NEW LINE TO TTY (.TCRLF PRESERVES T1!)
CALL RTLERR ;REPORT RECORD IN ERROR TO TTY
TRNE DC,(DV.TTY) ;IF TTY OUTPUT FILE
POPJ P, ;DON'T TELL HIM (HER) TWICE
SAVE$ T1 ;SAVE RECORD SIZE
CALL O$CRLF ;FIRST SET TO NEW LINE
CALL O$CRLF ;AND SKIP ONE SO MESSAGE STANDS OUT
MOVEI T1,O$CHAR ;SET MY OUTPUT ROUTINE
CALL .TYOCH## ;WITH .TOUTS
EXCH T1,(P) ;SAVE OLD ROUTINE, RESTORE SIZE
SETOM ERRTYX ;FLAG EHNDLR NOT TO SWITCH OUTPUTS
CALL RTLERR ;REPORT LARGE RECORD TO DUMP FILE
XCHTYO: EXCH T1,(P) ;...
CALL .TYOCH## ;RESTORE SCANS OUTPUT
JRST TPOPJ ;RESTORE T1 AND RETURN
RTLERR: WARN. EF$DEC!EF$NCR,RTL,<RECORD TOO LARGE - >
CALL TYFREC ;TYPE FILE AND RECORD LOCATION
PJRST .TCRLF## ;NEW LINE AND EXIT
TYFREC: SAVE$ T1 ;SAVE SIZE
STRNG$ < - FILE >
MOVE T1,FILE
CALL .TDECW##
STRNG$ < RECORD >
MOVE T1,RECORD
AOJ T1, ;REALLY C(RECORD)+1
CALL .TDECW##
PJRST TPOPJ ;RESTORE SIZE AND RETURN
;CALL HERE TO GET ONE WORD FROM INPUT FILE
;CPOPJ1 WITH WORD IN T1 OR CPOPJ IF EOF
INPWRD: SOSGE IBHR+.BFCTR ;ANY WORDS AT ALL?
JRST INPW.1 ;NO--GET SOME
ILDB T1,IBHR+.BFPTR ;YES--GET IT
JRST $POPJ1
INPW.1: CALL XCTIO ;GET A BUFFER
IN INPC,
POPJ P, ;EOF
JRST INPWRD ;GET A WORD NOW
;CALL HERE TO FORCE OUTPUT TO TTY IF OUTPUT OPEN AND TTY IS OUTPUT FILE
FRCTYO: TLNN F,FL$OPN ;OUTPUT FILE OPEN?
POPJ P, ;NO--DONT GET UNASSIGNED CHANNEL IO
TRNE DC,(DV.TTY) ;TTY DUMP?
OUTPUT OUTC, ;YES--MAKE MESSAGE APPEAR IN RIGHT PLACE
POPJ P,
SUBTTL READ FORTRAN BINARY RECORDS
RDFORT: CALL .SAVE1## ;NEED A REGISTER
SETZ W, ;CLEAR WORD COUNT
MOVE P1,FORADR ;POINT AT THE ARRAY
TLZ F,FL$TMP!FL$FL2 ;FL$TMP IS THE "SAW TYPE 1 LSCW" FLAG
;FL$FL2 IS THE "RECORD TOO LARGE" FLAG
RFOR.1: CALL INPWRD ;GET A WORD
POPJ P, ;END OF FILE
RFOR.3: TLNN T1,CW$ANY ;IS IT AN LSCW
JRST FORSRC ;NO--GO FIND ONE
TLNN T1,CW$1O3 ;TYPE 1 OR 3?
JRST FORCW2 ;NO--TYPE 2
TLNE T1,CW$TY3 ;TYPE 3?
JRST FORCW3 ;YES
;HERE TO DO FORTRAN TYPE 1 LSCW
FORCW1: TLO F,FL$TMP ;FLAG WE SAW ONE
FORCON: MOVE T2,T1 ;COPY LSCW
MOVEI T1,-1(T1) ;GET DATA WORD COUNT
ADD W,T1 ;UPDATE WORD COUNT
TLNE F,FL$FL2 ;ARE WE IN A LARGE RECORD?
JRST RFOR.5 ;YES--SKIP AHEAD
CAMLE W,BUFSIZ ;ROOM IN BUFFER?
JRST FORLRG ;NO--GO FIXUP
HRL T1,IBHR+.BFPTR ;GET LH OF BLT
HRRI T1,-1(P1) ;RH--(-1 SO WE CAN AOBJN)
AOBJN T1,.+1 ;MAKE IT RIGHT
ADD P1,T2 ;COMPUTE END OF BLT
RFOR.4: BLT T1,-1(P1) ;MOVE WORDS
RFOR.5: MOVEI T1,-1(T2) ;COUNT DATA WORDS EATEN
ADDM T1,IBHR+.BFPTR
MOVNI T1,-1(T2) ;...
ADDM T1,IBHR+.BFCTR
JRST RFOR.1 ;CONTINUE
FORCW2: TLNN F,FL$TMP ;SEEN A TYPE 1?
JRST FORSRC ;NO--GO FIND ONE
JRST FORCON ;YES--CONTINUE COPYING RECORD
FORCW3: TLZN F,FL$FL2 ;WAS RECORD TOO LARGE?
JRST FOR3.X ;NO--EXIT GRACEFULLY
MOVE T1,W ;YES--GET RECORD SIZE
CALL LRGERR ;REPORT LARGE RECORD
HRRZ W,BUFSIZ ;SET TO RETURN ONLY MAX
FOR3.X: MOVN W,W ;BEGIN TO COMPUTE AOBJN TO FORADR
HRLZS W
HRR W,FORADR ;NOW WE ARE DONE
JRST $POPJ1 ;SKIP BACK
FORSRC: CALL INPWRD ;GET A WORD
ERROR. EF$FTL,IFF,<INCORRECTLY FORMATTED FORTRAN FILE>
TLNN T1,776000 ;ANY LS?
TLNN T1,1000 ;TYPE 1?
JRST FORSRC ;NOPE
MOVE T2,BUFSIZ ;YES--GET /BUFSIZ
CAIGE T2,(T1) ;CAN IT BE?
JRST FORSRC ;NOPE
HRRZ T2,IBHR+.BFCTR ;GET WHAT IS LEFT IN BUFFER
CAIE T2,-1(T1) ;THE SAME?
JRST FORSRC ;NO
HRRZ T2,IBHR+.BFPTR ;GET PTR
ADDI T2,(T1) ;COMPUTE WHERE NEXT LSCW IS
MOVE T2,@T2 ;GET IT
TLNN T2,774000 ;IS IT AN LSCW?
TLNN T2,CW$ANY ;IS IT ANY LSCW?
JRST FORSRC ;NOT YET
JRST RFOR.3 ;YES--GO PROCESS IT
;HERE WHEN WE SEE THAT THE RECORD IS TOO LARGE
FORLRG: TLO F,FL$FL2 ;FLAG FOR FORCW3 THAT RECORD IS TOO LARGE
HRL T1,IBHR+.BFPTR ;GET SET TO MOVE WHAT WE CAN FROM THIS RECORD
HRRI T1,-1(P1) ;...
AOBJN T1,.+1 ;FIX PTR
HRRZ P1,FORADR ;COMPUTE END OF BUFFER
ADD P1,BUFSIZ ;...
JRST RFOR.4 ;GO MOVE WHAT WE CAN AND SKIP REST
SUBTTL POSITIONING FUNCTIONS
D$SKP: TLNE F,FL$OUT ;WHICH SIDE?
TLNN DC,(DV.DIR) ;INPUT--IS THIS DIRECTORY?
TRNE DC,(DV.DIR) ;OUTPUT--IS THIS DIRECTORY?
JRST SKPDIR ;DIRECTORY--GO SKIP IT
TLNE F,FL$FOR ;MTA--IS IT FORTRAN SKIP?
JRST SKMFOR ;YES--DO IT
ADDM P1,FILE ;INCREMENT FILE COUNT
ADDM P2,RECORD ;AND RECORD COUNT
MOVE T1,[MTSKF.] ;GET FILE MTAPE
MOVE T2,[MTSKR.] ;AND RECORD MTAPE
DSKP.G: CALL SETIOC ;SET I/O CHANNELS IN
CALL SKPFLR ;DO THEM
JRST DMPLUP ;CONTINUE
;HERE TO SKIP FORTRAN BINARY ON MTA
SKMFOR: MOVE T1,[MTSKF.] ;SKIP FILES
CALL SETIOC ;SETUP FOR IT
SKMF.1: XCT T1 ;SKIP ONE FILE
XCT T3 ;WAIT FOR IT
AOS FILE ;COUNT THE FILE
SOJG P1,SKMF.1 ;DO ALL NEEDED
JRST SKDFOR ;GO SKIP RECORDS AND FINISH UP
SETIOC: TLNE F,FL$OUT ;INPUT OR OUTPUT?
JRST SETI.1 ;INPUT
TLO T1,(Z OUTC,) ;SET IN CHANNEL
TLO T2,(Z OUTC,) ;...
MOVE T3,[MTWAT. OUTC,] ;SET INSTR TO WAIT ON I/O
POPJ P,
SETI.1: TLO T1,(Z INPC,) ;INPUT CHANNEL
TLO T2,(Z INPC,)
MOVE T3,[MTWAT. INPC,] ;INSTR TO WAIT ON I/O
POPJ P,
SKPFLR: JUMPLE P1,SKPL.1 ;JUMP IF NO FILE ACTION
SKPL.0: XCT T1 ;DO IT
XCT T3 ;WAIT FOR OP TO FINISH
SOJG P1,SKPL.0 ;ALL REQUESTED TIMES
SKPL.1: JUMPLE P2,$POPJ ;JUMP IF NO RECORDS
SKPL.2: XCT T2
XCT T3 ;WAIT FOR I/O
SOJG P2,SKPL.2
POPJ P,
SKPDIR: JUMPG P1,E$$SFI ;SKIPPING FILES IS HIGHLY ILLEGAL
TLNE F,FL$FOR!FL$PHY ;FORTRAN OR PHYSICS?
JRST SKDFOR ;YES
SKIPN T1,RECORD ;WHERE ARE WE NOW?
MOVEI T1,1 ;MUST BE AT THE BEGINNING
ADDI T1,-1(P2) ;COMPUTE NEW RECORD
CAMLE T1,IFILSZ ;DON'T USETI PAST EOF
MOVE T1,IFILSZ ;...
MOVEM T1,RECORD ;...
USETI INPC,1(T1) ;SET TO READ IT
CALL CLRUSE ;CLEAR USE BITS FOR FRESH READ
JRST DMPLUP ;CONTINUE EXECUTING FNS
SKDFOR: TLO F,FL$MNP ;FLAG MANIPULATING
SKDF.1: CALL GETBUF ;READ A RECORD
JRST DMPEND ;END IT ALL
AOS RECORD ;COUNT THE RECORD
SOJG P2,SKDF.1 ;DO ALL REQUESTED
TLZ F,FL$MNP ;NOT MANIPULATING ANY MORE
JRST DMPLUP ;CONTINUE
E$$SFI: ERROR. EF$FTL,SFI,<SKIP/BACKSPACE FILES ILLEGAL ON DIRECTORY DEVICE>
D$BSP:
TLNE F,FL$OUT ;INPUT OR OUTPUT?
TLNN DC,(DV.DIR) ;INPUT--IS IT A DIR DEV?
TRNE DC,(DV.DIR) ;OUTPUT--IS IT A DIR DEV?
JRST BSPDIR ;DIR DEV--GO DO IT
TLNE F,FL$FOR ;IS IT /FORTRAN?
JRST E$$SFM ;CANT
MOVN T1,P1 ;UPDATE FILE AND RECORD
ADDM T1,FILE ;COUNTS
MOVN T1,P2 ;...
ADDM T1,RECORD
MOVE T1,[MTBSF.] ;SETUP OPS
MOVE T2,[MTBSR.]
JRST DSKP.G ;GO DO IT AND RETURN
E$$SFM: ERROR. EF$FTL,SFM,<CANT BACKSPACE MTA WITH /FORTRA>
BSPDIR: JUMPG P1,E$$SFI ;CAN'T SKIP MULTIPLE FILES ON DIR DEV
TLNN F,FL$OUT ;NOR ON OUPTUT DEVICE
JRST E$$BSO ;GO DIE
SKIPN T1,RECORD ;WHERE ARE WE?
MOVEI T1,1 ;DON'T KNOW--MUST BE AT START OF FILE
SUB T1,P2 ;COMPUTE NEW POSITION
SKIPG T1 ;PAST BEGINNING OF FILE?
MOVEI T1,1 ;YES--SET FOR FIRST RECORD
TLNE F,FL$FOR!FL$PHY ;FORTRAN OR PHYSICS?
JRST BSPFOR ;YES--GO HANDLE IT
USETI INPC,(T1) ;POSITION MYSELF THERE
SOS T1 ;ONE LESS TO STORE IN RECORD
MOVEM T1,RECORD ;WILL GET UPDATE AT RECHDR
CALL CLRUSE ;CLEAR USE BITS
JRST DMPLUP
E$$BSO: ERROR. EF$FTL,BSO,<CANT BACKSPACE DISK OUTPUT>
BSPFOR: MOVE P2,T1 ;POSITION # RECS TO SKIP
USETI INPC,1 ;POSITION TO FILE START
CALL CLRUSE ;CLEAR USE BITS
SETZM RECORD ;RESET
SOJLE P2,DMPLUP ;JUMP IF WE ARE IN PROPER POSITION
JRST SKDFOR ;NO--GO SKIP SOME RECORDS
;HERE TO PROCESS /REWIND
D$REW: TLNN F,FL$OUT ;OUTPUT SIDE?
TRNE DC,(DV.MTA) ;YES--IS IT A MAGTAPE
CAIA ;INPUT DEVICE OR OUTPUT IS MTA
ERROR. EF$FTL,CRD,<CANNOT REWIND DISK OUTPUT>
SETZM FILE ;CLEAR FILE AND RECORD
SETZM RECORD ;...
TLNE F,FL$OUT ;INPUT SIDE?
TLNN DC,(DV.DIR) ;A DIRECTORY DEVICE?
JRST REWMTA ;OUTPUT OR INPUT NOT DIRECTORY
USETI INPC,1 ;SET TO READ FIRST BLOCK
CALL CLRUSE ;CLEAR THE USE BITS IN THE RING
JRST DMPLUP ;DO NEXT COMMAND
REWMTA: MOVE T1,[MTREW.] ;SET UP FUNCTION
TLNE F,FL$OUT ;INPUT OR OUTPUT?
TLOA T1,(Z INPC,) ;INPUT SIDE
TLO T1,(Z OUTC,) ;OUTPUT SIDE
XCT T1 ;REWIND THE DEVICE
JRST DMPLUP ;NEXT COMMAND
D$RIB: TLNE F,FL$OUT ;MUST BE INPUT SIDE
TLNN DC,(DV.DSK) ;AND ON THE DSK
ERROR. EF$FTL,RIB,</RIB ILLEGAL ON OUTPUT OR ILLEGAL DEVICE FOR /RIB>
USETI INPC,0 ;POSITION TO READ THE RIB
CALL CLRUSE ;CLEAR THE USE BITS
JRST DMPLUP ;BACK FOR MORE
D$ONL: JUMPL P1,E$$ONL ;CHECK FOR BAD NUMBERS
JUMPL P2,E$$ONL ;..
MOVE T1,P1 ;NOW SEE IF /ONLY WITH NO ARGS
TSO T1,P2 ;WHICH MEANS TO TURN OFF THE MODE
JUMPE T1,D$ONLF ;SO GO DO THAT
CAMGE P2,P1 ;END MUST BE AT LEAST AS BIG AS BEGINNING
JRST E$$ONL ;LOOSE
SKIPN P1 ;MAKE SURE WE HAVE AT LEAST ONE
MOVEI P1,1 ;...
MOVEM P1,ONLYLO ;SAVE LOW LIMIT
MOVEM P2,ONLYHI ;AND HIGH LIMIT
TLOA F,FL$OLY ;TELL DUMPIT WE ARE ONLY DUMPING PARTIAL REC
D$ONLF: TLZ F,FL$OLY ;HERE WE TURN OFF IF /ONLY OR /ONLY:0
JRST DMPLUP ;CONTINUE FUNCTIONS
E$$ONL: ERROR. EF$FTL,OIS,</ONLY INCORRECTLY SPECIFIED>
CLRUSE: WAIT INPC, ;WAIT FOR THINGS TO SETTLE OUT
HRRZ T1,IBHR+.BFADR ;START AT THE BEGINNING
HRRZ T2,T1 ;COPY TO MOVE AROUND
MOVSI T3,(BF.IOU) ;BIT TO CLEAR
CLRU.1: ANDCAM T3,(T2) ;CLEAR THE USE BIT
HRRZ T2,(T2) ;MOVE TO NEXT
CAMN T2,T1 ;DONE?
JRST CLRU.1 ;NO
MOVSI T3,(BF.VBR) ;YES--NOW FIX BUFFER HEADER
IORM T3,IBHR+.BFADR
POPJ P, ;ALL DONE
SUBTTL ATTEND TO TTY INPUT WHILE RUNNING
;CHKTTY -- SEE IF A COMMAND TYPED WHILE RUNNING
;CALL: CALL CHKTTY
; *SAID TO KILL*
; *KEEP GOING*
CHKTTY: TLNE F,FL$ITY ;/IFTYP
INCHRS T1 ;YES--GET CHAR IF THERE
JRST $POPJ1 ;NO /IFTYP OR NO CHAR
CLRBFI ;EAT WHAT MIGHT BE LEFT
MOVSI T2,-N$IFTC ;AOBJN COUNTER
CAME T1,IFTCMD(T2) ;THIS IT?
AOBJN T2,.-1
JUMPL T2,@IFTDSP(T2) ;JUMP IF FOUND A GOOD ONE
MOVEI T1,.CHBEL ;NO--GET A BELL
AOS (P) ;SET TO SKIP BACK
PJRST .TCHAR## ;TYPE BELL AND CONTINUE
IFTCMD: EXP "I" ;IGNORE IFTYP
EXP "K" ;KILL COMMAND
EXP "P" ;PAUSE COMMAND
N$IFTC==.-IFTCMD
IFTDSP: EXP IFTIGN ;IGNORE
EXP $POPJ ;KILL
EXP CHKT.P ;PAUSE
IFTIGN: TLZ F,FL$ITY ;CLEAR /IFTYP
PJRST $POPJ1 ;SKIP BACK
CHKT.P: CALL .TCRLF## ;NEW LINE
INFO. 0,PTC,<PAUSING--TYPE ANY CHARACTER TO CONTINUE>
AOS (P) ;SKIP BACK
GCHNWL: CLRBFI ;CLEAR INPUT
INCHRW T1 ;GET A CHARACTER
CLRBFI ;EAT REAST
OUTSTR [ASCIZ/
/]
POPJ P, ;RETURN
SUBTTL OPEN I/O CHANNELS
;OPENIO
;CALL: MOVEI T1,<FDB ADDR>
; CALL OPENIO
; CAI CHANNEL,BUFADR ;@ IF OUTPUT, (MODE)
; *ALL IS WELL RETURN* ;ABORT IF FAIL
OPENIO: HRL T1,0(P) ;REMEMBER CALLER
AOS 0(P) ;SKIP ARGS ON RETURN
CALL .SAVE3## ;PRESERVE REGISTERS
MOVS P1,T1 ;COPY ARGUMENTS
MOVE P2,(P1) ;GET REST OF THEM
STORE T1,OPNBLK,LKPBLK+.RBTIM,0 ;CLEAR ANY RESIDUE IN BLOCK
MOVSI T1,.FXLEN ;SETUP FOR .STOPB
HLR T1,P1 ;...
MOVEI T2,OPNBLK ;
SKIPA T3,.+1
.RBTIM+1,,LKPBLK
MOVEI T4,PTHBLK
CALL .STOPB## ;CONVERT TO OPEN/LOOKUP BLOCKS
JRST WLDERR ;NO WILDCARDING!
MOVEI T1,.RBTIM ;SETUP COUNT
MOVEM T1,LKPBLK+.RBCNT
LDB T1,[POINT 4,P2,17] ;GET MODE
MOVEM T1,OPNBLK ;STORE IN OPEN BLOCK
HRRZ T1,P2 ;BUFFER HEADER ADDRESS
TLNE P2,ATSIGN ;READ OR WRITE?
MOVSS T1 ;WRITING, POSITON FOR IT
MOVEM T1,OPNBLK+.OPBUF;STORE
LDB P3,[POINT 4,P2,12] ;GET I/O CHANNEL
LSH P3,5 ;POSITION
MOVSS P3 ;IN CHANNEL POSITION
MOVE T1,[OPEN OPNBLK];FORM INSTR
OR T1,P3 ;FINISH
XCT T1 ;TRY TO OPEN DEVICE
JRST OPENER ;CAN'T--BOMB OUT
MOVE T1,P3 ;REGET I/O CHANNEL
TLNE P2,ATSIGN ;READ/WRITE?
TLOA T1,(ENTER) ;WRITE
TLO T1,(LOOKUP) ;READ
HRRI T1,LKPBLK ;COMPLETE INSTR
XCT T1 ;FIND/WRITE THE FILE
JRST LKENER ;CAN'T
POPJ P, ;DONE
;OPENIO ERRORS
OPENER: HLRZ T1,P1 ;COPY FDB ADDR
ERROR. EF$FTL!EF$FIL,COD,<CAN'T OPEN DEVICE, FILE >
WLDERR: HLRZ T1,P1 ;GET FDB
ERROR. EF$FTL!EF$FIL,WFI,<WILDCARD FILESPEC ILLEGAL, FILE >
LKENER: HRRZ T1,LKPBLK+.RBEXT;GET FAIL CODE
ERROR. EF$ERR!EF$OCT!EF$NCR,LER,<LOOKUP/ENTER ERROR(>
STRNG$ <) FILE >
HLRZ T1,P1
CALL .TFBLK## ;TYPE SCAN BLOCK
CALL .TCRLF## ;NEW LINE
JRST ERRFTL ;GO DIE
SUBTTL XCTIO EXECUTES IN/OUT UUO WITH ERROR HANDLING
;XCTIO
;CALL: CALL XCTIO
; <INSTR TO XCT> ;IN/OUT UUO
; *EOF/EOT RETURN*
; *NORMAL RETURN*
XCTIO: XCT @0(P) ;DO THE INSTR
JRST $POPJ2 ;OK--SKIP 2 AND RETURN
SAVE$ T1 ;OOPS--SAVE T1
MOVE T1,@-1(P) ;GET INSTR WE FAILED ON
AOS -1(P) ;SKIP INSTR ON WAY BACK
XCTIOE: AND T1,[17B12] ;ERROR--GET THE CHANNEL
PUSH P,T3 ;SAVE T3 A SECOND
MOVE T3,T1 ;GET CHANNEL
OR T3,[WAIT] ;WAIT FOR I/O TO CEASE
XCT T3 ;DO IT NOW
POP P,T3 ;GET T3 BACK
OR T1,[GETSTS T2] ;GET ERRROR BITS
XCT T1
TRNE T2,IO.EOF!IO.EOT;END OF SOMETHING?
JRST TPOPJ ;YES
EXCH T1,T2 ;NO--GET BITS IN RIGHT PLACE, SAVE I/O INSTR
HRR T2,T1 ;PUT BITS IN THE INSTR
TRZ T2,IO.ERR ;CLEAR ERROR BITS
TLZ T2,002000 ;BY MAJIK, A GETSTS BECOMES A SETSTS
XCT T2 ;CLEAR THE ERROR BITS
LDB T2,[POINT 4,T2,12] ;GET IO CHANNEL
SAVE$ T2 ;SAVE CHAN ON PDL
CAIE T2,INPC ;INPUT?
JRST XCTI.1 ;NO--ALWAYS MESSAGE THEM
TLNN F,FL$MNP ;READING TO SKIP?
SKIPLE FLNTRY ;OR NOT /NORETRY
JRST ETPJ1 ;ONE OR THE OTHER GETS NO MESSAGE
MOVE T2,FLERR ;GET /ERROR VALUE
CAIN T2,ERRIGN ;IS IT /ERROR:IGNORE?
JRST ETPJ1 ;YES--DON'T GRIPE
XCTI.1: RESTR$ T2 ;GET CHAN BACK
CALL TELIOE ;TELL OF THE ERROR
SKIPLE T1,FLERR ;GET /ERROR:ARG FLAG
CAIE T1,ERRQUE ;WAS IT /ERROR:QUERY?
JRST XIOCON ;NO--TELL CONTINUING AND EXIT THIS CALL
JRST GEROPT ;YES--SEE WHAT HE (SHE) WANTS TO DO
TELIOE: CALL FRCTYO ;FORCE TTY OUTPUT
CALL .TCRLF## ;NEW LINE
CALL TELIO1 ;TELL TO USERS TTY
CAIN T2,INPC ;IF NOT INPUT CHANNEL OR,
TRNE DC,(DV.TTY) ;IF OUTPUT IS ALSO TO TTY
POPJ P, ;THEN WE ARE DONE
SAVE$ T1 ;NO--SAVE T1
CALL O$CRLF ;NEW LINE
CALL O$CRLF ;AND ANOTHER
MOVEI T1,O$CHAR ;SETUP ROUTINE
CALL .TYOCH## ;WITH SCAN
EXCH T1,(P) ;REMEMBER OLD ONE
SETOM ERRTYX ;TELL EHNDLR TO NOT SWITCH THEM NOW
CALL TELIO1 ;TELL ERROR TO LISTING
PJRST XCHTYO ;FIXUP OUTPUT AND RETURN
TELIO1: WARN. EF$NCR!EF$OCT,IOE,<I/O ERROR - STATUS=>
CALL TELPRB ;DECODE BITS FOR USER
SAVE$ T1 ;SAVE STATUS
STRNG$ <, FILE >
MOVEI T1,OUTSPC ;ASSUME OUTPUT ERROR
SAVE$ T2 ;SAVE CHAN
CALL @[EXP TINSPC,.TFBLK##]-1(T2) ;TYPE THE FILE SPEC
CALL TYFREC ;TYPE FEET AND RECORDS
RESTR$ T2 ;GET CHANN BACK
CALL .TCRLF## ;NEW LINE
JRST TPOPJ ;RESTORE T1 AND RETURN
$POPJ2: AOS (P) ;SKIP 2
$POPJ1: AOS (P) ;SKIP 1
$POPJ: POPJ P, ;SKIP 0
;HERE WITH ERROR BITS IN T1--DECODE THEM
;USES NO ACS
TELPRB: CALL .PSH4T## ;PRESERVE ACS
MOVE T4,T1 ;COPY BITS
ANDI T4,IO.IMP!IO.DER!IO.DTE!IO.BKT ;GET ONLY ERROR BITS
JUMPE T4,PRBDUN ;JUMP IF NOT A PROBLEM
LSH T4,-<ALIGN. (IO.BKT)> ;LINE UP
MOVEI T1,[ASCIZ/ (/] ;START
CALL .TSTRG##
TLZ F,FL$IOF ;CLEAR A FLAG
MOVE T3,[POINT 18,PRBNAM] ;INIT A PTR
PRBLUP: ILDB T2,T3 ;GET A NAME
TRNN T4,1 ;IS THIS A PROBLEM?
JRST PRBNXT ;NO
TLOE F,FL$IOF ;YES--IS IT FIRST?
CALL TYSLSH ;NO--TYPE A SLASH
MOVSI T1,(T2) ;POSITION CODE
CALL .TSIXN## ;SEND IT
PRBNXT: LSH T4,-1 ;MOVE OVER
JUMPN T4,PRBLUP ;JUMP IF MORE PROBLEMS
MOVEI T1,")" ;NO--FINISH
CALL .TCHAR##
PRBDUN:
POP4J: CALL .POP4T## ;RESTORE REGS
POPJ P, ;AND RETURN
PRBNAM: 'BKTPAR' ;BLOCK TOO LARGE/PARITY ERROR
'DERIMP' ;DEVICE ERROR/WRITE LOCKED
EXP 0 ;SNH
GEROPT: STRNG$ <
OPTION (H FOR HELP): >
CALL GCHNWL ;GET HIS ANSWER IN T1
MOVSI T2,-N$EOPT ;GET LOOP COUNT
CAME T1,ERROPT(T2) ;IS THIS IT?
AOBJN T2,.-1 ;NO--CHECK ALL
JUMPL T2,@ERRDSP(T2) ;JUMP IF FOUND A MATCH
JRST GEROPT ;ELSE ASK AGAIN
ERROPT: EXP "C" ;CONTINUE
EXP "H" ;GIVE SOME HELP
EXP "I" ;IGNORE FROM NOW ON
EXP "Q" ;QUIT (FAKE AN EOF)
EXP "S" ;SKIP THIS RECORD
N$EOPT==.-ERROPT
ERRDSP: EXP XIOCON ;CONTINUE
EXP GVEHLP ;GIVE HELP
EXP ERIGNR ;IGNORE ERRORS FROM NOW ON
EXP ERQUIT ;QUIT
EXP ERSKIP ;SKIP THIS RECORD
;HERE TO SET /ERROR:IGNORE
ERIGNR: MOVEI T1,ERRIGN ;GET VALUE
MOVEM T1,FLERR ;
XIOCON:
TPOPJ1: RESTR$ T1 ;GET T1 AGAIN
AOSA (P)
TPOPJ: RESTR$ T1
POPJ P,
ETPJ1: POP P,(P) ;CLEAR CRUD ON PDL
JRST TPOPJ1 ;AND RESTORE T1 AND RETURN
;HERE TO GIVE SOME HELP
GVEHLP:
IFE FT$SEG,<CALL UPSCN> ;MAKE HISEG ADDRESSABLE
OUTSTR ERRHLM ;GIVE THE HELP
IFE FT$SEG,<CALL DWNSCN> ;REMOVE CORE ONCE MORE
JRST GEROPT
IFE FT$SEG,<HIGH$> ;PUT MESSAGE IN SHARABLE HISEG
ERRHLM: ASCIZ$ <TYPE ONE OF:
C - CONTINUE (DUMP THIS RECORD)
H - TYPE THIS
I - CONTINUE AND MAKE IT /ERROR:IGNORE
Q - QUIT NOW
S - SKIP THIS RECORD (DO NOT DUMP IT)
>
IFE FT$SEG,<LOW$> ;BACK TO LOWSEG
;HERE TO QUIT
ERQUIT: SETZB P1,P2 ;FORCE AND END TO IT ALL
JRST TPOPJ ;RETURN EOF
;HERE TO SKIP THIS RECORD
ERSKIP: AOS RECORD ;COUNT RECORD WE SKIPPED
MOVE T1,-1(P) ;GET ADDRESS +1
MOVE T1,-1(T1) ;GET INSTR
XCT T1 ;CLANK IT AGAIN
JRST TPOPJ1 ;OK--RETURN
JRST XCTIOE ;JUST CAN'T WIN...
SUBTTL ERROR HANDLER
;EHNDLR -- HANDLE ALL ERRORS
;THE ONLY CALL IS THRU THE ERROR. MACRO
EHNDLR: CALL SAVACS ;SAVE THE ACS
TLNE F,FL$OPN ;OUTPUT FILE OPEN?
TRNN DC,(DV.TTY) ;IS THIS TTY OUTPUT?
CAIA ;OUTPUT NOT OPEN OR NOT TTY OUTPUT
CALL O$CRLF ;YES--MAKE NEW LINE SO MESSAGE IS SEEN
CALL FRCTYO ;FORCE OUTPUT IF TTY
MOVE P1,@0(P) ;GET FLAGS AND ADDRESSES
AOSE ERRTYX ;CLEAR/CHECK FLAG
SKIPN @.TYOCH## ;IS SCAN TTCALLING?
JRST [SETZM ERRTYX ;YES--CLEAR FLAG
JRST EHND.0] ;AND SKIP ON
SETZ T1, ;NO--SO MAKE IT
CALL .TYOCH## ;TELL SCAN
MOVEM T1,ERRTYX ;REMEMBER/SET FLAG
EHND.0: MOVEI T1,"?" ;ASSUME AN ERROR
TLNE P1,EF$WRN ;CHECK WARNING
MOVEI T1,"%" ;YES
TLNE P1,EF$INF ;IF BOTH OFF NOW THEN INFO
MOVEI T1,"[" ;GOOD THING WE CHECKED
CALL .TCHAR## ;OUTPUT THE START OF MESSAGE
MOVSI T1,MY$PFX ;SET UP MY PREFIX
HLR T1,(P1) ;GET MESSAGE PREFIX
CALL .TSIXN## ;OUTPUT THE PREFIXES
CALL .TSPAC## ;AND A SPACE
HRRZ T1,(P1) ;GET STRING ADDRESS
CALL .TSTRG## ;SEND IT
MOVE T1,SAVAC+T1 ;GET ORIGINAL T1 IN CASE TYPEOUT DESIRED
LDB T2,[POINT 5,P1,17] ;GET TYPED OUT DESIRED
CAILE T2,EF$MAX ;CHECK LEGAL
MOVEI T2,0 ;NOOOP
CALL @ERRTAB(T2) ;CALL THE ROUTINE
TLNE P1,EF$NCR ;IF NO CRLF THEN DON'T CLOSE INFO
JRST EHND.1 ;NO--DON'T CHECK
MOVEI T1,"]" ;PREPARE TO CLOSE INFO
TLNE P1,EF$INF ;CHECK FOR INFO
CALL .TCHAR## ;SEND INFO CLOSE
TLNN P1,EF$NCR ;NO CARRIAGE RETURN?
CALL .TCRLF## ;YES--SEND ONE
EHND.1: SKIPN T1,ERRTYX ;DID WE RESET SCAN?
JRST EHND.2 ;NO
CALL .TYOCH## ;AND RESTORE IT
SETZM ERRTYX ;CLEAR FLAG
EHND.2: TLNE P1,EF$FTL ;NOW CHECK FATAL
JRST ERRFTL ;YES--GO DIE
;FALL INTO RESACS
;RESACS -- RESTORE ALL ACS FROM SAVAC AREA
; CALL RESACS
; *ACS RESTORED FROM SAVAC*
RESACS: MOVEM 17,SAVAC+17
MOVSI 17,SAVAC
BLT 17,17 ;REGISTERS ARE RESTORED
POPJ P, ;RETURN
ERRTAB: $POPJ ;CODE 0 -- NO ACTION
.TDECW## ;CODE 1 -- TYPE T1 IN DECIMAL
.TOCTW## ;CODE 2 -- TYPE T1 IN OCTAL
.TSIXN## ;CODE 3 -- TYPE T1 IN SIXBIT
.TPPNW## ;CODE 4 -- TYPE T1 AS PPN
.TSTRG## ;CODE 5 -- T1 POINTS TO ASCIZ STRING
.TFBLK## ;CODE 6 -- T1 POINTS AT FDB
;HERE TO DIE--
ERRFTL: RESET ;KILL ALL FILES
MOVE P,INIPDP ;RESET PDL
IFE FT$SEG,<CALL UPSCN> ;NEED HISEG
CALL .CLRBF## ;CLEAR REST OF LINE OR WHATEVER
SKIPN OFFSET ;CCL ENTRY
SKIPL ISCNVL ;OR MIXLOD MONITOR COMMAND?
CALL .MONRT## ;YES--EXIT 1,
JRST RESTRT ;AND RESTART ON CONTINUE
;SAVAC -- SAVE ALL ACS
;CALL -- PUSHJ P,SAVACS
; *ACS SAVED IN SAVAC* BEWARE!!
SAVACS: MOVEM 17,SAVAC+17 ;SAVE ONE
MOVEI 17,SAVAC
BLT 17,SAVAC+16
MOVE 17,SAVAC+17
POPJ P, ;ACS ARE SAVED
;TYSLSH -- TYPE A SLASH THROUGH .TCHAR
TYSLSH: MOVEI T1,"/"
PJRST .TCHAR## ;DONE
SUBTTL STORAGE
IFN FT$SEG,<RELOC 0> ;STORAGE GOES IN LOW SEGMENT
;STORAGE THAT REMAINS BETWEEN RUNS
U (ISCNVL) ;VALUE FROM .ISCAN
U (TLDVER) ;-1 WHEN TYPED VERSION TO TTY
IFE FT$SEG,< ;NEED TO STORE RUN ARGS
U (SAVRUN) ;-1 WHEN HAVE SAVED RUN ARGS
U (SGDEV) ;RUN UUO ARGUMENTS ARE SG???
U (SGNAM)
U (SGLOW)
U (SGPPN)
>;END IFE FT$SEG
U (OFFSET) ;STARTING OFFSET
FW$ZER==. ;FIRST WORD ZEROED
U (PDLIST,LN$PDL) ;PUSHDOWN LIST
U (SAVAC,20) ;SAVE ACS HERE
U (OPNBLK,3) ;OPEN BLOCK
U (LKPBLK,.RBTIM+1) ;LOOKUP/ENTER BLOCK
U (PTHBLK,^D9) ;PATH BLOCK
U (SVINOB,3) ;PLACE TO SAVE OPEN BLOCK FOR INPUT FILE
U (SVINLK,.RBTIM+1) ;PLACE TO SAVE LOOKUP BLOCK FOR INPUT FILE
U (CHRKNT) ;COUNTER FOR CHARACTERS OUTPUT
U (ERRTYX) ;FLAG FOR EHNDLR
U (ACTLST,LN$ACT) ;ACTION LIST
U (SCMDBP) ;BYTE PTR TO STORE IN CMDBFR
U (SCMDCT) ;BYTE CTR TO STORE IN CMDBFR
IFN FT$WLD,< ;WILD STORAGE
U (WLDFIR) ;ADDRESS OF SCAN BLOCK FOR .LKWLD
U (WLDPTR) ;WILD STORES SCAN BLOCK ADDR HERE
U (LKWLFL) ;-1/0/1 == DISK/DECTAPE/OTHER OR NULL
>;END IFN FT$WLD
U (EBCKNT) ;COUNT-DOWN FOR EBCDIC PRETTY PRINTING
U (IFILSZ) ;SIZE OF INPUT FILE IN BLOCKS
U (IDVNAM) ;INPUT REAL DEVICE NAME
U (ODVNAM) ;OUTPUT REAL DEVICE NAME
U (IBHR,3) ;INPUT BUFFER HEADER
U (OBHR,3) ;OUTPUT BUFFER HEADER
U (FORADR) ;ADDRESS OF BUFFER FOR FORTRAN/IREAD INPUT
U (BYTPTR) ;PTR FOR /MODE:BYTE
U (BYTBPW) ;# BYTES/WORD
U (BYTREM) ;# BITS LEFT OVER
U (BYTDPB) ;# DIGITS/BYTE
U (BYTWID) ;BYTE WIDTH FOR A WORD
U (BYTBPL) ;# BYTES/LINE
U (BYTRDB) ;REMAINDER DIGITS/BYTE
RUN$FZ==. ;FIRST WORD ZEROED AT COMMAND PROCESS START
BLOCK 3 ;***FOR TAPOP. UUO
REELID==.-1 ;REELID IS TAPOPBL-1
TAPOBL: ;FOR TAPOP.
U (FILE) ;FILE NUMBER
U (RECORD) ;RECORD NUMBER
U (TOTFIL) ;TOTAL FILES DUMPED
U (TOTREC) ;TOTAL RECORDS DUMPED
U (WRDCNT) ;ACCUMULATED RECORD WORD COUNT
U (ONLYLO) ;LOWEST WORD # IN RECORD TO DUMP
U (ONLYHI) ;HIGHEST WORD # IN RECORD TO DUMP
RUN$LZ==.-1 ;LAST WORD ZEROED AS RUN STARTS (DUMPING)
SCN$FZ==. ;FIRST WORD ZEROED AT CLRANS
U (CMDBFR,LN$CMD) ;SAVE COMMAND HERE SO WE CAN PUT ON DUMP
U (INPSPC,.FXLEN) ;INPUT SPECIFICATION
U (OUTSPC,.FXLEN) ;OUTPUT SPECIFICATION
U (DUMPFL) ;-1 WHEN /DUMP SEEN
U (TITLEB,LN$TTL) ;BLOCK FOR /TITLE
TITLEE==.-1 ;FOR END OF BLT
U (TTLZER) ;ENSURE A ZERO ON THE END
SCN$LZ==.-1 ;LAST WORD ZEROED AT CLRANS
SCN$FO==. ;FIRST WORD MINUS ONNED AT CLRANS
U (S.BLKF) ;/BLOCK:N
U (BUFSIZ) ;/BUFSIZ
U (FLERR) ;/ERROR:ARG
U (LINRDX) ;/LINRDX
U (NMTBUF) ;/MTBUF
U (FLNTRY) ;/NORETRY
U (FLOMIT) ;/OMIT
U (USERDX) ;/RADIX
U (USRWID) ;WIDTH OF WORD IF /RADIX USED
U (FLWIDT) ;/WIDTH
SCN$LO==.-1 ;LAST WORD ONNED AT CLRANS
LW$ZER==.-1 ;LAST WORD ZEROED AT STARTUP
IFN FT$SEG,< ;FORCE LITERALS OUT IN HIGH SEGMENT
RELOC
>;END IFN FT$SEG
XLIST ;JUST LITERALS FOLLOWING
LIT
LIST ;LITERALS PRECEDE
ENDUMP::END DUMPR