;	[]===========================================================[]
;
;	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
;----------------------------------------------------------------------------
;R04	12/07/98 RIC	Fix that Clock item of jumpless hidden error.
;R03	12/01/98 RIC	Fix that the Ratio of jumpless fail in 'Manual' Mode.
;R02	11/30/98 RIC	Fix R01 code mistake.
;R01	11/20/98 RIC	Fix that system CMOS checksum still error in twice
;			save SETUP cmos when clear CMOS.
;R00	11/16/98 RIC	Initialization.

ifdef	JUMPLESS_FOR_BOOTROM_ASM
ROMCALL	MACRO	RTN_NAME
	LOCAL	RTN_ADD
	mov	sp,offset DGROUP:RTN_ADD
	jmp	RTN_NAME
ifdef	CompileForExtROM
	ALIGN	4
endif	;CompileForExtROM
RTN_ADD:
		dw	DGROUP:$+2
		ENDM

;[]=============================================================[]
; Inputs:	None
; Output:	CF: 100 Mhz
;		NC:  66 Mhz
;[]=============================================================[]

Ct_Quatify_100Mhz	proc	near
		mov	dx, 0cf8h
		mov     eax,80000068h	; VT692 + 68h
		out	dx, eax
		mov	dx, 0cfch
		in	al, dx
		test	al,01h			; If 100MHz Host CLK ?
		jz	C_Not_100MHz_HCLK	; Not, Jmp

		stc				;100 Mhz
	   	ret
	C_Not_100MHz_HCLK:
		clc				;66 Mhz
		ret
Ct_Quatify_100Mhz	endp

Get_Cmos22:
		OUT	72h,AL			; address to interface
		jcxz	short $+2
		ALIGN	4
		IN	AL,73h
		jcxz	short $+2
		ret	
Set_Cmos22:
		OUT	72h,AL			; address to interface
		jcxz	short $+2
		xchg	al,ah			;ah=index,al=value	   
		ALIGN 4
		OUT	73h,AL			; and output it
		jcxz	short $+2
		ret
Get_Pcii:
CONFIG_ADDR	EQU	0cf8h
		mov	ax,8000H	;enable PCI config.
		shl	eax,16
		mov	ax,cx
		and	al,NOT 03h	;32 bit access for PCI
		mov	dx,CONFIG_ADDR	;index is 0cf8h
		out	dx,eax
		add	dl,4		;start from 0cfch
		mov	al,cl
		and	al,03h
		add	dl,al	  	;byte index to read
		in	al,dx
		ret
Set_Pcii:
		xchg	ax,cx
		shl	ecx,16		;save value
		xchg	ax,cx		;restore cx
		mov	ax,8000H	;enable PCI config.
		shl	eax,16
		mov	ax,cx
		and	al,NOT 03h	;32 bit access for PCI
		mov	dx,CONFIG_ADDR	;index is 0cf8h
		out	dx,eax
		add	dl,4		;start from 0cfch
		mov	al,cl
		and	al,03h
		add	dl,al	  	;byte index to read

		mov	eax,ecx
		shr	eax,16

		out	dx,al
		ret

Set_Clock	proc	near
		;---------------------------------------;
		;   Check If CMOS Checksum Error ?	;
		;---------------------------------------;
		xor	bx,bx
		xor	ah,ah
		mov	cl,10h NMI_OFF
	CMOS_CHKSM:
		mov	al,cl
		ROMCALL get_cmos
		add	bx,ax
		inc	cl
		cmp	cl, 2eh nmi_off
		jne	short CMOS_CHKSM
		
		mov	al,2eh NMI_OFF
		ROMCALL get_cmos
		mov	ah,al
		mov	al,2Fh NMI_OFF
		ROMCALL get_cmos
		cmp	bx,ax
		je	short CMOS_CHKSM_OK

		mov	al,OVERRIDE_CMOS2 NMI_OFF
		mov	ah,OVERRIDE_VALUE	;set flag
		ROMCALL Set_cmos22

		jmp	No_Set_Clock		;Yes ,skip
	CMOS_CHKSM_OK:
