;	[]===========================================================[]
;
;	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
;----------------------------------------------------------------------------
;R02	01/28/99 BAR	Support update ESCD DMI in SMM mode.
;			define switch "Flash_IN_SMBASE"
;R01	12/05/96 AVN	Suppost Auto Detect EEPROM ID at POST 6 For 1M EEPROM
;R00	05/28/96 AVN	Initial Revision.


;****************************************************************
;*								*
;*	SUBROUTINES TO SUPPORT AMD 12V FLASH ROM		*
;*								*
;****************************************************************

;R01 ifdef	AMD29F010
ifndef	Flash_IN_SMBASE		;R02
;[]========================================================================[]
; 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	di

		mov     di, 5555h		; es:di = 15555
		mov     al, 0AAh		; 1st byte [15555] = AAh
ifndef	AUTO_DETECT_EEPROM_ID			; R01
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			; R01
		mov	dx,offset Ct_Set_Flash	; R01
		call	dx			; R01
endif;	AUTO_DETECT_EEPROM_ID			; R01

		mov     di, 2AAAh		; ds:si = 02AAA
		mov     al, 055h		; 2nd byte [02AAA] = 55h
ifndef	AUTO_DETECT_EEPROM_ID			; R01
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			; R01
		mov	dx,offset Ct_Set_Flash	; R01
		call	dx			; R01
endif;	AUTO_DETECT_EEPROM_ID			; R01

		mov     di, 5555h		; es:di = 15555
		mov     al, 80h			; 3rd byte [15555] = 80h
ifndef	AUTO_DETECT_EEPROM_ID			; R01
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			; R01
		mov	dx,offset Ct_Set_Flash	; R01
		call	dx			; R01
endif;	AUTO_DETECT_EEPROM_ID			; R01

		mov     di, 5555h		; es:di = 15555
		mov     al, 0AAh 		; 4th byte [15555] = AA
ifndef	AUTO_DETECT_EEPROM_ID			; R01
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			; R01
		mov	dx,offset Ct_Set_Flash	; R01
		call	dx			; R01
endif;	AUTO_DETECT_EEPROM_ID			; R01

		mov     di, 2AAAh		; ds:si = 02AAA
		mov     al, 055h		; 5th byte [02AAA] = 55
ifndef	AUTO_DETECT_EEPROM_ID			; R01
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			; R01
		mov	dx,offset Ct_Set_Flash	; R01
		call	dx			; R01
endif;	AUTO_DETECT_EEPROM_ID			; R01

		pop	di

		mov     al, 30h			; 6th byte [15555] = 30
ifndef	AUTO_DETECT_EEPROM_ID			; R01
		call	Ct_Set_Flash
		call    Wait_10ms       	; wait 10 ms until tww expires
else;	AUTO_DETECT_EEPROM_ID				; R01
		mov	dx,offset Ct_Set_Flash		; R01
		call	dx				; R01
		mov	dx,offset EEPROM_Wait_10ms	; R01
		call	dx				; R01
endif;	AUTO_DETECT_EEPROM_ID				; R01

		pusha

ifndef	AUTO_DETECT_EEPROM_ID			; R01
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID			; R01
		mov	dx,offset Ct_Get_Flash	; R01
		call	dx			; R01
endif;	AUTO_DETECT_EEPROM_ID			; R01
		mov	bh,al
AMD29F_Erase_Verify:
ifndef	AUTO_DETECT_EEPROM_ID			; R01
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID			; R01
		mov	dx,offset Ct_Get_Flash	; R01
		call	dx			; R01
endif;	AUTO_DETECT_EEPROM_ID			; R01
		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	AUTO_DETECT_EEPROM_ID			; R01
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID			; R01
		mov	dx,offset Ct_Get_Flash	; R01
		call	dx			; R01
endif;	AUTO_DETECT_EEPROM_ID			; R01
		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	AUTO_DETECT_EEPROM_ID				; R01
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				; R01
		mov	dx,offset Ct_Set_Flash		; R01
		call	dx				; R01
endif;	AUTO_DETECT_EEPROM_ID				; R01
		call	AMD29F_Check_Toggle_Ready
		jc	short AMD29F_Verify_Retry

	;; Make Sure Program Correct
ifndef	AUTO_DETECT_EEPROM_ID				; R01
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID				; R01
		mov	dx,offset Ct_Get_Flash		; R01
		call	dx				; R01
endif;	AUTO_DETECT_EEPROM_ID				; R01
		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
		push	di
		push	ax

		mov	di,5555h
		mov	al,0aah
ifndef	AUTO_DETECT_EEPROM_ID				; R01
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				; R01
		mov	dx,offset Ct_Set_Flash		; R01
		call	dx				; R01
endif;	AUTO_DETECT_EEPROM_ID				; R01

		mov	di,2aaah
		mov	al,55h
ifndef	AUTO_DETECT_EEPROM_ID				; R01
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				; R01
		mov	dx,offset Ct_Set_Flash		; R01
		call	dx				; R01
endif;	AUTO_DETECT_EEPROM_ID				; R01

		mov	di,5555h
		mov	al,0a0h
ifndef	AUTO_DETECT_EEPROM_ID				; R01
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				; R01
		mov	dx,offset Ct_Set_Flash		; R01
		call	dx				; R01
endif;	AUTO_DETECT_EEPROM_ID				; R01

		pop	ax
		pop	di
		ret
AMD29F_Prg_Sequence	endp

AMD29F_Check_Toggle_Ready	proc	near
		clc
		push	ax
		push	bx
AMD29F_CTR_TOG1:
ifndef	AUTO_DETECT_EEPROM_ID				; R01
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID				; R01
		mov	dx,offset Ct_Get_Flash		; R01
		call	dx				; R01
endif;	AUTO_DETECT_EEPROM_ID				; R01
		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				; R01
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID				; R01
		mov	dx,offset Ct_Get_Flash		; R01
		call	dx				; R01
endif;	AUTO_DETECT_EEPROM_ID				; R01
		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

;R01 endif;	AMD29F010
;R02 - start
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
		mov	byte ptr es:[0FFFF5555h],0aah
		mov	byte ptr es:[0FFFF2aaah],055h
		mov	byte ptr es:[0FFFF5555h],080h
		mov	byte ptr es:[0FFFF5555h],0aah
		mov	byte ptr es:[0FFFF2aaah],055h
		mov	byte ptr es:[edi],30h
		push	cx
		mov	cx,350
		call	dx
;;;		call	EEPROM_Wait_10ms
		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
		mov	byte ptr es:[0FFFF5555h],0aah
		mov	byte ptr es:[0FFFF2aaah],055h
		mov	byte ptr es:[0FFFF5555h],0a0h
		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
