--- nono/vm/lunafb.cpp 2026/04/29 17:05:10 1.1.1.2 +++ nono/vm/lunafb.cpp 2026/04/29 17:05:14 1.1.1.3 @@ -39,7 +39,7 @@ #include "lunafb.h" #include "bt454.h" -#include "cgrom.h" +#include "builtinrom.h" #include "config.h" #include "mpu.h" @@ -82,6 +82,7 @@ LunafbDevice::Init() } plane_end = plane0base + 0x40000 * nplane; + fcset_end = fcset0base + 0x40000 * nplane; // プレーン数によってメモリを確保 mem.reset(new uint8 [0x40000 * nplane]); @@ -128,8 +129,8 @@ LunafbDevice::Read8(uint32 addr) // プレーンの読み出し return mem[HLB(addr - plane0base)]; } - // 残りは書き込み専用 - putlog(1, "%s: 未接続アドレス $%08x", __func__, addr); + // 残りは書き込み専用または不在 + putlog(1, "Read not-readable $%08x.B", addr); return 0xff; } @@ -143,8 +144,8 @@ LunafbDevice::Read16(uint32 addr) // プレーンの読み出し return *(uint16 *)&mem[HLW(addr - plane0base)]; } - // 残りは書き込み専用 - putlog(1, "%s: 未接続アドレス $%08x", __func__, addr); + // 残りは書き込み専用または不在 + putlog(1, "Read not-readable $%08x.W", addr); return 0xffff; } @@ -158,8 +159,8 @@ LunafbDevice::Read32(uint32 addr) // プレーンの読み出し return *(uint32 *)&mem[addr - plane0base]; } - // 残りは書き込み専用 - putlog(1, "%s: 未接続アドレス $%08x", __func__, addr); + // 残りは書き込み専用または不在 + putlog(1, "Read not-readable $%08x.L", addr); return 0xffffffff; } @@ -182,12 +183,13 @@ LunafbDevice::Write8(uint32 addr, uint32 case 0xb1040002: case 0xb1040003: // BMSEL はバイトアクセスできる? - putlog(0, "未実装バイト書き込み $%08x <- $%02x", addr, data); + putlog(0, "BMSEL $%08x <- $%02x (NOT IMPLEMENTED)", addr, data); return 0; } if (addr < 0xb1080000) { - putlog(0, "未実装バイト書き込み $%08x <- $%02x", addr, data); + // 空き。どうなる? + putlog(0, "Vacant $%08x <- $%02x (NOT IMPLEMENTED)", addr, data); return 0; } if (addr < plane0base) { @@ -196,26 +198,28 @@ LunafbDevice::Write8(uint32 addr, uint32 return 0; } - if (addr < plane7end) { - // ビットマッププレーン + if (__predict_true(addr < plane_end)) { + // 存在するビットマッププレーン uint32 reladdr = addr - plane0base; uint plane = reladdr / 0x40000; uint32 offset = reladdr % 0x40000; - if (plane < nplane) { - // ビットマッププレーンN - putlog(2, "プレーン%d書き込み $%08x <- $%02x", plane, addr, data); - WritePlane8(plane, offset, data); - SetDirty(offset); - return 0; - } - // HW 設定によっては存在しないプレーンへの書き込み - putlog(3, "不在プレーン%d書き込み $%08x <- $%02x", - plane, addr, data); + putlog(2, "Plane%d $%08x <- $%02x", plane, addr, data); + WritePlane8(plane, offset, data); + SetDirty(offset); + return 0; + } + + if (addr < plane7end) { + // HW 設定によっては存在しないプレーン + uint32 reladdr = addr - plane0base; + uint plane = reladdr / 0x40000; + putlog(3, "Not-equipped Plane%d $%08x <- $%02x", plane, addr, data); return 0; } - putlog(0, "未実装バイト書き込み $%08x <- $%02x", addr, data); + // XXX ファンクションセットはバイトアクセスだとどうなる? + putlog(0, "$%08x <- $%02x (NOT IMPLEMENTED)", addr, data); return 0; } @@ -234,12 +238,13 @@ LunafbDevice::Write16(uint32 addr, uint3 case 0xb1040000: case 0xb1040002: // BMSEL はワードアクセスできる? - putlog(0, "未実装ワード書き込み $%08x <- $%04x", addr, data); + putlog(0, "BMSEL $%08x <- $%04x (NOT IMPLEMENTED)", addr, data); return 0; } if (addr < 0xb1080000) { - putlog(0, "未実装ワード書き込み $%08x <- $%04x", addr, data); + // 空き。どうなる? + putlog(0, "Vacant $%08x <- $%04x (NOT IMPLEMENTED)", addr, data); return 0; } if (addr < plane0base) { @@ -248,26 +253,28 @@ LunafbDevice::Write16(uint32 addr, uint3 return 0; } - if (addr < plane7end) { - // ビットマッププレーン + if (__predict_true(addr < plane_end)) { + // 存在するビットマッププレーン uint32 reladdr = addr - plane0base; uint plane = reladdr / 0x40000; uint32 offset = reladdr % 0x40000; - if (plane < nplane) { - // ビットマッププレーンN - putlog(2, "プレーン%d書き込み $%08x <- $%04x", plane, addr, data); - WritePlane16(plane, offset, data); - SetDirty(offset); - return 0; - } - // HW 設定によっては存在しないプレーンへの書き込み - putlog(3, "不在プレーン%d書き込み $%08x <- $%04x", - plane, addr, data); + putlog(2, "Plane%d $%08x <- $%04x", plane, addr, data); + WritePlane16(plane, offset, data); + SetDirty(offset); return 0; } - putlog(0, "未実装ワード書き込み $%08x <- $%04x", addr, data); + if (addr < plane7end) { + // HW 設定によっては存在しないプレーン + uint32 reladdr = addr - plane0base; + uint plane = reladdr / 0x40000; + putlog(3, "Not-equipped Plane%d $%08x <- $%04x", plane, addr, data); + return 0; + } + + // XXX ファンクションセットはワードアクセスだとどうなる? + putlog(0, "$%08x <- $%04x (NOT IMPLEMENTED)", addr, data); return 0; } @@ -291,7 +298,7 @@ LunafbDevice::Write32(uint32 addr, uint3 } if (addr < 0xb1080000) { - putlog(0, "未実装ロング書き込み $%08x <- $%08x", addr, data); + putlog(0, "Vacant $%08x <- $%08x (NOT IMPLEMENTED)", addr, data); return 0; } if (addr < plane0base) { @@ -300,54 +307,55 @@ LunafbDevice::Write32(uint32 addr, uint3 return 0; } - if (addr < plane7end) { - // ビットマッププレーン + if (__predict_true(addr < plane_end)) { + // 存在するビットマッププレーン uint32 reladdr = addr - plane0base; uint plane = reladdr / 0x40000; uint32 offset = reladdr % 0x40000; - if (plane < nplane) { - // ビットマッププレーンN - putlog(3, "プレーン%d書き込み $%08x <- $%08x", plane, addr, data); - WritePlane32(plane, offset, data); - SetDirty(offset); - return 0; - } - // HW 設定によっては存在しないプレーンへの書き込み - putlog(3, "不在プレーン%d書き込み $%08x <- $%08x", - plane, addr, data); + putlog(3, "Plane%d $%08x <- $%08x", plane, addr, data); + WritePlane32(plane, offset, data); + SetDirty(offset); + return 0; + } + + if (__predict_false(addr < plane7end)) { + // HW 設定によっては存在しないプレーン + uint32 reladdr = addr - plane0base; + uint plane = reladdr / 0x40000; + putlog(3, "Not-equipped Plane%d $%08x <- $%08x", plane, addr, data); return 0; } if (addr < 0xb1300000) { // 共通ファンクションセット uint rop = (addr & 0x3f) / 4; - putlog(2, "共通FCSet 書き込み $%08x <- $%08x (%s)", + putlog(2, "Common FCSet $%08x <- $%08x (%s)", addr, data, RopStr(rop)); WriteCommonFCSet(rop, data); return 0; } - if (addr < fcset7end) { - // ファンクションセット + if (__predict_true(addr < fcset_end)) { + // 存在するファンクションセット int plane = (addr - 0xb1300000) / 0x40000; - - if (plane < nplane) { - // ファンクションセットN - uint rop = (addr & 0x3f) / 4; - putlog(2, "FCSet%d書き込み $%08x <- $%08x (%s)", + uint rop = (addr & 0x3f) / 4; + putlog(2, "FCSet%d $%08x <- $%08x (%s)", plane, addr, data, RopStr(rop)); - fcset[plane] = rop; - fcmask[plane] = data; - return 0; - } - // HW 設定によっては存在しない FCSet への書き込み - putlog(3, "不在FCSet%d書き込み $%08x <- $%08x", - plane, addr, data); + fcset[plane] = rop; + fcmask[plane] = data; + return 0; + } + + if (addr < fcset7end) { + // HW 設定によっては存在しないファンクションセット + int plane = (addr - 0xb1300000) / 0x40000; + putlog(3, "Not-equipped FCSet%d $%08x <- $%08x", plane, addr, data); return 0; } - putlog(0, "未実装ロング書き込み $%08x <- $%08x", addr, data); + // 残りは全部空きのはずだが挙動未調査。 + putlog(0, "$%08x <- $%08x (NOT IMPLEMENTED)", addr, data); return 0; } @@ -468,8 +476,7 @@ LunafbDevice::WriteRFCNT(uint32 data) // 全画面更新 Invalidate(); - putlog(1, "RFCNT <- $%08x (水平 %ddot, 垂直 %ddot)", - data, xscroll, yscroll); + putlog(1, "RFCNT <- $%08x (H=%ddot, V=%ddot)", data, xscroll, yscroll); } // 共通ビットマッププレーン バイト書き込み @@ -477,7 +484,7 @@ void LunafbDevice::WriteCommonBitmap8(uint32 addr, uint32 data) { uint32 offset = addr - 0xb1080000; - putlog(2, "共通プレーン書き込み $%08x <- $%02x", addr, data); + putlog(2, "Common Plane $%08x <- $%02x", addr, data); for (int i = 0; i < nplane; i++) { if ((bmsel & (1 << i))) { WritePlane8(i, offset, data); @@ -491,7 +498,7 @@ void LunafbDevice::WriteCommonBitmap16(uint32 addr, uint32 data) { uint32 offset = addr - 0xb1080000; - putlog(2, "共通プレーン書き込み $%08x <- $%04x", addr, data); + putlog(2, "Common Plane $%08x <- $%04x", addr, data); for (int i = 0; i < nplane; i++) { if ((bmsel & (1 << i))) { WritePlane16(i, offset, data); @@ -505,7 +512,7 @@ void LunafbDevice::WriteCommonBitmap32(uint32 addr, uint32 data) { uint32 offset = addr - 0xb1080000; - putlog(2, "共通プレーン書き込み $%08x <- $%08x", addr, data); + putlog(2, "Common Plane $%08x <- $%08x", addr, data); for (int i = 0; i < nplane; i++) { if ((bmsel & (1 << i))) { WritePlane32(i, offset, data); @@ -733,7 +740,7 @@ LunafbDevice::EmuPutc(uint x, uint y, ui mask.q >>= bofs; // その文字のフォントデータ上でのアドレス - const uint8 * const fontaddr = BuiltinCGROM::Get12x24(c & 0xff); + const uint8 * const fontaddr = Builtin::CGROM12x24(c & 0xff); for (int i = 0; i < 24; i++) { // その文字のフォントデータ。