Browse Source

ch376-native: general fixes - mass storage and floppy devices over hub seem to be working

pull/592/head
Dean Netherton 1 year ago
parent
commit
b4421a0532
  1. 7
      Source/HBIOS/ch376-native/print.asm
  2. 50
      Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s
  3. 4
      Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c
  4. 9
      Source/HBIOS/ch376-native/source-doc/base-drv/print.c
  5. 1
      Source/HBIOS/ch376-native/source-doc/base-drv/print.h
  6. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c
  7. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c
  8. 9
      Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c
  9. 2
      Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c
  10. 47
      Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c
  11. 214
      Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s
  12. 35
      Source/HBIOS/ch376ufi.asm

7
Source/HBIOS/ch376-native/print.asm

@ -2,6 +2,9 @@
; HL = unsigned 16 bit number to write out ; HL = unsigned 16 bit number to write out
; call CHPUT to write a single ascii character (in A) ; call CHPUT to write a single ascii character (in A)
_print_uint16: _print_uint16:
ld a, h
or l
jr z, print_zero
ld e, 0 ld e, 0
ld bc, -10000 ld bc, -10000
call num1 call num1
@ -30,3 +33,7 @@ num2: inc a
num3: num3:
ld e, 1 ld e, 1
jp COUT jp COUT
print_zero
ld a, '0'
jp COUT

50
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) ;source-doc/scsi-drv/./scsi-init.c:18: if (storage_device == NULL)
ld a, d ld a, d
or e 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; ;source-doc/scsi-drv/./scsi-init.c:21: const usb_device_type t = storage_device->type;
ld l, e ld l, e
ld h, d 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) { ;source-doc/scsi-drv/./scsi-init.c:23: 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: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 ld hl,0x0010
add hl, de add hl, de
ld c, l ld c, l
@ -86,42 +99,31 @@ l_chscsi_init_00105:
inc (hl) inc (hl)
ld a,(ix-2) ld a,(ix-2)
ld (bc), a 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
push de push de
call _scsi_sense_init call _scsi_sense_init
pop af pop af
pop de 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 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: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) inc (ix-1)
ld a,(ix-1) ld a,(ix-1)
sub 0x07 sub 0x07
jr NZ,l_chscsi_init_00105 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 ld sp, ix
pop ix pop ix
ret ret
scsi_init_str_0: scsi_init_str_0:
DEFM " STORAGE DEVICE$"
DEFB 0x0d
DEFB 0x0a
DEFM " MASS STORAGE @ $"
DEFB 0x00
scsi_init_str_1:
DEFM " $"
DEFB 0x00 DEFB 0x00

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

@ -1,7 +1,7 @@
#include "ch376.h" #include "ch376.h"
#include "print.h"
#include "ez80-helpers.h" #include "ez80-helpers.h"
#include "print.h"
usb_error result = 0; usb_error result = 0;
@ -41,7 +41,7 @@ usb_error ch_get_status(void) {
delay(); delay();
delay(); delay();
uint8_t ch_status = CH376_DATA_PORT; uint8_t ch_status = CH376_DATA_PORT;
if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX)
return ch_status; return ch_status;

9
Source/HBIOS/ch376-native/source-doc/base-drv/print.c

@ -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$");
}

1
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_hex(const char c) __z88dk_fastcall;
extern void print_string(const char *p) __z88dk_fastcall; extern void print_string(const char *p) __z88dk_fastcall;
extern void print_uint16(const uint16_t n) __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 #endif

2
Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c

@ -15,8 +15,8 @@
#include "delay.h" #include "delay.h"
#include <stdlib.h> #include <stdlib.h>
#include "print.h"
#include "ez80-helpers.h" #include "ez80-helpers.h"
#include "print.h"
const setup_packet cmd_get_device_descriptor = {0x80, 6, {0, 1}, {0, 0}, 8}; const setup_packet cmd_get_device_descriptor = {0x80, 6, {0, 1}, {0, 0}, 8};

2
Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c

@ -16,8 +16,8 @@
#include "z80.h" #include "z80.h"
#include <stdlib.h> #include <stdlib.h>
#include "print.h"
#include "ez80-helpers.h" #include "ez80-helpers.h"
#include "print.h"
#define LOWER_SAFE_RAM_ADDRESS 0x8000 #define LOWER_SAFE_RAM_ADDRESS 0x8000

9
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; const usb_device_type t = storage_device->type;
if (t == USB_IS_MASS_STORAGE) { if (t == USB_IS_MASS_STORAGE) {
print_string("\r\n MASS STORAGE @ $");
print_uint16(index);
print_string(" $");
storage_device->drive_index = storage_count++; storage_device->drive_index = storage_count++;
scsi_sense_init(storage_device); scsi_sense_init(storage_device);
dio_add_entry(ch_scsi_fntbl, storage_device); dio_add_entry(ch_scsi_fntbl, storage_device);
} }
} while (++index != MAX_NUMBER_OF_DEVICES + 1); } while (++index != MAX_NUMBER_OF_DEVICES + 1);
if (storage_count == 0)
return;
print_device_mounted(" STORAGE DEVICE$", storage_count);
} }

