--- nono/debugger/vectortable.cpp 2026/04/29 17:05:28 1.1.1.5 +++ nono/debugger/vectortable.cpp 2026/04/29 17:05:32 1.1.1.6 @@ -11,6 +11,7 @@ #include "vectortable.h" #include "mainapp.h" #include "mainbus.h" +#include "monitor.h" #include "mpu.h" // コンストラクタ @@ -26,7 +27,7 @@ VectorTable::VectorTable(VMType vmtype) case VMType::LUNA1: case VMType::NEWS: case VMType::VIRT68K: - InitTableM68030(vmtype); + InitTableM680x0(vmtype); break; case VMType::LUNA88K: InitTableLuna88k(); @@ -35,39 +36,51 @@ VectorTable::VectorTable(VMType vmtype) PANIC("invalid vmtype %d", (int)vmtype); } - monitor.func = ToMonitorCallback(&VectorTable::MonitorUpdate); - monitor.SetSize(75, 1 + 32); // ヘッダの1行と全エントリ数 - monitor.SetMaxHeight(1 + Size()); - monitor.Regist(ID_SUBWIN_VECTOR); + monitor = gMonitorManager->Regist(ID_SUBWIN_VECTOR, this); + monitor->func = ToMonitorCallback(&VectorTable::MonitorUpdate); + monitor->SetSize(75, 1 + 32); // ヘッダの1行と全エントリ数 + monitor->SetMaxHeight(1 + Size()); } -// X68030、LUNA-I の表示名テーブル初期化。コンストラクタの一部。 +// m68k 機種の表示名テーブル初期化。コンストラクタの一部。 void -VectorTable::InitTableM68030(VMType vmtype) +VectorTable::InitTableM680x0(VMType vmtype) { nametable.clear(); nametable.resize(256); - // まず m68k 標準の名称で埋める + // まず m680x0 標準の名称で埋める for (int v = 0; v < 64; v++) { - if (name_m68030[v]) { - nametable[v] = name_m68030[v]; + if (name_m680x0[v]) { + nametable[v] = name_m680x0[v]; } } // 機種ごとに必要なところだけ上書き const std::map *names; - if (vmtype == VMType::X68030) { + switch (vmtype) { + case VMType::X68030: names = &name_x68030; - } else if (vmtype == VMType::LUNA1) { + break; + case VMType::LUNA1: names = &name_luna1; - } else { + break; + case VMType::NEWS: names = &name_news; + break; + case VMType::VIRT68K: + names = &name_virt68k; + break; + default: + names = NULL; + break; } - for (const auto& p : *names) { - int v = p.first; - const char *name = p.second; - nametable[v] = name; + if (names) { + for (const auto& p : *names) { + int v = p.first; + const char *name = p.second; + nametable[v] = name; + } } } @@ -196,8 +209,9 @@ VectorTable::MonitorUpdate(Monitor *, Te } } -// ベクタ名 (MC68030 共通) -/*static*/ std::array VectorTable::name_m68030 = { +// ベクタ名 (MC680x0)。 +// とりあえず CPU の区別はないことにする。 +/*static*/ std::array VectorTable::name_m680x0 = { // 0123456789012345678 <- 例外履歴欄の横幅 /* 0 */ "Reset (SP)", /* 1 */ "Reset (PC)", @@ -206,13 +220,13 @@ VectorTable::MonitorUpdate(Monitor *, Te /* 4 */ "Illegal Instruction", /* 5 */ "Zero Divide", /* 6 */ "CHK/CHK2 Insn", - /* 7 */ "TRAPV, *TRAPcc Insn", - /* 8 */ "PriviledgeViolation", + /* 7 */ "TRAPV/*TRAPcc Insn", + /* 8 */ "Privilege Violation", /* 9 */ "Trace", - /* 10 */ "Line 1010 emulator", - /* 11 */ "Line 1111 emulator", + /* 10 */ "Line A emulator", + /* 11 */ "Line F emulator", /* 12 */ NULL, - /* 13 */ "CoproProtoViolation", + /* 13 */ "CoproProtoViolation", // 68030 only /* 14 */ "Format Error", /* 15 */ "Uninitialized Intr", /* 16 */ NULL, NULL, NULL, NULL, @@ -249,8 +263,8 @@ VectorTable::MonitorUpdate(Monitor *, Te /* 52 */ "FPCP Operand Error", /* 53 */ "FPCP OverFlow", /* 54 */ "FPCP Signaling NAN", - /* 55 */ NULL, - /* 56 */ "MMU Config Error", + /* 55 */ "FPCP UnsuppDataType", // 68040 only + /* 56 */ "MMU Config Error", // 68030 only /* 57 */ NULL, /* 58 */ NULL, /* 59 */ NULL, @@ -340,6 +354,18 @@ VectorTable::MonitorUpdate(Monitor *, Te { 0x40, "SCC" }, }; +// virt-m68k +/*static*/ std::map VectorTable::name_virt68k = { + // 0123456789012345678 <- 例外履歴欄の横幅 + { 0x19, "Lv1 Intr (GFPIC1)" }, + { 0x1a, "Lv2 Intr (GFPIC2)" }, + { 0x1b, "Lv3 Intr (GFPIC3)" }, + { 0x1c, "Lv4 Intr (GFPIC4)" }, + { 0x1d, "Lv5 Intr (GFPIC5)" }, + { 0x1e, "Lv6 Intr (GFPIC6)" }, + { 0x1f, "Lv7 Intr" }, +}; + // LUNA-88K は先頭11個のみ (残りはコードで処理) /*static*/ std::array VectorTable::name_luna88k = { // 01234567890123456789012 <- 例外履歴欄の横幅