--- nono/lib/config.cpp 2026/04/29 17:05:15 1.1.1.12 +++ nono/lib/config.cpp 2026/04/29 17:05:19 1.1.1.13 @@ -45,7 +45,9 @@ Config::Config() Add("dipsw-serial", "", VMCap::LUNA | VMCap::NEWS); // MAC アドレス - Add("ethernet-macaddr", "auto", VMCap::LUNA | VMCap::NEWS); + Add("ethernet0-macaddr", "auto"); + Add("ethernet1-macaddr", "auto"); + AddAlias("ethernet-macaddr", "ethernet0-macaddr"); // X68030 の拡張メモリサイズ Add("extram-size", "0", VMCap::X68030); @@ -74,11 +76,24 @@ Config::Config() Add("hostkbd-input", "char"); // ネットワークのホスト側設定。 - Add("hostnet-driver", "auto"); - Add("hostnet-fallback", 0); - Add("hostnet-afpacket-ifname", "auto"); - Add("hostnet-bpf-ifname", "auto"); - Add("hostnet-tap-devpath", "auto"); + for (int i = 0; i < 2; i++) { + // 2枚目はデフォルトで none のほうがいいだろう。 + // --show-config での表示順のためループ内におく。 + if (i == 0) { + Add("hostnet0-driver", "auto"); + } else { + Add("hostnet1-driver", "none"); + } + Add(string_format("hostnet%d-fallback", i), 0); + Add(string_format("hostnet%d-afpacket-ifname", i), "auto"); + Add(string_format("hostnet%d-bpf-ifname", i), "auto"); + Add(string_format("hostnet%d-tap-devpath", i), "auto"); + } + AddAlias("hostnet-driver", "hostnet0-driver"); + AddAlias("hostnet-fallback", "hostnet0-fallback"); + AddAlias("hostnet-afpacket-ifname", "hostnet0-afpacket-ifname"); + AddAlias("hostnet-bpf-ifname", "hostnet0-bpf-ifname"); + AddAlias("hostnet-tap-devpath", "hostnet0-tap-devpath"); // IPLROM1/2 ファイルパス。なければ内蔵 ROM。 Add("iplrom1-image", "", VMCap::X68030); @@ -118,10 +133,23 @@ Config::Config() // M88100 で疑似 STOP 状態をサポートする Add("mpu-pseudo-stop", 1, VMCap::M88K); + // Nereid + Add("nereid0-enable", 0, VMCap::X68030); + Add("nereid1-enable", 0, VMCap::X68030); + + // Nereid イーサネット + Add("nereid0-net", 1, VMCap::X68030); + Add("nereid1-net", 1, VMCap::X68030); + + // Nereid バンクメモリ容量 (0, 4, 16 もしくは -4, -16) + Add("nereid0-ram-size", 16, VMCap::X68030); + Add("nereid1-ram-size", 16, VMCap::X68030); + // NEWS の DIPSW (1 がオン、0 がオフ)。 Add("news-dipsw", "00001000", VMCap::NEWS); // NEWS の SIC を無視する。(暫定) + // これは新旧で処置が変わるのでエイリアスにしていない。 Add("xxx-news-sic-ignore", "0", VMCap::NEWS); Add("xxx-news-sci-ignore", "", VMCap::NEWS); @@ -195,6 +223,21 @@ Config::Add(const std::string& key, cons return true; } +// エイリアスを追加 +bool +Config::AddAlias(const std::string& alias, const std::string& key) +{ + // すでに同名のエイリアスがあれば、プログラムミス + for (const auto& p : aliases) { + if (alias == p.first) { + PANIC("aliases already has %s !", alias.c_str()); + } + } + + aliases.emplace_back(alias, key); + return true; +} + // 項目を削除 // key が見付からなくても何もしない。key は複数登録されていることはないはず。 void @@ -255,6 +298,9 @@ Config::UpdateLine(const std::string& li return false; } + // キーが別名なら正規名に置換 + key = GetCanonKey(key); + // キーで検索 ConfigItem *itemptr = FindItem(key); if (itemptr == NULL) { @@ -301,6 +347,23 @@ Config::SplitKeyVal(std::string *keyp, s return true; } +// キーがエイリアスなら正規名を返す。 +// エイリアスでなければキーをそのまま返す。 +const std::string& +Config::GetCanonKey(const std::string& key) const +{ + for (const auto& p : aliases) { + const auto& alias = p.first; + const auto& canon = p.second; + + if (key == alias) { + return canon; + } + } + + return key; +} + // 内容を表示する。 // all なら隠し設定も含めて表示。 void @@ -525,7 +588,7 @@ ConfigItem::PrintErr(ConfigItem::from_t fromstr = where + ": "; if (key.empty() == false) { fromstr += key; - fromstr + "="; + fromstr += "="; } fromstr += value; break;