📄 smbus.inc
字号:
GetSMBusInfo:
call OpenSMbusController
call GetSMBUSAddress ; dx=smbus address
jc ErrorChipset
;;; KenWang [041602] >>>>>>
lea di,SubFuncSelect
mov al,ds:[di]
cmp al,70h
jnz AnotherAddress
mov al,0ffh
mov ds:[di],al
call DisplayFixedSMbusAddress
jmp short ReGetSMBUS
;;; KenWang [041602] <<<<<<
AnotherAddress:
mov cx,000eh
call SetCursorType
mov dx,SmbusPosition
call SetCursor
lea si,SmbusAddress
mov ax,ds:[si]
xchg ah,al
call DisplayHex
xchg ah,al
call DisplayHex
mov dx,SlavePosition
call SetCursor
call EnterSlaveAddress
jz smbus_exit
ReGetSMBUS:
call DisplayI2CData
jc smbus_exit
jmp AnotherAddress
ErrorChipset:
mov dx,MainMenuRow+MainMenuCol+0101h+((FunctionNo+1) shl 8)
mov dl,14h
call SetCursor
lea si,ChipErrMsg
call DisplayString
call WaitOneKey
mov al,0f3h
lea di,SubFuncSelect
mov ds:[di],al
stc
ret
smbus_exit:
;;Clear Screen
call ClearScreen
mov cx,0d0eh
call SetCursorType
call CloseICH2Smbus
clc
ret
SmbusGenernalExit:
lea di,SubFuncSelect
mov al,0ffh
mov ds:[di],al
call CloseICH2Smbus
stc
ret
;========================================================
DisplayI2CData:
pusha
lea si,ReadDataRow
mov al,ds:[si]
call SetSMbusHeadAttrib
popa
call DisplayI2CData1
CheckKeyin:
call CheckKeybuffer
jnc GetKeyinOK
lea si,SlaveAddress
mov al,ds:[si]
; cmp al,0a0h
; jae CheckKeyin
jmp short DisplayI2CData
GetKeyinOK:
;;; KenWang [050802] >>>>>>
push ax
; call WaitOneKey
pop ax
;;; KenWang [050802] <<<<<<
push si
lea si,SearchFlag
mov ds:[si],ah
pop si
cmp ah,KeyF10
jz ReturnMainMenu
cmp ah,KeyF2
jz SMBKeyF2_1
cmp ah,KeyF5
jz SMBKeyF5_1
cmp ah,KeyF4
jz EditI2CAgain
cmp ah,KeyUp
jz EditI2CAgain
cmp ah,KeyDown
jz EditI2CAgain
cmp ah,KeyPgDn
jz ReturnMainMenu
cmp ah,KeyPgUp
jz ReturnMainMenu
jmp CheckKeyin
EditI2CAgain:
call EditScreen
cmp al,KeyEnter
jnz ReturnMainMenuc
call I2cWriteData
call DisplayI2CData1
; jmp short EditI2CAgain
jmp short DisplayI2CData
ReturnMainMenuc:
lea di,SubFuncSelect
mov al,ds:[di]
cmp al,0ffh
jz ReturnMainMenu
cmp al,0efh
jz ReturnMainMenu
stc
ret
ReturnMainMenu:
clc
ret
SMBKeyF5_1:
call StoreScreenC
call MainMenuSelect
call ReStoreScreenC
lea di,SubFuncSelect
mov al,ds:[di]
cmp al,0efh
jz CheckKeyin
stc
ret
SMBKeyF2_1:
call InputFileName
jmp CheckKeyin
;-------------------------------
SetSMbusHeadAttrib:
cmp al,08h
jz SetHalfData
mov cx,HeaderPosition+0a00h
mov dx,cx
add dh,7
add dl,02
mov bh,(Blue shl 4)+LightColor+Red
call ChangeWindowsAttribute
call ShowKeyDefineString
ret
SetHalfData:
mov cx,HeaderPosition+0a00h
mov dx,cx
add dh,7
add dl,50
mov bh,07h
call SetWindowsAttribute
ret
;-------------------------------
DisplayI2CData1:
call SetCommandLineBlank
mov cx,200eh
call SetCursorType
lea si,SlaveAddress
mov ah,ds:[si]
and ah,0feh
cmp ah,0d2h
jnz LoopDisplaySmbusbyteData1
lea si,BlockReadFlag
mov al,ds:[si]
cmp al,1
jz BlockReadConfime
cmp al,2
jz LoopDisplaySmbusbyteData1
mov dx,HeaderPosition+0510h
call SetCursor
mov bh,Red+LightColor+FlashChar
mov cx,HeaderPosition+040fh
mov dx,cx
add dx,0217h
call SetWindowsAttribute
lea si,BlockReadWarn
call DisplayString
WaitconfirmKey:
call WaitOneKey
cmp al,'N'
jz ByteReadConfime
cmp al,'n'
jz ByteReadConfime
cmp al,'Y'
jz BlockReadConfime
cmp al,'y'
jz BlockReadConfime
jmp short WaitconfirmKey
ByteReadConfime:
lea si,BlockReadFlag
mov al,02h
mov ds:[si],al
jmp short LoopDisplaySmbusbyteData1
BlockReadConfime:
call I2cBlockRW
lea si,BlockReadFlag
mov al,01h
mov ds:[si],al
jmp short CheckKeyin1
LoopDisplaySmbusbyteData1:
mov dx,(ValueStartCol+ValueStartRow)
dec dh
call SetCursor
xor al,al
lea si,ReadDataRow
mov cl,ds:[si]
movzx cx,cl
ReadDataLoop11:
push cx
lea si,crlf
call DisplayString
push cx
call GetCursor
pop cx
mov dl,ValueStartCol
call SetCursor
lea si,ReadDataRow
mov ax,ds:[si]
sub ax,cx
mov cx,16
mul cx
call ReadData16
pop cx
loop ReadDataLoop11
CheckKeyin1:
ret
;-------------------------------
;Input: AL=start reg.
ReadData16:
mov cx,16
ReadDataLoop:
push ax
push cx
lea si,SlaveAddress
mov ah,ds:[si]
push bx
lea si,I2CProgramMethod
mov bx,ds:[si]
shl bx,3
lea si,cs:SMBUSAccessMethod
call word ptr cs:[si+bx] ;Byte read
pop bx
mov al,cl
call DisplayDataAttribute
mov al,' '
call DisplayChar
pop cx
pop ax
inc al
loop ReadDataLoop
ret
;-------------------------------
I2cBlockRW:
mov dx,(ValueStartCol+ValueStartRow)
mov ax,dx
call SetCursor
push bx
lea si,I2CProgramMethod
mov bx,ds:[si]
shl bx,3
lea si,cs:SMBUSAccessMethod
call word ptr cs:[si+bx+4] ;Block read
pop bx
ret
;-------------------------------
I2cWriteData:
pusha
lea si,SlaveAddress
mov al,ds:[si]
cmp al,0d2h
jz BolckWriteSupport
ByteAccressProc:
call write_i2c_data_byte_m
jmp ExitI2cWriteData
BolckWriteSupport:
lea si,BlockReadFlag
mov al,ds:[si]
cmp al,02h
jz ByteAccressProc
push bx
lea si,I2CProgramMethod
mov bx,ds:[si]
shl bx,3
lea si,cs:SMBUSAccessMethod
call word ptr cs:[si+bx+6] ;Block write
pop bx
ExitI2cWriteData:
popa
ret
;-------------------------------
write_i2c_data_byte_m:
mov dx,(ValueStartCol+ValueStartRow)
lea si,ReadDataRow
mov cl,ds:[si]
movzx cx,cl
WriteI2cByteLoop1:
push cx
mov cx,16
WriteI2cByteLoop2:
push cx
push dx
call CalaFixedCursorposn ; Output:AX
call CheckCursorArrtibuteData
jnz SkipWriteI2cByte
mov ax,dx
sub ax,(ValueStartCol+ValueStartRow)
mov bh,ah
shl bh,4
xor ah,ah
mov cl,3
div cl
add al,bh
mov cl,bl
lea si,SlaveAddress
mov ah,ds:[si]
push bx
lea si,I2CProgramMethod
mov bx,ds:[si]
shl bx,3
lea si,cs:SMBUSAccessMethod
call word ptr cs:[si+bx+2] ;Byte write
pop bx
SkipWriteI2cByte:
pop dx
add dl,3
pop cx
loop WriteI2cByteLoop2
mov dl,ValueStartCol
inc dh
pop cx
loop WriteI2cByteLoop1
ret
;-------------------------------
FindDeviceUp:
push di
lea di,SlaveAddress
mov ah,ds:[di]
sub ah,2
FindUpDeviceAgain:
and ah,0feh
cmp ah,0d2h
jz SkipClockGenU
call CheckI2CDevicePresent
jnc UpDevicePresent
;;; KenWang [050702] >>>>>>
push si
lea si,KeyF10Search
cmp byte ptr ds:[si],KeyF10
pop si
jnz SkipClockGenU
clc
jmp short UpDevicePresent
;;; KenWang [050702] <<<<<<
SkipClockGenU:
dec ah
dec ah
jmp short FindUpDeviceAgain
UpDevicePresent:
mov bl,ah
pop di
ret
;-------------------------------
FindDeviceDown:
push di
lea di,SlaveAddress
mov ah,ds:[di]
add ah,2
FindDownDeviceAgain:
and ah,0feh
cmp ah,0d2h
jz SkipClockGen
call CheckI2CDevicePresent
jnc DownDevicePresent
;;; KenWang [050702] >>>>>>
push si
lea si,KeyF10Search
cmp byte ptr ds:[si],KeyF10
pop si
jnz SkipClockGen
clc
jmp short DownDevicePresent
;;; KenWang [050702] <<<<<<
SkipClockGen:
inc ah
inc ah
jmp short FindDownDeviceAgain
DownDevicePresent:
mov bl,ah
pop di
ret
;-------------------------------
;Input : AH=Slave address
CheckI2CDevicePresent:
pusha
push ax
mov dx,SlavePosition
call SetCursor
mov al,ah
call DisplayHex
InputKeyboardBuffer1:
call CheckKeybuffer
jc BufferEmpty1
push ax
; call WaitOneKey
pop ax
cmp ah,KeyF10
jz ExitLoopCheckDevice
jmp InputKeyboardBuffer1
ExitLoopCheckDevice:
BufferEmpty:
cmp ah,KeyF10
pop ax
jz I2CDeviceAbsent1
push ax
BufferEmpty1:
pop ax
xor al,al
CheckI2CDevLoop:
push ax
call CheckKeybuffer
jc I2CDeviceCont
cmp ah,KeyF10
;;; KenWang [050802] >>>>>>
push ax
pushf
; call WaitOneKey
popf
pop ax
;;; KenWang [050802] <<<<<<
jnz I2CDeviceCont
pop ax
jmp short I2CDeviceAbsent1
I2CDeviceCont:
pop ax
push ax
push bx
lea si,I2CProgramMethod
mov bx,ds:[si]
shl bx,3
lea si,cs:SMBUSAccessMethod
call word ptr cs:[si+bx] ;Byte read
pop bx
pop ax
jnz I2CDeviceAbsent
cmp cl,0ffh
jnz CheckI2CDevDone
cmp al,07fh
ja I2CDeviceAbsent
inc al
jmp CheckI2CDevLoop
CheckI2CDevDone:
popa
clc
ret
I2CDeviceAbsent1:
push si
lea si,KeyF10Search
mov ds:[si],ah
pop si
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -