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

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

unix.superglobalmegacorp.com

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