diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index bcc038af..34a0654d 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -104,7 +104,7 @@ __chnative_init: call _ch_cmd_reset_all ;source-doc/base-drv/usb-init.c:30: delay_medium(); call _delay_medium -;source-doc/base-drv/usb-init.c:32: if(forced) { +;source-doc/base-drv/usb-init.c:32: if (forced) { bit 0,(ix+4) jr Z,l__chnative_init_00110 ;source-doc/base-drv/usb-init.c:33: bool indicator = true; @@ -112,7 +112,7 @@ __chnative_init: ;source-doc/base-drv/usb-init.c:34: print_string("\r\nCH376: *$"); ld hl,usb_init_str_0 call _print_string -;source-doc/base-drv/usb-init.c:35: while(!ch_probe()) { +;source-doc/base-drv/usb-init.c:35: while (!ch_probe()) { l__chnative_init_00104: call _ch_probe ld a, l @@ -143,30 +143,30 @@ l__chnative_init_00106: call _print_string jr l__chnative_init_00111 l__chnative_init_00110: -;source-doc/base-drv/usb-init.c:48: if (!ch_probe()) { +;source-doc/base-drv/usb-init.c:47: if (!ch_probe()) { call _ch_probe ld a, l or a jr NZ,l__chnative_init_00108 -;source-doc/base-drv/usb-init.c:49: print_string("\r\nCH376: NOT PRESENT$"); +;source-doc/base-drv/usb-init.c:48: print_string("\r\nCH376: NOT PRESENT$"); ld hl,usb_init_str_4 call _print_string -;source-doc/base-drv/usb-init.c:50: return; +;source-doc/base-drv/usb-init.c:49: return; jr l__chnative_init_00118 l__chnative_init_00108: -;source-doc/base-drv/usb-init.c:53: print_string("\r\nCH376: PRESENT (VER $"); +;source-doc/base-drv/usb-init.c:52: print_string("\r\nCH376: PRESENT (VER $"); ld hl,usb_init_str_5 call _print_string l__chnative_init_00111: -;source-doc/base-drv/usb-init.c:56: print_hex(ch_cmd_get_ic_version()); +;source-doc/base-drv/usb-init.c:55: print_hex(ch_cmd_get_ic_version()); call _ch_cmd_get_ic_version call _print_hex -;source-doc/base-drv/usb-init.c:57: print_string("); $"); +;source-doc/base-drv/usb-init.c:56: print_string("); $"); ld hl,usb_init_str_6 call _print_string -;source-doc/base-drv/usb-init.c:59: usb_host_bus_reset(); +;source-doc/base-drv/usb-init.c:58: usb_host_bus_reset(); call _usb_host_bus_reset -;source-doc/base-drv/usb-init.c:61: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { +;source-doc/base-drv/usb-init.c:60: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { ld c,0x00 l__chnative_init_00116: bit 0,(ix+4) @@ -186,31 +186,31 @@ l__chnative_init_00121: xor 0x80 l__chnative_init_00185: jp P, l__chnative_init_00114 -;source-doc/base-drv/usb-init.c:62: const uint8_t r = ch_very_short_wait_int_and_get_(); +;source-doc/base-drv/usb-init.c:61: const uint8_t r = ch_very_short_wait_int_and_get_(); push bc call _ch_very_short_wait_int_and_get ld a, l pop bc -;source-doc/base-drv/usb-init.c:64: if (r == USB_INT_CONNECT) { +;source-doc/base-drv/usb-init.c:63: if (r == USB_INT_CONNECT) { sub 0x81 jr NZ,l__chnative_init_00117 -;source-doc/base-drv/usb-init.c:65: print_string("USB: CONNECTED$"); +;source-doc/base-drv/usb-init.c:64: print_string("USB: CONNECTED$"); ld hl,usb_init_str_7 call _print_string -;source-doc/base-drv/usb-init.c:67: enumerate_all_devices(); +;source-doc/base-drv/usb-init.c:66: enumerate_all_devices(); call _enumerate_all_devices -;source-doc/base-drv/usb-init.c:69: return; +;source-doc/base-drv/usb-init.c:68: return; jr l__chnative_init_00118 l__chnative_init_00117: -;source-doc/base-drv/usb-init.c:61: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { +;source-doc/base-drv/usb-init.c:60: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { inc c jr l__chnative_init_00116 l__chnative_init_00114: -;source-doc/base-drv/usb-init.c:73: print_string("USB: DISCONNECTED$"); +;source-doc/base-drv/usb-init.c:72: print_string("USB: DISCONNECTED$"); ld hl,usb_init_str_8 call _print_string l__chnative_init_00118: -;source-doc/base-drv/usb-init.c:74: } +;source-doc/base-drv/usb-init.c:73: } inc sp pop ix ret @@ -250,29 +250,25 @@ usb_init_str_7: usb_init_str_8: DEFM "USB: DISCONNECTED$" DEFB 0x00 -;source-doc/base-drv/usb-init.c:77: void chnative_init_force(void) { +;source-doc/base-drv/usb-init.c:75: void chnative_init_force(void) { _chnative_init(true); } ; --------------------------------- ; Function chnative_init_force ; --------------------------------- _chnative_init_force: -;source-doc/base-drv/usb-init.c:78: _chnative_init(true); ld a,0x01 push af inc sp call __chnative_init inc sp -;source-doc/base-drv/usb-init.c:79: } ret -;source-doc/base-drv/usb-init.c:81: void chnative_init(void) { +;source-doc/base-drv/usb-init.c:77: void chnative_init(void) { _chnative_init(false); } ; --------------------------------- ; Function chnative_init ; --------------------------------- _chnative_init: -;source-doc/base-drv/usb-init.c:82: _chnative_init(false); xor a push af inc sp call __chnative_init inc sp -;source-doc/base-drv/usb-init.c:83: } ret diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 7419d950..93a3a03b 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -41,6 +41,8 @@ _write_index: DEFS 1 _read_index: DEFS 1 +_previous_keyCodes: + DEFS 6 _active: DEFS 1 _report: @@ -145,7 +147,7 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:47: +;source-doc/keyboard/kyb-init.c:49: ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- @@ -153,24 +155,42 @@ _keyboard_buf_put: push ix ld ix,0 add ix,sp -;source-doc/keyboard/kyb-init.c:48: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { +;source-doc/keyboard/kyb-init.c:50: 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_00106 + jr NC,l_keyboard_buf_put_00112 ld a,(ix+5) or a -;source-doc/keyboard/kyb-init.c:49: if (key_code >= 0x80 || key_code == 0) - jr Z,l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:51: +;source-doc/keyboard/kyb-init.c:51: if (key_code >= 0x80 || key_code == 0) +;source-doc/keyboard/kyb-init.c:54: // 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:55: for (uint8_t i = 0; i < 6; i++) + ld b,0x00 + ld hl,_previous_keyCodes + add hl, bc + ld a,(ix+5) + sub (hl) +;source-doc/keyboard/kyb-init.c:56: if (previous_keyCodes[i] == key_code) + jr Z,l_keyboard_buf_put_00112 +;source-doc/keyboard/kyb-init.c:54: // 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:58: ld a,(_write_index) inc a and 0x07 ld c, a -;source-doc/keyboard/kyb-init.c:52: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb-init.c:59: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_read_index) sub c - jr Z,l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:53: if (next_write_index != read_index) { // Check if buffer is not full + jr Z,l_keyboard_buf_put_00112 +;source-doc/keyboard/kyb-init.c:60: if (next_write_index != read_index) { // Check if buffer is not full ld de,_buffer+0 ld hl,(_write_index) ld h,0x00 @@ -178,7 +198,7 @@ _keyboard_buf_put: add hl, de ld a,(ix+4) ld (hl), a -;source-doc/keyboard/kyb-init.c:54: buffer[write_index].modifier_keys = modifier_keys; +;source-doc/keyboard/kyb-init.c:61: buffer[write_index].modifier_keys = modifier_keys; ld hl,(_write_index) ld h,0x00 add hl, hl @@ -187,30 +207,30 @@ _keyboard_buf_put: inc de ld a,(ix+5) ld (de), a -;source-doc/keyboard/kyb-init.c:55: buffer[write_index].key_code = key_code; +;source-doc/keyboard/kyb-init.c:62: buffer[write_index].key_code = key_code; ld hl,_write_index ld (hl), c -l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb-init.c:57: } +l_keyboard_buf_put_00112: +;source-doc/keyboard/kyb-init.c:64: } pop ix ret -;source-doc/keyboard/kyb-init.c:59: +;source-doc/keyboard/kyb-init.c:66: ; --------------------------------- ; Function keyboard_buf_size ; --------------------------------- _keyboard_buf_size: -;source-doc/keyboard/kyb-init.c:60: uint8_t keyboard_buf_size() __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:67: 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:61: if (write_index >= read_index) +;source-doc/keyboard/kyb-init.c:68: 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:63: +;source-doc/keyboard/kyb-init.c:70: ld hl,_read_index ld c, (hl) ld a,0x08 @@ -219,9 +239,9 @@ l_keyboard_buf_size_00102: ld c, (hl) add a, c l_keyboard_buf_size_00103: -;source-doc/keyboard/kyb-init.c:64: return KEYBOARD_BUFFER_SIZE - read_index + write_index; +;source-doc/keyboard/kyb-init.c:71: return KEYBOARD_BUFFER_SIZE - read_index + write_index; ret -;source-doc/keyboard/kyb-init.c:66: +;source-doc/keyboard/kyb-init.c:73: ; --------------------------------- ; Function keyboard_buf_get_next ; --------------------------------- @@ -231,41 +251,41 @@ _keyboard_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/kyb-init.c:67: uint32_t keyboard_buf_get_next() { +;source-doc/keyboard/kyb-init.c:74: 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:68: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb-init.c:75: 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_00103 l_keyboard_buf_get_next_00102: -;source-doc/keyboard/kyb-init.c:70: +;source-doc/keyboard/kyb-init.c:77: 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:71: const uint8_t modifier_key = buffer[read_index].modifier_keys; +;source-doc/keyboard/kyb-init.c:78: const uint8_t modifier_key = buffer[read_index].modifier_keys; inc hl ld c, (hl) -;source-doc/keyboard/kyb-init.c:72: const uint8_t key_code = buffer[read_index].key_code; +;source-doc/keyboard/kyb-init.c:79: const uint8_t key_code = buffer[read_index].key_code; ld hl,_read_index ld a, (hl) inc a and 0x07 ld (hl), a -;source-doc/keyboard/kyb-init.c:73: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb-init.c:80: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb-init.c:75: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb-init.c:82: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -282,34 +302,34 @@ l_keyboard_buf_get_next_00102: pop hl push hl l_keyboard_buf_get_next_00103: -;source-doc/keyboard/kyb-init.c:76: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +;source-doc/keyboard/kyb-init.c:83: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; ld sp, ix pop ix ret -;source-doc/keyboard/kyb-init.c:78: +;source-doc/keyboard/kyb-init.c:85: ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:79: void keyboard_buf_flush() { +;source-doc/keyboard/kyb-init.c:86: void keyboard_buf_flush() { ld hl,_write_index ld (hl),0x00 -;source-doc/keyboard/kyb-init.c:80: write_index = 0; +;source-doc/keyboard/kyb-init.c:87: write_index = 0; ld hl,_read_index ld (hl),0x00 -;source-doc/keyboard/kyb-init.c:81: read_index = 0; +;source-doc/keyboard/kyb-init.c:88: read_index = 0; ret -;source-doc/keyboard/kyb-init.c:87: +;source-doc/keyboard/kyb-init.c:94: ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/kyb-init.c:88: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:95: void keyboard_tick(void) { ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb-init.c:89: if (is_in_critical_section()) - ret NZ +;source-doc/keyboard/kyb-init.c:96: if (is_in_critical_section()) + jr NZ,l_keyboard_tick_00111 ;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b call _ch_command @@ -321,8 +341,8 @@ _keyboard_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c),a -;source-doc/keyboard/kyb-init.c:92: ch_configure_nak_retry_disable(); - ld bc,_report +;source-doc/keyboard/kyb-init.c:99: ch_configure_nak_retry_disable(); + ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 push af @@ -346,20 +366,47 @@ _keyboard_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c),a -;source-doc/keyboard/kyb-init.c:94: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb-init.c:101: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) +;source-doc/keyboard/kyb-init.c:102: if (result == 0) or a - ret NZ -;source-doc/keyboard/kyb-init.c:95: if (result == 0) - ld a, (_report + 2) + 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:103: 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 c, (hl) + ld b, (hl) + push bc + push de + ld c,b ld b,a push bc call _keyboard_buf_put pop af -;source-doc/keyboard/kyb-init.c:96: keyboard_buf_put(report.bModifierKeys, report.keyCode[0]); + pop de + pop bc +;source-doc/keyboard/kyb-init.c:104: 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:102: if (result == 0) + inc c + jr l_keyboard_tick_00109 +l_keyboard_tick_00111: +;source-doc/keyboard/kyb-init.c:106: } ret _keyboard_config: DEFW +0x0000 @@ -384,6 +431,13 @@ _write_index: DEFB +0x00 _read_index: DEFB +0x00 +_previous_keyCodes: + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 _active: DEFB +0x00 _report: diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h index 6a29097f..cd7eaa75 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h @@ -37,7 +37,7 @@ typedef struct { typedef struct { COMMON_DEVICE_CONFIG // bytes: 0-2 - endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt + endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt uint32_t current_lba; // bytes 12-15 uint8_t drive_index; // byte 16 } device_config_storage; 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 cb5b4de7..0b599779 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -45,10 +45,17 @@ keyboard_event buffer[KEYBOARD_BUFFER_SIZE] = {{0}}; uint8_t write_index = 0; uint8_t read_index = 0; +uint8_t previous_keyCodes[6] = {0}; + void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { 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) + return; + 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; @@ -93,5 +100,8 @@ void keyboard_tick(void) { result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8); ch_configure_nak_retry_3s(); if (result == 0) - keyboard_buf_put(report.bModifierKeys, report.keyCode[0]); + for (uint8_t i = 0; i < 6; i++) { + keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); + previous_keyCodes[i] = report.keyCode[i]; + } } diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index b1e917e1..b6f3af6c 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -16,12 +16,8 @@ #include "./ch376-native/keyboard.s" -; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 3RD INTERRUPT (3/60)) -SCAN_INT_PERIOD: .EQU 3 - -; VDP-INTERUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE -; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD -UKY_SCNCNT: .DB SCAN_INT_PERIOD +; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 2ND INTERRUPT (2/60)) +SCAN_INT_PERIOD: .EQU 2 .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 @@ -52,10 +48,11 @@ CHUKB_INIT: JP _keyboard_init CHUKB_TICK: - LD A, (UKY_SCNCNT) ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. + LD A, SCAN_INT_PERIOD ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. +UKY_SCNCNT .EQU $ - 1 DEC A LD (UKY_SCNCNT), A - JR NZ, VEC_CHUKB_TICK + JP NZ, HB_TICK LD A, SCAN_INT_PERIOD LD (UKY_SCNCNT), A