diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 0c1f1012..528450d8 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -41,12 +41,18 @@ _write_index: DEFS 1 _read_index: DEFS 1 -_previous_keyCodes: - DEFS 6 -_active: +_alt_write_index: DEFS 1 +_alt_read_index: + DEFS 1 +_reports: + DEFS 64 +_queued_report: + DEFS 2 _report: DEFS 8 +_previous: + DEFS 8 #ENDIF @@ -62,80 +68,80 @@ _report: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:12: uint8_t keyboard_init(void) __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:30: ; --------------------------------- ; Function keyboard_init ; --------------------------------- _keyboard_init: -;source-doc/keyboard/kyb-init.c:14: uint8_t index = 1; +;source-doc/keyboard/kyb-init.c:31: uint8_t keyboard_init(void) __sdcccall(1) { ld c,0x01 -;source-doc/keyboard/kyb-init.c:15: keyboard_config = NULL; +;source-doc/keyboard/kyb-init.c:32: uint8_t index = 1; ld hl,0x0000 ld (_keyboard_config),hl -;source-doc/keyboard/kyb-init.c:17: do { +;source-doc/keyboard/kyb-init.c:34: ld b,0x01 l_keyboard_init_00105: -;source-doc/keyboard/kyb-init.c:18: keyboard_config = (device_config_keyboard *)get_usb_device_config(index); +;source-doc/keyboard/kyb-init.c:35: 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:20: if (keyboard_config == NULL) +;source-doc/keyboard/kyb-init.c:37: ld hl,(_keyboard_config) ld a,h or l jr Z,l_keyboard_init_00107 -;source-doc/keyboard/kyb-init.c:23: const usb_device_type t = keyboard_config->type; +;source-doc/keyboard/kyb-init.c:40: ld hl, (_keyboard_config) ld a, (hl) and 0x0f -;source-doc/keyboard/kyb-init.c:25: if (t == USB_IS_KEYBOARD) { +;source-doc/keyboard/kyb-init.c:42: sub 0x04 jr NZ,l_keyboard_init_00106 -;source-doc/keyboard/kyb-init.c:26: print_string("\r\nUSB: KEYBOARD @ $"); +;source-doc/keyboard/kyb-init.c:43: if (t == USB_IS_KEYBOARD) { push bc ld hl,kyb_init_str_0 call _print_string pop bc -;source-doc/keyboard/kyb-init.c:27: print_uint16(index); +;source-doc/keyboard/kyb-init.c:44: print_string("\r\nUSB: KEYBOARD @ $"); ld h,0x00 ld l, c call _print_uint16 -;source-doc/keyboard/kyb-init.c:28: print_string(" $"); +;source-doc/keyboard/kyb-init.c:45: print_uint16(index); ld hl,kyb_init_str_1 call _print_string -;source-doc/keyboard/kyb-init.c:30: hid_set_protocol(keyboard_config, 1); +;source-doc/keyboard/kyb-init.c:47: ld a,0x01 push af inc sp ld hl, (_keyboard_config) call _hid_set_protocol -;source-doc/keyboard/kyb-init.c:31: hid_set_idle(keyboard_config, 0x80); +;source-doc/keyboard/kyb-init.c:48: 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:32: return 1; +;source-doc/keyboard/kyb-init.c:49: hid_set_idle(keyboard_config, 0x80); 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); +;source-doc/keyboard/kyb-init.c:51: } 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:36: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/kyb-init.c:53: ld hl,kyb_init_str_2 call _print_string -;source-doc/keyboard/kyb-init.c:37: return 0; +;source-doc/keyboard/kyb-init.c:54: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); xor a l_keyboard_init_00108: -;source-doc/keyboard/kyb-init.c:38: } +;source-doc/keyboard/kyb-init.c:55: return 0; ret kyb_init_str_0: DEFB 0x0d @@ -150,98 +156,206 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:51: +;source-doc/keyboard/kyb-init.c:57: +; --------------------------------- +; Function report_diff +; --------------------------------- +_report_diff: +;source-doc/keyboard/kyb-init.c:58: 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); + ld b,0x08 + ld hl,_previous +l_report_diff_00103: +;source-doc/keyboard/kyb-init.c:63: 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++) + ld a,0x01 + jr l_report_diff_00106 +l_report_diff_00104: +;source-doc/keyboard/kyb-init.c:65: return true; + djnz l_report_diff_00103 +;source-doc/keyboard/kyb-init.c:67: + xor a +l_report_diff_00106: +;source-doc/keyboard/kyb-init.c:68: return false; + ret +;source-doc/keyboard/kyb-init.c:70: +; --------------------------------- +; Function report_put +; --------------------------------- +_report_put: +;source-doc/keyboard/kyb-init.c:71: static void report_put() { + ld a, (_alt_write_index) + inc a + and 0x07 + ld c, a +;source-doc/keyboard/kyb-init.c:73: + 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 + ld de,_reports+0 + ld hl, (_alt_write_index) + ld h,0x00 + add hl, hl + add hl, hl + add hl, hl + add hl, de + ex de, hl + push bc + ld bc,0x0008 + ld hl,_report + ldir + pop bc +;source-doc/keyboard/kyb-init.c:75: reports[alt_write_index] = report; + ld hl,_alt_write_index + ld (hl), c +;source-doc/keyboard/kyb-init.c:77: } + ret +;source-doc/keyboard/kyb-init.c:79: ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- _keyboard_buf_put: - push ix - ld ix,0 - add ix,sp -;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) + 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 + cp 0x80 + jr NC,l_keyboard_buf_put_00111 or a -;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: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:58: if (previous_keyCodes[i] == key_code) - jr Z,l_keyboard_buf_put_00112 -;source-doc/keyboard/kyb-init.c:56: // if already reported, just skip it - inc c - jr l_keyboard_buf_put_00110 +;source-doc/keyboard/kyb-init.c:81: 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; + ld b,0x06 + ld hl,+(_previous + 2) l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb-init.c:60: +;source-doc/keyboard/kyb-init.c:87: do { + ld a, (hl) + inc hl + sub e +;source-doc/keyboard/kyb-init.c:88: if (*a++ == key_code) + ret Z +;source-doc/keyboard/kyb-init.c:89: return; + djnz l_keyboard_buf_put_00106 +;source-doc/keyboard/kyb-init.c:91: ld a, (_write_index) inc a and 0x07 - ld c, a -;source-doc/keyboard/kyb-init.c:61: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + ld d, a +;source-doc/keyboard/kyb-init.c:92: 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:62: if (next_write_index != read_index) { // Check if buffer is not full - ld de,_buffer+0 + sub d + 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 - add hl, de - ld a,(ix+4) - ld (hl), a -;source-doc/keyboard/kyb-init.c:63: buffer[write_index].modifier_keys = modifier_keys; + 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; ld hl, (_write_index) ld h,0x00 add hl, hl - add hl, de + ld bc,_buffer + add hl, bc inc hl - ld a,(ix+5) - ld (hl), a -;source-doc/keyboard/kyb-init.c:64: buffer[write_index].key_code = key_code; + ld (hl), e +;source-doc/keyboard/kyb-init.c:95: 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:66: } - pop ix + ld (hl), d +l_keyboard_buf_put_00111: +;source-doc/keyboard/kyb-init.c:97: } ret -;source-doc/keyboard/kyb-init.c:68: +;source-doc/keyboard/kyb-init.c:99: ; --------------------------------- ; Function keyboard_buf_size ; --------------------------------- _keyboard_buf_size: -;source-doc/keyboard/kyb-init.c:69: uint8_t keyboard_buf_size() __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:103: + 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) + 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 + ld hl, (_alt_read_index) + ld a,0x08 + sub l + ld hl, (_alt_write_index) + add a, l + ld d, a +l_keyboard_buf_size_00103: +;source-doc/keyboard/kyb-init.c:108: + 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]; + 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: ld a,(_write_index) ld hl,_read_index sub (hl) - jr C,l_keyboard_buf_size_00102 -;source-doc/keyboard/kyb-init.c:70: if (write_index >= read_index) + jr C,l_keyboard_buf_size_00108 +;source-doc/keyboard/kyb-init.c:116: 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:72: + ld e, a + jr l_keyboard_buf_size_00109 +l_keyboard_buf_size_00108: +;source-doc/keyboard/kyb-init.c:118: else 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:73: return KEYBOARD_BUFFER_SIZE - read_index + write_index; + ld e, a +l_keyboard_buf_size_00109: +;source-doc/keyboard/kyb-init.c:120: + xor a + xor a + ex de, hl +;source-doc/keyboard/kyb-init.c:121: return (uint16_t)alt_size << 8 | (uint16_t)size; ret -;source-doc/keyboard/kyb-init.c:75: +;source-doc/keyboard/kyb-init.c:123: ; --------------------------------- ; Function keyboard_buf_get_next ; --------------------------------- @@ -251,40 +365,40 @@ _keyboard_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/kyb-init.c:76: uint32_t keyboard_buf_get_next() { +;source-doc/keyboard/kyb-init.c:124: 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:77: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb-init.c:125: 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:79: +;source-doc/keyboard/kyb-init.c:127: 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:80: const uint8_t modifier_key = buffer[read_index].modifier_keys; +;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:81: const uint8_t key_code = buffer[read_index].key_code; +;source-doc/keyboard/kyb-init.c:129: 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:93: +;source-doc/keyboard/kyb-init.c:136: push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb-init.c:95: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb-init.c:138: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -301,33 +415,51 @@ l_keyboard_buf_get_next_00102: pop hl push hl l_keyboard_buf_get_next_00103: -;source-doc/keyboard/kyb-init.c:96: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +;source-doc/keyboard/kyb-init.c:139: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; ld sp, ix pop ix ret -;source-doc/keyboard/kyb-init.c:98: +;source-doc/keyboard/kyb-init.c:141: ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:99: void keyboard_buf_flush() { -;source-doc/keyboard/kyb-init.c:100: write_index = 0; +;source-doc/keyboard/kyb-init.c:142: void keyboard_buf_flush() { + xor a + ld (_alt_read_index),a + ld (_alt_write_index),a xor a - ld (_write_index),a ld (_read_index),a -;source-doc/keyboard/kyb-init.c:101: read_index = 0; + ld (_write_index),a +;source-doc/keyboard/kyb-init.c:145: 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; + ld b,0x08 + ld hl,_report +l_keyboard_buf_flush_00101: +;source-doc/keyboard/kyb-init.c:148: do { + xor a + ld (de), a + inc de +;source-doc/keyboard/kyb-init.c:149: *a++ = 0; + ld (hl),0x00 + inc hl +;source-doc/keyboard/kyb-init.c:150: *b++ = 0; + djnz l_keyboard_buf_flush_00101 +;source-doc/keyboard/kyb-init.c:151: } while (--i != 0); ret -;source-doc/keyboard/kyb-init.c:107: +;source-doc/keyboard/kyb-init.c:153: ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/kyb-init.c:108: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:154: void keyboard_tick(void) { ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb-init.c:109: if (is_in_critical_section()) - jr NZ,l_keyboard_tick_00111 +;source-doc/keyboard/kyb-init.c:155: if (is_in_critical_section()) + jr NZ,l_keyboard_tick_00112 ;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b call _ch_command @@ -339,7 +471,8 @@ _keyboard_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a - ld bc,_report +;source-doc/keyboard/kyb-init.c:158: ch_configure_nak_retry_disable(); + ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 push af @@ -363,47 +496,41 @@ _keyboard_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:114: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb-init.c:160: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) -;source-doc/keyboard/kyb-init.c:115: if (result == 0) or a - jr NZ,l_keyboard_tick_00111 - ld c,a -l_keyboard_tick_00109: - ld a, c - sub 0x06 - ret NC -;source-doc/keyboard/kyb-init.c:116: for (uint8_t i = 0; i < 6; i++) { - ld a,+((_report+2) & 0xFF) - add a, c - ld e, a - ld a,+((_report+2) / 256) - adc a,0x00 - ld d, a - ld a, (de) - ld hl,_report - ld b, (hl) - push bc - push de - ld c,b - ld b,a + jr NZ,l_keyboard_tick_00112 +;source-doc/keyboard/kyb-init.c:161: if (result == 0) { + call _report_diff + or a + jr Z,l_keyboard_tick_00112 +;source-doc/keyboard/kyb-init.c:162: if (report_diff()) { + call _report_put +;source-doc/keyboard/kyb-init.c:164: 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) push bc + ld l, c call _keyboard_buf_put - pop af - pop de pop bc -;source-doc/keyboard/kyb-init.c:117: 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:115: if (result == 0) - inc c - jr l_keyboard_tick_00109 -l_keyboard_tick_00111: -;source-doc/keyboard/kyb-init.c:119: } +;source-doc/keyboard/kyb-init.c:166: keyboard_buf_put(report.bModifierKeys, report.keyCode[i-1]); + djnz l_keyboard_tick_00103 +;source-doc/keyboard/kyb-init.c:167: } while (--i != 0); + ld de,_previous + ld bc,0x0008 + ld hl,_report + ldir +l_keyboard_tick_00112: +;source-doc/keyboard/kyb-init.c:170: } ret _keyboard_config: DEFW +0x0000 @@ -428,15 +555,77 @@ _write_index: DEFB +0x00 _read_index: DEFB +0x00 -_previous_keyCodes: +_alt_write_index: + DEFB +0x00 +_alt_read_index: + DEFB +0x00 +_reports: + DEFB +0x00 DEFB +0x00 DEFB 0x00 DEFB 0x00 DEFB 0x00 DEFB 0x00 DEFB 0x00 -_active: - DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 +_queued_report: + DEFW +0x0000 _report: DEFB +0x00 DEFB +0x00 @@ -446,3 +635,12 @@ _report: DEFB 0x00 DEFB 0x00 DEFB 0x00 +_previous: + DEFB +0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh index 3403b826..5bcd0523 100755 --- a/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh +++ b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh @@ -35,6 +35,8 @@ sed -E \ -e 's/\s+or\s+a,(0x[0-9A-Fa-f]{2})/\tor\t\1/g' \ -e 's/\s+xor\s+a,(0x[0-9A-Fa-f]{2})/\txor\t\1/g' \ -e 's/\s+and\s+a,(0x[0-9A-Fa-f]{2})/\tand\t\1/g' \ + -e 's/\s+and\s+a,\s*a/\tand\ta/g' \ + -e 's/\s+and\s+a,\s*(b|c|d|e|h|l|iyl|iyh|ixl|ixh)/\tand\t\1/g' \ -e 's/\s+sub\s+a,(0x[0-9A-Fa-f]{2})/\tsub\t\1/g' \ -e 's/\s+cp\s+a,\s*a/\tcp\ta/g' \ -e 's/\s+or\s+a,\s*a/\tor\ta/g' \ diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h index 8d179f4f..1edf527f 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h @@ -7,7 +7,7 @@ typedef struct { uint8_t bModifierKeys; uint8_t bReserved; uint8_t keyCode[6]; -} keyboard_report; +} keyboard_report_t; #define KEY_MOD_LCTRL 0x01 #define KEY_MOD_LSHIFT 0x02 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 9b566097..a2005fa6 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -4,13 +4,31 @@ #include #include #include +#include #include +#define KEYBOARD_BUFFER_SIZE 8 +#define KEYBOARD_BUFFER_SIZE_MASK 7 +typedef struct { + uint8_t modifier_keys; + uint8_t key_code; +} keyboard_event; + static device_config_keyboard *keyboard_config = 0; -extern bool caps_lock_engaged; -uint8_t keyboard_init(void) __sdcccall(1) { +static keyboard_event 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; +static keyboard_report_t reports[KEYBOARD_BUFFER_SIZE] = {{0}}; +static keyboard_report_t *queued_report = NULL; +static keyboard_report_t report = {0}; +static keyboard_report_t previous = {0}; + +uint8_t keyboard_init(void) __sdcccall(1) { uint8_t index = 1; keyboard_config = NULL; @@ -37,26 +55,39 @@ uint8_t keyboard_init(void) __sdcccall(1) { return 0; } -#define KEYBOARD_BUFFER_SIZE 8 -#define KEYBOARD_BUFFER_SIZE_MASK 7 -typedef struct { - uint8_t modifier_keys; - uint8_t key_code; -} keyboard_event; -keyboard_event buffer[KEYBOARD_BUFFER_SIZE] = {{0}}; -uint8_t write_index = 0; -uint8_t read_index = 0; +static uint8_t report_diff() __sdcccall(1) { + uint8_t *a = (uint8_t *)&report; + uint8_t *b = (uint8_t *)&previous; -uint8_t previous_keyCodes[6] = {0}; + uint8_t i = sizeof(report); + do { + if (*a++ != *b++) + return true; + } while (--i != 0); -void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { + return false; +} + +static void report_put() { + uint8_t next_write_index = (alt_write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + + if (next_write_index != alt_read_index) { // Check if buffer is not full + reports[alt_write_index] = report; + alt_write_index = next_write_index; + } +} + +static void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) __sdcccall(1) { if (key_code >= 0x80 || key_code == 0) return; // ignore ??? // if already reported, just skip it - for (uint8_t i = 0; i < 6; i++) - if (previous_keyCodes[i] == key_code) + uint8_t i = 6; + uint8_t *a = previous.keyCode; + do { + if (*a++ == key_code) return; + } while (--i != 0); uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; if (next_write_index != read_index) { // Check if buffer is not full @@ -66,30 +97,42 @@ void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { } } -uint8_t keyboard_buf_size() __sdcccall(1) { +uint16_t keyboard_buf_size() { + uint8_t size; + uint8_t alt_size; + + if (alt_write_index >= alt_read_index) + alt_size = alt_write_index - alt_read_index; + 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]; + alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + } + if (write_index >= read_index) - return write_index - read_index; + size = write_index - read_index; + else + size = KEYBOARD_BUFFER_SIZE - read_index + write_index; - return KEYBOARD_BUFFER_SIZE - read_index + write_index; + return (uint16_t)alt_size << 8 | (uint16_t)size; } uint32_t keyboard_buf_get_next() { if (write_index == read_index) // Check if buffer is empty - return 0x0000FF00; // H = -1, D, E, L = 0 + 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; read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - //D: Modifier keys - aka Keystate - //E: ASCII Code - //H: 0 - //L: KeyCode aka scan code - - // if (key_code == KEY_CODE_CAPS_LOCK) { - // caps_lock_engaged = !caps_lock_engaged; - // return keyboard_buf_get_next(); - // } + // D: Modifier keys - aka Keystate + // E: ASCII Code + // H: 0 + // L: KeyCode aka scan code const unsigned char c = scancode_to_char(modifier_key, key_code); /* D = modifier, e-> char, H = 0, L=>code */ @@ -97,24 +140,32 @@ uint32_t keyboard_buf_get_next() { } void keyboard_buf_flush() { - write_index = 0; - read_index = 0; -} + write_index = read_index = alt_write_index = alt_read_index = 0; -uint8_t active = 0; - -keyboard_report report = {0}; + uint8_t i = sizeof(previous); + uint8_t *a = (uint8_t *)previous; + uint8_t *b = (uint8_t *)report; + do { + *a++ = 0; + *b++ = 0; + } while (--i != 0); +} void keyboard_tick(void) { if (is_in_critical_section()) return; ch_configure_nak_retry_disable(); - result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8); + result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)&report, 8); ch_configure_nak_retry_3s(); - if (result == 0) - for (uint8_t i = 0; i < 6; i++) { - keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); - previous_keyCodes[i] = report.keyCode[i]; + if (result == 0) { + if (report_diff()) { + report_put(); + uint8_t i = 6; + do { + keyboard_buf_put(report.bModifierKeys, report.keyCode[i - 1]); + } while (--i != 0); + previous = report; } + } } diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index b7059445..82b08ba6 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -84,8 +84,9 @@ VEC_CHUKB_TICK: ; ; Outputs: ; A: Status / Codes Pending -; A': Current Modifier Key State -; B, C, D, E, H, L: Up to 6 active key codes +; B: Number of buffered usb reports +; A': USB Report Modifier Key State (valid if B > 0) +; B', C', D', E', H', L': USB Report's 6 key codes (valid only if B > 0) ; ; Return a count of the number of key Codes Pending (A) in the keyboard buffer. ; If it is not possible to determine the actual number in the buffer, it is @@ -96,28 +97,48 @@ VEC_CHUKB_TICK: ; (error) code. Otherwise, the return value represents the number of key codes ; pending. ; -; USB Extension -; Returns the most current USB Key Report -; (See https://wiki.osdev.org/USB_Human_Interface_Devices). -; The report indicates the current keyboard state, irrespective of the -; character queue. -; The A' register contains the current modifier key state -; The B, C, D, E, H, L contain the 0 to 6 USB scancodes. -; +; USB Keyboard Extension: +; Returns the current USB HID keyboard report data. +; Register B contains the number of buffered reports available: +; B = 0: No reports available +; B > 0: At least one report available (will be consumed after reading) +; When a report is available (B > 0): +; A': Contains modifier key states +; B',C',D',E',H',L': Contains up to 6 concurrent key codes +; See USB HID Usage Tables specification for key codes + UKY_STAT: HB_DI call _keyboard_buf_size HB_EI - ld iy, _report + ld a, l + ld b, h ex af, af' + ld a, b + or a + jr z, no_queued_reports + ld iy, (_queued_report) ld a, (iy) ex af, af' + exx ld b, (iy+2) ld c, (iy+3) ld d, (iy+4) ld e, (iy+5) ld h, (iy+6) ld l, (iy+7) + exx + ret + +no_queued_reports: + ex af, af' + exx + ld bc, 0 + ld d, b + ld e, b + ld l, b + ld h, b + exx ret ; ### Function 0x4D -- Video Keyboard Flush (VDAKFL) @@ -169,7 +190,7 @@ UKY_FLUSH: ; 0 Shift key was held down ; ; The Keycode (E) is generally returned as appropriate ASCII values, if possible. Special keys, like -; function keys and arrows, are returned as reserved codes as described at the start of this section. +; function keys and arrows, are returned as reserved codes. ; UKY_READ: HB_DI