--- nono/vm/rom.cpp 2026/04/29 17:04:29 1.1.1.2 +++ nono/vm/rom.cpp 2026/04/29 17:04:36 1.1.1.3 @@ -1,14 +1,12 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // -#include -#include -#include -#include #include "rom.h" -#include "configfile.h" +#include "mainapp.h" +#include "mystring.h" // // ROM 共通部 @@ -26,10 +24,6 @@ ROMDevice::ROMDevice() ROMDevice::~ROMDevice() { - if (file) { - free(file); - file = NULL; - } } // name の ROM を探してロードする。 @@ -39,53 +33,20 @@ ROMDevice::~ROMDevice() bool ROMDevice::LoadROM(const char *name, int size) { - struct stat st; - - filename = gConfig->SearchFile(name); + filename = gMainApp.SearchFile(name); if (filename.empty()) { warnx("%s not found", name); return false; } // オープン - fd = open(filename.c_str(), O_RDONLY); - if (fd == -1) { - warn("ROM \"%s\" open failed", filename.c_str()); - return false; - } - - // ファイルサイズをチェック。 - // ファイルが短くても mmap はしれっと成功してしまうようだ。 - if (fstat(fd, &st) == -1) { - warn("ROM \"%s\" fstat failed", filename.c_str()); - close(fd); - return false; - } - if (st.st_size < size) { - warnx("ROM \"%s\" is too short (filesize is expected %d but %d)", - filename.c_str(), size, (int)st.st_size); - close(fd); - return false; - } - if (st.st_size > size) { - // 大きすぎるほうはワーニングだけでいいか - warnx("ROM \"%s\" is too large (ignore %d bytes)", - filename.c_str(), (int)st.st_size - size); - } - - // mmap - // ファイルには書き戻さないけど、オンメモリでハックを入れることが - // できるように MAP_PRIVATE を指定する。 - filesize = size; - file = (uint8 *)mmap(NULL, filesize, PROT_READ | PROT_WRITE, - MAP_PRIVATE, fd, 0); - if (file == MAP_FAILED) { - warn("ROM \"%s\" mmap failed", filename.c_str()); - close(fd); + file.SetFilename(filename); + file.SetDispname(string_format("ROM \"%s\"", filename.c_str())); + mem = file.OpenRdOnly((off_t)size); + if (mem == NULL) { return false; } - mem = file; return true; }