|
|
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:
53: class BT454Device
54: : public IODevice
55: {
1.1.1.3 root 56: using inherited = IODevice;
1.1 root 57: friend BitmapDevice; // Monitor は Bitmap を間借りしている
58:
59: public:
60: BT454Device();
1.1.1.5 root 61: virtual ~BT454Device() override;
1.1 root 62:
1.1.1.3 root 63: bool Init() override;
64: void ResetHard() override;
1.1 root 65:
66: // ホストパレットのアドレスを取得
67: const uint8 *GetHostPalette() const { return reg.hostcolor; }
68:
1.1.1.6 ! root 69: // BusIO インタフェース
! 70: // (内蔵 ROM からのアクセス用に特別に public にしてある)
! 71: uint64 Write(uint32 offset, uint32 data);
! 72:
1.1.1.2 root 73: protected:
74: // BusIO インタフェース
75: static const uint32 NPORT = 4;
1.1.1.6 ! root 76: uint64 Read(uint32 offset);
! 77: uint64 Peek(uint32 offset);
1.1.1.2 root 78:
1.1 root 79: private:
80: // レジスタ値からホストパレットを作成
1.1.1.6 ! root 81: void MakeHostColor(int idx);
1.1 root 82:
83: BT454 reg {};
84:
1.1.1.4 root 85: int nplane {}; // ビットマップのプレーン数
1.1 root 86:
87: // ログ出力用
88: static const char rgbstr[3];
89: };
90:
1.1.1.2 root 91: 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.