--- nono/vm/mpu680x0.h 2026/04/29 17:05:33 1.1.1.15 +++ nono/vm/mpu680x0.h 2026/04/29 17:05:42 1.1.1.17 @@ -5,7 +5,7 @@ // // -// MPU (MC68030) +// MPU (MC68030/MC68040) // #pragma once @@ -32,11 +32,6 @@ class MPU680x0Device : public MainMPUDev using inherited = MainMPUDevice; friend class m68030MMU; - // CPU の実行状態 - static const uint32 CPU_STATE_NORMAL = 0; - static const uint32 CPU_STATE_STOP = 1; - static const uint32 CPU_STATE_HALT = 2; - public: MPU680x0Device(); ~MPU680x0Device() override; @@ -63,9 +58,6 @@ class MPU680x0Device : public MainMPUDev bool IsSuper() const { return reg.s; } bool IsMaster() const { return reg.m; } - // CPU の実行状態 (uint32) を返す。 - uint32 GetState() const { return cpu_state; } - // 現在アクセス中の論理アドレス、物理アドレスを取得。 uint32 GetLaddr() const override { return bus.laddr.Addr(); } uint32 GetPaddr() const override { return bus.paddr.Addr(); } @@ -132,24 +124,19 @@ class MPU680x0Device : public MainMPUDev void ExecTrace(Event& ev); // トレース設定。デバッガから呼び出される。 - void SetTrace(bool trace_on) override; + void SetTrace(bool enable) override; // 割り込みイベントコールバック void InterruptCallback(Event& ev); - // 動作モード変更 - void ChangeState(uint32 new_state); - // 次の実行サイクルを Full にする。 void MakeNextFull(); inline void CYCLE(int cc) { used_cycle += cc; } - inline void CYCLE2(int cc, int ncc) { - used_cycle += cc; - cycle_nocache += ncc - cc; - } + // 副作用前提のマクロなので do-while にしない。 +#define CYCLE3(name) used_cycle += cycle_table[__CONCAT(cycidx_,name)] // PC を addr に変更する。 // ベクタへのジャンプはここではなく JumpVector()。 @@ -268,11 +255,11 @@ class MPU680x0Device : public MainMPUDev void ResetFPU(bool hard); void fpu_init(); uint32 cea_fpu(int bytes); + uint32 cea_fpulc(int bytes); void read_8(uint32 addr, uint32 *data); void read_12(uint32 addr, uint32 *data); void write_8(uint32 addr, const uint32 *data); void write_12(uint32 addr, const uint32 *data); - bool readSRC(int size_id, uint32 *data); void fpu_op_illg(); void fpu_op_illg2(); @@ -322,15 +309,18 @@ class MPU680x0Device : public MainMPUDev // 例外 void GenerateExframe0(uint vector, uint16 sr, uint32 pc); void GenerateExframe2(uint vector, uint16 sr, uint32 pc, uint32 addr); + void GenerateExframe4(uint vector, uint16 sr, uint32 ea); void GenerateExframe7(uint vector, uint16 sr); void GenerateExframeB(uint vector, uint16 sr); int ExceptionReset(); void ExceptionBuserr(uint vector); uint64 ExceptionInterrupt(); void ExceptionTrap15(); + void ExceptionFLine(); void ExceptionFP(uint vector); + void ExceptionFPLC(uint ea); void Exception(uint vector); - void ExceptionGeneric(uint ext_vector, uint32 inst); + void ExceptionGeneric(uint ext_vector, uint32 info); // リセット例外の CPU 固有部分。 virtual void ResetCache() = 0; @@ -356,6 +346,12 @@ class MPU680x0Device : public MainMPUDev // 現在実行中の命令の先頭アドレス uint32 ppc {}; + // サイクル数表 + const int8 *cycle_table {}; + static const int8 cycle_table_030cc[]; + static const int8 cycle_table_030ncc[]; + static const int8 cycle_table_040[]; + // レジスタ(状態保存用) uint32 save_pd[8] {}; // -(An) を保存 uint32 save_pi[8] {}; // (An)+ を保存 @@ -409,9 +405,6 @@ class MPU680x0Device : public MainMPUDev bool enable; } fpu40 {}; - // CPU の実行状態 - uint32 cpu_state {}; - // 割り込みペンディング bool intr_pending {}; @@ -427,10 +420,6 @@ class MPU680x0Device : public MainMPUDev // 外部バスがバースト転送に対応していれば true bool has_burst_access {}; - // 命令キャッシュ有効 (icache->enable のコピー) - bool icache_enable {}; - int32 cycle_nocache {}; // ノーキャッシュケースの時の追加分 - // MPU/FPU 種別 m680x0MPUType mpu_type {}; m680x0FPUType fpu_type {}; @@ -600,7 +589,7 @@ class MPU68040Device : public MPU680x0De bool TranslateWrite() override; m68040TT *CheckTT(std::array, 2>&) const; bool LookupATC(m68040ATC&); - bool Search(m68040ATCEntry *); + void Search(m68040ATCEntry *); uint32 PeekDesc(uint32 base, uint32 idx); void SetTT(m68040TT *, uint32);