--- nono/vm/fuserom.cpp 2026/04/29 17:04:35 1.1.1.2 +++ nono/vm/fuserom.cpp 2026/04/29 17:05:14 1.1.1.6 @@ -4,9 +4,9 @@ // Licensed under nono-license.txt // -#include "fuserom.h" -#include "ethernet.h" -#include "mainapp.h" +// +// FuseROM +// // FuseROM は 128 バイト分のデータを保持できる 4bit ROM みたいなものっぽい。 // 読み出しは1バイトが上位下位ニブルに分割して読める。そして LUNA88K バス @@ -25,57 +25,74 @@ // 変換して (さらに BusIO_BFFF<> 経由して) 返すことにする。 // どうせ大したアクセス量でもないので、細かいことは気にしない。 +#include "fuserom.h" +#include "ethernet.h" +#include "mainapp.h" + +// グローバル参照用 +FuseROMDevice *gFuseROM; + +// コンストラクタ FuseROMDevice::FuseROMDevice() - : inherited() + : inherited("FuseROM") { - logname = "fuserom"; } +// デストラクタ FuseROMDevice::~FuseROMDevice() { + gFuseROM = NULL; } bool FuseROMDevice::Init() { + uint8 checksum = 0; + memset(src, 0, sizeof(src)); // XXX 未調査 // src に元データを用意する。 - if (gMainApp.GetVMType() == VMTYPE_LUNA88K) { + if (gMainApp.GetVMType() == VMType::LUNA88K) { // LUNA88K なら先頭が MAC アドレス macaddr_t macaddr = gEthernet->GetMacAddr(); strcpy((char *)src, "ENADDR="); - strcpy((char *)src + 7, macaddr.to_string().c_str()); + strcpy((char *)src + 7, macaddr.ToString().c_str()); } else { // LUNA88K2 なら先頭が機種名 (MAC アドレスは NVRAM にある) のようだ。 } + // 最終バイトはチェックバイト (Mach の kernel/luna88k/autoconf.c より) + for (int i = 0; i < sizeof(src) - 1; i++) { + checksum ^= src[i]; + } + src[sizeof(src) - 1] = checksum; + return true; } uint64 -FuseROMDevice::Read(uint32 addr) +FuseROMDevice::Read(uint32 offset) { - return Peek(addr); + return Peek(offset); } uint64 -FuseROMDevice::Write(uint32 addr, uint32 data) +FuseROMDevice::Write(uint32 offset, uint32 data) { return 0; } // Read() からも呼ばれる uint64 -FuseROMDevice::Peek(uint32 addr) +FuseROMDevice::Peek(uint32 offset) { uint8 data; - if ((addr & 1) == 0) { + if ((offset & 1) == 0) { // 上位ニブル - data = src[addr / 2]; + data = src[offset / 2]; } else { // 下位ニブル - data = (src[addr / 2] & 0x0f) << 4; + data = (src[offset / 2] & 0x0f) << 4; } return data | 0x0f; }