[comp.sources.amiga] v89i052: xoper - system operations control v1.3, Part01/02

page@swan.ulowell.edu (Bob Page) (03/16/89)

Submitted-by: G35@DHDURZ1.BITNET (Guenther Werner)
Posting-number: Volume 89, Issue 52
Archive-name: kernel/xoper13.1

Changes in V1.3:

New commands: [S]=Stack usage, Sort, Hide, Hidden, Header, Window,
              InputHandler.
Added       : Support of startup-scripts, I/O Interrupts/second,
              'Kill' an alias for 'Cancel'.

Some BIG bugs have been removed: The port-display used to GURU if more
than 32 Ports did exist. The Cli Xoper has been started did act like
having a priority of 128. Unlock didn't unlock sometimes, the
interrupt/priority field did contain rubbish, Currentdir didn't
examine all Processes.  There were some more minor bugs, all
(hopefully) removed.

[I had to split Xoper.asm into two files: Xoper.asm1 and Xoper.asm2.
Use AmigaDOS 'join' or UNIX 'cat' (or something similar) to combine
them back into Xoper.asm.  ..Bob]

#	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.asm1
# This archive created: Wed Mar 15 12:40:03 1989
cat << \SHAR_EOF > Xoper.asm1
******************************************
*                                        *
* Xoper 1.3 Copyright (C) Werner Gunther *
*                                        *
******************************************
*    Written for the A68K Assembler      *
*   (Fish 110) by Charlie Gibbs and      *
*          Brian R. Anderson             *
*                                        *
*  Do not use Smallcode/Smalldata when   *
*             linking                    *
******************************************

;DEBUG SET 1
            XREF    _LVOSwitch
            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.
start       moveq   #3,d0
            lea     dummyinput,a1
getparm     move.b  (a0)+,(a1)+
            dbf     d0,getparm
            move.b  #10,in
            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     xopcon,a1
            CALL    FindPort,sysbase
            tst.l   d0
            bne     oops
       ENDC
            tst.l   wbmsg
            beq.s   fromdos
            jmp     mainprg

fromdos:

starttask:

        IFND DEBUG
            cmp.w   #'-b',dummyinput
            bne.s   stt1
            CALL    Output,dosbase
            move.l  d0,-(a7)
            move.l  #windowname,d2
            move.l  d0,d1
            moveq.l #34,d3
            CALL    Write,dosbase
            move.l  #cr,d2
            move.l  (a7)+,d1
            moveq.l #1,d3
            CALL    Write,dosbase
stt1        lea     start(PC),a1
            move.l  -4(a1),d3
            move.l  d3,myseg
            clr.l   -4(a1)
            CALL    Forbid,sysbase
            move.l  #newname,d1
            clr.l   d2
            move.l  #3500,d4
            CALL    CreateProc,dosbase
            CALL    Permit,sysbase
            clr.l   d0
            rts
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     xopcon
            LIBCALL CreatePort
            lea     8(a7),a7
            move.l  d0,replyport
;install a counter to determine the amount of CPU-time each
;Task uses.
            move.l  _SysBase(PC),a1
            move.l  #_LVOSwitch,a0
            move.l  2(a1,a0),oldswitch
            move.l  #myswitch,d0
            CALL    SetFunction,_SysBase(PC)
;install a counter for PORT-Interrupts
            lea     IOCounter(PC),a1
            move.l  #3,d0
            CALL    AddIntServer,_SysBase(PC)
;Attempt to open a startup script
            move.l  mytask(PC),a4
            move.l  #-1,184(a4)
            move.l  #startupname,d1
            move.l  #1005,d2
            CALL    Open,dosbase(PC)
            clr.l   184(a4)
            move.l  d0,infile
            beq.s   nostartup
            clr.b   morefl
            move.b  #1,fromfile
            bra     cli
endstartup  move.b  morefl2(PC),morefl
            clr.b   fromfile
            move.l  infile(PC),d1
            CALL    Close,dosbase(PC)

nostartup   tst.l   wbmsg
            bne.s   noin
            cmp.b   #10,dummyinput
            beq.s   noin
            cmp.w   #'-b',dummyinput
            beq.s   noin
            move.l  dummyinput,in
            move.b  #10,in+4
            bra.s   nostartup2
noin        cmp.b   #10,in
            beq.s   default
            tst.b   in
            bne.s   nostartup2

default     move.w  #$740a,in


