.TITLE TNM - TASK NAME CHANGE UTILITY ;----------------------------------------------------------------------; ; MODULE: TNM ; ; LANGUAGE: DEC PDP-11 MACRO ASSEMBLY LANGUAGE (V3.2) ; ; SYSTEM: DEC PDP-11 RUNNING UNDER RSX-11M V3.2 ; ; MOSTEK CORPORATION ; ; COMPUTER AIDS TO DESIGN DIVISION ; ; 1215 WEST CROSBY ROAD ; ; CARROLLTON, TEXAS 75006 ; ; (214) 323-8813 ; ;----------------------------------------------------------------------; ; PROGRAMMER: KEVIN KLUGHART ; ;----------------------------------------------------------------------; ; DATE: 04-14-82 @ 06:00 CDST ; ;----------------------------------------------------------------------; ; PURPOSE: THIS UTILITY PROGRAM ALLOWS A USER TO CHANGE ; ; THE TASK NAME OF ANY TASK ASSOCIATED WITH THE ; ; TI: OF THE ISSUING TERMINAL. THIS ALLOWS ; ; MULTIPLE COPIES OF A SINGLE TASK TO RUN ON A ; ; SINGLE TERMINAL, EACH HAVING A DIFFERENT TASK ; ; NAME. THE FORMAT FOR THIS COMMAND IS: ; ; ; ; >TNM oldtnm newtnm ; ; ; ; WHERE oldtnm IS THE CURRENT TASK NAME OF THE ; ; TASK TO BE CHANGED AND newtnm IS THE NEW TASK ; ; NAME TO REPLACE THE TASK NAME OF THE SELECTED ; ; TASK. NOTE THAT BOTH ENTRIES MUST BE LESS ; ; THAN OR EQUAL TO 6 RADIX-50 CHARACTERS IN ; ; LENGTH - THE COMMAND IS IGNORED OTHERWISE. ; ;----------------------------------------------------------------------; .IDENT /V01.00/ ; CURRENT RELEASE .PSECT $DATA .ENABLE LC .SBTTL PROGRAM PARAMETERS ;----------------------------------------------------------------------; ; ; ; ; ; PROGRAM PARAMETERS ; ; ; ; ; ;----------------------------------------------------------------------; ; LOGICAL UNIT ASSIGNMENTS ; ;----------------------------------------------------------------------; TILUN = 000001 ; USER COMMAND INPUT ;----------------------------------------------------------------------; ; EVENT FLAG ASSIGNMENTS ; ;----------------------------------------------------------------------; TIFLAG= TILUN ; EVENT FLAG FOR TERMINAL I/O ;----------------------------------------------------------------------; ; CHARACTER PARAMETERS ; ;----------------------------------------------------------------------; BLANK = 000040 ; ASCII PAD CHARACTER CLEAR = 022044 ; TASK NAME CLEAR CHARACTER ('$$') SPACE = 000137 ; BLANK "SPACE" REPLACEMENT CHARACTER .SBTTL EXTERNAL MACROS ;----------------------------------------------------------------------; ; ; ; ; ; EXTERNAL MACROS ; ; ; ; ; ;----------------------------------------------------------------------; ; EXECUTIVE DIRECTIVE MACROS ; ;----------------------------------------------------------------------; .MCALL DIR$ ; EXECUTE EXECUTIVE DIRECTIVE .MCALL EXIT$S ; EXIT TASK .MCALL QIOW$S ; QUEUE I/O REQUEST AND WAIT .MCALL TCBDF$ ; DEFINE TASK CONTROL BLOCK OFFSETS ;----------------------------------------------------------------------; ; FILE PROCESSING MACROS ; ;----------------------------------------------------------------------; .MCALL FINIT$ ; INITIALIZE FILE PROCESSING .MCALL FSRSZ$ ; ALLOCATE FSR REGION ;----------------------------------------------------------------------; ; COMMAND LINE PROCESSING MACROS ; ;----------------------------------------------------------------------; .MCALL GCML$ ; GET MCR COMMAND LINE .MCALL GCMLB$ ; GET MCR COMMAND LINE BUFFER DEFINITION .MCALL GCMLD$ ; DEFINE OFFSETS FOR GCMLB$ .SBTTL LOCAL MACRO DEFINITIONS ;----------------------------------------------------------------------; ; ; ; ; ; LOCAL MACRO DEFINITIONS ; ; ; ; ; ;----------------------------------------------------------------------; ; ERROR REPORTING MACRO ; ;----------------------------------------------------------------------; ; THIS MACRO ALLOWS THE PROGRAMMER TO SPECIFY AN ERROR VALUE OR ; ; ALLOW THE ERROR MACRO TO SPECIFY AN ERROR INDEX WHICH IS PUT ; ; IN REGISTER R5 PRIOR TO TRAPPING BY AN ODD ADDRESS TRAP. ; ;----------------------------------------------------------------------; .MACRO ERROR ERR,ERRBYT .IF NDF $$$ERR ; DEFINE ERROR COUNT IF FIRST INVOCATION $$$ERR= 0 ; INITIALIZE ERROR COUNT .ENDC .NARG $$$ERC ; COMPUTE NUMBER OF ERROR ARGUMENTS $$$ERR= $$$ERR+1 ; *********** ERROR INDEX *********** .PRINT $$$ERR ; *********** ERROR INDEX *********** MOVB #$$$ERR,R5 ; GET ERROR INDEX POINTER ASL R5 ; SHIFT ERROR TO UPPER 3 OCTAL DIGITS (XXX.000) ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; ASL R5 ; RESULT IS CNT.ERR (000.000) .IF NE $$$ERC ; IF NUMBER OF ARGUMENTS IS NOT ZERO, SHOW ERROR BISB ERR,R5 ; GET ERROR NUMBER .ENDC .IF EQ $$$ERC-2 ; IF 2 ARGUMENTS, LOAD R4 WITH ERROR BYTE MOVB ERRBYT,R4 ; GET ERROR BYTE .ENDC TST .+1 ; EXIT WITH FATAL ODD ADDRESS TRAP .ENDM ;----------------------------------------------------------------------; ; ; ; PRINT MESSAGE TO CONSOLE MACRO ; ; ; ;----------------------------------------------------------------------; ; THIS MACRO ALLOWS THE USER TO QUEUE A MESSAGE TO THE USER ; ; TERMINAL, AND LOGS THE MESSAGE TO THE OPERATOR CONSOLE ; ;----------------------------------------------------------------------; .MACRO PRINT MSG,LEN .NARG $$$CNT ; GET NUMBER OF ARGUMENTS MOV MSG,MS.PTR ; GET ADDRESS OF MESSAGE TO PRINT MOV LEN,MS.LEN ; GET LENGTH OF MESSAGE JMP $MSG ; PRINT THE MESSAGE .ENDM ; END OF PRINT MACRO .SBTTL DIRECTIVE PARAMETER BLOCKS (DPB'S) ;----------------------------------------------------------------------; ; ; ; ; ; DIRECTIVE PARAMETER BLOCKS ; ; ; ; ; ;----------------------------------------------------------------------; ; SET UP GET COMMAND LINE BUFFERS FOR USER INPUT ; ;----------------------------------------------------------------------; ; FORMAT FOR GCML MACRO: GCMLB$ MAXD,PRMPT,UBUF,LUN,PDL,SIZE ; ;----------------------------------------------------------------------; .EVEN GETMCR: GCMLB$ 1,TNM .SBTTL DATA BUFFERS ;----------------------------------------------------------------------; ; ; ; ; ; DATA BUFFERS ; ; ; ; ; ;----------------------------------------------------------------------; ; FILE STORAGE REGION ; ;----------------------------------------------------------------------; .EVEN FSRSZ$ 2,,$DATA ; ONLY TWO FILES HERE: INPUT/MCR ;----------------------------------------------------------------------; ; DEFINE ERROR STATUS WORD FOR KERNEL MODE ERRORS ; ;----------------------------------------------------------------------; KNLERR: .BLKW 1 ; KERNEL MODE ERROR STATUS ;----------------------------------------------------------------------; ; DEFINE OLD (CURRENT) TASK NAME BUFFER ; ;----------------------------------------------------------------------; OLDASC: .BLKB 6 ; DEFINE ASCII TASK NAME BUFFER OLDOVR= .+1 ; DEFINE TASK NAME OVERFLOW MARK OLDTNM: .BLKW 2 ; DEFINE RADIX-50 TASK NAME BUFFER ;----------------------------------------------------------------------; ; DEFINE NEW (REPLACEMENT) TASK NAME BUFFER ; ;----------------------------------------------------------------------; NEWASC: .BLKB 6 ; DEFINE ASCII TASK NAME BUFFER NEWOVR= .+1 ; DEFINE TASK NAME OVERFLOW MARK NEWTNM: .BLKW 2 ; DEFINE RADIX-50 TASK NAME BUFFER .SBTTL OPERATOR MESSAGES ;----------------------------------------------------------------------; ; ; ; ; ; OPERATOR MESSAGES ; ; ; ; ; ;----------------------------------------------------------------------; ; DEFINE MESSAGE DESCRIPTOR ; ;----------------------------------------------------------------------; .EVEN MS.PTR: .BLKW 1 ; MESSAGE POINTER MS.LEN: .BLKW 1 ; MESSAGE LENGTH ;----------------------------------------------------------------------; ; DEFINE QIO STATUS BLOCK WHICH RETURNS I/O COMPLETION STATUS ; ;----------------------------------------------------------------------; IOSTAT: .BLKW 1 ; COMPLETION STATUS + DEVICE DATA BYTCNT: .BLKW 1 ; I/O TRANSFER COUNT (BYTES) ;----------------------------------------------------------------------; ; OPERATOR MESSAGES ; ;----------------------------------------------------------------------; ; INVALID INPUT (SEARCH) TASK NAME ; ;----------------------------------------------------------------------; MS.OER: .ASCII /*** Invalid search task name ***/ ML.OER= .-MS.OER ;----------------------------------------------------------------------; ; INVALID REPLACEMENT TASK NAME ; ;----------------------------------------------------------------------; MS.NER: .ASCII /*** Invalid replacement task name ***/ ML.NER= .-MS.NER ;----------------------------------------------------------------------; ; INPUT TASK NAME NOT FOUND ; ;----------------------------------------------------------------------; MS.NON: .ASCII /*** Input task not found ***/ ML.NON= .-MS.NON .SBTTL EXTERNAL SYMBOL DEFINITIONS ;----------------------------------------------------------------------; ; ; ; EXTERNAL SYMBOL DEFINITIONS ; ; ; ;----------------------------------------------------------------------; ; DEFINE TASK CONTROL BLOCK OFFSETS ; ;----------------------------------------------------------------------; TCBDF$ ; DEFINE OFFSETS FOR TI: TCB .SBTTL TNM - MAIN PROGRAM INITIALIZATION ;----------------------------------------------------------------------; ; ; ; ; ; ; ; TNM - MAIN PROGRAM INITIALIZATION ; ; ; ; ; ; ; ;----------------------------------------------------------------------; ; INITIALIZE FILE SYSTEM PROCESSING ; ;----------------------------------------------------------------------; .PSECT TNM .EVEN TNM: FINIT$ ; INITIALIZE FILE SYSTEM PROCESSING .SBTTL GET A COMMAND LINE FROM THE USER ;----------------------------------------------------------------------; ; ; ; ; ; GET A COMMAND LINE FROM THE USER ; ; ; ; ; ;----------------------------------------------------------------------; ; USE MCR INTERFACE TO GET USER COMMAND ; ;----------------------------------------------------------------------; GETCMD: GCML$ #GETMCR ; GET MCR COMMAND LINE TSTB GETMCR+G.ERR ; ANY ERROR? BEQ PARSE ; NO, PARSE COMMAND LINE ;----------------------------------------------------------------------; ; ERROR IN GETTING COMMAND: EITHER EOF OR SOME FATAL ERROR ; ;----------------------------------------------------------------------; CMPB GETMCR+G.ERR,#GE.EOF ; END-OF-FILE IN INPUT? BNE 10$ ; NO, SOME FATAL GCML ERROR JMP EXIT ; YES, EXIT TASK 10$: ERROR GETMCR+G.ERR ; INFORM USER OF FATAL ERROR .SBTTL PARSE USER COMMAND STRING ;----------------------------------------------------------------------; ; ; ; ; ; PARSE USER COMMAND STRING ; ; ; ; ; ;----------------------------------------------------------------------; ; LOAD ADDRESS AND LENGTH OF USER COMMAND LINE ; ;----------------------------------------------------------------------; PARSE: MOV GETMCR+G.CMLD+2,R0 ; GET ADDRESS OF COMMAND LINE MOV GETMCR+G.CMLD,R1 ; GET COMMAND LENGTH ;----------------------------------------------------------------------; ; SKIP TO FIRST NONBLANK FIELD IN COMMAND LINE ; ;----------------------------------------------------------------------; 10$: CMPB #BLANK,(R0)+ ; IS THIS FIRST NONBLANK CHARACTER? BNE 20$ ; YES, PROCESS SOURCE TASK NAME DEC R1 ; NO, DECREMENT COMMAND LENGTH BGT 10$ ; AND CONTINUE OF NOT END-OF-COMMAND ;----------------------------------------------------------------------; ; ERROR - NO COMMAND STRING PRESENT ; ;----------------------------------------------------------------------; PRINT #MS.OER,#ML.OER ; REPORT ERROR TO USER AND EXIT ;----------------------------------------------------------------------; ; ; ; LOAD SOURCE TASK NAME ; ; ; ;----------------------------------------------------------------------; 20$: DEC R0 ; ADJUST COMMAND INPUT POINTER MOV #OLDASC,R2 ; GET ADDRESS OF TASK NAME BUFFER MOV #CLEAR,OLDASC+0 ; CLEAR TASK NAME MOV #CLEAR,OLDASC+2 ; MOV #CLEAR,OLDASC+4 ; ;----------------------------------------------------------------------; ; COPY SOURCE TASK NAME - CHECK FOR BLANK OR "SPACE" INDICATOR ; ;----------------------------------------------------------------------; 30$: CMPB #BLANK,(R0) ; IS THIS CHARACTER A BLANK? BEQ 60$ ; YES, PROCESS NEXT FIELD CMPB #SPACE,(R0) ; "SPACE" CHARACTER? BNE 40$ ; NO, TRANSFER BYTE MOVB #BLANK,(R0) ; YES, REPLACE WITH A BLANK 40$: MOVB (R0)+,(R2)+ ; LOAD 1 BYTE OF TASK NAME CMP #OLDOVR,R2 ; OUTPUT BUFFER OVERFLOW? BNE 50$ ; NO, CHECK FOR END-OF-COMMAND PRINT #MS.OER,#ML.OER ; SIGNAL SOURCE TASK ERROR TO USER ;----------------------------------------------------------------------; ; CHECK FOR END-OF-COMMAND LINE ; ;----------------------------------------------------------------------; 50$: DEC R1 ; DECREMENT COMMAND LENGTH BGT 30$ ; AND CONTINUE IF NOT END-OF-COMMAND PRINT #MS.NER,#ML.NER ; REPORT ERROR TO USER AND EXIT ;----------------------------------------------------------------------; ; ; ; SKIP TO NEXT FIELD IN COMMAND LINE ; ; ; ;----------------------------------------------------------------------; 60$: CMPB #BLANK,(R0)+ ; IS THIS THE FIRST NONBLANK CHARACTER? BNE 70$ ; YES, PROCESS REPLACEMENT TASK NAME DEC R1 ; NO, DECREMENT COMMAND LENGTH BGT 60$ ; AND CONTINUE IF NOT END-OF-COMMAND PRINT #MS.NER,#ML.NER ; REPORT ERROR TO USER AND EXIT ;----------------------------------------------------------------------; ; ; ; LOAD REPLACEMENT TASK NAME ; ; ; ;----------------------------------------------------------------------; 70$: DEC R0 ; ADJUST COMMAND INPUT POINTER MOV #NEWASC,R2 ; GET ADDRESS OF TASK NAME BUFFER MOV #CLEAR,NEWASC+0 ; CLEAR TASK NAME MOV #CLEAR,NEWASC+2 ; MOV #CLEAR,NEWASC+4 ; ;----------------------------------------------------------------------; ; COPY REPLACEMENT TASK NAME ; ;----------------------------------------------------------------------; 80$: CMPB #BLANK,(R0) ; IS THIS CHARACTER A BLANK? BEQ RAD50 ; YES - END OF PARSE CMPB #SPACE,(R0) ; "SPACE" CHARACTER? BNE 90$ ; NO, TRANSFER A BYTE MOVB #BLANK,(R0) ; YES, REPLACE WITH A BLANK 90$: MOVB (R0)+,(R2)+ ; LOAD 1 BYTE OF TASK NAME CMP #NEWOVR,R2 ; OUTPUT BUFFER OVERFLOW? BNE 100$ ; NO, CHECK FOR END-OF-COMMAND PRINT #MS.NER,#ML.NER ; SIGNAL REPLACEMENT TASK ERROR TO USER ;----------------------------------------------------------------------; ; CHECK FOR END-OF-COMMAND LINE ; ;----------------------------------------------------------------------; 100$: DEC R1 ; DECREMENT COMMAND LENGTH BGT 80$ ; AND CONTINUE IF NOT END-OF-COMMAND .SBTTL CONVERT TASK NAMES TO RADIX-50 ;----------------------------------------------------------------------; ; ; ; ; ; CONVERT TASK NAMES TO RADIX-50 ; ; ; ; ; ;----------------------------------------------------------------------; ; CONVERT SOURCE TASK NAME TO RADIX-50 ; ;----------------------------------------------------------------------; RAD50: MOV #OLDASC,R0 ; GET ADDRESS OF SOURCE TASK NAME MOV #1,R1 ; SPECIFY PERIOD AS VALID RAD50 DATA CALL $CAT5B ; CONVERT ASCII TO RADIX-50 MOV R1,OLDTNM+0 ; LOAD RADIX-50 RESULT MOV #1,R1 ; SPECIFY PERIOD AS VALID RAD50 DATA CALL $CAT5B ; CONVERT ASCII TO RADIX-50 MOV R1,OLDTNM+2 ; LOAD RADIX-50 RESULT ;----------------------------------------------------------------------; ; CONVERT REPLACEMENT TASK NAME TO RADIX-50 ; ;----------------------------------------------------------------------; MOV #NEWASC,R0 ; GET ADDRESS OF REPLACEMENT TASK NAME MOV #1,R1 ; SPECIFY PERIOD AS VALID RAD50 DATA CALL $CAT5B ; CONVERT ASCII TO RADIX-50 MOV R1,NEWTNM+0 ; LOAD RADIX-50 RESULT MOV #1,R1 ; SPECIFY PERIOD AS VALID RAD50 DATA CALL $CAT5B ; CONVERT ASCII TO RADIX-50 MOV R1,NEWTNM+2 ; LOAD RADIX-50 RESULT .SBTTL CHANGE TASK NAMES ;----------------------------------------------------------------------; ; ; ; ; ; CHANGE TASK NAMES ; ; ; ; ; ;----------------------------------------------------------------------; ; NOTE: THIS SECTION OF CODE OPERATES IN KERNEL MODE. ; ; PLEASE KEEP CPU TIME SPENT IN THIS ROUTINE TO AN ; ; ABSOLUTE MINIMUM. ; ;----------------------------------------------------------------------; ; CHANGE TO KERNEL MODE AND LOAD TCB CONSTANTS ; ;----------------------------------------------------------------------; CNAME: CALL $SWSTK,CHKERR ; ENTER KERNEL MODE CLR KNLERR ; CLEAR KERNEL ERROR FLAGS MOV #.CO0,R0 ; GET ADDRESS OF CO: UCB MOV $TKTCB,R1 ; GET TCB ADDRESS OF TI: MOV T.UCB(R1),R2 ; GET ADDRESS OF TI: UCB MOV $ACTHD,R3 ; GET ADDRESS OF ACTIVE TASK LIST ;----------------------------------------------------------------------; ; COMPARE SEARCH TASK NAME WITH THAT IN THE ACTIVE TASK LIST ; ;----------------------------------------------------------------------; 10$: CMP OLDTNM+0,T.NAM+0(R3) ; DO FIRST 3 CHARACTERS MATCH? BNE 20$ ; NO, SKIP THIS ATL ENTRY CMP OLDTNM+2,T.NAM+2(R3) ; DO SECOND 3 CHARACTERS MATCH? BNE 20$ ; NO, SKIP THIS ATL ENTRY ;----------------------------------------------------------------------; ; ; ; SEARCH TASK NAMES MATCH - REPLACE WITH REPLACEMENT TASK NAME ; ; ; ;----------------------------------------------------------------------; MOV NEWTNM+0,T.NAM+0(R3) ; LOAD FIRST 3 CHARACTERS MOV NEWTNM+2,T.NAM+2(R3) ; LOAD SECOND 3 CHARACTERS RETURN ; RETURN TO USER MODE ;----------------------------------------------------------------------; ; CHAIN TO NEXT ENTRY IN ACTIVE TASK LIST ; ;----------------------------------------------------------------------; 20$: MOV T.ACTL(R3),R3 ; LINK TO NEXT ATL ENTRY BNE 10$ ; AND PROCESS IF NOT END-OF-LIST ;----------------------------------------------------------------------; ; SOURCE TASK NAME NOT FOUND - INFORM USER AND EXIT ; ;----------------------------------------------------------------------; COM KNLERR ; SIGNAL KERNEL SEARCH ERROR RETURN ; RETURN TO USER MODE .SBTTL CHECK FOR KERNEL MODE ERRORS ;----------------------------------------------------------------------; ; ; ; ; ; CHECK FOR KERNEL MODE ERRORS ; ; ; ; ; ;----------------------------------------------------------------------; ; INFORM USER IF TASK WAS NOT FOUND IN ATL LIST ; ;----------------------------------------------------------------------; CHKERR: TST KNLERR ; ANY ERRORS IN KERNEL MODE? BEQ EXIT ; NO, EXIT TASK NORMALLY PRINT #MS.NON,#ML.NON ; INFORM USER OF TASK-NOT-FOUND ERROR .SBTTL PRINT MESSAGE TO USER TERMINAL ;----------------------------------------------------------------------; ; ; ; ; ; PRINT MESSAGE TO USER TERMINAL ; ; ; ; ; ;----------------------------------------------------------------------; ; THIS SUBROUTINE PRINTS A MESSAGE TO THE USER TERMINAL ; ;----------------------------------------------------------------------; ; REGISTER USEAGE: MS.PTR - ADDRESS OF USER MESSAGE ; ; MS.LEN - LENGTH OF USER MESSAGE ; ;----------------------------------------------------------------------; ; QUEUE MESSAGE TO OPERATOR ; ;----------------------------------------------------------------------; $MSG:: QIOW$S #IO.WVB,#TILUN,#TIFLAG,,#IOSTAT,, BCC 10$ ; CHECK FOR I/O ERRORS ERROR $DSW ; SIGNAL DIRECTIVE EXECUTION ERROR ;----------------------------------------------------------------------; ; CHECK FOR SUCCESSFUL I/O COMPLETION ; ;----------------------------------------------------------------------; 10$: CMPB #IS.SUC,IOSTAT ; NORMAL SUCCESSFUL COMPLETION? BEQ EXIT ; YES, TERMINATE TASK EXECUTION ERROR IOSTAT ; NO, INFORM USER OF QIO ERROR .SBTTL TASK TERMINATION ;----------------------------------------------------------------------; ; ; ; TASK TERMINATION ; ; ; ;----------------------------------------------------------------------; EXIT: EXIT$S ; EXIT TASK .END TNM ; END OF MAIN PROGRAM