我尝试在 MS DOS 下读取 SPD 但失败了

问题描述 投票:0回答:1

我的 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 的内容 但我得到的只是垃圾数据。 我的代码有什么问题吗?

c assembly dos ram smbus
1个回答
0
投票

您使用什么CPU? 16位CPU?还是 32/64 位 CPU?
(只有操作系统是16位的?)

2. 参考:https://learn.microsoft.com/zh-tw/cpp/assembler/inline/writing-functions-with-inline-assemble?view=msvc-170

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.