|
|
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: ramdev = GetMainRAMDevice();
47: nopdev = GetNopIODevice();
48:
49: // SearchDevice() で使うための RAM サイズをここで取得する。
50: // ただしこのデバイスがどこに割り当てられるか (或いは割り当てられないか)
51: // はこの後の VM_LUNA*::Init() で判断するため、ここではチェックなどは
52: // 行わない。
53: ram_size = ramdev->GetSize();
54:
55: return true;
56: }
57:
58: inline IODevice *
59: PartialRAMDevice::SearchDevice(uint32 addr) const
60: {
61: if (__predict_true(addr < ram_size)) {
62: return ramdev;
63: } else {
64: // メモリのないところをアクセスした時のウェイトは無視
65: return nopdev;
66: }
67: }
68:
1.1.1.2 root 69: busdata
1.1.1.3 root 70: PartialRAMDevice::Read(busaddr addr)
1.1 root 71: {
1.1.1.3 root 72: IODevice *d = SearchDevice(addr.Addr());
73: return d->Read(addr);
1.1 root 74: }
75:
1.1.1.2 root 76: busdata
1.1.1.3 root 77: PartialRAMDevice::Write(busaddr addr, uint32 data)
1.1 root 78: {
1.1.1.3 root 79: IODevice *d = SearchDevice(addr.Addr());
80: return d->Write(addr, data);
1.1 root 81: }
82:
1.1.1.2 root 83: busdata
1.1.1.3 root 84: PartialRAMDevice::Peek1(uint32 addr)
1.1 root 85: {
86: IODevice *d = SearchDevice(addr);
1.1.1.3 root 87: return d->Peek1(addr);
1.1 root 88: }
89:
1.1.1.2 root 90: bool
1.1.1.3 root 91: PartialRAMDevice::Poke1(uint32 addr, uint32 data)
1.1 root 92: {
1.1.1.2 root 93: IODevice *d = SearchDevice(addr);
1.1.1.3 root 94: return d->Poke1(addr, data);
1.1 root 95: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.