ain@j.cc.purdue.edu (Pat-bob White) (10/16/88)
Submitted by: Guenther Werner <G35@DHDURZ1.BITNET>
Summary: A system monitor utility
Poster Boy: Rob Tillotson (akl@j.cc.purdue.edu)
Archive Name: sources/amiga/volume5/xoper.d.Z binaries/amiga/volume8/xoper.d.Z
Tested
NOTES:
This is a very good system monitor utility, written completely in
assembly language. It allows you to inspect the status of just about every
possible bit of the system, and also allows you to do such things as
signaling tasks, opening and closing libraries, freeing task resources,
and other dangerous but useful things.
The source was originally one 77k assembly file; it has been split
into two parts. Simply concatenate them together to produce the original
source.
========================================
# 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.doc
# This archive created: Thu Oct 13 13:41:29 1988
# By: Rob Tillotson (Bored Students Anonymous)
cat << \SHAR_EOF > Xoper.doc
Xoper V1.1
Copyright (c) Werner Gunther 1988
Xoper is a freeware program to display and to control system activity. If
you find this program useful, feel free to send a donation to the address
below.
Starting Xoper from CLI:
Xoper [T] [S] [L] [D] [R] [E] [M] [P] [I]
These parameters are decribed 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.
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 enbedded 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) ,processnumber
for Dos-Processes (decimal), taskname.
S = Task Signals
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.
R = Resident
Base address (HEX), priority (decimal), flags (binary), version
(decimal), type, name.
E = Resources (sorry)
Base address (HEX), open count (decimal), version (decimal), revision
(decimal), flags (binary), resource name.
M = Memory
Lower and upper bounds (HEX), bytes free (HEX), attributes, priority
(decimal), hunk name.
P = Ports
Node address (HEX), portname, flags, signal bits (binary),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 [interupt queue the interrupt belongs
to], interrupt name.
H = Help ( or ?)
Show a list of commands.
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 usualy
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
enbedded 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 Xoper V1.0
Mypri <priority>
Shortcut for "Taskpri Xoper <priority>"
Example: Mypri 6
Pri <priority> <nodename>
Change the priority of any other node. This commad 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
Signal <mask> [processnumber] <taskname>
Set any other 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
Hunks [processnumber] <processname>
Show location, BCPL-Pointers and length of memory blocks the process uses.
Example: Hunks RAM
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.
Lockdrive <DF0 | DF1 | DF2 | DF3>
Prevent DOS, Workbench and Disk-Validator from cluttering on the disk. This
command isn't very useful, I just needed it myself.
Freedrive <DF0 | DF1 | DF2 | DF3>
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 FREEZED. When you leave Xoper, halted Task will be
released.
Example: Freeze Killer Graphics Task
Warm [processnum] <taskname>
Restart a halted Task. Task must be FREEZED.
Example: Warm Killer Graphics Task
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.
Taskports
Disable / enable a listing of taskports if ports are displayed.
More
Stop displaying "<MORE>" and "<RETURN>" if output exceeds window.
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 !!!!!!!!!!!!!
Cancel [processnumber] <taskname>
Cancel a task or a process. If the task has been called from CLI, the Task
itself and the CLI will be killed. Hunks and the teminal-window will be
freed. Simple tasks are just RemTask()'ed. If the process has been started
from Workbench or fired up by another Process using CreateProc(), a promt
will be displayed, asking you if you want to Unload() this process. On
Workbench applications or processes using segment-splitting the answer
shoud be YES, otherwise NO. This command is very useful if the task is in
"Software Error-Task held" state.
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.
----------------------------------------------------------------------------
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 0ain@j.cc.purdue.edu (Pat-bob White) (10/17/88)
Submitted by: Guenther Werner <G35@DHDURZ1.BITNET>
Summary: A system monitor utility
Poster Boy: Rob Tillotson (akl@j.cc.purdue.edu)
Archive Name: sources/amiga/volume5/xoper.s.1.Z
Tested
NOTES:
This is a very good system monitor utility, written completely in
assembly language. It allows you to inspect the status of just about every
possible bit of the system, and also allows you to do such things as
signaling tasks, opening and closing libraries, freeing task resources,
and other dangerous but useful things.
The source was originally one 77k assembly file; it has been split
into two parts. Simply concatenate them together to produce the original
source.
========================================
# 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.a.1
# This archive created: Thu Oct 13 13:44:56 1988
# By: Rob Tillotson (Bored Students Anonymous)
cat << \SHAR_EOF > Xoper.a.1
******************************************
* Xoper 1.1 Copyright (C) Werner Gunther *
* Written for the A68K Assembler *
* (Fish 110) by Charlie Gibbs and *
* Brian R. Anderson *
* *
******************************************
;DEBUG SET 1
XDEF _SysBase
sysbase equ 4
CALL MACRO
xref _LVO\1
move.l \2,a6
jsr _LVO\1(a6)
ENDM
LIBCALL MACRO
xref _\1
jsr _\1
ENDM
ADDCMD MACRO
cmdnum set cmdnum+1
dc.b \1,0
ENDM
;Program startup. If called from DOS we
;use segment splitting to detach
;from our DOS-task.
;A0 points to parameter area,
;D0 holds its length.
start move.l a0,parmtxt
move.b d0,d5
lea dosname(PC),a1
move.l sysbase,a0
lea 378(a0),a0
move.l a0,-(a7)
CALL FindName,sysbase
move.l d0,dosbase
move.l 0(a7),a0
lea gfxname(PC),a1
CALL FindName,sysbase
move.l d0,gfxbase
move.l (a7)+,a0
lea intuiname(PC),a1
CALL FindName,sysbase
move.l d0,intuibase
move.l d0,a0
move.l $38(a0),a0
move.w 12(a0),d0
sub.w #550,d0
move.w d0,window_l
move.l sysbase,a4
move.l 276(a4),a4
tst.l $ac(a4)
bne.s notwb
lea $5c(a4),a0
CALL WaitPort,sysbase
lea $5c(a4),a0
CALL GetMsg,sysbase
move.l d0,wbmsg
move.w #$740a,in
notwb:
IFND DEBUG
lea newname,a1
CALL FindTask,sysbase
tst.l d0
bne oops
ENDC
tst.l wbmsg
beq.s fromdos
jmp mainprg
fromdos lea in,a3
clr.l d7
move.b d5,d7
move.l parmtxt,a4
trans move.b (a4)+,(a3)+
dbf d7,trans
cmpi.b #1,d5
bne.s starttask
move.w #$740a,in
starttask:
IFND DEBUG
lea start(PC),a1
suba.l #4,a1
move.l 0(a1),d3
move.l d3,myseg
clr.l 0(a1)
CALL Forbid,sysbase
move.l #newname,d1
clr.l d2
move.l #3500,d4
CALL CreateProc,dosbase
clr.l d1
CALL Exit,dosbase
oops suba.l a0,a0
CALL DisplayBeep,intuibase
CALL Forbid,sysbase
move.l wbmsg,d0
beq.s leave
move.l d0,a1
CALL ReplyMsg,sysbase
clr.l d0
leave rts
dosname dc.b 'dos.library',0
intuiname dc.b 'intuition.library',0
gfxname dc.b 'graphics.library',0
EVEN
main CODE xoper
ENDC
mainprg move.l sysbase,a0
move.l a0,_SysBase
move.l 276(a0),a0
move.l a0,mytask
move.l #newname,10(a0)
pea 0
pea 0
LIBCALL CreatePort
lea 8(a7),a7
move.l d0,replyport
cmp.w #'-b',in
bne.s restart
move.w #$740a,in
bra instback
;This code just opens a CON: Window. Position
;and size are taken from window_l,window_t,
;window_w,window_h.
restart move.l mytask(PC),a0
clr.l 26(a0)
lea fname,a0
move.l #'con:',0(a0)
clr.b 4(a0)
lea buffer,a1
lea window_l(PC),a2
move.l #3,d4
rest1 move.l #2,d3
clr.l d0
move.w (a2)+,d0
bsr longdec
bsr strcat
move.w #$2f00,buffer
bsr strcat
dbf d4,rest1
lea windowname(PC),a1
bsr strcat
move.l a0,d1
move.l #1005,d2
CALL Open,dosbase(PC)
move.l d0,fileptr
lsl.l #2,d0
move.l d0,a4
move.l 8(a4),conmsg
;get a pointer to our window
move.l #buffer,d0
lsr.l #2,d0
move.l d0,dp_Arg1
move.l conmsg,a0
move.l #25,dp_Type
bsr cons1
lea buffer,a0
move.l 28(a0),window
clr.l ptr
;show a list. The string entered from keyboard is stored
;in 'in'.Every character is interpreted as one command
;i.e. 'rip' means 'resources'+'interrupts'+'ports'.
showwhat bsr raw
bsr clearscr
tst.b morefl
beq.s swh1
;if <MORE> is enabled we need to know how many lines can
;fit into our window
move.l #getwin,d2
move.l fileptr,d1
moveq.l #4,d3
CALL Write,dosbase(PC)
move.l fileptr,d1
move.l #9,d3
move.l #buffer,d2
CALL Read,dosbase(PC)
lea buffer,a0
lea 5(a0),a0
bsr isdec
subq.b #1,d2
move.b d2,rows
clr.b row
;search the command to be executed. If none is found,
;show a help message
swh1 clr.l d7
input lea in,a0
move.b 0(a0,d7),d0
addq.b #1,d7
cmpi.b #' ',d0
beq.s input
cmpi.b #10,d0
beq nomore
or.b #32,d0
cmpi.b #'q',d0
beq exit
lea params(PC),a0
clr.l d1
i1 cmp.b 0(a0,d1),d0
beq.s foundp
addq.b #1,d1
cmpi.b #parmnum,d1
bne.s i1
move.l #usetxt,d0
move.b #1,mnflag
bsr putnam
clr.b mnflag
bra nomore
foundp lsl.b #2,d1
lea subs(PC),a0
move.b #1,mnflag
jsr 0(a0,d1)
clr.b mnflag
bra.s input
;wait for 'timeout' seconds for a kepress
nomore move.l #prompt,d2
move.l fileptr,d1
moveq.l #7,d3
CALL Write,dosbase(PC)
bsr con
move.b timeout,d6
halt move.l #1000000,d4
bsr getkey
move.l mytask(PC),a0
move.l 26(a0),d1
and.l #$1000,d1
bne exit
tst.l d0
bne.s cli
subq.b #1,d6
bne.s halt
clr.l d4
bsr getkey
tst.l d0
bne.s cli
bra showwhat
getkey move.l fileptr,d1
moveq.l #1,d3
move.l #null,d2
CALL Write,dosbase(PC)
move.l d4,d2
move.l fileptr,d1
CALL WaitForChar,dosbase(PC)
rts
;read the string from keyboard search and execute
;the command, if any.
cli bsr readline
lea dummy,a0
subq.b #1,d0
cl2 subq.b #1,d0
bmi.s cl1
cmp.b #' ',0(a0,d0)
beq.s cl2
cl1 addq.b #1,d0
move.b #10,0(a0,d0)
bsr kllblnks
cmpi.b #10,0(a0)
beq showwhat
lea in,a1
lea commds(PC),a2
clr.b d2
tstcmd move #-1,d1
tc2 addq #1,d1
move.b 0(a0,d1),d3
or.b #32,d3
tst.b 0(a2,d1)
beq.s foundcmd
cmp.b 0(a2,d1),d3
beq.s tc2
nocmd tst.b (a2)+
bne.s nocmd
addq.b #1,d2
cmpi.b #cmdnum,d2
bne tstcmd
bra.s nm1
foundcmd cmpi.b #'*',d3
beq.s okcmd
cmpi.b #' ',d3
bne.s nocmd
okcmd clr.b procnum
adda.w d1,a0
bsr kllblnks
and.l #$ff,d2
lsl #2,d2
lea cmdaddr(PC),a1
clr.b printed
jsr 0(a1,d2)
tst.b morefl
beq nomore
tst.b printed
beq nomore
move.l #10,d3
move.l fileptr,d1
move.l #waittxt,d2
CALL Write,dosbase(PC)
bsr readline
move.l #4,d3
move.l fileptr,d1
move.l #thisline,d2
CALL Write,dosbase(PC)
bra nomore
nm1 lea buffer,a2
nm2 move.b (a1)+,(a2)+
cmp.b #10,-1(a1)
bne.s nm2
lea in,a1
nm0 move.b (a0)+,(a1)+
dbf d0,nm0
lea dummy,a2
lea buffer,a1
nm3 move.b (a1)+,(a2)+
cmp.b #10,-1(a1)
bne.s nm3
bra showwhat
subs bra showtask
bra showaddr
bra showdevs
bra showlibs
bra showres
bra showresi
bra showmem
bra showprt
bra showint
cmdaddr bra settime
bra taskpri
bra info
bra pri
bra flush
bra freeze
bra warm
bra signal
bra break
bra alert
bra lastalert
bra hold
bra stopall
bra clear
bra cancel
bra moretst
bra taskports
bra hunks
bra devices
bra openlib
bra closelib
bra currentdir
bra cd
bra mypri
bra openfiles
bra locks
bra unlock
bra screens
bra windows
bra closescreen
bra closewindow
bra fonts
bra windowfonts
bra lockdrive
bra freedrive
;------ Task-Structures-----
showaddr clr.b tasktyp
bra.s startask
showtask move.b #1,tasktyp
startask move.l #infoh1,d0
bsr putstr
move.l 4,a6
move.l #cpu2,d0
btst #1,297(a6)
bne.s cpupr
move.l #cpu1,d0
btst #0,297(a6)
bne.s cpupr
move.l #cpu0,d0
cpupr jsr putstr
move.l 4,a6
btst #2,297(a6)
beq.s no881
move.l #cpu3,d0
bsr putstr
no881 move.l #20,d1
bsr tab
move.l #infoh3,d0
bsr putstr
move.l _SysBase(PC),a6
move.l 280(a6),d0
move.l 284(a6),d1
move.l oldidl,d3
move.l d0,oldidl
sub.l d3,d0
move.l olddisp,d3
move.l d1,olddisp
sub.l d1,d3
move.l d3,-(a7)
sub.l d3,d0
neg.l d3
lsl.l #2,d3
move.l d3,d1
lsl.l #3,d3
move.l d3,d2
lsl.l #1,d3
add.l d2,d3
add.l d1,d3
move.l d0,d1
move.l d3,d0
bsr div
move.l d0,d3
bsr bytedec
move.l #infoh4,d0
bsr putnam
move.l #infoh2,d0
bsr putstr
move.l (a7)+,d0
neg.l d0
clr.l d3
bsr longdec
move.l #27,d1
bsr tab
move.l #infoh6,d0
bsr putstr
move.l 4,a4
move.l 284(a4),d0
bsr longdec
move.l #nxtline,d0
bsr putstr
move.l #nxtline,d0
bsr putstr
lea theader(PC),a0
tst.b tasktyp
bne.s phedder
lea t2header(PC),a0
phedder bsr puthead
bsr getaskdat
lea buffer,a5
pt1 tst.b entries
beq pt2
move.l 0(a5),a4
move.l a4,d0
bsr hexa
tst.b tasktyp
beq.s pt12
clr.l d0
move.b 8(a4),d0
bsr gettype
pt12 clr.l d0
move.b 9(a5),d0
subq.b #1,d0
mulu #10,d0
move.l #status,d1
add.l d1,d0
bsr putstr
tst.b tasktyp
bne.s pt13
move.l 18(a4),d0
bsr hex8
move.l #ganzlongnix,d0
cmp.b #4,9(a5)
beq.s pt14
bsr putstr
bra.s pt15
pt14 move.l 22(a4),d0
bsr hex8
pt15 move.l 26(a4),d0
bsr hex8
move.l 54(a4),a1
move.l 0(a1),d0
cmp.b #2,9(a5)
bne.s pt16
move.l #*,d0
pt16 bsr hexa
bra pt4
pt13 move.b 10(a5),d3
bsr plusmins
clr.b d3
cmpi.b #13,8(a5)
bne.s noproc
move.b 11(a5),d3
bsr bytedec
bra.s pt4
noproc move.l #nix,d0
bsr putstr
pt4 move.l 4(a5),d0
bsr putnam
lea 12(a5),a5
subq.b #1,entries
bra pt1
pt2 rts
putlist move.l 0(a4),a4
tst.l 0(a4)
beq.s endlist
bsr putdata
bra.s putlist
endlist rts
putdata move.l a4,0(a5)
move.l 10(a4),4(a5)
move.b 8(a4),8(a5)
move.b 15(a4),9(a5)
move.b 9(a4),10(a5)
move.b 143(a4),11(a5)
lea 12(a5),a5
addq.b #1,entries
rts
gettype and.l #$f,d0
mulu #11,d0
add.l #type,d0
bra putstr
getaskdat move.w #$4000,$dff09a
lea buffer,a5
clr.b entries
move.l _SysBase(PC),a4
move.l 276(a4),a4
bsr putdata
move.l _SysBase(PC),a4
lea 406(a4),a4
bsr putlist
move.l _SysBase(PC),a4
lea 420(a4),a4
bsr putlist
lea stplist(PC),a4
bsr putlist
move.w #-$4000,$dff09a
rts
*-------- mem-hunks ------------
showmem lea mheader(PC),a0
bsr puthead
move.l _SysBase(PC),a5
lea 322(a5),a5
clr.l d5
mem1 move.l 0(a5),a5
tst.l 0(a5)
beq.s mem2
move.l 20(a5),d0
bsr hexa
move.l 24(a5),d0
bsr hexa
move.l 28(a5),d0
add.l d0,d5
moveq #1,d3
bsr longdec
move.b 15(a5),d3
bsr bytedec
move.b 9(a5),d3
bsr plusmins
move.l 10(a5),d0
bsr putnam
bra.s mem1
mem2 move.l #infoh6,d0
bsr putstr
move.l #15,d1
bsr tab
move.l d5,d0
bsr longdec
move.l #nxtline,d0
bra putstr
*--------- interrupts ------------
showint lea iheader(PC),a0
bsr puthead
lea intnames(PC),a5
lea inttyp(PC),a4
move.l #15,d5
move.l _SysBase(PC),a3
lea 84(a3),a3
si0 tst.b 0(a4)
bne.s si4
move.l 8(a3),a2
bra.s si5
si4 move.l 0(a3),a2
si5 cmp.l #0,a2
beq.s nxtint
tst.b 0(a4)
beq.s si1
si2 move.l 0(a2),a2
tst.l 0(a2)
beq.s nxtint
si1 move.l a2,d0
bsr hexa
move.l 14(a2),d0
bsr hexa
move.l 18(a2),d0
bsr hexa
move.b 9(a2),d0
move.l a3,-(a7)
bsr plusmins
move.l (a7)+,a3
move.l a5,d0
bsr putstr
move.l 10(a2),d0
tst.l d0
bne.s prtintnam
move.l #ganzlongnix,d0
prtintnam bsr putnam
tst.b 0(a4)
bne.s si2
tst.l 0(a2)
beq.s nxtint
move.l 0(a4),a4
bra si1
nxtint lea 1(a4),a4
lea 12(a5),a5
lea 12(a3),a3
dbf d5,si0
rts
*--------- resident ------------
showresi lea rheader(PC),a0
bsr puthead
move.l _SysBase(PC),a5
move.l 300(a5),a5
r1 tst.l 0(a5)
beq r2
move.l 0(a5),a4
move.l a4,d0
bsr hexa
move.b 13(a4),d3
bsr plusmins
move.b 10(a4),d0
bsr bin
move.b 11(a4),d3
bsr bytedec
move.b 12(a4),d0
bsr gettype
move.l 14(a4),d0
bsr putnam
lea 4(a5),a5
bra r1
r2 rts
*--------- ports -------------
showprt lea pheader(PC),a0
bsr puthead
move.l _SysBase(PC),a4
add.l #392,a4
lea buffer,a5
clr.l d5
CALL Forbid,_SysBase(PC)
sp2 move.l 0(a4),a4
tst.l 0(a4)
beq.s sp20
bsr getpdata
bra.s sp2
sp20 tst.b tports
beq.s sp15
sp1 move.w #$4000,$dff09a
move.l _SysBase(PC),a4
move.l 276(a4),a4
lea 92(a4),a4
bsr getpdata
move.l _SysBase(PC),a2
lea 406(a2),a2
sp11 move.l 0(a2),a2
tst.l 0(a2)
beq.s sp14
lea 92(a2),a4
cmp.b #13,8(a2)
bne.s sp11
bsr getpdata
bra sp11
sp14 move.l _SysBase(PC),a2
lea 420(a2),a2
sp12 move.l 0(a2),a2
tst.l 0(a2)
beq.s sp13
lea 92(a2),a4
cmp.b #13,8(a2)
bne.s sp12
bsr getpdata
bra sp12
sp13 move.w #-$4000,$dff09a
sp15 CALL Permit,_SysBase(PC)
lea buffer,a5
sp3 tst.b d5
beq sp6
move.l 0(a5),d0
bsr hexa
move.l 4(a5),d0
bsr putstr
move.l #23,d1
bsr tab
move.b 8(a5),d0
and.l #3,d0
mulu #9,d0
add.l #mp_flags,d0
bsr putstr
move.b 9(a5),d0
bsr bin
move.b 14(a5),d3
bsr bytedec
move.l #ganzlongnix,d0
move.l 10(a5),a3
cmp.l #0,a3
beq.s sp8
move.l 10(a3),d1
move.l d1,d2
andi.l #$ff000000,d2
bne.s sp8
move.l d1,d0
sp8 bsr putnam
lea 16(a5),a5
subq.b #1,d5
bra sp3
sp6 rts
getpdata move.l a4,0(a5)
move.l 10(a4),4(a5)
move.b 14(a4),8(a5)
move.b 15(a4),9(a5)
move.l 16(a4),10(a5)
clr.b d0
movea.l 20(a4),a3
sp10 movea.l 0(a3),a3
cmpa.l #0,a3
beq.s sp9
addq.b #1,d0
bra.s sp10
sp9 move.b d0,14(a5)
lea 16(a5),a5
addq.b #1,d5
rts
*-------- resources ------------
showres lea lheader(PC),a0
bsr puthead1
lea resnam(PC),a0
bsr puthead2
move.l _SysBase(PC),d5
add.l #336,d5
bsr show
rts
*--------- devices -------------
showdevs lea lheader(PC),a0
bsr puthead1
lea devnam(PC),a0
bsr puthead2
move.l _SysBase(PC),d5
add.l #350,d5
bsr show
rts
*-------- libraries -------------
showlibs lea lheader(PC),a0
bsr puthead1
lea libnam(PC),a0
bsr puthead2
move.l _SysBase(PC),d5
add.l #378,d5
show lea buffer,a5
clr.b entries
CALL Forbid,_SysBase(PC)
move.l d5,a4
sl1 move.l 0(a4),a4
tst.l 0(a4)
beq.s sl2
addq.b #1,entries
move.l a4,0(a5)
move.l 10(a4),4(a5)
move.b 33(a4),8(a5)
move.b 21(a4),9(a5)
move.b 23(a4),10(a5)
move.b 14(a4),11(a5)
lea 12(a5),a5
bra.s sl1
sl2 CALL Permit,_SysBase(PC)
lea buffer,a5
dl3 tst.b entries
beq.s sl4
move.l 0(a5),d0
bsr hexa
move.b 8(a5),d3
bsr bytedec
move.b 9(a5),d3
bsr bytedec
move.b 10(a5),d3
bsr bytedec
move.b 11(a5),d0
bsr bin
move.l 4(a5),d0
bsr putnam
lea 12(a5),a5
subq.b #1,entries
bra.s dl3
sl4 rts
;find the first entry in the device-list
;returns a1 = pointer to first entry
devinfo move.l dosbase(PC),a1
move.l 34(a1),a1
move.l 24(a1),a1
adda.l a1,a1
adda.l a1,a1
move.l 4(a1),a1
rts
;unlock a file
unlock bsr readhex
tst.b d7
beq syntax
move.l d0,remembr
move.l d0,-(a7)
move #-1,d6
bsr of44
tst.l remembr
beq.s ul1
move.l #unlerr,d0
bsr putnam
bra ul4
ul1 move.l #unl1,d0
bsr putstr
move.l 0(a7),d0
bsr getpath
move.l #unltxt2,d0
bsr putstr
bsr readline
ori.b #$20,dummy
cmp.b #'y',dummy
bne.s ul5
move.l 0(a7),d1
CALL UnLock,dosbase
ul5 bsr freefinfo
ul4 lea 4(a7),a7
rts
;---------- Show all Locks------------
locks clr.l d6
bra.s of33
;---------- Open Files-----------
openfiles moveq #1,d6
of33 lea ofheader(PC),a0
bsr puthead
of44 bsr allocfinfo
bsr devinfo
move.l a1,a3
of1 adda.l a3,a3
adda.l a3,a3
cmp.l #2,4(a3)
bne of2
move.l 40(a3),d0
lsl.l #2,d0
move.l d0,a4
clr.l d3
move.b (a4)+,d3
subq #1,d3
lea buffer,a5
of22 move.b (a4)+,(a5)+
dbf d3,of22
move.b #':',(a5)+
clr.b 0(a5)
cmp.l #'RAM ',buffer
bne.s of5
cmp.l #'Disk',buffer+4
bne.s of5
move.l #$4d3a0000,buffer+2
of5 move.l #buffer,d1
move.l #-2,d2
CALL Lock,dosbase(PC)
tst.l d0
bne.s of6
move.l #buffer,d0
bsr putstr
move.l #nomount,d0
bsr putnam
bra of2
of6 move.l d0,-(a7)
lsl.l #2,d0
move.l d0,a5
of4 move.l 0(a5),d0
cmp.l #50,d0
ble of3
move.l d0,d5
lsl.l #2,d5
move.l d5,a5
move.l d0,d5
tst d6
bpl.s of45
cmp.l remembr(PC),d0
bne.s of3
clr.l remembr
move.l (a7)+,d1
CALL UnLock,dosbase(PC)
rts
of45 move.l 8(a5),d4
bsr getfinfo
move.l finfoptr,a4
tst.l d6
beq.s of8
bmi.s of8
tst.l 4(a4)
bpl of4
of8 move.l d5,d0
bsr hexa
move.l #access,d0
cmp #-2,d4
beq.s of7
add.l #8,d0
of7 bsr putstr
tst.l 4(a4)
bmi.s of9
move.l #longnix,d0
bsr putstr
bra of10
of9 move.l 124(a4),d0
bsr longdec
of10 move.l d5,d0
bsr getpath
bra of4
move.l #nxtline,d0
bsr putstr
of3 move.l (a7)+,d1
CALL UnLock,dosbase(PC)
of2 move.l 0(a3),a3
cmpa.l #0,a3
bne of1
bsr freefinfo
rts
;---------- Dos Devices ----------
devices lea ddheader(PC),a0
bsr puthead
bsr devinfo
dev1 adda.l a1,a1
adda.l a1,a1
clr.b d6
tst.l 4(a1)
bne dev2
move.l 40(a1),d0
bsr putbcpl
move.l #10,d1
bsr tab
cmp.l #20,28(a1)
ble dev9
moveq #1,d6
move.l 28(a1),a3
adda.l a3,a3
adda.l a3,a3
cmp.l #20,8(a3)
ble dev9
move.l 8(a3),a2
adda.l a2,a2
adda.l a2,a2
move.l 12(a2),d3
movem.l a1-a3,-(a7)
bsr bytedec
movem.l (a7)+,a1-a3
moveq #1,d3
move.l 20(a2),d0
bsr longdec
move.l 40(a2),d0
beq.s devs20
addq #1,d0
sub.l 36(a2),d0
devs20 bsr longdec
move.l 44(a2),d0
bsr longdec
bra.s dev8
dev9 move.l #notfile,d0
bsr putstr
dev8 tst.l 8(a1)
beq.s dev6
move.l #devload,d0
bra.s dev5
dev6 move.l #devnload,d0
dev5 bsr putstr
tst.b d6
beq.s dev7
move.l 4(a3),d0
bne.s dev4
dev7 move.l 16(a1),d0
bne.s dev4
tst.l 8(a1)
beq.s dev11
move.l 8(a1),a3
move.l -82(a3),d0
bsr putstr
bra dev11
dev4 bsr putbcpl
dev11 move.l #nxtline,d0
bsr putstr
dev2 move.l 0(a1),a1
cmpa.l #0,a1
bne dev1
rts
; Check if a named dos-device is mounted
; name in 'buffer'.
; Result: d0 = 0(false) anything else(true).
finddev bsr devinfo
fdev1 adda.l a1,a1
adda.l a1,a1
clr.b d6
tst.l 4(a1)
bne.s fdev2
move.l 40(a1),a2
lea buffer,a0
bsr strbcmp
tst d0
bne.s fdev3
fdev2 move.l 0(a1),a1
cmpa.l #0,a1
bne.s fdev1
fdev3 rts
; Re-assign a drive to dos
freedrive clr.l dp_Arg1
bra ldr3
; Inhibit a disk drive
lockdrive move.l #1,dp_Arg1
ldr3 bsr getstr
andi.w #$dfdf,buffer
cmp.w #'DF',buffer
bne syntax
bsr finddev
bne.s ldr1
ldr2 move.l #buffer,d0
bsr putstr
move.l #nomount,d0
bra putnam
ldr1 move.l #buffer,d1
CALL DeviceProc,dosbase(PC)
tst.l d0
beq.s ldr2
move.l d0,a0
move.l #31,dp_Type
bra cons1
;display the current directory of all processes,
;except Workbench.(Worbench pr_CurrentDir is not a lock)
currentdir lea wbname(PC),a1
CALL FindTask,_SysBase(PC)
move.l d0,wbaddr
lea cdheader(PC),a0
bsr puthead
bsr allocfinfo
bsr getaskdat
lea buffer,a5
cd2 tst.b entries
beq.s cd6
cmp.b #13,8(a5)
bne.s cd5
move.l wbaddr(PC),d0
cmp.l 0(a5),d0
beq.s cd5
move.l 4(a5),d0
bsr putstr
move.l #15,d1
bsr tab
move.l 0(a5),a4
move.l 152(a4),d0
bne.s cd1
move.l #syst,d0
bsr putnam
bra.s cd5
cd1 bsr getpath
cd5 subq.b #1,entries
lea 12(a5),a5
bra.s cd2
cd6 bsr freefinfo
rts
;Change the current directory setting of a process
cd move.l a0,-(a7)
lea wbname(PC),a1
CALL FindTask,_SysBase(PC)
move.l d0,wbaddr
move.l (a7)+,a0
bsr getstr
move.l a0,-(a7)
move.l #buffer,d1
move.l #-2,d2
CALL Lock,dosbase(PC)
move.l (a7)+,a0
tst.l d0
bne cd16
move.l #dnotf,d0
bra putnam
cd16 move.l d0,remembr
move.l a0,-(a7)
bsr allocfinfo
move.l remembr(PC),d0
bsr getfinfo
move.l finfoptr,a5
move.l (a7)+,a0
tst.l 4(a5)
bpl.s cd11
move.l #notdir,d0
bsr putnam
bra cd18
cd11 bsr nodenam
moveq.l #2,d7
lea TRuNode(PC),a4
bsr findnam
tst.b d7
beq.s cd15
move.l d0,a5
cmp.b #13,8(a5)
beq.s cd15
bsr syntax
bra cd18
cd15 cmp.l wbaddr,d0
bne.s cd13
move.l #wberr,d0
bsr putnam
bra cd12
cd13 move.l 152(a5),d1
move.l remembr,152(a5)
move.l d1,remembr
cd12 tst.l remembr
beq.s cd14
move.l #unltxt,d0
bsr putstr
move.l remembr(PC),d0
bsr getpath
move.l #unltxt2,d0
bsr putstr
bsr readline
ori.b #$20,dummy
cmp.b #'y',dummy
bne.s cd14
cd18 move.l remembr(PC),d1
beq.s cd14
CALL UnLock,dosbase(PC)
cd14 bsr freefinfo
cd10 rts
;get all screen pointers.
;result: d5=number of screens
; buffer+100 holds pointers.
getscr lea scrheader(PC),a0
bsr puthead
getscr2 move.l intuibase(PC),a2
move.l 60(a2),a2
lea buffer+100,a1
move.w #$4000,$dff09a
clr.l d5
sr1 move.l a2,(a1)+
move.l 0(a2),a2
addq.l #1,d5
cmpa.l #0,a2
bne.s sr1
subq #1,d5
move.w #-$4000,$dff09a
rts
;display screen addresses and titles
screens bsr getscr
moveq #1,d6
lea buffer+100,a1
sr2 move d6,d3
bsr bytedec
move.l 0(a1),d0
bsr hexa
move.l (a1)+,a2
move.l 22(a2),d0
bsr putnam
addq #1,d6
dbf d5,sr2
rts
;display window addresses and titles
windows clr.b bool
windows1 bsr getscr
tst.b bool
beq.s wn20
move.l d5,-(a7)
lea fohead(PC),a0
bsr puthead
move.l (a7)+,d5
wn20 lea buffer+100,a4
wn2 move.l #onscr,d0
bsr putstr
move.l (a4)+,a2
move.l 22(a2),d0
bsr putnam
move.l 4(a2),a1
clr d6
wn1 cmpa.l #0,a1
beq.s wn3
addq #1,d6
move.l d6,d3
bsr bytedec
move.l a1,d0
bsr hexa
move.l 32(a1),d0
bsr putnam
tst.b bool
beq.s wn21
move.l a1,-(a7)
move.l 50(a1),a1
move.l 52(a1),a1
bsr fontdata
move.l (a7)+,a1
wn21 move.l 0(a1),a1
bra.s wn1
wn3 dbf d5,wn2
rts
;close a specified screen
closescreen bsr getscr2
moveq #1,d6
cmp.b #'$',0(a0)
bne.s cs1
bsr readhex
tst d7
beq syntax
move.l d0,d4
clr.l d6
cs1 lea buffer+100,a2
cs5 tst d6
bne.s cs2
cmp.l (a2)+,d4
beq.s cs3
bra.s cs4
cs2 move.l (a2)+,a1
move.l 22(a1),a1
bsr strcmp
tst d0
beq.s cs3
cs4 dbf d5,cs5
move.l #scnofound,d0
bra putnam
cs3 move.l -4(a2),a0
CALL CloseScreen,intuibase(PC)
rts
;close a specified window
closewindow bsr getscr2
moveq #1,d6
cmp.b #'$',0(a0)
bne.s cw1
bsr readhex
tst d7
beq syntax
move.l d0,d4
clr.l d6
cw1 lea buffer+100,a2
cw5 move.l (a2)+,a4
move.l 4(a4),a4
cw6 cmpa.l #0,a4
beq.s cw4
tst d6
bne.s cw2
cmp.l a4,d4
beq.s cw3
bra.s cw7
cw2 move.l 32(a4),a1
bsr strcmp
tst d0
beq.s cw3
cw7 move.l 0(a4),a4
bra.s cw6
cw4 dbf d5,cw5
move.l #winnofound,d0
bra putnam
cw3 move.l a4,a0
clr.l d0
CALL ModifyIDCMP,intuibase(PC)
move.l a4,a0
CALL CloseWindow,intuibase(PC)
rts
;display windows and associated fonts
windowfonts move.b #1,bool
bra windows1
;display loaded font names and definitions
fonts lea fohead(PC),a0
bsr puthead
move.l gfxbase(PC),a1
move.l $8c(a1),a1
fo1 tst.l 0(a1)
beq.s fo3
bsr fontdata
move.l 0(a1),a1
bra fo1
fo3 rts
fontdata move.l a1,d0
bsr hexa
move.w 30(a1),d3
bsr bytedec
move.w 20(a1),d3
bsr bytedec
move.w 24(a1),d3
bsr bytedec
move.l #romfnt,d0
btst #1,23(a1)
beq.s fod1
move.l #diskfnt,d0
fod1 bsr putstr
move.b 32(a1),d3
bsr bytedec
move.b 33(a1),d3
bsr bytedec
move.l 10(a1),d0
bra putnam
;set update rate
settime bsr getnum
tst.b d7
beq syntax
tst.w d2
bne.s st1
move.b #1,d2
st1 move.b d2,timeout
rts
syntax move.l #synerr,d0
bra putnam
;copy a string from input to 'buffer'
;a0 = pointer to string
getstr lea buffer,a5
gst2 cmp.b #' ',0(a0)
beq.s gst1
cmp.b #10,0(a0)
beq.s gst1
move.b (a0)+,(a5)+
bra.s gst2
gst1 clr.b 0(a5)
bra kllblnks
;read in a nodename or a processname
nodenam bsr isdec
move.b d2,procnum
nodenam2 bsr kllblnks
move.l a0,a5
gno1 cmp.b #10,(a0)+
bne.s gno1
move.b #0,-1(a0)
rts
;modify a task's priority
taskpri bsr getnum
tst.b d7
beq syntax
move.b d2,newpri
bsr nodenam
moveq.l #2,d7
lea TRuNode(PC),a4
bsr findnam
tst.b d7
beq.s tp1
move.l d0,a1
move.b newpri,d0
CALL SetTaskPri,_SysBase(PC)
tp1 rts
;set the priority of our task
mypri bsr getnum
tst.b d7
beq syntax
move.l _SysBase(PC),a1
move.l 276(a1),a1
move.l d2,d0
CALL SetTaskPri,_SysBase(PC)
rts
;cancel a task or a process. The theory is quite simple:
;(Process->ReturnAddr)-4 points to the return address on
;the stack. Task->SPReg points to the next instruction
;to be executed. We just need a
; *(Task->SPReg) = *(Process->ReturnAddr-4).
;BUT: If the process has been started from Dos (CLI) and
;the process is doing disk I/O, the CLI will respond with
;a GURU #87000004 (AsyncPKT=unexpected packed received).
;Thats why the calling CLI is also canceled.
;Workbench tasks are unloaded after the Startup-Message has
;been replied. How in hell do we reply them ? And if the process
;has been started by a user-task we get into real trouble.
cancel clr.l remembr
clr.l remembr2
clr.b bool
bsr nodenam
testagain moveq.l #1,d7
lea TReNode(PC),a4
bsr findnam
move.l a5,pointer
tst.b d7
bne.s canok
move.l #stperr,d0
bra putnam
canok move.l d0,a1
cmp.b #1,8(a1)
bne.s isproc
CALL RemTask,_SysBase(PC)
rts
isproc clr.l d5
tst.l $ac(a1)
beq.s wascreproc
move.l $80(a1),a2
adda.l a2,a2
adda.l a2,a2
move.l 12(a2),d1
bne.s wascreproc
move.l $ac(a1),a2
adda.l a2,a2
adda.l a2,a2
move.l 60(a2),d5
tst.l 40(a2)
beq dosreturn
move.l 28(a2),remembr
move.l 56(a2),remembr2
bra dosreturn
wascreproc tst.b bool
bne.s unload
move.b #2,bool
move.l #canerr1,d0
bsr putstr
bsr readline
ori.b #$20,dummy
cmp.b #'y',dummy
bne.s andagain
move.b #1,bool
andagain move.l pointer(PC),a5
bra testagain
unload cmp.b #1,bool
bne.s dosreturn
move.l a1,-(a7)
CALL UnLoadSeg,dosbase(PC)
move.l (a7)+,a1
dosreturn move.w #$4000,$dff09a
move.l 54(a1),a3
move.l #endtask,0(a3)
move.l #2,106(a1)
move.l mytask(PC),108(a1)
cmp.b #4,15(a1)
bne.s doswait
move.l a1,d4
CALL Remove,_SysBase(PC)
move.l d4,a1
lea 406(a6),a0
CALL AddHead,_SysBase(PC)
move.l d4,a1
doswait move.w #-$4000,$dff09a
tst.l d5
SHAR_EOF
# End of shell archive
exit 0ain@j.cc.purdue.edu (Pat-bob White) (10/17/88)
Submitted by: Guenther Werner <G35@DHDURZ1.BITNET>
Summary: A system monitor utility
Poster Boy: Rob Tillotson (akl@j.cc.purdue.edu)
Archive Name: sources/amiga/volume5/xoper.s.2.Z
Tested
NOTES:
This is a very good system monitor utility, written completely in
assembly language. It allows you to inspect the status of just about every
possible bit of the system, and also allows you to do such things as
signaling tasks, opening and closing libraries, freeing task resources,
and other dangerous but useful things.
The source was originally one 77k assembly file; it has been split
into two parts. Simply concatenate them together to produce the original
source.
========================================
# 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.a.2
# This archive created: Thu Oct 13 13:45:10 1988
# By: Rob Tillotson (Bored Students Anonymous)
cat << \SHAR_EOF > Xoper.a.2
beq endcanc
move.l $ac(a1),a2
adda.l a2,a2
adda.l a2,a2
dwa1 tst.l 60(a2)
bne.s dwa1
clr.l d5
bra dosreturn
endcanc move.l remembr(PC),d1
beq.s ecan1
CALL Close,dosbase(PC)
ecan1 move.l remembr2(PC),d1
beq.s ecan2
CALL Close,dosbase(PC)
ecan2 rts
endtask CALL Forbid,_SysBase(PC)
move.l _SysBase(PC),a1
move.l 276(a1),a1
move.l 176(a1),a1
lea -4(a1),a7
rts
;Stop a task (just queue it on a special list)
freeze bsr nodenam
moveq.l #1,d7
lea TReNode(PC),a4
bsr findnam
tst.b d7
bne.s frok
move.l #stperr,d0
bra putstr
frok move.w #$4000,$dff09a
move.l d0,a1
CALL Remove,_SysBase(PC)
move.w #-$4000,$dff09a
move.l d0,a1
move.l d0,a5
lea stplist(PC),a0
CALL AddHead,_SysBase(PC)
add.b #4,15(a5)
rts
;put the task back on its list
warm bsr nodenam
lea stplist(PC),a0
movea.l a5,a1
clr.l d7
bsr fn4
tst.b d7
bne.s waok
move.l #waerr,d0
bra putstr
waok move.w #$4000,$dff09a
move.l d0,a1
CALL Remove,_SysBase(PC)
move.l d0,a1
move.l d0,a5
move.l TReNode,a0
cmp.b #8,15(a1)
bne.s wa1
move.l TWaNode,a0
wa1 adda.l _SysBase(PC),a0
CALL AddTail,_SysBase(PC)
move.l d0,a1
sub.b #4,15(a5)
move.w #-$4000,$dff09a
rts
;show the hunks of a process
hunks bsr nodenam
moveq.l #2,d7
lea TRuNode(PC),a4
bsr findnam
tst.b d7
bne.s hu1
rts
hu1 move.l d0,a4
cmp.b #13,8(a4)
beq.s hu2
move.l #noprocs,d0
bra putnam
hu2 move.l 128(a4),d0
beq.s noprogload
lsl.l #2,d0
move.l d0,a3
move.l 12(a3),d1
beq.s hu3
move.l #segloaded,d0
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
move.l #nxtline,d0
bsr putstr
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
move.l #nxtline,d0
bsr putstr
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,signals
bsr nodenam
moveq.l #2,d7
lea TReNode(PC),a4
bsr findnam
tst.b d7
beq.s pi1
move.l d0,a1
move.l signals,d0
and.l 18(a1),d0
CALL Signal,_SysBase(PC)
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 pi1
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
;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
move.l #nxtline,d0
bra putstr
;toggle '<MORE>' on/off
moretst bchg #0,morefl
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
;toggle task-ports display on/off
taskports bchg #0,tports
clo1 rts
;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 bsr readhex
tst.b d7
beq syntax
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 move.l d0,d1
and.l #$ff000001,d1
beq.s inrange
move.l #adrerr,d0
bsr putnam
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 move.l #cls,d2
move.l fileptr,d1
moveq.l #6,d3
CALL Write,dosbase(PC)
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
;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 buffer,a0
move.l a0,d0
ph1 move.b #'-',(a0)+
dbf d5,ph1
clr.b 0(a0)
bra putnam
;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.b #1,d7
cmp.b #'$',0(a0)
bne.s rh3
lea 1(a0),a0
rh3 clr.l d0
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
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 replyport,-(a7)
LIBCALL DeletePort
lea 4(a7),a7
move.l fileptr(PC),d1
CALL Close,dosbase(PC)
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 buffer+8,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 buffer,a2
ld3 move.b 0(a1),(a2)+
move.b #' ',(a1)+
dbf d2,ld3
ld1 cmp #2,d3
beq.s ld4
move.l #buffer,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
move.l #nxtline,d0
bsr putstr
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 if they end with CR
;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
pst1 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
move.l d0,d3
move.l a3,d2
move.l fileptr,d1
CALL Write,dosbase(PC)
clr.l d0
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 #6,d3
move.l fileptr,d1
move.l #more,d2
CALL Write,dosbase(PC)
bsr con
bsr readline
bsr raw
clr.b row
move.l #4,d3
move.l fileptr,d1
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)
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 move.l fileptr,d1
move.l #dummy,d2
moveq.l #80,d3
CALL Read,dosbase(PC)
rts
;switch console to con: mode & empty input buffer
con bsr cmdcon
move.l #50,d2
move.l fileptr,d1
CALL WaitForChar,dosbase(PC)
beq.s conend
bsr readline
conend rts
cmdcon clr.l dp_Arg1
move.l conmsg,a0
move.l #994,dp_Type
bra.s cons1
;switch console window to raw mode
raw move.l conmsg,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,dp_Port
lea mypacket,a1
CALL PutMsg,_SysBase(PC)
move.l replyport,a0
CALL WaitPort,_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 0
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
dosbase dc.l 0
intuibase dc.l 0
gfxbase dc.l 0
window dc.l 0
parmtxt dc.l 0
fileptr 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
_SysBase dc.l 0
InputMsg dc.l 0
InRequest dc.l 0
signals dc.l 0
mytask dc.l 0
wbmsg dc.l 0
pointer dc.l 0
replyport dc.l 0
finfoptr dc.l 0
wbaddr dc.l 0
remembr dc.l 0
remembr2 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 0 ;ln_Name
dc.l 0 ;is_Data
dc.l Keyhandler ;is_Code()
window_l dc.w 0
window_t dc.w 0
window_w dc.w 550
window_h dc.w 200
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
rows dc.b 0
row dc.b 0
morefl dc.b 1
mnflag dc.b 1
tports dc.b 1
params dc.b 'tsdlrempi'
parmnum equ *-params
t2header dc.b ' ID STATE SIGALLOC SIGWAIT SIGRECVD PC TASKNAME',0
theader dc.b ' ID TYPE STATE PRI 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
rheader dc.b ' ADDR PRI FLAGS VER TYPE RESIDENT NAME',0
pheader dc.b ' NODE PORTNAME FLAGS SIGBIT 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
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 'Freezed ',0
dc.b 'Freezed ',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.1 ) 1988 Werner Gunther',0
newname dc.b 'Xoper V1.1',0
prtnam dc.b 'PRT:',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'
hex8area dc.b ' '
hexarea dc.b ' ',0
binarea 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
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 $9b,$46,$9b,$4b
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!',10,0
noderr dc.b 'Can`t find this Node. Continue ? (Y/N)',0
listerr dc.b 'Unable to find ListHeader. Sort aborted.',0
noguru dc.b 'No Alert, shall I produce one ?',0
gurutxt dc.b 'Guru Meditation #',0
clrtxt dc.b 'Memory Hunks cleared.',0
canerr1 dc.b 'Process was created by CreateProc()',10
dc.b 'Shall I UnLoad() ? (Y/N)',10,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
canerr2 dc.b 'Use ENDCLI command to close a CLI-Window.',0
canerr3 dc.b 'Process is waiting for DOS I/O and will be canceled when finished. ',0
intnames dc.b 'Serial Out ',0
dc.b 'Disk Block ',0
dc.b 'SoftInt ',0
dc.b 'CIAA ',0
dc.b 'Copper ',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 'CIAB ',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
synerr dc.b 'Syntax Error, type "?" for help',10,0
more dc.b '<MORE>'
waittxt dc.b '<RETURN>',$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
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 "FREEZED"',10,0
onscr dc.b 'On Screen: ',0
usetxt dc.b $9b,'1mUSAGE:',$9b,'0m Xoper [T] [S] [L] [D] [R] [E] [M] [P] [I]',$9b,'K',10
dc.b 'OR Xoper -b',$9b,'K',10
dc.b $9b,'1mDISPLAY:',$9b,'0m',$9b,'K',10
dc.b '[T]asks [S]=taskstate [L]ibraries [D]evices [R]esources',$9b,'K',10
dc.b 'r[E]sident [M]emory [P]orts [I]nterrupts [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 'Cancel [processnum] <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 <DFn:>',$9b,'K',10
dc.b 'Flush,Devices,Currentdir,Files,Locks,Lastalert,More',$9b,'K',10
dc.b 'Taskports,Windows,Screens,Fonts,Windowfonts,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 256
fname ds.b 284
out ds.b 80
dummy ds.b 80
in ds.b 80
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
# End of shell archive
exit 0