--- nono/m680x0/m68030subr.cpp 2026/04/29 17:04:49 1.1.1.7 +++ nono/m680x0/m68030subr.cpp 2026/04/29 17:04:52 1.1.1.8 @@ -15,9 +15,8 @@ static void m68030_set_intr(m68kcpu *, i static void m68030_double_bus_fault(m68kcpu *, const char *); // CPU コアの領域を確保して初期化 -// reset_vector はリセット例外時に 0 番地に見せる(通常ROMの)アドレス。 m68kcpu * -m68030_init(uint32 reset_vector) +m68030_init() { m68kcpu *cpu; @@ -31,9 +30,6 @@ m68030_init(uint32 reset_vector) // あるため、A6 を概ね RAM のあるあたりに指定しておく…。 RegA(6) = 0x000ccccc; - // 手抜きのためリセットベクタを知っている - cpu->reset_vector = reset_vector; - return cpu; } @@ -81,6 +77,19 @@ m68030_double_bus_fault(m68kcpu *cpu, co } } +// 電源オン +void +m68030_power_on(m68kcpu *cpu) +{ + // 履歴を初期化。電源(再)投入時のみ行う。 + cpu->exhist.Clear(); + cpu->brhist.Clear(); + + // この後起きるリセット例外で PC を初期化する前に参照することになるので + // これだけここでも初期化しておく。 + RegPC = 0; +} + // リセット例外を発生させる。(外部ルーチン) void m68030_request_reset_exception(m68kcpu *cpu) @@ -94,16 +103,13 @@ m68030_request_reset_exception(m68kcpu * void m68030_exception_reset(m68kcpu *cpu) { - // 履歴を初期化。リセット前の履歴いらんよな? - cpu->exhist.Clear(); - cpu->brhist.Clear(); - // 例外履歴に記録 (例外発生はブランチ履歴にも記録) - // リセット例外発生時の PC にはあまり意味がないので 0 にするか。 + // m68k では今の所リセット例外発生時の PC にはあまり意味がないけど、 + // m88k と動作を揃えておく。 // 履歴のリセットベクタは 0 の代わりに 1 を使う仕様になっている。 const uint vector = 0; - cpu->exhist.AddEntry(0 | 1, 0, 0x8000 | (vector + 1)); - cpu->brhist.AddEntry(0 | 1, 0, 0x8000 | (vector + 1)); + cpu->exhist.AddEntry(RegPC | 1, 0, 0x8000 | (vector + 1)); + cpu->brhist.AddEntry(RegPC | 1, 0, 0x8000 | (vector + 1)); // デバッガに通知 (例外ブレーク用)。こっちのベクタは 0 のままでよい。 debugger_notify_exception(vector); @@ -139,14 +145,12 @@ m68030_exception_reset(m68kcpu *cpu) // 10. PC をロード // 手抜き。 - // XXX 本当は ROM を 0番地に見せかけてから 0番地からロードするのだが - // ぶっちゃけそれを外部から観測する手段もないのでなー。 // XXX FC を気にしないといけない // XXX 読めなければ二重バスフォールト // 本当はアドレスエラーもチェックするのだが、起きないので省略。 try { - RegA(7) = m68030_read_32(cpu, cpu->reset_vector); - RegPC = m68030_read_32(cpu, cpu->reset_vector + 4); + RegA(7) = m68030_read_32(cpu, 0); + RegPC = m68030_read_32(cpu, 4); // リセットベクタは常に 0, 4 番地から取得したことになっている cpu->brhist.AddEntry(0x00000004 | 1, RegPC, 0x8000); } catch (int) {