diff options
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 |
commit | 63eae52c389242b3c9b3499af86ea0fd878bec34 (patch) | |
tree | c6006843703dc7bd2646e1124eebc28e9a12db83 | |
parent | 7489a81c2f5485072f6c51febbab031c915ab35c (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.c | 41 | ||||
-rw-r--r-- | src/mame/includes/williams.h | 4 | ||||
-rw-r--r-- | src/mame/machine/williams.c | 13 | ||||
-rw-r--r-- | src/mame/video/williams.c | 90 |
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]); -} - - /************************************* * |