;	[]===========================================================[]
;
;	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
;----------------------------------------------------------------------------
;R08	01/28/99 BAR	Support update ESCD DMI in SMM mode.
;			define switch "Flash_IN_SMBASE"
;R07	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.)
;R06	12/05/96 AVN	Suppost Auto Detect EEPROM ID at POST 6 For 1M EEPROM
;R05	06/03/96 KEN	Fixed erase too long when using EPROM.
;R04A	01/15/96 KEN	Restore original codes.
;R04	01/12/96 KEN	Support updating ESCD with high memory (below 4GB).
;R03	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
;			  3. move Write_Delay & Erase_Delay to ESCDCHIP.ASM

;R03ifdef	INTEL_28F001BXT

;****************************************************************
;*								*
;*	SUBROUTINES TO SUPPORT INTEL FLASH ROM			*
;*								*
;****************************************************************

;[]========================================================================[]
;
;	Intel's 28F0001BX-T commands
;
;[]========================================================================[]

RESET_CMD	EQU	0FFh
RD_ID_CMD	EQU	090h
RD_STATUS_CMD	EQU	070h
CL_STATUS_CMD	EQU	050h
PROG_CMD	EQU	040h
ERASE_CMD	EQU	020h
ERASE_CONFIRM	EQU	0D0h
ERASE_SUSPEND	EQU	0B0h
RETRY_COUNT	EQU	10
WAIT_COUNT	EQU	10
INTEL_RETRY	EQU	2			;R05
INTEL_WAIT	EQU	2			;R05
ifndef	Flash_IN_SMBASE		;R08

;[]========================================================================[]
;R03; Ct_Flash_Erase:
; F001BXT_Flash_Erase :					;R03
;
;	Erase Intel 28F001BX-T PARAMETER BLOCK (FD000h - FDFFFh)
;
;Saves : None
;Input : None
;
;Output: CF = 0 , Successful
;	 CF = 1 , Error Erase
;
;[]========================================================================[]
;R03		public	Ct_Flash_Erase
;R03Ct_Flash_Erase	proc	near

		Public	F001BXT_Flash_Erase	;R03
F001BXT_Flash_Erase	Proc	Near		;R03

		push	bx
		push	di
;R07		push	es

;R05		mov	bx, RETRY_COUNT
		mov	bx, INTEL_RETRY		;R05
Erase_Retry:
		push	bx

		mov	al, CL_STATUS_CMD	;clear status command
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06

		mov	al, ERASE_CMD		;erase command
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06

		mov	al, ERASE_CONFIRM	;erase confirm command
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06

;R05		mov	bx, WAIT_COUNT
		mov	bx, INTEL_WAIT		;R05
Erase_Wait:
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Erase_Delay		;delay 500ms
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Erase_Delay	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06

		mov	al, RD_STATUS_CMD	;read status command
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06

ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Get_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06
		test	al, 80h			;busy/ready bit
		jnz	short Erase_Ok
		dec	bx
		jnz	short Erase_Wait
		pop	bx
		dec	bx
		jnz	short Erase_Retry
Erase_Error:
		mov	al, RESET_CMD		;reset to ROM read status
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06
		stc
;R07		pop	es
		pop	di
		pop	bx
		ret

Erase_Ok:
		pop	bx
		mov	al, RESET_CMD		;reset to ROM read status
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06
		clc
;R07		pop	es
		pop	di
		pop	bx
		ret

F001BXT_Flash_Erase	Endp			;R03
;R03Ct_Flash_Erase	endp

;[]====================================================================[]
;R03; Ct_Flash_Write :
; F001BXT_Flash_Write :					;R03
;
;	Program Intel 28F001BX-T PARAMETER BLOCK
;
;Saves :
;Input : Source	= DS : SI
;	 Target	= ES : DI (Range = FD000h-FDFFFh)
;	 Length	= CX
;
;Output: CF = 0 Successful
;	 CF = 1	Error Program
;
;[]====================================================================[]
;R03		public	Ct_Flash_Write
;R03Ct_Flash_Write	proc	near

		public	F001BXT_Flash_Write		;R03
F001BXT_Flash_Write	Proc	Near			;R03

		push	bx
		push	cx
		push	si
		push	di

Prg_Next_Byte:
		mov	bx, RETRY_COUNT
Prg_Retry:
		push	bx

		mov	al, CL_STATUS_CMD	;clear status command
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06

		mov	al, PROG_CMD		;program command
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06
		mov	al, ds:[si]		;get source to write
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06

		mov	bx, WAIT_COUNT
Prg_Wait:
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Write_Delay		;delay 10us
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Write_Delay	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06

		mov	al, RD_STATUS_CMD	;read status command
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06

ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Get_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Get_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06
		test	al, 80h			;busy/ready bit
		jnz	short Prg_Verify_Ok
		dec	bx
		jnz	short Prg_Wait
		pop	bx
		dec	bx
		jnz	short Prg_Retry
Prg_Error:
		mov	al, RESET_CMD		;reset to ROM read status
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06
		stc
		pop	di
		pop	si
		pop	cx
		pop	bx
		ret

Prg_Verify_Ok:
		pop	bx
		mov	al, RESET_CMD		;reset to ROM read status
ifndef	AUTO_DETECT_EEPROM_ID			;R06
		call	Ct_Set_Flash
		call	Ct_Get_Flash		;R02
