|
|
nono 0.3.0
//
// nono
// Copyright (C) 2020 nono project
// Licensed under nono-license.txt
//
//
// BT454
//
#pragma once
#include "device.h"
#include "color.h"
struct BT454
{
// パレットは R, G, B の順に格納されている。
// color[0] = パレット0 R
// color[1] = パレット0 G
// color[2] = パレット0 B
// color[3] = パレット1 R
// :
// color[47] = パレット15 B
//
// 色深度は 4ビットで上位4ビットに格納されている。
// 下位4ビットはとりあえず 0。
uint8 color[3 * 16];
// idx は次にアクセスされるべき color[] へのインデックス。
// idx = 0 ならパレット0 の R。
// idx = 4 ならパレット1 の G。
// BT454 では R/G/B をカウントするための 3値 2ビットのカウンタ(?)を
// ADDRa,ADDRb (ADDRa,b) と呼んだりしているようなので、ここではその
// modulo 3 を数えるカウンタを ab と呼ぶことにする。つまり
// idx = 0 はパレット 0、ab 0。
// idx = 4 はパレット 1、ab 1。
int idx;
// ホスト用に変換したパレットデータ。
// ホスト用なので各8ビット、といいつつ元レジスタが上位4ビットのみ有効で
// 下位4ビットは 0 なのでここでは手抜きしてその値をそのまま流用する。
// つまり $f (最も明るい) は 255 ではなく 240。
//
// また 1bpp モードなら R,G,B のうち G だけが使われるので、ここで
// 展開する。パレットのうち実際には #14 と #15 だけが使われるが、
// それについてはレンダラ側で処理している。
// see https://twitter.com/tsutsuii/status/356704682514714625
ColorXBGR hostcolor[16];
};
class BT454Device : public IODevice
{
using inherited = IODevice;
friend LunafbDevice; // Monitor は Lunafb を間借りしている
public:
BT454Device();
virtual ~BT454Device() override;
bool Init() override;
void ResetHard(bool poweron) override;
// ホストパレットのアドレスを取得
const ColorXBGR *GetHostPalette() const { return reg.hostcolor; }
// BusIO インタフェース
// (内蔵 ROM からのアクセス用に特別に public にしてある)
uint64 Write(uint32 offset, uint32 data);
protected:
// BusIO インタフェース
static const uint32 NPORT = 4;
uint64 Read(uint32 offset);
uint64 Peek(uint32 offset);
private:
// レジスタ値からホストパレットを作成
void MakeHostColor(int idx);
BT454 reg {};
int nplane {}; // ビットマップのプレーン数
// ログ出力用
static const char rgbstr[3];
};
extern BT454Device *gBT454;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.