bugfixes, refactoring

git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@394 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2008-03-25 19:23:07 +00:00
parent 367b6f1f93
commit 8e708f920f
8 changed files with 111 additions and 128 deletions

View file

@ -538,11 +538,13 @@ bram (internal backup RAM): yes
Problems / limitations Problems / limitations
---------------------- ----------------------
* 32x and SVP are not emulated. * 32x is not emulated.
#ifdef PSP
* SVP is not emulated.
#endif
* Various VDP quirks (window bug, scroll size 2, etc.) are not emulated, * Various VDP quirks (window bug, scroll size 2, etc.) are not emulated,
as very few games use this (if any at all). as very few games use this (if any at all).
* Some games don't work or have glitches because of inaccurate timing and sync * The emulator is not 100% accurate, so some things may not work as expected.
between the emulated chips.
Credits Credits
@ -600,6 +602,7 @@ Additional thanks
* Charles MacDonald (http://cgfm2.emuviews.com/) for old but still very useful * Charles MacDonald (http://cgfm2.emuviews.com/) for old but still very useful
info about genesis hardware. info about genesis hardware.
* Steve Snake for all that he has done for Genesis emulation scene. * Steve Snake for all that he has done for Genesis emulation scene.
* Tasco Deluxe for his reverse engineering work on SVP and some mappers.
* Bart Trzynadlowski for his SSFII and 68000 docs. * Bart Trzynadlowski for his SSFII and 68000 docs.
* Haze for his research (http://haze.mameworld.info). * Haze for his research (http://haze.mameworld.info).
* Mark and Jean-loup for zlib library. * Mark and Jean-loup for zlib library.
@ -633,6 +636,14 @@ Additional thanks
Changelog Changelog
--------- ---------
1.40
+ Added support for SVP (Sega Virtua Processor) to emulate Virtua Racing,
wrote ARM recompiler and some HLE code for VR.
* Changed config file format, files are now human-readable. Game specific
configs are now held in single file (but old game config files are still
read).
* Fixed a bug where some key combos didn't work.
1.35b 1.35b
* PSP: mp3 code should no longer fail on 1.5 firmware. * PSP: mp3 code should no longer fail on 1.5 firmware.
+ PSP: added gamma adjustment option. + PSP: added gamma adjustment option.

View file

@ -24,7 +24,7 @@ static const int *cfg_opt_counts[] = { &opt_entry_count, &opt2_entry_count, &cdo
#define NL "\n" #define NL "\n"
static void mystrip(char *str) static char *mystrip(char *str)
{ {
int i, len; int i, len;
@ -32,10 +32,13 @@ static void mystrip(char *str)
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
if (str[i] != ' ') break; if (str[i] != ' ') break;
if (i > 0) memmove(str, str + i, len - i + 1); if (i > 0) memmove(str, str + i, len - i + 1);
len = strlen(str); len = strlen(str);
for (i = len - 1; i >= 0; i--) for (i = len - 1; i >= 0; i--)
if (str[i] != ' ') break; if (str[i] != ' ') break;
str[i+1] = 0; str[i+1] = 0;
return str;
} }
@ -167,22 +170,18 @@ static void keys_write(FILE *fn, const char *bind_str, const int binds[32],
#endif #endif
for (i = 0; i < sizeof(me_ctrl_actions) / sizeof(me_ctrl_actions[0]); i++) { for (i = 0; i < sizeof(me_ctrl_actions) / sizeof(me_ctrl_actions[0]); i++) {
if (me_ctrl_actions[i].mask & binds[t]) { if (me_ctrl_actions[i].mask & binds[t]) {
sprintf(act, "player%i ", ((binds[t]>>16)&1)+1); strncpy(act, me_ctrl_actions[i].name, 31);
strncpy(act + 8, me_ctrl_actions[i].name, 31); fprintf(fn, "%s %s = player%i %s" NL, bind_str, names[t],
break; ((binds[t]>>16)&1)+1, mystrip(act));
} }
} }
if (act[0] == 0)
{
for (i = 0; emuctrl_actions[i].name != NULL; i++)
if (emuctrl_actions[i].mask & binds[t]) {
strncpy(act, emuctrl_actions[i].name, 31);
break;
}
}
mystrip(act);
fprintf(fn, "%s %s = %s" NL, bind_str, names[t], act); for (i = 0; emuctrl_actions[i].name != NULL; i++) {
if (emuctrl_actions[i].mask & binds[t]) {
strncpy(act, emuctrl_actions[i].name, 31);
fprintf(fn, "%s %s = %s" NL, bind_str, names[t], mystrip(act));
}
}
} }
} }
@ -566,9 +565,11 @@ static int custom_read(menu_entry *me, const char *var, const char *val)
} }
static unsigned int keys_encountered = 0;
static void keys_parse(const char *var, const char *val, int binds[32], const char *names[32]) static void keys_parse(const char *var, const char *val, int binds[32], const char *names[32])
{ {
int t, i, keys_encountered = 0; int t, i;
unsigned int player; unsigned int player;
for (t = 0; t < 32; t++) for (t = 0; t < 32; t++)
@ -580,7 +581,7 @@ static void keys_parse(const char *var, const char *val, int binds[32], const ch
return; return;
} }
if (!(keys_encountered & (1<<t))) { if (binds == currentConfig.KeyBinds && !(keys_encountered & (1<<t))) { // hack
binds[t] = 0; binds[t] = 0;
keys_encountered |= 1<<t; keys_encountered |= 1<<t;
} }
@ -607,7 +608,6 @@ static void keys_parse(const char *var, const char *val, int binds[32], const ch
fail: fail:
lprintf("unhandled action \"%s\"\n", val); lprintf("unhandled action \"%s\"\n", val);
return; return;
} }
@ -698,6 +698,8 @@ int config_readsect(const char *fname, const char *section)
} }
} }
keys_encountered = 0;
while (!feof(f)) while (!feof(f))
{ {
tmp = fgets(line, sizeof(line), f); tmp = fgets(line, sizeof(line), f);

View file

@ -41,6 +41,7 @@ char noticeMsg[64];
int state_slot = 0; int state_slot = 0;
int config_slot = 0, config_slot_current = 0; int config_slot = 0, config_slot_current = 0;
char lastRomFile[512]; char lastRomFile[512];
int kb_combo_keys = 0, kb_combo_acts = 0; // keys and actions which need button combos
unsigned char *movie_data = NULL; unsigned char *movie_data = NULL;
static int movie_size = 0; static int movie_size = 0;
@ -232,18 +233,20 @@ static int extract_text(char *dest, unsigned char *src, int len, int swab)
char *emu_makeRomId(void) char *emu_makeRomId(void)
{ {
static char id_string[3+0x11+0x11+0x30+16]; static char id_string[3+0x11+0x11+0x30+16];
int pos; int pos, swab = 1;
if (PicoMCD & 1) if (PicoMCD & 1) {
strcpy(id_string, "CD|"); strcpy(id_string, "CD|");
swab = 0;
}
else strcpy(id_string, "MD|"); else strcpy(id_string, "MD|");
pos = 3; pos = 3;
pos += extract_text(id_string + pos, id_header + 0x80, 0x0e, 1); // serial pos += extract_text(id_string + pos, id_header + 0x80, 0x0e, swab); // serial
id_string[pos] = '|'; pos++; id_string[pos] = '|'; pos++;
pos += extract_text(id_string + pos, id_header + 0xf0, 0x03, 1); // region pos += extract_text(id_string + pos, id_header + 0xf0, 0x03, swab); // region
id_string[pos] = '|'; pos++; id_string[pos] = '|'; pos++;
pos += extract_text(id_string + pos, id_header + 0x50, 0x30, 1); // overseas name pos += extract_text(id_string + pos, id_header + 0x50, 0x30, swab); // overseas name
id_string[pos] = 0; id_string[pos] = 0;
return id_string; return id_string;
@ -328,6 +331,7 @@ int emu_ReloadRom(void)
cd_state = emu_cdCheck(&cd_region); cd_state = emu_cdCheck(&cd_region);
if (cd_state > 0) if (cd_state > 0)
{ {
PicoMCD |= 1;
// valid CD image, check for BIOS.. // valid CD image, check for BIOS..
// we need to have config loaded at this point // we need to have config loaded at this point
@ -341,10 +345,10 @@ int emu_ReloadRom(void)
} }
if (!emu_findBios(cd_region, &used_rom_name)) { if (!emu_findBios(cd_region, &used_rom_name)) {
// bios_help() ? // bios_help() ?
PicoMCD &= ~1;
return 0; return 0;
} }
PicoMCD |= 1;
get_ext(used_rom_name, ext); get_ext(used_rom_name, ext);
} }
else else
@ -651,6 +655,47 @@ void emu_textOut16(int x, int y, const char *text)
} }
} }
void emu_findKeyBindCombos(void)
{
int act, u;
// find out which keys and actions are combos
kb_combo_keys = kb_combo_acts = 0;
for (act = 0; act < 32; act++)
{
int keyc = 0, keyc2 = 0;
if (act == 16 || act == 17) continue; // player2 flag
if (act > 17)
{
for (u = 0; u < 32; u++)
if (currentConfig.KeyBinds[u] & (1 << act)) keyc++;
}
else
{
for (u = 0; u < 32; u++)
if ((currentConfig.KeyBinds[u] & 0x30000) == 0 && // pl. 1
(currentConfig.KeyBinds[u] & (1 << act))) keyc++;
for (u = 0; u < 32; u++)
if ((currentConfig.KeyBinds[u] & 0x30000) == 1 && // pl. 2
(currentConfig.KeyBinds[u] & (1 << act))) keyc2++;
if (keyc2 > keyc) keyc = keyc2;
}
if (keyc > 1)
{
// loop again and mark those keys and actions as combo
for (u = 0; u < 32; u++)
{
if (currentConfig.KeyBinds[u] & (1 << act)) {
kb_combo_keys |= 1 << u;
kb_combo_acts |= 1 << act;
}
}
}
}
// printf("combo keys/acts: %08x %08x\n", kb_combo_keys, kb_combo_acts);
}
void emu_updateMovie(void) void emu_updateMovie(void)
{ {
@ -876,3 +921,4 @@ int emu_SaveLoadGame(int load, int sram)
return ret; return ret;
} }
} }

