Mesen-S/Core/GameboyHeader.h
Sour 5f055110fa Added Game Boy support
CPU/APU are decent - PPU is still just a scanline renderer
No Super Game Boy support yet
2020-05-18 16:11:08 -04:00

78 lines
1.3 KiB
C

#pragma once
#include "stdafx.h"
struct GameboyHeader
{
//Starts at 0x134
char Title[11];
char ManufacturerCode[4];
uint8_t CgbFlag;
char LicenseeCode[2];
uint8_t SgbFlag;
uint8_t CartType;
uint8_t PrgRomSize;
uint8_t CartRamSize;
uint8_t DestCode;
uint8_t OldLicenseeCode;
uint8_t MaskRomVersion;
uint8_t HeaderChecksum;
uint8_t GlobalChecksum[2];
uint32_t GetPrgRomSize()
{
if(PrgRomSize < 16) {
return 0x8000 << PrgRomSize;
}
return 0x8000;
}
uint32_t GetCartRamSize()
{
if(CartType == 5 || CartType == 6) {
//MBC2 has 512x4bits of cart ram
return 0x200;
}
switch(CartRamSize) {
case 0: return 0;
case 1: return 0x800;
case 2: return 0x2000;
case 3: return 0x8000;
case 4: return 0x20000;
case 5: return 0x10000;
}
return 0;
}
bool HasBattery()
{
switch(CartType) {
case 0x03: case 0x06: case 0x09: case 0x0D:
case 0x0F: case 0x10: case 0x13: case 0x1B:
case 0x1E: case 0x22: case 0xFF:
return true;
}
return false;
}
string GetCartName()
{
int nameLength = 11;
for(int i = 0; i < 11; i++) {
if(Title[i] == 0) {
nameLength = i;
break;
}
}
string name = string(Title, nameLength);
size_t lastNonSpace = name.find_last_not_of(' ');
if(lastNonSpace != string::npos) {
return name.substr(0, lastNonSpace + 1);
} else {
return name;
}
}
};