From 9c96e7c7a25807bd3da3b0bfa548fc2b224a8c6f Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 29 Mar 2025 18:52:34 +1100 Subject: [PATCH] ch376-native: fixed issue with TMSMODE_MSXUKY selected when no usb keyboard is present on boot The TMS driver would always install a USB keyboard pooling interrupt, despite no keyboard present This would load the CPU and prevent other I/O operations --- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 99 ++++++++++--------- .../source-doc/keyboard/kyb-init.c | 5 +- Source/HBIOS/ch376kyb.asm | 6 +- 3 files changed, 59 insertions(+), 51 deletions(-) diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index e7fed9b8..8bcaa66e 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -62,7 +62,7 @@ _report: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:12: void keyboard_init(void) { +;source-doc/keyboard/kyb-init.c:12: uint8_t keyboard_init(void) __sdcccall(1) { ; --------------------------------- ; Function keyboard_init ; --------------------------------- @@ -118,7 +118,8 @@ l_keyboard_init_00105: inc sp ld hl, (_keyboard_config) call _hid_set_idle -;source-doc/keyboard/kyb-init.c:32: return; +;source-doc/keyboard/kyb-init.c:32: return 1; + ld a,0x01 jr l_keyboard_init_00108 l_keyboard_init_00106: ;source-doc/keyboard/kyb-init.c:34: } while (++index != MAX_NUMBER_OF_DEVICES + 1); @@ -130,9 +131,11 @@ l_keyboard_init_00106: l_keyboard_init_00107: ;source-doc/keyboard/kyb-init.c:36: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); ld hl,kyb_init_str_2 - jp _print_string + call _print_string +;source-doc/keyboard/kyb-init.c:37: return 0; + xor a l_keyboard_init_00108: -;source-doc/keyboard/kyb-init.c:37: } +;source-doc/keyboard/kyb-init.c:38: } ret kyb_init_str_0: DEFB 0x0d @@ -147,7 +150,7 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:50: +;source-doc/keyboard/kyb-init.c:51: ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- @@ -155,42 +158,42 @@ _keyboard_buf_put: push ix ld ix,0 add ix,sp -;source-doc/keyboard/kyb-init.c:51: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { +;source-doc/keyboard/kyb-init.c:52: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { ld a,(ix+5) sub 0x80 jr NC,l_keyboard_buf_put_00112 ld a,(ix+5) or a -;source-doc/keyboard/kyb-init.c:52: if (key_code >= 0x80 || key_code == 0) -;source-doc/keyboard/kyb-init.c:55: // if already reported, just skip it +;source-doc/keyboard/kyb-init.c:53: if (key_code >= 0x80 || key_code == 0) +;source-doc/keyboard/kyb-init.c:56: // if already reported, just skip it jr Z,l_keyboard_buf_put_00112 ld c,0x00 l_keyboard_buf_put_00110: ld a, c sub 0x06 jr NC,l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:56: for (uint8_t i = 0; i < 6; i++) +;source-doc/keyboard/kyb-init.c:57: for (uint8_t i = 0; i < 6; i++) ld b,0x00 ld hl,_previous_keyCodes add hl, bc ld a, (hl) sub (ix+5) -;source-doc/keyboard/kyb-init.c:57: if (previous_keyCodes[i] == key_code) +;source-doc/keyboard/kyb-init.c:58: if (previous_keyCodes[i] == key_code) jr Z,l_keyboard_buf_put_00112 -;source-doc/keyboard/kyb-init.c:55: // if already reported, just skip it +;source-doc/keyboard/kyb-init.c:56: // if already reported, just skip it inc c jr l_keyboard_buf_put_00110 l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb-init.c:59: +;source-doc/keyboard/kyb-init.c:60: ld a, (_write_index) inc a and 0x07 ld c, a -;source-doc/keyboard/kyb-init.c:60: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb-init.c:61: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_read_index) sub c jr Z,l_keyboard_buf_put_00112 -;source-doc/keyboard/kyb-init.c:61: if (next_write_index != read_index) { // Check if buffer is not full +;source-doc/keyboard/kyb-init.c:62: if (next_write_index != read_index) { // Check if buffer is not full ld de,_buffer+0 ld hl, (_write_index) ld h,0x00 @@ -198,7 +201,7 @@ l_keyboard_buf_put_00106: add hl, de ld a,(ix+4) ld (hl), a -;source-doc/keyboard/kyb-init.c:62: buffer[write_index].modifier_keys = modifier_keys; +;source-doc/keyboard/kyb-init.c:63: buffer[write_index].modifier_keys = modifier_keys; ld hl, (_write_index) ld h,0x00 add hl, hl @@ -206,39 +209,39 @@ l_keyboard_buf_put_00106: inc hl ld a,(ix+5) ld (hl), a -;source-doc/keyboard/kyb-init.c:63: buffer[write_index].key_code = key_code; +;source-doc/keyboard/kyb-init.c:64: buffer[write_index].key_code = key_code; ld hl,_write_index ld (hl), c l_keyboard_buf_put_00112: -;source-doc/keyboard/kyb-init.c:65: } +;source-doc/keyboard/kyb-init.c:66: } pop ix ret -;source-doc/keyboard/kyb-init.c:67: +;source-doc/keyboard/kyb-init.c:68: ; --------------------------------- ; Function keyboard_buf_size ; --------------------------------- _keyboard_buf_size: -;source-doc/keyboard/kyb-init.c:68: uint8_t keyboard_buf_size() __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:69: uint8_t keyboard_buf_size() __sdcccall(1) { ld a,(_write_index) ld hl,_read_index sub (hl) jr C,l_keyboard_buf_size_00102 -;source-doc/keyboard/kyb-init.c:69: if (write_index >= read_index) +;source-doc/keyboard/kyb-init.c:70: if (write_index >= read_index) ld a,(_write_index) ld hl,_read_index sub (hl) jr l_keyboard_buf_size_00103 l_keyboard_buf_size_00102: -;source-doc/keyboard/kyb-init.c:71: +;source-doc/keyboard/kyb-init.c:72: ld hl, (_read_index) ld a,0x08 sub l ld hl, (_write_index) add a, l l_keyboard_buf_size_00103: -;source-doc/keyboard/kyb-init.c:72: return KEYBOARD_BUFFER_SIZE - read_index + write_index; +;source-doc/keyboard/kyb-init.c:73: return KEYBOARD_BUFFER_SIZE - read_index + write_index; ret -;source-doc/keyboard/kyb-init.c:74: +;source-doc/keyboard/kyb-init.c:75: ; --------------------------------- ; Function keyboard_buf_get_next ; --------------------------------- @@ -248,53 +251,53 @@ _keyboard_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/kyb-init.c:75: uint32_t keyboard_buf_get_next() { +;source-doc/keyboard/kyb-init.c:76: uint32_t keyboard_buf_get_next() { ld a,(_write_index) ld hl,_read_index sub (hl) jr NZ,l_keyboard_buf_get_next_00102 -;source-doc/keyboard/kyb-init.c:76: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb-init.c:77: if (write_index == read_index) // Check if buffer is empty ld hl,0xff00 ld e, h ld d, h jr l_keyboard_buf_get_next_00105 l_keyboard_buf_get_next_00102: -;source-doc/keyboard/kyb-init.c:78: +;source-doc/keyboard/kyb-init.c:79: ld bc,_buffer+0 ld hl, (_read_index) ld h,0x00 add hl, hl add hl, bc ld b, (hl) -;source-doc/keyboard/kyb-init.c:79: const uint8_t modifier_key = buffer[read_index].modifier_keys; +;source-doc/keyboard/kyb-init.c:80: const uint8_t modifier_key = buffer[read_index].modifier_keys; inc hl ld c, (hl) -;source-doc/keyboard/kyb-init.c:80: const uint8_t key_code = buffer[read_index].key_code; +;source-doc/keyboard/kyb-init.c:81: const uint8_t key_code = buffer[read_index].key_code; ld a, (_read_index) inc a and 0x07 ld (_read_index),a -;source-doc/keyboard/kyb-init.c:82: +;source-doc/keyboard/kyb-init.c:83: ld a, c sub 0x39 jr NZ,l_keyboard_buf_get_next_00104 -;source-doc/keyboard/kyb-init.c:83: if (key_code == KEY_CODE_CAPS_LOCK) { +;source-doc/keyboard/kyb-init.c:84: if (key_code == KEY_CODE_CAPS_LOCK) { ld hl,_caps_lock_engaged ld a, (hl) xor 0x01 ld (hl), a -;source-doc/keyboard/kyb-init.c:84: caps_lock_engaged = !caps_lock_engaged; +;source-doc/keyboard/kyb-init.c:85: caps_lock_engaged = !caps_lock_engaged; call _keyboard_buf_get_next jr l_keyboard_buf_get_next_00105 l_keyboard_buf_get_next_00104: -;source-doc/keyboard/kyb-init.c:87: +;source-doc/keyboard/kyb-init.c:88: push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb-init.c:89: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb-init.c:90: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -311,32 +314,32 @@ l_keyboard_buf_get_next_00104: pop hl push hl l_keyboard_buf_get_next_00105: -;source-doc/keyboard/kyb-init.c:90: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +;source-doc/keyboard/kyb-init.c:91: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; ld sp, ix pop ix ret -;source-doc/keyboard/kyb-init.c:92: +;source-doc/keyboard/kyb-init.c:93: ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:93: void keyboard_buf_flush() { -;source-doc/keyboard/kyb-init.c:94: write_index = 0; +;source-doc/keyboard/kyb-init.c:94: void keyboard_buf_flush() { +;source-doc/keyboard/kyb-init.c:95: write_index = 0; xor a ld (_write_index),a ld (_read_index),a -;source-doc/keyboard/kyb-init.c:95: read_index = 0; +;source-doc/keyboard/kyb-init.c:96: read_index = 0; ret -;source-doc/keyboard/kyb-init.c:101: +;source-doc/keyboard/kyb-init.c:102: ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/kyb-init.c:102: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:103: void keyboard_tick(void) { ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb-init.c:103: if (is_in_critical_section()) +;source-doc/keyboard/kyb-init.c:104: if (is_in_critical_section()) jr NZ,l_keyboard_tick_00111 ;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b @@ -349,7 +352,7 @@ _keyboard_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:106: ch_configure_nak_retry_disable(); +;source-doc/keyboard/kyb-init.c:107: ch_configure_nak_retry_disable(); ld bc,_report ld hl, (_keyboard_config) ld a,0x08 @@ -374,10 +377,10 @@ _keyboard_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:108: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb-init.c:109: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) -;source-doc/keyboard/kyb-init.c:109: if (result == 0) +;source-doc/keyboard/kyb-init.c:110: if (result == 0) or a jr NZ,l_keyboard_tick_00111 ld c,a @@ -385,7 +388,7 @@ l_keyboard_tick_00109: ld a, c sub 0x06 ret NC -;source-doc/keyboard/kyb-init.c:110: for (uint8_t i = 0; i < 6; i++) { +;source-doc/keyboard/kyb-init.c:111: for (uint8_t i = 0; i < 6; i++) { ld a,+((_report+2) & 0xFF) add a, c ld e, a @@ -404,17 +407,17 @@ l_keyboard_tick_00109: pop af pop de pop bc -;source-doc/keyboard/kyb-init.c:111: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); +;source-doc/keyboard/kyb-init.c:112: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); ld b,0x00 ld hl,_previous_keyCodes add hl, bc ld a, (de) ld (hl), a -;source-doc/keyboard/kyb-init.c:109: if (result == 0) +;source-doc/keyboard/kyb-init.c:110: if (result == 0) inc c jr l_keyboard_tick_00109 l_keyboard_tick_00111: -;source-doc/keyboard/kyb-init.c:113: } +;source-doc/keyboard/kyb-init.c:114: } ret _keyboard_config: DEFW +0x0000 diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c index e0b1e59a..aba62ac5 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -9,7 +9,7 @@ static device_config_keyboard *keyboard_config = 0; extern bool caps_lock_engaged; -void keyboard_init(void) { +uint8_t keyboard_init(void) __sdcccall(1) { uint8_t index = 1; keyboard_config = NULL; @@ -29,11 +29,12 @@ void keyboard_init(void) { hid_set_protocol(keyboard_config, 1); hid_set_idle(keyboard_config, 0x80); - return; + return 1; } } while (++index != MAX_NUMBER_OF_DEVICES + 1); print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); + return 0; } #define KEYBOARD_BUFFER_SIZE 8 diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index b6f3af6c..ac971673 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -38,6 +38,10 @@ SCAN_INT_PERIOD: .EQU 2 UKY_INTSTK: ; 128 bytes for keyboard interrupt stack - need ~52 bytes??? CHUKB_INIT: + CALL _keyboard_init + OR A + RET Z + ; INSTALL INTERRUPT HANDLER LD HL, (VEC_TICK+1) LD (VEC_CHUKB_TICK+1), HL @@ -45,7 +49,7 @@ CHUKB_INIT: LD HL, CHUKB_TICK LD (VEC_TICK+1), HL - JP _keyboard_init + RET CHUKB_TICK: LD A, SCAN_INT_PERIOD ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS.