home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / disk / misc / dcmp / source / source.lha / nice.S < prev    next >
Text File  |  1993-01-29  |  19KB  |  746 lines

  1. *******************************************************************************
  2. **
  3. **  $Id: nice.S,v 1.8 92/11/03 17:14:16 tf Exp $
  4. **
  5. **  NiceOpenWindow(), NiceCloseWindow() with (DICE) C interface code
  6. **  written by Tobias Ferber 1992 with a little help and the idea from
  7. **  Harald Kunze.
  8. **
  9. *******************************************************************************
  10.  
  11.   include "exec/exec_lib.i"
  12.   include "intuition/intuition_lib.i"
  13.   include "intuition/screens.i"
  14.   include "graphics/graphics_lib.i"
  15.   include "graphics/rastport.i"
  16.   include "graphics/layers.i"
  17.   include "graphics/layers_lib.i"
  18.  
  19.   LIBRARY_VERSION: equ 33
  20.  
  21.   dc.b "$Id: nice.S,v 1.8 92/11/03 17:14:16 tf Exp $",0 ; rcs ID
  22.   even
  23.  
  24.   section NiceInterface,code
  25.  
  26.   debug:    set 1   ; produce debug information (see below)
  27. ; moderate: set 1
  28.   wuslon:   set 1   ; draw two frames instead of one
  29.  
  30.   ifd debug
  31.   xdef    NiceOpenWindow
  32.   xdef    NiceCloseWindow
  33.   xdef    OpenRectangle
  34.   xdef    CloseRectangle
  35.   xdef    Bresenham
  36.   xdef    cc_open
  37.   xdef    cc_close
  38.   xdef    drawframe
  39.   endc ;debug
  40.  
  41.   xdef _NiceOpenWindow
  42.   xdef _NiceCloseWindow
  43.   xdef _NiceOpenSpeed
  44.   xdef _NiceCloseSpeed
  45.   xdef _OpenRectangle
  46.   xdef _CloseRectangle
  47.  
  48. _NiceOpenWindow:
  49.  
  50.   movem.l D1-D7/A0-A6,-(sp)
  51.   link    A5,#-4                      ; A5 -> -(sp); sp -> A5; sp +(-4) -> sp
  52.   clr.l   -4(A5)
  53.   lea     IntuitionName,A1
  54.   moveq   #LIBRARY_VERSION,D0
  55.   move.l  (_SysBase).W,A6
  56.   jsr     _LVOOpenLibrary(A6)
  57.   move.l  D0,_IntuitionBase
  58.   beq     \exit
  59.   lea     GraphicsName,A1
  60.   moveq   #LIBRARY_VERSION,D0
  61.   move.l  (_SysBase).W,A6
  62.   jsr     _LVOOpenLibrary(A6)
  63.   move.l  D0,_GfxBase
  64.   beq     \nogfx
  65.   lea     LayersName,A1
  66.   moveq   #LIBRARY_VERSION,D0
  67.   move.l  (_SysBase).W,A6
  68.   jsr     _LVOOpenLibrary(A6)
  69.   move.l  D0,_LayersBase
  70.   beq     \nolayers
  71.  
  72.   move.w  _NiceOpenSpeed,D0
  73.   move.l  68(sp),A0                   ; fish out the NewWindow struct ptr
  74.   bsr     NiceOpenWindow
  75.   move.l  D0,-4(A5)                   ; save our Window ptr
  76.  
  77.   move.l  _LayersBase,A1
  78.   move.l  (_SysBase).W,A6
  79.   jsr     _LVOCloseLibrary(A6)
  80. \nolayers:
  81.   move.l  _GfxBase,A1
  82.   move.l  (_SysBase).W,A6
  83.   jsr     _LVOCloseLibrary(A6)
  84. \nogfx:
  85.   move.l  _IntuitionBase,A1
  86.   move.l  (_SysBase).W,A6
  87.   jsr     _LVOCloseLibrary(A6)
  88.   move.l  -4(A5),D0                   ; return our Window ptr (in D0)
  89. \exit:
  90.   unlk    A5
  91.   movem.l (sp)+,D1-D7/A0-A6
  92.   rts
  93.   
  94.  
  95. _NiceCloseWindow:
  96.  
  97.   movem.l D0-D7/A0-A6,-(sp)
  98.   lea     IntuitionName,A1
  99.   moveq   #LIBRARY_VERSION,D0
  100.   move.l  (_SysBase).W,A6
  101.   jsr     _LVOOpenLibrary(A6)
  102.   move.l  D0,_IntuitionBase
  103.   beq     \exit
  104.   lea     GraphicsName,A1
  105.   moveq   #LIBRARY_VERSION,D0
  106.   move.l  (_SysBase).W,A6
  107.   jsr     _LVOOpenLibrary(A6)
  108.   move.l  D0,_GfxBase
  109.   beq     \nogfx
  110.   lea     LayersName,A1
  111.   moveq   #LIBRARY_VERSION,D0
  112.   move.l  (_SysBase).W,A6
  113.   jsr     _LVOOpenLibrary(A6)
  114.   move.l  D0,_LayersBase
  115.   beq     \nolayers
  116.  
  117.   move.w  _NiceCloseSpeed,D0
  118.   move.l  64(sp),A0                   ; Window
  119.   bsr     NiceCloseWindow
  120.  
  121.   move.l  _LayersBase,A1
  122.   move.l  (_SysBase).W,A6
  123.   jsr     _LVOCloseLibrary(A6)
  124. \nolayers:
  125.   move.l  _GfxBase,A1
  126.   move.l  (_SysBase).W,A6
  127.   jsr     _LVOCloseLibrary(A6)
  128. \nogfx:
  129.   move.l  _IntuitionBase,A1
  130.   move.l  (_SysBase).W,A6
  131.   jsr     _LVOCloseLibrary(A6)
  132. \exit:
  133.   movem.l (sp)+,D0-D7/A0-A6
  134.   rts
  135.  
  136.  
  137. _OpenRectangle:
  138.  
  139.   movem.l D0-D7/A0-A6,-(sp)
  140.   lea     GraphicsName,A1
  141.   moveq   #LIBRARY_VERSION,D0
  142.   move.l  (_SysBase).W,A6
  143.   jsr     _LVOOpenLibrary(A6)
  144.   move.l  D0,_GfxBase
  145.   beq     \nogfx
  146.  
  147.   move.l  64(sp),A1                   ; (8+7)*4 +4
  148.   move.l  68(sp),D0
  149.   move.l  72(sp),D1
  150.   move.l  76(sp),D2
  151.   move.l  80(sp),D3
  152.   move.l  84(sp),D4
  153.  
  154.   bsr     OpenRectangle
  155.   move.l  _GfxBase,A1
  156.   move.l  (_SysBase).W,A6
  157.   jsr     _LVOCloseLibrary(A6)
  158.  
  159. \nogfx:
  160.   movem.l (sp)+,D0-D7/A0-A6
  161.   rts
  162.  
  163.  
  164. _CloseRectangle:
  165.  
  166.   movem.l D0-D7/A0-A6,-(sp)
  167.   lea     GraphicsName,A1
  168.   moveq   #LIBRARY_VERSION,D0
  169.   move.l  (_SysBase).W,A6
  170.   jsr     _LVOOpenLibrary(A6)
  171.   move.l  D0,_GfxBase
  172.   beq     \nogfx
  173.  
  174.   move.l  64(sp),A1                   ; (8+7)*4 +4
  175.   move.l  68(sp),D0
  176.   move.l  72(sp),D1
  177.   move.l  76(sp),D2
  178.   move.l  80(sp),D3
  179.   move.l  84(sp),D4
  180.   bsr     CloseRectangle
  181.  
  182.   move.l  _GfxBase,A1
  183.   move.l  (_SysBase).W,A6
  184.   jsr     _LVOCloseLibrary(A6)
  185.  
  186. \nogfx:
  187.   movem.l (sp)+,D0-D7/A0-A6
  188.   rts
  189.  
  190.  
  191.   section NiceInterface,data
  192.  
  193. _IntuitionBase:  ds.l 1
  194. _GfxBase:        ds.l 1
  195. _LayersBase:     ds.l 1
  196.  
  197.  
  198. IntuitionName:   INTNAME
  199. GraphicsName:    GRAFNAME
  200. LayersName:      dc.b "layers.library",0
  201.  
  202.   even
  203.  
  204. _NiceOpenSpeed:  dc.w 8  ; default values
  205. _NiceCloseSpeed: dc.w 8
  206.  
  207. NiceRastPort:    ds.b rp_SIZEOF       ; copy of pop-up screen's RP
  208.  
  209.  
  210. *******************************************************************************
  211. **
  212. ** Window= NiceOpenWindow ( NewWindow, OpenSpeed )       [NiceRastPort needed]
  213. **   D0                        A0         D0               
  214. **
  215. *******************************************************************************
  216.  
  217.   section Nice,code
  218.  
  219. NiceOpenWindow:
  220.  
  221.   movem.l D1-D7/A0-A6,-(sp)
  222.  
  223.   tst.w   D0
  224.   beq     \noframes                   ; ==> perform normal OpenWindow()
  225.  
  226.   move.w  D0,D4                       ; D4 is expected to be unchanged
  227.   link    A5,#-8
  228.   move.l  A0,-4(A5)                   ; save NewWindow
  229.  
  230.   move.l  nw_Screen(A0),A0            ; have we got a Screen? (CUSTOMSCREEN ?)
  231.   cmpa.l  #0,A0
  232.   bne     \copyrp
  233.  
  234.   ; Find the Screen on which we're going to pop up
  235.  
  236.   moveq   #0,D0                       ; Lock for IntuitionBase
  237.   move.l  _IntuitionBase,A6
  238.   jsr     _LVOLockIBase(A6)           ; ... now it's mine !
  239.  
  240.   move.l  _IntuitionBase,A0
  241.   move.l  ib_FirstScreen(A0),-(sp)    ; start with IntuitionBase->FirstScreen
  242.  
  243.   move.l  D0,A0                       ; Lock from LockIBase()
  244.   move.l  _IntuitionBase,A6
  245.   jsr     _LVOUnlockIBase(A6)
  246.  
  247.   move.l  (sp)+,A0                    ; IntuitionBase->FirstScreen
  248.   move.l  -4(A5),A1                   ; NewWindow ptr
  249.   move.w  nw_Type(A1),D1              ; NewWindow->Type
  250.   and.w   #SCREENTYPE,D1              ; ... just to be sure
  251.  
  252. \findscreen:
  253.   cmpa.l  #0,A0
  254.   beq     \noscreen
  255.   move.w  sc_Flags(A0),D0
  256.   and.w   #SCREENTYPE,D0              ; ... since we did it with D1
  257.   and.w   D1,D0                       ; mask flags out from NewWindow->Type
  258.   tst.w   D0
  259.   bne     \copyrp                     ; yeah! this is a Screen we like ;)
  260.   move.l  sc_NextScreen(A0),A0
  261.   bra     \findscreen
  262.  
  263.   ; Get a copy.  Don't mess with somebody else's RastPort !
  264.  
  265. \copyrp:
  266.   move.l  A0,-8(A5)                   ; save Screen pointer
  267.   lea     sc_RastPort(A0),A0          ; source= &Screen->RastPort
  268.   lea     NiceRastPort,A1             ; dest= &NiceRastPort
  269.   move.l  #rp_SIZEOF,D0               ; numbytes= sizeof(struct RastPort)
  270.   move.l  (_SysBase).W,A6
  271.   jsr     _LVOCopyMem(A6)
  272.  
  273.   moveq   #RP_COMPLEMENT,D0
  274.   lea     NiceRastPort,A1
  275.   move.l  _GfxBase,A6
  276.   jsr     _LVOSetDrMd(A6)             ; SetDrawMode(COMPLEMENT)
  277.  
  278.   move.l  -4(A5),A0                   ; NewWindow
  279.   move.w  nw_DetailPen(A0),D0
  280.   lea     NiceRastPort,A1
  281.   move.l  _GfxBase,A6
  282.   jsr     _LVOSetAPen(A6)             ; SetAPen(NewWindow->DetailPen)
  283.  
  284.   move.l  -8(A5),A0                   ; Screen
  285.   lea     sc_LayerInfo(A0),A0         ; &Screen->LayerInfo
  286.   move.l  _LayersBase,A6
  287.   jsr     _LVOLockLayerInfo(A6)
  288.  
  289.   move.l  -4(A5),A0                   ; NewWindow
  290.   move.w  nw_LeftEdge(A0),D0
  291.   move.w  nw_TopEdge(A0),D1
  292.   move.w  nw_Width(A0),D2
  293.   move.w  nw_Height(A0),D3
  294.   lea     NiceRastPort,A1
  295.   bsr     OpenRectangle
  296.  
  297.   move.l  -8(A5),A0                   ; Screen (with locked LayerInfo)
  298.   lea     sc_LayerInfo(A0),A0         ; &Screen->LayerInfo
  299.   move.l  _LayersBase,A6
  300.   jsr     _LVOUnlockLayerInfo(A6)
  301.  
  302. \noscreen:
  303.   move.l  -4(A5),A0                   ; NewWindow
  304.   unlk    A5
  305.  
  306. \noframes:
  307.   move.l  _OldOpenWindow,A1
  308.   cmpa.l  #0,A1
  309.   beq     \notpatched
  310.   move.l  _IntuitionBase,A6
  311.   jsr     (A1)
  312.   bra     \exit
  313.  
  314. \notpatched:
  315.   move.l  _IntuitionBase,A6
  316.   jsr     _LVOOpenWindow(A6)          ; NewWindow in A0
  317.  
  318. \exit:
  319.   movem.l (sp)+,D1-D7/A0-A6
  320.   rts
  321.  
  322. *******************************************************************************
  323. **
  324. ** NiceCloseWindow ( Window, CloseSpeed )                [NiceRastPort needed]
  325. **                     A0       D0
  326. **
  327. *******************************************************************************
  328.  
  329. NiceCloseWindow:
  330.  
  331.   movem.l D0-D7/A0-A6,-(sp)
  332.   link    A5,#-14
  333.   move.w  wd_LeftEdge(A0),-2(A5)
  334.   move.w  wd_TopEdge(A0),-4(A5)
  335.   move.w  wd_Width(A0),-6(A5)
  336.   move.w  wd_Height(A0),-8(A5)
  337.   move.w  D0,-10(A5)                  ; closing speed
  338.   move.l  wd_WScreen(A0),A1
  339.   move.l  A1,-14(A5)                  ; save Window->WScreen
  340.  
  341.   move.l  _OldCloseWindow,A1
  342.   cmpa.l  #0,A1
  343.   beq     \notpatched
  344.   move.l  _IntuitionBase,A6
  345.   jsr     (A1)
  346.   bra     \nice
  347.  
  348. \notpatched:
  349.   move.l  _IntuitionBase,A6
  350.   jsr     _LVOCloseWindow(A6)         ; close the window
  351.  
  352. \nice:
  353.   tst.w   -10(A5)                     ; closing speed
  354.   beq     \noframes
  355.  
  356.   ; Get a copy.  Don't mess with somebody else's RastPort !
  357.  
  358.   move.l  -14(A5),A0                  ; Window->WScreen
  359.   lea     sc_RastPort(A0),A0          ; source= &Window->WScreen->RastPort
  360.   lea     NiceRastPort,A1             ; dest= &NiceRastPort
  361.   move.l  #rp_SIZEOF,D0               ; numbytes= sizeof(struct RastPort)
  362.   move.l  (_SysBase).W,A6
  363.   jsr     _LVOCopyMem(A6)
  364.  
  365.   move.w  #RP_COMPLEMENT,D0
  366.   lea     NiceRastPort,A1             ; copy of Window->WScreen->RastPort
  367.   move.l  _GfxBase,A6
  368.   jsr     _LVOSetDrMd(A6)             ; SetDrawMode(COMPLEMENT)
  369.  
  370.   move.l  -14(A5),A0                  ; Window->WScreen
  371.   lea     sc_LayerInfo(A0),A0         ; &Window->WScreen->LayerInfo
  372.   move.l  _LayersBase,A6
  373.   jsr     _LVOLockLayerInfo(A6)
  374.  
  375.   move.w  -2(A5),D0                   ; LeftEdge
  376.   move.w  -4(A5),D1                   ; TopEdge
  377.   move.w  -6(A5),D2                   ; Width
  378.   move.w  -8(A5),D3                   ; Height
  379.   move.w  -10(A5),D4                  ; CloseSpeed
  380.   lea     NiceRastPort,A1             ; copy of Window->WScreen->RastPort
  381.   bsr     CloseRectangle
  382.  
  383.   move.l  -14(A5),A0                  ; Window->WScreen (with locked LayerInfo)
  384.   lea     sc_LayerInfo(A0),A0         ; &Window->WScreen->LayerInfo
  385.   move.l  _LayersBase,A6
  386.   jsr     _LVOUnlockLayerInfo(A6)
  387.  
  388. \noframes:
  389.   unlk    A5
  390.   movem.l (sp)+,D0-D7/A0-A6
  391.   rts
  392.  
  393. ********************************************************************************
  394. **
  395. **  FUNCTIONs
  396. **
  397. **    OpenRectangle,CloseRectangle -- Open/Close a rectangle
  398. **  
  399. **  SYNOPSIS 
  400. **
  401. **     OpenRectangle( RastPort, LeftEdge, TopEdge, Width, Height, OpenSpeed )
  402. **
  403. **    CloseRectangle( RastPort, LeftEdge, TopEdge, Width, Height, CloseSpeed )
  404. **                      A1        D0       D1       D2      D3       D4
  405. **
  406. **
  407. **    struct RastPort *RastPort;
  408. **    UWORD  LeftEdge, TopEdge;
  409. **    UWORD  Width, Height;
  410. **    UWORD  OpenSpeed,CloseSpeed;
  411. **
  412. **
  413. **  DESCRIPTION
  414. **
  415. **    OpenRectangle draws the edges of a rectangle.  This rectangle will grow
  416. **    out of its center in that way, that all 4 edges reach the borders at the
  417. **    same time. (i.e. proportionally)
  418. **
  419. **    CloseRectangle proportionally shrinks it back to it's center again.
  420. **
  421. ********************************************************************************
  422.  
  423. OpenRectangle:
  424.  
  425.   movem.l D0-D7/A0-A6,-(sp)
  426.   lea     cc_open,A0
  427.   bsr     Bresenham
  428.   movem.l (sp)+,D0-D7/A0-A6
  429.   rts
  430.  
  431. CloseRectangle:
  432.  
  433.   movem.l D0-D7/A0-A6,-(sp)
  434.   lea     cc_close,A0
  435.   bsr     Bresenham
  436.   movem.l (sp)+,D0-D7/A0-A6
  437.   rts
  438.  
  439.   ; Here we do the open/close stuff via Bresenham's algorithm for drawing
  440.   ; a line.  Note that opening and closing works nearly the same way since
  441.   ; we compute the distance to move as a vector (dx|dy).
  442.  
  443. Bresenham:
  444.  
  445.   tst.w   d4
  446.   beq     \noframes                   ; no frames --> we're done
  447.  
  448.   ; compute the distances from the center to the border
  449.  
  450.   lsr.w   #1,d2                       ; D2= dx
  451.   lsr.w   #1,d3                       ; D3= dy
  452.  
  453.   ; save the distances for cc_open
  454.  
  455.   move.w  d2,d6
  456.   move.w  d3,d7
  457.  
  458.   ; comute the center of the rectangle in (D0|D1)
  459.  
  460.   add.w   d2,d0                       ; LeftEdge + Width/2
  461.   add.w   d3,d1                       ; TopEdge + Height/2
  462.  
  463.   ; init our modulo
  464.  
  465.   move.w  d2,d5
  466.   lsr.w   #1,d5                       ; D5= modulo (initially dx/2)
  467.  
  468.   jsr     (A0)
  469.   bsr     drawframe
  470.  
  471.   ifd wuslon
  472.  
  473.   ; make a copy of our initial coords
  474.  
  475.   movem.l D0/A4,-(sp)
  476.   lea     coords,A4
  477.   move.l  0(A4),8(A4)
  478.   move.l  4(A4),12(A4)
  479.   movem.l (sp)+,D0/A4
  480.   bsr     drawframe
  481.   endc ;wuslon
  482.  
  483.  
  484. \xloop:
  485.  
  486.   ifd  moderate
  487.   cmp.w   D4,d2      ; if we are one x-step before the last then
  488.   bge.s   \goonx     ; we set the speed to 1 in order to reach
  489.   moveq   #1,D4      ; exactly the borders of our rectangle.
  490. \goonx:              ; (compiles to nothing if moderate is undefined)
  491.   endc ;moderate
  492.  
  493.   cmp.w   D4,d2                       ; while dx>speed     (better than dx > 0)
  494.   ble     \alldone
  495.   add.w   d3,d5                       ; modulo += dy
  496.  
  497. \yloop:
  498.  
  499.   ifd moderate
  500.   cmp.w   D4,d3      ; if we are one y-step before the last then
  501.   bge.s   \goony     ; we set the speed to 1 in order to reach
  502.   moveq   #1,D4      ; exactly the borders of our rectangle.
  503. \goony:              ; (compiles to nothing if moderate is undefined)
  504.   endc ;moderate
  505.  
  506.   cmp.w   d2,d5                       ; while modulo>dx
  507.   ble     \ydone
  508.   cmp.w   D4,d3                       ; ... and dy>step    (better than dy > 0)
  509.   ble     \ydone
  510.   sub.w   d2,d5                       ; modulo -= dx
  511.   sub.w   D4,d3                       ; dy -= D4 (speed)
  512.  
  513.   ifd wuslon
  514.   bsr     swapframes
  515.   endc ;wuslon
  516.   bsr     drawframe
  517.   jsr     (A0)                        ; compute coords
  518.   bsr     drawframe
  519.   bra     \yloop                      ; wend (y)
  520.  
  521. \ydone:
  522.   sub.w   D4,d2                       ; dx -= D4 (speed)
  523.  
  524.   ifd wuslon
  525.   bsr     swapframes
  526.   endc ;wuslon
  527.   bsr     drawframe
  528.   jsr     (A0)                        ; compute coords
  529.   bsr     drawframe
  530.   bra     \xloop                      ; wend (x)
  531.  
  532. \alldone:
  533.   bsr     drawframe                   ; delete the last box
  534.   ifd wuslon
  535.   bsr     swapframes
  536.   bsr     drawframe
  537.   endc ;wuslon
  538.  
  539. \noframes:
  540.   rts
  541.  
  542.   ; Here we [c]ompute the [c]oords of our rectangle for later use by drawframe.
  543.   ; In case of cc_open we turn the vector (dx|dy) that way that it points from
  544.   ; the corners of our rectangle to it's center.  In the other case (cc_close)
  545.   ; we make it point from the center to the corners.
  546.  
  547. cc_open:
  548.  
  549.   ; D0.W  x-pos of the box center    ( unmodified )
  550.   ; D1.W  y-pos of the box center    ( unmodified )
  551.   ; D2.W  dx                         ( unmodified )
  552.   ; D3.W  dy                         ( unmodified )
  553.   ; D6.W  rectangle width / 2        ( unmodified )
  554.   ; D7.W  rectangle height / 2       ( unmodified )
  555.  
  556.   movem.l D2-D3,-(sp)
  557.   neg.w   D2
  558.   add.w   D6,D2
  559.   neg.w   D3
  560.   add.w   D7,D3
  561.   bsr     cc_close
  562.   movem.l (sp)+,D2-D3
  563.   rts
  564.  
  565. cc_close:
  566.  
  567.   ; D0.W  x-pos of the box center    ( unmodified )
  568.   ; D1.W  y-pos of the box center    ( unmodified )
  569.   ; D2.W  dx                         ( unmodified )
  570.   ; D3.W  dy                         ( unmodified )
  571.  
  572.   movem.l D4/A0,-(sp)
  573.  
  574.   lea     coords,A0                   ; base pointer of our array
  575.  
  576.   move.w  d0,d4
  577.   sub.w   d2,d4
  578.   move.w  d4,(A0)+                    ; x-dx (left edge)
  579.  
  580.   move.w  d0,d4
  581.   add.w   d2,d4
  582.   move.w  d4,(A0)+                    ; x+dx (right edge)
  583.  
  584.   move.w  d1,d4
  585.   sub.w   d3,d4
  586.   move.w  d4,(A0)+                    ; y-dy (top edge)
  587.  
  588.   move.w  d1,d4
  589.   add.w   d3,d4
  590.   move.w  d4,(A0)                     ; y+dy (bottom edge)
  591.  
  592.   movem.l (sp)+,D4/A0
  593.   rts
  594.  
  595.   ; here we perform the wuslon stuff
  596.  
  597.   ifd wuslon
  598. swapframes:
  599.   movem.l D0/A4,-(sp)
  600.   lea     coords,A4
  601.   move.l  0(A4),D0
  602.   move.l  8(A4),0(A4)
  603.   move.l  D0,8(A4)
  604.   move.l  4(A4),D0
  605.   move.l  12(A4),4(A4)
  606.   move.l  D0,12(A4)
  607.   movem.l (sp)+,D0/A4
  608.   rts
  609.   endc ; wuslon
  610.  
  611.   ; here we draw the box with the coords in our array.
  612.  
  613. drawframe:                            ; RastPort pointer needed in A1
  614.  
  615.   movem.l D0-D7/A0-A6,-(sp)           ; ALL registers remain unchanged
  616.  
  617.   link    A5,#-4                      ; A5 is expected to be unchanged !
  618.   move.l  A1,-4(A5)                   ; save the RastPort
  619.   lea     coords,A4                   ; A4 is expected to be unchanged !
  620.  
  621.   move.w  0(A4),D0                    ; LeftEdge
  622.   move.w  4(A4),D1                    ; TopEdge
  623.   move.l  -4(A5),A1                   ; RastPort
  624.   move.l  _GfxBase,A6
  625.   jsr     _LVOMove(A6)
  626.  
  627.   move.w  2(A4),D0                    ; RightEdge
  628.   move.w  4(A4),D1                    ; TopEdge
  629.   move.l  -4(A5),A1                   ; RastPort
  630.   move.l  _GfxBase,A6
  631.   jsr     _LVODraw(A6)
  632.  
  633.   move.w  2(A4),D0                    ; RightEdge
  634.   move.w  6(A4),D1                    ; BottomEdge
  635.   move.l  -4(A5),A1                   ; RastPort
  636.   move.l  _GfxBase,A6
  637.   jsr     _LVODraw(A6)
  638.  
  639.   move.w  0(A4),D0                    ; LeftEdge
  640.   move.w  6(A4),D1                    ; BottomEdge
  641.   move.l  -4(A5),A1                   ; RastPort
  642.   move.l  _GfxBase,A6
  643.   jsr     _LVODraw(A6)
  644.  
  645.   lea     coords,A4
  646.   move.w  0(A4),D0                    ; LeftEdge
  647.   move.w  4(A4),D1                    ; TopEdge
  648.   move.l  -4(A5),A1                   ; RastPort
  649.   move.l  _GfxBase,A6
  650.   jsr     _LVODraw(A6)
  651.  
  652. \exit:
  653.   unlk    A5
  654.   movem.l (sp)+,D0-D7/A0-A6
  655.   rts
  656.  
  657.   section nice,data
  658.  
  659. coords:   dc.w  0,0,0,0               ; x-dx, x+dx, y-dy, y+dy
  660.           dc.w  0,0,0,0               ; (wuslon)
  661.           even
  662.  
  663.   section patch,code
  664.  
  665.   xdef _PatchOpenWindow
  666.   xdef _PatchCloseWindow
  667.   xdef _OldOpenWindow
  668.   xdef _OldCloseWindow
  669.  
  670. NewOpenWindow:
  671.   move.l  A0,-(sp)
  672.   bsr     _NiceOpenWindow
  673.   adda.l  #4,sp
  674.   rts
  675.  
  676. NewCloseWindow:
  677.   move.l  A0,-(sp)
  678.   bsr     _NiceCloseWindow
  679.   adda.l  #4,sp
  680.   rts
  681.  
  682. _PatchOpenWindow:
  683.  
  684.   movem.l D0-D7/A0-A6,-(sp)
  685.   link    A5,#-4
  686.   lea     IntuitionName,A1
  687.   moveq   #LIBRARY_VERSION,D0
  688.   move.l  (_SysBase).W,A6
  689.   jsr     _LVOOpenLibrary(A6)
  690.   move.l  D0,-4(A5)
  691.   beq     \exit
  692.   move.l  (_SysBase).W,A6
  693.   jsr     _LVOForbid(A6)
  694.   move.l  -4(A5),A1                   ; library= IntuitionBase
  695.   suba.l  A0,A0
  696.   move.w  #_LVOOpenWindow,A0          ; funcOffset= #_LVOOpenWindow
  697.   move.l  #NewOpenWindow,D0           ; funcEntry= NewOpenWindow()
  698.   move.l  (_SysBase).W,A6
  699.   jsr     _LVOSetFunction(A6)
  700.   move.l  D0,_OldOpenWindow           ; save oldFunc ptr
  701.   move.l  (_SysBase).W,A6
  702.   jsr     _LVOPermit(A6)
  703.   move.l  -4(A5),A1                   ; IntuitionBase
  704.   move.l  (_SysBase).W,A6
  705.   jsr     _LVOCloseLibrary(A6)  
  706. \exit:
  707.   unlk    A5
  708.   movem.l (sp)+,D0-D7/A0-A6
  709.   rts
  710.  
  711. _PatchCloseWindow:
  712.  
  713.   movem.l D0-D7/A0-A6,-(sp)
  714.   link    A5,#-4
  715.   lea     IntuitionName,A1
  716.   moveq   #LIBRARY_VERSION,D0
  717.   move.l  (_SysBase).W,A6
  718.   jsr     _LVOOpenLibrary(A6)
  719.   move.l  D0,-4(A5)
  720.   beq     \exit
  721.   move.l  (_SysBase).W,A6
  722.   jsr     _LVOForbid(A6)
  723.   move.l  -4(A5),A1                   ; library= IntuitionBase
  724.   suba.l  A0,A0
  725.   move.w  #_LVOCloseWindow,A0         ; funcOffset= #_LVOCloseWindow
  726.   move.l  #NewCloseWindow,D0          ; funcEntry= NewCloseWindow()
  727.   move.l  (_SysBase).W,A6
  728.   jsr     _LVOSetFunction(A6)
  729.   move.l  D0,_OldCloseWindow          ; save oldFunc ptr
  730.   move.l  (_SysBase).W,A6
  731.   jsr     _LVOPermit(A6)
  732.   move.l  -4(A5),A1                   ; IntuitionBase
  733.   move.l  (_SysBase).W,A6
  734.   jsr     _LVOCloseLibrary(A6)
  735. \exit:
  736.   unlk    A5
  737.   movem.l (sp)+,D0-D7/A0-A6
  738.   rts
  739.  
  740.   section patch,data
  741.  
  742. _OldOpenWindow:   dc.l 0
  743. _OldCloseWindow:  dc.l 0
  744.  
  745.   END
  746.