home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / debug / Background / DeCon / DeCon.asm < prev    next >
Assembly Source File  |  1995-06-27  |  12KB  |  686 lines

  1. ; New Debug Console (also can be installed as resident module)
  2. ; (c) 1995 Martin Mares, MJSoft System Software
  3.  
  4. ;DEBUG    equ    1
  5. NOSS    equ    1
  6. SYSI    equ    1
  7. LBSIZE    equ    80
  8.  
  9.     ifd    DEBUG
  10.     opt    x+
  11.     endc
  12.  
  13.     include    "ssmac.h"
  14.  
  15.                 ; At offset 0: ExecBase
  16.     ; IT'S DANGEROUS TO CHANGE THESE OFFSETS
  17.     dv.l    oldtaskpri
  18.     dv.l    intuitionbase
  19.     dv.l    thistask
  20.     dv.l    arg_xpos
  21.     dv.l    arg_ypos
  22.     dv.l    arg_width
  23.     dv.l    arg_height
  24.     dv.l    arg_title
  25.     dv.l    arg_screen
  26.     dv.l    window
  27.     dv.l    msgport
  28.     dv.l    iorq
  29.     dv.l    msgport2
  30.     dv.l    iorq2
  31.     dv.l    inbuf        ; Circular buffer holding input data
  32.     dv.l    inbufread
  33.     dv.l    inbufwrite
  34.     dv.l    inbufend
  35.     dv.l    keybuf
  36.     dv.l    keybufend
  37.     dv.l    signal
  38.     dv.l    sigmask
  39.     dv.l    oldRawPutChar
  40.     dv.l    linebwr
  41.     dv.l    dosbase
  42.     dv.l    dosbase2
  43.     dv.l    rdargs
  44.     dbuf    sema4,SS_SIZE
  45.     dbuf    sema5,SS_SIZE
  46.     dbuf    linebuf,LBSIZE
  47.     dv.l    waitingtask
  48.     dv.w    dumpsuccess
  49.     dv.w    stopped
  50.     dv.l    varsize
  51.  
  52. ; MAIN ENTRY POINT (if called from CLI)
  53.  
  54.     ifd    DEBUG
  55.     move.l    4.w,a1
  56.     move.l    ThisTask(a1),a1
  57.     move.l    pr_GlobVec(a1),a2
  58.     endc
  59.  
  60.     push    $204(a2)
  61.     bsr    Main
  62.     pop    a6
  63.     moveq    #0,d0
  64.     move.l    a4,d1
  65.     beq.s    CLIRet
  66.     lea    errfmt(pc),a0
  67.     move.l    a0,d1
  68.     push    a4
  69.     move.l    sp,d2
  70.     call    VPrintf
  71.     addq.l    #4,sp
  72. CLIRet    rts
  73.  
  74. ; RESIDENT TAG
  75.  
  76. STKSIZE    equ    2048        ; 2048 bytes of stack must be sufficient
  77.  
  78. res    dc.w    $4afc
  79.     dc.l    res
  80.     dc.l    endskip
  81.     dc.b    $01        ; flg
  82.     dc.b    2        ; ver
  83.     dc.b    $00        ; type
  84.     dc.b    4        ; pri
  85.     dc.l    winname
  86.     dc.l    idstr
  87.     dc.l    ModStart
  88.  
  89. ModStart    mpush    d7/a2-a3/a6
  90.     move.l    #TC_SIZE+STKSIZE,d0
  91.     moveq    #MEMF_PUBLIC,d1
  92.     call    exec,AllocMem
  93.     tst.l    d0
  94.     bne.s    ModOkay1
  95.     moveq    #1,d7
  96.     swap    d7
  97.     call    Alert
  98.     bra.s    ModDone
  99. ModOkay1    move.l    d0,a1
  100.     move.l    d0,a0
  101.     lea    TC_SIZE(a0),a3
  102.     clr.l    (a0)+
  103.     clr.l    (a0)+
  104.     move.w    #NT_TASK<<8+15,(a0)+
  105.     lea    winname(pc),a2
  106.     move.l    a2,(a0)+
  107.     moveq    #9,d0
  108. 1$    clr.l    (a0)+
  109.     dbf    d0,1$
  110.     lea    STKSIZE(a3),a2
  111.     move.l    a2,(a0)+
  112.     move.l    a3,(a0)+
  113.     move.l    a2,(a0)+
  114.     moveq    #(TC_SIZE-TC_SWITCH)/2-1,d0
  115. 2$    clr.w    (a0)+
  116.     dbf    d0,2$
  117.     lea    ModTaskEntry(pc),a2
  118.     sub.l    a3,a3
  119.     call    AddTask
  120. ModDone    mpop    d7/a2-a3/a6
  121. Return1    rts
  122.  
  123. ModTaskEntry    bsr.s    Main
  124.     move.l    a4,d0
  125.     beq.s    Return1
  126.     move.l    #AN_Unknown+$440000,d7
  127.     move.b    (a4),d7
  128.     jump    exec,Alert
  129.  
  130. ; MAIN PROGRAM
  131.  
  132. Main    moveq    #varsize/4-1,d0
  133. clrvars    clr.l    -(sp)
  134.     dbf    d0,clrvars
  135.     move.l    sp,a5
  136.     move.l    sp,a3            ; A3=var write index
  137.     lea    safeplace(pc),a0
  138.     move.l    a5,(a0)
  139.  
  140.     move.l    4.w,a6
  141.     move.l    a6,(a3)+
  142.  
  143.     move.l    ThisTask(a6),a1
  144.     moveq    #15,d0
  145.     call    SetTaskPri
  146.     move.l    d0,(a3)+
  147.  
  148.     lea    unaop1(pc),a4
  149.     lea    intuiname(pc),a1
  150.     call    OldOpenLibrary
  151.     move.l    d0,(a3)+
  152.     beq    cle1
  153.  
  154.     move.l    ThisTask(a6),a0
  155.     move.l    a0,(a3)+
  156.     cmp.b    #NT_PROCESS,LN_TYPE(a0)
  157.     bne.s    NoCliArgs
  158.     move.l    pr_GlobVec(a0),a2
  159.     move.l    $204(a2),a6
  160.     put.l    a6,dosbase
  161.     lea    templ(pc),a0
  162.     move.l    a0,d1
  163.     move.l    a3,d2
  164.     moveq    #0,d3
  165.     call    ReadArgs
  166.     lea    invarg(pc),a4
  167.     put.l    d0,rdargs
  168.     beq    cle2
  169.  
  170. NoCliArgs    clr.l    -(sp)
  171.     lea    tags(pc),a1
  172.     moveq    #1,d0
  173.     ror.l    #1,d0    ; TAG_USER
  174.     pea    winname(pc)
  175.     move.b    (a1)+,d0
  176.     push    d0
  177. NoCliArgs1    move.b    (a1)+,d0
  178.     beq.s    NoCliArgs2
  179.     move.l    (a3)+,d1
  180.     beq.s    NoCliArgs1
  181.     move.l    d1,a6
  182.     push    (a6)
  183.     push    d0
  184.     bra.s    NoCliArgs1
  185.  
  186. NoCliArgs2    move.b    (a1)+,d0
  187.     beq.s    NoCliArgs3
  188.     move.l    (a3)+,d1
  189.     beq.s    NoCliArgs2
  190.     push    d1
  191.     push    d0
  192.     bra.s    NoCliArgs2
  193.  
  194. NoCliArgs3    pea    (IDCMP_CLOSEWINDOW).w
  195.     move.b    (a1)+,d0
  196.     push    d0
  197.     pea    (WFLG_DRAGBAR+WFLG_DEPTHGADGET+WFLG_SIZEGADGET+WFLG_CLOSEGADGET).w
  198.     move.b    (a1)+,d0
  199.     push    d0
  200.     moveq    #16,d1        ; Window limits: [16,16]--[inf,inf]
  201.     push    d1
  202.     move.b    (a1)+,d0
  203.     push    d0
  204.     push    d1
  205.     addq.b    #1,d0
  206.     push    d0
  207.     moveq    #-1,d1
  208.     push    d1
  209.     addq.b    #1,d0
  210.     push    d0
  211.     push    d1
  212.     addq.b    #1,d0
  213.     push    d0
  214.     move.b    (a1)+,d0    ; REFRESH mode
  215.     push    d1
  216.     push    d0
  217.  
  218.     sub.l    a0,a0
  219.     move.l    sp,a1
  220.     call    intuition,OpenWindowTagList
  221.     move.l    a5,sp
  222.     lea    nowin(pc),a4
  223.     move.l    d0,(a3)+
  224.     beq    cle3
  225.     move.l    d0,a0
  226.     move.l    wd_UserPort(a0),a0
  227.     moveq    #1,d7
  228.     move.b    MP_SIGBIT(a0),d0
  229.     lsl.l    d0,d7
  230.  
  231.     move.l    (v),a6
  232.     lea    outofmem(pc),a4
  233.     call    CreateMsgPort
  234.     move.l    d0,(a3)+
  235.     beq    cle4
  236.     move.l    d0,a0
  237.     moveq    #IOSTD_SIZE,d0
  238.     call    CreateIORequest
  239.     move.l    d0,(a3)+
  240.     beq    cle5
  241.  
  242.     call    CreateMsgPort
  243.     move.l    d0,(a3)+
  244.     beq    cle5a
  245.     move.l    d0,a0
  246.     move.b    MP_SIGBIT(a0),d0
  247.     bset    d0,d7
  248.     moveq    #IOSTD_SIZE,d0
  249.     call    CreateIORequest
  250.     move.l    d0,(a3)+
  251.     beq    cle5b
  252.  
  253.     get.l    iorq,a1
  254.     lea    conname(pc),a0
  255.     get.l    window,IO_DATA(a1)
  256.     moveq    #CONU_SNIPMAP,d0
  257.     moveq    #0,d1
  258.     call    OpenDevice
  259.     lea    unacon(pc),a4
  260.     tst.l    d0
  261.     bne    cle6
  262.     get.l    iorq,a0
  263.     get.l    iorq2,a1
  264.     move.l    IO_DEVICE(a0),IO_DEVICE(a1)
  265.     move.l    IO_UNIT(a0),IO_UNIT(a1)
  266.  
  267.     moveq    #64,d0
  268.     lsl.l    #8,d0            ; Char buffer: 16K
  269.     move.l    #MEMF_PUBLIC+MEMF_CLEAR,d1
  270.     move.l    d0,d2
  271.     call    AllocVec
  272.     lea    outofmem(pc),a4
  273.     move.l    d0,(a3)+
  274.     beq    cle7
  275.     move.l    d0,(a3)+
  276.     move.l    d0,(a3)+
  277.     add.l    d2,d0
  278.     move.l    d0,(a3)+
  279.  
  280.     moveq    #126,d0            ; Key buffer: 126B
  281.     moveq    #MEMF_PUBLIC,d1
  282.     call    AllocVec
  283.     move.l    d0,(a3)+
  284.     beq    cle8
  285.     moveq    #126,d1
  286.     add.l    d0,d1
  287.     move.l    d1,(a3)+
  288.  
  289.     moveq    #-1,d0
  290.     call    AllocSignal
  291.     lea    nosig(pc),a4
  292.     move.l    d0,(a3)+
  293.     bmi    cle8
  294.     moveq    #1,d5            ; D5=sigmask of "ring" signal
  295.     lsl.l    d0,d5
  296.     move.l    d5,(a3)+
  297.     or.l    d5,d7
  298.  
  299.     geta    sema4,a0        ; S4 locks the buffer
  300.     call    InitSemaphore
  301.     geta    sema5,a0        ; S5 maintains caller queue
  302.     lea    sema5addr(pc),a1
  303.     move.l    a0,(a1)
  304.     call    InitSemaphore
  305.  
  306.     lea    myRawPutChar(pc),a2
  307.     move.l    a2,d0
  308.     move.l    a6,a1
  309.     lea    (_LVORawPutChar).w,a0
  310.     call    SetFunction
  311.     move.l    d0,(a3)+
  312.  
  313.     geta    linebuf,a0
  314.     move.l    a0,(a3)
  315.     bsr    SendReadIO
  316.     bset    #12,d7
  317.  
  318. MainLoop    move.l    d7,d0
  319.     call    Wait
  320.     sub.l    a2,a2
  321.     btst    #12,d0
  322.     bne    TryQuit
  323.     and.l    d5,d0
  324.     beq.s    MainLoopI
  325.  
  326. MainLoopRR    tsv.b    stopped
  327.     bne.s    MainLoopI
  328.     geta    sema4,a0
  329.     call    ObtainSemaphore
  330.     vmovem.l inbuf,d2/a2-a4        ; D2=buf,A2=r,A3=w,A4=bufend
  331.     sub.l    a0,a0
  332.     cmp.l    a2,a3
  333.     beq.s    MainLoopD
  334.     geta    linebuf,a0
  335.     lea    LBSIZE(a0),a1
  336. MLW1    move.b    (a2)+,d0
  337.     cmp.l    a2,a4
  338.     bne.s    MLW2
  339.     move.l    d2,a2
  340. MLW2    move.b    d0,(a0)+
  341.     cmp.l    a0,a1
  342.     beq.s    MLWP
  343.     cmp.b    #32,d0
  344.     bcs.s    MLWP
  345.     cmp.l    a2,a3
  346.     bne.s    MLW1
  347. MLWP    put.l    a2,inbufread
  348.  
  349. MainLoopD    move.l    a0,a2
  350.     get.l    waitingtask,d0
  351.     beq.s    MainLoopE
  352.     move.l    d0,a1
  353.     moveq    #SIGF_BLIT,d0
  354.     call    Signal
  355.     clv.l    waitingtask
  356.  
  357. MainLoopE    geta    sema4,a0
  358.     call    ReleaseSemaphore
  359.     move.l    a2,d0
  360.     beq.s    MainLoopI
  361.     geta    linebuf,a0
  362.     sub.l    a0,d0
  363.     bsr    WriteBlock
  364.  
  365. MainLoopI    get.l    msgport2,a0
  366.     call    GetMsg
  367.     tst.l    d0
  368.     beq.s    MainLoopZ
  369.     push    a2
  370.     bsr    ProcessInput
  371.     pop    a2
  372.     bsr    SendReadIO
  373.     sub.l    a0,a0        ; Deselect currently selected text
  374.     moveq    #0,d0
  375.     bsr    WriteBlock
  376.     bra.s    MainLoopI
  377.  
  378. MainLoopZ    get.b    stopped,d0
  379.     vcmp.b    stopped+1,d0
  380.     beq.s    MainLoopZ1
  381.     put.b    d0,stopped+1
  382.     bra    MainLoopRR
  383. MainLoopZ1    move.l    a2,d0
  384.     bne    MainLoopRR
  385.  
  386. MainLoopR    get.l    window,a0
  387.     move.l    wd_UserPort(a0),a0
  388.     call    GetMsg
  389.     tst.l    d0
  390.     beq    MainLoop
  391.     move.l    d0,a1
  392.     move.l    im_Class(a1),d2
  393.     call    ReplyMsg
  394.     rol.w    #7,d2    ; IDCMP_CLOSEWINDOW = $200
  395.     bcc.s    MainLoopR
  396.  
  397. TryQuit    call    Forbid            ; Deinstall the patch
  398.     lea    myRawPutChar(pc),a0
  399.     cmp.l    _LVORawPutChar+2(a6),a0
  400.     beq.s    DeInstOK
  401.     call    Permit
  402. DeInstFail    sub.l    a0,a0
  403.     call    intuition,DisplayBeep
  404.     move.l    (v),a6
  405.     bra    MainLoop
  406. DeInstOK    move.l    a6,a1
  407.     lea    (_LVORawPutChar).w,a0
  408.     get.l    oldRawPutChar,d0
  409.     call    SetFunction
  410.     get.l    waitingtask,d0
  411.     beq.s    DeInst1
  412.     move.l    d0,a1
  413.     moveq    #SIGF_SINGLE,d0
  414.     call    Signal
  415. DeInst1    put.l    a6,waitingtask    ; Signal "finishing"
  416.     geta    sema5,a0
  417.     call    ObtainSemaphore
  418.     call    Permit        ; No-one is inside the patches
  419.  
  420.     get.l    iorq2,a1
  421.     call    AbortIO
  422.     get.l    iorq2,a1
  423.     call    WaitIO
  424.  
  425.     sub.l    a4,a4        ; OK
  426.  
  427. cle9    get.l    signal,d0
  428.     move.l    (v),a6
  429.     call    FreeSignal
  430. cle8    get.l    inbuf,a1
  431.     move.l    (v),a6
  432.     call    FreeVec
  433.     get.l    keybuf,a1
  434.     call    FreeVec
  435. cle7    get.l    iorq,a1
  436.     move.l    (v),a6
  437.     call    CloseDevice
  438. cle6    get.l    iorq2,a0
  439.     move.l    (v),a6
  440.     call    DeleteIORequest
  441. cle5b    get.l    msgport2,a0
  442.     move.l    (v),a6
  443.     call    DeleteMsgPort
  444. cle5a    get.l    iorq,a0
  445.     move.l    (v),a6
  446.     call    DeleteIORequest
  447. cle5    get.l    msgport,a0
  448.     move.l    (v),a6
  449.     call    DeleteMsgPort
  450. cle4    get.l    window,a0
  451.     call    intuition,CloseWindow
  452. cle3    get.l    rdargs,d1
  453.     beq.s    cle2
  454.     call    dos,FreeArgs
  455. cle2    get.l    intuitionbase,a1
  456.     move.l    (v),a6
  457.     call    CloseLibrary
  458. cle1    move.l    (v),a6
  459.     move.l    ThisTask(a6),a1
  460.     get.l    oldtaskpri,d0
  461.     call    SetTaskPri
  462.     lea    varsize(sp),sp
  463. GCEnd    rts
  464.  
  465. WriteBlock    get.l    iorq,a1
  466.     move.w    #CMD_WRITE,IO_COMMAND(a1)
  467.     movem.l    d0/a0,IO_LENGTH(a1)    ; +IO_DATA
  468.     jump    DoIO
  469.  
  470. SendReadIO    get.l    iorq2,a1
  471.     move.w    #CMD_READ,IO_COMMAND(a1)
  472.     vmovem.l keybuf,d0/d1
  473.     sub.l    d0,d1
  474.     move.l    d0,IO_DATA(a1)
  475.     move.l    d1,IO_LENGTH(a1)
  476.     jump    SendIO
  477.  
  478. ProcessInput    get.l    iorq2,a0
  479.     move.l    IO_DATA(a0),a2
  480.     move.l    IO_ACTUAL(a0),d2
  481.     add.l    a2,d2
  482. In1    cmp.l    d2,a2
  483.     bcc.s    GCEnd
  484.     move.b    (a2)+,d0
  485.     cmp.b    #'W'-'@',d0
  486.     beq.s    CallDump
  487.     cmp.b    #'S'-'@',d0
  488.     beq.s    InXOFF
  489.     cmp.b    #'Q'-'@',d0
  490.     beq.s    InXON
  491.     cmp.b    #12,d0
  492.     bne.s    In1
  493. InCls    lea    cls(pc),a0
  494.     moveq    #1,d0
  495.     bsr.s    WriteBlock
  496.     get.l    inbufread,a0
  497.     vcmp.l    inbuf,a0
  498.     bne.s    InCls1
  499.     get.l    inbufend,a0
  500. InCls1    sf    -(a0)
  501.     bra.s    In1
  502. CallDump    clv.l    dumpsuccess
  503.     bsr.s    DumpBuf
  504.     tsv.l    dumpsuccess
  505.     bne.s    CD1
  506.     sub.l    a0,a0
  507.     call    intuition,DisplayBeep
  508.     move.l    (v),a6
  509.     bra.s    In1
  510. CD1    lea    fsat(pc),a0
  511.     moveq    #3,d0
  512.     bsr    WriteBlock
  513.     bra.s    In1
  514.  
  515. InXON    clv.b    stopped
  516.     bra.s    In1
  517. InXOFF    stv    stopped
  518.     bra.s    In1
  519.  
  520. DumpBuf    lea    doslib(pc),a1
  521.     call    OldOpenLibrary
  522.     tst.l    d0
  523.     beq.s    DumpNoDos
  524.     move.l    d0,a6
  525.     put.l    d0,dosbase2
  526.     clr.l    -(sp)
  527.     pea    DumpRout(pc)
  528.     pea    NP_Entry
  529.     pea    winname(pc)
  530.     pea    NP_Name
  531.     move.l    sp,d1
  532.     call    CreateNewProc
  533.     lea    20(sp),sp
  534.     move.l    (v),a6
  535.     tst.l    d0
  536.     beq.s    Dump1
  537.     moveq    #SIGF_BLIT,d0
  538.     call    Wait
  539. Dump1    get.l    dosbase2,a1
  540.     jump    CloseLibrary
  541.  
  542. DumpNoDos    rts
  543.  
  544. DumpRout    move.l    safeplace(pc),a5
  545.     geta    sema4,a0
  546.     move.l    (v),a6
  547.     call    ObtainSemaphore
  548.  
  549.     get.l    dosbase2,a6
  550.     lea    outname(pc),a0
  551.     move.l    a0,d1
  552.     move.l    #MODE_NEWFILE,d2
  553.     call    Open
  554.     move.l    d0,d7
  555.     beq.s    DumpRout2
  556.  
  557.     vmovem.l inbuf,d2/a2-a4    ; D2=inbuf,A2=rd,A3=wr,A4=bufend
  558.     move.l    a2,a1        ; A1=end of current chunk
  559.     move.l    a2,a0
  560.     clr.l    -(sp)
  561. Srch1    cmp.l    d2,a0
  562.     beq.s    Srch2
  563.     tst.b    -(a0)
  564.     beq.s    Srch3
  565.     cmp.l    a0,a3
  566.     bne.s    Srch1
  567.     bra.s    Srch3a
  568.  
  569. Srch2    push    a0
  570.     push    a1
  571.     move.l    a4,a1
  572.     move.l    a4,a0
  573. Srch4    tst.b    -(a0)
  574.     beq.s    Srch3
  575.     cmp.l    a0,a3
  576.     bne.s    Srch4
  577.     subq.l    #1,a0
  578. Srch3    addq.l    #1,a0
  579. Srch3a    push    a0
  580.     push    a1
  581.  
  582. SrchCopy    pop    d3
  583.     beq.s    DumpDone
  584.     pop    d2
  585.     move.l    d7,d1
  586.     sub.l    d2,d3
  587.     call    Write
  588.     bra.s    SrchCopy
  589.  
  590. DumpDone    move.l    d7,d1
  591.     get.l    dosbase2,a6
  592.     call    Close
  593.  
  594.     stv    dumpsuccess
  595. DumpRout2    geta    sema4,a0
  596.     move.l    (v),a6
  597.     call    ReleaseSemaphore
  598.     get.l    thistask,a1
  599.     moveq    #SIGF_BLIT,d0
  600.     jump    Signal
  601.  
  602. myRawPutChar    mpush    a0/a6
  603.     move.l    4.w,a6
  604.     move.l    sema5addr(pc),a0    ; The sequence before ObtainSema4
  605.     call    ObtainSemaphore        ; should be shortest possible
  606.     mpush    d0-d1/a1-a3/a5
  607.     move.l    safeplace(pc),a5
  608.     tst.b    d0            ; NULs are not dumped, but signalled
  609.     beq.s    RPCSignal
  610. RPC1    geta    sema4,a0
  611.     call    ObtainSemaphore
  612.     vmovem.l inbuf,d1/a0-a2
  613.     move.l    a1,a3
  614.     addq.l    #1,a3
  615.     cmp.l    a2,a3
  616.     bne.s    RPC2
  617.     move.l    d1,a3
  618. RPC2    cmp.l    a0,a3
  619.     geta    sema4,a0
  620.     beq.s    RPCWait
  621.     move.b    d0,(a1)
  622.     put.l    a3,inbufwrite
  623.     call    ReleaseSemaphore
  624.     cmp.b    #32,d0
  625.     bcc.s    RPC3
  626. RPCSignal    bsr.s    SignalMain
  627. RPC3    mpop    d0-d1/a1-a3/a5
  628.     move.l    sema5addr(pc),a0
  629.     call    ReleaseSemaphore
  630.     mpop    a0/a6
  631.     rts
  632.  
  633. RPCWait    call    ReleaseSemaphore
  634.     move.l    d0,a2
  635.     call    Forbid
  636.     tsv.l    waitingtask
  637.     bne.s    RPCCancel
  638.     put.l    ThisTask(a6),waitingtask
  639.     moveq    #0,d0
  640.     moveq    #SIGF_SINGLE,d1
  641.     call    SetSignal
  642.     bsr.s    SignalMain
  643.     moveq    #SIGF_SINGLE,d0
  644.     call    Wait
  645.     call    Permit
  646.     move.l    a2,d0
  647.     bra.s    RPC1
  648.  
  649. RPCCancel    call    Permit
  650.     bra.s    RPC3
  651.  
  652. SignalMain    get.l    thistask,a1
  653.     get.l    sigmask,d0
  654.     jump    Signal
  655.  
  656.     dc.b    '$VER: '
  657. idstr    dc.b    'DeCon 2.1 (7.2.95) © 1995 Martin Mares',0
  658. winname    dc.b    'Debug Console',0
  659. errfmt    dc.b    'DeCon: %s !',10,0
  660. unaop1    dc.b    'Unable to open ',0
  661. intuiname    dc.b    'intuition.library',0
  662. invarg    dc.b    'Invalid arguments',0
  663. nowin    dc.b    'Unable to open window',0
  664. templ    dc.b    'LEFT/N,TOP/N,WIDTH/N,HEIGHT/N,TITLE,SCREEN',0
  665. outofmem    dc.b    'Out of memory',0
  666. unacon    dc.b    'Unable to open ',0
  667. conname    dc.b    'console.device',0
  668. nosig    dc.b    'No free signals',0
  669. doslib    dc.b    'dos.library',0
  670. outname    dc.b    'T:Debug',0
  671. fsat    dc.b    'OK',10
  672. cls    dc.b    12
  673. tags    dc.b    WA_Title-TAG_USER
  674.     dc.b    WA_Left-TAG_USER,WA_Top-TAG_USER,WA_Width-TAG_USER
  675.     dc.b    WA_Height-TAG_USER,0
  676.     dc.b    WA_Title-TAG_USER,WA_PubScreenName-TAG_USER,0
  677.     dc.b    WA_IDCMP-TAG_USER,WA_Flags-TAG_USER
  678.     dc.b    WA_MinWidth-TAG_USER,WA_SimpleRefresh-TAG_USER
  679.     even
  680.  
  681. safeplace    ds.l    1    ; Original A5 stored here !
  682. sema5addr    ds.l    1    ; Pointer to sema5 stored here !
  683.  
  684. endskip
  685.     end
  686.