Browse Source

ch376-native: keyboard int handler optimisations

pull/592/head
Dean Netherton 10 months ago
parent
commit
9abba42df7
  1. 2
      Dockerfile
  2. 259
      Source/HBIOS/ch376-native/keyboard/kyb-init.c.s
  3. 31
      Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c
  4. 16
      Source/HBIOS/ch376kyb.asm

2
Dockerfile

@ -16,7 +16,7 @@ FROM ubuntu:jammy-20240111 AS basebuilder
# cd Tools && make
# cd Source && make # at least once to build many common units
# cd Source && make rom ROM_PLATFORM=RCZ80 ROM_CONFIG=std
# cd Source && make rom ROM_PLATFORM=RCEZ80 ROM_CONFIG=std
# when finish, type 'exit' to return to back to your standard terminal session

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

@ -68,80 +68,80 @@ _previous:
;--------------------------------------------------------
; code
;--------------------------------------------------------
;source-doc/keyboard/kyb-init.c:30:
;source-doc/keyboard/kyb-init.c:27:
; ---------------------------------
; Function keyboard_init
; ---------------------------------
_keyboard_init:
;source-doc/keyboard/kyb-init.c:31: uint8_t keyboard_init(void) __sdcccall(1) {
;source-doc/keyboard/kyb-init.c:28: uint8_t keyboard_init(void) __sdcccall(1) {
ld c,0x01
;source-doc/keyboard/kyb-init.c:32: uint8_t index = 1;
;source-doc/keyboard/kyb-init.c:29: uint8_t index = 1;
ld hl,0x0000
ld (_keyboard_config),hl
;source-doc/keyboard/kyb-init.c:34:
;source-doc/keyboard/kyb-init.c:31:
ld b,0x01
l_keyboard_init_00105:
;source-doc/keyboard/kyb-init.c:35: do {
;source-doc/keyboard/kyb-init.c:32: 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:37:
;source-doc/keyboard/kyb-init.c:34:
ld hl,(_keyboard_config)
ld a,h
or l
jr Z,l_keyboard_init_00107
;source-doc/keyboard/kyb-init.c:40:
;source-doc/keyboard/kyb-init.c:37:
ld hl, (_keyboard_config)
ld a, (hl)
and 0x0f
;source-doc/keyboard/kyb-init.c:42:
;source-doc/keyboard/kyb-init.c:39:
sub 0x04
jr NZ,l_keyboard_init_00106
;source-doc/keyboard/kyb-init.c:43: if (t == USB_IS_KEYBOARD) {
;source-doc/keyboard/kyb-init.c:40: if (t == USB_IS_KEYBOARD) {
push bc
ld hl,kyb_init_str_0
call _print_string
pop bc
;source-doc/keyboard/kyb-init.c:44: print_string("\r\nUSB: KEYBOARD @ $");
;source-doc/keyboard/kyb-init.c:41: print_string("\r\nUSB: KEYBOARD @ $");
ld h,0x00
ld l, c
call _print_uint16
;source-doc/keyboard/kyb-init.c:45: print_uint16(index);
;source-doc/keyboard/kyb-init.c:42: print_uint16(index);
ld hl,kyb_init_str_1
call _print_string
;source-doc/keyboard/kyb-init.c:47:
;source-doc/keyboard/kyb-init.c:44:
ld a,0x01
push af
inc sp
ld hl, (_keyboard_config)
call _hid_set_protocol
;source-doc/keyboard/kyb-init.c:48: hid_set_protocol(keyboard_config, 1);
;source-doc/keyboard/kyb-init.c:45: 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:49: hid_set_idle(keyboard_config, 0x80);
;source-doc/keyboard/kyb-init.c:46: hid_set_idle(keyboard_config, 0x80);
ld a,0x01
jr l_keyboard_init_00108
l_keyboard_init_00106:
;source-doc/keyboard/kyb-init.c:51: }
;source-doc/keyboard/kyb-init.c:48: }
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:53:
;source-doc/keyboard/kyb-init.c:50:
ld hl,kyb_init_str_2
call _print_string
;source-doc/keyboard/kyb-init.c:54: print_string("\r\nUSB: KEYBOARD: NOT FOUND$");
;source-doc/keyboard/kyb-init.c:51: print_string("\r\nUSB: KEYBOARD: NOT FOUND$");
xor a
l_keyboard_init_00108:
;source-doc/keyboard/kyb-init.c:55: return 0;
;source-doc/keyboard/kyb-init.c:52: return 0;
ret
kyb_init_str_0:
DEFB 0x0d
@ -156,51 +156,51 @@ kyb_init_str_2:
DEFB 0x0a
DEFM "USB: KEYBOARD: NOT FOUND$"
DEFB 0x00
;source-doc/keyboard/kyb-init.c:57:
;source-doc/keyboard/kyb-init.c:54:
; ---------------------------------
; Function report_diff
; ---------------------------------
_report_diff:
;source-doc/keyboard/kyb-init.c:58: static uint8_t report_diff() __sdcccall(1) {
;source-doc/keyboard/kyb-init.c:55: 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);
;source-doc/keyboard/kyb-init.c:56: uint8_t *a = (uint8_t *)&report;
;source-doc/keyboard/kyb-init.c:59: uint8_t i = sizeof(report);
ld b,0x08
ld hl,_previous
l_report_diff_00103:
;source-doc/keyboard/kyb-init.c:63: do {
;source-doc/keyboard/kyb-init.c:60: 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++)
;source-doc/keyboard/kyb-init.c:61: if (*a++ != *b++)
ld a,0x01
jr l_report_diff_00106
l_report_diff_00104:
;source-doc/keyboard/kyb-init.c:65: return true;
;source-doc/keyboard/kyb-init.c:62: return true;
djnz l_report_diff_00103
;source-doc/keyboard/kyb-init.c:67:
;source-doc/keyboard/kyb-init.c:64:
xor a
l_report_diff_00106:
;source-doc/keyboard/kyb-init.c:68: return false;
;source-doc/keyboard/kyb-init.c:65: return false;
ret
;source-doc/keyboard/kyb-init.c:70:
;source-doc/keyboard/kyb-init.c:67:
; ---------------------------------
; Function report_put
; ---------------------------------
_report_put:
;source-doc/keyboard/kyb-init.c:71: static void report_put() {
;source-doc/keyboard/kyb-init.c:68: static void report_put() {
ld a, (_alt_write_index)
inc a
and 0x07
ld c, a
;source-doc/keyboard/kyb-init.c:73:
;source-doc/keyboard/kyb-init.c:70:
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
;source-doc/keyboard/kyb-init.c:71: 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
@ -214,90 +214,90 @@ _report_put:
ld hl,_report
ldir
pop bc
;source-doc/keyboard/kyb-init.c:75: reports[alt_write_index] = report;
;source-doc/keyboard/kyb-init.c:72: reports[alt_write_index] = report;
ld hl,_alt_write_index
ld (hl), c
;source-doc/keyboard/kyb-init.c:77: }
;source-doc/keyboard/kyb-init.c:74: }
ret
;source-doc/keyboard/kyb-init.c:79:
;source-doc/keyboard/kyb-init.c:76:
; ---------------------------------
; Function keyboard_buf_put
; ---------------------------------
_keyboard_buf_put:
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
;source-doc/keyboard/kyb-init.c:77: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) {
ld b,0x00
ld hl,+(_report + 2)
add hl, bc
;source-doc/keyboard/kyb-init.c:78: const uint8_t key_code = report.keyCode[indx];
ld a,(hl)
ld c,a
cp 0x80
jr NC,l_keyboard_buf_put_00111
or a
;source-doc/keyboard/kyb-init.c:81: if (key_code >= 0x80 || key_code == 0)
;source-doc/keyboard/kyb-init.c:79: 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;
;source-doc/keyboard/kyb-init.c:83: uint8_t i = 6;
;source-doc/keyboard/kyb-init.c:84: uint8_t *a = previous.keyCode;
ld b,0x06
ld hl,+(_previous + 2)
l_keyboard_buf_put_00106:
;source-doc/keyboard/kyb-init.c:87: do {
;source-doc/keyboard/kyb-init.c:85: do {
ld a, (hl)
inc hl
sub e
;source-doc/keyboard/kyb-init.c:88: if (*a++ == key_code)
sub c
;source-doc/keyboard/kyb-init.c:86: if (*a++ == key_code)
ret Z
;source-doc/keyboard/kyb-init.c:89: return;
;source-doc/keyboard/kyb-init.c:87: return;
djnz l_keyboard_buf_put_00106
;source-doc/keyboard/kyb-init.c:91:
;source-doc/keyboard/kyb-init.c:89:
ld a, (_write_index)
inc a
and 0x07
ld d, a
;source-doc/keyboard/kyb-init.c:92: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
ld b, a
;source-doc/keyboard/kyb-init.c:90: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
ld a,(_read_index)
sub d
sub b
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
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;
;source-doc/keyboard/kyb-init.c:91: if (next_write_index != read_index) { // Check if buffer is not full
ld de,_buffer+0
ld hl, (_write_index)
ld h,0x00
add hl, hl
ld bc,_buffer
add hl, bc
inc hl
ld (hl), e
;source-doc/keyboard/kyb-init.c:95: buffer[write_index].key_code = key_code;
add hl, de
ex de, hl
ld hl,(_report)
xor a
xor a
ld a, c
ld (de), a
inc de
ld a, l
ld (de), a
;source-doc/keyboard/kyb-init.c:92: buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code;
ld hl,_write_index
ld (hl), d
ld (hl), b
l_keyboard_buf_put_00111:
;source-doc/keyboard/kyb-init.c:97: }
;source-doc/keyboard/kyb-init.c:94: }
ret
;source-doc/keyboard/kyb-init.c:99:
;source-doc/keyboard/kyb-init.c:96:
; ---------------------------------
; Function keyboard_buf_size
; ---------------------------------
_keyboard_buf_size:
;source-doc/keyboard/kyb-init.c:103:
;source-doc/keyboard/kyb-init.c:100:
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)
;source-doc/keyboard/kyb-init.c:101: 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
;source-doc/keyboard/kyb-init.c:103: else
ld hl, (_alt_read_index)
ld a,0x08
sub l
@ -305,57 +305,43 @@ l_keyboard_buf_size_00102:
add a, l
ld d, a
l_keyboard_buf_size_00103:
;source-doc/keyboard/kyb-init.c:108:
;source-doc/keyboard/kyb-init.c:105:
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];
jr Z,l_keyboard_buf_size_00105
;source-doc/keyboard/kyb-init.c:106: if (alt_size != 0)
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:
l_keyboard_buf_size_00105:
;source-doc/keyboard/kyb-init.c:108:
ld a,(_write_index)
ld hl,_read_index
sub (hl)
jr C,l_keyboard_buf_size_00108
;source-doc/keyboard/kyb-init.c:116: if (write_index >= read_index)
jr C,l_keyboard_buf_size_00107
;source-doc/keyboard/kyb-init.c:109: if (write_index >= read_index)
ld a,(_write_index)
ld hl,_read_index
sub (hl)
ld e, a
jr l_keyboard_buf_size_00109
l_keyboard_buf_size_00108:
;source-doc/keyboard/kyb-init.c:118: else
jr l_keyboard_buf_size_00108
l_keyboard_buf_size_00107:
;source-doc/keyboard/kyb-init.c:111: else
ld hl, (_read_index)
ld a,0x08
sub l
ld hl, (_write_index)
add a, l
ld e, a
l_keyboard_buf_size_00109:
;source-doc/keyboard/kyb-init.c:120:
l_keyboard_buf_size_00108:
;source-doc/keyboard/kyb-init.c:113:
xor a
xor a
ex de, hl
;source-doc/keyboard/kyb-init.c:121: return (uint16_t)alt_size << 8 | (uint16_t)size;
;source-doc/keyboard/kyb-init.c:114: return (uint16_t)alt_size << 8 | (uint16_t)size;
ret
;source-doc/keyboard/kyb-init.c:123:
;source-doc/keyboard/kyb-init.c:116:
; ---------------------------------
; Function keyboard_buf_get_next
; ---------------------------------
@ -365,40 +351,40 @@ _keyboard_buf_get_next:
add ix,sp
push af
push af
;source-doc/keyboard/kyb-init.c:124: uint32_t keyboard_buf_get_next() {
;source-doc/keyboard/kyb-init.c:117: 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:125: if (write_index == read_index) // Check if buffer is empty
;source-doc/keyboard/kyb-init.c:118: 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:127:
;source-doc/keyboard/kyb-init.c:120:
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:128: const uint8_t modifier_key = buffer[read_index].modifier_keys;
inc hl
ld c, (hl)
;source-doc/keyboard/kyb-init.c:129: const uint8_t key_code = buffer[read_index].key_code;
inc hl
ld b, (hl)
;source-doc/keyboard/kyb-init.c:121: const uint8_t modifier_key = buffer[read_index] >> 8;
;source-doc/keyboard/kyb-init.c:122: const uint8_t key_code = buffer[read_index] & 255;
ld a, (_read_index)
inc a
and 0x07
ld (_read_index),a
;source-doc/keyboard/kyb-init.c:136:
;source-doc/keyboard/kyb-init.c:129:
push bc
ld l, c
ld a, b
call _scancode_to_char
ld e, a
pop bc
;source-doc/keyboard/kyb-init.c:138: /* D = modifier, e-> char, H = 0, L=>code */
;source-doc/keyboard/kyb-init.c:131: /* D = modifier, e-> char, H = 0, L=>code */
xor a
ld (ix-1),b
xor a
@ -415,50 +401,50 @@ l_keyboard_buf_get_next_00102:
pop hl
push hl
l_keyboard_buf_get_next_00103:
;source-doc/keyboard/kyb-init.c:139: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code;
;source-doc/keyboard/kyb-init.c:132: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code;
ld sp, ix
pop ix
ret
;source-doc/keyboard/kyb-init.c:141:
;source-doc/keyboard/kyb-init.c:134:
; ---------------------------------
; Function keyboard_buf_flush
; ---------------------------------
_keyboard_buf_flush:
;source-doc/keyboard/kyb-init.c:142: void keyboard_buf_flush() {
;source-doc/keyboard/kyb-init.c:135: void keyboard_buf_flush() {
xor a
ld (_alt_read_index),a
ld (_alt_write_index),a
xor a
ld (_read_index),a
ld (_write_index),a
;source-doc/keyboard/kyb-init.c:145: uint8_t i = sizeof(previous);
;source-doc/keyboard/kyb-init.c:138: 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;
;source-doc/keyboard/kyb-init.c:139: uint8_t *a = (uint8_t *)previous;
;source-doc/keyboard/kyb-init.c:140: 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 {
;source-doc/keyboard/kyb-init.c:141: do {
xor a
ld (de), a
inc de
;source-doc/keyboard/kyb-init.c:149: *a++ = 0;
;source-doc/keyboard/kyb-init.c:142: *a++ = 0;
ld (hl),0x00
inc hl
;source-doc/keyboard/kyb-init.c:150: *b++ = 0;
;source-doc/keyboard/kyb-init.c:143: *b++ = 0;
djnz l_keyboard_buf_flush_00101
;source-doc/keyboard/kyb-init.c:151: } while (--i != 0);
;source-doc/keyboard/kyb-init.c:144: } while (--i != 0);
ret
;source-doc/keyboard/kyb-init.c:153:
;source-doc/keyboard/kyb-init.c:146:
; ---------------------------------
; Function keyboard_tick
; ---------------------------------
_keyboard_tick:
;source-doc/keyboard/kyb-init.c:154: void keyboard_tick(void) {
;source-doc/keyboard/kyb-init.c:147: void keyboard_tick(void) {
ld hl,_in_critical_usb_section
ld a, (hl)
or a
;source-doc/keyboard/kyb-init.c:155: if (is_in_critical_section())
;source-doc/keyboard/kyb-init.c:148: if (is_in_critical_section())
jr NZ,l_keyboard_tick_00112
;././source-doc/base-drv//ch376.h:110: #endif
ld l,0x0b
@ -471,7 +457,7 @@ _keyboard_tick:
ld a,0x1f
ld bc,_CH376_DATA_PORT
out (c), a
;source-doc/keyboard/kyb-init.c:158: ch_configure_nak_retry_disable();
;source-doc/keyboard/kyb-init.c:151: ch_configure_nak_retry_disable();
ld bc,_report+0
ld hl, (_keyboard_config)
ld a,0x08
@ -496,47 +482,40 @@ _keyboard_tick:
ld a,0xdf
ld bc,_CH376_DATA_PORT
out (c), a
;source-doc/keyboard/kyb-init.c:160: ch_configure_nak_retry_3s();
;source-doc/keyboard/kyb-init.c:153: ch_configure_nak_retry_3s();
ld hl,_result
ld a, (hl)
or a
jr NZ,l_keyboard_tick_00112
;source-doc/keyboard/kyb-init.c:161: if (result == 0) {
;source-doc/keyboard/kyb-init.c:154: if (result == 0) {
call _report_diff
or a
jr Z,l_keyboard_tick_00112
;source-doc/keyboard/kyb-init.c:162: if (report_diff()) {
;source-doc/keyboard/kyb-init.c:155: if (report_diff()) {
call _report_put
;source-doc/keyboard/kyb-init.c:164: uint8_t i = 6;
;source-doc/keyboard/kyb-init.c:157: 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)
;source-doc/keyboard/kyb-init.c:158: do {
ld a, b
dec a
push bc
ld l, c
call _keyboard_buf_put
pop bc
;source-doc/keyboard/kyb-init.c:166: keyboard_buf_put(report.bModifierKeys, report.keyCode[i-1]);
;source-doc/keyboard/kyb-init.c:159: keyboard_buf_put(i-1);
djnz l_keyboard_tick_00103
;source-doc/keyboard/kyb-init.c:167: } while (--i != 0);
;source-doc/keyboard/kyb-init.c:160: } while (--i != 0);
ld de,_previous
ld bc,0x0008
ld hl,_report
ldir
l_keyboard_tick_00112:
;source-doc/keyboard/kyb-init.c:170: }
;source-doc/keyboard/kyb-init.c:163: }
ret
_keyboard_config:
DEFW +0x0000
_buffer:
DEFB +0x00
DEFB +0x00
DEFW +0x0000
DEFB 0x00
DEFB 0x00
DEFB 0x00

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

@ -9,16 +9,13 @@
#define KEYBOARD_BUFFER_SIZE 8
#define KEYBOARD_BUFFER_SIZE_MASK 7
typedef struct {
uint8_t modifier_keys;
uint8_t key_code;
} keyboard_event;
typedef uint16_t modifier_and_code_t;
static device_config_keyboard *keyboard_config = 0;
static keyboard_event buffer[KEYBOARD_BUFFER_SIZE] = {{0}};
static uint8_t write_index = 0;
static uint8_t read_index = 0;
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;
@ -77,7 +74,8 @@ static void report_put() {
}
}
static void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) __sdcccall(1) {
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)
return; // ignore ???
@ -91,9 +89,8 @@ static void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code
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;
buffer[write_index].key_code = key_code;
write_index = next_write_index;
buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code;
write_index = next_write_index;
}
}
@ -106,12 +103,8 @@ uint16_t keyboard_buf_size() {
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];
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;
@ -125,8 +118,8 @@ uint32_t keyboard_buf_get_next() {
if (write_index == read_index) // Check if buffer is empty
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;
const uint8_t modifier_key = buffer[read_index] >> 8;
const uint8_t key_code = buffer[read_index] & 255;
read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
// D: Modifier keys - aka Keystate
@ -163,7 +156,7 @@ void keyboard_tick(void) {
report_put();
uint8_t i = 6;
do {
keyboard_buf_put(report.bModifierKeys, report.keyCode[i - 1]);
keyboard_buf_put(i - 1);
} while (--i != 0);
previous = report;
}

16
Source/HBIOS/ch376kyb.asm

@ -108,6 +108,16 @@ VEC_CHUKB_TICK:
; See USB HID Usage Tables specification for key codes
UKY_STAT:
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
HB_DI
call _keyboard_buf_size
HB_EI
@ -116,10 +126,11 @@ UKY_STAT:
ex af, af'
ld a, b
or a
pop iy ; retrieve the next que'd usb_report address
jr z, no_queued_reports
ld iy, (_queued_report)
ld a, (iy)
ex af, af'
ex af, af'
exx
ld b, (iy+2)
ld c, (iy+3)
@ -202,3 +213,4 @@ UKY_READ:
LD C, L
XOR A
RET

Loading…
Cancel
Save