Så er jeg klar igen, følgende kan bruges i DOS, dvs at du, hvis Delphi er dit værktøj lig skal konverterer det til 32bit.
Unit CMOS;
Interface
{-------------------------------------------------------------------}
Const CMOSVersion = '1.10';
{-------------------------------------------------------------------}
{ Konstanter i unit CMOS }
{-------------------------------------------------------------------}
Const CMOSADDR = $70; { CMOS p† port 70h }
CMOSDATA = $71; { CMOS data port 71h }
Type CMOSBUF = Array[0..127] of byte;
{-------------------------------------------------------------------}
{ Funktioner / Procedure i unit CMOS }
{-------------------------------------------------------------------}
Function CMOSPresent : Boolean;
Function CMOSSize : Word;
Procedure ReadFromCMOS(Var F : CMOSBUF; Number : Word);
Procedure WriteToCMOS(Var F : CMOSBUF; Number : Word);
Implementation
{-----------------------------------------------------------------------}
Function CMOSPresent : Boolean;Assembler;
Asm
MOV AH, 0C0h
INT 15h
PUSHF
POP AX { inspic‚r flagene }
SHR AX, 1 { ulige, ingen CMOS }
JNB @CMOS
JMP @NoCMOS
@CMOS:
XOR AX, AX
MOV AL, BYTE PTR[ES:BX+5] { BIOS Feature information }
AND AL, 20h { and den 5. bit }
CMP AL, 00h { bliver resultatet <> 0h er der CMOS }
JE @NoCMOS { alt andet kan betyde ingen CMOS }
JMP @EXIT
@NoCMOS:
XOR AX, AX { lever FALSE hvis ingen CMOS }
@EXIT:
End;
{-----------------------------------------------------------------------}
Function TestByte : Byte; Assembler;
Asm
MOV AH,AL { Save test value in AH }
CLI { Interrupts off }
MOV AL,CL { Get address in AL }
OUT CMOSADDR,AL { Output CMOS address }
MOV AL,AH { Get test value in AL }
OUT CMOSDATA,AL { Output the test value }
MOV AL,CL { Get address in AL }
OUT CMOSADDR,AL { Output CMOS address }
IN AL,CMOSDATA { Read the test value back }
STI { Interrupts on }
CMP AL,AH { Compare the values }
JE @OK { Branch if they're equal }
STC
JMP @EXIT { Set carry and return }
@OK:
CLC { Clear carry and return }
@EXIT:
End;
{-----------------------------------------------------------------------}
Function CMOSSize : Word;Assembler;
Asm
MOV CX,64 { Initialize counter }
@GETSIZE:
CLI { Interrupts off }
MOV AL,CL { Get address in AL }
OUT CMOSADDR,AL { OUTput CMOS address }
IN AL,CMOSDATA { Read one byte of CMOS data }
MOV BL,AL { Save the byte IN BL }
STI { Interrupts on }
MOV AL,0A5h { Test this byte with alternating 1s and 0s}
CALL TESTBYTE
JC @DONE
MOV AL,5Ah { Test this byte with alternating 1s and 0s}
CALL TESTBYTE
JC @DONE
MOV AL,00h { Test this byte with all 0s }
CALL TESTBYTE
JC @DONE
MOV AL,0FFh { Test this byte with all 1s }
CALL TESTBYTE
JC @DONE
CLI { Interrupts off }
MOV AL,CL { Get address in AL }
OUT CMOSADDR,AL { Output CMOS address }
MOV AL,BL { Get original value in AL }
OUT CMOSDATA,AL { Restore the byte }
STI { Interrupts on }
INC CX { Increment counter }
CMP CX,256 { Loop back for more if CX is less than 256}
JNE @GETSIZE
MOV AL,80h { Make sure NMI is enabled }
OUT CMOSADDR,AL { if this happens to be a PS/2 }
IN AL,CMOSDATA
@DONE:
MOV AX, CX
End;
{-----------------------------------------------------------------------}
Procedure ReadFromCMOS(Var F : CMOSBUF; Number : Word);Assembler;
Asm
XOR AL, AL
XOR CX, CX
LES DI, F
CLD
@MAIN:
CLI
OUT CMOSADDR, AL
IN AL, CMOSDATA
STOSB
STI
INC CX
CMP CX, NUMBER
MOV AL, CL
JNE @MAIN
End;
{-----------------------------------------------------------------------}
Procedure WriteToCMOS(Var F : CMOSBUF; Number : Word);Assembler;
Asm
XOR AL, AL
XOR CX, CX
LES SI, F
CLD
@MAIN:
CLI
OUT CMOSADDR, AL
LODSB
OUT CMOSDATA, AL
STI
INC CX
CMP CX, NUMBER
MOV AL, CL
JNE @MAIN
MOV AL, 80h
OUT CMOSADDR, AL
IN AL, CMOSDATA
End;
{-----------------------------------------------------------------------}
End.
En idé til at vise hvordan du skal gøre, kan du finde ved at downloade filen her
http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=265&lngWId=7.Den viser indholdet af din CMOS.
CodeWarrior