|
|
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.