/BHE
|
A0
|
Вид передачи данных
|
0
|
0
|
Передаётся 16-ти битное слово
|
0
|
1
|
Передается старший байт AD8-AD15
|
1
|
0
|
Передается младший байт AD0-AD7
|
1
|
1
|
Ннет обращения
|
Таким образом, для дешифрации адресов ОЗУ и ПЗУ используются адресные
линии А19, А18 и А17 так, что при низком уровне на этих линиях выбирается ОЗУ,
а при высоких - ПЗУ.
Значение адресов портов не критично в логической модели МП-модуля, а
потому будем назначать их исходя из удобства дешифрации. Всего устройств,
подлежащих адресации в качестве портов, в спроектированном МП-модуле три.
Размер адресного слова портов МП КР1810ВМ86 - 16 бит. Это позволяет производить
выбор устройств непосредственно одним из адресных битов без предварительной
дешифрации.
Отведем три младших бита адреса на адресацию внутри самого устройства, а
биты адреса, начиная с 3-го, будем использовать для выбора отдельных устройств.
Назначим 3-й бит для выбора БИС ППИ КР580ВВ55, 4-й - ПКП КР580ВН59А и 5-й - для
ПККИ КР580ВВ79.
Таким образом, адреса портов будут следующими:
h -
порт А ППИ;
h -
порт В ППИ;
Аh - порт С ППИ;
Bh -
регистр управляющего слова ППИ;
h,
0011h - регистры управляющих слов ПКП;
h -
данные для ПККИ:
h -
регистр управляющего слова ПККИ.
2.3 Описание функционирования принципиальной схемы
Два основных режима работы МП-модуля - это ввод и вывода информации с
УВВ. Можно выделить подрежимы чтения/записи из памяти и портов в качестве
логически завершенных процедур, входящих в каждый из основных режимов.
Регистры-защелки КР580ИР82, формирующие шину адреса, функционируют
одинаково во всех циклах работы МП-модуля. Вывод OE заземлен, поэтому данные переписываются со входа буферного
регистра на его выход сразу же по поступлению. Строб записи STB указывает на то, что на входе БР
находятся необходимая информация. При высоком уровне STB данные на выходной шине DO совпадают с данными на входной шине DI. По заднему фронту STB выходная шина DO
«защелкивается», сохраняя текущее значение до следующего изменения.
Два шинных формирователя КР580ВА86 используются для формирования шины
данных МП-модуля. На вход Т указания направления передачи в начале цикла шины
МП поступает сигнал IP/OP (DT/R), задающий
направление передачи данных: с шины А на шину В при Т=1, и с В на А при Т=0. На
вход разрешения выдачи данных на выходную шину OE микропроцессором подается сигнал DEN низкого уровня в тот момент, когда
мультиплексированная шина данных/адреса МП используется в качестве шины данных.
Чтение памяти
В течение всего цикла чтения памяти МП на выходе M/IO поддерживается
высокий уровень сигнала, а на выходе IP/OP (DT/R) - низкий. В
такте Т1 на шины адреса/данных и адреса/состояний выдается адрес
ячейки памяти или слова. В момент выдачи адреса при обращении к старшему байту
или ко всему слову на выводе МП ВНЕ появляется сигнал низкого уровня. По
заднему фронту импульса ALE в
этом такте происходит фиксация адреса в буферных регистрах. В такте Т2 шина
адреса/данных переходит в высокоимпедансное состояние, а на шине
адреса/состояния появляются сигналы слова состояния машинного цикла. После
этого на выводе RD появляется
сигнал низкого уровня, использующийся в СФУС для формирования сигнала чтения из
памяти MEMR. Сигнал DEN низкого уровня разрешает выдачу информационных
сигналов с шинных формирователей. В начале такта Т3 шина
адреса/данных переключается на ввод информации. В тактах Т3 и Т4
данные должны поступать на шину данных МП-модуля и, через шинные
формирователи, на выводы А0-А15 МП. В конце такта Т3 снимаются
сигналы RD и DEN, затем в середине такта Т4 - сигнал DT/R, а в конце такта Т4 вывод M/IO переходит в третье состояние.
СФУС формирует сигнал чтения из памяти MEMR при высоком уровне на выходе M/IO и низком - на
выходе RD. Этот сигнал имеет низкий активный
уровень и подается на вход WE
микросхем ОЗУ и на вход СS
микросхем ПЗУ. По сигналу MEMR
выбранные микросхемы памяти выставляют на шину данных значение адресуемой
ячейки.
Запись в память
Цикл шины МП при записи информации в память, как и все циклы
чтения/записи, длится 4 такта. Признаком записи в память служат сигналы
высокого уровня на выводах DT/R и M/IO в течение всего
цикла. В такте Т1 на 20-разрядную шину адреса МП выставляется адрес
записываемого слова, и, в случае обращения к старшему байту или ко всему слову,
сигнал на выводе ВНЕ принимает значение логического нуля. Одновременно с этим
на выводе ALE появляется сигнал строба записи
адреса в буферные регистры, по заднему фронту которого адрес и значение сигнала
ВНЕ сохраняется на шине адреса МП-модуля. По переднему фронту тактирующего
импульса Т2 на шину адреса/данных выдаются данные для записи, а на
шину адреса/состояния - сигналы состояния машинного цикла. На выходе WR появляется сигнал низкого уровня,
используемый для формирования в СФУС сигнала записи в память MEMW. Появляющийся на выходе DEN сигнал низкого уровня разрешает
выдачу слова данных на выходную шину шинных формирователей, т.е. переписывает
сигналы данных с шины адреса/данных МП на шину данных МП-модуля. Сигналы WR и DEN в цикле записи поддерживаются дольше по сравнению с
аналогичными сигналами RD и DEN в цикле чтения и снимаются в
середине такта Т4, обеспечивая таким образом надежную запись
информации. Одновременно с сигналом DEN снимается также сигналы DT/R и M/IO.
СФУС формирует сигнал MEMW
записи в память при наличии высокого уровня на выходе M/IO и низкого - на
выходе WR. Этот сигнал имеет высокий активный
уровень и подается на вход WE
микросхем ОЗУ. По сигналу MEMW
выбранные микросхемы ОЗУ сохраняют значения с шины данных в адресуемую ячейку
памяти.
Чтение/запись УВВ
Циклы шины МП при чтении и записи информации из внешних устройств
аналогичны циклам при чтении и записи памяти с той разницей, что на выходе M/IO поддерживается низкий уровень сигнала, используемый СФУС для
формирования сигнала чтения из внешнего устройства IOR.
Ввод данных
Ввод данных осуществляется с клавиатуры по запросу на прерывание. За
формирование запроса отвечает ПККИ КР580ВВ79. Опишем алгоритм его работы в
выбранном режиме. На выходах S0-S2 ПККИ выставляется код сканируемой
строки матрицы. Этот код с помощью дешифратора 3 в 8 К555ИД7 преобразуется в
сигнал опроса матрицы. С выхода матрицы клавиш номер столбца нажатой клавиши
поступает на входную шину ПККИ R0-R7. Код нажатой клавишу формируется
следующим образом: в разряды D5-D3 помещается номер строки матрицы, в
разряды D2-D0 - номер столбца матрицы, в разряд D6 - значение сигнала на входе SHIFT ПККИ, а в разряд D7 - единица, как признак кода КОИ7. Сканирование матрицы
клавиш продолжается для того, чтобы определить, является ли нажатая клавиша
одиночной. Если других нажатых клавиш не обнаружено, происходит повторная
проверка нажатия клавиши через 10,24 мс. Если клавиша замкнута, ее код
записывается в ОЗУ ПККИ. Если при сканировании обнаружены другие замкнутые
клавиши, схема продолжает сканирование матрицы до тех пор, пока не останется
нажатой только 1 клавиша. Ее код и помещается в ОЗУ ПККИ. Как только в ОЗУ ПККИ
обнаруживается хотя бы один код нажатой клавиши, формируется запрос на
прерывание IRQ. При каждом считывании из ОЗУ ПККИ
на выходе IRQ появляется сигнал низкого уровня, а
затем, если очередь кодов нажатых клавиш в ОЗУ еще не пуста сигнал IRQ снова становится активным.
Запрос на прерывание IRQ от
ПККИ поступает на вход IR(1)
ПКП КР580ВН59А. ПКП формирует сигнал запроса на прерывание INT высокого уровня, подаваемый на вход INTR маскируемого запроса на прерывание
МП К1810ВМ86. Для подтверждения запросов по этому входу МП требуется два цикла
шины аналогичных циклу чтения. Отличием является то, что на выходе INTA появляется сигнал низкого уровня,
подобный сигналу RD. По второму
сигналу INTA ПКП выдает на шину данных
байт-идентификатор устройства, пославшего запрос. Затем процессор производит
два цикла чтения из памяти по адресу, полученному от ПКП, и следующему за ним.
Считанные слова загружаются в программный счетчик PС и регистр кодового сегмента CS соответственно. Новый адрес является начальным адресом
программы обслуживания прерывания.
В ходе обслуживания прерывания осуществляется цикл чтения из внешнего
устройства с адресом многорежимного ОЗУ ПККИ. В зависимости от считанного кода
нажатой клавиши программа обслуживания прерывания от ПККИ либо инициализирует
режим вывода данных на принтер, либо запускает программу обработки данных, либо
сохраняет код нажатой клавиши в ОЗУ. В последнем случае осуществляется цикл
записи в память.
Вывод данных
Вывод данных в проектируемом МП-модуле осуществляется по запросу на
прерывание. Однако выбранное устройство вывода (принтер) не может
самостоятельно инициировать режим вывода данных. Переход в этот режим
осуществляется программно из подпрограммы обслуживания прерывания от
клавиатуры. Процедура вывода начинается с проверки наличия подготовленных
данных. Если данных нет, процедура вывода завершается, иначе происходит выдача
очередного байта на принтер. В начале необходимо считать и проанализировать
слово состояния принтера, произведя цикл чтения из внешнего устройства - порта
В ППИ КР580ВВ55. Слово состояния принтера формируется из пяти сигналов от
параллельного интерфейса LPT:
сигналы низкого активного уровня ACK(«подтверждение
приема») и ERROR (признак неготовности в связи с
ошибкой), а также сигналы высокого активного уровня BUSY («принтер занят», появляется при ошибке, отключении
принтера или обработке выводимых данных), PE(«закончилась бумага») и SEL («готовность приемника», обычно активен постоянно).
Принтер готов при ACK=ERROR=SEL=1, BUSY=PE=0. Анализ слова состояния
повторяется до обнаружения состояния готовности принтера к приему данных. Затем
необходимо произвести три цикла записи во внешнее устройство, в первом из
которых в порт А ППИ сохраняется первый байт выводимой информации, а во втором
и третьем - в порт С записываются управляющие слова. Управляющее слово для
принтера состоит из значений 4 сигналов: STROBE (строб записи данных), INIT (инициализация /сброс принтера), SELIN (выбор принтера), AUTOFD (перевод каретки на новую строку).
Первое у.с. устанавливает сигнал строба (активный - низкий уровень), а второе -
снимает. По завершении обработки принтер через параллельный порт LPT выдает сообщение о готовности к
приему очередной порции данных в виде сигнала низкого уровня ACK. Этот сигнал подается через инвертор
на вход IR(0) ПКП. Обслуживание прерывания
происходит по описанной ранее схеме. В результате МП снова переходит к
выполнению программы вывода данных.
3. Описание программного обеспечения
МП-модуля
.1 Обоснование алгоритма программного
обеспечения
Программное обеспечение разрабатываемого МП-модуля не предполагает
наличия прикладных программ, то есть представлено только системными
программами, перечень которых определен в задании на курсовой проект.
МП-модуль, прежде чем перейти к выполнению основных своих функций -
обработке программ ввода/вывода информации - должен пройти процедуры
самотестирования и инициализации функциональных узлов.
Процедура самотестирования является обычной для любого вычислительного
устройства и проводится по универсальным алгоритмам. Так, необходимо проверить
работоспособность основных функциональных узлов модуля - его памяти и АЛУ
процессора.
Так как при проектировании МП-модуля не стоит задача разносторонней и
исчерпывающей проверки правильности функционирования всех его узлов,
ограничимся для МП программой тестирования сумматора и сдвигателя его АЛУ.
Организация ПЗУ и ОЗУ в значительной мере различны, поэтому и алгоритмы
тестирования для них также отличаются. Так, в случае ПЗУ заранее известно, как
и в каких ячейках памяти хранится информация на данной микросхеме, а потому
логично производить проверку ПЗУ, сверяя считываемые из нее значения с заранее
известными. Для ускорения работы процедуры тестирования будем производить
проверку не всех значений ПЗУ, а лишь финальной контрольной суммы этих значений
после полного обхода всех ячеек.
В момент начала работы ОЗУ не может хранить какой-либо полезной
информации, а потому работоспособность оперативной памяти будем проверять,
выполняя последовательно запись и чтение данных, сравнивая исходное значение и
результат.
Если проверка пройдена успешно, можно говорить о работоспособности всего
МП-модуля (за исключением интерфейсных узлов).
Теперь необходимо подготовить МП-модуль к дальнейшей работе,
проинициализировав с помощью специальных управляющих слов все нуждающиеся в
этом узлы.
В разрабатываемом модуле в инициализации нуждаются 3 устройства: ПКП, ППИ
и ПККИ.
Поскольку для ПКП выбран режим полного вложения и в системе отсутствуют
ведомые контроллеры прерываний, настройка ПКП осуществляется единственным
словом инициализации ICW1.
Оно имеет следующий вид:
ААА1хВСх,
где ААА - старшие разряды номеров векторов прерываний, вызываемых при
поступлении запросов от устройств, В - признак способа адресации векторов
прерываний (В=1 для 4-байтных векторов), С - признак наличия каскадирования
(С=1 для одиночного ПКП). Байт адреса вектора прерывания, выдаваемые ПКП в
ответ на второй сигнал INTA
МП, будет иметь вид
YYYXXX00,
где YYY - биты ААА из слова инициализации,
ХХХ - приоритет текущего устройства, запросившего прерывание, назначаемый ПКП
согласно номеру входа, к которому это устройство подключено. Примем ААА=000,
назначив тем самым для внешних устройств номера векторов прерываний,
совпадающие с номерами входов, к которым они подключены.
ППИ необходимо настроить на синхронный режим обмена, причем порт А и
младшая половина порта С должны осуществлять вывод данных, а порт В - ввод.
Направление работы старшей половины порта С не важно и может быть любым. Такая
настройка ППИ производится путем загрузки управляющего слова следующего
формата:
S RR A C r B c,
где S - признак управляющего слова, 1; RR - выбор режима для порта А и старшей
половины порта С, 00 - синхронный «режим 0»; А - направление передачи для порта
А, 0 - вывод; C - то же для старшей половины порта С
(С7-С4), 0 - вывод, 1 - ввод; r -
режим работы портов В и младшей части С, 0 - режим «0»; B - направление передачи для порта В,
1 - ввод; c - то же для младшей половины порта
С, 0 - вывод. Будем использовать управляющее слово 10000010.
Блок интерфейса клавиатуры ПККИ должен работать в режиме последовательного
опроса клавиш с дешифрированием состояния счетчика сканирования и запрещением
одновременного нажатия нескольких клавиш - в режиме 1. Этот режим
устанавливается путем загрузки управляющего слова вида 000хх001, где хх - слово
состояния блока индикации. Так как в МП-модуле не предусмотрено наличие
индикации, эти разряды управляющего слова не важны и могут принимать любые
значения.
После окончания инициализации узлов МП-модуль переходит в нормальный
режим функционирования. Однако, согласно заданию, ввод и вывод информации
осуществляются по запросу на прерывание, то есть, на данном этапе МП
бездействует, ожидая поступления запроса на прерывание от внешних устройств.
Процессор переводится в состояние «останов».
Из этого состояния МП-модуль выходит при поступлении запроса на
прерывание, сформированного контроллером клавиатуры. В таком случае, МП
переходит к обработке программы ввода данных. Считанный из ПККИ номер нажатой
клавиши анализируется. Два номера закреплены за программами обработки и печати
введенных данных. Пусть это будут номера 64 и 63.
Рисунок 4.2 Алгоритм программы ввода данных
Рисунок 4.7 Алгоритм процедуры тестирования ПЗУ
.2 Описание программы
Известно, что первую команду МП К1810ВМ86 считывает из ячейки адреса с
номеров FFFF0h. Однако до верхнего предела ПЗУ в таком случае остается лишь
16 адресов. Этого недостаточно для размещения ПО модуля, а потому разместим в
памяти по адресу FFFF0h команду безусловного перехода на
начало программы, составляющей ПО МП-модуля.
Первой вызывается процедура инициализации и тестирования МП-модуля. В ней
можно выделить несколько подпрограмм: тест АЛУ, тест ПЗУ, тест ОЗУ и собственно
начальная инициализация МП-модуля.
Сумматор АЛУ проверяется путем сравнения результата выполнения сложения загруженных
констант с известным результатом. При этом константы поочередно загружаются во
все РОН, где над ними и выполняются операции сложения и сравнения.
Программа тестирования ПЗУ вычисляет контрольную сумму значений всех его
ячеек и сравнивает ее с заранее известным значением.
Так как размер ОЗУ выходит за пределы одного логического сегмента, для
полного прохода всех ячеек недостаточно изменять только 16-рязрядное смещение.
Условно разобьем ОЗУ на два банка - младший (00000h - 0FFFFh)
и старший (10000h - 1FFFFh) и будем проводить процедуру
тестирования для каждого из барков. Тестирование представляет собой
последовательную запись и контрольное считывание из ячеек памяти двух констант
- 055h и 0AAh (0101b и
1010b).
В качестве обработчиков ошибок тестирования выступают подпрограммы вывода
на печать условного кода произошедшей ошибки.
При удачном завершении тестирования МП-модуль переходит к программе
начальной инициализации.
Для корректной работы модуля необходимо сформировать таблицу векторов
прерываний. Эта таблица хранится в памяти, начиная с адреса 00000h и может иметь размер до 1 Кбайта. У
МП К1810ВЬ86 имеется пять жестко определенных видов прерываний:
1) прерывание ошибки деления на ноль (вектор 00000h),
2) прерывание пошагового режима (вектор 00004h),
) немаскируемое прерывание (вектор 00008h),
) прерывание 3 (вектор 0000Сh),
) прерывание по переполнению (вектор 00010h).
Вектора прерываний с 6 по 32 (вектора 00012h - 0007Ch)
отводятся под системные программы, а остальные 224 - для пользовательских приложений.
При поступлении запроса на прерывание на вход INTR МП выполняет те же действия, что и при интерпретации
встреченной команды INT_v, где v - номер возникшего прерывания. Арес перехода на вектор
прерываний, из которого будут загружены новые значения сегментного регистра
команд и программного счетчика, вычисляется МП следующим образом:
PP =
14h + v*4,
где РР - адрес вектора прерываний, v - аргумент команды INT.
Так как в МП-модуле не предусмотрено никаких действий при возникновении
прерываний 1-5, будем в таких случаях сбрасывать МП-модуля в начальное
состояние. Для этого инициализируем эти векторы адресом первой ячейки памяти - FFFF0h.
Вектора прерываний от УВВ содержат адреса переходов на процедуры ввода и
вывода соответственно.
Сегменты данных (ds и es) размещаются в ОЗУ сразу по
окончании таблицы векторов прерываний, занимающей 28 байт. Сегмент стека во
избежание перекрывания с сегментами данных расположен в области старших адресов
ОЗУ и имеет базовый адрес 10000h и
начальное смещение FFFЕh.
Программируемые БИС инициализируется загрузкой специальных слов
состояния, описанных ранее.
В конце программы инициализации массив введенных данных объявляется
пустым (смещение на последний элемент совпадает с началом сегмента данных),
разрешаются прерывания по входу INTR и
МП переводится в режим «останов».
Следует обратить внимание на то, что в процедурах ввода и вывода команды,
изменяющие значение индексного регистра si и области памяти, отведенной под хранение массива введенных
данных, объединены в защищенные блоки запрещением маскируемых прерываний. Это
сделано потому, что несанкционированное изменение этих переменных может
привести к ошибке функционирования алгоритма и некорректной работе процедур
ввода и вывода.
4. Анализ функционирования МП-модуля с использованием временных диаграмм
Исходя из значений номинальных временных задержек, приведенных в
справочниках, и согласно алгоритмам работы микросхем составим временные
диаграммы функционирования МП-модуля в режимах ввода и вывода данных. Ввод или
вывод данных микропроцессором К1810ВМ86 производится за один четырехтактный
машинный цикл. Быстродействие всех остальных элементов модуля должно быть
таким, чтобы не нарушать машинный цикл МП.
Проанализируем пригодность выбранных элементов для работы с МП К1810ВМ86.
Тактовая частота МП К1810ВМ86 - 5МГц. Это значит, что длительность одного
такта машинного цикла составляет 0,2 мс или 200 нс.
Цикл чтения
Из временных диаграмм видно, что критичным в этом цикле является время
выставления данных на шину данных/адреса МП: с момента появления на его выходах
сигналов низкого уровня RD и DEN и до момента их снятия. Эти сигналы
поддерживаются на выходах МП в течение полутора тактов, т.е. около 300 нс. До
этого момента адрес на шине адреса МП-модуля находился также не менее 300 нс,
чего вполне достаточно для формирования сигналов выбора микросхем.
Сигнал чтения памяти формируется с помощью 2 микросхем простой логики,
общая задержка на которых не превышает 40 нс. Задержка с момента получения
сигнала чтения памяти до момента появления на выводах модуля значений выбранной
ячейки для ОЗУ составляет 55 нс, а для ПЗУ - 100нс.
Задержка вывода шинного формирователя из третьего состояния составляет
10..130 нс.
Таким образом, в предельном случае данные поступят на шину адреса/данных
через 140 нс, что вполне приемлемо.
Цикл записи
Сигналы WR и DEN в этом цикле держаться дольше относительно
аналогичных сигналов RD DEN в цикле записи, - примерно 2 полных
такта. Это позволяет производить успешную запись даже в относительно медленные
внешние устройства.
Временная диаграмма работы параллельного интерфейса иллюстрирует алгоритм
его работы. Видно, что необходимо поддерживать сигнал строба в течении как
минимум 1 мс. Значит, оправдано использование буфера управляющих сигналов для
принтера. Сигнал ACK появляется
после окончания приема данных и сигнализирует о готовности принтера к
дальнейшей работе.
Ввод данных
Вывод данных
Заключение
В ходе курсового проектирования был разработан микропроцессорный модуль,
обладающий всеми характеристиками, необходимыми по техническому заданию.
На основе задания и поставленных целей, была описана структура будущего
модуля и построена его функциональная схема. Это позволило провести более детальный
анализ, результатом которого стала разработка принципиальной схемы МП-модуля.
В принципиальную схему были включены специально подобранные элементы,
обладающие необходимыми характеристиками и параметрами. На основе временных
диаграмм функционирования отдельных узлов и всего модуля в целом была
проанализирована его работоспособность и составлены алгоритмы необходимого
программного обеспечения.
В результате на языке ассемблера было написано программное обеспечение
для проектируемого МП-модуля, включающее в себя программы тестирования,
начальной инициализации, ввода, обработки и вывода информации.
Полученный модуль является готовым устройством и может быть применен в
качестве устройства управления и обработки информации.
Приложения
Приложение А
Текст программного обеспечения МП-модуля на языке ассемблера
0 ; по адресу ffff0h находится команда call far test
1 ; остальной код - последовательно, начиная с адреса f4000h.
2 datasg segment
para 'data' ; определение данных
3 equ ROM F400h ;базовый адрес начала ПЗУ
4 equ RAMEND 1FFFh ;база адреса конца ОЗУ(верхняя
граница ОЗУ-1FFFFh)
equ CONST1 10101010h
;константы тестирования ОЗУ
6 equ CONST2 01010101h
7 equ PICW 00010110b ;управляющее слово для ПКП
8 equ PPIW 10000010b ;УС для ППИ
9 equ LPTW1 00001010b ;УС для принтера
10 equ LPTW2 00001111b ;УС для принтера
11 equ PKDIW 00000001b ;УС для ПККИ
12 equ PPIA 08h ;адреса портов ППИ - А
13 equ PPIB 09h ;В
14 equ PPIC 0Ah ;С
15 equ PPIR 0Bh ;регистр упр. слова ППИ
16 equ PKDID 020h ;регистр данных ПККИ
17 equ PKDIR 021h ;регистр слова состояния ПККИ
18 equ PICR1 010h
;регистры ПКП
19 equ PICR2 011h
20 controlsum db ? ;переменная
для эталонной контр. суммы ПЗУ
21 datasg ends
22 codesg segment para 'code'
23 init proc far ; программа инициализации при включении
24 call test ; тест АЛУ
call test_rom ; тест ПЗУ
call test_ram ; тест ОЗУ
xor ax, ax ; обнулить аккумулятор
mov bx,ffffh ; заполнить bx единицами
29 mov es, ax ; инициализировать сегмент es
30 mov di, 010h ; 10h = 4*4 - прерывание INT O (по переполнению)
-
31 init_int: ; последнее из обязательных
системных прерываний
32 mov es:[di], bx ; инициализировать вектор прерывания значениями
33 mov es:[di+2], ax ; адреса стартовой ячейки памяти
34 sub di,2 ; перейти к
следующему вектору
35 jnz init_int
mov es:[014h], cs ; 5*4=20=14h.
прерывание №5 - от принтера
37 mov es:[016h], offset output ; переход на программу вывода
38 mov es:[018h], cs ; прерывание №6 - от клавиатуры
39 mov es:[01Ah], offset input ; переход на программу ввода
mov ax, 1Ch ;
установка сегментов данных
41 mov es, ax ; сразу после таблицы векторов
прерываний
42 mov ds, ax
43 mov ax, 1000h ; базовый адрес стека - 10000h
44 mov ss, ax
mov sp, 0fffeh ; начало стека - с конца ОЗУ
46 mov al, PPIW ; загрузка упр. слова для ППИ
47 out PPIR, al
48 mov al, 00001101b ; сигнал сброса принтера
49 out PPIC, al ; загрузить в порт С - порт УС
принтера
mov al, PICW ;
загрузка упр. слова для ПКП
51 out PICR1, al ; адрес ПКП при
A0=0
mov al, PKDIW ; загрузка упр. слова для ПККИ
53 out PKDIR, al
54 mov al,00001111b ; снятие сигнала сброса принтера
55 out PPIC, al
56 xor ax,ax ; обнулить аккумулятор
57 mov si,ax ; указать на последний введенный
элемент
58 sti ; разрешить прерывания по входу INTR
59 hlt ; перевести МП в режим «останов»
60 init ENDP
61 test PROC NEAR ; подпрограмма тестирования работы
процессора
62 mov ax, 5 ; проверка
сумматора
63 mov bx, ax
64 mov cx, ax
mov dx, ax
add ax, ax
cmp ax, 10
jne error_cpu
add bx, bx
cmp bx, ax
jne error_cpu
add cx, cx
cmp cx, ax
jne error_cpu
add dx, dx
cmp dx, ax
jne error_cpu
mov ah, 11111111b ; проверка сдвигателя
mov cx, 8
shift:
shr ah, 1
jnc error_cpu
loop shift
ret
error_cpu:
86 mov si,1 ; указать на
смещение в области вывода
87 mov ds:[si],FFFFh ; поместить в обл. вывода значение кода ошибки
88 int 32 ; вызов п/программы вывода
89 jmp error_cpu
90 test ENDP
91 test_rom PROC NEAR ; подпрограмма тестирования пзу
92 mov ax, ROM ;
начальный адрес пзу - F4000h
93 mov es, ax
94 mov si, 0 ; тест с
ячейки 2
95 xor ax, ax ; обнулить аккумулятор
96 mov cx, BFFFh; счетчик цикла теста (48Кбайт -1)
count:
add ax, es:[si] ; добавить к сумме содержимое текущей ячейки
inc si ; передвинуть указатель на следующую
loop count ; повторять в цикле
cmp al, controlsum ;
сравнить полученную сумму с эталонной
102 je
end_tst ; если совпадают - конец теста
103 error_rom:
104 mov si,1
105 mov ds:[si],FFFEh ; поместить в область вывода знач. кода ошибки
106 int 32 ; вызов п/программы вывода
107 jmp error_rom
108 end_tst: ret
test_rom endp
110 test_ram PROC NEAR ; подпрограмма тестирования озу
111 mov cx,1000h ; вначале - тест старшего банка ОЗУ
112 test_bank:
mov ds, cx
mov di, 0ffffh ; счетчик повторений
115 test_cell: mov ax, СONST1
116 mov [di],ax ; записать в память
117 mov bx,[di] ; считать из памяти
cmp ax,bx ; сравнить записанное и считанное
119 jne error_ram ; перейти на обработчик ошибок
120 mov ax, СONST2; продолжить тест с другой
константой
mov [di],ax ; записать в память
122 mov bx,[di] ; считать из памяти
cmp ax,bx ; сравнить записанное и считанное
jne error_ram ;
перейти на обработчик ошибок
126 jnz test_cell
127 test cx,0 ; младший
банк протестирован?
128 jz end_test_ram
129 mov cx,0 ; переход к
тестированию младшего банка ОЗУ
130 jmp test_bank
error_ram:
132 mov si,1
133 mov ds:[si],FFFDh ; поместить в обл. вывода значение кода ошибки
134 int 32 ; вызов п/программы вывода
135 jmp error_ram
136 end_test_ram: ret
137 test_ram ENDP
138 input PROC NEAR ; обработчик прерывания от
клавиатуры
139 in al, PKDID ; считать номер клавиши из ПККИ
140 test al,64 ;
анализировать его значение
141 jz need_output ; нажата клавиша печати
142 test al,63
jz need_comp ; нажата клавиша обработки
144 cli ; запретить прерывания
145 inc si
mov ds:[si],al ; иначе сохраним ее код в области вывода
147 sti ; разрешить прерывания
148 jmp end_input
need_comp:
call computing
need_output:
int 32 ; вызов п/программы вывода
153 end_input:
154 mov al,64h ; очистка регистра текущих
прерываний ПКП
155 out PICR1, al
iret
input ENDP
158 output PROC NEAR ; обработчик прерывания от принтера
159 and si,si ; установить флаг z
160 jz end_out ; если si=0, данные к выводу не готовы
161 ready:
in al, PPIB ; считать слово состояния принтера
(порт В ППИ)
163 or al,00011111b ; выделить значащие биты
164 test al,19h ; 11001b -слово состояния принтера, готового к приему
165 jnz ready ; дожидаться
готовности принтера
166 cli ; запретить прерывания
167 mov al, ds:[si] ; получить очередной байт из памяти
168 dec si ; перевести
указатель на следующий элемент
169 sti ; разрешить прерывания
170 out PPIA,al ; вывести текущий байт на принтер
(порт А ППИ)
171 mov al,LPTW1 ; управляющее слово для принтера -
установить строб
172 out PPIC,al
173 mov al, LPTW2 ; снять строб
174 out PPIC,al
175 mov al,64h ; очистка регистра текущих
прерываний ПКП
176 out PICR1, al
iret
output ENDP
179 computing PROC NEAR ; подпрограмма обработки данных
180 test si,0 ; данных нет - выход
jz comp_end
mov di,si ; начать с конца массива данных
183 mov al, ds:[di] ; загрузить первый элемент
184 mov ch,al ; сh - максимальный элемент
185 mov cl,ax ; cl - минимальный элемент
186 min_max:
mov al, ds:[di] ; загрузить очередной элемент
188 cmp al,ch ; сравнить полученный байт с
максимальным значением
189 jns next_1 ; новое значение
меньше предыдущего
190 mov ch,al ; иначе - обновить максимальное
значение
191 next_1:
192 cmp cl,al ; сравнить полученный байт с миним.
значением
193 jns next_2 ; новое
значение больше пердыдущего
194 mov cl,al ; иначе - обновить минимум
195 next_2:
196 dec di ; перейти к
след. байту
197 jnz min_max ; больше нет введенных данных
198 cli ; запретить прерывания
199 inc si ; указать на
следующий (пустой) элемент массива данных
200 mov ds:[si],cx ; сохранить в массив макс. и мин. значения
201 inc si ; сдвинуть
указатель в массиве на последний элемент
202 add ch,cl ; получить сумму мин. и макс. эл-ов
203 ror ch,1 ; разделить ее пополам
204 inc si ;
205 mov ds:[si],ch ; сохранить полученное значение в массив
206 sti ; разрешить прерывания
207 comp_end: ret
208 computing ENDP
209 codesg ends