;	[]===========================================================[]
;
;	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
;----------------------------------------------------------------------------
;R02	02/03/99 PHI	Move sensor code to XGROUP.  
;			Please use define SENSOR_IN_XGROUP.
;R01	01/05/99 PAL	Added condition to distinguish senor whether exist or not
;R00	10/13/98 TNY	Init Ver.	

;----------------------------------------------------------------------------
;Option necessary:
;		 Xeon_Thermal
;		 Xeon_ID		
;Option selectable:
;		 Xeon_ID2 (if Multi-processor system)
;----------------------------------------------------------------------------

	;===========================
	;  Xeon ID |  SA1  |  SA2  |
	;---------------------------
	;   30 H   |   0   |   0   |
	;---------------------------
	;   34 H   |   1   |   0   |
	;---------------------------
	;   52 H   |   0   | High-Z|
	;---------------------------
	;   56 H   |   1   | High-Z|
	;---------------------------
	;   98 H   |   0   |   1   |
	;---------------------------
	;   9C H   |   1   |   1   |
	;===========================
ifdef	COMPILE_FOR_SENSOR_ASM
IF	COMPILE_FOR_SENSOR_ASM EQ 2
ifndef	SENSOR_IN_XGROUP			;R02

		public	Get_Xeon_Byte
		public	Set_Xeon_Byte
		extrn	Ct_I2CReadByte:near
		extrn	Ct_I2CWriteByte:near
Get_Xeon_Byte	Proc	Near
		mov	ch, Xeon_ID
		call	Ct_I2CReadByte
		ret
Get_Xeon_Byte	ENDP
Set_Xeon_Byte	Proc	Near
		mov	ch, Xeon_ID
		call	Ct_I2CWriteByte
		ret
Set_Xeon_Byte	ENDP
ifdef	MP_SUPPORT
;[]==============================================================[]
;Input	: CL - register index
;Output : AL - Value read
;[]==============================================================[]
		public	Get_Xeon_Byte2
		public	Set_Xeon_Byte2
Get_Xeon_Byte2	Proc	Near
		mov	ch, Xeon_ID2		
		call	Ct_I2CReadByte		
		ret
Get_Xeon_Byte2	Endp

;[]==============================================================[]
;Input : CL - register index
;	 AL - Value to write
;Output: none
;[]==============================================================[]
Set_Xeon_Byte2	Proc	Near
		mov	ch, Xeon_ID2		
		call	Ct_I2CWriteByte		
		ret
Set_Xeon_Byte2	Endp
endif;	MP_SUPPORT

ifdef	ACPI_Support
		extrn	ACPI_Critical_Item:near
		extrn	TEMP1_HIGH:near		
		extrn	SENSOR_FLAG:near		
;[]========================================================================[]
;Procedure:	Ct_FillTempPointer
;
;Function :	Return Thermal Zone Temperature pointer 
;
;Input	  :	F segment shadow RAM is writeable 
;
;Output   :	none
;	
;[]========================================================================[]
		Public	Ct_FillTempPointer
Ct_FillTempPointer	Proc	Near

		push	es
		
		mov	ax,0f000h
		mov	es,ax
		mov	di,offset DGROUP:SENSOR_FLAG
		test	word ptr es:[di],01h
		jz	short No_Sensor
		mov	di,offset DGROUP:TEMP1_HIGH


		mov	si,offset DGROUP:ACPI_Critical_Item
		call	E_GetItem_Value
		xor	ah,ah
		shl	ax,1
		mov	si,offset Critical_Table
		add	si,ax
		mov	ax,word ptr cs:[si]
		push	ax			;save critical temp
;active temp = passive temp = critical temp - 5C
		sub	ax,50

		mov	word ptr es:[di],ax	; Trip point 1 high
		mov	word ptr es:[di+4],ax	; Trip point 2 high
		sub	ax,30
		mov	word ptr es:[di+2],ax	; Trip point 1 low
		mov	word ptr es:[di+6],ax	; Trip point 2 low

		pop	ax			;restore critical temp
		mov	word ptr es:[di+8],ax	;Critical trip point

