drc/gte: add some stall handling
[pcsx_rearmed.git] / libpcsxcore / r3000a.h
index 13aaa59..5435915 100644 (file)
@@ -29,21 +29,30 @@ extern "C" {
 #include "psxcounters.h"
 #include "psxbios.h"
 
+#ifdef ICACHE_EMULATION
+enum {
+       R3000ACPU_NOTIFY_CACHE_ISOLATED = 0,
+       R3000ACPU_NOTIFY_CACHE_UNISOLATED = 1,
+       R3000ACPU_NOTIFY_DMA3_EXE_LOAD = 2
+};
+extern uint32_t *Read_ICache(uint32_t pc);
+#endif
+
 typedef struct {
        int  (*Init)();
        void (*Reset)();
        void (*Execute)();              /* executes up to a break */
        void (*ExecuteBlock)(); /* executes up to a jump */
        void (*Clear)(u32 Addr, u32 Size);
+#ifdef ICACHE_EMULATION
+       void (*Notify)(int note, void *data);
+#endif
        void (*Shutdown)();
 } R3000Acpu;
 
 extern R3000Acpu *psxCpu;
 extern R3000Acpu psxInt;
-#if (defined(__x86_64__) || defined(__i386__) || defined(__sh__) || defined(__ppc__) || defined(__arm__)) && !defined(NOPSXREC)
 extern R3000Acpu psxRec;
-#define PSXREC
-#endif
 
 typedef union {
 #if defined(__BIGENDIAN__)
@@ -160,6 +169,7 @@ enum {
        PSXINT_RCNT,
        PSXINT_CDRLID,
        PSXINT_CDRPLAY,
+       PSXINT_SPU_UPDATE,
        PSXINT_COUNT
 };
 
@@ -183,6 +193,10 @@ typedef struct {
        u32 cycle;
        u32 interrupt;
        struct { u32 sCycle, cycle; } intCycle[32];
+       u32 gteBusyCycle;
+       // warning: changing anything in psxRegisters requires update of all
+       // asm in libpcsxcore/new_dynarec/, but this member can be replaced
+       u32 reserved[3];
 } psxRegisters;
 
 extern psxRegisters psxRegs;
@@ -191,9 +205,9 @@ extern psxRegisters psxRegs;
 extern u32 event_cycles[PSXINT_COUNT];
 extern u32 next_interupt;
 
-void new_dyna_save(void);
+void new_dyna_before_save(void);
 void new_dyna_after_save(void);
-void new_dyna_restore(void);
+void new_dyna_freeze(void *f, int mode);
 
 #define new_dyna_set_event(e, c) { \
        s32 c_ = c; \