|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.