;	[]===========================================================[]
;
;	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.
;
; 	[]===========================================================[]
;

;		PAGE	60,132
;		TITLE	POST  -- 386 ROM/BIOS POST
;----------------------------------------------------------------------------
;Rev	Date	 Name	Description
;---------------------------------------------------------------------------
;R13	04/28/99 BAR	Add kernel Flash hook
;R12	04/16/99 BAR	Support MOSEL29C51001T 1M flash ROM.
;R11	03/29/99 BAR	Support SST 39SF010 1M flash ROM.
;R10	01/26/99 BAR	Support update ESCD DMI in SMM mode.
;			define switch "Flash_IN_SMBASE"
;R09	12/18/98 BAR	Support MXIC 29F001T, ST M29400BT & 29F002T flash ROM.
;			 	Intel 828802AD
;R08	11/19/98 BAR	Support 4M flash ROM.
;			Support AM29F400BT
;R07	10/27/98 BAR	Fixed system hang up Post_6s .
;			    1. CPU is Cyrix .
;			    2. Enter Setup then reboot.
;R06	08/28/98 BAR	Added support SST 39SF020 2M flash
;R05	05/14/98 BAR	Added Flash1M_16K_8K_8K_Unit definition.
;			Support ATMEL 49F001T 1M flash.
;R04	05/05/98 BAR	Added support SST 29LE020 2M flash
;R03	04/30/98 BAR	Added support ATMEL AT29LV020 2M flash ROM
;			is same as ATMEL 29C020
;R02	04/13/98 BAR	Added support ATMEL AT49F002T 2M flash ROM
;R01	03/27/98 BAR	Move 'Detect EEPROM' subroutine from E0POST.ASM to
;			XGROUP 

;[]-----------------------------------[]
;
;   Award Software 386/486 BIOS
;         EEPROM Detect
;   Initial Revision 18-March-1998
;
;[]-----------------------------------[]

.386P
		INCLUDE BIOS.CFG
		INCLUDE COMMON.EQU
		INCLUDE COMMON.MAC
		INCLUDE BTROMSEG.EQU	     
		INCLUDE BSETUP.INC
				

ifdef	FLASH_SUPPORT		   
ifdef	AUTO_DETECT_EEPROM_ID	   

		extrn	Ct_ROM_Write_Enable:near
		extrn	Ct_ROM_Write_Disable:near
		extrn	CT_Enable_ROM_Shadow:near
		extrn	CT_Disable_ROM_Shadow:near
		extrn	Ct_Init:near		     
ifndef	Flash_IN_SMBASE			;R10
		extrn	FLASH_ENTRY_POINT:near	     
		extrn	FLASH_WRITE_ENTRY_POINT:near 
;R10 - start
else ;	Flash_IN_SMBASE
		extrn 	SMI_FLASH_ENTRY_POINT:near
		extrn 	SMI_FLASH_WRITE_ENTRY_POINT:near
endif	;Flash_IN_SMBASE
;R10 - end
		extrn	Ct_Get_Flash:near	     
		extrn	Ct_Set_Flash:near	     
		extrn	Erase_Delay:near	     
		extrn	Write_Delay:near	     
		extrn	EEPROM_Wait_10ms:near	     
		extrn	F000_CALL_PROC:near
		extrn	F000_Shadow_W:near 
		extrn	F000_Shadow_R:near 


		INCLUDE EEPROM.EQU

G_RAM		SEGMENT USE16 AT 0

		ORG	04H*4
		INCLUDE SEG_0.INC

		ORG	400H
		INCLUDE G_RAM.INC


G_RAM		ENDS

		PAGE
DGROUP		GROUP	FCODE
;R13 FCODE		SEGMENT PARA PUBLIC 'CODE'
FCODE		SEGMENT USE16 PARA PUBLIC 'CODE'	;R13
		ASSUME	CS:DGROUP
		include	Aflash.inc			;R13
FCODE		ENDS

DGROUP		GROUP	@DATAC
@DATAC		SEGMENT	USE16 DWORD COMMON 'DATAC'
		ASSUME	CS:DGROUP
@DATAC		ENDS


EGROUP		GROUP	ECODE
ECODE		SEGMENT USE16 PARA PUBLIC 'ECODE'
		ASSUME	CS:EGROUP
ECODE		ENDS

XGROUP		GROUP	XCODE
XCODE		SEGMENT USE16 PARA PUBLIC 'XCODE'
		ASSUME	CS:XGROUP,ES:XGROUP

		INCLUDE	EEPROM.INC 
;[]==============================================================[]
;EEPROM Sub Command
;	Address Format 		A0-A11		
;		AMD29F002T				
;						
;	Address Format 		A0-A14
;		AM29F010	
;		ATMEL49F002T
;		WINBOND		
;
;	Address Format 		A0-A15
;		Bright BM29FS020
;
;	Address Format 		A0-A17
;		IMT IM29F002    MOSEL V29C51002T
;
;Entry: NONE
;[]==============================================================[]

;[]==============================================================[]
;
; Detect EEPROM
;
;	Checksum the ROM. There are four basic checksums:
;	the entire BIOS, the sign-on message, the evaluation
;	message and the ATORGS region.
;
;Saves: NONE + NO STACK
;
;Entry: NONE
;Exit:	C	Set if fatal error
;
;[]==============================================================[]

		Public	Detect_EEPROM

Detect_EEPROM 	PROC	NEAR

		cli
		cld			;R07
		push	ds
		push	es

		mov	ax,0f000h
		mov	ds,ax
		mov	ax,PnP_DMI_CPU_Backup_Seg
		mov	es,ax
		xor	di,di
		xor	si,si		  ;backup flash on/off subroutine to 
		mov	cx,8000h	  ;PnP_DMI_CPU_Backup_Seg:0
		rep	movsw		 

