|
|
1.1 root 1: //
2: // nono
1.1.1.2 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
7: #include "fuserom.h"
1.1.1.2 root 8: #include "ethernet.h"
9: #include "mainapp.h"
10:
11: // FuseROM は 128 バイト分のデータを保持できる 4bit ROM みたいなものっぽい。
12: // 読み出しは1バイトが上位下位ニブルに分割して読める。そして LUNA88K バス
13: // なのでそれが 1ワード(1ロングワード) 境界ごとに配置される。
14: //
15: // 例えば "01" という2バイトはゲストからは次のような 16バイトとして読める。
16: //
17: // +00 +01 +02 +03 +04 +05 +06 +07 +08 +09 +0a +0b +0c +0d +0e +0f
18: // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
19: // | 3f| ff| ff| ff| 0f| ff| ff| ff| 3f| ff| ff| ff| 1f| ff| ff| ff|
20: // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
21: // $3 $0 $3 $1
22: //
23: // ここでは src[128] に元データを8ビット(バイト)単位で、つまり上の例の
24: // "01" のように人間が読める形式で用意しておき、アクセス時に都度ニブルに
25: // 変換して (さらに BusIO_BFFF<> 経由して) 返すことにする。
26: // どうせ大したアクセス量でもないので、細かいことは気にしない。
1.1 root 27:
1.1.1.3 root 28: std::unique_ptr<FuseROMDevice> gFuseROM;
29:
1.1 root 30: FuseROMDevice::FuseROMDevice()
1.1.1.4 ! root 31: : inherited("FuseROM")
1.1 root 32: {
33: }
34:
35: FuseROMDevice::~FuseROMDevice()
36: {
37: }
38:
39: bool
40: FuseROMDevice::Init()
41: {
1.1.1.2 root 42: memset(src, 0, sizeof(src)); // XXX 未調査
1.1 root 43:
1.1.1.2 root 44: // src に元データを用意する。
45: if (gMainApp.GetVMType() == VMTYPE_LUNA88K) {
46: // LUNA88K なら先頭が MAC アドレス
47: macaddr_t macaddr = gEthernet->GetMacAddr();
48: strcpy((char *)src, "ENADDR=");
49: strcpy((char *)src + 7, macaddr.to_string().c_str());
50: } else {
51: // LUNA88K2 なら先頭が機種名 (MAC アドレスは NVRAM にある) のようだ。
1.1 root 52: }
1.1.1.2 root 53:
1.1 root 54: return true;
55: }
1.1.1.2 root 56:
57: uint64
1.1.1.3 root 58: FuseROMDevice::Read(uint32 offset)
1.1.1.2 root 59: {
1.1.1.3 root 60: return Peek(offset);
1.1.1.2 root 61: }
62:
63: uint64
1.1.1.3 root 64: FuseROMDevice::Write(uint32 offset, uint32 data)
1.1.1.2 root 65: {
66: return 0;
67: }
68:
69: // Read() からも呼ばれる
70: uint64
1.1.1.3 root 71: FuseROMDevice::Peek(uint32 offset)
1.1.1.2 root 72: {
73: uint8 data;
1.1.1.3 root 74: if ((offset & 1) == 0) {
1.1.1.2 root 75: // 上位ニブル
1.1.1.3 root 76: data = src[offset / 2];
1.1.1.2 root 77: } else {
78: // 下位ニブル
1.1.1.3 root 79: data = (src[offset / 2] & 0x0f) << 4;
1.1.1.2 root 80: }
81: return data | 0x0f;
82: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.