--- nono/m680x0/m68030.h 2026/04/29 17:04:57 1.1.1.10 +++ nono/m680x0/m68030.h 2026/04/29 17:05:08 1.1.1.11 @@ -11,37 +11,30 @@ // #include "branchhistory.h" -#include -#include -#include __BEGIN_DECLS #include "fpu_emulate.h" __END_DECLS class m68kcpu; +class MPU680x0Device; // 外部ループフラグ // これらのフラグがいずれも立っていない間、CPU 実行は内側のディスパッチ // ループを周り、どれかでも立てばディスパッチループを抜けてフラグを処理 // してから再びディスパッチループに戻る。 // それぞれ独立しているためビットを立てる際は代入ではなく OR すること。 -#define CPU_REQ_STOP (0x00000001) // ストップ状態 -#define CPU_REQ_HALT (0x00000002) // ホールト状態 -#define CPU_REQ_TRACE (0x00000004) // デバッガ有効 -#define CPU_REQ_PROMPT (0x00000008) // デバッガプロンプト -#define CPU_REQ_RELEASE (0x00000010) // 命令後に CPU 実行中断 #define CPU_REQ_INTR (0x00000020) // 命令後に割り込みチェックが必要 -#define CPU_REQ_RESET (0x00000040) // リセット例外 -#define M68K_SR_T (0xc000) -#define M68K_SR_S (0x2000) -#define M68K_SR_M (0x1000) -#define M68K_CCR_X (0x0010) -#define M68K_CCR_N (0x0008) -#define M68K_CCR_Z (0x0004) -#define M68K_CCR_V (0x0002) -#define M68K_CCR_C (0x0001) +#define M68K_SR_T (0xc000) +#define M68K_SR_S (0x2000) +#define M68K_SR_M (0x1000) +#define M68K_SR_IMASK (0x0700) +#define M68K_CCR_X (0x0010) +#define M68K_CCR_N (0x0008) +#define M68K_CCR_Z (0x0004) +#define M68K_CCR_V (0x0002) +#define M68K_CCR_C (0x0001) // SSW #define SSW_SIZE(x) (((x) & 0x03) << 4) @@ -100,7 +93,7 @@ struct m68kreg { m68030ccr ccr; bool s; // SR の S ビット bool m; // SR の M ビット - int intr_level; // SR の割り込みレベル (0-7) + int intr_mask; // SR の割り込みマスク (0-7) // 現在の SP は常に da[15]。da[15] が示しているときは対応する変数の // ほうは更新されないため無効。 @@ -129,13 +122,10 @@ struct m68kreg { struct fpframe fpframe; - // CPU の実行状態 (SCHED_CPU_*) - uint32 state; - public: // SR の上位8ビット部分のみを返す uint16 sr_h() { - return (s ? M68K_SR_S : 0) | (m ? M68K_SR_M : 0) | (intr_level << 8); + return (s ? M68K_SR_S : 0) | (m ? M68K_SR_M : 0) | (intr_mask << 8); } }; @@ -185,6 +175,12 @@ class m68kcpu final { uint8 flag_pd {}; // -(An) のどのレジスタを保存したか uint8 flag_pi {}; // (An)+ のどのレジスタを保存したか + // CPU の実行状態 + static const uint32 CPU_STATE_NORMAL = 0; + static const uint32 CPU_STATE_STOP = 1; + static const uint32 CPU_STATE_HALT = 2; + uint32 state {}; + // MMU 状態 bool mmu_enable {}; // SRP @@ -220,34 +216,13 @@ class m68kcpu final { bool fpu_dirty {}; struct fpemu fe {}; - std::atomic atomic_reqflag {}; // 外部ループ & リクエストフラグ - - // 割り込みペンディングレベル - // 外部から入力されている(最も高い)割り込みレベルを保持する。 - int intr_pending {}; - - // 仮想時刻 [nsec] - uint64 total_vtime {}; - - // サイクル数を仮想時間 [nsec] に変換 - uint64 Cycle2Vtime(int32 cycle) const { - return (int64)cycle * c2v; - } + // 現在の外部割り込みレベル + int intr_level {}; - // 仮想時間 [nsec] をサイクル数に変換 - uint32 Vtime2Cycle(uint32 vtime) const { - return ((uint64)vtime * v2c_factor) >> v2c_shift; - } + // 電源オンからの累積消費サイクル + uint64 used_cycle {}; - 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::BrHist }; @@ -266,9 +241,16 @@ class m68kcpu final { bool (*fline_callback)(m68kcpu *, void *) {}; void *fline_arg {}; + // RESET 命令のコールバックとユーザ引数 + void (*resetop_callback)(void *) {}; + void *resetop_arg {}; + // ダブルバスフォールトのコールバックとユーザ引数。 void (*halt_callback)(void *) {}; void *halt_arg {}; + + // VM 側デバイス + MPU680x0Device *dev {}; }; #define RegD(n) (cpu->reg.da[(n)]) @@ -301,14 +283,13 @@ class m68kcpu final { #define RegAY RegA(RegIRY) // 外部公開ルーチン -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 m68kcpu *m68030_init(MPU680x0Device *dev_); +extern int m68030_exec(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); +extern bool m68030_interrupt(m68kcpu *cpu, int level); +extern bool m68030_check_interrupt(m68kcpu *cpu); +extern int m68030_exception_reset(m68kcpu *cpu); +extern int m68030_exception_interrupt(m68kcpu *cpu); // 外部で定義されるコールバック extern void m68030_reset_inst(m68kcpu *cpu);