;	[]===========================================================[]
;
;	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
;----------------------------------------------------------------------------
;R11	01/28/99 BAR	Support update ESCD DMI in SMM mode.
;			define switch "Flash_IN_SMBASE"
;R10	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.)
;R09	12/05/96 AVN	Suppost Auto Detect EEPROM ID at POST 6 For 1M EEPROM
;R08	03/27/96 RAY	Support MXIC_28F1000AP become standard.
;R07	01/26/96 RCH	Codes for MXIC flash memory still be optional
;R06A	01/15/96 KEN	Restore original codes.
;R06	01/12/96 KEN	Support updating ESCD with high memory (below 4GB).
;R05	12/09/95 RAY	Support more than one Flash in one BIOS for PnP
;			  1. Always compile this code
;			  2. Change some lables from XXXX to MXIC_XXXX ....
;			     so that these labels will not conflict with 
;			     the other *.NVM files

;R04 ifdef	MXIC_28F1000AP
;R04 start
;R05ifdef	MXIC_28F1000AP
;R05MXIC_Flash	equ	1
;R05endif	;MXIC_28F1000AP
;R05ifdef MXIC_28F1000PL
;R05MXIC_Flash	equ	1
;R05endif	;MXIC_28F1000PL
;R05ifdef	MXIC_Flash
;R04 end

;R07 - start
;R08 ifdef 	MXIC_28F1000AP		
MXIC_Flash	EQU	1
;R08 endif; 	MXIC_28F1000AP		

ifdef	MXIC_28F1000PL
MXIC_Flash	EQU	1
endif;	MXIC_28F1000PL

;R07 - end

;****************************************************************
;*								*
;*	SUBROUTINES TO SUPPORT MXIC FLASH ROM			*
;*								*
;****************************************************************

;[]========================================================================[]
;
;	MXIC 28F1000AP commands
;
;[]========================================================================[]
; MX28F1000 commands
MX_READ_MEM_CMD			EQU	000H
MX_READ_ID_CMD			EQU	090H
MX_ERASE_CHIP			EQU	020H
MX_ERASE_BLOCK			EQU	060H
MX_ERASE_VERIFY			EQU	0A0H
MX_AUTO_ERASE_CHIP		EQU	030H
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	;R04A
ifndef	Flash_IN_SMBASE		;R11
;[]========================================================================[]
;R05; Ct_Flash_Erase:
; MXIC_Flash_Erase :					;R05
;
;	Erase Intel 28F001BX-T PARAMETER BLOCK (FD000h - FDFFFh)
;
;Saves : None
;Input : None
;
;Output: CF = 0 , Successful
;	 CF = 1 , Error Erase
;
;[]========================================================================[]
;R05		public	Ct_Flash_Erase
;R05Ct_Flash_Erase	proc	near

		Public	MXIC_Flash_Erase	;R05
MXIC_Flash_Erase	Proc	Near		;R05
ifdef	MXIC_Flash				;R07

		push	bx
		push	cx			;R06
		push	di
;R10		push	es

;R04A		mov	cx, RETRY_COUNT
;R05Erase_Retry:
MXIC_Erase_Retry:				;R05

;R04A		mov	al, MX_RESET			; Reset command
;R04A		call	Ct_Set_Flash
;R04A		mov	al, MX_RESET			; Reset command
;R04A		call	Ct_Set_Flash

		mov	al, MX_AUTO_ERASE_BLOCK_CMD_1	; Erase Command	1
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Set_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09
		mov	al, MX_AUTO_ERASE_BLOCK_CMD_2	; Erase Command	2
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Set_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09

		mov	cx, ERASE_POLLING		;R04A
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Get_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09
		mov	bl, al
MX_Erase_Polling:
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Get_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09
		xor	bl, al
		test	bl, 40h				; Test Toggle Bit
		mov	bl, al
		jnz	short MX_Erase_Polling

		test	bl, 10000000b			; Verify Bit
;R05		jnz	short Erase_Ok
		jnz	short MXIC_Erase_Ok		;R05
		loop	MX_Erase_Polling

;R05Erase_Error:
MXIC_Erase_Error:					;R05
		mov	al, MX_RESET			;reset to ROM read status
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Set_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09
		mov	al, MX_RESET			;reset to ROM read status
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Set_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09
		stc
;R10		pop	es
		pop	di
		pop	cx			;R06
		pop	bx
		ret

