⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 upsd3400_usb_app.src

📁 U-disk reference design
💻 SRC
📖 第 1 页 / 共 5 页
字号:
	CLR  	A
	ADDC 	A,#070H
	MOV  	DPH,A
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	DPL,i?453+01H
	MOV  	DPH,i?453
	MOVX 	A,@DPTR
	ORL  	A,R7
	CPL  	A
	JZ   	?C0030
;        {
			; SOURCE LINE # 328
;         j = 255;
			; SOURCE LINE # 329
	MOV  	j?451,#0FFH
;        }
			; SOURCE LINE # 330
	SJMP 	?C0028
?C0030:
;       else
;        {
			; SOURCE LINE # 332
;         i++;
			; SOURCE LINE # 333
	INC  	i?453+01H
	MOV  	A,i?453+01H
	JNZ  	?C0117
	INC  	i?453
?C0117:
;         j++;
			; SOURCE LINE # 334
	INC  	j?451
;        }
			; SOURCE LINE # 335
;      }
			; SOURCE LINE # 336
	SJMP 	?C0028
?C0029:
; 
; 
;     if (j == 255)             //check whether the sector needs to be erased or not
			; SOURCE LINE # 339
	MOV  	A,j?451
	CPL  	A
	JZ   	$ + 5H
	LJMP 	?C0032
