X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=drivers%2Fgp2x%2Finput.c;h=1506f4e4706f27398e4b4ad88f3a9b8d7c8eee66;hp=8345339185f41d3a5634acba6c47cab0c524ba9f;hb=971a1d07d2f5b5a6f991ed5712275c04b933734f;hpb=d447f17f693875013eed05ff3a2fce79cbe0b5f2 diff --git a/drivers/gp2x/input.c b/drivers/gp2x/input.c index 8345339..1506f4e 100644 --- a/drivers/gp2x/input.c +++ b/drivers/gp2x/input.c @@ -1,7 +1,4 @@ /* FCE Ultra - NES/Famicom Emulator - * - * Copyright notice for this file: - * Copyright (C) 2002 Ben Parnell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,81 +15,100 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#define JOY_A 1 -#define JOY_B 2 -#define JOY_SELECT 4 -#define JOY_START 8 -#define JOY_UP 0x10 -#define JOY_DOWN 0x20 -#define JOY_LEFT 0x40 -#define JOY_RIGHT 0x80 - -#include "minimal.h" - -extern uint8 Exit; // exit emu loop - +#include "../../state.h" +#include "../../general.h" /* UsrInputType[] is user-specified. InputType[] is current - (game loading can override user settings) + (game loading can override user settings) */ static int UsrInputType[2]={SI_GAMEPAD,SI_GAMEPAD}; -static int InputType[2]; - static int UsrInputTypeFC={SI_NONE}; + +static int InputType[2]; static int InputTypeFC; static uint32 JSreturn; -int NoWaiting=0; static int powerpadsc[2][12]; static int powerpadside=0; - static uint32 MouseData[3]; static uint8 fkbkeys[0x48]; -unsigned long lastpad=0; -char soundvolmeter[21]; -int soundvolIndex=0; +static uint32 combo_acts = 0, combo_keys = 0; +static uint32 prev_emu_acts = 0; static void setsoundvol(int soundvolume) { - //FCEUI_SetSoundVolume(soundvol); - // draw on screen :D - gp2x_sound_volume(soundvolume, soundvolume); - int meterval=soundvolume/5; - for (soundvolIndex=0; soundvolIndex < 20; soundvolIndex++) - { - if (soundvolIndex < meterval) - { - soundvolmeter[soundvolIndex]='*'; - } - else - { - soundvolmeter[soundvolIndex]='_'; - } - } - soundvolmeter[20]=0; - FCEU_DispMessage("|%s|", soundvolmeter); + int soundvolIndex; + static char soundvolmeter[24]; + + // draw on screen :D + gp2x_sound_volume(soundvolume, soundvolume); + int meterval=soundvolume/5; + for (soundvolIndex = 0; soundvolIndex < 20; soundvolIndex++) + { + if (soundvolIndex < meterval) + { + soundvolmeter[soundvolIndex]='*'; + } + else + { + soundvolmeter[soundvolIndex]='_'; + } + } + soundvolmeter[20]=0; + FCEU_DispMessage("|%s|", soundvolmeter); } +static void do_emu_acts(uint32 acts) +{ + uint32 actsc = acts; + acts &= acts ^ prev_emu_acts; + prev_emu_acts = actsc; + + if (acts & (3 << 30)) + { + if (acts & (1 << 30)) + { + FCEUI_LoadState(); + } + else + { + FCEUI_SaveState(); + } + } + else if (acts & (1 << 29)) + { + FILE *st; + char *fname; + + CurrentState++; + if (CurrentState > 9) CurrentState = 0; + + fname = FCEU_MakeFName(FCEUMKF_STATE,CurrentState,0); + st=fopen(fname,"rb"); + free(fname); + FCEU_DispMessage("[%s] State Slot %i", st ? "USED" : "FREE", CurrentState); + if (st) fclose(st); + } +} + void FCEUD_UpdateInput(void) { static int volpushed_frames = 0; static int turbo_rate_cnt_a = 0, turbo_rate_cnt_b = 0; - long lastpad2 = lastpad; unsigned long keys = gp2x_joystick_read(0); - uint32 JS = 0; // RLDU SEBA + uint32 all_acts = 0; int i; #define down(b) (keys & GP2X_##b) if ((down(VOL_DOWN) && down(VOL_UP)) || (keys & (GP2X_L|GP2X_L|GP2X_START)) == (GP2X_L|GP2X_L|GP2X_START)) { Exit = 1; - JSreturn = 0; return; } else if (down(VOL_UP)) @@ -120,36 +136,53 @@ void FCEUD_UpdateInput(void) } + JSreturn = 0; // RLDU SEBA + for (i = 0; i < 32; i++) { - if (keys & (1 << i)) { - int acts = Settings.KeyBinds[i]; + if (keys & (1 << i)) + { + uint32 acts, u = 32; + acts = Settings.KeyBinds[i]; if (!acts) continue; - JS |= acts & 0xff; - if (acts & 0x100) { // A turbo - turbo_rate_cnt_a += Settings.turbo_rate_add; - JS |= (turbo_rate_cnt_a >> 24) & 1; - } - if (acts & 0x200) { // B turbo - turbo_rate_cnt_b += Settings.turbo_rate_add; - JS |= (turbo_rate_cnt_b >> 23) & 2; + if ((1 << i) & combo_keys) + { + // combo key detected, try to find if other is pressed + for (u = i+1; u < 32; u++) + { + if ((keys & (1 << u)) && (Settings.KeyBinds[u] & acts)) + { + keys &= ~(1 << u); + break; + } + } } + if (u != 32) acts &= combo_acts; // other combo key pressed + else acts &= ~combo_acts; + all_acts |= acts; } } + JSreturn |= all_acts & 0xff; + if (all_acts & 0x100) { // A turbo + turbo_rate_cnt_a += Settings.turbo_rate_add; + JSreturn |= (turbo_rate_cnt_a >> 24) & 1; + } + if (all_acts & 0x200) { // B turbo + turbo_rate_cnt_b += Settings.turbo_rate_add; + JSreturn |= (turbo_rate_cnt_b >> 23) & 2; + } - JSreturn = JS; - lastpad=keys; + do_emu_acts(all_acts); - //JSreturn=(JS&0xFF000000)|(JS&0xFF)|((JS&0xFF0000)>>8)|((JS&0xFF00)<<8); -#define pad keys + //JSreturn=(JS&0xFF000000)|(JS&0xFF)|((JS&0xFF0000)>>8)|((JS&0xFF00)<<8); // JSreturn=(JSreturn&0xFF000000)|(JSreturn&0xFF)|((JSreturn&0xFF0000)>>8)|((JSreturn&0xFF00)<<8); // TODO: make these bindable, use new interface + /* if(gametype==GIT_FDS) { - NoWaiting&=~1; if ((pad & GP2X_PUSH) && (!(pad & GP2X_SELECT)) && (!(pad & GP2X_L)) && (!(pad & GP2X_R)) && (!(lastpad2 & GP2X_PUSH))) { DriverInterface(DES_FDSSELECT,0); @@ -164,6 +197,7 @@ void FCEUD_UpdateInput(void) } } return; + */ } @@ -205,9 +239,41 @@ static void InitOtherInput(void) FCEUI_SetInputFC(InputTypeFC,InputDPtr,attrib); FCEUI_DisableFourScore(eoptions&EO_NOFOURSCORE); - if(t && !(inited&16)) - { - InitMouse(); - inited|=16; - } + inited|=16; +} + + +static void PrepareOtherInput(void) +{ + uint32 act, key, seen_acts; + + combo_acts = combo_keys = prev_emu_acts = seen_acts = 0; + + // find combo_acts + for (act = 1; act; act <<= 1) + { + for (key = 1; key < 32; key++) + { + if (Settings.KeyBinds[key] & act) + { + if (seen_acts & act) combo_acts |= act; + else seen_acts |= act; + } + } + } + + // find combo_keys + for (act = 1; act; act <<= 1) + { + for (key = 0; key < 32; key++) + { + if (Settings.KeyBinds[key] & combo_acts) + { + combo_keys |= 1 << key; + } + } + } + + printf("generated combo_acts: %08x, combo_keys: %08x\n", combo_acts, combo_keys); } +