--- nono/vm/extram.cpp 2026/04/29 17:05:17 1.1 +++ nono/vm/extram.cpp 2026/04/29 17:05:29 1.1.1.4 @@ -11,6 +11,7 @@ // TS-6BE16 互換だと $0100'0000 〜 $01ff'ffff の 16MB。 // 060turbo 互換だと $1000'0000 〜 $17ff'ffff の 128MB、 // $1000'0000 〜 $1fff'ffff の 256MB。 +// $1000'0000 〜 $2fff'ffff の 512MB。(独自拡張) // // 拡張 RAM はロングワード単位でホストバイトオーダ配置なので、 @@ -40,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) { @@ -49,15 +50,22 @@ ExtRAMDevice::Init() break; case 128: case 256: + case 384: + case 512: ram_addr = 0x10'000000; break; default: - item.Err("Valid size is 16, 128, and 256 for now"); + item.Err("Valid size are 16, 128, 256, 384 or 512 for now"); return false; } ram_size = extram_size_MB * 1024 * 1024; - ram.reset(new uint8[ram_size]); + ram.reset(new(std::nothrow) uint8[ram_size]); + if ((bool)ram == false) { + errno = ENOMEM; + warn("ExtRAM(%u bytes)", ram_size); + return false; + } return true; } @@ -78,73 +86,54 @@ ExtRAMDevice::Decoder(uint32 addr) const return (addr - ram_addr); } -uint64 -ExtRAMDevice::Read8(uint32 addr) -{ - uint32 offset = Decoder(addr); - uint32 data = ram[HLB(offset)]; - putlog(4, "$%08x.B -> $%02x", addr, data); - return data; -} - -uint64 -ExtRAMDevice::Read16(uint32 addr) +busdata +ExtRAMDevice::Read(busaddr addr) { - uint32 offset = Decoder(addr); - uint32 data = *(uint16 *)&ram[HLW(offset)]; - putlog(4, "$%08x.W -> $%04x", addr, data); - return data; -} + uint32 offset = Decoder(addr.Addr()); + busdata data; -uint64 -ExtRAMDevice::Read32(uint32 addr) -{ - uint32 offset = Decoder(addr); - uint32 data = *(uint32 *)&ram[offset]; - putlog(4, "$%08x.L -> $%08x", addr, data); + data = *(uint32 *)&ram[offset & ~3U]; + putlog(4, "$%08x -> $%08x", addr.Addr(), data.Data()); + data |= BusData::Size4; return data; } -uint64 -ExtRAMDevice::Write8(uint32 addr, uint32 data) +busdata +ExtRAMDevice::Write(busaddr addr, uint32 data) { - uint32 offset = Decoder(addr); - ram[HLB(offset)] = data; - putlog(3, "$%08x.B <- $%02x", addr, data); - return 0; -} - -uint64 -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; + } + } -uint64 -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; } -uint64 -ExtRAMDevice::Peek8(uint32 addr) +busdata +ExtRAMDevice::Peek1(uint32 addr) { uint32 offset = Decoder(addr); return ram[HLB(offset)]; } -uint64 -ExtRAMDevice::Poke8(uint32 addr, uint32 data) +bool +ExtRAMDevice::Poke1(uint32 addr, uint32 data) { if ((int32)data >= 0) { uint32 offset = Decoder(addr); ram[HLB(offset)] = data; } - return 0; + return true; }