;	[]===========================================================[]
;
;	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
;----------------------------------------------------------------------------
;R05	12/23/98 RIC	Enable high address writeable of E000 for ROM access.
;R04	11/06/98 RIC	Remove unused code.
;R03	11/04/98 BAR	Add diable F-segment cacheility when update BIOS
;R01	08/19/98 RIC	Add "Flash_W_By_GPO_Low","Flash_W_By_GPO_High" define.
;R00	08/15/98 RIC	Initialization.

;===========================================================================
;
;Flash_12V_Enable_By_GPO_Low	EQU	0	; GPO0 Low enable 12V
;Flash_12V_Enable_By_GPO_Low	EQU	1	; GPO1 Low enable 12V
;Flash_12V_Enable_By_GPO_Low	EQU	2	; GPO2 Low enable 12V
;..........
;Flash_12V_Enable_By_GPO_Low	EQU	30	; GPO30 Low enable 12V
;
;Flash_12V_Enable_By_GPO_High	EQU	0	; GPO0 High enable 12V
;Flash_12V_Enable_By_GPO_High	EQU	1	; GPO1 High enable 12V
;Flash_12V_Enable_By_GPO_High	EQU	2	; GPO2 High enable 12V
;..........
;Flash_12V_Enable_By_GPO_High	EQU	30	; GPO30 High enable 12V
;
;===========================================================================
;
;Flash_W_By_GPO_Low	EQU	0	; GPO0 Low Enable Flash Write.
;Flash_W_By_GPO_Low	EQU	1	; GPO1 Low Enable Flash Write.
;Flash_W_By_GPO_Low	EQU	2	; GPO2 Low Enable Flash Write.
;............
;Flash_W_By_GPO_Low	EQU	30	; GPO30 Low Enable Flash Write.
;
;Flash_W_By_GPO_High	EQU	0	; GPO0 High Enable Flash Write.
;Flash_W_By_GPO_High	EQU	1	; GPO1 High Enable Flash Write.
;Flash_W_By_GPO_High	EQU	2	; GPO2 High Enable Flash Write.
;............
;Flash_W_By_GPO_High	EQU	30	; GPO30 High Enable Flash Write.
;
;===========================================================================

.386p
		PAGE	56,132
		TITLE	CHIPSET  -- 386/486 EISA ROM/BIOS

		INCLUDE	BIOS.CFG
		INCLUDE	COMMON.MAC
		INCLUDE POST.EQU
		INCLUDE POST.MAC
		INCLUDE	BTROMSEG.EQU		
		extrn	Issue_System_Reset:Near      
		extrn	Get_Ct:Near			;R04
		extrn	Set_Ct:Near			;R04
		extrn	Get_Set_Ct:Near			;R04
		extrn	Get_PMIO:Near			;R04
		extrn	Set_PMIO:Near			;R04
		extrn	Get_Set_PMIO:Near		;R04

G_RAM		SEGMENT	USE16 AT 0

		ORG	04H*4
		INCLUDE	SEG_0.INC

		ORG	400H
		INCLUDE	G_RAM.INC

G_RAM		ENDS

DGROUP		GROUP	FCODE
FCODE		SEGMENT	USE16 PARA PUBLIC 'CODE'
		ASSUME	CS:DGROUP,DS:DGROUP

;;=======================================================================*
;; Check BIOS HOOK Function
;; Input : None
;; Output:   AX
;;	   bit 0    =	PCI_RESET_Support
;;	   bit 1    =   Switch_USB_SMI
;;	   bit 2-15 =	Reserved  must be 0
;;=======================================================================*
Aflash_report_fun	=	0 
ifdef 	PCI_RESET_SUPPORT
	Aflash_report_fun = Aflash_report_fun + 1
endif;	PCI_RESET_SUPPORT


ifdef	USB_SUPPORT
	Aflash_report_fun = Aflash_report_fun + 2
endif;	USB_SUPPORT



		ALIGN	8
