using System;
using System.Text;

namespace BizHawk.Emulation.Cores.Sega.Genesis
{
	partial class Genesis
	{
		public string RH_Console { get { return GetRomString(0x100, 0x10); } }
		public string RH_Copyright { get { return GetRomString(0x110, 0x10); } }
		public string RH_NameDomestic { get { return GetRomString(0x120, 0x30); } }
		public string RH_NameExport { get { return GetRomString(0x150, 0x30); } }
		public int RH_RomSize { get { return GetRomLongWord(0x1A4); } }
		public string RH_Region { get { return GetRomString(0x1F0, 3); } }

		public bool RH_SRamPresent { get { return (RomData[0x1B2] & 0x40) != 0; } }
		public int RH_SRamCode { get { return (RomData[0x1B2] >> 3) & 3; } }
		public int RH_SRamStart { get { return GetRomLongWord(0x1B4); } }
		public int RH_SRamEnd { get { return GetRomLongWord(0x1B8); } }

		public string RH_SRamInterpretation()
		{
			switch (RH_SRamCode)
			{
				case 0: return "Even and odd addresses";
				case 2: return "Even addresses";
				case 3: return "Odd addresses";
				default: return "Invalid type";
			}
		}

		string GetRomString(int offset, int len)
		{
			return Encoding.ASCII.GetString(RomData, offset, len).Trim();
		}

		int GetRomLongWord(int offset)
		{
			return (RomData[offset] << 24) | (RomData[offset + 1] << 16) | (RomData[offset + 2] << 8) | RomData[offset + 3];
		}

		void LogCartInfo()
		{
			Console.WriteLine("==================");
			Console.WriteLine("ROM Cartridge Data");
			Console.WriteLine("==================");
			Console.WriteLine("System:     {0}", RH_Console);
			Console.WriteLine("Copyright:  {0}", RH_Copyright);
			Console.WriteLine("Name (Dom): {0}", RH_NameDomestic);
			Console.WriteLine("Name (Exp): {0}", RH_NameExport);
			Console.WriteLine("Region:     {0}", RH_Region);
			Console.WriteLine("Rom Size:   {0,7} (${0:X})", RH_RomSize);
			Console.WriteLine("SRAM Used:  {0}", RH_SRamPresent);
			if (RH_SRamPresent)
			{
				Console.WriteLine("SRAM Start: {0,7} (${0:X})", RH_SRamStart);
				Console.WriteLine("SRAM End:   {0,7} (${0:X})", RH_SRamEnd);
				Console.WriteLine("SRAM Type:  {0}", RH_SRamInterpretation());
			}
		}
	}
}
