Browse Source

ch376-native: keyboard driver now support CAPS LOCK key

pull/592/head
Dean Netherton 1 year ago
parent
commit
9cbd8937d7
  1. 70
      Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s
  2. 133
      Source/HBIOS/ch376-native/keyboard/kyb-init.c.s
  3. 21
      Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c
  4. 2
      Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h
  5. 7
      Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c

70
Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s

@ -30,6 +30,8 @@
; .area _INITIALIZED removed by z88dk
_caps_lock_engaged:
DEFS 1
_scancodes_shift_table:
DEFS 128
_scancodes_table:
@ -49,40 +51,88 @@ _scancodes_table:
;--------------------------------------------------------
; code
;--------------------------------------------------------
;source-doc/keyboard/class_hid_keyboard.c:333: };
;source-doc/keyboard/class_hid_keyboard.c:337: };
; ---------------------------------
; Function char_with_caps_lock
; ---------------------------------
_char_with_caps_lock:
ld c, a
;source-doc/keyboard/class_hid_keyboard.c:338:
ld hl,_caps_lock_engaged
bit 0, (hl)
jr NZ,l_char_with_caps_lock_00102
;source-doc/keyboard/class_hid_keyboard.c:339: char char_with_caps_lock(const char c) __sdcccall(1) {
ld a, c
jr l_char_with_caps_lock_00109
l_char_with_caps_lock_00102:
;source-doc/keyboard/class_hid_keyboard.c:341: return c;
ld a, c
sub 0x41
jr C,l_char_with_caps_lock_00104
ld a,0x5a
sub c
jr C,l_char_with_caps_lock_00104
;source-doc/keyboard/class_hid_keyboard.c:342:
ld a, c
add a,0x20
jr l_char_with_caps_lock_00109
l_char_with_caps_lock_00104:
;source-doc/keyboard/class_hid_keyboard.c:344: return c - 'A' + 'a';
ld a, c
sub 0x61
jr C,l_char_with_caps_lock_00107
ld a,0x7a
sub c
jr C,l_char_with_caps_lock_00107
;source-doc/keyboard/class_hid_keyboard.c:345:
ld a, c
add a,0xe0
jr l_char_with_caps_lock_00109
l_char_with_caps_lock_00107:
;source-doc/keyboard/class_hid_keyboard.c:347: return c - 'a' + 'A';
ld a, c
l_char_with_caps_lock_00109:
;source-doc/keyboard/class_hid_keyboard.c:348:
ret
;source-doc/keyboard/class_hid_keyboard.c:350: }
; ---------------------------------
; Function scancode_to_char
; ---------------------------------
_scancode_to_char:
ld c, a
;source-doc/keyboard/class_hid_keyboard.c:334:
;source-doc/keyboard/class_hid_keyboard.c:351:
ld a,l
ld e,l
sub 0x80
jr C,l_scancode_to_char_00102
;source-doc/keyboard/class_hid_keyboard.c:335: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) {
;source-doc/keyboard/class_hid_keyboard.c:352: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) {
xor a
jr l_scancode_to_char_00105
l_scancode_to_char_00102:
;source-doc/keyboard/class_hid_keyboard.c:337: return 0;
;source-doc/keyboard/class_hid_keyboard.c:354: return 0;
ld a, c
and 0x22
jr Z,l_scancode_to_char_00104
;source-doc/keyboard/class_hid_keyboard.c:338:
;source-doc/keyboard/class_hid_keyboard.c:355:
ld d,0x00
ld hl,_scancodes_shift_table
add hl, de
ld a, (hl)
jr l_scancode_to_char_00105
ld a,(hl)
ld c,a
jp _char_with_caps_lock
l_scancode_to_char_00104:
;source-doc/keyboard/class_hid_keyboard.c:340: return scancodes_shift_table[code];
;source-doc/keyboard/class_hid_keyboard.c:357: return char_with_caps_lock(scancodes_shift_table[code]);
ld d,0x00
ld hl,_scancodes_table
add hl, de
ld a, (hl)
ld a,(hl)
ld c,a
jp _char_with_caps_lock
l_scancode_to_char_00105:
;source-doc/keyboard/class_hid_keyboard.c:341:
;source-doc/keyboard/class_hid_keyboard.c:358:
ret
_caps_lock_engaged:
DEFB +0x01
_scancodes_shift_table:
DEFB +0x00
DEFB +0x00

133
Source/HBIOS/ch376-native/keyboard/kyb-init.c.s

@ -62,77 +62,77 @@ _report:
;--------------------------------------------------------
; code
;--------------------------------------------------------
;source-doc/keyboard/kyb-init.c:11: void keyboard_init(void) {
;source-doc/keyboard/kyb-init.c:12: void keyboard_init(void) {
; ---------------------------------
; Function keyboard_init
; ---------------------------------
_keyboard_init:
;source-doc/keyboard/kyb-init.c:13: uint8_t index = 1;
;source-doc/keyboard/kyb-init.c:14: uint8_t index = 1;
ld c,0x01
;source-doc/keyboard/kyb-init.c:14: keyboard_config = NULL;
;source-doc/keyboard/kyb-init.c:15: keyboard_config = NULL;
ld hl,0x0000
ld (_keyboard_config),hl
;source-doc/keyboard/kyb-init.c:16: do {
;source-doc/keyboard/kyb-init.c:17: do {
ld b,0x01
l_keyboard_init_00105:
;source-doc/keyboard/kyb-init.c:17: keyboard_config = (device_config_keyboard *)get_usb_device_config(index);
;source-doc/keyboard/kyb-init.c:18: keyboard_config = (device_config_keyboard *)get_usb_device_config(index);
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:19: if (keyboard_config == NULL)
;source-doc/keyboard/kyb-init.c:20: if (keyboard_config == NULL)
ld hl,(_keyboard_config)
ld a,h
or l
jr Z,l_keyboard_init_00107
;source-doc/keyboard/kyb-init.c:22: const usb_device_type t = keyboard_config->type;
;source-doc/keyboard/kyb-init.c:23: const usb_device_type t = keyboard_config->type;
ld hl, (_keyboard_config)
ld a, (hl)
and 0x0f
;source-doc/keyboard/kyb-init.c:24: if (t == USB_IS_KEYBOARD) {
;source-doc/keyboard/kyb-init.c:25: if (t == USB_IS_KEYBOARD) {
sub 0x04
jr NZ,l_keyboard_init_00106
;source-doc/keyboard/kyb-init.c:25: print_string("\r\nUSB: KEYBOARD @ $");
;source-doc/keyboard/kyb-init.c:26: print_string("\r\nUSB: KEYBOARD @ $");
push bc
ld hl,kyb_init_str_0
call _print_string
pop bc
;source-doc/keyboard/kyb-init.c:26: print_uint16(index);
;source-doc/keyboard/kyb-init.c:27: print_uint16(index);
ld h,0x00
ld l, c
call _print_uint16
;source-doc/keyboard/kyb-init.c:27: print_string(" $");
;source-doc/keyboard/kyb-init.c:28: print_string(" $");
ld hl,kyb_init_str_1
call _print_string
;source-doc/keyboard/kyb-init.c:29: hid_set_protocol(keyboard_config, 1);
;source-doc/keyboard/kyb-init.c:30: hid_set_protocol(keyboard_config, 1);
ld a,0x01
push af
inc sp
ld hl, (_keyboard_config)
call _hid_set_protocol
;source-doc/keyboard/kyb-init.c:30: hid_set_idle(keyboard_config, 0x80);
;source-doc/keyboard/kyb-init.c:31: hid_set_idle(keyboard_config, 0x80);
ld a,0x80
push af
inc sp
ld hl, (_keyboard_config)
call _hid_set_idle
;source-doc/keyboard/kyb-init.c:31: return;
;source-doc/keyboard/kyb-init.c:32: return;
jr l_keyboard_init_00108
l_keyboard_init_00106:
;source-doc/keyboard/kyb-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1);
;source-doc/keyboard/kyb-init.c:34: } while (++index != MAX_NUMBER_OF_DEVICES + 1);
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:35: print_string("\r\nUSB: KEYBOARD: NOT FOUND$");
;source-doc/keyboard/kyb-init.c:36: print_string("\r\nUSB: KEYBOARD: NOT FOUND$");
ld hl,kyb_init_str_2
jp _print_string
l_keyboard_init_00108:
;source-doc/keyboard/kyb-init.c:36: }
;source-doc/keyboard/kyb-init.c:37: }
ret
kyb_init_str_0:
DEFB 0x0d
@ -147,7 +147,7 @@ kyb_init_str_2:
DEFB 0x0a
DEFM "USB: KEYBOARD: NOT FOUND$"
DEFB 0x00
;source-doc/keyboard/kyb-init.c:49:
;source-doc/keyboard/kyb-init.c:50:
; ---------------------------------
; Function keyboard_buf_put
; ---------------------------------
@ -155,42 +155,42 @@ _keyboard_buf_put:
push ix
ld ix,0
add ix,sp
;source-doc/keyboard/kyb-init.c:50: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) {
;source-doc/keyboard/kyb-init.c:51: 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)
or a
;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
;source-doc/keyboard/kyb-init.c:52: if (key_code >= 0x80 || key_code == 0)
;source-doc/keyboard/kyb-init.c:55: // 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++)
;source-doc/keyboard/kyb-init.c:56: 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)
;source-doc/keyboard/kyb-init.c:57: 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
;source-doc/keyboard/kyb-init.c:55: // 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:
;source-doc/keyboard/kyb-init.c:59:
ld a,(_write_index)
inc a
and 0x07
ld c, a
;source-doc/keyboard/kyb-init.c:59: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
;source-doc/keyboard/kyb-init.c:60: 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:60: if (next_write_index != read_index) { // Check if buffer is not full
;source-doc/keyboard/kyb-init.c:61: if (next_write_index != read_index) { // Check if buffer is not full
ld de,_buffer+0
ld hl,(_write_index)
ld h,0x00
@ -198,7 +198,7 @@ l_keyboard_buf_put_00106:
add hl, de
ld a,(ix+4)
ld (hl), a
;source-doc/keyboard/kyb-init.c:61: buffer[write_index].modifier_keys = modifier_keys;
;source-doc/keyboard/kyb-init.c:62: buffer[write_index].modifier_keys = modifier_keys;
ld hl,(_write_index)
ld h,0x00
add hl, hl
@ -207,30 +207,30 @@ l_keyboard_buf_put_00106:
inc de
ld a,(ix+5)
ld (de), a
;source-doc/keyboard/kyb-init.c:62: buffer[write_index].key_code = key_code;
;source-doc/keyboard/kyb-init.c:63: 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:64: }
;source-doc/keyboard/kyb-init.c:65: }
pop ix
ret
;source-doc/keyboard/kyb-init.c:66:
;source-doc/keyboard/kyb-init.c:67:
; ---------------------------------
; Function keyboard_buf_size
; ---------------------------------
_keyboard_buf_size:
;source-doc/keyboard/kyb-init.c:67: uint8_t keyboard_buf_size() __sdcccall(1) {
;source-doc/keyboard/kyb-init.c:68: 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:68: if (write_index >= read_index)
;source-doc/keyboard/kyb-init.c:69: 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:70:
;source-doc/keyboard/kyb-init.c:71:
ld hl,_read_index
ld c, (hl)
ld a,0x08
@ -239,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:71: return KEYBOARD_BUFFER_SIZE - read_index + write_index;
;source-doc/keyboard/kyb-init.c:72: return KEYBOARD_BUFFER_SIZE - read_index + write_index;
ret
;source-doc/keyboard/kyb-init.c:73:
;source-doc/keyboard/kyb-init.c:74:
; ---------------------------------
; Function keyboard_buf_get_next
; ---------------------------------
@ -251,41 +251,54 @@ _keyboard_buf_get_next:
add ix,sp
push af
push af
;source-doc/keyboard/kyb-init.c:74: uint32_t keyboard_buf_get_next() {
;source-doc/keyboard/kyb-init.c:75: 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:75: if (write_index == read_index) // Check if buffer is empty
;source-doc/keyboard/kyb-init.c:76: 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
jr l_keyboard_buf_get_next_00105
l_keyboard_buf_get_next_00102:
;source-doc/keyboard/kyb-init.c:77:
;source-doc/keyboard/kyb-init.c:78:
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:78: const uint8_t modifier_key = buffer[read_index].modifier_keys;
;source-doc/keyboard/kyb-init.c:79: const uint8_t modifier_key = buffer[read_index].modifier_keys;
inc hl
ld c, (hl)
;source-doc/keyboard/kyb-init.c:79: const uint8_t key_code = buffer[read_index].key_code;
;source-doc/keyboard/kyb-init.c:80: 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:80: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
;source-doc/keyboard/kyb-init.c:82:
ld a, c
sub 0x39
jr NZ,l_keyboard_buf_get_next_00104
;source-doc/keyboard/kyb-init.c:83: if (key_code == KEY_CODE_CAPS_LOCK) {
ld hl,_caps_lock_engaged
ld a, (hl)
xor 0x01
ld (hl), a
;source-doc/keyboard/kyb-init.c:84: caps_lock_engaged = !caps_lock_engaged;
call _keyboard_buf_get_next
jr l_keyboard_buf_get_next_00105
l_keyboard_buf_get_next_00104:
;source-doc/keyboard/kyb-init.c:87:
push bc
ld l, c
ld a, b
call _scancode_to_char
ld e, a
pop bc
;source-doc/keyboard/kyb-init.c:82: /* D = modifier, e-> char, H = 0, L=>code */
;source-doc/keyboard/kyb-init.c:89: /* D = modifier, e-> char, H = 0, L=>code */
xor a
ld (ix-1),b
xor a
@ -301,34 +314,34 @@ l_keyboard_buf_get_next_00102:
ld (ix-1),a
pop hl
push hl
l_keyboard_buf_get_next_00103:
;source-doc/keyboard/kyb-init.c:83: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code;
l_keyboard_buf_get_next_00105:
;source-doc/keyboard/kyb-init.c:90: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code;
ld sp, ix
pop ix
ret
;source-doc/keyboard/kyb-init.c:85:
;source-doc/keyboard/kyb-init.c:92:
; ---------------------------------
; Function keyboard_buf_flush
; ---------------------------------
_keyboard_buf_flush:
;source-doc/keyboard/kyb-init.c:86: void keyboard_buf_flush() {
;source-doc/keyboard/kyb-init.c:93: void keyboard_buf_flush() {
ld hl,_write_index
ld (hl),0x00
;source-doc/keyboard/kyb-init.c:87: write_index = 0;
;source-doc/keyboard/kyb-init.c:94: write_index = 0;
ld hl,_read_index
ld (hl),0x00
;source-doc/keyboard/kyb-init.c:88: read_index = 0;
;source-doc/keyboard/kyb-init.c:95: read_index = 0;
ret
;source-doc/keyboard/kyb-init.c:94:
;source-doc/keyboard/kyb-init.c:101:
; ---------------------------------
; Function keyboard_tick
; ---------------------------------
_keyboard_tick:
;source-doc/keyboard/kyb-init.c:95: void keyboard_tick(void) {
;source-doc/keyboard/kyb-init.c:102: void keyboard_tick(void) {
ld hl,_in_critical_usb_section
ld a, (hl)
or a
;source-doc/keyboard/kyb-init.c:96: if (is_in_critical_section())
;source-doc/keyboard/kyb-init.c:103: if (is_in_critical_section())
jr NZ,l_keyboard_tick_00111
;././source-doc/base-drv//ch376.h:110: #endif
ld l,0x0b
@ -341,7 +354,7 @@ _keyboard_tick:
ld a,0x1f
ld bc,_CH376_DATA_PORT
out (c),a
;source-doc/keyboard/kyb-init.c:99: ch_configure_nak_retry_disable();
;source-doc/keyboard/kyb-init.c:106: ch_configure_nak_retry_disable();
ld bc,_report+0
ld hl, (_keyboard_config)
ld a,0x08
@ -366,10 +379,10 @@ _keyboard_tick:
ld a,0xdf
ld bc,_CH376_DATA_PORT
out (c),a
;source-doc/keyboard/kyb-init.c:101: ch_configure_nak_retry_3s();
;source-doc/keyboard/kyb-init.c:108: ch_configure_nak_retry_3s();
ld hl,_result
ld a, (hl)
;source-doc/keyboard/kyb-init.c:102: if (result == 0)
;source-doc/keyboard/kyb-init.c:109: if (result == 0)
or a
jr NZ,l_keyboard_tick_00111
ld c,a
@ -377,7 +390,7 @@ 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++) {
;source-doc/keyboard/kyb-init.c:110: for (uint8_t i = 0; i < 6; i++) {
ld a,+((_report+2) & 0xFF)
add a, c
ld e, a
@ -396,17 +409,17 @@ l_keyboard_tick_00109:
pop af
pop de
pop bc
;source-doc/keyboard/kyb-init.c:104: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]);
;source-doc/keyboard/kyb-init.c:111: 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)
;source-doc/keyboard/kyb-init.c:109: if (result == 0)
inc c
jr l_keyboard_tick_00109
l_keyboard_tick_00111:
;source-doc/keyboard/kyb-init.c:106: }
;source-doc/keyboard/kyb-init.c:113: }
ret
_keyboard_config:
DEFW +0x0000

21
Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c

@ -2,6 +2,8 @@
#define ESC 0x1B
bool caps_lock_engaged = true;
/**
* scan codes sourced from https://deskthority.net/wiki/Scancode
*
@ -241,6 +243,8 @@ char scancodes_table[128] = {
',',
'.',
'/',
/* 0x39 */
0x00 /*CAPSLOCK*/,
0x00 /* F1 */,
0x00 /* F2 */,
@ -332,12 +336,25 @@ char scancodes_table[128] = {
0x00 /* MUTE */,
};
char char_with_caps_lock(const char c) __sdcccall(1) {
if (!caps_lock_engaged)
return c;
if (c >= 'A' && c <= 'Z')
return c - 'A' + 'a';
if (c >= 'a' && c <= 'z')
return c - 'a' + 'A';
return c;
}
char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) {
if (code >= 0x80)
return 0;
if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT))
return scancodes_shift_table[code];
return char_with_caps_lock(scancodes_shift_table[code]);
return scancodes_table[code];
return char_with_caps_lock(scancodes_table[code]);
}

2
Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h

@ -18,6 +18,8 @@ typedef struct {
#define KEY_MOD_RALT 0x40
#define KEY_MOD_RMETA 0x80
#define KEY_CODE_CAPS_LOCK 0x39
extern char scancodes_table[128];
extern char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1);

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

@ -7,6 +7,7 @@
#include <usb_state.h>
static device_config_keyboard *keyboard_config = 0;
extern bool caps_lock_engaged;
void keyboard_init(void) {
@ -78,6 +79,12 @@ uint32_t keyboard_buf_get_next() {
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;
if (key_code == KEY_CODE_CAPS_LOCK) {
caps_lock_engaged = !caps_lock_engaged;
return keyboard_buf_get_next();
}
const unsigned char c = scancode_to_char(modifier_key, key_code);
/* D = modifier, e-> char, H = 0, L=>code */
return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code;

Loading…
Cancel
Save