nostartup2  cmp.w   #'-b',dummyinput
            beq     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     binarea(PC),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,binarea
            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
            move.l  d0,infile
            beq     exitall
            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
            tst.b   d0
            beq     nomore
            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 'timeout' seconds for a kepress

nomore      tst.b   fromfile
            bne.s   cli
            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         tst.b   fromfile
            beq.s   cl3
            tst.b   eof
            bne     endstartup
cl3         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
            cmpi.b  #';',0(a0)
            beq     nomore
            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     nm1
foundcmd    cmpi.b  #'*',d3
            beq.s   okcmd
            cmpi.b  #' ',d3
            bne.s   nocmd
okcmd       move.l  a0,-(a7)
            bsr     raw
            move.l  (a7)+,a0
            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
            bsr     raw
            move.l  #10,d3
            move.l  fileptr,d1
            move.l  #waittxt,d2
            CALL    Write,dosbase(PC)
            bsr     readline
            bsr     con
            move.l  #1,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
            bra     stack
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
            bra     capture
            bra     clrcold
            bra     clrcool
            bra     clrwarm
            bra     snoop
            bra     usage
            bra     inphand
            bra     nohead
            bra     sort
            bra     hide
            bra     hidden
            bra     setwindow
            bra     cancel

;------ Task-Structures-----

showaddr    clr.b   tasktyp
            bra.s   startask
showtask    move.b  #1,tasktyp
startask    tst.b   headon
            beq     noheader1
            move.l  #infoh1,d0
            bsr     putstr
            move.l  _SysBase(PC),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       bsr     putstr
            move.l  _SysBase(PC),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

noheader1   move.l  _SysBase(PC),a6
            move.w  #$4000,$dff09a
            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  d0,d1
            sub.l   d3,d1
            move.l  d1,maxdisp
            move.l  d3,-(a7)
            movem.l d0-d3,-(a7)
            bsr     getaskdat
            move.l  a5,savedat
            movem.l (a7)+,d0-d3
            sub.l   d3,d0
            neg.l   d3
            tst.b   headon
            beq.s   noheader2
            bsr     prcent
            bsr     newline
            move.l  #infoh2,d0
            bsr     putstr
noheader2   move.l  (a7)+,d0
            neg.l   d0
            move.l  d0,dispatches
            tst.b   headon
            beq     noheader3
            clr.l   d3
            bsr     longdec

            move.l  #20,d1
            bsr     tab
            move.l  #infoh7,d0
            bsr     putstr
            lea     secs(PC),a0
            lea     mics(PC),a1
            CALL    CurrentTime,intuibase(PC)
            move.l  secs(PC),d3
            lsl.l   #1,d3
            move.l  d3,d1
            lsl.l   #2,d3
            add.l   d1,d3
            move.l  mics(PC),d0
            move.l  #100000,d1
            bsr     div
            add.l   d0,d3
            move.l  time10(PC),d1
            move.l  d3,time10
            sub.l   d1,d3
            move.l  iocount(PC),d0
            clr.l   iocount
            mulu    #100,d0
            move.l  d3,d1
            bsr     div
            divu    #10,d0
            move.l  d0,d1
            swap    d1
            move    d0,d3
            bsr     bytedec
            lea     out,a0
            move.b  #'.',-1(a0,d0)
            or.b    #'0',d1
            move    d1,d0
            bsr     putchar

            bsr     newline
            bsr     newline
noheader3   lea     theader(PC),a0
            tst.b   tasktyp
            bne.s   phedder
            lea     t2header(PC),a0
phedder     bsr     puthead
            move.l  savedat(PC),a5

pt1         tst.b   entries
            beq     pt2
            lea     -16(a5),a5
            bsr     hideit
            tst     d0
            beq     ptend
            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

            move.l  dispatches(PC),d0
            tst.b   usageflag
            beq.s   pt37
            move.l  maxdisp(PC),d0
pt37        move.l  12(a5),d3
            bsr     prcent

            clr.b   d3
            cmpi.b  #13,8(a5)
            bne.s   noproc
            tst.l   172(a4)
            beq.s   noproc
            move.l  140(a4),d3
            bsr     bytedec
            bra.s   pt4
noproc      move.l  #nix,d0
            bsr     putstr
pt4         move.l  4(a5),d0
            bsr     putnam
ptend       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)
            clr.l   12(a5)
            lea     cputime,a0
            move.l  tasksnum(PC),d1
            beq.s   pua1
