Merge remote-tracking branch 'libretro/master'

Signed-off-by: Rafael Kitover <rkitover@gmail.com>
This commit is contained in:
Rafael Kitover 2020-08-14 11:00:06 +00:00
commit 08b5685049
No known key found for this signature in database
GPG Key ID: 08AB596679D86240
9 changed files with 169 additions and 77 deletions

1
.gitignore vendored
View File

@ -14,6 +14,7 @@ vcpkg/*
*.so
*.dll
*.exe
.vscode
# vim swap files
*.sw?

View File

@ -2581,8 +2581,7 @@ static INSN_REGPARM void armA00(uint32_t opcode)
armNextPC = reg[15].I;
reg[15].I += 4;
ARM_PREFETCH;
clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1;
clockTicks = (codeTicksAccessSeq32(armNextPC) * 2) + codeTicksAccess32(armNextPC) + 3;
busPrefetchCount = 0;
}
@ -2595,8 +2594,7 @@ static INSN_REGPARM void armB00(uint32_t opcode)
armNextPC = reg[15].I;
reg[15].I += 4;
ARM_PREFETCH;
clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1;
clockTicks = (codeTicksAccessSeq32(armNextPC) * 2) + codeTicksAccess32(armNextPC) + 3;
busPrefetchCount = 0;
}
@ -2612,8 +2610,7 @@ static INSN_REGPARM void armE01(uint32_t opcode)
// SWI <comment>
static INSN_REGPARM void armF00(uint32_t opcode)
{
clockTicks = codeTicksAccessSeq32(armNextPC) + 1;
clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1;
clockTicks = (codeTicksAccessSeq32(armNextPC) * 2) + codeTicksAccess32(armNextPC) + 3;
busPrefetchCount = 0;
CPUSoftwareInterrupt(opcode & 0x00FFFFFF);
}

View File

@ -1146,9 +1146,9 @@ static INSN_REGPARM void thumb43_1(uint32_t opcode)
reg[dest].I = reg[(opcode >> 3) & 7].I * rm;
if (((int32_t)rm) < 0)
rm = ~rm;
if ((rm & 0xFFFFFF00) == 0)
clockTicks += 0;
else if ((rm & 0xFFFF0000) == 0)
if ((rm & 0xFFFFFF00) == 0) {
// clockTicks += 0;
} else if ((rm & 0xFFFF0000) == 0)
clockTicks += 1;
else if ((rm & 0xFF000000) == 0)
clockTicks += 2;
@ -1625,7 +1625,7 @@ static INSN_REGPARM void thumbBD(uint32_t opcode)
reg[13].I = temp;
THUMB_PREFETCH;
busPrefetchCount = 0;
clockTicks += 3 + codeTicksAccess16(armNextPC) + codeTicksAccess16(armNextPC);
clockTicks += 3 + (codeTicksAccess16(armNextPC) * 2);
}
// Load/store multiple ////////////////////////////////////////////////////
@ -1703,7 +1703,7 @@ static INSN_REGPARM void thumbC8(uint32_t opcode)
#define THUMB_CONDITIONAL_BRANCH(COND) \
UPDATE_OLDREG; \
clockTicks = codeTicksAccessSeq16(armNextPC) + 1; \
if (COND) { \
if ((bool)COND) { \
uint32_t offset = (uint32_t)((int8_t)(opcode & 0xFF)) << 1; \
reg[15].I += offset; \
armNextPC = reg[15].I; \

View File

@ -103,16 +103,17 @@ static inline uint32_t CPUReadMemory(uint32_t address)
case 5:
value = READ32LE(((uint32_t*)&paletteRAM[address & 0x3fC]));
break;
case 6:
address = (address & 0x1fffc);
if (((DISPCNT & 7) > 2) && ((address & 0x1C000) == 0x18000)) {
case 6: {
unsigned addr = (address & 0x1fffc);
if (((DISPCNT & 7) > 2) && ((addr & 0x1C000) == 0x18000)) {
value = 0;
break;
}
if ((address & 0x18000) == 0x18000)
address &= 0x17fff;
value = READ32LE(((uint32_t*)&vram[address]));
if ((addr & 0x18000) == 0x18000)
addr &= 0x17fff;
value = READ32LE(((uint32_t*)&vram[addr]));
break;
}
case 7:
value = READ32LE(((uint32_t*)&oam[address & 0x3FC]));
break;
@ -253,16 +254,17 @@ static inline uint32_t CPUReadHalfWord(uint32_t address)
case 5:
value = READ16LE(((uint16_t*)&paletteRAM[address & 0x3fe]));
break;
case 6:
address = (address & 0x1fffe);
if (((DISPCNT & 7) > 2) && ((address & 0x1C000) == 0x18000)) {
case 6: {
unsigned addr = (address & 0x1fffe);
if (((DISPCNT & 7) > 2) && ((addr & 0x1C000) == 0x18000)) {
value = 0;
break;
}
if ((address & 0x18000) == 0x18000)
address &= 0x17fff;
value = READ16LE(((uint16_t*)&vram[address]));
if ((addr & 0x18000) == 0x18000)
addr &= 0x17fff;
value = READ16LE(((uint16_t*)&vram[addr]));
break;
}
case 7:
value = READ16LE(((uint16_t*)&oam[address & 0x3fe]));
break;
@ -293,11 +295,10 @@ static inline uint32_t CPUReadHalfWord(uint32_t address)
if (cpuDmaHack) {
value = cpuDmaLast & 0xFFFF;
} else {
if (armState) {
value = CPUReadHalfWordQuick(reg[15].I + (address & 2));
} else {
value = CPUReadHalfWordQuick(reg[15].I);
}
int param = reg[15].I;
if (armState)
param += (address & 2);
value = CPUReadHalfWordQuick(param);
}
#ifdef GBA_LOGGING
if (systemVerbose & VERBOSE_ILLEGAL_READ) {

View File

@ -42,6 +42,11 @@ int16_t sineTable[256] = {
(int16_t)0xF384, (int16_t)0xF50F, (int16_t)0xF69C, (int16_t)0xF82B, (int16_t)0xF9BB, (int16_t)0xFB4B, (int16_t)0xFCDD, (int16_t)0xFE6E
};
// 2020-08-12 - negativeExponent
// Fix ArcTan and ArcTan2 based on mgba's hle bios fixes
// https://github.com/mgba-emu/mgba/commit/14dc01409c9e971ea0697f5017b45d0db6a7faf5#diff-8f06a143a9fd912c83209f935d3aca25
// https://github.com/mgba-emu/mgba/commit/b154457857d3367a4c0196a4abadeeb6c850ffdf#diff-8f06a143a9fd912c83209f935d3aca25
void BIOS_ArcTan()
{
#ifdef GBA_LOGGING
@ -53,7 +58,7 @@ void BIOS_ArcTan()
#endif
int32_t i = reg[0].I;
int32_t a = -((i*i) >> 14);
int32_t a = -((i * i) >> 14);
int32_t b = ((0xA9 * a) >> 14) + 0x390;
b = ((b * a) >> 14) + 0x91C;
b = ((b * a) >> 14) + 0xFB6;
@ -111,6 +116,7 @@ void BIOS_ArcTan2()
}
}
reg[0].I = res;
reg[3].I = 0x170;
#ifdef GBA_LOGGING
if (systemVerbose & VERBOSE_SWI) {

View File

@ -59,3 +59,8 @@ SOURCES_CXX += \
$(CORE_DIR)/gb/gbMemory.cpp \
$(CORE_DIR)/gb/gbSGB.cpp \
$(CORE_DIR)/gb/gbSound.cpp
# Filters
SOURCES_CXX += \
$(CORE_DIR)/filters/interframe.cpp \
$(CORE_DIR)/gba/gbafilter.cpp

View File

@ -232,17 +232,25 @@ void utilUpdateSystemColorMaps(bool lcd)
{
int i = 0;
(void)lcd;
switch (systemColorDepth) {
case 16:
for (i = 0; i < 0x10000; i++)
systemColorMap16[i] = ((i & 0x1f) << systemRedShift) | (((i & 0x3e0) >> 5) << systemGreenShift) | (((i & 0x7c00) >> 10) << systemBlueShift);
for (i = 0; i < 0x10000; i++) {
systemColorMap16[i] = ((i & 0x1f) << systemRedShift) |
(((i & 0x3e0) >> 5) << systemGreenShift) |
(((i & 0x7c00) >> 10) << systemBlueShift);
}
if (lcd)
gbafilter_pal(systemColorMap16, 0x10000);
break;
case 24:
case 32:
for (i = 0; i < 0x10000; i++)
systemColorMap32[i] = ((i & 0x1f) << systemRedShift) | (((i & 0x3e0) >> 5) << systemGreenShift) | (((i & 0x7c00) >> 10) << systemBlueShift);
for (i = 0; i < 0x10000; i++) {
systemColorMap32[i] = ((i & 0x1f) << systemRedShift) |
(((i & 0x3e0) >> 5) << systemGreenShift) |
(((i & 0x7c00) >> 10) << systemBlueShift);
}
if (lcd)
gbafilter_pal32(systemColorMap32, 0x10000);
break;
}
}

View File

@ -33,6 +33,8 @@
#include "../gb/gbSGB.h"
#include "../gb/gbSound.h"
#include "../filters/interframe.hpp"
#define FRAMERATE (16777216.0 / 280896.0) // 59.73
#define SAMPLERATE 32768.0
@ -56,6 +58,9 @@ static bool option_forceRTCenable = false;
static bool option_showAdvancedOptions = false;
static double option_sndFiltering = 0.5;
static unsigned option_gbPalette = 0;
static bool option_lcdfilter = false;
// filters
static IFBFilterFunc ifb_filter_func = NULL;
static unsigned retropad_device[4] = {0};
static unsigned systemWidth = gbaWidth;
@ -66,7 +71,7 @@ static IMAGE_TYPE type = IMAGE_UNKNOWN;
// global vars
uint16_t systemColorMap16[0x10000];
uint32_t systemColorMap32[0x10000];
int RGB_LOW_BITS_MASK = 0;
int RGB_LOW_BITS_MASK = 0x821; // used for 16bit inter-frame filters
int systemRedShift = 0;
int systemBlueShift = 0;
int systemGreenShift = 0;
@ -189,7 +194,7 @@ static struct palettes_t defaultGBPalettes[] = {
},
{
"Weird Colors",
{ 0x621F, 0x401F, 0x001F, 0x2010, 0x621F, 0x401F, 0x001F, 0x2010 }
{ 0x621F, 0x401F, 0x001F, 0x2010, 0x621F, 0x401F, 0x001F, 0x2010 },
},
{
"Real GB Colors",
@ -630,9 +635,9 @@ void retro_init(void)
bool yes = true;
environ_cb(RETRO_ENVIRONMENT_SET_SUPPORT_ACHIEVEMENTS, &yes);
if (environ_cb(RETRO_ENVIRONMENT_GET_RUMBLE_INTERFACE, &rumble)) {
if (environ_cb(RETRO_ENVIRONMENT_GET_RUMBLE_INTERFACE, &rumble))
rumble_cb = rumble.set_rumble_state;
} else
else
rumble_cb = NULL;
}
@ -1211,6 +1216,40 @@ static void update_variables(bool startup)
gbColorOption = (!strcmp(var.value, "enabled")) ? 1 : 0;
}
var.key = "vbam_lcdfilter";
var.value = NULL;
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
bool prev_lcdfilter = option_lcdfilter;
option_lcdfilter = (!strcmp(var.value, "enabled")) ? true : false;
if (prev_lcdfilter != option_lcdfilter)
utilUpdateSystemColorMaps(option_lcdfilter);
}
var.key = "vbam_interframeblending";
var.value = NULL;
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
if (!strcmp(var.value, "smart"))
{
if (systemColorDepth == 16)
ifb_filter_func = SmartIB;
else
ifb_filter_func = SmartIB32;
}
else if (!strcmp(var.value, "motion blur"))
{
if (systemColorDepth == 16)
ifb_filter_func = MotionBlurIB;
else
ifb_filter_func = MotionBlurIB32;
}
else
ifb_filter_func = NULL;
}
else
ifb_filter_func = NULL;
var.key = "vbam_show_advanced_options";
var.value = NULL;
@ -1285,6 +1324,7 @@ static void update_variables(bool startup)
#define ROUND(x) floor((x) + 0.5)
#define ASTICK_MAX 0x8000
static int analog_x, analog_y, analog_z;
static uint32_t input_buf[MAX_PLAYERS] = { 0 };
static void updateInput_MotionSensors(void)
{
@ -1366,6 +1406,45 @@ void updateInput_SolarSensor(void)
}
}
// Update joypads
static void updateInput_Joypad(void)
{
unsigned max_buttons = MAX_BUTTONS - ((type == IMAGE_GB) ? 2 : 0); // gb only has 8 buttons
for (unsigned port = 0; port < MAX_PLAYERS; port++)
{
// Reset input states
input_buf[port] = 0;
if (retropad_device[port] == RETRO_DEVICE_JOYPAD) {
for (unsigned button = 0; button < max_buttons; button++)
input_buf[port] |= input_cb(port, RETRO_DEVICE_JOYPAD, 0, binds[button]) << button;
if (option_turboEnable) {
/* Handle Turbo A & B buttons */
for (unsigned tbutton = 0; tbutton < TURBO_BUTTONS; tbutton++) {
if (input_cb(port, RETRO_DEVICE_JOYPAD, 0, turbo_binds[tbutton])) {
if (!turbo_delay_counter[port][tbutton])
input_buf[port] |= 1 << tbutton;
turbo_delay_counter[port][tbutton]++;
if (turbo_delay_counter[port][tbutton] > option_turboDelay)
/* Reset the toggle if delay value is reached */
turbo_delay_counter[port][tbutton] = 0;
}
else
/* If the button is not pressed, just reset the toggle */
turbo_delay_counter[port][tbutton] = 0;
}
}
// Do not allow opposing directions
if ((input_buf[port] & 0x30) == 0x30)
input_buf[port] &= ~(0x30);
else if ((input_buf[port] & 0xC0) == 0xC0)
input_buf[port] &= ~(0xC0);
}
}
}
static bool firstrun = true;
static unsigned has_frame;
@ -1402,6 +1481,7 @@ void retro_run(void)
poll_cb();
updateInput_Joypad();
updateInput_SolarSensor();
updateInput_MotionSensors();
@ -1539,8 +1619,8 @@ bool retro_load_game(const struct retro_game_info *game)
return false;
}
utilUpdateSystemColorMaps(option_lcdfilter);
update_variables(true);
utilUpdateSystemColorMaps(false);
soundInit();
if (type == IMAGE_GBA) {
@ -1701,6 +1781,8 @@ bool systemCanChangeSoundQuality(void)
void systemDrawScreen(void)
{
unsigned pitch = systemWidth * (systemColorDepth >> 3);
if (ifb_filter_func)
ifb_filter_func(pix, pitch, systemWidth, systemHeight);
video_cb(pix, systemWidth, systemHeight, pitch);
}
@ -1742,40 +1824,9 @@ void systemMessage(int, const char* fmt, ...)
uint32_t systemReadJoypad(int which)
{
uint32_t J = 0;
unsigned i, buttons = MAX_BUTTONS - ((type == IMAGE_GB) ? 2 : 0); // gb only has 8 buttons
if (which == -1)
which = 0;
if (retropad_device[which] == RETRO_DEVICE_JOYPAD) {
for (i = 0; i < buttons; i++)
J |= input_cb(which, RETRO_DEVICE_JOYPAD, 0, binds[i]) << i;
if (option_turboEnable) {
/* Handle Turbo A & B buttons */
for (i = 0; i < TURBO_BUTTONS; i++) {
if (input_cb(which, RETRO_DEVICE_JOYPAD, 0, turbo_binds[i])) {
if (!turbo_delay_counter[which][i])
J |= 1 << i;
turbo_delay_counter[which][i]++;
if (turbo_delay_counter[which][i] > option_turboDelay)
/* Reset the toggle if delay value is reached */
turbo_delay_counter[which][i] = 0;
} else
/* If the button is not pressed, just reset the toggle */
turbo_delay_counter[which][i] = 0;
}
}
}
// Do not allow opposing directions
if ((J & 0x30) == 0x30)
J &= ~(0x30);
else if ((J & 0xC0) == 0xC0)
J &= ~(0xC0);
return J;
return input_buf[which];
}
static void systemUpdateSolarSensor(int v)

View File

@ -189,6 +189,29 @@ struct retro_core_option_definition option_defs_us[] = {
},
"disabled"
},
{
"vbam_lcdfilter",
"LCD Color Filter",
"TODO:",
{
{ "disabled", NULL },
{ "enabled", NULL },
{ NULL, NULL },
},
"disabled"
},
{
"vbam_interframeblending",
"Interframe Blending",
"TODO:",
{
{ "disabled", NULL },
{ "smart", NULL },
{ "motion blur", NULL },
{ NULL, NULL },
},
"disabled"
},
{
"vbam_turboenable",
"Enable Turbo Buttons",