--- nono/vm/romemu_luna1.cpp 2026/04/29 17:05:09 1.1.1.6 +++ nono/vm/romemu_luna1.cpp 2026/04/29 17:05:17 1.1.1.7 @@ -19,10 +19,10 @@ // | +-- LunaPROMEmuDevice (LUNA PROM エミュレーションの共通部分) // | | // | | +--------------------+ -// | +--| Luna1PROMEmuDevice | (LUNA1 の PROM エミュレーション) +// | +--| Luna1PROMEmuDevice | (LUNA-I の PROM エミュレーション) // | | +--------------------+ // | | -// | +-- Luna88kPROMEmuDevice (LUNA88K の PROM エミュレーション) +// | +-- Luna88kPROMEmuDevice (LUNA-88K の PROM エミュレーション) // | // +-- PROM0Device (LUNA* のブートページ切り替え用プロキシ) // +-- IPLROM0Device (X680x0 のブートページ切り替え用プロキシ) @@ -50,21 +50,21 @@ // "0011223344AA",0 #include "romemu_luna1.h" +#include "bt45x.h" #include "ethernet.h" -#include "lunafb.h" #include "mainapp.h" +#include "mainram.h" #include "memorystream.h" #include "mk48t02.h" #include "mpu680x0.h" #include "pio.h" -#include "ram.h" // コンストラクタ Luna1PROMEmuDevice::Luna1PROMEmuDevice() { // LUNA-I の ROM の特定アドレスを読み出す人がいるので、 // サイズは実 ROM と同じにしておく必要がある。 - devlen = 128 * 1024; + uint devlen = 128 * 1024; imagebuf.reset(new uint8 [devlen]); memset(&imagebuf[0], 0, devlen); mem = &imagebuf[0]; @@ -77,10 +77,10 @@ Luna1PROMEmuDevice::~Luna1PROMEmuDevice( { } +// 初期化 bool Luna1PROMEmuDevice::Init() { - // 親クラス if (inherited::Init() == false) { return false; } @@ -101,7 +101,7 @@ Luna1PROMEmuDevice::Init() ms.Write32(0x41000000); ms.Write16(0x2039); // move.l (ROMIO_INIT),d0 ms.Write32(ROMIO_INIT); - ms.Write16(0x660c); // bne _go ; 起動先あればGO + ms.Write16(0x6a0c); // bpl _go ; 起動先あればGO //_prompt: uint32 _prompt = ms.GetOffset(); ms.Write32(0x4e722500); // stop #0x2500 ; キー入力を待つ @@ -135,7 +135,12 @@ Luna1PROMEmuDevice::Init() ms.Write16(0x4e73); // rte // MAC アドレス - const macaddr_t macaddr = gEthernet->GetMacAddr(); + macaddr_t macaddr; + if (EthernetDevice::GetConfigMacAddr(&macaddr, false) == false) { + // エラーメッセージは表示済み + return false; + } + putmsg(1, "macaddr=%s", macaddr.ToString(':').c_str()); strcpy((char *)&imagebuf[0x1ffd8], "ENADDR"); memcpy(&imagebuf[0x1ffe0], macaddr.ToString().c_str(), 12); @@ -144,7 +149,7 @@ Luna1PROMEmuDevice::Init() // 起動時の処理を行う。 // 次段実行ファイルの読み込みに成功すればそのエントリポイントを返す。 -// そうでなければ 0 を返すので、プロンプトに処理を移すこと。 +// そうでなければ -1 を返すので、プロンプトに処理を移すこと。 uint32 Luna1PROMEmuDevice::ROM_Init() { @@ -154,12 +159,14 @@ Luna1PROMEmuDevice::ROM_Init() // デバイスの初期化 (親クラス) InitDevice(); + auto pio0 = GetPIO0Device(); + // +0010: メモリサイズ ms.SetOffset(0x10); - ms.Write32(gRAM->GetSize()); + ms.Write32(mainram->GetSize()); - // プレーン数(1..4)をプレーンマスク(0x01..0x0f)に - int nplane = gPlaneVRAM->GetPlaneCount(); + // プレーン数(1,4,8)をプレーンマスク(0x01, 0x0f, 0xff)に + int nplane = bt45x->GetPlaneCount(); int planemask = (1 << nplane) - 1; // プレーンマスク。実際は RAM に書き込まれるがとりあえず ms.SetOffset(0xbc); @@ -167,14 +174,14 @@ Luna1PROMEmuDevice::ROM_Init() // RAM にベクタを書き込む ms.SetOffset(0); - gRAM->Write32(0, ms.Read32()); // ROM のリセットベクタをコピー - gRAM->Write32(4, ms.Read32()); + mainram->Write32(0, ms.Read32()); // ROM のリセットベクタをコピー + mainram->Write32(4, ms.Read32()); - for (int i = 2; i < 256; i++) { // デフォルトベクタで埋める - gRAM->Write32(i * 4, 0x41000800); + for (int i = 2; i < 256; i++) { // デフォルトベクタで埋める + mainram->Write32(i * 4, 0x41000800); } - gRAM->Write32(0x78, 0x41000600); // +78: Lv6 割り込み - gRAM->Write32(0x7c, 0x41000700); // +7c: Lv7 割り込み = RESET + mainram->Write32(0x78, 0x41000600); // +78: Lv6 割り込み + mainram->Write32(0x7c, 0x41000700); // +7c: Lv7 割り込み = RESET prompt_idx = 0; prompt = default_prompt; @@ -182,9 +189,9 @@ Luna1PROMEmuDevice::ROM_Init() // スクリーンを初期化 InitScreen(); - entry = 0; + entry = -1; x_executed = false; - x_entrypoint = 0; + x_entrypoint = -1; // 表示環境が整ったところで NVRAM を照合 if (VerifyNVRAM() == false) { @@ -209,7 +216,7 @@ Luna1PROMEmuDevice::ROM_Init() } else { // DIPSW#1-1 が UP なら自動起動、DOWN なら ROM モニタ起動なので、 // これを真似する。 - if (gPIO0->IsDIPSW11Up()) { + if (pio0->IsDIPSW11Up()) { // NVRAM の設定に従ってブート先を探す。 errmsg.clear(); @@ -220,7 +227,7 @@ Luna1PROMEmuDevice::ROM_Init() } done: - if (entry == 0) { + if (entry == -1) { PrintTitle("LUNA-I"); if (errmsg.empty() == false) { Print("** %s\n\n", errmsg.c_str()); @@ -267,11 +274,11 @@ Luna1PROMEmuDevice::ROM_Close() // %d7 に howto (0 でよい) // (と %a0 にジャンプ先を入れるがこれは Init() が書き出した ROM // アセンブラコード側で行っている) - m68kcpu *cpu = gMPU680x0->GetCPU(); - RegD(6) = 0xa0060000; - RegD(7) = 0; + m68kreg& reg = GetMPU680x0Device()->reg; + reg.D[6] = 0xa0060000; + reg.D[7] = 0; - x_entrypoint = 0; + x_entrypoint = -1; x_executed = false; } @@ -370,7 +377,7 @@ Luna1PROMEmuDevice::CommandG(const std:: bootinfo.dkfile = fname; } x_entrypoint = LoadGuestFile(bootinfo); - if (x_entrypoint == 0) { + if (x_entrypoint == -1) { Print("** %s\n", errmsg.c_str()); } @@ -386,7 +393,7 @@ Luna1PROMEmuDevice::CommandG(const std:: return; } - if (x_entrypoint) { + if (x_entrypoint != -1) { Print("Loaded. Entry point = $%08x\n", x_entrypoint); } } @@ -578,7 +585,7 @@ Luna1PROMEmuDevice::CommandKInput(const void Luna1PROMEmuDevice::CommandX() { - if (x_entrypoint == 0) { + if (x_entrypoint == -1) { Print("** Program is not loaded.\n"); } else { x_executed = true;