Принцип работы программы основан на том, что с использованием модифицированного кода Хемминга можно проводить проверку считанной информации на наличие ошибок. Существует возможность исправить однократные ошибки и обнаружить двойные. Программа управляет считыванием информации с порта, затем заносит их в оперативную память. По нажатию кнопки начинается проверка содержимого на наличие ошибок. На основе маскирования определенных бит и контроля четности формируется четырехбитная характеристическая комбинация, каждому значению которой соответствует свое решение. Таких решений в результате получается четыре:
1. Нет ошибки. Программа просто начинает проверку следующего байта данных, занесенных в ОЗУ.
2. Есть двойная ошибка, тогда выводится сообщение о двойной ошибке в виде адреса, где она зафиксирована, но только с тем различием, что у выводимого адреса будут обнулены четыре старших бита. То есть такое сообщение об ошибке будет иметь вид 0ххх. Программа ждет нажатия кнопки для дальнейшей работы.
3. Ошибка в контрольном бите. Исправляется с помощью заданной маски. Номер ячейки выводится на индикаторы. Программа ждет нажатия кнопки для дальнейшей работы.
3. Есть одиночная ошибка. Ее исправление начинается с формирования маски, в которой все биты будут установлены в ноль и лишь один в единицу. Как раз тот, что должен будет быть исправлен. Далее, с помощью операции XOR (Исключающее ИЛИ) над содержимым ячейки памяти и маской ошибка будет исправлена. Номер ячейки, в которой была ошибка, выводится на индикаторы. Программа ждет нажатия кнопки для дальнейшей работы.
ЛИСТИНГ ПРОГРАММЫ
Адрес | Мнемонический код | Код | Комментарии |
0000 | MVI A, 89h | 3E | заносим упр. слово в аккумулятор |
0001 | 89 | ||
0002 | OUT 3h | D3 | отправляем 89 (10001001) в РУС |
0003 | 03 | ||
0004 | LXI D,B000h | 11 | Задаем начальное значение регистровой паре, содержащей адрес ячейки памяти |
0005 | 00 | ||
0006 | B0 | ||
0007 | LXI B,7D0h | 01 | Задаем начальное значение регистровой паре, содержащей счетчик |
0008 | D0 | ||
0009 | 07 | ||
000A | IN 2h | DB | Прием сигнала от кнопки для начала записи последовательности байт в ОЗУ |
000B | 02 | ||
000C | m1: IN A5h | DB | Начало цикла, записывающего в ОЗУ принимаемую с порта информацию |
000D | A5 | ||
000E | STAX D | 12 | Запись содержимого аккумулятора в ячейку памяти, адрес которой хранится в DE |
000F | INX D | 13 | Выбираем адрес следующей ячейки |
0010 | DCX B | 0B | Счетчик записанных байт уменьшаем |
0011 | JNZ m1 | C2 | Если записаны не все 2000 байт, то переходим на следующий оборот цикла |
0012 | 0C | ||
0013 | 00 | ||
0014 | LXI D, AFFFh | 11 | Задаем начальное значение регистровой паре, содержащей адрес ячейки памяти |
0015 | FF | ||
0016 | AF | ||
0017 | LXI B,7D1h | 01 | Задаем начальное значение регистровой паре, содержащей счетчик |
0018 | D1 | ||
0019 | 07 | ||
001A | m2: IN 2h | DB | Прием сигнала от кнопки для начала проверки |
001B | 02 | ||
001C | m7: DCX B | 0B | Уменьшаем регистр-счетчик |
001D | JZ m11 | CA | Если обработаны все занесенные в память байты, то переход на завершение программы |
001E | 83 | ||
001F | 00 | ||
0020 | INX D | 13 | Выбор следующей ячейки памяти изменением регистра, содержащего адрес |
0021 | LDAX D | 1A | Запись байта информации в аккумулятор из ячейки по адресу из DE |
0022 | ANI 78h | E6 | Используем маску для отделения бит, важных для составления и анализа первого синдрома |
0023 | 78 | ||
0024 | JPO m3 | E2 | Если количество бит, выставленных в единицу – четное, то ошибки в анализируемых битах нет |
0025 | 29 | ||
0026 | 00 | ||
0027 | MVI Н,4h | 26 | Выполняется только тогда, когда есть ошибка. Запись в Н 100b |
0028 | 04 | ||
0029 | m3:LDAX D | 1A | Запись байта информации в аккумулятор из ячейки по адресу из DE |
002A | ANI 66h | E6 | Используем маску для отделения бит, важных для составления и анализа второго синдрома |
002B | 66 | ||
002C | JPO m4 | E2 | Если количество бит, выставленных в единицу – четное, то ошибки в анализируемых битах нет |
002D | 33 | ||
002E | 00 | ||
002F | MVI A, 2h | 3E | Начало участка, выполняемого только тогда, когда есть ошибка. Запись в (А) 10b |
0030 | 02 | ||
0031 | ADD H | 84 | Прибавляем регистр H к (А) |
0032 | MOV H,A | 67 | Заносим в регистр Н результат суммирования. Т.е. в Н оказывается х10b |
0033 | m4:LDAX D | 1A | Запись байта информации в аккумулятор из ячейки по адресу из DE |
0034 | ANI 55h | E6 | Используем маску для отделения бит, важных для составления и анализа третьего синдрома |
0035 | 55 | ||
0036 | JPO m5 | E2 | Если количество бит, выставленных в единицу – четное, то ошибки в анализируемых битах нет |
0037 | 3D | ||
0038 | 00 | ||
0039 | MVI A, 1h | 3E | Начало участка, выполняемого только тогда, когда есть ошибка. Запись в (А) 1b |
003A | 01 | ||
003B | ADD H | 84 | Прибавляем регистр H к (А) |
003C | MOV H,A | 67 | Заносим в регистр Н результат суммирования. Т.е. в Н оказывается хх1b |
003D | m5:LDAX D | 1A | Запись байта информации в аккумулятор из ячейки по адресу из DE |
003E | ANI FFh | E6 | Операция И по результатам которой производится проверка четности. Реализация проверки по контрольному биту |
003F | FF | ||
0040 | JPO m6 | E2 | Если количество бит, выставленных в единицу – четное, то ошибки в анализируемых битах нет |
0041 | 47 | ||
0042 | 00 | ||
0043 | MVI A, 8h | 3E | Начало участка, выполняемого только тогда, когда есть ошибка. Запись в (А) 1000b |
0044 | 08 | ||
0045 | ADD H | 84 | Прибавляем регистр H к (А) |
0046 | MOV H,A | 67 | Заносим в регистр Н результат суммирования. Т.е. в Н оказывается 1хххb |
0047 | m6: MOV A, H | 7C | Заносим в регистр А результат предыдущих проверок. |
0048 | CPI 0h | FE | Сравнение с нулем. В регистре Н может оказаться 0 только, если ошибки нет |
0049 | 00 | ||
004A | JZ m7 | CA | Если ошибки нет, то переход на анализ следующего байта |
004B | 1C | ||
004C | 00 | ||
004D | CPI 8h | FE | Значение регистра Н от 1h до 7h говорит, что зафиксирована двойная ошибка |
004E | 08 | ||
004F | JP m8 | F2 | Если в ходе сравнения вычитанием получилось положительное число, значит двойной ошибки нет. Переход к исправлению одинарной. |
0050 | 5D | ||
0051 | 00 | ||
0052 | MOV A,D | 7A | Заносим в регистр А старший байт адреса |
0053 | ANI 0Fh | E6 | С помощью операции И обнуляем четыре старших бита |
0054 | 0F | ||
0055 | OUT 0h | D3 | Вывод содержимого А на индикаторы, предназначенные для отображения старшей части адреса |
0056 | 00 | ||
0057 | MOV A,E | 7B | Заносим в регистр А младший байт адреса |
0058 | OUT 1h | D3 | Вывод содержимого А на индикаторы, предназначенные для отображения младшей части адреса |
0059 | 01 | ||
005A | JMP m2 | C3 | Переход на запрос продолжения обработки данных, поступивших в ОЗУ |
005B | 1A | ||
005C | 00 | ||
005D | m8: CPI 8h | FE | Значение регистра Н 1000b говорит, что зафиксирована ошибка в контрольном бите |
005E | 08 | ||
005F | JNZ m9 | C2 | Если ошибка не в контрольном бите, то одинарная ошибка в одном из оставшихся семи битах. Переход к его исправлению |
0060 | 6D | ||
0061 | 00 | ||
0062 | XRI 80h | EE | Исправление в контрольном бите |
0063 | 80 | ||
0064 | MOV A,D | 7A | Заносим в регистр А старший байт адреса |
0065 | OUT 0h | D3 | Вывод на индикаторы старшего байта адреса |
0066 | 00 | ||
0067 | MOV A,E | 7B | Заносим в регистр А младший байт адреса |
0068 | OUT 1h | D3 | Вывод на индикаторы младшего байта адреса |
0069 | 01 | ||
006A | JMP m2 | C3 | Переход на запрос продолжения обработки данных, поступивших в ОЗУ |
006B | 1A | ||
006C | 00 | ||
006D | m9: SUI 8h | D6 | Вычитая 1000b, преобразуем содержимое регистра к номеру бита, где зафиксирована ошибка |
006E | 08 | ||
006F | MOV H,A | 67 | Содержимое аккумулятора переносим в Н |
0070 | MVI A, 80h | 3E | Записываем в А байт, который будет использоваться для коррекции ошибки |
0071 | 80 | ||
0072 | m10: RAL | 17 | Сдвигаем единицу столько раз, сколько указано в Н |
0073 | DCR H | 25 | |
0074 | JNZ m10 | C2 | |
0075 | 72 | ||
0076 | 00 | ||
0077 | MOV H,A | 67 | Переносим в Н получившуюся маску для исправления ошибки |
0078 | LDAX D | 1A | Заносим в А подлежащий исправлению байт |
0079 | XRA H | AC | С помощью операции XOR исправляем ошибку |
007A | MOV A,D | 7A | Заносим в регистр А старший байт адреса |
007B | OUT 0h | D3 | Вывод на индикаторы старшего байта адреса |
007C | 00 | ||
007D | MOV A,E | 7B | Заносим в регистр А младший байт адреса |
007E | OUT 1h | D3 | Вывод на индикаторы младшего байта адреса |
007F | 01 | ||
0080 | JMP m2 | C3 | Переход на запрос продолжения обработки данных, поступивших в ОЗУ |
0081 | 1A | ||
0082 | 00 | ||
0083 | m11: NOP | 00 | Конец программы |
0084 | |||
0085 | |||
0086 | |||
0087 | |||
0088 | |||
0089 | |||
008A | |||
008B | |||
008C | |||
008D | |||
008E | |||
008F | |||
0090 |
Другое по теме:
Разработка нижнего контура управления змееподобного робота В настоящее время всё чаще требуются мобильные роботы для работы в труднодоступных местах. Для этих целей создано множество роботов и ещё больше разрабатывается. Долгое время основным средством передвижения роботов являлись колесные ил ...