This commit is contained in:
retro-wertz 2019-08-06 00:34:13 +08:00
parent 408cab71e2
commit d9f8396c67
9 changed files with 137 additions and 127 deletions

View File

@ -1,6 +1,11 @@
#ifndef GB_H
#define GB_H
#define gbWidth 160
#define gbHeight 144
#define sgbWidth 256
#define sgbHeight 224
const int GB_C_FLAG = 0x10;
const int GB_H_FLAG = 0x20;
const int GB_N_FLAG = 0x40;
@ -55,6 +60,8 @@ void setColorizerHack(bool value);
bool allowColorizerHack(void);
extern int gbHardware;
extern int gbRomType; // gets type from header 0x147
extern int gbBattery; // enabled when gbRamSize != 0
extern struct EmulatedSystem GBSystem;

View File

@ -246,6 +246,7 @@ static char dummy_state[735 * 2];
&name, sizeof(type) \
}
#ifndef __LIBRETRO__
// Old save state support
static variable_desc gbsound_format[] = {
@ -355,7 +356,6 @@ enum {
nr52
};
#ifndef __LIBRETRO__
static void gbSoundReadGameOld(int version, gzFile gzFile)
{
if (version == 11) {

View File

@ -27,30 +27,6 @@ int flashDeviceID = 0x1b;
int flashManufacturerID = 0x32;
int flashBank = 0;
static variable_desc flashSaveData[] = {
{ &flashState, sizeof(int) },
{ &flashReadState, sizeof(int) },
{ &flashSaveMemory[0], SIZE_FLASH512 },
{ NULL, 0 }
};
static variable_desc flashSaveData2[] = {
{ &flashState, sizeof(int) },
{ &flashReadState, sizeof(int) },
{ &flashSize, sizeof(int) },
{ &flashSaveMemory[0], SIZE_FLASH1M },
{ NULL, 0 }
};
static variable_desc flashSaveData3[] = {
{ &flashState, sizeof(int) },
{ &flashReadState, sizeof(int) },
{ &flashSize, sizeof(int) },
{ &flashBank, sizeof(int) },
{ &flashSaveMemory[0], SIZE_FLASH1M },
{ NULL, 0 }
};
void flashInit()
{
memset(flashSaveMemory, 0xff, sizeof(flashSaveMemory));
@ -63,49 +39,6 @@ void flashReset()
flashBank = 0;
}
#ifdef __LIBRETRO__
void flashSaveGame(uint8_t*& data)
{
utilWriteDataMem(data, flashSaveData3);
}
void flashReadGame(const uint8_t*& data, int)
{
utilReadDataMem(data, flashSaveData3);
}
#else // !__LIBRETRO__
void flashSaveGame(gzFile gzFile)
{
utilWriteData(gzFile, flashSaveData3);
}
void flashReadGame(gzFile gzFile, int version)
{
if (version < SAVE_GAME_VERSION_5)
utilReadData(gzFile, flashSaveData);
else if (version < SAVE_GAME_VERSION_7) {
utilReadData(gzFile, flashSaveData2);
flashBank = 0;
flashSetSize(flashSize);
} else {
utilReadData(gzFile, flashSaveData3);
}
}
void flashReadGameSkip(gzFile gzFile, int version)
{
// skip the flash data in a save game
if (version < SAVE_GAME_VERSION_5)
utilReadDataSkip(gzFile, flashSaveData);
else if (version < SAVE_GAME_VERSION_7) {
utilReadDataSkip(gzFile, flashSaveData2);
} else {
utilReadDataSkip(gzFile, flashSaveData3);
}
}
#endif
void flashSetSize(int size)
{
// log("Setting flash size to %d\n", size);
@ -279,3 +212,70 @@ void flashWrite(uint32_t address, uint8_t byte)
break;
}
}
static variable_desc flashSaveData3[] = {
{ &flashState, sizeof(int) },
{ &flashReadState, sizeof(int) },
{ &flashSize, sizeof(int) },
{ &flashBank, sizeof(int) },
{ &flashSaveMemory[0], SIZE_FLASH1M },
{ NULL, 0 }
};
#ifdef __LIBRETRO__
void flashSaveGame(uint8_t*& data)
{
utilWriteDataMem(data, flashSaveData3);
}
void flashReadGame(const uint8_t*& data, int)
{
utilReadDataMem(data, flashSaveData3);
}
#else // !__LIBRETRO__
static variable_desc flashSaveData[] = {
{ &flashState, sizeof(int) },
{ &flashReadState, sizeof(int) },
{ &flashSaveMemory[0], SIZE_FLASH512 },
{ NULL, 0 }
};
static variable_desc flashSaveData2[] = {
{ &flashState, sizeof(int) },
{ &flashReadState, sizeof(int) },
{ &flashSize, sizeof(int) },
{ &flashSaveMemory[0], SIZE_FLASH1M },
{ NULL, 0 }
};
void flashSaveGame(gzFile gzFile)
{
utilWriteData(gzFile, flashSaveData3);
}
void flashReadGame(gzFile gzFile, int version)
{
if (version < SAVE_GAME_VERSION_5)
utilReadData(gzFile, flashSaveData);
else if (version < SAVE_GAME_VERSION_7) {
utilReadData(gzFile, flashSaveData2);
flashBank = 0;
flashSetSize(flashSize);
} else {
utilReadData(gzFile, flashSaveData3);
}
}
void flashReadGameSkip(gzFile gzFile, int version)
{
// skip the flash data in a save game
if (version < SAVE_GAME_VERSION_5)
utilReadDataSkip(gzFile, flashSaveData);
else if (version < SAVE_GAME_VERSION_7) {
utilReadDataSkip(gzFile, flashSaveData2);
} else {
utilReadDataSkip(gzFile, flashSaveData3);
}
}
#endif

View File

@ -1235,6 +1235,7 @@ DEFINE_ALU_INSN_C(1F, 3F, MVNS, YES)
int mult = (opcode & 0x0F); \
uint32_t rs = reg[(opcode >> 8) & 0x0F].I; \
int acc = (opcode >> 12) & 0x0F; /* or destLo */ \
maybe_unused(acc); \
int dest = (opcode >> 16) & 0x0F; /* or destHi */ \
OP; \
SETCOND; \

View File

@ -19,6 +19,9 @@ const uint64_t TICKS_PER_SECOND = 16777216;
#define SAVE_GAME_VERSION_10 10
#define SAVE_GAME_VERSION SAVE_GAME_VERSION_10
#define gbaWidth 240
#define gbaHeight 160
enum {
GBA_SAVE_AUTO = 0,
GBA_SAVE_EEPROM,

View File

@ -588,6 +588,7 @@ static struct {
int soundDSBValue;
} state;
#ifndef __LIBRETRO__
// Old GBA sound state format
static variable_desc old_gba_state[] = {
SKIP(int, soundPaused),
@ -673,6 +674,7 @@ variable_desc old_gba_state2[] = {
SKIP(int, sound3ForcedOutput),
{ NULL, 0 }
};
#endif
// New state format
static variable_desc gba_state[] = {

View File

@ -6,8 +6,7 @@ SOURCES_CXX :=
SOURCES_CXX += \
$(CORE_DIR)/libretro/libretro.cpp \
$(CORE_DIR)/libretro/UtilRetro.cpp \
$(CORE_DIR)/libretro/SoundRetro.cpp \
$(CORE_DIR)/libretro/scrc32.cpp
$(CORE_DIR)/libretro/SoundRetro.cpp
SOURCES_CXX += \
$(CORE_DIR)/apu/Gb_Oscs.cpp \

View File

@ -8,6 +8,7 @@
#include "SoundRetro.h"
#include "libretro.h"
#include "libretro_core_options.h"
#include "scrc32.h"
#include "../System.h"
#include "../Util.h"
@ -40,27 +41,20 @@ static retro_environment_t environ_cb;
retro_audio_sample_batch_t audio_batch_cb;
static retro_set_rumble_state_t rumble_cb;
static char retro_system_directory[4096];
static char retro_system_directory[2048];
static char biosfile[4096];
static float sndFiltering = 0.5f;
static bool sndInterpolation = true;
static bool can_dupe = false;
static bool usebios = false;
static unsigned retropad_device[4] = {0};
static const double FramesPerSecond = (16777216.0 / 280896.0); // 59.73
static const long SampleRate = 32768;
static const int GBWidth = 160;
static const int GBHeight = 144;
static const int SGBWidth = 256;
static const int SGBHeight = 224;
static const int GBAWidth = 240;
static const int GBAHeight = 160;
static unsigned width = 240;
static unsigned height = 160;
static unsigned width = gbaWidth;
static unsigned height = gbaHeight;
static EmulatedSystem* core = NULL;
static IMAGE_TYPE type = IMAGE_UNKNOWN;
static unsigned current_gbPalette;
static unsigned current_gbPalette = 0;
static bool opt_colorizer_hack = false;
uint16_t systemColorMap16[0x10000];
@ -220,9 +214,6 @@ static void set_gbColorCorrection(int value)
gbColorOption = value;
}
extern int gbRomType; // gets type from header 0x147
extern int gbBattery; // enabled when gbRamSize != 0
static bool gb_hasrtc(void)
{
switch (gbRomType) {
@ -745,13 +736,11 @@ static void load_image_preferences(void)
"NONE"
};
char buffer[5];
buffer[0] = rom[0xac];
buffer[1] = rom[0xad];
buffer[2] = rom[0xae];
buffer[3] = rom[0xaf];
buffer[4] = 0;
bool found = false;
bool hasRumble = false;
char buffer[12];
unsigned i = 0, found_no = 0;
unsigned long romCrc32 = crc32(0, rom, romSize);
cpuSaveType = GBA_SAVE_AUTO;
flashSize = SIZE_FLASH512;
@ -759,12 +748,26 @@ static void load_image_preferences(void)
rtcEnabled = false;
mirroringEnable = false;
log("GameID in ROM is: %s\n", buffer);
log("File CRC32 : 0x%08X\n", romCrc32);
bool found = false;
int found_no = 0;
buffer[0] = 0;
for (i = 0; i < 12; i++) {
if (rom[0xa0 + i] == 0)
break;
buffer[i] = rom[0xa0 + i];
}
for (int i = 0; i < 512; i++) {
buffer[i] = 0;
log("Game Title : %s\n", buffer);
buffer[0] = rom[0xac];
buffer[1] = rom[0xad];
buffer[2] = rom[0xae];
buffer[3] = rom[0xaf];
buffer[4] = 0;
log("Game Code : %s\n", buffer);
for (i = 0; i < 512; i++) {
if (!strcmp(gbaover[i].romid, buffer)) {
found = true;
found_no = i;
@ -773,7 +776,6 @@ static void load_image_preferences(void)
}
if (found) {
log("Found ROM in vba-over list.\n");
log("Name : %s\n", gbaover[found_no].romtitle);
rtcEnabled = gbaover[found_no].rtcEnabled;
@ -789,12 +791,10 @@ static void load_image_preferences(void)
}
// gameID that starts with 'F' are classic/famicom games
mirroringEnable = (buffer[0] == 0x46) ? true : false;
mirroringEnable = (buffer[0] == 'F') ? true : false;
if (!cpuSaveType) {
log("Scrapping ROM for save type.\n");
if (!cpuSaveType)
utilGBAFindSave(romSize);
}
saveType = cpuSaveType;
@ -802,7 +802,12 @@ static void load_image_preferences(void)
flashSetSize(flashSize);
rtcEnable(rtcEnabled);
rtcEnableRumble(!rtcEnabled);
// game code starting with 'R' or 'V' has rumble support
if ((buffer[0] == 'R') || (buffer[0] == 'V'))
hasRumble = true;
rtcEnableRumble(!rtcEnabled && hasRumble);
doMirroring(mirroringEnable);
@ -811,7 +816,7 @@ static void load_image_preferences(void)
log("cpuSaveType : %s.\n", savetype[cpuSaveType]);
if (cpuSaveType == 3)
log("flashSize : %d.\n", flashSize);
if (cpuSaveType == 1)
else if (cpuSaveType == 1)
log("eepromSize : %d.\n", eepromSize);
log("mirroringEnable : %s.\n", mirroringEnable ? "Yes" : "No");
}
@ -854,8 +859,8 @@ static void gba_init(void)
}
CPUInit(biosfile, usebios);
width = GBAWidth;
height = GBAHeight;
width = gbaWidth;
height = gbaHeight;
CPUReset();
}
@ -883,13 +888,13 @@ static void gb_init(void)
gbCPUInit(biosfile, usebios);
if (gbBorderOn) {
width = gbBorderLineSkip = SGBWidth;
height = SGBHeight;
gbBorderColumnSkip = (SGBWidth - GBWidth) >> 1;
gbBorderRowSkip = (SGBHeight - GBHeight) >> 1;
width = gbBorderLineSkip = sgbWidth;
height = sgbHeight;
gbBorderColumnSkip = (sgbWidth - gbWidth) >> 1;
gbBorderRowSkip = (sgbHeight - gbHeight) >> 1;
} else {
width = gbBorderLineSkip = GBWidth;
height = GBHeight;
width = gbBorderLineSkip = gbWidth;
height = gbHeight;
gbBorderColumnSkip = gbBorderRowSkip = 0;
}
@ -1171,7 +1176,7 @@ static void update_variables(bool startup)
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
int lastpal = current_gbPalette;
unsigned lastpal = current_gbPalette;
if (!strcmp(var.value, "black and white"))
current_gbPalette = 0;
@ -1443,6 +1448,7 @@ void retro_cheat_set(unsigned index, bool enabled, const char* code)
memset(codeLine, 0, codeLineSize);
}
break;
default: break;
}
if (!code[cursor])
break;
@ -1646,11 +1652,11 @@ void systemFrame(void)
void systemGbBorderOn(void)
{
bool changed = ((width != SGBWidth) || (height != SGBHeight));
width = gbBorderLineSkip = SGBWidth;
height = SGBHeight;
gbBorderColumnSkip = (SGBWidth - GBWidth) >> 1;
gbBorderRowSkip = (SGBHeight - GBHeight) >> 1;
bool changed = ((width != sgbWidth) || (height != sgbHeight));
width = gbBorderLineSkip = sgbWidth;
height = sgbHeight;
gbBorderColumnSkip = (sgbWidth - gbWidth) >> 1;
gbBorderRowSkip = (sgbHeight - gbHeight) >> 1;
struct retro_system_av_info avinfo;
retro_get_system_av_info(&avinfo);
@ -1663,9 +1669,9 @@ void systemGbBorderOn(void)
static void systemGbBorderOff(void)
{
bool changed = ((width != GBWidth) || (height != GBHeight));
width = gbBorderLineSkip = GBWidth;
height = GBHeight;
bool changed = ((width != gbWidth) || (height != gbHeight));
width = gbBorderLineSkip = gbWidth;
height = gbHeight;
gbBorderColumnSkip = gbBorderRowSkip = 0;
struct retro_system_av_info avinfo;

View File

@ -1,10 +1,6 @@
#ifndef _S_CRC32_H
#define _S_CRC32_H
#ifdef __cplusplus
extern "C" {
#endif
static const unsigned long crc_table[256] = {
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
@ -87,8 +83,4 @@ unsigned long crc32(unsigned long crc, const unsigned char* buf, unsigned int le
return crc ^ 0xffffffffL;
}
#ifdef __cplusplus
}
#endif
#endif