*
*
* utility job for sending signals
*
*

version	equ	'0.01'

svars	equ	0
chid	equ	4	* con channel
kjjid	equ	8
schid	equ	8+4	* channel for sending signals
prior	equ	schid+4
usrval	equ	prior+4
jobstart	equ	usrval+4
ourjob	equ	jobstart+4
tmout	equ	ourjob+4

bl	equ	tmout+4	* space for length word
buffer	equ	bl+2	* io buffer
bufflen	equ	60
stack	equ	buffer+bufflen	
stacklen	equ	80
sttop	equ	stack+stacklen



tj:	bra.s	start
	dc.l	0
	dc.w	$4afb
	dc.w	10
	dc.b	'SendSignal'
	dc.w	0

start:
	lea	0(a6,a4.l),a6
	clr.l	d0
	trap	#1
	move.l	a0,svars(a6)

	move.l	def_prior,prior(a6)	* init defaults
	move.l	def_usrval,usrval(a6)
	move.l	def_tmout,tmout(a6)

opwin	move.w	$c6,a2		* ut.con
	lea	wdef,a1
	jsr	(a2)
	tst.l	d0
	bne	err
	move.l	a0,chid(a6)

*************
* some code from QPAC2/sleep_button
* to get jobid of current input window job

	MOVEQ   #-$01,D1
	MOVEQ   #$7F,D2                     * 127
	MOVEQ   #$0B,D0                     * mt.prior
	TRAP    #$01
	move.l	d1,ourjob(a6)

	MOVE    SR,D7
	TRAP    #$00                        * -> sv.mode

	lea     xw,a1
	MOVEQ   #$7A,D0                     * iop.outl
	MOVEQ   #$00,D1
	moveq   #0,d3
	move.l  chid(a6),a0
	trap    #3
	tst.l   d0
	bne     sv_err

	MOVEQ   #$6F,D0                     * iop.slnk
	moveq   #0,d3
	moveq	#0,d2
	move.l  chid(a6),a0
	trap    #3
	tst.l   d0
	bne     sv_err

            MOVEA.L A1,A3
            MOVE.L  $68(A3),D0

_loop       MOVEA.L D0,A2
            MOVE.L  (A2),D0
            BEQ     sv_err		*  kill
            MOVEA.L D0,A0

            CMPI.B  #1,$14(A0)
            BEQ.S   _loop

	MOVE.L  -$24(A0),D1		* get the jobid

	move.w	d7,sr		* user mode again!!

	move.l	d1,kjjid(a6)	* save jobid
	BEQ	err		*  SuperBasic

	MOVEQ   #$02,D0
	MOVEQ   #$00,D2
	TRAP    #$01                *  mt.jinf
	TST.L   D0
	bne	err_nj
	move.l	a0,jobstart(a6)
	bra	opnsig

                     
sv_err  move.w  d7,sr
        bra     err

*************

opnsig
	lea	sigdname,a0	* open channel for signals
	moveq	#-1,d1
	clr.l	d3
	moveq	#1,d0
	trap	#2
	tst.l	d0
	bne	errsignoopn
	move.l	a0,schid(a6)

pmenu:
	move.l	chid(a6),a0
	moveq	#0,d3
	moveq	#$20,d0
	trap	#3		* clear window

	move.l	chid(a6),a0
	move.w	$d0,a2
	lea	title,a1
	jsr	(a2)

*pmenu
*	move.l	chid(a6),a0
*	move.w	$d0,a2

	lea	jtext,a1
	jsr	(a2)

	move.l	jobstart(a6),a1
	lea	6(a1),a1
	cmpi.w	#$4afb,(a1)+
	bne	noname

pjname	move.w	$d0,a2
	jsr	(a2)		* print jobname

	lea	menu,a1		* print menu
	jsr	(a2)

cmdloop:
	moveq	#1,d0
	moveq	#-1,d3
	trap	#3		* getchar
	tst.l	d0
	bne	err

	cmpi.b	#27,d1		* ESC
	beq	end

	cmpi.b	#'1',d1
	beq	susr1

	cmpi.b	#'2',d1
	beq	susr2	

	cmpi.b	#10,d1		* ENTER
	beq	sint

	andi.b	#$df,d1		* make it uppercase

	cmpi.b	#'A',d1
	beq	sabrt

	cmpi.b	#'H',d1
	beq	shup

	cmpi.b	#'K',d1
	beq	skill

	cmpi.b	#'L',d1
	beq	salrm

	cmpi.b	#'Q',d1
	beq	squit

	cmpi.b	#'T',d1
	beq	sterm

	cmpi.b	#'F',d1
	beq	do_frjob

	cmpi.b	#'P',d1
	beq	cprior

	cmpi.b	#'U',d1
	beq	cusrval

	bra	cmdloop
****

sabrt:	moveq	#1,d2
	bra.s	dosig	
shup:	moveq	#4,d2
	bra.s	dosig
sint:	moveq	#6,d2
	bra.s	dosig
skill:	moveq	#7,d2
	bra.s	dosig
salrm:	moveq	#2,d2
	bra.s	dosig
squit:	moveq	#9,d2
	bra.s	dosig
sterm:	moveq	#11,d2
	bra.s	dosig
susr1:	moveq	#12,d2
	bra.s	dosig
