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 + -
显示快捷键?