.TITLE SCH .IDENT /1.0/ ;+ ; SCH -- MODIFY RSX11M V3.2 TIME SHARING PARAMETERS(ROUND ROBIN/SWAP TIMES) ; WRITTEN BY: ; JAMES G. DOWNWARD ; KMS FUSION,INC ; 3941 RESEARCH PARK DR. ; ANN ARBOR, MICH. 48104 ; (313)-769-8500 ; ; ; THE TASK SCH( FOR SCHEDULE) IS USED TO DISPLAY AND MODIFY RSX11M'S TIMESHARING ; PARAMETERS, IE THE ROUND ROBIN INTERVAL AND THE SWAP INTERVAL. MINOR SANITY CHECKS ; ARE PERFORMED, IE, A SWAP TIME LESS THAN THE ROUND ROBIN INTERVAL IS NOT ALLOWED. ; HOWEVER ALL OTHER REASONABLE COMBINATIONS WILL BE ACCEPTED EVEN IF THEY WOULD ; NOT REALY BE SUITABLE. ONE REASON FOR THIS IS THAT 'SUITABLE' FOR ONE SYSTEM ; WOULD BE UNSUITABLE FOR ANOTHER. THE SITUATION IS GOVERENED BY CORE SIZE, ; THE SPEED AND SIZE OF DISKS, AND THE AMOUNT OF SWAPPING GOING ON(IE HOW ; HEAVILY LOADED THE SYSTEM IS). ; ; IN ORDER FOR THIS PROGRAM TO WORK, TDSCH.SLP MUST HAVE BEEN APPLIED TO ; TDSCH.MAC, AND A SYSGEN DONE TO INCORPORATE A SLIGHT EXEC MODIFICATION. THE ; EXEC MOD WILL WORK WITH ANY SYSTEM REGARDLESS OF WHETHER OR NOT THIS PROGRAM IS ; USED. IT IS AS HARMLESS AS ANY EXEC MOD CAN BE SINCE IT INVOLVES NO NEW CODE. ; RATHER IS FORCES THE ASSEMBLY TIME PARAMTERS FOR ROUND ROBIN SCHEDULING AND ; EXECUTIVE LEVEL DISK SWAPPING TO APPEAR IN LOCATIONS WHICH ARE GLOBAL SYMBOLS. ; ; COMMAND SYNTAX: ; SCH /SW1[/SW2/SW3] ; WHERE THE SWITCHES ARE ; ; /DSP - DISPLAY THE ROUND ROBIN AND SWAP TIMES IN TICS ; /RBN:n - SET THE ROUND ROBIN INTERVAL TO n TICS ; /SWP:n - SET THE SWAP INTERVAL TO n TICS. ; IF /DSP IS SEEN, IT DISPLAYS THE VALUE OF THE OTHER TWO SWITCHES AFTER THEIR ; VALUE IS PLACED IN THE EXEC. ; AS MENTIONED, A SMALL EXEC MOD MUST BE MADE. TDSCH.SLP MAY BE USED ; TO DO THIS. BECAUSE OF THE WAY THE LOCATIONS TO SLP ARE FOUND, THIS FILE ; SHOULD BE RELATIVELY IMMUNE TO ANY CHANGES DEC MAKES TO TDSCH. ; ; THIS TASK MAY BE BUILT ; ; MAC SCH.OBJ;1=LB:[1,1]EXEMC/ML,[200,200]RSXCM/PA:1,SY:[UIC]SCH ; TKB SCH.TSK;1/PR/CP=SCH.OBJ;1 ; / ; TASK=...SCH ; PRI=50 ; // ;- .MCALL UCBDF$,TCBDF$,HWDDF$,EXIT$S,SDAT$,RQST$,QIOW$,DIR$,USTP$ .MCALL EXST$S,RCST$,STOP$S .MCALL GMCR$ TCBDF$ ; DEFINE TCB OFFSETS HWDDF$ ; DEFINE HARDWARE OFFSETS UCBDF$ ; DEFINE UCB OFFSETS .IF NDF R$$NDC .ERROR ; ROUND ROBIN SCHEDULING NOT BUILT IN .ENDC .IF NDF S$$WPC ; .ERROR ; EXECUTIVE LEVEL DISK SWAPING NOT SUPPORTED .ENDC ; ; ; LOCAL MACROS ; .MACRO PRINT STRING MOV #STRING,R0 CALL PNTLIN .ENDM PRINT ; ; ERROR MESSAGES ; .EVEN M1: .ASCIZ <15><12>/SCH -- FATAL, NOT A PRIVLEGED TERMINAL/ M2: .ASCIZ <15><12>/SCH -- FATAL, COMMAND SWITCHES ARE MISSING/ M3: .ASCIZ <15><12>/SCH -- FATAL, COMMAND ERROR/ M4: .ASCIZ <15><12>/SCH -- FATAL, SYNTAX ERROR/ M5: .ASCIZ <15><12>/SCH -- FATAL, ILLEGAL SWITCH/ M6: .ASCIZ <15><12>/SCH -- FATAL, ILLEGAL SCHEDULE INTERVAL/ .EVEN ; ; SCHEDULE DISPLAY MESSAGES ; SCHHDR: .ASCII <15><12>/RSX11M TIMESHARING SCHEDULING INTERVALS/ RBNTIM: .ASCII <15><12>/ ROUND ROBIN INTERVAL(TICS) = / RBNTM: .ASCIZ / / SWPTIM: .ASCII <15><12>/ EXEC SWAPING INTERVAL(TICS) = / SWPTM: .ASCIZ / / TICVAL: .ASCII / / ; 6 BLANK SPACES ; ; FLAGS TO INDICATE SWITCHES FOUND AND LOCAL DATA STORAGE .EVEN DSPFLG: .WORD 0 ; IF =1 DISPLAY VALUES ON EXIT RBNFLG: .WORD 0 ; /RBN SWITCH SEEN SWPFLG: .WORD 0 ; /SWP SWITCH SEEN RBNVAL: .WORD 0 ; HOLD VALUE SWPVAL: .WORD 0 ; HOLD VALUE ; DIRECTIVE PARAMETER BLOCKS ; QIODPB: QIOW$ IO.WVB,2,2,,,,<0,0,0> ; WRITE TO TERMINAL GMCR: GMCR$ ; GET COMMANDLINE DPB BUF: .BLKW 40 ; BUFFER FOR TERMINAL OUTPUT .WORD 0 ; SENTINAL ; ; SWITCH TABLE ; SWTAB: .RAD50 /DSP/ .RAD50 /RBN/ .RAD50 /SWP/ ENDTAB: ; ; ; JUMP TABLE TO PROCESSING ROUTINES ; JMPTAB: .WORD DSPLAY ; DISPLAY TIME SHARING PARAMETERS .WORD ROBIN ; SET NEW ROUND ROBIN INTERVAL .WORD SWAP ; SET NEW SWAP INTERVAL .SBTTL START OF PROGRAM SCH: ; REF LABLE MOV $ROBIN,RBNVAL ; STORE VALUES FOR LATER COMPARISON MOV $SWAP,SWPVAL ; SINCE USER MAY WISH TO SET ONLY ONE MOV $TKTCB,R5 ; FIRST GET OUR TCB MOV T.UCB(R0),R0 ; THEN OUR UCB ADDRESS BIT #U2.PRV,U.CW2(R0) ; IS TERMINAL PRIVLEGED BNE 2$ ; IF NE, YES PRINT M1 ; WARN THAT TERMINAL IS NOT PRIVLEGED 1$: JMP ERRXIT ; AND EXIT WITH SEVERE ERROR 2$: ; REF LABLE DIR$ #GMCR ; GET MCR COMMAND LINE BCC 10$ ; NO ERROR, SO PROCEED PRINT M3 ; COMMAND ERROR BR 1$ ; AND EXIT 10$: MOV #GMCR+G.MCRB,R5 ; GET ADDRESS OF MCR COMMAND LINE CMP $DSW,#7. ; SEE IF ANY COMMANDS PRESENT BGE 20$ ; MUST HAVE AT LEAST 7 CHARACTERS IN LINE PRINT M2 ; OR ELSE NO VALID COMMAND PRESENT BR 1$ ; AND EXIT 20$: ADD #1,R5 ; POINT TO WHERE WE EXPECT A SPACE 25$: INC R5 ; BUMP COUNTER CMPB (R5),#15 ; IS IT A BNE 27$ ; IF NE , NO, CONTINUE SCAN JMP ENDUP ; IF EQ, YES, ENDUP AS APPROPRIATE 27$: CMPB (R5),#33 ; IS IT AN BNE 28$ ; IF NE,NO, CONTINUE JMP ENDUP ; IF EQ, YES, ENDUP AS APPROPRIATE 28$: CMPB (R5),#'/ ; IS IT A SWITCH BNE 25$ ; IF NE, NO IT ISN'T, CONTINUE SCAN INC R5 ; BUMP PAST / CALL KEYWRD ; SCAN FOR KEYWORD BR 25$ ; AND SCAN LINE FOR MORE ;+ ; KEYWRD -- SCAN THROUGH THE SWITCH TABLE LOOKING FOR A MATCH ; IF A MATCH IS FOUND, EXECUTE AN @CALL VIA THE ; JMP TABLE TO THE PROCESSING ROUTINE. ; IF NO MATCH IS FOUND , DECLARE AN ILLEGAL KEYWORD ERROR ; AND EXIT WITH GRACE. ;- KEYWRD: ; MOV R5,R0 ; POINTER TO THE NEXT THREE BYTES CLR R1 ; CONTROL FOR $CAT5(DO NOT CONTROL DOTS) CALL $CAT5 ; CONVERT THOSE THREE BYTES TO ONE RAD50 WORD IN R1 MOV #SWTAB,R4 ; NOW WE WILL SEARCH COMMAND TABLE FOR MATCH 10$: CMP R1,(R4)+ ; DO WE HAVE A MATCH BEQ 20$ ; YES WE DO CMP R4,#ENDTAB ; ARE WE AT END BLO 10$ ; IF LO, NO, LOOK SOME MORE PRINT M5 ; ILLEGAL COMMAND SWITCH JMP ERRXIT ; EXIT WITH ERROR STATUS 20$: ; CALL @JMPTAB-SWTAB-2(R4) ; JUST LIKE IN CCL RETURN ROBIN: INC RBNFLG ; SHOW WE HAVE BEEN HERE CALL GETVAL ; PARSE COMMAND AND GET VALUE FOR INTERVAL MOV R1,RBNVAL ; KEEP VALUE RETURN ; BACK FOR MORE SWAP: INC SWPFLG ; SHOW WE HAVE BEEN HERE CALL GETVAL ; GET INTERVAL VALUE MOV R1,SWPVAL ; KEEP VALUE RETURN ; BACK FOR MORE DSPLAY: INC DSPFLG ; SET DISPLAY FLAG RETURN ; AND LOOK FOR MORE GETVAL: ; REF LABLE CLR R3 ; CLEAR COUNTER MOV #TICVAL,R0 ; WHERE WE WILL PUT NUMBER 1$: CMPB (R5),#15 ; CR IS ILLEGAL HERE BNE 10$ ; IF NE, OK 5$: PRINT M4 ; A CR HERE IS SYNTAX ERROR JMP ERRXIT ; EXIT WITH ERROR STATUS 10$: CMPB (R5),#33 ; AN ESC IS ALSO ILLEGAL BEQ 5$ ; SO EXIT WITH ERROR CMPB (R5),#'/ ; A '/' HERE UNTIL AFTER NUMBER IS ILLEGAL BEQ 5$ ; SO EXIT WITH ERROR IF FOUND CMPB (R5)+,#': ; HAVE WE GOT ':' BEQ 20$ ; IF EQ, YES, LOOK FOR NUMBER BR 1$ ; AND LOOK SOME MORE 20$: ; CMPB (R5),#15 ; IS A RIGHT AFTER ':' BEQ 5$ ; IF EQ, YES, SYNTAX ERROR CMPB (R5),#33 ; PERHAPS ITS AN ESC RIGHT AFTER ':' BEQ 5$ ; IF EQ, YES, ITS A FATAL SYNTAX ERROR 25$: ; CMPB (R5),#'0 ; IS IT >=0 BLT 50$ ; IF LT, ASSUME NUMBER DONE, TRY TO CONVERT IT CMPB (R5),#'9 ; IS IT <=9 BGT 5$ ; IF GT 9 BEFORE ENCOUNTERING A '/', ITS A SYNTAX ERROR INC R3 ; KEEP TRACK OF THE NUMBER OF CHARACTERS CMP R3,#5 ; IS IT GREATER THAN 5 BGT 5$ ; IF YES, SYNTAX ERROR MOVB (R5)+,(R0)+ ; IF NO, MOVE INTO TICVAL BR 25$ ; GET ANOTHER NUMBER 50$: ; CMPB (R5),#'/ ; IS IT A '/' BEQ 60$ ; A '/' IS OK CMPB (R5),#15 ; IS IT EOL BEQ 60$ ; EOL IS OK ALSO CMPB (R5),#33 ; IS IT ESC BEQ 60$ ; AN ESC FOR EOL OK ALSO BR 5$ ; ANYTHING ELSE IS FATAL SYNTAX ERROR 60$: ; MOVB #'*,(R0) ; SET A NON NUMERIC CHARACTER TO TERMINATE CONVERSION MOV #TICVAL,R0 ; GET ADDRESS OF ASCII STRING CALL $CDTB ; CONVERT TO DECIMAL TST R1 ; IS IT >0 BNE 65$ ; IF NE,YES 63$: PRINT M6 ; WARN USER, DELTA VALUE IS ILLEGAL JMP ERRXIT ; AND EXIT WITH ERROR 65$: DEC R5 ; BACK UP POINTER TO BEFORE /(IF ANY) RETURN ; DSP: MOV $ROBIN,R1 ; GET THE SAMPLE INTERVAL VALUE MOV #RBNTM,R0 ; ADDRESS OF WHERE TO PLACE TIME NUMBER CLR R2 ; SUPPRESS LEADING ZEROS CALL $CBDMG ; CONVERT TO DECIMAL ASCII PRINT SCHHDR ; PRINT OUT HEADER AND ROUND ROBIN TIME MOV $SWAP,R1 ; GET SWAPING INTERVAL MOV #SWPTM,R0 ; GET OUTPUT STRING ADDRESS CLR R2 ; SUPRESS LEADING ZEROS CALL $CBDMG ; CONVERT TO DECIMAL ASCII PRINT SWPTIM ; WRITE IT OUT RETURN ; AND RETURN TO MAINLINE .SBTTL ENDUP PROCES THE COMMANDS AND EXIT ;+ ; ENDUP -- PROCESS THE VARIOUS COMMANDS ISSUED ON THE COMMAND LINE ; AND EXIT ; ;- ENDUP: ; CMP SWPVAL,RBNVAL ; THE SWAPING TIME MUST BE > ROBIN INTERVAL BGT 5$ ; IF GT OK PRINT M6 ; IF LE, ERROR BR ERRXIT ; FATAL ERROR 5$: ; CALL $SWSTK,10$ ; SWITCH TO SYSTEM STATE MOV SWPVAL,$SWAP ; SET SWAP TIME MOV RBNVAL,$ROBIN ; SET ROUND ROBIN INTERVAL RETURN ; BACK TO USER STATE 10$: TST DSPFLG ; SHOULD WE DISPLAY CURRENT STATUS BEQ XIT ; IF EQ, NO CALL DSP ; YES XIT: EXST$S #1 ; ERRXIT: EXST$S #4 ; ;+ ; PNTLIN ; ; THIS ROUTINE WILL PRINT AN ASCIZ LINE ;- PNTLIN: MOV #-1,R1 ; GET COUNT INITIALIZED MOV R0,QIODPB+Q.IOPL ; STORE BUFFER ADDRESS 170$: INC R1 ; INCREMENT COUNTER TSTB (R0)+ ; IS THIS THE LAST BYTE? BNE 170$ ; NO. KEEP GOING MOV R1,QIODPB+Q.IOPL+2 ; STORE BYTE COUNT DIR$ #QIODPB RETURN .END SCH