[comp.sources.amiga] v90i038: Xoper 2.2 - display and control system activity, Part03/04

Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (02/01/90)

Submitted-by: Werner Guenther <G35%DHDURZ1.BITNET@CUNYVM.CUNY.EDU>
Posting-number: Volume 90, Issue 038
Archive-name: kernel/xoper-2.2/part03

#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 3 (of 4)."
# Contents:  Xoper.a.ab
# Wrapped by tadguy@xanth on Wed Jan 31 22:31:35 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Xoper.a.ab' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Xoper.a.ab'\"
else
echo shar: Extracting \"'Xoper.a.ab'\" \(53365 characters\)
sed "s/^X//" >'Xoper.a.ab' <<'END_OF_FILE'
Xsignal	    bsr     readhex
X	    tst.b   d7
X	    beq     syntax
Xsetthem     move.l  d0,savedat
X	    bsr     nodenam
X	    moveq.l #2,d7
X	    lea     TReNode(PC),a4
X	    bsr     findnam
X	    tst.b   d7
X	    beq.s   pi1
X	    move.l  d0,a1
X	    move.l  savedat,d0
X	    and.l   18(a1),d0
X	    CALL    Signal,_SysBase(PC)
X	    rts
X
X;set up a list of tasknames which should't be displayed
X
Xhide	    cmp.b   #10,0(a0)
X	    bne.s   hid5
X	    bra     syntax
Xhid5	    lea     hidestart(PC),a2
X	    move.l  a2,d3
Xhid0	    tst.l   0(a2)
X	    beq.s   hid1
X	    move.l  0(a2),a2
X	    lea     4(a2),a1
X	    bsr     strcmp
X	    tst     d0
X	    beq.s   hid2
X	    move.l  a2,d3
X	    bra.s   hid0
Xhid1	    move.l  a0,a4
X	    bsr     strlen2
X	    addq    #5,d0
X	    move.l  #65536,d1
X	    CALL    AllocMem,_SysBase(PC)
X	    tst.l   d0
X	    beq.s   hid4
X	    move.l  d0,a1
X	    move.l  d0,0(a2)
X	    addq    #4,a1
Xhid3	    cmp.b   #10,0(a4)
X	    beq.s   hid4
X	    move.b  (a4)+,(a1)+
X	    bra.s   hid3
Xhid4	    rts
Xhid2	    move.l  d3,a3
X	    move.l  0(a2),0(a3)
Xfreehidden  lea     4(a2),a0
X	    bsr     strlen
X	    addq    #5,d0
X	    move.l  a2,a1
X	    CALL    FreeMem,_SysBase(PC)
X	    rts
X
Xfreehidmem  move.l  hidestart(PC),a4
Xfhm0	    move.l  a4,d0
X	    beq.s   fhm1
X	    move.l  a4,a2
X	    move.l  0(a2),a4
X	    bsr     freehidden
X	    bra     fhm0
Xfhm1	    rts
X
X;set up an ALIAS list
Xalias	    cmp.b   #10,0(a0)
X	    beq     showalias
X	    bsr     strbuf
X	    move.l  a0,a5
X	    lea     buffer,a0
X	    bsr     strlen
X	    tst.l   d0
X	    beq     syntax
X
X	    moveq   #1,d1
X	    cmp     d1,d0
X	    bne.s   5$
X	    lea     params(PC),a0
X	    moveq   #parmnum-1,d1
X	    move.b  buffer,d2
X6$	    cmp.b   (a0)+,d2
X	    dbeq    d1,6$
X	    tst.w   d1
X	    bmi.s   5$
X	    move.l  #aliaserr,d0
X	    bsr     putstr
X	    move.l  #params,d0
X	    bsr     putstr
X	    move.l  #aliaserr2,d0
X	    bra     putnam
X
X5$	    move.l  d0,d5
X	    move.l  a5,a0
X	    adda.l  d0,a0
X	    bsr     kllblnks
X	    move.l  a5,-(a7)
X	    bsr     findcmd
X	    move.l  (a7)+,a5
X	    tst.l   d2
X	    bmi     syntax
X	    move.l  a5,a0
X	    bsr     strbuf
X
X	    addq    #6,d5
X	    move.l  d5,d0
X	    move.l  #65536,d1
X	    CALL    AllocMem,_SysBase(PC)
X	    tst.l   d0
X	    beq.s   1$
X
X	    move.l  aliaslist(PC),d1
X	    bne.s   2$
X	    move.l  d0,aliaslist
X	    bra.s   3$
X2$	    move.l  d1,a0
X	    move.l  0(a0),d1
X	    bne.s   2$
X	    move.l  d0,0(a0)
X
X3$	    move.l  d0,a0
X	    move.b  d2,4(a0)
X
X	    lea     5(a0),a0
X	    lea     buffer,a1
X4$	    move.b  (a1)+,(a0)+
X	    bne.s   4$
X1$	    rts
X
Xshowalias   lea     alhead(PC),a0
X	    bsr     puthead
X	    move.l  aliaslist(PC),d0
X	    beq.s   1$
X2$	    move.l  d0,a5
X	    addq    #5,d0
X	    bsr     putstr
X	    move.w  #15,d1
X	    bsr     tab
X	    move.l  #equal,d0
X	    bsr     putstr
X	    move.b  4(a5),d0
X	    ext.w   d0
X	    bsr     getcmdptr
X	    bsr     putnam
X	    move.l  0(a5),d0
X	    bne.s   2$
X1$	    rts
X
Xfreealias   move.l  aliaslist(PC),a4
X1$	    move.l  a4,d0
X	    beq.s   2$
X	    move.l  a4,a2
X	    move.l  0(a2),a4
X	    lea     5(a2),a0
X	    bsr     strlen
X	    addq    #6,d0
X	    move.l  a2,a1
X	    CALL    FreeMem,_SysBase(PC)
X	    bra     1$
X2$	    rts
X
Xgetcmdptr   move.l  a0,-(a7)
X	    lea     commds(PC),a0
X2$	    tst     d0
X	    beq.s   1$
X3$	    tst.b   (a0)+
X	    bne.s   3$
X	    subq    #1,d0
X	    bra.s   2$
X1$	    move.l  a0,d0
X	    move.l  (a7)+,a0
X	    rts
X
X
X;'flushlibs'
Xflush	    move.l  #$ffffff,d0
X	    moveq   #0,d1
X	    CALL    AllocMem,_SysBase(PC)
Xflsh1	    rts
X
X;display library->lib_IDString
Xinfo	    bsr     nodenam2
X	    moveq.l #2,d7
X	    lea     DevNode(PC),a4
X	    bsr     findnam
X	    tst.b   d7
X	    beq.s   flsh1
X	    move.l  d0,a0
X	    move.l  24(a0),d0
X	    beq.s   if1
X	    move.l  d0,d1
X	    andi.l  #1,d1
X	    bne.s   if1
X	    bra     putnam
Xif1	    move.l  #noinfo,d0
X	    bsr     putstr
X	    move.l  a5,d0
X	    bra     putnam
X
Xcapture     move.l  _SysBase(PC),a1
X	    lea     42(a1),a0
X	    moveq   #2,d6
X	    lea     coldtxt,a4
Xcap0	    move.l  a4,d0
X	    bsr     putstr
X	    move.l  0(a0),d0
X	    bne.s   cap1
X	    move.l  #unset,d0
X	    bsr     putstr
X	    bra     cap2
Xcap1	    bsr     hexa
Xcap2	    bsr     newline
X	    lea     15(a4),a4
X	    addq    #4,a0
X	    dbf     d6,cap0
X
X	    move.l  #kicktxt,d0
X	    bsr     putstr
X	    move.l  546(a1),a0
X	    cmpa.l  #0,a0
X	    bne.s   kickm3
X	    move.l  #unset,d0
X	    bra     putnam
Xkickm3	    move.l  a0,-(a7)
X	    bsr     newline
X	    lea     kickhead(PC),a0
X	    bsr     puthead
X	    move.l  (a7)+,a0
Xkickm0	    move.l  a0,d0
X	    beq     kickm4
X	    bpl.s   kickm1
X	    bclr    #31,d0
X	    move.l  d0,a0
X	    bra.s   kickm0
Xkickm1	    move.w  14(a0),d6
X	    subq    #1,d6
X	    lea     16(a0),a2
Xkickm2	    move.l  0(a2),d0
X	    bsr     hexa
X	    move.l  0(a2),d0
X	    move.l  4(a2),d4
X	    add.l   d4,d0
X	    bsr     hexa
X	    move.l  d4,d0
X	    clr.b   d3
X	    bsr     longdec
X	    bsr     newline
X	    addq    #8,a2
X	    dbf     d6,kickm2
X	    move.l  0(a0),a0
X	    bra     kickm0
Xkickm4	    rts
X
Xclrcold     move.l  _SysBase,a0
X	    clr.l   42(a0)
X	    bra.s   chksum
Xclrcool     move.l  _SysBase,a0
X	    clr.l   46(a0)
X	    bra.s   chksum
Xclrwarm     move.l  _SysBase,a0
X	    clr.l   50(a0)
X
Xchksum	    lea     34(a0),a1
X	    move    #22,d0
Xaddchk	    add     (a1)+,d1
X	    dbf     d0,addchk
X	    not     d1
X	    move.w  d1,82(a0)
X	    rts
X
X;Save the command line to be repeated. If this line doesn't produce
X;any output, don't repeat it at all
Xrepeatcmd   tst.w   repeat
X	    bne.s   2$
X	    move.w  repeatlen(PC),d0
X	    subq    #7,d0
X	    move.w  d0,repeatlen
X	    lea     repeatbuffer,a1
X	    lea     dummy,a2
X	    move.w  d0,d1
X	    ext.l   d1
X1$	    move.b  0(a0),(a1)+
X	    move.b  (a0)+,(a2)+
X	    dbf     d1,1$
X
X	    clr.l   lastprinted
X	    clr.b   printed
X	    move.w  #1,repeat
X	    bsr     cli
X	    tst.b   printed
X	    beq.s   2$
X	    bsr     starttimer
X	    rts
X2$	    clr.w   repeat
X	    rts
X
X;save the parameters from a 'window x y width height' call
Xsetwindow   tst.b   fromfile
X	    bne.s   wiw1
Xwiw3	    move.l  #wiwerr,d0
X	    bra     putnam
Xwiw1	    lea     window_l(PC),a3
X	    moveq   #3,d5
Xwiw0	    bsr     getnum
X	    tst     d7
X	    beq.s   wiw2
X	    move.w  d2,0(a3)
X	    addq    #2,a3
X	    dbf     d5,wiw0
Xwiw2	    rts
X
X;display ExecBase->LastAlert
Xlastalert   movem.l $100,d1-d2
X	    tst.l   d1
X	    bne.s   al1
X	    move.l  _SysBase(PC),a0
X	    movem.l 514(a0),d1-d2
Xal1	    move.l  #gurutxt,d0
X	    bsr     putstr
X	    move.l  d1,d0
X	    bsr     hexa
X	    lea     out,a0
X	    move.l  ptr(PC),d0
X	    move.b  #'.',-1(a0,d0)
X	    move.l  d2,d0
X	    bsr     hexa
X	    bra     newline
X
X;toggle CLI-Commands
Xclicmd	    bchg    #0,cmdcli
X	    rts
X
X;toggle CPUSE task list
Xusage	    bchg    #0,usageflag
X	    rts
X
X;toggle task-header display on/off
Xnohead	    bchg    #0,headon
X	    rts
X
X;toggle hide entries on/off
Xhidden	    bchg    #0,hideon
X	    rts
X
X;toggle sort on/off
Xsort	   bchg    #0,sorton
X	   rts
X
X;toggle task-ports display on/off
Xtaskports   bchg    #0,tports
Xclo1	    rts
X
X;Open a library
Xopenlib     bsr     nodenam2
X	    move.l  a5,a1
X	    moveq   #0,d0
X	    CALL    OpenLibrary,_SysBase(PC)
X	    tst.l   d0
X	    beq     fn5
Xopli1	    rts
X
X
X;close it
Xcloselib    bsr     nodenam2
X	    moveq   #0,d7
X	    lea     LibNode(PC),a4
X	    bsr     findnam
X	    tst.b   d7
X	    beq.s   clo1
X	    move.l  d0,a1
X	    CALL    CloseLibrary,_SysBase(PC)
X	    rts
X
Xremnode     bsr     nodenam2
X	    moveq   #7,d7
X	    lea     TReNode(PC),a4
X	    bsr     findnam
X	    tst.b   d7
X	    beq.s   1$
X	    CALL    Disable,_SysBase(PC)
X	    move.l  d0,a1
X	    CALL    Remove,_SysBase(PC)
X	    CALL    Enable,_SysBase(PC)
X1$	    rts
X
X;end Xoper but stay in background
Xquithold    lea     in,a0
X	    lea     dummy,a1
Xqh1	    move.b  (a1)+,d0
X	    move.b  d0,(a0)+
X	    cmp.b   #10,d0
X	    bne.s   qh1
X
Xinstback    tst.b   background
X	    bne.s   cleanit
X	    move.b  #1,background
X	    bsr     installh
Xcleanit     move.l  infile(PC),d1
X	    beq.s   ib1
X	    CALL    Close,dosbase(PC)
X	    clr.l   infile
X	    clr.b   fromfile
Xib1	    clr.b   running
X	    bsr     killpage
X	    bsr     freeblank
X	    tst.l   wnptr
X	    beq.s   5$
X	    tst.b   ownscreen
X	    bne.s   6$
X	    move.l  wnptr(PC),a0
X	    move.l  4(a0),window_l
X	    move.l  8(a0),window_w
X6$	    move.l  wnptr(PC),a0
X	    CALL    CloseWindow,intuibase(PC)
X	    clr.l   intuimsg
X	    clr.l   wnptr
X5$	    move.l  screenptr(PC),d0
X	    beq.s   4$
X	    move.l  d0,a0
X	    CALL    CloseScreen,intuibase(PC)
X	    clr.l   screenptr
X
X	    move.l  realstack(PC),a7
X
X4$	    tst.b   iconifyon
X	    beq.s   1$
X	    jsr     iconify
X	    bra.s   2$
X
X1$	    move.l  mysignal(PC),d0
X	    or.l    trapsignal(PC),d0
X	    CALL    Wait,_SysBase(PC)
X2$	    move.b  #1,running
X	    and.l   trapsignal(PC),d0
X	    beq.s   3$
X	    move.b  #1,gotguru
X3$	    bra     restart
X
X;fill all unused memory-chunks with a longword
Xclear	    moveq   #0,d0
X	    cmp.b   #10,0(a0)
X	    beq.s   clr5
X	    bsr     readhex
X	    tst.b   d7
X	    beq     syntax
Xclr5	    move.l  _SysBase(PC),a0
X	    clr.l   parmtxt
X	    lea     322(a0),a0
X	    move.w  #$4000,$dff09a
Xclr1	    move.l  0(a0),a0
X	    tst.l   0(a0)
X	    beq.s   clr6
X	    move.l  16(a0),a1
Xclr2	    tst.l   0(a1)
X	    beq.s   clr1
X	    addq.l  #1,parmtxt
X	    move.l  4(a1),d1
X	    subq.l  #8,d1
X	    ble.s   clr31
X	    lsr.l   #2,d1
X	    subq.l  #1,d1
X	    bmi.s   clr31
X	    lea     8(a1),a2
Xclr3	    move.l  d0,(a2)+
X	    dbf     d1,clr3
Xclr31	    move.l  0(a1),a1
X	    bra.s   clr2
Xclr6	    move.w  #-$4000,$dff09a
X	    move.l  parmtxt(PC),d0
X	    bsr     longdec
X	    move.l  #clrtxt,d0
X	    bra     putnam
X
X;change the number of maximum lines in the history buffer
Xhistorylines
X	    bsr     getnum
X	    tst.b   d7
X	    beq     syntax
X	    move.w  d2,maxhlines
X	    move.w  hnum(PC),d0
X1$	    cmp.w   maxhlines(PC),d0
X	    ble.s   2$
X	    bsr     remhistline
X	    subq    #1,d0
X	    bra.s   1$
X2$	    move.l  history+8,curhist
X	    move.w  d0,hnum
X	    rts
X;set the minimum number of characters a input line
X;must have to be added to the history buffer
Xhistorylength
X	    bsr     getnum
X	    tst.b   d7
X	    beq     syntax
X	    tst.b   d2
X	    bne.s   1$
X	    addq    #1,d2
X1$	    move.w  d2,minnumchars
X	    rts
X;display all lines in the history buffer
Xshowhistory move.l  history(PC),a5
X	    moveq   #1,d5
X1$	    tst.l   0(a5)
X	    beq.s   2$
X	    move.l  d5,d3
X	    bsr     bytedec
X	    move.w  8(a5),d0
X	    ext.l   d0
X	    lea     10(a5),a0
X	    lea     inputbuffer,a1
X	    CALL    CopyMem,_SysBase(PC)
X	    move.w  8(a5),d0
X	    lea     inputbuffer,a1
X	    clr.b   0(a1,d0.w)
X	    move.l  a1,d0
X	    bsr     putnam
X	    addq    #1,d5
X	    move.l  0(a5),a5
X	    bra.s   1$
X2$	    rts
X
X;set the maximum lines the output buffer may hold
Xoutputlines bsr     getnum
X	    tst.b   d7
X	    beq     syntax
X	    moveq   #100,d3
X	    tst.l   d2
X	    bmi.s   2$
X	    cmp.l   d3,d2
X	    bge.s   1$
X2$	    move.l  d3,d2
X1$	    move.l  d2,maxlines
X	    rts
X
X;find a named node
X;d7 = number of lists to search through
X;a4 = pointer to the first entry in the
X;     list-offset-table
X;a5 = pointer to name
X;returns:
X;d7 = TRUE/FALSE 1/0
X;d0 = node
X
Xfindnam     tst.b   0(a5)
X	    bne.s   1$
X	    move.l  #nameerr,d0
X	    bsr     putnam
X	    bra     fnerr
X1$	    cmp.b   #'$',0(a5)
X	    bne.s   fn2
X	    move.l  d7,d2
X	    move.l  a5,a0
X	    bsr     readhex
X	    tst.b   d7
X	    beq.s   fn6
X	    move.l  d2,d7
X	    bsr     tstnode
X	    tst.l   d5
X	    bne.s   fn3
X	    bra     fn5
Xfn6	    move.l  d2,d7
Xfn2	    move.l  _SysBase(PC),a0
X	    adda.l  0(a4),a0
X	    move.l  a5,a1
Xfn4	    CALL    FindName,_SysBase(PC)
X	    tst.l   d0
X	    bne.s   fn1
X	    addq    #4,a4
X	    dbf     d7,fn2
Xfn5	    move.l  #namerr,d0
X	    bsr     putstr
X	    move.l  a5,d0
X	    bsr     putnam
Xfnerr	    clr.b   d7
X	    rts
Xfn1	    move.b  procnum(PC),d2
X	    beq.s   fn3
X	    move.l  d0,a0
X	    cmp.b   143(a0),d2
X	    bne.s   fn4
Xfn3	    moveq.l #1,d7
X	    rts
X
X;list-offset-table
XTRuNode     dc.l    276
XTReNode     dc.l    406
XTWaNode     dc.l    420
XDevNode     dc.l    350
XLibNode     dc.l    378
XResNode     dc.l    336
XMemNode     dc.l    322
XPorNode     dc.l    392
XSemNode     dc.l    532
X
X;Node has been entered in hex. Check if this node exsists
Xtstnode     tst.b   fromfile
X	    bne.s   illegalhex
X	    move.l  d0,d1
X	    btst    #0,d1
X	    beq.s   inrange
X	    move.l  #adrerr,d0
X	    bsr     putnam
Xillegalhex  moveq   #0,d5
X	    rts
Xinrange     movem.l d7/a4,-(a7)
X	    cmp.l   #TRuNode,a4
X	    bne.s   inrange1
X	    move.l  _SysBase(PC),a0
X	    cmp.l   276(a0),d0
X	    beq.s   nodefound
X	    subq    #1,d7
X	    addq    #4,a4
Xinrange1    move.w  #$4000,$dff09a
Xgetlist     move.l  _SysBase(PC),a0
X	    add.l   0(a4),a0
Xnxtnode     tst.l   0(a0)
X	    beq.s   nxtlist
X	    cmp.l   a0,d0
X	    beq.s   nodefound
X	    move.l  0(a0),a0
X	    bra.s   nxtnode
Xnxtlist     addq    #4,a4
X	    dbf     d7,getlist
X	    move.w  #-$4000,$dff09a
X	    movem.l d0/d7/a4,-(a7)
X	    bsr     ResumeOutput
X	    move.l  #noderr,d0
X	    bsr     putnam
X	    bsr     readline
X	    movem.l (a7)+,d0/d7/a4
X	    cmp.b   #'y',inputbuffer
X	    beq.s   nodefound1
X	    moveq   #0,d5
X	    movem.l (a7)+,d7/a4
X	    rts
Xnodefound   move.w  #-$4000,$dff09a
Xnodefound1  move.b  #1,d5
Xetst	    movem.l (a7)+,d7/a0
X	    rts
X
X;allocate FileInfoBlock
Xallocfinfo  move.l  #260,d0
X	    moveq   #0,d1
X	    CALL    AllocMem,_SysBase(PC)
X	    move.l  d0,finfoptr
X	    rts
X
X;free FileInfoBlock
Xfreefinfo   move.l  #260,d0
X	    move.l  finfoptr(PC),d1
X	    beq.s   1$
X	    move.l  d1,a1
X	    CALL    FreeMem,_SysBase(PC)
X1$	    rts
X
X;Examine ,d0=Lock
Xgetfinfo    move.l  d0,d1
X	    move.l  finfoptr,d2
X	    CALL    Examine,dosbase(PC)
X	    rts
X
X;construct a Pathname from a lock
X;d0=Lock ,resulting string is written to window
Xgetpath     movem.l d1-d7/a0-a6,-(a7)
X	    move.l  d0,d1
X	    beq.s   1$
X	    CALL    DupLock,dosbase(PC)
X1$	    lea     out,a4
X	    clr.b   -(a4)
Xgp0	    move.l  d0,-(a7)
X	    bsr     getfinfo
X	    move.l  finfoptr,a0
X	    move.l  4(a0),d4
X	    addq    #8,a0
X	    bsr     strlen
X	    lea     -1(a4),a5
X	    tst.l   d4
X	    bmi.s   nodir
X	    move.b  #'/',-(a4)
Xnodir	    subq    #1,d0
X	    bmi.s   nofnam
Xgp1	    move.b  0(a0,d0),-(a4)
X	    dbf     d0,gp1
Xnofnam	    move.l  0(a7),d1
X	    CALL    ParentDir,dosbase(PC)
X	    move.l  d0,d4
X	    move.l  (a7)+,d1
X	    beq.s   2$
X	    CALL    UnLock,dosbase(PC)
X2$	    move.l  d4,d0
X	    bne     gp0
Xputall	    cmp.b   #'/',0(a5)
X	    bne.s   gp2
X	    move.b  #':',0(a5)
Xgp2	    move.l  a4,d0
X	    bsr     putnam
X	    movem.l (a7)+,d1-d7/a0-a6
X	    rts
Xstrlen	    move.l  a0,-(a7)
X	    moveq   #-1,d0
Xstrl2	    addq.l  #1,d0
X	    tst.b   (a0)+
X	    bne.s   strl2
X	    move.l  (a7)+,a0
X	    rts
Xstrlen2     move.l  a0,-(a7)
X	    move.l  #-1,d0
Xstrl22	    addq.l  #1,d0
X	    cmp.b   #10,(a0)+
X	    bne.s   strl22
X	    move.l  (a7)+,a0
X	    rts
X
X;write a title and underline
X;a0 = pointer to text
Xputhead1    bsr     strlen
X	    move.l  d0,d5
X	    move.l  a0,d0
X	    bra     putstr
X
Xputhead2    bsr     strlen
X	    add.l   d0,d5
X	    bra.s   ph2
X
Xputhead     bsr     strlen
X	    move.l  d0,d5
Xph2	    move.l  a0,d0
X	    bsr     putnam
X	    lea     out,a0
X	    move.l  a0,d0
Xph1	    move.b  #'-',(a0)+
X	    dbf     d5,ph1
X	    move.b  #$0a,(a0)+
X	    clr.b   0(a0)
X	    bra     putstr
X
X;move cursor to a column
X;d0 = current position
X;d1 = column
Xtab	    move.l  a3,-(a7)
X	    lea     out,a3
Xsp5	    cmp.b   d1,d0
X	    bcc.s   sp4
X	    move.b  #' ',0(a3,d0)
X	    addq.b  #1,d0
X	    bra.s   sp5
Xsp4	    move.l  d1,ptr
X	    move.l  (a7)+,a3
X	    rts
X
X;convert ascii to byte
X;a0 = pointer to text
X;d0 = byte
Xgetnum	    cmp.b   #'$',0(a0)
X	    bne.s   isdec
X	    bsr     readhex
X	    move.l  d0,d2
X	    rts
Xisdec	    moveq   #0,d2
X	    move.l  d2,d3
X	    move.l  d2,d6
X	    move.l  d2,d7
X	    cmp.b   #'-',0(a0)
X	    bne.s   gn1
X	    addq    #1,a0
X	    moveq.l #1,d6
Xgn1	    move.b  (a0)+,d3
X	    cmp.b   #'9',d3
X	    bhi.s   gn2
X	    cmp.b   #'0',d3
X	    bcs.s   gn2
X	    moveq   #1,d7
X	    and.b   #$f,d3
X	    muls    #10,d2
X	    add.l   d3,d2
X	    bra.s   gn1
Xgn2	    tst.b   d6
X	    beq.s   gn3
X	    neg.l   d2
Xgn3	    tst.b   d7
X	    bne.s   gn4
X	    subq    #1,a0
Xgn4	    rts
X
Xgetfrac     bsr     isdec
X	    muls    #10,d2
X	    cmp.b   #'.',-1(a0)
X	    bne.s   1$
X	    moveq   #0,d0
X	    move.b  (a0)+,d1
X	    cmp.b   #10,d1
X	    beq.s   1$
X	    and.b   #15,d1
X	    add.l   d1,d2
X1$	    rts
X
X;convert hex to longword
X;a0 = pointer to text
X;returns d0=value
X;d7 = ok/error 1/0
Xreadhex     movem.l d1-d6/a1-a5,-(a7)
X	    moveq   #1,d7
X	    cmp.b   #'$',0(a0)
X	    bne.s   rh3
X	    addq    #1,a0
Xrh3	    moveq   #0,d0
X	    cmpi.b  #10,0(a0)
X	    beq.s   rherr
X	    lea     hextab(pc),a1
Xrh0	    move.b  (a0)+,d3
X	    moveq.l #15,d2
Xrh1	    cmp.b   0(a1,d2),d3
X	    beq.s   rh2
X	    dbf     d2,rh1
X	    bra     rhend
Xrh2	    lsl.l   #4,d0
X	    or.b    d2,d0
X	    bra.s   rh0
Xrhend	    tst.b   d3
X	    beq.s   rhok
X	    cmpi.b  #10,d3
X	    beq.s   rhok
X	    cmpi.b  #' ',d3
X	    beq.s   rhok
Xrherr	    moveq   #0,d7
Xrhok	    movem.l (a7)+,d1-d6/a1-a5
X	    rts
X
X;skip blanks
X;a0 pointer to text
X; returns a0 = new pointer position
Xkllblnks    cmpi.b  #' ',0(a0)
X	    bne.s   gn4
X	    addq    #1,a0
X	    bra.s   kllblnks
X
X; exit program. If background flag is set, wait for
X; amiga-amiga-x
X
Xstopall     addq    #4,a7
X	    bra     exitall
X
Xexit	    tst.b   background
X	    bne     quithold
Xexitall     bsr     killpage
X	    bsr     freeblank
X	    bsr     killhistory
X	    move.l  stplist(PC),a3
X	    tst.l   0(a3)
X	    beq.s   ex0
X	    move.l  a3,d0
X	    bsr     waok
X	    bra.s   exitall
X
Xex0	    tst.b   background
X	    beq.s   ex1
X	    bsr     removeh
X
Xex1	    move.l  _SysBase(PC),a1
X	    move.l  #_LVOSwitch,a0
X	    move.l  oldswitch,d0
X	    CALL    SetFunction,_SysBase(PC)
X	    moveq   #3,d0
X	    lea     IOCounter(PC),a1
X	    CALL    RemIntServer,_SysBase(PC)
X
X	    move.l  replyport(PC),-(a7)
X	    LIBCALL DeletePort
X	    addq    #4,a7
X	    bsr     stoptimer
X	    lea     timerio,a1
X	    CALL    CloseDevice,_SysBase(PC)
X	    move.l  timerport(PC),-(a7)
X	    LIBCALL DeletePort
X	    addq    #4,a7
X
X	    bsr     restoretrap
X
X	    tst.l   wnptr
X	    beq.s   5$
X	    move.l  wnptr(PC),a0
X	    CALL    CloseWindow,intuibase(PC)
X5$	    move.l  screenptr(PC),d0
X	    beq.s   6$
X	    move.l  d0,a0
X	    CALL    CloseScreen,intuibase(PC)
X	    clr.l   screenptr
X
X6$	    move.l  infile(PC),d1
X	    beq.s   ex11
X	    CALL    Close,dosbase(PC)
Xex11	    bsr     freehidmem
X	    bsr     freealias
X	    bsr     clrfkeys
X	    move.l  realstack(PC),a7
X	IFND DEBUG
X	    CALL    Forbid,_SysBase(PC)
X	    move.l  wbmsg(PC),d0
X	    beq.s   todos
X	    move.l  d0,a1
X	    CALL    ReplyMsg,_SysBase(PC)
X	    moveq   #0,d0
X	    rts
X
Xtodos	    move.l  mytask(PC),a0
X	    move.l  152(a0),d1
X	    CALL    UnLock,dosbase(PC)
X	    move.l  myseg(PC),d1
X	    CALL    UnLoadSeg,dosbase(PC)
X	ENDC
X	    moveq   #0,d0
X	    rts
X
X;print a bcpl-string
X;d0 = bcpl-pointer to bcpl-string
Xputbcpl     movem.l d3/a0-a1,-(a7)
X	    tst.l   d0
X	    beq.s   pb1
X	    lsl.l   #2,d0
X	    move.l  d0,a1
X	    moveq   #0,d3
X	    move.b  (a1)+,d3
X	    subq    #1,d3
X	    move.l  ptr(PC),d0
X	    lea     out,a0
Xpb2	    move.b  (a1)+,0(a0,d0)
X	    beq.s   1$
X	    addq.b  #1,d0
X	    dbf     d3,pb2
X1$	    move.l  d0,ptr
Xpb1	    movem.l (a7)+,d3/a0-a1
X	    rts
X
X;compare strings
X;a0/a1 = pointers to string
X;returns d0 = true(0) false(1), d1 = length
Xstrcmp	    movem.l a0-a1,-(a7)
X	    moveq   #0,d0
X	    move.l  d0,d1
Xsrc2	    move.b  (a0)+,d0
X	    beq.s   src1
X	    cmp.b   #10,d0
X	    beq.s   src1
X	    addq    #1,d1
X	    cmp.b   (a1)+,d0
X	    beq.s   src2
X	    bra.s   src3
Xsrc1	    move.b  0(a1),d0
Xsrc3	    movem.l (a7)+,a0-a1
X	    rts
X
Xstrbuf	    movem.l d0/a1-a2,-(a7)
X	    move.l  a0,a1
X	    lea     buffer,a2
X1$	    move.b  (a1)+,d0
X	    cmp.b   #10,d0
X	    beq.s   2$
X	    cmp.b   #' ',d0
X	    beq.s   2$
X	    or.b    #' ',d0
X	    beq.s   2$
X	    move.b  d0,(a2)+
X	    bra.s   1$
X2$	    clr.b   (a2)+
X	    movem.l (a7)+,d0/a1-a2
X	    rts
X
X;compare bcpl string with string
X;a0 = pointer to string
X;a2 = bcpl-pointer to bcpl-string
X;returns d0 = true(0) false(1)
Xstrbcmp     movem.l d1/a0/a2,-(a7)
X	    moveq   #0,d0
X	    moveq   #0,d1
X	    adda.l  a2,a2
X	    adda.l  a2,a2
X	    move.b  (a2)+,d1
X	    beq.s   stb1
X	    subq    #1,d1
Xstb2	    cmp.b   (a2)+,(a0)+
X	    bne.s   stb1
X	    dbf     d1,stb2
X	    moveq   #1,d0
Xstb1	    movem.l (a7)+,d1/a0/a2
X	    rts
X
X;add a fkey definition to the fkey list. Each entry
X;looks like this: long Succ, long Pred, byte Key#, byte length,
X;		  char text[]
X
Xsetfkey     bsr     nodenam
X	    move.b  procnum(PC),d5
X	    beq     syntax
X	    cmp.b   #21,d5
X	    bge     syntax
X	    subq    #1,d5
X	    move.b  d5,procnum
X	    lea     fkeys(PC),a1
X1$	    move.l  0(a1),a1
X	    tst.l   0(a1)
X	    beq.s   2$
X	    cmp.b   8(a1),d5
X	    bne.s   1$
X	    move.l  a1,d3
X	    CALL    Remove,_SysBase(PC)
X	    move.l  d3,a1
X	    bsr     removefkey
X2$	    tst.b   0(a5)
X	    beq.s   4$
X	    move.l  a5,a0
X	    bsr     strlen
X	    move.l  d0,d5
X	    add.w   #10,d0
X	    moveq   #0,d1
X	    CALL    AllocMem,_SysBase(PC)
X	    tst.l   d0
X	    beq.s   4$
X	    move.l  d0,a1
X	    move.l  d0,a4
X	    move.b  procnum(PC),8(a1)
X	    move.b  d5,9(a1)
X	    lea     fkeys(PC),a0
X	    CALL    AddHead,_SysBase(PC)
X	    lea     10(a4),a4
X	    subq    #1,d5
X3$	    move.b  (a5)+,(a4)+
X	    dbeq    d5,3$
X4$	    rts
X
Xclrfkeys    lea     fkeys(PC),a0
X	    CALL    RemHead,_SysBase(PC)
X	    tst.l   d0
X	    beq.s   1$
X	    move.l  d0,a1
X	    bsr     removefkey
X	    bra.s   clrfkeys
X1$	    rts
X
Xremovefkey  move.b  0(a1),d0
X	    ext.w   d0
X	    ext.l   d0
X	    add.w   #10,d0
X	    CALL    FreeMem,_SysBase(PC)
X	    rts
X
X;convert long to decimal
X;d0 = value
X;d3 bit 0 = left/right justified
X;d3 bit 1 = write/leave
X;returns string in 'buffer'
Xlongdec     movem.l d1-d2/a1-a2,-(a7)
X	    tst.l   d0
X	    bmi.s   2$
X	    cmp.l   #9999999,d0
X	    ble.s   1$
X2$	    move.l  #smallnix,d0
X	    bra.s   ld6
X1$	    lea     binarea+8(PC),a1
X	    move.l  #'    ',-8(a1)
X	    move.l  #'    ',-4(a1)
X	    clr.b   0(a1)
X	    subq    #1,a1
X	    cmp     #2,d3
X	    bne.s   ld5
X	    clr.b   0(a1)
Xld5	    moveq   #1,d2
Xld2	    addq    #1,d2
X	    moveq   #$a,d1
X	    bsr     div
X	    addi.l  #$30,d1
X	    move.b  d1,-(a1)
X	    tst.l   d0
X	    bne.s   ld2
X
X	    btst    #0,d3
X	    bne.s   ld1
X	    lea     binarea(PC),a2
X	    cmpa.l  a2,a1
X	    bne.s   ld3
X	    subq.l  #1,ptr
X	    bra.s   ld1
Xld3	    move.b  0(a1),(a2)+
X	    move.b  #' ',(a1)+
X	    dbf     d2,ld3
Xld1	    cmp     #2,d3
X	    beq.s   ld4
X	    move.l  #binarea,d0
Xld6	    bsr     putstr
Xld4	    movem.l (a7)+,d1-d2/a1-a2
X	    rts
X
X;write UBYTE
X;d3 = value
Xbytedec     bsr     dec
X	    move.l  #decimal,d0
X	    bra.s   pm1
X
X;write signed byte
X;d3 = value
Xplusmins    movem.l d5/a3,-(a7)
X	    move.w  #$2020,minus
X	    move.b  d3,d5
X	    bpl.s   2$
X	    neg.b   d3
X2$	    bsr.s   dec
X	    tst.b   d5
X	    bpl.s   1$
X	    move.l  d0,a3
X	    move.b  #'-',-(a3)
X1$	    movem.l (a7)+,d5/a3
X	    move.l  #minus+1,d0
Xpm1	    bra     putstr
X
Xdec	    movem.l d3/a3,-(a7)
X	    move.l  #$20202020,decimal
X	    and.l   #$ff,d3
X	    lea     decimal+3(PC),a3
Xbloop	    tst.b   d3
X	    beq.s   bend
X	    divu    #10,d3
X	    swap    d3
X	    ori.b   #'0',d3
X	    move.b  d3,-(a3)
X	    clr.w   d3
X	    swap    d3
X	    bra.s   bloop
Xbend	    cmpa.l  #decimal+3,a3
X	    bne     1$
X	    move.b  #'0',-(a3)
X1$	    move.l  a3,d0
X	    movem.l (a7)+,d3/a3
X	    rts
X
X;write a string, move cursor into next line
X;d0 = pointer to text
Xputnam	    bsr     putstr
Xputnam1     tst.b   d0
X	    beq.s   ncr
X	    bsr     newline
Xncr	    rts
X
X;write one char
X;d0 = char
Xputchar     movem.l d1/a0,-(a7)
X	    move.l  ptr(PC),d1
X	    lea     out,a0
X	    move.b  d0,0(a0,d1)
X	    addq.l  #1,ptr
X	    movem.l (a7)+,d1/a0
X	    rts
X
X;write a string, strings are only put into the output buffer when
X;a LF is detected
X;d0 = pointer to string
X;returns d0 = cursor position
Xputstr	    movem.l d1-d7/a0-a6,-(a7)
X	    move.b  #1,printed
X	    move.l  d0,a2
X	    lea     out,a3
X	    move.l  ptr(PC),d0
X	    move.l  a2,d5
X	    bne     pst1
X	    lea     longnix(PC),a2
X
Xpst1	    move.b  (a2)+,d1
X	    cmpi.b  #13,d1
X	    beq     pst1
X	    cmpi.b  #10,d1
X	    beq.s   lineend
X	    move.b  d1,0(a3,d0)
X	    beq     prend
X	    cmp     #100,d0
X	    bge.s   pst1
X	    addq    #1,d0
X	    bra.s   pst1
X
Xlineend     tst.b   fromfile
X	    beq.s   1$
X	    moveq   #0,d0
X	    bra     prend
X
X1$	    tst.l   lastprinted
X	    bne.s   2$
X	    bsr     killpage
X
X2$	    addq    #1,d0
X	    move.l  d0,-(a7)
X	    add     #14,d0
X	    moveq   #0,d1
X	    CALL    AllocMem,_SysBase(PC)
X	    move.l  (a7)+,d1
X	    tst.l   d0
X	    beq     prend
X	    move.l  d0,a0
X	    move.w  d1,12(a0)
X	    cmp.w   maxllength(PC),d1
X	    ble.s   7$
X	    move.w  d1,maxllength
X7$	    move.l  node,8(a0)
X	    clr.l   node
X	    clr.l   0(a0)
X
X	    move.l  lastprinted(PC),d0
X	    move.l  d0,4(a0)
X	    bne.s   3$
X	    move.l  a0,outchain
X	    bra.s   4$
X3$	    move.l  d0,a1
X	    move.l  a0,0(a1)
X4$	    move.l  a0,lastprinted
X	    move.b  #' ',14(a0)
X	    subq    #1,d1
X	    lea     15(a0),a0
X	    lea     out,a1
X	    subq    #1,d1
X	    bmi.s   6$
X5$	    move.b  (a1)+,(a0)+
X	    dbf     d1,5$
X6$	    move.l  numlines(PC),d2
X	    cmp.l   maxlines(PC),d2
X	    ble.s   8$
X
X	    move.l  outchain(PC),a1
X	    move.l  0(a1),a2
X	    move.l  a2,outchain
X	    clr.l   4(a2)
X	    move.w  12(a1),d0
X	    add.w   #14,d0
X	    ext.l   d0
X	    CALL    FreeMem,_SysBase(PC)
X	    bra.s   9$
X
X8$	    addq.l  #1,d2
X	    move.l  d2,numlines
X
X9$	    moveq   #0,d0
X	    move.l  d0,d5
X	    tst.b   addlines
X	    beq     pst1
X	    bsr     addline
X	    bra     pst1
Xprend	    move.l  d0,ptr
X	    movem.l (a7)+,d1-d7/a0-a6
X	    rts
X
X;Kill output buffer
Xkillpage    movem.l d0-d7/a0-a6,-(a7)
X	    tst.l   outchain
X	    beq.s   2$
X	    move.l  outchain(PC),a1
X	    bsr     killlines
X	    clr.l   outchain
X	    clr.l   lastprinted
X	    clr.l   numlines
X	    clr.w   maxllength
X2$	    movem.l (a7)+,d0-d7/a0-a6
X	    rts
X
X;kill the remainder of the output buffer
Xkilllines   move.l  0(a1),-(a7)
X	    move.w  12(a1),d0
X	    ext.l   d0
X	    add     #14,d0
X	    CALL    FreeMem,_SysBase(PC)
X	    move.l  (a7)+,a1
X	    move.l  a1,d7
X	    bne.s   killlines
X	    rts
X
Xfreeblank   move.l  blanks(PC),d0
X	    beq.s   1$
X	    move.l  d0,a1
X	    move.w  colms(PC),d0
X	    ext.l   d0
X	    CALL    FreeMem,_SysBase(PC)
X	    clr.l   blanks
X1$	    rts
X
X;write a portion of the output buffer to the screen
Xblastout    move.l  rastport(PC),a1
X	    moveq   #1,d0
X	    CALL    SetAPen,gfxbase(PC)
X	    move.l  rastport(PC),a1
X	    moveq   #1,d0
X	    CALL    SetDrMd,gfxbase(PC)
X	    moveq   #0,d7
X
X	    move.w  loffset(PC),d2
X	    beq.s   7$
X	    move.w  colms(PC),d4
X	    add.w   d4,d2
X	    move.w  maxllength(PC),d3
X	    cmp.w   d3,d2
X	    ble.s   7$
X	    move.w  d3,d2
X	    sub.w   d4,d2
X	    bpl.s   8$
X	    moveq   #0,d2
X8$	    move.w  d2,loffset
X
X7$	    bsr     tstfirstlin
X
X1$	    tst.l   outchain
X	    beq.s   3$
X	    bsr     findline
X
X2$	    move.w  colms(PC),d5
X	    ext.l   d5
X	    move.w  loffset(PC),d4
X	    ext.l   d4
X	    moveq   #18,d6
X6$	    lea     14(a5,d4),a0
X	    move.w  12(a5),d3
X	    ext.l   d3
X	    bsr     blastline
X	    bge.s   3$
X	    tst.l   0(a5)
X	    beq.s   5$
X	    move.l  0(a5),a5
X	    bra     6$
X5$	    moveq   #0,d3
X	    bsr     blastline
X	    bcs.s   5$
X3$	    rts
X
X;get a pointer to a line  (line # in d0)
Xfindline    move.l  outchain(PC),d1
X	    beq     2$
X	    move.l  d1,a5
X1$	    tst     d0
X	    beq.s   2$
X	    tst.l   0(a5)
X	    beq.s   2$
X	    move.l  0(a5),a5
X	    dbf     d0,1$
X2$	    rts
X
X;check if the display is as 'full' as possible
Xtstfirstlin move.l  firstline(PC),d0
X	    move.l  d0,d2
X	    add.w   rows(PC),d2
X	    cmp.l   numlines(PC),d2
X	    bmi.s   1$
X	    move.l  numlines(PC),d2
X	    sub.w   rows(PC),d2
X	    bpl.s   4$
X	    moveq   #0,d2
X4$	    move.l  d2,d0
X	    move.l  d2,firstline
X1$	    rts
X
X;display one line, fill the gap between the end of the line and
X;the end of the window with spaces.
X;d6 = ypos, d5=colms, d3= linelength, d7= line # in window, a0 = text
X
Xblastline   move    d6,d1
X	    moveq   #6,d0
X	    move.l  rastport(PC),a1
X	    CALL    Move,gfxbase(PC)
X	    sub.w   d4,d3
X	    bpl.s   7$
X	    moveq   #0,d3
X	    bra.s   6$
X7$	    cmp.w   d5,d3
X	    bmi.s   4$
X	    move.w  d5,d3
X4$	    move.l  d3,d0
X	    beq.s   6$
X	    move.l  rastport(PC),a1
X	    CALL    Text,gfxbase(PC)
X6$	    move.l  d5,d0
X	    sub.l   d3,d0
X	    ble.s   5$
X	    move.l  blanks(PC),a0
X	    move.l  rastport(PC),a1
X	    CALL    Text,gfxbase(PC)
X5$	    addq    #8,d6
X	    addq    #1,d7
X	    cmp.w   rows(PC),d7
X	    rts
X
X;Write pointer, display '-------' if empty
Xhexan	    tst.l   d0
X	    bne.s   hexa
X	    bra     putstr
X
X;Write 8 byte hex value
X;d0 = value
Xhexa	    bsr     gthex
X	    bra     putstr
X
Xgthex	    movem.l d1-d7/a0-a6,-(a7)
X	    moveq.l #7,d5
X	    lea     hexarea(PC),a1
X	    lea     hextab(PC),a0
X	    moveq   #0,d2
Xhexloop     move.b  d0,d2
X	    and.b   #15,d2
X	    move.b  0(a0,d2),0(a1,d5)
X	    lsr.l   #4,d0
X	    dbf     d5,hexloop
X	    move.l  a1,d0
X	    movem.l (a7)+,d1-d7/a0-a6
X	    rts
X
X;Convert/write byte into binary string
X;d0 = value
Xbin	    movem.l d1-d7/a0-a6,-(a7)
X	    lea     binarea(PC),a0
X	    move.w  #$2020,8(a0)
X	    moveq.l #7,d4
Xbinloop     moveq.l #'0'/2,d1
X	    roxr.b  #1,d0
X	    roxl.b  #1,d1
X	    move.b  d1,0(a0,d4)
X	    dbf     d4,binloop
X	    move.l  a0,d0
X	    movem.l (a7)+,d1-d7/a0-a6
X	    bra     putstr
X
X;send a packet
X;a0 = msgport
X;dp_Type and dp_Arg1 have to be inizialized
Xcons1	    movem.l d0-d7/a0-a6,-(a7)
X	    move.l  #dp_Link,LN_NAME
X	    move.l  #mypacket,dp_Link
X	    move.l  replyport(PC),dp_Port
X	    lea     mypacket,a1
X	    CALL    PutMsg,_SysBase(PC)
X	    move.l  replyport,a0
X	    CALL    WaitPort,_SysBase(PC)
X	    move.l  replyport(PC),a0
X	    CALL    GetMsg,_SysBase(PC)
X	    movem.l (a7)+,d0-d7/a0-a6
X	    rts
X
X;32-bit division
X;d0 / d1
X;returns d0
Xdiv	    movem.l d2-d3,-(a7)
X	    tst.l   d1
X	    beq     div8
X	    swap    d1
X	    move.w  d1,d2
X	    bne.s   div1
X	    swap    d0
X	    swap    d1
X	    swap    d2
X	    move.w  d0,d2
X	    beq.s   div2
X	    divu    d1,d2
X	    move.w  d2,d0
Xdiv2	    swap    d0
X	    move.w  d0,d2
X	    divu    d1,d2
X	    move.w  d2,d0
X	    swap    d2
X	    move.w  d2,d1
X	    bra     div8
Xdiv1	    moveq   #$10,d3
X	    cmpi.w  #$80,d1
X	    bcc.s   div3
X	    rol.l   #8,d1
X	    subq.w  #8,d3
Xdiv3	    cmpi.w  #$800,d1
X	    bcc.s   div4
X	    rol.l   #4,d1
X	    subq.w  #4,d3
Xdiv4	    cmpi.w  #$2000,d1
X	    bcc.s   div5
X	    rol.l   #2,d1
X	    subq.w  #2,d3
Xdiv5	    tst.w   d1
X	    bmi.s   div6
X	    rol.l   #1,d1
X	    subq.w  #1,d3
Xdiv6	    move.w  d0,d2
X	    lsr.l   d3,d0
X	    swap    d2
X	    clr.w   d2
X	    lsr.l   d3,d2
X	    swap    d3
X	    divu    d1,d0
X	    move.w  d0,d3
X	    move.w  d2,d0
X	    move.w  d3,d2
X	    swap    d1
X	    mulu    d1,d2
X	    sub.l   d2,d0
X	    bcc.s   div7
X	    subq.w  #1,d3
X	    add.l   d1,d0
Xdiv7	    moveq   #0,d1
X	    move.w  d3,d1
X	    swap    d3
X	    rol.l   d3,d0
X	    swap    d0
X	    exg     d1,d0
Xdiv8	    movem.l (a7)+,d2-d3
X	    rts
X
X;install a input-handler
Xinstallh    pea     0
X	    pea     xopsleep
X	    LIBCALL CreatePort
X	    addq    #8,a7
X	    move.l  d0,InputMsg
X	    move.l  d0,-(a7)
X	    LIBCALL CreateStdIO
X	    addq    #4,a7
X	    move.l  d0,InRequest
X	    move.l  d0,a1
X	    lea     devicenam(PC),a0
X	    moveq   #0,d0
X	    moveq   #0,d1
X	    CALL    OpenDevice,_SysBase(PC)
X	    move.l  d0,devstatus
X	    movea.l InRequest(PC),a1
X	    move.l  #InInterrupt,40(a1)
X	    move.w  #9,28(a1)
X	    CALL    DoIO,_SysBase(PC)
X	    move.l  d0,iostatus
X	    move.l  #-1,d0
X	    CALL    AllocSignal,_SysBase(PC)
X	    moveq   #0,d1
X	    bset    d0,d1
X	    move.l  d1,mysignal
X	    rts
X
X;remove handler
Xremoveh     movea.l InRequest(PC),a1
X	    move.l  #InInterrupt,40(a1)
X	    move.w  #10,28(a1)
X	    CALL    DoIO,_SysBase(PC)
X	    movea.l InRequest(PC),a1
X	    CALL    CloseDevice,_SysBase(PC)
X	    move.l  InRequest,-(a7)
X	    LIBCALL DeleteStdIO
X	    addq    #4,a7
X	    move.l  InputMsg,-(a7)
X	    LIBCALL DeletePort
X	    addq    #4,a7
X	    rts
X
X;this is the handler, it checks if amiga-amiga-x
X;has been pressed and signals it to our task
XKeyhandler  tst.b   running
X	    bne.s   endhandler
X	    cmp.b   #1,4(a0)
X	    bne.s   endhandler
X	    move.w  8(a0),d0
X	    andi.w  #$c0,d0
X	    cmpi.w  #$c0,d0
X	    bne.s   endhandler
X	    cmp.w   #$32,6(a0)
X	    bne.s   endhandler
Xwakeup	    move.l  a0,-(a7)
X	    movea.l mytask(PC),a1
X	    move.l  mysignal(PC),d0
X	    CALL    Signal,_SysBase(PC)
X	    move.l  (a7)+,a0
X	    clr.b   4(a0)
Xendhandler  move.l  a0,d0
X	    rts
X
Xsnoop	    bsr     cls
X	    bsr     nodenam
X	    moveq   #1,d7
X	    lea     TReNode(PC),a4
X	    bsr     findnam
X	    tst.b   d7
X	    bne.s   1$
X	    move.l  #stperr,d0
X	    bra     putnam
X1$	    move.l  d0,captask
X	    pea     0
X	    pea     memportname
X	    LIBCALL CreatePort
X	    addq    #8,a7
X	    move.l  d0,snoopport
X	    beq     tm6
X
X	    bsr     replyintui
X	    move.b  #1,addlines
X	    lea     snoophead(PC),a0
X	    bsr     puthead
X	    move.l  _SysBase(PC),a1
X	    move.l  -196(a1),oldalloc
X	    move.l  -208(a1),oldfree
X	    move.l  #capmalloc,d0
X	    move.l  #-198,a0
X	    CALL    SetFunction,_SysBase(PC)
X	    move.l  _SysBase(PC),a1
X	    move.l  #capmfree,d0
X	    move.l  #-210,a0
X	    CALL    SetFunction,_SysBase(PC)
X	    clr.b   bool
X	    clr.b   cbreak
X
Xwaitmem     move.l  snoopport(PC),a0
X	    moveq   #0,d1
X	    move.b  15(a0),d1
X	    bset    d1,d0
X	    move.l  d0,auxsig
X	    bsr     processmsgs
X
Xtm7	    move.l  mytask(PC),a0
X	    move.l  snoopport(PC),a0
X	    CALL    GetMsg,_SysBase(PC)
X	    tst.l   d0
X	    bne     tm8
X	    tst.b   cbreak
X	    bne     snoopend
X	    bra     waitmem
Xtm8	    move.l  d0,a3
X	    move.l  20(a3),d3
X	    btst    #31,d3
X	    beq     freed
X	    move.l  #allok,d0
X	    bsr     putstr
X	    lea     memname(PC),a2
X	    lea     membit(PC),a4
X	    moveq   #4,d5
Xtm2	    move.l  0(a4),d4
X	    btst    d4,d3
X	    beq.s   tm1
X	    move.l  0(a2),d0
X	    bsr     putstr
Xtm1	    addq    #4,a2
X	    addq    #4,a4
X	    dbf     d5,tm2
X	    moveq   #26,d1
X	    bsr     tab
X	    move.l  24(a3),d0
X	    move.l  d0,d3
X	    bsr     hexa
X	    move.l  28(a3),d0
X	    bne.s   tm3
X	    move.l  #failed,d0
X	    bsr     putstr
X	    moveq   #53,d1
X	    bsr     tab
X	    bra     tm4
Xtm3	    bsr     hexa
X	    move.l  28(a3),d0
X	    add.l   d3,d0
X	    bsr     hexa
X	    bra     tm4
X
Xfreed	    move.l  #free,d0
X	    bsr     putstr
X	    move.b  #'-',d0
X	    moveq   #18,d1
Xtm9	    bsr     putchar
X	    dbf     d1,tm9
X	    move.b  #' ',d0
X	    bsr     putchar
X	    move.l  d3,d0
X	    bsr     hexa
X	    move.l  24(a3),d0
X	    bsr     hexa
X	    move.l  24(a3),d0
X	    add.l   d3,d0
X	    bsr     hexa
X
Xtm4	    move.l  32(a3),d0
X	    bsr     hexa
X	    bsr     newline
X	    move.w  18(a3),d0
X	    ext.l   d0
X	    move.l  a3,a1
X	    CALL    FreeMem,_SysBase(PC)
X	    bra     tm7
X
Xsnoopend    move.l  _SysBase(PC),a1
X	    move.l  oldalloc(PC),d0
X	    move.l  #-198,a0
X	    CALL    SetFunction,_SysBase(PC)
X	    move.l  _SysBase(PC),a1
X	    move.l  oldfree,d0
X	    move.l  #-210,a0
X	    CALL    SetFunction,_SysBase(PC)
X	    move.l  snoopport,-(a7)
X	    LIBCALL DeletePort
X	    addq    #4,a7
X	    move.l  #stoped,d0
X	    bsr     putnam
X	    clr.b   addlines
X	    clr.l   auxsig
Xtm6	    rts
X
Xmemname     dc.l    memlarg,memclr,memfast,memchip,mempubl
Xmembit	    dc.l    17,16,2,1,0
X
Xcapmalloc   movem.l d0-d7/a0-a6,-(a7)
X	    move.l  _SysBase(PC),a6
X	    move.l  276(a6),d4
X	    cmp.l   captask(PC),d4
X	    bne.s   capm1
X	    tst.b   bool
X	    bne     capm1
X	    move.b  #1,bool
X	    moveq   #36,d6
X	    bsr     allocmsg
X	    beq     capm2
X	    bset    #31,d1
X	    move.l  d1,20(a5)
X	    move.l  d0,24(a5)
X	    move.l  60(a7),32(a5)
X	    move.l  a5,remembr
X	    movem.l (a7)+,d0-d7/a0-a6
X	    bsr     memalloc
X	    movem.l d0-d7/a0-a6,-(a7)
X	    move.l  remembr(PC),a1
X	    move.l  d0,28(a1)
X	    move.l  snoopport,a0
X	    move.b  #5,8(a1)
X	    CALL    PutMsg,_SysBase(PC)
X	    clr.b   bool
X	    movem.l (a7)+,d0-d7/a0-a6
X	    rts
Xcapm2	    clr.b   bool
Xcapm1	    movem.l (a7)+,d0-d7/a0-a6
Xmemalloc    dc.w    $4ef9
Xoldalloc    dc.l    0
X
Xcapmfree    movem.l d0-d7/a0-a6,-(a7)
X	    move.l  _SysBase(PC),a6
X	    move.l  276(a6),d4
X	    cmp.l   captask(PC),d4
X	    bne.s   capf1
X	    tst.b   bool
X	    bne.s   capf1
X	    move.b  #1,bool
X	    moveq   #36,d6
X	    bsr     allocmsg
X	    beq.s   capf2
X	    move.l  d0,20(a5)
X	    move.l  a1,24(a5)
X	    move.l  60(a7),32(a5)
X	    move.l  snoopport,a0
X	    move.b  #5,8(a5)
X	    move.l  a5,a1
X	    CALL    PutMsg,_SysBase(PC)
Xcapf2	    clr.b   bool
Xcapf1	    movem.l (a7)+,d0-d7/a0-a6
X	    dc.w    $4ef9
Xoldfree     dc.l    0
X
Xallocmsg    movem.l d0-d1/a0-a1,-(a7)
X	    move.l  d6,d0
X	    move.l  #65536,d1
X	    bsr     memalloc
X	    tst.l   d0
X	    beq.s   alm1
X	    move.l  d0,a5
X	    move.w  d6,18(a5)
Xalm1	    movem.l (a7)+,d0-d1/a0-a1
X	    move.l  a5,d6
X	    rts
X
Xmyswitch    movem.l d0-d1/a0-a1,-(a7)
X	    move.l  _SysBase(PC),a0
X	    move.l  276(a0),d0
X	    move.l  tasksnum(PC),d1
X	    lea     cputime,a0
X	    subq.l  #1,d1
X	    bmi.s   swadd
Xsw0	    cmp.l   (a0)+,d0
X	    dbeq    d1,sw0
X	    tst     d1
X	    bmi.s   swadd
Xswi1	    add.l   #1,508(a0)
Xswgo	    movem.l (a7)+,d0-d1/a0-a1
X	    dc.w    $4ef9
Xoldswitch   dc.l    0
Xswadd	    cmp.l   #125,tasksnum
X	    bge.s   swgo
X	    addq.l  #1,tasksnum
X	    move.l  d0,0(a0)
X	    move.l  #1,512(a0)
X	    bra.s   swgo
X
Xcountio     addq.l #1,iocount
X	    moveq  #0,d0
Xcio1	    rts
X
Xiconbackdrp tst.b   iconifyon
X	    beq.s   1$
X	    lea     icnwindow,a0
X	    eor.l   #$100,14(a0)    ;wn_Flags
X1$	    rts
X
Xiconifyoff  tst.b   iconifyon
X	    beq.s   cio1
X	    clr.b   iconifyon
X	    tst.b   fromfile
X	    bne.s   1$
X	    move.l  wnptr(PC),d0
X	    beq.s   1$
X	    move.l  d0,a0
X	    lea     iconifgad,a1
X	    CALL    RemoveGadget,intuibase(PC)
X	    move.l  wnptr(PC),a0
X	    CALL    RefreshWindowFrame,intuibase(PC)
X1$	    move.l  #iconify,d0
X
Xkillseg     movem.l d1-d2/a0-a4,-(a7)
X	    subq    #4,d0
X	    move.l  4,a6
X	    move.l  276(a6),a4
X	    move.l  128(a4),d1
X	    lsl.l   #2,d1
X	    move.l  d1,a3
X	    move.l  12(a3),d1
X	    bne.s   2$
X	    move.l  172(a4),d1
X	    lsl.l   #2,d1
X	    move.l  d1,a4
X	    move.l  60(a4),d1
X
X2$	    lsl.l   #2,d1
X	    cmp.l   d0,d1
X	    beq.s   4$
X	    move.l  d1,a4
X	    move.l  0(a4),d1
X	    beq.s   5$
X	    bra.s   2$
X
X4$	    move.l  d1,a0
X	    move.l  0(a0),0(a4)
X	    clr.l   0(a0)
X	    lsr.l   #2,d1
X	    CALL    UnLoadSeg,dosbase(PC)
X	    movem.l (a7)+,d1-d2/a0-a4
X5$	    rts
X
Xalert	    bsr     stoptimer
X	    move.l  excpttask(PC),d0
X	    bne.s   alert1
X	    move.l  #noguru,d0
X	    bra     putnam
Xalert1	    move.l  #softfail,d0
X	    bsr     putstr
X	    move.l  excpttask(PC),a0
X	    move.l  10(a0),d0
X	    bsr     putnam
X	    cmp.l   #3,excpterror
X	    bne.s   1$
X	    move.l  #addrserr,d0
X	    bsr     putstr
X	    move.l  excptaddr(PC),d0
X	    bsr     hexa
X	    bsr     newline
X1$	    move.l  #procount,d0
X	    bsr     putstr
X	    move.l  excptpc(PC),d0
X	    bsr     hexa
X	    bsr     newline
X	    move.l  #gurutxt,d0
X	    bsr     putstr
X	    move.l  excpterror(PC),d0
X	    bsr     hexa
X	    lea     out,a0
X	    move.l  ptr(PC),d0
X	    move.b  #'.',-1(a0,d0)
X	    move.l  excpttask(PC),d0
X	    bsr     hexa
X	    bra     newline
X
Xshowguru    bsr     alert
X	    tst.b   ownscreen
X	    bne.s   5$
X	    move.l  wnptr(PC),a0
X	    CALL    WindowToFront,intuibase(PC)
X	    bra.s   2$
X5$	    move.l  screenptr,a0
X	    CALL    ScreenToFront,intuibase(PC)
X2$	    move.l  #whatnow,d0
X	    bsr     putnam
X	    clr.l   oldpageend
X	    bsr     readline
X
X	    cmp.b   #'i',inputbuffer
X	    beq.s   4$
X1$	    cmp.b   #'k',inputbuffer
X	    bne.s   2$
X	    move.l  excpttask(PC),a1
X	    tst.l   22(a1)
X	    bne.s   3$
X	    CALL    RemTask,_SysBase(PC)
X	    bra.s   4$
X3$	    move.l  a1,d0
X	    bsr     canok
X4$	    clr.l   lastprinted
X	    rts
X
Xmyaddtask   move.l  a3,-(a7)
X	    lea     mytrap(PC),a3
X	    move.l  50(a1),d0
X	    beq.s   1$
X	    cmp.l   oldtrap(PC),d0
X	    beq.s   1$
X	    lea     myproctrap(PC),a3
X	    cmp.l   oldproctrap(PC),d0
X	    bne.s   2$
X1$	    move.l  a3,50(a1)
X2$	    move.l  (a7)+,a3
X	    dc.w    $4ef9
XOldAddTask  dc.l    0
X
Xmyproctrap  bsr     traphandle
X	    dc.w    $4ef9
Xoldproctrap dc.l    0
X
Xmytrap	    bsr     traphandle
X	    moveq   #0,d0
X	    CALL    Wait,_SysBase(PC)
X	    dc.w    $4ef9
Xoldtrap     dc.l    0
X
Xtraphandle  movem.l d0-d7/a0-a6,$180
X	    move.l  4,a6
X	    move.l  276(a6),excpttask
X	    move.l  4(a7),d0
X	    cmp.l   #9,d0
X	    beq.s   2$
X	    move.l  d0,excpterror
X	    moveq   #10,d1
X	    cmp.l   #3,d0
X	    bne.s   1$
X	    move.l  0(a7,d1.w),excptaddr
X	    moveq   #18,d1
X1$	    move.l  0(a7,d1.w),excptpc
X	    move.l  mytask(PC),a1
X	    move.l  trapsignal(PC),d0
X	    jsr     _LVOSignal(a6)
X2$	    movem.l $180,d0-d7/a0-a6
X	    rts
X
Xtrapguru    tst.b   wanttraps
X	    bne     restoretrap
X	    move.b  #1,wanttraps
X
Xaddtraps    tst.b   wanttraps
X	    beq     5$
X	    move.l  304(a6),oldtrap         ;Original EXEC trap handler
X	    moveq   #-1,d0
X	    CALL    AllocSignal,_SysBase(PC)
X	    moveq   #0,d1
X	    bset    d0,d1
X	    move.l  d1,trapsignal
X	    move.l  #_LVOAddTask,a0	    ;need a new AddTask() to change
X	    move.l  2(a6,a0),OldAddTask     ;AmigaDos's default trap handler
X	    move.l  a6,a1
X	    move.l  #myaddtask,d0
X	    CALL    SetFunction,_SysBase(PC)
X	    CALL    Forbid,_SysBase(PC)     ;change the trap handler of
X	    moveq   #0,d5		    ;aleady running tasks
X	    bsr     getaskdat		    ;get task stucture pointers
X1$	    tst.b   entries
X	    beq.s   2$
X	    lea     -16(a5),a5
X	    move.l  0(a5),a4                ;pointer to a task structure
X	    lea     myproctrap(PC),a0
X	    move.l  50(a4),d0               ;Task->tc_TrapCode
X	    cmp.l   oldproctrap(PC),d0      ;AmigaDos Handler ?
X	    beq.s   3$
X	    lea     mytrap(PC),a0           ;EXEC Handler ?
X	    cmp.l   oldtrap(PC),d0
X	    bne.s   4$			    ;must be a custom one, skip it
X3$	    move.l  a0,50(a4)               ;replace it
X4$	    subq.b  #1,entries
X	    bra.s   1$
X2$	    CALL    Permit,_SysBase(PC)
X5$	    rts
X
Xrestoretrap tst.b   wanttraps
X	    beq.s   6$
X	    tst.b   fromfile
X	    bne.s   5$
X	    move.l  #_LVOAddTask,a0
X	    move.l  OldAddTask(PC),d0
X	    move.l  _SysBase(PC),a1
X	    CALL    SetFunction,_SysBase(PC)
X	    CALL    Forbid,_SysBase(PC)
X	    bsr     getaskdat
X1$	    tst.b   entries
X	    beq.s   2$
X	    lea     -16(a5),a5
X	    move.l  0(a5),a4
X	    move.l  oldproctrap(PC),a0
X	    move.l  50(a4),d0
X	    cmp.l   #myproctrap,d0
X	    beq.s   3$
X	    move.l  oldtrap(PC),a0
X	    cmp.l   #mytrap,d0
X	    bne.s   4$
X3$	    move.l  a0,50(a4)
X4$	    subq.b  #1,entries
X	    bra.s   1$
X2$	    CALL    Permit,_SysBase(PC)
X	    clr.l   trapsignal
X5$	    clr.b   wanttraps
X6$	    rts
X
X;save the contents of the output buffer
X;to a file
Xsaveoutput  bsr     nodenam2
X	    tst.b   0(a5)
X	    beq     syntax
X	    move.l  a5,d1
X	    move.l  #1006,d2
X	    CALL    Open,dosbase(PC)
X	    move.l  d0,d5
X	    bne.s   1$
X	    move.l  #openerr,d0
X	    bsr     putstr
X	    move.l  a5,d0
X	    bra     putnam
X1$	    move.l  outchain(PC),d0
X	    beq.s   3$
X2$	    move.l  d0,a5
X	    move.w  12(a5),d3
X	    beq.s   4$
X	    ext.l   d3
X	    lea     14(a5),a1
X	    move.l  a1,d2
X	    move.l  d5,d1
X	    CALL    Write,dosbase(PC)
X	    tst.l   d0
X	    ble.s   3$
X4$	    moveq   #1,d3
X	    move.l  d5,d1
X	    move.l  #cr,d2
X	    CALL    Write,dosbase(PC)
X	    tst.l   d0
X	    ble.s   3$
X	    move.l  0(a5),d0
X	    bne.s   2$
X3$	    move.l  d5,d1
X	    CALL    Close,dosbase(PC)
X	    rts
X
Xgrabtimerio lea     tiohead(PC),a0
X	    bsr     puthead
X	    move.b  timeout(PC),d4
X	    move.b  #255,timeout
X	    bsr     starttimer
X	    move.b  d4,timeout
X	    lea     timerio,a1
X	    CALL    Disable,_SysBase(PC)
X2$	    move.l  0(a1),d2
X	    beq.s   1$
X	    move.l  d2,a1
X	    bra.s   2$
X1$	    CALL    Enable,_SysBase(PC)
X	    lea     -4(a1),a5
X	    bsr     stoptimer
X	    lea     buffer,a4
X	    moveq   #1,d4
X	    bsr     gettrq
X
X	    lea     timerio,a0
X	    lea     dummy,a1
X	    moveq   #40,d0
X	    CALL    CopyMem,_SysBase(PC)
X
X	    lea     dummy,a1
X	    lea     timernam(PC),a0
X	    moveq   #0,d1
X	    moveq   #0,d0
X	    CALL    OpenDevice,_SysBase(PC)
X
X	    lea     dummy,a1
X	    move.l  #1<<30,32(a1)
X	    CALL    SendIO,_SysBase(PC)
X
X	    lea     dummy,a5
X	    CALL    Disable,_SysBase(PC)
X8$	    move.l  0(a5),d2
X	    beq.s   7$
X	    move.l  d2,a5
X	    bra.s   8$
X7$	    CALL    Enable,_SysBase(PC)
X	    lea     -4(a5),a5
X
X	    lea     dummy,a1
X	    CALL    AbortIO,_SysBase(PC)
X	    lea     timerio,a1
X	    CALL    WaitIO,_SysBase(PC)
X	    move.w  timersig,d0
X	    moveq   #0,d1
X	    bset    d0,d1
X	    moveq   #0,d0
X	    CALL    SetSignal,_SysBase(PC)
X
X	    moveq   #0,d4
X	    bsr     gettrq
X
X	    lea     dummy,a1
X	    CALL    CloseDevice,_SysBase(PC)
X
X	    clr.l   (a4)+
X	    lea     -22(a4),a2
X	    moveq   #18,d2
X	    bsr     sortlist
X
X	    lea     buffer,a5
X5$	    move.l  (a5)+,d0
X	    beq.s   6$
X	    bsr     hexa
X	    move.w  (a5)+,d0
X	    ext.l   d0
X	    mulu    #9,d0
X	    add.l   #timerunits,d0
X	    bsr     putstr
X	    move.l  (a5)+,d3
X	    mulu    #10,d3
X	    move.l  (a5)+,d0
X	    move.l  #100000,d1
X	    bsr     div
X	    add.l   d3,d0
X	    cmp.l   #2559,d0
X	    ble.s   9$
X	    move.l  #whatsthis,d0
X	    bsr     putstr
X	    bra.s   10$
X9$	    moveq   #1,d6
X	    bsr     putfrac
X10$	    move.b  #' ',d0
X	    bsr     putchar
X	    move.l  (a5)+,d0
X	    bsr     getaskname2
X	    bsr     newline
X	    bra.s   5$
X6$	    rts
X
Xgettrq	    CALL    Disable,_SysBase(PC)
X3$	    move.l  0(a5),a5
X	    tst.l   0(a5)
X	    beq.s   4$
X	    move.l  a5,(a4)+
X	    move.w  d4,(a4)+
X	    move.l  32(a5),(a4)+
X	    move.l  36(a5),(a4)+
X	    move.l  14(a5),a1
X	    move.l  16(a1),(a4)+
X	    bra.s   3$
X4$	    CALL    Enable,_SysBase(PC)
X	    rts
X
X
X;check if the timer is runnig, start it if not
Xstarttimer  lea     timerio,a1
X	    cmp.b   #5,8(a1)
X	    beq.s   1$
X	    moveq   #0,d0
X	    move.b  timeout(PC),d0
X	    bne.s   2$
X	    tst.l   timeoutm
X	    beq.s   1$
X2$	    move.l  d0,32(a1)
X	    move.l  timeoutm(PC),36(a1)
X	    move.w  #9,28(a1)
X	    CALL    SendIO,_SysBase(PC)
X1$	    rts
X;Abort a timer request, if pending
Xstoptimer   lea     timerio,a1
X	    cmp.b   #5,8(a1)
X	    bne.s   1$
X	    CALL    AbortIO,_SysBase(PC)
X	    lea     timerio,a1
X	    CALL    WaitIO,_SysBase(PC)
X1$	    move.w  timersig,d0
X	    moveq   #0,d1
X	    bset    d0,d1
X	    moveq   #0,d0
X	    CALL    SetSignal,_SysBase(PC)
X	    rts
X;Xoper main loop, process all incoming messages
Xprocessmsgs move.l  wnptr(PC),a0
X	    moveq   #0,d0
X	    move.w  intuisig(PC),d1
X	    bset    d1,d0
X	    move.w  timersig(PC),d1
X	    bset    d1,d0
X	    or.w    #4096,d0
X	    or.l    auxsig(PC),d0
X	    tst.l   auxsig
X	    bne.s   1$
X	    or.l    trapsignal(PC),d0
X1$	    CALL    Wait,_SysBase(PC)
X
X	    move.l  d0,tasksigs
X
X	    move.l  trapsignal(PC),d1
X	    and.l   d0,d1
X	    beq.s   ctrl_c
X	    tst.b   gotguru
X	    bne.s   ctrl_c
X	    move.b  #1,gotguru
X	    bsr     showguru
X	    clr.b   gotguru
X
Xctrl_c	    moveq   #12,d1
X	    bsr     testsig
X	    bne     exit
X
X
Xtimermsg    move.w  timersig(PC),d1
X	    bsr     testsig
X	    beq     intuimsgs
X	    tst.w   repeat
X	    bne.s   1$
X	    bsr     showwhat
X	    bra.s   intuimsgs
X1$	    move.w  repeatlen,d0
X	    lea     repeatbuffer,a2
X	    lea     dummy,a1
X	    move.w  d0,d1
X2$	    move.b  (a2)+,(a1)+
X	    dbf     d1,2$
X	    bsr     cli
X	    bsr     starttimer
X
Xintuimsgs   move.w  intuisig(PC),d1
X	    bsr     testsig
X	    beq     processnxtmsg
Xnextimsg    move.l  wnptr(PC),a0
X	    move.l  $56(a0),a0
X	    CALL    GetMsg,_SysBase(PC)
X	    tst.l   d0
X	    beq     processnxtmsg
X	    move.l  d0,intuimsg
X
X	    move.l  d0,a0
X	    move.l  20(a0),d0
X
X	    cmp.l   #$200,d0		;CloseWindow
X	    bne.s   1$
X	    tst.b   addlines
X	    beq     exitall
X	    move.b  #1,cbreak
X	    bra     intuiend
X
X1$	    cmp.l   #2,d0		;ResizeWindow
X	    bne.s   2$
X	    bsr     setupscreen
X	    bra     intuiend
X
X2$	    cmp.l   #4,d0		;refresh
X	    bne.s   22$
X	    bsr     putiline
X	    bsr     blastout
X	    bsr     UpdateIArea
X	    bra     intuiend
X
X22$	    tst.b   addlines
X	    bne     3$
X	    cmp.l   #$40,d0		;gadgetup
X	    bne.s   3$
X	    tst.w   getanswer
X	    bne.s   3$
X	    bsr     replyintui
X	    bsr     stoptimer
X	    bra     instback
X
X3$	    cmp.l   #$400,d0		;RawKey
X	    bne     notarawkey
X	    move.w  #$80,d0
X	    and.w   24(a0),d0
X	    bne     intuiend
X	    and.w   #$7f,24(a0)
X	    lea     ievent,a1
X	    move.b  #1,4(a1)
X	    move.l  24(a0),6(a1)
X	    move.w  26(a0),qualifier
X	    move.l  a1,a0
X	    lea     outevent,a1
X	    moveq   #20,d1
X	    suba.l  a2,a2
X	    CALL    RawKeyConvert,condev(PC)
X	    tst.l   d0
X	    beq     intuiend
X	    lea     inputbuffer,a1
X	    lea     outevent,a2
X	    move.w  curpos(PC),d4
X	    moveq   #0,d3
X	    tst.b   addlines
X	    bne     197$
X
X	    sub.w   #1,cmdcompflag
X
X	    cmp.b   #$9b,0(a2)          ;CSI
X	    bne     110$
X
X	    cmp.b   #'?',1(a2)          ;help
X	    bne.s   399$
X	    tst.w   getanswer
X	    bne.s   399$
X	    bsr     stoptimer
X	    tst.w   bottomin
X	    bne.s   398$
X	    move.w  #1,bottomin
X	    clr.w   ibufferlen
X	    clr.w   curpos
X	    bsr     UpdateIArea
X398$	    move.l  #usetxt,d0
X	    bsr     putnam
X	    clr.l   lastprinted
X	    bsr     blastout
X	    bra.s   420$
X
X399$	    cmp.b   #'C',1(a2)          ;cursor right
X	    bne.s   400$
X	    cmp.w   ibufferlen(PC),d4
X	    bge.s   420$
X	    addq    #1,d4
X421$	    move.w  d4,curpos
X420$	    bra     100$
X
X400$	    cmp.b   #'D',1(a2)          ;cursor left
X	    bne.s   401$
X	    subq    #1,d4
X	    bpl.s   421$
X	    bra.s   420$
X
X401$	    cmp.b   #' ',1(a2)
X	    bne.s   402$
X
X	    cmp.b   #'@',2(a2)          ;shift right
X	    bne.s   403$
X
X404$	    cmp.w   ibufferlen(PC),d4
X	    bge.s   421$
X	    addq    #1,d4
X	    cmp.b   #' ',0(a1,d4)
X	    bne.s   404$
X405$	    cmp.w   ibufferlen(PC),d4
X	    bge.s   421$
X	    addq    #1,d4
X	    cmp.b   #' ',0(a1,d4)
X	    beq.s   405$
X	    bra.s   421$
X
X403$	    cmp.b   #'A',2(a2)          ;shift left
X	    bne.s   420$
X406$	    tst.w   d4
X	    beq.s   421$
X	    subq    #1,d4
X	    cmp.b   #' ',0(a1,d4)
X	    beq.s   406$
X407$	    tst.w   d4
X	    beq.s   421$
X	    subq    #1,d4
X	    cmp.b   #' ',0(a1,d4)
X	    bne.s   407$
X	    addq    #1,d4
X	    bra.s   421$
X
X402$	    cmp.b   #'A',1(a2)          ;cursor up
X	    bne.s   408$
X	    tst.w   bottomin
X	    bne.s   480$
X	    tst.w   curpos
X	    bne.s   480$
X
X	    clr.w   curpos
X	    clr.w   ibufferlen
X	    bsr     UpdateIArea
X	    bsr     clrcursor
X	    move.w  edline(PC),d3
X	    ext.l   d3
X	    tst.w   d3
X	    beq.s   481$
X	    subq    #1,d3
X	    cmp.l   firstline(PC),d3
X	    bge.s   481$
X	    move.l  d3,-(a7)
X	    subq.l  #1,firstline
X	    bsr     blastout
X	    move.l  (a7)+,d3
X481$	    move.w  d3,edline
X	    bsr     getcurpos
X	    bsr     putcursor
X	    bra     intuiend
X480$	    move.l  history(PC),a0
X	    tst.l   0(a0)
X	    beq.s   423$
X	    move.l  curhist(PC),a1
X	    cmp.l   a0,a1
X	    beq.s   409$
X	    move.l  4(a1),d0
X	    move.l  d0,curhist
X409$	    move.l  a1,gothline
X	    bsr     copyhistory
X423$	    bra     100$
X
X408$	    cmp.b   #'B',1(a2)          ;cursor down
X	    bne     410$
X	    tst.w   bottomin
X	    bne.s   414$
X	    tst.w   curpos
X	    bne.s   414$
X
X	    clr.w   curpos
X	    clr.w   ibufferlen
X	    bsr     UpdateIArea
X	    bsr     clrcursor
X	    move.w  edline(PC),d3
X	    ext.l   d3
X	    move.l  numlines(PC),d4
X	    subq    #1,d4
X	    cmp.l   d4,d3
X	    beq.s   490$
X	    move.l  firstline(PC),d2
X	    add.w   rows(PC),d2
X	    subq    #1,d2
X	    addq    #1,d3
X	    cmp.w   d2,d3
X	    ble.s   490$
X	    move.l  d3,-(a7)
X	    addq.l  #1,firstline
X	    bsr     blastout
X	    move.l  (a7)+,d3
X490$	    bra     481$
X414$	    move.l  curhist(PC),d0
X	    beq.s   423$
X	    move.l  d0,a1
X	    move.l  0(a1),a1
X	    tst.l   0(a1)
X	    bne.s   411$
X	    clr.l   gothline
X	    clr.w   curpos
X	    clr.w   ibufferlen
X	    bra     423$
X411$	    move.l  a1,curhist
X	    bra     409$
X
X410$	    cmp.b   #'T',1(a2)          ;shift up
X	    bne.s   412$
X	    tst.w   hnum
X	    beq     423$
X	    move.l  history(PC),a1
X	    move.l  a1,curhist
X	    bra     409$
X
X412$	    cmp.b   #'S',1(a2)          ;shift down
X	    bne.s   440$
X	    tst.w   hnum
X	    beq     423$
X	    move.l  history+8,curhist
X	    bra.s   414$
X
X440$	    cmp.b   #'0',1(a2)          ;function keys
X	    bmi     423$
X	    cmp.b   #'9',1(a2)
X	    bgt     423$
X	    lea     1(a2),a0
X	    bsr     getnum
X	    lea     fkeys(PC),a0
X441$	    move.l  0(a0),a0
X	    tst.l   0(a0)
X	    beq     100$
X	    cmp.b   8(a0),d2
X	    bne.s   441$
X
X	    move.b  9(a0),d5
X	    ext.w   d5
X	    subq    #1,d5
X	    lea     10(a0),a0
X	    move.w  curpos(PC),d4
X	    lea     inputbuffer,a2
X	    moveq   #0,d3
X	    lea     0(a2,d4),a2
X445$	    move.b  (a0)+,d0
X	    cmp.b   #'^',d0
X	    bne.s   442$
X	    moveq   #1,d3
X	    bra.s   443$
X442$	    cmp.b   #'_',d0
X	    bne.s   444$
X	    move.b  #' ',d0
X444$	    move.b  d0,(a2)+
X	    addq    #1,d4
X443$	    dbf     d5,445$
X	    move.w  d4,curpos
X	    cmp.w   ibufferlen(PC),d4
X	    ble.s   446$
X	    move.w  d4,ibufferlen
X446$	    tst     d3
X	    beq     100$
X	    bra     got_fkey
X
X110$	    moveq   #0,d3
X101$	    move.w  curpos(PC),d4
X	    tst     d0
X	    beq     100$
X	    cmp.b   #13,0(a2,d3)        ;return
END_OF_FILE
if test 53365 -ne `wc -c <'Xoper.a.ab'`; then
    echo shar: \"'Xoper.a.ab'\" unpacked with wrong size!
fi
# end of 'Xoper.a.ab'
fi
echo shar: End of archive 3 \(of 4\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 4 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Submissions to comp.sources.amiga and comp.binaries.amiga should be sent to:
	amiga@cs.odu.edu	
or	amiga@xanth.cs.odu.edu	( obsolescent mailers may need this address )
or	...!uunet!xanth!amiga	( very obsolescent mailers need this address )

Comments, questions, and suggestions s should be addressed to ``amiga-request''
(only use ``amiga'' for submissions) at the above addresses.