-
Notifications
You must be signed in to change notification settings - Fork 0
/
CPU.h
319 lines (302 loc) · 6.73 KB
/
CPU.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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
#include <array>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <algorithm>
#include <iterator>
#include "StatsRegister.h"
#include "IOPorts.h"
class CPU
{
private:
//Registers
unsigned char A;
unsigned char B;
unsigned char C;
unsigned char D;
unsigned char E;
unsigned char H;
unsigned char L;
unsigned short PC;
unsigned short SP;
unsigned char opcode;
StatsRegister flags;
IOPorts ports;
bool interruptsEnabled;
bool printDebugInfo;
//64KB of memory
std::array<unsigned char, 0x10000> memory;
public:
CPU(ushort startPC);
void init();
int emulateCycle();
void readIntoMem(std::string filename, ushort startAddr);
void incPC();
void copyROM();
std::array<unsigned char, 0x10000>& getMemory();
void handleIN();
void handleOUT();
void setP1Left(bool on);
void setP1Right(bool on);
void setP1Fire(bool on);
void setP2Left(bool on);
void setP2Right(bool on);
void setP2Fire(bool on);
void setP1Start(bool on);
void setP2Start(bool on);
void setCoin(bool on);
void setDebug(bool debug);
void writeMem(ushort addr, unsigned char value);
void genInterrupt(int interruptNum);
void debugPrint();
void setByte(ushort addr, unsigned char data);
ushort getPC();
unsigned char getOpcode();
unsigned char getByte(ushort address);
bool evenParity(unsigned char parityByte);
bool getInterruptStatus();
unsigned char getSoundPort3();
unsigned char getSoundPort5();
//instruction functions
void nop();
void lxiB();
void lxiD();
void lxiH();
void lxiSP();
void staxB();
void staxD();
void sta();
void ldaxB();
void ldaxD();
void lda();
void inxB();
void inxD();
void inxH();
void inxSP();
void dcxB();
void dcxD();
void dcxH();
void dcxSP();
void inrA();
void inrB();
void inrC();
void inrD();
void inrE();
void inrH();
void inrL();
void inrM();
void dcrA();
void dcrB();
void dcrC();
void dcrD();
void dcrE();
void dcrH();
void dcrL();
void dcrM();
void mviA();
void mviB();
void mviC();
void mviD();
void mviE();
void mviH();
void mviL();
void mviM();
void movBB();
void movBC();
void movBD();
void movBE();
void movBH();
void movBL();
void movBM();
void movBA();
void movCB();
void movCC();
void movCD();
void movCE();
void movCH();
void movCL();
void movCM();
void movCA();
void movDB();
void movDC();
void movDD();
void movDE();
void movDH();
void movDL();
void movDM();
void movDA();
void movEB();
void movEC();
void movED();
void movEE();
void movEH();
void movEL();
void movEM();
void movEA();
void movHB();
void movHC();
void movHD();
void movHE();
void movHH();
void movHL();
void movHM();
void movHA();
void movLB();
void movLC();
void movLD();
void movLE();
void movLH();
void movLL();
void movLM();
void movLA();
void movMB();
void movMC();
void movMD();
void movME();
void movMH();
void movML();
void movMA();
void movAB();
void movAC();
void movAD();
void movAE();
void movAH();
void movAL();
void movAM();
void movAA();
void addB();
void addC();
void addD();
void addE();
void addH();
void addL();
void addM();
void addA();
void adi();
void ani();
void ori();
void xri();
void sui();
void sbi();
void aci();
void adcB();
void adcC();
void adcD();
void adcE();
void adcH();
void adcL();
void adcM();
void adcA();
void subB();
void subC();
void subD();
void subE();
void subH();
void subL();
void subM();
void subA();
void sbbB();
void sbbC();
void sbbD();
void sbbE();
void sbbH();
void sbbL();
void sbbM();
void sbbA();
void anaB();
void anaC();
void anaD();
void anaE();
void anaH();
void anaL();
void anaM();
void anaA();
void xraB();
void xraC();
void xraD();
void xraE();
void xraH();
void xraL();
void xraM();
void xraA();
void oraB();
void oraC();
void oraD();
void oraE();
void oraH();
void oraL();
void oraM();
void oraA();
void cmpB();
void cmpC();
void cmpD();
void cmpE();
void cmpH();
void cmpL();
void cmpM();
void cmpA();
void rnz();
void rz();
void popB();
void popD();
void popH();
void popPSW();
void pushB();
void pushD();
void pushH();
void pushPSW();
void jnz();
void jnc();
void jpo();
void jp();
void jpe();
void jc();
void jz();
void jm();
void jmp();
void cnz();
void cnc();
void cc();
void cz();
void call();
void rst0();
void rst1();
void rst2();
void rst3();
void rst4();
void rst5();
void rst6();
void rst7();
void rpo();
void rp();
void rpe();
void cpo();
void cpe();
void cp();
void cpi();
void cm();
void ret();
void rlc();
void rrc();
void daa();
void dadB();
void dadD();
void dadH();
void dadSP();
void ral();
void rar();
void shld();
void lhld();
void cma();
void cmc();
void ctc();
void rnc();
void rc();
void rm();
void xthl();
void pchl();
void xchg();
void sphl();
void ei();
void di();
};