ПРИЛОЖЕНИЕ 5
Программа.
| Метка | Команда | Комментарий |
| MVI A, 90h | Настройка ППИ (датчики, управление). | |
| OUT F3h | ||
| MVI A, FFh | Выключаем всю сигнализацию и управление. | |
| OUT F2h | ||
| MVI A, 82h | Настройка ППИ (индикация, клавиатура). | |
| OUT FBh | ||
| LXI SP, F400h | Инициализация стека. | |
| LDA 06FEh | Перенос адресов подпрограмм из ПЗУ в ОЗУ. | |
| STA F70Eh | ||
| LDA 06FFh | ||
| STA F71Eh | ||
| LDA 0700h | ||
| STA F72Eh | ||
| LDA 0701h | ||
| STA F73Eh | ||
| LDA 0702h | ||
| STA F70Dh | ||
| LDA 0703h | ||
| STA F71Dh | ||
| LDA 0704h | ||
| STA F72Dh | ||
| LDA 0705h | ||
| STA F73Dh | ||
| LDA 0706h | ||
| STA F70Bh | ||
| LDA 0707h | ||
| STA F71Bh | ||
| LDA 0708h | ||
| STA F72Bh | ||
| LDA 0709h | ||
| STA F73Bh | ||
| LDA 070Ah | ||
| STA F707h | ||
| LDA 070Bh | ||
| STA F717h | ||
| LDA 070Ch | ||
| STA F727h | ||
| LDA 070Bh | ||
| STA F737h | ||
| MVI A, 30h | Настройка таймера. | |
| OUT 03h | ||
| MVI A, 30h | ||
| OUT 00h | ||
| MVI A, 75h | ||
| OUT 00h | ||
| JMP OPR2 | Переход к основной программе. | |
| M1 | PUSH PSW | Подпрограмма обработки прерывания. |
| PUSH B | ||
| PUSH D | ||
| PUSH H | ||
| LDA F701h | Начало ввода с клавиатуры | |
| RLC | ||
| RLC | ||
| RLC | ||
| RLC | ||
| OUT FAh | Сканирование | |
| MOV E,A | ||
| MVI D, F7h | ||
| IN F9h | Ввод с клавиатуры | |
| XRI F0h | Обнуление старших битов | |
| ADD E | ||
| MOV E, A | ||
| LDAX D | ||
| MVI H, 07h | ||
| MOV L, A | ||
| PCHL | Вызов подпрограммы конкретной клавиши | |
| M2 | LDA F701h | Начало индикации |
| MVI D,F7h | ||
| MVI E, FCh | ||
| ADD E | ||
| MOV E, A | ||
| LDAX D | Чтение символа для индикации | |
| MVI D, 06h | ||
| MVI E, F0h | ||
| ADD E | ||
| LDAX D | Чтение кода символа из ПЗУ | |
| OUT F8 | Вывод на индикаторы | |
| LDA F701h | Изменяем значение счетчика сканирования | |
| INR A | ||
| STA F701h | ||
| XRI 04h | ||
| JNZ M4 | ||
| STA F701h | Изменили | |
| M4 | MVI A, 30h | Настройка таймера. |
| OUT 03h | ||
| MVI A, 30h | ||
| OUT 00h | ||
| MVI A, 75h | ||
| OUT 00h | ||
| POP H | ||
| POP D | ||
| POP B | ||
| POP PSW | ||
| RET | Выход из подпрограммы обработки прерывания | |
| Подпрограммы клавиш | ||
| MVI A, 00h | «0» | |
| JMP M3 | ||
| MVI A, 01h | «1» | |
| JMP M3 | ||
| MVI A, 02h | «2» | |
| JMP M3 | ||
| MVI A, 03h | «3» | |
| JMP M3 | ||
| MVI A, 04h | «4» | |
| JMP M3 | ||
| MVI A, 05h | «5» | |
| JMP M3 | ||
| MVI A, 06h | «6» | |
| JMP M3 | ||
| MVI A, 07h | «7» | |
| JMP M3 | ||
| MVI A, 08h | «8» | |
| JMP M3 | ||
| MVI A, 09h | «9» | |
| JMP M3 | ||
| M3 | STA F702h | Сохранение данных из аккумулятора |
| LDA F703h | Проверка режима ввода | |
| XRI 00h | ||
| JZ M2 | Проверка окончена | |
| LDA F705h | Проверка: сброшена ли ячейка ввода. | |
| XRI 00h | ||
| JNZ M2 | Проверили. | |
| LDA F7FDh | ||
| STA F7FEh | Переписали со второй позиции в третью | |
| LDA F7FCh | ||
| STA F7FDh | Переписали с первой позиции во вторую | |
| LDA F702h | ||
| STA F7FCh | Записали в первую позицию новое число | |
| JMP M2 | Индикация | |
| «С» | ||
| LDA F703h | Проверка режима ввода | |
| XRI 00h | ||
| JZ M2 | Проверили | |
| MVI A,00h | Обнуляем: аккумулятор, | |
| STA F7FCh | первую позицию, | |
| STA F7FDh | вторую, | |
| STA F7FEh | третью, | |
| STA F705h | индикатор сброса. | |
| JMP M2 | Индикация | |
| «Ent» | ||
| JMP ENT | ||
| ENT | LDA F703h | Проверка режима ввода |
| XRI 00h | ||
| JZ M2 | Проверили | |
| LDA F703h | Идентификация адреса ввода. | |
| RLC | ||
| RLC | ||
| MOV E, A | ||
| LDA F7FFh | ||
| RLC | ||
| RLC | ||
| RLC | ||
| RLC | ||
| ADD E | ||
| MOV E, A | ||
| MVI D, F6h | Идентификация завершена. | |
| LDA F7FCh | Пересылка данных с индикаторов в память. | |
| STAX D | ||
| INR E | ||
| LDA F7FDh | ||
| STAX D | ||
| INR E | ||
| LDA F7FEh | ||
| STAX D | Пересылка окончена. | |
| MVI A, 01h | ||
| STA F705h | Установка индикатора сброса в [1] | |
| JMP M2 | Индикация. | |
| «A» | ||
| JMP A | ||
| A | MVI A, 0Ah | Фиксируем датчик |
| STA F7FFh | в памяти. | |
| CALL REPEAT | Проверка повторного выбора. | |
| JMP M2 | Индикация. | |
| «B» | ||
| JMP B | ||
| B | MVI A, 0Bh | Фиксируем датчик |
| STA F7FFh | в памяти. | |
| CALL REPEAT | Проверка повторного выбора. | |
| JMP M2 | Индикация. | |
| «C» | ||
| JMP C | ||
| C | MVI A, 0Ch | Фиксируем датчик |
| STA F7FFh | в памяти. | |
| CALL REPEAT | Проверка повторного выбора. | |
| JMP M2 | Индикация. | |
| «D» | ||
| JMP D | ||
| D | MVI A, 0Dh | Фиксируем датчик |
| STA F7FFh | в памяти. | |
| CALL REPEAT | Проверка повторного выбора. | |
| JMP M2 | Индикация. | |
| REPEAT | LDA F706h | Проверяем повторный выбор датчика. |
| MOV C, A | ||
| LDA F701h | ||
| XRA C | ||
| JZ M5 | Проверили. | |
| LDA F701h | ||
| STA F706h | ||
| MVI A, 00h | ||
| STA F703h | Обнуляем индикатор изменения информации | |
| M5 | LDA F703h | |
| INR A | Увеличиваем на единицу | |
| MOV C, A | индикатор изменения информации | |
| XRI 03h | и проверяем | |
| JNZ M6 | на переполнение. | |
| MVI A, 00h | ||
| STA F703h | ||
| JMP IDEN | ||
| M6 | MOV A, C | |
| STA F703h | ||
| IDEN | RLC | Идентификация адреса вывода информации. |
| RLC | ||
| MOV E, A | ||
| LDA F7FFh | ||
| RLC | ||
| RLC | ||
| RLC | ||
| RLC | ||
| ADD E | ||
| MOV E, A | ||
| MVI D, F6h | Идентификация завершена. | |
| LDAX D | Пересылка данных из памяти на индикаторы. | |
| STA F7FCh | ||
| INR E | ||
| LDAX D | ||
| STA F7FDh | ||
| INR E | ||
| LDAX D | ||
| STA F7FEh | Пересылка окончена. | |
| RET | Конец подпрограммы. | |
| Основная программа. | ||
| OPR2 | MVI A, F0h | Опрос датчиков. |
| STA F500h | ||
| OPR1 | LDA F500h | Читаем порядковый номер датчика |
| RLC | Сдвигаем для передачи в порт | |
| RLC | ||
| RLC | ||
| RLC | ||
| OUT F1h | Отправляем в порт | |
| XRI 01h | ||
| OUT F1h | ||
| NOP | ||
| NOP | ||
| NOP | ||
| NOP | ||
| XRI 02h | ||
| OUT F1h | ||
| IN F0h | Ввод информации с датчика. | |
| SUI 33h | ||
| JNC WREM | ||
| При обрыве датчика выводим на индикаторы [- - -]. | ||
| LDA F500h | Идентификация адреса ввода. | |
| ADI 0Ah | ||
| SUI F0h | ||
| RLC | ||
| RLC | ||
| RLC | ||
| RLC | ||
| MOV E, A | ||
| MVI D, F6h | Идентификация завершена. | |
| MVI A, BFh | Код символа [-]. | |
| STAX D | ||
| INX D | ||
| STAX D | ||
| INX D | ||
| STAX D | ||
| JMP WR1 | Переход к следующему датчику. | |
| WREM | STA F4FFh | Временно сохраняем результат в ячейке памяти. |
| CALL SRAVN | ||
| WR1 | LDA F500h | |
| INR A | Увеличиваем порядковый номер опрашиваемого датчика. | |
| STA F500h | ||
| XRI F4h | Проверяем счетчик на переполнение. | |
| JNZ OPR1 | Продолжаем опрос. | |
| JMP OPR2 | Возобновляем опрос. | |
| SRAVN | MVI D, 00h | Преобразование, сохранение и сравнение данных. |
| LDA F4FFh | ||
| MOV E, A | ||
| LDA F500h | ||
| INR A | ||
| MOV C, A | ||
| MVI B, 00h | ||
| XRA A | Программа перевода числа из 16-тиричной в 10-тичную систему. | |
| MVI D, F4h | ||
| MVI E, FCh | ||
| STAX D | ||
| DCX D | ||
| STAX D | ||
| DCX D | ||
| STAX D | ||
| BEG | DCX B | |
| LDAX D | ||
| INR A | ||
| STAX D | ||
| XRI 0Ah | ||
| JNZ B | ||
| MVI A, 00h | ||
| STAX D | ||
| INX D | ||
| LDAX D | ||
| INR A | ||
| STAX D | ||
| XRI 0Ah | ||
| JNZ B1 | ||
| MVI A, 00h | ||
| STAX D | ||
| INX D | ||
| LDAX D | ||
| INR A | ||
| STAX D | ||
| XRI 0Ah | ||
| JNZ B2 | ||
| MVI A, 86h | Символ [E] выводится на индикаторы, если число больше 999. | |
| STAX D | ||
| DCX D | ||
| STAX D | ||
| DCX D | ||
| STAX D | ||
| JMP ENDE | ||
| B2 | DCX D | |
| B1 | DCX D | |
| B | MOV A, B | |
| XRI 00h | ||
| JNZ BEG | ||
| MOV A, C | ||
| XRI 00h | ||
| JNZ BEG | ||
| Запись в соответствующую ячейку памяти | ||
| ENDE | LDA F500h | Идентификация адреса ввода. |
| ADI 0Ah | ||
| SUI F0h | ||
| RLC | ||
| RLC | ||
| RLC | ||
| RLC | ||
| MOV E, A | ||
| MVI D, F6h | Идентификация завершена. | |
| LDA F4FAh | ||
| STAX D | ||
| INX D | ||
| LDA F4FBh | ||
| STAX D | ||
| INX D | ||
| LDA F4FCh | ||
| STAX D | Запись окончена. | |
| Сравнение. | ||
| SR | LDAX D | |
| MOV H, A | ||
| MVI B, F6h | ||
| MVI A, 04h | ||
| ADD E | ||
| MOV C, A | ||
| LDAX B | Загрузка “минимума”. | |
| SUB H | Вычитаем текущее значение из “минимума”. | |
| JNC ALARM1 | Если нет переноса, значит текущее значение меньше “минимума”. | |
| MVI A, 08h | ||
| ADD E | ||
| MOV C, A | ||
| LDAX B | Загрузка “максимума”. | |
| SUB H | Вычитаем текущее значение из “максимума”. | |
| JC ALARM2 | Если есть перенос, то текущее значение больше “максимума”. | |
| MOV A, E | ||
| ANI 0Fh | ||
| JNZ PER | Если проверили все разряды и все в порядке, то отменяем сигнализацию. | |
| LDA F500h | Поиск сигнала для отмены и формирование управляющих слов. | |
| ANI 0Fh | ||
| JNZ S1 | ||
| MVI A, 01h | ||
| JMP SIG | ||
| S1 | MOV B, A | |
| XRI 01h | ||
| JNZ S2 | ||
| MVI A, 03h | ||
| JMP SIG | ||
| S2 | MOV A, B | |
| XRI 02h | ||
| JNZ S3 | ||
| MVI A, 05h | ||
| JMP SIG | ||
| S3 | MVI A, 07 | |
| PER | DCX D | Переходим к меньшему разряду. |
| JMP SR | ||
| ALARM1 | LDA F500h | |
| ANI 0Fh | ||
| JZ A11 | ||
| MOV B, A | ||
| XRI 01h | ||
| JZ A12 | ||
| MOV A, B | ||
| XRI 02h | ||
| JZ A13 | ||
| MOV A, B | ||
| XRI 03h | ||
| JZ A14 | ||
| ALARM2 | LDA F500h | |
| ANI 0Fh | ||
| JZ A11 | ||
| MOV B, A | ||
| XRI 01h | ||
| JZ A12 | ||
| MOV A, B | ||
| XRI 02h | ||
| JZ A23 | ||
| MOV A, B | ||
| XRI 03h | ||
| JZ A14 | ||
| A11 | MVI A, 00h | |
| JMP SIG | ||
| A12 | MVI A, 02h | |
| JMP SIG | ||
| A13 | MVI A, 0Bh | |
| OUT F3h | ||
| MVI A, 08h | ||
| OUT F3h | ||
| MVI A, 04h | ||
| JMP SIG | ||
| A23 | MVI A, 09h | |
| OUT F3h | ||
| MVI A, 0Ah | ||
| OUT F3h | ||
| MVI A, 04h | ||
| JMP SIG | ||
| A14 | MVI A, 06h | |
| JMP SIG | ||
| SIG | OUT F3h | Посылаем команду управления (сигнализации). |
| JMP ENDSR | ||
| ENDSR | RET | Выход из подпрограммы преобразования, сохранения и сравнения. |