www.pudn.com > hpbios.rar > AMD29F.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 
;---------------------------------------------------------------------------- 
;R04   02/01/00 BAR	Added define post flash write use XDGROUP 
;R03 	07/20/99 BAR	Support  use SMI update flash ROM . 
;			Move all RXX . 
;R02	11/30/98 BAR	Update ESCD DMI use SMM mode. 
;			define switch "Flash_IN_SMBASE" 
;R01	12/05/96 AVN	Suppost Auto Detect EEPROM ID at POST 6 For 1M EEPROM 
 
 
;**************************************************************** 
;*								* 
;*	SUBROUTINES TO SUPPORT AMD 12V FLASH ROM		* 
;*								* 
;**************************************************************** 
 
ifndef	Flash_IN_SMBASE 
;[]========================================================================[] 
; AMD29F_Flash_Erase : 
; 
;	Erase AMD29F010 PARAMETER BLOCK (F8000h - FBFFFh) 
; 
;Saves : None 
;Input : None 
; 
;Output: CF = 0 , Successful 
;	 CF = 1 , Error Erase 
; 
;[]========================================================================[] 
 
		Public	AMD29F_Flash_Erase 
AMD29F_Flash_Erase	Proc	Near 
ifNdef	POST_FLASH_IN_XGROUP		;R04 
 
		push	di 
 
		mov     di, 5555h		; es:di = 15555 
		mov     al, 0AAh		; 1st byte [15555] = AAh 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Set_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Set_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
 
		mov     di, 2AAAh		; ds:si = 02AAA 
		mov     al, 055h		; 2nd byte [02AAA] = 55h 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Set_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Set_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
 
		mov     di, 5555h		; es:di = 15555 
		mov     al, 80h			; 3rd byte [15555] = 80h 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Set_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Set_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
 
		mov     di, 5555h		; es:di = 15555 
		mov     al, 0AAh 		; 4th byte [15555] = AA 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Set_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Set_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
 
		mov     di, 2AAAh		; ds:si = 02AAA 
		mov     al, 055h		; 5th byte [02AAA] = 55 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Set_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Set_Flash 
		call	dx  
endif;	AUTO_DETECT_EEPROM_ID 
 
		pop	di 
 
		mov     al, 30h			; 6th byte [15555] = 30 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Set_Flash 
		call    Wait_10ms       	; wait 10 ms until tww expires 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Set_Flash 
		call	dx 
		mov	dx,offset EEPROM_Wait_10ms 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
		pusha 
 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Get_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Get_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
		mov	bh,al 
 
;R04 - starts 
else;	POST_FLASH_IN_XGROUP 
		pusha 
		mov	byte ptr gs:[05555h],0aah	; 
		mov	byte ptr gs:[02aaah],055h	;SST 
		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	; 
		push	cx 
ifdef	More_Flash_Wait_Time				 
		mov	cx,350*2 
else;	More_Flash_Wait_Time				 
		mov	cx,350 
endif;	More_Flash_Wait_Time				 
		call	dx				 
		pop	cx 
		pusha 
		mov	bh, byte ptr es:[di] 
endif;	POST_FLASH_IN_XGROUP 
;R04	- ends 
AMD29F_Erase_Verify: 
ifNdef	POST_FLASH_IN_XGROUP			;R04 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Get_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Get_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID		 
 
else;	POST_FLASH_IN_XGROUP			;R04 
		mov	al, byte ptr es:[di]	;R04 
endif;	POST_FLASH_IN_XGROUP			;R04 
		mov	bl,bh 
		xor	bh,al 
		test	bh,40h 
		mov	bh,al 
		jz	short AMD29F_Erase_OK 
 
		test	bl,20h 
		jz	short AMD29F_Erase_Verify 
 
ifNdef	POST_FLASH_IN_XGROUP			;R04 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Get_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Get_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
else;	POST_FLASH_IN_XGROUP			;R04 
		mov	al, byte ptr es:[di]	;R04 
endif;	POST_FLASH_IN_XGROUP			;R04 
		xor	bl,al 
		test	bl,40h 
		jz	short AMD29F_Erase_OK 
		stc 
		popa 
		ret 
 
