From 9abba42df7d3703fb3b51239d5bc501c577c7d9d Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 16 Apr 2025 15:52:57 +1000 Subject: [PATCH] ch376-native: keyboard int handler optimisations --- Dockerfile | 2 +- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 259 ++++++++---------- .../source-doc/keyboard/kyb-init.c | 31 +-- Source/HBIOS/ch376kyb.asm | 16 +- 4 files changed, 146 insertions(+), 162 deletions(-) diff --git a/Dockerfile b/Dockerfile index 86317c2f..da6c902b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ FROM ubuntu:jammy-20240111 AS basebuilder # cd Tools && make # cd Source && make # at least once to build many common units -# cd Source && make rom ROM_PLATFORM=RCZ80 ROM_CONFIG=std +# cd Source && make rom ROM_PLATFORM=RCEZ80 ROM_CONFIG=std # when finish, type 'exit' to return to back to your standard terminal session diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 528450d8..db2be91a 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -68,80 +68,80 @@ _previous: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:30: +;source-doc/keyboard/kyb-init.c:27: ; --------------------------------- ; Function keyboard_init ; --------------------------------- _keyboard_init: -;source-doc/keyboard/kyb-init.c:31: uint8_t keyboard_init(void) __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:28: uint8_t keyboard_init(void) __sdcccall(1) { ld c,0x01 -;source-doc/keyboard/kyb-init.c:32: uint8_t index = 1; +;source-doc/keyboard/kyb-init.c:29: uint8_t index = 1; ld hl,0x0000 ld (_keyboard_config),hl -;source-doc/keyboard/kyb-init.c:34: +;source-doc/keyboard/kyb-init.c:31: ld b,0x01 l_keyboard_init_00105: -;source-doc/keyboard/kyb-init.c:35: do { +;source-doc/keyboard/kyb-init.c:32: do { push bc ld a, b call _get_usb_device_config ex de, hl pop bc ld (_keyboard_config), hl -;source-doc/keyboard/kyb-init.c:37: +;source-doc/keyboard/kyb-init.c:34: ld hl,(_keyboard_config) ld a,h or l jr Z,l_keyboard_init_00107 -;source-doc/keyboard/kyb-init.c:40: +;source-doc/keyboard/kyb-init.c:37: ld hl, (_keyboard_config) ld a, (hl) and 0x0f -;source-doc/keyboard/kyb-init.c:42: +;source-doc/keyboard/kyb-init.c:39: sub 0x04 jr NZ,l_keyboard_init_00106 -;source-doc/keyboard/kyb-init.c:43: if (t == USB_IS_KEYBOARD) { +;source-doc/keyboard/kyb-init.c:40: if (t == USB_IS_KEYBOARD) { push bc ld hl,kyb_init_str_0 call _print_string pop bc -;source-doc/keyboard/kyb-init.c:44: print_string("\r\nUSB: KEYBOARD @ $"); +;source-doc/keyboard/kyb-init.c:41: print_string("\r\nUSB: KEYBOARD @ $"); ld h,0x00 ld l, c call _print_uint16 -;source-doc/keyboard/kyb-init.c:45: print_uint16(index); +;source-doc/keyboard/kyb-init.c:42: print_uint16(index); ld hl,kyb_init_str_1 call _print_string -;source-doc/keyboard/kyb-init.c:47: +;source-doc/keyboard/kyb-init.c:44: ld a,0x01 push af inc sp ld hl, (_keyboard_config) call _hid_set_protocol -;source-doc/keyboard/kyb-init.c:48: hid_set_protocol(keyboard_config, 1); +;source-doc/keyboard/kyb-init.c:45: hid_set_protocol(keyboard_config, 1); ld a,0x80 push af inc sp ld hl, (_keyboard_config) call _hid_set_idle -;source-doc/keyboard/kyb-init.c:49: hid_set_idle(keyboard_config, 0x80); +;source-doc/keyboard/kyb-init.c:46: hid_set_idle(keyboard_config, 0x80); ld a,0x01 jr l_keyboard_init_00108 l_keyboard_init_00106: -;source-doc/keyboard/kyb-init.c:51: } +;source-doc/keyboard/kyb-init.c:48: } inc b ld a,b ld c,b sub 0x07 jr NZ,l_keyboard_init_00105 l_keyboard_init_00107: -;source-doc/keyboard/kyb-init.c:53: +;source-doc/keyboard/kyb-init.c:50: ld hl,kyb_init_str_2 call _print_string -;source-doc/keyboard/kyb-init.c:54: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/kyb-init.c:51: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); xor a l_keyboard_init_00108: -;source-doc/keyboard/kyb-init.c:55: return 0; +;source-doc/keyboard/kyb-init.c:52: return 0; ret kyb_init_str_0: DEFB 0x0d @@ -156,51 +156,51 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:57: +;source-doc/keyboard/kyb-init.c:54: ; --------------------------------- ; Function report_diff ; --------------------------------- _report_diff: -;source-doc/keyboard/kyb-init.c:58: static uint8_t report_diff() __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:55: static uint8_t report_diff() __sdcccall(1) { ld de,_report+0 -;source-doc/keyboard/kyb-init.c:59: uint8_t *a = (uint8_t *)&report; -;source-doc/keyboard/kyb-init.c:62: uint8_t i = sizeof(report); +;source-doc/keyboard/kyb-init.c:56: uint8_t *a = (uint8_t *)&report; +;source-doc/keyboard/kyb-init.c:59: uint8_t i = sizeof(report); ld b,0x08 ld hl,_previous l_report_diff_00103: -;source-doc/keyboard/kyb-init.c:63: do { +;source-doc/keyboard/kyb-init.c:60: do { ld a, (de) inc de ld c, (hl) inc hl sub c jr Z,l_report_diff_00104 -;source-doc/keyboard/kyb-init.c:64: if (*a++ != *b++) +;source-doc/keyboard/kyb-init.c:61: if (*a++ != *b++) ld a,0x01 jr l_report_diff_00106 l_report_diff_00104: -;source-doc/keyboard/kyb-init.c:65: return true; +;source-doc/keyboard/kyb-init.c:62: return true; djnz l_report_diff_00103 -;source-doc/keyboard/kyb-init.c:67: +;source-doc/keyboard/kyb-init.c:64: xor a l_report_diff_00106: -;source-doc/keyboard/kyb-init.c:68: return false; +;source-doc/keyboard/kyb-init.c:65: return false; ret -;source-doc/keyboard/kyb-init.c:70: +;source-doc/keyboard/kyb-init.c:67: ; --------------------------------- ; Function report_put ; --------------------------------- _report_put: -;source-doc/keyboard/kyb-init.c:71: static void report_put() { +;source-doc/keyboard/kyb-init.c:68: static void report_put() { ld a, (_alt_write_index) inc a and 0x07 ld c, a -;source-doc/keyboard/kyb-init.c:73: +;source-doc/keyboard/kyb-init.c:70: ld a,(_alt_read_index) sub c ret Z -;source-doc/keyboard/kyb-init.c:74: if (next_write_index != alt_read_index) { // Check if buffer is not full +;source-doc/keyboard/kyb-init.c:71: if (next_write_index != alt_read_index) { // Check if buffer is not full ld de,_reports+0 ld hl, (_alt_write_index) ld h,0x00 @@ -214,90 +214,90 @@ _report_put: ld hl,_report ldir pop bc -;source-doc/keyboard/kyb-init.c:75: reports[alt_write_index] = report; +;source-doc/keyboard/kyb-init.c:72: reports[alt_write_index] = report; ld hl,_alt_write_index ld (hl), c -;source-doc/keyboard/kyb-init.c:77: } +;source-doc/keyboard/kyb-init.c:74: } ret -;source-doc/keyboard/kyb-init.c:79: +;source-doc/keyboard/kyb-init.c:76: ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- _keyboard_buf_put: ld c, a -;source-doc/keyboard/kyb-init.c:80: static void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) __sdcccall(1) { - ld a,l - ld e,l +;source-doc/keyboard/kyb-init.c:77: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { + ld b,0x00 + ld hl,+(_report + 2) + add hl, bc +;source-doc/keyboard/kyb-init.c:78: const uint8_t key_code = report.keyCode[indx]; + ld a,(hl) + ld c,a cp 0x80 jr NC,l_keyboard_buf_put_00111 or a -;source-doc/keyboard/kyb-init.c:81: if (key_code >= 0x80 || key_code == 0) +;source-doc/keyboard/kyb-init.c:79: if (key_code >= 0x80 || key_code == 0) jr Z,l_keyboard_buf_put_00111 -;source-doc/keyboard/kyb-init.c:85: uint8_t i = 6; -;source-doc/keyboard/kyb-init.c:86: uint8_t *a = previous.keyCode; +;source-doc/keyboard/kyb-init.c:83: uint8_t i = 6; +;source-doc/keyboard/kyb-init.c:84: uint8_t *a = previous.keyCode; ld b,0x06 ld hl,+(_previous + 2) l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb-init.c:87: do { +;source-doc/keyboard/kyb-init.c:85: do { ld a, (hl) inc hl - sub e -;source-doc/keyboard/kyb-init.c:88: if (*a++ == key_code) + sub c +;source-doc/keyboard/kyb-init.c:86: if (*a++ == key_code) ret Z -;source-doc/keyboard/kyb-init.c:89: return; +;source-doc/keyboard/kyb-init.c:87: return; djnz l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:91: +;source-doc/keyboard/kyb-init.c:89: ld a, (_write_index) inc a and 0x07 - ld d, a -;source-doc/keyboard/kyb-init.c:92: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + ld b, a +;source-doc/keyboard/kyb-init.c:90: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_read_index) - sub d + sub b ret Z -;source-doc/keyboard/kyb-init.c:93: if (next_write_index != read_index) { // Check if buffer is not full - ld hl, (_write_index) - ld h,0x00 - add hl, hl - ld a,+((_buffer) & 0xFF) - add a,l - ld l,a - ld a,+((_buffer) / 256) - adc a,h - ld h,a - ld (hl), c -;source-doc/keyboard/kyb-init.c:94: buffer[write_index].modifier_keys = modifier_keys; +;source-doc/keyboard/kyb-init.c:91: if (next_write_index != read_index) { // Check if buffer is not full + ld de,_buffer+0 ld hl, (_write_index) ld h,0x00 add hl, hl - ld bc,_buffer - add hl, bc - inc hl - ld (hl), e -;source-doc/keyboard/kyb-init.c:95: buffer[write_index].key_code = key_code; + add hl, de + ex de, hl + ld hl,(_report) + xor a + xor a + ld a, c + ld (de), a + inc de + ld a, l + ld (de), a +;source-doc/keyboard/kyb-init.c:92: buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; ld hl,_write_index - ld (hl), d + ld (hl), b l_keyboard_buf_put_00111: -;source-doc/keyboard/kyb-init.c:97: } +;source-doc/keyboard/kyb-init.c:94: } ret -;source-doc/keyboard/kyb-init.c:99: +;source-doc/keyboard/kyb-init.c:96: ; --------------------------------- ; Function keyboard_buf_size ; --------------------------------- _keyboard_buf_size: -;source-doc/keyboard/kyb-init.c:103: +;source-doc/keyboard/kyb-init.c:100: ld a,(_alt_write_index) ld hl,_alt_read_index sub (hl) jr C,l_keyboard_buf_size_00102 -;source-doc/keyboard/kyb-init.c:104: if (alt_write_index >= alt_read_index) +;source-doc/keyboard/kyb-init.c:101: if (alt_write_index >= alt_read_index) ld a,(_alt_write_index) ld hl,_alt_read_index sub (hl) ld d, a jr l_keyboard_buf_size_00103 l_keyboard_buf_size_00102: -;source-doc/keyboard/kyb-init.c:106: else +;source-doc/keyboard/kyb-init.c:103: else ld hl, (_alt_read_index) ld a,0x08 sub l @@ -305,57 +305,43 @@ l_keyboard_buf_size_00102: add a, l ld d, a l_keyboard_buf_size_00103: -;source-doc/keyboard/kyb-init.c:108: +;source-doc/keyboard/kyb-init.c:105: ld a, d or a - jr NZ,l_keyboard_buf_size_00105 -;source-doc/keyboard/kyb-init.c:109: if (alt_size == 0) - ld hl,0x0000 - ld (_queued_report),hl - jr l_keyboard_buf_size_00106 -l_keyboard_buf_size_00105: -;source-doc/keyboard/kyb-init.c:111: else { - ld hl, (_alt_read_index) - ld h,0x00 - add hl, hl - add hl, hl - add hl, hl - ld bc,_reports - add hl, bc - ld (_queued_report), hl -;source-doc/keyboard/kyb-init.c:112: queued_report = &reports[alt_read_index]; + jr Z,l_keyboard_buf_size_00105 +;source-doc/keyboard/kyb-init.c:106: if (alt_size != 0) ld a, (_alt_read_index) inc a and 0x07 ld (_alt_read_index),a -l_keyboard_buf_size_00106: -;source-doc/keyboard/kyb-init.c:115: +l_keyboard_buf_size_00105: +;source-doc/keyboard/kyb-init.c:108: ld a,(_write_index) ld hl,_read_index sub (hl) - jr C,l_keyboard_buf_size_00108 -;source-doc/keyboard/kyb-init.c:116: if (write_index >= read_index) + jr C,l_keyboard_buf_size_00107 +;source-doc/keyboard/kyb-init.c:109: if (write_index >= read_index) ld a,(_write_index) ld hl,_read_index sub (hl) ld e, a - jr l_keyboard_buf_size_00109 -l_keyboard_buf_size_00108: -;source-doc/keyboard/kyb-init.c:118: else + jr l_keyboard_buf_size_00108 +l_keyboard_buf_size_00107: +;source-doc/keyboard/kyb-init.c:111: else ld hl, (_read_index) ld a,0x08 sub l ld hl, (_write_index) add a, l ld e, a -l_keyboard_buf_size_00109: -;source-doc/keyboard/kyb-init.c:120: +l_keyboard_buf_size_00108: +;source-doc/keyboard/kyb-init.c:113: xor a xor a ex de, hl -;source-doc/keyboard/kyb-init.c:121: return (uint16_t)alt_size << 8 | (uint16_t)size; +;source-doc/keyboard/kyb-init.c:114: return (uint16_t)alt_size << 8 | (uint16_t)size; ret -;source-doc/keyboard/kyb-init.c:123: +;source-doc/keyboard/kyb-init.c:116: ; --------------------------------- ; Function keyboard_buf_get_next ; --------------------------------- @@ -365,40 +351,40 @@ _keyboard_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/kyb-init.c:124: uint32_t keyboard_buf_get_next() { +;source-doc/keyboard/kyb-init.c:117: 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:125: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb-init.c:118: if (write_index == read_index) // Check if buffer is empty ld hl,0xff00 ld e, l ld d, l jr l_keyboard_buf_get_next_00103 l_keyboard_buf_get_next_00102: -;source-doc/keyboard/kyb-init.c:127: +;source-doc/keyboard/kyb-init.c:120: 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:128: const uint8_t modifier_key = buffer[read_index].modifier_keys; - inc hl ld c, (hl) -;source-doc/keyboard/kyb-init.c:129: const uint8_t key_code = buffer[read_index].key_code; + inc hl + ld b, (hl) +;source-doc/keyboard/kyb-init.c:121: const uint8_t modifier_key = buffer[read_index] >> 8; +;source-doc/keyboard/kyb-init.c:122: const uint8_t key_code = buffer[read_index] & 255; ld a, (_read_index) inc a and 0x07 ld (_read_index),a -;source-doc/keyboard/kyb-init.c:136: +;source-doc/keyboard/kyb-init.c:129: push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb-init.c:138: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb-init.c:131: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -415,50 +401,50 @@ l_keyboard_buf_get_next_00102: pop hl push hl l_keyboard_buf_get_next_00103: -;source-doc/keyboard/kyb-init.c:139: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +;source-doc/keyboard/kyb-init.c:132: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; ld sp, ix pop ix ret -;source-doc/keyboard/kyb-init.c:141: +;source-doc/keyboard/kyb-init.c:134: ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:142: void keyboard_buf_flush() { +;source-doc/keyboard/kyb-init.c:135: void keyboard_buf_flush() { xor a ld (_alt_read_index),a ld (_alt_write_index),a xor a ld (_read_index),a ld (_write_index),a -;source-doc/keyboard/kyb-init.c:145: uint8_t i = sizeof(previous); +;source-doc/keyboard/kyb-init.c:138: uint8_t i = sizeof(previous); ld de,_previous+0 -;source-doc/keyboard/kyb-init.c:146: uint8_t *a = (uint8_t *)previous; -;source-doc/keyboard/kyb-init.c:147: uint8_t *b = (uint8_t *)report; +;source-doc/keyboard/kyb-init.c:139: uint8_t *a = (uint8_t *)previous; +;source-doc/keyboard/kyb-init.c:140: uint8_t *b = (uint8_t *)report; ld b,0x08 ld hl,_report l_keyboard_buf_flush_00101: -;source-doc/keyboard/kyb-init.c:148: do { +;source-doc/keyboard/kyb-init.c:141: do { xor a ld (de), a inc de -;source-doc/keyboard/kyb-init.c:149: *a++ = 0; +;source-doc/keyboard/kyb-init.c:142: *a++ = 0; ld (hl),0x00 inc hl -;source-doc/keyboard/kyb-init.c:150: *b++ = 0; +;source-doc/keyboard/kyb-init.c:143: *b++ = 0; djnz l_keyboard_buf_flush_00101 -;source-doc/keyboard/kyb-init.c:151: } while (--i != 0); +;source-doc/keyboard/kyb-init.c:144: } while (--i != 0); ret -;source-doc/keyboard/kyb-init.c:153: +;source-doc/keyboard/kyb-init.c:146: ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/kyb-init.c:154: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:147: void keyboard_tick(void) { ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb-init.c:155: if (is_in_critical_section()) +;source-doc/keyboard/kyb-init.c:148: if (is_in_critical_section()) jr NZ,l_keyboard_tick_00112 ;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b @@ -471,7 +457,7 @@ _keyboard_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:158: ch_configure_nak_retry_disable(); +;source-doc/keyboard/kyb-init.c:151: ch_configure_nak_retry_disable(); ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 @@ -496,47 +482,40 @@ _keyboard_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:160: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb-init.c:153: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) or a jr NZ,l_keyboard_tick_00112 -;source-doc/keyboard/kyb-init.c:161: if (result == 0) { +;source-doc/keyboard/kyb-init.c:154: if (result == 0) { call _report_diff or a jr Z,l_keyboard_tick_00112 -;source-doc/keyboard/kyb-init.c:162: if (report_diff()) { +;source-doc/keyboard/kyb-init.c:155: if (report_diff()) { call _report_put -;source-doc/keyboard/kyb-init.c:164: uint8_t i = 6; +;source-doc/keyboard/kyb-init.c:157: uint8_t i = 6; ld b,0x06 l_keyboard_tick_00103: -;source-doc/keyboard/kyb-init.c:165: do { - ld l, b - dec l - ld h,0x00 - ld de, +(_report + 2) - add hl, de - ld c, (hl) - ld a,(_report) +;source-doc/keyboard/kyb-init.c:158: do { + ld a, b + dec a push bc - ld l, c call _keyboard_buf_put pop bc -;source-doc/keyboard/kyb-init.c:166: keyboard_buf_put(report.bModifierKeys, report.keyCode[i-1]); +;source-doc/keyboard/kyb-init.c:159: keyboard_buf_put(i-1); djnz l_keyboard_tick_00103 -;source-doc/keyboard/kyb-init.c:167: } while (--i != 0); +;source-doc/keyboard/kyb-init.c:160: } while (--i != 0); ld de,_previous ld bc,0x0008 ld hl,_report ldir l_keyboard_tick_00112: -;source-doc/keyboard/kyb-init.c:170: } +;source-doc/keyboard/kyb-init.c:163: } ret _keyboard_config: DEFW +0x0000 _buffer: - DEFB +0x00 - DEFB +0x00 + DEFW +0x0000 DEFB 0x00 DEFB 0x00 DEFB 0x00 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 a2005fa6..5da58857 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -9,16 +9,13 @@ #define KEYBOARD_BUFFER_SIZE 8 #define KEYBOARD_BUFFER_SIZE_MASK 7 -typedef struct { - uint8_t modifier_keys; - uint8_t key_code; -} keyboard_event; +typedef uint16_t modifier_and_code_t; static device_config_keyboard *keyboard_config = 0; -static keyboard_event buffer[KEYBOARD_BUFFER_SIZE] = {{0}}; -static uint8_t write_index = 0; -static uint8_t read_index = 0; +static modifier_and_code_t buffer[KEYBOARD_BUFFER_SIZE] = {0}; +static uint8_t write_index = 0; +static uint8_t read_index = 0; static uint8_t alt_write_index = 0; static uint8_t alt_read_index = 0; @@ -77,7 +74,8 @@ static void report_put() { } } -static void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) __sdcccall(1) { +static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { + const uint8_t key_code = report.keyCode[indx]; if (key_code >= 0x80 || key_code == 0) return; // ignore ??? @@ -91,9 +89,8 @@ static void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; if (next_write_index != read_index) { // Check if buffer is not full - buffer[write_index].modifier_keys = modifier_keys; - buffer[write_index].key_code = key_code; - write_index = next_write_index; + buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; + write_index = next_write_index; } } @@ -106,12 +103,8 @@ uint16_t keyboard_buf_size() { else alt_size = KEYBOARD_BUFFER_SIZE - alt_read_index + alt_write_index; - if (alt_size == 0) - queued_report = NULL; - else { - queued_report = &reports[alt_read_index]; + if (alt_size != 0) alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - } if (write_index >= read_index) size = write_index - read_index; @@ -125,8 +118,8 @@ uint32_t keyboard_buf_get_next() { if (write_index == read_index) // Check if buffer is empty return 0x0000FF00; // H = -1, D, E, L = 0 - const uint8_t modifier_key = buffer[read_index].modifier_keys; - const uint8_t key_code = buffer[read_index].key_code; + const uint8_t modifier_key = buffer[read_index] >> 8; + const uint8_t key_code = buffer[read_index] & 255; read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; // D: Modifier keys - aka Keystate @@ -163,7 +156,7 @@ void keyboard_tick(void) { report_put(); uint8_t i = 6; do { - keyboard_buf_put(report.bModifierKeys, report.keyCode[i - 1]); + keyboard_buf_put(i - 1); } while (--i != 0); previous = report; } diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index 82b08ba6..391762d1 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -108,6 +108,16 @@ VEC_CHUKB_TICK: ; See USB HID Usage Tables specification for key codes UKY_STAT: + exx + ld hl, (_alt_read_index) + ld h,0x00 + add hl, hl + add hl, hl + add hl, hl + ld bc,_reports + add hl, bc + push hl ; address of potential que'd next usb report + HB_DI call _keyboard_buf_size HB_EI @@ -116,10 +126,11 @@ UKY_STAT: ex af, af' ld a, b or a + pop iy ; retrieve the next que'd usb_report address jr z, no_queued_reports - ld iy, (_queued_report) + ld a, (iy) - ex af, af' + ex af, af' exx ld b, (iy+2) ld c, (iy+3) @@ -202,3 +213,4 @@ UKY_READ: LD C, L XOR A RET +