|
|
nono 0.3.0
//
// nono
// Copyright (C) 2020 nono project
// Licensed under nono-license.txt
//
//
// LUNA* の RAM のうち 16MB に満たないメモリブロックを担当する人
//
// devtable[] は1エントリで 16MB の空間を担当するが LUNA-I のメインメモリは
// 4MB、8MB、12MB と 16MB 未満の構成があり得る。また 16MB 以上にメモリを
// 増設する場合でも ROM の容量チェックが末尾に NopIODevice の番兵を必要と
// するため、ここを 16MB 単位での増減にしていると、最大搭載量は 256MB では
// なく 240MB になってしまう。中途半端な上に分かりづらいので 255MB まで
// 使いたい。そうするとこのデバイスは単に任意のアドレスから 16MB に満たない
// 1ブロックを担当する人であればよくて、それを devtable[] のどこに割り当てる
// かは VM::Init() 側が決めればよい。
//
// なおこのデバイス自身は RAM を持たず、バックエンドの gRAM (と NopIODevice)
// への切り替えスイッチなだけ (XIOSpace のような立場)。
// また、X68030 の場合は XIOSpace がすでに同様の処理を (8KB 単位で) 行って
// いるのと、そもそも RAM がないところは NopIO ではなく BusError という違いも
// あるのでここでは担当しない。
#include "ram_partial.h"
#include "ram.h"
// グローバル参照用
PartialRAMDevice *gPartialRAM;
// コンストラクタ
PartialRAMDevice::PartialRAMDevice()
: inherited("PartialRAM")
{
// こいつはプロキシだし今の所ログも出力しないので、指定できる必要ない。
ClearAlias();
}
// デストラクタ
PartialRAMDevice::~PartialRAMDevice()
{
gPartialRAM = NULL;
}
bool
PartialRAMDevice::Init()
{
// SearchDevice() で使うための RAM サイズをここで取得する。
// ただしこのデバイスがどこに割り当てられるか (或いは割り当てられないか)
// はこの後の VM_LUNA*::Init() で判断するため、ここではチェックなどは
// 行わない。
ram_size = gRAM->GetSize();
// ショートカット
ramdev = gRAM;
nopdev = gNopIO;
return true;
}
inline IODevice *
PartialRAMDevice::SearchDevice(uint32 addr) const
{
if (__predict_true(addr < ram_size)) {
return ramdev;
} else {
// メモリのないところをアクセスした時のウェイトは無視
return nopdev;
}
}
uint64
PartialRAMDevice::Read8(uint32 addr)
{
IODevice *d = SearchDevice(addr);
return d->Read8(addr);
}
uint64
PartialRAMDevice::Read16(uint32 addr)
{
IODevice *d = SearchDevice(addr);
return d->Read16(addr);
}
uint64
PartialRAMDevice::Read32(uint32 addr)
{
IODevice *d = SearchDevice(addr);
return d->Read32(addr);
}
uint64
PartialRAMDevice::Write8(uint32 addr, uint32 data)
{
IODevice *d = SearchDevice(addr);
return d->Write8(addr, data);
}
uint64
PartialRAMDevice::Write16(uint32 addr, uint32 data)
{
IODevice *d = SearchDevice(addr);
return d->Write16(addr, data);
}
uint64
PartialRAMDevice::Write32(uint32 addr, uint32 data)
{
IODevice *d = SearchDevice(addr);
return d->Write32(addr, data);
}
uint64
PartialRAMDevice::Peek8(uint32 addr)
{
IODevice *d = SearchDevice(addr);
return d->Peek8(addr);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.