ch376-native: optimised calling convention for usb_init

This commit is contained in:
Dean Netherton
2025-04-20 13:44:31 +10:00
parent 347b7e6a06
commit c350d153da
4 changed files with 32 additions and 45 deletions

View File

@@ -55,22 +55,22 @@ _wait_for_state:
add ix,sp
dec sp
ld (ix-1),a
ld b, l
;source-doc/base-drv/ch376_init.c:5: uint16_t r = state;
ld e, b
ld c,l
ld e,l
;source-doc/base-drv/ch376_init.c:7: for (uint8_t i = 0; i < loop_counter; i++) {
ld d,0x00
ld c,d
ld b,d
l_wait_for_state_00108:
ld a, c
ld a, b
sub (ix-1)
jr NC,l_wait_for_state_00106
;source-doc/base-drv/ch376_init.c:8: if (state == desired_state)
ld a,(ix+4)
sub b
sub c
jr Z,l_wait_for_state_00106
;source-doc/base-drv/ch376_init.c:11: if (i & 1)
bit 0, c
bit 0, b
jr Z,l_wait_for_state_00104
;source-doc/base-drv/ch376_init.c:12: print_string("\b $");
push bc
@@ -87,16 +87,14 @@ l_wait_for_state_00104:
l_wait_for_state_00105:
;source-doc/base-drv/ch376_init.c:16: r = usb_init(state);
push bc
push bc
inc sp
ld l, c
call _usb_init
inc sp
ex de, hl
pop bc
;source-doc/base-drv/ch376_init.c:17: state = r & 255;
ld b, e
ld c, e
;source-doc/base-drv/ch376_init.c:7: for (uint8_t i = 0; i < loop_counter; i++) {
inc c
inc b
jr l_wait_for_state_00108
l_wait_for_state_00106:
;source-doc/base-drv/ch376_init.c:20: return r;
@@ -142,16 +140,15 @@ l__chnative_init_00114:
ld l,0x00
ld a,(ix-1)
call _wait_for_state
ld b, e
;source-doc/base-drv/ch376_init.c:31: state = r & 255;
;source-doc/base-drv/ch376_init.c:33: print_string("\bPRESENT (VER $");
push bc
push de
ld hl,ch376_init_str_3
call _print_string
pop de
;source-doc/base-drv/ch376_init.c:35: r = usb_init(state);
inc sp
ld l, e
call _usb_init
inc sp
ex de, hl
;source-doc/base-drv/ch376_init.c:36: state = r & 255;
ld c, e
@@ -186,10 +183,9 @@ l__chnative_init_00102:
ld l, c
ld a,(ix-1)
call _wait_for_state
ld b, e
;source-doc/base-drv/ch376_init.c:49: state = r & 255;
;source-doc/base-drv/ch376_init.c:51: if (state == 2) {
ld a, b
ld a, e
sub 0x02
jr NZ,l__chnative_init_00104
;source-doc/base-drv/ch376_init.c:52: print_string("\bDISCONNECTED$");
@@ -199,20 +195,20 @@ l__chnative_init_00102:
jr l__chnative_init_00111
l__chnative_init_00104:
;source-doc/base-drv/ch376_init.c:56: print_string("\bCONNECTED$");
push bc
push de
ld hl,ch376_init_str_9
call _print_string
pop de
;source-doc/base-drv/ch376_init.c:59: r = usb_init(state);
inc sp
ld l, e
call _usb_init
inc sp
ex de, hl
;source-doc/base-drv/ch376_init.c:60: state = r & 255;
ld b, e
ld c, e
;source-doc/base-drv/ch376_init.c:62: for (uint8_t i = 0; i < loop_counter; i++) {
ld c,0x00
ld b,0x00
l__chnative_init_00109:
ld a, c
ld a, b
sub (ix-1)
jr NC,l__chnative_init_00111
;source-doc/base-drv/ch376_init.c:63: if (r >> 8 != 0)
@@ -226,16 +222,14 @@ l__chnative_init_00109:
pop bc
;source-doc/base-drv/ch376_init.c:67: r = usb_init(state);
push bc
push bc
inc sp
ld l, c
call _usb_init
inc sp
ex de, hl
pop bc
;source-doc/base-drv/ch376_init.c:68: state = r & 255;
ld b, e
ld c, e
;source-doc/base-drv/ch376_init.c:62: for (uint8_t i = 0; i < loop_counter; i++) {
inc c
inc b
jr l__chnative_init_00109
l__chnative_init_00111:
;source-doc/base-drv/ch376_init.c:70: }

View File

@@ -83,20 +83,17 @@ _usb_host_bus_reset:
ld l,0x00
;source-doc/base-drv/usb_init.c:20: }
ret
;source-doc/base-drv/usb_init.c:24: uint16_t usb_init(uint8_t state) {
;source-doc/base-drv/usb_init.c:24: uint16_t usb_init(uint8_t state) __z88dk_fastcall {
; ---------------------------------
; Function usb_init
; ---------------------------------
_usb_init:
push ix
ld ix,0
add ix,sp
;source-doc/base-drv/usb_init.c:27: USB_MODULE_LEDS = 0x03;
ld a,0x03
ld bc,_USB_MODULE_LEDS
out (c), a
;source-doc/base-drv/usb_init.c:29: if (state == 0) {
ld a,(ix+4)
ld a, l
or a
jr NZ,l_usb_init_00104
;source-doc/base-drv/usb_init.c:30: ch_cmd_reset_all();
@@ -124,7 +121,7 @@ l_usb_init_00102:
jr l_usb_init_00113
l_usb_init_00104:
;source-doc/base-drv/usb_init.c:41: if (state == 1) {
ld a,(ix+4)
ld a, l
dec a
jr NZ,l_usb_init_00106
;source-doc/base-drv/usb_init.c:42: r = ch_cmd_get_ic_version();
@@ -140,7 +137,7 @@ l_usb_init_00104:
jr l_usb_init_00113
l_usb_init_00106:
;source-doc/base-drv/usb_init.c:48: if (state == 2) {
ld a,(ix+4)
ld a, l
sub 0x02
jr NZ,l_usb_init_00159
ld a,0x01
@@ -196,15 +193,11 @@ l_usb_init_00112:
ld a,0x00
ld bc,_USB_MODULE_LEDS
out (c), a
;source-doc/base-drv/usb_init.c:68: return (uint16_t)count_of_devices() << 8 | state + 1;
;source-doc/base-drv/usb_init.c:68: return (uint16_t)count_of_devices() << 8 | 4;
call _count_of_devices
ld c,(ix+4)
ld b,0x00
inc bc
or b
ld h, a
ld l, c
xor a
ld l,0x04
l_usb_init_00113:
;source-doc/base-drv/usb_init.c:69: }
pop ix
ret

View File

@@ -21,7 +21,7 @@ static usb_error usb_host_bus_reset(void) {
#define ERASE_LINE "\x1B\x6C\r$"
uint16_t usb_init(uint8_t state) {
uint16_t usb_init(uint8_t state) __z88dk_fastcall {
uint8_t r;
USB_MODULE_LEDS = 0x03;
@@ -65,5 +65,5 @@ uint16_t usb_init(uint8_t state) {
}
enumerate_all_devices();
USB_MODULE_LEDS = 0x00;
return (uint16_t)count_of_devices() << 8 | state + 1;
return (uint16_t)count_of_devices() << 8 | 4;
}

View File

@@ -3,6 +3,6 @@
#include <stdint.h>
extern uint16_t usb_init(uint8_t state);
extern uint16_t usb_init(uint8_t state) __z88dk_fastcall;
#endif