--- nono/vm/fuserom.cpp 2026/04/29 17:04:55 1.1.1.4 +++ nono/vm/fuserom.cpp 2026/04/29 17:05:10 1.1.1.5 @@ -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,20 +25,30 @@ // 変換して (さらに BusIO_BFFF<> 経由して) 返すことにする。 // どうせ大したアクセス量でもないので、細かいことは気にしない。 -std::unique_ptr gFuseROM; +#include "fuserom.h" +#include "ethernet.h" +#include "mainapp.h" + +// グローバル参照用 +FuseROMDevice *gFuseROM; +// コンストラクタ FuseROMDevice::FuseROMDevice() : inherited("FuseROM") { } +// デストラクタ FuseROMDevice::~FuseROMDevice() { + gFuseROM = NULL; } bool FuseROMDevice::Init() { + uint8 checksum = 0; + memset(src, 0, sizeof(src)); // XXX 未調査 // src に元データを用意する。 @@ -46,11 +56,17 @@ FuseROMDevice::Init() // 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; }