www.pudn.com > hpbios.rar > AM29F002.NVM


;	[]===========================================================[] 
; 
;	NOTICE: THIS PROGRAM BELONGS TO AWARD SOFTWARE INTERNATIONAL(R) 
;	        INC. IT IS CONSIDERED A TRADE SECRET AND IS NOT TO BE 	 
;	        DIVULGED OR USED BY PARTIES WHO HAVE NOT RECEIVED	 
;	        WRITTEN AUTHORIZATION FROM THE OWNER. 
; 
; 	[]===========================================================[] 
; 
 
;---------------------------------------------------------------------------- 
;Rev	Date	 Name	Description 
;---------------------------------------------------------------------------- 
;R09 	02/16/00 BAR	Support winbond LPC W49V002 2M Flash  
;			Move old code 
;R08 	02/01/00 BAR	Added define post flash write use XDGROUP 
;R07 	07/20/99 BAR	Support  use SMI update flash ROM . 
;			Move all RXX . 
;R06	01/28/99 BAR	Support update ESCD DMI in SMM mode. 
;			define switch "Flash_IN_SMBASE" 
;R05	05/14/98 BAR	Support ATMEL 49F001T 1M flash. 
;R04	13/04/98 BAR	Added support ATMEL AT49F002T 
;			AMD 29F002T only use A0-A12  0X555h=05555h 
;R03	06/01/98 BAR	Fixed system hold when AM29F002NT write protection 
;			by EEPROM write. 
;R02	05/02/97 AVN	Added More Wait For SIS 5597/8, 5581/2 Updating ESCD Succes. 
;R01	12/05/96 AVN	Suppost Both With/out Define ESCD_M2 and Save Code. 
;R00	07/02/96 AVN	Initial Revision. 
 
;**************************************************************** 
;*								* 
;*	SUBROUTINES TO SUPPORT AMD 2M TYPE FLASH ROM		* 
;*								* 
;**************************************************************** 
 
ifndef	Flash_IN_SMBASE	 
;[]========================================================================[] 
; AM29F002T_Flash_Erase : 
; 
;	Erase AM29F002T PARAMETER BLOCK (FA000h - FBFFFh) 
; 
;Saves : None 
;Input : None 
; 
;Output: CF = 0 , Successful 
;	 CF = 1 , Error Erase 
; 
;[]========================================================================[] 
AT49F001T_Flash_Erase: 
 
AM29F002T_Flash_Erase	Proc	Near 
		pusha 
		mov	byte ptr gs:[05555h],0aah	; 
		mov	byte ptr gs:[02aaah],055h	; 
		mov	byte ptr gs:[05555h],080h	;page erase 
		mov	byte ptr gs:[05555h],0aah	;command 
		mov	byte ptr gs:[02aaah],055h	; 
		mov	byte ptr es:[di],030h		; 
ifNdef	POST_FLASH_IN_XGROUP				;R09 
		mov	dx,offset EEPROM_Wait_10ms 
		call	dx 
else;	POST_FLASH_IN_XGROUP				;R09 
		push	cx 
		mov	cx,350 
		call	dx 
		pop	cx 
endif;	POST_FLASH_IN_XGROUP				;R09 
 
		call	AM29F002T_Check_Toggle_Ready 
		jnc	AM29F002T_Erase_OK 
AM29F002T_Erase_Fail: 
		stc 
		popa 
		ret 
 
AM29F002T_Erase_OK: 
		mov	al,byte ptr es:[di] 
		cmp	al,0ffh 
		jne	short AM29F002T_Erase_Fail 
		clc 
		popa 
		ret 
AM29F002T_Flash_Erase	endp 
 
;[]====================================================================[] 
; AM29F002T_Flash_Write : 
; 
;	Program AM29F002T PARAMETER BLOCK 
; 
;Saves : 
;Input : Source	= DS : SI 
;	 Target	= ES : DI (Range = FA000h-FBFFFh) 
;	 Length	= CX 
; 
;Output: CF = 0 Successful 
;	 CF = 1	Error Program 
; 
;[]====================================================================[] 
 
AT49F001T_Flash_Write: 
AM29F002T_Flash_Write	Proc	Near 
		pusha 
 
AM29F002T_Prg_Next_Byte: 
		mov	bx,25				;Program Retry Count 
		mov	al,ds:[si]			;Read Data 
 
AM29F002T_Verify_Retry: 
		call	AM29F002T_Prg_Sequence 
		mov	byte ptr es:[di],al	;R08 
		call	AM29F002T_Check_Toggle_Ready 
		jc	short AM29F002NT_Toggle_error	 
 
	;; Make Sure Program Correct 
		mov	al, byte ptr es:[di]	;R08 
		cmp	al,ds:[si] 
		je	short AM29F002T_Verify_OK 
AM29F002NT_Toggle_error:				 
		dec	bx 
		jnz	short AM29F002T_Verify_Retry 
 
		stc					;Set Program Fail 
		jmp	short AM29F002T_Prog_Exit 
 
AM29F002T_Verify_OK: 
		inc	si 
		inc	di 
		loop	AM29F002T_Prg_Next_Byte 
		clc 
 
AM29F002T_Prog_Exit: 
 
		popa 
		ret 
AM29F002T_Flash_Write	Endp 
 
AM29F002T_Prg_Sequence	proc	near 
		mov	byte ptr gs:[05555h],0aah 
		mov	byte ptr gs:[02AAAh],055h 
		mov	byte ptr gs:[05555h],0a0h 
		ret 
AM29F002T_Prg_Sequence	endp 
 
AM29F002T_Check_Toggle_Ready	proc	near 
Toggle_Bit	=	01000000b 
		push	cx 
		push	bx 
		mov	ah, byte ptr es:[di] 
		mov	bx,1000 