EEPROM_Decode_Start:

		push	es
		pop	ds
		FAR_CALL	Ct_ROM_Write_Enable,PnP_DMI_CPU_Backup_Seg
		FAR_CALL	CT_Disable_ROM_Shadow,PnP_DMI_CPU_Backup_Seg

		assume	es:DGROUP
		mov	ax,0f000h
		mov	es,ax
   ifdef	JEDEC_Series_ID_Check_Routine		 
	     	call	Check_JEDEC_ID	
 		jnc	short EEPROM_Decode_Final
			;Check AMD,SGS-THOMSON,ATMEL,IMT,BM,PMC,SST39SF020
			;MXIC /5v	;R09
   endif;	JEDEC_Series_ID_Check_Routine		 

   ifdef	JEDEC_Series_2_ID_Check_Routine		 
	     	call	Check_JEDEC_2_ID 
 		jnc	short EEPROM_Decode_Final
			;SST,WINBOND
   endif;	JEDEC_Series_2_ID_Check_Routine		 
;R08 - start
   ifdef	JEDEC_Series_3_ID_Check_Routine		 
		xor	cx,cx
	     	call	Check_JEDEC_3_ID 
 		jnc	short EEPROM_Decode_Final
			;AMD,SGS-THOMSON
   endif;	JEDEC_Series_3_ID_Check_Routine		 
;R08 - end
   ifdef	INTEL_ID_Check_Routine
 		call	Check_INTEL_EEPROM
 		jnc	short EEPROM_Decode_Final
   endif;	INTEL_ID_Check_Routine

   ifdef	MXIC_ID_Check_Routine
 		call	Check_MXIC_EEPROM
 		jnc	short EEPROM_Decode_Final
   endif;	MXIC_ID_Check_Routine

   ifdef	INTEL_ID_Check_Routine
		push	es
		push	0e000h
		pop	es
 		call	Check_INTEL_EEPROM
		pop	es
 		jnc	short EEPROM_Decode_Final
   endif;	INTEL_ID_Check_Routine

		mov	byte ptr es:[0],RESET_CMD	;Reset flash rom
		mov	di,-1				;Set EEPROM Detect Fail

EEPROM_Decode_Final:

		push	di				;Save EEPROM Type

		FAR_CALL	Ct_ROM_Write_Disable,PnP_DMI_CPU_Backup_Seg
		FAR_CALL	CT_Enable_ROM_Shadow,PnP_DMI_CPU_Backup_Seg
		F000_call 	F000_Shadow_W		    
		pop	ax				;Load EEPROM Type
		mov	es:[0E05AH],al
		push	cs
		pop	ds
		call	Get_Flash_Routine_Head
		jc	short	@F
;R10 - start
ifdef	Flash_IN_SMBASE
		mov	ax,XGROUP_Segment
		mov	es,ax
		ASSUME	ES:XGROUP
endif	;Flash_IN_SMBASE
;R10 - end
	;; Copy Flash Routine To F000 Segment For Use By Update ESCD.
ifndef	Flash_IN_SMBASE					;R09
		mov	word ptr es:[FLASH_WRITE_ENTRY_POINT],bx
;R10 - start
else	;Flash_IN_SMBASE
		mov	di,offset SMI_FLASH_ENTRY_POINT
		add	word ptr es:[SMI_FLASH_WRITE_ENTRY_POINT],bx
endif	;Flash_IN_SMBASE
;R10 - end
		rep	movsb		  
@@:
		F000_call 	F000_Shadow_R		    
		pop	es
		pop	ds
		sti
		clc
		ret
Detect_EEPROM 	ENDP
;[]===================================================================[]
;		Get_Flash_Routine_Head	 
;Input : AX
;
;Output: SI = Flash erase head	
;	 DI = Flash_ENTRY_POINT
;	 CX = Flash routine lentgh
;	 BX = Flash WRITE OFFSET
;	if  Carry == 1   No get any device
;[]===================================================================[]
Get_Flash_Routine_Head	proc	near	 
;R08 - start
ifdef	Flash_4M_support 
;==================================================
;  Compare AMD/SGS-THOMSON Device
;==================================================
	ifdef Support_AM29F400BT_Series

		cmp	ax,ST_4M_TYPE_EEPROM		;R09
		je	short Copy_AMD_4M_Routine 	;R09
		cmp	ax,AMD_4M_TYPE_EEPROM
		jne	short Not_AMD_400BT
Copy_AMD_4M_Routine:					;R09
		mov	cx,AMD_29F400BT_LEN
		mov	si,offset AM29F400BT_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,AMD_29F400BT_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,AMD_29F400BT_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
Not_AMD_400BT:
	endif;	Support_AM29F400BT_Series 
;R09 - start
;==================================================
;  Compare INTEL Device
;==================================================
	ifdef	Support_INTEL_E82802_Series
		cmp	ax, INTEL_4M_TYPE_EEPROM
		je	short Not_Intel_E82802
		mov	cx, INTEL_E82802_LEN
		mov	si, offset F002BXT_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di, offset FLASH_ENTRY_POINT
		mov	bx, di
		add	bx, INTEL_E82802_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx, INTEL_E82802_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
Not_Intel_E82802:
	endif;	Support_INTEL_E82802_Series
;R09 - end

elseifdef	Flash_2M_support 
;R08 - end
;R08 ifdef	Flash_2M_support 
   ifdef	Flash_16K_8K_8K_Unit
;==================================================
;  Compare SST Device
;==================================================
	ifdef	Support_SST29EE020_Series
		cmp	ax,SST_2M_TYPE_EEPROM
		je	short Copy_SST_WINBOND_2M_Routine      
		cmp	ax,WINBOND_2M_TYPE_EEPROM	       
		jne	short @f			       
Copy_SST_WINBOND_2M_Routine: 
		mov	cx,SST_29EE020_LEN
		mov	si,offset SST020_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT		
		mov	bx,di
		add	bx,SST_29EE020_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,SST_29EE020_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