ifndef	No_Use_CPU_Freq_Detection			;R06

		;-------------------------------;
		;   Check If CPU is Changed ?	;
		;-------------------------------;
		mov	al,CLOCK_CMOS2 NMI_OFF
		ROMCALL Get_Cmos22
		and	al,01110000b
		shr	al,4
		mov	bl,al

if 1
		ROMcall	Ct_Quatify_100Mhz
		jnc	Yes66Mhz
else
		mov	ecx,2AH			;Power on Config. Reg.
		RDMSR
		test	eax,080000H		;bit 19 on (100Mhz) ?
		jz	short Yes66Mhz		;not 100Mhz host clock
endif
								
		cmp	bl,4					
		je	short CPUID_Same 			
								
		cmp	bl,5					
		je	short CPUID_Same 			
								
		cmp	bl,6					
		je	short CPUID_Same 			
								
		cmp	bl,7					
		je	short CPUID_Same 			
								
		jmp	short CPUID_Different  			
Yes66Mhz:


		cmp	bl,4					
		je	short CPUID_Different 			
								
		cmp	bl,5					
		je	short CPUID_Different 			
								
		cmp	bl,6					
		je	short CPUID_Different 			
								
		cmp	bl,7					
		je	short CPUID_Different 			

endif;	No_Use_CPU_Freq_Detection			;R06
		jmp	short CPUID_Same
								
CPUID_Different:

		mov	al,OVERRIDE_CMOS2 NMI_OFF
		mov	ah,OVERRIDE_VALUE		;clear flag
		ROMCALL Set_Cmos22

		mov	al,OEM_Error_CMOS1 NMI_OFF
		ROMCALL Get_Cmos
		or	al,OEM_Error_CMOS_Bits1
		mov	ah,al			;set cpu changed flag
		mov	al,OEM_Error_CMOS1 NMI_OFF
		ROMCALL Set_Cmos

		jmp	No_Set_Clock		;Yes ,skip

CPUID_Same:

		;-------------------------------;
		;   Do CPU Ratio Jumperless	;
		;-------------------------------;

;------ Start to initial 8042		

		mov	cx,800h
		mov	al,0AAh
		out	64h,al		;send self-test cmd.
		loop 	short $

		mov	cx,800h
		mov	al,060h		;write 8042 command byte
		out	64h,al
		loop 	short $

		mov	cx,800h
		mov	al,45h		;AT interface, keyboard enabled, system flag
		out	60h,al
		loop 	short $

		mov	cx,800h
		mov	al,0AEh		;enable keyboard
		out	64h,al
		loop 	short $

;------ Start to get keyin value

		mov	cx,05000h
	@@:
		in	al, 60h			;get dummy data
		loop	short @B

		cmp	al, 52h			;key [Insert]

		je	short Press_Ins_key	;Yes

		cmp	al, 70h			;key [Insert]
		je	short Press_Ins_key	;Yes

		jmp	short Normal_Jpless		;No ,continue

;-------- Set Override key mark
Set_Override_Sure:
Press_Ins_key:
		mov	al,OVERRIDE_CMOS2 NMI_OFF
		mov	ah,OVERRIDE_VALUE	;set flag
		ROMCALL Set_cmos22

		jmp	No_Set_Clock		;Yes ,skip

	Normal_Jpless:
;------ Start to Set Ratio value
		mov     al, CLOCK_CMOS2 NMI_OFF	;

		out     72h, al			;
		jcxz	short $+2
		in      al, 73h			;
		jcxz	short $+2
