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