home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / disks / disk393.lzh / LibTool / AsmComplex / Complex.asm next >
Assembly Source File  |  1990-10-28  |  6KB  |  192 lines

  1. ;NOTE: The libstartup code generated by LibTool opens the exec, DOS, Intuition,
  2. ;      and Graphics libraries for our library functions and stores the bases
  3. ;      at the following variables respectively. Therefore, our library code
  4. ;      doesn't have to open these libs in order use their routines, nor close
  5. ;      these libs. The next XREF statement should always be included in any
  6. ;      lib code.
  7. ;NOTE: If you need to open any other libraries, it would be good to do so from
  8. ;      within an Init vector. Remember to also add an Expunge vector which
  9. ;      closes those libs.
  10.  
  11.     XREF    _SysBase,_DOSBase,_IntuitionBase,_GfxBase
  12.  
  13. ;If you need to examine your lib base structure (for some reason) make it
  14. ;visible here
  15.  
  16.     XREF    _LibBase
  17.  
  18.     XREF    _LVOForbid,_LVOPermit,_LVOAllocMem,_LVOFreeMem
  19.     XREF    _LVOAddTail,_LVORemTail,_LVOWaitPort,_LVOGetMsg,_LVORemove
  20.     XREF    _LVOOpenWindow,_LVOCloseWindow
  21.     XREF    _LVOMove,_LVOText
  22.  
  23. ;=============================================================
  24. ; This is the first function in the library. First it finds the mem that was
  25. ; allocated for this task when the task opened the library (i.e. from within
  26. ; GetMem). Then it copies a newWindow template to this mem. Note that it is
  27. ; ok to have newWindow global because we don't modify it at all. We simply
  28. ; copy it to a the mem that we use for the task. Actually, it would have been
  29. ; easier/quicker to get the mem from the stack, but I wanted to demo using
  30. ; the Open/Close vectors. Finally, it opens the window and returns the result.
  31.  
  32.     XDEF    MakeWindow    ;make it visible to our libstartup code
  33. MakeWindow:
  34.     move.l    a6,-(sp)    ;no lib routine should destroy d2-d7/a2-a6
  35. ;---Find this task's work buffer
  36.     bsr.s    FindMem
  37.     beq.s    1$
  38. ;---Copy the newWindow template to our work buffer
  39.     movea.l    d0,a0
  40.     moveq    #48-1,d1
  41.     lea    newWindow(pc),a1
  42. 2$    move.b    (a1)+,(a0)+
  43.     dbra    d1,2$(pc)
  44. ;---Open the window
  45.     movea.l    d0,a0
  46.     movea.l    _IntuitionBase,a6
  47.     jsr    _LVOOpenWindow(a6)
  48. 1$    movea.l    (sp)+,a6
  49.     rts
  50.  
  51. ;=============================================================
  52. ; This finds the address of the task's work buffer allocated when the task
  53. ; opened the library. Note that this is for internal use only, and is not
  54. ; XDEF or included as a callable function in our fd file.
  55.  
  56. FindMem:
  57. ;---Stop another task from getting in here while we examine memList
  58. ;   This is what you have to do when you use globals that can be modified
  59. ;   (memList).
  60.     movea.l    _SysBase,a6
  61.     jsr    _LVOForbid(a6)
  62. ;---Get this task's address
  63.     move.l    276(a6),d1
  64. ;---Find this task's allocated memory
  65.     move.l    memList(pc),d0
  66. 2$    movea.l    d0,a0
  67.     move.l    (a0),d0
  68.     beq.s    1$        ;return(0) if we can't find the mem!!!
  69.     cmp.l    8(a0),d1
  70.     bne.s    2$
  71. ;---Skip the first 12 bytes
  72.     moveq    #12,d0
  73.     add.l    a0,d0
  74. 1$    move.l    d0,-(sp)
  75. ;---Permit again
  76.     jsr    _LVOPermit(a6)
  77. ;---Return 0 or the address of our "work buffer"
  78.     move.l    (sp)+,d0
  79.     rts
  80.  
  81. ;=============================================================
  82. ; This is the second function in the library. It moves to the passed x and
  83. ; y coordinates, prints the passed msg in the passed window, then waits for
  84. ; a CLOSEWINDOW press before returning.
  85.  
  86.     XDEF    PrintMsg
  87. PrintMsg:
  88.     movem.l    a2/a3/a6,-(sp)
  89.     movea.l    a0,a2
  90.     movea.l    a1,a3
  91. ;---Move to (x,y)
  92.     movea.l    50(a2),a1    ;RastPort
  93.     movea.l    _GfxBase,a6
  94.     jsr    _LVOMove(a6)
  95. ;---(Get its length) and print the msg    
  96.     movea.l    a3,a0
  97. 1$    move.b    (a3)+,d0
  98.     bne.s    1$
  99.     subq.l    #1,a3
  100.     suba.l    a0,a3
  101.     move.l    a3,d0        ;the # of bytes not counting end NULL
  102.     beq.s    2$
  103.     movea.l    50(a2),a1
  104.     jsr    _LVOText(a6)
  105. ;---Wait for CLOSEWINDOW (the only msg we expect), remove it, and return
  106. 2$    movea.l    _SysBase,a6
  107.     movea.l    86(a2),a0
  108.     jsr    _LVOWaitPort(a6)
  109.     movea.l    86(a2),a0
  110.     jsr    _LVOGetMsg(a6)
  111.     movem.l    (sp)+,a2/a3/a6
  112.     rts
  113.  
  114. ;=============================================================
  115. ; This is the third function in the library. It closes the passed window.
  116.  
  117.     XDEF    RemWindow
  118. RemWindow:
  119.     move.l    a6,-(sp)
  120.     movea.l    _IntuitionBase,a6
  121.     jsr    _LVOCloseWindow(a6)
  122.     movea.l    (sp)+,a6
  123.     rts
  124.  
  125. ;=======================================================================
  126. ; These next 2 are called when an application opens and closes the lib
  127. ; respectively. The Open vector allocates a work buffer of 48 bytes for
  128. ; a newWindow structure, plus 8 bytes to link it into memList, plus 4 bytes
  129. ; to store the app's task address (which is what we use to indentify its
  130. ; work buffer in the list). The Close vector simply removes/frees the closing
  131. ; task's work buffer.
  132. ; Note that we don't have to Forbid/Permit when we access the memList because
  133. ; the task switching is already forbidden when these routines are called.
  134. ; For this reason, we should never do any kind of Wait() in here.
  135. ; We also don't have to save a6 since that is already done for us as well
  136.  
  137.     XDEF    OpenUp
  138. OpenUp:
  139. ;---Get a zeroed, work buffer
  140.     movea.l    _SysBase,a6
  141.     moveq    #8+4+48,d0
  142.     moveq    #1,d1
  143.     bset.l    #16,d1
  144.     jsr    _LVOAllocMem(a6)
  145.     move.l    d0,d1
  146.     beq.s    1$        ;return 0
  147. ;---Store the task address
  148.     movea.l    d0,a1
  149.     move.l    276(a6),8(a1)
  150. ;---Link it into memList
  151.     lea    memList(pc),a0
  152.     jsr    _LVOAddTail(a6)
  153.     moveq    #1,d0        ;OK
  154. 1$    rts
  155.  
  156.     XDEF    CloseUp
  157. CloseUp
  158.     move.l    a2,-(sp)
  159. ;---Find the work buffer
  160.     bsr    FindMem
  161.     beq.s    1$
  162. ;---Remove it from the list
  163.     movea.l    d0,a2
  164.     suba.w    #12,a2
  165.     movea.l    a2,a1
  166.     jsr    _LVORemove(a6)
  167. ;---Free it
  168.     movea.l    a2,a1
  169.     moveq    #8+4+48,d0
  170.     jsr    _LVOFreeMem(a6)
  171. 1$    movea.l    (sp)+,a2
  172.     rts
  173.  
  174. ;an initialized, empty list to hold the address of each task's work buffer
  175. memList    dc.l    memList+4
  176.     dc.l    0
  177.     dc.l    memList
  178.  
  179. ;a newWindow structure to be used as a template
  180. newWindow:
  181.     dc.w    10,10,200,180
  182.     dc.b    0,1
  183. ;CLOSEWINDOW
  184.     dc.l    $200
  185. ;SMART_REFRESH|ACTIVATE|WINDOWDRAG|WINDOWDEPTH|WINDOWSIZING
  186.     dc.l    $100f
  187.     dc.l    0,0
  188.     dc.l    0
  189.     dc.l    0,0
  190.     dc.w    100,35,-1,-1
  191.     dc.w    1
  192.