;	[]===========================================================[]
;
;	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	05/08/98 KEN	Modified some codes to correspond to the ESCDCHIP
;			modification that using flat mode to update flash
;			ROM.(i.e. Don't destroy any segment registers at
;			flash ROM reading/writing routines.)
;R00	03/21/97 AVN	Initial Revision.

;****************************************************************
;*								*
;*	SUBROUTINES TO SUPPORT MXIC FLASH ROM			*
;*								*
;****************************************************************

;[]========================================================================[]
;
;	MXIC 28F2000TTC commands
;
;[]========================================================================[]
; MX28F2000TTC commands
MX_AUTO_ERASE_BLOCK_CMD_1	EQU	020H
MX_AUTO_ERASE_BLOCK_CMD_2	EQU	0D0H
MX_AUTO_PROGRAM			EQU	040H
MX_RESET			EQU	0FFH
RETRY_COUNT			EQU	10
ERASE_POLLING			EQU	1000
ifndef	Flash_IN_SMBASE		;R02
;[]========================================================================[]
; MX_28f002TTC_Flash_Erase:
;
;	Erase MXIC 28F002TTC PARAMETER BLOCK (FA000h - FBFFFh)
;
;Saves : None
;Input : None
;
;Output: CF = 0 , Successful
;	 CF = 1 , Error Erase
;
;[]========================================================================[]
MX_28f002TTC_Flash_Erase	Proc	Near

		push	bx
		push	cx
		push	di
;R01		push	es

		mov	al,MX_AUTO_ERASE_BLOCK_CMD_1	; Erase Command	1
		mov	dx,offset Ct_Set_Flash
		call	dx
 		mov	al,MX_AUTO_ERASE_BLOCK_CMD_2	; Erase Command	2
		mov	dx,offset Ct_Set_Flash
		call	dx

		mov	cx,ERASE_POLLING
Wait_MXIC_2MTTC_Erase_Ready:
		mov	dx,offset EEPROM_Wait_10ms
		call	dx
		mov	dx,offset Ct_Get_Flash
		call	dx
		test	al,80h
		jnz	short MXIC_2MTTC_EEPROM_Ready
		loop	Wait_MXIC_2MTTC_Erase_Ready

MXIC_2MTTC_Erase_Error:
		stc
		jmp	short MXIC_2MTTC_Erase_End

MXIC_2MTTC_EEPROM_Ready:
		test	al,20h				; Erase Successful ?
		jnz	short MXIC_2MTTC_Erase_Error
		clc

MXIC_2MTTC_Erase_End:
		pushf
 		mov	al, MX_RESET			; reset to ROM read status
		mov	dx,offset Ct_Set_Flash
		call	dx
 		mov	al, MX_RESET			; reset to ROM read status
		mov	dx,offset Ct_Set_Flash
		call	dx
		popf
;R01		pop	es
		pop	di
		pop	cx
		pop	bx
		ret
MX_28f002TTC_Flash_Erase	Endp

;[]====================================================================[]
; MX_28f002TTC_Flash_Write:
;
;	Program MXIC 28F002TTC PARAMETER BLOCK
;
;Saves :
;Input : Source	= DS : SI
;	 Target	= ES : DI (Range = FD000h-FDFFFh)
;	 Length	= CX
;
;Output: CF = 0 Successful
;	 CF = 1	Error Program
;
;[]====================================================================[]
MX_28f002TTC_Flash_Write	Proc	Near

		push	bx
		push	cx
		push	si
		push	di

MXIC_2MTTC_Prg_Next_Byte:
		push	cx
		mov	cx, RETRY_COUNT

MXIC_2MTTC_Prg_Retry:
		push	cx

	;; Write Commnad
		mov	al,byte ptr MX_AUTO_PROGRAM
		mov	dx,offset Ct_Set_Flash
		call	dx

	;; Write Data
		mov	al,byte ptr ds:[si]
		mov	dx,offset Ct_Set_Flash
		call	dx

	;; Wait ROM Cycle
		mov	cx, RETRY_COUNT
MXIC_2MTTC_Program_Polling:
		mov	dx,offset Ct_Get_Flash
		call	dx
		test	al,80h				; Wait EEPROM ready
		jnz	short MXIC_2MTTC_Data_Verify
		loop	MXIC_2MTTC_Program_Polling
		
