X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fr3000a.h;h=bdb8d27cd6df1c3fd9e0206efa29f08015641d2b;hb=0f15c5bc5af3335d6445f1254d0ca546ba509c59;hp=6ba74de6f370a66e51c10126eb3302263cc94268;hpb=cab87bf32270cb7a80a988850ed2f82e10722001;p=pcsx_rearmed.git diff --git a/libpcsxcore/r3000a.h b/libpcsxcore/r3000a.h index 6ba74de6..bdb8d27c 100644 --- a/libpcsxcore/r3000a.h +++ b/libpcsxcore/r3000a.h @@ -29,19 +29,38 @@ extern "C" { #include "psxcounters.h" #include "psxbios.h" -enum { +enum R3000Aexception { + R3000E_Int = 0, // Interrupt + R3000E_AdEL = 4, // Address error (on load/I-fetch) + R3000E_AdES = 5, // Address error (on store) + R3000E_IBE = 6, // Bus error (instruction fetch) + R3000E_DBE = 7, // Bus error (data load) + R3000E_Syscall = 8, // syscall instruction + R3000E_Bp = 9, // Breakpoint - a break instruction + R3000E_RI = 10, // reserved instruction + R3000E_CpU = 11, // Co-Processor unusable + R3000E_Ov = 12 // arithmetic overflow +}; + +enum R3000Anote { R3000ACPU_NOTIFY_CACHE_ISOLATED = 0, R3000ACPU_NOTIFY_CACHE_UNISOLATED = 1, - R3000ACPU_NOTIFY_DMA3_EXE_LOAD = 2 + R3000ACPU_NOTIFY_BEFORE_SAVE, + R3000ACPU_NOTIFY_AFTER_LOAD, +}; + +enum blockExecCaller { + EXEC_CALLER_BOOT, + EXEC_CALLER_HLE, }; typedef struct { int (*Init)(); void (*Reset)(); - void (*Execute)(); /* executes up to a break */ - void (*ExecuteBlock)(); /* executes up to a jump */ + void (*Execute)(); + void (*ExecuteBlock)(enum blockExecCaller caller); /* 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; @@ -75,7 +94,7 @@ typedef union { PAIR p[34]; } psxGPRRegs; -typedef union { +typedef union psxCP0Regs_ { struct { u32 Index, Random, EntryLo0, EntryLo1, Context, PageMask, Wired, Reserved0, @@ -175,6 +194,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 { @@ -184,28 +205,27 @@ 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]; u32 gteBusyCycle; u32 muldivBusyCycle; + u32 subCycle; /* interpreter cycle counting */ + u32 subCycleStep; + u32 biuReg; + u32 reserved[3]; // warning: changing anything in psxRegisters requires update of all - // asm in libpcsxcore/new_dynarec/, but this member can be replaced - u32 reserved[2]; + // asm in libpcsxcore/new_dynarec/ } psxRegisters; -extern boolean writeok; - extern psxRegisters psxRegs; /* new_dynarec stuff */ 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 +244,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();