From: notaz Date: Fri, 10 Dec 2010 15:57:35 +0000 (+0200) Subject: drc: hook even to detect irq unmasking X-Git-Tag: r1~37 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=commitdiff_plain;h=28bc5688589e5f2d6cfa86bb22441e763de468cd drc: hook even to detect irq unmasking --- diff --git a/libpcsxcore/new_dynarec/emu_if.c b/libpcsxcore/new_dynarec/emu_if.c index 3403d452..08d9f57a 100644 --- a/libpcsxcore/new_dynarec/emu_if.c +++ b/libpcsxcore/new_dynarec/emu_if.c @@ -14,16 +14,7 @@ #define evprintf(...) char invalid_code[0x100000]; -u32 event_cycles[6]; - -void MTC0_() -{ - extern void psxMTC0(); - - memprintf("ari64 MTC0 %08x\n", psxRegs.code); - psxMTC0(); - pending_exception = 1; /* FIXME? */ -} +u32 event_cycles[7]; static void schedule_timeslice(void) { @@ -54,7 +45,6 @@ static void schedule_timeslice(void) void gen_interupt() { - //evprintf("ari64_gen_interupt\n"); evprintf(" +ge %08x, %u->%u\n", psxRegs.pc, psxRegs.cycle, next_interupt); #ifdef DRC_DBG psxRegs.cycle += 2; @@ -70,6 +60,15 @@ void gen_interupt() pending_exception = 1; /* FIXME */ } +void MTC0_() +{ + extern void psxMTC0(); + + evprintf("ari64 MTC0 %08x %08x %u\n", psxRegs.code, psxRegs.pc, psxRegs.cycle); + psxMTC0(); + gen_interupt(); /* FIXME: checking pending irqs should be enough */ +} + void check_interupt() { printf("ari64_check_interupt\n"); @@ -82,37 +81,37 @@ void read_nomem_new() static void read_mem8() { - memprintf("ari64_read_mem8 %08x, PC~=%08x\n", address, psxRegs.pc); + memprintf("ari64_read_mem8 %08x @%08x %u\n", address, psxRegs.pc, psxRegs.cycle); readmem_word = psxMemRead8(address) & 0xff; } static void read_mem16() { - memprintf("ari64_read_mem16 %08x, PC~=%08x\n", address, psxRegs.pc); + memprintf("ari64_read_mem16 %08x @%08x %u\n", address, psxRegs.pc, psxRegs.cycle); readmem_word = psxMemRead16(address) & 0xffff; } static void read_mem32() { - memprintf("ari64_read_mem32 %08x, PC~=%08x\n", address, psxRegs.pc); + memprintf("ari64_read_mem32 %08x @%08x %u\n", address, psxRegs.pc, psxRegs.cycle); readmem_word = psxMemRead32(address); } static void write_mem8() { - memprintf("ari64_write_mem8 %08x, %02x, PC~=%08x\n", address, byte, psxRegs.pc); + memprintf("ari64_write_mem8 %08x, %02x @%08x %u\n", address, byte, psxRegs.pc, psxRegs.cycle); psxMemWrite8(address, byte); } static void write_mem16() { - memprintf("ari64_write_mem16 %08x, %04x, PC~=%08x\n", address, hword, psxRegs.pc); + memprintf("ari64_write_mem16 %08x, %04x @%08x %u\n", address, hword, psxRegs.pc, psxRegs.cycle); psxMemWrite16(address, hword); } static void write_mem32() { - memprintf("ari64_write_mem32 %08x, %08x, PC~=%08x\n", address, word, psxRegs.pc); + memprintf("ari64_write_mem32 %08x, %08x @%08x %u\n", address, word, psxRegs.pc, psxRegs.cycle); psxMemWrite32(address, word); } diff --git a/libpcsxcore/new_dynarec/linkage_arm.s b/libpcsxcore/new_dynarec/linkage_arm.s index 5b7d7837..b13df817 100644 --- a/libpcsxcore/new_dynarec/linkage_arm.s +++ b/libpcsxcore/new_dynarec/linkage_arm.s @@ -587,6 +587,7 @@ cc_interrupt: .global do_interrupt .type do_interrupt, %function do_interrupt: + /* FIXME: cycles already calculated, not needed? */ ldr r0, [fp, #pcaddr-dynarec_local] bl get_addr_ht ldr r1, [fp, #next_interupt-dynarec_local] diff --git a/libpcsxcore/psxhw.c b/libpcsxcore/psxhw.c index 9123f76c..f265e196 100644 --- a/libpcsxcore/psxhw.c +++ b/libpcsxcore/psxhw.c @@ -431,6 +431,8 @@ void psxHwWrite16(u32 add, u16 value) { PSXHW_LOG("IMASK 16bit write %x\n", value); #endif psxHu16ref(0x1074) = SWAPu16(value); + if (psxHu16ref(0x1070) & value) + new_dyna_set_event(6, 1); return; case 0x1f801100: @@ -543,6 +545,8 @@ void psxHwWrite32(u32 add, u32 value) { PSXHW_LOG("IMASK 32bit write %x\n", value); #endif psxHu32ref(0x1074) = SWAPu32(value); + if (psxHu32ref(0x1070) & value) + new_dyna_set_event(6, 1); return; #ifdef PSXHW_LOG diff --git a/libpcsxcore/psxmem.h b/libpcsxcore/psxmem.h index b4096034..a5c6c4a1 100644 --- a/libpcsxcore/psxmem.h +++ b/libpcsxcore/psxmem.h @@ -138,7 +138,7 @@ void psxMemWrite16(u32 mem, u16 value); void psxMemWrite32(u32 mem, u32 value); void *psxMemPointer(u32 mem); -extern u32 event_cycles[6]; +extern u32 event_cycles[7]; extern u32 next_interupt; #define new_dyna_set_event(e, c) { \