.TITLE PARSIZ - CHANGE THE SIZE OF GEN. .IDENT /V2203C/ .SBTTL PARSIZ - TITLE PAGE. ;+ ; ; AUTHOR: RODGER S. MILES 21-MAR-80 ; ; UPDATE: RSM001 25-MAR-80 ; ADD SWITCH STACK (DISABLE TASK SWITCHING) AND ; CHECK TO MAKE SURE NO SUBPARTITION EXISTS IN ; THE AREA TO BE DELETED. ; UPDATE: RSM002 14-APR-80 ; ADD SUBROUTINE TO PARSE THE COMMAND LINE AND ; USE THE VALUES $PSIZE AND $PARNM. ; ; THIS TASK WILL MODIFY THE SIZE OF A MAIN PARTITION. ; A COMMAND LINE MAY OPTIONALLY BE PASSED WHICH WILL ; CONTAIN THE PARTITION NAME "/PAR=PNAME", OR THE END ; OF THE PARTITION "/SIZE=PSIZE". UNLESS SPECIFIED, ; IT WILL DEFAULT TO CHANGE THE GEN PARTITION TO FIT IN ; 96K-WORDS. DESIGNED TO RUN ON A QUESCIENT SYSTEM ; BEFORE BRINGING UP AN OPERATIONAL SYSTEM, THE TASK ; WILL CHECK FOR POSSIBLE MEMORY CONFLICTS. IF ANY ARE ; DISCOVERED, THE TASK WILL ISSUE A SHORT MESSAGE AND ; EXIT WITHOUT UPDATING THE PARTITION CONTROL BLOCK (PCB). ; TASK SWITCHING IS DISABLED, TO INSURE THAT NO OTHER ; USERS WILL BE WORKING WHEN THE PCB IS UPDATED. ; THE TASK IS PRIVILEDGED AND MUST BE BUILT WITH THE ; FOLLOWING: ; ; TKB>PARSIZ/PR/-CP,PARSIZ/CR/-SP=PARSIZ,PSZPRS ; TKB>LB:[1,54]RSX11M.STB/SS ; TKB>/ ; ENTER OPTIONS: ; TKB>STACK=10 ; TKB>UNITS=1 ; TKB>ASG=TI:1 ; TKB>TASK=...PSZ ; TKB>// ; ;- .SBTTL ...... - MACRO AND CONSTANT DEFINITIONS .MCALL QIOW$ ,EXIT$S,DIR$ ,PCBDF$ .MCALL GMCR$ PCBDF$ ;DEFINE THE PARTITION CONTROL BLOCK. TILUN = 1 ;TERMINAL LOGICAL UNIT NUMBER. TIEFN = 1 ;EVENT FLAG NUMBER FOR I/O U2.PRV = 10 ;PRIVILEGED TERMINAL BIT OF ;DEVICE CHARACTERISTIC WORD 2. ;NORMALLY DEFINED IN UCBDF$ MACRO ;OF [1,1]EXEMC.MLB. .SBTTL PCBDF$ - OFFSET DEFINITIONS FOR THE PCB .NLIST .MACRO PCBDF$ L,B,SYSDEF .ASECT .=0 P.LNK:'L'.BLKW 1 P.PRI:'L'.BLKB 1 P.IOC:'L'.BLKB 1 P.NAM:'L'.BLKW 2 P.SUB:'L'.BLKW 1 P.MAIN:'L'.BLKW 1 .IF NB SYSDEF .IF NDF M$$MGE P.HDR:'L' .ENDC .IFTF P.REL:'L'.BLKW 1 P.BLKS:'L' P.SIZE:'L'.BLKW 1 P.WAIT:'L'.BLKW 1 P.SWSZ:'L'.BLKW 1 P.BUSY:'L'.BLKB 2 P.OWN:'L' P.TCB:'L'.BLKW 1 P.STAT:'L'.BLKW 1 .IFT .IF DF M$$MGE P.HDR:'L' .BLKW 1 .ENDC P.PRO:'L' .BLKW 1 P.ATT:'L' .BLKW 2 .IF NDF P$$LAS P.LGTH='B'P.PRO .IFF P.LGTH='B'. .ENDC .IFF .PSECT PS.OUT='B'100000 PS.CKP='B'40000 PS.CKR='B'20000 PS.CHK='B'10000 PS.FXD='B'4000 PS.PER='B'2000 PS.LIO='B'1000 PS.NSF='B'400 PS.COM='B'200 PS.PIC='B'100 PS.SYS='B'40 PS.DRV='B'20 PS.DEL='B'10 PS.APR='B'7 .ASECT .=0 A.PCBL:'L'.BLKW 1 A.PRI:'L'.BLKB 1 A.IOC:'L'.BLKB 1 A.TCB:'L'.BLKW 1 A.TCBL:'L'.BLKW 1 A.STAT:'L'.BLKB 1 A.MPCT:'L'.BLKB 1 A.PCB:'L'.BLKW 1 A.LGTH='B'. .PSECT AS.DEL='B'10 AS.EXT='B'4 AS.WRT='B'2 AS.RED='B'1 .ENDC .MACRO PCBDF$ X,Y,Z .ENDM .ENDM .LIST .SBTTL CALL - MACRO FOR $SWSTK ; ; CALL SUBROUTINE ; ; MACRO FROM [11,10]RSXMC.MAC ; NOTE - THIS ROUTINE WILL CHANGE WITH ; DIFFERENT VERSIONS OF RSX11M. ; .NLIST .MACRO CALL SUBR ARG .IF IDN <$INTSV>, JSR R5,$INTSV .IF DF L$$SI1 .WORD ARG .IFF .WORD ^C&PR7 .ENDC .IFF .IF IDN <$SAVNR>, JSR R5,$SAVNR .IFF .IF IDN <$SWSTK>, EMT 376 .WORD ARG .IFF JSR PC,SUBR .ENDC .ENDC .ENDC .ENDM .LIST .SBTTL PARSIZ - MAIN LINE. .PSECT CODE,I PARSIZ:: ; ; GET MCR COMMAND LINE AND CHECK FOR TERMINAL PRIVILEGES. ; DIR$ #$GTMCR ;GET MCR COMMAND LINE BCS 4$ ;IF CS COMMAND I/O ERROR, ; JUST USE THE DEFAULTS. MOV $TKTCB,R4 ;GET ADDRESS OF TASK TCB MOV T.UCB(R4),R4 ;GET ADDRESS OF TI UCB BIT #U2.PRV,U.CW2(R4) ;IS TERMINAL PRIVILEGED? BEQ 97$ ;NO - IF BIT IS NOT SET. MOV #$GTMCR+G.MCRB,R0 ;GET ADDRESS OF MCR COMMAND LINE MOV @#$DSW,R1 ;GET MCR LINE BYTE COUNT ADD R0,R1 ;POINT TO END OF LINE CLRB (R1) ;USE NULL CHARACTER FOR END-OF-LINE CALL PSZPRS ;PARSE THE COMMAND LINE. BCS 95$ ;SYNTAX ERROR? - YES, GO PRINT IT. TST $PARNM ;WAS A PARTITION NAME GIVEN? BNE 5$ ;YES - LET IT BE. 4$: MOV #GENNM,$PARNM ;NO - USE THE DEFAULT NAME. 5$: TST $PSIZE ;WAS THE 'END' VALUE GIVEN? BNE 10$ ;YES - GO TO IT! MOV #LIMIT,$PSIZE ;NO - USE THE DEFAULT VALUE. 10$: MOV $PSIZE,R1 ;GET THE NEW TOP OF PARTITION. MOV R1,R4 ;SAVE THE TOP FOR SUBPARTITION ;CHECKING CALL $SWSTK,PRNT ;DISABLE TASK SWITCHING, BY GOING ;TO SYSTEM LEVEL. MOV #$PARHD,R0 ;GET THE MAIN PCB LISTHEAD. 20$: MOV @R0,R0 ;POINT TO THE NEXT PCB. BEQ 93$ ;ZERO INDICATES THE END-OF-LIST. CMP P.NAM(R0),$PARNM ;DOES 1ST HALF OF NAME MATCH? BNE 20$ ;NO - GO TO NEXT ONE. CMP P.NAM+2(R0),$PARNM+2 ;DOES 2ND HALF MATCH? BNE 20$ ;NO - TRY AGAIN. SUB P.REL(R0),R1 ;YES - GET THE NEW PARTITION SIZE. BLOS 90$ ;OUCH! PARTITION STARTS ABOVE LIMIT. CMP R1,P.SIZE(R0) ;MAKE SURE WE'RE SHRINKING THE PART. BHIS 85$ ;NO - LEAVE IT ALONE. ; ; WE HAVE FOUND THE GEN PARTITION IS GOOD SHAPE, NOW ; LET'S CHECK THE SUBPARTITIONS. ; MOV P.SUB(R0),R2 ;POINT TO THE FIRST SUBPARTITION. BEQ 60$ ;FINISH UP, THERE ARE NO SUBS. 45$: TST P.STAT(R2) ;IS THIS SUBPART. IS IN CORE? BMI 50$ ;NO - JUST GO TO THE NEXT. MOV P.REL(R2),R3 ;YES - GET ITS BASE, AND ADD P.SIZE(R2),R3 ; COMPUTE ITS TOP. CMP R3,R4 ;IS IT OVER THE NEW LIMIT? BHI 80$ ;YES - REPORT AND GET OUT. ;NO - THIS ONE IS GOOD. 50$: MOV P.SUB(R2),R2 ;GET THE NEXT PCB. BNE 45$ ;NOT AT END, CHECK NEXT PCB. 60$: MOV R1,P.SIZE(R0) ;O.K. UPDATE THE SIZE. MOV #DUNGUD,MSG ; TELL THE USER, RETURN ; AND GET OUT. .SBTTL ...... - ERROR RETURNS 80$: MOV #BADSUB,MSG ;TELL USER THAT SUBPARTITION EXIST RETURN ;IN THE AREA TO BE FREED. 85$: MOV #TOOLOW,MSG ;TELL USER THAT PARTITION IS ALREADY RETURN ;BELOW THE LIMIT. 90$: MOV #TOOHI,MSG ;TELL USER THAT PARTITION IS ABOVE RETURN ;THE LIMIT. 93$: MOV #NOPAR,MSG ;TELL USER PARTITION ISN'T HERE. RETURN ; 95$: MOV #SYNTAX,MSG ;INDICATE A SYNTAX ERROR. BR PRNT ; 97$: MOV #NOTPRV,MSG ;INDICATE THE USER WASN'T ALLOWED. ;FALL INTO THE PRINT ROUTINE. PRNT: MOV @MSG,QIO+Q.IOPL ;GET THE MESSAGE ADDRESS. ADD #2,MSG ;POINT TO THE SIZE. MOV @MSG,QIO+Q.IOPL+2 ;AND GET THE SIZE. DIR$ #QIO ;ISSUE A MESSAGE TO THE USER EXIT$S ;AND EXIT (COULD DUMP PCB HERE.) .SBTTL DATA - LOCAL DATA AREA. .PSECT DATA,D .NLIST BEX $GTMCR: GMCR$ ;DPB AND BUFFER FOR COMMAND LINE. MSG: .WORD 0 ;STORAGE FOR ADDRESS OF MESSAGE ;TO PASS BACK FROM SYSTEM STATE. ;PARAMETERS FOR QIOW DIRECTIVE: ; 1 - MESSAGE ADDRESS ; 2 - MESSAGE SIZE TOOLOW: .WORD MSGTL,MSGTLS BADSUB: .WORD MSGBS,MSGBSS TOOHI: .WORD MSGTH,MSGTHS NOPAR: .WORD MSGNG,MSGNGS DUNGUD: .WORD MSGDG,MSGDGS SYNTAX: .WORD MSGSE,MSGSES NOTPRV: .WORD MSGNP,MSGNPS IOSB: .BLKW 2 ;I/O STATUS BLOCK (UNUSED) MSGBS: .ASCII / -- SUBPARTITION OVERLAPS FREE AREA/ MSGBSS = .-MSGBS MSGTL: .ASCII / -- PARTITION END IS BELOW OR EQUAL TO THE LIMIT/ MSGTLS = .-MSGTL MSGTH: .ASCII / -- PARTITION IS LOCATED ABOVE THE LIMIT/ MSGTHS = .-MSGTH MSGNG: .ASCII / -- UNABLE TO FIND THE PARTITION/ MSGNGS = .-MSGNG MSGDG: .ASCII / -- SIZE OF PARTITION HAS BE UPDATED/ MSGDGS = .-MSGDG MSGNP: .ASCII / -- USER IS NOT PRIVILEDGED./ MSGNPS = .-MSGNP MSGSE: .ASCII / -- SYNTAX ERROR/ MSGSES = .-MSGSE .EVEN $PARNM:: ;PARTITION NAME .WORD 0,0 ; GENNM = ^RGEN ;DEFAULT IS 'GEN' $PSIZE:: ;END OF PARTITION. .WORD 0 ; LIMIT = 5000 ; DEFAULT TO 96KW. QIO:: ;QIO DIRECTIVE PARAM. BLOCK QIOW$ IO.WVB,TILUN,TIEFN,,IOSB,,<0,0,40> .LIST BEX .END PARSIZ