--- nono/vm/fuserom.cpp 2026/04/29 17:04:50 1.1.1.3 +++ 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,33 +25,48 @@ // 変換して (さらに BusIO_BFFF<> 経由して) 返すことにする。 // どうせ大したアクセス量でもないので、細かいことは気にしない。 -std::unique_ptr gFuseROM; +#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; }