susr2:	moveq	#13,d2

dosig	move.l	chid(a6),a0
	move.l	kjjid(a6),d1
	moveq	#0,d3
	moveq	#$7c,d0
	trap	#3		* pick that job
	
	move.l	#$2f,d0
	move.l	kjjid(a6),d1
	move.l	tmout(a6),d3
	move.l	schid(a6),a0
	move.l	prior(a6),a1
	move.l	usrval(a6),a2
	trap	#3
	tst.l	d0
	beq	end

perror	move.l	d0,d5

etx	move.l	chid(a6),a0
	move.l	ourjob(a6),d1
	moveq	#$7c,d0
	moveq	#0,d3
	trap	#3		* pick this job

	move.l	d5,d0
	move.w	$cc,a2
	jsr	(a2)
	bra	wkey
****

do_frjob	move.l	kjjid(a6),d1
	moveq	#5,d0
	clr.l	d3
	trap	#1
	tst.l	d0
	bne.s	perror
	bra	end
****

cprior:	bra	pmenu		* add it later
****

cusrval:
	move.l	chid(a6),a0
	move.w	#-1,d3
	moveq	#$20,d0
	trap	#3		* clear

	lea	cusr_txt,a1
	move.w	$d0,a2
	jsr	(a2)

	lea	sttop(a6),a1
	move.l	usrval(a6),(a1)                 
	lea	buffer(a6),a0
	move.w	$fe,a2
	sub.l	a6,a1		* adjust
	sub.l	a6,a0
	jsr	(a2)		* cn.itohl

	lea	buffer(a6),a0
	move.l	a0,a1
loo	move.b	(a1)+,d0
	bne.s	loo
	move.l	a1,a3
	suba.l	a0,a1		* getlen (+1)

	move.l	a1,d1
	move.l	a3,a1
	subq	#1,d1
	moveq	#4,d0		* io.edlin
	moveq	#bufflen,d2
	moveq	#-1,d3
	move.l	chid(a6),a0
	lea	-1(a1),a1
	trap	#3
	tst.l	d0
	bne	err

	move.b	0,-1(a1)		* 0 terminator
	lea	buffer(a6),a0
	move.l	a0,a3
	lea	sttop(a6),a1
	moveq	#0,d7
	move.w	$10e,a2
	sub.l	a6,a1		* adjust
	sub.l	a6,a0
	jsr	(a2)
	add.l	a6,a0
	cmpa.l	a0,a3
	beq	cusrval		* error ?

	move.l	0(a6,a1.l),usrval(a6)
	bra	pmenu
****		

noname	lea	anon,a1
	bra	pjname
****

errsignoopn:
	move.w	$d0,a2
	move.l	chid(a6),a0
	lea	snf_txt,a1
	jsr	(a2)
	bra	wkey
****

err_nj	lea	err_nj_text,a1
	move.l	chid(a6),a0
	move.w	$d0,a2
	jsr	(a2)

wkey
	moveq	#1,d0
	move.w	#600,d3
	trap	#3		* pause

end
err	move.l	d0,d3
	moveq	#5,d0
	moveq	#-1,d1
	trap	#1
	bra 	err
****

title	dc.w	16
	dc.b	'Signal utility ',10,10

jtext	dc.w	7
	dc.b	10,'Job : ',0

anon	dc.w	6
	dc.b	'*anon*'

menu	dc.w	mend-*-2
	dc.b	10,'ESC (U)servalue (P)riority',10,10
	dc.b	' INT       ... ENTER',10
	dc.b	' TERM      ... T',10
	dc.b	' ABRT      ... A',10
	dc.b	' ALRM      ... L',10
	dc.b	' HUP       ... H',10
	dc.b	' KILL      ... K',10
	dc.b	' QUIT      ... Q',10
	dc.b	' USR1      ... 1',10
	dc.b	' USR2      ... 2',10,10
	dc.b	' FRJOB     ... F',10
mend
	even

cusr_txt 	dc.w	cusr_end-*-2
	dc.b	'edit usrvalue and ENTER',10
cusr_end
	even

err_nj_text
	dc.w	te-*-2
	dc.b	10,'could not estimate',10
	dc.b	'job id',10
	dc.b	'this could be due to a',10 
	dc.b	'serious incompatibility,',10
	dc.b	"please don't retry",10
te
	even

snf_txt	dc.w	snf_end-*-2
	dc.b	'sorry, signal device',10
	dc.b	'not found',10
snf_end
	even

sigdname 	dc.w	9
	dc.b	'*signal_s'
	even	 


LINES	equ	17
HLINES	equ	1		* header lines
COLS	equ	30


wdef	dc.b	4,1		* bc,bw
	dc.b	0,7		* pc,ic
xw	dc.w	6*COLS+4 			* 30 chars
yw	dc.w	10*LINES+4			* 16 lines
	dc.w	256-3*COLS,128-LINES*5	* at x,y 

outl:	dc.w	6*COLS         		* x
	dc.w	10*(LINES+HLINES)		* y
	dc.w	256-3*COLS			* at x,
	dc.w	128-LINES*5-HLINES*10		*      y

def_prior	dc.l	%111111111111	* highest priority,defer all
def_usrval	dc.l	$0		* 
def_tmout	dc.l	30

	data	stack+stacklen+400

