home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d543 / colorcatch.lha / ColorCatch / Includes / Detach.i next >
Text File  |  1991-09-20  |  5KB  |  169 lines

  1. *»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
  2. *»» Made for Hisoft Devpac 2.12 by Preben Nielsen
  3. *»»
  4. *»» 09-Aug-91: Made this header
  5. *»»
  6. *»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
  7. *»» A few macros to help detach a program from the CLI (Works from
  8. *»» Workbench as well).
  9. *»»
  10. *»» DetachSingle only works with programs consisting of exactly one
  11. *»» segment.
  12. *»»
  13. *»» DetachMulti works with any number of segments.
  14. *»»
  15. *»» None of the macros currently support passing of arguments from
  16. *»» CLI to the program.
  17. *»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
  18.     IFND    DETACH_DEFINES
  19. DETACH_DEFINES    SET    1
  20.         include        "exec/exec_lib.i"
  21.         include        "exec/memory.i"
  22.         include        "libraries/dos_lib.i"
  23.         include        "libraries/dosextens.i"
  24.  
  25. DetachSingle    MACRO        ; DetachSingle <'process name'>,stacksize,processpri
  26.         SECTION        SingleSplit,CODE
  27. DetachStart    move.l        4.W,A6
  28.         suba.l        A1,A1
  29.         jsr        _LVOFindTask(A6)    ; Find us
  30.         move.l        D0,A2
  31.         tst.l        pr_CLI(A2)
  32.         bne.S        1$
  33.         move.l        DetachStart-4(PC),A2
  34.         adda.l        A2,A2
  35.         adda.l        A2,A2
  36.         jmp        4(A2)            ; from WorkBench
  37. 1$        moveq        #RETURN_FAIL,D7
  38.         jsr        _LVOForbid(A6)        ; From CLI
  39.         lea        DoSnAme(PC),A1
  40.         jsr        _LVOOldOpenLibrary(A6)
  41.         move.l        D0,D5
  42.         beq.S        4$
  43.         moveq        #ML_SIZE+1*ME_SIZE,D0
  44.         move.l        #MEMF_PUBLIC|MEMF_CLEAR,D1
  45.         jsr        _LVOAllocMem(A6)    ; Allocate Memlist
  46.         move.l        D0,A2
  47.         tst.l        D0
  48.         beq.S        3$
  49.         lea        ProcessName(PC),A0
  50.         move.l        A0,D1
  51.         moveq        #\3,D2            ; Priority
  52.         move.l        DetachStart-4(PC),D3
  53.         move.l        #\2,D4            ; StackSize
  54.         move.l        D5,A6
  55.         jsr        _LVOCreateProc(A6)
  56.         move.l        4.W,A6
  57.         tst.l        D0
  58.         beq.S        2$
  59.         move.l        D0,A0
  60.         lea        -pr_MsgPort(A0),A0    ; Now we have process
  61.         not.l        pr_CLI(A0)        ; All MY programs will now think they were started from the CLI
  62.         lsl.l        #2,D3
  63.         subq.l        #4,D3
  64.         move.l        D3,A1
  65.         move.w        #1,ML_NUMENTRIES(A2)    ; MemList -> ml_NumEntries    = 1
  66.         move.l        A1,ML_ME+ME_ADDR(A2)    ; MemList -> ml_me[0].me_Addr    = Segment
  67.         move.l        (A1),ML_ME+ME_LENGTH(A2); MemList -> ml_me[0].me_Length    = Length
  68.         lea        TC_MEMENTRY(A0),A0
  69.         move.l        A2,A1
  70.         jsr        _LVOAddTail(A6)        ; AddTail(&Process->pr_Task.tc_MemEntry,&MemList->ml_Node);
  71.         lea        DetachStart-4(PC),A0
  72.         clr.l        (A0)            ; Split the segments
  73.         moveq        #RETURN_OK,D7
  74.         bra.S        3$
  75. 2$        move.l        A2,A1            ; CreateProc failed. Can't do anything then
  76.         moveq        #ML_SIZE+1*ME_SIZE,D0
  77.         jsr        _LVOFreeMem(A6)
  78. 3$        move.l        D5,A1
  79.         jsr        _LVOCloseLibrary(A6)
  80. 4$        jsr        _LVOPermit(A6)
  81.         move.l        D7,D0            ; Set return code
  82.         rts
  83. DoSnAme        dc.b        'dos.library',0
  84. ProcessName    dc.b        \1,0            ; CreateProc makes a copy of this name
  85.         SECTION        ProcessCode,CODE
  86.         ENDM
  87.  
  88. DetachMulti    MACRO        ; DetachMulti <'process name'>,stacksize,processpri
  89.         SECTION        MultiSplit,CODE
  90. DetachStart    move.l        4.W,A6
  91.         suba.l        A1,A1
  92.         jsr        _LVOFindTask(A6)    ; Find us
  93.         move.l        D0,A2
  94.         tst.l        pr_CLI(A2)
  95.         bne.S        1$
  96.         move.l        DetachStart-4(PC),A2
  97.         adda.l        A2,A2
  98.         adda.l        A2,A2
  99.         jmp        4(A2)            ; from WorkBench
  100. 1$        moveq        #RETURN_FAIL,D7
  101.         link        A4,#-100
  102.         jsr        _LVOForbid(A6)        ; From CLI
  103.         lea        DoSnAme(PC),A1
  104.         jsr        _LVOOldOpenLibrary(A6)
  105.         move.l        D0,D5
  106.         beq        7$
  107.         move.l        DetachStart-4(PC),A1
  108.         move.l        A1,D3
  109.         moveq        #0,D6            ; Number of segments
  110.         moveq        #ML_SIZE,D7        ; Size of memory to allocate
  111.         move.l        SP,A0
  112. 2$        move.l        A1,D0            ; Count segments and make MemEntries on the stack
  113.         beq.S        3$
  114.         adda.l        A1,A1
  115.         adda.l        A1,A1
  116.         subq.l        #4,A1
  117.         move.l        A1,(A0)+        ; MemList -> ml_me[0].me_Addr    = Segment
  118.         move.l        (A1),(A0)+        ; MemList -> ml_me[0].me_Length    = Length
  119.         move.l        4(A1),A1
  120.         addq.w        #1,D6
  121.         addq.w        #ME_SIZE,D7
  122.         bra.S        2$
  123. 3$        move.l        D7,D0
  124.         move.l        #MEMF_PUBLIC|MEMF_CLEAR,D1
  125.         jsr        _LVOAllocMem(A6)    ; Allocate Memlist
  126.         move.l        D0,A2
  127.         tst.l        D0
  128.         beq.S        6$
  129.         move.w        D6,ML_NUMENTRIES(A2)    ; MemList -> ml_NumEntries = number of segments
  130.         move.l        SP,A0
  131.         lea        ML_ME(A2),A1
  132.         move.l        D7,D0
  133.         sub.w        #ML_SIZE+1,D0
  134. 4$        move.b        (A0)+,(A1)+
  135.         dbf        D0,4$
  136.         move.l        #ProcessName,D1
  137.         moveq        #\3,D2            ; Priority
  138.         move.l        #\2,D4            ; Stacksize
  139.         move.l        D5,A6
  140.         jsr        _LVOCreateProc(A6)
  141.         move.l        4.W,A6
  142.         move.l        D0,A0
  143.         tst.l        D0
  144.         beq.S        5$
  145.         lea        -pr_MsgPort(A0),A0    ; Now we have process
  146.         not.l        pr_CLI(A0)        ; All MY programs will now think they were started from the CLI
  147.         lea        TC_MEMENTRY(A0),A0
  148.         move.l        A2,A1
  149.         jsr        _LVOAddTail(A6)        ; AddTail(&Process->pr_Task.tc_MemEntry,&MemList->ml_Node);
  150.         lea        DetachStart-4(PC),A1
  151.         clr.l        (A1)            ; Split the segments
  152.         moveq        #RETURN_OK,D7
  153.         bra.S        6$
  154. 5$        move.l        A2,A1            ; CreateProc failed. Can't do anything then
  155.         move.l        D7,D0
  156.         jsr        _LVOFreeMem(A6)
  157. 6$        move.l        D5,A1
  158.         jsr        _LVOCloseLibrary(A6)
  159. 7$        jsr        _LVOPermit(A6)
  160.         unlk        A4
  161.         move.l        D7,D0            ; Set return code
  162.         rts
  163. DoSnAme        dc.b        'dos.library',0
  164. ProcessName    dc.b        \1,0            ; CreateProc makes a copy of this name
  165.         SECTION        ProcessCode,CODE
  166.         ENDM
  167.     ENDC
  168.  
  169.