drc: handle regs-not-in-psxRegs case better
[pcsx_rearmed.git] / libpcsxcore / r3000a.h
index 6973afe..229b14a 100644 (file)
@@ -29,9 +29,11 @@ extern "C" {
 #include "psxcounters.h"
 #include "psxbios.h"
 
-enum {
+enum R3000Anote {
        R3000ACPU_NOTIFY_CACHE_ISOLATED = 0,
        R3000ACPU_NOTIFY_CACHE_UNISOLATED = 1,
+       R3000ACPU_NOTIFY_BEFORE_SAVE,
+       R3000ACPU_NOTIFY_AFTER_LOAD,
 };
 
 typedef struct {
@@ -40,7 +42,7 @@ typedef struct {
        void (*Execute)();              /* executes up to a break */
        void (*ExecuteBlock)(); /* executes up to a jump */
        void (*Clear)(u32 Addr, u32 Size);
-       void (*Notify)(int note, void *data);
+       void (*Notify)(enum R3000Anote note, void *data);
        void (*ApplyConfig)();
        void (*Shutdown)();
 } R3000Acpu;
@@ -74,7 +76,7 @@ typedef union {
        PAIR p[34];
 } psxGPRRegs;
 
-typedef union {
+typedef union psxCP0Regs_ {
        struct {
                u32     Index,     Random,    EntryLo0,  EntryLo1,
                                                Context,   PageMask,  Wired,     Reserved0,
@@ -174,6 +176,8 @@ typedef struct psxCP2Regs {
 } psxCP2Regs;
 
 typedef struct {
+       // note: some cores like lightrec don't keep their data here,
+       // so use R3000ACPU_NOTIFY_BEFORE_SAVE to sync
        psxGPRRegs GPR;         /* General Purpose Registers */
        psxCP0Regs CP0;         /* Coprocessor0 Registers */
        union {
@@ -183,8 +187,8 @@ typedef struct {
                };
                psxCP2Regs CP2;
        };
-    u32 pc;                            /* Program counter */
-    u32 code;                  /* The instruction */
+       u32 pc;                         /* Program counter */
+       u32 code;                       /* The instruction */
        u32 cycle;
        u32 interrupt;
        struct { u32 sCycle, cycle; } intCycle[32];
@@ -204,8 +208,6 @@ extern psxRegisters psxRegs;
 extern u32 event_cycles[PSXINT_COUNT];
 extern u32 next_interupt;
 
-void new_dyna_before_save(void);
-void new_dyna_after_save(void);
 void new_dyna_freeze(void *f, int mode);
 
 #define new_dyna_set_event_abs(e, abs) { \
@@ -224,7 +226,7 @@ void new_dyna_freeze(void *f, int mode);
 int  psxInit();
 void psxReset();
 void psxShutdown();
-void psxException(u32 code, u32 bd);
+void psxException(u32 code, u32 bd, psxCP0Regs *cp0);
 void psxBranchTest();
 void psxExecuteBios();
 void psxJumpTest();