;
; Ghost Monitor - утилита (стресс) тестирования и мониторинга системы
; Copyright (C) 2005, 2006, 2007 Mihailov Ilia (ghost.nsk@mail.ru)
; All Right Reserved

;
; HWM abstract interface, provide:
;  hwm_init, hwm_get_params, hwm_enable, hwm_temps, hwm_rpms, hwm_voltages, hwm_chip_name
;


if SMBus eq yes
 include	'SMBus.inc'
end if

include		'hwm_wb.inc'
include		'hwm_it87.inc'
include		'hwm_uguru.inc'
;include	'hwm_via686.inc'

uglobal
	hwm_enable:
		dd	0		; 0 - no, 1 - Winbond, 2 - ITE, ... see HWMProbe list
	hwm_temps:
		db	0,0, 0,0, 0,0	; градус, десятые, градус, ...
	hwm_rpms:
		dd	0, 0, 0, 0, 0	; fan1, fan2, fan3, ...
	hwm_voltages:
	Vcore 	dd	0.0
	Vin0	dd	0.0
	Vin1	dd	0.0
	AVcc	dd	0.0
	Vin2	dd	0.0
	V12	dd	0.0
	V5	dd	0.0
	vol8	dd	0.0
	vol9	dd	0.0
	vol10	dd	0.0
	vol11	dd	0.0
	acc_type db	0		; 0 - ISA Bus, 1 - SMBus, 2 - other
endg

IO_Read		dd	isaRead		; In : al - addr, out : al - value
IO_Write	dd	isaWrite	; In : al - addr, bl - value

hwm_unk		db	'Not found', 0
hwm_chip_name	dd	hwm_unk

; NOTE !!!
; HWMProbe - список, процедур проверки чипов, заканчивается
; нулевым двойным словом
; HWMGetParam - список, процедур получения параметров
; оба эти списка должны соответствовать друг другу по
; по порядку процедур
HWMProbe:	dd	wb_init
		dd	it87_init
		dd	uGuru_init
		dd	0		; <- конец списка
		
HWMGetParam:	dd	wb_getparam
		dd	it87_getparam
		dd	uGuru_getparam
		
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
hwm_init:
; Проверка наличия и инициализация
	pusha
	; Ищем датчики на шине ISA
	call	isaInit
	jc	@f
	call	chips_probe
	cmp	byte[hwm_enable], 0
	jne	.exit
@@:	call	isaClose

	; Ищем датчики на шине SMBus
	inc	byte [acc_type]
if SMBus eq yes
	call	smbInit
	jc	@f
	call	chips_probe
	cmp	byte[hwm_enable], 0
	jne	.exit
@@:	call	smbClose
end if
	; Ищем датчики на собственной шине (LPC etc)
	inc	byte [acc_type]
	call	chips_probe

.exit:	popa
	ret
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=	
chips_probe:
; Находим нужный чип
; Out : hwm_enable = !0 if found, else hwm_enable not changed
	cld			; Paranoia
	mov	esi, HWMProbe
@@:	lodsd
	test	eax, eax
	jz	@f		; Конец списка
	call	eax
	jc	@b
	sub	esi, HWMProbe
	shr	esi, 2
	mov	dword[hwm_enable], esi
@@:	ret
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
hwm_get_params:
	pusha
	mov	eax, [hwm_enable]
	test	eax, eax
	jz	@f
	dec	eax
	sal	eax, 2
	call	dword[eax + HWMGetParam]
@@:	popa
	ret

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
; ISA interface
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
isaRead:
	push	edx
	mov	dx, 0x295
	out	dx, al
	inc	edx
	in	al, dx
	pop	edx
	ret
	
isaWrite:
	push	edx
	mov	dx, 0x295
	out	dx, al
	inc	edx
	mov	al, bl
	out	dx, al
	pop	edx
	ret

isaInit:
	; Out : CF = 0 if Ok
	; резервируем 0x295 и 0x296 порты
	mov	ecx, 0x295
	mov	edx, 0x296
	call	ReservePorts
	; jc	@f
	; mov	[IO_Read], isaRead
	; mov	[IO_Write], isaWrite
	; @@:	
	ret

isaClose:
	; освобождаем 0x295 и 0x296 порты
	mov	ecx, 0x295
	mov	edx, 0x296
	call	FreePorts
	ret
