frontend: update libpicofe, fix missed callbacks
[pcsx_rearmed.git] / libpcsxcore / r3000a.h
index 6682314..df7882c 100644 (file)
@@ -25,9 +25,6 @@ extern "C" {
 #endif
 
 #include "psxcommon.h"
 #endif
 
 #include "psxcommon.h"
-#include "psxmem.h"
-#include "psxcounters.h"
-#include "psxbios.h"
 
 enum R3000Aexception {
        R3000E_Int = 0,      // Interrupt
 
 enum R3000Aexception {
        R3000E_Int = 0,      // Interrupt
@@ -45,20 +42,24 @@ enum R3000Aexception {
 enum R3000Anote {
        R3000ACPU_NOTIFY_CACHE_ISOLATED = 0,
        R3000ACPU_NOTIFY_CACHE_UNISOLATED = 1,
 enum R3000Anote {
        R3000ACPU_NOTIFY_CACHE_ISOLATED = 0,
        R3000ACPU_NOTIFY_CACHE_UNISOLATED = 1,
-       R3000ACPU_NOTIFY_BEFORE_SAVE,
+       R3000ACPU_NOTIFY_BEFORE_SAVE,  // data arg - hle if non-null
        R3000ACPU_NOTIFY_AFTER_LOAD,
 };
 
 enum blockExecCaller {
        EXEC_CALLER_BOOT,
        EXEC_CALLER_HLE,
        R3000ACPU_NOTIFY_AFTER_LOAD,
 };
 
 enum blockExecCaller {
        EXEC_CALLER_BOOT,
        EXEC_CALLER_HLE,
+       EXEC_CALLER_OTHER,
 };
 
 };
 
+struct psxRegisters;
+
 typedef struct {
        int  (*Init)();
        void (*Reset)();
 typedef struct {
        int  (*Init)();
        void (*Reset)();
-       void (*Execute)();
-       void (*ExecuteBlock)(enum blockExecCaller caller); /* executes up to a jump */
+       void (*Execute)(struct psxRegisters *regs);
+       /* executes up to a jump */
+       void (*ExecuteBlock)(struct psxRegisters *regs, enum blockExecCaller caller);
        void (*Clear)(u32 Addr, u32 Size);
        void (*Notify)(enum R3000Anote note, void *data);
        void (*ApplyConfig)();
        void (*Clear)(u32 Addr, u32 Size);
        void (*Notify)(enum R3000Anote note, void *data);
        void (*ApplyConfig)();
@@ -88,7 +89,7 @@ typedef union {
                u32   r0, at, v0, v1, a0, a1, a2, a3,
                                                t0, t1, t2, t3, t4, t5, t6, t7,
                                                s0, s1, s2, s3, s4, s5, s6, s7,
                u32   r0, at, v0, v1, a0, a1, a2, a3,
                                                t0, t1, t2, t3, t4, t5, t6, t7,
                                                s0, s1, s2, s3, s4, s5, s6, s7,
-                                               t8, t9, k0, k1, gp, sp, s8, ra, lo, hi;
+                                               t8, t9, k0, k1, gp, sp, fp, ra, lo, hi;
        } n;
        u32 r[34]; /* Lo, Hi in r[32] and r[33] */
        PAIR p[34];
        } n;
        u32 r[34]; /* Lo, Hi in r[32] and r[33] */
        PAIR p[34];
@@ -166,25 +167,6 @@ typedef union {
        PAIR p[32];
 } psxCP2Ctrl;
 
        PAIR p[32];
 } psxCP2Ctrl;
 
-enum {
-       PSXINT_SIO = 0,
-       PSXINT_CDR,
-       PSXINT_CDREAD,
-       PSXINT_GPUDMA,
-       PSXINT_MDECOUTDMA,
-       PSXINT_SPUDMA,
-       PSXINT_GPUBUSY,
-       PSXINT_MDECINDMA,
-       PSXINT_GPUOTCDMA,
-       PSXINT_CDRDMA,
-       PSXINT_NEWDRC_CHECK,
-       PSXINT_RCNT,
-       PSXINT_CDRLID,
-       PSXINT_CDRPLAY_OLD,     /* unused */
-       PSXINT_SPU_UPDATE,
-       PSXINT_COUNT
-};
-
 enum R3000Abdt {
        // corresponds to bits 31,30 of Cause reg
        R3000A_BRANCH_TAKEN = 3,
 enum R3000Abdt {
        // corresponds to bits 31,30 of Cause reg
        R3000A_BRANCH_TAKEN = 3,
@@ -198,7 +180,7 @@ typedef struct psxCP2Regs {
        psxCP2Ctrl CP2C;        /* Cop2 control registers */
 } psxCP2Regs;
 
        psxCP2Ctrl CP2C;        /* Cop2 control registers */
 } psxCP2Regs;
 
-typedef struct {
+typedef struct psxRegisters {
        // note: some cores like lightrec don't keep their data here,
        // so use R3000ACPU_NOTIFY_BEFORE_SAVE to sync
        psxGPRRegs GPR;         /* General Purpose Registers */
        // note: some cores like lightrec don't keep their data here,
        // so use R3000ACPU_NOTIFY_BEFORE_SAVE to sync
        psxGPRRegs GPR;         /* General Purpose Registers */
@@ -214,40 +196,37 @@ typedef struct {
        u32 code;                       /* The instruction */
        u32 cycle;
        u32 interrupt;
        u32 code;                       /* The instruction */
        u32 cycle;
        u32 interrupt;
-       struct { u32 sCycle, cycle; } intCycle[32];
+       struct { u32 sCycle, cycle; } intCycle[20];
+       u32 event_cycles[20];
+       u32 psxNextCounter;
+       u32 psxNextsCounter;
+       u32 next_interupt;  /* cycle */
+       u32 unused;
        u32 gteBusyCycle;
        u32 muldivBusyCycle;
        u32 subCycle;       /* interpreter cycle counting */
        u32 subCycleStep;
        u32 biuReg;
        u32 gteBusyCycle;
        u32 muldivBusyCycle;
        u32 subCycle;       /* interpreter cycle counting */
        u32 subCycleStep;
        u32 biuReg;
+       u8  stop;
+       u8  branchSeen;     /* interp. */
        u8  branching;      /* interp. R3000A_BRANCH_TAKEN / not, 0 if not branch */
        u8  dloadSel;       /* interp. delay load state */
        u8  dloadReg[2];
        u8  branching;      /* interp. R3000A_BRANCH_TAKEN / not, 0 if not branch */
        u8  dloadSel;       /* interp. delay load state */
        u8  dloadReg[2];
+       u8  unused2[2];
        u32 dloadVal[2];
        u32 dloadVal[2];
+       u32 biosBranchCheck;
+       u32 cpuInRecursion;
+       u32 gpuIdleAfter;
+       u32 unused3[2];
        // warning: changing anything in psxRegisters requires update of all
        // warning: changing anything in psxRegisters requires update of all
-       // asm in libpcsxcore/new_dynarec/
+       // asm in libpcsxcore/new_dynarec/ and may break savestates
 } psxRegisters;
 
 extern psxRegisters psxRegs;
 
 /* new_dynarec stuff */
 } psxRegisters;
 
 extern psxRegisters psxRegs;
 
 /* new_dynarec stuff */
-extern u32 event_cycles[PSXINT_COUNT];
-extern u32 next_interupt;
-
-void new_dyna_freeze(void *f, int mode);
-
-#define new_dyna_set_event_abs(e, abs) { \
-       u32 abs_ = abs; \
-       s32 di_ = next_interupt - abs_; \
-       event_cycles[e] = abs_; \
-       if (di_ > 0) { \
-               /*printf("%u: next_interupt %u -> %u\n", psxRegs.cycle, next_interupt, abs_);*/ \
-               next_interupt = abs_; \
-       } \
-}
-
-#define new_dyna_set_event(e, c) \
-       new_dyna_set_event_abs(e, psxRegs.cycle + (c))
+void ndrc_freeze(void *f, int mode);
+void ndrc_clear_full(void);
 
 int  psxInit();
 void psxReset();
 
 int  psxInit();
 void psxReset();
@@ -255,8 +234,12 @@ void psxShutdown();
 void psxException(u32 code, enum R3000Abdt bdt, psxCP0Regs *cp0);
 void psxBranchTest();
 void psxExecuteBios();
 void psxException(u32 code, enum R3000Abdt bdt, psxCP0Regs *cp0);
 void psxBranchTest();
 void psxExecuteBios();
+int  psxExecuteBiosEnded(void);
 void psxJumpTest();
 
 void psxJumpTest();
 
+void irq10Interrupt();
+void psxScheduleIrq10(int irq_count, int x_cycles, int y);
+
 #ifdef __cplusplus
 }
 #endif
 #ifdef __cplusplus
 }
 #endif