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 ld sp, ix
pop ix pop ix
ret 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 ; Function enumerate_all_devices
; --------------------------------- ; ---------------------------------
@ -990,35 +932,28 @@ _enumerate_all_devices:
ld ix,0 ld ix,0
add ix,sp add ix,sp
push af 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 ld hl,0
add hl, sp add hl, sp
ld e,l
ld d,h
xor a xor a
ld (hl), a ld (hl), a
inc hl inc hl
ld (hl), a 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 call _read_all_configs
pop af 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 ld sp, ix
pop ix pop ix
ret 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 ; .area _INITIALIZED removed by z88dk
_hbios_usb_storage_devices: _hbios_usb_storage_devices:
DEFS 24
DEFS 12
#ENDIF #ENDIF
@ -55,7 +55,7 @@ _hbios_usb_storage_devices:
; Function find_storage_dev ; Function find_storage_dev
; --------------------------------- ; ---------------------------------
_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 c,0x00
ld de,_hbios_usb_storage_devices+0 ld de,_hbios_usb_storage_devices+0
ld b,c ld b,c
@ -63,22 +63,19 @@ l_find_storage_dev_00105:
ld a, b ld a, b
sub 0x06 sub 0x06
jr NC,l_find_storage_dev_00103 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 l, b
ld h,0x00 ld h,0x00
add hl, hl add hl, hl
add hl, hl
add hl, de add hl, de
ld a, (hl) ld a, (hl)
inc hl
ld l, (hl)
or l
or a
jr NZ,l_find_storage_dev_00106 jr NZ,l_find_storage_dev_00106
;source-doc/base-drv/hbios-driver-storage.c:8: return i; ;source-doc/base-drv/hbios-driver-storage.c:8: return i;
ld l, c ld l, c
jr l_find_storage_dev_00107 jr l_find_storage_dev_00107
l_find_storage_dev_00106: 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 inc b
ld c, b ld c, b
jr l_find_storage_dev_00105 jr l_find_storage_dev_00105
@ -89,7 +86,6 @@ l_find_storage_dev_00107:
;source-doc/base-drv/hbios-driver-storage.c:11: } ;source-doc/base-drv/hbios-driver-storage.c:11: }
ret ret
_hbios_usb_storage_devices: _hbios_usb_storage_devices:
DEFW +0x0000
DEFB +0x00 DEFB +0x00
DEFB +0x00 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
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 ; 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 push ix
ld ix,0 ld ix,0
add ix,sp 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) 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 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 jr l_usb_init_00113
l_usb_init_00110: l_usb_init_00110:
;source-doc/base-drv/usb_init.c:61: memset(get_usb_work_area(), 0, sizeof(_usb_state)); ;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 ld hl,_x
jr l_usb_init_00163 jr l_usb_init_00163
l_usb_init_00162: 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 ret
_device_config_sizes: _device_config_sizes:
DEFB +0x00 DEFB +0x00
DEFB +0x11
DEFB +0x11
DEFB +0x10
DEFB +0x10
DEFB +0x0c DEFB +0x0c
DEFB +0x06 DEFB +0x06
DEFB 0x00 DEFB 0x00
@ -174,7 +174,7 @@ l_next_device_config_00102:
adc a, d adc a, d
ld d, a ld d, a
;source-doc/base-drv/usb_state.c:64: if (result >= (device_config *)&usb_state->device_configs_end) ;source-doc/base-drv/usb_state.c:64: if (result >= (device_config *)&usb_state->device_configs_end)
ld hl,0x0068
ld hl,0x0062
add hl, bc add hl, bc
ld a, e ld a, e
sub l 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 ; .area _INITIALIZED removed by z88dk
_x: _x:
DEFS 105
DEFS 99
#ENDIF #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
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 DEFS 13
_scsi_packet_read_capacity: _scsi_packet_read_capacity:
DEFS 12 DEFS 12
_scsi_packet_inquiry:
DEFS 12
_scsi_packet_request_sense: _scsi_packet_request_sense:
DEFS 12 DEFS 12
_cbw: _cbw:
@ -297,7 +295,7 @@ l_do_scsi_cmd_00120:
ld sp, ix ld sp, ix
pop ix pop ix
ret 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 ; Function scsi_read_capacity
; --------------------------------- ; ---------------------------------
@ -308,114 +306,58 @@ _scsi_read_capacity:
ld hl, -27 ld hl, -27
add hl, sp add hl, sp
ld sp, hl 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 add hl, sp
ld e,l
ld d,h
push hl
ex de, hl
ld bc,0x000f ld bc,0x000f
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ldir 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 ld hl,17
add hl, sp add hl, sp
ex de, hl ex de, hl
ld bc,0x000c ld bc,0x000c
ld hl,_scsi_packet_read_capacity ld hl,_scsi_packet_read_capacity
ldir 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 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 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 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 xor a
push af push af
inc sp inc sp
push de
push bc 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 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 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 de
push bc
ld l,(ix+4)
ld h,(ix+5)
push hl
call _do_scsi_cmd 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 pop ix
ret 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 ; Function scsi_test
; --------------------------------- ; ---------------------------------
@ -426,7 +368,7 @@ _scsi_test:
ld hl, -27 ld hl, -27
add hl, sp add hl, sp
ld sp, hl 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 ld hl,0
add hl, sp add hl, sp
ld e,l ld e,l
@ -435,7 +377,7 @@ _scsi_test:
ld bc,0x000f ld bc,0x000f
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ldir 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 ld hl,17
add hl, sp add hl, sp
ld b,0x06 ld b,0x06
@ -447,11 +389,11 @@ l_scsi_test_00103:
inc hl inc hl
djnz l_scsi_test_00103 djnz l_scsi_test_00103
pop bc 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 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 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 ld hl,0x0008
add hl, bc add hl, bc
xor a xor a
@ -462,7 +404,7 @@ l_scsi_test_00103:
ld (hl), a ld (hl), a
inc hl inc hl
ld (hl), a 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 xor a
push af push af
inc sp inc sp
@ -473,11 +415,11 @@ l_scsi_test_00103:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _do_scsi_cmd call _do_scsi_cmd
;source-doc/scsi-drv/class_scsi.c:90: }
;source-doc/scsi-drv/class_scsi.c:94: }
ld sp,ix ld sp,ix
pop ix pop ix
ret 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 ; Function scsi_request_sense
; --------------------------------- ; ---------------------------------
@ -488,7 +430,7 @@ _scsi_request_sense:
ld hl, -27 ld hl, -27
add hl, sp add hl, sp
ld sp, hl 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 ld hl,0
add hl, sp add hl, sp
ld e,l ld e,l
@ -497,7 +439,7 @@ _scsi_request_sense:
ld bc,0x000f ld bc,0x000f
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ldir 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 ld hl,17
add hl, sp add hl, sp
ex de, hl ex de, hl
@ -505,11 +447,11 @@ _scsi_request_sense:
ld hl,_scsi_packet_request_sense ld hl,_scsi_packet_request_sense
ldir ldir
pop bc 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 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 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 ld hl,0x0008
add hl, bc add hl, bc
ld (hl),0x12 ld (hl),0x12
@ -520,7 +462,7 @@ _scsi_request_sense:
ld (hl), a ld (hl), a
inc hl inc hl
ld (hl), a 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 e,(ix+6)
ld d,(ix+7) ld d,(ix+7)
xor a xor a
@ -532,11 +474,11 @@ _scsi_request_sense:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _do_scsi_cmd call _do_scsi_cmd
;source-doc/scsi-drv/class_scsi.c:104: }
;source-doc/scsi-drv/class_scsi.c:108: }
ld sp,ix ld sp,ix
pop ix pop ix
ret 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 ; Function scsi_sense_init
; --------------------------------- ; ---------------------------------
@ -547,62 +489,52 @@ _scsi_sense_init:
ld hl, -18 ld hl, -18
add hl, sp add hl, sp
ld sp, hl 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 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 ld c,0x03
l_scsi_sense_init_00102: l_scsi_sense_init_00102:
push bc push bc
ld l,(ix+4)
ld h,(ix+5)
push hl
push de
push de
call _scsi_test call _scsi_test
pop af pop af
ld a, l ld a, l
pop de
pop bc pop bc
ld (_result),a ld (_result),a
or a or a
jr Z,l_scsi_sense_init_00104 jr Z,l_scsi_sense_init_00104
dec c dec c
jr Z,l_scsi_sense_init_00104 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 ld hl,0
add hl, sp add hl, sp
push bc push bc
push de
push hl push hl
ld l,(ix+4)
ld h,(ix+5)
push hl
push de
call _scsi_request_sense call _scsi_request_sense
pop af pop af
pop af pop af
pop de
pop bc pop bc
jr l_scsi_sense_init_00102 jr l_scsi_sense_init_00102
l_scsi_sense_init_00104: 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 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) ld hl, (_result)
;source-doc/scsi-drv/class_scsi.c:116: }
;source-doc/scsi-drv/class_scsi.c:122: }
ld sp, ix ld sp, ix
pop ix pop ix
ret 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 ; Function scsi_read
; --------------------------------- ; ---------------------------------
@ -611,12 +543,12 @@ _scsi_read:
ld ix,0 ld ix,0
add ix,sp add ix,sp
push af 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) ld a,(ix+4)
call _get_usb_device_config call _get_usb_device_config
pop bc pop bc
push de 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 de,_cbw
ld l, e ld l, e
ld h, d ld h, d
@ -629,28 +561,28 @@ l_scsi_read_00113:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_scsi_read_00112 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 bc,0x000f
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ldir 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,_cbw + 13
ld (hl),0x00 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,_cbw + 14
ld (hl),0x0c 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 hl,0x0200
ld (_cbw + 8),hl ld (_cbw + 8),hl
ld h, l ld h, l
ld (_cbw + 8 + 2),hl 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,_cbw + 15
ld (hl),0x28 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,_cbw + 23
ld (hl),0x01 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 l,(ix-2)
ld h,(ix-1) ld h,(ix-1)
ld bc,0x000c ld bc,0x000c
@ -662,8 +594,8 @@ l_scsi_read_00113:
inc hl inc hl
ld a, (hl) ld a, (hl)
ld ((_cbw + 17)),a 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 l,c
ld h,b ld h,b
inc hl inc hl
@ -674,11 +606,11 @@ l_scsi_read_00113:
ld e, (hl) ld e, (hl)
ld hl, +(_cbw + 19) ld hl, +(_cbw + 19)
ld (hl), e 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) ld a, (bc)
inc hl inc hl
ld (hl), a 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 e,(ix+6)
ld d,(ix+7) ld d,(ix+7)
push bc push bc
@ -699,11 +631,11 @@ l_scsi_read_00113:
pop bc pop bc
ld a, l ld a, l
ld (_result), a 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) ld a,(_result)
or a or a
jr NZ,l_scsi_read_00102 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 l, c
ld h, b ld h, b
ld e, (hl) ld e, (hl)
@ -732,13 +664,13 @@ l_scsi_read_00114:
ld a, h ld a, h
ld (bc), a ld (bc), a
l_scsi_read_00102: 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) ld hl, (_result)
;source-doc/scsi-drv/class_scsi.c:146: }
;source-doc/scsi-drv/class_scsi.c:148: }
ld sp, ix ld sp, ix
pop ix pop ix
ret 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 ; Function scsi_write
; --------------------------------- ; ---------------------------------
@ -746,7 +678,13 @@ _scsi_write:
push ix push ix
ld ix,0 ld ix,0
add ix,sp 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 de,_cbw
ld l, e ld l, e
ld h, d ld h, d
@ -759,30 +697,30 @@ l_scsi_write_00113:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_scsi_write_00112 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 bc,0x000f
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ldir 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,_cbw + 13
ld (hl),0x00 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,_cbw + 14
ld (hl),0x0c 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 hl,0x0200
ld (_cbw + 8),hl ld (_cbw + 8),hl
ld h, l ld h, l
ld (_cbw + 8 + 2),hl 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,_cbw + 15
ld (hl),0x2a 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,_cbw + 23
ld (hl),0x01 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 ld bc,0x000c
add hl,bc add hl,bc
ld c,l ld c,l
@ -792,8 +730,8 @@ l_scsi_write_00113:
inc hl inc hl
ld a, (hl) ld a, (hl)
ld ((_cbw + 17)),a 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 l,c
ld h,b ld h,b
inc hl inc hl
@ -804,11 +742,11 @@ l_scsi_write_00113:
ld e, (hl) ld e, (hl)
ld hl, +(_cbw + 19) ld hl, +(_cbw + 19)
ld (hl), e 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) ld a, (bc)
inc hl inc hl
ld (hl), a 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 e,(ix+6)
ld d,(ix+7) ld d,(ix+7)
push bc push bc
@ -818,8 +756,8 @@ l_scsi_write_00113:
push de push de
ld hl,_cbw ld hl,_cbw
push hl push hl
ld l,(ix+4)
ld h,(ix+5)
ld l,(ix-2)
ld h,(ix-1)
push hl push hl
call _do_scsi_cmd call _do_scsi_cmd
pop af pop af
@ -829,11 +767,11 @@ l_scsi_write_00113:
pop bc pop bc
ld a, l ld a, l
ld (_result), a 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) ld a,(_result)
or a or a
jr NZ,l_scsi_write_00102 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 l, c
ld h, b ld h, b
ld e, (hl) ld e, (hl)
@ -862,77 +800,10 @@ l_scsi_write_00114:
ld a, h ld a, h
ld (bc), a ld (bc), a
l_scsi_write_00102: 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) 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 pop ix
ret ret
_scsi_command_block_wrapper: _scsi_command_block_wrapper:
@ -975,19 +846,6 @@ _scsi_packet_read_capacity:
DEFB +0x00 DEFB +0x00
DEFB +0x00 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: _scsi_packet_request_sense:
DEFB +0x03 DEFB +0x03
DEFB +0x00 DEFB +0x00

