www.pudn.com > usbcode.rar > NFlash32.s


	.module NFlash32.c 
	.area data(ram, con, rel) 
_WriteResidueVal:: 
	.blkb 2 
	.area idata 
	.word 0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c 
	.dbsym s WriteResidueVal _WriteResidueVal i 
_Flash_Write_Sec:: 
	.blkb 1 
	.area idata 
	.byte 0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c 
	.dbsym s Flash_Write_Sec _Flash_Write_Sec c 
_Flash_Write_Col:: 
	.blkb 1 
	.area idata 
	.byte 0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c 
	.dbsym s Flash_Write_Col _Flash_Write_Col c 
_Flash_Write_addl:: 
	.blkb 1 
	.area idata 
	.byte 0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c 
	.dbsym s Flash_Write_addl _Flash_Write_addl c 
_Flash_Write_addh:: 
	.blkb 1 
	.area idata 
	.byte 0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c 
	.dbsym s Flash_Write_addh _Flash_Write_addh c 
_ReadResidueVal:: 
	.blkb 4 
	.area idata 
	.word 0,0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c 
	.dbsym s ReadResidueVal _ReadResidueVal l 
_Flash_Read_Sec:: 
	.blkb 1 
	.area idata 
	.byte 0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c 
	.dbsym s Flash_Read_Sec _Flash_Read_Sec c 
_Flash_Read_Col:: 
	.blkb 1 
	.area idata 
	.byte 0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c 
	.dbsym s Flash_Read_Col _Flash_Read_Col c 
_Flash_Read_addl:: 
	.blkb 1 
	.area idata 
	.byte 0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c 
	.dbsym s Flash_Read_addl _Flash_Read_addl c 
_Flash_Read_addh:: 
	.blkb 1 
	.area idata 
	.byte 0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c 
	.dbsym s Flash_Read_addh _Flash_Read_addh c 
	.area text(rom, con, rel) 
	.dbfile G:\source\NFlash32.c 
	.dbfunc s flashErase _flashErase fI 
;              i -> R20 
;           addl -> R22 
;           addh -> R10 
	.even 
_flashErase:: 
	rcall push_gset3 
	mov R22,R18 
	mov R10,R16 
	sbiw R28,4 
	.dbline -1 
	.dbline 61 
; /*++ 
;  
; Module Name: 
;  
;          NFlash32.c 
;  
; Abstract: 
;  
;          Header file related to D12 module 
;  
; Environment: 
;  
;         ICCAVR 6.29 
;  
; Revision History: 
;  
;         04/23/2004      chenchi   created 
;  
; --*/ 
; /******************************************************************/ 
; #include "io8515v.h" 
; #include "d12.h" 
; #include "scsi.h" 
; #include "nflash32.h" 
;  
; unsigned int WriteResidueVal = 0; 
; unsigned char Flash_Write_Sec = 0x00; 
; unsigned char Flash_Write_Col = 0x00; 
; unsigned char Flash_Write_addl = 0x00; 
; unsigned char Flash_Write_addh = 0x00; 
; unsigned long ReadResidueVal = 0; 
; unsigned char Flash_Read_Sec = 0x00; 
; unsigned char Flash_Read_Col = 0x00; 
; unsigned char Flash_Read_addl = 0x00; 
; unsigned char Flash_Read_addh = 0x00; 
;  
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:块擦除函数 
; **函数输入参数及说明: 
;   addh:高地址 
;   addl:低地址 
;  
; **函数返回值:无 
; **在本函数以外定义的变量:fCOMMAND,fADD,fWPs,fWPc,fRB 
; **调用的函数说明:无 
;  
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void flashErase(unsigned char addh,unsigned char addl) 
; { 
	.dbline 62 
; 	unsigned char i=0; 
	clr R20 
	.dbline 63 
; 	fWPs;//打开写保护 
	SBI 0x12,5 
	.dbline 63 
	.dbline 64 
; 	fCOMMAND = 0x60;//块擦除命令 
	ldi R24,96 
	sts 40960,R24 
	.dbline 65 
; 	fADD = addl;//低地址 
	sts 36864,R22 
	.dbline 66 
; 	fADD = addh;//高地址 
	sts 36864,R10 
	.dbline 67 
; 	fCOMMAND = 0xd0;//处理命令 
	ldi R24,208 
	sts 40960,R24 
	.dbline 68 
; 	asm("nop \n nop"); 
	nop  
	 nop 
L5: 
	.dbline 69 
L6: 
	.dbline 69 
; 	while(!fRB); 
	sbis 0x10,4 
	rjmp L5 
	.dbline 70 
; 	fCOMMAND = 0x70;//读状态命令 
	ldi R24,112 
	sts 40960,R24 
	.dbline 71 
; 	i = fDATA;//读状态值 
	lds R20,32768 
	.dbline 72 
; 	csram; 
	sts 0xfc01,R22 
	.dbline 72 
	.dbline 73 
; 	fWPc;//写保护 
	CBI 0x12,5 
	.dbline 73 
	.dbline 74 
; 	printf("%x,%x erase is %x",addh,addl,i);//串口打印 
	mov R2,R20 
	clr R3 
	std y+2,R2 
	std y+3,R3 
	mov R2,R22 
	clr R3 
	std y+0,R2 
	std y+1,R3 
	mov R18,R10 
	clr R19 
	ldi R16,L8 
	rcall _printf 
	.dbline -2 
	.dbline 75 
; } 
L4: 
	adiw R28,4 
	rcall pop_gset3 
	.dbline 0 ; func end 
	ret 
	.dbsym r i 20 c 
	.dbsym r addl 22 c 
	.dbsym r addh 10 c 
	.dbfunc s flashWritecmd _flashWritecmd fI 
