diff --git a/CHANGES.WII b/CHANGES.WII index 6f7730a..10fea3a 100644 --- a/CHANGES.WII +++ b/CHANGES.WII @@ -1,4 +1,8 @@ version 2: + * Improve keyboard bindings to handle press and release correctly and also + both controllers at the same time (key is released when the last controller releases + it) + * Handle keycode 0 and therefore make del work * Remove the 1-1 graphics option and make stretched the default. Should avoid "helpful and constructive" messages such as http://wiinewz.com/forums/nintendo-news/91829-frodo-v1-0-a.html#post580580 diff --git a/Src/C64_SDL.i b/Src/C64_SDL.i index c47f3bf..1568cfc 100644 --- a/Src/C64_SDL.i +++ b/Src/C64_SDL.i @@ -226,13 +226,13 @@ void C64::bind_key(Prefs *np) { menu_t bind_key_menu; menu_t key_menu; - static const char *keys[] = { "space", "Run/Stop", "return", "F1", "F3", "F5", "F7", + static const char *keys[] = { "None", "space", "Run/Stop", "return", "F1", "F3", "F5", "F7", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "ctrl", "del", "home,", "shl", "shr", "clr", "C=", "<-", NULL }; - int kcs[] = { MATRIX(7, 4), MATRIX(7, 7), MATRIX(0, 1), /* space, R/S, return */ + int kcs[] = { 0, MATRIX(7, 4), MATRIX(7, 7), MATRIX(0, 1), /* space, R/S, return */ MATRIX(0, 4), MATRIX(0, 5), MATRIX(0, 6), MATRIX(0, 3), MATRIX(4, 3), MATRIX(7, 0), MATRIX(7, 3), MATRIX(1, 0), MATRIX(1, 3), MATRIX(2, 0), MATRIX(2, 3), MATRIX(3, 0), MATRIX(3, 3), MATRIX(4, 0), MATRIX(1, 2), MATRIX(3, 4), MATRIX(2, 4), MATRIX(2, 2), @@ -253,7 +253,10 @@ void C64::bind_key(Prefs *np) 32, 32, MENU_SIZE_X, MENU_SIZE_Y); int key = menu_select(real_screen, &key_menu, NULL); - np->JoystickKeyBinding[opt] = kcs[key]; + if (key > 0) + np->JoystickKeyBinding[opt] = kcs[key]; + else if (key == 0) + np->JoystickKeyBinding[opt] = -1; menu_fini(&key_menu); } menu_fini(&bind_key_menu); @@ -353,7 +356,7 @@ void C64::Run(void) } /* From dreamcast port */ -static char *auto_seq[4] = +static const char *auto_seq[4] = { "\nLOAD \"*\",8,1\nRUN\n", "\nLOAD \"*\",9,1\nRUN\n", @@ -368,6 +371,10 @@ extern "C" int get_kc_from_char(char c_in, int *shifted); void C64::VBlank(bool draw_frame) { +#if defined(GEKKO) + WPAD_ScanPads(); +#endif + // Poll joysticks TheCIA1->Joystick1 = poll_joystick(0); TheCIA1->Joystick2 = poll_joystick(1); @@ -537,16 +544,17 @@ void C64::open_close_joysticks(bool oldjoy1, bool oldjoy2, bool newjoy1, bool ne uint8 C64::poll_joystick(int port) { #ifdef GEKKO + int extra_keys[N_WIIMOTE_BINDINGS]; int controller = port; - Uint32 held; + Uint32 held, held_other; uint8 j = 0xff; if (ThePrefs.JoystickSwap) controller = !port; - WPAD_ScanPads(); - held = WPAD_ButtonsHeld(controller); + held_other = WPAD_ButtonsHeld(!controller); + if (held & WPAD_BUTTON_UP) j &= 0xfb; // Left if (held & WPAD_BUTTON_DOWN) @@ -559,23 +567,26 @@ uint8 C64::poll_joystick(int port) j &= 0xef; // Button if (held & WPAD_BUTTON_HOME) this->enter_menu(); - else + + extra_keys[WIIMOTE_A] = (held | held_other) & WPAD_BUTTON_A; + extra_keys[WIIMOTE_B] = (held | held_other) & WPAD_BUTTON_B; + extra_keys[WIIMOTE_PLUS] = (held | held_other) & WPAD_BUTTON_PLUS; + extra_keys[WIIMOTE_MINUS] = (held | held_other) & WPAD_BUTTON_MINUS; + extra_keys[WIIMOTE_1] = (held | held_other) & WPAD_BUTTON_1; + + for (int i = 0; i < N_WIIMOTE_BINDINGS; i++) { - if ( (held & WPAD_BUTTON_A) && ThePrefs.JoystickKeyBinding[0]) - TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[0], - false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix); - if ( (held & WPAD_BUTTON_B) && ThePrefs.JoystickKeyBinding[1]) - TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[1], - false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix); - if ( (held & WPAD_BUTTON_PLUS) && ThePrefs.JoystickKeyBinding[2]) - TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[2], - false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix); - if ( (held & WPAD_BUTTON_MINUS) && ThePrefs.JoystickKeyBinding[3]) - TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[3], - false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix); - if ( (held & WPAD_BUTTON_1) && ThePrefs.JoystickKeyBinding[4]) - TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[4], - false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix); + int kc = ThePrefs.JoystickKeyBinding[i]; + + if ( kc < 0 ) + continue; + + if (extra_keys[i]) + TheDisplay->UpdateKeyMatrix(kc, false, + TheCIA1->KeyMatrix, TheCIA1->RevMatrix); + else + TheDisplay->UpdateKeyMatrix(kc, true, + TheCIA1->KeyMatrix, TheCIA1->RevMatrix); } return j; diff --git a/Src/Display.h b/Src/Display.h index ee41655..5bab6bb 100644 --- a/Src/Display.h +++ b/Src/Display.h @@ -16,7 +16,7 @@ #endif #ifdef HAVE_SDL -struct SDL_Surface; +#include extern SDL_Surface *real_screen; #endif @@ -65,11 +65,10 @@ public: void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick); #endif #if defined(HAVE_SDL) - void FakeKeyPressRepeat(int kc, bool shift, uint8 *CIA_key_matrix, - uint8 *CIA_rev_matrix); - void FakeKeyPress(int kc, bool shift, uint8 *CIA_key_matrix, uint8 *CIA_rev_matrix); + void TranslateKey(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick); + void UpdateKeyMatrix(int c64_key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix); #endif bool NumLock(void); void InitColors(uint8 *colors); diff --git a/Src/Display_SDL.i b/Src/Display_SDL.i index 09697f7..a4fa1fd 100644 --- a/Src/Display_SDL.i +++ b/Src/Display_SDL.i @@ -245,22 +245,6 @@ int C64Display::BitmapXMod(void) return screen->pitch; } -void C64Display::FakeKeyPressRepeat(int kc, bool shift, uint8 *CIA_key_matrix, uint8 *CIA_rev_matrix) -{ - static int cnt = 5; - - if (cnt > 0) { - this->FakeKeyPress(-1, shift, CIA_key_matrix, CIA_rev_matrix); - cnt--; - } - else - { - this->FakeKeyPress(kc, shift, CIA_key_matrix, CIA_rev_matrix); - cnt = 5; - } -} - - void C64Display::FakeKeyPress(int kc, bool shift, uint8 *CIA_key_matrix, uint8 *CIA_rev_matrix) { @@ -294,11 +278,34 @@ void C64Display::FakeKeyPress(int kc, bool shift, uint8 *CIA_key_matrix, } } +void C64Display::UpdateKeyMatrix(int c64_key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix) +{ + bool shifted = c64_key & 0x80; + int c64_byte = (c64_key >> 3) & 7; + int c64_bit = c64_key & 7; + + if (key_up) { + if (shifted) { + key_matrix[6] |= 0x10; + rev_matrix[4] |= 0x40; + } + key_matrix[c64_byte] |= (1 << c64_bit); + rev_matrix[c64_bit] |= (1 << c64_byte); + } else { + if (shifted) { + key_matrix[6] &= 0xef; + rev_matrix[4] &= 0xbf; + } + key_matrix[c64_byte] &= ~(1 << c64_bit); + rev_matrix[c64_bit] &= ~(1 << c64_byte); + } +} + /* * Poll the keyboard */ -static void translate_key(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick) +void C64Display::TranslateKey(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick) { int c64_key = -1; switch (key) { @@ -412,25 +419,7 @@ static void translate_key(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev return; } - // Handle other keys - bool shifted = c64_key & 0x80; - int c64_byte = (c64_key >> 3) & 7; - int c64_bit = c64_key & 7; - if (key_up) { - if (shifted) { - key_matrix[6] |= 0x10; - rev_matrix[4] |= 0x40; - } - key_matrix[c64_byte] |= (1 << c64_bit); - rev_matrix[c64_bit] |= (1 << c64_byte); - } else { - if (shifted) { - key_matrix[6] &= 0xef; - rev_matrix[4] &= 0xbf; - } - key_matrix[c64_byte] &= ~(1 << c64_bit); - rev_matrix[c64_bit] &= ~(1 << c64_byte); - } + this->UpdateKeyMatrix(c64_key, key_up, key_matrix, rev_matrix); } void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick) @@ -481,7 +470,7 @@ void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joyst break; default: - translate_key(event.key.keysym.sym, false, key_matrix, rev_matrix, joystick); + TranslateKey(event.key.keysym.sym, false, key_matrix, rev_matrix, joystick); break; } break; @@ -491,7 +480,7 @@ void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joyst if (event.key.keysym.sym == SDLK_NUMLOCK) num_locked = false; else - translate_key(event.key.keysym.sym, true, key_matrix, rev_matrix, joystick); + TranslateKey(event.key.keysym.sym, true, key_matrix, rev_matrix, joystick); break; // Quit Frodo diff --git a/Src/Prefs.h b/Src/Prefs.h index 9e3f497..3beeb71 100644 --- a/Src/Prefs.h +++ b/Src/Prefs.h @@ -39,6 +39,17 @@ enum { DISPTYPE_SCREEN // BWindowScreen }; +// Key bindings (WII) +enum { + WIIMOTE_A, + WIIMOTE_B, + WIIMOTE_PLUS, + WIIMOTE_MINUS, + WIIMOTE_1, + N_WIIMOTE_BINDINGS +}; + + // Preferences data class Prefs { @@ -116,7 +127,7 @@ private: #endif #ifdef HAVE_SDL - int JoystickKeyBinding[5]; + int JoystickKeyBinding[N_WIIMOTE_BINDINGS]; int DisplayOption; #endif };