82
Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s

@ -56,104 +56,90 @@ _chscsi_init:
push ix push ix
ld ix,0 ld ix,0
add ix,sp 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 { ;source-doc/scsi-drv/scsi-init.c:16: do {
ld (ix-1),0x01 ld (ix-1),0x01
l_chscsi_init_00105: 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); ;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) ld a,(ix-1)
call _get_usb_device_config call _get_usb_device_config
ld l, e
;source-doc/scsi-drv/scsi-init.c:19: if (storage_device == NULL) ;source-doc/scsi-drv/scsi-init.c:19: if (storage_device == NULL)
ld a, d
ld a,d
ld h,a
or e 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; ;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) ld a, (hl)
and 0x0f and 0x0f
;source-doc/scsi-drv/scsi-init.c:24: if (t == USB_IS_MASS_STORAGE) { ;source-doc/scsi-drv/scsi-init.c:24: if (t == USB_IS_MASS_STORAGE) {
sub 0x02 sub 0x02
jr NZ,l_chscsi_init_00106 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 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 add hl, hl
ld a, l ld a, l
add a, +((_hbios_usb_storage_devices) & 0xFF) add a, +((_hbios_usb_storage_devices) & 0xFF)
ld (ix-3),a 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 (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 inc c
ld (hl), 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 inc bc
ld a,(ix-1) ld a,(ix-1)
ld (bc), a 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 push de
ld hl,scsi_init_str_0 ld hl,scsi_init_str_0
call _print_string call _print_string
pop de 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 l,(ix-1)
ld h,0x00 ld h,0x00
push hl
push de push de
call _print_uint16 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 ld hl,scsi_init_str_1
call _print_string call _print_string
pop de pop de
;source-doc/scsi-drv/scsi-init.c:33: print_uint16(dev_index + 1);
pop hl pop hl
;source-doc/scsi-drv/scsi-init.c:32: print_uint16(dev_index + 1);
inc de
push hl push hl
inc hl
push de
ex de, hl
call _print_uint16 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 ld hl,scsi_init_str_2
call _print_string 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 call _scsi_sense_init
pop af 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 ld hl,_ch_scsi_fntbl
call _dio_add_entry call _dio_add_entry
l_chscsi_init_00106: 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) inc (ix-1)
ld a,(ix-1) ld a,(ix-1)
sub 0x07 sub 0x07
jp NZ,l_chscsi_init_00105
jr NZ,l_chscsi_init_00105
l_chscsi_init_00108: l_chscsi_init_00108:
;source-doc/scsi-drv/scsi-init.c:40: }
;source-doc/scsi-drv/scsi-init.c:39: }
ld sp, ix ld sp, ix
pop ix pop ix
ret 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 COMMON_DEVICE_CONFIG // bytes: 0-2
endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt
uint32_t current_lba; // bytes 12-15 uint32_t current_lba; // bytes 12-15
uint8_t drive_index; // byte 16
} device_config_storage; } device_config_storage;
typedef struct { typedef struct {

21
Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c

@ -186,25 +186,6 @@ done:
return result; 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_error enumerate_all_devices(void) {
_usb_state *const work_area = get_usb_work_area(); _usb_state *const work_area = get_usb_work_area();
enumeration_state state; enumeration_state state;
@ -212,8 +193,6 @@ usb_error enumerate_all_devices(void) {
usb_error result = read_all_configs(&state); usb_error result = read_all_configs(&state);
count_storage_devs(&state);
work_area->count_of_detected_usb_devices = state.next_device_address; work_area->count_of_detected_usb_devices = state.next_device_address;
done: 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}}; hbios_storage_device_t hbios_usb_storage_devices[MAX_NUMBER_OF_DEVICES] = {{NULL}};
uint8_t find_storage_dev(void) { 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 i;
return -1; return -1;

1
Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h

@ -4,7 +4,6 @@
#include "usb_state.h" #include "usb_state.h"
typedef struct _hbios_storage_device { typedef struct _hbios_storage_device {
device_config_storage * storage_device;
uint8_t drive_index; uint8_t drive_index;
uint8_t usb_device; uint8_t usb_device;
} hbios_storage_device_t; } 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-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; return 0;
} }

7
Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h

@ -1,11 +1,12 @@
#ifndef __USB_BASE_DRV #ifndef __USB_BASE_DRV
#define __USB_BASE_DRV #define __USB_BASE_DRV
#include "usb_state.h"
#include <dev_transfers.h> #include <dev_transfers.h>
#include <stdint.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 #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}}; _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_read_capacity cbw_scsi;
cbw_scsi.cbw = scsi_command_block_wrapper; cbw_scsi.cbw = scsi_command_block_wrapper;
cbw_scsi.read_capacity = scsi_packet_read_capacity; 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); 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_test cbw_scsi;
cbw_scsi.cbw = scsi_command_block_wrapper; cbw_scsi.cbw = scsi_command_block_wrapper;
memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); 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}}; _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_request_sense cbw_scsi;
cbw_scsi.cbw = scsi_command_block_wrapper; cbw_scsi.cbw = scsi_command_block_wrapper;
cbw_scsi.request_sense = scsi_packet_request_sense; 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); 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; scsi_sense_result response;
uint8_t counter = 3; 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}}}; 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); device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index);
memset(&cbw, 0, sizeof(cbw_scsi_read_write)); 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; 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)); memset(&cbw, 0, sizeof(cbw_scsi_read_write));
cbw.cbw = scsi_command_block_wrapper; 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; 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; _scsi_packet_read_write scsi_cmd;
} cbw_scsi_read_write; } 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 #endif

