--- nono/vm/mpu.cpp 2026/04/29 17:05:24 1.1.1.12 +++ nono/vm/mpu.cpp 2026/04/29 17:05:32 1.1.1.14 @@ -5,18 +5,22 @@ // // -// メイン MPU (680x0/88xx0) 共通部 +// MPU (共通部分) // // Device // | +-----------+ -// +--| MPUDevice | (680x0/88xx0 の共通部) -// | +-----------+ -// | | -// | +-- MPU680x0Device -// | +-- MPU88xx0Device -// | -// +-------- MPU64180Device +// +--| MPUDevice | (全 MPU の共通部) +// +-----------+ +// | +// | +---------------+ +// +--| MainMPUDevice | (680x0/88xx0 の共通部) +// | +---------------+ +// | | +// | +-- MPU680x0Device +// | +-- MPU88xx0Device +// | +// +-- MPU64180Device #include "mpu.h" #include "config.h" @@ -25,11 +29,14 @@ #include "scheduler.h" #include "syncer.h" +// +// 全 MPU 共通 +// + // コンストラクタ -MPUDevice::MPUDevice() - : inherited(OBJ_MPU) +MPUDevice::MPUDevice(uint objid_) + : inherited(objid_) { - exec_event.Regist("MPU Execute"); } // デストラクタ @@ -46,48 +53,77 @@ MPUDevice::Init() } debugger = GetDebugger(); - mainbus = GetMainbusDevice(); - syncer = GetSyncer(); - scheduler->ConnectMessage(MessageID::MPU_TRACE_MAIN, this, - ToMessageCallback(&MPUDevice::TraceMessage)); + // パラメータは継承側でセットしている。 + scheduler->RegistEvent(exec_event); - // MPU クロック - const ConfigItem& item = gConfig->Find("mpu-clock"); - const std::string& val = item.AsString(); - if (val.empty()) { - item.Err(); + return true; +} + +void +MPUDevice::PowerOff() +{ + scheduler->StopEvent(exec_event); +} + + +// +// メイン MPU (680x0/88xx0) 共通部 +// + +// コンストラクタ +MainMPUDevice::MainMPUDevice() + : inherited(OBJ_MPU) +{ +} + +// デストラクタ +MainMPUDevice::~MainMPUDevice() +{ +} + +// 初期化 +bool +MainMPUDevice::Init() +{ + if (inherited::Init() == false) { return false; } - // 文字列を double に変換 - char *end; - errno = 0; - double f = strtod(val.c_str(), &end); - if (end == val.c_str() || end[0] != '\0' || errno == ERANGE) { + + mainbus = GetMainbusDevice(); + syncer = GetSyncer(); + + // MPU クロック。 + // 設定の "mpu-clock" は MHz 単位だが、変数 clock_khz は kHz 単位。 + int val; + const ConfigItem& item = gConfig->Find("mpu-clock"); + if (item.TryFixedDecimal(&val, 3) == false) { item.Err(); return false; } - // 設定の "mpu-clock" は MHz 単位だが、変数 clock_khz は kHz 単位。 - clock_khz = (int)(f * 1000); + clock_khz = (uint)val; // 1MHz 未満はエラー。実際 10MHz 未満でもいい気がするけど if (clock_khz < 1000) { item.Err(); return false; } clock_nsec = 1000 * 1000 / clock_khz; + if (clock_nsec < 1) { + item.Err("Clock speed too high"); + return false; + } - return true; -} + scheduler->ConnectMessage(MessageID::MPU_TRACE_MAIN, this, + ToMessageCallback(&MainMPUDevice::TraceMessage)); -void -MPUDevice::PowerOff() -{ - scheduler->StopEvent(exec_event); + exec_event.SetName("MPU Execute"); + + return true; } // MPU トレース状態設定要求メッセージ void -MPUDevice::TraceMessage(MessageID msgid, uint32 arg) +MainMPUDevice::TraceMessage(MessageID msgid, uint32 arg) { // リセット中は SetTrace しない if (resetting) { @@ -100,7 +136,7 @@ MPUDevice::TraceMessage(MessageID msgid, // Round Mode (モニタ表示用) /*static*/ const char * const -MPUDevice::rmstr[4] = { +MainMPUDevice::rmstr[4] = { "Near", "Zero", "Minus",