Fix shift bug in ps2 sim

This commit is contained in:
jimmystones
2021-07-03 15:04:48 +01:00
parent d9aad0bbfd
commit 2ab89eb71d

230
src/ps2.c
View File

@@ -79,114 +79,116 @@ const char KEY_DOWN = 0x72;
char kbd_UK[256] =
{
0, 0, // 0x00
0, 0, // 0x01
0, 0, // 0x02
0, 0, // 0x03
0, 0, // 0x04
0, 0, // 0x05
0, 0, // 0x06
0, 0, // 0x07
0, 0, // 0x08
0, 0, // 0x09
0, 0, // 0x0a
0, 0, // 0x0b
0, 0, // 0x0c
0, 0, // 0x0d
'¬', '`', // 0x0e
0, 0, // 0x0f
0, 0, // 0x10
0, 0, // 0x11
0, 0, // 0x12
0, 0, // 0x13
0, 0, // 0x14
'Q', 'q', // 0x15
'!', '1', // 0x16
0, 0, // 0x17
0, 0, // 0x18
0, 0, // 0x19
'Z', 'z', // 0x1a
'S', 's', // 0x1b
'A', 'a', // 0x1c
'W', 'w', // 0x1d
'"', '2', // 0x1e
0, 0, // 0x1f
0, 0, // 0x20
'C', 'c', // 0x21
'X', 'x', // 0x22
'D', 'd', // 0x23
'E', 'e', // 0x24
'$', '4', // 0x25
'£', '3', // 0x26
0, 0, // 0x27
0, 0, // 0x28
' ', ' ', // 0x29
'V', 'v', // 0x2a
'F', 'f', // 0x2b
'T', 't', // 0x2c
'R', 'r', // 0x2d
'%', '5', // 0x2e
0, 0, // 0x2f
0, 0, // 0x30
'N', 'n', // 0x31
'B', 'b', // 0x32
'H', 'h', // 0x33
'G', 'g', // 0x34
'Y', 'y', // 0x35
'^', '6', // 0x36
0, 0, // 0x37
0, 0, // 0x38
0, 0, // 0x39
'M', 'm', // 0x3a
'J', 'j', // 0x3b
'U', 'u', // 0x3c
'&', '7', // 0x3d
'*', '8', // 0x3e
0, 0, // 0x3f
0, 0, // 0x40
'<', ',', // 0x41
'K', 'k', // 0x42
'I', 'i', // 0x43
'O', 'o', // 0x44
')', '0', // 0x45
'(', '9', // 0x46
0, 0, // 0x47
0, 0, // 0x48
'>', '.', // 0x49
'?', '/', // 0x4a
'L', 'l', // 0x4b
':', ';', // 0x4c
'P', 'p', // 0x4d
'_', '-', // 0x4e
0, 0, // 0x4f
0, 0, // 0x50
0, 0, // 0x51
'@', '\'', // 0x52
0, 0, // 0x53
'{', '[', // 0x54
'+', '=', // 0x55
0, 0, // 0x56
0, 0, // 0x57
'+', '=', // 0x58
0, 0, // 0x59 (RSHIFT)
'\n', '\n',// 0x5a (ENTER)
'}', ']', // 0x5b
0, 0, // 0x5c
'|', '\\', // 0x5d
0, 0, // 0x5e
0, 0, // 0x5f
0, 0, // 0x60
0, 0, // 0x61
0, 0, // 0x62
0, 0, // 0x63
0, 0, // 0x64
0, 0, // 0x65
'\b', '\b',// 0x66
0, 0, // 0x00
0, 0, // 0x01
0, 0, // 0x02
0, 0, // 0x03
0, 0, // 0x04
0, 0, // 0x05
0, 0, // 0x06
0, 0, // 0x07
0, 0, // 0x08
0, 0, // 0x09
0, 0, // 0x0a
0, 0, // 0x0b
0, 0, // 0x0c
0, 0, // 0x0d
'¬', '`', // 0x0e
0, 0, // 0x0f
0, 0, // 0x10
0, 0, // 0x11
0, 0, // 0x12
0, 0, // 0x13
0, 0, // 0x14
'Q', 'q', // 0x15
'!', '1', // 0x16
0, 0, // 0x17
0, 0, // 0x18
0, 0, // 0x19
'Z', 'z', // 0x1a
'S', 's', // 0x1b
'A', 'a', // 0x1c
'W', 'w', // 0x1d
'"', '2', // 0x1e
0, 0, // 0x1f
0, 0, // 0x20
'C', 'c', // 0x21
'X', 'x', // 0x22
'D', 'd', // 0x23
'E', 'e', // 0x24
'$', '4', // 0x25
'£', '3', // 0x26
0, 0, // 0x27
0, 0, // 0x28
' ', ' ', // 0x29
'V', 'v', // 0x2a
'F', 'f', // 0x2b
'T', 't', // 0x2c
'R', 'r', // 0x2d
'%', '5', // 0x2e
0, 0, // 0x2f
0, 0, // 0x30
'N', 'n', // 0x31
'B', 'b', // 0x32
'H', 'h', // 0x33
'G', 'g', // 0x34
'Y', 'y', // 0x35
'^', '6', // 0x36
0, 0, // 0x37
0, 0, // 0x38
0, 0, // 0x39
'M', 'm', // 0x3a
'J', 'j', // 0x3b
'U', 'u', // 0x3c
'&', '7', // 0x3d
'*', '8', // 0x3e
0, 0, // 0x3f
0, 0, // 0x40
'<', ',', // 0x41
'K', 'k', // 0x42
'I', 'i', // 0x43
'O', 'o', // 0x44
')', '0', // 0x45
'(', '9', // 0x46
0, 0, // 0x47
0, 0, // 0x48
'>', '.', // 0x49
'?', '/', // 0x4a
'L', 'l', // 0x4b
':', ';', // 0x4c
'P', 'p', // 0x4d
'_', '-', // 0x4e
0, 0, // 0x4f
0, 0, // 0x50
0, 0, // 0x51
'@', '\'', // 0x52
0, 0, // 0x53
'{', '[', // 0x54
'+', '=', // 0x55
0, 0, // 0x56
0, 0, // 0x57
'+', '=', // 0x58
0, 0, // 0x59 (RSHIFT)
'\n', '\n', // 0x5a (ENTER)
'}', ']', // 0x5b
0, 0, // 0x5c
'|', '\\', // 0x5d
0, 0, // 0x5e
0, 0, // 0x5f
0, 0, // 0x60
0, 0, // 0x61
0, 0, // 0x62
0, 0, // 0x63
0, 0, // 0x64
0, 0, // 0x65
'\b', '\b', // 0x66
0, 0};
char kbd_in[2];
char kbd_lastclock = 0;
char kbd_shift = 0;
char kbd_shift_left = 0;
char kbd_shift_right = 0;
char kbd_scan = 0;
char kbd_pressed;
char kbd_extend;
char kbd_lastscan = 0;
@@ -205,7 +207,7 @@ void get_ascii(char scan)
{
kbd_lastscan = scan;
char p = (kbd_lastscan * 2);
if (!kbd_shift)
if (!(kbd_shift_left || kbd_shift_right))
{
p++;
}
@@ -230,19 +232,27 @@ void handle_ps2()
}
kbd_extend = CHECK_BIT(kbd_in[1], 0);
kbd_pressed = CHECK_BIT(kbd_in[1], 1);
char kbd_scan = kbd_in[0];
kbd_scan = kbd_in[0];
if (kbd_pressed)
{
if (kbd_scan == KEY_LEFTSHIFT || kbd_scan == KEY_RIGHTSHIFT)
if (kbd_scan == KEY_LEFTSHIFT)
{
kbd_shift++;
kbd_shift_left = 1;
}
else if (kbd_scan == KEY_RIGHTSHIFT)
{
kbd_shift_right = 1;
}
}
else
{
if (kbd_scan == KEY_LEFTSHIFT || kbd_scan == KEY_RIGHTSHIFT)
if (kbd_scan == KEY_LEFTSHIFT)
{
kbd_shift--;
kbd_shift_left = 0;
}
else if (kbd_scan == KEY_RIGHTSHIFT)
{
kbd_shift_right = 0;
}
else
{