No_Sensor:					
		pop	es
		ret
Ct_FillTempPointer	Endp

Critical_Table:
		dw	3432			;70c
		dw	3482			;75c
		dw	3532			;80c
		dw	3582			;85c
endif	;ACPI_Support

;***************************************************************************
;**** SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM ****
;**** SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM ****
;**** SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM ****
;**** SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM ****
;***************************************************************************

;[]==============================================================[]
;[]==============================================================[]
		Public	Prg_Xeon
Prg_Xeon	Proc	Near

;R01	;Mask Xeon's display items if it is not mounted on M/B
;R01		mov	cl,1
;R01		call	Get_Xeon_Byte
;R01		jnc	short @F		;Xeon not found

	;Disable items by change item's status
		push	ds
		mov	ax,0f000h
		mov	ds,ax
		extrn	Xeon_Temp1_Item:near
		extrn	F000_Shadow_W:near
		extrn	F000_Shadow_R:near
		extrn	F000_call_proc:near
		assume	ds:DGROUP
		f000_call	DGROUP:F000_Shadow_W
;R01 - start
	;Mask Xeon's display items if it is not mounted on M/B
		mov	cl,1
		call	Get_Xeon_Byte
		jnc	short Sensor1_Exist		;Xeon not found
;R01 - end
		or	word ptr ds:[Xeon_Temp1_Item].ITEMSTAT,ITEMDISABLE
ifdef	MP_SUPPORT
;R01 - start
		mov	cl,1
		call	Get_Xeon_Byte2
		jnc	short Sensor2_Exist		;Xeon not found
;R01 - end
		extrn	Xeon_Temp2_Item:near			
		or	word ptr ds:[Xeon_Temp2_Item].ITEMSTAT,ITEMDISABLE
endif;	MP_SUPPORT

ifdef	ACPI_Support
		extrn	ACPI_Critical_Item:near
		or	word ptr ds:[ACPI_Critical_Item].ITEMSTAT,ITEMDISABLE
endif;	ACPI_Support

ifdef	ACPI_SUPPORT
		and	word ptr ds:[SENSOR_FLAG],not 01h
endif	;ACPI_SUPPORT

;R01 - start
		jmp	short	NoExist
	Sensor1_Exist:					
ifdef	MP_SUPPORT
		mov	cl,1
		call	Get_Xeon_Byte2
		jnc	short Sensor2_Exist		;Xeon not found
		extrn	Xeon_Temp2_Item:near			
		or	word ptr ds:[Xeon_Temp2_Item].ITEMSTAT,ITEMDISABLE
	Sensor2_Exist:
endif;	MP_SUPPORT
	NoExist:
;R01 - end

		f000_call	DGROUP:F000_Shadow_R
		pop	ds
;R01	@@:

		ret

Prg_Xeon	Endp

		assume	ds:EGROUP			

endif	;SENSOR_IN_XGROUP		;R02
ENDIF	;COMPILE_FOR_SENSOR_ASM EQ 2	
endif	;COMPILE_FOR_SENSOR_ASM

ifdef	COMPILE_FOR_SENSOR_MNU 
;***************************************************************************
;***** Special_Show Special_Show Special_Show Special_Show Special_Show ****
;***** Special_Show Special_Show Special_Show Special_Show Special_Show ****
;***** Special_Show Special_Show Special_Show Special_Show Special_Show ****
;***************************************************************************
IF	COMPILE_FOR_SENSOR_MNU EQ 2
		dw	offset Xeon_Temp1_Item, offset Show_Current_Temp
ifdef	MP_SUPPORT
		dw	offset Xeon_Temp2_Item, offset Show_Current_Temp2
endif;	MP_SUPPORT
ENDIF	;COMPILE_FOR_SENSOR_MNU 

;***************************************************************************
;**** SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU ****
;**** SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU ****
;**** SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU ****
;**** SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU SENSOR.MNU ****
;***************************************************************************
IF	COMPILE_FOR_SENSOR_MNU EQ 1

		Public	First_Xeon_Item	