pua3        cmp.l   0(a0),a4
            beq.s   pua2
            lea     8(a0),a0
            dbf     d1,pua3
            bra.s   pua1
pua2        move.l  4(a0),12(a5)
pua1        lea     16(a5),a5
            addq.b  #1,entries
            rts

gettype     and.l   #$f,d0
            mulu    #11,d0
            add.l   #type,d0
            bra     putstr

getaskdat   lea     buffer,a5
            clr.b   entries
            lea     stplist(PC),a4
            bsr     putlist
            move.l  _SysBase(PC),a4
            lea     420(a4),a4
            bsr     putlist
            move.l  _SysBase(PC),a4
            lea     406(a4),a4
            bsr     putlist
            move.l  _SysBase(PC),a4
            move.l  276(a4),a4
            bsr     putdata
            clr.l   tasksnum
            move.w  #-$4000,$dff09a
            tst.b   sorton
            beq.s   sort5
            lea     buffer,a3
            lea     -32(a5),a2
sort1       lea     16(a3),a4
sort2       move.l  0(a3),d1
            cmp.l   0(a4),d1
            bge.s   sort3
            moveq   #15,d1
sort4       move.b  0(a4,d1),d0
            move.b  0(a3,d1),0(a4,d1)
            move.b  d0,0(a3,d1)
            dbf     d1,sort4
sort3       lea     16(a4),a4
            cmp.l   a2,a4
            ble.s   sort2
            lea     16(a3),a3
            cmp.l   a2,a3
            bne.s   sort1
sort5       rts

prcent      lsl.l   #1,d3
            move.l  d3,d1
            lsl.l   #2,d3
            add.l   d1,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
            divu    #10,d0
            move    d0,d3
            swap    d0
            move    d0,d1
            bsr     bytedec
            lea     out,a0
            move.b  #'.',-1(a0,d0)
            or.b    #'0',d1
            move    d1,d0
            bsr     putchar
            move.l  #infoh4,d0
            bra     putstr

hideit      tst.b   hideon
            bne.s   pt73
pt75        moveq   #1,d0
            rts
pt73        lea     hidestart(PC),a4
            move.l  4(a5),a0
pt74        tst.l   0(a4)
            beq.s   pt75
            move.l  0(a4),a4
            lea     4(a4),a1
            bsr     strcmp
            tst     d0
            beq     hideend
            bra.s   pt74
hideend     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
newline     move.l  #nxtline,d0
            bra     putstr

*-------- Task-Stack ------------

stack       lea     stackhead(pc),a0
            bsr     puthead
            bsr     getaskdat
sta1        tst.b   entries
            beq     sta8
            lea     -16(a5),a5
            bsr     hideit
            tst     d0
            beq     sta9
            move.l  0(a5),a1
            cmp.b   #13,8(a1)
            bne.s   sta6
            move.l  172(a1),d0
            beq.s   sta6
            lsl.l   #2,d0
            move.l  d0,a0
            tst.l   60(a0)
            beq.s   sta6
            moveq   #1,d3
            move.l  52(a0),d4
            lsl.l   #2,d4
            move.l  176(a1),d0
            sub.l   d4,d0
            bsr     hexa
            move.l  d4,d0
            bsr     longdec
            move.l  176(a1),d0
            sub.l   54(a1),d0
            bra.s   sta7

sta6        move.l  58(a1),d0
            bsr     hexa
            moveq   #1,d3
            move.l  62(a1),d0
            sub.l   58(a1),d0
            bsr     longdec
            move.l  62(a1),d0
            sub.l   54(a1),d0
sta7        bsr     longdec
            move.l  4(a5),d0
            bsr     putnam
sta9        subq.b  #1,entries
            bra     sta1
sta8        rts

*--------- 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),d3
            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
            lea     392(a4),a4
            lea     buffer,a5
            clr.l   d5
            CALL    Forbid,_SysBase(PC)
            move.w  #$4000,$dff09a
sp2         move.l  0(a4),a4
            tst.l   0(a4)
            beq.s   sp20
            bsr     getpdata
            bra.s   sp2
sp20        tst.b   tports
            bne.s   sp15
            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   sp15
            lea     92(a2),a4
            cmp.b   #13,8(a2)
            bne.s   sp12
            bsr     getpdata
            bra     sp12
sp15        move.w  #-$4000,$dff09a
            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),d3
            bsr     bytedec
            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
            cmp.b   #255,d0
            bne.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      tst.b   fromfile
            bne     ul6
            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
