diff options
Diffstat (limited to 'src/mame/video/20pacgal.c')
-rw-r--r-- | src/mame/video/20pacgal.c | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/src/mame/video/20pacgal.c b/src/mame/video/20pacgal.c new file mode 100644 index 00000000000..230762173a9 --- /dev/null +++ b/src/mame/video/20pacgal.c @@ -0,0 +1,203 @@ +#include "driver.h" + + + +UINT8 *pacgal_charram,*pacgal_sprram; +UINT8 *pacgal_videoram,*pacgal_videoram2; + +static mame_bitmap *chr_bitmap; +static int palbank; +static int active_game; + + + +static void switch_palette(running_machine *machine) +{ + int i; + UINT8 *color_prom = memory_region(REGION_PROMS) + 0x1000 * palbank; + + for (i = 0;i < machine->drv->total_colors;i++) + { + int bit0,bit1,bit2,r,g,b; + + + /* red component */ + bit0 = (*color_prom >> 0) & 0x01; + bit1 = (*color_prom >> 1) & 0x01; + bit2 = (*color_prom >> 2) & 0x01; + r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + /* green component */ + bit0 = (*color_prom >> 3) & 0x01; + bit1 = (*color_prom >> 4) & 0x01; + bit2 = (*color_prom >> 5) & 0x01; + g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + /* blue component */ + bit0 = 0; + bit1 = (*color_prom >> 6) & 0x01; + bit2 = (*color_prom >> 7) & 0x01; + b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + + palette_set_color(machine,i,MAKE_RGB(r,g,b)); + color_prom++; + } +} + +PALETTE_INIT( 20pacgal ) +{ + palbank = 0; + switch_palette(machine); +} + + + +VIDEO_START( 20pacgal ) +{ + chr_bitmap = auto_bitmap_alloc(machine->screen[0].width,machine->screen[0].height,machine->screen[0].format); +} + + + +WRITE8_HANDLER( pacgal_lookup_w ) +{ + /* palette hacks! */ + ((UINT16 *)Machine->game_colortable)[offset] = data & 0x0f; + ((pen_t *)Machine->remapped_colortable)[offset] = Machine->pens[data & 0x0f]; +} + +WRITE8_HANDLER( pacgal_active_game_w ) +{ + active_game = data & 1; + + if (!active_game) + memcpy(pacgal_videoram2,memory_region(REGION_CPU1)+0x8000,0x2000); + + if (palbank != active_game) + { + palbank = active_game; + switch_palette(Machine); + } +} + +WRITE8_HANDLER( pacgal_videoram2_w ) +{ + if (active_game) + pacgal_videoram2[offset] = data; +} + +WRITE8_HANDLER( pacgal_charram_w ) +{ + pacgal_charram[offset] = data; + + decodechar(Machine->gfx[0],offset/16,pacgal_charram,Machine->drv->gfxdecodeinfo[0].gfxlayout); +} + +WRITE8_HANDLER( pacgal_sprram_w ) +{ + offset = (offset & 0x1f83) | ((offset & 0x078) >> 1) | ((offset & 0x004) << 4); + pacgal_sprram[offset] = data; + + decodechar(Machine->gfx[1],offset/64,pacgal_sprram,Machine->drv->gfxdecodeinfo[1].gfxlayout); +} + + + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect ) +{ + int offs; + + + for (offs = 0x80-2;offs >= 0;offs-=2) + { + static int gfx_offs[2][2] = + { + { 0, 1 }, + { 2, 3 } + }; + int sprite = spriteram[offs + 0x000] & 0x7f; + int color = spriteram[offs + 0x001] & 0x3f; + int sx = spriteram[offs + 0x081] - 41 + 0x100*(spriteram[offs + 0x101] & 3); + int sy = 256 - spriteram[offs + 0x080] + 1; + int flipx = (spriteram[offs + 0x100] & 0x01); + int flipy = (spriteram[offs + 0x100] & 0x02) >> 1; + int sizex = (spriteram[offs + 0x100] & 0x04) >> 2; + int sizey = (spriteram[offs + 0x100] & 0x08) >> 3; + int x,y; + + if (flip_screen) + { + flipx ^= 1; + flipy ^= 1; + } + + sy -= 16 * sizey; + sy = (sy & 0xff) - 32; // fix wraparound + + for (y = 0;y <= sizey;y++) + { + for (x = 0;x <= sizex;x++) + { + drawgfx(bitmap,machine->gfx[1], + sprite + gfx_offs[y ^ (sizey * flipy)][x ^ (sizex * flipx)], + color, + flipx,flipy, + sx + 16*x, sy + 16*y, + cliprect,TRANSPARENCY_COLOR,0); + } + } + } +} + +VIDEO_UPDATE( 20pacgal ) +{ + int x,y; + + for (y = 0;y < 32;y++) + { + for (x = 0;x < 32;x++) + { + int sx,sy; + if (y < 2) + { + sy = x-2; + sx = 34+y; + } + else if (y >= 30) + { + sy = x-2; + sx = y-30; + } + else + { + sy = y-2; + sx = x+2; + } + + if (active_game) + { + drawgfx(chr_bitmap,machine->gfx[0], + pacgal_videoram2[y*32 + x] + 0xa00, + (pacgal_videoram2[0x400 + y*32 + x] & 0x3f) * 4, + 0,0, + 8*sx,8*sy, + cliprect,TRANSPARENCY_NONE_RAW,0); + } + else + { + drawgfx(chr_bitmap,machine->gfx[0], + pacgal_videoram[y*32 + x] + 0xa00, + (pacgal_videoram[0x400 + y*32 + x] & 0x3f) * 4, + 0,0, + 8*sx,8*sy, + cliprect,TRANSPARENCY_NONE_RAW,0); + } + } + } + + fillbitmap(bitmap,0,NULL); + + draw_sprites(machine,bitmap,cliprect); + + copybitmap(bitmap, chr_bitmap, flip_screen, flip_screen, 0, 0, cliprect, TRANSPARENCY_BLEND_RAW, 4); + + return 0; +} |