.TITLE CVL - CHANGE VOLUME LABEL .IDENT /01.00/ .LIST MEB ; ; AUTHOR: H. L. COLEMAN ; MILLIKEN AND COMPANY ; P. O. BOX 1926 ; MAIL STOP M-103 ; SPARTANBURG, S. C. 29304 ; (803)573-2556 ; ; DATE: 24-JAN-78 ; ; MODIFIED: ; ; FUNCTION: READ THE DISK LABEL BLOCK AND CHANGE THE LABEL TO THAT ; SPECIFIED IN THE MCR COMMAND. IF NO MCR COMMMAND IS ; AVAILABLE, THE OPERATOR IS PROMPTED FOR COMMANDS. ; ; INPUT: ; ; MCR COMMAND OF THE FORM: ; ; CVL DDU:LABEL ; ; OUTPUT: ; ; THE SPECIFIED DISK LABEL BLOCK IS MODIFIED. ; .PAGE .MCALL QIOW$S,WSIG$S,GMCR$,EXIT$S,DIR$ .MCALL MSGN$S .MCALL ALUN$S .MCALL TCBDF$,LCBDF$,DCBDF$,UCBDF$,HMBOF$ TCBDF$ <:>,<=> ;DEFINE TCB OFFSETS UCBDF$ <:>,<=> ;DEFINE UCB OFFSETS DCBDF$ <:>,<=> ;DEFINE DCB OFFSETS LCBDF$ <:>,<=> ;DEFINE LCB OFFSETS HMBOF$ ;DEFINE HOME BLOCK OFFSETS .PSECT CVL .PAGE ; MESSAGES - ERROR AND OTHERWISE ; ; ALL MESSAGES PRINTED BY MSGTRP UTILITY ROUTINE ; PFX: .BYTE PRMT-PFX-1 ;MESSAGE PREFIX .ASCII /CVL -/ PRMT: .BYTE M001-PRMT-1 ;PROMPT PREFIX .ASCII /CVL>/ M001: .BYTE M002-M001-1 .ASCII /PRIVLEDGE VIOLATION/ M002: .BYTE M003-M002-1 .ASCII /SYNTAX ERROR/ M003: .BYTE M004-M003-1 .ASCII /INVALID DEVICE/ M004: .BYTE M005-M004-1 .ASCII /DEVICE NOT MOUNTED/ M005: .BYTE M006-M005-1 .ASCII /HEADER BLOCK READ ERROR / HBREC: .ASCII / / M006: .BYTE M007-M006-1 .ASCII /HEADER BLOCK WRITE ERROR / HBWEC: .ASCII / / M007: .BYTE M008-M007-1 .ASCII /VOLUME NAME CHANGED FROM / OLDLBL: .ASCII / / .ASCII / TO / NEWLBL: .ASCII / / M008: .BYTE 0 .EVEN .PAGE ; CONSTANTS AND WORK AREAS. ; MCRLIN: GMCR$ ;MCR COMMAND BUFFER .WORD 0 ;BUFFER PAD DEV: .ASCII / / ;DEVICE NAME UNIT: .WORD 0 ;UNIT NUMBER IOSB: .WORD 0,0 ;IOSB FOR DISK I/O PRFLG: .WORD 0 ;PROMPT MODE FLAG LBN: .WORD 0,0 ;DISK LOGICAL BLOCK NUMBER HDRBUF: .BLKW 256. ;DISK HEADER BUFFER .PAGE CVL:: MOV $TKTCB,R1 ;R1 = A(MY TCB) MOV T.UCB(R1),R0 ;R0 = A(TI: UCB) BIT #U2.PRV,U.CW2(R0) ;IS USER PRIVLEDGED? BNE 1100$ ;IF NE, YES - CONTINUE MSGN$S PFX,3,M001,,,ABORT ;PRIVLEDGE VIOLATION! 1000$: EXIT$S ;EXIT 1100$: DIR$ #MCRLIN ;GET MCR COMMAND LINE BCC 1300$ ;IF CC, GOT ONE - GO PROCESS IT 1200$: MOV #1,PRFLG ;INDICATE PROMPT MODE MOV #"CV,MCRLIN+2 ;MAKE IT LOOK LIKE MCR COMMAND MOV #"L ,MCRLIN+4 MSGN$S PRMT,0,,MCRLIN+6,74.,ABORT ;PROMPT CMPB #IE.EOF,$TIOSB ;CTRL/Z? BEQ 1000$ ;IF EQ, YES - EXIT MOV $TIOSB+2,R0 ;GET LENGTH READ BEQ 1200$ ;IF EQ, NO DATA READ - PROMPT AGAIN ADD #MCRLIN+6,R0 ;R0 = A(EOL) CLRB (R0) ;TERMINATE INPUT LINE 1300$: MOV #MCRLIN+2,R1 ;R1 = A(COMMAND) CLR LBN ;SET BEGINNING LBN MOV #1,LBN+2 MOV #NEWLBL+12.,R4 ;R4 = A(END OF NEW NAME FIELD) MOV #12.,R0 ;R0 = COUNT 1350$: CLRB -(R4) ;CLEAR AREA SOB R0,1350$ ;LOOP UNTIL DONE ;R4 = A(NEW NAME AREA) CLR R3 ;R3 = 0 1400$: CALL GETNXT ;GET NEXT CHARACTER IN BUFFER BCS 1600$ ;IF CS, EOL - SYNTAX ERROR BVC 1400$ ;IF VC, NO BLANK SEEN - KEEP LOOKING MOV R1,R2 ;R2 = A(NEXT CHARACTER) DEC R2 ;R2 = A(DEVICE SPECIFIER) 1500$: CMPB #':,R0 ;COLON? BNE 1700$ ;IF NE, NO - CHECK FURTHER TST R3 ;COLON ALREADY SEEN? BNE 1600$ ;IF NE, YES - SYNTAX ERROR MOV R1,R3 ;R3 = A(LABEL FIELD) BR 1800$ ;KEEP SCANNING 1600$: MSGN$S PFX,3,M002,,,ABORT ;SYNTAX ERROR BR 1200$ ;FORCE PROMPT MODE 1700$: TST R3 ;COLON ALREADY SEEN? BEQ 1800$ ;IF EQ, NO - KEEP SCANNING CMP R4,#NEWLBL+12. ;LABEL TOO LONG? BHIS 1600$ ;IF LOS, YES - SYNTAX ERROR MOVB R0,(R4)+ ;PUT CHARACTER IN LABEL AREA 1800$: CALL GETNXT ;GET NEXT CHARACTER FROM BUFFER BCC 1500$ ;IF CC, GOT ONE - KEEP SCANNING MOV R2,R0 ;R0 = A(DEVICE SPECIFIER) MOV #DEV,R3 ;R3 = A(DEVICE ID BUFFER) CALL $FDLOG ;PARSE DEVICE (MCR PARSER) BCC 2000$ ;IF CC, DEVICE OK SO FAR TST R3 ;WHAT TYPE OF ERROR WAS IT BEQ 1600$ ;IF EQ, SYNTAX ERROR 1900$: MSGN$S PFX,3,M003,,,ABORT ;INVALID DEVICE BR 1200$ ;FORCE PROMPT MODE 2000$: CALL $SWSTK,2040$ ;SWITCH TO SYSTEM STACK 2020$: MOV U.RED(R1),R1 ;FOLLOW REDIRECT CHAIN CMP U.RED(R1),R1 ;END OF CHAIN? BNE 2020$ ;IF NE, NO - KEEP LOOKING MOV R1,4(SP) ;SET R1 IN SAVED R1 ON STACK RETURN ;RETURN TO USER STATE 2040$: BIT #DV.F11,U.CW1(R1) ;FILES 11 DEVICE? BEQ 1900$ ;IF EQ, NO - INVALID DEVICE BITB #US.MNT,U.STS(R1) ;IS IT MOUNTED? BEQ 2100$ ;IF EQ, YES - ALL OK MSGN$S PFX,3,M004,,,ABORT ;DEVICE NOT MOUNTED 2080$: BR 1200$ ;FORCE PROMPT MODE 2100$: ALUN$S #2,DEV,UNIT ;ASSIGN LUN 2 TO DEVICE BCC 2200$ ;IF CC, LUN ASSIGNED CALL ABORT ;ABORT TASK 2200$: QIOW$S #IO.RLB,#2,#1,,#IOSB,,<#HDRBUF,#512.,,LBN,LBN+2> BCC 2400$ ;IF CC, NO DIRECTIVE ERROR - CHECK I/O CMP #IE.UPN,$DSW ;INSUFFICIENT DYNAMIC MEMORY? BEQ 2300$ ;IF EQ, YES - TRY AGAIN CALL ABORT ;ABORT TASK 2300$: WSIG$S ;GIVE SYSTEM A CHANCE TO FREESOME DSR BR 2200$ ;TRY AGAIN 2400$: CMPB #IS.SUC,IOSB ;READ SUCESSFULL? BEQ 2500$ ;IF EQ, YES - GO CHANGE LABEL MOV #HBREC,R0 ;R0 = A(ERROR CODE FIELD) MOV IOSB,R1 ;R1 = ERROR CODE MOV R0,R2 ;NO ZERO SUPRESSION CALL $CBOMG ;INSERT ERROR CODE IN MESSAGE MSGN$S PFX,3,M005,,,ABORT ;HEADER BLOCK READ ERROR BR 2080$ ;FORCE PROMPT MODE 2500$: MOV #HDRBUF,R0 ;R0 = A(HEADER BUFFER) MOV #H.CHK1/2,R1 ;R1 = COUNT OF WORDS TO CHECKSUM CALL CHKSUM ;COMPUTE CHECKSUM CMP R1,(R0) ;DOES IT MATCH HOME BLOCK? BNE 2520$ ;IF NE, NO - MUST NOT BE HOME BLOCK MOV #HDRBUF,R0 ;R0 = A(HOME BLOCK) MOV #H.CHK2/2,R1 ;R1 = COUNT OF WORDS TO CHECKSUM CALL CHKSUM ;COMPUTE CHECKSUM CMP R1,(R0) ;DOES IT MATCH HOME BLOCK? BEQ 2540$ ;IF EQ, YES - THIS MUST BE HOME BLOCK 2520$: BIC #377,LBN+2 ;MAKE MULTIPLE OF 256. ADD #256.,LBN+2 ;BUMP TO NEXT MULTIPLE OF 256. ADC LBN ;DOUBLE PRECISION BR 2200$ ;TRY AGAIN 2540$: MOV #HDRBUF+H.VNAM,R0 ;R0 = A(VOLUME NAME) MOV #NEWLBL,R1 ;R1 = A(NEW NAME) MOV #OLDLBL,R2 ;R2 = A(OLD NAME FIELD) MOV #12.,R3 ;R3 = COUNT 2600$: MOVB (R0),(R2)+ ;COPY OLD NAME MOVB (R1)+,(R0)+ ;INSERT NEW NAME SOB R3,2600$ ;LOOP UNTIL DONE MOV #HDRBUF,R0 ;R0 = A(HOME BLOCK) MOV #H.CHK1/2,R1 ;R1 = COUNT OF WORDS TO CHECKSUM CALL CHKSUM ;COMPUTE CHECKSUM MOV R1,(R0) ;SET NEW CHECKSUM MOV #HDRBUF,R0 ;R0 = A(HOME BLOCK) MOV #H.CHK2/2,R1 ;R1 = COUNT OF WORDS TO CHECKSUM CALL CHKSUM ;COMPUTE CHECKSUM MOV R1,(R0) ;SET NEW CHECKSUM 2700$: QIOW$S #IO.WLB,#2,#1,,#IOSB,,<#HDRBUF,#512.,,LBN,LBN+2> BCC 2900$ ;IF CC, NO DIRECTIVE ERROR CMP #IE.UPN,$DSW ;INSUFFICIENT DYNAMIC MEMORY? BEQ 2800$ ;IF EQ, YES - TRY AGAIN CALL ABORT ;ABORT TASK 2800$: WSIG$S ;GIVE SYSTEM A CHANCE TO FREE SOME DSR BR 2700$ ;GO TRY AGAIN 2900$: CMPB #IS.SUC,IOSB ;WRITE SUCESSFULL? BEQ 3000$ ;IF EQ, YES - GO SEE IF MORE TO DO MOV #HBWEC,R0 ;R0 = A(ERROR CODE FIELD) MOV IOSB,R1 ;R1 = ERROR CODE MOV R0,R2 ;NO ZERO SUPRESSION CALL $CBOMG ;INSERT ERROR CODE MSGN$S PFX,3,M006,,,ABORT ;HEADER BLOCK WRITE ERROR 2950$: JMP 1200$ ;FORCE PROMPT MODE 3000$: MSGN$S PFX,0,M007,,,ABORT ;VOLUME NAME CHANGED FROM - TO TST PRFLG ;PROMPT MODE? BNE 2950$ ;IF NE, YES - GO PROMPT AGAIN EXIT$S ;EXIT ABORT: HALT ;ABORT TASK .PAGE ; GETNXT ; ; FUNCTION: SUBROUTINE TO GET NEXT NON-BLANK CHARACTER FROM THE ; MCR COMMAND BUFFER. ; ; INPUT: ; ; R1 = A(NEXT CHARACTER TO SCAN) ; ; OUTPUT: ; ; R0 = NEXT NON-BLANK CHARACTER ; R1 = A(NEXT CHARACTER TO SCAN) ; CC - R0 CONTAINS CHARACTER ; CS - END OF LINE REACHED ; VC - NO BLANKS SKIPPED ; VS - AT LEAST ONE BLANK SKIPPED ; GETNXT: CLR -(SP) ;CLEAR BLANK COUNT 1000$: MOVB (R1)+,R0 ;R0 = NEXT CHARACTER BEQ 1300$ ;IF EQ, EOL - GO SET CARRY CMPB #' ,R0 ;IS IT A BLANK? BNE 1100$ ;IF NE, NO - CHECK FURTHER INC (SP) ;BUMP BLANK COUNT BR 1000$ ;GO GET NEXT CHARACTER 1100$: CMPB #15,R0 ;CARRIAGE RETURN? BEQ 1300$ ;IF EQ, YES - GO SET CARRY CMPB #33,R0 ;ESCAPE? BEQ 1300$ ;IF EQ, YES - GO SET CARRY CMPB #' ,R0 ;LEGAL CHARACTER? BHI 1000$ ;IF HI, NO - GO GET ANOTHER ONE CMPB #172,R0 ;LEGAL CHARACTER? BLO 1000$ ;IF LO, NO - GO GET ANOTHER ONE 1200$: TST (SP)+ ;DID WE SEE A BLANK BEQ 1250$ ;IF EQ, NO - LEAVE VC SEV ;SET OVERFLOW 1250$: RTS PC ;RETURN TO CALLER 1300$: TST (SP)+ ;DID WE SEE ANY BLANKS? BEQ 1400$ ;IF EQ, NO - LEAVE VC SEV ;SET OVERFLOW 1400$: SEC ;SET CARRY RTS PC ;RETURN TO CALLER .PAGE ; CHKSUM ; ; FUNCTION: SUBROUTINE TO FORM A CHECKSUM OF A VARIABLE NUMBER OF ; WORDS. THE CHECKSUM IS COMPATIABLE WITH THAT USED IN ; FILES 11 HOME BLOCKS. ; ; INPUT: ; ; R0 = A(AREA TO CHECKSUM) ; ; R1 = COUNT OF WORDS TO CHECKSUM ; ; OUTPUT: ; ; R0 = A(NEXT WORD AFTER AREA CHECKSUMMED) ; ; R1 = COMPUTED CHECKSUM ; CHKSUM: CLR -(SP) ;INITILIZE CHECKSUM 1000$: ADD (R0)+,(SP) ;ADD NEXT WORD SOB R1,1000$ ;LOOP UNTIL DONE MOV (SP)+,R1 ;R1 = COMPUTED CHECKSUM RETURN ;RETURN TO CALLER .END CVL