|
|
1.1 root 1: //
2: // nono
1.1.1.3 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #pragma once
8:
9: #include "device.h"
10:
11: struct BT454
12: {
13: // パレットは R, G, B の順に格納されている。
14: // color[0] = パレット0 R
15: // color[1] = パレット0 G
16: // color[2] = パレット0 B
17: // color[3] = パレット1 R
18: // :
19: // color[47] = パレット15 B
20: //
21: // 色深度は 4ビットで上位4ビットに格納されている。
22: // 下位4ビットはとりあえず 0。
23: uint8 color[3 * 16];
24:
1.1.1.6 root 25: // idx は次にアクセスされるべき color[] へのインデックス。
26: // idx = 0 ならパレット0 の R。
27: // idx = 4 ならパレット1 の G。
28: // BT454 では R/G/B をカウントするための 3値 2ビットのカウンタ(?)を
29: // ADDRa,ADDRb (ADDRa,b) と呼んだりしているようなので、ここではその
30: // modulo 3 を数えるカウンタを ab と呼ぶことにする。つまり
31: // idx = 0 はパレット 0、ab 0。
32: // idx = 4 はパレット 1、ab 1。
33: int idx;
1.1 root 34:
35: // ホスト用に変換したパレットデータ。レンダラ側から参照するもので
36: // 4バイトになるようパディングしておく。
37: // [0] パレット0 R
38: // [1] パレット0 G
39: // [2] パレット0 B
40: // [3] padding
41: // :
42: // ホスト用なので各8ビット、といいつつ元レジスタが上位4ビットのみ有効で
43: // 下位4ビットは 0 なのでここでは手抜きしてその値をそのまま流用する。
44: // つまり $f (最も明るい) は 255 ではなく 240。
45: //
46: // また 1bpp モードなら R,G,B のうち G だけが使われるので、ここで
47: // 展開する。パレットのうち実際には #14 と #15 だけが使われるが、
48: // それについてはレンダラ側で処理している。
49: // see https://twitter.com/tsutsuii/status/356704682514714625
50: uint8 hostcolor[4 * 16];
51: };
52:
1.1.1.7 ! root 53: class BT454Device : public IODevice
1.1 root 54: {
1.1.1.3 root 55: using inherited = IODevice;
1.1.1.7 ! root 56: friend LunafbDevice; // Monitor は Lunafb を間借りしている
1.1 root 57:
58: public:
59: BT454Device();
1.1.1.5 root 60: virtual ~BT454Device() override;
1.1 root 61:
1.1.1.3 root 62: bool Init() override;
63: void ResetHard() override;
1.1 root 64:
65: // ホストパレットのアドレスを取得
66: const uint8 *GetHostPalette() const { return reg.hostcolor; }
67:
1.1.1.6 root 68: // BusIO インタフェース
69: // (内蔵 ROM からのアクセス用に特別に public にしてある)
70: uint64 Write(uint32 offset, uint32 data);
71:
1.1.1.2 root 72: protected:
73: // BusIO インタフェース
74: static const uint32 NPORT = 4;
1.1.1.6 root 75: uint64 Read(uint32 offset);
76: uint64 Peek(uint32 offset);
1.1.1.2 root 77:
1.1 root 78: private:
79: // レジスタ値からホストパレットを作成
1.1.1.6 root 80: void MakeHostColor(int idx);
1.1 root 81:
82: BT454 reg {};
83:
1.1.1.4 root 84: int nplane {}; // ビットマップのプレーン数
1.1 root 85:
86: // ログ出力用
87: static const char rgbstr[3];
88: };
89:
1.1.1.2 root 90: extern std::unique_ptr<BT454Device> gBT454;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.