SUBTTL B. SCHREIBER UI HI ENERGY PHYSICS GROUP
SEARCH JOBDAT,UUOSYM,MACTEN,SCNMAC
.DIREC .XTABM
SALL
TWOSEG
;SHOW UNIVERSAL VERSION NUMBERS
%%JOBD==:%%JOBD
%%UUOS==:%%UUOS
%%MACT==:%%MACT
%%SCNM==:%%SCNM
;SELECTIVELY LOAD SCAN AND COMPANY
.TEXT \/SEARCH REL:ALCOR/SEG:LOW\
.TEXT \/SEARCH REL:SCN7B/EXCLUD:(.SCAN)/SEG:LOW,REL:SCN7B\
.REQUI REL:HELPER ;LOAD HELPER IN HISEG
;COPYMT VERSION INFORMATION
CMTVER==7 ;MAJOR VERSION
CMTEDT==40 ;EDIT LEVEL
CMTMIN==0 ;MINOR VERSION LETTER
CMTWHO==0 ;WHO LAST EDITTED
LOC .JBVER ;SET THE VERSION
%%CPYM==:VRSN. (CMT)
EXP %%CPYM
DEFINE CTITLE (TEXT,MAJVER,EDIT)
CTITLE (,\CMTVER,\CMTEDT)
SUBTTL REVISION HISTORY
COMMENT \
3(11) 23-SEP-76 ALL EDITS TO NOW RELEGATED TO DEVELOPMENT.
ADD /UNLOAD
3(12) 27-SEP-76 REPORT TAPOP. UUO FAILURES. ONLY ASK ABOUT
QUITTING ON BLOCK TOO LARGE ONCE.
4(13) 27-SEP-76 ADD IFTYP FACILITY...ENABLED BY /IFTYP IN COMMAND
4(14) 28-SEP-76 SPEED UP IFTYP HANDLING..USE JSP
5(15) 30-SEP-76 ADD CODE TO COPY MTA TO DSK AND DSK TO
MTA (IREAD MODE ONLY). ALSO ADD STATISTICS
SUCH AS RUNTIME AND ELAPSED TIME TO IFTYP STUFF
5(16) 04-OCT-76 USE RESULT OF DEVNAM FOR ALL MTCHR AND TAPOP
UUOS. LOGICAL NAMES SOMETIMES DON'T WORK
(ESP IF THEY ARE NUMERIC!) ALSO, WHEN TESTING
A TAPE, TYPE OUT DENSITY AND TRACKS
5(17) 05-OCT-76 ADD ROUTINE DOTPOP ON TOP OF ETAPOP TO
SAVE A FEW WORDS. ADD /TIME TO TYPE
ELAPSED AND CPU TIME.
6(20) 08-OCT-76 ADD /TO32 TO COPY 36-BIT TAPE TO 32-BIT TAPE
6(21) 11-OCT-76 TURN OFF FL$EOT AT COPDUN IF END OF LIST SEEN.
THIS WILL PREVENT EXTRA MTBSF. OUTC, AT DO.DUN
WHICH WAS IO TO UNASS CHN BECAUSE WE DID NOT
REOPEN OUTPUT
6(22) 22-OCT-76 ADD SETIBO/SETIBI
6(23) 27-OCT-76 FIX SWTCHS MACRO...MISPLACED CONDITIONAL AND
FS.VRQ MISSING ON A FEW SWITCHES.
6(24) 05-NOV-76 FIX BUG IN CPYMTD IF IREAD LOGICAL RECORD
ENDS ON BLOCK BOUNDARY (T3 GOT ZAPPED BY SETIBC)
6(25) 13-NOV-76 BF.IBC GOES IN BUFFER HEADER, NOT BUFFFER RING!
ALSO MUST CLEAR IO.UWC AT OUTCLS OR NEXT TO LAST
BUFFER GETS WRITTEN OUT AGAIN.
6(26) 15-NOV-76 ADD /ERROR:IGNORE. DEFAULT DSK EXTENSIONS TO .DAT.
ADD "I" OPTION TO IFTYPE.
6(27) 16-NOV-76 CLEARING IO.UWC SOMETIMES GET IO TO UNASS CHN.
SOLUTION: ADD FL$OPN=1 WHEN OUTPUT IS OPEN.
6(30) 1-26-77 BUG IF /COPY:N:M. DO NOT REOPEN OUTPUT IF N OR
M RUNS OUT.
6(31) 1-26-77 6(30) WAS NOT QUITE RIGHT. INSTEAD OF QUITTING
GET NEXT FUNCTION. ALSO CHECK FOR OUTPUT OPEN AT
DO.CPY IN CASE OF /COPY:X/SKIP:Y/COPY:Z.
6(32) 2-3-77 CHANGE TO ERROR., WARN., AND INFO.. ADD /RETRY:N
TO SET # RETRIES FOR TAPE TESTING AND MAKE THE
DEFAULT BE 4 INSTEAD OF 10 (TU70'S SHOULD NOT
NEED 10 TRIES!!!)
6(33) 11-FEB-77 ADD /REPEAT:N TO TRY THE TAPE TEST N TIMES
7(34) 11-FEB-77 IMPLEMENT LOG FILE CAPABILITY
WITH /LOG:FILESPEC, /COMMENT:"COMMENT FOR LOG FILE"
AND /CLOSE
7(35) 13-FEB-77 CLOSE LOG FILE ON FATAL ERROR!
7(36) 13-FEB-77 IF LOG DEVICE IS LPT FORGET THE LOOKUP
7(37) 18-FEB-77 ALLOW /LOG WITH NO FILE SPEC (DEFAULT = DSK:COPYMT.LOG)
7(40) 23-FEB-77 SHOW FILE AND RECORD COUNTS AT END OF COPY
FOR ALL MEDIA
\;END OF REVISION HISTORY
SUBTTL AC DEFINITIONS
;DEFINE THE ACCUMULATORS
DEFINE AC$ (X)
ZZ==0 ;START THE BALL ROLLING
AC$ F, ;FLAGS
AC$ T1, ;T1-4 ARE TEMPORARY AND FOR ARGUMENT PASSING
AC$ T2,
AC$ T3,
AC$ T4,
AC$ P1, ;P1-4 MUST BE PRESERVED (.SAVEX ARE BEAUTIFUL!)
AC$ P2,
AC$ P3,
AC$ P4,
AC$ L, ;LINK FOR JSP
AC$ PLP, ;PARAMETER LIST POINTER
AC$ ACT, ;HOLDS DESIRED ACTION IN DO.IT
P=17 ;THE PUSH DOWN POINTER
N=P3 ;VALUE HOLDER FROM SCAN .XXXNW, ETC.
C=P4 ;CHARACTER AC FOR SCAN, .TICAN, ETC.
SUBTTL BIT DEFINITIONS
;ASSEMBLY DIRECTIVES
ND LN$PRM,^D60 ;PARAM LENGTH
ND LN$PDL,^D40 ;PDL LENGTH
ND MY$NAM,'COPYMT' ;MY NAME IN SIXBIT
ND MY$PFX,'CMT' ;MESSAGE PREFIX
ND N$BUFS,2 ;# I/O BUFFERS (BOTH INPUT AND OUTPUT)
ND N$LOGB,2 ;# BUFFERS FOR LOG FILE
ND DF$BFZ,^D1024 ;DEFAULT BUFFER SIZE IF NO /BUFSIZ GIVEN
ND MX$NPL,^D8 ;# WORDS/LINE ON ERROR DUMP
ND FT$MTP,-1 ;NON-ZERO FOR MTAPE MONITORY COMMAND
ND FT$DEB,0 ;NON-ZERO FOR DEBUGGING CODE
ND FT$OPT,-1 ;NON-ZERO TO READ SWITCH.INI
ND FT$TST,-1 ;NON-ZERO TO INCLUDE /TAPTST CODE
IFN FT$TST,<
ND DF$TRY,4 ;DEFAULT # RETRIES ON TAPE ERRORS
ND N$TSTB,1 ;USE 1 BUFFER FOR /TAPTST
>;END IFN FT$TST
ND N$DSKB,6 ;USE THIS MANY BUFFERS FOR DSK I/O
;FDB
LN$FDB==.FXLEN ;USE STD SIZE FDB
ATSIGN==(1B13) ;THE INDIRECT BIT
INPC==1 ;INPUT CHANNEL
OUTC==2 ;OUTPUT CHANNEL
LPTC==3 ;LPT CHANNEL FOR ERROR DUMPING
LOGC==4 ;CHANNEL FOR LOG FILES
;FLAGS IN F
DEFINE FLAG$ (F)
;;SHOW THE FLAG VALUE
..FL==(1B0) ;START AT BIT 0
FLAG$ (MRG) ;ON WHEN MERGING (CONCATENATING) FILES
FLAG$ (OUT) ;ON WHEN OUTPUT SPEC ALLOCATED
FLAG$ (CPY) ;ON WHEN /COPY OR /CONCAT SEEN
FLAG$ (EOT) ;CLEARED WHEN RECORD OUTPUT, SET AT INPUT EOF
;TWO SETS IN A ROW IMPLIES LOGICAL EOT
FLAG$ (LPO) ;ON MEANS LPT FILE IS OPEN
FLAG$ (BAT) ;ON IF BATCH JOB (PREFIX A FEW MSGS WITH $)
FLAG$ (FLG) ;GENERAL PORPOISE FLAG
IFN FT$MTP,<
FLAG$ (MTP) ;ON IF MTAPE MONITOR COMMAND
>;END IFN FT$MTP
IFN FT$TST,<
FLAG$ (TST) ;ON WHEN PROCESSING /T
>;END IFN FT$TST
FLAG$ (BKT) ;HAVE SEEN BKT BEFORE AND USER SAID CONTINUE
FLAG$ (ITY) ;/IFTYP WAS SEEN
$FLITY==(FL$ITY);A LEFT HAND VALUE OF THE SAME THING
FLAG$ (DSI) ;ON IF INPUT IS DSK
FLAG$ (DSO) ;ON IF OUTPUT IS DSK
FLAG$ (232) ;ON IF 36-BIT TAPE TO 32-BIT TAPE
$FL232==(FL$232);NEED LH VALUE
FLAG$ (OPN) ;ON WHEN OUTPUT IS OPEN
FLAG$ (LOG) ;ON WHEN LOG FILE IS OPEN
FLAG$ (TSN) ;ON WHEN TIME STAMP NEEDED IN LOG FILE
;MACRO TO DEFINE FUNCTION VALUES
DEFINE FUNCTS
)>
DEFINE FN (X)
>
ZZ==0 ;FUNCTIONS START AT 1
FUNCTS
FN$INP==-1 ;FUNCTIONS FOLLOWING THIS ONE ARE FOR INPUT SIDE
FN$EOL==-2 ;END OF FUNCTION LIST
;EXTRA FLAGS FOR SWTCHS MACRO
FS$XTR==1B7 ;THIS SWITCH CAN TAKE EXTRA PARAMETERS
;(I.E. /BACKSP:F:N)
FS$NVL==1B8 ;THIS SWITCH NEVER TAKES A VALUE
FS$OUT==1B9 ;THIS SWITCH IS OUTPUT ONLY
FS$INP==1B10 ;THIS SWITCH IS INPUT ONLY
FS$SPL==1B11 ;THIS SWITCH REQUIRES SPECIAL PROCESSING
;DO A JRST @SWTP(P1) TO DO IT
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
EF$OPR==20 ;MESSAGE SHOULD BE PREFIXED WITH CRLF-$ IF BATCH
EF$MAX==17 ;MAX # OF TYPE CODES ALLOWABLE (9 BITS - ABOVE USED)
DEFINE ETYP ($TYP)
ZZ==0 ;TYPE CODES ARE FROM 1-EF$MAX
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
ETYP LEB, ;T1 POINTS AT OPEN BLOCK
;T2 POINTS AT LOOKUP/ENTER BLOCK
MX$ERR==ZZ ;MAXIMUM LEGAL ERROR TYPE
EF$NOP==0 ;INTERNAL FOR ERROR HANDLER
IFG ZZ-EF$MAX,
;$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)
,[''$PFX'',,[ASCIZ @$MSG@ ] ]
>
;WARN. ($FLGS,$PFX,$MSG) -- GENERATE CALL TO ERROR HANDLER FOR WARNING
DEFINE WARN. ($FLGS,$PFX,$MSG)
;INFO. ($FLGS,$PFX,$MSG) -- GENERATE CALL TO ERROR HANDLING FOR INFO
DEFINE INFO. ($FLGS,$PFX,$MSG)
;OPER$ ($FLGS,$PFX,$MSG) -- MESSAGE THAT OPERATOR WILL SEE IN BATCH JOB
DEFINE OPER$ ($FLGS,$PFX,$MSG)
SUBTTL IMPLEMENTATION NOTES
COMMENT \A NOTE ABOUT THE PARAMETER LIST -
THE LIST IS SET UP IN TWO WORD ARGUMENTS. THE FIRST WORD IS THE FUNCTION
AND THE SECOND CONTAINS .
FOR FUNCTIONS THAT HAVE NO COUNTS (I.E. /EOF) THE COUNT IS SET
TO ONE BY THE SWITCH HANDLER. THE INTERNAL FUNCTIONS (FN$INP AND
FN$EOL) DO NOT USE THE SECOND ARGUMENT, BUT IS PRESENT FOR A HOMOGENOUS
LIST.
\;END NOTE
COMMENT \
IF THIS PROGRAM IS REASSEMBLED AND DOES NOT APPEAR TO FUNCTION
CORRECTLY, CHECK UUOSYM DEFINITIONS FOR MTCHR. AND TAPOP. UUO, AND WHAT
THE MONITOR ACTUALLY STORES IN THESE ARG BLOCKS. I EXPECT THAT THE
DEFINITIONS FOR .TFSTS (GET STATUS) ARE WRONG IN THE UUOSYM I USED
(.TSFIL==0, .TSREC==1).
\;END COMMENT
SUBTTL OTHER MACRO DEFINITIONS
;SAVE$ SAVES DATA ON THE STACK
DEFINE SAVE$ (X)
LIST>
;RESTR$ RESTORES DATA FROM THE STACK
DEFINE RESTR$ (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)
;HIGH$ SWITCHES TO HIGH SEGMENT
DEFINE HIGH$
>
;LOW$ SWITCHES TO LOW SEGMENT
DEFINE LOW$
>
;RELOC$ DEFINES INITIAL CONDITIONS
DEFINE RELOC$
;LIT$ FORCES OUT LITERALS IN CURRENT SEGMENT
DEFINE LIT$
SUBTTL GET THE BALL ROLLING
;MAIN AND ONLY ENTRY POINT. REMEMBER IF CCL ENTRY OR NOT, AND REMEMBER
;WHERE WE CAME FROM. THIS IS NECESSARY TO RECOVER THE SCAN HIGH SEGMENT
;AFTER WE HAVE FINISHED COPYING
RELOC$ ;INITIALIZE SEGMENTS
COPYMT: TDZA T1,T1 ;NOT CCL ENTRY
MOVEI T1,1 ;CCL START
MOVEM T1,OFFSET ;REMEMBER FOR SCANNING
RESET ;STOP ALL I/O
REPEAT 0,< ;UN-REPEAT WHEN DISTRIBUTED
MOVX T1,%CNDVN ;MONITOR VERSION
GETTAB T1,
SETZ T1, ;WILL LOOSE BIG
TXZ T1,VR.WHO!VR.MIN;GET MAJOR VERSION #
CAIGE T1,60200 ;MUST BE .GE. 602
ERROR. EF$FTL,N6M,
>;END REPEAT 0
SKIPE SAVRUN ;HAVE WE SAVED RUN UUO ARGS?
JRST RUNSVD ;YES--SKIP AHEAD
MOVEM .SGNAM,SGNAM ;NO--DO SO NOW
MOVEM .SGPPN,SGPPN ;
MOVEM .SGDEV,SGDEV
MOVEM .SGLOW,SGLOW ;LOW FILE EXTENSION
SETOM SAVRUN
RESTRT:
RUNSVD: STORE 17,0,16,0 ;CLEAR ALL ACCUMULATORS
STORE 17,FW$ZER,LW$ZER,0 ;AND ZEROED DATA BASE
SKIPA P,.+1 ;LOAD UP PUSH DOWN POINTER
INIPDP: IOWD LN$PDL,PDLIST
PUSHJ P,.RECOR## ;RESET CORE ALLOCATION
PUSHJ P,UPSCN ;IN CASE OF ABORT-RESTART
PUSHJ P,$CLOSE ;RESET THE /LOG SPEC BLOCK
MOVE T1,ISCNBL ;GET .ISCAN ARGUMENT BLOCK
PUSHJ P,.ISCAN## ;INITIALIZE THE SCANNER
MOVEM T1,ISCNVL ;REMEMBER VALUE RETURNED
IFN FT$MTP,<
SOJE T1,DOMTAP ;JUMP IF MTAPE COMMAND (VALUE=1)
>;END IFN FT$MTP
SKIPN OFFSET ;CCL START?
SKIPE TLDVER ;TOLD VERSION YET?
JRST CPYMT0 ;YES--GO CALL .TSCAN
STRNG$ ;NO--DO IT NOW
MOVE T1,.JBVER
PUSHJ P,.TVERW##
PUSHJ P,.TCRLF##
SETOM TLDVER
CPYMT0: PUSHJ P,UPSCN ;ENSURE SCAN AROUND
SETZ F, ;***CLEAR THE FLAGS
PUSHJ P,SCNCMD ;GET A COMMAND
MSTIME T1, ;GET TIME OF DAY
MOVEM T1,GOTIME ;SAVE AS GO-TIME
SETZ T1, ;GET MY RUNTIME
RUNTIM T1,
MOVEM T1,GORUNT ;SAVE AS INITIAL RUNTIME
MOVE T1,OUTSPC+.FXDEV;OUTPUT DEV NAME
DEVNAM T1, ;SEE WHAT IT REALLY IS
JRST ILLODV ;CAN'T
MOVEM T1,ODVNAM ;SAVE FOR LATER
IFN FT$TST,<
SKIPL TESTFL ;NO INPUT IF /TEST
JRST CPYMT1 ;SO DON'T TRY IT
>;END IFN FT$TST
MOVE T1,INPSPC+.FXDEV;INPUT NAME
DEVNAM T1, ;GET REAL NAME
JRST ILLIDV ;CAN'T
MOVEM T1,IDVNAM
PUSHJ P,CHKCMD ;CHECK COMMAND FOR GOODNESS
PUSHJ P,DWNSCN ;POOF GOES THE HISEG!
PUSHJ P,OPNOUT ;OPEN OUTPUT FILE
PUSHJ P,OPNINP ;GET NEXT INPUT FILE
PUSHJ P,CHKLOG ;SEE ABOUT THE LOG FILE NOW
PUSHJ P,DO.IT ;DO IT
CPYMT9: PUSHJ P,CLSLOG ;CLOSE LOG IF IT WAS OPEN
PUSHJ P,.RECOR## ;RESET CORE ALLOCATION
JRST CPYMT0 ;GET NEXT COMMAND
IFN FT$TST,<
CPYMT1: PUSHJ P,CHKBAT ;SEE IF BATCH JOB
PUSHJ P,DWNSCN ;MAKE ME SMALLER
PUSHJ P,OPNOUT ;OPEN OUTPUT
PUSHJ P,CHKLOG ;GO SEE ABOUT LOG FILE BEFORE WE FIRE IT UP
PUSHJ P,TESTIT ;TEST IT
JRST CPYMT9 ;LOOP
>;END IFN FT$TST
PLPINI: IOWD LN$PRM,PRMPDL ;INITIAL PARAM LIST PTR
LIT$ ;FORCE OUT LITERALS
HIGH$ ;THIS CODE CAN DISSAPPEAR
SCNCMD: MOVE T1,TSCNBL ;GET .TSCAN ARGUMENT BLOCK
PUSHJ P,.TSCAN## ;CALL .TSCAN TO SCAN COMMAND
IFN FT$TST,<
SKIPL TESTFL ;/TAPTST?
JRST SCNTST ;YES--SHOULD ONLY HAVE ONE DEVICE
>;END IFN FT$TST
SKIPE OUTSPC+.FXDEV ;OUTPUT THERE?
SKIPN INPSPC+.FXDEV ;YES--INPUT?
E$$CER: ERROR. EF$FTL,CER,
IFN FT$OPT,<
MOVE T1,OSCNBL ;GET ARG PTR FOR .OSCAN
PUSHJ P,.OSCAN## ;SCAN DSK:SWITCH.INI[-]
>;END IFN FT$OPT
POPJ P, ;**SCNCMD RETURN
IFN FT$TST,<
SCNTST: SKIPE OUTSPC+.FXDEV ;WAS IT DEV:/TAPTST= ?
JRST [SKIPN INPSPC+.FXDEV ;YES--BUT WAS INPUT SPEC THERE ALSO?
JRST SCNTS0 ;NO--ALL IS WELL
JRST E$$CER] ;NO--COMMAND ERROR
SKIPE T1,INPSPC+.FXDEV;INPUT SPECIFIED?
CAME T1,[SIXBIT/DSK/] ;YES--IF IT IS DSK
SKIPA ;'DSK' MEANS /TEST WAS TYPED
SETZM INPSPC+.FXDEV ;FAKE-OUT SO WE USE TAPTST:
MOVE T1,[INPSPC,,OUTSPC] ;SETUP TO BLT SPEC TO PROPER PLACE
BLT T1,OUTSPE ;...MOVE IT
SCNTS1: MOVE T1,[SIXBIT/TAPTST/] ;LAST CHANCE TRY IF NO NAME NOW
SKIPN OUTSPC+.FXDEV ;DID WE GET ON?
MOVEM T1,OUTSPC+.FXDEV;NO--TRY THIS -- COMPLAIN IF FAILURE
SCNTS0: MOVEI T1,N$TSTB ;USE N$TSTB BUFFERS
MOVEM T1,NOBUFS ;AND SET IT
MOVE T1,OUTSPC+.FXDEV;CHECK DEVICE FOR MAGTAPE
DEVNAM T1, ;DO IT AGAIN IN CASE WE CHANGED IT (ABOVE)
JRST ILLODV ;CAN'T GET AT IT
MOVEM T1,ODVNAM ;SAVE FOR LATER
PUSHJ P,CKISMT ;BECAUSE WE WON'T TEST ANYTHING ELSE
JRST E..DNM ;NOT MTA
MOVE T2,ODVNAM ;GET NAME FOR MTCHR.
MTCHR. T2, ;GET IT
SETZ T2, ;BETTER THIS THAN A HALT!
PUSHJ P,STSTBZ ;SET UP 1 FOOT RECORD BUFFERSIZE
IFN FT$OPT,<
MOVE T1,OSCNBL ;CAN HAVE /IFTYP IN SWITCH.INI
PJRST .OSCAN## ;SCAN AND RETURN
>;END IFN FT$OPT
IFE FT$OPT,<
POPJ P, ;END OF SCNCMD
>;END IFE FT$OPT
>;END IFN FT$TST
;ARGUMENT BLOCK FOR .ISCAN
ISCNBL: XWD 5, .+1
IOWD N$CMDS,CMDLST ;LEGAL COMMAND LIST
XWD OFFSET,MY$PFX
XWD 0,CHROUT ;SO WE CAN MPX OUTPUT TO LOG FILE
EXP 0
XWD DOPRMP,0
;.TSCAN ARGUMENT BLOCK
TSCNBL: XWD 11, .+1
IOWD SWTL,SWTN
XWD SWTD,SWTM
XWD 0,SWTP
EXP -1 ;USE JOB NAME TABLE
XWD CLRANS,CLRFIL
XWD AIN,AOUT
EXP 0
EXP 0 ;NO FLAGS
EXP STOSWT
IFN FT$OPT,<
;.OSCAN ARGUMENT BLOCK
OSCNBL: XWD 4, .+1
IOWD OPSWL,OPSWN
XWD OPSWD,OPSWM
XWD 0,OPSWP
EXP -1
EXP 0
>;END IFN FT$OPT
IFN FT$MTP,< ;MTAPE FEATURE
;.TSCAN ARG BLOCK FOR MTAPE COMMAND
MTSCNB: XWD 11, .+1
IOWD MTSWL,MTSWN
XWD MTSWD,MTSWM
XWD 0,MTSWP
EXP -1
XWD CLRANS,CLRFIL
XWD AIN,AOUT
EXP 0
EXP 0
EXP STOSWT
>;END IFN FT$MTP
CMDLST: EXP MY$NAM ;IF ANY BODY WANTS IT...
IFN FT$MTP,< ;MTAPE COMMAND
SIXBIT /MTAPE/ ;
>;END IFN FT$MTP
N$CMDS==.-CMDLST
;SCAN CALLS HERE TO PROMPT
DOPRMP: SKIPL T1 ;INITIAL OR CONTINUATION?
SKIPA T1,PRMPT0 ;INITIAL
MOVSI T1,'# ' ;CONTINUATION
PJRST .TSIXN## ;TYPE IT
PRMPT0: XWD MY$PFX,'> '
SUBTTL MTAPE COMMAND HANDLER
IFN FT$MTP,<
DOMTAP: TLO F,FL$MTP ;FLAG MTAPEING
MOVE T1,MTSCNB ;TSCAN BLOCK FOR MTAPE COMMAND
PUSHJ P,.TSCAN## ;CALL COMMAND SCANNER
SKIPN T1,INPSPC+.FXDEV;CHECK FOR AN INPUT SPEC
JRST E$$CER ;NO--MUST HAVE SCREWED UP
CAMN T1,[SIXBIT/DSK/] ;IS IT DSK?
JRST [SKIPN T1,INPSPC+.FXNAM ;YES--PROBABLY FORGOT THE COLON
JRST E$$CER ;WHOOPS!! BAD COMMAND
MOVEM T1,INPSPC+.FXDEV ;SO TRY THE FILE NAME
JRST .+1]
DEVNAM T1, ;GET REAL NAME
JRST ILLIDV ;NOT REAL
MOVEM T1,IDVNAM ;SAVE FOR LATER
PUSHJ P,CKISMT ;ENSURE MTA
JRST E..DNM ;NOTT-GO BOMB
PUSHJ P,OPINOB ;OPEN INPUT WITH NO BUFFERS
PUSHJ P,CHKBAT ;BETTER CHECK FOR BATCH...
PUSHJ P,DO.IT ;PERFORM THE OPERATIONS
PUSHJ P,.MONRT## ;ALL DONE
JRST RESTRT ;ON .CONTINUE GET THE PROMPT
>;END IFN FT$MTP
SUBTTL CHECK COMMAND FOR REAL MAGTAPES AND OTHER GOOD THINGS
CHKCMD: MOVE T1,ODVNAM ;GET OUTPUT DEVICE REAL NAME
PUSHJ P,CKISMT ;ENSURE MTA
TLO F,FL$DSO ;FLAG DSK OUTPUT
MOVE T1,IDVNAM ;SAME FOR INPUT
PUSHJ P,CKISMT
TLO F,FL$DSI ;FLAG DSK INPUT
TLNE F,FL$DSO!FL$DSI ;CHECK FOR DSK IN OR OUT
JRST [TLC F,FL$DSI!FL$DSO ;YES--MAKE SURE NOT BOTH DSK
TLCE F,FL$DSI!FL$DSO ;
JRST CHKC.1 ;A-OK--MOVIN' ALONG
ERROR. (EF$FTL,BDD,)]
MOVE T1,ODVNAM ;MAKE SURE NOT SAME MTA
MOVE T2,IDVNAM ;...
CAMN T1,T2 ;BETTER NOT BE THE SAME
JRST E$$CUS ;YES--STUPID
JRST CHKC.2 ;OK--NOW SKIP AHEAD
CHKC.1: HRLOI T2,'DAT' ;SETUP DEFAULT EXTENSION
TLNE F,FL$DSI ;DISK INPUT?
SKIPE INPSPC+.FXEXT ;NEED ONE?
SKIPA ;NO--DON'T TOUCH IT
MOVEM T2,INPSPC+.FXEXT ;YES--DEFAULT IT
TLNE F,FL$DSO ;DISK OUTPUT?
SKIPE OUTSPC+.FXEXT ;YES--NEED DEFAULT?
SKIPA ;NO
MOVEM T2,OUTSPC+.FXEXT ;YES--DEFAULT
CHKC.2:
CHKBAT: HRROI T1,.GTLIM ;NOW SEE IF I AM A BATCH JOB
GETTAB T1, ;ASK MON
SETZ T1, ;JE NE SAIS PAS
TLNE T1,(JB.LBT) ;BATCH JOB?
TLO F,FL$BAT ;YES--REMEMBER THAT
POPJ P, ;ALL IS WELL (I HOPE)
ILLODV: SKIPA T1,OUTSPC+.FXDEV;DEVNAM FAILED
ILLIDV: MOVE T1,INPSPC+.FXDEV
ERROR. EF$FTL!EF$SIX,IUD,
E$$CUS: ERROR. EF$FTL,CUS,
;CKISMT -- SEE IF DEVICE IS MTA
;CALL: MOVE T1,DEVNAM
; PUSHJ P,CKISMT
; *ITS A DSK*
; *ITS MTA*
;PRESERVES T1
CKISMT: MOVE T2,T1 ;COPY DEVICE NAME
DEVCHR T2, ;GET CHARACTERISTICS
TLNE T2,(DV.MTA) ;IS IT AN MTA?
TLNE T2,(DV.TTY) ; AND ALSO A TTY (IMPLIES NUL:)
JRST CKISM1 ;NO--SEE IF DSK
TLNE T2,(DV.AVL) ;MTA--IS IT AVAILABLE TO ME?
JRST .POPJ1## ;YES--DONE
ERROR. EF$FTL!EF$SIX,MNA,
CKISM1: TLNE T2,(DV.DSK) ;IS IT A DSK?
TLNE T2,(DV.TTY) ;YES--AND NOT TTY (I.E. NOT NUL:)
E..DNM: ERROR. EF$SIX!EF$FTL,DNM,
POPJ P, ;DEVICE IS A DISK
SUBTTL SWITCH TABLE
DEFINE SWTCHS,<
SP *BACKSP,FN$BSP,.SWDEC##,MTN,FS$XTR!FS.VRQ
SP BUFSIZ,BUFSIZ,.SWDEC##,BFZ,FS.NUE
SS CLOSE,$CLOSE,0,FS.NFS!FS.NCM!FS$SPL
SP COMMENT,,.SWASQ##,,FS.NUE
SP CONCAT,FN$CON,.SWDEC##,MTN,FS.VRQ!FS$XTR!FS$INP
SP *COPY,FN$CPY,.SWDEC##,MTN,FS$XTR!FS$INP!FS.VRQ
SS *EOF,FN$EOF,FN$EOF,FS$NVL
SL ERROR,ERRFLG,ERL,ERLCON,FS.NUE
SP IBUF,NIBUFS,.SWDEC##,BFS,FS.NUE
SS *IFTYP,,1,FS.NUE
SP LOG,$LOGSW,.POPJ##,LGF,FS.NFS!FS.NCM!FS$SPL
SL MODE,MODFLG,MOD,MODBIN,FS.NUE
SS NORETR,RTRYFL,1,FS.NUE
SP OBUF,NOBUFS,.SWDEC##,BFS,FS.NUE
IFN FT$TST,<
SP REPEAT,RPETFL,.SWDEC##,RPT,FS.NUE
>;END IFN FT$TST
SS REPORT,RPTFLG,1,FS.NUE
SP RETRY,NUMTRY,.SWDEC##,TRY,FS.NUE
SS *REWIND,FN$REW,FN$REW,FS$NVL
SP *SKIP,FN$SKP,.SWDEC##,MTN,FS$XTR!FS.VRQ
IFN FT$TST,<
SP TAPTST,TESTFL,.SWDEC##,TST,FS.NUE
SP *TEST,TESTFL,.SWDEC##,TST,FS.NUE
>;END IFN FT$TST
SS TIME,TIMEFL,1,FS.NUE
SS TO32,,1,FS.NUE
SS *UNLOAD,FN$UNL,FN$UNL,FS$NVL
>
MX.LGF==.FXLEN
PD.LGF==1
DM (BFS,^D20,6,6)
DM (MTN,177777,177777,177777)
DM (BFZ,^D4096,^D2048,^D1024)
IFN FT$TST,<
DM (RPT,177777,1,1)
DM (TRY,^D100,DF$TRY,DF$TRY)
DM (TST,177777,0,0)
>;END IFN FT$TST
KEYS (ERL,)
KEYS (MOD,)
DOSCAN (SWT)
SUBTTL .OSCAN/MTAPE COMMAND SWITCH TABLES
IFN FT$OPT,< ;ONLY IF ASSEMBLED FOR OPTION SCANNNING
DEFINE SWTCHS,<
SP BUFSIZ,BUFSIZ,.SWDEC##,BFZ,FS.NUE
SL ERROR,ERRFLG,ERL,ERLCON,FS.NUE
SP IBUF,NIBUFS,.SWDEC##,BFS,FS.NUE
SS *IFTYP,,1,FS.NUE
SP LOG,$LOGSW,.POPJ##,LGF,FS.NFS!FS.NCM!FS$SPL
SP OBUF,NOBUFS,.SWDEC##,BFS,FS.NUE
SS TIME,TIMEFL,1,FS.NUE
>
DOSCAN (OPSW)
>;END IFN FT$OPT
IFN FT$MTP,<
DEFINE SWTCHS,<
SP *BACKSP,FN$BSP,.SWDEC##,MTN,FS$XTR
SS *EOF,FN$EOF,FN$EOF,FS$NVL
SS *REWIND,FN$REW,FN$REW,FS$NVL
SP *SKIP,FN$SKP,.SWDEC##,MTN,FS$XTR
SS *UNLOAD,FN$UNL,FN$UNL,FS$NVL
>
DOSCAN (MTSW)
>;END IFN FT$MTP
SUBTTL HELPER ROUTINES FOR SCANNING COMMANDS
;SCAN CALLS HERE TO ALLOCATE SPACE FOR INPUT SPEC
AIN: TLNN F,FL$CPY!IFN FT$MTP, ;DID WE SEE /COPY OR /CONCAT?
;OR IS THIS MTAPE COMMAND?
PUSHJ P,CPYHOL ;NO--SET UP TO COPY WHOLE TAPE
HRROI T1,FN$EOL ;SET END OF LIST
PUSHJ P,PRMSTO ;...
MOVEI T1,INPSPC ;POINT TO SPEC
PJRST ALEN ;GET LENGTH AND RETURN
;SCAN CALLS HERE TO ALLOC OUTPUT SPEC SPACE
AOUT: HRROI T1,FN$INP ;SET END OF OUTPUT LIST
PUSHJ P,PRMSTO ;...
PUSHJ P,ALEN ;SETUP MODFLG AND T2 (LENGTH)
TLO F,FL$OUT ;OUTPUT SPEC ALLOCATED
MOVEI T1,OUTSPC ;HERE IT IS!
POPJ P, ;RETURN FROM AOUT
ALEN: SKIPG T2,MODFLG ;/MODE:MODE SPECIFIED THIS SIDE?
JRST ALEN2 ;NO--DON'T BOTHER WITH IT
TLNE F,FL$OUT ;INPUT?
MOVEM T2,INPMOD ;YES
TLNN F,FL$OUT ;OUTPUT?
MOVEM T2,OUTMOD ;YES
SETOM MODFLG ;RESET MODFLG SO SCAN DOESN'T BARF
ALEN2: MOVEI T2,LN$FDB ;TELL SCAN LENGTH OF FDB
POPJ P,
;SCAN CALLS HERE TO CLEAR ALL ANSWERS
CLRANS: STORE T1,SCN$FZ,SCN$LZ,0
STORE T1,SWT$FO,SWT$LO,-1 ;WORD SWITCHES TO -1 PLEASE
MOVE PLP,PLPINI ;SETUP PARAM LIST PTR
IFN FT$MTP,<
TLNN F,FL$MTP ;MTAPE COMMAND?
POPJ P, ;NO
HRROI T1,FN$INP ;YES--FORCE TO INPUT SIDE ONLY
PUSHJ P,PRMSTO ;SET ON PARAM LIST
>;END IFN FT$MTP
POPJ P,
;FIX UP TO COPY WHOLE TAPE...NO /COPY OR /CONCAT
CPYHOL: MOVEI T1,FN$CPY ;FUNCTION
HRLOI T2,677777 ;LARGE NUMBER OF FILES/RECORDS
PJRST PRMSTO ;SET ON PARAM LIST AND RETURN
;HERE TO STORE /LOG SWITCH
$LOGSW: CAIE C,":" ;IS THERE A FILE SPEC?
JRST [MOVEI T1,1 ;NO--STORE A 1
MOVEM T1,LOGSPC;...
POPJ P,] ;RETURN TO SCAN
PUSHJ P,.FILIN## ;READ THE FILE SPEC
MOVEI T1,LOGSPC ;POINT AT MY STORAGE
MOVEI T2,.FXLEN
PUSHJ P,.GTSPC## ;COPY SPEC TO MINE AREA
MOVEI T1,1 ;NO SENSE IN SCAN CALLING CLRFIL NOW
PJRST .CLRFL## ;CLEAR FILE AREA AND RETURN
;SCAN CALLS HERE TO CLEAR ALL FILE ANSWERS
CLRFIL: POPJ P, ;***
;SCAN CALLS HERE TO STORE FILE SWITCHES
;WITH N=VALUE,T2=PTR (FUNCTION FN$XXX IN THIS CASE), AND T3=FLAGS (LH)
;ALSO P1=SWITCH INDEX
STOSWT:
TLNE T3,(FS$SPL) ;SPECIAL PROCESSING?
JRST @SWTP(P1) ;YES--GO THERE
TLNN T3,(FS$OUT) ;SWITCH OUTPUT ONLY?
JRST STOSWA ;NO
TLNE F,FL$OUT ;YES--IS OUTPUT DONE?
JRST E$$OSI ;YES--GO BOMB--OUTPUT SWITCH ON INPUT
STOSWA: TLNN T3,(FS$INP) ;INPUT ONLY?
JRST STOSWB ;NO--GO STORE IT
TLNN F,FL$OUT ;YES--OUTPUT DONE YET?
JRST E$$ISO ;NO--GO BOMB
STOSWB: TLNE T3,(FS$NVL) ;NEVER TAKE A VALUE?
JRST SWTS0A ;YES--MAKE SURE IT DOESN'T GET ONE
;(BUT SET VALUE OF ONE SO IT GETS DONE ONCE)
TLNN T3,(FS$XTR) ;NO--DOES IT TAKE EXTRA VALUES?
JRST SWTST0 ;NO--JUST MOVE ALONG
CAIE C,":" ;YES--IS THERE ONE?
JRST SWTST0 ;NO--ONLY RECORDS WERE GIVEN
SAVE$ ;YES--SAVE VALUE, AND PTR (FUNCTION)
PUSHJ P,.DECNW## ;READ SECOND VALUE
RESTR$ ;RESTORE GOOD STUFF AND POSITION IN CORRECT ACS
MOVSS T2 ;BUT FILE COUNT GOES IN LEFT HALF
HRR T2,N ;AND RECORD COUNT TO RIGHT HALF
PJRST PRMSTO ;STORE PARAMS, AND SKIP SCAN SWITCH STORE
SWTS0A: MOVEI N,1 ;FS$NVL--MAKE SURE IT GETS DONE 1 TIME
SWTST0: MOVE T1,T2 ;POSITION FUNCTION
HRRZ T2,N ;AND VALUE (NOTE /BACKSP:N MEANS N RECORDS)
; PJRST PRMSTO ;GO STORE PARAMS AND RETURN
;CALL PRMSTO TO STORE PARAMETERS IN FUNCTION PARAMETER LIST
;WITH T1=FUNCTION, T2=VALUE
PRMSTO: PUSH PLP,T1 ;STORE PARAMETER
PUSH PLP,T2 ;AND VALUE (NOT USED IF DOESN'T TAKE ONE)
CAIE T1,FN$CPY ;IF THIS IS /COPY
CAIN T1,FN$CON ;OR /CONCAT
TLO F,FL$CPY ;THEN WE HAVE A COPY SWITCH
POPJ P, ;DONE
E$$OSI: MOVE T1,SWTN(P1) ;GET SWITCH NAME FOR DUM USER
ERROR. EF$FTL!EF$SIX,OSI,