;R06 - start
		cmp	ax,SST_2M_1_TYPE_EEPROM
		jne	short @f
		mov	cx,SST_39SF020_LEN
		mov	si,offset SST_39SF020_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT		
		mov	bx,di
		add	bx,SST_39SF020_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,SST_39SF020_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
;R06 - end
	endif;	Support_SST29EE020_Series

;==================================================
;  Compare ATMEL Device
;==================================================
	ifdef	Support_ATMEL29C020_Series
		cmp	ax,ATMEL_2M_TYPE_EEPROM
		jne	short @f				

	;; Copy Flash Routine To F000 Segment For Use By Update ESCD.
		mov	cx,ATMEL_29C020_LEN
		mov	si,offset ATMEL29C020_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT		
		mov	bx,di
		add	bx,ATMEL_29C020_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,ATMEL_29C020_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif;	Support_ATMEL29C020_Series

;==================================================
;  Compare AMD/SGS-THOMSON Device
;==================================================
	ifdef Support_AM29F002_Series
		cmp	ax,ST_2M_TYPE_EEPROM
		je	short Copy_AMD_ST_2M_Routine
		cmp	ax,MXIC_29F002T_EEPROM			;R09
		je	short Copy_AMD_ST_2M_Routine		;R09
		cmp	ax,AMD_2M_TYPE_EEPROM
		jne	short @f	  
Copy_AMD_ST_2M_Routine:	
		mov	cx,AMD_29F002T_LEN
		mov	si,offset AM29F002T_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT		
		mov	bx,di
		add	bx,AMD_29F002T_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,AMD_29F002T_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif; Support_AM29F002_Series

;==================================================
;  Compare INTEL/CSI Device
;==================================================
	ifdef	Support_INTEL_28F002BXT_Series

		cmp	ax,INTEL_2M_TYPE_EEPROM
		je	short Copy_INTEL_CSI_2M_Routine		
		cmp	ax,CSI_2M_TYPE_EEPROM			
		jne	short @f				
Copy_INTEL_CSI_2M_Routine:					
		mov	cx,INTEL_28F002BXT_LEN
		mov	si,offset F002BXT_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT		
		mov	bx,di
		add	bx,INTEL_28F002BXT_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,INTEL_28F002BXT_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif;	Support_INTEL_28F002BXT_Series
;==================================================
;  Compare MXIC Device
;==================================================
       ifndef MXIC_EEPROM_No_Support
	ifdef  	Support_MXIC28F2000PPC_Series
		cmp	ax,MXIC_2M_TYPE_EEPROM
		jne	short @f
		mov	cx,MXIC_28F2000PPC_LEN
		mov	si,offset MX_28f2000PPC_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,MXIC_28F2000PPC_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,MXIC_28F2000PPC_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif; 	Support_MXIC28F2000PPC_Series

	ifdef  	Support_MXIC28F002TTC_Series
		cmp	ax,MXIC_2M_TYPE_1_EEPROM
		jne	short @f
		mov	cx,MXIC_28F002TTC_LEN
		mov	si,offset MX_28f002TTC_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,MXIC_28F002TTC_WRITE_OFFSET	
;R10 - start
else	;Flash_IN_SMBASE
endif	;Flash_IN_SMBASE
;R10 - end
		ret

@@:
	endif; 	Support_MXIC28F002TTC_Series
       endif; MXIC_EEPROM_No_Support

;==================================================
;  Compare IMT/MOSEL  Device
;==================================================
	ifdef 	Support_IMT_IM29F002T_Series
		cmp	ax,IMT_2M_TYPE_EEPROM
		jne	short @f
		mov	cx,IMT_29F002T_LEN
		mov	si,offset IMT_29F002T_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,IMT_29F002T_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,IMT_29F002T_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif; 	Support_IMT_IM29F002T_Series
;==================================================
;  Compare Bright Device
;==================================================
	ifdef	Support_BRIGHT_BM29FS020_Series
		cmp	ax,BM_2M_TYPE_EEPROM
		jne	short @f
		mov	cx,BM_29FS020_LEN
		mov	si,offset BM_29FS020_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,BM_29FS020_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,BM_29FS020_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif;	Support_BRIGHT_BM29FS020_Series
;==================================================
;  Compare PMC Device
;==================================================
	ifdef	Support_PMC_PM29F002C_Series
		cmp	ax,PMC_2M_TYPE_EEPROM
		jne	short @f
		mov	cx,PMC_29F002C_LEN
		mov	si,offset PMC_29F002C_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,PMC_29F002C_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,PMC_29F002C_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif;	Support_PMC_PM29F002C_Series

elseifdef	Flash_4K_Unit
;==================================================
;  Compare MXIC Device
;==================================================
       ifndef MXIC_EEPROM_No_Support
	ifdef  	Support_MXIC_28F2000PPC_Series
		cmp	ax,MXIC_2M_TYPE_EEPROM
		jne	short @f
		mov	cx,MXIC_28F2000PPC_LEN
		mov	si,offset MX_28f2000PPC_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,MXIC_28F2000PPC_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,MXIC_28F2000PPC_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif; 	Support_MXIC_28F2000PPC_Series
       endif; MXIC_EEPROM_No_Support

   endif;	Flash_16K_8K_8K_Unit
else;	Flash_2M_support
   ifdef	Flash_4K_Unit
;==================================================
;  Compare SST/ATMEL/WINBOND Device
;==================================================
	ifdef	Support_SST_29EE010_Series
		cmp	ax,SST_1M_TYPE_EEPROM
		je	short Copy_SST_Routine
		cmp	ax,ATMEL_1M_TYPE_EEPROM
		je	short Copy_SST_Routine
		cmp	ax,WINBOND_1M_TYPE_EEPROM
		jne	short @f
	Copy_SST_Routine:
		mov	cx,SST_29EE010_LEN
		mov	si,offset SST010_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,SST_29EE010_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,SST_29EE010_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif;	Support_SST_29EE010_Series
