/[VRac]/M6502/Codes.h
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /M6502/Codes.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 23 - (show annotations)
Mon Jul 30 10:49:26 2007 UTC (16 years, 9 months ago) by dpavlin
File MIME type: text/plain
File size: 11492 byte(s)
import upstream M6502-010807.zip from http://fms.komkon.org/EMUL8/
1 /** M6502: portable 6502 emulator ****************************/
2 /** **/
3 /** Codes.h **/
4 /** **/
5 /** This file contains implementation for the main table of **/
6 /** 6502 commands. It is included from 6502.c. **/
7 /** **/
8 /** Copyright (C) Marat Fayzullin 1996-2007 **/
9 /** Alex Krasivsky 1996 **/
10 /** You are not allowed to distribute this software **/
11 /** commercially. Please, notify me, if you make any **/
12 /** changes to this file. **/
13 /*************************************************************/
14
15 case 0x10: if(R->P&N_FLAG) R->PC.W++; else { M_JR; } break; /* BPL * REL */
16 case 0x30: if(R->P&N_FLAG) { M_JR; } else R->PC.W++; break; /* BMI * REL */
17 case 0xD0: if(R->P&Z_FLAG) R->PC.W++; else { M_JR; } break; /* BNE * REL */
18 case 0xF0: if(R->P&Z_FLAG) { M_JR; } else R->PC.W++; break; /* BEQ * REL */
19 case 0x90: if(R->P&C_FLAG) R->PC.W++; else { M_JR; } break; /* BCC * REL */
20 case 0xB0: if(R->P&C_FLAG) { M_JR; } else R->PC.W++; break; /* BCS * REL */
21 case 0x50: if(R->P&V_FLAG) R->PC.W++; else { M_JR; } break; /* BVC * REL */
22 case 0x70: if(R->P&V_FLAG) { M_JR; } else R->PC.W++; break; /* BVS * REL */
23
24 /* RTI */
25 case 0x40:
26 M_POP(R->P);R->P|=R_FLAG;M_POP(R->PC.B.l);M_POP(R->PC.B.h);
27 break;
28
29 /* RTS */
30 case 0x60:
31 M_POP(R->PC.B.l);M_POP(R->PC.B.h);R->PC.W++;break;
32
33 /* JSR $ssss ABS */
34 case 0x20:
35 K.B.l=Op6502(R->PC.W++);
36 K.B.h=Op6502(R->PC.W);
37 M_PUSH(R->PC.B.h);
38 M_PUSH(R->PC.B.l);
39 R->PC=K;break;
40
41 /* JMP $ssss ABS */
42 case 0x4C: M_LDWORD(K);R->PC=K;break;
43
44 /* JMP ($ssss) ABDINDIR */
45 case 0x6C:
46 M_LDWORD(K);
47 R->PC.B.l=Rd6502(K.W);
48 K.B.l++;
49 R->PC.B.h=Rd6502(K.W);
50 break;
51
52 /* BRK */
53 case 0x00:
54 R->PC.W++;
55 M_PUSH(R->PC.B.h);M_PUSH(R->PC.B.l);
56 M_PUSH(R->P|B_FLAG);
57 R->P=(R->P|I_FLAG)&~D_FLAG;
58 R->PC.B.l=Rd6502(0xFFFE);
59 R->PC.B.h=Rd6502(0xFFFF);
60 break;
61
62 /* CLI */
63 case 0x58:
64 if((R->IRequest!=INT_NONE)&&(R->P&I_FLAG))
65 {
66 R->AfterCLI=1;
67 R->IBackup=R->ICount;
68 R->ICount=1;
69 }
70 R->P&=~I_FLAG;
71 break;
72
73 /* PLP */
74 case 0x28:
75 M_POP(I);
76 if((R->IRequest!=INT_NONE)&&((I^R->P)&~I&I_FLAG))
77 {
78 R->AfterCLI=1;
79 R->IBackup=R->ICount;
80 R->ICount=1;
81 }
82 R->P=I|R_FLAG|B_FLAG;
83 break;
84
85 case 0x08: M_PUSH(R->P);break; /* PHP */
86 case 0x18: R->P&=~C_FLAG;break; /* CLC */
87 case 0xB8: R->P&=~V_FLAG;break; /* CLV */
88 case 0xD8: R->P&=~D_FLAG;break; /* CLD */
89 case 0x38: R->P|=C_FLAG;break; /* SEC */
90 case 0xF8: R->P|=D_FLAG;break; /* SED */
91 case 0x78: R->P|=I_FLAG;break; /* SEI */
92 case 0x48: M_PUSH(R->A);break; /* PHA */
93 case 0x68: M_POP(R->A);M_FL(R->A);break; /* PLA */
94 case 0x98: R->A=R->Y;M_FL(R->A);break; /* TYA */
95 case 0xA8: R->Y=R->A;M_FL(R->Y);break; /* TAY */
96 case 0xC8: R->Y++;M_FL(R->Y);break; /* INY */
97 case 0x88: R->Y--;M_FL(R->Y);break; /* DEY */
98 case 0x8A: R->A=R->X;M_FL(R->A);break; /* TXA */
99 case 0xAA: R->X=R->A;M_FL(R->X);break; /* TAX */
100 case 0xE8: R->X++;M_FL(R->X);break; /* INX */
101 case 0xCA: R->X--;M_FL(R->X);break; /* DEX */
102 case 0xEA: break; /* NOP */
103 case 0x9A: R->S=R->X;break; /* TXS */
104 case 0xBA: R->X=R->S;M_FL(R->X);break; /* TSX */
105
106 case 0x24: MR_Zp(I);M_BIT(I);break; /* BIT $ss ZP */
107 case 0x2C: MR_Ab(I);M_BIT(I);break; /* BIT $ssss ABS */
108
109 case 0x05: MR_Zp(I);M_ORA(I);break; /* ORA $ss ZP */
110 case 0x06: MM_Zp(M_ASL);break; /* ASL $ss ZP */
111 case 0x25: MR_Zp(I);M_AND(I);break; /* AND $ss ZP */
112 case 0x26: MM_Zp(M_ROL);break; /* ROL $ss ZP */
113 case 0x45: MR_Zp(I);M_EOR(I);break; /* EOR $ss ZP */
114 case 0x46: MM_Zp(M_LSR);break; /* LSR $ss ZP */
115 case 0x65: MR_Zp(I);M_ADC(I);break; /* ADC $ss ZP */
116 case 0x66: MM_Zp(M_ROR);break; /* ROR $ss ZP */
117 case 0x84: MW_Zp(R->Y);break; /* STY $ss ZP */
118 case 0x85: MW_Zp(R->A);break; /* STA $ss ZP */
119 case 0x86: MW_Zp(R->X);break; /* STX $ss ZP */
120 case 0xA4: MR_Zp(R->Y);M_FL(R->Y);break; /* LDY $ss ZP */
121 case 0xA5: MR_Zp(R->A);M_FL(R->A);break; /* LDA $ss ZP */
122 case 0xA6: MR_Zp(R->X);M_FL(R->X);break; /* LDX $ss ZP */
123 case 0xC4: MR_Zp(I);M_CMP(R->Y,I);break; /* CPY $ss ZP */
124 case 0xC5: MR_Zp(I);M_CMP(R->A,I);break; /* CMP $ss ZP */
125 case 0xC6: MM_Zp(M_DEC);break; /* DEC $ss ZP */
126 case 0xE4: MR_Zp(I);M_CMP(R->X,I);break; /* CPX $ss ZP */
127 case 0xE5: MR_Zp(I);M_SBC(I);break; /* SBC $ss ZP */
128 case 0xE6: MM_Zp(M_INC);break; /* INC $ss ZP */
129
130 case 0x0D: MR_Ab(I);M_ORA(I);break; /* ORA $ssss ABS */
131 case 0x0E: MM_Ab(M_ASL);break; /* ASL $ssss ABS */
132 case 0x2D: MR_Ab(I);M_AND(I);break; /* AND $ssss ABS */
133 case 0x2E: MM_Ab(M_ROL);break; /* ROL $ssss ABS */
134 case 0x4D: MR_Ab(I);M_EOR(I);break; /* EOR $ssss ABS */
135 case 0x4E: MM_Ab(M_LSR);break; /* LSR $ssss ABS */
136 case 0x6D: MR_Ab(I);M_ADC(I);break; /* ADC $ssss ABS */
137 case 0x6E: MM_Ab(M_ROR);break; /* ROR $ssss ABS */
138 case 0x8C: MW_Ab(R->Y);break; /* STY $ssss ABS */
139 case 0x8D: MW_Ab(R->A);break; /* STA $ssss ABS */
140 case 0x8E: MW_Ab(R->X);break; /* STX $ssss ABS */
141 case 0xAC: MR_Ab(R->Y);M_FL(R->Y);break; /* LDY $ssss ABS */
142 case 0xAD: MR_Ab(R->A);M_FL(R->A);break; /* LDA $ssss ABS */
143 case 0xAE: MR_Ab(R->X);M_FL(R->X);break; /* LDX $ssss ABS */
144 case 0xCC: MR_Ab(I);M_CMP(R->Y,I);break; /* CPY $ssss ABS */
145 case 0xCD: MR_Ab(I);M_CMP(R->A,I);break; /* CMP $ssss ABS */
146 case 0xCE: MM_Ab(M_DEC);break; /* DEC $ssss ABS */
147 case 0xEC: MR_Ab(I);M_CMP(R->X,I);break; /* CPX $ssss ABS */
148 case 0xED: MR_Ab(I);M_SBC(I);break; /* SBC $ssss ABS */
149 case 0xEE: MM_Ab(M_INC);break; /* INC $ssss ABS */
150
151 case 0x09: MR_Im(I);M_ORA(I);break; /* ORA #$ss IMM */
152 case 0x29: MR_Im(I);M_AND(I);break; /* AND #$ss IMM */
153 case 0x49: MR_Im(I);M_EOR(I);break; /* EOR #$ss IMM */
154 case 0x69: MR_Im(I);M_ADC(I);break; /* ADC #$ss IMM */
155 case 0xA0: MR_Im(R->Y);M_FL(R->Y);break; /* LDY #$ss IMM */
156 case 0xA2: MR_Im(R->X);M_FL(R->X);break; /* LDX #$ss IMM */
157 case 0xA9: MR_Im(R->A);M_FL(R->A);break; /* LDA #$ss IMM */
158 case 0xC0: MR_Im(I);M_CMP(R->Y,I);break; /* CPY #$ss IMM */
159 case 0xC9: MR_Im(I);M_CMP(R->A,I);break; /* CMP #$ss IMM */
160 case 0xE0: MR_Im(I);M_CMP(R->X,I);break; /* CPX #$ss IMM */
161 case 0xE9: MR_Im(I);M_SBC(I);break; /* SBC #$ss IMM */
162
163 case 0x15: MR_Zx(I);M_ORA(I);break; /* ORA $ss,x ZP,x */
164 case 0x16: MM_Zx(M_ASL);break; /* ASL $ss,x ZP,x */
165 case 0x35: MR_Zx(I);M_AND(I);break; /* AND $ss,x ZP,x */
166 case 0x36: MM_Zx(M_ROL);break; /* ROL $ss,x ZP,x */
167 case 0x55: MR_Zx(I);M_EOR(I);break; /* EOR $ss,x ZP,x */
168 case 0x56: MM_Zx(M_LSR);break; /* LSR $ss,x ZP,x */
169 case 0x75: MR_Zx(I);M_ADC(I);break; /* ADC $ss,x ZP,x */
170 case 0x76: MM_Zx(M_ROR);break; /* ROR $ss,x ZP,x */
171 case 0x94: MW_Zx(R->Y);break; /* STY $ss,x ZP,x */
172 case 0x95: MW_Zx(R->A);break; /* STA $ss,x ZP,x */
173 case 0x96: MW_Zy(R->X);break; /* STX $ss,y ZP,y */
174 case 0xB4: MR_Zx(R->Y);M_FL(R->Y);break; /* LDY $ss,x ZP,x */
175 case 0xB5: MR_Zx(R->A);M_FL(R->A);break; /* LDA $ss,x ZP,x */
176 case 0xB6: MR_Zy(R->X);M_FL(R->X);break; /* LDX $ss,y ZP,y */
177 case 0xD5: MR_Zx(I);M_CMP(R->A,I);break; /* CMP $ss,x ZP,x */
178 case 0xD6: MM_Zx(M_DEC);break; /* DEC $ss,x ZP,x */
179 case 0xF5: MR_Zx(I);M_SBC(I);break; /* SBC $ss,x ZP,x */
180 case 0xF6: MM_Zx(M_INC);break; /* INC $ss,x ZP,x */
181
182 case 0x19: MR_Ay(I);M_ORA(I);break; /* ORA $ssss,y ABS,y */
183 case 0x1D: MR_Ax(I);M_ORA(I);break; /* ORA $ssss,x ABS,x */
184 case 0x1E: MM_Ax(M_ASL);break; /* ASL $ssss,x ABS,x */
185 case 0x39: MR_Ay(I);M_AND(I);break; /* AND $ssss,y ABS,y */
186 case 0x3D: MR_Ax(I);M_AND(I);break; /* AND $ssss,x ABS,x */
187 case 0x3E: MM_Ax(M_ROL);break; /* ROL $ssss,x ABS,x */
188 case 0x59: MR_Ay(I);M_EOR(I);break; /* EOR $ssss,y ABS,y */
189 case 0x5D: MR_Ax(I);M_EOR(I);break; /* EOR $ssss,x ABS,x */
190 case 0x5E: MM_Ax(M_LSR);break; /* LSR $ssss,x ABS,x */
191 case 0x79: MR_Ay(I);M_ADC(I);break; /* ADC $ssss,y ABS,y */
192 case 0x7D: MR_Ax(I);M_ADC(I);break; /* ADC $ssss,x ABS,x */
193 case 0x7E: MM_Ax(M_ROR);break; /* ROR $ssss,x ABS,x */
194 case 0x99: MW_Ay(R->A);break; /* STA $ssss,y ABS,y */
195 case 0x9D: MW_Ax(R->A);break; /* STA $ssss,x ABS,x */
196 case 0xB9: MR_Ay(R->A);M_FL(R->A);break; /* LDA $ssss,y ABS,y */
197 case 0xBC: MR_Ax(R->Y);M_FL(R->Y);break; /* LDY $ssss,x ABS,x */
198 case 0xBD: MR_Ax(R->A);M_FL(R->A);break; /* LDA $ssss,x ABS,x */
199 case 0xBE: MR_Ay(R->X);M_FL(R->X);break; /* LDX $ssss,y ABS,y */
200 case 0xD9: MR_Ay(I);M_CMP(R->A,I);break; /* CMP $ssss,y ABS,y */
201 case 0xDD: MR_Ax(I);M_CMP(R->A,I);break; /* CMP $ssss,x ABS,x */
202 case 0xDE: MM_Ax(M_DEC);break; /* DEC $ssss,x ABS,x */
203 case 0xF9: MR_Ay(I);M_SBC(I);break; /* SBC $ssss,y ABS,y */
204 case 0xFD: MR_Ax(I);M_SBC(I);break; /* SBC $ssss,x ABS,x */
205 case 0xFE: MM_Ax(M_INC);break; /* INC $ssss,x ABS,x */
206
207 case 0x01: MR_Ix(I);M_ORA(I);break; /* ORA ($ss,x) INDEXINDIR */
208 case 0x11: MR_Iy(I);M_ORA(I);break; /* ORA ($ss),y INDIRINDEX */
209 case 0x21: MR_Ix(I);M_AND(I);break; /* AND ($ss,x) INDEXINDIR */
210 case 0x31: MR_Iy(I);M_AND(I);break; /* AND ($ss),y INDIRINDEX */
211 case 0x41: MR_Ix(I);M_EOR(I);break; /* EOR ($ss,x) INDEXINDIR */
212 case 0x51: MR_Iy(I);M_EOR(I);break; /* EOR ($ss),y INDIRINDEX */
213 case 0x61: MR_Ix(I);M_ADC(I);break; /* ADC ($ss,x) INDEXINDIR */
214 case 0x71: MR_Iy(I);M_ADC(I);break; /* ADC ($ss),y INDIRINDEX */
215 case 0x81: MW_Ix(R->A);break; /* STA ($ss,x) INDEXINDIR */
216 case 0x91: MW_Iy(R->A);break; /* STA ($ss),y INDIRINDEX */
217 case 0xA1: MR_Ix(R->A);M_FL(R->A);break; /* LDA ($ss,x) INDEXINDIR */
218 case 0xB1: MR_Iy(R->A);M_FL(R->A);break; /* LDA ($ss),y INDIRINDEX */
219 case 0xC1: MR_Ix(I);M_CMP(R->A,I);break; /* CMP ($ss,x) INDEXINDIR */
220 case 0xD1: MR_Iy(I);M_CMP(R->A,I);break; /* CMP ($ss),y INDIRINDEX */
221 case 0xE1: MR_Ix(I);M_SBC(I);break; /* SBC ($ss,x) INDEXINDIR */
222 case 0xF1: MR_Iy(I);M_SBC(I);break; /* SBC ($ss),y INDIRINDEX */
223
224 case 0x0A: M_ASL(R->A);break; /* ASL a ACC */
225 case 0x2A: M_ROL(R->A);break; /* ROL a ACC */
226 case 0x4A: M_LSR(R->A);break; /* LSR a ACC */
227 case 0x6A: M_ROR(R->A);break; /* ROR a ACC */
228
229 default:
230 /* Try to execute a patch function. If it fails, treat */
231 /* the opcode as undefined. */
232 if(!Patch6502(Op6502(R->PC.W-1),R))
233 if(R->TrapBadOps)
234 printf
235 (
236 "[M6502 %lX] Unrecognized instruction: $%02X at PC=$%04X\n",
237 (unsigned long)(R->User),Op6502(R->PC.W-1),(word)(R->PC.W-1)
238 );
239 break;

  ViewVC Help
Powered by ViewVC 1.1.26