;*************************** AMUS Program Label ******************************
; Filename: RESET.M68 Date: 11/22/89
; Category: UTIL Hash Code: 134-040-650-147 Version: 3.0(101)
; Initials: ULTR/AM Name: DAVID PALLMANN
; Company: ULTRASOFT CORP. Telephone #: 5163484848
; Related Files:
; Min. Op. Sys.: Expertise Level: BEG
; Special:
; Description: A program to reset a "stuck" job. Reset places the job back at
; monitor level. Usage: RESET jobname{/W} With the /W switch, RESET will
; wait for any job I/O to finish before resetting.
;*****************************************************************************
;Copyright (C) 1989 UltraSoft Corporation. All Rights Reserved.
;
;Written by: David Pallmann
;
;This is a job reset program. You use it reset a job that is "stuck". This
;is usually more convenient than resetting the entire system.
;
;RESET is a public domain program. You may freely distribute this software,
;but not for profit. Although RESET is believed to be safe and reliable,
;UltraSoft makes no warranty of fitness and disclaims any liability for its
;for its use. If you discover problems with RESET, we'd like to know about
;it so we can continue to enhance it. UltraSoft Corporation. 516-348-4848.
;
;Edit History:
;3.0(100) 17-Nov-89 completely rewritten. /DFP
;3.0(101) 22-Nov-89 add /W to wait for I/O completion. /DFP
VMAJOR =3
VMINOR =0
VSUB =0
VEDIT =101.
VWHO =0
SEARCH SYS
SEARCH SYSSYM
SEARCH TRM
;constants
LF =12
CR =15
;variables
.OFINI
.OFDEF JOB, 4 ; job name to reset
.OFDEF FLAGS, 2 ; flags:
F$LOG =1 ; log off job
F$WAIT =2 ; wait for I/O completion
.OFSIZ MEMSIZ
;macros
DEFINE CRT N
MOVW #-1_8.+^D<N>,D1
TCRT
ENDM
DEFINE BITW SRC,DST
MOVW DST,D7
ANDW SRC,D7
ENDM
;***********
;* START *
;***********
;start of program
;program header and memory allocation
START: PHDR -1,0,PH$REE!PH$REU ; program header
GETIMP MEMSIZ,A5 ; allocate memory for variables
;************
;* CMDLIN *
;************
;command line processing
;normal command line argument is job name
;no argument on command line displays help
CMDLIN: CALL SWITCH ; process switches
LIN ; end of line?
JEQ HELP ; yes - display help
LEA A1,JOB(A5) ; convert
PACK ; job name
PACK ; to RAD50
CALL SWITCH ; process switches
;************
;* LOCATE *
;************
;locate specified job in job table
;leave JCB address in A4
;if we can't find the job in question we have an error condition
LOCATE: MOV JOBTBL,A0 ; point to job table
LO.CHK: MOV (A0)+,D7 ; get a JCB address
BEQ LO.CHK ; zero - deallocated job - skip
CMP D7,#-1 ; end of job table?
JEQ NAMERR ; yes - job specification error
MOV D7,A4 ; save job control block address
CMM JOB(A5),JOBNAM(A4) ; is this the job we're looking for?
BNE LO.CHK ; no - keep on truckin'
;************
;* SLFCHK *
;************
;Check to see if job name specified is ourself, or our parent job, or a
;child job or ours
;It it is any of these we take no action
SLFCHK: MOV JOBCUR,A6 ; get our own JCB
CMP A4,A6 ; is this us?
JEQ SLFERR ; yes - error
CMP A4,JOBATT(A6) ; is this our parent job?
JEQ PARERR ; yes - error
CMP A6,JOBATT(A4) ; is this one of our kids?
JEQ KIDERR ; yes - error
;************
;* MONCHK *
;************
;Check to see if the job really needs to be reset
;If it is at AMOS command level we will decline to take any action
MONCHK: BITW #J.MON,JOBSTS(A4) ; is job at AMOS command level?
JNE MONERR ; yes - error
;************
;* DDWAIT *
;************
;If the DDBCHN is non-zero, wait for it to exhaust itself
;************
;* SETTRM *
;************
;Set various fields of the Terminal Control Block
SETTRM: PUSH A5 ; save A5
SUPVR ; enter supervisor mode
SVLOK ; disable interrupts
MOV JOBTRM(A4),D7 ; get address of Terminal Control Block
BEQ SE.RST ; no terminal
MOV D7,A5 ;
;wait for the AM350 semaphore
SE.SEM: TAS T.SEM(A5) ; grab AM350 semaphore
BEQ SE.SEM ; keep trying till we get it
;clear fields of terminal control block
SE.CLR: CLR T.ICC(A5) ; clear character count
CLR T.ECC(A5) ; clear echo character count
CLR T.BCC(A5) ; clear break character count
CLR T.OBX(A5) ; clear output buffer
ANDW #^C<T$OIP>,T.STS(A5) ; clera output in progress flag
;flush queued terminal output
SE.FLU: MOV T.OQX(A5),D7 ; index output queue
BEQ 10$ ; it's empty
MOV D7,A1 ; get the index
QRET A1 ; release queue block
MOV A1,T.OQX(A5) ; link the next block in
BR SE.FLU ; keep on flushin'
10$:
SE.RST: CLR T.SEM(A5) ; release semaphore
LSTS #0 ; user mode, re-enable interrupts
POP A5 ; get A5 back
;************
;* RUNJOB *
;************
;Reschedule the job for running
RUNJOB: MOV JOBRNQ+10(A4),A1 ; index saved system stack pointer
LEA A2,CLEAN1 ; index job clean-up routine
TST JOBTRM(A4) ; is the terminal attached?
BNE 10$ ; yes - send it a message
LEA A2,CLEAN2 ; no - just abort it
10$: MOV A2,76(A1) ; set job's PC to call CLEAN? routine
CLR D6 ;
MOVW JOBSTS(A4),D6 ; load job status word
ANDW #<J.NXT!J.TIW!J.TOW!J.SLP!J.IOW!J.EXW!J.SUS!J.SMW>,D6
SVCA 36 ; JRUN
PUSH A5 ; force a ^C to the job
MOV JOBTRM(A4),D7 ;
BEQ 20$ ;
MOV D7,A5 ;
MOV #'C-'@,D1 ;
TRMICP ;
20$: POP A5 ;
JUNLOK ; unlock system
;**********
;* WAIT *
;**********
;Wait for the job to return to AMOS command level
WAIT: MOV #100.,D0 ; pre-set timeout
10$: BITW #J.MON,JOBSTS(A4) ; did we get to AMOS yet?
BNE LOGOFF ; yes
SLEEP #100. ; take a quick nap
DBF D0,10$ ; loop Brett's way
;************
;* FAILED *
;************
;We failed in our reset attempt - admit this with our tail between our legs
FAILED: TTYI ; ding
BYTE 7,0 ;
EVEN ;
TYPECR ?Unable to reset job ;
CRLF ;
EXIT ;
;************
;* LOGOFF *
;************
;Reset was successful
;If /L was specified, log off user job
LOGOFF: BITW #F$LOG,FLAGS(A5) ; was /L specified?
BEQ DONE ; no
MOVW #[DSK],JOBDEV(A4) ; yes - clear log device,
CLRW JOBDRV(A4) ; log drive, and
CLRW JOBUSR(A4) ; log PPN
;**********
;* DONE *
;**********
;We are done - say so
DONE: TYPECR Job has returned to AMOS command level.
CRLF ;
JMP EXIT ;
;**********
;* HELP *
;**********
;Come here to explain command usage
HELP: CRLF ;
TYPESP RESET Job Reset Utility version
VCVT START+2,OT$TRM ;
CRLF ;
TYPECR Copyright (C) 1989 UltraSoft Corporation. All Rights Reserved.
CRLF ;
TYPECR Usage: .RESET jobname {switches}
CRLF ;
TTYI ;
ASCII "Switches: /L - log off job after resetting it"
BYTE CR
ASCII " /W - wait for I/O completion before resetting"
BYTE 0 ;
EVEN ;
CRLF ;
CRLF ;
EXIT: EXIT ;
;come here when the job name specified does not exist in the job table
;come here when the job specified seems to already be at AMOS command level
MONERR: TYPECR ?Job is already at AMOS command level
JMP CONFIRM ;
;come here when the job specified is ourself
SLFERR: TYPECR ?You may not reset yourself
CRLF ;
EXIT ;
;come here when the job specified is our parent job
PARERR: TYPECR ?You may not reset your parent job
CRLF ;
EXIT ;
;come here when the job specified is a child job of ours
KIDERR: TYPECR ?Job is a child job of yours
CRLF ;
JMP CONFIRM ;
;*************
;* CONFIRM *
;*************
;Come here when a job was specified that the user probably doesn't want to
;reset, but may under some unusual circumstance. Ask him to confirm the
;action.
CONFIRM:
CRLF ;
TYPESP Do you want to reset it anyway?
KBD EXIT ;
CRLF ;
CMPB @A2,#'Y ;
JEQ DDWAIT ;
CRLF ;
JMP EXIT ;
;************
;* CLEAN1 *
;************
;Clean-up routine for job with a terminal attached