;R05Erase_Ok:
MXIC_Erase_Ok:						;R05
		mov	al, MX_RESET		;reset to ROM read status
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Set_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09
		mov	al, MX_RESET		;reset to ROM read status
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Set_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09
		clc
;R10		pop	es
		pop	di
		pop	cx			;R06
		pop	bx
endif;	MXIC_Flash				;R07
		ret

MXIC_Flash_Erase	Endp			;R05
;R05Ct_Flash_Erase	endp

;[]====================================================================[]
;R05; Ct_Flash_Write :
; MXIC_Flash_Write :					;R05
;
;	Program MXIC 28F1000AP PARAMETER BLOCK
;
;Saves :
;Input : Source	= DS : SI
;	 Target	= ES : DI (Range = FD000h-FDFFFh)
;	 Length	= CX
;
;Output: CF = 0 Successful
;	 CF = 1	Error Program
;
;[]====================================================================[]
;R05		public	Ct_Flash_Write
;R05Ct_Flash_Write	proc	near

		public	MXIC_Flash_Write		;R05
MXIC_Flash_Write	Proc	Near			;R05

ifdef	MXIC_Flash				;R07
		push	bx
		push	cx
		push	si
		push	di

;R05Prg_Next_Byte:
MXIC_Prg_Next_Byte:					;R05
		push	cx
		mov	cx, RETRY_COUNT
;R05Prg_Retry:
MXIC_Prg_Retry:						;R05
		push	cx

	;; Write Commnad
		mov	al,byte ptr MX_AUTO_PROGRAM
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Set_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09

	;; Write Data
		mov	al,byte ptr ds:[si]
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Set_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09

	;; Wait ROM Cycle
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Get_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09
		mov	bl,al
MX_Program_Polling:
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Get_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09
		xor	bl,al
		test	bl,40h				; Test Toggle Bit
		mov	bl,al
		jnz	short MX_Program_Polling
		
	;; Send Reset Command To ROM
		mov	al,byte ptr MX_RESET
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Set_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09
		mov	al,byte ptr MX_RESET
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Set_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09

	;; Verify Data
;R04A		call	Ct_Get_Flash
;R04A		mov	bl,al
;R04A		call	Ct_Get_Flash
;R04A		cmp	al,bl
ifndef	AUTO_DETECT_EEPROM_ID				;R09
		call	Ct_Get_Flash		;R04A
else;	AUTO_DETECT_EEPROM_ID				;R09
		mov	dx,offset Ct_Get_Flash		;R09
		call	dx				;R09
endif;	AUTO_DETECT_EEPROM_ID				;R09
		cmp	al, ds:[si]		;R04A
		pop	cx
;R05		je	short Prg_Verify_Ok
;R05		loop	Prg_Retry
;R05Prg_Error:
;R05 - starts
		je	short MXIC_Prg_Verify_Ok
		loop	MXIC_Prg_Retry

MXIC_Prg_Error:
;R05 - ends
		pop	cx
;R04A		mov	al, MX_RESET		;reset to ROM read status
;R04A		call	Ct_Set_Flash
;R04A		mov	al, MX_RESET		;reset to ROM read status
;R04A		call	Ct_Set_Flash
		stc
		pop	di
		pop	si
		pop	cx
		pop	bx
		ret

;R05Prg_Verify_Ok:
MXIC_Prg_Verify_Ok:				;R05
;R04A		mov	al, MX_RESET		;reset to ROM read status
;R04A		call	Ct_Set_Flash
;R04A		mov	al, MX_RESET		;reset to ROM read status
;R04A		call	Ct_Set_Flash
;R04A		call	Ct_Get_Flash
;R04A		cmp	al, ds:[si]
;R04A		jne	short Prg_Error
		pop	cx
		inc	si
		inc	di
;R05		loop	short Prg_Next_Byte
		loop	short MXIC_Prg_Next_Byte	;R05

		clc
		pop	di
		pop	si
		pop	cx
		pop	bx
endif;	MXIC_Flash				;R07
		ret

;R05Ct_Flash_Write	endp
MXIC_Flash_Write	Endp				;R05

;R05;[]====================================================================[]
;R05; Delay 500ms for erasing completed
;R05; Check refresh toggle bit
;R05;[]====================================================================[]
;R05Erase_Delay	proc	near
;R05		push	bx
;R05		push	cx
;R05		xor	bx, bx
;R05		mov	cx, 17000
;R05		call	Wait_Refresh
;R05		pop	cx
;R05		pop	bx
;R05		ret
;R05Erase_Delay	endp
;R05
;R05;[]====================================================================[]
;R05; Delay 10us for programming completed
;R05; Check refresh toggle bit
;R05;[]====================================================================[]
;R05Write_Delay	proc	near
;R05		push	bx
;R05		push	cx
;R05		xor	bx, bx
;R05		mov	cx, 2
;R05		call	Wait_Refresh
;R05		pop	cx
;R05		pop	bx
;R05		ret
;R05Write_Delay	endp