FLASH_ROUTINE_HEAD	db	'$@AWDFLASH'			

		DW	Offset	DGROUP:KBC_12V_Control
		DW	Offset	DGROUP:Ct_ROM_Write_Enable
		DW	Offset	DGROUP:Ct_ROM_Write_Disable
		DW	Offset	DGROUP:Ct_Enable_ROM_Decode
		DW	Offset	DGROUP:Ct_Init
		DW	Offset	DGROUP:CT_Disable_ROM_Shadow
		DW	Offset	DGROUP:CT_Enable_ROM_Shadow
		DW	Offset	DGROUP:Ct_Special_REG_Save
		DW	Offset	DGROUP:Ct_After_Program
		DW	Offset	DGROUP:CT_Disable_CD_Shadow	
		DW	Offset	DGROUP:CT_Enable_CD_Shadow	
		DW	Aflash_Report_Fun      			
		DW	Offset  DGROUP:Issue_System_Reset      	
ifdef	USB_SUPPORT						
		DW	Offset  DGROUP:Switch_USB_SMI         	
endif;	USB_SUPPORT						

PUBLIC	FLASH_ROUTINE_START					
FLASH_ROUTINE_START:  
;;=======================================================================*
;; KBC_12V_Control:
;; 	ROM Write Vpp (12V) Control By Keyboard Pin 29/30
;; Input : None
;; Output: BL : Bit 0 Set	1 => Enable Control By Keyboard
;;		Bit 1 Set 	1 => Pin 29 Active
;; 		Bit 2 Set	1 => Pin 30 Active
;;=======================================================================*
		Public	KBC_12V_Control
KBC_12V_Control	proc	near
		xor	bl,bl
		retf	     
KBC_12V_Control	endp

;;=======================================================================*
;; Ct_ROM_Write_Enable:
;; Input : None
;; Output: None
;; Note  : This routine is OEM dependent
;;=======================================================================*
		Public	Ct_ROM_Write_Enable
Ct_ROM_Write_Enable	proc	near
		pusha
		mov	cx,VT586 + 40h
		call	Get_Ct
		or	al,01h
		call	Set_Ct
	;-------------------------------;
	;  Control 12V	(Low => Enable)	;
	;-------------------------------;
  IFDEF	Flash_12V_Enable_By_GPO_Low
		;***************;
		;   GPO 0-7	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_Low LE 7
		mov	cl,4ch
		call	Get_PMIO
		and    	al,not (01 shl Flash_12V_Enable_By_GPO_Low)
		call	Set_PMIO
    endif;Flash_12V_Enable_By_GPO_Low LE 7
		;***************;
		;   GPO 8-15	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_Low LE 15
      IF    Flash_12V_Enable_By_GPO_Low GE 8
		mov	cl,4dh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_12V_Enable_By_GPO_Low-8))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_Low GE 8
    endif;Flash_12V_Enable_By_GPO_Low LE 15
		;***************;
		;   GPO 16-23	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_Low LE 23
      IF    Flash_12V_Enable_By_GPO_Low GE 16
		mov	cl,4eh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_12V_Enable_By_GPO_Low-16))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_Low GE 16
    endif;Flash_12V_Enable_By_GPO_Low LE 23
		;***************;
		;   GPO 24-30	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_Low LE 30
      IF    Flash_12V_Enable_By_GPO_Low GE 24
		mov	cl,4fh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_12V_Enable_By_GPO_Low-24))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_Low GE 24
    endif;Flash_12V_Enable_By_GPO_Low LE 30
  ENDIF;	Flash_12V_Enable_By_GPO_Low


	;-------------------------------;
	; Control 12V  (High => Enable)	;
	;-------------------------------;
  IFDEF	Flash_12V_Enable_By_GPO_High
		;***************;
		;   GPO 0-7	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_High LE 7
		mov	cl,4ch
		call	Get_PMIO
		or    	al, (01 shl Flash_12V_Enable_By_GPO_High)
		call	Set_PMIO
    endif;Flash_12V_Enable_By_GPO_High LE 7
		;***************;
		;   GPO 8-15	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_High LE 15
      IF    Flash_12V_Enable_By_GPO_High GE 8
		mov	cl,4dh
		call	Get_PMIO
		or    	al, (01 shl (Flash_12V_Enable_By_GPO_High-8))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_High GE 8
    endif;Flash_12V_Enable_By_GPO_High LE 15
		;***************;
		;   GPO 16-23	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_High LE 23
      IF    Flash_12V_Enable_By_GPO_High GE 16
		mov	cl,4eh
		call	Get_PMIO
		or    	al, (01 shl (Flash_12V_Enable_By_GPO_High-16))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_High GE 16
    endif;Flash_12V_Enable_By_GPO_High LE 23
		;***************;
		;   GPO 24-30	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_High LE 30
      IF    Flash_12V_Enable_By_GPO_High GE 24
		mov	cl,4fh
		call	Get_PMIO
		or    	al, (01 shl (Flash_12V_Enable_By_GPO_High-24))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_High GE 24
    endif;Flash_12V_Enable_By_GPO_High LE 30
  ENDIF;	Flash_12V_Enable_By_GPO_High

