Идея, описанная ниже уже была использована и опробована в LiteBIOS, посему изложу ее вкратце с купюрами и двусмысленностями
Предположение
Будем надеяться, что на исследуемой платформе под ДОС безболезненно можно использовать порты 80h...87h. Хотя можно использовать и любой другой подходящий диапазон портов, например, 180h...187h. Только в этом случае придется выводить в порт 80 доп.информацию.
1) Каким образом работать через 80h...87h?
А очень, оказывается, просто. Конструкция
MOV eax, 55AA00FFh
OUT 80h, eax
обеспечивает наличие в портах 80h...83h байтов, из которых состоит EAX. Факт может очевидный, а может и не очевидный.
2) Как искать неисправность?
Идея такая:
MOV eax, 55AA00FFh
OUT 80h, eax ; первая 32-х битная посылка
OUT 84h, eax ; вторая 32-х битная посылка
Что в результате? Если данные не искажены, это значит, что в цепочке до Южного моста (шина 64 бита, с оговорками) ->PCI (шина 32 бита) -> ISA (шина 16 бит) -> BIOS (8 бит, с оговорками) проблем нет. Для надежности необходимо повторить эту же операцию с инверсными данными, например 0AA55FF00h. Если есть четыре симметричных искажения, то проблема в связке ISA-BIOS, если два, то в PCI-ISA и т.д. (Хотя на практике все немного сложнее).
3) И так до бесконечности...
:)
Наметка кода такова:
mov bx, offset _LOOP
MOV eax, 55AA00FFh
_LOOP:
not eax
OUT 80h, eax
OUT 84h, eax
not eax
OUT 80h, eax
OUT 84h, eax
jmp bx
Идея, описанная ниже уже была использована и опробована в LiteBIOS, посему изложу ее вкратце с купюрами и двусмысленностями
Предположение
Будем надеяться, что на исследуемой платформе под ДОС безболезненно можно использовать порты 80h...87h. Хотя можно использовать и любой другой подходящий диапазон портов, например, 180h...187h. Только в этом случае придется выводить в порт 80 доп.информацию.
1) Каким образом работать через 80h...87h?
А очень, оказывается, просто. Конструкция
MOV eax, 55AA00FFh
OUT 80h, eax
обеспечивает наличие в портах 80h...83h байтов, из которых состоит EAX. Факт может очевидный, а может и не очевидный.
2) Как искать неисправность?
Идея такая:
MOV eax, 55AA00FFh
OUT 80h, eax ; первая 32-х битная посылка
OUT 84h, eax ; вторая 32-х битная посылка
Что в результате? Если данные не искажены, это значит, что в цепочке до Южного моста (шина 64 бита, с оговорками) ->PCI (шина 32 бита) -> ISA (шина 16 бит) -> BIOS (8 бит, с оговорками) проблем нет. Для надежности необходимо повторить эту же операцию с инверсными данными, например 0AA55FF00h. Если есть четыре симметричных искажения, то проблема в связке ISA-BIOS, если два, то в PCI-ISA и т.д. (Хотя на практике все немного сложнее).
3) И так до бесконечности...
:)
Наметка кода такова: