--- nono/vm/lunafb.cpp 2026/04/29 17:05:17 1.1.1.4 +++ nono/vm/lunafb.cpp 2026/04/29 17:05:24 1.1.1.5 @@ -82,6 +82,9 @@ LunafbDevice::Init() // ホストパレットを取得。 palette = &(bt45x->GetHostPalette())[0]; + // XXX とりあえず RAM と同じウェイトを入れておく (未調査) + wait = busdata::Wait(1 * mpu->GetClock_nsec()); + return true; } @@ -89,6 +92,8 @@ LunafbDevice::Init() void LunafbDevice::ResetHard(bool poweron) { + inherited::ResetHard(poweron); + if (poweron) { // XXX 実際は不定値だと思うけど、観測手段がないのでとりあえず。 memset(&mem[0], 0xff, 0x40000 * nplane); @@ -106,62 +111,62 @@ LunafbDevice::ResetHard(bool poweron) fcset[i] = ROP::THRU; fcmask[i] = 0xffffffff; } - - // XXX ここ? - Invalidate(); } -uint64 +busdata LunafbDevice::Read8(uint32 addr) { - // XXX とりあえず RAM と同じウェイトを入れておく (未調査) - mpu->AddCycle(1); + busdata data; if (plane0base <= addr && addr < plane_end) { // プレーンの読み出し - return mem[HLB(addr - plane0base)]; + data = mem[HLB(addr - plane0base)]; + } else { + // 残りは書き込み専用または不在 + putlog(1, "Read not-readable $%08x.B", addr); + data = 0xff; } - // 残りは書き込み専用または不在 - putlog(1, "Read not-readable $%08x.B", addr); - return 0xff; + data |= wait; + return data; } -uint64 +busdata LunafbDevice::Read16(uint32 addr) { - // XXX とりあえず RAM と同じウェイトを入れておく (未調査) - mpu->AddCycle(1); + busdata data; if (plane0base <= addr && addr < plane_end) { // プレーンの読み出し - return *(uint16 *)&mem[HLW(addr - plane0base)]; + data = *(uint16 *)&mem[HLW(addr - plane0base)]; + } else { + // 残りは書き込み専用または不在 + putlog(1, "Read not-readable $%08x.W", addr); + data = 0xffff; } - // 残りは書き込み専用または不在 - putlog(1, "Read not-readable $%08x.W", addr); - return 0xffff; + data |= wait; + return data; } -uint64 +busdata LunafbDevice::Read32(uint32 addr) { - // XXX とりあえず RAM と同じウェイトを入れておく (未調査) - mpu->AddCycle(1); + busdata data; if (plane0base <= addr && addr < plane_end) { // プレーンの読み出し - return *(uint32 *)&mem[addr - plane0base]; + data = *(uint32 *)&mem[addr - plane0base]; + } else { + // 残りは書き込み専用または不在 + putlog(1, "Read not-readable $%08x.L", addr); + data = 0xffffffff; } - // 残りは書き込み専用または不在 - putlog(1, "Read not-readable $%08x.L", addr); - return 0xffffffff; + data |= wait; + return data; } -uint64 +busdata LunafbDevice::Write8(uint32 addr, uint32 data) { - // XXX とりあえず RAM と同じウェイトを入れておく (未調査) - mpu->AddCycle(1); - switch (addr) { case 0xb1000000: case 0xb1000001: @@ -176,18 +181,18 @@ LunafbDevice::Write8(uint32 addr, uint32 case 0xb1040003: // BMSEL はバイトアクセスできる? putlog(0, "BMSEL $%08x <- $%02x (NOT IMPLEMENTED)", addr, data); - return 0; + return wait; } if (addr < 0xb1080000) { // 空き。どうなる? putlog(0, "Vacant $%08x <- $%02x (NOT IMPLEMENTED)", addr, data); - return 0; + return wait; } if (addr < plane0base) { // 共通ビットマッププレーン WriteCommonBitmap8(addr, data); - return 0; + return wait; } if (__predict_true(addr < plane_end)) { @@ -199,7 +204,7 @@ LunafbDevice::Write8(uint32 addr, uint32 putlog(2, "Plane%d $%08x <- $%02x", plane, addr, data); WritePlane8(plane, offset, data); SetDirty(offset); - return 0; + return wait; } if (addr < plane7end) { @@ -207,20 +212,17 @@ LunafbDevice::Write8(uint32 addr, uint32 uint32 reladdr = addr - plane0base; uint plane = reladdr / 0x40000; putlog(3, "Not-equipped Plane%d $%08x <- $%02x", plane, addr, data); - return 0; + return wait; } // XXX ファンクションセットはバイトアクセスだとどうなる? putlog(0, "$%08x <- $%02x (NOT IMPLEMENTED)", addr, data); - return 0; + return wait; } -uint64 +busdata LunafbDevice::Write16(uint32 addr, uint32 data) { - // XXX とりあえず RAM と同じウェイトを入れておく (未調査) - mpu->AddCycle(1); - switch (addr) { case 0xb1000000: case 0xb1000002: @@ -231,18 +233,18 @@ LunafbDevice::Write16(uint32 addr, uint3 case 0xb1040002: // BMSEL はワードアクセスできる? putlog(0, "BMSEL $%08x <- $%04x (NOT IMPLEMENTED)", addr, data); - return 0; + return wait; } if (addr < 0xb1080000) { // 空き。どうなる? putlog(0, "Vacant $%08x <- $%04x (NOT IMPLEMENTED)", addr, data); - return 0; + return wait; } if (addr < plane0base) { // 共通ビットマッププレーン WriteCommonBitmap16(addr, data); - return 0; + return wait; } if (__predict_true(addr < plane_end)) { @@ -254,7 +256,7 @@ LunafbDevice::Write16(uint32 addr, uint3 putlog(2, "Plane%d $%08x <- $%04x", plane, addr, data); WritePlane16(plane, offset, data); SetDirty(offset); - return 0; + return wait; } if (addr < plane7end) { @@ -262,41 +264,38 @@ LunafbDevice::Write16(uint32 addr, uint3 uint32 reladdr = addr - plane0base; uint plane = reladdr / 0x40000; putlog(3, "Not-equipped Plane%d $%08x <- $%04x", plane, addr, data); - return 0; + return wait; } // XXX ファンクションセットはワードアクセスだとどうなる? putlog(0, "$%08x <- $%04x (NOT IMPLEMENTED)", addr, data); - return 0; + return wait; } -uint64 +busdata LunafbDevice::Write32(uint32 addr, uint32 data) { - // XXX とりあえず RAM と同じウェイトを入れておく (未調査) - mpu->AddCycle(1); - switch (addr) { case 0xb1000000: // RFCNT WriteRFCNT(data); - return 0; + return wait; case 0xb1040000: // BMSEL bmsel = data & 0xf; putlog(1, "BMSEL <- $%08x", data); - return 0; + return wait; } if (addr < 0xb1080000) { putlog(0, "Vacant $%08x <- $%08x (NOT IMPLEMENTED)", addr, data); - return 0; + return wait; } if (addr < plane0base) { // 共通ビットマッププレーン WriteCommonBitmap32(addr, data); - return 0; + return wait; } if (__predict_true(addr < plane_end)) { @@ -308,7 +307,7 @@ LunafbDevice::Write32(uint32 addr, uint3 putlog(3, "Plane%d $%08x <- $%08x", plane, addr, data); WritePlane32(plane, offset, data); SetDirty(offset); - return 0; + return wait; } if (__predict_false(addr < plane7end)) { @@ -316,7 +315,7 @@ LunafbDevice::Write32(uint32 addr, uint3 uint32 reladdr = addr - plane0base; uint plane = reladdr / 0x40000; putlog(3, "Not-equipped Plane%d $%08x <- $%08x", plane, addr, data); - return 0; + return wait; } if (addr < 0xb1300000) { @@ -325,7 +324,7 @@ LunafbDevice::Write32(uint32 addr, uint3 putlog(2, "Common FCSet $%08x <- $%08x (%s)", addr, data, RopStr(rop)); WriteCommonFCSet(rop, data); - return 0; + return wait; } if (__predict_true(addr < fcset_end)) { @@ -336,22 +335,22 @@ LunafbDevice::Write32(uint32 addr, uint3 plane, addr, data, RopStr(rop)); fcset[plane] = rop; fcmask[plane] = data; - return 0; + return wait; } if (addr < fcset7end) { // HW 設定によっては存在しないファンクションセット int plane = (addr - 0xb1300000) / 0x40000; putlog(3, "Not-equipped FCSet%d $%08x <- $%08x", plane, addr, data); - return 0; + return wait; } // 残りは全部空きのはずだが挙動未調査。 putlog(0, "$%08x <- $%08x (NOT IMPLEMENTED)", addr, data); - return 0; + return wait; } -uint64 +busdata LunafbDevice::Peek8(uint32 addr) { if (plane0base <= addr && addr < plane_end) { @@ -362,7 +361,7 @@ LunafbDevice::Peek8(uint32 addr) return 0xff; } -uint64 +bool LunafbDevice::Poke8(uint32 addr, uint32 data) { // 通常プレーンのみ越権書き込み可能とする? @@ -375,9 +374,9 @@ LunafbDevice::Poke8(uint32 addr, uint32 // この場合も画面を更新する SetDirty(offset); } - return 0; + return true; } - return (uint64)-1; + return false; } void @@ -785,6 +784,7 @@ LunafbDevice::EmuPutc(uint x, uint y, ui { uint32 addr = 0xb1080000 + (x / 32) * 4 + y * 256; uint32 bofs = x % 32; + int height = (c < 0x80) ? 24 : 12; // マスク設定。上から 12bit にマスクを置いといて.. union64 mask {}; @@ -794,9 +794,11 @@ LunafbDevice::EmuPutc(uint x, uint y, ui mask.q >>= bofs; // その文字のフォントデータ上でのアドレス - const uint8 * const fontaddr = Builtin::CGROM12x24(c & 0xff); + const uint8 * const fontaddr = (c < 0x80) + ? Builtin::CGROM12x24(c) + : Builtin::CGROM12x12(c & 0x7f); - for (int i = 0; i < 24; i++) { + for (int i = 0; i < height; i++) { // その文字のフォントデータ。 // データは MSB 側 12bit に入っているのでこれを 64bit MSB 詰めにする union64 data {};