home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -in_the_mag- / reader_requests / stackattack / source / patch.asm < prev    next >
Assembly Source File  |  1998-05-02  |  6KB  |  332 lines

  1.     INCLUDE "exec/types.i"
  2.     INCLUDE "dos/dostags.i"
  3.     INCLUDE "utility/tagitem.i"
  4.     INCLUDE "lvo/utility_lib.i"
  5.  
  6. ;//=================================================
  7.  
  8.     XDEF    PATCHSTART
  9. PATCHSTART:
  10.  
  11. ;//=================================================
  12.  
  13.  
  14.     XDEF New_CreateProc
  15.  
  16. New_CreateProc:
  17.     move.l    d4,-(sp)
  18.     
  19.     cmp.l        _MinStack(pc),d4
  20.     bge.s        .MinStackOK
  21.     move.l    _MinStack(pc),d4
  22.     
  23. .MinStackOK:
  24.     add.l        _StackAdd(pc),d4
  25.  
  26.     pea        .raus(pc)
  27.     move.l    _Old_CreateProc(pc),-(sp)
  28.     rts
  29.     
  30. .raus:
  31.     move.l    (sp)+,d4
  32.     rts
  33.  
  34.  
  35.     XDEF New_CreateNewProc
  36.  
  37. DAT1_proctags = -4
  38. DAT1_newti = -20
  39. DAT1_clonedtaglist = -24
  40. DAT1_len = -24
  41.  
  42. New_CreateNewProc:    ;// d1 = proctags
  43.     link        a5,#DAT1_len
  44.     move.l    d2,-(sp)
  45.  
  46.     move.l    d1,DAT1_proctags(a5)                    ;// save proctags
  47.     clr.l        DAT1_clonedtaglist(a5)
  48.  
  49.     move.l    #NP_StackSize,DAT1_newti(a5)        ;// NP_StackSize
  50.     move.l    _MinStack(pc),d0
  51.     add.l        _StackAdd(pc),d0
  52.     move.l    d0,DAT1_newti+4(a5)                    ;// MinStack + StackAdd
  53.     
  54.     move.l    #TAG_MORE,DAT1_newti+8(a5)            ;// TAG_MORE
  55.     move.l    d1,DAT1_newti+12(a5)                    ;// proctags
  56.  
  57.     tst.l        d1                                            ;// are there any tags?
  58.     beq.s        .NoTags
  59.  
  60.     move.l    a6,-(sp)
  61.     move.l    _UtilityBase(pc),a6    
  62.     move.l    #NP_StackSize,d0
  63.     move.l    d1,a0
  64.     jsr        _LVOFindTagItem(a6)
  65.     move.l    (sp)+,a6
  66.     
  67.     tst.l        d0
  68.     beq.s        .NotFound
  69.  
  70.     move.l    d0,a0
  71.     move.l    ti_Data(a0),d2
  72.     cmp.l        _MinStack(pc),d2            ;// ti_Data >= MinStack ?
  73.     bge.s        .MinOK
  74.     
  75.     move.l    _MinStack(pc),d2
  76.  
  77. .MinOK:
  78.     add.l        _StackAdd(pc),d2
  79.  
  80. ;// we have to change NP_StackSize and will therefore
  81. ;// try to clone the taglist or if ...
  82.  
  83.     movem.l    a0/a6,-(sp)
  84.     move.l    _UtilityBase(pc),a6
  85.     move.l    DAT1_proctags(a5),a0
  86.     jsr        _LVOCloneTagItems(a6)
  87.     movem.l    (sp)+,a0/a6
  88.     tst.l        d0
  89.     bne.s        .CloningOK
  90.     
  91. ;// ... cloning failed :( ==> patch the original taglist
  92.  
  93.     move.l    d2,ti_Data(a0)
  94.     move.l    DAT1_proctags(a5),d1
  95.     bra.s        .GoOld
  96.  
  97. .CloningOK:
  98.     move.l    d0,DAT1_clonedtaglist(a5)
  99.     move.l    d0,a0
  100.  
  101.     move.l    a6,-(sp)
  102.     move.l    _UtilityBase(pc),a6
  103.     move.l    #NP_StackSize,d0
  104.     jsr        _LVOFindTagItem(a6)
  105.     move.l    (sp)+,a6
  106.     
  107. ;// will not fail this time!?
  108.  
  109.     move.l    d0,a0
  110.     move.l    d2,ti_Data(a0)
  111.     
  112.     move.l    DAT1_clonedtaglist(a5),d1
  113.     bra.s        .GoOld
  114.  
  115. ;// No Tags supplied ?
  116.     
  117. .NoTags:
  118.     move.l    #TAG_DONE,DAT1_newti+8(a5)        ;// terminate taglist
  119.  
  120. .NotFound:
  121.     lea        DAT1_newti(a5),a0
  122.     move.l    a0,d1                                        ;// pass newti to CreateNewProc
  123.  
  124. .GoOld:
  125.     pea        .funcexit(pc)
  126.     move.l    _Old_CreateNewProc(pc),-(sp)
  127.     rts
  128.  
  129. .funcexit:
  130.     move.l    DAT1_clonedtaglist(a5),d1
  131.     beq.s        .noclonedtaglist
  132.  
  133. ;// free cloned taglist
  134.  
  135.     move.l    d1,a0
  136.     movem.l    d0/a6,-(sp)
  137.     move.l    _UtilityBase(pc),a6
  138.     jsr        _LVOFreeTagItems(a6)
  139.     movem.l    (sp)+,d0/a6
  140.     
  141. .noclonedtaglist:
  142.     move.l    (sp)+,d2                                    ;// restore d2
  143.     unlk        a5
  144.     rts
  145.  
  146.  
  147.     XDEF New_SystemTagList
  148.  
  149. DAT2_proctags = -4
  150. DAT2_command = -8
  151. DAT2_newti = -24
  152. DAT2_clonedtaglist = -28
  153. DAT2_len = -28
  154.  
  155. New_SystemTagList:    ;// d2 = proctags!!!! (and not d1 as in CreatenewProc!!!
  156.  
  157.     link        a5,#DAT2_len
  158.     move.l    d2,-(sp)
  159.  
  160.     move.l    d1,DAT2_command(a5)                    ;// save command
  161.     move.l    d2,DAT2_proctags(a5)                    ;// save proctags
  162.  
  163. ;// **HELP**
  164. ;// NP_StackSize commented out because of the C:ICONX and SHELL problem
  165. ;// when the icon tooltype "STACK" is used (see "H E L P   M E ! !")
  166.  
  167. ;'    move.l    #NP_StackSize,DAT2_newti(a5)        ;// NP_StackSize
  168.     move.l    #TAG_IGNORE,DAT2_newti(a5)            ;// NP_StackSize
  169.     clr.l        DAT2_clonedtaglist(a5)
  170.  
  171.     move.l    _MinStack(pc),d0
  172.     add.l        _StackAdd(pc),d0
  173.     move.l    d0,DAT2_newti+4(a5)                    ;// MinStack + StackAdd
  174.     
  175.     move.l    #TAG_MORE,DAT2_newti+8(a5)            ;// TAG_MORE
  176.     move.l    d2,DAT2_newti+12(a5)                    ;// proctags
  177.  
  178.     tst.l        d2                                            ;// are there any tags?
  179.     beq.s        .NoTags
  180.  
  181.     move.l    a6,-(sp)
  182.     move.l    _UtilityBase(pc),a6    
  183.     move.l    #NP_StackSize,d0
  184.     move.l    d2,a0
  185.     jsr        _LVOFindTagItem(a6)
  186.     move.l    (sp)+,a6
  187.     
  188.     tst.l        d0
  189.     beq.s        .NotFound
  190.  
  191.     move.l    d0,a0
  192.     move.l    ti_Data(a0),d2
  193.     cmp.l        _MinStack(pc),d2            ;// ti_Data>MinData?
  194.     bge.s        .MinOK
  195.     move.l    _MinStack(pc),d2
  196.  
  197. .MinOK
  198.     add.l        _StackAdd(pc),d2
  199.     
  200. ;// we have to change NP_StackSize and will therefore
  201. ;// try to clone the taglist, or if ...
  202.  
  203.     movem.l    a0/a6,-(sp)
  204.     move.l    _UtilityBase(pc),a6
  205.     move.l    DAT2_proctags(a5),a0
  206.     jsr        _LVOCloneTagItems(a6)
  207.     movem.l    (sp)+,a0/a6
  208.     tst.l        d0
  209.     bne.s        .CloningOK
  210.     
  211. ;// ... cloning failed :( ==> patch original taglist
  212.  
  213.     move.l    d2,ti_Data(a0)
  214.     move.l    DAT2_proctags(a5),d2
  215.     bra.s        .GoOld
  216.  
  217. .CloningOK:
  218.     move.l    d0,DAT2_clonedtaglist(a5)
  219.     move.l    d0,a0
  220.  
  221.     move.l    a6,-(sp)
  222.     move.l    _UtilityBase(pc),a6
  223.     move.l    #NP_StackSize,d0
  224.     jsr        _LVOFindTagItem(a6)
  225.     move.l    (sp)+,a6
  226.     
  227. ;// will not fail this time!?
  228.  
  229.     move.l    d0,a0
  230.     move.l    d2,ti_Data(a0)
  231.     
  232.     move.l    DAT2_clonedtaglist(a5),d2
  233.     bra.s        .GoOld
  234.  
  235. ;// No Tags supplied ?
  236.     
  237. .NoTags:
  238.     move.l    #TAG_DONE,DAT2_newti+8(a5)            ;// terminate taglist
  239.  
  240. .NotFound:
  241.     lea        DAT2_newti(a5),a0
  242.     move.l    a0,d2                                        ;// pass newti to CreateNewProc
  243.  
  244. .GoOld:
  245.     move.l    DAT2_command(a5),d1                    ;// restore command
  246.  
  247.     pea        .funcexit(pc)
  248.     move.l    _Old_SystemTagList(pc),-(sp)
  249.     rts
  250.  
  251. .funcexit:
  252.     move.l    DAT2_clonedtaglist(a5),d1
  253.     beq.s        .noclonedtaglist
  254.  
  255. ;// free cloned taglist
  256.  
  257.     move.l    d1,a0
  258.     movem.l    d0/a6,-(sp)
  259.     move.l    _UtilityBase(pc),a6
  260.     jsr        _LVOFreeTagItems(a6)
  261.     movem.l    (sp)+,d0/a6
  262.     
  263. .noclonedtaglist:
  264.     move.l    (sp)+,d2                                    ;// restore d2
  265.     unlk        a5
  266.     rts
  267.  
  268.  
  269.     
  270.     XDEF New_RunCommand
  271.  
  272. New_RunCommand:
  273.     move.l    d2,-(sp)
  274.  
  275.     cmp.l        _MinStack(pc),d2
  276.     bge.s        .MinStackOK
  277.     move.l    _MinStack(pc),d2
  278.     
  279. .MinStackOK:
  280.     add.l        _StackAdd(pc),d2
  281.  
  282.     pea        .raus(pc)
  283.     move.l    _Old_RunCommand(pc),-(sp)
  284.     rts
  285.  
  286. .raus:
  287.     move.l    (sp)+,d2
  288.     rts
  289.  
  290.  
  291.  
  292.  
  293.     XDEF    _Old_CreateProc
  294.     XDEF    _Old_CreateNewProc
  295.     XDEF    _Old_SystemTagList
  296.     XDEF    _Old_RunCommand
  297.     XDEF    _MinStack
  298.     XDEF    _StackAdd
  299.     XDEF    _UtilityBase
  300.     XDEF    _CDOSBase
  301.     
  302. ;// no ds.l here !!!
  303.  
  304. _Old_CreateProc:        dc.l 0
  305.  
  306. _Old_CreateNewProc:    dc.l 0
  307.  
  308. _Old_SystemTagList:    dc.l 0
  309.  
  310. _Old_RunCommand:        dc.l 0
  311.  
  312. _MinStack:                dc.l 4000
  313.  
  314. _StackAdd:                dc.l 0
  315.     
  316. _UtilityBase:            dc.l 0
  317.  
  318. _CDOSBase:                dc.l 0
  319.  
  320.  
  321.     dc.b 'GS97'
  322.  
  323. ;//=================================================
  324.  
  325.     XDEF    PATCHEND
  326. PATCHEND:
  327.  
  328. ;//=================================================
  329.  
  330.     END
  331.  
  332.