summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2008-01-31 17:52:36 +0000
committer Aaron Giles <aaron@aarongiles.com>2008-01-31 17:52:36 +0000
commit63eae52c389242b3c9b3499af86ea0fd878bec34 (patch)
treec6006843703dc7bd2646e1124eebc28e9a12db83
parent7489a81c2f5485072f6c51febbab031c915ab35c (diff)
Updated williams driver to use VIDEO_UPDATE_SCANLINE.
(Most bitmap-based drivers should.) Converted to 32bpp to catch mid-screen palette tweaks. Removed some unnecessary read/write handlers.
-rw-r--r--src/mame/drivers/williams.c41
-rw-r--r--src/mame/includes/williams.h4
-rw-r--r--src/mame/machine/williams.c13
-rw-r--r--src/mame/video/williams.c90
4 files changed, 54 insertions, 94 deletions
diff --git a/src/mame/drivers/williams.c b/src/mame/drivers/williams.c
index be38d91ad7f..3d18140618f 100644
--- a/src/mame/drivers/williams.c
+++ b/src/mame/drivers/williams.c
@@ -523,17 +523,15 @@ ADDRESS_MAP_END
void defender_install_io_space(void)
{
/* this routine dynamically installs the memory mapped above from c000-cfff */
- memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xc000, 0xc00f, 0, 0x03e0, williams_paletteram_w);
- memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xc010, 0xc01f, 0, 0x03e0, defender_video_control_w);
- memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xc3ff, 0xc3ff, 0, 0, williams_watchdog_reset_w);
- memory_install_read8_handler (0, ADDRESS_SPACE_PROGRAM, 0xc400, 0xc4ff, 0, 0x0300, MRA8_BANK3);
- memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xc400, 0xc4ff, 0, 0x0300, williams_cmos_w);
- memory_install_read8_handler (0, ADDRESS_SPACE_PROGRAM, 0xc800, 0xcbff, 0, 0x03e0, williams_video_counter_r);
- memory_install_read8_handler (0, ADDRESS_SPACE_PROGRAM, 0xcc00, 0xcc03, 0, 0x03e0, pia_1_r);
- memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xcc00, 0xcc03, 0, 0x03e0, pia_1_w);
- memory_install_read8_handler (0, ADDRESS_SPACE_PROGRAM, 0xcc04, 0xcc07, 0, 0x03e0, pia_0_r);
- memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xcc04, 0xcc07, 0, 0x03e0, pia_0_w);
+ memory_install_write8_handler (0, ADDRESS_SPACE_PROGRAM, 0xc000, 0xc00f, 0, 0x03e0, MWA8_BANK4);
+ memory_install_write8_handler (0, ADDRESS_SPACE_PROGRAM, 0xc010, 0xc01f, 0, 0x03e0, defender_video_control_w);
+ memory_install_write8_handler (0, ADDRESS_SPACE_PROGRAM, 0xc3ff, 0xc3ff, 0, 0, williams_watchdog_reset_w);
+ memory_install_readwrite8_handler (0, ADDRESS_SPACE_PROGRAM, 0xc400, 0xc4ff, 0, 0x0300, MRA8_BANK3, williams_cmos_w);
+ memory_install_read8_handler (0, ADDRESS_SPACE_PROGRAM, 0xc800, 0xcbff, 0, 0x03e0, williams_video_counter_r);
+ memory_install_readwrite8_handler (0, ADDRESS_SPACE_PROGRAM, 0xcc00, 0xcc03, 0, 0x03e0, pia_1_r, pia_1_w);
+ memory_install_readwrite8_handler (0, ADDRESS_SPACE_PROGRAM, 0xcc04, 0xcc07, 0, 0x03e0, pia_0_r, pia_0_w);
memory_set_bankptr(3, generic_nvram);
+ memory_set_bankptr(4, paletteram);
}
@@ -547,7 +545,7 @@ void defender_install_io_space(void)
static ADDRESS_MAP_START( williams_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x8fff) AM_READWRITE(MRA8_BANK1, MWA8_RAM) AM_BASE(&williams_videoram)
AM_RANGE(0x9000, 0xbfff) AM_RAM
- AM_RANGE(0xc000, 0xc00f) AM_MIRROR(0x03f0) AM_WRITE(williams_paletteram_w) AM_BASE(&paletteram)
+ AM_RANGE(0xc000, 0xc00f) AM_MIRROR(0x03f0) AM_WRITE(MWA8_RAM) AM_BASE(&paletteram)
AM_RANGE(0xc804, 0xc807) AM_MIRROR(0x00f0) AM_READWRITE(pia_0_r, pia_0_w)
AM_RANGE(0xc80c, 0xc80f) AM_MIRROR(0x00f0) AM_READWRITE(pia_1_r, pia_1_w)
AM_RANGE(0xc900, 0xc9ff) AM_WRITE(williams_vram_select_w)
@@ -562,7 +560,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( williams_extra_ram_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x8fff) AM_READWRITE(MRA8_BANK1, MWA8_RAM) AM_BASE(&williams_videoram)
AM_RANGE(0x9000, 0xbfff) AM_RAM
- AM_RANGE(0xc000, 0xc00f) AM_MIRROR(0x03f0) AM_WRITE(williams_paletteram_w) AM_BASE(&paletteram)
+ AM_RANGE(0xc000, 0xc00f) AM_MIRROR(0x03f0) AM_WRITE(MWA8_RAM) AM_BASE(&paletteram)
AM_RANGE(0xc804, 0xc807) AM_MIRROR(0x00f0) AM_READWRITE(pia_0_r, pia_0_w)
AM_RANGE(0xc80c, 0xc80f) AM_MIRROR(0x00f0) AM_READWRITE(pia_1_r, pia_1_w)
AM_RANGE(0xc900, 0xc9ff) AM_WRITE(sinistar_vram_select_w)
@@ -585,10 +583,10 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( blaster_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_READWRITE(MRA8_BANK1, MWA8_RAM) AM_BASE(&williams_videoram)
AM_RANGE(0x4000, 0x8fff) AM_READWRITE(MRA8_BANK2, MWA8_RAM)
- AM_RANGE(0xbb00, 0xbbff) AM_WRITE(blaster_palette_0_w) AM_BASE(&blaster_palette_0)
- AM_RANGE(0xbc00, 0xbcff) AM_WRITE(blaster_scanline_control_w) AM_BASE(&blaster_scanline_control)
+ AM_RANGE(0xbb00, 0xbbff) AM_WRITE(MWA8_RAM) AM_BASE(&blaster_palette_0)
+ AM_RANGE(0xbc00, 0xbcff) AM_WRITE(MWA8_RAM) AM_BASE(&blaster_scanline_control)
AM_RANGE(0x9000, 0xbfff) AM_RAM
- AM_RANGE(0xc000, 0xc00f) AM_MIRROR(0x03f0) AM_WRITE(williams_paletteram_w) AM_BASE(&paletteram)
+ AM_RANGE(0xc000, 0xc00f) AM_MIRROR(0x03f0) AM_WRITE(MWA8_RAM) AM_BASE(&paletteram)
AM_RANGE(0xc804, 0xc807) AM_MIRROR(0x00f0) AM_READWRITE(pia_0_r, pia_0_w)
AM_RANGE(0xc80c, 0xc80f) AM_MIRROR(0x00f0) AM_READWRITE(pia_1_r, pia_1_w)
AM_RANGE(0xc900, 0xc93f) AM_WRITE(blaster_vram_select_w)
@@ -1416,11 +1414,10 @@ static MACHINE_DRIVER_START( defender )
MDRV_NVRAM_HANDLER(generic_0fill)
/* video hardware */
- MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
- MDRV_PALETTE_LENGTH(16)
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_UPDATE_SCANLINE)
MDRV_SCREEN_ADD("main", 0)
- MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK*2/3, 512, 10, 304, 260, 7, 245)
MDRV_VIDEO_START(williams)
@@ -1516,8 +1513,6 @@ static MACHINE_DRIVER_START( blaster )
MDRV_MACHINE_RESET(blaster)
/* video hardware */
- MDRV_PALETTE_LENGTH(16+256)
-
MDRV_VIDEO_START(blaster)
MDRV_VIDEO_UPDATE(blaster)
MACHINE_DRIVER_END
@@ -1536,12 +1531,12 @@ static MACHINE_DRIVER_START( williams2 )
MDRV_NVRAM_HANDLER(generic_0fill)
/* video hardware */
- MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
- MDRV_GFXDECODE(williams2)
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_UPDATE_SCANLINE)
MDRV_PALETTE_LENGTH(1024)
+ MDRV_GFXDECODE(williams2)
MDRV_SCREEN_ADD("main", 0)
- MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK*2/3, 512, 8, 284, 260, 8, 248)
MDRV_VIDEO_START(williams2)
diff --git a/src/mame/includes/williams.h b/src/mame/includes/williams.h
index fdb5eca5572..44161c8be16 100644
--- a/src/mame/includes/williams.h
+++ b/src/mame/includes/williams.h
@@ -100,11 +100,8 @@ extern UINT8 williams_cocktail;
WRITE8_HANDLER( williams_blitter_w );
-WRITE8_HANDLER( williams_paletteram_w );
WRITE8_HANDLER( blaster_remap_select_w );
-WRITE8_HANDLER( blaster_palette_0_w );
WRITE8_HANDLER( blaster_video_control_w );
-WRITE8_HANDLER( blaster_scanline_control_w );
READ8_HANDLER( williams_video_counter_r );
READ8_HANDLER( williams2_video_counter_r );
@@ -118,7 +115,6 @@ VIDEO_UPDATE( williams2 );
WRITE8_HANDLER( williams2_tileram_w );
-READ8_HANDLER( williams2_paletteram_r );
WRITE8_HANDLER( williams2_paletteram_w );
WRITE8_HANDLER( williams2_fg_select_w );
WRITE8_HANDLER( williams2_bg_select_w );
diff --git a/src/mame/machine/williams.c b/src/mame/machine/williams.c
index 67938381252..2f38b2c0d69 100644
--- a/src/mame/machine/williams.c
+++ b/src/mame/machine/williams.c
@@ -270,11 +270,8 @@ static TIMER_CALLBACK( williams_va11_callback )
/* the IRQ signal comes into CB1, and is set to VA11 */
pia_1_cb1_w(0, scanline & 0x20);
- /* update the screen while we're here */
- video_screen_update_partial(0, scanline - 1);
-
/* set a timer for the next update */
- scanline++;
+ scanline += 0x20;
if (scanline >= 256) scanline = 0;
timer_adjust(scanline_timer, video_screen_get_time_until_pos(0, scanline, 0), scanline, attotime_zero);
}
@@ -402,11 +399,8 @@ static TIMER_CALLBACK( williams2_va11_callback )
pia_0_cb1_w(0, scanline & 0x20);
pia_1_ca1_w(0, scanline & 0x20);
- /* update the screen while we're here */
- video_screen_update_partial(0, scanline);
-
/* set a timer for the next update */
- scanline++;
+ scanline += 0x20;
if (scanline >= 256) scanline = 0;
timer_adjust(scanline_timer, video_screen_get_time_until_pos(0, scanline, 0), scanline, attotime_zero);
}
@@ -514,9 +508,10 @@ WRITE8_HANDLER( williams2_bank_select_w )
/* page 3 accesses palette RAM; the remaining areas are as if page 1 ROM was selected */
case 3:
- memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x8000, 0x87ff, 0, 0, williams2_paletteram_r);
+ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x8000, 0x87ff, 0, 0, MRA8_BANK4);
memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x8000, 0x87ff, 0, 0, williams2_paletteram_w);
memory_set_bank(1, 1 + ((vram_bank & 4) >> 1));
+ memory_set_bankptr(4, paletteram);
break;
}
}
diff --git a/src/mame/video/williams.c b/src/mame/video/williams.c
index 18cb2e64e03..7de722e21c4 100644
--- a/src/mame/video/williams.c
+++ b/src/mame/video/williams.c
@@ -129,9 +129,6 @@ UINT8 williams_cocktail;
*
*************************************/
-/* RAM variable */
-static UINT8 *williams2_paletteram;
-
/* palette variables */
static rgb_t *palette_lookup;
@@ -143,7 +140,7 @@ static const UINT8 *blitter_remap;
static UINT8 *blitter_remap_lookup;
/* Blaster-specific variables */
-static UINT8 blaster_color0;
+static rgb_t blaster_color0;
static UINT8 blaster_video_control;
/* tilemap variables */
@@ -206,8 +203,8 @@ VIDEO_START( williams2 )
blitter_init(williams_blitter_config, NULL);
/* allocate paletteram */
- williams2_paletteram = auto_malloc(0x400 * 2);
- state_save_register_global_pointer(williams2_paletteram, 0x400 * 2);
+ paletteram = auto_malloc(0x400 * 2);
+ state_save_register_global_pointer(paletteram, 0x400 * 2);
/* create the tilemap */
bg_tilemap = tilemap_create(get_tile_info, tilemap_scan_cols, TILEMAP_TYPE_PEN, 24,16, 128,16);
@@ -226,20 +223,25 @@ VIDEO_START( williams2 )
VIDEO_UPDATE( williams )
{
+ rgb_t pens[16];
int x, y;
+
+ /* precompute the palette */
+ for (x = 0; x < 16; x++)
+ pens[x] = palette_lookup[paletteram[x]];
/* loop over rows */
for (y = cliprect->min_y; y <= cliprect->max_y; y++)
{
UINT8 *source = &williams_videoram[y];
- UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0);
+ UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0);
/* loop over columns */
for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2)
{
int pix = source[(x/2) * 256];
- dest[x+0] = pix >> 4;
- dest[x+1] = pix & 0x0f;
+ dest[x+0] = pens[pix >> 4];
+ dest[x+1] = pens[pix & 0x0f];
}
}
return 0;
@@ -248,22 +250,27 @@ VIDEO_UPDATE( williams )
VIDEO_UPDATE( blaster )
{
+ rgb_t pens[16];
int x, y;
+ /* precompute the palette */
+ for (x = 0; x < 16; x++)
+ pens[x] = palette_lookup[paletteram[x]];
+
/* if we're blitting from the top, start with a 0 for color 0 */
if (cliprect->min_y == machine->screen[0].visarea.min_y || !(blaster_video_control & 1))
- blaster_color0 = 0;
+ blaster_color0 = pens[0];
/* loop over rows */
for (y = cliprect->min_y; y <= cliprect->max_y; y++)
{
int erase_behind = blaster_video_control & blaster_scanline_control[y] & 2;
UINT8 *source = &williams_videoram[y];
- UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0);
+ UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0);
/* latch a new color0 pen? */
if (blaster_video_control & blaster_scanline_control[y] & 1)
- blaster_color0 = 16 + y;
+ blaster_color0 = palette_lookup[blaster_palette_0[y] ^ 0xff];
/* loop over columns */
for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2)
@@ -275,8 +282,8 @@ VIDEO_UPDATE( blaster )
source[(x/2) * 256] = 0;
/* now draw */
- dest[x+0] = (pix & 0xf0) ? (pix >> 4) : blaster_color0;
- dest[x+1] = (pix & 0x0f) ? (pix & 0x0f) : blaster_color0;
+ dest[x+0] = (pix & 0xf0) ? pens[pix >> 4] : blaster_color0;
+ dest[x+1] = (pix & 0x0f) ? pens[pix & 0x0f] : blaster_color0;
}
}
return 0;
@@ -285,19 +292,21 @@ VIDEO_UPDATE( blaster )
VIDEO_UPDATE( williams2 )
{
- int x, y, basecolor;
+ rgb_t pens[16];
+ int x, y;
/* draw the background */
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
- /* copy the bitmap data on top of that */
- basecolor = williams2_fg_color * 16;
+ /* fetch the relevant pens */
+ for (x = 1; x < 16; x++)
+ pens[x] = palette_get_color(machine, williams2_fg_color * 16 + x);
/* loop over rows */
for (y = cliprect->min_y; y <= cliprect->max_y; y++)
{
UINT8 *source = &williams_videoram[y];
- UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0);
+ UINT32 *dest = BITMAP_ADDR32(bitmap, y, 0);
/* loop over columns */
for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2)
@@ -305,9 +314,9 @@ VIDEO_UPDATE( williams2 )
int pix = source[(x/2) * 256];
if (pix & 0xf0)
- dest[x+0] = basecolor + (pix >> 4);
+ dest[x+0] = pens[pix >> 4];
if (pix & 0x0f)
- dest[x+1] = basecolor + (pix & 0x0f);
+ dest[x+1] = pens[pix & 0x0f];
}
}
return 0;
@@ -364,19 +373,6 @@ static void create_palette_lookup(void)
}
-WRITE8_HANDLER( williams_paletteram_w )
-{
- paletteram[offset] = data;
- palette_set_color(Machine, offset, palette_lookup[data]);
-}
-
-
-READ8_HANDLER( williams2_paletteram_r )
-{
- return williams2_paletteram[offset];
-}
-
-
WRITE8_HANDLER( williams2_paletteram_w )
{
static const UINT8 ztable[16] =
@@ -387,11 +383,11 @@ WRITE8_HANDLER( williams2_paletteram_w )
UINT8 entry_lo, entry_hi, i, r, g, b;
/* set the new value */
- williams2_paletteram[offset] = data;
+ paletteram[offset] = data;
/* pull the associated low/high bytes */
- entry_lo = williams2_paletteram[offset & ~1];
- entry_hi = williams2_paletteram[offset | 1];
+ entry_lo = paletteram[offset & ~1];
+ entry_hi = paletteram[offset | 1];
/* update the palette entry */
i = ztable[(entry_hi >> 4) & 15];
@@ -404,7 +400,6 @@ WRITE8_HANDLER( williams2_paletteram_w )
WRITE8_HANDLER( williams2_fg_select_w )
{
- video_screen_update_partial(0, video_screen_get_vpos(0));
williams2_fg_color = data & 0x3f;
}
@@ -471,8 +466,6 @@ static TILE_GET_INFO( get_tile_info )
WRITE8_HANDLER( williams2_bg_select_w )
{
- video_screen_update_partial(0, video_screen_get_vpos(0));
-
/* based on the tilemap config, only certain bits are used */
/* the rest are determined by other factors */
switch (williams2_tilemap_config)
@@ -505,7 +498,6 @@ WRITE8_HANDLER( williams2_tileram_w )
WRITE8_HANDLER( williams2_xscroll_low_w )
{
- video_screen_update_partial(0, video_screen_get_vpos(0));
tilemap_xscroll = (tilemap_xscroll & ~0x00f) | ((data & 0x80) >> 4) | (data & 0x07);
tilemap_set_scrollx(bg_tilemap, 0, (tilemap_xscroll & 7) + ((tilemap_xscroll >> 3) * 6));
}
@@ -513,7 +505,6 @@ WRITE8_HANDLER( williams2_xscroll_low_w )
WRITE8_HANDLER( williams2_xscroll_high_w )
{
- video_screen_update_partial(0, video_screen_get_vpos(0));
tilemap_xscroll = (tilemap_xscroll & 0x00f) | (data << 4);
tilemap_set_scrollx(bg_tilemap, 0, (tilemap_xscroll & 7) + ((tilemap_xscroll >> 3) * 6));
}
@@ -528,7 +519,6 @@ WRITE8_HANDLER( williams2_xscroll_high_w )
WRITE8_HANDLER( blaster_remap_select_w )
{
- video_screen_update_partial(0, video_screen_get_vpos(0));
blitter_remap_index = data;
blitter_remap = blitter_remap_lookup + data * 256;
}
@@ -536,26 +526,10 @@ WRITE8_HANDLER( blaster_remap_select_w )
WRITE8_HANDLER( blaster_video_control_w )
{
- video_screen_update_partial(0, video_screen_get_vpos(0));
blaster_video_control = data;
}
-WRITE8_HANDLER( blaster_scanline_control_w )
-{
- video_screen_update_partial(0, video_screen_get_vpos(0));
- blaster_scanline_control[offset] = data;
-}
-
-
-WRITE8_HANDLER( blaster_palette_0_w )
-{
- video_screen_update_partial(0, video_screen_get_vpos(0));
- blaster_palette_0[offset] = data;
- palette_set_color(Machine, 16 + offset, palette_lookup[data ^ 0xff]);
-}
-
-
/*************************************
*