diff --git a/src/emu/cpu/powerpc/ppc.h b/src/emu/cpu/powerpc/ppc.h index ddf1deede92..7140b9c6b42 100644 --- a/src/emu/cpu/powerpc/ppc.h +++ b/src/emu/cpu/powerpc/ppc.h @@ -155,6 +155,7 @@ struct _powerpc_config write32_device_func dcr_write_func; }; +typedef void (*ppc_dcstore_handler)(device_t *device, UINT32 address); /*************************************************************************** @@ -168,6 +169,8 @@ void ppcdrc_add_hotspot(device_t *device, offs_t pc, UINT32 opcode, UINT32 cycle void ppc4xx_spu_set_tx_handler(device_t *device, ppc4xx_spu_tx_handler handler); void ppc4xx_spu_receive_byte(device_t *device, UINT8 byteval); +void ppc_set_dcstore_callback(device_t *device, ppc_dcstore_handler handler); + DECLARE_LEGACY_CPU_DEVICE(PPC403GA, ppc403ga); DECLARE_LEGACY_CPU_DEVICE(PPC403GCX, ppc403gcx); diff --git a/src/emu/cpu/powerpc/ppccom.c b/src/emu/cpu/powerpc/ppccom.c index fdc49bc567e..e37b5b653e8 100644 --- a/src/emu/cpu/powerpc/ppccom.c +++ b/src/emu/cpu/powerpc/ppccom.c @@ -454,6 +454,19 @@ offs_t ppccom_dasm(powerpc_state *ppc, char *buffer, offs_t pc, const UINT8 *opr } +/*------------------------------------------------- + ppccom_dcstore_callback - call the dcstore + callback if installed +-------------------------------------------------*/ + +void ppccom_dcstore_callback(powerpc_state *ppc) +{ + if (ppc->dcstore_handler != NULL) + { + ppc->dcstore_handler(ppc->device, ppc->param0); + } +} + /*************************************************************************** TLB HANDLING @@ -1607,6 +1620,16 @@ static TIMER_CALLBACK( decrementer_int_callback ) ppc->decrementer_int_timer->adjust(ppc->device->cycles_to_attotime(cycles_until_next)); } +/*------------------------------------------------- + ppc_set_dcstore_callback - installs a callback + for detecting datacache stores with dcbst +-------------------------------------------------*/ + +void ppc_set_dcstore_callback(device_t *device, ppc_dcstore_handler handler) +{ + powerpc_state *ppc = *(powerpc_state **)downcast(device)->token(); + ppc->dcstore_handler = handler; +} /*************************************************************************** diff --git a/src/emu/cpu/powerpc/ppccom.h b/src/emu/cpu/powerpc/ppccom.h index 3e70d536eab..0f18daa7247 100644 --- a/src/emu/cpu/powerpc/ppccom.h +++ b/src/emu/cpu/powerpc/ppccom.h @@ -568,6 +568,8 @@ struct _powerpc_state read32_device_func dcr_read_func; write32_device_func dcr_write_func; + + ppc_dcstore_handler dcstore_handler; }; @@ -601,6 +603,8 @@ void ppccom_execute_mtdcr(powerpc_state *ppc); void ppccom_update_fprf(powerpc_state *ppc); +void ppccom_dcstore_callback(powerpc_state *ppc); + void ppc4xx_set_info(powerpc_state *ppc, UINT32 state, cpuinfo *info); void ppc4xx_get_info(powerpc_state *ppc, UINT32 state, cpuinfo *info); diff --git a/src/emu/cpu/powerpc/ppcdrc.c b/src/emu/cpu/powerpc/ppcdrc.c index 9fc02ef1cb8..c3414f1b8a7 100644 --- a/src/emu/cpu/powerpc/ppcdrc.c +++ b/src/emu/cpu/powerpc/ppcdrc.c @@ -3617,6 +3617,11 @@ static int generate_instruction_1f(powerpc_state *ppc, drcuml_block *block, comp return FALSE; case 0x036: /* DCBST */ + UML_ADD(block, I0, R32Z(G_RA(op)), R32(G_RB(op))); // add i0,ra,rb + UML_MOV(block, mem(&ppc->param0), I0); // mov [param0],i0 + UML_CALLC(block, (c_function)ppccom_dcstore_callback, ppc); + return TRUE; + case 0x056: /* DCBF */ case 0x0f6: /* DCBTST */ case 0x116: /* DCBT */