--- nono/vm/romemu_luna.h 2026/04/29 17:05:25 1.1.1.14 +++ nono/vm/romemu_luna.h 2026/04/29 17:06:00 1.1.1.17 @@ -10,18 +10,20 @@ #pragma once -#include "rom.h" +#include "romemu.h" +#include "fixedqueue.h" class BT45xDevice; +class LanceDevice; class LunafbDevice; class MainRAMDevice; class MK48T02Device; class SIODevice; class SPCDevice; -class LunaPROMEmuDevice : public ROMDevice +class LunaPROMEmuDevice : public ROMEmuDevice { - using inherited = ROMDevice; + using inherited = ROMEmuDevice; protected: // このデバイス先頭アドレス @@ -31,12 +33,13 @@ class LunaPROMEmuDevice : public ROMDevi static const uint32 ROMIO_BASE = 0x41010000; static const uint32 ROMIO_INIT = (ROMIO_BASE + 0x00); static const uint32 ROMIO_LOAD = (ROMIO_BASE + 0x04); - static const uint32 ROMIO_KEYIN = (ROMIO_BASE + 0x08); + static const uint32 ROMIO_SIOINTR = (ROMIO_BASE + 0x08); static const uint32 ROMIO_CLOSE = (ROMIO_BASE + 0x0c); static const uint32 ROMIO_ENTRY = (ROMIO_BASE + 0x10); static const uint32 ROMIO_AP1 = (ROMIO_BASE + 0x14); static const uint32 ROMIO_AP2 = (ROMIO_BASE + 0x18); static const uint32 ROMIO_CLKCNT = (ROMIO_BASE + 0x1c); + static const uint32 ROMIO_QUITSTOP = (ROMIO_BASE + 0x20); // 文字コード // 概ね ASCII だが制御コード部分は必要な文字だけを適当に割り当てる。 @@ -61,11 +64,11 @@ class LunaPROMEmuDevice : public ROMDevi bool Init() override; - busdata Read32(uint32 addr) override; - busdata Write32(uint32 addr, uint32 data) override; - protected: - int ROM_Init(); + uint64 ReadROMIO(busaddr addr) override; + bool WriteROMIO(busaddr addr, uint32 data) override; + + void ROM_Init(); virtual void ROM_InitMD() = 0; uint32 ROM_Load(); uint32 ROM_Entry(); @@ -84,6 +87,7 @@ class LunaPROMEmuDevice : public ROMDevi void Putc(uint ch); void Print(const std::string& s); void Print(const char *fmt, ...) __printflike(2, 3); + void PrintDisplay(const char *s); // NVRAM virtual bool InitNVRAM() = 0; @@ -104,6 +108,9 @@ class LunaPROMEmuDevice : public ROMDevi // LUNA-88K では 'b'/'bh' コマンドで。 bool execute {}; + // シリアルか。(DIP-SW で決まる) + bool use_serial {}; + // 機種名 (タイトル表示用) const char *machine_name {}; @@ -138,6 +145,7 @@ class LunaPROMEmuDevice : public ROMDevi int origin_py {}; // テキスト画面の左上 Y 座標(ピクセル) BT45xDevice *bt45x {}; + LanceDevice *lance {}; LunafbDevice *lunafb {}; MainRAMDevice *mainram {}; MK48T02Device *nvram {}; @@ -145,14 +153,24 @@ class LunaPROMEmuDevice : public ROMDevi SPCDevice *spc {}; private: - // キー入力 - void ROM_Keyin(); + void ROM_SIOIntr(); + void PutcSerial(uint); + void PutcDisplay(uint); + void ProcessSerial(); + int GetcSerial(); + int GetcKeyboard(); bool is_shift {}; // SHIFT キー押し下げ中 int mousecnt {}; // マウス入力をスキップするためのカウンタ + FixedQueue sio_txq; // シリアル送信キュー + uint32 clkcnt {}; // クロック割り込みカウンタ + // luna88k で割り込みからジャンプして戻る時のアドレス。 + // 0 なら作用しない。 + uint32 quitstop {}; + // LUNA キーコード -> ASCII 変換テーブル static const uint8 lunakey2asciitable[128]; static const uint8 lunakey2shifttable[128];