#include "driver.h"
UINT8 *mnchmobl_vreg;
UINT8 *mnchmobl_status_vram;
UINT8 *mnchmobl_sprite_xpos;
UINT8 *mnchmobl_sprite_attr;
UINT8 *mnchmobl_sprite_tile;
static int mnchmobl_palette_bank;
static int flipscreen;
PALETTE_INIT( mnchmobl )
{
int i;
for (i = 0;i < machine->drv->total_colors;i++)
{
int bit0,bit1,bit2,r,g,b;
/* red component */
bit0 = (color_prom[i] >> 0) & 0x01;
bit1 = (color_prom[i] >> 1) & 0x01;
bit2 = (color_prom[i] >> 2) & 0x01;
r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
/* green component */
bit0 = (color_prom[i] >> 3) & 0x01;
bit1 = (color_prom[i] >> 4) & 0x01;
bit2 = (color_prom[i] >> 5) & 0x01;
g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
/* blue component */
bit0 = (color_prom[i] >> 6) & 0x01;
bit1 = (color_prom[i] >> 7) & 0x01;
b = 0x4f * bit0 + 0xa8 * bit1;
palette_set_color(machine,i,MAKE_RGB(r,g,b));
}
}
WRITE8_HANDLER( mnchmobl_palette_bank_w )
{
if( mnchmobl_palette_bank!=(data&0x3) )
{
memset( dirtybuffer, 1, 0x100 );
mnchmobl_palette_bank = data&0x3;
}
}
WRITE8_HANDLER( mnchmobl_flipscreen_w )
{
if( flipscreen!=data )
{
memset( dirtybuffer, 1, 0x100 );
flipscreen = data;
}
}
READ8_HANDLER( mnchmobl_sprite_xpos_r ){ return mnchmobl_sprite_xpos[offset]; }
WRITE8_HANDLER( mnchmobl_sprite_xpos_w ){ mnchmobl_sprite_xpos[offset] = data; }
READ8_HANDLER( mnchmobl_sprite_attr_r ){ return mnchmobl_sprite_attr[offset]; }
WRITE8_HANDLER( mnchmobl_sprite_attr_w ){ mnchmobl_sprite_attr[offset] = data; }
READ8_HANDLER( mnchmobl_sprite_tile_r ){ return mnchmobl_sprite_tile[offset]; }
WRITE8_HANDLER( mnchmobl_sprite_tile_w ){ mnchmobl_sprite_tile[offset] = data; }
VIDEO_START( mnchmobl )
{
dirtybuffer = auto_malloc(0x100);
memset( dirtybuffer, 1, 0x100 );
tmpbitmap = auto_bitmap_alloc(512,512,machine->screen[0].format);
}
READ8_HANDLER( mnchmobl_videoram_r )
{
return videoram[offset];
}
WRITE8_HANDLER( mnchmobl_videoram_w )
{
offset = offset&0xff; /* mirror the two banks? */
if( videoram[offset]!=data )
{
videoram[offset] = data;
dirtybuffer[offset] = 1;
}
}
static void draw_status(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
{
const gfx_element *gfx = machine->gfx[0];
int row;
for( row=0; row<4; row++ )
{
int sy,sx = (row&1)*8;
const UINT8 *source = mnchmobl_status_vram + (~row&1)*32;
if( row<=1 )
{
source+=2*32;
sx+=256+32+16;
}
for( sy=0; sy<256; sy+=8 )
{
drawgfx( bitmap, gfx,
*source++,
0, /* color */
0,0, /* no flip */
sx,sy,
cliprect,
TRANSPARENCY_NONE, 0 );
}
}
}
static void draw_background(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
{
/*
ROM B1.2C contains 256 tilemaps defining 4x4 configurations of
the tiles in ROM B2.2B
*/
UINT8 *rom = memory_region(REGION_GFX2);
const gfx_element *gfx = machine->gfx[1];
int offs;
for( offs=0; offs<0x100; offs++ )
{
if( dirtybuffer[offs] )
{
int sy = (offs%16)*32;
int sx = (offs/16)*32;
int tile_number = videoram[offs];
int row,col;
dirtybuffer[offs] = 0;
for( row=0; row<4; row++ )
{
for( col=0; col<4; col++ )
{
drawgfx( tmpbitmap,gfx,
rom[col+tile_number*4+row*0x400],
mnchmobl_palette_bank,
0,0, /* flip */
sx+col*8, sy+row*8,
0, TRANSPARENCY_NONE, 0 );
}
}
}
}
{
int scrollx = -(mnchmobl_vreg[6]*2+(mnchmobl_vreg[7]>>7))-64-128-16;
int scrolly = 0;
copyscrollbitmap(bitmap,tmpbitmap,
1,&scrollx,1,&scrolly,
cliprect,TRANSPARENCY_NONE,0);
}
}
static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
{
int scroll = mnchmobl_vreg[6];
int flags = mnchmobl_vreg[7]; /* XB?????? */
int xadjust = - 128-16 - ((flags&0x80)?1:0);
int bank = (flags&0x40)?1:0;
const gfx_element *gfx = machine->gfx[2+bank];
int color_base = mnchmobl_palette_bank*4+3;
int i;
for( i=0; i<0x200; i++ )
{
int tile_number = mnchmobl_sprite_tile[i]; /* ETTTTTTT */
int attributes = mnchmobl_sprite_attr[i]; /* XYYYYYCC */
int sx = mnchmobl_sprite_xpos[i]; /* XXXXXXX? */
int sy = (i/0x40)*0x20; /* Y YY------ */
sy += (attributes>>2)&0x1f;
if( tile_number != 0xff && (attributes&0x80) )
{
sx = (sx>>1) | (tile_number&0x80);
sx = 2*((-32-scroll - sx)&0xff)+xadjust;
drawgfx( bitmap, gfx,
0x7f - (tile_number&0x7f),
color_base-(attributes&0x03),
0,0, /* no flip */
sx,sy,
cliprect, TRANSPARENCY_PEN, 7 );
}
}
}
VIDEO_UPDATE( mnchmobl )
{
draw_background(machine, bitmap, cliprect);
draw_sprites(machine, bitmap, cliprect);
draw_status(machine, bitmap, cliprect);
return 0;
}