--- nono/vm/mpu.h 2026/04/29 17:05:09 1.1.1.11 +++ nono/vm/mpu.h 2026/04/29 17:05:24 1.1.1.14 @@ -5,7 +5,7 @@ // // -// MPU 共通部 +// メイン MPU (680x0/88xx0) 共通部 // #pragma once @@ -14,12 +14,16 @@ #include "event.h" #include "message.h" +class Debugger; +class MainbusDevice; +class Syncer; + class MPUDevice : public Device { using inherited = Device; public: - MPUDevice(const std::string& objname_); - virtual ~MPUDevice() override; + MPUDevice(); + ~MPUDevice() override; bool Init() override; void PowerOff() override; @@ -36,32 +40,33 @@ class MPUDevice : public Device virtual uint32 GetLaddr() const = 0; virtual uint32 GetPaddr() const = 0; + // MPU 名を取得する。("MC68030" みたいなやつ、ログ名とは別) + virtual const char *GetMPUName() const = 0; + // MPU クロック [kHz] を取得する。 int GetClockSpeed() const { return clock_khz; } - // アクセスウェイトを加算 - virtual void AddCycle(int32 cycle) = 0; + // MPU クロック [nsec] を取得する。 + uint64 GetClock_nsec() const { return clock_nsec; } // 割り込み発生を MPU に通知 virtual void Interrupt(int level) = 0; - // MPU からのアクセスをエミュレートする。 - // アドレスは論理アドレス。 - // 空間は現在のデータ空間。 - // アクセスエラーは (int64)-1 を返す。 - virtual uint64 Read8(uint32 addr) = 0; - virtual uint64 Read16(uint32 addr) = 0; - virtual uint64 Read32(uint32 addr) = 0; - virtual uint64 Write8(uint32 addr, uint32 data) = 0; - virtual uint64 Write16(uint32 addr, uint32 data) = 0; - virtual uint64 Write32(uint32 addr, uint32 data) = 0; + // デバイスが CI (キャッシュ禁止) をセットする。 + virtual void SetCI() = 0; protected: void TraceMessage(MessageID, uint32); virtual void SetTrace(bool trace_on) = 0; int clock_khz {}; // MPU クロック [kHz] - int clock_nsec {}; // MPU クロック [nsec] + uint64 clock_nsec {}; // MPU クロック [nsec] + + bool resetting {}; // リセット処理中フラグ + + Debugger *debugger {}; + MainbusDevice *mainbus {}; + Syncer *syncer {}; // 1命令実行イベント Event exec_event { this }; @@ -70,4 +75,6 @@ class MPUDevice : public Device static const char * const rmstr[4]; }; -extern MPUDevice *gMPU; +static inline MPUDevice *GetMPUDevice() { + return Object::GetObject(OBJ_MPU); +}