Implement 386 instruction table, improve 8086/186/286 instruction table
[multi_emu.git] / cpu_6800.c
1 #include <stdbool.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "cpu_6800.h"
5
6 // initialization
7 void cpu_6800_init(
8   struct cpu_6800 *self,
9   int (*read_byte)(void *context, int addr),
10   void *read_byte_context,
11   void (*write_byte)(void *context, int addr, int data),
12   void *write_byte_context
13 ) {
14   memset(self, 0, sizeof(struct cpu_6800));
15   self->regs.byte.p = 0xc0; // unused bits are hard coded to 1
16   self->read_byte = read_byte;
17   self->read_byte_context = read_byte_context;
18   self->write_byte = write_byte;
19   self->write_byte_context = write_byte_context;
20 }
21
22 void cpu_6800_reset(struct cpu_6800 *self) {
23   self->regs.word.pc = cpu_6800_read_word(self, CPU_6800_RESET_VECTOR);
24   self->regs.byte.iflags = 0;
25   self->regs.bit._if = true;
26 }
27
28 // instruction decode
29 void cpu_6800_execute(struct cpu_6800 *self) {
30   if (self->regs.bit.nmi_pending) {
31     self->regs.bit.nmi_pending = false;
32     if (!self->regs.bit.wai_flag)
33       cpu_6800_wai(self);
34     self->regs.bit.wai_flag = false;
35     self->regs.word.pc = cpu_6800_read_word(self, CPU_6800_NMI_VECTOR);
36     self->regs.bit._if = true;
37     return;
38   }
39
40   if (self->regs.bit.irq_pending && !self->regs.bit._if) {
41     self->regs.bit.irq_pending = false;
42     if (!self->regs.bit.wai_flag)
43       cpu_6800_wai(self);
44     self->regs.bit.wai_flag = false;
45     self->regs.word.pc = cpu_6800_read_word(self, CPU_6800_IRQ_VECTOR);
46     self->regs.bit._if = true;
47     return;
48   }
49
50   if (self->regs.bit.wai_flag) {
51     ++self->cycles;
52     return;
53   }
54
55   switch (cpu_6800_fetch_byte(self)) {
56   case 0x00:
57     cpu_6800_illegal_opcode(self);
58     break;
59   case 0x01:
60     cpu_6800_nop(self);
61     break;
62   case 0x02:
63     cpu_6800_illegal_opcode(self);
64     break;
65   case 0x03:
66     cpu_6800_illegal_opcode(self);
67     break;
68   case 0x04:
69     cpu_6800_illegal_opcode(self);
70     break;
71   case 0x05:
72     cpu_6800_illegal_opcode(self);
73     break;
74   case 0x06:
75     cpu_6800_tap(self);
76     break;
77   case 0x07:
78     cpu_6800_tpa(self);
79     break;
80   case 0x08:
81     cpu_6800_inc_word_zf(self, CPU_6800_EA_X);
82     break;
83   case 0x09:
84     cpu_6800_dec_word_zf(self, CPU_6800_EA_X);
85     break;
86   case 0x0a:
87     cpu_6800_cl(self, CPU_6800_REG_P_BIT_V);
88     break;
89   case 0x0b:
90     cpu_6800_se(self, CPU_6800_REG_P_BIT_V);
91     break;
92   case 0x0c:
93     cpu_6800_cl(self, CPU_6800_REG_P_BIT_C);
94     break;
95   case 0x0d:
96     cpu_6800_se(self, CPU_6800_REG_P_BIT_C);
97     break;
98   case 0x0e:
99     cpu_6800_cl(self, CPU_6800_REG_P_BIT_I);
100     break;
101   case 0x0f:
102     cpu_6800_se(self, CPU_6800_REG_P_BIT_I);
103     break;
104   case 0x10:
105     cpu_6800_sub(self, CPU_6800_EA_A, self->regs.byte.b);
106     break;
107   case 0x11:
108     cpu_6800_cmp_byte(self, self->regs.byte.a, self->regs.byte.b);
109     break;
110   case 0x12:
111     cpu_6800_illegal_opcode(self);
112     break;
113   case 0x13:
114     cpu_6800_illegal_opcode(self);
115     break;
116   case 0x14:
117     cpu_6800_illegal_opcode(self);
118     break;
119   case 0x15:
120     cpu_6800_illegal_opcode(self);
121     break;
122   case 0x16:
123     cpu_6800_ld_byte(self, CPU_6800_EA_B, self->regs.byte.a);
124     break;
125   case 0x17:
126     cpu_6800_ld_byte(self, CPU_6800_EA_A, self->regs.byte.b);
127     break;
128   case 0x18:
129     cpu_6800_illegal_opcode(self);
130     break;
131   case 0x19:
132     cpu_6800_daa(self);
133     break;
134   case 0x1a:
135     cpu_6800_illegal_opcode(self);
136     break;
137   case 0x1b:
138     cpu_6800_add(self, CPU_6800_EA_A, self->regs.byte.b);
139     break;
140   case 0x1c:
141     cpu_6800_illegal_opcode(self);
142     break;
143   case 0x1d:
144     cpu_6800_illegal_opcode(self);
145     break;
146   case 0x1e:
147     cpu_6800_illegal_opcode(self);
148     break;
149   case 0x1f:
150     cpu_6800_illegal_opcode(self);
151     break;
152   case 0x20:
153     cpu_6800_bra(self, true, cpu_6800_ea_relative(self));
154     break;
155   case 0x21:
156     cpu_6800_illegal_opcode(self);
157     break;
158   case 0x22:
159     cpu_6800_bra(self, !self->regs.bit.cf && !self->regs.bit.zf, cpu_6800_ea_relative(self));
160     break;
161   case 0x23:
162     cpu_6800_bra(self, self->regs.bit.cf || self->regs.bit.zf, cpu_6800_ea_relative(self));
163     break;
164   case 0x24:
165     cpu_6800_bra(self, !self->regs.bit.cf, cpu_6800_ea_relative(self));
166     break;
167   case 0x25:
168     cpu_6800_bra(self, self->regs.bit.cf, cpu_6800_ea_relative(self));
169     break;
170   case 0x26:
171     cpu_6800_bra(self, !self->regs.bit.zf, cpu_6800_ea_relative(self));
172     break;
173   case 0x27:
174     cpu_6800_bra(self, self->regs.bit.zf, cpu_6800_ea_relative(self));
175     break;
176   case 0x28:
177     cpu_6800_bra(self, !self->regs.bit.vf, cpu_6800_ea_relative(self));
178     break;
179   case 0x29:
180     cpu_6800_bra(self, self->regs.bit.vf, cpu_6800_ea_relative(self));
181     break;
182   case 0x2a:
183     cpu_6800_bra(self, !self->regs.bit.nf, cpu_6800_ea_relative(self));
184     break;
185   case 0x2b:
186     cpu_6800_bra(self, self->regs.bit.nf, cpu_6800_ea_relative(self));
187     break;
188   case 0x2c:
189     cpu_6800_bra(self, !self->regs.bit.nf && !self->regs.bit.vf, cpu_6800_ea_relative(self));
190     break;
191   case 0x2d:
192     cpu_6800_bra(self, self->regs.bit.nf || self->regs.bit.vf, cpu_6800_ea_relative(self));
193     break;
194   case 0x2e:
195     cpu_6800_bra(self, !self->regs.bit.nf && !self->regs.bit.vf && !self->regs.bit.zf, cpu_6800_ea_relative(self));
196     break;
197   case 0x2f:
198     cpu_6800_bra(self, self->regs.bit.nf || self->regs.bit.vf || self->regs.bit.zf, cpu_6800_ea_relative(self));
199     break;
200   case 0x30:
201     cpu_6800_tsx(self);
202     break;
203   case 0x31:
204     cpu_6800_inc_word(self, CPU_6800_EA_S);
205     break;
206   case 0x32:
207     cpu_6800_pul(self, CPU_6800_EA_A);
208     break;
209   case 0x33:
210     cpu_6800_pul(self, CPU_6800_EA_B);
211     break;
212   case 0x34:
213     cpu_6800_dec_word(self, CPU_6800_EA_S);
214     break;
215   case 0x35:
216     cpu_6800_txs(self);
217     break;
218   case 0x36:
219     cpu_6800_psh(self, self->regs.byte.a);
220     break;
221   case 0x37:
222     cpu_6800_psh(self, self->regs.byte.b);
223     break;
224   case 0x38:
225     cpu_6800_illegal_opcode(self);
226     break;
227   case 0x39:
228     cpu_6800_rts(self);
229     break;
230   case 0x3a:
231     cpu_6800_illegal_opcode(self);
232     break;
233   case 0x3b:
234     cpu_6800_rti(self);
235     break;
236   case 0x3c:
237     cpu_6800_illegal_opcode(self);
238     break;
239   case 0x3d:
240     cpu_6800_illegal_opcode(self);
241     break;
242   case 0x3e:
243     cpu_6800_wai(self);
244     break;
245   case 0x3f:
246     cpu_6800_swi(self);
247     break;
248   case 0x40:
249     cpu_6800_neg(self, CPU_6800_EA_A);
250     break;
251   case 0x41:
252     cpu_6800_illegal_opcode(self);
253     break;
254   case 0x42:
255     cpu_6800_illegal_opcode(self);
256     break;
257   case 0x43:
258     cpu_6800_com(self, CPU_6800_EA_A);
259     break;
260   case 0x44:
261     cpu_6800_lsr(self, CPU_6800_EA_A);
262     break;
263   case 0x45:
264     cpu_6800_illegal_opcode(self);
265     break;
266   case 0x46:
267     cpu_6800_ror(self, CPU_6800_EA_A);
268     break;
269   case 0x47:
270     cpu_6800_asr(self, CPU_6800_EA_A);
271     break;
272   case 0x48:
273     cpu_6800_asl(self, CPU_6800_EA_A);
274     break;
275   case 0x49:
276     cpu_6800_rol(self, CPU_6800_EA_A);
277     break;
278   case 0x4a:
279     cpu_6800_dec_byte(self, CPU_6800_EA_A);
280     break;
281   case 0x4b:
282     cpu_6800_illegal_opcode(self);
283     break;
284   case 0x4c:
285     cpu_6800_inc_byte(self, CPU_6800_EA_A);
286     break;
287   case 0x4d:
288     cpu_6800_cmp_byte(self, self->regs.byte.a, 0);
289     break;
290   case 0x4e:
291     cpu_6800_illegal_opcode(self);
292     break;
293   case 0x4f:
294     cpu_6800_clr(self, CPU_6800_EA_A);
295     break;
296   case 0x50:
297     cpu_6800_neg(self, CPU_6800_EA_B);
298     break;
299   case 0x51:
300     cpu_6800_illegal_opcode(self);
301     break;
302   case 0x52:
303     cpu_6800_illegal_opcode(self);
304     break;
305   case 0x53:
306     cpu_6800_com(self, CPU_6800_EA_B);
307     break;
308   case 0x54:
309     cpu_6800_lsr(self, CPU_6800_EA_B);
310     break;
311   case 0x55:
312     cpu_6800_illegal_opcode(self);
313     break;
314   case 0x56:
315     cpu_6800_ror(self, CPU_6800_EA_B);
316     break;
317   case 0x57:
318     cpu_6800_asr(self, CPU_6800_EA_B);
319     break;
320   case 0x58:
321     cpu_6800_asl(self, CPU_6800_EA_B);
322     break;
323   case 0x59:
324     cpu_6800_rol(self, CPU_6800_EA_B);
325     break;
326   case 0x5a:
327     cpu_6800_dec_byte(self, CPU_6800_EA_B);
328     break;
329   case 0x5b:
330     cpu_6800_illegal_opcode(self);
331     break;
332   case 0x5c:
333     cpu_6800_inc_byte(self, CPU_6800_EA_B);
334     break;
335   case 0x5d:
336     cpu_6800_cmp_byte(self, self->regs.byte.b, 0);
337     break;
338   case 0x5e:
339     cpu_6800_illegal_opcode(self);
340     break;
341   case 0x5f:
342     cpu_6800_clr(self, CPU_6800_EA_B);
343     break;
344   case 0x60:
345     cpu_6800_neg(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
346     break;
347   case 0x61:
348     cpu_6800_illegal_opcode(self);
349     break;
350   case 0x62:
351     cpu_6800_illegal_opcode(self);
352     break;
353   case 0x63:
354     cpu_6800_com(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
355     break;
356   case 0x64:
357     cpu_6800_lsr(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
358     break;
359   case 0x65:
360     cpu_6800_illegal_opcode(self);
361     break;
362   case 0x66:
363     cpu_6800_ror(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
364     break;
365   case 0x67:
366     cpu_6800_asr(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
367     break;
368   case 0x68:
369     cpu_6800_asl(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
370     break;
371   case 0x69:
372     cpu_6800_rol(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
373     break;
374   case 0x6a:
375     cpu_6800_dec_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
376     break;
377   case 0x6b:
378     cpu_6800_illegal_opcode(self);
379     break;
380   case 0x6c:
381     cpu_6800_inc_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
382     break;
383   case 0x6d:
384     cpu_6800_cmp_byte(self, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)), 0);
385     break;
386   case 0x6e:
387     cpu_6800_jmp(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
388     break;
389   case 0x6f:
390     cpu_6800_clr(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
391     break;
392   case 0x70:
393     cpu_6800_neg(self, cpu_6800_ea_extended(self));
394     break;
395   case 0x71:
396     cpu_6800_illegal_opcode(self);
397     break;
398   case 0x72:
399     cpu_6800_illegal_opcode(self);
400     break;
401   case 0x73:
402     cpu_6800_com(self, cpu_6800_ea_extended(self));
403     break;
404   case 0x74:
405     cpu_6800_lsr(self, cpu_6800_ea_extended(self));
406     break;
407   case 0x75:
408     cpu_6800_illegal_opcode(self);
409     break;
410   case 0x76:
411     cpu_6800_ror(self, cpu_6800_ea_extended(self));
412     break;
413   case 0x77:
414     cpu_6800_asr(self, cpu_6800_ea_extended(self));
415     break;
416   case 0x78:
417     cpu_6800_asl(self, cpu_6800_ea_extended(self));
418     break;
419   case 0x79:
420     cpu_6800_rol(self, cpu_6800_ea_extended(self));
421     break;
422   case 0x7a:
423     cpu_6800_dec_byte(self, cpu_6800_ea_extended(self));
424     break;
425   case 0x7b:
426     cpu_6800_illegal_opcode(self);
427     break;
428   case 0x7c:
429     cpu_6800_inc_byte(self, cpu_6800_ea_extended(self));
430     break;
431   case 0x7d:
432     cpu_6800_cmp_byte(self, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)), 0);
433     break;
434   case 0x7e:
435     cpu_6800_jmp(self, cpu_6800_ea_extended(self));
436     break;
437   case 0x7f:
438     cpu_6800_clr(self, cpu_6800_ea_extended(self));
439     break;
440   case 0x80:
441     cpu_6800_sub(self, CPU_6800_EA_A, cpu_6800_fetch_byte(self));
442     break;
443   case 0x81:
444     cpu_6800_cmp_byte(self, self->regs.byte.a, cpu_6800_fetch_byte(self));
445     break;
446   case 0x82:
447     cpu_6800_sbc(self, CPU_6800_EA_A, cpu_6800_fetch_byte(self));
448     break;
449   case 0x83:
450     cpu_6800_illegal_opcode(self);
451     break;
452   case 0x84:
453     cpu_6800_and(self, CPU_6800_EA_A, cpu_6800_fetch_byte(self));
454     break;
455   case 0x85:
456     cpu_6800_bit(self, self->regs.byte.a, cpu_6800_fetch_byte(self));
457     break;
458   case 0x86:
459     cpu_6800_ld_byte(self, CPU_6800_EA_A, cpu_6800_fetch_byte(self));
460     break;
461   case 0x87:
462     cpu_6800_illegal_opcode(self);
463     break;
464   case 0x88:
465     cpu_6800_eor(self, CPU_6800_EA_A, cpu_6800_fetch_byte(self));
466     break;
467   case 0x89:
468     cpu_6800_adc(self, CPU_6800_EA_A, cpu_6800_fetch_byte(self));
469     break;
470   case 0x8a:
471     cpu_6800_ora(self, CPU_6800_EA_A, cpu_6800_fetch_byte(self));
472     break;
473   case 0x8b:
474     cpu_6800_add(self, CPU_6800_EA_A, cpu_6800_fetch_byte(self));
475     break;
476   case 0x8c:
477     cpu_6800_cmp_word(self, self->regs.word.x, cpu_6800_fetch_word(self));
478     break;
479   case 0x8d:
480     cpu_6800_bsr(self, cpu_6800_ea_relative(self));
481     break;
482   case 0x8e:
483     cpu_6800_ld_word(self, CPU_6800_EA_S, cpu_6800_fetch_word(self));
484     break;
485   case 0x8f:
486     cpu_6800_illegal_opcode(self);
487     break;
488   case 0x90:
489     cpu_6800_sub(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
490     break;
491   case 0x91:
492     cpu_6800_cmp_byte(self, self->regs.byte.a, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
493     break;
494   case 0x92:
495     cpu_6800_sbc(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
496     break;
497   case 0x93:
498     cpu_6800_illegal_opcode(self);
499     break;
500   case 0x94:
501     cpu_6800_and(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
502     break;
503   case 0x95:
504     cpu_6800_bit(self, self->regs.byte.a, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
505     break;
506   case 0x96:
507     cpu_6800_ld_byte(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
508     break;
509   case 0x97:
510     cpu_6800_st_byte(self, self->regs.byte.a, cpu_6800_ea_direct(self));
511     break;
512   case 0x98:
513     cpu_6800_eor(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
514     break;
515   case 0x99:
516     cpu_6800_adc(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
517     break;
518   case 0x9a:
519     cpu_6800_ora(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
520     break;
521   case 0x9b:
522     cpu_6800_add(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
523     break;
524   case 0x9c:
525     cpu_6800_cmp_word(self, self->regs.word.x, cpu_6800_read_word(self, cpu_6800_ea_direct(self)));
526     break;
527   case 0x9d:
528     cpu_6800_illegal_opcode(self);
529     break;
530   case 0x9e:
531     cpu_6800_ld_word(self, CPU_6800_EA_S, cpu_6800_read_word(self, cpu_6800_ea_direct(self)));
532     break;
533   case 0x9f:
534     cpu_6800_st_word(self, self->regs.word.s, cpu_6800_ea_direct(self));
535     break;
536   case 0xa0:
537     cpu_6800_sub(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
538     break;
539   case 0xa1:
540     cpu_6800_cmp_byte(self, self->regs.byte.a, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
541     break;
542   case 0xa2:
543     cpu_6800_sbc(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
544     break;
545   case 0xa3:
546     cpu_6800_illegal_opcode(self);
547     break;
548   case 0xa4:
549     cpu_6800_and(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
550     break;
551   case 0xa5:
552     cpu_6800_bit(self, self->regs.byte.a, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
553     break;
554   case 0xa6:
555     cpu_6800_ld_byte(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
556     break;
557   case 0xa7:
558     cpu_6800_st_byte(self, self->regs.byte.a, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
559     break;
560   case 0xa8:
561     cpu_6800_eor(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
562     break;
563   case 0xa9:
564     cpu_6800_adc(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
565     break;
566   case 0xaa:
567     cpu_6800_ora(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
568     break;
569   case 0xab:
570     cpu_6800_add(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
571     break;
572   case 0xac:
573     cpu_6800_cmp_word(self, self->regs.word.x, cpu_6800_read_word(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
574     break;
575   case 0xad:
576     cpu_6800_jsr(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
577     break;
578   case 0xae:
579     cpu_6800_ld_word(self, CPU_6800_EA_S, cpu_6800_read_word(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
580     break;
581   case 0xaf:
582     cpu_6800_st_word(self, self->regs.word.s, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
583     break;
584   case 0xb0:
585     cpu_6800_sub(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
586     break;
587   case 0xb1:
588     cpu_6800_cmp_byte(self, self->regs.byte.a, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
589     break;
590   case 0xb2:
591     cpu_6800_sbc(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
592     break;
593   case 0xb3:
594     cpu_6800_illegal_opcode(self);
595     break;
596   case 0xb4:
597     cpu_6800_and(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
598     break;
599   case 0xb5:
600     cpu_6800_bit(self, self->regs.byte.a, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
601     break;
602   case 0xb6:
603     cpu_6800_ld_byte(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
604     break;
605   case 0xb7:
606     cpu_6800_st_byte(self, self->regs.byte.a, cpu_6800_ea_extended(self));
607     break;
608   case 0xb8:
609     cpu_6800_eor(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
610     break;
611   case 0xb9:
612     cpu_6800_adc(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
613     break;
614   case 0xba:
615     cpu_6800_ora(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
616     break;
617   case 0xbb:
618     cpu_6800_add(self, CPU_6800_EA_A, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
619     break;
620   case 0xbc:
621     cpu_6800_cmp_word(self, self->regs.word.x, cpu_6800_read_word(self, cpu_6800_ea_extended(self)));
622     break;
623   case 0xbd:
624     cpu_6800_jsr(self, cpu_6800_ea_extended(self));
625     break;
626   case 0xbe:
627     cpu_6800_ld_word(self, CPU_6800_EA_S, cpu_6800_read_word(self, cpu_6800_ea_extended(self)));
628     break;
629   case 0xbf:
630     cpu_6800_st_word(self, self->regs.word.s, cpu_6800_ea_extended(self));
631     break;
632   case 0xc0:
633     cpu_6800_sub(self, CPU_6800_EA_B, cpu_6800_fetch_byte(self));
634     break;
635   case 0xc1:
636     cpu_6800_cmp_byte(self, self->regs.byte.b, cpu_6800_fetch_byte(self));
637     break;
638   case 0xc2:
639     cpu_6800_sbc(self, CPU_6800_EA_B, cpu_6800_fetch_byte(self));
640     break;
641   case 0xc3:
642     cpu_6800_illegal_opcode(self);
643     break;
644   case 0xc4:
645     cpu_6800_and(self, CPU_6800_EA_B, cpu_6800_fetch_byte(self));
646     break;
647   case 0xc5:
648     cpu_6800_bit(self, self->regs.byte.b, cpu_6800_fetch_byte(self));
649     break;
650   case 0xc6:
651     cpu_6800_ld_byte(self, CPU_6800_EA_B, cpu_6800_fetch_byte(self));
652     break;
653   case 0xc7:
654     cpu_6800_illegal_opcode(self);
655     break;
656   case 0xc8:
657     cpu_6800_eor(self, CPU_6800_EA_B, cpu_6800_fetch_byte(self));
658     break;
659   case 0xc9:
660     cpu_6800_adc(self, CPU_6800_EA_B, cpu_6800_fetch_byte(self));
661     break;
662   case 0xca:
663     cpu_6800_ora(self, CPU_6800_EA_B, cpu_6800_fetch_byte(self));
664     break;
665   case 0xcb:
666     cpu_6800_add(self, CPU_6800_EA_B, cpu_6800_fetch_byte(self));
667     break;
668   case 0xcc:
669     cpu_6800_illegal_opcode(self);
670     break;
671   case 0xcd:
672     cpu_6800_illegal_opcode(self);
673     break;
674   case 0xce:
675     cpu_6800_ld_word(self, CPU_6800_EA_X, cpu_6800_fetch_word(self));
676     break;
677   case 0xcf:
678     cpu_6800_illegal_opcode(self);
679     break;
680   case 0xd0:
681     cpu_6800_sub(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
682     break;
683   case 0xd1:
684     cpu_6800_cmp_byte(self, self->regs.byte.b, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
685     break;
686   case 0xd2:
687     cpu_6800_sbc(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
688     break;
689   case 0xd3:
690     cpu_6800_illegal_opcode(self);
691     break;
692   case 0xd4:
693     cpu_6800_and(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
694     break;
695   case 0xd5:
696     cpu_6800_bit(self, self->regs.byte.b, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
697     break;
698   case 0xd6:
699     cpu_6800_ld_byte(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
700     break;
701   case 0xd7:
702     cpu_6800_st_byte(self, self->regs.byte.b, cpu_6800_ea_direct(self));
703     break;
704   case 0xd8:
705     cpu_6800_eor(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
706     break;
707   case 0xd9:
708     cpu_6800_adc(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
709     break;
710   case 0xda:
711     cpu_6800_ora(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
712     break;
713   case 0xdb:
714     cpu_6800_add(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct(self)));
715     break;
716   case 0xdc:
717     cpu_6800_illegal_opcode(self);
718     break;
719   case 0xdd:
720     cpu_6800_illegal_opcode(self);
721     break;
722   case 0xde:
723     cpu_6800_ld_word(self, CPU_6800_EA_X, cpu_6800_read_word(self, cpu_6800_ea_direct(self)));
724     break;
725   case 0xdf:
726     cpu_6800_st_word(self, self->regs.word.x, cpu_6800_ea_direct(self));
727     break;
728   case 0xe0:
729     cpu_6800_sub(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
730     break;
731   case 0xe1:
732     cpu_6800_cmp_byte(self, self->regs.byte.b, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
733     break;
734   case 0xe2:
735     cpu_6800_sbc(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
736     break;
737   case 0xe3:
738     cpu_6800_illegal_opcode(self);
739     break;
740   case 0xe4:
741     cpu_6800_and(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
742     break;
743   case 0xe5:
744     cpu_6800_bit(self, self->regs.byte.b, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
745     break;
746   case 0xe6:
747     cpu_6800_ld_byte(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
748     break;
749   case 0xe7:
750     cpu_6800_st_byte(self, self->regs.byte.b, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
751     break;
752   case 0xe8:
753     cpu_6800_eor(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
754     break;
755   case 0xe9:
756     cpu_6800_adc(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
757     break;
758   case 0xea:
759     cpu_6800_ora(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
760     break;
761   case 0xeb:
762     cpu_6800_add(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
763     break;
764   case 0xec:
765     cpu_6800_illegal_opcode(self);
766     break;
767   case 0xed:
768     cpu_6800_illegal_opcode(self);
769     break;
770   case 0xee:
771     cpu_6800_ld_word(self, CPU_6800_EA_X, cpu_6800_read_word(self, cpu_6800_ea_direct_indexed(self, self->regs.word.x)));
772     break;
773   case 0xef:
774     cpu_6800_st_word(self, self->regs.word.x, cpu_6800_ea_direct_indexed(self, self->regs.word.x));
775     break;
776   case 0xf0:
777     cpu_6800_sub(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
778     break;
779   case 0xf1:
780     cpu_6800_cmp_byte(self, self->regs.byte.b, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
781     break;
782   case 0xf2:
783     cpu_6800_sbc(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
784     break;
785   case 0xf3:
786     cpu_6800_illegal_opcode(self);
787     break;
788   case 0xf4:
789     cpu_6800_and(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
790     break;
791   case 0xf5:
792     cpu_6800_bit(self, self->regs.byte.b, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
793     break;
794   case 0xf6:
795     cpu_6800_ld_byte(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
796     break;
797   case 0xf7:
798     cpu_6800_st_byte(self, self->regs.byte.b, cpu_6800_ea_extended(self));
799     break;
800   case 0xf8:
801     cpu_6800_eor(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
802     break;
803   case 0xf9:
804     cpu_6800_adc(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
805     break;
806   case 0xfa:
807     cpu_6800_ora(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
808     break;
809   case 0xfb:
810     cpu_6800_add(self, CPU_6800_EA_B, cpu_6800_read_byte(self, cpu_6800_ea_extended(self)));
811     break;
812   case 0xfc:
813     cpu_6800_illegal_opcode(self);
814     break;
815   case 0xfd:
816     cpu_6800_illegal_opcode(self);
817     break;
818   case 0xfe:
819     cpu_6800_ld_word(self, CPU_6800_EA_X, cpu_6800_read_word(self, cpu_6800_ea_extended(self)));
820     break;
821   case 0xff:
822     cpu_6800_st_word(self, self->regs.word.x, cpu_6800_ea_extended(self));
823     break;
824   }
825 }