ibmpc_usb: Check invalid code for CS1

This commit is contained in:
tmk 2020-03-02 12:23:15 +09:00
parent 2c9ae5ac95
commit 28cd55c1bf

View file

@ -125,7 +125,7 @@ uint8_t matrix_scan(void)
if (ibmpc_error) { if (ibmpc_error) {
xprintf("\nERR: %02X\n", ibmpc_error); xprintf("\nERR:%02X\n", ibmpc_error);
// when recv error, neither send error nor buffer full // when recv error, neither send error nor buffer full
if (!(ibmpc_error & (IBMPC_ERR_SEND | IBMPC_ERR_FULL))) { if (!(ibmpc_error & (IBMPC_ERR_SEND | IBMPC_ERR_FULL))) {
@ -220,7 +220,7 @@ uint8_t matrix_scan(void)
keyboard_id = read_keyboard_id(); keyboard_id = read_keyboard_id();
if (ibmpc_error) { if (ibmpc_error) {
xprintf("\nERR: %02X\n", ibmpc_error); xprintf("\nERR:%02X\n", ibmpc_error);
ibmpc_error = IBMPC_ERR_NONE; ibmpc_error = IBMPC_ERR_NONE;
} }
@ -411,7 +411,7 @@ static uint8_t cs1_e0code(uint8_t code) {
case 0x63: return 0x7B; // Wake (MUHENKAN) case 0x63: return 0x7B; // Wake (MUHENKAN)
default: default:
xprintf("!CS1_?!\n"); xprintf("!CS1_E0_%02X!\n", code);
return code; return code;
} }
return 0x00; return 0x00;
@ -422,7 +422,7 @@ static int8_t process_cs1(void)
static enum { static enum {
INIT, INIT,
E0, E0,
// Pause: E1 1D 45, E1 9D C5 // Pause: E1 1D 45, E1 9D C5 [a] (TODO: test)
E1, E1,
E1_1D, E1_1D,
E1_9D, E1_9D,
@ -433,12 +433,20 @@ static int8_t process_cs1(void)
return 0; return 0;
} }
// Check invalid codes; 0x59-7F won't be used in real XT keyboards probably
// 0x62 is used to handle escape code E0 and E1
if ((code & 0x7F) >= 0x62) {
xprintf("!CS1_INV!\n");
state = INIT;
return -1;
}
switch (state) { switch (state) {
case INIT: case INIT:
switch (code) { switch (code) {
case 0x00: case 0x00:
case 0xFF: // Error/Overrun [3]p.26 case 0xFF: // Error/Overrun [3]p.26
xprintf("!CS1_%02X!\n", code); xprintf("!CS1_ERR!\n");
return -1; return -1;
break; break;
case 0xE0: case 0xE0:
@ -661,7 +669,7 @@ static int8_t process_cs2(void)
case 0x00: // Error/Overrun [3]p.26 case 0x00: // Error/Overrun [3]p.26
case 0xFF: case 0xFF:
matrix_clear(); matrix_clear();
xprintf("!CS2_%02X!\n", code); xprintf("!CS2_ERR!\n");
state = INIT; state = INIT;
return -1; return -1;
break; break;
@ -839,7 +847,7 @@ static int8_t process_cs3(void)
switch (code) { switch (code) {
case 0x00: // Error/Overrun [3]p.26 case 0x00: // Error/Overrun [3]p.26
case 0xFF: case 0xFF:
xprintf("!CS3_%02X!\n", code); xprintf("!CS3_ERR!\n");
return -1; return -1;
break; break;
case 0xF0: case 0xF0:
@ -855,7 +863,7 @@ static int8_t process_cs3(void)
if (code < 0x80) { if (code < 0x80) {
matrix_make(code); matrix_make(code);
} else { } else {
xprintf("!CS3_%02X!\n", code); xprintf("!CS3_READY!\n");
return -1; return -1;
} }
} }
@ -864,7 +872,7 @@ static int8_t process_cs3(void)
switch (code) { switch (code) {
case 0x00: case 0x00:
case 0xFF: case 0xFF:
xprintf("!CS3_F0_%02X!\n", code); xprintf("!CS3_F0_ERR!\n");
state = READY; state = READY;
return -1; return -1;
break; break;
@ -881,7 +889,7 @@ static int8_t process_cs3(void)
if (code < 0x80) { if (code < 0x80) {
matrix_break(code); matrix_break(code);
} else { } else {
xprintf("!CS3_F0_%02X!\n", code); xprintf("!CS3_F0!\n");
return -1; return -1;
} }
} }