diff --git a/src/emu/cpu/powerpc/ppc.c b/src/emu/cpu/powerpc/ppc.c index 390470760c4..9638e2c9527 100644 --- a/src/emu/cpu/powerpc/ppc.c +++ b/src/emu/cpu/powerpc/ppc.c @@ -973,6 +973,52 @@ static CPU_EXIT( ppc403 ) } +static CPU_INIT( ppc405 ) +{ + const ppc_config *configdata = device->static_config(); + + ppc_init(); + + /* PPC403 specific opcodes */ + ppc.optable31[454] = ppc_dccci; + ppc.optable31[486] = ppc_dcread; + ppc.optable31[262] = ppc_icbt; + ppc.optable31[966] = ppc_iccci; + ppc.optable31[998] = ppc_icread; + ppc.optable31[323] = ppc_mfdcr; + ppc.optable31[451] = ppc_mtdcr; + ppc.optable31[131] = ppc_wrtee; + ppc.optable31[163] = ppc_wrteei; + + // !!! why is rfci here !!! + ppc.optable19[51] = ppc_rfci; + + ppc.spu.rx_timer = device->machine().scheduler().timer_alloc(FUNC(ppc403_spu_rx_callback)); + ppc.spu.tx_timer = device->machine().scheduler().timer_alloc(FUNC(ppc403_spu_tx_callback)); + + ppc.read8 = ppc403_read8; + ppc.read16 = ppc403_read16; + ppc.read32 = ppc403_read32; + ppc.write8 = ppc403_write8; + ppc.write16 = ppc403_write16; + ppc.write32 = ppc403_write32; + ppc.read16_unaligned = ppc403_read16_unaligned; + ppc.read32_unaligned = ppc403_read32_unaligned; + ppc.write16_unaligned = ppc403_write16_unaligned; + ppc.write32_unaligned = ppc403_write32_unaligned; + + ppc.irq_callback = irqcallback; + ppc.device = device; + ppc.program = device->space(AS_PROGRAM); + + ppc.pvr = configdata->pvr; +} + +static CPU_EXIT( ppc405 ) +{ + +} + static CPU_INIT( ppc603 ) { const ppc_config *configdata = device->static_config(); @@ -1893,6 +1939,32 @@ CPU_GET_INFO( ppc403 ) } } +CPU_GET_INFO( ppc405 ) +{ + switch(state) + { + /* --- the following bits of info are returned as 64-bit signed integers --- */ + case CPUINFO_INT_INPUT_LINES: info->i = 8; break; + case DEVINFO_INT_ENDIANNESS: info->i = ENDIANNESS_BIG; break; + case CPUINFO_INT_REGISTER + PPC_EXIER: info->i = EXIER; break; + case CPUINFO_INT_REGISTER + PPC_EXISR: info->i = EXISR; break; + + /* --- the following bits of info are returned as pointers to data or functions --- */ + case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(ppc403); break; + case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(ppc403); break; + case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(ppc403); break; + case CPUINFO_FCT_EXIT: info->exit = CPU_EXIT_NAME(ppc403); break; + case CPUINFO_FCT_EXECUTE: info->execute = CPU_EXECUTE_NAME(ppc403); break; + + /* --- the following bits of info are returned as NULL-terminated strings --- */ + case DEVINFO_STR_NAME: strcpy(info->s, "PPC403"); break; + case CPUINFO_STR_REGISTER + PPC_EXIER: sprintf(info->s, "EXIER: %08X", EXIER); break; + case CPUINFO_STR_REGISTER + PPC_EXISR: sprintf(info->s, "EXISR: %08X", EXISR); break; + + default: CPU_GET_INFO_CALL(ppc); break; + } +} + CPU_GET_INFO( ppc603 ) { switch(state) @@ -2098,6 +2170,8 @@ CPU_GET_INFO( ppc604 ) DEFINE_LEGACY_CPU_DEVICE(PPC403GA, ppc403ga); DEFINE_LEGACY_CPU_DEVICE(PPC403GCX, ppc403gcx); +DEFINE_LEGACY_CPU_DEVICE(PPC405GP, ppc405gp); + DEFINE_LEGACY_CPU_DEVICE(PPC601, ppc601); DEFINE_LEGACY_CPU_DEVICE(PPC602, ppc602); DEFINE_LEGACY_CPU_DEVICE(PPC603, ppc603); diff --git a/src/emu/cpu/powerpc/ppc.h b/src/emu/cpu/powerpc/ppc.h index 478c5a5e8c5..f8078b928a5 100644 --- a/src/emu/cpu/powerpc/ppc.h +++ b/src/emu/cpu/powerpc/ppc.h @@ -151,6 +151,8 @@ typedef struct _powerpc_config powerpc_config; struct _powerpc_config { UINT32 bus_frequency; + read32_device_func dcr_read_func; + write32_device_func dcr_write_func; }; @@ -170,6 +172,8 @@ void ppc4xx_spu_receive_byte(device_t *device, UINT8 byteval); DECLARE_LEGACY_CPU_DEVICE(PPC403GA, ppc403ga); DECLARE_LEGACY_CPU_DEVICE(PPC403GCX, ppc403gcx); +DECLARE_LEGACY_CPU_DEVICE(PPC405GP, ppc405gp); + DECLARE_LEGACY_CPU_DEVICE(PPC601, ppc601); DECLARE_LEGACY_CPU_DEVICE(PPC602, ppc602); DECLARE_LEGACY_CPU_DEVICE(PPC603, ppc603); diff --git a/src/emu/cpu/powerpc/ppccom.c b/src/emu/cpu/powerpc/ppccom.c index 35f42dcd9a7..d51e661de55 100644 --- a/src/emu/cpu/powerpc/ppccom.c +++ b/src/emu/cpu/powerpc/ppccom.c @@ -318,6 +318,9 @@ void ppccom_init(powerpc_state *ppc, powerpc_flavor flavor, UINT8 cap, int tb_di ppc->program = device->space(AS_PROGRAM); ppc->direct = &ppc->program->direct(); ppc->system_clock = (config != NULL) ? config->bus_frequency : device->clock(); + ppc->dcr_read_func = (config != NULL) ? config->dcr_read_func : NULL; + ppc->dcr_write_func = (config != NULL) ? config->dcr_write_func : NULL; + ppc->tb_divisor = (ppc->tb_divisor * device->clock() + ppc->system_clock / 2 - 1) / ppc->system_clock; ppc->codexor = 0; if (!(cap & PPCCAP_4XX) && device->space_config()->m_endianness != ENDIANNESS_NATIVE) @@ -1085,10 +1088,14 @@ void ppccom_execute_mfdcr(powerpc_state *ppc) /* default handling */ mame_printf_debug("DCR %03X read\n", ppc->param0); - if (ppc->param0 < ARRAY_LENGTH(ppc->dcr)) - ppc->param1 = ppc->dcr[ppc->param0]; - else - ppc->param1 = 0; + if (!ppc->dcr_read_func) { + if (ppc->param0 < ARRAY_LENGTH(ppc->dcr)) + ppc->param1 = ppc->dcr[ppc->param0]; + else + ppc->param1 = 0; + } else { + ppc->param1 = ppc->dcr_read_func(ppc->device,ppc->param0,0xffffffff); + } } @@ -1173,8 +1180,12 @@ void ppccom_execute_mtdcr(powerpc_state *ppc) /* default handling */ mame_printf_debug("DCR %03X write = %08X\n", ppc->param0, ppc->param1); - if (ppc->param0 < ARRAY_LENGTH(ppc->dcr)) - ppc->dcr[ppc->param0] = ppc->param1; + if (!ppc->dcr_write_func) { + if (ppc->param0 < ARRAY_LENGTH(ppc->dcr)) + ppc->dcr[ppc->param0] = ppc->param1; + } else { + ppc->dcr_write_func(ppc->device,ppc->param0,ppc->param1,0xffffffff); + } } diff --git a/src/emu/cpu/powerpc/ppccom.h b/src/emu/cpu/powerpc/ppccom.h index a866db66b07..af4366d0b9a 100644 --- a/src/emu/cpu/powerpc/ppccom.h +++ b/src/emu/cpu/powerpc/ppccom.h @@ -565,6 +565,9 @@ struct _powerpc_state /* for use by specific implementations */ ppcimp_state * impstate; + + read32_device_func dcr_read_func; + write32_device_func dcr_write_func; }; diff --git a/src/emu/cpu/powerpc/ppcdrc.c b/src/emu/cpu/powerpc/ppcdrc.c index c82efcd0d1c..91297ecc6f1 100644 --- a/src/emu/cpu/powerpc/ppcdrc.c +++ b/src/emu/cpu/powerpc/ppcdrc.c @@ -441,6 +441,7 @@ INLINE powerpc_state *get_safe_token(device_t *device) assert(device != NULL); assert(device->type() == PPC403GA || device->type() == PPC403GCX || + device->type() == PPC405GP || device->type() == PPC601 || device->type() == PPC602 || device->type() == PPC603 || @@ -4428,6 +4429,41 @@ CPU_GET_INFO( ppc403gcx ) +/*------------------------------------------------- + ppc403gcx_init - PowerPC 403GCX-specific + initialization +-------------------------------------------------*/ + +static CPU_INIT( ppc405gp ) +{ + ppcdrc_init(PPC_MODEL_405GP, PPCCAP_4XX | PPCCAP_VEA, 1, device, irqcallback); +} + + +/*------------------------------------------------- + ppc403gcx_get_info - PowerPC 403GCX-specific + information getter +-------------------------------------------------*/ + +CPU_GET_INFO( ppc405gp ) +{ + switch (state) + { + /* --- the following bits of info are returned as 64-bit signed integers --- */ + + /* --- the following bits of info are returned as pointers to data or functions --- */ + case CPUINFO_FCT_INIT: info->init = CPU_INIT_NAME(ppc405gp); break; + case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(ppcdrc4xx); break; + + /* --- the following bits of info are returned as NULL-terminated strings --- */ + case DEVINFO_STR_NAME: strcpy(info->s, "PowerPC 405GP"); break; + + /* --- everything else is handled generically --- */ + default: CPU_GET_INFO_CALL(ppcdrc4xx); break; + } +} + + /*************************************************************************** PPC 6XX VARIANTS ***************************************************************************/ @@ -4677,6 +4713,8 @@ CPU_GET_INFO( mpc8240 ) DEFINE_LEGACY_CPU_DEVICE(PPC403GA, ppc403ga); DEFINE_LEGACY_CPU_DEVICE(PPC403GCX, ppc403gcx); +DEFINE_LEGACY_CPU_DEVICE(PPC405GP, ppc405gp); + DEFINE_LEGACY_CPU_DEVICE(PPC601, ppc601); DEFINE_LEGACY_CPU_DEVICE(PPC602, ppc602); DEFINE_LEGACY_CPU_DEVICE(PPC603, ppc603); diff --git a/src/mame/drivers/konamim2.c b/src/mame/drivers/konamim2.c index 26415a0b1bb..db5005d7561 100644 --- a/src/mame/drivers/konamim2.c +++ b/src/mame/drivers/konamim2.c @@ -1145,7 +1145,9 @@ INPUT_PORTS_END static const powerpc_config ppc602_config = { - 33000000 /* Multiplier 2, Bus = 33MHz, Core = 66MHz */ + 33000000, /* Multiplier 2, Bus = 33MHz, Core = 66MHz */ + NULL, + NULL }; static INTERRUPT_GEN(m2) diff --git a/src/mame/drivers/konendev.c b/src/mame/drivers/konendev.c index c437f5f2c7d..9aff3d9a2e4 100644 --- a/src/mame/drivers/konendev.c +++ b/src/mame/drivers/konendev.c @@ -41,7 +41,9 @@ INPUT_PORTS_END static const powerpc_config ppc603e_config = { - XTAL_66_6667MHz /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ + XTAL_66_6667MHz, /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ + NULL, + NULL }; diff --git a/src/mame/drivers/model3.c b/src/mame/drivers/model3.c index 128c302b6e7..1ae677d813a 100644 --- a/src/mame/drivers/model3.c +++ b/src/mame/drivers/model3.c @@ -5123,19 +5123,25 @@ static TIMER_DEVICE_CALLBACK(model3_interrupt) static const powerpc_config model3_10 = { /* 603e, Stretch, 1.3 */ - 66000000 /* Multiplier 1, Bus = 66MHz, Core = 66MHz */ + 66000000, /* Multiplier 1, Bus = 66MHz, Core = 66MHz */ + NULL, + NULL }; static const powerpc_config model3_15 = { /* 603e, Stretch, 1.3 */ - 66000000 /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ + 66000000, /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ + NULL, + NULL }; static const powerpc_config model3_2x = { /* 603e-PID7t, Goldeneye, 2.1 */ - 66000000 /* Multiplier 2.5, Bus = 66MHz, Core = 166MHz */ + 66000000, /* Multiplier 2.5, Bus = 66MHz, Core = 166MHz */ + NULL, + NULL }; static MACHINE_CONFIG_START( model3_10, model3_state ) diff --git a/src/mame/drivers/taitopjc.c b/src/mame/drivers/taitopjc.c index fe4b222a411..dea27bce238 100644 --- a/src/mame/drivers/taitopjc.c +++ b/src/mame/drivers/taitopjc.c @@ -398,7 +398,9 @@ INPUT_PORTS_END static const powerpc_config ppc603e_config = { - XTAL_66_6667MHz /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ + XTAL_66_6667MHz, /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ + NULL, + NULL }; static const tlcs900_interface taitopjc_tlcs900_interface = diff --git a/src/mame/drivers/taitotz.c b/src/mame/drivers/taitotz.c index bce6e9dec75..d19189eb593 100644 --- a/src/mame/drivers/taitotz.c +++ b/src/mame/drivers/taitotz.c @@ -401,7 +401,9 @@ static INTERRUPT_GEN( taitotz_vbi ) static const powerpc_config ppc603e_config = { - XTAL_66_6667MHz /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ + XTAL_66_6667MHz, /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ + NULL, + NULL }; static const tlcs900_interface taitotz_tlcs900_interface = diff --git a/src/mame/drivers/viper.c b/src/mame/drivers/viper.c index 1c41614c1c8..80f4e06876e 100644 --- a/src/mame/drivers/viper.c +++ b/src/mame/drivers/viper.c @@ -1899,7 +1899,9 @@ INPUT_PORTS_END static const powerpc_config viper_ppc_cfg = { - 100000000 + 100000000, + NULL, + NULL }; static INTERRUPT_GEN(viper_vblank)