View file

@ -34,6 +34,7 @@ extern int state_slot;
extern int config_slot, config_slot_current; extern int config_slot, config_slot_current;
extern unsigned char *movie_data; extern unsigned char *movie_data;
extern char lastRomFile[512]; extern char lastRomFile[512];
extern int kb_combo_keys, kb_combo_acts; // keys and actions which need button combos
int emu_ReloadRom(void); int emu_ReloadRom(void);
@ -49,6 +50,7 @@ int emu_findBios(int region, char **bios_file);
void emu_textOut8 (int x, int y, const char *text); void emu_textOut8 (int x, int y, const char *text);
void emu_textOut16(int x, int y, const char *text); void emu_textOut16(int x, int y, const char *text);
char *emu_makeRomId(void); char *emu_makeRomId(void);
void emu_findKeyBindCombos(void);
extern const char *keyNames[]; extern const char *keyNames[];
void emu_prepareDefaultConfig(void); void emu_prepareDefaultConfig(void);

View file

@ -48,7 +48,6 @@ extern int crashed_940;
static short __attribute__((aligned(4))) sndBuffer[2*44100/50]; static short __attribute__((aligned(4))) sndBuffer[2*44100/50];
static struct timeval noticeMsgTime = { 0, 0 }; // when started showing static struct timeval noticeMsgTime = { 0, 0 }; // when started showing
static int osd_fps_x; static int osd_fps_x;
static int combo_keys = 0, combo_acts = 0; // keys and actions which need button combos
static int gp2x_old_gamma = 100; static int gp2x_old_gamma = 100;
char noticeMsg[64]; // notice msg to draw char noticeMsg[64]; // notice msg to draw
unsigned char *PicoDraw2FB = NULL; // temporary buffer for alt renderer unsigned char *PicoDraw2FB = NULL; // temporary buffer for alt renderer
@ -98,48 +97,6 @@ void emu_Init(void)
} }
static void find_combos(void)
{
int act, u;
// find out which keys and actions are combos
combo_keys = combo_acts = 0;
for (act = 0; act < 32; act++)
{
int keyc = 0, keyc2 = 0;
if (act == 16 || act == 17) continue; // player2 flag
if (act > 17)
{
for (u = 0; u < 32; u++)
if (currentConfig.KeyBinds[u] & (1 << act)) keyc++;
}
else
{
for (u = 0; u < 32; u++)
if ((currentConfig.KeyBinds[u] & 0x30000) == 0 && // pl. 1
(currentConfig.KeyBinds[u] & (1 << act))) keyc++;
for (u = 0; u < 32; u++)
if ((currentConfig.KeyBinds[u] & 0x30000) == 1 && // pl. 2
(currentConfig.KeyBinds[u] & (1 << act))) keyc2++;
if (keyc2 > keyc) keyc = keyc2;
}
if (keyc > 1)
{
// loop again and mark those keys and actions as combo
for (u = 0; u < 32; u++)
{
if (currentConfig.KeyBinds[u] & (1 << act)) {
combo_keys |= 1 << u;
combo_acts |= 1 << act;
}
}
}
}
// printf("combo keys/acts: %08x %08x\n", combo_keys, combo_acts);
}
static void scaling_update(void) static void scaling_update(void)
{ {
PicoOpt &= ~0x4100; PicoOpt &= ~0x4100;
@ -577,23 +534,26 @@ static void updateKeys(void)
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
{ {
if (keys & (1 << i)) { if (keys & (1 << i))
{
int pl, acts = currentConfig.KeyBinds[i]; int pl, acts = currentConfig.KeyBinds[i];
if (!acts) continue; if (!acts) continue;
pl = (acts >> 16) & 1; pl = (acts >> 16) & 1;
if (combo_keys & (1 << i)) { if (kb_combo_keys & (1 << i))
int u = i+1, acts_c = acts & combo_acts; {
int u, acts_c = acts & kb_combo_acts;
// let's try to find the other one // let's try to find the other one
if (acts_c) if (acts_c) {
for (; u < 32; u++) for (u = i + 1; u < 32; u++)
if ( (currentConfig.KeyBinds[u] & acts_c) && (keys & (1 << u)) ) { if ( (keys & (1 << u)) && (currentConfig.KeyBinds[u] & acts_c) ) {
allActions[pl] |= acts_c; allActions[pl] |= acts_c & currentConfig.KeyBinds[u];
keys &= ~((1 << i) | (1 << u)); keys &= ~((1 << i) | (1 << u));
break; break;
} }
}
// add non-combo actions if combo ones were not found // add non-combo actions if combo ones were not found
if (!acts_c || u == 32) if (!acts_c || u == 32)
allActions[pl] |= acts & ~combo_acts; allActions[pl] |= acts & ~kb_combo_acts;
} else { } else {
allActions[pl] |= acts; allActions[pl] |= acts;
} }
@ -740,7 +700,7 @@ void emu_Loop(void)
scaling_update(); scaling_update();
Pico.m.dirtyPal = 1; Pico.m.dirtyPal = 1;
oldmodes = ((Pico.video.reg[12]&1)<<2) ^ 0xc; oldmodes = ((Pico.video.reg[12]&1)<<2) ^ 0xc;
find_combos(); emu_findKeyBindCombos();
// pal/ntsc might have changed, reset related stuff // pal/ntsc might have changed, reset related stuff
target_fps = Pico.m.pal ? 50 : 60; target_fps = Pico.m.pal ? 50 : 60;

View file

@ -845,7 +845,7 @@ static void kc_sel_loop(void)
case 0: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 0); return; case 0: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 0); return;
case 1: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 1); return; case 1: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 1); return;
case 2: key_config_loop(emuctrl_actions, case 2: key_config_loop(emuctrl_actions,
sizeof(emuctrl_actions)/sizeof(emuctrl_actions[0]), -1); return; sizeof(emuctrl_actions)/sizeof(emuctrl_actions[0]) - 1, -1); return;
case 3: if (!rom_loaded) emu_WriteConfig(0); return; case 3: if (!rom_loaded) emu_WriteConfig(0); return;
default: return; default: return;
} }

