From b883bc4ecce4dcc98d95502b5bee403119c3ae6f Mon Sep 17 00:00:00 2001 From: jimmystones Date: Wed, 20 Oct 2021 13:13:47 +0100 Subject: [PATCH] Improve keyboard handling, allow keyboard control in menu --- src/inputtester.c | 41 +++++++++-------------------------------- src/menu.c | 3 +++ src/os.c | 1 + src/ps2.c | 26 ++++++++++++++++---------- src/snek.c | 8 ++++---- src/sys_custom.c | 20 ++++++++++---------- 6 files changed, 43 insertions(+), 56 deletions(-) diff --git a/src/inputtester.c b/src/inputtester.c index bcc9657..25ba1e2 100644 --- a/src/inputtester.c +++ b/src/inputtester.c @@ -35,8 +35,8 @@ unsigned char px_last[6]; signed char sx_toggle_last[6]; signed char sx_last[6]; unsigned long sx_pos[6]; -unsigned char kbd_lastscan_cache = 1; -unsigned char kbd_lastascii_cache = 1; +unsigned char kbd_scan_last = 1; +unsigned char kbd_ascii_last = 1; unsigned char mse_button1_last = 1; unsigned char mse_button2_last = 1; signed char mse_x_last = 1; @@ -352,7 +352,7 @@ void inputtester_digital() { // // Handle PS/2 inputs whenever possible to improve latency - // handle_ps2(); + handle_ps2(); // Handle secret code detection (joypad 1 directions) if (HBLANK_RISING) @@ -388,7 +388,7 @@ void inputtester_analog() { // Handle PS/2 inputs whenever possible to improve latency - // handle_ps2(); + handle_ps2(); if (HBLANK_RISING) { @@ -584,13 +584,13 @@ void inputtester_advanced() } // Scancode output - if (kbd_lastscan != kbd_lastscan_cache || kbd_lastascii != kbd_lastascii_cache) + if (kbd_scan != kbd_scan_last || kbd_ascii != kbd_ascii_last) { - write_stringf("%02x", 0xFF, 11, 21, kbd_lastscan); - write_char(kbd_lastascii, 0xFF, 15, 21); + write_stringf("%02x", 0xFF, 11, 21, kbd_scan); + write_char(kbd_ascii, 0xFF, 15, 21); - kbd_lastscan_cache = kbd_lastscan; - kbd_lastascii_cache = kbd_lastascii; + kbd_scan_last = kbd_scan; + kbd_ascii_last = kbd_ascii; } if (mse_changed) @@ -629,29 +629,6 @@ void inputtester_advanced() } mse_changed = 0; } - - // { - // char m = 0b00000001; - // char x = 2; - // char y = 27; - // for (char b = 0; b < 8; b++) - // { - // char joy = ps2_mouse[b]; - // m = 0b00000001; - // for (char i = 0; i < 8; i++) - // { - // x++; - // write_char((joy & m) ? asc_1 : asc_0, 0xFF, x, y); - // m <<= 1; - // } - // x++; - // if (b == 3) - // { - // x = 2; - // y++; - // } - // } - // } } } diff --git a/src/menu.c b/src/menu.c index f1e0eb7..efb5510 100644 --- a/src/menu.c +++ b/src/menu.c @@ -66,6 +66,9 @@ void start_menu() // Menu state void menu() { + // // Handle PS/2 inputs whenever possible to improve latency + handle_ps2(); + // Check inputs at end of each scanline. Is this too much?! if (HBLANK_RISING) { diff --git a/src/os.c b/src/os.c index 7f91241..012fcb0 100644 --- a/src/os.c +++ b/src/os.c @@ -109,6 +109,7 @@ void main() //start_btntest(); break; } + hsync_last = hsync; vsync_last = vsync; hblank_last = hblank; diff --git a/src/ps2.c b/src/ps2.c index f71fe84..cb74766 100644 --- a/src/ps2.c +++ b/src/ps2.c @@ -19,6 +19,7 @@ with this program. If not, see . ===========================================================================*/ +#pragma once #include "sys.c" // COMMAND KEYS @@ -32,6 +33,10 @@ const char KEY_RIGHTSHIFT = 0x59; const char KEY_ALT = 0x11; // EXT 0 = LEFT, EXT 1 = RIGHT const char KEY_CTRL = 0x63; // EXT 0 = LEFT, EXT 1 = RIGHT +// USEFUL KEYS +const char KEY_1 = 0x16; +const char KEY_SPACE = 0x29; + // UNMAPPED COMMAND KEYS // 0x7c, //55 KEY_KPASTERISK // 0x05, //59 KEY_F1 @@ -191,8 +196,7 @@ char kbd_shift_right = 0; char kbd_scan = 0; char kbd_pressed; char kbd_extend; -char kbd_lastscan = 0; -char kbd_lastascii = 0; +char kbd_ascii = 0; char kbd_clock_index = 1; char mse_lastclock = 0; @@ -206,18 +210,19 @@ char mse_clock_index = 3; char kbd_buffer[128]; char kbd_buffer_len = 0; +bool kbd_down[256]; void get_ascii() { - char p = (kbd_lastscan * 2); + char p = (kbd_scan * 2); if (!(kbd_shift_left || kbd_shift_right)) { p++; } - kbd_lastascii = kbd_UK[p]; - if (kbd_lastascii > 0) + kbd_ascii = kbd_UK[p]; + if (kbd_ascii > 0) { - kbd_buffer[kbd_buffer_len] = kbd_lastascii; + kbd_buffer[kbd_buffer_len] = kbd_ascii; kbd_buffer_len++; } } @@ -231,13 +236,13 @@ void handle_ps2() { kbd_in[k] = ps2_key[k]; } - kbd_extend = CHECK_BIT(kbd_in[1], 0); - kbd_pressed = CHECK_BIT(kbd_in[1], 1); + kbd_extend = CHECK_BIT(kbd_in[1], 0) > 0; + kbd_pressed = CHECK_BIT(kbd_in[1], 1) > 0; kbd_scan = kbd_in[0]; - kbd_lastscan = kbd_scan; - kbd_lastascii = 0; + kbd_ascii = 0; if (kbd_pressed) { + kbd_down[kbd_scan] = 1; if (kbd_scan == KEY_LEFTSHIFT) { kbd_shift_left = 1; @@ -253,6 +258,7 @@ void handle_ps2() } else { + kbd_down[kbd_scan] = 0; if (kbd_scan == KEY_LEFTSHIFT) { kbd_shift_left = 0; diff --git a/src/snek.c b/src/snek.c index e745ffc..f4ad5bc 100644 --- a/src/snek.c +++ b/src/snek.c @@ -103,7 +103,7 @@ void snek_gameplay() nyd = 0; } - if (CHECK_BIT(joystick[8], 2)) // select to quit + if (CHECK_BIT(joystick[1], 2)) // select to quit { state = 0; return; @@ -156,12 +156,12 @@ void snek_attract() if (HBLANK_RISING) { - if (CHECK_BIT(joystick[8], 3)) // start to start + if (CHECK_BIT(joystick[1], 3)) // start to start { start_gameplay(); return; } - if (CHECK_BIT(joystick[8], 2)) // select to quit + if (CHECK_BIT(joystick[1], 2)) // select to quit { state = 0; return; @@ -174,7 +174,7 @@ void snek_attract() if (movetimer == 0) { attractstate = !attractstate; - write_string("PRESS START", attractstate == 0 ? 0x00 : 0xFF, 16, 15); + write_string("PRESS START", attractstate == 0 ? 0x00 : 0xFF, 14, 15); movetimer = movefreq; } } diff --git a/src/sys_custom.c b/src/sys_custom.c index 85bf1f0..b24dc79 100644 --- a/src/sys_custom.c +++ b/src/sys_custom.c @@ -21,6 +21,7 @@ #pragma once #include "sys.c" +#include "ps2.c" // Application states #define STATE_START_INPUTTESTER 1 @@ -48,7 +49,7 @@ #define STATE_START_GAME_SNEK 40 #define STATE_GAME_SNEK 41 -#define GET_TIMER ((unsigned short)timer[8] << 8) | (unsigned char)timer[0] +#define GET_TIMER ((unsigned short)timer[1] << 8) | (unsigned char)timer[0] // DPAD tracker bool input_left = 0; @@ -79,13 +80,12 @@ void basic_input() input_select_last = input_select; input_a_last = input_a; input_b_last = input_b; - input_up = CHECK_BIT(joystick[0], 3); - input_down = CHECK_BIT(joystick[0], 2); - input_left = CHECK_BIT(joystick[0], 1); - input_right = CHECK_BIT(joystick[0], 0); - input_start = CHECK_BIT(joystick[1], 3); - input_select = CHECK_BIT(joystick[1], 2); - input_a = CHECK_BIT(joystick[0], 4); - input_b = CHECK_BIT(joystick[0], 5); + input_up = CHECK_BIT(joystick[0], 3) || kbd_down[KEY_UP]; + input_down = CHECK_BIT(joystick[0], 2) || kbd_down[KEY_DOWN]; + input_left = CHECK_BIT(joystick[0], 1) || kbd_down[KEY_LEFT]; + input_right = CHECK_BIT(joystick[0], 0) || kbd_down[KEY_RIGHT]; + input_start = CHECK_BIT(joystick[1], 3) || kbd_down[KEY_1]; + input_select = CHECK_BIT(joystick[1], 2) || kbd_down[KEY_ESC]; + input_a = CHECK_BIT(joystick[0], 4) || kbd_down[KEY_ENTER]; + input_b = CHECK_BIT(joystick[0], 5) || kbd_down[KEY_SPACE]; } -