9
Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c

@ -1,4 +1,5 @@
#include "class_scsi.h" #include "class_scsi.h"
#include "hbios-driver-storage.h"
#include <ch376.h> #include <ch376.h>
#include <enumerate.h> #include <enumerate.h>
#include <hbios.h> #include <hbios.h>
@ -7,7 +8,6 @@
#include <usb-base-drv.h> #include <usb-base-drv.h>
#include <work-area.h> #include <work-area.h>
#include <z80.h> #include <z80.h>
#include "hbios-driver-storage.h"
extern const uint16_t const ch_scsi_fntbl[]; extern const uint16_t const ch_scsi_fntbl[];
@ -22,17 +22,16 @@ void chscsi_init(void) {
const usb_device_type t = storage_device->type; const usb_device_type t = storage_device->type;
if (t == USB_IS_MASS_STORAGE) { 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].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_string("\r\nUSB: MASS STORAGE @ $");
print_uint16(index); print_uint16(index);
print_string(":$"); print_string(":$");
print_uint16(dev_index + 1); print_uint16(dev_index + 1);
print_string(" $"); print_string(" $");
scsi_sense_init(storage_device);
scsi_sense_init(index);
dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_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); 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 #endif

19
Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c

@ -1,11 +1,11 @@
#include "class_ufi.h" #include "class_ufi.h"
#include "hbios-driver-storage.h"
#include <dev_transfers.h> #include <dev_transfers.h>
#include <hbios.h> #include <hbios.h>
#include <print.h> #include <print.h>
#include <string.h> #include <string.h>
#include <usb-base-drv.h> #include <usb-base-drv.h>
#include <work-area.h> #include <work-area.h>
#include "hbios-driver-storage.h"
extern const uint16_t const ch_ufi_fntbl[]; extern const uint16_t const ch_ufi_fntbl[];
@ -21,11 +21,10 @@ void chufi_init(void) {
const usb_device_type t = storage_device->type; const usb_device_type t = storage_device->type;
if (t == USB_IS_FLOPPY) { 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].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_string("\r\nUSB: FLOPPY @ $");
print_uint16(index); print_uint16(index);
print_string(":$"); print_string(":$");
@ -37,7 +36,9 @@ void chufi_init(void) {
} while (++index != MAX_NUMBER_OF_DEVICES + 1); } 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; ufi_format_capacities_response response;
memset(&response, 0, sizeof(ufi_format_capacities_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); 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) if (wait_for_device_ready((device_config *)dev, 20) != 0)
return -1; // Not READY! 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; 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) if (wait_for_device_ready((device_config *)dev, 20) != 0)
return -1; // Not READY! 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); ;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) ld a,(ix-1)
call _get_usb_device_config call _get_usb_device_config
ld l, e
;source-doc/ufi-drv/ufi-init.c:18: if (storage_device == NULL) ;source-doc/ufi-drv/ufi-init.c:18: if (storage_device == NULL)
ld a, d
ld a,d
ld h,a
or e or e
jr Z,l_chufi_init_00108 jr Z,l_chufi_init_00108
;source-doc/ufi-drv/ufi-init.c:21: const usb_device_type t = storage_device->type; ;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) ld a, (hl)
and 0x0f and 0x0f
;source-doc/ufi-drv/ufi-init.c:23: if (t == USB_IS_FLOPPY) { ;source-doc/ufi-drv/ufi-init.c:23: if (t == USB_IS_FLOPPY) {
dec a dec a
jr NZ,l_chufi_init_00106 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 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 (ix-2),0x00
ld c,l
pop hl pop hl
push hl push hl
add hl, 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 inc bc
ld a,(ix-1) ld a,(ix-1)
ld (bc), a 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 ld hl,ufi_init_str_0
call _print_string 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 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 ld hl,ufi_init_str_1
call _print_string call _print_string
pop hl
;source-doc/ufi-drv/ufi-init.c:32: print_uint16(dev_index + 1);
pop de pop de
push de
inc de
;source-doc/ufi-drv/ufi-init.c:31: print_uint16(dev_index + 1);
pop hl
push hl push hl
ex de, hl
inc hl
push de
call _print_uint16 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 ld hl,ufi_init_str_2
call _print_string 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 ld hl,_ch_ufi_fntbl
call _dio_add_entry call _dio_add_entry
l_chufi_init_00106: 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) inc (ix-1)
ld a,(ix-1) ld a,(ix-1)
sub 0x07 sub 0x07
jr NZ,l_chufi_init_00105 jr NZ,l_chufi_init_00105
l_chufi_init_00108: l_chufi_init_00108:
;source-doc/ufi-drv/ufi-init.c:38: }
;source-doc/ufi-drv/ufi-init.c:37: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
@ -166,7 +146,7 @@ ufi_init_str_1:
ufi_init_str_2: ufi_init_str_2:
DEFM " $" DEFM " $"
DEFB 0x00 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 ; Function chufi_get_cap
; --------------------------------- ; ---------------------------------
@ -177,7 +157,10 @@ _chufi_get_cap:
ld hl, -72 ld hl, -72
add hl, sp add hl, sp
ld sp, hl 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 ld hl,0
add hl, sp add hl, sp
ld b,0x12 ld b,0x12
@ -188,67 +171,66 @@ l_chufi_get_cap_00112:
ld (hl), a ld (hl), a
inc hl inc hl
djnz l_chufi_get_cap_00112 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 ld a,0x19
push af push af
inc sp inc sp
ld l,(ix+4)
ld h,(ix+5)
push hl
push de
call _wait_for_device_ready call _wait_for_device_ready
pop af pop af
inc sp 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 add hl, sp
push hl push hl
ld l,(ix+4)
ld h,(ix+5)
push hl
push de
call _ufi_inquiry call _ufi_inquiry
pop af 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 inc sp
ld l,(ix+4)
ld h,(ix+5)
push hl
push de
call _wait_for_device_ready call _wait_for_device_ready
pop af pop af
inc sp 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 ld hl,0
add hl, sp add hl, sp
push hl push hl
ld l,(ix+4)
ld h,(ix+5)
push hl
push de
call _ufi_read_frmt_caps call _ufi_read_frmt_caps
pop af pop af
pop af pop af
ld a, l 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 or a
jr Z,l_chufi_get_cap_00102 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 hl,0x0000
ld e, l ld e, l
ld d, l ld d, l
jr l_chufi_get_cap_00103 jr l_chufi_get_cap_00103
l_chufi_get_cap_00102: 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 ld hl,4
add hl, sp add hl, sp
push hl push hl
call _convert_from_msb_first call _convert_from_msb_first
pop af pop af
l_chufi_get_cap_00103: l_chufi_get_cap_00103:
;source-doc/ufi-drv/ufi-init.c:57: }
;source-doc/ufi-drv/ufi-init.c:58: }
ld sp, ix ld sp, ix
pop ix pop ix
ret 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 ; Function chufi_read
; --------------------------------- ; ---------------------------------
@ -259,10 +241,14 @@ _chufi_read:
ld hl, -20 ld hl, -20
add hl, sp add hl, sp
ld sp, hl 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 ld a,0x14
push af push af
inc sp inc sp
@ -271,23 +257,22 @@ _chufi_read:
pop af pop af
inc sp inc sp
ld a, l ld a, l
pop de
pop bc pop bc
or a or a
jr Z,l_chufi_read_00102 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 ld l,0xff
jr l_chufi_read_00109 jr l_chufi_read_00109
l_chufi_read_00102: 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 ld hl,0
add hl, sp add hl, sp
xor a xor a
ld (hl), a ld (hl), a
inc hl inc hl
ld (hl), a 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 ld hl,12
add hl, de add hl, de
ld e, (hl) ld e, (hl)
@ -318,11 +303,11 @@ l_chufi_read_00102:
pop bc pop bc
or a or a
jr Z,l_chufi_read_00104 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 ld l,0xff
jr l_chufi_read_00109 jr l_chufi_read_00109
l_chufi_read_00104: 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 push bc
ld hl,4 ld hl,4
add hl, sp add hl, sp
@ -335,7 +320,7 @@ l_chufi_read_00139:
inc hl inc hl
djnz l_chufi_read_00139 djnz l_chufi_read_00139
pop bc 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 ld hl,2
add hl, sp add hl, sp
push hl push hl
@ -346,29 +331,29 @@ l_chufi_read_00139:
ld a, l ld a, l
or a or a
jr Z,l_chufi_read_00106 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 ld l,0xff
jr l_chufi_read_00109 jr l_chufi_read_00109
l_chufi_read_00106: 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 ld hl,4
add hl, sp add hl, sp
ld a, (hl) 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 and 0x0f
jr Z,l_chufi_read_00108 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 ld l,0xff
jr l_chufi_read_00109 jr l_chufi_read_00109
l_chufi_read_00108: 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 ld l,0x00
l_chufi_read_00109: l_chufi_read_00109:
;source-doc/ufi-drv/ufi-init.c:86: }
;source-doc/ufi-drv/ufi-init.c:88: }
ld sp, ix ld sp, ix
pop ix pop ix
ret 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 ; Function chufi_write
; --------------------------------- ; ---------------------------------
@ -379,10 +364,14 @@ _chufi_write:
ld hl, -20 ld hl, -20
add hl, sp add hl, sp
ld sp, hl 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 ld a,0x14
push af push af
inc sp inc sp
@ -391,23 +380,22 @@ _chufi_write:
pop af pop af
inc sp inc sp
ld a, l ld a, l
pop de
pop bc pop bc
or a or a
jr Z,l_chufi_write_00102 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 ld l,0xff
jr l_chufi_write_00109 jr l_chufi_write_00109
l_chufi_write_00102: 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 ld hl,0
add hl, sp add hl, sp
xor a xor a
ld (hl), a ld (hl), a
inc hl inc hl
ld (hl), a 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 ld hl,12
add hl, de add hl, de
ld e, (hl) ld e, (hl)
@ -438,11 +426,11 @@ l_chufi_write_00102:
pop bc pop bc
or a or a
jr Z,l_chufi_write_00104 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 ld l,0xff
jr l_chufi_write_00109 jr l_chufi_write_00109
l_chufi_write_00104: 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 push bc
ld hl,4 ld hl,4
add hl, sp add hl, sp
@ -455,7 +443,7 @@ l_chufi_write_00139:
inc hl inc hl
djnz l_chufi_write_00139 djnz l_chufi_write_00139
pop bc 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 ld hl,2
add hl, sp add hl, sp
push hl push hl
@ -466,25 +454,25 @@ l_chufi_write_00139:
ld a, l ld a, l
or a or a
jr Z,l_chufi_write_00106 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 ld l,0xff
jr l_chufi_write_00109 jr l_chufi_write_00109
l_chufi_write_00106: 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 ld hl,4
add hl, sp add hl, sp
ld a, (hl) 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 and 0x0f
jr Z,l_chufi_write_00108 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 ld l,0xff
jr l_chufi_write_00109 jr l_chufi_write_00109
l_chufi_write_00108: 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 ld l,0x00
l_chufi_write_00109: l_chufi_write_00109:
;source-doc/ufi-drv/ufi-init.c:115: }
;source-doc/ufi-drv/ufi-init.c:118: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret

