--- nono/m680x0/m68030.h 2026/04/29 17:04:43 1.1.1.6 +++ nono/m680x0/m68030.h 2026/04/29 17:04:57 1.1.1.10 @@ -72,6 +72,18 @@ class m68kcpu; #define FC_SD (FC_SUPER | FC_DATA) #define FC_SP (FC_SUPER | FC_PROG) +#define M68K_CACR_EI (0x0001) +#define M68K_CACR_FI (0x0002) +#define M68K_CACR_CEI (0x0004) +#define M68K_CACR_CI (0x0008) +#define M68K_CACR_IBE (0x0010) +#define M68K_CACR_ED (0x0100) +#define M68K_CACR_FD (0x0200) +#define M68K_CACR_CED (0x0400) +#define M68K_CACR_CD (0x0800) +#define M68K_CACR_DBE (0x1000) +#define M68K_CACR_WA (0x2000) + #define M68K_FPCR_MASK (0x0000fff0) #define M68K_FPSR_MASK (0x0ffffff8) @@ -90,9 +102,14 @@ struct m68kreg { bool m; // SR の M ビット int intr_level; // SR の割り込みレベル (0-7) - // 現在の SP は常に da[15]。現在有効でない残り2つの SP をここに保存。 - // 例えばユーザ状態なら da[15] が USP、isp/msp は ISP/MSP を示し、 - // usp の内容は無効。 + // 現在の SP は常に da[15]。da[15] が示しているときは対応する変数の + // ほうは更新されないため無効。 + // ユーザ状態なら da[15] が USP を示し usp は無効、 + // isp, msp は ISP, MSP を示して有効。 + // スーパバイザ状態で SR_M なら da[15] が MSP を示し msp は無効、 + // isp, usp は ISP, USP を示して有効。 + // スーパバイザ状態で !SR_M なら da[15] が ISP を示し isp は無効、 + // msp, usp は MSP, USP を示して有効。 uint32 usp; uint32 isp; uint32 msp; @@ -112,10 +129,7 @@ struct m68kreg { struct fpframe fpframe; - // CPU の実行状態 - // 0 .. 通常状態 - // CPU_REQ_STOP .. STOP 状態 - // CPU_REQ_HALT .. HALT 状態 + // CPU の実行状態 (SCHED_CPU_*) uint32 state; public: @@ -217,33 +231,32 @@ class m68kcpu final { // サイクル数を仮想時間 [nsec] に変換 uint64 Cycle2Vtime(int32 cycle) const { - return (int64)cycle * 1000 * 1000 / clock_khz; + return (int64)cycle * c2v; } // 仮想時間 [nsec] をサイクル数に変換 uint32 Vtime2Cycle(uint32 vtime) const { - return (uint32)((uint64)vtime * clock_khz / (1000 * 1000)); + return ((uint64)vtime * v2c_factor) >> v2c_shift; } uint32 used_cycle {}; // 現在のターンでこれまでに消費したサイクル数 uint32 goal_cycle {}; // 現在のターンで消費すべきサイクル数 int32 cycle_nocache {}; // ノーキャッシュケースの時の追加分 uint32 clock_khz {}; // MPU クロック [kHz] + uint32 c2v {}; // サイクル数を nsec に変換する際の係数 + uint64 v2c_factor {}; // nsec をサイクル数に変換する際の乗算係数 + uint32 v2c_shift {}; // nsec をサイクル数に変換する際のシフト係数 + uint64 inst_count {}; // 命令実行数 // ブランチ履歴 (例外履歴を含む) - BranchHistory_m680x0 brhist {}; + BranchHistory_m680x0 brhist { BranchHistory::BrHist }; // 例外履歴のみ - BranchHistory_m680x0 exhist {}; + BranchHistory_m680x0 exhist { BranchHistory::ExHistOnly }; // バス m68kbus bus {}; - // 手抜きのためリセットベクタ取得アドレスを知っている。 - // リセット時のためだけにデバイス側に細工を入れるのは実行時の - // オーバーヘッドが大きそうなので。 - uint32 reset_vector {}; - // A-Line, F-Line 命令エミュレーションのコールバックとユーザ引数。 // ユーザ引数には関与しないので呼び出し側が自由に指定してよい。 // コールバック側で処理完了したら true を返す。 @@ -288,9 +301,11 @@ class m68kcpu final { #define RegAY RegA(RegIRY) // 外部公開ルーチン -extern m68kcpu *m68030_init(uint32 reset_vector); +extern m68kcpu *m68030_init(); extern uint32 m68030_run(m68kcpu *cpu, uint32 delta); +extern void m68030_set_clockspeed(m68kcpu *cpu, uint32 clock_khz); extern uint64 m68030_get_vtime(m68kcpu *cpu); +extern void m68030_power_on(m68kcpu *cpu); extern void m68030_request_reset_exception(m68kcpu *cpu); extern void m68030_interrupt(m68kcpu *cpu, int level); extern const char *m68030_get_exception_name(int vector);