|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // Bt454/458
9: //
10:
11: #pragma once
12:
13: #include "device.h"
14: #include "color.h"
15: #include "monitor.h"
16:
17: class Renderer;
18:
19: class BT45xDevice : public IODevice
20: {
21: using inherited = IODevice;
22:
23: public:
24: BT45xDevice();
1.1.1.2 ! root 25: ~BT45xDevice() override;
1.1 root 26:
27: bool Init() override;
28: void ResetHard(bool poweron) override;
29:
1.1.1.2 ! root 30: busdata Read8(uint32 addr) override;
! 31: busdata Write8(uint32 addr, uint32 data) override;
! 32: busdata Peek8(uint32 addr) override;
1.1 root 33:
34: // プレーン数を取得
35: int GetPlaneCount() const { return nplane; }
36:
37: // ホストパレットのアドレスを取得
38: const std::vector<ColorXBGR>& GetHostPalette() const { return hostcolor; }
39:
40: // 生パレットを uint32 形式にしたものを返す (GUI 用)
41: const std::vector<uint32> GetIntPalette() const;
42:
43: // 内部アクセス
44: // (内蔵 ROM からのアクセス用に特別に public にしてある)
45: uint64 Write(uint32 offset, uint32 data);
46:
47: private:
48: // BusIO に似てるが、BusIO ではない。
49: uint64 Read(uint32 offset);
50: uint64 Peek(uint32 offset);
51:
52: // レジスタ値からホストパレットを作成
53: void MakeHostColor(int idx);
54:
55: // 通知
56: void Notify();
57:
58: uint32 ReadAddress();
59: uint32 ReadPalette();
60: uint32 ReadControl();
61: void WriteAddress(uint32 data);
62: void WritePalette(uint32 data);
63: void WriteControl(uint32 data);
64: uint32 PeekControl() const;
65:
66: // Bt458 拡張
67: void WriteRMask(uint32 data);
68: void WriteBMask(uint32 data);
69: void WriteCommand(uint32 data);
70: void WriteTest(uint32 data);
71:
72: uint32 Palette454ToInt(int n) const;
73: uint32 Palette458ToInt(int n) const;
74:
75: DECLARE_MONITOR_CALLBACK(MonitorUpdate454);
76: DECLARE_MONITOR_CALLBACK(MonitorUpdate458);
77:
78: // モデル種別。Bt454 なら true。
79: bool bt454 {};
80:
81: // ビットマップのプレーン数 (1, 4, 8)
82: int nplane {};
83:
84: // パレット数 (16 or 256)
85: int palettes {};
86:
87: // データの下位ニブルマスク。Bt454 なら LOW_NIBBLE。
88: uint8 low_nibble {};
89:
90: // Bt458 拡張
91: uint8 readmask {}; // パレットアドレスマスク
92: uint8 blinkmask {}; // ブリンクマスク
93: uint8 command {}; // コマンド
94: uint8 testreg {}; // テストレジスタ
95:
96: // idx は次にアクセスされるべき color[] へのインデックス。
97: // idx = 0 ならパレット0 の R。
98: // idx = 4 ならパレット1 の G。
99: // Bt454 では R/G/B をカウントするための 3値 2ビットのカウンタ(?)を
100: // ADDRa,ADDRb (ADDRa,b) と呼んだりしているようなので、ここではその
101: // modulo 3 を数えるカウンタを ab と呼ぶことにする。つまり
102: // idx = 0 はパレット 0、ab 0。
103: // idx = 4 はパレット 1、ab 1。
104: int idx;
105:
106: // パレットは R, G, B の順に格納されている。
107: // color[0] = パレット0 R
108: // color[1] = パレット0 G
109: // color[2] = パレット0 B
110: // color[3] = パレット1 R
111: // :
112: // color[47] = パレット15 B
113: //
114: // Bt454 なら 16パレット * 3 = 48エントリ。
115: // 色深度は 4ビットで上位4ビットと下位4ビットに同じものを格納する。
116: // つまり $4 なら $44、$f なら $ff として格納しておく。
117: //
118: // Bt458 なら 256パレット * 3 = 768エントリ。
119: // 色深度は 8ビットでそのまま格納。
120: std::vector<uint8> color;
121:
122: // ホスト用に変換したパレットデータ。
123: // ホスト用なので各8ビット、といいつつ元情報 (color[]) が8ビットすべて
124: // 有効なので値はそのまま流用する。
125: //
126: // また 1bpp モードなら R,G,B のうち G だけが使われるので、ここで
127: // 展開する。パレットのうち実際には #14 と #15 だけが使われるが、
128: // それについてはレンダラ側で処理している。
129: // see https://twitter.com/tsutsuii/status/356704682514714625
130: std::vector<ColorXBGR> hostcolor;
131:
132: Renderer *renderer {};
133:
134: Monitor monitor { this };
135:
136: // ログ出力用
137: static const char rgbstr[3];
138: };
139:
140: static inline BT45xDevice *GetBT45xDevice() {
141: return Object::GetObject<BT45xDevice>(OBJ_BT45x);
142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.