Annotation of nono/vm/fuserom.cpp, revision 1.1.1.10

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.