diff options
Diffstat (limited to 'src/mame/video/munchmo.c')
-rw-r--r-- | src/mame/video/munchmo.c | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/mame/video/munchmo.c b/src/mame/video/munchmo.c new file mode 100644 index 00000000000..c95bf5bd3f2 --- /dev/null +++ b/src/mame/video/munchmo.c @@ -0,0 +1,197 @@ +#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; +} |