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