--- nono/vm/romemu_luna.cpp 2026/04/29 17:04:36 1.1.1.2 +++ nono/vm/romemu_luna.cpp 2026/04/29 17:04:47 1.1.1.6 @@ -43,6 +43,9 @@ enum { // コンストラクタ LunaPROMEmuDevice::LunaPROMEmuDevice() { + logname = "prom"; + devname = "PROM"; + // LUNA-I の ROM の特定アドレスを読み出す人がいるので、 // サイズは実 ROM と同じにしておく必要がある。 devlen = 128 * 1024; @@ -73,8 +76,8 @@ LunaPROMEmuDevice::Init() ms.Write16(0x660c); // bne _go ; 起動先あればGO //_prompt: ms.Write32(0x4e722500); // stop #0x2500 ; キー入力を待つ - ms.Write16(0x2039); // move.l (ROMIO_KEYIN),d0 - ms.Write32(ROMIO_KEYIN); // ; キー入力処理 + ms.Write16(0x2039); // move.l (ROMIO_ENTRY),d0 + ms.Write32(ROMIO_ENTRY); // ; キー入力処理 ms.Write16(0x67f4); // beq _prompt ; 起動先なければループ //_go: ms.Write16(0x2040); // move.l d0,a0 ; ジャンプ先を a0 にセット @@ -83,8 +86,10 @@ LunaPROMEmuDevice::Init() ms.Write16(0x4ed0); // jmp (a0) ; ジャンプ // Lv6 (SIO) 割り込みハンドラ - // キーボード割り込みが上がったら STOP 命令から戻ってくるだけでいい + // キーボード割り込みが上がったら KEYIN をコールする ms.SetPtr(&romdata[0x600]); + ms.Write16(0x4ab9); // tst.l (ROMIO_KEYIN) + ms.Write32(ROMIO_KEYIN); // ; キー入力処理 ms.Write16(0x4e73); // rte // MAC アドレス @@ -148,6 +153,9 @@ LunaPROMEmuDevice::Read32(uint32 addr) case ROMIO_CLOSE - baseaddr: return ROM_Close(); + case ROMIO_ENTRY - baseaddr: + return entrypoint; + default: break; } @@ -210,10 +218,15 @@ LunaPROMEmuDevice::ROM_Init() ms.Write32(planemask); // 初期パレット - gBT454->Write8(0, 14 << 4); // select palette - gBT454->Write8(1, 15 << 4); // R=15 - gBT454->Write8(1, 15 << 4); // G=15 - gBT454->Write8(1, 15 << 4); // B=15 + // 偶数番は白(R/G/B=15/15/15)、奇数番は黒(0/0/0)。 + uint8 val = 0xf0; + gBT454->Write8(0, 0); // select palette + for (int i = 0; i < 16; i++) { + gBT454->Write8(1, val); // R + gBT454->Write8(1, val); // G + gBT454->Write8(1, val); // B + val ^= 0xf0; + } // SCSI // BDID の書き込みによってホストデバイスがバスにアタッチされる構造なので。 @@ -231,11 +244,11 @@ LunaPROMEmuDevice::ROM_Init() // 内蔵 ROM: スクリーンを初期化 text.Init(80, 32); - text.foldmode = true; gBitmap->EmuConsoleOpen(&text); inputbuf.clear(); inputpos = 0; is_shift = false; + mousecnt = 0; prompt_idx = 0; prompt = default_prompt; @@ -251,7 +264,7 @@ LunaPROMEmuDevice::ROM_Init() return 0; } - // 実際の画面更新は EmuConsoleUpdate() を呼ぶことで行われるので、 + // 実際の画面更新は ConsoleUpdate() を呼ぶことで行われるので、 // タイトルを Print してはいるが、エラーなくブートプログラムに制御を // 渡せた場合にはそれすら表示せずにゲストに処理を移す。 // 意図して或いは意図せずプロンプトに降りる場合だけ Update が起きて @@ -328,6 +341,12 @@ LunaPROMEmuDevice::ROM_Keyin() { uint32 lunakey = gSIO->Read8(0x51000004); + // マウス入力の 2, 3バイト目は無視 + if (mousecnt > 0) { + mousecnt--; + return 0; + } + // SHIFT キーだけ状態を持つので先に処理 if (lunakey == 0x0c || lunakey == 0x0d) { // 左右SHIFT押下 is_shift = true; @@ -337,7 +356,12 @@ LunaPROMEmuDevice::ROM_Keyin() is_shift = false; return 0; } - // 後は最上位ビットが立ってたらキー開放かマウスなので無視 + // マウスデータの1バイト目なら、後続2バイトをスキップ + if ((lunakey & 0xf8) == 0x80) { + mousecnt = 2; + return 0; + } + // キー開放は無視してよい if ((lunakey & 0x80)) { return 0; } @@ -978,7 +1002,7 @@ LunaPROMEmuDevice::LoadByNVRAM(const std putmsg(0, "%s", errmsg.c_str()); return 0; } - if (target->GetDevType() != SCSI::HD) { + if (target->GetDevType() != SCSI::DevType::HD) { errmsg = "No bootable disks"; putmsg(0, "%s", errmsg.c_str()); return 0;