ifdef	Debug_Ratio
out 9eh,al
endif;	Debug_Ratio
		and	al,0Fh		; Get Bit 3,2,1,0

		mov	bh, al		; Save to BH

		mov	bl,al
		and	bl,01h		
		mov	dx,ACPI_Port + 4Dh	; Set GPO8
		in	al,dx
		and	al,not 01h
		or	al,bl
		out	dx,al

		mov	bl,bh
		and	bl,06h
		shl	bl, 3		; Shift to Bit 5,4
		mov	dx,ACPI_Port + 4Dh	; Set GPO13,12
		in	al,dx
		and	al,not 30h
		or	al,bl
		out	dx,al

		mov	bl,bh
		and	bl,08h
		shl	bl, 2		; Shift to Bit 5
		or	bl,08h		; GPO27 High
		mov	dx,ACPI_Port + 4Fh	; Set GPO Register
		in	al,dx
		and	al,not 028h		; mask Bit 6,5,4,3
		or	al,bl
		out	dx,al			;

;( GPO[28] for latch )
	;set GPO(28) 1-0-1 to enable clock-generator

		mov	dx,ACPI_Port + 4Fh
		in	al,dx
		NEWIODELAY
		NEWIODELAY
		or	al,00010000b
		out	dx,al
		NEWIODELAY
		NEWIODELAY

		mov	cx,02000H
	@@:							
		NEWIODELAY				
		loop	short @B			

		and	al,11101111b
		out	dx,al
		NEWIODELAY
		NEWIODELAY

		mov	cx,02000H
	@@:							
		NEWIODELAY				
		loop	short @B			

		or	al,00010000b
		out	dx,al
		NEWIODELAY     


		mov     al, 50h NMI_OFF		; CMOS index 50h
		out     70h, al			;
		jcxz	short $+2
		in      al, 71h			;
		jcxz	short $+2

;R02		test    al, 80h			; test Flag
		test    al, 10h			; test Flag
;R01		jz      short Dont_Reset	; if '0' => Dont_Reset !
		jnz      short Dont_Reset	;R01 if '1' => Dont_Reset !

;R01		and	al,not 10h		; Set Flag to No Reset.
		or	al, 10h		;R01 Set Flag to No Reset.
		out	71h, al			;

	ifdef Debug_Auto_CPU_Ratio
	out 80h,al
	;mov al,0feh	;Reset
	;out 64h,al
	endif; Debug_Auto_CPU_Ratio

		mov	eax,80000000H + VT586_ACPI + 40h
		mov	dx,0cf8H
		out	dx,eax
		NEWIODELAY
		mov	dl,0fdH			;Register 41h Bit 7
		in	al,dx
		NEWIODELAY
		and	al,not 80H		;Clear Bit 7
		out	dx,al

		mov	eax,80000000H + VT586 + 44h	; index port
		mov	dx,0cf8H
		out	dx,eax
		NEWIODELAY
		mov	dl,0ffH			;register 47H bit 0 to reset
		in	al,dx
		NEWIODELAY
		or	al,01H			;enable system reset
		out	dx,al

		jmp	$

Dont_Reset:

No_Set_Clock:					;R01 
		mov     al, 50h NMI_OFF	; Set Flag to Reset !
		out     70h, al			;
		jcxz	short $+2
		in      al, 71h			;
		jcxz	short $+2
;R01		or	al, 80h			;
;R02		and	al,not 80h			;R01
		and	al,not 10h			;R02
		out	71h, al			;

;R01 No_Set_Clock:					;
		mov	cx,800h			;
		mov	al,0ADh			; disable keyboard
		out	64h,al			;
		loop 	short $			;

		jmp	di
Set_Clock	endp
endif;	JUMPLESS_FOR_BOOTROM_ASM



ifdef	JUMPLESS_FOR_CHIPPOST_ASM
Change_Jumpless_V	proc	near

		ret
Change_Jumpless_V	endp

Update_Jumpless_Screen	proc	near
		push	ds

		push	seg DGROUP
		pop	ds
		ASSUME	CS:EGROUP,DS:DGROUP

		F000_call	F000_Shadow_W

		extrn	Setup_Selectable:near

