;	[]===========================================================[]
;
;	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
;----------------------------------------------------------------------------
;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.
;			Move all RXX and added Flash1M_16K_8K_8K_Unit definition
;			old file updateed to R04
;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		;R06

;[]========================================================================[]
; AM29F002T_Flash_Erase :
;
;	Erase AM29F002T PARAMETER BLOCK (FA000h - FBFFFh)
;
;Saves : None
;Input : None
;
;Output: CF = 0 , Successful
;	 CF = 1 , Error Erase
;
;[]========================================================================[]
AT49F001T_Flash_Erase:			;;;R05

AM29F002T_Flash_Erase	Proc	Near

		push	di

		mov     di, 05555h		;R04; es:di = 05555h	
		mov     al, 0AAh		; 1st byte [0555] = AAh
		mov	dx,offset Ct_Set_Flash 
		call	dx

		mov     di, 02AAAh		;R04 ;ds:si = 02AAAh
		mov     al, 055h		; 2nd byte [0AAA] = 55h
		mov	dx,offset Ct_Set_Flash
		call	dx

		mov     di, 05555h		;R04; es:di = 05555h	
		mov     al, 80h			; 3rd byte [0555] = 80h
		mov	dx,offset Ct_Set_Flash
		call	dx

		mov     di, 05555h		;R04; es:di = 05555h	
		mov     al, 0AAh 		; 4th byte [0555] = AAh
		mov	dx,offset Ct_Set_Flash
		call	dx

		mov     di, 02AAAh		;R04 ;ds:si = 02AAAh
		mov     al, 055h		; 5th byte [0AAA] = 55h
		mov	dx,offset Ct_Set_Flash
		call	dx

		pop	di

		mov     al, 30h			; 6th byte [0555] = 30h
		mov	dx,offset Ct_Set_Flash
		call	dx
		mov	dx,offset EEPROM_Wait_10ms
		call	dx
ifdef	More_Flash_Wait_Time
		mov	dx,offset EEPROM_Wait_10ms
		call	dx
		mov	dx,offset EEPROM_Wait_10ms
		call	dx
endif;	More_Flash_Wait_Time

		pusha

		mov	dx,offset Ct_Get_Flash
		call	dx
		mov	bh,al
AM29F002T_Erase_Verify:
		mov	dx,offset Ct_Get_Flash
		call	dx
		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	dx,offset Ct_Get_Flash
		call	dx
		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:			;R05
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	dx,offset Ct_Set_Flash
		call	dx
		call	AM29F002T_Check_Toggle_Ready

		jc	short AM29F002NT_Toggle_error	;R03

	;; Make Sure Program Correct
		mov	dx,offset Ct_Get_Flash
		call	dx
		cmp	al,ds:[si]
		je	short AM29F002T_Verify_OK
AM29F002NT_Toggle_error:				;R03
		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
		push	di
		push	ax

		mov     di, 05555h		;R04; es:di = 05555h	
		mov	al,0aah
		mov	dx,offset Ct_Set_Flash
		call	dx

		mov     di, 02AAAh		;R04 ;ds:si = 02AAAh
		mov	al,55h
		mov	dx,offset Ct_Set_Flash
		call	dx

		mov     di, 05555h		;R04; es:di = 05555h	
		mov	al,0a0h
		mov	dx,offset Ct_Set_Flash


		call	dx

		pop	ax
		pop	di
		ret
AM29F002T_Prg_Sequence	endp

AM29F002T_Check_Toggle_Ready	proc	near
		clc
		push	ax
		push	bx
AM29F002T_CTR_TOG1:
		mov	dx,offset Ct_Get_Flash
		call	dx
		mov	ah,ds:[si]			;Read Source Bit once
		and	ax,8080h
		cmp	al,ah
		je	short AM29F002T_CTR_TOG3

AM29F002T_CTR_TOG2:
		mov	bl,ah
		mov	dx,offset Ct_Get_Flash
		call	dx
		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
;R06 - start
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:			;R05

AM29F002T_Flash_Erase	Proc	Near
		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],080h
		mov	byte ptr es:[edi + 05555h],0aah
		mov	byte ptr es:[edi + 02AAAh],055h
		pop	edi
		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:			;R05
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
		mov	byte ptr es:[0FFFF5555h],0aah
		mov	byte ptr es:[0FFFF2AAAh],055h
		mov	byte ptr es:[0FFFF5555h],0a0h

		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:				;R03
		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		
;R06 - end

