ppc: converted remaining callbacks to delegates (nw)

This commit is contained in:
Osso 2014-10-25 08:31:27 +02:00
parent 48df1930c4
commit 841c2d7b13
5 changed files with 335 additions and 352 deletions

View File

@ -159,24 +159,12 @@ enum
#define PPCDRC_COMPATIBLE_OPTIONS (PPCDRC_STRICT_VERIFY | PPCDRC_FLUSH_PC | PPCDRC_ACCURATE_SINGLES)
#define PPCDRC_FASTEST_OPTIONS (0)
/***************************************************************************
STRUCTURES AND TYPEDEFS
***************************************************************************/
typedef void (*ppc4xx_spu_tx_handler)(device_t *device, UINT8 data);
typedef void (*ppc_dcstore_handler)(device_t *device, UINT32 address);
typedef UINT32 (*ppc4xx_dma_read_handler)(device_t *device, int width);
typedef void (*ppc4xx_dma_write_handler)(device_t *device, int width, UINT32 data);
/***************************************************************************
PUBLIC FUNCTIONS
***************************************************************************/
/***************************************************************************
PUBLIC FUNCTIONS
***************************************************************************/
#define MCFG_PPC_BUS_FREQUENCY(_frequency) \
ppc_device::set_bus_frequency(*device, _frequency);
@ -225,14 +213,14 @@ protected:
public:
// construction/destruction
ppc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, int address_bits, int data_bits, powerpc_flavor flavor, UINT32 cap, UINT32 tb_divisor, address_map_constructor internal_map);
static void set_bus_frequency(device_t &device, UINT32 bus_frequency) { downcast<ppc_device &>(device).c_bus_frequency = bus_frequency; }
void ppc_set_dcstore_callback(ppc_dcstore_handler handler);
void ppcdrc_set_options(UINT32 options);
void ppcdrc_add_fastram(offs_t start, offs_t end, UINT8 readonly, void *base);
void ppcdrc_add_hotspot(offs_t pc, UINT32 opcode, UINT32 cycles);
static void set_bus_frequency(device_t &device, UINT32 bus_frequency) { downcast<ppc_device &>(device).c_bus_frequency = bus_frequency; }
void ppc_set_dcstore_callback(write32_delegate callback);
void ppcdrc_set_options(UINT32 options);
void ppcdrc_add_fastram(offs_t start, offs_t end, UINT8 readonly, void *base);
void ppcdrc_add_hotspot(offs_t pc, UINT32 opcode, UINT32 cycles);
TIMER_CALLBACK_MEMBER(decrementer_int_callback);
TIMER_CALLBACK_MEMBER(ppc4xx_buffered_dma_callback);
@ -491,13 +479,13 @@ protected:
UINT8 regs[9];
UINT8 txbuf;
UINT8 rxbuf;
emu_timer * timer;
UINT8 rxbuffer[256];
UINT32 rxin, rxout;
ppc4xx_spu_tx_handler tx_handler;
};
ppc4xx_spu_state m_spu;
emu_timer * timer;
UINT8 rxbuffer[256];
UINT32 rxin, rxout;
write8_delegate tx_cb;
};
ppc4xx_spu_state m_spu;
emu_timer * m_fit_timer;
emu_timer * m_pit_timer;
emu_timer * m_wdog_timer;
@ -515,16 +503,16 @@ protected:
UINT64 m_dec_zero_cycles;
emu_timer * m_decrementer_int_timer;
read32_delegate m_dcr_read_func;
write32_delegate m_dcr_write_func;
ppc_dcstore_handler m_dcstore_handler;
ppc4xx_dma_read_handler m_ext_dma_read_handler[4];
ppc4xx_dma_write_handler m_ext_dma_write_handler[4];
/* PowerPC function pointers for memory accesses/exceptions */
jmp_buf m_exception_jmpbuf;
read32_delegate m_dcr_read_func;
write32_delegate m_dcr_write_func;
write32_delegate m_dcstore_cb;
read32_delegate m_ext_dma_read_cb[4];
write32_delegate m_ext_dma_write_cb[4];
/* PowerPC function pointers for memory accesses/exceptions */
jmp_buf m_exception_jmpbuf;
UINT8 (*m_ppcread8)(address_space &space, offs_t address);
UINT16 (*m_ppcread16)(address_space &space, offs_t address);
UINT32 (*m_ppcread32)(address_space &space, offs_t address);
@ -763,17 +751,17 @@ public:
class ppc4xx_device : public ppc_device
{
public:
ppc4xx_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, powerpc_flavor flavor, UINT32 cap, UINT32 tb_divisor);
void ppc4xx_spu_set_tx_handler(ppc4xx_spu_tx_handler handler);
void ppc4xx_spu_receive_byte(UINT8 byteval);
void ppc4xx_set_dma_read_handler(int channel, ppc4xx_dma_read_handler handler, int rate);
void ppc4xx_set_dma_write_handler(int channel, ppc4xx_dma_write_handler handler, int rate);
void ppc4xx_set_dcr_read_handler(read32_delegate dcr_read_func);
void ppc4xx_set_dcr_write_handler(write32_delegate dcr_write_func);
public:
ppc4xx_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, powerpc_flavor flavor, UINT32 cap, UINT32 tb_divisor);
void ppc4xx_spu_set_tx_handler(write8_delegate callback);
void ppc4xx_spu_receive_byte(UINT8 byteval);
void ppc4xx_set_dma_read_handler(int channel, read32_delegate callback, int rate);
void ppc4xx_set_dma_write_handler(int channel, write32_delegate callback, int rate);
void ppc4xx_set_dcr_read_handler(read32_delegate dcr_read_func);
void ppc4xx_set_dcr_write_handler(write32_delegate dcr_write_func);
DECLARE_READ8_MEMBER( ppc4xx_spu_r );
DECLARE_WRITE8_MEMBER( ppc4xx_spu_w );

