|
|
1.1 root 1: //
2: // nono
1.1.1.2 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #pragma once
8:
1.1.1.2 root 9: #include "device.h"
1.1 root 10:
1.1.1.2 root 11: class LunaPROMEmuDevice : public IODevice
1.1 root 12: {
1.1.1.2 root 13: using inherited = IODevice;
1.1 root 14:
1.1.1.7 root 15: protected:
1.1 root 16: // このデバイス先頭アドレス
17: static const uint32 baseaddr = 0x41000000;
18:
19: // 謎の I/O 空間
1.1.1.2 root 20: static const uint32 ROMIO_BASE = 0x41010000;
21: static const uint32 ROMIO_INIT = (ROMIO_BASE + 0);
22: static const uint32 ROMIO_KEYIN = (ROMIO_BASE + 4);
23: static const uint32 ROMIO_CLOSE = (ROMIO_BASE + 8);
1.1.1.6 root 24: static const uint32 ROMIO_ENTRY = (ROMIO_BASE + 12);
1.1 root 25:
1.1.1.7 root 26: // ブート情報格納用
27: struct bootinfo_t {
28: int dkunit {};
29: int dkpart {};
30: std::string dkfile {};
31: };
32:
1.1 root 33: public:
34: LunaPROMEmuDevice();
1.1.1.5 root 35: virtual ~LunaPROMEmuDevice() override;
1.1 root 36:
1.1.1.2 root 37: bool Init() override;
38: void ResetHard() override;
1.1 root 39:
1.1.1.2 root 40: uint64 Read8(uint32 addr) override;
41: uint64 Read16(uint32 addr) override;
42: uint64 Read32(uint32 addr) override;
43: uint64 Write8(uint32 addr, uint32 data) override;
44: uint64 Write16(uint32 addr, uint32 data) override;
45: uint64 Write32(uint32 addr, uint32 data) override;
46: uint64 Peek8(uint32 addr) override;
1.1 root 47:
1.1.1.7 root 48: protected:
49: virtual uint32 ROM_Init() = 0;
50: virtual uint32 ROM_Entry() = 0;
51: virtual void ROM_Close();
52: virtual void Command() = 0;
1.1 root 53:
1.1.1.7 root 54: void InitDevice();
55: void InitScreen(const char *machine_name);
1.1.1.2 root 56: void ConsoleUpdate();
1.1 root 57: uint32 LoadHostFile();
1.1.1.7 root 58: uint32 LoadGuestFile(const bootinfo_t&);
1.1.1.2 root 59:
1.1.1.4 root 60: std::unique_ptr<uint8[]> romdata {};
1.1 root 61:
1.1.1.2 root 62: // 内蔵 ROM 使用後はアクセスできないようにするため
1.1.1.4 root 63: bool is_closed {};
1.1.1.2 root 64:
1.1 root 65: // エラーメッセージの受け渡し用
66: // 基本的にエラーが起きた時だけ更新するので、ここにエラーメッセージを
67: // 返す可能性がある関数をコールする前に呼び出し側が clear() しておき、
68: // 関数から戻ったら empty() かどうか確認する、errno みたいな使い方。
1.1.1.4 root 69: std::string errmsg {};
1.1 root 70:
71: // ROM モニタ用コンソール画面
1.1.1.4 root 72: TextConsole text {};
1.1 root 73:
74: // 入力バッファ
75: std::string inputbuf {};
76:
1.1.1.7 root 77: // 現在のプロンプト文字列
78: std::string prompt {};
1.1 root 79:
80: // NVRAM
81: // 本来他デバイスはすべてグローバル参照できるのだが、LUNA の NVRAM は
82: // RTC と兼用になっていて、RTCDevice *gRTC として見えるので
83: // MK48T02Device にするには dynamic_cast する必要がある。
1.1.1.4 root 84: MK48T02Device *nvram {};
1.1 root 85:
1.1.1.7 root 86: private:
87: uint64 Decoder(uint32 addr) const;
88:
1.1.1.8 ! root 89: // ROM->RAM 切り替え用フラグ。true なら ROM モード
! 90: bool isrom {};
! 91:
1.1.1.7 root 92: // キー入力
93: void ROM_Keyin();
94:
95: int inputpos {}; // カーソル位置
96: bool is_shift {}; // SHIFT キー押し下げ中
97: int mousecnt {}; // マウス入力をスキップするためのカウンタ
98:
1.1 root 99: // LUNA キーコード -> ASCII 変換テーブル
100: static const uint8 lunakey2asciitable[128];
101: static const uint8 lunakey2shifttable[128];
102: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.