Temporarily removed scan code set 1 support from the AT keyboard, fixes the keyboard in TSX.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Intel 8042 (AT keyboard controller) emulation.
|
||||
*
|
||||
* Version: @(#)keyboard_at.c 1.0.36 2018/05/12
|
||||
* Version: @(#)keyboard_at.c 1.0.37 2018/08/20
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -130,6 +130,7 @@ uint8_t keyboard_set3_all_repeat;
|
||||
uint8_t keyboard_set3_all_break;
|
||||
|
||||
/* Bits 0 - 1 = scan code set, bit 6 = translate or not. */
|
||||
/* Q */
|
||||
uint8_t keyboard_mode = 0x42;
|
||||
|
||||
int mouse_queue_start = 0,
|
||||
@@ -185,6 +186,7 @@ static const uint8_t nont_to_t[256] = {
|
||||
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
|
||||
};
|
||||
|
||||
#if 0
|
||||
static const scancode scancode_set1[512] = {
|
||||
{ { -1},{ -1} }, { { 0x01,-1},{ 0x81,-1} }, { { 0x02,-1},{ 0x82,-1} }, { { 0x03,-1},{ 0x83,-1} }, /*000*/
|
||||
{ { 0x04,-1},{ 0x84,-1} }, { { 0x05,-1},{ 0x85,-1} }, { { 0x06,-1},{ 0x86,-1} }, { { 0x07,-1},{ 0x87,-1} }, /*004*/
|
||||
@@ -314,6 +316,7 @@ static const scancode scancode_set1[512] = {
|
||||
{ { -1},{ -1} }, { { -1},{ -1} }, { { -1},{ -1} }, { { -1},{ -1} }, /*1f8*/
|
||||
{ { -1},{ -1} }, { { -1},{ -1} }, { {0xe0,0xfe,-1},{ -1} }, { {0xe0,0xff,-1},{ -1} } /*1fc*/
|
||||
};
|
||||
#endif
|
||||
|
||||
static const scancode scancode_set2[512] = {
|
||||
{ { -1},{ -1} }, { { 0x76,-1},{ 0xF0,0x76,-1} }, { { 0x16,-1},{ 0xF0,0x16,-1} }, { { 0x1E,-1},{ 0xF0,0x1E,-1} }, /*000*/
|
||||
@@ -575,6 +578,13 @@ static const scancode scancode_set3[512] = {
|
||||
{ { -1},{ -1} }, { { -1},{ -1} }, { {0xe0,0xfe,-1},{0xe0,0xF0,0xFE,-1} }, { {0xe0,0xff,-1},{0xe0,0xF0,0xFF,-1} } /*1fc*/
|
||||
};
|
||||
|
||||
|
||||
#ifdef ENABLE_KEYBOARD_AT_LOG
|
||||
#define ENABLE_KEYBOARD_LOG
|
||||
int keyboard_at_do_log = ENABLE_KEYBOARD_AT_LOG;
|
||||
#endif
|
||||
|
||||
|
||||
static void
|
||||
kbd_log(const char *fmt, ...)
|
||||
{
|
||||
@@ -593,6 +603,7 @@ static void
|
||||
kbd_setmap(atkbd_t *kbd)
|
||||
{
|
||||
switch (keyboard_mode & 3) {
|
||||
#if 0
|
||||
case 1:
|
||||
default:
|
||||
keyboard_set_table(scancode_set1);
|
||||
@@ -601,14 +612,19 @@ kbd_setmap(atkbd_t *kbd)
|
||||
case 2:
|
||||
keyboard_set_table(scancode_set2);
|
||||
break;
|
||||
|
||||
#else
|
||||
case 2:
|
||||
default:
|
||||
keyboard_set_table(scancode_set2);
|
||||
break;
|
||||
#endif
|
||||
case 3:
|
||||
keyboard_set_table(scancode_set3);
|
||||
break;
|
||||
}
|
||||
|
||||
if (keyboard_mode & 0x20)
|
||||
keyboard_set_table(scancode_set1);
|
||||
keyboard_set_table(scancode_set2);
|
||||
}
|
||||
|
||||
|
||||
@@ -685,11 +701,19 @@ kbd_adddata(uint8_t val)
|
||||
static void
|
||||
kbd_adddata_vals(uint8_t *val, uint8_t len)
|
||||
{
|
||||
int translate = (keyboard_mode & 0x40) && !(keyboard_mode & 0x20);
|
||||
int xt_mode = (keyboard_mode & 0x20) && ((CurrentKbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1);
|
||||
int translate = (keyboard_mode & 0x40);
|
||||
int i;
|
||||
uint8_t or = 0;
|
||||
uint8_t send;
|
||||
|
||||
#if 0
|
||||
translate = translate || (keyboard_mode & 0x40) && !xt_mode;
|
||||
#else
|
||||
translate = translate || (keyboard_mode & 0x40) || xt_mode;
|
||||
translate = translate || ((CurrentKbd->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (translate) {
|
||||
if (val[i] == 0xf0) {
|
||||
@@ -727,11 +751,18 @@ kbd_adddata_vals(uint8_t *val, uint8_t len)
|
||||
static void
|
||||
kbd_adddata_keyboard(uint16_t val)
|
||||
{
|
||||
int translate = (keyboard_mode & 0x40) && !(keyboard_mode & 0x20);
|
||||
|
||||
int xt_mode = (keyboard_mode & 0x20) && ((CurrentKbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1);
|
||||
int translate = (keyboard_mode & 0x40);
|
||||
uint8_t fake_shift[4];
|
||||
uint8_t num_lock = 0, shift_states = 0;
|
||||
|
||||
#if 0
|
||||
translate = translate || (keyboard_mode & 0x40) && !xt_mode;
|
||||
#else
|
||||
translate = translate || (keyboard_mode & 0x40) || xt_mode;
|
||||
translate = translate || ((CurrentKbd->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2);
|
||||
#endif
|
||||
|
||||
keyboard_get_states(NULL, &num_lock, NULL);
|
||||
shift_states = keyboard_get_shift() & STATE_SHIFT_MASK;
|
||||
|
||||
@@ -1016,6 +1047,8 @@ kbd_cmd_write(atkbd_t *kbd, uint8_t val)
|
||||
kbd_log("ATkbd: mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled");
|
||||
#endif
|
||||
}
|
||||
|
||||
kbd_log("Command byte now: %02X (%02X)\n", kbd->mem[0], val);
|
||||
}
|
||||
|
||||
|
||||
@@ -1699,18 +1732,22 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
|
||||
kbd->key_wantdata = 0;
|
||||
switch (kbd->key_command) {
|
||||
case 0xed: /*Set/reset LEDs*/
|
||||
if (val & 0xf8)
|
||||
goto do_command; /* Command ED does command if command is recognized. */
|
||||
kbd_adddata_keyboard(0xfa);
|
||||
break;
|
||||
|
||||
case 0xf0: /*Get/set scancode set*/
|
||||
kbd_adddata_keyboard(0xfa);
|
||||
if (val == 0) {
|
||||
kbd_log("Get scan code set: %02X\n", keyboard_mode & 3);
|
||||
kbd_adddata_keyboard(keyboard_mode & 3);
|
||||
} else {
|
||||
if (val <= 3) {
|
||||
if ((val <= 3) && (val != 1)) {
|
||||
keyboard_mode &= 0xFC;
|
||||
keyboard_mode |= (val & 3);
|
||||
kbd_log("Scan code set now: %02X\n", val);
|
||||
}
|
||||
kbd_adddata_keyboard(0xfa);
|
||||
kbd_setmap(kbd);
|
||||
}
|
||||
break;
|
||||
@@ -1729,6 +1766,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
|
||||
/* Keyboard command is now done. */
|
||||
kbd->key_command = 0x00;
|
||||
} else {
|
||||
do_command:
|
||||
/* No keyboard command in progress. */
|
||||
kbd->key_command = 0x00;
|
||||
|
||||
@@ -1794,8 +1832,8 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
|
||||
kbd_log("ATkbd: read keyboard id\n");
|
||||
#endif
|
||||
kbd_adddata_keyboard(0xfa);
|
||||
kbd_adddata_keyboard(0xab);
|
||||
kbd_adddata_keyboard(0x83);
|
||||
/* kbd_adddata_keyboard(0xab);
|
||||
kbd_adddata_keyboard(0x83); */
|
||||
break;
|
||||
|
||||
case 0xf3: /*Set typematic rate/delay*/
|
||||
@@ -1821,7 +1859,8 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
|
||||
#endif
|
||||
kbd_adddata_keyboard(0xfa);
|
||||
keyboard_scan = 0;
|
||||
break;
|
||||
/* Disabling the keyboard also resets it to the default values, so continue below. */
|
||||
// break;
|
||||
|
||||
case 0xf6: /*Set defaults*/
|
||||
#ifdef ENABLE_KEYBOARD_LOG
|
||||
@@ -1832,6 +1871,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
|
||||
keyboard_set3_all_break = 0;
|
||||
keyboard_set3_all_repeat = 0;
|
||||
memset(keyboard_set3_flags, 0, 512);
|
||||
/* Q */
|
||||
keyboard_mode = (keyboard_mode & 0xFC) | 0x02;
|
||||
kbd_setmap(kbd);
|
||||
break;
|
||||
@@ -1883,9 +1923,9 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
|
||||
key_queue_start = key_queue_end = 0; /*Clear key queue*/
|
||||
kbd_adddata_keyboard(0xfa);
|
||||
kbd_adddata_keyboard(0xaa);
|
||||
/* Set system flag to 1 and scan code set to 2. */
|
||||
keyboard_mode &= 0xFC;
|
||||
keyboard_mode |= 2;
|
||||
/* Set scan code set to 2. */
|
||||
/* Q */
|
||||
keyboard_mode = (keyboard_mode & 0xFC) | 0x02;
|
||||
kbd_setmap(kbd);
|
||||
break;
|
||||
|
||||
@@ -2162,6 +2202,7 @@ kbd_reset(void *priv)
|
||||
kbd->secr_phase = 0;
|
||||
kbd->key_wantdata = 0;
|
||||
|
||||
/* Q */
|
||||
keyboard_mode = 0x02 | kbd->dtrans;
|
||||
|
||||
kbd_keyboard_set(kbd, 1);
|
||||
@@ -2195,13 +2236,16 @@ kbd_init(const device_t *info)
|
||||
timer_add(kbd_poll, &keyboard_delay, TIMER_ALWAYS_ENABLED, kbd);
|
||||
|
||||
if ((kbd->flags & KBC_TYPE_MASK) != KBC_TYPE_ISA) {
|
||||
#if 0
|
||||
if ((kbd->flags & KBC_TYPE_MASK) == KBC_TYPE_PS2_2) {
|
||||
/*
|
||||
* These machines force translation off, so the
|
||||
* the keyboard must start in scan code set 0.
|
||||
* the keyboard must start in scan code set 1.
|
||||
*/
|
||||
keyboard_mode &= ~0x03;
|
||||
keyboard_mode |= 0x01;
|
||||
}
|
||||
#endif
|
||||
|
||||
timer_add(kbd_refresh,
|
||||
&kbd->refresh_time, TIMER_ALWAYS_ENABLED, kbd);
|
||||
|
Reference in New Issue
Block a user