View File

@ -214,22 +214,19 @@ ppc_device::ppc_device(const machine_config &mconfig, device_type type, const ch
, m_core(NULL)
, m_bus_freq_multiplier(1)
, m_vtlb(NULL)
, m_flavor(flavor)
, m_cap(cap)
, m_tb_divisor(tb_divisor)
, m_dcstore_handler(NULL)
, m_cache(CACHE_SIZE + sizeof(internal_ppc_state))
, m_drcuml(NULL)
, m_drcfe(NULL)
, m_flavor(flavor)
, m_cap(cap)
, m_tb_divisor(tb_divisor)
, m_cache(CACHE_SIZE + sizeof(internal_ppc_state))
, m_drcuml(NULL)
, m_drcfe(NULL)
, m_drcoptions(0)
{
m_program_config.m_logaddr_width = 32;
m_program_config.m_page_shift = POWERPC_MIN_PAGE_SHIFT;
memset(m_ext_dma_read_handler, 0, sizeof(m_ext_dma_read_handler));
memset(m_ext_dma_write_handler, 0, sizeof(m_ext_dma_write_handler));
}
//ppc403_device::ppc403_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
{
m_program_config.m_logaddr_width = 32;
m_program_config.m_page_shift = POWERPC_MIN_PAGE_SHIFT;
}
//ppc403_device::ppc403_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
// : ppc_device(mconfig, PPC403, "PPC403", tag, owner, clock, "ppc403", 32?, 64?)
//{
//}
@ -1241,15 +1238,15 @@ offs_t ppc_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *opro
ppccom_dcstore_callback - call the dcstore
callback if installed
-------------------------------------------------*/
void ppc_device::ppccom_dcstore_callback()
{
if (m_dcstore_handler != NULL)
{
m_dcstore_handler(this, m_core->param0);
}
}
void ppc_device::ppccom_dcstore_callback()
{
if (!m_dcstore_cb.isnull())
{
m_dcstore_cb(*m_program, m_core->param0, 0, 0xffffffff);
}
}
/***************************************************************************
TLB HANDLING
@ -2061,15 +2058,15 @@ TIMER_CALLBACK_MEMBER( ppc_device::decrementer_int_callback )
/*-------------------------------------------------
ppc_set_dcstore_callback - installs a callback
for detecting datacache stores with dcbst
-------------------------------------------------*/
void ppc_device::ppc_set_dcstore_callback(ppc_dcstore_handler handler)
{
m_dcstore_handler = handler;
}
for detecting datacache stores with dcbst
-------------------------------------------------*/
void ppc_device::ppc_set_dcstore_callback(write32_delegate callback)
{
m_dcstore_cb = callback;
}
void ppc_device::execute_set_input(int inputnum, int state)
{
switch (inputnum)
@ -2288,38 +2285,38 @@ TIMER_CALLBACK_MEMBER( ppc_device::ppc4xx_buffered_dma_callback )
{
/* byte transfer */
case 1:
do
{
UINT8 data = 0;
if (m_ext_dma_read_handler[dmachan] != NULL)
data = (*m_ext_dma_read_handler[dmachan])(this, 1);
m_program->write_byte(dmaregs[DCR4XX_DMADA0], data);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
do
{
UINT8 data = 0;
if (!m_ext_dma_read_cb[dmachan].isnull())
data = (m_ext_dma_read_cb[dmachan])(*m_program, 1, 0xffffffff);
m_program->write_byte(dmaregs[DCR4XX_DMADA0], data);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
break;
/* word transfer */
case 2:
do
{
UINT16 data = 0;
if (m_ext_dma_read_handler[dmachan] != NULL)
data = (*m_ext_dma_read_handler[dmachan])(this, 2);
m_program->write_word(dmaregs[DCR4XX_DMADA0], data);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
do
{
UINT16 data = 0;
if (!m_ext_dma_read_cb[dmachan].isnull())
data = (m_ext_dma_read_cb[dmachan])(*m_program, 2, 0xffffffff);
m_program->write_word(dmaregs[DCR4XX_DMADA0], data);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
break;
/* dword transfer */
case 4:
do
{
UINT32 data = 0;
if (m_ext_dma_read_handler[dmachan] != NULL)
data = (*m_ext_dma_read_handler[dmachan])(this, 4);
m_program->write_dword(dmaregs[DCR4XX_DMADA0], data);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
do
{
UINT32 data = 0;
if (!m_ext_dma_read_cb[dmachan].isnull())
data = (m_ext_dma_read_cb[dmachan])(*m_program, 4, 0xffffffff);
m_program->write_dword(dmaregs[DCR4XX_DMADA0], data);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
break;
}
}
@ -2332,36 +2329,36 @@ TIMER_CALLBACK_MEMBER( ppc_device::ppc4xx_buffered_dma_callback )
{
/* byte transfer */
case 1:
do
{
UINT8 data = m_program->read_byte(dmaregs[DCR4XX_DMADA0]);
if (m_ext_dma_write_handler[dmachan] != NULL)
(*m_ext_dma_write_handler[dmachan])(this, 1, data);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
break;
do
{
UINT8 data = m_program->read_byte(dmaregs[DCR4XX_DMADA0]);
if (!m_ext_dma_write_cb[dmachan].isnull())
(m_ext_dma_write_cb[dmachan])(*m_program, 1, data, 0xffffffff);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
break;
/* word transfer */
case 2:
do
{
UINT16 data = m_program->read_word(dmaregs[DCR4XX_DMADA0]);
if (m_ext_dma_write_handler[dmachan] != NULL)
(*m_ext_dma_write_handler[dmachan])(this, 2, data);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
break;
do
{
UINT16 data = m_program->read_word(dmaregs[DCR4XX_DMADA0]);
if (!m_ext_dma_write_cb[dmachan].isnull())
(m_ext_dma_write_cb[dmachan])(*m_program, 2, data, 0xffffffff);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
break;
/* dword transfer */
case 4:
do
{
UINT32 data = m_program->read_dword(dmaregs[DCR4XX_DMADA0]);
if (m_ext_dma_write_handler[dmachan] != NULL)
(*m_ext_dma_write_handler[dmachan])(this, 4, data);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
break;
do
{
UINT32 data = m_program->read_dword(dmaregs[DCR4XX_DMADA0]);
if (!m_ext_dma_write_cb[dmachan].isnull())
(m_ext_dma_write_cb[dmachan])(*m_program, 4, data, 0xffffffff);
dmaregs[DCR4XX_DMADA0] += destinc;
} while (!ppc4xx_dma_decrement_count(dmachan));
break;
}
}
}
@ -2677,14 +2674,14 @@ TIMER_CALLBACK_MEMBER( ppc_device::ppc4xx_spu_callback )
int operation = (m_spu.regs[SPU4XX_TX_COMMAND] >> 5) & 3;
/* if we have data to transmit, do it now */
if (!(m_spu.regs[SPU4XX_LINE_STATUS] & 0x04))
{
/* if we have a transmit handler, send it that way */
if (m_spu.tx_handler != NULL)
(*m_spu.tx_handler)(this, m_spu.txbuf);
/* indicate that we have moved it to the shift register */
m_spu.regs[SPU4XX_LINE_STATUS] |= 0x04;
if (!(m_spu.regs[SPU4XX_LINE_STATUS] & 0x04))
{
/* if we have a transmit handler, send it that way */
if (!m_spu.tx_cb.isnull())
(m_spu.tx_cb)(*m_program, 0, m_spu.txbuf, 0xff);
/* indicate that we have moved it to the shift register */
m_spu.regs[SPU4XX_LINE_STATUS] |= 0x04;
m_spu.regs[SPU4XX_LINE_STATUS] &= ~0x02;
}
@ -2823,15 +2820,15 @@ WRITE8_MEMBER( ppc4xx_device::ppc4xx_spu_w )
/*-------------------------------------------------
ppc4xx_spu_set_tx_handler - PowerPC 4XX-
specific TX handler configuration
-------------------------------------------------*/
void ppc4xx_device::ppc4xx_spu_set_tx_handler(ppc4xx_spu_tx_handler handler)
{
m_spu.tx_handler = handler;
}
specific TX handler configuration
-------------------------------------------------*/
void ppc4xx_device::ppc4xx_spu_set_tx_handler(write8_delegate callback)
{
m_spu.tx_cb = callback;
}
/*-------------------------------------------------
ppc4xx_spu_receive_byte - PowerPC 4XX-
specific serial byte receive
@ -2844,26 +2841,26 @@ void ppc4xx_device::ppc4xx_spu_receive_byte(UINT8 byteval)
/*-------------------------------------------------
ppc4xx_set_dma_read_handler - PowerPC 4XX-
specific external DMA read handler configuration
-------------------------------------------------*/
void ppc4xx_device::ppc4xx_set_dma_read_handler(int channel, ppc4xx_dma_read_handler handler, int rate)
{
m_ext_dma_read_handler[channel] = handler;
m_buffered_dma_rate[channel] = rate;
}
specific external DMA read handler configuration
-------------------------------------------------*/
void ppc4xx_device::ppc4xx_set_dma_read_handler(int channel, read32_delegate callback, int rate)
{
m_ext_dma_read_cb[channel] = callback;
m_buffered_dma_rate[channel] = rate;
}
/*-------------------------------------------------
ppc4xx_set_dma_write_handler - PowerPC 4XX-
specific external DMA write handler configuration
-------------------------------------------------*/
void ppc4xx_device::ppc4xx_set_dma_write_handler(int channel, ppc4xx_dma_write_handler handler, int rate)
{
m_ext_dma_write_handler[channel] = handler;
m_buffered_dma_rate[channel] = rate;
}
specific external DMA write handler configuration
-------------------------------------------------*/
void ppc4xx_device::ppc4xx_set_dma_write_handler(int channel, write32_delegate callback, int rate)
{
m_ext_dma_write_cb[channel] = callback;
m_buffered_dma_rate[channel] = rate;
}
/*-------------------------------------------------
ppc4xx_set_dcr_read_handler
-------------------------------------------------*/

View File

@ -630,13 +630,14 @@ public:
DECLARE_READ64_MEMBER(main_comram_r);
DECLARE_WRITE64_MEMBER(main_comram_w);
DECLARE_READ64_MEMBER(main_fifo_r);
DECLARE_WRITE64_MEMBER(main_fifo_w);
DECLARE_READ64_MEMBER(main_mpc106_r);
DECLARE_WRITE64_MEMBER(main_mpc106_w);
DECLARE_READ32_MEMBER(sub_comram_r);
DECLARE_WRITE32_MEMBER(sub_comram_w);
DECLARE_READ32_MEMBER(sub_sound_r);
DECLARE_WRITE64_MEMBER(main_fifo_w);
DECLARE_READ64_MEMBER(main_mpc106_r);
DECLARE_WRITE64_MEMBER(main_mpc106_w);
DECLARE_WRITE32_MEMBER(main_cpu_dc_store);
DECLARE_READ32_MEMBER(sub_comram_r);
DECLARE_WRITE32_MEMBER(sub_comram_w);
DECLARE_READ32_MEMBER(sub_sound_r);
DECLARE_WRITE32_MEMBER(sub_sound_w);
DECLARE_READ32_MEMBER(sub_unk7e_r);
DECLARE_WRITE32_MEMBER(sub_debug_w);
@ -650,21 +651,25 @@ public:
DECLARE_WRITE16_MEMBER(sub_ata0_w);
DECLARE_READ16_MEMBER(sub_ata1_r);
DECLARE_WRITE16_MEMBER(sub_ata1_w);
DECLARE_READ32_MEMBER(sub_psac2_r);
DECLARE_WRITE32_MEMBER(sub_psac2_w);
DECLARE_WRITE32_MEMBER(sub_psac_palette_w);
DECLARE_WRITE64_MEMBER(gfx_fifo0_w);
DECLARE_WRITE64_MEMBER(gfx_fifo1_w);
DECLARE_READ32_MEMBER(sub_psac2_r);
DECLARE_WRITE32_MEMBER(sub_psac2_w);
DECLARE_WRITE32_MEMBER(sub_psac_palette_w);
DECLARE_WRITE32_MEMBER(sub_sound_dma_w);
DECLARE_WRITE64_MEMBER(gfx_fifo0_w);
DECLARE_WRITE64_MEMBER(gfx_fifo1_w);
DECLARE_WRITE64_MEMBER(gfx_fifo2_w);
DECLARE_WRITE64_MEMBER(gfx_debug_state_w);
DECLARE_READ64_MEMBER(gfx_unk1_r);
DECLARE_WRITE64_MEMBER(gfx_unk1_w);
DECLARE_READ64_MEMBER(gfx_fifo_r);
DECLARE_WRITE64_MEMBER(gfx_buf_w);
DECLARE_WRITE_LINE_MEMBER(ide_interrupt);
DECLARE_WRITE64_MEMBER(gfx_unk1_w);
DECLARE_READ64_MEMBER(gfx_fifo_r);
DECLARE_WRITE64_MEMBER(gfx_buf_w);
DECLARE_WRITE32_MEMBER(gfx_cpu_dc_store);
DECLARE_WRITE8_MEMBER(sub_jvs_w);
DECLARE_WRITE_LINE_MEMBER(ide_interrupt);
cobra_renderer *m_renderer;
cobra_fifo *m_gfxfifo_in;
@ -1596,20 +1601,18 @@ WRITE64_MEMBER(cobra_state::main_comram_w)
UINT32 m2 = (UINT32)(mem_mask);
m_comram[page][(offset << 1) + 0] = (w1 & ~m1) | (d1 & m1);
m_comram[page][(offset << 1) + 1] = (w2 & ~m2) | (d2 & m2);
}
static void main_cpu_dc_store(device_t *device, UINT32 address)
{
cobra_state *cobra = device->machine().driver_data<cobra_state>();
if ((address & 0xf0000000) == 0xc0000000)
{
// force sync when writing to GFX board main ram
cobra->m_maincpu->spin_until_time(attotime::from_usec(80));
}
}
m_comram[page][(offset << 1) + 1] = (w2 & ~m2) | (d2 & m2);
}
WRITE32_MEMBER(cobra_state::main_cpu_dc_store)
{
if ((offset & 0xf0000000) == 0xc0000000)
{
// force sync when writing to GFX board main ram
m_maincpu->spin_until_time(attotime::from_usec(80));
}
}
static ADDRESS_MAP_START( cobra_main_map, AS_PROGRAM, 64, cobra_state )
AM_RANGE(0x00000000, 0x003fffff) AM_RAM
AM_RANGE(0x07c00000, 0x07ffffff) AM_RAM
@ -1885,49 +1888,46 @@ READ32_MEMBER(cobra_state::sub_psac2_r)
}
WRITE32_MEMBER(cobra_state::sub_psac2_w)
{
}
static void sub_sound_dma_w(device_t *device, int width, UINT32 data)
{
//printf("DMA write to unknown: size %d, data %08X\n", width, data);
/*
static FILE *out;
{
}
WRITE32_MEMBER(cobra_state::sub_sound_dma_w)
{
//printf("DMA write to unknown: size %d, data %08X\n", address, data);
/*
static FILE *out;
if (out == NULL)
out = fopen("sound.bin", "wb");
fputc((data >> 24) & 0xff, out);
fputc((data >> 16) & 0xff, out);
fputc((data >> 8) & 0xff, out);
fputc((data >> 0) & 0xff, out);
*/
cobra_state *cobra = device->machine().driver_data<cobra_state>();
INT16 ldata = (INT16)(data >> 16);
INT16 rdata = (INT16)(data);
cobra->m_sound_dma_buffer_l[cobra->m_sound_dma_ptr] = ldata;
cobra->m_sound_dma_buffer_r[cobra->m_sound_dma_ptr] = rdata;
cobra->m_sound_dma_ptr++;
if (cobra->m_sound_dma_ptr >= DMA_SOUND_BUFFER_SIZE)
{
cobra->m_sound_dma_ptr = 0;
dmadac_transfer(&cobra->m_dmadac[0], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, cobra->m_sound_dma_buffer_l);
dmadac_transfer(&cobra->m_dmadac[1], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, cobra->m_sound_dma_buffer_r);
}
}
static void sub_jvs_w(device_t *device, UINT8 data)
{
cobra_state *cobra = device->machine().driver_data<cobra_state>();
cobra_jvs_host *jvs = downcast<cobra_jvs_host *>(device->machine().device("cobra_jvs_host"));
#if LOG_JVS
printf("sub_jvs_w: %02X\n", data);
fputc((data >> 0) & 0xff, out);
*/
INT16 ldata = (INT16)(data >> 16);
INT16 rdata = (INT16)(data);
m_sound_dma_buffer_l[m_sound_dma_ptr] = ldata;
m_sound_dma_buffer_r[m_sound_dma_ptr] = rdata;
m_sound_dma_ptr++;
if (m_sound_dma_ptr >= DMA_SOUND_BUFFER_SIZE)
{
m_sound_dma_ptr = 0;
dmadac_transfer(&m_dmadac[0], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, m_sound_dma_buffer_l);
dmadac_transfer(&m_dmadac[1], 1, 0, 1, DMA_SOUND_BUFFER_SIZE, m_sound_dma_buffer_r);
}
}
WRITE8_MEMBER(cobra_state::sub_jvs_w)
{
cobra_jvs_host *jvs = machine().device<cobra_jvs_host>("cobra_jvs_host");
#if LOG_JVS
printf("sub_jvs_w: %02X\n", data);
#endif
const UINT8 *rec_data;
@ -1945,13 +1945,13 @@ static void sub_jvs_w(device_t *device, UINT8 data)
}
printf("\n");
#endif
for (int i=0; i < rec_size; i++)
{
cobra->m_subcpu->ppc4xx_spu_receive_byte(rec_data[i]);
}
}
}
for (int i=0; i < rec_size; i++)
{
m_subcpu->ppc4xx_spu_receive_byte(rec_data[i]);
}
}
}
static ADDRESS_MAP_START( cobra_sub_map, AS_PROGRAM, 32, cobra_state )
AM_RANGE(0x00000000, 0x003fffff) AM_MIRROR(0x80000000) AM_RAM // Main RAM
@ -2988,38 +2988,36 @@ WRITE64_MEMBER(cobra_state::gfx_buf_w)
// prc_read always expects a value...
m_gfxfifo_out->push(&space.device(), 0);
}
}
static void gfx_cpu_dc_store(device_t *device, UINT32 address)
{
cobra_state *cobra = device->machine().driver_data<cobra_state>();
UINT32 addr = address >> 24;
if (addr == 0x10 || addr == 0x18 || addr == 0x1e)
{
UINT64 i = (UINT64)(cobra->m_gfx_fifo_cache_addr) << 32;
cobra_fifo *fifo_in = cobra->m_gfxfifo_in;
UINT32 a = (address / 8) & 0xff;
fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+0] >> 32) | i);
fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+0] >> 0) | i);
fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+1] >> 32) | i);
fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+1] >> 0) | i);
fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+2] >> 32) | i);
fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+2] >> 0) | i);
fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+3] >> 32) | i);
fifo_in->push(device, (UINT32)(cobra->m_gfx_fifo_mem[a+3] >> 0) | i);
cobra->m_renderer->gfx_fifo_exec();
}
else
{
logerror("gfx: data cache store at %08X\n", address);
}
}
}
}
WRITE32_MEMBER(cobra_state::gfx_cpu_dc_store)
{
UINT32 addr = offset >> 24;
if (addr == 0x10 || addr == 0x18 || addr == 0x1e)
{
UINT64 i = (UINT64)(m_gfx_fifo_cache_addr) << 32;
cobra_fifo *fifo_in = m_gfxfifo_in;
UINT32 a = (offset / 8) & 0xff;
fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+0] >> 32) | i);
fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+0] >> 0) | i);
fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+1] >> 32) | i);
fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+1] >> 0) | i);
fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+2] >> 32) | i);
fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+2] >> 0) | i);
fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+3] >> 32) | i);
fifo_in->push(&space.device(), (UINT32)(m_gfx_fifo_mem[a+3] >> 0) | i);
m_renderer->gfx_fifo_exec();
}
else
{
logerror("gfx: data cache store at %08X\n", offset);
}
}
WRITE64_MEMBER(cobra_state::gfx_debug_state_w)
{
if (ACCESSING_BITS_40_47)
@ -3260,18 +3258,18 @@ DRIVER_INIT_MEMBER(cobra_state, cobra)
2048,
"S2MFIFO",
S2MFIFO_VERBOSE != 0,
cobra_fifo::event_delegate(FUNC(cobra_state::s2mfifo_event_callback), this))
);
m_maincpu->ppc_set_dcstore_callback(main_cpu_dc_store);
m_gfxcpu->ppc_set_dcstore_callback(gfx_cpu_dc_store);
m_subcpu->ppc4xx_set_dma_write_handler(0, sub_sound_dma_w, 44100);
m_subcpu->ppc4xx_spu_set_tx_handler(sub_jvs_w);
m_comram[0] = auto_alloc_array(machine(), UINT32, 0x40000/4);
cobra_fifo::event_delegate(FUNC(cobra_state::s2mfifo_event_callback), this))
);
m_maincpu->ppc_set_dcstore_callback(write32_delegate(FUNC(cobra_state::main_cpu_dc_store),this));
m_gfxcpu->ppc_set_dcstore_callback(write32_delegate(FUNC(cobra_state::gfx_cpu_dc_store), this));
m_subcpu->ppc4xx_set_dma_write_handler(0, write32_delegate(FUNC(cobra_state::sub_sound_dma_w), this), 44100);
m_subcpu->ppc4xx_spu_set_tx_handler(write8_delegate(FUNC(cobra_state::sub_jvs_w), this));
m_comram[0] = auto_alloc_array(machine(), UINT32, 0x40000/4);
m_comram[1] = auto_alloc_array(machine(), UINT32, 0x40000/4);
m_comram_page = 0;

