Improve keyboard handling, allow keyboard control in menu

This commit is contained in:
jimmystones
2021-10-20 13:13:47 +01:00
parent 73b464dbfb
commit b883bc4ecc
6 changed files with 43 additions and 56 deletions

View File

@@ -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++;
// }
// }
// }
}
}

View File

@@ -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)
{

View File

@@ -109,6 +109,7 @@ void main()
//start_btntest();
break;
}
hsync_last = hsync;
vsync_last = vsync;
hblank_last = hblank;

View File

@@ -19,6 +19,7 @@
with this program. If not, see <http://www.gnu.org/licenses/>.
===========================================================================*/
#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;

View File

@@ -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;
}
}

View File

@@ -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];
}