MXIC_2MTTC_Data_Verify:
	;; Send Reset Command To ROM
 		mov	al, MX_RESET			; reset to ROM read status
		mov	dx,offset Ct_Set_Flash
		call	dx
 		mov	al, MX_RESET			; reset to ROM read status
		mov	dx,offset Ct_Set_Flash
		call	dx

	;; Verify Data
		mov	dx,offset Ct_Get_Flash
		call	dx
		cmp	al, ds:[si]
		pop	cx
		je	short MXIC_2MTTC_Prg_Verify_Ok
		loop	MXIC_2MTTC_Prg_Retry

		pop	cx
		stc
		pop	di
		pop	si
		pop	cx
		pop	bx
		ret

MXIC_2MTTC_Prg_Verify_Ok:
		pop	cx
		inc	si
		inc	di
		loop	short MXIC_2MTTC_Prg_Next_Byte

		clc
		pop	di
		pop	si
		pop	cx
		pop	bx
		ret
MX_28f002TTC_Flash_Write	Endp
;R02 - start
else;	Flash_IN_SMBASE
;[]========================================================================[]
; MX_28f002TTC_Flash_Erase:
;
;	Erase MXIC 28F002TTC PARAMETER BLOCK (FA000h - FBFFFh)
;
;Saves : None
;Input : None
;
;Output: CF = 0 , Successful
;	 CF = 1 , Error Erase
;
;[]========================================================================[]
MX_28f002TTC_Flash_Erase	Proc	Near

		pusha
		mov	al,MX_AUTO_ERASE_BLOCK_CMD_1	; Erase Command	1
		mov	es:[edi] , al
 		mov	al,MX_AUTO_ERASE_BLOCK_CMD_2	; Erase Command	2
		mov	es:[edi] , al

		mov	cx,ERASE_POLLING
Wait_MXIC_2MTTC_Erase_Ready:
		push	cx
		mov	cx,350		;350*30 = 10ms
		call	dx		;delay
		pop	cx
		mov	al , es:[edi] 
		test	al,80h
		jnz	short MXIC_2MTTC_EEPROM_Ready
		loop	Wait_MXIC_2MTTC_Erase_Ready

MXIC_2MTTC_Erase_Error:
		stc
		jmp	short MXIC_2MTTC_Erase_End

MXIC_2MTTC_EEPROM_Ready:
		test	al,20h				; Erase Successful ?
		jnz	short MXIC_2MTTC_Erase_Error
		clc

MXIC_2MTTC_Erase_End:
		pushf
 		mov	al, MX_RESET			; reset to ROM read status
		mov	es:[edi] , al
 		mov	al, MX_RESET			; reset to ROM read status
		mov	es:[edi] , al
		popf
		popa
		ret
MX_28f002TTC_Flash_Erase	Endp

;[]====================================================================[]
; MX_28f002TTC_Flash_Write:
;
;	Program MXIC 28F002TTC PARAMETER BLOCK
;
;Saves :
;Input : Source	= DS : SI
;	 Target	= ES : DI (Range = FD000h-FDFFFh)
;	 Length	= CX
;
;Output: CF = 0 Successful
;	 CF = 1	Error Program
;
;[]====================================================================[]
MX_28f002TTC_Flash_Write	Proc	Near

		pusha
MXIC_2MTTC_Prg_Next_Byte:
		push	cx
		mov	cx, RETRY_COUNT

MXIC_2MTTC_Prg_Retry:
		push	cx

	;; Write Commnad
		mov	al,byte ptr MX_AUTO_PROGRAM
		mov	es:[edi] , al
	;; Write Data
		mov	al,byte ptr ds:[esi]
		mov	es:[edi] , al
	;; Wait ROM Cycle
		mov	cx, RETRY_COUNT
MXIC_2MTTC_Program_Polling:
		mov	al , es:[edi]
		test	al,80h				; Wait EEPROM ready
		jnz	short MXIC_2MTTC_Data_Verify
		loop	MXIC_2MTTC_Program_Polling
		
MXIC_2MTTC_Data_Verify:
	;; Send Reset Command To ROM
 		mov	al, MX_RESET			; reset to ROM read status
		mov	es:[edi] , al
 		mov	al, MX_RESET			; reset to ROM read status
		mov	es:[edi] , al
	;; Verify Data
		mov	al , es:[edi]
		cmp	al, ds:[esi]
		pop	cx
		je	short MXIC_2MTTC_Prg_Verify_Ok
		loop	MXIC_2MTTC_Prg_Retry

		pop	cx
		stc
		popa
		ret

MXIC_2MTTC_Prg_Verify_Ok:
		pop	cx
		inc	esi
		inc	edi
		loop	short MXIC_2MTTC_Prg_Next_Byte

		clc
		popa
		ret
MX_28f002TTC_Flash_Write	Endp


endif;	Flash_IN_SMBASE		
;R02 - end

