|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: // EA は大別して6種類。
8: //
9: // |d m rxwp | 制御 CalcCtrl サイズ不問
10: // |dam+-rxw | 可変 CalcData B/W/L
11: // | m rxwp | MMU CalcMMU サイズ不問
12: // |dam+-rxwpi| FPU CalcFPU B/W/L/S/D/X/P
13: // |d m+-rxwpi| データ FetchData B/W/L
14: // |dam+-rxwpi| All FetchAll B/W/L
15: //
16: // CalcCtrl はユーザーズマニュアルで「制御(Control)」と呼ばれている
17: // グループで、デスティネーション側のため EA の計算のみ。
18: // また (An)+/-(An) を含まないため、サイズに関係なく1種類だけでよい。
19: //
20: // CalcData はユーザーズマニュアルで「可変」と呼ばれているグループで、
21: // デスティネーション側のため EA の計算のみ。サイズは B/W/L。
22: // (An)+/-(An) ならレジスタを保存する。
23: //
24: // CalcMMU は対 68030 MMU 命令用に勝手に用意したもの。
25: //
26: // CalcFPU は対 FPU 用。ソースであっても CalcFPU を使用する。
27: // サイズは B/W/L/S/D/X/P。
28: // (An)+/-(An) ならレジスタを保存する。
29: // フェッチサイクルは別途存在するはずだが不詳。
30: //
31: // FetchData はユーザーズマニュアルで「データ(Data)」と呼ばれている
32: // グループで、ソース側のため EA 計算および値の取得。サイズは B/W/L。
33: // (An)+/-(An) ならレジスタを保存する。
34: //
35: // FetchAll はユーザーズマニュアルのここには記載がないグループで、
36: // ソース側のため EA 計算および値の取得。サイズは B/W/L。
37: // (An)+/-(An) ならレジスタを保存する。
38: //
39: // CalcCtrl、CalcData でアドレッシングモードに D や A が含まれている場合は
40: // その命令のデスティネーションに Dn、An が指定できるという意味であり、
41: // EA 処理であるここには関係ない。
42: // EA 計算より前に呼出側で条件分けして処理すること。
43: //
44: // CalcCtrl、CalcData と FetchData には (*) 印の例外があるので留意。
45: //
46: // (CalcCtrl)
47: // | m rxwp | CMP2/CHK2
48: // | m rxwp | JMP/JSR
49: // | m rxwp | LEA/PEA
50: // |d m rxwp | BFEXT*/BFFFO/BFTST
51: // |d m rxw | (*) BFCHG/BFCLR/BFINS/BFSET <ea>{#o:#w}
52: //
53: // (CalcData)
54: // | m+-rxw | ADD/SUB/CMP Dx,<ea>
55: // | m+-rxw | CAS/TAS <ea>
56: // | m+-rxw | MOVES <ea>,Rn
57: // | m+-rxw | shift/rotate.W <ea>
58: // | m+-rxw | BCHG/BCLR/BSET src,<ea>
59: // |d m+-rxw | ADDI/SUBI Dx,<ea>
60: // |d m+-rxw | NBCD <ea>
61: // |d m+-rxw | AND/OR/EOR Dx,<ea>
62: // |d m+-rxw | CLR/NEG/NEGX/NOT/TST/Scc <ea>
63: // |d m+-rxw | MOVE CCR/SR,<ea>
64: // |dam+-rxw | ADDQ/SUBQ #qqq,<ea>
65: // |dam+-rxw | (*) MOVE の dst 側。EA の分類的には CalcData だが、
66: // 下位6ビットの IR ではないので、cea_data_NN() ではなく
67: // 各々 cea_XXXX() のほうを個別に呼ぶこと。
68: //
69: // (CalcMMU)
70: // | m rxw | MMU
71: //
72: // (CalcFPU)
73: // |d m+-rxw | FScc.B <ea>
74: // |dam+-rxw | FMOVE.f FPn,<ea>
75: // |dam+-rxw | FMOVE.L ctl,<ea>
76: // |dam+-rxw | FMOVEM.L ctl,<ea>
77: // |d m+-rxwpi| Fgen <ea>,FPn
78: // |d m+-rxwpi| FMOVE.f <ea>,FPn
79: // |dam+-rxwpi| FMOVE.L <ea>,ctl
80: // |dam+-rxwpi| FMOVEM.L <ea>,ctl
81: // 実際にどのアドレッシングモードが有効かどうかは極力個別の命令内で判断する?
82: // ここは実行サイクル数的な分類。
83: //
84: // (FetchData)
85: // |d m+-rxwpi| AND/OR/CHK <ea>,Dn
86: // |d m+-rxwpi| MOVE.B <ea>,dst
87: // |d m+-rxwpi| MOVE <ea>,CCR/SR
88: // |d m+-rxwpi| MUL*/DIV* <ea>,Dn
89: // |d m+-rxwp | (*) TST.B <ea>
90: // |d m+-rxwp | (*) CMPI #<data>,<ea>
91: // | m+-rxwp | (*) BTST.B #<data>,<ea>
92: // | m+-rxwpi| (*) BTST.B Dx,<ea>
93: //
94: // (FetchAll)
95: // |dam+-rxwpi| ADD/SUB/CMP <ea>,Dn
96: // |dam+-rxwpi| MOVEA/ADDA/SUBA/CMPA <ea>,An
97: // |dam+-rxwpi| TST.WL <ea>
98: // |dam+-rxwpi| MOVE.WL <ea>,dst
99: //
100: // (たぶん別対応)
101: // | m -rxw | MOVEM list,<ea>
102: // | m -rxw | FMOVEM.X reg,<ea>
103: // | m -rxw | FSAVE <ea>
104: // | m+ rxwp | MOVEM <ea>,list
105: // | m+ rxwp | FMOVEM.X <ea>,reg
106: // | m+ rxwp | FRESTORE <ea>
107:
108: #include "mpu680x0.h"
109:
110: //
111: // Calc EA
112: //
113:
114: // 個別 EA は (An)+/-(An) でもレジスタを保存しない。
115: // 自動的に保存する cea_data() 等を介さずこれらを呼ぶ時は
116: // レジスタ保存のタイミングや回数に注意すること。
117:
118: uint32
119: MPU680x0Device::cea_anin(uint n)
120: {
121: CYCLE(2);
122: return internal_ea_anin(n);
123: }
124:
125: uint32
126: MPU680x0Device::cea_anpi_1(uint n)
127: {
128: CYCLE(2);
129: return internal_ea_anpi_1(n);
130: }
131:
132: uint32
133: MPU680x0Device::cea_anpi_2(uint n)
134: {
135: CYCLE(2);
136: return internal_ea_anpi_2(n);
137: }
138:
139: uint32
140: MPU680x0Device::cea_anpi_4(uint n)
141: {
142: CYCLE(2);
143: return internal_ea_anpi_4(n);
144: }
145:
146: uint32
147: MPU680x0Device::cea_anpd_1(uint n)
148: {
149: CYCLE(2);
150: return internal_ea_anpd_1(n);
151: }
152:
153: uint32
154: MPU680x0Device::cea_anpd_2(uint n)
155: {
156: CYCLE(2);
157: return internal_ea_anpd_2(n);
158: }
159:
160: uint32
161: MPU680x0Device::cea_anpd_4(uint n)
162: {
163: CYCLE(2);
164: return internal_ea_anpd_4(n);
165: }
166:
167: uint32
168: MPU680x0Device::cea_andi(uint n)
169: {
170: CYCLE(2);
171: return internal_ea_andi(n);
172: }
173:
174: uint32
175: MPU680x0Device::cea_anix(uint n)
176: {
177: CYCLE(10); // XXX 4,4-18,20
178: return internal_ea_anix(n);
179: }
180:
181: uint32
182: MPU680x0Device::cea_absw()
183: {
184: CYCLE(2);
185: return internal_ea_absw();
186: }
187:
188: uint32
189: MPU680x0Device::cea_absl()
190: {
191: CYCLE(4);
192: return internal_ea_absl();
193: }
194:
195: uint32
196: MPU680x0Device::cea_pcdi()
197: {
198: CYCLE(2);
199: return internal_ea_pcdi();
200: }
201:
202: uint32
203: MPU680x0Device::cea_pcix()
204: {
205: CYCLE(10); // XXX 4,4-18,20
206: return internal_ea_pcix();
207: }
208:
209: //
210: // Fetch EA
211: //
212:
213: inline uint32
214: MPU680x0Device::fea_anin()
215: {
216: CYCLE(3);
217: return internal_ea_anin(eanum(ir));
218: }
219:
220: inline uint32
221: MPU680x0Device::fea_anpi_1()
222: {
223: CYCLE(3);
224: return internal_ea_anpi_1(eanum(ir));
225: }
226:
227: inline uint32
228: MPU680x0Device::fea_anpi_2()
229: {
230: CYCLE(3);
231: return internal_ea_anpi_2(eanum(ir));
232: }
233:
234: inline uint32
235: MPU680x0Device::fea_anpi_4()
236: {
237: CYCLE(3);
238: return internal_ea_anpi_4(eanum(ir));
239: }
240:
241: inline uint32
242: MPU680x0Device::fea_anpd_1()
243: {
244: CYCLE(4);
245: return internal_ea_anpd_1(eanum(ir));
246: }
247:
248: inline uint32
249: MPU680x0Device::fea_anpd_2()
250: {
251: CYCLE(4);
252: return internal_ea_anpd_2(eanum(ir));
253: }
254:
255: inline uint32
256: MPU680x0Device::fea_anpd_4()
257: {
258: CYCLE(4);
259: return internal_ea_anpd_4(eanum(ir));
260: }
261:
262: inline uint32
263: MPU680x0Device::fea_andi()
264: {
265: CYCLE(4);
266: return internal_ea_andi(eanum(ir));
267: }
268:
269: inline uint32
270: MPU680x0Device::fea_anix()
271: {
272: CYCLE2(12, 14); // XXX 6,6-18,21
273: return internal_ea_anix(eanum(ir));
274: }
275:
276: inline uint32
277: MPU680x0Device::fea_absw()
278: {
279: CYCLE(4);
280: return internal_ea_absw();
281: }
282:
283: inline uint32
284: MPU680x0Device::fea_absl()
285: {
286: CYCLE2(4, 5);
287: return internal_ea_absl();
288: }
289:
290: inline uint32
291: MPU680x0Device::fea_pcdi()
292: {
293: CYCLE(4);
294: return internal_ea_pcdi();
295: }
296:
297: inline uint32
298: MPU680x0Device::fea_pcix()
299: {
300: CYCLE2(12, 14); // XXX 6,6-18,21
301: return internal_ea_pcix();
302: }
303:
304: inline void
305: MPU680x0Device::fea_imm_2()
306: {
307: CYCLE(2);
308: }
309:
310: inline void
311: MPU680x0Device::fea_imm_4()
312: {
313: CYCLE(4);
314: }
315:
316: //
317: // EA の拡張ワード
318: //
319:
320: uint32
321: MPU680x0Device::internal_ea_ix(uint32 anpc)
322: {
323: uint16 ext = fetch_2();
324: uint rn = (ext >> 12) & 15;
325: bool idx_long = (ext & 0x0800);
326: uint scale = (ext >> 9) & 3;
327:
328: if ((ext & 0x0100) == 0) {
329: // Brief extension
330: //
331: // F E D C B A 9 8 7 6 5 4 3 2 1 0
332: // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
333: // | DA| n | WL| SCALE | 0 | disp |
334: // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
335: //
336: // WL: インデックスレジスタ(Rn)のサイズ 1=.L 0=.W
337: // SCALE: スケールファクタ %00=*1 %01=*2 %10=*4 %11=*8
338:
339: CYCLE(4);
340: int32 disp = (int32)(int8)(ext & 0xff);
341: uint32 idx;
342:
343: if (idx_long) {
344: idx = reg.R[rn];
345: } else {
346: idx = (int32)(int16)(reg.R[rn] & 0xffff);
347: }
348: idx <<= scale;
349: return anpc + (int32)idx + disp;
350: } else {
351: // Full extension
352: //
353: // F E D C B A 9 8 7 6 5 4 3 2 1 0
354: // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
355: // | DA| n | WL| SCALE | 1 | BS| IS| BDSZ | 0 | I/IS |
356: // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
357: //
358: // BS=1: ベースレジスタ・サプレス
359: // IS=1: インデックスオペランド・サプレス
360: // BDSZ: ベースディスプレースメントのサイズ %01=null %10=.W %11=.L
361: // I/IS: モード
362:
363: // クロックは概略値なので完全に正確ではないがまず基本は以下の2通り。
364: // メモリ間接なし (6, 6)
365: // メモリ間接あり (10, 10)
366: // これを元に必要に応じて以下をそれぞれ加算する。
367: // bd16 (+2, +3)
368: // bd32 (メモリ間接なし) (+4, +6)
369: // bd32 (メモリ間接あり) (+6, +6)
370: // outer (W/L 不問) (+2, +3)
371: // ただしここでは実行順の都合で bd32 はいずれも (+4, +6) とした。
372:
373: bool bs = (ext & 0x0080);
374: bool is = (ext & 0x0040);
375: uint bdsize = (ext >> 4) & 3;
376: uint iis = (ext & 7);
377:
378: // ベースレジスタ
379: if (bs) {
380: anpc = 0;
381: }
382:
383: // ベース・ディスプレースメント
384: uint32 base = 0;
385: switch (bdsize) {
386: case 0: // 予約
387: throw M68K::EXCEP_ILLEGAL;
388: case 1: // ベースはヌル
389: break;
390: case 2: // ベース.W
391: base = (int32)(int16)fetch_2();
392: CYCLE2(2, 3);
393: break;
394: case 3: // ベース.L
395: base = fetch_4();
396: CYCLE2(4, 6);
397: break;
398: default:
399: __unreachable();
400: }
401:
402: uint32 outer;
403: if (is == 0) {
404: // インデックス
405: uint32 idx = 0;
406: if (idx_long) {
407: idx = reg.R[rn];
408: } else {
409: idx = (int32)(int16)(reg.R[rn] & 0xffff);
410: }
411: idx <<= scale;
412:
413: switch (iis) {
414: case 0: // no memory indirection
415: CYCLE(6);
416: return anpc + base + idx;
417:
418: case 1: // indirect pre-index with null outer
419: CYCLE(10);
420: return read_4(anpc + base + idx);
421: case 2: // indirect pre-index with word outer
422: CYCLE2(10+2, 10+3);
423: outer = (int32)(int16)fetch_2();
424: return read_4(anpc + base + idx) + outer;
425: case 3: // indirect pre-index with long outer
426: CYCLE2(10+2, 10+3);
427: outer = fetch_4();
428: return read_4(anpc + base + idx) + outer;
429:
430: case 4:
431: throw M68K::EXCEP_ILLEGAL;
432:
433: case 5: // indirect post-index with null outer
434: CYCLE(10);
435: return read_4(anpc + base) + idx;
436: case 6: // indirect post-index with word outer
437: CYCLE2(10+2, 10+3);
438: outer = (int32)(int16)fetch_2();
439: return read_4(anpc + base) + idx + outer;
440: case 7: // indirect post-index with long outer
441: CYCLE2(10+2, 10+3);
442: outer = fetch_4();
443: return read_4(anpc + base) + idx + outer;
444: default:
445: __unreachable();
446: }
447: } else {
448: switch (iis) {
449: case 0: // no memory indirection
450: CYCLE(6);
451: return anpc + base;
452:
453: case 1: // memory indirect with null outer
454: CYCLE(10);
455: return read_4(anpc + base);
456: case 2: // memory indirect with word outer
457: CYCLE2(10+2, 10+3);
458: outer = (int32)(int16)fetch_2();
459: return read_4(anpc + base) + outer;
460: case 3: // memory indirect with long outer
461: CYCLE2(10+2, 10+3);
462: outer = fetch_4();
463: return read_4(anpc + base) + outer;
464: default:
465: throw M68K::EXCEP_ILLEGAL;
466: }
467: }
468: }
469: }
470:
471: //
472: // Calc EA
473: //
474:
475: uint32
476: MPU680x0Device::cea_ctrl()
477: {
478: switch (eamode(ir)) {
479: case 2: // (An)
480: return cea_anin(eanum(ir));
481: case 5: // d16(An)
482: return cea_andi(eanum(ir));
483: case 6: // (An,IX)
484: return cea_anix(eanum(ir));
485: case 7:
486: switch (eanum(ir)) {
487: case 0: // Abs.W
488: return cea_absw();
489: case 1: // Abs.L
490: return cea_absl();
491: case 2: // d16(PC)
492: return cea_pcdi();
493: case 3: // (PC,IX)
494: return cea_pcix();
495: default:
496: break;
497: }
498: break;
499: }
500: // 不当命令
501: throw M68K::EXCEP_ILLEGAL;
502: }
503:
504: uint32
505: MPU680x0Device::cea_data_1()
506: {
507: switch (eamode(ir)) {
508: case 2: // (An)
509: return cea_anin(eanum(ir));
510: case 3: // (An)+
511: save_reg_pi(eanum(ir));
512: return cea_anpi_1(eanum(ir));
513: case 4: // -(An)
514: save_reg_pd(eanum(ir));
515: return cea_anpd_1(eanum(ir));
516: case 5: // d16(An)
517: return cea_andi(eanum(ir));
518: case 6: // (An,IX)
519: return cea_anix(eanum(ir));
520: case 7:
521: switch (eanum(ir)) {
522: case 0: // Abs.W
523: return cea_absw();
524: case 1: // Abs.L
525: return cea_absl();
526: default:
527: break;
528: }
529: break;
530: }
531: // 不当命令
532: throw M68K::EXCEP_ILLEGAL;
533: }
534:
535: uint32
536: MPU680x0Device::cea_data_2()
537: {
538: switch (eamode(ir)) {
539: case 2: // (An)
540: return cea_anin(eanum(ir));
541: case 3: // (An)+
542: save_reg_pi(eanum(ir));
543: return cea_anpi_2(eanum(ir));
544: case 4: // -(An)
545: save_reg_pd(eanum(ir));
546: return cea_anpd_2(eanum(ir));
547: case 5: // d16(An)
548: return cea_andi(eanum(ir));
549: case 6: // (An,IX)
550: return cea_anix(eanum(ir));
551: case 7:
552: switch (eanum(ir)) {
553: case 0: // Abs.W
554: return cea_absw();
555: case 1: // Abs.L
556: return cea_absl();
557: default:
558: break;
559: }
560: break;
561: }
562: // 不当命令
563: throw M68K::EXCEP_ILLEGAL;
564: }
565:
566: uint32
567: MPU680x0Device::cea_data_4()
568: {
569: switch (eamode(ir)) {
570: case 2: // (An)
571: return cea_anin(eanum(ir));
572: case 3: // (An)+
573: save_reg_pi(eanum(ir));
574: return cea_anpi_4(eanum(ir));
575: case 4: // -(An)
576: save_reg_pd(eanum(ir));
577: return cea_anpd_4(eanum(ir));
578: case 5: // d16(An)
579: return cea_andi(eanum(ir));
580: case 6: // (An,IX)
581: return cea_anix(eanum(ir));
582: case 7:
583: switch (eanum(ir)) {
584: case 0: // Abs.W
585: return cea_absw();
586: case 1: // Abs.L
587: return cea_absl();
588: default:
589: break;
590: }
591: break;
592: }
593: // 不当命令
594: throw M68K::EXCEP_ILLEGAL;
595: }
596:
597: // MMU からの呼び出し用。
598: uint32
599: MPU680x0Device::cea_copro()
600: {
601: switch (eamode(ir)) {
602: case 2: // (An)
603: CYCLE(4);
604: return internal_ea_anin(eanum(ir));
605: case 5: // d16(An)
606: CYCLE(4);
607: return internal_ea_andi(eanum(ir));
608: case 6: // (An,IX)
609: CYCLE(4);
610: return internal_ea_anix(eanum(ir));
611: case 7:
612: switch (eanum(ir)) {
613: case 0: // Abs.W
614: CYCLE(4);
615: return internal_ea_absw();
616: case 1: // Abs.L
617: CYCLE(6);
618: return internal_ea_absl();
619: default:
620: break;
621: }
622: break;
623: }
624: // 不当命令
625: throw M68K::EXCEP_ILLEGAL;
626: }
627:
628: //
629: // Fetch EA
630: //
631:
632: uint32
633: MPU680x0Device::fea_data_1()
634: {
635: uint32 ea;
636:
637: switch (eamode(ir)) {
638: case 0: // Dn
639: return reg.D[eanum(ir)] & 0xff;
640: case 2: // (An)
641: ea = fea_anin();
642: return read_1(ea);
643: case 3: // (An)+
644: save_reg_pi(eanum(ir));
645: ea = fea_anpi_1();
646: return read_1(ea);
647: case 4: // -(An)
648: save_reg_pd(eanum(ir));
649: ea = fea_anpd_1();
650: return read_1(ea);
651: case 5: // d16(An)
652: ea = fea_andi();
653: return read_1(ea);
654: case 6: // (An,IX)
655: ea = fea_anix();
656: return read_1(ea);
657: case 7:
658: switch (eanum(ir)) {
659: case 0: // Abs.W
660: ea = fea_absw();
661: return read_1(ea);
662: case 1: // Abs.L
663: ea = fea_absl();
664: return read_1(ea);
665: case 2: // d16(PC)
666: ea = fea_pcdi();
667: return read_1(ea);
668: case 3: // (PC,IX)
669: ea = fea_pcix();
670: return read_1(ea);
671: case 4: // #imm
672: fea_imm_2();
673: return fetch_2() & 0xff;
674: default:
675: break;
676: }
677: break;
678: default:
679: break;
680: }
681: // 不当命令
682: throw M68K::EXCEP_ILLEGAL;
683: }
684:
685: uint32
686: MPU680x0Device::fea_data_2()
687: {
688: uint32 ea;
689:
690: switch (eamode(ir)) {
691: case 0: // Dn
692: return reg.D[eanum(ir)] & 0xffff;
693: case 2: // (An)
694: ea = fea_anin();
695: return read_2(ea);
696: case 3: // (An)+
697: save_reg_pi(eanum(ir));
698: ea = fea_anpi_2();
699: return read_2(ea);
700: case 4: // -(An)
701: save_reg_pd(eanum(ir));
702: ea = fea_anpd_2();
703: return read_2(ea);
704: case 5: // d16(An)
705: ea = fea_andi();
706: return read_2(ea);
707: case 6: // (An,IX)
708: ea = fea_anix();
709: return read_2(ea);
710: case 7:
711: switch (eanum(ir)) {
712: case 0: // Abs.W
713: ea = fea_absw();
714: return read_2(ea);
715: case 1: // Abs.L
716: ea = fea_absl();
717: return read_2(ea);
718: case 2: // d16(PC)
719: ea = fea_pcdi();
720: return read_2(ea);
721: case 3: // (PC,IX)
722: ea = fea_pcix();
723: return read_2(ea);
724: case 4: // #imm
725: fea_imm_2();
726: return fetch_2();
727: default:
728: break;
729: }
730: break;
731: default:
732: break;
733: }
734: // 不当命令
735: throw M68K::EXCEP_ILLEGAL;
736: }
737:
738: uint32
739: MPU680x0Device::fea_data_4()
740: {
741: uint32 ea;
742:
743: switch (eamode(ir)) {
744: case 0: // Dn
745: return reg.D[eanum(ir)];
746: case 2: // (An)
747: ea = fea_anin();
748: return read_4(ea);
749: case 3: // (An)+
750: save_reg_pi(eanum(ir));
751: ea = fea_anpi_4();
752: return read_4(ea);
753: case 4: // -(An)
754: save_reg_pd(eanum(ir));
755: ea = fea_anpd_4();
756: return read_4(ea);
757: case 5: // d16(An)
758: ea = fea_andi();
759: return read_4(ea);
760: case 6: // (An,IX)
761: ea = fea_anix();
762: return read_4(ea);
763: case 7:
764: switch (eanum(ir)) {
765: case 0: // Abs.W
766: ea = fea_absw();
767: return read_4(ea);
768: case 1: // Abs.L
769: ea = fea_absl();
770: return read_4(ea);
771: case 2: // d16(PC)
772: ea = fea_pcdi();
773: return read_4(ea);
774: case 3: // (PC,IX)
775: ea = fea_pcix();
776: return read_4(ea);
777: case 4: // #imm
778: fea_imm_4();
779: return fetch_4();
780: default:
781: break;
782: }
783: break;
784: default:
785: break;
786: }
787: // 不当命令
788: throw M68K::EXCEP_ILLEGAL;
789: }
790:
791: uint32
792: MPU680x0Device::fea_all_1()
793: {
794: uint32 ea;
795:
796: switch (eamode(ir)) {
797: case 0: // Dn
798: return reg.D[eanum(ir)] & 0xff;
799: case 1: // An
800: // An.B は不当命令
801: break;
802: case 2: // (An)
803: ea = fea_anin();
804: return read_1(ea);
805: case 3: // (An)+
806: save_reg_pi(eanum(ir));
807: ea = fea_anpi_1();
808: return read_1(ea);
809: case 4: // -(An)
810: save_reg_pd(eanum(ir));
811: ea = fea_anpd_1();
812: return read_1(ea);
813: case 5: // d16(An)
814: ea = fea_andi();
815: return read_1(ea);
816: case 6: // (An,IX)
817: ea = fea_anix();
818: return read_1(ea);
819: case 7:
820: switch (eanum(ir)) {
821: case 0: // Abs.W
822: ea = fea_absw();
823: return read_1(ea);
824: case 1: // Abs.L
825: ea = fea_absl();
826: return read_1(ea);
827: case 2: // d16(PC)
828: ea = fea_pcdi();
829: return read_1(ea);
830: case 3: // (PC,IX)
831: ea = fea_pcix();
832: return read_1(ea);
833: case 4: // #imm
834: fea_imm_2();
835: return fetch_2() & 0xff;
836: default:
837: break;
838: }
839: break;
840: default:
841: break;
842: }
843: // 不当命令
844: throw M68K::EXCEP_ILLEGAL;
845: }
846:
847: uint32
848: MPU680x0Device::fea_all_2()
849: {
850: uint32 ea;
851:
852: switch (eamode(ir)) {
853: case 0: // Dn
854: case 1: // An
855: return reg.R[ir & 15] & 0xffff;
856: case 2: // (An)
857: ea = fea_anin();
858: return read_2(ea);
859: case 3: // (An)+
860: save_reg_pi(eanum(ir));
861: ea = fea_anpi_2();
862: return read_2(ea);
863: case 4: // -(An)
864: save_reg_pd(eanum(ir));
865: ea = fea_anpd_2();
866: return read_2(ea);
867: case 5: // d16(An)
868: ea = fea_andi();
869: return read_2(ea);
870: case 6: // (An,IX)
871: ea = fea_anix();
872: return read_2(ea);
873: case 7:
874: switch (eanum(ir)) {
875: case 0: // Abs.W
876: ea = fea_absw();
877: return read_2(ea);
878: case 1: // Abs.L
879: ea = fea_absl();
880: return read_2(ea);
881: case 2: // d16(PC)
882: ea = fea_pcdi();
883: return read_2(ea);
884: case 3: // (PC,IX)
885: ea = fea_pcix();
886: return read_2(ea);
887: case 4: // #imm
888: fea_imm_2();
889: return fetch_2();
890: default:
891: break;
892: }
893: break;
894: default:
895: break;
896: }
897: // 不当命令
898: throw M68K::EXCEP_ILLEGAL;
899: }
900:
901: uint32
902: MPU680x0Device::fea_all_4()
903: {
904: uint32 ea;
905:
906: switch (eamode(ir)) {
907: case 0: // Dn
908: case 1: // An
909: return reg.R[ir & 15];
910: case 2: // (An)
911: ea = fea_anin();
912: return read_4(ea);
913: case 3: // (An)+
914: save_reg_pi(eanum(ir));
915: ea = fea_anpi_4();
916: return read_4(ea);
917: case 4: // -(An)
918: save_reg_pd(eanum(ir));
919: ea = fea_anpd_4();
920: return read_4(ea);
921: case 5: // d16(An)
922: ea = fea_andi();
923: return read_4(ea);
924: case 6: // (An,IX)
925: ea = fea_anix();
926: return read_4(ea);
927: case 7:
928: switch (eanum(ir)) {
929: case 0: // Abs.W
930: ea = fea_absw();
931: return read_4(ea);
932: case 1: // Abs.L
933: ea = fea_absl();
934: return read_4(ea);
935: case 2: // d16(PC)
936: ea = fea_pcdi();
937: return read_4(ea);
938: case 3: // (PC,IX)
939: ea = fea_pcix();
940: return read_4(ea);
941: case 4: // #imm
942: fea_imm_4();
943: return fetch_4();
944: default:
945: break;
946: }
947: break;
948: default:
949: break;
950: }
951: // 不当命令
952: throw M68K::EXCEP_ILLEGAL;
953: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.