ifndef	No_Use_CPU_Freq_Detection			;R06
if 1
		call	Ct_Quatify_100Mhz
		jnc	Sure66Mhz
		
else
		mov	ecx,2AH			;Power on Config. Reg.
		RDMSR
		test	eax,080000H		;bit 19 on (100Mhz) ?
		jz	short Sure66Mhz		;not 100Mhz host clock
endif
		mov	si,offset DGROUP:CPU_spd_Item
		mov	bl,1
		mov	bh,11
		mov	dh,1
		call	Setup_Selectable

		mov	si,offset DGROUP:CPU_Freq_Item
		mov	bl,0
;R04		mov	bh,2
		mov	bh,3		;R04
		mov	dh,1
		call	Setup_Selectable

		jmp	short Update_S_End
Sure66Mhz:
		
		mov	si,offset DGROUP:CPU_spd_Item
		mov	bl,12
		mov	bh,22
		mov	dh,1
		call	Setup_Selectable	   

		mov	si,offset DGROUP:CPU_Freq_Item
;R04		mov	bl,3
;R04		mov	bh,6
		mov	bl,4				;R04
		mov	bh,7				;R04
		mov	dh,1
		call	Setup_Selectable

endif	;	No_Use_CPU_Freq_Detection			;R06
Update_S_End:

;;;;; - start
if 1	;[STN121698] This version doesnot support GPI18 feature
		mov	dx,ACPI_Port + 4Ah
		in	al,dx			
		NEWIODELAY
		NEWIODELAY
		test	al,00000100b		; GPI18
		jnz	short @F	; HIGH: Enable
					; LOW: Disable
		or	word ptr DGROUP:[CPU_spd_Item].ITEMSTAT,SHOWONLY
		or	word ptr DGROUP:[CPU_ratio_Item].ITEMSTAT,SHOWONLY
		or	word ptr DGROUP:[CPU_freq_Item].ITEMSTAT,SHOWONLY

	@@:
endif
;;;;; - end

		F000_call	F000_Shadow_R
		pop	ds
		ret
Update_Jumpless_Screen	endp

		public	Setup_Saved_Handler
Setup_Saved_Handler	proc	Far

		extrn	CPU_spd_Item:near
		mov	si,offset DGROUP:CPU_spd_Item
		call	F000_GetItem_Value
		or	al,al
		jz	short manual_sure
		dec	al
		movzx	bx,al

		mov	si, offset Spd_table
		mov	dl,cs:[si][bx]
		mov	ah,dl
		mov	al,CLOCK_CMOS2 NMI_OFF
		F000_call	Set_Cmos2
		jmp	short manual_end
manual_sure:

		extrn	CPU_ratio_Item:near
		mov	si,offset DGROUP:CPU_ratio_Item
		call	F000_GetItem_Value
		movzx	bx,al
		mov	si, offset Ratio_table
		mov	ah,cs:[si][bx]
		push	ax

		extrn	CPU_Freq_Item:near
		mov	si,offset DGROUP:CPU_Freq_Item
		call	F000_GetItem_Value
		movzx	bx,al
		mov	si, offset Freq_table
		mov	dl,cs:[si][bx]
		pop	ax
		or	ah,dl
		mov	al,CLOCK_CMOS2 NMI_OFF
		F000_call	Set_Cmos2

manual_end:

;clear cpu changed flag
		mov	al,OEM_Error_CMOS1 NMI_OFF
		F000_call Get_Cmos
		and	al,not OEM_Error_CMOS_Bits1
		mov	ah,al		
		mov	al,OEM_Error_CMOS1 NMI_OFF
		F000_call Set_Cmos

		mov	al,OVERRIDE_CMOS2 NMI_OFF
		mov	ah,0ffh			;set flag
		F000_call Set_Cmos2

		ret

Setup_Saved_Handler	endp

ifdef	OEM_Error_Special_Show1
		public	OEM_Error_Special_String1