;R01 - starts
	;-------------------------------;
	;  ROM Writable	(Low => Enable)	;
	;-------------------------------;
  IFDEF	Flash_W_By_GPO_Low
		;***************;
		;   GPO 0-7	;
		;***************;
    if	  Flash_W_By_GPO_Low LE 7
		mov	cl,4ch
		call	Get_PMIO
		and    	al,not (01 shl Flash_W_By_GPO_Low)
		call	Set_PMIO
    endif;Flash_W_By_GPO_Low LE 7
		;***************;
		;   GPO 8-15	;
		;***************;
    if	  Flash_W_By_GPO_Low LE 15
      IF    Flash_W_By_GPO_Low GE 8
		mov	cl,4dh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_W_By_GPO_Low-8))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_Low GE 8
    endif;Flash_W_By_GPO_Low LE 15
		;***************;
		;   GPO 16-23	;
		;***************;
    if	  Flash_W_By_GPO_Low LE 23
      IF    Flash_W_By_GPO_Low GE 16
		mov	cl,4eh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_W_By_GPO_Low-16))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_Low GE 16
    endif;Flash_W_By_GPO_Low LE 23
		;***************;
		;   GPO 24-30	;
		;***************;
    if	  Flash_W_By_GPO_Low LE 30
      IF    Flash_W_By_GPO_Low GE 24
		mov	cl,4fh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_W_By_GPO_Low-24))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_Low GE 24
    endif;Flash_W_By_GPO_Low LE 30
  ENDIF;	Flash_W_By_GPO_Low


	;-------------------------------;
	; ROM Writable (High => Enable)	;
	;-------------------------------;
  IFDEF	Flash_W_By_GPO_High
		;***************;
		;   GPO 0-7	;
		;***************;
    if	  Flash_W_By_GPO_High LE 7
		mov	cl,4ch
		call	Get_PMIO
		or    	al, (01 shl Flash_W_By_GPO_High)
		call	Set_PMIO
    endif;Flash_W_By_GPO_High LE 7
		;***************;
		;   GPO 8-15	;
		;***************;
    if	  Flash_W_By_GPO_High LE 15
      IF    Flash_W_By_GPO_High GE 8
		mov	cl,4dh
		call	Get_PMIO
		or    	al, (01 shl (Flash_W_By_GPO_High-8))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_High GE 8
    endif;Flash_W_By_GPO_High LE 15
		;***************;
		;   GPO 16-23	;
		;***************;
    if	  Flash_W_By_GPO_High LE 23
      IF    Flash_W_By_GPO_High GE 16
		mov	cl,4eh
		call	Get_PMIO
		or    	al, (01 shl (Flash_W_By_GPO_High-16))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_High GE 16
    endif;Flash_W_By_GPO_High LE 23
		;***************;
		;   GPO 24-30	;
		;***************;
    if	  Flash_W_By_GPO_High LE 30
      IF    Flash_W_By_GPO_High GE 24
		mov	cl,4fh
		call	Get_PMIO
		or    	al, (01 shl (Flash_W_By_GPO_High-24))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_High GE 24
    endif;Flash_W_By_GPO_High LE 30
  ENDIF;	Flash_W_By_GPO_High
