mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
bugfixes, refactoring
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@394 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
1ca2ea4f60
commit
bdec53c90b
13 changed files with 139 additions and 178 deletions
|
@ -138,7 +138,6 @@ static int PicoAreaScan(int PmovAction,unsigned int ver, void *PmovFile)
|
||||||
|
|
||||||
// Pack, scan and unpack the cpu data:
|
// Pack, scan and unpack the cpu data:
|
||||||
if((PmovAction&3)==1) PicoAreaPackCpu(cpu, 0);
|
if((PmovAction&3)==1) PicoAreaPackCpu(cpu, 0);
|
||||||
//SekInit(); // notaz: do we really have to do this here?
|
|
||||||
//PicoMemInit();
|
//PicoMemInit();
|
||||||
SCAN_VAR(cpu,"cpu")
|
SCAN_VAR(cpu,"cpu")
|
||||||
if((PmovAction&3)==2) PicoAreaUnpackCpu(cpu, 0);
|
if((PmovAction&3)==2) PicoAreaUnpackCpu(cpu, 0);
|
||||||
|
|
|
@ -7,6 +7,14 @@
|
||||||
|
|
||||||
|
|
||||||
/* 12-in-1 and 4-in-1. Assuming 2MB ROMs here. */
|
/* 12-in-1 and 4-in-1. Assuming 2MB ROMs here. */
|
||||||
|
static unsigned int carthw_12in1_baddr = 0;
|
||||||
|
|
||||||
|
static carthw_state_chunk carthw_12in1_state[] =
|
||||||
|
{
|
||||||
|
{ CHUNK_CARTHW, sizeof(carthw_12in1_baddr), &carthw_12in1_baddr },
|
||||||
|
{ 0, 0, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
static unsigned int carthw_12in1_read16(unsigned int a, int realsize)
|
static unsigned int carthw_12in1_read16(unsigned int a, int realsize)
|
||||||
{
|
{
|
||||||
// ??
|
// ??
|
||||||
|
@ -26,6 +34,7 @@ static void carthw_12in1_write8(unsigned int a, unsigned int d, int realsize)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
carthw_12in1_baddr = a;
|
||||||
a &= 0x3f; a <<= 16;
|
a &= 0x3f; a <<= 16;
|
||||||
len = Pico.romsize - a;
|
len = Pico.romsize - a;
|
||||||
if (len <= 0) {
|
if (len <= 0) {
|
||||||
|
@ -41,6 +50,11 @@ static void carthw_12in1_reset(void)
|
||||||
carthw_12in1_write8(0xA13000, 0, 0);
|
carthw_12in1_write8(0xA13000, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void carthw_12in1_statef(void)
|
||||||
|
{
|
||||||
|
carthw_12in1_write8(carthw_12in1_baddr, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void carthw_12in1_startup(void)
|
void carthw_12in1_startup(void)
|
||||||
{
|
{
|
||||||
void *tmp;
|
void *tmp;
|
||||||
|
@ -59,6 +73,8 @@ void carthw_12in1_startup(void)
|
||||||
PicoRead16Hook = carthw_12in1_read16;
|
PicoRead16Hook = carthw_12in1_read16;
|
||||||
PicoWrite8Hook = carthw_12in1_write8;
|
PicoWrite8Hook = carthw_12in1_write8;
|
||||||
PicoResetHook = carthw_12in1_reset;
|
PicoResetHook = carthw_12in1_reset;
|
||||||
|
PicoLoadStateHook = carthw_12in1_statef;
|
||||||
|
carthw_chunks = carthw_12in1_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -153,6 +153,8 @@ PICO_INTERNAL int PicoCdSaveState(void *file)
|
||||||
if (carthw_chunks != NULL)
|
if (carthw_chunks != NULL)
|
||||||
{
|
{
|
||||||
carthw_state_chunk *chwc;
|
carthw_state_chunk *chwc;
|
||||||
|
if (PicoStateProgressCB)
|
||||||
|
PicoStateProgressCB("Saving.. cart hw state");
|
||||||
for (chwc = carthw_chunks; chwc->ptr != NULL; chwc++)
|
for (chwc = carthw_chunks; chwc->ptr != NULL; chwc++)
|
||||||
CHECKED_WRITE(chwc->chunk, chwc->size, chwc->ptr);
|
CHECKED_WRITE(chwc->chunk, chwc->size, chwc->ptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -31,7 +31,6 @@ int engineState;
|
||||||
unsigned char *PicoDraw2FB = gfx_buffer; // temporary buffer for alt renderer ( (8+320)*(8+240+8) )
|
unsigned char *PicoDraw2FB = gfx_buffer; // temporary buffer for alt renderer ( (8+320)*(8+240+8) )
|
||||||
int reset_timing = 0;
|
int reset_timing = 0;
|
||||||
|
|
||||||
static int combo_keys = 0, combo_acts = 0; // keys and actions which need button combos
|
|
||||||
static DWORD noticeMsgTime = 0;
|
static DWORD noticeMsgTime = 0;
|
||||||
static short *snd_cbuff = NULL;
|
static short *snd_cbuff = NULL;
|
||||||
static int snd_cbuf_samples = 0, snd_all_samples = 0;
|
static int snd_cbuf_samples = 0, snd_all_samples = 0;
|
||||||
|
@ -457,20 +456,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;
|
||||||
}
|
}
|
||||||
|
@ -504,45 +504,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 < 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void simpleWait(DWORD until)
|
static void simpleWait(DWORD until)
|
||||||
{
|
{
|
||||||
|
@ -577,7 +538,7 @@ void emu_Loop(void)
|
||||||
else PicoOpt&=~0x4000;
|
else PicoOpt&=~0x4000;
|
||||||
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;
|
||||||
|
|
|
@ -807,7 +807,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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue