Browse Source

ch376-native: fixed issue with firmware delegation version (CHNATIVEEZ80) intermittenly failing

pull/592/head
Dean Netherton 9 months ago
parent
commit
53d2f3f57b
  1. 7
      .vscode/settings.json
  2. 158
      Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s
  3. 7
      Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c
  4. 24
      Source/HBIOS/ez80cpudrv.asm

7
.vscode/settings.json

@ -1,4 +1,11 @@
{ {
"z80-macroasm.format.enabled": true,
"z80-macroasm.format.baseIndent": 1,
"z80-macroasm.format.whitespaceAfterInstruction": "tab",
"z80-macroasm.format.uppercaseKeywords": true,
"z80-macroasm.format.spaceAfterArgument": true,
"z80-macroasm.format.hexaNumberStyle": "motorola",
"z80-macroasm.format.hexaNumberCase": true,
"files.trimTrailingWhitespace": false, "files.trimTrailingWhitespace": false,
"files.eol": "\r\n", "files.eol": "\r\n",
"files.associations": { "files.associations": {

158
Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s

@ -37,10 +37,6 @@ _scsi_command_block_wrapper:
DEFS 15 DEFS 15
_next_tag: _next_tag:
DEFS 2 DEFS 2
_csw:
DEFS 13
_scsi_packet_request_sense:
DEFS 12
#ENDIF #ENDIF
@ -56,7 +52,7 @@ _scsi_packet_request_sense:
;-------------------------------------------------------- ;--------------------------------------------------------
; code ; code
;-------------------------------------------------------- ;--------------------------------------------------------
;source-doc/scsi-drv/class_scsi.c:13: usb_error do_scsi_cmd(device_config_storage *const dev,
;source-doc/scsi-drv/class_scsi.c:11: usb_error do_scsi_cmd(device_config_storage *const dev,
; --------------------------------- ; ---------------------------------
; Function do_scsi_cmd ; Function do_scsi_cmd
; --------------------------------- ; ---------------------------------
@ -64,15 +60,34 @@ _do_scsi_cmd:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
ld hl, -8
ld hl, -21
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/scsi-drv/class_scsi.c:20: cbw->dCBWTag[0] = next_tag++;
;source-doc/scsi-drv/class_scsi.c:17: _scsi_command_status_wrapper csw = {{{0}}};
ld a,0x00
ld (ix-21),a
ld (ix-20),a
ld (ix-19),a
ld (ix-18),a
xor a
ld (ix-17),a
ld (ix-16),a
xor a
ld (ix-15),a
ld (ix-14),a
ld a,0x00
ld (ix-13),a
ld (ix-12),a
ld (ix-11),a
ld (ix-10),a
ld (ix-9),0x00
;source-doc/scsi-drv/class_scsi.c:19: cbw->dCBWTag[0] = next_tag++;
ld c,(ix+6) ld c,(ix+6)
ld b,(ix+7) ld b,(ix+7)
ld hl,0x0004 ld hl,0x0004
add hl, bc add hl, bc
ex (sp), hl
ld (ix-8),l
ld (ix-7),h
ld a, (_next_tag) ld a, (_next_tag)
ld e, a ld e, a
ld hl,_next_tag + 1 ld hl,_next_tag + 1
@ -80,24 +95,24 @@ _do_scsi_cmd:
ld hl, (_next_tag) ld hl, (_next_tag)
inc hl inc hl
ld (_next_tag), hl ld (_next_tag), hl
pop hl
push hl
ld l,(ix-8)
ld h,(ix-7)
ld (hl), e ld (hl), e
inc hl inc hl
ld (hl), d ld (hl), d
;source-doc/scsi-drv/class_scsi.c:22: if (!send)
;source-doc/scsi-drv/class_scsi.c:21: if (!send)
bit 0,(ix+10) bit 0,(ix+10)
jr NZ,l_do_scsi_cmd_00102 jr NZ,l_do_scsi_cmd_00102
;source-doc/scsi-drv/class_scsi.c:23: cbw->bmCBWFlags = 0x80;
;source-doc/scsi-drv/class_scsi.c:22: cbw->bmCBWFlags = 0x80;
ld hl,0x000c ld hl,0x000c
add hl, bc add hl, bc
ld (hl),0x80 ld (hl),0x80
l_do_scsi_cmd_00102: l_do_scsi_cmd_00102:
;source-doc/scsi-drv/class_scsi.c:25: critical_begin();
;source-doc/scsi-drv/class_scsi.c:24: critical_begin();
push bc push bc
call _critical_begin call _critical_begin
pop bc pop bc
;source-doc/scsi-drv/class_scsi.c:28: &dev->endpoints[ENDPOINT_BULK_OUT]));
;source-doc/scsi-drv/class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_OUT]));
ld a,(ix+4) ld a,(ix+4)
ld (ix-6),a ld (ix-6),a
ld e, a ld e, a
@ -140,7 +155,7 @@ l_do_scsi_cmd_00102:
ld a, l ld a, l
or a or a
jp NZ, l_do_scsi_cmd_00120 jp NZ, l_do_scsi_cmd_00120
;source-doc/scsi-drv/class_scsi.c:30: if (cbw->dCBWDataTransferLength != 0) {
;source-doc/scsi-drv/class_scsi.c:29: if (cbw->dCBWDataTransferLength != 0) {
ld hl,8 ld hl,8
add hl, bc add hl, bc
ld c, (hl) ld c, (hl)
@ -155,15 +170,15 @@ l_do_scsi_cmd_00102:
or b or b
or c or c
jr Z,l_do_scsi_cmd_00113 jr Z,l_do_scsi_cmd_00113
;source-doc/scsi-drv/class_scsi.c:33: &dev->endpoints[ENDPOINT_BULK_IN]));
;source-doc/scsi-drv/class_scsi.c:32: &dev->endpoints[ENDPOINT_BULK_IN]));
ld (ix-2),c ld (ix-2),c
ld (ix-1),b ld (ix-1),b
ld c,(ix+8) ld c,(ix+8)
ld b,(ix+9) ld b,(ix+9)
;source-doc/scsi-drv/class_scsi.c:31: if (!send) {
;source-doc/scsi-drv/class_scsi.c:30: if (!send) {
bit 0,(ix+10) bit 0,(ix+10)
jr NZ,l_do_scsi_cmd_00110 jr NZ,l_do_scsi_cmd_00110
;source-doc/scsi-drv/class_scsi.c:33: &dev->endpoints[ENDPOINT_BULK_IN]));
;source-doc/scsi-drv/class_scsi.c:32: &dev->endpoints[ENDPOINT_BULK_IN]));
ld a,(ix-6) ld a,(ix-6)
add a,0x06 add a,0x06
ld e, a ld e, a
@ -195,7 +210,7 @@ l_do_scsi_cmd_00102:
jr Z,l_do_scsi_cmd_00113 jr Z,l_do_scsi_cmd_00113
jr l_do_scsi_cmd_00120 jr l_do_scsi_cmd_00120
l_do_scsi_cmd_00110: l_do_scsi_cmd_00110:
;source-doc/scsi-drv/class_scsi.c:37: &dev->endpoints[ENDPOINT_BULK_OUT]));
;source-doc/scsi-drv/class_scsi.c:36: &dev->endpoints[ENDPOINT_BULK_OUT]));
ld l,(ix-4) ld l,(ix-4)
ld h,(ix-3) ld h,(ix-3)
ld a, (hl) ld a, (hl)
@ -220,7 +235,7 @@ l_do_scsi_cmd_00110:
or a or a
jr NZ,l_do_scsi_cmd_00120 jr NZ,l_do_scsi_cmd_00120
l_do_scsi_cmd_00113: l_do_scsi_cmd_00113:
;source-doc/scsi-drv/class_scsi.c:42: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN]));
;source-doc/scsi-drv/class_scsi.c:41: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN]));
ld a,(ix-6) ld a,(ix-6)
add a,0x06 add a,0x06
ld c, a ld c, a
@ -241,7 +256,8 @@ l_do_scsi_cmd_00113:
inc sp inc sp
ld hl,0x000d ld hl,0x000d
push hl push hl
ld hl,_csw
ld hl,5
add hl, sp
push hl push hl
call _usb_data_in_transfer call _usb_data_in_transfer
pop af pop af
@ -251,38 +267,40 @@ l_do_scsi_cmd_00113:
ld a, l ld a, l
or a or a
jr NZ,l_do_scsi_cmd_00120 jr NZ,l_do_scsi_cmd_00120
;source-doc/scsi-drv/class_scsi.c:44: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0])
ld a, (_csw + 12)
;source-doc/scsi-drv/class_scsi.c:43: if (csw.bCSWStatus != 0 || csw.dCSWTag[0] != cbw->dCBWTag[0])
ld a,(ix-9)
or a or a
jr Z,l_do_scsi_cmd_00117
ld bc, (_csw + 4)
pop hl
ld a,(hl)
push hl
jr NZ,l_do_scsi_cmd_00116
ld c,(ix-17)
ld b,(ix-16)
ld l,(ix-8)
ld h,(ix-7)
ld a, (hl)
inc hl inc hl
ld h, (hl) ld h, (hl)
ld l, a ld l, a
xor a xor a
sbc hl,bc sbc hl,bc
jr Z,l_do_scsi_cmd_00117 jr Z,l_do_scsi_cmd_00117
;source-doc/scsi-drv/class_scsi.c:45: result = USB_ERR_FAIL;
l_do_scsi_cmd_00116:
;source-doc/scsi-drv/class_scsi.c:44: result = USB_ERR_FAIL;
ld l,0x0e ld l,0x0e
jr l_do_scsi_cmd_00120 jr l_do_scsi_cmd_00120
l_do_scsi_cmd_00117: l_do_scsi_cmd_00117:
;source-doc/scsi-drv/class_scsi.c:47: result = USB_ERR_OK;
;source-doc/scsi-drv/class_scsi.c:46: result = USB_ERR_OK;
ld l,0x00 ld l,0x00
;source-doc/scsi-drv/class_scsi.c:49: done:
;source-doc/scsi-drv/class_scsi.c:48: done:
l_do_scsi_cmd_00120: l_do_scsi_cmd_00120:
;source-doc/scsi-drv/class_scsi.c:50: critical_end();
;source-doc/scsi-drv/class_scsi.c:49: critical_end();
push hl push hl
call _critical_end call _critical_end
pop hl pop hl
;source-doc/scsi-drv/class_scsi.c:51: return result;
;source-doc/scsi-drv/class_scsi.c:52: }
;source-doc/scsi-drv/class_scsi.c:50: return result;
;source-doc/scsi-drv/class_scsi.c:51: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/scsi-drv/class_scsi.c:54: usb_error scsi_test(device_config_storage *const dev) {
;source-doc/scsi-drv/class_scsi.c:53: usb_error scsi_test(device_config_storage *const dev) {
; --------------------------------- ; ---------------------------------
; Function scsi_test ; Function scsi_test
; --------------------------------- ; ---------------------------------
@ -293,7 +311,7 @@ _scsi_test:
ld hl, -27 ld hl, -27
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/scsi-drv/class_scsi.c:56: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/class_scsi.c:55: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ld e,l ld e,l
@ -302,7 +320,7 @@ _scsi_test:
ld bc,0x000f ld bc,0x000f
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ldir ldir
;source-doc/scsi-drv/class_scsi.c:57: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test));
;source-doc/scsi-drv/class_scsi.c:56: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test));
ld hl,17 ld hl,17
add hl, sp add hl, sp
ld b,0x06 ld b,0x06
@ -314,11 +332,11 @@ l_scsi_test_00103:
inc hl inc hl
djnz l_scsi_test_00103 djnz l_scsi_test_00103
pop bc pop bc
;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-14),0x00 ld (ix-14),0x00
;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test);
;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test);
ld (ix-13),0x0c ld (ix-13),0x0c
;source-doc/scsi-drv/class_scsi.c:61: cbw_scsi.cbw.dCBWDataTransferLength = 0;
;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.dCBWDataTransferLength = 0;
ld hl,0x0008 ld hl,0x0008
add hl, bc add hl, bc
xor a xor a
@ -329,7 +347,7 @@ l_scsi_test_00103:
ld (hl), a ld (hl), a
inc hl inc hl
ld (hl), a ld (hl), a
;source-doc/scsi-drv/class_scsi.c:63: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false);
;source-doc/scsi-drv/class_scsi.c:62: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false);
xor a xor a
push af push af
inc sp inc sp
@ -340,11 +358,11 @@ l_scsi_test_00103:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _do_scsi_cmd call _do_scsi_cmd
;source-doc/scsi-drv/class_scsi.c:64: }
;source-doc/scsi-drv/class_scsi.c:63: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
;source-doc/scsi-drv/class_scsi.c:68: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) {
;source-doc/scsi-drv/class_scsi.c:67: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) {
; --------------------------------- ; ---------------------------------
; Function scsi_request_sense ; Function scsi_request_sense
; --------------------------------- ; ---------------------------------
@ -355,7 +373,7 @@ _scsi_request_sense:
ld hl, -27 ld hl, -27
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/class_scsi.c:69: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ld e,l ld e,l
@ -364,7 +382,7 @@ _scsi_request_sense:
ld bc,0x000f ld bc,0x000f
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ldir ldir
;source-doc/scsi-drv/class_scsi.c:71: cbw_scsi.request_sense = scsi_packet_request_sense;
;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.request_sense = scsi_packet_request_sense;
ld hl,17 ld hl,17
add hl, sp add hl, sp
ex de, hl ex de, hl
@ -372,11 +390,11 @@ _scsi_request_sense:
ld hl,_scsi_packet_request_sense ld hl,_scsi_packet_request_sense
ldir ldir
pop bc pop bc
;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/class_scsi.c:72: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-14),0x00 ld (ix-14),0x00
;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense);
;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense);
ld (ix-13),0x0c ld (ix-13),0x0c
;source-doc/scsi-drv/class_scsi.c:75: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result);
;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result);
ld hl,0x0008 ld hl,0x0008
add hl, bc add hl, bc
ld (hl),0x12 ld (hl),0x12
@ -387,7 +405,7 @@ _scsi_request_sense:
ld (hl), a ld (hl), a
inc hl inc hl
ld (hl), a ld (hl), a
;source-doc/scsi-drv/class_scsi.c:77: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false);
;source-doc/scsi-drv/class_scsi.c:76: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false);
ld e,(ix+6) ld e,(ix+6)
ld d,(ix+7) ld d,(ix+7)
xor a xor a
@ -399,37 +417,10 @@ _scsi_request_sense:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _do_scsi_cmd call _do_scsi_cmd
;source-doc/scsi-drv/class_scsi.c:78: }
;source-doc/scsi-drv/class_scsi.c:77: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
_scsi_command_block_wrapper:
DEFB +0x55
DEFB +0x53
DEFB +0x42
DEFB +0x43
DEFW +0x0000
DEFW +0x0000
DEFB +0x00,0x00, +0x00, +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
_next_tag:
DEFW +0x0000
_csw:
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
_scsi_packet_request_sense: _scsi_packet_request_sense:
DEFB +0x03 DEFB +0x03
DEFB +0x00 DEFB +0x00
@ -443,3 +434,16 @@ _scsi_packet_request_sense:
DEFB +0x00 DEFB +0x00
DEFB +0x00 DEFB +0x00
DEFB +0x00 DEFB +0x00
_scsi_command_block_wrapper:
DEFB +0x55
DEFB +0x53
DEFB +0x42
DEFB +0x43
DEFW +0x0000
DEFW +0x0000
DEFB +0x00,0x00, +0x00, +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
_next_tag:
DEFW +0x0000

