|
|
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:
1.1.1.2 ! root 73: busdata
1.1 root 74: PartialRAMDevice::Read8(uint32 addr)
75: {
76: IODevice *d = SearchDevice(addr);
77: return d->Read8(addr);
78: }
79:
1.1.1.2 ! root 80: busdata
1.1 root 81: PartialRAMDevice::Read16(uint32 addr)
82: {
83: IODevice *d = SearchDevice(addr);
84: return d->Read16(addr);
85: }
86:
1.1.1.2 ! root 87: busdata
1.1 root 88: PartialRAMDevice::Read32(uint32 addr)
89: {
90: IODevice *d = SearchDevice(addr);
91: return d->Read32(addr);
92: }
93:
1.1.1.2 ! root 94: busdata
1.1 root 95: PartialRAMDevice::Write8(uint32 addr, uint32 data)
96: {
97: IODevice *d = SearchDevice(addr);
98: return d->Write8(addr, data);
99: }
100:
1.1.1.2 ! root 101: busdata
1.1 root 102: PartialRAMDevice::Write16(uint32 addr, uint32 data)
103: {
104: IODevice *d = SearchDevice(addr);
105: return d->Write16(addr, data);
106: }
107:
1.1.1.2 ! root 108: busdata
1.1 root 109: PartialRAMDevice::Write32(uint32 addr, uint32 data)
110: {
111: IODevice *d = SearchDevice(addr);
112: return d->Write32(addr, data);
113: }
114:
1.1.1.2 ! root 115: busdata
1.1 root 116: PartialRAMDevice::Peek8(uint32 addr)
117: {
118: IODevice *d = SearchDevice(addr);
119: return d->Peek8(addr);
120: }
121:
1.1.1.2 ! root 122: bool
! 123: PartialRAMDevice::Poke8(uint32 addr, uint32 data)
1.1 root 124: {
1.1.1.2 ! root 125: IODevice *d = SearchDevice(addr);
! 126: return d->Poke8(addr, data);
1.1 root 127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.