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

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
1.1.1.3 ! root        8: // LUNA* の RAM のうち 16MB に満たないメモリブロックを担当する人
1.1       root        9: //
1.1.1.3 ! root       10: 
1.1       root       11: // devtable[] は1エントリで 16MB の空間を担当するが LUNA-I のメインメモリは
                     12: // 4MB、8MB、12MB と 16MB 未満の構成があり得る。また 16MB 以上にメモリを
1.1.1.2   root       13: // 増設する場合でも ROM の容量チェックが末尾に NopIODevice の番兵を必要と
1.1       root       14: // するため、ここを 16MB 単位での増減にしていると、最大搭載量は 256MB では
                     15: // なく 240MB になってしまう。中途半端な上に分かりづらいので 255MB まで
                     16: // 使いたい。そうするとこのデバイスは単に任意のアドレスから 16MB に満たない
                     17: // 1ブロックを担当する人であればよくて、それを devtable[] のどこに割り当てる
                     18: // かは VM::Init() 側が決めればよい。
                     19: //
1.1.1.2   root       20: // なおこのデバイス自身は RAM を持たず、バックエンドの gRAM (と NopIODevice)
1.1       root       21: // への切り替えスイッチなだけ (XIOSpace のような立場)。
                     22: // また、X68030 の場合は XIOSpace がすでに同様の処理を (8KB 単位で) 行って
1.1.1.2   root       23: // いるのと、そもそも RAM がないところは NopIO ではなく BusError という違いも
1.1       root       24: // あるのでここでは担当しない。
                     25: 
1.1.1.3 ! root       26: #include "ram_partial.h"
        !            27: #include "ram.h"
        !            28: 
        !            29: // グローバル参照用
        !            30: PartialRAMDevice *gPartialRAM;
1.1       root       31: 
                     32: // コンストラクタ
                     33: PartialRAMDevice::PartialRAMDevice()
1.1.1.2   root       34:        : inherited("PartialRAM")
1.1       root       35: {
1.1.1.3 ! root       36:        // こいつはプロキシだし今の所ログも出力しないので、指定できる必要ない。
        !            37:        ClearAlias();
1.1       root       38: }
                     39: 
                     40: // デストラクタ
                     41: PartialRAMDevice::~PartialRAMDevice()
                     42: {
1.1.1.3 ! root       43:        gPartialRAM = NULL;
1.1       root       44: }
                     45: 
                     46: bool
                     47: PartialRAMDevice::Init()
                     48: {
                     49:        // SearchDevice() で使うための RAM サイズをここで取得する。
                     50:        // ただしこのデバイスがどこに割り当てられるか (或いは割り当てられないか)
                     51:        // はこの後の VM_LUNA*::Init() で判断するため、ここではチェックなどは
                     52:        // 行わない。
                     53:        ram_size = gRAM->GetSize();
                     54: 
                     55:        // ショートカット
1.1.1.3 ! root       56:        ramdev = gRAM;
        !            57:        nopdev = gNopIO;
1.1       root       58: 
                     59:        return true;
                     60: }
                     61: 
                     62: inline IODevice *
                     63: PartialRAMDevice::SearchDevice(uint32 addr) const
                     64: {
                     65:        if (__predict_true(addr < ram_size)) {
                     66:                return ramdev;
                     67:        } else {
                     68:                // メモリのないところをアクセスした時のウェイトは無視
1.1.1.2   root       69:                return nopdev;
1.1       root       70:        }
                     71: }
                     72: 
                     73: uint64
                     74: PartialRAMDevice::Read8(uint32 addr)
                     75: {
                     76:        IODevice *d = SearchDevice(addr);
                     77:        return d->Read8(addr);
                     78: }
                     79: 
                     80: uint64
                     81: PartialRAMDevice::Read16(uint32 addr)
                     82: {
                     83:        IODevice *d = SearchDevice(addr);
                     84:        return d->Read16(addr);
                     85: }
                     86: 
                     87: uint64
                     88: PartialRAMDevice::Read32(uint32 addr)
                     89: {
                     90:        IODevice *d = SearchDevice(addr);
                     91:        return d->Read32(addr);
                     92: }
                     93: 
                     94: uint64
                     95: PartialRAMDevice::Write8(uint32 addr, uint32 data)
                     96: {
                     97:        IODevice *d = SearchDevice(addr);
                     98:        return d->Write8(addr, data);
                     99: }
                    100: 
                    101: uint64
                    102: PartialRAMDevice::Write16(uint32 addr, uint32 data)
                    103: {
                    104:        IODevice *d = SearchDevice(addr);
                    105:        return d->Write16(addr, data);
                    106: }
                    107: 
                    108: uint64
                    109: PartialRAMDevice::Write32(uint32 addr, uint32 data)
                    110: {
                    111:        IODevice *d = SearchDevice(addr);
                    112:        return d->Write32(addr, data);
                    113: }
                    114: 
                    115: uint64
                    116: PartialRAMDevice::Peek8(uint32 addr)
                    117: {
                    118:        IODevice *d = SearchDevice(addr);
                    119:        return d->Peek8(addr);
                    120: }

unix.superglobalmegacorp.com

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