Pizza: Savestates at ~600K in SGB mode

This commit is contained in:
nattthebear 2017-06-24 11:05:59 -04:00
parent 00f2743240
commit ed57f766ad
6 changed files with 192 additions and 127 deletions

View File

@ -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());
}

View File

@ -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.

View File

@ -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);
}*/

View File

@ -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);
}

View File

@ -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);