First_Xeon_Item	Label	Near		

DEFINE_ITEM	Xeon_Temp1_Item
DEFINE_MENUITEM	, GROUP_HEALTH, 0, 10				
        menuitem <SHOWONLY,\
                  offset Current_Temp_Str,NOCT,0,KERNAL_CONTROL,00000001b,\
                  offset NullStr,0,0,Xaxis,Yaxis,0,0,offset Std_Help_Str>
ifdef	MP_SUPPORT
DEFINE_ITEM	Xeon_Temp2_Item
DEFINE_MENUITEM	, GROUP_HEALTH, 0, 10				
        menuitem <SHOWONLY,\
                  offset Current_Temp_Str2,NOCT,0,KERNAL_CONTROL,00000001b,\
                  offset NullStr,0,0,Xaxis,Yaxis,0,0,offset Std_Help_Str>
endif;	MP_SUPPORT

ifdef	ACPI_SUPPORT
DEFINE_ITEM     ACPI_Critical_Item
DEFINE_MENUITEM	, GROUP_HEALTH, 0, 10				
        menuitem <PMITEM,\
                  offset ACPI_Critical_Str           ,NOCT,Xeon_ACPI_CMOS_BITS,Xeon_ACPI_CMOS,Xeon_ACPI_CMOS_BITS,\
                  offset Critical_str,0,3,Xaxis,Yaxis,00000000b,    00000000b,offset Std_Help_Str>
endif	;ACPI_SUPPORT
		Public	Last_Xeon_Item	
Last_Xeon_Item	Label	Near		
ENDIF	;COMPILE_FOR_SENSOR_MNU 

;***************************************************************************
;**** SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR ****
;**** SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR ****
;**** SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR ****
;**** SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR SENSOR.STR ****
;***************************************************************************
IF	COMPILE_FOR_SENSOR_MNU EQ 0
ifdef	ACPI_SUPPORT
ACPI_Critical_Str	db      'Shutdown Temperature'
			db	(COLLON_LOC - ($-(offset ACPI_Critical_Str))) dup (" ")
			db	': ',0

Critical_str		db      '70øC/158øF',0
			db	'75øC/167øF',0
			db	'80øC/176øF',0
			db	'85øC/185øF',0
endif	;ACPI_SUPPORT
ifdef	MP_SUPPORT
Current_Temp_Str2	db	'Current CPU2 Temperature'
			db	(COLLON_LOC - ($-(offset Current_Temp_Str2))) dup (" ")
			db	': ',0
endif;	MP_SUPPORT
ifdef	MP_SUPPORT
Current_Temp_Str	db	'Current CPU1 Temperature'
else;	MP_SUPPORT
Current_Temp_Str	db	'Current CPU Temperature'
endif;	MP_SUPPORT
			db	(COLLON_LOC - ($-(offset Current_Temp_Str))) dup (" ")
			db	': ',0
Xeon_TEMP_Str           db      'CPU Warning Temperature'
			db	(COLLON_LOC - ($-(offset Xeon_TEMP_Str))) dup (" ")
			db	': ',0				
;=====================

Show_Current_Temp	Proc	Near
		cmp	byte ptr CALLTYPE[bp],POST_CALL	
		jne	short @F			
ifndef	SENSOR_IN_XGROUP				;R02
		Post_Func_Call E000_Show_Current_Temp
else	;SENSOR_IN_XGROUP				;R02
		Xcall X_Show_Current_Temp		;R02
endif	;SENSOR_IN_XGROUP				;R02
	@@:						
		ret
Show_Current_Temp	endp
ifdef	MP_SUPPORT
Show_Current_Temp2	Proc	Near
		cmp	byte ptr CALLTYPE[bp],POST_CALL	
		jne	short @F			
ifndef	SENSOR_IN_XGROUP				;R02
		Post_Func_Call E000_Show_Current_Temp2
else	;SENSOR_IN_XGROUP				;R02
		Xcall X_Show_Current_Temp2		;R02