2
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 bool send,
const uint16_t sector_number, const uint16_t sector_number,
const uint8_t sector_count, const uint8_t sector_count,
const uint8_t *const buffer,
uint8_t *const buffer,
uint8_t *const sense_codes) { uint8_t *const sense_codes) {
ufi_read_write_command cmd; ufi_read_write_command cmd;
memset(&cmd, 0, sizeof(cmd)); memset(&cmd, 0, sizeof(cmd));

47
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; const usb_device_type t = storage_device->type;
if (t == USB_IS_FLOPPY) { if (t == USB_IS_FLOPPY) {
print_string("\r\n FLOPPY @ $");
print_uint16(index);
print_string(" $");
storage_device->drive_index = storage_count++; storage_device->drive_index = storage_count++;
// scsi_sense_init(storage_device); // scsi_sense_init(storage_device);
dio_add_entry(ch_ufi_fntbl, storage_device); dio_add_entry(ch_ufi_fntbl, storage_device);
} }
} while (++index != MAX_NUMBER_OF_DEVICES + 1); } 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) { 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) if (result != USB_ERR_OK)
return 0; 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); 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) { 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; 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;
}

214
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) ;source-doc/ufi-drv/./ufi-init.c:17: if (storage_device == NULL)
ld a, d ld a, d
or e 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; ;source-doc/ufi-drv/./ufi-init.c:20: const usb_device_type t = storage_device->type;
ld l, e ld l, e
ld h, d ld h, d
@ -75,7 +75,20 @@ l_chufi_init_00105:
;source-doc/ufi-drv/./ufi-init.c:22: if (t == USB_IS_FLOPPY) { ;source-doc/ufi-drv/./ufi-init.c:22: 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: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 ld hl,0x0010
add hl, de add hl, de
ld c, l ld c, l
@ -86,40 +99,29 @@ l_chufi_init_00105:
inc (hl) inc (hl)
ld a,(ix-2) ld a,(ix-2)
ld (bc), a 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 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: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) 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_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 ld sp, ix
pop ix pop ix
ret ret
ufi_init_str_0: ufi_init_str_0:
DEFM " FLOPPY DRIVE$"
DEFB 0x0d
DEFB 0x0a
DEFM " FLOPPY @ $"
DEFB 0x00
ufi_init_str_1:
DEFM " $"
DEFB 0x00 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 ; Function chufi_get_cap
; --------------------------------- ; ---------------------------------
@ -130,7 +132,7 @@ _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: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 ld hl,0
add hl, sp add hl, sp
ld b,0x24 ld b,0x24
@ -138,7 +140,7 @@ l_chufi_get_cap_00112:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_chufi_get_cap_00112 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 ld a,0x19
push af push af
inc sp inc sp
@ -148,7 +150,7 @@ l_chufi_get_cap_00112:
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:44: ufi_inquiry(dev, &inquiry);
;source-doc/ufi-drv/./ufi-init.c:42: ufi_inquiry(dev, &inquiry);
ld hl,36 ld hl,36
add hl, sp add hl, sp
push hl push hl
@ -157,7 +159,7 @@ l_chufi_get_cap_00112:
push hl push hl
call _ufi_inquiry call _ufi_inquiry
pop af 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 ld h,0x0f
ex (sp),hl ex (sp),hl
inc sp inc sp
@ -167,7 +169,7 @@ l_chufi_get_cap_00112:
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: 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 ld hl,0
add hl, sp add hl, sp
push hl push hl
@ -178,27 +180,27 @@ l_chufi_get_cap_00112:
pop af pop af
pop af pop af
ld a, l 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 or a
jr Z,l_chufi_get_cap_00102 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 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: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 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:63: }
;source-doc/ufi-drv/./ufi-init.c:51: }
ld sp, ix ld sp, ix
pop ix pop ix
ret 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 ; Function chufi_read
; --------------------------------- ; ---------------------------------
@ -209,7 +211,7 @@ _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: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 c,(ix+4)
ld b,(ix+5) ld b,(ix+5)
push bc push bc
@ -225,18 +227,18 @@ _chufi_read:
ld a, e ld a, e
or a or a
jr Z,l_chufi_read_00102 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 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: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 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: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 e,(ix+4)
ld d,(ix+5) ld d,(ix+5)
ld hl,12 ld hl,12
@ -269,11 +271,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:76: return -1; // general error
;source-doc/ufi-drv/./ufi-init.c:64: 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:79: memset(&response, 0, sizeof(response));
;source-doc/ufi-drv/./ufi-init.c:67: memset(&response, 0, sizeof(response));
push bc push bc
ld hl,4 ld hl,4
add hl, sp add hl, sp
@ -283,7 +285,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: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 ld hl,2
add hl, sp add hl, sp
push hl push hl
@ -294,25 +296,143 @@ 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:82: return -1; // error
;source-doc/ufi-drv/./ufi-init.c:70: 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: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 ld hl,4
add hl, sp add hl, sp
ld a, (hl) 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 and 0x0f
jr Z,l_chufi_read_00108 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 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:91: return USB_ERR_OK;
;source-doc/ufi-drv/./ufi-init.c:79: 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: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 ld sp, ix
pop ix pop ix
ret ret

35
Source/HBIOS/ch376ufi.asm

@ -100,12 +100,37 @@ CH_UFI_READ:
ld bc, 512 ld bc, 512
add hl, bc add hl, bc
ret 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: 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_VERIFY:
CH_UFI_FORMAT: CH_UFI_FORMAT:
@ -158,7 +183,7 @@ CH_UFI_FORMAT:
; | | 9=Cartridge, 10=usb-scsi, 11=usb-ufi | ; | | 9=Cartridge, 10=usb-scsi, 11=usb-ufi |
; ;
CH_UFI_DEVICE: CH_UFI_DEVICE:
LD C, %01011011
LD C, %11010110
LD D, DIODEV_USB LD D, DIODEV_USB
LD E, (iy+16) LD E, (iy+16)
LD H, 0 LD H, 0

Loading…
Cancel
Save