--- nono/vm/romimg_x68k.cpp 2026/04/29 17:05:11 1.1.1.8 +++ nono/vm/romimg_x68k.cpp 2026/04/29 17:05:14 1.1.1.9 @@ -38,8 +38,10 @@ // +---------------+ #include "romimg_x68k.h" -#include "cgrom.h" +#include "builtinrom.h" +#include "config.h" #include "mainapp.h" +#include "vm.h" // グローバル参照用 CGROMDevice *gCGROM; @@ -132,16 +134,13 @@ IPLROM0Device::Peek8(uint32 addr) // -// IPLROM(1) +// IPLROM(1) 0xfe0000..0xffffff 担当 // // コンストラクタ IPLROM1Device::IPLROM1Device() - : inherited("IPLROM(1)") + : inherited("IPLROM1") { - ClearAlias(); - AddAlias("IPLROM1"); - devaddr = 0xfe0000; devlen = 0x020000; mask = devlen - 1; @@ -161,30 +160,33 @@ IPLROM1Device::Init() { std::string name; + // ベンチマークモードは先に処理。この辺どうするか。 if (gMainApp.benchmark_mode != 0) { name = string_format("BENCH%02d.ROM", gMainApp.benchmark_mode); - } else { - name = "IPLROM30.DAT"; + return LoadROM(name.c_str(), devlen); } - if (LoadROM(name.c_str(), 128 * 1024) == false) { - return false; + const ConfigItem& item = gConfig->Find("iplrom1-image"); + name = item.AsString(); + if (name.empty()) { + // 指定がなければ、内蔵 IPLROM を使う。 + mem = Builtin::IPLROM30; + return true; } - return true; + + // 外部ファイルが指定されれば、それを使う。 + return LoadROM(name.c_str(), devlen); } // -// IPLROM(2) +// IPLROM(2) 0xfc0000..0xfdffff 担当 // // コンストラクタ IPLROM2Device::IPLROM2Device() - : inherited("IPLROM(2)") + : inherited("IPLROM2") { - ClearAlias(); - AddAlias("IPLROM2"); - devaddr = 0xfc0000; devlen = 0x020000; mask = devlen - 1; @@ -206,10 +208,15 @@ IPLROM2Device::Init() return true; } - if (LoadROM("ROM30.DAT", 128 * 1024) == false) { + const ConfigItem& item = gConfig->Find("iplrom2-image"); + std::string name = item.AsString(); + if (name.empty()) { + printf("iplrom2: not yet\n"); return false; } - return true; + + // 外部ファイルが指定されれば、それを使う。 + return LoadROM(name.c_str(), devlen); } @@ -238,12 +245,32 @@ CGROMDevice::~CGROMDevice() bool CGROMDevice::Init() { -#if 0 - mem = builtin_cgrom; -#else - if (LoadROM("CGROM30.DAT", 768 * 1024) == false) { + const ConfigItem& item = gConfig->Find("cgrom-image"); + std::string name = item.AsString(); + if (name.empty()) { + // 指定がなければ、内蔵 CGROM を使う。 + mem = Builtin::CGROM; + return true; + } + + // 外部ファイルが指定されれば、それを使う。 + if (LoadROM(name.c_str(), devlen) == false) { + // 指定したファイルが読めなければエラー。 return false; } -#endif + + // X68030 の CGROM には、X68000 のものには収録されていない 6x12 フォント + // が収録されている。6x12 フォント以外は(たぶん)同じなのでほとんどの場面 + // で困ることはないが、それ故に忘れた頃に一部の文字だけ表示されなくて + // 「???」ということになりがちなので、6x12 フォントが収録されてなさそう + // なら警告を出しておく (処理は続行する)。 + uint8 val = 0; + for (int i = 0; i < 12; i++) { + val |= imagebuf[0xbf400 + ('0' * 12) + i]; + } + if (val == 0) { + warnx("warning: 6x12 font not found in CGROM30.DAT"); + } + return true; }