summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/safarir.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/safarir.c')
-rw-r--r--src/mame/drivers/safarir.c322
1 files changed, 322 insertions, 0 deletions
diff --git a/src/mame/drivers/safarir.c b/src/mame/drivers/safarir.c
new file mode 100644
index 00000000000..88bf965e3bc
--- /dev/null
+++ b/src/mame/drivers/safarir.c
@@ -0,0 +1,322 @@
+/****************************************************************************
+
+ Safari Rally hardware
+
+ driver by Zsolt Vasvari
+
+ Games Supported:
+ * Safari Rally (Japan)
+
+ Known issues/to-do's:
+ * SN76477 sound
+ * Background colors are wrong.
+ Flyer shows red and perhaps blue,
+ but I don't see an obvious mapping
+
+ Notes:
+ * This hardware is a precursor to Phoenix
+
+ ----------------------------------
+
+ CPU board
+
+ 76477 18MHz
+
+ 8080
+
+ ----------------------------------
+
+ Video board
+
+
+ RL07 2114
+ 2114
+ 2114
+ 2114
+ 2114 RL01 RL02
+ 2114 RL03 RL04
+ 2114 RL05 RL06
+ RL08 2114
+
+ 11MHz
+
+ ----------------------------------
+
+****************************************************************************/
+
+#include "driver.h"
+
+
+static UINT8 *ram_1, *ram_2;
+static size_t ram_size;
+static UINT8 ram_bank;
+static tilemap *bg_tilemap, *fg_tilemap;
+static UINT8 *bg_scroll;
+
+
+
+/*************************************
+ *
+ * RAM banking
+ *
+ *************************************/
+
+static WRITE8_HANDLER( ram_w )
+{
+ if (ram_bank)
+ ram_2[offset] = data;
+ else
+ ram_1[offset] = data;
+
+ tilemap_mark_tile_dirty((offset & 0x0400) ? bg_tilemap : fg_tilemap, offset & 0x03ff);
+}
+
+
+static READ8_HANDLER( ram_r )
+{
+ return ram_bank ? ram_2[offset] : ram_1[offset];
+}
+
+
+static WRITE8_HANDLER( ram_bank_w )
+{
+ ram_bank = data & 0x01;
+
+ tilemap_mark_all_tiles_dirty(ALL_TILEMAPS);
+}
+
+
+/*************************************
+ *
+ * Video system
+ *
+ *************************************/
+
+static const gfx_layout charlayout =
+{
+ 8,8, /* 8*8 chars */
+ 128, /* 128 characters */
+ 1, /* 1 bit per pixel */
+ { 0 },
+ { 7, 6, 5, 4, 3, 2, 1, 0 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8 /* every char takes 8 consecutive bytes */
+};
+
+
+static GFXDECODE_START( safarir )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, charlayout, 0, 8 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, charlayout, 0, 8 )
+GFXDECODE_END
+
+
+static PALETTE_INIT( safarir )
+{
+ int i;
+
+ for (i = 0; i < machine->drv->total_colors; i++)
+ {
+ palette_set_color_rgb(machine, i, pal1bit(i >> 2), pal1bit(i >> 1), pal1bit(i >> 0));
+
+ colortable[(i * 2) + 0] = 0;
+ colortable[(i * 2) + 1] = i;
+ }
+}
+
+static TILE_GET_INFO( get_bg_tile_info )
+{
+ int color;
+ UINT8 code = ram_r(tile_index | 0x400);
+
+ /* this is wrong */
+ if (code & 0x80)
+ color = 6; /* yellow */
+ else
+ color = 2; /* green */
+
+ SET_TILE_INFO(0, code & 0x7f, color, 0);
+}
+
+
+static TILE_GET_INFO( get_fg_tile_info )
+{
+ int color, flags;
+ UINT8 code = ram_r(tile_index);
+
+ if (code & 0x80)
+ color = 7; /* white */
+ else
+ color = (~tile_index & 0x04) | ((tile_index >> 1) & 0x03);
+
+ flags = ((tile_index & 0x1f) >= 0x03) ? 0 : TILE_FORCE_LAYER0;
+
+ SET_TILE_INFO(1, code & 0x7f, color, flags);
+}
+
+
+static VIDEO_START( safarir )
+{
+ bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8, 32, 32);
+ fg_tilemap = tilemap_create(get_fg_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8, 32, 32);
+
+ tilemap_set_transparent_pen(fg_tilemap, 0);
+}
+
+
+static VIDEO_UPDATE( safarir )
+{
+ tilemap_set_scrollx(bg_tilemap, 0, *bg_scroll);
+
+ tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
+ tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0);
+
+ return 0;
+}
+
+
+
+/*************************************
+ *
+ * Machine start
+ *
+ *************************************/
+
+static MACHINE_START( safarir )
+{
+ ram_1 = auto_malloc(ram_size);
+ ram_2 = auto_malloc(ram_size);
+
+ /* setup for save states */
+ state_save_register_global_pointer(ram_1, ram_size);
+ state_save_register_global_pointer(ram_2, ram_size);
+ state_save_register_global(ram_bank);
+}
+
+
+
+/*************************************
+ *
+ * Memory handlers
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x17ff) AM_ROM
+ AM_RANGE(0x2000, 0x27ff) AM_READWRITE(ram_r, ram_w) AM_SIZE(&ram_size)
+ AM_RANGE(0x2800, 0x2800) AM_MIRROR(0x03ff) AM_READWRITE(MRA8_NOP, ram_bank_w)
+ AM_RANGE(0x2c00, 0x2cff) AM_MIRROR(0x03ff) AM_READWRITE(MRA8_NOP, MWA8_RAM) AM_BASE(&bg_scroll)
+ AM_RANGE(0x3000, 0x30ff) AM_MIRROR(0x03ff) AM_WRITENOP /* goes to SN76477 */
+ AM_RANGE(0x3400, 0x3400) AM_MIRROR(0x03ff) AM_WRITENOP /* cleared at the beginning */
+ AM_RANGE(0x3800, 0x38ff) AM_MIRROR(0x03ff) AM_READWRITE(input_port_0_r, MWA8_NOP)
+ AM_RANGE(0x3c00, 0x3cff) AM_MIRROR(0x03ff) AM_READWRITE(input_port_1_r, MWA8_NOP)
+ADDRESS_MAP_END
+
+
+
+/*************************************
+ *
+ * Port definition
+ *
+ *************************************/
+
+static INPUT_PORTS_START( safarir )
+ PORT_START /* IN0 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_2WAY
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_2WAY
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START /* DSW0 */
+ PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPSETTING( 0x01, "4" )
+ PORT_DIPSETTING( 0x02, "5" )
+ PORT_DIPSETTING( 0x03, "6" )
+ PORT_DIPNAME( 0x0c, 0x04, "Acceleration Rate" )
+ PORT_DIPSETTING( 0x00, "Slowest" )
+ PORT_DIPSETTING( 0x04, "Slow" )
+ PORT_DIPSETTING( 0x08, "Fast" )
+ PORT_DIPSETTING( 0x0c, "Fastest" )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x60, 0x20, DEF_STR( Bonus_Life ) )
+ PORT_DIPSETTING( 0x00, "3000" )
+ PORT_DIPSETTING( 0x20, "5000" )
+ PORT_DIPSETTING( 0x40, "7000" )
+ PORT_DIPSETTING( 0x60, "9000" )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_VBLANK )
+INPUT_PORTS_END
+
+
+
+/*************************************
+ *
+ * Machine driver
+ *
+ *************************************/
+
+static MACHINE_DRIVER_START( safarir )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(8080, 3072000) /* 3 MHz ? */
+ MDRV_CPU_PROGRAM_MAP(main_map, 0)
+
+ MDRV_MACHINE_START(safarir)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_VIDEO_START(safarir)
+ MDRV_VIDEO_UPDATE(safarir)
+ MDRV_PALETTE_LENGTH(8)
+ MDRV_PALETTE_INIT(safarir)
+ MDRV_COLORTABLE_LENGTH(2*8)
+ MDRV_GFXDECODE(safarir)
+
+ MDRV_SCREEN_ADD("main", 0)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(32*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 26*8-1)
+ MDRV_SCREEN_REFRESH_RATE(60)
+
+ /* audio hardware */
+
+MACHINE_DRIVER_END
+
+
+
+/*************************************
+ *
+ * ROM definition
+ *
+ *************************************/
+
+ROM_START( safarir )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "rl01", 0x0000, 0x0400, CRC(cf7703c9) SHA1(b4182df9332b355edaa518462217a6e31e1c07b2) )
+ ROM_LOAD( "rl02", 0x0400, 0x0400, CRC(1013ecd3) SHA1(2fe367db8ca367b36c5378cb7d5ff918db243c78) )
+ ROM_LOAD( "rl03", 0x0800, 0x0400, CRC(84545894) SHA1(377494ceeac5ad58b70f77b2b27b609491cb7ffd) )
+ ROM_LOAD( "rl04", 0x0c00, 0x0400, CRC(5dd12f96) SHA1(a80ac0705648f0807ea33e444fdbea450bf23f85) )
+ ROM_LOAD( "rl05", 0x1000, 0x0400, CRC(935ed469) SHA1(052a59df831dcc2c618e9e5e5fdfa47548550596) )
+ ROM_LOAD( "rl06", 0x1400, 0x0400, CRC(24c1cd42) SHA1(fe32ecea77a3777f8137ca248b8f371db37b8b85) )
+
+ ROM_REGION( 0x0400, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "rl08", 0x0000, 0x0400, CRC(d6a50aac) SHA1(0a0c2cefc556e4e15085318fcac485b82bac2416) )
+
+ ROM_REGION( 0x0400, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "rl07", 0x0000, 0x0400, CRC(ba525203) SHA1(1c261cc1259787a7a248766264fefe140226e465) )
+ROM_END
+
+
+
+/*************************************
+ *
+ * Game driver
+ *
+ *************************************/
+
+GAME( 1979, safarir, 0, safarir, safarir, 0, ROT90, "SNK", "Safari Rally (Japan)", GAME_IMPERFECT_COLORS | GAME_NO_SOUND | GAME_SUPPORTS_SAVE )