f34x_msd_scsi.src
来自「USB读写SD卡例程」· SRC 代码 · 共 1,567 行 · 第 1/3 页
SRC
1,567 行
MOV A,R5
SUBB A,#00H
MOV R5,A
MOV A,R4
SUBB A,#00H
MOV R4,A
LJMP ?C?LSTXDATA
L?0068:
USING 0
XCH A,R0
MOV A,R4
XCH A,R0
XCH A,R1
MOV A,R5
XCH A,R1
XCH A,R2
MOV A,R6
XCH A,R2
XCH A,R3
MOV A,R7
XCH A,R3
L?0069:
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV A,R6
RLC A
SUBB A,ACC
MOV R5,A
MOV R4,A
RET
L?0070:
USING 0
L?0071:
MOV R7,A
MOV R0,#08H
LCALL ?C?LSHL
L?0072:
MOV DPTR,#d_LBA?451
LCALL ?C?LSTXDATA
MOV DPTR,#d_LBA?451
RET
L?0073:
USING 0
ADD A,#0FFH
MOV R7,A
MOV A,R6
ADDC A,#01H
MOV R6,A
CLR A
ADDC A,R5
MOV R5,A
CLR A
ADDC A,R4
MOV R4,A
CLR A
MOV R3,A
MOV R2,#02H
MOV R1,A
MOV R0,A
LJMP ?C?ULDIV
L?0074:
USING 0
MOV R6,A
MOV A,R5
SUBB A,#00H
MOV R5,A
MOV A,R4
SUBB A,#00H
MOV R4,A
L?0075:
MOV DPTR,#Scsi_Residue
LJMP ?C?LSTXDATA
L?0076:
USING 0
LCALL ?C?LSTXDATA
MOV DPTR,#cbw+011H
MOVX A,@DPTR
MOV R7,A
CLR A
MOV R4,A
MOV R5,A
MOV R6,A
RET
L?0077:
USING 0
ADD A,R7
MOV R7,A
MOV A,R2
ADDC A,R6
MOV R6,A
MOV A,R1
ADDC A,R5
MOV R5,A
MOV A,R0
ADDC A,R4
MOV R4,A
RET
L?0078:
USING 0
CLR A
MOV R3,#040H
MOV R2,A
MOV R1,A
MOV R0,A
SETB C
LJMP ?C?ULCMP
L?0079:
USING 0
ADD A,#LOW (Scratch)
MOV R1,A
MOV A,#HIGH (Scratch)
ADDC A,R6
MOV R2,A
MOV R3,#01H
RET
; END OF Com0038
; static void Scsi_Send(BYTE* ptr,unsigned count)
RSEG ?PR?_Scsi_Send?F34X_MSD_SCSI
_Scsi_Send:
USING 0
; SOURCE LINE # 93
MOV DPTR,#ptr?040
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R4
MOVX @DPTR,A
INC DPTR
MOV A,R5
MOVX @DPTR,A
; {
; SOURCE LINE # 94
; if(Scsi_Residue<count) {
; SOURCE LINE # 95
MOV R7,A
XCH A,R6
MOV A,R4
XCH A,R6
CLR A
MOV R4,A
MOV R5,A
MOV DPTR,#Scsi_Residue
LCALL L?0063
MOV R3,A
CLR C
LCALL ?C?ULCMP
JNC ?C0001
; // Under the "thin diagonal":
; Scsi_Status=SCSI_PHASE_ERROR;
; SOURCE LINE # 97
MOV DPTR,#Scsi_Status
MOV A,#02H
MOVX @DPTR,A
RET
; return;
; }
; SOURCE LINE # 99
?C0001:
; Scsi_Residue-=count;
; SOURCE LINE # 100
MOV DPTR,#Scsi_Residue
LCALL L?0059
MOV R7,A
MOV A,R6
PUSH ACC
MOV A,R7
PUSH ACC
MOV DPTR,#count?041
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
XCH A,R2
MOV A,R6
XCH A,R2
POP ACC
MOV R7,A
POP ACC
MOV R6,A
CLR C
MOV A,R7
SUBB A,R3
MOV R7,A
MOV A,R6
SUBB A,R2
LCALL L?0074
; USB_In(ptr,count);
; SOURCE LINE # 101
MOV DPTR,#ptr?040
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
LCALL _USB_In
; }
; SOURCE LINE # 102
?C0002:
RET
; END OF _Scsi_Send
;
; //----------------------------------------------------------------------------
; // Scsi_Inquiry
; //----------------------------------------------------------------------------
; //
; // This function responses to inquiry from other USB device
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; void Scsi_Inquiry()
RSEG ?PR?Scsi_Inquiry?F34X_MSD_SCSI
Scsi_Inquiry:
USING 0
; SOURCE LINE # 114
; {
; SOURCE LINE # 115
; Scsi_Status=SCSI_PASSED;
; SOURCE LINE # 116
CLR A
MOV DPTR,#Scsi_Status
MOVX @DPTR,A
; Scsi_Send(Scsi_Standard_Inquiry_Data,sizeof(Scsi_Standard_Inquiry_Data));
; SOURCE LINE # 117
MOV R3,#0FFH
MOV R2,#HIGH (Scsi_Standard_Inquiry_Data)
MOV R1,#LOW (Scsi_Standard_Inquiry_Data)
MOV R5,#01CH
MOV R4,A
LJMP _Scsi_Send
; END OF Scsi_Inquiry
; }
;
; //----------------------------------------------------------------------------
; // Scsi_Read_Capacity10
; //----------------------------------------------------------------------------
; //
; // This function responses to capacity informations request
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; void Scsi_Read_Capacity10()
RSEG ?PR?Scsi_Read_Capacity10?F34X_MSD_SCSI
Scsi_Read_Capacity10:
USING 0
; SOURCE LINE # 130
; {
; SOURCE LINE # 131
; unsigned int s;
; unsigned long size = Sect_Sectors();
; SOURCE LINE # 133
LCALL Sect_Sectors
MOV DPTR,#size?243
LCALL ?C?LSTXDATA
; size-=1;
; SOURCE LINE # 134
MOV DPTR,#size?243
LCALL L?0059
CLR C
SUBB A,#01H
MOV DPTR,#size?243
LCALL L?0067
; s = ((size&0xFFFF0000) >> 16);
; SOURCE LINE # 135
MOV DPTR,#size?243
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
INC DPTR
CLR A
MOV R7,A
MOV R6,A
MOV A,R4
MOV R0,#010H
LCALL ?C?ULSHR
;---- Variable 's?242' assigned to Register 'R2/R3' ----
XCH A,R3
MOV A,R7
XCH A,R3
XCH A,R2
MOV A,R6
XCH A,R2
; Scsi_Read_Capacity_10[0]=msb((s));
; SOURCE LINE # 136
MOV A,R2
MOV R7,A
MOV DPTR,#Scsi_Read_Capacity_10
MOV A,R7
MOVX @DPTR,A
; Scsi_Read_Capacity_10[1]=lsb((s));
; SOURCE LINE # 137
XCH A,R7
MOV A,R3
XCH A,R7
INC DPTR
MOV A,R7
MOVX @DPTR,A
; Scsi_Read_Capacity_10[2]=msb(size);
; SOURCE LINE # 138
MOV DPTR,#size?243
LCALL L?0059
MOV R7,A
MOV R0,#08H
LCALL ?C?ULSHR
MOV DPTR,#Scsi_Read_Capacity_10+02H
MOV A,R7
MOVX @DPTR,A
; Scsi_Read_Capacity_10[3]=lsb(size);
; SOURCE LINE # 139
MOV DPTR,#size?243
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#Scsi_Read_Capacity_10+03H
MOV A,R7
MOVX @DPTR,A
;
; Scsi_Status=SCSI_PASSED;
; SOURCE LINE # 141
CLR A
MOV DPTR,#Scsi_Status
MOVX @DPTR,A
; Scsi_Send(Scsi_Read_Capacity_10,sizeof(Scsi_Read_Capacity_10));
; SOURCE LINE # 142
MOV R3,#01H
MOV R2,#HIGH (Scsi_Read_Capacity_10)
MOV R1,#LOW (Scsi_Read_Capacity_10)
MOV R5,#08H
MOV R4,A
LJMP _Scsi_Send
; END OF Scsi_Read_Capacity10
; }
;
; //----------------------------------------------------------------------------
; // Scsi_Read10
; //----------------------------------------------------------------------------
; //
; // This function responses to read command
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; void Scsi_Read10()
RSEG ?PR?Scsi_Read10?F34X_MSD_SCSI
Scsi_Read10:
USING 0
; SOURCE LINE # 155
; {
; SOURCE LINE # 156
; int i,j;
; DWORD xdata d_len = ntohl(cbw.dCBWDataTransferLength);
; SOURCE LINE # 158
MOV DPTR,#cbw+08H
LCALL L?0059
MOV R7,A
LCALL _htonl
MOV DPTR,#d_len?346
; DWORD xdata d_LBA = cbw.CBWCB[2];
; SOURCE LINE # 159
LCALL L?0076
; d_LBA<<=8;d_LBA+=cbw.CBWCB[3];
; SOURCE LINE # 160
LCALL L?0058
LCALL L?0060
MOV DPTR,#cbw+012H
; d_LBA<<=8;d_LBA+=cbw.CBWCB[4];
; SOURCE LINE # 161
LCALL L?0057
LCALL L?0060
MOV DPTR,#cbw+013H
; d_LBA<<=8;d_LBA+=cbw.CBWCB[5];
; SOURCE LINE # 162
LCALL L?0057
LCALL L?0061
MOV R3,A
MOV DPTR,#cbw+014H
MOVX A,@DPTR
MOV DPTR,#d_LBA?347
LCALL L?0066
;
; for(i=0;i<(d_len+Sect_Block_Size()-1)/Sect_Block_Size();i++) {
; SOURCE LINE # 164
CLR A
MOV DPTR,#i?344
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
?C0005:
MOV DPTR,#d_len?346
LCALL L?0059
LCALL L?0073
MOV DPTR,#i?344
LCALL L?0068
SETB C
LCALL ?C?ULCMP
JC ?C0006
; Sect_Read(d_LBA+i);
; SOURCE LINE # 165
MOV DPTR,#i?344
LCALL L?0069
LCALL L?0062
LCALL L?0077
LCALL _Sect_Read
; for(j=0;j<(Sect_Block_Size()+EP1_PACKET_SIZE-1)/EP1_PACKET_SIZE;j++) {
; SOURCE LINE # 166
CLR A
MOV DPTR,#j?345
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
?C0008:
MOV DPTR,#j?345
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
CLR C
SUBB A,#08H
MOV A,R6
XRL A,#080H
SUBB A,#080H
JNC ?C0007
; USB_In(Scratch+j*EP1_PACKET_SIZE,EP1_PACKET_SIZE);
; SOURCE LINE # 167
MOV A,R7
MOV R0,#06H
?C0045:
CLR C
RLC A
XCH A,R6
RLC A
XCH A,R6
DJNZ R0,?C0045
LCALL L?0079
MOV R5,#040H
MOV R4,#00H
LCALL _USB_In
; Scsi_Residue-=EP1_PACKET_SIZE;
; SOURCE LINE # 168
MOV DPTR,#Scsi_Residue
LCALL L?0059
CLR C
SUBB A,#040H
MOV DPTR,#Scsi_Residue
LCALL L?0067
; }
; SOURCE LINE # 169
MOV DPTR,#j?345+01H
MOVX A,@DPTR
INC A
MOVX @DPTR,A
JNZ ?C0046
MOV DPTR,#j?345
MOVX A,@DPTR
INC A
MOVX @DPTR,A
?C0046:
SJMP ?C0008
; }
; SOURCE LINE # 170
?C0007:
MOV DPTR,#i?344+01H
MOVX A,@DPTR
INC A
MOVX @DPTR,A
JNZ ?C0047
MOV DPTR,#i?344
MOVX A,@DPTR
INC A
MOVX @DPTR,A
?C0047:
LJMP ?C0005
?C0006:
;
; Scsi_Status=SCSI_PASSED;
; SOURCE LINE # 172
CLR A
MOV DPTR,#Scsi_Status
MOVX @DPTR,A
; }
; SOURCE LINE # 173
RET
; END OF Scsi_Read10
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?