;R01 - ends
		popa
		retf
Ct_ROM_Write_Enable	endp

;;=======================================================================*
;; Ct_ROM_Write_Disable:
;; Input : None
;; Output: None
;; Note  : This routine is OEM dependent
;;=======================================================================*
		Public	Ct_ROM_Write_Disable
Ct_ROM_Write_Disable	proc	near
		pusha
		mov	cx,VT586 + 40h
		call	Get_Ct
		and	al,not 01h
		call	Set_Ct
	;-------------------------------;
	; Control 12V (High => Disable)	;
	;-------------------------------;
  IFDEF	Flash_12V_Enable_By_GPO_Low
		;***************;
		;   GPO 0-7	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_Low LE 7
		mov	cl,4ch
		call	Get_PMIO
		or    	al, (01 shl Flash_12V_Enable_By_GPO_Low)
		call	Set_PMIO
    endif;Flash_12V_Enable_By_GPO_Low LE 7
		;***************;
		;   GPO 8-15	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_Low LE 15
      IF    Flash_12V_Enable_By_GPO_Low GE 8
		mov	cl,4dh
		call	Get_PMIO
		or    	al, (01 shl (Flash_12V_Enable_By_GPO_Low-8))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_Low GE 8
    endif;Flash_12V_Enable_By_GPO_Low LE 15
		;***************;
		;   GPO 16-23	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_Low LE 23
      IF    Flash_12V_Enable_By_GPO_Low GE 16
		mov	cl,4eh
		call	Get_PMIO
		or    	al, (01 shl (Flash_12V_Enable_By_GPO_Low-16))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_Low GE 16
    endif;Flash_12V_Enable_By_GPO_Low LE 23
		;***************;
		;   GPO 24-30	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_Low LE 30
      IF    Flash_12V_Enable_By_GPO_Low GE 24
		mov	cl,4fh
		call	Get_PMIO
		or    	al, (01 shl (Flash_12V_Enable_By_GPO_Low-24))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_Low GE 24
    endif;Flash_12V_Enable_By_GPO_Low LE 30
  ENDIF;Flash_12V_Enable_By_GPO_Low


	;-------------------------------;
	; Control 12V  (Low => Disable)	;
	;-------------------------------;
  IFDEF	Flash_12V_Enable_By_GPO_High
		;***************;
		;   GPO 0-7	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_High LE 7
		mov	cl,4ch
		call	Get_PMIO
		and    	al,not (01 shl Flash_12V_Enable_By_GPO_High)
		call	Set_PMIO
    endif;Flash_12V_Enable_By_GPO_High LE 7
		;***************;
		;   GPO 8-15	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_High LE 15
      IF    Flash_12V_Enable_By_GPO_High GE 8
		mov	cl,4dh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_12V_Enable_By_GPO_High-8))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_High GE 8
    endif;Flash_12V_Enable_By_GPO_High LE 15
		;***************;
		;   GPO 16-23	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_High LE 23
      IF    Flash_12V_Enable_By_GPO_High GE 16
		mov	cl,4eh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_12V_Enable_By_GPO_High-16))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_High GE 16
    endif;Flash_12V_Enable_By_GPO_High LE 23
		;***************;
		;   GPO 24-30	;
		;***************;
    if	  Flash_12V_Enable_By_GPO_High LE 30
      IF    Flash_12V_Enable_By_GPO_High GE 24
		mov	cl,4fh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_12V_Enable_By_GPO_High-24))
		call	Set_PMIO
      ENDIF;Flash_12V_Enable_By_GPO_High GE 24
    endif;Flash_12V_Enable_By_GPO_High LE 30
  ENDIF;Flash_12V_Enable_By_GPO_High