AMD29F_Erase_OK: 
		clc 
		popa 
		ret 
AMD29F_Flash_Erase	Endp 
 
;[]====================================================================[] 
; AMD29F_Flash_Write : 
; 
;	Program AMD29F010 PARAMETER BLOCK 
; 
;Saves : 
;Input : Source	= DS : SI 
;	 Target	= ES : DI (Range = F8000h-FBFFFh) 
;	 Length	= CX 
; 
;Output: CF = 0 Successful 
;	 CF = 1	Error Program 
; 
;[]====================================================================[] 
 
		public	AMD29F_Flash_Write 
AMD29F_Flash_Write	Proc	Near 
 
		pusha 
 
AMD29F_Prg_Next_Byte: 
		mov	bx,25				;Program Retry Count 
		mov	al,ds:[si]			;Read Data 
 
AMD29F_Verify_Retry: 
		call	AMD29F_Prg_Sequence 
ifNdef	POST_FLASH_IN_XGROUP			;R04 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Set_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Set_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
else;	POST_FLASH_IN_XGROUP			;R04 
		mov	byte ptr es:[di], al	;R04 
endif;	POST_FLASH_IN_XGROUP			;R04 
		call	AMD29F_Check_Toggle_Ready 
		jc	short AMD29F_Verify_Retry 
 
	;; Make Sure Program Correct 
ifNdef	POST_FLASH_IN_XGROUP			;R04 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Get_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Get_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
else;	POST_FLASH_IN_XGROUP			;R04 
		mov	al, byte ptr es:[di]	;R04 
endif;	POST_FLASH_IN_XGROUP			;R04 
		cmp	al,ds:[si] 
		je	short AMD29F_Verify_OK 
		dec	bx 
		jnz	short AMD29F_Verify_Retry 
 
		stc					;Set Program Fail 
		jmp	short AMD29F_Prog_Exit 
 
AMD29F_Verify_OK: 
		inc	si 
		inc	di 
		loop	AMD29F_Prg_Next_Byte 
		clc 
 
AMD29F_Prog_Exit: 
 
		popa 
		ret 
AMD29F_Flash_Write	Endp 
 
AMD29F_Prg_Sequence	proc	near 
ifNdef	POST_FLASH_IN_XGROUP			;R04 
		push	di 
		push	ax 
 
		mov	di,5555h 
		mov	al,0aah 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Set_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Set_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
 
		mov	di,2aaah 
		mov	al,55h 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Set_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Set_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
 
		mov	di,5555h 
		mov	al,0a0h 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Set_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Set_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
 
		pop	ax 
		pop	di 
else;	POST_FLASH_IN_XGROUP				;R04 
		mov	byte ptr gs:[05555h],0aah	;R04 
		mov	byte ptr gs:[02aaah],055h	;R04 
		mov	byte ptr gs:[05555h],0a0h	;R04 
endif;	POST_FLASH_IN_XGROUP				;R04 
 
		ret 
AMD29F_Prg_Sequence	endp 
 
AMD29F_Check_Toggle_Ready	proc	near 
ifNdef	POST_FLASH_IN_XGROUP		;R04 
		clc 
		push	ax 
		push	bx 
AMD29F_CTR_TOG1: 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Get_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Get_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
		mov	ah,ds:[si]			;Read Source Bit once 
		and	ax,8080h 
		cmp	al,ah 
		je	short AMD29F_CTR_TOG3 
 
AMD29F_CTR_TOG2: 
		mov	bl,ah 
ifndef	AUTO_DETECT_EEPROM_ID 
		call	Ct_Get_Flash 
else;	AUTO_DETECT_EEPROM_ID 
		mov	dx,offset Ct_Get_Flash 
		call	dx 
endif;	AUTO_DETECT_EEPROM_ID 
		and	al,0a0h 
		test	al,20h 
		jz	short AMD29F_CTR_TOG1 
		and	al,80h 
		cmp	al,bl 
		je	short AMD29F_CTR_TOG3 
		stc 
