diff options
Diffstat (limited to 'src/mame/video/rollrace.c')
-rw-r--r-- | src/mame/video/rollrace.c | 170 |
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; +} |