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