;
; Ghost Monitor - óòèëèòà (ñòðåññ) òåñòèðîâàíèÿ è ìîíèòîðèíãà ñèñòåìû
; Copyright (C) 2005, 2006, 2007 Mihailov Ilia (ghost.nsk@mail.ru)
; All Right Reserved

; Integrated Technology Express
;	Chip	Temp	Volt	Fan   ISA   SMBus
;	it8705	 3	 8+1*	 3     +      +
;	it8712	 3	 8+1*	 3     +      +

; SiS
;	Chip	Temp	Volt	Fan   ISA   SMBus
;	sis950	 3	 8+1*	 3     +      +
;
; * - VBAT

IT87_REGCHIP	equ	0x58
IT87_CHIPID	equ	0x90
IT87_FANDIV	equ	0x0B
it8705		db	'IT8705F/SiS 950', 0
it8712		db	'IT8712F', 0
it8716		db	'IT8716F', 0
ite_unk		db	'Unknown ITE', 0

ite_coeff:	dd 0.016		; Vcore
		dd 0.016		; Vin0
		dd 0.016		; Vin1 (+3.3V)
		dd 0.02688		; AVcc (+5V)
		dd 0.0608		; Vin2 (+12V)
		dd -0.055632		; -12V
		dd -0.02408		; -5V
;-----------------------------------
it87_init:
; Ïðîâåðêà íàëè÷èÿ è èíèöèàëèçàöèÿ
; OUT - CF = 1 - error
	cmp	byte[acc_type], 2	; Only ISA and SMBus
	jae	.no_io

	mov	ecx, 0x2e
	mov	edx, 0x2f
	call	ReservePorts
	jc	.no_io

	mov	eax, 0x55550187		; ïåðåõîä â MB PnP Mode
	out	0x2e, al
	shr	eax, 8
	out	0x2e, al
	shr	eax, 8
	out	0x2e, al
	shr	eax, 8
	out	0x2e, al

	mov	al, 0x20
	out	0x2e, al
	in	al, 0x2f		; al = 0x87
	push	eax

	mov	al, 0x21
	out	0x2e, al
	in	al, 0x2f		; al = model
	push	eax

	mov	al, 0x02		; âûõîä èç ðåæèìà
	out	0x2E, al
	out	0x2F, al
	
	mov	ecx, 0x2e
	mov	edx, 0x2f
	call	FreePorts
	
	pop	eax
	pop	ebx
	cmp	bl, 0x87
	jne	.no_io
	
	mov	edx, it8705
	cmp	al, 0x05
	je	@f
	mov	edx, it8712
	cmp	al, 0x12
	je	@f
	mov	edx, it8716
	cmp	al, 0x16
	je	@f
	mov	edx, ite_unk
@@:	mov	[hwm_chip_name], edx
	clc
	ret	
	
.no_io:	stc
	ret

	; cmp	byte[acc_type], 2	; Only ISA and SMBus
	; jae	it87_no
	;;--- Ïðîâåðÿåì IT87* --------
	; mov	al, IT87_REGCHIP
	; call	[IO_Read]
	; cmp	al, IT87_CHIPID
	; jne	it87_no		; ýòî íå it87 !!!
	;;-~- not tested ~-~-
	; mov	al, 0x21	; --- óçíà¸ì èäåíòèôèêàòîð ÷èïà --
	; call	[IO_Read]
	; mov	edx, it8705
	; cmp	al, 0x05
	; je	@f
	; mov	edx, it8712
	; cmp	al, 0x12
	; je	@f
	; mov	edx, it8716
	; cmp	al, 0x16
	; je	@f
	; mov	edx, ite_unk
; @@:	mov	[hwm_chip_name], edx
	;;-~-~-~-~-~-~-~-~-~-
	; clc
	; ret
; it87_no:stc
	; ret

;-----------------------------------
it87_getparam:
	call	it87_get_temp
	call	it87_get_fan_speed
	mov	edi, ite_coeff
	call	wb_get_volt
	ret
;-----------------------------------
it87_get_temp:
	xor	ecx, ecx
	mov	esi, hwm_temps
