summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Zsolt Vasvari <zsoltvas@mamedev.org>2008-02-11 02:59:15 +0000
committer Zsolt Vasvari <zsoltvas@mamedev.org>2008-02-11 02:59:15 +0000
commit3f9150918dc44850db27d54e75eada4eefa681ae (patch)
tree7ea7e5afa35a4d4df267b643c782b014f6ff332c
parentd124d815216e3e9408509d132a9b3329b03bfed9 (diff)
- Color table removal
- Cleaned up the 'special case' mess this driver has become
-rw-r--r--src/mame/drivers/rallyx.c79
-rw-r--r--src/mame/video/rallyx.c530
2 files changed, 396 insertions, 213 deletions
diff --git a/src/mame/drivers/rallyx.c b/src/mame/drivers/rallyx.c
index 32b5a6b2ef7..8fa0ede3b90 100644
--- a/src/mame/drivers/rallyx.c
+++ b/src/mame/drivers/rallyx.c
@@ -192,13 +192,14 @@ WRITE8_HANDLER( rallyx_scrollx_w );
WRITE8_HANDLER( rallyx_scrolly_w );
WRITE8_HANDLER( tactcian_starson_w );
PALETTE_INIT( rallyx );
+PALETTE_INIT( jungler );
VIDEO_START( rallyx );
+VIDEO_START( jungler );
+VIDEO_START( locomotn );
+VIDEO_START( commsega );
VIDEO_UPDATE( rallyx );
-DRIVER_INIT( rallyx );
-DRIVER_INIT( jungler );
-DRIVER_INIT( tactcian );
-DRIVER_INIT( locomotn );
-DRIVER_INIT( commsega );
+VIDEO_UPDATE( jungler );
+VIDEO_UPDATE( locomotn );
static WRITE8_HANDLER( rallyx_interrupt_vector_w )
@@ -327,7 +328,7 @@ static ADDRESS_MAP_START( writeport, ADDRESS_SPACE_IO, 8 )
ADDRESS_MAP_END
-static ADDRESS_MAP_START( locomotn_map, ADDRESS_SPACE_PROGRAM, 8 )
+static ADDRESS_MAP_START( jungler_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x8fff) AM_READWRITE(MRA8_RAM, rallyx_videoram_w) AM_BASE(&rallyx_videoram)
AM_RANGE(0x9800, 0x9fff) AM_RAM
@@ -850,8 +851,7 @@ static MACHINE_DRIVER_START( rallyx )
MDRV_SCREEN_SIZE(36*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1)
MDRV_GFXDECODE(rallyx)
- MDRV_PALETTE_LENGTH(32)
- MDRV_COLORTABLE_LENGTH(64*4+4)
+ MDRV_PALETTE_LENGTH(64*4+4)
MDRV_PALETTE_INIT(rallyx)
MDRV_VIDEO_START(rallyx)
@@ -870,11 +870,11 @@ static MACHINE_DRIVER_START( rallyx )
MACHINE_DRIVER_END
-static MACHINE_DRIVER_START( tactcian )
+static MACHINE_DRIVER_START( jungler )
/* basic machine hardware */
MDRV_CPU_ADD(Z80, 18432000/6) /* 3.072 MHz */
- MDRV_CPU_PROGRAM_MAP(locomotn_map,0)
+ MDRV_CPU_PROGRAM_MAP(jungler_map,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,1)
MDRV_SCREEN_REFRESH_RATE(60)
@@ -886,25 +886,49 @@ static MACHINE_DRIVER_START( tactcian )
MDRV_SCREEN_SIZE(36*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 36*8-1, 2*8, 30*8-1)
MDRV_GFXDECODE(jungler)
- MDRV_PALETTE_LENGTH(32+64)
- MDRV_COLORTABLE_LENGTH(64*4+4)
+ MDRV_PALETTE_LENGTH(64*4+4+64)
- MDRV_PALETTE_INIT(rallyx)
- MDRV_VIDEO_START(rallyx)
- MDRV_VIDEO_UPDATE(rallyx)
+ MDRV_PALETTE_INIT(jungler)
+ MDRV_VIDEO_START(jungler)
+ MDRV_VIDEO_UPDATE(jungler)
/* sound hardware */
MDRV_IMPORT_FROM(locomotn_sound)
MACHINE_DRIVER_END
+static MACHINE_DRIVER_START( tactcian )
+
+ /* basic machine hardware */
+ MDRV_IMPORT_FROM(jungler)
+
+ /* video hardware */
+ MDRV_VIDEO_START(locomotn)
+ MDRV_VIDEO_UPDATE(locomotn)
+MACHINE_DRIVER_END
+
+
static MACHINE_DRIVER_START( locomotn )
/* basic machine hardware */
- MDRV_IMPORT_FROM(tactcian)
+ MDRV_IMPORT_FROM(jungler)
+
+ /* video hardware */
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
+ MDRV_VIDEO_START(locomotn)
+ MDRV_VIDEO_UPDATE(locomotn)
+MACHINE_DRIVER_END
+
+
+static MACHINE_DRIVER_START( commsega )
+
+ /* basic machine hardware */
+ MDRV_IMPORT_FROM(jungler)
/* video hardware */
MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
+ MDRV_VIDEO_START(commsega)
+ MDRV_VIDEO_UPDATE(locomotn)
MACHINE_DRIVER_END
@@ -1193,15 +1217,14 @@ ROM_END
-GAME( 1980, rallyx, 0, rallyx, rallyx, rallyx, ROT0, "Namco", "Rally X", 0 )
-GAME( 1980, rallyxm, rallyx, rallyx, rallyx, rallyx, ROT0, "[Namco] (Midway license)", "Rally X (Midway)", 0 )
-GAME( 1981, nrallyx, 0, rallyx, nrallyx, rallyx, ROT0, "Namco", "New Rally X", 0 )
-
-GAME( 1981, jungler, 0, tactcian, jungler, jungler, ROT90, "Konami", "Jungler", 0 )
-GAME( 1981, junglers, jungler, tactcian, jungler, jungler, ROT90, "[Konami] (Stern license)", "Jungler (Stern)", 0 )
-GAME( 1982, tactcian, 0, tactcian, tactcian, tactcian, ROT90, "[Konami] (Sega license)", "Tactician (set 1)", 0 )
-GAME( 1981, tactcan2, tactcian, tactcian, tactcian, tactcian, ROT90, "[Konami] (Sega license)", "Tactician (set 2)", 0 )
-GAME( 1982, locomotn, 0, locomotn, locomotn, locomotn, ROT90, "Konami (Centuri license)", "Loco-Motion", 0 )
-GAME( 1982, gutangtn, locomotn, locomotn, locomotn, locomotn, ROT90, "Konami (Sega license)", "Guttang Gottong", 0 )
-GAME( 1982, cottong, locomotn, locomotn, locomotn, locomotn, ROT90, "bootleg", "Cotocoto Cottong", 0 )
-GAME( 1983, commsega, 0, locomotn, commsega, commsega, ROT90, "Sega", "Commando (Sega)", GAME_IMPERFECT_SOUND )
+GAME( 1980, rallyx, 0, rallyx, rallyx, 0, ROT0, "Namco", "Rally X", 0 )
+GAME( 1980, rallyxm, rallyx, rallyx, rallyx, 0, ROT0, "[Namco] (Midway license)", "Rally X (Midway)", 0 )
+GAME( 1981, nrallyx, 0, rallyx, nrallyx, 0, ROT0, "Namco", "New Rally X", 0 )
+GAME( 1981, jungler, 0, jungler, jungler, 0, ROT90, "Konami", "Jungler", 0 )
+GAME( 1981, junglers, jungler, jungler, jungler, 0, ROT90, "[Konami] (Stern license)", "Jungler (Stern)", 0 )
+GAME( 1982, tactcian, 0, tactcian, tactcian, 0, ROT90, "[Konami] (Sega license)", "Tactician (set 1)", 0 )
+GAME( 1981, tactcan2, tactcian, tactcian, tactcian, 0, ROT90, "[Konami] (Sega license)", "Tactician (set 2)", 0 )
+GAME( 1982, locomotn, 0, locomotn, locomotn, 0, ROT90, "Konami (Centuri license)", "Loco-Motion", 0 )
+GAME( 1982, gutangtn, locomotn, locomotn, locomotn, 0, ROT90, "Konami (Sega license)", "Guttang Gottong", 0 )
+GAME( 1982, cottong, locomotn, locomotn, locomotn, 0, ROT90, "bootleg", "Cotocoto Cottong", 0 )
+GAME( 1983, commsega, 0, commsega, commsega, 0, ROT90, "Sega", "Commando (Sega)", GAME_IMPERFECT_SOUND )
diff --git a/src/mame/video/rallyx.c b/src/mame/video/rallyx.c
index a4ba5ddae5f..4d3b2565dab 100644
--- a/src/mame/video/rallyx.c
+++ b/src/mame/video/rallyx.c
@@ -28,18 +28,19 @@ needs more color combination to render its graphics.
***************************************************************************/
#include "driver.h"
+#include "video/resnet.h"
UINT8 *rallyx_videoram,*rallyx_radarattr;
static UINT8 *rallyx_radarx,*rallyx_radary;
-static int video_type, spriteram_base;
+static int spriteram_base;
static tilemap *bg_tilemap,*fg_tilemap;
#define MAX_STARS 1000
-#define STARS_COLOR_BASE 32
+#define STARS_COLOR_BASE (0x104)
static int stars_enable;
@@ -51,43 +52,6 @@ static struct star stars[MAX_STARS];
static int total_stars;
-enum
-{
- TYPE_RALLYX,
- TYPE_JUNGLER,
- TYPE_TACTCIAN,
- TYPE_LOCOMOTN,
- TYPE_COMMSEGA
-};
-
-
-DRIVER_INIT( rallyx )
-{
- video_type = TYPE_RALLYX;
-}
-
-DRIVER_INIT( jungler )
-{
- video_type = TYPE_JUNGLER;
-}
-
-DRIVER_INIT( tactcian )
-{
- video_type = TYPE_TACTCIAN;
-}
-
-DRIVER_INIT( locomotn )
-{
- video_type = TYPE_LOCOMOTN;
-}
-
-DRIVER_INIT( commsega )
-{
- video_type = TYPE_COMMSEGA;
-}
-
-
-
/***************************************************************************
Convert the color PROMs.
@@ -110,77 +74,152 @@ DRIVER_INIT( commsega )
***************************************************************************/
PALETTE_INIT( rallyx )
{
+ static const int resistances_rg[3] = { 1000, 470, 220 };
+ static const int resistances_b [2] = { 470, 220 };
+ double rweights[3], gweights[3], bweights[2];
int i;
- #define TOTAL_COLORS(gfxn) (machine->gfx[gfxn]->total_colors * machine->gfx[gfxn]->color_granularity)
- #define COLOR(gfxn,offs) (colortable[machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs])
+ /* compute the color output resistor weights */
+ compute_resistor_weights(0, 255, -1.0,
+ 3, &resistances_rg[0], rweights, 0, 0,
+ 3, &resistances_rg[0], gweights, 0, 0,
+ 2, &resistances_b[0], bweights, 1000, 0);
- for (i = 0;i < 32;i++)
- {
- int bit0,bit1,bit2,r,g,b;
+ /* allocate the colortable */
+ machine->colortable = colortable_alloc(machine, 0x20);
+ /* create a lookup table for the palette */
+ for (i = 0; i < 0x20; i++)
+ {
+ int bit0, bit1, bit2;
+ int 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;
+ bit0 = (color_prom[i] >> 0) & 0x01;
+ bit1 = (color_prom[i] >> 1) & 0x01;
+ bit2 = (color_prom[i] >> 2) & 0x01;
+ r = combine_3_weights(rweights, bit0, bit1, 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 */
- if (video_type == TYPE_RALLYX)
- {
- bit0 = 0;
- bit1 = (*color_prom >> 6) & 0x01;
- bit2 = (*color_prom >> 7) & 0x01;
- b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
- }
- else
- {
- bit0 = (*color_prom >> 6) & 0x01;
- bit1 = (*color_prom >> 7) & 0x01;
- b = 0x50 * bit0 + 0xab * bit1;
- }
+ bit0 = (color_prom[i] >> 3) & 0x01;
+ bit1 = (color_prom[i] >> 4) & 0x01;
+ bit2 = (color_prom[i] >> 5) & 0x01;
+ g = combine_3_weights(gweights, bit0, bit1, bit2);
- palette_set_color(machine,i,MAKE_RGB(r,g,b));
+ /* blue component */
+ bit0 = (color_prom[i] >> 6) & 0x01;
+ bit1 = (color_prom[i] >> 7) & 0x01;
+ b = combine_2_weights(bweights, bit0, bit1);
- color_prom++;
+ colortable_palette_set_color(machine->colortable, i, MAKE_RGB(r, g, b));
}
/* color_prom now points to the beginning of the lookup table */
+ color_prom += 0x20;
+
+ /* character/sprites lookup table */
+ for (i = 0x000; i < 0x100; i++)
+ {
+ UINT8 ctabentry = color_prom[i] & 0x0f;
+ colortable_entry_set_value(machine->colortable, i, ctabentry);
+ }
+
+ /* bullets use colors 0x10-0x13 */
+ for (i = 0x100; i < 0x104; i++)
+ colortable_entry_set_value(machine->colortable, i, (i - 0x100) | 0x10);
+}
- /* character lookup table */
- /* sprites use the same color lookup table as characters */
- for (i = 0;i < TOTAL_COLORS(0);i++)
- COLOR(0,i) = *(color_prom++) & 0x0f;
- /* radar dots lookup table */
- /* they use colors 16-19 */
- for (i = 0;i < 4;i++)
- COLOR(2,i) = 16 + i;
+PALETTE_INIT( jungler )
+{
+ static const int resistances_rg[3] = { 1000, 470, 220 };
+ static const int resistances_b [2] = { 470, 220 };
+ static const int resistances_star[3] = { 150, 100 };
+ double rweights[3], gweights[3], bweights[2];
+ double rweights_star[2], gweights_star[2], bweights_star[2];
+ int i;
- /* Rally X doesn't have the optional starfield generator */
- if (video_type != TYPE_RALLYX)
+ /* compute the color output resistor weights */
+ double scale = compute_resistor_weights(0, 255, -1.0,
+ 2, resistances_star, rweights_star, 0, 0,
+ 2, resistances_star, gweights_star, 0, 0,
+ 2, resistances_star, bweights_star, 0, 0);
+
+ compute_resistor_weights(0, 255, scale,
+ 3, resistances_rg, rweights, 1000, 0,
+ 3, resistances_rg, gweights, 1000, 0,
+ 2, resistances_b, bweights, 1000, 0);
+
+ /* allocate the colortable */
+ machine->colortable = colortable_alloc(machine, 0x60);
+
+ /* create a lookup table for the palette */
+ for (i = 0; i < 0x20; i++)
{
- /* now the stars */
- for (i = 0;i < 64;i++)
- {
- int bits,r,g,b;
- static const int map[4] = { 0x00, 0x47, 0x97, 0xde };
+ int bit0, bit1, bit2;
+ int r, g, b;
- bits = (i >> 0) & 0x03;
- r = map[bits];
- bits = (i >> 2) & 0x03;
- g = map[bits];
- bits = (i >> 4) & 0x03;
- b = map[bits];
+ /* red component */
+ bit0 = (color_prom[i] >> 0) & 0x01;
+ bit1 = (color_prom[i] >> 1) & 0x01;
+ bit2 = (color_prom[i] >> 2) & 0x01;
+ r = combine_3_weights(rweights, bit0, bit1, bit2);
- palette_set_color(machine,i + 32,MAKE_RGB(r,g,b));
- }
+ /* green component */
+ bit0 = (color_prom[i] >> 3) & 0x01;
+ bit1 = (color_prom[i] >> 4) & 0x01;
+ bit2 = (color_prom[i] >> 5) & 0x01;
+ g = combine_3_weights(gweights, bit0, bit1, bit2);
+
+ /* blue component */
+ bit0 = (color_prom[i] >> 6) & 0x01;
+ bit1 = (color_prom[i] >> 7) & 0x01;
+ b = combine_2_weights(bweights, bit0, bit1);
+
+ colortable_palette_set_color(machine->colortable, i, MAKE_RGB(r, g, b));
+ }
+
+ /* star pens */
+ for (i = 0x20; i < 0x60; i++)
+ {
+ int bit0, bit1;
+ int r, g, b;
+
+ /* red component */
+ bit0 = ((i - 0x20) >> 0) & 0x01;
+ bit1 = ((i - 0x20) >> 1) & 0x01;
+ r = combine_2_weights(rweights_star, bit0, bit1);
+
+ /* green component */
+ bit0 = ((i - 0x20) >> 2) & 0x01;
+ bit1 = ((i - 0x20) >> 3) & 0x01;
+ g = combine_2_weights(gweights_star, bit0, bit1);
+
+ /* blue component */
+ bit0 = ((i - 0x20) >> 4) & 0x01;
+ bit1 = ((i - 0x20) >> 5) & 0x01;
+ b = combine_2_weights(bweights_star, bit0, bit1);
+
+ colortable_palette_set_color(machine->colortable, i, MAKE_RGB(r, g, b));
}
+
+ /* color_prom now points to the beginning of the lookup table */
+ color_prom += 0x20;
+
+ /* character/sprites lookup table */
+ for (i = 0x000; i < 0x100; i++)
+ {
+ UINT8 ctabentry = color_prom[i] & 0x0f;
+ colortable_entry_set_value(machine->colortable, i, ctabentry);
+ }
+
+ /* bullets use colors 0x10-0x13 */
+ for (i = 0x100; i < 0x104; i++)
+ colortable_entry_set_value(machine->colortable, i, (i - 0x100) | 0x10);
+
+ /* stars */
+ for (i = 0x104; i < 0x144; i++)
+ colortable_entry_set_value(machine->colortable, i, (i - 0x104) + 0x20);
}
@@ -251,30 +290,60 @@ static TILE_GET_INFO( locomotn_fg_get_tile_info )
***************************************************************************/
-VIDEO_START( rallyx )
+static void calculate_star_field(void)
{
- int i;
+ int generator;
+ int x,y;
- if (video_type == TYPE_RALLYX || video_type == TYPE_JUNGLER)
- {
- bg_tilemap = tilemap_create(rallyx_bg_get_tile_info,tilemap_scan_rows,8,8,32,32);
- fg_tilemap = tilemap_create(rallyx_fg_get_tile_info,fg_tilemap_scan, 8,8, 8,32);
- }
- else
+ /* precalculate the star background */
+ total_stars = 0;
+ generator = 0;
+
+ for (y = 0;y < 256;y++)
{
- bg_tilemap = tilemap_create(locomotn_bg_get_tile_info,tilemap_scan_rows,8,8,32,32);
- fg_tilemap = tilemap_create(locomotn_fg_get_tile_info,fg_tilemap_scan, 8,8, 8,32);
+ for (x = 0;x < 288;x++)
+ {
+ int bit1,bit2;
+
+ generator <<= 1;
+ bit1 = (~generator >> 17) & 1;
+ bit2 = (generator >> 5) & 1;
+
+ if (bit1 ^ bit2) generator |= 1;
+
+ if (((~generator >> 16) & 1) &&
+ (generator & 0xfe) == 0xfe)
+ {
+ int color;
+
+ color = (~(generator >> 8)) & 0x3f;
+
+ if (color && total_stars < MAX_STARS)
+ {
+ stars[total_stars].x = x;
+ stars[total_stars].y = y;
+ stars[total_stars].color = color;
+
+ total_stars++;
+ }
+ }
+ }
}
+}
+
+
+VIDEO_START( rallyx )
+{
+ int i;
+
+ bg_tilemap = tilemap_create(rallyx_bg_get_tile_info,tilemap_scan_rows,8,8,32,32);
+ fg_tilemap = tilemap_create(rallyx_fg_get_tile_info,fg_tilemap_scan, 8,8, 8,32);
/* the scrolling tilemap is slightly misplaced in Rally X */
- if (video_type == TYPE_RALLYX)
- tilemap_set_scrolldx(bg_tilemap,3,3);
+ tilemap_set_scrolldx(bg_tilemap,3,3);
+
+ spriteram_base = 0x14;
- /* commsega has more sprites and bullets than the other games */
- if (video_type == TYPE_COMMSEGA)
- spriteram_base = 0x00;
- else
- spriteram_base = 0x14;
spriteram = rallyx_videoram + 0x00;
spriteram_2 = spriteram + 0x800;
rallyx_radarx = rallyx_videoram + 0x20;
@@ -282,58 +351,104 @@ VIDEO_START( rallyx )
for (i = 0;i < 16;i++)
machine->shadow_table[i] = i+16;
+
for (i = 16;i < 32;i++)
machine->shadow_table[i] = i;
+
for (i = 0;i < 3;i++)
gfx_drawmode_table[i] = DRAWMODE_SHADOW;
+
gfx_drawmode_table[3] = DRAWMODE_NONE;
+}
- /* Rally X doesn't have the optional starfield generator */
- if (video_type != TYPE_RALLYX)
- {
- int generator;
- int x,y;
+VIDEO_START( jungler )
+{
+ int i;
- /* precalculate the star background */
- /* this comes from the Galaxian hardware, Bosconian is probably different */
- total_stars = 0;
- generator = 0;
+ bg_tilemap = tilemap_create(rallyx_bg_get_tile_info,tilemap_scan_rows,8,8,32,32);
+ fg_tilemap = tilemap_create(rallyx_fg_get_tile_info,fg_tilemap_scan, 8,8, 8,32);
- for (y = 0;y < 256;y++)
- {
- for (x = 0;x < 288;x++)
- {
- int bit1,bit2;
+ spriteram_base = 0x14;
+ spriteram = rallyx_videoram + 0x00;
+ spriteram_2 = spriteram + 0x800;
+ rallyx_radarx = rallyx_videoram + 0x20;
+ rallyx_radary = rallyx_radarx + 0x800;
- generator <<= 1;
- bit1 = (~generator >> 17) & 1;
- bit2 = (generator >> 5) & 1;
+ for (i = 0;i < 16;i++)
+ machine->shadow_table[i] = i+16;
- if (bit1 ^ bit2) generator |= 1;
+ for (i = 16;i < 32;i++)
+ machine->shadow_table[i] = i;
- if (((~generator >> 16) & 1) &&
- (generator & 0xfe) == 0xfe)
- {
- int color;
+ for (i = 0;i < 3;i++)
+ gfx_drawmode_table[i] = DRAWMODE_SHADOW;
- color = (~(generator >> 8)) & 0x3f;
- if (color && total_stars < MAX_STARS)
- {
- stars[total_stars].x = x;
- stars[total_stars].y = y;
- stars[total_stars].color = machine->pens[color + STARS_COLOR_BASE];
+ gfx_drawmode_table[3] = DRAWMODE_NONE;
- total_stars++;
- }
- }
- }
- }
- }
+ calculate_star_field();
}
+VIDEO_START( locomotn )
+{
+ int i;
+
+ bg_tilemap = tilemap_create(locomotn_bg_get_tile_info,tilemap_scan_rows,8,8,32,32);
+ fg_tilemap = tilemap_create(locomotn_fg_get_tile_info,fg_tilemap_scan, 8,8, 8,32);
+
+ spriteram_base = 0x14;
+
+ spriteram = rallyx_videoram + 0x00;
+ spriteram_2 = spriteram + 0x800;
+ rallyx_radarx = rallyx_videoram + 0x20;
+ rallyx_radary = rallyx_radarx + 0x800;
+
+ for (i = 0;i < 16;i++)
+ machine->shadow_table[i] = i+16;
+
+ for (i = 16;i < 32;i++)
+ machine->shadow_table[i] = i;
+
+ for (i = 0;i < 3;i++)
+ gfx_drawmode_table[i] = DRAWMODE_SHADOW;
+
+ gfx_drawmode_table[3] = DRAWMODE_NONE;
+
+ calculate_star_field();
+}
+
+
+VIDEO_START( commsega )
+{
+ int i;
+
+ bg_tilemap = tilemap_create(locomotn_bg_get_tile_info,tilemap_scan_rows,8,8,32,32);
+ fg_tilemap = tilemap_create(locomotn_fg_get_tile_info,fg_tilemap_scan, 8,8, 8,32);
+
+ /* commsega has more sprites and bullets than the other games */
+ spriteram_base = 0x00;
+
+ spriteram = rallyx_videoram + 0x00;
+ spriteram_2 = spriteram + 0x800;
+ rallyx_radarx = rallyx_videoram + 0x20;
+ rallyx_radary = rallyx_radarx + 0x800;
+
+ for (i = 0;i < 16;i++)
+ machine->shadow_table[i] = i+16;
+
+ for (i = 16;i < 32;i++)
+ machine->shadow_table[i] = i;
+
+ for (i = 0;i < 3;i++)
+ gfx_drawmode_table[i] = DRAWMODE_SHADOW;
+
+ gfx_drawmode_table[3] = DRAWMODE_NONE;
+
+ calculate_star_field();
+}
+
/***************************************************************************
@@ -369,8 +484,6 @@ WRITE8_HANDLER( tactcian_starson_w )
static void plot_star(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int x, int y, int color)
{
- int bpen = machine->pens[0];
-
if (y < cliprect->min_y ||
y > cliprect->max_y ||
x < cliprect->min_x ||
@@ -378,15 +491,12 @@ static void plot_star(running_machine *machine, mame_bitmap *bitmap, const recta
return;
if (flip_screen_x)
- {
x = 255 - x;
- }
+
if (flip_screen_y)
- {
y = 255 - y;
- }
- if (*BITMAP_ADDR16(bitmap, y, x) == bpen)
+ if (colortable_entry_get_value(machine->colortable, *BITMAP_ADDR16(bitmap, y, x) % 0x144) == 0)
*BITMAP_ADDR16(bitmap, y, x) = machine->pens[STARS_COLOR_BASE + color];
}
@@ -396,16 +506,11 @@ static void draw_stars(running_machine *machine, mame_bitmap *bitmap, const rect
for (offs = 0;offs < total_stars;offs++)
{
- int x,y;
-
-
- x = stars[offs].x;
- y = stars[offs].y;
+ int x = stars[offs].x;
+ int y = stars[offs].y;
if ((y & 0x01) ^ ((x >> 3) & 0x01))
- {
plot_star(machine, bitmap, cliprect, x, y, stars[offs].color);
- }
}
}
@@ -418,16 +523,19 @@ static void rallyx_draw_sprites(running_machine *machine, mame_bitmap *bitmap, c
{
int sx = spriteram[offs + 1] + ((spriteram_2[offs + 1] & 0x80) << 1) - displacement;
int sy = 241 - spriteram_2[offs] - displacement;
+ int color = spriteram_2[offs + 1] & 0x3f;
int flipx = spriteram[offs] & 1;
int flipy = spriteram[offs] & 2;
if (flip_screen) sx -= 2*displacement;
pdrawgfx(bitmap,machine->gfx[1],
(spriteram[offs] & 0xfc) >> 2,
- spriteram_2[offs + 1] & 0x3f,
+ color,
flipx,flipy,
sx,sy,
- cliprect,TRANSPARENCY_COLOR,0,0x02);
+ cliprect,TRANSPARENCY_PENS,
+ colortable_get_transpen_mask(machine->colortable, machine->gfx[1], color, 0),
+ 0x02);
}
}
@@ -439,6 +547,7 @@ static void locomotn_draw_sprites(running_machine *machine, mame_bitmap *bitmap,
{
int sx = spriteram[offs + 1] + ((spriteram_2[offs + 1] & 0x80) << 1);
int sy = 241 - spriteram_2[offs] - displacement;
+ int color = spriteram_2[offs + 1] & 0x3f;
int flip = spriteram[offs] & 2;
/* handle reduced visible area in some games */
@@ -446,10 +555,12 @@ static void locomotn_draw_sprites(running_machine *machine, mame_bitmap *bitmap,
pdrawgfx(bitmap,machine->gfx[1],
((spriteram[offs] & 0x7c) >> 2) + 0x20*(spriteram[offs] & 0x01) + ((spriteram[offs] & 0x80) >> 1),
- spriteram_2[offs + 1] & 0x3f,
+ color,
flip,flip,
sx,sy,
- cliprect,TRANSPARENCY_COLOR,0,0x02);
+ cliprect,TRANSPARENCY_PENS,
+ colortable_get_transpen_mask(machine->colortable, machine->gfx[1], color, 0),
+ 0x02);
}
}
@@ -547,35 +658,84 @@ VIDEO_UPDATE( rallyx )
tilemap_draw(bitmap,&bg_clip,bg_tilemap,0,0);
tilemap_draw(bitmap,&fg_clip,fg_tilemap,0,0);
+ tilemap_draw(bitmap,&bg_clip,bg_tilemap,1,1);
+ tilemap_draw(bitmap,&fg_clip,fg_tilemap,1,1);
+
+ rallyx_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN);
+ rallyx_draw_sprites(machine, bitmap,cliprect,1);
+ rallyx_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN_TABLE);
+
+ return 0;
+}
+
+
+VIDEO_UPDATE( jungler )
+{
+ /* the radar tilemap is just 8x32. We rely on the tilemap code to repeat it across
+ the screen, and clip it to only the position where it is supposed to be shown */
+ rectangle fg_clip = *cliprect;
+ rectangle bg_clip = *cliprect;
+ if (flip_screen)
+ {
+ bg_clip.min_x = 8*8;
+ fg_clip.max_x = 8*8-1;
+ }
+ else
+ {
+ bg_clip.max_x = 28*8-1;
+ fg_clip.min_x = 28*8;
+ }
+
+ fillbitmap(priority_bitmap,0,cliprect);
+
/* tile priority doesn't seem to be supported in Jungler */
- tilemap_draw(bitmap,&bg_clip,bg_tilemap,1,video_type == TYPE_JUNGLER ? 0 : 1);
- tilemap_draw(bitmap,&fg_clip,fg_tilemap,1,video_type == TYPE_JUNGLER ? 0 : 1);
+ tilemap_draw(bitmap,&bg_clip,bg_tilemap,0,0);
+ tilemap_draw(bitmap,&fg_clip,fg_tilemap,0,0);
+ tilemap_draw(bitmap,&bg_clip,bg_tilemap,1,0);
+ tilemap_draw(bitmap,&fg_clip,fg_tilemap,1,0);
+
+ jungler_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN);
+ rallyx_draw_sprites(machine, bitmap,cliprect,0);
+ jungler_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN_TABLE);
+
+ if (stars_enable)
+ draw_stars(machine, bitmap, cliprect);
+
+ return 0;
+}
+
- switch (video_type)
+VIDEO_UPDATE( locomotn )
+{
+ /* the radar tilemap is just 8x32. We rely on the tilemap code to repeat it across
+ the screen, and clip it to only the position where it is supposed to be shown */
+ rectangle fg_clip = *cliprect;
+ rectangle bg_clip = *cliprect;
+ if (flip_screen)
+ {
+ bg_clip.min_x = 8*8;
+ fg_clip.max_x = 8*8-1;
+ }
+ else
{
- case TYPE_RALLYX:
- rallyx_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN);
- rallyx_draw_sprites(machine, bitmap,cliprect,1);
- rallyx_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN_TABLE);
- break;
-
- case TYPE_JUNGLER:
- jungler_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN);
- rallyx_draw_sprites(machine, bitmap,cliprect,0);
- jungler_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN_TABLE);
- break;
-
- case TYPE_TACTCIAN:
- case TYPE_LOCOMOTN:
- case TYPE_COMMSEGA:
- locomotn_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN);
- locomotn_draw_sprites(machine, bitmap,cliprect,0);
- locomotn_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN_TABLE);
- break;
+ bg_clip.max_x = 28*8-1;
+ fg_clip.min_x = 28*8;
}
- /* Rally X doesn't have the optional starfield generator */
- if (video_type != TYPE_RALLYX)
- if (stars_enable) draw_stars(machine, bitmap,cliprect);
+ fillbitmap(priority_bitmap,0,cliprect);
+
+ tilemap_draw(bitmap,&bg_clip,bg_tilemap,0,0);
+ tilemap_draw(bitmap,&fg_clip,fg_tilemap,0,0);
+ tilemap_draw(bitmap,&bg_clip,bg_tilemap,1,1);
+ tilemap_draw(bitmap,&fg_clip,fg_tilemap,1,1);
+
+ locomotn_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN);
+ locomotn_draw_sprites(machine, bitmap,cliprect,0);
+ locomotn_draw_bullets(machine, bitmap,cliprect,TRANSPARENCY_PEN_TABLE);
+
+ if (stars_enable)
+ draw_stars(machine, bitmap, cliprect);
+
return 0;
}
+