OEM_Error_Special_String1	db	'Warning! CPU has been changed.'
				db	NEWLINE
				db	'Please re-enter CPU settings in the '
				db	'CMOS setup and remember to save before '
				db	'quit!', 0
endif;	OEM_Error_Special_Show1

;==========================================
;  RATIO | GPO29 | GPO13 | GPO12 | GPO8 
;------------------------------------------
;  2.0 X |   1   |   1	 |   1	 |   1
;  2.5 X |   1   |   0	 |   0	 |   0
;  3.0 X |   0   |   0	 |   0	 |   1
;  3.5 X |   1   |   0	 |   0	 |   1
;  4.0 X |   0   |   0	 |   1	 |   0
;  4.5 X |   1   |   0	 |   1	 |   0
;  5.0 X |   0   |   0	 |   1	 |   1
;  5.5 X |   1   |   0	 |   1	 |   1
;  6.0 X |   0   |   1	 |   0	 |   0
;  6.5 X |   1   |   1	 |   0	 |   0
;  7.0 X |   0   |   1	 |   0	 |   1
;  7.5 X |   1   |   1	 |   0	 |   1
;  8.0 X |   0   |   1	 |   1	 |   0
;==========================================
RATIO20		equ	00001111b
RATIO25		equ	00001000b
RATIO30		equ	00000001b
RATIO35		equ	00001001b
RATIO40		equ	00000010b
RATIO45		equ	00001010b
RATIO50		equ	00000011b
RATIO55		equ	00001011b
RATIO60		equ	00000100b
RATIO65		equ	00001100b
RATIO70		equ	00000101b
RATIO75		equ	00001101b
RATIO80		equ	00000110b


BUS66		equ	00110000b		
BUS68		equ	00000000b		
BUS75		equ	00010000b		
BUS83		equ	00100000b		
BUS100		equ	01110000b		
BUS103		EQU	01000000b		
BUS112		EQU	01010000b		
BUS133		EQU	01100000b		

Spd_table	db	RATIO30 + BUS66
		db	RATIO35	+ BUS66
		db	RATIO40	+ BUS66
		db	RATIO45	+ BUS66
		db	RATIO50	+ BUS66
		db	RATIO55	+ BUS66		;[stn051899]
		db	RATIO60 + BUS66
		db	RATIO65	+ BUS66
		db	RATIO70	+ BUS66
		db	RATIO75	+ BUS66
		db	RATIO80	+ BUS66
		db	RATIO30	+ BUS100
		db	RATIO35	+ BUS100
		db	RATIO40	+ BUS100
		db	RATIO45	+ BUS100
		db	RATIO50	+ BUS100
		db	RATIO55	+ BUS100	;[stn051899]
		db	RATIO60	+ BUS100
		db	RATIO65	+ BUS100
		db	RATIO70	+ BUS100
		db	RATIO75	+ BUS100
		db	RATIO80	+ BUS100

Ratio_table	db	RATIO20			;R03
		db	RATIO25
		db	RATIO30
		db	RATIO35
		db	RATIO40
		db	RATIO45
		db	RATIO50
		db	RATIO55
		db	RATIO60
		db	RATIO65
		db	RATIO70
		db	RATIO75
		db	RATIO80			;R03

Freq_table	db	BUS66
		db	BUS68	
		db	BUS75	
		db	BUS83	
		db	BUS100
		db	BUS103
		db	BUS112
		db	BUS133


endif;	JUMPLESS_FOR_CHIPPOST_ASM


ifdef	JUMPLESS_FOR_CPUFEAT_ASM
IF	JUMPLESS_FOR_CPUFEAT_ASM	EQ	1
DEFINE_ITEM	CPU_spd_Item
	menuitem <2,\
		  offset CPU_spd_Str,NOCT,00011111b,Jpless_CMOS2,01fh,\
		  offset CPU_spd_Val,0,22,Xaxis,Yaxis,0h,0h,offset Std_Help_Str>

