--- nono/vm/romemu_luna.h 2026/04/29 17:04:32 1.1 +++ nono/vm/romemu_luna.h 2026/04/29 17:05:03 1.1.1.11 @@ -1,89 +1,108 @@ // // nono -// Copyright (C) 2020 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once -#include "romimg_luna.h" +#include "rom.h" -class LunaPROMEmuDevice : public PROMDevice +class LunaPROMEmuDevice : public ROMDevice { - typedef PROMDevice inherited; + using inherited = ROMDevice; + protected: // このデバイス先頭アドレス static const uint32 baseaddr = 0x41000000; // 謎の I/O 空間 - static const uint32 ROMIO_BASE = 0x41010000; - static const uint32 ROMIO_IPL_INIT = (ROMIO_BASE + 0); - static const uint32 ROMIO_IPL_PROMPT = (ROMIO_BASE + 4); - static const uint32 ROMIO_IPL_CLOSE = (ROMIO_BASE + 8); + static const uint32 ROMIO_BASE = 0x41010000; + static const uint32 ROMIO_INIT = (ROMIO_BASE + 0); + static const uint32 ROMIO_KEYIN = (ROMIO_BASE + 4); + static const uint32 ROMIO_CLOSE = (ROMIO_BASE + 8); + static const uint32 ROMIO_ENTRY = (ROMIO_BASE + 12); + + // 文字コード + // 概ね ASCII だが制御コード部分は必要な文字だけを適当に割り当てる。 + static const char BS = 0x08; + static const char LF = 0x0a; + static const char UP = 0x1c; + static const char LEFT = 0x1d; + static const char RIGHT = 0x1e; + static const char DOWN = 0x1f; + + // ブート情報格納用 + struct bootinfo_t { + int dkunit {}; + int dkpart {}; + std::string dkfile {}; + }; public: LunaPROMEmuDevice(); - virtual ~LunaPROMEmuDevice(); + virtual ~LunaPROMEmuDevice() override; - virtual bool Init(); - virtual void ResetHard(); + bool Init() override; - virtual uint64 Read32(uint32 addr); + uint64 Read32(uint32 addr) override; - private: - uint64 Decoder(uint32 addr) const; - - uint32 IPL_Init(); - uint32 IPL_Close(); - uint32 IPL_Prompt(); - uint32 IPL_Command(); - void IPL_CommandG(const std::vector& arg); - void IPL_CommandGH(); - uint32 LoadHostFile(); - void IPL_CommandK(const std::vector& arg); - bool CommandKInput(const std::string& val); - uint32 IPL_CommandX(); + protected: + virtual uint32 ROM_Init() = 0; + virtual uint32 ROM_Entry() = 0; + virtual void ROM_Close(); + virtual void GetChar(char); + virtual void Command() = 0; + + void InitDevice(); + void InitScreen(const char *machine_name); + void ClearPrompt(); + void ConsoleUpdate(); // NVRAM - uint8 CalcNVRAMCsum(); + uint8 CalcNVRAMCsum() const; void WriteNVRAMCsum(); - bool VerifyNVRAM(); - bool InitNVRAM(); + bool VerifyNVRAM() const; - // NVRAM の設定に従って起動 - uint32 LoadByNVRAM(const std::string& fname); + uint32 LoadHostFile(); + uint32 LoadGuestFile(const bootinfo_t&); - // 状態マシン - int ipl_state {}; - // 'g' コマンドで読み込んだプログラムのエントリポイント。 - // なければ 0。'x' コマンドで使う。 - uint32 entrypoint; // エラーメッセージの受け渡し用 // 基本的にエラーが起きた時だけ更新するので、ここにエラーメッセージを // 返す可能性がある関数をコールする前に呼び出し側が clear() しておき、 // 関数から戻ったら empty() かどうか確認する、errno みたいな使い方。 - std::string errmsg; + std::string errmsg {}; // ROM モニタ用コンソール画面 - TextScreen text; + TextScreen text {}; // 入力バッファ std::string inputbuf {}; - int inputpos {}; // カーソル位置 - bool is_shift; // SHIFT キー押し下げ中 - // プロンプトと入力モード - std::string prompt {}; // 現在のプロンプト文字列 - // プロンプトの状態。 - // 0 が通常プロンプト。 - // 1 以降は k コマンドのプロンプトを示す - int prompt_idx {}; - const std::string default_prompt = ">"; // デフォルトプロンプト + // 現在のプロンプト文字列 + std::string prompt {}; + + // デフォルトプロンプト。 + const std::string default_prompt = ">"; + + // プロンプトのある行(最上行が 0) + int prompt_y {}; + + // カーソル位置(入力バッファ先頭が0) + int inputpos {}; // NVRAM // 本来他デバイスはすべてグローバル参照できるのだが、LUNA の NVRAM は // RTC と兼用になっていて、RTCDevice *gRTC として見えるので // MK48T02Device にするには dynamic_cast する必要がある。 - MK48T02Device *nvram; + MK48T02Device *nvram {}; + + private: + // キー入力 + void ROM_Keyin(); + + bool is_shift {}; // SHIFT キー押し下げ中 + int mousecnt {}; // マウス入力をスキップするためのカウンタ // LUNA キーコード -> ASCII 変換テーブル static const uint8 lunakey2asciitable[128];