From 253b92377dec98cf066e1ca74afaebbeb1980272 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 23 Apr 2025 14:53:15 +1000 Subject: [PATCH] ch376-native: reverted usb keyboard extensions --- Source/HBIOS/Config/RCEZ80_std.asm | 6 +- Source/HBIOS/ch376-native/keyboard.s | 3 - .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 43 +-- .../ch376-native/keyboard/kyb_driver.c.s | 338 +++++------------- .../source-doc/keyboard/kyb-init.c | 1 + .../source-doc/keyboard/kyb_driver.asm | 74 ---- .../source-doc/keyboard/kyb_driver.c | 48 +-- .../source-doc/keyboard/kyb_driver.h | 8 +- Source/HBIOS/ch376kyb.asm | 17 +- 9 files changed, 119 insertions(+), 419 deletions(-) delete mode 100644 Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index a25e59d4..7bf35783 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -55,7 +55,7 @@ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ;; TMSENABLE .SET TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .SET TMSMODE_MSX ;UKY ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] +TMSMODE .SET TMSMODE_MSXUKY ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] TMS80COLS .SET TRUE ; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958 TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -88,8 +88,8 @@ CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED -CHSCSIENABLE .SET FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) +CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) -CHNATIVEEZ80 .SET TRUE +CHNATIVEEZ80 .SET FALSE EZ80TIMER .SET EZ80TMR_INT ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/ch376-native/keyboard.s b/Source/HBIOS/ch376-native/keyboard.s index 345b8994..221b24c7 100644 --- a/Source/HBIOS/ch376-native/keyboard.s +++ b/Source/HBIOS/ch376-native/keyboard.s @@ -9,6 +9,3 @@ #IF (!CHNATIVEEZ80) #include "ch376-native/keyboard/kyb_driver.c.s" #ENDIF -#IF (!CHNATIVEEZ80) -#include "ch376-native/source-doc/keyboard/kyb_driver.asm" -#ENDIF diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 29ff5fa0..df53d3e5 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:6: uint8_t keyboard_init(void) __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:6: void keyboard_init(void) __sdcccall(1) { ; --------------------------------- ; Function keyboard_init ; --------------------------------- @@ -57,59 +57,44 @@ _keyboard_init: ld ix,0 add ix,sp dec sp -;source-doc/keyboard/kyb-init.c:7: uint8_t index = 1; ;source-doc/keyboard/kyb-init.c:9: do { - ld c,0x01 - ld (ix-1),c + ld (ix-1),0x01 l_keyboard_init_00103: ;source-doc/keyboard/kyb-init.c:10: usb_device_type t = usb_get_device_type(index); - ld e, c - ld d,0x00 - push bc - push de - push de + ld l,(ix-1) + ld h,0x00 + push hl + push hl call _usb_get_device_type pop af ld a, l - pop de - pop bc + pop hl ;source-doc/keyboard/kyb-init.c:12: if (t == USB_IS_KEYBOARD) { sub 0x04 jr NZ,l_keyboard_init_00104 ;source-doc/keyboard/kyb-init.c:13: print_string("\r\nUSB: KEYBOARD @ $"); - push de + push hl ld hl,kyb_init_str_0 call _print_string - pop de + pop hl ;source-doc/keyboard/kyb-init.c:14: print_uint16(index); - ex de, hl call _print_uint16 ;source-doc/keyboard/kyb-init.c:15: print_string(" $"); ld hl,kyb_init_str_1 call _print_string ;source-doc/keyboard/kyb-init.c:17: usb_kyb_init(index); ld a,(ix-1) - push af - inc sp call _usb_kyb_init - inc sp -;source-doc/keyboard/kyb-init.c:18: return 1; - ld a,0x01 - jr l_keyboard_init_00106 l_keyboard_init_00104: -;source-doc/keyboard/kyb-init.c:20: } while (++index != MAX_NUMBER_OF_DEVICES + 1); - inc c - ld (ix-1),c - ld a, c +;source-doc/keyboard/kyb-init.c:19: } while (++index != MAX_NUMBER_OF_DEVICES + 1); + inc (ix-1) + ld a,(ix-1) sub 0x07 jr NZ,l_keyboard_init_00103 -;source-doc/keyboard/kyb-init.c:22: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/kyb-init.c:21: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); ld hl,kyb_init_str_2 call _print_string -;source-doc/keyboard/kyb-init.c:23: return 0; - xor a -l_keyboard_init_00106: -;source-doc/keyboard/kyb-init.c:24: } +;source-doc/keyboard/kyb-init.c:22: } inc sp pop ix ret diff --git a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s index ded935b2..170f046e 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s @@ -41,14 +41,6 @@ _write_index: DEFS 1 _read_index: DEFS 1 -_alt_write_index: - DEFS 1 -_alt_read_index: - DEFS 1 -_reports: - DEFS 64 -_queued_report: - DEFS 2 _report: DEFS 8 _previous: @@ -68,110 +60,77 @@ _previous: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb_driver.c:28: #define EI __asm__("EI") +;source-doc/keyboard/kyb_driver.c:23: #define EI __asm__("EI") ; --------------------------------- ; Function report_diff ; --------------------------------- _report_diff: -;source-doc/keyboard/kyb_driver.c:29: +;source-doc/keyboard/kyb_driver.c:24: ld de,_report+0 -;source-doc/keyboard/kyb_driver.c:30: static uint8_t report_diff() __sdcccall(1) { -;source-doc/keyboard/kyb_driver.c:33: +;source-doc/keyboard/kyb_driver.c:25: static uint8_t report_diff() __sdcccall(1) { +;source-doc/keyboard/kyb_driver.c:28: ld b,0x08 ld hl,_previous l_report_diff_00103: -;source-doc/keyboard/kyb_driver.c:34: uint8_t i = sizeof(report); +;source-doc/keyboard/kyb_driver.c:29: uint8_t i = sizeof(report); ld a, (de) inc de ld c, (hl) inc hl sub c jr Z,l_report_diff_00104 -;source-doc/keyboard/kyb_driver.c:35: do { +;source-doc/keyboard/kyb_driver.c:30: do { ld a,0x01 jr l_report_diff_00106 l_report_diff_00104: -;source-doc/keyboard/kyb_driver.c:36: if (*a++ != *b++) +;source-doc/keyboard/kyb_driver.c:31: if (*a++ != *b++) djnz l_report_diff_00103 -;source-doc/keyboard/kyb_driver.c:38: } while (--i != 0); +;source-doc/keyboard/kyb_driver.c:33: } while (--i != 0); xor a l_report_diff_00106: -;source-doc/keyboard/kyb_driver.c:39: +;source-doc/keyboard/kyb_driver.c:34: ret -;source-doc/keyboard/kyb_driver.c:41: } -; --------------------------------- -; Function report_put -; --------------------------------- -_report_put: -;source-doc/keyboard/kyb_driver.c:42: - ld a, (_alt_write_index) - inc a - and 0x07 - ld c, a -;source-doc/keyboard/kyb_driver.c:44: uint8_t next_write_index = (alt_write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - ld a,(_alt_read_index) - sub c - ret Z -;source-doc/keyboard/kyb_driver.c:45: - 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_driver.c:46: if (next_write_index != alt_read_index) { // Check if buffer is not full - ld hl,_alt_write_index - ld (hl), c -;source-doc/keyboard/kyb_driver.c:48: alt_write_index = next_write_index; - ret -;source-doc/keyboard/kyb_driver.c:50: } +;source-doc/keyboard/kyb_driver.c:36: } ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- _keyboard_buf_put: ld c, a -;source-doc/keyboard/kyb_driver.c:51: +;source-doc/keyboard/kyb_driver.c:37: ld b,0x00 ld hl,+(_report + 2) add hl, bc -;source-doc/keyboard/kyb_driver.c:52: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { +;source-doc/keyboard/kyb_driver.c:38: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { ld a,(hl) ld c,a cp 0x80 jr NC,l_keyboard_buf_put_00111 or a -;source-doc/keyboard/kyb_driver.c:53: const uint8_t key_code = report.keyCode[indx]; +;source-doc/keyboard/kyb_driver.c:39: const uint8_t key_code = report.keyCode[indx]; jr Z,l_keyboard_buf_put_00111 -;source-doc/keyboard/kyb_driver.c:57: // if already reported, just skip it -;source-doc/keyboard/kyb_driver.c:58: uint8_t i = 6; +;source-doc/keyboard/kyb_driver.c:43: // if already reported, just skip it +;source-doc/keyboard/kyb_driver.c:44: uint8_t i = 6; ld b,0x06 ld hl,+(_previous + 2) l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb_driver.c:59: uint8_t *a = previous.keyCode; +;source-doc/keyboard/kyb_driver.c:45: uint8_t *a = previous.keyCode; ld a, (hl) inc hl sub c -;source-doc/keyboard/kyb_driver.c:60: do { +;source-doc/keyboard/kyb_driver.c:46: do { ret Z -;source-doc/keyboard/kyb_driver.c:61: if (*a++ == key_code) +;source-doc/keyboard/kyb_driver.c:47: if (*a++ == key_code) djnz l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb_driver.c:63: } while (--i != 0); +;source-doc/keyboard/kyb_driver.c:49: } while (--i != 0); ld a, (_write_index) inc a and 0x07 ld b, a -;source-doc/keyboard/kyb_driver.c:64: +;source-doc/keyboard/kyb_driver.c:50: ld a,(_read_index) sub b ret Z -;source-doc/keyboard/kyb_driver.c:65: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb_driver.c:51: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld de,_buffer+0 ld hl, (_write_index) ld h,0x00 @@ -186,101 +145,66 @@ l_keyboard_buf_put_00106: inc de ld a, l ld (de), a -;source-doc/keyboard/kyb_driver.c:66: if (next_write_index != read_index) { // Check if buffer is not full +;source-doc/keyboard/kyb_driver.c:52: if (next_write_index != read_index) { // Check if buffer is not full ld hl,_write_index ld (hl), b l_keyboard_buf_put_00111: -;source-doc/keyboard/kyb_driver.c:68: write_index = next_write_index; +;source-doc/keyboard/kyb_driver.c:54: write_index = next_write_index; ret -;source-doc/keyboard/kyb_driver.c:70: } +;source-doc/keyboard/kyb_driver.c:56: } ; --------------------------------- -; Function usb_kyb_buf_size +; Function usb_kyb_status ; --------------------------------- -_usb_kyb_buf_size: -;source-doc/keyboard/kyb_driver.c:71: +_usb_kyb_status: +;source-doc/keyboard/kyb_driver.c:57: DI -;source-doc/keyboard/kyb_driver.c:76: uint8_t alt_size; - ld a,(_alt_write_index) - ld hl,_alt_read_index - sub (hl) - jr C,l_usb_kyb_buf_size_00102 -;source-doc/keyboard/kyb_driver.c:77: - ld a,(_alt_write_index) - ld hl,_alt_read_index - sub (hl) - ld d, a - jr l_usb_kyb_buf_size_00103 -l_usb_kyb_buf_size_00102: -;source-doc/keyboard/kyb_driver.c:79: alt_size = alt_write_index - alt_read_index; - ld hl, (_alt_read_index) - ld a,0x08 - sub l - ld hl, (_alt_write_index) - add a, l - ld d, a -l_usb_kyb_buf_size_00103: -;source-doc/keyboard/kyb_driver.c:81: alt_size = KEYBOARD_BUFFER_SIZE - alt_read_index + alt_write_index; - ld a, d - or a - jr Z,l_usb_kyb_buf_size_00105 -;source-doc/keyboard/kyb_driver.c:82: - ld a, (_alt_read_index) - inc a - and 0x07 - ld (_alt_read_index),a -l_usb_kyb_buf_size_00105: -;source-doc/keyboard/kyb_driver.c:84: alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb_driver.c:61: uint8_t size; ld a,(_write_index) ld hl,_read_index sub (hl) - jr C,l_usb_kyb_buf_size_00107 -;source-doc/keyboard/kyb_driver.c:85: + jr C,l_usb_kyb_status_00102 +;source-doc/keyboard/kyb_driver.c:62: ld a,(_write_index) ld hl,_read_index sub (hl) - ld e, a - jr l_usb_kyb_buf_size_00108 -l_usb_kyb_buf_size_00107: -;source-doc/keyboard/kyb_driver.c:87: size = write_index - read_index; + jr l_usb_kyb_status_00103 +l_usb_kyb_status_00102: +;source-doc/keyboard/kyb_driver.c:64: size = write_index - read_index; ld hl, (_read_index) ld a,0x08 sub l ld hl, (_write_index) add a, l - ld e, a -l_usb_kyb_buf_size_00108: -;source-doc/keyboard/kyb_driver.c:89: size = KEYBOARD_BUFFER_SIZE - read_index + write_index; +l_usb_kyb_status_00103: +;source-doc/keyboard/kyb_driver.c:66: size = KEYBOARD_BUFFER_SIZE - read_index + write_index; EI -;source-doc/keyboard/kyb_driver.c:90: - xor a - xor a - ex de, hl -;source-doc/keyboard/kyb_driver.c:91: EI; +;source-doc/keyboard/kyb_driver.c:67: +;source-doc/keyboard/kyb_driver.c:68: EI; ret -;source-doc/keyboard/kyb_driver.c:93: } +;source-doc/keyboard/kyb_driver.c:70: } ; --------------------------------- -; Function usb_kyb_buf_get_next +; Function usb_kyb_read ; --------------------------------- -_usb_kyb_buf_get_next: +_usb_kyb_read: push ix ld ix,0 add ix,sp push af push af -;source-doc/keyboard/kyb_driver.c:94: +;source-doc/keyboard/kyb_driver.c:71: ld a,(_write_index) ld hl,_read_index sub (hl) - jr NZ,l_usb_kyb_buf_get_next_00102 -;source-doc/keyboard/kyb_driver.c:95: uint32_t usb_kyb_buf_get_next() { + jr NZ,l_usb_kyb_read_00102 +;source-doc/keyboard/kyb_driver.c:72: uint32_t usb_kyb_read() { ld hl,0xff00 ld e, l ld d, l - jr l_usb_kyb_buf_get_next_00103 -l_usb_kyb_buf_get_next_00102: -;source-doc/keyboard/kyb_driver.c:97: return 0x0000FF00; // H = -1, D, E, L = 0 + jr l_usb_kyb_read_00103 +l_usb_kyb_read_00102: +;source-doc/keyboard/kyb_driver.c:74: return 0x0000FF00; // H = -1, D, E, L = 0 DI -;source-doc/keyboard/kyb_driver.c:98: +;source-doc/keyboard/kyb_driver.c:75: ld bc,_buffer+0 ld hl, (_read_index) ld h,0x00 @@ -289,23 +213,23 @@ l_usb_kyb_buf_get_next_00102: ld c, (hl) inc hl ld b, (hl) -;source-doc/keyboard/kyb_driver.c:99: DI; -;source-doc/keyboard/kyb_driver.c:100: const uint8_t modifier_key = buffer[read_index] >> 8; +;source-doc/keyboard/kyb_driver.c:76: DI; +;source-doc/keyboard/kyb_driver.c:77: const uint8_t modifier_key = buffer[read_index] >> 8; ld a, (_read_index) inc a and 0x07 ld hl,_read_index ld (hl), a -;source-doc/keyboard/kyb_driver.c:101: const uint8_t key_code = buffer[read_index] & 255; +;source-doc/keyboard/kyb_driver.c:78: const uint8_t key_code = buffer[read_index] & 255; EI -;source-doc/keyboard/kyb_driver.c:107: // L: KeyCode aka scan code +;source-doc/keyboard/kyb_driver.c:84: // L: KeyCode aka scan code push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb_driver.c:110: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb_driver.c:87: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -321,57 +245,54 @@ l_usb_kyb_buf_get_next_00102: ld (ix-1),a pop hl push hl -l_usb_kyb_buf_get_next_00103: -;source-doc/keyboard/kyb_driver.c:111: +l_usb_kyb_read_00103: +;source-doc/keyboard/kyb_driver.c:88: ld sp, ix pop ix ret -;source-doc/keyboard/kyb_driver.c:113: } +;source-doc/keyboard/kyb_driver.c:90: } ; --------------------------------- ; Function usb_kyb_flush ; --------------------------------- _usb_kyb_flush: -;source-doc/keyboard/kyb_driver.c:114: +;source-doc/keyboard/kyb_driver.c:91: DI -;source-doc/keyboard/kyb_driver.c:115: uint8_t usb_kyb_flush() __sdcccall(1) { - xor a - ld (_alt_read_index),a - ld (_alt_write_index),a +;source-doc/keyboard/kyb_driver.c:92: uint8_t usb_kyb_flush() __sdcccall(1) { xor a ld (_read_index),a ld (_write_index),a -;source-doc/keyboard/kyb_driver.c:118: +;source-doc/keyboard/kyb_driver.c:95: ld de,_previous+0 -;source-doc/keyboard/kyb_driver.c:119: uint8_t i = sizeof(previous); -;source-doc/keyboard/kyb_driver.c:120: uint8_t *a = (uint8_t *)previous; +;source-doc/keyboard/kyb_driver.c:96: uint8_t i = sizeof(previous); +;source-doc/keyboard/kyb_driver.c:97: uint8_t *a = (uint8_t *)previous; ld b,0x08 ld hl,_report l_usb_kyb_flush_00101: -;source-doc/keyboard/kyb_driver.c:121: uint8_t *b = (uint8_t *)report; +;source-doc/keyboard/kyb_driver.c:98: uint8_t *b = (uint8_t *)report; xor a ld (de), a inc de -;source-doc/keyboard/kyb_driver.c:122: do { +;source-doc/keyboard/kyb_driver.c:99: do { ld (hl),0x00 inc hl -;source-doc/keyboard/kyb_driver.c:123: *a++ = 0; +;source-doc/keyboard/kyb_driver.c:100: *a++ = 0; djnz l_usb_kyb_flush_00101 -;source-doc/keyboard/kyb_driver.c:125: } while (--i != 0); +;source-doc/keyboard/kyb_driver.c:102: } while (--i != 0); EI -;source-doc/keyboard/kyb_driver.c:127: EI; +;source-doc/keyboard/kyb_driver.c:104: EI; xor a -;source-doc/keyboard/kyb_driver.c:128: +;source-doc/keyboard/kyb_driver.c:105: ret -;source-doc/keyboard/kyb_driver.c:130: } +;source-doc/keyboard/kyb_driver.c:107: } ; --------------------------------- ; Function usb_kyb_tick ; --------------------------------- _usb_kyb_tick: -;source-doc/keyboard/kyb_driver.c:131: +;source-doc/keyboard/kyb_driver.c:108: ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb_driver.c:132: void usb_kyb_tick(void) { +;source-doc/keyboard/kyb_driver.c:109: void usb_kyb_tick(void) { jr NZ,l_usb_kyb_tick_00112 ;././source-doc/base-drv//ch376.h:111: ld l,0x0b @@ -384,7 +305,7 @@ _usb_kyb_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb_driver.c:135: +;source-doc/keyboard/kyb_driver.c:112: ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 @@ -409,81 +330,63 @@ _usb_kyb_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb_driver.c:137: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)&report, 8); +;source-doc/keyboard/kyb_driver.c:114: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)&report, 8); ld hl,_result ld a, (hl) or a jr NZ,l_usb_kyb_tick_00112 -;source-doc/keyboard/kyb_driver.c:138: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb_driver.c:115: ch_configure_nak_retry_3s(); call _report_diff or a jr Z,l_usb_kyb_tick_00112 -;source-doc/keyboard/kyb_driver.c:139: if (result == 0) { - call _report_put -;source-doc/keyboard/kyb_driver.c:141: report_put(); +;source-doc/keyboard/kyb_driver.c:117: if (report_diff()) { ld b,0x06 l_usb_kyb_tick_00103: -;source-doc/keyboard/kyb_driver.c:142: uint8_t i = 6; +;source-doc/keyboard/kyb_driver.c:118: uint8_t i = 6; ld a, b dec a push bc call _keyboard_buf_put pop bc -;source-doc/keyboard/kyb_driver.c:143: do { +;source-doc/keyboard/kyb_driver.c:119: do { djnz l_usb_kyb_tick_00103 -;source-doc/keyboard/kyb_driver.c:144: keyboard_buf_put(i - 1); +;source-doc/keyboard/kyb_driver.c:120: keyboard_buf_put(i - 1); ld de,_previous ld bc,0x0008 ld hl,_report ldir l_usb_kyb_tick_00112: -;source-doc/keyboard/kyb_driver.c:147: } +;source-doc/keyboard/kyb_driver.c:123: } ret -;source-doc/keyboard/kyb_driver.c:149: } +;source-doc/keyboard/kyb_driver.c:125: } ; --------------------------------- ; Function usb_kyb_init ; --------------------------------- _usb_kyb_init: - push ix - ld ix,0 - add ix,sp -;source-doc/keyboard/kyb_driver.c:151: usb_error usb_kyb_init(const uint8_t dev_index) { - ld a,(ix+4) +;source-doc/keyboard/kyb_driver.c:126: call _get_usb_device_config ex de, hl ld (_keyboard_config), hl -;source-doc/keyboard/kyb_driver.c:153: keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); +;source-doc/keyboard/kyb_driver.c:128: keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); ld hl,_keyboard_config + 1 ld a, (hl) dec hl or (hl) - jr NZ,l_usb_kyb_init_00102 -;source-doc/keyboard/kyb_driver.c:154: - ld l,0x0f - jr l_usb_kyb_init_00106 -l_usb_kyb_init_00102: -;source-doc/keyboard/kyb_driver.c:156: return USB_ERR_OTHER; +;source-doc/keyboard/kyb_driver.c:129: + ret Z +;source-doc/keyboard/kyb_driver.c:131: return; ld a,0x01 push af inc sp ld hl, (_keyboard_config) call _hid_set_protocol - ld l, a - or a - jr NZ,l_usb_kyb_init_00105 -;source-doc/keyboard/kyb_driver.c:157: +;source-doc/keyboard/kyb_driver.c:132: ld a,0x80 push af inc sp ld hl, (_keyboard_config) call _hid_set_idle - ld l, a -;source-doc/keyboard/kyb_driver.c:159: return hid_set_idle(keyboard_config, 0x80); -;source-doc/keyboard/kyb_driver.c:160: -l_usb_kyb_init_00105: -l_usb_kyb_init_00106: -;source-doc/keyboard/kyb_driver.c:161: done: - pop ix +;source-doc/keyboard/kyb_driver.c:133: hid_set_protocol(keyboard_config, 1); ret _keyboard_config: DEFW +0x0000 @@ -507,77 +410,6 @@ _write_index: DEFB +0x00 _read_index: DEFB +0x00 -_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 - 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 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 8c22724a..e33d6f71 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -20,5 +20,6 @@ uint8_t keyboard_init(void) __sdcccall(1) { } while (++index != MAX_NUMBER_OF_DEVICES + 1); print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); + return 0; } diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm deleted file mode 100644 index 9285b572..00000000 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm +++ /dev/null @@ -1,74 +0,0 @@ - -; -; Inputs: -; None -; -; Outputs: -; A: Status / Codes Pending -; 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 -; acceptable to return 1 to indicate there are key codes available to read and -; 0 if there are none available. -; The value returned in register A is used as both a Status (A) code and the -; return value. Negative values (bit 7 set) indicate a standard HBIOS result -; (error) code. Otherwise, the return value represents the number of key codes -; pending. -; -; 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 - -_usb_kyb_report: - 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 - - call _usb_kyb_buf_size - ld a, l - ld b, h - ex af, af' - ld a, b - or a - pop iy ; retrieve the next que'd usb_report address - jr z, no_queued_reports - - 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 - - diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c index b16735f4..68a84ae1 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c @@ -16,13 +16,8 @@ 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; -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}; +static keyboard_report_t report = {0}; +static keyboard_report_t previous = {0}; #define DI __asm__("DI") #define EI __asm__("EI") @@ -40,15 +35,6 @@ static uint8_t report_diff() __sdcccall(1) { 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 indx) __sdcccall(1) { const uint8_t key_code = report.keyCode[indx]; if (key_code >= 0x80 || key_code == 0) @@ -69,19 +55,10 @@ static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { } } -uint16_t usb_kyb_buf_size() { +uint8_t usb_kyb_status() __sdcccall(1) { DI; 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) - alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; if (write_index >= read_index) size = write_index - read_index; @@ -89,10 +66,10 @@ uint16_t usb_kyb_buf_size() { size = KEYBOARD_BUFFER_SIZE - read_index + write_index; EI; - return (uint16_t)alt_size << 8 | (uint16_t)size; + return size; } -uint32_t usb_kyb_buf_get_next() { +uint32_t usb_kyb_read() { if (write_index == read_index) // Check if buffer is empty return 0x0000FF00; // H = -1, D, E, L = 0 @@ -114,7 +91,7 @@ uint32_t usb_kyb_buf_get_next() { uint8_t usb_kyb_flush() __sdcccall(1) { DI; - write_index = read_index = alt_write_index = alt_read_index = 0; + write_index = read_index = 0; uint8_t i = sizeof(previous); uint8_t *a = (uint8_t *)previous; @@ -138,7 +115,6 @@ void usb_kyb_tick(void) { ch_configure_nak_retry_3s(); if (result == 0) { if (report_diff()) { - report_put(); uint8_t i = 6; do { keyboard_buf_put(i - 1); @@ -148,16 +124,12 @@ void usb_kyb_tick(void) { } } -usb_error usb_kyb_init(const uint8_t dev_index) { - uint8_t result; +void usb_kyb_init(const uint8_t dev_index) __sdcccall(1) { keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); if (keyboard_config == NULL) - return USB_ERR_OTHER; - - CHECK(hid_set_protocol(keyboard_config, 1)); - return hid_set_idle(keyboard_config, 0x80); + return; -done: - return result; + hid_set_protocol(keyboard_config, 1); + hid_set_idle(keyboard_config, 0x80); } diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h index 0e3ef51e..b4d10c14 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h @@ -4,9 +4,9 @@ #include #include -extern usb_error usb_kyb_init(const uint8_t dev_index); -extern uint8_t usb_kyb_flush() __sdcccall(1); -extern uint32_t usb_kyb_buf_get_next(); -// extern usb_kyb_report(); +extern void usb_kyb_init(const uint8_t dev_index) __sdcccall(1); +extern uint8_t usb_kyb_flush() __sdcccall(1); +extern uint8_t usb_kyb_status() __sdcccall(1); +extern uint32_t usb_kyb_read(); #endif diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index 87c337b8..7d46cd77 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -91,9 +91,6 @@ VEC_CHUKB_TICK: ; ; Outputs: ; A: Status / Codes Pending -; 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 @@ -104,17 +101,7 @@ VEC_CHUKB_TICK: ; (error) code. Otherwise, the return value represents the number of key codes ; pending. ; -; 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 .EQU _usb_kyb_report +UKY_STAT: .EQU _usb_kyb_status ; ### Function 0x4D -- Video Keyboard Flush (VDAKFL) ; @@ -164,7 +151,7 @@ UKY_FLUSH .EQU _usb_kyb_flush ; function keys and arrows, are returned as reserved codes. ; UKY_READ: - CALL _usb_kyb_buf_get_next + CALL _usb_kyb_read LD A, H OR A JR NZ, UKY_READ