--- nono/vm/mainbus_luna.cpp 2026/04/29 17:05:42 1.1.1.4 +++ 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" @@ -326,57 +328,57 @@ Luna1Mainbus::Create() // // 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 以外はアドレス(*) // -// アドレスの残像(?) は -// - バイトアクセスならアドレスの下位 8bit、 -// - ワードアクセスならアドレスの下位 16bit、 -// - ロングワードアクセスならアドレス 32bit -// が見え、時々 $ffffffff が混ざるようだ ($00..$ff までのうち2個程度)。 -// 一方、デバイスに接続されていない下位24ビットあるいは28ビットに -// $f400c001 が見えるエリアも多いが、$f400c001 は jmp r1 命令なので、おそらく -// PROM モニターがこのダンプを表示する際のプログラムコードがデータバスバッファ -// を通過したのが見えている可能性がある。 -// いずれも再現は難しいので見なかったことにする。 +// バスエラーの領域は 3% くらいの確率で $ffffffff が読めることがある。まじか。 +// (OpenBSD の CMMU 検出がバスエラーが起きるはずなのに起きなかった時のことを +// 考慮したコードになってるのはこのためだろうか…) +// +// アドレス(*) のところは、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 @@ -388,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