summaryrefslogtreecommitdiff
path: root/instruction-bin.c
blob: d470c741214dcd530207181c70af1e7538d32285 (plain)
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
#include"include.h"

void setIT(int i, uintptr_t p, Addressing r);
void setAllIT();

int main(){
	setAllIT();
	// here, do calls to dump all instructions into a bin file
	FILE* fs = fopen("instructions.bin", "w");
	for(char* c = IT; c < (IT + InstructionTableSize); c++){
		fputc(*c, fs);
	}
	fclose(fs);
}

void setIT(int i, uintptr_t p, Addressing r){
	uintptr_t* p1 = (IT + (sizeof(uintptr_t)*i));
	*p1 = p;

	Addressing* r1 = (IT + (sizeof(uintptr_t)*256) + (sizeof(Addressing)*i));
	*r1 = r;
}

void setAllIT(){
	IT = malloc(256 * (sizeof(uintptr_t) + sizeof(Addressing)));
	// Load and Store Instructions
	// fLDA(Addressing, address);
	setIT(0xA9, (uintptr_t)&fLDA, eImmediate);
	setIT(0xA5, (uintptr_t)&fLDA, eZeroPage);
	setIT(0xB5, (uintptr_t)&fLDA, eZeroPageIndexedX);
	setIT(0xAD, (uintptr_t)&fLDA, eAbsolute);
	setIT(0xBD, (uintptr_t)&fLDA, eAbsoluteIndexedX);
	setIT(0xB9, (uintptr_t)&fLDA, eAbsoluteIndexedY);
	setIT(0xA1, (uintptr_t)&fLDA, eIndexedIndirect);
	setIT(0xB1, (uintptr_t)&fLDA, eIndirectIndexed);
	// fLDX(Addressing, address);
	setIT(0xA2, (uintptr_t)&fLDX, eImmediate);
	setIT(0xA6, (uintptr_t)&fLDX, eZeroPage);
	setIT(0xB6, (uintptr_t)&fLDX, eZeroPageIndexedY);
	setIT(0xAE, (uintptr_t)&fLDX, eAbsolute);
	setIT(0xBE, (uintptr_t)&fLDX, eAbsoluteIndexedY);
	// fLDY(Addressing, address);
	setIT(0xA0, (uintptr_t)&fLDY, eImmediate);
	setIT(0xA4, (uintptr_t)&fLDY, eZeroPage);
	setIT(0xB4, (uintptr_t)&fLDY, eZeroPageIndexedX);
	setIT(0xAC, (uintptr_t)&fLDY, eAbsolute);
	setIT(0xBC, (uintptr_t)&fLDY, eAbsoluteIndexedX);
	// fSTA(Addressing, address);
	setIT(0x85, (uintptr_t)&fSTA, eZeroPage);
	setIT(0x95, (uintptr_t)&fSTA, eZeroPageIndexedX);
	setIT(0x8D, (uintptr_t)&fSTA, eAbsolute);
	setIT(0x9D, (uintptr_t)&fSTA, eAbsoluteIndexedX);
	setIT(0x99, (uintptr_t)&fSTA, eAbsoluteIndexedY);
	setIT(0x81, (uintptr_t)&fSTA, eIndexedIndirect);
	setIT(0x91, (uintptr_t)&fSTA, eIndirectIndexed);
	// fSTX(Addressing, address);
	setIT(0x86, (uintptr_t)&fSTX, eZeroPage);
	setIT(0x96, (uintptr_t)&fSTX, eZeroPageIndexedX);
	setIT(0x8E, (uintptr_t)&fSTX, eAbsolute);
	// fSTY(Addressing, address);
	setIT(0x84, (uintptr_t)&fSTY, eZeroPage);
	setIT(0x94, (uintptr_t)&fSTY, eZeroPageIndexedY);
	setIT(0x8C, (uintptr_t)&fSTY, eAbsolute);

	// Arithmetic Instructions
	// fADC(Addressing, address);
	setIT(0x69, (uintptr_t)&fADC, eImmediate);
	setIT(0x65, (uintptr_t)&fADC, eZeroPage);
	setIT(0x75, (uintptr_t)&fADC, eZeroPageIndexedX);
	setIT(0x6D, (uintptr_t)&fADC, eAbsolute);
	setIT(0x7D, (uintptr_t)&fADC, eAbsoluteIndexedX);
	setIT(0x79, (uintptr_t)&fADC, eAbsoluteIndexedY);
	setIT(0x61, (uintptr_t)&fADC, eIndexedIndirect);
	setIT(0x71, (uintptr_t)&fADC, eIndirectIndexed);
	// fSBC(Addressing, address);
	setIT(0xE9, (uintptr_t)&fSBC, eImmediate);
	setIT(0xE5, (uintptr_t)&fSBC, eZeroPage);
	setIT(0xF5, (uintptr_t)&fSBC, eZeroPageIndexedX);
	setIT(0xED, (uintptr_t)&fSBC, eAbsolute);
	setIT(0xFD, (uintptr_t)&fSBC, eAbsoluteIndexedX);
	setIT(0xF9, (uintptr_t)&fSBC, eAbsoluteIndexedY);
	setIT(0xE1, (uintptr_t)&fSBC, eIndexedIndirect);
	setIT(0xF1, (uintptr_t)&fSBC, eIndirectIndexed);

	//Increment and Decrement Instructions
	//INC(Addressing, address);
	setIT(0xE6, (uintptr_t)&fINC, eZeroPage);
	setIT(0xF6, (uintptr_t)&fINC, eZeroPageIndexedX);
	setIT(0xEE, (uintptr_t)&fINC, eAbsolute);
	setIT(0xFE, (uintptr_t)&fINC, eAbsoluteIndexedX);
	//INX(Addressing, address);
	setIT(0xE8, (uintptr_t)&fINX, eImplied);
	//INY(Addressing, address);
	setIT(0xC8, (uintptr_t)&fINY, eImplied);
	//DEC(Addressing, address);
	setIT(0xC6, (uintptr_t)&fDEC, eZeroPage);
	setIT(0xD6, (uintptr_t)&fDEC, eZeroPageIndexedX);
	setIT(0xCE, (uintptr_t)&fDEC, eAbsolute);
	setIT(0xDE, (uintptr_t)&fDEC, eAbsoluteIndexedX);
	//DEX(Addressing, address);
	setIT(0xCA, (uintptr_t)&fDEX, eImplied);
	//DEY(Addressing, address);
	setIT(0x88, (uintptr_t)&fDEY, eImplied);

	// Logical Instructions
	//AND(Addressing, address);
	setIT(0x29, (uintptr_t)&fAND, eImmediate);
	setIT(0x25, (uintptr_t)&fAND, eZeroPage);
	setIT(0x35, (uintptr_t)&fAND, eZeroPageIndexedX);
	setIT(0x2D, (uintptr_t)&fAND, eAbsolute);
	setIT(0x3D, (uintptr_t)&fAND, eAbsoluteIndexedX);
	setIT(0x39, (uintptr_t)&fAND, eAbsoluteIndexedY);
	setIT(0x21, (uintptr_t)&fAND, eIndexedIndirect);
	setIT(0x31, (uintptr_t)&fAND, eIndirectIndexed);
	//ORA(Addressing, address);
	setIT(0x09, (uintptr_t)&fORA, eImmediate);
	setIT(0x05, (uintptr_t)&fORA, eZeroPage);
	setIT(0x15, (uintptr_t)&fORA, eZeroPageIndexedX);
	setIT(0x0D, (uintptr_t)&fORA, eAbsolute);
	setIT(0x1D, (uintptr_t)&fORA, eAbsoluteIndexedX);
	setIT(0x19, (uintptr_t)&fORA, eAbsoluteIndexedY);
	setIT(0x01, (uintptr_t)&fORA, eIndexedIndirect);
	setIT(0x11, (uintptr_t)&fORA, eIndirectIndexed);
	//EOR(Addressing, address);
	setIT(0x49, (uintptr_t)&fEOR, eImmediate);
	setIT(0x45, (uintptr_t)&fEOR, eZeroPage);
	setIT(0x55, (uintptr_t)&fEOR, eZeroPageIndexedX);
	setIT(0x4D, (uintptr_t)&fEOR, eAbsolute);
	setIT(0x5D, (uintptr_t)&fEOR, eAbsoluteIndexedX);
	setIT(0x59, (uintptr_t)&fEOR, eAbsoluteIndexedY);
	setIT(0x41, (uintptr_t)&fEOR, eIndexedIndirect);
	setIT(0x51, (uintptr_t)&fEOR, eIndirectIndexed);

	// Jump, Branch, Compare, and Test Bits
	//JMP(Addressing, address);
	setIT(0x4C, (uintptr_t)&fJMP, eAbsolute);
	setIT(0x6C, (uintptr_t)&fJMP, eIndirectAbsolute);
	//BCC(Addressing, address);
	setIT(0x90, (uintptr_t)&fBCC, eRelative);
	//BCS(Addressing, address);
	setIT(0xB0, (uintptr_t)&fBCS, eRelative);
	//BEQ(Addressing, address);
	setIT(0xF0, (uintptr_t)&fBEQ, eRelative);
	//BNE(Addressing, address);
	setIT(0xD0, (uintptr_t)&fBNE, eRelative);
	//BMI(Addressing, address);
	setIT(0x30, (uintptr_t)&fBMI, eRelative);
	//BPL(Addressing, address);
	setIT(0x10, (uintptr_t)&fBPL, eRelative);
	//BVS(Addressing, address);
	setIT(0x70, (uintptr_t)&fBVS, eRelative);
	//BVC(Addressing, address);
	setIT(0x50, (uintptr_t)&fBVC, eRelative);
	//CMP(Addressing, address);
	setIT(0xC9, (uintptr_t)&fCMP, eImmediate);
	setIT(0xC5, (uintptr_t)&fCMP, eZeroPage);
	setIT(0xD5, (uintptr_t)&fCMP, eZeroPageIndexedX);
	setIT(0xCD, (uintptr_t)&fCMP, eAbsolute);
	setIT(0xDD, (uintptr_t)&fCMP, eAbsoluteIndexedX);
	setIT(0xD9, (uintptr_t)&fCMP, eAbsoluteIndexedY);
	setIT(0xC1, (uintptr_t)&fCMP, eIndexedIndirect);
	setIT(0xD1, (uintptr_t)&fCMP, eIndirectIndexed);
	//CPX(Addressing, address);
	setIT(0xE0, (uintptr_t)&fCPX, eImmediate);
	setIT(0xE4, (uintptr_t)&fCPX, eZeroPage);
	setIT(0xEC, (uintptr_t)&fCPX, eAbsolute);
	//CPY(Addressing, address);
	setIT(0xC0, (uintptr_t)&fCPY, eImmediate);
	setIT(0xC4, (uintptr_t)&fCPY, eZeroPage);
	setIT(0xCC, (uintptr_t)&fCPY, eAbsolute);
	//BIT(Addressing, address);
	setIT(0x4C, (uintptr_t)&fBIT, eZeroPage);
	setIT(0x6C, (uintptr_t)&fBIT, eAbsolute);

	// Shift and Rotate Instructions
	//ASL(Addressing, address);
	setIT(0x0A, (uintptr_t)&fASL, eAccumulator);
	setIT(0x06, (uintptr_t)&fASL, eZeroPage);
	setIT(0x16, (uintptr_t)&fASL, eZeroPageIndexedX);
	setIT(0x0E, (uintptr_t)&fASL, eAbsolute);
	setIT(0x1E, (uintptr_t)&fASL, eAbsoluteIndexedX);
	//LSR(Addressing, address);
	setIT(0x4A, (uintptr_t)&fLSR, eAccumulator);
	setIT(0x46, (uintptr_t)&fLSR, eZeroPage);
	setIT(0x56, (uintptr_t)&fLSR, eZeroPageIndexedX);
	setIT(0x4E, (uintptr_t)&fLSR, eAbsolute);
	setIT(0x5E, (uintptr_t)&fLSR, eAbsoluteIndexedX);
	//ROL(Addressing, address);
	setIT(0x2A, (uintptr_t)&fROL, eAccumulator);
	setIT(0x26, (uintptr_t)&fROL, eZeroPage);
	setIT(0x36, (uintptr_t)&fROL, eZeroPageIndexedX);
	setIT(0x2E, (uintptr_t)&fROL, eAbsolute);
	setIT(0x3E, (uintptr_t)&fROL, eAbsoluteIndexedX);
	//ROR(Addressing, address);
	setIT(0x6A, (uintptr_t)&fROR, eAccumulator);
	setIT(0x66, (uintptr_t)&fROR, eZeroPage);
	setIT(0x76, (uintptr_t)&fROR, eZeroPageIndexedX);
	setIT(0x6E, (uintptr_t)&fROR, eAbsolute);
	setIT(0x7E, (uintptr_t)&fROR, eAbsoluteIndexedX);

	// Transfer Instructions
	//TAX(Addressing, address);
	setIT(0xAA, (uintptr_t)&fTAX, eImplied);
	//TAY(Addressing, address);
	setIT(0xA8, (uintptr_t)&fTAY, eImplied);
	//TXA(Addressing, address);
	setIT(0x8A, (uintptr_t)&fTXA, eImplied);
	//TYA(Addressing, address);
	setIT(0x98, (uintptr_t)&fTYA, eImplied);

	// Stack Instructions
	//TSX(Addressing, address);
	setIT(0xBA, (uintptr_t)&fTSX, eImplied);
	//TXS(Addressing, address);
	setIT(0x9A, (uintptr_t)&fTXS, eImplied);
	//PHA(Addressing, address);
	setIT(0x48, (uintptr_t)&fPHA, eImplied);
	//PHP(Addressing, address);
	setIT(0x08, (uintptr_t)&fPHP, eImplied);
	//PLA(Addressing, address);
	setIT(0x68, (uintptr_t)&fPLA, eImplied);
	//PLP(Addressing, address);
	setIT(0x28, (uintptr_t)&fPLP, eImplied);

	// Subroutine Instructions
	//JSR(Addressing, address);
	setIT(0x20, (uintptr_t)&fJSR, eAbsolute);
	//RTS(Addressing, address);
	setIT(0x60, (uintptr_t)&fRTS, eImplied);
	//RTI(Addressing, address);
	setIT(0x40, (uintptr_t)&fRTI, eImplied);

	// Set/Reset Insutrctions
	//CLC(Addressing, address);
	setIT(0x18, (uintptr_t)&fCLC, eImplied);
	//CLD(Addressing, address);
	setIT(0xD8, (uintptr_t)&fCLD, eImplied);
	//CLI(Addressing, address);
	setIT(0x58, (uintptr_t)&fCLI, eImplied);
	//CLV(Addressing, address);
	setIT(0xB8, (uintptr_t)&fCLV, eImplied);
	//SEC(Addressing, address);
	setIT(0x38, (uintptr_t)&fSEC, eImplied);
	//SED(Addressing, address);
	setIT(0xF8, (uintptr_t)&fSED, eImplied);
	//SEI(Addressing, address);
	setIT(0x78, (uintptr_t)&fSEI, eImplied);

	// NOP/BRK Instructions
	//NOP(Addressing, address);
	setIT(0xEA, (uintptr_t)&fNOP, eImplied);
	//BRK(Addressing, address);
	setIT(0x00, (uintptr_t)&fBRK, eImplied);
}