--- nono/host/comdriver_cons.cpp 2026/04/29 17:05:34 1.1 +++ nono/host/comdriver_cons.cpp 2026/04/29 17:05:47 1.1.1.2 @@ -13,45 +13,58 @@ #include "hostcom.h" // コンストラクタ -COMDriverCons::COMDriverCons(HostDevice *hostdev_) - : inherited(hostdev_, "Console") +COMDriverConsole::COMDriverConsole(HostDevice *hostdev_) + : inherited(hostdev_, "console") { } // デストラクタ -COMDriverCons::~COMDriverCons() +COMDriverConsole::~COMDriverConsole() { + if (rxpipe.Valid()) { + hostdev->DelOuter(rxpipe); + } + + if (console) { + console->Detach(); + } + auto keyboard = gMainApp.FindObject(OBJ_KEYBOARD); + if (keyboard) { + keyboard->Detach(); + } } // ドライバ初期化 bool -COMDriverCons::InitDriver() +COMDriverConsole::InitDriver(bool startup) { - console = GetConsoleDevice(); - console->Attach(this); - - auto keyboard = gMainApp.GetObject(OBJ_KEYBOARD); - keyboard->Attach(this); - int fds[2]; if (pipe(fds) < 0) { - putmsg(0, "pipe failed: %s", strerror(errno)); + errmsg = string_format("pipe: %s", strerror(errno)); + putmsg(1, "%s", errmsg.c_str()); return false; } rxpipe = fds[0]; txpipe = fds[1]; if (hostdev->AddOuter(rxpipe) < 0) { - putmsg(0, "AddOuter: %s", strerror(errno)); + errmsg = string_format("AddOuter: %s", strerror(errno)); + putmsg(1, "%s", errmsg.c_str()); return false; } + console = GetConsoleDevice(); + console->Attach(this); + + auto keyboard = gMainApp.GetObject(OBJ_KEYBOARD); + keyboard->Attach(this); + return true; } // 外部への1バイト書き出し void -COMDriverCons::Write(uint32 ch) +COMDriverConsole::Write(uint32 ch) { console->Putchar(ch); } @@ -59,7 +72,7 @@ COMDriverCons::Write(uint32 ch) // 外部からの1バイト読み込み。 // HostCOM スレッドから呼ばれる。 int -COMDriverCons::Read() +COMDriverConsole::Read() { uint8 buf[1]; int r; @@ -78,7 +91,7 @@ COMDriverCons::Read() // VM からのキー入力。 // ConsoleKeyboard から呼ばれる。この文字をパイプに書き込んで帰る。 void -COMDriverCons::EnqueueChar(uint charcode) +COMDriverConsole::EnqueueChar(uint charcode) { char buf[1]; int r;