|
|
|
@ -37,10 +37,6 @@ _scsi_command_block_wrapper: |
|
|
|
DEFS 15 |
|
|
|
_next_tag: |
|
|
|
DEFS 2 |
|
|
|
_csw: |
|
|
|
DEFS 13 |
|
|
|
_scsi_packet_request_sense: |
|
|
|
DEFS 12 |
|
|
|
|
|
|
|
#ENDIF |
|
|
|
|
|
|
|
@ -56,7 +52,7 @@ _scsi_packet_request_sense: |
|
|
|
;-------------------------------------------------------- |
|
|
|
; 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 |
|
|
|
; --------------------------------- |
|
|
|
@ -64,15 +60,34 @@ _do_scsi_cmd: |
|
|
|
push ix |
|
|
|
ld ix,0 |
|
|
|
add ix,sp |
|
|
|
ld hl, -8 |
|
|
|
ld hl, -21 |
|
|
|
add hl, sp |
|
|
|
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 b,(ix+7) |
|
|
|
ld hl,0x0004 |
|
|
|
add hl, bc |
|
|
|
ex (sp), hl |
|
|
|
ld (ix-8),l |
|
|
|
ld (ix-7),h |
|
|
|
ld a, (_next_tag) |
|
|
|
ld e, a |
|
|
|
ld hl,_next_tag + 1 |
|
|
|
@ -80,24 +95,24 @@ _do_scsi_cmd: |
|
|
|
ld hl, (_next_tag) |
|
|
|
inc hl |
|
|
|
ld (_next_tag), hl |
|
|
|
pop hl |
|
|
|
push hl |
|
|
|
ld l,(ix-8) |
|
|
|
ld h,(ix-7) |
|
|
|
ld (hl), e |
|
|
|
inc hl |
|
|
|
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) |
|
|
|
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 |
|
|
|
add hl, bc |
|
|
|
ld (hl),0x80 |
|
|
|
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 |
|
|
|
call _critical_begin |
|
|
|
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 (ix-6),a |
|
|
|
ld e, a |
|
|
|
@ -140,7 +155,7 @@ l_do_scsi_cmd_00102: |
|
|
|
ld a, l |
|
|
|
or a |
|
|
|
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 |
|
|
|
add hl, bc |
|
|
|
ld c, (hl) |
|
|
|
@ -155,15 +170,15 @@ l_do_scsi_cmd_00102: |
|
|
|
or b |
|
|
|
or c |
|
|
|
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-1),b |
|
|
|
ld c,(ix+8) |
|
|
|
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) |
|
|
|
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) |
|
|
|
add a,0x06 |
|
|
|
ld e, a |
|
|
|
@ -195,7 +210,7 @@ l_do_scsi_cmd_00102: |
|
|
|
jr Z,l_do_scsi_cmd_00113 |
|
|
|
jr l_do_scsi_cmd_00120 |
|
|
|
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 h,(ix-3) |
|
|
|
ld a, (hl) |
|
|
|
@ -220,7 +235,7 @@ l_do_scsi_cmd_00110: |
|
|
|
or a |
|
|
|
jr NZ,l_do_scsi_cmd_00120 |
|
|
|
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) |
|
|
|
add a,0x06 |
|
|
|
ld c, a |
|
|
|
@ -241,7 +256,8 @@ l_do_scsi_cmd_00113: |
|
|
|
inc sp |
|
|
|
ld hl,0x000d |
|
|
|
push hl |
|
|
|
ld hl,_csw |
|
|
|
ld hl,5 |
|
|
|
add hl, sp |
|
|
|
push hl |
|
|
|
call _usb_data_in_transfer |
|
|
|
pop af |
|
|
|
@ -251,38 +267,40 @@ l_do_scsi_cmd_00113: |
|
|
|
ld a, l |
|
|
|
or a |
|
|
|
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 |
|
|
|
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 |
|
|
|
ld h, (hl) |
|
|
|
ld l, a |
|
|
|
xor a |
|
|
|
sbc hl,bc |
|
|
|
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 |
|
|
|
jr l_do_scsi_cmd_00120 |
|
|
|
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 |
|
|
|
;source-doc/scsi-drv/class_scsi.c:49: done: |
|
|
|
;source-doc/scsi-drv/class_scsi.c:48: done: |
|
|
|
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 |
|
|
|
call _critical_end |
|
|
|
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 |
|
|
|
pop ix |
|
|
|
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 |
|
|
|
; --------------------------------- |
|
|
|
@ -293,7 +311,7 @@ _scsi_test: |
|
|
|
ld hl, -27 |
|
|
|
add hl, sp |
|
|
|
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 |
|
|
|
add hl, sp |
|
|
|
ld e,l |
|
|
|
@ -302,7 +320,7 @@ _scsi_test: |
|
|
|
ld bc,0x000f |
|
|
|
ld hl,_scsi_command_block_wrapper |
|
|
|
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 |
|
|
|
add hl, sp |
|
|
|
ld b,0x06 |
|
|
|
@ -314,11 +332,11 @@ l_scsi_test_00103: |
|
|
|
inc hl |
|
|
|
djnz l_scsi_test_00103 |
|
|
|
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 |
|
|
|
;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 |
|
|
|
;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 |
|
|
|
add hl, bc |
|
|
|
xor a |
|
|
|
@ -329,7 +347,7 @@ l_scsi_test_00103: |
|
|
|
ld (hl), a |
|
|
|
inc hl |
|
|
|
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 |
|
|
|
push af |
|
|
|
inc sp |
|
|
|
@ -340,11 +358,11 @@ l_scsi_test_00103: |
|
|
|
ld h,(ix+5) |
|
|
|
push hl |
|
|
|
call _do_scsi_cmd |
|
|
|
;source-doc/scsi-drv/class_scsi.c:64: } |
|
|
|
;source-doc/scsi-drv/class_scsi.c:63: } |
|
|
|
ld sp,ix |
|
|
|
pop ix |
|
|
|
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 |
|
|
|
; --------------------------------- |
|
|
|
@ -355,7 +373,7 @@ _scsi_request_sense: |
|
|
|
ld hl, -27 |
|
|
|
add hl, sp |
|
|
|
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 |
|
|
|
add hl, sp |
|
|
|
ld e,l |
|
|
|
@ -364,7 +382,7 @@ _scsi_request_sense: |
|
|
|
ld bc,0x000f |
|
|
|
ld hl,_scsi_command_block_wrapper |
|
|
|
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 |
|
|
|
add hl, sp |
|
|
|
ex de, hl |
|
|
|
@ -372,11 +390,11 @@ _scsi_request_sense: |
|
|
|
ld hl,_scsi_packet_request_sense |
|
|
|
ldir |
|
|
|
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 |
|
|
|
;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 |
|
|
|
;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 |
|
|
|
add hl, bc |
|
|
|
ld (hl),0x12 |
|
|
|
@ -387,7 +405,7 @@ _scsi_request_sense: |
|
|
|
ld (hl), a |
|
|
|
inc hl |
|
|
|
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 d,(ix+7) |
|
|
|
xor a |
|
|
|
@ -399,37 +417,10 @@ _scsi_request_sense: |
|
|
|
ld h,(ix+5) |
|
|
|
push hl |
|
|
|
call _do_scsi_cmd |
|
|
|
;source-doc/scsi-drv/class_scsi.c:78: } |
|
|
|
;source-doc/scsi-drv/class_scsi.c:77: } |
|
|
|
ld sp,ix |
|
|
|
pop ix |
|
|
|
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: |
|
|
|
DEFB +0x03 |
|
|
|
DEFB +0x00 |
|
|
|
@ -443,3 +434,16 @@ _scsi_packet_request_sense: |
|
|
|
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 |
|
|
|
|