128
Source/HBIOS/ch376scsi.asm

@ -61,20 +61,26 @@ CH_SCSI_RESET:
; sector) are 0 relative. ; sector) are 0 relative.
; ;
CH_SCSI_SEEK: 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 BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY 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 PUSH DE
EXX
CALL _chnative_seek
PUSH HL
PUSH IY
CALL _scsi_seek
POP IY
POP HL
POP DE
XOR A
RET RET
; ;
; ### Function 0x13 -- Disk Read (DIOREAD) ; ### Function 0x13 -- Disk Read (DIOREAD)
@ -95,25 +101,25 @@ CH_SCSI_SEEK:
; ;
CH_SCSI_READ: CH_SCSI_READ:
EXX 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 EXX
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
; call scsi_read(IY, HL); ; call scsi_read(IY, HL);
; HL = HL + 512 ; HL = HL + 512
push hl
push iy
PUSH HL
PUSH IY
call _scsi_read 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) ; ### Function 0x14 -- Disk Write (DIOWRITE)
; ;
@ -133,11 +139,8 @@ CH_SCSI_READ:
; ;
CH_SCSI_WRITE: CH_SCSI_WRITE:
EXX EXX
push IY
POP HL
LD E, (HL)
INC HL
LD D, (HL)
LD D, 0
LD E, (IY+1) ; usb_device
PUSH DE PUSH DE
POP IY POP IY
EXX EXX
@ -146,14 +149,14 @@ CH_SCSI_WRITE:
; call scsi_write(IY, HL); ; call scsi_write(IY, HL);
; HL = HL + 512 ; HL = HL + 512
push hl
push iy
PUSH HL
PUSH IY
call _scsi_write 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 ret
CH_SCSI_VERIFY: CH_SCSI_VERIFY:
@ -206,7 +209,7 @@ CH_SCSI_FORMAT:
CH_SCSI_DEVICE: CH_SCSI_DEVICE:
LD C, %00111010 LD C, %00111010
LD D, DIODEV_USB LD D, DIODEV_USB
LD E, (iy+2) ; drive_index
LD E, (IY+0) ; drive_index
LD HL, 0 LD HL, 0
XOR A XOR A
RET RET
@ -252,40 +255,37 @@ CH_SCSI_DEFMED:
; ;
CH_SCSI_CAP: CH_SCSI_CAP:
EXX EXX
push IY
POP HL
LD E, (HL)
INC HL
LD D, (HL)
LD D, 0
LD E, (IY+1) ; usb_device
PUSH DE PUSH DE
POP IY POP IY
EXX 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 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) ; ### Function 0x1B -- Disk Geometry (DIOGEOMETRY)
; ;
@ -305,16 +305,6 @@ CH_SCSI_CAP:
; ** Does not appear to be used?? ; ** Does not appear to be used??
; ;
CH_SCSI_GEOM: 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 ; 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 ; 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 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" #include "./ch376-native/ufi-drv.s"
_ufi_seek .EQU _scsi_seek
; find and mount all floppy USB drives ; find and mount all floppy USB drives
CHUFI_INIT .EQU _chufi_init CHUFI_INIT .EQU _chufi_init
@ -61,22 +62,25 @@ CH_UFI_RESET:
; ;
CH_UFI_SEEK: CH_UFI_SEEK:
EXX EXX
push IY
POP HL
LD E, (HL)
INC HL
LD D, (HL)
LD D, 0
LD E, (IY+1) ; usb_device
PUSH DE PUSH DE
POP IY POP IY
EXX 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 RET
; ;
; ### Function 0x13 -- Disk Read (DIOREAD) ; ### Function 0x13 -- Disk Read (DIOREAD)
@ -97,27 +101,24 @@ CH_UFI_SEEK:
; ;
CH_UFI_READ: CH_UFI_READ:
EXX EXX
push IY
POP HL
LD E, (HL)
INC HL
LD D, (HL)
LD D, 0
LD E, (IY+1) ; usb_device
PUSH DE PUSH DE
POP IY POP IY
EXX EXX
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
push hl
push iy
PUSH HL
PUSH IY
call _chufi_read 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) ; ### Function 0x14 -- Disk Write (DIOWRITE)
; ;
@ -137,11 +138,8 @@ CH_UFI_READ:
; ;
CH_UFI_WRITE: CH_UFI_WRITE:
EXX EXX
push IY
POP HL
LD E, (HL)
INC HL
LD D, (HL)
LD D, 0
LD E, (IY+1) ; usb_device
PUSH DE PUSH DE
POP IY POP IY
EXX EXX
@ -150,15 +148,15 @@ CH_UFI_WRITE:
; call scsi_write(IY, HL); ; call scsi_write(IY, HL);
; HL = HL + 512 ; HL = HL + 512
push hl
push iy
PUSH HL
PUSH IY
call _chufi_write 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_VERIFY:
CH_UFI_FORMAT: CH_UFI_FORMAT:
@ -213,7 +211,7 @@ CH_UFI_FORMAT:
CH_UFI_DEVICE: CH_UFI_DEVICE:
LD C, %11010110 LD C, %11010110
LD D, DIODEV_USB LD D, DIODEV_USB
LD E, (iy+2) ; drive_index
LD E, (IY+0) ; drive_index
LD HL, 0 LD HL, 0
XOR A XOR A
RET RET
@ -262,21 +260,18 @@ CH_UFI_DEFMED:
; ;
CH_UFI_CAP: CH_UFI_CAP:
EXX EXX
push IY
POP HL
LD E, (HL)
INC HL
LD D, (HL)
LD D, 0
LD E, (IY+1) ; usb_device
PUSH DE PUSH DE
POP IY POP IY
EXX EXX
push iy
PUSH IY
call _chufi_get_cap call _chufi_get_cap
pop iy
ld bc, 512
xor a
ret
POP IY
LD BC, 512
XOR A
RET
CH_UFI_GEOM: CH_UFI_GEOM:
LD HL, 0 LD HL, 0

Loading…
Cancel
Save