mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
141 lines
4.6 KiB
C#
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");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|