--- nono/lib/mainapp.h 2026/04/29 17:05:12 1.1.1.12 +++ nono/lib/mainapp.h 2026/04/29 17:05:15 1.1.1.13 @@ -23,6 +23,7 @@ enum class VMType { X68030, LUNA1, LUNA88K, + NEWS, }; // VM ケーパビリティ (ビットマスク表現) @@ -31,12 +32,16 @@ enum class VMCap : uint32 { X68030 = (1U << (int)VMType::X68030), LUNA1 = (1U << (int)VMType::LUNA1), LUNA88K = (1U << (int)VMType::LUNA88K), + NEWS = (1U << (int)VMType::NEWS), LUNA = VMCap::LUNA1 | VMCap::LUNA88K, - M68K = VMCap::X68030 | VMCap::LUNA1, + M68K = VMCap::X68030 | VMCap::LUNA1 | VMCap::NEWS, M88K = VMCap::LUNA88K, ALL = 0xffffffff, }; +static inline VMCap operator|(VMCap a, VMCap b) { + return static_cast(static_cast(a) | static_cast(b)); +} class MainApp { @@ -60,25 +65,58 @@ class MainApp // (Config が持っているのは文字列) VMType GetVMType() const { return vmtype; } + // VM 種別名を返す。 + const std::string& GetVMName() const { return vmstr; } + + // たいていは、この機種か?で調べたいことが多いので。 + bool IsX68030() const { return (GetVMType() == VMType::X68030); } + bool IsLUNA1() const { return (GetVMType() == VMType::LUNA1); } + bool IsLUNA88K() const { return (GetVMType() == VMType::LUNA88K); } + bool IsNEWS() const { return (GetVMType() == VMType::NEWS); } + // 現在の VM が指定のケーパビリティを持っているか? bool Has(VMCap cap) const; // VM ディレクトリを返す const std::string& GetVMDir() const { return vmdir; } + // オブジェクト登録 + void RegistObject(Object *obj); + + // オブジェクト削除 + void UnregistObject(Object *obj); + + // オブジェクトのリストを返す + const std::vector& GetObjects() const { return objects; } + + // 指定のオブジェクトを返す。こっちは、なければ NULL を返す。 + Object *FindObject(int id) const; + + // 指定のオブジェクトを返す。こっちは、なければ assert する。 + Object *GetObject(int id) const; + + // 指定のオブジェクトを型 T* にキャストして返す。 + // オブジェクトがないかキャストできなければ NULL を返す。 + template + T *FindObject(int id) const { + return dynamic_cast(FindObject(id)); + } + + // 指定のオブジェクトを型 T* にキャストして返す。 + // オブジェクトがないかキャストできなければ assert する。 + template + T *GetObject(int id) const { + auto dev = FindObject(id); + assert(dev); + return dev; + } + // ログレベルを設定する。 static bool SetLogopt(const std::vector&, std::string *errmsg); // ログ名の一覧を表示する static std::vector GetLogNames(); - // オブジェクトを追加/削除 (Object が呼ぶ) - void AddObject(Object *); - void DeleteObject(Object *); - - // オブジェクトのリストを返す - const std::vector& GetObjects() const { return objects; } - // Logger を返す Logger *GetLogger() const { return logger.get(); } @@ -86,29 +124,20 @@ class MainApp // -B: ベンチマークモード int benchmark_mode {}; - // -b: ブレークポイント "[,]" + // -b: ブレークポイント "[,][,]" std::vector debug_breakaddr {}; // -d: 起動時にデバッガで停止 bool debug_on_start {}; - // -D: デバッガを stdio で使う - bool opt_D {}; - - // -f: 高速モード (XXX 設定ファイルと含めて見直すこと) - bool fast_mode {}; - - // --fontsize: フォントサイズ指定値 (値は fontsize_t ではない) - int fontsize {}; - // -H: 内蔵 Human68k 風を組み込む。-X による実行ファイル名が必要。 bool human_mode {}; // -M: モニタ名 std::string monitor_opt {}; - // -s,--scale: 画面スケール - double screen_scale {}; + // -M: 内蔵 MSX-DOS 風を組み込む。-X による実行ファイル名が必要。 + bool msxdos_mode {}; // -X: ホスト実行ファイル名とその引数 const char *exec_file {}; @@ -123,7 +152,7 @@ class MainApp void ShowVersion() const; // 引数を処理する - bool ParseOpt(int ac, char *av[]); + int ParseOpt(int ac, char *av[]); // opt を logopt に追加する (-L オプション用) void AddLogopt(const char *opt); @@ -134,6 +163,9 @@ class MainApp // ログレベル1つを設定する。 static bool SetLogopt1(const std::string&, std::string *errmsg); + // 初回起動時用に SRAM.DAT を作成する。 + int CreateSRAM(); + // コンパイルされている host netdriver の一覧を表示 void ShowHostnet() const; @@ -156,6 +188,7 @@ class MainApp // VM 種別 VMType vmtype {}; + std::string vmstr {}; // モニタマネージャ std::unique_ptr pMonitorManager /*{}*/; @@ -174,7 +207,10 @@ class MainApp int show_config {}; // -V: パラメータ指定 - std::vector config_options {}; + std::vector> config_options {}; + + // --create-sram オプション + bool create_sram {}; }; // グローバルインスタンス