AMD29F_CTR_TOG3: 
		pop	bx 
		pop	ax 
		ret 
;R04 - starts 
else;	POST_FLASH_IN_XGROUP		 
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 
 
endif;	POST_FLASH_IN_XGROUP		 
;R04 - ends 
 
AMD29F_Check_Toggle_Ready	endp 
else;	Flash_IN_SMBASE 
;[]========================================================================[] 
; AMD29F_Flash_Erase : 
; 
;	Erase AMD29F010 PARAMETER BLOCK (F8000h - FBFFFh) 
; 
;Saves : None 
;Input : None 
; 
;Output: CF = 0 , Successful 
;	 CF = 1 , Error Erase 
; 
;[]========================================================================[] 
 
		Public	AMD29F_Flash_Erase 
AMD29F_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 
		mov	cx,350		;delay 
		call	dx 
		pop	cx 
 
		pusha 
		mov	al,es:[edi] 
		mov	bh,al 
AMD29F_Erase_Verify: 
		mov	al,es:[edi] 
		mov	bl,bh 
		xor	bh,al 
		test	bh,40h 
		mov	bh,al 
		jz	short AMD29F_Erase_OK 
 
		test	bl,20h 
		jz	short AMD29F_Erase_Verify 
		mov	al,es:[edi] 
 
		xor	bl,al 
		test	bl,40h 
		jz	short AMD29F_Erase_OK 
		stc 
		popa 
		ret 
 
AMD29F_Erase_OK: 
		clc 
		popa 
		ret 
AMD29F_Flash_Erase	Endp 
 
;[]====================================================================[] 
; AMD29F_Flash_Write : 
; 
;	Program AMD29F010 PARAMETER BLOCK 
; 
;Saves : 
;Input : Source	= DS : SI 
;	 Target	= ES : DI (Range = F8000h-FBFFFh) 
;	 Length	= CX 
; 
;Output: CF = 0 Successful 
;	 CF = 1	Error Program 
; 
;[]====================================================================[] 
 
		public	AMD29F_Flash_Write 
AMD29F_Flash_Write	Proc	Near 
 
		pusha 
 
AMD29F_Prg_Next_Byte: 
		mov	bx,25				;Program Retry Count 
		mov	al, byte ptr ds:[esi]		;Read Data 
 
AMD29F_Verify_Retry: 
		call	AMD29F_Prg_Sequence 
		mov	byte ptr es:[edi], al 
		call	AMD29F_Check_Toggle_Ready 
		jc	short AMD29F_Verify_Retry 
 
	;; Make Sure Program Correct 
		mov	al, byte ptr es:[edi] 
		cmp	al, byte ptr ds:[esi] 
		je	short AMD29F_Verify_OK 
		dec	bx 
		jnz	short AMD29F_Verify_Retry 
 
		stc					;Set Program Fail 
		jmp	short AMD29F_Prog_Exit 
 
AMD29F_Verify_OK: 
		inc	esi 
		inc	edi 
		loop	AMD29F_Prg_Next_Byte 
		clc 
 
AMD29F_Prog_Exit: 
 
		popa 
		ret 
AMD29F_Flash_Write	Endp 
 
AMD29F_Prg_Sequence	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],0A0h 
		pop	edi 
		pop	esi	 
		ret 
AMD29F_Prg_Sequence	endp 
 
AMD29F_Check_Toggle_Ready	proc	near 
		clc 
		push	ax 
		push	bx 
AMD29F_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 AMD29F_CTR_TOG3 
 
AMD29F_CTR_TOG2: 
		mov	bl,ah 
		mov	al, byte ptr es:[edi] 
		and	al,0a0h 
		test	al,20h 
		jz	short AMD29F_CTR_TOG1 
		and	al,80h 
		cmp	al,bl 
		je	short AMD29F_CTR_TOG3 
		stc 
AMD29F_CTR_TOG3: 
		pop	bx 
		pop	ax 
		ret 
AMD29F_Check_Toggle_Ready	endp 
 
endif;	Flash_IN_SMBASE	  
;R02 - end