1 ! ! U M O U N T 2! PROGRAM : UMOUNT 5! VERSION : V06C 6! EDIT : 03 7! EDIT DATE : 30-NOV-77 10 NOEXTEND 11 ! ! C O P Y R I G H T ! Copyright (C) 1976, 1977 by ! Digital Equipment Corporation, Maynard, Mass. ! ! ! This software is furnished under a license and may be used and ! copied only in accordance with the terms of such license and ! with the inclusion of the above copyright notice. This ! software or any other copies thereof may not be provided or ! otherwise made available to any other person. No title to and ! ownership of the software is hereby transferred. ! ! The information in this software is subject to change without ! notice and should not be construed as a commitment by Digital ! Equipment Corporation. ! ! DIGITAL assumes no responsibility for the use or reliability ! of its software on equipment that is not supplied by DIGITAL. ! !******************************************************************* 20 ! ! M O D I F I C A T I O N H I S T O R Y ! VER/ED EDIT DATE REASON 100 ! ! G E N E R A L D E S C R I P T I O N ! The UMOUNT program enables any user to logically MOUNT ! and DISMOUNT disks. In addition, the user may use UMOUNT ! to assign magtape units to a job, set the default ! labelling format, and set the density/parity. ! Magtape options are as follows: ! MOUNT ! JOB:n Assign the tape to job n ! (User must be privileged) ! DOS DOS/BATCH Labelling ! ANSI ANSI Standard Form ! (The Volume ID should be specified with an ANSI tape) ! RONLY MOUNT the tape read only ! DENSITY:nnnn Set the tape density to nnnn BPI ! PARITY:xxxx Set the tape parity to xxxx ! ! DISMOUNT ! UNLOAD Rewind the tape and atke it off-line ! ! ! Disk options are as follows: ! MOUNT ! LOCK Disk is to be kept LOCKed ! LOGICAL:lognam MOUNT the disk with logical id ! 'lognam' ! NOLOGICAL Don't enter the PACKID in the ! Logical Name table. ! RONLY MOUNT the disk read only ! PRIVATE Really meaningless in this version ! UTILTY must be used to MOUNT (DISMOUNT) a ! Public pack as a Private pack ! ! DISMOUNT NOTE**** Non-Privileged users must ! specify the PACKID when DISMOUNTing a disk*** 300 ! ! I / O C H A N N E L S ! CHANNEL # USED FOR ! 1 THE DEVICE BEING MOUNTED 400 ! ! V A R I A B L E D E F I N I T I O N S ! NAME USED FOR ! ! C$ Command String ! C2% CHAIN entry variable ( flag) ! D$ Utility Variable ! D% DEVPTR ! D1$ Device designator ! D8% Density/Parity word ! E$ Error text ! E% Error code ! E0$ Error message 'header' ! E0% Error Variable ! E1% Error level ! F$ Utility String ! I$ Version-Edit ! J% Loop counter ! L%() File Name String Scan array ! L$ Tape label string ! M%() Monitor tables array ! N0$ Used to verify PACKID ! N1$ Used to verify PACKID ! P% Scan pointer (/) ! P$() Parity values decode array ! P1% DOS/ANSI indicator ! P8% Project # of current job ! R8$ CHAIN entry String Variable ! R9$ CHAIN entry Variable - program to CHAIN to ! R9% CHAIN entry Variable ! S$ List of Operand Separators (:) ! S8% Magtape status variable ! T$ List of terminators (/) ! U8% Tape unit number ! V$ Identification string ! ALL W'S Temporary local work variables ! ! The remaining variables, those beginning with Y or Z, ! are used for compatibility with other programs and are ! explained in the various subroutines and functions. 800 ! ! F U N C T I O N / S U B R O U T I N E D E S C . ! FUNC./SUBR. LINE USE ! ! FNF0$(Z$,Z0$) 15200 Do a Filename String Scan on ! a Logical name in Z$ ! FNP$(F$,Z$) 15100 General Filename String Scan on F$ ! FNM$(Z$,Z0$) 15010 Checks input operand for match with ! legal responses ! FND1$(Z$) 15020 Density-Parity compatability check ! FNP1$(Z$) 15030 Parity-Density compatability check ! FNP9%(D8%) 15300 Set magtape density/parity ! ! Lines 11000-11250 Magtape format and density/parity setup ! Lines 10010-10270 Switch Processor 900 ! ! D I M E N S I O N S T A T E M E N T S 910 DIM Z%(31%),L%(31%) ! FILE NAME STRING SCAN ARRAYS 920 DIM M%(30%) ! MONITOR TABLES ARRAY, USED IN MAGTAPE SUBROUTINE 940 DIM P$(1%) ! PARITY DECODE ARRAY 999 ! ! M A I N C O D I N G A R E A 1000 ON ERROR GOTO 19500 ! SET UP STANDARD ERROR TRAP 1010 I$="UMOUNT V06C-03" ! SET UP HEADER LINE 1040 I$=I$+CHR$(9%)+CHR$(9%) +CVT$$(RIGHT(SYS(CHR$(6%)+CHR$(9%)+CHR$(0%)),3%),4%) +CHR$(13%)+CHR$(10%) +"Please use the 'MOUNT' or 'DISMOUNT' Command" \ PRINT I$ \ GOTO 32767 ! RUN ENTRY IS ILLEGAL. 1050 ON ERROR GOTO 19500 \ P8%=PEEK(PEEK(PEEK(520%)+8%)+24%) \ P8%=SWAP%(P8%) AND 255% \ T$="/" \ S$=":" \ P$(0%)="ODD" \ P$(1%)="EVEN" \ Y7%(0%)=129% \ P%=INSTR(1%,C$,"/") \ F$=RIGHT(C$,P%) IF P% \ C$=LEFT(C$,P%-1%) IF P% \ C$=FNP$(C$,"") \ GOTO 19010 IF E% \ Y7%(0%)=Y7%(0%) AND L%(15%) \ Y8%=4096% \ IF Y7%(0%)=0% THEN E$="Illegal device" \ E%=2048% \ GOTO 19090 ! GET/SAVE THE USER'S PROJECT #. ! IF ANY SWITCHES, SPLIT THEM AWAY FROM REST OF COMMAND STRING ! GET LINE AND INTERPRET. 1060 IF ASCII(F$) THEN P%=1% \ IF ASCII(F$)=ASCII("/") THEN GOSUB 10000 \ GOTO 19090 IF E% \ GOTO 1060 ! PROCESS SWITCHES, IF ANY 1080 CHANGE C$ TO Z% \ IF Z%(26%)=0% AND Y7%(0%)=1% THEN E$="No disk device unit number specified" \ E%=2048% \ GOTO 19090 ! ERROR IF DISK AND NO UNIT NUMBER 1085 D1$=CVT%$(Z%(24%)+SWAP%(Z%(23%))) \ D1$=D1$+NUM1$(Z%(25%)) IF Z%(26%)<>0% \ U8%=0% \ U8%=Z%(25%) IF Z%(26%)<>0% \ Z%(1%)=6% \ Z0%=Z%(29%)+SWAP%(Z%(30%)) \ Z%=Z%(15%)+SWAP%(Z%(16%)) \ V$=RAD$(Z%(7%)+SWAP%(Z%(8%)))+RAD$(Z%(9%)+SWAP%(Z%(10%))) IF Z0% AND 1% \ IF (Z0% AND 16%) OR ((Z0% AND 1%)<>0% AND (Z9%(0%) AND 4%)) THEN E$="Syntax Error" \ E%=2048% \ GOTO 19090 ! SETUP DEVICE DESIGNATOR AND ID ! ERROR IF EXTENSION PRESENT OR DOS AND FILENAME PRESENT 1090 IF Z9%(0%) AND 16% AND Y6%=4% THEN ON ERROR GOTO 19020 \ OPEN D1$+":" AS FILE 1% \ Y8%=MAGTAPE(1%,0%,1%) \ CLOSE 1% ! IF WE'RE DISMOUNTING A MAGTAPE AND /UNLOAD SPECIFIED, ! REWIND AND UNLOAD IT FIRST. 1095 GOTO 4000 IF Y7%(0%)=1% AND (Y6%=4% OR Y6%=1%) ! GOT TO CHECK FOR PUBLIC DISK, IF IT'S DISK. 1100 GOTO 1120 UNLESS Y7%(0%)=1% AND Y6%=1% \ Z%(Z1%)=0% FOR Z1%=11% TO 16% \ GOTO 1120 UNLESS (Z9%(0%) AND 480%)<>0% \ Z%(18%)=Z%(18%) OR 160% IF (Z9%(0%) AND 256%)<>0% \ Z%(18%)=Z%(18%) OR 192% IF (Z9%(0%) AND 128%)<>0% \ IF (Z9%(0%) AND 96%)<>0% THEN Z%(11%),Z%(12%)=255% \ IF (Z9%(0%) AND 32%)<>0% THEN D$=FNP$(Y$(1%),D$) \ Z%(Z1%+6%)=L%(Z1%) FOR Z1%=7% TO 10% ! IF WE'RE MOUNTING A DISK: ! CLEAR LOGICAL NAME ASSOCIATED BYTES. ! TURN ON PROPER BITS FOR THE FOLLOWING ! IF THE USER SPECIFIED THE SWITCH: ! READ ONLY ! PRIVATE ! NOLOGICAL ! LOGICAL:name 1120 Z%(2%)=(10%*((Y6% AND 17%)<>0%)+11%*(Y6%=4%))* ((Z% AND 128%)=128%)-3%*((Z% AND 1%)=1%) \ Z%(3%)=((Y6%=8%)*6%-(Y6% AND 6%))*(Z%=1%) ! SET UP PROPER COMMAND FOR DISK. 1130 IF Z%=128% THEN Z%(7%)=-VAL(Y$(1%))*(Y6%=16%) \ Z%(Z1%)=0% FOR Z1%=8% TO 22% \ IF (Z9%(0%) AND 12%) OR (Z0% AND 1%) THEN D$=FNP$("DOS",D$) IF Z9%(0%) AND 4% \ D$=FNP$("ANS",D$) IF (Z9%(0%) AND 8%) OR (Z0% AND 1%) \ Z%(11%)=L%(7%) \ Z%(12%)=L%(8%) ! IF MAGTAPE THEN ! SET UP FOR ASSIGN AND ! IF /DOS OR /ANSI OR VID PRESENT THEN ! SET UP APPROPRIATE ASSIGNMENT 1150 CHANGE Z% TO D$ \ ON ERROR GOTO 19080 \ D$=SYS(D$) \ ON ERROR GOTO 19500 ! DO THE SYS() CALL. 1155 IF (Y7%(0%)=128%) AND (Y6%=1%) THEN E%=0% \ GOSUB 11000 \ GOTO 19030 IF E% ! GO COMPLETE MAGTAPE MOUNT PROCEDURE 1160 IF Y6%=1% AND Z9%(0%) AND 1% THEN Y6%=16% \ GOTO 1120 ! SET UP THE RE-ASSIGN IF /JOB:N. 1170 IF Y6%=1% AND (Z9%(0%) AND 2%)=0% AND Z% AND 1% THEN Y6%=8% \ GOTO 1120 ! DO AN UNLOCK IF DISK AND NOT /LOCK. 1180 IF Y6%=4% AND Z% AND 1% THEN Y6%=2% \ GOTO 1120 ! DO THE DISMOUNT IF THAT WAS IT (FIRST PASS DID THE LOCK). 1190 I$ = SYS(CHR$(6%)+CHR$(22%)+CHR$(-1%)+CHR$(0%)+ "SYSLOG" + STRING$(10%,0%)+CVT%$(L0%)+C0$) \ GOTO 32710 4000 GOTO 4050 IF LEFT(D1$,2%)="DB" AND P8%<>1% \ L0%=L0% OR 2% IF LEFT(D1$,2%)="DB" \ ON ERROR GOTO 19080 \ OPEN D1$+":" FOR INPUT AS FILE 1% \ GET #1%, RECORD 1% \ FIELD #1,2% AS D$,2% AS D$ \ IF CVT$%(D$)<>-1% THEN E%=16384% \ E$="Disk does not have RSTS File-Structure" \ GOTO 19090 ! OPEN DISK AND GET THE MFD BLOCK ! (LOGICAL BLOCK #1). ! CHECK FOR -1 IN WORD 1. 4010 FIELD #1%,10% AS D$,2% AS D$,2% AS N0$,2% AS N1$ \ IF (SWAP%(CVT$%(D$)) AND 16384%)=0% THEN E%=16384% \ E$="Disk Pack is Public" \ GOTO 19090 ! CHECK FOR PUBLIC DISKS; CANNOT MOUNT THEM USING UMOUNT. 4020 GOTO 4040 IF P8%=1% OR Y6%<>4% \ IF (Z0% AND 1%)=0% THEN E%=16384%+128% \ E$="Pack ID must be specified" \ GOTO 19030 ! NON-PRIVILEGED USER MUST GIVE THE ! PACK ID ON A DISMOUNT. 4030 IF V$<> (RAD$(SWAP%(CVT$%(N0$)))+RAD$(SWAP%(CVT$%(N1$)))) THEN E%=16384%+128%+20% \ GOTO 19030 ! SPECIFIED USER PACK ID MUST MATCH THE REAL PACK ID. 4040 CLOSE 1% \ GOTO 1100 4050 E%=16384% \ E$="RP04 PACKS MAY NOT BE MOUNTED OR DISMOUNTED." \ GOTO 19090 9000 DATA "*STARTSW" 9010 DATA "JOB", 3,4134, 1,128,0,1, 242,0,1,"", 0,0,0, "LOCK", 4,4097, 2, 1,0,1,1565,0,0,"", 0,0,0, "DOS", 3,4097, 3,128,0,1, 250,0,0,"", 0,0,0, "ANSI", 3,4097, 4,128,0,1, 246,0,0,"", 0,0,0, "UNLOAD", 3,4097, 5,128,0,4,1775,0,0,"", 0,0,0, "LOGICAL", 3,4226, 6, 1,0,1,1629,0,1,"", 0,0,0, "NOLOGICAL", 3,4097, 7, 1,0,1,1597,0,0,"", 0,0,0, "PRIVATE", 3,4097, 8, 1,0,1,1565,0,0,"", 0,0,0, "RONLY", 2,4097, 9,129,0,1, 32,0,0,"", 0,0,0, "DENSITY", 3,4138,10,128,0,1, 242,0,2,"8001600",1,4,0, "PARITY", 3,4106,11,128,0,1, 242,0,3,"ODDEVEN",1,4,0 9020 DATA "*ENDSW", 0,0,0,0,0,0,0,0,0,"",0,0,0 10000 ! ! S U B R O U T I N E S 10010 ! SUBROUTINE TO PROCESS SWITCHES IN COMMAND STRINGS ! ! IMPLICIT PARAMETERS: ! F$ COMMAND STRING SWITCHES ! P8% PROJECT NUMBER OF CURRENT ACCOUNT ! P% POSITION IN F$ AT WHICH TO START SCAN ! IT IS ASSUMED THAT P% POINTS TO A / UPON ENTRY. ! Y6% CURRENT COMMAND TYPE (BIT ENCODED - DEPENDS ON ! PROGRAM) ! Y7%(0%),Y7%(1%) ! DEVICE WORD FOR CURRENT FILE - BIT SET ! CORRESPONDING TO CURRENT DEVICE. ! Y7%(0%) - INPUT DEVICE ! Y7%(1%) - OUTPUT DEVICE ! (1 = DISK, 128 = MAGTAPE) ! Y8% INTEGER SHOWING PHASE - FOR PURPOSES OF ! DOCUMENTATION THE PHASES WILL BE DEFINED AS ! INPUT, OUTPUT, AND JOB. Y8% VALUES ARE: ! 4096 INPUT PHASE ! 8192 OUTPUT PHASE ! 16384 JOB PHASE ! Z8%(0%),Z8%(1%) ! CUMULATIVE SWITCH FORBID WORDS.* ! Z9%(0%),Z9%(1%) ! CUMULATIVE SWITCH SPECIFICATION WORDS.* ! ! USES: Z$ SWITCH NAME ! Z% NUMBER OF CHRS FOR UNIQUENESS ! Z0% SWITCH DECODE/CHECK WORD ! Z1% SWITCH BIT TO CHECK/SET (0-31) ! Z2%(0%),Z2%(1%) ! DEVICE TYPES ALLOWED WITH SWITCH ! Z3% COMMAND TYPES ALLOWED WITH SWITCH ! Z4%(0%),Z4%(1%) ! SWITCHES PROHIBITED WITH THIS SWITCH ! Y% ENTRY TO EFFECT IN SWITCH ARRAY ! Z0$ LEGAL SWITCH OPERAND VALUES ( IF THERE ARE EXPLICIT ONES) ! Z0%(0%),Z0%(1%),Z0%(2%) ! POSITIONS WITHIN Z0$ OF THE START OF EACH LEGAL STRING ! ! RETURNS ON SUCCESSFUL COMPLETION: ! E% 0% ! E$ SWITCH STRING ! Y$(Y%) OPERAND OF SWITCH ! Z8%(0%),Z8%(1%) ! BIT(S) SET SHOWING WHICH SWITCHES ARE FORBIDDEN ! BY THE SWITCHES SPECIFIED SO FAR ! Z9%(0%),Z9%(1%) ! BIT SET SAYING THIS SWITCH WAS SPECIFIED ! THE BITS IN Z8%(),Z9%() HAVE THE FOLLOWING MEANING: ! BIT SWITCH SPECIFIED (Z9%())/PROHIBITED (Z8%()) ! 0 JOB: ! 1 LOCK ! 2 DOS ! 3 ANSI ! 4 UNLOAD ! 5 LOGICAL: ! 6 NOLOGICAL ! 7 PRIVATE ! 8 RONLY ! 9 DENSITY ! 10 PARITY ! ! RETURNS ON ERROR COMPLETION: ! Y$(Y%)\ ! Z8%(0%),Z8%(1%) \ UNCHANGED FROM BEFORE CALL ! Z9%(0%),Z9%(1%) \ ! E$ SWITCH WHICH IS IN ERROR (PLUS RSTS/E ERROR MESSAGE, ! IF ANY) ! ! * THESE VALUES SHOULD BE INIT'D TO 0 BEFORE DOING A PASS ON ! THE COMMAND STRING IN THIS PHASE. 10100 RESTORE \ Z$="" \ READ Z$ UNTIL Z$="*STARTSW" ! SET UP FOR SWITCH. 10110 READ Z$,Z%,Z0%,Z1%,Z2%(0%),Z2%(1%),Z3%,Z4%(0%),Z4%(1%),Y%, Z0$,Z0%(0%),Z0%(1%),Z0%(2%) \ GOTO 10270 IF Z$="*ENDSW" \ GOTO 10110 IF LEFT(Z$,Z%)<>MID(F$,P%+1%,Z%) ! SCAN FOR SWITCH. 10120 E%=0% \ Z%=Z%+1% \ Z1$=MID(F$,P%+Z%,1%) \ E%=Z% IF INSTR(1%,S$,Z1$) IF ASCII(Z1$) 10130 IF (E%+INSTR(1%,T$,Z1$))=0% THEN IF MID(Z$,Z%,1%)<>Z1$ THEN 10110 ELSE GOTO 10120 ELSE Z%=Z%+1% UNTIL INSTR(1%,T$,MID(F$,P%+Z%,1%))<>0% IF E% \ Z8%=P%+Z% \ E$=MID(F$,P%+1%,Z8%-P%-1%) ! SCAN FOR END OF SWITCH, MAKING SURE IT MATCHES, AND HOLD ! SWITCH STRING IN E$, COLON POSITION IN E%. ! T$ - LIST OF TERMINATORS - EG, "/" ! S$ - LIST OF OPERAND SEPARATORS - EG, ":" 10150 Z9%=0% \ Z1%=Z1%-1% \ Z4%=Z1%/16% \ Z5%=Z1% AND 15% \ GOTO 10110 IF (Z0% AND Y8%)=0% OR ((-(E%<>0%)+1%) AND Z0%)=0% OR (Y6% AND (Y6% AND Z3%)=0%) OR (Z9%(Z4%) AND 2%^Z5%)<>0% OR (Z8%(Z4%) AND 2%^Z5%)<>0% ! THIS LINE VERIFIES: ! PROPER PHASE ! ":" PRESENT/NOT PRESENT ! COMMAND TYPE OKAY ! SWITCH NOT ALREADY PROHIBITED ! SWITCH NOT ALREADY SPECIFIED 10170 GOTO 10110 IF ((Y7%(Z%) AND Z2%(Z%))=0% AND Z2%(Z%)<>0%) OR (Z4%(Z%) AND Z9%(Z%))<>0% FOR Z%=0% TO 1% \ F$=RIGHT(F$,Z8%) ! THIS LINE VERIFIES: ! DEVICE-SWITCH COMPATIBILITY ! SWITCH PROHIBITIONS DO NOT CONFLICT ! AND REMOVES SWITCH FROM INPUT STRING. ! NOTE: IF ANY OF THE VERIFICATIONS RETURN A CONFLICT, THE ! SWITCH SCAN CONTINUES TO FIND THE SWITCH. 10190 Z0%=(Z0% AND 4092%)/4% \ Z$=RIGHT(E$,E%+1%) \ Z$=Z0$ IF E%=0% \ GOTO 10230 UNLESS Z0% ! SET UP FOR OPERAND PROCESSING. 10200 Z9%=0% \ ON ERROR GOTO 10260 \ Z9%=8192% IF VAL(Z$)>VAL(Z0$) IF Z0% AND 1% AND P8%<>1% \ Z$=NUM1$(VAL(Z$)) IF Z0% AND 8% \ Z$=FNF0$(Z$,Z0$) IF Z0% AND 32% \ Z$=FNM$(Z$,Z0$) IF Z0% AND 2% \ GOTO 10250 IF Z9% ! CHECK ENTERED OPERAND FOR: ! USER PRIVELEDGED IF REQUIRED ! LEGAL INTEGER ! LEGAL FILE SPECIFICATION ! MATCHES LEGAL VALUES ! EXIT IF ERROR 10210 Z$=FND1$(Z$) IF Z1%=10% \ Z$=FNP1$(Z$) IF Z1%=11% \ GOTO 10250 IF Z9% ! SPECIAL CHECKS ARE MADE IF SWITCH IS DENSITY OR PARITY ! EXIT IF ERROR 10230 Y6%=Y6% AND Z3% \ Y7%(Z%)=Y7%(Z%) AND Z2%(Z%) UNLESS Z2%(Z%)=0% FOR Z%=0% TO 1% \ Z8%(Z%)=Z8%(Z%) OR Z4%(Z%) FOR Z%=0% TO 1% \ Z9%(Z4%)=Z9%(Z4%) OR 2%^Z5% ! THIS LINE SETS: ! CURRENTLY PERMITTED COMMAND(S) ! CURRENTLY PERMITTED DEVICE(S) ! CURRENTLY FORBIDDEN SWITCHES ! CURRENT SWITCHES 10250 Y$(Y%)=Z$ IF (Z0% OR E%) AND Z9%=0% \ E%=Z9% \ ON ERROR GOTO 19500 \ RETURN 10260 Z9%=8192% OR ERR \ RESUME 10250 ! RSTS TRAPPED AN ERROR IN THE OPERAND RE-PACK. 10270 E%=0% \ E%=8192% IF Y8% AND 12288% \ P%=P%+1% IF Y8% AND 16384% \ RETURN ! IF NOT FOUND, AND NOT JOB SEARCH, ERROR. 10999 ! ! SUBROUTINE TO SET THE MAGTAPE LABELLING FORMAT AND DENSITY/PARITY 11000 P1%=0% \ E1%=3% \ ON ERROR GOTO 11200 \ GOTO 11030 IF (Z9%(0%) AND 12%) \ CHANGE SYS(CHR$(6%)+CHR$(-3%)) TO M% \ D%=M%(7%)+SWAP%(M%(8%)) \ CHANGE SYS(CHR$(6%)+CHR$(-12%)) TO M% \ M%(J%)=M%(J%)+SWAP%(M%(J%+1%)) FOR J%=5% TO 23% STEP 2% \ FOR J%=(M%(5%)+M%(9%)) TO (M%(23%)-2%) STEP 2% \ D$=CVT%$(SWAP%(PEEK(J%))) \ GOTO 11010 UNLESS (D$="MM") OR (D$="MT") \ P1%=PEEK(PEEK(D%+J%-M%(5%))+2%*U8%) \ P1%=SWAP%(PEEK(P1%+24%)) AND 255% \ GOTO 11020 11010 NEXT J% ! THE ABOVE LOOP DETERMINES FROM THE MONITOR POINTERS DEVPTR (D%), ! DEVNAM (M%(5%)), DEVOKB (M%(9%)), DEVSYN (M%(23%)) WHETHER THE ! FORMAT OF THE MOUNTED TAPE IS DOS OR ANSI 11020 IF P1%=0% THEN PRINT "Magtape is in DOS format" ELSE PRINT "Magtape is in ANSI format" ! PRINT THE "DOS" OR "ANSI" MESSAGE ! LINES 11000-11020 ARE EXECUTED ONLY IF THE USER DID NOT SPECIFY FORMAT 11030 OPEN D1$+":" AS FILE 1% \ E1%=1% \ S8%=MAGTAPE(7%,0%,1%) \ D8%=800%+800%*((S8% AND 8%)/8%) \ D8%=800%-800%*(Y$(2%)="1600") IF Z9%(0%) AND 512% \ D8%=D8% OR 16384% IF Y$(3%)="EVEN" IF Z9%(0%) AND 1024% \ D8%=D8% OR (S8% AND 2048%)*8% UNLESS Z9%(0%) AND 1024% \ W%=FNP9%(D8%) \ IF W%=0% THEN E$="Density/Parity setting cannot be set on this drive" \ E%=16384%+64% \ GOTO 11205 ! OPEN MAGTAPE NON-FILESTRUCTURED ! SET THE DENSITY/PARITY AS SPECIFIED, FILLING IN THE DEFAULTS ! IF NOT LEGAL, SETUP MESSAGE AND EXIT 11040 E1%=2% \ W%=MAGTAPE(3%,0%,1%) \ E1%=1% \ ON ERROR GOTO 11195 \ GET #1% ! REWIND MAGTAPE AND READ RECORD 11050 ON ERROR GOTO 11200 \ W%=MAGTAPE(3%,0%,1%) \ S8%=MAGTAPE(7%,0%,1%) \ W%=(S8% AND 2048%)*8% \ W%=W%+800%+800%*((S8% AND 8%)/8%) \ IF W%<>D8% THEN E%=13% \ GOTO 11205 ! IF THE DENSITY/PARITY CHANGED FROM THE SPECIFIED ON THE READ ! THEN ITS AN ERROR 11090 GOTO 11120 IF ((Z9%(0%) AND 8%)=0%) AND (P1%=0%) AND ((Z0% AND 1%)=0%) \ FIELD #1%, RECOUNT AS L$ \ IF MID(L$,1%,4%)<>"VOL1" THEN E$="Invalid ANSI magtape label" \ E%=16384%+64% \ GOTO 11205 ! ILLEGAL ANSI TAPE LABEL 11100 IF (Z0% AND 1%)=0% THEN PRINT "%Volume ID should be specified on ANSI magtape mount" \ GOTO 11120 ! VOLUME ID SHOULD BE SPECIFIED ON ANSI MAGTAPE MOUNT 11110 IF V$<>MID(L$,5%,6%) THEN E$="Volume IDs don't match" \ E%=16384%+64% \ GOTO 11205 ! THE USER SPECIFIED VOLUME ID MUST MATCH THE REAL VOLUME ID 11120 IF Z9%(0%) AND 256% THEN IF S8% AND 1024% THEN PRINT "Tape is mounted write locked" ELSE E$="Tape is not write locked" \ E%=16384%+64% \ GOTO 11205 ! IF READ ONLY SPECIFIED THEN ! IF WRITE LOCKED THEN ! PRINT MESSAGE ! ELSE SETUP ERROR MESSAGE AND EXIT 11130 IF (Z9%(0%) AND 256%)=0% THEN IF S8% AND 1024% THEN E$="Tape is write locked" \ E%=16384%+64% \ GOTO 11205 ! IF READ ONLY IS NOT SPECIFIED THEN ! IF WRITE LOCKED THEN ! SETUP ERROR MESSAGE AND EXIT 11140 PRINT "DENSITY IS"+NUM$(W% AND 16383%)+", PARITY IS " +P$((W% AND 16384%)/16384%) IF (Z9%(0%) AND 1536%)=0% ! PRINT DENSITY/PARITY MESSAGE IF D/P NOT USER SPECIFIED 11150 ON ERROR GOTO 11235 \ CLOSE 1% ! SET TEMPORARY ERROR TRAP AND CLOSE CHANNEL 11190 ON ERROR GOTO 19500 \ RETURN ! RESET ERROR TRAP AND EXIT 11195 GOTO 11200 UNLESS ERR=11% \ FIELD #1%,RECOUNT AS L$ \ LSET L$=STRING$(RECOUNT,0%) \ RESUME 11050 ! TRAP FOR READ ERRORS ! NULL FILL BUFFER IF RECORD READ EOF 11200 E%=ERR UNLESS E% \ RESUME 11205 11205 ON ERROR GOTO 11235 \ ON E1% GOTO 11210,11220,11230 ! GOTO CORRECT STEP IN ERROR WRAPUP ROUTINE 11210 W%=MAGTAPE(3%,0%,1%) ! REWIND TAPE 11220 CLOSE 1% ! CLOSE CHANNEL 11230 W$=SYS(CHR$(6%)+CHR$(11%)+STRING$(20%,0%)+LEFT(D1$,2%)+CHR$(U8%) +CHR$(255%)) \ GOTO 11250 ! DEASSIGN DEVICE 11235 E%=ERR UNLESS E% \ RESUME 11240 11240 GOTO 11230 IF ERL=11150 \ W%=ERL/10%-1120% \ ON W% GOTO 11220,11230,11250 ! RESUME AT THE NEXT STEP OF THE ERROR WRAPUP ROUTINE 11250 E$="" UNLESS E%=16384%+64% \ E%=(16384%+64%) OR E% \ GOTO 11190 ! FINISH ERROR WRAPUP AND GO 15000 ! ! F U N C T I O N S 15010 DEF FNM$(Z$,Z0$) \ FNM$=Z$ \ Z%=INSTR(1%,Z0$,Z$) \ Z6%=0% \ WHILE Z6%<3% AND Z%<>Z0%(Z6%) \ Z6%=Z6%+1% \ NEXT \ IF (Z6%=3%) OR (Z%=0%) THEN Z9%=8192% \ FNM$="" \ E$="Illegal Operand - "+Z$ 15015 FNEND ! CHECKS TO SEE IF THE INPUT OPERAND MATCHES ONE OF THE LEGAL ! RESPONSES GIVEN IN THE DEFAULT STRING (Z0$) 15020 DEF FND1$(Z$) \ Z$="" IF VAL(Z$)=1600% IF Z9%(Z4%) AND 1024% \ FND1$=Z$ \ Z9%=8192% IF Z$="" \ E$="1600 BPI Illegal" IF Z$="" \ FNEND ! IF THE PARITY HAS BEEN SPECIFIED, MAKE SURE THE DENSITY ! IS APPROPRIATE IN VIEW OF THAT PARITY 15030 DEF FNP1$(Z$) \ Z$="" IF VAL(Y$(2%))=1600% IF Z9%(Z4%) AND 512% \ FNP1$=Z$ \ Z9%=8192% IF Z$="" \ E$="Illegal Parity Switch" IF Z$="" \ FNEND ! IF THE DENSITY HAS BEEN SPECIFIED, MAKE SURE THE PARITY ! IS APPROPRIATE IN VIEW OF THAT DENSITY 15100 DEF FNP$(F$,Z$) ! FUNCTION: FNP$ DO (NEW) FNS ON STRING ! PARAMETERS: F$ STRING TO SCAN ! Z$ DUMMY STRING VARIABLE TO USE ! RETURNS: FNP$ SCANNED STRING IN BYTES 1-30. ! DEVICE (STATUS) WORD IN BYTES 13-14. ! E% ERR VALUE, IF ANY. ! E$ STRING DESCRIBING ERROR ! USES: L%(30%) FOR FNS FORMATTED STRING. ! Z% FOR POSITION OF DELIMITER ! NOTE: IF FIRST REAL BYTE IS A DELIMITER, RETURNS 30 BYTES OF ! 0 PLUS ORIGINAL STRING. IF ANY ERROR, RETURNS E% SET AND ONLY ! ORIGINAL STRING. 15140 ON ERROR GOTO 15170 \ Z$=SYS(CHR$(6%)+CHR$(-10%)+F$) \ CHANGE Z$ TO L% \ L%(13%)=STATUS AND ((L%(30%) AND 16%)<>0%) \ L%(14%)=SWAP%(L%(13%)) \ L%(15%)=-(2%^((L%(13%) AND 255%)/2%))*(L%(13%)<>0%) \ L%(16%)=SWAP%(L%(15%)) \ L%(1%)=0% UNLESS L%(29%)+SWAP%(L%(30%)) \ CHANGE L% TO Z$ ! DO THE FNS; SET UP DEVICE (STATUS) WORD; MAKE IT A STRING. 15160 FNP$=Z$ \ ON ERROR GOTO 19500 \ FNEND ! RETURN FNS STRING. 15170 E%=(E% AND NOT(63%)) OR ERR \ E$=F$ \ Z%=0% \ Z$="" \ RESUME 15160 ! IF FILENAME ERROR, RETURN ERR AND ORIGINAL STRING. 15200 DEF FNF0$(Z$,Z0$) ! FUNCTION: FNF0$ DO FNS ON LOGICAL NAME ! PARAMETERS: Z$ STRING TO SCAN ! Z0$ DUMMY STRING TO USE. ! RETURNS: FNF0$ ORIGINAL STRING IF NO ! ERROR, NULL STRING IF ! ANY ILLEGALITY . 15210 ON ERROR GOTO 15280 \ Z0$=SYS(CHR$(6%)+CHR$(-10%)+Z$) \ CHANGE Z0$ TO L% \ GOTO 15290 UNLESS (L%(29%)+SWAP%(L%(30%)))=1% ! SET UP FILENAME ERROR TRAP. ! ANYTHING OTHER THAN FILENAME (NO WILDCARDS) IS ILLEGAL. 15220 FNF0$=Z$ ! SET THE FUNCTION. 15230 ON ERROR GOTO 19500 ! RESET ERROR TRAP. 15240 FNEND 15280 RESUME 15290 15290 Z9%=8192%+64% \ E$="Illegal Logical Name - "+Z$ \ GOTO 15220 ! TRAPPED ERROR OR ILLEGALITY. 15300 DEF FNP9%(D8%) \ FNP9%=0% ! SET THE DENSITY/PARITY TO D8% ! RETURNS: 0% IF SETTING IS ILLEGAL FOR DRIVE ! -1% IF DENSITY/PARITY HAS BEEN SET ! S8% AS MAGTAPE STATUS WORD (ALWAYS) 15310 W2%=0% \ S8%=MAGTAPE(7%,0%,1%) \ W2%=-1% IF (D8% AND 16384%)<>0% AND (S8% AND 4096%)=0% \ W2%=-1% IF D8%=1600% AND (S8% AND 16%)=0% \ W1%=((D8% AND 16384%)/16384%)+8192% \ W1%=W1%+8% IF (S8% AND 4096%)<>0% \ W1%=W1%+256% IF (D8%=1600%) \ W1%=W1%+12% IF (S8% AND 4096%)=0% AND (D8% AND 800%)=800% \ S8%=MAGTAPE(6%,W1%,1%) \ S8%=MAGTAPE(7%,0%,1%) \ GOTO 15350 IF W1%<>((S8% AND 24576%)/8192%)*4%+ (S8% AND 2048%)/2048% UNLESS (W1% AND 256%)=(S8% AND 8%)*32% \ FNP9%=-1% UNLESS W2% ! GET THE MAGTAPE STATUS INTO S8% ! IF THE DENSITY IS ILLEGAL FOR THE DRIVE, EXIT ! IF OK, CALCULATE THE 'MODE' VALUE AND SET THE DENSITY/PARITY ! SET THE RETURN VALUE AND EXIT 15350 FNEND 19010 E%=2048% OR E% \ E$=C$ \ GOTO 19090 ! SET UP FOR ERROR IN FNP$. 19020 E%=16512% OR ERR \ E$="" \ GOTO 19040 ! CATCH ERRORS IN /UNLOAD. 19030 ! ! E R R O R H A N D L E R 19040 E0$="" \ E0$="?PROCESS " IF E% AND 16384% \ E0$="?SWITCH " IF E% AND 8192% \ E0$="?DECODE " IF E% AND 2048% \ E0$=E0$+"ERROR IN " 19050 E0$=E0$+"MOUNT" IF E% AND 64% \ E0$=E0$+"DISMOUNT" IF E% AND 128% \ E0$=E0$+"LOCK" IF E% AND 256% \ E0$=E0$+"UNLOCK" IF E% AND 512% \ E0$=E0$+"REASSIGN" IF E% AND 1024% 19060 E0$=E0$+" - "+CVT$$(RIGHT(SYS(CHR$(6%)+CHR$(9%)+CHR$(E% AND 63%)),3%),4%) IF E% AND 63% \ E0$=E0$+" - "+E$ IF LEN(E$) 19070 PRINT E0$ \ GOTO 32700 ! PRINT OUT THE ERROR; CLOSE UP. 19080 E%=16384% OR ERR UNLESS D7%=-1% \ IF Y6%=16% AND D7%=0% THEN D7%=-1% \ W$=SYS(CHR$(6%)+CHR$(11%)+STRING$(20%,0%)+LEFT(D1$,2%) +CHR$(U8%)+CHR$(255%)) ! IF ERROR DURING REASSIGN THEN DEASSIGN DEVICE UNLESS A DEASSIGN ! HAS ALREADY BEEN ATTEMPTED 19085 E$="" \ IF (E% AND 63%)=18% THEN E%=16384% \ IF Y6%=4% THEN E$="Disk Pack is Public" ELSE E$="Disk is Already MOUNTed" ! NO SYSTEM ERROR FOR THIS. 19090 E%=Y6%*64% OR E% \ RESUME 19030 ! TRAP HERE FOR SYS() CALL ERRORS. 19500 ! T R A P F O R U N H A N D L E D E R R O R S 19510 RESUME 19520 ! CLEAR ERROR 19520 T$=RIGHT(SYS(CHR$(6%)+CHR$(9%)+CHR$(ERR AND 63%)),4%) \ T$="?UNEXPECTED ERROR - "+T$+" AT LINE"+ NUM$(ERL)+" - FATAL" \ PRINT T$ \ GOTO 32710 30000 ! ! ! C C L E N T R Y ! M O U N T / D I S M O U N T L E G A L 30010 E0%=2% ! SET UP AS CCL ENTRY. 31000 ! ! C H A I N E N T R Y 31010 E0%=4% UNLESS E0% \ PRINT \ C$=SYS(CHR$(7%)) ! SET UP AS CHAIN ENTRY UNLESS IT WAS A CCL ENTRY. 31020 IF E0%<>4% THEN 31030 ELSE C2%=INSTR(1%,C$,CHR$(13%)) ! CHECK FOR IF CHAIN ENTRY. 31025 IF C2%=0% THEN 31050 ELSE R9$=LEFT(C$,C2%-1%) \ R9%=CVT$%(RIGHT(C$,C2%+1%)) \ C$=RIGHT(C$,C2%+3%) \ C2%=INSTR(1%,C$,CHR$(13%)) \ C2%=LEN(C$)+1% UNLESS C2% \ R8$=RIGHT(C$,C2%+1%) \ C$=LEFT(C$,C2%-1%) ! IF IT'S A CHAIN, GET OUT THE DATA. 31030 C0$=C$ \ L0%=5% \C$=CVT$$(C$,1%+4%+8%+16%+32%+64%+128%+256%) \ FOR J%=5% TO 1% STEP -1% \ IF LEFT(C$,J%)=LEFT("MOUNT",J%) THEN C$=CVT$$(RIGHT(C$,J%+1%),2%) \ Y6%=1% \ GOTO 1050 IF C$<>"" \ GOTO 31050 31040 NEXT J% \ FOR J%=8% TO 1% STEP -1% \ IF LEFT(C$,J%)=LEFT("DISMOUNT",J%) THEN C$=CVT$$(RIGHT(C$,J%+1%),2%) \ Y6%=4% \ GOTO 1050 IF C$<>"" \ E%=128% \ GOTO 31050 31045 NEXT J% ! THESE 2 LOOPS DETERMINE IF WE HAVE A RECOGNIZED ! CCL COMMAN (ONLY 'MOUNT', 'DISMOUNT' OR PART THEREOF). ! NOTE THAT A LEGAL COMMAND WITH NO OTHER INFO ! WILL RESULT IN AN ERROR. 31050 E%=64% UNLESS E%<>0% \ E%=2048%+E% \ C$="Missing Argument" IF C$="" \ E$="Illegal Command - "+C$ \ GOTO 19030 ! UNRECOGNIZED OR INCOMPLETE COMMAND. 32700 ! ! P R O C E S S I N G C O M P L E T E ! W H A T N E X T ? 32710 CLOSE Z% FOR Z%=1% TO 12% \ GOTO 32767 IF E0% AND 2% \ C$=SYS(CHR$(8%)+CHR$(E%)+R8$) \ CHAIN R9$ R9% ! CLOSE UP, RETURN CHAIN IF NEC. 32767 END