|
|
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:
1.1.1.5 root 7: //
8: // FuseROM
9: //
1.1.1.2 root 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.5 root 28: #include "fuserom.h"
29: #include "ethernet.h"
30: #include "mainapp.h"
31:
32: // グローバル参照用
33: FuseROMDevice *gFuseROM;
1.1.1.3 root 34:
1.1.1.5 root 35: // コンストラクタ
1.1 root 36: FuseROMDevice::FuseROMDevice()
1.1.1.4 root 37: : inherited("FuseROM")
1.1 root 38: {
39: }
40:
1.1.1.5 root 41: // デストラクタ
1.1 root 42: FuseROMDevice::~FuseROMDevice()
43: {
1.1.1.5 root 44: gFuseROM = NULL;
1.1 root 45: }
46:
47: bool
48: FuseROMDevice::Init()
49: {
1.1.1.5 root 50: uint8 checksum = 0;
51:
1.1.1.2 root 52: memset(src, 0, sizeof(src)); // XXX 未調査
1.1 root 53:
1.1.1.2 root 54: // src に元データを用意する。
1.1.1.6 ! root 55: if (gMainApp.GetVMType() == VMType::LUNA88K) {
1.1.1.2 root 56: // LUNA88K なら先頭が MAC アドレス
57: macaddr_t macaddr = gEthernet->GetMacAddr();
58: strcpy((char *)src, "ENADDR=");
1.1.1.5 root 59: strcpy((char *)src + 7, macaddr.ToString().c_str());
1.1.1.2 root 60: } else {
61: // LUNA88K2 なら先頭が機種名 (MAC アドレスは NVRAM にある) のようだ。
1.1 root 62: }
1.1.1.2 root 63:
1.1.1.5 root 64: // 最終バイトはチェックバイト (Mach の kernel/luna88k/autoconf.c より)
65: for (int i = 0; i < sizeof(src) - 1; i++) {
66: checksum ^= src[i];
67: }
68: src[sizeof(src) - 1] = checksum;
69:
1.1 root 70: return true;
71: }
1.1.1.2 root 72:
73: uint64
1.1.1.3 root 74: FuseROMDevice::Read(uint32 offset)
1.1.1.2 root 75: {
1.1.1.3 root 76: return Peek(offset);
1.1.1.2 root 77: }
78:
79: uint64
1.1.1.3 root 80: FuseROMDevice::Write(uint32 offset, uint32 data)
1.1.1.2 root 81: {
82: return 0;
83: }
84:
85: // Read() からも呼ばれる
86: uint64
1.1.1.3 root 87: FuseROMDevice::Peek(uint32 offset)
1.1.1.2 root 88: {
89: uint8 data;
1.1.1.3 root 90: if ((offset & 1) == 0) {
1.1.1.2 root 91: // 上位ニブル
1.1.1.3 root 92: data = src[offset / 2];
1.1.1.2 root 93: } else {
94: // 下位ニブル
1.1.1.3 root 95: data = (src[offset / 2] & 0x0f) << 4;
1.1.1.2 root 96: }
97: return data | 0x0f;
98: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.