home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / DEVPAC31.LZH / EXAMPLES / GEMTEST.S < prev   
Text File  |  1992-08-06  |  7KB  |  294 lines

  1.  
  2. * a sample GEM program supplied with Devpac
  3.  
  4. * Source code Copyright (C) 1988,1992 HiSoft. All rights reserved.
  5. * No part of this source may be reproduced, transmitted,
  6. * transcribed, or stored in a retrieval system, or translated
  7. * in any form or by any means without the prior written
  8. * permission of HiSoft.
  9.  
  10. * HiSoft makes no representations or warranties with respect
  11. * to the contents hereof and specifically disclaims any
  12. * implied warranties or merchantability or fitness for any
  13. * particular purpose.
  14.  
  15. * feel free to use any or all of the object code
  16.  
  17. * If you cannot assemble this exactly as supplied, tell us.
  18. * If the object doesn't run after you have made any changes,
  19. * please do not tell us, as you're on your own once you
  20. * start messing with it!
  21.  
  22. * this is mainly to show the calling sequence for GEM
  23. * from assembler - the program itself doesn't do much
  24.  
  25. * last changed:6.8.92
  26. * updated to use Devpac3 style names & options
  27.  
  28.     opt    XDEBUG        dump long labels for debugging
  29.  
  30.     include    gemmacro.i
  31.  
  32. * the program proper
  33. start    move.l    4(a7),a3        base page
  34.     move.l    #mystack,a7
  35.     move.l    $c(a3),d0        text len
  36.     add.l    $14(a3),d0        data len
  37.     add.l    $1c(a3),d0        BSS len
  38.     add.l    #$100,d0        basepage
  39.     move.l    d0,-(sp)
  40.     move.l    a3,-(sp)
  41.     clr.w    -(sp)
  42.     move.w    #$4a,-(sp)
  43.     trap    #1            shrink memory
  44.     lea    12(sp),sp
  45.  
  46.     appl_init
  47.     move.w    d0,ap_id        store the application id
  48.  
  49.     graf_handle
  50.     move.w    d0,current_handle    Desktop's VDI handle
  51.  
  52. * start by opening a virtual workstation
  53.     lea    intin,a0
  54.     moveq    #10-1,d0        -1 for DBF
  55. .fill    move.w    #1,(a0)+        most params are 1
  56.     dbf    d0,.fill
  57.     move.w    #2,(a0)+        use RC system
  58.  
  59.     v_opnvwk            open it
  60.  
  61. * set the mouse to an arrow
  62.     graf_mouse    #0        arrow please
  63.  
  64. * we want to open a window, so find the usable size of the screen
  65.     wind_get    #0,#4        work area of Desktop
  66.  
  67. * the type of the window
  68. wtype    equ %000000101111        title, close, full, move, size
  69.  
  70. * the size lies in int_out(1..4), so calculate the window size
  71.     movem.w    int_out+2,d0-d3
  72.     wind_calc    #wtype,#1,d0,d1,d2,d3    want work area
  73.  
  74. * now remember its offsets
  75.     move.w int_out+2,xstart
  76.     move.w int_out+4,ystart
  77.     move.w int_out+6,xwidth
  78.     move.w int_out+8,ywidth
  79.  
  80. * and create the window
  81.     movem.w    int_out+2,d0-d3
  82.     wind_create    #wtype,d0,d1,d2,d3
  83.     move.w    d0,w_handle        save the handle (error checks?)
  84.  
  85. * now set its title
  86.     move.l    #windowname,int_in+4
  87.     wind_set    w_handle,#2    title string
  88.  
  89. * now actually show it by opening
  90.     movem.w    xstart,d0-d3
  91.     add.w    #10,d0            x start
  92.     add.w    #10,d1            y start
  93.     sub.w    #20,d2            width
  94.     sub.w    #20,d3            height
  95.     wind_open    w_handle,d0,d1,d2,d3
  96.  
  97.     bsr    recalcwindow
  98.     bsr    setupmode
  99.  
  100. * the main loop of the application
  101. * the only interesting events are messages
  102. waitforevent
  103.     evnt_mesag    #messagebuf
  104.     lea    messagebuf,a0
  105.     move.w    (a0),d0            message type
  106.     cmp.w    #20,d0
  107.     beq    updateit            if Redraw
  108.     cmp.w    #22,d0
  109.     beq    quit            if Close button
  110.     cmp.w    #23,d0
  111.     beq    fullit            if Full button
  112.     cmp.w    #27,d0
  113.     beq    sizeit            if re-size required
  114.     cmp.w    #28,d0
  115.     beq    moveit            if window moved
  116.  
  117. * nothing I'm interested in so try again
  118.     bra    waitforevent
  119.  
  120. * move the window around the screen
  121. moveit    move.w    6(a0),d0
  122.     cmp.w    w_handle,d0
  123.     bne    waitforevent        if not my window then don't
  124. changedwindow
  125.     move.w    8(a0),int_in+4        new x pos
  126.     move.w    10(a0),int_in+6        new y pos
  127.     move.w    12(a0),d0
  128.     cmp.w    #40,d0
  129.     bcc.s    .wok
  130.     moveq    #40,d0            can't be too narrow
  131. .wok    move.w    d0,int_in+8        width
  132.     move.w    14(a0),d0
  133.     cmp.w    #50,d0
  134.     bcc.s    .hok
  135.     moveq    #50,d0            can't be too thin either
  136. .hok    move.w    d0,int_in+10        height
  137.  
  138.     wind_set    w_handle,#5
  139.  
  140.     movem.w    xwidth,d4-d5        old size
  141.     bsr    recalcwindow
  142.     cmp.w    xwidth,d4
  143.     bcs    waitforevent
  144.     cmp.w    ywidth,d5
  145.     bcs    waitforevent
  146.     bne.s    forceupdate
  147.     cmp.w    xwidth,d4
  148.     beq    waitforevent        not if exactly the same
  149. * if the new size is smaller in both dimensions than the old size
  150. * then an update event will not be posted, so the re-draw will
  151. * have to be done manually
  152. forceupdate
  153.     bsr    drawwindow        draw it
  154.     bra    waitforevent        and carry on
  155.  
  156. * re-size the window
  157. sizeit    move.w    6(a0),d0
  158.     cmp.w    w_handle,d0
  159.     bne    waitforevent        if not my window
  160.     bra    changedwindow
  161.  
  162. * there's an update
  163. updateit
  164.     move.w    6(a0),d0
  165.     cmp.w    w_handle,d0
  166.     bne    waitforevent        if not my window
  167. * there are two ways of doing updates:
  168. * (a) to support overlapping windows
  169. * this takes a lot of code, and is very slow and tricky
  170. * (b) to ignore the possibility of overlapping windows
  171. * this takes little code and is easy
  172. * Here method (b) is used! (method (a) is needed if you have a Desk
  173. * menu or multi-windows in your program - this doesn't have either
  174. * -that's my excuse and I'm sticking to it!)
  175.  
  176. * start by clipping the rectangle
  177.     movem.w    8(a0),d0-d3        the rectangle
  178.     add.w    d0,d2
  179.     add.w    d1,d3
  180.     vs_clip    #1,d0,d1,d2,d3        clipping on
  181.  
  182.     bsr    drawwindow            draw the window
  183.     bra    waitforevent
  184.  
  185. * the full button has been clicked
  186. * this puts up an alert box
  187. fullit    form_alert    #1,#myalert
  188.     bra    waitforevent
  189.  
  190. * to go away various things have to be tidied up
  191. * starting with closing the window
  192. quit    wind_close    w_handle    close it
  193.     wind_delete    w_handle    and delete it
  194.  
  195. * then closing the virtual workstation
  196.     v_clsvwk            close it
  197.  
  198.     appl_exit            tell GEM I've finished
  199.  
  200. * now quit to the desktop
  201.     clr.w    -(a7)            status code
  202.     move.w    #$4c,-(a7)        P_TERM
  203.     trap    #1            and go away
  204.  
  205. * calculate the work area of the window
  206. recalcwindow
  207.     wind_get    w_handle,#4    get work area
  208.     movem.w    int_out+2,d0-d3
  209.     movem.w    d0-d3,xstart
  210.     rts
  211.  
  212. * this draws the picture in the window
  213. * which is an oval on top of a rectangle
  214.  
  215. * before drawing anywhere you have to hide the mouse
  216. drawwindow
  217.     v_hide_c            hide the mouse
  218.     vsf_interior    #2        pattern
  219.  
  220.     movem.w    xstart,d0-d3        AES rectangle
  221.     add.w    d0,d2
  222.     subq.w    #1,d2
  223.     add.w    d1,d3
  224.     subq.w    #1,d3            convert to VDI
  225.     vr_recfl    d0,d1,d2,d3    filled rectangle
  226. * the oval has to be drawn in the user defined pattern
  227.     vsf_interior    #4
  228.  
  229.     movem.w xstart,d0-d3
  230.     asr.w    #1,d2            half width
  231.     asr.w    #1,d3            half height
  232.     add.w    d2,d0            x centre
  233.     add.w    d3,d1            y centre
  234.     v_ellipse    d0,d1,d2,d3
  235.  
  236. * we have finished drawing so get the mouse back
  237.     v_show_c    #0        show the mouse
  238.     rts
  239.  
  240. * this prepares the drawing mode etc
  241. setupmode
  242.     move.l    #intin,a0
  243.     move.w     #%0000100101000000,(a0)+
  244.     move.w    #%0000100101000000,(a0)+
  245.     move.w    #%0000111101000000,(a0)+
  246.     move.w    #%0000100101000000,(a0)+
  247.     move.w    #%0000100101000000,(a0)+
  248.     move.w    #%0000000000000000,(a0)+
  249.     move.w    #%0110010011011100,(a0)+
  250.     move.w    #%1000101010001000,(a0)+
  251.     move.w    #%1100101011001000,(a0)+
  252.     move.w    #%0010101010001000,(a0)+
  253.     move.w    #%1100010010001000,(a0)+
  254.     REPT    16-11
  255.     clr.w    (a0)+
  256.     ENDR
  257.     move.w    #16,contrl3        single plane
  258.     vsf_updat            set user defined fill style
  259.     vsf_color    #1
  260.     rts
  261.  
  262.     SECTION    DATA
  263.  
  264. * all C strings must end in a null
  265. windowname dc.b ' An Example GEM Program by HiSoft ',0
  266.  
  267. myalert dc.b "[1][This is written in 68000|assembler using HiSoft's|"
  268.     dc.b 'Devpac Version 3][ OK ]',0
  269.  
  270. * global constants
  271.     SECTION    BSS
  272.  
  273. * these have to remain together
  274. xstart    ds.w 1
  275. ystart    ds.w 1
  276. xwidth    ds.w 1
  277. ywidth    ds.w 1
  278.  
  279. w_handle    ds.w 1
  280. ws_handle    ds.w 1
  281. ap_id        ds.w 1
  282. messagebuf    ds.b 16
  283.  
  284.     ds.l    100            stack space
  285. mystack    ds.w    1            (stacks go backwards)
  286.  
  287.  
  288. * if not linking then include the run-times
  289.  
  290.     IFEQ    __LK
  291.     include    aeslib.s
  292.     include    vdilib.s
  293.     ENDC
  294.