Микро-80/Радио 1983-11,12/Программное обеспечение микро-ЭВМ
Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. Автор: Г. ЗЕЛЕНКО, В. ПАНОВ, С. ПОПОВ |
В последней статье этого цикла ми вновь вернемся к вопросам программирования микро-ЭВМ. Из описания работы микро-ЭВМ следует, что практически все функции, которые она выполняет, полностью определяются программами, записанными в ее память. При этом могут быть использованы как готовые программы, разработанные кем-то ранее, так и программы, разработанные самостоятельно.
Набор различных программ, предназначенный для микро-ЭВМ (впрочем. как и для всех других) определенного типа, принято называть программным обеспечением. Программы, разработанные и используемые для специальных целей, например программы, реализующие функции каких-либо устройств, называют целевыми или прикладными программами. Разработка таких программ требует наличия в микро-ЭВМ специальных вспомогательных программ — системного программного обеспечения. Системное программное обеспечение необходимо также и в микроЭВМ универсального назначения, т. с. таких, которые предназначены дня выполнения самого разнообразного класса программ (программ для вычислений, обработки и редактирования текстов, игровых программ и т. д,), вводимых в ее память с внешнего накопителя. в нашем случае с магнитной лепты.
Простейшие функции системного программного обеспечения присущи управляющей программе МОНИТОР, предназначенной для описываемой микро-ЭВМ. В нее включены подпрограммы управлением дисплеем и модулем сопряжения с кассетным магнитофоном. С помощью МОНИТОРа вы сможете вводить ввод программы с клавиатуры дисплея или ленты магнитофона в память микро-ЭВМ, запускать их в работу, при необходимости видоизменять и вновь записывать на магнитную ленту. Однако в основном МОНИТОР предназначен для отладки программ в машинных кодах. Как при отладке какого-либо устройства, так и при отладке программ необходима проверка соответствия их работы поставленной задаче. Опыт показывает, что даже профессиональные программисты при написании программ неминуемо делают ошибки, которые, к сожалению. обнаруживаются и могут быть исправлены только лишь при отладке. Причин появления ошибок в программах множество — от непонимания действия отдельных команд и неправильной настройки стека (такие ошибки характерны в основном для начинающих) до неверно составленного алгоритма. Пример отладки программы мы разберем после подробного описания возможностей МОНИТОРа.
МОНИТОР нашей микро-ЭВМ занимает в ПЗУ объем 2 Кбайт (с адреса F800H по FFFFH). Для работы МОНИТОРА необходимо также небольшое количество ячеек ОЗУ: для стека и хранения промежуточных результатов и данных. Адреса этой области памяти (рабочей области МОНИТОРа) — с F000Н по F7FFH. В табл.1 приведены коды МОНИТОРа, а здесь текст на ассемблере.
При запуске МОНИТОРа с начального адреса F800H происходит настройка указателя стека, занесение начальных значений в рабочую область ОЗУ и настройка ППА, обслуживающего клавиатуру. После этого МОНИТОР производит «очистку» содержимого ОЗУ страницы и ОЗУ курсора дисплейного модуля, так как там при включении питания устанавливается произвольная информация. Далее на экран выводится следующее сообщение: *МИКРО/80* MONITOR.
Появление на экране угловой скобки говорит оператору о том, что он может набрать на клавиатуре какую-либо директиву (команду) из перечисленных в табл.2.
Все директивы МОНИТОРа задают одной заглавной латинской буквой, но могут содержать дополнительно до трех параметров. Параметры записывают в виде шестнадцатиричных чисел или названия внутреннего регистра микропроцессора. Их набирают непосредственно после директивы и отделяют друг от друга запятыми. Символ «Н» после шестнадцатиричных чисел опускают, можно также опускать и незначащие нули, в левых разрядах чисел. При наборе директив с параметрами нельзя вставлять символ «пробел» ни между директивой и параметрами, ни между отдельными параметрами. Символом окончания ввода директивы или директивы с параметрами является символ «ВК».
Таблица2.
Директива | Параметры | Символ окончания ввода | НАЗНАЧЕНИЕ |
РАБОТА С ПАМЯТЬЮ | |||
D | ADR1, ADR2 | ВК | Просмотр содержимого области памяти в шестнадцатиричном
виде |
L | ADR1, ADR2 | ВК | Просмотр содержимого области памяти в символьном виде |
Q | ADR1, ADR2 | ВК | Тестирование области памяти |
F | ADR1, ADR2, D8 | ВК | Запись байта D8 во все ячейки области памяти |
C | ADR1, ADR2, ADR1’ | ВК | Сравнение содержимого двух областей памяти |
T | ADR1, ADR2, ADR1’ | ВК | Пересылка содержимого одной области в другую |
S | ADR1, ADR2, D8 | ВК | Поиск байта D8 в области памяти |
M | ADR | ВК | Просмотр или изменение содержимого ячейки (ячеек) памяти |
РАБОТА С МАГНИТОФОНОМ | |||
O | ADR1, ADR2 | ВК | Вывод содержимого области памяти на магнитную ленту |
V | ВК | Сравнение информации на магнитной ленте с содержимым
области памяти | |
I | ВК | Ввод информации с магнитной ленты | |
ЗАПУСК И ОТЛАДКА ПРОГРАММ | |||
J | ADR | BK | Запуск программы с заданного адреса |
X | BK | Просмотр содержимого внутренних регистров | |
X | R | Пробел | Изменение содержимого внутренних регистров |
B | ADR | BK | Задание адреса останова при отладке |
G | ADR | BK | Запуск программы в отладочном режиме |
P | ADR1, ADR2, D8 | BK | Подготовка к запуску циклически работающей программы |
START* | ADR | BK | Задание адреса начала работы циклической программы |
DIR.-* | Директива(необязательно) | BK | Запуск программы работающей в циклическом режиме |
СПРАВОЧНЫЕ ДИРЕКТИВЫ | |||
H | D16, D16 | BK | Вывод на экран суммы и разности заданных шестнадцатиричных
чисел |
A | Символ | BK | Вывод кола символа на экран |
K | BK | Вывод символа с клавиатуры на экран (окончание режима
УС-А) |
- * — сообщения монитора в ответ на директиву
- Р. В директиве Р параметры ADR1, ADR2, D8 соответственно определяет первый адрес останова, второй адрес останова, и числа проходов через второй адрес останова.
R — обозначение одного из внутренних регистров микропроцессора : A,B,C,D,E,F,H,L,S.
ОБОЗНАЧЕНИЯ
- D16 — четырехразрядное шестнадцатеричное число
- D8 — двухразрядное шестнадцатеричное число
- ADR1 — четырехразрядный шестнадцатеричный адрес начала области памяти
- ADR2 — четырехразрядный шестнадцатеричный адрес конца области памяти
- ADR1’ — четырехразрядный шестнадцатеричный адрес начала второй области памяти
- ADR — четырехразрядный шестнадцатеричный адрес ячейки памяти.
Если директива введена верно, то есть соблюдены все оговоренные выше условия. задано нужное количество параметров, и сами они заданы правильно. то МОНИТОР выполняет ее, если нет — на экране дисплея высвечивается знак «?» и вновь угловая скобка, «приглашающая» оператора повторить набор директивы. При наборе директивы оператор имеет возможность исправить один или несколько неверно набранных символов: для этого нужно сдвинуть курсор назад по строке (клавиша «¬») и повторить набор символов.
Директивы МОНИТОРА
Теперь рассмотрим подробно назначение директив МОНИТОРа.
Директивы работы с памятью
Директива «D» позволяет просмотреть на экране дисплея содержимое области памяти, выдаваемое в виде двухразрядных шестнадцатеричных чисел. представленных в форме таблицы (такой, например, как табл.1). После заполнения последней строки вся предыдущая информация с экрана стирается, и дальнейший ее вывод продолжается вновь с первой строки. Приостановить вывод информации на экран можно в любой момент, нажав произвольную клавишу на клавиатуре дисплея. После того, как клавиша будет отпущена, вывод информации продолжится. Старшие и младшие адреса области памяти задают двумя параметрами ADR1 и ADR2 соответственно,
По директиве «L» на экран дисплея выводится таблица, похожая на ту, что формируется по директиве «D». Отличие состоит в том, что вместо шестнадцатеричных чисел на экран выводятся алфавитно-цифровые символы, коды которых соответствуют содержимому ячеек памяти. Если в ячейке хранится код, не соответствующий ни одному из символов (таблица кодов символов приведена в статье «Радио» № 8, 1983 г.), то в данной позиции таблицы будет отображаться символ (.) — «точка».
Директива «М» позволяет просматривать и при необходимости изменять содержимое одной или нескольких ячеек памяти. После набора директивы и нажатия на клавишу «ВК» на экран дисплея будет выведено двухразрядное шестнадцатеричное число — содержимое ячейки памяти по адресу ADR, а курсор устанавливается справа от него. Оператор может набрать новое значение, которое после нажатия на клавишу «пробел» будет занесено в ячейку, а на экран дисплея будут выведены адрес следующей ячейки памяти и ее содержимое. Оператор может изменить содержимое и этой ячейки или же оставить его без изменения и перейти к очередной ячейке, еще раз нажав на клавишу «пробел». Если оператору больше не нужны «услуги» этой директивы, он должен нажать на клавишу «ВК», после чего на экране появится сообщение МОНИТОРа о готовности к приему новых директив.
Директива «F» позволяет во все ячейки заданной области памяти записать одинаковые коды, значение которых равно D8.
С помощью директивы «Т» можно переслать (скопировать) содержимое из одной области памяти в другую, начальный адрес которой задают параметром ADR1'.
По директиве сравнения содержимого двух областей памяти «С» происходит последовательное побайтовое сравнение содержимого их ячеек. При обнаружении несоответствия на экран дисплея выводятся адрес ячейки из первой области памяти, содержимое этой ячейки, и содержимое соответствующей ячейки из второй области.
Воспользовавшись директивой поиска байта в пределах заданной области памяти «S» можно провести последовательное сравнение содержимого ячеек памяти и заданного в виде параметра двухразрядного шестнадцатиричного числа (байта). В результате на экран дисплея будут выведены адреса ячеек памяти, в которых будут обнаружены байты, равные заданному.
Для тестирования оперативной памяти предусмотрена специальная директива «Q», параметры которой определяют начальный и конечный адреса проверяемой области памяти. По окончании работы теста содержимое ячеек проверяемой области памяти не изменяется. В случае обнаружения ошибки на экране дисплея высветятся адрес неисправной ячейки, ее содержимое и эталонный байт. который должен был находиться в этой ячейке, если бы она была исправна. Этот тест предназначен только лишь дня быстрой предварительной проверки работоспособности ОЗУ и не позволяет обнаруживать все виды ошибок.
ДИРЕКТИВЫ ВВОДА-ВЫВОДА ИНФОРМАЦИИ
Директивы этой группы служат для организации записи или считывания информации с магнитофона. Желательно, чтобы магнитофон имел счетчик ленты, по которому оператор мог бы отметить начало записи для последующего ее быстрого поиска.
Директива «O» записи на ленту содержит параметры, указывающие на границы области памяти, откуда будет выводится информация. При этом на, ленту будут последовательно записаны:
00Н 00Н 256 байт 00Н (начальный пропуск) ..... 00Н Е6Н - байт синхронизации ADR1(Mл) - младший байт начального адреса ADR1(Cт) - старший байт начального адреса АDR2(Мл) - младший байт конечного адреса ADR2(Cт) - старший байт конечного адреса области памяти и далее информационные байты, число которых зависит от размера заданной области памяти.
После набора директивы включают магнитофон в режим записи и пускают лентопротяжный механизм. После нажатия на клавишу «ВК» дисплея начнется запись информации на магнитную ленту.
Для того чтобы используемая нами скорость записи (1500бит/с) могла быть установлена независимо от тактовой частоты микропроцессора, предусмотрена возможность подстройки длительности временной задержки в подпрограмме обслуживания магнитофона заданием значения константы, помещаемой в ОЗУ. Для неё отведена ячейка памяти с адресом F75DH. Таким образом, перед началом операции записи информации на магнитофон в эту ячейку с помощью директивы «М» МОНИТОРА необходимо занести соответствующую константу, десятичное значение которой рассчитывают по формуле:
- Константа=40*Fтакт/2
где Fтакт — в МГц, 40 — десятичное число.
Перед записью в память это значение необходимо перевести в шестнадцатеричную форму.
Директива ввода «I» инициирует ввод данных с магнитной ленты в ОЗУ микро-ЭВМ. Данные на ленте должны быть записаны и указанном выше формате. Директива не содержит параметров, так как значения адресов зоны памяти, в которые будет произведена запись, считываются с лепты. Если вся запись считана верно, то по окончании ввода на экране высвечиваются в шестнадцатеричном виде значения начального и конечного адресов области памяти, в которую были записаны информация, считанная с ленты, и сообщение о готовности монитора. Признаком того, что при считывании были обнаружены ошибки, может служить то обстоятельство, что при окончании записи на ленте (о чем можно судить на слух) на экране дисплея не появилось сообщение о готовности монитора к выполнению следующей директивы. Константа для временной задержки при считывании также вынесена в ОЗУ. Перед началом операции чтения в ячейку F75CH необходимо поместить константу, значение которой рассчитывается так же, как к для записи. Эта константа должна быть в полтора раза больше константы записи.
По директиве «V» — сравнения содержимого области памяти и информации. записанной на ленту, можно проверить верность записи-считывания. Каждый байт, считанный с ленты, сравнивается с соответствующим байтом из области памяти. В случае ошибки на экран дисплея выводятся адрес ячейки памяти, содержимое этой ячейки и значение байта, считанного с ленты. После обнаружения первой же ошибки выполнение директивы заканчивается, и на экране дисплея появляется сообщение о готовности монитора к приему новых директив.
ДИРЕКТИВЫ ЗАПУСКА И ОТЛАДКИ ПРОГРАММ
С помощью директивы «J» можно запустить в работу любую отлаженную программу, хранящуюся и памяти микро-ЭВМ. Для этого необходимо знать начальный адрес этой программы, то есть адрес команды, которая исполняется в программе первой. Этот адрес использован в качестве параметра директивы.
Для отладки написанных вами программ МОНИТОР позволяет организовать отладочный режим. После того, как вы введете коды написанной вами программы в память микроЭВМ с клавиатуры дисплея, используя директиву «М», можно приступить к ее отладке. Конечно, предварительно за письменным столом вы должны отладить свою программу на листе бумаги, то есть четко представить себе все действия и результаты при выполнении каждой ее команды.
МОНИТОР позволяет в отладочном режиме выполнить одну или несколько команд вашей программы (фрагмент программы). Отладочный режим характерен тем, что для каждого фрагмента программы можно задать некоторые начальные условия его выполнения — содержимое внутренних регистров и ячеек ОЗУ. Кроме того, можно задать адреса останова — ими могут быть адреса ячеек памяти, при достижении которых должно быть прекращено выполнение отлаживаемого фрагмента программы. При достижении адреса останова текущее содержимое регистров микропроцессора автоматически запоминается в специально отведенных ячейках памяти и управление передается МОНИТОРу. При этом МОНИТОР предоставляет вам возможность просмотреть и при необходимости изменить содержимое регистров и содержимое любых ячеек памяти, назначить новый адрес останова, продолжить выполнение отлаживаемой программы, причем содержимое регистров микропроцессора перед этим автоматически восстанавливается.
Для организации останова отлаживаемой программы по заданному адресу в нашем МОНИТОРе использован следующий способ. В ячейку памяти с адресом, равным адресу останова, при выполнении соответствующей директивы помещается код команды RST7, при этом предварительно содержимое этой ячейки запоминается в рабочей области памяти МОНИТОРа. В ячейку памяти с адресом 0038Н (адрес, по которому будет передано управление по команде RST7) помещают команду перехода на соответствующую подпрограмму МОНИТОРа. Таким образом, при достижении адреса останова отлаживаемой программой выполняется команда RST7, а управление перелается МОНИТОРу, который восстанавливает содержимое ячейки памяти, в которую был записан код команды RST7. Все эти действия выполняются автоматически при выполнении соответствующих директив МОНИТОРа.
Рассмотрим теперь действия, выполняемые МОНИТОРом по директивам отладки программ.
Директива «В» позволяет назначить один адрес останова в отлаживаемой программе.
Директива «G» предназначена для запуска отлаживаемой программы с адреса, используемого в ней в качестве параметра. При достижении адреса останова (заданного ранее с помощью директивы «В») управление передается МОНИТОРу.
Директива «Р» дает возможность организовать отладку циклически выполняемых программ с использованием двух адресов останова. В ней использованы три параметра:
- ADR1 — первый адрес останова,
- ADR2 — второй адрес останова и
- D8 — число проходов через второй адрес останова перед выполнением окончательного останова.
После ввода директивы и нажатия на клавишу «ВК» на экран будет выведено следующее сообщение:
START
После этого оператор должен набрать начальный адрес запуска отлаживаемой программы и вновь нажать клавишу «ВК». На экране дисплея появится еще одно сообщение:
DIR
Теперь оператор может набрать одну из директив МОНИТОРа. Обычно это директива «D» с двумя параметрами — просмотр содержимого области памяти. Набор директивы заканчивается нажатием на клавишу «ВК». После этого управление передается по адресу «START».
При достижении адреса останова на экран дисплея каждый раз будет выводится содержимое внутренних регистров микропроцессора и выполняться директива МОНИТОРа, набранная в ответ на запрос DIR. Заметим, что оператор в ответ на этот запрос может просто нажать на клавишу «ВК», тогда при достижении адреса останова на экран будет выведено только содержимое регистров микропроцессора.
Рассмотренная директива не требует предварительного назначения адреса останова и является удобным средством отладки циклически работающих программ.
По директиве «X» на экране дисплея может быть выведено содержимое внутренних регистров микропроцессора в следующем формате:
А-00 В-00 С-00 D-00 Е-00 F-00 H-00 L-00 S-0000 О-0000
Здесь буквы означают название соответствующего регистра микропроцессора А, В, С, D, Е, F (регистр признаков), H, L, SP (указатель стека) и О (адрес, по которому произошел останов программы, то есть содержимое счетчика команд PC).
Директива «X» служит также и для изменения содержимого внутреннего регистра микропроцессора. Директива имеет параметр R, в качестве которого использовано однобуквенное наименование регистра: А, В, С, D. Е. H, L, F или S. После нажатия на клавишу «ВК» на экран выводится текущее содержимое регистра, и курсор устанавливается справа от этого значения. Теперь оператор может набрать новое значение, и после нажатия на клавишу «пробел» оно будет записано в соответствующий регистр.
Справочные директивы
Кроме уже перечисленных, есть еще три директивы — справочные.
Директива «H» предназначена для подсчета суммы и разности двух шестнадцатиричных чисел. После набора директивы, двух четырехразрядных шестнадцатиричных чисел и нажатия на клавишу «ВК» на экран дисплея одновременно будут выведены их шестнадцатиричные сумма и разность.
Директива «А» позволяет вывести на экран шестнадцатиричный код символа, заданного в качестве ее параметра. Например, если набрать А К ВК), то на экране высветится 31 — код символа 1.
Если задать МОНИТОРУ директиву «К», то после нажатия на клавишу «ВК» все, что набирает оператор на клавиатуре, будет отображаться на экране дисплея. В основном этот режим необходим для проверки работы дисплея и клавиатуры. Выйти из такого режима работы дисплея можно, нажав одновременно на клавиши «УС» и «А».
В состав МОНИТОРа входит ряд подпрограмм ввода-вывода, которые могут быть использованы программистами в своих программах. Перечислим эти подпрограммы и правила обращения к ним.
- Подпрограмма ввода символа с клавиатуры. Адрес вызова — F803H. После возврата из подпрограммы код введенного символа находится в регистре «А» микропроцессора.
- Подпрограмма ввода байта с магнитофона. Адрес вызова — F806H. После возврата из подпрограммы введенный байт находится в регистре «А» микропроцессора.
- Подпрограмма вывода символа на экран дисплея. Адрес вызова — F809H. Перед вызовом этой подпрограммы необходимо поместить код выводимого символа в регистр «С» микропроцессора.
- Подпрограмма записи байта на магнитофон. Адрес вызова — F80CH. Перед вызовом этой подпрограммы необходимо поместить выводимый байт в регистр «С» микропроцессора.
- Подпрограмма проверки состояния клавиатуры. Адрес вызова — F812H. После возврата из данной подпрограммы в регистре «А» микропроцессора будет содержаться 00Н — если клавиша не нажата, или FFH — если клавиша нажата.
- Подпрограмма вывода на экран содержимого регистра «А» микропроцессора в шестнадцатеричном виде. Адрес вызова — F815H. Содержимое регистра «А» микропроцессора выводится на экран дисплея в виде двух шестнадцатеричных цифр.
- Подпрограмма вывода сообщений на экран дисплея. Адрес вызова — F818H. Данная подпрограмма позволяет выводить на экран дисплея любые тексты, хранящиеся в памяти в виде последовательности кодов символов. Перед вызовом подпрограммы в регистровую пару HL записывают начальный адрес последовательности кодов. Признаком конца текста служит код 00Н, встретившийся в последовательности кодов символов.
Подпрограммы ввода-вывода МОНИТОРа позволяют программисту, разрабатывающему свои программы, не задумываться над тем, как устроены и какими подпрограммами обслуживаются дисплеи, клавиатура и модуль сопряжения с магнитофоном в его микро-ЭВМ. Единые правила обращения к подпрограммам ввода-вывода позволят радиолюбителям обмениваться программами. При этом их микроЭВМ, выполненные по различным схемам (но, конечно, на микропроцессоре КР580ИК80А), должны иметь управляющие программы, похожие на описываемый МОНИТОР, и содержать программы ввода-вывода «по-своему», обслуживающие отличные от описываемых дисплеи и клавиатуру. Но при этом правила обращения к этим подпрограммам должны быть едиными во всех микро-ЭВМ.
Принятые в описываемом мониторе правила обращения к подпрограммам, обслуживающим дисплей и клавиатуру, являются типичными для многих существующих микро-ЭВМ. Сложнее дело обстоит с подпрограммами обслуживания кассетного магнитофона. Здесь для достижения совместимости всех микро-ЭВМ необходимо также иметь одинаковые метод, скорость и формат записи информации на ленту.
Рассмотрим теперь пример, поясняющий использование некоторых возможностей монитора при написании и отладке программ. На рис.1 представлена программа, реализующая следующие действия. При вводе с клавиатуры трех символов — А35, именуемых далее пароль, на экран выводится сообщение «правильно». Если при вводе любого из символов будет допущена ошибка, то на экран выводится вопросительный знак, и ввод пароля надо начать сначала. Пользуясь комментариями к программе, вы легко сможете восстановить ее алгоритм работы. При этом учтите, что для ввода. символа с клавиатуры, вывода символа на экран, а также вывода сообщения «правильно», используются подпрограммы монитора, обращение к которым происходит по командам CALL F803H, CALL F809H и CALL F818H соответственно. Обратите также внимание на те действия, которые производятся в основной программе перед обращением к подпрограммам.
В ячейках памяти 0127Н-0129Н хранятся коды символов пароля, а в ячейках 012АН- 0132Н коды символов, из которых состоит сообщение «правильно». Не упустите из вида и то, что при написании текста программы (поля 3, 4, 5) в первом случае мы непосредственно использовали коды символов пароля, которые затем при переводе программы в машинные коды и переписали в поле 2. Во втором случае при написании программы в поле 5 мы занесли слово «правильно», заключив его в апострофы (надстрочные запятые). И только на стадии перевода программы в машинные коды мы в поле 2 поместили колы букв этого слова. Два этих приема совершенно равноценны, но если текст программы предполагается переводить (транслировать) в машинные коды автоматически с помощью специальной программы — транслятора с ассемблера, то, конечно, используют второй способ. Ведь при этом вам не придется пользоваться таблицей перевода символов в коды, так как ассемблер автоматически поместит в поле 2 коды, соответствующие символам, заключенным в апострофы.
И еще одно пояснение к программе: внутренний регистр D микропроцессора используется в качестве счетчика правильно введенных символов пароля. Этот счетчик при вводе символов работает на вычитание и при его обнулении после трех введенных символов выполняется команда, загружающая в регистровую пару HL адрес кода первой буквы слова «правильно». Затем вызывается подпрограмма для вывода этого слова на экран. Вывод кодов символов происходит до момента, пока не встретится код 00Н, записанный в ячейку 0133Н.
0100 310001 LXI SP,0100H ;Настройка стека 0103 1603 НАЧАЛО: MVI D,3 ;Число символов в пароле 0105 212701 LXI H,ПАРОЛ ;HL=Указатель на начало области ;памяти, где хранится пароль 0108 CD03F8 ввод: CALL F804H ;ввод символа 010B 4F MOV С,A ;Переслать его в регистр C 010A СD09F8 CALL F809H ;Отобразить его на экране 010F BE СМР M ;Сравнить его с паролем 0110 C21F01 JNZ ОШИБК ;Не совпадает --> ОШИБКА 0113 23 INX Н ;Перейти к следующему символу 0114 1B DCR D ;Уменьшить счетчик символов 0115 C20801 JNZ ввод ;Повторить ввод 0118 212A01 LXI Н,ВЕРНО ;HL=Указатель на сообщение "правильно" 011B CD18F8 CALL F818Н ;Вывод сообщения на экран 011E 76 HLT ;Конец работы программы 011F 013F ОШИБК: MVI C,3FH ;3FH=Код символа ? 0121 CD09F8 CALL F809H ;Вывести на экран ? 0124 C30301 JMP НАЧАЛО ;Повторить ввод 0127 70413335 ПАРОЛ: DB 41H,33H,35H ;Коды символа пароля А35 012A 707261 ВЕРНО: DB 'ПРАВИЛЬНО' ;Сообщение 77696С 786E6F 0133 00 DB 0 ;Признак конца сообщения
Рис.1
В тексте программы допущена одна ошибка, которую вам предстоит найти и устранить в процессе отладки. Итак, с помощью директивы «М» введем коды программы по соответствующим адресам в память микро-ЭВМ. Правильность ввода можно проконтролировать по директиве «D», в ответ на которую на экран будет выведена таблица с содержимым области памяти в шестнадцатеричном виде. Если вы воспользуетесь директивой «L», то сможете просмотреть содержимое памяти в символьном виде, проверив тем самым, верно ли введены коды пароля и слова «правильно».
Если при вводе кодов программы были допущены ошибки, то с помощью директивы «М» их необходимо устранить.
Теперь по директиве «J» запустим программу:
>J 100 (ВК)
Набирая на клавиатуре любые символы, не соответствующие паролю, убеждаемся, что они отображаются на экране, причем после каждого из них выводится также и вопросительный знак. Набираем теперь пароль. Однако после ввода пароля на экран слово «правильно» почему-то не выводится. Чтобы вновь передать управление МОНИТОРу, нажмем на кнопку «СБР» микро-ЭВМ.
Теперь попытаемся выяснить причину ошибочной работы программы. Для этого подготовим к запуску нашу программу в отладочном режиме, задав два адреса останова и число проходов через второй из них. Возможность одновременного задания сразу двух адресов останова позволяет при любых исходных данных приостанавливать выполнение отлаживаемой программы после команд условной передачи управления (то есть в местах «разветвления» программы). Если бы при этом использовался только один адрес останова, то для гарантированной приостановки работы программы после команд условной передачи управления было бы необходимо заранее знать, будет или нет выполнено условие передачи управления. Другими словами, знать, по какому пути продолжится выполнение программы после «разветвления», что далеко не всегда возможно. В нашем случае мы будем контролировать содержимое внутренних регистров микропроцессора D и HL после выполнения команды JNZ ВВОД. При этом в качестве первого и второго адресов останова установим адреса следующих за ней команд при отсутствии условия передачи управления и при его наличии соответственно.
Число проходов через второй адрес останова установим равным 4 — на единицу больше числа символов в пароле. Адрес запуска программы зададим равным 100Н, то есть программу запускаем по ее начальному адресу. При прохождении программы через адрес останова будем следить только за содержимым внутренних регистров микропроцессора. Теперь введем следующие директивы и параметры:
Р118,108,4(ВК)<br> START -100(ВК) <br> DIR-(BK)
Набираем символы пароля и после ввода каждого из них просматриваем содержимое внутренних регистров микропроцессора. Учтем, что содержимое регистров В и Е может быть произвольным, так как они не использованы в программе.
Замечаем, что содержимое регистровой пары HL при вводе каждого нового символа увеличивается на 1, что полностью соответствует логике работы программы. Однако содержимое регистра D остается неизменным. Анализ программы позволяет выявить ошибку — вместо команды DCR D в программе ошибочно используется команда DCX D, уменьшающая каждый раз на 1 не содержимое регистра D, а содержимое регистровой пары DE, что противоречит нашему алгоритму. Выяснив причину ошибки, нажимаем на кнопку «СБР» микро-ЭВМ и тем самым передаем управление МОНИТОРу. Теперь исправим содержимое ячейки 0114Н на код команды DCR D, равный 15Н.
Отлаженную таким образом программу запускаем по директиве «J» с начального адреса и убеждаемся в том, что она работает правильно.
Описанная выше программа МОНИТОРа является одной из системных программ микро-ЭВМ. Рассмотрим теперь кратко другие компоненты системного программного обеспечения, которое Может быть использовано в нашей микро-ЭВМ.
Программа «редактор текстовой информации» позволяет ввести в ОЗУ микро-ЭВМ с клавиатуры дисплея любой текст, например текст программы. просмотреть его на экране дисплея, удалить или вставить в текст любой символ или строку символов. Кроме того, обычно имеется возможность автоматического поиска и замены заданной последовательности символов в тексте. После того. как текст подготовлен и исправлен, он может быть переписан из ОЗУ на магнитную ленту, а в дальнейшем считан с магнитной ленты в ОЗУ микро-ЭВМ для внесения новых исправлений.
Записанный на ленту текст программы на языке ассемблер является входной информацией для работы программы-транслятора (называемой также ассемблером) при подготовке машинных кодов программы. Полученная в результате работы ассемблера программа в машинных колах может быть записана на магнитную ленту и в дальнейшем загружена в ОЗУ для отладки или запуска в работу. Применение ассемблера значительно облегчает разработку программ. Но в то же время разработка программ на ассемблере значительно более трудоемка, чем на языках высокого уровня.
Наиболее распространенным языком программирования высокого уровня для микро-ЭВМ является язык БЭЙСИК. Это объясняется как легкостью изучения и использования самого языка, так и простотой его реализации для микро-ЭВМ. Для того чтобы писать или использовать программы на этом языке В составе микро-ЭВМ, необходимо иметь транслятор или интерпретатор с языка БЭЙСИК. Так же как и при использовании языка ассемблер, транслятор с языка БЭЙСИК формирует в результате своей работы программу в машинных кодах микропроцессора, которая после загрузки в память может быть непосредственно исполнена.
Однако чаще для языка БЭЙСИК вместо транслятора используют интерпретатор. В этом случае в памяти ЭВМ должны одновременно находиться как текст (не машинные коды, а именно текст самой выполняемой программы), так и программа-интерпретатор. Интерпретатор при работе «просматривает» строки текста программы, распознает различные операторы языка и сразу же их выполняет (интерпретирует). Однако это значительно замедляет работу программы.
Интерпретатор БЭЙСИК а позволяет выполнить все действия, связанные с подготовкой, отладкой, записью на магнитную ленту и запуском в работу программ на языке БЭЙСИК. Для этой цели в состав интерпретатора входит упрошенный редактор текстов и специальные отладочные средства. Объем различных версий интерпретаторов БЭЙСИК а для микропроцессора КР580ИК80А может быть от 2 Кбайт — «минимальный БЭЙСИК» до 20 Кбайт — «расширенный БЭЙСИК», естественно, что и набор функций, ими реализуемый, также будет разным.
Особенностью интерпретатора БЭЙСИКА для нашей микро-ЭВМ является возможность работы с использованием псевдографических символов, отображаемых дисплейным модулем. Хотелось бы отметить, что игровые программы, как правило, пишут на языке <a href="../Basic/M80Basic.php">БЭЙСИК</a>.
В заключение мы хотели бы выразить надежду, что опубликованный цикл статей поможет радиолюбителям в освоении микропроцессорной техники, имеющей огромное народнохозяйственное значение. Радиолюбители могут приложить свои усилия в создании специализированных цифровых кассетных магнитофонов, цветных графических дисплеев, устройств управления бытовым радиокомплексом, синтезаторов музыки и речи, разнообразных системных и прикладных программ, а также устройств управления промышленными установками.
Г. ЗЕЛЕНКО, В. ПАНОВ, С. ПОПОВ
Отсканировано с журнала Радио № 12 1983 г.
Отредактировано Лесных Ю. И. 1999 г.