From 179abe708788af94c0a23e35988ab374904f084c Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Mon, 21 Apr 2025 14:41:53 +1000 Subject: [PATCH] ch376-native: refactor: separating driver state and hbios state --- .vscode/settings.json | 3 +- Source/HBIOS/ch376-native/base-drv.s | 1 + .../base-drv/hbios-driver-storage.c.s | 114 ++++++++++++ .../ch376-native/scsi-drv/class_scsi.c.s | 118 ++++++++----- .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 91 +++++++--- .../base-drv/hbios-driver-storage.c | 11 ++ .../base-drv/hbios-driver-storage.h | 16 ++ .../ch376-native/source-doc/base-drv/hbios.h | 2 +- .../source-doc/scsi-drv/class_scsi.c | 8 +- .../source-doc/scsi-drv/class_scsi.h | 2 +- .../source-doc/scsi-drv/scsi-init.c | 10 +- .../source-doc/ufi-drv/ufi-init.c | 10 +- .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 165 +++++++++++------- Source/HBIOS/ch376scsi.asm | 53 +++++- Source/HBIOS/ch376ufi.asm | 47 ++++- 15 files changed, 495 insertions(+), 156 deletions(-) create mode 100644 Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h diff --git a/.vscode/settings.json b/.vscode/settings.json index a1edd90b..7b5d2f7c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -23,6 +23,7 @@ "enumerate.h": "c", "ch376inc.h": "c", "enumerate_storage.h": "c", - "work-area.h": "c" + "work-area.h": "c", + "hbios-driver-storage.h": "c" } } diff --git a/Source/HBIOS/ch376-native/base-drv.s b/Source/HBIOS/ch376-native/base-drv.s index ed11de0a..2f0a85d6 100644 --- a/Source/HBIOS/ch376-native/base-drv.s +++ b/Source/HBIOS/ch376-native/base-drv.s @@ -7,6 +7,7 @@ #include "ch376-native/base-drv/enumerate.c.s" #include "ch376-native/base-drv/enumerate_hub.c.s" #include "ch376-native/base-drv/enumerate_storage.c.s" +#include "ch376-native/base-drv/hbios-driver-storage.c.s" #include "ch376-native/base-drv/protocol.c.s" #include "ch376-native/base-drv/transfers.c.s" #include "ch376-native/base-drv/usb-base-drv.c.s" diff --git a/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s b/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s new file mode 100644 index 00000000..578b9289 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s @@ -0,0 +1,114 @@ +; +; Generated from source-doc/base-drv/hbios-driver-storage.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_hbios_usb_storage_devices: + DEFS 24 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/hbios-driver-storage.c:5: uint8_t find_storage_dev(void) { +; --------------------------------- +; 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++) + ld c,0x00 + ld de,_hbios_usb_storage_devices+0 + ld b,c +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) + 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 + 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++) + inc b + ld c, b + jr l_find_storage_dev_00105 +l_find_storage_dev_00103: +;source-doc/base-drv/hbios-driver-storage.c:10: return -1; + ld l,0xff +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 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index bc712804..a56b867a 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -587,7 +587,22 @@ l_scsi_sense_init_00104: ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:120: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { +;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) { ; --------------------------------- ; Function scsi_read ; --------------------------------- @@ -595,7 +610,13 @@ _scsi_read: push ix ld ix,0 add ix,sp -;source-doc/scsi-drv/class_scsi.c:121: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + push af +;source-doc/scsi-drv/class_scsi.c:125: 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)); ld de,_cbw ld l, e ld h, d @@ -608,30 +629,30 @@ l_scsi_read_00113: ld (hl),0x00 inc hl djnz l_scsi_read_00112 -;source-doc/scsi-drv/class_scsi.c:122: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:128: cbw.cbw = scsi_command_block_wrapper; ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:124: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:130: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:125: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/class_scsi.c:131: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:126: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/class_scsi.c:132: 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:128: cbw.scsi_cmd.operation_code = 0x28; // read operation +;source-doc/scsi-drv/class_scsi.c:134: cbw.scsi_cmd.operation_code = 0x28; // read operation ld hl,_cbw + 15 ld (hl),0x28 -;source-doc/scsi-drv/class_scsi.c:129: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/class_scsi.c:135: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:130: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld l,(ix+4) - ld h,(ix+5) +;source-doc/scsi-drv/class_scsi.c:136: 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 @@ -641,8 +662,8 @@ l_scsi_read_00113: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:131: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:132: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;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; ld l,c ld h,b inc hl @@ -653,11 +674,11 @@ l_scsi_read_00113: ld e, (hl) ld hl, +(_cbw + 19) ld (hl), e -;source-doc/scsi-drv/class_scsi.c:133: cbw.scsi_cmd.lba[3] = dev->current_lba; +;source-doc/scsi-drv/class_scsi.c:139: cbw.scsi_cmd.lba[3] = dev->current_lba; ld a, (bc) inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:135: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); +;source-doc/scsi-drv/class_scsi.c:141: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); ld e,(ix+6) ld d,(ix+7) push bc @@ -667,8 +688,8 @@ l_scsi_read_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 @@ -678,11 +699,11 @@ l_scsi_read_00113: pop bc ld a, l ld (_result), a -;source-doc/scsi-drv/class_scsi.c:137: if (result == USB_ERR_OK) +;source-doc/scsi-drv/class_scsi.c:143: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_read_00102 -;source-doc/scsi-drv/class_scsi.c:138: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:144: dev->current_lba++; ld l, c ld h, b ld e, (hl) @@ -711,12 +732,13 @@ l_scsi_read_00114: ld a, h ld (bc), a l_scsi_read_00102: -;source-doc/scsi-drv/class_scsi.c:139: return result; +;source-doc/scsi-drv/class_scsi.c:145: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:140: } +;source-doc/scsi-drv/class_scsi.c:146: } + ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:142: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/scsi-drv/class_scsi.c:148: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_write ; --------------------------------- @@ -724,7 +746,7 @@ _scsi_write: push ix ld ix,0 add ix,sp -;source-doc/scsi-drv/class_scsi.c:143: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;source-doc/scsi-drv/class_scsi.c:149: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld de,_cbw ld l, e ld h, d @@ -737,28 +759,28 @@ l_scsi_write_00113: ld (hl),0x00 inc hl djnz l_scsi_write_00112 -;source-doc/scsi-drv/class_scsi.c:144: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:150: cbw.cbw = scsi_command_block_wrapper; ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:146: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:152: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:147: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/class_scsi.c:153: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:148: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/class_scsi.c:154: 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:150: cbw.scsi_cmd.operation_code = 0x2A; // write operation +;source-doc/scsi-drv/class_scsi.c:156: cbw.scsi_cmd.operation_code = 0x2A; // write operation ld hl,_cbw + 15 ld (hl),0x2a -;source-doc/scsi-drv/class_scsi.c:151: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/class_scsi.c:157: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:152: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; +;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) ld bc,0x000c @@ -770,8 +792,8 @@ l_scsi_write_00113: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:153: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:154: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;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; ld l,c ld h,b inc hl @@ -782,11 +804,11 @@ l_scsi_write_00113: ld e, (hl) ld hl, +(_cbw + 19) ld (hl), e -;source-doc/scsi-drv/class_scsi.c:155: cbw.scsi_cmd.lba[3] = dev->current_lba; +;source-doc/scsi-drv/class_scsi.c:161: cbw.scsi_cmd.lba[3] = dev->current_lba; ld a, (bc) inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:157: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); +;source-doc/scsi-drv/class_scsi.c:163: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); ld e,(ix+6) ld d,(ix+7) push bc @@ -807,11 +829,11 @@ l_scsi_write_00113: pop bc ld a, l ld (_result), a -;source-doc/scsi-drv/class_scsi.c:159: if (result == USB_ERR_OK) +;source-doc/scsi-drv/class_scsi.c:165: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_write_00102 -;source-doc/scsi-drv/class_scsi.c:160: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:166: dev->current_lba++; ld l, c ld h, b ld e, (hl) @@ -840,12 +862,12 @@ l_scsi_write_00114: ld a, h ld (bc), a l_scsi_write_00102: -;source-doc/scsi-drv/class_scsi.c:161: return result; +;source-doc/scsi-drv/class_scsi.c:167: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:162: } +;source-doc/scsi-drv/class_scsi.c:168: } pop ix ret -;source-doc/scsi-drv/class_scsi.c:164: usb_error scsi_eject(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:170: usb_error scsi_eject(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_eject ; --------------------------------- @@ -856,7 +878,7 @@ _scsi_eject: ld hl, -21 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:166: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:172: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -865,7 +887,7 @@ _scsi_eject: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:168: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); +;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 @@ -877,17 +899,17 @@ l_scsi_eject_00103: inc hl djnz l_scsi_eject_00103 pop bc -;source-doc/scsi-drv/class_scsi.c:170: cbw_scsi.eject.operation_code = 0x1B; +;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:171: cbw_scsi.eject.loej = 1; +;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:173: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:179: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-8),0x00 -;source-doc/scsi-drv/class_scsi.c:174: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); +;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:175: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:181: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,0x0008 add hl, bc xor a @@ -898,7 +920,7 @@ l_scsi_eject_00103: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:177: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/class_scsi.c:183: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -909,7 +931,7 @@ l_scsi_eject_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:178: } +;source-doc/scsi-drv/class_scsi.c:184: } ld sp,ix pop ix ret diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index e4be4af6..147acfaa 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/scsi-drv/scsi-init.c:13: void chscsi_init(void) { +;source-doc/scsi-drv/scsi-init.c:14: void chscsi_init(void) { ; --------------------------------- ; Function chscsi_init ; --------------------------------- @@ -56,68 +56,105 @@ _chscsi_init: push ix ld ix,0 add ix,sp - dec sp -;source-doc/scsi-drv/scsi-init.c:15: do { + ld hl, -5 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/scsi-init.c:16: do { ld (ix-1),0x01 l_chscsi_init_00105: -;source-doc/scsi-drv/scsi-init.c:16: 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) call _get_usb_device_config -;source-doc/scsi-drv/scsi-init.c:18: if (storage_device == NULL) +;source-doc/scsi-drv/scsi-init.c:19: if (storage_device == NULL) ld a, d or e - jr Z,l_chscsi_init_00108 -;source-doc/scsi-drv/scsi-init.c:21: const usb_device_type t = storage_device->type; + jp 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:23: if (t == USB_IS_MASS_STORAGE) { +;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:24: print_string("\r\nUSB: MASS STORAGE @ $"); +;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 + 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 + 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 (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 + 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 + inc bc + ld a,(ix-1) + ld (bc), a +;source-doc/scsi-drv/scsi-init.c:30: 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:25: print_uint16(index); +;source-doc/scsi-drv/scsi-init.c:31: print_uint16(index); ld l,(ix-1) ld h,0x00 push de call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:26: print_string(":$"); +;source-doc/scsi-drv/scsi-init.c:32: print_string(":$"); ld hl,scsi_init_str_1 call _print_string pop de -;source-doc/scsi-drv/scsi-init.c:27: print_uint16(storage_device->drive_index); - ld hl,16 - add hl,de - ld l, (hl) - ld h,0x00 +;source-doc/scsi-drv/scsi-init.c:33: print_uint16(dev_index + 1); + pop hl + push hl + inc hl push de call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:28: print_string(" $"); +;source-doc/scsi-drv/scsi-init.c:34: print_string(" $"); ld hl,scsi_init_str_2 call _print_string - pop de -;source-doc/scsi-drv/scsi-init.c:29: scsi_sense_init(storage_device); - push de - push de +;source-doc/scsi-drv/scsi-init.c:35: scsi_sense_init(storage_device); call _scsi_sense_init pop af - pop de -;source-doc/scsi-drv/scsi-init.c:30: dio_add_entry(ch_scsi_fntbl, storage_device); +;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) ld hl,_ch_scsi_fntbl call _dio_add_entry l_chscsi_init_00106: -;source-doc/scsi-drv/scsi-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/scsi-drv/scsi-init.c:39: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 - jr NZ,l_chscsi_init_00105 + jp NZ,l_chscsi_init_00105 l_chscsi_init_00108: -;source-doc/scsi-drv/scsi-init.c:34: } - inc sp +;source-doc/scsi-drv/scsi-init.c:40: } + ld sp, ix pop ix ret scsi_init_str_0: diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c new file mode 100644 index 00000000..a5a426a4 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c @@ -0,0 +1,11 @@ +#include "hbios-driver-storage.h" + +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) + return i; + + return -1; +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h new file mode 100644 index 00000000..ec15480d --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h @@ -0,0 +1,16 @@ +#ifndef __HBIOS_DRIVER_STORAGE +#define __HBIOS_DRIVER_STORAGE + +#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; + +extern hbios_storage_device_t hbios_usb_storage_devices[MAX_NUMBER_OF_DEVICES]; + +uint8_t find_storage_dev(void); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h index 179a5267..3c4c83e8 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h @@ -1,6 +1,6 @@ #ifndef _HBIOS_H_ #define _HBIOS_H_ -extern void dio_add_entry(const uint16_t fnc_table[], const device_config_storage *const storage_device) __sdcccall(1); +extern void dio_add_entry(const uint16_t fnc_table[], const void *const storage_device) __sdcccall(1); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c index 86e962c9..762e41c2 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c @@ -117,7 +117,13 @@ usb_error scsi_sense_init(device_config_storage *const dev) { static cbw_scsi_read_write cbw = {{{0}}}; -usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { +void spike_x(void) { + scsi_read(5, NULL); +} + +usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + memset(&cbw, 0, sizeof(cbw_scsi_read_write)); cbw.cbw = scsi_command_block_wrapper; diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h index bcdcc031..5e5b63bf 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h @@ -188,6 +188,6 @@ 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(device_config_storage *const dev, uint8_t *const buffer); +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); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c index cbcaed45..6438ef4d 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -7,6 +7,7 @@ #include #include #include +#include "hbios-driver-storage.h" extern const uint16_t const ch_scsi_fntbl[]; @@ -21,13 +22,18 @@ 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; + hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; + hbios_usb_storage_devices[dev_index].usb_device = index; + print_string("\r\nUSB: MASS STORAGE @ $"); print_uint16(index); print_string(":$"); - print_uint16(storage_device->drive_index); + print_uint16(dev_index + 1); print_string(" $"); scsi_sense_init(storage_device); - dio_add_entry(ch_scsi_fntbl, storage_device); + dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); } } while (++index != MAX_NUMBER_OF_DEVICES + 1); diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c index 5ba62e95..ebd6a64f 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c @@ -5,6 +5,7 @@ #include #include #include +#include "hbios-driver-storage.h" extern const uint16_t const ch_ufi_fntbl[]; @@ -20,12 +21,17 @@ 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; + hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; + hbios_usb_storage_devices[dev_index].usb_device = index; + print_string("\r\nUSB: FLOPPY @ $"); print_uint16(index); print_string(":$"); - print_uint16(storage_device->drive_index); + print_uint16(dev_index + 1); print_string(" $"); - dio_add_entry(ch_ufi_fntbl, storage_device); + dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); } } while (++index != MAX_NUMBER_OF_DEVICES + 1); diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 627967a4..377e8fb6 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/ufi-drv/ufi-init.c:11: void chufi_init(void) { +;source-doc/ufi-drv/ufi-init.c:12: void chufi_init(void) { ; --------------------------------- ; Function chufi_init ; --------------------------------- @@ -56,62 +56,103 @@ _chufi_init: push ix ld ix,0 add ix,sp + push af dec sp -;source-doc/ufi-drv/ufi-init.c:14: do { +;source-doc/ufi-drv/ufi-init.c:15: do { ld (ix-1),0x01 l_chufi_init_00105: -;source-doc/ufi-drv/ufi-init.c:15: 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) call _get_usb_device_config -;source-doc/ufi-drv/ufi-init.c:17: if (storage_device == NULL) +;source-doc/ufi-drv/ufi-init.c:18: if (storage_device == NULL) ld a, d or e jr Z,l_chufi_init_00108 -;source-doc/ufi-drv/ufi-init.c:20: 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) and 0x0f -;source-doc/ufi-drv/ufi-init.c:22: if (t == USB_IS_FLOPPY) { +;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:23: print_string("\r\nUSB: FLOPPY @ $"); +;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 + 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 + ld (ix-2),0x00 + 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 + inc bc + ld a,(ix-1) + ld (bc), a +;source-doc/ufi-drv/ufi-init.c:29: print_string("\r\nUSB: FLOPPY @ $"); + push hl ld hl,ufi_init_str_0 call _print_string - pop de -;source-doc/ufi-drv/ufi-init.c:24: print_uint16(index); - ld l,(ix-1) - ld h,0x00 - push de + 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 call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:25: print_string(":$"); +;source-doc/ufi-drv/ufi-init.c:31: 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 -;source-doc/ufi-drv/ufi-init.c:26: print_uint16(storage_device->drive_index); - ld hl,16 - add hl,de - ld l, (hl) - ld h,0x00 push de + inc de + push hl + ex de, hl call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:27: print_string(" $"); +;source-doc/ufi-drv/ufi-init.c:33: print_string(" $"); ld hl,ufi_init_str_2 call _print_string - pop de -;source-doc/ufi-drv/ufi-init.c:28: dio_add_entry(ch_ufi_fntbl, storage_device); + 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 ld hl,_ch_ufi_fntbl call _dio_add_entry l_chufi_init_00106: -;source-doc/ufi-drv/ufi-init.c:31: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/ufi-drv/ufi-init.c:37: } 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:32: } - inc sp +;source-doc/ufi-drv/ufi-init.c:38: } + ld sp, ix pop ix ret ufi_init_str_0: @@ -125,7 +166,7 @@ ufi_init_str_1: ufi_init_str_2: DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/ufi-init.c:34: uint32_t chufi_get_cap(device_config *const dev) { +;source-doc/ufi-drv/ufi-init.c:40: uint32_t chufi_get_cap(device_config *const dev) { ; --------------------------------- ; Function chufi_get_cap ; --------------------------------- @@ -136,7 +177,7 @@ _chufi_get_cap: ld hl, -72 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:36: memset(&response, 0, sizeof(ufi_format_capacities_response)); +;source-doc/ufi-drv/ufi-init.c:42: memset(&response, 0, sizeof(ufi_format_capacities_response)); ld hl,0 add hl, sp ld b,0x12 @@ -147,7 +188,7 @@ l_chufi_get_cap_00112: ld (hl), a inc hl djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/ufi-init.c:38: wait_for_device_ready(dev, 25); +;source-doc/ufi-drv/ufi-init.c:44: wait_for_device_ready(dev, 25); ld a,0x19 push af inc sp @@ -157,7 +198,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:42: ufi_inquiry(dev, &inquiry); +;source-doc/ufi-drv/ufi-init.c:48: ufi_inquiry(dev, &inquiry); ld hl,36 add hl, sp push hl @@ -166,7 +207,7 @@ l_chufi_get_cap_00112: push hl call _ufi_inquiry pop af -;source-doc/ufi-drv/ufi-init.c:44: wait_for_device_ready(dev, 15); +;source-doc/ufi-drv/ufi-init.c:50: wait_for_device_ready(dev, 15); ld h,0x0f ex (sp),hl inc sp @@ -176,7 +217,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:46: const usb_error result = ufi_read_frmt_caps(dev, &response); +;source-doc/ufi-drv/ufi-init.c:52: const usb_error result = ufi_read_frmt_caps(dev, &response); ld hl,0 add hl, sp push hl @@ -187,27 +228,27 @@ l_chufi_get_cap_00112: pop af pop af ld a, l -;source-doc/ufi-drv/ufi-init.c:47: if (result != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:53: if (result != USB_ERR_OK) or a jr Z,l_chufi_get_cap_00102 -;source-doc/ufi-drv/ufi-init.c:48: return 0; +;source-doc/ufi-drv/ufi-init.c:54: 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:50: return convert_from_msb_first(response.descriptors[0].number_of_blocks); +;source-doc/ufi-drv/ufi-init.c:56: 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:51: } +;source-doc/ufi-drv/ufi-init.c:57: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:53: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:59: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_read ; --------------------------------- @@ -218,7 +259,7 @@ _chufi_read: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:55: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;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 @@ -233,18 +274,18 @@ _chufi_read: pop bc or a jr Z,l_chufi_read_00102 -;source-doc/ufi-drv/ufi-init.c:56: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:62: return -1; // Not READY! ld l,0xff jr l_chufi_read_00109 l_chufi_read_00102: -;source-doc/ufi-drv/ufi-init.c:61: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:67: 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:63: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) +;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) ld hl,12 @@ -277,11 +318,11 @@ l_chufi_read_00102: pop bc or a jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/ufi-init.c:64: return -1; // general error +;source-doc/ufi-drv/ufi-init.c:70: return -1; // general error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00104: -;source-doc/ufi-drv/ufi-init.c:67: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:73: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -294,7 +335,7 @@ l_chufi_read_00139: inc hl djnz l_chufi_read_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:69: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:75: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) ld hl,2 add hl, sp push hl @@ -305,29 +346,29 @@ l_chufi_read_00139: ld a, l or a jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/ufi-init.c:70: return -1; // error +;source-doc/ufi-drv/ufi-init.c:76: return -1; // error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00106: -;source-doc/ufi-drv/ufi-init.c:74: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:80: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:76: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:82: if (sense_key != 0) and 0x0f jr Z,l_chufi_read_00108 -;source-doc/ufi-drv/ufi-init.c:77: return -1; +;source-doc/ufi-drv/ufi-init.c:83: return -1; ld l,0xff jr l_chufi_read_00109 l_chufi_read_00108: -;source-doc/ufi-drv/ufi-init.c:79: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:85: return USB_ERR_OK; ld l,0x00 l_chufi_read_00109: -;source-doc/ufi-drv/ufi-init.c:80: } +;source-doc/ufi-drv/ufi-init.c:86: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:82: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:88: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_write ; --------------------------------- @@ -338,7 +379,7 @@ _chufi_write: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:84: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;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 @@ -353,18 +394,18 @@ _chufi_write: pop bc or a jr Z,l_chufi_write_00102 -;source-doc/ufi-drv/ufi-init.c:85: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:91: return -1; // Not READY! ld l,0xff jr l_chufi_write_00109 l_chufi_write_00102: -;source-doc/ufi-drv/ufi-init.c:89: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:95: 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:90: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { +;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) ld hl,12 @@ -397,11 +438,11 @@ l_chufi_write_00102: pop bc or a jr Z,l_chufi_write_00104 -;source-doc/ufi-drv/ufi-init.c:91: return -1; +;source-doc/ufi-drv/ufi-init.c:97: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00104: -;source-doc/ufi-drv/ufi-init.c:95: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:101: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -414,7 +455,7 @@ l_chufi_write_00139: inc hl djnz l_chufi_write_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:97: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { +;source-doc/ufi-drv/ufi-init.c:103: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { ld hl,2 add hl, sp push hl @@ -425,25 +466,25 @@ l_chufi_write_00139: ld a, l or a jr Z,l_chufi_write_00106 -;source-doc/ufi-drv/ufi-init.c:98: return -1; +;source-doc/ufi-drv/ufi-init.c:104: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00106: -;source-doc/ufi-drv/ufi-init.c:103: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:109: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:105: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:111: if (sense_key != 0) and 0x0f jr Z,l_chufi_write_00108 -;source-doc/ufi-drv/ufi-init.c:106: return -1; +;source-doc/ufi-drv/ufi-init.c:112: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00108: -;source-doc/ufi-drv/ufi-init.c:108: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:114: return USB_ERR_OK; ld l,0x00 l_chufi_write_00109: -;source-doc/ufi-drv/ufi-init.c:109: } +;source-doc/ufi-drv/ufi-init.c:115: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376scsi.asm b/Source/HBIOS/ch376scsi.asm index 5fad919e..74c3283d 100644 --- a/Source/HBIOS/ch376scsi.asm +++ b/Source/HBIOS/ch376scsi.asm @@ -30,12 +30,10 @@ CH_SCSI_FNTBL: #ENDIF CH_SCSI_STATUS: - ; LD A, (IY) XOR A RET CH_SCSI_RESET: - ; LD A, (IY) XOR A RET @@ -68,7 +66,14 @@ CH_SCSI_SEEK: 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 RET ; @@ -89,6 +94,13 @@ CH_SCSI_SEEK: ; Status (A) is a standard HBIOS result code. ; CH_SCSI_READ: + EXX + ld d, 0 + ld e, (iy+3) + push de + pop iy + EXX + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR ; call scsi_read(IY, HL); @@ -120,6 +132,16 @@ CH_SCSI_READ: ; Status (A) is a standard HBIOS result code. ; CH_SCSI_WRITE: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR ; call scsi_write(IY, HL); @@ -182,11 +204,10 @@ CH_SCSI_FORMAT: ; | | 9=Cartridge, 10=usb-scsi, 11=usb-ufi | ; CH_SCSI_DEVICE: - LD C, %00111010 ; TODO? + LD C, %00111010 LD D, DIODEV_USB - LD E, (iy+16) ;???? device_config_storage.drive_index - LD H, 0 - LD L, 0 + LD E, (iy+2) ; drive_index + LD HL, 0 XOR A RET ; @@ -230,6 +251,16 @@ CH_SCSI_DEFMED: ; ; CH_SCSI_CAP: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + push ix ld ix, -8 ; reserve 8 bytes for add ix, sp ; scsi_read_capacity_result @@ -274,6 +305,16 @@ CH_SCSI_CAP: ; ** Does not appear to be used?? ; CH_SCSI_GEOM: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE CALL CH_SCSI_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm index 07a85a6d..521e76a9 100644 --- a/Source/HBIOS/ch376ufi.asm +++ b/Source/HBIOS/ch376ufi.asm @@ -30,12 +30,10 @@ CH_UFI_FNTBL: #ENDIF CH_UFI_STATUS: - LD A, (IY) XOR A RET CH_UFI_RESET: - LD A, (IY) XOR A RET ; ### Function 0x12 -- Disk Seek (DIOSEEK) @@ -62,6 +60,16 @@ CH_UFI_RESET: ; sector) are 0 relative. ; CH_UFI_SEEK: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + 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 @@ -88,6 +96,16 @@ CH_UFI_SEEK: ; Status (A) is a standard HBIOS result code. ; CH_UFI_READ: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR push hl @@ -118,6 +136,16 @@ CH_UFI_READ: ; Status (A) is a standard HBIOS result code. ; CH_UFI_WRITE: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR ; call scsi_write(IY, HL); @@ -185,9 +213,8 @@ CH_UFI_FORMAT: CH_UFI_DEVICE: LD C, %11010110 LD D, DIODEV_USB - LD E, (iy+16) - LD H, 0 - LD L, 0 + LD E, (iy+2) ; drive_index + LD HL, 0 XOR A RET ; @@ -234,6 +261,16 @@ CH_UFI_DEFMED: ; Report the current media capacity information. ; CH_UFI_CAP: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + push iy call _chufi_get_cap pop iy