|
|
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.1.3 ! root 74: PartialRAMDevice::Read(busaddr addr)
1.1 root 75: {
1.1.1.3 ! root 76: IODevice *d = SearchDevice(addr.Addr());
! 77: return d->Read(addr);
1.1 root 78: }
79:
1.1.1.2 root 80: busdata
1.1.1.3 ! root 81: PartialRAMDevice::Write(busaddr addr, uint32 data)
1.1 root 82: {
1.1.1.3 ! root 83: IODevice *d = SearchDevice(addr.Addr());
! 84: return d->Write(addr, data);
1.1 root 85: }
86:
1.1.1.2 root 87: busdata
1.1.1.3 ! root 88: PartialRAMDevice::Peek1(uint32 addr)
1.1 root 89: {
90: IODevice *d = SearchDevice(addr);
1.1.1.3 ! root 91: return d->Peek1(addr);
1.1 root 92: }
93:
1.1.1.2 root 94: bool
1.1.1.3 ! root 95: PartialRAMDevice::Poke1(uint32 addr, uint32 data)
1.1 root 96: {
1.1.1.2 root 97: IODevice *d = SearchDevice(addr);
1.1.1.3 ! root 98: return d->Poke1(addr, data);
1.1 root 99: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.