summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/rollrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/rollrace.c')
-rw-r--r--src/mame/video/rollrace.c170
1 files changed, 170 insertions, 0 deletions
diff --git a/src/mame/video/rollrace.c b/src/mame/video/rollrace.c
new file mode 100644
index 00000000000..978c5756a25
--- /dev/null
+++ b/src/mame/video/rollrace.c
@@ -0,0 +1,170 @@
+#include "driver.h"
+
+
+static int ra_charbank[2] = { 0,0 };
+static int ra_bkgpage = 0;
+static int ra_bkgflip = 0;
+static int ra_chrbank = 0;
+static int ra_bkgpen = 0;
+static int ra_bkgcol = 0;
+static int ra_flipy = 0;
+static int ra_flipx = 0;
+static int ra_spritebank =0 ;
+
+#define RA_FGCHAR_BASE 0
+#define RA_BGCHAR_BASE 4
+#define RA_SP_BASE 5
+
+WRITE8_HANDLER( rollrace_charbank_w)
+{
+
+ ra_charbank[offset&1] = data;
+ ra_chrbank = ra_charbank[0] | (ra_charbank[1] << 1) ;
+}
+
+
+WRITE8_HANDLER( rollrace_bkgpen_w)
+{
+ ra_bkgpen = data;
+}
+
+WRITE8_HANDLER(rollrace_spritebank_w)
+{
+ ra_spritebank = data;
+}
+
+WRITE8_HANDLER(rollrace_backgroundpage_w)
+{
+
+ ra_bkgpage = data & 0x1f;
+ ra_bkgflip = ( data & 0x80 ) >> 7;
+
+ /* 0x80 flip vertical */
+}
+
+WRITE8_HANDLER( rollrace_backgroundcolor_w )
+{
+ ra_bkgcol = data;
+}
+
+WRITE8_HANDLER( rollrace_flipy_w )
+{
+ ra_flipy = data & 0x01;
+}
+
+WRITE8_HANDLER( rollrace_flipx_w )
+{
+ ra_flipx = data & 0x01;
+}
+
+VIDEO_UPDATE( rollrace )
+{
+
+ int offs;
+ int sx, sy;
+ int scroll;
+ int col;
+
+ /* fill in background colour*/
+ fillbitmap(bitmap,machine->pens[ra_bkgpen],&machine->screen[0].visarea);
+
+ /* draw road */
+ for (offs = videoram_size - 1;offs >= 0;offs--)
+ {
+ if(!(ra_bkgflip))
+ {
+ sy = ( 31 - offs / 32 ) ;
+ }
+ else
+ sy = ( offs / 32 ) ;
+
+ sx = ( offs%32 ) ;
+
+ if(ra_flipx)
+ sx = 31-sx ;
+
+ if(ra_flipy)
+ sy = 31-sy ;
+
+ drawgfx(bitmap,
+ machine->gfx[RA_BGCHAR_BASE],
+ memory_region(REGION_USER1)[offs + ( ra_bkgpage * 1024 )] \
+ + ((( memory_region(REGION_USER1)[offs + 0x4000 + ( ra_bkgpage * 1024 )] & 0xc0 ) >> 6 ) * 256 ) ,
+ ra_bkgcol,
+ ra_flipx,(ra_bkgflip^ra_flipy),
+ sx*8,sy*8,
+ &machine->screen[0].visarea,TRANSPARENCY_PEN,0);
+
+
+ }
+
+
+
+
+ /* sprites */
+ for ( offs = 0x80-4 ; offs >=0x0 ; offs -= 4)
+ {
+ int s_flipy = 0;
+ int bank = 0;
+
+ sy=spriteram[offs] - 16;
+ sx=spriteram[offs+3] - 16;
+
+ if(sx && sy)
+ {
+
+ if(ra_flipx)
+ sx = 224 - sx;
+ if(ra_flipy)
+ sy = 224 - sy;
+
+ if(spriteram[offs+1] & 0x80)
+ s_flipy = 1;
+
+ bank = (( spriteram[offs+1] & 0x40 ) >> 6 ) ;
+
+ if(bank)
+ bank += ra_spritebank;
+
+ drawgfx(bitmap, machine->gfx[ RA_SP_BASE + bank ],
+ spriteram[offs+1] & 0x3f ,
+ spriteram[offs+2] & 0x1f,
+ ra_flipx,!(s_flipy^ra_flipy),
+ sx,sy,
+ &machine->screen[0].visarea,TRANSPARENCY_PEN,0);
+ }
+ }
+
+
+
+
+ /* draw foreground characters */
+ for (offs = videoram_size - 1;offs >= 0;offs--)
+ {
+
+ sx = offs % 32;
+ sy = offs / 32;
+
+ scroll = ( 8 * sy + colorram[2 * sx] ) % 256;
+ col = colorram[ sx * 2 + 1 ]&0x1f;
+
+ if (!ra_flipy)
+ {
+ scroll = (248 - scroll) % 256;
+ }
+
+ if (ra_flipx) sx = 31 - sx;
+
+ drawgfx(bitmap,machine->gfx[RA_FGCHAR_BASE + ra_chrbank] ,
+ videoram[ offs ] ,
+ col,
+ ra_flipx,ra_flipy,
+ 8*sx,scroll,
+ &machine->screen[0].visarea,TRANSPARENCY_PEN,0);
+
+ }
+
+
+
+ return 0;
+}