7
Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c

@ -8,14 +8,13 @@ _scsi_command_block_wrapper scsi_command_block_wrapper = {{0x55, 0x53, 0x42, 0x4
uint16_t next_tag = 0; uint16_t next_tag = 0;
_scsi_command_status_wrapper csw = {{{0}}};
usb_error do_scsi_cmd(device_config_storage *const dev, usb_error do_scsi_cmd(device_config_storage *const dev,
_scsi_command_block_wrapper *const cbw, _scsi_command_block_wrapper *const cbw,
void *const send_receive_buffer, void *const send_receive_buffer,
const bool send) { const bool send) {
usb_error result; usb_error result;
_scsi_command_status_wrapper csw = {{{0}}};
cbw->dCBWTag[0] = next_tag++; cbw->dCBWTag[0] = next_tag++;
@ -41,7 +40,7 @@ usb_error do_scsi_cmd(device_config_storage *const dev,
CHECK( CHECK(
usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN]));
if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0])
if (csw.bCSWStatus != 0 || csw.dCSWTag[0] != cbw->dCBWTag[0])
result = USB_ERR_FAIL; result = USB_ERR_FAIL;
else else
result = USB_ERR_OK; result = USB_ERR_OK;
@ -63,7 +62,7 @@ usb_error scsi_test(device_config_storage *const dev) {
return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false);
} }
_scsi_packet_request_sense scsi_packet_request_sense = {0x03, 0, 0, 0, 18, 0, {0, 0, 0, 0, 0, 0}};
const _scsi_packet_request_sense scsi_packet_request_sense = {0x03, 0, 0, 0, 18, 0, {0, 0, 0, 0, 0, 0}};
usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) {
cbw_scsi_request_sense cbw_scsi; cbw_scsi_request_sense cbw_scsi;

24
Source/HBIOS/ez80cpudrv.asm

@ -342,24 +342,20 @@ _EZ80_CPY_UHL_TO_EHL:
; set the upper byte (u of DE) to MB. ; set the upper byte (u of DE) to MB.
_EZ80_EXTN_DE_TO_MB_DE: _EZ80_EXTN_DE_TO_MB_DE:
PUSH IY
.DB $5B, $FD, $21, $00, $00, $00 ; LD.LIL IY, 0
.DB $49, $D5 ; PUSH.L DE
.DB $5B, $FD, $21, $00, $00, $00 ; LD.LIL IY, 0
.DB $49, $FD, $39 ; ADD.L IY, SP .DB $49, $FD, $39 ; ADD.L IY, SP
.DB $49, $FD, $1F, $FD ; LD.L (IY-3), DE
.DB $ED, $6E ; LD A, MB
.DB $49, $FD, $77, $FF ; LD.L (IY-1), A
.DB $49, $FD, $17, $FD ; LD.L DE, (IY-3)
POP IY
.DB $ED, $6E ; LD A, MB
.DB $5B, $FD, $77, $02 ; LD.LIL (IY+2), A
.DB $49, $D1 ; POP.L DE
RET RET
; set the upper byte (u of IY) to MB. ; set the upper byte (u of IY) to MB.
_EZ80_EXTN_IY_TO_MB_IY: _EZ80_EXTN_IY_TO_MB_IY:
PUSH IX
.DB $5B, $DD, $21, $00, $00, $00 ; LD.LIL IX, 0
.DB $49, $DD, $39 ; ADD.L IX, SP
.DB $49, $DD, $3E, $FD ; LD.L (IX-3), IY
.DB $49, $FD, $E5 ; PUSH.L IY
.DB $5B, $FD, $21, $00, $00, $00 ; LD.LIL IY, 0
.DB $49, $FD, $39 ; ADD.L IY, SP
.DB $ED, $6E ; LD A, MB .DB $ED, $6E ; LD A, MB
.DB $49, $DD, $77, $FF ; LD.L (IX-1), A
.DB $49, $DD, $31, $FD ; LD.L IY, (IX-3)
POP IX
.DB $5B, $FD, $77, $02 ; LD.LIL (IY+2), A
.DB $49, $FD, $E1 ; POP.L IY
RET RET

Loading…
Cancel
Save