;R11 - start
	ifdef	Support_SST_39SF010_Series
		cmp	ax,SST_1M_39_TYPE_EEPROM
		jne	short Not_39SF010
		mov	cx,SST_39SF010_LEN
		mov	si,offset SST_39SF010_Flash_Erase
ifndef	Flash_IN_SMBASE	
		mov	di,offset FLASH_ENTRY_POINT		
		mov	bx,di
		add	bx,SST_39SF010_WRITE_OFFSET
else	;Flash_IN_SMBASE
		mov	bx,SST_39SF010_WRITE_OFFSET
endif	;Flash_IN_SMBASE
		ret
Not_39SF010:
	endif;	Support_SST_39SF010_Series
;R11 - end

;==================================================
;  Compare INTEL/CSI Device
;==================================================
	ifdef	Support_INTEL_28F001BXT_Series
		cmp	ax,CSI_1M_TYPE_EEPROM			
		je	short Copy_INTEL_Routine		
		cmp	ax,INTEL_1M_TYPE_EEPROM
		jne	short @f
Copy_INTEL_Routine:					 
		mov	cx,INTEL_28F001BXT_LEN
		mov	si,offset F001BXT_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,INTEL_28F001BXT_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,INTEL_28F001BXT_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif;	Support_INTEL_28F001BXT_Series	
;==================================================
;  Compare MXIC Device
;==================================================
	ifdef	Support_MXIC_28F1000PPC_Series
		cmp	ax,MXIC_1M_PPC_TYPE_EEPROM
		jne	short @f
		mov	cx,MXIC_28F1000_LEN
		mov	si,offset MXIC_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,MXIC_28F1000_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,MXIC_28F1000_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif;	Support_MXIC_28F1000PPC_Series

;R09 - start
	ifdef	Support_MXIC_29F001T_Series
		cmp	ax, MXIC_29F001T_EEPROM
		jne	short Not_MX29F001
		mov	cx, MXIC_29F001T_LEN
		mov	si, offset MX29F001T_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di, offset FLASH_ENTRY_POINT
		mov	bx, di
		add	bx, MXIC_29F001T_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx, MXIC_29F001T_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
Not_MX29F001:
	endif;	Support_MXIC_29F001T_Series
;R09 - end
;R12 - start
	ifdef	Support_MOSEL_V29C51001T_Series	
		cmp	ax,MOSEL_1M_TYPE_EEPROM
		jne	short Not_Mosel_29C51001T
		mov	cx,MOSEL_V29C51001T_LEN
		mov	si,offset MOSEL_V29C51001T_Flash_Erase
ifndef	Flash_IN_SMBASE	
		mov	di,offset FLASH_ENTRY_POINT		
		mov	bx,di
		add	bx,MOSEL_V29C51001T_WRITE_OFFSET
else	;Flash_IN_SMBASE
		mov	bx,MOSEL_V29C51001T_WRITE_OFFSET
endif	;Flash_IN_SMBASE
		ret
Not_Mosel_29C51001T:
	endif;	Support_MOSEL_V29C51001T_Series
;R12 - end

;R05 - start
   elseifdef	Flash1M_16K_8K_8K_Unit
;==================================================
;  Compare ATMEL Device
;==================================================
	ifdef	Support_ATMEL_49F001T_Series
		cmp	ax,ATMEL_1M_1_TYPE_EEPROM
		jne	short @f
		mov	cx,ATMEL_49F001T_LEN
		mov	si,offset AT49F001T_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT		
		mov	bx,di
		add	bx,ATMEL_49F001T_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,ATMEL_49F001T_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret

@@:
	endif;	Support_ATMEL_49F001T_Series
;R05 - end


   elseifdef	Flash_16K_Unit
;==================================================
;  Compare MXIC Device
;==================================================
	ifdef	Support_MXIC_28F1000PC_Series	
		cmp	ax,MXIC_1M_PL_TYPE_EEPROM
		jne	short @f
		mov	cx,MXIC_28F1000_LEN
		mov	si,offset MXIC_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,MXIC_28F1000_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,MXIC_28F1000_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif	;Support_MXIC_28F1000PC_Series	
;==================================================
;  Compare AMD Device
;==================================================
	ifdef	Support_AM29F010_Series
		cmp	ax,AMD_1M_TYPE_EEPROM
		jne	short @f			      
		mov	cx,AMD_29F010_LEN
		mov	si,offset AMD29F_Flash_Erase
ifndef	Flash_IN_SMBASE					;R10
		mov	di,offset FLASH_ENTRY_POINT
		mov	bx,di
		add	bx,AMD_29F010_WRITE_OFFSET
;R10 - start
else	;Flash_IN_SMBASE
		mov	bx,AMD_29F010_WRITE_OFFSET
endif	;Flash_IN_SMBASE
;R10 - end
		ret
@@:
	endif;	Support_AM29F010_Series
   endif;	Flash_4K_Unit
endif;	Flash_2M_support
		stc			;no device
		ret
Get_Flash_Routine_Head	 	ENDP



;[]==============================================================[]
;
; Detect EEPROM ID
;
;Saves: NONE + NO STACK
;
;Entry: NONE
;Exit:	C   Set if fatal error
;	DI = flash type
;[]==============================================================[]

;=======================================================
; Read Flash ID Subroutine  (JEDEC strand 2)
;=======================================================

ifdef	JEDEC_Series_ID_Check_Routine		 
Check_JEDEC_ID:
		call	JEDEC_Series_Reset
		call	JEDEC_Series_Read_ID
		call	JEDEC_Series_Reset
