diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s index 4a86dcf6..68f236e6 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s @@ -923,65 +923,7 @@ l_read_all_configs_00112: ld sp, ix pop ix ret -;source-doc/base-drv/enumerate.c:189: static uint8_t count_storage_devs(enumeration_state *state) { -; --------------------------------- -; Function count_storage_devs -; --------------------------------- -_count_storage_devs: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/enumerate.c:192: do { - ld c,0x01 -l_count_storage_devs_00106: -;source-doc/base-drv/enumerate.c:193: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); - push bc - ld a, c - call _get_usb_device_config - pop bc -;source-doc/base-drv/enumerate.c:195: if (storage_device == NULL) - ld a, d - or e - jr Z,l_count_storage_devs_00108 -;source-doc/base-drv/enumerate.c:198: const usb_device_type t = storage_device->type; - ld l, e - ld h, d - ld a, (hl) - and 0x0f -;source-doc/base-drv/enumerate.c:200: if (t == USB_IS_FLOPPY || t == USB_IS_MASS_STORAGE) - cp 0x01 - jr Z,l_count_storage_devs_00103 - sub 0x02 - jr NZ,l_count_storage_devs_00107 -l_count_storage_devs_00103: -;source-doc/base-drv/enumerate.c:201: storage_device->drive_index = state->storage_count++; - ld hl,0x0010 - add hl, de - ex de, hl - ld l,(ix+4) - ld h,(ix+5) - inc hl - ld a, (hl) - ld b, a - inc b - ld (hl), b - ld (de), a -l_count_storage_devs_00107: -;source-doc/base-drv/enumerate.c:203: } while (++index != MAX_NUMBER_OF_DEVICES + 1); - inc c - ld a, c - sub 0x07 - jr NZ,l_count_storage_devs_00106 -l_count_storage_devs_00108: -;source-doc/base-drv/enumerate.c:205: return state->storage_count; - ld l,(ix+4) - ld h,(ix+5) - inc hl - ld l, (hl) -;source-doc/base-drv/enumerate.c:206: } - pop ix - ret -;source-doc/base-drv/enumerate.c:208: usb_error enumerate_all_devices(void) { +;source-doc/base-drv/enumerate.c:189: usb_error enumerate_all_devices(void) { ; --------------------------------- ; Function enumerate_all_devices ; --------------------------------- @@ -990,35 +932,28 @@ _enumerate_all_devices: ld ix,0 add ix,sp push af -;source-doc/base-drv/enumerate.c:209: _usb_state *const work_area = get_usb_work_area(); -;source-doc/base-drv/enumerate.c:211: memset(&state, 0, sizeof(enumeration_state)); +;source-doc/base-drv/enumerate.c:190: _usb_state *const work_area = get_usb_work_area(); +;source-doc/base-drv/enumerate.c:192: memset(&state, 0, sizeof(enumeration_state)); ld hl,0 add hl, sp + ld e,l + ld d,h xor a ld (hl), a inc hl ld (hl), a -;source-doc/base-drv/enumerate.c:213: usb_error result = read_all_configs(&state); - ld hl,0 - add hl, sp - push hl - push hl +;source-doc/base-drv/enumerate.c:194: usb_error result = read_all_configs(&state); + push de + push de call _read_all_configs pop af - ld c, l - pop hl -;source-doc/base-drv/enumerate.c:215: count_storage_devs(&state); - push bc - push hl - call _count_storage_devs - pop af - pop bc -;source-doc/base-drv/enumerate.c:217: work_area->count_of_detected_usb_devices = state.next_device_address; - ld a,(ix-2) - ld ((_x + 1)),a -;source-doc/base-drv/enumerate.c:220: return result; - ld l, c -;source-doc/base-drv/enumerate.c:221: } + pop de +;source-doc/base-drv/enumerate.c:196: work_area->count_of_detected_usb_devices = state.next_device_address; + ld bc,_x + 1 + ld a, (de) + ld (bc), a +;source-doc/base-drv/enumerate.c:199: return result; +;source-doc/base-drv/enumerate.c:200: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s b/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s index 578b9289..dfc56fb0 100644 --- a/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s +++ b/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s @@ -34,7 +34,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk _hbios_usb_storage_devices: - DEFS 24 + DEFS 12 #ENDIF @@ -55,7 +55,7 @@ _hbios_usb_storage_devices: ; Function find_storage_dev ; --------------------------------- _find_storage_dev: -;source-doc/base-drv/hbios-driver-storage.c:6: for(uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) +;source-doc/base-drv/hbios-driver-storage.c:6: for (uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) ld c,0x00 ld de,_hbios_usb_storage_devices+0 ld b,c @@ -63,22 +63,19 @@ l_find_storage_dev_00105: ld a, b sub 0x06 jr NC,l_find_storage_dev_00103 -;source-doc/base-drv/hbios-driver-storage.c:7: if (hbios_usb_storage_devices[i].storage_device == NULL) +;source-doc/base-drv/hbios-driver-storage.c:7: if (hbios_usb_storage_devices[i].drive_index == 0) ld l, b ld h,0x00 add hl, hl - add hl, hl add hl, de ld a, (hl) - inc hl - ld l, (hl) - or l + or a jr NZ,l_find_storage_dev_00106 ;source-doc/base-drv/hbios-driver-storage.c:8: return i; ld l, c jr l_find_storage_dev_00107 l_find_storage_dev_00106: -;source-doc/base-drv/hbios-driver-storage.c:6: for(uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) +;source-doc/base-drv/hbios-driver-storage.c:6: for (uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) inc b ld c, b jr l_find_storage_dev_00105 @@ -89,7 +86,6 @@ l_find_storage_dev_00107: ;source-doc/base-drv/hbios-driver-storage.c:11: } ret _hbios_usb_storage_devices: - DEFW +0x0000 DEFB +0x00 DEFB +0x00 DEFB 0x00 @@ -102,13 +98,3 @@ _hbios_usb_storage_devices: 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/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index 8006021c..f8e7284e 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,35 +48,27 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/usb-base-drv.c:3: uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { +;source-doc/base-drv/usb-base-drv.c:4: uint8_t scsi_seek(const uint16_t dev_index, const uint32_t lba) { ; --------------------------------- -; Function chnative_seek +; Function scsi_seek ; --------------------------------- -_chnative_seek: +_scsi_seek: push ix ld ix,0 add ix,sp - ld c, l - ld b, h -;source-doc/base-drv/usb-base-drv.c:4: storage_device->current_lba = lba; - ld h,(ix+5) +;source-doc/base-drv/usb-base-drv.c:5: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); ld a,(ix+4) - add a,0x0c - ld l, a - jr NC,l_chnative_seek_00103 - inc h -l_chnative_seek_00103: - ld (hl), e - inc hl - ld (hl), d - inc hl - ld (hl), c - inc hl - ld (hl), b -;source-doc/base-drv/usb-base-drv.c:5: return 0; - xor a -;source-doc/base-drv/usb-base-drv.c:6: } + call _get_usb_device_config +;source-doc/base-drv/usb-base-drv.c:7: dev->current_lba = lba; + ld hl,0x000c + add hl, de + ex de, hl + ld hl,6 + add hl, sp + ld bc,0x0004 + ldir +;source-doc/base-drv/usb-base-drv.c:8: return 0; + ld l,0x00 +;source-doc/base-drv/usb-base-drv.c:9: } pop ix - pop hl - pop bc - jp (hl) + 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 index 1d3054c2..a8b35de0 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_init.c.s @@ -169,7 +169,7 @@ l_usb_init_00108: 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,0x35 + ld b,0x32 ld hl,_x jr l_usb_init_00163 l_usb_init_00162: 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 660e8572..6c8e49a5 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -89,8 +89,8 @@ l_count_of_devices_00106: ret _device_config_sizes: DEFB +0x00 - DEFB +0x11 - DEFB +0x11 + DEFB +0x10 + DEFB +0x10 DEFB +0x0c DEFB +0x06 DEFB 0x00 @@ -174,7 +174,7 @@ l_next_device_config_00102: adc a, d ld d, a ;source-doc/base-drv/usb_state.c:64: if (result >= (device_config *)&usb_state->device_configs_end) - ld hl,0x0068 + ld hl,0x0062 add hl, bc ld a, e sub l diff --git a/Source/HBIOS/ch376-native/base-drv/work-area.c.s b/Source/HBIOS/ch376-native/base-drv/work-area.c.s index 0449816b..e08c9fe6 100644 --- a/Source/HBIOS/ch376-native/base-drv/work-area.c.s +++ b/Source/HBIOS/ch376-native/base-drv/work-area.c.s @@ -34,7 +34,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk _x: - DEFS 105 + DEFS 99 #ENDIF @@ -149,10 +149,4 @@ _x: 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/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index a56b867a..02c7bc98 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -41,8 +41,6 @@ _csw: DEFS 13 _scsi_packet_read_capacity: DEFS 12 -_scsi_packet_inquiry: - DEFS 12 _scsi_packet_request_sense: DEFS 12 _cbw: @@ -297,7 +295,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(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { +;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 ; --------------------------------- @@ -308,114 +306,58 @@ _scsi_read_capacity: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:56: cbw_scsi.cbw = scsi_command_block_wrapper; - ld hl,0 +;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 - ld e,l - ld d,h - push hl + ex de, hl ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:57: cbw_scsi.read_capacity = scsi_packet_read_capacity; + 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 bc -;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWLUN = 0; + 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:60: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); +;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:61: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); - ld hl,0x0008 - add hl, bc - ld (hl),0x08 - inc hl +;source-doc/scsi-drv/class_scsi.c:63: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); + ld (ix-19),0x08 xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - ld (hl), a -;source-doc/scsi-drv/class_scsi.c:63: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); - ld e,(ix+6) - ld d,(ix+7) + 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 de push bc - ld l,(ix+4) - ld h,(ix+5) - push hl - call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:64: } - ld sp,ix - pop ix - ret -;source-doc/scsi-drv/class_scsi.c:68: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { -; --------------------------------- -; Function scsi_inquiry -; --------------------------------- -_scsi_inquiry: - push ix - ld ix,0 - add ix,sp - ld hl, -27 + ld hl,3 add hl, sp - ld sp, hl -;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.cbw = scsi_command_block_wrapper; - ld hl,0 - add hl, sp - ld e,l - ld d,h push hl - ld bc,0x000f - ld hl,_scsi_command_block_wrapper - ldir -;source-doc/scsi-drv/class_scsi.c:71: cbw_scsi.inquiry = scsi_packet_inquiry; - ld hl,17 - add hl, sp - ex de, hl - ld bc,0x000c - ld hl,_scsi_packet_inquiry - ldir - pop bc -;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWLUN = 0; - ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); - ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:75: cbw_scsi.cbw.dCBWDataTransferLength = 0x24; - ld hl,0x0008 - add hl, bc - ld (hl),0x24 - inc hl - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - ld (hl), a -;source-doc/scsi-drv/class_scsi.c:77: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); - ld e,(ix+6) - ld d,(ix+7) - xor a - push af - inc sp push de - push bc - ld l,(ix+4) - ld h,(ix+5) - push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:78: } - ld sp,ix + 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:80: usb_error scsi_test(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:84: static usb_error scsi_test(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_test ; --------------------------------- @@ -426,7 +368,7 @@ _scsi_test: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:82: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -435,7 +377,7 @@ _scsi_test: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:83: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); +;source-doc/scsi-drv/class_scsi.c:87: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); ld hl,17 add hl, sp ld b,0x06 @@ -447,11 +389,11 @@ l_scsi_test_00103: inc hl djnz l_scsi_test_00103 pop bc -;source-doc/scsi-drv/class_scsi.c:85: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:89: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); +;source-doc/scsi-drv/class_scsi.c:90: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:87: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:91: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,0x0008 add hl, bc xor a @@ -462,7 +404,7 @@ l_scsi_test_00103: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:89: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/class_scsi.c:93: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -473,11 +415,11 @@ l_scsi_test_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:90: } +;source-doc/scsi-drv/class_scsi.c:94: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:94: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +;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) { ; --------------------------------- ; Function scsi_request_sense ; --------------------------------- @@ -488,7 +430,7 @@ _scsi_request_sense: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:96: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -497,7 +439,7 @@ _scsi_request_sense: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:97: cbw_scsi.request_sense = scsi_packet_request_sense; +;source-doc/scsi-drv/class_scsi.c:101: cbw_scsi.request_sense = scsi_packet_request_sense; ld hl,17 add hl, sp ex de, hl @@ -505,11 +447,11 @@ _scsi_request_sense: ld hl,_scsi_packet_request_sense ldir pop bc -;source-doc/scsi-drv/class_scsi.c:99: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:103: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); +;source-doc/scsi-drv/class_scsi.c:104: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:101: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); +;source-doc/scsi-drv/class_scsi.c:105: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); ld hl,0x0008 add hl, bc ld (hl),0x12 @@ -520,7 +462,7 @@ _scsi_request_sense: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:103: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); +;source-doc/scsi-drv/class_scsi.c:107: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); ld e,(ix+6) ld d,(ix+7) xor a @@ -532,11 +474,11 @@ _scsi_request_sense: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:104: } +;source-doc/scsi-drv/class_scsi.c:108: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:106: usb_error scsi_sense_init(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:110: usb_error scsi_sense_init(const uint16_t dev_index) { ; --------------------------------- ; Function scsi_sense_init ; --------------------------------- @@ -547,62 +489,52 @@ _scsi_sense_init: ld hl, -18 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:110: critical_begin(); +;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 -;source-doc/scsi-drv/class_scsi.c:111: while ((result = scsi_test(dev)) && --counter > 0) + 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 - ld l,(ix+4) - ld h,(ix+5) - push hl + 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:112: scsi_request_sense(dev, &response); +;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 - ld l,(ix+4) - ld h,(ix+5) - 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:113: critical_end(); +;source-doc/scsi-drv/class_scsi.c:119: critical_end(); call _critical_end -;source-doc/scsi-drv/class_scsi.c:115: return result; +;source-doc/scsi-drv/class_scsi.c:121: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:116: } +;source-doc/scsi-drv/class_scsi.c:122: } ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:120: void spike_x(void) { -; --------------------------------- -; Function spike_x -; --------------------------------- -_spike_x: -;source-doc/scsi-drv/class_scsi.c:121: scsi_read(5, NULL); - ld hl,0x0000 - push hl - ld l,0x05 - push hl - call _scsi_read - pop af - pop af -;source-doc/scsi-drv/class_scsi.c:122: } - ret -;source-doc/scsi-drv/class_scsi.c:124: usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { +;source-doc/scsi-drv/class_scsi.c:126: usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_read ; --------------------------------- @@ -611,12 +543,12 @@ _scsi_read: ld ix,0 add ix,sp push af -;source-doc/scsi-drv/class_scsi.c:125: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); +;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:127: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;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 @@ -629,28 +561,28 @@ l_scsi_read_00113: ld (hl),0x00 inc hl djnz l_scsi_read_00112 -;source-doc/scsi-drv/class_scsi.c:128: cbw.cbw = scsi_command_block_wrapper; +;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:130: cbw.cbw.bCBWLUN = 0; +;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:131: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;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:132: cbw.cbw.dCBWDataTransferLength = 512; +;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:134: cbw.scsi_cmd.operation_code = 0x28; // read operation +;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:135: cbw.scsi_cmd.transfer_len[1] = 1; +;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:136: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; +;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 @@ -662,8 +594,8 @@ l_scsi_read_00113: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:137: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:138: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;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 @@ -674,11 +606,11 @@ l_scsi_read_00113: ld e, (hl) ld hl, +(_cbw + 19) ld (hl), e -;source-doc/scsi-drv/class_scsi.c:139: cbw.scsi_cmd.lba[3] = dev->current_lba; +;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:141: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); +;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 @@ -699,11 +631,11 @@ l_scsi_read_00113: pop bc ld a, l ld (_result), a -;source-doc/scsi-drv/class_scsi.c:143: if (result == USB_ERR_OK) +;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:144: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:146: dev->current_lba++; ld l, c ld h, b ld e, (hl) @@ -732,13 +664,13 @@ l_scsi_read_00114: ld a, h ld (bc), a l_scsi_read_00102: -;source-doc/scsi-drv/class_scsi.c:145: return result; +;source-doc/scsi-drv/class_scsi.c:147: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:146: } +;source-doc/scsi-drv/class_scsi.c:148: } ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:148: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/scsi-drv/class_scsi.c:150: usb_error scsi_write(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_write ; --------------------------------- @@ -746,7 +678,13 @@ _scsi_write: push ix ld ix,0 add ix,sp -;source-doc/scsi-drv/class_scsi.c:149: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + 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 @@ -759,30 +697,30 @@ l_scsi_write_00113: ld (hl),0x00 inc hl djnz l_scsi_write_00112 -;source-doc/scsi-drv/class_scsi.c:150: cbw.cbw = scsi_command_block_wrapper; +;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:152: cbw.cbw.bCBWLUN = 0; +;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:153: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;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:154: cbw.cbw.dCBWDataTransferLength = 512; +;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:156: cbw.scsi_cmd.operation_code = 0x2A; // write operation +;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:157: cbw.scsi_cmd.transfer_len[1] = 1; +;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:158: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld l,(ix+4) - ld h,(ix+5) +;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 @@ -792,8 +730,8 @@ l_scsi_write_00113: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:159: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:160: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;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 @@ -804,11 +742,11 @@ l_scsi_write_00113: ld e, (hl) ld hl, +(_cbw + 19) ld (hl), e -;source-doc/scsi-drv/class_scsi.c:161: cbw.scsi_cmd.lba[3] = dev->current_lba; +;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:163: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); +;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 @@ -818,8 +756,8 @@ l_scsi_write_00113: push de ld hl,_cbw push hl - ld l,(ix+4) - ld h,(ix+5) + ld l,(ix-2) + ld h,(ix-1) push hl call _do_scsi_cmd pop af @@ -829,11 +767,11 @@ l_scsi_write_00113: pop bc ld a, l ld (_result), a -;source-doc/scsi-drv/class_scsi.c:165: if (result == USB_ERR_OK) +;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:166: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:170: dev->current_lba++; ld l, c ld h, b ld e, (hl) @@ -862,77 +800,10 @@ l_scsi_write_00114: ld a, h ld (bc), a l_scsi_write_00102: -;source-doc/scsi-drv/class_scsi.c:167: return result; +;source-doc/scsi-drv/class_scsi.c:171: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:168: } - pop ix - ret -;source-doc/scsi-drv/class_scsi.c:170: usb_error scsi_eject(device_config_storage *const dev) { -; --------------------------------- -; Function scsi_eject -; --------------------------------- -_scsi_eject: - push ix - ld ix,0 - add ix,sp - ld hl, -21 - add hl, sp - ld sp, hl -;source-doc/scsi-drv/class_scsi.c:172: cbw_scsi.cbw = scsi_command_block_wrapper; - ld hl,0 - add hl, sp - ld e,l - ld d,h - push hl - ld bc,0x000f - ld hl,_scsi_command_block_wrapper - ldir -;source-doc/scsi-drv/class_scsi.c:174: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); - ld hl,17 - add hl, sp - ld b,0x03 -l_scsi_eject_00103: - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - djnz l_scsi_eject_00103 - pop bc -;source-doc/scsi-drv/class_scsi.c:176: cbw_scsi.eject.operation_code = 0x1B; - ld (ix-6),0x1b -;source-doc/scsi-drv/class_scsi.c:177: cbw_scsi.eject.loej = 1; - ld hl,19 - add hl, sp - set 1, (hl) -;source-doc/scsi-drv/class_scsi.c:179: cbw_scsi.cbw.bCBWLUN = 0; - ld (ix-8),0x00 -;source-doc/scsi-drv/class_scsi.c:180: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); - ld (ix-7),0x06 -;source-doc/scsi-drv/class_scsi.c:181: cbw_scsi.cbw.dCBWDataTransferLength = 0; - ld hl,0x0008 - add hl, bc - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - ld (hl), a - inc hl - ld (hl), a -;source-doc/scsi-drv/class_scsi.c:183: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); - xor a - push af - inc sp - ld hl,0x0000 - push hl - push bc - ld l,(ix+4) - ld h,(ix+5) - push hl - call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:184: } - ld sp,ix +;source-doc/scsi-drv/class_scsi.c:172: } + ld sp, ix pop ix ret _scsi_command_block_wrapper: @@ -975,19 +846,6 @@ _scsi_packet_read_capacity: DEFB +0x00 DEFB +0x00 DEFB +0x00 -_scsi_packet_inquiry: - DEFB +0x12 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x24 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 _scsi_packet_request_sense: DEFB +0x03 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 147acfaa..904c8ba8 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -56,104 +56,90 @@ _chscsi_init: push ix ld ix,0 add ix,sp - ld hl, -5 - add hl, sp - ld sp, hl + push af + dec sp ;source-doc/scsi-drv/scsi-init.c:16: 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); 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 a,d + ld h,a or e - jp Z, l_chscsi_init_00108 + jr Z,l_chscsi_init_00108 ;source-doc/scsi-drv/scsi-init.c:22: const usb_device_type t = storage_device->type; - ld l, e - ld h, d ld a, (hl) and 0x0f ;source-doc/scsi-drv/scsi-init.c:24: 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 - push de +;source-doc/scsi-drv/scsi-init.c:25: const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen call _find_storage_dev - ld c, l - pop de -;source-doc/scsi-drv/scsi-init.c:26: hbios_usb_storage_devices[dev_index].storage_device = storage_device; - ld (ix-5),c - ld (ix-4),0x00 - pop hl - push hl - add hl, hl +;source-doc/scsi-drv/scsi-init.c:26: 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 add a, +((_hbios_usb_storage_devices) & 0xFF) ld (ix-3),a - ld l,a - ld a,h - adc a,+((_hbios_usb_storage_devices) / 256) + ld a, h + adc a, +((_hbios_usb_storage_devices) / 256) ld (ix-2),a - ld h,a - ld (hl), e - inc hl - ld (hl), d -;source-doc/scsi-drv/scsi-init.c:27: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; - ld l,(ix-3) - ld h,(ix-2) - inc hl - inc hl + pop hl + push hl inc c ld (hl), c -;source-doc/scsi-drv/scsi-init.c:28: hbios_usb_storage_devices[dev_index].usb_device = index; - ld c,(ix-3) - ld b,(ix-2) - inc bc - inc bc +;source-doc/scsi-drv/scsi-init.c:27: 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:30: print_string("\r\nUSB: MASS STORAGE @ $"); +;source-doc/scsi-drv/scsi-init.c:29: 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:31: print_uint16(index); +;source-doc/scsi-drv/scsi-init.c:30: print_uint16(index); ld l,(ix-1) ld h,0x00 + push hl push de call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:32: print_string(":$"); +;source-doc/scsi-drv/scsi-init.c:31: print_string(":$"); ld hl,scsi_init_str_1 call _print_string pop de -;source-doc/scsi-drv/scsi-init.c:33: print_uint16(dev_index + 1); pop hl +;source-doc/scsi-drv/scsi-init.c:32: print_uint16(dev_index + 1); + inc de push hl - inc hl - push de + ex de, hl call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:34: print_string(" $"); +;source-doc/scsi-drv/scsi-init.c:33: print_string(" $"); ld hl,scsi_init_str_2 call _print_string -;source-doc/scsi-drv/scsi-init.c:35: scsi_sense_init(storage_device); +;source-doc/scsi-drv/scsi-init.c:34: scsi_sense_init(index); call _scsi_sense_init pop af -;source-doc/scsi-drv/scsi-init.c:36: dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); - ld e,(ix-3) - ld d,(ix-2) +;source-doc/scsi-drv/scsi-init.c:35: 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:39: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/scsi-drv/scsi-init.c:38: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 - jp NZ,l_chscsi_init_00105 + jr NZ,l_chscsi_init_00105 l_chscsi_init_00108: -;source-doc/scsi-drv/scsi-init.c:40: } +;source-doc/scsi-drv/scsi-init.c:39: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h index cd7eaa75..54342438 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h @@ -39,7 +39,6 @@ typedef struct { COMMON_DEVICE_CONFIG // bytes: 0-2 endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt uint32_t current_lba; // bytes 12-15 - uint8_t drive_index; // byte 16 } device_config_storage; typedef struct { diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c index aec85045..f4131d8c 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c @@ -186,25 +186,6 @@ done: return result; } -static uint8_t count_storage_devs(enumeration_state *state) { - - 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; - - if (t == USB_IS_FLOPPY || t == USB_IS_MASS_STORAGE) - storage_device->drive_index = state->storage_count++; - - } while (++index != MAX_NUMBER_OF_DEVICES + 1); - - return state->storage_count; -} - usb_error enumerate_all_devices(void) { _usb_state *const work_area = get_usb_work_area(); enumeration_state state; @@ -212,8 +193,6 @@ usb_error enumerate_all_devices(void) { usb_error result = read_all_configs(&state); - count_storage_devs(&state); - work_area->count_of_detected_usb_devices = state.next_device_address; done: diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c index a5a426a4..a0b208b6 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c @@ -3,8 +3,8 @@ hbios_storage_device_t hbios_usb_storage_devices[MAX_NUMBER_OF_DEVICES] = {{NULL}}; uint8_t find_storage_dev(void) { - for(uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) - if (hbios_usb_storage_devices[i].storage_device == NULL) + for (uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) + if (hbios_usb_storage_devices[i].drive_index == 0) return i; return -1; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h index ec15480d..437bee01 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h @@ -4,7 +4,6 @@ #include "usb_state.h" typedef struct _hbios_storage_device { - device_config_storage * storage_device; uint8_t drive_index; uint8_t usb_device; } hbios_storage_device_t; 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 928b24f4..6f349813 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,6 +1,9 @@ #include "usb-base-drv.h" +#include "usb_state.h" -uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { - storage_device->current_lba = lba; +uint8_t 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; return 0; } 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 3d2abd53..f5039fd2 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 @@ -1,11 +1,12 @@ #ifndef __USB_BASE_DRV #define __USB_BASE_DRV +#include "usb_state.h" #include #include -extern uint8_t storage_count; - -extern uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1); +// 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 ufi_seek(const uint16_t dev_index, const uint32_t lba); #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 762e41c2..e5da0b94 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 @@ -51,7 +51,9 @@ done: _scsi_read_capacity scsi_packet_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}}; -usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { +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; @@ -63,21 +65,23 @@ usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacit 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}}; +// _scsi_packet_inquiry scsi_packet_inquiry = {0x12, 0, 0, 0, 0x24, 0, {0, 0, 0, 0, 0, 0}}; -usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { - cbw_scsi_inquiry cbw_scsi; - cbw_scsi.cbw = scsi_command_block_wrapper; - cbw_scsi.inquiry = scsi_packet_inquiry; +// 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.cbw.bCBWLUN = 0; - cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); - cbw_scsi.cbw.dCBWDataTransferLength = 0x24; +// cbw_scsi_inquiry cbw_scsi; +// cbw_scsi.cbw = scsi_command_block_wrapper; +// cbw_scsi.inquiry = scsi_packet_inquiry; - return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); -} +// cbw_scsi.cbw.bCBWLUN = 0; +// cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); +// cbw_scsi.cbw.dCBWDataTransferLength = 0x24; -usb_error scsi_test(device_config_storage *const dev) { +// return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); +// } + +static 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)); @@ -91,7 +95,7 @@ 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}}; -usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +static 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; @@ -103,7 +107,9 @@ usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); } -usb_error scsi_sense_init(device_config_storage *const dev) { +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; @@ -117,11 +123,7 @@ usb_error scsi_sense_init(device_config_storage *const dev) { static cbw_scsi_read_write cbw = {{{0}}}; -void spike_x(void) { - scsi_read(5, NULL); -} - -usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { +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)); @@ -145,7 +147,9 @@ usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { return result; } -usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { +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; @@ -167,18 +171,18 @@ usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { return result; } -usb_error scsi_eject(device_config_storage *const dev) { - cbw_scsi_eject cbw_scsi; - cbw_scsi.cbw = scsi_command_block_wrapper; +// 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)); +// memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); - cbw_scsi.eject.operation_code = 0x1B; - cbw_scsi.eject.loej = 1; +// 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; +// 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); -} +// 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 5e5b63bf..989e5bec 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,12 +182,14 @@ typedef struct { _scsi_packet_read_write scsi_cmd; } cbw_scsi_read_write; -extern usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *result); -extern usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result); -extern usb_error scsi_sense_init(device_config_storage *const dev); -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); -extern usb_error scsi_eject(device_config_storage *const dev); -extern usb_error scsi_read(const uint16_t dev, uint8_t *const buffer); -extern usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer); +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); + #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 6438ef4d..e4928d0f 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,4 +1,5 @@ #include "class_scsi.h" +#include "hbios-driver-storage.h" #include #include #include @@ -7,7 +8,6 @@ #include #include #include -#include "hbios-driver-storage.h" extern const uint16_t const ch_scsi_fntbl[]; @@ -22,17 +22,16 @@ void chscsi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_MASS_STORAGE) { - const uint8_t dev_index = find_storage_dev(); //index == -1 (no more left) should never happen - hbios_usb_storage_devices[dev_index].storage_device = storage_device; + 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; + hbios_usb_storage_devices[dev_index].usb_device = index; print_string("\r\nUSB: MASS STORAGE @ $"); print_uint16(index); print_string(":$"); print_uint16(dev_index + 1); print_string(" $"); - scsi_sense_init(storage_device); + scsi_sense_init(index); dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); } diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h index 1b761bd9..2649fc18 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h @@ -204,4 +204,6 @@ usb_error ufi_send_diagnostics(device_config *const storage_device); uint32_t convert_from_msb_first(const uint8_t *const buffer); +extern usb_error ufi_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 ebd6a64f..3a1af894 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,11 @@ #include "class_ufi.h" +#include "hbios-driver-storage.h" #include #include #include #include #include #include -#include "hbios-driver-storage.h" extern const uint16_t const ch_ufi_fntbl[]; @@ -21,11 +21,10 @@ void chufi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_FLOPPY) { - const uint8_t dev_index = find_storage_dev(); //dev_index == -1 (no more left) should never happen - hbios_usb_storage_devices[dev_index].storage_device = storage_device; + 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; - + hbios_usb_storage_devices[dev_index].usb_device = index; + print_string("\r\nUSB: FLOPPY @ $"); print_uint16(index); print_string(":$"); @@ -37,7 +36,9 @@ void chufi_init(void) { } while (++index != MAX_NUMBER_OF_DEVICES + 1); } -uint32_t chufi_get_cap(device_config *const dev) { +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)); @@ -56,7 +57,8 @@ uint32_t chufi_get_cap(device_config *const dev) { return convert_from_msb_first(response.descriptors[0].number_of_blocks); } -uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +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! @@ -85,7 +87,8 @@ uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { return USB_ERR_OK; } -usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { +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! 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 377e8fb6..78a119d8 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -64,94 +64,74 @@ 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); 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 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 l, e - ld h, d 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 de +;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 call _find_storage_dev - ld c, l - pop de -;source-doc/ufi-drv/ufi-init.c:25: hbios_usb_storage_devices[dev_index].storage_device = storage_device; - ld (ix-3),c +;source-doc/ufi-drv/ufi-init.c:25: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; + ld (ix-3),l ld (ix-2),0x00 + ld c,l pop hl push hl add hl, hl - add hl, hl - ld a,+((_hbios_usb_storage_devices) & 0xFF) - add a,l - ld l,a - ld a,+((_hbios_usb_storage_devices) / 256) - adc a,h - ld h,a - ld (hl), e - inc hl - ld (hl), d - dec hl -;source-doc/ufi-drv/ufi-init.c:26: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; - ld e, l - ld d, h - inc de - inc de - ld a, c - inc a - ld (de), a -;source-doc/ufi-drv/ufi-init.c:27: hbios_usb_storage_devices[dev_index].usb_device = index; - ld c, l - ld b, h - inc bc - inc bc + ld de,_hbios_usb_storage_devices + add hl, de + ld e,l + ld d,h + inc c + ld (hl), c +;source-doc/ufi-drv/ufi-init.c:26: 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:29: print_string("\r\nUSB: FLOPPY @ $"); - push hl +;source-doc/ufi-drv/ufi-init.c:28: print_string("\r\nUSB: FLOPPY @ $"); + push de ld hl,ufi_init_str_0 call _print_string - pop hl -;source-doc/ufi-drv/ufi-init.c:30: print_uint16(index); - ld e,(ix-1) - ld d,0x00 - push hl - ex de, hl + pop de +;source-doc/ufi-drv/ufi-init.c:29: print_uint16(index); + ld l,(ix-1) + ld h,0x00 + push de call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:31: print_string(":$"); +;source-doc/ufi-drv/ufi-init.c:30: print_string(":$"); ld hl,ufi_init_str_1 call _print_string - pop hl -;source-doc/ufi-drv/ufi-init.c:32: print_uint16(dev_index + 1); pop de - push de - inc de +;source-doc/ufi-drv/ufi-init.c:31: print_uint16(dev_index + 1); + pop hl push hl - ex de, hl + inc hl + push de call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:33: print_string(" $"); +;source-doc/ufi-drv/ufi-init.c:32: print_string(" $"); ld hl,ufi_init_str_2 call _print_string - pop hl -;source-doc/ufi-drv/ufi-init.c:34: dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); - ex de, hl + pop de +;source-doc/ufi-drv/ufi-init.c:33: 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:37: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/ufi-drv/ufi-init.c:36: } 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:38: } +;source-doc/ufi-drv/ufi-init.c:37: } ld sp, ix pop ix ret @@ -166,7 +146,7 @@ ufi_init_str_1: ufi_init_str_2: DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/ufi-init.c:40: uint32_t chufi_get_cap(device_config *const dev) { +;source-doc/ufi-drv/ufi-init.c:39: uint32_t chufi_get_cap(const uint16_t dev_index) { ; --------------------------------- ; Function chufi_get_cap ; --------------------------------- @@ -177,7 +157,10 @@ _chufi_get_cap: ld hl, -72 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:42: memset(&response, 0, sizeof(ufi_format_capacities_response)); +;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 @@ -188,67 +171,66 @@ l_chufi_get_cap_00112: ld (hl), a inc hl djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/ufi-init.c:44: wait_for_device_ready(dev, 25); +;source-doc/ufi-drv/ufi-init.c:45: wait_for_device_ready(dev, 25); + push de ld a,0x19 push af inc sp - ld l,(ix+4) - ld h,(ix+5) - push hl + push de call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:48: ufi_inquiry(dev, &inquiry); - ld hl,36 + pop de +;source-doc/ufi-drv/ufi-init.c:49: ufi_inquiry(dev, &inquiry); + push de + ld hl,38 add hl, sp push hl - ld l,(ix+4) - ld h,(ix+5) - push hl + push de call _ufi_inquiry pop af -;source-doc/ufi-drv/ufi-init.c:50: wait_for_device_ready(dev, 15); - ld h,0x0f - ex (sp),hl + 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 - ld l,(ix+4) - ld h,(ix+5) - push hl + push de call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:52: const usb_error result = ufi_read_frmt_caps(dev, &response); + 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 - ld l,(ix+4) - ld h,(ix+5) - push hl + push de call _ufi_read_frmt_caps pop af pop af ld a, l -;source-doc/ufi-drv/ufi-init.c:53: if (result != USB_ERR_OK) +;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:54: return 0; +;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:56: return convert_from_msb_first(response.descriptors[0].number_of_blocks); +;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:57: } +;source-doc/ufi-drv/ufi-init.c:58: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:59: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:60: uint8_t chufi_read(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_read ; --------------------------------- @@ -259,10 +241,14 @@ _chufi_read: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:61: if (wait_for_device_ready((device_config *)dev, 20) != 0) - ld c,(ix+4) - ld b,(ix+5) - push bc +;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 @@ -271,23 +257,22 @@ _chufi_read: 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:62: return -1; // Not READY! +;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:67: memset(&sense_codes, 0, sizeof(sense_codes)); +;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:69: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) - ld e,(ix+4) - ld d,(ix+5) +;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) @@ -318,11 +303,11 @@ l_chufi_read_00102: pop bc or a jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/ufi-init.c:70: return -1; // general error +;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:73: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:75: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -335,7 +320,7 @@ l_chufi_read_00139: inc hl djnz l_chufi_read_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:75: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) +;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 @@ -346,29 +331,29 @@ l_chufi_read_00139: ld a, l or a jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/ufi-init.c:76: return -1; // error +;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:80: const uint8_t sense_key = response.sense_key; +;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:82: if (sense_key != 0) +;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:83: return -1; +;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:85: return USB_ERR_OK; +;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:86: } +;source-doc/ufi-drv/ufi-init.c:88: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:88: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:90: usb_error chufi_write(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_write ; --------------------------------- @@ -379,10 +364,14 @@ _chufi_write: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:90: if (wait_for_device_ready((device_config *)dev, 20) != 0) - ld c,(ix+4) - ld b,(ix+5) - push bc +;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 @@ -391,23 +380,22 @@ _chufi_write: 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:91: return -1; // Not READY! +;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:95: memset(&sense_codes, 0, sizeof(sense_codes)); +;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:96: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { - ld e,(ix+4) - ld d,(ix+5) +;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) @@ -438,11 +426,11 @@ l_chufi_write_00102: pop bc or a jr Z,l_chufi_write_00104 -;source-doc/ufi-drv/ufi-init.c:97: return -1; +;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:101: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:104: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -455,7 +443,7 @@ l_chufi_write_00139: inc hl djnz l_chufi_write_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:103: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { +;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 @@ -466,25 +454,25 @@ l_chufi_write_00139: ld a, l or a jr Z,l_chufi_write_00106 -;source-doc/ufi-drv/ufi-init.c:104: return -1; +;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:109: const uint8_t sense_key = response.sense_key; +;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:111: if (sense_key != 0) +;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:112: return -1; +;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:114: return USB_ERR_OK; +;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:115: } +;source-doc/ufi-drv/ufi-init.c:118: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376scsi.asm b/Source/HBIOS/ch376scsi.asm index 74c3283d..1144e48d 100644 --- a/Source/HBIOS/ch376scsi.asm +++ b/Source/HBIOS/ch376scsi.asm @@ -61,20 +61,26 @@ CH_SCSI_RESET: ; sector) are 0 relative. ; CH_SCSI_SEEK: + EXX + LD D, 0 + LD E, (IY+1) ; usb_device + PUSH DE + POP IY + EXX + BIT 7,D ; CHECK FOR LBA FLAG CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) - EX DE, HL - EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) PUSH DE - EXX - CALL _chnative_seek + PUSH HL + PUSH IY + CALL _scsi_seek + POP IY + POP HL + POP DE + + XOR A RET ; ; ### Function 0x13 -- Disk Read (DIOREAD) @@ -95,25 +101,25 @@ CH_SCSI_SEEK: ; CH_SCSI_READ: EXX - ld d, 0 - ld e, (iy+3) - push de - pop iy + LD D, 0 + LD E, (IY+1) ; usb_device + PUSH DE + POP IY EXX CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR ; call scsi_read(IY, HL); ; HL = HL + 512 - push hl - push iy + PUSH HL + PUSH IY call _scsi_read - ld a, l - pop iy - pop hl - ld bc, 512 - add hl, bc - ret + LD A, L + POP IY + POP HL + LD BC, 512 + ADD HL, BC + RET ; ; ### Function 0x14 -- Disk Write (DIOWRITE) ; @@ -133,11 +139,8 @@ CH_SCSI_READ: ; CH_SCSI_WRITE: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX @@ -146,14 +149,14 @@ CH_SCSI_WRITE: ; call scsi_write(IY, HL); ; HL = HL + 512 - push hl - push iy + PUSH HL + PUSH IY call _scsi_write - ld a, l - pop iy - pop hl - ld bc, 512 - add hl, bc + LD A, L + POP IY + POP HL + LD BC, 512 + ADD HL, BC ret CH_SCSI_VERIFY: @@ -206,7 +209,7 @@ CH_SCSI_FORMAT: CH_SCSI_DEVICE: LD C, %00111010 LD D, DIODEV_USB - LD E, (iy+2) ; drive_index + LD E, (IY+0) ; drive_index LD HL, 0 XOR A RET @@ -252,40 +255,37 @@ CH_SCSI_DEFMED: ; CH_SCSI_CAP: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX - push ix - ld ix, -8 ; reserve 8 bytes for - add ix, sp ; scsi_read_capacity_result - ld sp, ix + PUSH IX + LD IX, -8 ; reserve 8 bytes for + ADD IX, SP ; scsi_read_capacity_result + LD SP, IX - push ix - push iy + PUSH IX + PUSH IY call _scsi_read_capacity - pop iy - pop ix + POP IY + POP IX - ld d, (ix) ; response.number_of_blocks[0] - ld e, (ix+1) ; response.number_of_blocks[1] - ld h, (ix+2) ; response.number_of_blocks[2] - ld l, (ix+3) ; response.number_of_blocks[3] - ld b, (ix+6) ; response.block_size[2] - ld c, (ix+7) ; response.block_size[3] + LD D, (IX) ; response.number_of_blocks[0] + LD E, (IX+1) ; response.number_of_blocks[1] + LD H, (IX+2) ; response.number_of_blocks[2] + LD L, (IX+3) ; response.number_of_blocks[3] + LD B, (IX+6) ; response.block_size[2] + LD C, (IX+7) ; response.block_size[3] - ld ix, 8 - add ix, sp - ld sp, ix - pop ix + LD IX, 8 + ADD IX, SP + LD SP, IX + POP IX - xor a ; todo determine a drive status - ret + XOR A ; todo determine a drive status + RET ; ; ### Function 0x1B -- Disk Geometry (DIOGEOMETRY) ; @@ -305,16 +305,6 @@ CH_SCSI_CAP: ; ** Does not appear to be used?? ; CH_SCSI_GEOM: - EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) - PUSH DE - POP IY - EXX - ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE CALL CH_SCSI_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm index 521e76a9..e8b5c8ac 100644 --- a/Source/HBIOS/ch376ufi.asm +++ b/Source/HBIOS/ch376ufi.asm @@ -5,6 +5,7 @@ ; #include "./ch376-native/ufi-drv.s" +_ufi_seek .EQU _scsi_seek ; find and mount all floppy USB drives CHUFI_INIT .EQU _chufi_init @@ -61,22 +62,25 @@ CH_UFI_RESET: ; CH_UFI_SEEK: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX - BIT 7, D ; CHECK FOR LBA FLAG - CALL Z, HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA - never seems to happen? - RES 7, D - EX DE, HL + BIT 7,D ; CHECK FOR LBA FLAG + CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) + + PUSH DE + PUSH HL + PUSH IY + CALL _ufi_seek + POP IY + POP HL + POP DE - push IY - CALL _chnative_seek + XOR A RET ; ; ### Function 0x13 -- Disk Read (DIOREAD) @@ -97,27 +101,24 @@ CH_UFI_SEEK: ; CH_UFI_READ: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR - push hl - push iy + PUSH HL + PUSH IY call _chufi_read - ld l, 0 - ld a, l - pop iy - pop hl - ld bc, 512 - add hl, bc - ret + LD L, 0 + LD A, L + POP IY + POP HL + LD BC, 512 + ADD HL, BC + RET ; ; ### Function 0x14 -- Disk Write (DIOWRITE) ; @@ -137,11 +138,8 @@ CH_UFI_READ: ; CH_UFI_WRITE: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX @@ -150,15 +148,15 @@ CH_UFI_WRITE: ; call scsi_write(IY, HL); ; HL = HL + 512 - push hl - push iy + PUSH HL + PUSH IY call _chufi_write - ld a, l - pop iy - pop hl - ld bc, 512 - add hl, bc - ret + LD A, L + POP IY + POP HL + LD BC, 512 + ADD HL, BC + RET CH_UFI_VERIFY: CH_UFI_FORMAT: @@ -213,7 +211,7 @@ CH_UFI_FORMAT: CH_UFI_DEVICE: LD C, %11010110 LD D, DIODEV_USB - LD E, (iy+2) ; drive_index + LD E, (IY+0) ; drive_index LD HL, 0 XOR A RET @@ -262,21 +260,18 @@ CH_UFI_DEFMED: ; CH_UFI_CAP: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX - push iy + PUSH IY call _chufi_get_cap - pop iy - ld bc, 512 - xor a - ret + POP IY + LD BC, 512 + XOR A + RET CH_UFI_GEOM: LD HL, 0