3ea8e656b59832e1970a601a958518f69697ecb7
[pcsx_rearmed.git] / deps / lightrec / lightrec.h
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 /*
3  * Copyright (C) 2016-2021 Paul Cercueil <paul@crapouillou.net>
4  */
5
6 #ifndef __LIGHTREC_H__
7 #define __LIGHTREC_H__
8
9 #ifdef __cplusplus
10 #define _Bool bool
11 extern "C" {
12 #endif
13
14 #include <stddef.h>
15 #include <stdint.h>
16
17 #ifdef _WIN32
18 #   ifdef lightrec_EXPORTS
19 #       define __api __declspec(dllexport)
20 #   elif !defined(LIGHTREC_STATIC)
21 #       define __api __declspec(dllimport)
22 #   else
23 #       define __api
24 #   endif
25 #elif __GNUC__ >= 4
26 #   define __api __attribute__((visibility ("default")))
27 #else
28 #   define __api
29 #endif
30
31 typedef uint64_t u64;
32 typedef uint32_t u32;
33 typedef uint16_t u16;
34 typedef uint8_t  u8;
35
36 typedef int64_t s64;
37 typedef int32_t s32;
38 typedef int16_t s16;
39 typedef int8_t  s8;
40
41 struct lightrec_state;
42 struct lightrec_mem_map;
43
44 /* Exit flags */
45 #define LIGHTREC_EXIT_NORMAL    (0)
46 #define LIGHTREC_EXIT_CHECK_INTERRUPT   (1 << 0)
47 #define LIGHTREC_EXIT_BREAK     (1 << 1)
48 #define LIGHTREC_EXIT_SYSCALL   (1 << 2)
49 #define LIGHTREC_EXIT_SEGFAULT  (1 << 3)
50 #define LIGHTREC_EXIT_NOMEM     (1 << 4)
51
52 enum psx_map {
53         PSX_MAP_KERNEL_USER_RAM,
54         PSX_MAP_BIOS,
55         PSX_MAP_SCRATCH_PAD,
56         PSX_MAP_PARALLEL_PORT,
57         PSX_MAP_HW_REGISTERS,
58         PSX_MAP_CACHE_CONTROL,
59         PSX_MAP_MIRROR1,
60         PSX_MAP_MIRROR2,
61         PSX_MAP_MIRROR3,
62         PSX_MAP_CODE_BUFFER,
63
64         PSX_MAP_UNKNOWN,
65 };
66
67 struct lightrec_mem_map_ops {
68         void (*sb)(struct lightrec_state *, u32 opcode,
69                    void *host, u32 addr, u8 data);
70         void (*sh)(struct lightrec_state *, u32 opcode,
71                    void *host, u32 addr, u16 data);
72         void (*sw)(struct lightrec_state *, u32 opcode,
73                    void *host, u32 addr, u32 data);
74         u8 (*lb)(struct lightrec_state *, u32 opcode, void *host, u32 addr);
75         u16 (*lh)(struct lightrec_state *, u32 opcode, void *host, u32 addr);
76         u32 (*lw)(struct lightrec_state *, u32 opcode, void *host, u32 addr);
77 };
78
79 struct lightrec_mem_map {
80         u32 pc;
81         u32 length;
82         void *address;
83         const struct lightrec_mem_map_ops *ops;
84         const struct lightrec_mem_map *mirror_of;
85 };
86
87 struct lightrec_ops {
88         void (*cop2_op)(struct lightrec_state *state, u32 op);
89         void (*enable_ram)(struct lightrec_state *state, _Bool enable);
90 };
91
92 struct lightrec_registers {
93         u32 gpr[34];
94         u32 cp0[32];
95         u32 cp2d[32];
96         u32 cp2c[32];
97 };
98
99 __api struct lightrec_state *lightrec_init(char *argv0,
100                                            const struct lightrec_mem_map *map,
101                                            size_t nb,
102                                            const struct lightrec_ops *ops);
103
104 __api void lightrec_destroy(struct lightrec_state *state);
105
106 __api u32 lightrec_execute(struct lightrec_state *state,
107                            u32 pc, u32 target_cycle);
108 __api u32 lightrec_execute_one(struct lightrec_state *state, u32 pc);
109 __api u32 lightrec_run_interpreter(struct lightrec_state *state, u32 pc);
110
111 __api void lightrec_invalidate(struct lightrec_state *state, u32 addr, u32 len);
112 __api void lightrec_invalidate_all(struct lightrec_state *state);
113 __api void lightrec_set_invalidate_mode(struct lightrec_state *state,
114                                         _Bool dma_only);
115
116 __api void lightrec_set_exit_flags(struct lightrec_state *state, u32 flags);
117 __api u32 lightrec_exit_flags(struct lightrec_state *state);
118
119 __api struct lightrec_registers * lightrec_get_registers(struct lightrec_state *state);
120
121 __api u32 lightrec_current_cycle_count(const struct lightrec_state *state);
122 __api void lightrec_reset_cycle_count(struct lightrec_state *state, u32 cycles);
123 __api void lightrec_set_target_cycle_count(struct lightrec_state *state,
124                                            u32 cycles);
125
126 #ifdef __cplusplus
127 };
128 #endif
129
130 #endif /* __LIGHTREC_H__ */