4.5. Проверка оперативной памяти компьютера.
Приведенная ниже программа также является полезной и поучительной. Логика ее работы такая. Перед вызовом этой процедуры в регистровой паре HL должен быть установлен начальный адрес проверяемой области ОЗУ, а в паре ВС - длина этой области. Проверка проводится в пять этапов. В каждую ячейку записывается проверочный байт, а затем проверяется, как он туда записался. Если вскрывается ошибка, то программа прерывается с включением флага CARRY, а содержимое регистра HL указывает на адрес ошибочной ячейки. Если проверка прошла нормально, то проверяемая область памяти после выхода будет содержать нули, а если нет, то в аккумуляторе будет содержаться то число, которое было записано в ячейку, но не воспроизвелось.
Мы ассемблировали эту программу с адреса 2 6000, но Вы, конечно, можете это переделать.
На первом проходе в память записываются нули и проверяются .
На втором проходе записывается FF. На третьем - AA (10101010B) . На четвертом - 55 HEX (01010101B) . Пятый проход -проверка с "плавающим" битом. Сначала помещается число 80 HEX (1000 000B) , а затем включенный бит перемещается вправо, пока не пройдет полный оборот и происходит переход к проверке следующего адреса.
Адрес |
Метка |
Маш.код |
Мнемоника |
Комментарий |
6590 |
|
7A |
LD |
A, D |
Проверка заданной области ОЗУ на 0 |
6591 |
|
B3 |
OR |
E |
|
6592 |
|
C8 |
RET |
Z |
Выход, если так |
6593 |
|
42 |
LD |
B, D |
В ВС - размер области |
6594 |
|
4B |
LD |
C, E |
|
6595 |
TEST1 |
97 |
SUB |
A |
Это то же, что и LD A,0 |
6596 |
|
CDC065 |
CALL |
FILL |
Вызов процедуры заполнения области байтом |
6599 |
|
D8 |
RET |
C |
Выход, если найдена ошибка (флаг С включен) |
659A |
TEST2 |
3EFF |
LD |
A, FF |
|
659C |
|
CDC065 |
CALL |
FILL |
|
65 9F |
|
D8 |
RET |
C |
|
65A0 |
TEST3 |
3EAA |
LD |
A, AA |
|
65A2 |
|
CDC065 |
CALL |
FILL |
|
65A5 |
|
D8 |
RET |
C |
|
65A6 |
TEST4 |
3E55 |
LD |
A,55 |
|
65A8 |
|
CDC065 |
CALL |
FILL |
|
65AB |
|
D8 |
RET |
C |
|
65AC |
TEST5 |
3E8 0 |
LD |
A,80 |
В акк-р загружен байт 10000000 |
65AE |
REP |
77 |
LD |
(HL),A |
Этот байт загружен в проверяемый адрес |
65AAF |
|
BE |
CP |
(HL) |
И тут же проверяется |
65B0 |
|
37 |
SCF |
|
Включается флаг С на случай выхода по ошибке |
65B1 |
|
C0 |
RET |
NZ |
Выход, если ошибка |
65B2 |
|
0F |
RRCA |
|
Сдвиг включенного бита вправо |
65B3 FE8 0 CP 80 Сравнение нового байта с
1000 0000, т. е. сделан полный оборот или нет? 65B5 20F7 JR NZ, REP Если нет, то возврат и
опять проверка 65B7 3600 LD (HL) , 00 Если да, то сначала
обнулить проверяемую ячейку 65B9 23 INC HL и перейти к проверке
следующей, уменьшив счетчик 65BA 0B DEC BC проверяемых ячеек ОЗУ
65BB 7 8 LD A, B Проверка на коне ц
65BC B1 OR C проверяемой области
65BD JR NZ,TEST5 Переход к проверке
следующей ячейки, если
2 0ED
область не исчерпана 65BF RET Выход, если исчерпана
C9
65C0 FILL E5 PUSH HL
65C1 C5 PUSH BC Запомнили на стеке HL и BC
65С2 5F LD E, A Временно освободили А для
других дел
65C3 77 LD (HL),A Засылка в проверяемую
ячейку проверочного числа 65С4 0B DEC BC Уменьшение счетчика
проверяемых ячеек 65C5 78 LD A, B Проверка на то, что область
65С6 B1 OR C исчерпана
65C7 7 B LD A, E Восстановили аккумулятор
65C8 2805 JR Z, COMP Переход на проверку, если
длина проверяемой области была всего 1 байт 65CA 54 LD D, H Подготовка к применению
65CB 5D LD E, L команды для быстрой
переброски байта LDIR 65CC 13 INC DE Адрес приемника на единицу
больше источника
65CD |
|
EDB0 |
LDIR |
|
Переброска байта |
65CF |
COMP |
C1 |
POP |
BC |
Восстановление со стека |
65D0 |
|
E1 |
POP |
HL |
регистровых пар |
65D1 |
|
E5 |
PUSH |
HL |
без изменение содержания |
65D2 |
|
C5 |
PUSH |
BC |
стека |
65D3 |
AGAIN |
EDA1 |
CPI |
|
Сравнение |
65D5 |
|
2007 |
JR |
NZ,ERROR |
Если сравнение не прошло, |
то переход на подпрограмму обработки ошибки 65D7 EAD365 JP PE,AGAIN Напоминаем, что команда CPI
обнуляет флаг четности, если исчерпан список сравнения, т.е. если BC = 0 Восстановление регистров BC и HL перед выходом Выключение флага C, поскольку ошибок нет Выход
Восстановление регистров перед выходом Включение флага "С", поскольку была ошибка Выход