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

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

unix.superglobalmegacorp.com

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