|
|
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: //
1.1.1.6 ! root 20: // なおこのデバイス自身は RAM を持たず、バックエンドの MainRAMDevice
1.1 root 21: // (と NopIODevice) への切り替えスイッチなだけ (X68kIO のような立場)。
22: // また、X68030 の場合は X68kIO がすでに同様の処理を (8KB 単位で) 行って
23: // いるのと、そもそも RAM がないところは NopIO ではなく BusError という違いも
24: // あるのでここでは担当しない。
25:
26: #include "partialram.h"
27: #include "mainram.h"
1.1.1.6 ! root 28: #include "nop.h"
1.1 root 29:
30: // コンストラクタ
31: PartialRAMDevice::PartialRAMDevice()
32: : inherited(OBJ_PARTIAL_RAM)
33: {
34: // こいつはプロキシだし今の所ログも出力しないので、指定できる必要ない。
35: ClearAlias();
36: }
37:
38: // デストラクタ
39: PartialRAMDevice::~PartialRAMDevice()
40: {
41: }
42:
43: // 初期化
44: bool
45: PartialRAMDevice::Init()
46: {
47: ramdev = GetMainRAMDevice();
48: nopdev = GetNopIODevice();
49:
50: // SearchDevice() で使うための RAM サイズをここで取得する。
51: // ただしこのデバイスがどこに割り当てられるか (或いは割り当てられないか)
52: // はこの後の VM_LUNA*::Init() で判断するため、ここではチェックなどは
53: // 行わない。
1.1.1.5 root 54: ram_size = (uint32)ramdev->GetSize();
1.1 root 55:
56: return true;
57: }
58:
59: inline IODevice *
60: PartialRAMDevice::SearchDevice(uint32 addr) const
61: {
62: if (__predict_true(addr < ram_size)) {
63: return ramdev;
64: } else {
65: // メモリのないところをアクセスした時のウェイトは無視
66: return nopdev;
67: }
68: }
69:
1.1.1.2 root 70: busdata
1.1.1.3 root 71: PartialRAMDevice::Read(busaddr addr)
1.1 root 72: {
1.1.1.3 root 73: IODevice *d = SearchDevice(addr.Addr());
74: return d->Read(addr);
1.1 root 75: }
76:
1.1.1.2 root 77: busdata
1.1.1.3 root 78: PartialRAMDevice::Write(busaddr addr, uint32 data)
1.1 root 79: {
1.1.1.3 root 80: IODevice *d = SearchDevice(addr.Addr());
81: return d->Write(addr, data);
1.1 root 82: }
83:
1.1.1.2 root 84: busdata
1.1.1.3 root 85: PartialRAMDevice::Peek1(uint32 addr)
1.1 root 86: {
87: IODevice *d = SearchDevice(addr);
1.1.1.3 root 88: return d->Peek1(addr);
1.1 root 89: }
90:
1.1.1.2 root 91: bool
1.1.1.3 root 92: PartialRAMDevice::Poke1(uint32 addr, uint32 data)
1.1 root 93: {
1.1.1.2 root 94: IODevice *d = SearchDevice(addr);
1.1.1.3 root 95: return d->Poke1(addr, data);
1.1 root 96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.