--- nono/vm/extram.cpp 2026/04/29 17:05:17 1.1 +++ nono/vm/extram.cpp 2026/04/29 17:05:25 1.1.1.3 @@ -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 はロングワード単位でホストバイトオーダ配置なので、 @@ -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,34 +86,34 @@ ExtRAMDevice::Decoder(uint32 addr) const return (addr - ram_addr); } -uint64 +busdata ExtRAMDevice::Read8(uint32 addr) { uint32 offset = Decoder(addr); - uint32 data = ram[HLB(offset)]; - putlog(4, "$%08x.B -> $%02x", addr, data); + busdata data = ram[HLB(offset)]; + putlog(4, "$%08x.B -> $%02x", addr, data.Data()); return data; } -uint64 +busdata ExtRAMDevice::Read16(uint32 addr) { uint32 offset = Decoder(addr); - uint32 data = *(uint16 *)&ram[HLW(offset)]; - putlog(4, "$%08x.W -> $%04x", addr, data); + busdata data = *(uint16 *)&ram[HLW(offset)]; + putlog(4, "$%08x.W -> $%04x", addr, data.Data()); return data; } -uint64 +busdata ExtRAMDevice::Read32(uint32 addr) { uint32 offset = Decoder(addr); - uint32 data = *(uint32 *)&ram[offset]; - putlog(4, "$%08x.L -> $%08x", addr, data); + busdata data = *(uint32 *)&ram[offset]; + putlog(4, "$%08x.L -> $%08x", addr, data.Data()); return data; } -uint64 +busdata ExtRAMDevice::Write8(uint32 addr, uint32 data) { uint32 offset = Decoder(addr); @@ -114,7 +122,7 @@ ExtRAMDevice::Write8(uint32 addr, uint32 return 0; } -uint64 +busdata ExtRAMDevice::Write16(uint32 addr, uint32 data) { uint32 offset = Decoder(addr); @@ -123,7 +131,7 @@ ExtRAMDevice::Write16(uint32 addr, uint3 return 0; } -uint64 +busdata ExtRAMDevice::Write32(uint32 addr, uint32 data) { uint32 offset = Decoder(addr); @@ -132,19 +140,19 @@ ExtRAMDevice::Write32(uint32 addr, uint3 return 0; } -uint64 +busdata ExtRAMDevice::Peek8(uint32 addr) { uint32 offset = Decoder(addr); return ram[HLB(offset)]; } -uint64 +bool ExtRAMDevice::Poke8(uint32 addr, uint32 data) { if ((int32)data >= 0) { uint32 offset = Decoder(addr); ram[HLB(offset)] = data; } - return 0; + return true; }