summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/zr107.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/zr107.c')
-rw-r--r--src/mame/drivers/zr107.c788
1 files changed, 788 insertions, 0 deletions
diff --git a/src/mame/drivers/zr107.c b/src/mame/drivers/zr107.c
new file mode 100644
index 00000000000..649f5c76221
--- /dev/null
+++ b/src/mame/drivers/zr107.c
@@ -0,0 +1,788 @@
+/* Konami ZR107 System
+
+ Driver by Ville Linde
+
+
+
+ Hardware overview:
+
+ ZR107 CPU board:
+ ----------------
+ IBM PowerPC 403GA at 32MHz (main CPU)
+ Motorola MC68EC000 at 16MHz (sound CPU)
+ Konami K056800 (MIRAC), sound system interface
+ Konami K056230 (LANC), LAN interface
+ Konami K058141 sound chip (same as 2x K054539)
+
+ ZR107 GFX board:
+ ----------------
+ Analog Devices ADSP-21062 SHARC DSP at 36MHz
+ Konami K056832 tilemap chip
+ KS10071 (custom 3D pixel unit)
+ KS10081 (custom 3D texel unit)
+
+ GN678 GFX board (same as in gticlub.c):
+ ----------------
+ Analog Devices ADSP-21062 SHARC DSP at 36MHz
+ Konami K001604 (2D tilemaps + 2x ROZ)
+ 2x KS10071 (custom 3D pixel unit)
+ 2x KS10081 (custom 3D texel unit)
+
+
+ Hardware configurations:
+
+ Game | ID | CPU PCB | CG Board(s)
+ --------------------------------------------------------------------------
+ Midnight Run | GX??? | ZR107 | ZR107
+ Winding Heat | GX677 | ZR107 | ZR107
+ Jetwave / Waveshark | GX678 | ZR107 | GN678
+
+*/
+
+#include "driver.h"
+#include "cpu/powerpc/ppc.h"
+#include "cpu/sharc/sharc.h"
+#include "sound/k054539.h"
+#include "machine/konppc.h"
+#include "machine/konamiic.h"
+#include "machine/adc083x.h"
+#include "machine/eeprom.h"
+#include "video/konamiic.h"
+#include "video/gticlub.h"
+
+
+static UINT8 led_reg0 = 0x7f, led_reg1 = 0x7f;
+
+
+// defined in drivers/gticlub.c
+extern READ32_HANDLER(lanc_r);
+extern WRITE32_HANDLER(lanc_w);
+extern READ32_HANDLER(lanc_ram_r);
+extern WRITE32_HANDLER(lanc_ram_w);
+
+
+// defined in video/gticlub.c
+VIDEO_START( gticlub );
+VIDEO_UPDATE( gticlub );
+
+
+// defined in drivers/nwk-tr.c
+int K001604_vh_start(running_machine *machine, int chip);
+void K001604_tile_update(running_machine *machine, int chip);
+void K001604_draw_front_layer(int chip, mame_bitmap *bitmap, const rectangle *cliprect);
+void K001604_draw_back_layer(int chip, mame_bitmap *bitmap, const rectangle *cliprect);
+READ32_HANDLER(K001604_tile_r);
+READ32_HANDLER(K001604_char_r);
+WRITE32_HANDLER(K001604_tile_w);
+WRITE32_HANDLER(K001604_char_w);
+WRITE32_HANDLER(K001604_reg_w);
+READ32_HANDLER(K001604_reg_r);
+
+
+
+
+static VIDEO_START( jetwave )
+{
+ K001005_init();
+ K001604_vh_start(machine, 0);
+}
+
+
+static VIDEO_UPDATE( jetwave )
+{
+ fillbitmap(bitmap, machine->remapped_colortable[0], cliprect);
+
+ K001604_tile_update(machine, 0);
+ K001005_draw(bitmap, cliprect);
+
+ K001604_draw_front_layer(0, bitmap, cliprect);
+
+ draw_7segment_led(bitmap, 3, 3, led_reg0);
+ draw_7segment_led(bitmap, 9, 3, led_reg1);
+
+ cpuintrf_push_context(2);
+ sharc_set_flag_input(1, ASSERT_LINE);
+ cpuintrf_pop_context();
+ return 0;
+}
+
+
+/*****************************************************************************/
+
+static WRITE32_HANDLER( paletteram32_w )
+{
+ COMBINE_DATA(&paletteram32[offset]);
+ data = paletteram32[offset];
+ palette_set_color_rgb(Machine, (offset * 2) + 0, pal5bit(data >> 26), pal5bit(data >> 21), pal5bit(data >> 16));
+ palette_set_color_rgb(Machine, (offset * 2) + 1, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0));
+}
+
+#define NUM_LAYERS 2
+
+static void game_tile_callback(int layer, int *code, int *color, int *flags)
+{
+ *color += layer * 0x40;
+}
+
+static VIDEO_START( zr107 )
+{
+ static int scrolld[NUM_LAYERS][4][2] = {
+ {{ 0, 0}, {0, 0}, {0, 0}, {0, 0}},
+ {{ 0, 0}, {0, 0}, {0, 0}, {0, 0}}
+ };
+
+ K056832_vh_start(machine, REGION_GFX2, K056832_BPP_8, 1, scrolld, game_tile_callback, 0);
+ K001005_init();
+}
+
+static VIDEO_UPDATE( zr107 )
+{
+ fillbitmap(bitmap, machine->remapped_colortable[0], cliprect);
+
+ K056832_set_LayerOffset(0, -29, -27);
+ K056832_set_LayerOffset(1, -29, -27);
+ K056832_set_LayerOffset(2, -29, -27);
+ K056832_set_LayerOffset(3, -29, -27);
+ K056832_set_LayerOffset(4, -29, -27);
+ K056832_set_LayerOffset(5, -29, -27);
+ K056832_set_LayerOffset(6, -29, -27);
+ K056832_set_LayerOffset(7, -29, -27);
+
+ K056832_tilemap_draw(machine, bitmap, cliprect, 1, 0, 0);
+ K001005_draw(bitmap, cliprect);
+ K056832_tilemap_draw(machine, bitmap, cliprect, 0, 0, 0);
+
+ draw_7segment_led(bitmap, 3, 3, led_reg0);
+ draw_7segment_led(bitmap, 9, 3, led_reg1);
+
+ cpuintrf_push_context(2);
+ sharc_set_flag_input(1, ASSERT_LINE);
+ cpuintrf_pop_context();
+ return 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))
+ {
+ int adc_bit = adc083x_do_read(0);
+ r |= ((readinputport(2) & 0x7f) | (adc_bit << 7)) << 8;
+ }
+ if (!(mem_mask & 0x000000ff))
+ {
+ r |= readinputport(3) << 0;
+ }
+ }
+ else if (offset == 1)
+ {
+ if (!(mem_mask & 0xff000000))
+ {
+ r |= ((adc083x_sars_read(0) << 5) | (EEPROM_read_bit() << 4)) << 24;
+ }
+ }
+ //mame_printf_debug("sysreg_r: %08X, %08X at %08X\n", offset, mem_mask, activecpu_get_pc());
+ 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;
+ }
+ if (!(mem_mask & 0x000000ff))
+ {
+ EEPROM_write_bit((data & 0x1) ? 1 : 0);
+ EEPROM_set_clock_line((data & 0x2) ? ASSERT_LINE : CLEAR_LINE);
+ EEPROM_set_cs_line((data & 0x4) ? CLEAR_LINE : ASSERT_LINE);
+
+ if (data & 0x10)
+ {
+ cpunum_set_input_line(1, INPUT_LINE_RESET, CLEAR_LINE);
+ }
+ else
+ {
+ cpunum_set_input_line(1, INPUT_LINE_RESET, ASSERT_LINE);
+ }
+ }
+ return;
+ }
+ else if( offset == 1 )
+ {
+ if (!(mem_mask & 0xff000000))
+ {
+ if (data & 0x80000000) /* CG Board 1 IRQ Ack */
+ {
+ cpunum_set_input_line(0, INPUT_LINE_IRQ1, CLEAR_LINE);
+ }
+ if (data & 0x40000000) /* CG Board 0 IRQ Ack */
+ {
+ cpunum_set_input_line(0, INPUT_LINE_IRQ0, CLEAR_LINE);
+ }
+
+ set_cgboard_id((data >> 28) & 0x3);
+
+ adc083x_cs_write(0, (data >> 26) & 1);
+ adc083x_di_write(0, (data >> 25) & 1);
+ adc083x_clk_write(0, (data >> 24) & 1);
+ }
+ return;
+ }
+ mame_printf_debug("sysreg_w: %08X, %08X, %08X\n", offset, data, mem_mask);
+}
+
+static double adc0838_callback(int input)
+{
+ switch (input)
+ {
+ case ADC083X_CH0:
+ return (double)(5 * readinputport(4)) / 255.0;
+ case ADC083X_CH1:
+ return (double)(5 * readinputport(5)) / 255.0;
+ case ADC083X_CH2:
+ return (double)(5 * readinputport(6)) / 255.0;
+ case ADC083X_CH3:
+ return 0;
+ case ADC083X_COM:
+ return 0;
+ case ADC083X_AGND:
+ return 0;
+ case ADC083X_VREF:
+ return 5;
+ }
+ return 0;
+}
+
+static int ccu_vcth = 0;
+static int ccu_vctl = 0;
+static READ32_HANDLER( ccu_r )
+{
+ UINT32 r = 0;
+ switch (offset)
+ {
+ case 0x1c/4:
+ {
+ // Midnight Run polls the vertical counter in vblank
+ if (!(mem_mask & 0xff000000))
+ {
+ ccu_vcth ^= 0xff;
+ r |= ccu_vcth << 24;
+ }
+ if (!(mem_mask & 0x0000ff00))
+ {
+ ccu_vctl++;
+ ccu_vctl &= 0x1ff;
+ r |= (ccu_vctl >> 2) << 8;
+ }
+ }
+ }
+
+ return r;
+}
+
+static WRITE32_HANDLER( ccu_w )
+{
+
+}
+
+/******************************************************************/
+
+static ADDRESS_MAP_START( zr107_map, ADDRESS_SPACE_PROGRAM, 32 )
+ AM_RANGE(0x00000000, 0x000fffff) AM_MIRROR(0x80000000) AM_RAM /* Work RAM */
+ AM_RANGE(0x74000000, 0x74003fff) AM_MIRROR(0x80000000) AM_READWRITE(K056832_ram_long_r, K056832_ram_long_w)
+ AM_RANGE(0x74020000, 0x7402003f) AM_MIRROR(0x80000000) AM_READWRITE(K056832_long_r, K056832_long_w)
+ AM_RANGE(0x74060000, 0x7406003f) AM_MIRROR(0x80000000) AM_READWRITE(ccu_r, ccu_w)
+ AM_RANGE(0x74080000, 0x74081fff) AM_MIRROR(0x80000000) AM_READWRITE(paletteram32_r, paletteram32_w) AM_BASE(&paletteram32)
+ AM_RANGE(0x740a0000, 0x740a3fff) AM_MIRROR(0x80000000) AM_READ(K056832_rom_long_r)
+ AM_RANGE(0x78000000, 0x7800ffff) AM_MIRROR(0x80000000) AM_READWRITE(cgboard_dsp_shared_r_ppc, cgboard_dsp_shared_w_ppc) /* 21N 21K 23N 23K */
+ AM_RANGE(0x78010000, 0x7801ffff) AM_MIRROR(0x80000000) AM_WRITE(cgboard_dsp_shared_w_ppc)
+ AM_RANGE(0x78040000, 0x7804000f) AM_MIRROR(0x80000000) AM_READWRITE(K001006_0_r, K001006_0_w)
+ AM_RANGE(0x780c0000, 0x780c0007) AM_MIRROR(0x80000000) AM_READWRITE(cgboard_dsp_comm_r_ppc, cgboard_dsp_comm_w_ppc)
+ AM_RANGE(0x7e000000, 0x7e003fff) AM_MIRROR(0x80000000) AM_READWRITE(sysreg_r, sysreg_w)
+ AM_RANGE(0x7e008000, 0x7e009fff) AM_MIRROR(0x80000000) AM_READWRITE(lanc_r, lanc_w) /* LANC registers */
+ AM_RANGE(0x7e00a000, 0x7e00bfff) AM_MIRROR(0x80000000) AM_READWRITE(lanc_ram_r, lanc_ram_w) /* LANC Buffer RAM (27E) */
+ AM_RANGE(0x7e00c000, 0x7e00c007) AM_MIRROR(0x80000000) AM_WRITE(K056800_host_w)
+ AM_RANGE(0x7e00c008, 0x7e00c00f) AM_MIRROR(0x80000000) AM_READ(K056800_host_r)
+ AM_RANGE(0x7f800000, 0x7f9fffff) 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 WRITE32_HANDLER( jetwave_palette_w )
+{
+ COMBINE_DATA(&paletteram32[offset]);
+ data = paletteram32[offset];
+ palette_set_color_rgb(Machine, offset, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0));
+}
+
+static ADDRESS_MAP_START( jetwave_map, ADDRESS_SPACE_PROGRAM, 32 )
+ AM_RANGE(0x00000000, 0x000fffff) AM_MIRROR(0x80000000) AM_RAM /* Work RAM */
+ AM_RANGE(0x74000000, 0x740000ff) AM_MIRROR(0x80000000) AM_READWRITE(K001604_reg_r, K001604_reg_w)
+ AM_RANGE(0x74010000, 0x7401ffff) AM_MIRROR(0x80000000) AM_READWRITE(paletteram32_r, jetwave_palette_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) /* 21N 21K 23N 23K */
+ AM_RANGE(0x78010000, 0x7801ffff) AM_MIRROR(0x80000000) AM_WRITE(cgboard_dsp_shared_w_ppc)
+ AM_RANGE(0x78040000, 0x7804000f) AM_MIRROR(0x80000000) AM_READWRITE(K001006_0_r, K001006_0_w)
+ AM_RANGE(0x78080000, 0x7808000f) AM_MIRROR(0x80000000) AM_READWRITE(K001006_1_r, K001006_1_w)
+ AM_RANGE(0x780c0000, 0x780c0007) AM_MIRROR(0x80000000) AM_READWRITE(cgboard_dsp_comm_r_ppc, cgboard_dsp_comm_w_ppc)
+ AM_RANGE(0x7e000000, 0x7e003fff) AM_MIRROR(0x80000000) AM_READWRITE(sysreg_r, sysreg_w)
+ AM_RANGE(0x7e008000, 0x7e009fff) AM_MIRROR(0x80000000) AM_READWRITE(lanc_r, lanc_w) /* LANC registers */
+ AM_RANGE(0x7e00a000, 0x7e00bfff) AM_MIRROR(0x80000000) AM_READWRITE(lanc_ram_r, lanc_ram_w) /* LANC Buffer RAM (27E) */
+ AM_RANGE(0x7e00c000, 0x7e00c007) AM_MIRROR(0x80000000) AM_WRITE(K056800_host_w)
+ AM_RANGE(0x7e00c008, 0x7e00c00f) AM_MIRROR(0x80000000) AM_READ(K056800_host_r)
+ AM_RANGE(0x7f000000, 0x7f3fffff) AM_MIRROR(0x80000000) AM_ROM AM_REGION(REGION_USER2, 0)
+ AM_RANGE(0x7f800000, 0x7f9fffff) 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 READ16_HANDLER( dual539_r )
+{
+ UINT16 ret = 0;
+
+ if (ACCESSING_LSB16)
+ ret |= K054539_1_r(offset);
+ if (ACCESSING_MSB16)
+ ret |= K054539_0_r(offset)<<8;
+
+ return ret;
+}
+
+static WRITE16_HANDLER( dual539_w )
+{
+ if (ACCESSING_LSB16)
+ K054539_1_w(offset, data);
+ if (ACCESSING_MSB16)
+ K054539_0_w(offset, data>>8);
+}
+
+static ADDRESS_MAP_START( sound_memmap, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x01ffff) AM_ROM
+ AM_RANGE(0x100000, 0x103fff) AM_RAM /* Work RAM */
+ AM_RANGE(0x200000, 0x2004ff) AM_READWRITE(dual539_r, dual539_w)
+ AM_RANGE(0x400000, 0x40000f) AM_WRITE(K056800_sound_w)
+ AM_RANGE(0x400010, 0x40001f) AM_READ(K056800_sound_r)
+ AM_RANGE(0x580000, 0x580001) AM_WRITENOP
+ADDRESS_MAP_END
+
+static struct K054539interface k054539_interface =
+{
+ REGION_SOUND1
+};
+
+/*****************************************************************************/
+
+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(0x400000, 0x41ffff) AM_READWRITE(cgboard_0_shared_sharc_r, cgboard_0_shared_sharc_w)
+ AM_RANGE(0x500000, 0x5fffff) AM_READWRITE(dsp_dataram_r, dsp_dataram_w)
+ AM_RANGE(0x600000, 0x6fffff) AM_READWRITE(K001005_r, K001005_w)
+ AM_RANGE(0x700000, 0x7000ff) AM_READWRITE(cgboard_0_comm_sharc_r, cgboard_0_comm_sharc_w)
+ADDRESS_MAP_END
+
+/*****************************************************************************/
+
+
+static INPUT_PORTS_START( midnrun )
+ PORT_START
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) // View switch
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) // Shift up
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) // Shift down
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_TOGGLE // AT/MT switch
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Service Button") PORT_CODE(KEYCODE_8)
+ PORT_BIT( 0x0b, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME( DEF_STR( Service_Mode )) PORT_CODE(KEYCODE_F2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Service Button") PORT_CODE(KEYCODE_8)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_DIPNAME( 0x0c, 0x00, "Network ID" )
+ PORT_DIPSETTING( 0x0c, "1" )
+ PORT_DIPSETTING( 0x08, "2" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x02, 0x02, "Transmission Type" )
+ PORT_DIPSETTING( 0x02, "Button" )
+ PORT_DIPSETTING( 0x00, "'T'Gate" )
+ PORT_DIPNAME( 0x01, 0x01, "CG Board Type" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x00, "Twin" )
+
+ PORT_START_TAG("ANALOG1") // Steering wheel
+ PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+ PORT_START_TAG("ANALOG2") // Acceleration pedal
+ PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+ PORT_START_TAG("ANALOG3") // Brake pedal
+ PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( windheat )
+ PORT_START
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) // View switch
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) // Shift up
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) // Shift down
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_TOGGLE // AT/MT switch
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Service Button") PORT_CODE(KEYCODE_8)
+ PORT_BIT( 0x0b, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME( DEF_STR( Service_Mode )) PORT_CODE(KEYCODE_F2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Service Button") PORT_CODE(KEYCODE_8)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_DIPNAME( 0x0c, 0x00, "Network ID" )
+ PORT_DIPSETTING( 0x0c, "1" )
+ PORT_DIPSETTING( 0x08, "2" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x02, 0x02, "Transmission Type" )
+ PORT_DIPSETTING( 0x02, "Button" )
+ PORT_DIPSETTING( 0x00, "'T'Gate" )
+ PORT_DIPNAME( 0x01, 0x01, "CG Board Type" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Single ) )
+ PORT_DIPSETTING( 0x00, "Twin" )
+
+ PORT_START_TAG("ANALOG1") // Steering wheel
+ PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5) PORT_REVERSE
+
+ PORT_START_TAG("ANALOG2") // Acceleration pedal
+ PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+ PORT_START_TAG("ANALOG3") // Brake pedal
+ PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jetwave )
+ PORT_START
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Service Button") PORT_CODE(KEYCODE_8)
+ PORT_BIT( 0x0b, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME( DEF_STR( Service_Mode )) PORT_CODE(KEYCODE_F2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Service Button") PORT_CODE(KEYCODE_8)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_DIPNAME( 0x08, 0x00, "DIP 1" )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "DIP 2" )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "DIP 3" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x01, 0x00, "DIP 4" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START_TAG("ANALOG1") // Steering wheel
+ PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5) PORT_REVERSE
+
+ PORT_START_TAG("ANALOG2") // Acceleration pedal
+ PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+ PORT_START_TAG("ANALOG3") // Brake pedal
+ PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(35) PORT_KEYDELTA(5)
+
+INPUT_PORTS_END
+
+static ppc_config zr107_ppc_cfg =
+{
+ PPC_MODEL_403GA
+};
+
+static sharc_config sharc_cfg =
+{
+ BOOT_MODE_EPROM
+};
+
+/* PowerPC interrupts
+
+ IRQ0: Vblank
+ IRQ2: LANC
+ DMA0
+
+*/
+static INTERRUPT_GEN( zr107_vblank )
+{
+ cpunum_set_input_line(0, INPUT_LINE_IRQ0, ASSERT_LINE);
+}
+static MACHINE_RESET( zr107 )
+{
+ cpunum_set_input_line(2, INPUT_LINE_RESET, ASSERT_LINE);
+}
+
+static MACHINE_DRIVER_START( zr107 )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(PPC403, 64000000/2) /* PowerPC 403GA 32MHz */
+ MDRV_CPU_CONFIG(zr107_ppc_cfg)
+ MDRV_CPU_PROGRAM_MAP(zr107_map, 0)
+ MDRV_CPU_VBLANK_INT(zr107_vblank, 1)
+
+ MDRV_CPU_ADD(M68000, 64000000/8) /* 8MHz */
+ 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(500)
+
+ MDRV_NVRAM_HANDLER(93C46)
+ MDRV_MACHINE_RESET(zr107)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
+ MDRV_SCREEN_SIZE(64*8, 48*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 48*8-1)
+ MDRV_PALETTE_LENGTH(65536)
+
+ MDRV_VIDEO_START(zr107)
+ MDRV_VIDEO_UPDATE(zr107)
+
+ MDRV_SPEAKER_STANDARD_STEREO("left", "right")
+
+ MDRV_SOUND_ADD(K054539, 48000)
+ MDRV_SOUND_CONFIG(k054539_interface)
+ MDRV_SOUND_ROUTE(0, "left", 0.75)
+ MDRV_SOUND_ROUTE(1, "right", 0.75)
+
+ MDRV_SOUND_ADD(K054539, 48000)
+ MDRV_SOUND_CONFIG(k054539_interface)
+ MDRV_SOUND_ROUTE(0, "left", 0.75)
+ MDRV_SOUND_ROUTE(1, "right", 0.75)
+MACHINE_DRIVER_END
+
+static MACHINE_DRIVER_START( jetwave )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(PPC403, 64000000/2) /* PowerPC 403GA 32MHz */
+ MDRV_CPU_CONFIG(zr107_ppc_cfg)
+ MDRV_CPU_PROGRAM_MAP(jetwave_map, 0)
+ MDRV_CPU_VBLANK_INT(zr107_vblank, 1)
+
+ MDRV_CPU_ADD(M68000, 64000000/8) /* 8MHz */
+ 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(500)
+
+ MDRV_NVRAM_HANDLER(93C46)
+ MDRV_MACHINE_RESET(zr107)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
+ MDRV_SCREEN_SIZE(64*8, 48*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 48*8-1)
+ MDRV_PALETTE_LENGTH(65536)
+
+ MDRV_VIDEO_START(jetwave)
+ MDRV_VIDEO_UPDATE(jetwave)
+
+ MDRV_SPEAKER_STANDARD_STEREO("left", "right")
+
+ MDRV_SOUND_ADD(K054539, 48000)
+ MDRV_SOUND_CONFIG(k054539_interface)
+ MDRV_SOUND_ROUTE(0, "left", 0.75)
+ MDRV_SOUND_ROUTE(1, "right", 0.75)
+
+ MDRV_SOUND_ADD(K054539, 48000)
+ MDRV_SOUND_CONFIG(k054539_interface)
+ MDRV_SOUND_ROUTE(0, "left", 0.75)
+ MDRV_SOUND_ROUTE(1, "right", 0.75)
+MACHINE_DRIVER_END
+
+/*****************************************************************************/
+
+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(zr107)
+{
+ init_konami_cgboard(1, CGBOARD_TYPE_ZR107);
+ sharc_dataram = auto_malloc(0x100000);
+
+ K001005_preprocess_texture_data(memory_region(REGION_GFX1), memory_region_length(REGION_GFX1), 0);
+
+ K056800_init(sound_irq_callback);
+
+ adc083x_init(0, ADC0838, adc0838_callback);
+}
+
+static DRIVER_INIT(jetwave)
+{
+ init_konami_cgboard(1, CGBOARD_TYPE_GTICLUB);
+ sharc_dataram = auto_malloc(0x100000);
+
+ K001005_preprocess_texture_data(memory_region(REGION_GFX1), memory_region_length(REGION_GFX1), 0);
+
+ K056800_init(sound_irq_callback);
+
+ adc083x_init(0, ADC0838, adc0838_callback);
+}
+
+/*****************************************************************************/
+
+#define ROM_LOAD64_WORD(name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_GROUPWORD | ROM_SKIP(6))
+
+ROM_START(midnrun)
+ ROM_REGION(0x200000, REGION_USER1, 0) /* PowerPC program roms */
+ ROM_LOAD32_BYTE("midnight.20u", 0x000003, 0x80000, CRC(ea70edf2) SHA1(51c882383a150ba118ccd39eb869525fcf5eee3c))
+ ROM_LOAD32_BYTE("midnight.17u", 0x000002, 0x80000, CRC(1462994f) SHA1(c8614c6c416f81737cc77c46eea6d8d440bc8cf3))
+ ROM_LOAD32_BYTE("midnight.15u", 0x000001, 0x80000, CRC(b770ae46) SHA1(c61daa8353802957eb1c2e2c6204c3a98569627e))
+ ROM_LOAD32_BYTE("midnight.13u", 0x000000, 0x80000, CRC(9644b277) SHA1(b9cb812b6035dfd93032d277c8aa0037cf6b3dbe))
+
+ ROM_REGION(0x20000, REGION_CPU2, 0) /* M68K program */
+ ROM_LOAD16_WORD_SWAP("midnight.19l", 0x000000, 0x20000, CRC(a82c0ba1) SHA1(dad69f2e5e75009d70cc2748477248ec47627c30))
+
+ ROM_REGION(0x100000, REGION_GFX2, 0) /* Tilemap */
+ ROM_LOAD16_BYTE("midnight.35b", 0x000000, 0x80000, CRC(85eef04b) SHA1(02e26d2d4a8b29894370f28d2a49fdf5c7d23f95))
+ ROM_LOAD16_BYTE("midnight.35a", 0x000001, 0x80000, CRC(451d7777) SHA1(0bf280ca475100778bbfd3f023547bf0413fc8b7))
+
+ ROM_REGION(0x800000, REGION_GFX1, 0) /* Texture data */
+ ROM_LOAD32_BYTE("midnight.m9h", 0x000000, 0x200000, CRC(b1ee901d) SHA1(b1432cb1379b35d99d3f2b7f6409db6f7e88121d))
+ ROM_LOAD32_BYTE("midnight.7h", 0x000001, 0x200000, CRC(9ffa8cc5) SHA1(eaa19e26df721bec281444ca1c5ccc9e48df1b0b))
+ ROM_LOAD32_BYTE("midnight.5h", 0x000002, 0x200000, CRC(e337fce7) SHA1(c84875f3275efd47273508b340231721f5a631d2))
+ ROM_LOAD32_BYTE("midnight.m2h", 0x000003, 0x200000, CRC(2c03ee63) SHA1(6b74d340dddf92bb4e4b1e037f003d58c65d8d9b))
+
+ ROM_REGION(0x600000, REGION_SOUND1, 0) /* Sound data */
+ ROM_LOAD("midnight.m3r", 0x000000, 0x200000, CRC(f431e29f) SHA1(e6082d88f86abb63d02ac34e70873b58f88b0ddc))
+ ROM_LOAD("midnight.m5n", 0x200000, 0x200000, CRC(8db31bd4) SHA1(d662d3bb6e8b44a01ffa158f5d7425454aad49a3))
+ ROM_LOAD("midnight.m5r", 0x400000, 0x200000, CRC(d320dbde) SHA1(eb602cad6ac7c7151c9f29d39b10041d5a354164))
+ROM_END
+
+ROM_START(windheat)
+ ROM_REGION(0x200000, REGION_USER1, 0) /* PowerPC program roms */
+ ROM_LOAD32_BYTE( "677ubc01.20u", 0x000003, 0x080000, CRC(63198721) SHA1(7f34131bf51d573d0c683b28df2567a0b911c98c) )
+ ROM_LOAD32_BYTE( "677ubc02.17u", 0x000002, 0x080000, CRC(bdb00e2d) SHA1(c54b2250047576e12e9936300989e40494b4659d) )
+ ROM_LOAD32_BYTE( "677ubc03.15u", 0x000001, 0x080000, CRC(0f7d8c1f) SHA1(63de03c7be794b6dae8d0af69e894ac573dbbc11) )
+ ROM_LOAD32_BYTE( "677ubc04.13u", 0x000000, 0x080000, CRC(4e42791c) SHA1(a53c6374c6b46db578be4ced2ee7c2af7062d961) )
+
+ ROM_REGION(0x20000, REGION_CPU2, 0) /* M68K program */
+ ROM_LOAD16_WORD_SWAP( "677a07.19l", 0x000000, 0x020000, CRC(05b14f2d) SHA1(3753f71173594ee741980e08eed0f7c3fc3588c9) )
+
+ ROM_REGION(0x100000, REGION_GFX2, 0) /* Tilemap */
+ ROM_LOAD16_BYTE( "677a11.35b", 0x000000, 0x080000, CRC(bf34f00f) SHA1(ca0d390c8b30d0cfdad4cfe5a601cc1f6e8c263d) )
+ ROM_LOAD16_BYTE( "677a12.35a", 0x000001, 0x080000, CRC(458f0b1d) SHA1(8e11023c75c80b496dfc62b6645cfedcf2a80db4) )
+
+ ROM_REGION(0x800000, REGION_GFX1, 0) /* Texture data */
+ ROM_LOAD32_BYTE( "677a13.9h", 0x000000, 0x200000, CRC(7937d226) SHA1(c2ba777292c293e31068eeb3a27353ad2595b413) )
+ ROM_LOAD32_BYTE( "677a14.7h", 0x000001, 0x200000, CRC(2568cf41) SHA1(6ed01922943486dafbdc863b76b2036c1fbe5281) )
+ ROM_LOAD32_BYTE( "677a15.5h", 0x000002, 0x200000, CRC(62e2c3dd) SHA1(c9127ed70bdff947c3da2908a08974091615a685) )
+ ROM_LOAD32_BYTE( "677a16.2h", 0x000003, 0x200000, CRC(7cc75539) SHA1(4bd8d88debf7489f30008bd4cbded67cb1a20ab0) )
+
+ ROM_REGION(0x600000, REGION_SOUND1, 0) /* Sound data */
+ ROM_LOAD( "677a09.3r", 0x000000, 0x200000, CRC(4dfc1ea9) SHA1(4ab264c1902b522bc0589766e42f2b6ca276808d) )
+ ROM_LOAD( "677a10.5n", 0x200000, 0x200000, CRC(d8f77a68) SHA1(ff251863ef096f0864f6cbe6caa43b0aa299d9ee) )
+ ROM_LOAD( "677a08.5r", 0x400000, 0x200000, CRC(bde38850) SHA1(aaf1bdfc25ecdffc1f6076c9c1b2edbe263171d2) )
+ROM_END
+
+ROM_START(jetwave)
+ ROM_REGION(0x200000, REGION_USER1, 0) /* PowerPC program roms */
+ ROM_LOAD32_BYTE( "678uab01.20u", 0x000003, 0x080000, CRC(a9b9ceed) SHA1(36f0d18481d7c3e7358e02473e54bc6b52d5c26b) )
+ ROM_LOAD32_BYTE( "678uab02.17u", 0x000002, 0x080000, CRC(5ed24ac8) SHA1(d659c751558d4f8d89314466a37c04ac2df46879) )
+ ROM_LOAD32_BYTE( "678uab03.15u", 0x000001, 0x080000, CRC(f4a595e7) SHA1(e05e7ea6613ecf70d8470af5fe0c6a7274c6e45b) )
+ ROM_LOAD32_BYTE( "678uab04.13u", 0x000000, 0x080000, CRC(fd3320a7) SHA1(03a50a7bba9eb7cdb9f84953d6fb5c09f2d4b2db) )
+
+ ROM_REGION(0x20000, REGION_CPU2, 0) /* M68K program */
+ ROM_LOAD16_WORD_SWAP( "678a07.19l", 0x000000, 0x020000, CRC(bb3f5875) SHA1(97f80d9b55d4177217b7cd1ba14e8ed2d64376bb) )
+
+ ROM_REGION32_BE(0x400000, REGION_USER2, 0) /* data roms */
+ ROM_LOAD32_WORD_SWAP( "685a05.10u", 0x000000, 0x200000, CRC(00e59741) SHA1(d799910d4e85482b0e92a3cc9043f81d97b2fb02) )
+ ROM_LOAD32_WORD_SWAP( "685a06.8u", 0x000002, 0x200000, CRC(fc98c6a5) SHA1(a84583bb7296fa9e0c284b2ac59e2dc7b2689eee) )
+
+ ROM_REGION(0x800000, REGION_GFX1, 0) /* Texture data */
+ ROM_LOAD64_WORD( "678a13.18d", 0x000000, 0x200000, CRC(ccf75722) SHA1(f48d21dfc4f82adbb4c9c841a809267cfd028a3d) )
+ ROM_LOAD64_WORD( "678a14.13d", 0x000002, 0x200000, CRC(333a1ab4) SHA1(79df4a98b7871eba4157307a7709da8f8b5da39b) )
+ ROM_LOAD64_WORD( "678a15.9d", 0x000004, 0x200000, CRC(58b670f8) SHA1(5d4facb00e34de3ad11ed60c19835918a9cf6cb9) )
+ ROM_LOAD64_WORD( "678a16.4d", 0x000006, 0x200000, CRC(137b9bff) SHA1(5052c1fa30cc1d6affd78f48d483415dca89d10b) )
+
+ ROM_REGION(0x600000, REGION_SOUND1, 0) /* Sound data */
+ ROM_LOAD( "678a09.3r", 0x000000, 0x200000, CRC(39baef23) SHA1(9f7bda0f9c06eee94703f9ceb06975c8e28338cc) )
+ ROM_LOAD( "678a10.5n", 0x200000, 0x200000, CRC(0508280e) SHA1(a36c5dc377b0ba597f131bd9dfc6019e7fc2d243) )
+ ROM_LOAD( "678a08.5r", 0x400000, 0x200000, CRC(4aeb61ad) SHA1(ec6872cb2e4776849963f48c1c245ca7697849e0) )
+ROM_END
+
+/*****************************************************************************/
+
+GAME( 1995, midnrun, 0, zr107, midnrun, zr107, ROT0, "Konami", "Midnight Run", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND )
+GAME( 1996, windheat, 0, zr107, windheat, zr107, ROT0, "Konami", "Winding Heat", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND )
+GAME( 1996, jetwave, 0, jetwave, jetwave, jetwave, ROT0, "Konami", "Jet Wave", GAME_IMPERFECT_GRAPHICS|GAME_IMPERFECT_SOUND|GAME_NOT_WORKING )