;      Start_add -> y+9 
;        End_add -> y+7 
;   WritePageNum -> y+5 
;    Erase_Count -> y+3 
;     Erase_addh -> R14 
;  Dest_two_addh -> R22 
;  Sour_two_addh -> R10 
;      Dest_addh -> y+19 
;      Sour_addh -> y+18 
; CopyBack_two_count -> y+16 
; CopyBack_Count -> y+14 
;     Erase_addl -> y+13 
;  Dest_two_addl -> R12 
;  Sour_two_addl -> R20 
;      Dest_addl -> y+12 
;      Sour_addl -> y+11 
;              i -> R6,R7 
	.even 
_flashWritecmd:: 
	rcall push_gset5 
	sbiw R28,20 
	.dbline -1 
	.dbline 98 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:写FLASH预处理函数 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量: 
; **调用的函数说明:无 
;  
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void flashWritecmd(void) 
; { 
	.dbline 102 
; 	unsigned char Erase_addh,Erase_addl; 
; 	unsigned char Sour_addh,Sour_addl,Dest_addh,Dest_addl; 
; 	unsigned char Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl; 
; 	unsigned int Erase_Count = 0,i = 0; 
	clr R2 
	clr R3 
	std y+3,R2 
	std y+4,R3 
	.dbline 102 
	clr R6 
	clr R7 
	.dbline 103 
; 	unsigned int CopyBack_Count = 0; 
	clr R0 
	clr R1 
	std y+14,R0 
	std y+15,R1 
	.dbline 104 
; 	unsigned int CopyBack_two_count = 0; 
	std y+16,R0 
	std y+17,R1 
	.dbline 105 
; 	unsigned int WritePageNum = 0; 
	clr R2 
	std y+5,R2 
	std y+6,R3 
	.dbline 124 
; 	union{ 
; 		unsigned char c[2]; 
; 		unsigned int add; 
; 	}Start_add; 
; 	union{ 
; 		unsigned char c[2]; 
; 		unsigned int add; 
; 	}End_add; 
; 	/************说明***************** 
; 	  对于FLASH的写操作原理是,写之前 
; 	  必须擦除,FLASH写是按页写,但是擦 
; 	  除是按块擦除,1块 = 32页,所以在 
; 	  一块内只有部分页被写入时就需要先 
; 	  将块内其他页保存,代整块擦除后一起 
; 	  写入,这里用0XFA,0X00作为头块缓冲, 
; 	  0XFB,0X00作为最后块缓冲,中间块采 
; 	  用直接擦除处理 
; 	**********************************/ 
; 	flashErase(0xfa, 0x00); 
	clr R18 
	ldi R16,250 
	push R6 
	push R7 
	rcall _flashErase 
	pop R7 
	pop R6 
	.dbline 125 
; 	Sour_addh = XmtBuff.b[19]; 
	lds R2,_XmtBuff+19 
	std y+18,R2 
	.dbline 126 
; 	Sour_addl = (XmtBuff.b[20]/0x20) * 0x20; 
	ldi R17,32 
	lds R16,_XmtBuff+20 
	rcall div8u 
	mov R2,R16 
	lsl R2 
	lsl R2 
	lsl R2 
	lsl R2 
	lsl R2 
	std y+11,R2 
	.dbline 127 
; 	Dest_addh = 0xfa; 
	ldi R24,250 
	std y+19,R24 
	.dbline 128 
; 	Dest_addl = (XmtBuff.b[20]/0x20) * 0x20; 
	ldi R17,32 
	lds R16,_XmtBuff+20 
	rcall div8u 
	mov R2,R16 
	lsl R2 
	lsl R2 
	lsl R2 
	lsl R2 
	lsl R2 
	std y+12,R2 
	.dbline 129 
; 	CopyBack_Count = XmtBuff.b[20]%0x20; 
	ldi R18,32 
	ldi R19,0 
	lds R16,_XmtBuff+20 
	clr R17 
	rcall mod16s 
	std y+14,R16 
	std y+15,R17 
	.dbline 130 
	clr R6 
	clr R7 
	rjmp L19 
L16: 
	.dbline 130 
	.dbline 131 
	ldd R0,y+12 
	std y+2,R0 
	ldd R0,y+19 
	std y+0,R0 
	ldd R18,y+11 
	ldd R16,y+18 
	push R6 
	push R7 
	rcall _flashCopyBLack 
	pop R7 
	pop R6 
	.dbline 132 
	ldd R0,y+11 
	inc R0 
	std y+11,R0 
	.dbline 133 
	ldd R0,y+12 
	inc R0 
	std y+12,R0 
	.dbline 134 
L17: 
	.dbline 130 
	mov R24,R6 
	mov R25,R7 
	adiw R24,1 
	mov R6,R24 
	mov R7,R25 
L19: 
	.dbline 130 
; 	for(i=0;i (0x20 - (XmtBuff.b[20] % 0x20))) 
	ldi R18,32 
	ldi R19,0 
	lds R16,_XmtBuff+20 
	clr R17 
	rcall mod16s 
	ldi R24,32 
	ldi R25,0 
	sub R24,R16 
	sbc R25,R17 
	ldd R30,y+5 
	ldd R31,y+6 
	andi R30,31 
	andi R31,0 
	cp R24,R30 
	cpc R25,R31 
	brsh L25 
	.dbline 142 
; 			Erase_Count ++; 
	ldd R24,y+3 
	ldd R25,y+4 
	adiw R24,1 
	std y+3,R24 
	std y+4,R25 
	.dbline 143 
	rjmp L25 
L24: 
	.dbline 143 
; 	}else if(XmtBuff.b[20] % 0x20){ 
	ldi R17,32 
	lds R16,_XmtBuff+20 
	rcall mod8u 
	tst R16 
	breq L29 
	.dbline 143 
	.dbline 144 
; 		Erase_Count ++; 
	ldd R24,y+3 
	ldd R25,y+4 
	adiw R24,1 
	std y+3,R24 
	std y+4,R25 
	.dbline 145 
; 	} 
L29: 
L25: 
	.dbline 146 
