From: notaz <notasas@gmail.com>
Date: Tue, 25 Mar 2008 19:23:07 +0000 (+0000)
Subject: bugfixes, refactoring
X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8e708f920ffd20b026aed616e58c8c8e94c8fb8d;p=libpicofe.git

bugfixes, refactoring

git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@394 be3aeb3a-fb24-0410-a615-afba39da0efa
---

diff --git a/base_readme.txt b/base_readme.txt
index 0c63752..947ac98 100644
--- a/base_readme.txt
+++ b/base_readme.txt
@@ -538,11 +538,13 @@ bram (internal backup RAM): yes
 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,
   as very few games use this (if any at all).
-* Some games don't work or have glitches because of inaccurate timing and sync
-  between the emulated chips.
+* The emulator is not 100% accurate, so some things may not work as expected.
 
 
 Credits
@@ -600,6 +602,7 @@ Additional thanks
 * Charles MacDonald (http://cgfm2.emuviews.com/) for old but still very useful
   info about genesis hardware.
 * 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.
 * Haze for his research (http://haze.mameworld.info).
 * Mark and Jean-loup for zlib library.
@@ -633,6 +636,14 @@ Additional thanks
 
 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
   * PSP: mp3 code should no longer fail on 1.5 firmware.
   + PSP: added gamma adjustment option.
diff --git a/common/config.c b/common/config.c
index 534fb40..c117fb9 100644
--- a/common/config.c
+++ b/common/config.c
@@ -24,7 +24,7 @@ static const int *cfg_opt_counts[] = { &opt_entry_count, &opt2_entry_count, &cdo
 #define NL "\n"
 
 
-static void mystrip(char *str)
+static char *mystrip(char *str)
 {
 	int i, len;
 
@@ -32,10 +32,13 @@ static void mystrip(char *str)
 	for (i = 0; i < len; i++)
 		if (str[i] != ' ') break;
 	if (i > 0) memmove(str, str + i, len - i + 1);
+
 	len = strlen(str);
 	for (i = len - 1; i >= 0; i--)
 		if (str[i] != ' ') break;
 	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
 		for (i = 0; i < sizeof(me_ctrl_actions) / sizeof(me_ctrl_actions[0]); i++) {
 			if (me_ctrl_actions[i].mask & binds[t]) {
-				sprintf(act, "player%i ", ((binds[t]>>16)&1)+1);
-				strncpy(act + 8, me_ctrl_actions[i].name, 31);
-				break;
+				strncpy(act, me_ctrl_actions[i].name, 31);
+				fprintf(fn, "%s %s = player%i %s" NL, bind_str, names[t],
+					((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])
 {
-	int t, i, keys_encountered = 0;
+	int t, i;
 	unsigned int player;
 
 	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;
 	}
 
-	if (!(keys_encountered & (1<<t))) {
+	if (binds == currentConfig.KeyBinds && !(keys_encountered & (1<<t))) { // hack
 		binds[t] = 0;
 		keys_encountered |= 1<<t;
 	}
@@ -607,7 +608,6 @@ static void keys_parse(const char *var, const char *val, int binds[32], const ch
 fail:
 	lprintf("unhandled action \"%s\"\n", val);
 	return;
-
 }
 
 
@@ -698,6 +698,8 @@ int config_readsect(const char *fname, const char *section)
 		}
 	}
 
+	keys_encountered = 0;
+
 	while (!feof(f))
 	{
 		tmp = fgets(line, sizeof(line), f);
diff --git a/common/emu.c b/common/emu.c
index 936665b..02640bb 100644
--- a/common/emu.c
+++ b/common/emu.c
@@ -41,6 +41,7 @@ char noticeMsg[64];
 int state_slot = 0;
 int config_slot = 0, config_slot_current = 0;
 char lastRomFile[512];
+int kb_combo_keys = 0, kb_combo_acts = 0;	// keys and actions which need button combos
 
 unsigned char *movie_data = NULL;
 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)
 {
 	static char id_string[3+0x11+0x11+0x30+16];
-	int pos;
+	int pos, swab = 1;
 
-	if (PicoMCD & 1)
-	     strcpy(id_string, "CD|");
+	if (PicoMCD & 1) {
+		strcpy(id_string, "CD|");
+		swab = 0;
+	}
 	else strcpy(id_string, "MD|");
 	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++;
-	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++;
-	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;
 
 	return id_string;
@@ -328,6 +331,7 @@ int emu_ReloadRom(void)
 	cd_state = emu_cdCheck(&cd_region);
 	if (cd_state > 0)
 	{
+		PicoMCD |= 1;
 		// valid CD image, check for BIOS..
 
 		// 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)) {
 			// bios_help() ?
+			PicoMCD &= ~1;
 			return 0;
 		}
 
-		PicoMCD |= 1;
 		get_ext(used_rom_name, ext);
 	}
 	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)
 {
@@ -876,3 +921,4 @@ int emu_SaveLoadGame(int load, int sram)
 		return ret;
 	}
 }
+
diff --git a/common/emu.h b/common/emu.h
index 93a8823..90c9350 100644
--- a/common/emu.h
+++ b/common/emu.h
@@ -34,6 +34,7 @@ extern int state_slot;
 extern int config_slot, config_slot_current;
 extern unsigned char *movie_data;
 extern char lastRomFile[512];
+extern int kb_combo_keys, kb_combo_acts;	// keys and actions which need button combos
 
 
 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_textOut16(int x, int y, const char *text);
 char *emu_makeRomId(void);
+void  emu_findKeyBindCombos(void);
 
 extern const char *keyNames[];
 void  emu_prepareDefaultConfig(void);
diff --git a/gp2x/emu.c b/gp2x/emu.c
index 74bcde8..0375a7f 100644
--- a/gp2x/emu.c
+++ b/gp2x/emu.c
@@ -48,7 +48,6 @@ extern int crashed_940;
 static short __attribute__((aligned(4))) sndBuffer[2*44100/50];
 static struct timeval noticeMsgTime = { 0, 0 };	// when started showing
 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;
 char noticeMsg[64];			// notice msg to draw
 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)
 {
 	PicoOpt &= ~0x4100;
@@ -577,23 +534,26 @@ static void updateKeys(void)
 
 	for (i = 0; i < 32; i++)
 	{
-		if (keys & (1 << i)) {
+		if (keys & (1 << i))
+		{
 			int pl, acts = currentConfig.KeyBinds[i];
 			if (!acts) continue;
 			pl = (acts >> 16) & 1;
-			if (combo_keys & (1 << i)) {
-				int u = i+1, acts_c = acts & combo_acts;
+			if (kb_combo_keys & (1 << i))
+			{
+				int u, acts_c = acts & kb_combo_acts;
 				// let's try to find the other one
-				if (acts_c)
-					for (; u < 32; u++)
-						if ( (currentConfig.KeyBinds[u] & acts_c) && (keys & (1 << u)) ) {
-							allActions[pl] |= acts_c;
+				if (acts_c) {
+					for (u = i + 1; u < 32; u++)
+						if ( (keys & (1 << u)) && (currentConfig.KeyBinds[u] & acts_c) ) {
+							allActions[pl] |= acts_c & currentConfig.KeyBinds[u];
 							keys &= ~((1 << i) | (1 << u));
 							break;
 						}
+				}
 				// add non-combo actions if combo ones were not found
 				if (!acts_c || u == 32)
-					allActions[pl] |= acts & ~combo_acts;
+					allActions[pl] |= acts & ~kb_combo_acts;
 			} else {
 				allActions[pl] |= acts;
 			}
@@ -740,7 +700,7 @@ void emu_Loop(void)
 	scaling_update();
 	Pico.m.dirtyPal = 1;
 	oldmodes = ((Pico.video.reg[12]&1)<<2) ^ 0xc;
-	find_combos();
+	emu_findKeyBindCombos();
 
 	// pal/ntsc might have changed, reset related stuff
 	target_fps = Pico.m.pal ? 50 : 60;
diff --git a/gp2x/menu.c b/gp2x/menu.c
index 06abac6..df5ff8a 100644
--- a/gp2x/menu.c
+++ b/gp2x/menu.c
@@ -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 1: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 1); return;
 				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;
 				default: return;
 			}
diff --git a/psp/emu.c b/psp/emu.c
index 4af44b9..2ea2673 100644
--- a/psp/emu.c
+++ b/psp/emu.c
@@ -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..
 int engineState = PGS_Menu;
 
-static int combo_keys = 0, combo_acts = 0; // keys and actions which need button combos
 static unsigned int noticeMsgTime = 0;
 int reset_timing = 0; // do we need this?
 
@@ -764,20 +763,21 @@ static void updateKeys(void)
 			int pl, acts = currentConfig.KeyBinds[i];
 			if (!acts) continue;
 			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
-				if (acts_c)
-					for (; u < 32; u++)
-						if ( (currentConfig.KeyBinds[u] & acts_c) && (keys & (1 << u)) ) {
-							allActions[pl] |= acts_c;
+				if (acts_c) {
+					for (u = i + 1; u < 32; u++)
+						if ( (keys & (1 << u)) && (currentConfig.KeyBinds[u] & acts_c) ) {
+							allActions[pl] |= acts_c & currentConfig.KeyBinds[u];
 							keys &= ~((1 << i) | (1 << u));
 							break;
 						}
+				}
 				// add non-combo actions if combo ones were not found
 				if (!acts_c || u == 32)
-					allActions[pl] |= acts & ~combo_acts;
+					allActions[pl] |= acts & ~kb_combo_acts;
 			} else {
 				allActions[pl] |= acts;
 			}
@@ -811,44 +811,6 @@ static void updateKeys(void)
 	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)
 {
@@ -886,7 +848,7 @@ void emu_Loop(void)
 	clearArea(1);
 	Pico.m.dirtyPal = 1;
 	oldmodes = ((Pico.video.reg[12]&1)<<2) ^ 0xc;
-	find_combos();
+	emu_findKeyBindCombos();
 
 	// pal/ntsc might have changed, reset related stuff
 	target_fps = Pico.m.pal ? 50 : 60;
diff --git a/psp/menu.c b/psp/menu.c
index b5f3203..19151cc 100644
--- a/psp/menu.c
+++ b/psp/menu.c
@@ -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 1: key_config_loop(me_ctrl_actions, is_6button ? 12 : 8, 1); return;
 				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;
 				default: return;
 			}