File:  [Isaki's NoNo m68k/m88k emulator] / nono / vm / bt454.h
Revision 1.1.1.8 (vendor branch): download - view: text, annotated - select for diffs
Wed Apr 29 17:05:11 2026 UTC (2 months, 3 weeks ago) by root
Branches: MAIN, Isaki
CVS tags: v016, v015, HEAD
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;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.