; 	Start_add.add = (XmtBuff.b[19]<<8)+XmtBuff.b[20]; 
	lds R2,_XmtBuff+20 
	clr R3 
	lds R4,_XmtBuff+19 
	clr R5 
	mov R5,R4 
	clr R4 
	add R4,R2 
	adc R5,R3 
	std y+9,R4 
	std y+10,R5 
	.dbline 147 
; 	End_add.add = Start_add.add + WritePageNum; 
	ldd R2,y+5 
	ldd R3,y+6 
	add R4,R2 
	adc R5,R3 
	std y+7,R4 
	std y+8,R5 
	.dbline 148 
; 	flashErase(0xfb, 0x00); 
	clr R18 
	ldi R16,251 
	push R6 
	push R7 
	rcall _flashErase 
	pop R7 
	pop R6 
	.dbline 149 
; 	Sour_two_addh = End_add.c[1]; 
	ldd R10,y+8 
	.dbline 150 
; 	Sour_two_addl = End_add.c[0]; 
	ldd R20,y+7 
	.dbline 151 
; 	Dest_two_addh = 0xfb; 
	ldi R22,251 
	.dbline 152 
; 	Dest_two_addl = End_add.c[0]; 
	ldd R12,y+7 
	.dbline 153 
; 	CopyBack_two_count = (Erase_Count * 0x20) - CopyBack_Count -WritePageNum; 
	ldi R18,5 
	ldi R19,0 
	ldd R16,y+3 
	ldd R17,y+4 
	rcall lsl16 
	mov R2,R16 
	mov R3,R17 
	ldd R0,y+14 
	ldd R1,y+15 
	sub R2,R0 
	sbc R3,R1 
	ldd R4,y+5 
	ldd R5,y+6 
	sub R2,R4 
	sbc R3,R5 
	std y+16,R2 
	std y+17,R3 
	.dbline 154 
	clr R6 
	clr R7 
	rjmp L38 
