|
|
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: //
1.1.1.7 root 8: // FuseROM (82S129)
1.1.1.5 root 9: //
1.1.1.2 root 10:
11: // FuseROM は 128 バイト分のデータを保持できる 4bit ROM みたいなものっぽい。
1.1.1.7 root 12: // 読み出しは1バイトが上位下位ニブルに分割して読める。そして LUNA-88K バス
1.1.1.2 root 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.1.7 root 27: //
28: // デバイスに繋がっている4ビット以外の 28ビットのところは実際には
29: // $f'ffffff ではなく $4'00c001 であることが多いが時々数ビット異なる。
30: // その時のアクセスのパターンから決まる直近の残像のようなものに見える。
31: // この辺をどこまで再現するかは疑問。
1.1 root 32:
1.1.1.5 root 33: #include "fuserom.h"
34: #include "ethernet.h"
35: #include "mainapp.h"
36:
37: // コンストラクタ
1.1 root 38: FuseROMDevice::FuseROMDevice()
1.1.1.7 root 39: : inherited(OBJ_FUSEROM)
1.1 root 40: {
41: }
42:
1.1.1.5 root 43: // デストラクタ
1.1 root 44: FuseROMDevice::~FuseROMDevice()
45: {
46: }
47:
1.1.1.7 root 48: // 初期化
1.1 root 49: bool
50: FuseROMDevice::Init()
51: {
1.1.1.7 root 52: if (inherited::Init() == false) {
53: return false;
54: }
55:
1.1.1.5 root 56: uint8 checksum = 0;
57:
1.1.1.10! root 58: // XXX 初期値は未調査
1.1 root 59:
1.1.1.2 root 60: // src に元データを用意する。
1.1.1.7 root 61: if (gMainApp.IsLUNA88K()) {
62: // LUNA-88K なら先頭が MAC アドレス
63: macaddr_t macaddr;
1.1.1.8 root 64: if (EthernetDevice::GetConfigMacAddr(0, &macaddr, false) == false) {
1.1.1.7 root 65: // エラーメッセージは表示済み
66: return false;
67: }
68: putmsg(1, "macaddr=%s", macaddr.ToString(':').c_str());
1.1.1.10! root 69: strlcpy((char *)&src[0], "ENADDR=", src.size());
! 70: strlcpy((char *)&src[7], macaddr.ToString().c_str(), src.size() - 7);
1.1.1.2 root 71: } else {
1.1.1.7 root 72: // LUNA-88K2 なら先頭が機種名 (MAC アドレスは NVRAM にある) のようだ。
1.1 root 73: }
1.1.1.2 root 74:
1.1.1.5 root 75: // 最終バイトはチェックバイト (Mach の kernel/luna88k/autoconf.c より)
1.1.1.10! root 76: for (int i = 0; i < src.size() - 1; i++) {
1.1.1.5 root 77: checksum ^= src[i];
78: }
1.1.1.10! root 79: src[src.size() - 1] = checksum;
1.1.1.5 root 80:
1.1 root 81: return true;
82: }
1.1.1.2 root 83:
1.1.1.9 root 84: busdata
1.1.1.10! root 85: FuseROMDevice::ReadPort(uint32 offset)
1.1.1.2 root 86: {
1.1.1.10! root 87: busdata data = GetByte(offset);
! 88: data |= BusData::Size1;
! 89: return data;
1.1.1.2 root 90: }
91:
1.1.1.9 root 92: busdata
1.1.1.10! root 93: FuseROMDevice::WritePort(uint32 offset, uint32 data)
1.1.1.2 root 94: {
1.1.1.10! root 95: return BusData::Size1;
1.1.1.2 root 96: }
97:
1.1.1.10! root 98: // ReadPort() からも呼ばれる
1.1.1.9 root 99: busdata
1.1.1.10! root 100: FuseROMDevice::PeekPort(uint32 offset)
! 101: {
! 102: return GetByte(offset);
! 103: }
! 104:
! 105: bool
! 106: FuseROMDevice::PokePort(uint32 offset, uint32 data)
! 107: {
! 108: return false;
! 109: }
! 110:
! 111: // offset の位置の値を返す
! 112: uint8
! 113: FuseROMDevice::GetByte(uint32 offset) const
1.1.1.2 root 114: {
115: uint8 data;
1.1.1.3 root 116: if ((offset & 1) == 0) {
1.1.1.2 root 117: // 上位ニブル
1.1.1.3 root 118: data = src[offset / 2];
1.1.1.2 root 119: } else {
120: // 下位ニブル
1.1.1.3 root 121: data = (src[offset / 2] & 0x0f) << 4;
1.1.1.2 root 122: }
123: return data | 0x0f;
124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.