View File

@ -256,12 +256,13 @@ public:
void gcu_exec_display_list(bitmap_ind16 &bitmap, const rectangle &cliprect, int chip, UINT32 address);
UINT32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int chip);
UINT32 GCU_r(int chip, UINT32 offset, UINT32 mem_mask);
void GCU_w(int chip, UINT32 offset, UINT32 data, UINT32 mem_mask);
void set_ibutton(UINT8 *data);
int ibutton_w(UINT8 data);
void init_lights(write32_delegate out1, write32_delegate out2, write32_delegate out3);
void init_firebeat();
void init_keyboard();
void GCU_w(int chip, UINT32 offset, UINT32 data, UINT32 mem_mask);
void set_ibutton(UINT8 *data);
int ibutton_w(UINT8 data);
DECLARE_WRITE8_MEMBER(security_w);
void init_lights(write32_delegate out1, write32_delegate out2, write32_delegate out3);
void init_firebeat();
void init_keyboard();
DECLARE_WRITE_LINE_MEMBER(sound_irq_callback);
DECLARE_WRITE_LINE_MEMBER(midi_uart_ch0_irq_callback);
DECLARE_WRITE_LINE_MEMBER(midi_uart_ch1_irq_callback);
@ -1946,18 +1947,17 @@ int firebeat_state::ibutton_w(UINT8 data)
}
}
return r;
}
static void security_w(device_t *device, UINT8 data)
{
firebeat_state *state = device->machine().driver_data<firebeat_state>();
int r = state->ibutton_w(data);
if (r >= 0)
state->m_maincpu->ppc4xx_spu_receive_byte(r);
}
/*****************************************************************************/
return r;
}
WRITE8_MEMBER(firebeat_state::security_w)
{
int r = ibutton_w(data);
if (r >= 0)
m_maincpu->ppc4xx_spu_receive_byte(r);
}
/*****************************************************************************/
void firebeat_state::init_lights(write32_delegate out1, write32_delegate out2, write32_delegate out3)
{
@ -1979,13 +1979,13 @@ void firebeat_state::init_firebeat()
m_extend_board_irq_enable = 0x3f;
m_extend_board_irq_active = 0x00;
m_cur_cab_data = cab_data;
m_maincpu->ppc4xx_spu_set_tx_handler(security_w);
set_ibutton(rom);
m_cur_cab_data = cab_data;
m_maincpu->ppc4xx_spu_set_tx_handler(write8_delegate(FUNC(firebeat_state::security_w), this));
set_ibutton(rom);
init_lights(write32_delegate(), write32_delegate(), write32_delegate());
}