;      {
			; SOURCE LINE # 340
;       page = UPSD_xreg.PAGE;
			; SOURCE LINE # 341
	MOV  	DPTR,#UPSD_xreg+0E0H
	MOVX 	A,@DPTR
	MOV  	page?452,A
;       UPSD_xreg.PAGE = 7;
			; SOURCE LINE # 342
	MOV  	A,#07H
	MOVX 	@DPTR,A
; 
;       EraseMainFlashSector();                //erase sector #8;
			; SOURCE LINE # 344
	LCALL	EraseMainFlashSector
;                                   //now calculate the max. FLASH area to be erased
;            //TransferLength holds number of 64B packets to be received and written
;       if ((TransferLength>=512) || ((PhysicalDataAddr+(TransferLength<<6))<0x8000))
			; SOURCE LINE # 347
	CLR  	C
	MOV  	A,TransferLength
	SUBB 	A,#02H
	JNC  	?C0034
	MOV  	A,TransferLength+01H
	MOV  	R6,TransferLength
	MOV  	R0,#06H
?C0118:
	CLR  	C
	RLC  	A
	XCH  	A,R6
	RLC  	A
	XCH  	A,R6
	DJNZ 	R0,?C0118
	ADD  	A,PhysicalDataAddr+01H
	MOV  	R7,A
	MOV  	A,PhysicalDataAddr
	ADDC 	A,R6
	MOV  	R6,A
	CLR  	C
	SUBB 	A,#080H
	JNC  	?C0033
?C0034:
;        {
			; SOURCE LINE # 348
;         SectorEndPhysicalDataAddr = 0xFFFF;  //the top of memory
			; SOURCE LINE # 349
	MOV  	A,#0FFH
	MOV  	SectorEndPhysicalDataAddr?454,A
	MOV  	SectorEndPhysicalDataAddr?454+01H,A
;        }
			; SOURCE LINE # 350
	SJMP 	?C0035
?C0033:
;       else
;        {
			; SOURCE LINE # 352
;         SectorEndPhysicalDataAddr = PhysicalDataAddr+(((unsigned int)TransferLength)<<6)-1;
			; SOURCE LINE # 353
	MOV  	A,R7
	ADD  	A,#0FFH
	MOV  	SectorEndPhysicalDataAddr?454+01H,A
	MOV  	A,R6
	ADDC 	A,#0FFH
	MOV  	SectorEndPhysicalDataAddr?454,A
;        }
			; SOURCE LINE # 354
?C0035:
; 
; 
;       UPSD_xreg.PAGE = page;                 // the sector part needs to be erased
			; SOURCE LINE # 357
	MOV  	DPTR,#UPSD_xreg+0E0H
	MOV  	A,page?452
	MOVX 	@DPTR,A
;       i = 0x8000;               //now copy the FLASH sector to the flash sector #8
			; SOURCE LINE # 358
	MOV  	i?453,#080H
	MOV  	i?453+01H,#00H
?C0036:
;       while (i != 0)   //  copy only the area without the part we are updating now
			; SOURCE LINE # 359
;        {
			; SOURCE LINE # 360
;         if ((i<PhysicalDataAddr) || (i>SectorEndPhysicalDataAddr))    //write back
			; SOURCE LINE # 361
	CLR  	C
	MOV  	A,i?453+01H
	SUBB 	A,PhysicalDataAddr+01H
	MOV  	A,i?453
	SUBB 	A,PhysicalDataAddr
	JC   	?C0039
	SETB 	C
	MOV  	A,i?453+01H
	SUBB 	A,SectorEndPhysicalDataAddr?454+01H
	MOV  	A,i?453
	SUBB 	A,SectorEndPhysicalDataAddr?454
	JC   	?C0038
?C0039:
;          {
			; SOURCE LINE # 362
;           j = ((unsigned char volatile xdata *) 0)[i];
			; SOURCE LINE # 363
	MOV  	DPL,i?453+01H
	MOV  	DPH,i?453
	MOVX 	A,@DPTR
	MOV  	j?451,A
;           if (j != 0xFF)                     // do not write 0xFF
			; SOURCE LINE # 364
	CPL  	A
	JZ   	?C0038
;            {
			; SOURCE LINE # 365
;             UPSD_xreg.PAGE = 7;
			; SOURCE LINE # 366
	MOV  	A,#07H
;             if (WriteToMainFlash(i,j) == TRUE)
			; SOURCE LINE # 367
	LCALL	L?0127
	CJNE 	R7,#01H,?C0041
;              {
			; SOURCE LINE # 368
;               gbCSWStatus = FAIL;          //error during write operation occured!
			; SOURCE LINE # 369
	MOV  	gbCSWStatus,#01H
;               i = 0xFFFF;
			; SOURCE LINE # 370
	MOV  	A,#0FFH
	MOV  	i?453,A
	MOV  	i?453+01H,A
;              }
			; SOURCE LINE # 371
?C0041:
;             UPSD_xreg.PAGE = page;
			; SOURCE LINE # 372
	MOV  	DPTR,#UPSD_xreg+0E0H
	MOV  	A,page?452
	MOVX 	@DPTR,A
;            }
			; SOURCE LINE # 373
;          }
			; SOURCE LINE # 374
?C0038:
;         i++;                           // this area will be replaced by a new data
			; SOURCE LINE # 375
	INC  	i?453+01H
	MOV  	A,i?453+01H
	JNZ  	?C0119
	INC  	i?453
?C0119:
;        }
			; SOURCE LINE # 376
	ORL  	A,i?453
	JNZ  	?C0036
?C0037:
; 
;       EraseMainFlashSector();                // erase sector
			; SOURCE LINE # 378
	LCALL	EraseMainFlashSector
; 
; 
; // now we have a copy of data in the sector #8 with the erase area we need to update
; 
;       i = 0x8000;
			; SOURCE LINE # 383
	MOV  	i?453,#080H
	MOV  	i?453+01H,#00H
?C0042:
;       while (i != 0)              //copy the rest of data back to the orig. sector
			; SOURCE LINE # 384
;        {
			; SOURCE LINE # 385
;         UPSD_xreg.PAGE = 7;
			; SOURCE LINE # 386
	MOV  	DPTR,#UPSD_xreg+0E0H
	MOV  	A,#07H
	MOVX 	@DPTR,A
;         j = ((unsigned char volatile xdata *) 0)[i];
			; SOURCE LINE # 387
	MOV  	DPL,i?453+01H
	MOV  	DPH,i?453
	MOVX 	A,@DPTR
	MOV  	j?451,A
;         if (j != 0xFF)                       // do not write 0xFF, already present
			; SOURCE LINE # 388
	CPL  	A
	JZ   	?C0044
;          {
			; SOURCE LINE # 389
;           UPSD_xreg.PAGE = page;
			; SOURCE LINE # 390
	MOV  	A,page?452
;           if (WriteToMainFlash(i,j) == TRUE)
			; SOURCE LINE # 391
	LCALL	L?0127
	CJNE 	R7,#01H,?C0044
;            {
			; SOURCE LINE # 392
;             gbCSWStatus = FAIL;            //error during write operation occured!
			; SOURCE LINE # 393
	MOV  	gbCSWStatus,#01H
;             i = 0xFFFF;                      //end loop
			; SOURCE LINE # 394
	MOV  	A,#0FFH
	MOV  	i?453,A
	MOV  	i?453+01H,A
;            }
			; SOURCE LINE # 395
;          }
			; SOURCE LINE # 396
?C0044:
;         i++;
			; SOURCE LINE # 397
	INC  	i?453+01H
	MOV  	A,i?453+01H
	JNZ  	?C0120
	INC  	i?453
?C0120:
;        }
			; SOURCE LINE # 398
	ORL  	A,i?453
	JNZ  	?C0042
?C0043:
; 
;       UPSD_xreg.PAGE = page;
			; SOURCE LINE # 400
	MOV  	DPTR,#UPSD_xreg+0E0H
	MOV  	A,page?452
	MOVX 	@DPTR,A
;      }
			; SOURCE LINE # 401