endif	;SENSOR_IN_XGROUP				;R02
	@@:						
		ret
Show_Current_Temp2	endp
endif;	MP_SUPPORT
ENDIF	;COMPILE_FOR_SENSOR_MNU

;***************************************************************************
;**** SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  ****
;**** SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  ****
;**** SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  ****
;**** SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  ****
;***************************************************************************
IF	COMPILE_FOR_SENSOR_MNU EQ 3
ifndef	SENSOR_IN_XGROUP			;R02
E000_Show_Current_Temp	Proc	Near

		cmp	al, Special_Before
		je	short @F

		mov	cl,1
		call	Get_Xeon_Byte
		cmp	al,100
		jbe	short OK_75Temp
		mov	al,0
	OK_75Temp:
		mov	bl,al
		F000_call	DISP_Byte_INT2
		mov	al, 'ø'
		F000_call	Display_Char
		mov	al, 'C'
		F000_call	Display_Char
		mov	al, '/'
		F000_call	Display_Char

;øC transed to øF --> C = 5/9*(F-32)

		mov	al,bl
		mov	bl,9
		mul	bl
		mov	bl,5
		div	bl
		add	al,32
		xor	ah,ah
		F000_call	DISP_WORD_INT3
		mov	al, 'ø'
		F000_call	Display_Char
		mov	al, 'F'
		F000_call	Display_Char
	@@:
		ret

E000_Show_Current_Temp	endp

ifdef	MP_SUPPORT
E000_Show_Current_Temp2	Proc	Near

		cmp	al, Special_Before
		je	short @F

		mov	cl,1
		call	Get_Xeon_Byte2

		cmp	al,100
		jbe	short OK_75Temp2
		mov	al,0
	OK_75Temp2:

		mov	bl,al
		F000_call	DISP_Byte_INT2
		mov	al, 'ø'
		F000_call	Display_Char
		mov	al, 'C'
		F000_call	Display_Char
		mov	al, '/'
		F000_call	Display_Char

;øC transed to øF --> C = 5/9*(F-32)

		mov	al,bl
		mov	bl,9
		mul	bl
		mov	bl,5
		div	bl
		add	al,32
		xor	ah,ah
		F000_call	DISP_WORD_INT3
		mov	al, 'ø'
		F000_call	Display_Char
		mov	al, 'F'
		F000_call	Display_Char
	@@:
		ret
E000_Show_Current_Temp2	endp
endif;	MP_SUPPORT
ifndef	BIOS60							
		Public	Update_Xeon_Screen
Update_Xeon_Screen	Proc	near

		pusha

ifdef	Update_Sensor_in_CPUFEAT				
		cmp	byte ptr CUR_PAGE[bp], PAGE_CPU
else;	Update_Sensor_in_CPUFEAT
ifdef	Update_Sensor_in_IOFEAT					
		cmp	byte ptr CUR_PAGE[bp], PAGE_IO		
else;	Update_Sensor_in_IOFEAT					
		cmp	byte ptr CUR_PAGE[bp], PAGE_CFEATURE
endif;	Update_Sensor_in_IOFEAT					
endif;	Update_Sensor_in_CPUFEAT				
		jne	short Update_Xeon_End

	;----------------------------------------
		mov	si, offset Xeon_Item_List

	Update_Xeon_Start:

		mov	bx, cs:[si]
		cmp	bx, -1
		je	short Update_Xeon_End
		push	si
		F000_call	Display_Whole_Item
		pop	si
		inc	si
		inc	si
		jmp	short Update_Xeon_Start
	;----------------------------------------

	Update_Xeon_End:

		popa
		ret

Update_Xeon_Screen	Endp
endif	;BIOS60							

ifdef	BIOS60							
	db	'$SpeRT'					
endif	;BIOS60							

Xeon_Item_List	Label	Word

ifdef	BIOS60							
	dw	Xeon_Runtime_No					
endif	;BIOS60							

	dw	offset Xeon_Temp1_Item
