***************************************************
* The ASM Version of the Example of the Generic   *
* rtgmaster game videodriver. The Generic         *
* rtgmaster videodriver is a linkable object file *
* that works together with any C or ASM code and  *
* should work okay as video driver for most       *
* games. It already opens all needed libraries    *
* and all that stuff. It is coded in C, but       *
* internally calls a lot of ASM functions. It is  *
* in fact used by some of the games mentioned     *
* in the rtgmaster docs. This example is a simple *
* example about how to use this driver.           *
* The driver does not give you all features of    *
* rtgmaster, but it is more easy to use for       *
* people who never used libraries before.         *
* You have to install the rtgmaster includes      *
* to use it.                                      *
***************************************************

 Include "vid_rtgm.i"
 XDEF _StartIt

_StartIt

***************************************************
* We want to copy a 320x200 rectangle, later.     *
***************************************************

    lea myrect,a0
    move.l #64,vr_x(a0)
    move.l #64,vr_y(a0)
    move.l #128,vr_width(a0)
    move.l #100,vr_height(a0)

***************************************************
* Init the modes. We want only LUT8 modes (8 Bit  *
* modes. If we would like for example LUT8 or     *
* RGB16 or RGB15 modes, we would provide          *
* LUT8+RGB16+RGB15 as parameter. Look at          *
* vid_rtgm.i for the possible constants. These    *
* constants show you all colortypes available     *
* on Amiga GFX Boards. Only 8 Bit is the same     *
* on all boards. We want to use an invisible      *
* pointer. We don't want to use an extra vram     *
* buffer to be allocated (if we would want that,  *
* the extra buffer would be available with the    *
* variable extravram.                             *
**************************************************/

***************************************************
* types :                                         *
* MOVE16 = use Move16 for 8 Bit, rtgmaster        *
* CopyRtgPixelArray for 15/16/24 Bit.             *
* RTGMASTER = use rtgmaster CopyRtgPixelArray for *
* all depths. (Move16 does not run on all hard-   *
* ware, so be sure to allow this option. rtgmaster*
* function is not much slower than the other      *
* possible functions.                             *
* BLITTER = Use the GFX Board Blitter to fake     *
* Doublebuffering. This is quite slow.            *
* DOUBLEBUFFER = Use Doublebuffering. This does   *
* flicker on some machines.                       *
***************************************************

***************************************************
* Speed :                                         *
* RTGMASTER = 1.0 (higher value = faster)         *
* COPY_MOVE_MOVE without Src/Destination Offset   *
* = 1.002                                         *
* COPY_MOVEM_MOVEM = 1.215                        *
* FCOPY = 1.227                                   *
* Source of this driver is provided, so if you    *
* want to change the copy function to be used,    *
* simply modify the vid_rtgm.c and fcopy.s        *
* files.                                          *
***************************************************

***************************************************
* 0 is no extra vram buffer, 1 is use extra vram  *
* buffer. This buffer is free to do everything    *
* with it you want to do with it.                 *
***************************************************

***************************************************
* Move16 and Rtgmaster use a Fastcopy Buffer for  *
* buffer, the other two methods use a slower      *
* Videoram Buffer.                                *
***************************************************

    move.l #LUT8,d0
    move.l #MOVEM,d1
    move.l #NOPOINTER,d2
    move.l #0,d3

***************************************************
* This example does not use the Screenmode-       *
* Requester. If you want an example using the     *
* Screenmode-Requester, have a look at the C      *
* example (you have to provide a MyMode structure *
* in a0 then).                                    *
***************************************************

    move.l #0,a0
    jsr _RTGM_Init

***************************************************
* Init the example Palette.                       *
***************************************************

    lea palette,a0
    move.l #768,d1
palloop:
    move.b #0,(a0)+
    dbra d1,palloop
    lea palette,a0
    move.b #255,3(a0)

    cmp.l #0,d0
    beq Quit

***************************************************
* In this example we simply use the first         *
* available screenmode :)                         *
* An actual game should better use a Screenmode   *
* of a certain size, for example 320x200.         *
***************************************************

    move.l d0,a0
    move.l a0,modes
    lea lvid,a1
    move.l vm_width(a0),d0
    move.l d0,vd_width(a1)
    move.l vm_height(a0),d0
    move.l d0,vd_height(a1)
    move.l vm_rowbytes(a0),d0
    move.l d0,vd_rowbytes(a1)

***************************************************
* Set the Mode, open the Screen, set the Palette. *
***************************************************

    move.l a1,a0
    move.l modes,a1
    move.l vm_setmode(a1),a2
    jsr (a2)
    lea lvid,a0
    move.l modes,a1
    lea palette,a2
    move.l vm_setpalette(a1),a3
    jsr (a3)
    jsr _RTGM_SetPalette

***************************************************
* The Mainloop of this example consists of a      *
* Buffer-Swapping (MOVE16 and RTGMASTER use       *
* CPU-Copy, BLITTER uses Blitter-Copy,            *
* DOUBLEBUFFER uses Doublebuffering (which does   *
* not run flickerfree on some GFX Boards, support *
* at least RTGMASTER !!!) To render the offscreen *
* Buffer, render to lvid.buffer !!!               *
* If you provide the parameter VID_WAIT_NONE, no  *
* synching will be done. Synching is only needed  *
* for DOUBLEBUFFERING, MOVE16, RTGMASTER and      *
* BLITTER do not need it.                         *
* For trying the thing out, i am initializing the *
* backbuffer to some values.                      *
***************************************************

    move.l #16000,d0
    sub.l #1,d0
    lea lvid,a0
    move.l vd_buffer(a0),a0
theloop:
    move.l #$01010101,(a0)+
    dbra d0,theloop

***************************************************
* For "Loading..." symbols and something like that*
* this driver has the calls begindirectrect and   *
* enddirectrect. They store the Background.       *
* They use simple longwordcopy, so they are not   *
* fast. They can't handle anything bigger than    *
* 24x24. They work in 8/15/16/24 Bit.             *
***************************************************

    lea lvid,a0
    move.l modes,a1
    move.l #160,d0
    move.l #100,d1
    lea symbol,a2
    move.l #3,d2
    move.l #3,d3
    move.l vm_begindirectrect(a1),a3
    jsr (a3)

***************************************************
* Wait for the user to press the left mousebutton *
* to remove the thing again.                      *
***************************************************

waitloop:
    btst #6,$bfe001
    bne waitloop

    lea lvid,a0
    move.l modes,a1
    move.l #160,d0
    move.l #100,d1
    move.l #3,d2
    move.l #3,d3
    move.l vm_enddirectrect(a1),a2
    jsr (a2)

mainloop:

    lea lvid,a0
    move.l modes,a1
    lea myrect,a2
    move.l #VID_WAIT_VSYNC,d0
    move.l vm_swapbuffers(a1),a3
    jsr (a3)

***************************************************
* Sys_SendKeyEvent only reacts on Keypresses. If  *
* you also want Mouseevents, you have to modify   *
* the vid_rtgm.c or use rtgmaster functions to do *
* so. Sys_SendKeyEvent returns RawKey codes or 0. *
* It includes the KeyUp/KeyDown information.      *
***************************************************

    move.l modes,a1
    move.l vm_sendkeyevents(a1),a2
    jsr (a2)

***************************************************
* This function returns keypress information in   *
* me_rawkey, qualifiers (like Shift) in           *
* me_qualifier, mouse info (like MENUUP) in       *
* me_mouse, and it ALWAYS returns the current     *
* mouseposition in me_x and me_y.                 *
* We quit on CTRL q in this example.              *
***************************************************

    move.l d0,a0
    move.w me_rawkey(a0),d0
    move.w me_qualifier(a0),d1
    cmp.w #16,d0
    bne .nope
    and.w #CONTROL,d1
    cmp.w #0,d1
    beq .nope
    bra .pressed
.nope:
    bra mainloop

***************************************************
* Before quitting, free all allocated resources.  *
***************************************************

.pressed:
    lea lvid,a0
    move.l modes,a1
    move.l vm_closemode(a1),a2
    jsr (a2)
Quit:
    rts

modes: dc.l 0
lvid: dc.l 0,0,0,0,0,0,0
myrect: dc.l 0,0,0,0,0
palette: ds.b 769,0
symbol: dc.b 1,1,1,1,1,1,1,1,1
    END