;=======================================================
;  Compare AMD Device
;=======================================================
   ifdef	AMD_ID_Check_Routine				
		cmp	al,AMD_ID			;AMD Manufacturer Code
		jne	short Not_AMD_EEPROM	
	ifdef	Flash_2M_support	  
	  ifdef Support_AM29F002_Series
		mov	di,AMD_2M_TYPE_EEPROM		;Set AMD 29F002T EEPROM Type
		cmp	ah,AMD_29F002T_DEVICE		;AMD 29F002T Device ID
		je	short Get_EEPROM_ID
	  endif; Support_AM29F002_Series
	else;	Flash_2M_support
	  ifdef Support_AM29F010_Series
		mov	di,AMD_1M_TYPE_EEPROM		;Set AMD 29F010 EEPROM Type
		cmp	ah,AMD_29F010_DEVICE		;AMD 29F010 Device ID
		je	short Get_EEPROM_ID
	  endif; Support_AM29F010_Series
	endif;	Flash_2M_support
Not_AMD_EEPROM:		
   endif;	AMD_ID_Check_Routine				
;=======================================================
;  Compare SGS- THOMSON Device
;=======================================================
   ifdef	SGS_THOMSON_ID_Check_Routine
	 ifdef	Support_AM29F002_Series
		mov	di,AMD_2M_TYPE_EEPROM		;Set SGS_THOMSON 29F002T EEPROM Type
		cmp	al,SGS_THOMSON_MANU		;SGS_THOMSON Manufacturer Code
		jne	short Not_SGS_THOMSON_EEPROM	
		cmp	ah,ST_M29F002T
		je	short Get_EEPROM_ID
	 endif;	Support_AM29F002_Series
Not_SGS_THOMSON_EEPROM:
   endif;	SGS_THOMSON_ID_Check_Routine

;=======================================================
;  Compare ATMEL Device
;=======================================================
   ifdef	ATMEL_ID_Check_Routine			       
		cmp	al,ATMEL_ID
		jne	short Not_ATMEL_EEPROM		;ATMEL Manufacturer Code
	ifdef	Flash_2M_support
	  ifdef Support_ATMEL29C020_Series
		mov	di,ATMEL_2M_TYPE_EEPROM		;Set ATMEL 29C020 EEPROM Type
		cmp	ah,ATMEL_29C020_DEVICE
		je	short Get_EEPROM_ID		;ATMEL 29C020 Device ID
;R03 -start
		cmp	ah,ATMEL_29LV020_DEVICE
		je	short Get_EEPROM_ID		;ATMEL 29LV020 Device ID
;R03 - end
	  endif; Support_ATMEL29C020_Series
;R02 -start
	 ifdef	Support_AM29F002_Series
		mov	di,AMD_2M_TYPE_EEPROM		;Set SGS_THOMSON 29F002T EEPROM Type
		cmp	ah,ATMEL_49F002T_DEVICE
		je	short Get_EEPROM_ID		;ATMEL 49F002T Device ID
	 endif;	Support_AM29F002_Series
;R02 - end

	else;	Flash_2M_support
;R05 -start
	  ifdef	Flash1M_16K_8K_8K_Unit
	    ifdef	Support_ATMEL_49F001T_Series	
		mov	di,ATMEL_1M_1_TYPE_EEPROM
		cmp	ah,ATMEL_49F001T_DEVICE
		je	short Get_EEPROM_ID		;ATMEL 49F001T Device ID
	    endif ;	Support_ATMEL_49F001T_Series	
	  endif ;Flash1M_16K_8K_8K_Unit
;R05 -end
		

	  ifdef	Support_SST_29EE010_Series
		mov	di,ATMEL_1M_TYPE_EEPROM		;Set ATMEL 29C010 EEPROM Type
		cmp	ah,ATMEL_29C010_DEVICE		;ATMEL 29C010 Device ID
		je	short Get_EEPROM_ID		
	  endif; Support_SST_29EE010_Series
	endif;	Flash_2M_support

Not_ATMEL_EEPROM:
   endif;	ATMEL_ID_Check_Routine
;R06 - start
;=======================================================
;  Compare SST39 series Device
;=======================================================
   ifdef	SST_ID_Check_Routine		 
		cmp	al,SST_ID			;SST Manufacturer Code
		jne	short Not_SST_EEPROM_1		;
     ifdef	Flash_2M_support			
	 ifdef 	Support_SST39SF020_Series
		mov	di,SST_2M_1_TYPE_EEPROM		;Set SST39SF020 EEPROM Type
		cmp	ah,SST_39SF020_DEVICE		;SST 29SF020 Device ID
		je	short Get_EEPROM_ID
	 endif;	Support_SST39SF020_Series
;R11 - start
     else;	Flash_2M_support
	 ifdef 	Support_SST_39SF010_Series
		mov	di,SST_1M_39_TYPE_EEPROM	;Set SST39SF010 EEPROM Type
		cmp	ah,SST_39SF010_DEVICE		;SST 39SF010 Device ID
		je	short Get_EEPROM_ID
	 endif;	Support_SST_39SF010_Series
;R11 - end
     endif;	Flash_2M_support
Not_SST_EEPROM_1: 
   endif;	SST_ID_Check_Routine
;R06 - end

;=======================================================
;  Compare BMI (Bright Microelectronics Inc.)  Device
;=======================================================
   ifdef	BM_ID_Check_Routine
     ifdef	Flash_2M_support
		mov	di,BM_2M_TYPE_EEPROM		;Set BMI 29FS020T EEPROM Type
		cmp	al,BRIGHT_MANU_ID		;
		jne	short Not_BMI_EEPROM
		cmp	ah,BM_29FS020T_DEVICE		;BMI 29F002T Device ID
		je	short Get_EEPROM_ID		
      endif;	Flash_2M_support
Not_BMI_EEPROM:
   endif;	BM_ID_Check_Routine

