--- nono/vm/romemu_luna1.cpp 2026/04/29 17:05:37 1.1.1.11 +++ nono/vm/romemu_luna1.cpp 2026/04/29 17:05:59 1.1.1.14 @@ -43,11 +43,15 @@ // 4100'0010.L メモリサイズ // *4100'00b8.L プレーンマスク格納先アドレス (実 ROM は RAM をさしている) // 4100'00bc.L プレーンマスク +// *4100'00d4.L 'x' コマンドの引数バッファアドレス // // 4100'0400 リセットハンドラ +// 4100'0500 Lv5 (Sysclk) 割り込みハンドラ // 4100'0600 Lv6 (SIO) 割り込みハンドラ // 4100'0700 Lv7 (NMI) 割り込みハンドラ // 4100'0800 デフォルトハンドラ +// 4100'0900 サブルーチン +// 4100'1000.B[64] 'x' コマンドの引数バッファ(ダミー) // // *4101'ffd8〜 "ENADDR",0,0 // *4101'ffe0〜 MACアドレス(文字列形式、英大文字、区切りなし) @@ -69,15 +73,6 @@ Luna1PROMEmuDevice::Luna1PROMEmuDevice() { machine_name = "LUNA-I"; - - // LUNA-I の ROM の特定アドレスを読み出す人がいるので、 - // サイズは実 ROM と同じにしておく必要がある。 - uint devlen = 128 * 1024; - imagebuf.reset(new uint8 [devlen]); - memset(&imagebuf[0], 0, devlen); - mem = &imagebuf[0]; - - mask = devlen - 1; } // デストラクタ @@ -93,6 +88,12 @@ Luna1PROMEmuDevice::Init() return false; } + // LUNA-I の ROM の特定アドレスを読み出す人がいるので、 + // サイズは実 ROM と同じにしておく必要がある。 + if (AllocROM(128 * 1024, 0) == false) { + return false; + } + SysClkDevice *sysclk = GetSysClkDevice(); MemoryStreamBE roms(imagebuf.get()); @@ -104,6 +105,8 @@ Luna1PROMEmuDevice::Init() roms.SetOffset(0xb8); roms.Write4(0x410000bc); // +b8: プレーンマスク格納先 // +bc: 値は ROM_Init() でセット + roms.SetOffset(0xd4); + roms.Write4(0x41001000); // +d4: 'x' コマンドの引数(実際はRAM) // リセット時に実行する命令 roms.SetOffset(0x400); @@ -137,11 +140,11 @@ Luna1PROMEmuDevice::Init() roms.Write4(ROMIO_CLKCNT); roms.Write2(0x4e73); // rte - // Lv6 (SIO) 割り込みハンドラ - // キーボード割り込みが上がったら KEYIN をコールする + // Lv6 (SIO) 割り込みハンドラ。 + // この中でコマンドなどを処理する。 roms.SetOffset(0x600); - roms.Write2(0x4ab9); // tst.l (ROMIO_KEYIN) - roms.Write4(ROMIO_KEYIN); // ; キー入力処理 + roms.Write2(0x4ab9); // tst.l (ROMIO_SIOINTR) + roms.Write4(ROMIO_SIOINTR); // ; キー入力処理 roms.Write2(0x4e73); // rte // NMI のハンドラ @@ -196,18 +199,18 @@ Luna1PROMEmuDevice::ROM_InitMD() // +0010: メモリサイズ roms.SetOffset(0x10); - roms.Write4(mainram->GetSize()); + roms.Write4((uint32)mainram->GetSize()); // プレーン数(1,4,8)をプレーンマスク(0x01, 0x0f, 0xff)に int nplane = bt45x->GetPlaneCount(); - int planemask = (1 << nplane) - 1; + int planemask = (1U << nplane) - 1; // プレーンマスク。実際は RAM に書き込まれるがとりあえず roms.SetOffset(0xbc); roms.Write4(planemask); // RAM にベクタを書き込む roms.SetOffset(0); - rams.SetOffset(0); + rams.SetAddr(0); rams.Write4(roms.Read4()); // ROM のリセットベクタをコピー rams.Write4(roms.Read4()); for (uint i = 2; i < 256; i++) { // デフォルトベクタで埋める