Annotation of nono/vm/partialram.cpp, revision 1.1.1.6

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

unix.superglobalmegacorp.com

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