LADXHD/GbsPlayer/Cartridge.cs

115 lines
3.5 KiB
C#
Raw Normal View History

2023-12-14 22:21:22 +00:00
using System;
namespace GbsPlayer
{
public class Cartridge
{
public byte[] ROM;
public byte SelectedRomBank = 1;
// gbs
public byte Version;
public byte TrackCount;
public byte FirstSong;
public ushort LoadAddress;
public ushort InitAddress;
public ushort PlayAddress;
public ushort StackPointer;
public byte TimeModulo;
public byte TimeControl;
public string Title;
public string Author;
public string Copyright;
public ushort RomOffset;
public void Init()
{
// Reset values
SelectedRomBank = 1;
// GBS Header
Version = ROM[0x03];
TrackCount = ROM[0x04];
FirstSong = ROM[0x05];
LoadAddress = (ushort)(ROM[0x07] << 0x08 | ROM[0x06]);
InitAddress = (ushort)(ROM[0x09] << 0x08 | ROM[0x08]);
PlayAddress = (ushort)(ROM[0x0b] << 0x08 | ROM[0x0a]);
StackPointer = (ushort)(ROM[0x0d] << 0x08 | ROM[0x0c]);
TimeModulo = ROM[0x0e];
TimeControl = ROM[0x0f];
var charArray = new char[32];
for (var i = 0; i < 32; i++)
charArray[i] = (char)ROM[0x10 + i];
Title = new string(charArray);
for (var i = 0; i < 32; i++)
charArray[i] = (char)ROM[0x30 + i];
Author = new string(charArray);
for (var i = 0; i < 32; i++)
charArray[i] = (char)ROM[0x50 + i];
Copyright = new string(charArray);
RomOffset = (ushort)(LoadAddress - 0x70);
}
public byte this[int index]
{
get
{
// ROM Bank 00
if (index < 0x4000)
{
if (index - RomOffset >= 0)
return ROM[index - RomOffset];
}
// ROM Bank 01-..
else if (index < 0x8000)
{
var romIndex = (SelectedRomBank) * 0x4000 + (index - 0x4000) - RomOffset;
if (romIndex < ROM.Length)
return ROM[romIndex];
}
Console.WriteLine("Cartridge Index unavailable: {0:X}", index);
return 0;
}
set
{
// normally enable RAM
if (index < 0x2000)
{
Console.WriteLine("Write to 0x{0:X} not supported", index);
}
// select ROM Bank
else if (index < 0x4000)
{
// GBS:
// A page is selected into Bank 1 by writing the page number as a byte value somewhere in the address range $2000 -$3fff.
SelectedRomBank = value;
// Console.WriteLine("select ROM bank 0x{0:X}:" + value, index);
}
// RAM Bank Number - or - Upper Bits of ROM Bank Number
else if (index < 0x6000)
{
// GBS:
// Player authors: you should disregard writes to $4000-$5fff and $ff70, and just implement main RAM from $a000 to $dfff.
}
else
Console.WriteLine("Write to 0x{0:X} not supported", index);
}
}
}
}