--- nono/vm/zram.cpp 2026/04/29 17:04:36 1.1.1.3 +++ nono/vm/zram.cpp 2026/04/29 17:05:10 1.1.1.5 @@ -4,29 +4,31 @@ // Licensed under nono-license.txt // -#include "zram.h" - // // 3ポート共有 RAM // -// ZRAM はロングワード単位でホストバイトオーダ配置なので、 -// バイトアクセス、ワードアクセス時は HLB(), HLW() マクロ使用のこと。 -// -std::unique_ptr gZRAM; +// ZRAM はバイト配置とする。 + +#include "zram.h" + +// グローバル参照用 +ZRAMDevice *gZRAM; +// コンストラクタ ZRAMDevice::ZRAMDevice() + : inherited("ZRAM") { - logname = "zram"; - devname = "ZRAM"; devaddr = 0x71000000; devlen = 128 * 1024; ram.reset(new uint8[devlen]); } +// デストラクタ ZRAMDevice::~ZRAMDevice() { + gZRAM = NULL; } // アドレスデコーダ @@ -40,68 +42,70 @@ ZRAMDevice::Decoder(uint32 addr) const uint64 ZRAMDevice::Read8(uint32 addr) { - std::unique_lock lock(mtx); - uint32 offset = Decoder(addr); - uint32 data = ram[HLB(offset)]; + uint32 data = ram[offset]; return data; } uint64 ZRAMDevice::Read16(uint32 addr) { - std::unique_lock lock(mtx); - uint32 offset = Decoder(addr); - uint32 data = *(uint16 *)&ram[HLW(offset)]; + uint32 data; + data = (uint32)ram[offset + 0] << 8; + data |= (uint32)ram[offset + 1]; return data; } uint64 ZRAMDevice::Read32(uint32 addr) { - std::unique_lock lock(mtx); - uint32 offset = Decoder(addr); - uint32 data = *(uint32 *)&ram[offset]; + uint32 data; + data = (uint32)ram[offset + 0] << 24; + data |= (uint32)ram[offset + 1] << 16; + data |= (uint32)ram[offset + 2] << 8; + data |= (uint32)ram[offset + 3]; return data; } uint64 ZRAMDevice::Write8(uint32 addr, uint32 data) { - std::unique_lock lock(mtx); + putlog(3, "$%08x.B <- $%02x", addr, data); uint32 offset = Decoder(addr); - ram[HLB(offset)] = data; + ram[offset] = data; return 0; } uint64 ZRAMDevice::Write16(uint32 addr, uint32 data) { - std::unique_lock lock(mtx); + putlog(3, "$%08x.W <- $%04x", addr, data); uint32 offset = Decoder(addr); - *(uint16 *)&ram[HLW(offset)] = data; + ram[offset + 0] = (data >> 8) & 0xff; + ram[offset + 1] = data & 0xff; return 0; } uint64 ZRAMDevice::Write32(uint32 addr, uint32 data) { - std::unique_lock lock(mtx); + putlog(3, "$%08x.L <- $%08x", addr, data); uint32 offset = Decoder(addr); - *(uint32 *)&ram[offset] = data; + ram[offset + 0] = data >> 24; + ram[offset + 1] = (data >> 16) & 0xff; + ram[offset + 2] = (data >> 8) & 0xff; + ram[offset + 3] = data & 0xff; return 0; } uint64 ZRAMDevice::Peek8(uint32 addr) { - std::unique_lock lock(mtx); - uint32 offset = Decoder(addr); - return ram[HLB(offset)]; + return ram[offset]; }