|
|
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:
1.1.1.12 root 7: //
8: // LUNA シリーズの ROM エミュレーション共通部分
9: //
10:
1.1 root 11: #pragma once
12:
1.1.1.15 root 13: #include "romemu.h"
1.1.1.17! root 14: #include "fixedqueue.h"
1.1 root 15:
1.1.1.13 root 16: class BT45xDevice;
1.1.1.15 root 17: class LanceDevice;
1.1.1.13 root 18: class LunafbDevice;
19: class MainRAMDevice;
20: class MK48T02Device;
21: class SIODevice;
22: class SPCDevice;
23:
1.1.1.15 root 24: class LunaPROMEmuDevice : public ROMEmuDevice
1.1 root 25: {
1.1.1.15 root 26: using inherited = ROMEmuDevice;
1.1 root 27:
1.1.1.7 root 28: protected:
1.1 root 29: // このデバイス先頭アドレス
30: static const uint32 baseaddr = 0x41000000;
31:
32: // 謎の I/O 空間
1.1.1.2 root 33: static const uint32 ROMIO_BASE = 0x41010000;
1.1.1.14 root 34: static const uint32 ROMIO_INIT = (ROMIO_BASE + 0x00);
35: static const uint32 ROMIO_LOAD = (ROMIO_BASE + 0x04);
1.1.1.17! root 36: static const uint32 ROMIO_SIOINTR = (ROMIO_BASE + 0x08);
1.1.1.14 root 37: static const uint32 ROMIO_CLOSE = (ROMIO_BASE + 0x0c);
38: static const uint32 ROMIO_ENTRY = (ROMIO_BASE + 0x10);
39: static const uint32 ROMIO_AP1 = (ROMIO_BASE + 0x14);
40: static const uint32 ROMIO_AP2 = (ROMIO_BASE + 0x18);
41: static const uint32 ROMIO_CLKCNT = (ROMIO_BASE + 0x1c);
1.1.1.16 root 42: static const uint32 ROMIO_QUITSTOP = (ROMIO_BASE + 0x20);
1.1 root 43:
1.1.1.9 root 44: // 文字コード
45: // 概ね ASCII だが制御コード部分は必要な文字だけを適当に割り当てる。
46: static const char BS = 0x08;
47: static const char LF = 0x0a;
1.1.1.14 root 48: static const char CR = 0x0d;
1.1.1.9 root 49: static const char UP = 0x1c;
50: static const char LEFT = 0x1d;
51: static const char RIGHT = 0x1e;
52: static const char DOWN = 0x1f;
53:
1.1.1.7 root 54: // ブート情報格納用
55: struct bootinfo_t {
56: int dkunit {};
57: int dkpart {};
58: std::string dkfile {};
59: };
60:
1.1 root 61: public:
62: LunaPROMEmuDevice();
1.1.1.14 root 63: ~LunaPROMEmuDevice() override;
1.1 root 64:
1.1.1.2 root 65: bool Init() override;
1.1 root 66:
1.1.1.7 root 67: protected:
1.1.1.15 root 68: uint64 ReadROMIO(busaddr addr) override;
69: bool WriteROMIO(busaddr addr, uint32 data) override;
70:
71: void ROM_Init();
1.1.1.14 root 72: virtual void ROM_InitMD() = 0;
73: uint32 ROM_Load();
74: uint32 ROM_Entry();
1.1.1.7 root 75: virtual void ROM_Close();
1.1.1.14 root 76: void ROM_AP1();
77: void ROM_AP2();
78: virtual uint32 LoadFile(const std::string& fname) = 0;
1.1.1.13 root 79: virtual void ProcessChar(char);
1.1.1.7 root 80: virtual void Command() = 0;
1.1 root 81:
1.1.1.12 root 82: void InitScreen();
1.1.1.14 root 83: void InitPalette();
84: void PrintTitle();
1.1.1.9 root 85: void ClearPrompt();
1.1.1.13 root 86: int Getc();
1.1.1.12 root 87: void Putc(uint ch);
88: void Print(const std::string& s);
89: void Print(const char *fmt, ...) __printflike(2, 3);
1.1.1.17! root 90: void PrintDisplay(const char *s);
1.1.1.9 root 91:
92: // NVRAM
1.1.1.14 root 93: virtual bool InitNVRAM() = 0;
94: virtual void GetNVRAM(bootinfo_t&) = 0;
1.1.1.9 root 95: uint8 CalcNVRAMCsum() const;
96: void WriteNVRAMCsum();
97: bool VerifyNVRAM() const;
98:
1.1 root 99: uint32 LoadHostFile();
1.1.1.7 root 100: uint32 LoadGuestFile(const bootinfo_t&);
1.1.1.2 root 101:
1.1.1.14 root 102: // 読み込んだプログラムのエントリポイント。
103: // エントリポイントがセットされていない時は -1。
104: uint32 entrypoint {};
105:
106: // エントリポイントに実行を移す時には true。
107: // LUNA-I は 'x' コマンドを実行したら。
108: // LUNA-88K では 'b'/'bh' コマンドで。
109: bool execute {};
110:
1.1.1.17! root 111: // シリアルか。(DIP-SW で決まる)
! 112: bool use_serial {};
! 113:
1.1.1.14 root 114: // 機種名 (タイトル表示用)
115: const char *machine_name {};
116:
1.1 root 117: // エラーメッセージの受け渡し用
118: // 基本的にエラーが起きた時だけ更新するので、ここにエラーメッセージを
119: // 返す可能性がある関数をコールする前に呼び出し側が clear() しておき、
120: // 関数から戻ったら empty() かどうか確認する、errno みたいな使い方。
1.1.1.4 root 121: std::string errmsg {};
1.1 root 122:
123: // 入力バッファ
124: std::string inputbuf {};
125:
1.1.1.7 root 126: // 現在のプロンプト文字列
127: std::string prompt {};
1.1 root 128:
1.1.1.11 root 129: // デフォルトプロンプト。
130: const std::string default_prompt = ">";
131:
1.1.1.9 root 132: // プロンプトのある行(最上行が 0)
133: int prompt_y {};
134:
135: // カーソル位置(入力バッファ先頭が0)
136: int inputpos {};
137:
1.1.1.12 root 138: int screen_w {}; // テキスト桁数
139: int screen_h {}; // テキスト行数
140: int cursor_x {}; // カーソル位置(桁)
141: int cursor_y {}; // カーソル位置(行)
1.1.1.14 root 142: bool cursor_on {}; // カーソル表示
143: bool bold {};
1.1.1.12 root 144: int origin_px {}; // テキスト画面の左上 X 座標(ピクセル)
145: int origin_py {}; // テキスト画面の左上 Y 座標(ピクセル)
146:
1.1.1.13 root 147: BT45xDevice *bt45x {};
1.1.1.15 root 148: LanceDevice *lance {};
1.1.1.13 root 149: LunafbDevice *lunafb {};
150: MainRAMDevice *mainram {};
1.1.1.4 root 151: MK48T02Device *nvram {};
1.1.1.13 root 152: SIODevice *sio {};
153: SPCDevice *spc {};
1.1 root 154:
1.1.1.7 root 155: private:
1.1.1.17! root 156: void ROM_SIOIntr();
! 157: void PutcSerial(uint);
! 158: void PutcDisplay(uint);
! 159: void ProcessSerial();
! 160: int GetcSerial();
! 161: int GetcKeyboard();
1.1.1.7 root 162:
163: bool is_shift {}; // SHIFT キー押し下げ中
164: int mousecnt {}; // マウス入力をスキップするためのカウンタ
165:
1.1.1.17! root 166: FixedQueue<uint8, 256> sio_txq; // シリアル送信キュー
! 167:
1.1.1.14 root 168: uint32 clkcnt {}; // クロック割り込みカウンタ
169:
1.1.1.16 root 170: // luna88k で割り込みからジャンプして戻る時のアドレス。
171: // 0 なら作用しない。
172: uint32 quitstop {};
173:
1.1 root 174: // LUNA キーコード -> ASCII 変換テーブル
175: static const uint8 lunakey2asciitable[128];
176: static const uint8 lunakey2shifttable[128];
177: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.