--- nono/vm/bt454.cpp 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/bt454.cpp 2026/04/29 17:04:35 1.1.1.3 @@ -1,20 +1,21 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "bt454.h" #include "bitmap.h" +#include "mpu.h" -// XXX 仕様書には $c100_0000 と書いてあるが、PROM も NetBSD カーネルも -// $c110_0000 にアクセスしているので、とりあえず $c110_0000 にしておく -// というか $10_0000 で折り返して見せることにしておく。 -// 実機調査すること。 +// 仕様書には $c100_0000 と書いてあるが、PROM も NetBSD カーネルも +// $c110_0000 にアクセスしている。実際には 4バイトごとにミラーが見えて +// いるので問題はない。 -// 下位ニブルのパターンは不明。とりあえず +// 下位ニブルは 0x0f が読めるようだ #define LOW_NIBBLE (0x0f) -BT454Device *gBT454; +std::unique_ptr gBT454; BT454Device::BT454Device() { @@ -44,12 +45,11 @@ BT454Device::ResetHard() BT454Device::rgbstr[3] = { 'R', 'G', 'B' }; uint64 -BT454Device::Read8(uint32 addr) +BT454Device::Read(uint32 addr) { - uint32 an = (addr - devaddr) & 0x000fffff; uint32 data; - switch (an) { + switch (addr) { case 0: // アドレスレジスタ // 今の(今からアクセスする)パレット番号 data = reg.addr / 3; @@ -70,37 +70,25 @@ BT454Device::Read8(uint32 addr) } break; - default: - putlog(0, "未実装バイト読み込み $%08x", addr); + case 2: + case 3: + putlog(0, "未実装バイト読み込み $%08x", gMPU->GetPaddr()); data = 0xff; break; + + default: + __unreachable(); } return data; } uint64 -BT454Device::Read16(uint32 addr) -{ - putlog(0, "未実装ワード読み込み $%08x", addr); - return 0xffff; -} - -uint64 -BT454Device::Read32(uint32 addr) +BT454Device::Write(uint32 addr, uint32 data) { - putlog(0, "未実装ロング読み込み $%08x", addr); - return 0xffffffff; -} - -uint64 -BT454Device::Write8(uint32 addr, uint32 data) -{ - uint32 an = (addr - devaddr) & 0x000fffff; - // 書き込みデータのうち有効なのは上位ニブルだけ - switch (an) { + switch (addr) { case 0: // アドレスレジスタ // 今からアクセスするパレット番号 // data はパレット番号だが reg.addr は配列のインデックスなので 3倍。 @@ -136,33 +124,21 @@ BT454Device::Write8(uint32 addr, uint32 } break; - default: - putlog(0, "未実装バイト書き込み $%08x <- %02x", addr, data); + case 2: + case 3: + putlog(0, "未実装バイト書き込み $%08x <- %02x", gMPU->GetPaddr(), data); break; - } - return 0; -} -uint64 -BT454Device::Write16(uint32 addr, uint32 data) -{ - putlog(0, "未実装ワード書き込み $%08x <- %04x", addr, data); - return 0; -} - -uint64 -BT454Device::Write32(uint32 addr, uint32 data) -{ - putlog(0, "未実装ロング書き込み $%08x <- %08x", addr, data); + default: + __unreachable(); + } return 0; } uint64 -BT454Device::Peek8(uint32 addr) +BT454Device::Peek(uint32 addr) { - uint32 an = (addr - devaddr) & 0x000fffff; - - switch (an) { + switch (addr) { case 0: // アドレスレジスタ // XXX 下位ニブルは? return ((reg.addr / 3) << 4) | LOW_NIBBLE; @@ -171,8 +147,13 @@ BT454Device::Peek8(uint32 addr) // 今読み出そうとしたら読み出せるやつ return reg.color[reg.addr] | LOW_NIBBLE; - default: + case 2: + case 3: + // 未実装 return 0xff; + + default: + __unreachable(); } }