Регистры МП: АХ – аккумулятор
ВХ – адрес базы данных
СХ – счетчик циклов
DX – адреса внешних устройств ( 64К )
SI, DI – смещение адреса
ES – сегмент данных
Содержимое этих 7 регистров можно изменить в реальном режиме с помощью ассемблерной вставки.
Далее: SP, DP – указатели для стека
SS – сегмент стека
DS - сегмент данных
Содержимое этих 4-х регистров нужно запоминать в процессе выполнения операций, связанных с их использованием.
АЛГОРИТМ ТЕСТИРОВАНИЯ РЕГИСТРОВ МП
1) Выбираем константы для тестирования: К0, К1, К2 (К2`).
2) Организуем цикл по пересылке констант из регистра в регистр, со сравнением, на выходе последнего регистра цепочки; с константой тестирования.
3) Вывод результатов в виде: константы ( К0, К1, К2) прошли или нет.
Реализация на Pascal в MS-DOS.
{$G+} // включение ассемблера МП 80286
Program test_RG_CPU;
Ввести дополнительные переменные для промежуточного хранения 4-х регистров:
WSS для SS; WBP для BP; WSP для SP; WDS для DS.
Ассемблерная вставка:
asm
1) запрет на прерывание ( 9 бит регистра флагов)
cli
2) запись всех регистров
pusha
3) запись констант тестирования в АХ
mov AX, <константа>
4) mov CX, SS *
mov WSS, CX *
mov WBP, BP * сохранение SS, BP, SP, DS
mov WSP, SP *
mov CX, DS *
mov DS, AX *
mov BX,DS * восстановление DS
mov DS,CX *
mov ES, BX *
mov CX, ES *
mov SS, CX *
mov DX, SS * движение констант по регистрам МП
mov SP, DX *
mov BP, SP *
mov SI, BP *
mov DI, SI *
mov SP, WSP *
mov BP, WBP *
mov BX, WSS * восстановление SP, BP, SS
mov SS, BX *
xor AX, DI – сумма по модулю 2, входа и выхода цепочки
mov BUF, AX – записать результат в переменную BUF ( 0 – нет ошибки, не 0 -error)
pop a - восстановление регистров из стека
sti - разрешение прерывания регистров флага
конец asm вставки
анализ на ошибки
если BUF = 0, тогда нет ошибки, иначе ошибка.
ТЕСТИРОВАНИЕ БАТАРЕИ ПИТАНИЯ И КОНТРОЛЬНОЙ СУММЫ CMOS RTC
CMOS хранит конфигурацию ПК в REAL MODE.
Порт 70h CMOS предназначен для установления адреса регистра CMOS. Порт 71h предназначен для чтения – записи байта в – из регистра CMOS, адрес которого записан в порт 70h.
Регистры CMOS от 10h до 2Dh охвачены контрольной сумой ( в 2Eh и в 2Fh -16 разрядной).
Для проверки батарейки проверяется 7 бит (старший) в регистре 8Dh, если там 1, то нет ошибки, иначе - не исправна.
Фрагменты программы для тестирования батарейки и контрольной суммы:
батарейка: port[$70]:= $8D; //адрес регистра контроля батарейки
if (port[$71] and $80) = $80 then OK else “селабатарейка”
проверка контрольной суммы:
S:=0 ; // начальное значение контрольной суммы
fori:= $10 to $2Ddo //цикл по адресному пространству CMOS – //охваченному контрольной суммой
begin
port[$70]:=i; //запись в порт адреса очередного регистра
S:= S+port[$71]; // суммирование содержимого адреса очередного //регистра с предыдущим
end;
проверка контрольной суммы:
port$70:=$2E; - адрес старшего байта контрольной суммы
DHI:= port$71 – читаем старший байт контрольной суммы
port$70:=$2F – адрес младшего байта контрольной суммы
DLO:= port$71 – читаем младший байт контрольной суммы
if (HI (S)=DHI) and ( LO (S) = DLO) then OK else Error;
где HI- получение старшего байта от слова S
LO – получение младшего байта от слова S
Пример результата: S = 1780
DHI = 6
DLO = 244
проверка: 6* 256 + 244 = 1780
ТЕСТИРОВАНИЕ ДОЗУ В РЕАЛЬНОМ РЕЖИМЕ
Объем ДОЗУ в Real Mode = 640 KБ; все остальное: DOS, видео система и другое.
Алгоритм:
1) 640 К разделяется на 10 сегментов ( сегмент = 64 К )
2) Каждый сегмент разбивается на 64 блока по 1 К. Тест выполняется поблочно.
3) Пропускаются первые 16 К, т.к в них хранятся коды программы
4) Сохраняем в буфере 1 К + проверяемого ДОЗУ.
move ( mem[k:i*1024],buf,1024);
пересылаем в буфер 1 К, где: mem - читает побайтно память; k – номер сегмента; i- номер блока, buf – переменная для буфера размером 1024 байта.
asm
cli –запрет на прерывание
end;
1) запись К0, К1, К2 в 1К
for j:=0 to 511 do
memW [ k : i * 1024 + j * 2 ] : = константа (слово)
2) проверка: чтение из памяти и сравнение с эталоном:
if memW [ k: i *1024 +j*2] константе - ошибка
3) восстановление 1К
move ( buf, mem[k:i*1024],1024)
sti – отмена запрета
end;
И так по всем блокам и всем сегментам.
ТЕСТИРОВАНИЕ КЛАВИАТУРЫ (ВКЛЮЧЕНИЕ ВЫКЛЮЧЕНИЕ СВЕТОДИОДОВ)
Клавиатура обслуживается собственным ПО. Имеет системные порты и две микроЭВМ ( 8048, 8042). Перечень команд для включения и выключения светодиодов:
port$60:=$ED; // команда управления светодиодами
delay(1000); // задержка 1 сек.
port$60:=$2; // включение NumLock
delay(); // задержка
port$60: = $ED;
port$60:= 0; //выключить любой включенный светодиод
Коды включения других светодиодов: CapsLock = $04; ScrollLock = $01;
ТЕСТ РЕГЕНЕРАЦИИ ПАМЯТИ
При регенерации ДОЗУ ( от 8 до 64 мс) сигнал о регенерации поступает в четвертый бит 61h порта:
t:= false;
repeat
if (port[$61] and $ 10) < > 0 then t:= true;
until t; - выход из цикла при начале регенерации
k:=0; t:=false;
repeat
if ( port[$61] and $10 ) = 0 then t:=true;
k:=k+1;
until t; - выход по окончании регенерации, которая длилась k- тактов.