--- nono/vm/bt45x.cpp 2026/04/29 17:05:17 1.1 +++ nono/vm/bt45x.cpp 2026/04/29 17:05:50 1.1.1.7 @@ -15,12 +15,12 @@ // LUNA-I、LUNA-88K どちらでも (というかここはビデオボードなので本体関係なく) // Bt454 ならバイトポートが連続配置 (BusIO_B 相当)、 // Bt458 ならバイトポートがロングワード配置 (たぶん BusIO_BFFF 相当、未確認) -// となっているようだ。このため、ここでは BusIO を使わず自力でデコードする。 +// となっているようだ。(mainbus_luna 参照) // // ソフトウェアから判別は以下の要領で行える。 -// 先頭の1バイトは 1or4bpp ボード(連続配置)、8bpp ボード(ロングワード配置)の +// 先頭の1バイトは 1/4bpp ボード(連続配置)、8bpp ボード(ロングワード配置)の // どちらでもアドレスレジスタなので、ここに $00 を書き込んでから読み返す。 -// $0f が読み出せたら Bt454 なので 1or4bpp ボード、$00 が読み出せたら Bt458 +// $0f が読み出せたら Bt454 なので 1/4bpp ボード、$00 が読み出せたら Bt458 // なので 8bpp ボードと分かる。Bt458 のデータバスは8ビットクリーンだが、 // Bt454 のデータバスは4ビットしかなく下位ニブルは常に $f になるため。 // @@ -28,22 +28,22 @@ #include "bt45x.h" #include "config.h" +#include "lunafb.h" #include "mainapp.h" -#include "mpu.h" -#include "planevram.h" +#include "monitor.h" #include "prom.h" -#include "renderer.h" #include "uimessage.h" -// Bt454 の下位ニブル用マスク -#define LOW_NIBBLE (0x0f) +// +// Bt454/458 共通部分 +// // コンストラクタ BT45xDevice::BT45xDevice() : inherited(OBJ_BT45x) { - // func, size は Init() で決まる - monitor.Regist(ID_MONITOR_BT45x); + // func, size は継承先で決まる + monitor = gMonitorManager->Regist(ID_MONITOR_BT45x, this); } // デストラクタ @@ -51,63 +51,44 @@ BT45xDevice::~BT45xDevice() { } -// 初期化 -bool -BT45xDevice::Init() +// 設定からプレーン数を取得する。 +// 値が不正ならエラーメッセージを表示して -1 を返す。 +// (mainbus_luna から呼ばれる) +/*static*/ int +BT45xDevice::GetConfigPlaneCount() { - if (inherited::Init() == false) { - return false; - } - - renderer = GetRenderer(); + int n; - // 設定からプレーン数を取得 const ConfigItem& item = gConfig->Find("luna-video-plane"); - if (item.TryInt(&nplane) == false) { + if (item.TryInt(&n) == false) { item.Err(); - return false; + return -1; } - if (nplane != 1 && nplane != 4 && nplane != 8) { + if (n != 1 && n != 4 && n != 8) { item.Err("Must be 1, 4, or 8"); - return false; + return -1; } - // それによってモデル分け。1bpp/4bpp なら Bt454、8bpp なら Bt458。 - if (nplane <= 4) { - bt454 = true; - palettes = 16; - low_nibble = LOW_NIBBLE; - readmask = 0x0f; + return n; +} - monitor.func = ToMonitorCallback(&BT45xDevice::MonitorUpdate454); - monitor.SetSize(63, 3); - } else { - bt454 = false; - palettes = 256; - low_nibble = 0; - // 初期化されないそうなのでゴミを入れておく - readmask = 0xcc; - - monitor.func = ToMonitorCallback(&BT45xDevice::MonitorUpdate458); - monitor.SetSize(116, 18); - - // LUNA-I の PROM v4.22 は 8bpp ボードをサポートしておらず PROM の - // 画面は真っ暗のままになる。その後 OS が再初期化すれば使えるようには - // なるが、PROM が映らずびっくりするのでメッセージだけ表示して、 - // 実行は継続する。他の ROM バージョンは未調査。 - auto prom = dynamic_cast(GetPROMDevice()); - if (gMainApp.IsLUNA1() && prom != NULL) { - int ver = prom->GetROMVer(); - if (ver <= 422) { - warnx("Warning: PROM v%d.%02d does not support 8bpp board.", - ver / 100, ver % 100); - // 実行は継続 - } - } - } +// 初期化 +bool +BT45xDevice::Init() +{ + int n = GetConfigPlaneCount(); + // ここに来ているということはエラーは起きなかったはず。 + assert(n >= 0); + nplane = n; + + lunafb = GetLunafbDevice(); + uimessage = gMainApp.GetUIMessage(); + // 継承先のコンストラクタでセットしている。 + assert(palettes != 0); color.resize(palettes * 3); hostcolor.resize(palettes); + return true; } @@ -121,84 +102,35 @@ BT45xDevice::ResetHard(bool poweron) // XXX Bt45x のレジスタの初期値は不明なのでとりあえず全部黒にしておく memset(&color[0], 0, color.size()); - for (int i = 0; i < countof(color); i++) { + for (int i = 0; i < color.size(); i++) { MakeHostColor(i); } Notify(); } -/* static */ const char -BT45xDevice::rgbstr[3] = { 'R', 'G', 'B' }; - -// LUNA のビデオボードは Bt454 か Bt458 かでバイト配置が異なるようだ。 - -uint64 -BT45xDevice::Read8(uint32 addr) -{ - if (bt454) { - // バイトポートが連続、4バイトでミラー - return Read(addr & 3); - } else { - // バイトポートがロングワード配置、隙間は何が見えるか不明、 - // たぶん16バイトでミラー。 - addr &= 15; - if (addr % 4 == 0) { - return Read(addr / 4); - } else { - return 0xff; - } - } -} - -uint64 -BT45xDevice::Write8(uint32 addr, uint32 data) -{ - if (bt454) { - // バイトポートが連続、4バイトでミラー - return Write(addr & 3, data); - } else { - // バイトポートがロングワード配置、隙間は何が見えるか不明、 - // たぶん16バイトでミラー。 - addr &= 15; - if (addr % 4 == 0) { - return Write(addr / 4, data); - } else { - return 0; - } - } -} - -uint64 -BT45xDevice::Peek8(uint32 addr) -{ - if (bt454) { - // バイトポートが連続、4バイトでミラー - return Peek(addr & 3); - } else { - // バイトポートがロングワード配置、隙間は何が見えるか不明、 - // たぶん16バイトでミラー。 - addr &= 15; - if (addr % 4 == 0) { - return Peek(addr / 4); - } else { - return 0xff; - } - } -} - -// こっちがマッピング非依存のバイトポートアクセス -uint64 -BT45xDevice::Read(uint32 offset) +busdata +BT45xDevice::ReadPort(uint32 offset) { - uint32 data; + busdata data; switch (offset) { case 0: // アドレスレジスタ - data = ReadAddress(); + data = PeekAddress(); + // アドレスレジスタアクセスで ab カウンタは 0 にリセットされる + idx = (idx / 3) * 3; + + putlog(2, "Address Register -> $%02x", data.Data()); break; case 1: // カラーパレットレジスタ - data = ReadPalette(); + data = PeekPalette(); + putlog(2, "Color Palette $%x(%c) -> $%02x", + idx / 3, rgbstr[idx % 3], data.Data()); + // アクセスするたびにインクリメントする。 + idx++; + if (idx >= color.size()) { + idx = 0; + } break; case 2: // Bt454 ならリセット(?)、Bt458 なら各種制御レジスタ @@ -211,18 +143,16 @@ BT45xDevice::Read(uint32 offset) break; default: - VMPANIC("corrupted offset=%d", offset); + VMPANIC("corrupted offset=%u", offset); } + data |= BusData::Size1; return data; } -// こっちがマッピング非依存のバイトポートアクセス -uint64 -BT45xDevice::Write(uint32 offset, uint32 data) +busdata +BT45xDevice::WritePort(uint32 offset, uint32 data) { - // Bt454 なら書き込みデータのうち有効なのは上位ニブルだけ - switch (offset) { case 0: // アドレスレジスタ WriteAddress(data); @@ -241,96 +171,138 @@ BT45xDevice::Write(uint32 offset, uint32 break; default: - VMPANIC("corrupted offset=%d", offset); + VMPANIC("corrupted offset=%u", offset); } - return 0; + + busdata r = BusData::Size1; + return r; } -// こっちがマッピング非依存のバイトポートアクセス -uint64 -BT45xDevice::Peek(uint32 offset) +busdata +BT45xDevice::PeekPort(uint32 offset) { - uint8 data; - switch (offset) { case 0: // アドレスレジスタ - data = idx / 3; - data &= readmask; - break; + return PeekAddress(); case 1: // カラーパレットレジスタ - // 今読み出そうとしたら読み出せるやつ - data = color[idx]; - break; + return PeekPalette(); case 2: // Bt454 ならリセット(?)、Bt458 なら各種制御レジスタ - data = PeekControl(); - break; + return PeekControl(); case 3: // 未実装 - data = 0xff; - break; + return 0xff; default: - data = 0xff; - break; + return 0xff; } +} + +bool +BT45xDevice::PokePort(uint32 offset, uint32 data) +{ + return false; +} + +// アドレスレジスタ読み出しのうち副作用のない部分。 +uint32 +BT45xDevice::PeekAddress() const +{ + uint32 data; + + // 今からアクセスするパレット番号を返す。 + data = idx / 3; if (bt454) { - data = (data << 4) | LOW_NIBBLE; + data = (data << 4) | low_nibble; + } else { + // Bt458 ならこれをマスクする? + data &= readmask; } return data; } -// Bt454 -void -BT45xDevice::MonitorUpdate454(Monitor *, TextScreen& screen) +// パレットレジスタ読み出しのうち副作用のない部分。 +uint32 +BT45xDevice::PeekPalette() const { - screen.Clear(); - screen.Puts(0, 0, "Model: Bt454"); - - // 01234567 - // $0 $1 - // RGB RGB + // Bt454 の場合 color[] の上位下位4ビットは同じ値にしてある。 + return color[idx] | low_nibble; +} - for (int i = 0; i < 16; i++) { - screen.Print(i * 4, 1, "$%x", i); - screen.Puts(i * 4, 2, strhex(Palette454ToInt(i), 3).c_str()); +// アドレスレジスタ書き込み。 +void +BT45xDevice::WriteAddress(uint32 data) +{ + // 今からアクセスするパレット番号。 + // アドレスレジスタアクセスで ab カウンタは 0 にリセットされる。 + // data はパレット番号だが idx は配列のインデックスなので 3倍。 + putlog(2, "Address Register <- $%02x", data); + if (bt454) { + data >>= 4; } + idx = data * 3; } -// Bt458 +// パレットレジスタ書き込み。 void -BT45xDevice::MonitorUpdate458(Monitor *, TextScreen& screen) +BT45xDevice::WritePalette(uint32 data) { - screen.Clear(); - screen.Puts(0, 0, "Model: Bt458"); - - // 012345678901 - // +$0 +$1 - // $00: RRGGBB RRGGBB - - for (int i = 0; i < 16; i++) { - screen.Print(5 + i * 7, 1, "+$%x", i); + // Bt454 なら上位下位4ビットに同じ値を置くことで 0 .. 255 にする。 + if (bt454) { + data = (data & 0xf0) | ((data >> 4) & 0x0f); } - int c = 0; - for (int y = 0; y < 16; y++) { - screen.Print(0, y + 2, "$%02x:", y * 16); - for (int x = 0; x < 16; x++) { - screen.Print(5 + x * 7, y + 2, "%06x", Palette458ToInt(c)); - c++; + color[idx] = data; + + if (loglevel == 1) { + // ログレベル1なら RGB が書き込まれた時点で表示。 + // 大体はこれくらいの表示で構わないはず。 + if (idx % 3 == 2) { + if (bt454) { + putlogn("Color Palette $%x = (%x,%x,%x)", + idx / 3, + color[idx - 2] >> 4, + color[idx - 1] >> 4, + color[idx ] >> 4); + } else { + putlogn("Color Palette $%02x = (%02x,%02x,%02x)", + idx / 3, + color[idx - 2], + color[idx - 1], + color[idx ]); + } + } + } else if (loglevel >= 2) { + if (bt454) { + putlogn("Color Palette $%x(%c) <- $%02x", + idx / 3, rgbstr[idx % 3], data); + } else { + putlogn("Color Palette $%02x(%c) <- $%02x", + idx / 3, rgbstr[idx % 3], data); } } + + // ホストカラーを計算。 + // (Bt458 では?) Blue を書き込んだところで色情報がストアされるっぽい? + MakeHostColor(idx); + Notify(); + + // ホストカラー計算後にインクリメントする。 + idx++; + if (idx >= color.size()) { + idx = 0; + } } // idx 番目のレジスタ値からホストパレットを作成。 void -BT45xDevice::MakeHostColor(int idx_) +BT45xDevice::MakeHostColor(uint idx_) { assert(idx_ < color.size()); - int col = idx_ / 3; - int ab = idx_ % 3; + uint col = idx_ / 3; + uint ab = idx_ % 3; if (nplane == 1) { // 1bpp (モノクロプレーン) なら R,G,B のうち G の値だけを使用 @@ -352,7 +324,7 @@ BT45xDevice::MakeHostColor(int idx_) hostcolor[col].b = color[col * 3 + ab]; break; default: - VMPANIC("corrupted ab=%d", ab); + VMPANIC("corrupted ab=%u", ab); } } @@ -364,89 +336,188 @@ void BT45xDevice::Notify() { // パレット変更が起きたことをレンダラに通知 - renderer->Invalidate2(); + lunafb->Invalidate2(); // UI にも通知 - UIMessage::Post(UIMessage::PALETTE); + uimessage->Post(UIMessage::PALETTE); } -// アドレスレジスタ読み込み。 -uint32 -BT45xDevice::ReadAddress() +/*static*/ const char +BT45xDevice::rgbstr[3] = { 'R', 'G', 'B' }; + + +// +// Bt454 +// + +// コンストラクタ +BT454Device::BT454Device() + : inherited() { - uint32 data; + SetName("Bt454"); + bt454 = true; + palettes = 16; + low_nibble = LOW_NIBBLE; + // 使わないけど一応 + readmask = 0x0f; - // 今の(今からアクセスする)パレット番号を返す。 - data = idx / 3; - // Bt458 ならこれをマスクする? - data &= readmask; - if (bt454) { - data = (data << 4) | LOW_NIBBLE; + monitor->func = ToMonitorCallback(&BT454Device::MonitorUpdate); + monitor->SetSize(63, 3); +} + +// デストラクタ +BT454Device::~BT454Device() +{ +} + +void +BT454Device::MonitorUpdate(Monitor *, TextScreen& screen) +{ + screen.Clear(); + screen.Puts(0, 0, "Model: Bt454"); + + // 01234567 + // $0 $1 + // RGB RGB + + for (int i = 0; i < 16; i++) { + screen.Print(i * 4, 1, "$%x", i); + screen.Puts(i * 4, 2, strhex(PaletteToInt(i), 3).c_str()); } - putlog(2, "Address Register -> $%02x", data); +} - // アドレスレジスタアクセスで ab カウンタは 0 にリセットされる +// 制御レジスタの読み出し。(Bt454 ではリセット) +uint32 +BT454Device::ReadControl() +{ + // ADDRa,b を 0 にする? D0-D3 は 0 になる?? + // データシートが雑でよく分からん… idx = (idx / 3) * 3; + putlog(2, "reset ab"); + return PeekControl(); +} - return data; +// 制御レジスタへの書き込み。(Bt454 ではリセット) +void +BT454Device::WriteControl(uint32 data) +{ + // ab カウンタを 0 にする? + // データは無視されるようだ + idx = (idx / 3) * 3; + putlog(2, "reset ab"); } -// パレットレジスタ読み込み。 uint32 -BT45xDevice::ReadPalette() +BT454Device::PeekControl() const { - uint32 data; + return 0x00 | LOW_NIBBLE; +} - // Bt454 の場合 color[] の上位下位4ビットは同じ値にしてある - data = color[idx] | low_nibble; - putlog(2, "Color Palette $%x(%c) -> $%02x", - idx / 3, rgbstr[idx % 3], data); +// パレット n の色を uint32 表現したものを返す。 +uint32 +BT454Device::PaletteToInt(uint n) const +{ + return ((color[n * 3 + 0] & 0x0f) << 8) | + ((color[n * 3 + 1] & 0x0f) << 4) | + ((color[n * 3 + 2] & 0x0f) ); +} - // アクセスするたびにインクリメントする。 - idx++; - if (idx >= color.size()) { - idx = 0; + +// +// Bt458 +// + +// コンストラクタ +BT458Device::BT458Device() + : inherited() +{ + SetName("Bt458"); + bt454 = false; + palettes = 256; + low_nibble = 0; + // 初期化されないそうなのでゴミを入れておく + readmask = 0xcc; + + monitor->func = ToMonitorCallback(&BT458Device::MonitorUpdate); + monitor->SetSize(116, 18); +} + +// デストラクタ +BT458Device::~BT458Device() +{ +} + +// 初期化 +bool +BT458Device::Init() +{ + if (inherited::Init() == false) { + return false; } - return data; + // LUNA-I の PROM v4.22 は 8bpp ボードをサポートしておらず PROM の + // 画面は真っ暗のままになる。その後 OS が再初期化すれば使えるようには + // なるが、PROM が映らずびっくりするのでメッセージだけ表示して、 + // 実行は継続する。他の ROM バージョンは未調査。 + auto prom = dynamic_cast(GetPROMDevice()); + if (gMainApp.IsLUNA1() && prom != NULL) { + uint ver = prom->GetROMVer(); + if (ver <= 422) { + warnx("Warning: PROM v%u.%02u does not support 8bpp board.", + ver / 100, ver % 100); + // 実行は継続 + } + } + + return true; +} + +void +BT458Device::MonitorUpdate(Monitor *, TextScreen& screen) +{ + screen.Clear(); + screen.Puts(0, 0, "Model: Bt458"); + + // 012345678901 + // +$0 +$1 + // $00: RRGGBB RRGGBB + + for (int i = 0; i < 16; i++) { + screen.Print(5 + i * 7, 1, "+$%x", i); + } + int c = 0; + for (int y = 0; y < 16; y++) { + screen.Print(0, y + 2, "$%02x:", y * 16); + for (int x = 0; x < 16; x++) { + screen.Print(5 + x * 7, y + 2, "%06x", PaletteToInt(c)); + c++; + } + } } -// Bt454 ならリセット(?)、 -// Bt458 なら各種制御レジスタの読み込み。 +// 各種制御レジスタの読み出し。 uint32 -BT45xDevice::ReadControl() +BT458Device::ReadControl() { - uint32 data; + uint32 data = PeekControl(); - if (bt454) { - // ADDRa,b を 0 にする? D0-D3 は 0 になる?? - // データシートが雑でよく分からん… - idx = (idx / 3) * 3; - data = 0x00 | LOW_NIBBLE; - putlog(2, "reset ab"); - } else { - // Bt458 なら、この時点のアドレスによってコマンド処理 + if (__predict_false(loglevel >= 2)) { uint addr = idx / 3; switch (addr) { case 0x04: - data = readmask; putlog(2, "Read ReadMask -> $%02x", data); break; case 0x05: - data = blinkmask; putlog(2, "Read BlinkMask -> $%02x", data); break; case 0x06: - data = command; putlog(2, "Read Command -> $%02x", data); break; case 0x07: - data = testreg; putlog(2, "Read Test -> $%02x", data); break; default: - data = 0; - putlog(0, "Read $%02x (NOT IMPLEMENTED)", addr); + putlog(0, "Read Control $%02x (NOT IMPLEMENTED)", addr); break; } } @@ -454,105 +525,53 @@ BT45xDevice::ReadControl() return data; } -// アドレスレジスタ書き込み。 -void -BT45xDevice::WriteAddress(uint32 data) -{ - // 今からアクセスするパレット番号。 - // アドレスレジスタアクセスで ab カウンタは 0 にリセットされる。 - // data はパレット番号だが idx は配列のインデックスなので 3倍。 - putlog(2, "Address Register <- $%02x", data); - if (bt454) { - data >>= 4; - } - idx = data * 3; -} - -// パレットレジスタ書き込み。 -void -BT45xDevice::WritePalette(uint32 data) +uint32 +BT458Device::PeekControl() const { - // Bt454 なら上位下位4ビットに同じ値を置くことで 0 .. 255 にする。 - if (bt454) { - data = (data & 0xf0) | ((data >> 4) & 0x0f); - } - color[idx] = data; - - if (loglevel == 1) { - // ログレベル1なら RGB が書き込まれた時点で表示。 - // 大体はこれくらいの表示で構わないはず。 - if (idx % 3 == 2) { - if (bt454) { - putlogn("Color Palette $%x = (%x,%x,%x)", - idx / 3, - color[idx - 2] >> 4, - color[idx - 1] >> 4, - color[idx ] >> 4); - } else { - putlogn("Color Palette $%02x = (%02x,%02x,%02x)", - idx / 3, - color[idx - 2], - color[idx - 1], - color[idx ]); - } - } - } else if (loglevel >= 2) { - if (bt454) { - putlogn("Color Palette $%x(%c) <- $%02x", - idx / 3, rgbstr[idx % 3], data); - } else { - putlogn("Color Palette $%02x(%c) <- $%02x", - idx / 3, rgbstr[idx % 3], data); - } - } - - // ホストカラーを計算。 - // (Bt458 では?) Blue を書き込んだところで色情報がストアされるっぽい? - MakeHostColor(idx); - Notify(); - - // ホストカラー計算後にインクリメントする。 - idx++; - if (idx >= color.size()) { - idx = 0; + uint addr = idx / 3; + switch (addr) { + case 0x04: + return readmask; + case 0x05: + return blinkmask; + case 0x06: + return command; + case 0x07: + return testreg; + default: + // XXX ? + return 0; } } -// Bt454 ならリセット(?)、 -// Bt458 なら各種制御レジスタへの書き込み。 +// 各種制御レジスタへの書き込み。 void -BT45xDevice::WriteControl(uint32 data) +BT458Device::WriteControl(uint32 data) { - if (bt454) { - // ab カウンタを 0 にする? データは無視されるようだ - idx = (idx / 3) * 3; - putlog(2, "reset ab"); - } else { - // Bt458 なら、この時点のアドレスによってコマンド処理。 - uint addr = idx / 3; - switch (addr) { - case 0x04: - WriteRMask(data); - break; - case 0x05: - WriteBMask(data); - break; - case 0x06: - WriteCommand(data); - break; - case 0x07: - WriteTest(data); - break; - default: - putlog(1, "Unknown command $%02x <- $%02x", addr, data); - break; - } + // この時点のアドレスによってコマンド処理。 + uint addr = idx / 3; + switch (addr) { + case 0x04: + WriteRMask(data); + break; + case 0x05: + WriteBMask(data); + break; + case 0x06: + WriteCommand(data); + break; + case 0x07: + WriteTest(data); + break; + default: + putlog(1, "Unknown command $%02x <- $%02x", addr, data); + break; } } // Bt458 Read Mask の書き込み。 void -BT45xDevice::WriteRMask(uint32 data) +BT458Device::WriteRMask(uint32 data) { readmask = data; putlog(1, "Write ReadMask <- $%02x", readmask); @@ -560,7 +579,7 @@ BT45xDevice::WriteRMask(uint32 data) // Bt458 Blink Mask の書き込み。 void -BT45xDevice::WriteBMask(uint32 data) +BT458Device::WriteBMask(uint32 data) { // 未実装 blinkmask = data; @@ -573,7 +592,7 @@ BT45xDevice::WriteBMask(uint32 data) // Bt458 コマンドレジスタへの書き込み。 void -BT45xDevice::WriteCommand(uint32 data) +BT458Device::WriteCommand(uint32 data) { command = data; putlog(1, "Write Command <- $%02x", command); @@ -593,9 +612,9 @@ BT45xDevice::WriteCommand(uint32 data) } } -// テストレジスタへの書き込み。 +// Bt458 テストレジスタへの書き込み。 void -BT45xDevice::WriteTest(uint32 data) +BT458Device::WriteTest(uint32 data) { // 未実装 testreg = data; @@ -607,62 +626,9 @@ BT45xDevice::WriteTest(uint32 data) } } -// 制御レジスタを読み出す。(Peek() 用) -uint32 -BT45xDevice::PeekControl() const -{ - if (bt454) { - return 0x00; - } else { - uint addr = idx / 3; - switch (addr) { - case 0x04: - return readmask; - case 0x05: - return blinkmask; - case 0x06: - return command; - case 0x07: - return testreg; - default: - // XXX ? - return 0; - } - } -} - -// ゲストパレットを uint32 形式にしたものの一覧を返す。(GUI 用) -const std::vector -BT45xDevice::GetIntPalette() const -{ - std::vector ipal; - - if (bt454) { - for (int i = 0; i < palettes; i++) { - ipal.push_back(Palette454ToInt(i)); - } - } else { - for (int i = 0; i < palettes; i++) { - ipal.push_back(Palette458ToInt(i)); - } - } - return ipal; -} - -// Bt454 のパレット番号 n の生データを uint32 で返す。 -// Bt454 の場合は RGB 各4ビットを右詰め。$0000'0RGB。 -uint32 -BT45xDevice::Palette454ToInt(int n) const -{ - return ((color[n * 3 + 0] & 0xf0) << 4) | - ((color[n * 3 + 1] & 0xf0) ) | - ((color[n * 3 + 2] & 0x0f) ); -} - -// Bt458 のパレット番号 n の生データを uint32 で返す。 -// Bt458 の場合は RGB 各8ビットを右詰め。$00RR'GGBB。 +// パレット n の色を uint32 表現したものを返す。 uint32 -BT45xDevice::Palette458ToInt(int n) const +BT458Device::PaletteToInt(uint n) const { return (color[n * 3 + 0] << 16) | (color[n * 3 + 1] << 8) |