Простейшая микро-ЭВМ

ПРОГРАММА-МОНИТОР


Программа-монитор (или просто монитор) — это программа, которая управляет работой микро-ЭВМ. Монитор выполняет следующие функции: подготовку к работе устройств микро-ЭВМ после включения питания и по­вторных перезапусков, обслуживание индикаторов и клавиатуры, выполнение указаний пользователя по реализации програм­мы. Микро-ЭВМ выполняет программу-монитор все то время, когда она не выполняет какую-либо программу пользователя.

Ниже приведен полный текст программы-монитор. При пер­вом прочтении можно пропустить дальнейший текст данного параграфа, но при отладке ПМ-ЭВМ и работе с нею необходимо четкое понимание функционирования монитора, для чего и при­водится ее детальное описание.

Текст программы состоит из трех столбцов. Первый столбец содержит адреса ячеек памяти, второй столбец - содержимое этих ячеек в восьмеричном коде, а третий столбец — ассемблер­ную запись программы.

После подачи всех необходимых напряжений на микросхемы и микропроцессор микро-ЭВМ начинает работать. При этом со­держимое всех регистров микропроцессора и ячеек ОЗУ уста­навливается случайным образом. Поэтому в микро-ЭВМ проис­ходит в этот момент неуправляемый и непредсказуемый про­цесс. Для того чтобы остановить его и пустить по вполне опре­деленному руслу, в микропроцессоре КР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

Далее команда IN 003Q вводит в аккумулятор состояния входов микросхемы D23, команда ANI 017Q устанавливает в старших четырех разрядах аккумулятора нули, а команда CPI 017Q сравнивает его содержимое с константой 017Q и уста­навливает флаг нуля результата, если содержимое равно 017Q. Это произойдет в том случае, если ни одна из кнопок К4, К8, К12, К16 не нажата. Рассмотрим этот вариант. Тогда следую­щая команда JNZ Мб не осуществляет условный переход (так как установлен флаг нуля) и выполняется команда OCR D, которая уменьшает содержимое регистра D на единицу. Затем содержимое регистра D пересылается в аккумулятор командой MOV A, D и сравнивается командой CPI 377Q с константой 377 Q, и поскольку равенства нет (так как в регистре D код 002Q), команда JNZ М7 осуществляет переход к команде М7: MOV А, Е и фрагмент программы от М7: MOV A, E до JNZ M7 повторяется. Этот фрагмент будет выполняться 4 раза (при условии, что ни одна кнопка не нажата). Состояния выходов триггеров микросхемы D22 и содержимое регистров D и Е после выполнения команды MOV E, А (адрес 000230Q) ука­заны в табл. 7.5 для каждого прохода.

Во время четвертого прохода содержимое регистра станет равным 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

После выполнения подпрограммы DL команда М10: RRC сдвигает содержимое аккумулятора на один бит вправо, а са­мый младший бит при этом попадает в флаг переноса. Следую­щая команда JNC M9 осуществляет условный переход, если флаг переноса не установлен (перенос С раве« нулю). Рассмот­рим вариант, когда перенос не равен нулю (строки 2 — 4 табл. 7.5) и перехода к М9 не происходит.


Тогда следующая команда 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

ОП

=

После перехода в результате выполнения команды JNC Мс-выполняется команда М9: MOV A, D, которая переписывав-: содержимое регистра D в аккумулятор.


Затем командой 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

Коды всех кнопок, вызывающих выполнение специальных функций, больше или равны 010Q. Поэтому команда JNC М11 (адрес 000115Q) будет осуществлять переход к команде МИ: CPI 010Q, которая сравнивает код нажатой кнопки с констан­той 010Q. Если код не равен 010Q, то команда JNZ M12 вызовет переход к Ml2, если равен, то это значит, что нажата кнопка К9 (СБ) и произойдет следующее: команда MOV H, С перепишет содержимое регистра С в регистр Н, а затем команда JMP M2 вызовет безусловный переход к М2.


Смысл этих действий в том, что байт, хранящийся в регистре С, станет старшим бай­том адреса той ячейки, с которой работает пользователь. Этот новый старший байт адреса высветится на индикаторах порта 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

Теперь можно сформулировать инструкцию по работе на микро-ЭВМ.



Содержание раздела