--- nono/vm/bt454.h 2026/04/29 17:04:28 1.1 +++ nono/vm/bt454.h 2026/04/29 17:05:11 1.1.1.8 @@ -1,11 +1,17 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// BT454 // #pragma once #include "device.h" +#include "color.h" struct BT454 { @@ -21,18 +27,17 @@ struct BT454 // 下位4ビットはとりあえず 0。 uint8 color[3 * 16]; - // addr は次にアクセスされるべき color[] へのインデックス。 - // addr = 0 ならパレット0 の R。 - // addr = 4 ならパレット1 の G。 - int addr; - - // ホスト用に変換したパレットデータ。レンダラ側から参照するもので - // 4バイトになるようパディングしておく。 - // [0] パレット0 R - // [1] パレット0 G - // [2] パレット0 B - // [3] padding - // : + // 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。 @@ -41,40 +46,41 @@ struct BT454 // 展開する。パレットのうち実際には #14 と #15 だけが使われるが、 // それについてはレンダラ側で処理している。 // see https://twitter.com/tsutsuii/status/356704682514714625 - uint8 hostcolor[4 * 16]; + ColorXBGR hostcolor[16]; }; -class BT454Device - : public IODevice +class BT454Device : public IODevice { - typedef IODevice inherited; - friend BitmapDevice; // Monitor は Bitmap を間借りしている + using inherited = IODevice; + friend LunafbDevice; // Monitor は Lunafb を間借りしている public: BT454Device(); - virtual ~BT454Device(); - virtual bool Init(); - - virtual void ResetHard(); + virtual ~BT454Device() override; - virtual uint64 Read8(uint32 addr); - virtual uint64 Read16(uint32 addr); - virtual uint64 Read32(uint32 addr); - virtual uint64 Write8(uint32 addr, uint32 data); - virtual uint64 Write16(uint32 addr, uint32 data); - virtual uint64 Write32(uint32 addr, uint32 data); - virtual uint64 Peek8(uint32 addr); + bool Init() override; + void ResetHard(bool poweron) override; // ホストパレットのアドレスを取得 - const uint8 *GetHostPalette() const { return reg.hostcolor; } + 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 addr); + void MakeHostColor(int idx); BT454 reg {}; - int nplane = 0; // ビットマップのプレーン数 + int nplane {}; // ビットマップのプレーン数 // ログ出力用 static const char rgbstr[3];