--- nono/vm/rom.cpp 2026/04/29 17:04:29 1.1.1.2 +++ nono/vm/rom.cpp 2026/04/29 17:04:50 1.1.1.5 @@ -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 "mpu.h" // // ROM 共通部 @@ -26,10 +24,12 @@ ROMDevice::ROMDevice() ROMDevice::~ROMDevice() { - if (file) { - free(file); - file = NULL; - } +} + +void +ROMDevice::ResetHard() +{ + wait = 0; } // name の ROM を探してロードする。 @@ -39,65 +39,34 @@ 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; } uint64 ROMDevice::Read8(uint32 addr) { + gMPU->AddCycle(wait); return mem[addr & mask]; } uint64 ROMDevice::Read16(uint32 addr) { + gMPU->AddCycle(wait); uint16 data; data = *(uint16 *)&mem[addr & mask]; return be16toh(data); @@ -106,6 +75,7 @@ ROMDevice::Read16(uint32 addr) uint64 ROMDevice::Read32(uint32 addr) { + gMPU->AddCycle(wait); uint32 data; data = *(uint32 *)&mem[addr & mask]; return be32toh(data); @@ -114,18 +84,21 @@ ROMDevice::Read32(uint32 addr) uint64 ROMDevice::Write8(uint32 addr, uint32 data) { + gMPU->AddCycle(wait); // ? return (uint64)-1; } uint64 ROMDevice::Write16(uint32 addr, uint32 data) { + gMPU->AddCycle(wait); // ? return (uint64)-1; } uint64 ROMDevice::Write32(uint32 addr, uint32 data) { + gMPU->AddCycle(wait); // ? return (uint64)-1; }