;R01 - starts
	;-------------------------------;
	; ROM Writable (High => Disable);
	;-------------------------------;
  IFDEF	Flash_W_By_GPO_Low
		;***************;
		;   GPO 0-7	;
		;***************;
    if	  Flash_W_By_GPO_Low LE 7
		mov	cl,4ch
		call	Get_PMIO
		or    	al, (01 shl Flash_W_By_GPO_Low)
		call	Set_PMIO
    endif;Flash_W_By_GPO_Low LE 7
		;***************;
		;   GPO 8-15	;
		;***************;
    if	  Flash_W_By_GPO_Low LE 15
      IF    Flash_W_By_GPO_Low GE 8
		mov	cl,4dh
		call	Get_PMIO
		or    	al, (01 shl (Flash_W_By_GPO_Low-8))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_Low GE 8
    endif;Flash_W_By_GPO_Low LE 15
		;***************;
		;   GPO 16-23	;
		;***************;
    if	  Flash_W_By_GPO_Low LE 23
      IF    Flash_W_By_GPO_Low GE 16
		mov	cl,4eh
		call	Get_PMIO
		or    	al, (01 shl (Flash_W_By_GPO_Low-16))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_Low GE 16
    endif;Flash_W_By_GPO_Low LE 23
		;***************;
		;   GPO 24-30	;
		;***************;
    if	  Flash_W_By_GPO_Low LE 30
      IF    Flash_W_By_GPO_Low GE 24
		mov	cl,4fh
		call	Get_PMIO
		or    	al, (01 shl (Flash_W_By_GPO_Low-24))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_Low GE 24
    endif;Flash_W_By_GPO_Low LE 30
  ENDIF;Flash_W_By_GPO_Low


	;-------------------------------;
	; ROM Writable (Low => Disable)	;
	;-------------------------------;
  IFDEF	Flash_W_By_GPO_High
		;***************;
		;   GPO 0-7	;
		;***************;
    if	  Flash_W_By_GPO_High LE 7
		mov	cl,4ch
		call	Get_PMIO
		and    	al,not (01 shl Flash_W_By_GPO_High)
		call	Set_PMIO
    endif;Flash_W_By_GPO_High LE 7
		;***************;
		;   GPO 8-15	;
		;***************;
    if	  Flash_W_By_GPO_High LE 15
      IF    Flash_W_By_GPO_High GE 8
		mov	cl,4dh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_W_By_GPO_High-8))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_High GE 8
    endif;Flash_W_By_GPO_High LE 15
		;***************;
		;   GPO 16-23	;
		;***************;
    if	  Flash_W_By_GPO_High LE 23
      IF    Flash_W_By_GPO_High GE 16
		mov	cl,4eh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_W_By_GPO_High-16))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_High GE 16
    endif;Flash_W_By_GPO_High LE 23
		;***************;
		;   GPO 24-30	;
		;***************;
    if	  Flash_W_By_GPO_High LE 30
      IF    Flash_W_By_GPO_High GE 24
		mov	cl,4fh
		call	Get_PMIO
		and    	al,not (01 shl (Flash_W_By_GPO_High-24))
		call	Set_PMIO
      ENDIF;Flash_W_By_GPO_High GE 24
    endif;Flash_W_By_GPO_High LE 30
  ENDIF;Flash_W_By_GPO_High
;R01 - ends
		popa
		retf
Ct_ROM_Write_Disable	endp
;;=======================================================================*
;; Enable Flash ROM decode for special motherboard
;; Input : None
;; Output: None
;; Note  : This routine is OEM dependent
;;=======================================================================*
		Public	Ct_Enable_ROM_Decode