ifdef	MP_SUPPORT
	dw	offset Xeon_Temp2_Item
endif;	MP_SUPPORT

Xeon_Runtime_No	EQU	(($ - offset Xeon_Item_List)-2)/2	

	dw	-1

endif	;SENSOR_IN_XGROUP			;R02
ENDIF	;COMPILE_FOR_SENSOR_MNU

IF	COMPILE_FOR_SENSOR_MNU EQ 4
	dw	offset First_Xeon_Item, offset Last_Xeon_Item
ifndef	SENSOR_IN_XGROUP				;R02
	dw	SEG Prg_Xeon, offset Prg_Xeon
else	;SENSOR_IN_XGROUP				;R02
	dw	SEG X_Prg_Xeon, offset X_Prg_Xeon	;R02
endif	;SENSOR_IN_XGROUP				;R02
ENDIF	;COMPILE_FOR_SENSOR_MNU

IF	COMPILE_FOR_SENSOR_MNU EQ 5
	extrn	First_Xeon_Item:near
	extrn	Last_Xeon_Item:near
ifndef	SENSOR_IN_XGROUP				;R02
	extrn	Prg_Xeon:near
else	;SENSOR_IN_XGROUP				;R02
	extrn	X_Prg_Xeon:far				;R02
endif	;SENSOR_IN_XGROUP				;R02
ENDIF	;COMPILE_FOR_SENSOR_MNU

endif	;COMPILE_FOR_SENSOR_MNU 

;R02 - start
;==================================================================
;======================== SENSOR IN XGROUP ========================
;======================== SENSOR IN XGROUP ========================
;======================== SENSOR IN XGROUP ========================
;======================== SENSOR IN XGROUP ========================
;==================================================================

ifdef	COMPILE_FOR_SENSOR_ASM
IF	COMPILE_FOR_SENSOR_ASM EQ 2
ifdef	SENSOR_IN_XGROUP			
		public	X_Get_Xeon_Byte
		public	X_Set_Xeon_Byte
		extrn	X_GetItem_Value:near

X_Get_Xeon_Byte	Proc	Near
		mov	ch, Xeon_ID
		call far ptr	EGROUP:fproc_Ct_I2CReadByte
		ret
X_Get_Xeon_Byte	ENDP

X_Set_Xeon_Byte	Proc	Near
		mov	ch, Xeon_ID
		call far ptr	EGROUP:fproc_Ct_I2CWriteByte
		ret
X_Set_Xeon_Byte	ENDP
ifdef	MP_SUPPORT
;[]==============================================================[]
;Input	: CL - register index
;Output : AL - Value read
;[]==============================================================[]
		public	X_Get_Xeon_Byte2
		public	X_Set_Xeon_Byte2

X_Get_Xeon_Byte2	Proc	Near
			mov	ch, Xeon_ID2		
			call far ptr	EGROUP:fproc_Ct_I2CReadByte		
			ret
X_Get_Xeon_Byte2	Endp


;[]==============================================================[]
;Input : CL - register index
;	 AL - Value to write
;Output: none
;[]==============================================================[]
X_Set_Xeon_Byte2	Proc	Near
			mov	ch, Xeon_ID2		
			call far ptr	EGROUP:fproc_Ct_I2CWriteByte		
			ret
X_Set_Xeon_Byte2	Endp
endif;	MP_SUPPORT

ifdef	ACPI_Support
		extrn	ACPI_Critical_Item:near
		extrn	TEMP1_HIGH:near		
		extrn	SENSOR_FLAG:near		
;[]========================================================================[]
;Procedure:	X_Ct_FillTempPointer
;
;Function :	Return Thermal Zone Temperature pointer 
;
;Input	  :	F segment shadow RAM is writeable 
;
;Output   :	none
;	
;[]========================================================================[]
		Public	X_Ct_FillTempPointer