View File

@ -402,12 +402,13 @@ public:
DECLARE_WRITE32_MEMBER(dsp_dataram1_w);
DECLARE_WRITE_LINE_MEMBER(voodoo_vblank_0);
DECLARE_WRITE_LINE_MEMBER(voodoo_vblank_1);
DECLARE_WRITE16_MEMBER(soundtimer_en_w);
DECLARE_WRITE16_MEMBER(soundtimer_count_w);
ADC12138_IPT_CONVERT_CB(adc12138_input_callback);
DECLARE_DRIVER_INIT(hornet);
DECLARE_DRIVER_INIT(hornet_2board);
DECLARE_WRITE16_MEMBER(soundtimer_en_w);
DECLARE_WRITE16_MEMBER(soundtimer_count_w);
ADC12138_IPT_CONVERT_CB(adc12138_input_callback);
DECLARE_WRITE8_MEMBER(jamma_jvs_w);
DECLARE_DRIVER_INIT(hornet);
DECLARE_DRIVER_INIT(hornet_2board);
virtual void machine_start();
virtual void machine_reset();
DECLARE_MACHINE_RESET(hornet_2board);
@ -1135,22 +1136,21 @@ static MACHINE_CONFIG_DERIVED( sscope2, hornet_2board_v2)
MCFG_EEPROM_SERIAL_93C46_ADD("lan_eeprom")
MACHINE_CONFIG_END
/*****************************************************************************/
static void jamma_jvs_w(device_t *device, UINT8 data)
{
hornet_state *state = device->machine().driver_data<hornet_state>();
if (state->m_jvs_sdata_ptr == 0 && data != 0xe0)
return;
state->m_jvs_sdata[state->m_jvs_sdata_ptr] = data;
state->m_jvs_sdata_ptr++;
if (state->m_jvs_sdata_ptr >= 3 && state->m_jvs_sdata_ptr >= 3 + state->m_jvs_sdata[2])
state->jamma_jvs_cmd_exec();
}
int hornet_state::jvs_encode_data(UINT8 *in, int length)
/*****************************************************************************/
WRITE8_MEMBER(hornet_state::jamma_jvs_w)
{
if (m_jvs_sdata_ptr == 0 && data != 0xe0)
return;
m_jvs_sdata[m_jvs_sdata_ptr] = data;
m_jvs_sdata_ptr++;
if (m_jvs_sdata_ptr >= 3 && m_jvs_sdata_ptr >= 3 + m_jvs_sdata[2])
jamma_jvs_cmd_exec();
}
int hornet_state::jvs_encode_data(UINT8 *in, int length)
{
int inptr = 0;
int sum = 0;
@ -1280,22 +1280,22 @@ void hornet_state::jamma_jvs_cmd_exec()
DRIVER_INIT_MEMBER(hornet_state,hornet)
{
m_konppc->set_cgboard_texture_bank(0, "bank5", memregion("user5")->base());
m_led_reg0 = m_led_reg1 = 0x7f;
m_maincpu->ppc4xx_spu_set_tx_handler(jamma_jvs_w);
}
DRIVER_INIT_MEMBER(hornet_state,hornet_2board)
m_konppc->set_cgboard_texture_bank(0, "bank5", memregion("user5")->base());
m_led_reg0 = m_led_reg1 = 0x7f;
m_maincpu->ppc4xx_spu_set_tx_handler(write8_delegate(FUNC(hornet_state::jamma_jvs_w), this));
}
DRIVER_INIT_MEMBER(hornet_state,hornet_2board)
{
m_konppc->set_cgboard_texture_bank(0, "bank5", memregion("user5")->base());
m_konppc->set_cgboard_texture_bank(1, "bank6", memregion("user5")->base());
m_led_reg0 = m_led_reg1 = 0x7f;
m_maincpu->ppc4xx_spu_set_tx_handler(jamma_jvs_w);
}
/*****************************************************************************/
m_konppc->set_cgboard_texture_bank(1, "bank6", memregion("user5")->base());
m_led_reg0 = m_led_reg1 = 0x7f;
m_maincpu->ppc4xx_spu_set_tx_handler(write8_delegate(FUNC(hornet_state::jamma_jvs_w), this));
}
/*****************************************************************************/
ROM_START(sscope)
ROM_REGION32_BE(0x400000, "user1", 0) /* PowerPC program */