home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / util / xoper-2.4.lha / Xoper / Xoper.s < prev    next >
Text File  |  1993-10-05  |  182KB  |  9,251 lines

  1. ******************************************
  2. *                     *
  3. * Xoper 2.4 Copyright (C) Werner GÜnther *
  4. *    (68881 code by Lothar English)      *
  5. *(kick 2.0+ enhancements by Gunther Nikl)*
  6. *                     *
  7. ******************************************
  8. *  Written for the A68K V2.6 Assembler     *
  9. * by Charlie Gibbs and Brian R. Anderson *
  10. *                     *
  11. * Do not use Smallcode/Smalldata when     *
  12. *        linking             *
  13. ******************************************
  14.  
  15. ;DEBUG SET 1
  16.  
  17. ; include stuff
  18.  
  19.         include    lvo13/dos_lib.i
  20.         include    lvo13/exec_lib.i
  21.         include    lvo13/console_lib.i
  22.         include    lvo13/graphics_lib.i
  23.         include    lvo13/diskfont_lib.i
  24.         include    lvo13/intuition_lib.i
  25.         include    exec/types.i
  26.  
  27. ; >=V36 functions
  28.  
  29. _LVOColdReboot        equ    -726        ; exec
  30. _LVOFindDisplayInfo    equ    -726        ; graphics
  31. _LVOGetDisplayInfoData    equ    -756
  32. _LVOGetVPModeID        equ    -792
  33. _LVOLockPubScreen    equ    -510        ; intuition
  34. _LVOUnlockPubScreen    equ    -516
  35. _LVOLockPubScreenList    equ    -522
  36. _LVOUnlockPubScreenList    equ    -528
  37. _LVOPubScreenStatus    equ    -552
  38. _LVOReadEClock        equ    -60        ; timer
  39. _LVOAddAppIcon        equ    -60        ; workbench
  40. _LVORemoveAppIcon    equ    -66
  41. _LVOCreateCxObj        equ    -30        ; commodity
  42. _LVOCxBroker        equ    -36
  43. _LVOActivateCxObj    equ    -42
  44. _LVODeleteCxObjAll    equ    -54
  45. _LVOCxObjError        equ    -66
  46. _LVOAttachCxObj        equ    -84
  47. _LVOSetFilter        equ    -120
  48. _LVOCxMsgType        equ    -138
  49. _LVOCxMsgID        equ    -150
  50.  
  51. ; macro stuff
  52.  
  53. CALL        MACRO
  54.         move.l    \2,a6
  55.         jsr    _LVO\1(a6)
  56.         ENDM
  57.  
  58. RECALL        MACRO
  59.         jsr    _LVO\1(a6)
  60.         ENDM
  61.  
  62. ADDCMD        MACRO
  63. cmdnum        set    cmdnum+1
  64.         dc.b    \1,0
  65.         ENDM
  66.  
  67. ; global stuff
  68.  
  69.     STRUCTURE Globals,0
  70.       ULONG  sysbase
  71.       ULONG  dosbase
  72.       ULONG  intuibase
  73.       ULONG  gfxbase
  74.       ULONG  wbbase
  75.       ULONG  cxbase
  76.       ULONG  condev
  77.       ULONG  wbmsg
  78.       ULONG  myseg
  79.       ULONG  realstack
  80.       ULONG  idletask
  81.       ULONG  node
  82.       ULONG  parmtxt
  83.       ULONG  infile
  84.       ULONG  ptr
  85.       ULONG  auxsig
  86.       ULONG  mysignal            ; init with $20000
  87.       ULONG  trapsignal
  88.       ULONG  tasksigs
  89.       ULONG  cancelbit
  90.       ULONG  cancelbnum
  91.       ULONG  broker
  92.       ULONG  filter
  93.       ULONG  inputport
  94.        ULONG  inputio
  95.       ULONG  startmess
  96.       ULONG  savedat
  97.       ULONG  wnptr
  98.       ULONG  tfont
  99.       ULONG  aliaslist
  100.       ULONG  screenptr
  101.       ULONG  intuimsg
  102.       ULONG  mytask
  103.       ULONG  oldprwin
  104.       ULONG  pointer
  105.       ULONG  replyport
  106.       ULONG  timerport
  107.       ULONG  finfoptr
  108.       ULONG  dispatches
  109.       ULONG  maxdisp
  110.       ULONG  oldswitches
  111.       ULONG  remembr
  112.       ULONG  remembr2
  113.       ULONG  snoopport
  114.       ULONG  captask
  115.       ULONG  capiscli
  116.       ULONG  capseg
  117.       ULONG  blanks
  118.       ULONG  hidestart
  119.       ULONG  iocount
  120.       ULONG  rastport
  121.       ULONG  outchain
  122.       ULONG  firstline
  123.       ULONG  oldfirstline
  124.       ULONG  numlines
  125.       ULONG  oldnumlines
  126.       ULONG  timeoutm
  127.       ULONG  gothline
  128.       ULONG  lastprinted
  129.       ULONG  oldlastprinted
  130.       ULONG  maxlines            ; init with 500
  131.       ULONG  oldpageend
  132.       ULONG  secs
  133.       ULONG  mics
  134.       ULONG  time10
  135.       ULONG  tsecs
  136.       ULONG  tmics
  137.       ULONG  devicelock
  138.       ULONG  timerticks
  139.       ULONG  excpterror
  140.       ULONG  excpttask
  141.       ULONG  excptaddr
  142.       ULONG  excptpc
  143.       ULONG  lasttime
  144.       STRUCT newtime,4*2
  145.       STRUCT osecs,4*4
  146.       STRUCT tdtasks,4*4
  147.  
  148.       ULONG  OldSwitch
  149.       ULONG  OldAddTask
  150.       ULONG  OldAllocMem
  151.       ULONG  OldFreeMem
  152.       ULONG  OldTrap
  153.       ULONG  OldProcTrap
  154.  
  155.       UWORD  txheight
  156.       UWORD  txwidth
  157.       UWORD  firstpos
  158.       UWORD  colms
  159.       UWORD  timersig
  160.       UWORD  cxsig
  161.       UWORD  intuisig
  162.       UWORD  ibufferlen
  163.       UWORD  oldibuflen
  164.       UWORD  cposy
  165.       UWORD  curpos
  166.       UWORD  oldpos
  167.       UWORD  bottomin
  168.       UWORD  ipos
  169.       UWORD  hnum
  170.       UWORD  minnumchars            ; init with 2
  171.       UWORD  maxhlines            ; init with 10
  172.       UWORD  qualifier
  173.       UWORD  rows
  174.       UWORD  maxllength
  175.       UWORD  loffset
  176.       UWORD  repeatlen
  177.       UWORD  edline
  178.       UWORD  cmdptr
  179.       UWORD  currenty
  180.       UWORD  cmdcompnr
  181.       UWORD  cmdcomplen
  182.       UWORD  cmdcplen
  183.       UWORD  numtaskstimed
  184.       UWORD  tasksnum
  185.       UWORD  procnum
  186.  
  187.       STRUCT hexarea,10
  188.       STRUCT binarea,12
  189.       STRUCT minus,2
  190.       STRUCT decimal,6
  191.  
  192.       UBYTE  entries
  193.       UBYTE  timeout            ; init with 5
  194.       UBYTE  newpri
  195.       UBYTE  tasktyp
  196.       UBYTE  getanswer
  197.       UBYTE  printed
  198.       UBYTE  useageon
  199.       UBYTE  tports
  200.       UBYTE  hideon                ; init with
  201.       UBYTE  headon
  202.       UBYTE  tinfo
  203.       UBYTE  cmdcli                ;    |
  204.       UBYTE  sorton                ;    |
  205.       UBYTE  cxstate            ;    |
  206.       UBYTE  iconifyon            ;    |
  207.       UBYTE  propgadon            ;    V
  208.       UBYTE  propupdate
  209.       UBYTE  finfopen
  210.       UBYTE  patchmode            ; -1 !!!!
  211.       UBYTE  timerstate
  212.       UBYTE  cbreak
  213.       UBYTE  bool
  214.       UBYTE  wanttraps
  215.       UBYTE  addlines
  216.       UBYTE  gotguru
  217.       UBYTE  ownscreen
  218.       UBYTE  ownfont
  219.       UBYTE  insmode
  220.       UBYTE  repeat
  221.       UBYTE  capgone
  222.       UBYTE  capwaiting
  223.       UBYTE  cliexec
  224.       UBYTE  appicn
  225.       UBYTE  pcheck
  226.       UBYTE  snoopon
  227.       UBYTE  msnoop
  228.       UBYTE  newtab
  229.       UBYTE  oldtab
  230.       UBYTE  bleft
  231.       UBYTE  waitexit
  232.       UBYTE  wantexit
  233.       UBYTE  wanthold
  234.       UBYTE  wantwindow
  235.       UBYTE  post_V34
  236.  
  237.       STRUCT mypacket,68
  238. ; don't change argument order below !!!
  239.       STRUCT buffer,2800
  240.       STRUCT out,100
  241.       STRUCT dummy,80
  242.       STRUCT in,80
  243.       STRUCT cputime,1000
  244.       STRUCT taskstampid,128*4
  245.       STRUCT taskstamps,128*4
  246.       STRUCT usedtime,128*4
  247.       STRUCT ievent,32
  248.       STRUCT outevent,20
  249.       STRUCT inputbuffer,88
  250.       STRUCT timerio,40
  251.       STRUCT sampleio,40
  252.       STRUCT repeatbuffer,82
  253.       STRUCT hotkeybuf,42
  254.       STRUCT winkeybuf,82
  255.  
  256.     LABEL gb_SIZEOF
  257.  
  258. ; some defintions
  259.  
  260. mysigbit    equ    17
  261. maxarg        equ    20
  262.  
  263. ; Program startup.
  264. ; If called from DOS we use segment splitting to detach from our DOS-task.
  265.  
  266. start        lea    dataarea,a4        ; globals
  267.         move.l    d0,d2            ; save arguments
  268.         move.l    a0,a2
  269.         move.l    a4,a1
  270.         move.w    #(gb_SIZEOF>>2)-1,d1
  271. 1$        clr.l    (a1)+            ; clear bss area
  272.         dbra    d1,1$
  273.         bsr.s    InitVars        ; default values
  274.         move.l    4,a6
  275.         move.l    a6,sysbase(a4)
  276.         move.l    276(a6),a3
  277.         tst.l    172(a3)
  278.         bne.s    fromCLI
  279. fromWB        lea    92(a3),a0        ; get wb msg
  280.         RECALL    WaitPort
  281.         lea    92(a3),a0
  282.         RECALL    GetMsg
  283.         move.l    d0,wbmsg(a4)
  284. fromCLI        lea    dosname(pc),a1        ; open dos
  285.         moveq    #33,d0
  286.         RECALL    OpenLibrary
  287.         move.l    d0,dosbase(a4)
  288.         beq.s    exit
  289.         move.l    wbmsg(a4),d1
  290.         beq.s    1$            ; not wb start
  291.         move.l    d1,a1
  292.         bsr.s    GetToolTypes        ; make cmd line for wb
  293. 1$        bsr    GetCmdLine
  294.         bsr    CreateProc        ; start prog
  295. exit
  296.     IFD DEBUG
  297.         move.l    sysbase(a4),a6
  298.     ENDC
  299.         move.l    wbmsg(a4),d2
  300.         beq.s    2$
  301.         RECALL    Forbid
  302.         move.l    d2,a1
  303.         RECALL    ReplyMsg
  304. 2$        move.l    dosbase(a4),d0
  305.         beq.s    1$
  306.         move.l    d0,a1
  307.         RECALL    CloseLibrary
  308.         moveq    #0,d0
  309. 1$        rts
  310.  
  311. ; some default values (before zero!)
  312.  
  313. InitVars    addq.w    #2,mysignal(a4)        ; mask :=$20000
  314.         move.w    #500,maxlines+2(a4)
  315.         addq.w    #1,bottomin(a4)
  316.         addq.w    #2,minnumchars(a4)
  317.         move.w    #10,maxhlines(a4)
  318.         move.w    #999,edline(a4)
  319.         addq.b    #5,timeout(a4)
  320.         subq.l    #1,hideon(a4)        ; +headon+tinfo+cmdcli
  321.         subq.l    #1,sorton(a4)        ; +cxstate+iconifyon+propgadon
  322.         subq.w    #1,propupdate(a4)    : + finfopen
  323.         subq.b    #1,patchmode(a4)
  324.         rts
  325.  
  326. ; a1 - wbmsg
  327.  
  328. _LVOGetDiskObject    equ    -78
  329. _LVOFreeDiskObject    equ    -90
  330.  
  331. GetToolTypes    move.l    36(a1),a3
  332.         lea    icnname(pc),a1
  333.         moveq    #33,d0
  334.         RECALL    OpenLibrary
  335.         move.l    d0,d6
  336.         beq.s    1$            ; no icon library ?!
  337.         move.l    (a3),d1
  338.         CALL    CurrentDir,dosbase(a4)    ; set wa_Lock
  339.         move.l    4(a3),a0
  340.         CALL    GetDiskObject,d6    ; iconbase
  341.         move.l    d0,d3
  342.         beq.s    2$            ; no icon got
  343.         move.l    d3,a3
  344.         move.l    54(a3),a3        ; do_ToolTypes
  345.         lea    buffer(a4),a2
  346.         move.l    a2,a1
  347.         bra.s    4$
  348. 6$        move.l    d0,a0
  349.         cmp.b    #'A',(a0)
  350.         bcs.s    4$            ; skip < A
  351.         cmp.b    #'z'+1,(a0)
  352.         bcc.s    4$            ; skip > z
  353.         cmp.b    #'Z'+1,(a0)
  354.         bcs.s    5$            ; ok < Z
  355.         cmp.b    #'a',(a0)
  356.         bcs.s    4$            ; skip < a
  357. 5$        move.b    (a0)+,(a1)+        ; copy value
  358.         bne.s    5$
  359.         move.b    #' ',-1(a1)        ; delimiter
  360. 4$        move.l    (a3)+,d0
  361.         bne.s    6$
  362.         move.l    a1,d2
  363.         sub.l    a2,d2            ; line length
  364.         bne.s    3$
  365.         moveq    #1,d2            ; don't clear illegal
  366. 3$        move.l    d3,a0
  367.         RECALL    FreeDiskObject
  368. 2$        move.l    a6,a1            ; close icon lib
  369.         CALL    CloseLibrary,sysbase(a4)
  370. 1$        rts
  371.  
  372. GetCmdLine    clr.b    -1(a2,d2.w)        ; terminate line
  373.         move.l    a2,a1
  374.         moveq    #0,d2
  375.         lea    out(a4),a2
  376.  
  377. ; a1 - pointer into command line
  378. ; d2 - argc
  379. ; a2 - argv
  380.  
  381. ParseCLI    bsr.s    GetNext            ; search argument
  382.         bmi.s    doquote            ; quotation sign
  383.         beq.s    dosemi            ; commentary stops all
  384.         bcs.s    ParseCLI        ; separation sign
  385.         lea    -1(a1),a0        ; argument start
  386.         bsr.s    BumpArgV        ; argc+1 & ptr to argv
  387. build_2        bsr.s    GetNext            ; search separation sign
  388.         beq.s    dosemi            ; commentary stops all
  389.         bcc.s    build_2            ; no separation sign
  390.         clr.b    -1(a1)            ; mark end
  391.         bra.s    ParseCLI        ; continue search
  392.  
  393. doquote        move.l    a1,a0            ; argument start
  394.         bsr.s    BumpArgV        ; argc+1 & ptr to argv
  395. quote_2        bsr.s    GetNext            ; search quotation sign
  396.         bpl.s    quote_2            ; no quotation sign
  397.         clr.b    -1(a1)            ; mark end
  398. quote_3        bsr.s    GetNext            ; search sepaartion sign
  399.         beq.s    dosemi            ; commentary stops all
  400.         bcc.s    quote_3            ; no separation sign
  401.         bra.s    ParseCLI        ; continue search
  402.  
  403. dosemi        clr.b    -(a1)            ; delete semicolon
  404.         bra.s    ParseCLI        ; go on
  405.  
  406. BumpArgV    cmp.w    #maxarg,d2        ; max argc reached ?
  407.         bcc.s    1$
  408.         move.l    a0,(a2)+        ; store argptr
  409.         addq.w    #1,d2            ; increment argc
  410. 1$        rts
  411.  
  412. GetNext        move.b    (a1)+,d0        ; test character
  413.         beq.s    BuildRdy
  414.         moveq    #-3,d1            ; N=1,Z=0,C=0 -> quotation
  415.         cmp.b    #'"',d0
  416.         beq.s    1$
  417.         moveq    #-2,d1            ; N=0,Z=1,C=1 -> semicolon
  418.         cmp.b    #';',d0
  419.         beq.s    1$
  420.         moveq    #-1,d1            ; N=0,Z=0,C=1 -> separation
  421.         cmp.b    #'=',d0
  422.         beq.s    1$
  423.         cmp.b    #' ',d0
  424.         beq.s    1$
  425.         cmp.b    #9,d0
  426.         beq.s    1$
  427.         moveq    #0,d1            ; N=0,Z=0,C=0 -> others
  428. 1$        addq.l    #2,d1            ; set flags ( see above )
  429.         rts
  430.  
  431. BuildRdy    move.b    d2,entries(a4)
  432.         addq.l    #4,sp            ; set right return address
  433.         rts
  434.  
  435. ; usage requsted
  436.  
  437. showhelp    CALL    Output,dosbase(a4)
  438.         move.l    d0,d4
  439.         move.l    d4,d1
  440.         lea    template.str(pc),a2
  441.         move.l    a2,d2
  442.         moveq    #cmd.str-template.str-1,d3
  443.         RECALL    Write
  444.         move.l    d4,d1
  445.         lea    buffer(a4),a2
  446.         move.l    a2,d2
  447.         moveq    #80,d3
  448.         RECALL    Read
  449.         move.l    d0,d2
  450.         bra    GetCmdLine        ; check input
  451.  
  452. ; check template for cli or wb
  453.  
  454. CheckArgs    tst.l    wbmsg(a4)        ; workbench ?
  455.         bne.s    1$
  456.         lea    help.str(pc),a0        ; help ?
  457.         bsr.s    findarg
  458.         bne.s    1$
  459.         bsr.s    showhelp
  460.  
  461. 1$        lea    cxpop.str(pc),a0    ; popup ?
  462.         bsr.s    findarg
  463.         bne.s    2$
  464.         bsr    nextarg
  465.         beq.s    1$
  466.         lea    cxyes.str(pc),a0
  467.         jsr    StrCmp(a4)
  468.         beq.s    2$
  469.         st    wanthold(a4)
  470.  
  471. 2$        lea    cxkey.str(pc),a0    ; new popkey ?
  472.         bsr.s    findarg
  473.         bne.s    21$
  474.         bsr.s    nextarg
  475.         bne.s    22$
  476. 21$        lea    defhotkey(a4),a1
  477. 22$        lea    hotkeybuf(a4),a0
  478.         moveq    #39,d0
  479. 23$        move.b    (a1)+,(a0)+        ; copy hotkey description
  480.         dbeq    d0,23$
  481.         clr.b    (a0)
  482.  
  483.         lea    cxpri.str(pc),a0
  484.         bsr.s    findarg
  485.         bne.s    3$
  486.         bsr.s    nextarg
  487.         beq.s    3$
  488.         move.l    a1,a0
  489.         jsr    GetNum(a4)
  490.         move.b    d2,newbroker+18(a4)    ; nb_Pri
  491.  
  492. 3$        lea    cmd.str(pc),a0        ; defaultcmd ?
  493.         bsr.s    findarg
  494.         bne.s    31$
  495.         bsr.s    nextarg
  496.         beq.s    31$
  497.         move.b    (a1),d2            ; first char
  498.         lea    kill.str(pc),a0
  499.         jsr    StrCmp(a4)
  500.         bne.s    32$
  501.         st    bool(a4)        ; kill
  502. 31$        moveq    #'t',d2            ; display default to tasks
  503. 32$        lsl.w    #8,d2
  504.         or.w    #10,d2            ; LF
  505.         move.w    d2,in(a4)
  506.         rts
  507.  
  508. findarg        move.b    entries(a4),d2        ; search argument
  509.         lea    out(a4),a2
  510. 1$        subq.b    #1,d2
  511.         bcs.s    2$
  512.         move.l    (a2)+,a1
  513.         jsr    StrCmp(a4)        ; compare it
  514.         bne.s    1$
  515. 2$        rts
  516.  
  517. nextarg        move.l    (a2),a1            ; make sure ptr is valid
  518.         move.l    a1,d1
  519.         rts
  520.  
  521. CreateProc    bsr    CheckArgs
  522.         CALL    Forbid,sysbase(a4)
  523.         lea    xopcon(a4),a1
  524.         RECALL    FindPort
  525.         move.l    d0,a5
  526.         move.l    a5,d0
  527.         beq.s    1$
  528.         move.l    16(a5),a1
  529.         move.l    mysignal(a4),d0
  530.     IFND DEBUG                ; kill for full version only !
  531.         tst.b    bool(a4)
  532.         beq.s    2$            ; wake Xoper up
  533.  
  534. ; This code tries to remove Xoper from the System in case Xoper 'freezes'
  535. ; or crashes. It works as follows:
  536. ; Xoper leaves the address of its cleanup routine in the UserData field of
  537. ; its Task structure. EXEC's context-restore code leaves the current PC of
  538. ; a task in the first longword of the tasks stack. All we have to do is to
  539. ; copy the address of Xoper's cleanup routine to its stack and to reschedule
  540. ; Xoper (using Signal() in this case).
  541.  
  542.         move.l    54(a1),a0
  543.         btst    #4,297(a6)        ; AttnFlags FPU
  544.         beq.s    3$            ; no FPU
  545.         moveq    #0,d0
  546.         move.b    (a0),d1            ; NULL frame ?
  547.         beq.s    4$
  548.         move.w    (a0),d1            ; frame flag / format word
  549.         lea    110(a0),a0        ; offset to fpu regs
  550.         addq.w    #1,d1            ; -1 ?
  551.         beq.s    5$
  552.         lea    12(a0),a0        ; add 3 longs
  553. 5$        move.b    1(a0),d0        ; frame size
  554. 4$        lea    4(a0,d0.w),a0
  555. 3$        move.l    88(a1),0(a0)
  556.         moveq    #-1,d0
  557.     ENDC
  558. 2$        RECALL    Signal
  559. 1$        RECALL    Permit
  560.         move.l    a5,d0
  561.         bne.s    leave
  562.         tst.b    bool(a4)        ; kill request only !
  563.         bne.s    leave
  564.     IFND DEBUG
  565.         move.l    dosbase(a4),a5        ; start as background proccess
  566.         exg.l    a5,a6
  567.         tst.b    wanthold(a4)
  568.         beq.s    stt1            ; do not sleep
  569.         RECALL    Output
  570.         move.l    d0,d4
  571.         beq.s    stt1
  572.         move.l    d4,d1
  573.         lea    windowname(a4),a2
  574.         move.l    a2,d2
  575.         moveq    #description-windowname-1,d3
  576.         RECALL    Write
  577.         move.l    d4,d1
  578.         lea    cr(a4),a2
  579.         move.l    a2,d2
  580.         moveq    #1,d3
  581.         RECALL    Write
  582. stt1        move.l    276(a5),a1
  583.         move.l    152(a1),d1
  584.         RECALL    DupLock
  585.         move.l    d0,d5
  586.         exg.l    a5,a6
  587.         RECALL    Forbid
  588.         lea    newname(a4),a1
  589.         move.l    a1,d1
  590.         moveq    #0,d2
  591.         lea    start(pc),a1
  592.         move.l    -(a1),d3
  593.         move.l    d3,myseg(a4)
  594.         clr.l    (a1)+
  595.         moveq    #(4096>>6),d4
  596.         lsl.w    #6,d4
  597.         exg.l    a5,a6
  598.         RECALL    CreateProc
  599.         exg.l    a5,a6
  600.         move.l    d0,a0
  601.         move.l    a0,d0
  602.         beq.s    leave
  603.         move.l    d5,60(a0)        ; set new lock
  604.         RECALL    Permit
  605.     ENDC
  606.     IFD DEBUG
  607.         jsr    mainprg
  608.     ENDC
  609. leave        rts
  610.  
  611. dosname        dc.b    'dos.library',0
  612. icnname        dc.b    'icon.library',0
  613. template.str    dc.b    'CMD/K,CX_POPUP/K,CX_POPKEY/K,CX_PRIORITY/K/N: ',0
  614. cmd.str        dc.b    'CMD',0
  615. kill.str    dc.b    'KILL',0
  616. cxpop.str    dc.b    'CX_POPUP',0
  617. cxkey.str    dc.b    'CX_POPKEY',0
  618. cxpri.str    dc.b    'CX_PRIORITY',0
  619. cxyes.str    dc.b    'YES',0
  620. help.str    dc.b    '?',0
  621.  
  622.         SECTION    Xoper,DATA
  623.  
  624. mainprg        lea    dataarea(pc),a4        ; global base ptr
  625.         move.l    sp,realstack(a4)
  626.         move.l    sysbase(a4),a6
  627.         cmp.w    #36,20(a6)        ; LIB_VERSION
  628.         blt.s    9$
  629.         st    post_V34(a4)        ; Kick2.0+
  630.         move.w    #imagesize,d0
  631.         move.l    image+10(a4),a0
  632. 10$        not.l    (a0)+            ; reverse iconify image
  633.         dbra    d0,10$
  634. 9$        move.l    304(a6),OldTrap(a4)    ; original EXEC Trap-Handler
  635.         move.l    276(a6),a0        ; ExecBase->ThisTask
  636.         move.l    a0,mytask(a4)
  637.         move.l    50(a0),OldProcTrap(a4)    ; original AmigaDOS Trap-Handler
  638.         lea    stopall(pc),a1
  639.         move.l    a1,88(a0)        ; leave a message for 'Kill Xoper'
  640.         move.l    184(a0),oldprwin(a4)
  641.         moveq    #-1,d0            ; disable the 'please insert'
  642.         move.l    d0,184(a0)        ; requester
  643.  
  644.         lea    350(a6),a0        ; nessecary libs & devs
  645.         lea    conname(a4),a1
  646.         RECALL    FindName
  647.         move.l    d0,condev(a4)
  648.         lea    378(a6),a0
  649.         lea    gfxname(a4),a1
  650.         RECALL    FindName
  651.         move.l    d0,gfxbase(a4)
  652.         lea    378(a6),a0
  653.         lea    intname(a4),a1
  654.         RECALL    FindName
  655.         move.l    d0,intuibase(a4)
  656.         move.l    d0,a0
  657.         move.l    56(a0),a0        ; ib_ActiveScreen
  658.         move.w    12(a0),d0        ; sc_Width
  659.         sub.w    #550,d0
  660.         move.w    d0,window_l(a4)
  661.  
  662.         bsr    OpenLibsV37        ; Kick 2.0+ libraries
  663.  
  664.         moveq    #0,d0
  665.         lea    xopcon(a4),a0
  666.         bsr    CreatePort
  667.         move.l    d0,replyport(a4)
  668.         moveq    #0,d0
  669.         suba.l    a0,a0
  670.         bsr    CreatePort
  671.         move.l    d0,timerport(a4)
  672.         move.l    d0,a0
  673.         move.b    15(a0),d0
  674.         ext.w    d0
  675.         move.w    d0,timersig(a4)
  676.         lea    timerio(a4),a1
  677.         move.l    a0,14(a1)        ; timerport
  678.         lea    timernam(a4),a0
  679.         moveq    #1,d0
  680.         moveq    #0,d1
  681.         RECALL    OpenDevice        ; open 'timer.device'
  682.  
  683.         tst.b    post_V34(a4)
  684.         beq.s    8$
  685.         lea    newtime(a4),a0
  686.         CALL    ReadEClock,timerio+20(a4)
  687.         move.l    newtime+4(a4),lasttime(a4)
  688.         lsr.l    #8,d0
  689.         bra.s    7$
  690.  
  691. 8$        moveq    #0,d0
  692.         suba.l    a0,a0    
  693.         bsr    CreatePort
  694.         lea    sampleio(a4),a1
  695.         move.l    d0,14(a1)
  696.         lea    timernam(a4),a0
  697.         moveq    #0,d0
  698.         moveq    #0,d1
  699.         RECALL    OpenDevice        ; open 'timer.device'
  700.         lea    sampleio(a4),a1
  701.         move.l    #3599999,32(a1)
  702.         move.w    #9,28(a1)
  703.         RECALL    SendIO
  704.         move.l    #3906,d0
  705.  
  706. 7$        move.l    d0,timerticks(a4)
  707.         bsr    starttasktimer
  708.  
  709. ;assumes sysbase is in a6 !
  710. ;install a counter to determine the amount of cpu-time each task uses.
  711.  
  712.         RECALL    Forbid
  713.  
  714.         move.l    #_LVOSwitch,d0
  715.         lea    myswitch(pc),a0
  716.         exg.l    d0,a0
  717.         move.l    a6,a1
  718.         RECALL    SetFunction
  719.         move.l    d0,OldSwitch(a4)
  720.  
  721.         move.l    #_LVOAddTask,d0
  722.         lea    myaddtask(pc),a0
  723.         exg.l    d0,a0
  724.         move.l    a6,a1
  725.         RECALL    SetFunction
  726.         move.l    d0,OldAddTask(a4)
  727.  
  728.         RECALL    Permit
  729.  
  730. ;install a counter for PORT-Interrupts
  731.         lea    iocounter(a4),a1
  732.         move.l    a4,14(a1)
  733.         moveq    #3,d0
  734.         RECALL    AddIntServer
  735.  
  736.         moveq    #$40,d0
  737.         lsl.w    #2,d0            ; 256
  738.         moveq    #-128,d1        ; Pri
  739.         lea    kidlename(a4),a0    ; Name
  740.         lea    killidle(pc),a1        ; Code
  741.         bsr    CreateTask
  742.         move.l    d0,idletask(a4)
  743.  
  744.         bsr    gettdtasks
  745.  
  746. ;attempt to open a startup script
  747.         lea    infile(a4),a2
  748.         lea    dummy(a4),a5
  749.         lea    startupname(a4),a0    ; 'ENV:Xoper.Startup'
  750.         move.l    a5,a1
  751. 6$        move.b    (a0)+,(a1)+        ; copy string
  752.         bne.s    6$
  753.         moveq    #4,d1
  754.         add.l    a5,d1
  755.         move.l    #1005,d2
  756.         CALL    Open,dosbase(a4)    ; 'Xoper.startup'
  757.         move.l    d0,(a2)
  758.         bne.s    5$
  759.         move.l    a5,d1
  760.         RECALL    Open            ; 'ENV:Xoper.Startup'
  761.         move.l    d0,(a2)
  762.         bne.s    5$
  763.         moveq    #2,d1
  764.         move.b    #'S',0(a5,d1.w)
  765.         add.l    a5,d1
  766.         RECALL    Open            ; 'S:Xoper.startup'
  767.         move.l    d0,(a2)
  768.         beq.s    nostartup
  769.  
  770. 5$        movem.l    a2/a5/a6,-(sp)        ; infile, dummy & dosbase
  771.         moveq    #-1,d5
  772. 4$        addq.l    #1,d5
  773.         move.l    (a2),d1
  774.         move.l    a5,d2
  775.         add.l    d5,d2
  776.         moveq    #1,d3
  777.         RECALL    Read
  778.         tst.l    d0
  779.         bgt.s    3$
  780.  
  781.         move.l    (a2),d1
  782.         RECALL    Close
  783.         clr.l    (a2)
  784.         tst.w    d5
  785.         beq.s    1$
  786.         bra.s    2$
  787.  
  788. 3$        cmp.b    #10,0(a5,d5.l)
  789.         beq.s    2$
  790.         cmp.b    #13,0(a5,d5.l)
  791.         bne.s    4$
  792.  
  793. 2$        moveq    #1,d0
  794.         add.l    d5,d0
  795.         bsr    cli             ; execute the script as if typed in
  796. 1$        movem.l    (sp)+,a2/a5/a6
  797.         tst.l    (a2)            ; check infile
  798.         bne.s    5$
  799.  
  800. nostartup    moveq    #-1,d0            ; prepare screen tags
  801.         CALL    AllocSignal,sysbase(a4)
  802.         move.l    d0,nspubsig+4(a4)
  803.         move.l    mytask(a4),nspubtask+4(a4)
  804.  
  805.         moveq    #mysigbit,d0
  806.         RECALL    AllocSignal
  807.         bsr    installh
  808.  
  809.         tst.b    wanthold(a4)        ; background task ?
  810.         bne    instback
  811.  
  812. ; This code just opens a Window. Position and size are
  813. ; taken from window_l,window_t,window_w,window_h.
  814.  
  815. restart        move.l    intuibase(a4),a6
  816.         lea    setupwindow(pc),a0
  817.         tst.b    ownscreen(a4)
  818.         beq.s    1$
  819.         clr.b    ownscreen(a4)
  820.         lea    createscreen(pc),a0
  821. 1$        jsr    0(a0)            ; screen and/or window
  822.         move.l    mytask(a4),a0
  823.         clr.l    26(a0)            ; clear 'spurious' signals
  824.         clr.l    ptr(a4)
  825.         tst.b    gotguru(a4)
  826.         beq.s    2$
  827.         bsr    showguru
  828.         clr.b    gotguru(a4)
  829. 2$        bra    processmsgs
  830.  
  831. OpenLibsV37    lea    wbname(a4),a1
  832.         bsr.s    1$            ; open 'workbench.library'
  833.         move.l    d0,wbbase(a4)
  834.         lea    cxname(a4),a1
  835.         bsr.s    1$            ; open 'commodities.library'
  836.         move.l    d0,cxbase(a4)
  837.         rts
  838. 1$        moveq    #37,d0
  839.         jmp    _LVOOpenLibrary(a6)    ; a6 - SysBase !
  840.  
  841. starttasktimer    lea    tsecs(a4),a0
  842.         lea    tmics(a4),a1
  843.         CALL    CurrentTime,intuibase(a4)
  844.         bsr    getaskdat2        ; returns SysBase in a6 !
  845.         move.l    tsecs(a4),d0
  846.         lea    taskstampid(a4),a0
  847.         lea    taskstamps(a4),a1
  848.         lea    usedtime(a4),a2
  849.         moveq    #0,d1
  850. 1$        subq.b    #1,d5
  851.         bmi.s    2$
  852.         lea    -16(a5),a5
  853.         move.l    0(a5),(a0)+
  854.         move.l    d0,(a1)+
  855.         clr.l    (a2)+
  856.         addq.w    #1,d1
  857.         cmp.w    #128,d1
  858.         bmi.s    1$
  859. 2$        move.w    d1,numtaskstimed(a4)
  860.         rts
  861.  
  862. gettdtasks    lea    350(a6),a0        , a6 - SysBase
  863.         lea    tdname(a4),a1
  864.         RECALL    FindName
  865.         move.l    d0,a3
  866.         move.l    a3,d0
  867.         beq.s    r_t_s
  868.         lea    36(a3),a3
  869.         lea    tdtasks(a4),a5
  870. 1$        move.l    (a3)+,d0
  871.         beq.s    r_t_s
  872.         move.l    d0,a2
  873.         move.l    16(a2),(a5)+
  874.         bra.s    1$
  875. r_t_s        rts
  876.  
  877. ; exit program 
  878.  
  879. stopall        st    waitexit(a4)        ; wait until pubscr freed
  880.         tst.b    appicn(a4)
  881.         beq.s    exitall
  882.         move.l    wnptr(a4),a0        ; remove appicon here
  883.         CALL    RemoveAppIcon,wbbase(a4)
  884.         clr.l    wnptr(a4)
  885.  
  886. exitall        tst.b    ownscreen(a4)
  887.         beq.s    6$            ; no screen == no pub screen !
  888.         st    wantexit(a4)
  889.         bsr    SetPubStatus
  890.         beq.s    r_t_s            ; pubscreen still used
  891.  
  892. 6$        moveq    #1,d0
  893.         bsr    CloseGUI        ; close screen & window
  894.  
  895.         bsr    killpage
  896.         bsr    freeblank
  897.         bsr    killhistory
  898.         bsr    freehidmem
  899.         bsr    freealias
  900.         bsr    clrfkeys
  901.  
  902. 5$        move.l    stplist(a4),a3
  903.         tst.l    0(a3)
  904.         beq.s    4$
  905.         move.l    a3,d0
  906.         bsr    waok
  907.         bra.s    5$
  908.  
  909. 4$        bsr    removeh
  910.         bsr    remtraps
  911.  
  912.         move.l    sysbase(a4),a6
  913.  
  914.         bsr    CloseLibsV37        ; close Kick 2.0+ libraries
  915.  
  916.         move.l    idletask(a4),a1
  917.         RECALL    RemTask
  918.  
  919.         st    waitexit(a4)
  920.         st    bool(a4)
  921.  
  922. 36$        tst.b    bool(a4)
  923.         beq.s    33$            ; exec patches removed !
  924.         RECALL    Forbid
  925.         tst.b    patchmode(a4)
  926.         beq.s    35$            ; don't check vectors
  927.         lea    myswitch(pc),a0
  928.         cmp.l    _LVOSwitch+2(a6),a0
  929.         bne.s    34$
  930.         lea    myaddtask(pc),a0
  931.         cmp.l    _LVOAddTask+2(a6),a0
  932.         bne.s    34$
  933. 35$        move.l    OldSwitch(a4),d0
  934.         move.w    #_LVOSwitch,a0
  935.         move.l    a6,a1
  936.         RECALL    SetFunction
  937.         move.l    OldAddTask(a4),d0
  938.         move.w    #_LVOAddTask,a0
  939.         move.l    a6,a1
  940.         RECALL    SetFunction
  941.         clr.b    bool(a4)
  942. 34$        RECALL    Permit
  943.  
  944. 33$        bsr    snoopend        ; mem trace
  945.         bsr    traceend        ; dos trace
  946.  
  947.         move.b    bool(a4),d0        ; exec -> dispatch,addtask
  948.         add.b    msnoop(a4),d0        ; exec -> memory
  949.         add.b    DosTable+5(a4),d0    ; dos  -> open
  950.         add.b    DosTable+25(a4),d0    ; dos  -> lock
  951.         beq.s    32$            ; zero == all removed
  952.         moveq    #0,d0
  953.         move.l    mysignal(a4),d1
  954.         CALL    SetSignal,sysbase(a4)
  955.         st    pcheck(a4)        ; enable checking ...
  956.         move.l    mysignal(a4),d0
  957.         RECALL    Wait            ; wait for intr signal
  958.         bra.s    36$            ; try again ...
  959.  
  960. 32$        lea    iocounter(a4),a1
  961.         moveq    #3,d0
  962.         RECALL    RemIntServer
  963.  
  964.         move.l    replyport(a4),d0
  965.         bsr    DeletePort
  966.         bsr    stoptimer
  967.         lea     timerio(a4),a1
  968.         CALL    CloseDevice,sysbase(a4)
  969.         move.l    timerport(a4),d0
  970.         bsr    DeletePort
  971.  
  972.         tst.b    post_V34(a4)
  973.         bne.s    3$
  974.         lea    sampleio(a4),a1
  975.         CALL    AbortIO,sysbase(a4)
  976.         lea    sampleio(a4),a1
  977.         move.l    14(a1),d7
  978.         RECALL    CloseDevice
  979.         move.l    d7,d0
  980.         bsr    DeletePort
  981.  
  982. 3$        move.l    dosbase(a4),a6
  983.         move.l    infile(a4),d1
  984.         beq.s    2$
  985.         RECALL    Close
  986.  
  987. 2$        move.l    mytask(a4),a2
  988.  
  989.     IFND DEBUG
  990.         move.l    152(a2),d1
  991.         RECALL    UnLock
  992.         move.l    myseg(a4),d1
  993.         RECALL    UnLoadSeg
  994.     ENDC
  995.  
  996.         move.l    oldprwin(a4),184(a2)    ; reenable the requester
  997.  
  998.         move.l    realstack(a4),sp
  999.         moveq    #0,d0
  1000.         rts
  1001.  
  1002. CloseLibsV37    move.l    cxbase(a4),a1        ; commodities base
  1003.         bsr.s    2$
  1004.         move.l    wbbase(a4),a1        ; workbench base
  1005. 2$        move.l    a1,d0
  1006.         beq.s    1$            ; no lib
  1007.         RECALL    CloseLibrary
  1008. 1$        rts
  1009.  
  1010. ;show a list. The string entered from keyboard is stored
  1011. ;in 'in'. Every character is interpreted as one command
  1012. ;i.e. 'rip' means 'resources'+'interrupts'+'ports'.
  1013. ;search the command to be executed. If none is found,
  1014. ;show a help message
  1015.  
  1016. showwhat    tst.l    infile(a4)
  1017.         bne.s    nomore
  1018.         move.w    cmdptr(a4),d7
  1019.  
  1020. input        lea    in(a4),a0
  1021.         move.b    0(a0,d7.w),d0
  1022.         beq.s    endshow
  1023.         addq.w    #1,d7
  1024.         cmpi.b    #' ',d0
  1025.         bne.s    i1
  1026.         bsr.s    testifend
  1027.         beq.s    endshow
  1028.         move.w    d2,cmdptr(a4)
  1029.         bra.s    endshow2
  1030.  
  1031. i1        cmpi.b    #10,d0
  1032.         beq.s    endshow
  1033.         or.b    #32,d0
  1034.         cmpi.b    #'q',d0
  1035.         beq    quithold
  1036.         lea    params(a4),a0
  1037.         moveq    #parmnum-1,d1
  1038. i2        cmp.b    0(a0,d1.w),d0
  1039.         beq.s    foundp
  1040.         dbra    d1,i2
  1041.         move.w    #usetxt,d0
  1042.         bsr    putnamw
  1043.         bra.s    endshow
  1044.  
  1045. foundp        lea    subs(pc),a0
  1046.         lsl.w    #2,d1
  1047.         jsr    0(a0,d1.w)
  1048.         bsr.s    testifend
  1049.         beq.s    input
  1050.         bsr    newline
  1051.         bra.s    input
  1052.  
  1053. endshow        clr.w    cmdptr(a4)
  1054. endshow2    bsr    starttimer
  1055. nomore        tst.l    infile(a4)
  1056.         bne.s    1$
  1057.         clr.l    lastprinted(a4)
  1058.         bsr    blastout
  1059. 1$        rts
  1060.  
  1061. testifend    lea    in(a4),a0
  1062.         lea    0(a0,d7.w),a0
  1063.         move.w    d7,d2
  1064. 2$        move.b    (a0)+,d0
  1065.         beq.s    1$
  1066.         cmpi.b    #' ',d0
  1067.         bne.s    3$
  1068.         addq.w    #1,d2
  1069.         bra.s    2$
  1070. 3$        cmpi.b    #10,d0
  1071. 1$        rts
  1072.  
  1073. ;get the string from inputbuffer; search and execute
  1074. ;the command, if any.
  1075.  
  1076. cli        lea    dummy(a4),a0
  1077.         subq.w    #1,d0
  1078. cl2        subq.w    #1,d0
  1079.         bmi.s    cl1
  1080.         cmp.b    #' ',0(a0,d0.w)
  1081.         beq.s    cl2
  1082. cl1        addq.w    #1,d0
  1083.         move.b    #10,0(a0,d0.w)
  1084.         bsr    kllblnks        ; remove trailing blanks ... !
  1085.         cmpi.b    #10,0(a0)
  1086.         beq    showwhat
  1087.         cmpi.b    #';',0(a0)
  1088.         beq.s    nomore
  1089.  
  1090.         bsr.s    findcmd
  1091.         tst.l    d2
  1092.         bpl.s    okcmd            ; cmd found
  1093.         bsr.s    findalias
  1094.         tst.l    d2
  1095.         bmi.s    nm0            ; no alias
  1096. okcmd        clr.w    procnum(a4)
  1097.         adda.w    d1,a0
  1098.         bsr    kllblnks
  1099.         lea    cmdaddr(pc),a1
  1100.         lsl.w    #2,d2
  1101.         jsr     0(a1,d2.w)
  1102.         bra.s    nomore
  1103.  
  1104. nm0        moveq    #10,d1            ; LineFeed
  1105.         lea    in(a4),a1
  1106.         lea    buffer(a4),a2
  1107.         movem.l    a1/a2,-(sp)        ; store for later use
  1108. nm1        move.b    (a1),(a2)+        ; in -> buffer
  1109.         cmp.b    (a1)+,d1        ; LF ?
  1110.         bne.s    nm1
  1111.         move.l    (sp)+,a1
  1112. nm2        move.b    (a0),(a1)+        ; cmd -> in
  1113.         cmp.b    (a0)+,d1        ; LF ?
  1114.         bne.s    nm2
  1115.         move.l    (sp)+,a1
  1116.         lea    dummy(a4),a2
  1117. nm3        move.b    (a1),(a2)+        ; buffer -> dummy
  1118.         cmp.b    (a1)+,d1        ; LF ?
  1119.         bne.s    nm3
  1120.         clr.w    cmdptr(a4)
  1121.         bra    showwhat
  1122.  
  1123. findcmd        move.l    a0,-(sp)
  1124.         bsr    strbuf
  1125.         lea    commds(a4),a2
  1126.         moveq    #0,d2
  1127. 1$        lea    buffer(a4),a0
  1128.         move.l    a2,a1
  1129.         bsr    strcmp
  1130.         beq.s    3$
  1131. 2$        tst.b    (a2)+
  1132.         bne.s    2$
  1133.         addq.w    #1,d2
  1134.         cmp.w    #cmdnum,d2
  1135.         bne.s    1$
  1136.         moveq    #-1,d2
  1137. 3$        move.l    (sp)+,a0
  1138.         rts
  1139.  
  1140. findalias    move.l    a0,-(sp)
  1141.         lea    aliaslist(a4),a2
  1142. 1$        move.l    0(a2),d2
  1143.         move.l    d2,a2
  1144.         beq.s    3$
  1145.         lea    buffer(a4),a0
  1146.         lea    5(a2),a1
  1147.         move.b    4(a2),d2
  1148.         ext.w    d2
  1149.         ext.l    d2
  1150.         bsr    strcmp
  1151.         beq.s    4$
  1152.         bra.s    1$
  1153. 3$        moveq    #-1,d2
  1154. 4$        move.l    (sp)+,a0
  1155.         rts
  1156.  
  1157. subs        bra    showtask
  1158.         bra    showaddr
  1159.         bra    showdevs
  1160.         bra    showlibs
  1161.         bra    showres
  1162.         bra    showresi
  1163.         bra    showmem
  1164.         bra    showprt
  1165.         bra    showint
  1166.         bra    stack
  1167.         bra    clicomm
  1168.         bra    tasktime
  1169.         bra    semaphores
  1170. cmdaddr     bra    settime
  1171.         bra    taskpri
  1172.         bra    info
  1173.         bra    pri
  1174.         bra    flush
  1175.         bra    freeze
  1176.         bra    warm
  1177.         bra    signal
  1178.         bra    break
  1179.         bra    alert
  1180.         bra    lastalert
  1181.         bra    instback
  1182.         bra    exitall
  1183.         bra    clear
  1184.         bra    cancel
  1185.         bra    taskports
  1186.         bra    hunks
  1187.         bra    devices
  1188.         bra    openlib
  1189.         bra    closelib
  1190.         bra    currentdir
  1191.         bra    cd
  1192.         bra    mypri
  1193.         bra    openfiles
  1194.         bra    locks
  1195.         bra    unlock
  1196.         bra    screens
  1197.         bra    windows
  1198.         bra    closescreen
  1199.         bra    closewindow
  1200.         bra    fonts
  1201.         bra    windowfonts
  1202.         bra    lockdrive
  1203.         bra    freedrive
  1204.         bra    capture
  1205.         bra    clrcold
  1206.         bra    clrcool
  1207.         bra    clrwarm
  1208.         bra    snoop
  1209.         bra    usage
  1210.         bra    inputhandler
  1211.         bra    nohead
  1212.         bra    sort
  1213.         bra    hide
  1214.         bra    hidden
  1215.         bra    setwindow
  1216.         bra    cancel
  1217.         bra    icongad
  1218.         bra    historylines
  1219.         bra    historylength
  1220.         bra    showhistory
  1221.         bra    repeatcmd
  1222.         bra    remresident
  1223.         bra    saveoutput
  1224.         bra    killhistory
  1225.         bra    iconbackdrp
  1226.         bra    setfont
  1227.         bra    trapguru
  1228.         bra    outputlines
  1229.         bra    usescreen
  1230.         bra    usewindow
  1231.         bra    usetopaz
  1232.         bra    grabtimerio
  1233.         bra    dchange
  1234.         bra    alias
  1235.         bra    remnode
  1236.         bra    setfkey
  1237.         bra    clicmd
  1238.         bra    taskinfo
  1239.         bra    coldreboot
  1240.         bra    reboot
  1241.         bra    zerotimer
  1242.         bra    propgad
  1243.         bra    iconpos
  1244.         bra    remport
  1245.         bra    remintserver
  1246.         bra    frags
  1247.         bra    tracefiles
  1248.         bra    tracelocks
  1249.         bra    cxhandler
  1250.         bra    cxpopkey
  1251.         bra    pubscreens
  1252.         bra    smartpatch
  1253.  
  1254. ;------ Task-Structures-----
  1255.  
  1256. tasktime    moveq    #-1,d0
  1257.         bra.s    startask
  1258. showaddr    moveq    #0,d0
  1259.         bra.s    startask
  1260. showtask    moveq    #1,d0
  1261. startask    move.b    d0,tasktyp(a4)
  1262.         bsr    getdevhan
  1263.         tst.b    headon(a4)
  1264.         beq.s    noheader1
  1265.         move.w    #infoh1,d0
  1266.         bsr    putstrw
  1267.         move.l    sysbase(a4),a6
  1268.         move.w    296(a6),d1        ; AttnFlags
  1269.         move.w    #cpu4,d0
  1270.         btst    #3,d1            ; mc 68040
  1271.         bne.s    cpupr
  1272.         subq.w    #cpu4-cpu3,d0
  1273.         btst    #2,d1            ; mc 68030 ?
  1274.         bne.s    cpupr
  1275.         subq.w    #cpu3-cpu2,d0
  1276.         btst    #1,d1            ; mc 68020 ?
  1277.         bne.s    cpupr
  1278.         subq.w    #cpu2-cpu1,d0
  1279.         btst    #0,d1            ; mc 68010 ?
  1280.         bne.s    cpupr
  1281.         subq.w    #cpu1-cpu0,d0        ; mc 68000
  1282. cpupr        bsr    putstrw
  1283.         move.l    d0,d1
  1284.         move.w    #cpu6,d0
  1285.         btst    #5,297(a6)        ; mc 68882 ?
  1286.         bne.s    fpupr
  1287.         move.l    d1,d0
  1288.         btst    #4,297(a6)        ; mc 68881 ?
  1289.         beq.s    no881
  1290.         subq.w    #cpu6-cpu5,d0
  1291. fpupr        bsr    putstrw
  1292. no881        moveq    #20,d1
  1293.         bsr    tab
  1294.         move.w    #infoh3,d0
  1295.         bsr    putstrw
  1296.  
  1297. noheader1    moveq    #1,d5
  1298.         bsr    getaskdat
  1299.         move.l    a5,savedat(a4)
  1300.         bsr    getstdio
  1301.  
  1302.         lea    usedtime(a4),a0
  1303.         moveq    #0,d4
  1304.         moveq    #0,d3
  1305.         move.l    idletask(a4),d2
  1306.         moveq    #0,d1
  1307.         move.b    entries(a4),d1
  1308.         subq.w    #1,d1
  1309. 1$        lea    -16(a5),a5
  1310.         move.l    12(a5),d5
  1311.         add.l    d5,d4
  1312.         move.l    0(a5),d0
  1313.         cmp.l    d0,d2
  1314.         bne.s    2$
  1315.         move.l    d5,d3
  1316. 2$        bsr    gettimeentry
  1317.         add.l    d5,0(a0,d0.w)
  1318.         dbra    d1,1$
  1319.         move.l    d4,maxdisp(a4)
  1320.         sub.l    d3,d4
  1321.         move.l    d4,dispatches(a4)
  1322.  
  1323.         tst.b    headon(a4)
  1324.         beq.s    noheader2
  1325.         move.l    maxdisp(a4),d0
  1326.         move.l    dispatches(a4),d3
  1327.         bsr    prcent
  1328.         bsr    newline
  1329.         move.w    #infoh2,d0
  1330.         bsr    putstrw
  1331.  
  1332. noheader2    move.l    sysbase(a4),a0
  1333.         move.l    284(a0),d0        ; DispCount
  1334.         move.l    oldswitches(a4),d1
  1335.         move.l    d0,oldswitches(a4)
  1336.         sub.l    d1,d0
  1337.         tst.b    headon(a4)
  1338.         beq.s    noheader3
  1339.         mulu    #100,d0
  1340.         move.l    d0,-(sp)
  1341.         lea    secs(a4),a0
  1342.         lea    mics(a4),a1
  1343.         CALL    CurrentTime,intuibase(a4)
  1344.         move.l    secs(a4),d3
  1345.         lsl.l    #1,d3
  1346.         move.l    d3,d1
  1347.         lsl.l    #2,d3
  1348.         add.l    d1,d3
  1349.         move.l    mics(a4),d0
  1350.         move.l    #100000,d1
  1351.         bsr    div
  1352.         add.l    d0,d3
  1353.         move.l    time10(a4),d1
  1354.         move.l    d3,time10(a4)
  1355.         sub.l    d1,d3
  1356.         move.l    (sp)+,d0
  1357.         move.l    d3,-(sp)
  1358.         move.l    d3,d1
  1359.         bsr    div
  1360.         moveq    #1,d5
  1361.         bsr    putfrac
  1362.  
  1363.         moveq    #20,d1
  1364.         bsr    tab
  1365.         move.w    #infoh7,d0
  1366.         bsr    putstrw
  1367.         move.l    iocount(a4),d0
  1368.         clr.l    iocount(a4)
  1369.         mulu    #100,d0
  1370.         move.l    (sp)+,d3
  1371.         move.l    d3,d1
  1372.         bsr    div
  1373.         moveq    #1,d5
  1374.         bsr    putfrac
  1375.  
  1376.         bsr    newline
  1377.         bsr    newline
  1378.  
  1379. noheader3    lea    t4header(a4),a0
  1380.         tst.b    tasktyp(a4)
  1381.         bmi.s    phedder
  1382.         lea    theader(a4),a0
  1383.         tst.b    tasktyp(a4)
  1384.         bne.s    phedder
  1385.         lea    t2header(a4),a0
  1386.         move.l    sysbase(a4),a6
  1387.         btst    #4,297(a6)        ; AttnFlags FPU ?
  1388.         bne.s    phedder
  1389.         lea    t3header(a4),a0
  1390. phedder     bsr    puthead
  1391.         move.l    savedat(a4),a5
  1392.  
  1393. pt1        tst.b    entries(a4)
  1394.         beq    pt2
  1395.         lea    -16(a5),a5
  1396.         bsr    hideit
  1397.         beq    ptend
  1398.         move.l    0(a5),a3
  1399.         cmp.l    idletask(a4),a3
  1400.         beq    ptend
  1401.         move.l    a3,node(a4)        ; ID = task address
  1402.         move.l    a3,d0
  1403.         bsr    hexa
  1404.         tst.b    tasktyp(a4)
  1405.         ble.s    pt12
  1406.         moveq    #0,d0
  1407.         move.b    8(a3),d0
  1408.         bsr    gettype
  1409.  
  1410. pt12        moveq    #0,d0
  1411.         move.b    9(a5),d0
  1412.         subq.w    #1,d0
  1413.         mulu    #9,d0
  1414.         move.w    #status,d1
  1415.         add.w    d1,d0
  1416.         bsr    putstrw            ; state
  1417.         tst.b    tasktyp(a4)
  1418.         beq.s    pt345
  1419.         bpl    pt13
  1420.  
  1421.         move.l    0(a5),d0        ; for usage !
  1422.         bsr    gettimeentry
  1423.         lea    taskstamps(a4),a0
  1424.         lea    0(a0,d0.w),a0
  1425.         move.l    secs(a4),d0
  1426.         sub.l    0(a0),d0
  1427.         bsr    putstamp
  1428.         bsr    putblank
  1429.         move.l    usedtime-taskstamps(a0),d0
  1430.         move.l    timerticks(a4),d1
  1431.         bsr    div
  1432.         bsr    putstamp
  1433.         moveq    #'.',d0
  1434.         bsr    putchar
  1435.         move.l    d1,d0
  1436.         move.l    timerticks(a4),d1
  1437.         addq.w    #5,d1
  1438.         divu    #10,d1
  1439.         divu    d1,d0
  1440.         or.b    #'0',d0
  1441.         bsr    putchar
  1442.         bsr    putblank
  1443.         bra    pt346
  1444.  
  1445. pt345        move.l    18(a3),d0        ; SigAlloc
  1446.         bsr    hexa
  1447.         move.w    #longnix,d0
  1448.         cmp.b    #4,9(a5)        ; tc_state waiting ?
  1449.         beq.s    pt14
  1450.         bsr    putstrw
  1451.         bra.s    pt15
  1452.  
  1453. pt14        move.l    22(a3),d0        ; SigWait
  1454.         bsr    hexa
  1455. pt15        move.l    26(a3),d0        ; SigRecvd
  1456.         bsr    hexa
  1457.  
  1458.         move.w    #nofpu,d1        ; keine fpu annehmen
  1459.         move.l    sysbase(a4),a6
  1460.         btst    #4,297(a6)        ; AttnFlags FPU ?
  1461.         beq.s    prt154
  1462.         move.w    #nullstate,d1        ; fpu im null state annehmen
  1463. prt154        lea    prt154(pc),a1
  1464.         move.l    a1,d0
  1465.         cmp.b    #2,9(a5)        ; tc_state running ?
  1466.         beq.s    pt16            ; kann nur xoper selbst sein
  1467.  
  1468.         moveq    #0,d0            ; 0(sp) -> pc wenn keine fpu
  1469.         move.l    54(a3),a1        ; tc_SPReg
  1470.         btst    #4,297(a6)        ; AttnFlags FPU
  1471.         beq.s    prt151            ; keine FPU
  1472.  
  1473.         tst.b    (a1)            ; NULL frame ?
  1474.         beq.s    prt150            ; ja
  1475.  
  1476.         move.w    (a1),d0            ; frame flag / format word
  1477.         lea    110(a1),a1        ; offset fuer fpu regs
  1478.         cmp.w    #-1,d0
  1479.         beq.s    prt153
  1480.         lea    12(a1),a1        ; 3 longs mehr
  1481.  
  1482. prt153        moveq    #0,d0
  1483.         move.b    1(a1),d0        ; frame size
  1484.         move.l    4(a1,d0.w),d0        ; pc
  1485.  
  1486.         move.w    #idle,d1
  1487.         cmp.b    #$18,1(a1)        ; mc 68881 idle ?
  1488.         beq.s    pt16
  1489.         addq.w    #busy-idle,d1
  1490.         cmp.b    #$b4,1(a1)        ; mc 68881 busy ?
  1491.         beq.s    pt16
  1492. prt152        addq.w    #weissnicht-busy,d1    ; vielleicht mc 68882 ??
  1493.         bra.s    pt16
  1494.  
  1495. prt150        moveq    #4,d0            ; offset NULL frame
  1496. prt151        move.l    0(a1,d0.w),d0        ; n(sp) -> pc
  1497.  
  1498. pt16        bsr    hexa
  1499.  
  1500.         move.l    sysbase(a4),a6
  1501.         btst    #4,297(a6)        ; AttnFlags FPU ?
  1502.         beq.s    pt4
  1503.  
  1504.         move.w    d1,d0            ; fpu state
  1505.         bsr    putstrw
  1506.         bra.s    pt4
  1507.  
  1508. pt13        move.b    10(a5),d3        ; tc_Pri
  1509.         bsr    plusmins
  1510.  
  1511.         move.l    dispatches(a4),d0
  1512.         tst.b    useageon(a4)
  1513.         beq.s    pt37
  1514.         move.l    maxdisp(a4),d0
  1515. pt37        move.l    12(a5),d3
  1516.         bsr    prcent
  1517.  
  1518. pt346        cmpi.b    #13,8(a5)        ; num
  1519.         bne.s    noproc
  1520.         tst.l    172(a3)
  1521.         beq.s    noproc
  1522.         move.b    11(a5),d3
  1523.         bsr    bytedec
  1524.         bra.s    pt4
  1525. noproc        move.w    #nix,d0
  1526.         bsr    putstrw
  1527.  
  1528. pt4        bsr    gettaskname        ; taskname
  1529.  
  1530.         tst.b    tinfo(a4)
  1531.         beq    pt223
  1532.  
  1533.         tst.b    cliexec(a4)        ; display 'real' taskname if
  1534.         beq.s    10$             ; it is a CLI
  1535.         bsr    putblank
  1536.         move.l    4(a5),d0
  1537.         bsr    putstr
  1538.  
  1539. 10$        lea    tdtasks(a4),a1        ; a trackdisk.device ?
  1540.         moveq    #3,d3
  1541. 1$        cmp.l    (a1)+,a3
  1542.         dbeq    d3,1$
  1543.         bne.s    pt224
  1544.  
  1545.         eor.b    #'0'+3,d3        ; print unit#
  1546.         move.b    d3,unitmsg+8(a4)
  1547.         move.w    #unitmsg,d0
  1548.         bsr    putstrw
  1549.  
  1550. pt224        moveq    #0,d3            ; is it a device handler ?
  1551.         lea    buffer+2400(a4),a2
  1552.         lea    200(a2),a1
  1553.  
  1554. 1$        move.l    (a2)+,d0
  1555.         beq.s    pt222
  1556.         move.l    (a1)+,d2
  1557.         cmp.l    0(a5),d0
  1558.         bne.s    1$
  1559.  
  1560. 2$        move.l    #' {',d0        ; print dos devicename
  1561.         bsr    putlongascii
  1562.         move.l    d2,d0
  1563.         bsr    putbcpl
  1564.         move.l    #':}',d0
  1565.         bsr    putlongascii
  1566.  
  1567. pt222        lea    buffer+2160(a4),a1        ; is it a device handler for
  1568.         lea    160(a1),a2        ; some CLI input/output ?
  1569.         moveq    #0,d5
  1570.  
  1571. 3$        move.l    (a1)+,d0
  1572.         beq.s    4$
  1573.         move.w    (a2)+,d2
  1574.         cmp.l    0(a5),d0
  1575.         bne.s    3$
  1576.  
  1577.         tst.w    d5
  1578.         bne.s    5$
  1579.         move.l    #' (',d0        ; print CLI#
  1580.         bsr    putlongascii
  1581.         bra.s    6$
  1582. 5$        move.l    #'& ',d0
  1583.         bsr    putlongascii
  1584. 6$        moveq    #1,d5
  1585.         moveq    #'<',d0
  1586.         tst.w    d2
  1587.         bmi.s    7$
  1588.         moveq    #'>',d0
  1589. 7$        bsr    putchar
  1590.         move.l    #'CLI ',d0
  1591.         bsr    putlongascii
  1592.         moveq    #0,d0
  1593.         move.b    d2,d0
  1594.         moveq    #0,d3
  1595.         bsr    longdec
  1596.         bra.s    3$
  1597.  
  1598. 4$        tst.w    d5
  1599.         beq.s    pt223
  1600.         subq.l    #1,ptr(a4)
  1601.         moveq    #')',d0
  1602.         bsr    putchar
  1603.  
  1604. pt223        bsr    newline
  1605.  
  1606. ptend        subq.b    #1,entries(a4)
  1607.         bra    pt1
  1608. pt2        rts
  1609.  
  1610. getdevhan    tst.b    tinfo(a4)
  1611.         beq.s    4$
  1612.         move.l    a3,-(sp)
  1613.         bsr    devinfo
  1614.         moveq    #49,d3
  1615.         lea    buffer+2400(a4),a2
  1616.         lea    200(a2),a3
  1617. 1$        adda.l    a1,a1
  1618.         adda.l    a1,a1
  1619.         tst.l    4(a1)
  1620.         bne.s    3$
  1621.         move.l    8(a1),d0
  1622.         beq.s    3$
  1623.         moveq    #92,d1
  1624.         sub.l    d1,d0
  1625.         move.l    d0,(a2)+
  1626.         move.l    40(a1),(a3)+
  1627.         subq.w    #1,d3
  1628.         beq.s    2$
  1629. 3$        move.l    0(a1),d0
  1630.         beq.s    2$
  1631.         move.l    d0,a1
  1632.         bra.s    1$
  1633. 2$        clr.l    (a2)+
  1634.         move.l    (sp)+,a3
  1635. 4$        rts
  1636.  
  1637. getstdio    tst.b    tinfo(a4)
  1638.         beq.s    4$
  1639.         move.l    a5,-(sp)
  1640.         lea    buffer+2160(a4),a0
  1641.         lea    160(a0),a1
  1642.         moveq    #0,d3
  1643.         move.b    entries(a4),d3
  1644.         subq.w    #1,d3
  1645.         moveq    #40,d4
  1646. 3$        lea    -16(a5),a5
  1647.         cmpi.b    #13,8(a5)
  1648.         bne.s    1$
  1649.         RECALL    Forbid
  1650.         move.l    0(a5),a3
  1651.         move.b    143(a3),d2        ; pr_TaskNum
  1652.         ext.w    d2
  1653.         beq.s    2$
  1654.         move.l    172(a3),d0        ; pr_CLI
  1655.         beq.s    2$
  1656.         move.l    160(a3),d0        ; pr_COS
  1657.         beq.s    2$
  1658.         bsr.s    getstdio2
  1659.         or.w    #$8000,d2
  1660. 2$        move.l    156(a3),d0
  1661.         beq.s    6$
  1662.         bsr.s    getstdio2
  1663. 6$        RECALL    Permit
  1664.         tst.w    d4
  1665.         ble.s    7$
  1666. 1$        dbra    d3,3$
  1667. 7$        clr.l    (a0)+
  1668.         move.l    (sp)+,a5
  1669. 4$        rts
  1670.  
  1671. getstdio2    lsl.l    #2,d0
  1672.         move.l    d0,a2
  1673.         move.l    8(a2),d0        ; fh_Type
  1674.         ble.s    1$            ; negative = plain file
  1675.         move.l    d0,a2
  1676.         move.l    16(a2),d0        ; mp_SigTask
  1677.         beq.s    1$
  1678.         move.l    d0,(a0)+
  1679.         move.w    d2,(a1)+
  1680.         subq.w    #1,d4
  1681. 1$        rts
  1682.  
  1683. getaskdat    move.l    d5,-(sp)
  1684.         bsr.s    getaskdat2
  1685.         move.b    d5,entries(a4)
  1686.         move.l    (sp)+,d5
  1687.         beq.s    1$
  1688.         clr.w    tasksnum(a4)
  1689. 1$        moveq    #16,d2
  1690.         lea    -32(a5),a2
  1691.         bsr.s    sortlist
  1692.         rts
  1693.  
  1694. sortlist    tst.b    sorton(a4)
  1695.         beq.s    sort5
  1696.         lea    buffer(a4),a1
  1697. sort1        lea    0(a1,d2.w),a3
  1698. sort2        move.l    0(a1),d1
  1699.         cmp.l    0(a3),d1
  1700.         bge.s    sort3
  1701.         move.l    d2,d1
  1702.         subq.w    #1,d1
  1703. sort4        move.b    0(a3,d1.w),d0
  1704.         move.b    0(a1,d1.w),0(a3,d1.w)
  1705.         move.b    d0,0(a1,d1.w)
  1706.         dbra    d1,sort4
  1707. sort3        lea    0(a3,d2.w),a3
  1708.         cmp.l    a2,a3
  1709.         ble.s    sort2
  1710.         lea    0(a1,d2.w),a1
  1711.         cmp.l    a2,a1
  1712.         bne.s    sort1
  1713. sort5        rts
  1714.  
  1715. getaskdat2    move.l    sysbase(a4),a6
  1716.         lea    buffer(a4),a5
  1717. getaskdat3    moveq    #0,d5
  1718.         move.w    #$4000,$dff09a
  1719.         lea    stplist(a4),a3
  1720.         bsr.s    putlist
  1721.         lea    420(a6),a3        ; SysBase->TaskWait
  1722.         bsr.s    putlist
  1723.         lea    406(a6),a3        ; SysBase->TaskReady
  1724.         bsr.s    putlist
  1725.         move.l    276(a6),a3        ; SysBase->ThisTask
  1726.         bsr.s    putdata
  1727. 1$        move.w  #$C000,$dff09a
  1728.         rts
  1729.  
  1730. putlist        move.l    0(a3),a3
  1731.         tst.l    0(a3)
  1732.         beq.s    endlist
  1733.         bsr.s    putdata
  1734.         bra.s    putlist
  1735. endlist     rts
  1736.  
  1737. putdata     move.l    a3,(a5)+        ;  +0 = task node
  1738.         move.l    10(a3),(a5)+        ;  +4 = task->ln_Name
  1739.         move.b    8(a3),(a5)+        ;  +8 = task->ln_Type
  1740.         move.b    15(a3),(a5)+        ;  +9 = task->tc_State
  1741.         move.b    9(a3),(a5)+        ; +10 = task->ln_Pri
  1742.         move.b    143(a3),(a5)+        ; +11 = Process->pr_Tasknum
  1743.         move.w    tasksnum(a4),d0
  1744.         lea    cputime(a4),a0
  1745.         bra.s    pua2
  1746. pua3        move.l    500(a0),d1
  1747.         cmp.l    (a0)+,a3
  1748.         beq.s    pua1
  1749. pua2        dbra    d0,pua3
  1750.         moveq    #0,d1
  1751. pua1        move.l    d1,(a5)+        ; +12 = task time
  1752.         addq.w    #1,d5
  1753.         rts
  1754.  
  1755. alloctaskbuf    move.l    #2800,d0
  1756.         moveq    #0,d1
  1757.         CALL    AllocMem,sysbase(a4)
  1758.         move.l    d0,a5
  1759.         move.l    a5,d0
  1760.         beq.s    1$
  1761.         move.l    d0,-(sp)
  1762.         bsr    getaskdat3
  1763.         move.l    (sp)+,d0
  1764. 1$        rts
  1765.  
  1766. freetaskbuf    move.l    a5,a1
  1767.         move.l    #2800,d0
  1768.         CALL    FreeMem,sysbase(a4)
  1769.         rts
  1770.  
  1771. cleanuptimers    bsr.s    alloctaskbuf
  1772.         beq.s    2$
  1773.         moveq    #0,d1
  1774.         lea    taskstampid(a4),a1
  1775. 1$        lea    -16(a5),a5
  1776.         move.l    0(a5),d0
  1777.         bsr.s    gettimeentry
  1778.         lea    taskstampid(a4),a3
  1779.         lea    0(a3,d0.w),a3
  1780.         move.l    0(a3),d2
  1781.         move.l    0(a1),0(a3)
  1782.         move.l    d2,(a1)
  1783.         move.l    taskstamps-taskstampid(a3),d2
  1784.         move.l    taskstamps-taskstampid(a1),taskstamps-taskstampid(a3)
  1785.         move.l    d2,taskstamps-taskstampid(a1)
  1786.         move.l    usedtime-taskstampid(a3),d2
  1787.         move.l    usedtime-taskstampid(a1),usedtime-taskstampid(a3)
  1788.         move.l    d2,usedtime-taskstampid(a1)
  1789.         addq.l    #4,a1
  1790.         addq.w    #1,d1
  1791.         subq.b    #1,d5
  1792.         bne.s    1$
  1793.         move.w    d1,numtaskstimed(a4)
  1794.         bsr.s    freetaskbuf
  1795. 2$        rts
  1796.  
  1797. gettimeentry    movem.l    d1/a0/a1,-(sp)
  1798.         lea    taskstampid(a4),a1
  1799.         lea    4(a1),a0
  1800.         move.w    numtaskstimed(a4),d1
  1801.         subq.w     #1,d1
  1802. 1$        cmp.l    (a1)+,d0
  1803.         dbeq    d1,1$
  1804.         sub.l    a0,a1
  1805.         move.l    a1,d0
  1806.         movem.l    (sp)+,d1/a0/a1
  1807.         rts
  1808.  
  1809. getaskname2    movem.l    a3/a5,-(sp)
  1810.         link    a2,#-10
  1811.         move.l    sp,a5
  1812.         move.l    d0,a3
  1813.         tst.l    d0
  1814.         bne.s    2$
  1815.         bsr    putstr
  1816.         bra.s    1$
  1817. 2$        move.b    8(a3),8(a5)
  1818.         move.l    10(a3),4(a5)
  1819.         bsr.s    gettaskname
  1820. 1$        unlk    a2
  1821.         movem.l    (sp)+,a3/a5
  1822.         rts
  1823.  
  1824. gettaskname    movem.l    a1-a2,-(sp)
  1825.         clr.b    cliexec(a4)
  1826.         tst.b    cmdcli(a4)
  1827.         beq.s    2$
  1828.         cmpi.b    #13,8(a5)
  1829.         bne.s    2$
  1830.  
  1831.         CALL    Forbid,sysbase(a4)
  1832.         tst.l    140(a3)            ; pr_TaskNum
  1833.         beq.s    1$
  1834.         move.l    172(a3),d0        ; pr_CLI
  1835.         beq.s    1$
  1836.         lsl.l    #2,d0
  1837.         move.l    d0,a2
  1838.         tst.l    60(a2)            ; cli_Module
  1839.         beq.s    1$
  1840.         move.l    16(a2),a1
  1841.         adda.l    a1,a1
  1842.         adda.l    a1,a1
  1843.         tst.b    0(a1)
  1844.         beq.s    1$
  1845.         move.w    #openbrak,d0
  1846.         bsr    putstrw
  1847.         move.l    16(a2),d0        ; cli_CommandName
  1848.         bsr    putbcpl
  1849.         RECALL    Permit
  1850.         st    cliexec(a4)
  1851.         move.w    #closebrak,d0
  1852.         movem.l    (sp)+,a1-a2
  1853.         bra    putstrw
  1854.  
  1855. 1$        RECALL    Permit            ; a6 - still SysBase
  1856. 2$        move.l    4(a5),d0
  1857.         movem.l    (sp)+,a1-a2
  1858.         bra    putstr
  1859.  
  1860. gettype        moveq    #$f,d1
  1861.         and.l    d1,d0
  1862.         mulu    #11,d0
  1863.         add.w    #type,d0
  1864.         bra    putstrw
  1865.  
  1866. *-------- mem-hunks ------------
  1867.  
  1868. showmem        lea    mheader(a4),a0
  1869.         bsr    puthead
  1870.         move.l    sysbase(a4),a5
  1871.         lea    322(a5),a5        ; SysBase->MemList
  1872.         moveq    #0,d5
  1873. mem1        move.l    0(a5),a5        ; MemList->ln_Next
  1874.         tst.l    0(a5)
  1875.         beq.s    mem2
  1876.         move.l    20(a5),d0        ; MemHeader->mh_Lower
  1877.         bsr    hexa
  1878.         move.l    24(a5),d0        ; MemHeader->mh_Upper
  1879.         bsr    hexa
  1880.         move.l    28(a5),d0        ; MemHeader->mh_Free
  1881.         add.l    d0,d5
  1882.         moveq    #1,d3
  1883.         bsr    longdec
  1884.         move.w    14(a5),d0        ; MemHeader->mh_Attributes
  1885.         bsr    gthex
  1886.         addq.l    #3,d0
  1887.         move.l    d0,a0
  1888.         move.b    #'$',(a0)
  1889.         bsr    putstr
  1890.         move.b    9(a5),d3        ; MemHeader->ln_pri
  1891.         bsr    plusmins
  1892.         move.l    10(a5),d0        ; MemHeader->ln_Name
  1893.         move.l    a5,node(a4)
  1894.         bsr    putnam
  1895.         bra.s    mem1
  1896. mem2        move.w    #infoh6,d0
  1897.         bsr    putstrw
  1898.         moveq    #19,d1
  1899.         bsr    tab
  1900.         move.l    d5,d0
  1901.         moveq    #0,d3
  1902.         bsr    longdec
  1903.         bra    newline
  1904.  
  1905. frags        move.l    sysbase(a4),a5
  1906.         lea    322(a5),a5        ; SysBase->MemList
  1907. 1$        move.l    0(a5),a5        ; MemList->ln_Next
  1908.         tst.l    0(a5)
  1909.         bne.s    10$
  1910.         rts
  1911. 10$        move.w    #memtyp,d0
  1912.         bsr    putstrw
  1913.         move.l    10(a5),d0
  1914.         bsr    putnam
  1915.         lea    fraghead(a4),a0
  1916.         bsr    puthead
  1917.         lea    buffer(a4),a1
  1918.         move.l    a1,a2
  1919.         moveq    #64,d0
  1920. 9$        clr.l    (a2)+
  1921.         dbra    d0,9$
  1922.         lea    128(a1),a2
  1923.         lea    16(a5),a3        ; MemHeader->mh_First
  1924.  
  1925.         CALL    Forbid,sysbase(a4)
  1926. 2$        move.l    0(a3),d0
  1927.         beq.s    5$
  1928.         move.l    d0,a3
  1929.         move.l    4(a3),d0
  1930.         move.l    d0,d5
  1931.         moveq    #31,d1
  1932. 3$        add.l    d0,d0
  1933.         btst.l    #31,d0
  1934.         dbne    d1,3$
  1935.         lsl.l    #2,d1
  1936.         addq.l    #1,0(a1,d1.w)
  1937.         cmp.l    0(a2,d1.w),d5
  1938.         ble.s    2$
  1939.         move.l    d5,0(a2,d1.w)
  1940.         bra.s    2$
  1941. 5$        CALL    Permit,sysbase(a4)
  1942.  
  1943.         moveq    #0,d1
  1944. 8$        move.l    (a2)+,d5
  1945.         move.l    (a1)+,d2
  1946.         beq.s    6$
  1947.         moveq    #0,d0
  1948.         bset.l    d1,d0
  1949.         lsr.l    #1,d0
  1950.         move.l    d0,d4
  1951.         bsr    hexa
  1952.         move.l    d4,d0
  1953.         moveq    #1,d3
  1954.         bsr    longdec
  1955.         move.l    d2,d0
  1956.         bsr    longdec
  1957.         move.l    d5,d0
  1958.         bsr    longdec
  1959. 7$        bsr    newline
  1960. 6$        addq.w    #1,d1
  1961.         cmp.w    #31,d1
  1962.         ble.s    8$
  1963.         bsr    newline
  1964.         bra    1$
  1965.  
  1966. *-------- Task-Stack ------------
  1967.  
  1968. stack        lea    stackhead(a4),a0
  1969.         bsr    puthead
  1970.         moveq    #0,d5
  1971.         bsr    getaskdat
  1972.         bra.s    sta4
  1973. sta1        lea    -16(a5),a5
  1974.         bsr    hideit
  1975.         beq.s    sta4
  1976.         moveq    #1,d3            ; longdec right justified
  1977.         move.l    0(a5),a1
  1978.         cmp.l    idletask(a4),a1
  1979.         beq.s    sta4
  1980.         cmp.b    #13,8(a1)        ; task->ln_Type
  1981.         bne.s    sta2
  1982.         move.l    172(a1),d0        ; pr_CLI
  1983.         beq.s    sta2
  1984.         lsl.l    #2,d0
  1985.         move.l    d0,a0
  1986.         tst.l    60(a0)            ; cli_Module
  1987.         beq.s    sta2
  1988.         move.l    52(a0),d4         ; cli_DefaultStack
  1989.         lsl.l    #2,d4
  1990.         move.l    176(a1),d0        ; pr_ReturnAddress
  1991.         sub.l    d4,d0
  1992.         bsr    hexa
  1993.         move.l    d4,d0
  1994.         bsr    longdec
  1995.         move.l    176(a1),d0        ; pr_ReturnAddress
  1996.         sub.l    54(a1),d0        ; tc_SPReg
  1997.         bra.s    sta3
  1998.  
  1999. sta2        move.l    58(a1),d0        ; tc_SPLower
  2000.         bsr    hexa
  2001.         moveq    #1,d3
  2002.         move.l    62(a1),d0        ; tc_SPUpper
  2003.         sub.l    58(a1),d0        ; tc_SPLower
  2004.         bsr    longdec
  2005.         move.l    62(a1),d0        ; tc_SPUpper
  2006.         sub.l    54(a1),d0        ; tc_SPReg
  2007. sta3        bsr    longdec
  2008.         move.l    a1,a3
  2009.         bsr    gettaskname
  2010.         bsr    newline
  2011. sta4        subq.b    #1,entries(a4)
  2012.         bcc.s    sta1            ; more entries
  2013.         rts
  2014.  
  2015. clicomm        lea    clicomhead(a4),a0
  2016.         bsr    puthead
  2017.         moveq    #0,d5
  2018.         bsr    getaskdat
  2019.         bra    clic0
  2020. clic1        lea    -16(a5),a5
  2021.         bsr    hideit
  2022.         beq    clic0
  2023.         move.l    0(a5),a2
  2024.         cmpi.b    #13,8(a2)        ; ln_Type
  2025.         bne    clic0
  2026.         tst.l    172(a2)
  2027.         beq    clic0
  2028.         move.l    140(a2),d3        ; pr_TaskNum
  2029.         beq     clic0
  2030.         move.l    a2,d0
  2031.         move.l    d0,node(a4)
  2032.         bsr    hexa
  2033.         moveq     #0,d0
  2034.         move.b    9(a5),d0
  2035.         subq.w    #1,d0
  2036.         mulu    #9,d0
  2037.         add.w    #status,d0
  2038.         bsr    putstrw
  2039.         move.l    172(a2),a3        ; pr_CLI
  2040.         adda.l    a3,a3
  2041.         adda.l    a3,a3
  2042.         move.w    #script,d0
  2043.         tst.l    40(a3)            ; cli_InterActive
  2044.         beq.s    clic5
  2045.         addq.w    #interact-script,d0
  2046. clic5        bsr    putstrw
  2047.         move.w    #backg,d0
  2048.         tst.l    44(a3)            ; cli_Background
  2049.         bne.s    clic6
  2050.         addq.w    #foreg-backg,d0
  2051. clic6        bsr    putstrw
  2052.         bsr    bytedec
  2053.         move.l    4(a5),d0
  2054.         bsr    putstr
  2055.         moveq    #49,d1
  2056.         bsr    tab
  2057.         bsr    putblank
  2058.         move.l    128(a2),d0        ; pr_SegList
  2059.         beq.s    noprogloadc
  2060. clic3        move.l    172(a2),d1        ; pr_CLI
  2061.         bne.s    clic4
  2062. noprogloadc    move.w    #longnix,d0
  2063.         bsr     putnamw
  2064.         bra.s    clic0
  2065. clic4        lsl.l    #2,d1
  2066.         move.l    d1,a2
  2067.         move.l    60(a2),d1        ; cli_Module
  2068.         beq.s    noprogloadc
  2069.         move.l    16(a2),d0        ; cli_CommandName
  2070.         bsr    putbcpl
  2071.         move.l    36(a2),d1        ; cli_CommandFile
  2072.         beq.s    1$
  2073.         move.l    d1,d2
  2074.         lsl.l    #2,d1
  2075.         move.l    d1,a0
  2076.         tst.b    0(a0)
  2077.         beq.s    1$
  2078.         bsr     putblank
  2079.         move.w    #openbrak,d0
  2080.         bsr    putstrw
  2081.         move.l    d2,d0
  2082.         bsr    putbcpl
  2083.         move.w    #closebrak,d0
  2084.         bsr    putstrw
  2085. 1$        bsr    newline
  2086.  
  2087. clic0        subq.b    #1,entries(a4)
  2088.         bcc    clic1
  2089. clic8        rts
  2090.  
  2091. *--------- interrupts ------------
  2092. showint        lea    iheader(a4),a0
  2093.         bsr    puthead
  2094.         lea    intnames(a4),a5
  2095.         lea    inttyp(a4),a1
  2096.         moveq    #0,d6
  2097. findint        moveq    #0,d1
  2098.         lea    inttyp(a4),a1
  2099.         moveq    #15,d5
  2100.         move.l    sysbase(a4),a3
  2101.         lea    84(a3),a3        ; SysBase->IntVects[16]
  2102. si0        tst.b    0(a1,d1.w)
  2103.         bne.s    si4
  2104.         move.l    8(a3),a2        ; IntVector->iv_Node
  2105.         bra.s    si5
  2106. si4        move.l    0(a3),a2        ; Interrupt->is_Node
  2107. si5        move.l    a2,d0
  2108.         beq    nxtint
  2109.         tst.b    0(a1,d1.w)
  2110.         beq.s    si1
  2111. si2        move.l    0(a2),a2        ; is_Node->ln_Next
  2112.         tst.l    0(a2)
  2113.         beq    nxtint
  2114. si1        tst.w    d6
  2115.         beq.s    3$
  2116.         cmp.l    a2,d4
  2117.         bne.s    4$
  2118.         rts
  2119. 3$        move.l    a2,node(a4)
  2120.         move.l    a2,d0
  2121.         bsr    hexa
  2122.         move.l    14(a2),d0        ; Interrupt->is_Data
  2123.         bsr    hexan
  2124.         move.l    18(a2),d0        ; Interrupt->is_Code
  2125.         bsr    hexan
  2126.         move.b    9(a2),d3        ; Interrupt->ln_Pri
  2127.         movem.l    d6/a3,-(sp)
  2128.         bsr    plusmins
  2129.         move.w    #intserv,d0
  2130.         tst.b    0(a1,d1.w)
  2131.         bne.s    1$
  2132.         move.w    #inthand,d0
  2133. 1$        bsr    putstrw
  2134.         move.w    #intdis,d0
  2135.         move.w    $dff01c,d3
  2136.         btst.w    d1,d3
  2137.         beq.s    2$
  2138.         move.w    #inten,d0
  2139. 2$        bsr    putstrw
  2140.         movem.l    (sp)+,d6/a3
  2141.         move.l    a5,d0
  2142.         bsr    putstr
  2143.         move.l    10(a2),d0        ; Interrupt->ln_Name
  2144.         bsr    putnam
  2145.         tst.b    0(a1,d1.w)
  2146.         bne    si2
  2147. 4$        tst.l    0(a2)
  2148.         beq.s    nxtint
  2149.         move.l    0(a2),a2
  2150.         bra    si1
  2151. nxtint        addq.w    #1,d1
  2152.         lea    12(a5),a5
  2153.         lea    12(a3),a3
  2154.         dbra    d5,si0
  2155.         rts
  2156.  
  2157. *---------    resident ------------
  2158.  
  2159. showresi    lea    rheader(a4),a0
  2160.         bsr    puthead
  2161.         move.l    sysbase(a4),a5
  2162.         move.l    300(a5),a5        ; SysBase->ResModules
  2163. r1        move.l    (a5)+,d0        ; Resident->ln_Next
  2164.         beq.s    r2
  2165.         bpl.s    r3
  2166.         bclr    #31,d0
  2167.         movea.l    d0,a5
  2168.         bra.s    r1
  2169. r3        move.l    d0,node(a4)
  2170.         movea.l    d0,a3
  2171.         bsr    hexa
  2172.         move.b    13(a3),d3        ; rt_Pri
  2173.         bsr    plusmins
  2174.         move.b    10(a3),d0        ; rt_Flags
  2175.         bsr    bin
  2176.         move.b    11(a3),d3        ; rt_Version
  2177.         bsr    bytedec
  2178.         move.b    12(a3),d0        ; rt_Type
  2179.         bsr    gettype
  2180.         move.l    14(a3),d0        ; rt_Name
  2181.         bsr    putnam
  2182.         bra.s    r1
  2183. r2        rts
  2184.  
  2185. *---------  ports  -------------
  2186.  
  2187. showprt        lea    pheader(a4),a0
  2188.         bsr    puthead
  2189.         moveq    #0,d5
  2190.         lea    buffer(a4),a5
  2191.         move.l    a5,-(sp)
  2192.         CALL    Forbid,sysbase(a4)
  2193.         move.w    #$4000,$dff09a
  2194.         bsr.s    getprts
  2195.         move.w    #$C000,$dff09a
  2196.         RECALL    Permit
  2197.         move.l    (sp)+,a5        ; buffer
  2198.         bra.s    sp2
  2199. sp1        move.l    (a5)+,d0
  2200.         move.l    d0,node(a4)
  2201.         bsr    hexa
  2202.         move.l    (a5)+,d0
  2203.         bsr    putstr
  2204.         moveq    #25,d1
  2205.         bsr     tab
  2206.         bsr    putblank
  2207.         moveq    #3,d0
  2208.         and.b    (a5)+,d0
  2209.         mulu    #9,d0
  2210.         add.w    #mp_flags,d0
  2211.         bsr    putstrw
  2212.         lea    bytedec(pc),a0
  2213.         move.b    (a5)+,d3
  2214.         jsr    0(a0)            ; bytedec
  2215.         move.w    (a5)+,d3
  2216.         bpl.s    1$
  2217.         lea    putstrw(pc),a0
  2218.         move.w    #toomuch,d0
  2219. 1$        jsr    0(a0)            ; bytedec or putstrw
  2220.         move.l    (a5)+,d0
  2221.         bsr    getaskname2
  2222.         bsr    newline
  2223. sp2        subq.w    #1,d5
  2224.         bcc.s    sp1
  2225.         rts
  2226.  
  2227. getprts        lea    392(a6),a3        ; SysBase->PortList
  2228. sp3        move.l    0(a3),a3        ; mp_Node.ln_Next
  2229.         tst.l    0(a3)
  2230.         beq.s    sp4
  2231.         bsr.s    getpdata
  2232.         bra.s    sp3
  2233. sp4        tst.b    tports(a4)
  2234.         beq.s    sp6
  2235.         move.l    276(a6),a3        ; SysBase->ThisTask
  2236.         lea     92(a3),a3        ; Process->pr_MsgPort
  2237.         bsr.s    getpdata
  2238.         lea    406(a6),a2        ; SysBase->TaskReady
  2239.         bsr.s    sp5
  2240.         lea    420(a6),a2        ; SysBase->TaskWait
  2241. sp5        move.l    0(a2),a2
  2242.         tst.l    0(a2)
  2243.         beq.s    sp6
  2244.         lea     92(a2),a3        ; pr_MsgPort
  2245.         cmp.b    #13,8(a2)        ; ln_Type
  2246.         bne.s    sp5
  2247.         bsr.s    getpdata
  2248.         bra.s    sp5
  2249. sp6        rts
  2250.  
  2251. getpdata    move.l    a3,(a5)+
  2252.         move.l    10(a3),(a5)+        ;  +4 = ln_Name
  2253.         move.b    14(a3),(a5)+        ;  +8 = mp_Flags
  2254.         move.b    15(a3),(a5)+        ;  +9 = mp_SigBit
  2255.         moveq    #0,d0
  2256.         suba.l    a0,a0
  2257.         movea.l    20(a3),a1        ; mp_MsgList
  2258. sp7        movea.l    0(a1),a1
  2259.         cmpa.l    a0,a1
  2260.         beq.s    sp8
  2261.         addq.b    #1,d0
  2262.         bcc.s    sp7            ; <256
  2263.         subq.w    #1,d0
  2264. sp8        move.w    d0,(a5)+        ; +10 = msgcnt
  2265.         move.l    16(a3),(a5)+        ; +12 = mp_SigTask
  2266.         addq.w    #1,d5
  2267.         rts
  2268.  
  2269. *-------- resources ------------
  2270.  
  2271. showres        lea    resnam(a4),a3
  2272.         move.w    #336,d3            ; SysBase->ResourceList
  2273.         bra.s    show
  2274.  
  2275. *--------- devices  -------------
  2276.  
  2277. showdevs    lea    devnam(a4),a3
  2278.         move.w    #350,d3            ; SysBase->DeviceList
  2279.         bra.s    show
  2280.  
  2281. *-------- libraries -------------
  2282.  
  2283. showlibs    lea    libnam(a4),a3
  2284.         move.w    #378,d3            ; SysBase->LibList
  2285.  
  2286. show        lea    lheader(a4),a0
  2287.         bsr    puthead1
  2288.         move.l    a3,a0
  2289.         bsr    puthead2
  2290.         moveq    #0,d5
  2291.         lea    buffer(a4),a5
  2292.         move.l    a5,-(sp)
  2293.         CALL    Forbid,sysbase(a4)
  2294.         lea    0(a6,d3.w),a3
  2295. sl1        move.l    0(a3),a3        ; lib_Node.ln_Next
  2296.         tst.l    0(a3)
  2297.         beq.s    sl2
  2298.         move.l    a3,(a5)+
  2299.         move.b    33(a3),(a5)+        ; +4 = lib_OpenCnt
  2300.         move.b    21(a3),(a5)+        ; +5 = lib_Version
  2301.         move.b    23(a3),(a5)+        ; +6 = lib_Revision
  2302.         move.b    14(a3),(a5)+        ; +7 = lib_Flags
  2303.         move.l    10(a3),(a5)+        ; +8 = ln_Name
  2304.         addq.w    #1,d5
  2305.         bra.s    sl1
  2306. sl2        RECALL    Permit
  2307.         move.l    (sp)+,a5        ; buffer
  2308.         bra.s    sl4
  2309. sl3        move.l    (a5)+,d0
  2310.         move.l    d0,node(a4)
  2311.         bsr    hexa
  2312.         move.b    (a5)+,d3
  2313.         bsr    bytedec
  2314.         move.b    (a5)+,d3
  2315.         bsr    bytedec
  2316.         move.b    (a5)+,d3
  2317.         bsr    bytedec
  2318.         move.b    (a5)+,d0
  2319.         bsr    bin
  2320.         move.l    (a5)+,d0
  2321.         bsr    putnam
  2322. sl4        subq.w    #1,d5
  2323.         bcc.s    sl3            ; not ready
  2324.         rts
  2325.  
  2326. ;--------- Semaphores ---------
  2327. semaphores    lea    semhead(a4),a0
  2328.         bsr    puthead
  2329.         move.l    sysbase(a4),a3
  2330.         lea    532(a3),a3
  2331.         bsr.s    sema
  2332.         tst.b    post_V34(a4)
  2333.         bne.s    sema6
  2334.         move.l    intuibase(a4),a3
  2335.         lea    1010(a3),a3
  2336. sema        moveq    #0,d5            ; examine list
  2337.         lea    buffer(a4),a5
  2338.         move.l    a5,-(sp)
  2339.         move.w    #$4000,$dff09a
  2340. sema2        move.l    0(a3),a3
  2341.         tst.l    0(a3)
  2342.         beq.s    sema3
  2343.         move.l    a3,(a5)+
  2344.         move.l    $28(a3),(a5)+
  2345.         move.b    $2d(a3),(a5)+
  2346.         move.b    $f(a3),(a5)+
  2347.         move.l    10(a3),(a5)+
  2348.         addq.w    #1,d5
  2349.         bra.s     sema2
  2350. sema3        move.w    #$C000,$dff09a
  2351.         move.l    (sp)+,a5        ; buffer
  2352.         bra.s    sema5
  2353. sema4        move.l    (a5)+,d0
  2354.         bsr    hexa
  2355.         move.l    (a5)+,d0
  2356.         bsr    getaskname2
  2357.         moveq    #24,d1
  2358.         bsr    tab
  2359.         moveq    #1,d3
  2360.         add.b    (a5)+,d3
  2361.         bsr    plusmins
  2362.         move.b    (a5)+,d3
  2363.         bsr    plusmins
  2364.         move.l    (a5)+,d0
  2365.         bsr    putnam
  2366. sema5        subq.w    #1,d5
  2367.         bcc.s    sema4            ; not ready
  2368. sema6        rts
  2369.  
  2370. ; unlock a file
  2371.  
  2372. unlock        tst.l    infile(a4)
  2373.         bne.s    ul6
  2374.         bsr    readhex
  2375.         tst.b    d7
  2376.         beq    syntax
  2377.         move.l    d0,remembr(a4)
  2378.         move.l    d0,-(sp)
  2379.         moveq    #-1,d6
  2380.         bsr.s    of44
  2381.         tst.l    remembr(a4)
  2382.         beq.s     ul1
  2383.         move.w    #unlerr,d0
  2384.         bsr    putnamw
  2385.         bra.s    ul4
  2386. ul1        bsr    allocfinfo
  2387.         bsr    ResumeOutput
  2388.         move.w    #unl1,d0
  2389.         bsr    putstrw
  2390.         move.l    0(sp),d0
  2391.         bsr    getpath
  2392.         move.w    #unltxt2,d0
  2393.         bsr    putstrw
  2394.         bsr    readline
  2395.         cmp.b    #'y',d0
  2396.         bne.s     ul5
  2397.         move.l    0(sp),d1
  2398.         CALL    UnLock,dosbase(a4)
  2399. ul5        bsr    freefinfo
  2400. ul4        addq.l    #4,sp
  2401. ul6        rts
  2402.  
  2403. ;---------- Show all Locks------------
  2404.  
  2405. locks        moveq    #0,d6
  2406.         bra.s    of33
  2407.  
  2408. ;---------- Open Files-----------
  2409.  
  2410. openfiles    moveq    #1,d6
  2411. of33        lea    ofheader(a4),a0
  2412.         bsr    puthead
  2413. of44        bsr    allocfinfo
  2414.         bsr    devinfo            ; get pointer to devicelist
  2415.         move.l    a1,a3
  2416. of1        move.l    a3,devicelock(a4)
  2417.         adda.l    a3,a3
  2418.         adda.l    a3,a3
  2419.         moveq    #2,d2             ; 2 = DLT_VOLUME
  2420.         cmp.l    4(a3),d2        ; DeviceList->dl_Type 
  2421.         bne    of2
  2422.         lea    buffer(a4),a5
  2423.         move.l    a5,a1
  2424.         move.l    40(a3),a2        ; dl_Name
  2425.         adda.l    a2,a2
  2426.         adda.l    a2,a2
  2427.         move.b    (a2)+,d2
  2428.         bra.s    of23
  2429. of22        move.b    (a2)+,(a1)+        ; hack to access the 'RAM Disk'
  2430. of23        dbeq    d2,of22            ; as 'RAM:' as the system may
  2431.         bne.s    of24
  2432.         subq.w    #1,a1
  2433. of24        move.b  #':',(a1)+        ; GURU with KS1.2
  2434.         clr.b    0(a1)
  2435.         cmp.l    #'RAM ',0(a5)
  2436.         bne.s    of5
  2437.         cmp.l    #'Disk',4(a5)
  2438.         bne.s    of5
  2439.         move.l    #'M:'<<16,2(a5)
  2440. of5        move.l    a5,d1
  2441.         moveq    #-2,d2
  2442.         CALL    Lock,dosbase(a4)    ; get a lock to the device
  2443.         move.l    d0,d2            ; not mounted' if fails
  2444.         bne.s    of6
  2445.         move.l    a5,d0            ; buffer points to device name
  2446.         bsr    putstr
  2447.         move.w    #nomount,d0
  2448.         bsr    putnamw
  2449.         bra    of2
  2450.  
  2451. of6        CALL    Forbid,sysbase(a4)
  2452.         move.l    d2,-(sp)        ; d2 = FileLock
  2453.         lsl.l    #2,d2
  2454.         move.l    d2,a5
  2455.         lea    buffer+40(a4),a6    ; where to store the locks we find
  2456. of4        move.l    0(a5),d0        ; fl_Link
  2457.         cmp.l    #50,d0            ; zero or bogus ?
  2458.         ble.s    1$            ; exit loop
  2459.         tst.l    d6            ; searching for a lock ?
  2460.         bpl.s    3$            ; no !
  2461.  
  2462.         cmp.l    remembr(a4),d0        ; yes, compare them
  2463.         bne.s    3$
  2464.         clr.l    remembr(a4)
  2465.         CALL    Permit,sysbase(a4)
  2466. 2$        move.l    (sp)+,d1
  2467.         CALL    UnLock,dosbase(a4)
  2468.         bra    of55            ; exit if found
  2469.  
  2470. 3$        move.l    d0,(a6)+        ; put lock into buffer
  2471.         clr.w    (a6)+
  2472.         tst.b    post_V34(a4)
  2473.         beq.s    5$
  2474.         bsr    IsBcplLock        ; hack for KS2.0, see if BPTR
  2475.         bne.s    5$            ; isn't really an APTR
  2476.         move.w    #1,-2(a6)
  2477.         bra.s    4$
  2478. 5$        lsl.l    #2,d0            ; convert bptr into aptr
  2479. 4$        move.l    d0,a5
  2480.         bra.s    of4            ; get next lock
  2481.  
  2482. 1$        clr.l    (a6)+            ; end of buffer marker
  2483.         CALL    Permit,sysbase(a4)
  2484.         tst.l    d6            ; just searching for a lock ?
  2485.         bmi    of3             ; skip printing out info
  2486.  
  2487. of45        lea    buffer+40(a4),a2    ; a2-> array of locks
  2488. of46        move.l    (a2)+,d0        ; get a lock
  2489.         beq    of3             ; end of list ?
  2490.         tst.w    (a2)+
  2491.         beq.s    2$
  2492.         lsr.l    #2,d0
  2493. 2$        move.l    d0,d5
  2494.         lsl.l    #2,d0            ; bptr -> aptr
  2495.         move.l    d0,a5
  2496.         move.l    8(a5),d4        ; fl_Access
  2497.         move.l    d5,d0
  2498.         bsr    getfinfo        ; get fileinfo
  2499.         move.l    finfoptr(a4),a5
  2500.         tst.l    d6
  2501.         beq.s    of8
  2502.         bmi.s    of8             ; looking for open files ?
  2503.         tst.l    4(a5)            ; fib_DirEntryType
  2504.         bpl.s    of46            ; not a file
  2505. of8        move.l    d5,d0
  2506.         move.l    d0,node(a4)
  2507.         bsr    hexa            ; display lock
  2508.         move.w    #access,d0        ; access mode
  2509.         cmp.w    #-2,d4
  2510.         beq.s    of7
  2511.         addq.w  #8,d0
  2512. of7        bsr    putstrw
  2513.         tst.l    4(a5)            ; size
  2514.         bmi.s    of9
  2515.         move.w    #longnix,d0
  2516.         bsr    putstrw
  2517.         bra.s    of10
  2518. of9        bsr    putblank
  2519.         move.l    124(a5),d0
  2520.         moveq    #1,d3
  2521.         bsr    longdec
  2522. of10        move.l    d5,d0            ; path and filename
  2523.         bsr    getpath
  2524.         bra.s    of46
  2525.  
  2526. of3        move.l    (sp)+,d1
  2527.         CALL    UnLock,dosbase(a4)
  2528. of2        move.l    0(a3),d0
  2529.         move.l    d0,a3
  2530.         bne    of1
  2531. of55        bsr    freefinfo
  2532.         rts
  2533.  
  2534. IsBcplLock    movem.l    d0/d1/a0/a1,-(sp)
  2535.         moveq    #0,d1
  2536.         btst    d1,d0
  2537.         bne.s    1$            ; is bcpl
  2538.         bsr.s    CheckAdr        ; chk address
  2539.         bne.s    2$
  2540.         lsl.l    #2,d0
  2541.         moveq    #1,d1
  2542.         bsr.s    CheckAdr        ; chk address
  2543. 2$        move.l    d0,a0
  2544.         move.l    16(a0),a0
  2545.         cmp.l    devicelock(a4),a0
  2546.         bne.s    1$            ; is bcpl
  2547.         move.l    d1,d0
  2548. 1$        movem.l    (sp)+,d0/d1/a0/a1
  2549.         rts
  2550.  
  2551. ; validate address in d0 for accessibility to prevent illegal memory access !
  2552.  
  2553. CheckAdr    move.l    sysbase(a4),a0
  2554.         move.l    322(a0),a0        ; SysBase->MemList
  2555.         sub.l    a1,a1
  2556. 1$        cmp.l    20(a0),d0
  2557.         bcs.s    2$
  2558.         cmp.l    24(a0),d0
  2559.         bcs.s    3$
  2560. 2$        move.l    (a0),a0
  2561.         cmp.l    a0,a1
  2562.         bne.s    1$
  2563. 3$        rts
  2564.  
  2565. ;---------- Dos Devices ----------
  2566.  
  2567. devices        lea    ddheader(a4),a0
  2568.         bsr    puthead
  2569.         bsr    devinfo
  2570. dev1        adda.l    a1,a1
  2571.         adda.l    a1,a1
  2572.         tst.l    4(a1)
  2573.         bne    dev9
  2574.         moveq    #0,d6
  2575.         move.l    40(a1),d0
  2576.         bsr    putbcpl
  2577.         moveq    #10,d1
  2578.         bsr    tab
  2579.         move.w    #notfile,d0
  2580.         lea    putstrw(pc),a0
  2581.         moveq    #20,d1
  2582.         move.l    28(a1),a3
  2583.         cmp.l    d1,a3
  2584.         ble.s    dev3            ; =<20
  2585.         moveq    #1,d6
  2586.         adda.l    a3,a3
  2587.         adda.l    a3,a3
  2588.         move.l    8(a3),a2
  2589.         cmp.l    d1,a2
  2590.         ble.s    dev3            ; =<20
  2591.         adda.l    a2,a2
  2592.         adda.l    a2,a2
  2593.         move.l    12(a2),d3
  2594.         bsr    bytedec
  2595.         move.l    20(a2),d0
  2596.         moveq    #1,d3
  2597.         lea    longdec(pc),a0
  2598.         jsr    0(a0)            ; longdec
  2599.         move.l    40(a2),d0
  2600.         beq.s    dev2
  2601.         addq.l    #1,d0
  2602.         sub.l    36(a2),d0
  2603. dev2        jsr    0(a0)            ; longdec
  2604.         move.l    44(a2),d0
  2605. dev3        jsr    0(a0)            ; putstrw or longdec
  2606. dev4        move.w    #devload,d0
  2607.         tst.l    8(a1)
  2608.         bne.s    dev5
  2609.         move.w    #devnload,d0
  2610. dev5        bsr    putstrw
  2611.         lea    putbcpl(pc),a0
  2612.         tst.w    d6
  2613.         beq.s    dev6
  2614.         move.l    4(a3),d0
  2615.         bne.s    dev7
  2616. dev6        move.l    16(a1),d0
  2617.         bne.s    dev7
  2618.         tst.l    8(a1)
  2619.         beq.s    dev8
  2620.         move.l    8(a1),a3
  2621.         move.l    -82(a3),d0
  2622.         lea    putstr(pc),a0
  2623. dev7        jsr    0(a0)            ; putbcpl or putstr
  2624. dev8        bsr    newline
  2625. dev9        move.l    (a1),d1
  2626.         move.l    d1,a1
  2627.         bne    dev1
  2628.         rts
  2629.  
  2630. ; Re-assign a drive to dos
  2631.  
  2632. freedrive    moveq    #0,d2
  2633.         bra.s    ldr3
  2634.  
  2635. ; Inhibit a disk drive
  2636.  
  2637. lockdrive    moveq    #1,d2
  2638. ldr3        bsr    getstr
  2639.         bsr    finddev
  2640.         lea    buffer(a4),a2
  2641.         bne.s    ldr1
  2642. ldr2        move.l    a2,d0            ; buffer
  2643.         bsr    putstr
  2644.         move.w    #nomount,d0
  2645.         bsr    putstrw
  2646.         move.w    #dishelp,d0
  2647.         bra     putnamw
  2648. ldr1        move.l    a2,d1            ; buffer
  2649.         CALL    DeviceProc,dosbase(a4)
  2650.         move.l    d0,a0
  2651.         move.l    a0,d0
  2652.         beq.s    ldr2
  2653.         moveq    #31,d0
  2654.         move.l    d2,d1
  2655.  
  2656. ; send a packet
  2657. ; d0 = packet type
  2658. ; d1 = arg1
  2659. ; a0 = msgport
  2660.  
  2661. cons1        lea    mypacket(a4),a1
  2662.         lea    20(a1),a2
  2663.         move.l    a2,10(a1)        ; sp_Pkt to sp_Msg->ln_Name
  2664.         move.l    a1,20(a1)        ; sp_Msg to sp_Pkt->dp_Link
  2665.         move.l    replyport(a4),a2
  2666.         move.l    a2,24(a1)        ; sp_Pkt->dp_Port
  2667.         move.l    d0,28(a1)        ; sp_Pkt->dp_Type
  2668.         move.l    d1,40(a1)        ; sp_Pkt->dp_Arg1
  2669.         CALL    PutMsg,sysbase(a4)
  2670.         move.l    a2,a0
  2671.         RECALL    WaitPort
  2672.         move.l    a2,a0
  2673.         jmp    _LVOGetMsg(a6)
  2674.  
  2675. ;display the current directory of all processes,
  2676.  
  2677. currentdir    lea    cdheader(a4),a0
  2678.         bsr    puthead
  2679.         bsr    allocfinfo
  2680.         bsr    alloctaskbuf
  2681.         beq.s    cd7
  2682.         move.l    d0,a5
  2683.         move.b    d5,entries(a4)
  2684.         move.l    a5,-(sp)
  2685.         bra.s    cd6
  2686. cd2        cmp.b    #13,8(a5)
  2687.         bne.s    cd5
  2688.         move.l    0(a5),a3
  2689.         move.l    a5,-(sp)
  2690.         moveq    #-1,d6
  2691.         move.l    152(a3),remembr(a4)
  2692.         bsr    of44
  2693.         move.l    (sp)+,a5
  2694.         tst.l    remembr(a4)
  2695.         bne.s    cd5
  2696.         move.l    0(a5),a3
  2697.         move.l    a3,node(a4)
  2698.         bsr    gettaskname
  2699.         moveq    #21,d1
  2700.         bsr    tab
  2701.         move.l    152(a3),d0
  2702.         bsr    getpath
  2703. cd5        lea     16(a5),a5
  2704. cd6        subq.b    #1,entries(a4)
  2705.         bcc.s    cd2            ; not ready
  2706.         move.l    (sp)+,a5
  2707.         bsr    freetaskbuf
  2708.         bsr    freefinfo
  2709. cd7        rts
  2710.  
  2711. ;Change the current directory setting of a process
  2712.  
  2713. cd        tst.l    infile(a4)
  2714.         bne.s    cd7
  2715.         bsr    getstr
  2716.         lea    buffer(a4),a1
  2717.         move.l    a1,d1
  2718.         moveq    #-2,d2
  2719.         move.l    a0,-(sp)
  2720.         CALL    Lock,dosbase(a4)
  2721.         move.l    (sp)+,a0
  2722.         tst.l    d0
  2723.         bne.s    cd16
  2724.         move.w    #dnotf,d0
  2725.         bra    putnamw
  2726. cd16        move.l    d0,remembr2(a4)
  2727.         move.l    a0,-(sp)
  2728.         bsr    allocfinfo
  2729.         move.l    remembr2(a4),d0
  2730.         bsr    getfinfo
  2731.         move.l    finfoptr(a4),a5
  2732.         move.l    (sp)+,a0
  2733.         tst.l    4(a5)
  2734.         bpl.s    cd11
  2735.         move.w    #notdir,d0
  2736.         bsr    putnamw
  2737.         bra.s    cd18
  2738. cd11        bsr    nodenam
  2739.         moveq    #2,d7
  2740.         lea    TRuNode(pc),a3
  2741.         bsr    findnam
  2742.         tst.b    d7
  2743.         beq.s    cd15
  2744.         move.l    d0,a5
  2745.         cmp.b    #13,8(a5)
  2746.         beq.s    cd15
  2747.         bsr    syntax
  2748.         bra.s    cd18
  2749. cd15        move.l    152(a5),d0
  2750.         beq.s    cd13
  2751.         movem.l    a5,-(sp)
  2752.         moveq    #-1,d6
  2753.         move.l    d0,remembr(a4)
  2754.         bsr    of44
  2755.         move.l    (sp)+,a5
  2756.         tst.l    remembr(a4)
  2757.         bne.s    cd18
  2758. cd13        move.l    152(a5),d1
  2759.         move.l    remembr2(a4),152(a5)
  2760.         move.l    d1,remembr2(a4)
  2761. cd12        beq.s     cd14
  2762.         bsr    ResumeOutput
  2763.         move.w    #unltxt,d0
  2764.         bsr    putstrw
  2765.         move.l    remembr2(a4),d0
  2766.         bsr    getpath
  2767.         move.w    #unltxt2,d0
  2768.         bsr    putstrw
  2769.         bsr    readline
  2770.         cmp.b     #'y',d0
  2771.         bne.s    cd14
  2772. cd18        move.l    remembr2(a4),d1
  2773.         beq.s    cd14
  2774.         CALL    UnLock,dosbase(a4)
  2775. cd14        bsr    freefinfo
  2776.         rts
  2777.  
  2778. ;find the first entry in the device-list
  2779. ;returns a1 = pointer to first entry
  2780.  
  2781. devinfo        move.l    dosbase(a4),a1
  2782.         move.l    34(a1),a1        ; dl_Root
  2783.         move.l    24(a1),a1        ; RootNode->rn_Info
  2784.         adda.l    a1,a1
  2785.         adda.l    a1,a1
  2786.         move.l    4(a1),a1        ; DosInfo->di_DevInfo
  2787.         rts
  2788.  
  2789. ; Check if a named dos-device is mounted
  2790. ; name in 'buffer'.
  2791. ; Result: d0 = 0(false) anything else(true).
  2792.  
  2793. finddev        bsr.s    devinfo
  2794. fdev1        adda.l    a1,a1
  2795.         adda.l    a1,a1
  2796.         tst.l    4(a1)
  2797.         bne.s    fdev2
  2798.         move.l    40(a1),a2
  2799.         lea    buffer(a4),a0
  2800.         bsr.s    strbcmp
  2801.         tst.w    d0
  2802.         bne.s    fdev3
  2803. fdev2        move.l    0(a1),d0
  2804.         move.l    d0,a1
  2805.         bne.s    fdev1
  2806. fdev3        rts
  2807.  
  2808. ; compare bcpl string with string
  2809. ; a0 = pointer to string
  2810. ; a2 = bcpl-pointer to bcpl-string
  2811. ; returns d0 = true(0) false(1)
  2812. strbcmp        movem.l    d1/a0/a2,-(sp)
  2813.         moveq    #0,d0
  2814.         moveq    #0,d1
  2815.         adda.l    a2,a2
  2816.         adda.l    a2,a2
  2817.         move.b    (a2)+,d1
  2818.         beq.s    stb1
  2819.         subq.w    #1,d1
  2820. stb2        cmp.b    (a2)+,(a0)+
  2821.         bne.s    stb1
  2822.         dbra    d1,stb2
  2823.         moveq    #1,d0
  2824. stb1        movem.l    (sp)+,d1/a0/a2
  2825.         rts
  2826.  
  2827. ;display the list of inputhandlers. It uses our hotkeyhandler
  2828. inputhandler    move.w    #500,d4
  2829.         lea    ininterrupt(a4),a5
  2830. inph2        tst.l    4(a5)
  2831.         beq.s    inph3
  2832.         move.l    4(a5),a5
  2833.         dbra    d4,inph2
  2834. inph3        cmp.w    #-1,d4
  2835.         bne.s    inph5
  2836.         move.w    #failed,d0
  2837.         bra    putnamw
  2838. inph5        lea    inheader(a4),a0
  2839.         bsr    puthead
  2840. inph6        move.l    0(a5),a5
  2841.         tst.l    0(a5)
  2842.         beq.s    inph7
  2843.         move.l    a5,d0
  2844.         move.l    d0,node(a4)
  2845.         bsr    hexa
  2846.         move.l    14(a5),d0
  2847.         bsr    hexa
  2848.         move.l    18(a5),d0
  2849.         bsr    hexa
  2850.         move.b    9(a5),d3
  2851.         bsr    plusmins
  2852.         move.l    10(a5),d0
  2853. inph8        bsr    putnam
  2854.         bra.s    inph6
  2855. inph7        rts
  2856.  
  2857. ;display list of public screens
  2858. pubscreens    lea    pscrheader(a4),a0
  2859.         bsr    puthead
  2860.         tst.b    post_V34(a4)
  2861.         beq.s    1$            ; only Kick 2.0+
  2862.         CALL    LockPubScreenList,intuibase(a4)
  2863.         movea.l    d0,a5
  2864.         move.l    a5,d0
  2865.         beq.s    1$            ; no list ???
  2866. 5$        movea.l    0(a5),a5
  2867.         tst.l    0(a5)
  2868.         beq.s    2$            ; end of list
  2869.         move.l    a5,d0
  2870.         move.l    d0,node(a4)
  2871.         bsr    hexa            ; node
  2872.         move.l    10(a5),d0
  2873.         bsr    putstr            ; name
  2874.         moveq    #25,d1
  2875.         bsr    tab
  2876.         move.w    #pscr_state,d0
  2877.         btst    #0,19(a5)        ; public or private ?
  2878.         beq.s    4$
  2879.         add.w    #10,d0
  2880. 4$        bsr    putstrw            ; state
  2881.         lea    bytedec(pc),a0
  2882.         move.w    22(a5),d3        ; visit count (locks & windows)
  2883.         jsr    0(a0)
  2884.         move.b    28(a5),d3
  2885.         bpl.s    3$            ; valid signal
  2886.         move.w    #nix,d0
  2887.         lea    putstrw(pc),a0
  2888. 3$        jsr    0(a0)
  2889.         move.l    24(a5),d0        ; sigtask
  2890.         bsr    getaskname2
  2891.         bsr    newline
  2892.         bra.s    5$
  2893. 2$        CALL    UnlockPubScreenList,intuibase(a4)
  2894. 1$        rts
  2895.  
  2896. ;get all screen pointers.
  2897. ;result: d5=number of screens
  2898. ;     buffer+100 holds pointers.
  2899.  
  2900. getscr        lea    scrheader(a4),a0
  2901.         bsr    puthead
  2902. getscr2     movem.l    d0/a0,-(sp)
  2903.         moveq    #0,d0
  2904.         CALL    LockIBase,intuibase(a4)
  2905.         lea    buffer+100(a4),a0
  2906.         move.l    60(a6),a1        ; firstscreen
  2907.         moveq    #0,d5
  2908. sr1        addq.w    #1,d5
  2909.         move.l    a1,(a0)+
  2910.         move.l    0(a1),a1
  2911.         move.l    a1,d1
  2912.         bne.s    sr1
  2913.         subq.w    #1,d5
  2914.         move.l    d0,a0
  2915.         RECALL    UnlockIBase
  2916.         movem.l    (sp)+,d0/a0
  2917.         rts
  2918.  
  2919. ;display screen infos
  2920. screens        bsr.s    getscr
  2921.         moveq    #1,d6
  2922.         lea    buffer+100(a4),a5
  2923. sr2        move.w    d6,d3
  2924.         bsr    bytedec            ; number
  2925.         move.l    (a5)+,a2
  2926.         move.l    a2,node(a4)
  2927.         move.l    a2,d0
  2928.         bsr    hexa            ; address
  2929.         move.w    12(a2),d0
  2930.         moveq     #4,d3
  2931.         bsr    longdecn        ; width
  2932.         moveq    #'X',d0
  2933.         bsr    putchar
  2934.         move.w    14(a2),d0
  2935.         bsr    longdecn        ; height
  2936.         move.b    189(a2),d3
  2937.         bsr     bytedec
  2938.         move.l    22(a2),d0        ; depth
  2939.         bsr    putnam            ; name
  2940.         tst.b    post_V34(a4)
  2941.         beq.s    sr5            ; only kick 2.0+
  2942.         move.w    #monitorid,d0
  2943.         bsr    putstrw
  2944.         lea    44(a2),a0        ; ViewPort
  2945.         CALL    GetVPModeID,gfxbase(a4)
  2946.         move.l    d0,-(sp)
  2947.         bsr    hexa            ; DisplayID
  2948.         move.l    #'-> ',d0
  2949.         bsr    putlongascii
  2950.         move.l    (sp)+,d0
  2951.         RECALL    FindDisplayInfo
  2952.         move.l    d0,d2
  2953.         beq.s    sr3            ; no handle
  2954.         move.l    d0,a0
  2955.         lea    -104(a5),a1
  2956.         moveq    #56,d0            ; nif_SIZEOF
  2957.         move.l    #$80003000,d1        ; DTAG_NAME
  2958.         moveq    #0,d2
  2959.         RECALL    GetDisplayInfoData
  2960. sr3        lea    -88(a5),a0        ; NameInfo.Name
  2961.         cmp.l    d2,d0
  2962.         bne.s    sr4            ; ok !
  2963.         move.l    #'???'<<8,(a0)
  2964. sr4        move.l    a0,d0
  2965.         bsr    putnam            ; name + LF
  2966. sr5        addq.w    #1,d6            ; next screen
  2967.         dbra    d5,sr2
  2968.         rts
  2969.  
  2970. ;display windows and associated fonts
  2971. windowfonts    moveq    #1,d0
  2972.         bra.s    windows1
  2973.  
  2974. ;display window addresses and titles
  2975. windows        moveq    #0,d0
  2976. windows1    move.b    d0,bool(a4)
  2977.         bsr    getscr2
  2978.         move.l    d5,-(sp)
  2979.         lea    wnheader(a4),a0
  2980.         bsr    puthead
  2981.         move.l    (sp)+,d5
  2982.         tst.b    bool(a4)
  2983.         beq.s    wn20
  2984.         move.l    d5,-(sp)
  2985.         lea    fohead(a4),a0
  2986.         bsr    puthead
  2987.         move.l    (sp)+,d5
  2988. wn20        lea    buffer+100(a4),a3
  2989. wn2        move.w    #onscr,d0
  2990.         bsr    putstrw
  2991.         move.l    (a3)+,a2
  2992.         move.l    22(a2),d0
  2993.         bsr    putnam
  2994.         lea    4(a2),a1
  2995. wn1        move.l    (a1),d0
  2996.         move.l    d0,a1
  2997.         beq.s    wn3
  2998.         move.l    d0,node(a4)
  2999.         bsr    hexa
  3000.  
  3001.         move.l    86(a1),d0        ; wn->UserPort
  3002.         beq.s    1$
  3003.         move.l    d0,a0
  3004.         move.l    16(a0),d0        ; SigTask
  3005. 1$        bsr    getaskname2
  3006.         moveq    #20,d1
  3007.         bsr    tab
  3008.         bsr    putblank
  3009.  
  3010.         moveq    #4,d3
  3011.         moveq    #2,d2
  3012.         lea    4(a1),a0
  3013. 2$        move.w    (a0)+,d0
  3014.         bsr    longdecn
  3015.         dbra    d2,2$
  3016.         moveq    #'X',d0
  3017.         bsr    putchar
  3018.         move.w    10(a1),d0
  3019.         bsr    longdecn
  3020.  
  3021.         move.l    32(a1),d0
  3022.         bsr    putnam
  3023.  
  3024.         tst.b    bool(a4)
  3025.         beq.s    wn21
  3026.         move.l    a1,-(sp)
  3027.         move.l    50(a1),a1
  3028.         move.l    52(a1),a1
  3029.         bsr    fontdata
  3030.         move.l    (sp)+,a1
  3031.  
  3032. wn21        bra.s    wn1
  3033. wn3        dbra    d5,wn2
  3034.         rts
  3035.  
  3036. ;close a specified screen
  3037.  
  3038. closescreen    bsr    getscr2
  3039.         moveq    #1,d6
  3040.         cmp.b    #'$',0(a0)
  3041.         bne.s    cs1
  3042.         bsr    readhex
  3043.         tst.w    d7
  3044.         beq    syntax
  3045.         move.l    d0,d4
  3046. csin        moveq    #0,d6
  3047. cs1        lea    buffer+100(a4),a2
  3048. cs5        tst.w    d6
  3049.         bne.s    cs2
  3050.         cmp.l    (a2)+,d4
  3051.         beq.s    cs3
  3052.         bra.s    cs4
  3053. cs2        move.l    (a2)+,a1
  3054.         move.l    22(a1),a1
  3055.         bsr    strcmp
  3056.         beq.s    cs3
  3057. cs4        dbra    d5,cs5
  3058.         move.w    #scnofound,d0
  3059.         bra    putnamw
  3060. cs3        move.l    -(a2),a0
  3061.         move.l    4(a0),d0        ; Screen->FirstWindow
  3062.         beq.s    cs7
  3063.         move.l    a0,-(sp)
  3064. cs6        move.l    d0,a3
  3065.         move.l    (a3),-(sp)        ; Window->NextWindow
  3066.         bsr.s    clw
  3067.         move.l    (sp)+,d0
  3068.         bne.s    cs6            ; more windows !
  3069.         move.l    (sp)+,a0
  3070. cs7        CALL    CloseScreen,intuibase(a4)
  3071. cs8        rts
  3072.  
  3073. ;close a specified window
  3074.  
  3075. closewindow    bsr.s    getwnptr        ; get windowptr
  3076. clw        move.l    a3,d0            ; close win in a3
  3077.         beq.s    cs8
  3078.         move.l    intuibase(a4),a6
  3079. cw1        move.l    36(a3),d0
  3080.         move.l    d0,a0
  3081.         beq.s    cw2
  3082.         move.w    #_LVOFreeSysRequest,d1
  3083.         move.w    28(a0),d0
  3084.         and.w    #$4000,d0
  3085.         bne.s    cw3
  3086.         move.l    a3,a1
  3087.         RECALL    EndRequest
  3088.         bra.s    cw1
  3089.  
  3090. cw2        move.w    #_LVOModifyIDCMP,d1    ; d0 already zero !
  3091.         bsr.s    cw3
  3092.         move.w    #_LVOCloseWindow,d1
  3093. cw3        move.l    a3,a0
  3094.         jmp    0(a6,d1.w)        ; CloseWin/FreeSysReq/ModIDCMP
  3095.  
  3096. getwnptr    bsr    getscr2
  3097.         moveq    #1,d6
  3098.         cmp.b    #'$',0(a0)
  3099.         bne.s    cw4
  3100.         bsr    readhex
  3101.         tst.w    d7
  3102.         bne.s    cwin
  3103.         bsr    syntax
  3104.         bra.s    cw10
  3105. cwin        move.l    d0,d4
  3106.         moveq    #0,d6
  3107. cw4        lea    buffer+100(a4),a2
  3108. cw5        move.l    (a2)+,a3
  3109.         move.l    4(a3),d0
  3110.         beq.s    cw9
  3111. cw6        move.l    d0,a3
  3112.         tst.w    d6
  3113.         bne.s    cw7
  3114.         cmp.l    a3,d4
  3115.         beq.s    cw11
  3116.         bra.s    cw8
  3117. cw7        move.l    32(a3),a1
  3118.         bsr    strcmp
  3119.         beq.s    cw11
  3120. cw8        move.l    0(a3),d0
  3121.         bne.s    cw6
  3122. cw9        dbra    d5,cw5
  3123.         move.w    #winnofound,d0
  3124.         bsr    putnamw
  3125. cw10        suba.l    a3,a3
  3126. cw11        rts
  3127.  
  3128. windowoff    movem.l    d1-d7/a0-a6,-(sp)
  3129.         bsr    getscr2
  3130.         bsr.s    cwin
  3131.         move.l    a3,d1
  3132.         beq.s    woff1
  3133.         bsr    clw
  3134.         move.l    -(a2),a0
  3135.         move.l    a0,d4
  3136.         tst.l    4(a0)
  3137.         bne.s    woff1
  3138.         bsr    getscr2
  3139.         bsr    csin
  3140. woff1        movem.l    (sp)+,d1-d7/a0-a6
  3141.         rts
  3142.  
  3143. closetskwin    movem.l    d1-d7/a0-a6,-(sp)
  3144. ctw0        bsr    getscr2
  3145.         lea    buffer+100(a4),a2
  3146. ctw1        move.l    (a2)+,a3
  3147.         addq.l    #4,a3
  3148. ctw6        move.l    (a3),d1
  3149.         move.l    d1,a3
  3150.         beq.s     ctw4
  3151.         move.l    86(a3),a0
  3152.         move.l    16(a0),d1
  3153.         cmp.l    d0,d1
  3154.         bne.s     ctw6
  3155.         move.l    d0,d1
  3156.         move.l    a3,d0
  3157.         bsr.s    windowoff
  3158.         move.l    d1,d0
  3159.         bra.s     ctw0
  3160. ctw4        dbra    d5,ctw1
  3161.         movem.l    (sp)+,d1-d7/a0-a6
  3162.         rts
  3163.  
  3164. ;Change the font of a specified Window
  3165.  
  3166. setfont        bsr    nodenam
  3167.         tst.b    0(a5)
  3168.         beq    syntax
  3169.         move.l    a5,a3
  3170. 1$        cmp.b    #33,(a3)+
  3171.         bge.s    1$
  3172.         tst.b    -(a3)
  3173.         beq    syntax
  3174.         clr.b    (a3)+
  3175.         lea    dummy(a4),a2
  3176.         move.l    a2,a0
  3177.         move.l    a5,(a0)+        ; +0
  3178.         move.w    procnum(a4),d0
  3179.         cmp.w    #8,d0
  3180.         bcc.s    7$            ; not smaller than 8 pixels !
  3181.         moveq    #8,d0
  3182. 7$        move.w    d0,(a0)+        ; +4
  3183.         clr.w    (a0)            ; +6
  3184.         move.l    a2,a0            ; TextAttr
  3185.         CALL    OpenFont,gfxbase(a4)
  3186.         tst.l    d0
  3187.         bne.s    2$
  3188.         lea     diskfont(a4),a1
  3189.         CALL    OpenLibrary,sysbase(a4)
  3190.         move.l    d0,a6
  3191.         move.l    a6,d0
  3192.         beq.s    4$
  3193.         move.l    a2,a0            ; TextAttr
  3194.         RECALL    OpenDiskFont
  3195.         move.l    d0,d4
  3196.         move.l    a6,a1
  3197.         CALL    CloseLibrary,sysbase(a4)
  3198.         move.l    d4,d0
  3199.         bne.s    2$
  3200. 4$        move.w    #fonterr,d0
  3201.         bsr    putstrw
  3202.         move.l    0(a2),d0        ; TextAttr->FontName
  3203.         bra     putnam
  3204. 2$        move.l    d0,-(sp)
  3205.         move.l    a3,a0
  3206.         bsr    kllblnks
  3207.         bsr    getwnptr
  3208.         move.l    (sp)+,a0
  3209.         move.l    gfxbase(a4),a6
  3210.         move.l    a3,d1
  3211.         beq.s    5$            ; no window !
  3212.         cmp.l    wnptr(a4),a3
  3213.         bne.s    6$            ; not our window !
  3214.         st    ownfont(a4)
  3215.         move.l    tfont(a4),-(sp)
  3216.         move.l    a0,tfont(a4)
  3217.         bsr    usetopaz2
  3218.         move.l    (sp)+,a0
  3219.         move.l    a0,d0
  3220.         bne.s    5$
  3221.         bra.s    3$
  3222. 6$        move.l    50(a3),a1
  3223.         RECALL     SetFont
  3224.         move.l    a3,a0
  3225.         CALL    RefreshWindowFrame,intuibase(a4)
  3226.         bra.s    3$
  3227. 5$        move.l    a0,a1
  3228.         RECALL    CloseFont
  3229. 3$        rts
  3230.  
  3231. ;display loaded font names and definitions
  3232.  
  3233. fonts        lea    fohead(a4),a0
  3234.         bsr    puthead
  3235.         move.l    gfxbase(a4),a1
  3236.         lea    140(a1),a1        ; system fontlist
  3237. fo1        move.l    0(a1),a1
  3238.         tst.l    0(a1)
  3239.         beq.s    fo3
  3240.         bsr.s    fontdata
  3241.         bra.s    fo1
  3242. fo3        rts
  3243.  
  3244. fontdata    move.l    a1,d0
  3245.         move.l    d0,node(a4)
  3246.         bsr    hexa
  3247.         move.w    30(a1),d3
  3248.         bsr    bytedec
  3249.         move.w    20(a1),d3
  3250.         bsr    bytedec
  3251.         move.w    24(a1),d3
  3252.         bsr    bytedec
  3253.         move.w    #romfnt,d0
  3254.         btst    #1,23(a1)
  3255.         beq.s    fod1
  3256.         addq.w    #diskfnt-romfnt,d0
  3257. fod1        bsr    putstrw
  3258.         move.w    #ffixed,d0
  3259.         btst    #5,23(a1)
  3260.         beq.s    1$
  3261.         addq.w    #fprop-ffixed,d0
  3262. 1$        bsr    putstrw
  3263.         move.b    32(a1),d3
  3264.         bsr    bytedec
  3265.         move.b    33(a1),d3
  3266.         bsr    bytedec
  3267.         move.l    10(a1),d0
  3268.         bra    putnam
  3269.  
  3270. ;set update rate
  3271.  
  3272. settime        bsr    getfrac
  3273.         tst.b    d7
  3274.         bne.s    st1
  3275.         move.w    #whattime,d0
  3276.         bsr    putstrw
  3277.         move.l    timeoutm(a4),d0
  3278.         move.l    #100000,d1
  3279.         bsr    div
  3280.         moveq    #0,d1
  3281.         move.b    timeout(a4),d1
  3282.         mulu    #10,d1
  3283.         add.l    d1,d0
  3284.         bne.s    1$
  3285.         move.w    #timenotset,d0
  3286.         bra    putnamw
  3287. 1$        bsr    putfrac
  3288.         bra    newline
  3289.  
  3290. st1        divs    #10,d2
  3291.         move.b    d2,timeout(a4)
  3292.         swap    d2
  3293.         ext.l    d2
  3294.         moveq    #0,d3
  3295.         subq.w    #1,d2
  3296.         bmi.s    1$
  3297. 2$        add.l    #100000,d3
  3298.         dbra    d2,2$
  3299. 1$        move.l    d3,timeoutm(a4)
  3300.         rts
  3301.  
  3302. zerotimer    bsr    nodenam
  3303.         moveq    #2,d7
  3304.         lea    TRuNode(pc),a3
  3305.         bsr    findnam
  3306.         tst.b    d7
  3307.         beq.s    1$
  3308.         bsr    gettimeentry
  3309.         lea    usedtime(a4),a0
  3310.         clr.l    0(a0,d0)
  3311. 1$        rts
  3312.  
  3313. ;cancel a task or a process. The theory is quite simple:
  3314. ;(Process->ReturnAddr)-4 points to the return address on
  3315. ;the stack. Task->SPReg points to the next instruction
  3316. ;to be executed. We just need a
  3317. ; *(Task->SPReg) = *(Process->ReturnAddr-4).
  3318. ;If the process has been started from Dos (CLI) and
  3319. ;the process is doing disk I/O, the CLI will respond with
  3320. ;a GURU #87000004 (AsyncPKT=unexpected packed received).
  3321. ;Thats why the calling CLI is also canceled.
  3322.  
  3323. cancel        tst.l    infile(a4)
  3324.         beq.s    cancel1
  3325.         rts
  3326. cancel1     clr.l    remembr(a4)        ; used for CLI stdio
  3327.         clr.l    remembr2(a4)
  3328.         clr.b    bool(a4)
  3329.         bsr    nodenam
  3330. testagain    moveq    #1,d7
  3331.         lea    TReNode(pc),a3
  3332.         bsr    findnam
  3333.         tst.b    d7
  3334.         bne.s    canok
  3335. cnerr        move.w    #stperr,d0
  3336.         bra    putnamw
  3337.  
  3338. canok        moveq    #0,d5
  3339. canok2        move.l    d0,pointer(a4)        ; d0=task
  3340.         move.l    d0,a1
  3341.         cmp.b    #1,8(a1)        ; TASK ?
  3342.         bne.s    isproc
  3343.         CALL    RemTask,sysbase(a4)
  3344.         move.l    pointer(a4),d0
  3345.         bsr    closetsports
  3346.         move.l    pointer(a4),d0
  3347.         bra    closetskwin
  3348.  
  3349. isproc        tst.w    d5
  3350.         bne.s    isproc2            ; second try !
  3351.         movem.l    d0-d7/a0-a6,-(sp)
  3352.         moveq    #-1,d0            ; needed for recursive killing tasks
  3353.         CALL    AllocSignal,sysbase(a4)
  3354.         move.l    d0,cancelbnum(a4)
  3355.         moveq    #0,d1
  3356.         bset    d0,d1
  3357.         move.l    d1,cancelbit(a4)
  3358.         movem.l    (sp)+,d0-d7/a0-a6
  3359.  
  3360. isproc2        moveq    #0,d5
  3361.         tst.l    172(a1)            ; pr_CLI
  3362.         beq.s    wascreproc
  3363.         move.l    $80(a1),a2        ; Seglist
  3364.         adda.l    a2,a2
  3365.         adda.l    a2,a2
  3366.         move.l    12(a2),d1        ; empty ?
  3367.         bne.s    wascreproc
  3368.         move.l    172(a1),a2        ; CommandLineInterface
  3369.         adda.l    a2,a2
  3370.         adda.l    a2,a2
  3371.         move.l    60(a2),d5        ; cli_Module
  3372.         tst.l    40(a2)            ; IsInteractive
  3373.         beq    dosreturn
  3374.         move.l    28(a2),remembr(a4)    ; yes,get Cli-Window locks
  3375.         move.l    56(a2),remembr2(a4)
  3376.         bra    dosreturn
  3377. wascreproc    tst.b    bool(a4)        ; it is not a CLI, ask what to do
  3378.         bne.s    unload
  3379.         move.b    #3,bool(a4)
  3380.         bsr    ResumeOutput
  3381.         move.w    #canerr0,d0        ; ask for Workbench
  3382.         bsr    putstrw
  3383.         bsr    readline
  3384.         cmp.b    #'y',d0
  3385.         beq.s    andagain
  3386.         move.b    #2,bool(a4)
  3387.         bsr    ResumeOutput
  3388.         move.w    #canerr1,d0        ; ask for unload
  3389.         bsr    putstrw
  3390.         bsr    readline
  3391.         cmp.b    #'y',d0
  3392.         bne.s    andagain
  3393.         move.b    #1,bool(a4)
  3394. andagain    move.l    pointer(a4),d0
  3395.         moveq    #1,d7
  3396.         lea    TReNode(pc),a3
  3397.         bsr    tstnode
  3398.         tst.w    d5
  3399.         beq    cnerr
  3400.         bra    canok2
  3401.  
  3402. unload        move.l    128(a1),d4        ; get Segmentlist
  3403.         beq.s    unl3
  3404.         lsl.l    #2,d4
  3405.         move.l    d4,a3
  3406.         cmp.l    #100,0(a3)
  3407.         bpl.s    ulerr
  3408.         move.l    12(a3),d4
  3409. unl3        tst.l    d4
  3410.         bne.s    unl4
  3411. ulerr        move.w    #unloaderr,d0        ; no Segments !?
  3412.         bra    putnamw
  3413.  
  3414. unl4        cmp.b    #3,bool(a4)        ; Workbench Task
  3415.         bne.s    unl2
  3416.         move.l    a1,-(sp)
  3417.         moveq    #40,d0            ; build a copy of the
  3418.         moveq    #1,d1
  3419.         swap    d1            ; Workbench startup-message
  3420.         CALL    AllocMem,sysbase(a4)
  3421.         move.l    d0,startmess(a4)
  3422.         move.l    d0,a0
  3423.         move.l    a0,-(sp)
  3424.         move.b    #5,8(a0)
  3425.         move.w    #20,18(a0)
  3426.         move.l    d4,24(a0)
  3427.         moveq    #92,d0
  3428.         add.l    4(sp),d0
  3429.         move.l    d0,20(a0)
  3430.         lea    wbportnam(a4),a1
  3431.         RECALL    FindPort
  3432.         movem.l    (sp)+,a0/a1
  3433.         move.l    d0,14(a0)
  3434.         bne.s    unl2
  3435.         move.w    #noworkbench,d0
  3436.         bra    putnamw
  3437.  
  3438. unl2        cmp.b    #1,bool(a4)
  3439.         bne.s    dosreturn
  3440.         move.l    a1,-(sp)        ; unload process manualy
  3441.         move.l    d4,d1
  3442.         CALL    UnLoadSeg,dosbase(a4)
  3443.         move.l    (sp)+,a1
  3444.  
  3445. dosreturn    move.l    140(a1),savedat(a4)    ; Processnumber
  3446. dosret1        move.w    #$4000,$dff09a
  3447.         move.l    54(a1),a3
  3448.         move.l    #endtask,0(a3)
  3449.         tst.b    gotguru(a4)
  3450.         bne.s    1$
  3451.         tst.b    bool(a4)
  3452.         bne.s    1$
  3453.         move.b    #2,106(a1)        ; ignore messages
  3454. 1$        cmp.b    #4,15(a1)        ; if waiting
  3455.         bne.s    doswait
  3456.         move.l    a1,d4
  3457.         CALL    Remove,sysbase(a4)
  3458.         move.l    d4,a1
  3459.         lea    406(a6),a0        ; activate the task
  3460.         RECALL    AddHead
  3461.         move.l    d4,a1
  3462.  
  3463. doswait        move.w    #$C000,$dff09a
  3464.  
  3465.         tst.b    bool(a4)
  3466.         bne.s    endnodos
  3467.         tst.l    d5
  3468.         beq.s    endcanc
  3469.  
  3470.         move.l    172(a1),a2
  3471.         adda.l    a2,a2
  3472.         adda.l    a2,a2
  3473. dwa1        movem.l    d0-d7/a0-a6,-(sp)
  3474.         move.l    cancelbit(a4),d0
  3475.         CALL    Wait,sysbase(a4)
  3476.         movem.l    (sp)+,d0-d7/a0-a6
  3477.         tst.b    gotguru(a4)
  3478.         bne.s    endnodos
  3479.         moveq    #0,d5
  3480.         bra.s    dosret1
  3481.  
  3482. endcanc        move.l    a1,-(sp)
  3483.         move.l    dosbase(a4),a6
  3484.         move.l    remembr(a4),d1        ; close CLI-Window
  3485.         beq.s    ecan1            ; if any
  3486.         RECALL    Close
  3487. ecan1        move.l    remembr2(a4),d1
  3488.         beq.s    ecan2
  3489.         RECALL    Close
  3490. ecan2        move.l    (sp)+,a1
  3491.  
  3492.         move.l    savedat(a4),d0        ; remove Task from
  3493.         move.l    dosbase(a4),a2        ; TaskArray
  3494.         move.l    34(a2),a2
  3495.         move.l    0(a2),a2
  3496.         adda.l    a2,a2
  3497.         adda.l    a2,a2
  3498.         lsl.l    #2,d0
  3499.         clr.l    0(a2,d0)
  3500.  
  3501. endnodos    move.l    a1,d0
  3502.         bsr    closetskwin
  3503.         move.l    a1,d0
  3504.         bsr    closetsports
  3505.         move.l    cancelbnum(a4),d0    ; remove our Signal
  3506.         CALL    FreeSignal,sysbase(a4)
  3507.         rts
  3508.  
  3509. ;This Code is (hopefully) executed by the Process we want to kill
  3510.  
  3511. endtask        lea    dataarea(pc),a4
  3512.         move.l    sysbase(a4),a6
  3513.         move.l    276(a6),a1
  3514.         move.l    176(a1),a1        ; Process_ReturnAddr
  3515.         lea    -4(a1),sp        ; reset Process Stackptr
  3516.         tst.b    bool(a4)
  3517.         bne.s    et0
  3518.         movea.l    mytask(a4),a1
  3519.         move.l    cancelbit(a4),d0    ; signal Xoper it
  3520.         RECALL    Signal            ; died
  3521. et0        cmp.b    #3,bool(a4)        ; Workbench Process ?
  3522.         bne.s    et1
  3523.         RECALL    Forbid
  3524.         move.l    startmess(a4),a1
  3525.         RECALL    ReplyMsg        ; reply startup message
  3526. et1        rts
  3527.  
  3528. ;Stop a task (just queue it on a special list)
  3529.  
  3530. freeze        bsr    nodenam
  3531.         moveq    #1,d7
  3532.         lea    TReNode(pc),a3
  3533.         bsr    findnam
  3534.         tst.b    d7
  3535.         bne.s    frok
  3536. frerr        move.w    #stperr,d0
  3537.         bra    putstrw
  3538. frok        move.l    d0,a1
  3539.         cmp.b    #13,8(a1)
  3540.         beq.s    1$
  3541.         cmp.b    #1,8(a1)
  3542.         bne.s    frerr
  3543. 1$        move.w    #$4000,$dff09a
  3544.         CALL    Remove,sysbase(a4)
  3545.         move.w    #$C000,$dff09a
  3546.         move.l    d0,a1
  3547.         move.l    d0,a5
  3548.         lea     stplist(a4),a0
  3549.         RECALL    AddHead
  3550.         add.b    #4,15(a5)
  3551.         rts
  3552.  
  3553. ;put the task back on its list
  3554.  
  3555. warm        bsr    nodenam
  3556.         cmp.b    #'$',0(a5)
  3557.         bne.s    1$
  3558.         move.l    d7,d2
  3559.         move.l    a5,a0
  3560.         bsr    readhex
  3561.         tst.b    d7
  3562.         beq.s    1$
  3563.         move.l    stplist(a4),a3
  3564. 3$        tst.l    0(a3)
  3565.         beq.s    2$
  3566.         cmp.l    a3,d0
  3567.         beq.s    waok
  3568.         move.l    0(a3),a3
  3569.         bra.s    3$
  3570. 1$        lea    stplist(a4),a0
  3571.         movea.l    a5,a1
  3572.         moveq    #0,d7
  3573.         bsr    fn4
  3574.         tst.b    d7
  3575.         bne.s    waok
  3576. 2$        move.w    #waerr,d0
  3577.         bra    putstrw
  3578. waok        move.w    #$4000,$dff09a
  3579.         move.l    d0,a1
  3580.         CALL    Remove,sysbase(a4)
  3581.         move.l    d0,a1
  3582.         move.l    d0,a5
  3583.         move.l    TReNode(pc),a0
  3584.         cmp.b    #8,15(a1)
  3585.         bne.s    wa1
  3586.         move.l    TWaNode(pc),a0
  3587. wa1        adda.l    a6,a0
  3588.         RECALL    AddTail
  3589.         move.l    d0,a1
  3590.         subq.b    #4,15(a5)
  3591.         move.w    #$C000,$dff09a
  3592.         move.l    18(a5),d0
  3593.         and.l    26(a5),d0
  3594.         beq.s    wa2
  3595.         movea.l    a5,a1
  3596.         RECALL    Signal
  3597. wa2        rts
  3598.  
  3599. ;show the hunks of a process
  3600. hunks        bsr    nodenam
  3601.         moveq    #2,d7
  3602.         lea    TRuNode(pc),a3
  3603.         bsr    findnam
  3604.         tst.b    d7
  3605.         bne.s    hu1
  3606.         rts
  3607. hu1        move.l    d0,a5
  3608.         cmp.b    #13,8(a5)
  3609.         beq.s    hu2
  3610.         move.w    #noprocs,d0
  3611.         bra    putnamw
  3612. hu2        move.l    128(a5),d0
  3613.         beq.s    noprogload
  3614.         lsl.l    #2,d0
  3615.         move.l    d0,a3
  3616.         move.l    12(a3),d1
  3617.         beq.s    hu3
  3618.         cmp.l    #100,0(a3)
  3619.         ble.s    1$
  3620.         move.w    #unloaderr,d0
  3621.         bra.s    huxx
  3622. 1$        move.w    #segloaded,d0
  3623.         bsr    putnamw
  3624.         bra.s    hu5
  3625. hu3        move.l    172(a5),d1
  3626.         bne.s    hu4
  3627. noprogload    move.w    #notload,d0
  3628. huxx        bra    putnam
  3629. hu4        move.w    #cliprocs,d0
  3630.         bsr    putnamw
  3631.         lsl.l    #2,d1
  3632.         move.l    d1,a5
  3633.         move.l    60(a5),d1
  3634.         beq.s    noprogload
  3635.         move.w    #procloaded,d0
  3636.         bsr    putstrw
  3637.         move.l    16(a5),d0
  3638.         bsr    putbcpl
  3639.         bsr    newline
  3640. hu5        lea    hunkheader(a4),a0
  3641.         bsr    puthead
  3642.         moveq    #0,d5
  3643. hu6        move.l    d5,d3
  3644.         bsr    bytedec
  3645.         addq.l    #1,d5
  3646.         move.l    d1,d0
  3647.         bsr    hexa
  3648.         lsl.l    #2,d1
  3649.         move.l    d1,a5
  3650.         move.l    d1,d0
  3651.         addq.l    #4,d0
  3652.         bsr    hexa
  3653.         move.l    -4(a5),d0
  3654.         moveq    #1,d3
  3655.         bsr    longdec
  3656.         move.l    #'($',d0
  3657.         bsr    putlongascii
  3658.         move.l    -4(a5),d0
  3659.         bsr    hexa
  3660.         subq.l    #1,ptr(a4)
  3661.         moveq    #')',d0
  3662.         bsr    putchar
  3663.         bsr    newline
  3664.         move.l    0(a5),d1
  3665.         bne.s    hu6
  3666.         rts
  3667.  
  3668. ;change the priority of a node
  3669.  
  3670. pri        bsr    getnum
  3671.         tst.b    d7
  3672.         beq    syntax
  3673.         move.b    d2,newpri(a4)
  3674.         bsr    nodenam2
  3675.         moveq    #8,d7
  3676.         lea    TRuNode(pc),a3
  3677.         bsr    findnam
  3678.         tst.b    d7
  3679.         beq.s    pi1
  3680.         move.l    d0,a1
  3681.         cmp.b    #13,8(a1)
  3682.         beq.s    tp2
  3683.         cmp.b    #1,8(a1)
  3684.         beq.s    tp2
  3685.         move.b    newpri(a4),9(a1)
  3686.         lea    SemNode(pc),a0
  3687.         cmp.l    a0,a3
  3688.         ble.s    pi2
  3689.         move.w    #listerr,d0
  3690.         bra    putnamw
  3691. pi2        CALL    Forbid,sysbase(a4)
  3692.         RECALL    Remove
  3693.         move.l    d0,a1
  3694.         movea.l    (a3),a0
  3695.         adda.l    a6,a0
  3696.         RECALL    Enqueue
  3697.         RECALL    Permit
  3698. pi1        rts
  3699.  
  3700. ;set the priority of our task
  3701.  
  3702. mypri        bsr    getnum
  3703.         tst.b    d7
  3704.         beq    syntax
  3705.         move.l    sysbase(a4),a1
  3706.         move.l    276(a1),a1
  3707.         move.l    d2,d0
  3708.         bra.s    tp3
  3709.  
  3710. ;modify a task's priority
  3711.  
  3712. taskpri        bsr    getnum
  3713.         tst.b    d7
  3714.         beq    syntax
  3715.         move.b    d2,newpri(a4)
  3716.         bsr    nodenam
  3717.         moveq    #2,d7
  3718.         lea    TRuNode(pc),a3
  3719.         bsr    findnam
  3720.         tst.b    d7
  3721.         beq.s    tp1
  3722.         move.l    d0,a1
  3723. tp2        move.b    newpri(a4),d0
  3724. tp3        CALL    SetTaskPri,sysbase(a4)
  3725. tp1        rts
  3726.  
  3727. ;set all break signals of a task
  3728.  
  3729. break        move.l    #$f000,d0
  3730.         bra.s    setthem
  3731.  
  3732. signal        bsr    readhex
  3733.         tst.b    d7
  3734.         beq    syntax
  3735. setthem     move.l    d0,savedat(a4)
  3736.         bsr    nodenam
  3737.         moveq    #2,d7
  3738.         lea    TReNode(pc),a3
  3739.         bsr    findnam
  3740.         tst.b    d7
  3741.         beq.s    1$
  3742.         move.l    d0,a1
  3743.         move.l    savedat(a4),d0
  3744.         and.l    18(a1),d0
  3745.         CALL    Signal,sysbase(a4)
  3746. 1$        rts
  3747.  
  3748. ;set up a list of tasknames which should't be displayed
  3749.  
  3750. hide        cmp.b    #10,0(a0)
  3751.         bne.s    hid5
  3752.         bra    syntax
  3753. hid5        lea    hidestart(a4),a2
  3754.         move.l    a2,d3
  3755. hid0        tst.l    0(a2)
  3756.         beq.s    hid1
  3757.         move.l    0(a2),a2
  3758.         lea    4(a2),a1
  3759.         bsr    strcmp
  3760.         beq.s    hid2
  3761.         move.l    a2,d3
  3762.         bra.s    hid0
  3763. hid1        move.l    a0,a3
  3764.         bsr    strlen2
  3765.         addq.l    #5,d0
  3766.         moveq    #1,d1
  3767.         swap    d1
  3768.         CALL    AllocMem,sysbase(a4)
  3769.         move.l    d0,a1
  3770.         move.l    a1,d0
  3771.         beq.s     hid4
  3772.         move.l    d0,0(a2)
  3773.         addq.l    #4,a1
  3774. hid3        cmp.b    #10,0(a3)
  3775.         beq.s    hid4
  3776.         move.b    (a3)+,(a1)+
  3777.         bra.s    hid3
  3778. hid4        rts
  3779. hid2        move.l    d3,a3
  3780.         move.l    0(a2),0(a3)
  3781. freehidden    lea    4(a2),a0
  3782.         bsr    strlen
  3783.         addq.l    #5,d0
  3784.         move.l    a2,a1
  3785.         CALL    FreeMem,sysbase(a4)
  3786.         rts
  3787.  
  3788. freehidmem    move.l    hidestart(a4),a3
  3789. fhm0        move.l    a3,d0
  3790.         beq.s    fhm1
  3791.         move.l    a3,a2
  3792.         move.l    0(a2),a3
  3793.         bsr.s    freehidden
  3794.         bra.s    fhm0
  3795. fhm1        rts
  3796.  
  3797. hideit        tst.b    hideon(a4)
  3798.         beq.s    pt76
  3799.         lea    hidestart(a4),a3
  3800.         move.l    4(a5),a0
  3801. pt74        tst.l    0(a3)
  3802.         beq.s    pt76
  3803.         move.l    0(a3),a3
  3804.         lea    4(a3),a1
  3805.         bsr    strcmp
  3806.         bne.s    pt74
  3807.         rts
  3808. pt76         moveq    #1,d0
  3809.         rts
  3810.  
  3811. ;set up an ALIAS list
  3812.  
  3813. alias        cmp.b    #10,0(a0)
  3814.         beq    showalias
  3815.         bsr    strbuf
  3816.         lea    buffer(a4),a3
  3817.         move.l    a0,a5
  3818.         move.l    a3,a0
  3819.         bsr    strlen
  3820.         tst.l    d0
  3821.         beq    syntax
  3822.  
  3823.         cmp.w    #1,d0
  3824.         bne.s    5$
  3825.         lea    params(a4),a0
  3826.         moveq    #parmnum-1,d1
  3827.         move.b    0(a3),d2
  3828. 6$        cmp.b    (a0)+,d2
  3829.         dbeq    d1,6$
  3830.         bne.s    5$
  3831.         move.w     #aliaserr,d0
  3832.         bsr    putstrw
  3833.         move.w    #params,d0
  3834.         bsr    putstrw
  3835.         move.w    #aliaserr2,d0
  3836.         bra    putnamw
  3837.  
  3838. 5$        move.l    d0,d5
  3839.         bsr    findalias
  3840.         tst.l    d2
  3841.         bmi.s    7$            ; no alias
  3842.         lea    aliaslist(a4),a0
  3843.         cmp.l    (a0),a2
  3844. 10$        beq.s    9$
  3845.         move.l    (a0),a0
  3846.         bra.s    10$
  3847. 9$        move.l    (a2),(a0)
  3848.         lea    5(a2),a0
  3849. 8$        tst.b    (a0)+
  3850.         bne.s    8$
  3851.         move.l    a0,d0
  3852.         move.l    a2,a1
  3853.         sub.l    a1,d0
  3854.         CALL    FreeMem,sysbase(a4)
  3855.         cmp.b    #10,0(a5,d5.l)
  3856.         beq.s    1$            ; was 'unalias'
  3857.  
  3858. 7$        lea    0(a5,d5.l),a0
  3859.         bsr    kllblnks
  3860.         bsr    findcmd
  3861.         tst.l    d2
  3862.         bmi    syntax
  3863.         move.l    a5,a0
  3864.         bsr    strbuf
  3865.  
  3866.         addq.l    #6,d5
  3867.         move.l    d5,d0
  3868.         moveq    #1,d1
  3869.         swap    d1
  3870.         CALL    AllocMem,sysbase(a4)
  3871.         tst.l    d0
  3872.         beq.s    1$
  3873.  
  3874.         lea    aliaslist(a4),a0
  3875. 2$        move.l    (a0),d1
  3876.         beq.s    3$
  3877.         move.l    d1,a0
  3878.         bra.s    2$
  3879. 3$        move.l    d0,0(a0)
  3880.  
  3881.         move.l    d0,a0
  3882.         move.b    d2,4(a0)
  3883.  
  3884.         lea    5(a0),a0
  3885. 4$        move.b    (a3)+,(a0)+
  3886.         bne.s    4$
  3887. 1$        rts
  3888.  
  3889. showalias    lea    alhead(a4),a0
  3890.         bsr    puthead
  3891.         move.l    aliaslist(a4),d0
  3892.         beq.s    1$
  3893. 2$        move.l    d0,a5
  3894.         addq.l    #5,d0
  3895.         bsr    putstr
  3896.         move.w    #15,d1
  3897.         bsr    tab
  3898.         move.w    #equal,d0
  3899.         bsr    putstrw
  3900.         move.b    4(a5),d0
  3901.         ext.w    d0
  3902.         bsr.s    getcmdptr
  3903.         bsr    putnam
  3904.         move.l    0(a5),d0
  3905.         bne.s    2$
  3906. 1$        rts
  3907.  
  3908. freealias    move.l    aliaslist(a4),a3
  3909. 1$        move.l    a3,d0
  3910.         beq.s    2$
  3911.         move.l    a3,a2
  3912.         move.l    0(a2),a3
  3913.         lea    5(a2),a0
  3914.         bsr    strlen
  3915.         addq.l    #6,d0
  3916.         move.l    a2,a1
  3917.         CALL    FreeMem,sysbase(a4)
  3918.         bra.s    1$
  3919. 2$        rts
  3920.  
  3921. getcmdptr    move.l    a0,-(sp)
  3922.         lea    commds(a4),a0
  3923. 2$        subq.w    #1,d0
  3924.         bcs.s    1$
  3925. 3$        tst.b    (a0)+
  3926.         bne.s    3$
  3927.         bra.s    2$
  3928. 1$        move.l    a0,d0
  3929.         move.l    (sp)+,a0
  3930.         rts
  3931.  
  3932. ;add a fkey definition to the fkey list. Each entry
  3933. ;looks like this: long Succ, long Pred, byte Key#, byte length,
  3934. ;          char text[]
  3935.  
  3936. showfkeys    lea    fkhead(a4),a0
  3937.         bsr    puthead
  3938.         lea    fkeys(a4),a1
  3939. 1$        move.l    0(a1),a1
  3940.         tst.l    0(a1)
  3941.         beq.s    2$
  3942.         moveq    #'F',d0
  3943.         bsr    putchar
  3944.         moveq    #1,d3
  3945.         add.b    8(a1),d3
  3946.         bsr    bytedec
  3947.         move.b    9(a1),d1
  3948.         subq.b    #1,d1
  3949.         lea    10(a1),a2
  3950. 3$        move.b    (a2)+,d0
  3951.         bsr    putchar
  3952.         subq.b    #1,d1
  3953.         bcc.s    3$            ; dbra for bytes ...
  3954.         bsr    newline
  3955.         bra.s    1$
  3956. 2$        rts
  3957.  
  3958. setfkey        bsr    nodenam
  3959.         move.w    procnum(a4),d5
  3960.         beq.s    showfkeys
  3961.         cmp.w    #21,d5
  3962.         bcc    syntax
  3963.         subq.w    #1,d5
  3964.         move.w    d5,procnum(a4)
  3965.         move.l    sysbase(a4),a6
  3966.         lea    fkeys(a4),a1
  3967. 1$        move.l    0(a1),a1
  3968.         tst.l    0(a1)
  3969.         beq.s    2$
  3970.         cmp.b    8(a1),d5
  3971.         bne.s    1$
  3972.         move.l    a1,d3
  3973.         RECALL    Remove
  3974.         move.l    d3,a1
  3975.         bsr.s    removefkey
  3976. 2$        tst.b    0(a5)
  3977.         beq.s    4$
  3978.         move.l    a5,a0
  3979.         bsr    strlen
  3980.         move.l    d0,d5
  3981.         add.w    #10,d0
  3982.         moveq    #0,d1
  3983.         RECALL    AllocMem
  3984.         move.l    d0,a1
  3985.         move.l    a1,d0
  3986.         beq.s    4$
  3987.         move.l    d0,a3
  3988.         move.b    procnum+1(a4),8(a1)
  3989.         move.b    d5,9(a1)
  3990.         lea    fkeys(a4),a0
  3991.         RECALL    AddHead
  3992.         lea    10(a3),a3
  3993.         subq.w    #1,d5
  3994. 3$        move.b    (a5)+,(a3)+
  3995.         dbeq    d5,3$
  3996. 4$        rts
  3997.  
  3998. clrfkeys    move.l    sysbase(a4),a6
  3999. 2$        lea    fkeys(a4),a0
  4000.         RECALL    RemHead
  4001.         move.l    d0,a1
  4002.         move.l    a1,d0
  4003.         beq.s    1$
  4004.         bsr.s    removefkey
  4005.         bra.s    2$
  4006. 1$        rts
  4007.  
  4008. removefkey    move.b    9(a1),d0        ; length
  4009.         ext.w    d0
  4010.         ext.l    d0
  4011.         add.w    #10,d0
  4012.         jmp    _LVOFreeMem(a6)
  4013.  
  4014. ;'flushlibs'
  4015.  
  4016. flush        moveq    #-1,d0
  4017.         moveq    #0,d1
  4018.         move.l    sysbase(a4),a6
  4019.         jmp    _LVOAllocMem(a6)
  4020.  
  4021. ;display library->lib_IDString
  4022.  
  4023. info        bsr    nodenam2
  4024.         moveq    #2,d7
  4025.         lea    DevNode(pc),a3
  4026.         bsr    findnam
  4027.         tst.b    d7
  4028.         beq.s    removefkey-2        ; hack !
  4029.         move.l    d0,a0
  4030.         move.l    24(a0),d0
  4031.         beq.s    if2
  4032.         move.l    d0,a0
  4033.         tst.b    (a0)
  4034.         bne.s    if1
  4035. if2        move.w    #noinfo,d0
  4036.         bsr    putstrw
  4037.         move.l    a5,d0
  4038. if1        bra    putnam
  4039.  
  4040. ; reset vectors
  4041.  
  4042. capture        move.l    sysbase(a4),a1
  4043.         lea     42(a1),a0
  4044.         moveq    #2,d6
  4045.         lea    coldtxt(a4),a3
  4046. cap0        move.l    a3,d0
  4047.         bsr    putstr
  4048.         move.l    (a0)+,d0
  4049.         bne.s    cap1
  4050.         move.w    #unset,d0
  4051.         bsr    putstrw
  4052.         bra.s    cap2
  4053. cap1        bsr    hexa
  4054. cap2        bsr    newline
  4055.         lea     15(a3),a3
  4056.         dbra    d6,cap0
  4057.         move.w    #kicktxt,d0
  4058.         bsr    putstrw
  4059.         move.l    546(a1),d0
  4060.         bne.s    kickm3
  4061.         move.w    #unset,d0
  4062.         bra    putnamw
  4063. kickm3        move.l    d0,-(sp)
  4064.         bsr    newline
  4065.         lea    kickhead(a4),a0
  4066.         bsr    puthead
  4067.         move.l    (sp)+,a0
  4068. kickm0        move.l    a0,d0
  4069.         beq.s    kickm4
  4070.         bpl.s    kickm1
  4071.         bclr    #31,d0
  4072.         move.l    d0,a0
  4073.         bra.s    kickm0
  4074. kickm1        move.w    14(a0),d6
  4075.         subq.w    #1,d6
  4076.         lea    16(a0),a2
  4077. kickm2        move.l    0(a2),d0
  4078.         bsr    hexa
  4079.         move.l    (a2)+,d0
  4080.         move.l    (a2)+,d4
  4081.         add.l    d4,d0
  4082.         bsr    hexa
  4083.         move.l    d4,d0
  4084.         moveq    #0,d3
  4085.         bsr    longdec
  4086.         bsr    newline
  4087.         dbra    d6,kickm2
  4088.         move.l    0(a0),a0
  4089.         bra.s    kickm0
  4090. kickm4        rts
  4091.  
  4092. clrcold        moveq    #42,d0
  4093.         bra.s    chksum
  4094. clrcool        moveq    #46,d0
  4095.         bra.s    chksum
  4096. clrwarm        moveq    #50,d0
  4097.  
  4098. chksum        move.l    sysbase(a4),a0
  4099.         clr.l    0(a0,d0.w)
  4100.         lea    34(a0),a1
  4101.         moveq    #22,d0
  4102. addchk        add.w    (a1)+,d1
  4103.         dbra     d0,addchk
  4104.         not.w    d1
  4105.         move.w    d1,82(a0)
  4106.         rts
  4107.  
  4108. ;Save the command line to be repeated. If this line doesn't produce
  4109. ;any output, don't repeat it at all
  4110. repeatcmd    not.b    repeat(a4)
  4111.         beq.s    3$
  4112.         move.w    repeatlen(a4),d0
  4113.         subq.w    #7,d0
  4114.         beq.s    4$
  4115.         move.w    d0,repeatlen(a4)
  4116.         lea    repeatbuffer(a4),a1
  4117.         lea    dummy(a4),a2
  4118.         move.w    d0,d1
  4119. 1$        move.b    0(a0),(a1)+
  4120.         move.b    (a0)+,(a2)+
  4121. 2$        dbra    d1,1$
  4122.         clr.l    lastprinted(a4)
  4123.         clr.b    printed(a4)
  4124.         bsr    cli
  4125.         tst.b    printed(a4)
  4126.         beq.s    4$
  4127.         bsr    starttimer
  4128. 3$        rts
  4129. 4$        clr.b    repeat(a4)
  4130.         bra.s    3$
  4131.  
  4132. ;save the parameters from a 'window x y width height' call
  4133. setwindow    tst.l    infile(a4)
  4134.         bne.s    wiw1
  4135. wiw3        move.w    #wiwerr,d0
  4136.         bra    putnamw
  4137. wiw1        lea    window_l(a4),a3
  4138.         moveq    #3,d5
  4139. wiw0        bsr    getnum
  4140.         tst.w    d7
  4141.         beq.s    wiw2
  4142.         move.w    d2,(a3)+
  4143.         dbra    d5,wiw0
  4144. wiw2        rts
  4145.  
  4146. iconpos        bsr    getnum            ; set icon position
  4147.         tst.w    d7
  4148.         beq.s    1$
  4149.         move.w    d2,-(sp)
  4150.         bsr    getnum
  4151.         swap    d2
  4152.         move.w    (sp)+,d2
  4153.         swap    d2            ; X.w,Y.w
  4154.         tst.w    d7
  4155.         beq.s    1$
  4156.         move.l    d2,icnwindow(a4)    ; store new pos
  4157. 1$        rts
  4158.  
  4159. iconbackdrp    eor.w    #$100,icnwindow+16(a4)    ; wn_Flags+2
  4160.         rts
  4161.  
  4162. ;toggle prop gadget on/off
  4163. propgad        moveq    #0,d7
  4164.         lea    propgadon(a4),a2
  4165.         lea    sbgadget(a4),a3
  4166.         bra.s    gadonoff
  4167.  
  4168. ;toggle iconify gadget on/off
  4169. icongad        moveq    #1,d7
  4170.         lea    iconifyon(a4),a2
  4171.         lea    iconifgad(a4),a3
  4172.  
  4173. gadonoff    move.b    (a2),-(sp)        ; save old state
  4174.         bsr.s    onoff
  4175.         move.b    (sp)+,d0
  4176.         tst.w    d7
  4177.         beq.s    3$            ; not iconify gadget
  4178.         tst.b    ownscreen(a4)
  4179.         bne.s    1$            ; only window valid
  4180.         tst.b    post_V34(a4)
  4181.         bne.s    1$            ; only pre Kick2.0+
  4182. 3$        tst.l    infile(a4)
  4183.         bne.s    1$            ; from file
  4184.         cmp.b    (a2),d0
  4185.         beq.s    1$            ; oldstate == newstate !
  4186.         move.l    intuibase(a4),a6
  4187.         move.w    #_LVORemoveGadget,d1
  4188.         tst.b    (a2)
  4189.         beq.s    2$
  4190.         move.w    #_LVOAddGadget,d1
  4191. 2$        moveq    #0,d0            ; top of list !
  4192.         move.l    wnptr(a4),a0
  4193.         move.l    a3,a1
  4194.         jsr    0(a6,d1.w)        ; RemoveGadget or AddGadget
  4195.         bsr    setupscreen
  4196. 1$        rts
  4197.  
  4198. ;toggle patchmode
  4199. smartpatch    lea    patchmode(a4),a2
  4200.         bra.s    onoff
  4201.  
  4202. ;toggle commodity on/off
  4203. cxhandler    lea    cxstate(a4),a2
  4204.         bsr.s    onoff
  4205.         bra    setwintitle
  4206.  
  4207. ;toggle TaskInfo
  4208. taskinfo    lea    tinfo(a4),a2
  4209.         bra.s    onoff
  4210.  
  4211. ;toggle CLI-Commands
  4212. clicmd        lea    cmdcli(a4),a2
  4213.         bra.s    onoff
  4214.  
  4215. ;toggle task-header display
  4216. nohead        lea    headon(a4),a2
  4217.         bra.s    onoff
  4218.  
  4219. ;toggle hide entries
  4220. hidden        lea    hideon(a4),a2
  4221.         bra.s    onoff
  4222.  
  4223. ;toggle sort on/off
  4224. sort        lea    sorton(a4),a2
  4225.         bra.s    onoff
  4226.  
  4227. ;toggle task-ports display
  4228. taskports    lea    tports(a4),a2
  4229.         bra.s    onoff
  4230.  
  4231. ;toggle CPUSE task list
  4232. usage        lea    useageon(a4),a2
  4233.  
  4234. ;test if 'on'(-1) or 'off'(0) was entered
  4235.  
  4236. onoff        bsr    kllblnks
  4237.         moveq    #0,d2
  4238.         lea    offstr(a4),a1
  4239.         bsr    strcmp
  4240.         beq.s    1$
  4241.         subq.b    #1,d2
  4242.         lea    onstr(a4),a1
  4243.         bsr    strcmp
  4244.         beq.s    1$
  4245.         eor.b    d2,0(a2)
  4246.         move.b    0(a2),d2
  4247. 1$        move.b    d2,0(a2)
  4248.         rts
  4249.  
  4250. ;Open a library
  4251. openlib        bsr    nodenam2
  4252.         move.l    a5,a1
  4253.         moveq    #0,d0
  4254.         CALL    OpenLibrary,sysbase(a4)
  4255.         tst.l    d0
  4256.         beq    fn5
  4257. opli1        rts
  4258.  
  4259. ;close it
  4260. closelib    bsr    nodenam2
  4261.         moveq    #0,d7
  4262.         lea    LibNode(pc),a3
  4263.         bsr    findnam
  4264.         tst.b    d7
  4265.         beq.s    clli1
  4266.         move.l    d0,a1
  4267.         CALL    CloseLibrary,sysbase(a4)
  4268. clli1        rts
  4269.  
  4270. remnode        bsr    nodenam2
  4271.         moveq    #7,d7
  4272.         lea    TReNode(pc),a3
  4273.         bsr    findnam
  4274.         tst.b    d7
  4275.         beq.s    1$
  4276.         move.l    d0,-(sp)
  4277.         CALL    Disable,sysbase(a4)
  4278.         move.l    (sp)+,a1
  4279.         RECALL    Remove
  4280.         RECALL    Enable
  4281. 1$        rts
  4282.  
  4283. remport        bsr    nodenam2
  4284.         moveq    #0,d7
  4285.         lea    PorNode(pc),a3
  4286.         bsr    findnam
  4287.         tst.b    d7
  4288.         beq.s    1$
  4289.         move.l    d0,a1
  4290.         move.b    #2,14(a1)
  4291.         CALL    RemPort,sysbase(a4)
  4292. 1$        rts
  4293.  
  4294. closetsports    movem.l    d1-d6/a0-a6,-(sp)
  4295.         move.l    d0,d6
  4296.         move.l    sysbase(a4),a3
  4297.         lea    392(a3),a3
  4298. 1$        move.l    0(a3),a3
  4299.         tst.l    0(a3)
  4300.         beq.s    2$
  4301.         cmp.l    16(a3),d6
  4302.         bne.s    1$
  4303.         move.b    #2,14(a1)
  4304.         move.l    a3,a1
  4305.         CALL    RemPort,sysbase(a4)
  4306.         bra.s    1$
  4307. 2$        movem.l    (sp)+,d1-d6/a0-a6
  4308.         rts
  4309.  
  4310. remintserver    move.l    a0,-(sp)
  4311.         bsr    readhex
  4312.         move.l    (sp)+,a0
  4313.         tst.b    d7
  4314.         beq    syntax
  4315.         move.l    d0,d4
  4316.         moveq    #1,d6
  4317.         move.l    a0,-(sp)
  4318.         bsr    findint
  4319.         move.l    (sp)+,a5
  4320.         tst.w    d5
  4321.         bpl.s    1$
  4322.         bra    fn5
  4323. 1$        tst.b    0(a3,d1.w)
  4324.         bne.s    2$
  4325.         move.w    #nintrserv,d0
  4326.         bra    putnamw
  4327. 2$        move.l    d4,a1
  4328.         move.w    d1,d0
  4329.         CALL    RemIntServer,sysbase(a4)
  4330.         rts
  4331.  
  4332. ;Remove a resident module from the list. Clears the rt_Matchword
  4333. ;to avoid being found and reinserted during the next reset
  4334.  
  4335. remresident    bsr    nodenam2
  4336.         cmp.b    #'$',0(a5)
  4337.         bne.s    1$
  4338.         move.l    a5,a0
  4339.         bsr    readhex
  4340.         move.l    sysbase(a4),a6
  4341.         tst.b    d7
  4342.         bne.s    2$
  4343. 1$        move.l    a5,a1
  4344.         RECALL    FindResident
  4345.         tst.l    d0
  4346.         beq    fn5
  4347.  
  4348. 2$        move.l    300(a6),a3        ; SysBase->ResModules
  4349. 8$        move.l    (a3)+,d1
  4350.         beq    fn5
  4351.         bpl.s    3$
  4352.         bclr    #31,d1
  4353.         movea.l    d1,a3
  4354.         bra.s    8$
  4355.  
  4356. 3$        cmp.l    d1,d0
  4357.         bne.s    8$
  4358.  
  4359. 4$        move.l    a3,a5
  4360. 5$        tst.l    (a5)+
  4361.         bgt.s    5$
  4362.  
  4363. 6$        move.l    d0,a1
  4364.         clr.w    0(a1)            ; rt_MatchTag
  4365.         clr.b    10(a1)            ; rt_Flags
  4366.         clr.l    22(a1)            ; rt_Init
  4367.         move.l    a5,d0
  4368.         sub.l    a3,d0
  4369.         lsr.w    #2,d0
  4370.         subq.w    #1,d0
  4371.         lea    -4(a3),a1
  4372. 7$        move.l    (a3)+,(a1)+
  4373.         dbra    d0,7$
  4374.         rts
  4375.  
  4376. ;end Xoper but stay in background
  4377. quithold    lea    dummy(a4),a0
  4378.         lea    in(a4),a1
  4379. qh1        move.b    (a0),(a1)+
  4380.         cmp.b    #10,(a0)+
  4381.         bne.s    qh1
  4382.  
  4383. instback    move.l    infile(a4),d1
  4384.         beq.s    7$
  4385.         CALL    Close,dosbase(a4)
  4386.         clr.l    infile(a4)
  4387.  
  4388. 7$        st    wanthold(a4)
  4389.         moveq    #0,d0
  4390.         bsr    CloseGUI        ; close screen & window
  4391.         beq.s    quithold-2        ; hack ! (pubscreen used)
  4392.         tst.b    wantwindow(a4)
  4393.         beq.s    6$
  4394.         clr.b    wantwindow(a4)
  4395.         clr.b    ownscreen(a4)
  4396.  
  4397. 6$        bsr    killpage
  4398.         bsr    freeblank
  4399.  
  4400.         move.l    mysignal(a4),d0        ; build signal mask
  4401.         or.l    trapsignal(a4),d0
  4402.         move.w    cxsig(a4),d1
  4403.         beq.s    5$
  4404.         bset    d1,d0
  4405. 5$        tst.b    iconifyon(a4)
  4406.         beq.s    4$
  4407.         bsr.s    iconify
  4408.         bra.s    2$
  4409.  
  4410. 4$        CALL    Wait,sysbase(a4)
  4411.         and.l    trapsignal(a4),d0
  4412.         beq.s    3$
  4413.         st    gotguru(a4)        ; guru !!
  4414. 3$        bsr    ChkBroker
  4415. 2$        clr.b    wanthold(a4)
  4416.         tst.b    wantexit(a4)
  4417.         beq.s    1$
  4418.         bsr    exitall            ; try quit
  4419. 1$        move.l    realstack(a4),sp
  4420.         bra    restart
  4421.  
  4422. ; appicon (d7=2) or a window (d7=0) !
  4423.  
  4424. iconify        move.l    d0,d6            ; save signal mask
  4425.         moveq    #2,d7
  4426.         move.l    a4,-(sp)
  4427.         move.l    wbbase(a4),d0        ; try appicon
  4428.         beq.s    3$
  4429.         move.l    d0,a6            ; library base
  4430.         moveq    #0,d0            ; id
  4431.         moveq    #0,d1            ; userdata
  4432.         suba.l    a0,a0            ; name
  4433.         move.l    replyport(a4),a1    ; port
  4434.         suba.l    a2,a2            ; lock
  4435.         lea    appobj(a4),a3        ; diskobj
  4436.         suba.l    a4,a4            ; tagitems
  4437.         RECALL    AddAppIcon
  4438. 3$        move.l    (sp)+,a4
  4439.         tst.l    d0
  4440.         bne.s    4$
  4441.         moveq    #0,d7
  4442.         lea    icnwindow(a4),a0    ; try icon window
  4443.         CALL    OpenWindow,intuibase(a4)
  4444. 4$        move.l    d0,wnptr(a4)
  4445.         move.b    d7,appicn(a4)
  4446.         bsr.s    handleiconify        ; do iconify
  4447.         move.l    wnptr(a4),d0
  4448.         beq.s    6$
  4449.         move.l    d0,a0
  4450.         moveq    #_LVORemoveAppIcon,d0
  4451.         tst.w    d7
  4452.         bne.s    5$
  4453.         moveq    #_LVOCloseWindow,d0
  4454. 5$        jsr    0(a6,d0.w)        ; remove iconify stuff
  4455.         clr.l    wnptr(a4)
  4456. 6$        clr.b    appicn(a4)
  4457.         rts
  4458.  
  4459. ; wait for wakeup
  4460.  
  4461. handleiconify    move.l    a6,-(sp)
  4462.         move.l    sysbase(a4),a6        ; setup a6 to ExecBase
  4463.  
  4464. waitforcall    moveq    #0,d0            ; build sig mask
  4465.         move.l    replyport(a4),a2
  4466.         tst.w    d7
  4467.         bne.s    1$            ; appicon
  4468.         move.l    wnptr(a4),d2
  4469.         beq.s    2$
  4470.         move.l    d2,a2
  4471.         move.l    86(a2),a2        ; wn->UserPort
  4472. 1$        moveq    #0,d2
  4473.         move.b    15(a2),d2        ; Port->SigBit
  4474.         bset    d2,d0
  4475. 2$        or.l    d6,d0            ; complete mask
  4476.         RECALL    Wait
  4477.         st    gotguru(a4)
  4478.         move.l    trapsignal(a4),d1
  4479.         and.l    d0,d1
  4480.         bne.s    icondone        ; guru !!
  4481.         clr.b    gotguru(a4)
  4482.         btst    #mysigbit,d0
  4483.         bne.s    icondone        ; hotkey !!
  4484.  
  4485.         bsr    ChkBroker        ; check broker port
  4486.  
  4487. fromport    move.l    a2,a0            ; wn->UserPort
  4488.         RECALL    GetMsg
  4489.         move.l    d0,a1
  4490.         move.l    a1,d0
  4491.         beq.s    waitforcall
  4492.         move.l    30(a1),-(sp)
  4493.         RECALL    ReplyMsg
  4494.         tst.w    d7            ; app icon ?
  4495.         bne.s    1$
  4496.         move.l    a6,(sp)            ; only flag
  4497.         bsr.s    chkpos
  4498.         bne.s    1$
  4499.         lea    osecs(a4),a3
  4500.         lea    8(a3),a0        ; nsecs
  4501.         lea    12(a3),a1        ; nmics
  4502.         move.l    a6,-(sp)
  4503.         CALL    CurrentTime,intuibase(a4)
  4504.         movem.l    0(a3),d0-d3
  4505.         RECALL    DoubleClick
  4506.         move.l    (sp)+,a6
  4507.         move.l    8(a3),(a3)+        ; nsecs->osecs
  4508.         move.l    8(a3),(a3)+        ; nmics->omics
  4509.         tst.l    d0
  4510.         beq.s    1$
  4511.         clr.l    (sp)            ; clear value
  4512. 1$        move.l    (sp)+,d0
  4513.         bne.s    fromport
  4514.  
  4515. icondone    move.l    (sp)+,a6
  4516.         tst.w    d7            ; appicon or window ?
  4517.         bne.s    chkpos2
  4518.  
  4519. chkpos        move.l    wnptr(a4),d0        ; window moved ?
  4520.         beq.s    chkpos2
  4521.         move.l    d0,a0
  4522.         move.l    4(a0),d0        ; new pos
  4523.         move.l    icnwindow(a4),d1    ; old pos
  4524.         move.l    d0,icnwindow(a4)    
  4525.         sub.l    d1,d0            ; zero == nothing changed !
  4526. chkpos2        rts
  4527.  
  4528. ;fill all unused memory-chunks with a longword
  4529. clear        moveq    #0,d0
  4530.         cmp.b    #10,0(a0)
  4531.         beq.s    clr5
  4532.         bsr    readhex
  4533.         tst.b    d7
  4534.         beq    syntax
  4535. clr5        move.l    sysbase(a4),a0
  4536.         clr.l    parmtxt(a4)
  4537.         lea     322(a0),a0
  4538.         move.w    #$4000,$dff09a
  4539. clr1        move.l    0(a0),a0
  4540.         tst.l    0(a0)
  4541.         beq.s    clr6
  4542.         move.l    16(a0),a1
  4543. clr2        tst.l    0(a1)
  4544.         beq.s    clr1
  4545.         addq.l    #1,parmtxt(a4)
  4546.         move.l    4(a1),d1
  4547.         subq.l    #8,d1
  4548.         ble.s    clr31
  4549.         lsr.l    #2,d1
  4550.         subq.l    #1,d1
  4551.         bmi.s    clr31
  4552.         lea     8(a1),a2
  4553. clr3        move.l    d0,(a2)+
  4554.         dbra    d1,clr3
  4555. clr31        move.l    0(a1),a1
  4556.         bra.s    clr2
  4557. clr6        move.w    #$C000,$dff09a
  4558.         move.l    parmtxt(a4),d0
  4559.         moveq    #0,d3
  4560.         bsr    longdec
  4561.         move.w    #clrtxt,d0
  4562.         bra    putnamw
  4563.  
  4564. ;change the number of maximum lines in the history buffer
  4565. historylines    bsr    getnum
  4566.         tst.b    d7
  4567.         beq    syntax
  4568.         move.w    d2,maxhlines(a4)
  4569.         move.w    hnum(a4),d0
  4570. 1$        cmp.w    maxhlines(a4),d0
  4571.         ble.s    2$
  4572.         bsr    remhistline
  4573.         subq.w    #1,d0
  4574.         bra.s    1$
  4575. 2$        move.l    history+8(a4),curhist(a4)
  4576.         move.w    d0,hnum(a4)
  4577.         rts
  4578.  
  4579. ;set the minimum number of characters a input line
  4580. ;must have to be added to the history buffer
  4581. historylength    bsr    getnum
  4582.         tst.b    d7
  4583.         beq    syntax
  4584.         tst.b    d2
  4585.         bne.s    1$
  4586.         addq.w    #1,d2
  4587. 1$        move.w    d2,minnumchars(a4)
  4588.         rts
  4589.  
  4590. ;display all lines in the history buffer
  4591. showhistory    lea    inputbuffer(a4),a3
  4592.         moveq    #1,d5
  4593.         move.l    history(a4),a5
  4594. 1$        tst.l    0(a5)
  4595.         beq.s    2$
  4596.         move.l    d5,d3
  4597.         bsr    bytedec
  4598.         moveq    #0,d0
  4599.         move.w    8(a5),d0
  4600.         clr.b    0(a3,d0.w)
  4601.         lea    10(a5),a0
  4602.         move.l    a3,a1
  4603.         CALL    CopyMem,sysbase(a4)
  4604.         move.l    a3,d0
  4605.         bsr    putnam
  4606.         move.l    0(a5),a5
  4607.         addq.l    #1,d5
  4608.         bra.s    1$
  4609. 2$        rts
  4610.  
  4611. ;set the maximum lines the output buffer may hold
  4612. outputlines    bsr    getnum
  4613.         tst.b    d7
  4614.         beq    syntax
  4615.         moveq    #100,d3
  4616.         tst.l    d2
  4617.         bmi.s    2$
  4618.         cmp.l    d3,d2
  4619.         bge.s    1$
  4620. 2$        move.l    d3,d2
  4621. 1$        move.l    d2,maxlines(a4)
  4622.         rts
  4623.  
  4624. ;find a named node
  4625. ;d7 = number of lists to search through
  4626. ;a3 = pointer to the first entry in the
  4627. ;     list-offset-table
  4628. ;a5 = pointer to name
  4629. ;returns:
  4630. ;d7 = TRUE(1) / FALSE (0)
  4631. ;d0 = node
  4632. findnam        tst.b    0(a5)
  4633.         bne.s    1$
  4634.         move.w    #nameerr,d0
  4635.         bsr    putnamw
  4636.         bra    fnerr
  4637. 1$        cmp.b    #'$',0(a5)
  4638.         bne.s    fn2
  4639.         move.l    d7,d2
  4640.         move.l    a5,a0
  4641.         bsr    readhex
  4642.         tst.b    d7
  4643.         beq.s    fn6
  4644.         move.l    d2,d7
  4645.         bsr.s    tstnode
  4646.         tst.w    d5
  4647.         bne.s    fn3
  4648.         bra    fn5
  4649. fn6        move.l    d2,d7
  4650. fn2        move.l    sysbase(a4),a0
  4651.         adda.l    0(a3),a0
  4652.         move.l    a5,a1
  4653. fn4        CALL    FindName,sysbase(a4)
  4654.         move.l    d0,a0
  4655.         move.l    a0,d0
  4656.         bne.s    fn1
  4657. fn41        addq.w    #4,a3
  4658.         dbra    d7,fn2
  4659. fn5        move.w    #namerr,d0
  4660.         bsr    putstrw
  4661.         move.l    a5,d0
  4662.         bsr    putnam
  4663. fnerr        moveq    #0,d7
  4664.         rts
  4665. fn1        move.w    procnum(a4),d2
  4666.         beq.s    fn3
  4667.         cmp.b    143(a0),d2
  4668.         bne.s    fn41
  4669. fn3        moveq    #1,d7
  4670.         rts
  4671.  
  4672. ;list-offset-table
  4673. TRuNode        dc.l    276
  4674. TReNode        dc.l    406
  4675. TWaNode        dc.l    420
  4676. DevNode        dc.l    350
  4677. LibNode        dc.l    378
  4678. ResNode        dc.l    336
  4679. MemNode        dc.l    322
  4680. PorNode        dc.l    392
  4681. SemNode        dc.l    532
  4682.  
  4683. ;Node has been entered in hex. Check if this node exsists
  4684. tstnode        tst.l    infile(a4)
  4685.         bne.s    illegalhex
  4686.         move.l    d0,d1
  4687.         btst    #0,d1
  4688.         beq.s    inrange
  4689.         move.w    #adrerr,d0
  4690.         bsr    putnamw
  4691. illegalhex    moveq    #0,d5
  4692.         rts
  4693. inrange        movem.l    d7/a3,-(sp)
  4694.         moveq    #1,d5
  4695.         lea    TRuNode(pc),a0
  4696.         cmp.l    a0,a3
  4697.         bne.s    1$
  4698.         move.l    sysbase(a4),a0
  4699.         cmp.l    276(a0),d0
  4700.         beq.s    nodefound
  4701.         subq.w    #1,d7
  4702.         addq.w    #4,a3
  4703. 1$        move.w    #$4000,$dff09a
  4704. getlist        move.l    sysbase(a4),a0
  4705.         add.l    0(a3),a0
  4706. nxtnode        tst.l    0(a0)
  4707.         beq.s    nxtlist
  4708.         cmp.l    a0,d0
  4709.         beq.s    nodefound
  4710.         move.l    0(a0),a0
  4711.         bra.s    nxtnode
  4712. nxtlist        addq.w    #4,a3
  4713.         dbra    d7,getlist
  4714.         moveq    #0,d5
  4715. nodefound    move.w    #$C000,$dff09a
  4716.         movem.l    (sp)+,d7/a3
  4717.         rts
  4718.  
  4719. ;allocate FileInfoBlock
  4720. allocfinfo    addq.b    #1,finfopen(a4)
  4721.         bne.s    1$
  4722.         move.l    #260,d0
  4723.         moveq    #0,d1
  4724.         CALL    AllocMem,sysbase(a4)
  4725.         move.l    d0,finfoptr(a4)
  4726. 1$        rts
  4727.  
  4728. ;free FileInfoBlock
  4729. freefinfo    subq.b    #1,finfopen(a4)
  4730.         bpl.s    1$
  4731.         move.l    #260,d0
  4732.         move.l    finfoptr(a4),d1
  4733.         beq.s    1$
  4734.         move.l    d1,a1
  4735.         CALL    FreeMem,sysbase(a4)
  4736.         clr.l    finfoptr(a4)
  4737. 1$        rts
  4738.  
  4739. ;Examine ,d0=Lock
  4740. getfinfo    move.l    d0,d1
  4741.         move.l    finfoptr(a4),d2
  4742.         CALL    Examine,dosbase(a4)
  4743.         rts
  4744.  
  4745. ;construct a Pathname from a lock
  4746. ;d0=Lock ,resulting string is written to window
  4747. getpath        movem.l    d1-d7/a0-a6,-(sp)
  4748.         move.l    d0,d1
  4749.         beq.s    1$
  4750.         CALL    DupLock,dosbase(a4)
  4751. 1$        lea    out(a4),a3
  4752.         clr.b    -(a3)
  4753. gp0        move.l    d0,d5
  4754.         bsr.s    getfinfo
  4755.         move.l    finfoptr(a4),a0
  4756.         move.l    4(a0),d4
  4757.         addq.l    #8,a0
  4758.         bsr    strlen
  4759.         lea    -1(a3),a5
  4760.         tst.l    d4
  4761.         bmi.s    nodir
  4762.         move.b    #'/',-(a3)
  4763. nodir        subq.w    #1,d0
  4764.         bmi.s    nofnam
  4765. gp1        move.b    0(a0,d0.w),-(a3)
  4766.         dbra    d0,gp1
  4767. nofnam        move.l    d5,d1
  4768.         CALL    ParentDir,dosbase(a4)
  4769.         move.l    d0,d4
  4770.         move.l    d5,d1
  4771.         beq.s    2$
  4772.         CALL    UnLock,dosbase(a4)
  4773. 2$        move.l    d4,d0
  4774.         bne.s    gp0
  4775.         cmp.b    #'/',0(a5)
  4776.         bne.s    gp2
  4777.         move.b    #':',0(a5)
  4778. gp2        move.l    a3,d0
  4779.         bsr    putnam
  4780.         movem.l    (sp)+,d1-d7/a0-a6
  4781.         rts
  4782.  
  4783. dchange        lea    dchead(a4),a0
  4784.         bsr    puthead
  4785.         move.l    sysbase(a4),a6
  4786.         lea    350(a6),a0
  4787.         lea    tdname(a4),a1
  4788.         RECALL    FindName
  4789.         move.l    d0,a2
  4790.         move.l    a2,d0
  4791.         beq    14$
  4792.         lea    36(a2),a2
  4793.         moveq    #0,d5
  4794. 2$        move.l    (a2)+,d2
  4795.         beq    3$
  4796.         RECALL    Disable
  4797.         move.l    d2,a0
  4798.         lea    $18e(a0),a0
  4799. 5$        tst.l    0(a0)
  4800.         beq.s    6$
  4801.         move.l    0(a0),a0
  4802.         bra.s    5$
  4803. 6$        lea    -4(a0),a5
  4804.         lea    buffer+100(a4),a3
  4805. 9$        move.l    0(a5),a5
  4806.         tst.l    0(a5)
  4807.         beq.s    11$
  4808.         move.l    a5,(a3)+
  4809.         bne.s    9$
  4810. 11$        clr.l    (a3)+
  4811.         RECALL    Enable
  4812.         lea    buffer+100(a4),a3
  4813. 7$        move.l    (a3)+,d0
  4814.         beq.s    3$
  4815.         move.l    d0,a5
  4816.         cmp.w    #20,28(a5)
  4817.         bne.s    7$
  4818.         move.l    40(a5),a3
  4819.         move.l    a3,d0
  4820.         move.l    d0,node(a4)
  4821.         bsr    hexan
  4822.         move.l    a3,d0
  4823.         beq.s    10$
  4824.         move.l    14(a3),d0
  4825.         bsr    hexan
  4826.         move.l    18(a3),d0
  4827.         bsr    hexan
  4828. 10$        move.l    d5,d3
  4829.         or.b    #48,d3
  4830.         move.b    d3,tddrives+2(a4)
  4831.         move.w    #tddrives,d0
  4832.         bsr    putstrw
  4833.         move.l    14(a5),d0
  4834.         beq.s    8$
  4835.         move.l    d0,a0
  4836.         move.l    16(a0),d0
  4837. 8$        bsr    getaskname2
  4838.         bsr    newline
  4839.         bra.s    7$
  4840. 3$        addq.w    #1,d5
  4841.         cmp.w    #4,d5
  4842.         bcs    2$
  4843. 14$        rts
  4844.  
  4845. snoop        lea    snoophead(a4),a2
  4846.         moveq    #0,d2
  4847.         bsr    InitSnoop
  4848.         beq.s    snoop-2
  4849.  
  4850.         tst.b    msnoop(a4)
  4851.         bne.s    1$            ; already patched !
  4852.         RECALL    Forbid
  4853.         move.l    #_LVOAllocMem,d0
  4854.         lea    capmalloc(pc),a0
  4855.         exg.l    d0,a0
  4856.         move.l    a6,a1
  4857.         RECALL    SetFunction
  4858.         move.l    d0,OldAllocMem(a4)
  4859.         move.l    #_LVOFreeMem,d0
  4860.         lea    capmfree(pc),a0
  4861.         exg.l    d0,a0
  4862.         move.l    a6,a1
  4863.         RECALL    SetFunction
  4864.         move.l    d0,OldFreeMem(a4)
  4865.         st    msnoop(a4)
  4866.         RECALL    Permit
  4867.  
  4868. 1$        st    snoopon(a4)        ; enable snooping
  4869.         clr.b    bool(a4)
  4870.         clr.b    capgone(a4)
  4871.         clr.b    capwaiting(a4)
  4872.         clr.l    capiscli(a4)
  4873.  
  4874.         move.l    captask(a4),a1
  4875.         cmp.b    #13,8(a1)        ; ln_Type
  4876.         bne.s    waitmem
  4877.         tst.l    140(a1)
  4878.         beq.s    waitmem
  4879.         move.l    172(a1),d0        ; pr_CLI
  4880.         beq.s    waitmem
  4881.         lsl.l    #2,d0
  4882.         move.l    d0,a0
  4883.         lea     60(a0),a0
  4884.         move.l    a0,capiscli(a4)
  4885.         move.l    0(a0),d0
  4886.         move.l    d0,capseg(a4)
  4887.         bne.s    waitmem
  4888.         move.w    #capwait,d0
  4889.         bsr    putnamw
  4890.         st    capwaiting(a4)
  4891.  
  4892. waitmem        bsr    processmsgs
  4893.  
  4894. tm7        move.l    snoopport(a4),a0
  4895.         CALL    GetMsg,sysbase(a4)
  4896.         move.l    d0,a3
  4897.         move.l    a3,d0
  4898.         bne.s    tm8
  4899.         tst.b    cbreak(a4)
  4900.         bne    snoopend
  4901.         tst.b    capgone(a4)
  4902.         bne    snoopend
  4903.         bra.s    waitmem
  4904.  
  4905. tm8        tst.b    capwaiting(a4)
  4906.         beq.s    tm15
  4907.         move.l    capiscli(a4),d7
  4908.         beq.s    tm15
  4909.         move.l    d7,a0
  4910.         move.l    0(a0),capseg(a4)
  4911.         beq    tm12
  4912.         clr.b    capwaiting(a4)
  4913.  
  4914. tm15        move.l    20(a3),d3
  4915.         tst.b    36(a3)            ; free or alloc ?
  4916.  
  4917.         beq    freed
  4918.         move.w    #allok,d0
  4919.         bsr    putstrw
  4920.         lea    memname(pc),a2
  4921.         moveq    #9,d5
  4922. tm2        move.w    (a2)+,d1
  4923.         btst    d1,d3
  4924.         beq.s    tm1
  4925.         move.w    (a2),d0
  4926.         bsr    putstrw
  4927. tm1        addq.w    #2,a2
  4928.         dbra    d5,tm2
  4929.         moveq    #41,d1
  4930.         bsr    tab            ; d0 - actual pos
  4931.         bsr    putblank
  4932.         move.l    24(a3),d0
  4933.         move.l    d0,d3
  4934.         bsr    hexa
  4935.         move.l    28(a3),d0
  4936.         bne.s    tm3
  4937.         move.w    #failed,d0
  4938.         bsr    putstrw
  4939.         moveq    #53,d1
  4940.         bsr    tab
  4941.         bra.s    tm4
  4942. tm3        bsr    hexa
  4943.         move.l    28(a3),d0
  4944.         add.l    d3,d0
  4945.         bsr    hexa
  4946.         bra.s    tm4
  4947.  
  4948. freed        move.w    #free,d0
  4949.         bsr    putstrw
  4950.         move.b    #'-',d0
  4951.         moveq    #34,d1
  4952. tm9        bsr    putchar
  4953.         dbra    d1,tm9
  4954.         bsr    putblank
  4955.         move.l    d3,d0
  4956.         bsr    hexa
  4957.         move.l    24(a3),d0
  4958.         bsr    hexa
  4959.         move.l    24(a3),d0
  4960.         add.l    d3,d0
  4961.         bsr    hexa
  4962.  
  4963. tm4        move.l    32(a3),d0
  4964.         bsr    hexa
  4965.         bsr    newline
  4966. tm12        bsr    freemsg
  4967.         move.l    captask(a4),a1
  4968. tm13        tst.b    capwaiting(a4)
  4969.         bne.s    tm10
  4970.         move.l    capiscli(a4),d0
  4971.         beq.s    1$
  4972.         move.l    d0,a0
  4973.         move.l    0(a0),d0
  4974.         cmp.l    capseg(a4),d0
  4975.         bne.s    tm11
  4976. 1$        move.b    15(a1),d0
  4977.         cmp.b    #5,d0
  4978.         bge.s    tm11
  4979.         cmp.b    #2,d0
  4980.         bge.s    tm10
  4981. tm11        st    capgone(a4)
  4982. tm10        bra    tm7
  4983.  
  4984. snoopend    clr.b    snoopon(a4)        ; snooping off
  4985.         tst.b    msnoop(a4)
  4986.         beq.s    1$            ; nothing patched !
  4987.         CALL    Forbid,sysbase(a4)
  4988.         tst.b    patchmode(a4)
  4989.         beq.s    3$            ; don't check vectors
  4990.         lea    capmalloc(pc),a0
  4991.         cmp.l    _LVOAllocMem+2(a6),a0
  4992.         bne.s    2$            ; another patch !
  4993.         lea    capmfree(pc),a0
  4994.         cmp.l    _LVOFreeMem+2(a6),a0
  4995.         bne.s    2$            ; another patch !
  4996. 3$        move.l    OldFreeMem(a4),d0
  4997.         move.w    #_LVOFreeMem,a0
  4998.         move.l    a6,a1
  4999.         RECALL    SetFunction
  5000.         move.l    OldAllocMem(a4),d0
  5001.         move.w    #_LVOAllocMem,a0
  5002.         move.l    a6,a1
  5003.         RECALL    SetFunction
  5004.         clr.b    msnoop(a4)
  5005. 2$        RECALL    Permit
  5006. 1$        bra    ClrSnoop
  5007.  
  5008. memname        dc.w    31,memnoexp,18,memrev,17,memlarg,16,memclr,10,memkick
  5009.         dc.w    9,memdma,8,memloc,2,memfast,1,memchip,0,mempubl
  5010.  
  5011. capmalloc    movem.l    d0-d7/a0-a6,-(sp)    ; a6 - SysBase !
  5012.         lea    dataarea(pc),a4
  5013.         tst.b    snoopon(a4)
  5014.         beq.s    capm1            ; snooping disabled
  5015.         move.l    276(a6),d4
  5016.         cmp.l    captask(a4),d4
  5017.         bne.s    capm1
  5018.         tst.b    bool(a4)
  5019.         bne.s    capm1
  5020.         addq.b    #1,bool(a4)
  5021.         moveq    #40,d6
  5022.         bsr    allocmsg
  5023.         beq.s    capm2
  5024.         move.l    d1,20(a5)
  5025.         move.l    d0,24(a5)
  5026.         move.l    60(sp),32(a5)
  5027.         st    36(a5)            ; is alloc msg
  5028.         move.l    a5,remembr(a4)
  5029.         movem.l    (sp)+,d0-d7/a0-a6
  5030.         bsr.s    memalloc
  5031.         movem.l    d0-d7/a0-a6,-(sp)
  5032.         lea    dataarea(pc),a4
  5033.         move.l    remembr(a4),a1
  5034.         move.l    d0,28(a1)
  5035.         move.l    snoopport(a4),a0
  5036.         move.b    #5,8(a1)
  5037.         RECALL    PutMsg
  5038.         clr.b    bool(a4)
  5039.         movem.l    (sp)+,d0-d7/a0-a6
  5040.         rts
  5041. capm2        clr.b    bool(a4)
  5042. capm1        movem.l    (sp)+,d0-d7/a0-a6
  5043. memalloc    move.l    OldAllocMem+dataarea(pc),-(sp)
  5044.         rts
  5045.  
  5046. capmfree    movem.l    d0-d7/a0-a6,-(sp)    ; a6 - SysBase !
  5047.         lea    dataarea(pc),a4
  5048.         tst.b    snoopon(a4)
  5049.         beq.s    capf1            ; snooping disabled
  5050.         move.l    276(a6),d4
  5051.         cmp.l    captask(a4),d4
  5052.         bne.s    capf1
  5053.         tst.b    bool(a4)
  5054.         bne.s    capf1
  5055.         addq.b    #1,bool(a4)
  5056.         moveq    #40,d6
  5057.         bsr.s    allocmsg
  5058.         beq.s    capf2
  5059.         move.l    d0,20(a5)
  5060.         move.l    a1,24(a5)
  5061.         move.l    60(sp),32(a5)
  5062. ;        clr.b    36(a5)            ; is free msg
  5063.         move.l    snoopport(a4),a0
  5064.         move.b    #5,8(a5)
  5065.         move.l    a5,a1
  5066.         RECALL    PutMsg
  5067. capf2        clr.b    bool(a4)
  5068. capf1        movem.l (sp)+,d0-d7/a0-a6
  5069.         move.l  OldFreeMem+dataarea(pc),-(sp)
  5070.         rts
  5071.  
  5072. allocmsg    movem.l    d0-d1/a0-a1,-(sp)    ; a6 - SysBase
  5073.         move.l    d6,d0
  5074.         moveq    #1,d1
  5075.         swap    d1
  5076.         tst.b    msnoop(a4)        ; memory snooping ?
  5077.         bne.s    1$
  5078.         RECALL    AllocMem
  5079.         bra.s    2$
  5080. 1$        bsr.s    memalloc
  5081. 2$        tst.l    d0
  5082.         beq.s    alm1
  5083.         move.l    d0,a5
  5084.         move.w    d6,18(a5)
  5085. alm1        movem.l    (sp)+,d0-d1/a0-a1
  5086.         rts
  5087.  
  5088. freemsg        move.w    18(a3),d0
  5089.         ext.l    d0
  5090.         move.l    a3,a1
  5091.         CALL    FreeMem,sysbase(a4)
  5092.         rts
  5093.  
  5094. tracelocks    pea    DosTable+20(a4)        ; table entry for locks
  5095.         bra.s    tracedos
  5096.  
  5097. tracefiles    pea    DosTable+00(a4)        ; table entry for open
  5098.  
  5099. tracedos    lea    fileshead(a4),a2
  5100.         moveq    #1,d2
  5101.         bsr    InitSnoop
  5102.         move.l    (sp)+,a2
  5103.         beq.s    tracelocks-2        ; error
  5104.  
  5105.         RECALL    Forbid
  5106.         tst.b    5(a2)
  5107.         bne.s    9$            ; already patched !
  5108.         move.w    0(a2),a0        ; offset
  5109.         move.l    16(a2),d0        ; myfunc
  5110.         move.l    dosbase(a4),a1
  5111.         tst.b    post_V34(a4)
  5112.         beq.s    10$
  5113.         RECALL    SetFunction
  5114.         move.l    d0,12(a2)        ; OldFuncPtr
  5115.         bra.s    9$
  5116. 10$        move.w    0(a1,a0.w),6(a2)    ; OldVec1
  5117.         move.w    #$4ef9,0(a1,a0.w)
  5118.         move.l    2(a1,a0.w),8(a2)    ; OldVec2
  5119.         move.l    d0,2(a1,a0.w)
  5120.         lea    78(a1),a1
  5121.         move.l    a1,12(a2)        ; OldFuncPtr
  5122. 9$        moveq    #-1,d0
  5123.         move.w    d0,4(a2)        ; function patched & active
  5124.         RECALL    Permit
  5125.  
  5126. 8$        bsr    processmsgs
  5127.  
  5128. 7$        move.l    snoopport(a4),a0
  5129.         CALL    GetMsg,sysbase(a4)
  5130.         tst.l    d0
  5131.         bne.s    6$
  5132.         tst.b    cbreak(a4)
  5133.         bne.s    traceend
  5134.         bra.s    8$
  5135.  
  5136. 6$        move.l    d0,a3
  5137.         move.l    20(a3),d0
  5138.         bsr    getaskname2
  5139.         moveq    #11,d1
  5140.         bsr    tab
  5141.         moveq    #' ',d0
  5142.         bsr    putchar
  5143.         move.l    24(a3),d0
  5144.         bne.s    5$
  5145.         move.w    #failed,d0
  5146.         bsr    putstrw
  5147.         moveq    #21,d1
  5148.         bsr    tab
  5149.         bra.s    4$
  5150.  
  5151. 5$        bsr    hexa
  5152. 4$        move.b    28(a3),d0
  5153.         bmi.s    3$
  5154.         cmp.b    #2,d0
  5155.         ble.s    2$
  5156. 3$        move.w    #type,d0
  5157.         bsr    putstrw
  5158.         moveq    #28,d1
  5159.         bsr    tab
  5160.         bra.s    1$
  5161. 2$        ext.w    d0
  5162.         lsl.w    #3,d0
  5163.         add.w    #fmode,d0
  5164.         bsr    putstrw
  5165. 1$        moveq    #29,d0
  5166.         add.l    a3,d0
  5167.         bsr    putnam
  5168.  
  5169.         bsr    freemsg
  5170.         bra.s    7$
  5171.  
  5172. traceend    lea    DosTable+00(a4),a2
  5173.         bsr.s    remtrace        ; for Open()
  5174.         lea    DosTable+20(a4),a2
  5175.         bsr.s    remtrace        ; for Lock()
  5176.         bra    ClrSnoop
  5177.  
  5178. remtrace    CALL    Forbid,sysbase(a4)
  5179.         tst.b    5(a2)
  5180.         beq.s    2$            ; nothing patched !
  5181.         move.w    0(a2),a0        ; offset
  5182.         move.l    16(a2),d0        ; myfunc
  5183.         move.l    dosbase(a4),a1
  5184.         move.b    post_V34(a4),d1
  5185.         beq.s    6$            ; not pre Kick2.0+ !
  5186.         tst.b    patchmode(a4)
  5187.         beq.s    5$            ; don't check vectors
  5188. 6$        cmp.l    2(a1,a0.w),d0
  5189.         bne.s    2$            ; someone else patched !
  5190.         tst.b    d1            ; d1:=post_V34
  5191.         beq.s    4$
  5192. 5$        move.l    12(a2),d0
  5193.         RECALL    SetFunction
  5194.         bra.s    3$
  5195. 4$        move.w    6(a2),0(a1,a0.w)
  5196.         move.l    8(a2),2(a1,a0.w)
  5197. 3$        clr.b    5(a2)
  5198. 2$        clr.b    4(a2)            ; deactivate
  5199.         RECALL    Permit
  5200.         rts
  5201.  
  5202. mylock        moveq    #20,d0            ; trace Lock()
  5203.         bra.s    mytrace
  5204.  
  5205. myopen        moveq    #0,d0            ; trace Open()
  5206.  
  5207. mytrace        movem.l    d3-d7/a0-a6,-(sp)
  5208.         lea    dataarea(pc),a4
  5209.         lea    DosTable(a4),a2
  5210.         add.w    d0,a2
  5211.         move.b    4(a2),d7
  5212.         beq.s    5$            ; disabled
  5213.         move.l    sysbase(a4),a6
  5214.         movem.l    d1-d2,-(sp)
  5215.         move.l    d1,a0
  5216.         bsr    strlen
  5217.         moveq    #30,d6
  5218.         add.l    d0,d6
  5219.         bsr    allocmsg
  5220.         beq.s    2$
  5221.         addq.w    #3,d2            ; lock
  5222.         move.w    2(a2),d3        ; dosoffset
  5223.         addq.w    #1,d3
  5224.         bne.s    3$
  5225.         sub.w     #1007,d2        ; open
  5226. 3$        move.b    d2,28(a5)
  5227.         move.l    276(a6),20(a5)
  5228.         lea    29(a5),a1
  5229.         move.l    d1,a0
  5230.         RECALL    CopyMem
  5231. 2$        movem.l    (sp)+,d1-d2
  5232. 5$        bsr.s    RealDosFunc
  5233.         tst.b    d7            ; disabled
  5234.         beq.s    6$
  5235.         movem.l    d1-d2,-(sp)
  5236.         move.l    d0,d7
  5237.         move.l    a5,d0
  5238.         beq.s    1$
  5239.         move.b    #5,8(a5)
  5240.         move.l    d7,24(a5)
  5241.         move.l    snoopport(a4),a0
  5242.         move.l    a5,a1
  5243.         CALL    PutMsg,sysbase(a4)
  5244. 1$        move.l    d7,d0
  5245.         movem.l    (sp)+,d1-d2
  5246. 6$        movem.l    (sp)+,d3-d7/a0-a6
  5247.         rts
  5248.  
  5249. RealDosFunc    move.w    2(a2),d0        ; dosoffset
  5250.         ext.l    d0
  5251.         move.l    dosbase(a4),a6
  5252.         move.l    12(a2),-(sp)        ; OldFuncPtr
  5253.         rts
  5254.  
  5255. _DosTable    dc.w    _LVOOpen,-1        ; patchwhat & dosoffset
  5256.         dc.w    0,0            ; active,on/off & DosVec1
  5257.         dc.l    0,0            ; DosVec2 & OldFunc
  5258.         dc.l    myopen            ; myfunc
  5259.         dc.w    _LVOLock,-11        ; patchwhat & dosoffset
  5260.         dc.w    0,0            ; active,on/off & DosVec1
  5261.         dc.l    0,0            ; DosVec2 & OldFunc
  5262.         dc.l    mylock            ; myfunc
  5263.  
  5264. ;prepare snooping for memory or dos
  5265. InitSnoop    bsr    cls            ; clear screen
  5266.         tst.w    d2
  5267.         bne.s    2$            ; files
  5268.         bsr    nodenam
  5269.         moveq    #1,d7
  5270.         lea    TReNode(pc),a3
  5271.         bsr    findnam
  5272.         tst.b    d7
  5273.         beq.s    3$            ; task not found
  5274.         move.l    d0,captask(a4)
  5275. 2$        moveq    #0,d0
  5276.         lea    memportname(a4),a0
  5277.         bsr    CreatePort
  5278.         move.l    d0,snoopport(a4)
  5279.         beq.s    1$            ; no port
  5280.         move.l    d0,a0
  5281.         moveq    #0,d1
  5282.         move.b    15(a0),d0
  5283.         bset    d0,d1
  5284.         move.l    d1,auxsig(a4)
  5285.         clr.b    cbreak(a4)
  5286.         st    addlines(a4)
  5287.         move.l    a2,a0            ; header
  5288.         bsr    puthead
  5289.         bsr    replyintui
  5290.         move.l    sysbase(a4),a6
  5291.         moveq    #1,d0
  5292. 1$        rts
  5293. 3$        move.w    #stperr,d0
  5294.         bsr    putnamw            ; task not found
  5295.         moveq    #0,d0
  5296.         bra.s    1$
  5297.  
  5298. ;end snooping for memory or dos
  5299. ClrSnoop    move.l    snoopport(a4),d0
  5300.         beq.s    3$
  5301.         bsr    DeletePort
  5302. 3$        tst.b    waitexit(a4)
  5303.         bne.s    1$            ; Xoper was killed
  5304.         move.w    #stopped,d0
  5305.         tst.b    cbreak(a4)
  5306.         bne.s    2$
  5307.         move.w    #capexited,d0
  5308. 2$        bsr    putnamw
  5309. 1$        clr.l    snoopport(a4)
  5310.         clr.b    addlines(a4)
  5311.         clr.l    auxsig(a4)
  5312.         rts
  5313.  
  5314. ; function to determine cpu-time for each task
  5315. myswitch    movem.l    d0-d1/a0-a2/a4/a6,-(sp)
  5316.         lea    dataarea(pc),a4
  5317.         move.w    tasksnum(a4),d0
  5318.         move.l    sysbase(a4),a0
  5319.         move.l    276(a0),a0
  5320.         lea    cputime(a4),a2
  5321.         bra.s    sw1
  5322. sw0        cmp.l    (a2)+,a0
  5323.         beq.s    sw2
  5324. sw1        dbra    d0,sw0
  5325.         cmp.w    #125,tasksnum(a4)
  5326.         bcc.s    swgo2            ; too much
  5327.         addq.w    #1,tasksnum(a4)
  5328.         move.l    a0,(a2)+        ; new entry
  5329.         clr.l    496(a2)
  5330. sw2        tst.b    post_V34(a4)
  5331.         beq.s    sw3
  5332.         lea    newtime(a4),a0
  5333.         CALL    ReadEClock,timerio+20(a4)
  5334.         move.l    newtime+4(a4),d0
  5335.         move.l    d0,d1
  5336.         sub.l    lasttime(a4),d0
  5337.         bcs.s    swgo2
  5338.         move.l    d1,lasttime(a4)
  5339.         bra.s    sw4
  5340. sw3        move.l    #999999,d0
  5341.         move.l    d0,d1
  5342.         sub.l    sampleio+36(a4),d0
  5343.         move.l    d1,sampleio+36(a4)
  5344. sw4        lsr.l    #8,d0
  5345.         add.l    d0,496(a2)
  5346. swgo2        movem.l    (sp)+,d0-d1/a0-a2/a4/a6
  5347.         move.l    OldSwitch+dataarea(pc),-(sp)
  5348.         rts
  5349.  
  5350. myaddtask    movem.l    d0/a0/a4,-(sp)
  5351.         lea    dataarea(pc),a4
  5352.         tst.b    wanttraps(a4)
  5353.         beq.s    2$
  5354.         lea    mytrap(pc),a0        ; trap for task
  5355.         move.l    50(a1),d0
  5356.         beq.s    1$
  5357.         cmp.l    OldTrap(pc),d0
  5358.         beq.s    1$
  5359.         lea    myproctrap(pc),a0    ; trap for process
  5360.         cmp.l    OldProcTrap(a4),d0
  5361.         bne.s    2$
  5362. 1$        move.l    a0,50(a1)
  5363. 2$        movem.l    (sp)+,d0/a0/a4
  5364.         move.l    a1,-(sp)
  5365.         bsr.s    RealAddTask        ; do original function
  5366.         move.l    (sp)+,d0
  5367.         movem.l    d1-d7/a0-a6,-(sp)
  5368.         lea    dataarea(pc),a4
  5369.         move.l    d0,d7
  5370.         lea    tsecs(a4),a0
  5371.         lea    tmics(a4),a1
  5372.         CALL    CurrentTime,intuibase(a4)
  5373.         CALL    Forbid,sysbase(a4)
  5374.         move.w    numtaskstimed(a4),d5
  5375.         lsl.w    #2,d5
  5376.         lea    taskstampid(a4),a5
  5377.         lea    0(a5,d5.w),a5
  5378.         move.l    d7,0(a5)
  5379.         move.l    tsecs(a4),d0
  5380.         move.l    d0,taskstamps-taskstampid(a5)
  5381.         clr.l    usedtime-taskstampid(a5)
  5382.         addq.w    #1,numtaskstimed(a4)
  5383.         bsr    cleanuptimers
  5384.         RECALL    Permit
  5385.         cmp.b    #5,timerio+8(a4)
  5386.         bne.s    3$
  5387.         moveq    #0,d0
  5388.         move.w    timersig(a4),d1
  5389.         bset    d1,d0
  5390.         move.l    mytask(a4),a1
  5391.         RECALL    Signal
  5392. 3$        move.l    d7,d0
  5393.         movem.l    (sp)+,d1-d7/a0-a6
  5394.         rts
  5395. RealAddTask    move.l    OldAddTask+dataarea(pc),-(sp)
  5396.         rts
  5397.  
  5398. ; install or remove traphandlers
  5399.  
  5400. trapguru    tst.b    wanttraps(a4)
  5401.         bne.s    remtraps
  5402.  
  5403. addtraps    moveq    #-1,d0
  5404.         CALL    AllocSignal,sysbase(a4)
  5405.         moveq    #0,d1
  5406.         bset    d0,d1
  5407.         move.l    d1,trapsignal(a4)
  5408.         RECALL    Forbid            ; change the trap handler of
  5409.         moveq    #0,d5            ; aleady running tasks
  5410.         bsr    getaskdat        ; get task stucture pointers
  5411.         bra.s    3$
  5412. 1$        lea    -16(a5),a5
  5413.         move.l    0(a5),a3        ; pointer to a task structure
  5414.         lea    myproctrap(pc),a0
  5415.         move.l    50(a3),d0        ; Task->tc_TrapCode
  5416.         cmp.l    OldProcTrap(a4),d0    ; AmigaDOS Handler ?
  5417.         beq.s    2$
  5418.         lea    mytrap(pc),a0        ; EXEC Handler ?
  5419.         cmp.l    OldTrap(a4),d0
  5420.         bne.s    3$            ; must be a custom one, skip it
  5421. 2$        move.l    a0,50(a3)        ; replace it
  5422. 3$        subq.b    #1,entries(a4)
  5423.         bcc.s    1$
  5424.         RECALL    Permit
  5425.         st    wanttraps(a4)
  5426.         rts
  5427.  
  5428. remtraps    tst.b    wanttraps(a4)
  5429.         beq.s    6$
  5430.         tst.l    infile(a4)
  5431.         bne.s    5$
  5432.         CALL    Forbid,sysbase(a4)
  5433.         moveq    #0,d5
  5434.         bsr    getaskdat
  5435.         bra.s    4$
  5436. 2$        lea    -16(a5),a5
  5437.         move.l    0(a5),a3
  5438.         lea    50(a3),a3
  5439.         move.l    OldProcTrap(a4),d0
  5440.         lea    myproctrap(pc),a0
  5441.         cmp.l    (a3),a0
  5442.         beq.s    3$
  5443.         move.l    OldTrap(a4),d0
  5444.         lea    mytrap(pc),a0
  5445.         cmp.l    (a3),a0
  5446.         bne.s    4$
  5447. 3$        move.l    d0,(a3)
  5448. 4$        subq.b    #1,entries(a4)
  5449.         bcc.s    2$
  5450.         RECALL    Permit
  5451.         moveq    #32,d0
  5452.         move.l    trapsignal(a4),d1
  5453. 7$        subq.l    #1,d0
  5454.         add.l    d1,d1
  5455.         bcc.s    7$
  5456.         RECALL    FreeSignal
  5457.         clr.l    trapsignal(a4)
  5458. 5$        clr.b    wanttraps(a4)
  5459. 6$        rts
  5460.  
  5461. ; execption handlers
  5462.  
  5463. myproctrap    bsr.s    traphandle
  5464.         move.l    OldProcTrap+dataarea(pc),-(sp)
  5465.         rts
  5466.  
  5467. mytrap        bsr.s    traphandle
  5468.         moveq    #0,d0
  5469.         CALL    Wait,sysbase+dataarea(pc)
  5470.         move.l    OldTrap+dataarea(pc),-(sp)
  5471.         rts
  5472.  
  5473. traphandle    movem.l    d0-d7/a0-a6,$180
  5474.         lea    dataarea(pc),a4
  5475.         move.l    sysbase(a4),a6
  5476.         move.l    276(a6),excpttask(a4)
  5477.         move.l    4(sp),d0
  5478.         moveq    #9,d1
  5479.         cmp.l    d1,d0
  5480.         beq.s    2$
  5481.         move.l    d0,excpterror(a4)
  5482.         moveq    #10,d2
  5483.         moveq    #3,d1
  5484.         cmp.l    d1,d0
  5485.         bne.s    1$
  5486.         move.l    0(sp,d2.w),excptaddr(a4)
  5487.         moveq    #18,d2
  5488. 1$        move.l    0(sp,d2.w),excptpc(a4)
  5489.         move.l    mytask(a4),a1
  5490.         move.l    trapsignal(a4),d0
  5491.         RECALL    Signal
  5492. 2$        movem.l    $180,d0-d7/a0-a6
  5493.         rts
  5494.  
  5495. ;display ExecBase->LastAlert
  5496.  
  5497. lastalert    movem.l    $100,d1-d2
  5498.         tst.l    d1
  5499.         bne.s    al1
  5500.         move.l    sysbase(a4),a0
  5501.         movem.l    514(a0),d1-d2
  5502. al1        move.w    #gurutxt,d0
  5503.         bsr    putstrw
  5504.         move.l    d1,d0
  5505.         bsr    hexa
  5506.         subq.l    #1,ptr(a4)
  5507.         moveq    #'.',d0
  5508.         bsr    putchar
  5509.         move.l    d2,d0
  5510.         bsr    hexa
  5511.         bra    newline
  5512.  
  5513. alert        move.l    excpttask(a4),d0
  5514.         bne.s    alert1
  5515.         move.w    #noguru,d0
  5516.         bra    putnamw
  5517. alert1        move.w    #softfail,d0
  5518.         bsr    putstrw
  5519.         move.l    excpttask(a4),d0
  5520.         bsr    getaskname2
  5521.         bsr    newline
  5522.         cmp.l    #3,excpterror(a4)
  5523.         bne.s    1$
  5524.         move.w    #addrserr,d0
  5525.         bsr    putstrw
  5526.         move.l    excptaddr(a4),d0
  5527.         bsr    hexa
  5528.         bsr    newline
  5529. 1$        move.w    #procount,d0
  5530.         bsr    putstrw
  5531.         move.l    excptpc(a4),d0
  5532.         bsr    hexa
  5533.         bsr    newline
  5534.         move.w    #gurutxt,d0
  5535.         bsr    putstrw
  5536.         move.l    excpterror(a4),d0
  5537.         bsr    hexa
  5538.         lea     out(a4),a0
  5539.         move.l    ptr(a4),d0
  5540.         move.b    #'.',-1(a0,d0.w)
  5541.         move.l    excpttask(a4),d0
  5542.         bsr    hexa
  5543.         bra    newline
  5544.  
  5545. showguru    bsr    stoptimer
  5546.         bsr    alert
  5547.         move.w    #_LVOScreenToFront,d0
  5548.         move.l    screenptr(a4),a0
  5549.         tst.b    ownscreen(a4)
  5550.         bne.s    5$
  5551.         move.w    #_LVOWindowToFront,d0
  5552.         move.l    wnptr(a4),a0
  5553. 5$        move.l    intuibase(a4),a6
  5554.         jsr    0(a6,d0.w)        ; Window or Screen ToFront()
  5555.  
  5556.         move.w    #whatnow,d0
  5557.         bsr    putnamw
  5558.         clr.l    oldpageend(a4)
  5559. 2$        bsr    readline
  5560.         cmp.b    #'i',d0
  5561.         beq.s    4$
  5562.         cmp.b    #'k',d0
  5563.         bne.s    2$
  5564.  
  5565.         move.l    excpttask(a4),a1
  5566.         tst.l    22(a1)
  5567.         bne.s    3$
  5568.         CALL    RemTask,sysbase(a4)
  5569.         bra.s    4$
  5570. 3$        move.l    a1,d0
  5571.         bsr    canok
  5572. 4$        clr.l    lastprinted(a4)
  5573.         bsr    starttimer
  5574.         rts
  5575.  
  5576. coldreboot    move.w    #$4000,$dff09a
  5577.         move.l    sysbase(a4),a6
  5578.         neg.w    82(a6)            ; kill ChkSum
  5579.         clr.l    4            ; kill ExecBase Ptr
  5580. reboot        move.l    sysbase(a4),a6
  5581.         tst.b    post_V34(a4)
  5582.         beq.s    1$
  5583.         jmp    _LVOColdReboot(a6)
  5584.  
  5585. 1$        lea    $01000004,a2        ; reboot manually
  5586.         suba.l    -$18(a2),a2
  5587.         movea.l    (a2),a2
  5588.         subq.l    #2,a2
  5589.         lea    2$(pc),a5
  5590.         jsr    _LVOSupervisor(a6)
  5591.         cnop    0,4
  5592. 2$        reset
  5593.         jmp    (a2)
  5594.  
  5595. ;save the contents of the output buffer
  5596. ;to a file, append the output if the file allready exists
  5597. saveoutput    bsr    nodenam2
  5598.         tst.b    0(a5)
  5599.         beq    syntax
  5600.         move.l    a5,d1
  5601.         move.l    #1004,d2        ; mode_readwrite
  5602.         CALL    Open,dosbase(a4)
  5603.         move.l    d0,d5
  5604.         beq.s    5$
  5605.         move.l    d5,d1
  5606.         moveq    #0,d2
  5607.         moveq    #1,d3
  5608.         RECALL    Seek
  5609.         bra.s    1$
  5610. 5$        move.l    a5,d1
  5611.         move.l    #1006,d2        ; mode_newfile
  5612.         RECALL    Open
  5613.         move.l    d0,d5
  5614.         bne.s    1$
  5615.         move.w    #openerr,d0
  5616.         bsr    putstrw
  5617.         move.l    a5,d0
  5618.         bra    putnam
  5619. 1$        move.l    outchain(a4),d0
  5620.         beq.s    3$
  5621. 2$        move.l    d0,a5
  5622.         move.w    12(a5),d3
  5623.         beq.s    4$
  5624.         ext.l    d3
  5625.         lea    14(a5),a0
  5626.         move.l    a0,d2
  5627.         move.l    d5,d1
  5628.         RECALL    Write
  5629.         tst.l    d0
  5630.         ble.s    3$
  5631. 4$        move.l    d5,d1
  5632.         lea     cr(a4),a0
  5633.         move.l    a0,d2
  5634.         moveq    #1,d3
  5635.         RECALL    Write
  5636.         tst.l    d0
  5637.         ble.s    3$
  5638.         move.l    0(a5),d0
  5639.         bne.s    2$
  5640. 3$        move.l    d5,d1
  5641.         RECALL    Close
  5642.         rts
  5643.  
  5644. grabtimerio    lea    tiohead(a4),a0
  5645.         bsr    puthead
  5646.         move.b    timeout(a4),d4
  5647.         st    timeout(a4)        ; 255 !
  5648.         bsr    starttimer
  5649.         move.b  d4,timeout(a4)
  5650.         pea    dummy(a4)
  5651.  
  5652.         CALL    Disable,sysbase(a4)
  5653.         lea    timerio(a4),a5
  5654. 2$        move.l    0(a5),d2
  5655.         beq.s    1$
  5656.         move.l    d2,a5
  5657.         bra.s    2$
  5658. 1$        subq.l    #4,a5
  5659.         RECALL    Enable
  5660.  
  5661.         bsr    stoptimer
  5662.         lea    buffer(a4),a3
  5663.         moveq    #1,d4            ; VBlank
  5664.         bsr    gettrq
  5665.  
  5666.         moveq    #40,d0
  5667.         lea    timerio(a4),a0
  5668.         move.l    (sp),a1            ; dummy
  5669.         RECALL    CopyMem
  5670.  
  5671.         moveq    #0,d1
  5672.         moveq    #0,d0
  5673.         lea     timernam(a4),a0
  5674.         move.l    (sp),a1            ; dummy
  5675.         RECALL    OpenDevice
  5676.  
  5677.         move.l    (sp),a1            ; dummy
  5678.         move.l    #1<<30,32(a1)
  5679.         RECALL    SendIO
  5680.  
  5681.         RECALL    Disable
  5682.         move.l    (sp),a5            ; dummy
  5683. 8$        move.l    0(a5),d2
  5684.         beq.s    7$
  5685.         move.l    d2,a5
  5686.         bra.s    8$
  5687. 7$        subq.l    #4,a5
  5688.         RECALL    Enable
  5689.         move.l    (sp),a1            ; dummy
  5690.         bsr    stoptimer2
  5691.         moveq    #0,d4            ; MicroHz
  5692.         bsr    gettrq
  5693.  
  5694.         move.l    (sp),a1            ; dummy
  5695.         RECALL    CloseDevice
  5696.  
  5697.         clr.l    (a3)+
  5698.         lea    -22(a3),a2
  5699.         moveq    #18,d2
  5700.         bsr    sortlist
  5701.  
  5702.         move.l    (sp)+,a5        ; dummy
  5703.         lea    buffer(a4),a5
  5704. 5$        move.l    (a5)+,d0
  5705.         beq.s    6$
  5706.         bsr    hexa
  5707.         move.w    (a5)+,d0
  5708.         ext.l    d0
  5709.         mulu    #9,d0
  5710.         add.w     #timerunits,d0
  5711.         bsr    putstrw
  5712.         move.l    (a5)+,d0
  5713.         bsr    putstamp
  5714.         moveq    #'.',d0
  5715.         bsr    putchar
  5716.         move.l    (a5)+,d0
  5717.         move.l    #100000,d1
  5718.         bsr    div
  5719.         or.b    #'0',d0
  5720.         bsr    putchar
  5721. 10$        bsr    putblank
  5722.         move.l    (a5)+,d0
  5723.         bsr    getaskname2
  5724.         bsr    newline
  5725.         bra.s    5$
  5726. 6$        rts
  5727.  
  5728. gettrq        RECALL    Disable            ; a6 - SysBase
  5729. 3$        move.l    0(a5),a5
  5730.         tst.l    0(a5)
  5731.         beq.s    4$
  5732.         move.l    a5,(a3)+
  5733.         move.w    d4,(a3)+
  5734.         move.l    32(a5),(a3)+
  5735.         move.l    36(a5),(a3)+
  5736.         move.l    14(a5),a1
  5737.         move.l    16(a1),(a3)+
  5738.         bra.s    3$
  5739. 4$        RECALL    Enable
  5740.         rts
  5741.  
  5742. ; check if the timer is runnig, start it if not
  5743. starttimer    lea    timerio(a4),a1
  5744.         cmp.b    #5,8(a1)
  5745.         beq.s    1$
  5746.         moveq    #0,d0
  5747.         move.b    timeout(a4),d0
  5748.         bne.s    2$
  5749.         tst.l    timeoutm(a4)
  5750.         beq.s    1$
  5751. 2$        move.l    d0,32(a1)
  5752.         move.l    timeoutm(a4),36(a1)
  5753.         move.w    #9,28(a1)
  5754.         CALL    SendIO,sysbase(a4)
  5755. 1$        rts
  5756.  
  5757. ; Abort a timer request, if pending
  5758. stoptimer    move.l    sysbase(a4),a6
  5759.         lea    timerio(a4),a1
  5760.         cmp.b    #5,8(a1)
  5761.         bne.s    stptim
  5762. stoptimer2    move.l    a1,-(sp)
  5763.         RECALL    AbortIO
  5764.         move.l    (sp)+,a1
  5765.         RECALL    WaitIO
  5766. stptim        move.w    timersig(a4),d0
  5767.         moveq    #0,d1
  5768.         bset    d0,d1
  5769.         moveq    #0,d0
  5770.         jmp    _LVOSetSignal(a6)    ; clr signal
  5771.  
  5772. ;install as commodity and/or a input-handler
  5773. installh    move.l    cxbase(a4),d0        ; commodity possible ?
  5774.         beq    1$
  5775.         lea    broker(a4),a3
  5776.         lea    hotkeybuf(a4),a5
  5777.         move.l    d0,a6            ; cxbase
  5778.         moveq    #0,d0
  5779.         suba.l    a0,a0
  5780.         bsr    CreatePort
  5781.         move.l    d0,newbroker+20(a4)
  5782.         move.l    d0,a0
  5783.         move.b    15(a0),cxsig+1(a4)
  5784.         moveq    #0,d0
  5785.         lea    newbroker(a4),a0
  5786.         RECALL    CxBroker
  5787.         move.l    d0,0(a3)
  5788.         beq.s    1$            ; no broker !
  5789.         moveq    #1,d0            ; CX_Filter
  5790.         move.l    a5,a0
  5791.         suba.l    a1,a1
  5792.         RECALL    CreateCxObj
  5793.         move.l    d0,filter(a4)
  5794.         beq.s    3$
  5795.         move.l    d0,a2
  5796.         move.l    d0,a0
  5797.         RECALL    CxObjError
  5798.         tst.l    d0
  5799.         beq.s    4$            ; hotkey definition ok !
  5800.         move.l    a5,a1
  5801.         lea    defhotkey(a4),a0
  5802. 5$        move.b    (a0)+,(a5)+        ; copy string
  5803.         bne.s    5$
  5804.         move.l    a2,a0
  5805.         RECALL    SetFilter        ; try our default
  5806. 4$        moveq    #4,d0            ; CX_Signal
  5807.         move.l    mytask(a4),a0
  5808.         move.w    #mysigbit,a1
  5809.         RECALL    CreateCxObj
  5810.         move.l    d0,a1            ; Signal -> Filter
  5811.         move.l    a2,a0
  5812.         RECALL    AttachCxObj
  5813.         moveq    #5,d0            ; CX_Translate
  5814.         suba.l    a0,a0
  5815.         suba.l    a1,a1
  5816.         RECALL    CreateCxObj
  5817.         move.l    d0,a1            ; Translate -> Filter
  5818.         move.l    a2,a0
  5819.         RECALL    AttachCxObj
  5820.         move.l    a2,a1            ; Filter -> Broker
  5821.         move.l    0(a3),a0
  5822.         RECALL    AttachCxObj
  5823. 3$        move.l    0(a3),a0        ; broker
  5824.         RECALL    CxObjError
  5825.         tst.l    d0
  5826.         beq.s    2$            ; no error
  5827.         move.l    0(a3),a0
  5828.         RECALL    DeleteCxObjAll
  5829.         clr.l    0(a3)            ; clear ptr
  5830. 2$        move.l    0(a3),d0
  5831.         beq.s    1$
  5832.         move.l    d0,a0
  5833.         moveq    #1,d0
  5834.         RECALL    ActivateCxObj
  5835.  
  5836. 1$        moveq    #0,d0
  5837.         suba.l    a0,a0
  5838.         bsr    CreatePort
  5839.         move.l    d0,inputport(a4)
  5840.         bsr    CreateStdIO
  5841.         move.l    d0,inputio(a4)
  5842.         move.l    d0,a1
  5843.         lea    devicenam(a4),a0
  5844.         moveq    #0,d0
  5845.         moveq    #0,d1
  5846.         CALL    OpenDevice,sysbase(a4)
  5847.         lea    ininterrupt(a4),a0
  5848.         move.l    a4,14(a0)
  5849.         movea.l    inputio(a4),a1
  5850.         move.w    #9,28(a1)
  5851.         move.l    a0,40(a1)
  5852.         jmp    _LVODoIO(a6)
  5853.  
  5854. ;change our commodity popkey
  5855. cxpopkey    bsr    nodenam2
  5856.         lea    hotkeybuf(a4),a3
  5857.         move.l    filter(a4),a2
  5858.         move.l    infile(a4),d7
  5859.         bne.s    3$            ; script
  5860.         tst.l    broker(a4)
  5861.         beq.s    1$            ; no broker - ignore
  5862.         move.l    a2,a0
  5863.         move.l    a5,a1
  5864.         CALL    SetFilter,cxbase(a4)    ; set new popkey
  5865.         move.l    a2,a0
  5866.         RECALL    CxObjError
  5867.         tst.l    d0
  5868.         beq.s    3$            ; no error
  5869.         move.l    a2,a0
  5870.         move.l    a3,a1
  5871.         RECALL    SetFilter        ; set old popkey
  5872.         move.l    a3,a5
  5873. 3$        moveq    #39,d0
  5874. 2$        move.b    (a5)+,(a3)+
  5875.         dbeq    d0,2$
  5876.         clr.b    (a3)
  5877.         tst.l    d7            ; script ?
  5878.         bne.s    1$
  5879.         bsr    setwintitle        ; show popkey
  5880. 1$        rts
  5881.  
  5882. ;remove commodity and/or handler
  5883. removeh        move.l    broker(a4),d2
  5884.         beq.s    3$            ; no commodity !
  5885.         move.l    d2,a0
  5886.         moveq    #0,d0            ; disable
  5887.         CALL    ActivateCxObj,cxbase(a4)
  5888.         move.l    d2,a0
  5889.         RECALL    DeleteCxObjAll
  5890. 3$        move.l    newbroker+20(a4),d0
  5891.         beq.s    2$            ; no port to delete
  5892.         bsr.s    1$
  5893. 2$        movea.l    inputio(a4),a1
  5894.         move.w    #10,28(a1)
  5895.         lea    ininterrupt(a4),a0
  5896.         move.l    a0,40(a1)
  5897.         CALL    DoIO,sysbase(a4)
  5898.         movea.l    inputio(a4),a1
  5899.         RECALL    CloseDevice
  5900.         move.l    inputio(a4),d0
  5901.         bsr    DeleteStdIO
  5902.         move.l    inputport(a4),d0
  5903. 1$        bra    DeletePort
  5904.  
  5905. ;check broker port for messages from master control 'Exchange'
  5906. ChkBroker    move.l    a2,-(sp)
  5907.         tst.l    broker(a4)
  5908.         beq.s    1$
  5909. 5$        move.l    newbroker+20(a4),a0
  5910.         CALL    GetMsg,sysbase(a4)
  5911.         move.l    d0,a2
  5912.         move.l    a2,d0
  5913.         beq.s    1$
  5914.         move.l    a2,a0
  5915.         CALL    CxMsgType,cxbase(a4)
  5916.         cmp.w    #$40,d0            ; CXM_COMMAND
  5917.         bne.s    2$
  5918.         move.l    a2,a0
  5919.         RECALL    CxMsgID
  5920.         move.l    mysignal(a4),d1
  5921.         cmp.w    #25,d0            ; CXCMD_UNIQUE
  5922.         beq.s    3$
  5923.         st    wantexit(a4)
  5924.         cmp.w    #23,d0            ; CXCMD_KILL
  5925.         beq.s    4$
  5926.         clr.b    wantexit(a4)
  5927.         cmp.w    #19,d0            ; CXCMD_APPEAR
  5928.         beq.s    3$
  5929.         moveq    #0,d1
  5930.         cmp.w    #21,d0            ; CXCMD_DISAPPEAR
  5931.         bne.s    3$
  5932.         st    wanthold(a4)
  5933. 4$        st    cbreak(a4)        ; end snooping (if nessecary)
  5934.         move.w    nspubsig+6(a4),d0
  5935.         bset    d0,d1
  5936. 3$        move.l    d1,d0
  5937.         CALL    SetSignal,sysbase(a4)    ; set new signals
  5938. 2$        move.l    a2,a1
  5939.         CALL    ReplyMsg,sysbase(a4)
  5940.         bra.s    5$
  5941. 1$        move.l    (sp)+,a2
  5942.         rts
  5943.  
  5944. ;this is the handler, it checks if amiga-amiga-x
  5945. ;has been pressed and signals it to our task
  5946. keyhandler    move.l    a0,-(sp)
  5947.         tst.l    broker(a1)
  5948.         beq.s    2$        ; not running as commodity !
  5949.         tst.b    cxstate(a1)
  5950.         bne.s    1$        ; handler is off
  5951. 2$        cmp.b    #1,4(a0)
  5952.         bne.s    1$
  5953.         move.w    8(a0),d0
  5954.         andi.w    #$c0,d0
  5955.         cmpi.w    #$c0,d0
  5956.         bne.s    1$
  5957.         cmp.w    #$32,6(a0)
  5958.         bne.s    1$
  5959.         clr.b    4(a0)        ; nop event
  5960.         bsr.s    wakeup
  5961. 1$        move.l    (sp)+,d0    ; return event
  5962.         rts
  5963.  
  5964. ;wakeup Xoper
  5965. wakeup        move.l    mysignal(a1),d0
  5966.         move.l    sysbase(a1),a6
  5967.         movea.l    mytask(a1),a1
  5968.         jmp    _LVOSignal(a6)
  5969.  
  5970. ;vertb-handler
  5971. countio        addq.l    #1,iocount(a1)
  5972.         tst.b    pcheck(a1)
  5973.         beq.s    1$            ; check not requested
  5974.         bsr.s    checkit
  5975.         tst.b    d1
  5976.         beq.s    1$
  5977.         clr.b    pcheck(a1)        ; disable checking ...
  5978.         bsr.s    wakeup
  5979. 1$        moveq    #0,d0
  5980.         rts
  5981.  
  5982. checkit        moveq    #0,d1            ; check all patched functions
  5983.         move.l    sysbase(a1),a6        ; exec library
  5984.         tst.b    bool(a1)
  5985.         beq.s    5$
  5986.         lea    myswitch(pc),a5
  5987.         move.w    #_LVOSwitch,d0
  5988.         bsr.s    2$
  5989.         lea    myaddtask(pc),a5
  5990.         move.w    #_LVOAddTask,d0
  5991.         bsr.s    2$
  5992. 5$        tst.b    msnoop(a1)
  5993.         beq.s    4$
  5994.         lea    capmalloc(pc),a5
  5995.         move.w    #_LVOAllocMem,d0
  5996.         bsr.s    2$
  5997.         lea    capmfree(pc),a5
  5998.         move.w    #_LVOFreeMem,d0
  5999.         bsr.s    2$
  6000. 4$        move.l    dosbase(a1),a6        ; dos library
  6001.         tst.b    DosTable+05(a1)
  6002.         beq.s    3$
  6003.         move.l    DosTable+16(a1),a5
  6004.         move.w    DosTable+00(a1),d0
  6005.         bsr.s    2$
  6006. 3$        tst.b    DosTable+25(a1)
  6007.         beq.s    1$
  6008.         move.l    DosTable+36(a1),a5
  6009.         move.w    DosTable+20(a1),d0
  6010. 2$        cmp.l    2(a6,d0.w),a5        ; check library function
  6011.         seq    d1
  6012. 1$        rts
  6013.  
  6014. ;compare strings
  6015. ; -> a0/a1 = pointers to string
  6016. ; <- d0 = true(0) false(1), d1 = length
  6017.  
  6018. strcmp        movem.l    d2/a0/a1,-(sp)
  6019.         moveq    #0,d0
  6020.         moveq    #0,d1
  6021. src2        move.b    (a0)+,d0
  6022.         beq.s    src1
  6023.         cmp.b    #10,d0
  6024.         beq.s    src1
  6025.         addq.w    #1,d1
  6026.         bsr.s    src4
  6027.         move.b    d0,d2
  6028.         move.b    (a1)+,d0
  6029.         bsr.s    src4
  6030.         cmp.b    d2,d0
  6031.         beq.s    src2
  6032.         bra.s    src3
  6033. src1        move.b    0(a1),d0
  6034. src3        movem.l    (sp)+,d2/a0/a1
  6035.         rts
  6036.  
  6037. src4        cmp.b    #'z'+1,d0        ; convert to upper case
  6038.         bcc.s    1$
  6039.         cmp.b    #'a',d0
  6040.         bcs.s    1$
  6041.         and.b    #$df,d0
  6042. 1$        rts
  6043.  
  6044. strbuf        movem.l    d0/a1-a2,-(sp)
  6045.         move.l    a0,a1
  6046.         lea    buffer(a4),a2
  6047. 1$        move.b    (a1)+,d0
  6048.         cmp.b    #10,d0
  6049.         beq.s    2$
  6050.         cmp.b    #' ',d0
  6051.         beq.s    2$
  6052.         or.b    #' ',d0
  6053.         beq.s    2$
  6054.         move.b    d0,(a2)+
  6055.         bra.s    1$
  6056. 2$        clr.b    (a2)+
  6057.         movem.l    (sp)+,d0/a1-a2
  6058.         rts
  6059.  
  6060. tolower        movem.l    d0-d1/a0,-(sp)
  6061.         subq.w    #1,d0
  6062.         bmi.s    3$
  6063. 1$        move.b    0(a0),d1
  6064.         cmp.b    #'A',d1
  6065.         blt.s    2$
  6066.         cmp.b    #'Z',d1
  6067.         bgt.s    2$
  6068.         or.b    #' ',d1
  6069. 2$        move.b    d1,(a0)+
  6070.         dbra    d0,1$
  6071. 3$        clr.b    (a0)
  6072.         movem.l    (sp)+,d0-d1/a0
  6073.         rts
  6074.  
  6075. ; 32-bit division d0 / d1
  6076. ; <- d0
  6077.  
  6078. div        movem.l    d2/d3,-(sp)
  6079.         tst.l    d1
  6080.         beq.s    1$
  6081.         swap    d1
  6082.         tst.w    d1
  6083.         bne.s    4$
  6084.         swap    d1
  6085.         move.w    d1,d3
  6086.         move.w    d0,d2
  6087.         clr.w    d0
  6088.         swap    d0
  6089.         divu.w    d3,d0
  6090.         move.l    d0,d1
  6091.         swap    d0
  6092.         move.w    d2,d1
  6093.         divu.w    d3,d1
  6094.         move.w    d1,d0
  6095.         clr.w    d1
  6096.         swap    d1
  6097.         bra.s    1$
  6098. 4$        swap    d1
  6099.         move.l    d1,d3
  6100.         move.l    d0,d1
  6101.         clr.w    d1
  6102.         swap    d1
  6103.         swap    d0
  6104.         clr.w    d0
  6105.         moveq    #16-1,d2
  6106. 3$        add.l    d0,d0
  6107.         addx.l    d1,d1
  6108.         cmp.l    d1,d3
  6109.         bhi.s    2$
  6110.         sub.l    d3,d1
  6111.         addq.w    #1,d0
  6112. 2$        dbra    d2,3$
  6113. 1$        movem.l    (sp)+,d2/d3
  6114.         rts
  6115.  
  6116. ;copy a string from input to 'buffer'
  6117. ; -> a0 = pointer to string
  6118. getstr        lea    buffer(a4),a5
  6119. 1$        cmp.b    #' ',0(a0)
  6120.         beq.s    2$
  6121.         cmp.b    #10,0(a0)
  6122.         beq.s    2$
  6123.         move.b    (a0)+,(a5)+
  6124.         bra.s    1$
  6125. 2$        clr.b     0(a5)
  6126.  
  6127. ;skip blanks
  6128. ; -> a0 pointer to text
  6129. ; <- a0 = new pointer position
  6130. kllblnks    cmpi.b    #' ',(a0)+
  6131.         beq.s    kllblnks
  6132.         subq.w    #1,a0
  6133.         rts
  6134.  
  6135. ;read in a nodename or a processname
  6136. nodenam        bsr.s    isdec
  6137.         move.w    d2,procnum(a4)
  6138. nodenam2    bsr.s    kllblnks
  6139.         move.l    a0,a5
  6140. gno1        cmp.b    #10,(a0)+
  6141.         bne.s    gno1
  6142.         clr.b    -1(a0)
  6143.         rts
  6144.  
  6145. getfrac        bsr.s    isdec
  6146.         moveq    #0,d0
  6147.         cmp.b    #'.',(a0)
  6148.         bne.s    1$
  6149.         addq.w    #1,a0
  6150.         cmp.b    #10,(a0)
  6151.         beq.s    1$
  6152.         move.b    (a0)+,d0
  6153.         and.b    #$0f,d0
  6154.         moveq    #1,d7
  6155. 1$        muls    #10,d2
  6156.         add.l    d0,d2
  6157.         rts
  6158.  
  6159. ;convert ascii to byte
  6160. ; -> a0 = pointer to text
  6161. ; <- d0 = byte
  6162. getnum        cmp.b    #'$',0(a0)
  6163.         bne.s    isdec
  6164.         bsr.s    readhex
  6165.         move.l    d0,d2
  6166.         rts
  6167. isdec        moveq    #0,d2
  6168.         moveq    #0,d3
  6169.         moveq    #0,d6
  6170.         moveq    #0,d7
  6171.         cmp.b    #'-',0(a0)
  6172.         bne.s    gn1
  6173.         addq.w    #1,a0
  6174.         moveq    #1,d6
  6175. gn1        move.b    (a0)+,d3
  6176.         cmp.b    #'9',d3
  6177.         bhi.s    gn2
  6178.         cmp.b    #'0',d3
  6179.         bcs.s    gn2
  6180.         moveq     #1,d7
  6181.         and.b    #$f,d3
  6182.         muls    #10,d2
  6183.         add.l    d3,d2
  6184.         bra.s    gn1
  6185. gn2        tst.b    d6
  6186.         beq.s    gn3
  6187.         neg.l    d2
  6188. gn3        subq.w    #1,a0
  6189.         rts
  6190.  
  6191. ;convert hex to longword
  6192. ; -> a0 = pointer to text
  6193. ; <- d0=value, d7 = ok(1) error(0)
  6194. readhex        movem.l    d1-d6/a1-a5,-(sp)
  6195.         moveq    #1,d7
  6196.         cmp.b    #'$',0(a0)
  6197.         bne.s    rh3
  6198.         addq.l    #1,a0
  6199. rh3        moveq    #0,d0
  6200.         cmpi.b    #10,0(a0)
  6201.         beq.s    rherr
  6202.         lea    hextab(a4),a1
  6203. rh0        move.b    (a0)+,d3
  6204.         moveq.l    #15,d2
  6205. rh1        cmp.b    0(a1,d2.w),d3
  6206.         beq.s    rh2
  6207.         dbra    d2,rh1
  6208.         bra.s    rhend
  6209. rh2        lsl.l    #4,d0
  6210.         or.b    d2,d0
  6211.         bra.s    rh0
  6212. rhend        tst.b    d3
  6213.         beq.s    rhok
  6214.         cmpi.b    #10,d3
  6215.         beq.s    rhok
  6216.         cmpi.b    #' ',d3
  6217.         beq.s    rhok
  6218. rherr        moveq    #0,d7
  6219. rhok        movem.l    (sp)+,d1-d6/a1-a5
  6220.         rts
  6221.  
  6222. longdecn    move.l    d3,-(sp)
  6223.         moveq    #3,d3
  6224.         bsr.s    longdec
  6225.         move.l    (sp)+,d3
  6226.         move.w    #binarea+7,d0
  6227.         sub.w    d3,d0
  6228.         bra    putstrw
  6229.  
  6230. ;convert long to decimal
  6231. ; -> d0 = value
  6232. ;    d3 bit 0 = left/right justified
  6233. ;       bit 1 = write/leave
  6234. ; returns string in 'buffer'
  6235. longdec        movem.l    d1-d2/a1-a2,-(sp)
  6236.         tst.l    d0
  6237.         bmi.s    2$
  6238.         cmp.l    #9999999,d0
  6239.         ble.s    1$
  6240. 2$        move.w    #smallnix,d0
  6241.         bra.s    ld1
  6242. 1$        lea    binarea(a4),a1
  6243.         move.l    #'    ',(a1)+
  6244.         move.l    #'    ',(a1)+
  6245.         clr.b    0(a1)
  6246.         subq.w    #1,a1
  6247.         cmp.w    #2,d3
  6248.         bne.s    ld5
  6249.         clr.b    0(a1)
  6250. ld5        moveq    #1,d2
  6251. ld2        addq.w    #1,d2
  6252.         moveq    #10,d1
  6253.         bsr    div
  6254.         addi.b    #'0',d1
  6255.         move.b    d1,-(a1)
  6256.         tst.l    d0
  6257.         bne.s    ld2
  6258.         btst    #0,d3
  6259.         bne.s    ld1
  6260.         lea    binarea(a4),a2
  6261.         cmpa.l    a2,a1
  6262.         bne.s    ld3
  6263.         subq.l    #1,ptr(a4)
  6264.         bra.s    ld1
  6265. ld3        move.b    0(a1),(a2)+
  6266.         move.b    #' ',(a1)+
  6267.         dbra    d2,ld3
  6268. ld1        btst    #1,d3
  6269.         bne.s    ld4
  6270.         move.w    #binarea,d0
  6271. ld6        bsr    putstrw
  6272. ld4        movem.l    (sp)+,d1-d2/a1-a2
  6273.         rts
  6274.  
  6275. putlongascii    movem.l    d1/d2,-(sp)
  6276.         moveq    #3,d2
  6277.         move.l    d0,d1
  6278. 2$        rol.l    #8,d1
  6279.         move.b    d1,d0
  6280.         beq.s    1$
  6281.         bsr    putchar
  6282. 1$        dbra    d2,2$
  6283.         movem.l    (sp)+,d1/d2
  6284.         rts
  6285.  
  6286. putstamp    movem.l    d0/d1,-(sp)
  6287.         move.l    #3600,d1
  6288.         bsr    div
  6289.         moveq    #3,d3
  6290.         bsr    longdec
  6291.         move.l    binarea+4(a4),d0
  6292.         lsr.l    #8,d0
  6293.         bsr.s    putlongascii
  6294.         moveq    #':',d0
  6295.         bsr    putchar
  6296.         move.l    d1,d0
  6297.         moveq    #60,d1
  6298.         bsr    div
  6299.         bsr.s    write2digs
  6300.         moveq    #':',d0
  6301.         bsr    putchar
  6302.         move.l    d1,d0
  6303.         bsr.s    write2digs
  6304.         movem.l (sp)+,d0/d1
  6305.         rts
  6306.  
  6307. write2digs    movem.l    d0/d1,-(sp)
  6308.         divu    #10,d0
  6309.         move.l    d0,d1
  6310.         or.b    #'0',d0
  6311.         bsr    putchar
  6312.         swap    d1
  6313.         or.b    #'0',d1
  6314.         move.b    d1,d0
  6315.         bsr    putchar
  6316.         movem.l    (sp)+,d0/d1
  6317.         rts
  6318.  
  6319. ;print a bcpl-string
  6320. ; -> d0 = bcpl-pointer to bcpl-string
  6321. putbcpl        movem.l    d3/a0-a1,-(sp)
  6322.         tst.l    d0
  6323.         beq.s    1$
  6324.         lsl.l    #2,d0
  6325.         move.l    d0,a1
  6326.         moveq    #0,d3
  6327.         move.b    (a1)+,d3
  6328.         subq.w    #1,d3
  6329.         bmi.s    1$
  6330. 2$        move.b    (a1)+,d0
  6331.         beq.s    1$
  6332.         bsr    putchar
  6333.         dbra    d3,2$
  6334. 1$        move.l    ptr(a4),d0
  6335.         movem.l    (sp)+,d3/a0-a1
  6336.         rts
  6337.  
  6338. ;write unsigned byte
  6339. ; -> d3 = value
  6340. bytedec        bsr.s    dec
  6341.         move.w    #decimal,d0
  6342.         bra    putstrw
  6343.  
  6344. ;write signed byte
  6345. ; -> d3 = value
  6346. plusmins    movem.l    d5/a3,-(sp)
  6347.         move.w    #$2020,minus(a4)
  6348.         move.b    d3,d5
  6349.         bpl.s    2$
  6350.         neg.b    d3
  6351. 2$        bsr.s    dec
  6352.         tst.b    d5
  6353.         bpl.s    1$
  6354.         move.l    d0,a3
  6355.         move.b    #'-',-(a3)
  6356. 1$        movem.l    (sp)+,d5/a3
  6357.         move.w    #minus+1,d0
  6358.         bra    putstrw
  6359.  
  6360. dec        movem.l    d3/a2/a3,-(sp)
  6361.         lea    decimal(a4),a3
  6362.         move.l    #$20202020,(a3)+
  6363.         subq.l    #1,a3
  6364.         move.l    a3,a2
  6365.         and.l    #$ff,d3
  6366.         moveq    #'0',d0
  6367. 3$        tst.b    d3
  6368.         beq.s    2$
  6369.         divu    #10,d3
  6370.         swap    d3
  6371.         or.b    d0,d3
  6372.         move.b    d3,-(a3)
  6373.         clr.w    d3
  6374.         swap    d3
  6375.         bra.s    3$
  6376. 2$        cmpa.l    a2,a3
  6377.         bcs.s    1$
  6378.         move.b    d0,-(a3)
  6379. 1$        move.l    a3,d0
  6380.         movem.l    (sp)+,d3/a2/a3
  6381.         rts
  6382.  
  6383. prcent        lsl.l    #1,d3
  6384.         move.l    d3,d1
  6385.         lsl.l    #2,d3
  6386.         add.l    d1,d3
  6387.         lsl.l    #2,d3
  6388.         move.l    d3,d1
  6389.         lsl.l    #3,d3
  6390.         move.l    d3,d2
  6391.         lsl.l    #1,d3
  6392.         add.l    d2,d3
  6393.         add.l    d1,d3
  6394.         move.l    d0,d1
  6395.         move.l    d3,d0
  6396.         bsr    div
  6397.         moveq    #0,d5
  6398.         bsr.s    putfrac
  6399.         move.w    #infoh4,d0
  6400.         bra    putstrw
  6401.  
  6402. putfrac        divu    #10,d0
  6403.         move    d0,d3
  6404.         swap    d0
  6405.         move    d0,d1
  6406.         tst.w    d5
  6407.         bne.s    1$
  6408.         cmp.w    #100,d3
  6409.         ble.s    1$
  6410.         move.w    #whatsthis,d0
  6411.         bra    putstrw
  6412. 1$        bsr    bytedec
  6413.         lea    out(a4),a0
  6414.         move.b    #'.',-1(a0,d0)
  6415.         or.b    #'0',d1
  6416.         move    d1,d0
  6417.         bra    putchar
  6418.  
  6419. ;Write pointer, display '-------' if empty
  6420. hexan        tst.l    d0
  6421.         beq.s    hexa2
  6422.  
  6423. ;Write 8 byte hex value
  6424. ; -> d0 = value
  6425. hexa        bsr.s    gthex
  6426. hexa2        bra    putstr
  6427.  
  6428. gthex        movem.l    d1-d2/a1-a2,-(sp)
  6429.         lea    hexarea+9(a4),a2
  6430.         move.b    #' ',-(a2)
  6431.         lea    hextab(a4),a1
  6432.         moveq    #7,d2
  6433. hexloop     moveq    #$0f,d1
  6434.         and.b    d0,d1
  6435.         move.b    0(a1,d1.w),-(a2)
  6436.         lsr.l    #4,d0
  6437.         dbra    d2,hexloop
  6438.         move.l    a2,d0
  6439.         movem.l    (sp)+,d1-d2/a1-a2
  6440.         rts
  6441.  
  6442. ;Convert/write byte into binary string
  6443. ; -> d0 = value
  6444. bin        movem.l    d1-d7/a0-a6,-(sp)
  6445.         lea    binarea(a4),a0
  6446.         move.w    #$2020,8(a0)
  6447.         moveq    #7,d4
  6448. binloop        moveq    #'0'/2,d1
  6449.         roxr.b    #1,d0
  6450.         roxl.b    #1,d1
  6451.         move.b    d1,0(a0,d4.w)
  6452.         dbra    d4,binloop
  6453.         move.l    a0,d0
  6454.         movem.l    (sp)+,d1-d7/a0-a6
  6455.         bra    putstr
  6456.  
  6457. strlen        move.l    a0,-(sp)
  6458.         moveq    #-1,d0
  6459. strl2        addq.l    #1,d0
  6460.         tst.b    (a0)+
  6461.         bne.s    strl2
  6462.         move.l    (sp)+,a0
  6463.         rts
  6464.  
  6465. strlen2     move.l    a0,-(sp)
  6466.         moveq    #-1,d0
  6467. strl22        addq.l    #1,d0
  6468.         cmp.b    #10,(a0)+
  6469.         bne.s    strl22
  6470.         move.l    (sp)+,a0
  6471.         rts
  6472.  
  6473. ;write a title and underline
  6474. ; -> a0 = pointer to text
  6475. puthead1    bsr.s    strlen
  6476.         move.l    d0,d5
  6477.         move.l    a0,d0
  6478.         bra    putstr
  6479.  
  6480. puthead2    bsr.s    strlen
  6481.         add.l    d0,d5
  6482.         bra.s    ph2
  6483.  
  6484. puthead        bsr.s    strlen
  6485.         move.l    d0,d5
  6486. ph2        move.l    a0,d0
  6487.         bsr.s    putnam
  6488.         lea    out(a4),a0
  6489.         move.l    a0,d0
  6490. ph1        move.b    #'-',(a0)+
  6491.         dbra    d5,ph1
  6492.         move.b    #10,(a0)+
  6493.         clr.b    0(a0)
  6494.         bra.s    putstr
  6495.  
  6496. syntax        move.w    #synerr,d0        ; error
  6497.  
  6498. ;write a string, move cursor into next line
  6499. ; -> d0 = pointer to text
  6500. putnamw        bsr.s    putstrw
  6501.         bra.s    putnam1
  6502. putnam        bsr.s    putstr
  6503. putnam1        tst.b    d0
  6504.         beq.s    1$
  6505.         bsr.s    newline
  6506. 1$        rts
  6507.  
  6508. newline        move.w    #cr,d0            ; linefeed
  6509.  
  6510. ;write a string, strings are only put into the output buffer
  6511. ;when a LF is detected
  6512. ; -> d0 = pointer to string
  6513. ; <- d0 = cursor position
  6514.  
  6515. putstrw        ext.l    d0
  6516.         add.l    a4,d0            ; dataarea
  6517. putstr        movem.l    d1-d7/a0-a6,-(sp)
  6518.         st    printed(a4)
  6519.         move.l    d0,a2
  6520.         lea    out(a4),a3
  6521.         move.l    ptr(a4),d0
  6522.         move.l    a2,d5
  6523.         bne.s    pst1
  6524.         lea    longnix(a4),a2
  6525.  
  6526. pst1        move.b    (a2)+,d1
  6527.         cmpi.b    #13,d1
  6528.         beq.s    pst1
  6529.         cmpi.b    #10,d1
  6530.         beq.s    lineend
  6531.         move.b    d1,0(a3,d0.w)
  6532.         beq    prend
  6533.         cmp.w    #100,d0
  6534.         bge.s    pst1
  6535.         addq.l    #1,d0
  6536.         bra.s    pst1
  6537.  
  6538. lineend        tst.l    infile(a4)
  6539.         beq.s    1$
  6540.         moveq    #0,d0
  6541.         bra    prend
  6542.  
  6543. 1$        tst.l    lastprinted(a4)
  6544.         bne.s    2$
  6545.         bsr    killpage
  6546.  
  6547. 2$        addq.w    #1,d0
  6548.         move.l    d0,-(sp)
  6549.         add.w    #14,d0
  6550.         moveq    #0,d1
  6551.         CALL    AllocMem,sysbase(a4)
  6552.         move.l    (sp)+,d1
  6553.         tst.l    d0
  6554.         beq    prend
  6555.         move.l    d0,a0
  6556.         move.w    d1,12(a0)
  6557.         cmp.w    maxllength(a4),d1
  6558.         ble.s    7$
  6559.         move.w    d1,maxllength(a4)
  6560. 7$        move.l    node(a4),8(a0)
  6561.         clr.l    node(a4)
  6562.         clr.l    0(a0)
  6563.         move.l    lastprinted(a4),d0
  6564.         move.l    d0,4(a0)
  6565.         bne.s    3$
  6566.         move.l    a0,outchain(a4)
  6567.         bra.s    4$
  6568. 3$        move.l    d0,a1
  6569.         move.l    a0,0(a1)
  6570. 4$        move.l    a0,lastprinted(a4)
  6571.         lea    out(a4),a1
  6572.         lea    14(a0),a0
  6573.         move.b    #' ',(a0)+
  6574.         subq.w    #2,d1
  6575.         bmi.s    6$
  6576. 5$        move.b    (a1)+,(a0)+
  6577.         dbra    d1,5$
  6578. 6$        move.l    numlines(a4),d2
  6579.         cmp.l    maxlines(a4),d2
  6580.         ble.s    8$
  6581.         move.l    outchain(a4),a1        ; maxlines reached !
  6582.         move.l    0(a1),a0
  6583.         move.l    a0,outchain(a4)
  6584.         clr.l    4(a0)
  6585.         moveq    #14,d0
  6586.         add.w    12(a1),d0
  6587.         CALL    FreeMem,sysbase(a4)
  6588.         bra.s    9$
  6589.  
  6590. 8$        addq.l    #1,numlines(a4)
  6591. 9$        moveq    #0,d0
  6592.         tst.b    addlines(a4)
  6593.         beq.s    10$
  6594.         bsr    addline
  6595. 10$        bra    pst1
  6596. prend        move.l    d0,ptr(a4)
  6597.         movem.l    (sp)+,d1-d7/a0-a6
  6598.         rts
  6599.  
  6600. putblank    moveq    #' ',d0            ; store one blank
  6601.  
  6602. ;write one char 
  6603. ; -> d0 = char
  6604. putchar        movem.l    d1/a1,-(sp)
  6605.         move.l    ptr(a4),d1
  6606.         lea    out(a4),a1
  6607.         move.b    d0,0(a1,d1.w)
  6608.         addq.l    #1,ptr(a4)
  6609.         movem.l    (sp)+,d1/a1
  6610.         rts
  6611.  
  6612. ;move cursor to a column
  6613. ; -> d0 = current position
  6614. ;    d1 = column
  6615. tab        move.l    a3,-(sp)
  6616.         lea     out(a4),a3
  6617. 1$        cmp.b    d1,d0
  6618.         bcc.s    2$
  6619.         move.b    #' ',0(a3,d0.w)
  6620.         addq.b    #1,d0
  6621.         bra.s    1$
  6622. 2$        move.l    d1,ptr(a4)
  6623.         move.l    (sp)+,a3
  6624.         rts
  6625.  
  6626. ; Xoper main loop, process all incoming messages
  6627. processmsgs    moveq    #0,d0
  6628.         move.w    cxsig(a4),d1
  6629.         beq.s    3$
  6630.         bset    d1,d0
  6631. 3$        move.w    nspubsig+6(a4),d1
  6632.         bset    d1,d0
  6633.         move.w    intuisig(a4),d1
  6634.         bset    d1,d0
  6635.         move.w    timersig(a4),d1
  6636.         bset    d1,d0
  6637.         or.w    #4096,d0
  6638.         or.l    mysignal(a4),d0
  6639.         or.l    auxsig(a4),d0
  6640.         tst.l    auxsig(a4)
  6641.         bne.s    2$
  6642.         or.l    trapsignal(a4),d0
  6643. 2$        CALL    Wait,sysbase(a4)
  6644.  
  6645.         move.l    d0,tasksigs(a4)
  6646.  
  6647.         move.l    trapsignal(a4),d1
  6648.         and.l    d0,d1
  6649.         beq.s    1$
  6650.         tst.b    gotguru(a4)
  6651.         bne.s    1$
  6652.         st    gotguru(a4)
  6653.         bsr    showguru
  6654.         clr.b    gotguru(a4)
  6655.  
  6656. 1$        bsr    ChkBroker        ; check broker port
  6657.  
  6658. ctrl_c        moveq    #12,d1
  6659.         bsr    testsig
  6660.         beq.s    pubscreen
  6661.         bsr    exitall            ; exit requested (break)
  6662.  
  6663. pubscreen    move.w    nspubsig+6(a4),d1
  6664.         bsr    testsig
  6665.         beq.s    hotkey
  6666.         tst.b    wantexit(a4)
  6667.         beq.s    2$
  6668.         bsr    exitall            ; exit requested
  6669. 2$        tst.b    wanthold(a4)
  6670.         bne    instback        ; hold requested
  6671.         tst.b    wantwindow(a4)
  6672.         beq.s    1$
  6673.         bsr    usewindow        ; window requested
  6674.         bra.s    hotkey
  6675. 1$        bsr    setupscreen        ; rebuild screen
  6676.  
  6677. hotkey        moveq    #mysigbit,d1
  6678.         bsr    testsig
  6679.         beq.s    timermsg
  6680.         move.l    intuibase(a4),a6    ; Screen & window to front
  6681.         move.l    wnptr(a4),a2
  6682.         tst.b    ownscreen(a4)
  6683.         bne.s    1$            ; for scr window only activate !
  6684.         move.l    a2,a0
  6685.         RECALL    WindowToFront
  6686. 1$        move.l    a2,a0
  6687.         RECALL    ActivateWindow
  6688.         move.l    46(a2),a0        ; Window->Screen frontmost ?
  6689.         cmp.l    60(a6),a0
  6690.         beq.s    timermsg        ; yes, so skip !
  6691.         RECALL    ScreenToFront
  6692.  
  6693. timermsg    move.w    timersig(a4),d1
  6694.         bsr    testsig
  6695.         beq.s    intuimsgs
  6696.         btst.w    #8,propinfo(a4)
  6697.         bne.s    3$
  6698.         tst.b    repeat(a4)
  6699.         bne.s    1$
  6700.         bsr    showwhat
  6701.         bra.s    intuimsgs
  6702. 1$        move.w    repeatlen(a4),d0
  6703.         lea    repeatbuffer(a4),a2
  6704.         lea    dummy(a4),a1
  6705.         move.w    d0,d1
  6706. 2$        move.b    (a2)+,(a1)+
  6707.         dbra    d1,2$
  6708.         bsr    cli
  6709. 3$        bsr    starttimer
  6710.  
  6711. intuimsgs    move.w    intuisig(a4),d1
  6712.         bsr    testsig
  6713.         beq    processnxtmsg
  6714. nextimsg    move.l    wnptr(a4),a0
  6715.         move.l    $56(a0),a0
  6716.         CALL    GetMsg,sysbase(a4)
  6717.         move.l    d0,intuimsg(a4)
  6718.         beq    processnxtmsg
  6719.         move.l    d0,a0
  6720.         move.l    20(a0),d0
  6721.  
  6722.         cmp.l    #$200,d0        ; CloseWindow
  6723.         bne.s    1$
  6724.         tst.b    addlines(a4)
  6725.         beq    instback        ; iconify !
  6726.         st    cbreak(a4)
  6727.         bra    intuiend
  6728.  
  6729. 1$        cmp.l    #2,d0            ; ResizeWindow
  6730.         bne.s    1010$
  6731.         tst.b    post_V34(a4)
  6732.         beq.s    3443$
  6733.         move.l    wnptr(a4),a0
  6734.         move.l    minwsize(a4),d0
  6735.         cmp.w    10(a0),d0
  6736.         bne.s    3443$
  6737.         swap    d0
  6738.         cmp.w    8(a0),d0
  6739.         bne.s    3443$
  6740.         bsr    replyintui        ; window was 'zipped'
  6741.         bsr    stoptimer
  6742.         bra    instback
  6743.  
  6744. 3443$        bsr    setupscreen
  6745.         bra    intuiend
  6746.  
  6747. 1010$        cmp.l    #$10,d0
  6748.         bne.s    2$
  6749.         btst.w    #8,propinfo(a4)
  6750.         bne.s    1004$
  6751.         bra.s    1002$
  6752.  
  6753. 2$        cmp.l    #4,d0            ; refresh
  6754.         bne.s    22$
  6755.         bsr    putiline
  6756.         bsr    blastout
  6757.         bsr    UpdateIArea
  6758.         bra.s    1002$
  6759.  
  6760. 22$        tst.b    addlines(a4)
  6761.         bne.s    3$
  6762.         cmp.l    #$20,d0            ; gadgetdown
  6763.         bne.s    1000$
  6764.         tst.b    getanswer(a4)
  6765.         bne.s    3$
  6766.         move.l    28(a0),a1
  6767.         cmp.w    #3,38(a1)        ; Slidebar
  6768.         bne.s    1002$
  6769.         tst.b    propgadon(a4)
  6770.         beq.s    1002$
  6771. 1004$        bsr    proppos
  6772. 1002$        bra    intuiend
  6773.  
  6774. 1000$        cmp.l    #$40,d0            ; gadgetup
  6775.         bne.s    3$
  6776.         move.l    28(a0),a1
  6777.         cmp.w    #3,38(a1)        ; Slidebar ?
  6778.         bne.s    1003$
  6779.         bclr.w    #8,propinfo(a4)        ; clear 'knop hit' bit
  6780.         bra.s    1002$
  6781.  
  6782. 1003$        bsr    replyintui        ; iconify
  6783.         bsr    stoptimer
  6784.         bra    instback
  6785.  
  6786. 3$        cmp.l    #$400,d0        ; RawKey
  6787.         bne    intuiend
  6788.         move.w    #$80,d0
  6789.         and.w    24(a0),d0
  6790.         bne    intuiend
  6791.         and.w    #$7f,24(a0)
  6792.         lea    ievent(a4),a1
  6793.         move.b    #1,4(a1)
  6794.         move.l    24(a0),6(a1)
  6795.         move.w    26(a0),qualifier(a4)
  6796.         move.l    a1,a0
  6797.         lea    outevent(a4),a1
  6798.         moveq    #20,d1
  6799.         suba.l    a2,a2
  6800.         CALL    RawKeyConvert,condev(a4)
  6801.         tst.l    d0
  6802.         beq    intuiend
  6803.         lea    inputbuffer(a4),a1
  6804.         lea    outevent(a4),a2
  6805.         move.w    curpos(a4),d4
  6806.         moveq    #0,d3
  6807.         tst.b    addlines(a4)
  6808.         bne    197$
  6809.  
  6810.         cmp.b    #$9b,0(a2)        ; SI code
  6811.         bne    110$
  6812.  
  6813.         cmp.b    #'?',1(a2)        ; help
  6814.         bne.s    399$
  6815.         tst.b    getanswer(a4)
  6816.         bne.s    399$
  6817.         bsr    stoptimer
  6818.         tst.w    bottomin(a4)
  6819.         bne.s    398$
  6820.         addq.w    #1,bottomin(a4)
  6821.         bsr    getcurpos
  6822.         clr.w    ibufferlen(a4)
  6823.         clr.w    curpos(a4)
  6824.         bsr    UpdateIArea
  6825. 398$        move.w    #usetxt,d0
  6826.         bsr    putnamw
  6827.         clr.l    lastprinted(a4)
  6828.         bsr    blastout
  6829.         bra.s    420$
  6830.  
  6831. 399$        cmp.b    #'C',1(a2)        ; cursor right
  6832.         bne.s    400$
  6833.         cmp.w    ibufferlen(a4),d4
  6834.         bge.s    420$
  6835.         addq.w    #1,d4
  6836. 421$        move.w    d4,curpos(a4)
  6837. 420$        bra    100$
  6838.  
  6839. 400$        cmp.b    #'D',1(a2)        ; cursor left
  6840.         bne.s    401$
  6841.         subq.w    #1,d4
  6842.         bpl.s    421$
  6843.         bra.s    420$
  6844.  
  6845. 401$        cmp.b    #' ',1(a2)
  6846.         bne.s    402$
  6847.         cmp.b    #'@',2(a2)        ; shift right
  6848.         bne.s    403$
  6849.  
  6850. 404$        cmp.w    ibufferlen(a4),d4
  6851.         bge.s    421$
  6852.         addq.w    #1,d4
  6853.         cmp.b    #' ',0(a1,d4.w)
  6854.         bne.s    404$
  6855. 405$        cmp.w    ibufferlen(a4),d4
  6856.         bge.s    421$
  6857.         addq.w    #1,d4
  6858.         cmp.b    #' ',0(a1,d4.w)
  6859.         beq.s    405$
  6860.         bra.s    421$
  6861.  
  6862. 403$        cmp.b    #'A',2(a2)        ; shift left
  6863.         bne.s    420$
  6864. 406$        tst.w    d4
  6865.         beq.s    421$
  6866.         subq.w    #1,d4
  6867.         cmp.b    #' ',0(a1,d4.w)
  6868.         beq.s    406$
  6869. 407$        tst.w    d4
  6870.         beq.s    421$
  6871.         subq.w    #1,d4
  6872.         cmp.b    #' ',0(a1,d4.w)
  6873.         bne.s    407$
  6874.         addq.w    #1,d4
  6875.         bra.s    421$
  6876.  
  6877. 402$        cmp.b    #'A',1(a2)        ; cursor up
  6878.         bne.s    408$
  6879.         tst.w    bottomin(a4)
  6880.         bne.s    480$
  6881.         tst.w    curpos(a4)
  6882.         bne.s    480$
  6883.  
  6884.         clr.w    curpos(a4)
  6885.         clr.w    ibufferlen(a4)
  6886.         bsr    UpdateIArea
  6887.         bsr    clrcursor
  6888.         move.w    edline(a4),d3
  6889.         ext.l    d3
  6890.         tst.w    d3
  6891.         beq.s    481$
  6892.         subq.l    #1,d3
  6893.         cmp.l    firstline(a4),d3
  6894.         bge.s    481$
  6895.         move.l    d3,-(sp)
  6896.         subq.l    #1,firstline(a4)
  6897.         bsr    blastout
  6898.         move.l    (sp)+,d3
  6899. 481$        move.w    d3,edline(a4)
  6900.         bsr    getcurpos
  6901.         bsr    putcursor
  6902.         bra    intuiend
  6903. 480$        move.l    history(a4),a0
  6904.         tst.l    0(a0)
  6905.         beq.s    423$
  6906.         move.l    curhist(a4),a1
  6907.         cmp.l    a0,a1
  6908.         beq.s    409$
  6909.         move.l    4(a1),d0
  6910.         move.l    d0,curhist(a4)
  6911. 409$        move.l    a1,gothline(a4)
  6912.         bsr    copyhistory
  6913. 423$        bra    100$
  6914.  
  6915. 408$        cmp.b    #'B',1(a2)        ; cursor down
  6916.         bne    410$
  6917.         tst.w    bottomin(a4)
  6918.         bne.s    414$
  6919.         tst.w    curpos(a4)
  6920.         bne.s    414$
  6921.  
  6922.         clr.w    curpos(a4)
  6923.         clr.w    ibufferlen(a4)
  6924.         bsr    UpdateIArea
  6925.         bsr    clrcursor
  6926.         move.w    edline(a4),d3
  6927.         ext.l    d3
  6928.         move.l    numlines(a4),d4
  6929.         subq.l    #1,d4
  6930.         cmp.l    d4,d3
  6931.         beq.s    490$
  6932.         move.l    firstline(a4),d2
  6933.         add.w    rows(a4),d2
  6934.         subq.w    #1,d2
  6935.         addq.w    #1,d3
  6936.         cmp.w    d2,d3
  6937.         ble.s    490$
  6938.         move.l    d3,-(sp)
  6939.         addq.l    #1,firstline(a4)
  6940.         bsr    blastout
  6941.         move.l    (sp)+,d3
  6942. 490$        bra    481$
  6943. 414$        move.l    curhist(a4),d0
  6944.         beq.s    423$
  6945.         move.l    d0,a1
  6946.         move.l    0(a1),a1
  6947.         tst.l    0(a1)
  6948.         bne.s    411$
  6949.         clr.l    gothline(a4)
  6950.         clr.w    curpos(a4)
  6951.         clr.w    ibufferlen(a4)
  6952.         bra    423$
  6953. 411$        move.l    a1,curhist(a4)
  6954.         bra    409$
  6955.  
  6956. 410$        cmp.b    #'T',1(a2)        ; shift up
  6957.         bne.s    412$
  6958.         tst.w    hnum(a4)
  6959.         beq     423$
  6960.         move.l    history(a4),a1
  6961.         move.l    a1,curhist(a4)
  6962.         bra    409$
  6963.  
  6964. 412$        cmp.b    #'S',1(a2)        ; shift down
  6965.         bne.s    440$
  6966.         tst.w    hnum(a4)
  6967.         beq    423$
  6968.         move.l    history+8(a4),curhist(a4)
  6969.         bra.s    414$
  6970.  
  6971. 440$        cmp.b    #'0',1(a2)        ; function keys
  6972.         bmi    423$
  6973.         cmp.b    #'9',1(a2)
  6974.         bgt    423$
  6975.         lea    1(a2),a0
  6976.         bsr    getnum
  6977.         lea    fkeys(a4),a0
  6978. 441$        move.l    0(a0),a0
  6979.         tst.l    0(a0)
  6980.         beq    100$
  6981.         cmp.b    8(a0),d2
  6982.         bne.s    441$
  6983.         moveq    #0,d3
  6984.         move.w    curpos(a4),d4
  6985.         move.b    9(a0),d5
  6986.         ext.w    d5
  6987.         subq.w    #1,d5
  6988.         lea    10(a0),a0
  6989.         lea    inputbuffer(a4),a2
  6990.         lea    0(a2,d4.w),a2
  6991. 445$        move.b    (a0)+,d0
  6992.         cmp.b    #'^',d0
  6993.         bne.s    442$
  6994.         moveq    #1,d3
  6995.         bra.s    443$
  6996. 442$        cmp.b    #'_',d0
  6997.         bne.s     444$
  6998.         move.b    #' ',d0
  6999. 444$        move.b    d0,(a2)+
  7000.         addq.w    #1,d4
  7001. 443$        dbra    d5,445$
  7002.         move.w    d4,curpos(a4)
  7003.         cmp.w    ibufferlen(a4),d4
  7004.         ble.s    446$
  7005.         move.w    d4,ibufferlen(a4)
  7006. 446$        tst.w    d3
  7007.         beq    100$
  7008.         bra    got_fkey
  7009.  
  7010. 110$        moveq    #0,d3
  7011. 101$        move.w    curpos(a4),d4
  7012.         tst.w    d0
  7013.         beq    100$
  7014.         cmp.b    #13,0(a2,d3.w)        ; return
  7015.         beq    got_enter
  7016.  
  7017.         cmp.b    #27,0(a2,d3.w)        ; esc
  7018.         bne    799$
  7019.         tst.b    getanswer(a4)
  7020.         bne    100$
  7021.         clr.b    insmode(a4)
  7022.         clr.w    ibufferlen(a4)
  7023.         move.w    #200,curpos(a4)
  7024.         bsr    UpdateIArea
  7025.         clr.w    curpos(a4)
  7026.         tst.w    bottomin(a4)
  7027.         bne.s    700$
  7028.         addq.w    #1,bottomin(a4)
  7029.         bsr    getcurpos
  7030.         cmp.b    #5,timerstate(a4)
  7031.         bne.s    765$
  7032.         bsr    starttimer
  7033. 765$        bra    100$
  7034.  
  7035. 700$        move.b    timerio+8(a4),timerstate(a4)
  7036.         bsr    stoptimer
  7037.         moveq    #0,d0
  7038.         move.w    edline(a4),d0
  7039.         move.l    firstline(a4),d4
  7040.         cmp.w    d4,d0
  7041.         bmi.s    701$
  7042.         move.w    d4,d5
  7043.         add.w    rows(a4),d5
  7044.         cmp.w    d5,d0
  7045.         bmi.s    702$
  7046. 701$        move.w    rows(a4),d0
  7047.         lsr.w    #1,d0
  7048.         add.w    d4,d0
  7049. 702$        move.l    numlines(a4),d3
  7050.         subq.w    #1,d3
  7051.         cmp.w    d3,d0
  7052.         ble.s    703$
  7053.         move.w    d3,d0
  7054. 703$        move.w    d0,edline(a4)
  7055.         sub.w    d4,d0
  7056.         mulu    txheight(a4),d0
  7057.         add.w    firstpos(a4),d0        ; BarHeight+FontHeight !
  7058.         move.w    d0,cposy(a4)
  7059.         clr.w    bottomin(a4)
  7060.         tst.w    loffset(a4)
  7061.         beq.s    704$
  7062.         clr.w    loffset(a4)
  7063.         bsr    blastout
  7064. 704$        bra    100$
  7065.  
  7066. 799$        cmp.b    #8,0(a2,d3.w)        ; Backspace
  7067.         bne.s    114$
  7068.         tst.w    d4
  7069.         beq.s    179$
  7070.         bsr    delchar
  7071.         subq.w    #1,d4
  7072.         move.w    d4,curpos(a4)
  7073.         bra.s    179$
  7074.  
  7075. 114$        cmp.b    #127,0(a2,d3.w)        ; Del
  7076.         bne.s    150$
  7077. 178$        cmp.w    ibufferlen(a4),d4
  7078.         bge.s    179$
  7079.         addq.w    #1,d4
  7080.         bsr    delchar
  7081. 179$        bra    102$
  7082.  
  7083. 150$        cmp.b    #9,0(a2,d3.w)        ; Tab
  7084.         bne     197$
  7085.         move.w    oldpos(a4),d1
  7086.         lea    inputbuffer(a4),a2
  7087.         move.b    newtab(a4),oldtab(a4)
  7088.         beq.s    152$            ; previous tab
  7089.         clr.b    newtab(a4)
  7090.         move.w    cmdcomplen(a4),d0
  7091.         add.w    d1,d0
  7092.         lea    0(a2,d0.w),a0
  7093.         move.w    cmdcplen(a4),d0
  7094.         lea    0(a0,d0.w),a1
  7095. 151$        move.b    (a1)+,(a0)+        ; restore old cmdline
  7096.         bne.s    151$
  7097.         sub.w    d0,ibufferlen(a4)
  7098.         tst.w    curpos(a4)
  7099.         beq.s    155$
  7100.         move.w    ibufferlen(a4),curpos(a4)
  7101.         bra.s    155$            ; search next cmd
  7102.  
  7103. 152$        move.w    ibufferlen(a4),d0
  7104.         move.l    a2,a0
  7105.         bsr    tolower            ; ibuffer to lower case
  7106.         move.w    curpos(a4),d0
  7107.         move.w    d0,d1
  7108.         beq.s    1532$
  7109. 153$        cmp.b    #' ',-1(a2,d1.w)    ; search down
  7110.         beq.s    1531$
  7111.         subq.w    #1,d1
  7112.         bne.s    153$
  7113. 1531$        move.w    d1,d0
  7114. 1532$        cmp.b    #' ',0(a2,d0.w)        ; search up
  7115.         beq.s    154$
  7116.         addq.w    #1,d0
  7117.         cmp.w    ibufferlen(a4),d0
  7118.         bcs.s    1532$
  7119. 154$        sub.w    d1,d0
  7120.         move.w    d0,cmdcomplen(a4)    ; chars to cmp
  7121.         move.w    d1,oldpos(a4)        ; cmp pos (for next tab)
  7122.         clr.w    cmdcompnr(a4)
  7123. 155$        lea    0(a2,d1.w),a2
  7124.  
  7125. 156$        tst.b    newtab(a4)
  7126.         bne.s    169$            ; found a cmd
  7127.         move.w    cmdcompnr(a4),d0
  7128.         bsr    getcmdptr
  7129.         move.l    d0,a0
  7130.         move.l    a2,a1
  7131.         move.w    cmdcomplen(a4),d1
  7132.         subq.w    #1,d1
  7133. 157$        move.b    (a0)+,d0        ; comp cmd <-> ibuffer
  7134.         beq.s    163$
  7135.         cmp.b    (a1)+,d0
  7136.         bne.s    163$
  7137.         dbra    d1,157$
  7138.  
  7139.         moveq    #-1,d0
  7140. 158$        addq.w    #1,d0
  7141.         tst.b    0(a0,d0.w)
  7142.         bne.s    158$
  7143.         tst.w    d0
  7144.         beq.s    162$            ; nothing to copy !
  7145.         move.l    a1,a2
  7146. 159$        tst.b    (a2)+
  7147.         bne.s    159$
  7148. 160$        move.b    -(a2),0(a2,d0.w)
  7149.         cmp.l    a2,a1
  7150.         bcs.s    160$
  7151.         move.w    d0,-(sp)
  7152. 161$        move.b    -1(a0,d0.w),-1(a1,d0.w)
  7153.         subq.w    #1,d0
  7154.         bne.s    161$
  7155.         move.w    (sp)+,d0
  7156.         tst.w    curpos(a4)
  7157.         beq.s    162$            ; was zero
  7158.         add.w    d0,curpos(a4)
  7159. 162$        add.w    d0,ibufferlen(a4)
  7160.         move.w    ibufferlen(a4),oldibuflen(a4)
  7161.         move.w    d0,cmdcplen(a4)
  7162.         st    newtab(a4)
  7163.  
  7164. 163$        addq.w    #1,cmdcompnr(a4)    ; next cmd
  7165.         moveq    #cmdnum-1,d0
  7166.         sub.w    cmdcompnr(a4),d0
  7167.         bcc.s    156$            ; not ready
  7168.         clr.w    cmdcompnr(a4)
  7169.         tst.b    oldtab(a4)
  7170.         bne.s    156$            ; prev tab
  7171. 169$        bra    100$            ; end it
  7172.  
  7173. 197$        cmp.b    #3,0(a2,d3.w)        ; ctrl c
  7174.         bne.s    104$
  7175.         st    cbreak(a4)
  7176.  
  7177. 104$        tst.b    addlines(a4)
  7178.         bne    processnxtmsg
  7179.         cmp.b    #$18,0(a2,d3.w)        ; ctrl x
  7180.         bne.s    300$
  7181.         clr.w    ibufferlen(a4)
  7182.         clr.w    curpos(a4)
  7183.         bra.s    169$
  7184.  
  7185. 300$        cmp.b    #$19,0(a2,d3.w)        ; ctrl y
  7186.         bne.s    106$
  7187.         move.w    curpos(a4),ibufferlen(a4)
  7188.         bra.s    169$
  7189.  
  7190. 106$        move.w    #$100,d5        ; NumPad
  7191.         and.w    qualifier(a4),d5
  7192.         beq    105$
  7193.         move.l    firstline(a4),d5
  7194.  
  7195.         cmp.b    #'7',0(a2,d3.w)        ; 'Home'
  7196.         bne.s    200$
  7197.         moveq    #0,d5
  7198. 199$        cmp.l    firstline(a4),d5
  7199.         beq.s    196$
  7200.         move.l    d5,firstline(a4)
  7201.         bsr    blastout
  7202.         tst.w    bottomin(a4)
  7203.         bne.s    196$
  7204.         move.w    edline(a4),d0
  7205.         move.l    firstline(a4),d1
  7206.         cmp.w    d1,d0
  7207.         bmi.s    190$
  7208.         add.w    rows(a4),d1
  7209.         cmp.w    d1,d0
  7210.         bmi.s    192$
  7211. 190$        clr.w    curpos(a4)
  7212.         clr.w    ibufferlen(a4)
  7213.         move.w    rows(a4),d0
  7214.         lsr.w    #1,d0
  7215.         ext.l    d0
  7216.         add.l    firstline(a4),d0
  7217.         cmp.l    numlines(a4),d0
  7218.         bmi.s    191$
  7219.         move.l    numlines(a4),d0
  7220.         subq.w    #1,d0
  7221. 191$        move.w    d0,edline(a4)
  7222. 192$        bsr    getcurpos
  7223.         bsr    UpdateIArea
  7224. 196$        bra    100$
  7225.  
  7226. 200$        cmp.b    #'8',0(a2,d3.w)        ; 'up arrow'
  7227.         bne.s    201$
  7228.         tst.w    d5
  7229.         beq    100$
  7230.         subq.w    #1,d5
  7231. 1990$        bra.s    199$
  7232.  
  7233. 201$        cmp.b    #'9',0(a2,d3.w)        ; 'PgUp'
  7234.         bne.s    203$
  7235.         sub.w    rows(a4),d5
  7236.         bpl.s    1990$
  7237.         moveq    #0,d5
  7238.         bra.s    1990$
  7239.  
  7240. 203$        cmp.b    #'1',0(a2,d3.w)        ; 'End'
  7241.         bne.s    205$
  7242. 222$        move.l    numlines(a4),d5
  7243.         sub.w    rows(a4),d5
  7244.         bpl    199$
  7245.         moveq    #0,d5
  7246. 204$        bra    199$
  7247.  
  7248. 205$        cmp.b    #'2',0(a2,d3.w)        ; 'down arrow'
  7249.         bne.s    206$
  7250.         move.l    d5,d2
  7251.         add.w    rows(a4),d2
  7252.         cmp.l    numlines(a4),d2
  7253.         bge    100$
  7254.         addq.w    #1,d5
  7255.         bra    199$
  7256.  
  7257. 206$        cmp.b    #'3',0(a2,d3.w)        ; 'PgDn'
  7258.         bne.s    500$
  7259.         add.w    rows(a4),d5
  7260.         move.l    d5,d2
  7261.         add.w    rows(a4),d2
  7262.         cmp.l    numlines(a4),d2
  7263.         bge.s    222$
  7264.         bra    199$
  7265.  
  7266. 500$        cmp.b    #'4',0(a2,d3.w)        ; left arrow
  7267.         bne.s    501$
  7268.         tst.w    bottomin(a4)
  7269.         beq    102$
  7270.         move.w    loffset(a4),d2
  7271.         sub.w    colms(a4),d2
  7272.         bpl.s    502$
  7273.         moveq    #0,d2
  7274. 502$        move.w    d2,loffset(a4)
  7275.         bsr    blastout
  7276.         bra    100$
  7277.  
  7278. 501$        cmp.b    #'6',0(a2,d3.w)        ; right arrow
  7279.         bne.s    170$
  7280.         tst.w    bottomin(a4)
  7281.         beq.s    102$
  7282.         move.w    loffset(a4),d2
  7283.         add.w    colms(a4),d2
  7284.         bra.s    502$
  7285.  
  7286. 170$        cmp.b    #'0',0(a2,d3.w)        ; Ins
  7287.         bne.s    177$
  7288.         not.b    insmode(a4)
  7289.         bra.s    102$
  7290.  
  7291. 177$        cmp.b    #'.',0(a2,d3.w)        ; Del
  7292.         beq    178$
  7293. 105$        tst.w    bottomin(a4)
  7294.         bne.s    777$
  7295.         tst.w    curpos(a4)
  7296.         bne.s    777$
  7297.         movem.l    d0/d1,-(sp)
  7298.         move.w    edline(a4),d0
  7299.         bsr    findline
  7300.         movem.l    (sp)+,d0/d1
  7301.         tst.l    8(a5)
  7302.         beq    intuiend
  7303. 777$        move.w    curpos(a4),d5
  7304.         ext.l    d5
  7305.         moveq    #79,d2
  7306.         cmp.w    d2,d5
  7307.         bge.s    102$
  7308.         tst.b    insmode(a4)
  7309.         beq.s    172$
  7310.         cmp.w    ibufferlen(a4),d5
  7311.         bmi.s    171$
  7312.         bra.s    173$
  7313. 172$        sub.w    d5,d2
  7314.         lea    80(a1),a5
  7315.         lea    79(a1),a3
  7316. 103$        move.b    -(a3),-(a5)
  7317.         dbra    d2,103$
  7318. 173$        addq.w    #1,ibufferlen(a4)
  7319. 171$        move.b    0(a2,d3),0(a1,d5)
  7320.         addq.w    #1,curpos(a4)
  7321. 102$        subq.w    #1,d0
  7322.         addq.w    #1,d3
  7323.         bra    101$
  7324.  
  7325. 100$        bsr    UpdateIArea
  7326.         bra    intuiend
  7327.  
  7328. got_enter    bsr    puthist
  7329. got_fkey    bsr    stoptimer
  7330.         clr.b    insmode(a4)
  7331.         lea    dummy(a4),a1
  7332.         lea    inputbuffer(a4),a2
  7333.         move.w    ibufferlen(a4),d2
  7334.         beq.s    2$
  7335.         tst.w    bottomin(a4)
  7336.         bne.s    5$
  7337.         movem.l    a1/a2,-(sp)
  7338.         move.w    edline(a4),d0
  7339.         bsr    findline
  7340.         move.l    8(a5),d0
  7341.         bsr    gthex
  7342.         lea    hexarea(a4),a0
  7343.         lea    0(a2,d2.w),a1
  7344.         move.b    #' ',(a1)+
  7345.         move.b    #'$',(a1)+
  7346.         moveq    #8,d0
  7347.         CALL    CopyMem,sysbase(a4)
  7348.         moveq    #10,d2
  7349.         add.w    ibufferlen(a4),d2
  7350.         move.w    d2,ibufferlen(a4)
  7351.         movem.l    (sp)+,a1/a2
  7352. 5$        subq.w    #1,d2
  7353. 1$        move.b    (a2)+,(a1)+
  7354.         dbra    d2,1$
  7355. 2$        move.b    #10,(a1)+
  7356.         move.w    ibufferlen(a4),d0
  7357.         addq.w    #1,d0
  7358.         move.w    d0,-(sp)
  7359.         clr.w    ibufferlen(a4)
  7360.         tst.w    bottomin(a4)
  7361.         bne.s    4$
  7362.         move.w    #100,curpos(a4)
  7363.         bsr    UpdateIArea
  7364. 4$        clr.w    curpos(a4)
  7365.         move.w    #1,bottomin(a4)
  7366.         bsr    getcurpos
  7367.         bsr    UpdateIArea
  7368.         move.w    (sp)+,d0        ; needed for cli
  7369.         move.w    d0,repeatlen(a4)
  7370.         clr.b    repeat(a4)
  7371.         clr.b    printed(a4)
  7372.         tst.b    getanswer(a4)
  7373.         bne.s    rintui
  7374. 6$        bsr    cli
  7375.         tst.b    printed(a4)
  7376.         bne.s    intuiend
  7377.         bsr    starttimer
  7378. intuiend    bsr.s    replyintui
  7379.         move.w    ibufferlen(a4),d0
  7380.         cmp.w    oldibuflen(a4),d0
  7381.         beq.s    1$            ; nothing changed
  7382.         clr.b    newtab(a4)
  7383. 1$        bra    nextimsg
  7384.  
  7385. processnxtmsg    tst.b    addlines(a4)
  7386.         bne.s    rintui
  7387.         tst.b    propupdate(a4)
  7388.         beq.s    1$
  7389.         clr.b    propupdate(a4)
  7390.         tst.b    propgadon(a4)
  7391.         beq.s    1$
  7392.         bsr.s    setprop
  7393. 1$        bra    processmsgs
  7394.  
  7395. replyintui    move.l    intuimsg(a4),d0
  7396.         beq.s    rintui
  7397.         move.l    d0,a1
  7398.         CALL    ReplyMsg,sysbase(a4)
  7399.         clr.l    intuimsg(a4)
  7400. rintui        rts
  7401.  
  7402. ; propgadget code
  7403. setprop        btst.w    #8,propinfo(a4)        ; update slider position
  7404.         bne.s    8$            ; and size
  7405.         moveq    #0,d0
  7406.         CALL    LockIBase,intuibase(a4)
  7407.         move.l    d0,-(sp)
  7408.         moveq    #0,d5
  7409.         move.l    wnptr(a4),a0        ; see if the user hit the
  7410.                         ; scrollbar in the meantime
  7411.         move.l    86(a0),a0        ; wn->UserPort
  7412.         lea    20(a0),a0        ; Userport->MsgList
  7413. 5$        move.l    0(a0),d0
  7414.         beq.s    6$            ; no more pending messages
  7415.         move.l    d0,a0
  7416.         cmp.l    #$20,20(a0)        ; gadgetdown ?
  7417.         bne.s    5$
  7418.         move.l    28(a0),a1
  7419.         cmp.w    #3,38(a1)        ; scrollbar ?
  7420.         bne.s    5$
  7421.         moveq    #1,d5
  7422.         bra.s     5$
  7423.  
  7424. 6$        move.l    (sp)+,a0
  7425.         CALL     UnlockIBase,intuibase(a4)
  7426.         tst.w    d5
  7427.         beq.s    7$
  7428. 8$        rts
  7429.  
  7430. 7$        moveq     #0,d2            ; VertPot = firstline*MAXPOT/(numlines-rows)
  7431.         move.l    numlines(a4),d3
  7432.         sub.w    rows(a4),d3
  7433.         ble.s    1$
  7434.         move.l    firstline(a4),d2
  7435.         mulu    #65535,d2
  7436.         divu    d3,d2
  7437.  
  7438. 1$        moveq    #-1,d4            ; VertBody = rows*MAXBODY/numlines
  7439.         move.w    rows(a4),d5
  7440.         ext.l    d5
  7441.         cmp.l    numlines(a4),d5
  7442.         bge.s    2$
  7443.         mulu    #$ffff,d5
  7444.         move.l    numlines(a4),d0
  7445.         divu    d0,d5
  7446.         move.l    d5,d4
  7447.  
  7448. 2$        cmp.w    propinfo+8(a4),d4    ; did something change ?
  7449.         bne.s    3$
  7450.         cmp.w    propinfo+4(a4),d2
  7451.         beq.s    4$
  7452.  
  7453. 3$        moveq    #1|4,d0
  7454.         moveq    #0,d1
  7455.         moveq    #-1,d3
  7456.         moveq    #1,d5
  7457.         lea    sbgadget(a4),a0
  7458.         move.l    wnptr(a4),a1
  7459.         suba.l    a2,a2
  7460.         CALL    NewModifyProp,intuibase(a4)
  7461. 4$        rts
  7462.  
  7463. proppos        move.w    propinfo+4(a4),d0    ; get slider position and
  7464.         move.l    numlines(a4),d1        ; update window if necessary
  7465.         sub.w    rows(a4),d1
  7466.         ble.s    1$
  7467.         move.l    #$ffff,d3    ; firstline=VertPot/(MAXPOT/numlines-rows)
  7468.         divu    d1,d3
  7469.         divu    d3,d0
  7470.         ext.l    d0
  7471.         cmp.l    firstline(a4),d0
  7472.         beq.s    1$
  7473.         move.l    d0,firstline(a4)
  7474.         bsr    blastout        ; update screem
  7475. 1$        rts
  7476.  
  7477. ;put an input line into the history buffer
  7478. puthist        move.w    ibufferlen(a4),d5
  7479.         move.l    d5,d0
  7480.         cmp.w    minnumchars(a4),d0
  7481.         bcs.s    1$
  7482.         move.l    gothline(a4),d1
  7483.         beq.s    5$
  7484.         move.l    d1,a2
  7485.         cmp.w    8(a2),d5
  7486.         bne.s    5$
  7487.         lea    10(a2),a2
  7488.         lea    inputbuffer(a4),a1
  7489.         subq.w    #1,d0
  7490. 6$        cmp.b    (a2)+,(a1)+
  7491.         bne.s    5$
  7492.         dbra    d0,6$
  7493.         move.l  gothline(a4),curhist(a4)
  7494.         bra.s    1$
  7495.  
  7496. 5$        moveq    #10,d0
  7497.         add.w    d5,d0
  7498.         ext.l    d0
  7499.         moveq    #1,d1
  7500.         swap    d1            ; MEMF_CLEAR
  7501.         CALL    AllocMem,sysbase(a4)
  7502.         move.l    d0,a0
  7503.         move.l    a0,d0
  7504.         beq.s    1$
  7505.         move.w    d5,8(a0)
  7506.         lea    10(a0),a2
  7507.         subq.w    #1,d5
  7508.         lea    inputbuffer(a4),a1
  7509. 2$        move.b    (a1)+,(a2)+
  7510.         dbra    d5,2$
  7511.         move.w    hnum(a4),d5
  7512.         cmp.w    maxhlines(a4),d5
  7513.         bmi.s    3$
  7514.         bsr    remhistline
  7515.         bra.s    4$
  7516. 3$        addq.w    #1,d5
  7517.         move.w    d5,hnum(a4)
  7518. 4$        move.l    d0,a1
  7519.         move.l    d0,curhist(a4)
  7520.         lea    history(a4),a0
  7521.         CALL    AddTail,sysbase(a4)
  7522. 1$        clr.l    gothline(a4)
  7523.         rts
  7524.  
  7525. ;copy a history line into the input buffer
  7526. copyhistory    lea    inputbuffer(a4),a0
  7527.         move.w    8(a1),d3
  7528.         ext.l    d3
  7529.         move.w    d3,curpos(a4)
  7530.         move.w    d3,ibufferlen(a4)
  7531.         subq.w    #1,d3
  7532.         lea    10(a1),a1
  7533. 1$        move.b    (a1)+,(a0)+
  7534.         dbra    d3,1$
  7535.         rts
  7536.  
  7537. ;remove one line from the history buffer
  7538. ;pointer to the line in A1, returns pointer to the next line in d1
  7539. remhistline    move.l    d0,-(sp)
  7540.         lea     history(a4),a0
  7541.         move.l    0(a0),a5
  7542.         tst.l    0(a5)
  7543.         beq.s    1$
  7544.         CALL    RemHead,sysbase(a4)
  7545.         move.l    a5,a1
  7546.         moveq    #10,d0
  7547.         add.w    8(a1),d0
  7548.         ext.l    d0
  7549.         RECALL    FreeMem
  7550. 1$        move.l    (sp)+,d0
  7551.         rts
  7552.  
  7553. ;kill all history lines
  7554. killhistory    bsr    remhistline
  7555.         move.l    history(a4),a0
  7556.         tst.l    0(a0)
  7557.         bne.s    killhistory
  7558. 2$        clr.w    hnum(a4)
  7559.         clr.l    curhist(a4)
  7560.         rts
  7561.  
  7562. ;delete one char from the input line
  7563. delchar        lea    inputbuffer(a4),a3
  7564.         lea     0(a3,d4.w),a3
  7565.         lea     -1(a3),a5
  7566.         move.w    d4,d5
  7567. 1$        cmp.w    #78,d5
  7568.         bge.s    2$
  7569.         move.b    (a3)+,(a5)+
  7570.         addq.w    #1,d5
  7571.         bra.s    1$
  7572. 2$        subq.w    #1,ibufferlen(a4)
  7573.         rts
  7574.  
  7575. testsig        move.l    tasksigs(a4),d0
  7576.         btst    d1,d0
  7577.         rts
  7578.  
  7579. ;Update the current position of the input line
  7580. getcurpos    moveq    #0,d3
  7581.         move.w    ipos(a4),d3
  7582.         tst.w    bottomin(a4)
  7583.         bne.s    1$
  7584.         move.w    edline(a4),d3
  7585.         sub.l    firstline(a4),d3
  7586.         mulu    txheight(a4),d3
  7587.         add.w    firstpos(a4),d3        ; BarHeight+FontHeight !
  7588. 1$        move.w    d3,cposy(a4)
  7589.         rts
  7590.  
  7591. ;rebuild the window from scratch
  7592. setupscreen    move.l    rastport(a4),a1
  7593.         moveq    #0,d0
  7594.         CALL    SetRast,gfxbase(a4)
  7595.         move.l    intuibase(a4),a6
  7596.         moveq    #1,d0
  7597.         bsr    setnewprop        ; does a RefreshWindowFrame()
  7598.         bsr    getwindowsize
  7599.         tst.w    bottomin(a4)
  7600.         bne.s    1$
  7601.         move.w    edline(a4),d0
  7602.         move.l    firstline(a4),d1
  7603.         move.w    rows(a4),d2
  7604.         move.w    d2,d4
  7605.         move.w    numlines(a4),d3
  7606.         add.w    d1,d2
  7607.         cmp.w    d2,d0
  7608.         bmi.s    2$
  7609.         lsr.w    #1,d4
  7610.         sub.w    d4,d0
  7611.         ext.l    d0
  7612.         move.l    d0,firstline(a4)
  7613. 2$        bsr    tstfirstlin
  7614. 1$        bsr.s    getcurpos
  7615.         bsr    putiline
  7616.         bsr    blastout
  7617.         bsr.s    UpdateIArea
  7618.         move.w    rows(a4),currenty(a4)
  7619.         rts
  7620.  
  7621. ;refresh the input area
  7622. UpdateIArea    movem.l    a2/a6,-(sp)        ; to change !
  7623.         move.l    rastport(a4),a2
  7624.         move.l    gfxbase(a4),a6
  7625.         moveq    #1,d0
  7626.         move.l    a2,a1
  7627.         RECALL    SetDrMd
  7628.         moveq    #2,d0
  7629.         add.b    bleft(a4),d0
  7630.         move.w    cposy(a4),d1
  7631.         move.l    a2,a1
  7632.         RECALL    Move
  7633.         lea    inputbuffer(a4),a0
  7634.         move.w    ibufferlen(a4),d0
  7635.         ext.l    d0
  7636.         move.w    colms(a4),d1
  7637.         sub.w    bottomin(a4),d1
  7638.         cmp.w    d1,d0
  7639.         bmi.s    1$
  7640.         move.w    d1,d0
  7641. 1$        move.w    d0,d2
  7642.         move.l    a2,a1
  7643.         RECALL    Text
  7644.         tst.w    bottomin(a4)
  7645.         bne.s    3$
  7646.         move.w    edline(a4),d0
  7647.         bsr    findline
  7648.         move.w    12(a5),d3
  7649.         sub.w    d2,d3
  7650.         bmi.s    3$
  7651.         move.w    colms(a4),d1
  7652.         sub.w    d2,d1
  7653.         bmi.s    2$
  7654.         cmp.w    d1,d3
  7655.         ble.s    4$
  7656.         move.w    d1,d3
  7657. 4$        move.w    d3,d0
  7658.         lea    14(a5,d2.w),a0
  7659.         move.l    a2,a1
  7660.         RECALL    Text
  7661.         add.w    ibufferlen(a4),d3
  7662.         move.w    d3,d2
  7663. 3$        move.w    colms(a4),d0
  7664.         sub.w    bottomin(a4),d0
  7665.         move.l    blanks(a4),a0
  7666.         ext.l    d0
  7667.         sub.w    d2,d0
  7668.         bmi.s    2$
  7669.         lea    0(a0,d2.w),a0
  7670.         move.l    a2,a1
  7671.         RECALL    Text
  7672. 2$        bsr.s    putcursor
  7673.         movem.l    (sp)+,a2/a6
  7674.         rts
  7675.  
  7676. clrcursor    moveq    #1,d7
  7677.         bra.s    ptc1
  7678. putcursor    moveq    #6,d7
  7679. ptc1        move.w    curpos(a4),d0
  7680.         move.w    colms(a4),d1
  7681.         subq.w    #1,d1
  7682.         sub.w    bottomin(a4),d1
  7683.         cmp.w    d0,d1
  7684.         bmi.s    1$
  7685.         move.l    d7,d0
  7686.         move.l    rastport(a4),a1
  7687.         CALL    SetDrMd,gfxbase(a4)
  7688.         moveq    #0,d0
  7689.         move.w    curpos(a4),d0
  7690.         mulu    txwidth(a4),d0
  7691.         moveq    #2,d1
  7692.         add.b    bleft(a4),d1
  7693.         add.w    d1,d0
  7694.         move.w    cposy(a4),d1
  7695.         move.l    rastport(a4),a1
  7696.         RECALL    Move
  7697.         moveq    #1,d0
  7698.         lea    oneblank(a4),a0
  7699.         move.l    rastport(a4),a1
  7700.         RECALL    Text
  7701. 1$        rts
  7702.  
  7703. putiline    movem.l    d2/d3/a2,-(sp)
  7704.         move.l    rastport(a4),a2
  7705.         move.l    wnptr(a4),a5
  7706.         move.l    gfxbase(a4),a6
  7707.         move.w    10(a5),d2
  7708.         move.w    txheight(a4),d0
  7709.         sub.w    d0,d2
  7710.         lsr.w    #1,d0
  7711.         sub.w    d0,d2            ; -FontHeight*1.5
  7712.         moveq    #0,d0
  7713.         move.b    57(a5),d0
  7714.         sub.w    d0,d2
  7715.         moveq    #1,d0
  7716.         move.l    a2,a1
  7717.         RECALL    SetDrMd
  7718.         moveq    #1,d0
  7719.         moveq    #0,d3            ; counter
  7720.         tst.b    ownscreen(a4)
  7721.         bne.s    2$
  7722.         tst.b    post_V34(a4)
  7723.         beq.s    2$
  7724.         moveq    #1,d3            ; counter
  7725. 2$        move.l    a2,a1
  7726.         RECALL    SetAPen
  7727.         moveq    #0,d0
  7728.         add.b    54(a5),d0
  7729.         move.w    d2,d1
  7730.         move.l    a2,a1
  7731.         RECALL    Move
  7732.         move.w    8(a5),d0
  7733.         tst.b    post_V34(a4)
  7734.         beq.s    1$            ; to the end
  7735.         moveq    #0,d1
  7736.         move.b    56(a5),d1
  7737.         sub.w    d1,d0
  7738. 1$        move.w    d2,d1
  7739.         move.l    a2,a1
  7740.         RECALL    Draw
  7741.         subq.w    #1,d2
  7742.         moveq    #2,d0
  7743.         dbra    d3,2$
  7744.         movem.l    (sp)+,d2/d3/a2
  7745.         rts
  7746.  
  7747. readline    moveq    #'n',d0
  7748.         tst.l    infile(a4)
  7749.         bne.s    1$
  7750.         move.l    #31000,firstline(a4)
  7751.         bsr    blastout
  7752.         st    getanswer(a4)
  7753.         bsr    replyintui
  7754. 5$        bsr    processmsgs
  7755.         move.w    d0,d5
  7756.         bsr    replyintui
  7757.         subq.w    #1,d5
  7758.         beq.s    5$
  7759.         clr.b    getanswer(a4)
  7760.         bsr.s    RestoreOutput
  7761.         moveq    #$20,d0
  7762.         or.b    inputbuffer(a4),d0        ; lower case
  7763. 1$        rts
  7764.  
  7765. ResumeOutput    move.l    outchain(a4),d0
  7766.         move.l    d0,a1
  7767.         beq.s    2$
  7768.         move.l    numlines(a4),oldnumlines(a4)
  7769.         move.l    firstline(a4),oldfirstline(a4)
  7770. 4$        tst.l    0(a1)
  7771.         beq.s    3$
  7772.         move.l    0(a1),a1
  7773.         bra.s    4$
  7774. 3$        move.l    a1,lastprinted(a4)
  7775. 2$        move.l    a1,oldpageend(a4)
  7776.         rts
  7777.  
  7778. RestoreOutput    move.l    oldpageend(a4),d3
  7779.         beq.s    1$
  7780.         move.l    oldnumlines(a4),numlines(a4)
  7781.         move.l    oldfirstline(a4),firstline(a4)
  7782.         move.l    oldlastprinted(a4),lastprinted(a4)
  7783.         move.l    d3,a1
  7784.         move.l    0(a1),a1
  7785.         bsr    killlines
  7786.         move.l    d3,a1
  7787.         clr.l    0(a1)
  7788.         bsr.s    blastout
  7789. 1$        rts
  7790.  
  7791. ;kill the remainder of the output buffer
  7792. killlines    move.l    (a1),-(sp)
  7793.         moveq    #14,d0
  7794.         add.w    12(a1),d0
  7795.         CALL    FreeMem,sysbase(a4)
  7796.         move.l    (sp)+,d1
  7797.         move.l    d1,a1
  7798.         bne.s    killlines
  7799.         rts
  7800.  
  7801. ;Kill output buffer
  7802. killpage    movem.l    d0-d7/a0-a6,-(sp)
  7803.         tst.l    outchain(a4)
  7804.         beq.s    2$
  7805.         move.l    outchain(a4),a1
  7806.         bsr.s    killlines
  7807.         clr.l    outchain(a4)
  7808.         clr.l    lastprinted(a4)
  7809.         clr.l    numlines(a4)
  7810.         clr.w    maxllength(a4)
  7811. 2$        movem.l    (sp)+,d0-d7/a0-a6
  7812.         rts
  7813.  
  7814. ;write a portion of the output buffer to the screen
  7815. blastout    move.l    rastport(a4),a1
  7816.         moveq    #1,d0
  7817.         CALL    SetAPen,gfxbase(a4)
  7818.         move.l    rastport(a4),a1
  7819.         moveq    #1,d0
  7820.         CALL    SetDrMd,gfxbase(a4)
  7821.         moveq    #0,d7
  7822.  
  7823.         move.w    loffset(a4),d2
  7824.         beq.s    7$
  7825.         move.w    colms(a4),d4
  7826.         add.w    d4,d2
  7827.         move.w    maxllength(a4),d3
  7828.         cmp.w    d3,d2
  7829.         ble.s    7$
  7830.         move.w    d3,d2
  7831.         sub.w    d4,d2
  7832.         bpl.s    8$
  7833.         moveq    #0,d2
  7834. 8$        move.w    d2,loffset(a4)
  7835.  
  7836. 7$        bsr.s    tstfirstlin
  7837.  
  7838. 1$        tst.l    outchain(a4)
  7839.         beq.s    3$
  7840.         bsr.s    findline
  7841.  
  7842. 2$        move.w    colms(a4),d5
  7843.         ext.l    d5
  7844.         move.w    loffset(a4),d4
  7845.         ext.l    d4
  7846.         move.w    firstpos(a4),d6        ; BarHeight+FontHeight !
  7847.  
  7848. 6$        lea    14(a5,d4.w),a0
  7849.         move.w    12(a5),d3
  7850.         ext.l    d3
  7851.         bsr.s    blastline
  7852.         blt.s    9$
  7853.         move.w    rows(a4),currenty(a4)
  7854.         bra.s    5$
  7855. 9$        tst.l    0(a5)
  7856.         beq.s    5$
  7857.         move.l    0(a5),a5
  7858.         bra.s    6$
  7859. 5$        cmp.w    rows(a4),d7
  7860.         bcc.s    3$
  7861. 10$        moveq    #0,d3
  7862.         bsr.s    blastline
  7863.         bcs.s    10$
  7864. 3$        st    propupdate(a4)
  7865.         rts
  7866.  
  7867. ;get a pointer to a line  (line # in d0)
  7868. findline    move.l    outchain(a4),d1
  7869.         beq.s    2$
  7870.         move.l    d1,a5
  7871. 1$        tst.w    d0
  7872.         beq.s    2$
  7873.         tst.l    0(a5)
  7874.         beq.s    2$
  7875.         move.l    0(a5),a5
  7876.         dbra    d0,1$
  7877. 2$        rts
  7878.  
  7879. ;check if the display is as 'full' as possible
  7880. tstfirstlin    move.l    firstline(a4),d0
  7881.         move.l    d0,d2
  7882.         add.w    rows(a4),d2
  7883.         cmp.l    numlines(a4),d2
  7884.         bmi.s    1$
  7885.         move.l    numlines(a4),d2
  7886.         sub.w    rows(a4),d2
  7887.         bpl.s    4$
  7888.         moveq    #0,d2
  7889. 4$        move.l    d2,d0
  7890.         move.l    d2,firstline(a4)
  7891. 1$        rts
  7892.  
  7893. ;display one line, fill the gap between the end of the line and
  7894. ;the end of the window with spaces.
  7895. ;d6=ypos, d5=colms, d3=linelength, d7=line # in window, a0=text
  7896.  
  7897. blastline    move.l    gfxbase(a4),a6
  7898.         moveq    #2,d0
  7899.         add.b    bleft(a4),d0
  7900.         move.w    d6,d1
  7901.         move.l    rastport(a4),a1
  7902.         RECALL    Move
  7903.         sub.w    d4,d3
  7904.         bpl.s    7$
  7905.         moveq    #0,d3
  7906.         bra.s    6$
  7907. 7$        cmp.w    d5,d3
  7908.         bmi.s    4$
  7909.         move.w    d5,d3
  7910. 4$        move.l    d3,d0
  7911.         beq.s    6$
  7912.         move.l    rastport(a4),a1
  7913.         RECALL    Text
  7914. 6$        move.l    d5,d0
  7915.         sub.l    d3,d0
  7916.         ble.s    5$
  7917.         move.l    blanks(a4),a0
  7918.         move.l    rastport(a4),a1
  7919.         RECALL    Text
  7920. 5$        add.w    txheight(a4),d6
  7921.         addq.w    #1,d7
  7922.         cmp.w    rows(a4),d7
  7923.         rts
  7924.  
  7925. addline        movem.l    d0-d6/a0-a3,-(sp)
  7926.         move.l    gfxbase(a4),a6
  7927.         move.l    rastport(a4),a1
  7928.         moveq    #1,d0
  7929.         RECALL    SetAPen
  7930.         move.l    rastport(a4),a1
  7931.         moveq    #1,d0
  7932.         RECALL    SetDrMd
  7933.         move.w    currenty(a4),d6
  7934.         cmp.w    rows(a4),d6
  7935.         bmi.s    1$
  7936.         bsr.s    cls
  7937. 1$        moveq    #0,d7
  7938.         move.w    currenty(a4),d7
  7939.         move.l    d7,d6
  7940.         mulu    txheight(a4),d6
  7941.         add.w    firstpos(a4),d6        ; BarHeight+FontHeight !
  7942.         move.w    colms(a4),d5
  7943.         moveq    #0,d4
  7944.         move.l    lastprinted(a4),a0
  7945.         move.w    12(a0),d3
  7946.         lea    14(a0),a0
  7947.         bsr    blastline
  7948.         addq.w    #1,currenty(a4)
  7949.         move.l    #31000,firstline(a4)
  7950.         movem.l    (sp)+,d0-d6/a0-a3
  7951.         rts
  7952.  
  7953. cls        movem.l d0-d6/a0-a3,-(sp)
  7954.         move.l    gfxbase(a4),a6
  7955.         moveq    #1,d0
  7956.         move.l    rastport(a4),a1
  7957.         RECALL    SetAPen
  7958.         moveq    #1,d0
  7959.         move.l    rastport(a4),a1
  7960.         RECALL    SetDrMd
  7961.         move.w    colms(a4),d5
  7962.         moveq    #0,d2
  7963. 1$        move.w    d5,d7
  7964.         move.l    d2,d6
  7965.         mulu    txheight(a4),d6
  7966.         add.w    firstpos(a4),d6        ; BarHeight+FontHeight !
  7967.         moveq    #0,d3
  7968.         move.l    blanks(a4),a0
  7969.         bsr    blastline
  7970.         addq.w    #1,d2
  7971.         cmp.w    rows(a4),d2
  7972.         bcs.s    1$
  7973.         clr.w    currenty(a4)
  7974.         movem.l    (sp)+,d0-d6/a0-a3
  7975.         rts
  7976.  
  7977. createscreen    lea    buffer(a4),a2
  7978.         moveq    #80,d0
  7979.         moveq    #1,d1
  7980.         move.l    a2,a0
  7981.         sub.l    a1,a1
  7982.         RECALL    GetScreenData
  7983.         move.w    12(a2),nssize(a4)    ; width
  7984.         move.w    76(a2),nsviewmode(a4)
  7985.         tst.b    post_V34(a4)
  7986.         beq.s    1$
  7987.         suba.l    a0,a0            ; examine default pubscreen
  7988.         RECALL    LockPubScreen
  7989.         move.l    d0,a2
  7990.         move.l    a2,d0
  7991.         beq.s    1$
  7992.         move.l    a6,-(sp)
  7993.         lea    44(a2),a0
  7994.         CALL    GetVPModeID,gfxbase(a4)    ; for DisplayID !
  7995.         move.l    (sp)+,a6
  7996.         move.l    d0,nsdisplay+4(a4)
  7997.         suba.l    a0,a0
  7998.         move.l    a2,a1
  7999.         RECALL    UnlockPubScreen
  8000. 1$        lea    newscreen(a4),a0    ; Kick 2.0+ with ens_Extension
  8001.         RECALL    OpenScreen
  8002.         move.l    d0,screenptr(a4)
  8003.         move.l    d0,nwscreen(a4)
  8004.         beq.s    setupwindow
  8005.         move.l    d0,a0
  8006.         clr.l    newwindow(a4)
  8007.         move.l    12(a0),newwindow+4(a4)
  8008.         move.l    wnscrflags(a4),nwflgs(a4)
  8009.         move.l    wnscrflags+4(a4),nwflgs+4(a4)
  8010.         move.w    #$f,nwtype(a4)
  8011.         st    ownscreen(a4)
  8012.         tst.b    post_V34(a4)
  8013.         beq.s    setupwindow
  8014.         moveq    #0,d0
  8015.         RECALL    PubScreenStatus        ; make screen public
  8016.  
  8017. setupwindow    tst.b    ownscreen(a4)
  8018.         bne.s    3$            ; don't setup wb window values
  8019.         move.l    window_l(a4),newwindow(a4)
  8020.         move.l    window_w(a4),newwindow+4(a4)
  8021.         move.l    wnnormflgs(a4),nwflgs(a4)
  8022.         move.l    wnnormflgs+4(a4),nwflgs+4(a4)
  8023.         move.w    #1,nwtype(a4)
  8024. 3$        lea    newwindow(a4),a0
  8025.         RECALL    OpenWindow        ; Kick 2.0+ with enw_Extension
  8026.         move.l    d0,wnptr(a4)
  8027.         beq    stopall            ; no window !!!
  8028.         move.l    d0,a0
  8029.         move.l    50(a0),rastport(a4)    ; wn->RPort
  8030.         move.l    86(a0),a1        ; wn->UserPort
  8031.         move.b    15(a1),d1        ; MsgPort->SigBit
  8032.         ext.w    d1
  8033.         move.w    d1,intuisig(a4)
  8034.  
  8035.         tst.b    ownscreen(a4)
  8036.         bne.s    2$
  8037.         tst.b    iconifyon(a4)
  8038.         beq.s    2$
  8039.         tst.b    post_V34(a4)
  8040.         bne.s    2$
  8041.         lea    iconifgad(a4),a1    ; a0 - still wnptr !
  8042.         moveq    #0,d0
  8043.         RECALL    AddGadget
  8044.  
  8045. 2$        bsr    setwintitle
  8046.         bsr.s    setreqfont        ; set requested font
  8047.         moveq    #0,d0
  8048.         bsr.s    setnewprop
  8049.  
  8050.         move.l    wnptr(a4),a0
  8051.         move.l    46(a0),a0        ; our scr ptr
  8052.         cmp.l    60(a6),a0        ; ib_FirstScreen
  8053.         beq.s    1$            ; our screen is frontmost
  8054.         RECALL    ScreenToFront
  8055.  
  8056. 1$        bsr    getcurpos
  8057.         bsr    putiline
  8058.         bsr    UpdateIArea
  8059.         bsr    starttimer
  8060.         bsr    showwhat
  8061.         rts
  8062.  
  8063. setnewprop    tst.b    propgadon(a4)        ; resize propgadget !
  8064.         beq.s    1$
  8065.         move.l    wnptr(a4),a0
  8066.         lea    sbgadget(a4),a1
  8067.         tst.w    d0
  8068.         beq.s    2$
  8069.         movem.l    a0/a1,-(sp)
  8070.         RECALL    RemoveGadget        ; remove gadget from window
  8071.         movem.l    (sp)+,a0/a1
  8072. 2$        move.w    txheight(a4),d0
  8073.         move.w    firstpos(a4),d1 
  8074.         sub.w    d0,d1            ; barheight:=firstpos-txheight
  8075.         addq.w    #1,d1
  8076.         move.w    d1,6(a1)        ; topedge
  8077.         add.w    d0,d1
  8078.         lsr.w    #1,d0
  8079.         add.b    57(a0),d0
  8080.         add.w    d0,d1            ; +FontHeight*1.5
  8081.         neg.w    d1
  8082.         move.w    d1,10(a1)        ; height
  8083.         moveq    #0,d0
  8084.         RECALL    AddGadget
  8085. 1$        move.l    wnptr(a4),a0
  8086.         jmp    _LVORefreshWindowFrame(a6)
  8087.  
  8088. setreqfont    move.l    a6,-(sp)
  8089.         move.l    gfxbase(a4),a6
  8090.         move.l    154(a6),d0        ; GfxBase->DefaultFont
  8091.         tst.b    ownfont(a4)
  8092.         beq.s    2$
  8093.         move.l    tfont(a4),d0
  8094.         bne.s    2$            ; already one open !
  8095.         lea    tattr(a4),a0
  8096.         RECALL    OpenFont        ; open topaz/8
  8097.         move.l    d0,tfont(a4)
  8098.         beq.s    1$            ; no font ...
  8099. 2$        move.l    d0,a0
  8100.         move.l    rastport(a4),a1
  8101.         RECALL    SetFont
  8102.         move.l    wnptr(a4),a0
  8103.         move.l    46(a0),a1        ; Window->Screen
  8104.         move.b    30(a1),d1        ; Screen->BarHeight
  8105.         ext.w    d1
  8106.         move.b    54(a0),bleft(a4)
  8107.         move.l    50(a0),a1        ; Window->RastPort
  8108.         move.w    58(a1),txheight(a4)
  8109.         move.w    60(a1),txwidth(a4)
  8110.         add.w    txheight(a4),d1
  8111.         move.w    d1,firstpos(a4)
  8112.         bsr.s    getwindowsize
  8113. 1$        move.l    (sp)+,a6
  8114.         rts
  8115.  
  8116. getwindowsize    bsr.s    freeblank
  8117.  
  8118.         move.l    wnptr(a4),a0
  8119.         move.w    10(a0),d0
  8120.         move.w    txheight(a4),d1
  8121.         lsr.w    #1,d1            ; FontHeight*0.5
  8122.         add.b    57(a0),d1
  8123.         sub.w    d1,d0
  8124.         move.w    d0,ipos(a4)        ; input area position
  8125.  
  8126.         moveq    #0,d6
  8127.         move.w    10(a0),d6
  8128.         sub.w    firstpos(a4),d6
  8129.         sub.w    txheight(a4),d6
  8130.         divu    txheight(a4),d6
  8131.         move.w    d6,rows(a4)
  8132.  
  8133.         moveq    #0,d6
  8134.         move.w    txwidth(a4),d6
  8135.         move.w    d6,d0
  8136.         lsr.w    #1,d0
  8137.         add.w    d0,d6
  8138.         not.w    d6            ; -FontWidth*1.5
  8139.         add.w    8(a0),d6
  8140.         moveq    #0,d1
  8141.         tst.b    post_V34(a4)        ; why ???
  8142.         beq.s    4$
  8143.         moveq    #1,d1
  8144. 4$        sub.w    d1,d6
  8145.         divu    txwidth(a4),d6
  8146.         tst.b    propgadon(a4)
  8147.         beq.s    3$
  8148.         addq.w    #1,d1
  8149. 3$        sub.w    d1,d6
  8150.         move.w    d6,colms(a4)
  8151.  
  8152.         ext.l    d6
  8153.         move.l    d6,d0
  8154.         moveq    #0,d1
  8155.         CALL    AllocMem,sysbase(a4)
  8156.         move.l    d0,blanks(a4)
  8157.         move.l    d0,a0
  8158.         moveq    #' ',d0
  8159.         bra.s    1$
  8160. 2$        move.b    d0,(a0)+
  8161. 1$        dbra    d6,2$
  8162.         rts
  8163.  
  8164. freeblank    move.l    blanks(a4),d0
  8165.         beq.s    1$
  8166.         move.l    d0,a1
  8167.         move.w    colms(a4),d0
  8168.         ext.l    d0
  8169.         CALL    FreeMem,sysbase(a4)
  8170.         clr.l    blanks(a4)
  8171. 1$        rts
  8172.  
  8173. setwintitle    lea    winkeybuf(a4),a3    ; show hotkey in window title
  8174.         lea    defhotkey(a4),a2
  8175.         move.l    broker(a4),d0
  8176.         beq.s    2$            ; no commodity !
  8177.         move.l    d0,a0
  8178.         moveq    #0,d0
  8179.         tst.b    cxstate(a4)
  8180.         beq.s    4$            ; commodity off
  8181.         moveq    #1,d0
  8182.         lea    hotkeybuf(a4),a2
  8183. 4$        CALL    ActivateCxObj,cxbase(a4)
  8184. 3$        move.l    (a2),d1
  8185.         and.l    #$dfdfdfdf,d1
  8186.         cmp.l    #'RAWK',d1
  8187.         bne.s    2$            ; not rawkey as ieclass
  8188.         addq.l    #7,a2            ; skip ieclass (hopefully)
  8189. 2$        move.l    a2,-(sp)
  8190.         pea    windowname(a4)
  8191.         move.l    sp,a1
  8192.         lea    namefmt(a4),a0
  8193.         lea    sc_put(pc),a2
  8194.         CALL    RawDoFmt,sysbase(a4)    ; fill buffer
  8195.         addq.l    #8,sp
  8196.         move.l    wnptr(a4),a0
  8197.         move.l    a3,a1
  8198.         movea.w    #-1,a2
  8199.         tst.b    ownscreen(a4)
  8200.         beq.s    1$            ; don't change scr title
  8201.         suba.l    a1,a1
  8202.         move.l    a3,a2
  8203. 1$        move.l    intuibase(a4),a6
  8204.         jmp    _LVOSetWindowTitles(a6)    ; leave with intuibase in a6 !
  8205.  
  8206. sc_put        move.b    d0,(a3)+        ; for RawDoFmt()
  8207.         rts
  8208.  
  8209. usetopaz    lea    ownfont(a4),a2
  8210.         bsr    onoff
  8211.         tst.l    infile(a4)
  8212.         bne.s    usetopaz-2        ; hack !
  8213. usetopaz2    bsr    setreqfont
  8214.         bra    setupscreen        ; rebuild all
  8215.  
  8216. usescreen    tst.b    ownscreen(a4)
  8217.         bne.s    1$
  8218.         tst.l    infile(a4)
  8219.         bne.s    2$
  8220.         moveq    #0,d0
  8221.         bsr.s    CloseGUI        ; close window
  8222.         bra    createscreen
  8223. 2$        st    ownscreen(a4)
  8224. 1$        rts
  8225.  
  8226. usewindow    tst.b    ownscreen(a4)
  8227.         beq.s    1$
  8228.         tst.l   infile(a4)
  8229.         bne.s    2$
  8230.         st    wantwindow(a4)
  8231.         moveq    #0,d0
  8232.         bsr.s    CloseGUI        ; close window & screen
  8233.         beq.s    1$            ; pubscreen still used
  8234.         clr.b    wantwindow(a4)
  8235. 2$        clr.b    ownscreen(a4)
  8236.         tst.l   infile(a4)
  8237.         bne.s    1$
  8238.         bsr    setupwindow        ; open our window
  8239. 1$        rts
  8240.  
  8241. CloseGUI    move.l    d0,d2
  8242.         bsr    replyintui        ; answer msg
  8243.         move.l    intuibase(a4),a6
  8244.         tst.b    ownscreen(a4)
  8245.         beq.s    5$
  8246.         bsr.s    SetPubStatus
  8247.         beq.s    1$            ; pubscreen still used
  8248. 5$        move.l    wnptr(a4),d0
  8249.         beq.s    3$
  8250.         move.l    d0,a0
  8251.         tst.b    ownscreen(a4)
  8252.         bne.s    4$
  8253.         move.l    minwsize(a4),d0
  8254.         cmp.w    10(a0),d0
  8255.         bgt.s    4$
  8256.         swap    d0
  8257.         cmp.w    8(a0),d0
  8258.         beq.s    4$
  8259.         move.l    4(a0),window_l(a4)
  8260.         move.l    8(a0),window_w(a4)
  8261. 4$        RECALL    CloseWindow
  8262.         clr.l    wnptr(a4)
  8263. 3$        move.l    screenptr(a4),d0
  8264.         beq.s    2$
  8265.         move.l    d0,a0
  8266.         RECALL    CloseScreen
  8267.         clr.l    screenptr(a4)
  8268. 2$        tst.l    d2
  8269.         beq.s    6$            ; don't close font
  8270.         move.l    tfont(a4),d1
  8271.         beq.s    6$            ; no own font opened !
  8272.         move.l    d1,a1
  8273.         move.l    a6,-(sp)
  8274.         CALL    CloseFont,gfxbase(a4)
  8275.         move.l    (sp)+,a6
  8276.         clr.l    tfont(a4)
  8277. 6$        moveq    #1,d0
  8278. 1$        rts
  8279.  
  8280. SetPubStatus    moveq    #1,d0
  8281.         tst.b    post_V34(a4)        ; no Kick 2.0+
  8282.         beq.s    1$
  8283.         move.l    screenptr(a4),d1
  8284.         beq.s    1$
  8285.         move.l    d1,a0            ; d0 - already one !!!
  8286.         move.l    intuibase(a4),a6
  8287.         RECALL    PubScreenStatus        ; make screen private
  8288.         tst.l    d0
  8289.         bne.s    1$
  8290.         tst.b    waitexit(a4)
  8291.         beq.s    1$            ; don't wait
  8292.         moveq    #0,d0
  8293.         move.w    nspubsig+6(a4),d1
  8294.         bset    d1,d0
  8295.         CALL    Wait,sysbase(a4)    ; wait until last win closed
  8296.         bra.s    SetPubStatus
  8297. 1$        tst.l    d0
  8298.         rts
  8299.  
  8300. ; support functions
  8301.  
  8302. CreatePort    movem.l    d2-d4/a2/a6,-(sp)
  8303.         move.l    d0,d2            ; port-pri
  8304.         move.l    a0,d3            ; portname
  8305.         moveq    #-1,d0
  8306.         CALL    AllocSignal,sysbase(a4)
  8307.         move.l    d0,d4
  8308.         addq.l    #1,d0
  8309.         beq.s    crp4
  8310.         moveq    #34,d0
  8311.         moveq    #1,d1
  8312.         swap    d1
  8313.         RECALL    AllocMem
  8314.         movea.l    d0,a2
  8315.         move.l    a2,d0
  8316.         bne.s    crp1
  8317.         move.l    d4,d0
  8318.         RECALL    FreeSignal
  8319.         bra.s    crp3
  8320. crp1        move.b    #4,8(a2)        ; mp_Node.ln_Type=NT_MSGPORT
  8321.         move.b    d2,9(a2)        ; mp_Node.ln_Pri
  8322.         move.l    d3,10(a2)        ; mp_Node.ln_Name
  8323.         move.b    d4,15(a2)        ; mp_SigBit
  8324.         move.l    mytask(a4),16(a2)    ; mp_SigTask
  8325.         tst.l    d3
  8326.         beq.s    crp2
  8327.         movea.l    a2,a1
  8328.         RECALL    AddPort
  8329.         bra.s    crp3
  8330. crp2        lea     20(a2),a0        ; mp_MsgList
  8331.         move.l    a0,(a0)            ; mp_MsgList.Node.ln_Head
  8332.         addq.l    #4,(a0)
  8333.         move.l    a0,8(a0)        ; mp_MsgList.Node.ln_Pred
  8334. crp3        move.l    a2,d0            ; MsgPort
  8335. crp4        movem.l    (sp)+,d2-d4/a2/a6
  8336.         rts
  8337.  
  8338. DeletePort    move.l    a2,-(sp)
  8339.         move.l    sysbase(a4),a6
  8340.         movea.l    d0,a2            ; port
  8341.         tst.l    10(a2)
  8342.         beq.s    dep1
  8343.         movea.l    a2,a1
  8344.         RECALL    RemPort
  8345. dep1        moveq    #-1,d0            ; Port unbrauchbar
  8346.         move.b    d0,8(a2)        ; machen
  8347.         move.l    d0,20(a2)
  8348.         moveq    #0,d0
  8349.         move.b    15(a2),d0
  8350.         RECALL    FreeSignal
  8351.         movea.l    a2,a1
  8352.         moveq    #34,d0
  8353.         RECALL    FreeMem
  8354.         move.l    (sp)+,a2
  8355.         rts
  8356.  
  8357. CreateStdIO    move.l    d2,-(sp)
  8358.         move.l    d0,d2            ; reply-port
  8359.         beq.s    csio1
  8360.         moveq    #48,d0
  8361.         moveq    #1,d1
  8362.         swap    d1
  8363.         CALL    AllocMem,sysbase(a4)
  8364.         movea.l    d0,a0
  8365.         move.l    a0,d0
  8366.         beq.s    csio1
  8367.         move.b    #5,8(a0)        ; NT_MESSAGE
  8368.         move.l    d2,14(a0)        ; ReplyPort
  8369. csio1        move.l    (sp)+,d2
  8370.         rts
  8371.  
  8372. DeleteStdIO    movea.l    d0,a1            ; io-block
  8373.         moveq    #48,d1
  8374.         moveq    #-1,d0
  8375.         move.b    d0,8(a1)
  8376.         move.l    d0,20(a1)
  8377.         move.l    d0,24(a1)
  8378.         move.l    d1,d0
  8379.         CALL    FreeMem,sysbase(a4)
  8380.         rts
  8381.  
  8382. CreateTask    movem.l    d2-d5/a2/a3/a6,-(sp)
  8383.         lea    -32(sp),sp
  8384.         addq.l    #3,d0
  8385.         moveq    #-4,d2
  8386.         and.l    d0,d2            ; stack adjusted
  8387.         move.l    d1,d3            ; pri
  8388.         move.l    a0,d4            ; name
  8389.         move.l    a1,d5            ; code
  8390.         lea    MemList(pc),a0
  8391.         move.l    sp,a1
  8392.         moveq    #6,d0
  8393. crt1        move.l    (a0)+,(a1)+        ; copy memlist
  8394.         dbra    d0,crt1
  8395.         move.l    d2,(a1)
  8396.         move.l    sp,a0
  8397.         CALL    AllocEntry,sysbase(a4)    ; alloc memory
  8398.         movea.l    d0,a2
  8399.         move.l    a2,d0
  8400.         beq.s    crt2
  8401.         movea.l    16(a2),a3
  8402.         move.b    #1,8(a3)        ; ln_Type
  8403.         move.b    d3,9(a3)        ; ln_Pri
  8404.         move.l    d4,10(a3)        ; ln_Name
  8405.         move.l    24(a2),d0
  8406.         add.l    d0,d2
  8407.         move.l    d2,54(a3)        ; tc_SPReg
  8408.         move.l    d0,58(a3)        ; tc_SPLower
  8409.         move.l    d2,62(a3)        ; tc_SPUpper
  8410.         lea    74(a3),a0        ; tc_MemList
  8411.         move.l    a0,(a0)
  8412.         addq.l    #4,(a0)
  8413.         move.l    a0,8(a0)
  8414.         movea.l    a2,a1
  8415.         RECALL    AddHead            ; store memlist
  8416.         movea.l    a3,a1
  8417.         move.l    a1,d3
  8418.         movea.l    d5,a2
  8419.         suba.l    a3,a3
  8420.         RECALL    AddTask            ; start task
  8421.         move.l    d3,d0
  8422. crt2        lea    32(sp),sp
  8423.         movem.l    (sp)+,d2-d5/a2/a3/a6
  8424.         rts
  8425.  
  8426. MemList        dc.l    0,0            ; Succ,Pred
  8427.         dc.b    0,0            ; Pri,Type
  8428.         dc.l    0            ; Name
  8429.         dc.w    2            ; NumEntries
  8430.         dc.l    $10001            ; MemType
  8431.         dc.l    92            ; Length
  8432.         dc.l    $10001            ; MemType
  8433. ;        dc.l    0            ; Length
  8434.  
  8435. killidle    bra.s    killidle
  8436.  
  8437.         cnop    0,4
  8438.  
  8439. ; data area
  8440.  
  8441. StpList        dc.l    *+4            ; frozen tasks list
  8442.         dc.l    0
  8443.         dc.l    StpList
  8444.  
  8445. FKeys        dc.l    *+4            ; function keys list
  8446.         dc.l    0
  8447.         dc.l    FKeys
  8448.  
  8449. History        dc.l    *+4            ; history lines list
  8450.         dc.l    0
  8451.         dc.l    History
  8452. CurHist        dc.l    0
  8453.  
  8454. NewBroker    dc.b    5,0            ; nb_Version, pad
  8455.         dc.l    NewName            ; nb_Name
  8456.         dc.l    WindowName        ; nb_Title
  8457.         dc.l    Description        ; nb_Descr
  8458.         dc.w    1+2            ; nb_Unique = NBU_UNIQUE!NBU_NOTIFY
  8459.         dc.w    4            ; nb_Flags = COF_SHOW_HIDE
  8460.         dc.b    0,0             ; nb_Pri, pad
  8461.         dc.l    0            ; nb_Port
  8462.         dc.w    0            ; nb_ReservedChannel
  8463.  
  8464. InInterrupt    dc.l    0            ; ln_Succ
  8465.         dc.l    0            ; ln_Pred
  8466.         dc.b    2            ; ln_Type
  8467.         dc.b    60            ; ln_Pri
  8468.         dc.l    XopSleep        ; ln_Name
  8469.         dc.l    0            ; is_Data
  8470.         dc.l    keyhandler        ; is_Code()
  8471.  
  8472. IoCounter    dc.l    0            ; ln_Succ
  8473.         dc.l    0            ; ln_Pred
  8474.         dc.b    2            ; ln_Type
  8475.         dc.b    -1            ; ln_Pri
  8476.         dc.l    IOcntName        ; ln_Name
  8477.         dc.l    0            ; is_Data
  8478.         dc.l    countio            ; is_Code()
  8479.  
  8480. TAttr        dc.l    FontName
  8481.         dc.w    8
  8482.         dc.b    0,0
  8483.  
  8484. Window_l    dc.w    0
  8485. Window_t    dc.w    0
  8486. Window_w    dc.w    550
  8487. Window_h    dc.w    200
  8488.  
  8489. WnNormFlgs    dc.l    $676
  8490.         dc.l    $5104f            ; $4000 - WFLG_NW_EXTENDED
  8491.  
  8492. WnScrFlags    dc.l    $474
  8493.         dc.l    $31940
  8494.  
  8495. NewWindow    dc.w    0,0,0,0
  8496.         dc.b    0,1
  8497. NwFlgs        dc.l    0
  8498.         dc.l    0
  8499.         dc.l    0
  8500.         dc.l    0
  8501.         dc.l    0            ; title
  8502. NwScreen    dc.l    0
  8503.         dc.l    0
  8504. MinWSize    dc.w    110,50
  8505.         dc.w    -1,-1
  8506. NwType        dc.w    0
  8507.         dc.l    NewWinTags        ; APTR enw_Extension
  8508.  
  8509. NewWinTags    dc.l    $80000090,1        ; WA_AutoAdjust,TRUE
  8510.         dc.l    0
  8511.  
  8512. NewScreen    dc.w    0,0
  8513. NsSize        dc.w    0,-1            ; ???,STDSCREENHEIGHT
  8514.         dc.w    1
  8515.         dc.b    0
  8516.         dc.b    1
  8517. NsViewMode    dc.w    0
  8518.         dc.w    $101f            ; $1000 - NS_EXTENDED
  8519.         dc.l    0
  8520.         dc.l    0            ; title
  8521.         dc.l    0,0
  8522.         dc.l    NewScrTags        ; APTR ens_Extension
  8523.  
  8524. NewScrTags    dc.l    $80000023,$ffffffff    ; SA_Width,STDSCREENWIDTH
  8525. NsAScroll    dc.l    $80000039,1        ; SA_AutoScroll,TRUE
  8526. NsDisplay    dc.l    $80000032,0        ; SA_DisplayID
  8527. NsPubName    dc.l    $8000002f,NewName    ; SA_PubName
  8528. NsPubSig    dc.l    $80000030,0        ; SA_PubSig
  8529. NsPubTask    dc.l    $80000031,0        ; SA_PubTask
  8530.          dc.l    0            ; TAG_DONE
  8531.  
  8532. IcnWindow    dc.w    40,170,72,28        ; sleep window
  8533.         dc.b    0,1
  8534.         dc.l    $20,$10800
  8535.         dc.l    Gadget,0,0,0,0
  8536.         dc.w    72,28,72,28
  8537.         dc.w    1
  8538.  
  8539. AppObj        dc.w    0,0            ; contains gadget
  8540.  
  8541. Gadget        dc.l    0
  8542.         dc.w    0,0,72,28,4,2,$20
  8543.         dc.l    Image
  8544.         dc.l    0,0,0,0
  8545.         dc.w    0
  8546.         dc.l    0
  8547.  
  8548.         dc.w    0
  8549.         dc.l    0,0
  8550.         dc.l    $80000000,$80000000
  8551.         dc.l    0,0,0
  8552.  
  8553. Image        dc.w    0,0,72,28
  8554.         dc.w    2
  8555.         dc.l    ImageData
  8556.         dc.b    3,0
  8557.         dc.l    0
  8558.  
  8559. IconifGad    dc.l    0            ; zip gadget for Kick 1.3
  8560.         dc.w    -83,0
  8561.         dc.w    31,10
  8562.         dc.w    $14,$41,1
  8563.         dc.l    IconImg
  8564.         dc.l    0,0,0,0
  8565.         dc.w    0
  8566.         dc.l    0
  8567. IconImg        dc.w    0,0,31,10
  8568.         dc.w    2
  8569.         dc.l    IconifData
  8570.         dc.b    3,0
  8571.         dc.l    0
  8572.  
  8573. SBGadget    dc.l    0            ; prop gadget
  8574.         dc.w    -14,11
  8575.         dc.w    14,-22
  8576.         dc.w    $10|$40
  8577.         dc.w    1|2|8|16
  8578.         dc.w    3
  8579.         dc.l    SBData,0,0,0,PropInfo
  8580.         dc.w    3
  8581.         dc.l    0
  8582. PropInfo    dc.w    1|4
  8583.         dc.w    0,0
  8584.         dc.w    -1,-1
  8585.         dc.w    0,0,0,0,0,0
  8586. SBData        dc.l    0,0,0,0
  8587.  
  8588. HexTab        dc.b    '0123456789abcdef'
  8589.  
  8590. Params        dc.b    'tfdlrempiscua'
  8591. parmnum        equ    *-Params
  8592. .parmnum    dc.b    0
  8593.  
  8594. cmdnum        set    0
  8595. Commds         ADDCMD    'time'            ; all commands we know
  8596.         ADDCMD    'taskpri'
  8597.         ADDCMD    'info'
  8598.         ADDCMD    'pri'
  8599.         ADDCMD    'flush'
  8600.         ADDCMD    'freeze'
  8601.         ADDCMD    'warm'
  8602.         ADDCMD    'signal'
  8603.         ADDCMD    'break'
  8604.         ADDCMD    'alert'
  8605.         ADDCMD    'lastalert'
  8606.         ADDCMD    'hold'
  8607.         ADDCMD    'exit'
  8608.         ADDCMD    'clear'
  8609.         ADDCMD    'cancel'
  8610.         ADDCMD    'taskports'
  8611.         ADDCMD    'hunks'
  8612.         ADDCMD    'devices'
  8613.         ADDCMD    'openlib'
  8614.         ADDCMD    'closelib'
  8615.         ADDCMD    'currentdir'
  8616.         ADDCMD    'cd'
  8617.         ADDCMD    'mypri'
  8618.         ADDCMD    'files'
  8619.         ADDCMD    'locks'
  8620.         ADDCMD    'unlock'
  8621.         ADDCMD    'screens'
  8622.         ADDCMD    'windows'
  8623.         ADDCMD    'closescreen'
  8624.         ADDCMD    'closewindow'
  8625.         ADDCMD    'fonts'
  8626.         ADDCMD    'windowfonts'
  8627.         ADDCMD    'lockdrive'
  8628.         ADDCMD    'freedrive'
  8629.         ADDCMD    'capture'
  8630.         ADDCMD    'clrcold'
  8631.         ADDCMD    'clrcool'
  8632.         ADDCMD    'clrwarm'
  8633.         ADDCMD    'snoopmem'
  8634.         ADDCMD    'usage'
  8635.         ADDCMD    'inputhandler'
  8636.         ADDCMD    'header'
  8637.         ADDCMD    'sort'
  8638.         ADDCMD    'hide'
  8639.         ADDCMD    'hidden'
  8640.         ADDCMD    'window'
  8641.         ADDCMD    'kill'
  8642.         ADDCMD    'iconify'
  8643.         ADDCMD    'historylines'
  8644.         ADDCMD    'minimumchars'
  8645.         ADDCMD    'showhistory'
  8646.         ADDCMD    'repeat'
  8647.         ADDCMD    'remresident'
  8648.         ADDCMD    'saveoutput'
  8649.         ADDCMD    'killhistory'
  8650.         ADDCMD    'backdropicon'
  8651.         ADDCMD    'setfont'
  8652.         ADDCMD    'trapguru'
  8653.         ADDCMD    'outputlines'
  8654.         ADDCMD    'usescreen'
  8655.         ADDCMD    'usewindow'
  8656.         ADDCMD    'usetopaz'
  8657.         ADDCMD    'timerio'
  8658.         ADDCMD    'diskchange'
  8659.         ADDCMD    'alias'
  8660.         ADDCMD    'remnode'
  8661.         ADDCMD    'setfkey'
  8662.         ADDCMD    'clicmd'
  8663.         ADDCMD    'taskinfo'
  8664.         ADDCMD    'coldreboot'
  8665.         ADDCMD    'reboot'
  8666.         ADDCMD    'zerotimer'
  8667.         ADDCMD    'propgad'
  8668.         ADDCMD    'iconpos'
  8669.         ADDCMD    'remport'
  8670.         ADDCMD    'remintserver'
  8671.         ADDCMD    'frags'
  8672.         ADDCMD    'traceopen'
  8673.         ADDCMD    'tracelock'
  8674.         ADDCMD    'cxhandler'
  8675.         ADDCMD    'popkey'
  8676.         ADDCMD    'pubscreens'
  8677.         ADDCMD    'smartpatch'
  8678.  
  8679.         IFNE    ((tasktime-cmdaddr)/4)-cmdnum
  8680.         ERROR    !! COMMAND NAME OR JUMP VECTOR MISSING !!
  8681.         ENDIF
  8682.  
  8683. NewName        dc.b    'Xoper',0
  8684. XopCon        dc.b    'XopPackets',0
  8685. XopSleep    dc.b    'Xop-A-A-x',0
  8686. MemPortName    dc.b    'SnoopPort',0
  8687. IOcntName    dc.b    'Xop-I/O-Counter',0
  8688. KidleName    dc.b    'Xop-Idle-Killer',0
  8689. NameFmt        dc.b    '%s - <PopKey=%s>',0
  8690.         even                ; important for mc68000 !
  8691. DefHotkey    dc.b    'lcommand rcommand x',0
  8692.         dc.b    '$VER:'
  8693. WindowName    dc.b    'Xoper 2.4 ',$a9,' 1991 by Werner G',$fc,'nther',0
  8694. Description    dc.b    'A very powerful system monitor',0
  8695.  
  8696. T2Header    dc.b    '   ID     STATE  SIGALLOC SIGWAIT  SIGRECVD    PC    FPU  TASKNAME',0
  8697. T3Header    dc.b    '   ID     STATE  SIGALLOC SIGWAIT  SIGRECVD    PC    TASKNAME',0
  8698. T4Header    dc.b    '   ID     STATE    RUNNING    ACTIVE   NUM TASKNAME',0
  8699. THeader        dc.b    '   ID     TYPE      STATE   PRI  CPUSE NUM TASKNAME',0
  8700. LHeader        dc.b    '  NODE   CNT VER REV  FLAGS    ',0
  8701. LibNam        dc.b    'LIBRARY NAME',0
  8702. DevNam        dc.b    'DEVICE NAME',0
  8703. ResNam        dc.b    'RESOURCE NAME',0
  8704. MHeader        dc.b    ' LOWER    UPPER     FREE   ATTR  PRI HUNK NAME',0
  8705. IHeader        dc.b    '  NODE     DATA     CODE    PRI T S   TYPE     INTERRUPT NAME',0
  8706. InHeader    dc.b    '  NODE     DATA     CODE    PRI NAME',0
  8707. RHeader        dc.b    '  ADDR    PRI  FLAGS    VER   TYPE    RESIDENT NAME',0
  8708. PHeader        dc.b    '  NODE   PORTNAME         FLAGS SIGBT NUM SIGTASK',0
  8709. HunkHeader    dc.b    ' NUM  BCPL    DATA     LENGTH',0
  8710. DDHeader    dc.b    'DEVICE    HDS SECTORS  TRACKS BUFFERS STATE    HANDLER',0
  8711. CDHeader    dc.b    'PROCESSNAME          CURRENT DIRECTORY',0
  8712. OFHeader    dc.b    '  LOCK   ACCESS    SIZE  PATH/FILENAME',0
  8713. ScrHeader    dc.b    'NUM   ADDR      SIZE   DPTH TITLE',0
  8714. MonitorID    dc.b    '    MonitorID: $',0
  8715. PScrHeader    dc.b    '  NODE   SCREENNAME         STATE CNT SBT SIGTASK',0
  8716. WnHeader    dc.b    ' ADDR    OWNERTASK     X    Y     SIZE    TITLE',0
  8717. FoHead        dc.b    '  NODE   CNT  Y   X  TYPE        LO  HI NAME',0
  8718. KickHead    dc.b    'START    END      LENGTH',0
  8719. SnoopHead    dc.b    'ACTION          REQUIREMENTS               LENGTH    FROM      TO     CALLER',0
  8720. StackHead    dc.b    'SPLower     SIZE    USED TASKNAME',0
  8721. CliComHead    dc.b    '   ID     STATE   TYPE MODE NUM PROCESSNAME       COMMAND',0
  8722. TioHead        dc.b    'IORQUEST  UNIT      SECS    REQUESTING TASK',0
  8723. DCHead        dc.b    '  NODE     DATA     CODE   UNIT TASK',0
  8724. ALHead        dc.b    'ALIAS NAME        COMMAND',0
  8725. SemHead        dc.b    '  NODE   OWNER         QUEUE NEST NAME',0
  8726. FragHead    dc.b    'HEX   SIZE   DEC    COUNT  LARGEST',0
  8727. FKHead        dc.b    'KEY  STRING',0
  8728. FilesHead    dc.b    '   TASK      HANDLE   MODE  FILENAME',0
  8729. TDDrives    dc.b    'DF : ',0
  8730. UnitMsg        dc.b    ' (Unit # )',0
  8731. TimerUnits    dc.b    'MicroHz ',0
  8732.         dc.b    'VBlank  ',0
  8733. FMode        dc.b    '  R/W  ',0
  8734. Access        dc.b    ' Read  ',0
  8735.         dc.b    ' Write ',0
  8736. RomFnt        dc.b    'Rom  ',0
  8737. DiskFnt        dc.b    'Disk ',0
  8738. FFixed        dc.b    'Fixed ',0
  8739. FProp        dc.b    'Propl ',0
  8740. Status        dc.b    'Added   ',0
  8741.         dc.b    'Running ',0
  8742.         dc.b    'Ready   ',0
  8743.         dc.b    'Waiting ',0
  8744.         dc.b    'Exeption',0
  8745.         dc.b    'Removed ',0
  8746.         dc.b    'Frozen  ',0
  8747.         dc.b    'Frozen  ',0
  8748. Type        dc.b    'Unknown   ',0
  8749. TaskType    dc.b    'Task      ',0
  8750.         dc.b    'Interrupt ',0
  8751.         dc.b    'Device    ',0
  8752.         dc.b    'Msgport   ',0
  8753.         dc.b    'Message   ',0
  8754.         dc.b    'Freemsg   ',0
  8755.         dc.b    'Replymsg  ',0
  8756.         dc.b    'Resource  ',0
  8757.         dc.b    'Library   ',0
  8758.         dc.b    'Memory    ',0
  8759. SoftIntType    dc.b    'Softint   ',0
  8760.         dc.b    'Font      ',0
  8761. ProcType    dc.b    'Process   ',0
  8762.         dc.b    'Semaphore ',0
  8763. Mp_Flags    dc.b    'Signal  ',0
  8764.         dc.b    'Softint ',0
  8765.         dc.b    'Ignore  ',0
  8766. PScr_State    dc.b    '  Public ',0
  8767.         dc.b    ' Private ',0
  8768. Infoh2        dc.b    'Dispat/Sec:',0
  8769. Infoh1        dc.b    'CPU:',0
  8770. Infoh3        dc.b    'CPU activity: ',0
  8771. Infoh6        dc.b    'Total:',0
  8772. Infoh4        dc.b    '% ',0
  8773. Infoh7        dc.b    'I/O Ints/Sec: ',0
  8774. CPU0        dc.b    '68000',0
  8775. CPU1        dc.b    '68010',0
  8776. CPU2        dc.b    '68020',0
  8777. CPU3        dc.b    '68030',0
  8778. CPU4        dc.b    '68040',0
  8779. CPU5        dc.b    '/68881',0
  8780. CPU6        dc.b    '/68882',0
  8781. NoFPU        dc.b    '---- ',0
  8782. NullState    dc.b    'NULL ',0
  8783. Idle        dc.b    'IDLE ',0
  8784. Busy        dc.b    'BUSY ',0
  8785. WeissNicht    dc.b    '???? ',0
  8786. DevLoad        dc.b    'loaded   ',0
  8787. DevnLoad    dc.b    'unloaded ',0
  8788. IntEn        dc.b    'E ',0
  8789. IntDis         dc.b    'D ',0
  8790. IntServ        dc.b    'S ',0
  8791. IntHand        dc.b    'H ',0
  8792. NotFile        dc.b    '--- ------- ------- ------- ',0
  8793. LongNix        dc.b    '-'
  8794. SmallNix    dc.b    '----'
  8795. Nix        dc.b    '--- ',0
  8796. NoInfo        dc.b    'No Info on'
  8797. OneBlank    dc.b    ' ',0
  8798. Equal        dc.b    '=  ',0
  8799. OpenBrak    dc.b    '[ ',0
  8800. CloseBrak    dc.b    ' ]',0
  8801. NamErr        dc.b    'Unable to find ',0
  8802. FontErr        dc.b    "Can't open ",0
  8803. AdrErr        dc.b    'Address Error!',0
  8804. AliasErr    dc.b    'Single character alias names using "',0
  8805. AliasErr2    dc.b    '"',10,'are not allowed.',0
  8806. NoWorkbench    dc.b    "Workbench isn't active !",0
  8807. OpenErr        dc.b    'Could not open file ',0
  8808. ListErr        dc.b    'Unable to find ListHeader. Sort aborted.',0
  8809. WiwErr        dc.b    'Script file only',0
  8810. GuruTxt        dc.b    'Guru Meditation #',0
  8811. ClrTxt        dc.b    'Memory Hunks cleared.',0
  8812. CanErr0        dc.b    'Process is not a CLI-task',10
  8813.         dc.b    'Has it been started from Workbench ? (Y/N)',10,0
  8814. CanErr1        dc.b    'Process was created by CreateProc()',10
  8815.         dc.b    'Shall I UnLoad() ? (Y/N)',10,0
  8816. UnloadErr    dc.b    "Arrrgh.. can't find segments, aborting",0
  8817. NoProcs        dc.b    'Not a Process.',0
  8818. NotLoad        dc.b    'No program loaded.',0
  8819. CliProcs    dc.b    'CLI-Process',0
  8820. ProcLoaded    dc.b    'Loaded as a command: ',0
  8821. SegLoaded    dc.b    'Created by CreateProc()',0
  8822. ColdTxt        dc.b    'Cold Capture: ',0
  8823. CoolTxt        dc.b    'Cool Capture: ',0
  8824. WarmTxt        dc.b    'Warm Capture: ',0
  8825. KickTxt        dc.b    'KickMem     : ',0
  8826. Unset        dc.b    'unset',0
  8827. IntNames    dc.b    'Serial Out ',0
  8828.         dc.b    'Disk Block ',0
  8829.         dc.b    'SoftInt    ',0
  8830.         dc.b    'Ports      ',0
  8831.         dc.b    'Coper      ',0
  8832.         dc.b    'Vert.Blank ',0
  8833.         dc.b    'Blitter    ',0
  8834.         dc.b    'Audio Ch.0 ',0
  8835.         dc.b    'Audio Ch.1 ',0
  8836.         dc.b    'Audio Ch.2 ',0
  8837.         dc.b    'Audio Ch.3 ',0
  8838.         dc.b    'Serial In  ',0
  8839.         dc.b    'Disk Sync  ',0
  8840.         dc.b    'External   ',0
  8841.         dc.b    'SoftInt    ',0
  8842.         dc.b    'NMI        ',0
  8843. IntTyp        dc.b    0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1
  8844. MemNoExp    dc.b    'NOEXP ',0
  8845. MemRev        dc.b    'REV ',0
  8846. MemLarg        dc.b    'LARGEST ',0
  8847. MemClr        dc.b    'CLEAR ',0
  8848. MemKick        dc.b    'KICK ',0
  8849. MemDMA        dc.b    '24BIT ',0
  8850. MemLoc        dc.b    'LOCAL ',0
  8851. MemFast        dc.b    'FAST ',0
  8852. MemChip        dc.b    'CHIP ',0
  8853. MemPubl        dc.b    'PUBLIC ',0
  8854. Failed        dc.b    'Failed !',0
  8855. AllOk        dc.b    'ALLOC: ',0
  8856. Free        dc.b    'FREE: ',0
  8857. Backg        dc.b    'Bckg ',0
  8858. Foreg        dc.b    'Frgr ',0
  8859. Script        dc.b    'Batch ',0
  8860. Interact    dc.b    'Intct ',0
  8861. NameErr        dc.b    'Name or address is missing.',10
  8862. SynErr        dc.b    'Syntax Error, type "?" for help'
  8863. CR        dc.b    10,0
  8864. Dnotf        dc.b    'Directory not found',0
  8865. NotDir        dc.b    'Not a directory',0
  8866. NoMount        dc.b    ' not mounted.',0
  8867. DisHelp        dc.b    10,'Names are case sensitive and followed by a ":"',0
  8868. UnlErr        dc.b    'Lock not found',0
  8869. Unl1        dc.b    'Lock is on ',0
  8870. UnlTxt        dc.b    'Old lock was: ',0
  8871. UnlTxt2        dc.b    'Unlock ? (Y/N)',10,0
  8872. ScNoFound    dc.b    'Screen not found.',0
  8873. WinNoFound    dc.b    'Window not found.',0
  8874. StpErr        dc.b    'Task must be "READY" or "WAITING"',10,0
  8875. WaErr        dc.b    'Task must be "FROZEN"',10,0
  8876. WhatsThis    dc.b    '???.?',0
  8877. TooMuch        dc.b    '??? ',0
  8878. TimeNotSet    dc.b    ' disabled.',0
  8879. WhatTime    dc.b    'Refresh time in secs:',0
  8880. Stopped        dc.b    '<Break>',0
  8881. CapExited    dc.b    'Task ended',0
  8882. CapWait        dc.b    'Waiting for startup...',0
  8883. OnScr        dc.b    'On Screen: ',0
  8884. WhatNow        dc.b    'Kill, ignore (K/I)?',0
  8885. NoGuru        dc.b    'None found.',0
  8886. SoftFail    dc.b    'Software failure!',10,'Task: ',0
  8887. AddrsErr    dc.b    'Bad aligned address was: ',0
  8888. ProCount    dc.b    'PC: ',0
  8889. MemTyp        dc.b    'Memory type: ',0
  8890. NintrServ    dc.b    "Not a server. Can't restore vectors",0
  8891. OnStr        dc.b    'on',0
  8892. OffStr        dc.b    'off',0
  8893. UseTxt        dc.b    'DISPLAY:',10
  8894.         dc.b    '[T]asks    task[F]lags   [L]ibraries  [D]evices    [R]esources',10
  8895.         dc.b    'r[E]sident [M]emory      [P]orts      [I]nterrupts [S]tack',10
  8896.         dc.b    '[C]litasks task[U]sage   sem[A]phores [Q]uit',10,10
  8897.         dc.b    'OTHER SYSTEM LISTS:',10
  8898.         dc.b    'Windows   Screens  PubScreens  WindowFonts   Fonts',10
  8899.         dc.b    'Capture   TimerIO  DiskChange  InputHandler  Frags',10
  8900.         dc.b    'Devices   Files    Locks       CurrentDir    TraceOpen',10
  8901.         dc.b    'TraceLock',10,10
  8902.         dc.b    'COMMANDS:',10
  8903.         dc.b    'Time         <secs>',10
  8904.         dc.b    'Mypri        <priority>',10
  8905.         dc.b    'Taskpri      <priority>  [processnum] <taskname>',10
  8906.         dc.b    'Signal       <mask(hex)> [processnum] <taskname>',10
  8907.         dc.b    'Break        [processnum] <taskname>',10
  8908.         dc.b    'Freeze|Warm  [processnum] <taskname>',10
  8909.         dc.b    'Kill/Cancel  [processnum] <taskname>',10
  8910.         dc.b    'SnoopMem     [processnum] <taskname>',10
  8911.         dc.b    'ZeroTimer    [processnum] <taskname>',10
  8912.         dc.b    'Hide         <taskname>',10
  8913.         dc.b    'Pri          <priority> <nodename>',10
  8914.         dc.b    'Info         <name>',10
  8915.         dc.b    'RemNode      <node address>',10
  8916.         dc.b    'RemPort      <port address>',10
  8917.         dc.b    'RemResident  <resident module name>',10
  8918.         dc.b    'RemIntServer <interrupt address>',10
  8919.         dc.b    'Clear        <longword(hex)>',10
  8920.         dc.b    'Hunks        [processnum] <procname>',10
  8921.         dc.b    'CD           <directory> [processnum] <procname>',10
  8922.         dc.b    'UnLock       <lock>',10
  8923.         dc.b    'OpenLib    | Closelib <libraryname>',10
  8924.         dc.b    'CloseWindow| Closescreen <title>',10
  8925.         dc.b    'SetFont      [size] <fontname> <windowtitle>',10
  8926.         dc.b    'LockDrive  | Freedrive   <drivename:>',10
  8927.         dc.b    'Window       <leftedge topedge width height> (scriptfile only) ',10
  8928.         dc.b    'IconPos      <leftedge topedge>',10
  8929.         dc.b    'OutputLines  <maximum # of lines>',10
  8930.         dc.b    'HistoryLines <maximum # of lines>',10
  8931.         dc.b    'MinimumChars <minimum # of characters>',10
  8932.         dc.b    'SaveOutput   <filename>',10
  8933.         dc.b    'PopKey       <description>',10
  8934.         dc.b    'Repeat       <Command line>',10
  8935.         dc.b    'SetFKey      <number> <string>',10
  8936.         dc.b    'Alias        [<aliasname> <commandname>]',10,10
  8937.         dc.b    'COMMANDS WITHOUT PARAMETERS:',10
  8938.         dc.b    'Alert      LastAlert ClrCool       ClrCold      ClrWarm',10
  8939.         dc.b    'TrapGuru   Flush     ColdReboot    Reboot',10,10
  8940.         dc.b    'OPTIONS:',10
  8941.         dc.b    'Sort       CLICmd    TaskInfo      TaskPorts    Hidden',10
  8942.         dc.b    'Usage      Header    UseScreen     UseWindow    UseTopaz',10
  8943.         dc.b    'PropGad    Iconify   BackDropIcon  ShowHistory  KillHistory',10
  8944.         dc.b    'SmartPatch CxHandler Hold          Exit',0
  8945. GfxName        dc.b    'graphics.library',0
  8946. IntName        dc.b    'intuition.library',0
  8947. CxName        dc.b    'commodities.library',0
  8948. WbName        dc.b    'workbench.library',0
  8949. DiskFont    dc.b    'diskfont.library',0
  8950. TdName        dc.b    'trackdisk.device',0
  8951. ConName        dc.b    'console.device',0
  8952. DeviceNam    dc.b    'input.device',0
  8953. TimerNam    dc.b    'timer.device',0
  8954. FontName    dc.b    'topaz.font',0
  8955. WbPortNam    dc.b    'Workbench',0
  8956.     IFND DEBUG
  8957. StartupName    dc.b    'ENV:Xoper.Startup',0
  8958.     ENDC
  8959.     IFD DEBUG
  8960. StartupName    dc.b    'ENV:Test.Startup',0
  8961.     ENDC
  8962.  
  8963.         cnop    0,4
  8964.  
  8965. dataarea
  8966.  
  8967. DosTable    equ    _DosTable-dataarea
  8968. StrCmp        equ    strcmp-dataarea
  8969. GetNum        equ    getnum-dataarea
  8970.  
  8971. stplist        equ    StpList-dataarea
  8972. fkeys        equ    FKeys-dataarea
  8973. history        equ    History-dataarea
  8974. curhist        equ    CurHist-dataarea
  8975.  
  8976. newbroker    equ    NewBroker-dataarea
  8977. ininterrupt    equ    InInterrupt-dataarea
  8978. iocounter    equ    IoCounter-dataarea
  8979. tattr        equ    TAttr-dataarea
  8980. window_l    equ    Window_l-dataarea
  8981. window_t    equ    Window_t-dataarea
  8982. window_w    equ    Window_w-dataarea
  8983. window_h    equ    Window_h-dataarea
  8984. wnnormflgs    equ    WnNormFlgs-dataarea
  8985. wnscrflags    equ    WnScrFlags-dataarea
  8986. newwindow    equ    NewWindow-dataarea
  8987. nwflgs        equ    NwFlgs-dataarea
  8988. nwscreen    equ    NwScreen-dataarea
  8989. minwsize    equ    MinWSize-dataarea
  8990. nwtype        equ    NwType-dataarea
  8991. newscreen    equ    NewScreen-dataarea
  8992. nssize        equ    NsSize-dataarea
  8993. nsviewmode    equ    NsViewMode-dataarea
  8994. newscrtags    equ    NewScrTags-dataarea
  8995. nsdisplay    equ    NsDisplay-dataarea
  8996. nspubname    equ    NsPubName-dataarea
  8997. nspubsig    equ    NsPubSig-dataarea
  8998. nspubtask    equ    NsPubTask-dataarea
  8999.  
  9000. icnwindow    equ    IcnWindow-dataarea
  9001. appobj        equ    AppObj-dataarea
  9002. gadget        equ    Gadget-dataarea
  9003. image        equ    Image-dataarea
  9004. iconifgad    equ    IconifGad-dataarea
  9005. iconimg        equ    IconImg-dataarea
  9006.  
  9007. sbgadget    equ    SBGadget-dataarea
  9008. propinfo    equ    PropInfo-dataarea
  9009. sbdata        equ    SBData-dataarea
  9010.  
  9011. hextab        equ    HexTab-dataarea
  9012.  
  9013. params        equ    Params-dataarea
  9014.  
  9015. commds        equ    Commds-dataarea
  9016. newname        equ    NewName-dataarea
  9017. xopcon        equ    XopCon-dataarea
  9018. xopsleep    equ    XopSleep-dataarea
  9019. memportname    equ    MemPortName-dataarea
  9020. IOcntname    equ    IOcntName-dataarea
  9021. kidlename    equ    KidleName-dataarea
  9022. namefmt        equ    NameFmt-dataarea
  9023. defhotkey    equ    DefHotkey-dataarea
  9024. windowname    equ    WindowName-dataarea
  9025. description    equ    Description-dataarea
  9026.  
  9027. t2header    equ    T2Header-dataarea
  9028. t3header    equ    T3Header-dataarea
  9029. t4header    equ    T4Header-dataarea
  9030. theader        equ    THeader-dataarea
  9031. lheader        equ    LHeader-dataarea
  9032. libnam        equ    LibNam-dataarea
  9033. devnam        equ    DevNam-dataarea
  9034. resnam        equ    ResNam-dataarea
  9035. mheader        equ    MHeader-dataarea
  9036. iheader        equ    IHeader-dataarea
  9037. inheader    equ    InHeader-dataarea
  9038. rheader        equ    RHeader-dataarea
  9039. pheader        equ    PHeader-dataarea
  9040. hunkheader    equ    HunkHeader-dataarea
  9041. ddheader    equ    DDHeader-dataarea
  9042. cdheader    equ    CDHeader-dataarea
  9043. ofheader    equ    OFHeader-dataarea
  9044. scrheader    equ    ScrHeader-dataarea
  9045. monitorid    equ    MonitorID-dataarea
  9046. pscrheader    equ    PScrHeader-dataarea
  9047. wnheader    equ    WnHeader-dataarea
  9048. fohead        equ    FoHead-dataarea
  9049. kickhead    equ    KickHead-dataarea
  9050. snoophead    equ    SnoopHead-dataarea
  9051. stackhead    equ    StackHead-dataarea
  9052. clicomhead    equ    CliComHead-dataarea
  9053. tiohead        equ    TioHead-dataarea
  9054. dchead        equ    DCHead-dataarea
  9055. alhead        equ    ALHead-dataarea
  9056. semhead        equ    SemHead-dataarea
  9057. fraghead    equ    FragHead-dataarea
  9058. fkhead        equ    FKHead-dataarea
  9059. fileshead    equ    FilesHead-dataarea
  9060. tddrives    equ    TDDrives-dataarea
  9061. unitmsg        equ    UnitMsg-dataarea
  9062. timerunits    equ    TimerUnits-dataarea
  9063. fmode        equ    FMode-dataarea
  9064. access        equ    Access-dataarea
  9065. romfnt        equ    RomFnt-dataarea
  9066. diskfnt        equ    DiskFnt-dataarea
  9067. ffixed        equ    FFixed-dataarea
  9068. fprop        equ    FProp-dataarea
  9069. status        equ    Status-dataarea
  9070. type        equ    Type-dataarea
  9071. tasktype    equ    TaskType-dataarea
  9072. softinttype    equ    SoftIntType-dataarea
  9073. proctype    equ    ProcType-dataarea
  9074. mp_flags    equ    Mp_Flags-dataarea
  9075. pscr_state    equ    PScr_State-dataarea
  9076. infoh2        equ    Infoh2-dataarea
  9077. infoh1        equ    Infoh1-dataarea
  9078. infoh3        equ    Infoh3-dataarea
  9079. infoh6        equ    Infoh6-dataarea
  9080. infoh4        equ    Infoh4-dataarea
  9081. infoh7        equ    Infoh7-dataarea
  9082. cpu0        equ    CPU0-dataarea
  9083. cpu1        equ    CPU1-dataarea
  9084. cpu2        equ    CPU2-dataarea
  9085. cpu3        equ    CPU3-dataarea
  9086. cpu4        equ    CPU4-dataarea
  9087. cpu5        equ    CPU5-dataarea
  9088. cpu6        equ    CPU6-dataarea
  9089. nofpu        equ    NoFPU-dataarea
  9090. nullstate    equ    NullState-dataarea
  9091. idle        equ    Idle-dataarea
  9092. busy        equ    Busy-dataarea
  9093. weissnicht    equ    WeissNicht-dataarea
  9094. devload        equ    DevLoad-dataarea
  9095. devnload    equ    DevnLoad-dataarea
  9096. inten        equ    IntEn-dataarea
  9097. intdis        equ    IntDis-dataarea
  9098. intserv        equ    IntServ-dataarea
  9099. inthand        equ    IntHand-dataarea
  9100. notfile        equ    NotFile-dataarea
  9101. longnix        equ    LongNix-dataarea
  9102. smallnix    equ    SmallNix-dataarea
  9103. nix        equ    Nix-dataarea
  9104. noinfo        equ    NoInfo-dataarea
  9105. oneblank    equ    OneBlank-dataarea
  9106. equal        equ    Equal-dataarea
  9107. openbrak    equ    OpenBrak-dataarea
  9108. closebrak    equ    CloseBrak-dataarea
  9109. namerr        equ    NameErr-dataarea
  9110. fonterr        equ    FontErr-dataarea
  9111. adrerr        equ    AdrErr-dataarea
  9112. aliaserr    equ    AliasErr-dataarea
  9113. aliaserr2    equ    AliasErr2-dataarea
  9114. noworkbench    equ    NoWorkbench-dataarea
  9115. openerr        equ    OpenErr-dataarea
  9116. listerr        equ    ListErr-dataarea
  9117. wiwerr        equ    WiwErr-dataarea
  9118. gurutxt        equ    GuruTxt-dataarea
  9119. clrtxt        equ    ClrTxt-dataarea
  9120. canerr0        equ    CanErr0-dataarea
  9121. canerr1        equ    CanErr1-dataarea
  9122. unloaderr    equ    UnloadErr-dataarea
  9123. noprocs        equ    NoProcs-dataarea
  9124. notload        equ    NotLoad-dataarea
  9125. cliprocs    equ    CliProcs-dataarea
  9126. procloaded    equ    ProcLoaded-dataarea
  9127. segloaded    equ    SegLoaded-dataarea
  9128. coldtxt        equ    ColdTxt-dataarea
  9129. cooltxt        equ    CoolTxt-dataarea
  9130. warmtxt        equ    WarmTxt-dataarea
  9131. kicktxt        equ    KickTxt-dataarea
  9132. unset        equ    Unset-dataarea
  9133. intnames    equ    IntNames-dataarea
  9134. inttyp        equ    IntTyp-dataarea
  9135.  
  9136. memnoexp    equ    MemNoExp-dataarea
  9137. memrev        equ    MemRev-dataarea
  9138. memlarg        equ    MemLarg-dataarea
  9139. memclr        equ    MemClr-dataarea
  9140. memkick        equ    MemKick-dataarea
  9141. memdma        equ    MemDMA-dataarea
  9142. memloc        equ    MemLoc-dataarea
  9143. memfast        equ    MemFast-dataarea
  9144. memchip        equ    MemChip-dataarea
  9145. mempubl        equ    MemPubl-dataarea
  9146.  
  9147. failed        equ    Failed-dataarea
  9148. allok        equ    AllOk-dataarea
  9149. free        equ    Free-dataarea
  9150. backg        equ    Backg-dataarea
  9151. foreg        equ    Foreg-dataarea
  9152. script        equ    Script-dataarea
  9153. interact    equ    Interact-dataarea
  9154. nameerr        equ    NameErr-dataarea
  9155. synerr        equ    SynErr-dataarea
  9156. cr        equ    CR-dataarea
  9157. dnotf        equ    Dnotf-dataarea
  9158. notdir        equ    NotDir-dataarea
  9159. nomount        equ    NoMount-dataarea
  9160. dishelp        equ    DisHelp-dataarea
  9161. unlerr        equ    UnlErr-dataarea
  9162. unl1        equ    Unl1-dataarea
  9163. unltxt        equ    UnlTxt-dataarea
  9164. unltxt2        equ    UnlTxt2-dataarea
  9165. scnofound    equ    ScNoFound-dataarea
  9166. winnofound    equ    WinNoFound-dataarea
  9167. stperr        equ    StpErr-dataarea
  9168. waerr        equ    WaErr-dataarea
  9169. whatsthis    equ    WhatsThis-dataarea
  9170. toomuch        equ    TooMuch-dataarea
  9171. timenotset    equ    TimeNotSet-dataarea
  9172. whattime    equ    WhatTime-dataarea
  9173. stopped        equ    Stopped-dataarea
  9174. capexited    equ    CapExited-dataarea
  9175. capwait        equ    CapWait-dataarea
  9176. onscr        equ    OnScr-dataarea
  9177. whatnow        equ    WhatNow-dataarea
  9178. noguru        equ    NoGuru-dataarea
  9179. softfail    equ    SoftFail-dataarea
  9180. addrserr    equ    AddrsErr-dataarea
  9181. procount    equ    ProCount-dataarea
  9182. memtyp        equ    MemTyp-dataarea
  9183. nintrserv    equ    NintrServ-dataarea
  9184. onstr        equ    OnStr-dataarea
  9185. offstr        equ    OffStr-dataarea
  9186. usetxt        equ    UseTxt-dataarea
  9187. gfxname        equ    GfxName-dataarea
  9188. intname        equ    IntName-dataarea
  9189. cxname        equ    CxName-dataarea
  9190. wbname        equ    WbName-dataarea
  9191. diskfont    equ    DiskFont-dataarea
  9192. tdname        equ    TdName-dataarea
  9193. conname        equ    ConName-dataarea
  9194. devicenam    equ    DeviceNam-dataarea
  9195. timernam    equ    TimerNam-dataarea
  9196. fontname    equ    FontName-dataarea
  9197. wbportnam    equ    WbPortNam-dataarea
  9198. startupname    equ    StartupName-dataarea
  9199.  
  9200.     IFD DEBUG
  9201.         ds.b    gb_SIZEOF
  9202.     ENDC
  9203.  
  9204.         SECTION Images,DATA,CHIP
  9205.  
  9206. IconifData    dc.w    $7FFF,$FFFC,$601F,$FFFC,$6000,$000C,$607F,$FFCC
  9207.         dc.w    $6060,$00CC,$6067,$FCCC,$7E60,$00CC,$7E7F,$FFCC
  9208.         dc.w    $7E00,$000C,$7FFF,$FFFC,$0000,$0000,$1FE0,$0000
  9209.         dc.w    $1FFF,$FFF0,$1F80,$0030,$1F9F,$FF30,$1F98,$0330
  9210.         dc.w    $019F,$FF30,$0180,$0030,$01FF,$FFF0,$0000,$0000
  9211.  
  9212. ImageData    dc.w    $000F,$FFFF,$FFFF,$FFF8,$0000,$001F,$FFFF,$FFFF
  9213.         dc.w    $FFFC,$0000,$001F,$0000,$0000,$007C,$0000,$001F
  9214.         dc.w    $7FFF,$FFFF,$FF7C,$0000,$001F,$4A46,$0244,$557C
  9215.         dc.w    $0000,$001F,$5108,$D411,$817C,$0000,$001F,$7FFF
  9216.         dc.w    $FFFF,$FF7C,$0000,$001F,$0000,$0000,$007C,$0000
  9217.         dc.w    $001F,$30C0,$0000,$007C,$0000,$001F,$1980,$0000
  9218.         dc.w    $007C,$0000,$001F,$0F0F,$1F0F,$1F7C,$0000,$001F
  9219.         dc.w    $0619,$9999,$997C,$0000,$001F,$0F19,$999F,$987C
  9220.         dc.w    $0000,$001F,$1999,$9F18,$187C,$0000,$001F,$30CF
  9221.         dc.w    $180F,$187C,$0000,$001F,$0000,$1800,$007C,$0000
  9222.         dc.w    $001F,$0000,$0000,$007C,$0000,$001F,$FFFF,$FFFF
  9223.         dc.w    $FFFC,$0000,$000F,$FFFF,$FFFF,$FF18,$0000,$0000
  9224.         dc.w    $0000,$0000,$0000,$0000,$3FFF,$FFFF,$FFFF,$FFFF
  9225.         dc.w    $FC00,$FDFF,$FFFF,$FFFF,$FFFF,$FF00,$EBFF,$FFFF
  9226.         dc.w    $FFFF,$FFFF,$FF00,$F7FF,$FFFF,$FFFF,$F800,$0700
  9227.         dc.w    $FFFF,$FFFF,$FFFF,$FFFF,$FF00,$FFFF,$FFFF,$FFFF
  9228.         dc.w    $FFFF,$FF00,$FFFF,$FFFF,$FFFF,$FFFF,$FF00,$3FFF
  9229.         dc.w    $FFFF,$FFFF,$FFFF,$FC00,$0000,$0000,$0000,$0000
  9230.         dc.w    $0000,$0000,$0000,$0000,$0000,$0000,$0000,$FFFF
  9231.         dc.w    $FFFF,$FF80,$0000,$0000,$FFFF,$FFFF,$FF80,$0000
  9232.         dc.w    $0000,$FFFF,$FFFF,$FF80,$0000,$0000,$FFFF,$FFFF
  9233.         dc.w    $FF80,$0000,$0000,$FFFF,$FFFF,$FF80,$0000,$0000
  9234.         dc.w    $FFFF,$FFFF,$FF80,$0000,$0000,$8000,$0000,$0080
  9235.         dc.w    $0000,$0000,$8000,$0000,$0080,$0000,$0000,$8000
  9236.         dc.w    $0000,$0080,$0000,$0000,$8000,$0000,$0080,$0000
  9237.         dc.w    $0000,$8000,$0000,$0080,$0000,$0000,$8000,$0000
  9238.         dc.w    $0080,$0000,$0000,$8000,$0000,$0080,$0000,$0000
  9239.         dc.w    $8000,$0000,$0080,$0000,$0000,$FFFF,$FFFF,$FF80
  9240.         dc.w    $0000,$0000,$0000,$0000,$00E0,$0000,$0000,$0000
  9241.         dc.w    $0000,$00E0,$0000,$0000,$1FFF,$FFFF,$F800,$0000
  9242.         dc.w    $0000,$0080,$0040,$0000,$0000,$0200,$0080,$0040
  9243.         dc.w    $0000,$0000,$1400,$0080,$0040,$003F,$0000,$0800
  9244.         dc.w    $0080,$0040,$07FF,$F800,$0000,$0080,$0040,$003F
  9245.         dc.w    $0000,$0000,$0080,$0040,$0000,$3800,$FFFF,$FFFF
  9246.         dc.w    $FFFF,$FFFF,$FE00,$0000,$0080,$0040,$0000,$0000
  9247.  
  9248. imagesize    equ    (((*-ImageData)>>2)-1)
  9249.  
  9250.         END
  9251.