--- nono/vm/romemu_luna88k.h 2026/04/29 17:04:32 1.1 +++ nono/vm/romemu_luna88k.h 2026/04/29 17:04:59 1.1.1.8 @@ -1,38 +1,75 @@ // // nono -// Copyright (C) 2020 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once -#include "romimg_luna.h" +#include "romemu_luna.h" -class Luna88kPROMEmuDevice : public PROMDevice -{ - typedef PROMDevice inherited; +class m88kcpu; - // このデバイス先頭アドレス - static const uint32 baseaddr = 0x41000000; +class Luna88kPROMEmuDevice : public LunaPROMEmuDevice +{ + using inherited = LunaPROMEmuDevice; - // 謎の I/O 空間 - static const uint32 ROMIO_BASE = 0x41010000; - static const uint32 ROMIO_IPL = (ROMIO_BASE + 0); + // プロンプト種別 + enum { + PROMPT_DEFAULT = 0, + PROMPT_NVRAM_UPDATE, + PROMPT_NVRAM_NEW, + PROMPT_NVRAM_INIT, + }; public: Luna88kPROMEmuDevice(); - virtual ~Luna88kPROMEmuDevice(); + virtual ~Luna88kPROMEmuDevice() override; - virtual bool Init(); - virtual void ResetHard(); + bool Init() override; + void ResetHard() override; - virtual uint64 Read32(uint32 addr); + // DOS call エミュレーション + bool FLineCallback(m88kcpu *cpu); private: - uint64 Decoder(uint32 addr) const; - - // 起動時の処理を行う - uint32 IPL(); - - // リセット後 IPL を完了したら true - bool ipl_done = false; + uint32 ROM_Init() override; + uint32 ROM_Entry() override; + void GetChar(char asciicode) override; + void Command() override; + + void CommandH(const std::vector& arg); + void CommandB(const std::vector& arg); + void CommandBH(); + void CommandNvram(const std::vector& arg); + void CommandNvramShowAll(); + void CommandNvramShow(const std::vector& arg); + void CommandNvramUpdate(const std::vector& arg); + void CommandNvramUpdate2(char); + void CommandNvramNew2(char); + void CommandNvramDelete(const std::vector& arg); + void CommandNvramInit(); + void CommandNvramInit2(char); + + // NVRAM + uint32 FindNVRAM(const std::string& key) const; + bool InitNVRAM(); + void GetNVRAM(bootinfo_t&); + + uint32 b_entrypoint {}; + + // nvram コマンドの遷移で覚えておくもの + int nvram_offset {}; + std::string nvram_key {}; + std::string nvram_val {}; + + // プロンプトの状態。 + // 0 (PROMPT_DEFAULT) が通常の行入力プロンプト。 + // PROMPT_NVRAM_* は nvram コマンドでの確認プロンプト。 + int prompt_idx {}; + + // デフォルトプロンプト。 + // 本物は "O>" というプロンプトで、何の O か分からんけど(OMRON?)、 + // こっちは nono の頭文字ということにしておく。 + const std::string default_prompt = "N>"; };