LADXHD/GbsPlayer/GeneralMemory.cs
2023-12-14 17:21:22 -05:00

141 lines
4.6 KiB
C#

using System;
namespace GbsPlayer
{
public class GeneralMemory
{
private readonly Cartridge _cartridge;
private readonly Sound _gbSound;
public byte[] Memory;
public GeneralMemory(Cartridge cartridge, Sound gbSound)
{
_cartridge = cartridge;
_gbSound = gbSound;
}
public void Init()
{
Memory = new byte[65536]; // 0x0000-0xFFFF
}
public byte this[int index]
{
get
{
// Cartridge
if (index < 0x8000)
return _cartridge[index];
if (0xA000 <= index && index < 0xE000)
{
// GBS:
// Player authors: you should disregard writes to $4000-$5fff and $ff70, and just implement main RAM from $a000 to $dfff.
return Memory[index];
}
// shadow ram
if (0xE000 <= index && index < 0xFE00)
return Memory[index - 0x2000];
// Sound registries
if (0xFF10 <= index && index <= 0xFF3F)
return _gbSound[index];
// High RAM (HRAM)
if (0xFF80 <= index && index <= 0xFFFF)
return Memory[index];
Console.WriteLine("Read at 0x{0:X} not supported", index);
return 0;
}
set
{
// ROM
if (index < 0x8000)
{
_cartridge[index] = value;
}
// 8KB Video RAM (VRAM)
else if (index < 0xA000)
{
Console.WriteLine("VRAM not supported 0x{0:X}", index);
}
// Unit Working RAM
else if (index < 0xE000)
{
// GBS:
// Player authors: you should disregard writes to $4000-$5fff and $ff70, and just implement main RAM from $a000 to $dfff.
Memory[index] = value;
}
// shadow memory
else if (index < 0xFE00)
{
Memory[index - 0x2000] = value;
}
else if (index < 0xFF05)
{
Console.WriteLine("Write to 0x{0:X} not supported", index);
}
else if (index == 0xFF05)
{
// TIMA Timer Counter
Console.WriteLine("TIMA currently not supported");
}
else if (index == 0xFF06)
{
// TMA Timer Modulo
Console.WriteLine("TMA currently not supported");
}
// TAC
else if (index == 0xFF07)
{
// Bit 1 & 0, counter rate
// 00: 4096 Hz
// 01: 262144 Hz
// 10: 65536 Hz
// 11: 16384 Hz
// Bit 2, interrupt type
// 0: Use v-blank
// 1: Use timer
// Bit 6 - 3, reserved for expansion
// Set them to 0
// Bit 7, CPU clock rate
// 0: Use normal rate
// 1: Use 2x(fast) rate
Console.WriteLine("TAC currently not supported");
}
else if (index < 0xFF10)
{
Console.WriteLine("Write to 0x{0:X} not supported", index);
}
// Sound stuff
else if (0xFF10 <= index && index <= 0xFF3F)
{
_gbSound[index] = value;
}
else if (index < 0xFF80)
{
Console.WriteLine("Write to 0x{0:X} not supported", index);
}
// High RAM (HRAM)
else if (index < 0xFFFF)
{
Memory[index] = value;
}
// Interrupt Enable Register
else if (index == 0xFFFF)
{
Memory[index] = value;
}
// ERROR
else
{
Console.WriteLine("Error writing to high address");
}
}
}
}
}