L35: 
	.dbline 154 
	.dbline 155 
	std y+2,R12 
	std y+0,R22 
	mov R18,R20 
	mov R16,R10 
	push R6 
	push R7 
	rcall _flashCopyBLack 
	pop R7 
	pop R6 
	.dbline 156 
	inc R20 
	.dbline 157 
	inc R12 
	.dbline 158 
L36: 
	.dbline 154 
	mov R24,R6 
	mov R25,R7 
	adiw R24,1 
	mov R6,R24 
	mov R7,R25 
L38: 
	.dbline 154 
; 	for(i=0;i R20,R21 
;       PageBuff -> R16,R17 
	.even 
_flashWrite:: 
	rcall push_gset1 
	.dbline -1 
	.dbline 205 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:写FLASH函数 
; **函数输入参数及说明:写入数据 
;  
; **函数返回值:无 
; **在本函数以外定义的变量: 
; **调用的函数说明:无 
;  
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void flashWrite(unsigned char * PageBuff) 
; { 
	.dbline 207 
; 	unsigned int i; 
; 	if(WriteResidueVal > 0) 
	lds R3,_WriteResidueVal+1 
	lds R2,_WriteResidueVal 
	tst R2 
	brne X0 
	tst R3 
	brne X1 
	rjmp L58 
X1: 
X0: 
	.dbline 208 
; 	{ 
	.dbline 209 
; 		fWPs;//打开写保护 
	SBI 0x12,5 
	.dbline 209 
	.dbline 210 
; 		fCOMMAND = 0x00;//从FRIST部分开始 
	clr R2 
	sts 40960,R2 
	.dbline 211 
; 		fCOMMAND = 0x80;//写FLASH命令 
	ldi R24,128 
	sts 40960,R24 
	.dbline 212 
; 		fADD = 0x00;//从0列开始 
	clr R2 
	sts 36864,R2 
	.dbline 213 
; 		fADD = Flash_Write_addl;//页地址低位 
	lds R2,_Flash_Write_addl 
	sts 36864,R2 
	.dbline 214 
; 		fADD = Flash_Write_addh;//页地址高位 
	lds R2,_Flash_Write_addh 
	sts 36864,R2 
	.dbline 216 
; 		 
; 		for(i=0;i<512;i++) 
	clr R20 
	clr R21 
	rjmp L63 
L60: 
	.dbline 217 
	.dbline 218 
	mov R30,R20 
	mov R31,R21 
	add R30,R16 
	adc R31,R17 
	ldd R2,z+0 
	sts 32768,R2 
	.dbline 219 
L61: 
	.dbline 216 
	subi R20,255  ; offset = 1 
	sbci R21,255 
L63: 
	.dbline 216 
	cpi R20,0 
	ldi R30,2 
	cpc R21,R30 
	brlo L60 
	.dbline 221 
; 		{ 
; 			fDATA = PageBuff[i];//写数据到FLASH指定页里 
; 		} 
; 		 
; 		fCOMMAND = 0x10; 
	ldi R24,16 
	sts 40960,R24 
	.dbline 222 
; 		asm("nop \n nop"); 
	nop  
	 nop 
L64: 
	.dbline 223 
L65: 
	.dbline 223 
; 		while(!fRB); 
	sbis 0x10,4 
	rjmp L64 
	.dbline 224 
; 		fCOMMAND = 0x70;//读状态值命令 
	ldi R24,112 
	sts 40960,R24 
	.dbline 225 
; 		i = fDATA;//读状态值 
	lds R20,32768 
	clr R21 
	.dbline 226 
; 		D12_COMMAND = 0xf2;//清端点缓冲区 
	ldi R24,242 
	sts 31745,R24 
	.dbline 227 
; 		csram; 
	sts 0xfc01,R22 
	.dbline 227 
	.dbline 228 
; 		fWPc;//写保护 
	CBI 0x12,5 
	.dbline 228 
	.dbline 230 
; 		 
; 		WriteResidueVal = WriteResidueVal - 1; 
	lds R25,_WriteResidueVal+1 
	lds R24,_WriteResidueVal 
	sbiw R24,1 
	sts _WriteResidueVal+1,R25 
	sts _WriteResidueVal,R24 
	.dbline 231 
; 		if(Flash_Write_addl== 255){ 
	lds R24,_Flash_Write_addl 
	cpi R24,255 
	brne L67 
	.dbline 231 
	.dbline 232 
; 			Flash_Write_addl= 0x00; 
	clr R2 
	sts _Flash_Write_addl,R2 
	.dbline 233 
; 			Flash_Write_addh++; 
	lds R24,_Flash_Write_addh 
	subi R24,255	; addi 1 
	sts _Flash_Write_addh,R24 
	.dbline 234 
; 		}else 
	rjmp L68 
L67: 
	.dbline 235 
; 			Flash_Write_addl++; 
	lds R24,_Flash_Write_addl 
	subi R24,255	; addi 1 
	sts _Flash_Write_addl,R24 
L68: 
	.dbline 236 
L58: 
	.dbline -2 
	.dbline 237 
; 	} 
; } 
L57: 
	rcall pop_gset1 
	.dbline 0 ; func end 
	ret 
	.dbsym r i 20 i 
	.dbsym r PageBuff 16 pc 
	.dbfunc s flashCopyBLack _flashCopyBLack fI 
;              i -> R20 
; Destination_addl -> R22 
; Destination_addh -> R10 
;    Source_addl -> R18 
;    Source_addh -> R16 
	.even 
_flashCopyBLack:: 
	rcall push_gset3 
	ldd R10,y+6 
	ldd R11,y+7 
	ldd R22,y+8 
	ldd R23,y+9 
	.dbline -1 
	.dbline 264 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:FLASH页拷贝命令 
; **函数输入参数及说明: 
;   Source_addh:源地址高位 
;   Source_addl:源地址低位 
;   Destination_addh:目的地址高位 
;   Destination_addl:目的地址低位 
;  
; **函数返回值:无 
; **在本函数以外定义的变量: 
; **调用的函数说明:无 
;  
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void flashCopyBLack(unsigned char Source_addh,unsigned char Source_addl,unsigned char Destination_addh,unsigned char Destination_addl) 
; { 
	.dbline 266 
; 	unsigned char i; 
; 	fWPs;//打开写保护 
	SBI 0x12,5 
	.dbline 266 
	.dbline 267 
; 	fCOMMAND = 0x00;//页拷贝命令 
	clr R2 
	sts 40960,R2 
	.dbline 269 
;         /*源地址*/ 
; 	fADD = 0x00; 
	sts 36864,R2 
	.dbline 270 
; 	fADD = Source_addl; 
	sts 36864,R18 
	.dbline 271 
; 	fADD = Source_addh; 
	sts 36864,R16 
	.dbline 272 
; 	asm("nop \n nop"); 
	nop  
	 nop 
L70: 
	.dbline 273 
L71: 
	.dbline 273 
; 	while(!fRB); 
	sbis 0x10,4 
	rjmp L70 
	.dbline 275 
; 	 
; 	fCOMMAND = 0x8a;//页拷贝命令 
	ldi R24,138 
	sts 40960,R24 
	.dbline 277 
; 	/*目的地址*/ 
; 	fADD = 0x00; 
	clr R2 
	sts 36864,R2 
	.dbline 278 
; 	fADD = Destination_addl; 
	sts 36864,R22 
	.dbline 279 
; 	fADD = Destination_addh; 
	sts 36864,R10 
	.dbline 280 
; 	asm("nop \n nop"); 
	nop  
	 nop 
L73: 
	.dbline 281 
L74: 
	.dbline 281 
; 	while(!fRB); 
	sbis 0x10,4 
	rjmp L73 
	.dbline 283 
; 	 
; 	fCOMMAND = 0x70;//读状态命令 
	ldi R24,112 
	sts 40960,R24 
	.dbline 284 
; 	i = fDATA;//读状态值 
	lds R20,32768 
	.dbline 285 
; 	csram; 
	sts 0xfc01,R22 
	.dbline 285 
	.dbline 286 
; 	fWPc;//写保护 
	CBI 0x12,5 
	.dbline 286 
	.dbline -2 
	.dbline 287 
; } 
L69: 
	rcall pop_gset3 
	.dbline 0 ; func end 
	ret 
	.dbsym r i 20 c 
	.dbsym r Destination_addl 22 c 
	.dbsym r Destination_addh 10 c 
	.dbsym r Source_addl 18 c 
	.dbsym r Source_addh 16 c 
	.dbfunc s flashReadcmd _flashReadcmd fI 
	.even 
_flashReadcmd:: 
	.dbline -1 
	.dbline 310 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:读FLASH预处理函数 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量: 
; **调用的函数说明:无 
;  
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void flashReadcmd(void) 
; { 
	.dbline 316 
; 	/****************说明************ 
; 	  对于FLASH的读原理为:FLASH的读 
; 	  可以是随机读取,所以这里只要给 
; 	  定读数据的首地址和读写长度 
; 	********************************/ 
; 	Flash_Read_Sec = 0x00; 
	clr R2 
	sts _Flash_Read_Sec,R2 
	.dbline 317 
; 	Flash_Read_Col = 0x00; 
	sts _Flash_Read_Col,R2 
	.dbline 318 
; 	Flash_Read_addl = XmtBuff.b[20]; 
	lds R2,_XmtBuff+20 
	sts _Flash_Read_addl,R2 
	.dbline 319 
; 	Flash_Read_addh = XmtBuff.b[19]; 
	lds R2,_XmtBuff+19 
	sts _Flash_Read_addh,R2 
	.dbline 320 
;   	ReadResidueVal = (XmtBuff.b[22]<<8) + XmtBuff.b[23]; 
	lds R2,_XmtBuff+23 
	clr R3 
	lds R4,_XmtBuff+22 
	clr R5 
	mov R5,R4 
	clr R4 
	add R4,R2 
	adc R5,R3 
	mov R2,R4 
	mov R3,R5 
	clr R4 
	sbrc R3,7 
	com R4 
	clr R5 
	sbrc R4,7 
	com R5 
	sts _ReadResidueVal+1,R3 
	sts _ReadResidueVal,R2 
	sts _ReadResidueVal+2+1,R5 
	sts _ReadResidueVal+2,R4 
	.dbline 321 
;       	ReadResidueVal = 512 * ReadResidueVal; 
	ldi R24,9 
	ldi R25,0 
	st -y,R24 
	mov R16,R2 
	mov R17,R3 
	mov R18,R4 
	mov R19,R5 
	rcall lsl32 
	sts _ReadResidueVal+1,R17 
	sts _ReadResidueVal,R16 
	sts _ReadResidueVal+2+1,R19 
	sts _ReadResidueVal+2,R18 
	.dbline 322 
; 	fCOMMAND = 0xff; 
	ldi R24,255 
	sts 40960,R24 
	.dbline 323 
; 	asm("nop \n nop"); 
	nop  
	 nop 
L81: 
	.dbline 324 
L82: 
	.dbline 324 
; 	while(!fRB); 
	sbis 0x10,4 
	rjmp L81 
	.dbline -2 
	.dbline 325 
; } 
L76: 
	.dbline 0 ; func end 
	ret 
	.dbfunc s flashRead _flashRead fI 
;           temp -> R10 
;              i -> R10 
	.even 
_flashRead:: 
	rcall push_gset4 
	.dbline -1 
	.dbline 348 
; /************************************************************ 
; **工程名称:U盘固件程序开发 
; **编译器类型及版本:ICCAVR 6.26C 
; **日期:2004.4.30 
; **创建人:陈驰 
; **所属单位:湖南大学计算机与通信学院 
;  
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0 
; **时钟频率:8MHZ 
;  
; **函数功能:读FLASH函数 
; **函数输入参数及说明:无 
;  
; **函数返回值:无 
; **在本函数以外定义的变量: 
; **调用的函数说明:无 
;  
; **修改人:陈驰 
; **修改日期:2004.4.30 
; **修改说明:创建 
; *************************************************************/ 
; void flashRead(void) 
; { 
	.dbline 351 
; 	unsigned char i; 
; 	unsigned char  temp; 
; 	if(ReadResidueVal > 0){ 
	ldi R16,L87 
	rcall lpm32 
	lds R5,_ReadResidueVal+2+1 
	lds R4,_ReadResidueVal+2 
	lds R3,_ReadResidueVal+1 
	lds R2,_ReadResidueVal 
	cp R2,R16 
	cpc R3,R17 
	cpc R4,R18 
	cpc R5,R19 
	brne X3 
	rjmp L85 
X3: 
	.dbline 351 
	.dbline 352 
; 		ReadResidueVal -= 64; 
	ldi R16,L88 
	rcall lpm32 
	lds R5,_ReadResidueVal+2+1 
	lds R4,_ReadResidueVal+2 
	lds R3,_ReadResidueVal+1 
	lds R2,_ReadResidueVal 
	sub R2,R16 
	sbc R3,R17 
	sbc R4,R18 
	sbc R5,R19 
	sts _ReadResidueVal+1,R3 
	sts _ReadResidueVal,R2 
	sts _ReadResidueVal+2+1,R5 
	sts _ReadResidueVal+2,R4 
	.dbline 353 
; 		temp = (unsigned char)(Flash_Read_Col + 64); 
	lds R24,_Flash_Read_Col 
	clr R25 
	subi R24,192  ; offset = 64 
	sbci R25,255 
	mov R10,R24 
	.dbline 354 
; 		fCOMMAND = Flash_Read_Sec; 
	lds R2,_Flash_Read_Sec 
	sts 40960,R2 
	.dbline 355 
; 		fADD = Flash_Read_Col; 
	lds R2,_Flash_Read_Col 
	sts 36864,R2 
	.dbline 356 
; 		fADD = Flash_Read_addl; 
	lds R2,_Flash_Read_addl 
	sts 36864,R2 
	.dbline 357 
; 		fADD = Flash_Read_addh; 
	lds R2,_Flash_Read_addh 
	sts 36864,R2 
	.dbline 358 
; 		asm("nop \n nop"); 
	nop  
	 nop 
L89: 
	.dbline 359 
L90: 
	.dbline 359 
; 		while(!fRB); 
	sbis 0x10,4 
	rjmp L89 
	.dbline 360 
; 		switch (Flash_Read_Sec) 
	lds R12,_Flash_Read_Sec 
	clr R13 
	tst R12 
	brne X4 
	tst R13 
	breq L95 
X4: 
	ldi R24,1 
	ldi R25,0 
	cp R12,R24 
	cpc R13,R25 
	breq L98 
	rjmp L92 
X2: 
	.dbline 361 
; 		{ 
L95: 
	.dbline 363 
; 			case 0x00: 
; 				if(temp == 0) 
	tst R10 
	brne L96 
	.dbline 364 
; 				{ 
	.dbline 365 
; 					Flash_Read_Sec = 0x01; 
	ldi R24,1 
	sts _Flash_Read_Sec,R24 
	.dbline 366 
; 					Flash_Read_Col = 0x00; 
	clr R2 
	sts _Flash_Read_Col,R2 
	.dbline 367 
; 				}else 
	rjmp L93 
L96: 
	.dbline 368 
; 				{ 
	.dbline 369 
; 					Flash_Read_Col += 64; 
	lds R24,_Flash_Read_Col 
	subi R24,192	; addi 64 
	sts _Flash_Read_Col,R24 
	.dbline 370 
; 				} 
	.dbline 371 
; 				break; 
	rjmp L93 
L98: 
	.dbline 373 
; 			case 0x01: 
; 				if(temp == 0) 
	tst R10 
	brne L99 
	.dbline 374 
; 				{ 
	.dbline 375 
; 					if(Flash_Read_addl == 255){ 
	lds R24,_Flash_Read_addl 
	cpi R24,255 
	brne L101 
	.dbline 375 
	.dbline 376 
; 						Flash_Read_addl = 0x00; 
	clr R2 
	sts _Flash_Read_addl,R2 
	.dbline 377 
; 						Flash_Read_addh ++; 
	lds R24,_Flash_Read_addh 
	subi R24,255	; addi 1 
	sts _Flash_Read_addh,R24 
	.dbline 378 
; 					}else 
	rjmp L102 
L101: 
	.dbline 379 
; 						Flash_Read_addl ++; 
	lds R24,_Flash_Read_addl 
	subi R24,255	; addi 1 
	sts _Flash_Read_addl,R24 
L102: 
	.dbline 380 
; 					Flash_Read_Sec = 0x00; 
	clr R2 
	sts _Flash_Read_Sec,R2 
	.dbline 381 
; 					Flash_Read_Col = 0x00; 
	sts _Flash_Read_Col,R2 
	.dbline 382 
; 				}else 
	rjmp L93 
L99: 
	.dbline 383 
; 				{ 
	.dbline 384 
; 					Flash_Read_Col += 64; 
	lds R24,_Flash_Read_Col 
	subi R24,192	; addi 64 
	sts _Flash_Read_Col,R24 
	.dbline 385 
; 				} 
	.dbline 386 
; 				break; 
L92: 
L93: 
	.dbline 389 
; 		} 
; 		 
; 		D12_COMMAND = 0x05;//选择端点(指针指向0位置) 
	ldi R24,5 
	sts 31745,R24 
	.dbline 390 
; 		cwait; 
	nop 
	.dbline 391 
; 		D12_COMMAND = 0xf0;//写缓冲区 
	ldi R24,240 
	sts 31745,R24 
	.dbline 392 
; 		cwait; 
	nop 
	.dbline 400 
; 		/**************************** 
; 	  	  缓冲区数据结构: 
; 	  	  字节1:保留,可为任意值 
; 	  	  字节2:数据字节的数目/长度 
; 	  	  字节3:数据字节1 
; 	  	  字节4:数据字节2 
; 		*****************************/ 
; 		D12_DATA = 0x00;//字节1 
	clr R2 
	sts 31744,R2 
	.dbline 401 
; 		cwait; 
	nop 
	.dbline 402 
; 		D12_DATA = 64;//字节2 
	ldi R24,64 
	sts 31744,R24 
	.dbline 403 
; 		csram; 
	sts 0xfc01,R22 
	.dbline 403 
	.dbline 404 
; 		for(i=0;i<64;i++) 
	clr R10 
	rjmp L106 
L103: 
	.dbline 405 
	.dbline 406 
	lds R2,32768 
	sts 31744,R2 
	.dbline 407 
	nop 
	.dbline 408 
L104: 
	.dbline 404 
	inc R10 
L106: 
	.dbline 404 
	mov R24,R10 
	cpi R24,64 
	brlo L103 
	.dbline 409 
	ldi R24,250 
	sts 31745,R24 
	.dbline 410 
	sts 0xfc01,R22 
	.dbline 410 
	.dbline 411 
L85: 
	.dbline -2 
	.dbline 412 
; 		{ 
; 			D12_DATA = fDATA;//写数据 
; 			cwait; 
; 		} 
; 		D12_COMMAND = 0xfa;//设置缓冲区有效(满标志) 
; 		csram; 
; 	} 
; } 
L84: 
	rcall pop_gset4 
	.dbline 0 ; func end 
	ret 
	.dbsym r temp 10 c 
	.dbsym r i 10 c 
	.area lit(rom, con, rel) 
L88: 
	.word 64,0 
L87: 
	.word 0,0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c 
L8: 
	.blkb 18 
	.area idata 
	.byte 37,'x,44,37,'x,32,'e,'r,'a,'s,'e,32,'i,'s,32,37 
	.byte 'x,0 
	.area data(ram, con, rel) 
	.dbfile G:\source\NFlash32.c