--- nono/vm/extram.cpp 2026/04/29 17:05:25 1.1.1.3 +++ nono/vm/extram.cpp 2026/04/29 17:05:29 1.1.1.4 @@ -41,7 +41,7 @@ ExtRAMDevice::Init() const ConfigItem& item = gConfig->Find("extram-size"); uint32 extram_size_MB = item.AsInt(); - if (extram_size_MB <= 0) { + if (extram_size_MB == 0) { return true; } switch (extram_size_MB) { @@ -87,68 +87,49 @@ ExtRAMDevice::Decoder(uint32 addr) const } busdata -ExtRAMDevice::Read8(uint32 addr) +ExtRAMDevice::Read(busaddr addr) { - uint32 offset = Decoder(addr); - busdata data = ram[HLB(offset)]; - putlog(4, "$%08x.B -> $%02x", addr, data.Data()); - return data; -} - -busdata -ExtRAMDevice::Read16(uint32 addr) -{ - uint32 offset = Decoder(addr); - busdata data = *(uint16 *)&ram[HLW(offset)]; - putlog(4, "$%08x.W -> $%04x", addr, data.Data()); - return data; -} + uint32 offset = Decoder(addr.Addr()); + busdata data; -busdata -ExtRAMDevice::Read32(uint32 addr) -{ - uint32 offset = Decoder(addr); - busdata data = *(uint32 *)&ram[offset]; - putlog(4, "$%08x.L -> $%08x", addr, data.Data()); + data = *(uint32 *)&ram[offset & ~3U]; + putlog(4, "$%08x -> $%08x", addr.Addr(), data.Data()); + data |= BusData::Size4; return data; } busdata -ExtRAMDevice::Write8(uint32 addr, uint32 data) +ExtRAMDevice::Write(busaddr addr, uint32 data) { - uint32 offset = Decoder(addr); - ram[HLB(offset)] = data; - putlog(3, "$%08x.B <- $%02x", addr, data); - return 0; -} - -busdata -ExtRAMDevice::Write16(uint32 addr, uint32 data) -{ - uint32 offset = Decoder(addr); - *(uint16 *)&ram[HLW(offset)] = data; - putlog(3, "$%08x.W <- $%04x", addr, data); - return 0; -} + uint32 paddr = Decoder(addr.Addr()); + uint32 reqsize = addr.GetSize(); + uint32 datasize = std::min(4 - (paddr & 3U), reqsize); + + if (datasize == 4) { + *(uint32 *)&ram[paddr] = data; + putlog(3, "$%08x <- $%08x", addr.Addr(), data); + } else { + data >>= (reqsize - datasize) * 8; + putlog(3, "$%08x <- $%0*x", addr.Addr(), datasize * 2, data); + for (int i = datasize - 1; i >= 0; i--) { + ram[HLB(paddr + i)] = data; + data >>= 8; + } + } -busdata -ExtRAMDevice::Write32(uint32 addr, uint32 data) -{ - uint32 offset = Decoder(addr); - *(uint32 *)&ram[offset] = data; - putlog(3, "$%08x.L <- $%08x", addr, data); - return 0; + busdata r = BusData::Size4; + return r; } busdata -ExtRAMDevice::Peek8(uint32 addr) +ExtRAMDevice::Peek1(uint32 addr) { uint32 offset = Decoder(addr); return ram[HLB(offset)]; } bool -ExtRAMDevice::Poke8(uint32 addr, uint32 data) +ExtRAMDevice::Poke1(uint32 addr, uint32 data) { if ((int32)data >= 0) { uint32 offset = Decoder(addr);