;=======================================================
;  Compare PMC (Progeammable Microelectronics Corp.)  Device
;=======================================================
   ifdef	PMC_ID_Check_Routine				
     ifdef	Flash_2M_support				
	  ifdef	Support_PMC_PM29F002C_Series
		mov	di,PMC_2M_TYPE_EEPROM
		cmp	al,PMC_MANU		;PMC Manufacturer Code
		jne	short Not_PMC_EEPROM
		cmp	ah,PMC_PM29F002C
		je	short Get_EEPROM_ID		
	  endif; Support_PMC_PM29F002C_Series
     endif;	Flash_2M_support
Not_PMC_EEPROM:
   endif;	PMC_ID_Check_Routine				
;=======================================================
;  Compare MOSEL Device  
;=======================================================
   ifdef	MOSEL_ID_Check_Routine				
		cmp	al,MOSEL_MANU
		jne	short Not_MOSEL_EEPROM
     ifdef	Flash_2M_support
	  ifdef	Support_IMT_IM29F002T_Series
		mov	di,IMT_2M_TYPE_EEPROM		;Set IMT 29F002T EEPROM Type
;R12		cmp	al,MOSEL_MANU
;R12		jne	short Not_MOSEL_EEPROM
		cmp	ah,MOSEL_V29C51002T_DEVICE
		je	short Get_EEPROM_ID		
	  endif;	Support_IMT_IM29F002T_Series
;R12     endif;	Flash_2M_support
;R12 - start
     else;	Flash_2M_support
	  ifdef	Support_MOSEL_V29C51001T_Series	
		mov	di,MOSEL_1M_TYPE_EEPROM		;Set MOSEL 1M EEPROM Type
		cmp	ah,MOSEL_V29C51001T_DEVICE
		je	short Get_EEPROM_ID		
	  endif;	Support_MOSEL_V29C51001T_Series	
     endif;	Flash_2M_support
;R12 - end
Not_MOSEL_EEPROM:
   endif;      MOSEL_ID_Check_Routine		   
;R09 - start		
;=======================================================
;  Compare MXIC Device  
;=======================================================
   ifdef	MXIC_ID_5V_Check_Routine	
     ifdef	Flash_2M_support
	  ifdef	Support_AM29F002_Series
		mov	di,MXIC_29F002T_EEPROM	;Set EEPROM Type
		cmp	al,MXIC_ID
		jne	short Not_MXIC_5V_EEPROM
		cmp	ah,MXIC_29F002T
		je	short Get_EEPROM_ID		
	  endif;Support_AM29F002_Series
     else;	Flash_2M_support
	  ifdef	Support_MXIC_29F001T_Series
		mov	di,MXIC_29F001T_EEPROM	;Set EEPROM Type
		cmp	al,MXIC_ID
		jne	short Not_MXIC_5V_EEPROM
		cmp	ah,MXIC_29F001T
		je	short Get_EEPROM_ID		
	  endif;Support_MXIC_29F001T_Series	
     endif;	Flash_2M_support
Not_MXIC_5V_EEPROM:
   endif;      MXIC_ID_5V_Check_Routine	

;R09 - end		
		   
;=======================================================
;  Compare IMT Device   ;;;must put last
;=======================================================
   ifdef	IMT_ID_Check_Routine				
     ifdef	Flash_2M_support
	  ifdef	Support_IMT_IM29F002T_Series
		rol	eax,8
		cmp	ax,(IMT_MANU_ID_1 shl 8) + IMT_MANU_ID_2
		jne	short Not_IM29F002

		shr	eax,16
		mov	di,IMT_2M_TYPE_EEPROM		;Set IMT 29F002T EEPROM Type
		cmp	al,IMT_IM29F002T_DEVICE		;IMT 29F002T device code
		je	short Get_EEPROM_ID
	  endif;	Support_IMT_IM29F002T_Series
     endif;	Flash_2M_support
Not_IM29F002:
   endif;	IMT_ID_Check_Routine				;

		stc					;Not device 
		ret
Get_EEPROM_ID:
		clc
		ret
endif	;JEDEC_Series_ID_Check_Routine		 


;=======================================================
; Read Flash ID Subroutine  (JEDEC strand 2)
;=======================================================


ifdef	JEDEC_Series_2_ID_Check_Routine		 
Check_JEDEC_2_ID :
		call	JEDEC_Series_Reset
		call	JEDEC_Series_2_Read_ID
		call	JEDEC_Series_Reset
;=======================================================
;  Compare SST Device
;=======================================================
   ifdef	SST_ID_Check_Routine		 
		cmp	al,SST_ID			;SST Manufacturer Code
		jne	short Not_SST_EEPROM		;
     ifdef	Flash_2M_support			
	 ifdef 	Support_SST29EE020_Series
		mov	di,SST_2M_TYPE_EEPROM		;Set SST29EE020 EEPROM Type
		cmp	ah,SST_29EE020_DEVICE		;SST 29EE020 Device ID
		je	short Get_EEPROM_ID2
;R04 -start
		cmp	ah,SST_29LE020_DEVICE		;SST 29LE020 /3V ID
		je	short Get_EEPROM_ID2
;R04 - end
	 endif;	Support_SST29EE020_Series
     else;	Flash_2M_support
	 ifdef	Support_SST_29EE010_Series
		mov	di,SST_1M_TYPE_EEPROM		;Set SST29EE010 EEPROM Type
		cmp	ah,SST_28EE010_DEVICE		;SST 28EE010 Device ID
		je	short Get_EEPROM_ID2
		cmp	ah,SST_29EE010_DEVICE		;SST 29EE010 Device ID
		je	short Get_EEPROM_ID2
	 endif;	Support_SST_29EE010_Series
     endif;	Flash_2M_support
Not_SST_EEPROM:			    
   endif;	SST_ID_Check_Routine
