.TITLE HALT .IDENT /1/ ;+ ; WRITTEN BY: ; JAMES G. DOWNWARD ; KMS FUSION, INC. ; 3941 RESEARCH PARK DR. ; ANN ARBOR, MICH. 48104 ; (313) 769-8500 ; ; DATE: 10-OCT-80 ; ; MODIFIED: ; ; HALT/UNHALT THE EXECUTION OF A TASK BY SETTING BLOCKING ; BITS (NOT NOW USED) IN THE TCB. ; ; THE STP COMMAND IN V3.2 WILL NOT ALWAYS STOP A TASK FROM EXECUTION. ; THE HALT/UNHALT COMMANDS ARE IMPLEMENTED AS EXTERNAL MCR TASK ; WHICH MAY BE INVOKED VIA CCL, WITH WILL ABSOLUTELY STOP A TASK ; FROM FURTHER EXECUTION, OR RESTART SUCH BLOCKED EXECUTION ONCE ; STOPPED. A TASK STOPPED VIA THE HALT COMMAND MAY NOT BE ; RESTARTED IN ANY OTHER MANNER THAN BY THE UNHALT COMMAND. ; A TASK BLOCKED VIA THE HALT COMMAND CAN NOT BE CHECKPOINTED WITHOUT ; MAKING MODIFICATIONS TO REQSB.MAC ; ; COMMAND SYNTAX: ; HALT tsknam ; UNHALT tsknam ; ; IF THE COMMAND SUCCEEDS, A MESSAGE WILL BE ISSUED EITHER TELLING ; YOU THE TASK HAS BEEN BLOCKED, AND TO USE UNBLOCK TO START IT UP. ; OR IT WILL SAY THAT THE TASK HAS BEEN RESTARTED. ; ;- ; .MCALL DIR$,EXST$S,EXIT$S .MCALL QIOW$,ALUN$,GMCR$,TCBDF$,UCBDF$ TCBDF$ UCBDF$ .MACRO PRINT STRING MOV #STRING,R0 CALL PNTLIN .ENDM PRINT .SBTTL LOCAL DATA TS.BLK = 1 ; NEW BIT FOR TCB T.STAT (BLOCKING WORD) MUCB: .WORD 0 ; STORAGE FOR OUR UCB ADDRESS MPARS: .BLKW 2 ; STORAGE FOR TASK NAME QIODPB: QIOW$ IO.WVB,1,1,,,,<0,0,0> ALUN: ALUN$ 1,TI,0 GETMCR: GMCR$ ; GET MCR COMMAND LINE ;ERROR MESSAGES MSG1: .ASCIZ <15><12>/HAL -- TASK NOT ACTIVE/ MSG2: .ASCIZ <15><12>/HAL -- TERMINAL NOT PRIVILEGED/ MSG3: .ASCIZ <15><12>/HAL -- TASK NAME NOT SPECIFIED/ MSG4: .ASCIZ <15><12>/HAL -- TASK NOT FOUND/ MSG5: .ASCIZ <15><12>/HAL -- ONLY 'HALT' AND 'UNHALT' COMMANDS ALLOWED/ MSG7: .ASCII <15><12>/HAL -- TO RESTART TASK, TYPE UNBLOCK / TSK1: .ASCIZ / / MSG8: .ASCII <15><12>/HAL -- EXECUTION RESUMED FOR TASK / TSK2: .ASCIZ / / MSG9: .ASCIZ <15><12>/HAL -- TASK NOT HALTED/ .EVEN .SBTTL PROGRAM CODE ; $STPEP:: DIR$ #ALUN ; ASSIGN TI:'S LUN DIR$ #GETMCR ; GET MCR COMMAND LINE MOV $DSW,R2 ; GET CHARACTERS COUNT CMP R2,#4 ; ENOUGH CHARACTERS BGT 5$ ; IF GT , YES PRINT MSG3 ; JMP ERRXIT ; EXIT WITH BAD STATUS 5$: ; MOV #GETMCR+G.MCRB,R0; POINT TO THE START OF THE CMD LINE 6$: CMPB (R0)+,#40 ; IS IT A SPACE BEQ 7$ ; IF EQ GOT IT DEC R2 ; ONE LESS CHARACTER TO CHECK BGT 6$ ; MORE TO CHECK PRINT MSG3 ; TASK NAME NOT PRESENT JMP ERRXIT ; SO EXIT 7$: MOV #1,R1 ; A PERIOD IS LEGAL CALL $CAT5 ; CONVERT TO RAD50 MOV R1,MPARS ; STORE FIRST PART OF NAME MOV #1,R1 ; A PERIOD IS LEGAL CALL $CAT5 ; CONVERT TO RAD50 MOV R1,MPARS+2 ; SECOND HALF OF NAME MOV #MPARS,R3 ; POINT TO TASK NAME FOR $GTTSK MOV $TKTCB,R0 ; GET OUR TCB ADDRESS MOV T.UCB(R0),MUCB ; SAVE OUR UCB ADDRESS CALL $SRSTD ; GET TASK TCB ADDRESS BCC 10$ ; FOUND IT PRINT MSG4 ; JMP ERRXIT ; EXIT WITH ERROR ; ; CHECK THAT COMMAND CAME FROM TERMINAL WHICH STARTED TASK ; OR FROM A PRIVILEDGED TERMINAL ; 10$: MOV MUCB,R1 ; GET TI UCB ADDRESS BIT #U2.PRV,U.CW2(R1) ; IS THIS A PRIVILEDGED TERMINAL? BNE 100$ ; YES PRINT MSG2 ; WARN TERMINAL NOT PRIVILEGED JMP ERRXIT ; EXIT WITH ERROR 100$: CMP GETMCR+G.MCRB,#"HA ; IS IT 'HALT' BEQ 200$ ; IF EQ YES CMP GETMCR+G.MCRB,#"UN ; IS IT 'UNBLOCK' BEQ 300$ ; IF EQ,YES 110$: PRINT MSG5 ; SAY ONLY 'HALT', 'UNHALT' ALLOWED JMP ERRXIT ; ; ; PROCESS HALT ; 200$: TST T.STAT(R0) ; IS TASK ACTIVE? BPL 250$ ; IF PL, YES PRINT MSG1 ; WARNING, TASK NOT ACTIVE JMP ERRXIT ; AND EXIT 250$: BIS #TS.BLK,T.STAT(R0) ; BLOCK TASK UNTILL UNHALTED MOV #TSK1,R0 ; WHERE NAME GOES MOV MPARS,R1 ; FIRST PART OF NAME CALL $C5TA ; CONVERT TO ASCII MOV MPARS+2,R1 ; SECOND HALF OF NAME CALL $C5TA ; CONVERT PRINT MSG7 ; TELL USER TASK HALTED BR EXIT ; AND EXIT ; ; UNHALT TASK ; 300$: TST T.STAT(R0) ; IS TASK ACTIVE BPL 310$ ; YES PRINT MSG1 ; NOT ACTIVE JMP ERRXIT ; SO EXIT 310$: BIT #TS.BLK,T.STAT(R0) ; IS BLOCK BIT SET? BNE 320$ ; IF NE, YES PRINT MSG9 ; TELL USER ITS NOT HALTED JMP ERRXIT ; 320$: BIC #TS.BLK,T.STAT(R0) ; CLEAR BLOCKING BIT MOV #TSK2,R0 ; WHERE NAME GOES MOV MPARS,R1 ; FIRST PART OF NAME CALL $C5TA ; CONVERT MOV MPARS+2,R1 ; SECOND HALF OF NAME CALL $C5TA ; CONVERT PRINT MSG8 ; BR EXIT ; AND EXIT EXIT: EXST$S #1 ; EXIT WITH SUCCESS EXIT$S ; IN CASE EXIT WITH STATUS MISSING ERRXIT: EXST$S #4 ; EXIT WITH ERROR EXIT$S ; ; THIS ROUTINE WILL PRINT AN ASCIZ LINE ; PNTLIN: MOV #-1,QIODPB+Q.IOPL+2; GET COUNT INITIALIZED MOVB GETMCR+G.MCRB,2(R0); MOVB GETMCR+G.MCRB+1,3(R0); MOVB GETMCR+G.MCRB+2,4(R0); MOV R0,QIODPB+Q.IOPL; STORE BUFFER ADDRESS 10$: INC QIODPB+Q.IOPL+2 ; INCREMENT BYTE COUNT TSTB (R0)+ ; IS THIS THE LAST BYTE? BNE 10$ ; NO. KEEP GOING DIR$ #QIODPB RETURN .END $STPEP