49 lines
1.5 KiB
C#
49 lines
1.5 KiB
C#
using System;
|
|
using ParsonsMegadrive.Core.Interfaces;
|
|
|
|
namespace ParsonsMegaDrive.Core.Memory
|
|
{
|
|
public class MdMemoryBus : IMemoryBus
|
|
{
|
|
// For testing, we'll just give it a flat 16MB array to represent the whole address space.
|
|
// Later, we will map this properly to ROM (0x000000), Work RAM (0xFF0000), etc.
|
|
private readonly byte[] _memory = new byte[16 * 1024 * 1024];
|
|
|
|
public byte Read8(uint address)
|
|
{
|
|
return _memory[address & 0xFFFFFF]; // 24-bit address mask
|
|
}
|
|
|
|
public void Write8(uint address, byte value)
|
|
{
|
|
_memory[address & 0xFFFFFF] = value;
|
|
}
|
|
|
|
public ushort Read16(uint address)
|
|
{
|
|
// BIG-ENDIAN: High byte comes first!
|
|
byte high = Read8(address);
|
|
byte low = Read8(address + 1);
|
|
return (ushort)((high << 8) | low);
|
|
}
|
|
|
|
public void Write16(uint address, ushort value)
|
|
{
|
|
Write8(address, (byte)(value >> 8)); // High byte
|
|
Write8(address + 1, (byte)(value & 0xFF)); // Low byte
|
|
}
|
|
|
|
public uint Read32(uint address)
|
|
{
|
|
ushort highWord = Read16(address);
|
|
ushort lowWord = Read16(address + 2);
|
|
return (uint)((highWord << 16) | lowWord);
|
|
}
|
|
|
|
public void Write32(uint address, uint value)
|
|
{
|
|
Write16(address, (ushort)(value >> 16));
|
|
Write16(address + 2, (ushort)(value & 0xFFFF));
|
|
}
|
|
}
|
|
} |