?C0032:
; 
; 
; // Now the sector is ready for write
; 
;     i = PhysicalDataAddr;
			; SOURCE LINE # 406
	MOV  	i?453,PhysicalDataAddr
	MOV  	i?453+01H,PhysicalDataAddr+01H
;     j =0;
			; SOURCE LINE # 407
	CLR  	A
	MOV  	j?451,A
?C0046:
;     while (j<64)                             //now burn the data into flash
			; SOURCE LINE # 408
	MOV  	A,j?451
	CLR  	C
	SUBB 	A,#040H
	JNC  	?C0047
;      {
			; SOURCE LINE # 409
;       if (WriteToMainFlash(i,~USB_FIFO[j]) == TRUE)
			; SOURCE LINE # 410
	CLR  	A
	ADD  	A,j?451
	MOV  	DPL,A
	CLR  	A
	ADDC 	A,#070H
	MOV  	DPH,A
	MOVX 	A,@DPTR
	CPL  	A
	MOV  	R5,A
	LCALL	L?0128
	CJNE 	R7,#01H,?C0048
;        {
			; SOURCE LINE # 411
;                                              // an error occured, try it again
;         gbCSWStatus = FAIL;                //error during write operation occured!
			; SOURCE LINE # 413
	MOV  	gbCSWStatus,#01H
;         j = 255;
			; SOURCE LINE # 414
	MOV  	j?451,#0FFH
;        }
			; SOURCE LINE # 415
	SJMP 	?C0046
?C0048:
;       else
;        {
			; SOURCE LINE # 417
;         i++;
			; SOURCE LINE # 418
	INC  	i?453+01H
	MOV  	A,i?453+01H
	JNZ  	?C0121
	INC  	i?453
?C0121:
;         j++;
			; SOURCE LINE # 419
	INC  	j?451
;        }
			; SOURCE LINE # 420
;      }
			; SOURCE LINE # 421
	SJMP 	?C0046
?C0047:
; 
; 
;     UCON |= EPFIFO_BSY;
			; SOURCE LINE # 424
	ORL  	UCON,#01H
; 
; 
;     SpecificIncrementSectorAddress();
			; SOURCE LINE # 427
	LCALL	SpecificIncrementSectorAddress
;    }
			; SOURCE LINE # 428
?C0027:
; 
;   if (TransferLength == 0)
			; SOURCE LINE # 430
	MOV  	A,TransferLength+01H
	ORL  	A,TransferLength
	JNZ  	?C0050
;    {
			; SOURCE LINE # 431
;     ReturnCSW();                             // return status
			; SOURCE LINE # 432
	LCALL	ReturnCSW
;    }
			; SOURCE LINE # 433
?C0050:
; 
;   UPSD_xreg.DATAOUT_D = 255;                 // WRITE done, RED LED OFF !
			; SOURCE LINE # 435
	MOV  	DPTR,#UPSD_xreg+013H
	MOV  	A,#0FFH
	MOVX 	@DPTR,A
;  }
			; SOURCE LINE # 436
	RET  	
; END OF WriteBufferToFlash