ul6         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   of4
            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

            bsr     newline
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       bsr     newline
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
            bsr     finddev
            bne.s   ldr1
ldr2        move.l  #buffer,d0
            bsr     putstr
            move.l  #nomount,d0
            bsr     putstr
            move.l  #dishelp,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     16(a5),a5
            bra.s   cd2
cd6         bsr     freefinfo
            rts

;Change the current directory setting of a process

cd          tst.b   fromfile
            bne     cd10
            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

inphand     tst.b   background
            bne.s   inph1
            bsr     installh
inph1       move.l  #500,d4
            lea     InInterrupt(PC),a0
inph2       tst.l   4(a0)
            beq.s   inph3
            move.l  4(a0),a0
            dbf     d4,inph2
inph3       tst.b   background
            bne.s   inph4
            movem.l d4/a0,-(a7)
            bsr     removeh
            movem.l (a7)+,d4/a0
inph4       cmp.w   #-1,d4
            bne.s   inph5
            move.l  #failed,d0
            bra     putnam
inph5       move.l  a0,-(a7)
            lea     inheader(PC),a0
            bsr     puthead
            move.l  (a7)+,a5
inph6       move.l  0(a5),a5
            tst.l   0(a5)
            beq.s   inph7
            move.l  a5,d0
            bsr     hexa
            move.l  14(a5),d0
            bsr     hexa
            move.l  18(a5),d0
            bsr     hexa
            move.b  9(a5),d3
            bsr     plusmins
            move.l  10(a5),d0
            bne.s   inph8
            move.l  #longnix,d0
inph8       bsr     putnam
            bra.s   inph6
inph7       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
csin        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
cwin        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

windowoff   movem.l d1-d7/a0-a6,-(a7)
            bsr     getscr2
            bsr     cwin
            move.l  -(a2),a0
            move.l  a0,d4
            tst.l   4(a0)
            bne.s   woff1
            bsr     getscr2
            bsr     csin
woff1       movem.l (a7)+,d1-d7/a0-a6
            rts

closetskwin movem.l d1-d7/a0-a6,-(a7)
ctw0        bsr     getscr2
            lea     buffer+100,a2
ctw1        move.l  (a2)+,a4
            move.l  4(a4),a4
ctw6        cmpa.l  #0,a4
            beq.s   ctw4
            move.l  86(a4),a0
            move.l  16(a0),d1
            cmp.l   d0,d1
            bne.s   ctw7
            move.l  d0,d1
            move.l  a4,d0
            bsr     windowoff
            move.l  d1,d0
            bra     ctw0
ctw7        move.l  0(a4),a4
            bra.s   ctw6
ctw4        dbf     d5,ctw1
            movem.l (a7)+,d1-d7/a0-a6
            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.s   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).
;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.


cancel      tst.b   fromfile
            beq.s   cancel1
            rts
cancel1     clr.l   remembr         ;used for CLI stdio
            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          ;d0=task
            cmp.b   #1,8(a1)       ;TASK ?
            bne.s   isproc
            CALL    RemTask,_SysBase(PC)
            rts
isproc      movem.l d0-d7/a0-a6,-(a7)
            move.l  #-1,d0            ;needed for recursive killing tasks
            CALL    AllocSignal,_SysBase(PC)
            clr.l   d1
            bset    d0,d1
            move.l  d1,cancelbit
            move.l  d0,cancelbnum
            movem.l (a7)+,d0-d7/a0-a6

            clr.l   d5
            tst.l   $ac(a1)         ;pr_CLI
            beq.s   wascreproc
            move.l  $80(a1),a2      ;Seglist
            adda.l  a2,a2
            adda.l  a2,a2
            move.l  12(a2),d1       ;empty ?
            bne.s   wascreproc
            move.l  $ac(a1),a2      ;CommandLineInterface
            adda.l  a2,a2
            adda.l  a2,a2
            move.l  60(a2),d5       ;cli_Module
            tst.l   40(a2)          ;IsInteractive
            beq     dosreturn
            move.l  28(a2),remembr  ;yes,get Cli-Window locks
            move.l  56(a2),remembr2
            bra     dosreturn
