--- nono/vm/sram.cpp 2026/04/29 17:05:14 1.1.1.10 +++ nono/vm/sram.cpp 2026/04/29 17:05:24 1.1.1.12 @@ -14,29 +14,28 @@ #include "sram.h" #include "config.h" #include "mainapp.h" -#include "ram.h" +#include "mainram.h" #include -// グローバル参照用 -SRAMDevice *gSRAM; - // コンストラクタ SRAMDevice::SRAMDevice() - : inherited("SRAM") + : inherited(OBJ_SRAM) { - devaddr = baseaddr; - devlen = 0x4000; } // デストラクタ SRAMDevice::~SRAMDevice() { - gSRAM = NULL; } +// 初期化 bool SRAMDevice::Init() { + if (inherited::Init() == false) { + return false; + } + filename = gMainApp.GetVMDir() + "SRAM.DAT"; file.SetFilename(filename); file.SetDispname(string_format("SRAM \"%s\"", filename.c_str())); @@ -78,7 +77,7 @@ SRAMDevice::SyncRAMSize() } } - uint32 ramsize = gRAM->GetSize(); + uint32 ramsize = GetMainRAMDevice()->GetSize(); // 値が違う時だけ表示したいので一旦読み出して比較 uint32 cursize; @@ -98,7 +97,7 @@ SRAMDevice::SyncRAMSize() } // アドレスデコーダ -inline uint64 +inline uint32 SRAMDevice::Decoder(uint32 addr) const { uint32 offset = addr - baseaddr; @@ -107,48 +106,31 @@ SRAMDevice::Decoder(uint32 addr) const return offset; } -uint64 +busdata SRAMDevice::Read8(uint32 addr) { uint32 offset = Decoder(addr); uint32 data; - // ホストファイル起動モードなら起動アドレスとして Pluto-X を見せる。 - if (gMainApp.exec_file) { - data = PeekHostBoot(offset); - if ((int32)data >= 0) { - if ((offset & 1) == 0) { - data = data >> 8; - } else { - data = data & 0xff; - } - return data; - } - } + data = Get8(offset); + putlog(2, "$%06x.B -> $%02x", addr, data); - data = mem[offset]; return data; } -uint64 +busdata SRAMDevice::Read16(uint32 addr) { uint32 offset = Decoder(addr); uint32 data; - // ホストファイル起動モードなら起動アドレスとして Pluto-X を見せる。 - if (gMainApp.exec_file) { - data = PeekHostBoot(offset); - if ((int32)data >= 0) { - return data; - } - } + data = Get16(offset); + putlog(2, "$%06x.W -> $%04x", addr, data); - data = be16toh(*(uint16 *)&mem[offset]); return data; } -uint64 +busdata SRAMDevice::Write8(uint32 addr, uint32 data) { uint32 offset = Decoder(addr); @@ -164,7 +146,7 @@ SRAMDevice::Write8(uint32 addr, uint32 d return 0; } -uint64 +busdata SRAMDevice::Write16(uint32 addr, uint32 data) { uint32 offset = Decoder(addr); @@ -180,29 +162,29 @@ SRAMDevice::Write16(uint32 addr, uint32 return 0; } -uint64 +busdata SRAMDevice::Peek8(uint32 addr) { uint32 offset = Decoder(addr); - // ホストファイル起動モードなら起動アドレスとして Pluto-X を見せる。 - if (gMainApp.exec_file) { - uint32 data = PeekHostBoot(offset); - if ((int32)data >= 0) { - if ((offset & 1) == 0) { - data = data >> 8; - } else { - data = data & 0xff; - } - return data; - } - } + return Get8(offset); +} - return mem[offset]; +bool +SRAMDevice::Poke8(uint32 addr, uint32 data) +{ + // WriteEnable() に関わらず変更する。 + // また Get8()、Get16() はこの変更の影響を受けないことに注意。 + + if ((int32)data >= 0) { + uint32 offset = Decoder(addr); + mem[offset] = data; + } + return true; } void -SRAMDevice::write_enable(bool value) +SRAMDevice::WriteEnable(bool value) { if (writeable == false && value == true) { putlog(1, "Write Enable"); @@ -213,38 +195,82 @@ SRAMDevice::write_enable(bool value) writeable = value; } -// ホストファイル起動用の読み出し値を返す。 -// offset はワード境界であること。戻り値はホストバイトオーダのワード値。 -// 本来の SRAM の値を読み出してよいところについては (uint32)-1 を返す。 -// -// mem[] は SRAM.DAT を直接 mmap(2) しており書き換えておくことは出来ないため、 -// ホストファイル起動モードなら読み出し時に動的に値を返す。 +// SRAM から副作用なく読み出す。 +// ただしホストファイル起動モードなら改変した値を返す。 uint32 -SRAMDevice::PeekHostBoot(uint32 offset) const +SRAMDevice::Get8(uint32 offset) const { - switch (offset) { - case 0x0c: // ROM 起動アドレス(H) - return (plutoaddr >> 16); - case 0x0e: // ROM 起動アドレス(L) - return (plutoaddr & 0xffff); - case 0x18: // 起動デバイスを ROM にする - return 0xa000; - default: - break; + if (gMainApp.exec_file) { + switch (offset) { + case 0x0c: // ROM 起動アドレス(.L) + return plutoaddr >> 24; + case 0x0d: + return (plutoaddr >> 16) & 0xff; + case 0x0e: + return (plutoaddr >> 8) & 0xff; + case 0x0f: + return plutoaddr & 0xff; + + case 0x18: // 起動デバイス(.W) を ROM($a000) にする + return 0xa0; + case 0x19: + return 0x00; + + default: + break; + } } - return (uint32)-1; + + // 他は SRAM から + return mem[offset]; +} + +// SRAM から副作用なくワードで読み出す。 +// ただしホストファイル起動モードなら改変した値を返す。 +uint32 +SRAMDevice::Get16(uint32 offset) const +{ + uint32 data; + + data = Get8(offset) << 8; + data |= Get8(offset + 1); + + return data; } -// SRAM $ed000c.L ROM 起動アドレスを返す +// SRAM から副作用なくロングワードで読み出す。 +// ただしホストファイル起動モードなら改変した値を返す。 uint32 -SRAMDevice::GetROMAddr() const +SRAMDevice::Get32(uint32 offset) const { uint32 data; - data = mem[0x0c] << 24; - data |= mem[0x0d] << 16; - data |= mem[0x0e] << 8; - data |= mem[0x0f]; + data = Get16(offset) << 16; + data |= Get16(offset + 2); return data; } + +// IPLROM30 が初期化した SRAM の初期値。 +// +// 0000: 82 77 36 38 30 30 30 57 00 40 00 00 00 fc 00 00 |.w68000W.@......| +// 0010: 00 ed 01 00 ff ff ff ff 00 00 4e 07 00 10 00 00 |..........N.....| +// 0020: 00 00 ff ff 00 00 07 00 0e 00 0d 00 00 00 00 00 |................| +// 0030: f8 3e ff c0 ff fe de 6c 40 22 03 02 00 08 00 00 |.>.....l@"......| +// 0040: 00 00 00 00 00 00 00 00 00 ff f4 00 04 00 01 01 |................| +// 0050: 00 00 00 20 00 03 f9 01 00 00 00 00 00 00 00 00 |... ............| +/*static*/ std::array +SRAMDevice::InitialData { + 0x82, 0x77, 0x36, 0x38, 0x30, 0x30, 0x30, 0x57, + 0x00, 0x40, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, + 0x00, 0xed, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x4e, 0x07, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x07, 0x00, + 0x0e, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0x3e, 0xff, 0xc0, 0xff, 0xfe, 0xde, 0x6c, + 0x40, 0x22, 0x03, 0x02, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xf4, 0x00, 0x04, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x03, 0xf9, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +};