From b4421a05323c009699b6213722af39cf79bb5bcc Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Fri, 18 Oct 2024 12:35:19 +1100 Subject: [PATCH] ch376-native: general fixes - mass storage and floppy devices over hub seem to be working --- Source/HBIOS/ch376-native/print.asm | 7 + .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 50 ++-- .../ch376-native/source-doc/base-drv/ch376.c | 4 +- .../ch376-native/source-doc/base-drv/print.c | 9 - .../ch376-native/source-doc/base-drv/print.h | 1 - .../source-doc/base-drv/protocol.c | 2 +- .../source-doc/base-drv/transfers.c | 2 +- .../source-doc/scsi-drv/scsi-init.c | 9 +- .../source-doc/ufi-drv/class_ufi.c | 2 +- .../source-doc/ufi-drv/ufi-init.c | 47 ++-- .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 214 ++++++++++++++---- Source/HBIOS/ch376ufi.asm | 35 ++- 12 files changed, 271 insertions(+), 111 deletions(-) delete mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/print.c diff --git a/Source/HBIOS/ch376-native/print.asm b/Source/HBIOS/ch376-native/print.asm index 70acafe7..99d736f2 100644 --- a/Source/HBIOS/ch376-native/print.asm +++ b/Source/HBIOS/ch376-native/print.asm @@ -2,6 +2,9 @@ ; HL = unsigned 16 bit number to write out ; call CHPUT to write a single ascii character (in A) _print_uint16: + ld a, h + or l + jr z, print_zero ld e, 0 ld bc, -10000 call num1 @@ -30,3 +33,7 @@ num2: inc a num3: ld e, 1 jp COUT + +print_zero + ld a, '0' + jp COUT 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 691f8f85..025f5a54 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -66,7 +66,7 @@ l_chscsi_init_00105: ;source-doc/scsi-drv/./scsi-init.c:18: if (storage_device == NULL) ld a, d or e - jr Z,l_chscsi_init_00107 + jr Z,l_chscsi_init_00108 ;source-doc/scsi-drv/./scsi-init.c:21: const usb_device_type t = storage_device->type; ld l, e ld h, d @@ -75,7 +75,20 @@ l_chscsi_init_00105: ;source-doc/scsi-drv/./scsi-init.c:23: if (t == USB_IS_MASS_STORAGE) { sub 0x02 jr NZ,l_chscsi_init_00106 -;source-doc/scsi-drv/./scsi-init.c:24: storage_device->drive_index = storage_count++; +;source-doc/scsi-drv/./scsi-init.c:24: print_string("\r\n 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); + ld l,(ix-1) + ld h,0x00 + push de + call _print_uint16 + ld hl,scsi_init_str_1 + call _print_string + pop de +;source-doc/scsi-drv/./scsi-init.c:28: storage_device->drive_index = storage_count++; ld hl,0x0010 add hl, de ld c, l @@ -86,42 +99,31 @@ l_chscsi_init_00105: inc (hl) ld a,(ix-2) ld (bc), a -;source-doc/scsi-drv/./scsi-init.c:25: scsi_sense_init(storage_device); +;source-doc/scsi-drv/./scsi-init.c:29: scsi_sense_init(storage_device); push de push de call _scsi_sense_init pop af pop de -;source-doc/scsi-drv/./scsi-init.c:26: dio_add_entry(ch_scsi_fntbl, storage_device); +;source-doc/scsi-drv/./scsi-init.c:30: dio_add_entry(ch_scsi_fntbl, storage_device); ld hl,_ch_scsi_fntbl call _dio_add_entry l_chscsi_init_00106: -;source-doc/scsi-drv/./scsi-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/scsi-drv/./scsi-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chscsi_init_00105 -l_chscsi_init_00107: -;source-doc/scsi-drv/./scsi-init.c:31: if (storage_count == 0) - ld hl,_storage_count - ld a, (hl) - or a -;source-doc/scsi-drv/./scsi-init.c:32: return; - jr Z,l_chscsi_init_00110 -;source-doc/scsi-drv/./scsi-init.c:34: print_device_mounted(" STORAGE DEVICE$", storage_count); - ld a,(_storage_count) - push af - inc sp - ld hl,scsi_init_str_0 - push hl - call _print_device_mounted - pop af - inc sp -l_chscsi_init_00110: -;source-doc/scsi-drv/./scsi-init.c:35: } +l_chscsi_init_00108: +;source-doc/scsi-drv/./scsi-init.c:34: } ld sp, ix pop ix ret scsi_init_str_0: - DEFM " STORAGE DEVICE$" + DEFB 0x0d + DEFB 0x0a + DEFM " MASS STORAGE @ $" + DEFB 0x00 +scsi_init_str_1: + DEFM " $" DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c index 3e358feb..4c7b52d1 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c @@ -1,7 +1,7 @@ #include "ch376.h" -#include "print.h" #include "ez80-helpers.h" +#include "print.h" usb_error result = 0; @@ -41,7 +41,7 @@ usb_error ch_get_status(void) { delay(); delay(); uint8_t ch_status = CH376_DATA_PORT; - + if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) return ch_status; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/print.c b/Source/HBIOS/ch376-native/source-doc/base-drv/print.c deleted file mode 100644 index bcec3e82..00000000 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/print.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "print.h" - -void print_device_mounted(const char *const description, const uint8_t count) { - print_string("\r\n $"); - print_uint16(count); - print_string(description); - if (count > 1) - print_string("S$"); -} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/print.h b/Source/HBIOS/ch376-native/source-doc/base-drv/print.h index 7b4c4723..480f73f7 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/print.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/print.h @@ -6,6 +6,5 @@ extern void print_hex(const char c) __z88dk_fastcall; extern void print_string(const char *p) __z88dk_fastcall; extern void print_uint16(const uint16_t n) __z88dk_fastcall; -extern void print_device_mounted(const char *const description, const uint8_t count); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c index 10dbbdd4..e5c5101c 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c @@ -15,8 +15,8 @@ #include "delay.h" #include -#include "print.h" #include "ez80-helpers.h" +#include "print.h" const setup_packet cmd_get_device_descriptor = {0x80, 6, {0, 1}, {0, 0}, 8}; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c index 4c7bcbe9..c19efcc5 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c @@ -16,8 +16,8 @@ #include "z80.h" #include -#include "print.h" #include "ez80-helpers.h" +#include "print.h" #define LOWER_SAFE_RAM_ADDRESS 0x8000 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 1511f3b5..8128f4ca 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 @@ -21,15 +21,14 @@ void chscsi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_MASS_STORAGE) { + print_string("\r\n MASS STORAGE @ $"); + print_uint16(index); + print_string(" $"); + storage_device->drive_index = storage_count++; scsi_sense_init(storage_device); dio_add_entry(ch_scsi_fntbl, storage_device); } } while (++index != MAX_NUMBER_OF_DEVICES + 1); - - if (storage_count == 0) - return; - - print_device_mounted(" STORAGE DEVICE$", storage_count); } diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c index 035c33d4..ed5f265a 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c @@ -94,7 +94,7 @@ usb_error ufi_read_write_sector(device_config *const storage_device, const bool send, const uint16_t sector_number, const uint8_t sector_count, - const uint8_t *const buffer, + uint8_t *const buffer, uint8_t *const sense_codes) { ufi_read_write_command cmd; memset(&cmd, 0, sizeof(cmd)); 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 6cbd88bd..ec82dc90 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 @@ -20,17 +20,15 @@ void chufi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_FLOPPY) { + print_string("\r\n FLOPPY @ $"); + print_uint16(index); + print_string(" $"); storage_device->drive_index = storage_count++; // scsi_sense_init(storage_device); dio_add_entry(ch_ufi_fntbl, storage_device); } } while (++index != MAX_NUMBER_OF_DEVICES + 1); - - if (storage_count == 0) - return; - - print_device_mounted(" FLOPPY DRIVE$", storage_count); } uint32_t chufi_get_cap(device_config *const dev) { @@ -49,17 +47,7 @@ uint32_t chufi_get_cap(device_config *const dev) { if (result != USB_ERR_OK) return 0; - // info->sector_size = response.descriptors[0].block_size[1] << 8 + response.descriptors[0].block_size[0]; return convert_from_msb_first(response.descriptors[0].number_of_blocks); - - // const disk_geometry *const geometry = size_to_geometry(info->number_of_sectors); - - // info->flags = INFO_FLAG_REMOVABLE | INFO_FLAG_FLOPPY; - // info->number_of_cylinders = geometry->tracks; - // info->number_of_heads = geometry->sides; - // info->number_of_sectors_per_track = geometry->sectors_per_track; - - // return 0; } uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { @@ -90,3 +78,32 @@ uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { return USB_ERR_OK; } + +usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { + + if (wait_for_device_ready((device_config *)dev, 20) != 0) + return -1; // Not READY! + + ufi_interrupt_status sense_codes; + + memset(&sense_codes, 0, sizeof(sense_codes)); + if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { + return -1; + } + + ufi_request_sense_response response; + memset(&response, 0, sizeof(response)); + + if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { + return -1; + } + + const uint8_t asc = response.asc; + const uint8_t ascq = response.ascq; + const uint8_t sense_key = response.sense_key; + + if (sense_key != 0) + return -1; + + return USB_ERR_OK; +} diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 11daa508..33bbebd2 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -66,7 +66,7 @@ l_chufi_init_00105: ;source-doc/ufi-drv/./ufi-init.c:17: if (storage_device == NULL) ld a, d or e - jr Z,l_chufi_init_00107 + jr Z,l_chufi_init_00108 ;source-doc/ufi-drv/./ufi-init.c:20: const usb_device_type t = storage_device->type; ld l, e ld h, d @@ -75,7 +75,20 @@ l_chufi_init_00105: ;source-doc/ufi-drv/./ufi-init.c:22: if (t == USB_IS_FLOPPY) { dec a jr NZ,l_chufi_init_00106 -;source-doc/ufi-drv/./ufi-init.c:23: storage_device->drive_index = storage_count++; +;source-doc/ufi-drv/./ufi-init.c:23: print_string("\r\n FLOPPY @ $"); + push de + 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 + call _print_uint16 + ld hl,ufi_init_str_1 + call _print_string + pop de +;source-doc/ufi-drv/./ufi-init.c:26: storage_device->drive_index = storage_count++; ld hl,0x0010 add hl, de ld c, l @@ -86,40 +99,29 @@ l_chufi_init_00105: inc (hl) ld a,(ix-2) ld (bc), a -;source-doc/ufi-drv/./ufi-init.c:25: dio_add_entry(ch_ufi_fntbl, storage_device); +;source-doc/ufi-drv/./ufi-init.c:28: dio_add_entry(ch_ufi_fntbl, storage_device); ld hl,_ch_ufi_fntbl call _dio_add_entry l_chufi_init_00106: -;source-doc/ufi-drv/./ufi-init.c:28: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/ufi-drv/./ufi-init.c:31: } 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_00107: -;source-doc/ufi-drv/./ufi-init.c:30: if (storage_count == 0) - ld hl,_storage_count - ld a, (hl) - or a -;source-doc/ufi-drv/./ufi-init.c:31: return; - jr Z,l_chufi_init_00110 -;source-doc/ufi-drv/./ufi-init.c:33: print_device_mounted(" FLOPPY DRIVE$", storage_count); - ld a,(_storage_count) - push af - inc sp - ld hl,ufi_init_str_0 - push hl - call _print_device_mounted - pop af - inc sp -l_chufi_init_00110: -;source-doc/ufi-drv/./ufi-init.c:34: } +l_chufi_init_00108: +;source-doc/ufi-drv/./ufi-init.c:32: } ld sp, ix pop ix ret ufi_init_str_0: - DEFM " FLOPPY DRIVE$" + DEFB 0x0d + DEFB 0x0a + DEFM " FLOPPY @ $" + DEFB 0x00 +ufi_init_str_1: + DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/./ufi-init.c:36: uint32_t chufi_get_cap(device_config *const dev) { +;source-doc/ufi-drv/./ufi-init.c:34: uint32_t chufi_get_cap(device_config *const dev) { ; --------------------------------- ; Function chufi_get_cap ; --------------------------------- @@ -130,7 +132,7 @@ _chufi_get_cap: ld hl, -72 add hl, sp ld sp, hl -;source-doc/ufi-drv/./ufi-init.c:38: memset(&response, 0, sizeof(ufi_format_capacities_response)); +;source-doc/ufi-drv/./ufi-init.c:36: memset(&response, 0, sizeof(ufi_format_capacities_response)); ld hl,0 add hl, sp ld b,0x24 @@ -138,7 +140,7 @@ l_chufi_get_cap_00112: ld (hl),0x00 inc hl djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/./ufi-init.c:40: wait_for_device_ready(dev, 25); +;source-doc/ufi-drv/./ufi-init.c:38: wait_for_device_ready(dev, 25); ld a,0x19 push af inc sp @@ -148,7 +150,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/./ufi-init.c:44: ufi_inquiry(dev, &inquiry); +;source-doc/ufi-drv/./ufi-init.c:42: ufi_inquiry(dev, &inquiry); ld hl,36 add hl, sp push hl @@ -157,7 +159,7 @@ l_chufi_get_cap_00112: push hl call _ufi_inquiry pop af -;source-doc/ufi-drv/./ufi-init.c:46: wait_for_device_ready(dev, 15); +;source-doc/ufi-drv/./ufi-init.c:44: wait_for_device_ready(dev, 15); ld h,0x0f ex (sp),hl inc sp @@ -167,7 +169,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/./ufi-init.c:48: const usb_error result = ufi_read_frmt_caps(dev, &response); +;source-doc/ufi-drv/./ufi-init.c:46: const usb_error result = ufi_read_frmt_caps(dev, &response); ld hl,0 add hl, sp push hl @@ -178,27 +180,27 @@ l_chufi_get_cap_00112: pop af pop af ld a, l -;source-doc/ufi-drv/./ufi-init.c:49: if (result != USB_ERR_OK) +;source-doc/ufi-drv/./ufi-init.c:47: if (result != USB_ERR_OK) or a jr Z,l_chufi_get_cap_00102 -;source-doc/ufi-drv/./ufi-init.c:50: return 0; +;source-doc/ufi-drv/./ufi-init.c:48: 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:53: return convert_from_msb_first(response.descriptors[0].number_of_blocks); +;source-doc/ufi-drv/./ufi-init.c:50: 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:63: } +;source-doc/ufi-drv/./ufi-init.c:51: } ld sp, ix pop ix ret -;source-doc/ufi-drv/./ufi-init.c:65: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/./ufi-init.c:53: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_read ; --------------------------------- @@ -209,7 +211,7 @@ _chufi_read: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/./ufi-init.c:67: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/./ufi-init.c:55: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -225,18 +227,18 @@ _chufi_read: ld a, e or a jr Z,l_chufi_read_00102 -;source-doc/ufi-drv/./ufi-init.c:68: return -1; // Not READY! +;source-doc/ufi-drv/./ufi-init.c:56: return -1; // Not READY! ld l,0xff jr l_chufi_read_00109 l_chufi_read_00102: -;source-doc/ufi-drv/./ufi-init.c:73: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/./ufi-init.c:61: 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:75: 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:63: 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 @@ -269,11 +271,11 @@ l_chufi_read_00102: pop bc or a jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/./ufi-init.c:76: return -1; // general error +;source-doc/ufi-drv/./ufi-init.c:64: return -1; // general error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00104: -;source-doc/ufi-drv/./ufi-init.c:79: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/./ufi-init.c:67: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -283,7 +285,7 @@ l_chufi_read_00139: inc hl djnz l_chufi_read_00139 pop bc -;source-doc/ufi-drv/./ufi-init.c:81: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) +;source-doc/ufi-drv/./ufi-init.c:69: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) ld hl,2 add hl, sp push hl @@ -294,25 +296,143 @@ l_chufi_read_00139: ld a, l or a jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/./ufi-init.c:82: return -1; // error +;source-doc/ufi-drv/./ufi-init.c:70: return -1; // error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00106: -;source-doc/ufi-drv/./ufi-init.c:86: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/./ufi-init.c:74: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/./ufi-init.c:88: if (sense_key != 0) +;source-doc/ufi-drv/./ufi-init.c:76: if (sense_key != 0) and 0x0f jr Z,l_chufi_read_00108 -;source-doc/ufi-drv/./ufi-init.c:89: return -1; +;source-doc/ufi-drv/./ufi-init.c:77: return -1; ld l,0xff jr l_chufi_read_00109 l_chufi_read_00108: -;source-doc/ufi-drv/./ufi-init.c:91: return USB_ERR_OK; +;source-doc/ufi-drv/./ufi-init.c:79: return USB_ERR_OK; ld l,0x00 l_chufi_read_00109: -;source-doc/ufi-drv/./ufi-init.c:92: } +;source-doc/ufi-drv/./ufi-init.c:80: } + 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) { +; --------------------------------- +; Function chufi_write +; --------------------------------- +_chufi_write: + push ix + ld ix,0 + add ix,sp + ld hl, -20 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./ufi-init.c:84: if (wait_for_device_ready((device_config *)dev, 20) != 0) + ld c,(ix+4) + ld b,(ix+5) + push bc + ld a,0x14 + push af + inc sp + push bc + call _wait_for_device_ready + pop af + inc sp + ld e, l + pop bc + ld a, e + or a + jr Z,l_chufi_write_00102 +;source-doc/ufi-drv/./ufi-init.c:85: 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)); + 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) { + ld e,(ix+4) + ld d,(ix+5) + ld hl,12 + add hl, de + ld e, (hl) + inc hl + ld d, (hl) + push bc + ld hl,2 + add hl, sp + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld a,0x01 + push af + inc sp + push de + ld a,0x01 + push af + inc sp + push bc + call _ufi_read_write_sector + pop af + pop af + pop af + pop af + pop af + ld a, l + pop bc + or a + jr Z,l_chufi_write_00104 +;source-doc/ufi-drv/./ufi-init.c:91: 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)); + push bc + ld hl,4 + add hl, sp + ld b,0x12 +l_chufi_write_00139: + ld (hl),0x00 + 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) { + ld hl,2 + add hl, sp + push hl + push bc + call _ufi_request_sense + pop af + pop af + ld a, l + or a + jr Z,l_chufi_write_00106 +;source-doc/ufi-drv/./ufi-init.c:98: 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; + ld hl,4 + add hl, sp + ld a, (hl) +;source-doc/ufi-drv/./ufi-init.c:105: if (sense_key != 0) + and 0x0f + jr Z,l_chufi_write_00108 +;source-doc/ufi-drv/./ufi-init.c:106: 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; + ld l,0x00 +l_chufi_write_00109: +;source-doc/ufi-drv/./ufi-init.c:109: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm index 95e819e9..330db5a3 100644 --- a/Source/HBIOS/ch376ufi.asm +++ b/Source/HBIOS/ch376ufi.asm @@ -100,12 +100,37 @@ CH_UFI_READ: ld bc, 512 add hl, bc ret - +; +; ### Function 0x14 -- Disk Write (DIOWRITE) +; +; Inputs +; IY: device config pointer +; D: Buffer Bank ID +; E: Sector Count +; HL: Buffer Address +; +; Outputs +; A: Status +; E: Sectors Written +; +; Write Sector Count (E) sectors from the buffer located in Buffer Bank ID (D) +; at Buffer Address (HL) starting at the Current Sector. The returned +; Status (A) is a standard HBIOS result code. +; CH_UFI_WRITE: - EZ80_UTIL_DEBUG + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR - XOR A - RET + ; call scsi_write(IY, HL); + ; HL = HL + 512 + push hl + push iy + call _chufi_write + ld a, l + pop hl + pop iy + ld bc, 512 + add hl, bc + ret CH_UFI_VERIFY: CH_UFI_FORMAT: @@ -158,7 +183,7 @@ CH_UFI_FORMAT: ; | | 9=Cartridge, 10=usb-scsi, 11=usb-ufi | ; CH_UFI_DEVICE: - LD C, %01011011 + LD C, %11010110 LD D, DIODEV_USB LD E, (iy+16) LD H, 0