else;	AUTO_DETECT_EEPROM_ID			;R06
		mov	dx,offset Ct_Set_Flash	;R06
		call	dx			;R06
		mov	dx,offset Ct_Get_Flash	;R06
		call	dx			;R06
endif;	AUTO_DETECT_EEPROM_ID			;R06
		cmp	al, ds:[si]		;R02
		jne	short Prg_Error		;R02
		inc	si
		inc	di
		loop	short Prg_Next_Byte

		clc
		pop	di
		pop	si
		pop	cx
		pop	bx
		ret

;R03Ct_Flash_Write	endp
F001BXT_Flash_Write	Endp				;R03

;R03 ;[]====================================================================[]
;R03 ; Delay 500ms for erasing completed
;R03 ; Check refresh toggle bit
;R03 ;[]====================================================================[]
;R03 Erase_Delay	proc	near
;R03 		push	bx
;R03 		push	cx
;R03 		xor	bx, bx
;R03 		mov	cx, 17000
;R03 		call	Wait_Refresh
;R03 		pop	cx
;R03 		pop	bx
;R03 		ret
;R03 Erase_Delay	endp
;R03 
;R03 ;[]====================================================================[]
;R03 ; Delay 10us for programming completed
;R03 ; Check refresh toggle bit
;R03 ;[]====================================================================[]
;R03 Write_Delay	proc	near
;R03 		push	bx
;R03 		push	cx
;R03 		xor	bx, bx
;R03 		mov	cx, 2
;R03 		call	Wait_Refresh
;R03 		pop	cx
;R03 		pop	bx
;R03 		ret
;R03 Write_Delay	endp

;R03endif	;INTEL_28F001BXT
;R08 - start
else;	Flash_IN_SMBASE	

;[]========================================================================[]
; F001BXT_Flash_Erase :	
;
;	Erase Intel 28F001BX-T PARAMETER BLOCK (FD000h - FDFFFh)
;
;Saves : None
;Input : None
;
;Output: CF = 0 , Successful
;	 CF = 1 , Error Erase
;
;[]========================================================================[]
		Public	F001BXT_Flash_Erase
F001BXT_Flash_Erase	Proc	Near

		push	bx
		push	di
		mov	bx, INTEL_RETRY
Erase_Retry:
		push	bx

		;clear status command
		mov	byte ptr es:[edi],CL_STATUS_CMD
		nop
		;erase command
		mov	byte ptr es:[edi],ERASE_CMD
		nop
		;erase confirm command
		mov	byte ptr es:[edi],ERASE_CONFIRM
		nop

		mov	bx, INTEL_WAIT		;R05
Erase_Wait:
		push	cx
		mov	cx,17000
		call	dx			;delay 500ms
		pop	cx

		;read status command
		mov	byte ptr es:[edi], RD_STATUS_CMD
		nop

		mov	al,byte ptr es:[edi]
		test	al, 80h			;busy/ready bit
		jnz	short Erase_Ok
		dec	bx
		jnz	short Erase_Wait
		pop	bx
		dec	bx
		jnz	short Erase_Retry
Erase_Error:
		;reset to ROM read status
		mov	byte ptr es:[edi], RESET_CMD
		stc
		pop	di
		pop	bx
		ret

Erase_Ok:
		pop	bx
		;reset to ROM read status
		mov	byte ptr es:[edi], RESET_CMD
		clc
		pop	di
		pop	bx
		ret

F001BXT_Flash_Erase	Endp
;[]====================================================================[]
; F001BXT_Flash_Write :	
;
;	Program Intel 28F001BX-T PARAMETER BLOCK
;
;Saves :
;Input : Source	= DS : SI
;	 Target	= ES : DI (Range = FD000h-FDFFFh)
;	 Length	= CX
;
;Output: CF = 0 Successful
;	 CF = 1	Error Program
;
;[]====================================================================[]
		public	F001BXT_Flash_Write
F001BXT_Flash_Write	Proc	Near

		pusha
Prg_Next_Byte:
		mov	bx, RETRY_COUNT
Prg_Retry:
		push	bx

		;clear status command
		mov	byte ptr es:[edi], CL_STATUS_CMD
		nop
		;program command
		mov	byte ptr es:[edi], PROG_CMD
		nop

		mov	al, byte ptr ds:[esi]		;get source to write
		mov	byte ptr es:[edi],al		;write to flash

		mov	bx, WAIT_COUNT
Prg_Wait:
		push	cx
		mov	cx,2
		call	dx			;write delay
		pop	cx

		;read status command
		mov	byte ptr es:[edi], RD_STATUS_CMD
		nop

		mov	al,byte ptr es:[edi]
		test	al, 80h			;busy/ready bit
		jnz	short Prg_Verify_Ok
		dec	bx
		jnz	short Prg_Wait
		pop	bx
		dec	bx
		jnz	short Prg_Retry
Prg_Error:
		;reset to ROM read status
		mov	byte ptr es:[edi], RESET_CMD
		stc
		popa
		ret

Prg_Verify_Ok:
		pop	bx
		;reset to ROM read status
		mov	byte ptr es:[edi], RESET_CMD
		nop
		mov	al,byte ptr es:[edi]
		cmp	al, ds:[esi]	   
		jne	short Prg_Error
		inc	esi
		inc	edi
		loop	short Prg_Next_Byte
		clc
		popa
		ret

F001BXT_Flash_Write	Endp

endif;	Flash_IN_SMBASE	
;R08 - end


