--- nono/lib/mainapp.h 2026/04/29 17:05:15 1.1.1.13 +++ nono/lib/mainapp.h 2026/04/29 17:05:57 1.1.1.20 @@ -10,11 +10,15 @@ #pragma once -#include "object.h" +#include "header.h" +#include class Config; class Logger; class MonitorManager; +class Object; +class ThreadManager; +class UIMessage; class VM; // VM 種別 @@ -24,6 +28,7 @@ enum class VMType { LUNA1, LUNA88K, NEWS, + VIRT68K, }; // VM ケーパビリティ (ビットマスク表現) @@ -33,13 +38,14 @@ enum class VMCap : uint32 { LUNA1 = (1U << (int)VMType::LUNA1), LUNA88K = (1U << (int)VMType::LUNA88K), NEWS = (1U << (int)VMType::NEWS), + VIRT68K = (1U << (int)VMType::VIRT68K), LUNA = VMCap::LUNA1 | VMCap::LUNA88K, - M68K = VMCap::X68030 | VMCap::LUNA1 | VMCap::NEWS, + M68K = VMCap::X68030 | VMCap::LUNA1 | VMCap::NEWS | VMCap::VIRT68K, M88K = VMCap::LUNA88K, ALL = 0xffffffff, }; -static inline VMCap operator|(VMCap a, VMCap b) { +inline VMCap operator|(VMCap a, VMCap b) { return static_cast(static_cast(a) | static_cast(b)); } @@ -49,37 +55,61 @@ class MainApp // Init() の戻り値 static const int PASS = -1; // 実行を継続 + // CPU のバインド方法。 + // o Neutral は何もしない。 + // o Binding は、Heavy スレッドを高性能コアにバインドする。 + // Light スレッドは + // 高性能コアが 3個以上あれば、バインドしない (OS に任せる)。 + // 高性能コアが 2個以下なら、低性能コアにバインドする + enum class AffinityPolicy { + Neutral, + Binding, + }; + public: MainApp(); ~MainApp(); + void Dispose(); + // 初期化 (ステージ1) - int Init1(bool is_cli_, int ac, char *av[]); + int Init1(int ac, char *av[], std::string (*conv)(const std::string&)); // 初期化 (ステージ2) bool Init2(); - std::string SearchFile(const std::string& name) const; - // VM 種別を返す。 // (Config が持っているのは文字列) VMType GetVMType() const { return vmtype; } - // VM 種別名を返す。 - const std::string& GetVMName() const { return vmstr; } + // VM 種別を文字列で返す。"luna" とか。 + const std::string& GetVMTypeStr() 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); } + bool IsVIRT68K() const { return (GetVMType() == VMType::VIRT68K); } // 現在の VM が指定のケーパビリティを持っているか? bool Has(VMCap cap) const; + // VM 機種名を返す。こっちが "LUNA-I" とかで表示用。 + const char *GetVMName() const; + // VM ディレクトリを返す const std::string& GetVMDir() const { return vmdir; } + // ファイル名から適切なフルパスを検索。 + std::string SearchFile(const std::string& name) const; + + // 指定の path を正規化(展開)して返す。 + // path が絶対パスならそのまま返す。 + // path が '~' から始まっていればホームディレクトリからの相対パス、 + // それ以外なら VM ディレクトリからの相対パスとみなして展開する。 + std::string NormalizePath(const std::string& path) const; + // オブジェクト登録 void RegistObject(Object *obj); @@ -90,22 +120,22 @@ class MainApp const std::vector& GetObjects() const { return objects; } // 指定のオブジェクトを返す。こっちは、なければ NULL を返す。 - Object *FindObject(int id) const; + Object *FindObject(uint id) const; // 指定のオブジェクトを返す。こっちは、なければ assert する。 - Object *GetObject(int id) const; + Object *GetObject(uint id) const; // 指定のオブジェクトを型 T* にキャストして返す。 // オブジェクトがないかキャストできなければ NULL を返す。 template - T *FindObject(int id) const { + T *FindObject(uint id) const { return dynamic_cast(FindObject(id)); } // 指定のオブジェクトを型 T* にキャストして返す。 // オブジェクトがないかキャストできなければ assert する。 template - T *GetObject(int id) const { + T *GetObject(uint id) const { auto dev = FindObject(id); assert(dev); return dev; @@ -117,16 +147,38 @@ class MainApp // ログ名の一覧を表示する static std::vector GetLogNames(); + // list を一覧表示をする + static void ShowHelpList(FILE*, const std::vector& list); + // Logger を返す Logger *GetLogger() const { return logger.get(); } + // ThreadManager を返す + ThreadManager *GetThreadManager() const { return threadmanager.get(); } + + // UIMessage を返す + UIMessage *GetUIMessage() const { return uimessage.get(); } + public: - // -B: ベンチマークモード - int benchmark_mode {}; + // CLI/GUI 区別 + bool IsCLI() const { return is_cli; } + bool IsGUI() const { return !is_cli; } - // -b: ブレークポイント "[,][,]" + // -b(--b): ブレークポイント "[,][,]" std::vector debug_breakaddr {}; + // --bi: 命令ブレークポイント "[,][:][,]" + std::vector debug_breakinst {}; + + // --bv: ベクタブレークポイント "[,][-][,]" + std::vector debug_breakvec {}; + + // --bi-exg (とりあえず) + bool debug_breakinst_exg {}; + + // --console-log: コンソールデバイスの出力ログ。 + const char *console_logfile {}; + // -d: 起動時にデバッガで停止 bool debug_on_start {}; @@ -142,9 +194,42 @@ class MainApp // -X: ホスト実行ファイル名とその引数 const char *exec_file {}; std::string exec_arg {}; - bool load_and_exec {}; + + // AVX2 を使うかどうか。ホスト CPU 調査と設定ファイル反映後の値。 + bool enable_avx2 {}; + + // AVX2 をホストがサポートしているかどうか。(こっちは情報表示用) + bool detect_avx2 {}; + + // NEON を使うかどうか。ホスト CPU 調査の設定ファイル反映後の値。 + bool enable_neon {}; + + // NEON をホストがサポートしているかどうか。(こっちは情報表示用) + bool detect_neon {}; + + // CPU のバインド方法。 + AffinityPolicy affinity_policy {}; + + // 要素数がコア数。高性能コアのところが true。 + std::vector fastcore {}; + + // ログ表示用 + std::unique_ptr hostcpu /*{}*/; private: + // 初期化ステージ1 の下請け。 + int Init1a(int, char *[], std::string (*conv)(const std::string&)); + int Init1b(); + + // path を絶対パスにして返す。 + // 相対パスならカレントディレクトリからのパスとする。 + static std::string AbsPath(const char *path); + + // path を正規化して返す (下請け)。 + // path が相対パスなら basedir を起点とする。 + static std::string NormalizePath(const std::string& path, + const std::string& basedir); + // ヘルプメッセージを表示する void ShowHelp(bool all) const; @@ -154,29 +239,38 @@ class MainApp // 引数を処理する int ParseOpt(int ac, char *av[]); + // CPU の機能をチェックする。 + bool CheckCPU(); + + // CPU のアフィニティを調べる。 + bool CheckCPUAffinity(); + + // CPU 番号リスト文字列を処理する。 + std::string ParseCPUList(const std::string& input); + // opt を logopt に追加する (-L オプション用) void AddLogopt(const char *opt); // -L オプションを処理する bool ParseLogopt(); + // 早期版 + void ParseLogoptEarly(); // ログレベル1つを設定する。 static bool SetLogopt1(const std::string&, std::string *errmsg); - // 初回起動時用に SRAM.DAT を作成する。 - int CreateSRAM(); - // コンパイルされている host netdriver の一覧を表示 void ShowHostnet() const; // CLI/GUI 区別 - bool IsCLI() const { return is_cli; } - bool IsGUI() const { return !is_cli; } bool is_cli {}; // ログ std::unique_ptr logger /*{}*/; + // UIMessage + std::unique_ptr uimessage /*{}*/; + // 全オブジェクトへのポインタのリスト (所有はしていない) std::vector objects {}; @@ -190,6 +284,9 @@ class MainApp VMType vmtype {}; std::string vmstr {}; + // スレッドマネージャ + std::unique_ptr threadmanager /*{}*/; + // モニタマネージャ std::unique_ptr pMonitorManager /*{}*/; @@ -203,14 +300,14 @@ class MainApp // -L: ログ指定文字列 std::string logopt {}; + // --perf: パフォーマンス測定モード + bool opt_perf {}; + // --show-config: 設定内容を表示 (1なら通常、2ならall) int show_config {}; // -V: パラメータ指定 std::vector> config_options {}; - - // --create-sram オプション - bool create_sram {}; }; // グローバルインスタンス