自已的小程序,還能在INTEL 下正常運行。請大家指教。 在优快云 上已經有好多的人寫過關於此的文章了,我只是抄來練習了一下,為使大家不走彎路,但請看官們潛心學習,變成自已的知識。 #include<stdio.h> #include<conio.h> #include<dos.h> #include<stdlib.h> //Claude_Shi //2010-4-13 #define DEBUG 1 #define READ_CLOCK 0XD3 #define KILL 1<<1 typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; WORD IOBase; //---------------------------------------------------------- //Get SMBus Base address //---------------------------------------------------------- WORD GetSMBase(void) { DWORD pciaddr; // bus:0 dev:31 fun:3, register:20h pciaddr = (1L << 31) + (0L << 16)+(31L << 11)+(3 << 8)+ 0x20; asm{ mov eax,pciaddr mov dx,0CF8h out dx,eax mov dx,0CFCh in eax, dx //read SMB Base and ax, 0FFE0h } return _AX; } //---------------------------------------------------------- //get data //---------------------------------------------------------- BYTE GetData(BYTE INDEX) { return inportb(IOBase+INDEX); } //write to the offset void SMB_IO_W(BYTE INDEX, BYTE DATA) { outportb(IOBase+INDEX, DATA); } //---------------------------------------------------------- // Main Program //---------------------------------------------------------- void main() { BYTE Count, i=0xff; printf("CLOCK GENERATOR DATA READ TOOL BY CLAUDE SHI 2010-4-13/n"); IOBase=GetSMBase(); printf("SMBus IOBASE: %#04X/n",IOBase); //reset---clear 0x07 for MAX. count is 0xFF SMB_IO_W(0X00,0xFE); while(i) { SMB_IO_W(0x00,0xFE); delay(2); i--; } //set slave address SMB_IO_W(0X04,READ_CLOCK); //clear command data in 0x03 SMB_IO_W(0X03,0); //reset SMBUS SMB_IO_W(0X00,0XFE); //start block mode SMB_IO_W(0X02,0X54); delay(5); //get count of data , offset 0x05 Count=GetData(0x05); delay(5); printf(" 00 01 02 03 04 05 06 07 08 09 A0 B0 C0 D0 E0 F0"); for(i=0;i<Count;i++) { if(i%16==0) { printf("/n"); printf("%02X ",i); } printf("%02X ",GetData(0x07)); delay(5); SMB_IO_W(0x00,0xFE); delay(10); }//for exit(0); }