Ct_Enable_ROM_Decode	proc	near
		pusha
		mov	cx,VT586 + 43h
		call	Get_Ct
		mov	cs:VT586_43_VAL,al
;R05		or	al,30h
		or	al,0B0h			;R05
		call	Set_Ct
ifdef	Enable_Flash_ROM_By_Low_GPIO
		;---------------------------------------;
		; Set GPIO to Low for Enabled Flash ROM	;
		;---------------------------------------;
		mov	cl,40
		call	Get_PMIO
		or	al,(01h shl Enable_Flash_ROM_By_Low_GPIO)
		call	Set_PMIO

		mov	cl,42
		call	Get_PMIO
		and	al,not (01h shl Enable_Flash_ROM_By_Low_GPIO)
		call	Set_PMIO
endif;	Enable_Flash_ROM_By_Low_GPIO
ifdef	Enable_Flash_ROM_By_High_GPIO
		;----------------------------------------;
		; Set GPIO to High for Enabled Flash ROM ;
		;----------------------------------------;
		mov	cl,40
		call	Get_PMIO
		or	al,(01h shl Enable_Flash_ROM_By_High_GPIO)
		call	Set_PMIO

		mov	cl,42
		call	Get_PMIO
		or	al,(01h shl Enable_Flash_ROM_By_High_GPIO)
		call	Set_PMIO
endif;	Enable_Flash_ROM_By_High_GPIO
		popa
		retf
Ct_Enable_ROM_Decode	endp

;;=======================================================================*
;; Initialize motherboard to desired status
;; Input : None
;; Output: None
;; Note  : This routine is OEM dependent
;;=======================================================================*
		Public	Ct_Init
Ct_Init		proc	near
		pushad
		mov	cl, 2ch			
		call	Get_PMIO		
		and	al, NOT 01h		
		call	Set_PMIO		
;R03 - start
ifdef P6_BIOS_ONLY
;disable F-segment cacheability
		xor	eax,eax		;disable F-segment cacheability
		xor	edx,edx		
 		mov	ecx,26EH       	;address(26EH) for F0000-F7FFF
 		WRMSR
 		mov	cx,26FH		;address(26FH) for F8000-FFFFF
 		WRMSR 
endif; P6_BIOS_ONLY
;R03 - end
		popad
		retf
Ct_Init		endp

;;=======================================================================*
;; Disable ROM Shadow
;; Input	: None
;; Output	: None
;;=======================================================================*
		Public	CT_Disable_ROM_Shadow
CT_Disable_ROM_Shadow	proc	near
		pusha

		mov	cx,VT692 + 52h
		call	Get_Ct
		mov	cs:VT692_52_VAL,al
		and	al,not 30h			; Disable E000h-FFFFh
		call	Set_Ct				; cacheable

		mov	cx,VT692 + 63h
		call	Get_Ct
		mov	cs:VT692_63_VAL,al
		and	al,not 0f0h			;Disable E/F Shadow
		call	Set_Ct

		popa
		retf
CT_Disable_ROM_Shadow	endp
VT692_52_VAL	db	(0)		;cachealbe
VT692_63_VAL	db	(0)		;shadow
VT586_43_VAL	db	(0)		;128k ROM
;;=======================================================================*
;; Enable ROM Shadow
;; Input	: None
;; Output	: None
;;=======================================================================*
		Public	CT_Enable_ROM_Shadow
CT_Enable_ROM_Shadow	proc	near
		pusha
		mov	al,cs:VT692_63_VAL
		mov	cx,VT692 + 63h
		call	Set_Ct

		mov	al,cs:VT692_52_VAL
		mov	cx,VT692 + 52h			;cacheable
		call	Set_Ct

		popa
		retf
CT_Enable_ROM_Shadow	endp

