release r2, update credits
[fceu.git] / ops.h
CommitLineData
3ac1cc0b 1/* FCE Ultra - NES/Famicom Emulator\r
2 *\r
3 * Copyright notice for this file:\r
4 * Copyright (C) 2002 Xodnizel\r
5 *\r
6 * This program is free software; you can redistribute it and/or modify\r
7 * it under the terms of the GNU General Public License as published by\r
8 * the Free Software Foundation; either version 2 of the License, or\r
9 * (at your option) any later version.\r
10 *\r
11 * This program is distributed in the hope that it will be useful,\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
14 * GNU General Public License for more details.\r
15 *\r
16 * You should have received a copy of the GNU General Public License\r
17 * along with this program; if not, write to the Free Software\r
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
19 */\r
20\r
21case 0x00: /* BRK */\r
22 _PC++;\r
23 PUSH(_PC>>8);\r
24 PUSH(_PC);\r
25 PUSH(_P|U_FLAG|B_FLAG);\r
26 _P|=I_FLAG;\r
27 _PI|=I_FLAG;\r
28 _PC=RdMem(0xFFFE);\r
29 _PC|=RdMem(0xFFFF)<<8;\r
30 break;\r
31\r
32case 0x40: /* RTI */\r
33 _P=POP();\r
34 /* _PI=_P; This is probably incorrect, so it's commented out. */\r
35 _PI = _P;\r
36 _PC=POP();\r
37 _PC|=POP()<<8;\r
38 break;\r
39 \r
40case 0x60: /* RTS */\r
41 _PC=POP();\r
42 _PC|=POP()<<8;\r
43 _PC++;\r
44 break;\r
45\r
46case 0x48: /* PHA */\r
47 PUSH(_A);\r
48 break;\r
49case 0x08: /* PHP */\r
50 PUSH(_P|U_FLAG|B_FLAG);\r
51 break;\r
52case 0x68: /* PLA */\r
53 _A=POP();\r
54 X_ZN(_A);\r
55 break;\r
56case 0x28: /* PLP */\r
57 _P=POP();\r
58 break;\r
59case 0x4C:\r
60 {\r
61 uint16 ptmp=_PC;\r
62 unsigned int npc;\r
63\r
64 npc=RdMem(ptmp);\r
65 ptmp++;\r
66 npc|=RdMem(ptmp)<<8;\r
67 _PC=npc;\r
68 }\r
69 break; /* JMP ABSOLUTE */\r
70case 0x6C: \r
71 {\r
72 uint32 tmp;\r
73 GetAB(tmp);\r
74 _PC=RdMem(tmp);\r
75 _PC|=RdMem( ((tmp+1)&0x00FF) | (tmp&0xFF00))<<8;\r
76 }\r
77 break;\r
78case 0x20: /* JSR */\r
79 {\r
80 uint8 npc;\r
81 npc=RdMem(_PC);\r
82 _PC++;\r
83 PUSH(_PC>>8);\r
84 PUSH(_PC);\r
85 _PC=RdMem(_PC)<<8;\r
86 _PC|=npc;\r
87 }\r
88 break;\r
89\r
90case 0xAA: /* TAX */\r
91 _X=_A;\r
92 X_ZN(_A);\r
93 break;\r
94\r
95case 0x8A: /* TXA */\r
96 _A=_X;\r
97 X_ZN(_A);\r
98 break;\r
99\r
100case 0xA8: /* TAY */\r
101 _Y=_A;\r
102 X_ZN(_A);\r
103 break;\r
104case 0x98: /* TYA */\r
105 _A=_Y;\r
106 X_ZN(_A);\r
107 break;\r
108\r
109case 0xBA: /* TSX */\r
110 _X=_S;\r
111 X_ZN(_X);\r
112 break;\r
113case 0x9A: /* TXS */\r
114 _S=_X;\r
115 break;\r
116\r
117case 0xCA: /* DEX */\r
118 _X--;\r
119 X_ZN(_X);\r
120 break;\r
121case 0x88: /* DEY */\r
122 _Y--;\r
123 X_ZN(_Y);\r
124 break;\r
125\r
126case 0xE8: /* INX */\r
127 _X++;\r
128 X_ZN(_X);\r
129 break;\r
130case 0xC8: /* INY */\r
131 _Y++;\r
132 X_ZN(_Y);\r
133 break;\r
134\r
135case 0x18: /* CLC */\r
136 _P&=~C_FLAG;\r
137 break;\r
138case 0xD8: /* CLD */\r
139 _P&=~D_FLAG;\r
140 break;\r
141case 0x58: /* CLI */\r
142 _P&=~I_FLAG;\r
143 break;\r
144case 0xB8: /* CLV */\r
145 _P&=~V_FLAG;\r
146 break;\r
147\r
148case 0x38: /* SEC */\r
149 _P|=C_FLAG;\r
150 break;\r
151case 0xF8: /* SED */\r
152 _P|=D_FLAG;\r
153 break;\r
154case 0x78: /* SEI */\r
155 _P|=I_FLAG;\r
156 break;\r
157\r
158case 0xEA: /* NOP */\r
159 break;\r
160\r
161case 0x0A: RMW_A(ASL);\r
162case 0x06: RMW_ZP(ASL);\r
163case 0x16: RMW_ZPX(ASL);\r
164case 0x0E: RMW_AB(ASL);\r
165case 0x1E: RMW_ABX(ASL);\r
166\r
167case 0xC6: RMW_ZP(DEC);\r
168case 0xD6: RMW_ZPX(DEC);\r
169case 0xCE: RMW_AB(DEC);\r
170case 0xDE: RMW_ABX(DEC);\r
171\r
172case 0xE6: RMW_ZP(INC);\r
173case 0xF6: RMW_ZPX(INC);\r
174case 0xEE: RMW_AB(INC);\r
175case 0xFE: RMW_ABX(INC);\r
176\r
177case 0x4A: RMW_A(LSR);\r
178case 0x46: RMW_ZP(LSR);\r
179case 0x56: RMW_ZPX(LSR);\r
180case 0x4E: RMW_AB(LSR);\r
181case 0x5E: RMW_ABX(LSR);\r
182\r
183case 0x2A: RMW_A(ROL);\r
184case 0x26: RMW_ZP(ROL);\r
185case 0x36: RMW_ZPX(ROL);\r
186case 0x2E: RMW_AB(ROL);\r
187case 0x3E: RMW_ABX(ROL);\r
188\r
189case 0x6A: RMW_A(ROR);\r
190case 0x66: RMW_ZP(ROR);\r
191case 0x76: RMW_ZPX(ROR);\r
192case 0x6E: RMW_AB(ROR);\r
193case 0x7E: RMW_ABX(ROR);\r
194\r
195case 0x69: LD_IM(ADC);\r
196case 0x65: LD_ZP(ADC);\r
197case 0x75: LD_ZPX(ADC);\r
198case 0x6D: LD_AB(ADC);\r
199case 0x7D: LD_ABX(ADC);\r
200case 0x79: LD_ABY(ADC);\r
201case 0x61: LD_IX(ADC);\r
202case 0x71: LD_IY(ADC);\r
203\r
204case 0x29: LD_IM(AND);\r
205case 0x25: LD_ZP(AND);\r
206case 0x35: LD_ZPX(AND);\r
207case 0x2D: LD_AB(AND);\r
208case 0x3D: LD_ABX(AND);\r
209case 0x39: LD_ABY(AND);\r
210case 0x21: LD_IX(AND);\r
211case 0x31: LD_IY(AND);\r
212\r
213case 0x24: LD_ZP(BIT);\r
214case 0x2C: LD_AB(BIT);\r
215\r
216case 0xC9: LD_IM(CMP);\r
217case 0xC5: LD_ZP(CMP);\r
218case 0xD5: LD_ZPX(CMP);\r
219case 0xCD: LD_AB(CMP);\r
220case 0xDD: LD_ABX(CMP);\r
221case 0xD9: LD_ABY(CMP);\r
222case 0xC1: LD_IX(CMP);\r
223case 0xD1: LD_IY(CMP);\r
224\r
225case 0xE0: LD_IM(CPX);\r
226case 0xE4: LD_ZP(CPX);\r
227case 0xEC: LD_AB(CPX);\r
228\r
229case 0xC0: LD_IM(CPY);\r
230case 0xC4: LD_ZP(CPY);\r
231case 0xCC: LD_AB(CPY);\r
232\r
233case 0x49: LD_IM(EOR);\r
234case 0x45: LD_ZP(EOR);\r
235case 0x55: LD_ZPX(EOR);\r
236case 0x4D: LD_AB(EOR);\r
237case 0x5D: LD_ABX(EOR);\r
238case 0x59: LD_ABY(EOR);\r
239case 0x41: LD_IX(EOR);\r
240case 0x51: LD_IY(EOR);\r
241\r
242case 0xA9: LD_IM(LDA);\r
243case 0xA5: LD_ZP(LDA);\r
244case 0xB5: LD_ZPX(LDA);\r
245case 0xAD: LD_AB(LDA);\r
246case 0xBD: LD_ABX(LDA);\r
247case 0xB9: LD_ABY(LDA);\r
248case 0xA1: LD_IX(LDA);\r
249case 0xB1: LD_IY(LDA);\r
250\r
251case 0xA2: LD_IM(LDX);\r
252case 0xA6: LD_ZP(LDX);\r
253case 0xB6: LD_ZPY(LDX);\r
254case 0xAE: LD_AB(LDX);\r
255case 0xBE: LD_ABY(LDX);\r
256\r
257case 0xA0: LD_IM(LDY);\r
258case 0xA4: LD_ZP(LDY);\r
259case 0xB4: LD_ZPX(LDY);\r
260case 0xAC: LD_AB(LDY);\r
261case 0xBC: LD_ABX(LDY);\r
262\r
263case 0x09: LD_IM(ORA);\r
264case 0x05: LD_ZP(ORA);\r
265case 0x15: LD_ZPX(ORA);\r
266case 0x0D: LD_AB(ORA);\r
267case 0x1D: LD_ABX(ORA);\r
268case 0x19: LD_ABY(ORA);\r
269case 0x01: LD_IX(ORA);\r
270case 0x11: LD_IY(ORA);\r
271\r
272case 0xEB: /* (undocumented) */\r
273case 0xE9: LD_IM(SBC);\r
274case 0xE5: LD_ZP(SBC);\r
275case 0xF5: LD_ZPX(SBC);\r
276case 0xED: LD_AB(SBC);\r
277case 0xFD: LD_ABX(SBC);\r
278case 0xF9: LD_ABY(SBC);\r
279case 0xE1: LD_IX(SBC);\r
280case 0xF1: LD_IY(SBC);\r
281\r
282case 0x85: ST_ZP(_A);\r
283case 0x95: ST_ZPX(_A);\r
284case 0x8D: ST_AB(_A);\r
285case 0x9D: ST_ABX(_A);\r
286case 0x99: ST_ABY(_A);\r
287case 0x81: ST_IX(_A);\r
288case 0x91: ST_IY(_A);\r
289\r
290case 0x86: ST_ZP(_X);\r
291case 0x96: ST_ZPY(_X);\r
292case 0x8E: ST_AB(_X);\r
293\r
294case 0x84: ST_ZP(_Y);\r
295case 0x94: ST_ZPX(_Y);\r
296case 0x8C: ST_AB(_Y);\r
297\r
298/* BCC */\r
299case 0x90: JR(!(_P&C_FLAG)); break;\r
300\r
301/* BCS */\r
302case 0xB0: JR(_P&C_FLAG); break;\r
303\r
304/* BEQ */\r
305case 0xF0: JR(_P&Z_FLAG); break;\r
306\r
307/* BNE */\r
308case 0xD0: JR(!(_P&Z_FLAG)); break;\r
309\r
310/* BMI */\r
311case 0x30: JR(_P&N_FLAG); break;\r
312\r
313/* BPL */\r
314case 0x10: JR(!(_P&N_FLAG)); break;\r
315\r
316/* BVC */\r
317case 0x50: JR(!(_P&V_FLAG)); break;\r
318\r
319/* BVS */\r
320case 0x70: JR(_P&V_FLAG); break;\r
321\r
322//default: printf("Bad %02x at $%04x\n",b1,X.PC);break;\r
323//ifdef moo\r
324/* Here comes the undocumented instructions block. Note that this implementation\r
325 may be "wrong". If so, please tell me.\r
326*/\r
327\r
328/* AAC */\r
329case 0x2B:\r
330case 0x0B: LD_IM(AND;_P&=~C_FLAG;_P|=_A>>7);\r
331\r
332/* AAX */\r
333case 0x87: ST_ZP(_A&_X);\r
334case 0x97: ST_ZPY(_A&_X);\r
335case 0x8F: ST_AB(_A&_X);\r
336case 0x83: ST_IX(_A&_X);\r
337\r
338/* ARR - ARGH, MATEY! */\r
339case 0x6B: { \r
340 uint8 arrtmp; \r
341 LD_IM(AND;_P&=~V_FLAG;_P|=(_A^(_A>>1))&0x40;arrtmp=_A>>7;_A>>=1;_A|=(_P&C_FLAG)<<7;_P&=~C_FLAG;_P|=arrtmp;X_ZN(_A));\r
342 }\r
343/* ASR */\r
344case 0x4B: LD_IM(AND;LSRA);\r
345\r
346/* ATX(OAL) Is this(OR with $EE) correct? Blargg did some test\r
347 and found the constant to be OR with is $FF for NES */\r
348case 0xAB: LD_IM(_A|=0xFF;AND;_X=_A);\r
349\r
350/* AXS */ \r
351case 0xCB: LD_IM(AXS);\r
352\r
353/* DCP */\r
354case 0xC7: RMW_ZP(DEC;CMP);\r
355case 0xD7: RMW_ZPX(DEC;CMP);\r
356case 0xCF: RMW_AB(DEC;CMP);\r
357case 0xDF: RMW_ABX(DEC;CMP);\r
358case 0xDB: RMW_ABY(DEC;CMP);\r
359case 0xC3: RMW_IX(DEC;CMP);\r
360case 0xD3: RMW_IY(DEC;CMP);\r
361\r
362/* ISB */\r
363case 0xE7: RMW_ZP(INC;SBC);\r
364case 0xF7: RMW_ZPX(INC;SBC);\r
365case 0xEF: RMW_AB(INC;SBC);\r
366case 0xFF: RMW_ABX(INC;SBC);\r
367case 0xFB: RMW_ABY(INC;SBC);\r
368case 0xE3: RMW_IX(INC;SBC);\r
369case 0xF3: RMW_IY(INC;SBC);\r
370\r
371/* DOP */\r
372\r
373case 0x04: _PC++;break;\r
374case 0x14: _PC++;break;\r
375case 0x34: _PC++;break;\r
376case 0x44: _PC++;break;\r
377case 0x54: _PC++;break;\r
378case 0x64: _PC++;break;\r
379case 0x74: _PC++;break;\r
380\r
381case 0x80: _PC++;break;\r
382case 0x82: _PC++;break;\r
383case 0x89: _PC++;break;\r
384case 0xC2: _PC++;break;\r
385case 0xD4: _PC++;break;\r
386case 0xE2: _PC++;break;\r
387case 0xF4: _PC++;break;\r
388\r
389/* KIL */\r
390\r
391case 0x02:\r
392case 0x12:\r
393case 0x22:\r
394case 0x32:\r
395case 0x42:\r
396case 0x52:\r
397case 0x62:\r
398case 0x72:\r
399case 0x92:\r
400case 0xB2:\r
401case 0xD2:\r
402case 0xF2:ADDCYC(0xFF);\r
403 _jammed=1;\r
404 _PC--;\r
405 break;\r
406\r
407/* LAR */\r
408case 0xBB: RMW_ABY(_S&=x;_A=_X=_S;X_ZN(_X));\r
409\r
410/* LAX */\r
411case 0xA7: LD_ZP(LDA;LDX);\r
412case 0xB7: LD_ZPY(LDA;LDX);\r
413case 0xAF: LD_AB(LDA;LDX);\r
414case 0xBF: LD_ABY(LDA;LDX);\r
415case 0xA3: LD_IX(LDA;LDX);\r
416case 0xB3: LD_IY(LDA;LDX);\r
417\r
418/* NOP */\r
419case 0x1A:\r
420case 0x3A:\r
421case 0x5A:\r
422case 0x7A:\r
423case 0xDA:\r
424case 0xFA: break;\r
425\r
426/* RLA */\r
427case 0x27: RMW_ZP(ROL;AND);\r
428case 0x37: RMW_ZPX(ROL;AND);\r
429case 0x2F: RMW_AB(ROL;AND);\r
430case 0x3F: RMW_ABX(ROL;AND);\r
431case 0x3B: RMW_ABY(ROL;AND);\r
432case 0x23: RMW_IX(ROL;AND);\r
433case 0x33: RMW_IY(ROL;AND);\r
434\r
435/* RRA */\r
436case 0x67: RMW_ZP(ROR;ADC);\r
437case 0x77: RMW_ZPX(ROR;ADC);\r
438case 0x6F: RMW_AB(ROR;ADC);\r
439case 0x7F: RMW_ABX(ROR;ADC);\r
440case 0x7B: RMW_ABY(ROR;ADC);\r
441case 0x63: RMW_IX(ROR;ADC);\r
442case 0x73: RMW_IY(ROR;ADC);\r
443\r
444/* SLO */\r
445case 0x07: RMW_ZP(ASL;ORA);\r
446case 0x17: RMW_ZPX(ASL;ORA);\r
447case 0x0F: RMW_AB(ASL;ORA);\r
448case 0x1F: RMW_ABX(ASL;ORA);\r
449case 0x1B: RMW_ABY(ASL;ORA);\r
450case 0x03: RMW_IX(ASL;ORA);\r
451case 0x13: RMW_IY(ASL;ORA);\r
452\r
453/* SRE */\r
454case 0x47: RMW_ZP(LSR;EOR);\r
455case 0x57: RMW_ZPX(LSR;EOR);\r
456case 0x4F: RMW_AB(LSR;EOR);\r
457case 0x5F: RMW_ABX(LSR;EOR);\r
458case 0x5B: RMW_ABY(LSR;EOR);\r
459case 0x43: RMW_IX(LSR;EOR);\r
460case 0x53: RMW_IY(LSR;EOR);\r
461\r
462/* AXA - SHA */\r
463case 0x93: ST_IY(_A&_X&(((A-_Y)>>8)+1));\r
464case 0x9F: ST_ABY(_A&_X&(((A-_Y)>>8)+1));\r
465\r
466/* SYA */\r
467case 0x9C: ST_ABX(_Y&(((A-_X)>>8)+1));\r
468\r
469/* SXA */\r
470case 0x9E: ST_ABY(_X&(((A-_Y)>>8)+1));\r
471\r
472/* XAS */\r
473case 0x9B: _S=_A&_X;ST_ABY(_S& (((A-_Y)>>8)+1) );\r
474\r
475/* TOP */\r
476case 0x0C: LD_AB(;);\r
477case 0x1C: \r
478case 0x3C: \r
479case 0x5C: \r
480case 0x7C: \r
481case 0xDC: \r
482case 0xFC: LD_ABX(;);\r
483\r
484/* XAA - BIG QUESTION MARK HERE */\r
485case 0x8B: _A|=0xEE; _A&=_X; LD_IM(AND);\r
486//endif\r