|
|
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:
15: // このデバイス先頭アドレス
16: static const uint32 baseaddr = 0x41000000;
17:
18: // 謎の I/O 空間
1.1.1.2 root 19: static const uint32 ROMIO_BASE = 0x41010000;
20: static const uint32 ROMIO_INIT = (ROMIO_BASE + 0);
21: static const uint32 ROMIO_KEYIN = (ROMIO_BASE + 4);
22: static const uint32 ROMIO_CLOSE = (ROMIO_BASE + 8);
1.1.1.6 ! root 23: static const uint32 ROMIO_ENTRY = (ROMIO_BASE + 12);
1.1 root 24:
25: public:
26: LunaPROMEmuDevice();
1.1.1.5 root 27: virtual ~LunaPROMEmuDevice() override;
1.1 root 28:
1.1.1.2 root 29: bool Init() override;
30: void ResetHard() override;
1.1 root 31:
1.1.1.2 root 32: uint64 Read8(uint32 addr) override;
33: uint64 Read16(uint32 addr) override;
34: uint64 Read32(uint32 addr) override;
35: uint64 Write8(uint32 addr, uint32 data) override;
36: uint64 Write16(uint32 addr, uint32 data) override;
37: uint64 Write32(uint32 addr, uint32 data) override;
38: uint64 Peek8(uint32 addr) override;
1.1 root 39:
40: private:
41: uint64 Decoder(uint32 addr) const;
42:
1.1.1.2 root 43: uint32 ROM_Init();
44: uint32 ROM_Close();
45: uint32 ROM_Keyin();
46: void ConsoleUpdate();
47: uint32 Command();
48: void CommandG(const std::vector<std::string>& arg);
49: void CommandGH();
1.1 root 50: uint32 LoadHostFile();
1.1.1.2 root 51: void CommandK(const std::vector<std::string>& arg);
1.1 root 52: bool CommandKInput(const std::string& val);
1.1.1.2 root 53: uint32 CommandX();
54:
1.1.1.4 root 55: std::unique_ptr<uint8[]> romdata {};
1.1 root 56:
57: // NVRAM
58: uint8 CalcNVRAMCsum();
59: void WriteNVRAMCsum();
60: bool VerifyNVRAM();
61: bool InitNVRAM();
62:
63: // NVRAM の設定に従って起動
64: uint32 LoadByNVRAM(const std::string& fname);
65:
1.1.1.2 root 66: // 内蔵 ROM 使用後はアクセスできないようにするため
1.1.1.4 root 67: bool is_closed {};
1.1.1.2 root 68:
1.1 root 69: // 'g' コマンドで読み込んだプログラムのエントリポイント。
70: // なければ 0。'x' コマンドで使う。
1.1.1.4 root 71: uint32 entrypoint {};
1.1 root 72: // エラーメッセージの受け渡し用
73: // 基本的にエラーが起きた時だけ更新するので、ここにエラーメッセージを
74: // 返す可能性がある関数をコールする前に呼び出し側が clear() しておき、
75: // 関数から戻ったら empty() かどうか確認する、errno みたいな使い方。
1.1.1.4 root 76: std::string errmsg {};
1.1 root 77:
78: // ROM モニタ用コンソール画面
1.1.1.4 root 79: TextConsole text {};
1.1 root 80:
81: // 入力バッファ
82: std::string inputbuf {};
83: int inputpos {}; // カーソル位置
1.1.1.4 root 84: bool is_shift {}; // SHIFT キー押し下げ中
1.1.1.3 root 85: int mousecnt {}; // マウス入力をスキップするためのカウンタ
1.1 root 86:
87: // プロンプトと入力モード
88: std::string prompt {}; // 現在のプロンプト文字列
89: // プロンプトの状態。
90: // 0 が通常プロンプト。
91: // 1 以降は k コマンドのプロンプトを示す
92: int prompt_idx {};
93: const std::string default_prompt = ">"; // デフォルトプロンプト
94:
95: // NVRAM
96: // 本来他デバイスはすべてグローバル参照できるのだが、LUNA の NVRAM は
97: // RTC と兼用になっていて、RTCDevice *gRTC として見えるので
98: // MK48T02Device にするには dynamic_cast する必要がある。
1.1.1.4 root 99: MK48T02Device *nvram {};
1.1 root 100:
101: // LUNA キーコード -> ASCII 変換テーブル
102: static const uint8 lunakey2asciitable[128];
103: static const uint8 lunakey2shifttable[128];
104: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.