.TITLE AVD - ASSIGN VIRTUAL DISK .SBTTL AVD - TITLE PAGE .IDENT /V02.05X/ ; ; ************************************************************************ ; * ; THIS PROGRAM IS PROVIDED ON AN "AS IS" BASIS ONLY. DIGITAL EQUIPMENT * ; COMPUTER USER'S SOCIETY, DIGITAL EQUIPMENT CORPORATION, MONSANTO, AND * ; THE AUTHOR DISCLAIM ALL WARRANTIES ON THE PROGRAM, INCLUDING WITHOUT * ; LIMITATION, ALL IMPLIED WARRANTIES OF MERCHANTABLITY AND FITNESS. * ; * ; FULL PERMISSION AND CONSENT IS HEREBY GIVEN TO DECUS AND TO THE DECUS * ; SPECIAL INTEREST GROUPS TO REPRODUCE, DISTRIBUTE, AND PUBLISH AND * ; PERMIT OTHERS TO REPRODUCE IN WHOLE OR IN PART, IN ANY FORM AND * ; WITHOUT RESTRICTION, THIS PROGRAM AND ANY INFORMATION RELATING THERETO * ; * ; ************************************************************************ ; ; ASSIGN VIRTUAL DISK DEVICE TO SPECIFIED FILE. ; ; VERSION: V02.05X ; ; ****UPDATE THE MESSAGE AFTER LABEL 1300$ WHEN VERSION IS UPDATED ; ; AUTHOR: R.W. STAMERJOHN MAPC 19-MAR-79 ; ; MODIFICATION HISTORY: ; ; V01.01 RWS 31-MAR-79 CHANGE PROTECTION TO [RW,RW,,] ; ; V01.02 RWS 31-MAR-79 ALLOW DOUBLE-WORD CREATION SIZE ; ; V02.00X LMF 15-APR-80 REPORT NAME OF ALLOCATED FILES, ; RX01 CREATION SIZE, PLACEMENT CONTROL ; .PAGE .SBTTL AVD - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; SYMBOLIC DEFINITIONS. ; .MCALL HDRDF$ ;DEFINE TASK HEADER OFFSETS HDRDF$ .MCALL UCBDF$ ;DEFINE UCB OFFSETS UCBDF$ ; ; DIRECTIVE MACROS. ; .MCALL DIR$ ;ISSUE DIRECTIVE .MCALL ALUN$S ;ASSIGN LUN .MCALL EXST$S ; EXIT SYSTEM WITH STATUS .MCALL GMCR$ ;GET MCR COMMAND LINE .MCALL QIOW$ ;ISSUE QIO AND WAIT .MCALL SVTK$S ;SETUP SST VECTOR TABLE ; ; CSI MACROS. ; .MCALL CSI$ ;DEFINE CSI OFFSETS CSI$ .MCALL CSI$SW,CSI$SV,CSI$ND ;SWITCH TABLE MACROS .MCALL CSI$1,CSI$2 ;PARSE COMMAND LINE ; ; FCS MACROS. ; .MCALL FDOF$L ;DEFINE FCS OFFSETS FDOF$L .MCALL NBOF$L ;DEFINE FNB OFFSETS NBOF$L .MCALL FCSBT$ ;DEFINE FCS BIT MASKS. FCSBT$ .MCALL FDBDF$ ;DEFINE FDB .MCALL FDAT$A ;DEFINE FILE ATTRIBUTES .MCALL FDRC$A ;DEFINE RECORD ACCESS .MCALL FDBK$A ;DEFINE BLOCK ACCESS .MCALL FDOP$A ;DEFINE OPEN CHARACTERISTICS .MCALL FSRSZ$ ;DEFINE FSR REGION .MCALL NMBLK$ ;DEFINE DEFAULT FILENAME BLOCK ; ; OTHER MACROS. ; .MCALL CALL,CALLR,RETURN ;SUBROUTINE MACROS ; ; GLOBAL DECLARATIONS: ; .GLOBL AVD ;TASK ENTRY ; ; GLOBAL REFERENCES: ; ; SYSTEM LIBRARY ROUTINES, SYMBOLS. ; .GLOBL .DD2CT ;DECIMAL TO DOUBLE-WORD .GLOBL .FINIT ;INITIALIZE FSR REGION .GLOBL .PARSE ;FILENAME PARSE .GLOBL .ASCPP ; CONVERT DIRECTORY STRING TO BINARY .GLOBL .PPASC ; AND CONVERSE .GLOBL .RDFUI ; READ DEFAULT TASK UIC .GLOBL $EDMSG ; TEXT FORMATTER ; .GLOBL $COTB ;CONVERT OCTAL TO BINARY .GLOBL IO.CRE ;CREATE FILE .GLOBL IO.ENA ;ENTER NAME IN DIRECTORY .GLOBL IO.FNA ;FIND NAME IN DIRECTORY .GLOBL IO.ACW ;ACCESS FILE FOR WRITE .GLOBL IO.DAC ;DEACCESS FILE .GLOBL IO.WAT ;WRITE ATTRIBUTES .GLOBL IO.DEL ;DELETE FILE .GLOBL IO.WVB ;WRITE VIRTUAL BLOCK .GLOBL IS.SUC ;I/O SUCCESS CODE .GLOBL $DSW ;DIRECTIVE STATUS WORD ; ; RSX11M SYSTEM ROUTINES, VARIABLES. ; .GLOBL $ALOCB ;ALLOCATE CORE BLOCK .GLOBL $DEACB ;DEALLOCATE CORE BLOCK .GLOBL $HEADR ;CURRENT TASK HEADER ADDRESS .PAGE .SBTTL AVD - MACROS ; ; DEFINE ERROR DECLARATION MACRO. ; .MACRO FATAL MSG TRAP 1 .ASCIZ #MSG# .EVEN .ENDM FATAL ; ; DEFINE SYSTEM STATE MACRO. ; .MACRO SYSTEM ADR EMT 376 .WORD ADR .ENDM SYSTEM ; ; DEFINE FILES-11 QIO MACRO. ; .MACRO F11QIO DPB,ADR DIR$ #DPB .IF NB ADR BCS ADR CMPB #IS.SUC,IOSTAT BNE ADR .ENDC .ENDM F11QIO .PAGE .SBTTL AVD - LOCAL DATA ; ; LOCAL SYMBOLS: ; ; LOGICAL UNITS/EVENT FLAGS. ; TSTLUN = 1 ;AVD WORKING LUN TTYLUN = 2 ;TERMINAL I/O LUN FILLUN = 3 ;FILE I/O LUN EV.QIO = 1 ;QIO WAIT EVENT FLAG ; ; SWITCH BIT MASKS. ; FL.CRE = 1 ;CREATE FILE FL.RK5 = 2 ;CREATE RK05 IMAGE FL.RON = 4 ;READ-ONLY ACCESS FL.RX1 = 10 ; CREATE RX01 IMAGE FL.LST = 400 ; LIST FILE SPEC OF ALLOCATED UNIT FL.IDV = 1000 ; REPORT PROGRAM VERSION NUMBER FL.PLA = 2000 ; SPECIFY FILE LOCATION ; EX.ALL = 20 ; PLACEMENT CONTROL ENABLE BIT ; ; LOCAL DATA: ; ; DIRECTIVES. ; GETCMD: GMCR$ ;GET COMMAND LINE CREDPB: QIOW$ IO.CRE,FILLUN,EV.QIO,,IOSTAT,, ENADPB: QIOW$ IO.ENA,FILLUN,EV.QIO,,IOSTAT,,<0,0,0,0,0,FILFDB+F.FNB> DELDPB: QIOW$ IO.DEL,FILLUN,EV.QIO,,IOSTAT,, FNADPB: QIOW$ IO.FNA,FILLUN,EV.QIO,,IOSTAT,,<0,0,0,0,0,FILFDB+F.FNB> ACWDPB: QIOW$ IO.ACW,FILLUN,EV.QIO,,IOSTAT,, DACDPB: QIOW$ IO.DAC,FILLUN,EV.QIO,,IOSTAT,, WATDPB: QIOW$ IO.WAT,FILLUN,EV.QIO,,IOSTAT,, ERRDPB: QIOW$ IO.WVB,TTYLUN,EV.QIO,,,, .NLIST BEX ; ; ERROR MESSAGE STRING. ; ERRMSG: .ASCIZ <15><12>/AVD -- / ERRSTR: .BLKB 100. .EVEN ; ; FILE REPORT FORMAT STRINGS ; FMT1: .ASCIZ /VIRTUAL DISK LINKED TO: %2A%O:/ FMT2: .ASCIZ /%X%2S%I%N/ RDONLY: .ASCIZ /[READONLY]/ .LIST BEX ; ; STT VECTOR TABLE. ; .EVEN SSTTBL: .WORD 0 ;ODD ADDRESS .WORD 0 ;MEMORY PROTECTION .WORD 0 ;T-BIT TRAP OR BPT .WORD 0 ;IOT TRAP .WORD 0 ;RESERVED INSTRUCTION .WORD 0 ;NON-RSX EMT INSTRUCTION .WORD ERRSRV ;TRAP INSTRUCTION SSTSIZ = <.-SSTTBL>/2 ; ; CSI CONTROL BLOCK. ; CSIBLK: .BLKB C.SIZE ;DEFINE CSI EXTENSION BLOCK .EVEN ; ; CSI SWITCH TABLES. ; SWTTAB: CSI$SW CR,FL.CRE,,SET,,CREVAL CSI$SW RK,FL.RK5,,SET,, CSI$SW RO,FL.RON,,SET,, CSI$SW RX,FL.RX1,,SET,, CSI$SW DX,FL.RX1,,SET,, CSI$SW LI,FL.LST,,SET,, CSI$SW ID,FL.IDV,,SET,, CSI$SW PL,FL.PLA,,SET,,PLAVAL CSI$ND CREVAL: CSI$SV ASCII,STRING,8. CSI$ND PLAVAL: CSI$SV ASCII,PLASTR,8. CSI$ND ; ; FAKE FILE FDB (FOR PARSING PURPOSES). ; FILFDB: FDBDF$ ;DEFINE FDB BLOCK. FDAT$A R.FIX,,512. ;DEFINE FILE ATTRIBUTES FDRC$A FD.RWM ;DEFINE RECORD ACCESS FDBK$A ;DEFINE BLOCK ACCESS FDOP$A FILLUN ;DEFINE OPEN ACCESS ; ; DEFAULT FILENAME BLOCK. ; FILDFB: NMBLK$ ,DSK,,SY,0 ;DEFAULT FILENAME ; ; PLACEMENT CONTROL PREFIX FOR CREATE LIST (MUST BE FIRST) ; PLALST: .BYTE 16,6 .WORD PLACE ; ; CREATE WRITE ATTRIBUTE LIST. ; CRELST: .BYTE 02,02 ;WRITE PROTECTION .WORD PROATT ; .BYTE 04,16 ;WRITE FCS ATTRIBUTES .WORD FILFDB ; .BYTE 05,12 ;WRITE FILENAME ATTRIBUTES .WORD FILFDB+F.FNB+N.FNAM ; .BYTE 0,0 ;END-OF-LIST PROATT: .WORD 177714 ;FILE PROTECTION [RW,RW,,] ; ; PLACEMENT CONTROL BLOCK ; PLACE: .BYTE 0,0 ; PLACEMENT BY: EXACT LBN, NO REPORT .WORD 0 ; HIGH BLOCK NUMBER .WORD 0 ; LOW BLOCK NUMBER .BLKW 4 ; INFO RETURN AREA ; ; READ ATTRIBUTE LIST. ; ACWLST: .BYTE -11,12 ;READ STATISTICS BLOCK .WORD STAATT ; .BYTE 0,0 ;END-OF-LIST STAATT: .BLKB 12 ;STATISTICS BLOCK ; ; WRITE ATTRIBUTE LIST. ; WATLST: .BYTE 03,01 ;WRITE USER CHARACTERISTICS .WORD WATATT ; .BYTE 0,0 ;END-OF-LIST WATATT: .BYTE 300 ;MARK CONTIGIOUS, LOCKED .EVEN ; ; OTHER VARIOUS BUFFERS. ; IOSTAT: .WORD 0,0 ;I/O STATUS BLOCK STRING: .BLKB 8. ;DISK BLOCK STRING BLKNUM: .BLKW 2 ;DISK BLOCK NUMBER PLASTR: .BLKB 8. ; DISK LOCATION STRING PLABLK: .BLKW 2 ; DISK LOOCATION NUMBER UCBADR: .WORD 0 ;VD: UCB ADDRESS EXTADR: .WORD 0 ;VIRTUAL EXTENSION BLOCK ADDRESS UIC: .WORD 0 ; SAVED UIC FOR CURRENT FILE ERRCOD: .WORD EX$SUC ; EXIT WITH STATUS CODE ; ; FSR REGION ; FSRSZ$ 0 ;NO RECORD I/O .SBTTL AVD * MAIN-LINE TASK CODE ; ;+ ; THIS SECTION CONTAINS THE ENTRY LEVEL CODE FOR THE AVD TASK. ; IN GENERAL, THE STEPS PERFORMED ARE AS FOLLOWS: ; ; 1. GET THE COMMAND LINE. ; 2. PARSE COMMAND INTO ELEMENTS. ; 3. ALLOCATE EXTENSION BLOCK IF VDN: IS AVAILABLE. ; 4. IF NEW FILE, CREATE FILE OF SPECIFIED SIZE. ; 5. ASSIGN FILE TO VIRTUAL DISK. ; ; INPUT: ; ; MCR COMMAND LINE IN FORM SHOWN BELOW. ; ; AVD VDN:=FILE[/SW] ; ; VDN: VIRTUAL DISK TO ASSIGN. ; FILE FILE TO BE USED AS VIRTUAL DISK ; /SW SWITCHES - ONE OF FOLLOWING ; ; /CR:N CREATE FILE WITH N BLOCKS ; /RX CREATE FILE WITH 494. BLOCKS (RX01) ; /DX DITTO ; /RK CREATE FILE WITH 4800 BLOCKS (RK05) ; /RO ALLOW ONLY READ ACCESS ; /LI LIST OUT FILE SPEC OF THIS UNIT ; /ID REPORT PROGRAM VERSION NUMBER ; /PL:N CREATE FILE AT LOGICAL BLOCK "N" ; ; OUTPUT: ; ; VIRTUAL DISK ASSIGNED TO FILE OR ERROR MESSAGE ; OUTPUT TO USER'S TERMINAL. ; ;- ; AVD:: ;REF. LABEL. ; ; SETUP SST VECTOR TABLE AND FSR REGION FOR PROCESSING. ; SVTK$S #SSTTBL,#SSTSIZ ;SETUP SST VECTOR TABLE CALL .FINIT ;INITIALIZE FSR REGION ; ; ZERO VARIOUS VARIABLES. ; CLR BLKNUM ;CLEAR NUMBER OF BLOCK TO ALLOCATE CLR UCBADR ;CLEAR VDN: UCB ADDRESS CLR EXTADR ;CLEAR EXTENSION BLOCK ADDRESS ; ; GET COMMAND LINE, ERROR IF NONE AVAIABLE. ; DIR$ #GETCMD ;GET MCR COMMAND LINE BCC 1000$ ; IF CC - OK, CONTINUE FATAL ;DECLARE ERROR ; ; SETUP FOR COMMAND PARSING. ; 1000$: MOV #GETCMD+G.MCRB,R1 ;GET START OF COMMAND LINE MOV $DSW,R2 ;GET LENGTH OF COMMAND LINE 1100$: CMPB #' ,(R1)+ ;SCAN FOR FIRST BLANK CHARACTER BEQ 1200$ ; IF EQ - FOUND CHARACTER SOB R2,1100$ ;LOOP THROUGH ENTIRE LINE FATAL ;DECLARE ERROR ; ; CHECK COMMAND FOR SYNTACICAL CORRECTNESS. ; 1200$: DEC R2 ;CORRECT LINE LENGTH CSI$1 #CSIBLK,R1,R2 ;CHECK COMMAND LINE SYNTAX BCC 1300$ ; IF CC - OK, CONTINUE FATAL ;DECLARE ERROR ; ; CHECK ON PROGRAM VERSION REPORT ; 1300$: CSI$2 #CSIBLK,OUTPUT,#SWTTAB ;GET OUTPUT SPECIFICATION BCS 1310$ ; IF CS - BAD, ERROR BIT #FL.IDV,CSIBLK+C.MKW1 ; IDENT SWITCH GIVEN? BEQ 1305$ ; IF NOT, CONTINUE FATAL ; ; GET OUTPUT FILENAME. MUST ONLY BE VDX:. ; 1305$: BITB #CS.NMF!CS.DIF!CS.MOR,C.STAT(R0) ;IS OUTPUT ONLY DEVICE? BNE 1310$ ; IF NE - NO, ERROR BITB #CS.DVF,C.STAT(R0) ;WAS A DEVICE SPECIFIED? BEQ 1310$ ; IF EQ - NO, ERROR MOV C.DEVD+2(R0),R0 ;GET DEVICE FIELD ADDRESS CMPB #'V,(R0)+ ;CHECK FIRST CHARACTER OF NAME BNE 1310$ ; IF NE - BAD, ERROR CMPB #'D,(R0)+ ;CHECK SECOND CHARACTER OF NAME BNE 1310$ ; IF NE - BAD, ERROR CALL $COTB ;CONVERT UNIT NUMBER CMPB #':,R2 ;CHECK FOR PROPER TERMINATOR BEQ 1400$ ; IF EQ - OK, CONTINUE 1310$: FATAL ; ; ASSIGN VIRTUAL DISK TO LUN. ; 1400$: ALUN$S #TSTLUN,#"VD,R1 ;ASSIGN VIRTUAL DISK BCC 1410$ ; IF CC - OK, CONTINUE FATAL ;DECLARE ERROR ; ; CHECK FOR FILE SPECIFICATION FOR THIS UNIT IF ATTACHED ; 1410$: BIT #FL.LST,CSIBLK+C.MKW1 ; LIST SWITCH GIVEN BEQ 1500$ ; IF EQ, NO MUST BE REAL ATTACH CALLR 5000$ ; GO DO LISTING ; ; PARSE FILENAME SPECIFICATION. ; 1500$: MOV #CSIBLK,R0 ; RESTORE CSI BLOCK ADDRESS BITB #CS.EQU,C.STAT(R0) ;IS THERE AN EQUAL SIGN? BNE 1505$ ; IF NE - YES, CONTINUE FATAL ;DECLARE ERROR ; 1505$: CSI$2 #CSIBLK,INPUT,#SWTTAB ;GET INPUT SPECIFICATION BCS 1510$ ; IF CS - BAD, ERROR BITB #CS.MOR!CS.WLD,C.STAT(R0) ;CHECK FOR NO MORE/NO WILD-CARDS BEQ 1600$ ; IF EQ - OK, CONTINUE 1510$: FATAL ;DECLARE ERROR ; ; GET UIC FOR FILE ; 1600$: BITB #CS.DIF,C.STAT(R0) ; ANY DIRECTORY GIVEN BEQ 1610$ ; IF EQ,NO - GO USE DEFAULT MOV R0,R2 ; COPY CSI BLOCK ADDRESS ADD #C.DIRD,R2 ; POINT TO DIRECTORY DESCRIPTOR MOV #UIC,R3 ; POINT TO SAVE LOCATION CALL .ASCPP ; PARSE DIRECTORY STRING HE GAVE BR 1620$ ; CONTINUE 1610$: CALL .RDFUI ; READ DEFAULT UIC MOV R1,UIC ; AND SAVE WHAT WE GOT ; ; SETUP FILENAME BLOCK. ; 1620$: MOV #FILFDB,R0 ;GET FDB ADDRESS MOV #FILFDB+F.FNB,R1 ;GET FNB ADDRESS MOV #CSIBLK+C.DSDS,R2 ;GET DATASET DESCRIPTOR ADDRESS MOV #FILDFB,R3 ;GET DEFAULT FILENAME BLOCK CALL .PARSE ;PARSE FILENAME INTO FILENAME BLOCK BCC 2000$ ; IF CC - OK, CONTINUE FATAL ;DECLARE ERROR ; ; ALLOCATE EXTENSION BLOCK AND ASSIGN TO VIRTUAL DISK. ; 2000$: SYSTEM 2020$ ;;ENTER SYSTEM STATE MOV $HEADR,R5 ;;GET OUR TASK HEADER MOV H.LUN(R5),R5 ;;GET VD: UCB ADDRESS TST U.NXT(R5) ;;IS VCB ALLOCATED? BNE 2010$ ;; IF NE - YES, ERROR MOV R5,UCBADR ;;MARK GOOD UCB FOUND MOV #X.LGTH,R1 ;;SET EXTENSION BLOCK LENGTH CALL $ALOCB ;;ALLOCATE EXTENSION BLOCK BCS 2010$ ;; IF CS - NO POOL, ERROR MOV R0,U.NXT(R5) ;;ALLOCATE UCB MOV R0,EXTADR ;; AND RETURN BLOCK ADDRESS 2010$: RETURN ;;RETURN TO USER STATE 2020$: TST UCBADR ;WAS DISK ALLOCATED? BNE 2030$ ; IF NE - YES, CONTINUE FATAL ;DECLARE ERROR 2030$: TST EXTADR ;WAS EXTENSION BLOCK ALLOCATED? BNE 3000$ ; IF NE - YES, CONTINUE FATAL ;DECLARE ERROR ; ; IF /CR, /RX, /DX OR /RK SPECIFICED, CREATE NEW FILE. ; 3000$: BIT #FL.CRE,CSIBLK+C.MKW1 ;IS FILE CREATION REQUESTED? BEQ 3003$ ; IF EQ - NO, SKIP MOV #STRING,R4 ;GET START OF SIZE STRING MOV R4,R5 ;COPY START OF STRING MOV #8.,R3 ;SET SIZE OF STRING 3001$: TSTB (R4)+ ;SCAN FOR NULL CHARACTER BEQ 3002$ ; IF EQ - FOUND END OF STRING SOB R3,3001$ ;LOOP TILL DONE BR 3030$ ; IF NO NULL, BAD SIZE STRING 3002$: SUB #STRING+1,R4 ;GET LENGTH OF STRING MOV #BLKNUM,R3 ;GET STORAGE SPACE CALL .DD2CT ;CONVERT NUMBER TO BINARY BCS 3030$ ; IF CS - CONVERSION ERROR MOV (R3)+,R1 ;GET HIGH PART OF NUMBER TSTB -1(R3) ;CHECK IF TOO LARGE BNE 3030$ ; IF NE - YES, ERROR MOV (R3)+,R0 ;GET LOW PART OF NUMBER BR 3010$ ;CONTINUE IN COMMON CODE 3003$: BIT #FL.RX1,CSIBLK+C.MKW1 ; RX01 IMAGE WANTED BEQ 3005$ ; IF EQ, NO MOV #494.,R0 ; SET LOW SIZE CLR R1 ; AND HIGH SIZE BR 3010$ ; CONTINUE 3005$: BIT #FL.RK5,CSIBLK+C.MKW1 ;IS RK05 CREATION REQUESTED? BEQ 4000$ ; IF EQ - NO, SKIP MOV #4800.,R0 ;SET FILE SIZE TO RK05 SIZE CLR R1 ; CLEAR HIGH ORDER SIZE 3010$: MOV R0,CREDPB+Q.IOPL+6 ;SET SIZE OF FILE TO CREATE MOVB R1,CREDPB+Q.IOPL+4 ; AND HIGH-PART ALSO MOV R0,FILFDB+F.HIBK+2 ;SET FCS SIZE MOVB R1,FILFDB+F.HIBK ; AND HIGH-PART ALSO MOV R0,FILFDB+F.EFBK+2 ;SET EOF BLOCK MOVB R1,FILFDB+F.EFBK ; AND HIGH PART ALSO MOV #1000,FILFDB+F.FFBY ; AND MARK EOF AT END OF BLOCK ; BIT #FL.PLA,CSIBLK+C.MKW1 ; PLACEMENT DESIRED? BEQ 3019$ ; IF EQ, NO MOV #PLALST,CREDPB+Q.IOPL+2 ; CHANGE ATTRIBUTE LIST POINTER BISB #EX.ALL,CREDPB+Q.IOPL+5 ; ENABLE PLACEMENT FUNCTION MOV #PLASTR,R4 ; POINT TO LOCATION STRING MOV R4,R5 ; COPY ADDRESS MOV #8.,R3 ; SET MAX LENGTH 3011$: TSTB (R4)+ ; CHECK STRING BEQ 3012$ ; FOUND END SOB R3,3011$ ; LOOK AT ALL OF'EM BR 3040$ ; BETTER NOT GET HERE 3012$: SUB R5,R4 ; CALC LENGTH DEC R4 ; CORRECT COUNT MOV #PLABLK,R3 ; SET OUTPUT ADDR CALL .DD2CT ; CONVERT TO BINARY BCS 3040$ ; REPORT ERROR MOV (R3)+,R1 ; GET HIGH PART CMP R1,#10 ; CHECK HIGH BLOCK NUMBER BHI 3040$ ; ERROR IF GT MOV R1,PLACE+2 ; SAVE IT AWAY MOV (R3)+,PLACE+4 ; STORE LOW BLOCK NUMBER 3019$: F11QIO CREDPB,3021$ ;ISSUE CREATE REQUEST F11QIO ENADPB,3020$ ;ISSUE ENTER NAME REQUEST BR 4010$ ; CONTINUE ON SUCCESS 3020$: F11QIO DELDPB ;ON ENTER ERROR, DELETE FILE 3021$: FATAL ;DECLARE ERROR 3030$: FATAL ;DECLARE ERROR 3040$: FATAL ; ; LOOKUP SPECIFIED FILE. ; 4000$: F11QIO FNADPB,4001$ ;ISSUE FIND REQUEST BR 4010$ ; CONTINUE ON SUCCESS 4001$: FATAL ;DECLARE ERROR ; ; ACCESS AND DEACESS FILE, GET SIZE AND STARTING BLOCK NUMBER ; 4010$: F11QIO ACWDPB,4011$ ;ISSUE ACCESS REQUEST F11QIO DACDPB,4011$ ; AND DEACCESS FILE (LOCKED) F11QIO WATDPB,4011$ ; AND LOCK FILE BR 4020$ ; CONTINUE ON SUCCESS 4011$: FATAL ;DECLARE ERROR ; ; CHECK THAT FILE IS CONTIGIOUS AND STORE OFFSET, SIZE IN UCB. ; 4020$: MOV UCBADR,R5 ;GET UCB ADDRESS MOV EXTADR,R4 ; AND EXTENSION BLOCK MOV #STAATT,R0 ;GET ADDRESS OF STATISTICS BLOCK MOV (R0)+,(R4)+ ;STORE BLOCK OFFSET MOV (R0)+,(R4)+ ; AND LOW PART BNE 4030$ ; IF NE - OK, CONTINUE FATAL ;DECLARE ERROR 4030$: MOV (R0)+,U.CW2(R5) ;STORE SIZE OF FILE (DISK) MOV (R0)+,U.CW3(R5) ; AND LOW PART TST (R4)+ ;SKIP NEXT UCB ADDRESS CLR (R4)+ ;CLEAR EXTENSION FLAGS MOV UIC,U.UFD(R5) ; SAVE FILE UIC (IN U.PRM+2) BIT #FL.RON,CSIBLK+C.MKW1 ;SHOULD WE MARK READ-ONLY? BEQ 4040$ ; IF EQ - NO, SKIP BIS #XF.RON,-2(R4) ;SET READ-ONLY ACCESS 4040$: MOV #FILFDB+F.FNB,R1 ;GET FILENAME BLOCK MOV #S.FNB/2,R2 ;GET SIZE OF FILENAME BLOCK 4041$: MOV (R1)+,(R4)+ ;STORE FILENAME BLOCK SOB R2,4041$ ;LOOP TILL DONE SYSTEM 4050$ ;;ENTER SYSTEM STATE MOV $HEADR,R0 ;;GET OUR FILE HEADER ADD #*4+H.LUN,R0 ;;POSITION TO FILE'S UCB POINTER MOV (R0),R0 ;;GET FILE'S UCB ADDRESS 4042$: MOV U.RED(R0),R1 ;;GET REDIRECT UCB CMP R0,R1 ;;IS THIS LAST REDIRECTION BEQ 4043$ ;; IF EQ - YES, SKIP MOV R1,R0 ;;COPY UCB ADDRESS BR 4042$ ;; AND LOOP AGAIN 4043$: MOV EXTADR,R4 ;;GET EXTENSION BLOCK MOV R0,X.UCB(R4) ;;STORE NEXT UCB IN EXTENSION BLOCK BICB #US.OFL,U.ST2(R5) ;;MARK DISK ENABLED RETURN ;;RETURN TO USER STATE 4050$: CALLR END ; ALL DONE, EXIT .PAGE ; ; REPORT OF CURRENT FILE SPEC ; 5000$: SYSTEM 5020$ ; SWITCH TO SYSTEM STATE MOV $HEADR,R5 ;; POINT TO OUR HEADER MOV H.LUN(R5),R5 ;; GET DEVICE UCB ADDRESS MOV R5,UCBADR ;; SAVE IT FOR LATER MOV U.NXT(R5),R0 ;; GET EXTENSION BLOCK ADDR IF ANY BEQ 5010$ ;; IF EQ, NOT ALLOCATED BITB #US.OFL,U.CW1(R5) ;; OR MARKED OFFLINE? BNE 5010$ ;; IF NE, BAD MOV R0,EXTADR ;; SAVE EXTENSION BLOCK ADDR 5010$: RETURN ;; LEAVE SYSTEM STATE 5020$: TST EXTADR ; UNIT ALLOCATED? BNE 5030$ ; OK, IF THERE FATAL 5030$: MOV #FILFDB+F.FNB,R1 ; GET FNB ADDRESS MOV R1,R3 ; COPY IT MOV EXTADR,R0 ; GET EXT BLOCK ADDR ADD #X.FNB,R0 ; OFFSET TO SAVED FILE NAME BLOCK MOV #S.FNB/2,R2 ; SET UP WORD SIZE FOR COPY 5040$: MOV (R0)+,(R1)+ ; COPY BACK TO FDB SOB R2,5040$ ; LOOP FOR ALL OF IT MOV UCBADR,R5 ; RESTORE UCB ADDRESS MOV U.PRM+2(R5),UIC ; COPY SAVED DIRECTORY UIC MOV #ERRSTR,R0 ; POINT TO ERROR BUFFER MOV #FMT1,R1 ; AND TO FORMAT STRING MOV #FILFDB+F.FNB+N.DVNM,R3 ; AND TO PARAMETER BLOCK MOV #STRING,R2 ; POINT TO TEMP AREA MOV R3,(R2) ; INSERT ADDRESS OF DEVICE TYPE MOV 2(R3),2(R2) ; AND UNIT NUMBER CALL $EDMSG ; FORMAT OUTPUT MOV R0,R2 ; COPY OUTPUT POINTER MOV UIC,R3 ; GET UIC CLR R4 ; SET TO INCLUDE SEPARATORS CALL .PPASC ; CONVERT UIC TO ASCII MOV R2,R0 ; RESTORE OUTPUT POINTER MOV #FMT2,R1 ; GET NEXT FORMAT STRING MOV #FILFDB+F.FNB+N.FNAM,R2 ; AND PARAMETER BLOCK MOV #SSTTBL,N.STAT-N.FNAM(R2) ; POINT TO A NULL STRING MOV U.NXT(R5),R4 ; GET EXT BLOCK ADDRESS BIT #XF.RON,X.FLG(R4) ; UNIT WRITE LOCKED? BEQ 5050$ ; IF EQ, NO MOV #RDONLY,N.STAT-N.FNAM(R2) ; POINT TO READONLY STRING 5050$: CALL $EDMSG ; FORMAT OUTPUT CALLR TYPE ; SEND OUT MESSAGE .PAGE .SBTTL ERRSRV * ERROR MESSAGE PROCESSING ; ;+ ; THIS ROUTINE IS ENTERED BY AN SST TRAP INSTRUCTION. IT OUTUTS ; THE ERROR MESSAGE AND EXITS THE TASK. IF THE VIRTUAL DISK IS ; ALLOCATED, THE EXTENSION BLOCK IS DEALLOCATED. ; ; INPUTS: ; ; THE TRAP CAUSED BY THE FATAL MACRO. THE STACK SHOULD ; BE SETUP AS SHOWN BELOW: ; ; SP+04 PS ; SP+02 PC OF TRAP+2 ; SP+00 TRAP OPERAND*2 ; ; THE TRAP INSTRUCTION IS FOLLOWED BY THE ASCIZ ERROR MESSAGE. ; ; OUTPUTS: ; ; THE ERROR MESSAGE IS OUTPUT TO THE USER'S TERMINAL AND ; THE TASK EXITS. ANY ALLOCATED EXTENSION BLOCK IS RETURNED. ;- ; ERRSRV: MOV IOSTAT,ERRCOD ; RETURN LAST ERROR CODE MOV UCBADR,R5 ;GET UCB ADDRESS BEQ 1000$ ; IF EQ - NO UCB, NO EXTENSION BLOCK MOV EXTADR,R0 ;GET EXTENSION BLOCK ADDRESS BEQ 1000$ ; IF EQ- NO EXTENSION BLOCK SYSTEM 1000$ ;;ENTER SYSTEM STATE CLR U.NXT(R5) ;;MARK DISK NOT ALLOCATED MOV #X.LGTH,R1 ;;GET BLOCK SIZE CALLR $DEACB ;;DEALLOCATE EXTENSION BLOCK 1000$: MOV #ERRSTR,R0 ;GET START OF VARIABLE ERROR MOV 2(SP),R1 ;GET START OF ERROR MESSAGE 1100$: MOVB (R1)+,(R0)+ ;MOVE ERROR MESSAGE BNE 1100$ ; AND LOOP IF NOT DONE MOVB #15,-1(R0) ;MOVE IN EXTRA MOVB #12,(R0)+ ;MOVE IN EXTRA ; ; TYPE MESSAGE IN ERROR BUFFER AND EXIT ; -- END OF MESSAGE IN R0 TYPE: SUB #ERRMSG,R0 ;GET LENGTH OF STRING MOV R0,ERRDPB+Q.IOPL+2 ;STORE IN QIO DPB DIR$ #ERRDPB ;ISSUE OUTPUT END: EXST$S ERRCOD ; EXIT TASK REPORTING STATUS .END AVD