我的 16 位 DOS 应用程序使用此代码通过 SMBUS 读取 SPD,但失败。 我期待从 MS DOS 读取 SPD EEPROM 的内容。
如何从 MS DOS 读取 RAM SPD EEPROM?
16位应用程序代码:
bool WaitReady(WORD base)
{
BYTE STATUS;
do{
__asm
{
mov dx, base
in al, dx
mov [STATUS], al
}
}while((STATUS&0x01)!=0);
return true;
}
void outportb(uint16_t port, uint8_t value)
{
__asm
{
mov dx, [port]
mov al, [value]
out dx, al
}
}
void ReadSPD(WORD base,BYTE offset,BYTE DEVID, BYTE DATA[1])
{
//output Base+00 Clear Flags
outportb(base, 0x1E);
//output Base+04, (DeviceID+1)
outportb(base+0x04, DEVID+1);
//out Base+03, offset
outportb(base+0x03, offset);
//out Base+02, 48H
outportb(base+0x02, 0x48);
//wait 20ms
__asm
{
mov dx, 20000
xor cx, cx
mov ah, 86h
int 15h
}
//wait smbus ready
if(WaitReady(base))
{//input base+05
__asm
{
mov dx, base
add dx, 5
in al, dx
mov [DATA], al
}
}
}
uint16_t SMBUSPORT;
void main()
{
__asm
{
mov eax, 0x8000FB20 ;SMBUS DEVICE
mov dx, 0xCF8
out dx, eax
mov dx, 0xCFC
in ax, dx
and ax, 0xFFF0
mov [SMBUSPORT], ax
}
BYTE value[1];
for (int i = 0; i < 256; i++)
{
ReadSPD(SMBUSPORT, i, 0xA0, value);
print("%X", value);
}
}
我希望我的程序能够打印 DIMM 的第一个 SPD EEPROM 的内容 但我得到的只是垃圾数据。 我的代码有什么问题吗?
您使用什么CPU? 16位CPU?还是 32/64 位 CPU?
(只有操作系统是16位的?)
int power2( int num, int power )
uint16_t SMBUSPORT;
__asm
{
mov [SMBUSPORT], ax
}
如果
SMBUSPORT
是一个指针,则这段代码是正确的!uint16_t SMBUSPORT;
__asm
{
mov SMBUSPORT, ax
}
为什么不使用所有纯 asm 代码来完成它?
bool WaitReady(WORD base)
{
__asm
{
:NotReadyYet
mov dx, base
in al, dx
nop
test al,1
jnz NotReadyYet
}
return true;
}
void outportb(uint16_t port, uint8_t value)
{
__asm
{
mov dx, port
mov al, value
out dx, al
}
}
void ReadSPD(WORD base,BYTE offset,BYTE DEVID, BYTE &DATA)
{
.....
//wait smbus ready
WaitReady(base);
//input base+05
__asm
{
mov dx, base
add dx, 5
in al, dx
mov DATA, al
}
}
uint16_t SMBUSPORT;
void main()
{
__asm
{
mov eax, 0x8000FB20 ;SMBUS DEVICE
mov dx, 0xCF8
out dx, eax
mov dx, 0xCFC
in ax, dx
and ax, 0xFFF0
mov SMBUSPORT, ax
}
BYTE value;
for (int i = 0; i < 256; i++)
{
ReadSPD(SMBUSPORT, i, 0xA0, &value);
printf("%02X ", value);
}
}