-
Notifications
You must be signed in to change notification settings - Fork 0
/
mips3.h
179 lines (150 loc) · 4.15 KB
/
mips3.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#ifndef MIPS3_H
#define MIPS3_H
#include "common.h"
#include <string>
#include <unordered_set>
namespace mips
{
class mips3_x64;
class mips3
{
friend class mips3_x64;
public:
mips3();
~mips3();
void reset();
bool run(int cycles, bool skip_bps=true);
string dasm(uint32_t opcode, uint64_t pc);
enum {
LR = 31
};
addr_t m_next_pc;
bool m_delay_slot;
struct tlb_entry {
union {
uint64_t v[2];
};
};
tlb_entry *m_tlb;
struct cpu_state {
uint64_t r[32];
uint64_t pc;
uint64_t lo, hi;
// coprocessadores
uint64_t cpr[3][32];
// fpu control registers (FCR)
uint64_t fcr[32];
} __attribute__ ((aligned (16))) m_state;
addr_t m_prev_pc;
static const char *reg_names[];
static const char *cop0_reg_names[];
uint32_t translate(addr_t addr, addr_t *out);
const int m_tlb_entries;
void bp_insert(addr_t address);
void bp_remove(addr_t address);
private:
int m_counter;
addr_t tlb_translate(addr_t address);
unordered_set<addr_t> m_breakpoints;
bool check_breakpoint();
void tlb_init();
void tlb_flush();
void cop0_reset();
void cop0_execute(uint32_t opcode);
void cop1_reset();
void cop1_execute_16(uint32_t opcode);
void cop1_execute_32(uint32_t opcode);
// Arithmetic
void ADD(uint32_t opcode);
void SUB(uint32_t opcode);
void MULT(uint32_t opcode);
void DIV(uint32_t opcode);
void ADDU(uint32_t opcode);
void SUBU(uint32_t opcode);
void MULTU(uint32_t opcode);
void DIVU(uint32_t opcode);
void ADDI(uint32_t opcode);
void ADDIU(uint32_t opcode);
void DADDI(uint32_t opcode);
void DADDIU(uint32_t opcode);
void DADD(uint32_t opcode);
void DSUB(uint32_t opcode);
void DMULT(uint32_t opcode);
void DDIV(uint32_t opcode);
void DADDU(uint32_t opcode);
void DSUBU(uint32_t opcode);
void DMULTU(uint32_t opcode);
void DDIVU(uint32_t opcode);
// Bitwise
void AND(uint32_t opcode);
void XOR(uint32_t opcode);
void OR(uint32_t opcode);
void NOR(uint32_t opcode);
void ANDI(uint32_t opcode);
void XORI(uint32_t opcode);
void ORI(uint32_t opcode);
// Shifts
void SLL(uint32_t opcode);
void SRL(uint32_t opcode);
void SRA(uint32_t opcode);
void SLLV(uint32_t opcode);
void SRLV(uint32_t opcode);
void SRAV(uint32_t opcode);
void DSLLV(uint32_t opcode);
void DSLRV(uint32_t opcode);
void SLT(uint32_t opcode);
void SLTU(uint32_t opcode);
void DSLL(uint32_t opcode);
void DSRL(uint32_t opcode);
void DSRA(uint32_t opcode);
void DSLL32(uint32_t opcode);
void DSRL32(uint32_t opcode);
void DSRA32(uint32_t opcode);
// Jump & Branchs
void J(uint32_t opcode);
void JR(uint32_t opcode);
void JAL(uint32_t opcode);
void JALR(uint32_t opcode);
void BLTZ(uint32_t opcode);
void BLTZAL(uint32_t opcode);
void BGEZ(uint32_t opcode);
void BGEZAL(uint32_t opcode);
void BEQ(uint32_t opcode);
void BNE(uint32_t opcode);
void BLEZ(uint32_t opcode);
void BGTZ(uint32_t opcode);
// Load & Store
void LUI(uint32_t opcode);
void SB(uint32_t opcode);
void SH(uint32_t opcode);
void SW(uint32_t opcode);
void SD(uint32_t opcode);
void SDL(uint32_t opcode);
void SDR(uint32_t opcode);
void LWL(uint32_t opcode);
void LWR(uint32_t opcode);
void LDL(uint32_t opcode);
void LDR(uint32_t opcode);
void LB(uint32_t opcode);
void LBU(uint32_t opcode);
void LH(uint32_t opcode);
void LHU(uint32_t opcode);
void LW(uint32_t opcode);
void LWU(uint32_t opcode);
void LD(uint32_t opcode);
void LL(uint32_t opcode);
void LWC1(uint32_t opcode);
void SWC1(uint32_t opcode);
// Misc
void SLTI(uint32_t opcode);
void SLTIU(uint32_t opcode);
void MFHI(uint32_t opcode);
void MTHI(uint32_t opcode);
void MFLO(uint32_t opcode);
void MTLO(uint32_t opcode);
string dasm_cop0(uint32_t opcode, uint64_t pc);
string dasm_cop1(uint32_t opcode, uint64_t pc);
};
extern mips3 *g_mips;
}
#endif // MIPS3_H