|
|
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:
28: FuseROMDevice::FuseROMDevice()
29: : inherited()
30: {
31: logname = "fuserom";
32: }
33:
34: FuseROMDevice::~FuseROMDevice()
35: {
36: }
37:
38: bool
39: FuseROMDevice::Init()
40: {
1.1.1.2 ! root 41: memset(src, 0, sizeof(src)); // XXX 未調査
1.1 root 42:
1.1.1.2 ! root 43: // src に元データを用意する。
! 44: if (gMainApp.GetVMType() == VMTYPE_LUNA88K) {
! 45: // LUNA88K なら先頭が MAC アドレス
! 46: macaddr_t macaddr = gEthernet->GetMacAddr();
! 47: strcpy((char *)src, "ENADDR=");
! 48: strcpy((char *)src + 7, macaddr.to_string().c_str());
! 49: } else {
! 50: // LUNA88K2 なら先頭が機種名 (MAC アドレスは NVRAM にある) のようだ。
1.1 root 51: }
1.1.1.2 ! root 52:
1.1 root 53: return true;
54: }
1.1.1.2 ! root 55:
! 56: uint64
! 57: FuseROMDevice::Read(uint32 addr)
! 58: {
! 59: return Peek(addr);
! 60: }
! 61:
! 62: uint64
! 63: FuseROMDevice::Write(uint32 addr, uint32 data)
! 64: {
! 65: return 0;
! 66: }
! 67:
! 68: // Read() からも呼ばれる
! 69: uint64
! 70: FuseROMDevice::Peek(uint32 addr)
! 71: {
! 72: uint8 data;
! 73: if ((addr & 1) == 0) {
! 74: // 上位ニブル
! 75: data = src[addr / 2];
! 76: } else {
! 77: // 下位ニブル
! 78: data = (src[addr / 2] & 0x0f) << 4;
! 79: }
! 80: return data | 0x0f;
! 81: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.