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

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 に元データを用意する。
                     55:        if (gMainApp.GetVMType() == VMTYPE_LUNA88K) {
                     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: }

unix.superglobalmegacorp.com

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