;;=======================================================================*
;; Ct_After_Program:
;; 	Set system into certain state after flash memory fininsh program
;; 	Normally, enable flash write protect
;; Input  : None
;; Output : None
;;=======================================================================*
		Public	Ct_After_Program
Ct_After_Program	proc	near
		pusha
		mov	al,cs:VT586_43_VAL
		mov	cx,VT586 + 43h			;128K ROM
		call	Set_Ct
		popa
		retf
Ct_After_Program	endp
;;=======================================================================*
;; Ct_Special_REG_Save:
;;	For register call by two hook or more, save register value here.
;;
;;		Ex: 	MOV	CX,XXXX
;;			CALL	GET_CT
;;			MOV	[SI],AX		; save word value
;;		 	MOV	CX,XXXX
;;			CALL	GET_CT
;;			MOV	[SI+2],AL	; save byte value
;;		 	MOV	CX,XXXX
;;			CALL	GET_CT
;;			MOV	[SI+3],AL
;;		MAX Length => 30 Bytes
;; Input : DS:SI
;; Output: None
;; Save	 : DS,ES
;;=======================================================================*
		Public	Ct_Special_REG_Save
Ct_Special_REG_Save	proc	near
		retf
Ct_Special_REG_Save	endp

;;=======================================================================*
;; Disable C/D ROM Shadow
;; Input	: None
;; Output	: None
;;=======================================================================*
		Public	CT_Disable_ROM_Shadow
CT_Disable_CD_Shadow	proc	near


ifdef Flash_16K_8K_8K_Unit
		pusha

		mov	cx,VT692 + 52h
		call	Get_Ct
		mov	cs:VT692_52_VAL1,al
		and	al,not 0c0h			; Disable C000h-DFFFh
		call	Set_Ct				; cacheable

		mov	cx,VT692 + 61h
		call	Get_Ct
		mov	cs:VT692_61_VAL,al
		xor	al,al				;Disable C000 Shadow
		call	Set_Ct

		mov	cx,VT692 + 62h
		call	Get_Ct
		mov	cs:VT692_62_VAL,al
		xor	al,al				;Disable D000 Shadow
		call	Set_Ct

		popa
endif ;Flash_16K_8K_8K_Unit				

		retf
CT_Disable_CD_Shadow	endp
ifdef Flash_16K_8K_8K_Unit				
VT692_52_VAL1	db	(0)		;C/D Segment cachealbe
VT692_61_VAL	db	(0)		;C000 shadow
VT692_62_VAL	db	(0)		;D000 shadow
endif ;Flash_16K_8K_8K_Unit				
;;=======================================================================*
;; Enable C/D ROM Shadow
;; Input	: None
;; Output	: None
;;=======================================================================*
		Public	CT_Enable_ROM_Shadow
CT_Enable_CD_Shadow	proc	near

ifdef Flash_16K_8K_8K_Unit				
		pusha
		mov	al,cs:VT692_61_VAL
		mov	cx,VT692 + 61h
		call	Set_Ct

		mov	al,cs:VT692_62_VAL
		mov	cx,VT692 + 62h
		call	Set_Ct

		mov	al,cs:VT692_52_VAL1
		mov	cx,VT692 + 52h			;cacheable
		call	Set_Ct

		popa
endif ;Flash_16K_8K_8K_Unit				

		retf
CT_Enable_CD_Shadow	endp

