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

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

unix.superglobalmegacorp.com

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