--- nono/vm/zram.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/zram.cpp 2026/04/29 17:05:10 1.1.1.5 @@ -1,100 +1,111 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // -#include "zram.h" - // // 3ポート共有 RAM // -// ZRAM はロングワード単位でホストバイトオーダ配置なので、 -// バイトアクセス、ワードアクセス時は HLB(), HLW() マクロ使用のこと。 -// +// ZRAM はバイト配置とする。 + +#include "zram.h" + +// グローバル参照用 ZRAMDevice *gZRAM; +// コンストラクタ ZRAMDevice::ZRAMDevice() + : inherited("ZRAM") { - logname = "zram"; - devname = "ZRAM"; devaddr = 0x71000000; devlen = 128 * 1024; - ram = new uint8[devlen]; + ram.reset(new uint8[devlen]); } +// デストラクタ ZRAMDevice::~ZRAMDevice() { + gZRAM = NULL; } -// たぶん 128KB で折り返しイメージが見えるはず。要確認。 +// アドレスデコーダ +inline uint64 +ZRAMDevice::Decoder(uint32 addr) const +{ + // たぶん 128KB で折り返しイメージが見えるはず。要確認。 + return addr % devlen; +} uint64 ZRAMDevice::Read8(uint32 addr) { - std::unique_lock lock(mtx); - - uint32 an = addr % devlen; - uint32 data = ram[HLB(an)]; + uint32 offset = Decoder(addr); + uint32 data = ram[offset]; return data; } uint64 ZRAMDevice::Read16(uint32 addr) { - std::unique_lock lock(mtx); - - uint32 an = addr % devlen; - uint32 data = *(uint16 *)&ram[HLW(an)]; + uint32 offset = Decoder(addr); + 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 an = addr % devlen; - uint32 data = *(uint32 *)&ram[an]; + uint32 offset = Decoder(addr); + 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 an = addr % devlen; - ram[HLB(an)] = data; + uint32 offset = Decoder(addr); + 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 an = addr % devlen; - *(uint16 *)&ram[HLW(an)] = data; + uint32 offset = Decoder(addr); + 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 an = addr % devlen; - *(uint32 *)&ram[an] = data; + uint32 offset = Decoder(addr); + 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 an = addr % devlen; - return ram[HLB(an)]; + uint32 offset = Decoder(addr); + return ram[offset]; }