|
|
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.9 ! root 26: // 文字コード
! 27: // 概ね ASCII だが制御コード部分は必要な文字だけを適当に割り当てる。
! 28: static const char BS = 0x08;
! 29: static const char LF = 0x0a;
! 30: static const char UP = 0x1c;
! 31: static const char LEFT = 0x1d;
! 32: static const char RIGHT = 0x1e;
! 33: static const char DOWN = 0x1f;
! 34:
1.1.1.7 root 35: // ブート情報格納用
36: struct bootinfo_t {
37: int dkunit {};
38: int dkpart {};
39: std::string dkfile {};
40: };
41:
1.1 root 42: public:
43: LunaPROMEmuDevice();
1.1.1.5 root 44: virtual ~LunaPROMEmuDevice() override;
1.1 root 45:
1.1.1.2 root 46: bool Init() override;
47: void ResetHard() override;
1.1 root 48:
1.1.1.2 root 49: uint64 Read8(uint32 addr) override;
50: uint64 Read16(uint32 addr) override;
51: uint64 Read32(uint32 addr) override;
52: uint64 Write8(uint32 addr, uint32 data) override;
53: uint64 Write16(uint32 addr, uint32 data) override;
54: uint64 Write32(uint32 addr, uint32 data) override;
55: uint64 Peek8(uint32 addr) override;
1.1 root 56:
1.1.1.7 root 57: protected:
58: virtual uint32 ROM_Init() = 0;
59: virtual uint32 ROM_Entry() = 0;
60: virtual void ROM_Close();
1.1.1.9 ! root 61: virtual void GetChar(char);
1.1.1.7 root 62: virtual void Command() = 0;
1.1 root 63:
1.1.1.7 root 64: void InitDevice();
65: void InitScreen(const char *machine_name);
1.1.1.9 ! root 66: void ClearPrompt();
1.1.1.2 root 67: void ConsoleUpdate();
1.1.1.9 ! root 68:
! 69: // NVRAM
! 70: uint8 CalcNVRAMCsum() const;
! 71: void WriteNVRAMCsum();
! 72: bool VerifyNVRAM() const;
! 73:
1.1 root 74: uint32 LoadHostFile();
1.1.1.7 root 75: uint32 LoadGuestFile(const bootinfo_t&);
1.1.1.2 root 76:
1.1.1.4 root 77: std::unique_ptr<uint8[]> romdata {};
1.1 root 78:
79: // エラーメッセージの受け渡し用
80: // 基本的にエラーが起きた時だけ更新するので、ここにエラーメッセージを
81: // 返す可能性がある関数をコールする前に呼び出し側が clear() しておき、
82: // 関数から戻ったら empty() かどうか確認する、errno みたいな使い方。
1.1.1.4 root 83: std::string errmsg {};
1.1 root 84:
85: // ROM モニタ用コンソール画面
1.1.1.9 ! root 86: TextScreen text {};
1.1 root 87:
88: // 入力バッファ
89: std::string inputbuf {};
90:
1.1.1.7 root 91: // 現在のプロンプト文字列
92: std::string prompt {};
1.1 root 93:
1.1.1.9 ! root 94: // プロンプトのある行(最上行が 0)
! 95: int prompt_y {};
! 96:
! 97: // カーソル位置(入力バッファ先頭が0)
! 98: int inputpos {};
! 99:
1.1 root 100: // NVRAM
101: // 本来他デバイスはすべてグローバル参照できるのだが、LUNA の NVRAM は
102: // RTC と兼用になっていて、RTCDevice *gRTC として見えるので
103: // MK48T02Device にするには dynamic_cast する必要がある。
1.1.1.4 root 104: MK48T02Device *nvram {};
1.1 root 105:
1.1.1.7 root 106: private:
107: uint64 Decoder(uint32 addr) const;
108:
1.1.1.8 root 109: // ROM->RAM 切り替え用フラグ。true なら ROM モード
110: bool isrom {};
111:
1.1.1.7 root 112: // キー入力
113: void ROM_Keyin();
114:
115: bool is_shift {}; // SHIFT キー押し下げ中
116: int mousecnt {}; // マウス入力をスキップするためのカウンタ
117:
1.1 root 118: // LUNA キーコード -> ASCII 変換テーブル
119: static const uint8 lunakey2asciitable[128];
120: static const uint8 lunakey2shifttable[128];
121: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.