summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/hornet.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/hornet.c')
-rw-r--r--src/mame/drivers/hornet.c1527
1 files changed, 1527 insertions, 0 deletions
diff --git a/src/mame/drivers/hornet.c b/src/mame/drivers/hornet.c
new file mode 100644
index 00000000000..64a6a89d20d
--- /dev/null
+++ b/src/mame/drivers/hornet.c
@@ -0,0 +1,1527 @@
+/* Konami Hornet System
+
+ Driver by Ville Linde
+
+
+
+ Hardware overview:
+
+ GN715 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
+
+ GN715 GFX Board:
+ ----------------
+ Analog Devices ADSP-21062 SHARC DSP at 36MHz
+ Konami 0000037122 (2D Tilemap)
+ Konami 0000033906 (PCI bridge)
+ 3DFX 500-0003-03 (Voodoo) FBI with 2MB RAM
+ 3DFX 500-0004-02 (Voodoo) TMU with 2MB RAM
+
+ GQ871 GFX Board:
+ ----------------
+ Analog Devices ADSP-21062 SHARC DSP at 36MHz
+ Konami 0000037122 (2D Tilemap)
+ Konami 0000033906 (PCI bridge)
+ 3DFX 500-0009-01 (Voodoo 2) FBI with 2MB RAM
+ 3DFX 500-0010-01 (Voodoo 2) TMU with 4MB RAM
+
+
+ Hardware configurations:
+
+ Game | ID | CPU PCB | CG Board(s) | LAN PCB
+ ---------------------------------------------------------------------------
+ Gradius 4 | GX837 | GN715(A) | GN715(B) |
+ NBA Play by Play | GX778 | GN715(A) | GN715(B) |
+ Silent Scope | GQ830 | GN715(A) | 2x GN715(B) |
+ Silent Scope 2 | GQ931 | GN715(A) | 2x GQ871(B) | GQ931(H)
+
+
+
+
+ Top Board GN715 PWB(A)A
+ |--------------------------------------------------------------|
+ | |
+ | PAL |
+ | PAL 68EC000 837A08.7S |
+ |NE5532 PAL |
+ | DRM1M4SJ8 |
+ |NE5532 |
+ | SM5877 RF5C400 |
+ | |
+ | SM5877 16.9344MHz |
+ | SRAM256K 837A10.14P 837A05.14T |
+ | |
+ | SRAM256K 837A09.16P 837A04.16T |
+ | ADC12138 |
+ | 056800 |
+ | |
+ | MACH111 |
+ | |
+ | DRAM16X16 PPC403GA |
+ | 837C01.27P |
+ | |
+ | DRAM16X16 |
+ | 4AK16 |
+ | |
+ | |
+ | 0038323 PAL 7.3728MHz|
+ | E9825 |
+ | 50.000MHz|
+ | |
+ |M48T58Y-70PC1 64.000MHz|
+ |--------------------------------------------------------------|
+
+ Notes:
+ DRM1M4SJ8 = Fujitsu 81C4256 DRAM (SOJ24)
+ SRAM256K = Cypress CY7C199 SRAM (SOJ28)
+ DRAM16X16 = Fujitsu 8118160A-60 DRAM (SOJ42)
+ 0038323 E9825 = SOIC8, I've seen a similar chip in the security cart of System573
+ M48T58Y-70PC1 = ST Timekeeper RAM
+
+
+ Bottom Board GN715 PWB(B)A
+ |--------------------------------------------------------------|
+ | |
+ |JP1 4M EDO 4M EDO |
+ | |
+ | 4M EDO 4M EDO TEXELFX |
+ | 4M EDO |
+ | 4M EDO 4M EDO PIXELFX 4M EDO |
+ | |
+ | 4M EDO 4M EDO KONAMI |
+ | 50MHz 0000033906 |
+ | 4M EDO 4M EDO |
+ | 256KSRAM 256KSRAM |
+ | |
+ | AV9170 1MSRAM 1MSRAM |
+ | MC44200 |
+ | 256KSRAM 256KSRAM |
+ | 1MSRAM 1MSRAM |
+ | 837A13.24U |
+ | KONAMI MACH111 837A15.24V|
+ | 0000037122 1MSRAM 1MSRAM |
+ | ADSP-21062 |
+ | SHARC 36.00MHz |
+ |1MSRAM 1MSRAM 1MSRAM |
+ | |
+ |1MSRAM PAL PAL |
+ | 256KSRAM 837A14.32U |
+ |1MSRAM 256KSRAM 837A16.32V|
+ | 256KSRAM |
+ |1MSRAM |
+ | JP2 |
+ |--------------------------------------------------------------|
+
+ Notes:
+ 4M EDO = SM81C256K16CJ-35 RAM 66MHz
+ 1MSRAM = CY7C109-25VC
+ 256KSRAM = W24257AJ-15
+ TEXELFX = 3DFX 500-0004-02 BD0665.1 TMU (QFP208)
+ PIXELFX = 3DFX 500-0003-03 F001701.1 FBI (QFP240)
+ JP1 = Jumper set to SCR. Alt. setting is TWN
+ JP2 = Jumper set for MASTER, Alt. setting SLAVE
+
+
+
+ LAN PCB: GQ931 PWB(H) (C) 1999 Konami
+ ------------------------------------------
+
+ 2 x LAN ports, LANC(1) & LANC(2)
+ 1 x 32.0000MHz Oscillator
+
+ HYC2485S SMC ARCNET Media Transceiver, RS485 5Mbps-2.5Mbps
+ 8E 931A19 Konami 32meg masked ROM, ROM0 (compressed GFX data?)
+ 6E 931A20 Konami 32meg masked ROM, ROM1 (compressed GFX data?)
+ 12F XC9536 Xilinx CPLD, 44 pin PLCC, Konami no. Q931H1
+ 12C XCS10XL Xilinx FPGA, 100 pin PQFP, Konami no. 4C
+ 12B CY7C199 Cypress 32kx8 SRAM
+ 8B AT93C46 Atmel 1K serial EEPROM, 8 pin SOP
+ 16G DS2401 Dallas Silicon Serial Number IC, 6 pin SOP
+
+
+
+ GFX PCB: GQ871 PWB(B)A (C) 1999 Konami
+ ------------------------------------------
+
+ There are no ROMs on the two GFX PCBs, all sockets are empty.
+ Prior to the game starting there is a message saying downloading data.
+
+
+ Jumpers set on GFX PCB to main monitor:
+ 4A set to TWN (twin GFX PCBs)
+ 37D set to Master
+
+
+ Jumpers set on GFX PCB to scope monitor:
+ 4A set to TWN (twin GFX PCBs)
+ 37D set to Slave
+
+
+
+ 1 x 64.0000MHz
+ 1 x 36.0000MHz (to 27L, ADSP)
+
+ 21E AV9170 ICS, Clock synchroniser and multiplier
+
+ 27L ADSP-21062 Analog Devices SHARC ADSP, 512k flash, Konami no. 022M16C
+ 15T 0000033906 Konami Custom, 160 pin PQFP
+ 19R W241024AI-20 Winbond, 1Meg SRAM
+ 22R W241024AI-20 Winbond, 1Meg SRAM
+ 25R W241024AI-20 Winbond, 1Meg SRAM
+ 29R W241024AI-20 Winbond, 1Meg SRAM
+ 19P W241024AI-20 Winbond, 1Meg SRAM
+ 22P W241024AI-20 Winbond, 1Meg SRAM
+ 25P W241024AI-20 Winbond, 1Meg SRAM
+ 29P W241024AI-20 Winbond, 1Meg SRAM
+ 18N W24257AJ-15 Winbond, 256K SRAM
+ 14N W24257AJ-15 Winbond, 256K SRAM
+ 18M W24257AJ-15 Winbond, 256K SRAM
+ 14M W24257AJ-15 Winbond, 256K SRAM
+
+ 28D 000037122 Konami Custom, 208 pin PQFP
+ 33E W24257AJ-15 Winbond, 256K SRAM
+ 33D W24257AJ-15 Winbond, 256K SRAM
+ 33C W24257AJ-15 Winbond, 256K SRAM
+ 27A W241024AI-20 Winbond, 1Meg SRAM
+ 30A W241024AI-20 Winbond, 1Meg SRAM
+ 32A W241024AI-20 Winbond, 1Meg SRAM
+ 35A W241024AI-20 Winbond, 1Meg SRAM
+
+ 7K 500-0010-01 3DFX, Texture processor
+ 16F SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+ 13F SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+ 9F SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+ 5F SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+ 16D SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+ 13D SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+ 9D SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+ 5D SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+
+ 9P 500-0009-01 3DFX, Pixel processor
+ 10U SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+ 7U SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+ 3S SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+ 3R SM81C256K16CJ-25 Silicon Magic 100MHz EDO RAM, 4Meg
+
+ 27G XC9536 Xilinx, CPLD, Konami no. Q830B1
+ 21C MC44200FT Motorola, 3 Channel video D/A converter
+*/
+
+#include "driver.h"
+#include "cpu/powerpc/ppc.h"
+#include "cpu/sharc/sharc.h"
+#include "machine/konppc.h"
+#include "machine/konamiic.h"
+#include "video/voodoo.h"
+#include "machine/timekpr.h"
+#include "sound/rf5c400.h"
+#include "rendlay.h"
+
+static UINT8 led_reg0 = 0x7f, led_reg1 = 0x7f;
+
+/* K037122 Tilemap chip (move to konamiic.c ?) */
+
+#define MAX_K037122_CHIPS 2
+
+static UINT32 *K037122_tile_ram[MAX_K037122_CHIPS];
+static UINT32 *K037122_char_ram[MAX_K037122_CHIPS];
+static UINT8 *K037122_dirty_map[MAX_K037122_CHIPS];
+static int K037122_gfx_index[MAX_K037122_CHIPS], K037122_char_dirty[MAX_K037122_CHIPS];
+static tilemap *K037122_layer[MAX_K037122_CHIPS][2];
+static UINT32 K037122_reg[MAX_K037122_CHIPS][256];
+
+#define K037122_NUM_TILES 16384
+
+static const gfx_layout K037122_char_layout =
+{
+ 8, 8,
+ K037122_NUM_TILES,
+ 8,
+ { 0,1,2,3,4,5,6,7 },
+ { 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 TILE_GET_INFO( K037122_0_tile_info_layer0 )
+{
+ UINT32 val = K037122_tile_ram[0][tile_index + (0x8000/4)];
+ int color = (val >> 17) & 0x1f;
+ int tile = val & 0x3fff;
+ int flags = 0;
+
+ if (val & 0x400000)
+ flags |= TILE_FLIPX;
+ if (val & 0x800000)
+ flags |= TILE_FLIPY;
+
+ SET_TILE_INFO(K037122_gfx_index[0], tile, color, flags);
+}
+
+static TILE_GET_INFO( K037122_0_tile_info_layer1 )
+{
+ UINT32 val = K037122_tile_ram[0][tile_index];
+ int color = (val >> 17) & 0x1f;
+ int tile = val & 0x3fff;
+ int flags = 0;
+
+ if (val & 0x400000)
+ flags |= TILE_FLIPX;
+ if (val & 0x800000)
+ flags |= TILE_FLIPY;
+
+ SET_TILE_INFO(K037122_gfx_index[0], tile, color, flags);
+}
+
+static TILE_GET_INFO( K037122_1_tile_info_layer0 )
+{
+ UINT32 val = K037122_tile_ram[1][tile_index + (0x8000/4)];
+ int color = (val >> 17) & 0x1f;
+ int tile = val & 0x3fff;
+ int flags = 0;
+
+ if (val & 0x400000)
+ flags |= TILE_FLIPX;
+ if (val & 0x800000)
+ flags |= TILE_FLIPY;
+
+ SET_TILE_INFO(K037122_gfx_index[1], tile, color, flags);
+}
+
+static TILE_GET_INFO( K037122_1_tile_info_layer1 )
+{
+ UINT32 val = K037122_tile_ram[1][tile_index];
+ int color = (val >> 17) & 0x1f;
+ int tile = val & 0x3fff;
+ int flags = 0;
+
+ if (val & 0x400000)
+ flags |= TILE_FLIPX;
+ if (val & 0x800000)
+ flags |= TILE_FLIPY;
+
+ SET_TILE_INFO(K037122_gfx_index[1], tile, color, flags);
+}
+
+static int K037122_vh_start(running_machine *machine, int chip)
+{
+ for(K037122_gfx_index[chip] = 0; K037122_gfx_index[chip] < MAX_GFX_ELEMENTS; K037122_gfx_index[chip]++)
+ if (machine->gfx[K037122_gfx_index[chip]] == 0)
+ break;
+ if(K037122_gfx_index[chip] == MAX_GFX_ELEMENTS)
+ return 1;
+
+ K037122_char_ram[chip] = auto_malloc(0x200000);
+
+ K037122_tile_ram[chip] = auto_malloc(0x20000);
+
+ K037122_dirty_map[chip] = auto_malloc(K037122_NUM_TILES);
+
+ if (chip == 0)
+ {
+ K037122_layer[chip][0] = tilemap_create(K037122_0_tile_info_layer0, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8, 256, 64);
+ K037122_layer[chip][1] = tilemap_create(K037122_0_tile_info_layer1, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8, 128, 64);
+ }
+ else
+ {
+ K037122_layer[chip][0] = tilemap_create(K037122_1_tile_info_layer0, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8, 256, 64);
+ K037122_layer[chip][1] = tilemap_create(K037122_1_tile_info_layer1, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8, 128, 64);
+ }
+
+ tilemap_set_transparent_pen(K037122_layer[chip][0], 0);
+ tilemap_set_transparent_pen(K037122_layer[chip][1], 0);
+
+ memset(K037122_char_ram[chip], 0, 0x200000);
+ memset(K037122_tile_ram[chip], 0, 0x20000);
+ memset(K037122_dirty_map[chip], 0, K037122_NUM_TILES);
+
+ machine->gfx[K037122_gfx_index[chip]] = allocgfx(&K037122_char_layout);
+ decodegfx(machine->gfx[K037122_gfx_index[chip]], (UINT8*)K037122_char_ram[chip], 0, machine->gfx[K037122_gfx_index[chip]]->total_elements);
+
+ if (machine->drv->color_table_len)
+ machine->gfx[K037122_gfx_index[chip]]->total_colors = machine->drv->color_table_len / 16;
+ else
+ machine->gfx[K037122_gfx_index[chip]]->total_colors = machine->drv->total_colors / 16;
+
+ return 0;
+}
+
+static void K037122_tile_update(running_machine *machine, int chip)
+{
+ if (K037122_char_dirty[chip])
+ {
+ int i;
+ for (i=0; i < K037122_NUM_TILES; i++)
+ {
+ if (K037122_dirty_map[chip][i])
+ {
+ K037122_dirty_map[chip][i] = 0;
+ decodechar(machine->gfx[K037122_gfx_index[chip]], i, (UINT8 *)K037122_char_ram[chip], &K037122_char_layout);
+ }
+ }
+ tilemap_mark_all_tiles_dirty(K037122_layer[chip][0]);
+ tilemap_mark_all_tiles_dirty(K037122_layer[chip][1]);
+ K037122_char_dirty[chip] = 0;
+ }
+}
+
+static void K037122_tile_draw(int chip, mame_bitmap *bitmap, const rectangle *cliprect)
+{
+ if (K037122_reg[chip][0xc] & 0x10000)
+ {
+ tilemap_set_scrolldx(K037122_layer[chip][1], Machine->screen[0].visarea.min_x, Machine->screen[0].visarea.min_x);
+ tilemap_set_scrolldy(K037122_layer[chip][1], Machine->screen[0].visarea.min_y, Machine->screen[0].visarea.min_y);
+ tilemap_draw(bitmap, cliprect, K037122_layer[chip][1], 0,0);
+ }
+ else
+ {
+ tilemap_set_scrolldx(K037122_layer[chip][0], Machine->screen[0].visarea.min_x, Machine->screen[0].visarea.min_x);
+ tilemap_set_scrolldy(K037122_layer[chip][0], Machine->screen[0].visarea.min_y, Machine->screen[0].visarea.min_y);
+ tilemap_draw(bitmap, cliprect, K037122_layer[chip][0], 0,0);
+ }
+}
+
+static void update_palette_color(running_machine *machine, int chip, UINT32 palette_base, int color)
+{
+ UINT32 data = K037122_tile_ram[chip][(palette_base/4) + color];
+ palette_set_color_rgb(machine, color, pal5bit(data >> 6), pal6bit(data >> 0), pal5bit(data >> 11));
+}
+
+static READ32_HANDLER(K037122_sram_r)
+{
+ int chip = get_cgboard_id();
+
+ return K037122_tile_ram[chip][offset];
+}
+
+static WRITE32_HANDLER(K037122_sram_w)
+{
+ int chip = get_cgboard_id();
+
+ COMBINE_DATA(K037122_tile_ram[chip] + offset);
+
+ if (K037122_reg[chip][0xc] & 0x10000)
+ {
+ if (offset < 0x8000/4)
+ {
+ tilemap_mark_tile_dirty(K037122_layer[chip][1], offset);
+ }
+ else if (offset >= 0x8000/4 && offset < 0x18000/4)
+ {
+ tilemap_mark_tile_dirty(K037122_layer[chip][0], offset - (0x8000/4));
+ }
+ else if (offset >= 0x18000/4)
+ {
+ update_palette_color(Machine, chip, 0x18000, offset - (0x18000/4));
+ }
+ }
+ else
+ {
+ if (offset < 0x8000/4)
+ {
+ update_palette_color(Machine, chip, 0, offset);
+ }
+ else if (offset >= 0x8000/4 && offset < 0x18000/4)
+ {
+ tilemap_mark_tile_dirty(K037122_layer[chip][0], offset - (0x8000/4));
+ }
+ else if (offset >= 0x18000/4)
+ {
+ tilemap_mark_tile_dirty(K037122_layer[chip][1], offset - (0x18000/4));
+ }
+ }
+}
+
+
+static READ32_HANDLER(K037122_char_r)
+{
+ int chip = get_cgboard_id();
+
+ UINT32 addr;
+ int bank = K037122_reg[chip][0x30/4] & 0x7;
+
+ addr = offset + (bank * (0x40000/4));
+
+ return K037122_char_ram[chip][addr];
+}
+
+static WRITE32_HANDLER(K037122_char_w)
+{
+ int chip = get_cgboard_id();
+
+ UINT32 addr;
+ int bank = K037122_reg[chip][0x30/4] & 0x7;
+
+ addr = offset + (bank * (0x40000/4));
+
+ COMBINE_DATA(K037122_char_ram[chip] + addr);
+ K037122_dirty_map[chip][addr / 32] = 1;
+ K037122_char_dirty[chip] = 1;
+}
+
+static READ32_HANDLER(K037122_reg_r)
+{
+ int chip = get_cgboard_id();
+
+ switch (offset)
+ {
+ case 0x14/4:
+ {
+ return 0x000003fa;
+ }
+ }
+ return K037122_reg[chip][offset];
+}
+
+static WRITE32_HANDLER(K037122_reg_w)
+{
+ int chip = get_cgboard_id();
+
+ COMBINE_DATA( K037122_reg[chip] + offset );
+}
+
+static int voodoo_version = 0;
+
+static void voodoo_vblank_0(int param)
+{
+ cpunum_set_input_line(0, INPUT_LINE_IRQ0, ASSERT_LINE);
+}
+
+static void voodoo_vblank_1(int param)
+{
+ cpunum_set_input_line(0, INPUT_LINE_IRQ1, ASSERT_LINE);
+}
+
+static void hornet_exit(running_machine *machine)
+{
+ voodoo_exit(0);
+}
+
+static void hornet_2board_exit(running_machine *machine)
+{
+ voodoo_exit(0);
+ voodoo_exit(1);
+}
+
+static VIDEO_START( hornet )
+{
+ add_exit_callback(machine, hornet_exit);
+
+ if (voodoo_version == 0)
+ voodoo_start(0, 0, VOODOO_1, 2, 4, 0);
+ else
+ voodoo_start(0, 0, VOODOO_2, 2, 4, 0);
+
+ voodoo_set_vblank_callback(0, voodoo_vblank_0);
+
+ K037122_vh_start(machine, 0);
+}
+
+static VIDEO_START( hornet_2board )
+{
+ add_exit_callback(machine, hornet_2board_exit);
+
+ if (voodoo_version == 0)
+ {
+ voodoo_start(0, 0, VOODOO_1, 2, 4, 0);
+ voodoo_start(1, 1, VOODOO_1, 2, 4, 0);
+ }
+ else
+ {
+ voodoo_start(0, 0, VOODOO_2, 2, 4, 0);
+ voodoo_start(1, 1, VOODOO_2, 2, 4, 0);
+ }
+
+ voodoo_set_vblank_callback(0, voodoo_vblank_0);
+ voodoo_set_vblank_callback(1, voodoo_vblank_1);
+
+ K037122_vh_start(machine, 0);
+ K037122_vh_start(machine, 1);
+}
+
+
+static VIDEO_UPDATE( hornet )
+{
+ voodoo_update(0, bitmap, cliprect);
+
+ K037122_tile_update(machine, 0);
+ K037122_tile_draw(0, bitmap, cliprect);
+
+ draw_7segment_led(bitmap, 3, 3, led_reg0);
+ draw_7segment_led(bitmap, 9, 3, led_reg1);
+ return 0;
+}
+
+static VIDEO_UPDATE( hornet_2board )
+{
+ voodoo_update(screen, bitmap, cliprect);
+
+ /* TODO: tilemaps per screen */
+ K037122_tile_update(machine, screen);
+ K037122_tile_draw(screen, bitmap, cliprect);
+
+ draw_7segment_led(bitmap, 3, 3, led_reg0);
+ draw_7segment_led(bitmap, 9, 3, led_reg1);
+ return 0;
+}
+
+/*****************************************************************************/
+
+static READ32_HANDLER( sysreg_r )
+{
+ UINT32 r = 0;
+ if (offset == 0)
+ {
+ if (!(mem_mask & 0xff000000))
+ {
+ //printf("read sysreg 0\n");
+ 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 |= 0xf7;
+ }
+ }
+ 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))
+ {
+ }
+ 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);
+ }
+ set_cgboard_id((data >> 4) & 0x3);
+ }
+ return;
+ }
+}
+
+static int comm_rombank = 0;
+
+static WRITE32_HANDLER( comm1_w )
+{
+ printf("comm1_w: %08X, %08X, %08X\n", offset, data, mem_mask);
+}
+
+static WRITE32_HANDLER( comm_rombank_w )
+{
+ int bank = data >> 24;
+ if (memory_region(REGION_USER3))
+ if( bank != comm_rombank ) {
+ printf("rombank %02X\n", bank);
+ comm_rombank = bank & 0x7f;
+ memory_set_bankptr(1, memory_region(REGION_USER3) + (comm_rombank * 0x10000));
+ }
+}
+
+static READ32_HANDLER( comm0_unk_r )
+{
+// printf("comm0_unk_r: %08X, %08X\n", offset, mem_mask);
+ return 0xffffffff;
+}
+
+/*****************************************************************************/
+
+static ADDRESS_MAP_START( hornet_map, ADDRESS_SPACE_PROGRAM, 32 )
+ AM_RANGE(0x00000000, 0x003fffff) AM_MIRROR(0x80000000) AM_RAM /* Work RAM */
+ AM_RANGE(0x74000000, 0x740000ff) AM_MIRROR(0x80000000) AM_READWRITE(K037122_reg_r, K037122_reg_w)
+ AM_RANGE(0x74020000, 0x7403ffff) AM_MIRROR(0x80000000) AM_READWRITE(K037122_sram_r, K037122_sram_w)
+ AM_RANGE(0x74040000, 0x7407ffff) AM_MIRROR(0x80000000) AM_READWRITE(K037122_char_r, K037122_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_READWRITE(K056800_host_r, K056800_host_w)
+ AM_RANGE(0x7d042000, 0x7d043fff) AM_MIRROR(0x80000000) AM_RAM /* COMM BOARD 0 */
+ AM_RANGE(0x7d044000, 0x7d044007) AM_MIRROR(0x80000000) AM_READ(comm0_unk_r)
+ AM_RANGE(0x7d048000, 0x7d048003) AM_MIRROR(0x80000000) AM_WRITE(comm1_w)
+ AM_RANGE(0x7d04a000, 0x7d04a003) AM_MIRROR(0x80000000) AM_WRITE(comm_rombank_w)
+ AM_RANGE(0x7d050000, 0x7d05ffff) AM_MIRROR(0x80000000) AM_ROMBANK(1) /* COMM BOARD 1 */
+ AM_RANGE(0x7e000000, 0x7e7fffff) AM_MIRROR(0x80000000) AM_ROM AM_REGION(REGION_USER2, 0) /* Data ROM */
+ AM_RANGE(0x7f000000, 0x7f3fffff) AM_MIRROR(0x80000000) AM_ROM AM_SHARE(2)
+ AM_RANGE(0x7fc00000, 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[2];
+
+static READ32_HANDLER( dsp_dataram0_r )
+{
+ return sharc_dataram[0][offset] & 0xffff;
+}
+
+static WRITE32_HANDLER( dsp_dataram0_w )
+{
+ sharc_dataram[0][offset] = data;
+}
+
+static READ32_HANDLER( dsp_dataram1_r )
+{
+ return sharc_dataram[1][offset] & 0xffff;
+}
+
+static WRITE32_HANDLER( dsp_dataram1_w )
+{
+ sharc_dataram[1][offset] = data;
+}
+
+static ADDRESS_MAP_START( sharc0_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_dataram0_r, dsp_dataram0_w)
+ AM_RANGE(0x1400000, 0x14fffff) AM_RAM
+ AM_RANGE(0x2400000, 0x27fffff) AM_READWRITE(voodoo_0_r, 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 ADDRESS_MAP_START( sharc1_map, ADDRESS_SPACE_DATA, 32 )
+ AM_RANGE(0x0400000, 0x041ffff) AM_READWRITE(cgboard_1_shared_sharc_r, cgboard_1_shared_sharc_w)
+ AM_RANGE(0x0500000, 0x05fffff) AM_READWRITE(dsp_dataram1_r, dsp_dataram1_w)
+ AM_RANGE(0x1400000, 0x14fffff) AM_RAM
+ AM_RANGE(0x2400000, 0x27fffff) AM_READWRITE(voodoo_1_r, voodoo_1_w)
+ AM_RANGE(0x3400000, 0x34000ff) AM_READWRITE(cgboard_1_comm_sharc_r, cgboard_1_comm_sharc_w)
+ AM_RANGE(0x3500000, 0x35000ff) AM_READWRITE(K033906_1_r, K033906_1_w)
+ AM_RANGE(0x3600000, 0x37fffff) AM_ROMBANK(6)
+ADDRESS_MAP_END
+
+/*****************************************************************************/
+
+static INPUT_PORTS_START( hornet )
+ 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( 0x80, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+
+ 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_HIGH, IPT_UNUSED )
+
+ PORT_START
+ PORT_DIPNAME( 0x80, 0x00, "Test Mode" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, "Screen Flip (H)" )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, "Screen Flip (V)" )
+ 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, 0x00, "Harness" )
+ PORT_DIPSETTING( 0x04, "JVS" )
+ PORT_DIPSETTING( 0x00, "JAMMA" )
+ PORT_DIPNAME( 0x02, 0x02, "DIP7" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x01, 0x01, "Monitor Type" )
+ PORT_DIPSETTING( 0x01, "24KHz" )
+ PORT_DIPSETTING( 0x00, "15KHz" )
+
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( sscope )
+ 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) // Gun trigger
+ PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ 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_HIGH, IPT_UNUSED )
+
+ PORT_START
+ PORT_DIPNAME( 0x80, 0x00, "Test Mode" )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, "Screen Flip (H)" )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, "Screen Flip (V)" )
+ 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, 0x00, "Harness" )
+ PORT_DIPSETTING( 0x04, "JVS" )
+ PORT_DIPSETTING( 0x00, "JAMMA" )
+ PORT_DIPNAME( 0x02, 0x02, "DIP7" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x01, 0x01, "Monitor Type" )
+ PORT_DIPSETTING( 0x01, "24KHz" )
+ PORT_DIPSETTING( 0x00, "15KHz" )
+
+INPUT_PORTS_END
+
+static struct RF5C400interface rf5c400_interface =
+{
+ REGION_SOUND1
+};
+
+static ppc_config hornet_ppc_cfg =
+{
+ PPC_MODEL_403GA
+};
+
+static sharc_config sharc_cfg =
+{
+ BOOT_MODE_EPROM
+};
+
+/* PowerPC interrupts
+
+ IRQ0: Vblank CG Board 0
+ IRQ1: Vblank CG Board 1
+ IRQ2: LANC
+ DMA0
+ NMI: SCI
+
+*/
+
+static MACHINE_RESET( hornet )
+{
+ if (memory_region(REGION_USER3))
+ memory_set_bankptr(1, memory_region(REGION_USER3));
+ cpunum_set_input_line(2, INPUT_LINE_RESET, ASSERT_LINE);
+
+ if (memory_region(REGION_USER5))
+ memory_set_bankptr(5, memory_region(REGION_USER5));
+}
+
+static MACHINE_DRIVER_START( hornet )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD_TAG("main", PPC403, 64000000/2) /* PowerPC 403GA 32MHz */
+ MDRV_CPU_CONFIG(hornet_ppc_cfg)
+ MDRV_CPU_PROGRAM_MAP(hornet_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(sharc0_map, 0)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_INTERLEAVE(100)
+
+ MDRV_MACHINE_RESET( hornet )
+
+ MDRV_NVRAM_HANDLER( timekeeper_0 )
+
+ /* 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(hornet)
+ MDRV_VIDEO_UPDATE(hornet)
+
+ 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 MACHINE_RESET( hornet_2board )
+{
+ if (memory_region(REGION_USER3))
+ memory_set_bankptr(1, memory_region(REGION_USER3));
+ cpunum_set_input_line(2, INPUT_LINE_RESET, ASSERT_LINE);
+ cpunum_set_input_line(3, INPUT_LINE_RESET, ASSERT_LINE);
+
+ if (memory_region(REGION_USER5))
+ memory_set_bankptr(5, memory_region(REGION_USER5));
+}
+
+static MACHINE_DRIVER_START( hornet_2board )
+
+ MDRV_IMPORT_FROM(hornet)
+
+ MDRV_CPU_ADD(ADSP21062, 36000000)
+ MDRV_CPU_CONFIG(sharc_cfg)
+ MDRV_CPU_DATA_MAP(sharc1_map, 0)
+
+ MDRV_MACHINE_RESET(hornet_2board)
+
+ MDRV_VIDEO_START(hornet_2board)
+ MDRV_VIDEO_UPDATE(hornet_2board)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER )
+ MDRV_PALETTE_LENGTH(65536)
+
+ MDRV_SCREEN_ADD("left", 0x000)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_SIZE(512, 384)
+ MDRV_SCREEN_VISIBLE_AREA(0, 511, 0, 383)
+
+ MDRV_SCREEN_ADD("right", 0x000)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_RGB32)
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_SIZE(512, 384)
+ MDRV_SCREEN_VISIBLE_AREA(0, 511, 0, 383)
+MACHINE_DRIVER_END
+
+
+/*****************************************************************************/
+
+static UINT8 jvs_rdata[1024];
+static UINT8 jvs_sdata[1024];
+
+static int jvs_rdata_ptr = 0;
+static int jvs_sdata_ptr = 0;
+
+static UINT8 jamma_jvs_r(void)
+{
+ UINT8 r;
+ r = jvs_rdata[jvs_rdata_ptr];
+ jvs_rdata_ptr++;
+
+ return r;
+}
+
+static void jamma_jvs_w(UINT8 data)
+{
+ jvs_sdata[jvs_sdata_ptr] = data;
+ jvs_sdata_ptr++;
+}
+
+static int jvs_encode_data(UINT8 *in, UINT8 *out, int length)
+{
+ int outptr = 0;
+ int inptr = 0;
+
+ while (inptr < length)
+ {
+ UINT8 b = in[inptr++];
+ if (b == 0xe0)
+ {
+ out[outptr++] = 0xd0;
+ out[outptr++] = 0xdf;
+ }
+ else if (b == 0xd0)
+ {
+ out[outptr++] = 0xd0;
+ out[outptr++] = 0xcf;
+ }
+ else
+ {
+ out[outptr++] = b;
+ }
+ };
+
+ return outptr;
+}
+
+static int jvs_decode_data(UINT8 *in, UINT8 *out, int length)
+{
+ int outptr = 0;
+ int inptr = 0;
+
+ while (inptr < length)
+ {
+ UINT8 b = in[inptr++];
+ if (b == 0xd0)
+ {
+ UINT8 b2 = in[inptr++];
+ out[outptr++] = b2 + 1;
+ }
+ else
+ {
+ out[outptr++] = b;
+ }
+ };
+
+ return outptr;
+}
+
+static void jamma_jvs_cmd_exec(void)
+{
+ UINT8 sync, node, byte_num;
+ UINT8 data[1024], rdata[1024];
+ int i, length;
+ int rdata_ptr;
+ int sum;
+
+ sync = jvs_sdata[0];
+ node = jvs_sdata[1];
+ byte_num = jvs_sdata[2];
+
+ if (sync != 0xe0)
+ {
+ printf("jamma_jvs_cmd_exec: SYNC byte not found! (%02X)\n", sync);
+ return;
+ }
+
+ length = jvs_decode_data(&jvs_sdata[3], data, byte_num-1);
+
+ /*
+ printf("jvs input data:\n");
+ for (i=0; i < byte_num; i++)
+ {
+ printf("%02X ", jvs_sdata[3+i]);
+ }
+ printf("\n");
+
+ printf("jvs data decoded to:\n");
+ for (i=0; i < length; i++)
+ {
+ printf("%02X ", data[i]);
+ }
+ printf("\n\n");
+ */
+
+ // clear return data
+ memset(rdata, 0, sizeof(rdata));
+ rdata_ptr = 0;
+
+ // status
+ rdata[rdata_ptr++] = 0x01; // normal
+
+ // handle the command
+ switch (data[0])
+ {
+ case 0xf0: // Reset
+ {
+ break;
+ }
+ case 0xf1: // Address setting
+ {
+ rdata[rdata_ptr++] = 0x01; // report data (normal)
+ break;
+ }
+ case 0xfa:
+ {
+ break;
+ }
+ default:
+ {
+ fatalerror("jamma_jvs_cmd_exec: unknown command %02X\n", data[0]);
+ }
+ }
+
+ // write jvs return data
+ jvs_rdata[0] = 0xe0; // sync
+ jvs_rdata[1] = 0x00; // node
+ jvs_rdata[2] = rdata_ptr+1; // num of bytes
+
+ length = jvs_encode_data(rdata, &jvs_rdata[3], rdata_ptr);
+
+ // calculate sum
+ sum = 0;
+ for (i=0; i < length+2; i++)
+ {
+ sum += jvs_rdata[1+i];
+ }
+
+ // write sum
+ jvs_rdata[3+length] = (UINT8)(sum-1);
+
+ jvs_rdata_ptr = 0;
+ jvs_sdata_ptr = 0;
+}
+
+/*****************************************************************************/
+
+
+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] = jamma_jvs_r();
+ }
+}
+
+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 UINT8 backup_ram[0x2000];
+static void init_hornet(running_machine *machine)
+{
+ init_konami_cgboard(1, CGBOARD_TYPE_HORNET);
+ set_cgboard_texture_bank(0, 5, memory_region(REGION_USER5));
+
+ sharc_dataram[0] = auto_malloc(0x100000);
+
+ K056800_init(sound_irq_callback);
+ K033906_init();
+
+ timekeeper_init(0, TIMEKEEPER_M48T58, backup_ram);
+
+ ppc403_install_spu_tx_dma_handler(jamma_w, jamma_wdata);
+ ppc403_install_spu_rx_dma_handler(jamma_r, jamma_rdata);
+}
+
+static void init_hornet_2board(running_machine *machine)
+{
+ init_konami_cgboard(2, CGBOARD_TYPE_HORNET);
+ set_cgboard_texture_bank(0, 5, memory_region(REGION_USER5));
+ set_cgboard_texture_bank(1, 6, memory_region(REGION_USER5));
+
+ sharc_dataram[0] = auto_malloc(0x100000);
+ sharc_dataram[1] = auto_malloc(0x100000);
+
+ K056800_init(sound_irq_callback);
+ K033906_init();
+
+ timekeeper_init(0, TIMEKEEPER_M48T58, backup_ram);
+
+ ppc403_install_spu_tx_dma_handler(jamma_w, jamma_wdata);
+ ppc403_install_spu_rx_dma_handler(jamma_r, jamma_rdata);
+}
+
+static DRIVER_INIT(gradius4)
+{
+ /* RTC data */
+ backup_ram[0x00] = 0x47; // 'G'
+ backup_ram[0x01] = 0x58; // 'X'
+ backup_ram[0x02] = 0x38; // '8'
+ backup_ram[0x03] = 0x33; // '3'
+ backup_ram[0x04] = 0x37; // '7'
+ backup_ram[0x05] = 0x00; //
+ backup_ram[0x06] = 0x11; //
+ backup_ram[0x07] = 0x06; // 06 / 11
+ backup_ram[0x08] = 0x19; //
+ backup_ram[0x09] = 0x98; // 1998
+ backup_ram[0x0a] = 0x4a; // 'J'
+ backup_ram[0x0b] = 0x41; // 'A'
+ backup_ram[0x0c] = 0x43; // 'C'
+ backup_ram[0x0d] = 0x00; //
+ backup_ram[0x0e] = 0x02; // checksum
+ backup_ram[0x0f] = 0xd7; // checksum
+
+ voodoo_version = 0;
+ init_hornet(machine);
+}
+
+static DRIVER_INIT(nbapbp)
+{
+ int i;
+ UINT16 checksum;
+
+ /* RTC data */
+ backup_ram[0x00] = 0x47; // 'G'
+ backup_ram[0x01] = 0x58; // 'X'
+ backup_ram[0x02] = 0x37; // '7'
+ backup_ram[0x03] = 0x37; // '7'
+ backup_ram[0x04] = 0x38; // '8'
+ backup_ram[0x05] = 0x00; //
+ backup_ram[0x06] = 0x00; //
+ backup_ram[0x07] = 0x00; //
+ backup_ram[0x08] = 0x19; //
+ backup_ram[0x09] = 0x98; // 1998
+ backup_ram[0x0a] = 0x4a; // 'J'
+ backup_ram[0x0b] = 0x41; // 'A'
+ backup_ram[0x0c] = 0x41; // 'A'
+ backup_ram[0x0d] = 0x00; //
+
+ checksum = 0;
+ for (i=0; i < 14; i++)
+ {
+ checksum += backup_ram[i];
+ checksum &= 0xffff;
+ }
+ backup_ram[0x0e] = (checksum >> 8) & 0xff; // checksum
+ backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum
+
+ voodoo_version = 0;
+ init_hornet(machine);
+}
+
+static DRIVER_INIT(terabrst)
+{
+ int i;
+ UINT16 checksum;
+
+ /* RTC data */
+ backup_ram[0x00] = 0x47; // 'G'
+ backup_ram[0x01] = 0x4e; // 'N'
+ backup_ram[0x02] = 0x37; // '7'
+ backup_ram[0x03] = 0x31; // '1'
+ backup_ram[0x04] = 0x35; // '5'
+ backup_ram[0x05] = 0x00; //
+ backup_ram[0x06] = 0x00; //
+ backup_ram[0x07] = 0x00; //
+ backup_ram[0x08] = 0x19; //
+ backup_ram[0x09] = 0x98; // 1998
+ backup_ram[0x0a] = 0x41; // '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 = ~checksum - 0;
+ backup_ram[0x0e] = (checksum >> 8) & 0xff; // checksum
+ backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum
+
+ voodoo_version = 0;
+ init_hornet_2board(machine);
+}
+
+static DRIVER_INIT(sscope)
+{
+ int i;
+ UINT16 checksum;
+
+ /* RTC data */
+ backup_ram[0x00] = 0x47; // 'G'
+ backup_ram[0x01] = 0x51; // 'Q'
+ backup_ram[0x02] = 0x38; // '8'
+ backup_ram[0x03] = 0x33; // '3'
+ backup_ram[0x04] = 0x30; // '0'
+ backup_ram[0x05] = 0x00; //
+ backup_ram[0x06] = 0x00; //
+ backup_ram[0x07] = 0x00; //
+ backup_ram[0x08] = 0x20; //
+ backup_ram[0x09] = 0x00; // 2000
+ backup_ram[0x0a] = 0x55; // 'U'
+ backup_ram[0x0b] = 0x41; // 'A'
+ backup_ram[0x0c] = 0x41; // 'A'
+ backup_ram[0x0d] = 0x00; //
+
+ checksum = 0;
+ for (i=0; i < 14; i+=2)
+ {
+ checksum += (backup_ram[i] << 8) | (backup_ram[i+1]);
+ }
+ checksum = ~checksum - 1;
+ backup_ram[0x0e] = (checksum >> 8) & 0xff; // checksum
+ backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum
+
+ voodoo_version = 0;
+ init_hornet_2board(machine);
+}
+
+static DRIVER_INIT(sscope2)
+{
+ int i;
+ int checksum;
+
+ /* RTC data */
+ backup_ram[0x00] = 0x47; // 'G'
+ backup_ram[0x01] = 0x4b; // 'K'
+ backup_ram[0x02] = 0x39; // '9'
+ backup_ram[0x03] = 0x33; // '3'
+ backup_ram[0x04] = 0x31; // '1'
+ backup_ram[0x05] = 0x00; //
+ backup_ram[0x06] = 0x00; //
+ backup_ram[0x07] = 0x00; //
+ backup_ram[0x08] = 0x20; //
+ backup_ram[0x09] = 0x00; // 2000
+ backup_ram[0x0a] = 0x55; // 'U'
+ backup_ram[0x0b] = 0x41; // 'A'
+ backup_ram[0x0c] = 0x41; // 'A'
+ 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) - 1;
+ backup_ram[0x0e] = (checksum >> 8) & 0xff; // checksum
+ backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum
+
+
+ /* Silent Scope data */
+ backup_ram[0x1f40] = 0x47; // 'G'
+ backup_ram[0x1f41] = 0x4b; // 'Q'
+ backup_ram[0x1f42] = 0x38; // '8'
+ backup_ram[0x1f43] = 0x33; // '3'
+ backup_ram[0x1f44] = 0x30; // '0'
+ backup_ram[0x1f45] = 0x00; //
+ backup_ram[0x1f46] = 0x00; //
+ backup_ram[0x1f47] = 0x00; //
+ backup_ram[0x1f48] = 0x20; //
+ backup_ram[0x1f49] = 0x00; // 2000
+ backup_ram[0x1f4a] = 0x55; // 'U'
+ backup_ram[0x1f4b] = 0x41; // 'A'
+ backup_ram[0x1f4c] = 0x41; // 'A'
+ backup_ram[0x1f4d] = 0x00; //
+
+ checksum = 0;
+ for (i=0x1f40; i < 0x1f4e; i+=2)
+ {
+ checksum += (backup_ram[i] << 8) | (backup_ram[i+1]);
+ checksum &= 0xffff;
+ }
+ checksum = (-1 - checksum) - 1;
+ backup_ram[0x1f4e] = (checksum >> 8) & 0xff; // checksum
+ backup_ram[0x1f4f] = (checksum >> 0) & 0xff; // checksum
+
+ voodoo_version = 1;
+ init_hornet_2board(machine);
+}
+
+/*****************************************************************************/
+
+ROM_START(sscope)
+ ROM_REGION32_BE(0x400000, REGION_USER1, 0) /* PowerPC program */
+ ROM_LOAD16_WORD_SWAP("ss1-1.27p", 0x200000, 0x200000, CRC(3b6bb075) SHA1(babc134c3a20c7cdcaa735d5f1fd5cab38667a14))
+ ROM_RELOAD(0x000000, 0x200000)
+
+ ROM_REGION32_BE(0x800000, REGION_USER2, ROMREGION_ERASE00) /* Data roms */
+
+ ROM_REGION(0x80000, REGION_CPU2, 0) /* 68K Program */
+ ROM_LOAD16_WORD_SWAP("ss1-1.7s", 0x000000, 0x80000, CRC(2805ea1d) SHA1(2556a51ee98cb8f59bf081e916c69a24532196f1))
+
+ ROM_REGION(0x1000000, REGION_USER5, 0) /* CG Board texture roms */
+ ROM_LOAD32_WORD( "ss1-3.u32", 0x000000, 0x400000, CRC(335793e1) SHA1(d582b53c3853abd59bc728f619a30c27cfc9497c) )
+ ROM_LOAD32_WORD( "ss1-3.u24", 0x000002, 0x400000, CRC(d6e7877e) SHA1(b4d0e17ada7dd126ec564a20e7140775b4b3fdb7) )
+
+ ROM_REGION(0x1000000, REGION_SOUND1, 0) /* PCM sample roms */
+ ROM_LOAD( "830a09.16p", 0x000000, 0x400000, CRC(e4b9f305) SHA1(ce2c6f63bdc9374dde48d8359102b57e48b4fdeb) )
+ ROM_LOAD( "830a10.14p", 0x400000, 0x400000, CRC(8b8aaf7e) SHA1(49b694dc171c149056b87c15410a6bf37ff2987f) )
+ROM_END
+
+ROM_START(sscopea)
+ ROM_REGION32_BE(0x400000, REGION_USER1, 0) /* PowerPC program */
+ ROM_LOAD16_WORD_SWAP("830_a01.bin", 0x200000, 0x200000, CRC(39e353f1) SHA1(569b06969ae7a690f6d6e63cc3b5336061663a37))
+ ROM_RELOAD(0x000000, 0x200000)
+
+ ROM_REGION32_BE(0x800000, REGION_USER2, ROMREGION_ERASE00) /* Data roms */
+
+ ROM_REGION(0x80000, REGION_CPU2, 0) /* 68K Program */
+ ROM_LOAD16_WORD_SWAP("ss1-1.7s", 0x000000, 0x80000, CRC(2805ea1d) SHA1(2556a51ee98cb8f59bf081e916c69a24532196f1))
+
+ ROM_REGION(0x1000000, REGION_USER5, 0) /* CG Board texture roms */
+ ROM_LOAD32_WORD( "ss1-3.u32", 0x000000, 0x400000, CRC(335793e1) SHA1(d582b53c3853abd59bc728f619a30c27cfc9497c) )
+ ROM_LOAD32_WORD( "ss1-3.u24", 0x000002, 0x400000, CRC(d6e7877e) SHA1(b4d0e17ada7dd126ec564a20e7140775b4b3fdb7) )
+
+ ROM_REGION(0x1000000, REGION_SOUND1, 0) /* PCM sample roms */
+ ROM_LOAD( "830a09.16p", 0x000000, 0x400000, CRC(e4b9f305) SHA1(ce2c6f63bdc9374dde48d8359102b57e48b4fdeb) )
+ ROM_LOAD( "830a10.14p", 0x400000, 0x400000, CRC(8b8aaf7e) SHA1(49b694dc171c149056b87c15410a6bf37ff2987f) )
+ROM_END
+
+ROM_START(sscope2)
+ ROM_REGION32_BE(0x400000, REGION_USER1, 0) /* PowerPC program */
+ ROM_LOAD16_WORD_SWAP("931d01.bin", 0x200000, 0x200000, CRC(4065fde6) SHA1(84f2dedc3e8f61651b22c0a21433a64993e1b9e2))
+ ROM_RELOAD(0x000000, 0x200000)
+
+ ROM_REGION32_BE(0x800000, REGION_USER2, 0) /* Data roms */
+ ROM_LOAD32_WORD_SWAP("931a04.bin", 0x000000, 0x200000, CRC(4f5917e6) SHA1(a63a107f1d6d9756e4ab0965d72ea446f0692814))
+
+ ROM_REGION32_BE(0x800000, REGION_USER3, 0) /* Comm board roms */
+ ROM_LOAD("931a19.bin", 0x000000, 0x400000, BAD_DUMP CRC(8e8bb6af) SHA1(1bb399f7897fbcbe6852fda3215052b2810437d8))
+ ROM_LOAD("931a20.bin", 0x400000, 0x400000, BAD_DUMP CRC(a14a7887) SHA1(daf0cbaf83e59680a0d3c4d66fcc48d02c9723d1))
+
+ ROM_REGION(0x800000, REGION_USER5, ROMREGION_ERASE00) /* CG Board texture roms */
+
+ ROM_REGION(0x80000, REGION_CPU2, 0) /* 68K Program */
+ ROM_LOAD16_WORD_SWAP("931a08.bin", 0x000000, 0x80000, CRC(1597d604) SHA1(a1eab4d25907930b59ea558b484c3b6ddcb9303c))
+
+ ROM_REGION(0xc00000, REGION_SOUND1, 0) /* PCM sample roms */
+ ROM_LOAD( "931a09.bin", 0x000000, 0x400000, CRC(694c354c) SHA1(42f54254a5959e1b341f2801f1ad032c4ed6f329) )
+ ROM_LOAD( "931a10.bin", 0x400000, 0x400000, CRC(78ceb519) SHA1(e61c0d21b6dc37a9293e72814474f5aee59115ad) )
+ ROM_LOAD( "931a11.bin", 0x800000, 0x400000, CRC(9c8362b2) SHA1(a8158c4db386e2bbd61dc9a600720f07a1eba294) )
+ROM_END
+
+ROM_START(gradius4)
+ ROM_REGION32_BE(0x400000, REGION_USER1, 0) /* PowerPC program */
+ ROM_LOAD16_WORD_SWAP( "837c01.27p", 0x200000, 0x200000, CRC(ce003123) SHA1(15e33997be2c1b3f71998627c540db378680a7a1) )
+ ROM_RELOAD(0x000000, 0x200000)
+
+ ROM_REGION32_BE(0x800000, REGION_USER2, 0) /* Data roms */
+ ROM_LOAD32_WORD_SWAP( "837a04.16t", 0x000000, 0x200000, CRC(18453b59) SHA1(3c75a54d8c09c0796223b42d30fb3867a911a074) )
+ ROM_LOAD32_WORD_SWAP( "837a05.14t", 0x000002, 0x200000, CRC(77178633) SHA1(ececdd501d0692390325c8dad6dbb068808a8b26) )
+
+ ROM_REGION32_BE(0x1000000, REGION_USER5, 0) /* CG Board texture roms */
+ ROM_LOAD32_WORD_SWAP( "837a14.32u", 0x000002, 0x400000, CRC(ff1b5d18) SHA1(7a38362170133dcc6ea01eb62981845917b85c36) )
+ ROM_LOAD32_WORD_SWAP( "837a13.24u", 0x000000, 0x400000, CRC(d86e10ff) SHA1(6de1179d7081d9a93ab6df47692d3efc190c38ba) )
+ ROM_LOAD32_WORD_SWAP( "837a16.32v", 0x800002, 0x400000, CRC(bb7a7558) SHA1(8c8cc062793c2dcfa72657b6ea0813d7223a0b87) )
+ ROM_LOAD32_WORD_SWAP( "837a15.24v", 0x800000, 0x400000, CRC(e0620737) SHA1(c14078cdb44f75c7c956b3627045d8494941d6b4) )
+
+ ROM_REGION(0x80000, REGION_CPU2, 0) /* 68K Program */
+ ROM_LOAD16_WORD_SWAP( "837a08.7s", 0x000000, 0x080000, CRC(c3a7ff56) SHA1(9d8d033277d560b58da151338d14b4758a9235ea) )
+
+ ROM_REGION(0x800000, REGION_SOUND1, 0) /* PCM sample roms */
+ ROM_LOAD( "837a09.16p", 0x000000, 0x400000, CRC(fb8f3dc2) SHA1(69e314ac06308c5a24309abc3d7b05af6c0302a8) )
+ ROM_LOAD( "837a10.14p", 0x400000, 0x400000, CRC(1419cad2) SHA1(a6369a5c29813fa51e8246d0c091736f32994f3d) )
+ROM_END
+
+ROM_START(nbapbp)
+ ROM_REGION32_BE(0x400000, REGION_USER1, 0) /* PowerPC program */
+ ROM_LOAD16_WORD_SWAP( "778a01.27p", 0x200000, 0x200000, CRC(e70019ce) SHA1(8b187b6e670fdc88771da08a56685cd621b139dc) )
+ ROM_RELOAD(0x000000, 0x200000)
+
+ ROM_REGION32_BE(0x800000, REGION_USER2, 0) /* Data roms */
+ ROM_LOAD32_WORD_SWAP( "778a04.16t", 0x000000, 0x400000, CRC(62c70132) SHA1(405aed149fc51e0adfa3ace3c644e47d53cf1ee3) )
+ ROM_LOAD32_WORD_SWAP( "778a05.14t", 0x000002, 0x400000, CRC(03249803) SHA1(f632a5f1dfa0a8500407214df0ec8d98ce09bc2b) )
+
+ ROM_REGION32_BE(0x1000000, REGION_USER5, 0) /* CG Board texture roms */
+ ROM_LOAD32_WORD_SWAP( "778a14.32u", 0x000002, 0x400000, CRC(db0c278d) SHA1(bb9884b6cdcdb707fff7e56e92e2ede062abcfd3) )
+ ROM_LOAD32_WORD_SWAP( "778a13.24u", 0x000000, 0x400000, CRC(47fda9cc) SHA1(4aae01c1f1861b4b12a3f9de6b39eb4d11a9736b) )
+ ROM_LOAD32_WORD_SWAP( "778a16.32v", 0x800002, 0x400000, CRC(6c0f46ea) SHA1(c6b9fbe14e13114a91a5925a0b46496260539687) )
+ ROM_LOAD32_WORD_SWAP( "778a15.24v", 0x800000, 0x400000, CRC(d176ad0d) SHA1(2be755dfa3f60379d396734809bbaaaad49e0db5) )
+
+ ROM_REGION(0x80000, REGION_CPU2, 0) /* 68K Program */
+ ROM_LOAD16_WORD_SWAP( "778a08.7s", 0x000000, 0x080000, CRC(6259b4bf) SHA1(d0c38870495c9a07984b4b85e736d6477dd44832) )
+
+ ROM_REGION(0x1000000, REGION_SOUND1, 0) /* PCM sample roms */
+ ROM_LOAD( "778a09.16p", 0x000000, 0x400000, CRC(e8c6fd93) SHA1(dd378b67b3b7dd932e4b39fbf4321e706522247f) )
+ ROM_LOAD( "778a10.14p", 0x400000, 0x400000, CRC(c6a0857b) SHA1(976734ba56460fcc090619fbba043a3d888c4f4e) )
+ ROM_LOAD( "778a11.12p", 0x800000, 0x400000, CRC(40199382) SHA1(bee268adf9b6634a4f6bb39278ecd02f2bdcb1f4) )
+ ROM_LOAD( "778a12.9p", 0xc00000, 0x400000, CRC(27d0c724) SHA1(48e48cbaea6db0de8c3471a2eda6faaa16eed46e) )
+ROM_END
+
+ROM_START(terabrst)
+ ROM_REGION32_BE(0x400000, REGION_USER1, 0) /* PowerPC program */
+ ROM_LOAD32_WORD_SWAP( "715a02.25p", 0x000000, 0x200000, CRC(070c48b3) SHA1(066cefbd34d8f6476083417471114f782bef97fb) )
+ ROM_LOAD32_WORD_SWAP( "715a03.22p", 0x000002, 0x200000, CRC(f77d242f) SHA1(7680e4abcccd549b3f6d1d245f64631fab57e80d) )
+
+ ROM_REGION32_BE(0x800000, REGION_USER2, 0) /* Data roms */
+ ROM_LOAD32_WORD_SWAP( "715a04.16t", 0x000000, 0x200000, CRC(00d9567e) SHA1(fe372399ad0ae89d557c93c3145b38e3ed0f714d) )
+ ROM_LOAD32_WORD_SWAP( "715a05.14t", 0x000002, 0x200000, CRC(462d53bf) SHA1(0216a84358571de6791365c69a1fa8fe2784148d) )
+
+ ROM_REGION32_BE(0x1000000, REGION_USER5, 0) /* CG Board texture roms */
+ ROM_LOAD32_WORD_SWAP( "715a14.32u", 0x000002, 0x400000, CRC(bbb36be3) SHA1(c828d0af0546db02e87afe68423b9447db7c7e51) )
+ ROM_LOAD32_WORD_SWAP( "715a13.24u", 0x000000, 0x400000, CRC(dbff58a1) SHA1(f0c60bb2cbf268cfcbdd65606ebb18f1b4839c0e) )
+
+ ROM_REGION(0x80000, REGION_CPU2, 0) /* 68K Program */
+ ROM_LOAD16_WORD_SWAP( "715a08.7s", 0x000000, 0x080000, CRC(3aa2f4a5) SHA1(bb43e5f5ef4ac51f228d4d825be66d3c720d51ea) )
+
+ ROM_REGION(0x1000000, REGION_SOUND1, 0) /* PCM sample roms */
+ ROM_LOAD( "715a09.16p", 0x000000, 0x400000, CRC(65845866) SHA1(d2a63d0deef1901e6fa21b55c5f96e1f781dceda) )
+ ROM_LOAD( "715a10.14p", 0x400000, 0x400000, CRC(294fe71b) SHA1(ac5fff5627df1cee4f1e1867377f208b34334899) )
+
+ ROM_REGION(0x20000, REGION_CPU3, 0) /* 68K Program */
+ ROM_LOAD16_WORD_SWAP( "715a17.20k", 0x000000, 0x020000, CRC(f0b7ba0c) SHA1(863b260824b0ae2f890ba84d1c9a8f436891b1ff) )
+ROM_END
+
+/*************************************************************************/
+
+GAME( 1998, gradius4, 0, hornet, hornet, gradius4, ROT0, "Konami", "Gradius 4: Fukkatsu", GAME_IMPERFECT_SOUND )
+GAME( 1998, nbapbp, 0, hornet, hornet, nbapbp, ROT0, "Konami", "NBA Play By Play", GAME_IMPERFECT_SOUND )
+GAMEL( 1998, terabrst, 0, hornet_2board, hornet, terabrst, ROT0, "Konami", "Teraburst", GAME_IMPERFECT_SOUND, layout_dualhsxs )
+GAMEL( 2000, sscope, 0, hornet_2board, sscope, sscope, ROT0, "Konami", "Silent Scope (ver UAB)", GAME_IMPERFECT_SOUND|GAME_NOT_WORKING, layout_dualhsxs )
+GAMEL( 2000, sscopea, sscope, hornet_2board, sscope, sscope, ROT0, "Konami", "Silent Scope (ver UAA)", GAME_IMPERFECT_SOUND|GAME_NOT_WORKING, layout_dualhsxs )
+GAMEL( 2000, sscope2, 0, hornet_2board, sscope, sscope2, ROT0, "Konami", "Silent Scope 2", GAME_IMPERFECT_SOUND|GAME_NOT_WORKING, layout_dualhsxs )