@@:	mov	eax, ecx
	add	al, 0x29
	call	[IO_Read]
	mov	[esi + ecx * 2], al
	inc	ecx
	cmp	ecx, 3
	jb	@b
	ret
;-----------------------------------
it87_fan_div	db	1, 1, 1
it87_get_fan_speed:
; ÷èòàåì äåëèòåëè
	mov	al, IT87_FANDIV
	call	[IO_Read]

	mov	ah, al
	and	al, 0x07
	mov	[it87_fan_div], al
	shr	ah, 3
	and	ah, 0x07
	mov	[it87_fan_div + 1], ah

	xor	ecx, ecx
@@:	mov	al, 0x0D
	add	al, cl
	call	[IO_Read]
	
	test	al, al
	jz	@f
	cmp	al, 0xff
	je	@f	

	movzx	ebx, al
	push	ecx
	mov	cl, [it87_fan_div + ecx]
	shl	ebx, cl
	pop	ecx
	mov	eax, 1350000
	xor	edx, edx
	div	ebx
	mov	[hwm_rpms + 4 * ecx], eax
	inc	ecx
	cmp	ecx, 3
	jb	@b
@@:
	ret
;--------------------------------------------------------------------------
;
; Presets for IT8712
;
; Volt = A * read_val + B
;
;	A, B
; --- 0 ---
; dd 0.01565, 0.0		; VIN0 (Index = 0x20)
; dd 0.016, 0.0			; VIN1 (Index = 0x21)
; dd 0.016, 0.0			; VIN2 (Index = 0x22)
; dd 0.0, 0.0			; VIN3 (Index = 0x23)
; dd 0.0608, 0.0		; VIN4 (Index = 0x24)
; dd 0.0, 0.0			; VIN5 (Index = 0x25)
; dd 0.0, 0.0			; VIN6 (Index = 0x26)
; dd 0.08224, -22.104		; VIN7 (Index = 0x27)
; dd 0.016, 0.0			; VBAT (Index = 0x28)

; --- 1 ---
; dd 0.01614, 0.0
; dd 0.01614, 0.0
; dd 0.01614, 0.0
; dd 0.01614, 0.0
; dd 0.062946, 0.0
; dd 0.0, 0.0
; dd 0.0, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0

; --- 2 ---
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.062946, 0.0
; dd 0.016, 0.0
; dd 0.01614, 0.0
; dd 0.0, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0

; --- 3 ---
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.027, 0.0
; dd 0.06564, 0.0
; dd 0.084, -17.408
; dd 0.0512, -9.0112
; dd 0.016, 0.0
; dd 0.016, 0.0

; --- 4 ---
; dd 0.01653, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.02684, 0.0
; dd 0.06398, 0.0
; dd 0.0, 0.0
; dd 0.0, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0

; --- 5 ---
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.027, 0.0
; dd 0.06369, 0.0
; dd 0.082285714288, -16.9691428598999
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0

; --- 6 ---
; dd 0.01565, 0.0
; dd 0.06564, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.02688, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0

; --- 7 ---
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.027, 0.0
; dd 0.06369, 0.0
; dd 0.082285714288, -16.9691428598999
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0

; --- 8 ---
; dd 0.01653, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.0265, 0.0
; dd 0.06398, 0.0
; dd 0.0, 0.0
; dd 0.0, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0

; --- 9 ---
; dd 0.016, 0.0
; dd 0.01565, 0.0
; dd 0.016, 0.0
; dd 0.0265, 0.0
; dd 0.06398, 0.0
; dd 0.09152, -20.592
; dd 0.03728, -8.388
; dd 0.016, 0.0
; dd 0.016, 0.0

; --- 10 ---
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.0265, 0.0
; dd 0.06398, 0.0
; dd 0.016, 0.0
; dd 0.0512, -9.0112
; dd 0.0, 0.0
; dd 0.0, 0.0

; --- 11 ---
; dd 0.016, 0.0
; dd 0.0, 0.0
; dd 0.016, 0.0
; dd 0.016, 0.0
; dd 0.06564, 0.0
; dd 0.0, 0.0
; dd 0.0, 0.0
; dd 0.0, 0.0
; dd 0.0, 0.0