Browse Source

ch376-native: UKY_STATE: usb extension returns a 'buffered' hid report (upto 8)

pull/592/head
Dean Netherton 10 months ago
parent
commit
22c26dba36
  1. 466
      Source/HBIOS/ch376-native/keyboard/kyb-init.c.s
  2. 2
      Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh
  3. 2
      Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h
  4. 129
      Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c
  5. 45
      Source/HBIOS/ch376kyb.asm

466
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

2
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' \

2
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

129
Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c

@ -4,13 +4,31 @@
#include <dev_transfers.h>
#include <print.h>
#include <stdint.h>
#include <string.h>
#include <usb_state.h>
#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;
}
}
}

45
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

Loading…
Cancel
Save