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

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

unix.superglobalmegacorp.com

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