--- nono/vm/sram.cpp 2026/04/29 17:05:37 1.1.1.14 +++ nono/vm/sram.cpp 2026/04/29 17:05:59 1.1.1.17 @@ -42,22 +42,31 @@ SRAMDevice::Init() { // SRAM ファイルをオープン。 if (gMainApp.GetVMDir().empty()) { - // Human68k モードで VM ディレクトリ指定がなければ、ダミーを用意。 + // VM ディレクトリ指定がなければ、オンメモリに初期値を用意する。 + // Human68k モードで VM ディレクトリを指定しない場合に起きる。 void *m = mmap(NULL, sramsize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0); if (m == MAP_FAILED) { - warn("mmap"); + warn("%s: mmap", __method__); return false; } mem = (uint8 *)m; - memcpy(mem, &InitialData[0], InitialData.size()); + memcpy(mem, &initialdata[0], initialdata.size()); } else { + // VM ディレクトリ指定があれば、ファイルを開く。 filename = gMainApp.GetVMDir() + "SRAM.DAT"; - file.reset(new MappedFile()); + try { + file.reset(new MappedFile()); + } catch (...) { } + if ((bool)file == false) { + warnx("Failed to initialize MappedFile at %s", __method__); + return false; + } file->SetFilename(filename); file->SetDispname(string_format("SRAM \"%s\"", filename.c_str())); - mem = file->OpenCreate(sramsize); + mem = file->OpenCreate(sramsize, &initialdata[0], initialdata.size()); if (mem == NULL) { + // エラーメッセージは表示済み。 return false; } } @@ -65,8 +74,7 @@ SRAMDevice::Init() // SRAM の RAM 容量欄を設定値に同期させる。 // この処理はアプリケーション起動時に一回行われるのみで、 // その後の VM 内のリセット等では動作しない。 - bool sync = gConfig->Find("sram-sync-ramsize").AsInt(); - if (sync) { + if (gConfig->Find("sram-sync-ramsize").AsBool()) { SyncRAMSize(); } @@ -95,7 +103,7 @@ SRAMDevice::SyncRAMSize() } } - uint32 ramsize = GetMainRAMDevice()->GetSize(); + uint32 ramsize = (uint32)GetMainRAMDevice()->GetSize(); // 値が違う時だけ表示したいので一旦読み出して比較 uint32 cursize; @@ -242,16 +250,16 @@ SRAMDevice::Get32(uint32 offset) const return data; } -// IPLROM30 が初期化した SRAM の初期値。 +// X68030 が初期化した 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 { +// 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, @@ -263,5 +271,4 @@ SRAMDevice::InitialData { 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, };