DEFINE_ITEM	CPU_Ratio_Item
menuitem <2,\
	  offset CPU_Ratio_Str,NOCT,11110000b,Jpless_CMOS,0F0h,\
	  offset CPU_Ratio_Val,0,12,Xaxis,Yaxis,0h,00h,offset Std_Help_Str>

DEFINE_ITEM	CPU_freq_Item
	menuitem <2,\
		  offset CPU_freq_Str,NOCT,07h,Jpless_CMOS,07h,\
		  offset CPU_freq_Val,0,7,Xaxis,Yaxis,0h,0h,offset Std_Help_Str> ;R03
;R03		  offset CPU_freq_Val,0,6,Xaxis,Yaxis,0h,0h,offset Std_Help_Str>
ENDIF;	JUMPLESS_FOR_CPUFEAT_ASM	EQ	1

IF	JUMPLESS_FOR_CPUFEAT_ASM	EQ	2
CPU_spd_Str		db	'CPU Speed           : ',0
CPU_spd_Val		db	'Manual         ',0
			db	'200Mhz(66x3)   ',0
			db	'233Mhz(66x3.5) ',0
			db	'266Mhz(66x4)   ',0
			db	'300Mhz(66x4.5) ',0
			db	'333Mhz(66x5)   ',0
			db	'366Mhz(66x5.5) ',0
			db	'400Mhz(66x6.0) ',0
			db	'433Mhz(66x6.5) ',0
			db	'466Mhz(66x7.0) ',0
			db	'500Mhz(66x7.5) ',0
			db	'533Mhz(66x8.0) ',0
			db	'300Mhz(100x3)  ',0
			db	'350Mhz(100x3.5)',0
			db	'400Mhz(100x4)  ',0
			db	'450Mhz(100x4.5)',0
			db	'500Mhz(100x5)  ',0
			db	'550Mhz(100x5.5)',0
			db	'600Mhz(100x6)  ',0
			db	'650Mhz(100x6.5)',0
			db	'700Mhz(100x7)  ',0
			db	'750Mhz(100x7.5)',0
			db	'800Mhz(100x8)  ',0

CPU_Ratio_Str		db	'CPU Ratio           : ',0
CPU_Ratio_Val		db	'X 2  ',0
			db	'X 2.5',0
			db	'X 3  ',0
			db	'X 3.5',0
			db	'X 4  ',0
			db	'X 4.5',0
			db	'X 5  ',0
			db	'X 5.5',0
			db	'X 6  ',0
			db	'X 6.5',0
			db	'X 7  ',0
			db	'X 7.5',0
			db	'X 8  ',0

CPU_freq_Str		db	'CPU Frequency       : ',0
CPU_freq_Val		db	'66 MHz ',0
			db	'68 MHz ',0
			db	'75 MHz ',0
			db	'83 MHz ',0
			db	'100 MHz',0
			db	'103 MHz',0		
			db	'112 MHz',0		
			db	'133 MHz',0		

ENDIF;	JUMPLESS_FOR_CPUFEAT_ASM	EQ	2

IF	JUMPLESS_FOR_CPUFEAT_ASM	EQ	3
                dw      Offset CPU_Spd_Item   ,Offset Show_Spd_ITEM
ENDIF;	JUMPLESS_FOR_CPUFEAT_ASM	EQ	3

IF	JUMPLESS_FOR_CPUFEAT_ASM	EQ	4

Show_spd_ITEM:
		xor	cx, cx
		mov	di, offset CPU_Spd_Loc
		extrn	If_Greater_Than_CX_Dis:near
		call	If_Greater_Than_CX_Dis
		ret

CPU_Spd_Loc:
		dw	offset CPU_ratio_Item
		dw	offset CPU_freq_Item
		dw	-1

ENDIF;	JUMPLESS_FOR_CPUFEAT_ASM	EQ	4

endif;	JUMPLESS_FOR_CPUFEAT_ASM