Ststus_Read_Loop:   
		xor	cx,cx		 
Ststus_Read_Loop_1: 
		mov	al, byte ptr es:[di] 
		xor	ah,al 
		test	ah,Toggle_Bit 
		jz	short Toggle_End 
		mov	ah,al 
		loop	Ststus_Read_Loop_1 
		dec	bx 
		jnz	Ststus_Read_Loop 
		stc				;Time out 
		pop	bx 
		pop	cx 
		ret 
Toggle_End: 
		clc 				;Toggle end 
		pop	bx 
		pop	cx 
		ret 
AM29F002T_Check_Toggle_Ready	endp 
 
else;	Flash_IN_SMBASE 
;[]========================================================================[] 
; AM29F002T_Flash_Erase : 
; 
;	Erase AM29F002T PARAMETER BLOCK (FA000h - FBFFFh) 
; 
;Saves : None 
;Input : None 
; 
;Output: CF = 0 , Successful 
;	 CF = 1 , Error Erase 
; 
;[]========================================================================[] 
AT49F001T_Flash_Erase: 
 
AM29F002T_Flash_Erase	Proc	Near 
		push	esi	 
		push	edi 
 
		mov	esi,0FFFF5555H 
		mov	edi,0FFFF2AAAH 
		mov	byte ptr es:[esi],0AAh 
		mov	byte ptr es:[edi],055h 
		mov	byte ptr es:[esi],080h 
		mov	byte ptr es:[esi],0AAh 
		mov	byte ptr es:[edi],055h 
		pop	edi 
		pop	esi	 
		mov	byte ptr es:[edi],30h 
		push	cx 
ifdef	More_Flash_Wait_Time 
		mov	cx,350 * 3		 
else;	More_Flash_Wait_Time 
		mov	cx,350	 
endif;	More_Flash_Wait_Time 
		call	dx		;delay time = (30ns)* cx =10.5ms 
		pop	cx 
	 
		pusha 
		mov	al,byte ptr es:[edi] 
		mov	bh,al 
AM29F002T_Erase_Verify: 
		mov	al,byte ptr es:[edi] 
		mov	bl,bh 
		xor	bh,al 
		test	bh,40h 
		mov	bh,al 
		jz	short AM29F002T_Erase_OK 
 
		test	bl,20h 
		jz	short AM29F002T_Erase_Verify 
 
		mov	al,byte ptr es:[edi] 
		xor	bl,al 
		test	bl,40h 
		jz	short AM29F002T_Erase_OK 
 
AM29F002T_Erase_Fail: 
		stc 
		popa 
		ret 
 
AM29F002T_Erase_OK: 
		cmp	al,0ffh 
		jne	short AM29F002T_Erase_Fail 
		clc 
		popa 
		ret 
AM29F002T_Flash_Erase	endp 
 
;[]====================================================================[] 
; AM29F002T_Flash_Write : 
; 
;	Program AM29F002T PARAMETER BLOCK 
; 
;Saves : 
;Input : Source	= DS : SI 
;	 Target	= ES : DI (Range = FA000h-FBFFFh) 
;	 Length	= CX 
; 
;Output: CF = 0 Successful 
;	 CF = 1	Error Program 
; 
;[]====================================================================[] 
 
AT49F001T_Flash_Write:			 
AM29F002T_Flash_Write	Proc	Near 
 
		pusha 
 
AM29F002T_Prg_Next_Byte: 
		mov	bx,25				;Program Retry Count 
		mov	al,byte ptr ds:[esi]		;Read Data 
 
AM29F002T_Verify_Retry: 
	;   Program Sequence 
		push	edi 
		mov	edi,0FFFF0000H 
		mov	byte ptr es:[edi + 05555h],0aah 
		mov	byte ptr es:[edi + 02AAAh],055h 
		mov	byte ptr es:[edi + 05555h],0A0h 
		pop	edi 
		mov	byte ptr es:[edi],al			;Write Data 
		call	AM29F002T_Check_Toggle_Ready 
		jc	short AM29F002NT_Toggle_error 
 
	;; Make Sure Program Correct 
		mov	al,byte ptr es:[edi] 
		cmp	al,byte ptr ds:[esi] 
		je	short AM29F002T_Verify_OK 
AM29F002NT_Toggle_error:				 
		dec	bx 
		jnz	short AM29F002T_Verify_Retry 
 
		stc					;Set Program Fail 
		jmp	short AM29F002T_Prog_Exit 
 
AM29F002T_Verify_OK: 
		inc	esi 
		inc	edi 
		loop	AM29F002T_Prg_Next_Byte 
		clc 
 
AM29F002T_Prog_Exit: 
 
		popa 
		ret 
AM29F002T_Flash_Write	Endp 
 
AM29F002T_Check_Toggle_Ready	proc	near 
		clc 
		push	ax 
		push	bx 
AM29F002T_CTR_TOG1: 
		mov	al,byte ptr es:[edi] 
		mov	ah,byte ptr ds:[esi]			;Read Source Bit once 
		and	ax,8080h 
		cmp	al,ah 
		je	short AM29F002T_CTR_TOG3 
 
AM29F002T_CTR_TOG2: 
		mov	bl,ah 
		mov	al,byte ptr es:[edi] 
		and	al,0a0h 
		test	al,20h 
		jz	short AM29F002T_CTR_TOG1 
		and	al,80h 
		cmp	al,bl 
		je	short AM29F002T_CTR_TOG3 
		stc 
AM29F002T_CTR_TOG3: 
		pop	bx 
		pop	ax 
		ret 
AM29F002T_Check_Toggle_Ready	endp 
 
endif;	Flash_IN_SMBASE