|
|
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.