📄 scsi.s
字号:
.module SCSI.C
.area lit(rom, con, rel)
_inquiryData::
.byte 0
.byte 128
.byte 2
.byte 2
.byte 31,0
.byte 0
.byte 0
.byte 'Y,'U
.byte 'X,'K
.byte 50,48
.byte 48,53
.byte 'U,'S
.byte 'B,45
.byte 'M,'A
.byte 'S,'S
.byte 45,'S
.byte 'T,'O
.byte 'R,'A
.byte 'G,'E
.byte 48,46
.byte 48,48
.dbfile D:\AvrUSB\SCSI.C
.dbsym e inquiryData _inquiryData kX
_ModeData::
.byte 3
.byte 0
.byte 0
.byte 0
.dbsym e ModeData _ModeData kX
_ReadCapacityData::
.byte 0,0
.byte 251,255
.byte 0,0
.byte 2,0
.dbsym e ReadCapacityData _ReadCapacityData kX
_CapacitylistHead::
.byte 0,0
.byte 0
.byte 8
.dbsym e CapacitylistHead _CapacitylistHead kX
_CMFormatCapacityData::
.byte 0,16
.byte 0,0
.byte 3
.byte 0,2
.byte 0
.dbsym e CMFormatCapacityData _CMFormatCapacityData kX
.area text(rom, con, rel)
.dbfile D:\AvrUSB\SCSI.C
.dbfunc e RBC_Hander _RBC_Hander fc
; result -> R20
.even
_RBC_Hander::
xcall push_gset2
.dbline -1
.dbline 73
; #include <iom162v.h>
; #include <macros.h>
; #include "SCSI.H"
; #include "SCSIDef.H"
; #include "BulkOnly.H"
; #include "MAIN.H"
;
; #include "Fat.h"
;
;
; extern BULK_STRUCT Bulk_Block;
; extern CONTROL_XFER ControlData;
; extern EPPFLAGS bEPPflags;
; BULK_CONTROL Bulk_Control_r;
; BULK_CONTROL Bulk_Control_w;
; unsigned char PageBuf[512];
;
; #define CBW_bCBWCBLength Bulk_Block.cbw.dCBWDataTransferLength
;
; const STD_INQUIRY_DATA inquiryData={
; 0,//unsigned DeviceType :5;
; 0,//unsigned Reserved0 :3;
; 0,//unsigned Reserved1 :7;
; 1,//unsigned RemovableMedia :1;
; 2,//unsigned char Reserved2;
; 2,//unsigned Reserved3 :5;
; 0,//unsigned NormACA :1;
; 0,//unsigned Obsolete0 :1;
; 0,//unsigned AERC :1;
; 0x1f,0,0,//unsigned char Reserved4[3];
; 0,//unsigned SoftReset :1;
; 0,//unsigned CommandQueue :1;
; 0,//unsigned Reserved5 :1;
; 0,//unsigned LinkedCommands :1;
; 0,//unsigned Synchronous :1;
; 0,//unsigned Wide16Bit :1;
; 0,//unsigned Wide32Bit :1;
; 0,//unsigned RelativeAddressing :1;
; 'Y','U','X','K', //VendorInformation[8];
; '2','0','0','5',
; 'U','S','B','-', //ProductInformation[16];
; 'M','A','S','S',
; '-','S','T','O',
; 'R','A','G','E',
; '0','.','0','0', //ProductReisionLevel[4];
; };
;
; const MODE_DATA ModeData={
; 3,//unsigned char OperationCode;
; 0,//unsigned char Reserved0;
; 0,//unsigned Reserved1 :7;
; 0,//unsigned WP :1;
; 0 //unsigned char Reserved2;
; };
; const READ_CAPACITY_DATA ReadCapacityData={
; 0,0,0xfb,0xff,//unsigned char LogicalBlockAddress[4];
; 0,0,0x02,0//unsigned char LogicalLength[4];
; };
; #define CAPACITY_LIST_LENGTH sizeof(CAPACITYLIST_HEAD)+sizeof(CM_FORMAT_CAPACITY_DATA)
; const CAPACITYLIST_HEAD CapacitylistHead={
; 0,0,0,//unsigned char Reserved0[3];
; sizeof(CM_FORMAT_CAPACITY_DATA) //unsigned char CapacityLength;
; };
; const CM_FORMAT_CAPACITY_DATA CMFormatCapacityData={
; 0,0x10,0,0,//unsigned char LogicalBlockAddress[4];
; 3, //unsigned DescriptorCode :2;
; 0, //unsigned Reserved0 :6;
; 0,2,0 //unsigned char LogicalLength[3];
; };
;
;
; BOOLEAN RBC_Hander(void)
; {
.dbline 76
; #define cdbGeneric Bulk_Block.cbw.CBWCB.RbcCdb_Generic
;
; BOOLEAN result=FALSE;
clr R20
.dbline 77
; ControlData.wLength=0;
clr R2
clr R3
sts _ControlData+8+1,R3
sts _ControlData+8,R2
.dbline 78
; switch(cdbGeneric.OperationCode)
lds R22,_Bulk_Block+15
clr R23
cpi R22,26
ldi R30,0
cpc R23,R30
brne X2
xjmp L8
X2:
ldi R24,26
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L18
L17:
cpi R22,18
ldi R30,0
cpc R23,R30
breq L7
ldi R24,18
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L20
L19:
cpi R22,0
cpc R22,R23
brne X3
xjmp L12
X3:
X0:
xjmp L3
L20:
cpi R22,22
ldi R30,0
cpc R23,R30
brne X4
xjmp L16
X4:
xjmp L3
L18:
cpi R22,35
ldi R30,0
cpc R23,R30
breq L11
cpi R22,37
ldi R30,0
cpc R23,R30
breq L10
cpi R22,40
ldi R30,0
cpc R23,R30
breq L9
cpi R22,42
ldi R30,0
cpc R23,R30
breq L14
ldi R24,42
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L22
L21:
cpi R22,30
ldi R30,0
cpc R23,R30
breq L15
xjmp L3
L22:
cpi R22,47
ldi R30,0
cpc R23,R30
breq L13
xjmp L3
X1:
.dbline 79
; {
L7:
.dbline 81
; case SPC_CMD_INQUIRY:
; result=SPC_InQuiry();
xcall _SPC_InQuiry
mov R20,R16
.dbline 82
; break;
xjmp L4
L8:
.dbline 84
; case SPC_CMD_MODESENSE6:
; result=SPC_ModeSense();
xcall _SPC_ModeSense
mov R20,R16
.dbline 85
; break;
xjmp L4
L9:
.dbline 87
; case RBC_CMD_READ10:
; result=RBC_Read10();
xcall _RBC_Read10
mov R20,R16
.dbline 88
; break;
xjmp L4
L10:
.dbline 90
; case RBC_CMD_READCAPACITY:
; result=RBC_ReadCapacity();
xcall _RBC_ReadCapacity
mov R20,R16
.dbline 91
; break;
xjmp L4
L11:
.dbline 93
; case SPC_CMD_FORMAT_CAPACITY:
; result=SPC_FormatCapacity();
xcall _SPC_FormatCapacity
mov R20,R16
.dbline 94
; break;
xjmp L4
L12:
.dbline 96
; case SPC_CMD_TESTUNITREADY:
; result=SPC_TestUnit();
xcall _SPC_TestUnit
mov R20,R16
.dbline 97
; break;
xjmp L4
L13:
.dbline 99
; case RBC_CMD_VERIFY10:
; result=RBC_Verify10();
xcall _RBC_Verify10
mov R20,R16
.dbline 100
; break;
xjmp L4
L14:
.dbline 102
; case RBC_CMD_WRITE10:
; result=RBC_Write10();
xcall _RBC_Write10
mov R20,R16
.dbline 103
; break;
xjmp L4
L15:
.dbline 105
; case SPC_CMD_PRVENTALLOWMEDIUMREMOVAL:
; result=SPC_LockMedia();
xcall _SPC_LockMedia
mov R20,R16
.dbline 106
; break;
xjmp L4
L16:
L3:
.dbline 109
; case SPC_CMD_RESERVE6:
; default:
; result=SPC_Reserve6();
xcall _SPC_Reserve6
mov R20,R16
.dbline 110
; break;
L4:
.dbline 112
; }
; return result;
mov R16,R20
.dbline -2
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r result 20 c
.dbend
.dbfunc e SPC_InQuiry _SPC_InQuiry fc
.even
_SPC_InQuiry::
.dbline -1
.dbline 116
; #undef cdbGeneric
; }
; BOOLEAN SPC_InQuiry(void)
; {
.dbline 117
; Bulk_code_transmit((const unsigned char*)&inquiryData,
ldi R18,36
ldi R19,0
ldi R16,<_inquiryData
ldi R17,>_inquiryData
xcall _Bulk_code_transmit
.dbline 119
; sizeof(STD_INQUIRY_DATA));
; return TRUE;
ldi R16,1
.dbline -2
L23:
.dbline 0 ; func end
ret
.dbend
.dbfunc e SPC_ModeSense _SPC_ModeSense fc
.even
_SPC_ModeSense::
.dbline -1
.dbline 122
; }
; BOOLEAN SPC_ModeSense(void)
; {
.dbline 123
; Bulk_code_transmit((const unsigned char*)&ModeData,
ldi R18,4
ldi R19,0
ldi R16,<_ModeData
ldi R17,>_ModeData
xcall _Bulk_code_transmit
.dbline 125
; sizeof(MODE_DATA));
; return TRUE;
ldi R16,1
.dbline -2
L24:
.dbline 0 ; func end
ret
.dbend
.dbfunc e RBC_Read10 _RBC_Read10 fc
; Logical_Block_Address -> y+2
.even
_RBC_Read10::
xcall push_gset2
sbiw R28,6
.dbline -1
.dbline 128
; }
; BOOLEAN RBC_Read10(void)
; {
.dbline 131
; #define cdbRead10 Bulk_Block.cbw.CBWCB.RbcCdb_Read10
; unsigned long Logical_Block_Address;
; Logical_Block_Address=cdbRead10.LogicalBlockAddress[0]*0x1000000;
lds R2,_Bulk_Block+15+2
clr R3
clr R4
clr R5
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,1
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32s
movw R30,R28
std z+2,R16
std z+3,R17
std z+4,R18
std z+5,R19
.dbline 132
; Logical_Block_Address+=cdbRead10.LogicalBlockAddress[1]*0x10000;
lds R2,_Bulk_Block+15+2+1
clr R3
clr R4
clr R5
ldi R20,0
ldi R21,0
ldi R22,1
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32s
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
add R2,R16
adc R3,R17
adc R4,R18
adc R5,R19
movw R30,R28
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
.dbline 133
; Logical_Block_Address+=cdbRead10.LogicalBlockAddress[2]*0x100;
lds R18,_Bulk_Block+15+2+2
clr R19
ldi R16,256
ldi R17,1
xcall empy16s
movw R2,R16
clr R4
sbrc R3,7
com R4
clr R5
sbrc R4,7
com R5
movw R30,R28
ldd R6,z+2
ldd R7,z+3
ldd R8,z+4
ldd R9,z+5
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+2,R6
std z+3,R7
std z+4,R8
std z+5,R9
.dbline 134
; Logical_Block_Address+=cdbRead10.LogicalBlockAddress[3];
lds R2,_Bulk_Block+15+2+3
clr R3
clr R4
clr R5
movw R30,R28
ldd R6,z+2
ldd R7,z+3
ldd R8,z+4
ldd R9,z+5
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+2,R6
std z+3,R7
std z+4,R8
std z+5,R9
.dbline 135
; Bulk_Control_r.Transfer_Length=cdbRead10.TransferLength[0]*256+cdbRead10.TransferLength[1];
lds R18,_Bulk_Block+15+7
clr R19
ldi R16,256
ldi R17,1
xcall empy16s
movw R2,R16
lds R4,_Bulk_Block+15+7+1
clr R5
add R2,R4
adc R3,R5
sts _Bulk_Control_r+1,R3
sts _Bulk_Control_r,R2
.dbline 136
; Bulk_Control_r.CurrentPage=Logical_Block_Address%0x20;
ldi R20,31
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
and R2,R20
and R3,R21
and R4,R22
and R5,R23
sts _Bulk_Control_r+4,R2
.dbline 137
; Bulk_Control_r.CurrentBlock=Logical_Block_Address/0x20;
ldi R24,5
ldi R25,0
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
st -y,R24
movw R16,R2
movw R18,R4
xcall lsr32
sts _Bulk_Control_r+2+1,R17
sts _Bulk_Control_r+2,R16
.dbline 138
; ReadPage(Bulk_Control_r.CurrentBlock,Bulk_Control_r.CurrentPage,PageBuf);
ldi R24,<_PageBuf
ldi R25,>_PageBuf
std y+1,R25
std y+0,R24
lds R18,_Bulk_Control_r+4
clr R19
xcall _ReadPage
.dbline 139
; Bulk_Control_r.Transfer_Length--;
lds R24,_Bulk_Control_r
lds R25,_Bulk_Control_r+1
sbiw R24,1
sts _Bulk_Control_r+1,R25
sts _Bulk_Control_r,R24
.dbline 140
; Bulk_Control_r.CurrentPage++;
lds R24,_Bulk_Control_r+4
subi R24,255 ; addi 1
sts _Bulk_Control_r+4,R24
.dbline 141
; Bulk_Control_r.BufCount=0;
clr R2
clr R3
sts _Bulk_Control_r+6+1,R3
sts _Bulk_Control_r+6,R2
.dbline 142
; bEPPflags.bits.bulk_state=BULK_DATA_TRANS;
lds R24,_bEPPflags+2
andi R24,248
ori R24,1
sts _bEPPflags+2,R24
.dbline 143
; Bulk_ErrorHandler(CSW_GOOD,CBW_bCBWCBLength);
lds R18,_Bulk_Block+8
lds R19,_Bulk_Block+8+1
clr R16
xcall _Bulk_ErrorHandler
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -