PROGRAM MODTSK CCCCC CCCCC CCCCC CHANGE THE NEXT PARAMETER TO .TRUE. IF BUILDING FOR RSX-11M-PLUS CCCCC CCCCC Please note, though: this program has not been tested on 11M+ CCCCC CCCCC CCCCC PARAMETER RSXPLS = .FALSE. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C MODTSK -- MODify TaSK -- Modify certain parameters in task-image label block C C AUTHOR - Scott Snadow C C General Dynamics C C P.O. Box 2507 Mail Zone #4-68 C C Pomona, California 91769 C C (714)-620-7511 Extension 8262 C C DATE - 27-SEP-82 C C C C DESCRIPTION C C This program is used to modify certain parameters in the C C label block of a task image. All of these parameters are C C available through the task builder (TKB) as switches or C C options, however, MODTSK allows you to change these C C parameters without having to re-build the program. C C C C Admittedly, some of the parameters that this program allows C C you to change should be changed ONLY by re-building the task. C C This is because some parameters influence more than just the C C label block of the task-image; and this program is concerned C C SOLELY with the label block. C C On the positive side, though, many of TKB's switches and C C options are implemented through single bits or words in the C C task's label block; MODTSK is a very efficient way to change C C these things. C C Lastly, the reason why MODTSK was written: C C With MODTSK, you can have the ability to change things that C C the Fast Task-Builder (FTB) won't let you do (I got tired of C C using TKB instead of FTB when all I wanted to do was use the C C TASK= option). C C C C CONVENTIONS C C 1. Lower-case input is acceptable. C C 2. Entering a control-Z at any prompt will cancel the program, C C with no changes made to any currently-open task image. C C 3. The task-image file is opened as "readonly"; it is closed C C and re-opened for updating ONLY when a -1 is entered to OK C C the update (so the file's revision date will not change if C C you use MODTSK only to examine existing parameters). C C 4. This program is not commented as well as I normally would C C have done it (I "whipped" this program out); but the program C C has worked well, so you (hopefully) won't have to go into it. C C C C SUBROUTINES CALLED C C IRAD50 -- Change ASCII to RAD50 (should be in SYSLIB) C C R50ASC -- Change RAD50 to ASCII (should be in SYSLIB) C C UPPER -- Convert byte-string to upper case C C UPDATE -- Modify task flags word C C C C REFERENCE - See the RSX-11M/M-PLUS Task Builder Manual, C C Appendix "Detailed Task Image File Structure" C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC IMPLICIT INTEGER(A-Z) PARAMETER ( ! LOCATIONS IN LABEL BLOCK 1 R50STF ='0'O, ! TASK NAME AND PARTITION NAME 2 FLAGS ='14'O, ! FLAG WORD (LOTS OF BITS) 3 DAY ='17'O, ! DAY 4 MONTH ='16'O, ! MONTH 5 YEAR ='15'O, ! AND YEAR BUILT 6 PRI ='163'O, ! PRIORITY 7 EXT ='165'O) ! TASK EXTENSION, IN 32-WORD BLOCKS INTEGER 1 BLOCK(0:255), ! LABEL BLOCK GETS PUT HERE 2 NUMDIG, ! FUNCTION (NUM OF DIGITS IN INTEGER) 3 SMCOLN ! INDEX OF SEMICOLON IN FILENAME LOGICAL 1 CHANGE, ! .TRUE. IF ANY PARAMETER WAS CHANGED 2 TF, ! FUNCTION (IS BIT 1(TRUE) OR 0(FALSE)) 3 L CHARACTER 1 FILNAM*80, ! TASK-IMAGE FILE NAME 2 TSKPAR*12, ! TASK NAME AND PARTITION NAME 3 MO(13)*3, ! MONTHS (13=UNDEFINED) 4 TEMP*80, 5 TMPMO*3 DATA MO /'JAN','FEB','MAR','APR','MAY','JUN', 1 'JUL','AUG','SEP','OCT','NOV','DEC','***'/ C C STATEMENT FUNCTIONS C C NUMDIG(INT) --- NUMBER OF DIGITS IN NON-NEGATIVE INTEGER "INT" C NUMDIG(INT) = MAX(1, IFIX(LOG10(INT + 0.5)) + 1) C C TF(IWORD, IBITNO) --- IS BIT NUMBER "IBITNO" SET IN WORD "IWORD"? C TF(IWORD, IBITNO) = 0 .NE. (IWORD .AND. ISHFT('1'O, IBITNO)) C C START OF EXECUTABLE PROGRAM C TYPE 10 10 FORMAT (' This program enables you to modify some of the parameters'/ 1 ' in the label block of a task image. While many of the'/ 2 ' parameters can be set with switches or options to the task'/ 3 ' builder, re-linking a task is relatively time-consuming.'/ 4 ' You may exit the program at any time by entering a CTRL-Z'/ 5 ' when the program is prompting for input.'/) 20 CHANGE = .FALSE. ! NO CHANGES HAVE YET BEEN MADE TYPE 30 30 FORMAT ('$NAME OF TASK IMAGE TO MODIFY (DEFAULT EXT = .TSK):>') READ (UNIT=5,FMT=40,END=310) FILNAM 40 FORMAT (A) CALL UPPER(FILNAM,LEN(FILNAM)) ! CONVERT TO UPPER-CASE IF (INDEX(FILNAM, '.') .EQ. 0) THEN SMCOLN = INDEX(FILNAM, ';') IF (SMCOLN .NE. 0) THEN TEMP = FILNAM(SMCOLN:) FILNAM(SMCOLN:) = '.TSK' FILNAM(SMCOLN+4:) = TEMP ELSE FILNAM(LEN(FILNAM) - 3:) = '.TSK' END IF END IF OPEN (UNIT=1,NAME=FILNAM,READONLY,STATUS='OLD', 1 FORM='UNFORMATTED',ACCESS='DIRECT',ERR=320) READ (UNIT=1,REC=1) BLOCK ! READ IN THE TASK LABEL BLOCK CALL R50ASC(12,BLOCK(R50STF),TSKPAR) ! MAKE TASKNAME AND PARTITION ! NAME ASCII F=BLOCK(FLAGS) ! COPY FLAG WORD FROM LABEL BLOCK C C DISPLAY PARAMETERS AS THEY CURRENTLY EXIST C IF ((BLOCK(MONTH) .GE. 1) .AND. (BLOCK(MONTH) .LE. 12)) THEN TMPMO = MO(BLOCK(MONTH)) ELSE TMPMO = MO(13) END IF IF (RSXPLS) THEN TYPE 50,TSKPAR(1:6),TSKPAR(7:12), 1 (TF(F,I),I=15,10,-1),(TF(F,I),I=8,1,-1), 2 BLOCK(DAY),TMPMO,BLOCK(YEAR), 3 BLOCK(PRI),BLOCK(EXT) 50 FORMAT (' TASK NAME: ', A/ 1 ' PARTITION NAME: ', A/ 2 ' POSITION-INDEPENDENT CODE? ', L1/ 3 ' NO HEADER? ', L1/ 4 ' ANCILLARY CONTROL PROCESSOR? ', L1/ 5 ' POST-MORTEM DUMP ON ABORT? ', L1/ 6 ' CAN TASK BE SLAVED? ', L1/ 7 ' NO SENDING TO TASK PERMITTED? ', L1/ 8 ' TASK PRIVILEGED? ', L1/ 9 ' TASK BUILT IN COMPATIBILITY MODE? ', L1/ 1 ' TASK NOT CHECKPOINTABLE? ', L1/ 1 ' TASK HAS MEMORY-RESIDENT OVERLAYS? ', L1/ 2 ' PRIV. TASK DOES NOT MAP I/O PAGE? ', L1/ 3 ' SUPERVISOR-MODE LIBRARY? ', L1/ 4 ' TASK BUILT WITH EXTERNAL HEADER? ', L1/ 5 ' TASK BUILT WITH NON-EXT. HEADER? ', L1/ 6 ' DATE TASK BUILT: ', 7 I,'-',A,'-',I2.2/ 8 ' TASK PRIORITY: ', 9 I/ 2 ' TASK EXTENSION (32-WORD BLOCKS): ', 1 I) ELSE TYPE 55,TSKPAR(1:6),TSKPAR(7:12), 1 (TF(F,I),I=15,10,-1),(TF(F,I),I=8,4,-1), 2 BLOCK(DAY),TMPMO,BLOCK(YEAR), 3 BLOCK(PRI),BLOCK(EXT) 55 FORMAT (' TASK NAME: ', A/ 1 ' PARTITION NAME: ', A/ 2 ' POSITION-INDEPENDENT CODE? ', L1/ 3 ' NO HEADER? ', L1/ 4 ' ANCILLARY CONTROL PROCESSOR? ', L1/ 5 ' POST-MORTEM DUMP ON ABORT? ', L1/ 6 ' CAN TASK BE SLAVED? ', L1/ 7 ' NO SENDING TO TASK PERMITTED? ', L1/ 8 ' TASK PRIVILEGED? ', L1/ 9 ' TASK BUILT IN COMPATIBILITY MODE? ', L1/ 1 ' TASK NOT CHECKPOINTABLE? ', L1/ 1 ' TASK HAS MEMORY-RESIDENT OVERLAYS? ', L1/ 2 ' PRIV. TASK DOES NOT MAP I/O PAGE? ', L1/ 3 ' DATE TASK BUILT: ', 4 I,'-',A,'-',I2.2/ 5 ' TASK PRIORITY: ', 6 I/ 7 ' TASK EXTENSION (32-WORD BLOCKS): ', 8 I) END IF TYPE 60 60 FORMAT (' Now for the changes. If no change, press return.'// 1 '$TASK NAME (TASK=)>') READ (UNIT=5,FMT=70,END=340) Q,TEMP 70 FORMAT (Q,A) IF (Q .NE. 0) THEN CHANGE = .TRUE. TSKPAR(:6) = TEMP(:6) END IF TYPE 80 80 FORMAT ('$PARTITION NAME (PAR=)>') READ (UNIT=5,FMT=70,END=340) Q,TEMP IF (Q .NE. 0) THEN CHANGE = .TRUE. TSKPAR(7:) = TEMP(:6) END IF TYPE 90 90 FORMAT (' Answer the following options with T (true), F (false), ', 1 'or RETURN for no change.'// 2 '$POSITION-INDEPENDENT CODE (/PI)>') READ (UNIT=5,FMT=100,END=340) Q,L 100 FORMAT (Q,L1) IF (Q .NE. 0) CALL UPDATE(L, 15, CHANGE, F) TYPE 110 110 FORMAT ('$NO HEADER (/-HD)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE(L, 14, CHANGE, F) TYPE 120 120 FORMAT ('$ANCILLARY CONTROL PROCESSOR (/AC)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE(L, 13, CHANGE, F) TYPE 130 130 FORMAT ('$POST-MORTEM DUMP ON ABORT (/PM)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE (L, 12, CHANGE, F) TYPE 140 140 FORMAT ('$CAN TASK BE SLAVED (/SL)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE (L, 11, CHANGE, F) TYPE 150 150 FORMAT ('$NO SENDING TO TASK PERMITTED (/-SE)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE (L, 10, CHANGE, F) TYPE 160 160 FORMAT ('$TASK PRIVILEGED (/PR:0)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE (L, 8, CHANGE, F) TYPE 170 170 FORMAT ('$TASK BUILT IN COMPATIBILITY MODE (/CM)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE (L, 7, CHANGE, F) TYPE 180 180 FORMAT ('$TASK NOT CHECKPOINTABLE (/-CP)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE (L, 6, CHANGE, F) TYPE 190 190 FORMAT ('$TASK HAS MEMORY-RESIDENT OVERLAYS (! in .ODL file)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE (L, 5, CHANGE, F) TYPE 195 195 FORMAT ('$PRIVILEGED TASK DOES NOT MAP I/O PAGE (/-IP)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE (L, 4, CHANGE, F) IF (RSXPLS) THEN TYPE 200 200 FORMAT ('$SUPERVISOR-MODE LIBRARY (CMPRT=)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE (L, 3, CHANGE, F) TYPE 203 203 FORMAT ('$TASK BUILT WITH EXTERNAL HEADER (/XH)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE (L, 2, CHANGE, F) TYPE 206 206 FORMAT ('$TASK BUILT WITH NON-EXTERNAL HEADER (/-XH)>') READ (UNIT=5,FMT=100,END=340) Q,L IF (Q .NE. 0) CALL UPDATE (L, 1, CHANGE, F) END IF TYPE 210 210 FORMAT (' End of options.'// 1 ' DATE TASK BUILT; ENTER RETURN (NO CHANGE), OR'/ 2 '$3 INTEGERS, SEPARATED BY COMMAS, ', 3 '(MONTH, DAY, YEAR SINCE 1900)>') READ (UNIT=5,FMT=220,END=340) Q,M,D,Y 220 FORMAT (Q,3I5) IF (Q .NE. 0) THEN CHANGE = .TRUE. BLOCK(MONTH) = M BLOCK(DAY) = D BLOCK(YEAR) = Y END IF TYPE 230 230 FORMAT ('$PRIORITY (ENTER RETURN FOR NO CHANGE) (PRI=)>') READ (UNIT=5,FMT=240,END=340) Q,I 240 FORMAT (Q,I5) IF (Q .NE. 0) THEN CHANGE = .TRUE. BLOCK(PRI) = I END IF TYPE 250 250 FORMAT ('$TASK EXTENSION IN 32-WORD BLOCKS (ENTER RETURN ', 1 'FOR NO CHANGE) (EXTTSK=)>') READ (UNIT=5,FMT=240,END=340) Q,I IF (Q .NE. 0) THEN CHANGE = .TRUE. BLOCK(EXT) = I END IF IF (.NOT. CHANGE) THEN ! WERE ANY CHANGES ENTERED? TYPE 260 ! NOPE! 260 FORMAT (' NO CHANGES.') CLOSE (UNIT=1) GOTO 20 ! GO BACK FOR NEXT FILE ELSE TYPE 270 270 FORMAT ('$QUESTIONS COMPLETE. ENTER 0 TO CANCEL, OR -1 ', 1 ' TO MAKE CHANGES>') READ (UNIT=5,FMT=*,END=340) I IF (I .NE. -1) THEN ! SHOULD CHANGES BE RECORDED? TYPE 280 ! NOPE! 280 FORMAT (' CHANGES CANCELLED.') CLOSE (UNIT=1) GOTO 20 ! GO BACK FOR NEXT FILE ELSE TYPE 290 290 FORMAT (' CHANGES IN PROGRESS') CLOSE (UNIT=1) OPEN (UNIT=1,NAME=FILNAM,STATUS='OLD',ACCESS='DIRECT', 1 FORM='UNFORMATTED',ERR=320) BLOCK(FLAGS) = F ! PUT NEW FLAGS IN LABEL BLOCK CALL UPPER(TSKPAR,LEN(TSKPAR)) ! CONVERT TO UPPER-CASE CALL IRAD50(12,TSKPAR,BLOCK(R50STF)) ! CHANGE TO RAD-50 WRITE (UNIT=1,REC=1) BLOCK ! RE-WRITE LABEL BLOCK TO FILE CLOSE (UNIT=1) TYPE 300 300 FORMAT (' CHANGES COMPLETE') GOTO 20 ! GO BACK FOR NEXT FILE END IF END IF 310 GOTO 360 ! EXIT 320 TYPE 330 330 FORMAT (' ERROR OPENING FILE') CLOSE (UNIT=1) GOTO 20 ! GO BACK FOR NEXT FILE 340 TYPE 350 350 FORMAT (' CTRL-Z ENTERED. TASK NOT MODIFIED.') 360 CONTINUE END SUBROUTINE UPPER(STRING,STRLEN) C C CONVERT BYTE-STRING TO UPPERCASE C BYTE 1 STRING(255), 2 TEMP INTEGER 1 STRLEN, 2 DIFF, 3 I DIFF = 'A' - 'a' DO 10 I = 1, STRLEN TEMP = STRING(I) IF ((TEMP .GE. 'a') .AND. (TEMP .LE. 'z')) 1 STRING(I) = TEMP + DIFF 10 CONTINUE RETURN END SUBROUTINE UPDATE(LOGANS, BITNO, CHANGE, FLAGWD) C C UPDATE TASK FLAGS WORD, GIVEN USER'S LOGICAL RESPONSE, BIT NUMBER (POSITION C WITHIN FLAG WORD), AND THE FLAG WORD (CHANGE IS SET TO .TRUE. TO REFLECT C THAT AT LEAST ONE PARAMETER WAS CHANGED BY THE USER) C LOGICAL 1 LOGANS, 2 CHANGE INTEGER 1 BITNO, 2 FLAGWD CHANGE = .TRUE. IF (LOGANS) THEN FLAGWD = FLAGWD .OR. ISHFT('1'O, BITNO) ELSE FLAGWD = FLAGWD .AND. .NOT. ISHFT('1'O, BITNO) END IF RETURN END