X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fr3000a.h;h=32538e584849a15938f4349c5112b3772f4b12f9;hb=HEAD;hp=3a903b1a5d5f4162b9773363fb27056eeb2892c0;hpb=11d23573173ec4b5074eb35665c6012a46034d5c;p=pcsx_rearmed.git diff --git a/libpcsxcore/r3000a.h b/libpcsxcore/r3000a.h index 3a903b1a..df7882ce 100644 --- a/libpcsxcore/r3000a.h +++ b/libpcsxcore/r3000a.h @@ -25,9 +25,6 @@ extern "C" { #endif #include "psxcommon.h" -#include "psxmem.h" -#include "psxcounters.h" -#include "psxbios.h" enum R3000Aexception { R3000E_Int = 0, // Interrupt @@ -52,13 +49,17 @@ enum R3000Anote { enum blockExecCaller { EXEC_CALLER_BOOT, EXEC_CALLER_HLE, + EXEC_CALLER_OTHER, }; +struct psxRegisters; + 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)(); @@ -166,25 +167,6 @@ typedef union { 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_IRQ10, - PSXINT_SPU_UPDATE, - PSXINT_COUNT -}; - 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; -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 */ @@ -214,40 +196,37 @@ typedef struct { 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; + 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 unused2[2]; u32 dloadVal[2]; + u32 biosBranchCheck; + u32 cpuInRecursion; + u32 gpuIdleAfter; + u32 unused3[2]; // 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 */ -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(); @@ -255,6 +234,7 @@ void psxShutdown(); void psxException(u32 code, enum R3000Abdt bdt, psxCP0Regs *cp0); void psxBranchTest(); void psxExecuteBios(); +int psxExecuteBiosEnded(void); void psxJumpTest(); void irq10Interrupt();