Trailing-Edge
-
PDP-10 Archives
-
cust_sup_cusp_bb-x130c-sb
-
10,7/unscsp/umount/umount.mac
There are 6 other files named umount.mac in the archive. Click here to see a list.
TITLE UMOUNT - USER HALF OF MOUNT, DISMOUNT, & FILE COMMAND V.26
;COPYRIGHT 1972,1973,1974 DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
SUBTTL D BLACK 30-OCT-72 /JHT
VWHO==0 ;WHO LAST PATCH'D
VMAJOR==26 ;MAJOR VERSION NO.
VMINOR==1 ;MINOR VERSION NO.
VEDIT==103 ;EDIT LEVEL
VUMOUN==BYTE(3) VWHO (9) VMAJOR (6) VMINOR (18) VEDIT
;REVISION HISTORY STARTED 10/74 BY J. TALMADGE
;
; 1 GET STARTED
;
; 2 FIX INCONSISTENCY IN MSG112: NONE PENDING FOR /CHECK
; SER
;
; 3 CHKACC FOR FILE COMMANDS FAILS FOR PROTECTION <055>:
; MOVE SHOULD BE MOVEI
;
; 4 DEVICE NUL: REQUIRES /REELID!
; AREA AFFECTED: MOUNT
;
; 5 PUT FILE CODE UNDER CONDITIONAL
;
; 6 ADD /SHOVE & /NOSHOVE SWITCHES
; AREA AFFECTED: ERR911
;
; 7 FIX PROBLEM WITH ^Z.
; AREA: R.TTY
;
; 10 CORRECT FACT FILE PROCESSING TO CALL DAEMON ONLY IF
; OMOUNT WAS NEVER INVOLVED.
;
; 11 ADD ^C INTERCEPT AND THEREBY TYPE-AHEAD.
;
; 12 DISALLOW /WAIT WITH OTHER STUFF; DELETE /NOWRITE;
; IMPLEMENT /NOWAIT
; AREA AFFECTED: UMSLST,UMSWAI,UMSNOW,OPREQ2...
;
; 13 DELETE SOME CODE NOT NEEDED WITH ^C INTERCEPT
; AREA AFFECTED: OPREQ2
;
; 14 CHANGE %SS002 FEATURE TEST TO FTSPTB
; AREA AFFECTED: RCOML, FCOML
;
; 15 MOUNT/CHECK WON'T WORK IF USER NOT LOGGED IN
; AREA AFFECTED: MOUNT
;
; 16 IF RIDSW = 0, A MOUNT TO A NON-MTA DEVICE WITHOUT A
; REELID WILL GET ERR105
; AREA AFFECTED: MOUNT0
;
; 17 CHANGE AROUND OLD VIDSW AND CURRENT %SS006 TO DO CORRECT
; THING. NO NEED TO HAVE BOTH FEATURE TESTS
;
; 20 FIX UMOUNT'S FACT FILE STUFF FOR DISMOUNT
;
; 21 DISALLOW /WRITE W NO ARGUMENT SINCE /NOWRITE WAS DELETED
; IN EDIT 12
;
; 22 GOVERN R.NJAC BY [1,2] AS WELL AS JACCT FOR DEBUGGING
;
; 23 DATE75 BUG IN SET UP FOR EXTENDED LOOKUP/ENTER/RENAME
; AREA AFFECTED: SETEXL
;
; 24 FIX GETQUO ROUTINE TO HANDLE (777777,,777777) ENTRY IN
; QUOTA.SYS. NOW UMOUNT GETS CONFUSED OVER WHERE IT IS IN
; THE FILE AND THE RESULT WAS THAT IF -1 EXISTED, THE DEFAULT
; QUOTAS WERE USED EVEN IF THE USER HAD AN ENTRY IN QUOTA.SYS.
; SPR 14783
; AREA AFFECTED: GETQUO
;
; 25 CHANGE %SS015 TO LOGSW; DELETE %SS021: MAKE IT THE ONLY WAY
;
; 26 ALLOW ALL OPTIONS FOR WRITE-LOCK AND WRITE-ENABLE FOR
; FILE STRUCTURES AND NON-FILE STRUCTURES
; AREA AFFECTED: CONDITIONALS,MOUNT,MOOP2,MOFS
;
; 27 IMPLEMENT /NOWAIT FOR BATCH'S SAKE
;
;EDIT 27 WENT TO FIELD TEST 1/15/75
;
; 30 COMPLETE /NOWAIT AND /WAIT IMPLEMENTATION
; AREA AFFECTED: REMREQ, DMSWAI, UMSWAI
;
; 31 IN FINDING DEVICE WHERE FILE CMD DIRECTORY SHOULD GO,
; VERIFY THERE'S A UFD. IF NONE, PASS DSK: TO OMOUNT, WHICH
; HAS TO BE CHANGED TOO. ALSO, CATCH FILE R WITHOUT FILE
; SPEC IF DSK: HAS NO UFD
; QAR 3303
; AREA AFFECTED: NXTST, RCOML, COMSET
;
; 32 CHANGE FACT FILE BLOCK: COMBINE F.ELPD AND F.UNIT INTO
; F.UNIT WITH FLAGS IN LH AND UPTIME IN RH. ALSO CHANGE
; CODE TO 271 FROM 251.
;
; 33 IF /REASSIGN GIVES INVALID JOB NO., IT WILL LOOP
; ISSUING MSG '.../RELEASE ASSUMED'. SETZM TOJOB NEEDED.
; QAR 3313
; AREA AFFECTED: DISMN4
;
; 34 DEV: NOT ASSIGNED' MESSAGE FROM DISMOUNT DOESN'T EXIT
; BUT IN FACT WILL LEAD TO AN EXTRA DISMOUNT ENTRY IN THE
; FACT FILE. HAVE IT TERMINATE IMMEDIATELY.
; QAR 3304
; AREA AFFECTED: MSG105, DISMN1
;
; 35 CLOSE HOLES IN FACT LOGIC THAT ALLOWED BOTH UMOUNT AND
; AND OMOUNT TO WRITE FACT RECORDS ON DISMOUNT. SET
; IDIDIT IN COMBEG NOT MSG110 WHICH IS ONLY CALLED IF USER
; CHOSE TO WAIT ON DISMOUNT.
; QAR 3315,3338,3387,3391,3392
; AREA AFFECTED: COMBEG, MSG110
;
; 36 HAVE CKEOL EAT TRAILING BLANKS AND TABS SO GOOD COMMAND
; WITH OR WITHOUT COMMENT WILL NOT GET ?SYNTAX ERROR. ADD
; PUSHJ P,SST...
; QAR 3361,3382
; AREA: CKEOL
;
; 37 CHANGE VUMOUN TO STANDARD FIELDS
; QAR 3332
;
; 40 CORRECT CHECK FOR LEVEL-C IN INITIALIZATION
; QAR 3345
; AREA AFFECTED: REGO
;
; 41 SET REELID IF WE DO THE MOUNT!
; QAR 3363
; AREA: MOUNT3
;
; 42 CLEAR SOME BITS IN MOUNT CODE FOR NON-F/S SO F/S SWITCHES
; ARE NOT SENT TO OMOUNT.
; QAR 3370
; AREA: MOUNT1
;
; 43 MOVE GETTAB FOR EFFICIENCY
; QAR 3333
; AREA: CCOM3
;
; 44 FIX CODE THAT INTERCEPTS TAPE ALREADY UNLOADED ON UNLOAD
; UMOUNT WAS LEAVING INTBLK POINTING TO DISM0A WHICH WOULD
; LEAVE THE POSSIBILITY OF A DISMOUNT MESSAGE, REQUEST, AND
; FACT ENTRY BEING DONE TWICE IF USER HIT 2 ^C'S AFTER
; SETTING UP INTBLK FOR THE UNLOAD TRAP. INTBLK SHOULD BE
; RESET TO WHAT IT LOOKED LIKE BEFORE THE UNLOAD CODE ENTERED.
; QAR 3334,3389
; AREA: DISM0A
;
; 45 ADD ? TO 'STRUCTURE NOT MOUNTED' MESSAGE
; QAR 3347
; AREA: ERR6
;
; 46 IN VERIFYING CMDSTR, DO PHYSICAL ONLY DSKCHR TO AVOID
; NEEDLESS ERROR IF IT'S ASSIGNED AS LOGICAL NAME FOR
; ANOTHER NON-DISK DEVICE
; QAR 3352
; AREA: STR12
;
; 47 ALLOW "!" AS COMMENT CHARACTER
; QAR 3388
; AREA: CKEOL
;
; 50 RELEASE A NON FILE STRUCTURE DEVICE AFTER REASSIGNING
; IT SO OMOUNT DOESN'T THINK WE STILL HAVE IT.
; QAR 3314
; AREA DISM0B
;
; 51 GENERAL ERRORS TRYING TO CREATE CMD FILE YIELDED
; "SYSTEM ERROR AT LOC..." CHANGE TO "?UNABLE TO CREATE
; QUEUE REQUEST, ENTER CODE = ..."
; AREA: FILENF
;
; 52 DON'T CHECK QUOTAS, ETC. ON F/S BEING DISMOUNTED IF USER
; HAS NO UFD.
; QAR 3356
; AREA: DISMN3
;
; 53 DON'T TYPE "%SPECIFIED LOGICAL NAME IN USE" IF USER MOUNTS
; A DEVICE USING LOGICAL NAME THAT IS ALREADY ASSIGNED.
; QAR 3337
; AREA:CKLOG3
;
; 54 DON'T GIVE "UFD RENAME ERROR 26" IF USER DISMOUNTS A F/S
; WITH /NOWRITE SET
; QAR 3351
; AREA: UFDCCB
;
; 55 DO PHYSICAL ONLY OPEN ON TTY SO IF ITS ASSIGNED AS LOGICAL
; NAME FOR ANOTHER DEVICE, UMOUNT WILL NOT GET CONFUSED.
; QAR 3357
; AREA: REGO
;
; 56 HAVE UMOUNT BE ABLE TO ALWAYS WRITE FACT ENTRIES DEPEND
; ON 'FTFCT1' WHICH WILL BE TURNED OFF.
; QAR 3365,3393
;
; 57 ALLOW TABS IN VID
; QAR 3335
; AREA: VIDIN3
;
; 60 CLEAR L.SIN IF /MULTI USED (ELSE: MOU STR/SINGLE/MULTI
; WILL REQUEST SINGLE ACCESS.
; QAR 3379
; AREA: UMSMUL
;
; 61 CHANGE PAGE PSEUDO-OPS TO FORM FEEDS
; QAR 3330
;
; 62 EDIT 54 TRIED VERY HARD TO FIX THE RENAME ERROR, BUT
; DIDN'T REALIZE THAT THE MONITOR HAD REGISTERED THE /RONLY
; STATE OF THE STR. ON THE LOOKUP AND STILL TREATED IT AS
; THOUGH IT WERE IN THAT STATE EVEN AFTER THE STRUUO TO
; CLEAR THE /RONLY STATUS. TO KEEP THE MONITOR ADVISED
; OF WHAT WE'RE DOING WE MUST CLOSE THE STR (CHNL USR)
; BEFORE THE RENAME
; AREA: UFDCLF
;
; 63 EDIT 46 DID NOT ALLOW FOR CHANNEL CMU, WHICH MUST BE
; OPENED PHYSICAL ONLY.
; AREA: STAR12
;
; 64 PUT IN VIDRID CONDITIONAL WHICH WILL CAUSE A VID TO BE
; IF A REELID IS NOT SUPPLIED FOR A MAGTAPE.
; QAR 3307,3368
; AREA: MOUNT
;
; 65 ADD -1 SETTING TO RIDSW WHICH WILL NOT FORCE USER TO
; GIVE REELID FOR MAGTAPE MOUNT IF THE REQUEST IS GOING
; TO THE OPERATOR. CONTINUE TO REQUIRE IT IF UMOUNT WILL
; DO THE ENTIRE MOUNT
; QAR 3339
;
; 66 RELEASED AS VERSION 26(66) IN APRIL, 1975
;
; MAKE EDIT 100 THE FIRST EDIT OF 26A
;
; 100 MAKE UMOUNT SMARTER ABOUT ERSATZ DEVICES (EG. SYSA,HLPB)
; THESE NAMES NOW GIVE VERY CONFUSING SET OF MESSAGES
; SPR 15615
; AREA:MOUNT
;
; 101 REELID DOESN'T GET SET IF USER OWNS DRIVE BUT OMOUNT IS
; NEEDED
; SPR 16466
; AREA: MOOP1
;
; 102 UMOUNT DOES NOT CHECK PHYSICAL DEVICE WHEN IT SHOULD
; IN GENERATING LOGICAL NAME
; SPR 16467
; AREA: NAMPHY
;
; 103 UMOUNT GIVES 'LOGICAL NAME IN USE' MESSAGE AND GENERATES
; NEW LOGICAL NAME WHEN IT SHOULDN'T, NAMELY IF USER
; MOUNTS A DEVICE BY A LOGICAL NAME HE IS ALREADY USING
; SPR 16468
; AREA: ASLOG
;
;[END OF REVISION HISTORY]
IFNDEF PURESW,<PURESW==1> ;NON-ZERO MAKES REENTRANT SHARABLE
IFNDEF MNTSW,<MNTSW==1> ;NON-ZERO INCLUDES MOUNT STUFF
IFNDEF VIDSW,<VIDSW==1> ;NON-ZERO REQUIRES /VID SWITCH FOR MOUNTING
; NON-STRUCTURE DEVICES
IFNDEF RIDSW, <RIDSW==1> ;NON-ZERO REQUIRES /REELID FOR MOUNTING MAGTAPES
; IF +1, USER MUST ALWAYS GIVE REELID
; IF -1, USER MUST GIVE REELID ONLY IF
; HE IS DOING THE MOUNT (I.E.,
; WHEN OMOUNT NOT CALLED)
IFNDEF VIDRID, <VIDRID==0> ;NON-ZERO ALLOWS VID TO BE USED AS REELID
; FOR MAGTAPE
IFNDEF WLSW, <WLSW==0> ;NON-ZERO MAKES WRITE-LOCK DEFAULT FOR ALL
IFNDEF WESW, <WESW==0> ;NON-ZERO MAKES WRITE-ENABLE DEFAULT FOR ALL
IFNDEF WLFS, <WLFS==0> ;NON-ZERO MAKES W/L DEFAULT FOR F/S'S
IFNDEF WLNOFS, <WLNOFS==1> ;NON-ZERO MAKES W/L DEFAULT FOR NON-F/S'S
IFNDEF WEFS, <WEFS==1> ;NON-ZERO MAKES W/E DEFAULT FOR F/S'S
IFNDEF WENOFS, <WENOFS==0> ;NON-ZERO MAKES W/E DEFAULT FOR NON-F/S'S
IFN WLSW, <WLFS==1 ;NON-ZERO MAKES WRITE LOCK DEFAULT CONDITION
WLNOFS==1> ; FOR ALL MOUNT REQUEST
IFN WESW, <WEFS==1 ;NON-ZERO MAKES WRITE ENABLE DEFAULT CONDITION
WENOFS==1> ; FOR ALL MOUNT REQUESTS
IFN WLSW, <IFN WESW,<PRINTX<Conditional inconsistency: WLSW&WESW = 1>
END>
IFN WEFS, <PRINTX<Conditional inconsistency: WLSW&WEFS - WEFS==0>
WEFS==0>
IFN WENOFS, <PRINTX<Conditional inconsistency: WLSW&WENOFS - WENOFS==0>
WENOFS==0>>
IFN WESW, <IFN WLFS,<PRINTX<Conditional inconsistency: WESW&WLFS=1 - WLFS==0>
WLFS==0>
IFN WLNOFS,<PRINTX<Conditional inconsistency: WESW&WLNOFS=1 - WLNOFS==0>
WLNOFS==0>>
IFN WLNOFS, <IFN WENOFS,<PRINTX<Conditional inconsistency: WENOSW&WLNOFS=1>
END>>
IFN WLFS, <IFN WEFS,<PRINTX<Conditional inconsistency: WEfs&WLFS=1>
END>>
IFE WLFS, <IFE WEFS,<PRINTX<Conditional inconsistency: WEfs&WLFS=0>
END>>
IFE WLNOFS, <IFE WENOFS,<PRINTX<Conditional inconsistency: WENOSW&WLNOFS=0>
END>>
IFNDEF ACTSW,<ACTSW==1> ;NON-ZERO PUTS STRUCTURE INTO ACTIVE
;SEARCH LIST; 0 PUTS IT IN PASSIVE LIST
IFNDEF DBUGSW,<DBUGSW==0> ;NON-ZERO FOR DEBUGGING
IFNDEF JACTSW,<JACTSW==1> ;NON-ZERO TO REQUIRE SENSITIVE PARTS TO
;RUN UNDER JACCT (SHOULD=0 ONLY FOR DEBUGGING
IFNDEF MPBWAI,<MPBWAI==1> ;NON-ZERO HAS MPB JOB DO AUTOMATIC /WAIT
;AFTER FILE COMMAND
IFNDEF FILESW,<FILESW==1> ;IF NON-ZERO, INCLUDE FILE CODE
IFNDEF FTSPTB,<FTSPTB==0> ;TREAT SPACE, TAB (AS WELL AS COMMA) AS FILENAME DELIMITERS
IFNDEF UNLOSW, <UNLOSW==1> ;+1 = /UNLOAD, 0 = /REWIND, -1 = /STAY
;AS DEFAULT FOR TAPE POSITIONING
IFNDEF LOGSW,<LOGSW==1> ;FIXES VARIOUS DEVICE ALLOCATION PROBLEMS
; GENERATE A LOGICAL NAME IF NONE SPECIFIED
; ALWAYS PRINT PHYSICAL NAME ASSIGNED
; IF THE USER-SPECIFIED LOGICAL NAME IS IN USE,
; DELETE IT FROM THE PREVIOUS DEVICE
IFNDEF PTHLEN, <PTHLEN==4+^D5> ;MAX LTH OF SFD PATHS
IFNDEF SPONUL,<SPONUL==1> ;SUPPORT MOUNT OF SPOOLED DEVICES & DEVICE NUL:
IFNDEF MTA0SW,<MTA0SW==0> ; TREAT MTA0 AS A SPECIAL 7-TRACK DRIVE
;THIS CAN BE USED IF MTA0(OR ANY OTHER
;SINGLE DRIVE) IS THE ONLY 7- OR 9- TRACK
;DRIVE IN THE SYSTEM: SEE REFERENCE TO MTA0SW
;WARNING** THIS CODE SHOULD ONLY BE USED
;AS A GUIDE FOR EACH INSTALLATION'S
;IMPLEMENTATION OF SEPARATING 7- AND 9-
;TRACK DRIVES**
IFNDEF FTFACT, <FTFACT==1 ;ADD DEC-STYLE FACT ACCOUNTING FOR MOUNT & DISMOUNT
;FILE COMMAND FACT CODE IS ALL IN OMOUNT
IFN FTFACT,<
IFNDEF FTFCT1,<FTFCT1==0>>> ;NON-ZERO MEANS FOR UMOUT
;TO ALWAYS WRITE FACT ENTRIES WHETHER OR
;NOT OMOUNT CALLED
EXTERN .JBFF,.JBREL,.JBSA,.JBDDT,.JBINT
MLON
.JBVER==137
LOC .JBVER
EXP VUMOUN
;-------STORAGE ZZCROS
IFN PURESW,<
TWOSEG
RELOC 0
RELOC 400000
DEFINE UU(A,B)<
RELOC
A: BLOCK B
RELOC
>
> ;IFN PURESW
IFE PURESW,<
RELOC
DEFINE UU(A,B)<
A: BLOCK B
>
> ;IFE PURESW
DEFINE U(A)<UU(A,1)>
;AC'S
F=0
A=1
B=2
C=3
D=4
E=5
NUM=7
IO=10
M=11
N=12
N1=13
BP=14
CH=15
WD=16
P=17
;I/O CHANNELS
CMD==1 ;WRITE COMMAND FILE TO OPR
USR==2 ;TEMP
CMU==3 ;READ DIRECTORY OF COMMAND AREA
TTY==4 ;USER'S TTY
US1==5 ;TEMP
;SPECIAL CHARACTERS
CHRLIN=="-" ;FOR LINE CONTINUE
VIDMAX==^D50 ;MAX # CHAR.S IN /VID SWITCH
;DELIMITERS FOR /VID SWITCH TEXT
VIDCH1=="'" ;SINGLE QUOTES
VIDCH2==42 ;DOUBLE QUOTES
CMDSTX==SIXBIT/DSK/ ;DEFAULT 3,3 AREA
CMDPPX==3,,3
STLSTX==SIXBIT/SYS/ ;WHERE TO FIND STRLST?SYS
STLPPX==0
;SPECIAL NAMES
SYSFIL==SIXBIT/OPRFIL/ ;PROG.NAME OF OMOUNT DOING FILE COMMANDS
SYSMOU==SIXBIT/OPRMNT/ ;... DOING MOUNT/DISMOUNT COMMANDS
SYSOMO==SIXBIT/OPROMO/ ;... DOING BOTH
;MISC VALUES AND BITS
FILSLP==^D15 ;SEC'S TO SLEEP ON 'FILE W' (IF NO HIBER)
MOUSLP==^D15 ;SEC'S TO SLEEP ON MOUNT/DISMOUNT (IF NO HIBER)
DTDNFI==^D22 ;MAX NUMBER OF FILES ON A DECTAPE
CNTRLC==3 ;ASCII FOR CONTROL C
ALTMO==33 ;ASCII FOR ALTMODE
;GETTAB ARGUMENTS
CNFTBL==11 ;CONFIGURATION TABLE
SEGPTR==15 ;INDEX FOR SEGS, JOBS
PRJPRG==2 ;PRJPRG TABLE
JBTPRG==3 ;JBTPRG TABLE
JBTSTS==0 ;JBTSTS TABLE
JACCT==1 ;JACCT BIT
STATAB==11 ;GETTAB TABLE FOR STATES WORD
STAIND==17 ;INDEX IN TABLE FOR STATES WORD
OPQPTB==16 ;GETTAB TABLE FOR PPN FOR COMMANDS
OPQPIN==4 ;INDEX IN TABLE FOR PPN FOR COMMANDS
OPQSTB==16 ;GETTAB TABLE FOR STR FOR COMMANDS
OPQSIN==15 ;INDEX IN TABLE FOR STR FOR COMMANDS
.GTNSW==12 ;NON-SWAPPING TABLE
.GTLVD==16
%LDFFA==2 ;FAILSA PPN (1,2)
%NSHJB==20 ;HIGHEST CURRENTLY ASSIGNED JOB NUMBER
STAOMO==100 ;0--ALL MOUNTS MUST GO TO OPR
;1--UMOUNT MAY MOUNT IF POSSIBLE
STAOPR==400 ;0--OPERATOR PRESENT
;1--NO OPERATOR
STAVER==POINT 3,0,9 ;VERSION BYTE
VER503==2 ;...VALUE FOR 5.03 MONITORS
IFN FTFACT, <
.GTLOC==26 ;GETTAB TABLE # FOR REMOTE STATION
SERIAL==20,,CNFTBL ;CPU0 SERIAL # GETTAB ITEM & TABLE #
>; END OF IFN FTFACT
CNOPR==13,,CNFTBL ;'OPR' TTY GETTAB ITEM & TABLE #
IFN RIDSW, <
%CNVER==34,,CNFTBL ;GETTAB PARMS FOR MONITOR VERSION #
>; END OF IFN RIDSW
OPDEF HIBER [CALLI 72]
HIBNOJ==4 ;(LH) ONLY PRIV.JOBS CAN WAKE
HIBTTL==20 ;(LH) WAKE ON TTY LINE
HIBSWP==400000 ;(LH) SWAP IMMEDIATELY
OPDEF WAKE [CALLI 73]
;FLAGS
L.TYO==1 ;CHARACTERS IN TTY OUTPUT BUFFER NOT YET OUTPUT
L.ARGD==2 ;DIALOGUE FOR ARGS
L.REGO==4 ;REENTER TYPED
L.BRAK==10 ;BRACKED ([) DETECTED
L.CMA==20 ;COMMA DETECTED
L.DOT==40 ;PERIOD DETECTED
L.WLD==100 ;WILD * DETECTED
L.VID==200 ;VID SWITCH
L.FRE2==400 ;USED BY UFDSET AND UFDCLR
L.PEND==400
L.BRK==1000 ;BREAK CHAR DETECTED
L.SPC==2000 ;SPACE DETECTED
L.PWA==4000 ;SET IF PAUSE BEFORE WAITING REQUESTED
L.SIN==10000 ;SET IF FILE STRUCTURE REQUESTED SINGLE
L.REM==L.SIN ;SET IF USER REQUESTED REMOVE (DISMOUNT)
L.WRTL==20000 ;SET IF USER REQUESTED WRITE-LOCK
L.FRE1==40000 ;USED BY UFDSET AND UFDCLR
L.DIS==40000 ;SET IF DISMOUNT INSTEAD OF ADDSTR
L.RID==100000 ;SET IF /REELID SPECIFIED
L.EOL==200000 ;SET IF END OF LINE SEEN
L.WEN==400000 ;/WENABLE
R.NJAC==400000 ;SET IF JACCT BIT NOT ON (NOT ENTERED BY COMMAND)
R.ASCO==100000 ;DEV IS ASSIGNED BY CONSOLE
R.Z==200000 ;USED ON FILE Z
R.VIDT==10000
R.PAS==400 ;ON=MOUNT STR IN PASSIVE S/L
;OFF=MOUNT STR IN ACTIVE S/L
R.NOC==200 ;ON=SET NOCREATE FOR F/S
;OFF=SET CREATE FOR F/S
R.ARGD==L.ARGD ;SAVED VALUE OF 'L.ARGD' FOR PROMPT TESTING
R.SHOV==100 ;ON = SHOVE REQUEST TO OPR IF SCHED = 400
;OFF = HONOR SCHED 400
R.NOWA==10 ;DETECTED /NOWAIT
R.WAIT==20 ;DETECTED /WAIT
R.CLR==R.PAS!R.NOC!R.SHOV!R.NOWA!R.WAIT
;TTCALL FUNCTIONS
CLRINB==11 ;CLEAR INPUT BUFFER
SKPINL==14 ;SKIP IF A LINE WAS TYPED
;LOOKUP/ENTER/RENAME ERROR CODES
NUFERR==1 ;NO UFD
FBMERR==3 ;FILE BEING MODIFIED
NRMERR==14 ;NO ROOM
UFDQEE==1 ;QUOTA EXCEEDED
OPDEF PJRST [JRST]
OPDEF PJUMPE [JUMPE]
OPDEF PJSP [JSP]
PHONLY==200000 ;BIT TO FORCE UUOS TO CONSIDER ONLY PHYS. NAMES
PHOPEN==1B0 ;BIT TO FORCE OPEN TO USE PHYSICAL-ONLY
;DEVCHR BITS
DC.FS==200000 ;(LH)FILE STRUCT.
DC.DTA==100 ;(LH)DECTAPE
DC.MTA==20 ;(LH)MAGTAPE
DC.AVA==40 ;(LH)AVAILABLE
DC.ASC==400000 ;(RH)ASSIGN.BY CONSOL
DC.ASP==200000 ;(RH)ASSIGN.BY PROG.
IFN VIDSW, <
DC.OUT==1 ;(LH) DEVICE CAN DO OUTPUT
>; END OF IFN VIDSW
DC.DIS==2000 ;(LH) DEVICE IS A DISPLAY
DC.TTY==10 ;(LH) DEVICE IS A TTY
OPDEF DSKCHR [CALLI 45]
CHRUFB==1 ;UFBTAL WORD
CHRNAM==4 ;ARGUMENT FOR STR NAME
CHRSMT==7 ;STR MOUNT COUNT
CHRSAJ==13 ;ARGUMENT FOR SINGLE ACCESS JOB NUMBER
CHRLEN==14 ;NUMBER OF ARGS
.UPHWP==100000 ;HARDWARE WRITE PROT.
.UPSWP==40000 ;SOFTWARE WRITE PROT.
.UPNNA==200 ;LOCKED BY OPER.
;DEVTYPE UUO PARAMETERS
OPDEF DEVTYP [CALLI 53]
.TYAVL==40 ;(LH)AVAILABLE
.TYJOB==POINT 9,0,26 ;JOB #
.TYTYP==POINT 6,0,35 ;DEVICE TYPE
.TYDSK==0 ;DISK
IFN SPONUL, <
.TYSPL==(1B13) ;SPOOLED DEVICE
>; END OF IFN SPONUL
.TYRAS==1B29 ;RESTRICTED DEVICE
OPDEF JOBSTR [CALLI 47] ;RETURNS USER'S NEXT FILE STRUCTURE
J.NOCR==200000
J.NOWR==400000
OPDEF STRUUO [CALLI 50]
SRCFST==0
SRCDSL==1 ;STRUUO FCN TO SET NEW SEARCH LIST
RDFFST==3
ULKSTR==6
UCLSTR==7
S.SWL==400000 ;WRITE-LOCK - SCRFST (.FSSRC)
S.NOC==200000 ;NO-CREATE - " "
S.SIN==200000 ;SINGLE-ACCESS - RDFFST (.FSDRF)
OPDEF SYSPHY [CALLI 51]
OPDEF DEVNAM [CALLI 64]
OPDEF DEVLNM [CALLI 107]
OPDEF GOBSTR [CALLI 66]
GOBJOB==0 ;INDEX FOR JOB NUMBER
GOBPPN==1 ;INDEX FOR PPN
GOBNAM==2 ;INDEX FOR STR NAME IN ARG LIST
DEFINE ERRMES (TEX) <
XLIST
MOVEI M,[ASCIZ \TEX\]
JRST ERRMSB
LIST>
DEFINE TEXT (TEX)<
XLIST
MOVEI M,[ASCIZ\TEX\]
LIST>
DEFINE TYPE (TEX)<
XLIST
MOVEI M,[ASCIZ\TEX\]
PUSHJ P,MSGTTY
LIST>
DEFINE PTYPE (TEX)<
XLIST
MOVEI M,[ASCIZ\TEX
\]
PJRST MSGTTY
LIST>
DEFINE XTYPE (TEX)<
XLIST
MOVEI M,[ASCIZ\TEX\]
JRST MSGRET
LIST>
DEFINE UFDSEM(TEXT)<
XLIST
MOVEI N1,[ASCIZ\TEXT\]
JRST UFDSMP
LIST>
;-------CHANGE SOME DEFINITIONS IF DEBUGGING
IFN DBUGSW,<
CMDSTX==SIXBIT/DSKB/ ;USE SEPERATE 3,3 AREA
CMDPPX==30,,2614
STLSTX==SIXBIT/SYS/ ;ALLOW SPECIAL STRLST.SYS
STLPPX==0
SYSFIL==SIXBIT/XXXFIL/ ;USE SEPERATE PROGRAM NAMES
SYSMOU==SIXBIT/XXXMNT/
SYSOMO==SIXBIT/XXXOMO/
> ;IFN DBUGSW
;VALUES FOR ARGUMENT TYPE RETURN FROM DSKCHR UUO
A.FS==2 ;FILE STRUCTURE NAME (DSKA)
A.PUN==6 ;PHYSICAL UNIT (DPA0)
;BITS SET IN AC RETURN FROM DSKCHR UUO
D.RDHM==400000 ;MONITOR MUST REREAD HOME BLOCK BEFORE NEXT I/O
D.OFFL==200000 ;DRIVE IS OFF-LINE
D.HWL==100000 ;DRIVE IS HARDWARE WRITE PROTECTED
D.SWL==40000 ;FILE STRUCTURE IS SOFTWARE WRITE PROTECTED
D.SIN==20000 ;SINGLE ACCESS ONLY FOR THIS FILE STRUCTURE
D.MC==10000 ;MOUNT COUNT = 0
D.PRV==4000 ;FILE STRUCTURE IS A PRIVATE FILE STRUCTURE
D.INFS==2000 ;IN A FILE STRUCTURE (IF 0)
D.DNBM==1000 ;DOWN OR BEING MOUNTED
D.LOK==200 ;NO FURTHER LOOKUPS, ENTERS, OR INITS ALLOWED
;BYTE POINTERS
;FOR VALUES RETURNED FROM DSKCHR UUO
IFN MNTSW,<
D.KONT: POINT 6,A,26 ;CONTROLLER TYPE
D.KONN: POINT 3,A,29 ;KONTROLLER NUMBER
D.UNIT: POINT 3,A,32 ;UNIT TYPE (DEPENDS ON CONTROLLER TYPE)
D.UNIN: POINT 3,A,35 ;UNIT NUMBER
D.ARGT: POINT 3,A,17 ;ARGUMENT TYPE
D.UST: POINT 2,A,8 ;UNIT STATUS
B.UST==3000 ;THE BITS
CLSBYT: POINT 3,PKCLAS(C),35 ;CLASS OF THIS UNIT
UTPBYT: POINT 3,PKCLAS(C),32 ;TYPE OF THIS UNIT (RP01 OR RP02)
KTPBYT: POINT 6,PKCLAS(C),26 ;TYPE OF THIS CONTROLLER (FH, DP)
> ;END CONDITIONAL ON MNTSW
STRFOR==0 ;FORMAT VERSION NUMBER FOR CURRENT FORMAT OF STRLST.SYS
QUOFOR==0 ;FORMAT VERSION NUMBER FOR QUOTA.SYS
;ARGUMENTS FOR EXTENDED LOOKUP, ENTER, RENAME
EXLLEN==26 ;LENGTH OF ARGUMENT LIST
EXLPPN==1 ;DIRECTORY NAME
EXLNAM==2 ;FILE NAME
EXLEXT==3 ;EXT
EXLPRV==4 ;PRIV BITS, ET AL.
EXLSIZ==5 ;WORDS WRITTEN IN UFD
EXLALC==11 ;BLOCKS ALLOCATED FOR FILE
EXLDEV==16 ;DEVICE ON WHICH FILE LOOKED UP IS
EXLSTS==17 ;STATUS BITS
.RBSTS==17
.RBNDL==1B19
RIPLOG==400000 ;LH BIT IS LOGGED IN BIT
RIPDIR==400000 ;RH BIT IS DIRECTORY BIT
EXLQTF==22 ;FIRST COME, FIRST SERVED QUOTA
EXLQTO==23 ;LOGGED-OUT QUOTA
EXLQTR==24 ;RESERVED QUOTA
EXLUSD==25 ;BLOCKS USED
HOMHID==1 ;WORD IN HOME BLOCK CONTAINING UNIT ID
HOMLOG==7 ;WORD IN HOME BLOCK CONTAINING SIXBIT LOG UNIT IN STR
MAXKON==8 ;MAXIMUM NUMBER OF CONTROLLERS
SUBTTL INITIALIZATION
;START OF PROGRAM
UMOUNT: JFCL ;IN CASE OF CCL
TDZA F,F ;NO FLAGS ON
REGO: MOVSI F,L.REGO ;ONLY ONE FLAG ON. REENTER HERE
MOVE P,PDP
RESET ;CLEAR OUT EVERYTHING
IFN PURESW, <
SETZM LOWBEG ;CLEAR 1ST WORD OF IMPURE STORAGE
MOVE A,[LOWBEG,,LOWBEG+1] ;GET BLT POINTER IN AN AC
BLT A,LOWEND-1 ;CLEAR *ALL* OF IMPURE STORAGE
UU(LOWBEG,0) ;DEFINE 1ST WORD OF IMPURE STORAGE
>; END OF IFN PURESW
MOVSI A,(PHOPEN) ;OPEN TTY PHYSICAL ONLY
GETLIN B, ;WHO AM I?
MOVE C,[WH.TTY,,RH.TTY] ;BUFFERS
TLNE B,-1 ;I COULDN'T BE DETACHED??!!
OPEN TTY,A
JRST GOEXIT
MOVEI A,B.TTY
MOVEM A,.JBFF
INBUF TTY,1
OUTBUF TTY,1
MOVE A,[XWD 4,INTLOC] ;SET UP INTERCEPT BLOCK
MOVEM A,INTBLK
MOVEI A,1B34 ;AND ENABLE FOR ^C-INTERCEPT
IORM A,INTBLK+1
SETZM INTBLK+2
MOVEI A,INTBLK ;ARM .JBINT
MOVEM A,.JBINT
MOVE A,[XWD STAIND,STATAB]
GETTAB A,
SETZ A,
MOVEM A,STATES ;SAVE STATES WORD
LDB B,LVDBTS ;GET MONITOR VERSION
MOVEM B,MONVER
JUMPE B,NEVERR ;LEVEL-C NOT SUPPORTED
MOVE B,SYSPPD ;LEVEL D DEFAULT SYS PPN
MOVE A,[XWD 1,16] ;SET UP FOR GETTAB OF SYS PPN
GETTAB A, ;RETRIEVE PPN FOR SYS
MOVE A,B ;DEFAULT
MOVEM A,SYSPPN
IFE DBUGSW,<
MOVE A,[XWD OPQPIN,OPQPTB]
STR11: GETTAB A, ;GETTAB TO GET PPN FOR COMMANDS TO OMOUNT
MOVE A,[CMDPPX]
MOVEM A,CMDPPN
MOVE A,[XWD OPQSIN,OPQSTB]
STR12: GETTAB A, ;GETTAB TO GET STR FOR COMMANDS
MOVE A,[CMDSTX]
MOVEM A,CMDSTR
MOVEM A,SRCBUF
MOVE B,[XWD CHRNAM+1,SRCBUF]
DSKCHR B,PHONLY ;GET DSKCHR
JRST NOLOGP ;NOT EVEN A DSK?
CAME A,SRCBUF+CHRNAM ;SKIP IF REAL STR NAME IS SAME AS GETTAB
JRST NOLOGP ;NO, MUST BE A LOGICAL NAME
TLNE B,.UPHWP!.UPSWP!.UPNNA ;PROTECTED OR LOCKED?
JRST NOWRTP ;YES
> ;IFE DBUGSW
IFN DBUGSW,<
MOVE A,[CMDPPX]
MOVEM A,CMDPPN
MOVE A,[CMDSTX]
MOVEM A,CMDSTR
> ;IFN DBUGSW
START1: PJOB A, ;GET STUFF FOR ID
MOVEM A,JOBNO ;JOB NUMBER
WAKE A, ;ISSUE A WAKE FOR SELF
JFCL ;(IGNORE ERRORS)
HRLI A,HIBNOJ!HIBTTL ;GET HIBER MASK BITS
IFN DBUGSW, <
TLZ A,HIBNOJ ;CLEAR JOB-MASK IF DEBUGGING
>; END OF IFN DBUGSW
HIBER A, ;SET MASK BITS NOW
JFCL ;(IGNORE ERRORS)
SETZM CHKFLG ;SET 0 TO SHOW NOT /CHECK
SETZM NOTLOG ;SET 0 TO SHOW LOGGED IN
MOVN A,JOBNO ;GET -JOB # FOR THE UUO
JOBSTS A, ;FIND OUT STATUS OF MYSELF
SETO A, ; NOT IMPL., SET AC -1
TLNN A,(1B1) ;TEST FOR LOGGED IN
SETOM NOTLOG ; NO, SET -1 TO SHOW NOT LOGGED IN
GETLIN A,
MOVEM A,TTYLIN ;TTY NAME
MOVSI B,%LDFFA ;FAILSA PPN
HRRI B,.GTLVD ;LEVEL D TABLE FOR PPNS
GETTAB B, ;GET OPR'S PPN(1,2)
MOVE B,FSFPPN ;USE [1,2] FOR DEFAULT
MOVEM B,FS1PPN ;SAFE FOR LATER
HRROI A,PRJPRG ;GET MY PPN
GETTAB A,
JFCL
HLRZ B,A ;FORM IOR'D PROJ # WITH PROG #
IORI B,(A)
HRRZM B,IORPPN ;AND SAVE IT FOR LATER ID USE
MOVEM A,USRPPN ;JOB'S PROJECT,PROGRAMMER NUMBER
IFN FTFACT, <
MOVEM A,F.PPN ;STORE FOR ACCOUNTING. ALSO
>; END OF IFN FTFACT
;CK FOR JACCT BIT (ONLY VALID FOR 5.03 SINCE IT WAS MOVED IN 5.02)
MOVE B,MONVER
CAIGE B,VER503
JRST STAR12
HRLZ B,JOBNO ;GET JBTSTS WITH GETTAB
GETTAB B,
JRST STAR12
CAME A,FS1PPN ;AM I [1,2]?
TLNE B,JACCT ; OR, IS JACCT ON?
JRST STAR12 ;YES, DON'T SET FLAG
TRO F,R.NJAC ;NOS-SET R.NJAC
STAR12: SETOM PTHPRM ;SET -1 TO READ DEFAULT PATH
MOVE A,[PTHLEN,,PTHPRM] ;POINT AT PATH. UUO PARM LIST
PATH. A, ;READ USER'S DEFAULT DIR PATH
SKIPA A,USRPPN ; FAILED, ASSUME HIS PPN AS DEFAULT
MOVE A,PTHPRM+2 ;GET THE PPN FOR HIS DEFAULT PATH
MOVEM A,DEFPPN ;STORE AS DEFAULT PPN (INITIAL)
MOVEM A,DIRPPN ;STORE AS DIRECTORY PPN
MOVEI IO,R.TTY
MOVE A,[XWD PHONLY,10]
MOVE B,CMDSTR ;STR FOR COMMAND QUEUE
MOVEI C,RH.CMU ;THIS CHANNEL WILL BE USED TO READ THE
OPEN CMU,A ; DIRECTORY OF THE COMMAND AREA
JSP N,CMUERR
MOVEI A,B.CMU
MOVEM A,.JBFF
INBUF CMU,1
PUSHJ P,REWCMU ;LOOKUP QUEUE UFD
JRST NOCMU ; IF NOT, OPR IS NOT RUNNING OPFILE
;SET STANDARD AND DEFAULT F.S.
MOVSI A,'DSK' ;USE DSK FOR DEFAULT
MOVEM A,DEFDEV
SETZM STDDEV ;START STANDARD DEVICE AT 0
SETO A,
NXTST1: MOVE D,[XWD 3,A] ;RE-INIT AC D
NXTST: JOBSTR D, ;GET NEXT STR IN JOB'S SEARCH LIST
JRST START2 ;GIVE UP
JUMPE A,START2 ;QUIT IF REACH FENCE
AOJE A,START2 ;OR END OF SEARCH LIST
SUBI A,1 ;KEEP LAST STR GIVEN
TLNE C,J.NOCR!J.NOWR ;OK IF NO CREATE OR NO WRITE NOT ON
JRST NXTST ;TRY FOR ANOTHER IF IT IS
MOVSI B,(PHOPEN) ;OPEN PHYSICAL ONLY
SETZ D, ;SET UP TO OPEN THIS DEVICE
MOVE C,A ;GET DEVICE NAME
OPEN USR,B
JRST NXTST1 ;??TRY NEXT DEVICE
MOVE B,USRPPN ;SET UP TO LOOKUP UFD
MOVSI C,(SIXBIT/UFD/)
SETZ D,
MOVE E,MFDPPN ;GET 1,,1
LOOKUP USR,B ;DO SO
JRST NXTST1 ;NO UFD, CAN'T USE FOR STDDEV
MOVEM A,STDDEV ;SAVE THIS DEVICE. ***NOTE: IF NONE
;FOUND TO BE ELIGIBLE, STDDEV=0
RELEASE USR,
START2: MOVEI CH,33 ;
TTCALL 10,0 ;BACK UP TO COMMAND
START6: MOVE E,[XWD -TYPL,TYPCOM]
JRST UDSWIT ;DISPATCH TO PROPER ROUTINE
;SUBROT. TO LOOKUP (REWIND) QUEUE UFD
REWCMU: MOVE A,CMDPPN ;QUEUE AREA
MOVSI B,(SIXBIT /UFD/)
MOVEI C,0
MOVE D,MFDPPN
LOOKUP CMU,A ;SEE IF UFD FOR COMMAND AREA EXISTS
POPJ P,
JRST CPOPJ1
;DISPATCH TABLE FOR COMMANDS TYPED IN
IFE MNTSW,<EXP START4
EXP START4>
IFN MNTSW,<EXP START7
EXP START7>
TYPCOM: XWD SIXBIT . FIL.,START3
XWD SIXBIT . MOU.,MOUNT
XWD SIXBIT . DIS.,DISMNT
TYPL==.-TYPCOM
IFN MNTSW,<
START7: PUSHJ P,CLRLIN
MOVEI M,FMDM ;NO--TELL USER ONLY 'FILE' ALLOWED
PUSHJ P,MSGTTY ;ASK FOR PROPER COMMAND
TLZ F,L.ARGD ;CLEAR DIALOG MODE BEFORE STARTING NEW LINE
JRST START6>
NOLOGP: MOVEI B,NOLOGM ;TELL USER QUEUE F.S. CANT BE LOG.NAME
JRST NOQFS
NOWRTP: MOVEI B,NOWRTM ;TELL USER I CANT ACCESS QUEUE F.S.
NOQFS: MOVEI M,[ASCIZ/?Can't access Queue--/]
PUSHJ P,MSGTTY
MOVE M,CMDSTR
PUSHJ P,SIXMSG
MOVE M,B
JRST ERREXI
SUBTTL FILE COMMAND
START3:
IFE FILESW,<
MOVEI M,[ASCIZ /? Unable to do FILE commands/]
JRST ERRRET
>; END OF IFE FILESW
IFN FILESW,<
;USER HALF OF DTA FILE-RECALL SYSTEM STARTS HERE
SETZM FILBLK ;CLEAR OUT FILE BLOCK
MOVE A,[XWD FILBLK,FILBLK+1]
BLT A,FILBKE
SETZM DVVNAM ;CLEAR DVC NAME IN CASE OF 'NEVERR' CALLS
TLNE F,L.BRK
JRST START4 ;IF BREAK CHAR NEED DIALOGUE
PUSHJ P,GETARG ;GET CLASS OF COMMAND
JUMPN A,START5 ;JUMP IF IT'S THERE
CAIN CH,"?" ;TEST FOR ALTERNATE /HELP RQST
JRST HELPQ2 ; YES, JUMP
START4: TLO F,L.ARGD ;NO. WILL NEED DIALOGUE
PUSHJ P,CLRLIN ;IGNORE THE REST OF THIS LINE
MOVEI M,CLSMSG
TLNE F,L.ARGD ;NEED TO ASK FOR CLASS OF CMD?
PUSHJ P,MSGTTY ;YES. DO
PUSHJ P,GETARG ;GET ANSWER, CHECK FOR END OF CMD
JUMPE A,HELPQ ;NO COMMAND CLASS?
START5: ROT A,6
ANDI A,77 ;JUST FIRST CHAR
ADDI A,40 ;BACK TO ASCII
MOVEM A,CMDCHR ;SAVE FOR LATER
DISPAT: CAIN A,"C"
JRST CCOM ;C FOR CHECK
CAIN A,"H" ;TEST FOR "H"
JRST HELPQ2 ; YES, GO GIVE HELP MESSAGE
SKIPE NOTLOG ;TEST FOR LOGGED IN
JRST LOGERR ; NO, THAT'S ALL THERE IS
CAIN A,"R"
JRST RCOM ;R FOR RECALL
CAIN A,"F"
JRST FCOM ;F FOR FILE
CAIN A,"Z"
JRST ZCOM ;Z FOR ZERO DIRECTORY AND FILE
CAIN A,"D"
JRST DCOM ;D FOR DELETING DECTAPE FILES
CAIN A,"L"
JRST LCOM ;L FOR DIRECTORY LISTING
CAIN A,"W"
JRST WCOM
JRST START4 ;NONE OF THE ABOVE -TRYAGAIN
HELPQ: CAIE CH,"?" ;? - HE'S ASKING FOR THE STRAIGHT SCOOP
JRST START4
HELPQ2: MOVE A,[SIXBIT /FILE/] ;GET NAME OF HELP FILE
JRST GOHELP ;GO TYPE IT & EXIT
;LIST DECTAPE DIRECTORY
LCOM: PUSHJ P,GETTAP ;PUTS TAPE NUMBER IN TAPEID
PUSHJ P,COMSET ;SET DEVICE FOR DIRECTORY
JRST FILCOM ; AND OUTPUT COMMAND FILE
;DELETE FILES FROM DECTAPE
DCOM:
PUSHJ P,GETTAP ;READ DECTAPE ID FIELD
SETZM DEFPPN ;CLEAR DEFAULT PPN FOR 'FILE D'
SETZM DIRPPN ; DITTO
JRST RCOM0 ;JUMP TO COMMON ROUTINE
;RECALL FILES FROM TAPE
RCOM: PUSHJ P,GETTAP ;GET TAPE NUMBER FROM USER
MOVE A,USRPPN ;CHANGE DEFAULTS BACK TO [SELF]
MOVEM A,DEFPPN ; DITTO
MOVEM A,DIRPPN ; DITTO
RCOM0: MOVEI M,FILMSG
TLNE F,L.ARGD
PUSHJ P,MSGTTY
PUSHJ P,COMSET ;SET DEVICE FOR DIRECTORY AND SET UP D
RCOML: PUSHJ P,GETFIL ;GET NEXT FILE NAME FROM USER
JRST RCOMEQ ;NOT THERE
PUSHJ P,GETDEV ;GET F.S. FILE IS ON
JFCL ; (IF ANY)
MOVS A,FILDEV(D) ;GET F/S FOR THIS DEVICE
MOVE B,STDDEV ;GET STANDARD F/S FOR THIS USER
CAIN A,'DSK' ;TEST FOR USING 'DSK'
MOVEM B,FILDEV(D) ; YES, REPLACE BY STD F/S
SKIPN FILDEV(D) ;IF NO DEVICE AFTER ALL THIS, CLUNK
JRST ERR110 ; THE REQUEST
TLNN F,L.CMA!IFN FTSPTB,<L.SPC> ;TEST FOR COMMA, SPACE, OR TAB
JRST RCOME ;ALL DONE IF NO COMMA FOLLOWING
AOBJN D,RCOML
JRST RFCOMX
RCOMEQ: TRNE D,-2 ;TEST FOR ANY FILES SPECIFIED
JRST RCOME ; YES, GO QUEUE TO RQST
SETZM RH.TTY+2 ;THROW AWAY REST OF INPUT
TLO F,L.ARGD ;ENTER DIALOG MODE
JRST RCOM0 ; & GO GET FILES NOW
ZCOM: TRO F,R.Z ;Z TELLS OPFILE WHAT TO DO
;ZERO DIRECTOR BEFORE FILE COMMAND
TLNE F,L.ARGD ;TEST FOR DIALOG MODE NOW
TRO F,R.ARGD ; YES, REMEMBER THAT FOR LATER
;PUT FILES ON TAPE
FCOM: PUSHJ P,GETTAP
FCOM0: PUSHJ P,COMSET
MOVEI M,FILMSG
TLNN F,L.ARGD
JRST FCOML
TRZN F,R.ARGD ;TEST FOR PREVIOUS DIALOG MODE
TRNN F,R.Z ;TEST FOR 'FILE Z'
SKIPA ; SKIP IF PREVIOUS DIALOG OR NOT FILE Z
JRST FCOME ; OTHERWISE, DON'T ASK FOR FILE-Z FILES
PUSHJ P,MSGTTY
FCOML: PUSHJ P,GETFIL ;GET NEXT FILE
JRST FCOMEQ ;ALLDONE
PUSHJ P,GETDEV ;GET F.S. FILE IS ON
JRST FCOMNO ; & COMPLAIN IF NOT ANYWHERE
TLNN F,L.CMA!IFN FTSPTB, <L.SPC> ;TEST FOR COMMA, SPACE, OR TAB
JRST FCOME ;DONE IF NO COMMA
AOBJN D,FCOML
RFCOMX: MOVEI M,MNYMSG
PUSHJ P,MSGTTY
SKIPN M,FILDEV-1(D) ;GET DEVICE & TEST IT
MOVSI M,'DSK' ; NONE, ASSUME 'DSK'
PUSHJ P,SIXMSG ;TYPE THE DEVICE NAME
PUSHJ P,COLON ; & A COLON FOLLOWING
MOVE M,FILBLK-1(D)
PUSHJ P,SIXMSG
PUSHJ P,DOT
HLLZ M,FILBEX-1(D)
PUSHJ P,SIXMSG
SKIPN FILPPN-1(D) ;TEST USER'S PPN
JRST RCOMFX ; NONE, JUMP AROUND
PUSHJ P,LBRKET ;TYPE A "["
HLRZ N,FILPPN-1(D) ;GET THE PROJECT #
PUSHJ P,OCTPRT ; & TYPE IT
PUSHJ P,COMMA ;TYPE A COMMA
HRRZ N,FILPPN-1(D) ;GET THE USER #
PUSHJ P,OCTPRT ; & TYPE IT
PUSHJ P,RBRKET ;TYPE A "]"
RCOMFX: ;HERE IF NO PPN
PUSHJ P,CRLF
RCOME: JRST FILCOM
PROTFL: SKIPA M,[PROTMS] ;GET ADDR OF 'PROTECTION FAILURE' MSG
FCOMNO: MOVEI M,MISMSG ;GET ADDR OF 'FILE MISSING' MSG
FCOMFL: MOVE D,SAVED ;RESTORE SAVED AOBJN POINTER
PUSHJ P,MSGTTY
SKIPN M,FILDEV(D) ;GET DEVICE & TEST IT
MOVSI M,'DSK' ; NONE, ASSUME 'DSK'
PUSHJ P,SIXMSG ;TYPE THE DEVICE NAME
PUSHJ P,COLON ; & A COLON FOLLOWING
MOVE M,FILBLK(D)
PUSHJ P,SIXMSG
PUSHJ P,DOT
HLLZ M,FILBEX(D)
PUSHJ P,SIXMSG
SKIPN FILPPN(D) ;TEST USER'S PPN
JRST FCOMFX ; NONE, JUMP AROUND
PUSHJ P,LBRKET ;TYPE A "["
HLRZ N,FILPPN(D) ;GET THE PROJECT #
PUSHJ P,OCTPRT ; & TYPE IT
PUSHJ P,COMMA ;TYPE A COMMA
HRRZ N,FILPPN(D) ;GET THE USER #
PUSHJ P,OCTPRT ; & TYPE IT
PUSHJ P,RBRKET ;TYPE A "]"
FCOMFX: ;HERE IF NO PPN
PUSHJ P,CRLF
JRST MONRET
FCOMEQ: TRNN F,R.Z ;TEST FOR FILE Z
TRNE D,-2 ;TEST FOR FILE SPECIFIED
JRST FCOME ; EITHER, CONTINUE ON
SETZM RH.TTY+2 ;THROW AWAY REST OF LINE
TLO F,L.ARGD ;ENTER DIALOG MODE
JRST FCOM0 ; & GO GET FILE NAMES
FCOME:
FILCOM: ;HERE WHEN FILE CMD SCANNED
PUSHJ P,CKEOL ;CALL TO CHECK FOR END-OF-LINE
MOVE M,STATES ;GET SYSTEM STATES WORD
TRNE M,STAOPR ;TEST FOR OPR PRESENT
PUSHJ P,ERR911 ; NO, TYPE MSG & ABORT REQUEST
HRLI NUM,(SIXBIT .F.) ;FILE TYPE COMMAND
PUSHJ P,COMBEG ;START IT UP
PUSHJ P,CRLF ;END WITH CRLF
CLOSE CMD,0 ;IN THIS CASE THAT'S ALL
MOVE A,NAMFIL ;WAKE SOME OMOUNTS
PUSHJ P,WAKE1
JFCL ;NO OMOUNTS TO WAKE
MOVEI M,RQSMSG ;REQUEST STORED
PUSHJ P,MSGTTY
;COUNT NUM.COMMANDS IN QUEUE
MOVE A,CMDNAM ;GET THE CMD NAME WE FINALLY USED
MOVEM A,MYCMD ; & SAVE IT FOR LATER
MOVEI NUM,(SIXBIT/F/) ;INIT CMGET
MOVE A,NAMFIL
PUSHJ P,CMGET1
JRST CCOM3
JRST CCOM2 ;GO PROCESS THE 1ST QUEUED RQST
>; END OF IFN FILESW
;HERE TO WAIT FOR ALL FILE REQUESTS TO GO AWAY
WCOM: MOVEI NUM,'F '
MOVE A,NAMFIL
WCOM1: ;HERE ON MOUNT/WAIT, DISMOUNT/WAIT
PUSHJ P,CMGET1
JRST WCOM2 ;NO PENDING COMMANDS
WCOM1A: ;HERE AFTER MPB-JOB FILE C
PUSHJ P,MSG111 ;'WAITIN...'
WCOM0: MOVEI A,FILSLP ;HIBERNATE
PUSHJ P,WAIT0 ;WONT RETURN IF ^C
PUSHJ P,CMGETI ;ANY MORE FILES?
PUSHJ P,CMGET
JRST MONRET ;NO-RETURN TO USER
JRST WCOM0
WCOM2: PUSHJ P,MSG112 ;"NONE PENDING"
JRST MONRET
;HERE TO CHECK FOR PENDING REQUESTS
;NUM=SIXBIT CHAR FOR TYPE OF REQUEST TO CHECK FOR
CCOM: MOVEI NUM,(SIXBIT .F.) ;TYPE OF REQUEST CHECKING
MOVE A,NAMFIL
CCOMSB: ;HERE FROM MOUNT-DISMOUNT/C
SETZM MYCMD ;CLEAR CMD NAME TO SHOW GENERAL /CHECK
MOVE A,USRPPN ;GET USER'S PPN
CAME A,FS1PPN ;TEST FOR [1,2]
SKIPE NOTLOG ;TEST FOR LOGGED IN
SETOM CHKFLG ; YES, SET FLAG TO SHOW FULL LISTING
PUSHJ P,CMGET1 ;INIT CMGET
JRST CCOME
JRST CCOM2
CCOM0: PUSHJ P,CMGET ;GET NEXT FILE REQUEST
JRST CCOM3 ;THATS ALL
CCOM2: ;HERE WITH NEXT QUEUE ENTRY OF CORRECT TYPE
SKIPE N,MYCMD ;GET DESIRED FILE NAME & TEST IT
CAMN N,CMDNAM ;TEST FOR SAME AS FOUND F.N.
SKIPA ; SKIP IF A MATCH
JRST CCOM0 ; ELSE GO GET NEXT FILE
MOVEI IO,W.TTY
MOVE N,COMCNT
PUSHJ P,DECPRT ;PRINT INDEX IN QUEUE
PUSHJ P,DOT
PUSHJ P,SPACE
CCYESL: PUSHJ P,R.CMD ;NOW READ THE COMMAND
PUSHJ P,W.TTY ; AND TYPE IT
CAIE CH,12 ;AND LOOP FOR ONE LINE
JRST CCYESL
CLOSE CMD,0 ;FINISHED
JRST CCOM0
CCOME: ;HERE IF NO RQSTS FOUND
SKIPE COMCNT ;TEST FOR EMPTY QUEUE
; YES, SKIP THE 'NONE PENDING' MSG
PUSHJ P,MSG112 ;TELL USER NONE PENDING
CCOM3: ;HERE FROM FCOME
MOVEI IO,W.TTY
TTCALL 13,0 ;CLEAR ^O IF ON
JFCL ;(JUST IN CASE)
SKIPE N,COMCNT ;GET # OF QUEUE ENTRIES & TEST
PUSHJ P,DECPRT ; .NE.0, TYPE DECIMAL NUMBER
MOVEI M,[ASCIZ /No/] ;ASSUME EMPTY QUEUE
SKIPN COMCNT ;TEST FOR NUMBER TYPED
PUSHJ P,MSGTTY ; NO,TYPE 'NO'
MOVEI M,[ASCIZ / Command/] ;ASSUME THE SINGULAR
PUSHJ P,MSGTTY ; & TYPE IT
MOVEI CH,"s" ;GET THE PLURAL
SOSE COMCNT ;TEST FOR .NE. 1 QUEUE ENTRY
PUSHJ P,(IO) ; YES, TYPE THE PLURAL
AOS COMCNT ;RESTORE COMMAND COUNT FOR LATER
MOVEI M,[ASCIZ / in Queue/] ;POINT AT REST OF MSG
IFE MPBWAI, <
JRST MSGRET ;ALL DONE
>; END IFE MBPWAI
IFN MPBWAI, <
HRROI A,40 ;GET .GTLIM GETTAB TABLE INDEX FOR SELF
GETTAB A, ;GET MY .GTLIM ENTRY
SETZ A, ; FAILED, SET TO ZERO
TLNN A,(1B10) ;TEST FOR MPB JOB
JRST MSGRET ; NO, DONE NOW
SKIPE MYCMD ;TEST FOR FILE C FOLLOWING FILE <ANYTHING>
SKIPN COMCNT ;TEST FOR COMMANDS IN THE QUEUE
; EXIT IF USER'S FILE C OR EMPTY QUEUE
JRST MSGRET
PUSHJ P,MSGTTY ;OUTPUT THE MESSAGE
PUSHJ P,CRLF ; & END IT
SETZM CHKFLG ;CLEAR THE SPECIAL-CHECK FLAG
JRST WCOM1A ;GO DO FILE W AFTER FILE C AFTER FILE ???
>; END IFN MPBWAI
;SUBROUTINE TO SEE IF THERES AN OMOUNT AND INIT CMGET
;CALL A=OMOUNT NAME TO WAKE
; NUM=REQUEST TYPE (F,M,OR D)
;RET+1 IF NO PENDING FILES
;RET+2 WITH 1ST PENDING FILE OPENED ON CMD (SEE CMGETI)
CMGET1: PUSHJ P,WAKE0 ;SEE IF THERES AN OMOUNT
PUSHJ P,MSG113 ;NO-TELL USER
PUSHJ P,CMGETI ;INIT CMGET
PJRST CMGET ; AND LOOK FOR 1ST PENDING FILE
;SUBROUTINE TO INITILIZE CMGET
CMGETI: PUSHJ P,REWCMU ;REWIND UFD
JSP N,NEVERR
SETZM COMCNT
MOVSI A,(PHOPEN) ;SET PHYSICAL-ONLY OPEN
MOVE B,CMDSTR
MOVEI C,RH.CMD
OPEN CMD,A
JSP N,CMDERR
MOVEI A,B.CMD
MOVEM A,.JBFF
INBUF CMD,1
POPJ P,
;SUBROUTINE TO LOOK FOR NEXT FILE REQ. FOR THIS USER IN QUEUE
;INIT CALL CMGETI
;CALL QUEUE UFD OPEN ON CMU
; NUM=TYPE OF REQUEST (LETTER=F,M,D)
;RET+1 NO MORE
;RET+2 NEXT ONE OPENED ON CMD
CMGET:
CCOML: PUSHJ P,R.CMU ;READ NAME OF NEXT FILE IN COMMAND AREA
POPJ P, ;NO MORE FILES
MOVE A,WD
MOVEM A,CMDNAM ;SAVE IT
PUSHJ P,R.CMU ;NOW EXTENSION
POPJ P, ;?
HLLZ B,WD
MOVEI C,0
MOVE D,CMDPPN
HLRZ N,A
HLRZ N1,B
TRZ N,7777 ;SAVE ONLY HIGH ORD CHAR ON RIGHT
CAIE N1,(SIXBIT /CMD/)
JRST CCOML
CAME N,NUM ;SKIP IF OUR TYPE OF REQUEST
JRST CCOML ;NO, FORGET IT
AOS COMCNT ;COUNT ACTUAL ENTRIES IN QUEUE
HRRZ N1,A ;GET RIGHT 1/2 OF NAME
SKIPE CHKFLG ;TEST FOR SPECIAL /CHECK
MOVE N1,IORPPN ; YES, FUDGE 'OR'D PPN FOR NEXT TEST
CAME N1,IORPPN ;COULD BE FOR THIS PPN?
JRST CCOML ;NO - TRY NEXT
LOOKUP CMD,A
JRST CCOML ;SOMETHING WRONG WITH THIS FILE
MOVEI IO,R.CMD ;OK, LET'S HAVE A LOOK AT THAT FILE
SKIPE CHKFLG ;TEST FOR SPECIAL /CHECK
JRST CPOPJ1 ; YES, RETURN EVERYTHING
IFE LOGSW, <
MOVEI N,3 ;LOOK FOR 4TH FIELD (3 SPACES)
CCOMF: PUSHJ P,R.CMD ;READ CMD FILE
CAIE CH," " ;IS IT A SPACE
JRST CCOMF ;NO - TRY AGAIN
SOJG N,CCOMF ;COUNT DOWN SPACES
>; END OF IFE LOGSW
IFN LOGSW, <
MOVEI N,1 ;SET TO SKIP ONE FIELD
PUSHJ P,SKPFLD ;CALL TO SKIP IT
JRST CCOML ; EOF, GET NEXT CMD FILE
MOVEI N,3 ;SET TO SKIP THREE CHARACTERS ('JOB')
CCOMF: PUSHJ P,R.CMD ;READ A CHARACTER
CAIG CH,14 ;TEST FOR END OF LINE
JRST CCOML ; YES, DONE
SOJG N,CCOMF ;COUNT DOWN & REPEAT
PUSHJ P,SDECIN ;READ THE JOB NUMBER
CAME N,JOBNO ;TEST FOR SAME JOB #
CAIN NUM,(SIXBIT .F.);TEST FOR 'FILE' CMD
SKIPA N,[1] ; IF SAME JOB -OR- FILE CMD, PUT 1 IN 'N' & SKIP
JRST CCOML ; JUMP IF DIFFERENT JOB ON MOUNT/DISMOUNT
PUSHJ P,SKPFLD ;SKIP TO PPN FIELD
JRST CCOML ; EOF, GO GET NEXT CMD FILE
>; END OF IFN LOGSW
PUSHJ P,HPACK ;GET PROJ # AND PACK IT
HRL WD,N ;SAVE IT
PUSHJ P,HPACK ;GET PROG # AND PACK IT
HRR WD,N ;SAVE IT
CAME WD,USRPPN ;IS IT FOR THIS USER PPN?
JRST CCOML ;NO
CCMYES: MOVE A,CMDNAM ;YES!
MOVSI B,(SIXBIT /CMD/)
MOVEI C,0
MOVE D,CMDPPN
LOOKUP CMD,A ;GET IT AGAIN
JRST CCOML ;PROBABLY JUST HANDLED
JRST CPOPJ1
IFN LOGSW, <
SKPFLD: PUSHJ P,R.CMD ;READ NEXT CHAR OF CMD FILE
CAIG CH,14 ;TEST FOR END OF LINE
POPJ P, ; YES, RETURN
CAIE CH," " ;TEST FOR BLANK (END OF FIELD)
JRST SKPFLD ; NO, KEEP ON READING
SOJG N,SKPFLD ;DECR FIELD COUNT & REPEAT
JRST CPOPJ1 ; FOUND IT, RETURN +1
IORJOB: MOVE A,JOBNO ;GET USER'S JOB #
LSH A,^D35-^D24 ;SHIFT INTO BITS 18-24
IORM A,IORPPN ;COMBINE WITH PPN FOR MOUNT/DISMOUNT USE
POPJ P, ;RETURN TO CALLER
>; END OF IFN LOGSW
IFN FILESW,<
GETTAP: MOVEI M,TAPMSG
TLNE F,L.ARGD
PUSHJ P,MSGTTY ;ASK FOR TAPE NUMBER IF DOING THAT SORT OF THING
PUSHJ P,GETARG
TLNE F,L.SPC+L.BRK+L.CMA ;TAPE NUMBER ENDS WITH SPACE,BREAK, OR COMMA
TLNE F,L.WLD+L.DOT ; AND NOT * OR PERIODS
JRST COMERR
JUMPE A,COMERR ;ERR IF NULL TAPEID
MOVEM A,TAPEID
POPJ P,0 ;ALL RIGHT ALREADY!
COMSET: MOVSI A,'DSK' ;ASSUME FILE ANYWHERE IN S/L
MOVEM A,FILDEV ;STORE AWAY AS STR FOR DIRECTORY
MOVE A,TAPEID ;GET PROSPECTIVE DIR NAME
MOVEM A,FILBLK ;STORE AS PARAMETER
MOVSI A,'DIR' ;GET EXTENSION
MOVEM A,FILBEX ;STORE AS PARAMETER
MOVE A,USRPPN ;GET USER'S PPN
MOVEM A,FILPPN ;STORE AS PARAMETER
SETZ D, ;CLEAR AOBJN AC TO SHOW DIRECTORY
PUSHJ P,GETDEV ;GO LOOK UP THE DIRECTORY
JRST COMST1 ; NOT THERE, SKIP
MOVE A,FILDEV ;GET RETURNED DEVICE
CAMN A,[SIXBIT /DSK/] ;TEST FOR STILL 'DSK'
COMST1: MOVE A,STDDEV ; YES, DEFAULT STR FOR THE DIR FILE
MOVEM A,FILDEV ;STORE AS STR FOR THE DIR FILE
SKIPE FILDEV ;HAVE WE FOUND A DEV: FOR DIRECTORY?
JRST COMST2 ;YES, GO ON
MOVEI M,NDFD ;NO, TELL USER NO DIRECTORY CAN BE MADE
PUSHJ P,MSGTTY
PUSHJ P,CRLF
MOVSI A,'DSK' ;USE 'DSK' AS DEV: AS SIGNAL TO OMOUNT
MOVEM A,FILDEV ;THAT THERE'S NO DEV: FOR DIRECTORY
COMST2: SETZM FILBEX ;CLEAR THE EXTENSION FIELD NOW
SETZM FILPPN ; DITTO, FOR THE PPN
MOVEI A,1 ;MAKE 1ST FILE NAME NON-0
MOVEM A,FILBLK ;TO FORCE OUT DEVICE NAME IN COMMAND FILE
MOVSI D,-DTDNFI
AOBJN D,CPOPJ
;THIS ROUTINE READ A FILE NAME FROM TTY
GETFIL: TLZ F,L.WLD ;SHOW NO WILD-CARD FILE
GETFL0: PUSHJ P,GEFARG ;READ NEXT PART OF THE FILE NAME
TLNE F,L.BRAK ;TEST FOR "[" BEGINNING PPN
JUMPE A,GETPPD ; YES, JUMP IF PRECEDING A FILE NAME
JUMPE A,CPOPJ ;RETURN +0 IF NULL FILE NAME
CAIN CH,":" ;TEST FOR ":" TERMINATING DVC NAME
JRST GETFLD ; YES, GO STORE DEVICE NAME
MOVEM A,FILBLK(D) ;STORE FILE NAME
MOVE A,DEFPPN ;GET DEFAULT PPN
MOVEM A,FILPPN(D) ; & STORE IT
MOVE A,DEFDEV ;GET DEFAULT DEVICE
MOVEM A,FILDEV(D) ; & STORE IT
SETZM FILBEX(D) ;CLEAR THE EXTENSION FIELD
TLNE F,L.BRAK ;TEST FOR "[" BEGINNING PPN
JRST GETFL1 ; YES, NO EXTENSION, SO JUMP
TLNN F,L.DOT ;TEST FOR EXTENSION COMING (".")
JRST GETFL2 ; NO, GO INSPECT PPN
PUSHJ P,GEFARG ;READ THE EXTENSION
HLLZM A,FILBEX(D) ; & STORE IT
TLNN F,L.BRAK ;TEST FOR PPN COMING NOW
JRST GETFL2 ; NO, SO INSPECT DEFAULT PPN
GETFL1: PUSHJ P,REDPPN ;READ THE PPN
MOVEM A,FILPPN(D) ; & STORE IT
TLNE F,L.EOL ;TEST FOR END OF LINE
JRST GETFL2 ; YES, JUMP
PUSHJ P,GETARG ;READ NEXT INPUT DELIMITER
JUMPN A,COMERR ;ERROR IF SIXBIT RETURNED
GETFL2: SKIPE A,FILPPN(D) ;GET CURRENT FILE PPN & TEST FOR ZERO
CAMN A,USRPPN ;TEST FOR [SELF]
JRST CPOPJ1 ; EITHER, RETURN (PPN IS OK)
MOVE A,CMDCHR ;GET TYPE OF FILE RQST
CAIE A,"F" ;TEST FOR 'FILE F'
CAIN A,"Z" ;TEST FOR 'FILE Z'
JRST CPOPJ1 ; EITHER, RETURN (PPN IS OK)
JRST PPNERR ; ELSE GIVE 'BAD-PPN' ERROR
GETFLD: TLNE F,L.WLD ;TEST FOR WILD DEVICE NAME
JRST COMERR ; YES, SYNTAX ERROR
MOVE B,CMDCHR ;GET TYPE OF FILE CMD
CAIN B,"D" ;TEST FOR 'FILE D'
JRST PPNERR ; YES, GIVE ERROR MSG
MOVEM A,DEFDEV ;STORE DEFAULT DEVICE NAME
MOVE B,A ;COPY DEVICE NAME FOR ERROR MSG
DEVCHR A, ;FIND OUT ABOUT THE DEVICE
TLNN A,DC.FS ;TEST FOR A DISK
JRST ILDERR ; NO, ILLEGAL DEVICE
DEVNAM B, ;CALL FOR PHYSICAL DEVICE NAME
MOVE B,DEFDEV ; FAILED, USE ORIGINAL NAME
MOVS A,B ;PUT SWAPPED DEVICE NAME IN 'A'
DEVPPN B, ;FIND OUT PPN ASSOC. WITH THE DEVICE
SKIPA B,DIRPPN ; NO UUO, GET DEFAULT PPN & SKIP
JRST GETFD1 ; UUO WORKED, JUMP (PPN IN 'B')
CAIN A,'SYS' ;TEST FOR 'SYS'
MOVE B,SYSPPN ; YES, GET SYS'S PPN
GETFD1: SKIPN B ;TEST FOR NULL PPN
MOVE B,DIRPPN ; YES, GET DEFAULT PPN
MOVEM B,DEFPPN ;STORE AS PPN DEFAULTING FOR THIS DEVICE
CAIE A,'D ' ;TEST FOR 'D' DEVICE
CAIN A,'DS ' ;TEST FOR 'DS' DEVICE
MOVEI A,'DSK' ; EITHER, CONVERT TO 'DSK'
CAIN A,'LIB' ;TEST FOR JOB-SPECIFIC 'LIB'
MOVEI A,'DSK' ; YES, CONVERT TO 'DSK' ALSO
MOVSM A,DEFDEV ;STORE JOB-INDEPENDENT DEVICE NAME NOW
JRST GETFL0 ;CONTINUE READING
GETPPD: PUSHJ P,REDPPN ;READ THE PPN FIELD
MOVEM A,DEFPPN ; & STORE AS DEFAULT PPN
JRST GETFL0 ;CONTINUE READING
;SUBROUTINE TO FIND F.S. A FILE IS ON IN THE CASE OF 'DSK'
;RET+0 IF CANT FIND IT OR DIDNT PICK A DEFAULT
;RET+1 FILDEV(D) FILLED WITH F.S. NAME
GETDEV: MOVEM D,SAVED ;SEE IF THE FILE EXISTS
MOVEI A,17
MOVE B,FILDEV(D)
SETZ C,
OPEN USR,A
JRST ILDERR ;'ILLEGAL F.S.' ERROR
MOVE C,FILPPN(D) ;GET INPUT PPN IN AC (JUST IN CASE)
JUMPE D,LVDLUK ;JUMP IF PROCESSING DIR FILE
MOVE A,CMDCHR ;GET FILE COMMAND TYPE (LETTER)
CAIE A,"D" ;TEST FOR "FILE D"
TLNE F,L.WLD ;TEST FOR WILD-CARD FILE
; NO LOOKUP IF WILD-CARD OR "FILE D"
JRST GETDE7
JRST LVDLUK ;OTHERWISE, DO LOOKUP
GETDE6: MOVE C,USRPPN ; EITHER, MUST BE SAME AREA
GETDE7: MOVE D,SAVED ;RESTORE AOBJN POINTER
MOVEM C,FILPPN(D) ;STORE FILE'S PPN
JRST CPOPJ1 ;TAKE NORMAL RETURN TO CALLER
LVDLUK: MOVEI A,EXLLEN-1
MOVEM A,SRCBUF
MOVE A,FILBLK(D)
MOVEM A,SRCBUF+EXLNAM
HLLZ A,FILBEX(D)
MOVEM A,SRCBUF+EXLEXT
MOVE A,FILPPN(D) ;GET SPECIFIED PPN
MOVEM A,SRCBUF+EXLPPN ;STORE FOR LOOKUP
LOOKUP USR,SRCBUF
JRST GETDE8
LDB B,[POINT 9,SRCBUF+EXLPRV,8] ;GET FILE'S PROTECT CODE
HRLI B,5 ;ASSUME READ ACCESS (FILE F OR FILE Z)
MOVE D,CMDCHR ;GET RQST TYPE (LETTER)
SKIPN SAVED ;TEST FOR DIRECTORY FILE
MOVEI D,"R" ; YES, TREAT AS 'FILE R'
CAIN D,"R" ;TEST FOR 'FILE R'
HRLI B,3 ; YES, WRITE ACCESS REQ'D
MOVE C,SRCBUF+EXLPPN ;GET FILE'S DISK AREA PPN
CAME C,USRPPN ;TEST FOR SAME AS [SELF]
CAIE D,"R" ;TEST FOR 'FILE R'
SKIPA D,USRPPN ; GET USER'S PPN & SKIP IF [SELF] OR NOT 'FILE R'
JRST GETDE6 ;GO GET USER'S PPN FOR FILE R
MOVEI A,B ;POINT AT PARM LIST (AC'S B-C-D)
CHKACC A, ;CHECK FILE ACCESS
SKIPA ; NOT IMPL., ASSUME OK
AOJE A,PROTFL ;JUMP IF -1 RET'D, PROT FAILURE
MOVE C,SRCBUF+EXLPPN ;RESTORE FILE'S PPN
MOVE D,SAVED ;RESTORE AOBJN POINTER
MOVE A,SRCBUF+EXLDEV
MOVEM A,FILDEV(D)
JRST GETDE7
GETDE9: TLZA B,-1 ;CLEAR L.H. LEAVING ERROR CODE & SKIP
GETDE8: ;HERE ON EXTENDED LOOKUP ERROR
HRRZ B,SRCBUF+EXLEXT ;GET LOOKUP ERROR CODE
CAIN B,2 ;TEST FOR PROTECTION FAILURE
JRST PROTFL ; YES, JUMP
POPJ P, ;GIVE ERROR RETURN TO CALLER
>; END OF IFN FILESW
SUBTTL DUMMY MOUNT/DISMOUNT CODE
IFE MNTSW,<
DISMNT: MOVEI M,NODISM
JRST .+2
MOUNT: MOVEI M,NOMNTM
JRST ERRRET ;GO TYPE THE MSG & EXIT
> ;END CONDITIONAL ON MNTSW
SUBTTL DISMOUNT COMMAND
IFE MNTSW,<XLIST>
IFN MNTSW,<
;DISMOUNT CUSP STARTS HERE
DISMNT: MOVEI A,"D"
MOVEM A,CMDCHR
IFN LOGSW, <
PUSHJ P,IORJOB ;SET UP FILE NAME FOR DISMOUNT CMD
>; END OF IFN LOGSW
TLZ F,L.VID!L.REM!L.PWA
SETZM PHYNAM
SETOM DMSPOS ;SHOW NO POSITION RQST ENTERED
SETOM TOJOB ;SHOW NO DISPOSITION RQST ENTERED
PUSHJ P,DISMN6 ;LOOK FO SWITCHES
PUSHJ P,REDEV ;GET FILE STRUCTURE NAME
JUMPE A,ERR101 ;NO F/S NAME
MOVEM A,CMDFSN ;COMMAND'S FILE STR NAME
DEVNAM A, ;GET PHYSICAL NAME
MOVE A,CMDFSN ;
CAMN A,[SIXBIT /DSK/];USE ORIGINAL FS NAME IF "DSK"
MOVE A,CMDFSN ; WAS RETURNED
MOVEM A,DVVNAM
PUSHJ P,DISMN6 ;SWITCHES AGAIN
PUSHJ P,CKEOL ;GO CHECK FOR END OF LINE
SKIPE NOTLOG ;TEST FOR LOGGED IN
JRST LOGERR ; NO, THEN CAN'T DISMOUNT
;WHAT KIND OF DEVICE IS IT?
MOVE A,DVVNAM ;DO A DEVCHR
DEVCHR A,
MOVEM A,DEVMOD ;STORE DEVCHR RESULT FOR LATER
JUMPE A,ERR6 ;ASSUME IT WAS A F.S. THAT WENT AWAY
IFN SPONUL, <
MOVS B,DVVNAM ;GET SWAPPED PHYSICAL DVC NAME
CAIN B,'NUL' ;TEST FOR DEVICE NUL:
JRST DISMNN ; YES, JUMP
>; END OF IFN SPONUL
TLNE A,DC.FS ;F.S.?
JRST DISMN3 ;YES-NEEDS SPECIAL ATTENTION
;HERE IF NOT A F.S. -- MUST 5.03 OR LATER(FOR COMPAT. WITHE MOUNT SIDE)
IFN SPONUL, <
DISMNN: ;HERE IF DEVICE NUL:
>; END OF IFN SPONUL
MOVE B,MONVER ;CK. MONITOR VERSION
CAIGE B,VER503
JRST ERR503
MOVE A,DVVNAM ;IS IT ASSIGNED?
DEVTYP A,
JSP N,NEVERR
IFN SPONUL, <
MOVS B,DVVNAM ;GET SWAPPED PHYSICAL DEVICE NAME
CAIN B,'NUL' ;TEST FOR DEVICE NUL:
TLO A,.TYSPL ; YES, TREAT AS IF SPOOLED
MOVEM A,DVVTYP ;SAVE DEVTYP BITS FOR LATER
TLNE A,.TYSPL ;TEST FOR SPOOLED DEVICE
SKIPA A,JOBNO ; YES, GET JOB # & SKIP
>; END OF IFN SPONUL
LDB A,[.TYJOB+A]
CAME A,JOBNO
JRST DISMN1 ;NO
IFE SPONUL, <
MOVE A,DVVNAM ;GET DEVICE NAME
DEVTYP A, ;FIND OUT ABOUT DEVICE TYPE
JSP N,NEVERR ; FAILED, STRANGE ERROR
>; END OF IFE SPONUL
MOVE A,DVVTYP ;GET DEVTYP BITS
TLNE A,.TYSPL ;TEST FOR SPOOLED/NUL:
JRST NORSTS ; YES, JUMP
MOVE B,USRPPN ;GET USER'S PPN
CAME B,FS1PPN ;TEST FOR [1,2]
TRNN A,.TYRAS ;TEST FOR UNRESTRICTED DEVICE
JRST NORSTD ; EITHER, JUMP
MOVE B,STATES ;GET STATES WORD
TRNE B,STAOPR ;TEST FOR OPR WANTING TO SEE THINGS
JRST NORSTD ; NO, THEN NO NEED TO FORCE THE USER
NORSTS: SKIPLE B,TOJOB ;GET DESTINATION JOB # & TEST IT
CAMN B,JOBNO ;TEST FOR /KEEP
JRST NORSTD ; JUMP IF NOT /REASSIGN
TLNE A,.TYSPL ;TEST FOR SPOOLED/NUL:
JRST NORSTT ; YES, SKIP MESSAGE
TYPE <% /REASSIGN illegal for restricted device - /RELEASE assumed
>; ;TELL THE USER OF HIS ERROR
NORSTT: SETZM TOJOB ;FORCE /RELEASE FOR DEVICE
NORSTD: MOVE B,DVVNAM ;GET USER'S DEVICE NAME
DEVNAM B, ;CALL TO GET ASSOC PHYSICAL NAME
JSP N,NEVERR ; ERROR, FATAL & UNEXPECTED
MOVEM B,PHYNAM ;STORE PHYSICAL NAME FOR LATER
MOVE A,DEVMOD ;GET DEVCHR BITS
TLNE A,DC.DTA!DC.MTA ;TEST FOR SOME KIND OF TAPE
TLNN A,DC.AVA ;TEST FOR AVAILABLE DEVICE
JRST DISM0B ; JUMP IF NOT TAPE OR NOT AVAIL
SKIPLE TOJOB ;SKIP IF /RELEASE TO FORCE DEFAULT POSITIONING
SKIPGE A,DMSPOS ;GET RQSTED POSITION IF ANY
IFG UNLOSW, < PUSHJ P,DMSUNL> ; NONE, SET UP /UNLOAD
IFE UNLOSW, < PUSHJ P,DMSREW> ; NONE, SET UP /REWIND
IFL UNLOSW, < PUSHJ P,DMSSTA> ; NONE, SET UP /STAY
JUMPE A,DISM0B ;SKIP CODE IF /STAY
PUSHJ P,MOPEN ;OPEN THE DEVICE
JRST DISM0B ; FAILED, SKIP THE CODE
PUSH P,INTBLK ;SAVE THIS TO PRESERVE ^C INTERCEPT
MOVE A,[4,,DISM0A] ;SET UP 4-WD INTERRUPT BLOCK
MOVEM A,INTBLK ; DITTO
MOVE A,[EXP PHOPEN!1B35]; DITTO
IORM A,INTBLK+1 ; DITTO
MTAPE US1,@DMSPOS ;REPOSITION THE TAPE
DISM0A: RELEAS US1, ;RELEASE THE DEVICE
POP P,INTBLK ;RESTORE PREV VALUE OF INTBLK
ANDCAM A,INTBLK+1 ;TURN OFF THE TAPE-ERROR INTERCEPT
DISM0B: ;HERE NOT TO REPOSITION
MOVE B,TOJOB ;GET DESTINATION JOB #
CAMN B,JOBNO ;TEST FOR /KEEP
JRST DISM0C ; YES, THEN JUMP
MOVE B,DVVNAM ;GET DEVICE NAME
PUSHJ P,MOPEN ;OPEN THE DEVICE
SKIPA C,DVVNAM ; FAILED, GET DEVICE NAME & SKIP
MOVEI C,US1 ;GET CHANNEL # OF OPEN DEVICE
MOVE A,C ;COPY PARAMETER INTO CORRECT AC
SETZ B, ;CLEAR AC FOR LOGICAL NAME
DEVLNM A, ;DEASSIGN THE LOGICAL NAME
JSP N,NEVERR ; FAILED, A FATAL ERROR
MOVE B,C ;COPY PARAMETER INTO CORRECT AC
SKIPGE A,TOJOB ;GET DESTINATION JOB & TEST IT
SETZB A,TOJOB ; UNDEFINED, ASSUME /RELEASE
REASSI A, ;REASSIGN IT SOMEPLACE
SKIPE TOJOB ;TEST FOR /RELEASE
JUMPE A,DISMN4 ; NO, 0 RET'D MEANS ILLEGAL JOB #
SKIPN B ;TEST FOR REASSIGNED
JSP N,NEVERR ; NO, FATAL ERROR
RELEAS US1, ;RELEASE IT
DISM0C: ;HERE WHEN DEVICE DISPOSED OF
IFN SPONUL, <
MOVE A,DVVTYP ;GET DEVTYP BITS FOR THE DEVICE
TLNE A,.TYSPL ;TEST FOR SPOOLED/NUL:
JRST DISMN2 ; YES, THEN DONE NOW
>; END OF IFN SPONUL
MOVE A,DEVMOD ;GET DEVCHR BITS
TLNE A,DC.DIS!DC.TTY ;TEST FOR DISPLAY OR TTY
JRST DISMN2 ; EITHER, NO NEED TO TELL OPR
MOVE A,TOJOB ;GET DESTINATION JOB
CAMN A,JOBNO ;TEST FOR DEVICE /KEEP SWITCH
TLNE A,L.REM ;TEST FOR NOT /UNLOAD
SKIPA ; SKIP IF OWNERSHIP CHANGED OR DVC UNLOADED
JRST DISMN2 ; DONE IF NO NEED TO CONCERN OPR
MOVE A,STATES ;GET THE STATES WORD
TRNN A,STAOPR ;TEST FOR OPR WANTING TO KNOW ANYTHING
JRST DISMN0 ; YES, THEN GO TELL HIM
JRST DISMN2 ; NO, THEN DONE NOW
; HERE IF OPR NEEDS TO SEE THE REQUEST
DISMN0: PUSHJ P,REMREQ ;GO GENERATE A /REMOVE RQST
JRST DISMN2 ;GO RETURN NOW
; HERE IF USER DOESN'T OWN THE DEVICE
DISMN1: JRST MSG105 ;TELL HIM OF HIS ERROR
; HERE IF REQUEST SERVICED BY UMOUNT
DISMN2: MOVE A,PHYNAM ;GET PHYSICAL NAME
MOVEM A,CMDFSN ;STORE FOR DISMOUNT MSG
JRST DISFIN ;MERELY RETURN
; HERE IF /REASSIGN FAILED
DISMN4: TYPE <% /REASSIGN job # not assigned - /RELEASE assumed
>
SETZM TOJOB ;AVOID LOOP - FORCE RELEASE
JRST DISM0B ;GO TRY AGAIN
;HERE IF WERE DEALING WITH A F.S.
DISMN3:
IFN JACTSW,< ;FONT WANT THIS FOR SOME DEBUGGING
TRNE F,R.NJAC ;MUST BE PRIVILEGED FOR F.S.S
JRST ERR103
>
MOVE B,FSNAME ;B=STR NAME
MOVEI A,B
DSKCHR A,
JRST ERR6
LDB B,D.ARGT ;IS THIS A SINGLE F.S.?
CAIE B,A.FS
JRST ILFERR ;NO
MOVEI A,"D"
MOVEM A,CMDCHR
MOVE A,[PHOPEN!17] ;SET UP TO OPEN THE FILE STRUCTURE
MOVE B,FSNAME ; TO SEE IF A UFD EXISTS
MOVEM B,UFDFSN ;SET THIS FOR DISSTR
SETZ C,
OPEN USR,A
JRST DISM3B
MOVE A,USRPPN ;SET UP TO LOOK UP UFD ON THIS F/S
MOVEM A,SRCBUF
MOVSI A,(SIXBIT /UFD/)
MOVEM A,SRCBUF+1 ;'UFD' (EXTENSION)
SETZM SRCBUF+2 ;PRIVS WORD
MOVE A,MFDPPN
MOVEM A,SRCBUF+3 ;1,,1
LOOKUP USR,SRCBUF ;LOOK UP THE UFD
SKIPA A,SRCBUF+1 ;NO UFD, KEEP ERROR CODE
JRST DISM3A ;IT'S THERE , PROCEED NORMALLY
TRNE A,-1 ;NOT FOUND ERROR
JRST DISM3A ; NO, DIG DEEPER
PUSHJ P,DISSTR ; YES, REMOVE F/S FROM S/L
JRST DISM3C ; AND AVOID QUOTA... STUFF
DISM3A: RELEASE USR,
DISM3B: MOVE A,USRPPN ;GET QUOTA.SYS LOG.OUT
MOVE B,FSNAME
PUSHJ P,GETQUO
SETO D,
MOVE A,USRPPN
MOVE B,JOBNO
MOVE N,SYSPPN
MOVE N1,MFDPPN
MOVE M,FSNAME
MOVEI IO,W.TTY
PUSHJ P,UFDCLR ;CLEAR UFD
JRST DISFI1
DISM3C: PUSHJ P,CKMNC ;CALL TO CHECK THE MOUNT COUNT
TLNN F,L.REM ;REMOVE STR?
JRST DISFIN ;NO, ALL DONE
MOVE A,STATES ;GET STATES WORD
TRNE A,STAOPR ;TEST FOR OPR PRESENT
JRST DISMN5 ; NO, THEN CAN'T REMOVE F/S
PUSHJ P,REMREQ
JRST DISFIN
DISMN5: TYPE <Operator not on duty - /REMOVE ignored
>; ;TELL THE USER
JRST DISFIN ; & GO EXIT
; HERE TO READ SWITCHES
DISMN6: PUSHJ P,SST ;INGORE SPACE TABS
CAIE CH,"/"
POPJ P, ;NO MORE SWITCHES
MOVE E,[XWD -DMSLEN,DMSLST]
PUSHJ P,UDSWIT
JRST DISMN6 ;LOOP UNTIL NO MORE SWITCHES
DISFIN:
IFN FTFACT,<
IFE FTFCT1,<
SKIPE IDIDIT ;IF DIDN'T GO TO OMOUNT, WRITE FACT
JRST DISFN2 ; ELSE, BYPASS: OMOUNT DID IT
>; END IFE FTFCT1
HRLI NUM,'UD ' ;SHOW USER DISMOUNT 'QUEUE' CODE
MOVE A,DEVMOD ;GET OLD DEVCHR WORD
TLNE A,DC.FS ;UMOUNT USES DIFFERENT FIELDS TO STORE
JRST DISFN1 ; THE NAME WE WANT TO USE HERE FROM
MOVE A,TOJOB ;F/S TO NON-F/S. GET DESTINATION JOB #
CAMN A,JOBNO ;TEST FOR CHANGING JOBS
JRST DISFN2 ; NO, JUMP: NO NEED TO REGISTER DISMOUNT
SKIPA A,PHYNAM ;DEVICE NAME FOR SPOOLED ENTRY
DISFN1: MOVE A,FSNAME ;DEVICE NAME FOR F/S
PUSHJ P,WRFACT ;WRITE FACT FILE ENTRY
DISFN2:
>; END OF IFN FTFACT
MOVEI IO,W.TTY
MOVE M,CMDFSN
PUSHJ P,SIXMSG
MOVEI M,DISDON
JRST ALLFIN
;SUBROUTINE TO QUEUE REQUEST TO OPR AND WAIT FOR IT
REMREQ: SETZM TAPEID
SETZM FILBLK
HRLI NUM,(SIXBIT .D.)
PUSHJ P,COMBEG
MOVEI M,[ASCIZ . DISMOUNT .]
PUSHJ P,MSG
SKIPN M,PHYNAM
MOVE M,FSNAME
PUSHJ P,SIXMSG
MOVEI M,[ASCIZ . /R.]
TLNE F,L.REM
PUSHJ P,MSG
PUSHJ P,VIDOUT ;CK FOR /VID
PUSHJ P,CRLF
HRROI A,40 ;GET .GTLIM GETTAB PARMS FOR [SELF]
GETTAB A, ;GET .GTLIM WORD FOR MY JOB
SETZ A, ; FAILED, SET TO ZERO
TLNE A,(1B10) ;TEST FOR MPB JOB
TRNE F,R.NOWA ;DO NOT WAIT IF T/S OR /NOWAIT
TRNE F,R.WAIT ;WAIT IF NOT BATCH OR USER TYPED /WAIT
JRST REMRQ1 ; YES, GO WAIT FOR COMPLETION
CLOSE CMD, ;CLOSE THE CMD FILE NOW
MOVE A,NAMMNT ;GET THE OMOUNT NAME
PUSHJ P,WAKE1 ;WAKE ALL OMOUNTS
PUSHJ P,MSG113 ; NONE RUNNING, TELL THE USER
POPJ P, ;RETURN TO CALLER
REMRQ1: ;HERE TO WAIT ON COMPLETION
PUSHJ P,MSG110
PJRST TMWAIT ;GO WAIT FOR COMPLETION
; CKMNC - SUBROUTINE TO CHECK FOR BUSY F/S
;
; EXITS IMMEDIATELY IF USER IS NOT [1,2] OR DID NOT SAY /REMOVE
; CLEARS /REMOVE SWITCH IF NOT [1,2] *AND*
; MOUNT COUNT NOT ZERO, OR
; STR IN SYSTEM S/L, OR
; F/S IS QUEUE STRUCTURE, OR
; F/S CONTAINS STRLST.SYS, OR
; F/S HAS SWAPPING SPACE
;
CKMNC: MOVE A,USRPPN ;GET USER'S PPN
CAME A,FS1PPN ;TEST FOR [1,2]
TLNN F,L.REM ;TEST FOR /REMOVE
POPJ P, ; RETURN IF [1,2] OR NOT /REMOVE
MOVE B,FSNAME ;GET STR NAME
MOVEI A,B ;POINT AT STR NAME
DSKCHR A, ;FIND OUT ABOUT IT
JRST ERR6 ; FAILED, GIVE AN ERROR
TLNN A,D.MC ;TEST FOR MOUNT COUNT = 0
JRST CKMNC5 ; NO, GO GIVE ERROR MSG
MOVE A,MONVER ;GET MONITOR VERSION
CAIGE A,VER503 ;TEST FOR 5.03 OR LATER
JRST CKMNC2 ; NO, JUMP
MOVEI N,A ;POINT AT PARM LIST
SETZ A, ;CLEAR JOB #
MOVE B,SYSPPN ;GET SYS PPN
MOVE C,FSNAME ;GET STR NAME
GOBSTR N, ;SEARCH SYSTEM S/L
JRST CKMNC1 ; ERROR, GO LOOK AT ERROR CODE
JRST CKMNC5 ; WORKED, STR IN SYS S/L
CKMNC1: CAIE N,3 ;TEST FOR NOT IN S/L ERROR CDE
PUSHJ P,NEVMSG ; NO, STRANGE ERROR
CKMNC2: MOVE A,FSNAME ;TEST FOR QUEUE STR
CAMN A,CMDSTR ;TEST FOR QUEUE STR
JRST CKMNC5 ; YES, CAN'T REMOVE IT
; LOOK FOR STRLST.SYS ON THIS STR
MOVE A,[EXP PHOPEN!17];SET PHYSICAL-ONLY OPEN IN DUMP MODE
MOVE B,FSNAME ;GET STR NAME
SETZ C, ;SET NO BUFFER HEADERS
OPEN US1,A ;OPEN THE STR
JRST CKMNC3 ; FAILED, JUMP
MOVE A,[SIXBIT .STRLST.] ;GET FILENAME
MOVSI B,(SIXBIT .SYS.) ; & EXTENSION
SETZ C, ;CLEAR 3RD ARG
MOVE D,SYSPPN ;GET SYS PPN
LOOKUP US1,A ;LOOK UP STRLST.SYS
JRST CKMNC3 ; FAILED, CONTINUE ON
RELEAS US1, ;GIVE UP THE CHANNEL
JRST CKMNC5 ; & GO GIVE THE ERROR MSG
CKMNC3: RELEAS US1, ;GIVE UP THE CHANNEL
; CHECK FOR SWAPPING UNIT
MOVEI C,0 ;CLEAR THE UNIT COUNTER
CKMNC4: MOVE A,C ;COPY THE UNIT NUMBER
MOVE B,FSNAME ;GET THE STR NAME
PUSHJ P,LOGUNI ;ASSEMBLE A LOGICAL UNIT NAME
MOVEM B,CHRBUF ; & STORE IT FOR DSKCHR
MOVE A,[XWD CHRLEN,CHRBUF] ;GET DSKCHR PARM PTR
DSKCHR A,PHONLY ;FIND OUT ABOUT THIS UNIT
POPJ P, ; NO SUCH UNIT, RETURN
SKIPN CHRBUF+12 ;TEST # OF K OF SWAPPING SPACE
AOJA C,CKMNC4 ; ZERO, GO TRY NEXT UNIT
; HERE IF F/S BUSY
CKMNC5: TYPE <% >; ;BEGIN THE MESSAGE
MOVE M,FSNAME ;GET THE STR NAME
PUSHJ P,SIXTTY ; & TYPE IT
TYPE < has other users - /REMOVE ignored
>; ;TELL THE USER WHAT HAPPENED
TLZ F,L.REM ;CLEAR /REMOVE SWITCH
POPJ P, ;RETURN NOW
; S/R TO CREATE LOGICAL UNIT NAMES
; CALL - A = LOGICAL UNIT NUMBER
; B = F/S NAME
; RETURN -B = LOGICAL UNIT NAME
LOGUNI: MOVE N,[POINT 6,B] ;GET F/S BYTE POINTER
LOGUN1: ILDB M,N ;GET NEXT CHAR OF F/S NAME
TLNE N,770000 ;TEST FOR SIXTH CHAR
JUMPN M,LOGUN1 ;LOOP IF NOT END OF NAME
MOVEI M,'0'(A) ;CREATE AN SIXBIT DIGIT
DPB M,N ;STORE TO REPLACE 1ST NULL
POPJ P, ;RETURN TO CALLER
;
; DISMOUNT DISPATCH TABLE AND ROUTINES
;
DEFINE SWTAB (A)<
IRP A,<XWD SIXBIT \ A\,DMS'A>>
DMSPAU==UMSPAU
DMSVID==VIDIN
SWERR2
SWERR
DMSLST: SWTAB <HEL,R,REM,PAU,CHE,VID,WAI,NOW,KEE,REA,REL,REW,UNL,STA>
DMSLEN=.-DMSLST
DMSHEL: MOVE A,[<SIXBIT /DISMOUNT/>] ;GET NAME OF HELP FILE
JRST GOHELP ;GO TYPE IT OUT
DMSR: ;MERELY /R
DMSUNL: ;/UNLOAD
DMSREM: TLO F,L.REM
MOVEI A,11 ;GET CODE FOR UNLOAD (MUST BE AC 'A')
MOVEM A,DMSPOS ;STORE AS POSITION RQST CODE
POPJ P,
DMSCHE: MOVEI NUM,(SIXBIT .D.)
MOVE A,NAMMNT
JRST CCOMSB
DMSSTA: TDZA A,A ;GET CODE FOR /STAY & SKIP (MUST BE AC 'A')
DMSREW: MOVEI A,1 ;GET CODE FOR /REWIND (MUST BE AC 'A')
MOVEM A,DMSPOS ;STORE AS POSITION RQST CODE
TLZ F,L.REM ;SET FLAG FOR NO REMOVAL
POPJ P, ;RETURN
DMSKEE: MOVE A,JOBNO ;GET CURRENT JOB # FOR /KEEP
MOVEM A,TOJOB ;STORE AS DVC DISPOSITION
POPJ P, ;RETURN
DMSREL: SETZM TOJOB ;CLEAR DVC DISPOSITION FOR /RELEASE
POPJ P, ;RETURN
DMSREA: CAIE CH,":" ;TEST FOR ARGUMENT FOLLOWING
JRST COMERR ; NO, ERROR
PUSHJ P,SDECIN ;READ DESIRED JOB # FOR /REASSIGN
JUMPLE N,COMERR ; ERROR IF .LE. 0
MOVE A,[15,,CNFTBL] ;GET GETTAB PARMS FOR HIGHEST JOB #
GETTAB A, ;GET HIGHEST JOB #
MOVEI A,^D64+1 ; FAILED, ASSUME LEVEL-C
CAILE N,-1(A) ;TEST FOR LEGAL JOB #
JRST COMERR ; NO, ERROR
MOVEM N,TOJOB ;STORE AS DVC DISPOSITION
POPJ P, ;RETURN
;SUBROUTINE TO READ A /VID SWITCH
VIDIN: TLO F,L.VID ;SET A BIT
SETZM VIDK
CAIE CH,":" ;FOLLOWED BY TEXT?
JRST COMERR ; NO - SYNTAX ERROR
; POPJ P, ;NO-THATS ALL
MOVNI A,VIDMAX
MOVE B,[POINT 7,VID]
TRZ F,R.VIDT
PUSHJ P,(IO)
CAIE CH,VIDCH1
CAIN CH,VIDCH2
SKIPA C,CH ;IF EITHER ' OR ", SAVE IT IN C
JRST VIDIN4
TRO F,R.VIDT
JRST VIDIN3
VIDIN2: PUSHJ P,(IO)
VIDIN4: CAIL CH,"0" ;DIGITS ARE LEGAL
CAILE CH,"9"
CAIN CH,"-" ;HYPHEN IS LEGAL
JRST VIDIN3
CAIL CH,"A" ;LETTERS ARE LEGAL
CAILE CH,"Z"
CAIN CH,"." ;PERIOD IS LEGAL
JRST VIDIN3
CAIE CH,11 ;ALLOW TABS
CAILE CH,15
TRNN F,R.VIDT
JRST VIDIN5
CAME CH,C
JRST VIDIN3
AOSLE A
TDZA A,A
IBP B
DPB CH,B
PUSHJ P,(IO)
VIDIN5: ADDI A,VIDMAX ;FINISHED-COUNT CHARACTERS
MOVEM A,VIDK
TRZE F,R.VIDT ;TEST FOR QUOTED VID
SUBI A,2 ; YES, SUBTRACT OFF SIZE OF QUOTES
SKIPG A ;TEST FOR POSITIVE VID SIZE
TLZ F,L.VID ; NO, THEN SHOW NO VID
POPJ P,
VIDIN3: JUMPGE A,VIDIN2 ;DONT OVERUN BUFFER
IDPB CH,B
AOJA A,VIDIN2
;SUBROUTINE TO OUTPUT /VID SWITCH
VIDOUT: TLNN F,L.VID ;WAS THERE ONE?
POPJ P, ;NO
TEXT < /V:>
PUSHJ P,MSG
MOVE A,VIDK
MOVE B,[POINT 7,VID]
VIDOU2: SOJL A,CPOPJ
ILDB CH,B
PUSHJ P,(IO)
JRST VIDOU2
;SUBROUTINE TO READ A REELID SWITCH
RIDIN: TLO F,L.RID ;SHOW WE'VE SEEN A /REELID
CAIE CH,":" ;IS THERE A VALUE
JRST COMERR ;NO-ERROR
PUSHJ P,(IO) ;READ VALUE
PUSHJ P,SIXBRD ;..
JUMPE A,COMERR ;NULL-ERROR
MOVEM A,REELID ;SAVE IT
POPJ P,
;SUBROUTINE TO OUTPUT A /REELID SWITCH TO CMD FILE
RIDOUT: TLNN F,L.RID ;IS THERE A SWITCH
POPJ P, ;NOTHING TO OUTPUT
TEXT < /REELID: >
PUSHJ P,MSG
MOVE M,REELID
PJRST SIXMSG
SUBTTL MOUNT COMMANDS
;HERE ON MOUNT COMMANDS
MOUNT:
MOVEI A,"M"
MOVEM A,CMDCHR
IFN LOGSW, <
PUSHJ P,IORJOB ;SET UP FILE NAME FOR MOUNT CMD
>; END OF IFN LOGSW
MOVEI A,3 ;SET LOOP CATCHERS
MOVEM A,LOOPX1
;SCAN FOR DEVICE & LOGICAL NAMES
SETZM PHYNAM
IFN LOGSW, <
SETZM GENLOG ;CLEAR FLAG FOR GENERATED LOGICAL NAME
>; END OF IFN LOGSW
TLZ F,L.SIN!L.WRTL!L.VID!L.PWA!L.RID!L.WEN
;CLEAR /ACTIVE /NOCREATE FLAGS
TRZ F,R.CLR ;CLEAR MORE SWITCH FLAGS
IFE ACTSW, <
TRO F,R.PAS ;/PASSIVE IS DEFAULT IF ACTSW=0
>; END OF IFE ACTSW
PUSHJ P,UMSPRC ;SWITCHES
SKIPE NOTLOG ;TEST FOR LOGGED IN
JRST LOGERR ; NO, AN ERROR IF HERE
PUSHJ P,REDEV
JUMPE A,ERR101 ;MUST BE ONE
MOVEM A,CMDFSN ;
MOVEM A,DVVNAM
PUSHJ P,UMSPRC ;SWITCHES
PUSHJ P,REDEV ;GET 2ND NAME (OPTIONALL LOGICAL NAME)
MOVEM A,LOGNAM
PUSHJ P,UMSPRC
;IS THIS A DISK OR F.S.?
MOVE A,DVVNAM
DEVCHR A,
JUMPE A,MOFS2 ;IF IT FAILS TRY STRLST.SYS
MOVEM A,DEVMOD ;SAVE DEVCHR BITS
TLNN F,L.WRTL!L.WEN ;CHECK FOR USER SETTING WRITE-STATUS
TLNN A,DC.MTA!DC.DTA ;CHECK FOR ANY KIND OF TAPE
SKIPA ;IF USER DID NOT SPECIFY WRITE STATUS,
; AND IT IS A TAPE, SET DEFAULT
IFN WENOFS,<
TLO F,L.WEN ;SET WRITE-ENABLE
>; END IFN WENOFS
IFN WLNOFS,<
TLO F,L.WRTL ;SET WRITE-LOCK
>; END IFN WLNOFS
IFN SPONUL, <
MOVE B,DVVNAM ;GET INPUT DEVICE NAME
DEVNAM B, ;FIND OUT PHYSICAL NAME
MOVE B,DVVNAM ; ERROR, RESTORE ORIGINAL
MOVSS B ;SWAP PHYSICAL DEVICE NAME
CAIN B,'NUL' ;TEST FOR DEVICE NUL:
JRST MOUN02 ; YES, JUMP
>; END OF IFN SPONUL
;[100] MOUNT 42 1/2
MOVE B,DVVNAM ;GET INPUT DEVICE
DEVPPN B, ;DOES PPN OF DEV: MATCH USER'S
MOVE B,USRPPN ;ERROR, USE HIS AS DEFAULT
CAME B,USRPPN ;DOES USER'S MATCH DEV:'S
JRST ERR130 ; NO, CAN'T ALLOW ERSATZ (SYSA)
TLNE A,DC.FS ;FILE STRUCTURE?
JRST MOFS ;YES--NEEDS SPECIAL ATTENTION
;HERE FOR NON-F/S KHOWN TO SYSTEM BY DEVCHR
IFN VIDRID, <
TLNN F,L.VID ;TEST FOR /VID
JRST MOUN1B ; NO, JUMP
TLNE F,L.RID ;TEST FOR /REELID
JRST MOUN1B ; YES, JUMP
; ATTEMPT TO DERIVE A REELID FROM THE GIVEN VID
SETZM REELID ;START WITH NULL REELID
SKIPLE A,VIDK ;GET VID COUNT & TEST IT
CAILE A,6 ;TEST FOR VID TOO BIG
JRST MOUN1B ; EITHER, JUMP
MOVE B,[POINT 7,VID] ;GET VID BYTE POINTER
MOVE C,[POINT 6,REELID] ;GET REELID BYTE POINTER
MOUN1A: ILDB D,B ;GET NEXT CHAR OF VID
CAIL D,"0" ;TEST FOR TOO SMALL
CAILE D,"Z" ;TEST FOR TOO LARGE
JRST MOUN1B ; EITHER, JUMP (VID NOT ALPHAMERIC)
CAILE D,"9" ;TEST FOR NUMERIC VID
CAIL D,"A" ;TEST FOR ALPHABETIC VID
TRCA D,40 ; EITHER, CONVERT TO SIXBIT & SKIP
JRST MOUN1B ; OTHERWISE, JUMP (VID NOT ALPHAMERIC)
IDPB D,C ;STORE REELID CHARACTER
SOJG A,MOUN1A ;DECR COUNT & REPEAT
TLO F,L.RID ; DONE, SHOW /REELID DEFINED
MOUN1B: ;HERE AFTER /VID-/REELID WORK DONE
>; END IFN VIDRID
IFLE RIDSW, <
MOVE A,DEVMOD ;GET DEVCHR BITS
TLNN A,DC.MTA ;TEST FOR A MAGTAPE
TLZ F,L.RID ; NO, THEN FORGET THE REELID
>; END OF IFLE RIDSW
IFG RIDSW, <
PUSHJ P,CKRID ;GO CHECK FOR A PROPER REELID
>; END OF IFG RIDSW
MOUN02: PUSHJ P,CKEOL ;/REELID OK; SO GO CHECK FOR END OF LINE
;HERE IF NOT A F.S. - UUOS REQUIRE 5.03 MONITOR OR LATER
MOVE A,MONVER
CAIGE A,VER503
JRST ERR503
;GET A PHYSICAL NAME FOR DVVNAM (IN CASE ITS GENERIC OR LOGICAL)
MOUNT1: TDZ F,[L.SIN,,R.ASCO!R.PAS!R.NOC] ;CLEAR F/S BITS
SOSGE LOOPX1 ;CK FOR PATHALOGICALOOP
JSP N,NEVERR
MOVE A,DVVNAM ;ASSUME ITS PHYSICAL ALREADY
MOVEM A,PHYNAM
DEVNAM A,PHONLY ;YES-AND ALSO PHYSICAL?
JRST MOUN15 ;NO
JUMPE A,MOUN15 ;NO
MOVE A,DVVNAM ;YES-GENERIC?
TRNE A,-1
JRST MOUN16 ;NO
IFN SPONUL, <
MOVE B,A ;COPY THE DEVICE NAME
DEVTYP B,PHONLY ;FIND OUT ABOUT THE GENERIC DEVICE
JSP N,NEVERR ; ERROR, FATAL & UNKNOWN
MOVS C,A ;GET SWAPPED PHYSICAL DEVICE NAME
CAIE C,'NUL' ;TEST FOR DEVICE NUL:
TLNE B,.TYSPL ;TEST FOR SPOOLED GENERIC DEVICE
JRST MOUNT2 ; EITHER, JUST USE GENERIC NAME
>; END OF IFN SPONUL
IFE LOGSW, <
SKIPN LOGNAM ;LOGICAL NAME SPECIFIED?
JRST ERR104 ; NO - SO REQUEST ONE
>; END OF IFE LOGSW
HRRI A,'0 ' ;YES-FIND A FREE UNIT STARTING WITH DEV0
IFN MTA0SW, <
CAMN A,[SIXBIT /MTA0/] ;TEST FOR MTA0
HRRI A,'1 ' ; YES, START WITH MTA1 INSTEAD
>; END OF IFN MTA0SW
MOUN12: MOVE B,A
DEVTYP B,PHONLY
JRST MONAV
JUMPE B,MONAV ;NO FREE ONE -- TELL USER
LDB C,[.TYJOB+B] ;ASSIGNED TO A JOB?
JUMPE C,MOUNT2 ;NO--USE THIS ONE
ADDI A,10000 ;YES-TRY NEXT ONE
JRST MOUN12
;HERE IF DVVNAM IS SPECIFIC (LOGICAL OR PHYSICAL)
MOUN15: MOVE A,DVVNAM ;HET PHYS. NAME
IFN LOGSW, <
SKIPN LOGNAM ;TEST FOR LOGICAL NAME SPECIFIED
MOVEM A,LOGNAM ; NO, MAKE THIS A LOGICAL NAME
>; END OF IFN LOGSW
DEVNAM A,
JSP N,NEVERR
SKIPN A
JSP N,NEVERR ;??DEVCHR WORKED??
MOVEM A,PHYNAM
MOUN16: MOVE B,A
DEVTYP B,PHONLY ;GET DEVTYP BITS
JSP N,NEVERR
TLNE B,.TYAVL ;AVAILABLE?
JRST MOUNT2 ;YES
JRST MONAV
;HERE IF POSSIBLE TO DO IT OURSELF
; A=PHYS.NAME B=DEVTYP BITS FOR IT
IFE SPONUL, <
MOUNT2: LDB B,[.TYJOB+B] ;ASSIGNED TO THIS JOB?
CAMN B,JOBNO
TRO F,R.ASCO ;YES-REMEMBER THE FACT
>; END OF IFE SPONUL
IFN SPONUL, <
MOUNT2: LDB C,[.TYJOB+B] ;GET CURRENT OWNER'S JOB #
CAMN C,JOBNO ;TEST FOR [SELF]
TRO F,R.ASCO ; YES, REMEMBER THAT
MOVS C,A ;GET SWAPPED PHYSICAL DEVICE NAME
CAIE C,'NUL' ;TEST FOR DEVICE NUL:
TLNE B,.TYSPL ;TEST FOR SPOOLED DEVICE
JRST MOUNT3 ; EITHER, GO MOUNT IT OURSELVES
>; END OF IFN SPONUL
IFN VIDSW, <
MOVE B,DEVMOD ;GET DEVCHR BITS
TLNE B,DC.OUT ;TEST FOR DEVICE CAPABLE OF OUTPUT
TLNE B,DC.DTA ;TEST FOR DTA (TAPE DRIVE)
TLNE F,L.VID ;TEST FOR VID GIVEN
JRST MOUNT4 ; JUMP IF (A) /VID SPECIFIED, OR
; (B) THE DVC CAN DO OUTPUT AND
; IS NOT DECTAPE
MOVEI M,[ASCIZ \? Requires /VID switch\] ;POINT AT MSG
JRST ERREXI ; & GO EXIT
MOUNT4: ;HERE IF /VID GIVEN OR NOT REQUIRED
>; END OF IFN VIDSW
MOVE C,STATES ;TEST FOR OPERATOR CONSTRAINTS
TRNE C,STAOMO ;TEST FOR OPR WANTS TO SEE ALL
TLNE F,L.VID!L.WRTL!L.WEN!L.RID ;TEST FOR OPR REQ'D
SKIPA ; SKIP IF OPR WANTS ALL OR OPR REQ'D
JRST MOUNT3 ; ELSE GO DO IT OURSELVES
TRNN C,STAOPR ;TEST FOR OPR ON DUTY
JRST MOOP ; YES, SEND IT TO HIM
TLNN F,L.VID!L.WRTL!L.WEN!L.RID ;TEST FOR OPR-REQD DATA GIVEN
JRST MOUNT3 ; NO, THEN DO IT OURSELVES
PUSHJ P,ERR911 ;GO CHECK SHOVE
JRST MOOP ;IF SHOVE, GO ON
;HERE TO DO IT OURSELF A=PHYS.NAME
MOUNT3: ;HERE TO DO THE 'MOUNT' OURSELVES
IFN LOGSW, <
MOVEM A,PHYNAM ;REMEMBER THE PHYSICAL NAME
SKIPE LOGNAM ;TEST FOR LOGICAL NAME GIVEN
PUSHJ P,CKLOG ; YES, CHECK FOR DUPLICATE
SETZM LOGNAM ;CLEAR LOGICAL NAME IF ERROR RETURN
MOVE A,PHYNAM ;RESTORE PHYSICAL NAME
>; END OF IFN LOGSW
PUSHJ P,ASLOG ;OPEN ON US1 AND ASSIG.LOG.NAME IF NECESSARY
JRST MOUNT1 ;TRY AGAIN INCASE SOMEONE JUST ASSIGNED IT
IFL RIDSW, <
PUSHJ P,CKRID ;GO CHECK FOR /REELID IF MTA
>; END OF IFL RIDSW
MOVEI A,US1 ;IF WE DO NOT GO TO OMOUNT, SET REELID
MOVE B,REELID
TLNE F,L.RID ;OF COURSE, DON'T BOTHER IF NONE
MTAID. A,
JFCL
TRNE F,R.ASCO ;ALREADY ASSIGNED?
JRST MOOK ;YES
MOVEI B,US1 ;NO-TRY TO ASSIGN DEVICE (REASSIGN TO MYSELF)
MOVE A,JOBNO
REASSI A,
SKIPE A ;SUCCESS?
JUMPN B,MOOK ;YES
MOVE B,DVVNAM ;NO-TELL USER
PUSHJ P,MSG104
RELEAS US1,
;HERE TO SEE HOW IT ALL CAME OUT
MOCK: SKIPN B,LOGNAM ;LOGICAL NAME?
MOVE B,DVVNAM ;NO--USE DVVNAM
IFN LOGSW, <
DEVNAM B, ;GET PHYSICAL DEVICE NAME
JRST ERR912 ; FAILED, TELL USER OF MOUNT FAILURE
>; END OF IFN LOGSW
PUSHJ P,MOPEN
JRST ERR912 ;CANT--TELL LOOSER USER
;HERE IF SUCCESSFUL WITH DEVICE OPENED ON US1
IFE SPONUL, <
MOOK: MOVEI A,US1 ;CK THAT OPENED DEV. IS ASSIGNED TO ME
DEVCHR A,
TRNN A,400000 ; ASSIGNED?
JRST ERR912
MOVEI A,US1
DEVTYP A,
JRST ERR912
LDB A,[.TYJOB+A] ; TO ME?
CAME A,JOBNO
JRST ERR912
>; END OF IFE SPONUL
IFN SPONUL, <
MOOK: MOVEI A,US1 ;GET CHANNEL NUMBER
DEVTYP A, ;FIND OUT ABOUT THE DEVICE
JRST ERR912 ; ERROR, GIVE 'MOUNT INCOMPLETE' MSG
MOVEM A,DVVTYP ;STORE DEVTYP BITS
TLNE A,.TYSPL ;TEST FOR SPOOLED
JRST MOOK1 ; YES, JUMP
MOVEI B,US1 ;GET CHANNEL # AGAIN
DEVCHR B, ;GET DEVICE CHAR
TRNN B,DC.ASC ;TEST FOR ASSIGNED
JRST ERR912 ; NO, GIVE 'MOUNT INCOMPLETE' MSG
LDB C,[.TYJOB+A] ;GET OWNER'S JOB #
CAME C,JOBNO ;TEST FOR [SELF]
JRST ERR912 ; ERROR IF NOT ASSIGNED
MOOK1: ;HERE IF I OWN THE DEVICE
>; END OF IFN SPONUL
IFN FTFACT, <
SKIPE IDIDIT ;IF OMOUNT USED, NO NEED TO WORRY HERE
JRST MOOK1A
IFN SPONUL, <
MOVE A,DVVTYP ;GET DEVTYP BITS
TLNE A,.TYSPL ;TEST FOR SPOOLED DEVICE
JRST MOOK1A ; YES, JUMP
>; END OF IFN SPONUL
MOVEI A,US1 ;GET CHANNEL #
DEVNAM A, ;GET DEVICE ASSOC WITH CHANNEL
MOVSI A,'???' ; FAILED, SHOW STRANGE
IFN SPONUL, <
MOVS C,A ;GET SWAPPED PHYSICAL DEVICE NAME
CAIN C,'NUL' ;TEST FOR DEVICE NUL:
JRST MOOK1A ; YES, JUMP
>; END OF IFN SPONUL
HRLI NUM,'UM ' ;GET CODE FOR USER MOUNT
PUSHJ P,WRFACT ;CALL TO WRITE ACCT'G RECORD
MOOK1A: ;HERE NOT TO WRITE ACCT'G
>; END OF IFN FTFACT
IFE LOGSW, <
SKIPN M,LOGNAM ;LOGICAL NAME?
MOVE M,DVVNAM ;NO-USE DVVNAME
PUSHJ P,SIXTTY
SKIPN LOGNAM ;IF WAS LOGICAL NAME
JRST MOOK1
PUSHJ P,LPAR ;TYPE PHYS.NAME IN PARENS
MOVEI M,US1
DEVNAM M,
SETZM M
PUSHJ P,SIXTTY
PUSHJ P,RPAR
MOOK2: XTYPE < Mounted
>; ;THATS ALL
>; END OF IFE LOGSW
IFN LOGSW, <
MOVEI A,US1 ;GET CHANNEL # AGAIN
SETZ B, ;GET NULL LOGICAL NAME
SKIPGE GENLOG ;TEST FOR GENERATED LOGICAL NAME
DEVLNM A, ; YES, ERASE IT NOW
JFCL ; ( & IGNORE ERRORS)
SKIPN GENLOG ;TEST FOR GENERATED LOGICAL NAME
SKIPN M,LOGNAM ;GET USER-SPEEC LOG NAME & SKIP
HLLZ M,DVVNAM ; NO USER-SPEC L.N., USE GENERIC PHYSICAL
PUSHJ P,SIXTTY ;TYPE THE DEVICE NAME
TYPE < mounted, >; ;TYPE 'MOUNTED'
IFN SPONUL, <
MOVE A,DVVTYP ;GET DEVTYP BITS
MOVEI M,[ASCIZ /Spooled /] ;ASSUME SPOOLED
TLNE A,.TYSPL ;TEST FOR SPOOLED
PUSHJ P,MSGTTY ; YES, TELL THE USER
>; END OF IFN SPONUL
MOVEI M,US1 ;GET CHANNEL # AGAIN
DEVNAM M, ;FIND OUT PHYSICAL DEVICE NAME
MOVSI M,'???' ; FAILED, TELL THE USER THAT
PUSHJ P,SIXTTY ;TYPE THE DEVICE NAME
XTYPE < used
>; ;FINISH THE MSG & EXIT
>; END OF IFN LOGSW
;HERE IF DEVICE NOT AVAILABLE
MONAV: MOVE C,STATES ;GET STATES WORD
TRNN C,STAOPR ;TEST FOR OPR PRESENT
JRST MOOP ; YES, GO LET HIM DECIDE
MOVE M,DVVNAM ;GET DEVICE NAME
PUSHJ P,MSG100 ;TELL THE USER NOT AVAILABLE
PUSHJ P,ERR911 ;& TELL HIM WE FAILED, CHECK SHOVE
;HERE IF NEED OPERATORS HELP (OMOUNT)
IFE LOGSW, <
MOOP: SKIPN A,LOGNAM ;LOGICAL NAME?
JRST MOOP1 ;NO
DEVTYP A, ;YES-ALREADY USED?
JRST MOOP0
LDB A,[.TYJOB+A]
CAME A,JOBNO
JRST MOOP1 ;NO
PUSHJ P,MSG101 ;YES-TELL USER
MOOP0: SETZM LOGNAM ; AND IGNORE IT
>; END OF IFE LOGSW
IFN LOGSW, <
MOOP: SKIPE LOGNAM ;TEST FOR LOGICAL NAME
PUSHJ P,CKLOG ; YES, CHECK FOR DUPLICATE
PUSHJ P,NAMGEN ;GENERATE A LOGICAL NAME IF ZERO OR DUPL.
>; END OF IFN LOGSW
MOOP1: TRNN F,R.ASCO ;ALREADY ASSIGNED?
JRST MOOP2 ;NO
MOVE A,PHYNAM ;YES-ASSIGN LOG.NAME IF ANY
PUSHJ P,ASLOG
PUSHJ P,MSG900
;[101] MOOP1 4 1/2
IFL RIDSW,<
PUSHJ P,CKRID ;CHECK REELID
>; END IFL RIDSW
MOVEI A,US1 ;GIVE DEVICE A REELID
MOVE B,REELID
TLNE F,L.RID ;IF SPECIFIED
MTAID. A,
JFCL
RELEAS US1,
MOOP2: ;HERE TO QUEUE MOUNT RQST FOR THE OPR
PUSHJ P,MOQU ;QUEUE REQUEST TO OPERATOR
JRST MOCK ;GO SEE WHAT HAPPENED
;SUBROUTINE TO QUEUE REQUEST TO OMOUNT AND WAIT FOR IT
MOQU: PUSHJ P,QUEREQ
PUSHJ P,MSG110 ;TELL USER OPERATOR NOTIFIED
PJRST TMWAIT ;RETURN WHEN PROCESSED
;SUBROUTINE TO ASSIGN LOGICAL NAME TO DEVICE
;CALL A=NAME
;RET+1 CANT OPEN DEVICE
;RET+2 OPENED SUCCESSFULY-MAY OR MAYNOT HAVE ASSIGNED LOG.NAME
ASLOG: MOVE B,A ;OPEN ON US1
PUSHJ P,MOPEN
POPJ P, ;CANT
IFN LOGSW, <
ASLOG1: ;HERE TO ATTEMPT LOGICAL NAME ASSIGNMENT
>; END OF IFN LOGSW
SKIPN B,LOGNAM ;IS THER A LOG.NAME?
JRST CPOPJ1 ;NO-RETURN
MOVEI A,US1 ;YES-ASSIGN LOG.NAME
DEVLNM A,
AOSA A
JRST CPOPJ1 ;SUCCESSS
AOJN A,ASLOG2 ;FAILURE--WHAT?
IFE LOGSW, <
PUSHJ P,MSG101 ; NAME IN USE
SKIPA
ASLO2: PUSHJ P,MSG900 ; ?SOMETHING ELSE
>; END OF IFE LOGSW
IFN LOGSW, <
;[103] ASLOG + 6 1/2
MOVEI A,US1 ;GET PHYNAM OF DEVICE
DEVNAM A,
JRST ASLOG3
MOVE B,LOGNAM ;GET IT FOR LOGICAL NAME
DEVNAM B,
JRST ASLOG1
CAMN A,B ;IF THEY ARE THE SAME, GOOD
JRST CPOPJ1 ;SUCCESS RETURN
ASLOG3: SKIPN GENLOG ;TEST FOR GENERATED LOGICAL NAME
PUSHJ P,MSG101 ; NO, TELL THE USER OF HIS ERROR
PUSHJ P,NAMGEN ;GENERATE A NEW LOGICAL NAME
JRST ASLOG1 ; & TRY AGAIN
>; END OF IFN LOGSW
ASLOG2: SETZM LOGNAM ;IGNORE LOGNAME
JRST CPOPJ1
IFN LOGSW, <
;
; SUBROUTINE TO GENERATE A LOGICAL NAME FOR A MOUNT COMMAND
;
; THE PHYSICAL NAME (IF NOT GENERIC) IS TRIED AS THE LOGICAL.
; IF THAT CANNOT BE USED, THEN A RANDOM NAME OF THE FORM
; 'MNNNNN' IS GENERATED, WHERE 'NNNNN' REPRESENTS A FIVE-DIGIT
; NUMBER CREATED FROM THE UPTIME.
;
NAMGEN: PUSH P,A ;SAVE REGISTERS
PUSH P,B ; DITTO
PUSH P,C ; DITTO
PUSH P,D ; DITTO
SKIPN GENLOG ;TEST FOR PREVIOUS ATTEMPT
JRST NAMPHY ; NO, GO TRY PHYSICAL NAME
NAMNXT: MOVE A,[15,,12] ;GET GETTAB PARMS FOR UPTIME
GETTAB A, ;GET UPTIME FROM SYSTEM
TIMER A, ; FAILED, GET TIME-OF-DAY
MOVE C,[POINT 6,D,5] ;POINT AT 1ST CHAR OF AC 'D'
MOVSI D,'M ' ; & DEFINE 1ST CHAR AS 'M'
NAMLOP: IDIVI A,^D10 ;GET LOW-ORDER DIGIT OF UPTIME
ADDI B,'0' ;CONVERT IT TO SIXBIT
IDPB B,C ;STORE INTO RESULT
TLNE C,770000 ;TEST FOR 6TH CHAR YET
JRST NAMLOP ; NO, REPEAT
CAMN D,LOGNAM ;TEST FOR SAME NAME AS PREVIOUS
JRST NAMSLP ; YES, GO DELAY & REPEAT
MOVEM D,LOGNAM ;REMEMBER THE NAME
SETOM GENLOG ;SHOW LOGICAL NAME GENERATED
NAMXIT: PUSHJ P,CKLOG ;CHECK FOR DUPLICATE LOGICAL NAME
JRST NAMNXT ; YES, GO GENERATE ANOTHER ONE
POP P,D ;RESTORE REGISTERS
POP P,C ; DITTO
POP P,B ; DITTO
PJRST APOPJ ;RESTORE 'A' & RETURN TO CALLER
; HERE TO SLEEP 'TIL NEXT CLOCK TICK
NAMSLP: SETZ A, ;REQUEST MINIMUM TIME DELAY
SLEEP A, ;SLEEP THAT LONG
JRST NAMNXT ;GO GENERATE A NEW LOGICAL NAME
; HERE TO SEE IF PHYSICAL NAME CAN BE LOGICAL AS WELL
NAMPHY: MOVE A,PHYNAM ;[102] GET DEVICE NAME - MUST BE PHYSICAL BECAUSE
; OF CODE AT 'MOUN15'
TRNE A,-1 ;TEST FOR GENERIC NAME
SKIPE LOGNAM ;TEST FOR PREVIOUS LOGICAL NAME
JRST NAMNXT ; GO GENERATE IF GENERIC OR PREV. LOGICAL
MOVEM A,LOGNAM ;STORE PHYSICAL NAME AS LOGICAL
AOS GENLOG ;SET FLAG +1 TO SHOW PHYSICAL NAME USED
JRST NAMXIT ;GO CHECK FOR DUPL & RETURN
;
; SUBROUTINE TO CHECK FOR DUPLICATE LOGICAL NAMES
;
; ASSUMES LOGNAM & PHYNAM SET UP
;
; RETURN +0 IF LOGNAM DUPLICATED FOR THIS JOB
; +1 IF LOGNAM UNIQUE FOR THIS JOB
;
CKLOG: MOVEI NUM,(SIXBIT .M.);GET CODE FOR MOUNT RQST
PUSHJ P,CMGETI ;INITIALIZE THE QUEUE UFD
CKLOG1: PUSHJ P,CMGET ;GET NEXT MOUNT CMD FOR THIS JOB
JRST CKLOG2 ; NO MORE, JUMP
MOVEI N,7 ;GET COUNTER TO SKIP 7 FIELDS
PUSHJ P,SKPFLD ;CALL TO SKIP 7 FIELDS
JRST CKLOG1 ; EOF, GET NEXT CMD
PUSHJ P,SSIXBR ;READ 8TH FFIELD (LOGICAL NAME)
JUMPE A,CKLOG1 ; NOT THERE, GET NEXT CMD FILE
CAME A,LOGNAM ;TEST FOR SAME NAME
JRST CKLOG1 ; NO, GET NEXT CMD FILE
CLOSE CMD, ;CLOSE THE CMD FILE
JRST CKLOG5 ;GO DELETE THE LOGICAL NAME
CKLOG2: MOVE A,LOGNAM ;GET THE LOGICAL NAME
DEVCHR A, ;FIND OUT IF DEVICE EXISTS
JUMPE A,CPOPJ1 ; NO, RETURN+1 (A WINNER)
MOVE A,LOGNAM ;GET THE LOGICAL NAME AGAIN
DEVTYP A, ;FIND OUT OWNING JOB #
JRST CKLOG3 ; UUO NOT IMPL., SKIP THIS TEST
TLNE A,.TYSPL ;TEST FOR SPOOLED
JRST CKLOG3 ; YES, SKIP NEXT TEST
LDB A,[.TYJOB+A] ;GET OWNER'S JOB #
CAME A,JOBNO ;TEST FOR [SELF]
JRST CPOPJ1 ; NO, RETURN +1 (A WINNER)
CKLOG3: SKIPGE GENLOG ;TEST FOR GENERATED LOGICAL NAME
POPJ P, ; YES, RETURN+0 TO THROW IT AWAY
MOVE A,LOGNAM ;LOG. NAME
DEVNAM A,
JRST CPOPJ1 ;OK
CAMN A,PHYNAM ;IS THE LOGICAL NAME SAME AS PHYS.
JRST CPOPJ1 ;YES, OK
MOVE A,LOGNAM ;GET CURRENT DEVICE NAME
SETZ B, ;GET NULL NEW LOGICAL NAME FOR DUPL DVC
DEVLNM A, ;CLEAR ORIG DVC WITH OUR LOGICAL NAME
AOJA A,CKLOG4 ; ERROR, ADD 1 TO ERROR CODE & JUMP
TYPE <% Specified Logical Name was in use
>; ;TELL THE USER WHAT WE DID
JRST CPOPJ1 ;RETURN SUCCESSFULLY
CKLOG4: JUMPE A,CPOPJ1 ;RETURN+1 IF 0 (-1 RET'D), NO SUCH DEVICE
CKLOG5: SKIPN GENLOG ;TEST FOR GENERATED LOGICAL NAME
PUSHJ P,MSG101 ; NO, TELL THE USER OF HIS ERROR
POPJ P, ;TAKE ERROR RETURN TO CALLER
>; END OF IFN LOGSW
;SUBROUTINE TO OPEN DEVICE ON US1
;CALL B=DEVICE NAME
; DSKCHR BITS IN DEVMOD
;RET+1 ERROR (MSG TYPED) OR NO SUCH DEVICE
;RET+2 OK
;USES A,B,C,D
MOPEN: HRLZ C,DEVMOD ;GET READY FOR JFFO
TLZ C,DC.ASC!DC.ASP ;LEAVE ONLY MODE BITS IN LH.
JFFO C,MOPEN1 ;CONVERT BIT POSIT. TO NUMBER
PJSP N,NEVMSG ;SHOULDNT HAPPEN
MOPEN1: MOVEI A,^D17
SUB A,C+1
IFN LOGSW, <
TLO A,(PHOPEN) ;REQUEST PHYSICAL-ONLY OPEN
>; END OF IFN LOGSW
SETZM C ;NO OPEN
IFN LOGSW, <
OPEN US1,A ;ATTEMPT AN OPEN
TLZA A,(PHOPEN) ; FAILED, CLEAR PHYSICAL-ONLY & SKIP
JRST CPOPJ1 ; SUCCEEDED, RETURN +1
>; END OF IFN LOGSW
OPEN US1,A
POPJ P, ;CANT DO
JRST CPOPJ1 ;GOOD RETURN
IFN RIDSW, <
;ROUTINE TO CHECK FOR A REELID AND ISSUE APPROPRIATE MESSAGE
CKRID: MOVE A,DEVMOD ;GET DEVCHR BITS
TLNE A,DC.MTA ;TEST FOR A MAGTAPE
JRST CKRID1 ; YES, JUMP
TLZ F,L.RID ; NO, CLEAR /REELID BITS
POPJ P, ;RETURN TO CALLER
CKRID1: TLNE F,L.RID ;TEST FOR /REELID
POPJ P, ; YES, RETURN TO CALLER
MOVE A,[%CNVER] ;GET GETTAB PARMS FOR MONTIRO VERSION
GETTAB A, ;GET THE MONITOR VERSION
POPJ P, ; PRE-5.03, RETURN
TLZ A,-1 ;CLEAR L.H.
CAIGE A,50700 ;TEST FOR 5.07 & LATER
POPJ P, ; NO, RETURN
MOVEI M,[ASCIZ \?Requires /REELID switch\] ;POINT AT MSG
JRST ERREXI ; & GIVE THE ERROR
>; END OF IFN RIDSW
;USER HALF OF MOUNT CUSP STARTS HERE
MOFS: ;HERE: A KNOWN F/S
MOFS2: ;HERE: DEVCHR FAILED-?? UNMOUNTED F/S??
IFN JACTSW,< ;DONT WANT THIS FOR SOME DEBUGGING
TRNE F,R.NJAC ;MUST BE PRIVILEGED
JRST ERR103
>
TLNN F,L.WRTL!L.WEN ;TEST FOR WRITE-STATUS GIVEN
IFN WLFS, <
TLO F,L.WRTL ;NO, SET WRITE-LOCK
>; END IFN WLFS
IFN WEFS,<
TLO F,L.WEN ;NO, SET WRITE-ENABLE
>; END OF IFN WLSW
MOVE A,CMDFSN ;COMMAND'S FS NAME
DEVNAM A, ;GET PHYSISCAL NAME
MOVE A,CMDFSN ;
CAMN A,[SIXBIT /DSK/];USE ORIGINAL FS NAME IF "DSK"
MOVE A,CMDFSN ; WAS RETURNED
MOVEM A,FSNAME ;
SETZM UDREQ ;CLEAR USER UNIT REQUESTS FLAG
SETZM USRDRV
MOVE A,[XWD USRDRV,USRDRV+1]
BLT A,USRDRV+8*MAXKON-1 ;CLEAR USER DRIVE REQUEST TABLE
PUSHJ P,UMSPRC ;SWITCHES AGAIN
TLNE F,L.EOL ;IF END OF LINE
JRST UMOUN5 ; START PROCESSING
CAIE CH,"(" ;SKIP IF BEGINNING OF LIST OF UNITS
JRST COMERR ;DONT UNDERSTAND
SETOM UDREQ ;SET FLAG NOTING USER UNIT REQUESTS
SETZM D ;INDEX UNIT TABLES WITH D
UMOUN3: PUSHJ P,SSIXBR ;READ A UNIT NAME
CAIGE D,MAXKON*8 ;DONT STORE IF REACHED MAX. NUM.
MOVEM A,USRDRV(D)
PUSHJ P,SST ;COMMA?
CAIN CH,","
AOJA D,UMOUN3 ;YES-GET ANOTHER UNIT
CAIE CH,")" ;NO--BETTER BE )
JRST COMERR
AOS D
MOVEM D,NUMREQ ;REMEMBER NUM. OF UNITS TYPED
MOVEI CH," " ;SO UMSPRC WONT HANG ON ")
PUSHJ P,UMSPRC ;CK FOR SWITCHES A LAST TIME
JRST UMOUN5 ;GO START ACTUAL PROCESSING
UMSPRC: PUSHJ P,SST ;SKIP SPACE TABS
CAIE CH,"/" ;PRECEEDING / ?
POPJ P, ;NO--NOT A SWITCH
MOVE E,[XWD -UMSLEN,UMSLST]
PUSHJ P,UDSWIT
JRST UMSPRC ;LOOP FOR MULTIPLE SWITCHES
;
; MOUNT DISPATCH TABLE AND ROUTINES
;
DEFINE SWTAB(A),<
IRP A,<XWD SIXBIT \ A\,UMS'A
>>
UMSREE==RIDIN
UMSVID==VIDIN
SWERR2
SWERR
UMSLST: SWTAB <HEL,WEN,WLO,RON,MUL,SIN,C,CHE,PAU,VID,REE,WRI,ACT,PAS,W,WAI,NOW,NOC,CRE,SHO,NOS>
UMSLEN==.-UMSLST ;LENGTH OF TABLE OF MOUNT SWITCHES
UMSHEL: MOVE A,[SIXBIT /MOUNT/] ;GET NAME OF HELP FILE
JRST GOHELP ;GO TYPE IT
UMSNO: ;/WRITE:NO
UMSRON:
UMSWLO: TLZ F,L.WEN
TLOA F,L.WRTL
UMSSIN: TLO F,L.SIN
POPJ P,
UMSMUL: TLZ F,L.SIN ;CLEAR SINGLE IN CASE/SINGLE/MULTI TYPED
POPJ P,
UMSC: ;/C MEANS /CHECK
UMSCHE: MOVEI NUM,(SIXBIT .M.)
MOVE A,NAMMNT
JRST CCOMSB
UMSYES: ;/WRITE:YES
UMSWEN: TLZ F,L.WRTL
TLOA F,L.WEN
UMSPAU: TLO F,L.PWA
POPJ P,
UMSWRI: CAIE CH,":" ;TEST FOR NO ARGUMENT
JRST UMSWR1 ; YES,ERROR
MOVE E,[XWD -WRILEN,WRILST] ;POINT AT LEGAL KEYWORD LIST
PJRST UDSWIT ; & GO DECODE THE KEYWORD
UMSWR1: MOVEI M,[ASCIZ \? Incorrect value for /WRITE switch: \]
JRST SWERR3 ;TYPE THE ERROR MESSAGE
UMSWR1 ;ADDR OF 'NON-UNIQUE' ERROR
UMSWR1 ;ADDR OF 'NON-EXISTANT' ERROR
;/WRITE KEYWORD TABLE
WRILST: SWTAB <YES,NO>
WRILEN==.-WRILST ;LENGTH OF THE TABLE
UMSPAS: TROA F,R.PAS ;SET SWITCH IF /PASSIVE
UMSACT: TRZ F,R.PAS ;CLEAR SWITCH IF /ACTIVE
POPJ P, ;RETURN
DMSWAI: SKIPA NUM,[SIXBIT . D.] ;GET KEY-LETTER FOR DISMOUNT
UMSW: ;/W SWITCH
UMSWAI: MOVEI NUM,(SIXBIT .M.);GET KEY-LETTER FOR 'MOUNT'
TRNE F,R.NOWA ;DON'T ALLOW /WAIT AND /NOWAIT
JRST COMERR ; IT'S WORTH A '?SYNTAX ERROR'
SKIPE NOTLOG ;TEST FOR LOGGED IN
JRST LOGERR ; NO, GIVE AN ERROR
TRO F,R.WAIT ;SET IN CASE USER SPECIFIED A DEV:
SKIPE CMDFSN ;WAIT NOT ALLOWED WITH OTHER STUFF
POPJ P, ; USER WANTS TO ISSUE REQUEST W/ /WAIT
PUSHJ P,CKEOL ;/WAIT MUST BE ALONE IF NO DEV:
MOVE A,NAMMNT ;GET NAME OF SERVICING PROGRAM
JRST WCOM1 ;GO WAIT...
DMSNOW: ;LET DISMOUNT IN ON THE FUN
UMSNOW: TRNE F,R.WAIT ;DON'T ALLOW /WAIT AND /NOWAIT
JRST COMERR ; IT'S WORTH A '?SYNTAX ERROR'
TRO F,R.NOWA ;SET /NOWAIT FLAG FOR OPREQ2
POPJ P,
UMSCRE: TRZA F,R.NOC ;CLEAR SWITCH FOR /CREATE
UMSNOC: TRO F,R.NOC ;SET SWITCH FOR /NOCREATE
PJRST UMSACT ;EITHER SWITCH IMPLIES /ACTIVE, GO SET IT
UMSSHO: TROA F,R.SHOV ;GET SET TO SHOVE IT
UMSNOS: TRZ F,R.SHOV
POPJ P,
; NON-IMPLEMENTED SWITCHES
SWERR: MOVEI M,SWERM1 ;'NON-EXISTANT SWITCH'
JRST SWERR3
SWERR2: MOVEI M,SWERM2 ;'NON-UNIQUE SWITCH'
SWERR3: PUSHJ P,MSGTTY
MOVE M,A ;M=SWITCH TYPED
PUSHJ P,SIXMSG ;TYPE IT
JRST MONRET ;THATS ALL
UMOUN5: ;HERE TO PROCESS A F/S MOUNT REQUEST
PUSHJ P,CKEOL ;CALL TO CHECK FOR PROPER END OF LINE
MOVE A,[XWD CHRLEN,CHRBUF] ;DO A DSKCHR
MOVE B,FSNAME
MOVEM B,CHRBUF
DSKCHR A,
JRST STRSRC ;NOT MOUNTED--CK STRLST.SYS
LDB B,D.ARGT ;SINGLE F.S.?
CAIE B,A.FS
JRST ILFERR ;NO
TLNN A,D.SIN ;IF ALREADY MOUNTED
TLNE F,L.SIN ; AND NO SINGLE-ACCESS CONSIDERATIONS:
JRST STRSRC
SETZ NUM, ;CLEAR NUM, NORMALLY SETUP VIA STRSRC
JRST UMNT0 ; SKIP STRLST.SYS LOOKUP
SUBTTL MOUNT COMMAND - FILE STRUCTURE PROCESSING
;HERE WHEN COMMAND HAS BEEN SCANNED - FIND FILE STRUCTURE IN STRLST.SYS
STRSRC: MOVE A,[PHOPEN!14] ;SET PHYS-ONLY & MODE
MOVE B,[STLSTX] ;SET STR NAME
MOVEI C,RH.USR ;SET BUFFER HEADER
OPEN USR,A ;OPEN THE STR
JRST ERR26 ;IF SYS DOES NOT EXIST, WE'RE IN TROUBLE
MOVEI A,B.USR
MOVEM A,.JBFF
INBUF USR,1 ;SET UP 1 BUFFER
MOVE A,[SIXBIT .STRLST.]
MOVSI B,(SIXBIT .SYS.)
SETZ C,
MOVE D,[STLPPX]
LOOKUP USR,A
JRST ERR1 ;STRLST HAS A PROBLEM
PUSHJ P,R.USR ;READ FORMAT VERSION NUMBER
JRST ERR2
HLRZS A ;LH=NUMBER
CAIE A,STRFOR
JRST ERR27
STR1: PUSHJ P,R.USR ;GET NEXT WORD IN A
JRST ERR2A ;HERE IF INPUT ERROR (PROBABLY EOF)
JUMPE A,STR1 ;IGNORE 0 LENGTH BLOCKS
MOVEI B,-1(A) ;B=NUMBER OF WORDS THAT FOLLOW
PUSHJ P,R.USR ;READ FILE STRUCTURE NAME
JRST ERR17 ;YOU GOT SOMETHING AGAINST READING?
CAMN A,FSNAME ;SEE IF THIS IS THE RIGHT ENTRY
JRST HAVSTR ;YES!
PUSHJ P,SKPSTR ;SKIP THE REST OF THIS ENTRY
JRST STR1
;HERE WHEN HAVE FOUND THE FILE STRUCTURE'S ENTRY IN STRLST.SYS
HAVSTR: MOVEI NUM,-3(B)
LSH NUM,-1 ;NUM=NUMBER OF PACKS IN FILE STRUCTURE
PUSHJ P,R.USR ;GET PROJ,PROG OF OWNER
JRST ERR17
MOVEM A,OWNPPN
MOVEI B,2
PUSHJ P,SKPSTR ;SKIP OWNER'S NAME
PUSHJ P,R.USR ;READ FIRST PACK ID
JRST ERR17
MOVEM A,PACKID ;PUT FIRST PACK IN TABLE
PUSHJ P,R.USR
JRST ERR17
MOVEM A,PKCLAS ;AND FIRST CLASS WORD
UMNT1A: MOVNI D,-1(NUM)
JUMPGE D,UMNT1C ;JUMP IF ONLY ONE PACK
HRLZ D,D
UMNT1B: PUSHJ P,R.USR ;GET NEXT PACK ID
JRST ERR17
MOVEM A,PACKID+1(D) ;AND STORE IN TABLE
PUSHJ P,R.USR ;AND CLASS, ETC.
JRST ERR17
MOVEM A,PKCLAS+1(D)
AOBJN D,UMNT1B ;LOOP FOR ALL PACKS
UMNT1C: RELEASE USR, ;GET RID OF SYS
CAML NUM,NUMREQ ;TELL USER IF TOO MANY DRIVE REQUESTED
JRST UMNT1
MOVEI IO,W.TTY ;SELECT OUTPUT ROUTINE
MOVE M,CMDFSN ;FILE STRUCTURE NAME
PUSHJ P,SIXMSG
MOVEI M,TMRM1
PUSHJ P,MSG
MOVE N,NUM ;ACTUAL NUMBER OF DRIVES
PUSHJ P,DECPRT
MOVEI M,TMRM2
PUSHJ P,MSG
;HERE TO CHECK CURRENT STATE OF THE FILE STRUCTURE (MOUNTED OR NOT)
UMNT1: MOVE A,[XWD CHRLEN,CHRBUF]
MOVE B,FSNAME
MOVEM B,CHRBUF
DSKCHR A, ;DSKCHR OF FILE STRUCTURE NAME
JRST FNDPAK ;ERROR RETURN - F.S. UNKNOWN
UMNT0: SKIPLE B,CHRBUF+CHRSAJ ;GET SINGLE ACCESS JOB
TLNE A,D.MC ;IF MC=0 DONT CARE WHAT SINGLE ACCESS JOB WAS
JRST UMNT2 ;NOT SINGLE ACCESS
CAME B,JOBNO ;SEE IF WE HAVE IT
JRST ERR29 ;NO, CANT GET IT
UMNT2: TLNE A,D.LOK ;SKIP IF NOT LOCKED OUT
JRST ERR21 ;CANT HAVE THE FILE STRUCTURE
MOVEI M,IMNTM ;"STRUCTURE ALREADY MOUNTED"
PUSHJ P,MSGTTY ;TELL USER STR IS ALREADY MOUNTED
SKIPGE N,CHRBUF+CHRSMT ;GET MOUNT COUNT & TEST IT
SETZ N, ; .LT.0, SET IT TO 0
PUSHJ P,DECPRT ;TYPE THE CURRENT MOUNT COUNT
MOVEI M,IMNTM1 ;POINT AT REST OF MSG
PUSHJ P,MSGTTY ; & TYPE IT
HRRZS B
TLNE A,D.MC ;SKIP IF MOUNT COUNT NOT = 0
JRST MNTST2 ;=0, ONWARD
TLNE F,L.SIN ;IF MOUNT COUNT GT 0, OBVIOUSLY WE CANNOT
CAMN B,JOBNO ; ALLOW SINGLE ACCESS, BUT OK IF WE HAVE IT
JRST MNTST2 ;ALLOW SINGLE REQUESTS
MOVEI M,NSAM
PUSHJ P,MSGTTY ;TELL USER
TLZ F,L.SIN ;CANCEL SINGLE-ACCESS REQUEST
;CHECK /S CONDITIONS
MNTST2: TLNN F,L.SIN ;REQUESTED SINGLE ACCESS?
JRST MNTST3 ;NO
MOVE A,USRPPN ;IF USER IS
CAMN A,FS1PPN ; 1,2
JRST MNTST3 ; ITS OK
HLLZ A,OWNPPN ;YES-OWNERS PROJ.=-1?
JUMPL A,MNTST3 ;YES-ITS OK
HLLZ B,USRPPN ;NO- =JOB PROJ.?
CAME A,B ;YES-OK
JRST ERR5 ;NO--CANT ALLOW
;HERE WHEN FILE STRUCTURE IS ALREADY MOUNTED - CHECK IF UNITS AS USER REQUESTED
MNTST3: MOVE BP,[POINT 6,B]
MOVE B,FSNAME
ILDB E,BP
JUMPN E,.-1 ;FIND END OF F.S. NAME AND CLEAR E
ADD BP,[XWD 060000,0] ;DECREMENT BYTE POINTER
MOVEM BP,TEMBP
MOVN D,NUM
HRLZS D
CHKUP: PUSHJ P,FILDPT ;COMPUTE SIXBIT LOGICAL UNIT IN STR
MOVE A,[XWD 1,B]
DSKCHR A, ;DSKCHR OF NEXT LOGICAL UNIT
JRST CNTMT ;NOT MOUNTED
PUSHJ P,UNISET ;COMPUTE UNIT NAME IN B FROM DSKCHR RETURN
MOVE N,A ;N=AC RETURN FROM DSKCHR
MOVE A,USRDRV(D) ;A=USER REQUEST
PUSHJ P,GETMSK ;GET MASK IN C
AND C,B ;C=NUMBER OF CHARS IN NAME THAT USER REQUIRED
CAMN C,USRDRV(D) ;SKIP IF ACTUAL UNIT INCOMPATIBLE (MOUNTED ELSEWHERE)
JRST CHKUP1 ;OK
MOVEI IO,W.TTY
MOVE M,PACKID(D) ;GET UNIT ID
PUSHJ P,SIXMSG ;TYPE IT
MOVEI M,ARMM
PUSHJ P,MSG
MOVE M,B ;UNIT IT'S MOUNTED ON
PUSHJ P,SIXMSG ;TYPE THAT
PUSHJ P,CRLF
JRST CHKUP1
CNTMT: MOVEI IO,W.TTY
CNTMT1: MOVE M,PACKID(D)
PUSHJ P,SIXMSG ;TYPE UNIT ID
AOBJP D,CNTMT2 ;JUMP IF NO MORE UNITS FROM STRLST
MOVEI CH,","
PUSHJ P,W.TTY ;AT LEAST ONE MORE, TYPE COMMA
JRST CNTMT1
CNTMT2: MOVEI M,UNMM
PUSHJ P,MSG ;TELL USER THESE UNITS NOT MOUNTED
JUMPE E,PAKUP ;JUMP IF ALL MOUNTED UNITS READY
JRST RDYREQ ;NO, REQUEST OPR TO READY
CHKUP1: TLNN N,D.OFFL ;SKIP IF DRIVE IS OFF-LINE
JRST CHKUP2 ;OK, GO READ HOME BLOCK, CHECK ID
ADDI E,1
MOVEI IO,W.TTY
MOVE M,B ;B=UNIT NOT READY
PUSHJ P,SIXMSG ;TYPE UNIT
MOVEI M,NRM
PUSHJ P,MSG ;TELL USER NOT READY
CHKUP2: AOBJN D,CHKUP ;LOOP FOR ALL UNITS IN STR
JUMPE E,PAKUP ;JUMP IF ALL UNITS READY
RDYREQ: ;HERE TO ASK OPR TO READY DRIVES
MOVE A,STATES ;GET THE STATES WORD
TRNE A,STAOPR ;TEST FOR OPR PRESENT
PUSHJ P,ERR911 ; NO, THEN CAN'T DO IT, UNLESS SHOVE
PUSHJ P,QUEREQ
MOVEI M,OPRDY ;REQUEST OMOUNT TO SET UNITS ON-LINE
PUSHJ P,OPREQ2
;;; FALL THRU TO 'PAKUP' TO CREATE A UFD (IF NECESSARY)
;HERE IF ALL UNITS READY - FIRST READ QUOTA.SYS FOR QUOTAS
PAKUP: ;HERE TO CHECK FOR UFD
MOVE B,FSNAME ;GET DESIRED FS NAME
MOVE A,[XWD 1,B] ;POINT AT F/S NAME
DSKCHR A, ;FIND OUT ABOUT F/S
JRST ERR6A ; ERROR, TELL USER
LDB A,D.ARGT ;GET ARGUMENT TYPE
CAIE A,A.FS ;TEST FOR F/S
JRST ERR6A ; NO, ERROR
MOVE A,USRPPN ;GET QUOTAS FROM QUOTA.SYS
MOVE B,FSNAME
PUSHJ P,GETQUO
JRST CANTM ;NO QUOTAS - NO UFD
JUMPN C,GETUFD ;FALL THROUGH IF LOGGED IN QUOTA = 0
CANTM: ;HERE WHEN UFD CAN'T BE CREATED
SETO D, ;NOTE NO UFD DESIRED
;HERE TO CALL UFDSET TO SET UP UFDS
GETUFD: MOVE A,USRPPN ;USER'S PPN
MOVE N1,MFDPPN ;MFD PPN
MOVE M,FSNAME ;NAME OF STR
MOVEI IO,W.TTY
PUSHJ P,UFDSET
JRST MONRET ;GIVE UP
JRST MNTFIN ;FINISH UP
;HERE TO COMPILE A TABLE OF THE STATUS OF ALL DRIVES IN THE SYSTEM
;DRIVE=DRIVE MNEMONIC
;DRVSTT=0 IF DRIVE NOT AVAILABLE
; NON-0 IF AVAILABLE, WITH RH=RH OF DSKCHR RETURN
FNDPAK: SETZB M,TEMBP
SETZB WD,DROFFL ;AND CLEAR THE FIRST IN CASE NOT SO
MOVEI IO,W.TTY ;SET IO FOR ERROR MESSAGES
FNDPK1: SYSPHY WD, ;RETURNS NEXT PHYSICAL DEVICE IN SYSTEM
JRST ERR10 ;THERE'S A PROBLEM HERE (NO SUCH DEVICE)
JUMPE WD,USRDR ;0 MEANS END OF DEVICES
MOVEM WD,CHRBUF
MOVEM WD,DRIVE(M) ;SAVE DRIVE IN CASE IT IS USEABLE
MOVE A,[XWD CHRNAM+1,CHRBUF]
DSKCHR A, ;FIND OUT WHAT WE HAVE
JRST FNDPK1 ;MUST NOT HAVE BEEN A DISK
LDB CH,D.ARGT ;GET TYPE OF ARGUMENT
CAIE CH,A.PUN ;SKIP IF WE HAVE A PHYSICAL UNIT
JRST FNDPK1 ;NO
LDB CH,D.UST ;IS DRIVE AVAILABLE?
CAIN CH,2
JRST FNDPK5 ;YES
MOVEI CH,2 ;NO--CK FOR 'DORMANT' F/S
TLNN A,D.INFS ;SKIP IF NOT IN FILE STRUCTURE
TLNE A,D.MC ;SKIP IF MOUNT COUNT NOT = 0
DPB CH,D.UST ;ITS DORMANT SO MAKE IT AVAILABLE
FNDPK5: MOVEM A,DRVSTT(M) ;SAVE STATUS OF DRIVE
AOJA M,FNDPK1 ;ALL DONE WITH THIS UNIT
;HERE TO LOOK FOR THE SPECIAL DRIVES THE USER REQUESTED
USRDR: MOVN M,M
HRLZM M,NUMDRV ;STORE NUMBER OF DRIVES IN SYSTEM
SKIPN NUMREQ ;SKIP IF USER ACTUALLY SPECIFIED SOMETHING
JRST ANYDRV ;ELSE FORGET THIS
MOVNI D,(NUM)
HRLZ C,D
USRDR1: MOVE A,USRDRV(C) ;GET NEXT DRIVE USER SPECIFIED
TRNN A,-1 ;SKIP IF SPECIFIC DRIVE
JRST USRDR2 ;NO, IGNORE THIS REQUEST
PUSHJ P,FNDDRV ;FIND THIS DRIVE IN THE DRIVE TABLE
JRST ERR25 ;WOULD YOU BELIEVE, NO SUCH DRIVE
MOVE A,DRVSTT(B)
LDB E,D.KONT ;E=CONTROLLER TYPE
LDB CH,KTPBYT ;CH=CONTROLLER TYPE NEEDED
;(BYTE POINTER IS MODIFIED BY C)
CAIN CH,(E) ;SKIP IF WRONG KONTROLLER TYPE
JRST USRD1B ;OK
MOVEI M,WKTM
PUSHJ P,USPROB
JRST USRDR2
USRD1B: LDB E,D.UNIT ;E=UNIT TYPE
LDB CH,UTPBYT ;GET TYPE OF DRIVE REQUIRED
;(BYTE POINTER IS MODIFIED BY C)
CAIN CH,(E) ;COMPARE WITH THIS DRIVE
JRST USRD1A ;OK
MOVEI M,WUTM ;WRONG UNIT TYPE
PUSHJ P,USPROB
JRST USRDR2
USRD1A: LDB CH,D.UST ;IS IT AVAILABLE?
CAIN CH,2
JRST USRD1C ;UNIT IS AVAILABLE
MOVEI M,DNAM
PUSHJ P,USPROB
JRST USRDR2
USRD1C: TLZ A,B.UST ;MAKE IT UNAVAILABLE NOW
MOVEM A,DRVSTT(B)
USRDR2: AOBJN C,USRDR1
;HERE TO LOOK FOR DRIVES ON SPECIFIC CONTROLLERS THE USER REQUESTED
HRLZ C,D ;RESET NUMBER OF DRIVES REQUESTED
USRCON: SKIPN A,USRDRV(C) ;SKIP IF SOMETHING TO LOOK AT
JRST USRCN5
TRNE A,-1 ;SKIP IF CONTROLLER ONLY REQUEST
JRST USRCN5 ;SPECIFIC DRIVE - WE'VE ALREADY SEEN IT
MOVE B,[XWD 1,A] ;IS THIS A REAL CONTROLER?
DSKCHR B,
JRST USRC1C ;NO
LDB N,UTPBYT ;YES-GET TYPE OF UNIT WE NEED
PUSHJ P,FNDCON ;LOOK FOR DRIVE ON THIS CONTROLLER
JRST .+2 ;NONE AT ALL?
JRST USRC1A ;OK
MOVEI M,KDNAM
PUSHJ P,USPROB
JRST USRCN5
USRC1A: LDB N1,D.KONT ;KONTROLLER TYPE
LDB N,KTPBYT ;TYPE NEEDED
CAMN N,N1 ;SKIP IF WRONG KONTROLLER TYPE
JRST USRC1B ;OK
MOVEI M,WKTM
PUSHJ P,USPROB
JRST USRCN5
USRC1C: MOVEI M,IKON ;TELL USER 'NO SUCH CONT.
PUSHJ P,USPROB
JRST USRCN5
USRC1B: TLZ A,B.UST
MOVEM A,DRVSTT(B) ;SET THIS DRIVE UNAVAILABLE
USRCN5: AOBJN C,USRCON ;LOOP FOR ALL USER REQUESTS
;HERE TO FIND DRIVES FOR THE REST OF THE PACKS
ANYDRV: HRLZ C,D ;RESET NUMBER OF DRIVES REQUESTED
ANYDR1: SKIPE M,USRDRV(C) ;SKIP IF WE STILL NEED A DRIVE HERE
JRST ANYDR5 ;NO, ALREADY TAKEN CARE OF
LDB N1,KTPBYT ;N1=KONTROLLER TYPE NEEDED
LDB N,UTPBYT ;GET TYPE OF UNIT NEEDED
MOVE B,NUMDRV
ANYDR2: MOVE A,DRVSTT(B) ;SKIP IF DRIVE AVAILABLE
LDB CH,D.UST
CAIE CH,2
JRST ANYDR3 ;NO
LDB E,D.KONT ;E=KONTROLLER TYPE
CAME N1,E ;SKIP IF OK
JRST ANYDR3
LDB E,D.UNIT ;E=UNIT TYPE
CAMN N,E ;SKIP IF NO GOOD
JRST ANYDR4 ;OK, GOT ONE
ANYDR3: AOBJN B,ANYDR2 ;LOOP FOR THE DRIVES
JRST ERR14 ;COULDN'T MAKE IT
ANYDR4: TLZ A,B.UST
MOVEM DRVSTT(B) ;SET THIS DRIVE UNAVAILABLE
ANYDR5: AOBJN C,ANYDR1
JRST OPREQ0
ERR14: MOVEI M,NEDAM
PUSHJ P,MSGTTY ;TELL USER NOT ENOUGH DRIVES AVAIL
OPREQ0: ;HERE TO ASK OPR TO MOUNT F/S
MOVE A,STATES ;GET THE STATES WORD
TRNE A,STAOPR ;TEST FOR OPR PRESENT
PUSHJ P,ERR911 ;NO, THEN CAN'T DO IT, UNLESS SHOVE
PUSHJ P,QUEREQ
MOVEI M,OPMNT
PUSHJ P,OPREQ2
JRST PAKUP ;GO CREATE A UFD IF NECESSARY
;HERE TO REQUEST OPER TO MOUNT THE FILE STRUCTURE
QUEREQ: SETZM TAPEID
SETZM FILBLK
HRLI NUM,(SIXBIT .M.)
PUSHJ P,COMBEG ;SET UP THE COMMAND FILE
TEXT < MOUNT >
PUSHJ P,MSG
SKIPN M,PHYNAM
MOVE M,CMDFSN
PUSHJ P,SIXMSG
SKIPN LOGNAM
JRST OPRQ1A
PUSHJ P,SPACE
MOVE M,LOGNAM
PUSHJ P,SIXMSG
OPRQ1A: PUSHJ P,RIDOUT ;OUTPUT /REELID IF ANY
PUSHJ P,VIDOUT ;OUTPUT /VID IF ANY
TEXT < /S>
TLNE F,L.SIN
PUSHJ P,MSG
TEXT < /WL>
TLNE F,L.WRTL
PUSHJ P,MSG
TEXT < /WE>
TLNE F,L.WEN
PUSHJ P,MSG
MOVEI M,[ASCIZ . /PAS.] ;ASSUME /PASSIVE NEEDED
TRNE F,R.PAS ;TEST FOR /PASSIVE
PUSHJ P,MSG ; YES, OUTPUT THE SWITCH
MOVEI M,[ASCIZ . /NOC.] ;ASSUME /NOCREATE NEEDED
TRNE F,R.NOC ;TEST FOR /NOCREATE
PUSHJ P,MSG ; YES, OUTPUT THE SWITCH
SKIPN UDREQ ;SKIP IF USER REQUESTED SPECIFIIC UNITS
JRST OPRQ1C
PUSHJ P,LPAR
MOVN N,NUMREQ
HRLZS N
SKIPA
OPRQ1D: PUSHJ P,COMMA
MOVE M,USRDRV(N)
PUSHJ P,SIXMSG
AOBJN N,OPRQ1D
PUSHJ P,RPAR
OPRQ1C: PJRST CRLF
MNTFIN: MOVE A,HLISTI ;BUILD IOWD LST IN LOW SEG.
MOVEM A,HLIST
SETZM HLIST+1
MOVE A,[PHOPEN!17] ;SET PHYS-ONLY & MODE
SETZ C,
MOVE B,FSNAME
OPEN USR,A ;SEE HOW IT ALL CAME OUT
JRST ERR6A
MOVEI IO,W.TTY
MOVE A,[SIXBIT .HOME.]
MOVSI B,(SIXBIT .SYS.)
SETZB C,LASTUN ;CLEAR LAST UNIT TYPED
MOVE D,SYSPPN
LOOKUP USR,A ;LOOKUP HOME.SYS[SYS] TO READ HOME BLOCKS
JRST NOHOME ; ERROR, GO PRINT A MSG
NXUNTY: INPUT USR,HLIST ;READ NEXT BLOCK
STATZ USR,20000 ;SKIP UNLESS EOF
JRST NOFNTY
MOVS A,B.USR ;FIRS WORD
CAIE A,(SIXBIT .HOM.);MUST BE .HOM. OR IS NOT A HOME BLOCK
JRST NXUNTY
MOVE M,B.USR+HOMLOG ;GET SIXBIT LOGICAL UNIT IN STR
CAMN M,LASTUN ;NO SKIP IF ALREADY TYPED
JRST NXUNTY ;UNITS HAVE TWO HOME BLOCKS
MOVEI A,M
DSKCHR A, ;GET PHYSICAL UNIT
JRST NXUNTY ;DOESN'T EXIST?
MOVEM M,LASTUN ;SAVE UNIT WE ARE ABOUT TO TYPE
SKIPN NUMREQ ;TEST FOR USER-SPECIFIED UNITS
JRST NXUNTY ; NO, THEN DON'T TYPE THE PACK ID'S
MOVE M,B.USR+HOMHID ;GET UNIT ID
PUSHJ P,SIXMSG ;TYPE IT
MOVEI M,[ASCIZ . on .]
PUSHJ P,MSG
PUSHJ P,UNISET ;SET UP UNIT MNEMONIC IN B
MOVE M,B
PUSHJ P,SIXMSG
PUSHJ P,CRLF
JRST NXUNTY
NOHOME: MOVEI M,[ASCIZ /% LOOKUP for Home Blocks failed/] ;POINT AT MSG
PUSHJ P,MSGTTY ;TYPE THE WARNING MSG
; & FALL THRU TO CONTINUE ON
NOFNTY: PUSHJ P,CRLF ;TYPE CR,LF
MOVE M,CMDFSN
PUSHJ P,SIXMSG ;AND FILE STRUCTURE NAME
MOVEI M,MNTD
PUSHJ P,MSG ;MOUNTED
IFN FTFACT,<
IFE FTFCT1,<
SKIPE IDIDIT ;IF OMOUNT USED, DON'T DO ACCOUNTING HERE TOO.
JRST NOFNT1
>; END IFE FTFCT1
HRLI NUM,'UM ' ;SHOW USER MOUNT RQST
MOVE A,FSNAME ;GET F.S NAME
PUSHJ P,WRFACT ;CALL TO WRITE FACT RECORD
NOFNT1:
>; END OF IFN FTFACT
;NOW CHECK FOR USERS UFD
MOVE A,[PHOPEN!14] ;OPEN USR ON F.S.
MOVE B,FSNAME
MOVEI C,RH.USR
OPEN USR,A
JRST NOFNT2 ;CANT OPEN
MOVEI A,B.USR ;DECLAIR 1 BUFFER
MOVEM A,.JBFF
INBUF USR,1
MOVE A,USRPPN ;LOOKUP UFD
MOVSI B,(SIXBIT/UFD/)
SETZM C
MOVE D,MFDPPN
LOOKUP USR,A ;IS IT THERE AND ACCESSIBLE?
SKIPA ;NO
JRST ALLOVR ;YES-THATS ALL
NOFNT2: MOVEI M,[ASCIZ/No UFD created
/] ;TELL USER NO UFD
JRST ALLFIN
OPREQ2: PUSHJ P,MSGTTY ;TELL USER ALL ABOUT IT
TMWAIT: MOVE A,NAMMNT
PUSHJ P,WAKE0
PUSHJ P,MSG113 ;TELL USER NO OPERATOR JOB
TLNN F,L.PWA ;SKIP IF USER REQUESTED PAUSE BEFORE WAITING
JRST DOWAIT ;NO, CLOSE OUT COMMAND AND WAIT
MOVEI M,PBWM
PUSHJ P,MSGTTY
TTCALL CLRINB, ;CLEAR INPUT BUFFER
PUSHJ P,GETARG
DOWAIT: CLOSE CMD, ;CLOSE THE COMMAND FILE
MOVE A,NAMMNT ;GET NAME FOR MOUNT COMMANDS
PUSHJ P,WAKE1 ;CALL TO WAKE ALL OMOUNTS
JFCL ; (IGNORE ERRORS)
REPEAT 0,<
MOVEI A,^D1000 ;GET 1000 MSEC (1 SEC)
HRLI A,HIBNOJ!HIBTTL ;COMBINE WITH HIBER FLAG BITS
IFN DBUGSW, <
TLZ A,HIBNOJ ;CLEAR BIT IF DEBUGGING
>; END OF IFN DBUGSW
MOVEI B,1 ;GET ONE SECOND
HIBER A, ;HIBERNATE FOR ONE SECOND MAXIMUM
SLEEP B, ; FAILED, SLEEP FOR ONE SECOND
DOWAT1: PUSHJ P,MSG111 ;TELL USER WE ARE WAITING
CLOSE CMD,
> ;END OF REPEAT 0
TRNE F,R.NOWA ; DID USER SAY /NOWAIT
JRST TERMIN ; YES...EXIT
PUSHJ P,MSG111 ;TELL USER WE ARE WAITNG
MNTWAT: MOVE A,NAMMNT ;WAKE AN OMOUNT
PUSHJ P,WAKE1
JFCL
MOVEI A,MOUSLP ;AND HIBERNATE TILL WAKE OR ^C
PUSHJ P,WAIT0
MOVE A,CMDNAM ;NOW SEE IF OUR COMMAND STILL EXISTS
MOVSI B,(SIXBIT .CMD.)
MOVEI C,0
MOVE D,CMDPPN
LOOKUP CMD,A ;LOOK FOR THE FILE
POPJ P, ;DONE! TELL USER
JRST MNTWAT ;STILL WAITING FOR SERVICE
SUBTTL SUBROUTINES
;SUBROUT TO WAKE APPROPRIATE OMOUNTS
;ENTER WAKE0 DONT WAKE, JUST CHK. FOR OMOUNTS
; WAKE1 WAKE ALL APPROPRIATE OMOUNTS
;CALL: A=OMOUNT JOB NAME OTHER THAN SYSOMO
;RET+1 IF NO APPROPRIATE OMOUNTS
;RET+2 IF WAS SOME OMOUNTS
WAKE0: TDZA B,B ;LH=0 FOR 'DONT WAKE'
WAKE1: MOVSI B,-1 ;LH=-1 FOR 'WAKE'
IFN DBUGSW, <
TRON B,-1 ;ASSUME WE FOUND AN OMOUNT
AOS (P) ;SO SET SKIP RETURN
>; END OF IFN DBUGSW
MOVEI C,1 ;COUNT JOB NUMS IN C
WAKE2: MOVEI D,JBTPRG ;GET THIS JOB NAME
HRL D,C
GETTAB D,
POPJ P,
CAMN D,NAMOMO ;IS IT SYSOMO
JRST WAKE3
CAME D,A ; OR SPECIFIC NAME?
AOJA C,WAKE2 ;NO-CK NEXT JOB
WAKE3:
IFE DBUGSW,< ;IF DEBUGGING DONT REQUIRE [1,2] OMOUNT
MOVEI D,PRJPRG ;YES-PPN 1,2?
HRL D,C
GETTAB D,
POPJ P,
CAME D,FS1PPN
AOJA C,WAKE2 ;NO-FORGET IT
> ;IFE DBUGSW
HRLZ D,C ;GET JBTSTS
GETTAB D,
POPJ P,
JUMPGE D,WAKE4 ;JUMP IF NOT RUNNING
TRON B,-1 ;IS THIS 1ST ONE WEVE SEEN?
AOS (P) ;YES-REMEMBER TO SKIP RETURN
JUMPGE B,WAKE4 ;DONT WAKE IF ENTERED WAKE0
WAKE C, ;YES-WAKE IT UP
POPJ P,
WAKE4: AOJA C,WAKE2
;SUBROT TO WAIT FOR ^C OR WAKEUP FROM OMOUNT
;CALL: A=NUM OF SECONDS TO SLEEP
; EXITS IF ^C TYPED
WAIT0:
WAIT1: MOVEI B,^D60000
HRLI B,HIBNOJ!HIBSWP
IFN DBUGSW, <
TLZ B,HIBNOJ ;ANYBODY WAKES IF DEBUGGING
>; END OF IFN DBUGSW
HIBER B,
SLEEP A, ;INCASE OLD MONITOR
POPJ P,
;SUBROUTINE TO COMPUTE SIXBIT LOGICAL UNIT IN STR
;ARGS TEMBP=BYTE POINTER SET FOR IDPB
; D(RH)=BINARY LOG. UNIT NUM IN STR
;VALUES B=SIXBIT LUN
FILDPT: MOVE B,FSNAME ;START WITH NAME OF STR
MOVE BP,TEMBP ;BYTE POINTER
MOVEI N,(D) ;N=LOGICAL UNIT NUM
IDIVI N,^D10
JUMPE N,FILDP1 ;JUMP IF ONLY 1 DIGIT
ADDI N,(SIXBIT . 0.) ;MAKE SIXBIT
IDPB N,BP ;STORE IN NAME
FILDP1: ADDI N1,(SIXBIT . 0.) ;MAKE NEXT DIGIT SIXBIT
TLNE BP,770000 ;SKIP IF NAME FULL
IDPB N1,BP ;STORE IN NAME
POPJ P,
;INTERCEPT ROUTINES(SUPERSEDE CCTYPE HACK)
;
CONCOM: MOVEI A,1B34 ;GET ^C BIT
IORM A,INTBLK+1
POPJ P,
CONCOF: MOVEI A,1B34 ;GET ^C BIT
ANDCAM A,INTBLK+1 ;AND DISABLE THE INTERCEPT
POPJ P,
INTLOC: PUSH P,A
HLRZ A,INTBLK+3 ;GET TYPE OF INTERCEPT
CAIE A,1B34 ;^C?
JRST INTLC1 ;NO
JRST TERMIN ;YES, EXIT
INTLC1: MOVE A,INTBLK+2 ;GET PC WORD
EXCH A,(P) ;EXCHANGE WITH PUSH'D A
SETZM INTBLK+2
POPJ P, ;AND RETURN TO INTERRUPTED CODE
;SUBROUTINE TO DETERMINE IF ^C WAS TYPED
;IF YES, EXIT, ELSE RETURN
REPEAT 0,<
CCTYPE: TTCALL SKPINL, ;SKIP IF ANYTHING WAS TYPED
POPJ P, ;NO, JUST RETURN
PUSHJ P,GETARG ;SEE WHAT IT WAS
CCTYP1: CAIE CH,CNTRLC ;SKIP IF ^C
CAIN CH,ALTMO ;OLD SCNSRF TURNS ^C TO ALTMODE
JRST .+2 ;EITHER ONE WILL DO FOR AN EXIT
POPJ P,
CLOSE CMD,40 ;ABORT COMMAND FILE IF NOT CLOSED YET
JRST TERMIN ;GO EXIT
> ;END OF REPEAT 0
;SUBROUTINE TO COMPUTE UNI NAME IN B FROM DSKCHR RETURN IN A
;ARGS A=AC RETURN FROM DSKCHR
;VALUES B=SIXBIT UNIT MNEMONIC
UNISET: LDB C,D.KONT ;GET CONTROLLER TYPE
MOVE B,KONSIX(C) ;SIXBIT MNEMONIC
LDB C,D.KONN ;GET CONTROLLER NUMBER
ADDI C,(SIXBIT . A.) ;CONVERT TO LETTER A,B,C ETC
TLO B,(C) ;STORE LETTER IN NAME
LDB C,D.UNIN ;GET UNIT NUMBER
ADDI C,(SIXBIT . 0.) ;CONVERT TO SIXBIT
DPB C,[POINT 6,B,23]
POPJ P,
;THIS ROUTINE SEARCHES THE DRIVE TABLE FOR A SPECIFIC DRIVE
;ENTER A=SPECIFIC DRIVE (LEFT JUSTIFIED SIXBIT)
;NON-SKIP RETURN IF NOT FOUND
;SKIP RETURN IF FOUND, B=INDEX INTO TABLE
FNDDRV: MOVE B,NUMDRV
FNDRV1: CAMN A,DRIVE(B) ;LOOK FOR A MATCH
JRST CPOPJ1 ;SKIP RETURN IF WE FOUND IT
AOBJN B,FNDRV1 ;LOOP FOR ALL DRIVES
POPJ P, ;NON-SKIP RETURN IF NOT THERE
;THIS ROUTINE SEARCHES THE DRIVE TABLE FOR AN AVAILABLE DRIVE ON A SPECIFIC CONTROLLER.
;ARGS A=CONTROLLER (LEFT JUSTIFIED SIXBIT)
; N=UNIT TYPE NEEDED
;ENTER AT FNDCON TO START AT THE BEGINNING OF THE TABLE
;ENTER AT FNDCN1 TO CONTINUE WHERE WE LEFT OFF LAST
;NON-SKIP RETURN IF NOT FOUND
;SKIP RETURN IF FOUND, B=INDEX INTO TABLE
FNDCON: MOVE B,NUMDRV ;START AT BEGINNING OF TABLE
SKIPA E,A ;SAVE CONTROLLER NEEDED IN E
FNDCN1: AOBJP B,CPOPJ ;TRY NEXT IN TABLE, EXIT IF LAST
HLLZ A,DRIVE(B) ;GET CONTROLLER PART OF NEXT DRIVE
CAMN A,E ;COMPARE WITH WHAT WE WANT
MOVE A,DRVSTT(B) ;OK, IS IT AVAILABLE?
LDB N1,D.UST
CAIE N1,2
JRST FNDCN1 ;NO--NO GOOD TO US, TRY NEXT
LDB N1,D.UNIT ;YES-N1=UNIT TYPE
CAIE N,(N1) ;SKIP IF RIGHT TYPE OF UNIT
JRST FNDCN1 ;ALAS
JRST CPOPJ1 ;EVERYTHING OK, SKIP RETURN
;SUBROUTINE TO SKIP WORDS ON FILE OPEN ON CHANNEL USR
; ARGS B=NUMBER OF WORDS TO SKIP
SKPSTR: PUSHJ P,R.USR ;GET NEXT WORD FROM STRLST
JRST ERR17
SOJG B,SKPSTR ;B CONTAINS THE NUMBER OF WORDS TO SKIP
POPJ P, ;RETURN
;THIS ROUTINE OUTPUTS A LIST OF SIXBIT ITEMS POINTED TO BY N.
;ENTER N=XWD -NUMBER OF WORDS, FIRST WORD ADDRESS OF THE TABLE
SNDLST: MOVE M,(N)
PUSHJ P,SIXMSG ;OUTPUT THE NEXT ITEM
AOBJP N,CRLF ;IF ALL DONE, OUTPUT CR,LF
PUSHJ P,COMMA ;ELSE PUT COMMAS BETWEEN
JRST SNDLST
SUBTTL MOUNT COMMAND - FILE STRUCTURE ERROR MESSAGES
ERR1: ERRMES <?Can't find STRLST.SYS>
ERR2A: STATO USR,20000 ;SKIP IF EOF
JRST ERR17 ;NO, READ ERROR
ERR2: ERRMES <?Unknown device or structure name>
ERR17: ERRMES <?Can't read STRLST.SYS>
ERR4: ERRMES <?Uncertified packs may not be shared>
ERR5: ERRMES <?Must be in owner's project to request single access>
ERR6: MOVE IO,FSNAME
MOVEM IO,UFDFSN
MOVEI IO,W.TTY
PUSHJ P,DISSTR
ERRMES <?Structure not mounted>
ERR10: ERRMES <?System error - SYSPHY UUO failed>
ERR21: ERRMES <?File structure locked out by Operator>
ERR25: MOVEI CH,"?"
MOVEI IO,W.TTY ;SET UP IO FOR SIXMSG
PUSHJ P,W.TTY
MOVE M,A
PUSHJ P,SIXMSG ;M=DRIVE WHICH ISN'T A DRIVE
ERRMES < Illegal unit>
ERR26: ERRMES <?No SYS>
ERR27: ERRMES <?System error - Wrong format version number in STRLST.SYS>
ERR29: MOVEI M,SABJM
PUSHJ P,MSGTTY
MOVE N,B
PUSHJ P,DECPRT
PUSHJ P,CRLF
ERR6A: ERRMES <?Mount unsuccessful>
ERRMSB: PUSHJ P,MSGTTY
PUSHJ P,CRLF
JRST TERMIN ;GO EXIT
> ;END CONDITIONAL ON MNTSW
IFE MNTSW,<LIST>
SUBTTL COMMAND-SCANNING & MISC. I/O ROUTINES
;SUBROUTINE TO SEARCH A TABLE FOR A COMMAND THAT WAS TYPED AND DISPATCH APPROPRIATELY
;ARGS E=AOBJN POINTER TO LEGAL COMMANDS
; 2ND LOCATION BEFORE TABLE IS'NON-UNIQUE SWITCH' ERROR ADDRESS
; 1ST LOCATION BEFORE TABLE IS 'NON-EXISTANT SWITCH' ERROR ADRESS
UDSWIT:
; TLNE F,L.BRK ;SKIP UNLESS BREAK CHAR DETECTED
; JRST COMERR
PUSHJ P,GETARG ;GET SWITCH
HLLZS A ;KEEP ONLY FIRST THREE CHARS
JUMPE A,@-1(E) ;ERROR RET. IF NO NAME
SETO C, ;FIRST TRY FOR EXACT MATCH
MOVE D,E ;SAVE PTR IN D
PUSHJ P,SWPROC ;TRY TO FIND SWITCHES
JRST .+2
JRST (B) ;MADE IT, DISPATCH
PUSHJ P,GETMSK ;CREATE MASK IN C FOR CHARS TYPED
TRO C,-1 ;SET RH TO KEEP DISPATCH ADDR IN XOR
MOVE E,D ;RESET PTR TO TABLE OF SWITCHES
PUSHJ P,SWPROC ;TRY AGAIN
JRST @-1(D) ;NO SUCH SWITCH
AOBJP E,(B) ;FOUND ONE, DISPATCH IF LAST IN LIST
HRR A,B ;SAVE DISPATCH ADDR
PUSHJ P,SWPROC ;LOOK FOR DOUBLE MATCH (NOT UNIQUE)
JRST (A) ;NONE, OK, SO DISPATCH
JRST @-2(D)
;SUBROUTINE TO SEARCH TABLE FOR MASKED MATCH
;ARGS A=CHARS TYPED (LEFT HALF ONLY)
; C=MASK
; E=AOBJN POINTER TO TABLE OF LEGAL COMMANDS
SWPROC: HLLZ B,A ;B=CHARS TYPED
XOR B,(E) ;COMPARE WITH NEXT SWITCH IN LIST
AND B,C ;KEEP ONLY NUM CHARS TYPED
TLNN B,-1 ;ZERO IF MATCH
JRST CPOPJ1 ;OUR WORK IS OVER, RH B=DISPATCH ADDR
AOBJN E,SWPROC ;LOOP FOR ALL SWITCHES IN LIST LOOKING FOR MAT
POPJ P, ;SADLY NONE
;SUBROUTINE TO CREATE A MASK IN C FOR ACTUAL CHARACTERS IN A
;ARGS A=SIXBIT CHARACTERS
;VALUES C=MASK OF ALL ONES IN NON-ZERO CHARACTER POSITIONS
GETMSK: SETZ C, ;ASSUME NO CHARS
JUMPE A,CPOPJ ;JUMP IF ASSUMPTION PROVES VALIDATED
TLO C,770000 ;NO, MUST BE AT LEAST ONE CHAR
PUSH P,A ;SAVE A
GETMS1: LSH A,6 ;SHIFT OFF CHARACTER WE KNOW ABOUT
JUMPE A,APOPJ ;EXIT IF NO MORE
ASH C,-6 ;AT LEAST ONE MORE, EXTEND MASK ONE CHAR
JRST GETMS1 ;AND LOOP
APOPJ: POP P,A ;RESTORE A
POPJ P,
;SUBROUTINE TO SET UP AND WRITE FIRST LINE OF A QUEUE REQUEST
;ARGS NUM=SIXBIT CHAR IDENTIFYING TYPE OF MESSAGE
COMBEG:
IFN FTFACT,<
SETOM IDIDIT ;SET FLAG THAT OMOUNT USED FOR FACT
>; END IFN FTFACT
MOVSI A,(PHOPEN) ;HERE TO WRITE CMD FILE
MOVE B,CMDSTR ;STR FOR COMMANDS
HRLZI C,WH.CMD
OPEN CMD,A
JSP N,CMDERR
FILCL1: HLLZ WD,NUM ;NUM CONTAINS THE TYPE OF MESSAGE
TIMER CH, ;CHAR 2&3 ARE 12 LOW ORD OF TIMER
ANDI CH,7777 ;ONLY LOW 12 WANTED
TLO WD,(CH) ;PUT IN LH OF NAME
IOR WD,IORPPN ;RH OF NAME IS IOR'D PPN
CAMN WD,CMDNAM ;NEW NAME SAME AS LAST TRY?
JRST FILCL1 ;YES - TRY AGAIN FOR A DIFFERENT ONE
MOVEM WD,CMDNAM ;SAVE THIS NAME
MOVE A,CMDNAM
MOVSI B,(SIXBIT /CMD/) ;EXTENSION
MOVEI C,0
MOVE D,CMDPPN ;COMMAND AREA
LOOKUP CMD,A ;DOES THIS FILE ALREADY EXIST?
TRNE B,-1 ;MAYBE
JRST FILCL1 ;YES
MOVSI B,(SIXBIT /CMD/) ;NO
IFN DBUGSW, <
SETZ C, ;SET CMD-FILE PROTECTION
>; END OF IFN DBUGSW
IFE DBUGSW, <
MOVSI C,(<077B8>) ;SET CMD-FILE PROTECTION
MOVE D,CMDPPN
>; END OF IFE DBUGSW
ENTER CMD,A ;IF THIS WORKS
JRST FILENF ;PITY
MOVEI IO,B.CMD ;WE CAN USE IT
MOVEM IO,.JBFF
OUTBUF CMD,1
FILOUT: MOVEI IO,W.CMD
MOVE CH,CMDCHR
PUSHJ P,0(IO) ;WRITE COMMAND CLASS
MOVEI M,[ASCIZ / Job/]
PUSHJ P,MSG ;JOB
MOVE N,JOBNO
PUSHJ P,DECPRT ;JOB NUMBER
PUSHJ P,SPACE ;SPACE
SKIPN M,TTYLIN ;TTYN IF KNOWN
MOVE M,[SIXBIT /TTYXXX/]
PUSHJ P,SIXMSG
PUSHJ P,SPACE ;SPACE
HLRZ N,USRPPN
PUSHJ P,OCTPRT ;USER'S PPN
PUSHJ P,COMMA
HRRZ N,USRPPN
PUSHJ P,OCTPRT
PUSHJ P,SPACE ;SPACE
SKIPN M,TAPEID ;AND THE TAPE NUMBER
MOVSI M,(SIXBIT /1/)
PUSHJ P,SIXMSG
SKIPN FILBLK ;NOW ANY FILES MENTIONED
POPJ P, ;NONE
FILOU1: MOVEI D,0
PUSHJ P,SPACE
FILOUL: SKIPN FILBLK(D)
POPJ P,
SKIPE D ;NO COMMA FIRST TIME
PUSHJ P,COMMA
SKIPN M,FILDEV(D)
MOVSI M,(SIXBIT .DSK.)
SETZM FILSTR ;CLEAR STR NAME (SHOWS NOT READING S/L)
CAME M,[SIXBIT /DSK/];TEST FOR 'DSK'
JRST FILST1 ; NO, JUMP
JUMPE D,FILST1 ;ALSO JUMP IF 1ST FILE (DIRECTORY)
MOVE A,FILPPN(D) ;GET PPN FROM THE FILE
CAME A,USRPPN ;TEST FOR SAME AS [SELF]
JUMPN A,FILST1 ; NO, JUMP IF NON-ZERO (NOT DEFAULTED TO [SELF])
MOVE A,CMDCHR ;GET FILE-RQST TYPE LETTER
CAIE A,"F" ;TEST FOR 'FILE F'
CAIN A,"Z" ;TEST FOR 'FILE Z'
SKIPA A,[FILSTR] ; EITHER, POINT AT PARM LIST & SKIP
JRST FILST1 ; NEITHER, JUMP TO IGNORE S/L
SETOM FILSTR ;SET STR NAME -1 FOR 1ST F/S
JOBSTR A, ;GET 1ST STR NAME IN S/L
SETZM FILSTR ; FAILED, SET TO ZERO
SKIPE A,FILSTR ;GET STR NAME & TEST FOR ZERO
AOSN FILSTR ;TEST FOR -1 (NULL S/L) RETURNED
JRST FILST1 ; YES, JUMP TO IGNORE S/L (0 OR -1 RET'D)
MOVE M,A ;COPY STR NAME TO START WITH IT
MOVEM M,FILSTR ; & RESTORE STR NAME FOR NEXT TIME
FILST1: ;HERE TO OUTPUT A FILE-SPEC
MOVE A,CMDCHR ;GET TYPE OF FILE COMMAND
CAIN A,"D" ;TEST FOR 'FILE D'
JUMPN D,FILNDV ; YES, DON'T OUTPUT DEVICE UNLESS DIR FILE
PUSHJ P,SIXMSG
PUSHJ P,COLON ;OUTPUT A COLON
FILNDV: ;HERE NOT TO OUTPUT DEVICE NAME
MOVE M,FILBLK(D)
PUSHJ P,SIXMSG ;FILE NAME(EVEN IF *, PASSED ON TO OPFILE)
SKIPE M,FILBEX(D)
PUSHJ P,DOT ;PERIOD IF EXT COMMING
SKIPE M,FILBEX(D)
PUSHJ P,SIXMSG ;EXT IF SPECIFIED
SKIPN N,FILPPN(D) ;TEST FOR PPN SPECIFIED
JRST FILOU2 ; NO, JUMP
CAMN N,USRPPN ;TEST FOR PPN [SELF]
JRST FILOU2 ; YES, DON'T OUTPUT IT
PUSHJ P,LBRKET ;OUTPUT A "["
HLRZ N,FILPPN(D) ;GET THE PROJ #
PUSHJ P,OCTPRT ; & OUTPUT IT
PUSHJ P,COMMA ;OUTPUT A COMMA
HRRZ N,FILPPN(D) ;GET THE PROG #
PUSHJ P,OCTPRT ; & OUTPUT IT
PUSHJ P,RBRKET ;OUTPUT A "]"
FILOU2: ;HERE IF NO PPN
SKIPN FILSTR ;TEST FOR SCANNING S/L
JRST FILST2 ; NO, JUMP
MOVEI A,FILSTR ;POINT AT PARM LIST
JOBSTR A, ;GET NEXT STR FROM S/L
JSP N,NEVERR ; FAILED, A FATAL ERROR
SKIPE M,FILSTR ;GET STR NAME & TEST FOR ZERO
CAMN M,[-1] ;TEST FOR -1 RET'D
JRST FILST2 ; EITHER, DONE WITH THIS FILE SPEC
PUSHJ P,COMMA ;OUTPUT A COMMA
MOVE M,FILSTR ;GET RETURNED STR NAME
JRST FILST1 ; & CONTINUE FOR NEXT STR
FILST2: ;HERE WHEN DONE WITH THIS FILE SPEC
AOJA D,FILOUL
IFN FTFACT, <
;
; SUBROUTINE TO WRITE FACT RECORDS
;
; CALL: HRLI NUM,'XX ' ;PUT QUEUE CODE IN AC
; ;XX=UM FOR MOUNT, UD FOR DISMOUNT
; MOVE A,[DEVICE NAME] ;PUT DEVICE FOR F/S NAME IN AC
; PUSHJ P,WRFACT ;CALL TO WRITE ACCT'G RECORD
; <RETURN>
;
WRFACT: PUSH P,A ;SAVE DEVICE NAME
MOVEI A,3 ;GET DAEMON .FACT CODE
MOVEM A,FACT ;STORE AS PREFIX WORD
MOVE A,[XWD 271000,F.SIZE-1] ;GET HEADER WORD-WITH CODE 271
TSO A,JOBNO ;PUT JOB # IN L.H.
MOVEM A,F.HEAD ;STORE AS HEADER
SETO A, ;SET -1 FOR [SELF]
GETLCH A ;GET MY LINE CHARACTERISTICS
TLNE A,(1B1) ;TEST FOR CTY
MOVNI A,1 ; YES, SET -1
GETLIN B, ;GET MY LINE #
TLNN B,-1 ;TEST FOR DETACHED
MOVNI A,2 ; YES, SET TO -2
DPB A,[POINT 12,F.HEAD,29] ;STORE INTO HEADER
SETZM F.DATE ;CLEAR DATE/TIME FOR DAEMON
MOVE A,[XWD F.DATE,F.DATE+1] ;GET BLT CONTROL WORD
BLT A,FACT+F.SIZE ;CLEAR REST OF FACT RECORD
MOVE A,[SERIAL] ;GET GETTAB PARMS FOR CPU SERIAL #
GETTAB A, ;GET CPU SERIAL #
SETZ A, ; FAILED, ASSUME ZERO
HRRZM A,F.QUE ;STORE INTO RECORD
HRROI A,.GTLOC ;GET GETTAB PARMS FOR MY STATION #
GETTAB A, ;GET MY STATION #
SETZ A, ; FAILED, ASSUME ZERO
TLO NUM,(A) ;TURN ON STATION # IN NUM ('QQN' IN L.H.)
HLLM NUM,F.QUE ;STORE INTO L.H. OF WORD
POP P,F.DEV ;STORE DEVICE INTO RECORD
MOVSI A,1 ;SET SUCCESS FLAG IN F.UNIT (LH)
MOVEM A,F.UNIT ;THUS, F.UNIT=1,,0
MOVE A,[F.SIZE,,FACT];POINT AT RECORD
DAEMON A, ;CALL DAEMON TO WRITE THE RECORD
JFCL ; FAILED, IGNORE IT
POPJ P, ;RETURN TO CALLER
>; END OF IFN FTFACT
FILENF: HRRZS B
CAIN B,NRMERR
JRST NOROOM
CAIN B,NUFERR
JRST NOCMU1
CAIN B,FBMERR
JRST FILCL1
FILLOS: JRST ERR120 ;GO TELL ABOUT ERROR
NOROOM: MOVEI M,NORMMS
JRST ERREXI
HPACK: SETZ N, ;SUBR TO GET A WORD AND PACK OCTAL
HPACKL: PUSHJ P,0(IO) ;READ A CHAR
CAIE CH," " ;BLANK OR COMMA
CAIN CH,"," ;TERMINATES FIELD
POPJ P,0 ;EXIT IF TERMINATED
ANDI CH,7 ;SAVE ONLY OCTAL PART
LSH N,3 ;MAKE ROOM FOR A NEW DIGIT
IOR N,CH ;PACK DIGIT INTO WORD
JRST HPACKL ;BACK FOR NEXT DIGIT
;SUBROUTINE TO TYPE A USER'S REQUEST AND A MESSAGE FOLLOWING
;ARGS M=ADDRESS OF ASCIZ MESSAGE
USPROB: PUSH P,M
MOVE M,USRDRV(C)
PUSHJ P,SIXMSG
POP P,M
PUSHJ P,MSG
PJRST CRLF
;THIS ROUTINE OUTPUTS ACCUMULATOR N AS A DECIMAL NUMBER
DECPR2: MOVEI CH,"0"
CAIG N,^D9
PUSHJ P,0(IO)
PJRST DECPRT
;SUBROUTINE TO READ F.S. NAME & IGNORE TRAILING COLON
REDEV: PUSHJ P,SST
PUSHJ P,SIXBRD
CAIE CH,":"
POPJ P,
PJRST (IO)
;THIS ROUTINE SCANS TTY TO THE FIRST
;NON-ALPHANUMERIC CHAR, FIRST 6 CHARS TO A IN SIXBIT,
;CH IS TERMINATING CHAR
GETARG: TLZ F,L.CMA!L.DOT!L.BRK!L.SPC!L.BRAK ;CLR ALL BITS
MOVEI IO,R.TTY
PUSHJ P,SSIXBR ;GET CHARS
GETAR2: ;HERE FROM GEFARG
CAIN CH,"[" ;BRACKET?
TLO F,L.BRAK
CAIN CH,","
TLO F,L.CMA ;COMMA TERMINATOR
CAIN CH,"."
TLO F,L.DOT ;PERIOD TERMINATOR
CAIE CH,11 ;TAB
CAIN CH,40
TLO F,L.SPC ;OR SPACE TERMINATOR
CAIE CH,33 ;ALT MODE
CAIGE CH,15
TLO F,L.ARGD+L.BRK ;OR OTHER BREAK CHAR
POPJ P,0
;LIKE GETARG EXCEPTS ALSO ACCEPTS * (& SETS L.WLD)
GEFARG: PUSHJ P,GETARG
CAIE CH,"?" ;TEST FOR WILD CHARACTER
JRST GEFAR2 ; NO, JUMP
TLO F,L.WLD ;SET WILD-CARD FLAG
GEFAR1: PUSHJ P,SIXBR1 ;STORE WILD-CHAR & CONTINUE SCAN
CAIN CH,"?" ;TEST FOR ANOTHER WILD CHARACTER
JRST GEFAR1 ; YES, GO STORE & CONTINUE
PJRST GETAR2 ;GO CLASSIFY DELIMITER & RETURN
GEFAR2: ;HERE WHEN NO WILD CHARACTER READ
JUMPN A,CPOPJ
CAIE CH,"*"
POPJ P,
TLO F,L.WLD
MOVSI A,'* '
PUSHJ P,(IO)
PJRST GETAR2
;THIS ROUTINE SCANS THE INPUT DEVICE, SKIPS LEADING SPACES OR TABS
;AND STORES ALPHANUMBERIC CHARS WITH BYTE POINTER BP
SSIXBR: PUSHJ P,SSST ;SKIP LEADING TABS OR SPACES
SIXBRD: SETZB A,B ;RETURNS FIRST NON-SPACE IN CH
MOVE BP,[POINT 6,A]
SIXBRL: CAIL CH,"A"
CAILE CH,"Z"
SKIPA ;NOT LETTER
JRST SIXBR1
CAIL CH,"0"
CAILE CH,"9"
JRST SIXBRX
SIXBR1: SUBI CH,40 ;CONVERT TO SIXBIT
ADDI B,1 ;COUNT LENGTH OF STRING
TLNE BP,770000
IDPB CH,BP
PUSHJ P,0(IO) ;GET NEXT CHAR IN CH
JRST SIXBRL
SIXBRX: POPJ P,0
;THIS ROUTINE IGNORES LEADING TABS OR SPACES ON INPUT
SSST: PUSHJ P,0(IO)
SST: CAIE CH,11
CAIN CH,40
JRST SSST
CAIE CH,CHRLIN ;LINE CONTINUATION?
JRST SST2
PUSHJ P,(IO) ;YES-IGNORE IT
PUSHJ P,SST2 ; AND GOBBLE BREAK CHAR IF ANY
TLZN F,L.EOL
POPJ P,
JRST SSST
SST2: CAIE CH,33 ;SET BIT IF END OF LINE
CAIG CH,14
SST3: TLO F,L.EOL
POPJ P,0
;SUBRS
DOT: JSP M,MSG
ASCIZ /./
COMMA: JSP M,MSG
ASCIZ /,/
SPACE: JSP M,MSG
ASCIZ / /
LPAR: JSP M,MSG
ASCIZ/ (/
RPAR: JSP M,MSG
ASCIZ/) /
LBRKET: JSP M,MSG ;POINT AT TEXT & JUMP
ASCIZ /[/
RBRKET: JSP M,MSG ;POINT AT TEXT & JUMP
ASCIZ /]/
COLON: JSP M,MSG
ASCIZ /:/
QUEST: JSP M,MSG
ASCIZ/? /
CLRLIN: CAIE CH,33
CAIG CH,14
POPJ P,0
PUSHJ P,R.TTY
JRST CLRLIN
MSGTTY: MOVEI IO,W.TTY
TTCALL 13,0 ;CLEAR ^O IF ON
JFCL ;((JUST IN CASE))
PJRST MSG
NOCMU: TRNE B,-1
JRST START1
NOCMU1: MOVEI M,CMMMSG
JRST ERREXI
SDECIN: PUSHJ P,SSST ;GET THE NEXT CHARACTER
DECIN: PUSHJ P,SST ;SKIP ALL BLANKS
SETZ N, ;CLEAR RESULT
DECINL: CAIL CH,"0" ;TEST FOR DECIMAL DIGIT
CAILE CH,"9" ;TEST FOR DECIMAL DIGIT
POPJ P, ; NO, RETURN
IMULI N,^D10 ;MULTIPLY PREVIOUS PRODUCT BY 10
ADDI N,-"0"(CH) ;ADD IN CURRENT DIGIT
PUSHJ P,(IO) ;READ NEXT CHARACTER
JRST DECINL ; & LOOP
;I/O SUBRS
R.TTY: TLZE F,L.TYO
OUTPUT TTY,0 ;OUTPUT ANY CHARS LEFT HANGING AROUND
SOSLE RH.TTY+2
JRST R.TOK
R.TTY1: INPUT TTY,0
STATZ TTY,740000
JSP N,TTYERR
STATO TTY,20000 ;EOF?
JRST R.TOK ;NO, OK
CLOSE TTY, ;GET RID OF ^Z STATE
JRST R.TTY1 ;AND TRY AGAIN
R.TOK: ILDB CH,RH.TTY+1
JUMPE CH,R.TTY
CAIE CH,177 ;IGNORE RUBOUT
CAIN CH,15 ;OR CR
JRST R.TTY
CAIL CH,175 ;CHANGE 175,176 TO ALTMO
MOVEI CH,ALTMO ;WHICH IS ALTMODE
CAIL CH,140
TRZ CH,40 ;CHANGE LOWER CASE TO UPPER
CAIN CH,3 ;EXIT ON ^C
JRST TERMIN ;GO EXIT
TLZ F,L.EOL ;CLEAR EOL BIT
PJRST SST2 ;GO CLASSIFY EOL CHARACTER
W.TTY: SOSLE WH.TTY+2
JRST W.TOK
OUTPUT TTY,0
STATZ TTY,760000
JSP N,TTYERR
W.TOK: IDPB CH,WH.TTY+1
TLO F,L.TYO
CAILE CH,14
POPJ P,
TLZ F,L.TYO
OUTPUT TTY,0
POPJ P,0
W.CMD: SOSLE WH.CMD+2
JRST W.CDOK
OUTPUT CMD,0
STATZ CMD,760000
JSP N,CMDERR
W.CDOK: IDPB CH,WH.CMD+1
POPJ P,0
R.CMD: SOSLE RH.CMD+2
JRST R.CDOK
INPUT CMD,0
STATZ CMD,760000
SKIPA CH,[12]
R.CDOK: ILDB CH,RH.CMD+1
POPJ P,0
R.CMU: SOSLE RH.CMU+2
JRST R.CUOK
INPUT CMU,0
STATZ CMU,760000
POPJ P,0
R.CUOK: ILDB WD,RH.CMU+1
CPOPJ1: AOS (P)
CPOPJ: POPJ P,
USRERR: GETSTS USR,A ;IO ERROR ON USR CHAN
JRST IOERR
CMUERR: GETSTS CMU,A ;IO ERROR ON CMU CHAN
JRST IOERR
CMDERR: GETSTS CMD,A ;IO ERROR ON CMD CHAN
JRST IOERR
TTYERR: GETSTS TTY,A ;IO ERR ON TTY
IOERR: MOVEI M,IOMSG1 ;'?SYSTEM IO ERROR'
PUSHJ P,MSGTTY
HRRZS N,
PUSHJ P,OCTPRT ;LOCATION
MOVEI M,IOMSG2 ;'STATUS ='
PUSHJ P,MSGTTY
MOVE N,A ;STATUS
PUSHJ P,OCTPRT
JRST MONRET
ILFERR: PUSH P,FSNAME
MOVEI M,[ASCIZ/?Illegal name--/]
JRST ILDER2
ILDERR: PUSH P,B
MOVEI M,[ASCIZ/?Illegal device--/]
ILDER2: PUSHJ P,MSGTTY
POP P,M
PUSHJ P,SIXMSG
JRST MONRET
CKEOL: PUSHJ P,SST ;EAT UP TRAILING BLANKS AND TABS
TLNE F,L.EOL ;TEST FOR END OF LINE NOW
JRST CKEOL1 ;EOL-GOOD
CAIE CH,";" ;IF NOT EOL, CAN ONLY ALLOW COMMENTS
CAIN CH,"!" ; (; AND ! START COMMENTS)
JRST CKEOL1 ;OK
JRST COMERR ; NO, THEN GIVE SYNTAX ERROR
CKEOL1: MOVEI IO,W.TTY ;POINT AT TTY OUTPUT ROUTINE
CAIN CH,33 ;TEST FOR CARRIAGE RETURNED AFTER LINE
PJRST CRLF ; NO, THEN RETURN IT FOR THE USER
POPJ P, ; YES, THEN RETURN TO CALLER
COMERR: MOVEI M,CERMSG
JRST ERREXI
;
; SUBROUTINE TO READ A [P,P] FIELD - PPN RETURNED IN 'A'
;
REDPPN: MOVE A,CMDCHR ;GET RQST TYPE (LETTER)
CAIE A,"Z" ;TEST FOR 'FILE Z'
CAIN A,"F" ;TEST FOR 'FILE F'
SKIPA A,USRPPN ; EITHER, LOAD USER'S PPN & SKIP
JRST PPNERR ; NEITHER, GIVE ERROR MSG
PUSHJ P,SOCTIN ;READ PROJECT #
SKIPN N ;TEST FOR PROJ # RETURNED
CAIE CH,"]" ;TEST FOR END OF PPN (DASH SKIPPED)
JRST REDPP1 ; JUMP TO PROCESS NORMAL PPN
MOVE A,DIRPPN ;GET DIRECTORY PPN IF [-]
JRST REDPP2 ; & VERIFY IT
REDPP1: SKIPE N ;TEST FOR PROJ # GIVEN
HRL A,N ; YES, SAVE IT
CAIE CH,"," ;TEST FOR PROPER DELIMITER
JRST COMERR ; NO, SYNTAX ERROR
PUSHJ P,SOCTIN ;READ PROGRAMMER #
SKIPE N ;TEST FOR PROG # GIVEN
HRR A,N ; YES, SAVE IT
REDPP2: TLNE F,L.EOL ;TEST FOR END OF LINE
JRST REDPP3 ; YES, GO MAKE FINAL CHECK
CAIE CH,"]" ;TEST FOR CLOSING BRACKET
JRST COMERR ; NO, SYNTAX ERROR
REDPP3: MOVE N,DEFPPN ;GET DEFAULT PPN
CAME A,N ;TEST FOR INPUT PPN SAME AS DEFAULT
CAMN N,DIRPPN ;TEST FOR DEFAULT PPN SAME AS DIRECTORY
POPJ P, ; RETURN IF SAME AS DEFAULT OR DEFAULT OVER-RIDABLE
MOVEI M,[ASCIZ /% Cannot override PPN implied by device /]
PUSHJ P,MSGTTY ;TYPE THE MESSAGE 1ST PART
MOVE M,DEFDEV ;GET THE DEFAULT DEVICE
PUSHJ P,SIXMSG ; & TYPE IT
PUSHJ P,COLON ;TYPE A COLON
PUSHJ P,CRLF ;END THE LINE
MOVE A,DEFPPN ;RETURN DEFAULT PPN JUST LIKE NOTHING HAPPENED
POPJ P, ;RETURN TO CALLER
SOCTIN: PUSHJ P,SSST ;THROW AWAY INITIAL CHARACTER
OCTIN: PUSHJ P,SST ;SKIP LEADING BLANKS
SETZ N, ;CLEAR RESULT REGISTER
OCTINL: CAIL CH,"0" ;TEST FOR OCTAL DIGIT
CAILE CH,"7" ;TEST FOR OCTAL DIGIT
POPJ P, ; NO, RETURN TO CALLER
LSH N,3 ;MULTIPLY PREVIOUS PRODUCT BY 8 (2**3)
ADDI N,-"0"(CH) ;ADD IN NEXT DIGIT
PUSHJ P,(IO) ;READ NEXT CHARACTER
JRST OCTINL ; & REPEAT
PPNERR: MOVEI M,[ASCIZ /? PPN or device permitted only on FILE F or FILE Z cmds
/] ;POINT AT ERROR MESSAGE
JRST ERREXI ;GO TYPE & ABORT THE RUN
;SUBROUTINE TO GET USERS QUOTAS FROM QUOTA.SYS
;CALL B=F/S NAME
; A=PPN
;RET+0 NO QUOTAS RETURNED
;RET+1 B=RESERVED QUOTA
; C=FCFS QUOTA
; D=LOGGED-OUT QUOTA
GETQUO: TRNE A,400000 ;TEST FOR # PROG NUMBER
HRRI A,-2 ; YES, CONVERT TO -2
MOVEM A,QUOPPN
HLLOM A,QUODEF ;DEFAULT ENTRY (PROJ,-1)
MOVE A,[PHOPEN!14]
MOVEI C,RH.USR
OPEN USR,A ;TRY TO OPEN STR
PJRST MSG262
MOVEI A,B.USR
MOVEM A,.JBFF
INBUF USR,1 ;DECLARE OUR 1 BUFFER
MOVE A,[SIXBIT .QUOTA.]
MOVSI B,(SIXBIT .SYS.)
MOVE D,SYSPPN
LOOKUP USR,A ;SEE IF QUOTA.SYS EXISTS
JRST GETAQ1 ;NO -- SO TRY AUXACC.SYS
PUSHJ P,R.USR ;READ SIZE OF ENTRY
PJRST MSG262
HLRZ B,A ;B=FORMAT VERSION NUMBER
CAIE B,QUOFOR
PJRST MSG263
HRRZ N,A
SETOM QUODFR ;USE QUODFR AS A SWITCH
PUSHJ P,R.USR ;GET 1ST ENTRY
JRST GETQU3
AOSE A ;IS IT -1,-1?
SOJA A,GETQU5 ;NO
PUSHJ P,GETQU ;YES-REMEMBER ITS QUOTAS FOR DEFAULTS
POPJ P,
MOVEM B,QUODFR
MOVEM C,QUODFF
MOVEM D,QUODFO
MOVEI B,-3(N) ;MAINTAIN PROPER PLACE IN FILE
JRST GETQU2
GETQU1: PUSHJ P,R.USR ;READ FIRST WORD OF ENTRY (PPN)
JRST GETQU3
GETQU5: CAMLE A,QUODEF ;SKIP IF NOT YET PAST USER
JRST GETQU7 ;HE AIN'T THERE
CAME A,QUODEF ;DEFAULT?
CAMN A,QUOPPN ;SKIP IF THIS IS NOT USER'S PPN
JRST GETQU4 ;HE EXISTS, GO MAKE UFD
GETQU6: MOVE B,N ;SKIP REST OF THIS ENTRY
GETQU2: SOJLE B,GETQU1
PUSHJ P,R.USR
JRST GETQU3
JRST GETQU2
GETQU3: STATZ USR,20000 ;EOF?
JRST GETQU7 ;YES-NO ENTRY IN QUOTA.SYS
PJRST MSG262 ;NO--ERROR
GETQU4: PUSHJ P,GETQU ;READ ENTRY
POPJ P,
JRST GETQU8 ; & RETURN
GETQU7: SKIPGE B,QUODFR ;WAS THERE A DEFAULT?
JRST GETAQ1 ;NO -- SO TRY AUXACC.SYS
MOVE C,QUODFF ;YES-USE THEM
MOVE D,QUODFO
GETQU8: RELEASE USR,
JRST CPOPJ1
;SUBROUT TO READ READ QUOTAS INTO B,C,D
GETQU: PUSHJ P,R.USR ;READ RESERVED QUOTA
PJRST MSG262
MOVEM A,B ;B=QTR
PUSHJ P,R.USR ;READ FIRST COME, FIRST SERVED QUOTA
PJRST MSG262
MOVEM A,C ;C=QTF
PUSHJ P,R.USR ;AND LOGGED-OUT QUOTA
PJRST MSG262
MOVEM A,D ;D=QTO
JRST CPOPJ1
MSG261: MOVEI M,NQFM
JRST NOQUO
MSG262: MOVEI M,CRQFM
JRST NOQUO
MSG263: MOVEI M,WFVNQM
JRST NOQUO
MSG264: MOVEI M,NEQFM
NOQUO: PJRST MSGTTY
U(QUOPPN)
U(QUODFR)
U(QUODFF)
U(QUODFO)
U(QUODEF)
;NO QUOTAS IN QUOTA.SYS SO TRY AUXACC.SYS
GETAQ1: MOVE A,[PHOPEN!14]
HRLZI B,(SIXBIT .SYS.)
MOVEI C,RH.USR
OPEN USR,A
PJRST MSG262
MOVEI A,B.USR
MOVEM A,.JBFF
INBUF USR,1 ;DECLARE OUR ONE BUFFER
MOVE A,[SIXBIT .AUXACC.]
MOVSI B,(SIXBIT .SYS.)
MOVE D,SYSPPN
LOOKUP USR,A ;AUXACC.SYS
PJRST MSG261 ;LOOKUP FAILED
PUSHJ P,R.USR ;PASSOVER THE NULL WORD
PJRST GETAQ9 ;SOMETHING IS WRONG HERE
GETAQ2: PUSHJ P,R.USR ;READ WORD 0 = -1
PJRST GETAQ9 ;READ ERROR OR NO ENTRY
AOJN A,MSG264 ;NO ENTRY
PUSHJ P,R.USR ;NUMBER OF WORDS REMAINING IN THIS ENTRY
JRST GETAQ9 ;
MOVEI D,-1(A) ;DONT COUNT THE "P,,P" WORD
PUSHJ P,R.USR ;READ THE "P,,P" WORD
JRST GETAQ9 ;
CAML A,QUOPPN ;COULD THIS BE THE ENTRY?
JRST GETAQ4 ;YES
GETAQ3: PUSHJ P,R.USR ;NO -- SO PASS OVER THIS ENTRY
JRST GETAQ9 ;
SOJG D,GETAQ3 ;
JRST GETAQ2 ;AND TRY THE NEXT ONE
;EITHER THIS IS IT OR ITS NOT HERE
GETAQ4: CAME A,QUOPPN ;EXACT MATCH
CAMN A,QUODEF ;OR DEFAULT PROG NUMBER
JRST GETAQ5 ;YES
CAMG A,QUODEF ;TEST FOR OUT OF RANGE
JRST GETAQ3 ; NO, KEEP READING
PJRST MSG264 ;NO -- NOT HERE
GETAQ5: PUSHJ P,R.USR ;READ FILE-STR NAME
JRST GETAQ9 ;
GETAQ6: CAMN A,FSNAME ;IS THIS THE FILE-STR?
JRST GETQU4 ;YES -- GET QUOTAS AND EXIT
SUBI D,5 ;NO -- SKIP OVER THIS FILE-STR
JUMPLE D,MSG264 ;ANY MORE FILE-STRS? TOO BAD
MOVEI C,5 ;YES
GETAQ7: PUSHJ P,R.USR ;SKIP OVER THE CURRENT ONE
JRST GETAQ9 ;
SOJG C,GETAQ7 ;
JRST GETAQ6 ;AND TRY THE NEXT ONE
GETAQ9: STATZ USR,20000 ;EOF?
PJRST MSG264 ;YES -- NO QUOTAS
PJRST MSG262 ;READ ERRROR
IFE MNTSW,<XLIST>
IFN MNTSW,<
;SUBROUTINE TO SET UP A UFD FOR USE V002
;ARGS A=USER'S PPN
; B=A+1=RESERVED QUOTA
; C=B+1=FIRST COME FIRST SERVED QUOTA
; D=C+1=LOGGED OUT QUOTA
; N1=N+1=MFD PPN
; M=NAME OF STR
; IO=ADDRESS OF ROUTINE TO TYPE A CHAR
; CH=ACCUMULATOR TO CONTAIN CHAR TO BE TYPED
; F=FLAG REGISTER
; L.WRTL=BIT IN LH OF F = 1 IF USER REQUESTS WRITE LOCK
; L.NCR=BIT IN LH F = 1 IF USER REQUESTS NO CREATE SET
; L.SIN=BIT IN LH F = 1 IF SINGLE ACCESS REQUESTED
; L.FRE1=AVAILABLE BIT IN LH OF F
; L.FRE2=AVAILABLE BIT IN LH OF F
; P=PUSH DOWN LIST POINTER
;
;IF D=-1 ASSUME NO UFD DESIRED - PERFORM OTHER OPERATIONS
;
; USR=FREE I/O CHANNEL
; US1=FREE I/O CHANNEL
;
;CALL PUSHJ P,UFDSET
;ERROR DONT PROCEED (MESSAGE TYPED)
;OK STR IS IN SEARCH LIST (WARNING MAY BE TYPED)
;
;ASSUMES SYMBOLS FOR AC'S ABOVE DEFINED, LOCATIONS CPOPJ, CPOPJ1 DEFINED
;
;USES U AND UU MACROS TO RESERVE STORAGE FOR EITHER HIGH OR LOW
;SEGMENT OPERATION.
;
;ROUTINES DEFINED HERE:
;
;MSG: TYPES STRING OF ASCII CHARS TO FIRST NULL
;SIXMSG: TYPES CONTENTS OF M AS SIXBIT CHARS
;CRLF: TYPES CARRIAGE RETURN LINE FEED
;OCTPRT: TYPES CONTENTS OF N AS OCTAL NUMBER
;MPOPJ: POP P,M FOLLWED BY POPJ P,
;R.USR: READS NEXT WORD FROM CHANNEL USR INTO A (BUFFER HEADER RH.USR, BUFFER B.USR)
;ADDSTR: ADD FILE STRUCTURE TO SEARCH LIST
;DISSTR: DELETE FILE STRUCTURE FROM SEARCH LIST
MNTSUB==1 ;DECLARE IN CASE DISMOUNT SUBROUTINE ALSO APPEARS
UFDGIL==^D60 ;TIMES TO TRY TO GET UFD INTERLOCK
RACEY==2 ;VALUE OF LEVEL D FIELD IN STATES WORD FOR MONITOR
; WHICH INCLUDES RACE CONDITION STUFF
UFDSET: MOVEM A,UFDUPN ;SAVE USER'S PPN
MOVEM N1,UFDMPN ;AND MFD PPN
MOVEM M,UFDFSN ;AND NAME OF STR
MOVE N,B ;N=RESERVED QUOTA
MOVE M,C ;M=FCFS QUOTA
MOVE CH,D ;CH=LOGGED OUT QUOTA
MOVEI N1,UFDGIL ;NUMBER OF TIMES TO TRY FOR UFD INTERLOCK
UFDSTA: MOVEI B,ULKSTR ;USER-MODE UFD INTERLOCK FUNCTION
PUSHJ P,STUFC1 ;TEST/SET UFD INTERLOCK
JRST STUFBS ;BUSY, SLEEP AND RETRY
MOVE B,UFDFSN
MOVE A,[PHOPEN!14]
MOVEI C,RH.USR
OPEN USR,A ;INIT THIS FILE STRUCTURE
JRST UFDSE2 ;HOW CAN THIS BE?
AOJE CH,UFDOK ;JUMP IF NO UFD OPERATIONS DESIRED
SUBI CH,1 ;NO, RESTORE LOGGED OUT QUOTA
MOVEI A,B.USR
MOVEM A,.JBFF
INBUF USR,1 ;DECLARE OUR 1 BUFFER
PUSHJ P,SETEXL ;SET UP SRCBUF FOR EXTENDED LOOKUP OF UFD
SETZB C,SRCBUF+4 ;CLEAR REST OF LOOKUP BLOCK
MOVE A,[XWD SRCBUF+4,SRCBUF+5]
BLT A,SRCBUF+EXLLEN-1
LOOKUP USR,SRCBUF ;LOOKUP UFD
SKIPA A,SRCBUF+EXLEXT ;GET ERROR CODE IN A
JRST UFDEX ;UFD EXISTS, LOOK AT IT
TRNE A,-1 ;SKIP IF NO UFD
JRST UFDSE3 ;THERE'S SOMETHING WRONG WITH THIS UFD
;HERE IF MUST CREATE A UFD
MOVEM N,SRCBUF+EXLQTR ;STORE RESERVED QUOTA
MOVEM M,SRCBUF+EXLQTF ;AND FCFS
MOVEM CH,SRCBUF+EXLQTO ;AND LOGGED OUT QUOTA
PUSHJ P,SETEXL ;SET UP FOR EXTENDED ENTER OF UFD
MOVE A,[XWD RIPLOG,RIPDIR] ;SET DIRECTORY BIT AND LOGGED IN BIT
MOVEM A,SRCBUF+EXLSTS
ENTER USR,SRCBUF ;TRY TO CREATE A UFD
JRST UFDSE1 ;IDENTIFY ENTER FAILURE
SETSTS USR,17 ;CHANGE TO DUMP MODE SO CLOSE WONT DUMP BUFFERS
USETO USR,2
CLOSE USR, ;AN EMPTY UFD
JRST UFDOK ;ALL SET
;HERE IF UFD ALREADY EXISTS
UFDEX: MOVE A,SRCBUF+.RBSTS ;ALLOWED TO RENAME?
TRNE A,.RBNDL
JRST UFDOK ;NO-THATS ALL
MOVEM N,SRCBUF+EXLQTR ;STORE RESERVED QUOTA
MOVEM M,SRCBUF+EXLQTF ;AND FCFS
MOVEM CH,SRCBUF+EXLQTO ;AND LOGGED OUT QUOTA
MOVSI A,RIPLOG ;LOGGED IN BIT
TDNN A,SRCBUF+EXLSTS ;SKIP IF BIT ON IN UFD
JRST UFDEX2 ;NO, CAN PROCEED
HRRI B,.GTNSW ;GET HIGHEST NUMBER ASSIGNED BY MONITOR
HRLI B,%NSHJB ;(NOT HIGHEST NUMBER AVAILABLE)
GETTAB B, ;GET NUMBER OF JOBS
MOVEI B,100 ;ASSUME 64
MOVNI B,(B)
HRLZS B ;LH B=-NUMBER OF REAL JOBS
UFDEX1: MOVE A,UFDFSN
MOVEM A,CHRBUF+GOBNAM ;NAME OF STR
MOVE A,UFDUPN
MOVEM A,CHRBUF+GOBPPN
MOVEI A,1(B) ;A=NEXT JOB NUMBER
MOVEM A,CHRBUF+GOBJOB
MOVEI A,CHRBUF
GOBSTR A, ;SEE IF STR IS IN THAT JOB'S SEARCH LIST
JRST .+2 ;NOT IN THIS JOBS LIST OR NOT OUR PPN
JRST UFDOK ;OK IS IN SOMEBODY ELSES SEARCH LIST SAME PPN
AOBJN B,UFDEX1 ;LOOP FOR ALL JOBS
;HERE TO LOOKUP ALL FILES AND RECOMPUTE RIBUSD
MOVSI A,(PHOPEN)
SETZ C,
MOVE B,UFDFSN
MOVEM B,CHRBUF ;SAVE FOR DSKCHR
OPEN US1,A ;OPEN FILE STRUCTURE
JRST UFDSE2
SETZM SRCBUF+EXLUSD ;CLEAR USED WORD
MOVE A,[XWD CHRUFB+1,CHRBUF]
DSKCHR A, ;GET CURRENT UFBTAL
JRST UFDS9A
ALLK1: PUSHJ P,R.USR ;READ NEXT WORD OF UFD
JRST UFDRER ;READ ERROR (MAY BE EOF)
MOVEM A,SECBUF+EXLNAM ;FILE NAME
PUSHJ P,R.USR ;READ NEXT WORD OF UFD (EXT)
JRST UFDRER ;READ ERROR
SKIPN SECBUF+EXLNAM ;SKIP IF REAL NAME
JRST ALLK1 ;UFD'S DO HAVE ZEROS
HLLZM A,SECBUF+EXLEXT ;STORE EXT
SETZM SECBUF+EXLPPN ;CLEAR PPN WORD
MOVEI A,EXLALC
MOVEM A,SECBUF ;SET NUMBER OF ARGS TO GET ALC WORD
LOOKUP US1,SECBUF ;LOOKUP FILE
JRST ALLK1 ;SOMETHING WRONG, FORGET IT
MOVE A,SECBUF+EXLALC ;GET BLOCKS ALLOCATED FOR THIS FILE
ADDM A,SRCBUF+EXLUSD ;COUNT FOR ALL FILES
JRST ALLK1
;HERE IF READ ERROR (MAY BE EOF)
UFDRER: CLOSE US1,
GETSTS USR,A ;A=ERROR CODE
MOVEI M,[ASCIZ .UFD Read error, Status = .]
TRNN A,20000 ;SKIP IF ERROR, NOT EOF
JRST UFDSE4 ;TELL USER ABOUT ERROR, NO UFD
MOVE B,CHRBUF+CHRUFB ;PREVIOUS UFBTAL
CAMN B,[XWD 400000,0]
JRST UFDEX3
MOVE A,[XWD CHRUFB+1,CHRBUF]
DSKCHR A, ;GET NEW UFBTAL
JRST UFDS9A
SUB B,CHRBUF+CHRUFB ;OLD-NEW=-DIFFERENCE FREE
ADDM B,SRCBUF+EXLUSD ;=DIFFERENCE ALLOCATED
JRST UFDEX3 ;ALL SET
UFDEX2: IORM A,SRCBUF+EXLSTS ;MAKE SURE LOGGED IN BIT ON
UFDEX5: LDB A,LVDBTS
CAIL A,RACEY
SETOM SRCBUF+EXLUSD ;USE MONITOR'S COPY OF UFBTAL TO COMPUTE RIBUSD
UFDEX3: PUSHJ P,SETEXL ;SET UP SRCBUF FOR EXTENDED RENAME
RENAME USR,SRCBUF
SKIPA A,SRCBUF+EXLEXT
JRST UFDOK
MOVEI M,[ASCIZ .UFD RENAME Failure .]
JRST UFDSE4
UFDSE3: MOVEI M,[ASCIZ .UFD LOOKUP Failure .]
UFDSE4: PUSHJ P,MSG ;IDENTIFY FAILURE
HRRZ N,A ;N=ERROR CODE
PUSHJ P,OCTPRT
PUSHJ P,CRLF
JRST UFDOK
UFDSE1: MOVEI M,[ASCIZ .UFD ENTER Failure .]
PUSHJ P,MSG ;IDENTIFY FAILURE
HRRZ N,SRCBUF+EXLEXT
PUSHJ P,OCTPRT
UFDOK: MOVEI A,UFDFSN
DSKCHR A, ;NEED TO SEE IF MC=0
JRST UFDSE2 ;BAD LUCK
TLNN A,D.MC ;SKIP IF MOUNT COUNT=0
JRST UFDOK1 ;NO
SETZ N, ;YES, REDEFINE STR
TLNE F,L.SIN ;IF SINGLE REQUEST, PASS ON TO MOUNT UUO
TLO N,S.SIN
MOVEM N,MNTFSN
MOVE B,UFDFSN ;AND FILE STRUCTURE NAME
MOVEM B,MNTTYP
SETOM UFDDMJ ;USE JOB'S JOB NUMBER
SETOM UFDDMP ;AND PPN
MOVEI A,RDFFST
MOVEM A,UFDMTP ;SET FUNCTION
MOVEI A,UFDMTP
STRUUO A, ;REDEFINE THE FILE STRUCTURE
JRST UFDS7A ;NO, DONT
UFDOK1: PUSHJ P,ADDSTR ;ADD STR TO JOBS SEARCH LIST
;HERE TO CLEAR UFD INTERLOCK
PUSHJ P,STUFCL ;CLEAR UFD INTERLOCK
JRST CPOPJ1 ;WHAT?
JRST CPOPJ1 ;ALL DONE
;HERE WHEN UFD INTERLOCK IS BUSY - SLEEP AND RETRY
STUFBS: CAME A,[XWD 3,B] ;TEST FOR ERROR CODE
JSP N,NEVERR ; YES, FATAL ERROR
MOVEI A,1
SLEEP A, ;SLEEP FOR 1 SECOND
SOJG N1,UFDSTA
UFDSEM <UFD Interlock busy>
UFDSE2: PUSHJ P,STUFCL
JFCL
UFDSEM <Can't OPEN>
;SUBROUTINE TO TEST/SET OR CLEAR UFD INTERLOCK
;ENTER AT STUFCL TO CLEAR
;ENTER AT STUFC1 WITH B=FUNCTION
;RETURN POPJ IF FAILED
;RETURN CPOPJ1 IF OK
STUFCL: MOVEI B,UCLSTR ;FCN TO CLEAR INTERLOCK
PUSHJ P,UFDLUU ;DO THE CLEAR
JSP A,NEVERR ;WHAT???
PJRST CONCOM ;EXIT VIA RTE. TO TURN ^C INTERCEPT BACK ON
STUFC1: PUSHJ P,CONCOF ;DISABLE ^C-INTERCEPT WHILE INTERLOCK'D UFD
PUSHJ P,UFDLUU ;DO FCN AS CALLED
POPJ P, ;FAILED
PJRST CPOPJ1 ;OK , SKIP RETURN
UFDLUU: LDB A,LVDBTS
CAIGE A,RACEY
JRST CPOPJ1
MOVE A,[XWD 3,B]
MOVE C,UFDFSN
MOVE D,UFDUPN
IFE DBUGSW,<
STRUUO A,
POPJ P,
> ;END IFE DBUGSW
PJRST CPOPJ1
;SUBROUTINE TO SET UP HEADER FOR EXTENDED LOOKUP/ENTER/RENAME OF UFD
SETEXL: MOVEI A,EXLLEN-1 ;LENGTH OF ARG LIST
MOVEM A,SRCBUF
MOVE A,UFDUPN ;NAME IS USER'S PPN
MOVEM A,SRCBUF+EXLNAM
MOVSI A,(SIXBIT .UFD.) ;EXT IS UFD
HLLM A,SRCBUF+EXLEXT
MOVE A,UFDMPN ;DIRECTORY IS MFD
MOVEM A,SRCBUF+EXLPPN
POPJ P,
R.USR: SOSLE RH.USR+2
JRST R.USOK
INPUT USR,
STATZ USR,760000
POPJ P,
R.USOK: ILDB A,RH.USR+1
JRST CPOPJ1
;THIS ROUTINE ADDS FILE STRUCTURE NAMED IN UFDFSN TO THE
;FILE STRUCTURE SEARCH LIST, OR DELETES THE FILE STRUCTURE FROM IT.
;ENTER AT ADDSTR TO ADD OR AT DISSTR TO DELETE.
DISSTR: MOVEI A,B
MOVE B,UFDFSN
JOBSTR A,
POPJ P, ;NOT IN SEARCH LIST, OK
TLOA F,L.DIS ;SET FLAG NOTING DISMOUNT
ADDSTR: TLZ F,L.DIS ;CLEAR FLAG, NOTING ADD
SETZB E,UFDDMF ;SET FLAG TO REMEMBER
TLNE F,L.DIS ;SKIP IF ADDING AN STR
AOS UFDDMF ;SET FLAG TO DELETE
MOVEI A,SRCDSL
MOVEM A,UFDMTP ;SET FUNCTION TO DEFINE SEARCH LIST
SETOB B,UFDDMJ ;START JOBSTR WITH -1
SETOM UFDDMP ;CLEAR JOB AND PPN SO USES VALUES FOR THIS JOB
TLZ F,L.PEND ;BORROW THIS BIT TO MEAN FILE STRUCTURE THERE
MAKSRC: MOVE A,[XWD 3,B]
JOBSTR A, ;GET USER'S NEXT FILE STRUCTURE
JRST UFDSE8 ;SYSTEM PROBLEM
TLNN F,L.DIS ;SKIP IF DISMOUNT
JUMPE B,MAKSR2 ;MOUNT STOPS AT FENCE
AOJE B,MAKSR2 ;JUMP IF END OF LIST
SOS B
MOVEM B,MNTTYP+1(E)
JUMPE B,MAKSR1 ;DONT DSKCHR THE FENCE
MOVE A,[XWD 1,B]
DSKCHR A, ;GET CURRENT STATUS OF THIS FILE STRUCTURE
JRST UFDSE9 ;CANT FAIL
MOVE B,MNTTYP+1(E) ;GET BACK FILE STRUCTURE NAME
CAME B,UFDFSN ;AND SEE IF WE ALREADY EXIST
JRST MAKSR1 ;NO
TLO F,L.PEND
TLNE F,L.DIS ;SKIP IF ACTUALLY DELETING
JRST MAKSRC ;AND IGNORE THIS FILE STRUCTURE
TRNN F,R.PAS ;TEST FOR /PASSIVE
JRST MAKSR0 ; NO, JUMP TO LOOK AT IT
SETZM MNTTYP+1(E) ;FORGET F/S IN ACTIVE S/L
JRST MAKSRC ; & KEEP ON LOOKING
MAKSR0: MOVE A,D
LSH A,^L<S.SWL>-^L<L.WRTL> ;ROTATE TO ALIGN BITS
XOR A,F ;COMPARE WRITE LOCK STATES
TLNE A,L.WRTL ;TEST FOR RQSTED .NE. PRESENT
TLC D,S.SWL ; YES, INVERT THE PRESENT SETTING
MOVE A,D ;COPY CURRENT SETTINGS AGAIN
LSH A,^L<S.NOC>-^L<R.NOC>-^D18 ;ROTATE TO ALIGN BITS
XOR A,F ;COMPARE NOCREATE STATES
TRNE A,R.NOC ;TEST FOR RQSTED .NE. PRESENT
TLC D,S.NOC ; YES, INVERT THE PRESENT SETTING
SETZ C,
MAKSR1: MOVEM C,MNTTYP+2(E) ;SAVE PROJECT,PROGRAMMER NUMBER
MOVEM D,MNTTYP+3(E) ;SAVE WRITE PROTECT REQUEST
ADDI E,3
JRST MAKSRC ;LOOP FOR ALL USER'S FILE STRUCTURES
UFDSE8: UFDSEM <System error - JOBSTR UUO Failed>
UFDS9A: PUSHJ P,STUFCL
JFCL
UFDSE9: UFDSEM <System error - DSKCHR UUO Failed>
MAKSR2: TLZE F,L.PEND
JRST MAKSR3 ;DONT ADD FILE STRUCTURE
TRNE F,R.PAS ;TEST FOR /PASSIVE
JRST MAKPAS ; YES, JUMP TO PUT IN PASSIVE S/L
MAKSRA: SKIPN MNTTYP+1(B) ;B STARTS AT 0 FROM ABOVE
JRST MAKSRB ;THE FENCE IS A 0
ADDI B,3
CAIE B,(E) ;IF END, NO FENCE
JRST MAKSRA
JRST MAKSR4 ;OK TO PROCEED
MAKSRB: MOVE C,E ;IF FENCE, MUST MOVE EVERYTHING DOWN 1 ENTRY
MAKSRL: CAIG B,(C) ;SKIP IF MORE
JRST MAKSR4
MOVE A,MNTTYP(C)
MOVEM A,MNTTYP+3(C)
SOJA C,MAKSRL
MAKPAS: SKIPN MNTTYP+1(E) ;TEST FOR POINTING AT FENCE
ADDI E,3 ; NO, POINT AT IT NOW
MOVE B,E ;POINT AT PLACE WHERE F/S GOES
MAKSR4: MOVE A,UFDFSN
MOVEM A,MNTTYP+1(B) ;ADD NEW FILE STRUCTURE
SETZB A,MNTTYP+2(B)
TLNE F,L.WRTL
TLO A,S.SWL ;A SET TO 0 ABOVE
TRNE F,R.NOC ;TEST FOR /NOCREATE
TLO A,S.NOC ; YES, SET THE BIT
MOVEM A,MNTTYP+3(B)
ADDI E,3
MAKSR3: MOVEI A,UFDMTP
HRLI A,4(E) ;LENGTH OF ARGUMENT LIST
STRUUO A,
JRST UFDSE6
POPJ P,
UFDSE6: TLNE F,L.DIS
JRST UFDSE5
MOVEI N1,[ASCIZ .Can't add to your File Structure search list .]
JRST UFDSSE
UFDSE5: MOVEI N1,[ASCIZ .Can't remove file structure from search list .]
JRST UFDSSE
UFDS7A: PUSHJ P,STUFCL
JFCL
UFDSE7: MOVEI N1,[ASCIZ .Can't redefine File Structure .]
UFDSSE: MOVEI CH,"?"
PUSHJ P,(IO)
MOVE M,UFDFSN
PUSHJ P,SIXMSG
MOVEI CH," "
PUSHJ P,(IO)
MOVE M,N1
PUSHJ P,MSG
MOVE N,A
PUSHJ P,OCTPRT
PJRST CRLF
UFDSMP: MOVEI CH,"?"
PUSHJ P,(IO)
MOVE M,UFDFSN
PUSHJ P,SIXMSG
MOVEI CH," "
PUSHJ P,(IO)
MOVE M,N1
PUSHJ P,MSG
PJRST CRLF
;SUBROUTINE TO OUTPUT ACCUMULATOR M AS SIXBIT CHARS
SIXTTY: MOVEI IO,W.TTY
SIXMSG: PUSH P,M
MOVE M,[POINT 6,(P)] ;M=BYTE POINTER
SIXMSL: ILDB CH,M
JUMPE CH,MPOPJ ;QUIT AT FIRST NULL BYTE
ADDI CH,40
PUSHJ P,0(IO)
TLNE M,770000 ;OR END OF WORD
JRST SIXMSL
MPOPJ: POP P,M
POPJ P,
;THIS ROUTINE OUTPUTS ACCUMULATOR N AS AN OCTAL NUMBER
OCTPRT: IDIVI N,^D8
HRLM N1,0(P) ;SAVE EACH CHAR ON THE STACK
SKIPE N
PUSHJ P,OCTPRT ;RECURSE AS NECESSARY
HLRZ CH,0(P) ;NOW RETRIEVE LAST CHAR
ADDI CH,"0" ;MAKE ASCII
JRST 0(IO) ;OUTPUT AND ASCEND A LEVEL- EXIT WHEN DONE
CRLF: MOVEI M,[ASCIZ .
.]
MSG: HRLI M,(<POINT 7,>)
MSGL: ILDB CH,M
JUMPE CH,CPOPJ
PUSHJ P,0(IO)
JRST MSGL
LVDBTS: POINT 3,STATES,9
UU(RH.USR,3)
UU(B.USR,205)
UU(CHRBUF,CHRLEN)
UU(SRCBUF,EXLLEN)
UU(SECBUF,EXLALC+1)
U(UFDMPN)
U(UFDUPN)
U(UFDFSN)
U(UFDMTP)
U(UFDDMJ)
U(UFDDMP)
U(UFDDMF)
MNTTYP=UFDDMF
U(MNTFSN)
U(MNTNUM)
SRWPS==3 ;WORDS PER STR. ENTRY IN SEARCH LIST
STRJMX==9 ;MAX. NO OF STRS PER JOB
UU(MNTBLK,SRWPS*STRJMX)
> ;END CONDITIONAL ON MNTSW
IFE MNTSW,<LIST>
IFE MNTSW,<XLIST>
IFN MNTSW,<
;SUBROUTINE TO CLEAR A FILE STRUCTURE FOR DISMOUNT V002
;ARGS A=USER'S PPN
; B=A+1=JOB NUMBER
; C=B+1
; D=C+1=LOGGED OUT QUOTA (-1 TO IGNORE)
; N1=N+1=MFD PPN
; M=NAME OF FILE STRUCTURE
; IO=ADDRESS OF ROUTINE TO TYPE A CHARACTER
; CH=ACCUMULATOR TO CONTAIN CHAR TO BE TYPED
; F=FLAG REGISTER
; L.FRE1=AVAILABLE BIT IN LH OF F
; L.FRE2=AVAILABLE BIT IN LH OF F
; P=PUSH DOWN LIST POINTER
;
; USR=FREE I/O CHANNEL
;
;CALL PUSHJ P,UFDCLR
;ERROR DONT PROCEED A=CODE (0=CANT OPEN 1=QUOTA EXCEEDED) MESSAGE TYPED
;OK FILE STRUCTURE REMOVED FROM JOBS SEARCH LIST (WARNING MAY BE TYPED)
UFDCLR: MOVEM A,UFDUPN ;SAVE USER'S PPN
MOVEM B,UFDJBN ;AND JOB NUMBER
MOVEM D,UFBLOQ ;LOG-OUT QUOTA
MOVEM N1,UFDMPN ;MFD PPN
MOVEM M,UFDFSN ;STR NAME
MOVEI B,ULKSTR
MOVEI N1,UFDGIL ;TIMES TO TRY FOR UFD INTERLOCK
UFDCLA: PUSHJ P,STUFC1 ;TEST/SET UFD INTERLOCK
JRST UFDCAA ;BUSY, SLEEP AND RETRY
MOVE A,[PHOPEN!14]
MOVE B,M ;STR NAME
MOVEI C,RH.USR
OPEN USR,A ;OPEN FILE STRUCTURE
JRST UFDCAB
MOVEI A,B.USR
MOVEM A,.JBFF
INBUF USR,1 ;DECLARE OUR 1 BUFFER
PUSHJ P,SETEXL ;SET UP FOR EXTENDED LOOKUP OF UFD
LOOKUP USR,SRCBUF
SKIPA A,SRCBUF+EXLEXT ;GET ERROR CODE
JRST UFDCLC ;UFD EXISTS
TRNN A,-1 ;SKIP IF UFD EXISTS, LOOKUP FAILED
JRST UFDCLJ ;NO UFD
;HERE IF UFD LOOKUP ERROR
MOVEI M,[ASCIZ .UFD LOOKUP Failure .]
JRST UFDCFA ;TYPE MESSAGE
UFDCLC: HRRI B,.GTNSW ;GET HIGHEST JOB NUMBER ASSIGNED
HRLI B,%NSHJB ;(NOT HIGHEST ONE AVAILABLE)
GETTAB B, ;GET NUMBER OF JOBS IN SYSTEM
MOVEI B,100 ;ASSUME 64
MOVNI B,(B) ;B=-NUMBER OF REAL JOBS (NOT NULL JOB)
HRLZS B
UFDCCA: MOVE A,UFDFSN ;NAME OF FILE STRUCTURE
MOVEM A,CHRBUF+GOBNAM ;STORE IN GOBSTR BLOCK
MOVE A,UFDUPN ;USER'S PPN
MOVEM A,CHRBUF+GOBPPN
MOVEI C,1(B) ;JOB NUMBER
MOVEM C,CHRBUF+GOBJOB
MOVEI A,CHRBUF
CAME C,UFDJBN ;IF THIS JOB, AVOID GOBSTR
GOBSTR A, ;SEE IF IN THIS JOBS SEARCH LIST
JRST UFDCCB ;NO
JRST UFDCLJ ;NO, SOMEBODY ELSE COMING
UFDCCB: AOBJN B,UFDCCA ;NOT IN THAT JOBS SEARCH LIST
;THE STRUCTURE TO BE REMOVED IS ONLY IN THIS USER'S SEARCH LIST
;CHECK TO SEE IF F/S HAS /RONLY SET AND IF SO CLEAR IT BEFORE CONTINUING
MOVEI A,B ;IN THIS USER'S SEARCH LIST?
MOVE B,UFDFSN ;F/S
JOBSTR A,PHONLY
JRST UFDCCD ;NO, CANNOT (DO NOT NEED TO) CHANGE S/L
TDZ F,[L.WRTL,,R.PAS!R.NOC] ;CLEAR THESE CONDITIONS
PUSHJ P,ADDSTR ; AND CHANGE S/L TO NOT HAVE THESE CONDITIONS
UFDCCD: MOVE A,UFDFSN
MOVEM A,CHRBUF
MOVE A,[XWD CHRUFB+1,CHRBUF]
DSKCHR A, ;GET CURRENT UFBTAL
JRST UFDCLJ
MOVE B,SRCBUF+EXLQTO ;USE UFD QUOTA
SKIPGE UFBLOQ ; IF NONE IN QUOTA.SYS OR AUXACT.SYS
MOVEM B,UFBLOQ
MOVE B,CHRBUF+CHRUFB
CAMN B,[XWD 400000,0]
JRST UFDCCC ;IGNORE QUOTA TEST
MOVE A,SRCBUF+EXLQTF ;FCFS QUOTA
REPEAT 0,<ADD A,SRCBUF+EXLQTR ;RESERVED QUOTA WHEM IMPLEMENTED>
SUB A,B ;QUOTA IN-FREE=USED
SUB A,UFBLOQ ;-QUOTA OUT=BLOCKS OVER QUOTA
JUMPG A,UFDCLM ;JUMP IF OVER QUOTA
;HERE TO SEE IF UFD EMPTY
UFDCCC: MOVE B,SRCBUF+.RBSTS ;ALLOWED TO RENAME/DELETE?
TRNE B,.RBNDL
JRST UFDCLJ ;NO-THATS ALL
SKIPN B,SRCBUF+EXLSIZ ;WORDS WRITTEN IN UFD
JRST UFDCLI ;NO WORDS WRITTEN - DELETE UFD
UFDCLD: PUSHJ P,R.USR ;READ NEXT WORD OF UFD
JRST UFDCDA ;JUMP IF ERROR OR EOF
JUMPN A,UFDCLF ;JUMP IF NON-EMPTY ENTRY IN UFD
SOJG B,UFDCLD ;STILL EMPTY SO FAR, LOOP FOR WORDS WRITTEN
JRST UFDCLI ;NO NON-ZERO ENTRIES, DELETE UFD
UFDCDA: GETSTS USR,N
TRNE N,20000 ;SKIP IF EOF
JRST UFDCLF ;EOF
MOVEI M,[ASCIZ .UFD Read error, Status = .]
PUSHJ P,MSG
PUSHJ P,OCTPRT
PUSHJ P,CRLF
UFDCLF: MOVSI A,RIPLOG ;LOGGED IN BIT
ANDCAM A,SRCBUF+EXLSTS ;CLEAR IN RENAME ARG LIST
LDB A,LVDBTS
CAIL A,RACEY
SETOM SRCBUF+EXLUSD ;REQUEST MONITOR TO COMPUTE RIBUSD
CLOSE USR, ;CLOSE TO GET RID OF /RONLY-SEE EDITS 54
; AND 62 IN REVISION HISTORY
PUSHJ P,SETEXL ;SET UP FOR EXTENDED RENAME
RENAME USR,SRCBUF ;EXTENDED RENAME
SKIPA A,SRCBUF+EXLEXT ;GET ERROR CODE IN A
JRST UFDCLJ
MOVEI M,[ASCIZ .UFD RENAME Failure .]
UFDCFA: PUSHJ P,MSG
HRRZ N,A
PUSHJ P,OCTPRT ;PRINT ERROR CODE
PUSHJ P,CRLF
JRST UFDCLJ ;GIVE UP
UFDCLI: SETZB A,B
SETZB C,D
RENAME USR,A ;DELETE UFD
JFCL
UFDCLJ: PUSHJ P,DISSTR ;TAKE STR OUT OF JOB'S SEARCH LIST
PUSHJ P,STUFCL ;CLEAR UFD INTERLOCK
JRST CPOPJ1
JRST CPOPJ1 ;EVERYBODY HAPPY
UFDCLM: MOVEI M,[ASCIZ .Exceed Logged Out Quota .]
PUSHJ P,MSG
MOVE N,UFBLOQ
PUSHJ P,DECPRT
MOVEI M,[ASCIZ . by .]
PUSHJ P,MSG
MOVE N,A
PUSHJ P,DECPRT
PUSHJ P,STUFCL
JFCL
MOVEI M,[ASCIZ . blocks
.]
MOVE A,[CNOPR] ;GET GETTAB PARMS FOR 'OPR' TTY NAME
GETTAB A, ;GET 'OPR' TTY NAME
MOVSI A,'CTY' ; FAILED, ASSUME 'CTY'
CAMN A,TTYLIN ;TEST FOR CURRENT LINE # = 'OPR'
PUSH P,[UFDCCC] ; YES, THEN SET UP A RETURN ADDRESS
; FOR THE FOLLOWING 'PJRST MSG'
; SO DISMOUNT WILL PROCEED NORMALLY
MOVEI A,UFDQEE
PJRST MSG
UFDCAA: CAME A,[XWD 3,B] ;TEST FOR ERROR CODE
JSP N,NEVERR ; YES, FATAL ERROR
MOVEI A,1
SLEEP A,
SOJG N1,UFDCLA
UFDSEM <UFD Interlock busy>
UFDCAB: PUSHJ P,STUFCL
JFCL
UFDSEM <Can't OPEN>
U(UFBLOQ)
DECPRT: IDIVI N,^D10
HRLM N1,0(P) ;SAVE EACH CHAR ON THE STACK
SKIPE N
PUSHJ P,DECPRT ;RECURSE AS NECESSARY
HLRZ CH,0(P) ;NO RETRIEVE THE LAST CHAR
ADDI CH,"0"
JRST 0(IO) ;OUTPUT AND ASCEND A LEVEL OR EXIT
U(UFDJBN)
> ;END CONDITIONAL ON MNTSW
SUBTTL MESSAGES
;TEXT MESSAGES
DEFINE MT (ADR,TEXT) <
ADR: XLIST
ASCIZ \TEXT\
LIST>
MT RQSMSG,<Request queued
>
MT CLSMSG,<F(ile),Z(ero),R(ecall),D(elete),L(ist),C(heck),W(ait),H(elp)
*>
MT TAPMSG,<Tape ID:>
MT MNYMSG,<?Too many files. Last processed is >
MT FILMSG,<Files: >
MT MISMSG,<?Can't find file >
MT PROTMS,<?Protection failure >
;MT PNDMSG,<Pending:
;>
MT CERMSG,<?Syntax error
>
MT CMMMSG,<
?Have Operator start OMOUNT, then try again.
>
MT IOMSG1,<?System I/O Error at >
MT IOMSG2,< Status = >
REPEAT 0,<
MT MOHELP,<
/WRITE:YES Permit writing (Default for Disk)
/WRITE:NO Prohibit writing (Default for Tapes)
/VID:'text' Visual IDentification (REQUIRED for Tapes)
/ACTIVE Mount Disk in user's active search list
/PASSIVE * Mount Disk in user's passive search list
/CREATE * Permit creation of files on this structure
/NOCREATE Prohibit creation of files on this structure
/WAIT Wait on pending MOUNT requests
/NOWAIT Bypass Waiting... msg if to be queued
/CHECK Check pending MOUNT requests
/PAUSE Pause before queueing MOUNT requests
/HELP Type this text (* = Default)
/MULTI * Allow multiple access - Disk only
/SINGLE Restrict access by other users - Disk only
/WENABL Same as /WRITE:YES
/WLOCK Same as /WRITE:NO
/RONLY Same as /WRITE:NO
>
MT DIHELP,<
/RELEASE * Release control of the device - Default for Tape
/KEEP Retain control of the device for further use
/REASSIGN:n Reassign the device to Job 'N'
/UNLOAD Unload the device - Default for Tape
/REWIND Rewind the device
/STAY Do not reposition the device - Default for Disk
/WAIT Wait on pending DISMOUNT requests
/CHECK Check pending DISMOUNT requests
/REMOVE Same as /UNLOAD
/PAUSE Pause before queueing DISMOUNT requests
/HELP Type this text (* = Default)
>
>; END REPEAT 0
MT NORMMS,<?No room in queue, try again later>
MT STAR,<
*>
MT NOLOGM,< Must not be a logical name>
MT NOWRTM,< Must not be locked or write prot.>
IFN MNTSW,<
MT FMDM,<FILE, MOUNT or DISMOUNT
*>
MT ARMM,< already mounted on >
MT UNMM,< not mounted
>
MT NRM,< not ready
>
MT PBWM,<Pause...(^C to quit, <CR> to queue request)
>
MT LEQM,<QUOTA.SYS LOOKUP Failure>
MT TMRM1,< has only >
MT TMRM2,< unit(s)
>
MT NSAM,<Other users--Cannot Single-Access
>
MT SABJM,<?Single Access by Job >
MT NQFM,<LOOKUP Failure for AUXACC.SYS
>
MT CRQFM,<QUOTA.SYS or AUXACC.SYS Read error
>
MT WFVNQM,<QUOTA.SYS Wrong format version
>
MT NEQFM,<No entry in QUOTA.SYS or AUXACC.SYS
>
MT SWERM1,<?Undefined switch />
SWERM2==SWERM1
MT NEDAM,<Not enough drives available
>
MT IMNTM,<Structure already mounted
[Mount count = >
MT IMNTM1,<]
>
MT OPRDY,<Request queued to ready drives
>
MT MNTD,< Mounted
>
MT OPMNT,<Request queued to mount units
>
MT DISDON,< Dismounted
>
MT DNAM,< Not available>
MT WKTM,< Wrong controller type>
MT WUTM,< Wrong unit type>
MT IKON,< Illegal drive name>
MT KDNAM,< No drive available on this controller>
MT DINCOM,< Dismount incomplete>
MT NDFD,<%No Device for Directory>
MSG100: PUSHJ P,SIXTTY
PTYPE < Not available>
MSG101: MOVE M,LOGNAM
PUSHJ P,SIXTTY
PTYPE < Logical name in use (Name ignored)>
MSG102: TYPE <Can't OPEN >
MSG103: MOVE M,B
HRRZ N,(P)
PUSHJ P,SIXTTY
TYPE < at loc >
JRST MSG902
MSG104: TYPE <Can't Assign >
JRST MSG103
MSG105: MOVE M,DVVNAM
PUSHJ P,SIXTTY
XTYPE < Not Assigned> ;QUIT IMMEDIATELY
MSG110: MOVEI M,RQSMSG ;POINT AT 'REQUEST QUEUED' MSG
PJRST MSGTTY ;TYPE IT & RETURN
MSG111: PTYPE <Waiting...2 ^C's to Exit>
REPEAT 0,< ;THE FOLLOWING 2 MESSAGES HAVE BEEN SUGGESTED
;AS ALTERNATIVES TO THE RELEASED MESSAGES
MSG112: TYPE <None pending for your job [> ;TYPE START OF MSG
HLRZ N,USRPPN ;GET PROJECT #
PUSHJ P,OCTPRT ; & TYPE IT
PUSHJ P,COMMA ;OUTPUT A COMMA
HRRZ N,USRPPN ;GET PROG #
PUSHJ P,OCTPRT ; & TYPE IT
PUSHJ P,RBRKET ;TYPE A "]"
PJRST CRLF ;END THE MSG
MSG113: PTYPE <System can't handle request at this time.
Please be patient and the problem will be corrected momentarily>
>; END REPEAT 0
MSG112: PTYPE <None pending for your job>
MSG113: PTYPE <No Opr. job for requests>
MSG900: HRRZ N,(P)
NEVMSG: ;'SHOULDNT GET HERE' ERRORS
MSG901: TYPE <System error at loc >
MSG902: HRRZS N
PUSHJ P,OCTPRT
PJRST CRLF
ERR101: XTYPE <?Requires Device Name
>
ERR103: XTYPE <?Program not privileged - Ignored!
>
IFE LOGSW, <
ERR104: XTYPE <?Requires Logical Name
>
>; END OF IFE LOGSW
ERR105: XTYPE <? /REELID Requires Magtape
>
ERR110: XTYPE <?FILE R illegal if DSK: contains no UFD
>
ERR120: TYPE <?Unable to create request in queue, ENTER code = >
MOVE N,B
PUSHJ P,OCTPRT
PUSHJ P,CRLF
JRST TERMIN
ERR130: XTYPE <?Ersatz devices not mountable
>
ERR503: XTYPE <?Monitor must be 5.03 or later
>
ERR900: PUSHJ P,MSG900
JRST ERR912
NEVERR: ;'NEVER GET HERE' ERRORS GET HERE
ERR901: PUSHJ P,MSG901
JRST ERR912
ERR911: TYPE <Operator not on duty!
>
TRNN F,R.SHOV ;IS USER SHOVING IT?
JRST ERR912 ;NO, GO SEND 'MOUNT INCOMPLETE'
TYPE <Shoving request anyway...
>
POPJ P, ;AND RETURN TO CALLER
DISFI1: MOVE M,CMDFSN ;GET TYPED-IN FILE STR NAME
MOVEM M,DVVNAM ;STORE AS NAME TO OUTPUT IN ERR912/ERR913
;FALL THRU TO ERR912
ERR912: MOVEI IO,W.TTY ;POINT AT I/O RTN
PUSHJ P,QUEST
ERR913: MOVE M,DVVNAM
PUSHJ P,SIXTTY
MOVE M,CMDCHR ;GET COMMAND TYPEFLAG
CAIN M,"M" ;TEST FOR 'MOUNT'
JRST E913M ; YES, JUMP
CAIN M,"D" ;TEST FOR 'DISMOUNT'
JRST E913D ; YES, JUMP
XTYPE < FILE request not queued
>
E913D: MOVEI M,DINCOM ;POINT AT 'DISMOUNT INCOMPLETE'
JRST MSGRET ;GO TYPE & EXIT
E913M: ;HERE FOR MOUNT FAILURE
XTYPE < Mount Incomplete
>
> ;END CONDITIONAL ON MNTSW
IFE MNTSW,<
MT NODISM,<
DISMOUNT is not a legal command>
MT NOMNTM,<
MOUNT is not a legal command>
> ;END CONDITIONAL ON MNTSW
GOHELP: OUTPUT TTY, ;DUMP TTY OUTPUT BUFFER (JUST IN CASE)
PUSHJ P,.HELPR## ;CALL HELPER TO TYPE THE FACT FILE
JRST MONRET ;GO EXIT NOW
LOGERR: MOVEI M,[ASCIZ /? Must be logged in/] ;POINT AT MESSAGE
;FALL THRU TO TYPE IT & EXIT
GOAWAY:
MSGRET:
ERREXI:
ALLFIN:
ERRRET: PUSHJ P,MSGTTY
ALLOVR:
MONRET: OUTPUT TTY,
TERMIN: RESET ;RESET ALL I/O
SKIPN NOTLOG ;TEST FOR LOGGED IN
JRST GOEXIT ; YES, THEN EXIT
TTCALL 13,0 ;CLEAR ^O IF ON
JFCL ; (JUST IN CASE)
OUTSTR KJOB ;TYPE '.KJOB'
LOGOUT ; & DIE
KJOB: ASCIZ /
.KJOB
./ ;TRADITIONAL LOGOUT MSG
GOEXIT: ;HERE IF NORMAL EOJS
EXIT 1,
EXIT
SUBTTL STORAGE, ET AL.
;DATA
MFDPPN: XWD 1,1
SYSPPD: XWD 1,4 ;SYS PPN FOR LEVEL D
FSFPPN: XWD 1,2 ;FAILSA PPN (1,2)
IFN MNTSW,<
HLISTI: IOWD 200,B.USR
0
KONSIX: SIXBIT .DR.
SIXBIT .FH.
SIXBIT .DP.
SIXBIT .MF.
>
NAMFIL: SYSFIL ;OMOUNT PROG.NAMES TO LOOK FOR
NAMMNT: SYSMOU
NAMOMO: SYSOMO
PDP: IOWD 20,PDLIST
;LITERALS
XLIST
LIT
LIST
IFN DBUGSW, <
PATCH.: BLOCK 50 ;PATCH AREA FOR DEBUGGING
>; END OF IFN DBUGSW
HIEND: ;END OF HIGH SEG
;VARIABLES
UU(HLIST,2)
U(IORPPN)
U(CMDPPN)
U(CMDSTR)
U(FS1PPN)
U(SYSPPN)
U(CMDCHR)
U(CMDNAM)
U(COMCNT)
U(USRPPN)
U(JOBNO)
U(SAVED)
U(MONVER)
U(STATES)
U(STDDEV)
U(DEFDEV) ;DEFAULT F.S.
U(DEFPPN) ;DEFAULT PPN FOR FILE CMDS
U(TAPEID)
U(TTYLIN)
UU(FILBLK,DTDNFI+2)
UU(FILDEV,DTDNFI+2)
UU(FILBEX,DTDNFI+2)
UU(FILPPN,DTDNFI+2) ;STORAGE FOR FILE PPN'S
U(FILBKE)
IFNDEF SRCBUF,<
UU(SRCBUF,EXLLEN)>
UU(PDLIST,20)
UU(MYCMD,1) ;NAME OF CURRENTLY GENERATED CMD FILE
UU(INTBLK,4) ;PARM BLOCK FOR ERROR INTERCEPTING
UU(DMSPOS,1) ;CODE FOR DISMOUNT POSITIONING
; -1=NOT SPEC, 0=STAY, 1=REWIND, 11=UNLOAD
UU(TOJOB,1) ;CODE FOR DISMOUNT DISPOSITION
; -1=F/S, 0=RELEASE, +N=ASSIGN TO THAT JOB (INCL [SELF])
IFN LOGSW, <
UU(GENLOG,1) ;CODE FOR LOGICAL NAME
; -1=GENERATED, 0=USER SPEC'D, +1=PHYSICAL USED
>; END OF IFN LOGSW
UU(DIRPPN,1) ;PPN FOR DEFAULT DIRECTORY PATH
UU(PTHPRM,PTHLEN) ;PARAMETER AREA TO READ DEFAULT DIR PATH
IFN SPONUL, <
UU(DVVTYP,1) ;STORAGE FOR DEVTYP UUO RESULTS
>; END OF IFN SPONUL
UU(IDIDIT,1) ;1=OMOUNT HAD TO BE USED;0=UMOUNT DID REQ. ITSELF
UU(NOTLOG,1) ;0=LOGGED IN, -1=NOT LOGGED IN
UU(CHKFLG,1) ;0=NOT /CHECK (FILE C), -1=/CHECK AND [1,2] OR [2,5]
UU(FILSTR,3) ;PARM BLOCK FOR JOBSTR UUO (1ST WD = 0 IF NOT BEING USED)
IFN FTFACT, <
UU(FACT,1) ;DAEMON (.FACT) REQUEST CODE (= 3)
UU(F.HEAD,1) ;DAEMON FACT ENTRY - HEADER W/ CODE 271 (MOUNT ENTRY)
UU(F.PPN,1) ; - USER'S PPN
UU(F.DATE,1) ; - CURRENT DATE & TIME (SUPPLIED BY DAEMON)
UU(F.QUE,1) ; - 0-11 QUEUE NAME (UM,UD), 12-17 STATION #,
; 18-35 APR0 SERIAL #
UU(F.TIME,1) ; - (CPU TIME) ZERO BECUASE ALREADY ACCOUNTED FOR
UU(F.KCS,1) ; - (KILO-CORE-TICKS) ZERO BECAUSE ALREADY ACCOUNTED FOR
UU(F.RCT,1) ; - (DISK BLOCKS READ) ZERO BECAUSE ALREADY ACCOUNTED FOR
UU(F.WCT,1) ; - (DISK BLOCKS WRITTEN) ZERO BECAUSE ALREADY ACCOUNTED FOR
UU(F.DEV,1) ; - DEVICE NAME USED BY THE REQUEST
UU(F.SEQ,1) ; - (SEQUENCE #) NOW ZERO
UU(F.UNIT,1) ;SPOOLER UNITS - SET LH TO 1 FOR OMOUNT COMPATABILITY
F.SIZE==F.UNIT-FACT+1 ;LTH OF DAEMON PARM BLOCK
>; END OF IFN FTFACT
;BUFFER AREAS
UU(WH.CMD,3)
UU(WH.TTY,3)
UU(RH.TTY,3)
UU(RH.CMU,3)
UU(RH.CMD,3)
UU(B.TTY,2*30)
UU(B.CMD,205)
UU(B.CMU,205)
IFN MNTSW,<
U(CMDFSN)
U(PHYNAM)
U(DVVNAM)
FSNAME==DVVNAM
U(DEVMOD)
U(REELID)
VIDL==<VIDMAX+4>/5
UU(VID,VIDL)
U(VIDK)
U(LOGNAM)
U(LOOPX1)
U(ENTSIZ)
U(FSCLAS)
U(OWNPPN)
U(TEMBP)
LASTUN=TEMBP
U(NUMDRV)
U(NUMREQ)
U(SAVDRV)
U(UDREQ)
UU(USRDRV,8*MAXKON)
UU(PACKID,8*MAXKON)
UU(PKCLAS,8*MAXKON)
UU(DROFFL,8*MAXKON)
UU(DRIVE,8*MAXKON)
UU(DRVSTT,8*MAXKON)
> ;END CONDITIONAL ON MNTSW
IFN PURESW, <RELOC>
VAR ;JUST IN CASE
IFN PURESW, <RELOC>
IFN PURESW, <
UU(LOWEND,0) ;ADDR OF END OF LOW SEGMENT, +1
>; END OF IFN PURESW
RELOC
LOEND: END UMOUNT