Browse Source

ch376-native: refactor usb scsi/ufi function to replace use of config* with dev_index int

pull/592/head
Dean Netherton 9 months ago
parent
commit
4e23c9104d
  1. 95
      Source/HBIOS/ch376-native/base-drv/enumerate.c.s
  2. 24
      Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s
  3. 42
      Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s
  4. 2
      Source/HBIOS/ch376-native/base-drv/usb_init.c.s
  5. 6
      Source/HBIOS/ch376-native/base-drv/usb_state.c.s
  6. 8
      Source/HBIOS/ch376-native/base-drv/work-area.c.s
  7. 360
      Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s
  8. 82
      Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s
  9. 1
      Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h
  10. 21
      Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c
  11. 4
      Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c
  12. 1
      Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h
  13. 7
      Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c
  14. 7
      Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h
  15. 66
      Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c
  16. 18
      Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h
  17. 9
      Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c
  18. 2
      Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h
  19. 19
      Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c
  20. 220
      Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s
  21. 128
      Source/HBIOS/ch376scsi.asm
  22. 93
      Source/HBIOS/ch376ufi.asm

95
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

24
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

42
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

2
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:

6
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

8
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

360
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

82
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

1
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 {

21
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:

4
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;

1
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;

7
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;
}

7
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 <dev_transfers.h>
#include <stdint.h>
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

66
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);
// }

18
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

9
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 <ch376.h>
#include <enumerate.h>
#include <hbios.h>
@ -7,7 +8,6 @@
#include <usb-base-drv.h>
#include <work-area.h>
#include <z80.h>
#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]);
}

2
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

19
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 <dev_transfers.h>
#include <hbios.h>
#include <print.h>
#include <string.h>
#include <usb-base-drv.h>
#include <work-area.h>
#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!

220
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

128
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

93
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

Loading…
Cancel
Save