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

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

unix.superglobalmegacorp.com

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