Pizza: Savestates at ~600K in SGB mode
This commit is contained in:
parent
00f2743240
commit
ed57f766ad
|
@ -21,8 +21,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
|
|||
public Pizza(byte[] rom, CoreComm comm)
|
||||
:base(comm, new Configuration
|
||||
{
|
||||
DefaultWidth = 256,
|
||||
DefaultHeight = 224,
|
||||
DefaultWidth = 160,
|
||||
DefaultHeight = 144,
|
||||
MaxWidth = 256,
|
||||
MaxHeight = 224,
|
||||
MaxSamples = 1024,
|
||||
|
@ -34,11 +34,11 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
|
|||
_pizza = PreInit<LibPizza>(new PeRunnerOptions
|
||||
{
|
||||
Filename = "pizza.wbx",
|
||||
SbrkHeapSizeKB = 2 * 1024,
|
||||
InvisibleHeapSizeKB = 16 * 1024,
|
||||
SealedHeapSizeKB = 16 * 1024,
|
||||
PlainHeapSizeKB = 16 * 1024,
|
||||
MmapHeapSizeKB = 32 * 1024
|
||||
SbrkHeapSizeKB = 128,
|
||||
InvisibleHeapSizeKB = 16,
|
||||
SealedHeapSizeKB = 5 * 1024,
|
||||
PlainHeapSizeKB = 16,
|
||||
MmapHeapSizeKB = 0
|
||||
});
|
||||
|
||||
var spc = comm.CoreFileProvider.GetFirmware("SGB", "SPC", true);
|
||||
|
@ -51,8 +51,11 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
|
|||
PostInit();
|
||||
|
||||
if (_sgb)
|
||||
{
|
||||
VsyncNumerator = TICKSPERSECOND_SGB;
|
||||
|
||||
BufferWidth = 256;
|
||||
BufferHeight = 224;
|
||||
}
|
||||
Console.WriteLine("Pizza Initialized: CGB {0} SGB {1}", IsCGBMode(), IsSGBMode());
|
||||
}
|
||||
|
||||
|
|
|
@ -335,8 +335,8 @@ namespace BizHawk.Emulation.Cores.Waterbox
|
|||
protected readonly int[] _videoBuffer;
|
||||
public virtual int VirtualWidth => BufferWidth;
|
||||
public virtual int VirtualHeight => BufferWidth;
|
||||
public int BufferWidth { get; private set; }
|
||||
public int BufferHeight { get; private set; }
|
||||
public int BufferWidth { get; protected set; }
|
||||
public int BufferHeight { get; protected set; }
|
||||
public virtual int VsyncNumerator { get; protected set; }
|
||||
public virtual int VsyncDenominator { get; protected set; }
|
||||
public int BackgroundColor => unchecked((int)0xff000000);
|
||||
|
|
Binary file not shown.
|
@ -26,148 +26,208 @@
|
|||
#include "mmu.h"
|
||||
#include "utils.h"
|
||||
|
||||
/* buffer big enough to contain the largest possible ROM */
|
||||
uint8_t rom[2 << 24];
|
||||
|
||||
/* battery backed RAM & RTC*/
|
||||
char file_sav[1024];
|
||||
char file_rtc[1024];
|
||||
|
||||
/* guess what */
|
||||
/* return values */
|
||||
/* 0: OK */
|
||||
/* 1: Can't open/read file */
|
||||
/* 2: Unknown cartridge */
|
||||
|
||||
char cartridge_load(const void* data, size_t sz)
|
||||
char cartridge_load(const void *data, size_t sz)
|
||||
{
|
||||
int i,z = 0;
|
||||
int i, z = 0;
|
||||
|
||||
if (sz < 1 || sz > 2 << 24)
|
||||
return 1;
|
||||
if (sz < 1 || sz > 1 << 22)
|
||||
return 1;
|
||||
|
||||
memcpy(rom, data, sz);
|
||||
const uint8_t *rom = (const uint8_t *)data;
|
||||
|
||||
/* gameboy color? */
|
||||
if (rom[0x143] == 0xC0 || rom[0x143] == 0x80)
|
||||
{
|
||||
utils_log("Gameboy Color cartridge\n");
|
||||
global_cgb = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
utils_log("Gameboy Classic cartridge\n");
|
||||
global_cgb = 0;
|
||||
}
|
||||
/* gameboy color? */
|
||||
if (rom[0x143] == 0xC0 || rom[0x143] == 0x80)
|
||||
{
|
||||
utils_log("Gameboy Color cartridge\n");
|
||||
global_cgb = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
utils_log("Gameboy Classic cartridge\n");
|
||||
global_cgb = 0;
|
||||
}
|
||||
|
||||
/* get cartridge infos */
|
||||
uint8_t mbc = rom[0x147];
|
||||
/* get cartridge infos */
|
||||
uint8_t mbc = rom[0x147];
|
||||
|
||||
utils_log("Cartridge code: %02x\n", mbc);
|
||||
utils_log("Cartridge code: %02x\n", mbc);
|
||||
|
||||
switch (mbc)
|
||||
{
|
||||
case 0x00: utils_log("ROM ONLY\n"); break;
|
||||
case 0x01: utils_log("MBC1\n"); break;
|
||||
case 0x02: utils_log("MBC1 + RAM\n"); break;
|
||||
case 0x03: utils_log("MBC1 + RAM + BATTERY\n"); break;
|
||||
case 0x05: utils_log("MBC2\n"); break;
|
||||
case 0x06: mmu_init_ram(512); utils_log("MBC2 + BATTERY\n"); break;
|
||||
case 0x10: utils_log("MBC3 + TIMER + RAM + BATTERY\n"); break;
|
||||
case 0x11: utils_log("MBC3\n"); break;
|
||||
case 0x12: utils_log("MBC3 + RAM\n"); break;
|
||||
case 0x13: utils_log("MBC3 + RAM + BATTERY\n"); break;
|
||||
case 0x19: utils_log("MBC5\n"); break;
|
||||
case 0x1A: utils_log("MBC5 + RAM\n"); break;
|
||||
case 0x1B: utils_log("MBC5 + RAM + BATTERY\n"); break;
|
||||
case 0x1C: global_rumble = 1;
|
||||
utils_log("MBC5 + RUMBLE\n");
|
||||
break;
|
||||
case 0x1D: global_rumble = 1;
|
||||
utils_log("MBC5 + RUMBLE + RAM\n");
|
||||
break;
|
||||
case 0x1E: global_rumble = 1;
|
||||
utils_log("MBC5 + RUMBLE + RAM + BATTERY\n");
|
||||
break;
|
||||
switch (mbc)
|
||||
{
|
||||
case 0x00:
|
||||
utils_log("ROM ONLY\n");
|
||||
break;
|
||||
case 0x01:
|
||||
utils_log("MBC1\n");
|
||||
break;
|
||||
case 0x02:
|
||||
utils_log("MBC1 + RAM\n");
|
||||
break;
|
||||
case 0x03:
|
||||
utils_log("MBC1 + RAM + BATTERY\n");
|
||||
break;
|
||||
case 0x05:
|
||||
utils_log("MBC2\n");
|
||||
break;
|
||||
case 0x06:
|
||||
mmu_init_ram(512);
|
||||
utils_log("MBC2 + BATTERY\n");
|
||||
break;
|
||||
case 0x10:
|
||||
utils_log("MBC3 + TIMER + RAM + BATTERY\n");
|
||||
break;
|
||||
case 0x11:
|
||||
utils_log("MBC3\n");
|
||||
break;
|
||||
case 0x12:
|
||||
utils_log("MBC3 + RAM\n");
|
||||
break;
|
||||
case 0x13:
|
||||
utils_log("MBC3 + RAM + BATTERY\n");
|
||||
break;
|
||||
case 0x19:
|
||||
utils_log("MBC5\n");
|
||||
break;
|
||||
case 0x1A:
|
||||
utils_log("MBC5 + RAM\n");
|
||||
break;
|
||||
case 0x1B:
|
||||
utils_log("MBC5 + RAM + BATTERY\n");
|
||||
break;
|
||||
case 0x1C:
|
||||
global_rumble = 1;
|
||||
utils_log("MBC5 + RUMBLE\n");
|
||||
break;
|
||||
case 0x1D:
|
||||
global_rumble = 1;
|
||||
utils_log("MBC5 + RUMBLE + RAM\n");
|
||||
break;
|
||||
case 0x1E:
|
||||
global_rumble = 1;
|
||||
utils_log("MBC5 + RUMBLE + RAM + BATTERY\n");
|
||||
break;
|
||||
|
||||
default: utils_log("Unknown cartridge type: %02x\n", mbc);
|
||||
return 2;
|
||||
}
|
||||
default:
|
||||
utils_log("Unknown cartridge type: %02x\n", mbc);
|
||||
return 2;
|
||||
}
|
||||
|
||||
/* title */
|
||||
for (i=0x134; i<0x143; i++)
|
||||
if (rom[i] > 0x40 && rom[i] < 0x5B)
|
||||
global_cart_name[z++] = rom[i];
|
||||
/* title */
|
||||
for (i = 0x134; i < 0x143; i++)
|
||||
if (rom[i] > 0x40 && rom[i] < 0x5B)
|
||||
global_cart_name[z++] = rom[i];
|
||||
|
||||
global_cart_name[z] = '\0';
|
||||
global_cart_name[z] = '\0';
|
||||
|
||||
utils_log("%s\n", global_cart_name);
|
||||
utils_log("%s\n", global_cart_name);
|
||||
|
||||
/* get ROM banks */
|
||||
uint8_t byte = rom[0x148];
|
||||
/* get ROM banks */
|
||||
uint8_t byte = rom[0x148];
|
||||
|
||||
utils_log("ROM: ");
|
||||
utils_log("ROM: ");
|
||||
|
||||
switch (byte)
|
||||
{
|
||||
case 0x00: utils_log("0 banks\n"); break;
|
||||
case 0x01: utils_log("4 banks\n"); break;
|
||||
case 0x02: utils_log("8 banks\n"); break;
|
||||
case 0x03: utils_log("16 banks\n"); break;
|
||||
case 0x04: utils_log("32 banks\n"); break;
|
||||
case 0x05: utils_log("64 banks\n"); break;
|
||||
case 0x06: utils_log("128 banks\n"); break;
|
||||
case 0x07: utils_log("256 banks\n"); break;
|
||||
case 0x52: utils_log("72 banks\n"); break;
|
||||
case 0x53: utils_log("80 banks\n"); break;
|
||||
case 0x54: utils_log("96 banks\n"); break;
|
||||
}
|
||||
switch (byte)
|
||||
{
|
||||
case 0x00:
|
||||
utils_log("0 banks\n");
|
||||
break;
|
||||
case 0x01:
|
||||
utils_log("4 banks\n");
|
||||
break;
|
||||
case 0x02:
|
||||
utils_log("8 banks\n");
|
||||
break;
|
||||
case 0x03:
|
||||
utils_log("16 banks\n");
|
||||
break;
|
||||
case 0x04:
|
||||
utils_log("32 banks\n");
|
||||
break;
|
||||
case 0x05:
|
||||
utils_log("64 banks\n");
|
||||
break;
|
||||
case 0x06:
|
||||
utils_log("128 banks\n");
|
||||
break;
|
||||
case 0x07:
|
||||
utils_log("256 banks\n");
|
||||
break;
|
||||
case 0x52:
|
||||
utils_log("72 banks\n");
|
||||
break;
|
||||
case 0x53:
|
||||
utils_log("80 banks\n");
|
||||
break;
|
||||
case 0x54:
|
||||
utils_log("96 banks\n");
|
||||
break;
|
||||
}
|
||||
|
||||
/* init MMU */
|
||||
mmu_init(mbc, byte);
|
||||
/* init MMU */
|
||||
mmu_init(mbc, byte);
|
||||
|
||||
/* get RAM banks */
|
||||
byte = rom[0x149];
|
||||
/* get RAM banks */
|
||||
byte = rom[0x149];
|
||||
|
||||
utils_log("RAM: ");
|
||||
utils_log("RAM: ");
|
||||
|
||||
switch (byte)
|
||||
{
|
||||
case 0x00: utils_log("NO RAM\n"); break;
|
||||
case 0x01: mmu_init_ram(1 << 11); utils_log("2 kB\n"); break;
|
||||
case 0x02:
|
||||
/* MBC5 got bigger values */
|
||||
if (mbc >= 0x19 && mbc <= 0x1E)
|
||||
{
|
||||
mmu_init_ram(1 << 16);
|
||||
utils_log("64 kB\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
mmu_init_ram(1 << 13);
|
||||
utils_log("8 kB\n");
|
||||
}
|
||||
break;
|
||||
case 0x03: mmu_init_ram(1 << 15); utils_log("32 kB\n"); break;
|
||||
case 0x04: mmu_init_ram(1 << 17); utils_log("128 kB\n"); break;
|
||||
case 0x05: mmu_init_ram(1 << 16); utils_log("64 kB\n"); break;
|
||||
}
|
||||
switch (byte)
|
||||
{
|
||||
case 0x00:
|
||||
utils_log("NO RAM\n");
|
||||
break;
|
||||
case 0x01:
|
||||
mmu_init_ram(1 << 11);
|
||||
utils_log("2 kB\n");
|
||||
break;
|
||||
case 0x02:
|
||||
/* MBC5 got bigger values */
|
||||
if (mbc >= 0x19 && mbc <= 0x1E)
|
||||
{
|
||||
mmu_init_ram(1 << 16);
|
||||
utils_log("64 kB\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
mmu_init_ram(1 << 13);
|
||||
utils_log("8 kB\n");
|
||||
}
|
||||
break;
|
||||
case 0x03:
|
||||
mmu_init_ram(1 << 15);
|
||||
utils_log("32 kB\n");
|
||||
break;
|
||||
case 0x04:
|
||||
mmu_init_ram(1 << 17);
|
||||
utils_log("128 kB\n");
|
||||
break;
|
||||
case 0x05:
|
||||
mmu_init_ram(1 << 16);
|
||||
utils_log("64 kB\n");
|
||||
break;
|
||||
}
|
||||
|
||||
/* restore saved RAM if it's the case */
|
||||
mmu_restore_ram(file_sav);
|
||||
/* restore saved RAM if it's the case */
|
||||
//mmu_restore_ram(file_sav);
|
||||
|
||||
/* restore saved RTC if it's the case */
|
||||
mmu_restore_rtc(file_rtc);
|
||||
/* restore saved RTC if it's the case */
|
||||
//mmu_restore_rtc(file_rtc);
|
||||
|
||||
/* load FULL ROM at 0x0000 address of system memory */
|
||||
mmu_load_cartridge(rom, sz);
|
||||
/* load FULL ROM at 0x0000 address of system memory */
|
||||
mmu_load_cartridge(rom, sz);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void cartridge_term()
|
||||
/*void cartridge_term()
|
||||
{
|
||||
/* save persistent data (battery backed RAM and RTC clock) */
|
||||
mmu_save_ram(file_sav);
|
||||
mmu_save_rtc(file_rtc);
|
||||
}
|
||||
// save persistent data (battery backed RAM and RTC clock)
|
||||
mmu_save_ram(file_sav);
|
||||
mmu_save_rtc(file_rtc);
|
||||
}*/
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <strings.h>
|
||||
#include <time.h>
|
||||
#include "sgb.h"
|
||||
#include <emulibc.h>
|
||||
|
||||
/* GAMEBOY MEMORY AREAS
|
||||
|
||||
|
@ -52,7 +53,7 @@
|
|||
*/
|
||||
|
||||
/* cartridge memory (max 8MB) */
|
||||
uint8_t cart_memory[1 << 22];
|
||||
uint8_t* cart_memory;
|
||||
|
||||
/* RAM memory area */
|
||||
uint8_t *ram;
|
||||
|
@ -162,11 +163,12 @@ void mmu_load(uint8_t *data, size_t sz, uint16_t a)
|
|||
}
|
||||
|
||||
/* load full cartridge */
|
||||
void mmu_load_cartridge(uint8_t *data, size_t sz)
|
||||
void mmu_load_cartridge(const uint8_t *data, size_t sz)
|
||||
{
|
||||
/* copy max 32k into working memory */
|
||||
memcpy(mmu.memory, data, 2 << 14);
|
||||
|
||||
cart_memory = alloc_sealed(1 << 22);
|
||||
/* copy full cartridge */
|
||||
memcpy(cart_memory, data, sz);
|
||||
}
|
||||
|
|
|
@ -96,7 +96,7 @@ void mmu_dump_all();
|
|||
void mmu_init(uint8_t c, uint8_t rn);
|
||||
void mmu_init_ram(uint32_t c);
|
||||
void mmu_load(uint8_t *data, size_t sz, uint16_t a);
|
||||
void mmu_load_cartridge(uint8_t *data, size_t sz);
|
||||
void mmu_load_cartridge(const uint8_t *data, size_t sz);
|
||||
void mmu_move(uint16_t d, uint16_t s);
|
||||
uint8_t mmu_read_no_cyc(uint16_t a);
|
||||
uint8_t mmu_read(uint16_t a);
|
||||
|
|
Loading…
Reference in New Issue