;R04 CONFIG_ADDR	equ	0CF8h
;R04 ;---------------------------------------------------------------
;R04 ; Get_Ct(Get_PCI):
;R04 ;	Reads a value directly from the chipset register.
;R04 ;
;R04 ; Input  :	CX = Index register to read
;R04 ; Output :	AL = Value read
;R04 ; Destory:	EAX, DX
;R04 ;---------------------------------------------------------------
;R04 
;R04 Get_Ct		proc	near
;R04 Get_PCI:
;R04 		mov	ax, 8000h		;enable PCI config.
;R04 		shl	eax, 16
;R04 		mov	ax, cx
;R04 		and	al, not 03h		;32 bit access for PCI
;R04 		mov	dx, CONFIG_ADDR		;index is 0CF8h
;R04 		out	dx, eax
;R04 		mov	dl, 0fch		;start from 0CFCh
;R04 		mov	al, cl
;R04 		and	al, 03h
;R04 		add	dl, al			;byte index to read
;R04 		in	al, dx
;R04 		ret
;R04 Get_Ct		endp
;R04 
;R04 ;---------------------------------------------------------------
;R04 ; Set_Ct(Set_PCI):
;R04 ;	Changes a value in the chipset register.
;R04 ; Input  :	CX = Index register to change
;R04 ;		AL = Value to change
;R04 ; Output :	None
;R04 ; Destory:	EAX, ECX, DX
;R04 ;
;R04 ;---------------------------------------------------------------
;R04 Set_Ct		proc	near
;R04 Set_PCI:
;R04 		xchg	ax, cx
;R04 		shl	ecx, 16		;save write value
;R04 		xchg	ax, cx		;restore cx
;R04 		mov	ax, 8000h	;enable PCI config.
;R04 		shl	eax, 16
;R04 		mov	ax, cx
;R04 		and	al, not 03h	;32 bit access for PCI
;R04 		mov	dx, CONFIG_ADDR	;index is 0CF8h
;R04 		out	dx, eax
;R04 		mov	dl, 0fch	;start from 0CFCh
;R04 		mov	al, cl
;R04 		and	al, 03h
;R04 		add	dl, al		;byte index to read
;R04 		shr	ecx, 16		;restore value
;R04 		mov	ax, cx
;R04 		out	dx, al
;R04 		ret
;R04 
;R04 Set_Ct		endp
;R04 
;R04 ;input: CX -- index port
;R04 Get_PMIO     proc    near
;R04 		push	dx
;R04 		mov	eax, 80000000h + VT586_ACPI + 48h	
;R04 		mov	dx, 0cf8h
;R04 		out	dx, eax
;R04 		mov	dl, 0fch
;R04 		in	ax, dx
;R04 		mov	dx, ax
;R04 		and	dx, NOT 03h
;R04 		add	dl, cl
;R04 		in	al, dx
;R04 		pop	dx
;R04                 ret
;R04 Get_PMIO      endp
;R04 
;R04 ;input  AL -- value
;R04 ;input: CX -- index port
;R04 Set_PMIO     proc    near
;R04 		push	dx
;R04 		push	bx
;R04 		mov	bl, al
;R04 		mov	eax, 80000000h + VT586_ACPI + 48h	
;R04 		mov	dx, 0cf8h
;R04 		out	dx, eax
;R04 		mov	dl, 0fch
;R04 		in	ax, dx
;R04 		mov	dx, ax
;R04 		and	dx, NOT 03h
;R04 		add	dl, cl
;R04 		mov	al, bl
;R04 		out	dx, al
;R04 		pop	bx
;R04 		pop	dx
;R04                 ret
;R04 Set_PMIO      endp

;;=======================================================================*
;; Switch_USB_SMI
;; Input	: al=0 disable USB SMI
;;		    =1 Enable  USB SMI
;; Output	: None
;;=======================================================================*

ifdef	USB_SUPPORT
		Public	Switch_USB_SMI
Switch_USB_SMI	proc	near

		pusha
		mov	bl,al
		mov	cx,2ch		;usb address
		call	Get_PMIO
		and	al,not 01	;2C bit [0] : 0 => Disable USB SMI
		or	al,bl		;	      1 => Enaable USB SMI	
		call	Set_PMIO
		popa
		retf

Switch_USB_SMI	endp
endif;	USB_SUPPORT

FLASH_ROUTINE_END:
PUBLIC	FLASH_ROUTINE_LEN
FLASH_ROUTINE_LEN	DW	offset FLASH_ROUTINE_END - offset FLASH_ROUTINE_START

FCODE		ENDS
		END
