--- nono/vm/mpu88xx0.h 2026/04/29 17:05:34 1.1.1.15 +++ nono/vm/mpu88xx0.h 2026/04/29 17:05:51 1.1.1.17 @@ -12,7 +12,6 @@ #include "mpu.h" #include "branchhistory.h" -#include "event.h" #include "m88100.h" #include "m88200.h" #include @@ -22,17 +21,6 @@ class MPU88xx0Device : public MainMPUDev using inherited = MainMPUDevice; friend class Luna88kPROMEmuDevice; - static const uint32 CPU_STATE_NORMAL = 0; - static const uint32 CPU_STATE_STOP = 1; // 疑似 STOP 状態 - - enum ExceptionKind { - NORMAL, - DATA, - ERROR, - INTR, - TRAP, - }; - public: MPU88xx0Device(); ~MPU88xx0Device() override; @@ -59,9 +47,6 @@ class MPU88xx0Device : public MainMPUDev // 割り込みが許可なら true bool IsIntrEnable() const { return (reg.psr & PSR_IND) == 0; } - // CPU の実行状態 (uint32) を返す。 - uint32 GetState() const { return cpu_state; } - // 現在アクセス中の論理アドレス、物理アドレスを取得。 uint32 GetLaddr() const override; uint32 GetPaddr() const override; @@ -98,14 +83,14 @@ class MPU88xx0Device : public MainMPUDev private: // リセット例外コールバック - void ResetCallback(Event& ev); + void ResetCallback(Event *); // 命令実行系コールバック - void ExecNormal(Event& ev); - void ExecTrace(Event& ev); + void ExecNormal(Event *); + void ExecTrace(Event *); // トレース設定。デバッガから呼び出される。 - void SetTrace(bool trace_on) override; + void SetTrace(bool enable) override; uint64 fetch() { reg.nip = reg.fip; @@ -124,11 +109,7 @@ class MPU88xx0Device : public MainMPUDev } // 更新された psr に基づいて、PSR 変更によって必要な処理をする。 // CY ビットを変更した場合は呼ばなくてよいことにする。 - void SetPSR() { - // CMMU に S/U 信号を出す - cmmu[0]->SetSuper(IsSuper()); - cmmu[1]->SetSuper(IsSuper()); - } + void SetPSR(); // キャリーフラグが立っていれば 1 を返す uint32 GetCY() const { return (reg.psr >> 28) & 1; } @@ -155,9 +136,12 @@ class MPU88xx0Device : public MainMPUDev // FP Result を FPIT, FPRH, FPRL レジスタに設定 void SetFPRx(double src); - void Exception(int vec); - void ExceptionCore(int vec, ExceptionKind cause); - uint32 Calcdmt(uint32 flag); + void ExceptionCore(uint32 primask); + void Exception(uint32 pri); + void OuterException(uint32 pri); + void InternalException(uint32 vec); + void TrapException(uint32 vec); + uint32 MakeDMT(uint32 flag); void ReadDataException32(uint32 addr, uint32 flag); void ReadDataException64(uint32 addr, uint32 flag); void WriteDataException32(uint32 addr, uint32 flag); @@ -183,8 +167,6 @@ class MPU88xx0Device : public MainMPUDev OP_PROTO(illegal); #undef OP_PROTO - void fpu_unimpl(); - // float,double と整数値の相互変換 static float u2f(uint32 u) { float v; @@ -225,12 +207,14 @@ OP_PROTO(illegal); // 今回のバスウェイト [nsec] uint64 buswait {}; - // ペンディング中の割り込みレベル - int intr_pending {}; + // 割り込み信号線の状態。 + bool intr_asserted {}; + + // ペンディング中の例外優先度。EXCPRI_* + uint32 excep_pending {}; - // CPU の状態 - void ChangeState(uint32 new_state); - uint32 cpu_state {}; + // 内部例外/トラップ例外のベクタ番号。EXCVEC_* + uint32 excep_vector {}; // 疑似 STOP 状態に入る機能を有効にする場合 true bool pseudo_stop_enable {};