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