[comp.sources.amiga] Xoper

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 0

ain@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 0

ain@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