;=======================================================
;  Compare WINBOND Device
;=======================================================
   ifdef	WINBOND_ID_Check_Routine
		cmp	al,WINBOND_ID			;WINBOND Manufacturer Code
		jne	short Not_WINBOND_EEPROM
     ifdef	Flash_2M_support
	 ifdef 	Support_SST29EE020_Series
		mov	di,WINBOND_2M_TYPE_EEPROM	;Set WINBOND 29C020 EEPROM Type
		cmp	ah,WINBOND_29C020_DEVICE	;WINBOND 29C020 Device ID
		je	short Get_EEPROM_ID2
	 endif;	Support_SST29EE020_Series
     else;	Flash_2M_support
	 ifdef	Support_SST_29EE010_Series
		mov	di,WINBOND_1M_TYPE_EEPROM	;Set WINBOND 29EE011 EEPROM Type
		cmp	ah,WINBOND_29EE011_DEVICE	;WINBOND 29EE011 Device ID
		je	short Get_EEPROM_ID2
	 endif;	Support_SST_29EE010_Series
     endif;	Flash_2M_support
Not_WINBOND_EEPROM:
   endif;	WINBOND_ID_Check_Routine

		stc					;Not device 
		ret
Get_EEPROM_ID2:
		clc
		ret
endif	;JEDEC_Series_2_ID_Check_Routine		 

;R08 - start
;=======================================================
;	JEDEC_Series_3_ID_Check_Routine		 
;=======================================================
ifdef	JEDEC_Series_3_ID_Check_Routine		 
Check_JEDEC_3_ID:
		call	JEDEC_Series_3_Reset
		call	JEDEC_Series_3_Read_ID
		call	JEDEC_Series_3_Reset
;=======================================================
;  Compare AMD Device
;=======================================================
	ifdef	Flash_4M_support
	  ifdef Support_AM29F400BT_Series
		cmp	al,AMD_ID			;AMD Manufacturer Code
		jne	short Not_AMD_4M_Chip
		mov	di,AMD_4M_TYPE_EEPROM		;Set AMD 29F400BT EEPROM Type
		push	eax
		shr	eax, 16
		cmp	al,AMD_29F400BT_DEVICE		;AMD 29F400BT Device ID
		pop	eax
		je	short Get_EEPROM_ID_3
	  endif; Support_AM29F400BT_Series
	endif;	Flash_4M_support
Not_AMD_4M_Chip:
;R09 - start
	ifdef	Flash_4M_support
	  ifdef Support_AM29F400BT_Series
		cmp	al, SGS_THOMSON_MANU		;ST Manufacturer Code
		jne	short Not_ST_4M_Chip
		mov	di, ST_4M_TYPE_EEPROM		;Set EEPROM Type
		push	eax
		shr	eax, 16
		cmp	al, ST_M29F400T			;Device ID
		pop	eax
		je	short Get_EEPROM_ID_3
Not_ST_4M_Chip:
	  endif; Support_AM29F400BT_Series
	endif;	Flash_4M_support
;R09 - end

		stc
		ret
Get_EEPROM_ID_3:
		clc
		ret

endif;	JEDEC_Series_3_ID_Check_Routine		 
;R08 - end

;;=============================================

ifdef	INTEL_ID_Check_Routine				
Check_INTEL_EEPROM	proc	near	
		call	INTEL_Series_Reset
		call	INTEL_Series_Read_ID

		mov	al,byte ptr es:[0]
;=======================================================
;  Compare INTEL Device
;=======================================================
		cmp	al,INTEL_28F002T_ID		;INTEL Manufacturer Code
		jne	short Not_INTEL_EEPROM		

		mov	al,byte ptr es:[1]
   ifdef	Flash_2M_support				
		cmp	al,INTEL_28F020_DEVICE
		jne	short Not_bulk_type		
		mov	byte ptr Bulk_Flash_type[bp],-1	
Not_bulk_type:						
	ifdef	Support_INTEL_28F002BXT_Series
		mov	di,INTEL_2M_TYPE_EEPROM		
		cmp	al,INTEL_28F002T_DEVICE		;INTEL 28F002T Device ID
		je	short Is_INTEL_EEPROM		
	endif;	Support_INTEL_28F002BXT_Series
;R09 - start
	ifdef	Support_INTEL_E82802_Series
		mov	di, INTEL_4M_TYPE_EEPROM	
		cmp	al, INTEL_E82802AD		;INTEL Device ID
		je	short Is_INTEL_EEPROM

		cmp	al, INTEL_E82802AC		;INTEL Device ID
		je	short Is_INTEL_EEPROM
	endif;	Support_INTEL_E82802_Series
;R09 - end



   else;	Flash_2M_support
	ifdef	Support_INTEL_28F001BXT_Series
		mov	di,INTEL_1M_TYPE_EEPROM
		cmp	al,INTEL_28F001T_DEVICE		;INTEL 28F001T Device ID
		je	short Is_INTEL_EEPROM
	endif;	Support_INTEL_28F001BXT_Series
   endif;	Flash_2M_support
Not_INTEL_EEPROM:					
;=======================================================
;  Compare INTEL Device
;=======================================================
		cmp	al,CSI_ID			;CSI Manufacturer Code
		jne	short Not_CSI_EEPROM
		mov	al,byte ptr es:[1]
   ifdef	Flash_2M_support			
	ifdef	Support_INTEL_28F002BXT_Series
		mov	di,CSI_2M_TYPE_EEPROM
		cmp	al,CSI_CAT28F002T_DEVICE	;CSI CAT28F002T Device ID
		je	short Is_INTEL_EEPROM
	endif;	Support_INTEL_28F002BXT_Series
   else;	Flash_2M_support
	ifdef	Support_INTEL_28F001BXT_Series
		mov	di,CSI_1M_TYPE_EEPROM		
		cmp	al,CSI_CAT28F001P_DEVICE	;CSI CAT28F001P Device ID
		je	short Is_INTEL_EEPROM
	endif;	Support_INTEL_28F001BXT_Series
   endif;	Flash_2M_support

