--- nono/m680x0/m68030ea.cpp 2026/04/29 17:05:08 1.1.1.3 +++ nono/m680x0/m68030ea.cpp 2026/04/29 17:05:15 1.1.1.4 @@ -4,19 +4,315 @@ // Licensed under nono-license.txt // -#include "m68030core.h" -#include "m68030bus.h" -#include "m68030ea.h" -#include "m68030fpu.h" +// EA は大別して5種類。 +// +// |d m rxwp | 制御 CalcCtrl サイズ不問 +// |dam+-rxw | 可変 CalcData B/W/L +// | m rxwp | MMU CalcMMU サイズ不問 +// |dam+-rxwpi| FPU CalcFPU B/W/L/S/D/X/P +// |d m+-rxwpi| データ FetchData B/W/L +// |dam+-rxwpi| All FetchAll B/W/L +// +// CalcCtrl はユーザーズマニュアルで「制御(Control)」と呼ばれている +// グループで、デスティネーション側のため EA の計算のみ。 +// また (An)+/-(An) を含まないため、サイズに関係なく1種類だけでよい。 +// +// CalcData はユーザーズマニュアルで「可変」と呼ばれているグループで、 +// デスティネーション側のため EA の計算のみ。B/W/L +// +// CalcMMU は対 MMU 用に勝手に用意したもの。 +// +// CalcFPU は対 FPU 用。ソースであっても CalcFPU を使用する。 +// サイズは B/W/L/S/D/X/P。 +// フェッチサイクルは別途存在するはずだが不詳。 +// +// FetchData はユーザーズマニュアルで「データ(Data)」と呼ばれている +// グループで、ソース側のため EA 計算および値の取得。B/W/L +// +// FetchAll はユーザーズマニュアルのここには記載がないグループで、 +// ソース側のため EA 計算および値の取得。B/W/L +// +// CalcCtrl、CalcData でアドレッシングモードに D や A が含まれている場合は +// その命令のデスティネーションに Dn、An が指定できるという意味であり、 +// EA 処理であるここには関係ない。 +// EA 計算より前に呼出側で条件分けして処理すること。 +// +// CalcCtrl、CalcData と FetchData には (*) 印の例外があるので留意。 +// +// (CalcCtrl) +// | m rxwp | CMP2/CHK2 +// | m rxwp | JMP/JSR +// | m rxwp | LEA/PEA +// |d m rxwp | BFEXT*/BFFFO/BFTST +// |d m rxw | (*) BFCHG/BFCLR/BFINS/BFSET {#o:#w} +// +// (CalcData) +// | m+-rxw | ADD/SUB/CMP Dx, +// | m+-rxw | CAS/TAS +// | m+-rxw | MOVES ,Rn +// | m+-rxw | shift/rotate.W +// | m+-rxw | BCHG/BCLR/BSET src, +// |d m+-rxw | ADDI/SUBI Dx, +// |d m+-rwx | NBCD +// |d m+-rxw | AND/OR/EOR Dx, +// |d m+-rxw | CLR/NEG/NEGX/NOT/TST/Scc +// |d m+-rxw | MOVE CCR/SR, +// |dam+-rxw | ADDQ/SUBQ #qqq, +// |dam+-rxw | (*) MOVE の dst 側。EA の分類的には CalcData だが、 +// 下位6ビットの IR ではないので、cea_data_NN() ではなく +// 各々 cea_XXXX() のほうを個別に呼ぶこと。 +// +// (CalcMMU) +// | m rxw | MMU +// +// (CalcFPU) +// |d m+-rxw | FScc.B +// |dam+-rxw | FMOVE.f FPn, +// |dam+-rxw | FMOVE.L ctl, +// |dam+-rxw | FMOVEM.L ctl, +// |d m+-rxwpi| Fgen ,FPn +// |d m+-rxwpi| FMOVE.f ,FPn +// |dam+-rwxpi| FMOVE.L ,ctl +// |dam+-rxwpi| FMOVEM.L ,ctl +// 実際にどのアドレッシングモードが有効かどうかは極力個別の命令内で判断する? +// ここは実行サイクル数的な分類。 +// +// (FetchData) +// |d m+-rxwpi| AND/OR/CHK ,Dn +// |d m+-rxwpi| MOVE.B ,dst +// |d m+-rxwpi| MOVE ,CCR/SR +// |d m+-rxwpi| MUL*/DIV* ,Dn +// |d m+-rxwp | (*) TST.B +// |d m+-rxwp | (*) CMPI #, +// | m+-rxwp | (*) BTST.B #, +// | m+-rxwpi| (*) BTST.B Dx, +// +// (FetchAll) +// |dam+-rxwpi| ADD/SUB/CMP ,Dn +// |dam+-rxwpi| MOVEA/ADDA/SUBA/CMPA ,An +// |dam+-rxwpi| TST.WL +// |dam+-rxwpi| MOVE.WL ,dst +// +// (たぶん別対応) +// | m -rxw | MOVEM list, +// | m -rxw | FMOVEM.X reg, +// | m -rxw | FSAVE +// | m+ rxwp | MOVEM ,list +// | m+ rxwp | FMOVEM.X ,reg +// | m+ rxwp | FRESTORE + +#include "mpu680x0.h" + +// +// Calc EA +// + +uint32 +MPU680x0Device::cea_anin(int n) +{ + CYCLE(2); + return internal_ea_anin(n); +} + +uint32 +MPU680x0Device::cea_anpi_8(int n) +{ + CYCLE(2); + return internal_ea_anpi_8(n); +} + +uint32 +MPU680x0Device::cea_anpi_16(int n) +{ + CYCLE(2); + return internal_ea_anpi_16(n); +} + +uint32 +MPU680x0Device::cea_anpi_32(int n) +{ + CYCLE(2); + return internal_ea_anpi_32(n); +} + +uint32 +MPU680x0Device::cea_anpd_8(int n) +{ + CYCLE(2); + return internal_ea_anpd_8(n); +} + +uint32 +MPU680x0Device::cea_anpd_16(int n) +{ + CYCLE(2); + return internal_ea_anpd_16(n); +} + +uint32 +MPU680x0Device::cea_anpd_32(int n) +{ + CYCLE(2); + return internal_ea_anpd_32(n); +} + +uint32 +MPU680x0Device::cea_andi(int n) +{ + CYCLE(2); + return internal_ea_andi(n); +} + +uint32 +MPU680x0Device::cea_anix(int n) +{ + CYCLE(10); // XXX 4,4-18,20 + return internal_ea_anix(n); +} + +uint32 +MPU680x0Device::cea_absw() +{ + CYCLE(2); + return internal_ea_absw(); +} + +uint32 +MPU680x0Device::cea_absl() +{ + CYCLE(4); + return internal_ea_absl(); +} + +uint32 +MPU680x0Device::cea_pcdi() +{ + CYCLE(2); + return internal_ea_pcdi(); +} + +uint32 +MPU680x0Device::cea_pcix() +{ + CYCLE(10); // XXX 4,4-18,20 + return internal_ea_pcix(); +} + +// +// Fetch EA +// + +inline uint32 +MPU680x0Device::fea_anin() +{ + CYCLE(3); + return internal_ea_anin(eanum(ir)); +} + +inline uint32 +MPU680x0Device::fea_anpi_8() +{ + CYCLE(3); + return internal_ea_anpi_8(eanum(ir)); +} + +inline uint32 +MPU680x0Device::fea_anpi_16() +{ + CYCLE(3); + return internal_ea_anpi_16(eanum(ir)); +} + +inline uint32 +MPU680x0Device::fea_anpi_32() +{ + CYCLE(3); + return internal_ea_anpi_32(eanum(ir)); +} + +inline uint32 +MPU680x0Device::fea_anpd_8() +{ + CYCLE(4); + return internal_ea_anpd_8(eanum(ir)); +} + +inline uint32 +MPU680x0Device::fea_anpd_16() +{ + CYCLE(4); + return internal_ea_anpd_16(eanum(ir)); +} + +inline uint32 +MPU680x0Device::fea_anpd_32() +{ + CYCLE(4); + return internal_ea_anpd_32(eanum(ir)); +} + +inline uint32 +MPU680x0Device::fea_andi() +{ + CYCLE(4); + return internal_ea_andi(eanum(ir)); +} + +inline uint32 +MPU680x0Device::fea_anix() +{ + CYCLE2(12, 14); // XXX 6,6-18,21 + return internal_ea_anix(eanum(ir)); +} + +inline uint32 +MPU680x0Device::fea_absw() +{ + CYCLE(4); + return internal_ea_absw(); +} + +inline uint32 +MPU680x0Device::fea_absl() +{ + CYCLE2(4, 5); + return internal_ea_absl(); +} + +inline uint32 +MPU680x0Device::fea_pcdi() +{ + CYCLE(4); + return internal_ea_pcdi(); +} + +inline uint32 +MPU680x0Device::fea_pcix() +{ + CYCLE2(12, 14); // XXX 6,6-18,21 + return internal_ea_pcix(); +} + +inline void +MPU680x0Device::fea_imm_16() +{ + CYCLE(2); +} + +inline void +MPU680x0Device::fea_imm_32() +{ + CYCLE(4); +} // // EA の拡張ワード // uint32 -internal_ea_ix(m68kcpu *cpu, uint32 anpc) +MPU680x0Device::internal_ea_ix(uint32 anpc) { - uint16 ext = m68030_fetch_16(cpu); + uint16 ext = fetch_16(); int rn = (ext >> 12) & 15; bool idx_long = (ext & 0x0800); int scale = (ext >> 9) & 3; @@ -37,9 +333,9 @@ internal_ea_ix(m68kcpu *cpu, uint32 anpc uint32 idx; if (idx_long) { - idx = RegR(rn); + idx = reg.R[rn]; } else { - idx = (int32)(int16)(RegR(rn) & 0xffff); + idx = (int32)(int16)(reg.R[rn] & 0xffff); } idx <<= scale; return anpc + (int32)idx + disp; @@ -85,11 +381,11 @@ internal_ea_ix(m68kcpu *cpu, uint32 anpc case 1: // ベースはヌル break; case 2: // ベース.W - base = (int32)(int16)m68030_fetch_16(cpu); + base = (int32)(int16)fetch_16(); CYCLE2(2, 3); break; case 3: // ベース.L - base = m68030_fetch_32(cpu); + base = fetch_32(); CYCLE2(4, 6); break; default: @@ -101,9 +397,9 @@ internal_ea_ix(m68kcpu *cpu, uint32 anpc // インデックス uint32 idx = 0; if (idx_long) { - idx = RegR(rn); + idx = reg.R[rn]; } else { - idx = (int32)(int16)(RegR(rn) & 0xffff); + idx = (int32)(int16)(reg.R[rn] & 0xffff); } idx <<= scale; @@ -114,30 +410,30 @@ internal_ea_ix(m68kcpu *cpu, uint32 anpc case 1: // indirect pre-index with null outer CYCLE(10); - return m68030_read_32(cpu, anpc + base + idx); + return read_32(anpc + base + idx); case 2: // indirect pre-index with word outer CYCLE2(10+2, 10+3); - outer = (int32)(int16)m68030_fetch_16(cpu); - return m68030_read_32(cpu, anpc + base + idx) + outer; + outer = (int32)(int16)fetch_16(); + return read_32(anpc + base + idx) + outer; case 3: // indirect pre-index with long outer CYCLE2(10+2, 10+3); - outer = m68030_fetch_32(cpu); - return m68030_read_32(cpu, anpc + base + idx) + outer; + outer = fetch_32(); + return read_32(anpc + base + idx) + outer; case 4: PANIC("iis==4 reserved"); case 5: // indirect post-index with null outer CYCLE(10); - return m68030_read_32(cpu, anpc + base) + idx; + return read_32(anpc + base) + idx; case 6: // indirect post-index with word outer CYCLE2(10+2, 10+3); - outer = (int32)(int16)m68030_fetch_16(cpu); - return m68030_read_32(cpu, anpc + base) + idx + outer; + outer = (int32)(int16)fetch_16(); + return read_32(anpc + base) + idx + outer; case 7: // indirect post-index with long outer CYCLE2(10+2, 10+3); - outer = m68030_fetch_32(cpu); - return m68030_read_32(cpu, anpc + base) + idx + outer; + outer = fetch_32(); + return read_32(anpc + base) + idx + outer; default: __unreachable(); } @@ -149,15 +445,15 @@ internal_ea_ix(m68kcpu *cpu, uint32 anpc case 1: // memory indirect with null outer CYCLE(10); - return m68030_read_32(cpu, anpc + base); + return read_32(anpc + base); case 2: // memory indirect with word outer CYCLE2(10+2, 10+3); - outer = (int32)(int16)m68030_fetch_16(cpu); - return m68030_read_32(cpu, anpc + base) + outer; + outer = (int32)(int16)fetch_16(); + return read_32(anpc + base) + outer; case 3: // memory indirect with long outer CYCLE2(10+2, 10+3); - outer = m68030_fetch_32(cpu); - return m68030_read_32(cpu, anpc + base) + outer; + outer = fetch_32(); + return read_32(anpc + base) + outer; default: PANIC("is==1 && iis>3 reserved"); } @@ -170,150 +466,150 @@ internal_ea_ix(m68kcpu *cpu, uint32 anpc // uint32 -cea_ctrl(m68kcpu *cpu) +MPU680x0Device::cea_ctrl() { - switch (eamode(RegIR)) { + switch (eamode(ir)) { case 2: // (An) - return cea_anin(cpu, eanum(RegIR)); + return cea_anin(eanum(ir)); case 5: // d16(An) - return cea_andi(cpu, eanum(RegIR)); + return cea_andi(eanum(ir)); case 6: // (An,IX) - return cea_anix(cpu, eanum(RegIR)); + return cea_anix(eanum(ir)); case 7: - switch (eanum(RegIR)) { + switch (eanum(ir)) { case 0: // Abs.W - return cea_absw(cpu); + return cea_absw(); case 1: // Abs.L - return cea_absl(cpu); + return cea_absl(); case 2: // d16(PC) - return cea_pcdi(cpu); + return cea_pcdi(); case 3: // (PC,IX) - return cea_pcix(cpu); + return cea_pcix(); default: break; } break; } // 不当命令 - throw M68K_EXCEP_ILLEGAL; + throw M68K::EXCEP_ILLEGAL; } uint32 -cea_data_8(m68kcpu *cpu) +MPU680x0Device::cea_data_8() { - switch (eamode(RegIR)) { + switch (eamode(ir)) { case 2: // (An) - return cea_anin(cpu, eanum(RegIR)); + return cea_anin(eanum(ir)); case 3: // (An)+ - return cea_anpi_8(cpu, eanum(RegIR)); + return cea_anpi_8(eanum(ir)); case 4: // -(An) - return cea_anpd_8(cpu, eanum(RegIR)); + return cea_anpd_8(eanum(ir)); case 5: // d16(An) - return cea_andi(cpu, eanum(RegIR)); + return cea_andi(eanum(ir)); case 6: // (An,IX) - return cea_anix(cpu, eanum(RegIR)); + return cea_anix(eanum(ir)); case 7: - switch (eanum(RegIR)) { + switch (eanum(ir)) { case 0: // Abs.W - return cea_absw(cpu); + return cea_absw(); case 1: // Abs.L - return cea_absl(cpu); + return cea_absl(); default: break; } break; } // 不当命令 - throw M68K_EXCEP_ILLEGAL; + throw M68K::EXCEP_ILLEGAL; } uint32 -cea_data_16(m68kcpu *cpu) +MPU680x0Device::cea_data_16() { - switch (eamode(RegIR)) { + switch (eamode(ir)) { case 2: // (An) - return cea_anin(cpu, eanum(RegIR)); + return cea_anin(eanum(ir)); case 3: // (An)+ - return cea_anpi_16(cpu, eanum(RegIR)); + return cea_anpi_16(eanum(ir)); case 4: // -(An) - return cea_anpd_16(cpu, eanum(RegIR)); + return cea_anpd_16(eanum(ir)); case 5: // d16(An) - return cea_andi(cpu, eanum(RegIR)); + return cea_andi(eanum(ir)); case 6: // (An,IX) - return cea_anix(cpu, eanum(RegIR)); + return cea_anix(eanum(ir)); case 7: - switch (eanum(RegIR)) { + switch (eanum(ir)) { case 0: // Abs.W - return cea_absw(cpu); + return cea_absw(); case 1: // Abs.L - return cea_absl(cpu); + return cea_absl(); default: break; } break; } // 不当命令 - throw M68K_EXCEP_ILLEGAL; + throw M68K::EXCEP_ILLEGAL; } uint32 -cea_data_32(m68kcpu *cpu) +MPU680x0Device::cea_data_32() { - switch (eamode(RegIR)) { + switch (eamode(ir)) { case 2: // (An) - return cea_anin(cpu, eanum(RegIR)); + return cea_anin(eanum(ir)); case 3: // (An)+ - return cea_anpi_32(cpu, eanum(RegIR)); + return cea_anpi_32(eanum(ir)); case 4: // -(An) - return cea_anpd_32(cpu, eanum(RegIR)); + return cea_anpd_32(eanum(ir)); case 5: // d16(An) - return cea_andi(cpu, eanum(RegIR)); + return cea_andi(eanum(ir)); case 6: // (An,IX) - return cea_anix(cpu, eanum(RegIR)); + return cea_anix(eanum(ir)); case 7: - switch (eanum(RegIR)) { + switch (eanum(ir)) { case 0: // Abs.W - return cea_absw(cpu); + return cea_absw(); case 1: // Abs.L - return cea_absl(cpu); + return cea_absl(); default: break; } break; } // 不当命令 - throw M68K_EXCEP_ILLEGAL; + throw M68K::EXCEP_ILLEGAL; } // MMU からの呼び出し用。 uint32 -cea_copro(m68kcpu *cpu) +MPU680x0Device::cea_copro() { - switch (eamode(RegIR)) { + switch (eamode(ir)) { case 2: // (An) CYCLE(4); - return internal_ea_anin(cpu, eanum(RegIR)); + return internal_ea_anin(eanum(ir)); case 5: // d16(An) CYCLE(4); - return internal_ea_andi(cpu, eanum(RegIR)); + return internal_ea_andi(eanum(ir)); case 6: // (An,IX) CYCLE(4); - return internal_ea_anix(cpu, eanum(RegIR)); + return internal_ea_anix(eanum(ir)); case 7: - switch (eanum(RegIR)) { + switch (eanum(ir)) { case 0: // Abs.W CYCLE(4); - return internal_ea_absw(cpu); + return internal_ea_absw(); case 1: // Abs.L CYCLE(6); - return internal_ea_absl(cpu); + return internal_ea_absl(); default: break; } break; } // 不当命令 - throw M68K_EXCEP_ILLEGAL; + throw M68K::EXCEP_ILLEGAL; } // @@ -321,45 +617,45 @@ cea_copro(m68kcpu *cpu) // uint32 -fea_data_8(m68kcpu *cpu) +MPU680x0Device::fea_data_8() { uint32 ea; - switch (eamode(RegIR)) { + switch (eamode(ir)) { case 0: // Dn - return RegD(eanum(RegIR)) & 0xff; + return reg.D[eanum(ir)] & 0xff; case 2: // (An) - ea = fea_anin(cpu); - return m68030_read_8(cpu, ea); + ea = fea_anin(); + return read_8(ea); case 3: // (An)+ - ea = fea_anpi_8(cpu); - return m68030_read_8(cpu, ea); + ea = fea_anpi_8(); + return read_8(ea); case 4: // -(An) - ea = fea_anpd_8(cpu); - return m68030_read_8(cpu, ea); + ea = fea_anpd_8(); + return read_8(ea); case 5: // d16(An) - ea = fea_andi(cpu); - return m68030_read_8(cpu, ea); + ea = fea_andi(); + return read_8(ea); case 6: // (An,IX) - ea = fea_anix(cpu); - return m68030_read_8(cpu, ea); + ea = fea_anix(); + return read_8(ea); case 7: - switch (eanum(RegIR)) { + switch (eanum(ir)) { case 0: // Abs.W - ea = fea_absw(cpu); - return m68030_read_8(cpu, ea); + ea = fea_absw(); + return read_8(ea); case 1: // Abs.L - ea = fea_absl(cpu); - return m68030_read_8(cpu, ea); + ea = fea_absl(); + return read_8(ea); case 2: // d16(PC) - ea = fea_pcdi(cpu); - return m68030_read_8(cpu, ea); + ea = fea_pcdi(); + return read_8(ea); case 3: // (PC,IX) - ea = fea_pcix(cpu); - return m68030_read_8(cpu, ea); + ea = fea_pcix(); + return read_8(ea); case 4: // #imm - fea_imm_16(cpu); - return m68030_fetch_16(cpu) & 0xff; + fea_imm_16(); + return fetch_16() & 0xff; default: break; } @@ -368,49 +664,49 @@ fea_data_8(m68kcpu *cpu) break; } // 不当命令 - throw M68K_EXCEP_ILLEGAL; + throw M68K::EXCEP_ILLEGAL; } uint32 -fea_data_16(m68kcpu *cpu) +MPU680x0Device::fea_data_16() { uint32 ea; - switch (eamode(RegIR)) { + switch (eamode(ir)) { case 0: // Dn - return RegD(eanum(RegIR)) & 0xffff; + return reg.D[eanum(ir)] & 0xffff; case 2: // (An) - ea = fea_anin(cpu); - return m68030_read_16(cpu, ea); + ea = fea_anin(); + return read_16(ea); case 3: // (An)+ - ea = fea_anpi_16(cpu); - return m68030_read_16(cpu, ea); + ea = fea_anpi_16(); + return read_16(ea); case 4: // -(An) - ea = fea_anpd_16(cpu); - return m68030_read_16(cpu, ea); + ea = fea_anpd_16(); + return read_16(ea); case 5: // d16(An) - ea = fea_andi(cpu); - return m68030_read_16(cpu, ea); + ea = fea_andi(); + return read_16(ea); case 6: // (An,IX) - ea = fea_anix(cpu); - return m68030_read_16(cpu, ea); + ea = fea_anix(); + return read_16(ea); case 7: - switch (eanum(RegIR)) { + switch (eanum(ir)) { case 0: // Abs.W - ea = fea_absw(cpu); - return m68030_read_16(cpu, ea); + ea = fea_absw(); + return read_16(ea); case 1: // Abs.L - ea = fea_absl(cpu); - return m68030_read_16(cpu, ea); + ea = fea_absl(); + return read_16(ea); case 2: // d16(PC) - ea = fea_pcdi(cpu); - return m68030_read_16(cpu, ea); + ea = fea_pcdi(); + return read_16(ea); case 3: // (PC,IX) - ea = fea_pcix(cpu); - return m68030_read_16(cpu, ea); + ea = fea_pcix(); + return read_16(ea); case 4: // #imm - fea_imm_16(cpu); - return m68030_fetch_16(cpu); + fea_imm_16(); + return fetch_16(); default: break; } @@ -419,49 +715,49 @@ fea_data_16(m68kcpu *cpu) break; } // 不当命令 - throw M68K_EXCEP_ILLEGAL; + throw M68K::EXCEP_ILLEGAL; } uint32 -fea_data_32(m68kcpu *cpu) +MPU680x0Device::fea_data_32() { uint32 ea; - switch (eamode(RegIR)) { + switch (eamode(ir)) { case 0: // Dn - return RegD(eanum(RegIR)); + return reg.D[eanum(ir)]; case 2: // (An) - ea = fea_anin(cpu); - return m68030_read_32(cpu, ea); + ea = fea_anin(); + return read_32(ea); case 3: // (An)+ - ea = fea_anpi_32(cpu); - return m68030_read_32(cpu, ea); + ea = fea_anpi_32(); + return read_32(ea); case 4: // -(An) - ea = fea_anpd_32(cpu); - return m68030_read_32(cpu, ea); + ea = fea_anpd_32(); + return read_32(ea); case 5: // d16(An) - ea = fea_andi(cpu); - return m68030_read_32(cpu, ea); + ea = fea_andi(); + return read_32(ea); case 6: // (An,IX) - ea = fea_anix(cpu); - return m68030_read_32(cpu, ea); + ea = fea_anix(); + return read_32(ea); case 7: - switch (eanum(RegIR)) { + switch (eanum(ir)) { case 0: // Abs.W - ea = fea_absw(cpu); - return m68030_read_32(cpu, ea); + ea = fea_absw(); + return read_32(ea); case 1: // Abs.L - ea = fea_absl(cpu); - return m68030_read_32(cpu, ea); + ea = fea_absl(); + return read_32(ea); case 2: // d16(PC) - ea = fea_pcdi(cpu); - return m68030_read_32(cpu, ea); + ea = fea_pcdi(); + return read_32(ea); case 3: // (PC,IX) - ea = fea_pcix(cpu); - return m68030_read_32(cpu, ea); + ea = fea_pcix(); + return read_32(ea); case 4: // #imm - fea_imm_32(cpu); - return m68030_fetch_32(cpu); + fea_imm_32(); + return fetch_32(); default: break; } @@ -470,52 +766,52 @@ fea_data_32(m68kcpu *cpu) break; } // 不当命令 - throw M68K_EXCEP_ILLEGAL; + throw M68K::EXCEP_ILLEGAL; } uint32 -fea_all_8(m68kcpu *cpu) +MPU680x0Device::fea_all_8() { uint32 ea; - switch (eamode(RegIR)) { + switch (eamode(ir)) { case 0: // Dn - return RegD(eanum(RegIR)) & 0xff; + return reg.D[eanum(ir)] & 0xff; case 1: // An // An.B は不当命令 break; case 2: // (An) - ea = fea_anin(cpu); - return m68030_read_8(cpu, ea); + ea = fea_anin(); + return read_8(ea); case 3: // (An)+ - ea = fea_anpi_8(cpu); - return m68030_read_8(cpu, ea); + ea = fea_anpi_8(); + return read_8(ea); case 4: // -(An) - ea = fea_anpd_8(cpu); - return m68030_read_8(cpu, ea); + ea = fea_anpd_8(); + return read_8(ea); case 5: // d16(An) - ea = fea_andi(cpu); - return m68030_read_8(cpu, ea); + ea = fea_andi(); + return read_8(ea); case 6: // (An,IX) - ea = fea_anix(cpu); - return m68030_read_8(cpu, ea); + ea = fea_anix(); + return read_8(ea); case 7: - switch (eanum(RegIR)) { + switch (eanum(ir)) { case 0: // Abs.W - ea = fea_absw(cpu); - return m68030_read_8(cpu, ea); + ea = fea_absw(); + return read_8(ea); case 1: // Abs.L - ea = fea_absl(cpu); - return m68030_read_8(cpu, ea); + ea = fea_absl(); + return read_8(ea); case 2: // d16(PC) - ea = fea_pcdi(cpu); - return m68030_read_8(cpu, ea); + ea = fea_pcdi(); + return read_8(ea); case 3: // (PC,IX) - ea = fea_pcix(cpu); - return m68030_read_8(cpu, ea); + ea = fea_pcix(); + return read_8(ea); case 4: // #imm - fea_imm_16(cpu); - return m68030_fetch_16(cpu) & 0xff; + fea_imm_16(); + return fetch_16() & 0xff; default: break; } @@ -524,50 +820,50 @@ fea_all_8(m68kcpu *cpu) break; } // 不当命令 - throw M68K_EXCEP_ILLEGAL; + throw M68K::EXCEP_ILLEGAL; } uint32 -fea_all_16(m68kcpu *cpu) +MPU680x0Device::fea_all_16() { uint32 ea; - switch (eamode(RegIR)) { + switch (eamode(ir)) { case 0: // Dn case 1: // An - return RegR(RegIR & 15) & 0xffff; + return reg.R[ir & 15] & 0xffff; case 2: // (An) - ea = fea_anin(cpu); - return m68030_read_16(cpu, ea); + ea = fea_anin(); + return read_16(ea); case 3: // (An)+ - ea = fea_anpi_16(cpu); - return m68030_read_16(cpu, ea); + ea = fea_anpi_16(); + return read_16(ea); case 4: // -(An) - ea = fea_anpd_16(cpu); - return m68030_read_16(cpu, ea); + ea = fea_anpd_16(); + return read_16(ea); case 5: // d16(An) - ea = fea_andi(cpu); - return m68030_read_16(cpu, ea); + ea = fea_andi(); + return read_16(ea); case 6: // (An,IX) - ea = fea_anix(cpu); - return m68030_read_16(cpu, ea); + ea = fea_anix(); + return read_16(ea); case 7: - switch (eanum(RegIR)) { + switch (eanum(ir)) { case 0: // Abs.W - ea = fea_absw(cpu); - return m68030_read_16(cpu, ea); + ea = fea_absw(); + return read_16(ea); case 1: // Abs.L - ea = fea_absl(cpu); - return m68030_read_16(cpu, ea); + ea = fea_absl(); + return read_16(ea); case 2: // d16(PC) - ea = fea_pcdi(cpu); - return m68030_read_16(cpu, ea); + ea = fea_pcdi(); + return read_16(ea); case 3: // (PC,IX) - ea = fea_pcix(cpu); - return m68030_read_16(cpu, ea); + ea = fea_pcix(); + return read_16(ea); case 4: // #imm - fea_imm_16(cpu); - return m68030_fetch_16(cpu); + fea_imm_16(); + return fetch_16(); default: break; } @@ -576,50 +872,50 @@ fea_all_16(m68kcpu *cpu) break; } // 不当命令 - throw M68K_EXCEP_ILLEGAL; + throw M68K::EXCEP_ILLEGAL; } uint32 -fea_all_32(m68kcpu *cpu) +MPU680x0Device::fea_all_32() { uint32 ea; - switch (eamode(RegIR)) { + switch (eamode(ir)) { case 0: // Dn case 1: // An - return RegR(RegIR & 15); + return reg.R[ir & 15]; case 2: // (An) - ea = fea_anin(cpu); - return m68030_read_32(cpu, ea); + ea = fea_anin(); + return read_32(ea); case 3: // (An)+ - ea = fea_anpi_32(cpu); - return m68030_read_32(cpu, ea); + ea = fea_anpi_32(); + return read_32(ea); case 4: // -(An) - ea = fea_anpd_32(cpu); - return m68030_read_32(cpu, ea); + ea = fea_anpd_32(); + return read_32(ea); case 5: // d16(An) - ea = fea_andi(cpu); - return m68030_read_32(cpu, ea); + ea = fea_andi(); + return read_32(ea); case 6: // (An,IX) - ea = fea_anix(cpu); - return m68030_read_32(cpu, ea); + ea = fea_anix(); + return read_32(ea); case 7: - switch (eanum(RegIR)) { + switch (eanum(ir)) { case 0: // Abs.W - ea = fea_absw(cpu); - return m68030_read_32(cpu, ea); + ea = fea_absw(); + return read_32(ea); case 1: // Abs.L - ea = fea_absl(cpu); - return m68030_read_32(cpu, ea); + ea = fea_absl(); + return read_32(ea); case 2: // d16(PC) - ea = fea_pcdi(cpu); - return m68030_read_32(cpu, ea); + ea = fea_pcdi(); + return read_32(ea); case 3: // (PC,IX) - ea = fea_pcix(cpu); - return m68030_read_32(cpu, ea); + ea = fea_pcix(); + return read_32(ea); case 4: // #imm - fea_imm_32(cpu); - return m68030_fetch_32(cpu); + fea_imm_32(); + return fetch_32(); default: break; } @@ -628,5 +924,5 @@ fea_all_32(m68kcpu *cpu) break; } // 不当命令 - throw M68K_EXCEP_ILLEGAL; + throw M68K::EXCEP_ILLEGAL; }