Browse Source

ch376-native: refactor: separating driver state and hbios state

pull/592/head
Dean Netherton 9 months ago
parent
commit
179abe7087
  1. 3
      .vscode/settings.json
  2. 1
      Source/HBIOS/ch376-native/base-drv.s
  3. 114
      Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s
  4. 118
      Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s
  5. 91
      Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s
  6. 11
      Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c
  7. 16
      Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h
  8. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h
  9. 8
      Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c
  10. 2
      Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h
  11. 10
      Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c
  12. 10
      Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c
  13. 165
      Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s
  14. 53
      Source/HBIOS/ch376scsi.asm
  15. 47
      Source/HBIOS/ch376ufi.asm

3
.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"
}
}

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

114
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

118
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

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

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

16
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

2
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

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

2
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

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

@ -7,6 +7,7 @@
#include <usb-base-drv.h>
#include <work-area.h>
#include <z80.h>
#include "hbios-driver-storage.h"
extern const uint16_t const ch_scsi_fntbl[];
@ -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);

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

@ -5,6 +5,7 @@
#include <string.h>
#include <usb-base-drv.h>
#include <work-area.h>
#include "hbios-driver-storage.h"
extern const uint16_t const ch_ufi_fntbl[];
@ -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);

165
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

53
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

47
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

Loading…
Cancel
Save