wascreproc  tst.b   bool            ;it is not a CLI, ask what to do
            bne.s   unload
            move.b  #3,bool
            move.l  #canerr0,d0     ;ask for Workbench
            bsr     putstr
            bsr     readline
            ori.b   #$20,dummy
            cmp.b   #'y',dummy
            beq.s   andagain
            move.b  #2,bool
            move.l  #canerr1,d0    ;ask for unload
            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      ;test if the task still there

unload      move.l  128(a1),d4 ;get Segmentlist
            beq.s   unl3
            lsl.l   #2,d4
            move.l  d4,a3
            move.l  12(a3),d4
unl3        tst.l   d4
            bne.s   unl4
            move.l  #unloaderr,d0 ;no Segments !?
            bra     putnam

unl4        cmp.b   #3,bool            ;Workbench Task
            bne.s   unl2
            move.l  a1,-(a7)
            move.l  #40,d0             ;build a copy of the
            move.l  #$10000,d1         ;Worbench startup-message
            CALL    AllocMem,_SysBase(PC)
            move.l  d0,startmess
            move.l  (a7)+,a1
            move.l  d0,a0
            move.b  #5,8(a0)
            move.w  #20,18(a0)
            move.l  d4,24(a0)
            move.l  a1,d0
            add.l   #92,d0
            move.l  d0,20(a0)
            movem.l a0-a1,-(a7)
            lea     wbname(PC),a1
            CALL    FindPort,_SysBase(PC)
            movem.l (a7)+,a0-a1
            move.l  d0,14(a0)

unl2        cmp.b   #1,bool
            bne.s   dosreturn
            move.l  a1,-(a7)           ;unload process manualy
            move.l  d4,d1
            CALL    UnLoadSeg,dosbase(PC)
            move.l  (a7)+,a1

dosreturn   move.l  140(a1),savedat ;Processnumber
dosret1     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)        ;if waiting
            bne.s   doswait
            move.l  a1,d4
            CALL    Remove,_SysBase(PC)
            move.l  d4,a1
            lea     406(a6),a0       ; activate the task
            CALL    AddHead,_SysBase(PC)
            move.l  d4,a1
doswait     move.w  #-$4000,$dff09a
            tst.b   bool
            bne.s   endnodos
            tst.l   d5
            beq     endcanc
            move.l  $ac(a1),a2
            adda.l  a2,a2
            adda.l  a2,a2
dwa1        movem.l d0-d7/a0-a6,-(a7)
            move.l  cancelbit(PC),d0
            CALL    Wait,_SysBase(PC)
            movem.l (a7)+,d0-d7/a0-a6
            clr.l   d5
            bra     dosret1

endcanc     move.l  a1,-(a7)
            move.l  remembr(PC),d1    ;close CLI-Window
            beq.s   ecan1             ;if any
            CALL    Close,dosbase(PC)
ecan1       move.l  remembr2(PC),d1
            beq.s   ecan2
            CALL    Close,dosbase(PC)
ecan2       move.l  (a7)+,a1

            move.l  savedat(PC),d0   ;remove Task from
            move.l  dosbase(PC),a2   ;TaskArray
            move.l  34(a2),a2
            move.l  0(a2),a2
            adda.l  a2,a2
            adda.l  a2,a2
            lsl.l   #2,d0
            clr.l   0(a2,d0)

endnodos    move.l  a1,d0
            bsr     closetskwin
            move.l  cancelbnum(PC),d0      ;remove our Signal
            CALL    FreeSignal,_SysBase(PC)
            rts

;This Code is (hopefully) excuted by the Process we want
;to kill

endtask     CALL    Forbid,_SysBase(PC)
            CALL    Disable,_SysBase(PC)
            move.l  _SysBase(PC),a1
            move.l  276(a1),a1
            move.l  176(a1),a1          ;Process_ReturnAddr
            lea     -4(a1),a7           ;reset Process Stackptr
            tst.b   bool
            bne.s   et0
            movea.l mytask(PC),a1
            move.l  cancelbit(PC),d0    ;signal Xoper it
            CALL    Signal,_SysBase(PC) ;died
et0         cmp.b   #3,bool             ;Workbench Process ?
            bne.s   et1
            move.l  startmess(PC),a1
            CALL    ReplyMsg,_SysBase(PC) ;reply startup message
et1         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
            move.l  18(a5),d0
            and.l   26(a5),d0
            beq.s   wa2
            movea.l a5,a1
            CALL    Signal,_SysBase(PC)
wa2         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
SHAR_EOF
#	End of shell archive
exit 0
-- 
Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
Have five nice days.