X_Ct_FillTempPointer	Proc	far

		push	es
		
		mov	ax,0f000h
		mov	es,ax
		mov	di,offset DGROUP:SENSOR_FLAG
		test	word ptr es:[di],01h
		jz	short No_Sensor
		mov	di,offset DGROUP:TEMP1_HIGH


		mov	si,offset DGROUP:ACPI_Critical_Item
		call	X_GetItem_Value
		xor	ah,ah
		shl	ax,1
		mov	si,offset Critical_Table
		add	si,ax
		mov	ax,word ptr cs:[si]
		push	ax			;save critical temp
;active temp = passive temp = critical temp - 5C
		sub	ax,50

		mov	word ptr es:[di],ax	; Trip point 1 high
		mov	word ptr es:[di+4],ax	; Trip point 2 high
		sub	ax,30
		mov	word ptr es:[di+2],ax	; Trip point 1 low
		mov	word ptr es:[di+6],ax	; Trip point 2 low

		pop	ax			;restore critical temp
		mov	word ptr es:[di+8],ax	;Critical trip point

No_Sensor:					
		pop	es
		retf
X_Ct_FillTempPointer	Endp

Critical_Table:
		dw	3432			;70c
		dw	3482			;75c
		dw	3532			;80c
		dw	3582			;85c
endif	;ACPI_Support

;***************************************************************************
;**** SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM ****
;**** SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM ****
;**** SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM ****
;**** SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM SENSOR.ASM ****
;***************************************************************************

;[]==============================================================[]
;[]==============================================================[]
		Public	X_Prg_Xeon
X_Prg_Xeon	Proc	far


	;Disable items by change item's status
		push	ds
		mov	ax,0f000h
		mov	ds,ax
		extrn	Xeon_Temp1_Item:near
		extrn	X_F000_Shadow_W:near
		extrn	X_F000_Shadow_R:near
		assume	ds:DGROUP

		call	X_F000_Shadow_W
;R01 - start
	;Mask Xeon's display items if it is not mounted on M/B
		mov	cl,1
		call	X_Get_Xeon_Byte
		jnc	short Sensor1_Exist		;Xeon not found
;R01 - end
		or	word ptr ds:[Xeon_Temp1_Item].ITEMSTAT,ITEMDISABLE
ifdef	MP_SUPPORT
;R01 - start
		mov	cl,1
		call	X_Get_Xeon_Byte2
		jnc	short Sensor2_Exist		;Xeon not found
;R01 - end
		extrn	Xeon_Temp2_Item:near			
		or	word ptr ds:[Xeon_Temp2_Item].ITEMSTAT,ITEMDISABLE
endif;	MP_SUPPORT

ifdef	ACPI_Support
		extrn	ACPI_Critical_Item:near
		or	word ptr ds:[ACPI_Critical_Item].ITEMSTAT,ITEMDISABLE
endif;	ACPI_Support

ifdef	ACPI_SUPPORT
		and	word ptr ds:[SENSOR_FLAG],not 01h
endif	;ACPI_SUPPORT

;R01 - start
		jmp	short	NoExist
	Sensor1_Exist:					
ifdef	MP_SUPPORT
		mov	cl,1
		call	X_Get_Xeon_Byte2
		jnc	short Sensor2_Exist		;Xeon not found
		extrn	Xeon_Temp2_Item:near			
		or	word ptr ds:[Xeon_Temp2_Item].ITEMSTAT,ITEMDISABLE
	Sensor2_Exist:
endif;	MP_SUPPORT
	NoExist:
;R01 - end

		call	X_F000_Shadow_R
		pop	ds

		retf

X_Prg_Xeon	Endp

		assume	ds:XGROUP			

endif	;SENSOR_IN_XGROUP			
ENDIF	;COMPILE_FOR_SENSOR_ASM EQ 2	
endif	;COMPILE_FOR_SENSOR_ASM


;***************************************************************************
;**** SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  ****
;**** SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  ****
;**** SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  ****
;**** SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  SENSOR.E8  ****
;***************************************************************************
IFDEF	COMPILE_FOR_SENSOR_MNU 
IF	COMPILE_FOR_SENSOR_MNU EQ 3
ifdef	SENSOR_IN_XGROUP		

