N64FlashcartMenu
Loading...
Searching...
No Matches
vr4300_asm.h
1#ifndef VR4300_ASM_H__
2#define VR4300_ASM_H__
3
4#include <stdint.h>
5
11typedef union {
12 uint32_t raw;
14 struct {
15 uint32_t op : 6;
16 uint32_t rs : 5;
17 uint32_t rt : 5;
18 uint32_t imm : 16;
19 } i_type;
21 struct {
22 uint32_t op : 6;
23 uint32_t target : 26;
24 } j_type;
26 struct {
27 uint32_t op : 6;
28 uint32_t rs : 5;
29 uint32_t rt : 5;
30 uint32_t rd : 5;
31 uint32_t sa : 5;
32 uint32_t funct : 6;
33 } r_type;
35 struct {
36 uint32_t op : 6;
37 uint32_t co : 1;
38 uint32_t funct : 25;
39 } c_type;
41
47typedef enum {
48 OP_SPECIAL,
49 OP_REGIMM,
50 OP_J,
51 OP_JAL,
52 OP_BEQ,
53 OP_BNE,
54 OP_BLEZ,
55 OP_BGTZ,
56 OP_ADDI,
57 OP_ADDIU,
58 OP_SLTI,
59 OP_SLTIU,
60 OP_ANDI,
61 OP_ORI,
62 OP_XORI,
63 OP_LUI,
64 OP_COP0,
65 OP_COP1,
66 OP_COP2,
67 __OP_RESERVED_19,
68 OP_BEQL,
69 OP_BNEL,
70 OP_BLEZL,
71 OP_BGTZL,
72 OP_DADDI,
73 OP_DADDIU,
74 OP_LDL,
75 OP_LDR,
76 __OP_RESERVED_28,
77 __OP_RESERVED_29,
78 __OP_RESERVED_30,
79 __OP_RESERVED_31,
80 OP_LB,
81 OP_LH,
82 OP_LWL,
83 OP_LW,
84 OP_LBU,
85 OP_LHU,
86 OP_LWR,
87 OP_LWU,
88 OP_SB,
89 OP_SH,
90 OP_SWL,
91 OP_SW,
92 OP_SDL,
93 OP_SDR,
94 OP_SWR,
95 OP_CACHE,
96 OP_LL,
97 OP_LWC1,
98 OP_LWC2,
99 __OP_RESERVED_51,
100 OP_LLD,
101 OP_LDC1,
102 OP_LDC2,
103 OP_LD,
104 OP_SC,
105 OP_SWC1,
106 OP_SWC2,
107 __OP_RESERVED_59,
108 OP_SCD,
109 OP_SDC1,
110 OP_SDC2,
111 OP_SD,
112} vr4300_op_t;
113
114typedef enum {
115 FUNCT_SSL,
116 __FUNCT_RESERVED_1,
117 FUNCT_SRL,
118 FUNCT_SRA,
119 FUNCT_SLLV,
120 __FUNCT_RESERVED_5,
121 FUNCT_SRLV,
122 FUNCT_SRAV,
123 FUNCT_JR,
124 FUNCT_JALR,
125 __FUNCT_RESERVED_10,
126 __FUNCT_RESERVED_11,
127 FUNCT_SYSCALL,
128 FUNCT_BREAK,
129 __FUNCT_RESERVED_14,
130 FUNCT_SYNC,
131 FUNCT_MFHI,
132 FUNCT_MTHI,
133 FUNCT_MFLO,
134 FUNCT_MTLO,
135 FUNCT_DSLLV,
136 __FUNCT_RESERVED_21,
137 FUNCT_DSRLV,
138 FUNCT_DSRAV,
139 FUNCT_MULT,
140 FUNCT_MULTU,
141 FUNCT_DIV,
142 FUNCT_DIVU,
143 FUNCT_DMULT,
144 FUNCT_DMULTU,
145 FUNCT_DDIV,
146 FUNCT_DDIVU,
147 FUNCT_ADD,
148 FUNCT_ADDU,
149 FUNCT_SUB,
150 FUNCT_SUBU,
151 FUNCT_AND,
152 FUNCT_OR,
153 FUNCT_XOR,
154 FUNCT_NOR,
155 __FUNCT_RESERVED_40,
156 __FUNCT_RESERVED_41,
157 FUNCT_SLT,
158 FUNCT_SLTU,
159 FUNCT_DADD,
160 FUNCT_DADDU,
161 FUNCT_DSUB,
162 FUNCT_DSUBU,
163 FUNCT_TGE,
164 FUNCT_TGEU,
165 FUNCT_TLT,
166 FUNCT_TLTU,
167 FUNCT_TEQ,
168 __FUNCT_RESERVED_53,
169 FUNCT_TNE,
170 __FUNCT_RESERVED_55,
171 FUNCT_DSLL,
172 __FUNCT_RESERVED_57,
173 FUNCT_DSRL,
174 FUNCT_DSRA,
175 FUNCT_DSLL32,
176 __FUNCT_RESERVED_61,
177 FUNCT_DSRL32,
178 FUNCT_DSRA32,
179} vr4300_funct_t;
180
181typedef enum {
182 REGIMM_BLTZ,
183 REGIMM_BGEZ,
184 REGIMM_BLTZL,
185 REGIMM_BGEZL,
186 __REGIMM_RESERVED_4,
187 __REGIMM_RESERVED_5,
188 __REGIMM_RESERVED_6,
189 __REGIMM_RESERVED_7,
190 REGIMM_TGEI,
191 REGIMM_TGEIU,
192 REGIMM_TLTI,
193 REGIMM_TLTIU,
194 REGIMM_TEQI,
195 __REGIMM_RESERVED_13,
196 REGIMM_TNEI,
197 __REGIMM_RESERVED_15,
198 REGIMM_BLTZAL,
199 REGIMM_BGEZAL,
200 REGIMM_BLTZALL,
201 REGIMM_BGEZALL,
202 __REGIMM_RESERVED_20,
203 __REGIMM_RESERVED_21,
204 __REGIMM_RESERVED_22,
205 __REGIMM_RESERVED_23,
206 __REGIMM_RESERVED_24,
207 __REGIMM_RESERVED_25,
208 __REGIMM_RESERVED_26,
209 __REGIMM_RESERVED_27,
210 __REGIMM_RESERVED_28,
211 __REGIMM_RESERVED_29,
212 __REGIMM_RESERVED_30,
213 __REGIMM_RESERVED_31,
214} vr4300_regimm_t;
215
216typedef enum {
217 REG_ZERO,
218 REG_AT,
219 REG_V0,
220 REG_V1,
221 REG_A0,
222 REG_A1,
223 REG_A2,
224 REG_A3,
225 REG_T0,
226 REG_T1,
227 REG_T2,
228 REG_T3,
229 REG_T4,
230 REG_T5,
231 REG_T6,
232 REG_T7,
233 REG_S0,
234 REG_S1,
235 REG_S2,
236 REG_S3,
237 REG_S4,
238 REG_S5,
239 REG_S6,
240 REG_S7,
241 REG_T8,
242 REG_T9,
243 REG_K0,
244 REG_K1,
245 REG_GP,
246 REG_SP,
247 REG_FP,
248 REG_RA,
249} vr4300_reg_t;
250
251typedef enum {
252 C0_REG_INDEX,
253 C0_REG_RANDOM,
254 C0_REG_ENTRY_LO_0,
255 C0_REG_ENTRY_LO_1,
256 C0_REG_CONTEXT,
257 C0_REG_PAGE_MASK,
258 C0_REG_WIRED,
259 __C0_REG_RESERVED_7,
260 C0_REG_BAD_V_ADDR,
261 C0_REG_COUNT,
262 C0_REG_ENTRY_HI,
263 C0_REG_COMPARE,
264 C0_REG_STATUS,
265 C0_REG_CAUSE,
266 C0_REG_EPC,
267 C0_REG_PR_ID,
268 C0_REG_CONFIG,
269 C0_REG_LL_ADDR,
270 C0_REG_WATCH_LO,
271 C0_REG_WATCH_HI,
272 C0_REG_X_CONTEXT,
273 __C0_REG_RESERVED_21,
274 __C0_REG_RESERVED_22,
275 __C0_REG_RESERVED_23,
276 __C0_REG_RESERVED_24,
277 __C0_REG_RESERVED_25,
278 C0_REG_PARITY_ERROR,
279 C0_REG_CACHE_ERROR,
280 C0_REG_TAG_LO,
281 C0_REG_TAG_HI,
282 C0_REG_ERROR_EPC,
283 __C0_REG_RESERVED_31,
284} vr4300_c0_reg_t;
285
286typedef enum {
287 COPZ_RS_MF,
288 COPZ_RS_DMF,
289 COPZ_RS_CF,
290 __COPZ_RS_RESERVED_3,
291 COPZ_RS_MT,
292 COPZ_RS_DMT,
293 COPZ_RS_CT,
294 __COPZ_RS_RESERVED_7,
295 COPZ_RS_BC,
296 __COPZ_RS_RESERVED_9,
297 __COPZ_RS_RESERVED_10,
298 __COPZ_RS_RESERVED_11,
299 __COPZ_RS_RESERVED_12,
300 __COPZ_RS_RESERVED_13,
301 __COPZ_RS_RESERVED_14,
302 __COPZ_RS_RESERVED_15,
303} vr4300_copz_rs_t;
304
305typedef enum {
306 __C0_FUNCT_RESERVED_0,
307 C0_FUNCT_TLBR,
308 C0_FUNCT_TLBWI,
309 __C0_FUNCT_RESERVED_3,
310 __C0_FUNCT_RESERVED_4,
311 __C0_FUNCT_RESERVED_5,
312 C0_FUNCT_TLBWR,
313 __C0_FUNCT_RESERVED_7,
314 C0_FUNCT_TLBP,
315 __C0_FUNCT_RESERVED_9,
316 __C0_FUNCT_RESERVED_10,
317 __C0_FUNCT_RESERVED_11,
318 __C0_FUNCT_RESERVED_12,
319 __C0_FUNCT_RESERVED_13,
320 __C0_FUNCT_RESERVED_14,
321 __C0_FUNCT_RESERVED_15,
322 __C0_FUNCT_RESERVED_16,
323 __C0_FUNCT_RESERVED_17,
324 __C0_FUNCT_RESERVED_18,
325 __C0_FUNCT_RESERVED_19,
326 __C0_FUNCT_RESERVED_20,
327 __C0_FUNCT_RESERVED_21,
328 __C0_FUNCT_RESERVED_22,
329 __C0_FUNCT_RESERVED_23,
330 C0_FUNCT_ERET,
331 __C0_FUNCT_RESERVED_25,
332 __C0_FUNCT_RESERVED_26,
333 __C0_FUNCT_RESERVED_27,
334 __C0_FUNCT_RESERVED_28,
335 __C0_FUNCT_RESERVED_29,
336 __C0_FUNCT_RESERVED_30,
337 __C0_FUNCT_RESERVED_31,
338 __C0_FUNCT_RESERVED_32,
339 __C0_FUNCT_RESERVED_33,
340 __C0_FUNCT_RESERVED_34,
341 __C0_FUNCT_RESERVED_35,
342 __C0_FUNCT_RESERVED_36,
343 __C0_FUNCT_RESERVED_37,
344 __C0_FUNCT_RESERVED_38,
345 __C0_FUNCT_RESERVED_39,
346 __C0_FUNCT_RESERVED_40,
347 __C0_FUNCT_RESERVED_41,
348 __C0_FUNCT_RESERVED_42,
349 __C0_FUNCT_RESERVED_43,
350 __C0_FUNCT_RESERVED_44,
351 __C0_FUNCT_RESERVED_45,
352 __C0_FUNCT_RESERVED_46,
353 __C0_FUNCT_RESERVED_47,
354 __C0_FUNCT_RESERVED_48,
355 __C0_FUNCT_RESERVED_49,
356 __C0_FUNCT_RESERVED_50,
357 __C0_FUNCT_RESERVED_51,
358 __C0_FUNCT_RESERVED_52,
359 __C0_FUNCT_RESERVED_53,
360 __C0_FUNCT_RESERVED_54,
361 __C0_FUNCT_RESERVED_55,
362 __C0_FUNCT_RESERVED_56,
363 __C0_FUNCT_RESERVED_57,
364 __C0_FUNCT_RESERVED_58,
365 __C0_FUNCT_RESERVED_59,
366 __C0_FUNCT_RESERVED_60,
367 __C0_FUNCT_RESERVED_61,
368 __C0_FUNCT_RESERVED_62,
369 __C0_FUNCT_RESERVED_63,
370} vr4300_c0_funct;
371
372#define __ASM_I_INST(o, s, t, i) \
373 (((vr4300_instruction_t){.i_type = {.op = (o), .rs = (s), .rt = (t), .imm = (i)&0xFFFF}}).raw)
374#define __ASM_J_INST(o, t) (((vr4300_instruction_t){.j_type = {.op = (o), .target = (t)&0x3FFFFFF}}).raw)
375#define __ASM_R_INST(o, s, t, d, a, f) \
376 (((vr4300_instruction_t){.r_type = {.op = (o), .rs = (s), .rt = (t), .rd = (d), .sa = (a), .funct = (f)}}).raw)
377#define __ASM_C_INST(o, c, f) (((vr4300_instruction_t){.c_type = {.op = (o), .co = (c), .funct = (f)}}).raw)
378
379#define A_OFFSET(a) ((int16_t)((a)&0xFFFF))
380#define A_BASE(a) ((uint16_t)((((a) >> 16) & 0xFFFF) + (A_OFFSET(a) < 0 ? 1 : 0)))
381
382#define I_ADDIU(rt, rs, immediate) __ASM_I_INST(OP_ADDIU, rs, rt, immediate)
383#define I_AND(rd, rs, rt) __ASM_R_INST(OP_SPECIAL, rs, rt, rd, 0, FUNCT_AND)
384#define I_ANDI(rt, rs, immediate) __ASM_I_INST(OP_ANDI, rs, rt, immediate)
385#define I_BEQ(rs, rt, offset) __ASM_I_INST(OP_BEQ, rs, rt, offset)
386#define I_BGTZ(rs, offset) __ASM_I_INST(OP_BGTZ, rs, 0, offset)
387#define I_BNE(rs, rt, offset) __ASM_I_INST(OP_BNE, rs, rt, offset)
388#define I_BNEL(rs, rt, offset) __ASM_I_INST(OP_BNEL, rs, rt, offset)
389#define I_CACHE(op, offset, base) __ASM_I_INST(OP_CACHE, base, op, offset)
390#define I_ERET() __ASM_C_INST(OP_COP0, 1, C0_FUNCT_ERET)
391#define I_J(target) __ASM_J_INST(OP_J, (target >> 2))
392#define I_JR(rs) __ASM_R_INST(OP_SPECIAL, rs, REG_ZERO, REG_ZERO, 0, FUNCT_JR)
393#define I_LBU(rt, offset, base) __ASM_I_INST(OP_LBU, base, rt, offset)
394#define I_LHU(rt, offset, base) __ASM_I_INST(OP_LHU, base, rt, offset)
395#define I_LUI(rt, immediate) __ASM_I_INST(OP_LUI, 0, rt, immediate)
396#define I_LW(rt, offset, base) __ASM_I_INST(OP_LW, base, rt, offset)
397#define I_MFC0(rt, rd) __ASM_R_INST(OP_COP0, COPZ_RS_MF, rt, rd, 0, 0)
398#define I_MTC0(rt, rd) __ASM_R_INST(OP_COP0, COPZ_RS_MT, rt, rd, 0, 0)
399#define I_NOP() __ASM_R_INST(OP_SPECIAL, REG_ZERO, REG_ZERO, REG_ZERO, 0, FUNCT_SSL)
400#define I_OR(rd, rs, rt) __ASM_R_INST(OP_SPECIAL, rs, rt, rd, 0, FUNCT_OR)
401#define I_ORI(rt, rs, immediate) __ASM_I_INST(OP_ORI, rs, rt, immediate)
402#define I_SB(rt, offset, base) __ASM_I_INST(OP_SB, base, rt, offset)
403#define I_SH(rt, offset, base) __ASM_I_INST(OP_SH, base, rt, offset)
404#define I_SRL(rd, rt, sa) __ASM_R_INST(OP_SPECIAL, 0, rt, rd, sa, FUNCT_SRL)
405#define I_SW(rt, offset, base) __ASM_I_INST(OP_SW, base, rt, offset)
406
407#endif /* VR4300_ASM_H__ */
VR4300 Instruction Structure.
Definition vr4300_asm.h:11
uint32_t raw
Definition vr4300_asm.h:12