--- nono/vm/mainbus_luna.cpp 2026/04/29 17:05:25 1.1.1.1 +++ nono/vm/mainbus_luna.cpp 2026/04/29 17:05:50 1.1.1.5 @@ -30,6 +30,7 @@ #include "mainbus_luna.h" #include "bt45x.h" +#include "buserr.h" #include "busio.h" #include "cmmu.h" #include "config.h" @@ -42,6 +43,7 @@ #include "mainram.h" #include "mk48t02.h" #include "msxdos.h" +#include "nop.h" #include "partialram.h" #include "pio.h" #include "prom.h" @@ -87,9 +89,7 @@ LunaMainbus::LunaMainbus() NEWDV(BusErr, new BusErrDevice()); NEWDV(NopIO, new NopIODevice()); - // 2MB ずつ 32bit 全域。 - acc.resize(2048); - monitor_accstat.SetSize(80, 2 + 32); + accstat_monitor->SetSize(80, 2 + 32); } // デストラクタ @@ -125,7 +125,7 @@ LunaMainbus::MakeDevtable(const uint8 *m case FUSE: d = GetFuseROMDevice(); break; case CMMU: d = GetCMMUDevice(); break; default: - PANIC("corrupted maptable[%d]=%d", i, maptable[i]); + PANIC("corrupted maptable[%u]=%d", i, maptable[i]); } devtable[i] = d; } @@ -139,7 +139,7 @@ LunaMainbus::InitMainbus() auto partial = dynamic_cast(pPartialRAM.get()); // RAM は容量が確定した後のここで配置。 - int ram_size_MB = mainram->GetSizeMB(); + uint ram_size_MB = mainram->GetSizeMB(); int i = 0; while (ram_size_MB >= 16) { // 16MB あれば RAM が直接担当 @@ -293,14 +293,9 @@ Luna1Mainbus::Luna1Mainbus() NEWDV(SIO, new BusIO_BB()); NEWDV(TAS, new BusIO_B()); NEWDV(SubRAM, new SubRAMDevice(128)); - NEWDV(BT45x, new BT45xDevice()); // required by Lunafb - NEWDV(PlaneVRAM, new LunafbDevice()); NEWDV(CRTC2, new BusIO_B()); NEWDV(SPC, new BusIO_BBBB()); NEWDV(Ethernet, new BusIO_W()); - - // デバイスマップから devtable を作成 - MakeDevtable(maptable); } // デストラクタ @@ -308,63 +303,82 @@ Luna1Mainbus::~Luna1Mainbus() { } +// 動的なコンストラクション +bool +Luna1Mainbus::Create() +{ + int nplane = BT45xDevice::GetConfigPlaneCount(); + if (nplane < 0) { + return false; + } + if (nplane == 8) { // required by Lunafb + NEWDV(BT45x, new BusIO_BFFF()); + } else { + NEWDV(BT45x, new BusIO_B()); + } + NEWDV(PlaneVRAM, new LunafbDevice()); + + // 全部揃ったここで、デバイスマップから devtable を作成。 + MakeDevtable(maptable); + return true; +} // // LUNA-88K // // 00..03 RAM (64MB 実機の場合) -// 04..3f アドレスの残像? (64MB 実機の場合) +// 04..3f バスエラー // 40,41 PROM (B、N=256KB でミラー) // 42,43 FUSEROM (BFFF、N=256 でミラー) // 44,45 NVRAM (BFFF、N=2048 でミラー) -// 46,47 アドレスの残像? +// 46,47 バスエラー // 48,49 PIO0 (BFFF、N=4 でミラー) -// 4a,4b アドレスの残像? +// 4a,4b バスエラー // 4c,4d PIO1 (BFFF、N=4 でミラー) -// 4e,4f アドレスの残像? +// 4e,4f バスエラー // 50,51 SIO (BFFF、N=4 でミラー) -// 52..5f アドレスの残像? +// 52..5f バスエラー // 60,61 TAS? (BFFF、N=1 ?) // 62,63 SysClk (BFFF、N=1 ?) -// 64,65,66,67 SysCtlr? (BFFF、N=4 ?) +// 64,65,66,67 SysCtlr? (L、N=1 ?) // 68,69,6a,6b SysCtlr? (L、N=4 ?) // 6c,6d CPU リセット -// 6e,6f 68-6b と同じパターンの気がする +// 6e,6f $ff (?) // 70-7f SubRAM -// 80-9f アドレスの残像? -// a0-af 偶数(a0,a2,..)は残像、奇数(a1,a3,..)は ff -// b0-bf 偶数(b0,b2,..)は残像、奇数(b1,b3,..)は LUNAFB -// c0-cf 偶数(c0,c2,..)は残像、奇数(c1,c3,..)は BT454(BFFF、N=4) -// d0-df 偶数(d0,d2,..)は残像、奇数(d1,d3,..)はたぶん CRTC2 +// 80-9f バスエラー +// a0-af 偶数(a0,a2,..)はバスエラー、奇数(a1,a3,..)は $ff +// b0-bf 偶数(b0,b2,..)はバスエラー、奇数(b1,b3,..)は LUNAFB +// c0-cf 偶数(c0,c2,..)はバスエラー、奇数(c1,c3,..)は BT454(BFFF、N=4) +// d0-df 偶数(d0,d2,..)はバスエラー、奇数(d1,d3,..)はたぶん CRTC2 // (CRTC2 は今の所 $ff しか観測できていないので詳細不明) // e0,e1 SPC (BFFF、N=16 でミラー) -// e2-e7 繋がってない? 概ね $f4'00'c0'01 が読める。 -// FUSEROM などの繋がってないところと同じパターンが読める。 +// e2-ef $ff // f0,f1 たぶん Lance (BFFF、N=2) // f2-fd $ff -// fe $fe00'0000-$fef7'ffff まではアドレスの残像 +// fe $fe00'0000-$fef7'ffff まではアドレス(*) // $fef8'0000-$feff'ffff までは $ff -// ff たぶん CMMU 以外はアドレスの残像 +// ff たぶん CMMU 以外はアドレス(*) +// +// バスエラーの領域は 3% くらいの確率で $ffffffff が読めることがある。まじか。 +// (OpenBSD の CMMU 検出がバスエラーが起きるはずなのに起きなかった時のことを +// 考慮したコードになってるのはこのためだろうか…) // -// アドレスの残像(?) は -// - バイトアクセスならアドレスの下位 8bit、 -// - ワードアクセスならアドレスの下位 16bit、 -// - ロングワードアクセスならアドレス 32bit -// が見え、時々 $ffffffff が混ざるようだ ($00..$ff までのうち2個程度)。 -// 一方、デバイスに接続されていない下位24ビットあるいは28ビットに -// $f400c001 が見えるエリアも多いが、$f400c001 は jmp r1 命令なので、おそらく -// PROM モニターがこのダンプを表示する際のプログラムコードがデータバスバッファ -// を通過したのが見えている可能性がある。 -// いずれも再現は難しいので見なかったことにする。 +// アドレス(*) のところは、32ビットアドレスが読み出せる。バイトアクセスしても +// そのバイトに応じたところが読み出せるので 32ビットの (フルワード単位の) +// アドレスがデータバスに乗って返って来ているようだ…。 +// 以下 PROM でのダンプ結果 (boot の machine read コマンドでも同じ)。 +// 0> dw fe000000 fe00000f +// fe000000: fe000000 fe000004 fe000008 fe00000c +// 0> d fe000000 fe00000f +// fe000000: fe 00 00 00 fe 00 00 04 fe 00 00 08 fe 00 00 0c /*static*/ const uint8 Luna88kMainbus::maptable[256] = { // RAM は Init() で動的に配置する (64MB なら 00..03 の4枠)。 - // RAM 未実装領域については要調査。少なくとも末尾に BUSERR がないと - // OpenBSD カーネルが起動しない。 // 先頭 64MB の空間 (00..03) だけは、PROM 1.20 ではメモリが無いときでも // バスエラーにならないことを期待しているので NONE にしておく。 + // それ以降はバスエラー。 NONE, NONE, NONE, NONE, BUSERR, BUSERR, BUSERR, BUSERR, // 00 BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 08 BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10 @@ -376,29 +390,29 @@ Luna88kMainbus::maptable[256] = { // LUNA-88K2 は 47 に(も?) NVRAM がいるようだ // 69,6b,6d にも何かのコントローラ? - PROM, PROM, FUSE, FUSE, MK48, MK48, NONE, NONE, // 40 - PIO0, PIO0, NONE, NONE, PIO1, PIO1, NONE, NONE, // 48 - SIO, SIO, NONE, NONE, NONE, NONE, NONE, NONE, // 50 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 58 + PROM, PROM, FUSE, FUSE, MK48, MK48, BUSERR, BUSERR, // 40 + PIO0, PIO0, BUSERR, BUSERR, PIO1, PIO1, BUSERR, BUSERR, // 48 + SIO, SIO, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 50 + BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 58 TAS, TAS, SYSCLK, SYSCLK, SYSCTL, SYSCTL, SYSCTL, SYSCTL, // 60 SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, // 68 SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 70 SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 78 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 80 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 88 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 90 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 98 - NONE, MROM, NONE, MROM, NONE, MROM, NONE, MROM, // a0 - NONE, MROM, NONE, MROM, NONE, MROM, NONE, MROM, // a8 - NONE, LUNAFB, NONE, LUNAFB, NONE, LUNAFB, NONE, LUNAFB, // b0 - NONE, LUNAFB, NONE, LUNAFB, NONE, LUNAFB, NONE, LUNAFB, // b8 + BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80 + BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88 + BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 90 + BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 98 + BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a0 + BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a8 + BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b0 + BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b8 // d0 にボードチェックレジスタ? - NONE, BT45x, NONE, BT45x, NONE, BT45x, NONE, BT45x, // c0 - NONE, BT45x, NONE, BT45x, NONE, BT45x, NONE, BT45x, // c8 - NONE, CRTC2, NONE, CRTC2, NONE, CRTC2, NONE, CRTC2, // d0 - NONE, CRTC2, NONE, CRTC2, NONE, CRTC2, NONE, CRTC2, // d8 + BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, // c0 + BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, // c8 + BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d0 + BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d8 SCSI, SCSI, NONE, NONE, NONE, NONE, NONE, NONE, // e0 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // e8 LANCE, LANCE, NONE, NONE, NONE, NONE, NONE, NONE, // f0 @@ -428,18 +442,33 @@ Luna88kMainbus::Luna88kMainbus() NEWDV(SIO, new BusIO_BFFF()); NEWDV(TAS, new BusIO_BFFF()); NEWDV(SubRAM, new SubRAMDevice(128)); - NEWDV(BT45x, new BT45xDevice()); // required by Lunafb - NEWDV(PlaneVRAM, new LunafbDevice()); NEWDV(CRTC2, new BusIO_BFFF()); NEWDV(SPC, new BusIO_BFFF()); NEWDV(Ethernet, new BusIO_WF()); NEWDV(CMMU, new CMMUDevice()); - - // デバイスマップから devtable を作成 - MakeDevtable(maptable); } // デストラクタ Luna88kMainbus::~Luna88kMainbus() { } + +// 動的なコンストラクション +bool +Luna88kMainbus::Create() +{ + int nplane = BT45xDevice::GetConfigPlaneCount(); + if (nplane < 0) { + return false; + } + if (nplane == 8) { // required by Lunafb + NEWDV(BT45x, new BusIO_BFFF()); + } else { + NEWDV(BT45x, new BusIO_B()); + } + NEWDV(PlaneVRAM, new LunafbDevice()); + + // 全部揃ったここで、デバイスマップから devtable を作成。 + MakeDevtable(maptable); + return true; +}