X_Show_Current_Temp	Proc	Near

		cmp	al, Special_Before
		je	short @F

		mov	cl,1
		call	X_Get_Xeon_Byte
		cmp	al,100
		jbe	short OK_75Temp
		mov	al,0
	OK_75Temp:
		mov	bl,al
		call far ptr	DGROUP:fproc_DISP_Byte_INT2
		mov	al, 'ø'
		call	X_Display_Char
		mov	al, 'C'
		call	X_Display_Char
		mov	al, '/'
		call	X_Display_Char

;øC transed to øF --> C = 5/9*(F-32)

		mov	al,bl
		mov	bl,9
		mul	bl
		mov	bl,5
		div	bl
		add	al,32
		xor	ah,ah
		call far ptr	DGROUP:fproc_DISP_WORD_INT3
		mov	al, 'ø'
		call	X_Display_Char
		mov	al, 'F'
		call	X_Display_Char
	@@:
		ret

X_Show_Current_Temp	endp

ifdef	MP_SUPPORT
X_Show_Current_Temp2	Proc	Near

		cmp	al, Special_Before
		je	short @F

		mov	cl,1
		call	X_Get_Xeon_Byte2

		cmp	al,100
		jbe	short OK_75Temp2
		mov	al,0
	OK_75Temp2:

		mov	bl,al
	   	call far ptr	DGROUP:fproc_DISP_Byte_INT2
		mov	al, 'ø'
		call	X_Display_Char
		mov	al, 'C'
		call	X_Display_Char
		mov	al, '/'
		call	X_Display_Char

;øC transed to øF --> C = 5/9*(F-32)

		mov	al,bl
		mov	bl,9
		mul	bl
		mov	bl,5
		div	bl
		add	al,32
		xor	ah,ah
		call far ptr	DGROUP:fproc_DISP_WORD_INT3
		mov	al, 'ø'
		call	X_Display_Char
		mov	al, 'F'
		call	X_Display_Char
	@@:
		ret
X_Show_Current_Temp2	endp
endif;	MP_SUPPORT
ifndef	BIOS60							
		Public	X_Update_Xeon_Screen
X_Update_Xeon_Screen	Proc	far

		pusha

ifdef	Update_Sensor_in_CPUFEAT				
		cmp	byte ptr CUR_PAGE[bp], PAGE_CPU
else;	Update_Sensor_in_CPUFEAT
ifdef	Update_Sensor_in_IOFEAT					
		cmp	byte ptr CUR_PAGE[bp], PAGE_IO		
else;	Update_Sensor_in_IOFEAT					
		cmp	byte ptr CUR_PAGE[bp], PAGE_CFEATURE
endif;	Update_Sensor_in_IOFEAT					
endif;	Update_Sensor_in_CPUFEAT				
		jne	short Update_Xeon_End

	;----------------------------------------
		mov	si, offset Xeon_Item_List

	Update_Xeon_Start:

		mov	bx, cs:[si]
		cmp	bx, -1
		je	short Update_Xeon_End
		push	si
		call	X_Display_Whole_Item
		pop	si
		inc	si
		inc	si
		jmp	short Update_Xeon_Start
	;----------------------------------------

	Update_Xeon_End:

		popa
		retf

X_Update_Xeon_Screen	Endp
endif	;BIOS60							

ifdef	BIOS60							
	db	'$SpeRT'					
endif	;BIOS60							

Xeon_Item_List	Label	Word

ifdef	BIOS60							
	dw	Xeon_Runtime_No					
endif	;BIOS60							

	dw	offset Xeon_Temp1_Item
ifdef	MP_SUPPORT
	dw	offset Xeon_Temp2_Item
endif;	MP_SUPPORT

Xeon_Runtime_No	EQU	(($ - offset Xeon_Item_List)-2)/2	

	dw	-1

endif	;SENSOR_IN_XGROUP		
ENDIF	;COMPILE_FOR_SENSOR_MNU
ENDIF	;COMPILE_FOR_SENSOR_MNU

;R02 - end
