diff --git a/.vscode/settings.json b/.vscode/settings.json index 7b5d2f7c..f7b26e28 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,6 +24,8 @@ "ch376inc.h": "c", "enumerate_storage.h": "c", "work-area.h": "c", - "hbios-driver-storage.h": "c" + "hbios-driver-storage.h": "c", + "class_hid_keyboard.h": "c", + "print.h": "c" } } diff --git a/Source/HBIOS/ch376-native/base-drv.s b/Source/HBIOS/ch376-native/base-drv.s index 2f0a85d6..a06f93b2 100644 --- a/Source/HBIOS/ch376-native/base-drv.s +++ b/Source/HBIOS/ch376-native/base-drv.s @@ -11,6 +11,5 @@ #include "ch376-native/base-drv/protocol.c.s" #include "ch376-native/base-drv/transfers.c.s" #include "ch376-native/base-drv/usb-base-drv.c.s" -#include "ch376-native/base-drv/usb_init.c.s" #include "ch376-native/base-drv/usb_state.c.s" #include "ch376-native/base-drv/work-area.c.s" diff --git a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s index e6eb0011..06098a7e 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s @@ -19,6 +19,9 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index f8e7284e..5ebcdd96 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -48,18 +48,171 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/usb-base-drv.c:4: uint8_t scsi_seek(const uint16_t dev_index, const uint32_t lba) { +;source-doc/base-drv/usb-base-drv.c:7: static usb_error usb_host_bus_reset(void) { ; --------------------------------- -; Function scsi_seek +; Function usb_host_bus_reset ; --------------------------------- -_scsi_seek: +_usb_host_bus_reset: +;source-doc/base-drv/usb-base-drv.c:8: ch_cmd_set_usb_mode(CH_MODE_HOST); + ld l,0x06 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb-base-drv.c:9: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/usb-base-drv.c:11: ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); + ld l,0x07 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb-base-drv.c:12: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/usb-base-drv.c:14: ch_cmd_set_usb_mode(CH_MODE_HOST); + ld l,0x06 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb-base-drv.c:15: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/ch376.h:111: #endif + ld l,0x0b + call _ch_command +;source-doc/base-drv/ch376.h:112: + ld a,0x25 + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/base-drv/ch376.h:113: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) + ld a,0xdf + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/base-drv/usb-base-drv.c:19: return USB_ERR_OK; + ld l,0x00 +;source-doc/base-drv/usb-base-drv.c:20: } + ret +;source-doc/base-drv/usb-base-drv.c:24: uint16_t usb_init(uint8_t state) __z88dk_fastcall { +; --------------------------------- +; Function usb_init +; --------------------------------- +_usb_init: +;source-doc/base-drv/usb-base-drv.c:27: USB_MODULE_LEDS = 0x03; + ld a,0x03 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:29: if (state == 0) { + ld a, l + or a + jr NZ,l_usb_init_00104 +;source-doc/base-drv/usb-base-drv.c:30: ch_cmd_reset_all(); + call _ch_cmd_reset_all +;source-doc/base-drv/usb-base-drv.c:31: delay_medium(); + call _delay_medium +;source-doc/base-drv/usb-base-drv.c:33: if (!ch_probe()) { + call _ch_probe + ld a, l +;source-doc/base-drv/usb-base-drv.c:34: USB_MODULE_LEDS = 0x00; + or a + jr NZ,l_usb_init_00102 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:35: return 0xFF00; + ld hl,0xff00 + jp l_usb_init_00113 +l_usb_init_00102: +;source-doc/base-drv/usb-base-drv.c:37: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:38: return 1; + ld hl,0x0001 + jr l_usb_init_00113 +l_usb_init_00104: +;source-doc/base-drv/usb-base-drv.c:41: if (state == 1) { + ld a, l + dec a + jr NZ,l_usb_init_00106 +;source-doc/base-drv/usb-base-drv.c:42: r = ch_cmd_get_ic_version(); + call _ch_cmd_get_ic_version +;source-doc/base-drv/usb-base-drv.c:44: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:45: return (uint16_t)r << 8 | 2; + xor a + ld h, l + ld l,0x02 + jr l_usb_init_00113 +l_usb_init_00106: +;source-doc/base-drv/usb-base-drv.c:48: if (state == 2) { + ld a, l + sub 0x02 + jr NZ,l_usb_init_00159 + ld a,0x01 + jr l_usb_init_00160 +l_usb_init_00159: + xor a +l_usb_init_00160: + ld c,a + or a + jr Z,l_usb_init_00110 +;source-doc/base-drv/usb-base-drv.c:49: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/usb-base-drv.c:51: r = ch_very_short_wait_int_and_get_(); + call _ch_very_short_wait_int_and_get + ld a, l +;source-doc/base-drv/usb-base-drv.c:53: if (r != USB_INT_CONNECT) { + sub 0x81 + jr Z,l_usb_init_00108 +;source-doc/base-drv/usb-base-drv.c:54: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:55: return 2; + ld hl,0x0002 + jr l_usb_init_00113 +l_usb_init_00108: +;source-doc/base-drv/usb-base-drv.c:58: return 3; + ld hl,0x0003 + jr l_usb_init_00113 +l_usb_init_00110: +;source-doc/base-drv/usb-base-drv.c:61: memset(get_usb_work_area(), 0, sizeof(_usb_state)); + ld b,0x32 + ld hl,_x + jr l_usb_init_00163 +l_usb_init_00162: + ld (hl),0x00 + inc hl +l_usb_init_00163: + ld (hl),0x00 + inc hl + djnz l_usb_init_00162 +;source-doc/base-drv/usb-base-drv.c:62: if (state != 2) { + bit 0, c + jr NZ,l_usb_init_00112 +;source-doc/base-drv/usb-base-drv.c:63: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/usb-base-drv.c:64: delay_medium(); + call _delay_medium +l_usb_init_00112: +;source-doc/base-drv/usb-base-drv.c:66: enumerate_all_devices(); + call _enumerate_all_devices +;source-doc/base-drv/usb-base-drv.c:67: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:68: return (uint16_t)count_of_devices() << 8 | 4; + call _count_of_devices + ld h, a + xor a + ld l,0x04 +l_usb_init_00113: +;source-doc/base-drv/usb-base-drv.c:69: } + ret +;source-doc/base-drv/usb-base-drv.c:71: uint8_t usb_scsi_seek(const uint16_t dev_index, const uint32_t lba) { +; --------------------------------- +; Function usb_scsi_seek +; --------------------------------- +_usb_scsi_seek: push ix ld ix,0 add ix,sp -;source-doc/base-drv/usb-base-drv.c:5: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); +;source-doc/base-drv/usb-base-drv.c:72: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); ld a,(ix+4) call _get_usb_device_config -;source-doc/base-drv/usb-base-drv.c:7: dev->current_lba = lba; +;source-doc/base-drv/usb-base-drv.c:74: dev->current_lba = lba; ld hl,0x000c add hl, de ex de, hl @@ -67,8 +220,8 @@ _scsi_seek: add hl, sp ld bc,0x0004 ldir -;source-doc/base-drv/usb-base-drv.c:8: return 0; +;source-doc/base-drv/usb-base-drv.c:75: return 0; ld l,0x00 -;source-doc/base-drv/usb-base-drv.c:9: } +;source-doc/base-drv/usb-base-drv.c:76: } pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s deleted file mode 100644 index b3429367..00000000 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ /dev/null @@ -1,465 +0,0 @@ -; -; Generated from source-doc/base-drv/usb-init.c.asm -- not to be modify directly -; -; -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.5.0 #15248 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -#IF 0 - -; .area _INITIALIZED removed by z88dk - - -#ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- -;-------------------------------------------------------- -; code -;-------------------------------------------------------- -;source-doc/base-drv/usb-init.c:8: static usb_error usb_host_bus_reset(void) { -; --------------------------------- -; Function usb_host_bus_reset -; --------------------------------- -_usb_host_bus_reset: -;source-doc/base-drv/usb-init.c:9: ch_cmd_set_usb_mode(CH_MODE_HOST); - ld l,0x06 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb-init.c:10: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/usb-init.c:12: ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); - ld l,0x07 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb-init.c:13: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/usb-init.c:15: ch_cmd_set_usb_mode(CH_MODE_HOST); - ld l,0x06 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb-init.c:16: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/ch376.h:110: #endif - ld l,0x0b - call _ch_command -;source-doc/base-drv/ch376.h:111: - ld a,0x25 - ld bc,_CH376_DATA_PORT - out (c), a -;source-doc/base-drv/ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) - ld a,0xdf - ld bc,_CH376_DATA_PORT - out (c), a -;source-doc/base-drv/usb-init.c:20: return USB_ERR_OK; - ld l,0x00 -;source-doc/base-drv/usb-init.c:21: } - ret -;source-doc/base-drv/usb-init.c:25: uint16_t ch376_init(uint8_t state) { -; --------------------------------- -; Function ch376_init -; --------------------------------- -_ch376_init: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/usb-init.c:28: USB_MODULE_LEDS = 0x03; - ld a,0x03 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:30: if (state == 0) { - ld a,(ix+4) - or a - jr NZ,l_ch376_init_00104 -;source-doc/base-drv/usb-init.c:31: ch_cmd_reset_all(); - call _ch_cmd_reset_all -;source-doc/base-drv/usb-init.c:32: delay_medium(); - call _delay_medium -;source-doc/base-drv/usb-init.c:34: if (!ch_probe()) { - call _ch_probe - ld a, l -;source-doc/base-drv/usb-init.c:35: USB_MODULE_LEDS = 0x00; - or a - jr NZ,l_ch376_init_00102 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:36: return 0xFF00; - ld hl,0xff00 - jp l_ch376_init_00113 -l_ch376_init_00102: -;source-doc/base-drv/usb-init.c:38: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:39: return 1; - ld hl,0x0001 - jr l_ch376_init_00113 -l_ch376_init_00104: -;source-doc/base-drv/usb-init.c:42: if (state == 1) { - ld a,(ix+4) - dec a - jr NZ,l_ch376_init_00106 -;source-doc/base-drv/usb-init.c:43: r = ch_cmd_get_ic_version(); - call _ch_cmd_get_ic_version -;source-doc/base-drv/usb-init.c:45: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:46: return (uint16_t)r << 8 | 2; - xor a - ld h, l - ld l,0x02 - jr l_ch376_init_00113 -l_ch376_init_00106: -;source-doc/base-drv/usb-init.c:49: if (state == 2) { - ld a,(ix+4) - sub 0x02 - jr NZ,l_ch376_init_00159 - ld a,0x01 - jr l_ch376_init_00160 -l_ch376_init_00159: - xor a -l_ch376_init_00160: - ld c,a - or a - jr Z,l_ch376_init_00110 -;source-doc/base-drv/usb-init.c:50: usb_host_bus_reset(); - call _usb_host_bus_reset -;source-doc/base-drv/usb-init.c:52: r = ch_very_short_wait_int_and_get_(); - call _ch_very_short_wait_int_and_get - ld a, l -;source-doc/base-drv/usb-init.c:54: if (r != USB_INT_CONNECT) { - sub 0x81 - jr Z,l_ch376_init_00108 -;source-doc/base-drv/usb-init.c:55: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:56: return 2; - ld hl,0x0002 - jr l_ch376_init_00113 -l_ch376_init_00108: -;source-doc/base-drv/usb-init.c:59: return 3; - ld hl,0x0003 - jr l_ch376_init_00113 -l_ch376_init_00110: -;source-doc/base-drv/usb-init.c:62: memset(get_usb_work_area(), 0, sizeof(_usb_state)); - ld b,0x35 - ld hl,_x - jr l_ch376_init_00163 -l_ch376_init_00162: - ld (hl),0x00 - inc hl -l_ch376_init_00163: - ld (hl),0x00 - inc hl - djnz l_ch376_init_00162 -;source-doc/base-drv/usb-init.c:63: if (state != 2) { - bit 0, c - jr NZ,l_ch376_init_00112 -;source-doc/base-drv/usb-init.c:64: usb_host_bus_reset(); - call _usb_host_bus_reset -;source-doc/base-drv/usb-init.c:65: delay_medium(); - call _delay_medium -l_ch376_init_00112: -;source-doc/base-drv/usb-init.c:67: enumerate_all_devices(); - call _enumerate_all_devices -;source-doc/base-drv/usb-init.c:68: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:69: return (uint16_t)count_of_devices() << 8 | state + 1; - call _count_of_devices - ld c,(ix+4) - ld b,0x00 - inc bc - or b - ld h, a - ld l, c -l_ch376_init_00113: -;source-doc/base-drv/usb-init.c:70: } - pop ix - ret -;source-doc/base-drv/usb-init.c:72: static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { -; --------------------------------- -; Function wait_for_state -; --------------------------------- -_wait_for_state: - push ix - ld ix,0 - add ix,sp - dec sp - ld (ix-1),a - ld b, l -;source-doc/base-drv/usb-init.c:73: uint16_t r = state; - ld e, b -;source-doc/base-drv/usb-init.c:75: for (uint8_t i = 0; i < loop_counter; i++) { - ld d,0x00 - ld c,d -l_wait_for_state_00108: - ld a, c - sub (ix-1) - jr NC,l_wait_for_state_00106 -;source-doc/base-drv/usb-init.c:76: if (state == desired_state) - ld a,(ix+4) - sub b - jr Z,l_wait_for_state_00106 -;source-doc/base-drv/usb-init.c:79: if (i & 1) - bit 0, c - jr Z,l_wait_for_state_00104 -;source-doc/base-drv/usb-init.c:80: print_string("\b $"); - push bc - ld hl,usb_init_str_0 - call _print_string - pop bc - jr l_wait_for_state_00105 -l_wait_for_state_00104: -;source-doc/base-drv/usb-init.c:82: print_string("\b*$"); - push bc - ld hl,usb_init_str_1 - call _print_string - pop bc -l_wait_for_state_00105: -;source-doc/base-drv/usb-init.c:84: r = ch376_init(state); - push bc - push bc - inc sp - call _ch376_init - inc sp - ex de, hl - pop bc -;source-doc/base-drv/usb-init.c:85: state = r & 255; - ld b, e -;source-doc/base-drv/usb-init.c:75: for (uint8_t i = 0; i < loop_counter; i++) { - inc c - jr l_wait_for_state_00108 -l_wait_for_state_00106: -;source-doc/base-drv/usb-init.c:88: return r; -;source-doc/base-drv/usb-init.c:89: } - inc sp - pop ix - pop hl - inc sp - jp (hl) -usb_init_str_0: - DEFB 0x08 - DEFM " $" - DEFB 0x00 -usb_init_str_1: - DEFB 0x08 - DEFM "*$" - DEFB 0x00 -;source-doc/base-drv/usb-init.c:91: void _chnative_init(bool forced) { -; --------------------------------- -; Function _chnative_init -; --------------------------------- -__chnative_init: - push ix - ld ix,0 - add ix,sp - dec sp -;source-doc/base-drv/usb-init.c:94: const uint8_t loop_counter = forced ? 40 : 5; - bit 0,(ix+4) - jr Z,l__chnative_init_00113 - ld a,0x28 - jr l__chnative_init_00114 -l__chnative_init_00113: - ld a,0x05 -l__chnative_init_00114: - ld (ix-1),a -;source-doc/base-drv/usb-init.c:96: print_string("\r\nCH376: *$"); - ld hl,usb_init_str_2 - call _print_string -;source-doc/base-drv/usb-init.c:98: r = wait_for_state(loop_counter, state, 1); - ld a,0x01 - push af - inc sp - ld l,0x00 - ld a,(ix-1) - call _wait_for_state - ld b, e -;source-doc/base-drv/usb-init.c:99: state = r & 255; -;source-doc/base-drv/usb-init.c:101: print_string("\bPRESENT (VER $"); - push bc - ld hl,usb_init_str_3 - call _print_string -;source-doc/base-drv/usb-init.c:103: r = ch376_init(state); - inc sp - call _ch376_init - inc sp - ex de, hl -;source-doc/base-drv/usb-init.c:104: state = r & 255; - ld c, e -;source-doc/base-drv/usb-init.c:105: if (state != 2) { - ld a, c - sub 0x02 - jr Z,l__chnative_init_00102 -;source-doc/base-drv/usb-init.c:106: print_string("\rCH376: $"); - ld hl,usb_init_str_4 - call _print_string -;source-doc/base-drv/usb-init.c:107: print_string("VERSION FAILURE\r\n$"); - ld hl,usb_init_str_5 - call _print_string -;source-doc/base-drv/usb-init.c:108: return; - jr l__chnative_init_00111 -l__chnative_init_00102: -;source-doc/base-drv/usb-init.c:111: print_hex(r >> 8); - push bc - ld l, d - call _print_hex -;source-doc/base-drv/usb-init.c:112: print_string("); $"); - ld hl,usb_init_str_6 - call _print_string -;source-doc/base-drv/usb-init.c:114: print_string("USB: *$"); - ld hl,usb_init_str_7 - call _print_string - pop bc -;source-doc/base-drv/usb-init.c:116: r = wait_for_state(loop_counter, state, 3); - ld a,0x03 - push af - inc sp - ld l, c - ld a,(ix-1) - call _wait_for_state - ld b, e -;source-doc/base-drv/usb-init.c:117: state = r & 255; -;source-doc/base-drv/usb-init.c:119: if (state == 2) { - ld a, b - sub 0x02 - jr NZ,l__chnative_init_00104 -;source-doc/base-drv/usb-init.c:120: print_string("\bDISCONNECTED$"); - ld hl,usb_init_str_8 - call _print_string -;source-doc/base-drv/usb-init.c:121: return; - jr l__chnative_init_00111 -l__chnative_init_00104: -;source-doc/base-drv/usb-init.c:124: print_string("\bCONNECTED$"); - push bc - ld hl,usb_init_str_9 - call _print_string -;source-doc/base-drv/usb-init.c:127: r = ch376_init(state); - inc sp - call _ch376_init - inc sp - ex de, hl -;source-doc/base-drv/usb-init.c:128: state = r & 255; - ld b, e -;source-doc/base-drv/usb-init.c:130: for (uint8_t i = 0; i < loop_counter; i++) { - ld c,0x00 -l__chnative_init_00109: - ld a, c - sub (ix-1) - jr NC,l__chnative_init_00111 -;source-doc/base-drv/usb-init.c:131: if (r >> 8 != 0) - ld a,0x00 - or d - jr NZ,l__chnative_init_00111 -;source-doc/base-drv/usb-init.c:134: print_string(".$"); - push bc - ld hl,usb_init_str_10 - call _print_string - pop bc -;source-doc/base-drv/usb-init.c:135: r = ch376_init(state); - push bc - push bc - inc sp - call _ch376_init - inc sp - ex de, hl - pop bc -;source-doc/base-drv/usb-init.c:136: state = r & 255; - ld b, e -;source-doc/base-drv/usb-init.c:130: for (uint8_t i = 0; i < loop_counter; i++) { - inc c - jr l__chnative_init_00109 -l__chnative_init_00111: -;source-doc/base-drv/usb-init.c:138: } - inc sp - pop ix - ret -usb_init_str_2: - DEFB 0x0d - DEFB 0x0a - DEFM "CH376: *$" - DEFB 0x00 -usb_init_str_3: - DEFB 0x08 - DEFM "PRESENT (VER $" - DEFB 0x00 -usb_init_str_4: - DEFB 0x0d - DEFM "CH376: $" - DEFB 0x00 -usb_init_str_5: - DEFM "VERSION FAILURE" - DEFB 0x0d - DEFB 0x0a - DEFM "$" - DEFB 0x00 -usb_init_str_6: - DEFM "); $" - DEFB 0x00 -usb_init_str_7: - DEFM "USB: *$" - DEFB 0x00 -usb_init_str_8: - DEFB 0x08 - DEFM "DISCONNECTED$" - DEFB 0x00 -usb_init_str_9: - DEFB 0x08 - DEFM "CONNECTED$" - DEFB 0x00 -usb_init_str_10: - DEFM ".$" - DEFB 0x00 -;source-doc/base-drv/usb-init.c:140: void chnative_init_force(void) { _chnative_init(true); } -; --------------------------------- -; Function chnative_init_force -; --------------------------------- -_chnative_init_force: - ld a,0x01 - push af - inc sp - call __chnative_init - inc sp - ret -;source-doc/base-drv/usb-init.c:142: void chnative_init(void) { _chnative_init(false); } -; --------------------------------- -; Function chnative_init -; --------------------------------- -_chnative_init: - xor a - push af - inc sp - call __chnative_init - inc sp - ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb_init.c.s b/Source/HBIOS/ch376-native/base-drv/usb_init.c.s deleted file mode 100644 index a8b35de0..00000000 --- a/Source/HBIOS/ch376-native/base-drv/usb_init.c.s +++ /dev/null @@ -1,203 +0,0 @@ -; -; Generated from source-doc/base-drv/usb_init.c.asm -- not to be modify directly -; -; -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.5.0 #15248 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -#IF 0 - -; .area _INITIALIZED removed by z88dk - - -#ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- -;-------------------------------------------------------- -; code -;-------------------------------------------------------- -;source-doc/base-drv/usb_init.c:7: static usb_error usb_host_bus_reset(void) { -; --------------------------------- -; Function usb_host_bus_reset -; --------------------------------- -_usb_host_bus_reset: -;source-doc/base-drv/usb_init.c:8: ch_cmd_set_usb_mode(CH_MODE_HOST); - ld l,0x06 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb_init.c:9: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/usb_init.c:11: ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); - ld l,0x07 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb_init.c:12: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/usb_init.c:14: ch_cmd_set_usb_mode(CH_MODE_HOST); - ld l,0x06 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb_init.c:15: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/ch376.h:110: #endif - ld l,0x0b - call _ch_command -;source-doc/base-drv/ch376.h:111: - ld a,0x25 - ld bc,_CH376_DATA_PORT - out (c), a -;source-doc/base-drv/ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) - ld a,0xdf - ld bc,_CH376_DATA_PORT - out (c), a -;source-doc/base-drv/usb_init.c:19: return USB_ERR_OK; - 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) __z88dk_fastcall { -; --------------------------------- -; Function usb_init -; --------------------------------- -_usb_init: -;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, l - or a - jr NZ,l_usb_init_00104 -;source-doc/base-drv/usb_init.c:30: ch_cmd_reset_all(); - call _ch_cmd_reset_all -;source-doc/base-drv/usb_init.c:31: delay_medium(); - call _delay_medium -;source-doc/base-drv/usb_init.c:33: if (!ch_probe()) { - call _ch_probe - ld a, l -;source-doc/base-drv/usb_init.c:34: USB_MODULE_LEDS = 0x00; - or a - jr NZ,l_usb_init_00102 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb_init.c:35: return 0xFF00; - ld hl,0xff00 - jp l_usb_init_00113 -l_usb_init_00102: -;source-doc/base-drv/usb_init.c:37: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb_init.c:38: return 1; - ld hl,0x0001 - jr l_usb_init_00113 -l_usb_init_00104: -;source-doc/base-drv/usb_init.c:41: if (state == 1) { - 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(); - call _ch_cmd_get_ic_version -;source-doc/base-drv/usb_init.c:44: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb_init.c:45: return (uint16_t)r << 8 | 2; - xor a - ld h, l - ld l,0x02 - jr l_usb_init_00113 -l_usb_init_00106: -;source-doc/base-drv/usb_init.c:48: if (state == 2) { - ld a, l - sub 0x02 - jr NZ,l_usb_init_00159 - ld a,0x01 - jr l_usb_init_00160 -l_usb_init_00159: - xor a -l_usb_init_00160: - ld c,a - or a - jr Z,l_usb_init_00110 -;source-doc/base-drv/usb_init.c:49: usb_host_bus_reset(); - call _usb_host_bus_reset -;source-doc/base-drv/usb_init.c:51: r = ch_very_short_wait_int_and_get_(); - call _ch_very_short_wait_int_and_get - ld a, l -;source-doc/base-drv/usb_init.c:53: if (r != USB_INT_CONNECT) { - sub 0x81 - jr Z,l_usb_init_00108 -;source-doc/base-drv/usb_init.c:54: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb_init.c:55: return 2; - ld hl,0x0002 - jr l_usb_init_00113 -l_usb_init_00108: -;source-doc/base-drv/usb_init.c:58: return 3; - ld hl,0x0003 - jr l_usb_init_00113 -l_usb_init_00110: -;source-doc/base-drv/usb_init.c:61: memset(get_usb_work_area(), 0, sizeof(_usb_state)); - ld b,0x32 - ld hl,_x - jr l_usb_init_00163 -l_usb_init_00162: - ld (hl),0x00 - inc hl -l_usb_init_00163: - ld (hl),0x00 - inc hl - djnz l_usb_init_00162 -;source-doc/base-drv/usb_init.c:62: if (state != 2) { - bit 0, c - jr NZ,l_usb_init_00112 -;source-doc/base-drv/usb_init.c:63: usb_host_bus_reset(); - call _usb_host_bus_reset -;source-doc/base-drv/usb_init.c:64: delay_medium(); - call _delay_medium -l_usb_init_00112: -;source-doc/base-drv/usb_init.c:66: enumerate_all_devices(); - call _enumerate_all_devices -;source-doc/base-drv/usb_init.c:67: USB_MODULE_LEDS = 0x00; - 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 | 4; - call _count_of_devices - ld h, a - xor a - ld l,0x04 -l_usb_init_00113: -;source-doc/base-drv/usb_init.c:69: } - ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index 6c8e49a5..4fdc511a 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -48,44 +48,44 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/usb_state.c:13: uint8_t count_of_devices(void) __sdcccall(1) { +;source-doc/base-drv/usb_state.c:17: uint8_t count_of_devices(void) __sdcccall(1) { ; --------------------------------- ; Function count_of_devices ; --------------------------------- _count_of_devices: -;source-doc/base-drv/usb_state.c:14: _usb_state *const p = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:18: const device_config *p_config = first_device_config(p); +;source-doc/base-drv/usb_state.c:18: _usb_state *const p = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:22: const device_config *p_config = first_device_config(p); ld hl,_x call _first_device_config -;source-doc/base-drv/usb_state.c:19: while (p_config) { +;source-doc/base-drv/usb_state.c:23: while (p_config) { ld c,0x00 l_count_of_devices_00104: ld a, d or e jr Z,l_count_of_devices_00106 -;source-doc/base-drv/usb_state.c:20: const uint8_t type = p_config->type; +;source-doc/base-drv/usb_state.c:24: const uint8_t type = p_config->type; ld l, e ld h, d ld a, (hl) and 0x0f -;source-doc/base-drv/usb_state.c:22: if (type != USB_IS_HUB && type) +;source-doc/base-drv/usb_state.c:26: if (type != USB_IS_HUB && type) cp 0x0f jr Z,l_count_of_devices_00102 or a jr Z,l_count_of_devices_00102 -;source-doc/base-drv/usb_state.c:23: count++; +;source-doc/base-drv/usb_state.c:27: count++; inc c l_count_of_devices_00102: -;source-doc/base-drv/usb_state.c:26: p_config = next_device_config(p, p_config); +;source-doc/base-drv/usb_state.c:30: p_config = next_device_config(p, p_config); push bc ld hl,_x call _next_device_config pop bc jr l_count_of_devices_00104 l_count_of_devices_00106: -;source-doc/base-drv/usb_state.c:29: return count; +;source-doc/base-drv/usb_state.c:33: return count; ld a, c -;source-doc/base-drv/usb_state.c:30: } +;source-doc/base-drv/usb_state.c:34: } ret _device_config_sizes: DEFB +0x00 @@ -95,41 +95,41 @@ _device_config_sizes: DEFB +0x06 DEFB 0x00 DEFB 0x00 -;source-doc/base-drv/usb_state.c:33: device_config *find_first_free(void) { +;source-doc/base-drv/usb_state.c:37: device_config *find_first_free(void) { ; --------------------------------- ; Function find_first_free ; --------------------------------- _find_first_free: -;source-doc/base-drv/usb_state.c:34: _usb_state *const boot_state = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:37: device_config *p = first_device_config(boot_state); +;source-doc/base-drv/usb_state.c:38: _usb_state *const boot_state = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:41: device_config *p = first_device_config(boot_state); ld hl,_x call _first_device_config -;source-doc/base-drv/usb_state.c:38: while (p) { +;source-doc/base-drv/usb_state.c:42: while (p) { l_find_first_free_00103: ld a, d or e jr Z,l_find_first_free_00105 -;source-doc/base-drv/usb_state.c:39: if (p->type == 0) +;source-doc/base-drv/usb_state.c:43: if (p->type == 0) ld l, e ld h, d ld a, (hl) and 0x0f jr NZ,l_find_first_free_00102 -;source-doc/base-drv/usb_state.c:40: return p; +;source-doc/base-drv/usb_state.c:44: return p; ex de, hl jr l_find_first_free_00106 l_find_first_free_00102: -;source-doc/base-drv/usb_state.c:42: p = next_device_config(boot_state, p); +;source-doc/base-drv/usb_state.c:46: p = next_device_config(boot_state, p); ld hl,_x call _next_device_config jr l_find_first_free_00103 l_find_first_free_00105: -;source-doc/base-drv/usb_state.c:45: return NULL; +;source-doc/base-drv/usb_state.c:49: return NULL; ld hl,0x0000 l_find_first_free_00106: -;source-doc/base-drv/usb_state.c:46: } +;source-doc/base-drv/usb_state.c:50: } ret -;source-doc/base-drv/usb_state.c:48: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } +;source-doc/base-drv/usb_state.c:52: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } ; --------------------------------- ; Function first_device_config ; --------------------------------- @@ -138,24 +138,24 @@ _first_device_config: inc de inc de ret -;source-doc/base-drv/usb_state.c:50: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { +;source-doc/base-drv/usb_state.c:54: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { ; --------------------------------- ; Function next_device_config ; --------------------------------- _next_device_config: ld c, l ld b, h -;source-doc/base-drv/usb_state.c:51: if (p->type == 0) +;source-doc/base-drv/usb_state.c:55: if (p->type == 0) ld l, e ld h, d ld a, (hl) and 0x0f jr NZ,l_next_device_config_00102 -;source-doc/base-drv/usb_state.c:52: return NULL; +;source-doc/base-drv/usb_state.c:56: return NULL; ld de,0x0000 jr l_next_device_config_00105 l_next_device_config_00102: -;source-doc/base-drv/usb_state.c:54: const uint8_t size = device_config_sizes[p->type]; +;source-doc/base-drv/usb_state.c:58: const uint8_t size = device_config_sizes[p->type]; ld l, e ld h, d ld a, (hl) @@ -166,14 +166,14 @@ l_next_device_config_00102: adc a, +((_device_config_sizes) / 256) ld h, a ld a, (hl) -;source-doc/base-drv/usb_state.c:61: const uint8_t *_p = (uint8_t *)p; -;source-doc/base-drv/usb_state.c:62: device_config *const result = (device_config *)(_p + size); +;source-doc/base-drv/usb_state.c:65: const uint8_t *_p = (uint8_t *)p; +;source-doc/base-drv/usb_state.c:66: device_config *const result = (device_config *)(_p + size); add a, e ld e, a ld a,0x00 adc a, d ld d, a -;source-doc/base-drv/usb_state.c:64: if (result >= (device_config *)&usb_state->device_configs_end) +;source-doc/base-drv/usb_state.c:68: if (result >= (device_config *)&usb_state->device_configs_end) ld hl,0x0062 add hl, bc ld a, e @@ -181,20 +181,20 @@ l_next_device_config_00102: ld a, d sbc a, h ret C -;source-doc/base-drv/usb_state.c:65: return NULL; +;source-doc/base-drv/usb_state.c:69: return NULL; ld de,0x0000 -;source-doc/base-drv/usb_state.c:67: return result; +;source-doc/base-drv/usb_state.c:71: return result; l_next_device_config_00105: -;source-doc/base-drv/usb_state.c:68: } +;source-doc/base-drv/usb_state.c:72: } ret -;source-doc/base-drv/usb_state.c:71: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { +;source-doc/base-drv/usb_state.c:75: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { ; --------------------------------- ; Function get_usb_device_config ; --------------------------------- _get_usb_device_config: ld c, a -;source-doc/base-drv/usb_state.c:72: const _usb_state *const usb_state = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:76: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { +;source-doc/base-drv/usb_state.c:76: const _usb_state *const usb_state = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:80: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc ld hl,_x call _first_device_config @@ -204,29 +204,58 @@ l_get_usb_device_config_00107: ld a, d or e jr Z,l_get_usb_device_config_00105 -;source-doc/base-drv/usb_state.c:77: if (p->type != USB_NOT_SUPPORTED) { +;source-doc/base-drv/usb_state.c:81: if (p->type != USB_NOT_SUPPORTED) { ld l, e ld h, d ld a, (hl) and 0x0f jr Z,l_get_usb_device_config_00108 -;source-doc/base-drv/usb_state.c:78: if (counter == device_index) +;source-doc/base-drv/usb_state.c:82: if (counter == device_index) ld a, c sub b -;source-doc/base-drv/usb_state.c:79: return p; +;source-doc/base-drv/usb_state.c:83: return p; jr Z,l_get_usb_device_config_00109 -;source-doc/base-drv/usb_state.c:80: counter++; +;source-doc/base-drv/usb_state.c:84: counter++; inc b l_get_usb_device_config_00108: -;source-doc/base-drv/usb_state.c:76: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { +;source-doc/base-drv/usb_state.c:80: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc ld hl,_x call _next_device_config pop bc jr l_get_usb_device_config_00107 l_get_usb_device_config_00105: -;source-doc/base-drv/usb_state.c:84: return NULL; // is not a usb device +;source-doc/base-drv/usb_state.c:88: return NULL; // is not a usb device ld de,0x0000 l_get_usb_device_config_00109: -;source-doc/base-drv/usb_state.c:85: } +;source-doc/base-drv/usb_state.c:89: } + ret +;source-doc/base-drv/usb_state.c:91: usb_device_type get_usb_device_type(const uint8_t dev_index) { +; --------------------------------- +; Function get_usb_device_type +; --------------------------------- +_get_usb_device_type: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/usb_state.c:92: const device_config *dev = get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config + ld l, e +;source-doc/base-drv/usb_state.c:94: if (dev == NULL) + ld a,d + ld h,a + or e + jr NZ,l_get_usb_device_type_00102 +;source-doc/base-drv/usb_state.c:95: return -1; + ld l,0xff + jr l_get_usb_device_type_00103 +l_get_usb_device_type_00102: +;source-doc/base-drv/usb_state.c:97: return dev->type; + ld a, (hl) + and 0x0f + ld l, a +l_get_usb_device_type_00103: +;source-doc/base-drv/usb_state.c:98: } + pop ix ret diff --git a/Source/HBIOS/ch376-native/keyboard.s b/Source/HBIOS/ch376-native/keyboard.s index 1925a521..af3a439c 100644 --- a/Source/HBIOS/ch376-native/keyboard.s +++ b/Source/HBIOS/ch376-native/keyboard.s @@ -2,3 +2,4 @@ #include "ch376-native/keyboard/class_hid.c.s" #include "ch376-native/keyboard/class_hid_keyboard.c.s" #include "ch376-native/keyboard/kyb-init.c.s" +#include "ch376-native/keyboard/kyb_driver.c.s" diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 24eb9429..05982773 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -33,26 +33,6 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk -_keyboard_config: - DEFS 2 -_buffer: - DEFS 16 -_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: - DEFS 8 #ENDIF @@ -68,80 +48,66 @@ _previous: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:27: +;source-doc/keyboard/kyb-init.c:6: uint8_t keyboard_init(void) __sdcccall(1) { ; --------------------------------- ; Function keyboard_init ; --------------------------------- _keyboard_init: -;source-doc/keyboard/kyb-init.c:28: uint8_t keyboard_init(void) __sdcccall(1) { - ld c,0x01 -;source-doc/keyboard/kyb-init.c:29: uint8_t index = 1; - ld hl,0x0000 - ld (_keyboard_config),hl -;source-doc/keyboard/kyb-init.c:31: + push ix + 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 b,0x01 -l_keyboard_init_00105: -;source-doc/keyboard/kyb-init.c:32: do { + ld (ix-1),b +l_keyboard_init_00103: +;source-doc/keyboard/kyb-init.c:10: usb_device_type t = get_usb_device_type(index); push bc - ld a, b - call _get_usb_device_config - ex de, hl + push bc + inc sp + call _get_usb_device_type + inc sp + ld a, l pop bc - ld (_keyboard_config), hl -;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:37: - ld hl, (_keyboard_config) - ld a, (hl) - and 0x0f -;source-doc/keyboard/kyb-init.c:39: +;source-doc/keyboard/kyb-init.c:12: if (t == USB_IS_KEYBOARD) { sub 0x04 - jr NZ,l_keyboard_init_00106 -;source-doc/keyboard/kyb-init.c:40: if (t == USB_IS_KEYBOARD) { - push bc + jr NZ,l_keyboard_init_00104 +;source-doc/keyboard/kyb-init.c:13: print_string("\r\nUSB: KEYBOARD @ $"); ld hl,kyb_init_str_0 call _print_string - pop bc -;source-doc/keyboard/kyb-init.c:41: print_string("\r\nUSB: KEYBOARD @ $"); +;source-doc/keyboard/kyb-init.c:14: print_uint16(index); + ld l,(ix-1) ld h,0x00 - ld l, c call _print_uint16 -;source-doc/keyboard/kyb-init.c:42: print_uint16(index); +;source-doc/keyboard/kyb-init.c:15: print_string(" $"); ld hl,kyb_init_str_1 call _print_string -;source-doc/keyboard/kyb-init.c:44: - ld a,0x01 +;source-doc/keyboard/kyb-init.c:17: usb_kyb_init(index); + ld a,(ix-1) push af inc sp - ld hl, (_keyboard_config) - call _hid_set_protocol -;source-doc/keyboard/kyb-init.c:45: hid_set_protocol(keyboard_config, 1); - ld a,0x80 - push af + call _usb_kyb_init inc sp - ld hl, (_keyboard_config) - call _hid_set_idle -;source-doc/keyboard/kyb-init.c:46: hid_set_idle(keyboard_config, 0x80); +;source-doc/keyboard/kyb-init.c:18: return 1; ld a,0x01 - jr l_keyboard_init_00108 -l_keyboard_init_00106: -;source-doc/keyboard/kyb-init.c:48: } + jr l_keyboard_init_00106 +l_keyboard_init_00104: +;source-doc/keyboard/kyb-init.c:20: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc b - ld a,b - ld c,b + ld (ix-1),b + ld a, b sub 0x07 - jr NZ,l_keyboard_init_00105 -l_keyboard_init_00107: -;source-doc/keyboard/kyb-init.c:50: + jr NZ,l_keyboard_init_00103 +;source-doc/keyboard/kyb-init.c:22: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); ld hl,kyb_init_str_2 call _print_string -;source-doc/keyboard/kyb-init.c:51: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/kyb-init.c:23: return 0; xor a -l_keyboard_init_00108: -;source-doc/keyboard/kyb-init.c:52: return 0; +l_keyboard_init_00106: +;source-doc/keyboard/kyb-init.c:24: } + inc sp + pop ix ret kyb_init_str_0: DEFB 0x0d @@ -156,470 +122,3 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:54: -; --------------------------------- -; Function report_diff -; --------------------------------- -_report_diff: -;source-doc/keyboard/kyb-init.c:55: static uint8_t report_diff() __sdcccall(1) { - ld de,_report+0 -;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: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:61: if (*a++ != *b++) - ld a,0x01 - jr l_report_diff_00106 -l_report_diff_00104: -;source-doc/keyboard/kyb-init.c:62: return true; - djnz l_report_diff_00103 -;source-doc/keyboard/kyb-init.c:64: - xor a -l_report_diff_00106: -;source-doc/keyboard/kyb-init.c:65: return false; - ret -;source-doc/keyboard/kyb-init.c:67: -; --------------------------------- -; Function report_put -; --------------------------------- -_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:70: - ld a,(_alt_read_index) - sub c - ret Z -;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 - 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:72: reports[alt_write_index] = report; - ld hl,_alt_write_index - ld (hl), c -;source-doc/keyboard/kyb-init.c:74: } - ret -;source-doc/keyboard/kyb-init.c:76: -; --------------------------------- -; Function keyboard_buf_put -; --------------------------------- -_keyboard_buf_put: - ld c, a -;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:79: if (key_code >= 0x80 || key_code == 0) - jr Z,l_keyboard_buf_put_00111 -;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:85: do { - ld a, (hl) - inc hl - sub c -;source-doc/keyboard/kyb-init.c:86: if (*a++ == key_code) - ret Z -;source-doc/keyboard/kyb-init.c:87: return; - djnz l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:89: - ld a, (_write_index) - inc a - and 0x07 - 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 b - ret Z -;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 - 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), b -l_keyboard_buf_put_00111: -;source-doc/keyboard/kyb-init.c:94: } - ret -;source-doc/keyboard/kyb-init.c:96: -; --------------------------------- -; Function keyboard_buf_size -; --------------------------------- -_keyboard_buf_size: -;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: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:103: 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:105: - ld a, d - or a - 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_00105: -;source-doc/keyboard/kyb-init.c:108: - ld a,(_write_index) - ld hl,_read_index - sub (hl) - 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_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_00108: -;source-doc/keyboard/kyb-init.c:113: - xor a - xor a - ex de, hl -;source-doc/keyboard/kyb-init.c:114: return (uint16_t)alt_size << 8 | (uint16_t)size; - ret -;source-doc/keyboard/kyb-init.c:116: -; --------------------------------- -; Function keyboard_buf_get_next -; --------------------------------- -_keyboard_buf_get_next: - push ix - ld ix,0 - add ix,sp - push af - push af -;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: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:120: - ld bc,_buffer+0 - ld hl, (_read_index) - ld h,0x00 - add hl, hl - add hl, bc - ld c, (hl) - 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:129: - push bc - ld l, c - ld a, b - call _scancode_to_char - ld e, a - pop bc -;source-doc/keyboard/kyb-init.c:131: /* D = modifier, e-> char, H = 0, L=>code */ - xor a - ld (ix-1),b - xor a - ld (ix-4),a - ld (ix-3),a - ld (ix-2),a - xor a - ld d,(ix-1) - ld (ix-4),c - xor a - ld (ix-3),a - ld (ix-2),a - ld (ix-1),a - pop hl - push hl -l_keyboard_buf_get_next_00103: -;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:134: -; --------------------------------- -; Function keyboard_buf_flush -; --------------------------------- -_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:138: uint8_t i = sizeof(previous); - ld de,_previous+0 -;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:141: do { - xor a - ld (de), a - inc de -;source-doc/keyboard/kyb-init.c:142: *a++ = 0; - ld (hl),0x00 - inc hl -;source-doc/keyboard/kyb-init.c:143: *b++ = 0; - djnz l_keyboard_buf_flush_00101 -;source-doc/keyboard/kyb-init.c:144: } while (--i != 0); - ret -;source-doc/keyboard/kyb-init.c:146: -; --------------------------------- -; Function keyboard_tick -; --------------------------------- -_keyboard_tick: -;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:148: 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 -;././source-doc/base-drv//ch376.h:111: - ld a,0x25 - ld bc,_CH376_DATA_PORT - out (c), a -;././source-doc/base-drv//ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) - ld a,0x1f - ld bc,_CH376_DATA_PORT - out (c), a -;source-doc/keyboard/kyb-init.c:151: ch_configure_nak_retry_disable(); - ld bc,_report+0 - ld hl, (_keyboard_config) - ld a,0x08 - push af - inc sp - push bc - push hl - call _usbdev_dat_in_trnsfer_0 - pop af - pop af - inc sp - ld a, l - ld (_result), a -;././source-doc/base-drv//ch376.h:110: #endif - ld l,0x0b - call _ch_command -;././source-doc/base-drv//ch376.h:111: - ld a,0x25 - ld bc,_CH376_DATA_PORT - out (c), a -;././source-doc/base-drv//ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) - ld a,0xdf - ld bc,_CH376_DATA_PORT - out (c), a -;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:154: if (result == 0) { - call _report_diff - or a - jr Z,l_keyboard_tick_00112 -;source-doc/keyboard/kyb-init.c:155: if (report_diff()) { - call _report_put -;source-doc/keyboard/kyb-init.c:157: uint8_t i = 6; - ld b,0x06 -l_keyboard_tick_00103: -;source-doc/keyboard/kyb-init.c:158: do { - ld a, b - dec a - push bc - call _keyboard_buf_put - pop bc -;source-doc/keyboard/kyb-init.c:159: keyboard_buf_put(i - 1); - djnz l_keyboard_tick_00103 -;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:163: } - ret -_keyboard_config: - DEFW +0x0000 -_buffer: - DEFW +0x0000 - 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 -_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 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 -_previous: - DEFB +0x00 - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s new file mode 100644 index 00000000..0ede7fe4 --- /dev/null +++ b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s @@ -0,0 +1,583 @@ +; +; Generated from source-doc/keyboard/kyb_driver.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_keyboard_config: + DEFS 2 +_buffer: + DEFS 16 +_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: + DEFS 8 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/keyboard/kyb_driver.c:26: +; --------------------------------- +; Function report_diff +; --------------------------------- +_report_diff: +;source-doc/keyboard/kyb_driver.c:27: static uint8_t report_diff() __sdcccall(1) { + ld de,_report+0 +;source-doc/keyboard/kyb_driver.c:28: uint8_t *a = (uint8_t *)&report; +;source-doc/keyboard/kyb_driver.c:31: uint8_t i = sizeof(report); + ld b,0x08 + ld hl,_previous +l_report_diff_00103: +;source-doc/keyboard/kyb_driver.c:32: do { + ld a, (de) + inc de + ld c, (hl) + inc hl + sub c + jr Z,l_report_diff_00104 +;source-doc/keyboard/kyb_driver.c:33: if (*a++ != *b++) + ld a,0x01 + jr l_report_diff_00106 +l_report_diff_00104: +;source-doc/keyboard/kyb_driver.c:34: return true; + djnz l_report_diff_00103 +;source-doc/keyboard/kyb_driver.c:36: + xor a +l_report_diff_00106: +;source-doc/keyboard/kyb_driver.c:37: return false; + ret +;source-doc/keyboard/kyb_driver.c:39: +; --------------------------------- +; Function report_put +; --------------------------------- +_report_put: +;source-doc/keyboard/kyb_driver.c:40: static void report_put() { + ld a, (_alt_write_index) + inc a + and 0x07 + ld c, a +;source-doc/keyboard/kyb_driver.c:42: + ld a,(_alt_read_index) + sub c + ret Z +;source-doc/keyboard/kyb_driver.c:43: 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_driver.c:44: reports[alt_write_index] = report; + ld hl,_alt_write_index + ld (hl), c +;source-doc/keyboard/kyb_driver.c:46: } + ret +;source-doc/keyboard/kyb_driver.c:48: +; --------------------------------- +; Function keyboard_buf_put +; --------------------------------- +_keyboard_buf_put: + ld c, a +;source-doc/keyboard/kyb_driver.c:49: 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_driver.c:50: 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_driver.c:51: if (key_code >= 0x80 || key_code == 0) + jr Z,l_keyboard_buf_put_00111 +;source-doc/keyboard/kyb_driver.c:55: uint8_t i = 6; +;source-doc/keyboard/kyb_driver.c:56: uint8_t *a = previous.keyCode; + ld b,0x06 + ld hl,+(_previous + 2) +l_keyboard_buf_put_00106: +;source-doc/keyboard/kyb_driver.c:57: do { + ld a, (hl) + inc hl + sub c +;source-doc/keyboard/kyb_driver.c:58: if (*a++ == key_code) + ret Z +;source-doc/keyboard/kyb_driver.c:59: return; + djnz l_keyboard_buf_put_00106 +;source-doc/keyboard/kyb_driver.c:61: + ld a, (_write_index) + inc a + and 0x07 + ld b, a +;source-doc/keyboard/kyb_driver.c:62: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + ld a,(_read_index) + sub b + ret Z +;source-doc/keyboard/kyb_driver.c:63: 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 + 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_driver.c:64: buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; + ld hl,_write_index + ld (hl), b +l_keyboard_buf_put_00111: +;source-doc/keyboard/kyb_driver.c:66: } + ret +;source-doc/keyboard/kyb_driver.c:68: +; --------------------------------- +; Function usb_kyb_buf_size +; --------------------------------- +_usb_kyb_buf_size: +;source-doc/keyboard/kyb_driver.c:72: + 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:73: if (alt_write_index >= alt_read_index) + 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:75: else + 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:77: + ld a, d + or a + jr Z,l_usb_kyb_buf_size_00105 +;source-doc/keyboard/kyb_driver.c:78: if (alt_size != 0) + 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:80: + ld a,(_write_index) + ld hl,_read_index + sub (hl) + jr C,l_usb_kyb_buf_size_00107 +;source-doc/keyboard/kyb_driver.c:81: if (write_index >= read_index) + 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:83: else + 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:85: + xor a + xor a + ex de, hl +;source-doc/keyboard/kyb_driver.c:86: return (uint16_t)alt_size << 8 | (uint16_t)size; + ret +;source-doc/keyboard/kyb_driver.c:88: +; --------------------------------- +; Function usb_kyb_buf_get_next +; --------------------------------- +_usb_kyb_buf_get_next: + push ix + ld ix,0 + add ix,sp + push af + push af +;source-doc/keyboard/kyb_driver.c:89: uint32_t usb_kyb_buf_get_next() { + 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:90: if (write_index == read_index) // Check if buffer is empty + 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:92: + ld bc,_buffer+0 + ld hl, (_read_index) + ld h,0x00 + add hl, hl + add hl, bc + ld c, (hl) + inc hl + ld b, (hl) +;source-doc/keyboard/kyb_driver.c:93: const uint8_t modifier_key = buffer[read_index] >> 8; +;source-doc/keyboard/kyb_driver.c:94: 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_driver.c:101: + push bc + ld l, c + ld a, b + call _scancode_to_char + ld e, a + pop bc +;source-doc/keyboard/kyb_driver.c:103: /* D = modifier, e-> char, H = 0, L=>code */ + xor a + ld (ix-1),b + xor a + ld (ix-4),a + ld (ix-3),a + ld (ix-2),a + xor a + ld d,(ix-1) + ld (ix-4),c + xor a + ld (ix-3),a + ld (ix-2),a + ld (ix-1),a + pop hl + push hl +l_usb_kyb_buf_get_next_00103: +;source-doc/keyboard/kyb_driver.c:104: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; + ld sp, ix + pop ix + ret +;source-doc/keyboard/kyb_driver.c:106: +; --------------------------------- +; Function usb_kyb_flush +; --------------------------------- +_usb_kyb_flush: +;source-doc/keyboard/kyb_driver.c:107: void usb_kyb_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_driver.c:110: uint8_t i = sizeof(previous); + ld de,_previous+0 +;source-doc/keyboard/kyb_driver.c:111: uint8_t *a = (uint8_t *)previous; +;source-doc/keyboard/kyb_driver.c:112: uint8_t *b = (uint8_t *)report; + ld b,0x08 + ld hl,_report +l_usb_kyb_flush_00101: +;source-doc/keyboard/kyb_driver.c:113: do { + xor a + ld (de), a + inc de +;source-doc/keyboard/kyb_driver.c:114: *a++ = 0; + ld (hl),0x00 + inc hl +;source-doc/keyboard/kyb_driver.c:115: *b++ = 0; + djnz l_usb_kyb_flush_00101 +;source-doc/keyboard/kyb_driver.c:116: } while (--i != 0); + ret +;source-doc/keyboard/kyb_driver.c:118: +; --------------------------------- +; Function usb_kyb_tick +; --------------------------------- +_usb_kyb_tick: +;source-doc/keyboard/kyb_driver.c:119: void usb_kyb_tick(void) { + ld hl,_in_critical_usb_section + ld a, (hl) + or a +;source-doc/keyboard/kyb_driver.c:120: if (is_in_critical_section()) + jr NZ,l_usb_kyb_tick_00112 +;././source-doc/base-drv//ch376.h:111: #endif + ld l,0x0b + call _ch_command +;././source-doc/base-drv//ch376.h:112: + ld a,0x25 + ld bc,_CH376_DATA_PORT + out (c), a +;././source-doc/base-drv//ch376.h:113: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) + ld a,0x1f + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/keyboard/kyb_driver.c:123: ch_configure_nak_retry_disable(); + ld bc,_report+0 + ld hl, (_keyboard_config) + ld a,0x08 + push af + inc sp + push bc + push hl + call _usbdev_dat_in_trnsfer_0 + pop af + pop af + inc sp + ld a, l + ld (_result), a +;././source-doc/base-drv//ch376.h:111: #endif + ld l,0x0b + call _ch_command +;././source-doc/base-drv//ch376.h:112: + ld a,0x25 + ld bc,_CH376_DATA_PORT + out (c), a +;././source-doc/base-drv//ch376.h:113: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) + ld a,0xdf + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/keyboard/kyb_driver.c:125: ch_configure_nak_retry_3s(); + ld hl,_result + ld a, (hl) + or a + jr NZ,l_usb_kyb_tick_00112 +;source-doc/keyboard/kyb_driver.c:126: if (result == 0) { + call _report_diff + or a + jr Z,l_usb_kyb_tick_00112 +;source-doc/keyboard/kyb_driver.c:127: if (report_diff()) { + call _report_put +;source-doc/keyboard/kyb_driver.c:129: uint8_t i = 6; + ld b,0x06 +l_usb_kyb_tick_00103: +;source-doc/keyboard/kyb_driver.c:130: do { + ld a, b + dec a + push bc + call _keyboard_buf_put + pop bc +;source-doc/keyboard/kyb_driver.c:131: keyboard_buf_put(i - 1); + djnz l_usb_kyb_tick_00103 +;source-doc/keyboard/kyb_driver.c:132: } while (--i != 0); + ld de,_previous + ld bc,0x0008 + ld hl,_report + ldir +l_usb_kyb_tick_00112: +;source-doc/keyboard/kyb_driver.c:135: } + ret +;source-doc/keyboard/kyb_driver.c:137: +; --------------------------------- +; Function usb_kyb_init +; --------------------------------- +_usb_kyb_init: + push ix + ld ix,0 + add ix,sp +;source-doc/keyboard/kyb_driver.c:139: uint8_t result; + ld a,(ix+4) + call _get_usb_device_config + ex de, hl + ld (_keyboard_config), hl +;source-doc/keyboard/kyb_driver.c:141: + 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:142: if (keyboard_config == NULL) + ld l,0x0f + jr l_usb_kyb_init_00106 +l_usb_kyb_init_00102: +;source-doc/keyboard/kyb_driver.c:144: + 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:145: CHECK(hid_set_protocol(keyboard_config, 1)); + ld a,0x80 + push af + inc sp + ld hl, (_keyboard_config) + call _hid_set_idle + ld l, a +;source-doc/keyboard/kyb_driver.c:147: +;source-doc/keyboard/kyb_driver.c:148: done: +l_usb_kyb_init_00105: +l_usb_kyb_init_00106: +;source-doc/keyboard/kyb_driver.c:149: return result; + pop ix + ret +_keyboard_config: + DEFW +0x0000 +_buffer: + DEFW +0x0000 + 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 +_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 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 +_previous: + DEFB +0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv.s b/Source/HBIOS/ch376-native/scsi-drv.s index d43a4464..ed91cc53 100644 --- a/Source/HBIOS/ch376-native/scsi-drv.s +++ b/Source/HBIOS/ch376-native/scsi-drv.s @@ -1,3 +1,4 @@ ; Generated File -- not to be modify directly #include "ch376-native/scsi-drv/class_scsi.c.s" #include "ch376-native/scsi-drv/scsi-init.c.s" +#include "ch376-native/scsi-drv/scsi_driver.c.s" diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index 02c7bc98..3c142a8a 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -39,12 +39,8 @@ _next_tag: DEFS 2 _csw: DEFS 13 -_scsi_packet_read_capacity: - DEFS 12 _scsi_packet_request_sense: DEFS 12 -_cbw: - DEFS 27 #ENDIF @@ -295,69 +291,7 @@ l_do_scsi_cmd_00120: ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:54: usb_error scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { -; --------------------------------- -; Function scsi_read_capacity -; --------------------------------- -_scsi_read_capacity: - push ix - ld ix,0 - add ix,sp - ld hl, -27 - add hl, sp - ld sp, hl -;source-doc/scsi-drv/class_scsi.c:55: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config -;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw = scsi_command_block_wrapper; - push de - ld hl,2 - add hl, sp - ex de, hl - ld bc,0x000f - ld hl,_scsi_command_block_wrapper - ldir - pop de -;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.read_capacity = scsi_packet_read_capacity; - push de - ld hl,17 - add hl, sp - ex de, hl - ld bc,0x000c - ld hl,_scsi_packet_read_capacity - ldir - pop de -;source-doc/scsi-drv/class_scsi.c:61: cbw_scsi.cbw.bCBWLUN = 0; - ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:62: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); - ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:63: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); - ld (ix-19),0x08 - xor a - ld (ix-18),a - ld (ix-17),a - ld (ix-16),a -;source-doc/scsi-drv/class_scsi.c:65: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); - ld c,(ix+6) - ld b,(ix+7) - xor a - push af - inc sp - push bc - ld hl,3 - add hl, sp - push hl - push de - call _do_scsi_cmd - pop af - pop af - pop af - inc sp -;source-doc/scsi-drv/class_scsi.c:66: } - ld sp, ix - pop ix - ret -;source-doc/scsi-drv/class_scsi.c:84: static usb_error scsi_test(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:52: usb_error scsi_test(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_test ; --------------------------------- @@ -368,7 +302,7 @@ _scsi_test: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:54: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -377,7 +311,7 @@ _scsi_test: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:87: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); +;source-doc/scsi-drv/class_scsi.c:55: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); ld hl,17 add hl, sp ld b,0x06 @@ -389,11 +323,11 @@ l_scsi_test_00103: inc hl djnz l_scsi_test_00103 pop bc -;source-doc/scsi-drv/class_scsi.c:89: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:57: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:90: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); +;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:91: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,0x0008 add hl, bc xor a @@ -404,7 +338,7 @@ l_scsi_test_00103: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:93: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/class_scsi.c:61: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -415,11 +349,11 @@ l_scsi_test_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:94: } +;source-doc/scsi-drv/class_scsi.c:62: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:98: static usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +;source-doc/scsi-drv/class_scsi.c:66: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { ; --------------------------------- ; Function scsi_request_sense ; --------------------------------- @@ -430,7 +364,7 @@ _scsi_request_sense: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:68: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -439,7 +373,7 @@ _scsi_request_sense: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:101: cbw_scsi.request_sense = scsi_packet_request_sense; +;source-doc/scsi-drv/class_scsi.c:69: cbw_scsi.request_sense = scsi_packet_request_sense; ld hl,17 add hl, sp ex de, hl @@ -447,11 +381,11 @@ _scsi_request_sense: ld hl,_scsi_packet_request_sense ldir pop bc -;source-doc/scsi-drv/class_scsi.c:103: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:71: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:104: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); +;source-doc/scsi-drv/class_scsi.c:72: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:105: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); +;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); ld hl,0x0008 add hl, bc ld (hl),0x12 @@ -462,7 +396,7 @@ _scsi_request_sense: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:107: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); +;source-doc/scsi-drv/class_scsi.c:75: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); ld e,(ix+6) ld d,(ix+7) xor a @@ -474,338 +408,10 @@ _scsi_request_sense: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:108: } +;source-doc/scsi-drv/class_scsi.c:76: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:110: usb_error scsi_sense_init(const uint16_t dev_index) { -; --------------------------------- -; Function scsi_sense_init -; --------------------------------- -_scsi_sense_init: - push ix - ld ix,0 - add ix,sp - ld hl, -18 - add hl, sp - ld sp, hl -;source-doc/scsi-drv/class_scsi.c:111: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config -;source-doc/scsi-drv/class_scsi.c:116: critical_begin(); - push de - call _critical_begin - pop de -;source-doc/scsi-drv/class_scsi.c:117: while ((result = scsi_test(dev)) && --counter > 0) - ld c,0x03 -l_scsi_sense_init_00102: - push bc - push de - push de - call _scsi_test - pop af - ld a, l - pop de - pop bc - ld (_result),a - or a - jr Z,l_scsi_sense_init_00104 - dec c - jr Z,l_scsi_sense_init_00104 -;source-doc/scsi-drv/class_scsi.c:118: scsi_request_sense(dev, &response); - ld hl,0 - add hl, sp - push bc - push de - push hl - push de - call _scsi_request_sense - pop af - pop af - pop de - pop bc - jr l_scsi_sense_init_00102 -l_scsi_sense_init_00104: -;source-doc/scsi-drv/class_scsi.c:119: critical_end(); - call _critical_end -;source-doc/scsi-drv/class_scsi.c:121: return result; - ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:122: } - ld sp, ix - pop ix - ret -;source-doc/scsi-drv/class_scsi.c:126: usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { -; --------------------------------- -; Function scsi_read -; --------------------------------- -_scsi_read: - push ix - ld ix,0 - add ix,sp - push af -;source-doc/scsi-drv/class_scsi.c:127: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config - pop bc - push de -;source-doc/scsi-drv/class_scsi.c:129: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); - ld de,_cbw - ld l, e - ld h, d - ld b,0x0e - jr l_scsi_read_00113 -l_scsi_read_00112: - ld (hl),0x00 - inc hl -l_scsi_read_00113: - ld (hl),0x00 - inc hl - djnz l_scsi_read_00112 -;source-doc/scsi-drv/class_scsi.c:130: cbw.cbw = scsi_command_block_wrapper; - ld bc,0x000f - ld hl,_scsi_command_block_wrapper - ldir -;source-doc/scsi-drv/class_scsi.c:132: cbw.cbw.bCBWLUN = 0; - ld hl,_cbw + 13 - ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:133: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); - ld hl,_cbw + 14 - ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:134: cbw.cbw.dCBWDataTransferLength = 512; - ld hl,0x0200 - ld (_cbw + 8),hl - ld h, l - ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/class_scsi.c:136: cbw.scsi_cmd.operation_code = 0x28; // read operation - ld hl,_cbw + 15 - ld (hl),0x28 -;source-doc/scsi-drv/class_scsi.c:137: cbw.scsi_cmd.transfer_len[1] = 1; - ld hl,_cbw + 23 - ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:138: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld l,(ix-2) - ld h,(ix-1) - ld bc,0x000c - add hl,bc - ld c,l - ld b,h - inc hl - inc hl - inc hl - ld a, (hl) - ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:139: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:140: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - ld l,c - ld h,b - inc hl - inc hl - ld a,(hl) - ld ((_cbw + 18)),a - dec hl - ld e, (hl) - ld hl, +(_cbw + 19) - ld (hl), e -;source-doc/scsi-drv/class_scsi.c:141: cbw.scsi_cmd.lba[3] = dev->current_lba; - ld a, (bc) - inc hl - ld (hl), a -;source-doc/scsi-drv/class_scsi.c:143: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); - ld e,(ix+6) - ld d,(ix+7) - push bc - xor a - push af - inc sp - push de - ld hl,_cbw - push hl - ld l,(ix-2) - ld h,(ix-1) - push hl - call _do_scsi_cmd - pop af - pop af - pop af - inc sp - pop bc - ld a, l - ld (_result), a -;source-doc/scsi-drv/class_scsi.c:145: if (result == USB_ERR_OK) - ld a,(_result) - or a - jr NZ,l_scsi_read_00102 -;source-doc/scsi-drv/class_scsi.c:146: dev->current_lba++; - ld l, c - ld h, b - ld e, (hl) - inc hl - ld d, (hl) - inc hl - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - inc e - jr NZ,l_scsi_read_00114 - inc d - jr NZ,l_scsi_read_00114 - inc hl -l_scsi_read_00114: - ld a, e - ld (bc), a - inc bc - ld a, d - ld (bc), a - inc bc - ld a, l - ld (bc), a - inc bc - ld a, h - ld (bc), a -l_scsi_read_00102: -;source-doc/scsi-drv/class_scsi.c:147: return result; - ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:148: } - ld sp, ix - pop ix - ret -;source-doc/scsi-drv/class_scsi.c:150: usb_error scsi_write(const uint16_t dev_index, uint8_t *const buffer) { -; --------------------------------- -; Function scsi_write -; --------------------------------- -_scsi_write: - push ix - ld ix,0 - add ix,sp - push af -;source-doc/scsi-drv/class_scsi.c:151: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config - pop bc - push de -;source-doc/scsi-drv/class_scsi.c:153: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); - ld de,_cbw - ld l, e - ld h, d - ld b,0x0e - jr l_scsi_write_00113 -l_scsi_write_00112: - ld (hl),0x00 - inc hl -l_scsi_write_00113: - ld (hl),0x00 - inc hl - djnz l_scsi_write_00112 -;source-doc/scsi-drv/class_scsi.c:154: cbw.cbw = scsi_command_block_wrapper; - ld bc,0x000f - ld hl,_scsi_command_block_wrapper - ldir -;source-doc/scsi-drv/class_scsi.c:156: cbw.cbw.bCBWLUN = 0; - ld hl,_cbw + 13 - ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:157: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); - ld hl,_cbw + 14 - ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:158: cbw.cbw.dCBWDataTransferLength = 512; - ld hl,0x0200 - ld (_cbw + 8),hl - ld h, l - ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/class_scsi.c:160: cbw.scsi_cmd.operation_code = 0x2A; // write operation - ld hl,_cbw + 15 - ld (hl),0x2a -;source-doc/scsi-drv/class_scsi.c:161: cbw.scsi_cmd.transfer_len[1] = 1; - ld hl,_cbw + 23 - ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:162: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld l,(ix-2) - ld h,(ix-1) - ld bc,0x000c - add hl,bc - ld c,l - ld b,h - inc hl - inc hl - inc hl - ld a, (hl) - ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:163: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:164: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - ld l,c - ld h,b - inc hl - inc hl - ld a,(hl) - ld ((_cbw + 18)),a - dec hl - ld e, (hl) - ld hl, +(_cbw + 19) - ld (hl), e -;source-doc/scsi-drv/class_scsi.c:165: cbw.scsi_cmd.lba[3] = dev->current_lba; - ld a, (bc) - inc hl - ld (hl), a -;source-doc/scsi-drv/class_scsi.c:167: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); - ld e,(ix+6) - ld d,(ix+7) - push bc - ld a,0x01 - push af - inc sp - push de - ld hl,_cbw - push hl - ld l,(ix-2) - ld h,(ix-1) - push hl - call _do_scsi_cmd - pop af - pop af - pop af - inc sp - pop bc - ld a, l - ld (_result), a -;source-doc/scsi-drv/class_scsi.c:169: if (result == USB_ERR_OK) - ld a,(_result) - or a - jr NZ,l_scsi_write_00102 -;source-doc/scsi-drv/class_scsi.c:170: dev->current_lba++; - ld l, c - ld h, b - ld e, (hl) - inc hl - ld d, (hl) - inc hl - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - inc e - jr NZ,l_scsi_write_00114 - inc d - jr NZ,l_scsi_write_00114 - inc hl -l_scsi_write_00114: - ld a, e - ld (bc), a - inc bc - ld a, d - ld (bc), a - inc bc - ld a, l - ld (bc), a - inc bc - ld a, h - ld (bc), a -l_scsi_write_00102: -;source-doc/scsi-drv/class_scsi.c:171: return result; - ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:172: } - ld sp, ix - pop ix - ret _scsi_command_block_wrapper: DEFB +0x55 DEFB +0x53 @@ -833,19 +439,6 @@ _csw: DEFB 0x00 DEFB 0x00 DEFB +0x00 -_scsi_packet_read_capacity: - DEFB +0x25 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 _scsi_packet_request_sense: DEFB +0x03 DEFB +0x00 @@ -859,28 +452,3 @@ _scsi_packet_request_sense: DEFB +0x00 DEFB +0x00 DEFB +0x00 -_cbw: - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB +0x00,0x00, +0x00, +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 diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index 904c8ba8..884b2adc 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/scsi-drv/scsi-init.c:14: void chscsi_init(void) { +;source-doc/scsi-drv/scsi-init.c:9: void chscsi_init(void) { ; --------------------------------- ; Function chscsi_init ; --------------------------------- @@ -58,88 +58,83 @@ _chscsi_init: add ix,sp push af dec sp -;source-doc/scsi-drv/scsi-init.c:16: do { +;source-doc/scsi-drv/scsi-init.c:11: do { ld (ix-1),0x01 -l_chscsi_init_00105: -;source-doc/scsi-drv/scsi-init.c:17: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); +l_chscsi_init_00103: +;source-doc/scsi-drv/scsi-init.c:12: usb_device_type t = get_usb_device_type(index); ld a,(ix-1) - call _get_usb_device_config - ld l, e -;source-doc/scsi-drv/scsi-init.c:19: if (storage_device == NULL) - ld a,d - ld h,a - or e - jr Z,l_chscsi_init_00108 -;source-doc/scsi-drv/scsi-init.c:22: const usb_device_type t = storage_device->type; - ld a, (hl) - and 0x0f -;source-doc/scsi-drv/scsi-init.c:24: if (t == USB_IS_MASS_STORAGE) { + push af + inc sp + call _get_usb_device_type + inc sp + ld a, l +;source-doc/scsi-drv/scsi-init.c:14: if (t == USB_IS_MASS_STORAGE) { sub 0x02 - jr NZ,l_chscsi_init_00106 -;source-doc/scsi-drv/scsi-init.c:25: const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen + jr NZ,l_chscsi_init_00104 +;source-doc/scsi-drv/scsi-init.c:15: const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen call _find_storage_dev -;source-doc/scsi-drv/scsi-init.c:26: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; +;source-doc/scsi-drv/scsi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; ld c,l ld e,l ld d,0x00 - ld h, d - add hl, hl - ld a, l + ld a, e + ld b, d + add a, a + rl b add a, +((_hbios_usb_storage_devices) & 0xFF) ld (ix-3),a - ld a, h + ld a, b adc a, +((_hbios_usb_storage_devices) / 256) ld (ix-2),a pop hl push hl inc c ld (hl), c -;source-doc/scsi-drv/scsi-init.c:27: hbios_usb_storage_devices[dev_index].usb_device = index; +;source-doc/scsi-drv/scsi-init.c:18: hbios_usb_storage_devices[dev_index].usb_device = index; pop bc push bc inc bc ld a,(ix-1) ld (bc), a -;source-doc/scsi-drv/scsi-init.c:29: print_string("\r\nUSB: MASS STORAGE @ $"); +;source-doc/scsi-drv/scsi-init.c:20: print_string("\r\nUSB: MASS STORAGE @ $"); push de ld hl,scsi_init_str_0 call _print_string pop de -;source-doc/scsi-drv/scsi-init.c:30: print_uint16(index); +;source-doc/scsi-drv/scsi-init.c:21: print_uint16(index); ld l,(ix-1) ld h,0x00 push hl push de call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:31: print_string(":$"); +;source-doc/scsi-drv/scsi-init.c:22: print_string(":$"); ld hl,scsi_init_str_1 call _print_string pop de pop hl -;source-doc/scsi-drv/scsi-init.c:32: print_uint16(dev_index + 1); +;source-doc/scsi-drv/scsi-init.c:23: print_uint16(dev_index + 1); inc de push hl ex de, hl call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:33: print_string(" $"); +;source-doc/scsi-drv/scsi-init.c:24: print_string(" $"); ld hl,scsi_init_str_2 call _print_string -;source-doc/scsi-drv/scsi-init.c:34: scsi_sense_init(index); - call _scsi_sense_init +;source-doc/scsi-drv/scsi-init.c:25: usb_scsi_init(index); + call _usb_scsi_init pop af -;source-doc/scsi-drv/scsi-init.c:35: dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); +;source-doc/scsi-drv/scsi-init.c:26: dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); pop de push de ld hl,_ch_scsi_fntbl call _dio_add_entry -l_chscsi_init_00106: -;source-doc/scsi-drv/scsi-init.c:38: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +l_chscsi_init_00104: +;source-doc/scsi-drv/scsi-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 - jr NZ,l_chscsi_init_00105 -l_chscsi_init_00108: -;source-doc/scsi-drv/scsi-init.c:39: } + jr NZ,l_chscsi_init_00103 +;source-doc/scsi-drv/scsi-init.c:30: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s new file mode 100644 index 00000000..cf87d6aa --- /dev/null +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s @@ -0,0 +1,482 @@ +; +; Generated from source-doc/scsi-drv/scsi_driver.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_scsi_packet_read_capacity: + DEFS 12 +_cbw: + DEFS 27 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/scsi-drv/scsi_driver.c:8: usb_error usb_scsi_init(const uint16_t dev_index) { +; --------------------------------- +; Function usb_scsi_init +; --------------------------------- +_usb_scsi_init: + push ix + ld ix,0 + add ix,sp + ld hl, -18 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/scsi_driver.c:9: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/scsi-drv/scsi_driver.c:14: critical_begin(); + push de + call _critical_begin + pop de +;source-doc/scsi-drv/scsi_driver.c:15: while ((result = scsi_test(dev)) && --counter > 0) + ld c,0x03 +l_usb_scsi_init_00102: + push bc + push de + push de + call _scsi_test + pop af + ld a, l + pop de + pop bc + ld (_result),a + or a + jr Z,l_usb_scsi_init_00104 + dec c + jr Z,l_usb_scsi_init_00104 +;source-doc/scsi-drv/scsi_driver.c:16: scsi_request_sense(dev, &response); + ld hl,0 + add hl, sp + push bc + push de + push hl + push de + call _scsi_request_sense + pop af + pop af + pop de + pop bc + jr l_usb_scsi_init_00102 +l_usb_scsi_init_00104: +;source-doc/scsi-drv/scsi_driver.c:17: critical_end(); + call _critical_end +;source-doc/scsi-drv/scsi_driver.c:19: return result; + ld hl, (_result) +;source-doc/scsi-drv/scsi_driver.c:20: } + ld sp, ix + pop ix + ret +;source-doc/scsi-drv/scsi_driver.c:24: usb_error usb_scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { +; --------------------------------- +; Function usb_scsi_read_capacity +; --------------------------------- +_usb_scsi_read_capacity: + push ix + ld ix,0 + add ix,sp + ld hl, -27 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/scsi_driver.c:25: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/scsi-drv/scsi_driver.c:28: cbw_scsi.cbw = scsi_command_block_wrapper; + push de + ld hl,2 + add hl, sp + ex de, hl + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir + pop de +;source-doc/scsi-drv/scsi_driver.c:29: cbw_scsi.read_capacity = scsi_packet_read_capacity; + push de + ld hl,17 + add hl, sp + ex de, hl + ld bc,0x000c + ld hl,_scsi_packet_read_capacity + ldir + pop de +;source-doc/scsi-drv/scsi_driver.c:31: cbw_scsi.cbw.bCBWLUN = 0; + ld (ix-14),0x00 +;source-doc/scsi-drv/scsi_driver.c:32: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); + ld (ix-13),0x0c +;source-doc/scsi-drv/scsi_driver.c:33: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); + ld (ix-19),0x08 + xor a + ld (ix-18),a + ld (ix-17),a + ld (ix-16),a +;source-doc/scsi-drv/scsi_driver.c:35: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); + ld c,(ix+6) + ld b,(ix+7) + xor a + push af + inc sp + push bc + ld hl,3 + add hl, sp + push hl + push de + call _do_scsi_cmd + pop af + pop af + pop af + inc sp +;source-doc/scsi-drv/scsi_driver.c:36: } + ld sp, ix + pop ix + ret +;source-doc/scsi-drv/scsi_driver.c:56: usb_error usb_scsi_read(const uint16_t dev_index, uint8_t *const buffer) { +; --------------------------------- +; Function usb_scsi_read +; --------------------------------- +_usb_scsi_read: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/scsi-drv/scsi_driver.c:57: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config + pop bc + push de +;source-doc/scsi-drv/scsi_driver.c:59: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + ld de,_cbw + ld l, e + ld h, d + ld b,0x0e + jr l_usb_scsi_read_00113 +l_usb_scsi_read_00112: + ld (hl),0x00 + inc hl +l_usb_scsi_read_00113: + ld (hl),0x00 + inc hl + djnz l_usb_scsi_read_00112 +;source-doc/scsi-drv/scsi_driver.c:60: cbw.cbw = scsi_command_block_wrapper; + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir +;source-doc/scsi-drv/scsi_driver.c:62: cbw.cbw.bCBWLUN = 0; + ld hl,_cbw + 13 + ld (hl),0x00 +;source-doc/scsi-drv/scsi_driver.c:63: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + ld hl,_cbw + 14 + ld (hl),0x0c +;source-doc/scsi-drv/scsi_driver.c:64: cbw.cbw.dCBWDataTransferLength = 512; + ld hl,0x0200 + ld (_cbw + 8),hl + ld h, l + ld (_cbw + 8 + 2),hl +;source-doc/scsi-drv/scsi_driver.c:66: cbw.scsi_cmd.operation_code = 0x28; // read operation + ld hl,_cbw + 15 + ld (hl),0x28 +;source-doc/scsi-drv/scsi_driver.c:67: cbw.scsi_cmd.transfer_len[1] = 1; + ld hl,_cbw + 23 + ld (hl),0x01 +;source-doc/scsi-drv/scsi_driver.c:68: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + ld l,(ix-2) + ld h,(ix-1) + ld bc,0x000c + add hl,bc + ld c,l + ld b,h + inc hl + inc hl + inc hl + ld a, (hl) + ld ((_cbw + 17)),a +;source-doc/scsi-drv/scsi_driver.c:69: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/scsi_driver.c:70: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + ld l,c + ld h,b + inc hl + inc hl + ld a,(hl) + ld ((_cbw + 18)),a + dec hl + ld e, (hl) + ld hl, +(_cbw + 19) + ld (hl), e +;source-doc/scsi-drv/scsi_driver.c:71: cbw.scsi_cmd.lba[3] = dev->current_lba; + ld a, (bc) + inc hl + ld (hl), a +;source-doc/scsi-drv/scsi_driver.c:73: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); + ld e,(ix+6) + ld d,(ix+7) + push bc + xor a + push af + inc sp + push de + ld hl,_cbw + push hl + ld l,(ix-2) + ld h,(ix-1) + push hl + call _do_scsi_cmd + pop af + pop af + pop af + inc sp + pop bc + ld a, l + ld (_result), a +;source-doc/scsi-drv/scsi_driver.c:75: if (result == USB_ERR_OK) + ld a,(_result) + or a + jr NZ,l_usb_scsi_read_00102 +;source-doc/scsi-drv/scsi_driver.c:76: dev->current_lba++; + ld l, c + ld h, b + ld e, (hl) + inc hl + ld d, (hl) + inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + inc e + jr NZ,l_usb_scsi_read_00114 + inc d + jr NZ,l_usb_scsi_read_00114 + inc hl +l_usb_scsi_read_00114: + ld a, e + ld (bc), a + inc bc + ld a, d + ld (bc), a + inc bc + ld a, l + ld (bc), a + inc bc + ld a, h + ld (bc), a +l_usb_scsi_read_00102: +;source-doc/scsi-drv/scsi_driver.c:77: return result; + ld hl, (_result) +;source-doc/scsi-drv/scsi_driver.c:78: } + ld sp, ix + pop ix + ret +;source-doc/scsi-drv/scsi_driver.c:80: usb_error usb_scsi_write(const uint16_t dev_index, uint8_t *const buffer) { +; --------------------------------- +; Function usb_scsi_write +; --------------------------------- +_usb_scsi_write: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/scsi-drv/scsi_driver.c:81: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config + pop bc + push de +;source-doc/scsi-drv/scsi_driver.c:83: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + ld de,_cbw + ld l, e + ld h, d + ld b,0x0e + jr l_usb_scsi_write_00113 +l_usb_scsi_write_00112: + ld (hl),0x00 + inc hl +l_usb_scsi_write_00113: + ld (hl),0x00 + inc hl + djnz l_usb_scsi_write_00112 +;source-doc/scsi-drv/scsi_driver.c:84: cbw.cbw = scsi_command_block_wrapper; + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir +;source-doc/scsi-drv/scsi_driver.c:86: cbw.cbw.bCBWLUN = 0; + ld hl,_cbw + 13 + ld (hl),0x00 +;source-doc/scsi-drv/scsi_driver.c:87: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + ld hl,_cbw + 14 + ld (hl),0x0c +;source-doc/scsi-drv/scsi_driver.c:88: cbw.cbw.dCBWDataTransferLength = 512; + ld hl,0x0200 + ld (_cbw + 8),hl + ld h, l + ld (_cbw + 8 + 2),hl +;source-doc/scsi-drv/scsi_driver.c:90: cbw.scsi_cmd.operation_code = 0x2A; // write operation + ld hl,_cbw + 15 + ld (hl),0x2a +;source-doc/scsi-drv/scsi_driver.c:91: cbw.scsi_cmd.transfer_len[1] = 1; + ld hl,_cbw + 23 + ld (hl),0x01 +;source-doc/scsi-drv/scsi_driver.c:92: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + ld l,(ix-2) + ld h,(ix-1) + ld bc,0x000c + add hl,bc + ld c,l + ld b,h + inc hl + inc hl + inc hl + ld a, (hl) + ld ((_cbw + 17)),a +;source-doc/scsi-drv/scsi_driver.c:93: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/scsi_driver.c:94: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + ld l,c + ld h,b + inc hl + inc hl + ld a,(hl) + ld ((_cbw + 18)),a + dec hl + ld e, (hl) + ld hl, +(_cbw + 19) + ld (hl), e +;source-doc/scsi-drv/scsi_driver.c:95: cbw.scsi_cmd.lba[3] = dev->current_lba; + ld a, (bc) + inc hl + ld (hl), a +;source-doc/scsi-drv/scsi_driver.c:97: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); + ld e,(ix+6) + ld d,(ix+7) + push bc + ld a,0x01 + push af + inc sp + push de + ld hl,_cbw + push hl + ld l,(ix-2) + ld h,(ix-1) + push hl + call _do_scsi_cmd + pop af + pop af + pop af + inc sp + pop bc + ld a, l + ld (_result), a +;source-doc/scsi-drv/scsi_driver.c:99: if (result == USB_ERR_OK) + ld a,(_result) + or a + jr NZ,l_usb_scsi_write_00102 +;source-doc/scsi-drv/scsi_driver.c:100: dev->current_lba++; + ld l, c + ld h, b + ld e, (hl) + inc hl + ld d, (hl) + inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + inc e + jr NZ,l_usb_scsi_write_00114 + inc d + jr NZ,l_usb_scsi_write_00114 + inc hl +l_usb_scsi_write_00114: + ld a, e + ld (bc), a + inc bc + ld a, d + ld (bc), a + inc bc + ld a, l + ld (bc), a + inc bc + ld a, h + ld (bc), a +l_usb_scsi_write_00102: +;source-doc/scsi-drv/scsi_driver.c:101: return result; + ld hl, (_result) +;source-doc/scsi-drv/scsi_driver.c:102: } + ld sp, ix + pop ix + ret +_scsi_packet_read_capacity: + DEFB +0x25 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +_cbw: + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB +0x00,0x00, +0x00, +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 diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h index 5695c11e..381e84e1 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h @@ -48,6 +48,7 @@ typedef enum { USB_IS_UNKNOWN = 6, _USB_LAST_DEVICE_TYPE, USB_IS_HUB = 15 + } usb_device_type; // 4 bits only typedef enum { ENDPOINT_BULK_OUT = 0, ENDPOINT_BULK_IN = 1, ENDPOINT_INTERRUPT_IN = 2 } usb_endpoint_type; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c index 642695a1..2498751e 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c @@ -1,5 +1,5 @@ #include "print.h" -#include "usb_init.h" +#include "usb-base-drv.h" static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { uint16_t r = state; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c index 6f349813..fb29c190 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c @@ -1,7 +1,74 @@ #include "usb-base-drv.h" -#include "usb_state.h" +#include "ch376.h" +#include "enumerate.h" +#include "work-area.h" +#include -uint8_t scsi_seek(const uint16_t dev_index, const uint32_t lba) { +static usb_error usb_host_bus_reset(void) { + ch_cmd_set_usb_mode(CH_MODE_HOST); + delay_20ms(); + + ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); + delay_20ms(); + + ch_cmd_set_usb_mode(CH_MODE_HOST); + delay_20ms(); + + ch_configure_nak_retry_3s(); + + return USB_ERR_OK; +} + +#define ERASE_LINE "\x1B\x6C\r$" + +uint16_t usb_init(uint8_t state) __z88dk_fastcall { + uint8_t r; + + USB_MODULE_LEDS = 0x03; + + if (state == 0) { + ch_cmd_reset_all(); + delay_medium(); + + if (!ch_probe()) { + USB_MODULE_LEDS = 0x00; + return 0xFF00; + } + USB_MODULE_LEDS = 0x00; + return 1; + } + + if (state == 1) { + r = ch_cmd_get_ic_version(); + + USB_MODULE_LEDS = 0x00; + return (uint16_t)r << 8 | 2; + } + + if (state == 2) { + usb_host_bus_reset(); + + r = ch_very_short_wait_int_and_get_status(); + + if (r != USB_INT_CONNECT) { + USB_MODULE_LEDS = 0x00; + return 2; + } + + return 3; + } + + memset(get_usb_work_area(), 0, sizeof(_usb_state)); + if (state != 2) { + usb_host_bus_reset(); + delay_medium(); + } + enumerate_all_devices(); + USB_MODULE_LEDS = 0x00; + return (uint16_t)count_of_devices() << 8 | 4; +} + +uint8_t usb_scsi_seek(const uint16_t dev_index, const uint32_t lba) { device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); dev->current_lba = lba; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h index f5039fd2..249e894b 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h @@ -5,8 +5,10 @@ #include #include +extern uint16_t usb_init(uint8_t state) __z88dk_fastcall; + // ufi_seek is an alias for scsi_seek -extern usb_error scsi_seek(const uint16_t dev_index, const uint32_t lba); +extern usb_error usb_scsi_seek(const uint16_t dev_index, const uint32_t lba); extern usb_error ufi_seek(const uint16_t dev_index, const uint32_t lba); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c deleted file mode 100644 index 3585cc28..00000000 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c +++ /dev/null @@ -1,69 +0,0 @@ -#include "usb_init.h" -#include "ch376.h" -#include "enumerate.h" -#include "work-area.h" -#include - -static usb_error usb_host_bus_reset(void) { - ch_cmd_set_usb_mode(CH_MODE_HOST); - delay_20ms(); - - ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); - delay_20ms(); - - ch_cmd_set_usb_mode(CH_MODE_HOST); - delay_20ms(); - - ch_configure_nak_retry_3s(); - - return USB_ERR_OK; -} - -#define ERASE_LINE "\x1B\x6C\r$" - -uint16_t usb_init(uint8_t state) __z88dk_fastcall { - uint8_t r; - - USB_MODULE_LEDS = 0x03; - - if (state == 0) { - ch_cmd_reset_all(); - delay_medium(); - - if (!ch_probe()) { - USB_MODULE_LEDS = 0x00; - return 0xFF00; - } - USB_MODULE_LEDS = 0x00; - return 1; - } - - if (state == 1) { - r = ch_cmd_get_ic_version(); - - USB_MODULE_LEDS = 0x00; - return (uint16_t)r << 8 | 2; - } - - if (state == 2) { - usb_host_bus_reset(); - - r = ch_very_short_wait_int_and_get_status(); - - if (r != USB_INT_CONNECT) { - USB_MODULE_LEDS = 0x00; - return 2; - } - - return 3; - } - - memset(get_usb_work_area(), 0, sizeof(_usb_state)); - if (state != 2) { - usb_host_bus_reset(); - delay_medium(); - } - enumerate_all_devices(); - USB_MODULE_LEDS = 0x00; - return (uint16_t)count_of_devices() << 8 | 4; -} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h deleted file mode 100644 index ed6af87d..00000000 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __USB_INIT -#define __USB_INIT - -#include - -extern uint16_t usb_init(uint8_t state) __z88dk_fastcall; - -#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c index ce6e460d..cb16cd19 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c @@ -1,6 +1,10 @@ #include "usb_state.h" +#include "ch376.h" #include "work-area.h" +extern device_config *first_device_config(const _usb_state *const p) __sdcccall(1); +extern device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1); + const uint8_t device_config_sizes[_USB_LAST_DEVICE_TYPE] = { 0, /* USB_NOT_SUPPORTED = 0 */ sizeof(device_config_storage), /* USB_IS_FLOPPY = 1 */ @@ -83,3 +87,12 @@ device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { return NULL; // is not a usb device } + +usb_device_type get_usb_device_type(const uint8_t dev_index) { + const device_config *dev = get_usb_device_config(dev_index); + + if (dev == NULL) + return -1; + + return dev->type; +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h index d5246a1b..a5205ee3 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h @@ -18,10 +18,9 @@ typedef struct __usb_state { } _usb_state; extern device_config *find_first_free(void); -extern device_config *first_device_config(const _usb_state *const p) __sdcccall(1); -extern device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1); extern uint8_t count_of_devices(void) __sdcccall(1); - extern device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1); +extern usb_device_type get_usb_device_type(const uint8_t dev_index); + #endif 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 5da58857..df623d4a 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -1,49 +1,20 @@ -#include "class_hid.h" -#include "class_hid_keyboard.h" -#include -#include +#include "kyb_driver.h" #include #include -#include #include -#define KEYBOARD_BUFFER_SIZE 8 -#define KEYBOARD_BUFFER_SIZE_MASK 7 -typedef uint16_t modifier_and_code_t; - -static device_config_keyboard *keyboard_config = 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; -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; + uint8_t index = 1; do { - keyboard_config = (device_config_keyboard *)get_usb_device_config(index); - - if (keyboard_config == NULL) - break; - - const usb_device_type t = keyboard_config->type; + usb_device_type t = get_usb_device_type(index); if (t == USB_IS_KEYBOARD) { print_string("\r\nUSB: KEYBOARD @ $"); print_uint16(index); print_string(" $"); - hid_set_protocol(keyboard_config, 1); - hid_set_idle(keyboard_config, 0x80); + usb_kyb_init(index); return 1; } } while (++index != MAX_NUMBER_OF_DEVICES + 1); @@ -51,114 +22,3 @@ uint8_t keyboard_init(void) __sdcccall(1) { print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); return 0; } - -static uint8_t report_diff() __sdcccall(1) { - uint8_t *a = (uint8_t *)&report; - uint8_t *b = (uint8_t *)&previous; - - uint8_t i = sizeof(report); - do { - if (*a++ != *b++) - return true; - } while (--i != 0); - - 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) - return; // ignore ??? - - // if already reported, just skip it - 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 - buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; - write_index = next_write_index; - } -} - -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) - alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - - if (write_index >= read_index) - size = write_index - read_index; - else - size = 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 - - 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 - // 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 */ - return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; -} - -void keyboard_buf_flush() { - write_index = read_index = alt_write_index = alt_read_index = 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); - ch_configure_nak_retry_3s(); - if (result == 0) { - if (report_diff()) { - report_put(); - uint8_t i = 6; - do { - keyboard_buf_put(i - 1); - } while (--i != 0); - previous = report; - } - } -} diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c new file mode 100644 index 00000000..64ba8968 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c @@ -0,0 +1,150 @@ +#include "kyb_driver.h" +#include "class_hid.h" +#include "class_hid_keyboard.h" +#include +#include +#include +#include + +#define KEYBOARD_BUFFER_SIZE 8 +#define KEYBOARD_BUFFER_SIZE_MASK 7 +typedef uint16_t modifier_and_code_t; + +static device_config_keyboard *keyboard_config = 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; +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 uint8_t report_diff() __sdcccall(1) { + uint8_t *a = (uint8_t *)&report; + uint8_t *b = (uint8_t *)&previous; + + uint8_t i = sizeof(report); + do { + if (*a++ != *b++) + return true; + } while (--i != 0); + + 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) + return; // ignore ??? + + // if already reported, just skip it + 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 + buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; + write_index = next_write_index; + } +} + +uint16_t usb_kyb_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) + alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + + if (write_index >= read_index) + size = write_index - read_index; + else + size = KEYBOARD_BUFFER_SIZE - read_index + write_index; + + return (uint16_t)alt_size << 8 | (uint16_t)size; +} + +uint32_t usb_kyb_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] >> 8; + const uint8_t key_code = buffer[read_index] & 255; + read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + + // 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 */ + return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +} + +void usb_kyb_flush() { + write_index = read_index = alt_write_index = alt_read_index = 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 usb_kyb_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); + ch_configure_nak_retry_3s(); + if (result == 0) { + if (report_diff()) { + report_put(); + uint8_t i = 6; + do { + keyboard_buf_put(i - 1); + } while (--i != 0); + previous = report; + } + } +} + +usb_error usb_kyb_init(const uint8_t dev_index) { + uint8_t result; + 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); + +done: + return result; +} diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h new file mode 100644 index 00000000..8d3b4f1f --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h @@ -0,0 +1,12 @@ +#ifndef __KYB_DRIVER__ +#define __KYB_DRIVER__ + +#include +#include + +extern usb_error usb_kyb_init(const uint8_t dev_index); +extern void usb_kyb_flush(); +extern uint32_t usb_kyb_buf_get_next(); +extern uint16_t usb_kyb_buf_size(); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c index e5da0b94..de2a26ae 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c @@ -49,39 +49,7 @@ done: return result; } -_scsi_read_capacity scsi_packet_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}}; - -usb_error scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - cbw_scsi_read_capacity cbw_scsi; - cbw_scsi.cbw = scsi_command_block_wrapper; - cbw_scsi.read_capacity = scsi_packet_read_capacity; - - cbw_scsi.cbw.bCBWLUN = 0; - cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); - cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); - - return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); -} - -// _scsi_packet_inquiry scsi_packet_inquiry = {0x12, 0, 0, 0, 0x24, 0, {0, 0, 0, 0, 0, 0}}; - -// usb_error scsi_inquiry(const uint16_t dev_index, scsi_inquiry_result *inq_result) { -// device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - -// cbw_scsi_inquiry cbw_scsi; -// cbw_scsi.cbw = scsi_command_block_wrapper; -// cbw_scsi.inquiry = scsi_packet_inquiry; - -// cbw_scsi.cbw.bCBWLUN = 0; -// cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); -// cbw_scsi.cbw.dCBWDataTransferLength = 0x24; - -// return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); -// } - -static usb_error scsi_test(device_config_storage *const dev) { +usb_error scsi_test(device_config_storage *const dev) { cbw_scsi_test cbw_scsi; cbw_scsi.cbw = scsi_command_block_wrapper; memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); @@ -95,7 +63,7 @@ static usb_error scsi_test(device_config_storage *const dev) { _scsi_packet_request_sense scsi_packet_request_sense = {0x03, 0, 0, 0, 18, 0, {0, 0, 0, 0, 0, 0}}; -static usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { cbw_scsi_request_sense cbw_scsi; cbw_scsi.cbw = scsi_command_block_wrapper; cbw_scsi.request_sense = scsi_packet_request_sense; @@ -106,83 +74,3 @@ static usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); } - -usb_error scsi_sense_init(const uint16_t dev_index) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - scsi_sense_result response; - uint8_t counter = 3; - - critical_begin(); - while ((result = scsi_test(dev)) && --counter > 0) - scsi_request_sense(dev, &response); - critical_end(); - - return result; -} - -static cbw_scsi_read_write cbw = {{{0}}}; - -usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - memset(&cbw, 0, sizeof(cbw_scsi_read_write)); - cbw.cbw = scsi_command_block_wrapper; - - cbw.cbw.bCBWLUN = 0; - cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); - cbw.cbw.dCBWDataTransferLength = 512; - - cbw.scsi_cmd.operation_code = 0x28; // read operation - cbw.scsi_cmd.transfer_len[1] = 1; - cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; - cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - cbw.scsi_cmd.lba[3] = dev->current_lba; - - result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); - - if (result == USB_ERR_OK) - dev->current_lba++; - return result; -} - -usb_error scsi_write(const uint16_t dev_index, uint8_t *const buffer) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - memset(&cbw, 0, sizeof(cbw_scsi_read_write)); - cbw.cbw = scsi_command_block_wrapper; - - cbw.cbw.bCBWLUN = 0; - cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); - cbw.cbw.dCBWDataTransferLength = 512; - - cbw.scsi_cmd.operation_code = 0x2A; // write operation - cbw.scsi_cmd.transfer_len[1] = 1; - cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; - cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - cbw.scsi_cmd.lba[3] = dev->current_lba; - - result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); - - if (result == USB_ERR_OK) - dev->current_lba++; - return result; -} - -// usb_error scsi_eject(device_config_storage *const dev) { -// cbw_scsi_eject cbw_scsi; -// cbw_scsi.cbw = scsi_command_block_wrapper; - -// memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); - -// cbw_scsi.eject.operation_code = 0x1B; -// cbw_scsi.eject.loej = 1; - -// cbw_scsi.cbw.bCBWLUN = 0; -// cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); -// cbw_scsi.cbw.dCBWDataTransferLength = 0; - -// return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); -// } diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h index 989e5bec..2c5d6fe9 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h @@ -182,14 +182,15 @@ typedef struct { _scsi_packet_read_write scsi_cmd; } cbw_scsi_read_write; -extern usb_error scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *result); -extern usb_error scsi_inquiry(const uint16_t dev_index, scsi_inquiry_result *inq_result); -extern usb_error scsi_sense_init(const uint16_t dev_index); -// extern usb_error scsi_request_sense(const uint16_t dev_index, scsi_sense_result *const sens_result); -// extern usb_error scsi_eject(device_config_storage *const dev); -extern usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer); -extern usb_error scsi_write(const uint16_t dev_index, uint8_t *const buffer); - -extern usb_error scsi_seek(const uint16_t dev_index, const uint32_t lba); +extern _scsi_command_block_wrapper scsi_command_block_wrapper; + +extern usb_error do_scsi_cmd(device_config_storage *const dev, + _scsi_command_block_wrapper *const cbw, + void *const send_receive_buffer, + const bool send); + +extern usb_error scsi_test(device_config_storage *const dev); + +extern usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c index e4928d0f..cbde4ae9 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -1,28 +1,19 @@ -#include "class_scsi.h" #include "hbios-driver-storage.h" -#include -#include +#include "scsi_driver.h" #include #include #include -#include -#include -#include extern const uint16_t const ch_scsi_fntbl[]; void chscsi_init(void) { uint8_t index = 1; do { - device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); - - if (storage_device == NULL) - break; - - const usb_device_type t = storage_device->type; + usb_device_type t = get_usb_device_type(index); if (t == USB_IS_MASS_STORAGE) { - const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen + const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen + hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; hbios_usb_storage_devices[dev_index].usb_device = index; @@ -31,7 +22,7 @@ void chscsi_init(void) { print_string(":$"); print_uint16(dev_index + 1); print_string(" $"); - scsi_sense_init(index); + usb_scsi_init(index); dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); } diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c new file mode 100644 index 00000000..fd24aa02 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c @@ -0,0 +1,118 @@ +#include "scsi_driver.h" +#include "class_scsi.h" +#include +#include +#include +#include + +usb_error usb_scsi_init(const uint16_t dev_index) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + scsi_sense_result response; + uint8_t counter = 3; + + critical_begin(); + while ((result = scsi_test(dev)) && --counter > 0) + scsi_request_sense(dev, &response); + critical_end(); + + return result; +} + +_scsi_read_capacity scsi_packet_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}}; + +usb_error usb_scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + cbw_scsi_read_capacity cbw_scsi; + cbw_scsi.cbw = scsi_command_block_wrapper; + cbw_scsi.read_capacity = scsi_packet_read_capacity; + + cbw_scsi.cbw.bCBWLUN = 0; + cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); + cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); + + return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); +} + +// _scsi_packet_inquiry scsi_packet_inquiry = {0x12, 0, 0, 0, 0x24, 0, {0, 0, 0, 0, 0, 0}}; + +// usb_error usb_scsi_inquiry(const uint16_t dev_index, scsi_inquiry_result *inq_result) { +// device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + +// cbw_scsi_inquiry cbw_scsi; +// cbw_scsi.cbw = scsi_command_block_wrapper; +// cbw_scsi.inquiry = scsi_packet_inquiry; + +// cbw_scsi.cbw.bCBWLUN = 0; +// cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); +// cbw_scsi.cbw.dCBWDataTransferLength = 0x24; + +// return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); +// } + +static cbw_scsi_read_write cbw = {{{0}}}; + +usb_error usb_scsi_read(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + cbw.cbw = scsi_command_block_wrapper; + + cbw.cbw.bCBWLUN = 0; + cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + cbw.cbw.dCBWDataTransferLength = 512; + + cbw.scsi_cmd.operation_code = 0x28; // read operation + cbw.scsi_cmd.transfer_len[1] = 1; + cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; + cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + cbw.scsi_cmd.lba[3] = dev->current_lba; + + result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); + + if (result == USB_ERR_OK) + dev->current_lba++; + return result; +} + +usb_error usb_scsi_write(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + cbw.cbw = scsi_command_block_wrapper; + + cbw.cbw.bCBWLUN = 0; + cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + cbw.cbw.dCBWDataTransferLength = 512; + + cbw.scsi_cmd.operation_code = 0x2A; // write operation + cbw.scsi_cmd.transfer_len[1] = 1; + cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; + cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + cbw.scsi_cmd.lba[3] = dev->current_lba; + + result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); + + if (result == USB_ERR_OK) + dev->current_lba++; + return result; +} + +// usb_error scsi_eject(device_config_storage *const dev) { +// cbw_scsi_eject cbw_scsi; +// cbw_scsi.cbw = scsi_command_block_wrapper; + +// memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); + +// cbw_scsi.eject.operation_code = 0x1B; +// cbw_scsi.eject.loej = 1; + +// cbw_scsi.cbw.bCBWLUN = 0; +// cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); +// cbw_scsi.cbw.dCBWDataTransferLength = 0; + +// return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +// } diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.h b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.h new file mode 100644 index 00000000..92e57912 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.h @@ -0,0 +1,14 @@ +#ifndef __SCSI_DRIVER__ +#define __SCSI_DRIVER__ + +#include "class_scsi.h" +#include +#include + +extern usb_error usb_scsi_init(const uint16_t dev_index); +extern usb_error usb_scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *result); +extern usb_error usb_scsi_read(const uint16_t dev_index, uint8_t *const buffer); +extern usb_error usb_scsi_write(const uint16_t dev_index, uint8_t *const buffer); +extern usb_error usb_scsi_seek(const uint16_t dev_index, const uint32_t lba); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c index 3a1af894..7fd37bd2 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c @@ -1,11 +1,7 @@ -#include "class_ufi.h" #include "hbios-driver-storage.h" -#include #include #include -#include -#include -#include +#include extern const uint16_t const ch_ufi_fntbl[]; @@ -13,15 +9,11 @@ void chufi_init(void) { uint8_t index = 1; do { - device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); - - if (storage_device == NULL) - break; - - const usb_device_type t = storage_device->type; + usb_device_type t = get_usb_device_type(index); if (t == USB_IS_FLOPPY) { - const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen + const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen + hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; hbios_usb_storage_devices[dev_index].usb_device = index; @@ -35,84 +27,3 @@ void chufi_init(void) { } while (++index != MAX_NUMBER_OF_DEVICES + 1); } - -uint32_t chufi_get_cap(const uint16_t dev_index) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - ufi_format_capacities_response response; - memset(&response, 0, sizeof(ufi_format_capacities_response)); - - wait_for_device_ready(dev, 25); - - // not sure if we need to do this to 'clear' some state - ufi_inquiry_response inquiry; - ufi_inquiry(dev, &inquiry); - - wait_for_device_ready(dev, 15); - - const usb_error result = ufi_read_frmt_caps(dev, &response); - if (result != USB_ERR_OK) - return 0; - - return convert_from_msb_first(response.descriptors[0].number_of_blocks); -} - -uint8_t chufi_read(const uint16_t dev_index, uint8_t *const buffer) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - if (wait_for_device_ready((device_config *)dev, 20) != 0) - return -1; // Not READY! - - usb_error result; - ufi_interrupt_status sense_codes; - - memset(&sense_codes, 0, sizeof(sense_codes)); - - if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) - return -1; // general error - - ufi_request_sense_response response; - memset(&response, 0, sizeof(response)); - - if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) - return -1; // error - - const uint8_t asc = response.asc; - const uint8_t ascq = response.ascq; - const uint8_t sense_key = response.sense_key; - - if (sense_key != 0) - return -1; - - return USB_ERR_OK; -} - -usb_error chufi_write(const uint16_t dev_index, uint8_t *const buffer) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - if (wait_for_device_ready((device_config *)dev, 20) != 0) - return -1; // Not READY! - - ufi_interrupt_status sense_codes; - - memset(&sense_codes, 0, sizeof(sense_codes)); - if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { - return -1; - } - - ufi_request_sense_response response; - memset(&response, 0, sizeof(response)); - - if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { - return -1; - } - - const uint8_t asc = response.asc; - const uint8_t ascq = response.ascq; - const uint8_t sense_key = response.sense_key; - - if (sense_key != 0) - return -1; - - return USB_ERR_OK; -} diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c new file mode 100644 index 00000000..b1b12ce5 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c @@ -0,0 +1,85 @@ +#include "ufi_driver.h" +#include "class_ufi.h" +#include +#include + +uint32_t usb_ufi_get_cap(const uint16_t dev_index) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + ufi_format_capacities_response response; + memset(&response, 0, sizeof(ufi_format_capacities_response)); + + wait_for_device_ready(dev, 25); + + // not sure if we need to do this to 'clear' some state + ufi_inquiry_response inquiry; + ufi_inquiry(dev, &inquiry); + + wait_for_device_ready(dev, 15); + + const usb_error result = ufi_read_frmt_caps(dev, &response); + if (result != USB_ERR_OK) + return 0; + + return convert_from_msb_first(response.descriptors[0].number_of_blocks); +} + +uint8_t usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + if (wait_for_device_ready((device_config *)dev, 20) != 0) + return -1; // Not READY! + + usb_error result; + ufi_interrupt_status sense_codes; + + memset(&sense_codes, 0, sizeof(sense_codes)); + + if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) + return -1; // general error + + ufi_request_sense_response response; + memset(&response, 0, sizeof(response)); + + if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) + return -1; // error + + const uint8_t asc = response.asc; + const uint8_t ascq = response.ascq; + const uint8_t sense_key = response.sense_key; + + if (sense_key != 0) + return -1; + + return USB_ERR_OK; +} + +usb_error usb_ufi_write(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + if (wait_for_device_ready((device_config *)dev, 20) != 0) + return -1; // Not READY! + + ufi_interrupt_status sense_codes; + + memset(&sense_codes, 0, sizeof(sense_codes)); + if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { + return -1; + } + + ufi_request_sense_response response; + memset(&response, 0, sizeof(response)); + + if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { + return -1; + } + + const uint8_t asc = response.asc; + const uint8_t ascq = response.ascq; + const uint8_t sense_key = response.sense_key; + + if (sense_key != 0) + return -1; + + return USB_ERR_OK; +} diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h new file mode 100644 index 00000000..45fee9cf --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h @@ -0,0 +1,11 @@ +#ifndef __UFI_DRIVER__ +#define __UFI_DRIVER__ + +#include +#include + +extern uint32_t usb_ufi_get_cap(const uint16_t dev_index); +extern uint8_t usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer); +extern usb_error usb_ufi_write(const uint16_t dev_index, uint8_t *const buffer); + +#endif diff --git a/Source/HBIOS/ch376-native/ufi-drv.s b/Source/HBIOS/ch376-native/ufi-drv.s index d900a14a..fb337a02 100644 --- a/Source/HBIOS/ch376-native/ufi-drv.s +++ b/Source/HBIOS/ch376-native/ufi-drv.s @@ -1,4 +1,5 @@ ; Generated File -- not to be modify directly #include "ch376-native/ufi-drv/class_ufi.c.s" #include "ch376-native/ufi-drv/ufi-init.c.s" +#include "ch376-native/ufi-drv/ufi_driver.c.s" #include "ch376-native/ufi-drv/usb_cbi.c.s" diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 78a119d8..6a75bf9a 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/ufi-drv/ufi-init.c:12: void chufi_init(void) { +;source-doc/ufi-drv/ufi-init.c:8: void chufi_init(void) { ; --------------------------------- ; Function chufi_init ; --------------------------------- @@ -58,80 +58,77 @@ _chufi_init: add ix,sp push af dec sp -;source-doc/ufi-drv/ufi-init.c:15: do { +;source-doc/ufi-drv/ufi-init.c:11: do { ld (ix-1),0x01 -l_chufi_init_00105: -;source-doc/ufi-drv/ufi-init.c:16: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); +l_chufi_init_00103: +;source-doc/ufi-drv/ufi-init.c:12: usb_device_type t = get_usb_device_type(index); ld a,(ix-1) - call _get_usb_device_config - ld l, e -;source-doc/ufi-drv/ufi-init.c:18: if (storage_device == NULL) - ld a,d - ld h,a - or e - jr Z,l_chufi_init_00108 -;source-doc/ufi-drv/ufi-init.c:21: const usb_device_type t = storage_device->type; - ld a, (hl) - and 0x0f -;source-doc/ufi-drv/ufi-init.c:23: if (t == USB_IS_FLOPPY) { - dec a - jr NZ,l_chufi_init_00106 -;source-doc/ufi-drv/ufi-init.c:24: const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen + push af + inc sp + call _get_usb_device_type + inc sp +;source-doc/ufi-drv/ufi-init.c:14: if (t == USB_IS_FLOPPY) { + dec l + jr NZ,l_chufi_init_00104 +;source-doc/ufi-drv/ufi-init.c:15: const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen call _find_storage_dev -;source-doc/ufi-drv/ufi-init.c:25: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; +;source-doc/ufi-drv/ufi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; ld (ix-3),l ld (ix-2),0x00 + ld a,l ld c,l - pop hl - push hl - add hl, hl - ld de,_hbios_usb_storage_devices - add hl, de - ld e,l - ld d,h + ld b,0x00 + add a, a + rl b + add a, +((_hbios_usb_storage_devices) & 0xFF) + ld e, a + ld a, b + adc a, +((_hbios_usb_storage_devices) / 256) + ld d, a + ld l, e + ld h, d inc c ld (hl), c -;source-doc/ufi-drv/ufi-init.c:26: hbios_usb_storage_devices[dev_index].usb_device = index; +;source-doc/ufi-drv/ufi-init.c:18: hbios_usb_storage_devices[dev_index].usb_device = index; ld c, e ld b, d inc bc ld a,(ix-1) ld (bc), a -;source-doc/ufi-drv/ufi-init.c:28: print_string("\r\nUSB: FLOPPY @ $"); +;source-doc/ufi-drv/ufi-init.c:20: print_string("\r\nUSB: FLOPPY @ $"); push de ld hl,ufi_init_str_0 call _print_string pop de -;source-doc/ufi-drv/ufi-init.c:29: print_uint16(index); +;source-doc/ufi-drv/ufi-init.c:21: print_uint16(index); ld l,(ix-1) ld h,0x00 push de call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:30: print_string(":$"); +;source-doc/ufi-drv/ufi-init.c:22: print_string(":$"); ld hl,ufi_init_str_1 call _print_string pop de -;source-doc/ufi-drv/ufi-init.c:31: print_uint16(dev_index + 1); +;source-doc/ufi-drv/ufi-init.c:23: print_uint16(dev_index + 1); pop hl push hl inc hl push de call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:32: print_string(" $"); +;source-doc/ufi-drv/ufi-init.c:24: print_string(" $"); ld hl,ufi_init_str_2 call _print_string pop de -;source-doc/ufi-drv/ufi-init.c:33: dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); +;source-doc/ufi-drv/ufi-init.c:25: dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); ld hl,_ch_ufi_fntbl call _dio_add_entry -l_chufi_init_00106: -;source-doc/ufi-drv/ufi-init.c:36: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +l_chufi_init_00104: +;source-doc/ufi-drv/ufi-init.c:28: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 - jr NZ,l_chufi_init_00105 -l_chufi_init_00108: -;source-doc/ufi-drv/ufi-init.c:37: } + jr NZ,l_chufi_init_00103 +;source-doc/ufi-drv/ufi-init.c:29: } ld sp, ix pop ix ret @@ -146,333 +143,3 @@ ufi_init_str_1: ufi_init_str_2: DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/ufi-init.c:39: uint32_t chufi_get_cap(const uint16_t dev_index) { -; --------------------------------- -; Function chufi_get_cap -; --------------------------------- -_chufi_get_cap: - push ix - ld ix,0 - add ix,sp - ld hl, -72 - add hl, sp - ld sp, hl -;source-doc/ufi-drv/ufi-init.c:40: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config -;source-doc/ufi-drv/ufi-init.c:43: memset(&response, 0, sizeof(ufi_format_capacities_response)); - ld hl,0 - add hl, sp - ld b,0x12 -l_chufi_get_cap_00112: - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/ufi-init.c:45: wait_for_device_ready(dev, 25); - push de - ld a,0x19 - push af - inc sp - push de - call _wait_for_device_ready - pop af - inc sp - pop de -;source-doc/ufi-drv/ufi-init.c:49: ufi_inquiry(dev, &inquiry); - push de - ld hl,38 - add hl, sp - push hl - push de - call _ufi_inquiry - pop af - pop af - pop de -;source-doc/ufi-drv/ufi-init.c:51: wait_for_device_ready(dev, 15); - push de - ld a,0x0f - push af - inc sp - push de - call _wait_for_device_ready - pop af - inc sp - pop de -;source-doc/ufi-drv/ufi-init.c:53: const usb_error result = ufi_read_frmt_caps(dev, &response); - ld hl,0 - add hl, sp - push hl - push de - call _ufi_read_frmt_caps - pop af - pop af - ld a, l -;source-doc/ufi-drv/ufi-init.c:54: if (result != USB_ERR_OK) - or a - jr Z,l_chufi_get_cap_00102 -;source-doc/ufi-drv/ufi-init.c:55: return 0; - ld hl,0x0000 - ld e, l - ld d, l - jr l_chufi_get_cap_00103 -l_chufi_get_cap_00102: -;source-doc/ufi-drv/ufi-init.c:57: return convert_from_msb_first(response.descriptors[0].number_of_blocks); - ld hl,4 - add hl, sp - push hl - call _convert_from_msb_first - pop af -l_chufi_get_cap_00103: -;source-doc/ufi-drv/ufi-init.c:58: } - ld sp, ix - pop ix - ret -;source-doc/ufi-drv/ufi-init.c:60: uint8_t chufi_read(const uint16_t dev_index, uint8_t *const buffer) { -; --------------------------------- -; Function chufi_read -; --------------------------------- -_chufi_read: - push ix - ld ix,0 - add ix,sp - ld hl, -20 - add hl, sp - ld sp, hl -;source-doc/ufi-drv/ufi-init.c:61: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config -;source-doc/ufi-drv/ufi-init.c:63: if (wait_for_device_ready((device_config *)dev, 20) != 0) - push de - ld c,e - ld b,d - push de - ld a,0x14 - push af - inc sp - push bc - call _wait_for_device_ready - pop af - inc sp - ld a, l - pop de - pop bc - or a - jr Z,l_chufi_read_00102 -;source-doc/ufi-drv/ufi-init.c:64: return -1; // Not READY! - ld l,0xff - jr l_chufi_read_00109 -l_chufi_read_00102: -;source-doc/ufi-drv/ufi-init.c:69: memset(&sense_codes, 0, sizeof(sense_codes)); - ld hl,0 - add hl, sp - xor a - ld (hl), a - inc hl - ld (hl), a -;source-doc/ufi-drv/ufi-init.c:71: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) - ld hl,12 - add hl, de - ld e, (hl) - inc hl - ld d, (hl) - push bc - ld hl,2 - add hl, sp - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - ld a,0x01 - push af - inc sp - push de - xor a - push af - inc sp - push bc - call _ufi_read_write_sector - pop af - pop af - pop af - pop af - pop af - ld a, l - pop bc - or a - jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/ufi-init.c:72: return -1; // general error - ld l,0xff - jr l_chufi_read_00109 -l_chufi_read_00104: -;source-doc/ufi-drv/ufi-init.c:75: memset(&response, 0, sizeof(response)); - push bc - ld hl,4 - add hl, sp - ld b,0x09 -l_chufi_read_00139: - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - djnz l_chufi_read_00139 - pop bc -;source-doc/ufi-drv/ufi-init.c:77: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) - ld hl,2 - add hl, sp - push hl - push bc - call _ufi_request_sense - pop af - pop af - ld a, l - or a - jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/ufi-init.c:78: return -1; // error - ld l,0xff - jr l_chufi_read_00109 -l_chufi_read_00106: -;source-doc/ufi-drv/ufi-init.c:82: const uint8_t sense_key = response.sense_key; - ld hl,4 - add hl, sp - ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:84: if (sense_key != 0) - and 0x0f - jr Z,l_chufi_read_00108 -;source-doc/ufi-drv/ufi-init.c:85: return -1; - ld l,0xff - jr l_chufi_read_00109 -l_chufi_read_00108: -;source-doc/ufi-drv/ufi-init.c:87: return USB_ERR_OK; - ld l,0x00 -l_chufi_read_00109: -;source-doc/ufi-drv/ufi-init.c:88: } - ld sp, ix - pop ix - ret -;source-doc/ufi-drv/ufi-init.c:90: usb_error chufi_write(const uint16_t dev_index, uint8_t *const buffer) { -; --------------------------------- -; Function chufi_write -; --------------------------------- -_chufi_write: - push ix - ld ix,0 - add ix,sp - ld hl, -20 - add hl, sp - ld sp, hl -;source-doc/ufi-drv/ufi-init.c:91: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config -;source-doc/ufi-drv/ufi-init.c:93: if (wait_for_device_ready((device_config *)dev, 20) != 0) - push de - ld c,e - ld b,d - push de - ld a,0x14 - push af - inc sp - push bc - call _wait_for_device_ready - pop af - inc sp - ld a, l - pop de - pop bc - or a - jr Z,l_chufi_write_00102 -;source-doc/ufi-drv/ufi-init.c:94: return -1; // Not READY! - ld l,0xff - jr l_chufi_write_00109 -l_chufi_write_00102: -;source-doc/ufi-drv/ufi-init.c:98: memset(&sense_codes, 0, sizeof(sense_codes)); - ld hl,0 - add hl, sp - xor a - ld (hl), a - inc hl - ld (hl), a -;source-doc/ufi-drv/ufi-init.c:99: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { - ld hl,12 - add hl, de - ld e, (hl) - inc hl - ld d, (hl) - push bc - ld hl,2 - add hl, sp - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - ld a,0x01 - push af - inc sp - push de - ld a,0x01 - push af - inc sp - push bc - call _ufi_read_write_sector - pop af - pop af - pop af - pop af - pop af - ld a, l - pop bc - or a - jr Z,l_chufi_write_00104 -;source-doc/ufi-drv/ufi-init.c:100: return -1; - ld l,0xff - jr l_chufi_write_00109 -l_chufi_write_00104: -;source-doc/ufi-drv/ufi-init.c:104: memset(&response, 0, sizeof(response)); - push bc - ld hl,4 - add hl, sp - ld b,0x09 -l_chufi_write_00139: - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - djnz l_chufi_write_00139 - pop bc -;source-doc/ufi-drv/ufi-init.c:106: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { - ld hl,2 - add hl, sp - push hl - push bc - call _ufi_request_sense - pop af - pop af - ld a, l - or a - jr Z,l_chufi_write_00106 -;source-doc/ufi-drv/ufi-init.c:107: return -1; - ld l,0xff - jr l_chufi_write_00109 -l_chufi_write_00106: -;source-doc/ufi-drv/ufi-init.c:112: const uint8_t sense_key = response.sense_key; - ld hl,4 - add hl, sp - ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:114: if (sense_key != 0) - and 0x0f - jr Z,l_chufi_write_00108 -;source-doc/ufi-drv/ufi-init.c:115: return -1; - ld l,0xff - jr l_chufi_write_00109 -l_chufi_write_00108: -;source-doc/ufi-drv/ufi-init.c:117: return USB_ERR_OK; - ld l,0x00 -l_chufi_write_00109: -;source-doc/ufi-drv/ufi-init.c:118: } - ld sp, ix - pop ix - ret diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s new file mode 100644 index 00000000..277d864c --- /dev/null +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s @@ -0,0 +1,380 @@ +; +; Generated from source-doc/ufi-drv/ufi_driver.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/ufi-drv/ufi_driver.c:6: uint32_t usb_ufi_get_cap(const uint16_t dev_index) { +; --------------------------------- +; Function usb_ufi_get_cap +; --------------------------------- +_usb_ufi_get_cap: + push ix + ld ix,0 + add ix,sp + ld hl, -72 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/ufi_driver.c:7: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/ufi-drv/ufi_driver.c:10: memset(&response, 0, sizeof(ufi_format_capacities_response)); + ld hl,0 + add hl, sp + ld b,0x12 +l_usb_ufi_get_cap_00112: + xor a + ld (hl), a + inc hl + ld (hl), a + inc hl + djnz l_usb_ufi_get_cap_00112 +;source-doc/ufi-drv/ufi_driver.c:12: wait_for_device_ready(dev, 25); + push de + ld a,0x19 + push af + inc sp + push de + call _wait_for_device_ready + pop af + inc sp + pop de +;source-doc/ufi-drv/ufi_driver.c:16: ufi_inquiry(dev, &inquiry); + push de + ld hl,38 + add hl, sp + push hl + push de + call _ufi_inquiry + pop af + pop af + pop de +;source-doc/ufi-drv/ufi_driver.c:18: wait_for_device_ready(dev, 15); + push de + ld a,0x0f + push af + inc sp + push de + call _wait_for_device_ready + pop af + inc sp + pop de +;source-doc/ufi-drv/ufi_driver.c:20: const usb_error result = ufi_read_frmt_caps(dev, &response); + ld hl,0 + add hl, sp + push hl + push de + call _ufi_read_frmt_caps + pop af + pop af + ld a, l +;source-doc/ufi-drv/ufi_driver.c:21: if (result != USB_ERR_OK) + or a + jr Z,l_usb_ufi_get_cap_00102 +;source-doc/ufi-drv/ufi_driver.c:22: return 0; + ld hl,0x0000 + ld e, l + ld d, l + jr l_usb_ufi_get_cap_00103 +l_usb_ufi_get_cap_00102: +;source-doc/ufi-drv/ufi_driver.c:24: return convert_from_msb_first(response.descriptors[0].number_of_blocks); + ld hl,4 + add hl, sp + push hl + call _convert_from_msb_first + pop af +l_usb_ufi_get_cap_00103: +;source-doc/ufi-drv/ufi_driver.c:25: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/ufi_driver.c:27: uint8_t usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer) { +; --------------------------------- +; Function usb_ufi_read +; --------------------------------- +_usb_ufi_read: + push ix + ld ix,0 + add ix,sp + ld hl, -20 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/ufi_driver.c:28: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/ufi-drv/ufi_driver.c:30: if (wait_for_device_ready((device_config *)dev, 20) != 0) + push de + ld c,e + ld b,d + push de + ld a,0x14 + push af + inc sp + push bc + call _wait_for_device_ready + pop af + inc sp + ld a, l + pop de + pop bc + or a + jr Z,l_usb_ufi_read_00102 +;source-doc/ufi-drv/ufi_driver.c:31: return -1; // Not READY! + ld l,0xff + jr l_usb_ufi_read_00109 +l_usb_ufi_read_00102: +;source-doc/ufi-drv/ufi_driver.c:36: memset(&sense_codes, 0, sizeof(sense_codes)); + ld hl,0 + add hl, sp + xor a + ld (hl), a + inc hl + ld (hl), a +;source-doc/ufi-drv/ufi_driver.c:38: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) + ld hl,12 + add hl, de + ld e, (hl) + inc hl + ld d, (hl) + push bc + ld hl,2 + add hl, sp + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld a,0x01 + push af + inc sp + push de + xor a + push af + inc sp + push bc + call _ufi_read_write_sector + pop af + pop af + pop af + pop af + pop af + ld a, l + pop bc + or a + jr Z,l_usb_ufi_read_00104 +;source-doc/ufi-drv/ufi_driver.c:39: return -1; // general error + ld l,0xff + jr l_usb_ufi_read_00109 +l_usb_ufi_read_00104: +;source-doc/ufi-drv/ufi_driver.c:42: memset(&response, 0, sizeof(response)); + push bc + ld hl,4 + add hl, sp + ld b,0x09 +l_usb_ufi_read_00139: + xor a + ld (hl), a + inc hl + ld (hl), a + inc hl + djnz l_usb_ufi_read_00139 + pop bc +;source-doc/ufi-drv/ufi_driver.c:44: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) + ld hl,2 + add hl, sp + push hl + push bc + call _ufi_request_sense + pop af + pop af + ld a, l + or a + jr Z,l_usb_ufi_read_00106 +;source-doc/ufi-drv/ufi_driver.c:45: return -1; // error + ld l,0xff + jr l_usb_ufi_read_00109 +l_usb_ufi_read_00106: +;source-doc/ufi-drv/ufi_driver.c:49: const uint8_t sense_key = response.sense_key; + ld hl,4 + add hl, sp + ld a, (hl) +;source-doc/ufi-drv/ufi_driver.c:51: if (sense_key != 0) + and 0x0f + jr Z,l_usb_ufi_read_00108 +;source-doc/ufi-drv/ufi_driver.c:52: return -1; + ld l,0xff + jr l_usb_ufi_read_00109 +l_usb_ufi_read_00108: +;source-doc/ufi-drv/ufi_driver.c:54: return USB_ERR_OK; + ld l,0x00 +l_usb_ufi_read_00109: +;source-doc/ufi-drv/ufi_driver.c:55: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/ufi_driver.c:57: usb_error usb_ufi_write(const uint16_t dev_index, uint8_t *const buffer) { +; --------------------------------- +; Function usb_ufi_write +; --------------------------------- +_usb_ufi_write: + push ix + ld ix,0 + add ix,sp + ld hl, -20 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/ufi_driver.c:58: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/ufi-drv/ufi_driver.c:60: if (wait_for_device_ready((device_config *)dev, 20) != 0) + push de + ld c,e + ld b,d + push de + ld a,0x14 + push af + inc sp + push bc + call _wait_for_device_ready + pop af + inc sp + ld a, l + pop de + pop bc + or a + jr Z,l_usb_ufi_write_00102 +;source-doc/ufi-drv/ufi_driver.c:61: return -1; // Not READY! + ld l,0xff + jr l_usb_ufi_write_00109 +l_usb_ufi_write_00102: +;source-doc/ufi-drv/ufi_driver.c:65: memset(&sense_codes, 0, sizeof(sense_codes)); + ld hl,0 + add hl, sp + xor a + ld (hl), a + inc hl + ld (hl), a +;source-doc/ufi-drv/ufi_driver.c:66: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { + ld hl,12 + add hl, de + ld e, (hl) + inc hl + ld d, (hl) + push bc + ld hl,2 + add hl, sp + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld a,0x01 + push af + inc sp + push de + ld a,0x01 + push af + inc sp + push bc + call _ufi_read_write_sector + pop af + pop af + pop af + pop af + pop af + ld a, l + pop bc + or a + jr Z,l_usb_ufi_write_00104 +;source-doc/ufi-drv/ufi_driver.c:67: return -1; + ld l,0xff + jr l_usb_ufi_write_00109 +l_usb_ufi_write_00104: +;source-doc/ufi-drv/ufi_driver.c:71: memset(&response, 0, sizeof(response)); + push bc + ld hl,4 + add hl, sp + ld b,0x09 +l_usb_ufi_write_00139: + xor a + ld (hl), a + inc hl + ld (hl), a + inc hl + djnz l_usb_ufi_write_00139 + pop bc +;source-doc/ufi-drv/ufi_driver.c:73: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { + ld hl,2 + add hl, sp + push hl + push bc + call _ufi_request_sense + pop af + pop af + ld a, l + or a + jr Z,l_usb_ufi_write_00106 +;source-doc/ufi-drv/ufi_driver.c:74: return -1; + ld l,0xff + jr l_usb_ufi_write_00109 +l_usb_ufi_write_00106: +;source-doc/ufi-drv/ufi_driver.c:79: const uint8_t sense_key = response.sense_key; + ld hl,4 + add hl, sp + ld a, (hl) +;source-doc/ufi-drv/ufi_driver.c:81: if (sense_key != 0) + and 0x0f + jr Z,l_usb_ufi_write_00108 +;source-doc/ufi-drv/ufi_driver.c:82: return -1; + ld l,0xff + jr l_usb_ufi_write_00109 +l_usb_ufi_write_00108: +;source-doc/ufi-drv/ufi_driver.c:84: return USB_ERR_OK; + ld l,0x00 +l_usb_ufi_write_00109: +;source-doc/ufi-drv/ufi_driver.c:85: } + ld sp, ix + pop ix + ret diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index 391762d1..917a28f9 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -66,7 +66,7 @@ UKY_SCNCNT .EQU $ - 1 LD (UKY_INT_SP),SP ; SAVE ORIGINAL STACK FRAME LD SP,UKY_INTSTK ; USE DEDICATED INT STACK FRAME IN HI MEM - CALL _keyboard_tick + CALL _usb_kyb_tick LD SP, $FFFF ; RESTORE ORIGINAL STACK FRAME UKY_INT_SP .EQU $ - 2 @@ -119,7 +119,7 @@ UKY_STAT: push hl ; address of potential que'd next usb report HB_DI - call _keyboard_buf_size + call _usb_kyb_buf_size HB_EI ld a, l ld b, h @@ -164,7 +164,7 @@ no_queued_reports: ; UKY_FLUSH: HB_DI - CALL _keyboard_buf_flush + CALL _usb_kyb_flush HB_EI XOR A RET @@ -205,7 +205,7 @@ UKY_FLUSH: ; UKY_READ: HB_DI - CALL _keyboard_buf_get_next + CALL _usb_kyb_buf_get_next HB_EI LD A, H OR A diff --git a/Source/HBIOS/ch376scsi.asm b/Source/HBIOS/ch376scsi.asm index 1144e48d..0aab0cef 100644 --- a/Source/HBIOS/ch376scsi.asm +++ b/Source/HBIOS/ch376scsi.asm @@ -75,7 +75,7 @@ CH_SCSI_SEEK: PUSH DE PUSH HL PUSH IY - CALL _scsi_seek + CALL _usb_scsi_seek POP IY POP HL POP DE @@ -113,7 +113,7 @@ CH_SCSI_READ: ; HL = HL + 512 PUSH HL PUSH IY - call _scsi_read + CALL _usb_scsi_read LD A, L POP IY POP HL @@ -151,7 +151,7 @@ CH_SCSI_WRITE: ; HL = HL + 512 PUSH HL PUSH IY - call _scsi_write + CALL _usb_scsi_write LD A, L POP IY POP HL @@ -268,7 +268,7 @@ CH_SCSI_CAP: PUSH IX PUSH IY - call _scsi_read_capacity + CALL _usb_scsi_read_capacity POP IY POP IX diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm index e8b5c8ac..3154c7c5 100644 --- a/Source/HBIOS/ch376ufi.asm +++ b/Source/HBIOS/ch376ufi.asm @@ -5,7 +5,7 @@ ; #include "./ch376-native/ufi-drv.s" -_ufi_seek .EQU _scsi_seek +_ufi_seek .EQU _usb_scsi_seek ; find and mount all floppy USB drives CHUFI_INIT .EQU _chufi_init @@ -111,7 +111,7 @@ CH_UFI_READ: PUSH HL PUSH IY - call _chufi_read + CALL _usb_ufi_read LD L, 0 LD A, L POP IY @@ -150,7 +150,7 @@ CH_UFI_WRITE: ; HL = HL + 512 PUSH HL PUSH IY - call _chufi_write + CALL _usb_ufi_write LD A, L POP IY POP HL @@ -267,7 +267,7 @@ CH_UFI_CAP: EXX PUSH IY - call _chufi_get_cap + CALL _usb_ufi_get_cap POP IY LD BC, 512 XOR A