;R04 endif	;MXIC_28F1000AP
;R05endif	;MXIC_Flash					;R04
;R11 - start
else;	Flash_IN_SMBASE
;[]========================================================================[]
; MXIC_Flash_Erase :	 
;
;	Erase Intel 28F001BX-T PARAMETER BLOCK (FD000h - FDFFFh)
;
;Saves : None
;Input : None
;
;Output: CF = 0 , Successful
;	 CF = 1 , Error Erase
;
;[]========================================================================[]
		Public	MXIC_Flash_Erase
MXIC_Flash_Erase	Proc	Near

		push	bx
		push	cx
		push	edi
MXIC_Erase_Retry:				
		; Erase Command	1
		mov	byte ptr es:[edi], MX_AUTO_ERASE_BLOCK_CMD_1
		; Erase Command	2
		mov	byte ptr es:[edi], MX_AUTO_ERASE_BLOCK_CMD_2	
		mov	cx, ERASE_POLLING		
		mov	al , es:[edi]
		mov	bl, al
MX_Erase_Polling:
		mov	al , es:[edi]
		xor	bl, al
		test	bl, 40h				; Test Toggle Bit
		mov	bl, al
		jnz	short MX_Erase_Polling

		test	bl, 10000000b			; Verify Bit
		jnz	short MXIC_Erase_Ok
		loop	MX_Erase_Polling
MXIC_Erase_Error:			      
		;reset to ROM read status
		mov	byte ptr es:[edi], MX_RESET
		;reset to ROM read status
		mov	byte ptr es:[edi], MX_RESET
		stc
		pop	edi
		pop	cx
		pop	bx
		ret

MXIC_Erase_Ok:						
		;reset to ROM read status
		mov	byte ptr es:[edi], MX_RESET
		;reset to ROM read status
		mov	byte ptr es:[edi], MX_RESET
		clc
		pop	edi
		pop	cx
		pop	bx
		ret

MXIC_Flash_Erase	ENDP

;[]====================================================================[]
; MXIC_Flash_Write :
;
;	Program MXIC 28F1000AP PARAMETER BLOCK
;
;Saves :
;Input : Source	= DS : SI
;	 Target	= ES : DI (Range = FD000h-FDFFFh)
;	 Length	= CX
;
;Output: CF = 0 Successful
;	 CF = 1	Error Program
;
;[]====================================================================[]
		public	MXIC_Flash_Write		
MXIC_Flash_Write	Proc	Near			

		push	bx
		push	cx
		push	esi
		push	edi

MXIC_Prg_Next_Byte:					
		push	cx
		mov	cx, RETRY_COUNT
MXIC_Prg_Retry:						
		push	cx

	;; Write Commnad
		mov	byte ptr es:[edi], MX_AUTO_PROGRAM

	;; Write Data
		mov	al,byte ptr ds:[esi]
		mov	byte ptr es:[edi],al

	;; Wait ROM Cycle
		mov	al ,byte ptr es:[edi]
		mov	bl,al
MX_Program_Polling:
		mov	al ,byte ptr es:[edi]
		xor	bl,al
		test	bl,40h				; Test Toggle Bit
		mov	bl,al
		jnz	short MX_Program_Polling
		
	;; Send Reset Command To ROM
		mov	byte ptr es:[edi] ,MX_RESET
		mov	byte ptr es:[edi] ,MX_RESET

	;; Verify Data
		mov	al , es:[edi]
		cmp	al, ds:[esi]		
		pop	cx
		je	short MXIC_Prg_Verify_Ok
		loop	MXIC_Prg_Retry

MXIC_Prg_Error:
		pop	cx
		stc
		pop	edi
		pop	esi
		pop	cx
		pop	bx
		ret

MXIC_Prg_Verify_Ok:				
		pop	cx
		inc	esi
		inc	edi
		loop	short MXIC_Prg_Next_Byte	

		clc
		pop	edi
		pop	esi
		pop	cx
		pop	bx
		ret

MXIC_Flash_Write	ENDP

endif;	Flash_IN_SMBASE		
;R11 - end

