home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 038.lha / MacGag / support.asm < prev    next >
Assembly Source File  |  1987-05-16  |  2KB  |  56 lines

  1. ;support.asm - MacGAG support routines (c) 1987 John Hodgson
  2.  
  3. ;Compile using the Aztec AS assembler with -C and -D options
  4.  
  5.     public    _NewOpenWindow
  6.     public    _NewCloseWindow
  7.  
  8. ;Glue code notes :
  9.  
  10. ;    The idea is to be able to call this routine prior to calling the
  11. ;original routine, without disturbing the environment. A0 contains the
  12. ;New Window ptr as passed to OpenWindow, & A6 contains the library base
  13. ;pointer. Since D0 returns the result & A1 is free to be trashed, (see RKM :
  14. ;Exec) we don't worry about restoring these values. If this routine was
  15. ;compiled using small code/data, we'd have to be concerned with initializing
  16. ;and restoring A4, the code's relative base index pointer.
  17.  
  18. _NewOpenWindow:
  19.     movem.l    d1-d7/a2-a6,-(sp)
  20.     move.l    a0,-(sp)
  21.     jsr    _BoxUp
  22.     move.l    (sp)+,a0
  23.     movem.l    (sp)+,d1-d7/a2-a6
  24.     move.l    _OldOpenWindow,a1
  25.     jmp    (a1)            ;routine will rts for us
  26.  
  27. ;This routine gets a little more complicated. We call BoxDown() AFTER
  28. ;CloseWindow() in order to get the proper effect; but, BoxDown requires
  29. ;parameters in the (now deallocated) window structure! The cure? Make
  30. ;a local copy of the window contents before calling CloseWindow(), and
  31. ;pass that information to BoxDown(). Again, all this is performed on the
  32. ;stack so we can remain re-entrant.
  33.  
  34. _NewCloseWindow:
  35.     movem.l    d1-d7/a2-a6,-(sp)
  36.     sub.l    #132,sp            ;space for one Window struct
  37.     move.l    a0,a1            ;source=(window *) argument
  38.     move.l    sp,a2            ;dest=copy on stack
  39.     move.l    #32,d0            ;size in longwords
  40. .1    move.l    (a1)+,(a2)+
  41.     dbra    d0,.1            ;duplicate window contents
  42.     move.l    _OldCloseWindow,a1
  43.     jsr    (a1)            ;CloseWindow()
  44.     move.l    sp,a1
  45.     move.l    a1,-(sp)        ;push C argument
  46.     jsr    _BoxDown        ;BoxDown(windowcopy)
  47.     add.l    #136,sp            ;pop argument & Window struct
  48.     movem.l    (sp)+,d1-d7/a2-a6
  49.     rts
  50.  
  51.     public    _OldOpenWindow
  52.     public    _BoxUp
  53.  
  54.     public    _OldCloseWindow
  55.     public    _BoxDown
  56.