page@swan.ulowell.edu (Bob Page) (03/16/89)
Submitted-by: G35@DHDURZ1.BITNET (Guenther Werner)
Posting-number: Volume 89, Issue 53
Archive-name: kernel/xoper13.2
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# Xoper.asm2
# Xoper.doc
# This archive created: Wed Mar 15 12:40:15 1989
cat << \SHAR_EOF > Xoper.asm2
bsr putnam
bra hu5
hu3 move.l 172(a4),d1
bne.s hu4
noprogload move.l #notload,d0
bra putnam
hu4 move.l #cliprocs,d0
bsr putnam
lsl.l #2,d1
move.l d1,a4
move.l 60(a4),d1
beq.s noprogload
move.l #procloaded,d0
bsr putstr
move.l 16(a4),d0
bsr putbcpl
bsr newline
hu5 lea hunkheader(PC),a0
bsr puthead
hu6 move.l d1,d0
bsr hexa
lsl.l #2,d1
move.l d1,a4
move.l d1,d0
addq.l #4,d0
bsr hexa
move.l -4(a4),d0
bsr hexa
bsr newline
move.l 0(a4),d1
bne.s hu6
rts
;change the priority of a node
pri bsr getnum
tst.b d7
beq syntax
move.b d2,newpri
bsr nodenam2
moveq.l #5,d7
lea DevNode(PC),a4
bsr findnam
tst.b d7
beq.s pi1
move.l d0,a1
move.b newpri,9(a1)
cmp.l #SemNode,a4
ble.s pi2
move.l #listerr,d0
bra putnam
pi2 CALL Forbid,_SysBase(PC)
CALL Remove,_SysBase(PC)
move.l d0,a1
move.l a4,a0
move.l 0(a0),d6
lea 0(a6,d6),a0
CALL Enqueue,_SysBase(PC)
CALL Permit,_SysBase(PC)
pi1 rts
;set all break signals of a task
break move.l #$f000,d0
bra setthem
signal bsr readhex
tst.b d7
beq syntax
setthem move.l d0,savedat
bsr nodenam
moveq.l #2,d7
lea TReNode(PC),a4
bsr findnam
tst.b d7
beq.s pi1
move.l d0,a1
move.l savedat,d0
and.l 18(a1),d0
CALL Signal,_SysBase(PC)
rts
hide cmp.b #10,0(a0)
bne.s hid5
bra syntax
hid5 lea hidestart(PC),a2
move.l a2,d3
hid0 tst.l 0(a2)
beq.s hid1
move.l 0(a2),a2
lea 4(a2),a1
bsr strcmp
tst d0
beq.s hid2
move.l a2,d3
bra.s hid0
hid1 move.l a0,a4
bsr strlen2
addq #5,d0
move.l #65536,d1
CALL AllocMem,_SysBase(PC)
tst.l d0
beq.s hid4
move.l d0,a1
move.l d0,0(a2)
lea 4(a1),a1
hid3 cmp.b #10,0(a4)
beq.s hid4
move.b (a4)+,(a1)+
bra.s hid3
hid4 rts
hid2 move.l d3,a3
move.l 0(a2),0(a3)
freehidden lea 4(a2),a0
bsr strlen
addq #5,d0
move.l a2,a1
CALL FreeMem,_SysBase(PC)
rts
freehidmem move.l hidestart(PC),a4
fhm0 move.l a4,d0
beq.s fhm1
move.l a4,a2
move.l 0(a2),a4
bsr freehidden
bra fhm0
fhm1 rts
;'flushlibs'
flush move.l #$ffffff,d0
clr.l d1
CALL AllocMem,_SysBase(PC)
rts
;display library->lib_IDString
info bsr nodenam2
moveq.l #2,d7
lea DevNode(PC),a4
bsr findnam
tst.b d7
beq.s fhm1
move.l d0,a0
move.l 24(a0),d0
beq.s if1
move.l d0,d1
andi.l #$ff000000,d1
bne.s if1
bra putnam
if1 move.l #noinfo,d0
bsr putstr
move.l a5,d0
bra putnam
capture move.l _SysBase(PC),a1
lea 42(a1),a0
moveq #2,d6
lea coldtxt,a4
cap0 move.l a4,d0
bsr putstr
move.l 0(a0),d0
bne.s cap1
move.l #unset,d0
bsr putstr
bra cap2
cap1 bsr hexa
cap2 bsr newline
lea 15(a4),a4
lea 4(a0),a0
dbf d6,cap0
move.l #kicktxt,d0
bsr putstr
move.l 546(a1),a0
cmpa.l #0,a0
bne.s kickm3
move.l #unset,d0
bra putnam
kickm3 move.l a0,-(a7)
bsr newline
lea kickhead(PC),a0
bsr puthead
move.l (a7)+,a0
kickm0 cmpa.l #0,a0
bne.s kickm1
rts
kickm1 move.w 14(a0),d6
subq #1,d6
lea 16(a0),a2
kickm2 move.l 0(a2),d0
bsr hexa
move.l 0(a2),d0
move.l 4(a2),d4
add.l d4,d0
bsr hexa
move.l d4,d0
clr.b d3
bsr longdec
bsr newline
lea 8(a2),a2
dbf d6,kickm2
move.l 0(a0),a0
bra kickm0
rts
clrcold move.l _SysBase,a0
clr.l 42(a0)
bra.s chksum
clrcool move.l _SysBase,a0
clr.l 46(a0)
bra.s chksum
clrwarm move.l _SysBase,a0
clr.l 50(a0)
chksum lea 34(a0),a1
move #22,d0
addchk add (a1)+,d1
dbf d0,addchk
not d1
move.w d1,82(a0)
rts
setwindow tst.b fromfile
bne.s wiw1
move.l #wiwerr,d0
bra putnam
wiw1 lea window_l(PC),a3
moveq #3,d5
wiw0 bsr getnum
tst d7
beq.s wiw2
move.w d2,0(a3)
lea 2(a3),a3
dbf d5,wiw0
wiw2 rts
;display ExecBase->LastAlert
lastalert movem.l $100,d1-d2
tst.l d1
bne.s al1
move.l _SysBase(PC),a0
movem.l 514(a0),d1-d2
bra.s al1
alert movem.l $100,d1-d2
cmp.l #'HELP',0
beq.s al1
move.l #noguru,d0
bra putnam
al1 move.l #gurutxt,d0
bsr putstr
move.l d1,d0
bsr hex8
lea out,a0
move.l ptr(PC),d0
move.b #'.',-1(a0,d0)
move.l d2,d0
bsr hex8
bra newline
;toggle '<MORE>' on/off
moretst tst.b fromfile
beq.s mtst1
bchg #0,morefl2
rts
mtst1 bchg #0,morefl
rts
;toggle CPUSE task list
usage bchg #0,usageflag
rts
;toggle task-header display on/off
nohead bchg #0,headon
rts
;toggle hide entries on/off
hidden bchg #0,hideon
rts
;toggle sort on/off
sort bchg #0,sorton
rts
;toggle task-ports display on/off
taskports bchg #0,tports
clo1 rts
;Open a library
openlib bsr nodenam2
move.l a5,a1
clr.l d0
CALL OpenLibrary,_SysBase(PC)
tst.l d0
beq fn5
opli1 bsr clearscr
bra showlibs
;close it
closelib bsr nodenam2
clr.l d7
lea LibNode(PC),a4
bsr findnam
tst.b d7
beq.s clo1
move.l d0,a1
CALL CloseLibrary,_SysBase(PC)
bra opli1
;end Xoper but stay in background
hold lea 4(a7),a7
bra.s instback
quithold lea in,a0
lea dummy,a1
qh1 move.b (a1)+,d0
move.b d0,(a0)+
cmp.b #10,d0
bne.s qh1
instback tst.b background
bne.s cleanit
move.b #1,background
bsr installh
cleanit tst.l fileptr
beq.s ib1
move.l window(PC),a0
move.w 4(a0),window_l
move.w 6(a0),window_t
move.w 8(a0),window_w
move.w 10(a0),window_h
move.l fileptr(PC),d1
CALL Close,dosbase(PC)
clr.l fileptr
ib1 clr.b running
move.l mysignal(PC),d0
CALL Wait,_SysBase(PC)
move.b #1,running
bra restart
;fill all unused memory-chunks with a longword
clear clr.l d0
cmp.b #10,0(a0)
beq.s clr5
bsr readhex
tst.b d7
beq syntax
clr5 move.l _SysBase(PC),a0
clr.l parmtxt
lea 322(a0),a0
move.w #$4000,$dff09a
clr1 move.l 0(a0),a0
tst.l 0(a0)
beq.s clr4
move.l 16(a0),a1
clr2 tst.l 0(a1)
beq.s clr1
add.l #1,parmtxt
move.l 4(a1),d1
sub.l #8,d1
beq.s clr31
lsr.l #2,d1
subq.l #1,d1
lea 8(a1),a2
clr3 move.l d0,(a2)+
dbf d1,clr3
clr31 move.l 0(a1),a1
bra.s clr2
clr4 move.w #-$4000,$dff09a
move.l parmtxt(PC),d0
bsr bytedec
move.l #clrtxt,d0
bra putnam
;find a named node
;d7 = number of lists to search through
;a4 = pointer to the first entry in the
; list-offset-table
;a5 = pointer to name
;returns:
;d7 = TRUE/FALSE 1/0
;d0 = node
findnam cmp.b #'$',0(a5)
bne.s fn2
move.l d7,d2
move.l a5,a0
bsr readhex
tst.b d7
beq.s fn6
move.l d2,d7
bsr tstnode
tst.l d5
bne.s fn3
bra fn5
fn6 move.l d2,d7
fn2 move.l _SysBase(PC),a0
adda.l 0(a4),a0
move.l a5,a1
fn4 CALL FindName,_SysBase(PC)
tst.l d0
bne.s fn1
lea 4(a4),a4
dbf d7,fn2
fn5 move.l #namerr,d0
bsr putstr
move.l a5,d0
bsr putnam
clr.b d7
rts
fn1 move.b procnum(PC),d2
beq.s fn3
move.l d0,a0
cmp.b 143(a0),d2
bne.s fn4
fn3 moveq.l #1,d7
rts
;list-offset-table
TRuNode dc.l 276
TReNode dc.l 406
TWaNode dc.l 420
DevNode dc.l 350
LibNode dc.l 378
ResNode dc.l 336
MemNode dc.l 322
PorNode dc.l 392
SemNode dc.l 532
;Node has been entered in hex. Check if this node exsists
tstnode tst.b fromfile
bne.s illegalhex
move.l d0,d1
and.l #$ff000001,d1
beq.s inrange
move.l #adrerr,d0
bsr putnam
illegalhex clr.l d5
rts
inrange movem.l d7/a4,-(a7)
cmp.l #TRuNode,a4
bne.s inrange1
move.l _SysBase(PC),a0
cmp.l 276(a0),d0
beq.s nodefound
subq #1,d7
lea 4(a4),a4
inrange1 move.w #$4000,$dff09a
getlist move.l _SysBase(PC),a0
add.l 0(a4),a0
nxtnode tst.l 0(a0)
beq.s nxtlist
cmp.l a0,d0
beq.s nodefound
move.l 0(a0),a0
bra.s nxtnode
nxtlist lea 4(a4),a4
dbf d7,getlist
move.w #-$4000,$dff09a
movem.l d0/d7/a4,-(a7)
move.l #noderr,d0
bsr putnam
bsr readline
movem.l (a7)+,d0/d7/a4
or.b #32,dummy
cmp.b #'y',dummy
beq.s nodefound1
clr.l d5
movem.l (a7)+,d7/a4
rts
nodefound move.w #-$4000,$dff09a
nodefound1 move.b #1,d5
etst movem.l (a7)+,d7/a0
rts
;clear our window
clearscr tst.b fromfile
bne.s cscr1
move.l #cls,d2
move.l fileptr,d1
moveq.l #6,d3
CALL Write,dosbase(PC)
cscr1 rts
;allocate FileInfoBlock
allocfinfo move.l #260,d0
clr.l d1
CALL AllocMem,_SysBase(PC)
move.l d0,finfoptr
rts
;free FileInfoBlock
freefinfo move.l #260,d0
move.l finfoptr,a1
CALL FreeMem,_SysBase(PC)
rts
;Examine ,d0=Lock
getfinfo move.l d0,d1
move.l finfoptr,d2
CALL Examine,dosbase(PC)
rts
;construct a Pathname from a lock
;d0=Lock ,resulting string is written to window
getpath movem.l d1-d7/a0-a6,-(a7)
move.l d0,d1
CALL DupLock,dosbase(PC)
lea out,a4
clr.b -(a4)
gp0 tst.l d0
beq.s putall
move.l d0,-(a7)
bsr getfinfo
move.l finfoptr,a0
move.l 4(a0),d4
lea 8(a0),a0
bsr strlen
lea -1(a4),a5
tst.l d4
bmi.s nodir
move.b #'/',-(a4)
nodir subq #1,d0
bmi.s nofnam
gp1 move.b 0(a0,d0),-(a4)
dbf d0,gp1
nofnam move.l 0(a7),d1
CALL ParentDir,dosbase(PC)
move.l d0,d4
move.l (a7)+,d1
CALL UnLock,dosbase(PC)
move.l d4,d0
bra gp0
putall cmp.b #'/',0(a5)
bne.s gp2
move.b #':',0(a5)
gp2 move.l a4,d0
bsr putnam
movem.l (a7)+,d1-d7/a0-a6
rts
strlen move.l a0,-(a7)
move.l #-1,d0
strl2 addq.l #1,d0
tst.b (a0)+
bne.s strl2
move.l (a7)+,a0
rts
strlen2 move.l a0,-(a7)
move.l #-1,d0
strl22 addq.l #1,d0
cmp.b #10,(a0)+
bne.s strl22
move.l (a7)+,a0
rts
;write a title and underline
;a0 = pointer to text
puthead1 bsr strlen
move.l d0,d5
move.l a0,d0
bra putstr
puthead2 bsr strlen
add.l d0,d5
bra.s ph2
puthead bsr strlen
move.l d0,d5
ph2 move.l a0,d0
bsr putnam
lea out,a0
move.l a0,d0
ph1 move.b #'-',(a0)+
dbf d5,ph1
move.b #$9b,(a0)+
move.b #'K',(a0)+
move.b #$0a,(a0)+
clr.b 0(a0)
bra putstr
;move cursor to a column
;d0 = current position
;d1 = column
tab move.l a3,-(a7)
lea out,a3
sp5 cmp.b d1,d0
bcc.s sp4
move.b #' ',0(a3,d0)
addq.b #1,d0
bra.s sp5
sp4 move.l d1,ptr
move.l (a7)+,a3
rts
;convert ascii to byte
;a0 = pointer to text
;d0 = byte
getnum cmp.b #'$',0(a0)
bne.s isdec
bsr readhex
move.l d0,d2
rts
isdec clr.w d2
clr.w d3
clr.b d6
clr.b d7
cmp.b #'-',0(a0)
bne.s gn1
lea 1(a0),a0
moveq.l #1,d6
gn1 move.b (a0)+,d3
cmp.b #'9',d3
bhi.s gn2
cmp.b #'0',d3
bcs.s gn2
moveq.l #1,d7
and.b #$f,d3
muls #10,d2
add.w d3,d2
bra.s gn1
gn2 tst.b d6
beq.s gn3
neg.w d2
gn3 tst.b d7
bne.s gn4
lea -1(a0),a0
gn4 rts
;convert hex to longword
;a0 = pointer to text
;returns d0=value
;d7 = ok/error 1/0
readhex movem.l d1-d6/a1-a5,-(a7)
moveq #1,d7
cmp.b #'$',0(a0)
bne.s rh3
lea 1(a0),a0
rh3 clr.l d0
cmpi.b #10,0(a0)
beq.s rherr
lea hextab(pc),a1
rh0 move.b (a0)+,d3
moveq.l #15,d2
rh1 cmp.b 0(a1,d2),d3
beq.s rh2
dbf d2,rh1
bra rhend
rh2 lsl.l #4,d0
or.b d2,d0
bra.s rh0
rhend tst.b d3
beq.s rhok
cmpi.b #10,d3
beq.s rhok
cmpi.b #' ',d3
beq.s rhok
rherr clr.l d7
rhok movem.l (a7)+,d1-d6/a1-a5
rts
;skip blanks
;a0 pointer to text
; returns a0 = new pointer position
kllblnks cmpi.b #' ',0(a0)
bne.s gn4
lea 1(a0),a0
bra.s kllblnks
; exit program. If background flag is set, wait for
; amiga-amiga-x
stopall lea 4(a7),a7
bra exitall
exit tst.b background
bne quithold
exitall move.l stplist(PC),a3
tst.l 0(a3)
beq.s ex0
move.l a3,d0
bsr waok
bra.s exitall
ex0 tst.b background
beq.s ex1
bsr removeh
ex1 move.l _SysBase(PC),a1
move.l #_LVOSwitch,a0
move.l oldswitch,d0
CALL SetFunction,_SysBase(PC)
move.l #3,d0
lea IOCounter(PC),a1
CALL RemIntServer,_SysBase(PC)
move.l replyport(PC),-(a7)
LIBCALL DeletePort
lea 4(a7),a7
move.l fileptr(PC),d1
beq.s ex11
CALL Close,dosbase(PC)
ex11 bsr freehidmem
IFND DEBUG
CALL Forbid,_SysBase(PC)
move.l wbmsg(PC),d0
beq.s todos
move.l d0,a1
CALL ReplyMsg,_SysBase(PC)
clr.l d0
rts
todos move.l myseg(PC),d1
CALL UnLoadSeg,dosbase(PC)
ENDC
clr.l d1
CALL Exit,dosbase(PC)
;print a bcpl-string
;d0 = bcpl-pointer to bcpl-string
putbcpl movem.l d3/a0-a1,-(a7)
tst.l d0
beq.s pb1
lsl.l #2,d0
move.l d0,a1
clr.l d3
move.b (a1)+,d3
move.l ptr(PC),d0
lea out,a0
pb2 move.b (a1)+,0(a0,d0)
addq.b #1,d0
dbf d3,pb2
move.l d0,ptr
pb1 movem.l (a7)+,d3/a0-a1
rts
;compare strings
;a0/a1 = pointers to string
;returns d0 = true(0) false(1)
strcmp movem.l a0-a1,-(a7)
clr.l d0
src2 move.b (a0)+,d0
beq.s src1
cmp.b #10,d0
beq.s src1
cmp.b (a1)+,d0
beq.s src2
bra.s src3
src1 move.b 0(a1),d0
src3 movem.l (a7)+,a0-a1
rts
;compare bcpl string with string
;a0 = pointer to string
;a2 = bcpl-pointer to bcpl-string
;returns d0 = true(0) false(1)
strbcmp movem.l d1/a0/a2,-(a7)
clr.l d0
clr.l d1
adda.l a2,a2
adda.l a2,a2
move.b (a2)+,d1
beq.s stb1
subq #1,d1
stb2 cmp.b (a2)+,(a0)+
bne.s stb1
dbf d1,stb2
moveq #1,d0
stb1 movem.l (a7)+,d1/a0/a2
rts
;concat strings
;a0 = pointer to string
;a1 = pointer to string to be appended
;returns d0 = strlen
strcat movem.l d1/a0-a1,-(a7)
bsr strlen
move.l d0,d1
exg a0,a1
bsr strlen
adda.w d1,a1
stc1 move.b (a0)+,(a1)+
dbf d0,stc1
move.l a1,d0
movem.l (a7)+,d1/a0-a1
sub.l a0,d0
rts
;convert long to decimal
;d0 = value
;d3 bit 0 = left/right justified
;d3 bit 1 = write/leave
;returns string in 'buffer'
longdec movem.l d1-d2/a1-a2,-(a7)
lea binarea+8(PC),a1
move.l #' ',-8(a1)
move.l #' ',-4(a1)
clr.b 0(a1)
lea -1(a1),a1
cmp #2,d3
bne.s ld5
clr.b 0(a1)
ld5 moveq #1,d2
ld2 addq #1,d2
moveq #$a,d1
bsr div
addi.l #$30,d1
move.b d1,-(a1)
tst.l d0
bne.s ld2
btst #0,d3
bne.s ld1
lea binarea(PC),a2
ld3 move.b 0(a1),(a2)+
move.b #' ',(a1)+
dbf d2,ld3
ld1 cmp #2,d3
beq.s ld4
move.l #binarea,d0
bsr putstr
ld4 movem.l (a7)+,d1-d2/a1-a2
rts
;write UBYTE
;d3 = value
bytedec move.l #dezimal,d0
pm1 bsr dec
bra putstr
;write signed byte
;d3 = value
plusmins move.l #minus+1,d0
move.w #$2020,minus
tst.b d3
bpl.s pm1
neg.b d3
jsr dec
move.b #'-',-(a3)
bra.s putstr
dec move.l #$20202020,dezimal
clr.l d4
and.l #$ff,d3
lea dezimal+3(PC),a3
bloop tst.b d3
beq.s bend
divu #10,d3
swap d3
ori.b #48,d3
move.b d3,-(a3)
clr.w d3
swap d3
bra.s bloop
bend cmpa.l #dezimal+3,a3
bne nixfirst
move.b #'0',-(a3)
nixfirst rts
;write a string, move cursor into next line
;d0 = pointer to text
putnam bsr putstr
tst.b d0
beq.s ncr
bsr newline
ncr rts
;write one char
;d0 = char
putchar movem.l d1/a0,-(a7)
move.l ptr(PC),d1
lea out,a0
move.b d0,0(a0,d1)
add.l #1,ptr
movem.l (a7)+,d1/a0
rts
;write a string, strings are only written when they end with LF
;d0 = pointer to string
;returns d0 = cursor position
putstr movem.l d1-d7/a0-a6,-(a7)
move.b #1,printed
move.l d0,a2
lea out,a3
move.l ptr(PC),d0
cmp.l #0,a2
beq prend
clr d5
pst1 addq #1,d5
cmp #81,d3
beq prend
move.b (a2)+,d1
cmpi.b #13,d1
beq pst1
move.b d1,0(a3,d0)
beq prend
addq #1,d0
cmpi.b #$0a,d1
bne.s pst1
tst.b fromfile
bne.s pst24
move.l d0,d3
move.l a3,d2
move.l fileptr,d1
CALL Write,dosbase(PC)
pst24 clr.l d0
clr d5
tst.b morefl
beq.s pst1
tst.b mnflag
beq.s pst1
add.b #1,row
move.b row(PC),d1
cmp.b rows,d1
bne.s pst1
move.l #50,d2
move.l fileptr(PC),d1
CALL WaitForChar,dosbase(PC)
beq.s pst23
bsr readline
pst23 move.l #6,d3
move.l fileptr(PC),d1
move.l #more,d2
CALL Write,dosbase(PC)
bsr readline
bsr raw
clr.b row
move.l fileptr(PC),d1
move.l #1,d3
move.l #thisline,d2
CALL Write,dosbase(PC)
clr.l d0
bra pst1
prend move.l d0,ptr
movem.l (a7)+,d1-d7/a0-a6
rts
;Write 8 byte hex value
;d0 = value
hex8 movem.l d1-d7/a0-a6,-(a7)
moveq.l #7,d5
lea hex8area(PC),a1
bra hx1
;Write 6 byte hex value
;d0 = value
hexa movem.l d1-d7/a0-a6,-(a7)
moveq.l #5,d5
lea hexarea(PC),a1
hx1 lea hextab(PC),a0
clr.l d2
hexloop move.b d0,d2
and.b #15,d2
move.b 0(a0,d2),0(a1,d5)
lsr.l #4,d0
dbf d5,hexloop
move.l a1,d0
movem.l (a7)+,d1-d7/a0-a6
bra putstr
;Convert/write byte into binary string
;d0 = value
bin movem.l d1-d7/a0-a6,-(a7)
move.b #' ',binarea+9
moveq.l #7,d4
lea binarea(PC),a0
binloop moveq.l #'0'/2,d1
roxr.b #1,d0
roxl.b #1,d1
move.b d1,0(a0,d4)
dbf d4,binloop
move.l a0,d0
movem.l (a7)+,d1-d7/a0-a6
bra putstr
;read one line of input string
readline tst.b fromfile
bne.s rlin1
move.l fileptr(PC),d1
move.l #dummy,d2
moveq.l #80,d3
CALL Read,dosbase(PC)
rts
rlin1 lea dummy,a3
rlin4 move.l infile(PC),d1
move.l a3,d2
moveq.l #1,d3
CALL Read,dosbase(PC)
tst.l d0
beq.s rlin5
cmp.b #10,(a3)+
beq.s rlin2
bra.s rlin4
rlin5 move.b #1,eof
rlin3 move.b #10,0(a3)
rlin2 lea dummy,a0
bsr strlen2
addq #1,d0
rts
;switch console to con: mode & empty input buffer
con tst.b fromfile
bne.s conend
bsr cmdcon
move.l #50,d2
move.l fileptr(PC),d1
CALL WaitForChar,dosbase(PC)
beq.s conend
bsr readline
conend rts
cmdcon clr.l dp_Arg1
move.l conmsg(PC),a0
move.l #994,dp_Type
bra.s cons1
;switch console window to raw mode
raw tst.b fromfile
bne.s conend
move.l conmsg(PC),a0
move.l #994,dp_Type
move.l #-1,dp_Arg1
;send a packet
;a0 = msgport
;dp_Type and dp_Arg1 have to be inizialized
cons1 movem.l d0-d7/a0-a6,-(a7)
move.l #dp_Link,LN_NAME
move.l #mypacket,dp_Link
move.l replyport(PC),dp_Port
lea mypacket,a1
CALL PutMsg,_SysBase(PC)
move.l replyport,a0
CALL WaitPort,_SysBase(PC)
move.l replyport(PC),a0
CALL GetMsg,_SysBase(PC)
movem.l (a7)+,d0-d7/a0-a6
rts
;32-bit division
;d0 / d1
;returns d0
div movem.l d2-d3,-(a7)
swap d1
move.w d1,d2
bne.s div1
swap d0
swap d1
swap d2
move.w d0,d2
beq.s div2
divu d1,d2
move.w d2,d0
div2 swap d0
move.w d0,d2
divu d1,d2
move.w d2,d0
swap d2
move.w d2,d1
bra div8
div1 moveq #$10,d3
cmpi.w #$80,d1
bcc.s div3
rol.l #8,d1
subq.w #8,d3
div3 cmpi.w #$800,d1
bcc.s div4
rol.l #4,d1
subq.w #4,d3
div4 cmpi.w #$2000,d1
bcc.s div5
rol.l #2,d1
subq.w #2,d3
div5 tst.w d1
bmi.s div6
rol.l #1,d1
subq.w #1,d3
div6 move.w d0,d2
lsr.l d3,d0
swap d2
clr.w d2
lsr.l d3,d2
swap d3
divu d1,d0
move.w d0,d3
move.w d2,d0
move.w d3,d2
swap d1
mulu d1,d2
sub.l d2,d0
bcc.s div7
subq.w #1,d3
add.l d1,d0
div7 moveq #0,d1
move.w d3,d1
swap d3
rol.l d3,d0
swap d0
exg d1,d0
div8 movem.l (a7)+,d2-d3
rts
;install a input-handler
installh pea 0
pea xopsleep
LIBCALL CreatePort
lea 8(a7),a7
move.l d0,InputMsg
move.l d0,-(a7)
LIBCALL CreateStdIO
lea 4(a7),a7
move.l d0,InRequest
move.l d0,a1
lea devicenam(PC),a0
clr.l d0
clr.l d1
CALL OpenDevice,_SysBase(PC)
move.l d0,devstatus
movea.l InRequest(PC),a1
move.l #InInterrupt,40(a1)
move.w #9,28(a1)
CALL DoIO,_SysBase(PC)
move.l d0,iostatus
move.l #-1,d0
CALL AllocSignal,_SysBase(PC)
clr.l d1
bset d0,d1
move.l d1,mysignal
rts
;remove handler
removeh movea.l InRequest(PC),a1
move.l #InInterrupt,40(a1)
move.w #10,28(a1)
CALL DoIO,_SysBase(PC)
movea.l InRequest(PC),a1
CALL CloseDevice,_SysBase(PC)
move.l InRequest,-(a7)
LIBCALL DeleteStdIO
lea 4(a7),a7
move.l InputMsg,-(a7)
LIBCALL DeletePort
lea 4(a7),a7
rts
;this is the handler, it checks if amiga-amiga-x
;has been pressed and signals it to our task
Keyhandler tst.b running
bne.s endhandler
cmp.b #1,4(a0)
bne.s endhandler
move.w 8(a0),d0
andi.w #$c0,d0
cmpi.w #$c0,d0
bne.s endhandler
cmp.w #$32,6(a0)
bne.s endhandler
wakeup move.l a0,-(a7)
movea.l mytask(PC),a1
move.l mysignal(PC),d0
CALL Signal,_SysBase(PC)
move.l (a7)+,a0
clr.b 4(a0)
endhandler move.l a0,d0
rts
snoop bsr nodenam
moveq.l #2,d7
lea TRuNode(PC),a4
bsr findnam
tst.b d7
beq tm6
move.l d0,captask
pea 0
pea memportname
LIBCALL CreatePort
lea 8(a7),a7
move.l d0,snoopport
beq tm6
lea snoophead(PC),a0
bsr puthead
move.l _SysBase(PC),a1
move.l -196(a1),oldalloc
move.l -208(a1),oldfree
move.l #capmalloc,d0
move.l #-198,a0
CALL SetFunction,_SysBase(PC)
move.l _SysBase(PC),a1
move.l #capmfree,d0
move.l #-210,a0
CALL SetFunction,_SysBase(PC)
clr.b bool
clr.b cbreak
bsr con
waitmem move.l snoopport(PC),a0
move.l #$1000,d0
clr.l d1
move.b 15(a0),d1
bset d1,d0
CALL Wait,_SysBase(PC)
btst #12,d0
beq.s tm7
move.b #1,cbreak
tm7 move.l mytask(PC),a0
move.l snoopport(PC),a0
CALL GetMsg,_SysBase(PC)
tst.l d0
bne tm8
tst.b cbreak
bne snoopend
bra waitmem
tm8 move.l d0,a3
move.l 20(a3),d3
btst #31,d3
beq freed
move.l #allok,d0
bsr putstr
lea memname(PC),a2
lea membit(PC),a4
move.l #4,d5
tm2 move.l 0(a4),d4
btst d4,d3
beq.s tm1
move.l 0(a2),d0
bsr putstr
tm1 lea 4(a2),a2
lea 4(a4),a4
dbf d5,tm2
move.l #26,d1
bsr tab
move.l 24(a3),d0
move.l d0,d3
bsr hexa
move.l 28(a3),d0
bne.s tm3
move.l #failed,d0
bsr putstr
move.l #47,d1
bsr tab
bra tm4
tm3 bsr hexa
move.l 28(a3),d0
add.l d3,d0
bsr hexa
bra tm4
freed move.l #free,d0
bsr putstr
move.b #'-',d0
move.l #18,d1
tm9 bsr putchar
dbf d1,tm9
move.b #' ',d0
bsr putchar
move.l d3,d0
bsr hexa
move.l 24(a3),d0
bsr hexa
move.l 24(a3),d0
add.l d3,d0
bsr hexa
tm4 move.l 32(a3),d0
bsr hexa
bsr newline
move.w 18(a3),d0
ext.l d0
move.l a3,a1
CALL FreeMem,_SysBase(PC)
bra tm7
snoopend move.l _SysBase(PC),a1
move.l oldalloc(PC),d0
move.l #-198,a0
CALL SetFunction,_SysBase(PC)
move.l _SysBase(PC),a1
move.l oldfree,d0
move.l #-210,a0
CALL SetFunction,_SysBase(PC)
move.l snoopport,-(a7)
LIBCALL DeletePort
lea 4(a7),a7
tm6 rts
memname dc.l memlarg,memclr,memfast,memchip,mempubl
membit dc.l 17,16,2,1,0
capmalloc movem.l d0-d7/a0-a6,-(a7)
move.l _SysBase(PC),a6
move.l 276(a6),d4
cmp.l captask(PC),d4
bne.s capm1
tst.b bool
bne capm1
move.b #1,bool
move.l #36,d6
bsr allocmsg
beq capm2
bset #31,d1
move.l d1,20(a5)
move.l d0,24(a5)
move.l 60(a7),32(a5)
move.l a5,remembr
movem.l (a7)+,d0-d7/a0-a6
bsr memalloc
movem.l d0-d7/a0-a6,-(a7)
move.l remembr(PC),a1
move.l d0,28(a1)
move.l snoopport,a0
move.b #5,8(a1)
CALL PutMsg,_SysBase(PC)
clr.b bool
movem.l (a7)+,d0-d7/a0-a6
rts
capm2 clr.b bool
capm1 movem.l (a7)+,d0-d7/a0-a6
memalloc dc.w $4ef9
oldalloc dc.l 0
capmfree movem.l d0-d7/a0-a6,-(a7)
move.l _SysBase(PC),a6
move.l 276(a6),d4
cmp.l captask(PC),d4
bne.s capf1
tst.b bool
bne.s capf1
move.b #1,bool
move.l #36,d6
bsr allocmsg
beq.s capf2
move.l d0,20(a5)
move.l a1,24(a5)
move.l 60(a7),32(a5)
move.l snoopport,a0
move.b #5,8(a5)
move.l a5,a1
CALL PutMsg,_SysBase(PC)
capf2 clr.b bool
capf1 movem.l (a7)+,d0-d7/a0-a6
dc.w $4ef9
oldfree dc.l 0
allocmsg movem.l d0-d1/a0-a1,-(a7)
move.l d6,d0
move.l #65536,d1
bsr memalloc
tst.l d0
beq.s alm1
move.l d0,a5
move.w d6,18(a5)
alm1 movem.l (a7)+,d0-d1/a0-a1
move.l a5,d6
rts
capopendev movem.l d0-d7/a0-a6,-(a7)
move.l _SysBase(PC),a6
move.l 276(a6),d4
cmp.l captask(PC),d4
bne.s opdev1
tst.b bool
bne.s opdev1
move.l #36,d6
bsr allocmsg
move.l #0,d0
opdev1:
myswitch movem.l d0-d1/a0,-(a7)
move.l _SysBase(PC),a0
move.l 276(a0),d0
move.l tasksnum(PC),d1
lea cputime,a0
subq.l #1,d1
bmi.s swadd
sw0 cmp.l 0(a0),d0
beq.s swi1
lea 8(a0),a0
dbf d1,sw0
bra.s swadd
swi1 add.l #1,4(a0)
swgo movem.l (a7)+,d0-d1/a0
dc.w $4ef9
oldswitch dc.l 0
swadd cmp.l #125,tasksnum
bge.s swgo
add.l #1,tasksnum
move.l d0,0(a0)
move.l #1,4(a0)
bra.s swgo
countio addq.l #1,iocount
rts
dosbase dc.l 0
intuibase dc.l 0
gfxbase dc.l 0
window dc.l 0
parmtxt dc.l 0
fileptr dc.l 0
infile dc.l 0
conmsg dc.l 0
ptr dc.l 0
oldidl dc.l 0
olddisp dc.l 0
myseg dc.l 0
mysignal dc.l 0
iostatus dc.l -1
devstatus dc.l -1
cancelbit dc.l 0
cancelbnum dc.l 0
_SysBase dc.l 0
InputMsg dc.l 0
InRequest dc.l 0
startmess dc.l 0
savedat dc.l 0
mytask dc.l 0
wbmsg dc.l 0
pointer dc.l 0
replyport dc.l 0
finfoptr dc.l 0
dispatches dc.l 0
maxdisp dc.l 0
wbaddr dc.l 0
remembr dc.l 0
remembr2 dc.l 0
captask dc.l 0
snoopport dc.l 0
tasksnum dc.l 0
hidestart dc.l 0
iocount dc.l 0
dummyinput dc.l 0
secs dc.l 0
mics dc.l 0
time10 dc.l 0
stplist dc.l lh_tail
lh_tail dc.l 0
dc.l stplist
dc.b 1
dc.b 0
InInterrupt dc.l 0 ;ln_Succ
dc.l 0 ;ln_Pred
dc.b 2 ;ln_Type
dc.b 60 ;ln_Pri
dc.l xopsleep ;ln_Name
dc.l 0 ;is_Data
dc.l Keyhandler ;is_Code()
IOCounter dc.l 0 ;ln_Succ
dc.l 0 ;ln_Pred
dc.b 2 ;ln_Type
dc.b -1 ;ln_Pri
dc.l IOcntname ;ln_Name
dc.l 0 ;is_Data
dc.l countio ;is_Code()
window_l dc.w 0
window_t dc.w 0
window_w dc.w 550
window_h dc.w 200
binarea dc.b ' ',0
EVEN
minus dc.b ' '
dezimal dc.b ' '
blnk dc.b ' ',0
entries dc.b 0
timeout dc.b 5
procnum dc.b 0
running dc.b 0
newpri dc.b 0
tasktyp dc.b 0
background dc.b 0
bool dc.b 0
printed dc.b 0
cbreak dc.b 0
rows dc.b 0
row dc.b 0
usageflag dc.b 0
morefl dc.b 1
morefl2 dc.b 1
mnflag dc.b 1
tports dc.b 1
headon dc.b 1
hideon dc.b 1
sorton dc.b 1
eof dc.b 0
fromfile dc.b 0
params dc.b 'tfdlrempis'
parmnum equ *-params
t2header dc.b ' ID STATE SIGALLOC SIGWAIT SIGRECVD PC TASKNAME',0
theader dc.b ' ID TYPE STATE PRI CPUSE NUM TASKNAME',0
lheader dc.b ' NODE CNT VER REV FLAGS ',0
libnam dc.b 'LIBRARY NAME',0
devnam dc.b 'DEVICE NAME',0
resnam dc.b 'RESOURCE NAME',0
mheader dc.b 'LOWER UPPER FREE ATTR PRI HUNK NAME',0
nxtline dc.b $9b,'K'
cr dc.b 10,0
iheader dc.b ' NODE DATA CODE PRI TYPE INTERRUPT NAME',0
inheader dc.b ' NODE DATA CODE PRI NAME',0
rheader dc.b ' ADDR PRI FLAGS VER TYPE RESIDENT NAME',0
pheader dc.b ' NODE PORTNAME FLAGS SIGBT NUM SIGTASK',0
hunkheader dc.b ' BCPL DATA LENGTH',0
ddheader dc.b 'DEVICE HDS SECTORS TRACKS BUFFERS STATE HANDLER',0
cdheader dc.b 'PROCESSNAME CURRENT DIRECTORY',0
ofheader dc.b ' LOCK ACCESS SIZE PATH/FILENAME',0
scrheader dc.b 'NUM ADDR TITLE',0
fohead dc.b ' NODE CNT Y X TYPE LO HI NAME',0
kickhead dc.b 'START END LENGTH',0
snoophead dc.b 'ACTION REQUIREMENTS LENGTH FROM TO CALLER',0
stackhead dc.b 'SPLower SIZE USED TASKNAME',0
access dc.b ' Read ',0
dc.b ' Write ',0
romfnt dc.b 'Rom ',0
diskfnt dc.b 'Disk ',0
wbname dc.b 'Workbench',0
status dc.b 'Added ',0
dc.b 'Running ',0
dc.b 'Ready ',0
dc.b 'Waiting ',0
dc.b 'Exeption ',0
dc.b 'Removed ',0
dc.b 'Frozen ',0
dc.b 'Frozen ',0
type dc.b 'Unknown ',0
dc.b 'Task ',0
dc.b 'Interrupt ',0
dc.b 'Device ',0
dc.b 'Msgport ',0
dc.b 'Message ',0
dc.b 'Freemsg ',0
dc.b 'Replymsg ',0
dc.b 'Resource ',0
dc.b 'Library ',0
dc.b 'Memory ',0
dc.b 'Softint ',0
dc.b 'Font ',0
dc.b 'Process ',0
dc.b 'Semaphore ',0
mp_flags dc.b 'Signal ',0
dc.b 'Softint ',0
dc.b 'Ignore ',0
windowname dc.b 'Xoper V1.3 ) 1989 Werner Gunther',0
newname dc.b 'Xoper',0
memportname dc.b 'MemSnoop',0
xopcon dc.b 'XopPackets',0
xopsleep dc.b 'Xop-A-A-x',0
IOcntname dc.b 'Xop-I/O-counter',0
cmdnum set 0
commds ADDCMD 'time'
ADDCMD 'taskpri'
ADDCMD 'info'
ADDCMD 'pri'
ADDCMD 'flush'
ADDCMD 'freeze'
ADDCMD 'warm'
ADDCMD 'signal'
ADDCMD 'break'
ADDCMD 'alert'
ADDCMD 'lastalert'
ADDCMD 'hold'
ADDCMD 'exit'
ADDCMD 'clear'
ADDCMD 'cancel'
ADDCMD 'more'
ADDCMD 'taskports'
ADDCMD 'hunks'
ADDCMD 'devices'
ADDCMD 'openlib'
ADDCMD 'closelib'
ADDCMD 'currentdir'
ADDCMD 'cd'
ADDCMD 'mypri'
ADDCMD 'files'
ADDCMD 'locks'
ADDCMD 'unlock'
ADDCMD 'screens'
ADDCMD 'windows'
ADDCMD 'closescreen'
ADDCMD 'closewindow'
ADDCMD 'fonts'
ADDCMD 'windowfonts'
ADDCMD 'lockdrive'
ADDCMD 'freedrive'
ADDCMD 'capture'
ADDCMD 'clrcold'
ADDCMD 'clrcool'
ADDCMD 'clrwarm'
ADDCMD 'snoop'
ADDCMD 'usage'
ADDCMD 'inputhandler'
ADDCMD 'header'
ADDCMD 'sort'
ADDCMD 'hide'
ADDCMD 'hidden'
ADDCMD 'window'
ADDCMD 'kill'
hex8area dc.b ' '
hexarea dc.b ' ',0
hextab dc.b '0123456789abcdef'
infoh2 dc.b 'Dispatches:',0
infoh1 dc.b 'CPU:',0
infoh3 dc.b 'CPU activity: ',0
infoh6 dc.b 'Total:',0
infoh4 dc.b '% ',0
infoh7 dc.b 'I/O Ints/Sec: ',0
cpu0 dc.b '68000',0
cpu1 dc.b '68010',0
cpu2 dc.b '68020',0
cpu3 dc.b '/68881',0
syst dc.b 'DF0:',0
devload dc.b 'loaded ',0
devnload dc.b 'unloaded ',0
prompt dc.b $9b,'J','->',$9b,$20,$70
cls dc.b $9b,'0 ',$70,$9b,'H'
getwin dc.b $9b,$30,$20,$71
thisline dc.b $0d
notfile dc.b '--- ------- ------- ------- ',0
ganzlongnix dc.b '-'
longnix dc.b '----'
nix dc.b '--- ',0
noinfo dc.b 'No Info on ',0
namerr dc.b 'Unable to find ',0
adrerr dc.b 'Address Error!',0
noderr dc.b 'Can`t find this Node. Continue ? (Y/N)',0
listerr dc.b 'Unable to find ListHeader. Sort aborted.',0
wiwerr dc.b 'Script file only',0
noguru dc.b 'No Alert, shall I produce one ?',0
gurutxt dc.b 'Guru Meditation #',0
clrtxt dc.b 'Memory Hunks cleared.',0
canerr0 dc.b 'Process is not a CLI-task',10
dc.b 'Has it been started from Workbench ? (Y/N)',10,0
canerr1 dc.b 'Process was created by CreateProc()',10
dc.b 'Shall I UnLoad() ? (Y/N)',10,0
unloaderr dc.b 'Arrrgh.. can`t find segments, aborting',0
noprocs dc.b 'Not a Process.',0
notload dc.b 'No program loaded.',0
cliprocs dc.b 'Cli-Process',0
procloaded dc.b 'Loaded as a command: ',0
segloaded dc.b 'Created by CreateProc()',0
coldtxt dc.b 'Cold Capture: ',0
cooltxt dc.b 'Cool Capture: ',0
warmtxt dc.b 'Warm Capture: ',0
kicktxt dc.b 'KickMem : ',0
unset dc.b 'unset',0
intnames dc.b 'Serial Out ',0
dc.b 'Disk Block ',0
dc.b 'SoftInt ',0
dc.b 'Ports ',0
dc.b 'Coper ',0
dc.b 'VBeam ',0
dc.b 'Blitter ',0
dc.b 'Audio Ch.0 ',0
dc.b 'Audio Ch.1 ',0
dc.b 'Audio Ch.2 ',0
dc.b 'Audio Ch.3 ',0
dc.b 'Serial In ',0
dc.b 'Disk Sync ',0
dc.b 'External ',0
dc.b 'SoftInt ',0
dc.b 'NMI ',0
inttyp dc.b 0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1
devicenam dc.b 'input.device',0
memlarg dc.b 'LARGEST ',0
memclr dc.b 'CLEAR ',0
memfast dc.b 'FAST ',0
memchip dc.b 'CHIP ',0
mempubl dc.b 'PUBLIC ',0
failed dc.b 'Failed !',0
allok dc.b 'ALLOC: ',0
free dc.b 'FREE: ',0
startupname dc.b 'S:Xoper.Startup',0
synerr dc.b 'Syntax Error, type "?" for help',10,0
more dc.b '<MORE>'
waittxt dc.b '<ANY KEY>',$9b,$4a
wberr dc.b 'Can`t examine Workbench locks',0
dnotf dc.b 'Directory not found',0
notdir dc.b 'Not a directory',0
nomount dc.b ' not mounted.',0
dishelp dc.b 10,'Names are case sensitive and followed by a ":"',0
unlerr dc.b 'Lock not found',0
unl1 dc.b 'Lock is on ',0
unltxt dc.b 'Old lock was: ',0
unltxt2 dc.b 'Unlock ? (Y/N)',10,0
scnofound dc.b 'Screen not found.',0
winnofound dc.b 'Window not found.',0
stperr dc.b 'Task must be "READY" or "WAITING"',10,0
waerr dc.b 'Task must be "FROZEN"',10,0
onscr dc.b 'On Screen: ',0
usetxt dc.b $9b,'1mUSAGE:',$9b,'0m Xoper [T] [A] [L] [D] [R] [E] [M] [P] [I] [S]',$9b,'K',10
dc.b 'OR Xoper -b',$9b,'K',10
dc.b $9b,'1mDISPLAY:',$9b,'0m',$9b,'K',10
dc.b '[T]asks [F]=taskflags [L]ibraries [D]evices [R]esources',$9b,'K',10
dc.b 'r[E]sident [M]emory [P]orts [I]nterrupts [S]tack [Q]uit',$9b,'K',10
dc.b $9b,'1mCOMMANDS:',$9b,'0m',$9b,'K',10
dc.b 'Time <secs>',$9b,'K',10
dc.b 'Taskpri <priority> [processnum] <taskname>',$9b,'K',10
dc.b 'Mypri <priority>',$9b,'K',10
dc.b 'Signal <mask(hex)> [processnum] <taskname>',$9b,'K',10
dc.b 'Break [processnum] <taskname>',$9b,'K',10
dc.b 'Freeze|Warm [processnum] <taskname>',$9b,'K',10
dc.b 'Kill [processnum] <taskname>',$9b,'K',10
dc.b 'Snoop [processnum] <taskname>',$9b,'K',10
dc.b 'Hide <taskname>',$9b,'K',10
dc.b 'Pri <priority> <nodename>',$9b,'K',10
dc.b 'Info <name>',$9b,'K',10
dc.b 'Clear <longword(hex)>',$9b,'K',10
dc.b 'Hunks [processnum] <procname>',$9b,'K',10
dc.b 'CD <directory> [processnum] <procname>',$9b,'K',10
dc.b 'Unlock <lock>',$9b,'K',10
dc.b 'Openlib | Closelib <libraryname>',$9b,'K',10
dc.b 'Closewindow| Closescreen <title>',$9b,'K',10
dc.b 'Lockdrive | Freedrive <drivename:>',$9b,'K',10
dc.b 'Window <leftedge topedge width height> (scriptfile only) ',$9b,'K',10
dc.b 'Flush,Devices,Currentdir,Files,Locks,Lastalert,More,Sort',$9b,'K',10
dc.b 'Taskports,Windows,Screens,Fonts,Windowfonts,Capture,Hidden',$9b,'K',10
dc.b 'ClrCool,ClrCold,ClrWarm,Usage,InputHandler,Header',$9b,'K',10
dc.b 'Hold,Exit',$9b,'K',10
null dc.b 0
IFD DEBUG
dosname dc.b 'dos.library',0
intuiname dc.b 'intuition.library',0
gfxname dc.b 'graphics.library',0
EVEN
ENDC
BSS blabla
buffer ds.b 2000
fname ds.b 284
out ds.b 80
dummy ds.b 80
in ds.b 80
cputime ds.b 1000
mypacket BSS standardpacket
LN_SUCC ds.l 1
LN_PRED ds.l 1
LN_TYPE ds.b 1
LN_PRI ds.b 1
LN_NAME ds.l 1
MP_FLAGS ds.b 1
MP_SIGBIT ds.b 1
MP_SIGTASK ds.l 1
MN_SIZE ds.w 1
LH_HEAD ds.l 1
LH_TAIL ds.l 1
LH_TAILPRED ds.l 1
LH_TYPE ds.b 1
LH_pad ds.b 1
dp_Link ds.l 1
dp_Port ds.l 1
dp_Type ds.l 1
dp_Res1 ds.l 1
dp_Res2 ds.l 1
dp_Arg1 ds.l 1
dp_Arg2 ds.l 1
dp_Arg3 ds.l 1
dp_Arg4 ds.l 1
dp_Arg5 ds.l 1
dp_Arg6 ds.l 1
dp_Arg7 ds.l 1
END
SHAR_EOF
cat << \SHAR_EOF > Xoper.doc
Xoper V1.3
Copyright (c) Werner Gunther 1989
Xoper is a freeware program to display and to control system activity.
Permition is granted to freely distribute this program.
--------------------------------------------------------------------------
Changes in V1.2:
New commands: Snoop, Capture, ClrCool, ClrWarm, ClrCold.
Added : CPU usage by task.
Cancel command has been rewritten, some minor bugs removed.
--------------------------------------------------------------------------
Changes in V1.3:
New commands: [S]=Stack usage, Sort, Hide, Hidden, Header, Window,
InputHandler.
Added : Support of startup-scripts, I/O Interrupts/second, 'Kill' an
alias for 'Cancel'.
Some BIG bugs have been removed: The port-display used to GURU if more than
32 Ports did exist. The Cli Xoper has been started did act like having a
priority of 128. Unlock didn't unlock sometimes, the interrupt/priority
field did contain rubbish, Currentdir didn't examine all Processes.
There were some more, minor bugs, all (hopefully) removed.
--------------------------------------------------------------------------
Starting Xoper from CLI:
Xoper [T] [F] [S] [L] [D] [R] [E] [M] [P] [I]
These parameters are described below. For all those who like long
Startup-Sequences, overcrowded memory and hot-keys enter
Xoper -b
This will install Xoper in background waiting for LeftAmiga-RightAmiga-X
to pop up. In both cases you don't have to RUN or RUNBACK Xoper, it will
always create its own process.
At startup Xoper loads and executes a file named S:Xoper.Startup if such a
file is available. This startup-script is used to set default values, the
window size or the initial default list to be displayed. The Xoper-window
will only be opened after the startup-script has been processed. Look at the
end of the document for a sample startup file.
Xoper Commands:
---------------
Commands can be entered after the prompt '->', these are divided into two
groups:
Display commands: These are always single character entries and may be
specified in any order, upper or lower case, with or w/o embedded blanks,
after the prompt or from CLI as parameters:
T = Tasks (Default if Xoper is called without parameters)
Task node (HEX), Display type, status, priority (decimal), CPU usage
(percent), processnumber for Dos-Processes (decimal), taskname.
F = Task Flags
Task node (HEX), Allocated Signals (HEX), Signals the Task is waiting for
(HEX), Signals received (HEX), Address of the next instruction to be
executed (HEX).
L = Libraries
Base address (HEX), open count (decimal), version (decimal), revision
(decimal), flags (binary), libraryname.
D = Devices
Base address (HEX), open count (decimal), version (decimal), revision
(decimal), flags (binary), devicename.
E = Resident (sorry)
Base address (HEX), priority (decimal), flags (binary), version
(decimal), type, name.
R = Resources
Base address (HEX), open count (decimal), version (decimal), revision
(decimal), flags (binary), resource name.
M = Memory
Lower and upper bounds (HEX), bytes free (decimal), attributes, priority
(decimal), hunk name.
P = Ports
Node address (HEX), portname, flags, signal bit (decimal), queue length
[number of messages] (decimal), taskname.
I = Interrupts
Node address (HEX), pointer to interrupt data (HEX), pointer to interrupt
code (HEX), priority (decimal),type [interrupt queue the interrupt belongs
to], interrupt name.
S = Stack
Lower limit of the stack, stack size, currently used stacksize, taskname.
If you want to minimize your stack using this utility, please note that
Dos-functions use 1500 Bytes at the bottom of the Stack frame for their own
purposes and note that the stacksize is only checked one time per second by
this command.
H = Help ( or ?)
Show a list of commands.
; = NOP
Skip this line (used for remarks in a script file)
Q = Quit
Same as QUIT (see below).
Example: Entering TPM would display Tasks, Ports and Memory. The display
would be updated after a few seconds (5 by default, may be changed
anytime, see below.)
Other commands that do not display lists:
These commands may be entered upper or lower case. Parameters enclosed
in '<>' must be, enclosed in '[]' may be specified. Names are usually
entered as ascii-strings, it can however happen that two or more nodes of
the same name exist. On tasks you may specify the DOS-Processnumber to
sort them out. If everything fails, you can enter the Node-Address with a
leading '$'. This Address will be checked first before the command is being
executed. If the check fails, you'll get an error message or a warning or
a prompt, depending on what went wrong. Names are always the last parameter
to enter. This may seem strange, but it is the simplest way to get rid of
embedded blanks.
Time <seconds>
Set time between updates. Minimum is 1 second, maximum is 255, default is 5
seconds.
Example: Time 1
Taskpri <priority> [processnumber] <taskname>
Change the priority of a task. Values may range from -127 to 127, better
use values between -5 and 5.
Example: Taskpri 5 New Cli
Mypri <priority>
Shortcut for "Taskpri Xoper <priority>"
Example: Mypri 6
Pri <priority> <nodename>
Change the priority of any other node. This command does not work for Tasks.
If the specified node has been found, the entire list the node belongs to
will be resorted.
Example: Pri 1 Chip Memory (try to allocate memory in CHIP first)
Break [processnumber] <taskname>
Set break signals. Useful for tasks running in background or from Workbench.
Example: Break 3 New CLI
Hunks [processnumber] <processname>
Show location, BCPL-Pointers and length of memory blocks the process uses.
Example: Hunks RAM
Snoop [processnumber] <taskname>
Track memory allocation/deallocation of a task. Press break (CTRL-C) to
stop. List includes: action (alloc/free), memory requirements (CHIP/ FAST/
PUBLIC etc), memory size, memory location (start, end) and the address from
where AllocMem() was called.
Files
List lock, access, size and name of open files.
Locks
List any lock.
BUG: Trying to lock the Volume "RAM Disk" crashes the machine sometimes. If
a Volume "RAM Disk" is found it will be replaced by the devicename "RAM:"
(this has been fixed on WB 1.3). Make sure you don't have a disk labeled
"RAM Disk" or you'll never see its locks:-)
Currentdir
List current directory settings of all processes.
Devices
List name,heads,sectors,tracks,startup-buffers and handler-process of every
DOS-device.
Inputhandler
Display node, priority and name (if any) of the input-handlers currently in
use.
Capture
Show vectors controlling the reset, i.e. CoolCapture, ColdCapture and
WarmCapture pointers, KickMem allocations. Useful when searching
for Viruses, but remember that the RAD: device in 1.3 uses the KickMem
pointer to recover from a reset.
ClrCool
ClrCold
ClrWarm
Clear one of those pointers.
Lockdrive <drivename:>
Prevent DOS, Workbench and Disk-Validator from cluttering on the drive.
This command isn't very useful, but I needed it myself. Please note that
the drivename is case sensitive and has to end with a ':'.
Freedrive <drivename:>
Re-enable a drive.
Windows
List address and title of all windows.
Screens
List address and title of screens.
Fonts
List address,height,width,type,fist character and last character of all
loaded fonts.
Windowfonts
List Windows and associated fonts.
Freeze [processnumber] <taskname>
Halt a Task. The task should be READY or WAITING. Frozen tasks are queued in
a new list called FROZEN. When you leave Xoper, halted Task will be
released.
Example: Freeze Killer Graphics Task
Warm [processnum] <taskname>
Restart a halted Task. Task must be FROZEN.
Example: Warm Killer Graphics Task
Hide <taskname>
The task-list tend to be longer than the window size. You may inhibit the
output of some tasks you are not interested in using his command.
Example: Hide trackdisk.device
Hidden
Turn those hidden Tasks back on. It actually is a toggle.
Header
Toggle the (rather long) header on the task display on/off.
Sort
The tasks listing is sorted (on V1.3 and above) to avoid 'jumping' of the
display. Sort toggles this feature on/off. (Stupid command, but was easy
to implement).
Info <librarynode | devicenode>
Show additional information stored in the lib_IdString field.
Example: Info arp.library
Openlib <libraryname>
Open a library. This is useful if you don't want a specified library being
'flushed' out.
Example: Openlibrary arp.library
Clear [longword]
Fill unused memory chunks with pattern, default is 0. Handy for debuggers.
Example: Clear $66726565
Flush
Clean up memory, flush unused libraries, devices and fonts.
Lastalert
Show last Guru Meditation code or rubbish.
Usage
Toggle CPUSE field on the task display between usage relative to all
possible dispatches and usage relative to actually dispatched tasks.
Ahem...not very clear I think. Well, let me try again...
If you add all CPUSE fields together you get 100 % (more or less 1%). After
entering "Usage" adding the fields together will give you the same value as
shown in the 'CPU Activity field'. (I HATE having to write docs)
Taskports
Disable / enable a listing of taskports if ports are displayed.
More
Stop displaying "<MORE>" and "<RETURN>" if output exceeds window.
Window <leftedge> [toptedge [width [height]]]
Works only on script files. Defines the window to be opened.
Example: Window 0 0 550 190
Quit or just Q
Exit Xoper. If Xoper was started with '-b' or if 'Hold' was specified it
will stay in background waiting for LeftAmiga-RightAmiga-X.
Hold
Exit Xoper but install a key-handler and stay in background. Window
settings and display commands are saved.
Exit
Clean up and quit.
!!!! WARNING: The next few commands are dangerous and 'dirty' !!!!!
!!!!!!!!!!!! don't use them if not strictly necessary !!!!!!!!!!!!!
Kill [processnumber] <taskname>
Kill a task or a process. If the task has been called from CLI, the Task
itself and the CLI will be killed. Hunks, Windows, Screens and the
teminal-window will be freed. Simple tasks are just RemTask()'ed. If it is
not a CLI Task you'll be asked if it is a Workbench task, if the answer is
'Yes' unloading will be done by the Workbench. If not, you will be prompted
if Xoper should unload the code. Enter 'No' if you don't know how the task
has been started.
Closewindow <title>
Closes a Window. Please, use it only if the corresponding Task has been
'Cancel'ed. Use the Window-Structure address if the window has no name.
Closescreen <title>
same as above, but for screens.
Unlock <lock (BPTR)>
Unlock a file.
Closelib <libraryname>
This is exactly the same as CloseLibrary().
CD [processnumber] <processname>
Change the current directory of a process. You are prompted if the old
directory lock should be unlocked.
Signal <mask> [processnumber] <taskname>
Set any task-signal. Mask is a hexadecimal value with or w/o leading '$'.
See task's SIGWAIT field for sensible values. Tasks normaly do not wait for
signals only, but for messages, that's why this command may not have the
desired effect, but it is quite useful for tasks hanging around and waiting
for events that may never happen. Warning: Using Signal without any
knowledge about what you are going to signal may cause a system-crash!
Example: Signal 10000000 PopCLI III
----------------------------------------------------------------------------
;Sample Startup Script (to be placed in s:Xoper.Startup)
;
; Window definition on a overscanned + PAL Workbench screen
Window 122 0 550 230
;
;don't display some Tasks
;
Hide CON
Hide trackdisk.device
;
;but turn them on on Startup
;
Hidden
;
;Change the default list to Ports
;
P
;don't display any prompt if the window is full
More
----------------------------------------------------------------------------
I want to thank these people for helping me to debug and enhance the current
Version of Xoper:
Jeff White, Patrik Skottsborg, Michael Beer, Christian Balzer, Lars Soltau,
Heiko Rath and Bob Page.
Thanks.
----------------------------------------------------------------------------
Please send flames, bug reports and especially a list of features you would
like to have included in the next version to
Werner Gunther
Wingertspfad 12
D 6900 Heidelberg
(Germany)
or to my EMAIL address for a fast response:
G35@DHDURZ1.BITNET
SHAR_EOF
# End of shell archive
exit 0
--
Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page
Have five nice days.