--- nono/lib/config.cpp 2026/04/29 17:04:40 1.1.1.4 +++ nono/lib/config.cpp 2026/04/29 17:05:12 1.1.1.11 @@ -4,14 +4,16 @@ // Licensed under nono-license.txt // +// +// 設定 +// + #include "config.h" +#include "fdc.h" #include "mystring.h" -std::unique_ptr gConfig; - -// -// 設定クラス -// +// グローバル参照用 +Config *gConfig; // コンストラクタ Config::Config() @@ -25,62 +27,148 @@ Config::Config() // 以下概ねアルファベット順に並べる - // デバッガの TCP 待ち受けポート - Add("debugger-port", 0); - Add("ethernet-hostdriver", "none"); - Add("ethernet-macaddr", "auto"); - // LUNA の DIPSW (1 が UP、0 が DOWN) - // 機種によって初期値を変えるため pio.cpp で設定。 - Add("luna-dipsw1"); - Add("luna-dipsw2"); - // モニタウィンドウの更新頻度。(Hz) + // X68030 CGROM ファイルパス。なければ内蔵 CGROM。 + Add("cgrom-image", "", VMCap::X68030); + + // VM 内の時計を同期する時間軸。 + // [ real, virtual ] + Add("clock-sync", "real"); + + // デバッガコンソール + Add("debugger-driver", "none"); + Add("debugger-tcp-port", 0); + // デバッガコンソールの fallback は常に不可とする。hostcom.cpp 参照。 + // "debugger-fallback" + + // MAC アドレス + Add("ethernet-macaddr", "auto", VMCap::LUNA); + + // フロッピーディスク + Add("fd-drive", 2, VMCap::X68030); + for (int id = 0; id < FDCDevice::MAX_DRIVE; id++) { + // 種別とイメージパス + Add(string_format("fd%d-image", id), VMCap::X68030); + // エミュレータ的に書き込みを禁止するか + Add(string_format("fd%d-writeignore", id), 0, VMCap::X68030); + } + + // X68030 時の FPU の有無。 + Add("fpu-type", "68881", VMCap::X68030); + + // シリアルポートのホスト側設定 + Add("hostcom-driver", "none"); + Add("hostcom-fallback", 0); + Add("hostcom-tcp-port", 9998); + + // キーボードの入力モード + 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"); + + // IPLROM1/2 ファイルパス。なければ内蔵 ROM。 + Add("iplrom1-image", "", VMCap::X68030); + Add("iplrom2-image", "", VMCap::X68030); + + // キーボードの接続 + Add("keyboard-connect", 1); + + // LUNA の RTC(MK48T02) がうるう年でない 1970 をエポックとして + // 設定しているので、そちらに合わせてうるう年を補正する + Add("luna-adjust-misused-epoch", 1, VMCap::LUNA); + + // LUNA の DIPSW (1 が UP、0 が DOWN)。 + // 初期値は機種によって異なるため pio.cpp で設定している。 + Add("luna-dipsw1", VMCap::LUNA); + Add("luna-dipsw2", VMCap::LUNA); + + // LUNA ビデオボードプレーン数 + Add("luna-video-plane", 1, VMCap::LUNA); + + // m88100 の別名ニーモニックを併記する。 + Add(".m88k-altname", 0, VMCap::M88K); + + // モニタウィンドウの更新頻度 [Hz] Add("monitor-rate", 20); - // MPU クロック (MHz 単位の実数、小数点以下は3桁まで)。 - // 各 VM クラスで初期値を設定している。 + + // MPU クロック (MHz 単位の実数、小数点以下は3桁まで)。 + // 初期値は各 VM クラスで設定している。 Add("mpu-clock"); - Add("mpu-has-fpu", 0); - // PROM ファイルパス。なければ内蔵 ROM 起動。 - Add("prom-image", ""); - Add(".prom-scsi-debug", 0); - // RAM サイズ (MB 単位の整数)。 - // 各 VM クラスで初期値を設定している。 + + // M88100 で疑似 STOP 状態をサポートする + Add("mpu-pseudo-stop", 1, VMCap::M88K); + + // PROM ファイルパス。なければ内蔵 ROM 起動。 + Add("prom-image", "", VMCap::LUNA); + + // PROM のデバッグオプション。 + // PROM 中の SCSI デバッグビットを立てる。 + Add(".prom-scsi-debug", 0, VMCap::LUNA1); + + // RAM サイズ (MB 単位の整数)。 + // 初期値は機種ごとの VM クラスで設定している。 Add("ram-size", 0); + + // RTC のデバッグ用オプション。 Add(".rtc-force-fixed", 0); + Add(".rtc-date"); + Add(".rtc-time"); + + // RTC の epoch。初期値は各 VM クラスで設定している。 + Add("rtc-epoch-year", VMCap::LUNA); + + // ステータスパネルを表示する。 + Add("show-statuspanel", 1); + + // SCSI 設定。 for (int id = 0; id < 8; id++) { + // 種別とイメージパス Add(string_format("spc0-id%d-image", id)); + // エミュレータ的に書き込みを禁止するか + Add(string_format("spc0-id%d-writeignore", id), 0); + // エミュレータ的に書き込みを禁止するか + // (後方互換、十分不要になった頃に削除する) Add(string_format("spc0-id%d-writeprotect", id), 0); - // シークタイム [msec] + // シークタイム [msec] Add(string_format("spc0-id%d-seektime", id), 0); } + + // SRAM の RAM 容量を同期するか。 + Add("sram-sync-ramsize", 1, VMCap::X68030); } // デストラクタ Config::~Config() { + gConfig = NULL; } // 項目を追加 (初期状態用)。値は空文字列。 bool -Config::Add(const std::string& key) +Config::Add(const std::string& key, VMCap vmcap) { - return Add(key, ""); + return Add(key, "", vmcap); } // 項目を追加 (初期状態用)。値は整数値を文字列にしたもの。 bool -Config::Add(const std::string& key, int value) +Config::Add(const std::string& key, int value, VMCap vmcap) { - return Add(key, std::to_string(value)); + return Add(key, std::to_string(value), vmcap); } // 項目を追加 (初期状態用) bool -Config::Add(const std::string& key, const std::string& value) +Config::Add(const std::string& key, const std::string& value, VMCap vmcap) { assert(FindItem(key) == NULL); assert(fixed == false); - list.emplace_back(key, value, ConfigItem::FromInitial, ""); + list.emplace_back(key, value, vmcap, ConfigItem::FromInitial, ""); return true; } @@ -134,7 +222,8 @@ Config::Update(const std::vector