[wrap]
/* Konami Hornet System
Driver by Ville Linde
Konami 'Hornet' Hardware
Konami, 1997-1999
Known games on this hardware include....
Game (C) Year
----------------------------------------------
Gradius 4 : Fukkatsu Konami 1999
NBA Play by Play Konami 1998
Silent Scope Konami 1999
Silent Scope 2 : Fatal Judgement Konami 2000
Silent Scope 2 : Dark Silhouette Konami 2000
Terraburst Konami 1998
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 KONAMI ID CPU PCB GFX 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)
PCB Layouts
-----------
Top Board
GN715 PWB(A)A
|--------------------------------------------------------------|
| SP485CS CN10 CN11 CN9 JP8 JP9 JP10 JP11|
|CN19 PAL1 |
|CN21 JP13 PAL2 68EC000 EPROM.7S |
| NE5532 PAL3 CN12|
| JP12 JP16 DRM1M4SJ8 CN13|
| NE5532 MASKROM.9P MASKROM.9T |
| SM5877 JP15 RF5C400 |
|CN18 MASKROM.12P MASKROM.12T|
| SM5877 16.9344MHz |
|CN14 SRAM256K MASKROM.14P MASKROM.14T|
| |
|CN16 SRAM256K MASKROM.16P MASKROM.16T|
| ADC12138 |
| 056800 JP5 |
| JP4 |
| MACH111 JP3 |---------| |
| TEST_SW EPROM.22P | | |
|CN1 DRAM16X16 |PPC403GA | |
| EPROM.25P | | |
| | | |
| DRAM16X16 EPROM.27P |---------| |
| 4AK16 JP6|
| |
|CN3 |
| 0038323 PAL4 7.3728MHz|
| E9825 058232 CN2 |
| 50.000MHz|
| RESET_SW CN5 JP1 JP2 |
|M48T58Y-70PC1 CN4 CN6 64.000MHz|
|--------------------------------------------------------------|
Notes:
DRM1M4SJ8 - Fujitsu 81C4256 256Kx4 DRAM (SOJ24)
SRAM256K - Cypress CY7C199 32kx8 SRAM (SOJ28)
DRAM16X16 - Fujitsu 8118160A-60 16megx16 DRAM (SOJ42)
0038323 E9825 - SOIC8 (Secured PIC?). I've seen a similar chip in the security cart of System573
M48T58Y-70PC1 - ST Timekeeper RAM
RF5C400 - Ricoh RF5C400 PCM 32Ch, 44.1 kHz Stereo, 3D Effect Spatializer, clock input 16.9344MHz
056800 - Konami Custom (QFP80)
058232 - Konami Custom Ceramic Package (SIL14)
ADC12138 - National Semiconductor ADC12138 A/D Converter, 12-bit + Serial I/O With MUX (SOP28)
MACH111 - AMD MACH111 CPLD (Stamped 'N676A1', PLCC44)
68EC000 - Motorola MC68EC000, running at 16.0MHz (64/4)
PPC403GA - IBM PowerPC 403GA CPU, clock input 32.0MHz (QFP160)
SM5877AM - Nippon Precision Circuits 3rd Order 2-Channel D/A Converter (SOIC24)
4AK16 - Hitachi 4AK16 Silicon N-Channel Power MOS FET Array (SIL10)
NE5532AN - Philips, Dual Low-Noise High-Speed Audio OP Amp (DIP8)
SP485CS - Sipex SP485CS Low Power Half Duplex RS485 Transceiver (DIP8)
PAL1 - AMD PALCE16V8 (stamped 'N676A4', DIP20)
PAL2 - AMD PALCE16V8 (stamped 'N676A2', DIP20)
PAL3 - AMD PALCE16V8 (stamped 'N676A3', DIP20)
PAL4 - AMD PALCE16V8 (stamped 'N676A5', DIP20)
JP1 - 25M O O-O 32M
JP2 - 25M O O-O 32M
JP3 - RW O O O RO
JP4 - PROG 32M O O-O 16M
JP5 - DATA 32M O-O O 16M
JP6 - BOOT 16 O-O O 32
JP7 - SRC DOUT2 O O-O 0
JP8 - 64M&32M O-O O 16M
JP9 - 64M O O-O 32M&16M
JP10 - 64M&32M O-O O 16M
JP11 - 64M O O-O 32M&16M
JP12 - THRU O-O O SP
JP13 - THRU O-O O SP
JP14 - WDT O O
JP15 - MONO O-O O SURR
JP16 - HIGH O O O MID (N/C LOW)
CN1 THRU CN3 - Multi-pin Flat Cable Connector
CN4 - Multi-pin Connector for Network PCB
CN5 - Multi-pin Flat Cable Connector
CN6 - 96-Pin To Lower PCB, Joining Connector
CN7 THRU CN8 - Not used
CN9 THRU CN11 - 6-Pin Power Connectors
CN19 - USB Connector
CN21 - 5-Pin Analog Controls Connector (Tied to USB Connector via the Filter Board)
CN18 - RCA Mono Audio OUT
CN14 & CN16 - RCA Stereo Audio OUT
ROM Usage
---------
|------------------------------- ROM Locations ----------------------------------|
Game 27P 25P 22P 16P 14P 12P 9P 16T 14T 12T 9T 7S
-----------------------------------------------------------------------------------------------
Gradius 4 837C01 - - 837A09 837A10 - 778A12 837A04 837A05 - - 837A08
NBA P/Play 778A01 - - 778A09 778A10 778A11 778A12 778A04 778A05 - - 778A08
S/Scope 830B01 - - 830A09 830A10 - - - - - - 830A08
S/Scope 2 931D01 - - 931A09 931A10 931A11 - 931A04 - - - 931A08
Terraburst
Bottom Board
GN715 PWB(B)A
|--------------------------------------------------------------|
|CN4 CN2 CN8 CN6 CN5|
|JP1 |---------| 4M_EDO 4M_EDO |
| | | |----------| |
| 4M_EDO 4M_EDO | TEXELFX | | | |
| | | | PIXELFX | 4M_EDO |
| 4M_EDO 4M_EDO | | | | 4M_EDO |
| |---------| | | |--------| |
| 4M_EDO 4M_EDO |----------| |KONAMI | |
|CN3 50MHz JP7 |33906 | |
| 4M_EDO 4M_EDO JP6 | | |
| 256KSRAM 256KSRAM |--------| |
|CN7 |
| AV9170 1MSRAM 1MSRAM |
| MC44200 |
| 256KSRAM 256KSRAM |
| 1MSRAM 1MSRAM |
| |-------| MASKROM.24U |
| |KONAMI | MACH111 |-------------| MASKROM.24V|
| |37122 | |ANALOG | 1MSRAM 1MSRAM |
| | | |DEVICES | |
| |-------| JP5 |ADSP-21062 | 36.00MHz |
|1MSRAM |SHARC | 1MSRAM 1MSRAM |
| | | |
|1MSRAM | | |
| 256KSRAM |-------------| MASKROM.32U |
|1MSRAM 256KSRAM MASKROM.32V|
| 256KSRAM PAL1 PAL2 JP4 |
|1MSRAM |
| JP2 CN1 JP3 |
|--------------------------------------------------------------|
Notes:
4M_EDO - Silicon Magic SM81C256K16CJ-35 EDO DRAM 66MHz (SOJ40)
1MSRAM - Cypress CY7C109-25VC 1Meg SRAM (SOJ32)
256KSRAM - Winbond W24257AJ-15 256K SRAM (SOJ28)
TEXELFX - 3DFX 500-0004-02 BD0665.1 TMU (QFP208)
PIXELFX - 3DFX 500-0003-03 F001701.1 FBI (QFP240)
0000037122 - Konami Custom (QFP208)
MC44200FT - Motorola MC44200FT 3 Channel Video D/A Converter (QFP44)
MACH111 - AMD MACH111 CPLD (Stamped 'N715B1', PLCC44)
AV9170 - Integrated Circuit Systems Inc. Clock Multiplier (SOIC8)
PAL1 - AMD PALCE16V8 (stamped 'N676B4', DIP20)
PAL2 - AMD PALCE16V8 (stamped 'N676B5', DIP20)
JP1 - SCR O O-O TWN
JP2 - MASTER O-O O SLAVE
JP3 - 16M O O-O 32M
JP4 - 32M O-O O 16M
JP5 - ASYNC O O-O SYNC
JP6 - DSP O O-O ADCK
JP7 - MCK O-O O SCK
CN1 - 96 Pin To Lower PCB, Joining Connector
CN2 - 8-Pin RGB OUT
CN3 - 15-Pin DSUB VGA Video MAIN OUT
CN4 - 6-Pin Power Connector
CN5 - 4-Pin Power Connector
CN6 - 2-Pin Connector (Not Used)
CN7 - 15-Pin DSUB VGA Video MAIN OUT
CN8 - 6-Pin Connector (Not Used)
ROM Usage
---------
|------ ROM Locations -------|
Game 24U 24V 32U 32V
-------------------------------------------
Gradius 4 837A13 837A15 837A14 837A16
NBA P/Play 778A13 778A15 778A14 778A16
S/Scope - - - - (no ROMs, not used)
S/Scope 2 - - - - (no ROMs, not used)
Terraburst
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/eeprom.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;
static UINT32 *workram;
static UINT32 *sharc_dataram[2];
static UINT8 jvs_sdata[1024];
static UINT32 jvs_sdata_ptr = 0;
static UINT8 *backup_ram;
/* 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 STATE_POSTLOAD( K037122_postload )
{
int chip = (FPTR)param;
K037122_char_dirty[chip] = 1;
memset(K037122_dirty_map[chip], 1, K037122_NUM_TILES);
}
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, 8, 8, 256, 64);
K037122_layer[chip][1] = tilemap_create(K037122_0_tile_info_layer1, tilemap_scan_rows, 8, 8, 128, 64);
}
else
{
K037122_layer[chip][0] = tilemap_create(K037122_1_tile_info_layer0, tilemap_scan_rows, 8, 8, 256, 64);
K037122_layer[chip][1] = tilemap_create(K037122_1_tile_info_layer1, tilemap_scan_rows, 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);
machine->gfx[K037122_gfx_index[chip]]->total_colors = machine->config->total_colors / 16;
state_save_register_item_array("K037122", chip, K037122_reg[chip]);
state_save_register_item_pointer("K037122", chip, K037122_char_ram[chip], 0x200000/sizeof(K037122_char_ram[chip][0]));
state_save_register_item_pointer("K037122", chip, K037122_tile_ram[chip], 0x20000/sizeof(K037122_tile_ram[chip][0]));
state_save_register_postload(machine, K037122_postload, (void *)(FPTR)chip);
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]);
}
}
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(running_machine *machine, int chip, bitmap_t *bitmap, const rectangle *cliprect)
{
const rectangle *visarea = video_screen_get_visible_area(machine->primary_screen);
if (K037122_reg[chip][0xc] & 0x10000)
{
tilemap_set_scrolldx(K037122_layer[chip][1], visarea->min_x, visarea->min_x);
tilemap_set_scrolldy(K037122_layer[chip][1], visarea->min_y, visarea->min_y);
tilemap_draw(bitmap, cliprect, K037122_layer[chip][1], 0,0);
}
else
{
tilemap_set_scrolldx(K037122_layer[chip][0], visarea->min_x, visarea->min_x);
tilemap_set_scrolldy(K037122_layer[chip][0], visarea->min_y, 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 void voodoo_vblank_0(const device_config *device, int param)
{
cpunum_set_input_line(device->machine, 0, INPUT_LINE_IRQ0, ASSERT_LINE);
}
static void voodoo_vblank_1(const device_config *device, int param)
{
cpunum_set_input_line(device->machine, 0, INPUT_LINE_IRQ1, ASSERT_LINE);
}
static VIDEO_START( hornet )
{
K037122_vh_start(machine, 0);
}
static VIDEO_START( hornet_2board )
{
K037122_vh_start(machine, 0);
K037122_vh_start(machine, 1);
}
static VIDEO_UPDATE( hornet )
{
const device_config *voodoo = device_list_find_by_tag(screen->machine->config->devicelist, VOODOO_GRAPHICS, "voodoo0");
voodoo_update(voodoo, bitmap, cliprect);
K037122_tile_update(screen->machine, 0);
K037122_tile_draw(screen->machine, 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 )
{
if (strcmp(screen->tag, "left") == 0)
{
const device_config *voodoo = device_list_find_by_tag(screen->machine->config->devicelist, VOODOO_GRAPHICS, "voodoo0");
voodoo_update(voodoo, bitmap, cliprect);
/* TODO: tilemaps per screen */
K037122_tile_update(screen->machine, 0);
K037122_tile_draw(screen->machine, 0, bitmap, cliprect);
}
else if (strcmp(screen->tag, "right") == 0)
{
const device_config *voodoo = device_list_find_by_tag(screen->machine->config->devicelist, VOODOO_GRAPHICS, "voodoo1");
voodoo_update(voodoo, bitmap, cliprect);
/* TODO: tilemaps per screen */
K037122_tile_update(screen->machine, 1);
K037122_tile_draw(screen->machine, 1, bitmap, cliprect);
}
draw_7segment_led(bitmap, 3, 3, led_reg0);
draw_7segment_led(bitmap, 9, 3, led_reg1);
return 0;
}
/*****************************************************************************/
static READ8_HANDLER( sysreg_r )
{
UINT8 r = 0;
static const char *portnames[] = { "IN0", "IN1", "IN2" };
switch (offset)
{
case 0: /* I/O port 0 */
case 1: /* I/O port 1 */
case 2: /* I/O port 2 */
r = input_port_read(machine, portnames[offset]);
break;
case 3: /* I/O port 3 */
/*
0x80 = JVSINIT (JAMMA I/F SENSE)
0x40 = COMMST
0x20 = GSENSE
0x08 = EEPDO (EEPROM DO)
0x04 = ADEOC (ADC EOC)
0x02 = ADDOR (ADC DOR)
0x01 = ADDO (ADC DO)
*/
r = 0xf7 | (eeprom_read_bit() << 3);
break;
case 4: /* I/O port 4 - DIP switches */
r = input_port_read(machine, "DSW");
break;
}
return r;
}
static WRITE8_HANDLER( sysreg_w )
{
switch (offset)
{
case 0: /* LED Register 0 */
led_reg0 = data;
break;
case 1: /* LED Register 1 */
led_reg1 = data;
break;
case 2: /* Parallel data register */
mame_printf_debug("Parallel data = %02X\n", data);
break;
case 3: /* System Register 0 */
/*
0x80 = EEPWEN (EEPROM write enable)
0x40 = EEPCS (EEPROM CS)
0x20 = EEPSCL (EEPROM SCL?)
0x10 = EEPDT (EEPROM data)
0x08 = JVSTXEN / LAMP3 (something about JAMMA interface)
0x04 = LAMP2
0x02 = LAMP1
0x01 = LAMP0
*/
eeprom_write_bit((data & 0x10) ? 1 : 0);
eeprom_set_clock_line((data & 0x20) ? ASSERT_LINE : CLEAR_LINE);
eeprom_set_cs_line((data & 0x40) ? CLEAR_LINE : ASSERT_LINE);
mame_printf_debug("System register 0 = %02X\n", data);
break;
case 4: /* System Register 1 */
/*
0x80 = SNDRES (sound reset)
0x40 = COMRES (COM reset)
0x20 = COINRQ2 (EEPROM SCL?)
0x10 = COINRQ1 (EEPROM data)
0x08 = ADCS (ADC CS)
0x04 = ADCONV (ADC CONV)
0x02 = ADDI (ADC DI)
0x01 = ADDSCLK (ADC SCLK)
*/
cpunum_set_input_line(machine, 1, INPUT_LINE_RESET, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE);
mame_printf_debug("System register 1 = %02X\n", data);
break;
case 5: /* Sound Control Register */
/*
0x80 = MODE1
0x40 = MUTE1
0x20 = DEEN1
0x10 = ATCK1
0x08 = MODE0
0x04 = MUTE0
0x02 = DEEN0
0x01 = ATCK0
*/
mame_printf_debug("Sound control register = %02X\n", data);
break;
case 6: /* WDT Register */
/*
0x80 = WDTCLK
*/
if (data & 0x80)
watchdog_reset(machine);
break;
case 7: /* CG Control Register */
/*
0x80 = EXRES1
0x40 = EXRES0
0x20 = EXID1
0x10 = EXID0
0x01 = EXRGB
*/
if (data & 0x80)
cpunum_set_input_line(machine, 0, INPUT_LINE_IRQ1, CLEAR_LINE);
if (data & 0x40)
cpunum_set_input_line(machine, 0, INPUT_LINE_IRQ0, CLEAR_LINE);
set_cgboard_id((data >> 4) & 3);
break;
}
}
/*****************************************************************************/
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;
UINT8 *usr3 = memory_region(machine, REGION_USER3);
if (usr3 != NULL)
memory_set_bank(1, bank & 0x7f);
}
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_RAM AM_BASE(&workram) /* Work RAM */
AM_RANGE(0x74000000, 0x740000ff) AM_READWRITE(K037122_reg_r, K037122_reg_w)
AM_RANGE(0x74020000, 0x7403ffff) AM_READWRITE(K037122_sram_r, K037122_sram_w)
AM_RANGE(0x74040000, 0x7407ffff) AM_READWRITE(K037122_char_r, K037122_char_w)
AM_RANGE(0x78000000, 0x7800ffff) AM_READWRITE(cgboard_dsp_shared_r_ppc, cgboard_dsp_shared_w_ppc)
AM_RANGE(0x780c0000, 0x780c0003) AM_READWRITE(cgboard_dsp_comm_r_ppc, cgboard_dsp_comm_w_ppc)
AM_RANGE(0x7d000000, 0x7d00ffff) AM_READ8(sysreg_r, 0xffffffff)
AM_RANGE(0x7d010000, 0x7d01ffff) AM_WRITE8(sysreg_w, 0xffffffff)
AM_RANGE(0x7d020000, 0x7d021fff) AM_READWRITE8(timekeeper_0_r, timekeeper_0_w, 0xffffffff) /* M48T58Y RTC/NVRAM */
AM_RANGE(0x7d030000, 0x7d030007) AM_READWRITE(K056800_host_r, K056800_host_w)
AM_RANGE(0x7d042000, 0x7d043fff) AM_RAM /* COMM BOARD 0 */
AM_RANGE(0x7d044000, 0x7d044007) AM_READ(comm0_unk_r)
AM_RANGE(0x7d048000, 0x7d048003) AM_WRITE(comm1_w)
AM_RANGE(0x7d04a000, 0x7d04a003) AM_WRITE(comm_rombank_w)
AM_RANGE(0x7d050000, 0x7d05ffff) AM_ROMBANK(1) /* COMM BOARD 1 */
AM_RANGE(0x7e000000, 0x7e7fffff) AM_ROM AM_REGION(REGION_USER2, 0) /* Data ROM */
AM_RANGE(0x7f000000, 0x7f3fffff) AM_ROM AM_SHARE(2)
AM_RANGE(0x7fc00000, 0x7fffffff) 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 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_BASE(&sharc_dataram[0])
AM_RANGE(0x1400000, 0x14fffff) AM_RAM
AM_RANGE(0x2400000, 0x27fffff) AM_DEVREADWRITE(VOODOO_GRAPHICS, "voodoo0", voodoo_r, voodoo_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_BASE(&sharc_dataram[1])
AM_RANGE(0x1400000, 0x14fffff) AM_RAM
AM_RANGE(0x2400000, 0x27fffff) AM_DEVREADWRITE(VOODOO_GRAPHICS, "voodoo1", voodoo_r, voodoo_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_TAG("IN0")
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_TAG("IN1")
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_TAG("IN2")
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_SERVICE_NO_TOGGLE( 0x10, IP_ACTIVE_LOW )
PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START_TAG("DSW")
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_TAG("IN0")
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_TAG("IN1")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START_TAG("IN2")
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_SERVICE_NO_TOGGLE( 0x10, IP_ACTIVE_LOW )
PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START_TAG("DSW")
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 const struct RF5C400interface rf5c400_interface =
{
REGION_SOUND1
};
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_START( hornet )
{
/* set conservative DRC options */
cpunum_set_info_int(0, CPUINFO_INT_PPC_DRC_OPTIONS, PPCDRC_COMPATIBLE_OPTIONS);
/* configure fast RAM regions for DRC */
cpunum_set_info_int(0, CPUINFO_INT_PPC_FASTRAM_SELECT, 0);
cpunum_set_info_int(0, CPUINFO_INT_PPC_FASTRAM_START, 0x00000000);
cpunum_set_info_int(0, CPUINFO_INT_PPC_FASTRAM_END, 0x003fffff);
cpunum_set_info_ptr(0, CPUINFO_PTR_PPC_FASTRAM_BASE, workram);
cpunum_set_info_int(0, CPUINFO_INT_PPC_FASTRAM_READONLY, 0);
state_save_register_global(led_reg0);
state_save_register_global(led_reg1);
state_save_register_global_array(jvs_sdata);
state_save_register_global(jvs_sdata_ptr);
}
static MACHINE_RESET( hornet )
{
UINT8 *usr3 = memory_region(machine, REGION_USER3);
UINT8 *usr5 = memory_region(machine, REGION_USER5);
if (usr3 != NULL)
{
memory_configure_bank(1, 0, memory_region_length(machine, REGION_USER3) / 0x40000, usr3, 0x40000);
memory_set_bank(1, 0);
}
cpunum_set_input_line(machine, 2, INPUT_LINE_RESET, ASSERT_LINE);
if (usr5)
memory_set_bankptr(5, usr5);
}
static NVRAM_HANDLER( hornet )
{
NVRAM_HANDLER_CALL(timekeeper_0);
NVRAM_HANDLER_CALL(93C46);
}
static MACHINE_DRIVER_START( hornet )
/* basic machine hardware */
MDRV_CPU_ADD_TAG("main", PPC403GA, 64000000/2) /* PowerPC 403GA 32MHz */
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_INTERLEAVE(100)
MDRV_MACHINE_START( hornet )
MDRV_MACHINE_RESET( hornet )
MDRV_NVRAM_HANDLER( hornet )
MDRV_3DFX_VOODOO_1_ADD("voodoo0", STD_VOODOO_1_CLOCK, 2, "main")
MDRV_3DFX_VOODOO_TMU_MEMORY(0, 4)
MDRV_3DFX_VOODOO_VBLANK(voodoo_vblank_0)
/* video hardware */
MDRV_SCREEN_ADD("main", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
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 )
{
UINT8 *usr3 = memory_region(machine, REGION_USER3);
UINT8 *usr5 = memory_region(machine, REGION_USER5);
if (usr3 != NULL)
{
memory_configure_bank(1, 0, memory_region_length(machine, REGION_USER3) / 0x40000, usr3, 0x40000);
memory_set_bank(1, 0);
}
cpunum_set_input_line(machine, 2, INPUT_LINE_RESET, ASSERT_LINE);
cpunum_set_input_line(machine, 3, INPUT_LINE_RESET, ASSERT_LINE);
if (usr5)
memory_set_bankptr(5, usr5);
}
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)
MDRV_3DFX_VOODOO_REMOVE("voodoo0")
MDRV_3DFX_VOODOO_1_ADD("voodoo0", STD_VOODOO_1_CLOCK, 2, "left")
MDRV_3DFX_VOODOO_TMU_MEMORY(0, 4)
MDRV_3DFX_VOODOO_VBLANK(voodoo_vblank_0)
MDRV_3DFX_VOODOO_1_ADD("voodoo1", STD_VOODOO_1_CLOCK, 2, "right")
MDRV_3DFX_VOODOO_TMU_MEMORY(0, 4)
MDRV_3DFX_VOODOO_VBLANK(voodoo_vblank_1)
/* video hardware */
MDRV_PALETTE_LENGTH(65536)
MDRV_SCREEN_REMOVE("main")
MDRV_SCREEN_ADD("left", RASTER)
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", RASTER)
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 MACHINE_DRIVER_START( hornet_2board_v2 )
MDRV_IMPORT_FROM(hornet_2board)
MDRV_3DFX_VOODOO_REMOVE("voodoo0")
MDRV_3DFX_VOODOO_2_ADD("voodoo0", STD_VOODOO_2_CLOCK, 2, "left")
MDRV_3DFX_VOODOO_TMU_MEMORY(0, 4)
MDRV_3DFX_VOODOO_VBLANK(voodoo_vblank_0)
MDRV_3DFX_VOODOO_REMOVE("voodoo1")
MDRV_3DFX_VOODOO_2_ADD("voodoo1", STD_VOODOO_2_CLOCK, 2, "right")
MDRV_3DFX_VOODOO_TMU_MEMORY(0, 4)
MDRV_3DFX_VOODOO_VBLANK(voodoo_vblank_1)
MACHINE_DRIVER_END
/*****************************************************************************/
static void jamma_jvs_cmd_exec(void);
static void jamma_jvs_w(UINT8 data)
{
if (jvs_sdata_ptr == 0 && data != 0xe0)
return;
jvs_sdata[jvs_sdata_ptr] = data;
jvs_sdata_ptr++;
if (jvs_sdata_ptr >= 3 && jvs_sdata_ptr >= 3 + jvs_sdata[2])
jamma_jvs_cmd_exec();
}
static int jvs_encode_data(UINT8 *in, int length)
{
int inptr = 0;
int sum = 0;
while (inptr < length)
{
UINT8 b = in[inptr++];
if (b == 0xe0)
{
sum += 0xd0 + 0xdf;
ppc4xx_spu_receive_byte(0, 0xd0);
ppc4xx_spu_receive_byte(0, 0xdf);
}
else if (b == 0xd0)
{
sum += 0xd0 + 0xcf;
ppc4xx_spu_receive_byte(0, 0xd0);
ppc4xx_spu_receive_byte(0, 0xcf);
}
else
{
sum += b;
ppc4xx_spu_receive_byte(0, b);
}
}
return sum;
}
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 length;
int rdata_ptr;
int sum;
sync = jvs_sdata[0];
node = jvs_sdata[1];
byte_num = jvs_sdata[2];
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
sum = 0x00 + (rdata_ptr+1);
ppc4xx_spu_receive_byte(0, 0xe0); // sync
ppc4xx_spu_receive_byte(0, 0x00); // node
ppc4xx_spu_receive_byte(0, rdata_ptr+1); // num of bytes
sum += jvs_encode_data(rdata, rdata_ptr);
ppc4xx_spu_receive_byte(0, sum - 1); // checksum
jvs_sdata_ptr = 0;
}
/*****************************************************************************/
static void sound_irq_callback(running_machine *machine, int irq)
{
if (irq == 0)
cpunum_set_input_line(machine, 1, INPUT_LINE_IRQ1, PULSE_LINE);
else
cpunum_set_input_line(machine, 1, INPUT_LINE_IRQ2, PULSE_LINE);
}
static void init_hornet(running_machine *machine, const UINT8 *backupdef)
{
init_konami_cgboard(1, CGBOARD_TYPE_HORNET);
set_cgboard_texture_bank(0, 5, memory_region(machine, REGION_USER5));
K056800_init(sound_irq_callback);
K033906_init();
backup_ram = auto_malloc(0x2000);
memcpy(backup_ram, backupdef, 0x2000);
timekeeper_init(machine, 0, TIMEKEEPER_M48T58, backup_ram);
ppc4xx_spu_set_tx_handler(0, jamma_jvs_w);
}
static void init_hornet_2board(running_machine *machine, const UINT8 *backupdef)
{
init_konami_cgboard(2, CGBOARD_TYPE_HORNET);
set_cgboard_texture_bank(0, 5, memory_region(machine, REGION_USER5));
set_cgboard_texture_bank(1, 6, memory_region(machine, REGION_USER5));
K056800_init(sound_irq_callback);
K033906_init();
backup_ram = auto_malloc(0x2000);
memcpy(backup_ram, backupdef, 0x2000);
timekeeper_init(machine, 0, TIMEKEEPER_M48T58, backup_ram);
ppc4xx_spu_set_tx_handler(0, jamma_jvs_w);
}
static DRIVER_INIT(gradius4)
{
UINT8 backupdef[0x2000] = { 0 };
/* RTC data */
backupdef[0x00] = 0x47; // 'G'
backupdef[0x01] = 0x58; // 'X'
backupdef[0x02] = 0x38; // '8'
backupdef[0x03] = 0x33; // '3'
backupdef[0x04] = 0x37; // '7'
backupdef[0x05] = 0x00; //
backupdef[0x06] = 0x11; //
backupdef[0x07] = 0x06; // 06 / 11
backupdef[0x08] = 0x19; //
backupdef[0x09] = 0x98; // 1998
backupdef[0x0a] = 0x4a; // 'J'
backupdef[0x0b] = 0x41; // 'A'
backupdef[0x0c] = 0x43; // 'C'
backupdef[0x0d] = 0x00; //
backupdef[0x0e] = 0x02; // checksum
backupdef[0x0f] = 0xd7; // checksum
init_hornet(machine, backupdef);
}
static DRIVER_INIT(nbapbp)
{
UINT8 backupdef[0x2000] = { 0 };
int i;
UINT16 checksum;
/* RTC data */
backupdef[0x00] = 0x47; // 'G'
backupdef[0x01] = 0x58; // 'X'
backupdef[0x02] = 0x37; // '7'
backupdef[0x03] = 0x37; // '7'
backupdef[0x04] = 0x38; // '8'
backupdef[0x05] = 0x00; //
backupdef[0x06] = 0x00; //
backupdef[0x07] = 0x00; //
backupdef[0x08] = 0x19; //
backupdef[0x09] = 0x98; // 1998
backupdef[0x0a] = 0x4a; // 'J'
backupdef[0x0b] = 0x41; // 'A'
backupdef[0x0c] = 0x41; // 'A'
backupdef[0x0d] = 0x00; //
checksum = 0;
for (i=0; i < 14; i++)
{
checksum += backupdef[i];
checksum &= 0xffff;
}
backupdef[0x0e] = (checksum >> 8) & 0xff; // checksum
backupdef[0x0f] = (checksum >> 0) & 0xff; // checksum
init_hornet(machine, backupdef);
}
static DRIVER_INIT(terabrst)
{
UINT8 backupdef[0x2000] = { 0 };
int i;
UINT16 checksum;
/* RTC data */
backupdef[0x00] = 0x47; // 'G'
backupdef[0x01] = 0x4e; // 'N'
backupdef[0x02] = 0x37; // '7'
backupdef[0x03] = 0x31; // '1'
backupdef[0x04] = 0x35; // '5'
backupdef[0x05] = 0x00; //
backupdef[0x06] = 0x00; //
backupdef[0x07] = 0x00; //
backupdef[0x08] = 0x19; //
backupdef[0x09] = 0x98; // 1998
backupdef[0x0a] = 0x41; // 'J'
backupdef[0x0b] = 0x41; // 'A'
backupdef[0x0c] = 0x45; // 'E'
backupdef[0x0d] = 0x00; //
checksum = 0;
for (i=0; i < 14; i+=2)
{
checksum += (backupdef[i] << 8) | (backupdef[i+1]);
}
checksum = ~checksum - 0;
backupdef[0x0e] = (checksum >> 8) & 0xff; // checksum
backupdef[0x0f] = (checksum >> 0) & 0xff; // checksum
init_hornet_2board(machine, backupdef);
}
static DRIVER_INIT(sscope)
{
UINT8 backupdef[0x2000] = { 0 };
int i;
UINT16 checksum;
/* RTC data */
backupdef[0x00] = 0x47; // 'G'
backupdef[0x01] = 0x51; // 'Q'
backupdef[0x02] = 0x38; // '8'
backupdef[0x03] = 0x33; // '3'
backupdef[0x04] = 0x30; // '0'
backupdef[0x05] = 0x00; //
backupdef[0x06] = 0x00; //
backupdef[0x07] = 0x00; //
backupdef[0x08] = 0x20; //
backupdef[0x09] = 0x00; // 2000
backupdef[0x0a] = 0x55; // 'U'
backupdef[0x0b] = 0x41; // 'A'
backupdef[0x0c] = 0x41; // 'A'
backupdef[0x0d] = 0x00; //
checksum = 0;
for (i=0; i < 14; i+=2)
{
checksum += (backupdef[i] << 8) | (backupdef[i+1]);
}
checksum = ~checksum - 1;
backupdef[0x0e] = (checksum >> 8) & 0xff; // checksum
backupdef[0x0f] = (checksum >> 0) & 0xff; // checksum
init_hornet_2board(machine, backupdef);
}
static DRIVER_INIT(sscope2)
{
UINT8 backupdef[0x2000] = { 0 };
int i;
int checksum;
/* RTC data */
backupdef[0x00] = 0x47; // 'G'
backupdef[0x01] = 0x4b; // 'K'
backupdef[0x02] = 0x39; // '9'
backupdef[0x03] = 0x33; // '3'
backupdef[0x04] = 0x31; // '1'
backupdef[0x05] = 0x00; //
backupdef[0x06] = 0x00; //
backupdef[0x07] = 0x00; //
backupdef[0x08] = 0x20; //
backupdef[0x09] = 0x00; // 2000
backupdef[0x0a] = 0x55; // 'U'
backupdef[0x0b] = 0x41; // 'A'
backupdef[0x0c] = 0x41; // 'A'
backupdef[0x0d] = 0x00; //
checksum = 0;
for (i=0; i < 14; i+=2)
{
checksum += (backupdef[i] << 8) | (backupdef[i+1]);
checksum &= 0xffff;
}
checksum = (-1 - checksum) - 1;
backupdef[0x0e] = (checksum >> 8) & 0xff; // checksum
backupdef[0x0f] = (checksum >> 0) & 0xff; // checksum
/* Silent Scope data */
backupdef[0x1f40] = 0x47; // 'G'
backupdef[0x1f41] = 0x4b; // 'Q'
backupdef[0x1f42] = 0x38; // '8'
backupdef[0x1f43] = 0x33; // '3'
backupdef[0x1f44] = 0x30; // '0'
backupdef[0x1f45] = 0x00; //
backupdef[0x1f46] = 0x00; //
backupdef[0x1f47] = 0x00; //
backupdef[0x1f48] = 0x20; //
backupdef[0x1f49] = 0x00; // 2000
backupdef[0x1f4a] = 0x55; // 'U'
backupdef[0x1f4b] = 0x41; // 'A'
backupdef[0x1f4c] = 0x41; // 'A'
backupdef[0x1f4d] = 0x00; //
checksum = 0;
for (i=0x1f40; i < 0x1f4e; i+=2)
{
checksum += (backupdef[i] << 8) | (backupdef[i+1]);
checksum &= 0xffff;
}
checksum = (-1 - checksum) - 1;
backupdef[0x1f4e] = (checksum >> 8) & 0xff; // checksum
backupdef[0x1f4f] = (checksum >> 0) & 0xff; // checksum
init_hornet_2board(machine, backupdef);
}
/*****************************************************************************/
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_SUPPORTS_SAVE )
GAME( 1998, nbapbp, 0, hornet, hornet, nbapbp, ROT0, "Konami", "NBA Play By Play", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAMEL( 1998, terabrst, 0, hornet_2board, hornet, terabrst, ROT0, "Konami", "Teraburst", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE, layout_dualhsxs )
GAMEL( 2000, sscope, 0, hornet_2board, sscope, sscope, ROT0, "Konami", "Silent Scope (ver UAB)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE, layout_dualhsxs )
GAMEL( 2000, sscopea, sscope, hornet_2board, sscope, sscope, ROT0, "Konami", "Silent Scope (ver UAA)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE, layout_dualhsxs )
GAMEL( 2000, sscope2, 0, hornet_2board_v2, sscope, sscope2, ROT0, "Konami", "Silent Scope 2", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE, layout_dualhsxs )