X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=deps%2Flightrec%2Flightrec.h;h=4cda1a0af98d33cf0a2c46702628802e8ec08a9c;hb=5937ccce520c4bddc986f741737465e2e8d94605;hp=3ea8e656b59832e1970a601a958518f69697ecb7;hpb=473f5cc63f9942866e01c7c84d151e8157cdb6ee;p=pcsx_rearmed.git diff --git a/deps/lightrec/lightrec.h b/deps/lightrec/lightrec.h index 3ea8e656..4cda1a0a 100644 --- a/deps/lightrec/lightrec.h +++ b/deps/lightrec/lightrec.h @@ -28,6 +28,21 @@ extern "C" { # define __api #endif +#ifndef __cnst +# ifdef __GNUC__ +# define __cnst __attribute__((const)) +# else +# define __cnst +# endif +#endif +#ifndef __pure +# ifdef __GNUC__ +# define __pure __attribute__((pure)) +# else +# define __pure +# endif +#endif + typedef uint64_t u64; typedef uint32_t u32; typedef uint16_t u16; @@ -48,6 +63,11 @@ struct lightrec_mem_map; #define LIGHTREC_EXIT_SYSCALL (1 << 2) #define LIGHTREC_EXIT_SEGFAULT (1 << 3) #define LIGHTREC_EXIT_NOMEM (1 << 4) +#define LIGHTREC_EXIT_UNKNOWN_OP (1 << 5) + +/* Unsafe optimizations flags */ +#define LIGHTREC_OPT_INV_DMA_ONLY (1 << 0) +#define LIGHTREC_OPT_SP_GP_HIT_RAM (1 << 1) enum psx_map { PSX_MAP_KERNEL_USER_RAM, @@ -60,6 +80,7 @@ enum psx_map { PSX_MAP_MIRROR2, PSX_MAP_MIRROR3, PSX_MAP_CODE_BUFFER, + PSX_MAP_PPORT_MIRROR, PSX_MAP_UNKNOWN, }; @@ -74,6 +95,9 @@ struct lightrec_mem_map_ops { u8 (*lb)(struct lightrec_state *, u32 opcode, void *host, u32 addr); u16 (*lh)(struct lightrec_state *, u32 opcode, void *host, u32 addr); u32 (*lw)(struct lightrec_state *, u32 opcode, void *host, u32 addr); + u32 (*lwu)(struct lightrec_state *, u32 opcode, void *host, u32 addr); + void (*swu)(struct lightrec_state *, u32 opcode, + void *host, u32 addr, u32 data); }; struct lightrec_mem_map { @@ -85,8 +109,11 @@ struct lightrec_mem_map { }; struct lightrec_ops { + void (*cop2_notify)(struct lightrec_state *state, u32 op, u32 data); void (*cop2_op)(struct lightrec_state *state, u32 op); void (*enable_ram)(struct lightrec_state *state, _Bool enable); + _Bool (*hw_direct)(u32 kaddr, _Bool is_write, u8 size); + void (*code_inv)(void *addr, u32 len); }; struct lightrec_registers { @@ -105,23 +132,25 @@ __api void lightrec_destroy(struct lightrec_state *state); __api u32 lightrec_execute(struct lightrec_state *state, u32 pc, u32 target_cycle); -__api u32 lightrec_execute_one(struct lightrec_state *state, u32 pc); -__api u32 lightrec_run_interpreter(struct lightrec_state *state, u32 pc); +__api u32 lightrec_run_interpreter(struct lightrec_state *state, + u32 pc, u32 target_cycle); __api void lightrec_invalidate(struct lightrec_state *state, u32 addr, u32 len); __api void lightrec_invalidate_all(struct lightrec_state *state); -__api void lightrec_set_invalidate_mode(struct lightrec_state *state, - _Bool dma_only); __api void lightrec_set_exit_flags(struct lightrec_state *state, u32 flags); __api u32 lightrec_exit_flags(struct lightrec_state *state); -__api struct lightrec_registers * lightrec_get_registers(struct lightrec_state *state); +__api void lightrec_set_unsafe_opt_flags(struct lightrec_state *state, u32 flags); + +__api __cnst struct lightrec_registers * +lightrec_get_registers(struct lightrec_state *state); __api u32 lightrec_current_cycle_count(const struct lightrec_state *state); __api void lightrec_reset_cycle_count(struct lightrec_state *state, u32 cycles); __api void lightrec_set_target_cycle_count(struct lightrec_state *state, u32 cycles); +__api void lightrec_set_cycles_per_opcode(struct lightrec_state *state, u32 cycles); #ifdef __cplusplus };