View file

@ -35,7 +35,6 @@ char romFileName[PATH_MAX];
unsigned char *PicoDraw2FB = (unsigned char *)VRAM_CACHED_STUFF + 8; // +8 to be able to skip border with 1 quadword.. unsigned char *PicoDraw2FB = (unsigned char *)VRAM_CACHED_STUFF + 8; // +8 to be able to skip border with 1 quadword..
int engineState = PGS_Menu; int engineState = PGS_Menu;
static int combo_keys = 0, combo_acts = 0; // keys and actions which need button combos
static unsigned int noticeMsgTime = 0; static unsigned int noticeMsgTime = 0;
int reset_timing = 0; // do we need this? int reset_timing = 0; // do we need this?
@ -764,20 +763,21 @@ static void updateKeys(void)
int pl, acts = currentConfig.KeyBinds[i]; int pl, acts = currentConfig.KeyBinds[i];
if (!acts) continue; if (!acts) continue;
pl = (acts >> 16) & 1; pl = (acts >> 16) & 1;
if (combo_keys & (1 << i)) if (kb_combo_keys & (1 << i))
{ {
int u = i+1, acts_c = acts & combo_acts; int u, acts_c = acts & kb_combo_acts;
// let's try to find the other one // let's try to find the other one
if (acts_c) if (acts_c) {
for (; u < 32; u++) for (u = i + 1; u < 32; u++)
if ( (currentConfig.KeyBinds[u] & acts_c) && (keys & (1 << u)) ) { if ( (keys & (1 << u)) && (currentConfig.KeyBinds[u] & acts_c) ) {
allActions[pl] |= acts_c; allActions[pl] |= acts_c & currentConfig.KeyBinds[u];
keys &= ~((1 << i) | (1 << u)); keys &= ~((1 << i) | (1 << u));
break; break;
} }
}
// add non-combo actions if combo ones were not found // add non-combo actions if combo ones were not found
if (!acts_c || u == 32) if (!acts_c || u == 32)
allActions[pl] |= acts & ~combo_acts; allActions[pl] |= acts & ~kb_combo_acts;
} else { } else {
allActions[pl] |= acts; allActions[pl] |= acts;
} }
@ -811,44 +811,6 @@ static void updateKeys(void)
prevEvents = (allActions[0] | allActions[1]) >> 16; prevEvents = (allActions[0] | allActions[1]) >> 16;
} }
static void find_combos(void)
{
int act, u;
// find out which keys and actions are combos
combo_keys = combo_acts = 0;
for (act = 0; act < 32; act++)
{
int keyc = 0, keyc2 = 0;
if (act == 16 || act == 17) continue; // player2 flag
if (act > 17)
{
for (u = 0; u < 28; u++) // 28 because nub can't produce combos
if (currentConfig.KeyBinds[u] & (1 << act)) keyc++;
}
else
{
for (u = 0; u < 28; u++)
if ((currentConfig.KeyBinds[u] & 0x30000) == 0 && // pl. 1
(currentConfig.KeyBinds[u] & (1 << act))) keyc++;
for (u = 0; u < 28; u++)
if ((currentConfig.KeyBinds[u] & 0x30000) == 1 && // pl. 2
(currentConfig.KeyBinds[u] & (1 << act))) keyc2++;
}
if (keyc > 1 || keyc2 > 1)
{
// loop again and mark those keys and actions as combo
for (u = 0; u < 28; u++)
{
if (currentConfig.KeyBinds[u] & (1 << act)) {
combo_keys |= 1 << u;
combo_acts |= 1 << act;
}
}
}
}
}
static void simpleWait(unsigned int until) static void simpleWait(unsigned int until)
{ {
@ -886,7 +848,7 @@ void emu_Loop(void)
clearArea(1); clearArea(1);
Pico.m.dirtyPal = 1; Pico.m.dirtyPal = 1;
oldmodes = ((Pico.video.reg[12]&1)<<2) ^ 0xc; oldmodes = ((Pico.video.reg[12]&1)<<2) ^ 0xc;
find_combos(); emu_findKeyBindCombos();
// pal/ntsc might have changed, reset related stuff // pal/ntsc might have changed, reset related stuff
target_fps = Pico.m.pal ? 50 : 60; target_fps = Pico.m.pal ? 50 : 60;

View file

@ -817,7 +817,7 @@ static void kc_sel_loop(void)
case 0: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 0); return; case 0: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 0); return;
case 1: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 1); return; case 1: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 1); return;
case 2: key_config_loop(emuctrl_actions, case 2: key_config_loop(emuctrl_actions,
sizeof(emuctrl_actions)/sizeof(emuctrl_actions[0]), -1); return; sizeof(emuctrl_actions)/sizeof(emuctrl_actions[0]) - 1, -1); return;
case 3: if (!rom_loaded) emu_WriteConfig(0); return; case 3: if (!rom_loaded) emu_WriteConfig(0); return;
default: return; default: return;
} }