--- nono/debugger/vectortable.cpp 2026/04/29 17:05:09 1.1.1.1 +++ nono/debugger/vectortable.cpp 2026/04/29 17:05:32 1.1.1.6 @@ -9,74 +9,82 @@ // #include "vectortable.h" -#include "bus.h" #include "mainapp.h" +#include "mainbus.h" +#include "monitor.h" #include "mpu.h" -// グローバル参照用 -VectorTable *gVectorTable; - // コンストラクタ -VectorTable::VectorTable(int vmtype) - : inherited("(VectorTable)") +VectorTable::VectorTable(VMType vmtype) + : inherited(OBJ_VECTOR_TABLE) { // ログは不要 ClearAlias(); // 表示名を作成。それぞれ微妙に処理が違う… switch (vmtype) { - case VMTYPE_X68030: - case VMTYPE_LUNA1: - InitTableM68030(vmtype); + case VMType::X68030: + case VMType::LUNA1: + case VMType::NEWS: + case VMType::VIRT68K: + InitTableM680x0(vmtype); break; - case VMTYPE_LUNA88K: + case VMType::LUNA88K: InitTableLuna88k(); break; + default: + PANIC("invalid vmtype %d", (int)vmtype); } - monitor.func = ToMonitorCallback(&VectorTable::MonitorUpdate); - monitor.SetSize(49, 33); - 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()); } -// デストラクタ -VectorTable::~VectorTable() -{ - gVectorTable = NULL; -} - -// X68030、LUNA-I の表示名テーブル初期化 +// m68k 機種の表示名テーブル初期化。コンストラクタの一部。 void -VectorTable::InitTableM68030(int 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]; } } - if (vmtype == VMTYPE_X68030) { - // X68030 なら、 - // 全域で、あれば X68030 用の名前で上書き - for (int v = 0; v < nametable.size(); v++) { - if (name_x68030[v]) { - nametable[v] = name_x68030[v]; - } - } - } else { - // LUNA-I なら、 - // レベル割り込み名だけ上書き - for (int i = 0; i < countof(name_luna1); i++) { - nametable[0x19 + i] = name_luna1[i]; + // 機種ごとに必要なところだけ上書き + const std::map *names; + switch (vmtype) { + case VMType::X68030: + names = &name_x68030; + break; + case VMType::LUNA1: + names = &name_luna1; + break; + case VMType::NEWS: + names = &name_news; + break; + case VMType::VIRT68K: + names = &name_virt68k; + break; + default: + names = NULL; + break; + } + if (names) { + for (const auto& p : *names) { + int v = p.first; + const char *name = p.second; + nametable[v] = name; } } } -// LUNA-88K の表示名テーブルを初期化 +// LUNA-88K の表示名テーブルを初期化。コンストラクタの一部。 void VectorTable::InitTableLuna88k() { @@ -96,6 +104,9 @@ VectorTable::InitTableLuna88k() nametable[114] = "SFU1 Precise Exception"; nametable[115] = "SFU1 ImpreciseException"; + // NetBSD/luna88k + nametable[128] = "NetBSD System Call"; + // OpenBSD // XXX 本来は OpenBSD 稼働時に限定すべきだろうけど、そうする意味もない // 01234567890123456789012 @@ -106,6 +117,25 @@ VectorTable::InitTableLuna88k() nametable[511] = "OpenBSD userbpt"; } +// デストラクタ +VectorTable::~VectorTable() +{ +} + +// 初期化 +bool +VectorTable::Init() +{ + if (inherited::Init() == false) { + return false; + } + + mainbus = GetMainbusDevice(); + mpu = GetMPUDevice(); + + return true; +} + // 例外名を返す (ベクタテーブル用)。 // 名前がなければ "" を返す。 const char * @@ -124,7 +154,7 @@ VectorTable::GetExceptionName(int vector assertmsg(0 <= vector && vector < nametable.size(), "vector=%d", vector); if (__predict_false(vector < 2)) { - if (gMainApp.HasVMFeature(VMF_M68K)) { + if (gMainApp.Has(VMCap::M68K)) { // ベクタテーブル的には 0:"Reset(SP)"、1:"Reset(PC)" のほうが // 分かりやすいが、例外の名前は 0 が "Reset Exception" で // 1 は存在しない。 @@ -147,12 +177,12 @@ VectorTable::GetExceptionName(int vector void VectorTable::MonitorUpdate(Monitor *, TextScreen& screen) { - // 0 1 2 3 4 5 6 - // 0123456789012345678901234567890123456789012345678901234567890123456789 - // No. Offset Address Name Count - // $02( 2) $0008 $12345678 01234567890123456789012 0123456789 +// 0 1 2 3 4 5 6 7 +// 012345678901234567890123456789012345678901234567890123456789012345678901234 +// No. Offset Address Name >< Count +// $02( 2) $0008 $12345678 0123456789012345678901201234567890123456789012345 - uint32 vbr = gMPU->GetVBR(); + uint32 vbr = mpu->GetVBR(); // userdata が表示開始位置 int v = (int)screen.userdata; @@ -163,22 +193,25 @@ VectorTable::MonitorUpdate(Monitor *, Te // 最初の1行は常にヘッダ screen.Print(0, 0, "No. Offset Address Name"); - //screen.Print(57, 0, "Count"); + screen.Print(70, 0, "Count"); for (int y = 1; v < vend; v++, y++) { - screen.Print(0, y, "$%02x(%3d) $%04x", v, v, v * 4); - uint64 addr = vm_phys_peek_32(vbr + v * 4); - if (__predict_false((int64)addr < 0)) { + screen.Print(0, y, "$%02x(%3u) $%04x", v, v, v * 4); + busdata addr = mainbus->Peek4(vbr + v * 4); + if (__predict_false(addr.IsBusErr())) { screen.Print(16, y, "BusErr"); } else { - screen.Print(16, y, "$%08x", (uint32)addr); + screen.Print(16, y, "$%08x", addr.Data()); } screen.Print(26, y, "%-23s", GetTableName(v)); + screen.Print(49, y, "%26s", + format_number(mpu->excep_counter[v]).c_str()); } } -// ベクタ名 (MC68030 共通) -/*static*/ std::array VectorTable::name_m68030 = { +// ベクタ名 (MC680x0)。 +// とりあえず CPU の区別はないことにする。 +/*static*/ std::array VectorTable::name_m680x0 = { // 0123456789012345678 <- 例外履歴欄の横幅 /* 0 */ "Reset (SP)", /* 1 */ "Reset (PC)", @@ -187,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, @@ -230,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, @@ -242,135 +275,100 @@ VectorTable::MonitorUpdate(Monitor *, Te }; // ベクタ名 (X68030) -/*static*/ std::array VectorTable::name_x68030 = { - /* $00 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - /* $08 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - /* $10 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - /* $18 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - /* $20 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - /* $28 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - /* $30 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - /* $38 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +/*static*/ std::map VectorTable::name_x68030 = { + // 0123456789012345678 + { 0x40, "MFP Alarm" }, + { 0x41, "MFP EXPON" }, + { 0x42, "MFP POWSW" }, + { 0x43, "MFP FM IRQ" }, + { 0x44, "MFP Timer-D" }, + { 0x45, "MFP Timer-C" }, + { 0x46, "MFP V-Disp" }, + { 0x47, "MFP GPIP5" }, + { 0x48, "MFP Timer-B" }, + { 0x49, "MFP TX Error" }, + { 0x4a, "MFP TX Empty" }, + { 0x4b, "MFP RX Error" }, + { 0x4c, "MFP RX Full" }, + { 0x4d, "MFP Timer-A" }, + { 0x4e, "MFP CRTC IRQ" }, + { 0x4f, "MFP H-Sync" }, + + { 0x50, "SCC#B TX Empty" }, + { 0x52, "SCC#B E/S" }, + { 0x54, "SCC#B RX Intr" }, + { 0x56, "SCC#B SpCond" }, + { 0x58, "SCC#A TX Empty" }, + { 0x5a, "SCC#A E/S" }, + { 0x5c, "SCC#A RX Intr" }, + { 0x5e, "SCC#A SpCond" }, + + // 0123456789012345678 + { 0x60, "I/O FDC Intr" }, + { 0x61, "I/O FDD Intr" }, + { 0x62, "I/O HDC Intr" }, + { 0x63, "I/O PRN Intr" }, + { 0x64, "DMAC#0 Complete" }, + { 0x65, "DMAC#0 Error" }, + { 0x66, "DMAC#1 Complete" }, + { 0x67, "DMAC#1 Error" }, + { 0x68, "DMAC#2 Complete" }, + { 0x69, "DMAC#2 Error" }, + { 0x6a, "DMAC#3 Complete" }, + { 0x6b, "DMAC#3 Error" }, + { 0x6c, "SPC Interrupt" }, + + // 0123456789012345678 + { 0xf0, "PSX16x50 Interrupt" }, + { 0xf6, "ExSPC Interrupt" }, + //0xf7, TS-6BSI + { 0xf8, "Nereid#1 Interrupt" }, + { 0xf9, "Neptune-X Interrupt" }, + { 0xfa, "Nereid#1 USB" }, + { 0xfb, "Nereid#0 USB" }, +}; - // 0123456789012345678 - /* $40 */ "MFP Alarm", - /* $41 */ "MFP EXPON", - /* $42 */ "MFP POWSW", - /* $43 */ "MFP FM IRQ", - /* $44 */ "MFP Timer-D", - /* $45 */ "MFP Timer-C", - /* $46 */ "MFP V-Disp", - /* $47 */ "MFP GPIP5", - /* $48 */ "MFP Timer-B", - /* $49 */ "MFP TX Error", - /* $4a */ "MFP TX Empty", - /* $4b */ "MFP RX Error", - /* $4c */ "MFP RX Full", - /* $4d */ "MFP Timer-A", - /* $4e */ "MFP CRTC IRQ", - /* $4f */ "MFP H-Sync", - /* $50 */ "SCC#B TX Empty", - /* $51 */ NULL, - /* $52 */ "SCC#B E/S", - /* $53 */ NULL, - /* $54 */ "SCC#B RX Intr", - /* $55 */ NULL, - /* $56 */ "SCC#B SpCond", - /* $57 */ NULL, - /* $58 */ "SCC#A TX Empty", - /* $59 */ NULL, - /* $5a */ "SCC#A E/S", - /* $5b */ NULL, - /* $5c */ "SCC#A RX Intr", - /* $5d */ NULL, - /* $5e */ "SCC#A SpCond", - /* $5f */ NULL, +// LUNA-I +/*static*/ std::map VectorTable::name_luna1 = { + // 0123456789012345678 <- 例外履歴欄の横幅 + { 0x19, "Lv1 Intr (XP Low)" }, + { 0x1a, "Lv2 Intr (SPC)" }, + { 0x1b, "Lv3 Intr (Lance)" }, + { 0x1c, "Lv4 Intr (XP High)" }, + { 0x1d, "Lv5 Intr (SysClk)" }, + { 0x1e, "Lv6 Intr (SIO)" }, + { 0x1f, "Lv7 Intr (NMI)" }, +}; - // 0123456789012345678 - /* $60 */ "I/O FDC Intr", - /* $61 */ "I/O FDD Intr", - /* $62 */ "I/O HDC Intr", - /* $63 */ "I/O PRN Intr", - /* $64 */ "DMAC#0 Complete", - /* $65 */ "DMAC#0 Error", - /* $66 */ "DMAC#1 Complete", - /* $67 */ "DMAC#1 Error", - /* $68 */ "DMAC#2 Complete", - /* $69 */ "DMAC#2 Error", - /* $6a */ "DMAC#3 Complete", - /* $6b */ "DMAC#3 Error", - /* $6c */ "SPC Interrupt", - /* $6d */ NULL, - /* $6e */ NULL, - /* $6f */ NULL, - - /* $70 */ NULL, NULL, NULL, NULL, - /* $74 */ NULL, NULL, NULL, NULL, - /* $78 */ NULL, NULL, NULL, NULL, - /* $7c */ NULL, NULL, NULL, NULL, - /* $80 */ NULL, NULL, NULL, NULL, // MIDI - /* $84 */ NULL, NULL, NULL, NULL, // MIDI - /* $88 */ NULL, NULL, NULL, NULL, // MIDI - /* $8c */ NULL, NULL, NULL, NULL, // MIDI - /* $90 */ NULL, NULL, NULL, NULL, - /* $94 */ NULL, NULL, NULL, NULL, - /* $98 */ NULL, NULL, NULL, NULL, - /* $9c */ NULL, NULL, NULL, NULL, - /* $a0 */ NULL, NULL, NULL, NULL, // MIDI - /* $a4 */ NULL, NULL, NULL, NULL, // MIDI - /* $a8 */ NULL, NULL, NULL, NULL, // MIDI - /* $ac */ NULL, NULL, NULL, NULL, // MIDI - /* $b0 */ NULL, NULL, NULL, NULL, // RS-232C - /* $b4 */ NULL, NULL, NULL, NULL, // RS-232C - /* $b8 */ NULL, NULL, NULL, NULL, // RS-232C - /* $bc */ NULL, NULL, NULL, NULL, // RS-232C - /* $c0 */ NULL, NULL, NULL, NULL, // RS-232C - /* $c4 */ NULL, NULL, NULL, NULL, // RS-232C - /* $c8 */ NULL, NULL, NULL, NULL, // RS-232C - /* $cc */ NULL, NULL, NULL, NULL, // RS-232C - /* $d0 */ NULL, NULL, NULL, NULL, - /* $d4 */ NULL, NULL, NULL, NULL, - /* $d8 */ NULL, NULL, NULL, NULL, - /* $dc */ NULL, NULL, NULL, NULL, - /* $e0 */ NULL, NULL, NULL, NULL, - /* $e4 */ NULL, NULL, NULL, NULL, - /* $e8 */ NULL, NULL, NULL, NULL, - /* $ec */ NULL, NULL, NULL, NULL, +// NEWS はレベル割り込みと、一部が vectored */ +/*static*/ std::map VectorTable::name_news = { + // 0123456789012345678 <- 例外履歴欄の横幅 + { 0x19, "Lv1 Intr (AST)" }, + { 0x1a, "Lv2 Intr" }, + { 0x1b, "Lv3 Intr" }, + { 0x1c, "Lv4 Intr (SIC/LAN)" }, + { 0x1d, "Lv5 Intr (SCC)" }, + { 0x1e, "Lv6 Intr (SysTimer)" }, + { 0x1f, "Lv7 Intr" }, - // 0123456789012345678 - /* $f0 */ "PSX16x50 Interrupt", - /* $f1 */ NULL, - /* $f2 */ NULL, - /* $f3 */ NULL, - /* $f4 */ NULL, - /* $f5 */ NULL, - /* $f6 */ "ExSPC Interrupt", - /* $f7 */ NULL, // TS-6BSI - /* $f8 */ "Nereid#1 Interrupt", - /* $f9 */ "Neptune-X Interrupt", - /* $fa */ "Nereid#1 USB", - /* $fb */ "Nereid#0 USB", - /* $fc */ NULL, - /* $fd */ NULL, - /* $fe */ NULL, - /* $ff */ NULL, + { 0x40, "SCC" }, }; -// LUNA-I はレベル割り込みのみ -/*static*/ std::array VectorTable::name_luna1 = { +// virt-m68k +/*static*/ std::map VectorTable::name_virt68k = { // 0123456789012345678 <- 例外履歴欄の横幅 - /* $19 */ "Lv1 Intr (XP Low)", - /* $1a */ "Lv2 Intr (SPC)", - /* $1b */ "Lv3 Intr (Lance)", - /* $1c */ "Lv4 Intr (XP High)", - /* $1d */ "Lv5 Intr (SysClk)", - /* $1e */ "Lv6 Intr (SIO)", - /* $1f */ "Lv7 Intr (NMI)", + { 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 <- 例外履歴欄の横幅 + // 01234567890123456789012 <- 例外履歴欄の横幅 /* 0 */ "Reset Exception", /* 1 */ "Interrupt Exception", /* 2 */ "Inst Access Exception", @@ -382,5 +380,5 @@ VectorTable::MonitorUpdate(Monitor *, Te /* 8 */ "Illegal Integer Divide", /* 9 */ "Int Overflow Exception", /* 10 */ "Error Exception", - // 01234567890123456789012 + // 01234567890123456789012 };