; 
; void ReadBufferFromFlash(void)

	RSEG  ?PR?ReadBufferFromFlash?UPSD3400_USB_APP
ReadBufferFromFlash:
			; SOURCE LINE # 438
; /******************************************************************************
;  Function   : void ReadBufferFromFlash()
;  Parameters : (none)
;  Description: Reads (sends) TransferLength sectors with length of 512 bytes
;  ******************************************************************************/
;  {
			; SOURCE LINE # 444
; 
; 
;   if (TransferLength == 0)
			; SOURCE LINE # 447
	MOV  	A,TransferLength+01H
	ORL  	A,TransferLength
	JNZ  	?C0052
;    {
			; SOURCE LINE # 448
;     ReturnCSW();                             // return status
			; SOURCE LINE # 449
	LJMP 	ReturnCSW
;    }
			; SOURCE LINE # 450
?C0052:
;   else
;    {
			; SOURCE LINE # 452
; #ifdef __RC51__                              //Compiler: Raisonance
;       #pragma asm
;         ;The following equates are also defined in usb.h
;         ; and should be the same in both places.
; 		;The following EQUates are only needed when using RIDE. 
;               USB_BASE_ADDR    EQU 7000H    ;USB FIFO mapped in XDATA space
;               INDIR            EQU 0
;               SELEP1           EQU 1
;               UMSC_IN_ENDPOINT EQU SELEP1
;       #pragma endasm
; #endif
;       #pragma asm
;               mov    DPTM,#0
	  mov    DPTM,#0
;               mov    DPTC,#1
	  mov    DPTC,#1
;               mov    DPH,PhysicalDataAddr+0
	  mov    DPH,PhysicalDataAddr+0
;               mov    DPL,PhysicalDataAddr+1
	  mov    DPL,PhysicalDataAddr+1
;               mov    DPTM,#10
	  mov    DPTM,#10
;               mov    USEL,#INDIR+UMSC_IN_ENDPOINT
	  mov    USEL,#0x00+0x01
;               mov    DPTC,#0
	  mov    DPTC,#0
;               mov    DPTR,#USB_BASE_ADDR
	  mov    DPTR,#0x7000
;               mov    DPTC,#64+1
	  mov    DPTC,#64+1
;               mov    B,#64
	  mov    B,#64
;               movx   A,@DPTR
	  movx   A,@DPTR
;               cpl    A
	  cpl    A
;               movx   @DPTR,A
	  movx   @DPTR,A
;               djnz   B,$-3
	  djnz   B,$-3
;               mov    USIZE,#64                                         ; FIRE!
	  mov    USIZE,#64                                         ; FIRE!
;               mov    DPTM,#0
	  mov    DPTM,#0
;               mov    DPTC,#0
	  mov    DPTC,#0
;       #pragma endasm
;       SpecificIncrementSectorAddress();
			; SOURCE LINE # 483
	LCALL	SpecificIncrementSectorAddress
; 
; /*gbCSWStatus = FAIL;*/
;    }
			; SOURCE LINE # 486
;  }
			; SOURCE LINE # 487
?C0054:
	RET  	
; END OF ReadBufferFromFlash

; 
; void DoReadWrite(void)

	RSEG  ?PR?DoReadWrite?UPSD3400_USB_APP
DoReadWrite:
	USING	0
			; SOURCE LINE # 489
; /*--------------------------------------------------------------------
;   Function   : void DoReadWrite()
;   Parameters : none
;   Description: Handler for READ and WRITE command
;   ---------------------------------------------------------------------*/
;  {
			; SOURCE LINE # 495
;   data unsigned long LogicalBlockAddr;
; 
; /* Decode the Command Descriptor Block (CDB)
;   Byte 0 OPERATION CODE
;   Byte 1 Reserved
;   Byte 2,3,4,5 (MSB) LOGICAL BLOCK ADDRESS (LSB)
;   Byte 6 Reserved
;   Byte 7 (MSB)
;   Byte 8 TRANSFER LENGTH (LSB)
;   Byte 9 CONTROL = 00h
;   The LOGICAL BLOCK ADDRESS field specifies the first logical block of the range
;   of logical blocks that shall be read.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -