ПРОГРАММА-МОНИТОР
Программа-монитор (или просто монитор) — это программа, которая управляет работой микро-ЭВМ. Монитор выполняет следующие функции: подготовку к работе устройств микро-ЭВМ после включения питания и повторных перезапусков, обслуживание индикаторов и клавиатуры, выполнение указаний пользователя по реализации программы. Микро-ЭВМ выполняет программу-монитор все то время, когда она не выполняет какую-либо программу пользователя.
Ниже приведен полный текст программы-монитор. При первом прочтении можно пропустить дальнейший текст данного параграфа, но при отладке ПМ-ЭВМ и работе с нею необходимо четкое понимание функционирования монитора, для чего и приводится ее детальное описание.
Текст программы состоит из трех столбцов. Первый столбец содержит адреса ячеек памяти, второй столбец - содержимое этих ячеек в восьмеричном коде, а третий столбец — ассемблерную запись программы.
После подачи всех необходимых напряжений на микросхемы и микропроцессор микро-ЭВМ начинает работать. При этом содержимое всех регистров микропроцессора и ячеек ОЗУ устанавливается случайным образом. Поэтому в микро-ЭВМ происходит в этот момент неуправляемый и непредсказуемый процесс. Для того чтобы остановить его и пустить по вполне определенному руслу, в микропроцессоре КР580ИК80А имеется вход RESET (вывод 72). На этот вход подается высокий уровень, который вырабатывается при помощи специальной схемы сразу после включения питания (см. гл. 6) или при нажатии на кнопку СБРОС. По этому сигналу микропроцессор заносит в счетчик команд (PC) во все разряды нули. Это означает, что следующая команда будет считываться из ячеек с нулевым адресом. По этому адресу размещается первая команда монитора. Для того чтобы монитор уже находился в памяти микро-ЭВМ после ее включения, он помещается в ПЗУ. Кроме того что монитор занимает память ПЗУ, он, как и всякая программа, при своей работе использует ячейки ОЗУ и регистры микропроцессора. Какие ячейки ОЗУ и как он использует, будет ясно после разбора самой программы.
Итак, первая команда монитора, расположенная по адресу 000000Q, - команда безусловного перехода JMP Ml, которая передает управление команде, расположенной по адресу 000070Q. Команда JMP Ml занимает три байта. Байты с 000 003 Q по 000 067 Q не используются. Эту область ПЗУ следует оставить незапрограммированной, так как она может понадобиться для расширения возможностей микро-ЭВМ по работе с прерываниями. Под меткой Ml (по адресу 000070Q) находится команда LXI SP, 010000Q. Эта команда загружает константу 010000Q в указатель стека (SP), чтобы он указывал на первую несуществующую ячейку ОЗУ. Тогда при первом занесении данных в стек (ячейки которого располагаются в ОЗУ) SP будет увеличен на единицу и будет указывать последнюю ячейку физически существующего ОЗУ, куда и поместятся данные. При дальнейших обращениях стек будет "расти" от старших адресов памяти к младшим при записи в него и "уменьшаться" при считывании. Если пользователь далее будет правильно использовать команды записи и считывания (их число должно быть одинаковым), никогда не произойдет ошибки обращения к стеку. Обратим здесь внимание на то, что восьмеричная константа, записанная в ассемблерной строке под меткой Ml, приобрела другую кодировку при записи в память в ячейки 000071Q и 000 072 Q. Чтобы понять, что произошло при переходе от записи на ассемблере к реальному расположению константы в памяти, запишем сначала эту константу в двоичном коде: 010000Q равняется 0001000000000000В. Если теперь разбить это 16-разрядное двоичное число на два байта, то получится 00010000В и 00000000В, или в восьмеричной системе 020Q и OOOQ. Эти числа и записаны в ячейки с адресами 000 072 Q и 000071Q соответственно. Этот перевод константы от той формы, в которой она записана на ассемблере, к реальному расположению в памяти будет встречаться еще во многих командах монитора.
Следующая команда LXI Н, 006 000 Q загружает пару регистров H-L константой 006 000Q.
Эта константа является адресом первой ячейки ОЗУ. Загрузка SP и H-L начальными значениями выполняется только один раз при входе в монитор (после сигнала RESET). В дальнейшем эта пара регистров будет использоваться для хранения адреса ячейки памяти, с которой в данный момент работает программист.
Итак, SP установлен таким образом, что поле стека будет находиться в старших адресах ОЗУ, а в H-L находится адрес первой ячейки ОЗУ. Следующие семь команд, занимающие ячейки с 000076Q по 000110Q, служат для того, чтобы высветить на индикаторах адрес ячейки памяти, с которой в настоящее время работает программист, и ее содержимое. Команда М2: MOV С, М (адрес 000 076 Q) переписывает данные из ячейки, адрес которой хранится в H-L (при первом проходе данного места программы это адрес первой ячейки ОЗУ), в регистр С. Далее команда MOV A, H переписывает данные из регистра Н в аккумулятор, чтобы с помощью следующей команды OUT 001Q вывести ее на индикаторы с адресом 001Q. Данные переписываются в аккумулятор перед их выводом этой командой (в двух последующих аналогичных случаях применяется команда OUT OOOQ и OUT 002Q), потому что команда OUT может переслать в устройство вывода только содержимое аккумулятора. После выполнения команды OUT 001 Q на соответствующих индикаторах высветится содержимое регистра Н. Каждый светодиод, которому соответствует единица в каком-либо разряде регистра Н, загорится, а каждый светодиод, которому соответствует нуль в каком-либо разря-пе Н погаснет. Аналогично на светодиодах порта OOOQ высветится содержимое регистра L (команды MOV A, L и OUT OOOQ) и порта 002 Q - регистра С (команды МЗ: MOV А, С и OU 1 00?Q) После этого выполняется команда М4: CALL SKL, которая вызывает подпрограмму SKL, обслуживающую клавиатуру. Прежде чем переходить к описанию этой подпрограммы, опишем еще одну подпрограмму DL, которая вызывается из подпро-граммы SKL.
Подпрограмма DL служит для задержки выполнения программы на 10 мс.
Такие задержки часто необходимы при работе с внешними устройствами, быстродействие которых значительно меньше, чем у микро-ЭВМ. Поэтому эта подпрограмма, находящаяся и используемая в мониторе, написана таким образом что сохраняет значение всех регистров и ячеек памяти во время своей работы. Она может быть вызвана из других программ пользователя. Подпрограмма DL начинается с ячейки 000 277 Q Команды PUSH PSW и PUSH D переписывают в стек содержимое аккумулятора, регистра состояний и пары регистров D-E для того, чтобы освободить эти регистры и использовать далее для своей работы, а перед выходом из подпрограммы восстановить их старое содержание. Затем пара регистров D-E загружается с помощью команды LXI D, 001 016Q константой 001016Q. Следующие пять команд образуют цикл. Команда N:DCX D уменьшает содержимое пары регистров D-E, вычитая из хранящегося в них двоичного числа единицу. Затем старший байт пары D-E командой MOV A, D переписывается в аккумулятор Далее команда ORA E выполняет поразрядно логическую операцию ИЛИ над содержимым аккумулятора и регистра Е и результат этой операции записывается в аккумулятор, при этом если содержимое А и Е (или D и Е) не равно нулю, сбрасывается флаг признака нуля результата Z. Это приводит к тому что следующая команда JNZ N (адрес 000 307 Q) осуществляет переход к метке N (адрес 000304Q) и фрагмент программы от метки N до команды JNZ N (или, что то же самое, от адреса 000304Q до 000311Q) будет повторяться до тех пор пока в обоих регистрах D и Е не образуются нули. Следовательно этот фрагмент программы выполняется 001016Q раз. Обозначим буквой N с соответствующим индексом число машинных тактов определенной команды. Тогда число тактов при однократном выполнении этого фрагмента N0 =Ndcxd + + Nmova,d+Norae+Njnzn = 5 + 5 + 4+10= 19.
Так как длительность одного такта при использовании кварцевого резонатора на частоту 9 МГц равняется 1 мкс (см. гл. 6), время выполнения этого фрагмента 19 мкс, а чтобы выполнить его 001 016Q раз, нужно 9994 мкс.
Следовательно, выполнение этой программы задерживает выполнение программы, вызвавшей ее, примерно на 10 мс. После того как выполнено 001 016 Q циклов и содержимое D и Е равно нулю, флаг Z не устанавливается командой ОКА Е и командой JNZ N не передает управление к метке N. Тогда выполняются команды POP D и POP PSW, которые восстанавливают содержимое пары регистров D-E, аккумулятора и слова состояний. Затем команда RET передает управление команде, следующей за той командой CALL DL, которая вызвала эту подпрограмму.
Рассмотрим теперь подпрограмму SKL. Эта подпрограмма обеспечивает работу клавиатуры микро-ЭВМ. Она располагается в области ПЗУ с адресами 000 177Q - 000 276Q. При ее вызове командой CALL SKL управление передается команде, располагаемой по адресу 000177Q. Команда SKL: MVI А, 000Q загружает в аккумулятор OOOQ, а следующая команда OUT 003Q записывает содержимое младших четырех битов аккумулятора, т. е. 0000В, в четыре триггера микросхем К155ТМ7 (см. микросхему D22 на рис. 7.7). Следовательно, на выходах триггеров этой микросхемы (выводы 16, 15, 10, 9) устанавливаются нули. При этом если нажать хотя бы одну из кнопок К1 — К16, то на соответствующем входе микросхемы К589АП16 (D23) установится также нуль. Далее следующая команда М5: IN 003Q переписывает в четыре младших бита аккумулятора те логические состояния, которые в момент выполнения этой команды присутствуют на входах микросхемы D23. Затем команда ANI 017Q путем выполнения логической операции И записывает в старшие четыре разряда аккумулятора нули, а младшие четыре разряда оставляет такими, какие они были. После этого команда CPI 017Q сравнивает содержимое аккумулятора с константой 017Q (00001111В). В результате этого сравнения в регистре состояний процессора будет установлен флаг нулевого результата, если при выполнении команды М5: IN 003Q на входах микросхемы D23 (выводы 4, 7, 9, 12) были единицы, т. е. ни одна кнопка К1-К16 не была нажата. Если хотя бы одна из кнопок была нажата, то флаг нулевого результата после сравнения с 017 Q не будет установлен и следующая команда условного перехода JNZ М5 вызовет переход к метке М5.
Таким образом, фрагмент программы, начиная с метки М5 и кончая командой JNZ M5, будет выполняться до тех пор, пока все кнопки не будут отпущены. Этот фрагмент программы нужен потому, что после нажатия кнопки монитор выполняет все необходимые операции столь быстро, что пользователь еще не успевает отпустить кнопку, а программа уже готова обработать следующее нажатие кнопки. Поэтому если бы не было этого фрагмента, одно нажатие кнопки воспринималось бы как несколько нажатий, что приводило бы к неправильной работе монитора.
Прежде чем рассматривать дальше работу подпрограммы, обратим внимание на тот факт, что при нажатии кнопок К1-К16 происходит дребезг контактов, рассмотренный в гл. 6. Там же приводилась специальная схема, позволяющая устранить это явление. Дребезг контактов (см. рис. 6.14) приводит к тому, что на входе D23 вместо идеального перехода из нуля в единицу при размыкании контактов кнопки и из единицы в нуль при замыкании контактов кнопки имеется серия переходов. Каждый такой переход может быть воспринят как новое нажатие на кнопку, поэтому необходимо принять специальные меры, чтобы этого не произошло. Можно было бы снабдить каждую кнопку электронной схемой для подавления дребезга контактов (см. рис. 6.13), но можно воспользоваться программным методом, описываемым ниже. В подпрограмме для этого после команды JNZ M5 идет команда CALL DL, которая вызывает подпрограмму временной задержки. Выполнение программы задерживается на 10 мс. За это время дребезг контактов заканчивается.
Следующий фрагмент программы "ожидает" нажатия кнопки и вводит код нажатой кнопки в аккумулятор. В качестве рабочих регистров будут использоваться пара D-E и аккумулятор, поэтому командой PUSH D содержимое пары регистров D-E сохраняется в стеке. Следующие две команды М8: MVI D, 003Q и MVI Е, 376Q загружают в регистры D и Е коды 003 Q и 376Q соответственно. Затем команда М7: MOV A, E переписывает содержимое регистра Е в аккумулятор, а команда OUT 003Q переписывает четыре младших разряда аккумулятора в триггеры микросхемы D22.
После этого команда RLC сдвигает содержимое аккумулятора на один бит влево, а команда MOV Е, А переписывает его в регистр Е. Содержимое регистров и состояние выходов триггеров микросхемы D22 в двоичном коде в этот момент представлено в первой строке табл. 7.5.
Та б л и ц а 7.5
Номер строки, номер проход. |
Содержимое регистров |
Состояние выходов триггеров D22 |
||||||
|
D |
Е |
9 |
10 |
15 |
16 |
||
1 |
00 000 01 1 |
11 |
111 |
101 |
1 |
1 |
1 |
0 |
2 |
00 000 010 |
11 |
111 |
011 |
1 |
1 |
0 |
1 |
3 |
00 000 001 |
11 |
110 |
111 |
1 |
0 |
1 |
1 |
4 |
00 000 000 |
11 |
101 |
111 |
0 |
1 |
1 |
1 |
Во время четвертого прохода содержимое регистра станет равным 377Q и команда JNZ M7 (адрес 000 246Q) не осуществит переход к М7, а будет выполняться следующая за ней -команда безусловного перехода JMP M8, в результате чего команды М8: MVI D, 003Q и MVI E, 376Q загрузят регистры D и Е и фрагмент от М7: MOV A, E до JNZ M7 повторится опять 4 раза.
Этот процесс будет повторяться до тех пор, пока не нажата ни одна кнопка и на входах 4, 7, 9, 12 микросхемы D23 находятся высокие уровни, а следовательно, в аккумуляторе после выполнения команды ANI 017Q (адрес 000 233 Q) находится код 017Q. Если какая-либо кнопка нажата, то код в аккумуляторе не равен 017Q и команда JNZ Мб осуществляет переход к команде Мб: CALL DL, которая вызывает подпрограмму временной задержки для того, чтобы переждать дребезг контактов после нажатия кнопки. Значения кода в аккумуляторе после выполнения команды ANI 017Q в зависимости от кода на выходах триггеров микросхемы D22 и от того, какая нажата кнопка, приведены в табл. 7.6.
Таблица 7.6
|
Выход |
|
Вход мик- |
|
Номер строки |
триггера микро- Код в ре-схемы гистре D В22,на |
Нажатая кнопка |
росхемы D23, на котором низкий |
Код в аккумуляторе |
|
котором |
|
уровень |
|
|
низкий |
|
|
|
|
уровень |
|
|
|
1 |
9 00 000 000 |
К1 |
4 |
00001 ПО |
|
|
К5 |
7 |
00001 101 |
|
|
К9 |
9 |
00001 011 |
|
|
К13 |
12 |
00000 111 |
2 |
10 00000001 |
К2 |
4 |
00001 ПО |
|
|
Кб |
7 |
00 001 101 |
|
|
К10 |
9 |
00001 011 |
|
|
К14 |
12 |
00 000 1 1 1 |
3 |
15 00000010 |
КЗ |
4 |
00001 110 |
|
|
К7 |
7 |
00 001 101 |
|
|
К11 |
9 |
00001 011 |
|
|
К15 |
12 |
00 000 1 1 1 |
4 |
16 00000011 |
К4 |
4 |
00001 110 |
|
|
К8 |
7 |
00 001 101 |
|
|
К12 |
9 |
00001 011 |
|
|
К16 |
12 |
00000 111 |
Тогда следующая команда PUSH PSW сохраняет содержимое аккумулятора и слово состояний микропроцессора в стеке для того, чтобы можно было дальше использовать аккумулятор. Команда MOV A, D переписывает содержимое регистра D в аккумулятор, а команда ADI 004Q прибавляет к содержимому аккумулятора константу 004Q. После этого команда MOV D, А переписывает результат сложения в регистр D, а команда POP PSW восстанавливает содержимое аккумулятора и слово состояний микропроцессора, считывая их из стека. Далее команда безусловного перехода JMP M1C осуществляет переход к команде М10: RRC, т. е. повторяет фрагмент программы, начиная с М10. Теперь ясно, что в зависимости от кода в аккумуляторе (табл. 7.6) фрагмент программы от команды JNC M9 (адрес 000 260Q) до командь: JMP M10 (адрес 000 271Q) будет выполняться нуль раз для первой строки таблицы, 1 раз — для второй. 2 раза — для третьей и 3 раза — для четвертой. Это значит, что к коду в регистре (см, табл. 7.6} соответствующее число раз прибавится константа 004Q. Следовательно, в регистре D после выполнения команды JNC M9 будет содержаться код, зависящий от нажатой кнопки. Все возможные коды перечислены в табл. 7.7
Таблица 7.7
Нажатая кнопка |
Код в регистре D в двоичной системе |
Код в регистре D в восьмеричной системе |
Мнемоническое название кнопки |
К1 |
00 000 000 |
000 |
0 |
К2 |
00 000 001 |
001 |
i |
КЗ |
00000010 |
002 |
2 |
К4 |
00000011 |
003 |
3 |
К5 |
00000 100 |
004 |
4 |
Кб |
00 000 101 |
005 |
5 |
К7 |
00 000 110 |
006 |
6 |
К8 |
00 000 111 |
007 |
7 |
К9 |
00 001 000 |
010 |
СБ |
К10 |
00 001 001 |
011 |
МБ |
К11 |
00001 010 |
012 |
К |
К 12 |
00001 011 |
013 |
П |
К13 |
00 001 100 |
014 |
- |
К14 |
00001 101 |
015 |
= |
К15 |
00001 110 |
016 |
= |
К16 |
00 001 111 |
ОП |
= |
Затем командой POP Г восстанавливается то содержание регистра D, которое было до начала работы подпрограммы SKL. На этом работа подпрограммы заканчивается и команда RET загружает в счетчик команд адрес команды, следующей за той, которая вызвала переход к подпрограмме. Заметим, что подпрограммы SKL и DL не портят при своей работе содержимое каких-либо регистров. Результат своей работы — код, соответствующий нажатой кнопке, — подпрограмма SKL возвращает в аккумулятор. Итак, была нажата кнопка, подпрограмма SKL выработала код, соответствующий этой кнопке, и поместила его в аккумулятор. Работа монитора продолжается с команды CPI 010Q (адрес 000113Q). Эта команда сравнивает содержимое аккумулятора с константой 010Q. Это сравнение происходит путем вычитания из кода, хранящегося в аккумуляторе, кода 010Q (по правилам двоичного вычитания), хотя содержимое аккумулятора не портится. При этом если значение двоичного числа, которое выражено кодом, содержащимся в аккумуляторе, меньше 010Q (или 8D), то по правилам двоичного вычитания происходит заем и устанавливается флаг переноса С, если больше или равно 010Q - то флаг не устанавливается. Затем команда JNCM11 осуществляет переход к метке МП (адрес 000134Q), если код нажатой кнопки больше или равен 010Q, если нет, то выполняются команды, следующие за JNC МП. Коды, меньшие 010Q, соответствуют кнопкам К1-К8 и обрабатываются МОНИТОРОМ ПО-ОСОбому, потому что эти кнопки кодируют восьмеричные цифры от 0 до 7 (см. табл. 7.7) для ввода в микро-ЭВМ. Остальным кнопкам присвоены специальные функции, которые выполняются монитором (см. ниже).
Рассмотрим, как происходит ввод восьмеричного числа в микро-ЭВМ. Напомним, что регистр С используется для временного хранения введенного числа до того момента, как онс будет переписано в память по адресу, хранящемуся в паре регистров H-L. После того как была нажата одна из кнопок К1-К8, программа переходит к команде MOV В, А (адрес 000 120Q), которая переписывает код нажатой кнопки из аккумулятора в регистр В.
Затем код, содержащийся в регистре С ( этот код был высвечен на индикаторах порта OOOQ), переписывается в аккумулятор командой MOV А, С и сдвигается тремя командами RAL на три бита влево. После этого с помощью команды ANI 3 70Q очищаются три младших бита, а с помощью команды ORA В на эти места записываются новые трк разряда кода нажатой кнопки. В результате в аккумуляторе готов новый код для индикации на индикаторах порта OOOQ, Далее содержимое аккумулятора переписывается в регистр С командой MOV С5 А, а затем команда JMP M3 осуществляет переход к фрагменту программы, реализующему индикацию.
На индикаторе порта OOOQ пользователь видит следующее. Если до нажатия кнопки состояния индикаторов были ХО — Х7 (рис. 7.10,д), то после нажатия эти состояния сдвигаются на три индикатора влево (причем Х5 — XV пропадают), а на месте ХО, XI, Х2 высвечивается код вновь нажатой кнопки (рис. 7.10,6, табл. 7.8).
Рис. 7.10. Состояния индикаторов порта вывода с адресом OOOQ:
а - до нажатия какой-либо из кнопок 0-7; б - после нажатия какой-либо из кнопок 0 — 7
Следовательно, нажав три необходимые кнопки из кнопок К1-К8, пользователь может набрать на восьми индикаторах порта OOOQ любое нужное ему двоичное число длиной 1 байт.
Рассмотрим теперь, какие специальные функции и как выполняются монитором.
Таблица 7.8
Кнопка |
|
Код в разрядах |
|
Y2 |
Y1 |
YO |
|
К1 |
0 |
0 |
0 |
К2 |
0 |
0 |
1 |
КЗ |
0 |
1 |
0 |
К4 |
0 |
1 |
1 |
К5 |
1 |
0 |
0 |
Кб |
1 |
0 |
1 |
К7 |
1 |
1 |
0 |
К8 |
1 |
1 |
1 |
Смысл этих действий в том, что байт, хранящийся в регистре С, станет старшим байтом адреса той ячейки, с которой работает пользователь. Этот новый старший байт адреса высветится на индикаторах порта 002Q, а содержимое ячейки памяти с новым адресом, составленным из нового старшего байта и старого младшего байта адреса, высветится на индикаторах порта OOOQ. Таким образом, функция, выполняемая монитором при нажатии на кнопку К9 (СБ — старший байт), — это формирование старшего байта нового адреса. Его значение может быть предварительно введено с помощью кнопок К1 - К8 (цифры 0 — 7) в регистр С и высвечено на индикаторах порта OOOQ. На индикаторах пользователь видит следующее (рис. 7.11). Показания индикаторов порта OOOQ после нажатия СБ перемещаются на индикаторы порта 002Q (рис. 7.11,6), на индикаторах порта OOOQ после нажатия СБ высвечивается содержимое ячейки памяти с адресом, старший байт которого высвечен на индикаторах порта 002Q, а младший — порта 001Q.
Аналогичную функцию, только по формированию младшего байта адреса, выполняют кнопка К10 {МБ — младший байт) и связанный с ней фрагмент программы от команды М12: CPI 011Q до JMP M2. При нажатии на эту кнопку содержимое регистра С, высвеченное на индикаторах порта OOOQ, переписывается в регистр L, становясь младшим байтом адреса той ячейки, с которой работает пользователь, и высвечивается на индикаторах порта 001Q (рис. 7.12). На индикаторах порта OOOQ при этом высвечивается содержимое ячейки памяти с адресом, составленным из нового младшего байта и старого старшего байта.
Следующая кнопка К11 (И — индикация содержимого ячейки памяти и его изменение) выполняет две функции: просмотр содержимого ячеек памяти и изменение содержимого на новое в случае необходимости. При нажатии на эту кнопку подпрограмма SKL вырабатывает код 012Q, поэтому срабатывают команды условного перехода JNZ M12 и JNZ M13. После этого команда М13: CPI 012Q устанавливает флаг равенства нулю и команда JNZ M14 не осуществляет переход к М14.
Затем команда MOV M, С переписывает содержимое регистра С (это содер жимое пользователь видит на индикаторах порта OOOQ) в ячейку памяти, адрес которой содержится в паре регистров H-L (этот адрес пользователь видит на индикаторах портов 002Q и 001Q). Следующая команда INX Н увеличивает содержимое Н-Ьна единицу, а затем происходит безусловный переход (команда JMP М2) на фрагмент программы, который высвечивает на индикаторах адрес и содержимое следующей по порядку возрастания двоичных адресов ячейки памяти. Теперь ясно, что если нажимать только кнопку К11, то можно последовательно просматривать содержимое ячеек памяти в порядке возрастания их адресов (адрес высвечивается на индикаторах порта 002Q и 001Q, а содержимое — на OOOQ) ; но если между нажатием на кнопку К11 с помощью кнопок К1-К8 ввести в регистр С и на индикаторы порта OOOQ какое-либо двоичное число, то последующим нажатием на К11 можно переписать это число в текущую ячейку памяти и перейти к индикации адреса и содержимого следующей ячейки памяти.
Рис. 7.11. Состояния индикаторов портов вывода:
а - до нажатия кнопки СБ; б - после нажатия кнопки СБ
Кнопка К12 (П — пуск программы) выполняет функцию запуска программы, записанной пользователем в ОЗУ с адреса, который содержится в паре регистров H-L и высвечен на индикаторах портов 002Q и 001Q. При нажатии этой кнопки программа вырабатывает код 013Q и команды JNZ Ml2, JNZ M13, JNZ M14 осуществляют переход к М14: CPI 013Q. Эта команда устанавливает флаг равенства нулю, команда JNZ M4 не осуществляет переход к М4, и следующая команда PCHL загружает в счетчик команд содержимое пары регистров H-L, что вызывает переход к выполнению команды, расположенной по этому адресу.
Рис. 7.12. Состояния индикаторов портов вывода:
а - до нажатия кнопки МБ; б - после нажатия кнопки МБ
Кнопки К13-К16 не задействованы, и монитор не выполняет никаких функций при нажатии на них. Эти кнопки оставлены для дальнейшего расширения функций монитора.
Программа-монитор:
000000303 JMPM1
000 001 070
000 002 000
000070061 Ml: LXISP, 010 OOOQ
000071 000
000 072 020
000073041 LXIH.0060000
000 074 000
000 075 004
000076 116 М2: MOV С М
000077174 MOV A, M
000100323 OUT 0010
000 101 001
000102175 MOVA.L
000103323 OUT 0000
000 104 000
000105171 МЗ: MOV А, С
000106323 OUT 002Q
000 107 002
000110315 М4: CALL SKL
000 111 175
000112000
000113376 СР1 010Q
000 114 010
000115322 JNCM11
000 116 134
000117 000
000120107 MOVE, A
000121 171 MOV А, С
000122027 RAL
000 123 027 RAL
000124027 RAL
000125346 ANI 370Q
000 126 370
000127260 OR А В
000130117 MOV С, А
000 131 303 JMPM3
000 132 105
000 133 000
000134376 Mil: CPI 010Q
000 135010
000136302 JNZM12
000137 145
000 140 000
000 141 141 MOVH, С
000142303 JMPM2
000 143 076
000 144 000
000145376 M12: CPI011Q
000 146 Oil
000147302 JNZM13
000 150 156
000 151 000
000152151 MOVL, С
000153303 JMPM2
000 154 076
000 155 000
000156376 M13: CPI 012Q
000 157 012
000160302 JNZM14
000 161 170
000 162 000
000163161 MOVM, С
000 164 043 INX H
000 165 303 JMPM2
000 166 076
000 167 000
000170376 M14: CPI 013Q
000 171 013
000172302 JNZ M4
000 173 110
000 174 000
000175351 PCHL
000176000
000177076 SKL: MVI A, OOOQ
000 200 000
000201323 OUT003Q
000 202 003
000203333 M5: IN 003Q
000 204 003
000205346 ANI 017Q
000206 017
000207376 CPI017Q
000210 017
000 211 302 JNZM5
000 212 203
000 213 000
000214315 CALLDL
000 215 277
000 216 000
000217325 PUSH D
000 220 026 M8: MVI D, 003Q
000 221 003
000222036 MVIE, 376Q
000 223 376
000224173 M7: MOV A, E
000225323 OUT003Q
000 226 003
000 227 007 RLC
000230137 MOVE, A
000231333 IN003Q
000 232 003
000233346 ANI017Q
000 234 017
000235376 CPI017Q
000236 017
000 237 302 JNZ M6
000 240 254
000 241 000
000 242 025 DCR D
000 243 172 MOV A, D
000 244 376 CPI 377Q
000 245 377
000 246 302 JNZ M7
000 247 224
000 250 000
000251303 JMPM8
000 252 220
000 253 000
000254315 Мб: CALL DL
000 255 277
000 256 000
000257017 M10: RRC
000 260 322 JNC M9
000261 274
000 262 000
000 263 365 PUSH PSW
000264172 MOV A, D
000 265 306 ADI 004Q
000 266 004
000 267 127 MOV D, A
000270361 POP PSW
000271303 JMPM10
000 272 257 000 273 000
000274172 M9: MOV A, D
000275321 POP D
000276311 RET
000 277 365 DL: PUSH PSW
000 300 325 PUSH D
000301021 LXID, 0010160
000302016 000303 002
000 304 033 OCX D
000305 172 MOV A, D
000 306 263 ORA E
000 307 302 JNZ N
000310304 000311 000
000312321 POPD
000313361 POP PSW
000314311 RET
Теперь можно сформулировать инструкцию по работе на микро-ЭВМ.