mirror of
https://github.com/holub/mame
synced 2025-05-23 22:20:01 +03:00
Split ADC1038, Konami 033906 and Konami 056230 emulation from gticlub.c and konppc.c. Also, converted them to be devices and updated PPC Konami games to use the new code
Just out of curiosity: did sscope/sscope2 ever pass through the initial hw checks or did they regressed at some point?
This commit is contained in:
parent
98f248b3be
commit
b99e364eae
6
.gitattributes
vendored
6
.gitattributes
vendored
@ -632,6 +632,8 @@ src/emu/machine/8257dma.c svneol=native#text/plain
|
||||
src/emu/machine/8257dma.h svneol=native#text/plain
|
||||
src/emu/machine/adc083x.c svneol=native#text/plain
|
||||
src/emu/machine/adc083x.h svneol=native#text/plain
|
||||
src/emu/machine/adc1038.c svneol=native#text/plain
|
||||
src/emu/machine/adc1038.h svneol=native#text/plain
|
||||
src/emu/machine/adc1213x.c svneol=native#text/plain
|
||||
src/emu/machine/adc1213x.h svneol=native#text/plain
|
||||
src/emu/machine/am53cf96.c svneol=native#text/plain
|
||||
@ -668,6 +670,10 @@ src/emu/machine/idectrl.c svneol=native#text/plain
|
||||
src/emu/machine/idectrl.h svneol=native#text/plain
|
||||
src/emu/machine/intelfsh.c svneol=native#text/plain
|
||||
src/emu/machine/intelfsh.h svneol=native#text/plain
|
||||
src/emu/machine/k033906.c svneol=native#text/plain
|
||||
src/emu/machine/k033906.h svneol=native#text/plain
|
||||
src/emu/machine/k056230.c svneol=native#text/plain
|
||||
src/emu/machine/k056230.h svneol=native#text/plain
|
||||
src/emu/machine/laserdsc.h svneol=native#text/plain
|
||||
src/emu/machine/latch8.c svneol=native#text/plain
|
||||
src/emu/machine/latch8.h svneol=native#text/plain
|
||||
|
@ -124,6 +124,7 @@ EMUMACHINEOBJS = \
|
||||
$(EMUMACHINE)/8257dma.o \
|
||||
$(EMUMACHINE)/8255ppi.o \
|
||||
$(EMUMACHINE)/adc083x.o \
|
||||
$(EMUMACHINE)/adc1038.o \
|
||||
$(EMUMACHINE)/adc1213x.o \
|
||||
$(EMUMACHINE)/am53cf96.o \
|
||||
$(EMUMACHINE)/at28c16.o \
|
||||
@ -141,6 +142,8 @@ EMUMACHINEOBJS = \
|
||||
$(EMUMACHINE)/i2cmemdev.o \
|
||||
$(EMUMACHINE)/idectrl.o \
|
||||
$(EMUMACHINE)/intelfsh.o \
|
||||
$(EMUMACHINE)/k033906.o \
|
||||
$(EMUMACHINE)/k056230.o \
|
||||
$(EMUMACHINE)/latch8.o \
|
||||
$(EMUMACHINE)/ldcore.o \
|
||||
$(EMUMACHINE)/ldpr8210.o \
|
||||
|
176
src/emu/machine/adc1038.c
Normal file
176
src/emu/machine/adc1038.c
Normal file
@ -0,0 +1,176 @@
|
||||
/***************************************************************************
|
||||
|
||||
National Semiconductor ADC1038
|
||||
|
||||
10-Bit Serial I/O A/D Converters with Analog Multiplexer and
|
||||
Track/hold Function
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "driver.h"
|
||||
#include "adc1038.h"
|
||||
|
||||
/***************************************************************************
|
||||
TYPE DEFINITIONS
|
||||
***************************************************************************/
|
||||
|
||||
typedef struct _adc1038_state adc1038_state;
|
||||
struct _adc1038_state
|
||||
{
|
||||
int cycle;
|
||||
int clk;
|
||||
int adr;
|
||||
int data_in;
|
||||
int data_out;
|
||||
int adc_data;
|
||||
int sars;
|
||||
adc1038_input_read_func input_callback_r;
|
||||
|
||||
int gticlub_hack;
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
INLINE FUNCTIONS
|
||||
*****************************************************************************/
|
||||
|
||||
INLINE adc1038_state *adc1038_get_safe_token( const device_config *device )
|
||||
{
|
||||
assert(device != NULL);
|
||||
assert(device->token != NULL);
|
||||
assert(device->type == ADC1038);
|
||||
|
||||
return (adc1038_state *)device->token;
|
||||
}
|
||||
|
||||
INLINE const adc1038_interface *adc1038_get_interface( const device_config *device )
|
||||
{
|
||||
assert(device != NULL);
|
||||
assert((device->type == ADC1038));
|
||||
return (const adc1038_interface *) device->static_config;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
DEVICE HANDLERS
|
||||
*****************************************************************************/
|
||||
|
||||
READ_LINE_DEVICE_HANDLER( adc1038_do_read )
|
||||
{
|
||||
adc1038_state *adc1038 = adc1038_get_safe_token(device);
|
||||
|
||||
//printf("ADC DO\n");
|
||||
return adc1038->data_out;
|
||||
}
|
||||
|
||||
WRITE_LINE_DEVICE_HANDLER( adc1038_di_write )
|
||||
{
|
||||
adc1038_state *adc1038 = adc1038_get_safe_token(device);
|
||||
|
||||
adc1038->data_in = state;
|
||||
}
|
||||
|
||||
WRITE_LINE_DEVICE_HANDLER( adc1038_clk_write )
|
||||
{
|
||||
adc1038_state *adc1038 = adc1038_get_safe_token(device);
|
||||
|
||||
// GTI Club doesn't sync on SARS
|
||||
if (adc1038->gticlub_hack)
|
||||
{
|
||||
if (adc1038->clk == 0 && state == 0)
|
||||
{
|
||||
adc1038->cycle = 0;
|
||||
|
||||
/* notice that adc1038->adr is always < 7! */
|
||||
adc1038->adc_data = adc1038->input_callback_r(device, adc1038->adr);
|
||||
}
|
||||
}
|
||||
|
||||
if (state == 1)
|
||||
{
|
||||
//printf("ADC CLK, DI = %d, cycle = %d\n", adc1038->data_in, adc1038->cycle);
|
||||
|
||||
if (adc1038->cycle == 0) // A2
|
||||
{
|
||||
adc1038->adr = 0;
|
||||
adc1038->adr |= (adc1038->data_in << 2);
|
||||
}
|
||||
else if (adc1038->cycle == 1) // A1
|
||||
{
|
||||
adc1038->adr |= (adc1038->data_in << 1);
|
||||
}
|
||||
else if (adc1038->cycle == 2) // A0
|
||||
{
|
||||
adc1038->adr |= (adc1038->data_in << 0);
|
||||
}
|
||||
|
||||
adc1038->data_out = (adc1038->adc_data & 0x200) ? 1 : 0;
|
||||
adc1038->adc_data <<= 1;
|
||||
|
||||
adc1038->cycle++;
|
||||
}
|
||||
|
||||
adc1038->clk = state;
|
||||
}
|
||||
|
||||
READ_LINE_DEVICE_HANDLER( adc1038_sars_read )
|
||||
{
|
||||
adc1038_state *adc1038 = adc1038_get_safe_token(device);
|
||||
|
||||
adc1038->cycle = 0;
|
||||
|
||||
/* notice that adc1038->adr is always < 7! */
|
||||
adc1038->adc_data = adc1038->input_callback_r(device, adc1038->adr);
|
||||
|
||||
adc1038->data_out = (adc1038->adc_data & 0x200) ? 1 : 0;
|
||||
adc1038->adc_data <<= 1;
|
||||
|
||||
adc1038->sars ^= 1;
|
||||
return adc1038->sars;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
DEVICE INTERFACE
|
||||
*****************************************************************************/
|
||||
|
||||
static DEVICE_START( adc1038 )
|
||||
{
|
||||
adc1038_state *adc1038 = adc1038_get_safe_token(device);
|
||||
const adc1038_interface *intf = adc1038_get_interface(device);
|
||||
|
||||
adc1038->gticlub_hack = intf->gticlub_hack;
|
||||
adc1038->input_callback_r = intf->input_callback_r;
|
||||
|
||||
state_save_register_device_item(device, 0, adc1038->cycle);
|
||||
state_save_register_device_item(device, 0, adc1038->clk);
|
||||
state_save_register_device_item(device, 0, adc1038->adr);
|
||||
state_save_register_device_item(device, 0, adc1038->data_in);
|
||||
state_save_register_device_item(device, 0, adc1038->data_out);
|
||||
state_save_register_device_item(device, 0, adc1038->adc_data);
|
||||
state_save_register_device_item(device, 0, adc1038->sars);
|
||||
}
|
||||
|
||||
static DEVICE_RESET( adc1038 )
|
||||
{
|
||||
adc1038_state *adc1038 = adc1038_get_safe_token(device);
|
||||
|
||||
adc1038->cycle = 0;
|
||||
adc1038->clk = 0;
|
||||
adc1038->adr = 0;
|
||||
adc1038->data_in = 0;
|
||||
adc1038->data_out = 0;
|
||||
adc1038->adc_data = 0;
|
||||
adc1038->sars = 1;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
device definition
|
||||
-------------------------------------------------*/
|
||||
|
||||
static const char DEVTEMPLATE_SOURCE[] = __FILE__;
|
||||
|
||||
#define DEVTEMPLATE_ID( p, s ) p##adc1038##s
|
||||
#define DEVTEMPLATE_FEATURES DT_HAS_START | DT_HAS_RESET
|
||||
#define DEVTEMPLATE_NAME "A/D Converters 1038"
|
||||
#define DEVTEMPLATE_FAMILY "National Semiconductor A/D Converters 1038"
|
||||
#define DEVTEMPLATE_CLASS DEVICE_CLASS_PERIPHERAL
|
||||
#include "devtempl.h"
|
56
src/emu/machine/adc1038.h
Normal file
56
src/emu/machine/adc1038.h
Normal file
@ -0,0 +1,56 @@
|
||||
/***************************************************************************
|
||||
|
||||
National Semiconductor ADC1038
|
||||
|
||||
10-Bit Serial I/O A/D Converters with Analog Multiplexer and
|
||||
Track/hold Function
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __ADC1038_H__
|
||||
#define __ADC1038_H__
|
||||
|
||||
#include "devcb.h"
|
||||
|
||||
/***************************************************************************
|
||||
TYPE DEFINITIONS
|
||||
***************************************************************************/
|
||||
|
||||
typedef int (*adc1038_input_read_func)(const device_config *device, int input);
|
||||
|
||||
typedef struct _adc1038_interface adc1038_interface;
|
||||
struct _adc1038_interface
|
||||
{
|
||||
int gticlub_hack;
|
||||
adc1038_input_read_func input_callback_r;
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
FUNCTION PROTOTYPES
|
||||
***************************************************************************/
|
||||
|
||||
DEVICE_GET_INFO( adc1038 );
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
MACROS / CONSTANTS
|
||||
***************************************************************************/
|
||||
|
||||
#define ADC1038 DEVICE_GET_INFO_NAME( adc1038 )
|
||||
|
||||
#define MDRV_ADC1038_ADD(_tag, _config) \
|
||||
MDRV_DEVICE_ADD(_tag, ADC1038, 0) \
|
||||
MDRV_DEVICE_CONFIG(_config)
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
DEVICE I/O FUNCTIONS
|
||||
***************************************************************************/
|
||||
|
||||
extern READ_LINE_DEVICE_HANDLER( adc1038_do_read );
|
||||
extern READ_LINE_DEVICE_HANDLER( adc1038_sars_read );
|
||||
extern WRITE_LINE_DEVICE_HANDLER( adc1038_di_write );
|
||||
extern WRITE_LINE_DEVICE_HANDLER( adc1038_clk_write );
|
||||
|
||||
#endif /* __ADC1038_H__ */
|
171
src/emu/machine/k033906.c
Normal file
171
src/emu/machine/k033906.c
Normal file
@ -0,0 +1,171 @@
|
||||
/***************************************************************************
|
||||
|
||||
Konami IC 033906 (PCI bridge)
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "driver.h"
|
||||
#include "k033906.h"
|
||||
#include "video/voodoo.h"
|
||||
|
||||
/***************************************************************************
|
||||
TYPE DEFINITIONS
|
||||
***************************************************************************/
|
||||
|
||||
typedef struct _k033906_state k033906_state;
|
||||
struct _k033906_state
|
||||
{
|
||||
UINT32 * reg;
|
||||
UINT32 * ram;
|
||||
|
||||
int reg_set; // 1 = access reg / 0 = access ram
|
||||
|
||||
const device_config *voodoo;
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
INLINE FUNCTIONS
|
||||
*****************************************************************************/
|
||||
|
||||
INLINE k033906_state *k033906_get_safe_token( const device_config *device )
|
||||
{
|
||||
assert(device != NULL);
|
||||
assert(device->token != NULL);
|
||||
assert(device->type == K033906);
|
||||
|
||||
return (k033906_state *)device->token;
|
||||
}
|
||||
|
||||
INLINE const k033906_interface *k033906_get_interface( const device_config *device )
|
||||
{
|
||||
assert(device != NULL);
|
||||
assert((device->type == K033906));
|
||||
return (const k033906_interface *) device->static_config;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
DEVICE HANDLERS
|
||||
*****************************************************************************/
|
||||
|
||||
void k033906_set_reg( const device_config *device, int state )
|
||||
{
|
||||
k033906_state *k033906 = k033906_get_safe_token(device);
|
||||
k033906->reg_set = state;
|
||||
}
|
||||
|
||||
static UINT32 k033906_reg_r( const device_config *device, int reg )
|
||||
{
|
||||
k033906_state *k033906 = k033906_get_safe_token(device);
|
||||
|
||||
switch (reg)
|
||||
{
|
||||
case 0x00: return 0x0001121a; // PCI Vendor ID (0x121a = 3dfx), Device ID (0x0001 = Voodoo)
|
||||
case 0x02: return 0x04000000; // Revision ID
|
||||
case 0x04: return k033906->reg[0x04]; // memBaseAddr
|
||||
case 0x0f: return k033906->reg[0x0f]; // interrupt_line, interrupt_pin, min_gnt, max_lat
|
||||
|
||||
default:
|
||||
fatalerror("%s: k033906_reg_r: %08X", cpuexec_describe_context(device->machine), reg);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void k033906_reg_w( const device_config *device, int reg, UINT32 data )
|
||||
{
|
||||
k033906_state *k033906 = k033906_get_safe_token(device);
|
||||
|
||||
switch (reg)
|
||||
{
|
||||
case 0x00:
|
||||
break;
|
||||
|
||||
case 0x01: // command register
|
||||
break;
|
||||
|
||||
case 0x04: // memBaseAddr
|
||||
{
|
||||
if (data == 0xffffffff)
|
||||
k033906->reg[0x04] = 0xff000000;
|
||||
else
|
||||
k033906->reg[0x04] = data & 0xff000000;
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x0f: // interrupt_line, interrupt_pin, min_gnt, max_lat
|
||||
{
|
||||
k033906->reg[0x0f] = data;
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x10: // initEnable
|
||||
{
|
||||
voodoo_set_init_enable(k033906->voodoo, data);
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x11: // busSnoop0
|
||||
case 0x12: // busSnoop1
|
||||
break;
|
||||
|
||||
case 0x38: // ???
|
||||
break;
|
||||
|
||||
default:
|
||||
fatalerror("%s:K033906_w: %08X, %08X", cpuexec_describe_context(device->machine), data, reg);
|
||||
}
|
||||
}
|
||||
|
||||
READ32_DEVICE_HANDLER( k033906_r )
|
||||
{
|
||||
k033906_state *k033906 = k033906_get_safe_token(device);
|
||||
|
||||
if (k033906->reg_set)
|
||||
return k033906_reg_r(device, offset);
|
||||
else
|
||||
return k033906->ram[offset];
|
||||
}
|
||||
|
||||
WRITE32_DEVICE_HANDLER( k033906_w )
|
||||
{
|
||||
k033906_state *k033906 = k033906_get_safe_token(device);
|
||||
|
||||
if (k033906->reg_set)
|
||||
k033906_reg_w(device, offset, data);
|
||||
else
|
||||
k033906->ram[offset] = data;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
DEVICE INTERFACE
|
||||
*****************************************************************************/
|
||||
|
||||
static DEVICE_START( k033906 )
|
||||
{
|
||||
k033906_state *k033906 = k033906_get_safe_token(device);
|
||||
const k033906_interface *intf = k033906_get_interface(device);
|
||||
|
||||
k033906->voodoo = devtag_get_device(device->machine, intf->voodoo);
|
||||
|
||||
k033906->reg = auto_alloc_array(device->machine, UINT32, 256);
|
||||
k033906->ram = auto_alloc_array(device->machine, UINT32, 32768);
|
||||
|
||||
k033906->reg_set = 0;
|
||||
|
||||
state_save_register_device_item_pointer(device, 0, k033906->reg, 256);
|
||||
state_save_register_device_item_pointer(device, 0, k033906->ram, 32768);
|
||||
state_save_register_device_item(device, 0, k033906->reg_set);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
device definition
|
||||
-------------------------------------------------*/
|
||||
|
||||
static const char DEVTEMPLATE_SOURCE[] = __FILE__;
|
||||
|
||||
#define DEVTEMPLATE_ID( p, s ) p##k033906##s
|
||||
#define DEVTEMPLATE_FEATURES DT_HAS_START
|
||||
#define DEVTEMPLATE_NAME "Konami 033906"
|
||||
#define DEVTEMPLATE_FAMILY "Konami PCI Bridge 033906"
|
||||
#define DEVTEMPLATE_CLASS DEVICE_CLASS_PERIPHERAL
|
||||
#include "devtempl.h"
|
49
src/emu/machine/k033906.h
Normal file
49
src/emu/machine/k033906.h
Normal file
@ -0,0 +1,49 @@
|
||||
/***************************************************************************
|
||||
|
||||
Konami 033906
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __K033906_H__
|
||||
#define __K033906_H__
|
||||
|
||||
#include "devcb.h"
|
||||
|
||||
/***************************************************************************
|
||||
TYPE DEFINITIONS
|
||||
***************************************************************************/
|
||||
|
||||
typedef struct _k033906_interface k033906_interface;
|
||||
struct _k033906_interface
|
||||
{
|
||||
const char *voodoo;
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
FUNCTION PROTOTYPES
|
||||
***************************************************************************/
|
||||
|
||||
DEVICE_GET_INFO( k033906 );
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
MACROS / CONSTANTS
|
||||
***************************************************************************/
|
||||
|
||||
#define K033906 DEVICE_GET_INFO_NAME( k033906 )
|
||||
|
||||
#define MDRV_K033906_ADD(_tag, _config) \
|
||||
MDRV_DEVICE_ADD(_tag, K033906, 0) \
|
||||
MDRV_DEVICE_CONFIG(_config)
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
DEVICE I/O FUNCTIONS
|
||||
***************************************************************************/
|
||||
|
||||
extern READ32_DEVICE_HANDLER( k033906_r );
|
||||
extern WRITE32_DEVICE_HANDLER( k033906_w );
|
||||
extern void k033906_set_reg( const device_config *device, int state );
|
||||
|
||||
|
||||
#endif /* __K033906_H__ */
|
145
src/emu/machine/k056230.c
Normal file
145
src/emu/machine/k056230.c
Normal file
@ -0,0 +1,145 @@
|
||||
/***************************************************************************
|
||||
|
||||
Konami IC 056230 (LANC)
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "driver.h"
|
||||
#include "k056230.h"
|
||||
|
||||
/***************************************************************************
|
||||
TYPE DEFINITIONS
|
||||
***************************************************************************/
|
||||
|
||||
typedef struct _k056230_state k056230_state;
|
||||
struct _k056230_state
|
||||
{
|
||||
UINT32 * ram;
|
||||
int is_thunderh;
|
||||
|
||||
const device_config *cpu;
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
INLINE FUNCTIONS
|
||||
*****************************************************************************/
|
||||
|
||||
INLINE k056230_state *k056230_get_safe_token( const device_config *device )
|
||||
{
|
||||
assert(device != NULL);
|
||||
assert(device->token != NULL);
|
||||
assert(device->type == K056230);
|
||||
|
||||
return (k056230_state *)device->token;
|
||||
}
|
||||
|
||||
INLINE const k056230_interface *k056230_get_interface( const device_config *device )
|
||||
{
|
||||
assert(device != NULL);
|
||||
assert((device->type == K056230));
|
||||
return (const k056230_interface *) device->static_config;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
DEVICE HANDLERS
|
||||
*****************************************************************************/
|
||||
|
||||
READ8_DEVICE_HANDLER( k056230_r )
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0: // Status register
|
||||
{
|
||||
return 0x08;
|
||||
}
|
||||
}
|
||||
|
||||
// mame_printf_debug("k056230_r: %d at %08X\n", offset, cpu_get_pc(space->cpu));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static TIMER_CALLBACK( network_irq_clear )
|
||||
{
|
||||
k056230_state *k056230 = (k056230_state *)ptr;
|
||||
cpu_set_input_line(k056230->cpu, INPUT_LINE_IRQ2, CLEAR_LINE);
|
||||
}
|
||||
|
||||
WRITE8_DEVICE_HANDLER( k056230_w )
|
||||
{
|
||||
k056230_state *k056230 = k056230_get_safe_token(device);
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0: // Mode register
|
||||
{
|
||||
break;
|
||||
}
|
||||
case 1: // Control register
|
||||
{
|
||||
if (data & 0x20)
|
||||
{
|
||||
// Thunder Hurricane breaks otherwise...
|
||||
if (!k056230->is_thunderh)
|
||||
{
|
||||
cpu_set_input_line(k056230->cpu, INPUT_LINE_IRQ2, ASSERT_LINE);
|
||||
timer_set(device->machine, ATTOTIME_IN_USEC(10), k056230, 0, network_irq_clear);
|
||||
}
|
||||
}
|
||||
// else
|
||||
// cpu_set_input_line(k056230->cpu, INPUT_LINE_IRQ2, CLEAR_LINE);
|
||||
break;
|
||||
}
|
||||
case 2: // Sub ID register
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
// mame_printf_debug("k056230_w: %d, %02X at %08X\n", offset, data, cpu_get_pc(space->cpu));
|
||||
}
|
||||
|
||||
READ32_DEVICE_HANDLER( lanc_ram_r )
|
||||
{
|
||||
k056230_state *k056230 = k056230_get_safe_token(device);
|
||||
|
||||
//mame_printf_debug("LANC_RAM_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(space->cpu));
|
||||
return k056230->ram[offset & 0x7ff];
|
||||
}
|
||||
|
||||
WRITE32_DEVICE_HANDLER( lanc_ram_w )
|
||||
{
|
||||
k056230_state *k056230 = k056230_get_safe_token(device);
|
||||
|
||||
//mame_printf_debug("LANC_RAM_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(space->cpu));
|
||||
COMBINE_DATA(k056230->ram + (offset & 0x7ff));
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
DEVICE INTERFACE
|
||||
*****************************************************************************/
|
||||
|
||||
static DEVICE_START( k056230 )
|
||||
{
|
||||
k056230_state *k056230 = k056230_get_safe_token(device);
|
||||
const k056230_interface *intf = k056230_get_interface(device);
|
||||
|
||||
k056230->cpu = devtag_get_device(device->machine, intf->cpu);
|
||||
k056230->is_thunderh = intf->is_thunderh;
|
||||
|
||||
k056230->ram = auto_alloc_array(device->machine, UINT32, 0x2000);
|
||||
|
||||
state_save_register_device_item_pointer(device, 0, k056230->ram, 0x2000);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
device definition
|
||||
-------------------------------------------------*/
|
||||
|
||||
static const char DEVTEMPLATE_SOURCE[] = __FILE__;
|
||||
|
||||
#define DEVTEMPLATE_ID( p, s ) p##k056230##s
|
||||
#define DEVTEMPLATE_FEATURES DT_HAS_START
|
||||
#define DEVTEMPLATE_NAME "Konami 056230"
|
||||
#define DEVTEMPLATE_FAMILY "Konami Network Board 056230"
|
||||
#define DEVTEMPLATE_CLASS DEVICE_CLASS_PERIPHERAL
|
||||
#include "devtempl.h"
|
51
src/emu/machine/k056230.h
Normal file
51
src/emu/machine/k056230.h
Normal file
@ -0,0 +1,51 @@
|
||||
/***************************************************************************
|
||||
|
||||
Konami 056230
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __K056230_H__
|
||||
#define __K056230_H__
|
||||
|
||||
#include "devcb.h"
|
||||
|
||||
/***************************************************************************
|
||||
TYPE DEFINITIONS
|
||||
***************************************************************************/
|
||||
|
||||
typedef struct _k056230_interface k056230_interface;
|
||||
struct _k056230_interface
|
||||
{
|
||||
const char *cpu;
|
||||
int is_thunderh;
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
FUNCTION PROTOTYPES
|
||||
***************************************************************************/
|
||||
|
||||
DEVICE_GET_INFO( k056230 );
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
MACROS / CONSTANTS
|
||||
***************************************************************************/
|
||||
|
||||
#define K056230 DEVICE_GET_INFO_NAME( k056230 )
|
||||
|
||||
#define MDRV_K056230_ADD(_tag, _config) \
|
||||
MDRV_DEVICE_ADD(_tag, K056230, 0) \
|
||||
MDRV_DEVICE_CONFIG(_config)
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
DEVICE I/O FUNCTIONS
|
||||
***************************************************************************/
|
||||
|
||||
extern READ32_DEVICE_HANDLER( lanc_ram_r );
|
||||
extern WRITE32_DEVICE_HANDLER( lanc_ram_w );
|
||||
extern READ8_DEVICE_HANDLER( k056230_r );
|
||||
extern WRITE8_DEVICE_HANDLER( k056230_w );
|
||||
|
||||
|
||||
#endif /* __K056230_H__ */
|
@ -224,6 +224,9 @@ Hang Pilot (uses an unknown but similar video board) 12W
|
||||
#include "cpu/powerpc/ppc.h"
|
||||
#include "cpu/sharc/sharc.h"
|
||||
#include "machine/konppc.h"
|
||||
#include "machine/adc1038.h"
|
||||
#include "machine/k056230.h"
|
||||
#include "machine/k033906.h"
|
||||
#include "sound/rf5c400.h"
|
||||
#include "video/voodoo.h"
|
||||
#include "video/gticlub.h"
|
||||
@ -352,115 +355,10 @@ static void eeprom_handler(running_machine *machine, mame_file *file, int read_o
|
||||
}
|
||||
}
|
||||
|
||||
static int adc1038_cycle;
|
||||
static int adc1038_clk;
|
||||
static int adc1038_adr;
|
||||
static int adc1038_data_in;
|
||||
static int adc1038_data_out;
|
||||
static int adc1038_adc_data;
|
||||
static int adc1038_sars;
|
||||
static int adc1038_gticlub_hack;
|
||||
|
||||
static void adc1038_init(running_machine *machine)
|
||||
{
|
||||
adc1038_cycle = 0;
|
||||
adc1038_clk = 0;
|
||||
adc1038_adr = 0;
|
||||
adc1038_data_in = 0;
|
||||
adc1038_data_out = 0;
|
||||
adc1038_adc_data = 0;
|
||||
adc1038_sars = 1;
|
||||
adc1038_gticlub_hack = (mame_stricmp(machine->gamedrv->name, "gticlub") == 0 ||
|
||||
mame_stricmp(machine->gamedrv->name, "gticlubj") == 0) ? 1 : 0;
|
||||
}
|
||||
|
||||
static int adc1038_do_r(void)
|
||||
{
|
||||
//printf("ADC DO\n");
|
||||
return adc1038_data_out & 1;
|
||||
}
|
||||
|
||||
static void adc1038_di_w(int bit)
|
||||
{
|
||||
adc1038_data_in = bit & 1;
|
||||
}
|
||||
|
||||
static void adc1038_clk_w(running_machine *machine, int bit)
|
||||
{
|
||||
// GTI Club doesn't sync on SARS
|
||||
if (adc1038_gticlub_hack)
|
||||
{
|
||||
if (adc1038_clk == 0 && bit == 0)
|
||||
{
|
||||
adc1038_cycle = 0;
|
||||
|
||||
switch (adc1038_adr)
|
||||
{
|
||||
case 0: adc1038_adc_data = input_port_read(machine, "AN0"); break;
|
||||
case 1: adc1038_adc_data = input_port_read(machine, "AN1"); break;
|
||||
case 2: adc1038_adc_data = input_port_read(machine, "AN2"); break;
|
||||
case 3: adc1038_adc_data = input_port_read(machine, "AN3"); break;
|
||||
case 4: adc1038_adc_data = 0x000; break;
|
||||
case 5: adc1038_adc_data = 0x000; break;
|
||||
case 6: adc1038_adc_data = 0x000; break;
|
||||
case 7: adc1038_adc_data = 0x000; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bit == 1)
|
||||
{
|
||||
//printf("ADC CLK, DI = %d, cycle = %d\n", adc1038_data_in, adc1038_cycle);
|
||||
|
||||
if (adc1038_cycle == 0) // A2
|
||||
{
|
||||
adc1038_adr = 0;
|
||||
adc1038_adr |= (adc1038_data_in << 2);
|
||||
}
|
||||
else if (adc1038_cycle == 1) // A1
|
||||
{
|
||||
adc1038_adr |= (adc1038_data_in << 1);
|
||||
}
|
||||
else if (adc1038_cycle == 2) // A0
|
||||
{
|
||||
adc1038_adr |= (adc1038_data_in << 0);
|
||||
}
|
||||
|
||||
adc1038_data_out = (adc1038_adc_data & 0x200) ? 1 : 0;
|
||||
adc1038_adc_data <<= 1;
|
||||
|
||||
adc1038_cycle++;
|
||||
}
|
||||
|
||||
adc1038_clk = bit;
|
||||
}
|
||||
|
||||
static int adc1038_sars_r(running_machine *machine)
|
||||
{
|
||||
adc1038_cycle = 0;
|
||||
|
||||
switch (adc1038_adr)
|
||||
{
|
||||
case 0: adc1038_adc_data = input_port_read(machine, "AN0"); break;
|
||||
case 1: adc1038_adc_data = input_port_read(machine, "AN1"); break;
|
||||
case 2: adc1038_adc_data = input_port_read(machine, "AN2"); break;
|
||||
case 3: adc1038_adc_data = input_port_read(machine, "AN3"); break;
|
||||
case 4: adc1038_adc_data = 0x000; break;
|
||||
case 5: adc1038_adc_data = 0x000; break;
|
||||
case 6: adc1038_adc_data = 0x000; break;
|
||||
case 7: adc1038_adc_data = 0x000; break;
|
||||
}
|
||||
|
||||
adc1038_data_out = (adc1038_adc_data & 0x200) ? 1 : 0;
|
||||
adc1038_adc_data <<= 1;
|
||||
|
||||
adc1038_sars ^= 1;
|
||||
return adc1038_sars;
|
||||
}
|
||||
|
||||
static READ8_HANDLER( sysreg_r )
|
||||
{
|
||||
static const char *const portnames[] = { "IN0", "IN1", "IN2", "IN3" };
|
||||
const device_config *adc1038 = devtag_get_device(space->machine, "adc1038");
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
@ -470,7 +368,7 @@ static READ8_HANDLER( sysreg_r )
|
||||
return input_port_read(space->machine, portnames[offset]);
|
||||
|
||||
case 2:
|
||||
return adc1038_sars_r(space->machine) << 7;
|
||||
return adc1038_sars_read(adc1038) << 7;
|
||||
|
||||
case 4:
|
||||
{
|
||||
@ -481,7 +379,7 @@ static READ8_HANDLER( sysreg_r )
|
||||
// e = EEPROM data out
|
||||
|
||||
UINT32 eeprom_bit = (eeprom_read_bit() << 1);
|
||||
UINT32 adc_bit = (adc1038_do_r() << 2);
|
||||
UINT32 adc_bit = (adc1038_do_read(adc1038) << 2);
|
||||
return (eeprom_bit | adc_bit);
|
||||
}
|
||||
|
||||
@ -494,6 +392,8 @@ static READ8_HANDLER( sysreg_r )
|
||||
|
||||
static WRITE8_HANDLER( sysreg_w )
|
||||
{
|
||||
const device_config *adc1038 = devtag_get_device(space->machine, "adc1038");
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0:
|
||||
@ -517,79 +417,14 @@ static WRITE8_HANDLER( sysreg_w )
|
||||
if (data & 0x40) /* CG Board 0 IRQ Ack */
|
||||
cputag_set_input_line(space->machine, "maincpu", INPUT_LINE_IRQ0, CLEAR_LINE);
|
||||
|
||||
adc1038_di_w((data >> 0) & 1);
|
||||
adc1038_clk_w(space->machine, (data >> 1) & 1);
|
||||
adc1038_di_write(adc1038, (data >> 0) & 1);
|
||||
adc1038_clk_write(adc1038, (data >> 1) & 1);
|
||||
|
||||
set_cgboard_id((data >> 4) & 0x3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Konami K056230 (LANC) */
|
||||
READ8_HANDLER( K056230_r )
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0: // Status register
|
||||
{
|
||||
return 0x08;
|
||||
}
|
||||
}
|
||||
|
||||
// mame_printf_debug("K056230_r: %d at %08X\n", offset, cpu_get_pc(space->cpu));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static TIMER_CALLBACK( network_irq_clear )
|
||||
{
|
||||
cputag_set_input_line(machine, "maincpu", INPUT_LINE_IRQ2, CLEAR_LINE);
|
||||
}
|
||||
|
||||
WRITE8_HANDLER( K056230_w )
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0: // Mode register
|
||||
{
|
||||
break;
|
||||
}
|
||||
case 1: // Control register
|
||||
{
|
||||
if (data & 0x20)
|
||||
{
|
||||
// Thunder Hurricane breaks otherwise...
|
||||
if (mame_stricmp(space->machine->gamedrv->name, "thunderh") != 0)
|
||||
{
|
||||
cputag_set_input_line(space->machine, "maincpu", INPUT_LINE_IRQ2, ASSERT_LINE);
|
||||
timer_set(space->machine, ATTOTIME_IN_USEC(10), NULL, 0, network_irq_clear);
|
||||
}
|
||||
}
|
||||
// else
|
||||
// cputag_set_input_line(space->machine, "maincpu", INPUT_LINE_IRQ2, CLEAR_LINE);
|
||||
break;
|
||||
}
|
||||
case 2: // Sub ID register
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
// mame_printf_debug("K056230_w: %d, %02X at %08X\n", offset, data, cpu_get_pc(space->cpu));
|
||||
}
|
||||
|
||||
UINT32 *lanc_ram;
|
||||
READ32_HANDLER( lanc_ram_r )
|
||||
{
|
||||
// mame_printf_debug("LANC_RAM_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(space->cpu));
|
||||
return lanc_ram[offset & 0x7ff];
|
||||
}
|
||||
|
||||
WRITE32_HANDLER( lanc_ram_w )
|
||||
{
|
||||
// mame_printf_debug("LANC_RAM_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(space->cpu));
|
||||
COMBINE_DATA(lanc_ram + (offset & 0x7ff));
|
||||
}
|
||||
|
||||
/******************************************************************/
|
||||
|
||||
static MACHINE_START( gticlub )
|
||||
@ -612,8 +447,8 @@ static ADDRESS_MAP_START( gticlub_map, ADDRESS_SPACE_PROGRAM, 32 )
|
||||
AM_RANGE(0x78080000, 0x7808000f) AM_READWRITE(K001006_1_r, K001006_1_w)
|
||||
AM_RANGE(0x780c0000, 0x780c0003) AM_READWRITE(cgboard_dsp_comm_r_ppc, cgboard_dsp_comm_w_ppc)
|
||||
AM_RANGE(0x7e000000, 0x7e003fff) AM_READWRITE8(sysreg_r, sysreg_w, 0xffffffff)
|
||||
AM_RANGE(0x7e008000, 0x7e009fff) AM_READWRITE8(K056230_r, K056230_w, 0xffffffff)
|
||||
AM_RANGE(0x7e00a000, 0x7e00bfff) AM_READWRITE(lanc_ram_r, lanc_ram_w) AM_BASE(&lanc_ram)
|
||||
AM_RANGE(0x7e008000, 0x7e009fff) AM_DEVREADWRITE8("k056230", k056230_r, k056230_w, 0xffffffff)
|
||||
AM_RANGE(0x7e00a000, 0x7e00bfff) AM_DEVREADWRITE("k056230", lanc_ram_r, lanc_ram_w)
|
||||
AM_RANGE(0x7e00c000, 0x7e00c007) AM_DEVWRITE("k056800", k056800_host_w)
|
||||
AM_RANGE(0x7e00c000, 0x7e00c007) AM_DEVREAD("k056800", k056800_host_r) // Hang Pilot
|
||||
AM_RANGE(0x7e00c008, 0x7e00c00f) AM_DEVREAD("k056800", k056800_host_r)
|
||||
@ -916,6 +751,50 @@ static const k056800_interface gticlub_k056800_interface =
|
||||
sound_irq_callback
|
||||
};
|
||||
|
||||
|
||||
static int adc1038_input_callback( const device_config *device, int input )
|
||||
{
|
||||
int value = 0;
|
||||
switch (input)
|
||||
{
|
||||
case 0: value = input_port_read(device->machine, "AN0"); break;
|
||||
case 1: value = input_port_read(device->machine, "AN1"); break;
|
||||
case 2: value = input_port_read(device->machine, "AN2"); break;
|
||||
case 3: value = input_port_read(device->machine, "AN3"); break;
|
||||
case 4: value = 0x000; break;
|
||||
case 5: value = 0x000; break;
|
||||
case 6: value = 0x000; break;
|
||||
case 7: value = 0x000; break;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static const adc1038_interface gticlub_adc1038_intf =
|
||||
{
|
||||
1,
|
||||
adc1038_input_callback
|
||||
};
|
||||
|
||||
static const adc1038_interface thunderh_adc1038_intf =
|
||||
{
|
||||
0,
|
||||
adc1038_input_callback
|
||||
};
|
||||
|
||||
static const k056230_interface gticlub_k056230_intf =
|
||||
{
|
||||
"maincpu",
|
||||
0
|
||||
};
|
||||
|
||||
static const k056230_interface thunderh_k056230_intf =
|
||||
{
|
||||
"maincpu",
|
||||
1
|
||||
};
|
||||
|
||||
|
||||
static MACHINE_RESET( gticlub )
|
||||
{
|
||||
cputag_set_input_line(machine, "dsp", INPUT_LINE_RESET, ASSERT_LINE);
|
||||
@ -941,6 +820,10 @@ static MACHINE_DRIVER_START( gticlub )
|
||||
MDRV_MACHINE_START(gticlub)
|
||||
MDRV_MACHINE_RESET(gticlub)
|
||||
|
||||
MDRV_ADC1038_ADD("adc1038", gticlub_adc1038_intf)
|
||||
|
||||
MDRV_K056230_ADD("k056230", gticlub_k056230_intf)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
@ -962,6 +845,36 @@ static MACHINE_DRIVER_START( gticlub )
|
||||
MDRV_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
static MACHINE_DRIVER_START( thunderh )
|
||||
|
||||
MDRV_IMPORT_FROM(gticlub)
|
||||
|
||||
MDRV_DEVICE_REMOVE("adc1038")
|
||||
MDRV_ADC1038_ADD("adc1038", thunderh_adc1038_intf)
|
||||
|
||||
MDRV_DEVICE_REMOVE("k056230")
|
||||
MDRV_K056230_ADD("k056230", thunderh_k056230_intf)
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
static MACHINE_DRIVER_START( slrasslt )
|
||||
|
||||
MDRV_IMPORT_FROM(gticlub)
|
||||
|
||||
MDRV_DEVICE_REMOVE("adc1038")
|
||||
MDRV_ADC1038_ADD("adc1038", thunderh_adc1038_intf)
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
|
||||
static const k033906_interface hangplt_k033906_intf_0 =
|
||||
{
|
||||
"voodoo0"
|
||||
};
|
||||
|
||||
static const k033906_interface hangplt_k033906_intf_1 =
|
||||
{
|
||||
"voodoo1"
|
||||
};
|
||||
|
||||
static MACHINE_RESET( hangplt )
|
||||
{
|
||||
cputag_set_input_line(machine, "dsp", INPUT_LINE_RESET, ASSERT_LINE);
|
||||
@ -991,6 +904,9 @@ static MACHINE_DRIVER_START( hangplt )
|
||||
MDRV_MACHINE_START(gticlub)
|
||||
MDRV_MACHINE_RESET(hangplt)
|
||||
|
||||
MDRV_ADC1038_ADD("adc1038", thunderh_adc1038_intf)
|
||||
MDRV_K056230_ADD("k056230", gticlub_k056230_intf)
|
||||
|
||||
MDRV_3DFX_VOODOO_1_ADD("voodoo0", STD_VOODOO_1_CLOCK, 2, "lscreen")
|
||||
MDRV_3DFX_VOODOO_CPU("dsp")
|
||||
MDRV_3DFX_VOODOO_TMU_MEMORY(0, 2)
|
||||
@ -1003,6 +919,9 @@ static MACHINE_DRIVER_START( hangplt )
|
||||
MDRV_3DFX_VOODOO_TMU_MEMORY(1, 2)
|
||||
MDRV_3DFX_VOODOO_VBLANK(voodoo_vblank_1)
|
||||
|
||||
MDRV_K033906_ADD("k033906_1", hangplt_k033906_intf_0)
|
||||
MDRV_K033906_ADD("k033906_2", hangplt_k033906_intf_1)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_PALETTE_LENGTH(65536)
|
||||
|
||||
@ -1231,8 +1150,6 @@ static DRIVER_INIT(gticlub)
|
||||
gticlub_led_reg0 = gticlub_led_reg1 = 0x7f;
|
||||
|
||||
K001005_preprocess_texture_data(memory_region(machine, "gfx1"), memory_region_length(machine, "gfx1"), 1);
|
||||
|
||||
adc1038_init(machine);
|
||||
}
|
||||
|
||||
static DRIVER_INIT(hangplt)
|
||||
@ -1244,18 +1161,14 @@ static DRIVER_INIT(hangplt)
|
||||
sharc_dataram_0 = auto_alloc_array(machine, UINT32, 0x100000/4);
|
||||
sharc_dataram_1 = auto_alloc_array(machine, UINT32, 0x100000/4);
|
||||
gticlub_led_reg0 = gticlub_led_reg1 = 0x7f;
|
||||
|
||||
K033906_init(machine);
|
||||
|
||||
adc1038_init(machine);
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
GAME( 1996, gticlub, 0, gticlub, gticlub, gticlub, ROT0, "Konami", "GTI Club (ver EAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAME( 1996, gticluba, gticlub, gticlub, gticlub, gticlub, ROT0, "Konami", "GTI Club (ver AAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAME( 1996, gticlubj, gticlub, gticlub, gticlub, gticlub, ROT0, "Konami", "GTI Club (ver JAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAME( 1996, thunderh, 0, gticlub, thunderh, gticlub, ROT0, "Konami", "Operation Thunder Hurricane (ver EAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAME( 1996, thunderhu,thunderh, gticlub, thunderh, gticlub, ROT0, "Konami", "Operation Thunder Hurricane (ver UAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAME( 1997, slrasslt, 0, gticlub, slrasslt, gticlub, ROT0, "Konami", "Solar Assault (ver UAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAMEL( 1997, hangplt, 0, hangplt, hangplt, hangplt, ROT0, "Konami", "Hang Pilot", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND, layout_dualhovu )
|
||||
GAME( 1996, gticlub, 0, gticlub, gticlub, gticlub, ROT0, "Konami", "GTI Club (ver EAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAME( 1996, gticluba, gticlub, gticlub, gticlub, gticlub, ROT0, "Konami", "GTI Club (ver AAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAME( 1996, gticlubj, gticlub, gticlub, gticlub, gticlub, ROT0, "Konami", "GTI Club (ver JAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAME( 1996, thunderh, 0, thunderh, thunderh, gticlub, ROT0, "Konami", "Operation Thunder Hurricane (ver EAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAME( 1996, thunderhu,thunderh, thunderh, thunderh, gticlub, ROT0, "Konami", "Operation Thunder Hurricane (ver UAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAME( 1997, slrasslt, 0, slrasslt, slrasslt, gticlub, ROT0, "Konami", "Solar Assault (ver UAA)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND )
|
||||
GAMEL( 1997, hangplt, 0, hangplt, hangplt, hangplt, ROT0, "Konami", "Hang Pilot", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND, layout_dualhovu )
|
||||
|
@ -319,6 +319,7 @@
|
||||
#include "rendlay.h"
|
||||
#include "machine/adc1213x.h"
|
||||
#include "sound/k056800.h"
|
||||
#include "machine/k033906.h"
|
||||
|
||||
static UINT8 led_reg0, led_reg1;
|
||||
static UINT32 *workram;
|
||||
@ -1100,6 +1101,16 @@ static const k056800_interface hornet_k056800_interface =
|
||||
sound_irq_callback
|
||||
};
|
||||
|
||||
static const k033906_interface hornet_k033906_intf_0 =
|
||||
{
|
||||
"voodoo0"
|
||||
};
|
||||
|
||||
static const k033906_interface hornet_k033906_intf_1 =
|
||||
{
|
||||
"voodoo1"
|
||||
};
|
||||
|
||||
static MACHINE_DRIVER_START( hornet )
|
||||
|
||||
/* basic machine hardware */
|
||||
@ -1125,6 +1136,8 @@ static MACHINE_DRIVER_START( hornet )
|
||||
MDRV_3DFX_VOODOO_TMU_MEMORY(0, 4)
|
||||
MDRV_3DFX_VOODOO_VBLANK(voodoo_vblank_0)
|
||||
|
||||
MDRV_K033906_ADD("k033906_1", hornet_k033906_intf_0)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
@ -1192,6 +1205,8 @@ static MACHINE_DRIVER_START( hornet_2board )
|
||||
MDRV_3DFX_VOODOO_TMU_MEMORY(0, 4)
|
||||
MDRV_3DFX_VOODOO_VBLANK(voodoo_vblank_1)
|
||||
|
||||
MDRV_K033906_ADD("k033906_2", hornet_k033906_intf_1)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_PALETTE_LENGTH(65536)
|
||||
|
||||
@ -1382,8 +1397,6 @@ static DRIVER_INIT(hornet)
|
||||
init_konami_cgboard(machine, 1, CGBOARD_TYPE_HORNET);
|
||||
set_cgboard_texture_bank(machine, 0, "bank5", memory_region(machine, "user5"));
|
||||
|
||||
K033906_init(machine);
|
||||
|
||||
led_reg0 = led_reg1 = 0x7f;
|
||||
|
||||
ppc4xx_spu_set_tx_handler(cputag_get_cpu(machine, "maincpu"), jamma_jvs_w);
|
||||
@ -1395,8 +1408,6 @@ static DRIVER_INIT(hornet_2board)
|
||||
set_cgboard_texture_bank(machine, 0, "bank5", memory_region(machine, "user5"));
|
||||
set_cgboard_texture_bank(machine, 1, "bank6", memory_region(machine, "user5"));
|
||||
|
||||
K033906_init(machine);
|
||||
|
||||
led_reg0 = led_reg1 = 0x7f;
|
||||
|
||||
ppc4xx_spu_set_tx_handler(cputag_get_cpu(machine, "maincpu"), jamma_jvs_w);
|
||||
|
@ -222,6 +222,7 @@ Thrill Drive 713A13 - 713A14 -
|
||||
#include "video/voodoo.h"
|
||||
#include "machine/timekpr.h"
|
||||
#include "sound/k056800.h"
|
||||
#include "machine/k033906.h"
|
||||
|
||||
static UINT8 led_reg0, led_reg1;
|
||||
|
||||
@ -1042,6 +1043,11 @@ static const k056800_interface nwktr_k056800_interface =
|
||||
sound_irq_callback
|
||||
};
|
||||
|
||||
static const k033906_interface nwktr_k033906_interface =
|
||||
{
|
||||
"voodoo"
|
||||
};
|
||||
|
||||
static MACHINE_RESET( nwktr )
|
||||
{
|
||||
cputag_set_input_line(machine, "dsp", INPUT_LINE_RESET, ASSERT_LINE);
|
||||
@ -1071,6 +1077,8 @@ static MACHINE_DRIVER_START( nwktr )
|
||||
MDRV_3DFX_VOODOO_TMU_MEMORY(1, 2)
|
||||
MDRV_3DFX_VOODOO_VBLANK(voodoo_vblank_0)
|
||||
|
||||
MDRV_K033906_ADD("k033906_1", nwktr_k033906_interface)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
@ -1106,8 +1114,6 @@ static DRIVER_INIT(nwktr)
|
||||
sharc_dataram = auto_alloc_array(machine, UINT32, 0x100000/4);
|
||||
led_reg0 = led_reg1 = 0x7f;
|
||||
|
||||
K033906_init(machine);
|
||||
|
||||
lanc2_init(machine);
|
||||
}
|
||||
|
||||
|
@ -170,6 +170,7 @@ Check gticlub.c for details on the bottom board.
|
||||
#include "sound/k054539.h"
|
||||
#include "machine/konppc.h"
|
||||
#include "machine/adc083x.h"
|
||||
#include "machine/k056230.h"
|
||||
#include "machine/eepromdev.h"
|
||||
#include "video/konicdev.h"
|
||||
#include "video/gticlub.h"
|
||||
@ -178,13 +179,6 @@ Check gticlub.c for details on the bottom board.
|
||||
static UINT8 led_reg0, led_reg1;
|
||||
|
||||
|
||||
// defined in drivers/gticlub.c
|
||||
extern READ8_HANDLER(K056230_r);
|
||||
extern WRITE8_HANDLER(K056230_w);
|
||||
extern UINT32 *lanc_ram;
|
||||
extern READ32_HANDLER(lanc_ram_r);
|
||||
extern WRITE32_HANDLER(lanc_ram_w);
|
||||
|
||||
|
||||
// defined in drivers/nwk-tr.c
|
||||
int K001604_vh_start(running_machine *machine, int chip);
|
||||
@ -416,8 +410,8 @@ static ADDRESS_MAP_START( zr107_map, ADDRESS_SPACE_PROGRAM, 32 )
|
||||
AM_RANGE(0x78040000, 0x7804000f) AM_READWRITE(K001006_0_r, K001006_0_w)
|
||||
AM_RANGE(0x780c0000, 0x780c0007) AM_READWRITE(cgboard_dsp_comm_r_ppc, cgboard_dsp_comm_w_ppc)
|
||||
AM_RANGE(0x7e000000, 0x7e003fff) AM_READWRITE8(sysreg_r, sysreg_w, 0xffffffff)
|
||||
AM_RANGE(0x7e008000, 0x7e009fff) AM_READWRITE8(K056230_r, K056230_w, 0xffffffff) /* LANC registers */
|
||||
AM_RANGE(0x7e00a000, 0x7e00bfff) AM_READWRITE(lanc_ram_r, lanc_ram_w) AM_BASE(&lanc_ram) /* LANC Buffer RAM (27E) */
|
||||
AM_RANGE(0x7e008000, 0x7e009fff) AM_DEVREADWRITE8("k056230", k056230_r, k056230_w, 0xffffffff) /* LANC registers */
|
||||
AM_RANGE(0x7e00a000, 0x7e00bfff) AM_DEVREADWRITE("k056230", lanc_ram_r, lanc_ram_w) /* LANC Buffer RAM (27E) */
|
||||
AM_RANGE(0x7e00c000, 0x7e00c007) AM_DEVWRITE("k056800", k056800_host_w)
|
||||
AM_RANGE(0x7e00c008, 0x7e00c00f) AM_DEVREAD("k056800", k056800_host_r)
|
||||
AM_RANGE(0x7f800000, 0x7f9fffff) AM_ROM AM_SHARE("share2")
|
||||
@ -444,8 +438,8 @@ static ADDRESS_MAP_START( jetwave_map, ADDRESS_SPACE_PROGRAM, 32 )
|
||||
AM_RANGE(0x78080000, 0x7808000f) AM_MIRROR(0x80000000) AM_READWRITE(K001006_1_r, K001006_1_w)
|
||||
AM_RANGE(0x780c0000, 0x780c0007) AM_MIRROR(0x80000000) AM_READWRITE(cgboard_dsp_comm_r_ppc, cgboard_dsp_comm_w_ppc)
|
||||
AM_RANGE(0x7e000000, 0x7e003fff) AM_MIRROR(0x80000000) AM_READWRITE8(sysreg_r, sysreg_w, 0xffffffff)
|
||||
AM_RANGE(0x7e008000, 0x7e009fff) AM_MIRROR(0x80000000) AM_READWRITE8(K056230_r, K056230_w, 0xffffffff) /* LANC registers */
|
||||
AM_RANGE(0x7e00a000, 0x7e00bfff) AM_MIRROR(0x80000000) AM_READWRITE(lanc_ram_r, lanc_ram_w) AM_BASE(&lanc_ram) /* LANC Buffer RAM (27E) */
|
||||
AM_RANGE(0x7e008000, 0x7e009fff) AM_MIRROR(0x80000000) AM_DEVREADWRITE8("k056230", k056230_r, k056230_w, 0xffffffff) /* LANC registers */
|
||||
AM_RANGE(0x7e00a000, 0x7e00bfff) AM_MIRROR(0x80000000) AM_DEVREADWRITE("k056230", lanc_ram_r, lanc_ram_w) /* LANC Buffer RAM (27E) */
|
||||
AM_RANGE(0x7e00c000, 0x7e00c007) AM_MIRROR(0x80000000) AM_DEVWRITE("k056800", k056800_host_w)
|
||||
AM_RANGE(0x7e00c008, 0x7e00c00f) AM_MIRROR(0x80000000) AM_DEVREAD("k056800", k056800_host_r)
|
||||
AM_RANGE(0x7f000000, 0x7f3fffff) AM_MIRROR(0x80000000) AM_ROM AM_REGION("user2", 0)
|
||||
@ -705,6 +699,12 @@ static const k056832_interface zr107_k056832_intf =
|
||||
game_tile_callback, "none"
|
||||
};
|
||||
|
||||
static const k056230_interface zr107_k056230_intf =
|
||||
{
|
||||
"maincpu",
|
||||
0
|
||||
};
|
||||
|
||||
/* PowerPC interrupts
|
||||
|
||||
IRQ0: Vblank
|
||||
@ -742,6 +742,8 @@ static MACHINE_DRIVER_START( zr107 )
|
||||
MDRV_MACHINE_START(zr107)
|
||||
MDRV_MACHINE_RESET(zr107)
|
||||
|
||||
MDRV_K056230_ADD("k056230", zr107_k056230_intf)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
@ -793,6 +795,8 @@ static MACHINE_DRIVER_START( jetwave )
|
||||
MDRV_MACHINE_START(zr107)
|
||||
MDRV_MACHINE_RESET(zr107)
|
||||
|
||||
MDRV_K056230_ADD("k056230", zr107_k056230_intf)
|
||||
|
||||
/* video hardware */
|
||||
MDRV_SCREEN_ADD("screen", RASTER)
|
||||
MDRV_SCREEN_REFRESH_RATE(60)
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include "driver.h"
|
||||
#include "cpu/sharc/sharc.h"
|
||||
#include "machine/k033906.h"
|
||||
#include "video/voodoo.h"
|
||||
#include "konppc.h"
|
||||
|
||||
@ -21,7 +22,6 @@ static UINT32 *dsp_shared_ram[MAX_CG_BOARDS];
|
||||
#define DSP_BANK_SIZE_WORD (DSP_BANK_SIZE / 4)
|
||||
|
||||
static UINT32 dsp_state[MAX_CG_BOARDS];
|
||||
static UINT32 pci_bridge_enable[MAX_CG_BOARDS];
|
||||
static UINT32 nwk_device_sel[MAX_CG_BOARDS];
|
||||
static const char *texture_bank[MAX_CG_BOARDS];
|
||||
|
||||
@ -53,7 +53,6 @@ void init_konami_cgboard(running_machine *machine, int num_boards, int type)
|
||||
dsp_state[i] = 0x80;
|
||||
texture_bank[i] = NULL;
|
||||
|
||||
pci_bridge_enable[i] = 0;
|
||||
nwk_device_sel[i] = 0;
|
||||
nwk_fifo_read_ptr[i] = 0;
|
||||
nwk_fifo_write_ptr[i] = 0;
|
||||
@ -66,7 +65,6 @@ void init_konami_cgboard(running_machine *machine, int num_boards, int type)
|
||||
state_save_register_item(machine, "konppc", NULL, i, dsp_shared_ram_bank[i]);
|
||||
state_save_register_item_pointer(machine, "konppc", NULL, i, dsp_shared_ram[i], DSP_BANK_SIZE * 2 / sizeof(dsp_shared_ram[i][0]));
|
||||
state_save_register_item(machine, "konppc", NULL, i, dsp_state[i]);
|
||||
state_save_register_item(machine, "konppc", NULL, i, pci_bridge_enable[i]);
|
||||
state_save_register_item(machine, "konppc", NULL, i, nwk_device_sel[i]);
|
||||
state_save_register_item(machine, "konppc", NULL, i, nwk_fifo_read_ptr[i]);
|
||||
state_save_register_item(machine, "konppc", NULL, i, nwk_fifo_write_ptr[i]);
|
||||
@ -143,6 +141,9 @@ READ32_HANDLER( cgboard_dsp_comm_r_ppc )
|
||||
WRITE32_HANDLER( cgboard_dsp_comm_w_ppc )
|
||||
{
|
||||
const char *dsptag = (cgboard_id == 0) ? "dsp" : "dsp2";
|
||||
const char *pcitag = (cgboard_id == 0) ? "k033906_1" : "k033906_2";
|
||||
const device_config *dsp = devtag_get_device(space->machine, dsptag);
|
||||
const device_config *k033906 = devtag_get_device(space->machine, pcitag);
|
||||
// mame_printf_debug("dsp_cmd_w: (board %d) %08X, %08X, %08X at %08X\n", cgboard_id, data, offset, mem_mask, cpu_get_pc(space->cpu));
|
||||
|
||||
if (cgboard_id < MAX_CG_BOARDS)
|
||||
@ -156,18 +157,19 @@ WRITE32_HANDLER( cgboard_dsp_comm_w_ppc )
|
||||
if (data & 0x80000000)
|
||||
dsp_state[cgboard_id] |= 0x10;
|
||||
|
||||
pci_bridge_enable[cgboard_id] = (data & 0x20000000) ? 1 : 0;
|
||||
if (k033906 != NULL) /* zr107.c has no PCI and some games only have one PCI Bridge */
|
||||
k033906_set_reg(k033906, (data & 0x20000000) ? 1 : 0);
|
||||
|
||||
if (data & 0x10000000)
|
||||
cputag_set_input_line(space->machine, dsptag, INPUT_LINE_RESET, CLEAR_LINE);
|
||||
cpu_set_input_line(dsp, INPUT_LINE_RESET, CLEAR_LINE);
|
||||
else
|
||||
cputag_set_input_line(space->machine, dsptag, INPUT_LINE_RESET, ASSERT_LINE);
|
||||
cpu_set_input_line(dsp, INPUT_LINE_RESET, ASSERT_LINE);
|
||||
|
||||
if (data & 0x02000000)
|
||||
cputag_set_input_line(space->machine, dsptag, INPUT_LINE_IRQ0, ASSERT_LINE);
|
||||
cpu_set_input_line(dsp, INPUT_LINE_IRQ0, ASSERT_LINE);
|
||||
|
||||
if (data & 0x04000000)
|
||||
cputag_set_input_line(space->machine, dsptag, INPUT_LINE_IRQ1, ASSERT_LINE);
|
||||
cpu_set_input_line(dsp, INPUT_LINE_IRQ1, ASSERT_LINE);
|
||||
}
|
||||
|
||||
if (ACCESSING_BITS_0_7)
|
||||
@ -403,148 +405,36 @@ static void nwk_fifo_w(running_machine *machine, int board, UINT32 data)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Konami K033906 PCI bridge */
|
||||
/* Konami K033906 PCI bridge (most emulation is now in src/emu/machine/k033906.c ) */
|
||||
|
||||
#define MAX_K033906_CHIPS 2
|
||||
|
||||
static UINT32 *K033906_reg[MAX_K033906_CHIPS];
|
||||
static UINT32 *K033906_ram[MAX_K033906_CHIPS];
|
||||
|
||||
void K033906_init(running_machine *machine)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i < MAX_K033906_CHIPS; i++)
|
||||
{
|
||||
K033906_reg[i] = auto_alloc_array(machine, UINT32, 256);
|
||||
K033906_ram[i] = auto_alloc_array(machine, UINT32, 32768);
|
||||
state_save_register_item_pointer(machine, "K033906", NULL, i, K033906_reg[i], 256);
|
||||
state_save_register_item_pointer(machine, "K033906", NULL, i, K033906_ram[i], 32768);
|
||||
}
|
||||
}
|
||||
|
||||
static UINT32 K033906_r(const address_space *space, int chip, int reg)
|
||||
{
|
||||
switch(reg)
|
||||
{
|
||||
case 0x00: return 0x0001121a; // PCI Vendor ID (0x121a = 3dfx), Device ID (0x0001 = Voodoo)
|
||||
case 0x02: return 0x04000000; // Revision ID
|
||||
case 0x04: return K033906_reg[chip][0x04]; // memBaseAddr
|
||||
case 0x0f: return K033906_reg[chip][0x0f]; // interrupt_line, interrupt_pin, min_gnt, max_lat
|
||||
|
||||
default:
|
||||
fatalerror("%s:K033906_r: %d, %08X", cpuexec_describe_context(space->machine), chip, reg);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void K033906_w(const address_space *space, int chip, int reg, UINT32 data)
|
||||
{
|
||||
switch(reg)
|
||||
{
|
||||
case 0x00:
|
||||
break;
|
||||
|
||||
case 0x01: // command register
|
||||
break;
|
||||
|
||||
case 0x04: // memBaseAddr
|
||||
{
|
||||
if (data == 0xffffffff)
|
||||
{
|
||||
K033906_reg[chip][0x04] = 0xff000000;
|
||||
}
|
||||
else
|
||||
{
|
||||
K033906_reg[chip][0x04] = data & 0xff000000;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x0f: // interrupt_line, interrupt_pin, min_gnt, max_lat
|
||||
{
|
||||
K033906_reg[chip][0x0f] = data;
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x10: // initEnable
|
||||
{
|
||||
const device_config *device = device_list_find_by_index(&space->machine->config->devicelist, VOODOO_GRAPHICS, chip);
|
||||
voodoo_set_init_enable(device, data);
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x11: // busSnoop0
|
||||
case 0x12: // busSnoop1
|
||||
break;
|
||||
|
||||
case 0x38: // ???
|
||||
break;
|
||||
|
||||
default:
|
||||
fatalerror("%s:K033906_w: %d, %08X, %08X", cpuexec_describe_context(space->machine), chip, data, reg);
|
||||
}
|
||||
}
|
||||
|
||||
READ32_HANDLER(K033906_0_r)
|
||||
READ32_HANDLER( K033906_0_r )
|
||||
{
|
||||
const device_config *k033906_1 = devtag_get_device(space->machine, "k033906_1");
|
||||
if (nwk_device_sel[0] & 0x01)
|
||||
{
|
||||
return nwk_fifo_r(space, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pci_bridge_enable[0])
|
||||
{
|
||||
return K033906_r(space, 0, offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
return K033906_ram[0][offset];
|
||||
}
|
||||
}
|
||||
return k033906_r(k033906_1, offset, mem_mask);
|
||||
}
|
||||
|
||||
WRITE32_HANDLER(K033906_0_w)
|
||||
WRITE32_HANDLER( K033906_0_w )
|
||||
{
|
||||
if (pci_bridge_enable[0])
|
||||
{
|
||||
K033906_w(space, 0, offset, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
K033906_ram[0][offset] = data;
|
||||
}
|
||||
const device_config *k033906_1 = devtag_get_device(space->machine, "k033906_1");
|
||||
k033906_w(k033906_1, offset, data, mem_mask);
|
||||
}
|
||||
|
||||
READ32_HANDLER(K033906_1_r)
|
||||
READ32_HANDLER( K033906_1_r )
|
||||
{
|
||||
const device_config *k033906_2 = devtag_get_device(space->machine, "k033906_2");
|
||||
if (nwk_device_sel[1] & 0x01)
|
||||
{
|
||||
return nwk_fifo_r(space, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pci_bridge_enable[1])
|
||||
{
|
||||
return K033906_r(space, 1, offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
return K033906_ram[1][offset];
|
||||
}
|
||||
}
|
||||
return k033906_r(k033906_2, offset, mem_mask);
|
||||
}
|
||||
|
||||
WRITE32_HANDLER(K033906_1_w)
|
||||
{
|
||||
if (pci_bridge_enable[1])
|
||||
{
|
||||
K033906_w(space, 1, offset, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
K033906_ram[1][offset] = data;
|
||||
}
|
||||
const device_config *k033906_2 = devtag_get_device(space->machine, "k033906_2");
|
||||
k033906_w(k033906_2, offset, data, mem_mask);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -26,7 +26,6 @@ WRITE32_HANDLER( cgboard_1_comm_sharc_w );
|
||||
READ32_HANDLER( cgboard_1_shared_sharc_r );
|
||||
WRITE32_HANDLER( cgboard_1_shared_sharc_w );
|
||||
|
||||
void K033906_init(running_machine *machine);
|
||||
READ32_HANDLER(K033906_0_r);
|
||||
WRITE32_HANDLER(K033906_0_w);
|
||||
READ32_HANDLER(K033906_1_r);
|
||||
|
Loading…
Reference in New Issue
Block a user