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

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: //
        !            20: // なおこのデバイス自身は RAM を持たず、バックエンドの gMainRAM
        !            21: // (と NopIODevice) への切り替えスイッチなだけ (X68kIO のような立場)。
        !            22: // また、X68030 の場合は X68kIO がすでに同様の処理を (8KB 単位で) 行って
        !            23: // いるのと、そもそも RAM がないところは NopIO ではなく BusError という違いも
        !            24: // あるのでここでは担当しない。
        !            25: 
        !            26: #include "partialram.h"
        !            27: #include "mainram.h"
        !            28: 
        !            29: // コンストラクタ
        !            30: PartialRAMDevice::PartialRAMDevice()
        !            31:        : inherited(OBJ_PARTIAL_RAM)
        !            32: {
        !            33:        // こいつはプロキシだし今の所ログも出力しないので、指定できる必要ない。
        !            34:        ClearAlias();
        !            35: }
        !            36: 
        !            37: // デストラクタ
        !            38: PartialRAMDevice::~PartialRAMDevice()
        !            39: {
        !            40: }
        !            41: 
        !            42: // 初期化
        !            43: bool
        !            44: PartialRAMDevice::Init()
        !            45: {
        !            46:        if (inherited::Init() == false) {
        !            47:                return false;
        !            48:        }
        !            49: 
        !            50:        ramdev = GetMainRAMDevice();
        !            51:        nopdev = GetNopIODevice();
        !            52: 
        !            53:        // SearchDevice() で使うための RAM サイズをここで取得する。
        !            54:        // ただしこのデバイスがどこに割り当てられるか (或いは割り当てられないか)
        !            55:        // はこの後の VM_LUNA*::Init() で判断するため、ここではチェックなどは
        !            56:        // 行わない。
        !            57:        ram_size = ramdev->GetSize();
        !            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:                // メモリのないところをアクセスした時のウェイトは無視
        !            69:                return nopdev;
        !            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: }
        !           121: 
        !           122: // このアドレスを担当する次段の IODevice を返す (IOContainerDevice 用)
        !           123: IODevice *
        !           124: PartialRAMDevice::GetDevice(uint32 addr) const
        !           125: {
        !           126:        return SearchDevice(addr);
        !           127: }

unix.superglobalmegacorp.com

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