f34x_msd_scsi.src
来自「USB读写SD卡例程」· SRC 代码 · 共 1,567 行 · 第 1/3 页
SRC
1,567 行
;
; //----------------------------------------------------------------------------
; // Scsi_Write10
; //----------------------------------------------------------------------------
; //
; // This function responses to write command
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; void Scsi_Write10()
RSEG ?PR?Scsi_Write10?F34X_MSD_SCSI
Scsi_Write10:
USING 0
; SOURCE LINE # 185
; {
; SOURCE LINE # 186
; int i,j;
; DWORD xdata d_len = ntohl(cbw.dCBWDataTransferLength);
; SOURCE LINE # 188
MOV DPTR,#cbw+08H
LCALL L?0059
MOV R7,A
LCALL _htonl
MOV DPTR,#d_len?450
; DWORD xdata d_LBA = cbw.CBWCB[2];
; SOURCE LINE # 189
LCALL L?0076
; d_LBA<<=8;d_LBA+=cbw.CBWCB[3];
; SOURCE LINE # 190
LCALL L?0072
LCALL L?0059
LCALL L?0070
LCALL L?0063
MOV DPTR,#cbw+012H
LCALL L?0064
; d_LBA<<=8;d_LBA+=cbw.CBWCB[4];
; SOURCE LINE # 191
MOV DPTR,#d_LBA?451
LCALL L?0059
LCALL L?0070
LCALL L?0063
MOV DPTR,#cbw+013H
LCALL L?0064
; d_LBA<<=8;d_LBA+=cbw.CBWCB[5];
; SOURCE LINE # 192
MOV DPTR,#d_LBA?451
LCALL L?0059
LCALL L?0071
LCALL L?0063
MOV R3,A
MOV DPTR,#cbw+014H
LCALL L?0065
;
; for(i=0;i<(d_len+Sect_Block_Size()-1)/Sect_Block_Size();i++) {
; SOURCE LINE # 194
CLR A
MOV DPTR,#i?448
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
?C0012:
MOV DPTR,#d_len?450
LCALL L?0059
LCALL L?0073
MOV DPTR,#i?448
LCALL L?0068
SETB C
LCALL ?C?ULCMP
JNC $ + 5H
LJMP ?C0013
; START_WRITE_COPY;
; SOURCE LINE # 195
SETB START_STOP_WRITE_TO
; for(j=0;j<(Sect_Block_Size()+EP2_PACKET_SIZE-1)/EP2_PACKET_SIZE;j++) {
; SOURCE LINE # 196
CLR A
MOV DPTR,#j?449
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
?C0015:
?C0018:
; while(!Out_Count);
; SOURCE LINE # 197
MOV DPTR,#Out_Count
MOVX A,@DPTR
JNZ ?C0048
INC DPTR
MOVX A,@DPTR
?C0048:
JZ ?C0018
?C0019:
; Out2_Get_Data(Scratch+j*EP2_PACKET_SIZE);
; SOURCE LINE # 198
MOV DPTR,#j?449
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R0,#06H
?C0049:
CLR C
RLC A
XCH A,R6
RLC A
XCH A,R6
DJNZ R0,?C0049
LCALL L?0079
LCALL _Out2_Get_Data
; Out2_Done();
; SOURCE LINE # 199
LCALL Out2_Done
; }
; SOURCE LINE # 200
MOV DPTR,#j?449+01H
MOVX A,@DPTR
INC A
MOVX @DPTR,A
JNZ ?C0050
MOV DPTR,#j?449
MOVX A,@DPTR
INC A
MOVX @DPTR,A
?C0050:
CLR C
MOV DPTR,#j?449+01H
MOVX A,@DPTR
SUBB A,#08H
MOV DPTR,#j?449
MOVX A,@DPTR
XRL A,#080H
SUBB A,#080H
JC ?C0015
?C0016:
; STOP_WRITE_COPY;
; SOURCE LINE # 201
CLR START_STOP_WRITE_TO
; Sect_Write(d_LBA+i);
; SOURCE LINE # 202
MOV DPTR,#i?448
LCALL L?0069
MOV DPTR,#d_LBA?451
LCALL L?0063
LCALL L?0077
LCALL _Sect_Write
; Scsi_Residue-=Sect_Block_Size();
; SOURCE LINE # 203
MOV DPTR,#Scsi_Residue
LCALL L?0059
CLR C
SUBB A,#00H
MOV R7,A
MOV A,R6
SUBB A,#02H
LCALL L?0074
; }
; SOURCE LINE # 204
MOV DPTR,#i?448+01H
MOVX A,@DPTR
INC A
MOVX @DPTR,A
JNZ ?C0051
MOV DPTR,#i?448
MOVX A,@DPTR
INC A
MOVX @DPTR,A
?C0051:
LJMP ?C0012
?C0013:
; Scsi_Status=SCSI_PASSED;
; SOURCE LINE # 205
CLR A
MOV DPTR,#Scsi_Status
MOVX @DPTR,A
; }
; SOURCE LINE # 206
RET
; END OF Scsi_Write10
;
; //----------------------------------------------------------------------------
; // Scsi_Mode_Sense6
; //----------------------------------------------------------------------------
; //
; // This function responses to mode sense information request
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; void Scsi_Mode_Sense6()
RSEG ?PR?Scsi_Mode_Sense6?F34X_MSD_SCSI
Scsi_Mode_Sense6:
USING 0
; SOURCE LINE # 218
; {
; SOURCE LINE # 219
; Scsi_Status=SCSI_PASSED;
; SOURCE LINE # 220
CLR A
MOV DPTR,#Scsi_Status
MOVX @DPTR,A
; Scsi_Send(Scsi_Mode_Sense_6,sizeof(Scsi_Mode_Sense_6));
; SOURCE LINE # 221
MOV R3,#0FFH
MOV R2,#HIGH (Scsi_Mode_Sense_6)
MOV R1,#LOW (Scsi_Mode_Sense_6)
MOV R5,#04H
MOV R4,A
LJMP _Scsi_Send
; END OF Scsi_Mode_Sense6
; }
;
; //----------------------------------------------------------------------------
; // Scsi_Rx
; //----------------------------------------------------------------------------
; //
; // This function answers to requests from USB
; //
; // Parameters :
; // Return Value :
; //----------------------------------------------------------------------------
;
; void Scsi_Rx()
RSEG ?PR?Scsi_Rx?F34X_MSD_SCSI
Scsi_Rx:
USING 0
; SOURCE LINE # 234
; {
; SOURCE LINE # 235
; int xdata i;
;
; Scsi_Status=SCSI_FAILED;
; SOURCE LINE # 238
MOV DPTR,#Scsi_Status
MOV A,#01H
MOVX @DPTR,A
; Scsi_Residue=ntohl(cbw.dCBWDataTransferLength);
; SOURCE LINE # 239
MOV DPTR,#cbw+08H
LCALL L?0059
MOV R7,A
LCALL _htonl
LCALL L?0075
;
; if(!cbw.bCBWCBLength)
; SOURCE LINE # 241
MOV DPTR,#cbw+0EH
MOVX A,@DPTR
JNZ $ + 5H
LJMP ?C0023
?C0022:
; return;
;
; switch(cbw.CBWCB[0]) { // SCSI Operation code
; SOURCE LINE # 244
MOV DPTR,#cbw+0FH
MOVX A,@DPTR
LCALL ?C?CCASE
DW ?C0032
DB 00H
DW ?C0026
DB 012H
DW ?C0027
DB 01AH
DW ?C0032
DB 01BH
DW ?C0032
DB 01EH
DW ?C0028
DB 025H
DW ?C0029
DB 028H
DW ?C0030
DB 02AH
DW ?C0031
DB 02FH
DW 00H
DW ?C0024
; case SCSI_TEST_UNIT_READY:
; SOURCE LINE # 245
; Scsi_Status=SCSI_PASSED;
; break;
; case SCSI_INQUIRY:
; SOURCE LINE # 248
?C0026:
; Scsi_Inquiry();
; SOURCE LINE # 249
LCALL Scsi_Inquiry
; break;
; SOURCE LINE # 250
SJMP ?C0024
; case SCSI_MODE_SENSE_6:
; SOURCE LINE # 251
?C0027:
; Scsi_Mode_Sense6();
; SOURCE LINE # 252
LCALL Scsi_Mode_Sense6
; break;
; SOURCE LINE # 253
SJMP ?C0024
; case SCSI_READ_CAPACITY_10:
; SOURCE LINE # 254
?C0028:
; Scsi_Read_Capacity10();
; SOURCE LINE # 255
LCALL Scsi_Read_Capacity10
; break;
; SOURCE LINE # 256
SJMP ?C0024
; case SCSI_READ_10:
; SOURCE LINE # 257
?C0029:
; Scsi_Read10();
; SOURCE LINE # 258
LCALL Scsi_Read10
; break;
; SOURCE LINE # 259
SJMP ?C0024
; case SCSI_WRITE_10:
; SOURCE LINE # 260
?C0030:
; Scsi_Write10();
; SOURCE LINE # 261
LCALL Scsi_Write10
; break;
; SOURCE LINE # 262
SJMP ?C0024
; case SCSI_VERIFY_10:
; SOURCE LINE # 263
?C0031:
; Scsi_Residue=0;
; SOURCE LINE # 264
MOV DPTR,#Scsi_Residue
LCALL ?C?LSTKXDATA
DB 00H
DB 00H
DB 00H
DB 00H
; Scsi_Status=SCSI_PASSED;
; SOURCE LINE # 265
; break;
; SOURCE LINE # 266
SJMP ?C0055
; case SCSI_START_STOP_UNIT:
; SOURCE LINE # 267
?C0032:
; Scsi_Status=SCSI_PASSED;
; SOURCE LINE # 268
?C0053:
?C0054:
; break;
; SOURCE LINE # 269
; case SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL:
; SOURCE LINE # 270
?C0055:
CLR A
MOV DPTR,#Scsi_Status
MOVX @DPTR,A
; Scsi_Status=SCSI_PASSED;
; break;
; SOURCE LINE # 272
; default:
; SOURCE LINE # 273
; //printf("Unknown SCSI Cmd (0x%02X).\n",(int)cbw.CBWCB[0]);
; break;
; SOURCE LINE # 275
; }
; SOURCE LINE # 276
?C0024:
;
; if(Scsi_Residue && (Scsi_Residue==ntohl(cbw.dCBWDataTransferLength))) {
; SOURCE LINE # 278
MOV DPTR,#Scsi_Residue
LCALL L?0059
MOV R7,A
MOV A,R4
ORL A,R5
ORL A,R6
ORL A,R7
JNZ $ + 5H
LJMP ?C0023
MOV DPTR,#cbw+08H
LCALL L?0059
MOV R7,A
LCALL _htonl
MOV DPTR,#Scsi_Residue
LCALL L?0063
MOV R3,A
CLR C
LCALL ?C?ULCMP
JZ $ + 5H
LJMP ?C0023
; for(i=0;i<EP1_PACKET_SIZE;i++) In_Packet[i]=0;
; SOURCE LINE # 279
;---- Variable 'i?652' assigned to Register 'R6/R7' ----
MOV R7,A
?C0036:
MOV R6,#040H
MOV DPTR,#In_Packet
CLR A
?C0052:
MOVX @DPTR,A
INC DPTR
DJNZ R6,?C0052
?C0039:
; while(Scsi_Residue) {
; SOURCE LINE # 280
MOV DPTR,#Scsi_Residue
LCALL L?0059
MOV R7,A
MOV A,R4
ORL A,R5
ORL A,R6
ORL A,R7
JZ ?C0023
; USB_In(In_Packet,(EP1_PACKET_SIZE>Scsi_Residue)?Scsi_Residue:EP1_PACKET_SIZE);
; SOURCE LINE # 281
LCALL L?0078
JC ?C0041
MOV DPTR,#Scsi_Residue
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
XCH A,R4
MOV A,R6
XCH A,R4
MOV R5,A
SJMP ?C0042
?C0041:
MOV R4,#00H
MOV R5,#040H
?C0042:
MOV R3,#01H
MOV R2,#HIGH (In_Packet)
MOV R1,#LOW (In_Packet)
LCALL _USB_In
; Scsi_Residue-=((EP1_PACKET_SIZE>Scsi_Residue)?Scsi_Residue:EP1_PACKET_SIZE);
; SOURCE LINE # 282
MOV DPTR,#Scsi_Residue
LCALL L?0059
MOV R7,A
MOV A,R4
PUSH ACC
MOV A,R5
PUSH ACC
MOV A,R6
PUSH ACC
MOV A,R7
PUSH ACC
MOV DPTR,#Scsi_Residue
INC DPTR
INC DPTR
INC DPTR
LCALL L?0078
JC ?C0043
MOV DPTR,#Scsi_Residue
LCALL L?0059
MOV R3,A
XCH A,R2
MOV A,R6
XCH A,R2
XCH A,R1
MOV A,R5
XCH A,R1
XCH A,R0
MOV A,R4
XCH A,R0
SJMP ?C0044
?C0043:
CLR A
MOV R3,#040H
MOV R2,A
MOV R1,A
MOV R0,A
?C0044:
POP ACC
MOV R7,A
POP ACC
MOV R6,A
POP ACC
MOV R5,A
POP ACC
MOV R4,A
CLR C
MOV A,R7
SUBB A,R3
MOV R7,A
MOV A,R6
SUBB A,R2
MOV R6,A
MOV A,R5
SUBB A,R1
MOV R5,A
MOV A,R4
SUBB A,R0
MOV R4,A
LCALL L?0075
; }
; SOURCE LINE # 283
LJMP ?C0039
; }
; SOURCE LINE # 284
; }
; SOURCE LINE # 285
?C0023:
RET
; END OF Scsi_Rx
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?