/******************************************************************************* Mouser - Video Hardware: Character map with scrollable rows, 1024 possible characters. - index = byte from videoram + 2 bits from colorram) - (if row is scrolled, videoram is offset, colorram is not) - 16 4-color combinations for each char, from colorram 15 Sprites controlled by 4-byte records - 16 4-color combinations - 2 banks of 64 sprite characters each *******************************************************************************/ #include "driver.h" PALETTE_INIT( mouser ) { int i; for (i = 0;i < machine->drv->total_colors;i++) { int bit0,bit1,bit2,r,g,b; /* red component */ bit0 = BIT(*color_prom,0); bit1 = BIT(*color_prom,1); bit2 = BIT(*color_prom,2); r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; /* green component */ bit0 = BIT(*color_prom,3); bit1 = BIT(*color_prom,4); bit2 = BIT(*color_prom,5); g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; /* blue component */ bit0 = BIT(*color_prom,6); bit1 = BIT(*color_prom,7); b = 0x4f * bit0 + 0xa8 * bit1; palette_set_color(machine,i,MAKE_RGB(r,g,b)); color_prom++; } } WRITE8_HANDLER( mouser_flip_screen_x_w ) { flip_screen_x_set(~data & 1); } WRITE8_HANDLER( mouser_flip_screen_y_w ) { flip_screen_y_set(~data & 1); } WRITE8_HANDLER( mouser_spriteram_w ) { /* Mark the entire row as dirty if row scrollram is written */ /* Only used by the MOUSER logo */ int i; if (offset < 32) { for(i=0;i<32;i++) dirtybuffer[offset+i*32] = 1; } spriteram_w(offset, data); } WRITE8_HANDLER( mouser_colorram_w ) { dirtybuffer[offset] = 1; colorram_w(offset, data); } VIDEO_UPDATE( mouser ) { int offs; int sx,sy; int flipx,flipy; /* for every character in the Video RAM, check if it has been modified */ /* since last time and update it accordingly. */ for (offs = videoram_size - 1;offs >= 0;offs--) { int scrolled_y_position; int color_offs; if (dirtybuffer[offs]) { dirtybuffer[offs] = 0; sx = offs % 32; sy = offs / 32; if (flip_screen_x) { sx = 31 - sx; } if (flip_screen_y) { sy = 31 - sy; } /* This bit of spriteram appears to be for row scrolling */ /* Note: this is dependant on flipping in y */ scrolled_y_position = (256 + 8*sy - spriteram[offs%32])%256; /* I think we still need to fetch the colorram bits to from the ram underneath, which is not scrolled */ /* Ideally we would merge these on a pixel-by-pixel basis, but it's ok to do this char-by-char, */ /* Since it's only for the MOUSER logo and it looks fine */ /* Note: this is _not_ dependant on flipping */ color_offs = offs%32 + ((256 + 8*(offs/32) - spriteram[offs%32])%256)/8*32; drawgfx(tmpbitmap,machine->gfx[0], videoram[offs] | (colorram[color_offs]>>5)*256 | ((colorram[color_offs]>>4)&1)*512, colorram[color_offs]%16, flip_screen_x,flip_screen_y, 8*sx,scrolled_y_position, 0,TRANSPARENCY_NONE,0); } } copyscrollbitmap(bitmap,tmpbitmap,0,0,0,0,&machine->screen[0].visarea,TRANSPARENCY_NONE,0); /* There seem to be two sets of sprites, each decoded identically */ /* This is the first set of 7 sprites */ for(offs = 0x0084; offs < 0x00A0; offs += 4) { sx = spriteram[offs+3]; sy = 0xef-spriteram[offs+2]; flipx = (spriteram[offs]&0x40)>>6; flipy = (spriteram[offs]&0x80)>>7; if (flip_screen_x) { flipx = !flipx; sx = 240 - sx; } if (flip_screen_y) { flipy = !flipy; sy = 238 - sy; } if ((spriteram[offs+1]&0x10)>>4) drawgfx(bitmap,machine->gfx[1+((spriteram[offs+1]&0x20)>>5)], spriteram[offs]&0x3f, spriteram[offs+1]%16, flipx,flipy, sx,sy, &machine->screen[0].visarea,TRANSPARENCY_PEN,0); } /* This is the second set of 8 sprites */ for(offs = 0x00C4; offs < 0x00E4; offs += 4) { sx = spriteram[offs+3]; sy = 0xef-spriteram[offs+2]; flipx = (spriteram[offs]&0x40)>>6; flipy = (spriteram[offs]&0x80)>>7; if (flip_screen_x) { flipx = !flipx; sx = 240 - sx; } if (flip_screen_y) { flipy = !flipy; sy = 238 - sy; } if ((spriteram[offs+1]&0x10)>>4) drawgfx(bitmap,machine->gfx[1+((spriteram[offs+1]&0x20)>>5)], spriteram[offs]&0x3f, spriteram[offs+1]%16, flipx,flipy, sx,sy, &machine->screen[0].visarea,TRANSPARENCY_PEN,0); } return 0; }