Not_CSI_EEPROM:

		call	INTEL_Series_Reset
		stc
		ret

Is_INTEL_EEPROM:					
		call	INTEL_Series_Reset
		clc
		ret		

Check_INTEL_EEPROM	endp  
endif;	INTEL_ID_Check_Routine

ifdef	MXIC_ID_Check_Routine	    
Check_MXIC_EEPROM	proc	near
	
		mov	byte ptr es:[0],50h 	;; Set Clear Status Command	    
		call	INTEL_Series_Reset
		call	INTEL_Series_Read_ID

		mov	al,byte ptr es:[0]	;Read Manufactur ID

		cmp	al,MXIC_ID			;MXIC Manufacturer Code
		jne	short Not_MXIC_EEPROM		

		call	INTEL_Series_Read_ID
		mov	al,byte ptr es:[1]	;Read Device ID
		call	INTEL_Series_Reset
ifdef	Flash_2M_support	    
	ifdef 	Support_MXIC28F002TTC_Series		
		mov	di,MXIC_2M_TYPE_1_EEPROM
		cmp	al,MXIC_28F002TTC_DEVICE
		je	short Is_MXIC_EEPROM	
	endif; 	Support_MXIC28F002TTC_Series		
	ifdef 	Support_MXIC28F2000PPC_Series
		mov	di,MXIC_2M_TYPE_EEPROM	
		cmp	al,MXIC_28F2000TPC_DEVICE
		je	short Is_MXIC_EEPROM	 
	  ifdef		Flash_4K_Unit
		cmp	al,MXIC_28F2000PPC_DEVICE	;MXIC 28F002T Device ID
		je	short Is_MXIC_EEPROM
	  endif;	Flash_4K_Unit
	endif; 	Support_MXIC28F2000PPC_Series

else;	Flash_2M_support
	 ifdef	Support_MXIC_28F1000PPC_Series
		mov	di,MXIC_1M_PPC_TYPE_EEPROM
		cmp	al,MXIC_28F1000PPC_DEVICE	;MXIC 28F001PPC Device ID
		je	short Is_MXIC_EEPROM
	 endif;	Support_MXIC_28F1000PPC_Series

   	 ifdef	Support_MXIC_28F1000PC_Series 
		mov	di,MXIC_1M_PL_TYPE_EEPROM
		cmp	al,MXIC_28F1000PL_DEVICE	;MXIC 28F001PL Device ID
		je	short Is_MXIC_EEPROM
   	 endif;	Support_MXIC_28F1000PC_Series	
endif;	Flash_2M_support
Not_MXIC_EEPROM:					
		stc
		ret
Is_MXIC_EEPROM:						
		clc
		ret

Check_MXIC_EEPROM	endp				
endif;	MXIC_ID_Check_Routine				

;[]==============================================================[]
;FLASH  Command  INTEL Series
; Used Group :	INTEL , MXIC
;Entry: NONE
;[]==============================================================[]
INTEL_Series_Reset:
		mov	byte ptr es:[0],RESET_CMD
		xor	cx,cx
		loop	$
		ret

INTEL_Series_Read_ID:
		mov	byte ptr es:[0],90h	;Read ID command
		xor	cx,cx
		loop	$
		ret
;[]==============================================================[]
;FLASH  Command  JEDEC Standard 
; Used Group :	AMD
;Entry: NONE
;[]==============================================================[]

JEDEC_Series_Reset:
		mov	byte ptr es:[5555h],0aah  ;
		mov	byte ptr es:[2AAAh],055h  ;
		mov	byte ptr es:[5555h],0F0h  ;
		xor	cx,cx			  ;delay time to Reset 
		loop	$
		ret

JEDEC_Series_Read_ID:
		mov	byte ptr es:[5555h],0aah
		mov	byte ptr es:[2AAAh],055h
		mov	byte ptr es:[5555h],090h  ;
		xor	cx,cx			  ;delay time to read ID
		loop	$
		mov	eax,dword ptr es:[0]		;read ID 
		ret

;[]==============================================================[]
;FLASH Read ID Command 
; JEDEC Standard 2
; Used Group :SST29EE020,Winbond 29C020
;Entry: NONE
;[]==============================================================[]

JEDEC_Series_2_Read_ID:
		mov	byte ptr es:[5555h],0aah
		mov	byte ptr es:[2AAAh],055h
		mov	byte ptr es:[5555h],080h
		mov	byte ptr es:[5555h],0aah
		mov	byte ptr es:[2AAAh],055h
		mov	byte ptr es:[5555h],060h
		xor	cx,cx				;delay time to read ID
		loop	$
		mov	ax,word ptr es:[0]		;read ID 
		ret
;R08 - start
ifdef	Flash_4M_support 
;[]==============================================================[]
;FLASH  Command  JEDEC Standard 
; Used Group :	AMD
;Entry: NONE
;[]==============================================================[]
JEDEC_Series_3_Reset:
		mov	byte ptr es:[0h],0F0h
		xor	cx,cx			;delay time to Reset 
		loop	$
		ret

JEDEC_Series_3_Read_ID:
		mov	byte ptr es:[First_Address], 0aah
		mov	byte ptr es:[Second_Address],055h
		mov	byte ptr es:[First_Address], 090h
		xor	cx,cx			  ;delay time to read ID
		loop	$
		mov	eax,dword ptr es:[0]		;read ID 
		ret
endif;	Flash_4M_support 

;R08 - end

EEPROM_Decode_End:

XCODE		ENDS

endif;	FLASH_SUPPORT		   
endif;	AUTO_DETECT_EEPROM_ID	   

		END
