.TITLE AVD - ASSIGN VIRTUAL DISK .ENABL LC .SBTTL Title Page .IDENT /V03.00/ ; ; ************************************************************************ ; * ; 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: V03.00 ; ; ****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 ; ; V02.06 RBD 07-Jul-82 Default to directory [0,1], lower ; case messages. U.NXT and U.UFD now ; defined globally in VDTAB.MAC. ; Allow assignment to write-locked ; volume, force read-only access. ; ; V03.00 RBD 10-Aug-82 Add support for logging AVD's and ; DVD's. Requires modified DISPATCH.CNF ; and the addition of the new DSP9M1.CNF ; to ERRLOG.ULB. General cleanup. ; .PAGE .SBTTL Error Logger Data Subpacket Description ; ; ***************************************** ; * RSX-11M V4.0 Error Logger Interface * ; ***************************************** ; ; AVD now communicates with the RSX-11M V4.0 Error Logger via a non-DEC ; packet type, 9. By choosing to make the packet type non-DEC, I avoided ; massive edits of DEC ".CNF" files. Instead, since the "DISPATCH.CNF" ; module calls a packet processing module based on the packet type code ; (E$HTYC in the header subpacket), all I had to do was to modify DISPATCH ; to accept a code of 9, which I have dubbed "Special System Information". ; I then created a brand new packet processing module, DSP9M1.CNF, in which ; the Subpacket types are defined, along with their corresponding data ; subpacket structures. The SMSG$ directive works just dandy for generating ; error logger packets with user-defined data subpacket structures (the ; "message" referred to in the SMSG documentation is really the data ; subpacket contents, but it's not obvious. Read ERROR.MAC in the exec!). ; I could go on about this for a lot longer, but if you'll generate listings ; of DISPATCH.CNF, DSP9M1.CNF and a few other CNF modules, and look over ; this code, you ought to get the drift of the fine points. ; ; (Bob Denny) ; ; The following is extracted from SPCCTL.MAC, which I usually keep in [1,6] ; along with the current versions of DISPATCH (shouldn't have to change ; unless DEC decides to use packet type 9), and DSP9M1, to which I seem to ; keep adding new subtypes for various of my own purposes, like for our ; "special" ACP's (File Server, Virtual Ethernet, etc.). You could just ; delete all of this and assemble AVD with SPCCTL.MAC. ; ; ; Define the "Special System Information" Packet Type ; E$CSSI == 9. ; Code for E$HTYC == "Special System Info" ; ; Define the Special System Info Packet subtypes, in offset E$HTYS of ; the header subpacket. ; E$SAVD == 1 ; Assign Virtual Disk E$SDVD == 2 ; Deassign Virtual Disk E$SAC1 == 3 ; ACP Startup (issued by ENABLE) E$SAC2 == 4 ; ACP Shutdown (issued by DISABL) E$SAC3 == 5 ; ACP Service Message (Issued by special ACP) .PAGE ; ; Data Subpacket for Assign/Deassign Virtual Disk ; ; ** SUBTYPE = E$SAVD & E$SDVD ** ; ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; VD.VDS | Operation flags (AVD only) | (0) ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; VD.PDV | Physical Device/Unit | (2) ; |- -|- -| ; | (6 bytes ASCII) | ; |- -|- -| ; | | ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; VD.PFL | Physical File Spec | (10) ; |- -|- -| ; | (32(10) bytes ASCII) | ; |- -|- -| ; | | ; \ \ ; \ \ ; | | ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; VD.CRE | Creation size, blocks | (50) ; |- -| ; | (32-bits, only if VD.CR set) | ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; VD.PLC | Placement LBN | (54) ; |- -| ; | (32-bits, only if VD.PL set) | ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; ; Length of data subpacket = VD.LEN = 60(8) ; ; ; Define the data subpacket for E$SAVD and E$SDVD ; VD.VDS == 0 ; AVD operation flags (see below) VD.PDV == 2 ; Physical Device/Unit (6 bytes ASCII w/":") VD.PFL == 8. ; Physical File Spec (32 bytes) VD.CRE == 40. ; Creation Size (32 bits) (if VD.CR set) VD.PLC == 44. ; Placement LBN (32 bits) (if VD.PL set) VD.LEN == 48. ; Length of data subpacket ; ; Define bits for VD.VDS ; VD.RO == 000001 ; Assigned Read-Only VD.CR == 000002 ; File created by AVD VD.PL == 000004 ; File created with placement control .PAGE .SBTTL Definitions and 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 .MCALL SMSG$ ; SEND MESSAGE TO ERRLOG ; ; 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 .WDFUI ; Write default UIC = [0,1] .GLOBL $CBTMG ; CONVERT DEVICE UNIT .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 ; ; SPECIAL UCB EXTENSION WORDS ; .GLOBL U.NXT ; VIRTUAL EXTENSION UCB OFFSET .GLOBL U.UFD ; FILE UIC IN UCB ; ; RSX11M SYSTEM ROUTINES, VARIABLES. ; .GLOBL $ALOCB ; ALLOCATE CORE BLOCK .GLOBL $DEACB ; DEALLOCATE CORE BLOCK .GLOBL $HEADR ; CURRENT TASK HEADER ADDRESS .PAGE .SBTTL Locally Defined 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 Local Data ; ; LOCAL SYMBOLS: ; ; LOGICAL UNITS/EVENT FLAGS. ; TSTLUN = 1 ; ASSIGNED TO VDn: FOR CHECKOUT 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,,,, .IF DF E$$LOG ; ; Directive to create an error log packet, specifying ; the contents of the data subpacket, and signalling ; that the Device Information subpacket is to be included ; per the device assigned to TSTLUN (the VD: device!). ; ERLDPB: SMSG$ SM.SER,ERLMSG,VD.LEN, ; ; Data Subpacket buffer ; ERLMSG: .BLKB VD.LEN .ENDC .NLIST BEX ; ; ERROR MESSAGE STRING. ; ERRMSG: .ASCIZ <15><12>/AVD -- / ERRSTR: .BLKB 80. .EVEN ; ; FILE REPORT AND ERROR LOG FORMAT STRINGS ; FMT1: .ASCIZ "%X" ; FILE NAME LEAD: .ASCIZ / Virtual disk linked to: / RDONLY: .ASCIZ / (Read-only)/ .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 .PAGE .SBTTL AVD * MAINLINE 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 .IF DF E$$LOG MOV #VD.LEN/2,R0 ; CLEAR ENTIRE DATA SUBPACKET MOV #ERLMSG,R1 ; R1 --> 1ST WORD 10$: CLR (R1)+ SOB R0,10$ .ENDC ; ; GET COMMAND LINE, ERROR IF NONE AVAIABLE. ; DIR$ #GETCMD ; GET MCR COMMAND LINE BCC 20$ ; IF CC - OK, CONTINUE FATAL ; DECLARE ERROR ; ; SETUP FOR COMMAND PARSING. ; 20$: MOV #GETCMD+G.MCRB,R1 ; GET START OF COMMAND LINE MOV $DSW,R2 ; GET LENGTH OF COMMAND LINE 30$: CMPB #' ,(R1)+ ; SCAN FOR FIRST BLANK CHARACTER BEQ 40$ ; IF EQ - FOUND CHARACTER SOB R2,30$ ; LOOP THROUGH ENTIRE LINE FATAL ; DECLARE ERROR ; ; CHECK COMMAND FOR SYNTACICAL CORRECTNESS. ; 40$: DEC R2 ; CORRECT LINE LENGTH CSI$1 #CSIBLK,R1,R2 ; CHECK COMMAND LINE SYNTAX BCC 50$ ; IF CC - OK, CONTINUE FATAL ; DECLARE ERROR ; ; CHECK ON PROGRAM VERSION REPORT ; 50$: CSI$2 #CSIBLK,OUTPUT,#SWTTAB ; GET OUTPUT SPECIFICATION BCS 70$ ; IF CS - BAD, ERROR BIT #FL.IDV,CSIBLK+C.MKW1 ; IDENT SWITCH GIVEN? BEQ 60$ ; IF NOT, CONTINUE FATAL ; ; GET OUTPUT FILENAME. MUST ONLY BE VDX:. ; 60$: BITB #CS.NMF!CS.DIF!CS.MOR,C.STAT(R0) ; IS OUTPUT ONLY DEVICE? BNE 70$ ; IF NE - NO, ERROR BITB #CS.DVF,C.STAT(R0) ; WAS A DEVICE SPECIFIED? BEQ 70$ ; IF EQ - NO, ERROR MOV C.DEVD+2(R0),R0 ; GET DEVICE FIELD ADDRESS CMPB #'V,(R0)+ ; CHECK FIRST CHARACTER OF NAME BNE 70$ ; IF NE - BAD, ERROR CMPB #'D,(R0)+ ; CHECK SECOND CHARACTER OF NAME BNE 70$ ; IF NE - BAD, ERROR CALL $COTB ; CONVERT UNIT NUMBER CMPB #':,R2 ; CHECK FOR PROPER TERMINATOR BEQ 80$ ; IF EQ - OK, CONTINUE 70$: FATAL ; ; ASSIGN VIRTUAL DISK TO LUN. ; 80$: ALUN$S #TSTLUN,#"VD,R1 ; ASSIGN VIRTUAL DISK BCC 90$ ; IF CC - OK, CONTINUE FATAL ; DECLARE ERROR ; ; CHECK FOR FILE SPECIFICATION FOR THIS UNIT IF ATTACHED ; 90$: BIT #FL.LST,CSIBLK+C.MKW1 ; LIST SWITCH GIVEN BEQ 100$ ; IF EQ, NO MUST BE REAL ATTACH CALLR 440$ ; GO DO LISTING ; ; PARSE FILENAME SPECIFICATION. ; 100$: MOV #CSIBLK,R0 ; RESTORE CSI BLOCK ADDRESS BITB #CS.EQU,C.STAT(R0) ; IS THERE AN EQUAL SIGN? BNE 110$ ; IF NE - YES, CONTINUE FATAL ; DECLARE ERROR ; 110$: CSI$2 #CSIBLK,INPUT,#SWTTAB ; GET INPUT SPECIFICATION BCS 120$ ; IF CS - BAD, ERROR BITB #CS.MOR!CS.WLD,C.STAT(R0) ;CHECK FOR NO MORE/NO WILD-CARDS BEQ 130$ ; IF EQ - OK, CONTINUE 120$: FATAL ; DECLARE ERROR ; ; GET UIC FOR FILE - DEFAULT TO [0,1] ; 130$: BITB #CS.DIF,C.STAT(R0) ; ANY DIRECTORY GIVEN BEQ 140$ ; 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 150$ ; CONTINUE 140$: MOV (PC)+,R1 ; Get default UIC = [0,1] .BYTE 1,0 MOV R1,UIC ; SAVE THE DEFAULT UIC CALL .WDFUI ; Make it FCS's default ; ; SETUP FILENAME BLOCK. ; 150$: 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 160$ ; IF CC - OK, CONTINUE FATAL ; DECLARE ERROR ; ; ALLOCATE EXTENSION BLOCK AND ASSIGN TO VIRTUAL DISK. ; 160$: SYSTEM 180$ ;; 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 170$ ;; 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 170$ ;; IF CS - NO POOL, ERROR MOV R0,U.NXT(R5) ;; ALLOCATE UCB MOV R0,EXTADR ;; AND RETURN BLOCK ADDRESS 170$: RETURN ;; RETURN TO USER STATE 180$: TST UCBADR ; WAS DISK ALLOCATED? BNE 190$ ; IF NE - YES, CONTINUE FATAL ; DECLARE ERROR 190$: TST EXTADR ; WAS EXTENSION BLOCK ALLOCATED? BNE 200$ ; IF NE - YES, CONTINUE FATAL ; DECLARE ERROR ; ; IF /CR, /RX, /DX OR /RK SPECIFICED, CREATE NEW FILE. ; 200$: BIT #FL.CRE,CSIBLK+C.MKW1 ; IS FILE CREATION REQUESTED? BEQ 230$ ; IF EQ - NO, SKIP .IF DF E$$LOG BIS #VD.CR,ERLMSG ; SET THE "CREATE" FLAG FOR ERROR LOG .ENDC MOV #STRING,R4 ; GET START OF SIZE STRING MOV R4,R5 ; COPY START OF STRING MOV #8.,R3 ; SET SIZE OF STRING 210$: TSTB (R4)+ ; SCAN FOR NULL CHARACTER BEQ 220$ ; IF EQ - FOUND END OF STRING SOB R3,210$ ; LOOP TILL DONE BR 310$ ; IF NO NULL, BAD SIZE STRING 220$: SUB #STRING+1,R4 ; GET LENGTH OF STRING MOV #BLKNUM,R3 ; GET STORAGE SPACE CALL .DD2CT ; CONVERT NUMBER TO BINARY BCS 310$ ; IF CS - CONVERSION ERROR MOV (R3)+,R1 ; GET HIGH PART OF NUMBER TSTB -1(R3) ; CHECK IF TOO LARGE BNE 310$ ; IF NE - YES, ERROR MOV (R3)+,R0 ; GET LOW PART OF NUMBER BR 250$ ; CONTINUE IN COMMON CODE 230$: BIT #FL.RX1,CSIBLK+C.MKW1 ; RX01 IMAGE WANTED BEQ 240$ ; IF EQ, NO MOV #494.,R0 ; SET LOW SIZE CLR R1 ; AND HIGH SIZE BR 250$ ; CONTINUE 240$: BIT #FL.RK5,CSIBLK+C.MKW1 ; IS RK05 CREATION REQUESTED? BEQ 330$ ; IF EQ - NO, SKIP MOV #4800.,R0 ; SET FILE SIZE TO RK05 SIZE CLR R1 ; CLEAR HIGH ORDER SIZE 250$: 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 .IF DF E$$LOG MOV R0,ERLMSG+VD.CRE ; FILL IN CREATE SIZE IN DATA SUBPACKET MOV R1,ERLMSG+VD.CRE+2 ; NOTE: RPT WANTS LSH, THEN MSH, WHICH ; IS BACKWARDS FROM USUAL FORMAT .ENDC ; BIT #FL.PLA,CSIBLK+C.MKW1 ; PLACEMENT DESIRED? BEQ 280$ ; IF EQ, NO .IF DF E$$LOG BIS #VD.PL,ERLMSG ; YES, TURN ON THE "PLACEMENT" FLAG .ENDC 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 260$: TSTB (R4)+ ; CHECK STRING BEQ 270$ ; FOUND END SOB R3,260$ ; LOOK AT ALL OF'EM BR 320$ ; BETTER NOT GET HERE 270$: SUB R5,R4 ; CALC LENGTH DEC R4 ; CORRECT COUNT MOV #PLABLK,R3 ; SET OUTPUT ADDR CALL .DD2CT ; CONVERT TO BINARY BCS 320$ ; REPORT ERROR MOV (R3)+,R1 ; GET HIGH PART CMP R1,#10 ; CHECK HIGH BLOCK NUMBER BHI 320$ ; ERROR IF GT MOV R1,PLACE+2 ; SAVE IT AWAY .IF DF E$$LOG MOV (R3),ERLMSG+VD.PLC ; FILL PLACEMENT LBN INTO DATA SUBP. MOV R1,ERLMSG+VD.PLC+2 ; (BOTH WORDS, BACKWARDS!) .ENDC MOV (R3)+,PLACE+4 ; STORE LOW BLOCK NUMBER 280$: F11QIO CREDPB,300$ ; ISSUE CREATE REQUEST F11QIO ENADPB,290$ ; ISSUE ENTER NAME REQUEST BR 350$ ; CONTINUE ON SUCCESS 290$: F11QIO DELDPB ; ON ENTER ERROR, DELETE FILE 300$: FATAL ; DECLARE ERROR 310$: FATAL ; DECLARE ERROR 320$: FATAL ; ; LOOKUP SPECIFIED FILE. ; 330$: F11QIO FNADPB,340$ ; ISSUE FIND REQUEST BR 350$ ; CONTINUE ON SUCCESS 340$: FATAL ; DECLARE ERROR ; ; ACCESS AND DEACESS FILE, GET SIZE AND STARTING BLOCK NUMBER ; 350$: F11QIO ACWDPB,360$ ; ISSUE ACCESS REQUEST F11QIO DACDPB,360$ ; AND DEACCESS FILE (LOCKED) F11QIO WATDPB,360$ ; AND LOCK FILE BR 370$ ; CONTINUE ON SUCCESS 360$: FATAL ; DECLARE ERROR ; ; CHECK THAT FILE IS CONTIGIOUS AND STORE OFFSET, SIZE IN UCB. ; 370$: MOV UCBADR,R5 ; GET UCB ADDRESS MOV EXTADR,R4 ; AND EXTENSION BLOCK MOV #STAATT,R0 ; GET ADDRESS OF STATISTICS BLOCK CLR R2 ; R2 USED TO TEST FOR NON_CONTIG. MOV (R0),(R4)+ ; STORE BLOCK OFFSET MOV (R0)+,R2 ; AND IN TEST REGISTER MOV (R0),(R4)+ ; AND LOW PART BIS (R0)+,R2 ; MERGING INTO TEST REGISTER BNE 380$ ; IF NE - OK, CONTINUE FATAL ; DECLARE ERROR 380$: 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 BIT #FL.RON,CSIBLK+C.MKW1 ; SHOULD WE MARK READ-ONLY? BEQ 390$ ; IF EQ - NO, SKIP BIS #XF.RON,-2(R4) ; SET READ-ONLY ACCESS .IF DF E$$LOG BIS #VD.RO,ERLMSG ; TURN ON THE "READ-ONLY" FLAG IN DATA SP .ENDC 390$: MOV #FILFDB+F.FNB,R1 ; GET FILENAME BLOCK MOV #S.FNB/2,R2 ; GET SIZE OF FILENAME BLOCK 400$: MOV (R1)+,(R4)+ ; STORE FILENAME BLOCK SOB R2,400$ ;LOOP TILL DONE SYSTEM 430$ ;; 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 410$: MOV U.RED(R0),R1 ;; GET REDIRECT UCB CMP R0,R1 ;; IS THIS LAST REDIRECTION BEQ 420$ ;; IF EQ - YES, SKIP MOV R1,R0 ;; COPY UCB ADDRESS BR 410$ ;; AND LOOP AGAIN 420$: 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 430$: .IF DF E$$LOG ; ; Fill in the Data Subpacket and send the packet to error logger ; MOV #ERLMSG+VD.PDV,R0 ; R0 --> DEV:FILE IN DATA SUBPACKET CALL FILSPC ; FORMAT THE FILE SPEC DIR$ #ERLDPB ; SEND THE MESSAGE .ENDC CALLR END ; ALL DONE, EXIT ; ; REPORT OF CURRENT FILE SPEC ; 440$: CALL SETFNB ; SET UP THE FNB MOV #ERRSTR,R0 ; R0 --> OUTPUT MESSAGE BUFFER MOV #LEAD,R1 ; R1 --> LEAD-IN STRING 450$: MOVB (R1)+,(R0)+ ; COPY TO OUTPUT; R0 --> NEXT FREE BNE 450$ DEC R0 ; BACK UP TO NULL CALL FILSPC ; FORMAT THE FILE SPECIFICATION BIT #XF.RON,X.FLG(R4) ; UNIT WRITE LOCKED? BEQ 470$ ; IF EQ, NO MOV #RDONLY,R1 ; R1 --> "(READ-ONLY)" 460$: MOVB (R1)+,(R0)+ ; COPY TO OUTPUT STRING BNE 460$ DEC R0 ; BACK UP TO NULL 470$: MOVB #15,(R0)+ ; ADD MOVB #12,(R0)+ JMP TYPE ; SEND OUT MESSAGE .PAGE .SBTTL SETFNB - Set up FNB with assigned file ;+ ; SETFNB: Subroutine - Set up FNB with assigned file ; ; ** Switches to system state ** ; ; Inputs: ; LUN #1 assigned to virtual disk device ; ; Outputs: ; ; If unit assigned to virtual disk: ; R3 --> FNB with file information ; R5 --> UCB ; UCBADR --> UCB ; EXTADR --> UCB extension ; UIC = assigned file's UFD ; Assigned file information copied from UCB extension ; to FNB in FILFDB. ; ; If unit not currently assigned to virtual disk ; Fatal error directly from subroutine "Unit not assigned" ; ; Uses everything but R4 ;- SETFNB: CLR EXTADR ; BE SURE THIS IS INITIALIZED SYSTEM 20$ ; 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 10$ ;; IF EQ, NOT ALLOCATED BITB #US.OFL,U.CW1(R5) ;; OR MARKED OFFLINE? BNE 10$ ;; IF NE, BAD MOV R0,EXTADR ;; SAVE EXTENSION BLOCK ADDR 10$: RETURN ;; LEAVE SYSTEM STATE 20$: TST EXTADR ; UNIT ALLOCATED? BNE 30$ ; OK, IF THERE FATAL 30$: 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 40$: MOV (R0)+,(R1)+ ; COPY BACK TO FDB SOB R2,40$ ; LOOP FOR ALL OF IT MOV UCBADR,R5 ; RESTORE UCB ADDRESS MOV U.UFD(R5),UIC ; COPY SAVED DIRECTORY UIC RETURN .PAGE .SBTTL FILSPC - Format full file specification ;+ ; FILSPC: Subroutine - Format "DDnnn:[g,m]filename.ext;ver" ; ; The device unit number is converted with 3 digits, leading ; zeroes, as required for the error logger packet. Too bad ; if you don't like the aesthetics of the /LI display. ; ; Inputs: ; R0 --> buffer ; ; Outputs: ; R0 --> first cell after formatted filespec ; Uses R1, R2, R3 ;- FILSPC: MOV #FILFDB+F.FNB+N.DVNM,R1 ; R1 --> ASCII DEVICE NAME MOVB (R1)+,(R0)+ ; COPY TO OUTPUT MOVB (R1)+,(R0)+ ; R1 --> UNIT NUMBER MOVB (R1),R1 ; R1 = UNIT NUMBER MOV #1,R2 ; NO ZERO SUPRESSION CALL $CBTMG ; CONVERT TO 3 DIGIT OCTAL MOVB #':,(R0)+ ; ADD A ":" MOV R0,R2 ; R2 --> 1ST CELL PAST DEVICE NAME MOV UIC,R3 ; R3 = UIC OF ASSIGNED FILE CLR R4 ; SIGNAL .PPASC TO INCLUDE "[ , ]" CALL .PPASC ; CONVERT. R2 --> FIRST FREE CELL MOV R2,R0 ; R0 --> FIRST FREE CELL AFTER UIC STR. MOV #FMT1,R1 ; R1 --> FILE NAME FORMAT STRING MOV #FILFDB+F.FNB+N.FNAM,R2 ; R2 --> ARGBLK (FNB) CALLR $EDMSG ; FORMAT OUTPUT, RETURN .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 10$ ; IF EQ - NO UCB, NO EXTENSION BLOCK MOV EXTADR,R0 ; GET EXTENSION BLOCK ADDRESS BEQ 10$ ; IF EQ- NO EXTENSION BLOCK SYSTEM 10$ ;; ENTER SYSTEM STATE CLR U.NXT(R5) ;; MARK DISK NOT ALLOCATED MOV #X.LGTH,R1 ;; GET BLOCK SIZE CALLR $DEACB ;; DEALLOCATE EXTENSION BLOCK 10$: MOV #ERRSTR,R0 ; GET START OF VARIABLE ERROR MOV 2(SP),R1 ; GET START OF ERROR MESSAGE 20$: MOVB (R1)+,(R0)+ ; MOVE ERROR MESSAGE BNE 20$ ; AND LOOP IF NOT DONE MOVB #15,-1(R0) ; MOVE IN EXTRA MOVB #12,(R0)+ ; MOVE IN EXTRA .SBTTL Exits from AVD ; ; 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