|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
1.1.1.3 ! root 8: // LUNA* の RAM のうち 16MB に満たないメモリブロックを担当する人
1.1 root 9: //
1.1.1.3 ! root 10:
1.1 root 11: // devtable[] は1エントリで 16MB の空間を担当するが LUNA-I のメインメモリは
12: // 4MB、8MB、12MB と 16MB 未満の構成があり得る。また 16MB 以上にメモリを
1.1.1.2 root 13: // 増設する場合でも ROM の容量チェックが末尾に NopIODevice の番兵を必要と
1.1 root 14: // するため、ここを 16MB 単位での増減にしていると、最大搭載量は 256MB では
15: // なく 240MB になってしまう。中途半端な上に分かりづらいので 255MB まで
16: // 使いたい。そうするとこのデバイスは単に任意のアドレスから 16MB に満たない
17: // 1ブロックを担当する人であればよくて、それを devtable[] のどこに割り当てる
18: // かは VM::Init() 側が決めればよい。
19: //
1.1.1.2 root 20: // なおこのデバイス自身は RAM を持たず、バックエンドの gRAM (と NopIODevice)
1.1 root 21: // への切り替えスイッチなだけ (XIOSpace のような立場)。
22: // また、X68030 の場合は XIOSpace がすでに同様の処理を (8KB 単位で) 行って
1.1.1.2 root 23: // いるのと、そもそも RAM がないところは NopIO ではなく BusError という違いも
1.1 root 24: // あるのでここでは担当しない。
25:
1.1.1.3 ! root 26: #include "ram_partial.h"
! 27: #include "ram.h"
! 28:
! 29: // グローバル参照用
! 30: PartialRAMDevice *gPartialRAM;
1.1 root 31:
32: // コンストラクタ
33: PartialRAMDevice::PartialRAMDevice()
1.1.1.2 root 34: : inherited("PartialRAM")
1.1 root 35: {
1.1.1.3 ! root 36: // こいつはプロキシだし今の所ログも出力しないので、指定できる必要ない。
! 37: ClearAlias();
1.1 root 38: }
39:
40: // デストラクタ
41: PartialRAMDevice::~PartialRAMDevice()
42: {
1.1.1.3 ! root 43: gPartialRAM = NULL;
1.1 root 44: }
45:
46: bool
47: PartialRAMDevice::Init()
48: {
49: // SearchDevice() で使うための RAM サイズをここで取得する。
50: // ただしこのデバイスがどこに割り当てられるか (或いは割り当てられないか)
51: // はこの後の VM_LUNA*::Init() で判断するため、ここではチェックなどは
52: // 行わない。
53: ram_size = gRAM->GetSize();
54:
55: // ショートカット
1.1.1.3 ! root 56: ramdev = gRAM;
! 57: nopdev = gNopIO;
1.1 root 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: // メモリのないところをアクセスした時のウェイトは無視
1.1.1.2 root 69: return nopdev;
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.