summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/nwk-tr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/nwk-tr.c')
-rw-r--r--src/mame/drivers/nwk-tr.c1173
1 files changed, 1173 insertions, 0 deletions
diff --git a/src/mame/drivers/nwk-tr.c b/src/mame/drivers/nwk-tr.c
new file mode 100644
index 00000000000..f1729ab4e7c
--- /dev/null
+++ b/src/mame/drivers/nwk-tr.c
@@ -0,0 +1,1173 @@
+/* Konami NWK-TR System
+
+ Driver by Ville Linde
+
+
+
+ Hardware overview:
+
+ GN676 CPU Board:
+ ----------------
+ IBM PowerPC 403GA at 32MHz (main CPU)
+ Motorola MC68EC000 at 16MHz (sound CPU)
+ Konami K056800 (MIRAC), sound system interface
+ Ricoh RF5c400 sound chip
+ National Semiconductor ADC12138
+
+ GN676 GFX Board:
+ ----------------
+ Analog Devices ADSP-21062 SHARC DSP at 36MHz
+ Konami K001604 (2D tilemaps + 2x ROZ)
+ Konami 0000033906 (PCI bridge)
+ 3DFX 500-0003-03 (Voodoo) FBI with 2MB RAM
+ 2x 3DFX 500-0004-02 (Voodoo) TMU with 2MB RAM
+
+ GN676 LAN Board:
+ ----------------
+ Xilinx XC5210 FPGA
+ Xilinx XC5204 FPGA
+
+*/
+
+#include "driver.h"
+#include "cpu/powerpc/ppc.h"
+#include "cpu/sharc/sharc.h"
+#include "machine/konppc.h"
+#include "machine/konamiic.h"
+#include "machine/adc1213x.h"
+#include "sound/rf5c400.h"
+#include "video/voodoo.h"
+#include "machine/timekpr.h"
+
+static UINT8 led_reg0 = 0x7f, led_reg1 = 0x7f;
+
+static UINT32 *work_ram;
+static UINT8 backup_ram[0x2000];
+
+
+static WRITE32_HANDLER( paletteram32_w )
+{
+ COMBINE_DATA(&paletteram32[offset]);
+ data = paletteram32[offset];
+ palette_set_color_rgb(Machine, offset, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0));
+}
+
+
+
+/* K001604 Tilemap chip (move to konamiic.c ?) */
+
+#define MAX_K001604_CHIPS 2
+
+static UINT32 *K001604_tile_ram[MAX_K001604_CHIPS];
+static UINT32 *K001604_char_ram[MAX_K001604_CHIPS];
+static UINT8 *K001604_dirty_map[MAX_K001604_CHIPS][2];
+static int K001604_gfx_index[MAX_K001604_CHIPS][2], K001604_char_dirty[MAX_K001604_CHIPS][2];
+static tilemap *K001604_layer_8x8[MAX_K001604_CHIPS][2];
+static int K001604_tilemap_offset;
+static tilemap *K001604_layer_roz[MAX_K001604_CHIPS][2];
+static int K001604_roz_size[MAX_K001604_CHIPS];
+
+static UINT32 K001604_reg[MAX_K001604_CHIPS][256];
+
+static int K001604_layer_size;
+
+#define K001604_NUM_TILES_LAYER0 16384
+#define K001604_NUM_TILES_LAYER1 4096
+
+static gfx_layout K001604_char_layout_layer_8x8 =
+{
+ 8, 8,
+ K001604_NUM_TILES_LAYER0,
+ 8,
+ { 8,9,10,11,12,13,14,15 },
+ { 1*16, 0*16, 3*16, 2*16, 5*16, 4*16, 7*16, 6*16 },
+ { 0*128, 1*128, 2*128, 3*128, 4*128, 5*128, 6*128, 7*128 },
+ 8*128
+};
+
+static gfx_layout K001604_char_layout_layer_16x16 =
+{
+ 16, 16,
+ K001604_NUM_TILES_LAYER1,
+ 8,
+ { 8,9,10,11,12,13,14,15 },
+ { 1*16, 0*16, 3*16, 2*16, 5*16, 4*16, 7*16, 6*16, 9*16, 8*16, 11*16, 10*16, 13*16, 12*16, 15*16, 14*16 },
+ { 0*256, 1*256, 2*256, 3*256, 4*256, 5*256, 6*256, 7*256, 8*256, 9*256, 10*256, 11*256, 12*256, 13*256, 14*256, 15*256 },
+ 16*256
+};
+
+
+static TILEMAP_MAPPER( K001604_scan_layer_8x8_0 )
+{
+ /* logical (col,row) -> memory offset */
+ int width = K001604_layer_size ? 256 : 128;
+ return K001604_tilemap_offset + (row * width) + col;
+}
+
+static TILEMAP_MAPPER( K001604_scan_layer_8x8_1 )
+{
+ /* logical (col,row) -> memory offset */
+ int width = K001604_layer_size ? 256 : 128;
+ return K001604_tilemap_offset + (row * width) + col + 64;
+}
+
+static TILEMAP_MAPPER( K001604_scan_layer_roz_0 )
+{
+ /* logical (col,row) -> memory offset */
+ int width = K001604_layer_size ? 256 : 128;
+ return (row * width) + col + (K001604_layer_size ? 128 : 0);
+}
+
+static TILEMAP_MAPPER( K001604_scan_layer_roz_1 )
+{
+ /* logical (col,row) -> memory offset */
+ int width = K001604_layer_size ? 256 : 128;
+ return (row * width) + col + (K001604_layer_size ? 192 : 64);
+}
+
+static TILE_GET_INFO( K001604_0_tile_info_layer_8x8 )
+{
+ UINT32 val = K001604_tile_ram[0][tile_index];
+ int color = (val >> 17) & 0x1f;
+ int tile = (val & 0x7fff);
+ int flags = 0;
+
+ if (val & 0x400000)
+ flags |= TILE_FLIPX;
+ if (val & 0x800000)
+ flags |= TILE_FLIPY;
+
+ SET_TILE_INFO(K001604_gfx_index[0][0], tile, color, flags);
+}
+
+static TILE_GET_INFO( K001604_0_tile_info_layer_roz )
+{
+ UINT32 val = K001604_tile_ram[0][tile_index];
+ int flags = 0;
+ int color = (val >> 17) & 0x1f;
+ int tile = val & 0x7ff;
+
+ if (val & 0x400000)
+ flags |= TILE_FLIPX;
+ if (val & 0x800000)
+ flags |= TILE_FLIPY;
+
+ tile += K001604_roz_size[0] ? 0x800 : 0x2000;
+
+ SET_TILE_INFO(K001604_gfx_index[0][K001604_roz_size[0]], tile, color, flags);
+}
+
+static TILE_GET_INFO( K001604_1_tile_info_layer_8x8 )
+{
+ UINT32 val = K001604_tile_ram[1][tile_index];
+ int color = (val >> 17) & 0x1f;
+ int tile = (val & 0x7fff);
+ int flags = 0;
+
+ if (val & 0x400000)
+ flags |= TILE_FLIPX;
+ if (val & 0x800000)
+ flags |= TILE_FLIPY;
+
+ SET_TILE_INFO(K001604_gfx_index[1][0], tile, color, flags);
+}
+
+static TILE_GET_INFO( K001604_1_tile_info_layer_roz )
+{
+ UINT32 val = K001604_tile_ram[1][tile_index];
+ int flags = 0;
+ int color = (val >> 17) & 0x1f;
+ int tile = (val & 0x7ff);
+
+ if (val & 0x400000)
+ flags |= TILE_FLIPX;
+ if (val & 0x800000)
+ flags |= TILE_FLIPY;
+
+ tile += K001604_roz_size[1] ? 0x800 : 0x2000;
+
+ SET_TILE_INFO(K001604_gfx_index[1][K001604_roz_size[1]], tile, color, flags);
+}
+
+int K001604_vh_start(running_machine *machine, int chip)
+{
+ const char *gamename = machine->gamedrv->name;
+
+ /* HACK !!! To be removed */
+ if (mame_stricmp(gamename, "racingj") == 0 || mame_stricmp(gamename, "racingj2") == 0
+ || mame_stricmp(gamename, "hangplt") == 0 || mame_stricmp(gamename, "slrasslt") == 0
+ || mame_stricmp(gamename, "jetwave") == 0)
+ {
+ K001604_layer_size = 0; // width = 128 tiles
+ }
+ else
+ {
+ K001604_layer_size = 1; // width = 256 tiles
+ }
+
+ /* HACK !!! To be removed */
+ if (mame_stricmp(gamename, "slrasslt") == 0)
+ {
+ K001604_tilemap_offset = 16384;
+
+ K001604_roz_size[chip] = 0; // 8x8
+ }
+ else
+ {
+ K001604_tilemap_offset = 0;
+
+ K001604_roz_size[chip] = 1; // 16x16
+ }
+
+ for (K001604_gfx_index[chip][0] = 0; K001604_gfx_index[chip][0] < MAX_GFX_ELEMENTS; K001604_gfx_index[chip][0]++)
+ if (machine->gfx[K001604_gfx_index[chip][0]] == 0)
+ break;
+ if (K001604_gfx_index[chip][0] == MAX_GFX_ELEMENTS)
+ {
+ return 1;
+ }
+
+ for (K001604_gfx_index[chip][1] = K001604_gfx_index[chip][0] + 1; K001604_gfx_index[chip][1] < MAX_GFX_ELEMENTS; K001604_gfx_index[chip][1]++)
+ if (machine->gfx[K001604_gfx_index[chip][1]] == 0)
+ break;
+ if (K001604_gfx_index[chip][1] == MAX_GFX_ELEMENTS)
+ {
+ return 1;
+ }
+
+ K001604_char_ram[chip] = auto_malloc(0x200000);
+
+ K001604_tile_ram[chip] = auto_malloc(0x20000);
+
+ K001604_dirty_map[chip][0] = auto_malloc(K001604_NUM_TILES_LAYER0);
+ K001604_dirty_map[chip][1] = auto_malloc(K001604_NUM_TILES_LAYER1);
+
+
+ if (chip == 0)
+ {
+ int roz_tile_size = K001604_roz_size[chip] ? 16 : 8;
+ int roz_width = K001604_layer_size ? 64 : 128;
+ K001604_layer_8x8[chip][0] = tilemap_create(K001604_0_tile_info_layer_8x8, K001604_scan_layer_8x8_0, TILEMAP_TYPE_PEN, 8, 8, 64, 64);
+ K001604_layer_8x8[chip][1] = tilemap_create(K001604_0_tile_info_layer_8x8, K001604_scan_layer_8x8_1, TILEMAP_TYPE_PEN, 8, 8, 64, 64);
+
+ K001604_layer_roz[chip][0] = tilemap_create(K001604_0_tile_info_layer_roz, K001604_scan_layer_roz_0, TILEMAP_TYPE_PEN, roz_tile_size, roz_tile_size, roz_width, 64);
+ K001604_layer_roz[chip][1] = tilemap_create(K001604_0_tile_info_layer_roz, K001604_scan_layer_roz_1, TILEMAP_TYPE_PEN, roz_tile_size, roz_tile_size, 64, 64);
+ }
+ else
+ {
+ int roz_tile_size = K001604_roz_size[chip] ? 16 : 8;
+ int roz_width = K001604_layer_size ? 64 : 128;
+ K001604_layer_8x8[chip][0] = tilemap_create(K001604_1_tile_info_layer_8x8, K001604_scan_layer_8x8_0, TILEMAP_TYPE_PEN, 8, 8, 64, 64);
+ K001604_layer_8x8[chip][1] = tilemap_create(K001604_1_tile_info_layer_8x8, K001604_scan_layer_8x8_1, TILEMAP_TYPE_PEN, 8, 8, 64, 64);
+
+ K001604_layer_roz[chip][0] = tilemap_create(K001604_1_tile_info_layer_roz, K001604_scan_layer_roz_0, TILEMAP_TYPE_PEN, roz_tile_size, roz_tile_size, roz_width, 64);
+ K001604_layer_roz[chip][1] = tilemap_create(K001604_1_tile_info_layer_roz, K001604_scan_layer_roz_1, TILEMAP_TYPE_PEN, roz_tile_size, roz_tile_size, 64, 64);
+ }
+
+ tilemap_set_transparent_pen(K001604_layer_8x8[chip][0], 0);
+ tilemap_set_transparent_pen(K001604_layer_8x8[chip][1], 0);
+
+ memset(K001604_char_ram[chip], 0, 0x200000);
+ memset(K001604_tile_ram[chip], 0, 0x10000);
+ memset(K001604_dirty_map[chip][0], 0, K001604_NUM_TILES_LAYER0);
+ memset(K001604_dirty_map[chip][1], 0, K001604_NUM_TILES_LAYER1);
+
+
+ machine->gfx[K001604_gfx_index[chip][0]] = allocgfx(&K001604_char_layout_layer_8x8);
+ decodegfx(machine->gfx[K001604_gfx_index[chip][0]], (UINT8*)&K001604_char_ram[chip][0], 0, machine->gfx[K001604_gfx_index[chip][0]]->total_elements);
+ machine->gfx[K001604_gfx_index[chip][1]] = allocgfx(&K001604_char_layout_layer_16x16);
+ decodegfx(machine->gfx[K001604_gfx_index[chip][1]], (UINT8*)&K001604_char_ram[chip][0], 0, machine->gfx[K001604_gfx_index[chip][1]]->total_elements);
+
+ if (machine->drv->color_table_len)
+ {
+ machine->gfx[K001604_gfx_index[chip][0]]->total_colors = machine->drv->color_table_len / 16;
+ machine->gfx[K001604_gfx_index[chip][1]]->total_colors = machine->drv->color_table_len / 16;
+ }
+ else
+ {
+ machine->gfx[K001604_gfx_index[chip][0]]->total_colors = machine->drv->total_colors / 16;
+ machine->gfx[K001604_gfx_index[chip][1]]->total_colors = machine->drv->total_colors / 16;
+ }
+
+ return 0;
+}
+
+void K001604_tile_update(running_machine *machine, int chip)
+{
+ if(K001604_char_dirty[chip][0])
+ {
+ int i;
+ for (i=0; i < K001604_NUM_TILES_LAYER0; i++)
+ {
+ if(K001604_dirty_map[chip][0][i])
+ {
+ K001604_dirty_map[chip][0][i] = 0;
+ decodechar(machine->gfx[K001604_gfx_index[chip][0]], i,
+ (UINT8*)&K001604_char_ram[chip][0], &K001604_char_layout_layer_8x8);
+ }
+ }
+ tilemap_mark_all_tiles_dirty(K001604_layer_8x8[chip][0]);
+ tilemap_mark_all_tiles_dirty(K001604_layer_8x8[chip][1]);
+
+ if (K001604_roz_size[chip] == 0)
+ {
+ tilemap_mark_all_tiles_dirty(K001604_layer_roz[chip][0]);
+ tilemap_mark_all_tiles_dirty(K001604_layer_roz[chip][1]);
+ }
+ K001604_char_dirty[chip][0] = 0;
+ }
+ if(K001604_char_dirty[chip][1])
+ {
+ int i;
+ for (i=0; i < K001604_NUM_TILES_LAYER1; i++)
+ {
+ if(K001604_dirty_map[chip][1][i])
+ {
+ K001604_dirty_map[chip][1][i] = 0;
+ decodechar(machine->gfx[K001604_gfx_index[chip][1]], i,
+ (UINT8*)&K001604_char_ram[chip][0], &K001604_char_layout_layer_16x16);
+ }
+ }
+
+ if (K001604_roz_size[chip] == 1)
+ {
+ tilemap_mark_all_tiles_dirty(K001604_layer_roz[chip][0]);
+ tilemap_mark_all_tiles_dirty(K001604_layer_roz[chip][1]);
+ }
+ K001604_char_dirty[chip][1] = 0;
+ }
+}
+
+void K001604_draw_back_layer(int chip, mame_bitmap *bitmap, const rectangle *cliprect)
+{
+ int layer;
+ int num_layers;
+ fillbitmap(bitmap, 0, cliprect);
+
+ num_layers = K001604_layer_size ? 2 : 1;
+
+ for (layer=0; layer < num_layers; layer++)
+ {
+ int reg = 0x08;
+
+ INT32 x = (INT16)((K001604_reg[chip][reg+0] >> 16) & 0xffff);
+ INT32 y = (INT16)((K001604_reg[chip][reg+0] >> 0) & 0xffff);
+ INT32 xx = (INT16)((K001604_reg[chip][reg+1] >> 0) & 0xffff);
+ INT32 xy = (INT16)((K001604_reg[chip][reg+1] >> 16) & 0xffff);
+ INT32 yx = (INT16)((K001604_reg[chip][reg+2] >> 0) & 0xffff);
+ INT32 yy = (INT16)((K001604_reg[chip][reg+2] >> 16) & 0xffff);
+
+ x = (x + 320) * 256;
+ y = (y + 208) * 256;
+ xx = (xx);
+ xy = (-xy);
+ yx = (-yx);
+ yy = (yy);
+
+ if ((K001604_reg[chip][0x6c/4] & (0x08 >> layer)) != 0)
+ {
+ tilemap_draw_roz(bitmap, cliprect, K001604_layer_roz[chip][layer],
+ x << 5, y << 5, xx << 5, xy << 5, yx << 5, yy << 5, 1, 0, 0);
+ }
+ }
+}
+
+void K001604_draw_front_layer(int chip, mame_bitmap *bitmap, const rectangle *cliprect)
+{
+ //tilemap_draw(bitmap, cliprect, K001604_layer_8x8[chip][1], 0,0);
+ tilemap_draw(bitmap, cliprect, K001604_layer_8x8[chip][0], 0,0);
+}
+
+READ32_HANDLER(K001604_tile_r)
+{
+ int chip = get_cgboard_id();
+
+ return K001604_tile_ram[chip][offset];
+}
+
+READ32_HANDLER(K001604_char_r)
+{
+ int chip = get_cgboard_id();
+
+ int set, bank;
+ UINT32 addr;
+
+ set = (K001604_reg[chip][0x60/4] & 0x1000000) ? 0x100000 : 0;
+
+ if (set)
+ {
+ bank = (K001604_reg[chip][0x60/4] >> 8) & 0x3;
+ }
+ else
+ {
+ bank = (K001604_reg[chip][0x60/4] & 0x3);
+ }
+
+ addr = offset + ((set + (bank * 0x40000)) / 4);
+
+ return K001604_char_ram[chip][addr];
+}
+
+WRITE32_HANDLER(K001604_tile_w)
+{
+ int chip = get_cgboard_id();
+
+ int x, y;
+ COMBINE_DATA(K001604_tile_ram[chip] + offset);
+
+ if (K001604_layer_size)
+ {
+ x = offset & 0xff;
+ y = offset / 256;
+ }
+ else
+ {
+ x = offset & 0x7f;
+ y = offset / 128;
+ }
+
+ if (K001604_layer_size)
+ {
+ if (x < 64)
+ {
+ tilemap_mark_tile_dirty(K001604_layer_8x8[chip][0], offset);
+ }
+ else if (x < 128)
+ {
+ tilemap_mark_tile_dirty(K001604_layer_8x8[chip][1], offset);
+ }
+ else if (x < 192)
+ {
+ tilemap_mark_tile_dirty(K001604_layer_roz[chip][0], offset);
+ }
+ else
+ {
+ tilemap_mark_tile_dirty(K001604_layer_roz[chip][1], offset);
+ }
+ }
+ else
+ {
+ if (x < 64)
+ {
+ tilemap_mark_tile_dirty(K001604_layer_8x8[chip][0], offset);
+
+ tilemap_mark_tile_dirty(K001604_layer_roz[chip][0], offset);
+ }
+ else
+ {
+ tilemap_mark_tile_dirty(K001604_layer_8x8[chip][1], offset);
+
+ tilemap_mark_tile_dirty(K001604_layer_roz[chip][1], offset);
+ }
+ }
+}
+
+WRITE32_HANDLER(K001604_char_w)
+{
+ int chip = get_cgboard_id();
+
+ int set, bank;
+ UINT32 addr;
+
+ set = (K001604_reg[chip][0x60/4] & 0x1000000) ? 0x100000 : 0;
+
+ if (set)
+ {
+ bank = (K001604_reg[chip][0x60/4] >> 8) & 0x3;
+ }
+ else
+ {
+ bank = (K001604_reg[chip][0x60/4] & 0x3);
+ }
+
+ addr = offset + ((set + (bank * 0x40000)) / 4);
+
+ COMBINE_DATA(K001604_char_ram[chip] + addr);
+
+ K001604_dirty_map[chip][0][addr / 32] = 1;
+ K001604_char_dirty[chip][0] = 1;
+
+ K001604_dirty_map[chip][1][addr / 128] = 1;
+ K001604_char_dirty[chip][1] = 1;
+}
+
+
+
+WRITE32_HANDLER(K001604_reg_w)
+{
+ int chip = get_cgboard_id();
+
+ COMBINE_DATA(K001604_reg[chip] + offset);
+
+ switch (offset)
+ {
+ case 0x8:
+ case 0x9:
+ case 0xa:
+ //printf("K001604_reg_w %02X, %08X, %08X\n", offset, data, mem_mask);
+ break;
+ }
+
+ if (offset != 0x08 && offset != 0x09 && offset != 0x0a /*&& offset != 0x17 && offset != 0x18*/)
+ {
+ //printf("K001604_reg_w (%d), %02X, %08X, %08X at %08X\n", chip, offset, data, mem_mask, activecpu_get_pc());
+ }
+}
+
+READ32_HANDLER(K001604_reg_r)
+{
+ int chip = get_cgboard_id();
+
+ switch (offset)
+ {
+ case 0x54/4: return mame_rand(Machine) << 16; break;
+ case 0x5c/4: return mame_rand(Machine) << 16 | mame_rand(Machine); break;
+ }
+
+ return K001604_reg[chip][offset];
+}
+
+
+
+
+static void voodoo_vblank_0(int param)
+{
+ cpunum_set_input_line(0, INPUT_LINE_IRQ0, ASSERT_LINE);
+}
+
+static VIDEO_START( nwktr )
+{
+ voodoo_start(0, 0, VOODOO_1, 2, 2, 2);
+ voodoo_set_vblank_callback(0, voodoo_vblank_0);
+
+ K001604_vh_start(machine, 0);
+}
+
+
+static VIDEO_UPDATE( nwktr )
+{
+ fillbitmap(bitmap, machine->remapped_colortable[0], cliprect);
+
+ voodoo_update(0, bitmap, cliprect);
+
+ K001604_tile_update(machine, 0);
+ K001604_draw_front_layer(0, bitmap, cliprect);
+
+ draw_7segment_led(bitmap, 3, 3, led_reg0);
+ draw_7segment_led(bitmap, 9, 3, led_reg1);
+ return 0;
+}
+
+/*****************************************************************************/
+
+static double adc12138_input_callback(int input)
+{
+ int value = 0;
+ switch (input)
+ {
+ case 0: value = readinputport(4) - 0x800; break;
+ case 1: value = readinputport(5); break;
+ case 2: value = readinputport(6); break;
+ case 3: value = readinputport(7); break;
+ case 4: value = readinputport(8); break;
+ }
+
+ return (double)(value) / 2047.0;
+}
+
+static READ32_HANDLER( sysreg_r )
+{
+ UINT32 r = 0;
+ if (offset == 0)
+ {
+ if (!(mem_mask & 0xff000000))
+ {
+ r |= readinputport(0) << 24;
+ }
+ if (!(mem_mask & 0x00ff0000))
+ {
+ r |= readinputport(1) << 16;
+ }
+ if (!(mem_mask & 0x0000ff00))
+ {
+ r |= readinputport(2) << 8;
+ }
+ if (!(mem_mask & 0x000000ff))
+ {
+ r |= (adc1213x_do_r(0)) | (adc1213x_eoc_r(0) << 2);
+ }
+ }
+ else if (offset == 1)
+ {
+ if (!(mem_mask & 0xff000000))
+ {
+ r |= readinputport(3) << 24;
+ }
+ }
+ return r;
+}
+
+static WRITE32_HANDLER( sysreg_w )
+{
+ if( offset == 0 )
+ {
+ if (!(mem_mask & 0xff000000))
+ {
+ led_reg0 = (data >> 24) & 0xff;
+ }
+ if (!(mem_mask & 0x00ff0000))
+ {
+ led_reg1 = (data >> 16) & 0xff;
+ }
+ return;
+ }
+ if( offset == 1 )
+ {
+ if (!(mem_mask & 0xff000000))
+ {
+ int cs = (data >> 27) & 0x1;
+ int conv = (data >> 26) & 0x1;
+ int di = (data >> 25) & 0x1;
+ int sclk = (data >> 24) & 0x1;
+
+ adc1213x_cs_w(0, cs);
+ adc1213x_conv_w(0, conv);
+ adc1213x_di_w(0, di);
+ adc1213x_sclk_w(0, sclk);
+ }
+ if (!(mem_mask & 0x000000ff))
+ {
+ if (data & 0x80) // CG Board 1 IRQ Ack
+ {
+ //cpunum_set_input_line(0, INPUT_LINE_IRQ1, CLEAR_LINE);
+ }
+ if (data & 0x40) // CG Board 0 IRQ Ack
+ {
+ //cpunum_set_input_line(0, INPUT_LINE_IRQ0, CLEAR_LINE);
+ }
+ }
+ return;
+ }
+}
+
+static int fpga_uploaded = 0;
+static int lanc2_ram_r = 0;
+static int lanc2_ram_w = 0;
+static UINT8 lanc2_ram[0x8000];
+
+static READ32_HANDLER( lanc1_r )
+{
+ switch (offset)
+ {
+ case 0x40/4:
+ {
+ UINT32 r = 0;
+
+ r |= (fpga_uploaded) ? (1 << 6) : 0;
+ r |= 1 << 5;
+
+ return (r) << 24;
+ }
+
+ default:
+ {
+ //printf("lanc1_r: %08X, %08X at %08X\n", offset, mem_mask, activecpu_get_pc());
+ return 0xffffffff;
+ }
+ }
+}
+
+static WRITE32_HANDLER( lanc1_w )
+{
+ //printf("lanc1_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, activecpu_get_pc());
+}
+
+static READ32_HANDLER( lanc2_r )
+{
+ UINT32 r = 0;
+
+ if (offset == 0)
+ {
+ if (!(mem_mask & 0x000000ff))
+ {
+ r |= lanc2_ram[lanc2_ram_r & 0x7fff];
+ lanc2_ram_r++;
+ }
+ else
+ {
+ r |= 0xffffff00;
+ }
+ }
+
+ if (offset == 4)
+ {
+ if (!(mem_mask & 0xff000000))
+ {
+ r |= 0x00000000;
+ }
+ }
+
+ //printf("lanc2_r: %08X, %08X at %08X\n", offset, mem_mask, activecpu_get_pc());
+
+ return r;
+}
+
+static WRITE32_HANDLER( lanc2_w )
+{
+ if (offset == 0)
+ {
+ if (!(mem_mask & 0xff000000))
+ {
+ UINT8 value = data >> 24;
+
+ value = ((value >> 7) & 0x01) |
+ ((value >> 5) & 0x02) |
+ ((value >> 3) & 0x04) |
+ ((value >> 1) & 0x08) |
+ ((value << 1) & 0x10) |
+ ((value << 3) & 0x20) |
+ ((value << 5) & 0x40) |
+ ((value << 7) & 0x80);
+
+ fpga_uploaded = 1;
+
+ //printf("lanc2_fpga_w: %02X at %08X\n", value, activecpu_get_pc());
+ }
+ else if (!(mem_mask & 0x000000ff))
+ {
+ lanc2_ram[lanc2_ram_w & 0x7fff] = data & 0xff;
+ lanc2_ram_w++;
+ }
+ else
+ {
+ //printf("lanc2_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, activecpu_get_pc());
+ }
+ }
+ if (offset == 4)
+ {
+ if (mame_stricmp(Machine->gamedrv->name, "thrilld") == 0)
+ {
+ work_ram[(0x3ffed0/4) + 0] = 0x472a3731;
+ work_ram[(0x3ffed0/4) + 1] = 0x33202020;
+ work_ram[(0x3ffed0/4) + 2] = 0x2d2d2a2a;
+ work_ram[(0x3ffed0/4) + 3] = 0x2a207878;
+
+ work_ram[(0x3fff40/4) + 0] = 0x47433731;
+ work_ram[(0x3fff40/4) + 1] = 0x33000000;
+ work_ram[(0x3fff40/4) + 2] = 0x19994a41;
+ work_ram[(0x3fff40/4) + 3] = 0x4100a9b1;
+ }
+ }
+
+ //printf("lanc2_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, activecpu_get_pc());
+}
+
+/*****************************************************************************/
+
+static ADDRESS_MAP_START( nwktr_map, ADDRESS_SPACE_PROGRAM, 32 )
+ AM_RANGE(0x00000000, 0x003fffff) AM_MIRROR(0x80000000) AM_RAM AM_BASE(&work_ram) /* Work RAM */
+ AM_RANGE(0x74000000, 0x740000ff) AM_MIRROR(0x80000000) AM_READWRITE(K001604_reg_r, K001604_reg_w)
+ AM_RANGE(0x74010000, 0x74017fff) AM_MIRROR(0x80000000) AM_READWRITE(paletteram32_r, paletteram32_w) AM_BASE(&paletteram32)
+ AM_RANGE(0x74020000, 0x7403ffff) AM_MIRROR(0x80000000) AM_READWRITE(K001604_tile_r, K001604_tile_w)
+ AM_RANGE(0x74040000, 0x7407ffff) AM_MIRROR(0x80000000) AM_READWRITE(K001604_char_r, K001604_char_w)
+ AM_RANGE(0x78000000, 0x7800ffff) AM_MIRROR(0x80000000) AM_READWRITE(cgboard_dsp_shared_r_ppc, cgboard_dsp_shared_w_ppc)
+ AM_RANGE(0x780c0000, 0x780c0003) AM_MIRROR(0x80000000) AM_READWRITE(cgboard_dsp_comm_r_ppc, cgboard_dsp_comm_w_ppc)
+ AM_RANGE(0x7d000000, 0x7d00ffff) AM_MIRROR(0x80000000) AM_READ(sysreg_r)
+ AM_RANGE(0x7d010000, 0x7d01ffff) AM_MIRROR(0x80000000) AM_WRITE(sysreg_w)
+ AM_RANGE(0x7d020000, 0x7d021fff) AM_MIRROR(0x80000000) AM_READWRITE(timekeeper_0_32be_r, timekeeper_0_32be_w) /* M48T58Y RTC/NVRAM */
+ AM_RANGE(0x7d030000, 0x7d030007) AM_MIRROR(0x80000000) AM_READ(K056800_host_r)
+ AM_RANGE(0x7d030000, 0x7d030007) AM_MIRROR(0x80000000) AM_WRITE(K056800_host_w)
+ AM_RANGE(0x7d030008, 0x7d03000f) AM_MIRROR(0x80000000) AM_WRITE(K056800_host_w)
+ AM_RANGE(0x7d040000, 0x7d04ffff) AM_MIRROR(0x80000000) AM_READWRITE(lanc1_r, lanc1_w)
+ AM_RANGE(0x7d050000, 0x7d05ffff) AM_MIRROR(0x80000000) AM_READWRITE(lanc2_r, lanc2_w)
+ AM_RANGE(0x7e000000, 0x7e7fffff) AM_MIRROR(0x80000000) AM_ROM AM_REGION(REGION_USER2, 0) /* Data ROM */
+ AM_RANGE(0x7f000000, 0x7f1fffff) AM_MIRROR(0x80000000) AM_ROM AM_SHARE(2)
+ AM_RANGE(0x7fe00000, 0x7fffffff) AM_MIRROR(0x80000000) AM_ROM AM_REGION(REGION_USER1, 0) AM_SHARE(2) /* Program ROM */
+ADDRESS_MAP_END
+
+/*****************************************************************************/
+
+static ADDRESS_MAP_START( sound_memmap, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_ROM
+ AM_RANGE(0x100000, 0x10ffff) AM_RAM /* Work RAM */
+ AM_RANGE(0x200000, 0x200fff) AM_READWRITE(RF5C400_0_r, RF5C400_0_w) /* Ricoh RF5C400 */
+ AM_RANGE(0x300000, 0x30000f) AM_READWRITE(K056800_sound_r, K056800_sound_w)
+ AM_RANGE(0x600000, 0x600001) AM_NOP
+ADDRESS_MAP_END
+
+/*****************************************************************************/
+
+static UINT32 *sharc_dataram;
+
+static READ32_HANDLER( dsp_dataram_r )
+{
+ return sharc_dataram[offset] & 0xffff;
+}
+
+static WRITE32_HANDLER( dsp_dataram_w )
+{
+ sharc_dataram[offset] = data;
+}
+
+static ADDRESS_MAP_START( sharc_map, ADDRESS_SPACE_DATA, 32 )
+ AM_RANGE(0x0400000, 0x041ffff) AM_READWRITE(cgboard_0_shared_sharc_r, cgboard_0_shared_sharc_w)
+ AM_RANGE(0x0500000, 0x05fffff) AM_READWRITE(dsp_dataram_r, dsp_dataram_w)
+ AM_RANGE(0x1400000, 0x14fffff) AM_RAM
+ AM_RANGE(0x2400000, 0x27fffff) AM_READWRITE(nwk_voodoo_0_r, nwk_voodoo_0_w)
+ AM_RANGE(0x3400000, 0x34000ff) AM_READWRITE(cgboard_0_comm_sharc_r, cgboard_0_comm_sharc_w)
+ AM_RANGE(0x3500000, 0x35000ff) AM_READWRITE(K033906_0_r, K033906_0_w)
+ AM_RANGE(0x3600000, 0x37fffff) AM_ROMBANK(5)
+ADDRESS_MAP_END
+
+/*****************************************************************************/
+
+static INPUT_PORTS_START( nwktr )
+ PORT_START
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+
+ PORT_START
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service Button") PORT_CODE(KEYCODE_7)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME( DEF_STR( Service_Mode )) PORT_CODE(KEYCODE_F2)
+ PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_DIPNAME( 0x80, 0x00, "Test Mode" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, "Disable Machine Init" )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, "DIP3" )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, "DIP4" )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "DIP5" )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "DIP6" )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "DIP7" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x01, 0x01, "DIP8" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START_TAG("ANALOG1") // Steering
+ PORT_BIT( 0xfff, 0x800, IPT_PADDLE ) PORT_MINMAX(0x000, 0xfff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+ PORT_START_TAG("ANALOG2") // Acceleration pedal
+ PORT_BIT( 0x7ff, 0x000, IPT_PEDAL ) PORT_MINMAX(0x000, 0x7ff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+ PORT_START_TAG("ANALOG3") // Foot brake pedal
+ PORT_BIT( 0x7ff, 0x000, IPT_PEDAL2 ) PORT_MINMAX(0x000, 0x7ff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+ PORT_START_TAG("ANALOG4") // Hand brake lever
+ PORT_BIT( 0x7ff, 0x000, IPT_AD_STICK_Y ) PORT_MINMAX(0x000, 0x7ff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+ PORT_START_TAG("ANALOG5") // Clutch pedal
+ PORT_BIT( 0x7ff, 0x000, IPT_PEDAL3 ) PORT_MINMAX(0x000, 0x7ff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+INPUT_PORTS_END
+
+static struct RF5C400interface rf5c400_interface =
+{
+ REGION_SOUND1
+};
+
+static ppc_config nwktr_ppc_cfg =
+{
+ PPC_MODEL_403GA
+};
+
+static sharc_config sharc_cfg =
+{
+ BOOT_MODE_EPROM
+};
+
+static MACHINE_RESET( nwktr )
+{
+ cpunum_set_input_line(2, INPUT_LINE_RESET, ASSERT_LINE);
+}
+
+static MACHINE_DRIVER_START( nwktr )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(PPC403, 64000000/2) /* PowerPC 403GA 32MHz */
+ MDRV_CPU_CONFIG(nwktr_ppc_cfg)
+ MDRV_CPU_PROGRAM_MAP(nwktr_map, 0)
+
+ MDRV_CPU_ADD(M68000, 64000000/4) /* 16MHz */
+ MDRV_CPU_PROGRAM_MAP(sound_memmap, 0)
+
+ MDRV_CPU_ADD(ADSP21062, 36000000)
+ MDRV_CPU_CONFIG(sharc_cfg)
+ MDRV_CPU_DATA_MAP(sharc_map, 0)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_INTERLEAVE(100)
+
+ MDRV_MACHINE_RESET(nwktr)
+ MDRV_NVRAM_HANDLER( timekeeper_0 )
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER )
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
+ MDRV_SCREEN_SIZE(512, 384)
+ MDRV_SCREEN_VISIBLE_AREA(0, 511, 0, 383)
+ MDRV_PALETTE_LENGTH(65536)
+
+ MDRV_VIDEO_START(nwktr)
+ MDRV_VIDEO_UPDATE(nwktr)
+
+ MDRV_SPEAKER_STANDARD_STEREO("left", "right")
+
+ MDRV_SOUND_ADD(RF5C400, 64000000/4)
+ MDRV_SOUND_CONFIG(rf5c400_interface)
+ MDRV_SOUND_ROUTE(0, "left", 1.0)
+ MDRV_SOUND_ROUTE(1, "right", 1.0)
+
+MACHINE_DRIVER_END
+
+/*****************************************************************************/
+
+static UINT8 jamma_rdata[1024];
+static void jamma_r(int length)
+{
+ int i;
+ //printf("jamma_r %d\n", length);
+ for (i=0; i < length; i++)
+ {
+ jamma_rdata[i] = 0;
+ }
+}
+
+static UINT8 jamma_wdata[1024];
+static void jamma_w(int length)
+{
+ int i;
+ //printf("jamma_w %d\n", length);
+ for (i=0; i < length; i++)
+ {
+ //jamma_jvs_w(jamma_wdata[i]);
+ }
+
+ //jamma_jvs_cmd_exec();
+}
+
+static void sound_irq_callback(int irq)
+{
+ if (irq == 0)
+ {
+ cpunum_set_input_line(1, INPUT_LINE_IRQ1, PULSE_LINE);
+ }
+ else
+ {
+ cpunum_set_input_line(1, INPUT_LINE_IRQ2, PULSE_LINE);
+ }
+}
+
+static DRIVER_INIT( nwktr )
+{
+ init_konami_cgboard(1, CGBOARD_TYPE_NWKTR);
+ set_cgboard_texture_bank(0, 5, memory_region(REGION_USER5));
+
+ sharc_dataram = auto_malloc(0x100000);
+ timekeeper_init(0, TIMEKEEPER_M48T58, backup_ram);
+
+ K056800_init(sound_irq_callback);
+ K033906_init();
+
+ ppc403_install_spu_tx_dma_handler(jamma_w, jamma_wdata);
+ ppc403_install_spu_rx_dma_handler(jamma_r, jamma_rdata);
+
+ adc1213x_init(0, adc12138_input_callback);
+}
+
+static DRIVER_INIT(thrilld)
+{
+ int i;
+ UINT16 checksum;
+
+ /* RTC data */
+ backup_ram[0x00] = 0x47; // 'G'
+ backup_ram[0x01] = 0x43; // 'C'
+ backup_ram[0x02] = 0x36; // '6'
+ backup_ram[0x03] = 0x37; // '7'
+ backup_ram[0x04] = 0x36; // '6'
+ backup_ram[0x05] = 0x00; //
+ backup_ram[0x06] = 0x00; // ?
+ backup_ram[0x07] = 0x00; // ?
+ backup_ram[0x08] = 0x19; //
+ backup_ram[0x09] = 0x99; // 1999
+ backup_ram[0x0a] = 0x4a; // 'J'
+ backup_ram[0x0b] = 0x41; // 'A'
+ backup_ram[0x0c] = 0x41; //
+ backup_ram[0x0d] = 0x00; //
+
+ checksum = 0;
+ for (i=0; i < 14; i+=2)
+ {
+ checksum += (backup_ram[i] << 8) | (backup_ram[i+1]);
+ checksum &= 0xffff;
+ }
+ checksum = -1 - checksum;
+
+ backup_ram[0x0e] = (checksum >> 8) & 0xff; // checksum
+ backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum
+
+ driver_init_nwktr(machine);
+}
+
+static DRIVER_INIT(racingj)
+{
+ int i;
+ UINT32 checksum;
+
+ /* RTC data */
+ backup_ram[0x00] = 0x47; // 'G'
+ backup_ram[0x01] = 0x6e; // 'n'
+ backup_ram[0x02] = 0x36; // '6'
+ backup_ram[0x03] = 0x37; // '7'
+ backup_ram[0x04] = 0x36; // '6'
+ backup_ram[0x05] = 0x00; //
+ backup_ram[0x06] = 0x00; //
+ backup_ram[0x07] = 0x00; //
+ backup_ram[0x08] = 0x00; //
+ backup_ram[0x09] = 0x00; //
+ backup_ram[0x0a] = 0x4a; // 'J'
+ backup_ram[0x0b] = 0x41; // 'A'
+ backup_ram[0x0c] = 0x45; // 'E'
+ backup_ram[0x0d] = 0x00; //
+
+ checksum = 0;
+ for (i=0; i < 14; i+=2)
+ {
+ checksum += (backup_ram[i] << 8) | (backup_ram[i+1]);
+ checksum &= 0xffff;
+ }
+ checksum = -1 - checksum;
+ backup_ram[0x0e] = (checksum >> 8) & 0xff; // checksum
+ backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum
+
+ driver_init_nwktr(machine);
+}
+
+static DRIVER_INIT(racingj2)
+{
+ int i;
+ UINT32 checksum;
+
+ /* RTC data */
+ backup_ram[0x00] = 0x47; // 'G'
+ backup_ram[0x01] = 0x6e; // 'n'
+ backup_ram[0x02] = 0x38; // '8'
+ backup_ram[0x03] = 0x38; // '8'
+ backup_ram[0x04] = 0x38; // '8'
+ backup_ram[0x05] = 0x00; //
+ backup_ram[0x06] = 0x00; //
+ backup_ram[0x07] = 0x00; //
+ backup_ram[0x08] = 0x00; //
+ backup_ram[0x09] = 0x00; //
+ backup_ram[0x0a] = 0x4a; // 'J'
+ backup_ram[0x0b] = 0x41; // 'A'
+ backup_ram[0x0c] = 0x45; // 'E'
+ backup_ram[0x0d] = 0x00; //
+
+ checksum = 0;
+ for (i=0; i < 14; i+=2)
+ {
+ checksum += (backup_ram[i] << 8) | (backup_ram[i+1]);
+ checksum &= 0xffff;
+ }
+ checksum = -1 - checksum;
+ backup_ram[0x0e] = (checksum >> 8) & 0xff; // checksum
+ backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum
+
+ driver_init_nwktr(machine);
+}
+
+
+/*****************************************************************************/
+
+ROM_START(racingj)
+ ROM_REGION32_BE(0x200000, REGION_USER1, 0) /* PowerPC program roms */
+ ROM_LOAD16_WORD_SWAP("676nc01.bin", 0x000000, 0x200000, CRC(690346b5) SHA1(157ab6788382ef4f5a8772f08819f54d0856fcc8))
+
+ ROM_REGION32_BE(0x800000, REGION_USER2, 0) /* Data roms */
+ ROM_LOAD32_WORD_SWAP("676a04.bin", 0x000000, 0x200000, CRC(d7808cb6) SHA1(0668fae5bb94cc120fe196d4b18200f7b512317f))
+ ROM_LOAD32_WORD_SWAP("676a05.bin", 0x000002, 0x200000, CRC(fb4de1ad) SHA1(f6aa4eb1b5d22901a2aaf899ed3237a9dfdc55b5))
+
+ ROM_REGION32_BE(0x800000, REGION_USER5, 0) /* CG Board texture roms */
+ ROM_LOAD32_WORD_SWAP( "676a13.8x", 0x000000, 0x400000, CRC(29077763) SHA1(ee087ca0d41966ca0fd10727055bb1dcd05a0873) )
+ ROM_LOAD32_WORD_SWAP( "676a14.16x", 0x000002, 0x400000, CRC(50a7e3c0) SHA1(7468a66111a3ddf7c043cd400fa175cae5f65632) )
+
+ ROM_REGION(0x80000, REGION_CPU2, 0) /* 68k program roms */
+ ROM_LOAD16_WORD_SWAP( "676gna08.7s", 0x000000, 0x080000, CRC(8973f6f2) SHA1(f5648a7e0205f7e979ccacbb52936809ce14a184) )
+
+ ROM_REGION(0x1000000, REGION_SOUND1, 0) /* other roms (textures?) */
+ ROM_LOAD( "676a09.16p", 0x000000, 0x400000, CRC(f85c8dc6) SHA1(8b302c80be309b5cc68b75945fcd7b87a56a4c9b) )
+ ROM_LOAD( "676a10.14p", 0x400000, 0x400000, CRC(7b5b7828) SHA1(aec224d62e4b1e8fdb929d7947ce70d84ba676cf) )
+ROM_END
+
+ROM_START(racingj2)
+ ROM_REGION32_BE(0x200000, REGION_USER1, 0) /* PowerPC program roms */
+ ROM_LOAD16_WORD_SWAP("888a01.27p", 0x000000, 0x200000, CRC(d077890a) SHA1(08b252324cf46fbcdb95e8f9312287920cd87c5d))
+
+ ROM_REGION32_BE(0x800000, REGION_USER2, 0) /* Data roms */
+ ROM_LOAD32_WORD_SWAP( "676a04.bin", 0x000000, 0x200000, CRC(d7808cb6) SHA1(0668fae5bb94cc120fe196d4b18200f7b512317f))
+ ROM_LOAD32_WORD_SWAP( "676a05.bin", 0x000002, 0x200000, CRC(fb4de1ad) SHA1(f6aa4eb1b5d22901a2aaf899ed3237a9dfdc55b5))
+ ROM_LOAD32_WORD_SWAP( "888a06.12t", 0x400000, 0x200000, CRC(00cbec4d) SHA1(1ce7807d86e90edbf4eecba462a27c725f5ad862))
+
+ ROM_REGION32_BE(0x800000, REGION_USER5, 0) /* CG Board Texture roms */
+ ROM_LOAD32_WORD_SWAP( "888a13.8x", 0x000000, 0x400000, CRC(2292f530) SHA1(0f4d1332708fd5366a065e0a928cc9610558b42d) )
+ ROM_LOAD32_WORD_SWAP( "888a14.16x", 0x000002, 0x400000, CRC(6a834a26) SHA1(d1fbd7ae6afd05f0edac4efde12a5a45aa2bc7df) )
+
+ ROM_REGION(0x80000, REGION_CPU2, 0) /* 68k program roms */
+ ROM_LOAD16_WORD_SWAP( "888a08.7s", 0x000000, 0x080000, CRC(55fbea65) SHA1(ad953f758181731efccadcabc4326e6634c359e8) )
+
+ ROM_REGION(0x1000000, REGION_SOUND1, 0) /* PCM sample roms */
+ ROM_LOAD( "888a09.16p", 0x000000, 0x400000, CRC(11e2fed2) SHA1(24b8a367b59fedb62c56f066342f2fa87b135fc5) )
+ ROM_LOAD( "888a10.14p", 0x400000, 0x400000, CRC(328ce610) SHA1(dbbc779a1890c53298c0db129d496df048929496) )
+ROM_END
+
+ROM_START(thrilld)
+ ROM_REGION32_BE(0x200000, REGION_USER1, 0) /* PowerPC program roms */
+ ROM_LOAD16_WORD_SWAP("713be01.27p", 0x000000, 0x200000, CRC(d84a7723) SHA1(f4e9e08591b7e5e8419266dbe744d56a185384ed))
+
+ ROM_REGION32_BE(0x800000, REGION_USER2, 0) /* Data roms */
+ ROM_LOAD32_WORD_SWAP("713a04.16t", 0x000000, 0x200000, CRC(c994aaa8) SHA1(d82b9930a11e5384ad583684a27c95beec03cd5a))
+ ROM_LOAD32_WORD_SWAP("713a05.14t", 0x000002, 0x200000, CRC(6f1e6802) SHA1(91f8a170327e9b4ee6a64aee0c106b981a317e69))
+
+ ROM_REGION32_BE(0x800000, REGION_USER5, 0) /* CG Board Texture roms */
+ ROM_LOAD32_WORD_SWAP( "713a13.8x", 0x000000, 0x400000, CRC(b795c66b) SHA1(6e50de0d5cc444ffaa0fec7ada8c07f643374bb2) )
+ ROM_LOAD32_WORD_SWAP( "713a14.16x", 0x000002, 0x400000, CRC(5275a629) SHA1(16fadef06975f0f3625cac8f84e2e77ed7d75e15) )
+
+ ROM_REGION(0x80000, REGION_CPU2, 0) /* 68k program roms */
+ ROM_LOAD16_WORD_SWAP( "713a08.7s", 0x000000, 0x080000, CRC(6a72a825) SHA1(abeac99c5343efacabcb0cdff6d34f9f967024db) )
+
+ ROM_REGION(0x1000000, REGION_SOUND1, 0) /* PCM sample roms */
+ ROM_LOAD( "713a09.16p", 0x000000, 0x400000, CRC(058f250a) SHA1(63b8e60004ec49009633e86b4992c00083def9a8) )
+ ROM_LOAD( "713a10.14p", 0x400000, 0x400000, CRC(27f9833e) SHA1(1540f00d2571ecb81b914c553682b67fca94bbbd) )
+ROM_END
+
+/*****************************************************************************/
+
+GAME( 1998, racingj, 0, nwktr, nwktr, racingj, ROT0, "Konami", "Racing Jam", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1999, racingj2, racingj,nwktr, nwktr, racingj2, ROT0, "Konami", "Racing Jam: Chapter 2", GAME_NOT_WORKING|GAME_NO_SOUND )
+GAME( 1998, thrilld, 0, nwktr, nwktr, thrilld, ROT0, "Konami", "Thrill Drive", GAME_NOT_WORKING|GAME_IMPERFECT_SOUND )